]> gitweb.factorcode.org Git - factor.git/commitdiff
Merge branch 'master' of git://github.com/Keyholder/factor
authorSlava Pestov <slava@slava-pestovs-macbook-pro.local>
Mon, 23 Mar 2009 08:09:09 +0000 (03:09 -0500)
committerSlava Pestov <slava@slava-pestovs-macbook-pro.local>
Mon, 23 Mar 2009 08:09:09 +0000 (03:09 -0500)
236 files changed:
basis/alien/c-types/c-types-tests.factor
basis/alien/destructors/destructors.factor
basis/alien/fortran/fortran.factor
basis/alien/structs/fields/fields.factor
basis/alien/structs/structs-tests.factor
basis/alien/structs/structs.factor
basis/alien/syntax/syntax.factor
basis/bit-arrays/bit-arrays.factor
basis/bit-vectors/bit-vectors-tests.factor
basis/bit-vectors/bit-vectors.factor
basis/bootstrap/image/image.factor
basis/byte-vectors/byte-vectors-tests.factor
basis/byte-vectors/byte-vectors.factor
basis/calendar/calendar-tests.factor
basis/cocoa/cocoa-tests.factor
basis/cocoa/cocoa.factor
basis/cocoa/subclassing/subclassing.factor
basis/colors/constants/constants.factor
basis/compiler/cfg/instructions/syntax/syntax.factor
basis/compiler/cfg/registers/registers.factor
basis/compiler/compiler.factor
basis/compiler/tests/intrinsics.factor
basis/compiler/tests/optimizer.factor
basis/compiler/tests/redefine15.factor [new file with mode: 0644]
basis/compiler/tests/redefine2.factor
basis/compiler/tree/cleanup/cleanup-tests.factor
basis/constructors/constructors.factor
basis/core-text/utilities/utilities.factor
basis/cpu/ppc/assembler/backend/backend.factor
basis/cpu/ppc/bootstrap.factor
basis/cpu/x86/assembler/syntax/syntax.factor
basis/db/tuples/tuples-tests.factor
basis/definitions/icons/icons.factor
basis/delegate/delegate-tests.factor
basis/delegate/delegate.factor
basis/environment/environment-docs.factor
basis/farkup/farkup-docs.factor
basis/fry/fry-tests.factor
basis/fry/fry.factor
basis/functors/functors-tests.factor
basis/functors/functors.factor
basis/furnace/actions/actions-tests.factor
basis/furnace/furnace-tests.factor
basis/furnace/sessions/sessions-tests.factor
basis/hash2/hash2-tests.factor
basis/help/crossref/crossref-tests.factor
basis/help/definitions/definitions-tests.factor
basis/help/markup/markup-tests.factor
basis/help/markup/markup.factor
basis/help/syntax/syntax.factor
basis/hints/hints.factor
basis/html/templates/chloe/chloe-tests.factor
basis/html/templates/chloe/components/components.factor
basis/html/templates/chloe/syntax/syntax.factor
basis/html/templates/fhtml/fhtml.factor
basis/http/http-tests.factor
basis/interpolate/interpolate.factor
basis/interval-maps/interval-maps-docs.factor
basis/interval-maps/interval-maps.factor
basis/io/backend/unix/unix-tests.factor
basis/io/encodings/euc/euc.factor
basis/io/encodings/iso2022/201.txt [new file with mode: 0644]
basis/io/encodings/iso2022/208.txt [new file with mode: 0644]
basis/io/encodings/iso2022/212.txt [new file with mode: 0644]
basis/io/encodings/iso2022/authors.txt [new file with mode: 0644]
basis/io/encodings/iso2022/iso2022-docs.factor [new file with mode: 0644]
basis/io/encodings/iso2022/iso2022-tests.factor [new file with mode: 0644]
basis/io/encodings/iso2022/iso2022.factor [new file with mode: 0644]
basis/io/encodings/iso2022/summary.txt [new file with mode: 0644]
basis/io/encodings/strict/strict-docs.factor
basis/io/encodings/utf16n/utf16n-tests.factor
basis/io/files/unique/unique-docs.factor
basis/io/streams/duplex/duplex-tests.factor
basis/listener/listener-tests.factor
basis/lists/lists-docs.factor
basis/locals/locals-tests.factor
basis/locals/locals.factor
basis/locals/parser/parser.factor
basis/logging/logging.factor
basis/macros/macros-tests.factor
basis/macros/macros.factor
basis/match/match.factor
basis/math/blas/matrices/matrices.factor
basis/math/blas/vectors/vectors.factor
basis/math/complex/complex.factor
basis/memoize/memoize.factor
basis/models/models-tests.factor
basis/models/range/range-tests.factor
basis/multiline/multiline.factor
basis/nibble-arrays/nibble-arrays.factor
basis/opengl/gl/extensions/extensions.factor
basis/openssl/libssl/libssl.factor
basis/peg/ebnf/ebnf.factor
basis/peg/peg.factor
basis/persistent/hashtables/hashtables.factor
basis/persistent/heaps/heaps-tests.factor
basis/persistent/vectors/vectors.factor
basis/prettyprint/prettyprint-docs.factor
basis/prettyprint/prettyprint-tests.factor
basis/quoting/quoting-docs.factor [deleted file]
basis/quoting/quoting-tests.factor [deleted file]
basis/quoting/quoting.factor
basis/regexp/authors.txt
basis/regexp/classes/classes.factor
basis/regexp/parser/parser-tests.factor
basis/regexp/parser/parser.factor
basis/regexp/regexp-docs.factor
basis/regexp/regexp-tests.factor
basis/regexp/regexp.factor
basis/roman/roman.factor
basis/see/see.factor
basis/serialize/serialize-tests.factor
basis/shuffle/shuffle.factor
basis/simple-flat-file/simple-flat-file-docs.factor
basis/simple-flat-file/simple-flat-file.factor
basis/specialized-arrays/functor/functor.factor
basis/specialized-vectors/functor/functor.factor
basis/stack-checker/transforms/transforms-tests.factor
basis/stack-checker/transforms/transforms.factor
basis/suffix-arrays/suffix-arrays.factor
basis/tools/annotations/annotations-tests.factor
basis/tools/crossref/crossref-tests.factor
basis/tools/disassembler/disassembler.factor [changed mode: 0644->0755]
basis/tools/disassembler/udis/udis.factor [changed mode: 0644->0755]
basis/tools/walker/walker-tests.factor
basis/tr/tr.factor
basis/ui/gadgets/buttons/buttons-tests.factor
basis/ui/gadgets/gadgets-tests.factor
basis/ui/gadgets/panes/panes-tests.factor
basis/ui/operations/operations-tests.factor
basis/ui/tools/listener/listener-tests.factor
basis/unicode/breaks/breaks.factor
basis/unicode/case/case.factor
basis/unicode/categories/categories-docs.factor
basis/unicode/categories/categories.factor
basis/unicode/categories/syntax/authors.txt [new file with mode: 0755]
basis/unicode/categories/syntax/summary.txt [new file with mode: 0644]
basis/unicode/categories/syntax/syntax-docs.factor [new file with mode: 0644]
basis/unicode/categories/syntax/syntax-tests.factor [new file with mode: 0644]
basis/unicode/categories/syntax/syntax.factor [new file with mode: 0644]
basis/unicode/categories/syntax/tags.txt [new file with mode: 0755]
basis/unicode/collation/collation.factor
basis/unicode/data/data-docs.factor
basis/unicode/data/data.factor
basis/unicode/normalize/normalize.factor
basis/unicode/script/script.factor
basis/unicode/syntax/authors.txt [deleted file]
basis/unicode/syntax/summary.txt [deleted file]
basis/unicode/syntax/syntax.factor [deleted file]
basis/unicode/syntax/tags.txt [deleted file]
basis/unicode/unicode-docs.factor
basis/urls/urls-tests.factor
basis/urls/urls.factor
basis/values/values.factor
basis/vlists/vlists.factor
basis/windows/com/syntax/syntax.factor
basis/xml/char-classes/char-classes.factor
basis/xml/syntax/syntax.factor
basis/xml/tests/templating.factor
basis/xml/tests/xmltest.factor
basis/xml/writer/writer-tests.factor
basis/xmode/loader/syntax/syntax.factor
build-support/factor.sh
core/bootstrap/primitives.factor
core/bootstrap/syntax.factor
core/classes/classes.factor
core/classes/singleton/singleton-tests.factor
core/classes/tuple/tuple-tests.factor
core/classes/tuple/tuple.factor
core/combinators/combinators-tests.factor
core/compiler/units/units.factor
core/continuations/continuations-tests.factor
core/definitions/definitions.factor
core/destructors/destructors-tests.factor
core/effects/parser/parser.factor
core/generic/generic-docs.factor
core/generic/generic-tests.factor
core/generic/generic.factor
core/generic/math/math.factor
core/generic/parser/parser.factor
core/generic/standard/standard-docs.factor
core/generic/standard/standard-tests.factor
core/generic/standard/standard.factor
core/io/test/no-trailing-eol.factor
core/kernel/kernel-tests.factor
core/kernel/kernel.factor
core/parser/parser-docs.factor
core/parser/parser-tests.factor
core/parser/parser.factor
core/sequences/sequences.factor
core/slots/slots.factor
core/syntax/syntax-docs.factor
core/syntax/syntax.factor
core/vocabs/loader/loader-tests.factor
core/vocabs/loader/test/d/d.factor
core/vocabs/parser/parser.factor
core/words/words-docs.factor
core/words/words-tests.factor
core/words/words.factor
extra/4DNav/4DNav.factor
extra/adsoda/adsoda.factor
extra/advice/advice-tests.factor
extra/advice/advice.factor
extra/annotations/annotations.factor
extra/benchmark/spectral-norm/spectral-norm.factor
extra/ctags/ctags.factor
extra/ctags/etags/etags.factor
extra/descriptive/descriptive.factor
extra/infix/infix-tests.factor
extra/infix/infix.factor
extra/lint/lint-tests.factor
extra/literals/literals.factor
extra/mason/child/child.factor
extra/mason/report/report.factor
extra/math/analysis/analysis-tests.factor
extra/math/derivatives/syntax/syntax.factor
extra/method-chains/method-chains.factor
extra/money/money.factor
extra/multi-methods/multi-methods.factor
extra/multi-methods/tests/canonicalize.factor
extra/multi-methods/tests/legacy.factor
extra/peg-lexer/peg-lexer.factor
extra/project-euler/common/common.factor
extra/promises/promises-docs.factor
extra/promises/promises-tests.factor [new file with mode: 0644]
extra/promises/promises.factor
extra/sequences/n-based/n-based-tests.factor
extra/slides/slides.factor
extra/state-machine/authors.txt [deleted file]
extra/state-machine/state-machine.factor [deleted file]
extra/svg/svg-tests.factor
extra/trees/avl/avl.factor
extra/trees/splay/splay.factor
extra/trees/trees.factor
extra/units/units-tests.factor
extra/vars/vars.factor

index 40171f56e7917bda2b0916c6c1903f61672ca30d..988dc180e017b42f75048ec0f0a5143d6946c320 100644 (file)
@@ -4,7 +4,7 @@ sequences system libc alien.strings io.encodings.utf8 ;
 
 \ expand-constants must-infer
 
-: xyz 123 ;
+CONSTANT: xyz 123
 
 [ { "blah" 123 } ] [ { "blah" xyz } expand-constants ] unit-test
 
index 6c55528b70438c3fb146e78b3e2cefce355b4a82..1b6022d3b7b21bea1dadde136f2013a4761770e0 100644 (file)
@@ -26,4 +26,4 @@ M: F-destructor dispose* alien>> F ;
 
 ;FUNCTOR
 
-: DESTRUCTOR: scan-word define-destructor ; parsing
\ No newline at end of file
+SYNTAX: DESTRUCTOR: scan-word define-destructor ;
\ No newline at end of file
index 5e3dc24476520496b59b36c59987d9ccfda93562..83d56bf9e266b73cd90e400d1df9eb7b4159e933 100644 (file)
@@ -416,7 +416,7 @@ PRIVATE>
 : define-fortran-record ( name vocab fields -- )
     [ >lower ] [ ] [ fortran-record>c-struct ] tri* define-struct ;
 
-: RECORD: scan in get parse-definition define-fortran-record ; parsing
+SYNTAX: RECORD: scan in get parse-definition define-fortran-record ;
 
 : set-fortran-abi ( library -- )
     library-fortran-abis get-global at fortran-abi set ;
@@ -437,16 +437,16 @@ MACRO: fortran-invoke ( return library function parameters -- )
     return library function parameters return [ "void" ] unless* parse-arglist
     [ \ fortran-invoke 5 [ ] nsequence ] dip define-declared ;
 
-: SUBROUTINE: 
+SYNTAX: SUBROUTINE: 
     f "c-library" get scan ";" parse-tokens
-    [ "()" subseq? not ] filter define-fortran-function ; parsing
+    [ "()" subseq? not ] filter define-fortran-function ;
 
-: FUNCTION:
+SYNTAX: FUNCTION:
     scan "c-library" get scan ";" parse-tokens
-    [ "()" subseq? not ] filter define-fortran-function ; parsing
+    [ "()" subseq? not ] filter define-fortran-function ;
 
-: LIBRARY:
+SYNTAX: LIBRARY:
     scan
     [ "c-library" set ]
-    [ set-fortran-abi ] bi  ; parsing
+    [ set-fortran-abi ] bi ;
 
index 047768344279796f1c98ca005f9f4b78f6a11b6a..7e2d4615b5d0786b06433eb47a8b5282e8e8a57c 100644 (file)
@@ -1,4 +1,4 @@
-! Copyright (C) 2005, 2008 Slava Pestov.
+! Copyright (C) 2005, 2009 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors arrays kernel kernel.private math namespaces
 make sequences strings words effects combinators alien.c-types ;
@@ -6,28 +6,6 @@ IN: alien.structs.fields
 
 TUPLE: field-spec name offset type reader writer ;
 
-: reader-effect ( type spec -- effect )
-    [ 1array ] [ name>> 1array ] bi* <effect> ;
-
-PREDICATE: slot-reader < word "reading" word-prop >boolean ;
-
-: set-reader-props ( class spec -- )
-    2dup reader-effect
-    over reader>>
-    swap "declared-effect" set-word-prop
-    reader>> swap "reading" set-word-prop ;
-
-: writer-effect ( type spec -- effect )
-    name>> swap 2array 0 <effect> ;
-
-PREDICATE: slot-writer < word "writing" word-prop >boolean ;
-
-: set-writer-props ( class spec -- )
-    2dup writer-effect
-    over writer>>
-    swap "declared-effect" set-word-prop
-    writer>> swap "writing" set-word-prop ;
-
 : reader-word ( class name vocab -- word )
     [ "-" glue ] dip create ;
 
@@ -55,17 +33,13 @@ PREDICATE: slot-writer < word "writing" word-prop >boolean ;
 : define-struct-slot-word ( word quot spec effect -- )
     [ offset>> prefix ] dip define-inline ;
 
-: define-getter ( type spec -- )
-    [ set-reader-props ] keep
-    [ reader>> ]
-    [ type>> c-type-getter-boxer ]
-    [ ] tri
+: define-getter ( spec -- )
+    [ reader>> ] [ type>> c-type-getter-boxer ] [ ] tri
     (( c-ptr -- value )) define-struct-slot-word ;
 
-: define-setter ( type spec -- )
-    [ set-writer-props ] keep
+: define-setter ( spec -- )
     [ writer>> ] [ type>> c-setter ] [ ] tri
     (( value c-ptr -- )) define-struct-slot-word ;
 
-: define-field ( type spec -- )
-    [ define-getter ] [ define-setter ] 2bi ;
+: define-field ( spec -- )
+    [ define-getter ] [ define-setter ] bi ;
index 8bc570c4484f2a02de2c3bbc628647000b678b34..231f1bd42876a1e4f842fc97e0cd5a7b816604ff 100755 (executable)
@@ -24,7 +24,7 @@ os winnt? cpu x86? and [
     ] when
 ] when
 
-: MAX_FOOS 30 ;
+CONSTANT: MAX_FOOS 30
 
 C-STRUCT: foox
     { { "int" MAX_FOOS } "x" } ;
index ec9080690a4e27368bf01cac7a8fc499ddcaa2fc..b618e7974bc76cd9647f5fcd0f3f4a2c39f12616 100755 (executable)
@@ -1,4 +1,4 @@
-! Copyright (C) 2004, 2008 Slava Pestov.
+! Copyright (C) 2004, 2009 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors arrays assocs generic hashtables kernel kernel.private
 math namespaces parser sequences strings words libc fry
@@ -56,10 +56,10 @@ M: struct-type stack-size
 : (define-struct) ( name size align fields -- )
     [ [ align ] keep ] dip
     struct-type new
-    swap >>fields
-    swap >>align
-    swap >>size
-    swap typedef ;
+        swap >>fields
+        swap >>align
+        swap >>size
+        swap typedef ;
 
 : make-fields ( name vocab fields -- fields )
     [ first2 <field-spec> ] with with map ;
@@ -68,12 +68,11 @@ M: struct-type stack-size
     [ c-type-align ] [ max ] map-reduce ;
 
 : define-struct ( name vocab fields -- )
-    [
-        [ 2drop ] [ make-fields ] 3bi
-        [ struct-offsets ] keep
-        [ [ type>> ] map compute-struct-align ] keep
-        [ (define-struct) ] keep
-    ] [ 2drop '[ _ swap define-field ] ] 3bi each ;
+    [ 2drop ] [ make-fields ] 3bi
+    [ struct-offsets ] keep
+    [ [ type>> ] map compute-struct-align ] keep
+    [ (define-struct) ] keep
+    [ define-field ] each ;
 
 : define-union ( name members -- )
     [ expand-constants ] map
@@ -83,4 +82,3 @@ M: struct-type stack-size
 : offset-of ( field struct -- offset )
     c-types get at fields>> 
     [ name>> = ] with find nip offset>> ;
-
index 987c73127ee5feddf694a3bed65338920af44225..5406970364f54da685f27539d774ca3a1dd89414 100644 (file)
@@ -7,35 +7,34 @@ effects assocs combinators lexer strings.parser alien.parser
 fry vocabs.parser words.constant ;
 IN: alien.syntax
 
-: DLL" lexer get skip-blank parse-string dlopen parsed ; parsing
+SYNTAX: DLL" lexer get skip-blank parse-string dlopen parsed ;
 
-: ALIEN: scan string>number <alien> parsed ; parsing
+SYNTAX: ALIEN: scan string>number <alien> parsed ;
 
-: BAD-ALIEN <bad-alien> parsed ; parsing
+SYNTAX: BAD-ALIEN <bad-alien> parsed ;
 
-: LIBRARY: scan "c-library" set ; parsing
+SYNTAX: LIBRARY: scan "c-library" set ;
 
-: FUNCTION:
+SYNTAX: FUNCTION:
     scan "c-library" get scan ";" parse-tokens
     [ "()" subseq? not ] filter
-    define-function ; parsing
+    define-function ;
 
-: TYPEDEF:
-    scan scan typedef ; parsing
+SYNTAX: TYPEDEF:
+    scan scan typedef ;
 
-: C-STRUCT:
-    scan in get parse-definition define-struct ; parsing
+SYNTAX: C-STRUCT:
+    scan in get parse-definition define-struct ;
 
-: C-UNION:
-    scan parse-definition define-union ; parsing
+SYNTAX: C-UNION:
+    scan parse-definition define-union ;
 
-: C-ENUM:
+SYNTAX: C-ENUM:
     ";" parse-tokens
     [ [ create-in ] dip define-constant ] each-index ;
-    parsing
 
 : address-of ( name library -- value )
     load-library dlsym [ "No such symbol" throw ] unless* ;
 
-: &:
-    scan "c-library" get '[ _ _ address-of ] over push-all ; parsing
+SYNTAX: &:
+    scan "c-library" get '[ _ _ address-of ] over push-all ;
index e7dd6695a7e90bdfc36c3bb9bdbf290272faa8fa..be8c434e36918c9f60b937fcf4d263042515394c 100644 (file)
@@ -68,7 +68,7 @@ M: bit-array resize
 
 M: bit-array byte-length length 7 + -3 shift ;
 
-: ?{ \ } [ >bit-array ] parse-literal ; parsing
+SYNTAX: ?{ \ } [ >bit-array ] parse-literal ;
 
 : integer>bit-array ( n -- bit-array )
     dup 0 = [
index 31327999e73fceccb6ecd6c38ee9ff036cfaf3d2..41efdbd0d22b491fda2eca30d89b61a5381deba0 100644 (file)
@@ -3,7 +3,7 @@ USING: tools.test bit-vectors vectors sequences kernel math ;
 \r
 [ 0 ] [ 123 <bit-vector> length ] unit-test\r
 \r
-: do-it\r
+: do-it ( seq -- )\r
     1234 swap [ [ even? ] dip push ] curry each ;\r
 \r
 [ t ] [\r
index 85bea80b2dbadc239747c2a20fa22d65314a5c4e..a238f61244dc1675fed7bf94c32344e65035a924 100644 (file)
@@ -31,7 +31,7 @@ M: bit-array new-resizable drop <bit-vector> ;
 \r
 INSTANCE: bit-vector growable\r
 \r
-: ?V{ \ } [ >bit-vector ] parse-literal ; parsing\r
+SYNTAX: ?V{ \ } [ >bit-vector ] parse-literal ;\r
 \r
 M: bit-vector >pprint-sequence ;\r
 M: bit-vector pprint-delims drop \ ?V{ \ } ;\r
index a2621f4c32500d7b8b468d8f6a84f3cbf393a362..504afae018e38bfb8a8c36c8a7510428b9afc659 100644 (file)
@@ -95,10 +95,10 @@ CONSTANT: -1-offset             9
 SYMBOL: sub-primitives
 
 : make-jit ( quot rc rt offset -- quad )
-    [ { } make ] 3dip 4array ; inline
+    [ [ call( -- ) ] { } make ] 3dip 4array ;
 
 : jit-define ( quot rc rt offset name -- )
-    [ make-jit ] dip set ; inline
+    [ make-jit ] dip set ;
 
 : define-sub-primitive ( quot rc rt offset word -- )
     [ make-jit ] dip sub-primitives get set-at ;
@@ -398,9 +398,14 @@ M: byte-array '
     ] emit-object ;
 
 ! Tuples
+ERROR: tuple-removed class ;
+
+: require-tuple-layout ( word -- layout )
+    dup tuple-layout [ ] [ tuple-removed ] ?if ;
+
 : (emit-tuple) ( tuple -- pointer )
     [ tuple-slots ]
-    [ class transfer-word tuple-layout ] bi prefix [ ' ] map
+    [ class transfer-word require-tuple-layout ] bi prefix [ ' ] map
     tuple type-number dup [ emit-seq ] emit-object ;
 
 : emit-tuple ( tuple -- pointer )
index 9a100d9795a36442696f1638c90574c25c0aa32e..bd7510c95f632cb8b90e77702429dbc7626815a0 100644 (file)
@@ -4,7 +4,7 @@ prettyprint ;
 \r
 [ 0 ] [ 123 <byte-vector> length ] unit-test\r
 \r
-: do-it\r
+: do-it ( seq -- seq )\r
     123 [ over push ] each ;\r
 \r
 [ t ] [\r
index d146017db08d636d5022f64fbf833e67f562e376..970f4abbd8918bd750aaecce36e5a1fcc8f9ec9c 100644 (file)
@@ -42,7 +42,7 @@ M: byte-array like
 \r
 M: byte-array new-resizable drop <byte-vector> ;\r
 \r
-: BV{ \ } [ >byte-vector ] parse-literal ; parsing\r
+SYNTAX: BV{ \ } [ >byte-vector ] parse-literal ;\r
 \r
 M: byte-vector pprint* pprint-object ;\r
 M: byte-vector pprint-delims drop \ BV{ \ } ;\r
index 00d5730745728979aa94b2e49007e9e0f7327e07..b6d8e74072edb7ab0bdd7bbdd7d773150915cc11 100644 (file)
@@ -148,7 +148,7 @@ IN: calendar.tests
 [ t ] [ 123456789000000 [ micros>timestamp timestamp>micros ] keep = ] unit-test
 [ t ] [ 123456789123456000 [ micros>timestamp timestamp>micros ] keep = ] unit-test
 
-: checktime+ now dup clone [ rot time+ drop ] keep = ;
+: checktime+ ( duration -- ? ) now dup clone [ rot time+ drop ] keep = ;
 
 [ t ] [ 5 seconds checktime+ ] unit-test
 
index d77435a8ad21263353f34428b76b549d202dfc38..4b5af2e39d3ce533aa8b24b0a7512df388b15edc 100644 (file)
@@ -13,7 +13,7 @@ CLASS: {
     [ gc "x" set 2drop ]
 } ;
 
-: test-foo
+: test-foo ( -- )
     Foo -> alloc -> init
     dup 1.0 2.0 101.0 102.0 <CGRect> -> foo:
     -> release ;
index 01f134e2836cac06f1f314f5fc2119ea12abda39..69d698f9b10c1943a4170eebe2f92d64ddd59cf8 100644 (file)
@@ -14,18 +14,14 @@ SYMBOL: sent-messages
 : remember-send ( selector -- )
     sent-messages (remember-send) ;
 
-: ->
-    scan dup remember-send parsed \ send parsed ;
-    parsing
+SYNTAX: -> scan dup remember-send parsed \ send parsed ;
 
 SYMBOL: super-sent-messages
 
 : remember-super-send ( selector -- )
     super-sent-messages (remember-send) ;
 
-: SUPER->
-    scan dup remember-super-send parsed \ super-send parsed ;
-    parsing
+SYNTAX: SUPER-> scan dup remember-super-send parsed \ super-send parsed ;
 
 SYMBOL: frameworks
 
@@ -33,9 +29,9 @@ frameworks [ V{ } clone ] initialize
 
 [ frameworks get [ load-framework ] each ] "cocoa.messages" add-init-hook
 
-: FRAMEWORK: scan [ load-framework ] [ frameworks get push ] bi ; parsing
+SYNTAX: FRAMEWORK: scan [ load-framework ] [ frameworks get push ] bi ;
 
-: IMPORT: scan [ ] import-objc-class ; parsing
+SYNTAX: IMPORT: scan [ ] import-objc-class ;
 
 "Compiling Objective C bridge..." print
 
index c3f1b471e0a72dcfbb4b352cba8ba99aa12d21c2..e4db56221f33a40e0c7ba5911bb0e7d3a04f6896 100644 (file)
@@ -76,6 +76,6 @@ SYMBOL: +superclass+
         import-objc-class
     ] bind ;
 
-: CLASS:
+SYNTAX: CLASS:
     parse-definition unclip
-    >hashtable define-objc-class ; parsing
+    >hashtable define-objc-class ;
index 91621c110b4bcdd663ac0404117edaab5e930478..38339577cf93a37c7c4de7a16bed77aa54147f01 100644 (file)
@@ -30,4 +30,4 @@ ERROR: no-such-color name ;
 : named-color ( name -- color )
     dup rgb.txt at [ ] [ no-such-color ] ?if ;
 
-: COLOR: scan named-color parsed ; parsing
\ No newline at end of file
+SYNTAX: COLOR: scan named-color parsed ;
\ No newline at end of file
index 0389841e8f5ec78a25eaa410c4e7fff405ceb798..876ac5596cd829906b03b19505286f004daf6e1a 100644 (file)
@@ -13,10 +13,10 @@ IN: compiler.cfg.instructions.syntax
 : insn-effect ( word -- effect )
     boa-effect in>> but-last f <effect> ;
 
-: INSN:
+SYNTAX: INSN:
     parse-tuple-definition "regs" suffix
     [ dup tuple eq? [ drop insn-word ] when ] dip
     [ define-tuple-class ]
     [ 2drop save-location ]
     [ 2drop [ ] [ '[ f _ boa , ] ] [ insn-effect ] tri define-inline ]
-    3tri ; parsing
+    3tri ;
index 2b9d3df6f674896fb4e42a3a7759fb1e5eb17f9e..0882bed06e696d5b9fe255d9376dd5cd52ec8f83 100644 (file)
@@ -17,6 +17,6 @@ C: <ds-loc> ds-loc
 TUPLE: rs-loc < loc ;
 C: <rs-loc> rs-loc
 
-: V scan-word scan-word vreg boa parsed ; parsing
-: D scan-word <ds-loc> parsed ; parsing
-: R scan-word <rs-loc> parsed ; parsing
+SYNTAX: V scan-word scan-word vreg boa parsed ;
+SYNTAX: D scan-word <ds-loc> parsed ;
+SYNTAX: R scan-word <rs-loc> parsed ;
index c8e1e5fd0f49fa37fc2d6598c91e0652664d75a2..04c1a9c55fb9a69033e871f7b818a79ac4337641 100644 (file)
@@ -35,11 +35,14 @@ SYMBOLS: +optimized+ +unoptimized+ ;
     [ usage [ word? ] filter ] [ compiled-usage keys ] if
     [ queue-compile ] each ;
 
-: ripple-up? ( word status -- ? )
-    swap "compiled-status" word-prop [ = not ] keep and ;
+: ripple-up? ( status word -- ? )
+    [
+        [ nip changed-effects get key? ]
+        [ "compiled-status" word-prop eq? not ] 2bi or
+    ] keep "compiled-status" word-prop and ;
 
 : save-compiled-status ( word status -- )
-    [ dupd ripple-up? [ ripple-up ] [ drop ] if ]
+    [ over ripple-up? [ ripple-up ] [ drop ] if ]
     [ "compiled-status" set-word-prop ]
     2bi ;
 
index 6c6d580c877e13b9d8d4b381db1170b08b1a4701..93860db92475b13cc32980a61c7db294c34147b9 100644 (file)
@@ -270,7 +270,7 @@ cell 8 = [
 ] when
 
 ! Some randomized tests
-: compiled-fixnum* fixnum* ;
+: compiled-fixnum* ( a b -- c ) fixnum* ;
 
 [ ] [
     10000 [ 
@@ -281,7 +281,7 @@ cell 8 = [
     ] times
 ] unit-test
 
-: compiled-fixnum>bignum fixnum>bignum ;
+: compiled-fixnum>bignum ( a -- b ) fixnum>bignum ;
 
 [ bignum ] [ 0 compiled-fixnum>bignum class ] unit-test
 
@@ -293,7 +293,7 @@ cell 8 = [
     ] times
 ] unit-test
 
-: compiled-bignum>fixnum bignum>fixnum ;
+: compiled-bignum>fixnum ( a -- b ) bignum>fixnum ;
 
 [ ] [
     10000 [
index b5cb0ddbdbe4561c9ccd47de2a781ece20d63bb7..3aed47ae7e73a329a1be22c8211d58990235b80b 100644 (file)
@@ -13,7 +13,7 @@ M: array xyz xyz ;
 [ t ] [ \ xyz optimized>> ] unit-test
 
 ! Test predicate inlining
-: pred-test-1
+: pred-test-1 ( a -- b c )
     dup fixnum? [
         dup integer? [ "integer" ] [ "nope" ] if
     ] [
@@ -24,7 +24,7 @@ M: array xyz xyz ;
 
 TUPLE: pred-test ;
 
-: pred-test-2
+: pred-test-2 ( a -- b c )
     dup tuple? [
         dup pred-test? [ "pred-test" ] [ "nope" ] if
     ] [
@@ -33,7 +33,7 @@ TUPLE: pred-test ;
 
 [ T{ pred-test } "pred-test" ] [ T{ pred-test } pred-test-2 ] unit-test
 
-: pred-test-3
+: pred-test-3 ( a -- b c )
     dup pred-test? [
         dup tuple? [ "pred-test" ] [ "nope" ] if
     ] [
@@ -42,14 +42,14 @@ TUPLE: pred-test ;
 
 [ T{ pred-test } "pred-test" ] [ T{ pred-test } pred-test-3 ] unit-test
 
-: inline-test
+: inline-test ( a -- b )
     "nom" = ;
 
 [ t ] [ "nom" inline-test ] unit-test
 [ f ] [ "shayin" inline-test ] unit-test
 [ f ] [ 3 inline-test ] unit-test
 
-: fixnum-declarations >fixnum 24 shift 1234 bitxor ;
+: fixnum-declarations ( a -- b ) >fixnum 24 shift 1234 bitxor ;
 
 [ ] [ 1000000 fixnum-declarations . ] unit-test
 
@@ -61,13 +61,13 @@ TUPLE: pred-test ;
 
 ! regression
 
-: bad-kill-1 ( a b -- c d e ) [ 3 f ] [ dup bad-kill-1 ] if ; inline
-: bad-kill-2 bad-kill-1 drop ;
+: bad-kill-1 ( a b -- c d e ) [ 3 f ] [ dup bad-kill-1 ] if ; inline recursive
+: bad-kill-2 ( a b -- c d ) bad-kill-1 drop ;
 
 [ 3 ] [ t bad-kill-2 ] unit-test
 
 ! regression
-: (the-test) ( x -- y ) dup 0 > [ 1- (the-test) ] when ; inline
+: (the-test) ( x -- y ) dup 0 > [ 1- (the-test) ] when ; inline recursive
 : the-test ( -- x y ) 2 dup (the-test) ;
 
 [ 2 0 ] [ the-test ] unit-test
@@ -77,7 +77,7 @@ TUPLE: pred-test ;
     < [
         6 1 (double-recursion)
         3 2 (double-recursion)
-    ] when ; inline
+    ] when ; inline recursive
 
 : double-recursion ( -- ) 0 2 (double-recursion) ;
 
@@ -85,7 +85,7 @@ TUPLE: pred-test ;
 
 ! regression
 : double-label-1 ( a b c -- d )
-    [ f double-label-1 ] [ swap nth-unsafe ] if ; inline
+    [ f double-label-1 ] [ swap nth-unsafe ] if ; inline recursive
 
 : double-label-2 ( a -- b )
     dup array? [ ] [ ] if 0 t double-label-1 ;
@@ -100,7 +100,7 @@ GENERIC: void-generic ( obj -- * )
 
 ! regression
 : branch-fold-regression-0 ( m -- n )
-    t [ ] [ 1+ branch-fold-regression-0 ] if ; inline
+    t [ ] [ 1+ branch-fold-regression-0 ] if ; inline recursive
 
 : branch-fold-regression-1 ( -- m )
     10 branch-fold-regression-0 ;
@@ -224,7 +224,7 @@ USE: binary-search.private
 ] unit-test
 
 ! Regression
-: empty-compound ;
+: empty-compound ( -- ) ;
 
 : node-successor-f-bug ( x -- * )
     [ 3 throw ] [ empty-compound ] compose [ 3 throw ] if ;
@@ -293,7 +293,7 @@ HINTS: recursive-inline-hang-3 array ;
 
 ! Wow
 : counter-example ( a b c d -- a' b' c' d' )
-    dup 0 > [ 1 - [ rot 2 * ] dip counter-example ] when ; inline
+    dup 0 > [ 1 - [ rot 2 * ] dip counter-example ] when ; inline recursive
 
 : counter-example' ( -- a' b' c' d' )
     1 2 3.0 3 counter-example ;
diff --git a/basis/compiler/tests/redefine15.factor b/basis/compiler/tests/redefine15.factor
new file mode 100644 (file)
index 0000000..797460a
--- /dev/null
@@ -0,0 +1,20 @@
+USING: compiler.units words tools.test math kernel ;
+IN: compiler.tests.redefine15
+
+DEFER: word-1
+
+: word-2 ( a -- b ) word-1 ;
+
+[ \ word-1 [ ] (( a -- b )) define-declared ] with-compilation-unit 
+
+[ "a" ] [ "a" word-2 ] unit-test
+
+: word-3 ( a -- b ) 1 + ;
+
+: word-4 ( a -- b c ) 0 swap word-3 swap 1+ ;
+
+[ 1 1 ] [ 0 word-4 ] unit-test
+
+[ \ word-3 [ [ 2 + ] bi@ ] (( a b -- c d )) define-declared ] with-compilation-unit
+
+[ 2 3 ] [ 0 word-4 ] unit-test
\ No newline at end of file
index d6e90187feb8ed10997b9215955836c6f81f992b..5a28b282618dc83f9e91301fc85e6dd1b18e9eb0 100644 (file)
@@ -1,12 +1,14 @@
 IN: compiler.tests
 USING: compiler compiler.units tools.test math parser kernel
 sequences sequences.private classes.mixin generic definitions
-arrays words assocs eval ;
+arrays words assocs eval words.symbol ;
 
 DEFER: redefine2-test
 
 [ ] [ "USE: sequences USE: kernel IN: compiler.tests TUPLE: redefine2-test ; M: redefine2-test nth 2drop 3 ; INSTANCE: redefine2-test sequence" eval ] unit-test
 
+[ t ] [ \ redefine2-test symbol? ] unit-test
+
 [ t ] [ redefine2-test new sequence? ] unit-test
 
 [ 3 ] [ 0 redefine2-test new nth-unsafe ] unit-test
index e451694f480b05d80e145787d0599c1b9096979b..7de092d84aac6608b50e6b0a61f2318deb392f7b 100755 (executable)
@@ -90,7 +90,7 @@ M: object xyz ;
         [ swap [ call 1+ ] dip ] keep (i-repeat)
     ] if ; inline recursive
 
-: i-repeat [ { integer } declare ] dip 0 -rot (i-repeat) ; inline
+: i-repeat ( n quot -- ) [ { integer } declare ] dip 0 -rot (i-repeat) ; inline
 
 [ t ] [
     [ [ dup xyz drop ] i-repeat ] \ xyz inlined?
@@ -197,7 +197,7 @@ M: fixnum annotate-entry-test-1 drop ;
         [ dup annotate-entry-test-1 1+ ] dip (annotate-entry-test-2)
     ] if ; inline recursive
 
-: annotate-entry-test-2 0 -rot (annotate-entry-test-2) ; inline
+: annotate-entry-test-2 ( from to -- ) 0 -rot (annotate-entry-test-2) ; inline
 
 [ f ] [
     [ { bignum } declare annotate-entry-test-2 ]
index 2eab91310ff7f37d0d70114d4142bfde6e4b4b9e..7a98cd5e0a905baf7f975cec6df1a421825f4400 100644 (file)
@@ -16,8 +16,8 @@ MACRO: set-slots ( slots -- quot )
     [ [ in>> '[ _ _ construct ] ] dip compose ] [ drop ] 2bi
     define-declared ;
 
-: CONSTRUCTOR:
+SYNTAX: CONSTRUCTOR:
     scan-word [ name>> "<" ">" surround create-in ] keep
-    "(" expect ")" parse-effect
+    complete-effect
     parse-definition
-    define-constructor ; parsing
\ No newline at end of file
+    define-constructor ;
\ No newline at end of file
index 8c085d40be3094e41ac7ffb26ab63353e0b90743..7de601c433a5d32fb3e67700d22bdf6d734ab675 100644 (file)
@@ -3,7 +3,7 @@
 USING: words parser alien alien.c-types kernel fry accessors ;
 IN: core-text.utilities
 
-: C-GLOBAL:
+SYNTAX: C-GLOBAL:
     CREATE-WORD
     dup name>> '[ _ f dlsym *void* ]
-    (( -- value )) define-declared ; parsing
+    (( -- value )) define-declared ;
index c6a3a941949dfb0eca459d232c75056500b4a53e..befbe112bd0d248fa46d4404eb5feb82d8170471 100644 (file)
@@ -21,7 +21,7 @@ IN: cpu.ppc.assembler.backend
 : define-d-insn ( word opcode -- )
     [ d-insn ] curry (( d a simm -- )) define-declared ;
 
-: D: CREATE scan-word define-d-insn ; parsing
+SYNTAX: D: CREATE scan-word define-d-insn ;
 
 : sd-insn ( d a simm opcode -- )
     [ s>u16 { 0 21 16 } bitfield ] dip insn ;
@@ -29,7 +29,7 @@ IN: cpu.ppc.assembler.backend
 : define-sd-insn ( word opcode -- )
     [ sd-insn ] curry (( d a simm -- )) define-declared ;
 
-: SD: CREATE scan-word define-sd-insn ; parsing
+SYNTAX: SD: CREATE scan-word define-sd-insn ;
 
 : i-insn ( li aa lk opcode -- )
     [ { 0 1 0 } bitfield ] dip insn ;
@@ -40,26 +40,26 @@ IN: cpu.ppc.assembler.backend
 : (X) ( -- word quot )
     CREATE scan-word scan-word scan-word [ x-insn ] 3curry ;
 
-: X: (X) (( a s b -- )) define-declared ; parsing
+SYNTAX: X: (X) (( a s b -- )) define-declared ;
 
 : (1) ( quot -- quot' ) [ 0 ] prepose ;
 
-: X1: (X) (1) (( a s -- )) define-declared ; parsing
+SYNTAX: X1: (X) (1) (( a s -- )) define-declared ;
 
 : xfx-insn ( d spr xo opcode -- )
     [ { 1 11 21 } bitfield ] dip insn ;
 
 : CREATE-MF ( -- word ) scan "MF" prepend create-in ;
 
-: MFSPR:
+SYNTAX: MFSPR:
     CREATE-MF scan-word 5 shift [ 339 31 xfx-insn ] curry
-    (( d -- )) define-declared ; parsing
+    (( d -- )) define-declared ;
 
 : CREATE-MT ( -- word ) scan "MT" prepend create-in ;
 
-: MTSPR:
+SYNTAX: MTSPR:
     CREATE-MT scan-word 5 shift [ 467 31 xfx-insn ] curry
-    (( d -- )) define-declared ; parsing
+    (( d -- )) define-declared ;
 
 : xo-insn ( d a b oe rc xo opcode -- )
     [ { 1 0 10 11 16 21 } bitfield ] dip insn ;
@@ -68,9 +68,9 @@ IN: cpu.ppc.assembler.backend
     CREATE scan-word scan-word scan-word scan-word
     [ xo-insn ] 2curry 2curry ;
 
-: XO: (XO) (( a s b -- )) define-declared ; parsing
+SYNTAX: XO: (XO) (( a s b -- )) define-declared ;
 
-: XO1: (XO) (1) (( a s -- )) define-declared ; parsing
+SYNTAX: XO1: (XO) (1) (( a s -- )) define-declared ;
 
 GENERIC# (B) 2 ( dest aa lk -- )
 M: integer (B) 18 i-insn ;
@@ -84,11 +84,11 @@ M: label BC [ 0 BC ] dip rc-relative-ppc-2 label-fixup ;
 
 : CREATE-B ( -- word ) scan "B" prepend create-in ;
 
-: BC:
+SYNTAX: BC:
     CREATE-B scan-word scan-word
-    [ rot BC ] 2curry (( c -- )) define-declared ; parsing
+    [ rot BC ] 2curry (( c -- )) define-declared ;
 
-: B:
+SYNTAX: B:
     CREATE-B scan-word scan-word scan-word scan-word scan-word
     [ b-insn ] curry curry curry curry curry
-    (( bo -- )) define-declared ; parsing
+    (( bo -- )) define-declared ;
index ebee48de5f624a1b7217c1b2b08ad2df53b5add2..ec7bf8f34185a1cba1b73692a624b7b4e76cdb77 100644 (file)
@@ -11,8 +11,8 @@ big-endian on
 \r
 4 jit-code-format set\r
 \r
-: ds-reg 29 ;\r
-: rs-reg 30 ;\r
+CONSTANT: ds-reg 29\r
+CONSTANT: rs-reg 30\r
 \r
 : factor-area-size ( -- n ) 4 bootstrap-cells ;\r
 \r
index 343850f9e639dc47ffb8bb59947cb1e868721de9..631dcaa8f7d3536fae6f9d169f407a523a3c20bb 100644 (file)
@@ -11,5 +11,4 @@ IN: cpu.x86.assembler.syntax
 : define-registers ( names size -- )
     '[ _ define-register ] each-index ;
 
-: REGISTERS: ( -- )
-    scan-word ";" parse-tokens swap define-registers ; parsing
+SYNTAX: REGISTERS: scan-word ";" parse-tokens swap define-registers ;
index af77ce6ac1ced820de85ac2f3c378835d5534a87..50d7f044d169336e111d806a7f929cfbfebcd3df 100644 (file)
@@ -285,7 +285,7 @@ paste "PASTE"
 [ test-cascade ] test-postgresql
 [ test-restrict ] test-postgresql
 
-: test-repeated-insert
+: test-repeated-insert ( -- )
     [ ] [ person ensure-table ] unit-test
     [ ] [ person1 get insert-tuple ] unit-test
     [ person1 get insert-tuple ] must-fail ;
@@ -458,7 +458,7 @@ TUPLE: bignum-test id m n o ;
         swap >>n
         swap >>m ;
 
-: test-bignum
+: test-bignum ( -- )
     bignum-test "BIGNUM_TEST"
     {
         { "id" "ID" +db-assigned-id+ }
@@ -478,7 +478,7 @@ TUPLE: bignum-test id m n o ;
 TUPLE: secret n message ;
 C: <secret> secret
 
-: test-random-id
+: test-random-id ( -- )
     secret "SECRET"
     {
         { "n" "ID" +random-id+ system-random-generator }
index fb25ccf7151bc5b83163427e441fb588b8290f11..7c5fbed9f4c83bb858f942dbe397e1185150151e 100644 (file)
@@ -14,10 +14,10 @@ GENERIC: definition-icon ( definition -- path )
 
 <<
 
-: ICON:
+SYNTAX: ICON:
     scan-word \ definition-icon create-method
     scan '[ drop _ definition-icon-path ]
-    define ; parsing
+    define ;
 
 >>
 
index 9bf07a5330a556dad88bbb3cb5ed8a65d333e187..cf822b40a351f25e2a92c7893b6342b3546369aa 100644 (file)
@@ -41,13 +41,13 @@ M: hello bing hello-test ;
 
 [ "USING: delegate ;\nIN: delegate.tests\nPROTOCOL: baz foo bar { whoa 1 } ; inline\n" ] [ [ baz see ] with-string-writer ] unit-test
 
-GENERIC: one
+GENERIC: one ( a -- b )
 M: integer one ;
-GENERIC: two
+GENERIC: two ( a -- b )
 M: integer two ;
-GENERIC: three
+GENERIC: three ( a -- b )
 M: integer three ;
-GENERIC: four
+GENERIC: four ( a -- b )
 M: integer four ;
 
 PROTOCOL: alpha one two ;
index 0c16b7c336e0647aee9bc48515998bdf5397cf0c..fe6ea03794f01fa5e9578ee4c789260dbc3e2ee2 100644 (file)
@@ -85,9 +85,9 @@ PRIVATE>
 : define-consult ( consultation -- )
     [ register-consult ] [ consult-methods ] bi ;
 
-: CONSULT:
+SYNTAX: CONSULT:
     scan-word scan-word parse-definition <consultation>
-    [ save-location ] [ define-consult ] bi ; parsing
+    [ save-location ] [ define-consult ] bi ;
 
 M: consultation where loc>> ;
 
@@ -144,8 +144,8 @@ PRIVATE>
         [ initialize-protocol-props ] 2tri
     ] 2bi ;
 
-: PROTOCOL:
-    CREATE-WORD parse-definition define-protocol ; parsing
+SYNTAX: PROTOCOL:
+    CREATE-WORD parse-definition define-protocol ;
 
 PREDICATE: protocol < word protocol-words ; ! Subclass of symbol?
 
@@ -159,7 +159,7 @@ M: protocol definer drop \ PROTOCOL: \ ; ;
 
 M: protocol group-words protocol-words ;
 
-: SLOT-PROTOCOL:
+SYNTAX: SLOT-PROTOCOL:
     CREATE-WORD ";" parse-tokens
     [ [ reader-word ] [ writer-word ] bi 2array ] map concat
-    define-protocol ; parsing
\ No newline at end of file
+    define-protocol ;
\ No newline at end of file
index b48a7a01add7b4cdf9774ca6966a90e6454fc84c..0f88181f28a3de964e32b14203f8f07eb1cbeb65 100644 (file)
@@ -17,7 +17,7 @@ HELP: (set-os-envs)
 { $notes "In most cases, use " { $link set-os-envs } " instead." } ;
 
 
-HELP: os-env ( key -- value )
+HELP: os-env
 { $values { "key" string } { "value" string } }
 { $description "Looks up the value of a shell environment variable." }
 { $examples
@@ -39,14 +39,14 @@ HELP: set-os-envs
     "Names and values of environment variables are operating system-specific. Windows NT allows values up to 32766 characters in length."
 } ;
 
-HELP: set-os-env ( value key -- )
+HELP: set-os-env
 { $values { "value" string } { "key" string } }
 { $description "Set an environment variable." }
 { $notes
     "Names and values of environment variables are operating system-specific."
 } ;
 
-HELP: unset-os-env ( key -- )
+HELP: unset-os-env
 { $values { "key" string } }
 { $description "Unset an environment variable." }
 { $notes
index 8c6b07a01c61a866a5b2405842d3b96abd5c958c..036f0d667a488c9139df673507ed7451cc1a705c 100644 (file)
@@ -9,7 +9,7 @@ HELP: write-farkup
 { $values { "string" string } }
 { $description "Parse a Farkup string and writes the resulting HTML to " { $link output-stream } "." } ;
 
-HELP: parse-farkup ( string -- farkup )
+HELP: parse-farkup
 { $values { "string" string } { "farkup" "a Farkup syntax tree node" } }
 { $description "Parses Farkup and outputs a tree of " { $link "farkup-ast" } "." } ;
 
index 71894503945c43cd91b6944faef4b49f56543a00..d240e6f23374f769c15e3256843b24bc416d7420 100644 (file)
@@ -34,7 +34,7 @@ sequences eval accessors ;
     { "a" "b" "c" } swap map
 ] unit-test
 
-: funny-dip '[ [ @ ] dip ] call ; inline
+: funny-dip ( obj quot -- ) '[ [ @ ] dip ] call ; inline
 
 [ "hi" 3 ] [ "h" "i" 3 [ append ] funny-dip ] unit-test
 
index 9ffad43cf42fbf7483454c6210c61763c1088b53..d50fd9442bf72dd62baf65525f6a30e7e803b952 100644 (file)
@@ -53,4 +53,4 @@ M: callable deep-fry
 
 M: object deep-fry , ;
 
-: '[ parse-quotation fry over push-all ; parsing
+SYNTAX: '[ parse-quotation fry over push-all ;
index df008d52bdc4e4754955f3918f0995120ad02bbd..b4417532b4f64fc3f7aa018766f16ee9460f5f52 100644 (file)
@@ -13,7 +13,7 @@ WHERE
 
 TUPLE: B { value T } ;
 
-C: <B> B
+C: <B> B ( T -- B )
 
 ;FUNCTOR
 
index caa41d6c2962a0e651bc70792363fe136c81ee6c..309154fb491e3887a5e78b7e8ce64fbfae9f4e3b 100644 (file)
@@ -14,7 +14,9 @@ IN: functors
 
 : scan-param ( -- obj ) scan-object literalize ;
 
-: define* ( word def effect -- ) pick set-word define-declared ;
+: define* ( word def -- ) over set-word define ;
+
+: define-declared* ( word def effect -- ) pick set-word define-declared ;
 
 TUPLE: fake-quotation seq ;
 
@@ -39,9 +41,14 @@ M: object fake-quotations> ;
 : parse-definition* ( accum -- accum )
     parse-definition >fake-quotations parsed \ fake-quotations> parsed ;
 
-: DEFINE* ( accum -- accum ) effect get parsed \ define* parsed ;
+: parse-declared* ( accum -- accum )
+    complete-effect
+    [ parse-definition* ] dip
+    parsed ;
+
+: DEFINE* ( accum -- accum ) \ define-declared* parsed ;
 
-: `TUPLE:
+SYNTAX: `TUPLE:
     scan-param parsed
     scan {
         { ";" [ tuple parsed f parsed ] }
@@ -52,40 +59,38 @@ M: object fake-quotations> ;
             make parsed
         ]
     } case
-    \ define-tuple-class parsed ; parsing
+    \ define-tuple-class parsed ;
 
-: `M:
-    effect off
+SYNTAX: `M:
     scan-param parsed
     scan-param parsed
     \ create-method-in parsed
     parse-definition*
-    DEFINE* ; parsing
+    \ define* parsed ;
 
-: `C:
-    effect off
+SYNTAX: `C:
+    scan-param parsed
     scan-param parsed
+    complete-effect
+    [ [ [ boa ] curry ] over push-all ] dip parsed
+    \ define-declared* parsed ;
+
+SYNTAX: `:
     scan-param parsed
-    [ [ boa ] curry ] over push-all
-    DEFINE* ; parsing
+    parse-declared*
+    \ define-declared* parsed ;
 
-: `:
-    effect off
+SYNTAX: `SYNTAX:
     scan-param parsed
     parse-definition*
-    DEFINE* ; parsing
+    \ define-syntax parsed ;
 
-: `INSTANCE:
+SYNTAX: `INSTANCE:
     scan-param parsed
     scan-param parsed
-    \ add-mixin-instance parsed ; parsing
-
-: `inline [ word make-inline ] over push-all ; parsing
-
-: `parsing [ word make-parsing ] over push-all ; parsing
+    \ add-mixin-instance parsed ;
 
-: `(
-    ")" parse-effect effect set ; parsing
+SYNTAX: `inline [ word make-inline ] over push-all ;
 
 : (INTERPOLATE) ( accum quot -- accum )
     [ scan interpolate-locals ] dip
@@ -93,11 +98,11 @@ M: object fake-quotations> ;
 
 PRIVATE>
 
-: IS [ dup search [ ] [ no-word ] ?if ] (INTERPOLATE) ; parsing
+SYNTAX: IS [ dup search [ ] [ no-word ] ?if ] (INTERPOLATE) ;
 
-: DEFINES [ create-in ] (INTERPOLATE) ; parsing
+SYNTAX: DEFINES [ create-in ] (INTERPOLATE) ;
 
-: DEFINES-CLASS [ create-class-in ] (INTERPOLATE) ; parsing
+SYNTAX: DEFINES-CLASS [ create-class-in ] (INTERPOLATE) ;
 
 DEFER: ;FUNCTOR delimiter
 
@@ -110,9 +115,8 @@ DEFER: ;FUNCTOR delimiter
         { "C:" POSTPONE: `C: }
         { ":" POSTPONE: `: }
         { "INSTANCE:" POSTPONE: `INSTANCE: }
+        { "SYNTAX:" POSTPONE: `SYNTAX: }
         { "inline" POSTPONE: `inline }
-        { "parsing" POSTPONE: `parsing }
-        { "(" POSTPONE: `( }
     } ;
 
 : push-functor-words ( -- )
@@ -127,9 +131,9 @@ DEFER: ;FUNCTOR delimiter
     [ \ ;FUNCTOR parse-until >quotation ] ((parse-lambda)) <let*> 1quotation
     pop-functor-words ;
 
-: (FUNCTOR:) ( -- word def )
+: (FUNCTOR:) ( -- word def effect )
     CREATE-WORD [ parse-functor-body ] parse-locals-definition ;
 
 PRIVATE>
 
-: FUNCTOR: (FUNCTOR:) define ; parsing
+SYNTAX: FUNCTOR: (FUNCTOR:) define-declared ;
index 60a526fb247996f05a7ca0b91001628c50d28dc1..cefeda04818c5084b8e678ac081b7985f89897b4 100644 (file)
@@ -7,7 +7,7 @@ IN: furnace.actions.tests
     [ "a" param "b" param [ string>number ] bi@ + ] >>display
 "action-1" set
 
-: lf>crlf "\n" split "\r\n" join ;
+: lf>crlf ( string -- string' ) "\n" split "\r\n" join ;
 
 STRING: action-request-test-1
 GET http://foo/bar?a=12&b=13 HTTP/1.1
index c591b848ec0f94eb0a29e7e8c4c035bd844dd96e..1d5aa43c7b18c99b3f1a0719d3da20c60a36becd 100644 (file)
@@ -4,7 +4,7 @@ http.server furnace furnace.utilities tools.test kernel
 namespaces accessors io.streams.string urls xml.writer ;
 TUPLE: funny-dispatcher < dispatcher ;
 
-: <funny-dispatcher> funny-dispatcher new-dispatcher ;
+: <funny-dispatcher> ( -- dispatcher ) funny-dispatcher new-dispatcher ;
 
 TUPLE: base-path-check-responder ;
 
index 14cdce3811b908e6ea111dbea459c053c74e3f70..b325c778cfa2ae8f8aac7d8adcde459e5fd2ec88 100644 (file)
@@ -6,7 +6,7 @@ io.streams.string io.files io.files.temp io.directories
 splitting destructors sequences db db.tuples db.sqlite\r
 continuations urls math.parser furnace furnace.utilities ;\r
 \r
-: with-session\r
+: with-session ( session quot -- )\r
     [\r
         [ [ save-session-after ] [ session set ] bi ] dip call\r
     ] with-destructors ; inline\r
@@ -22,7 +22,7 @@ M: foo call-responder*
     "x" [ 1+ ] schange\r
     "x" sget number>string "text/html" <content> ;\r
 \r
-: url-responder-mock-test\r
+: url-responder-mock-test ( -- )\r
     [\r
         <request>\r
             "GET" >>method\r
@@ -34,7 +34,7 @@ M: foo call-responder*
         [ write-response-body drop ] with-string-writer\r
     ] with-destructors ;\r
 \r
-: sessions-mock-test\r
+: sessions-mock-test ( -- )\r
     [\r
         <request>\r
             "GET" >>method\r
@@ -45,7 +45,7 @@ M: foo call-responder*
         [ write-response-body drop ] with-string-writer\r
     ] with-destructors ;\r
 \r
-: <exiting-action>\r
+: <exiting-action> ( -- action )\r
     <action>\r
         [ [ ] "text/plain" <content> exit-with ] >>display ;\r
 \r
index 5f1f07273615c311fb2f2100810148216e875681..6f97c7c3d5412fd65606f39540a6edef2d9b5253 100644 (file)
@@ -4,7 +4,7 @@ IN: hash2.tests
 [ t ] [ 1 2 { 1 2 } 2= ] unit-test
 [ f ] [ 1 3 { 1 2 } 2= ] unit-test
 
-: sample-hash
+: sample-hash ( -- )
     5 <hash2>
     dup 2 3 "foo" roll set-hash2
     dup 4 2 "bar" roll set-hash2
index 47c3105436c7a00e06e5a43c5267332f247077f8..2e01330d73ba9b723c62ae89085666822c19f552 100644 (file)
@@ -4,7 +4,7 @@ definitions assocs sequences kernel namespaces parser arrays
 io.streams.string continuations debugger compiler.units eval ;
 
 [ ] [
-    "IN: help.crossref.tests USING: help.syntax help.markup ; : foo ; HELP: foo \"foo is great\" ; ARTICLE: \"foo\" \"Foo\" { $subsection foo } ;" eval
+    "IN: help.crossref.tests USING: help.syntax help.markup ; : foo ( -- ) ; HELP: foo \"foo is great\" ; ARTICLE: \"foo\" \"Foo\" { $subsection foo } ;" eval
 ] unit-test
 
 [ $subsection ] [
@@ -23,7 +23,7 @@ io.streams.string continuations debugger compiler.units eval ;
 ] unit-test
 
 [ ] [
-    "IN: help.crossref.tests USING: help.syntax help.markup ; : bar ; HELP: bar \"bar is great\" ; ARTICLE: \"bar\" \"Bar\" { $subsection bar } ;" eval
+    "IN: help.crossref.tests USING: help.syntax help.markup ; : bar ( -- ) ; HELP: bar \"bar is great\" ; ARTICLE: \"bar\" \"Bar\" { $subsection bar } ;" eval
 ] unit-test
 
 [ ] [
index 5d83afae8886d91bd3e8a483bd9eb7a3b84d64f9..7bb66eca02fa2e019e72a300ba3889e5c2ae5e9a 100644 (file)
@@ -7,7 +7,7 @@ IN: help.definitions.tests
 
 [
     [ 4 ] [
-        "IN: help.definitions.tests USING: help.syntax ; : hello ; HELP: hello \"test\" ; ARTICLE: \"hello\" \"world\" ; ARTICLE: \"hello2\" \"world\" ;" <string-reader> "foo"
+        "IN: help.definitions.tests USING: help.syntax ; : hello ( -- ) ; HELP: hello \"test\" ; ARTICLE: \"hello\" \"world\" ; ARTICLE: \"hello2\" \"world\" ;" <string-reader> "foo"
         parse-stream drop
 
         "foo" source-file definitions>> first assoc-size
@@ -20,7 +20,7 @@ IN: help.definitions.tests
     ] unit-test
 
     [ 2 ] [
-        "IN: help.definitions.tests USING: help.syntax ; : hello ; ARTICLE: \"hello\" \"world\" ;" <string-reader> "foo"
+        "IN: help.definitions.tests USING: help.syntax ; : hello ( -- ) ; ARTICLE: \"hello\" \"world\" ;" <string-reader> "foo"
         parse-stream drop
 
         "foo" source-file definitions>> first assoc-size
@@ -32,7 +32,7 @@ IN: help.definitions.tests
         "hello" "help.definitions.tests" lookup "help" word-prop
     ] unit-test
 
-    [ ] [ "IN: help.definitions.tests USING: help.syntax ; : xxx ; HELP: xxx ;" eval ] unit-test
+    [ ] [ "IN: help.definitions.tests USING: help.syntax ; : xxx ( -- ) ; HELP: xxx ;" eval ] unit-test
 
     [ ] [ "xxx" "help.definitions.tests" lookup print-topic ] unit-test
 
index 74bc45d36c507799a046616119a721c9c7316d93..9b928f3691cb84d7e15bf71b773b04eeb4f2d046 100644 (file)
@@ -11,7 +11,7 @@ TUPLE: blahblah quux ;
 [ ] [ \ >>quux print-topic ] unit-test
 [ ] [ \ blahblah? print-topic ] unit-test
 
-: fooey "fooey" throw ;
+: fooey ( -- * ) "fooey" throw ;
 
 [ ] [ \ fooey print-topic ] unit-test
 
index 8ea36d62fbb810d4c21bc1f2ff04773e9942b088..a80d38663898edf342be6ff2cb0e1041bba66ae5 100644 (file)
@@ -4,7 +4,7 @@ USING: accessors arrays definitions generic io kernel assocs
 hashtables namespaces make parser prettyprint sequences strings
 io.styles vectors words math sorting splitting classes slots fry
 sets vocabs help.stylesheet help.topics vocabs.loader quotations
-combinators see ;
+combinators see present ;
 IN: help.markup
 
 PREDICATE: simple-element < array
@@ -276,7 +276,7 @@ M: f ($instance)
     $snippet ;
 
 : values-row ( seq -- seq )
-    unclip \ $snippet swap ?word-name 2array
+    unclip \ $snippet swap present 2array
     swap dup first word? [ \ $instance prefix ] when 2array ;
 
 : $values ( element -- )
index 9f98ba6d8d607949dcef701a3a758ef9d74a5fbd..1844d18d944c9ba56dc24e9aa61431e1a88590a9 100644 (file)
@@ -1,23 +1,19 @@
-! Copyright (C) 2005, 2008 Slava Pestov.
+! Copyright (C) 2005, 2009 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors arrays kernel parser sequences words help
 help.topics namespaces vocabs definitions compiler.units
 vocabs.parser ;
 IN: help.syntax
 
-: HELP:
+SYNTAX: HELP:
     scan-word bootstrap-word
-    dup set-word
-    dup >link save-location
-    \ ; parse-until >array swap set-word-help ; parsing
+    [ >link save-location ] [ [ \ ; parse-until >array ] dip set-word-help ] bi ;
 
-: ARTICLE:
+SYNTAX: ARTICLE:
     location [
-        \ ; parse-until >array [ first2 ] keep 2 tail <article>
+        \ ; parse-until >array [ first2 ] [ 2 tail ] bi <article>
         over add-article >link
-    ] dip remember-definition ; parsing
+    ] dip remember-definition ;
 
-: ABOUT:
-    in get vocab
-    dup changed-definition
-    scan-object >>help drop ; parsing
+SYNTAX: ABOUT:
+    in get vocab scan-object >>help changed-definition ;
index 4093666eb7fa59f3c864d0990fe655171e687ac1..52684e55f59ab19195f37c5f6d9a42a06e344bd6 100644 (file)
@@ -59,12 +59,11 @@ M: object specializer-declaration class ;
 : specialized-length ( specializer -- n )
     dup [ array? ] all? [ first ] when length ;
 
-: HINTS:
+SYNTAX: HINTS:
     scan-object
     dup method-spec? [ first2 method ] when
     [ redefined ]
     [ parse-definition "specializer" set-word-prop ] bi ;
-    parsing
 
 ! Default specializers
 { first first2 first3 first4 }
index 86f86a8468e8b62bd4c88b312de78b842497a8c9..fd786d355dba983bd4a6a8b0bc1388849b4e9535 100644 (file)
@@ -5,7 +5,7 @@ splitting unicode.categories furnace accessors
 html.templates.chloe.compiler ;
 IN: html.templates.chloe.tests
 
-: run-template
+: run-template ( quot -- string )
     with-string-writer [ "\r\n\t" member? not ] filter
     "?>" split1 nip ; inline
 
@@ -37,7 +37,7 @@ IN: html.templates.chloe.tests
     ] run-template
 ] unit-test
 
-: test4-aux? t ;
+: test4-aux? ( -- ? ) t ;
 
 [ "True" ] [
     [
@@ -45,7 +45,7 @@ IN: html.templates.chloe.tests
     ] run-template
 ] unit-test
 
-: test5-aux? f ;
+: test5-aux? ( -- ? ) f ;
 
 [ "" ] [
     [
index 19f2019266f4fc142bf1962901f86b954bca6254..d69dc085371f28d0a7041f6432630e7a6ac82131 100644 (file)
@@ -25,8 +25,7 @@ M: tuple-class component-tag ( tag class -- )
     [ compile-component-attrs ] 2bi
     [ render ] [code] ;
 
-: COMPONENT:
+SYNTAX: COMPONENT:
     scan-word
     [ name>> ] [ '[ _ component-tag ] ] bi
     define-chloe-tag ;
-    parsing
index 7af37b65929831ace268e9437c31c1dd6d6ff1b8..7c47a44d9efee186f87e6c7ffff88b65e00b73b0 100644 (file)
@@ -15,8 +15,8 @@ tags [ H{ } clone ] initialize
 
 : define-chloe-tag ( name quot -- ) swap tags get set-at ;
 
-: CHLOE:
-    scan parse-definition define-chloe-tag ; parsing
+SYNTAX: CHLOE:
+    scan parse-definition define-chloe-tag ;
 
 CONSTANT: chloe-ns "http://factorcode.org/chloe/1.0"
 
index f3539f6a0fb826e8006650a3f1cd63a5b35f44f7..21e9f8352d9119ba6c23edb760de9992022d5382 100644 (file)
@@ -49,7 +49,7 @@ DEFER: <% delimiter
         drop
     ] if ;
 
-: %> lexer get parse-%> ; parsing
+SYNTAX: %> lexer get parse-%> ;
 
 : parse-template-lines ( lines -- quot )
     <template-lexer> [
index 0d4282b1d7b8efd656e4a0c0fbedccf60121140f..bc906fad44b3e4862e84d8ca15b33c0ea1f5eb97 100644 (file)
@@ -13,7 +13,7 @@ IN: http.tests
 
 [ "application/octet-stream" binary ] [ "application/octet-stream" parse-content-type ] unit-test
 
-: lf>crlf "\n" split "\r\n" join ;
+: lf>crlf ( string -- string' ) "\n" split "\r\n" join ;
 
 STRING: read-request-test-1
 POST /bar HTTP/1.1
@@ -180,14 +180,14 @@ accessors namespaces threads
 http.server.responses http.server.redirection furnace.redirection
 http.server.dispatchers db.tuples ;
 
-: add-quit-action
+: add-quit-action ( responder -- responder )
     <action>
         [ stop-this-server "Goodbye" "text/html" <content> ] >>display
     "quit" add-responder ;
 
-: test-db-file "test.db" temp-file ;
+: test-db-file ( -- path ) "test.db" temp-file ;
 
-: test-db test-db-file <sqlite-db> ;
+: test-db ( -- db ) test-db-file <sqlite-db> ;
 
 [ test-db-file delete-file ] ignore-errors
 
@@ -268,7 +268,7 @@ test-db [
     test-httpd
 ] unit-test
 
-: 404? [ download-failed? ] [ response>> code>> 404 = ] bi and ;
+: 404? ( response -- ? ) [ download-failed? ] [ response>> code>> 404 = ] bi and ;
 
 ! This should give a 404 not an infinite redirect loop
 [ "http://localhost/d/blah" add-port http-get nip ] [ 404? ] must-fail-with
index 5c859f8947dcdca655a99bec9c4aba763b3b76c7..1de65fa91f8febc1f5002002cb8867f2dda5fd1a 100644 (file)
@@ -38,6 +38,6 @@ MACRO: interpolate ( string -- )
 : interpolate-locals ( string -- quot )
     [ search [ ] ] (interpolate) ;
 
-: I[
+SYNTAX: I[
     "]I" parse-multiline-string
-    interpolate-locals over push-all ; parsing
+    interpolate-locals over push-all ;
index de184585462f553fcf8ce2be277a8dcf751d3ab5..0d5e471bffd8c48620a57b9115ca1f0ebd61807e 100644 (file)
@@ -1,22 +1,32 @@
-USING: help.markup help.syntax ;\r
+! Copyright (C) 2008, 2009 Daniel Ehrenberg.\r
+! See http://factorcode.org/license.txt for BSD license.\r
+USING: help.markup help.syntax assocs kernel sequences ;\r
 IN: interval-maps\r
 \r
 HELP: interval-at*\r
-{ $values { "key" "an object" } { "map" "an interval map" } { "value" "the value for the key, or f" } { "?" "whether the key is present" } }\r
+{ $values { "key" object } { "map" interval-map } { "value" "the value for the key, or f" } { "?" "whether the key is present" } }\r
 { $description "Looks up a key in an interval map, returning the corresponding value if the item is in an interval in the map, and a boolean flag. The operation takes O(log n) time." } ;\r
 \r
 HELP: interval-at\r
-{ $values { "key" "an object" } { "map" "an interval map" } { "value" "the value for the key, or f" } }\r
+{ $values { "key" object } { "map" interval-map } { "value" "the value for the key, or f" } }\r
 { $description "Looks up a key in an interval map, returning the value of the corresponding interval, or f if the interval is not present in the map." } ;\r
 \r
 HELP: interval-key?\r
-{ $values { "key" "an object" } { "map" "an interval map" } { "?" "a boolean" } }\r
+{ $values { "key" object } { "map" interval-map } { "?" "a boolean" } }\r
 { $description "Tests whether an object is in an interval in the interval map, returning t if the object is present." } ;\r
 \r
 HELP: <interval-map>\r
-{ $values { "specification" "an assoc" } { "map" "an interval map" } }\r
+{ $values { "specification" assoc } { "map" interval-map } }\r
 { $description "From a specification, produce an interval tree. The specification is an assoc where the keys are intervals, or pairs of numbers to represent intervals, or individual numbers to represent singleton intervals. The values are the values int he interval map. Construction time is O(n log n)." } ;\r
 \r
+HELP: interval-values\r
+{ $values { "map" interval-map } { "values" sequence } }\r
+{ $description "Constructs a list of all of the values that interval map keys are associated with. This list may contain duplicates." } ;\r
+\r
+HELP: coalesce\r
+{ $values { "alist" "an association list with integer keys" } { "specification" { "array of the format used by " { $link <interval-map> } } } }\r
+{ $description "Finds ranges used in the given alist, coalescing them into a single range." } ;\r
+\r
 ARTICLE: "interval-maps" "Interval maps"\r
 "The " { $vocab-link "interval-maps" } " vocabulary implements a data structure, similar to assocs, where a set of closed intervals of keys are associated with values. As such, interval maps do not conform to the assoc protocol, because intervals of floats, for example, can be used, and it is impossible to get a list of keys in between."\r
 $nl\r
@@ -24,7 +34,9 @@ $nl
 { $subsection interval-at* }\r
 { $subsection interval-at }\r
 { $subsection interval-key? }\r
+{ $subsection interval-values }\r
 "Use the following to construct interval maps"\r
-{ $subsection <interval-map> } ;\r
+{ $subsection <interval-map> }\r
+{ $subsection coalesce } ;\r
 \r
 ABOUT: "interval-maps"\r
index 63a5740845ef03117df61006a834c27b2f26a40e..22283deecb5971a7c0a9caa3c2ac89c076f7def0 100644 (file)
@@ -8,17 +8,21 @@ TUPLE: interval-map array ;
 \r
 <PRIVATE\r
 \r
+ALIAS: start first\r
+ALIAS: end second\r
+ALIAS: value third\r
+\r
 : find-interval ( key interval-map -- interval-node )\r
-    [ first <=> ] with search nip ;\r
+    array>> [ start <=> ] with search nip ;\r
 \r
 : interval-contains? ( key interval-node -- ? )\r
-    first2 between? ;\r
+    [ start ] [ end ] bi between? ;\r
 \r
 : all-intervals ( sequence -- intervals )\r
     [ [ dup number? [ dup 2array ] when ] dip ] { } assoc-map-as ;\r
 \r
 : disjoint? ( node1 node2 -- ? )\r
-    [ second ] [ first ] bi* < ;\r
+    [ end ] [ start ] bi* < ;\r
 \r
 : ensure-disjoint ( intervals -- intervals )\r
     dup [ disjoint? ] monotonic?\r
@@ -30,14 +34,17 @@ TUPLE: interval-map array ;
 PRIVATE>\r
 \r
 : interval-at* ( key map -- value ? )\r
-    [ drop ] [ array>> find-interval ] 2bi\r
+    [ drop ] [ find-interval ] 2bi\r
     [ nip ] [ interval-contains? ] 2bi\r
-    [ third t ] [ drop f f ] if ;\r
+    [ value t ] [ drop f f ] if ;\r
 \r
 : interval-at ( key map -- value ) interval-at* drop ;\r
 \r
 : interval-key? ( key map -- ? ) interval-at* nip ;\r
 \r
+: interval-values ( map -- values )\r
+    array>> [ value ] map ;\r
+\r
 : <interval-map> ( specification -- map )\r
     all-intervals [ [ first second ] compare ] sort\r
     >intervals ensure-disjoint interval-map boa ;\r
index 2e94d7a2df0fea1e76333bde26c29273f132f58e..ed054d79582010892db2e842375bd57a01cb4f95 100644 (file)
@@ -5,7 +5,7 @@ io.streams.duplex destructors make io.launcher ;
 IN: io.backend.unix.tests
 
 ! Unix domain stream sockets
-: socket-server "unix-domain-socket-test" temp-file ;
+: socket-server ( -- path ) "unix-domain-socket-test" temp-file ;
 
 [
     [ socket-server delete-file ] ignore-errors
@@ -33,8 +33,8 @@ yield
     ] { } make
 ] unit-test
 
-: datagram-server "unix-domain-datagram-test" temp-file ;
-: datagram-client "unix-domain-datagram-test-2" temp-file ;
+: datagram-server ( -- path ) "unix-domain-datagram-test" temp-file ;
+: datagram-client ( -- path ) "unix-domain-datagram-test-2" temp-file ;
 
 ! Unix domain datagram sockets
 [ datagram-server delete-file ] ignore-errors
@@ -104,7 +104,7 @@ datagram-client <local> <datagram>
 [ ] [ "d" get dispose ] unit-test
 
 ! Test error behavior
-: another-datagram "unix-domain-datagram-test-3" temp-file ;
+: another-datagram ( -- path ) "unix-domain-datagram-test-3" temp-file ;
 
 [ another-datagram delete-file ] ignore-errors
 
index e20580876e27578e027dd53b240a586d45bb8ff8..bf882fcfd02ac4def4eaa47bff8cb91677bcd6d4 100644 (file)
@@ -63,6 +63,6 @@ SYMBOL: euc-table
 
 PRIVATE>
 
-: EUC:
+SYNTAX: EUC:
     ! EUC: euc-kr "vocab:io/encodings/korean/cp949.txt"
-    CREATE-CLASS scan-object define-euc ; parsing
+    CREATE-CLASS scan-object define-euc ;
diff --git a/basis/io/encodings/iso2022/201.txt b/basis/io/encodings/iso2022/201.txt
new file mode 100644 (file)
index 0000000..5525a68
--- /dev/null
@@ -0,0 +1,208 @@
+#
+#      Name:             JIS X 0201 (1976) to Unicode 1.1 Table
+#      Unicode version:  1.1
+#      Table version:    0.9
+#      Table format:     Format A
+#      Date:             8 March 1994
+#
+#      Copyright (c) 1991-1994 Unicode, Inc.  All Rights reserved.
+#
+#      This file is provided as-is by Unicode, Inc. (The Unicode Consortium).
+#      No claims are made as to fitness for any particular purpose.  No
+#      warranties of any kind are expressed or implied.  The recipient
+#      agrees to determine applicability of information provided.  If this
+#      file has been provided on magnetic media by Unicode, Inc., the sole
+#      remedy for any claim will be exchange of defective media within 90
+#      days of receipt.
+#
+#      Recipient is granted the right to make copies in any form for
+#      internal distribution and to freely use the information supplied
+#      in the creation of products supporting Unicode.  Unicode, Inc.
+#      specifically excludes the right to re-distribute this file directly
+#      to third parties or other organizations whether for profit or not.
+#
+#      General notes:
+#
+#
+# This table contains one set of mappings from JIS X 0201 into Unicode.
+# Note that these data are *possible* mappings only and may not be the
+# same as those used by actual products, nor may they be the best suited
+# for all uses.  For more information on the mappings between various code
+# pages incorporating the repertoire of JIS X 0201 and Unicode, consult the
+# VENDORS mapping data.  Normative information on the mapping between
+# JIS X 0201 and Unicode may be found in the Unihan.txt file in the
+# latest Unicode Character Database.
+#
+# If you have carefully considered the fact that the mappings in
+# this table are only one possible set of mappings between JIS X 0201 and
+# Unicode and have no normative status, but still feel that you
+# have located an error in the table that requires fixing, you may
+# report any such error to errata@unicode.org.
+#
+#
+#      Format:  Three tab-separated columns
+#              Column #1 is the shift JIS code (in hex as 0xXX)
+#              Column #2 is the Unicode (in hex as 0xXXXX)
+#              Column #3 the Unicode (ISO 10646) name (follows a comment sign)
+#
+#      The entries are in JIS order
+#
+#
+0x20   0x0020  # SPACE
+0x21   0x0021  # EXCLAMATION MARK
+0x22   0x0022  # QUOTATION MARK
+0x23   0x0023  # NUMBER SIGN
+0x24   0x0024  # DOLLAR SIGN
+0x25   0x0025  # PERCENT SIGN
+0x26   0x0026  # AMPERSAND
+0x27   0x0027  # APOSTROPHE
+0x28   0x0028  # LEFT PARENTHESIS
+0x29   0x0029  # RIGHT PARENTHESIS
+0x2A   0x002A  # ASTERISK
+0x2B   0x002B  # PLUS SIGN
+0x2C   0x002C  # COMMA
+0x2D   0x002D  # HYPHEN-MINUS
+0x2E   0x002E  # FULL STOP
+0x2F   0x002F  # SOLIDUS
+0x30   0x0030  # DIGIT ZERO
+0x31   0x0031  # DIGIT ONE
+0x32   0x0032  # DIGIT TWO
+0x33   0x0033  # DIGIT THREE
+0x34   0x0034  # DIGIT FOUR
+0x35   0x0035  # DIGIT FIVE
+0x36   0x0036  # DIGIT SIX
+0x37   0x0037  # DIGIT SEVEN
+0x38   0x0038  # DIGIT EIGHT
+0x39   0x0039  # DIGIT NINE
+0x3A   0x003A  # COLON
+0x3B   0x003B  # SEMICOLON
+0x3C   0x003C  # LESS-THAN SIGN
+0x3D   0x003D  # EQUALS SIGN
+0x3E   0x003E  # GREATER-THAN SIGN
+0x3F   0x003F  # QUESTION MARK
+0x40   0x0040  # COMMERCIAL AT
+0x41   0x0041  # LATIN CAPITAL LETTER A
+0x42   0x0042  # LATIN CAPITAL LETTER B
+0x43   0x0043  # LATIN CAPITAL LETTER C
+0x44   0x0044  # LATIN CAPITAL LETTER D
+0x45   0x0045  # LATIN CAPITAL LETTER E
+0x46   0x0046  # LATIN CAPITAL LETTER F
+0x47   0x0047  # LATIN CAPITAL LETTER G
+0x48   0x0048  # LATIN CAPITAL LETTER H
+0x49   0x0049  # LATIN CAPITAL LETTER I
+0x4A   0x004A  # LATIN CAPITAL LETTER J
+0x4B   0x004B  # LATIN CAPITAL LETTER K
+0x4C   0x004C  # LATIN CAPITAL LETTER L
+0x4D   0x004D  # LATIN CAPITAL LETTER M
+0x4E   0x004E  # LATIN CAPITAL LETTER N
+0x4F   0x004F  # LATIN CAPITAL LETTER O
+0x50   0x0050  # LATIN CAPITAL LETTER P
+0x51   0x0051  # LATIN CAPITAL LETTER Q
+0x52   0x0052  # LATIN CAPITAL LETTER R
+0x53   0x0053  # LATIN CAPITAL LETTER S
+0x54   0x0054  # LATIN CAPITAL LETTER T
+0x55   0x0055  # LATIN CAPITAL LETTER U
+0x56   0x0056  # LATIN CAPITAL LETTER V
+0x57   0x0057  # LATIN CAPITAL LETTER W
+0x58   0x0058  # LATIN CAPITAL LETTER X
+0x59   0x0059  # LATIN CAPITAL LETTER Y
+0x5A   0x005A  # LATIN CAPITAL LETTER Z
+0x5B   0x005B  # LEFT SQUARE BRACKET
+0x5C   0x00A5  # YEN SIGN
+0x5D   0x005D  # RIGHT SQUARE BRACKET
+0x5E   0x005E  # CIRCUMFLEX ACCENT
+0x5F   0x005F  # LOW LINE
+0x60   0x0060  # GRAVE ACCENT
+0x61   0x0061  # LATIN SMALL LETTER A
+0x62   0x0062  # LATIN SMALL LETTER B
+0x63   0x0063  # LATIN SMALL LETTER C
+0x64   0x0064  # LATIN SMALL LETTER D
+0x65   0x0065  # LATIN SMALL LETTER E
+0x66   0x0066  # LATIN SMALL LETTER F
+0x67   0x0067  # LATIN SMALL LETTER G
+0x68   0x0068  # LATIN SMALL LETTER H
+0x69   0x0069  # LATIN SMALL LETTER I
+0x6A   0x006A  # LATIN SMALL LETTER J
+0x6B   0x006B  # LATIN SMALL LETTER K
+0x6C   0x006C  # LATIN SMALL LETTER L
+0x6D   0x006D  # LATIN SMALL LETTER M
+0x6E   0x006E  # LATIN SMALL LETTER N
+0x6F   0x006F  # LATIN SMALL LETTER O
+0x70   0x0070  # LATIN SMALL LETTER P
+0x71   0x0071  # LATIN SMALL LETTER Q
+0x72   0x0072  # LATIN SMALL LETTER R
+0x73   0x0073  # LATIN SMALL LETTER S
+0x74   0x0074  # LATIN SMALL LETTER T
+0x75   0x0075  # LATIN SMALL LETTER U
+0x76   0x0076  # LATIN SMALL LETTER V
+0x77   0x0077  # LATIN SMALL LETTER W
+0x78   0x0078  # LATIN SMALL LETTER X
+0x79   0x0079  # LATIN SMALL LETTER Y
+0x7A   0x007A  # LATIN SMALL LETTER Z
+0x7B   0x007B  # LEFT CURLY BRACKET
+0x7C   0x007C  # VERTICAL LINE
+0x7D   0x007D  # RIGHT CURLY BRACKET
+0x7E   0x203E  # OVERLINE
+0xA1   0xFF61  # HALFWIDTH IDEOGRAPHIC FULL STOP
+0xA2   0xFF62  # HALFWIDTH LEFT CORNER BRACKET
+0xA3   0xFF63  # HALFWIDTH RIGHT CORNER BRACKET
+0xA4   0xFF64  # HALFWIDTH IDEOGRAPHIC COMMA
+0xA5   0xFF65  # HALFWIDTH KATAKANA MIDDLE DOT
+0xA6   0xFF66  # HALFWIDTH KATAKANA LETTER WO
+0xA7   0xFF67  # HALFWIDTH KATAKANA LETTER SMALL A
+0xA8   0xFF68  # HALFWIDTH KATAKANA LETTER SMALL I
+0xA9   0xFF69  # HALFWIDTH KATAKANA LETTER SMALL U
+0xAA   0xFF6A  # HALFWIDTH KATAKANA LETTER SMALL E
+0xAB   0xFF6B  # HALFWIDTH KATAKANA LETTER SMALL O
+0xAC   0xFF6C  # HALFWIDTH KATAKANA LETTER SMALL YA
+0xAD   0xFF6D  # HALFWIDTH KATAKANA LETTER SMALL YU
+0xAE   0xFF6E  # HALFWIDTH KATAKANA LETTER SMALL YO
+0xAF   0xFF6F  # HALFWIDTH KATAKANA LETTER SMALL TU
+0xB0   0xFF70  # HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK
+0xB1   0xFF71  # HALFWIDTH KATAKANA LETTER A
+0xB2   0xFF72  # HALFWIDTH KATAKANA LETTER I
+0xB3   0xFF73  # HALFWIDTH KATAKANA LETTER U
+0xB4   0xFF74  # HALFWIDTH KATAKANA LETTER E
+0xB5   0xFF75  # HALFWIDTH KATAKANA LETTER O
+0xB6   0xFF76  # HALFWIDTH KATAKANA LETTER KA
+0xB7   0xFF77  # HALFWIDTH KATAKANA LETTER KI
+0xB8   0xFF78  # HALFWIDTH KATAKANA LETTER KU
+0xB9   0xFF79  # HALFWIDTH KATAKANA LETTER KE
+0xBA   0xFF7A  # HALFWIDTH KATAKANA LETTER KO
+0xBB   0xFF7B  # HALFWIDTH KATAKANA LETTER SA
+0xBC   0xFF7C  # HALFWIDTH KATAKANA LETTER SI
+0xBD   0xFF7D  # HALFWIDTH KATAKANA LETTER SU
+0xBE   0xFF7E  # HALFWIDTH KATAKANA LETTER SE
+0xBF   0xFF7F  # HALFWIDTH KATAKANA LETTER SO
+0xC0   0xFF80  # HALFWIDTH KATAKANA LETTER TA
+0xC1   0xFF81  # HALFWIDTH KATAKANA LETTER TI
+0xC2   0xFF82  # HALFWIDTH KATAKANA LETTER TU
+0xC3   0xFF83  # HALFWIDTH KATAKANA LETTER TE
+0xC4   0xFF84  # HALFWIDTH KATAKANA LETTER TO
+0xC5   0xFF85  # HALFWIDTH KATAKANA LETTER NA
+0xC6   0xFF86  # HALFWIDTH KATAKANA LETTER NI
+0xC7   0xFF87  # HALFWIDTH KATAKANA LETTER NU
+0xC8   0xFF88  # HALFWIDTH KATAKANA LETTER NE
+0xC9   0xFF89  # HALFWIDTH KATAKANA LETTER NO
+0xCA   0xFF8A  # HALFWIDTH KATAKANA LETTER HA
+0xCB   0xFF8B  # HALFWIDTH KATAKANA LETTER HI
+0xCC   0xFF8C  # HALFWIDTH KATAKANA LETTER HU
+0xCD   0xFF8D  # HALFWIDTH KATAKANA LETTER HE
+0xCE   0xFF8E  # HALFWIDTH KATAKANA LETTER HO
+0xCF   0xFF8F  # HALFWIDTH KATAKANA LETTER MA
+0xD0   0xFF90  # HALFWIDTH KATAKANA LETTER MI
+0xD1   0xFF91  # HALFWIDTH KATAKANA LETTER MU
+0xD2   0xFF92  # HALFWIDTH KATAKANA LETTER ME
+0xD3   0xFF93  # HALFWIDTH KATAKANA LETTER MO
+0xD4   0xFF94  # HALFWIDTH KATAKANA LETTER YA
+0xD5   0xFF95  # HALFWIDTH KATAKANA LETTER YU
+0xD6   0xFF96  # HALFWIDTH KATAKANA LETTER YO
+0xD7   0xFF97  # HALFWIDTH KATAKANA LETTER RA
+0xD8   0xFF98  # HALFWIDTH KATAKANA LETTER RI
+0xD9   0xFF99  # HALFWIDTH KATAKANA LETTER RU
+0xDA   0xFF9A  # HALFWIDTH KATAKANA LETTER RE
+0xDB   0xFF9B  # HALFWIDTH KATAKANA LETTER RO
+0xDC   0xFF9C  # HALFWIDTH KATAKANA LETTER WA
+0xDD   0xFF9D  # HALFWIDTH KATAKANA LETTER N
+0xDE   0xFF9E  # HALFWIDTH KATAKANA VOICED SOUND MARK
+0xDF   0xFF9F  # HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK
diff --git a/basis/io/encodings/iso2022/208.txt b/basis/io/encodings/iso2022/208.txt
new file mode 100644 (file)
index 0000000..61e780f
--- /dev/null
@@ -0,0 +1,6953 @@
+#
+#      Name:             JIS X 0208 (1990) to Unicode
+#      Unicode version:  1.1
+#      Table version:    0.9
+#      Table format:     Format A
+#      Date:             8 March 1994
+#
+#      Copyright (c) 1991-1994 Unicode, Inc.  All Rights reserved.
+#
+#      This file is provided as-is by Unicode, Inc. (The Unicode Consortium).
+#      No claims are made as to fitness for any particular purpose.  No
+#      warranties of any kind are expressed or implied.  The recipient
+#      agrees to determine applicability of information provided.  If this
+#      file has been provided on magnetic media by Unicode, Inc., the sole
+#      remedy for any claim will be exchange of defective media within 90
+#      days of receipt.
+#
+#      Recipient is granted the right to make copies in any form for
+#      internal distribution and to freely use the information supplied
+#      in the creation of products supporting Unicode.  Unicode, Inc.
+#      specifically excludes the right to re-distribute this file directly
+#      to third parties or other organizations whether for profit or not.
+#
+#      General notes:
+#
+#
+# This table contains one set of mappings from JIS X 0208 (1990) into Unicode.
+# Note that these data are *possible* mappings only and may not be the
+# same as those used by actual products, nor may they be the best suited
+# for all uses.  For more information on the mappings between various code
+# pages incorporating the repertoire of JIS X 0208 (1990) and Unicode, consult the
+# VENDORS mapping data.  Normative information on the mapping between
+# JIS X 0208 (1990) and Unicode may be found in the Unihan.txt file in the
+# latest Unicode Character Database.
+#
+# If you have carefully considered the fact that the mappings in
+# this table are only one possible set of mappings between JIS X 0208 (1990)
+# and Unicode and have no normative status, but still feel that you
+# have located an error in the table that requires fixing, you may
+# report any such error to errata@unicode.org.
+#
+#
+#      Format:  Four tab-separated columns
+#               Column #1 is the shift-JIS code (in hex)
+#                  --> OMITTED!
+#               Column #2 is the JIS X 0208 code (in hex as 0xXXXX)
+#               Column #3 is the Unicode (in hex as 0xXXXX)
+#               Column #4 the Unicode name (follows a comment sign, '#')
+#                      The official names for Unicode characters U+4E00
+#                      to U+9FA5, inclusive, is "CJK UNIFIED IDEOGRAPH-XXXX",
+#                      where XXXX is the code point.  Including all these
+#                      names in this file increases its size substantially
+#                      and needlessly.  The token "<CJK>" is used for the
+#                      name of these characters.  If necessary, it can be
+#                      expanded algorithmically by a parser or editor.
+#
+#      The entries are in JIS X 0208 order
+#
+#      The following algorithms can be used to change the hex form
+#              of JIS 0208 to other standard forms:
+#
+#              To change hex to EUC form, add 0x8080
+#              To change hex to kuten form, first subtract 0x2020.  Then
+#                      the high and low bytes correspond to the ku and ten of
+#                      the kuten form.  For example, 0x2121 -> 0x0101 -> 0101;
+#                      0x7426 -> 0x5406 -> 8406
+#
+#   The kanji mappings are a normative part of ISO/IEC 10646.  The
+#       non-kanji mappings are provisional, pending definition of
+#       official mappings by Japanese standards bodies
+#
+#      Any comments or problems, contact <John_Jenkins@taligent.com>
+#
+#
+0x2121 0x3000  # IDEOGRAPHIC SPACE
+0x2122 0x3001  # IDEOGRAPHIC COMMA
+0x2123 0x3002  # IDEOGRAPHIC FULL STOP
+0x2124 0xFF0C  # FULLWIDTH COMMA
+0x2125 0xFF0E  # FULLWIDTH FULL STOP
+0x2126 0x30FB  # KATAKANA MIDDLE DOT
+0x2127 0xFF1A  # FULLWIDTH COLON
+0x2128 0xFF1B  # FULLWIDTH SEMICOLON
+0x2129 0xFF1F  # FULLWIDTH QUESTION MARK
+0x212A 0xFF01  # FULLWIDTH EXCLAMATION MARK
+0x212B 0x309B  # KATAKANA-HIRAGANA VOICED SOUND MARK
+0x212C 0x309C  # KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+0x212D 0x00B4  # ACUTE ACCENT
+0x212E 0xFF40  # FULLWIDTH GRAVE ACCENT
+0x212F 0x00A8  # DIAERESIS
+0x2130 0xFF3E  # FULLWIDTH CIRCUMFLEX ACCENT
+0x2131 0xFFE3  # FULLWIDTH MACRON
+0x2132 0xFF3F  # FULLWIDTH LOW LINE
+0x2133 0x30FD  # KATAKANA ITERATION MARK
+0x2134 0x30FE  # KATAKANA VOICED ITERATION MARK
+0x2135 0x309D  # HIRAGANA ITERATION MARK
+0x2136 0x309E  # HIRAGANA VOICED ITERATION MARK
+0x2137 0x3003  # DITTO MARK
+0x2138 0x4EDD  # <CJK>
+0x2139 0x3005  # IDEOGRAPHIC ITERATION MARK
+0x213A 0x3006  # IDEOGRAPHIC CLOSING MARK
+0x213B 0x3007  # IDEOGRAPHIC NUMBER ZERO
+0x213C 0x30FC  # KATAKANA-HIRAGANA PROLONGED SOUND MARK
+0x213D 0x2015  # HORIZONTAL BAR
+0x213E 0x2010  # HYPHEN
+0x213F 0xFF0F  # FULLWIDTH SOLIDUS
+0x2140 0x005C  # REVERSE SOLIDUS
+0x2141 0x301C  # WAVE DASH
+0x2142 0x2016  # DOUBLE VERTICAL LINE
+0x2143 0xFF5C  # FULLWIDTH VERTICAL LINE
+0x2144 0x2026  # HORIZONTAL ELLIPSIS
+0x2145 0x2025  # TWO DOT LEADER
+0x2146 0x2018  # LEFT SINGLE QUOTATION MARK
+0x2147 0x2019  # RIGHT SINGLE QUOTATION MARK
+0x2148 0x201C  # LEFT DOUBLE QUOTATION MARK
+0x2149 0x201D  # RIGHT DOUBLE QUOTATION MARK
+0x214A 0xFF08  # FULLWIDTH LEFT PARENTHESIS
+0x214B 0xFF09  # FULLWIDTH RIGHT PARENTHESIS
+0x214C 0x3014  # LEFT TORTOISE SHELL BRACKET
+0x214D 0x3015  # RIGHT TORTOISE SHELL BRACKET
+0x214E 0xFF3B  # FULLWIDTH LEFT SQUARE BRACKET
+0x214F 0xFF3D  # FULLWIDTH RIGHT SQUARE BRACKET
+0x2150 0xFF5B  # FULLWIDTH LEFT CURLY BRACKET
+0x2151 0xFF5D  # FULLWIDTH RIGHT CURLY BRACKET
+0x2152 0x3008  # LEFT ANGLE BRACKET
+0x2153 0x3009  # RIGHT ANGLE BRACKET
+0x2154 0x300A  # LEFT DOUBLE ANGLE BRACKET
+0x2155 0x300B  # RIGHT DOUBLE ANGLE BRACKET
+0x2156 0x300C  # LEFT CORNER BRACKET
+0x2157 0x300D  # RIGHT CORNER BRACKET
+0x2158 0x300E  # LEFT WHITE CORNER BRACKET
+0x2159 0x300F  # RIGHT WHITE CORNER BRACKET
+0x215A 0x3010  # LEFT BLACK LENTICULAR BRACKET
+0x215B 0x3011  # RIGHT BLACK LENTICULAR BRACKET
+0x215C 0xFF0B  # FULLWIDTH PLUS SIGN
+0x215D 0x2212  # MINUS SIGN
+0x215E 0x00B1  # PLUS-MINUS SIGN
+0x215F 0x00D7  # MULTIPLICATION SIGN
+0x2160 0x00F7  # DIVISION SIGN
+0x2161 0xFF1D  # FULLWIDTH EQUALS SIGN
+0x2162 0x2260  # NOT EQUAL TO
+0x2163 0xFF1C  # FULLWIDTH LESS-THAN SIGN
+0x2164 0xFF1E  # FULLWIDTH GREATER-THAN SIGN
+0x2165 0x2266  # LESS-THAN OVER EQUAL TO
+0x2166 0x2267  # GREATER-THAN OVER EQUAL TO
+0x2167 0x221E  # INFINITY
+0x2168 0x2234  # THEREFORE
+0x2169 0x2642  # MALE SIGN
+0x216A 0x2640  # FEMALE SIGN
+0x216B 0x00B0  # DEGREE SIGN
+0x216C 0x2032  # PRIME
+0x216D 0x2033  # DOUBLE PRIME
+0x216E 0x2103  # DEGREE CELSIUS
+0x216F 0xFFE5  # FULLWIDTH YEN SIGN
+0x2170 0xFF04  # FULLWIDTH DOLLAR SIGN
+0x2171 0x00A2  # CENT SIGN
+0x2172 0x00A3  # POUND SIGN
+0x2173 0xFF05  # FULLWIDTH PERCENT SIGN
+0x2174 0xFF03  # FULLWIDTH NUMBER SIGN
+0x2175 0xFF06  # FULLWIDTH AMPERSAND
+0x2176 0xFF0A  # FULLWIDTH ASTERISK
+0x2177 0xFF20  # FULLWIDTH COMMERCIAL AT
+0x2178 0x00A7  # SECTION SIGN
+0x2179 0x2606  # WHITE STAR
+0x217A 0x2605  # BLACK STAR
+0x217B 0x25CB  # WHITE CIRCLE
+0x217C 0x25CF  # BLACK CIRCLE
+0x217D 0x25CE  # BULLSEYE
+0x217E 0x25C7  # WHITE DIAMOND
+0x2221 0x25C6  # BLACK DIAMOND
+0x2222 0x25A1  # WHITE SQUARE
+0x2223 0x25A0  # BLACK SQUARE
+0x2224 0x25B3  # WHITE UP-POINTING TRIANGLE
+0x2225 0x25B2  # BLACK UP-POINTING TRIANGLE
+0x2226 0x25BD  # WHITE DOWN-POINTING TRIANGLE
+0x2227 0x25BC  # BLACK DOWN-POINTING TRIANGLE
+0x2228 0x203B  # REFERENCE MARK
+0x2229 0x3012  # POSTAL MARK
+0x222A 0x2192  # RIGHTWARDS ARROW
+0x222B 0x2190  # LEFTWARDS ARROW
+0x222C 0x2191  # UPWARDS ARROW
+0x222D 0x2193  # DOWNWARDS ARROW
+0x222E 0x3013  # GETA MARK
+0x223A 0x2208  # ELEMENT OF
+0x223B 0x220B  # CONTAINS AS MEMBER
+0x223C 0x2286  # SUBSET OF OR EQUAL TO
+0x223D 0x2287  # SUPERSET OF OR EQUAL TO
+0x223E 0x2282  # SUBSET OF
+0x223F 0x2283  # SUPERSET OF
+0x2240 0x222A  # UNION
+0x2241 0x2229  # INTERSECTION
+0x224A 0x2227  # LOGICAL AND
+0x224B 0x2228  # LOGICAL OR
+0x224C 0x00AC  # NOT SIGN
+0x224D 0x21D2  # RIGHTWARDS DOUBLE ARROW
+0x224E 0x21D4  # LEFT RIGHT DOUBLE ARROW
+0x224F 0x2200  # FOR ALL
+0x2250 0x2203  # THERE EXISTS
+0x225C 0x2220  # ANGLE
+0x225D 0x22A5  # UP TACK
+0x225E 0x2312  # ARC
+0x225F 0x2202  # PARTIAL DIFFERENTIAL
+0x2260 0x2207  # NABLA
+0x2261 0x2261  # IDENTICAL TO
+0x2262 0x2252  # APPROXIMATELY EQUAL TO OR THE IMAGE OF
+0x2263 0x226A  # MUCH LESS-THAN
+0x2264 0x226B  # MUCH GREATER-THAN
+0x2265 0x221A  # SQUARE ROOT
+0x2266 0x223D  # REVERSED TILDE
+0x2267 0x221D  # PROPORTIONAL TO
+0x2268 0x2235  # BECAUSE
+0x2269 0x222B  # INTEGRAL
+0x226A 0x222C  # DOUBLE INTEGRAL
+0x2272 0x212B  # ANGSTROM SIGN
+0x2273 0x2030  # PER MILLE SIGN
+0x2274 0x266F  # MUSIC SHARP SIGN
+0x2275 0x266D  # MUSIC FLAT SIGN
+0x2276 0x266A  # EIGHTH NOTE
+0x2277 0x2020  # DAGGER
+0x2278 0x2021  # DOUBLE DAGGER
+0x2279 0x00B6  # PILCROW SIGN
+0x227E 0x25EF  # LARGE CIRCLE
+0x2330 0xFF10  # FULLWIDTH DIGIT ZERO
+0x2331 0xFF11  # FULLWIDTH DIGIT ONE
+0x2332 0xFF12  # FULLWIDTH DIGIT TWO
+0x2333 0xFF13  # FULLWIDTH DIGIT THREE
+0x2334 0xFF14  # FULLWIDTH DIGIT FOUR
+0x2335 0xFF15  # FULLWIDTH DIGIT FIVE
+0x2336 0xFF16  # FULLWIDTH DIGIT SIX
+0x2337 0xFF17  # FULLWIDTH DIGIT SEVEN
+0x2338 0xFF18  # FULLWIDTH DIGIT EIGHT
+0x2339 0xFF19  # FULLWIDTH DIGIT NINE
+0x2341 0xFF21  # FULLWIDTH LATIN CAPITAL LETTER A
+0x2342 0xFF22  # FULLWIDTH LATIN CAPITAL LETTER B
+0x2343 0xFF23  # FULLWIDTH LATIN CAPITAL LETTER C
+0x2344 0xFF24  # FULLWIDTH LATIN CAPITAL LETTER D
+0x2345 0xFF25  # FULLWIDTH LATIN CAPITAL LETTER E
+0x2346 0xFF26  # FULLWIDTH LATIN CAPITAL LETTER F
+0x2347 0xFF27  # FULLWIDTH LATIN CAPITAL LETTER G
+0x2348 0xFF28  # FULLWIDTH LATIN CAPITAL LETTER H
+0x2349 0xFF29  # FULLWIDTH LATIN CAPITAL LETTER I
+0x234A 0xFF2A  # FULLWIDTH LATIN CAPITAL LETTER J
+0x234B 0xFF2B  # FULLWIDTH LATIN CAPITAL LETTER K
+0x234C 0xFF2C  # FULLWIDTH LATIN CAPITAL LETTER L
+0x234D 0xFF2D  # FULLWIDTH LATIN CAPITAL LETTER M
+0x234E 0xFF2E  # FULLWIDTH LATIN CAPITAL LETTER N
+0x234F 0xFF2F  # FULLWIDTH LATIN CAPITAL LETTER O
+0x2350 0xFF30  # FULLWIDTH LATIN CAPITAL LETTER P
+0x2351 0xFF31  # FULLWIDTH LATIN CAPITAL LETTER Q
+0x2352 0xFF32  # FULLWIDTH LATIN CAPITAL LETTER R
+0x2353 0xFF33  # FULLWIDTH LATIN CAPITAL LETTER S
+0x2354 0xFF34  # FULLWIDTH LATIN CAPITAL LETTER T
+0x2355 0xFF35  # FULLWIDTH LATIN CAPITAL LETTER U
+0x2356 0xFF36  # FULLWIDTH LATIN CAPITAL LETTER V
+0x2357 0xFF37  # FULLWIDTH LATIN CAPITAL LETTER W
+0x2358 0xFF38  # FULLWIDTH LATIN CAPITAL LETTER X
+0x2359 0xFF39  # FULLWIDTH LATIN CAPITAL LETTER Y
+0x235A 0xFF3A  # FULLWIDTH LATIN CAPITAL LETTER Z
+0x2361 0xFF41  # FULLWIDTH LATIN SMALL LETTER A
+0x2362 0xFF42  # FULLWIDTH LATIN SMALL LETTER B
+0x2363 0xFF43  # FULLWIDTH LATIN SMALL LETTER C
+0x2364 0xFF44  # FULLWIDTH LATIN SMALL LETTER D
+0x2365 0xFF45  # FULLWIDTH LATIN SMALL LETTER E
+0x2366 0xFF46  # FULLWIDTH LATIN SMALL LETTER F
+0x2367 0xFF47  # FULLWIDTH LATIN SMALL LETTER G
+0x2368 0xFF48  # FULLWIDTH LATIN SMALL LETTER H
+0x2369 0xFF49  # FULLWIDTH LATIN SMALL LETTER I
+0x236A 0xFF4A  # FULLWIDTH LATIN SMALL LETTER J
+0x236B 0xFF4B  # FULLWIDTH LATIN SMALL LETTER K
+0x236C 0xFF4C  # FULLWIDTH LATIN SMALL LETTER L
+0x236D 0xFF4D  # FULLWIDTH LATIN SMALL LETTER M
+0x236E 0xFF4E  # FULLWIDTH LATIN SMALL LETTER N
+0x236F 0xFF4F  # FULLWIDTH LATIN SMALL LETTER O
+0x2370 0xFF50  # FULLWIDTH LATIN SMALL LETTER P
+0x2371 0xFF51  # FULLWIDTH LATIN SMALL LETTER Q
+0x2372 0xFF52  # FULLWIDTH LATIN SMALL LETTER R
+0x2373 0xFF53  # FULLWIDTH LATIN SMALL LETTER S
+0x2374 0xFF54  # FULLWIDTH LATIN SMALL LETTER T
+0x2375 0xFF55  # FULLWIDTH LATIN SMALL LETTER U
+0x2376 0xFF56  # FULLWIDTH LATIN SMALL LETTER V
+0x2377 0xFF57  # FULLWIDTH LATIN SMALL LETTER W
+0x2378 0xFF58  # FULLWIDTH LATIN SMALL LETTER X
+0x2379 0xFF59  # FULLWIDTH LATIN SMALL LETTER Y
+0x237A 0xFF5A  # FULLWIDTH LATIN SMALL LETTER Z
+0x2421 0x3041  # HIRAGANA LETTER SMALL A
+0x2422 0x3042  # HIRAGANA LETTER A
+0x2423 0x3043  # HIRAGANA LETTER SMALL I
+0x2424 0x3044  # HIRAGANA LETTER I
+0x2425 0x3045  # HIRAGANA LETTER SMALL U
+0x2426 0x3046  # HIRAGANA LETTER U
+0x2427 0x3047  # HIRAGANA LETTER SMALL E
+0x2428 0x3048  # HIRAGANA LETTER E
+0x2429 0x3049  # HIRAGANA LETTER SMALL O
+0x242A 0x304A  # HIRAGANA LETTER O
+0x242B 0x304B  # HIRAGANA LETTER KA
+0x242C 0x304C  # HIRAGANA LETTER GA
+0x242D 0x304D  # HIRAGANA LETTER KI
+0x242E 0x304E  # HIRAGANA LETTER GI
+0x242F 0x304F  # HIRAGANA LETTER KU
+0x2430 0x3050  # HIRAGANA LETTER GU
+0x2431 0x3051  # HIRAGANA LETTER KE
+0x2432 0x3052  # HIRAGANA LETTER GE
+0x2433 0x3053  # HIRAGANA LETTER KO
+0x2434 0x3054  # HIRAGANA LETTER GO
+0x2435 0x3055  # HIRAGANA LETTER SA
+0x2436 0x3056  # HIRAGANA LETTER ZA
+0x2437 0x3057  # HIRAGANA LETTER SI
+0x2438 0x3058  # HIRAGANA LETTER ZI
+0x2439 0x3059  # HIRAGANA LETTER SU
+0x243A 0x305A  # HIRAGANA LETTER ZU
+0x243B 0x305B  # HIRAGANA LETTER SE
+0x243C 0x305C  # HIRAGANA LETTER ZE
+0x243D 0x305D  # HIRAGANA LETTER SO
+0x243E 0x305E  # HIRAGANA LETTER ZO
+0x243F 0x305F  # HIRAGANA LETTER TA
+0x2440 0x3060  # HIRAGANA LETTER DA
+0x2441 0x3061  # HIRAGANA LETTER TI
+0x2442 0x3062  # HIRAGANA LETTER DI
+0x2443 0x3063  # HIRAGANA LETTER SMALL TU
+0x2444 0x3064  # HIRAGANA LETTER TU
+0x2445 0x3065  # HIRAGANA LETTER DU
+0x2446 0x3066  # HIRAGANA LETTER TE
+0x2447 0x3067  # HIRAGANA LETTER DE
+0x2448 0x3068  # HIRAGANA LETTER TO
+0x2449 0x3069  # HIRAGANA LETTER DO
+0x244A 0x306A  # HIRAGANA LETTER NA
+0x244B 0x306B  # HIRAGANA LETTER NI
+0x244C 0x306C  # HIRAGANA LETTER NU
+0x244D 0x306D  # HIRAGANA LETTER NE
+0x244E 0x306E  # HIRAGANA LETTER NO
+0x244F 0x306F  # HIRAGANA LETTER HA
+0x2450 0x3070  # HIRAGANA LETTER BA
+0x2451 0x3071  # HIRAGANA LETTER PA
+0x2452 0x3072  # HIRAGANA LETTER HI
+0x2453 0x3073  # HIRAGANA LETTER BI
+0x2454 0x3074  # HIRAGANA LETTER PI
+0x2455 0x3075  # HIRAGANA LETTER HU
+0x2456 0x3076  # HIRAGANA LETTER BU
+0x2457 0x3077  # HIRAGANA LETTER PU
+0x2458 0x3078  # HIRAGANA LETTER HE
+0x2459 0x3079  # HIRAGANA LETTER BE
+0x245A 0x307A  # HIRAGANA LETTER PE
+0x245B 0x307B  # HIRAGANA LETTER HO
+0x245C 0x307C  # HIRAGANA LETTER BO
+0x245D 0x307D  # HIRAGANA LETTER PO
+0x245E 0x307E  # HIRAGANA LETTER MA
+0x245F 0x307F  # HIRAGANA LETTER MI
+0x2460 0x3080  # HIRAGANA LETTER MU
+0x2461 0x3081  # HIRAGANA LETTER ME
+0x2462 0x3082  # HIRAGANA LETTER MO
+0x2463 0x3083  # HIRAGANA LETTER SMALL YA
+0x2464 0x3084  # HIRAGANA LETTER YA
+0x2465 0x3085  # HIRAGANA LETTER SMALL YU
+0x2466 0x3086  # HIRAGANA LETTER YU
+0x2467 0x3087  # HIRAGANA LETTER SMALL YO
+0x2468 0x3088  # HIRAGANA LETTER YO
+0x2469 0x3089  # HIRAGANA LETTER RA
+0x246A 0x308A  # HIRAGANA LETTER RI
+0x246B 0x308B  # HIRAGANA LETTER RU
+0x246C 0x308C  # HIRAGANA LETTER RE
+0x246D 0x308D  # HIRAGANA LETTER RO
+0x246E 0x308E  # HIRAGANA LETTER SMALL WA
+0x246F 0x308F  # HIRAGANA LETTER WA
+0x2470 0x3090  # HIRAGANA LETTER WI
+0x2471 0x3091  # HIRAGANA LETTER WE
+0x2472 0x3092  # HIRAGANA LETTER WO
+0x2473 0x3093  # HIRAGANA LETTER N
+0x2521 0x30A1  # KATAKANA LETTER SMALL A
+0x2522 0x30A2  # KATAKANA LETTER A
+0x2523 0x30A3  # KATAKANA LETTER SMALL I
+0x2524 0x30A4  # KATAKANA LETTER I
+0x2525 0x30A5  # KATAKANA LETTER SMALL U
+0x2526 0x30A6  # KATAKANA LETTER U
+0x2527 0x30A7  # KATAKANA LETTER SMALL E
+0x2528 0x30A8  # KATAKANA LETTER E
+0x2529 0x30A9  # KATAKANA LETTER SMALL O
+0x252A 0x30AA  # KATAKANA LETTER O
+0x252B 0x30AB  # KATAKANA LETTER KA
+0x252C 0x30AC  # KATAKANA LETTER GA
+0x252D 0x30AD  # KATAKANA LETTER KI
+0x252E 0x30AE  # KATAKANA LETTER GI
+0x252F 0x30AF  # KATAKANA LETTER KU
+0x2530 0x30B0  # KATAKANA LETTER GU
+0x2531 0x30B1  # KATAKANA LETTER KE
+0x2532 0x30B2  # KATAKANA LETTER GE
+0x2533 0x30B3  # KATAKANA LETTER KO
+0x2534 0x30B4  # KATAKANA LETTER GO
+0x2535 0x30B5  # KATAKANA LETTER SA
+0x2536 0x30B6  # KATAKANA LETTER ZA
+0x2537 0x30B7  # KATAKANA LETTER SI
+0x2538 0x30B8  # KATAKANA LETTER ZI
+0x2539 0x30B9  # KATAKANA LETTER SU
+0x253A 0x30BA  # KATAKANA LETTER ZU
+0x253B 0x30BB  # KATAKANA LETTER SE
+0x253C 0x30BC  # KATAKANA LETTER ZE
+0x253D 0x30BD  # KATAKANA LETTER SO
+0x253E 0x30BE  # KATAKANA LETTER ZO
+0x253F 0x30BF  # KATAKANA LETTER TA
+0x2540 0x30C0  # KATAKANA LETTER DA
+0x2541 0x30C1  # KATAKANA LETTER TI
+0x2542 0x30C2  # KATAKANA LETTER DI
+0x2543 0x30C3  # KATAKANA LETTER SMALL TU
+0x2544 0x30C4  # KATAKANA LETTER TU
+0x2545 0x30C5  # KATAKANA LETTER DU
+0x2546 0x30C6  # KATAKANA LETTER TE
+0x2547 0x30C7  # KATAKANA LETTER DE
+0x2548 0x30C8  # KATAKANA LETTER TO
+0x2549 0x30C9  # KATAKANA LETTER DO
+0x254A 0x30CA  # KATAKANA LETTER NA
+0x254B 0x30CB  # KATAKANA LETTER NI
+0x254C 0x30CC  # KATAKANA LETTER NU
+0x254D 0x30CD  # KATAKANA LETTER NE
+0x254E 0x30CE  # KATAKANA LETTER NO
+0x254F 0x30CF  # KATAKANA LETTER HA
+0x2550 0x30D0  # KATAKANA LETTER BA
+0x2551 0x30D1  # KATAKANA LETTER PA
+0x2552 0x30D2  # KATAKANA LETTER HI
+0x2553 0x30D3  # KATAKANA LETTER BI
+0x2554 0x30D4  # KATAKANA LETTER PI
+0x2555 0x30D5  # KATAKANA LETTER HU
+0x2556 0x30D6  # KATAKANA LETTER BU
+0x2557 0x30D7  # KATAKANA LETTER PU
+0x2558 0x30D8  # KATAKANA LETTER HE
+0x2559 0x30D9  # KATAKANA LETTER BE
+0x255A 0x30DA  # KATAKANA LETTER PE
+0x255B 0x30DB  # KATAKANA LETTER HO
+0x255C 0x30DC  # KATAKANA LETTER BO
+0x255D 0x30DD  # KATAKANA LETTER PO
+0x255E 0x30DE  # KATAKANA LETTER MA
+0x255F 0x30DF  # KATAKANA LETTER MI
+0x2560 0x30E0  # KATAKANA LETTER MU
+0x2561 0x30E1  # KATAKANA LETTER ME
+0x2562 0x30E2  # KATAKANA LETTER MO
+0x2563 0x30E3  # KATAKANA LETTER SMALL YA
+0x2564 0x30E4  # KATAKANA LETTER YA
+0x2565 0x30E5  # KATAKANA LETTER SMALL YU
+0x2566 0x30E6  # KATAKANA LETTER YU
+0x2567 0x30E7  # KATAKANA LETTER SMALL YO
+0x2568 0x30E8  # KATAKANA LETTER YO
+0x2569 0x30E9  # KATAKANA LETTER RA
+0x256A 0x30EA  # KATAKANA LETTER RI
+0x256B 0x30EB  # KATAKANA LETTER RU
+0x256C 0x30EC  # KATAKANA LETTER RE
+0x256D 0x30ED  # KATAKANA LETTER RO
+0x256E 0x30EE  # KATAKANA LETTER SMALL WA
+0x256F 0x30EF  # KATAKANA LETTER WA
+0x2570 0x30F0  # KATAKANA LETTER WI
+0x2571 0x30F1  # KATAKANA LETTER WE
+0x2572 0x30F2  # KATAKANA LETTER WO
+0x2573 0x30F3  # KATAKANA LETTER N
+0x2574 0x30F4  # KATAKANA LETTER VU
+0x2575 0x30F5  # KATAKANA LETTER SMALL KA
+0x2576 0x30F6  # KATAKANA LETTER SMALL KE
+0x2621 0x0391  # GREEK CAPITAL LETTER ALPHA
+0x2622 0x0392  # GREEK CAPITAL LETTER BETA
+0x2623 0x0393  # GREEK CAPITAL LETTER GAMMA
+0x2624 0x0394  # GREEK CAPITAL LETTER DELTA
+0x2625 0x0395  # GREEK CAPITAL LETTER EPSILON
+0x2626 0x0396  # GREEK CAPITAL LETTER ZETA
+0x2627 0x0397  # GREEK CAPITAL LETTER ETA
+0x2628 0x0398  # GREEK CAPITAL LETTER THETA
+0x2629 0x0399  # GREEK CAPITAL LETTER IOTA
+0x262A 0x039A  # GREEK CAPITAL LETTER KAPPA
+0x262B 0x039B  # GREEK CAPITAL LETTER LAMDA
+0x262C 0x039C  # GREEK CAPITAL LETTER MU
+0x262D 0x039D  # GREEK CAPITAL LETTER NU
+0x262E 0x039E  # GREEK CAPITAL LETTER XI
+0x262F 0x039F  # GREEK CAPITAL LETTER OMICRON
+0x2630 0x03A0  # GREEK CAPITAL LETTER PI
+0x2631 0x03A1  # GREEK CAPITAL LETTER RHO
+0x2632 0x03A3  # GREEK CAPITAL LETTER SIGMA
+0x2633 0x03A4  # GREEK CAPITAL LETTER TAU
+0x2634 0x03A5  # GREEK CAPITAL LETTER UPSILON
+0x2635 0x03A6  # GREEK CAPITAL LETTER PHI
+0x2636 0x03A7  # GREEK CAPITAL LETTER CHI
+0x2637 0x03A8  # GREEK CAPITAL LETTER PSI
+0x2638 0x03A9  # GREEK CAPITAL LETTER OMEGA
+0x2641 0x03B1  # GREEK SMALL LETTER ALPHA
+0x2642 0x03B2  # GREEK SMALL LETTER BETA
+0x2643 0x03B3  # GREEK SMALL LETTER GAMMA
+0x2644 0x03B4  # GREEK SMALL LETTER DELTA
+0x2645 0x03B5  # GREEK SMALL LETTER EPSILON
+0x2646 0x03B6  # GREEK SMALL LETTER ZETA
+0x2647 0x03B7  # GREEK SMALL LETTER ETA
+0x2648 0x03B8  # GREEK SMALL LETTER THETA
+0x2649 0x03B9  # GREEK SMALL LETTER IOTA
+0x264A 0x03BA  # GREEK SMALL LETTER KAPPA
+0x264B 0x03BB  # GREEK SMALL LETTER LAMDA
+0x264C 0x03BC  # GREEK SMALL LETTER MU
+0x264D 0x03BD  # GREEK SMALL LETTER NU
+0x264E 0x03BE  # GREEK SMALL LETTER XI
+0x264F 0x03BF  # GREEK SMALL LETTER OMICRON
+0x2650 0x03C0  # GREEK SMALL LETTER PI
+0x2651 0x03C1  # GREEK SMALL LETTER RHO
+0x2652 0x03C3  # GREEK SMALL LETTER SIGMA
+0x2653 0x03C4  # GREEK SMALL LETTER TAU
+0x2654 0x03C5  # GREEK SMALL LETTER UPSILON
+0x2655 0x03C6  # GREEK SMALL LETTER PHI
+0x2656 0x03C7  # GREEK SMALL LETTER CHI
+0x2657 0x03C8  # GREEK SMALL LETTER PSI
+0x2658 0x03C9  # GREEK SMALL LETTER OMEGA
+0x2721 0x0410  # CYRILLIC CAPITAL LETTER A
+0x2722 0x0411  # CYRILLIC CAPITAL LETTER BE
+0x2723 0x0412  # CYRILLIC CAPITAL LETTER VE
+0x2724 0x0413  # CYRILLIC CAPITAL LETTER GHE
+0x2725 0x0414  # CYRILLIC CAPITAL LETTER DE
+0x2726 0x0415  # CYRILLIC CAPITAL LETTER IE
+0x2727 0x0401  # CYRILLIC CAPITAL LETTER IO
+0x2728 0x0416  # CYRILLIC CAPITAL LETTER ZHE
+0x2729 0x0417  # CYRILLIC CAPITAL LETTER ZE
+0x272A 0x0418  # CYRILLIC CAPITAL LETTER I
+0x272B 0x0419  # CYRILLIC CAPITAL LETTER SHORT I
+0x272C 0x041A  # CYRILLIC CAPITAL LETTER KA
+0x272D 0x041B  # CYRILLIC CAPITAL LETTER EL
+0x272E 0x041C  # CYRILLIC CAPITAL LETTER EM
+0x272F 0x041D  # CYRILLIC CAPITAL LETTER EN
+0x2730 0x041E  # CYRILLIC CAPITAL LETTER O
+0x2731 0x041F  # CYRILLIC CAPITAL LETTER PE
+0x2732 0x0420  # CYRILLIC CAPITAL LETTER ER
+0x2733 0x0421  # CYRILLIC CAPITAL LETTER ES
+0x2734 0x0422  # CYRILLIC CAPITAL LETTER TE
+0x2735 0x0423  # CYRILLIC CAPITAL LETTER U
+0x2736 0x0424  # CYRILLIC CAPITAL LETTER EF
+0x2737 0x0425  # CYRILLIC CAPITAL LETTER HA
+0x2738 0x0426  # CYRILLIC CAPITAL LETTER TSE
+0x2739 0x0427  # CYRILLIC CAPITAL LETTER CHE
+0x273A 0x0428  # CYRILLIC CAPITAL LETTER SHA
+0x273B 0x0429  # CYRILLIC CAPITAL LETTER SHCHA
+0x273C 0x042A  # CYRILLIC CAPITAL LETTER HARD SIGN
+0x273D 0x042B  # CYRILLIC CAPITAL LETTER YERU
+0x273E 0x042C  # CYRILLIC CAPITAL LETTER SOFT SIGN
+0x273F 0x042D  # CYRILLIC CAPITAL LETTER E
+0x2740 0x042E  # CYRILLIC CAPITAL LETTER YU
+0x2741 0x042F  # CYRILLIC CAPITAL LETTER YA
+0x2751 0x0430  # CYRILLIC SMALL LETTER A
+0x2752 0x0431  # CYRILLIC SMALL LETTER BE
+0x2753 0x0432  # CYRILLIC SMALL LETTER VE
+0x2754 0x0433  # CYRILLIC SMALL LETTER GHE
+0x2755 0x0434  # CYRILLIC SMALL LETTER DE
+0x2756 0x0435  # CYRILLIC SMALL LETTER IE
+0x2757 0x0451  # CYRILLIC SMALL LETTER IO
+0x2758 0x0436  # CYRILLIC SMALL LETTER ZHE
+0x2759 0x0437  # CYRILLIC SMALL LETTER ZE
+0x275A 0x0438  # CYRILLIC SMALL LETTER I
+0x275B 0x0439  # CYRILLIC SMALL LETTER SHORT I
+0x275C 0x043A  # CYRILLIC SMALL LETTER KA
+0x275D 0x043B  # CYRILLIC SMALL LETTER EL
+0x275E 0x043C  # CYRILLIC SMALL LETTER EM
+0x275F 0x043D  # CYRILLIC SMALL LETTER EN
+0x2760 0x043E  # CYRILLIC SMALL LETTER O
+0x2761 0x043F  # CYRILLIC SMALL LETTER PE
+0x2762 0x0440  # CYRILLIC SMALL LETTER ER
+0x2763 0x0441  # CYRILLIC SMALL LETTER ES
+0x2764 0x0442  # CYRILLIC SMALL LETTER TE
+0x2765 0x0443  # CYRILLIC SMALL LETTER U
+0x2766 0x0444  # CYRILLIC SMALL LETTER EF
+0x2767 0x0445  # CYRILLIC SMALL LETTER HA
+0x2768 0x0446  # CYRILLIC SMALL LETTER TSE
+0x2769 0x0447  # CYRILLIC SMALL LETTER CHE
+0x276A 0x0448  # CYRILLIC SMALL LETTER SHA
+0x276B 0x0449  # CYRILLIC SMALL LETTER SHCHA
+0x276C 0x044A  # CYRILLIC SMALL LETTER HARD SIGN
+0x276D 0x044B  # CYRILLIC SMALL LETTER YERU
+0x276E 0x044C  # CYRILLIC SMALL LETTER SOFT SIGN
+0x276F 0x044D  # CYRILLIC SMALL LETTER E
+0x2770 0x044E  # CYRILLIC SMALL LETTER YU
+0x2771 0x044F  # CYRILLIC SMALL LETTER YA
+0x2821 0x2500  # BOX DRAWINGS LIGHT HORIZONTAL
+0x2822 0x2502  # BOX DRAWINGS LIGHT VERTICAL
+0x2823 0x250C  # BOX DRAWINGS LIGHT DOWN AND RIGHT
+0x2824 0x2510  # BOX DRAWINGS LIGHT DOWN AND LEFT
+0x2825 0x2518  # BOX DRAWINGS LIGHT UP AND LEFT
+0x2826 0x2514  # BOX DRAWINGS LIGHT UP AND RIGHT
+0x2827 0x251C  # BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+0x2828 0x252C  # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+0x2829 0x2524  # BOX DRAWINGS LIGHT VERTICAL AND LEFT
+0x282A 0x2534  # BOX DRAWINGS LIGHT UP AND HORIZONTAL
+0x282B 0x253C  # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+0x282C 0x2501  # BOX DRAWINGS HEAVY HORIZONTAL
+0x282D 0x2503  # BOX DRAWINGS HEAVY VERTICAL
+0x282E 0x250F  # BOX DRAWINGS HEAVY DOWN AND RIGHT
+0x282F 0x2513  # BOX DRAWINGS HEAVY DOWN AND LEFT
+0x2830 0x251B  # BOX DRAWINGS HEAVY UP AND LEFT
+0x2831 0x2517  # BOX DRAWINGS HEAVY UP AND RIGHT
+0x2832 0x2523  # BOX DRAWINGS HEAVY VERTICAL AND RIGHT
+0x2833 0x2533  # BOX DRAWINGS HEAVY DOWN AND HORIZONTAL
+0x2834 0x252B  # BOX DRAWINGS HEAVY VERTICAL AND LEFT
+0x2835 0x253B  # BOX DRAWINGS HEAVY UP AND HORIZONTAL
+0x2836 0x254B  # BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL
+0x2837 0x2520  # BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT
+0x2838 0x252F  # BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY
+0x2839 0x2528  # BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT
+0x283A 0x2537  # BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY
+0x283B 0x253F  # BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY
+0x283C 0x251D  # BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY
+0x283D 0x2530  # BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT
+0x283E 0x2525  # BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY
+0x283F 0x2538  # BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT
+0x2840 0x2542  # BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT
+0x3021 0x4E9C  # <CJK>
+0x3022 0x5516  # <CJK>
+0x3023 0x5A03  # <CJK>
+0x3024 0x963F  # <CJK>
+0x3025 0x54C0  # <CJK>
+0x3026 0x611B  # <CJK>
+0x3027 0x6328  # <CJK>
+0x3028 0x59F6  # <CJK>
+0x3029 0x9022  # <CJK>
+0x302A 0x8475  # <CJK>
+0x302B 0x831C  # <CJK>
+0x302C 0x7A50  # <CJK>
+0x302D 0x60AA  # <CJK>
+0x302E 0x63E1  # <CJK>
+0x302F 0x6E25  # <CJK>
+0x3030 0x65ED  # <CJK>
+0x3031 0x8466  # <CJK>
+0x3032 0x82A6  # <CJK>
+0x3033 0x9BF5  # <CJK>
+0x3034 0x6893  # <CJK>
+0x3035 0x5727  # <CJK>
+0x3036 0x65A1  # <CJK>
+0x3037 0x6271  # <CJK>
+0x3038 0x5B9B  # <CJK>
+0x3039 0x59D0  # <CJK>
+0x303A 0x867B  # <CJK>
+0x303B 0x98F4  # <CJK>
+0x303C 0x7D62  # <CJK>
+0x303D 0x7DBE  # <CJK>
+0x303E 0x9B8E  # <CJK>
+0x303F 0x6216  # <CJK>
+0x3040 0x7C9F  # <CJK>
+0x3041 0x88B7  # <CJK>
+0x3042 0x5B89  # <CJK>
+0x3043 0x5EB5  # <CJK>
+0x3044 0x6309  # <CJK>
+0x3045 0x6697  # <CJK>
+0x3046 0x6848  # <CJK>
+0x3047 0x95C7  # <CJK>
+0x3048 0x978D  # <CJK>
+0x3049 0x674F  # <CJK>
+0x304A 0x4EE5  # <CJK>
+0x304B 0x4F0A  # <CJK>
+0x304C 0x4F4D  # <CJK>
+0x304D 0x4F9D  # <CJK>
+0x304E 0x5049  # <CJK>
+0x304F 0x56F2  # <CJK>
+0x3050 0x5937  # <CJK>
+0x3051 0x59D4  # <CJK>
+0x3052 0x5A01  # <CJK>
+0x3053 0x5C09  # <CJK>
+0x3054 0x60DF  # <CJK>
+0x3055 0x610F  # <CJK>
+0x3056 0x6170  # <CJK>
+0x3057 0x6613  # <CJK>
+0x3058 0x6905  # <CJK>
+0x3059 0x70BA  # <CJK>
+0x305A 0x754F  # <CJK>
+0x305B 0x7570  # <CJK>
+0x305C 0x79FB  # <CJK>
+0x305D 0x7DAD  # <CJK>
+0x305E 0x7DEF  # <CJK>
+0x305F 0x80C3  # <CJK>
+0x3060 0x840E  # <CJK>
+0x3061 0x8863  # <CJK>
+0x3062 0x8B02  # <CJK>
+0x3063 0x9055  # <CJK>
+0x3064 0x907A  # <CJK>
+0x3065 0x533B  # <CJK>
+0x3066 0x4E95  # <CJK>
+0x3067 0x4EA5  # <CJK>
+0x3068 0x57DF  # <CJK>
+0x3069 0x80B2  # <CJK>
+0x306A 0x90C1  # <CJK>
+0x306B 0x78EF  # <CJK>
+0x306C 0x4E00  # <CJK>
+0x306D 0x58F1  # <CJK>
+0x306E 0x6EA2  # <CJK>
+0x306F 0x9038  # <CJK>
+0x3070 0x7A32  # <CJK>
+0x3071 0x8328  # <CJK>
+0x3072 0x828B  # <CJK>
+0x3073 0x9C2F  # <CJK>
+0x3074 0x5141  # <CJK>
+0x3075 0x5370  # <CJK>
+0x3076 0x54BD  # <CJK>
+0x3077 0x54E1  # <CJK>
+0x3078 0x56E0  # <CJK>
+0x3079 0x59FB  # <CJK>
+0x307A 0x5F15  # <CJK>
+0x307B 0x98F2  # <CJK>
+0x307C 0x6DEB  # <CJK>
+0x307D 0x80E4  # <CJK>
+0x307E 0x852D  # <CJK>
+0x3121 0x9662  # <CJK>
+0x3122 0x9670  # <CJK>
+0x3123 0x96A0  # <CJK>
+0x3124 0x97FB  # <CJK>
+0x3125 0x540B  # <CJK>
+0x3126 0x53F3  # <CJK>
+0x3127 0x5B87  # <CJK>
+0x3128 0x70CF  # <CJK>
+0x3129 0x7FBD  # <CJK>
+0x312A 0x8FC2  # <CJK>
+0x312B 0x96E8  # <CJK>
+0x312C 0x536F  # <CJK>
+0x312D 0x9D5C  # <CJK>
+0x312E 0x7ABA  # <CJK>
+0x312F 0x4E11  # <CJK>
+0x3130 0x7893  # <CJK>
+0x3131 0x81FC  # <CJK>
+0x3132 0x6E26  # <CJK>
+0x3133 0x5618  # <CJK>
+0x3134 0x5504  # <CJK>
+0x3135 0x6B1D  # <CJK>
+0x3136 0x851A  # <CJK>
+0x3137 0x9C3B  # <CJK>
+0x3138 0x59E5  # <CJK>
+0x3139 0x53A9  # <CJK>
+0x313A 0x6D66  # <CJK>
+0x313B 0x74DC  # <CJK>
+0x313C 0x958F  # <CJK>
+0x313D 0x5642  # <CJK>
+0x313E 0x4E91  # <CJK>
+0x313F 0x904B  # <CJK>
+0x3140 0x96F2  # <CJK>
+0x3141 0x834F  # <CJK>
+0x3142 0x990C  # <CJK>
+0x3143 0x53E1  # <CJK>
+0x3144 0x55B6  # <CJK>
+0x3145 0x5B30  # <CJK>
+0x3146 0x5F71  # <CJK>
+0x3147 0x6620  # <CJK>
+0x3148 0x66F3  # <CJK>
+0x3149 0x6804  # <CJK>
+0x314A 0x6C38  # <CJK>
+0x314B 0x6CF3  # <CJK>
+0x314C 0x6D29  # <CJK>
+0x314D 0x745B  # <CJK>
+0x314E 0x76C8  # <CJK>
+0x314F 0x7A4E  # <CJK>
+0x3150 0x9834  # <CJK>
+0x3151 0x82F1  # <CJK>
+0x3152 0x885B  # <CJK>
+0x3153 0x8A60  # <CJK>
+0x3154 0x92ED  # <CJK>
+0x3155 0x6DB2  # <CJK>
+0x3156 0x75AB  # <CJK>
+0x3157 0x76CA  # <CJK>
+0x3158 0x99C5  # <CJK>
+0x3159 0x60A6  # <CJK>
+0x315A 0x8B01  # <CJK>
+0x315B 0x8D8A  # <CJK>
+0x315C 0x95B2  # <CJK>
+0x315D 0x698E  # <CJK>
+0x315E 0x53AD  # <CJK>
+0x315F 0x5186  # <CJK>
+0x3160 0x5712  # <CJK>
+0x3161 0x5830  # <CJK>
+0x3162 0x5944  # <CJK>
+0x3163 0x5BB4  # <CJK>
+0x3164 0x5EF6  # <CJK>
+0x3165 0x6028  # <CJK>
+0x3166 0x63A9  # <CJK>
+0x3167 0x63F4  # <CJK>
+0x3168 0x6CBF  # <CJK>
+0x3169 0x6F14  # <CJK>
+0x316A 0x708E  # <CJK>
+0x316B 0x7114  # <CJK>
+0x316C 0x7159  # <CJK>
+0x316D 0x71D5  # <CJK>
+0x316E 0x733F  # <CJK>
+0x316F 0x7E01  # <CJK>
+0x3170 0x8276  # <CJK>
+0x3171 0x82D1  # <CJK>
+0x3172 0x8597  # <CJK>
+0x3173 0x9060  # <CJK>
+0x3174 0x925B  # <CJK>
+0x3175 0x9D1B  # <CJK>
+0x3176 0x5869  # <CJK>
+0x3177 0x65BC  # <CJK>
+0x3178 0x6C5A  # <CJK>
+0x3179 0x7525  # <CJK>
+0x317A 0x51F9  # <CJK>
+0x317B 0x592E  # <CJK>
+0x317C 0x5965  # <CJK>
+0x317D 0x5F80  # <CJK>
+0x317E 0x5FDC  # <CJK>
+0x3221 0x62BC  # <CJK>
+0x3222 0x65FA  # <CJK>
+0x3223 0x6A2A  # <CJK>
+0x3224 0x6B27  # <CJK>
+0x3225 0x6BB4  # <CJK>
+0x3226 0x738B  # <CJK>
+0x3227 0x7FC1  # <CJK>
+0x3228 0x8956  # <CJK>
+0x3229 0x9D2C  # <CJK>
+0x322A 0x9D0E  # <CJK>
+0x322B 0x9EC4  # <CJK>
+0x322C 0x5CA1  # <CJK>
+0x322D 0x6C96  # <CJK>
+0x322E 0x837B  # <CJK>
+0x322F 0x5104  # <CJK>
+0x3230 0x5C4B  # <CJK>
+0x3231 0x61B6  # <CJK>
+0x3232 0x81C6  # <CJK>
+0x3233 0x6876  # <CJK>
+0x3234 0x7261  # <CJK>
+0x3235 0x4E59  # <CJK>
+0x3236 0x4FFA  # <CJK>
+0x3237 0x5378  # <CJK>
+0x3238 0x6069  # <CJK>
+0x3239 0x6E29  # <CJK>
+0x323A 0x7A4F  # <CJK>
+0x323B 0x97F3  # <CJK>
+0x323C 0x4E0B  # <CJK>
+0x323D 0x5316  # <CJK>
+0x323E 0x4EEE  # <CJK>
+0x323F 0x4F55  # <CJK>
+0x3240 0x4F3D  # <CJK>
+0x3241 0x4FA1  # <CJK>
+0x3242 0x4F73  # <CJK>
+0x3243 0x52A0  # <CJK>
+0x3244 0x53EF  # <CJK>
+0x3245 0x5609  # <CJK>
+0x3246 0x590F  # <CJK>
+0x3247 0x5AC1  # <CJK>
+0x3248 0x5BB6  # <CJK>
+0x3249 0x5BE1  # <CJK>
+0x324A 0x79D1  # <CJK>
+0x324B 0x6687  # <CJK>
+0x324C 0x679C  # <CJK>
+0x324D 0x67B6  # <CJK>
+0x324E 0x6B4C  # <CJK>
+0x324F 0x6CB3  # <CJK>
+0x3250 0x706B  # <CJK>
+0x3251 0x73C2  # <CJK>
+0x3252 0x798D  # <CJK>
+0x3253 0x79BE  # <CJK>
+0x3254 0x7A3C  # <CJK>
+0x3255 0x7B87  # <CJK>
+0x3256 0x82B1  # <CJK>
+0x3257 0x82DB  # <CJK>
+0x3258 0x8304  # <CJK>
+0x3259 0x8377  # <CJK>
+0x325A 0x83EF  # <CJK>
+0x325B 0x83D3  # <CJK>
+0x325C 0x8766  # <CJK>
+0x325D 0x8AB2  # <CJK>
+0x325E 0x5629  # <CJK>
+0x325F 0x8CA8  # <CJK>
+0x3260 0x8FE6  # <CJK>
+0x3261 0x904E  # <CJK>
+0x3262 0x971E  # <CJK>
+0x3263 0x868A  # <CJK>
+0x3264 0x4FC4  # <CJK>
+0x3265 0x5CE8  # <CJK>
+0x3266 0x6211  # <CJK>
+0x3267 0x7259  # <CJK>
+0x3268 0x753B  # <CJK>
+0x3269 0x81E5  # <CJK>
+0x326A 0x82BD  # <CJK>
+0x326B 0x86FE  # <CJK>
+0x326C 0x8CC0  # <CJK>
+0x326D 0x96C5  # <CJK>
+0x326E 0x9913  # <CJK>
+0x326F 0x99D5  # <CJK>
+0x3270 0x4ECB  # <CJK>
+0x3271 0x4F1A  # <CJK>
+0x3272 0x89E3  # <CJK>
+0x3273 0x56DE  # <CJK>
+0x3274 0x584A  # <CJK>
+0x3275 0x58CA  # <CJK>
+0x3276 0x5EFB  # <CJK>
+0x3277 0x5FEB  # <CJK>
+0x3278 0x602A  # <CJK>
+0x3279 0x6094  # <CJK>
+0x327A 0x6062  # <CJK>
+0x327B 0x61D0  # <CJK>
+0x327C 0x6212  # <CJK>
+0x327D 0x62D0  # <CJK>
+0x327E 0x6539  # <CJK>
+0x3321 0x9B41  # <CJK>
+0x3322 0x6666  # <CJK>
+0x3323 0x68B0  # <CJK>
+0x3324 0x6D77  # <CJK>
+0x3325 0x7070  # <CJK>
+0x3326 0x754C  # <CJK>
+0x3327 0x7686  # <CJK>
+0x3328 0x7D75  # <CJK>
+0x3329 0x82A5  # <CJK>
+0x332A 0x87F9  # <CJK>
+0x332B 0x958B  # <CJK>
+0x332C 0x968E  # <CJK>
+0x332D 0x8C9D  # <CJK>
+0x332E 0x51F1  # <CJK>
+0x332F 0x52BE  # <CJK>
+0x3330 0x5916  # <CJK>
+0x3331 0x54B3  # <CJK>
+0x3332 0x5BB3  # <CJK>
+0x3333 0x5D16  # <CJK>
+0x3334 0x6168  # <CJK>
+0x3335 0x6982  # <CJK>
+0x3336 0x6DAF  # <CJK>
+0x3337 0x788D  # <CJK>
+0x3338 0x84CB  # <CJK>
+0x3339 0x8857  # <CJK>
+0x333A 0x8A72  # <CJK>
+0x333B 0x93A7  # <CJK>
+0x333C 0x9AB8  # <CJK>
+0x333D 0x6D6C  # <CJK>
+0x333E 0x99A8  # <CJK>
+0x333F 0x86D9  # <CJK>
+0x3340 0x57A3  # <CJK>
+0x3341 0x67FF  # <CJK>
+0x3342 0x86CE  # <CJK>
+0x3343 0x920E  # <CJK>
+0x3344 0x5283  # <CJK>
+0x3345 0x5687  # <CJK>
+0x3346 0x5404  # <CJK>
+0x3347 0x5ED3  # <CJK>
+0x3348 0x62E1  # <CJK>
+0x3349 0x64B9  # <CJK>
+0x334A 0x683C  # <CJK>
+0x334B 0x6838  # <CJK>
+0x334C 0x6BBB  # <CJK>
+0x334D 0x7372  # <CJK>
+0x334E 0x78BA  # <CJK>
+0x334F 0x7A6B  # <CJK>
+0x3350 0x899A  # <CJK>
+0x3351 0x89D2  # <CJK>
+0x3352 0x8D6B  # <CJK>
+0x3353 0x8F03  # <CJK>
+0x3354 0x90ED  # <CJK>
+0x3355 0x95A3  # <CJK>
+0x3356 0x9694  # <CJK>
+0x3357 0x9769  # <CJK>
+0x3358 0x5B66  # <CJK>
+0x3359 0x5CB3  # <CJK>
+0x335A 0x697D  # <CJK>
+0x335B 0x984D  # <CJK>
+0x335C 0x984E  # <CJK>
+0x335D 0x639B  # <CJK>
+0x335E 0x7B20  # <CJK>
+0x335F 0x6A2B  # <CJK>
+0x3360 0x6A7F  # <CJK>
+0x3361 0x68B6  # <CJK>
+0x3362 0x9C0D  # <CJK>
+0x3363 0x6F5F  # <CJK>
+0x3364 0x5272  # <CJK>
+0x3365 0x559D  # <CJK>
+0x3366 0x6070  # <CJK>
+0x3367 0x62EC  # <CJK>
+0x3368 0x6D3B  # <CJK>
+0x3369 0x6E07  # <CJK>
+0x336A 0x6ED1  # <CJK>
+0x336B 0x845B  # <CJK>
+0x336C 0x8910  # <CJK>
+0x336D 0x8F44  # <CJK>
+0x336E 0x4E14  # <CJK>
+0x336F 0x9C39  # <CJK>
+0x3370 0x53F6  # <CJK>
+0x3371 0x691B  # <CJK>
+0x3372 0x6A3A  # <CJK>
+0x3373 0x9784  # <CJK>
+0x3374 0x682A  # <CJK>
+0x3375 0x515C  # <CJK>
+0x3376 0x7AC3  # <CJK>
+0x3377 0x84B2  # <CJK>
+0x3378 0x91DC  # <CJK>
+0x3379 0x938C  # <CJK>
+0x337A 0x565B  # <CJK>
+0x337B 0x9D28  # <CJK>
+0x337C 0x6822  # <CJK>
+0x337D 0x8305  # <CJK>
+0x337E 0x8431  # <CJK>
+0x3421 0x7CA5  # <CJK>
+0x3422 0x5208  # <CJK>
+0x3423 0x82C5  # <CJK>
+0x3424 0x74E6  # <CJK>
+0x3425 0x4E7E  # <CJK>
+0x3426 0x4F83  # <CJK>
+0x3427 0x51A0  # <CJK>
+0x3428 0x5BD2  # <CJK>
+0x3429 0x520A  # <CJK>
+0x342A 0x52D8  # <CJK>
+0x342B 0x52E7  # <CJK>
+0x342C 0x5DFB  # <CJK>
+0x342D 0x559A  # <CJK>
+0x342E 0x582A  # <CJK>
+0x342F 0x59E6  # <CJK>
+0x3430 0x5B8C  # <CJK>
+0x3431 0x5B98  # <CJK>
+0x3432 0x5BDB  # <CJK>
+0x3433 0x5E72  # <CJK>
+0x3434 0x5E79  # <CJK>
+0x3435 0x60A3  # <CJK>
+0x3436 0x611F  # <CJK>
+0x3437 0x6163  # <CJK>
+0x3438 0x61BE  # <CJK>
+0x3439 0x63DB  # <CJK>
+0x343A 0x6562  # <CJK>
+0x343B 0x67D1  # <CJK>
+0x343C 0x6853  # <CJK>
+0x343D 0x68FA  # <CJK>
+0x343E 0x6B3E  # <CJK>
+0x343F 0x6B53  # <CJK>
+0x3440 0x6C57  # <CJK>
+0x3441 0x6F22  # <CJK>
+0x3442 0x6F97  # <CJK>
+0x3443 0x6F45  # <CJK>
+0x3444 0x74B0  # <CJK>
+0x3445 0x7518  # <CJK>
+0x3446 0x76E3  # <CJK>
+0x3447 0x770B  # <CJK>
+0x3448 0x7AFF  # <CJK>
+0x3449 0x7BA1  # <CJK>
+0x344A 0x7C21  # <CJK>
+0x344B 0x7DE9  # <CJK>
+0x344C 0x7F36  # <CJK>
+0x344D 0x7FF0  # <CJK>
+0x344E 0x809D  # <CJK>
+0x344F 0x8266  # <CJK>
+0x3450 0x839E  # <CJK>
+0x3451 0x89B3  # <CJK>
+0x3452 0x8ACC  # <CJK>
+0x3453 0x8CAB  # <CJK>
+0x3454 0x9084  # <CJK>
+0x3455 0x9451  # <CJK>
+0x3456 0x9593  # <CJK>
+0x3457 0x9591  # <CJK>
+0x3458 0x95A2  # <CJK>
+0x3459 0x9665  # <CJK>
+0x345A 0x97D3  # <CJK>
+0x345B 0x9928  # <CJK>
+0x345C 0x8218  # <CJK>
+0x345D 0x4E38  # <CJK>
+0x345E 0x542B  # <CJK>
+0x345F 0x5CB8  # <CJK>
+0x3460 0x5DCC  # <CJK>
+0x3461 0x73A9  # <CJK>
+0x3462 0x764C  # <CJK>
+0x3463 0x773C  # <CJK>
+0x3464 0x5CA9  # <CJK>
+0x3465 0x7FEB  # <CJK>
+0x3466 0x8D0B  # <CJK>
+0x3467 0x96C1  # <CJK>
+0x3468 0x9811  # <CJK>
+0x3469 0x9854  # <CJK>
+0x346A 0x9858  # <CJK>
+0x346B 0x4F01  # <CJK>
+0x346C 0x4F0E  # <CJK>
+0x346D 0x5371  # <CJK>
+0x346E 0x559C  # <CJK>
+0x346F 0x5668  # <CJK>
+0x3470 0x57FA  # <CJK>
+0x3471 0x5947  # <CJK>
+0x3472 0x5B09  # <CJK>
+0x3473 0x5BC4  # <CJK>
+0x3474 0x5C90  # <CJK>
+0x3475 0x5E0C  # <CJK>
+0x3476 0x5E7E  # <CJK>
+0x3477 0x5FCC  # <CJK>
+0x3478 0x63EE  # <CJK>
+0x3479 0x673A  # <CJK>
+0x347A 0x65D7  # <CJK>
+0x347B 0x65E2  # <CJK>
+0x347C 0x671F  # <CJK>
+0x347D 0x68CB  # <CJK>
+0x347E 0x68C4  # <CJK>
+0x3521 0x6A5F  # <CJK>
+0x3522 0x5E30  # <CJK>
+0x3523 0x6BC5  # <CJK>
+0x3524 0x6C17  # <CJK>
+0x3525 0x6C7D  # <CJK>
+0x3526 0x757F  # <CJK>
+0x3527 0x7948  # <CJK>
+0x3528 0x5B63  # <CJK>
+0x3529 0x7A00  # <CJK>
+0x352A 0x7D00  # <CJK>
+0x352B 0x5FBD  # <CJK>
+0x352C 0x898F  # <CJK>
+0x352D 0x8A18  # <CJK>
+0x352E 0x8CB4  # <CJK>
+0x352F 0x8D77  # <CJK>
+0x3530 0x8ECC  # <CJK>
+0x3531 0x8F1D  # <CJK>
+0x3532 0x98E2  # <CJK>
+0x3533 0x9A0E  # <CJK>
+0x3534 0x9B3C  # <CJK>
+0x3535 0x4E80  # <CJK>
+0x3536 0x507D  # <CJK>
+0x3537 0x5100  # <CJK>
+0x3538 0x5993  # <CJK>
+0x3539 0x5B9C  # <CJK>
+0x353A 0x622F  # <CJK>
+0x353B 0x6280  # <CJK>
+0x353C 0x64EC  # <CJK>
+0x353D 0x6B3A  # <CJK>
+0x353E 0x72A0  # <CJK>
+0x353F 0x7591  # <CJK>
+0x3540 0x7947  # <CJK>
+0x3541 0x7FA9  # <CJK>
+0x3542 0x87FB  # <CJK>
+0x3543 0x8ABC  # <CJK>
+0x3544 0x8B70  # <CJK>
+0x3545 0x63AC  # <CJK>
+0x3546 0x83CA  # <CJK>
+0x3547 0x97A0  # <CJK>
+0x3548 0x5409  # <CJK>
+0x3549 0x5403  # <CJK>
+0x354A 0x55AB  # <CJK>
+0x354B 0x6854  # <CJK>
+0x354C 0x6A58  # <CJK>
+0x354D 0x8A70  # <CJK>
+0x354E 0x7827  # <CJK>
+0x354F 0x6775  # <CJK>
+0x3550 0x9ECD  # <CJK>
+0x3551 0x5374  # <CJK>
+0x3552 0x5BA2  # <CJK>
+0x3553 0x811A  # <CJK>
+0x3554 0x8650  # <CJK>
+0x3555 0x9006  # <CJK>
+0x3556 0x4E18  # <CJK>
+0x3557 0x4E45  # <CJK>
+0x3558 0x4EC7  # <CJK>
+0x3559 0x4F11  # <CJK>
+0x355A 0x53CA  # <CJK>
+0x355B 0x5438  # <CJK>
+0x355C 0x5BAE  # <CJK>
+0x355D 0x5F13  # <CJK>
+0x355E 0x6025  # <CJK>
+0x355F 0x6551  # <CJK>
+0x3560 0x673D  # <CJK>
+0x3561 0x6C42  # <CJK>
+0x3562 0x6C72  # <CJK>
+0x3563 0x6CE3  # <CJK>
+0x3564 0x7078  # <CJK>
+0x3565 0x7403  # <CJK>
+0x3566 0x7A76  # <CJK>
+0x3567 0x7AAE  # <CJK>
+0x3568 0x7B08  # <CJK>
+0x3569 0x7D1A  # <CJK>
+0x356A 0x7CFE  # <CJK>
+0x356B 0x7D66  # <CJK>
+0x356C 0x65E7  # <CJK>
+0x356D 0x725B  # <CJK>
+0x356E 0x53BB  # <CJK>
+0x356F 0x5C45  # <CJK>
+0x3570 0x5DE8  # <CJK>
+0x3571 0x62D2  # <CJK>
+0x3572 0x62E0  # <CJK>
+0x3573 0x6319  # <CJK>
+0x3574 0x6E20  # <CJK>
+0x3575 0x865A  # <CJK>
+0x3576 0x8A31  # <CJK>
+0x3577 0x8DDD  # <CJK>
+0x3578 0x92F8  # <CJK>
+0x3579 0x6F01  # <CJK>
+0x357A 0x79A6  # <CJK>
+0x357B 0x9B5A  # <CJK>
+0x357C 0x4EA8  # <CJK>
+0x357D 0x4EAB  # <CJK>
+0x357E 0x4EAC  # <CJK>
+0x3621 0x4F9B  # <CJK>
+0x3622 0x4FA0  # <CJK>
+0x3623 0x50D1  # <CJK>
+0x3624 0x5147  # <CJK>
+0x3625 0x7AF6  # <CJK>
+0x3626 0x5171  # <CJK>
+0x3627 0x51F6  # <CJK>
+0x3628 0x5354  # <CJK>
+0x3629 0x5321  # <CJK>
+0x362A 0x537F  # <CJK>
+0x362B 0x53EB  # <CJK>
+0x362C 0x55AC  # <CJK>
+0x362D 0x5883  # <CJK>
+0x362E 0x5CE1  # <CJK>
+0x362F 0x5F37  # <CJK>
+0x3630 0x5F4A  # <CJK>
+0x3631 0x602F  # <CJK>
+0x3632 0x6050  # <CJK>
+0x3633 0x606D  # <CJK>
+0x3634 0x631F  # <CJK>
+0x3635 0x6559  # <CJK>
+0x3636 0x6A4B  # <CJK>
+0x3637 0x6CC1  # <CJK>
+0x3638 0x72C2  # <CJK>
+0x3639 0x72ED  # <CJK>
+0x363A 0x77EF  # <CJK>
+0x363B 0x80F8  # <CJK>
+0x363C 0x8105  # <CJK>
+0x363D 0x8208  # <CJK>
+0x363E 0x854E  # <CJK>
+0x363F 0x90F7  # <CJK>
+0x3640 0x93E1  # <CJK>
+0x3641 0x97FF  # <CJK>
+0x3642 0x9957  # <CJK>
+0x3643 0x9A5A  # <CJK>
+0x3644 0x4EF0  # <CJK>
+0x3645 0x51DD  # <CJK>
+0x3646 0x5C2D  # <CJK>
+0x3647 0x6681  # <CJK>
+0x3648 0x696D  # <CJK>
+0x3649 0x5C40  # <CJK>
+0x364A 0x66F2  # <CJK>
+0x364B 0x6975  # <CJK>
+0x364C 0x7389  # <CJK>
+0x364D 0x6850  # <CJK>
+0x364E 0x7C81  # <CJK>
+0x364F 0x50C5  # <CJK>
+0x3650 0x52E4  # <CJK>
+0x3651 0x5747  # <CJK>
+0x3652 0x5DFE  # <CJK>
+0x3653 0x9326  # <CJK>
+0x3654 0x65A4  # <CJK>
+0x3655 0x6B23  # <CJK>
+0x3656 0x6B3D  # <CJK>
+0x3657 0x7434  # <CJK>
+0x3658 0x7981  # <CJK>
+0x3659 0x79BD  # <CJK>
+0x365A 0x7B4B  # <CJK>
+0x365B 0x7DCA  # <CJK>
+0x365C 0x82B9  # <CJK>
+0x365D 0x83CC  # <CJK>
+0x365E 0x887F  # <CJK>
+0x365F 0x895F  # <CJK>
+0x3660 0x8B39  # <CJK>
+0x3661 0x8FD1  # <CJK>
+0x3662 0x91D1  # <CJK>
+0x3663 0x541F  # <CJK>
+0x3664 0x9280  # <CJK>
+0x3665 0x4E5D  # <CJK>
+0x3666 0x5036  # <CJK>
+0x3667 0x53E5  # <CJK>
+0x3668 0x533A  # <CJK>
+0x3669 0x72D7  # <CJK>
+0x366A 0x7396  # <CJK>
+0x366B 0x77E9  # <CJK>
+0x366C 0x82E6  # <CJK>
+0x366D 0x8EAF  # <CJK>
+0x366E 0x99C6  # <CJK>
+0x366F 0x99C8  # <CJK>
+0x3670 0x99D2  # <CJK>
+0x3671 0x5177  # <CJK>
+0x3672 0x611A  # <CJK>
+0x3673 0x865E  # <CJK>
+0x3674 0x55B0  # <CJK>
+0x3675 0x7A7A  # <CJK>
+0x3676 0x5076  # <CJK>
+0x3677 0x5BD3  # <CJK>
+0x3678 0x9047  # <CJK>
+0x3679 0x9685  # <CJK>
+0x367A 0x4E32  # <CJK>
+0x367B 0x6ADB  # <CJK>
+0x367C 0x91E7  # <CJK>
+0x367D 0x5C51  # <CJK>
+0x367E 0x5C48  # <CJK>
+0x3721 0x6398  # <CJK>
+0x3722 0x7A9F  # <CJK>
+0x3723 0x6C93  # <CJK>
+0x3724 0x9774  # <CJK>
+0x3725 0x8F61  # <CJK>
+0x3726 0x7AAA  # <CJK>
+0x3727 0x718A  # <CJK>
+0x3728 0x9688  # <CJK>
+0x3729 0x7C82  # <CJK>
+0x372A 0x6817  # <CJK>
+0x372B 0x7E70  # <CJK>
+0x372C 0x6851  # <CJK>
+0x372D 0x936C  # <CJK>
+0x372E 0x52F2  # <CJK>
+0x372F 0x541B  # <CJK>
+0x3730 0x85AB  # <CJK>
+0x3731 0x8A13  # <CJK>
+0x3732 0x7FA4  # <CJK>
+0x3733 0x8ECD  # <CJK>
+0x3734 0x90E1  # <CJK>
+0x3735 0x5366  # <CJK>
+0x3736 0x8888  # <CJK>
+0x3737 0x7941  # <CJK>
+0x3738 0x4FC2  # <CJK>
+0x3739 0x50BE  # <CJK>
+0x373A 0x5211  # <CJK>
+0x373B 0x5144  # <CJK>
+0x373C 0x5553  # <CJK>
+0x373D 0x572D  # <CJK>
+0x373E 0x73EA  # <CJK>
+0x373F 0x578B  # <CJK>
+0x3740 0x5951  # <CJK>
+0x3741 0x5F62  # <CJK>
+0x3742 0x5F84  # <CJK>
+0x3743 0x6075  # <CJK>
+0x3744 0x6176  # <CJK>
+0x3745 0x6167  # <CJK>
+0x3746 0x61A9  # <CJK>
+0x3747 0x63B2  # <CJK>
+0x3748 0x643A  # <CJK>
+0x3749 0x656C  # <CJK>
+0x374A 0x666F  # <CJK>
+0x374B 0x6842  # <CJK>
+0x374C 0x6E13  # <CJK>
+0x374D 0x7566  # <CJK>
+0x374E 0x7A3D  # <CJK>
+0x374F 0x7CFB  # <CJK>
+0x3750 0x7D4C  # <CJK>
+0x3751 0x7D99  # <CJK>
+0x3752 0x7E4B  # <CJK>
+0x3753 0x7F6B  # <CJK>
+0x3754 0x830E  # <CJK>
+0x3755 0x834A  # <CJK>
+0x3756 0x86CD  # <CJK>
+0x3757 0x8A08  # <CJK>
+0x3758 0x8A63  # <CJK>
+0x3759 0x8B66  # <CJK>
+0x375A 0x8EFD  # <CJK>
+0x375B 0x981A  # <CJK>
+0x375C 0x9D8F  # <CJK>
+0x375D 0x82B8  # <CJK>
+0x375E 0x8FCE  # <CJK>
+0x375F 0x9BE8  # <CJK>
+0x3760 0x5287  # <CJK>
+0x3761 0x621F  # <CJK>
+0x3762 0x6483  # <CJK>
+0x3763 0x6FC0  # <CJK>
+0x3764 0x9699  # <CJK>
+0x3765 0x6841  # <CJK>
+0x3766 0x5091  # <CJK>
+0x3767 0x6B20  # <CJK>
+0x3768 0x6C7A  # <CJK>
+0x3769 0x6F54  # <CJK>
+0x376A 0x7A74  # <CJK>
+0x376B 0x7D50  # <CJK>
+0x376C 0x8840  # <CJK>
+0x376D 0x8A23  # <CJK>
+0x376E 0x6708  # <CJK>
+0x376F 0x4EF6  # <CJK>
+0x3770 0x5039  # <CJK>
+0x3771 0x5026  # <CJK>
+0x3772 0x5065  # <CJK>
+0x3773 0x517C  # <CJK>
+0x3774 0x5238  # <CJK>
+0x3775 0x5263  # <CJK>
+0x3776 0x55A7  # <CJK>
+0x3777 0x570F  # <CJK>
+0x3778 0x5805  # <CJK>
+0x3779 0x5ACC  # <CJK>
+0x377A 0x5EFA  # <CJK>
+0x377B 0x61B2  # <CJK>
+0x377C 0x61F8  # <CJK>
+0x377D 0x62F3  # <CJK>
+0x377E 0x6372  # <CJK>
+0x3821 0x691C  # <CJK>
+0x3822 0x6A29  # <CJK>
+0x3823 0x727D  # <CJK>
+0x3824 0x72AC  # <CJK>
+0x3825 0x732E  # <CJK>
+0x3826 0x7814  # <CJK>
+0x3827 0x786F  # <CJK>
+0x3828 0x7D79  # <CJK>
+0x3829 0x770C  # <CJK>
+0x382A 0x80A9  # <CJK>
+0x382B 0x898B  # <CJK>
+0x382C 0x8B19  # <CJK>
+0x382D 0x8CE2  # <CJK>
+0x382E 0x8ED2  # <CJK>
+0x382F 0x9063  # <CJK>
+0x3830 0x9375  # <CJK>
+0x3831 0x967A  # <CJK>
+0x3832 0x9855  # <CJK>
+0x3833 0x9A13  # <CJK>
+0x3834 0x9E78  # <CJK>
+0x3835 0x5143  # <CJK>
+0x3836 0x539F  # <CJK>
+0x3837 0x53B3  # <CJK>
+0x3838 0x5E7B  # <CJK>
+0x3839 0x5F26  # <CJK>
+0x383A 0x6E1B  # <CJK>
+0x383B 0x6E90  # <CJK>
+0x383C 0x7384  # <CJK>
+0x383D 0x73FE  # <CJK>
+0x383E 0x7D43  # <CJK>
+0x383F 0x8237  # <CJK>
+0x3840 0x8A00  # <CJK>
+0x3841 0x8AFA  # <CJK>
+0x3842 0x9650  # <CJK>
+0x3843 0x4E4E  # <CJK>
+0x3844 0x500B  # <CJK>
+0x3845 0x53E4  # <CJK>
+0x3846 0x547C  # <CJK>
+0x3847 0x56FA  # <CJK>
+0x3848 0x59D1  # <CJK>
+0x3849 0x5B64  # <CJK>
+0x384A 0x5DF1  # <CJK>
+0x384B 0x5EAB  # <CJK>
+0x384C 0x5F27  # <CJK>
+0x384D 0x6238  # <CJK>
+0x384E 0x6545  # <CJK>
+0x384F 0x67AF  # <CJK>
+0x3850 0x6E56  # <CJK>
+0x3851 0x72D0  # <CJK>
+0x3852 0x7CCA  # <CJK>
+0x3853 0x88B4  # <CJK>
+0x3854 0x80A1  # <CJK>
+0x3855 0x80E1  # <CJK>
+0x3856 0x83F0  # <CJK>
+0x3857 0x864E  # <CJK>
+0x3858 0x8A87  # <CJK>
+0x3859 0x8DE8  # <CJK>
+0x385A 0x9237  # <CJK>
+0x385B 0x96C7  # <CJK>
+0x385C 0x9867  # <CJK>
+0x385D 0x9F13  # <CJK>
+0x385E 0x4E94  # <CJK>
+0x385F 0x4E92  # <CJK>
+0x3860 0x4F0D  # <CJK>
+0x3861 0x5348  # <CJK>
+0x3862 0x5449  # <CJK>
+0x3863 0x543E  # <CJK>
+0x3864 0x5A2F  # <CJK>
+0x3865 0x5F8C  # <CJK>
+0x3866 0x5FA1  # <CJK>
+0x3867 0x609F  # <CJK>
+0x3868 0x68A7  # <CJK>
+0x3869 0x6A8E  # <CJK>
+0x386A 0x745A  # <CJK>
+0x386B 0x7881  # <CJK>
+0x386C 0x8A9E  # <CJK>
+0x386D 0x8AA4  # <CJK>
+0x386E 0x8B77  # <CJK>
+0x386F 0x9190  # <CJK>
+0x3870 0x4E5E  # <CJK>
+0x3871 0x9BC9  # <CJK>
+0x3872 0x4EA4  # <CJK>
+0x3873 0x4F7C  # <CJK>
+0x3874 0x4FAF  # <CJK>
+0x3875 0x5019  # <CJK>
+0x3876 0x5016  # <CJK>
+0x3877 0x5149  # <CJK>
+0x3878 0x516C  # <CJK>
+0x3879 0x529F  # <CJK>
+0x387A 0x52B9  # <CJK>
+0x387B 0x52FE  # <CJK>
+0x387C 0x539A  # <CJK>
+0x387D 0x53E3  # <CJK>
+0x387E 0x5411  # <CJK>
+0x3921 0x540E  # <CJK>
+0x3922 0x5589  # <CJK>
+0x3923 0x5751  # <CJK>
+0x3924 0x57A2  # <CJK>
+0x3925 0x597D  # <CJK>
+0x3926 0x5B54  # <CJK>
+0x3927 0x5B5D  # <CJK>
+0x3928 0x5B8F  # <CJK>
+0x3929 0x5DE5  # <CJK>
+0x392A 0x5DE7  # <CJK>
+0x392B 0x5DF7  # <CJK>
+0x392C 0x5E78  # <CJK>
+0x392D 0x5E83  # <CJK>
+0x392E 0x5E9A  # <CJK>
+0x392F 0x5EB7  # <CJK>
+0x3930 0x5F18  # <CJK>
+0x3931 0x6052  # <CJK>
+0x3932 0x614C  # <CJK>
+0x3933 0x6297  # <CJK>
+0x3934 0x62D8  # <CJK>
+0x3935 0x63A7  # <CJK>
+0x3936 0x653B  # <CJK>
+0x3937 0x6602  # <CJK>
+0x3938 0x6643  # <CJK>
+0x3939 0x66F4  # <CJK>
+0x393A 0x676D  # <CJK>
+0x393B 0x6821  # <CJK>
+0x393C 0x6897  # <CJK>
+0x393D 0x69CB  # <CJK>
+0x393E 0x6C5F  # <CJK>
+0x393F 0x6D2A  # <CJK>
+0x3940 0x6D69  # <CJK>
+0x3941 0x6E2F  # <CJK>
+0x3942 0x6E9D  # <CJK>
+0x3943 0x7532  # <CJK>
+0x3944 0x7687  # <CJK>
+0x3945 0x786C  # <CJK>
+0x3946 0x7A3F  # <CJK>
+0x3947 0x7CE0  # <CJK>
+0x3948 0x7D05  # <CJK>
+0x3949 0x7D18  # <CJK>
+0x394A 0x7D5E  # <CJK>
+0x394B 0x7DB1  # <CJK>
+0x394C 0x8015  # <CJK>
+0x394D 0x8003  # <CJK>
+0x394E 0x80AF  # <CJK>
+0x394F 0x80B1  # <CJK>
+0x3950 0x8154  # <CJK>
+0x3951 0x818F  # <CJK>
+0x3952 0x822A  # <CJK>
+0x3953 0x8352  # <CJK>
+0x3954 0x884C  # <CJK>
+0x3955 0x8861  # <CJK>
+0x3956 0x8B1B  # <CJK>
+0x3957 0x8CA2  # <CJK>
+0x3958 0x8CFC  # <CJK>
+0x3959 0x90CA  # <CJK>
+0x395A 0x9175  # <CJK>
+0x395B 0x9271  # <CJK>
+0x395C 0x783F  # <CJK>
+0x395D 0x92FC  # <CJK>
+0x395E 0x95A4  # <CJK>
+0x395F 0x964D  # <CJK>
+0x3960 0x9805  # <CJK>
+0x3961 0x9999  # <CJK>
+0x3962 0x9AD8  # <CJK>
+0x3963 0x9D3B  # <CJK>
+0x3964 0x525B  # <CJK>
+0x3965 0x52AB  # <CJK>
+0x3966 0x53F7  # <CJK>
+0x3967 0x5408  # <CJK>
+0x3968 0x58D5  # <CJK>
+0x3969 0x62F7  # <CJK>
+0x396A 0x6FE0  # <CJK>
+0x396B 0x8C6A  # <CJK>
+0x396C 0x8F5F  # <CJK>
+0x396D 0x9EB9  # <CJK>
+0x396E 0x514B  # <CJK>
+0x396F 0x523B  # <CJK>
+0x3970 0x544A  # <CJK>
+0x3971 0x56FD  # <CJK>
+0x3972 0x7A40  # <CJK>
+0x3973 0x9177  # <CJK>
+0x3974 0x9D60  # <CJK>
+0x3975 0x9ED2  # <CJK>
+0x3976 0x7344  # <CJK>
+0x3977 0x6F09  # <CJK>
+0x3978 0x8170  # <CJK>
+0x3979 0x7511  # <CJK>
+0x397A 0x5FFD  # <CJK>
+0x397B 0x60DA  # <CJK>
+0x397C 0x9AA8  # <CJK>
+0x397D 0x72DB  # <CJK>
+0x397E 0x8FBC  # <CJK>
+0x3A21 0x6B64  # <CJK>
+0x3A22 0x9803  # <CJK>
+0x3A23 0x4ECA  # <CJK>
+0x3A24 0x56F0  # <CJK>
+0x3A25 0x5764  # <CJK>
+0x3A26 0x58BE  # <CJK>
+0x3A27 0x5A5A  # <CJK>
+0x3A28 0x6068  # <CJK>
+0x3A29 0x61C7  # <CJK>
+0x3A2A 0x660F  # <CJK>
+0x3A2B 0x6606  # <CJK>
+0x3A2C 0x6839  # <CJK>
+0x3A2D 0x68B1  # <CJK>
+0x3A2E 0x6DF7  # <CJK>
+0x3A2F 0x75D5  # <CJK>
+0x3A30 0x7D3A  # <CJK>
+0x3A31 0x826E  # <CJK>
+0x3A32 0x9B42  # <CJK>
+0x3A33 0x4E9B  # <CJK>
+0x3A34 0x4F50  # <CJK>
+0x3A35 0x53C9  # <CJK>
+0x3A36 0x5506  # <CJK>
+0x3A37 0x5D6F  # <CJK>
+0x3A38 0x5DE6  # <CJK>
+0x3A39 0x5DEE  # <CJK>
+0x3A3A 0x67FB  # <CJK>
+0x3A3B 0x6C99  # <CJK>
+0x3A3C 0x7473  # <CJK>
+0x3A3D 0x7802  # <CJK>
+0x3A3E 0x8A50  # <CJK>
+0x3A3F 0x9396  # <CJK>
+0x3A40 0x88DF  # <CJK>
+0x3A41 0x5750  # <CJK>
+0x3A42 0x5EA7  # <CJK>
+0x3A43 0x632B  # <CJK>
+0x3A44 0x50B5  # <CJK>
+0x3A45 0x50AC  # <CJK>
+0x3A46 0x518D  # <CJK>
+0x3A47 0x6700  # <CJK>
+0x3A48 0x54C9  # <CJK>
+0x3A49 0x585E  # <CJK>
+0x3A4A 0x59BB  # <CJK>
+0x3A4B 0x5BB0  # <CJK>
+0x3A4C 0x5F69  # <CJK>
+0x3A4D 0x624D  # <CJK>
+0x3A4E 0x63A1  # <CJK>
+0x3A4F 0x683D  # <CJK>
+0x3A50 0x6B73  # <CJK>
+0x3A51 0x6E08  # <CJK>
+0x3A52 0x707D  # <CJK>
+0x3A53 0x91C7  # <CJK>
+0x3A54 0x7280  # <CJK>
+0x3A55 0x7815  # <CJK>
+0x3A56 0x7826  # <CJK>
+0x3A57 0x796D  # <CJK>
+0x3A58 0x658E  # <CJK>
+0x3A59 0x7D30  # <CJK>
+0x3A5A 0x83DC  # <CJK>
+0x3A5B 0x88C1  # <CJK>
+0x3A5C 0x8F09  # <CJK>
+0x3A5D 0x969B  # <CJK>
+0x3A5E 0x5264  # <CJK>
+0x3A5F 0x5728  # <CJK>
+0x3A60 0x6750  # <CJK>
+0x3A61 0x7F6A  # <CJK>
+0x3A62 0x8CA1  # <CJK>
+0x3A63 0x51B4  # <CJK>
+0x3A64 0x5742  # <CJK>
+0x3A65 0x962A  # <CJK>
+0x3A66 0x583A  # <CJK>
+0x3A67 0x698A  # <CJK>
+0x3A68 0x80B4  # <CJK>
+0x3A69 0x54B2  # <CJK>
+0x3A6A 0x5D0E  # <CJK>
+0x3A6B 0x57FC  # <CJK>
+0x3A6C 0x7895  # <CJK>
+0x3A6D 0x9DFA  # <CJK>
+0x3A6E 0x4F5C  # <CJK>
+0x3A6F 0x524A  # <CJK>
+0x3A70 0x548B  # <CJK>
+0x3A71 0x643E  # <CJK>
+0x3A72 0x6628  # <CJK>
+0x3A73 0x6714  # <CJK>
+0x3A74 0x67F5  # <CJK>
+0x3A75 0x7A84  # <CJK>
+0x3A76 0x7B56  # <CJK>
+0x3A77 0x7D22  # <CJK>
+0x3A78 0x932F  # <CJK>
+0x3A79 0x685C  # <CJK>
+0x3A7A 0x9BAD  # <CJK>
+0x3A7B 0x7B39  # <CJK>
+0x3A7C 0x5319  # <CJK>
+0x3A7D 0x518A  # <CJK>
+0x3A7E 0x5237  # <CJK>
+0x3B21 0x5BDF  # <CJK>
+0x3B22 0x62F6  # <CJK>
+0x3B23 0x64AE  # <CJK>
+0x3B24 0x64E6  # <CJK>
+0x3B25 0x672D  # <CJK>
+0x3B26 0x6BBA  # <CJK>
+0x3B27 0x85A9  # <CJK>
+0x3B28 0x96D1  # <CJK>
+0x3B29 0x7690  # <CJK>
+0x3B2A 0x9BD6  # <CJK>
+0x3B2B 0x634C  # <CJK>
+0x3B2C 0x9306  # <CJK>
+0x3B2D 0x9BAB  # <CJK>
+0x3B2E 0x76BF  # <CJK>
+0x3B2F 0x6652  # <CJK>
+0x3B30 0x4E09  # <CJK>
+0x3B31 0x5098  # <CJK>
+0x3B32 0x53C2  # <CJK>
+0x3B33 0x5C71  # <CJK>
+0x3B34 0x60E8  # <CJK>
+0x3B35 0x6492  # <CJK>
+0x3B36 0x6563  # <CJK>
+0x3B37 0x685F  # <CJK>
+0x3B38 0x71E6  # <CJK>
+0x3B39 0x73CA  # <CJK>
+0x3B3A 0x7523  # <CJK>
+0x3B3B 0x7B97  # <CJK>
+0x3B3C 0x7E82  # <CJK>
+0x3B3D 0x8695  # <CJK>
+0x3B3E 0x8B83  # <CJK>
+0x3B3F 0x8CDB  # <CJK>
+0x3B40 0x9178  # <CJK>
+0x3B41 0x9910  # <CJK>
+0x3B42 0x65AC  # <CJK>
+0x3B43 0x66AB  # <CJK>
+0x3B44 0x6B8B  # <CJK>
+0x3B45 0x4ED5  # <CJK>
+0x3B46 0x4ED4  # <CJK>
+0x3B47 0x4F3A  # <CJK>
+0x3B48 0x4F7F  # <CJK>
+0x3B49 0x523A  # <CJK>
+0x3B4A 0x53F8  # <CJK>
+0x3B4B 0x53F2  # <CJK>
+0x3B4C 0x55E3  # <CJK>
+0x3B4D 0x56DB  # <CJK>
+0x3B4E 0x58EB  # <CJK>
+0x3B4F 0x59CB  # <CJK>
+0x3B50 0x59C9  # <CJK>
+0x3B51 0x59FF  # <CJK>
+0x3B52 0x5B50  # <CJK>
+0x3B53 0x5C4D  # <CJK>
+0x3B54 0x5E02  # <CJK>
+0x3B55 0x5E2B  # <CJK>
+0x3B56 0x5FD7  # <CJK>
+0x3B57 0x601D  # <CJK>
+0x3B58 0x6307  # <CJK>
+0x3B59 0x652F  # <CJK>
+0x3B5A 0x5B5C  # <CJK>
+0x3B5B 0x65AF  # <CJK>
+0x3B5C 0x65BD  # <CJK>
+0x3B5D 0x65E8  # <CJK>
+0x3B5E 0x679D  # <CJK>
+0x3B5F 0x6B62  # <CJK>
+0x3B60 0x6B7B  # <CJK>
+0x3B61 0x6C0F  # <CJK>
+0x3B62 0x7345  # <CJK>
+0x3B63 0x7949  # <CJK>
+0x3B64 0x79C1  # <CJK>
+0x3B65 0x7CF8  # <CJK>
+0x3B66 0x7D19  # <CJK>
+0x3B67 0x7D2B  # <CJK>
+0x3B68 0x80A2  # <CJK>
+0x3B69 0x8102  # <CJK>
+0x3B6A 0x81F3  # <CJK>
+0x3B6B 0x8996  # <CJK>
+0x3B6C 0x8A5E  # <CJK>
+0x3B6D 0x8A69  # <CJK>
+0x3B6E 0x8A66  # <CJK>
+0x3B6F 0x8A8C  # <CJK>
+0x3B70 0x8AEE  # <CJK>
+0x3B71 0x8CC7  # <CJK>
+0x3B72 0x8CDC  # <CJK>
+0x3B73 0x96CC  # <CJK>
+0x3B74 0x98FC  # <CJK>
+0x3B75 0x6B6F  # <CJK>
+0x3B76 0x4E8B  # <CJK>
+0x3B77 0x4F3C  # <CJK>
+0x3B78 0x4F8D  # <CJK>
+0x3B79 0x5150  # <CJK>
+0x3B7A 0x5B57  # <CJK>
+0x3B7B 0x5BFA  # <CJK>
+0x3B7C 0x6148  # <CJK>
+0x3B7D 0x6301  # <CJK>
+0x3B7E 0x6642  # <CJK>
+0x3C21 0x6B21  # <CJK>
+0x3C22 0x6ECB  # <CJK>
+0x3C23 0x6CBB  # <CJK>
+0x3C24 0x723E  # <CJK>
+0x3C25 0x74BD  # <CJK>
+0x3C26 0x75D4  # <CJK>
+0x3C27 0x78C1  # <CJK>
+0x3C28 0x793A  # <CJK>
+0x3C29 0x800C  # <CJK>
+0x3C2A 0x8033  # <CJK>
+0x3C2B 0x81EA  # <CJK>
+0x3C2C 0x8494  # <CJK>
+0x3C2D 0x8F9E  # <CJK>
+0x3C2E 0x6C50  # <CJK>
+0x3C2F 0x9E7F  # <CJK>
+0x3C30 0x5F0F  # <CJK>
+0x3C31 0x8B58  # <CJK>
+0x3C32 0x9D2B  # <CJK>
+0x3C33 0x7AFA  # <CJK>
+0x3C34 0x8EF8  # <CJK>
+0x3C35 0x5B8D  # <CJK>
+0x3C36 0x96EB  # <CJK>
+0x3C37 0x4E03  # <CJK>
+0x3C38 0x53F1  # <CJK>
+0x3C39 0x57F7  # <CJK>
+0x3C3A 0x5931  # <CJK>
+0x3C3B 0x5AC9  # <CJK>
+0x3C3C 0x5BA4  # <CJK>
+0x3C3D 0x6089  # <CJK>
+0x3C3E 0x6E7F  # <CJK>
+0x3C3F 0x6F06  # <CJK>
+0x3C40 0x75BE  # <CJK>
+0x3C41 0x8CEA  # <CJK>
+0x3C42 0x5B9F  # <CJK>
+0x3C43 0x8500  # <CJK>
+0x3C44 0x7BE0  # <CJK>
+0x3C45 0x5072  # <CJK>
+0x3C46 0x67F4  # <CJK>
+0x3C47 0x829D  # <CJK>
+0x3C48 0x5C61  # <CJK>
+0x3C49 0x854A  # <CJK>
+0x3C4A 0x7E1E  # <CJK>
+0x3C4B 0x820E  # <CJK>
+0x3C4C 0x5199  # <CJK>
+0x3C4D 0x5C04  # <CJK>
+0x3C4E 0x6368  # <CJK>
+0x3C4F 0x8D66  # <CJK>
+0x3C50 0x659C  # <CJK>
+0x3C51 0x716E  # <CJK>
+0x3C52 0x793E  # <CJK>
+0x3C53 0x7D17  # <CJK>
+0x3C54 0x8005  # <CJK>
+0x3C55 0x8B1D  # <CJK>
+0x3C56 0x8ECA  # <CJK>
+0x3C57 0x906E  # <CJK>
+0x3C58 0x86C7  # <CJK>
+0x3C59 0x90AA  # <CJK>
+0x3C5A 0x501F  # <CJK>
+0x3C5B 0x52FA  # <CJK>
+0x3C5C 0x5C3A  # <CJK>
+0x3C5D 0x6753  # <CJK>
+0x3C5E 0x707C  # <CJK>
+0x3C5F 0x7235  # <CJK>
+0x3C60 0x914C  # <CJK>
+0x3C61 0x91C8  # <CJK>
+0x3C62 0x932B  # <CJK>
+0x3C63 0x82E5  # <CJK>
+0x3C64 0x5BC2  # <CJK>
+0x3C65 0x5F31  # <CJK>
+0x3C66 0x60F9  # <CJK>
+0x3C67 0x4E3B  # <CJK>
+0x3C68 0x53D6  # <CJK>
+0x3C69 0x5B88  # <CJK>
+0x3C6A 0x624B  # <CJK>
+0x3C6B 0x6731  # <CJK>
+0x3C6C 0x6B8A  # <CJK>
+0x3C6D 0x72E9  # <CJK>
+0x3C6E 0x73E0  # <CJK>
+0x3C6F 0x7A2E  # <CJK>
+0x3C70 0x816B  # <CJK>
+0x3C71 0x8DA3  # <CJK>
+0x3C72 0x9152  # <CJK>
+0x3C73 0x9996  # <CJK>
+0x3C74 0x5112  # <CJK>
+0x3C75 0x53D7  # <CJK>
+0x3C76 0x546A  # <CJK>
+0x3C77 0x5BFF  # <CJK>
+0x3C78 0x6388  # <CJK>
+0x3C79 0x6A39  # <CJK>
+0x3C7A 0x7DAC  # <CJK>
+0x3C7B 0x9700  # <CJK>
+0x3C7C 0x56DA  # <CJK>
+0x3C7D 0x53CE  # <CJK>
+0x3C7E 0x5468  # <CJK>
+0x3D21 0x5B97  # <CJK>
+0x3D22 0x5C31  # <CJK>
+0x3D23 0x5DDE  # <CJK>
+0x3D24 0x4FEE  # <CJK>
+0x3D25 0x6101  # <CJK>
+0x3D26 0x62FE  # <CJK>
+0x3D27 0x6D32  # <CJK>
+0x3D28 0x79C0  # <CJK>
+0x3D29 0x79CB  # <CJK>
+0x3D2A 0x7D42  # <CJK>
+0x3D2B 0x7E4D  # <CJK>
+0x3D2C 0x7FD2  # <CJK>
+0x3D2D 0x81ED  # <CJK>
+0x3D2E 0x821F  # <CJK>
+0x3D2F 0x8490  # <CJK>
+0x3D30 0x8846  # <CJK>
+0x3D31 0x8972  # <CJK>
+0x3D32 0x8B90  # <CJK>
+0x3D33 0x8E74  # <CJK>
+0x3D34 0x8F2F  # <CJK>
+0x3D35 0x9031  # <CJK>
+0x3D36 0x914B  # <CJK>
+0x3D37 0x916C  # <CJK>
+0x3D38 0x96C6  # <CJK>
+0x3D39 0x919C  # <CJK>
+0x3D3A 0x4EC0  # <CJK>
+0x3D3B 0x4F4F  # <CJK>
+0x3D3C 0x5145  # <CJK>
+0x3D3D 0x5341  # <CJK>
+0x3D3E 0x5F93  # <CJK>
+0x3D3F 0x620E  # <CJK>
+0x3D40 0x67D4  # <CJK>
+0x3D41 0x6C41  # <CJK>
+0x3D42 0x6E0B  # <CJK>
+0x3D43 0x7363  # <CJK>
+0x3D44 0x7E26  # <CJK>
+0x3D45 0x91CD  # <CJK>
+0x3D46 0x9283  # <CJK>
+0x3D47 0x53D4  # <CJK>
+0x3D48 0x5919  # <CJK>
+0x3D49 0x5BBF  # <CJK>
+0x3D4A 0x6DD1  # <CJK>
+0x3D4B 0x795D  # <CJK>
+0x3D4C 0x7E2E  # <CJK>
+0x3D4D 0x7C9B  # <CJK>
+0x3D4E 0x587E  # <CJK>
+0x3D4F 0x719F  # <CJK>
+0x3D50 0x51FA  # <CJK>
+0x3D51 0x8853  # <CJK>
+0x3D52 0x8FF0  # <CJK>
+0x3D53 0x4FCA  # <CJK>
+0x3D54 0x5CFB  # <CJK>
+0x3D55 0x6625  # <CJK>
+0x3D56 0x77AC  # <CJK>
+0x3D57 0x7AE3  # <CJK>
+0x3D58 0x821C  # <CJK>
+0x3D59 0x99FF  # <CJK>
+0x3D5A 0x51C6  # <CJK>
+0x3D5B 0x5FAA  # <CJK>
+0x3D5C 0x65EC  # <CJK>
+0x3D5D 0x696F  # <CJK>
+0x3D5E 0x6B89  # <CJK>
+0x3D5F 0x6DF3  # <CJK>
+0x3D60 0x6E96  # <CJK>
+0x3D61 0x6F64  # <CJK>
+0x3D62 0x76FE  # <CJK>
+0x3D63 0x7D14  # <CJK>
+0x3D64 0x5DE1  # <CJK>
+0x3D65 0x9075  # <CJK>
+0x3D66 0x9187  # <CJK>
+0x3D67 0x9806  # <CJK>
+0x3D68 0x51E6  # <CJK>
+0x3D69 0x521D  # <CJK>
+0x3D6A 0x6240  # <CJK>
+0x3D6B 0x6691  # <CJK>
+0x3D6C 0x66D9  # <CJK>
+0x3D6D 0x6E1A  # <CJK>
+0x3D6E 0x5EB6  # <CJK>
+0x3D6F 0x7DD2  # <CJK>
+0x3D70 0x7F72  # <CJK>
+0x3D71 0x66F8  # <CJK>
+0x3D72 0x85AF  # <CJK>
+0x3D73 0x85F7  # <CJK>
+0x3D74 0x8AF8  # <CJK>
+0x3D75 0x52A9  # <CJK>
+0x3D76 0x53D9  # <CJK>
+0x3D77 0x5973  # <CJK>
+0x3D78 0x5E8F  # <CJK>
+0x3D79 0x5F90  # <CJK>
+0x3D7A 0x6055  # <CJK>
+0x3D7B 0x92E4  # <CJK>
+0x3D7C 0x9664  # <CJK>
+0x3D7D 0x50B7  # <CJK>
+0x3D7E 0x511F  # <CJK>
+0x3E21 0x52DD  # <CJK>
+0x3E22 0x5320  # <CJK>
+0x3E23 0x5347  # <CJK>
+0x3E24 0x53EC  # <CJK>
+0x3E25 0x54E8  # <CJK>
+0x3E26 0x5546  # <CJK>
+0x3E27 0x5531  # <CJK>
+0x3E28 0x5617  # <CJK>
+0x3E29 0x5968  # <CJK>
+0x3E2A 0x59BE  # <CJK>
+0x3E2B 0x5A3C  # <CJK>
+0x3E2C 0x5BB5  # <CJK>
+0x3E2D 0x5C06  # <CJK>
+0x3E2E 0x5C0F  # <CJK>
+0x3E2F 0x5C11  # <CJK>
+0x3E30 0x5C1A  # <CJK>
+0x3E31 0x5E84  # <CJK>
+0x3E32 0x5E8A  # <CJK>
+0x3E33 0x5EE0  # <CJK>
+0x3E34 0x5F70  # <CJK>
+0x3E35 0x627F  # <CJK>
+0x3E36 0x6284  # <CJK>
+0x3E37 0x62DB  # <CJK>
+0x3E38 0x638C  # <CJK>
+0x3E39 0x6377  # <CJK>
+0x3E3A 0x6607  # <CJK>
+0x3E3B 0x660C  # <CJK>
+0x3E3C 0x662D  # <CJK>
+0x3E3D 0x6676  # <CJK>
+0x3E3E 0x677E  # <CJK>
+0x3E3F 0x68A2  # <CJK>
+0x3E40 0x6A1F  # <CJK>
+0x3E41 0x6A35  # <CJK>
+0x3E42 0x6CBC  # <CJK>
+0x3E43 0x6D88  # <CJK>
+0x3E44 0x6E09  # <CJK>
+0x3E45 0x6E58  # <CJK>
+0x3E46 0x713C  # <CJK>
+0x3E47 0x7126  # <CJK>
+0x3E48 0x7167  # <CJK>
+0x3E49 0x75C7  # <CJK>
+0x3E4A 0x7701  # <CJK>
+0x3E4B 0x785D  # <CJK>
+0x3E4C 0x7901  # <CJK>
+0x3E4D 0x7965  # <CJK>
+0x3E4E 0x79F0  # <CJK>
+0x3E4F 0x7AE0  # <CJK>
+0x3E50 0x7B11  # <CJK>
+0x3E51 0x7CA7  # <CJK>
+0x3E52 0x7D39  # <CJK>
+0x3E53 0x8096  # <CJK>
+0x3E54 0x83D6  # <CJK>
+0x3E55 0x848B  # <CJK>
+0x3E56 0x8549  # <CJK>
+0x3E57 0x885D  # <CJK>
+0x3E58 0x88F3  # <CJK>
+0x3E59 0x8A1F  # <CJK>
+0x3E5A 0x8A3C  # <CJK>
+0x3E5B 0x8A54  # <CJK>
+0x3E5C 0x8A73  # <CJK>
+0x3E5D 0x8C61  # <CJK>
+0x3E5E 0x8CDE  # <CJK>
+0x3E5F 0x91A4  # <CJK>
+0x3E60 0x9266  # <CJK>
+0x3E61 0x937E  # <CJK>
+0x3E62 0x9418  # <CJK>
+0x3E63 0x969C  # <CJK>
+0x3E64 0x9798  # <CJK>
+0x3E65 0x4E0A  # <CJK>
+0x3E66 0x4E08  # <CJK>
+0x3E67 0x4E1E  # <CJK>
+0x3E68 0x4E57  # <CJK>
+0x3E69 0x5197  # <CJK>
+0x3E6A 0x5270  # <CJK>
+0x3E6B 0x57CE  # <CJK>
+0x3E6C 0x5834  # <CJK>
+0x3E6D 0x58CC  # <CJK>
+0x3E6E 0x5B22  # <CJK>
+0x3E6F 0x5E38  # <CJK>
+0x3E70 0x60C5  # <CJK>
+0x3E71 0x64FE  # <CJK>
+0x3E72 0x6761  # <CJK>
+0x3E73 0x6756  # <CJK>
+0x3E74 0x6D44  # <CJK>
+0x3E75 0x72B6  # <CJK>
+0x3E76 0x7573  # <CJK>
+0x3E77 0x7A63  # <CJK>
+0x3E78 0x84B8  # <CJK>
+0x3E79 0x8B72  # <CJK>
+0x3E7A 0x91B8  # <CJK>
+0x3E7B 0x9320  # <CJK>
+0x3E7C 0x5631  # <CJK>
+0x3E7D 0x57F4  # <CJK>
+0x3E7E 0x98FE  # <CJK>
+0x3F21 0x62ED  # <CJK>
+0x3F22 0x690D  # <CJK>
+0x3F23 0x6B96  # <CJK>
+0x3F24 0x71ED  # <CJK>
+0x3F25 0x7E54  # <CJK>
+0x3F26 0x8077  # <CJK>
+0x3F27 0x8272  # <CJK>
+0x3F28 0x89E6  # <CJK>
+0x3F29 0x98DF  # <CJK>
+0x3F2A 0x8755  # <CJK>
+0x3F2B 0x8FB1  # <CJK>
+0x3F2C 0x5C3B  # <CJK>
+0x3F2D 0x4F38  # <CJK>
+0x3F2E 0x4FE1  # <CJK>
+0x3F2F 0x4FB5  # <CJK>
+0x3F30 0x5507  # <CJK>
+0x3F31 0x5A20  # <CJK>
+0x3F32 0x5BDD  # <CJK>
+0x3F33 0x5BE9  # <CJK>
+0x3F34 0x5FC3  # <CJK>
+0x3F35 0x614E  # <CJK>
+0x3F36 0x632F  # <CJK>
+0x3F37 0x65B0  # <CJK>
+0x3F38 0x664B  # <CJK>
+0x3F39 0x68EE  # <CJK>
+0x3F3A 0x699B  # <CJK>
+0x3F3B 0x6D78  # <CJK>
+0x3F3C 0x6DF1  # <CJK>
+0x3F3D 0x7533  # <CJK>
+0x3F3E 0x75B9  # <CJK>
+0x3F3F 0x771F  # <CJK>
+0x3F40 0x795E  # <CJK>
+0x3F41 0x79E6  # <CJK>
+0x3F42 0x7D33  # <CJK>
+0x3F43 0x81E3  # <CJK>
+0x3F44 0x82AF  # <CJK>
+0x3F45 0x85AA  # <CJK>
+0x3F46 0x89AA  # <CJK>
+0x3F47 0x8A3A  # <CJK>
+0x3F48 0x8EAB  # <CJK>
+0x3F49 0x8F9B  # <CJK>
+0x3F4A 0x9032  # <CJK>
+0x3F4B 0x91DD  # <CJK>
+0x3F4C 0x9707  # <CJK>
+0x3F4D 0x4EBA  # <CJK>
+0x3F4E 0x4EC1  # <CJK>
+0x3F4F 0x5203  # <CJK>
+0x3F50 0x5875  # <CJK>
+0x3F51 0x58EC  # <CJK>
+0x3F52 0x5C0B  # <CJK>
+0x3F53 0x751A  # <CJK>
+0x3F54 0x5C3D  # <CJK>
+0x3F55 0x814E  # <CJK>
+0x3F56 0x8A0A  # <CJK>
+0x3F57 0x8FC5  # <CJK>
+0x3F58 0x9663  # <CJK>
+0x3F59 0x976D  # <CJK>
+0x3F5A 0x7B25  # <CJK>
+0x3F5B 0x8ACF  # <CJK>
+0x3F5C 0x9808  # <CJK>
+0x3F5D 0x9162  # <CJK>
+0x3F5E 0x56F3  # <CJK>
+0x3F5F 0x53A8  # <CJK>
+0x3F60 0x9017  # <CJK>
+0x3F61 0x5439  # <CJK>
+0x3F62 0x5782  # <CJK>
+0x3F63 0x5E25  # <CJK>
+0x3F64 0x63A8  # <CJK>
+0x3F65 0x6C34  # <CJK>
+0x3F66 0x708A  # <CJK>
+0x3F67 0x7761  # <CJK>
+0x3F68 0x7C8B  # <CJK>
+0x3F69 0x7FE0  # <CJK>
+0x3F6A 0x8870  # <CJK>
+0x3F6B 0x9042  # <CJK>
+0x3F6C 0x9154  # <CJK>
+0x3F6D 0x9310  # <CJK>
+0x3F6E 0x9318  # <CJK>
+0x3F6F 0x968F  # <CJK>
+0x3F70 0x745E  # <CJK>
+0x3F71 0x9AC4  # <CJK>
+0x3F72 0x5D07  # <CJK>
+0x3F73 0x5D69  # <CJK>
+0x3F74 0x6570  # <CJK>
+0x3F75 0x67A2  # <CJK>
+0x3F76 0x8DA8  # <CJK>
+0x3F77 0x96DB  # <CJK>
+0x3F78 0x636E  # <CJK>
+0x3F79 0x6749  # <CJK>
+0x3F7A 0x6919  # <CJK>
+0x3F7B 0x83C5  # <CJK>
+0x3F7C 0x9817  # <CJK>
+0x3F7D 0x96C0  # <CJK>
+0x3F7E 0x88FE  # <CJK>
+0x4021 0x6F84  # <CJK>
+0x4022 0x647A  # <CJK>
+0x4023 0x5BF8  # <CJK>
+0x4024 0x4E16  # <CJK>
+0x4025 0x702C  # <CJK>
+0x4026 0x755D  # <CJK>
+0x4027 0x662F  # <CJK>
+0x4028 0x51C4  # <CJK>
+0x4029 0x5236  # <CJK>
+0x402A 0x52E2  # <CJK>
+0x402B 0x59D3  # <CJK>
+0x402C 0x5F81  # <CJK>
+0x402D 0x6027  # <CJK>
+0x402E 0x6210  # <CJK>
+0x402F 0x653F  # <CJK>
+0x4030 0x6574  # <CJK>
+0x4031 0x661F  # <CJK>
+0x4032 0x6674  # <CJK>
+0x4033 0x68F2  # <CJK>
+0x4034 0x6816  # <CJK>
+0x4035 0x6B63  # <CJK>
+0x4036 0x6E05  # <CJK>
+0x4037 0x7272  # <CJK>
+0x4038 0x751F  # <CJK>
+0x4039 0x76DB  # <CJK>
+0x403A 0x7CBE  # <CJK>
+0x403B 0x8056  # <CJK>
+0x403C 0x58F0  # <CJK>
+0x403D 0x88FD  # <CJK>
+0x403E 0x897F  # <CJK>
+0x403F 0x8AA0  # <CJK>
+0x4040 0x8A93  # <CJK>
+0x4041 0x8ACB  # <CJK>
+0x4042 0x901D  # <CJK>
+0x4043 0x9192  # <CJK>
+0x4044 0x9752  # <CJK>
+0x4045 0x9759  # <CJK>
+0x4046 0x6589  # <CJK>
+0x4047 0x7A0E  # <CJK>
+0x4048 0x8106  # <CJK>
+0x4049 0x96BB  # <CJK>
+0x404A 0x5E2D  # <CJK>
+0x404B 0x60DC  # <CJK>
+0x404C 0x621A  # <CJK>
+0x404D 0x65A5  # <CJK>
+0x404E 0x6614  # <CJK>
+0x404F 0x6790  # <CJK>
+0x4050 0x77F3  # <CJK>
+0x4051 0x7A4D  # <CJK>
+0x4052 0x7C4D  # <CJK>
+0x4053 0x7E3E  # <CJK>
+0x4054 0x810A  # <CJK>
+0x4055 0x8CAC  # <CJK>
+0x4056 0x8D64  # <CJK>
+0x4057 0x8DE1  # <CJK>
+0x4058 0x8E5F  # <CJK>
+0x4059 0x78A9  # <CJK>
+0x405A 0x5207  # <CJK>
+0x405B 0x62D9  # <CJK>
+0x405C 0x63A5  # <CJK>
+0x405D 0x6442  # <CJK>
+0x405E 0x6298  # <CJK>
+0x405F 0x8A2D  # <CJK>
+0x4060 0x7A83  # <CJK>
+0x4061 0x7BC0  # <CJK>
+0x4062 0x8AAC  # <CJK>
+0x4063 0x96EA  # <CJK>
+0x4064 0x7D76  # <CJK>
+0x4065 0x820C  # <CJK>
+0x4066 0x8749  # <CJK>
+0x4067 0x4ED9  # <CJK>
+0x4068 0x5148  # <CJK>
+0x4069 0x5343  # <CJK>
+0x406A 0x5360  # <CJK>
+0x406B 0x5BA3  # <CJK>
+0x406C 0x5C02  # <CJK>
+0x406D 0x5C16  # <CJK>
+0x406E 0x5DDD  # <CJK>
+0x406F 0x6226  # <CJK>
+0x4070 0x6247  # <CJK>
+0x4071 0x64B0  # <CJK>
+0x4072 0x6813  # <CJK>
+0x4073 0x6834  # <CJK>
+0x4074 0x6CC9  # <CJK>
+0x4075 0x6D45  # <CJK>
+0x4076 0x6D17  # <CJK>
+0x4077 0x67D3  # <CJK>
+0x4078 0x6F5C  # <CJK>
+0x4079 0x714E  # <CJK>
+0x407A 0x717D  # <CJK>
+0x407B 0x65CB  # <CJK>
+0x407C 0x7A7F  # <CJK>
+0x407D 0x7BAD  # <CJK>
+0x407E 0x7DDA  # <CJK>
+0x4121 0x7E4A  # <CJK>
+0x4122 0x7FA8  # <CJK>
+0x4123 0x817A  # <CJK>
+0x4124 0x821B  # <CJK>
+0x4125 0x8239  # <CJK>
+0x4126 0x85A6  # <CJK>
+0x4127 0x8A6E  # <CJK>
+0x4128 0x8CCE  # <CJK>
+0x4129 0x8DF5  # <CJK>
+0x412A 0x9078  # <CJK>
+0x412B 0x9077  # <CJK>
+0x412C 0x92AD  # <CJK>
+0x412D 0x9291  # <CJK>
+0x412E 0x9583  # <CJK>
+0x412F 0x9BAE  # <CJK>
+0x4130 0x524D  # <CJK>
+0x4131 0x5584  # <CJK>
+0x4132 0x6F38  # <CJK>
+0x4133 0x7136  # <CJK>
+0x4134 0x5168  # <CJK>
+0x4135 0x7985  # <CJK>
+0x4136 0x7E55  # <CJK>
+0x4137 0x81B3  # <CJK>
+0x4138 0x7CCE  # <CJK>
+0x4139 0x564C  # <CJK>
+0x413A 0x5851  # <CJK>
+0x413B 0x5CA8  # <CJK>
+0x413C 0x63AA  # <CJK>
+0x413D 0x66FE  # <CJK>
+0x413E 0x66FD  # <CJK>
+0x413F 0x695A  # <CJK>
+0x4140 0x72D9  # <CJK>
+0x4141 0x758F  # <CJK>
+0x4142 0x758E  # <CJK>
+0x4143 0x790E  # <CJK>
+0x4144 0x7956  # <CJK>
+0x4145 0x79DF  # <CJK>
+0x4146 0x7C97  # <CJK>
+0x4147 0x7D20  # <CJK>
+0x4148 0x7D44  # <CJK>
+0x4149 0x8607  # <CJK>
+0x414A 0x8A34  # <CJK>
+0x414B 0x963B  # <CJK>
+0x414C 0x9061  # <CJK>
+0x414D 0x9F20  # <CJK>
+0x414E 0x50E7  # <CJK>
+0x414F 0x5275  # <CJK>
+0x4150 0x53CC  # <CJK>
+0x4151 0x53E2  # <CJK>
+0x4152 0x5009  # <CJK>
+0x4153 0x55AA  # <CJK>
+0x4154 0x58EE  # <CJK>
+0x4155 0x594F  # <CJK>
+0x4156 0x723D  # <CJK>
+0x4157 0x5B8B  # <CJK>
+0x4158 0x5C64  # <CJK>
+0x4159 0x531D  # <CJK>
+0x415A 0x60E3  # <CJK>
+0x415B 0x60F3  # <CJK>
+0x415C 0x635C  # <CJK>
+0x415D 0x6383  # <CJK>
+0x415E 0x633F  # <CJK>
+0x415F 0x63BB  # <CJK>
+0x4160 0x64CD  # <CJK>
+0x4161 0x65E9  # <CJK>
+0x4162 0x66F9  # <CJK>
+0x4163 0x5DE3  # <CJK>
+0x4164 0x69CD  # <CJK>
+0x4165 0x69FD  # <CJK>
+0x4166 0x6F15  # <CJK>
+0x4167 0x71E5  # <CJK>
+0x4168 0x4E89  # <CJK>
+0x4169 0x75E9  # <CJK>
+0x416A 0x76F8  # <CJK>
+0x416B 0x7A93  # <CJK>
+0x416C 0x7CDF  # <CJK>
+0x416D 0x7DCF  # <CJK>
+0x416E 0x7D9C  # <CJK>
+0x416F 0x8061  # <CJK>
+0x4170 0x8349  # <CJK>
+0x4171 0x8358  # <CJK>
+0x4172 0x846C  # <CJK>
+0x4173 0x84BC  # <CJK>
+0x4174 0x85FB  # <CJK>
+0x4175 0x88C5  # <CJK>
+0x4176 0x8D70  # <CJK>
+0x4177 0x9001  # <CJK>
+0x4178 0x906D  # <CJK>
+0x4179 0x9397  # <CJK>
+0x417A 0x971C  # <CJK>
+0x417B 0x9A12  # <CJK>
+0x417C 0x50CF  # <CJK>
+0x417D 0x5897  # <CJK>
+0x417E 0x618E  # <CJK>
+0x4221 0x81D3  # <CJK>
+0x4222 0x8535  # <CJK>
+0x4223 0x8D08  # <CJK>
+0x4224 0x9020  # <CJK>
+0x4225 0x4FC3  # <CJK>
+0x4226 0x5074  # <CJK>
+0x4227 0x5247  # <CJK>
+0x4228 0x5373  # <CJK>
+0x4229 0x606F  # <CJK>
+0x422A 0x6349  # <CJK>
+0x422B 0x675F  # <CJK>
+0x422C 0x6E2C  # <CJK>
+0x422D 0x8DB3  # <CJK>
+0x422E 0x901F  # <CJK>
+0x422F 0x4FD7  # <CJK>
+0x4230 0x5C5E  # <CJK>
+0x4231 0x8CCA  # <CJK>
+0x4232 0x65CF  # <CJK>
+0x4233 0x7D9A  # <CJK>
+0x4234 0x5352  # <CJK>
+0x4235 0x8896  # <CJK>
+0x4236 0x5176  # <CJK>
+0x4237 0x63C3  # <CJK>
+0x4238 0x5B58  # <CJK>
+0x4239 0x5B6B  # <CJK>
+0x423A 0x5C0A  # <CJK>
+0x423B 0x640D  # <CJK>
+0x423C 0x6751  # <CJK>
+0x423D 0x905C  # <CJK>
+0x423E 0x4ED6  # <CJK>
+0x423F 0x591A  # <CJK>
+0x4240 0x592A  # <CJK>
+0x4241 0x6C70  # <CJK>
+0x4242 0x8A51  # <CJK>
+0x4243 0x553E  # <CJK>
+0x4244 0x5815  # <CJK>
+0x4245 0x59A5  # <CJK>
+0x4246 0x60F0  # <CJK>
+0x4247 0x6253  # <CJK>
+0x4248 0x67C1  # <CJK>
+0x4249 0x8235  # <CJK>
+0x424A 0x6955  # <CJK>
+0x424B 0x9640  # <CJK>
+0x424C 0x99C4  # <CJK>
+0x424D 0x9A28  # <CJK>
+0x424E 0x4F53  # <CJK>
+0x424F 0x5806  # <CJK>
+0x4250 0x5BFE  # <CJK>
+0x4251 0x8010  # <CJK>
+0x4252 0x5CB1  # <CJK>
+0x4253 0x5E2F  # <CJK>
+0x4254 0x5F85  # <CJK>
+0x4255 0x6020  # <CJK>
+0x4256 0x614B  # <CJK>
+0x4257 0x6234  # <CJK>
+0x4258 0x66FF  # <CJK>
+0x4259 0x6CF0  # <CJK>
+0x425A 0x6EDE  # <CJK>
+0x425B 0x80CE  # <CJK>
+0x425C 0x817F  # <CJK>
+0x425D 0x82D4  # <CJK>
+0x425E 0x888B  # <CJK>
+0x425F 0x8CB8  # <CJK>
+0x4260 0x9000  # <CJK>
+0x4261 0x902E  # <CJK>
+0x4262 0x968A  # <CJK>
+0x4263 0x9EDB  # <CJK>
+0x4264 0x9BDB  # <CJK>
+0x4265 0x4EE3  # <CJK>
+0x4266 0x53F0  # <CJK>
+0x4267 0x5927  # <CJK>
+0x4268 0x7B2C  # <CJK>
+0x4269 0x918D  # <CJK>
+0x426A 0x984C  # <CJK>
+0x426B 0x9DF9  # <CJK>
+0x426C 0x6EDD  # <CJK>
+0x426D 0x7027  # <CJK>
+0x426E 0x5353  # <CJK>
+0x426F 0x5544  # <CJK>
+0x4270 0x5B85  # <CJK>
+0x4271 0x6258  # <CJK>
+0x4272 0x629E  # <CJK>
+0x4273 0x62D3  # <CJK>
+0x4274 0x6CA2  # <CJK>
+0x4275 0x6FEF  # <CJK>
+0x4276 0x7422  # <CJK>
+0x4277 0x8A17  # <CJK>
+0x4278 0x9438  # <CJK>
+0x4279 0x6FC1  # <CJK>
+0x427A 0x8AFE  # <CJK>
+0x427B 0x8338  # <CJK>
+0x427C 0x51E7  # <CJK>
+0x427D 0x86F8  # <CJK>
+0x427E 0x53EA  # <CJK>
+0x4321 0x53E9  # <CJK>
+0x4322 0x4F46  # <CJK>
+0x4323 0x9054  # <CJK>
+0x4324 0x8FB0  # <CJK>
+0x4325 0x596A  # <CJK>
+0x4326 0x8131  # <CJK>
+0x4327 0x5DFD  # <CJK>
+0x4328 0x7AEA  # <CJK>
+0x4329 0x8FBF  # <CJK>
+0x432A 0x68DA  # <CJK>
+0x432B 0x8C37  # <CJK>
+0x432C 0x72F8  # <CJK>
+0x432D 0x9C48  # <CJK>
+0x432E 0x6A3D  # <CJK>
+0x432F 0x8AB0  # <CJK>
+0x4330 0x4E39  # <CJK>
+0x4331 0x5358  # <CJK>
+0x4332 0x5606  # <CJK>
+0x4333 0x5766  # <CJK>
+0x4334 0x62C5  # <CJK>
+0x4335 0x63A2  # <CJK>
+0x4336 0x65E6  # <CJK>
+0x4337 0x6B4E  # <CJK>
+0x4338 0x6DE1  # <CJK>
+0x4339 0x6E5B  # <CJK>
+0x433A 0x70AD  # <CJK>
+0x433B 0x77ED  # <CJK>
+0x433C 0x7AEF  # <CJK>
+0x433D 0x7BAA  # <CJK>
+0x433E 0x7DBB  # <CJK>
+0x433F 0x803D  # <CJK>
+0x4340 0x80C6  # <CJK>
+0x4341 0x86CB  # <CJK>
+0x4342 0x8A95  # <CJK>
+0x4343 0x935B  # <CJK>
+0x4344 0x56E3  # <CJK>
+0x4345 0x58C7  # <CJK>
+0x4346 0x5F3E  # <CJK>
+0x4347 0x65AD  # <CJK>
+0x4348 0x6696  # <CJK>
+0x4349 0x6A80  # <CJK>
+0x434A 0x6BB5  # <CJK>
+0x434B 0x7537  # <CJK>
+0x434C 0x8AC7  # <CJK>
+0x434D 0x5024  # <CJK>
+0x434E 0x77E5  # <CJK>
+0x434F 0x5730  # <CJK>
+0x4350 0x5F1B  # <CJK>
+0x4351 0x6065  # <CJK>
+0x4352 0x667A  # <CJK>
+0x4353 0x6C60  # <CJK>
+0x4354 0x75F4  # <CJK>
+0x4355 0x7A1A  # <CJK>
+0x4356 0x7F6E  # <CJK>
+0x4357 0x81F4  # <CJK>
+0x4358 0x8718  # <CJK>
+0x4359 0x9045  # <CJK>
+0x435A 0x99B3  # <CJK>
+0x435B 0x7BC9  # <CJK>
+0x435C 0x755C  # <CJK>
+0x435D 0x7AF9  # <CJK>
+0x435E 0x7B51  # <CJK>
+0x435F 0x84C4  # <CJK>
+0x4360 0x9010  # <CJK>
+0x4361 0x79E9  # <CJK>
+0x4362 0x7A92  # <CJK>
+0x4363 0x8336  # <CJK>
+0x4364 0x5AE1  # <CJK>
+0x4365 0x7740  # <CJK>
+0x4366 0x4E2D  # <CJK>
+0x4367 0x4EF2  # <CJK>
+0x4368 0x5B99  # <CJK>
+0x4369 0x5FE0  # <CJK>
+0x436A 0x62BD  # <CJK>
+0x436B 0x663C  # <CJK>
+0x436C 0x67F1  # <CJK>
+0x436D 0x6CE8  # <CJK>
+0x436E 0x866B  # <CJK>
+0x436F 0x8877  # <CJK>
+0x4370 0x8A3B  # <CJK>
+0x4371 0x914E  # <CJK>
+0x4372 0x92F3  # <CJK>
+0x4373 0x99D0  # <CJK>
+0x4374 0x6A17  # <CJK>
+0x4375 0x7026  # <CJK>
+0x4376 0x732A  # <CJK>
+0x4377 0x82E7  # <CJK>
+0x4378 0x8457  # <CJK>
+0x4379 0x8CAF  # <CJK>
+0x437A 0x4E01  # <CJK>
+0x437B 0x5146  # <CJK>
+0x437C 0x51CB  # <CJK>
+0x437D 0x558B  # <CJK>
+0x437E 0x5BF5  # <CJK>
+0x4421 0x5E16  # <CJK>
+0x4422 0x5E33  # <CJK>
+0x4423 0x5E81  # <CJK>
+0x4424 0x5F14  # <CJK>
+0x4425 0x5F35  # <CJK>
+0x4426 0x5F6B  # <CJK>
+0x4427 0x5FB4  # <CJK>
+0x4428 0x61F2  # <CJK>
+0x4429 0x6311  # <CJK>
+0x442A 0x66A2  # <CJK>
+0x442B 0x671D  # <CJK>
+0x442C 0x6F6E  # <CJK>
+0x442D 0x7252  # <CJK>
+0x442E 0x753A  # <CJK>
+0x442F 0x773A  # <CJK>
+0x4430 0x8074  # <CJK>
+0x4431 0x8139  # <CJK>
+0x4432 0x8178  # <CJK>
+0x4433 0x8776  # <CJK>
+0x4434 0x8ABF  # <CJK>
+0x4435 0x8ADC  # <CJK>
+0x4436 0x8D85  # <CJK>
+0x4437 0x8DF3  # <CJK>
+0x4438 0x929A  # <CJK>
+0x4439 0x9577  # <CJK>
+0x443A 0x9802  # <CJK>
+0x443B 0x9CE5  # <CJK>
+0x443C 0x52C5  # <CJK>
+0x443D 0x6357  # <CJK>
+0x443E 0x76F4  # <CJK>
+0x443F 0x6715  # <CJK>
+0x4440 0x6C88  # <CJK>
+0x4441 0x73CD  # <CJK>
+0x4442 0x8CC3  # <CJK>
+0x4443 0x93AE  # <CJK>
+0x4444 0x9673  # <CJK>
+0x4445 0x6D25  # <CJK>
+0x4446 0x589C  # <CJK>
+0x4447 0x690E  # <CJK>
+0x4448 0x69CC  # <CJK>
+0x4449 0x8FFD  # <CJK>
+0x444A 0x939A  # <CJK>
+0x444B 0x75DB  # <CJK>
+0x444C 0x901A  # <CJK>
+0x444D 0x585A  # <CJK>
+0x444E 0x6802  # <CJK>
+0x444F 0x63B4  # <CJK>
+0x4450 0x69FB  # <CJK>
+0x4451 0x4F43  # <CJK>
+0x4452 0x6F2C  # <CJK>
+0x4453 0x67D8  # <CJK>
+0x4454 0x8FBB  # <CJK>
+0x4455 0x8526  # <CJK>
+0x4456 0x7DB4  # <CJK>
+0x4457 0x9354  # <CJK>
+0x4458 0x693F  # <CJK>
+0x4459 0x6F70  # <CJK>
+0x445A 0x576A  # <CJK>
+0x445B 0x58F7  # <CJK>
+0x445C 0x5B2C  # <CJK>
+0x445D 0x7D2C  # <CJK>
+0x445E 0x722A  # <CJK>
+0x445F 0x540A  # <CJK>
+0x4460 0x91E3  # <CJK>
+0x4461 0x9DB4  # <CJK>
+0x4462 0x4EAD  # <CJK>
+0x4463 0x4F4E  # <CJK>
+0x4464 0x505C  # <CJK>
+0x4465 0x5075  # <CJK>
+0x4466 0x5243  # <CJK>
+0x4467 0x8C9E  # <CJK>
+0x4468 0x5448  # <CJK>
+0x4469 0x5824  # <CJK>
+0x446A 0x5B9A  # <CJK>
+0x446B 0x5E1D  # <CJK>
+0x446C 0x5E95  # <CJK>
+0x446D 0x5EAD  # <CJK>
+0x446E 0x5EF7  # <CJK>
+0x446F 0x5F1F  # <CJK>
+0x4470 0x608C  # <CJK>
+0x4471 0x62B5  # <CJK>
+0x4472 0x633A  # <CJK>
+0x4473 0x63D0  # <CJK>
+0x4474 0x68AF  # <CJK>
+0x4475 0x6C40  # <CJK>
+0x4476 0x7887  # <CJK>
+0x4477 0x798E  # <CJK>
+0x4478 0x7A0B  # <CJK>
+0x4479 0x7DE0  # <CJK>
+0x447A 0x8247  # <CJK>
+0x447B 0x8A02  # <CJK>
+0x447C 0x8AE6  # <CJK>
+0x447D 0x8E44  # <CJK>
+0x447E 0x9013  # <CJK>
+0x4521 0x90B8  # <CJK>
+0x4522 0x912D  # <CJK>
+0x4523 0x91D8  # <CJK>
+0x4524 0x9F0E  # <CJK>
+0x4525 0x6CE5  # <CJK>
+0x4526 0x6458  # <CJK>
+0x4527 0x64E2  # <CJK>
+0x4528 0x6575  # <CJK>
+0x4529 0x6EF4  # <CJK>
+0x452A 0x7684  # <CJK>
+0x452B 0x7B1B  # <CJK>
+0x452C 0x9069  # <CJK>
+0x452D 0x93D1  # <CJK>
+0x452E 0x6EBA  # <CJK>
+0x452F 0x54F2  # <CJK>
+0x4530 0x5FB9  # <CJK>
+0x4531 0x64A4  # <CJK>
+0x4532 0x8F4D  # <CJK>
+0x4533 0x8FED  # <CJK>
+0x4534 0x9244  # <CJK>
+0x4535 0x5178  # <CJK>
+0x4536 0x586B  # <CJK>
+0x4537 0x5929  # <CJK>
+0x4538 0x5C55  # <CJK>
+0x4539 0x5E97  # <CJK>
+0x453A 0x6DFB  # <CJK>
+0x453B 0x7E8F  # <CJK>
+0x453C 0x751C  # <CJK>
+0x453D 0x8CBC  # <CJK>
+0x453E 0x8EE2  # <CJK>
+0x453F 0x985B  # <CJK>
+0x4540 0x70B9  # <CJK>
+0x4541 0x4F1D  # <CJK>
+0x4542 0x6BBF  # <CJK>
+0x4543 0x6FB1  # <CJK>
+0x4544 0x7530  # <CJK>
+0x4545 0x96FB  # <CJK>
+0x4546 0x514E  # <CJK>
+0x4547 0x5410  # <CJK>
+0x4548 0x5835  # <CJK>
+0x4549 0x5857  # <CJK>
+0x454A 0x59AC  # <CJK>
+0x454B 0x5C60  # <CJK>
+0x454C 0x5F92  # <CJK>
+0x454D 0x6597  # <CJK>
+0x454E 0x675C  # <CJK>
+0x454F 0x6E21  # <CJK>
+0x4550 0x767B  # <CJK>
+0x4551 0x83DF  # <CJK>
+0x4552 0x8CED  # <CJK>
+0x4553 0x9014  # <CJK>
+0x4554 0x90FD  # <CJK>
+0x4555 0x934D  # <CJK>
+0x4556 0x7825  # <CJK>
+0x4557 0x783A  # <CJK>
+0x4558 0x52AA  # <CJK>
+0x4559 0x5EA6  # <CJK>
+0x455A 0x571F  # <CJK>
+0x455B 0x5974  # <CJK>
+0x455C 0x6012  # <CJK>
+0x455D 0x5012  # <CJK>
+0x455E 0x515A  # <CJK>
+0x455F 0x51AC  # <CJK>
+0x4560 0x51CD  # <CJK>
+0x4561 0x5200  # <CJK>
+0x4562 0x5510  # <CJK>
+0x4563 0x5854  # <CJK>
+0x4564 0x5858  # <CJK>
+0x4565 0x5957  # <CJK>
+0x4566 0x5B95  # <CJK>
+0x4567 0x5CF6  # <CJK>
+0x4568 0x5D8B  # <CJK>
+0x4569 0x60BC  # <CJK>
+0x456A 0x6295  # <CJK>
+0x456B 0x642D  # <CJK>
+0x456C 0x6771  # <CJK>
+0x456D 0x6843  # <CJK>
+0x456E 0x68BC  # <CJK>
+0x456F 0x68DF  # <CJK>
+0x4570 0x76D7  # <CJK>
+0x4571 0x6DD8  # <CJK>
+0x4572 0x6E6F  # <CJK>
+0x4573 0x6D9B  # <CJK>
+0x4574 0x706F  # <CJK>
+0x4575 0x71C8  # <CJK>
+0x4576 0x5F53  # <CJK>
+0x4577 0x75D8  # <CJK>
+0x4578 0x7977  # <CJK>
+0x4579 0x7B49  # <CJK>
+0x457A 0x7B54  # <CJK>
+0x457B 0x7B52  # <CJK>
+0x457C 0x7CD6  # <CJK>
+0x457D 0x7D71  # <CJK>
+0x457E 0x5230  # <CJK>
+0x4621 0x8463  # <CJK>
+0x4622 0x8569  # <CJK>
+0x4623 0x85E4  # <CJK>
+0x4624 0x8A0E  # <CJK>
+0x4625 0x8B04  # <CJK>
+0x4626 0x8C46  # <CJK>
+0x4627 0x8E0F  # <CJK>
+0x4628 0x9003  # <CJK>
+0x4629 0x900F  # <CJK>
+0x462A 0x9419  # <CJK>
+0x462B 0x9676  # <CJK>
+0x462C 0x982D  # <CJK>
+0x462D 0x9A30  # <CJK>
+0x462E 0x95D8  # <CJK>
+0x462F 0x50CD  # <CJK>
+0x4630 0x52D5  # <CJK>
+0x4631 0x540C  # <CJK>
+0x4632 0x5802  # <CJK>
+0x4633 0x5C0E  # <CJK>
+0x4634 0x61A7  # <CJK>
+0x4635 0x649E  # <CJK>
+0x4636 0x6D1E  # <CJK>
+0x4637 0x77B3  # <CJK>
+0x4638 0x7AE5  # <CJK>
+0x4639 0x80F4  # <CJK>
+0x463A 0x8404  # <CJK>
+0x463B 0x9053  # <CJK>
+0x463C 0x9285  # <CJK>
+0x463D 0x5CE0  # <CJK>
+0x463E 0x9D07  # <CJK>
+0x463F 0x533F  # <CJK>
+0x4640 0x5F97  # <CJK>
+0x4641 0x5FB3  # <CJK>
+0x4642 0x6D9C  # <CJK>
+0x4643 0x7279  # <CJK>
+0x4644 0x7763  # <CJK>
+0x4645 0x79BF  # <CJK>
+0x4646 0x7BE4  # <CJK>
+0x4647 0x6BD2  # <CJK>
+0x4648 0x72EC  # <CJK>
+0x4649 0x8AAD  # <CJK>
+0x464A 0x6803  # <CJK>
+0x464B 0x6A61  # <CJK>
+0x464C 0x51F8  # <CJK>
+0x464D 0x7A81  # <CJK>
+0x464E 0x6934  # <CJK>
+0x464F 0x5C4A  # <CJK>
+0x4650 0x9CF6  # <CJK>
+0x4651 0x82EB  # <CJK>
+0x4652 0x5BC5  # <CJK>
+0x4653 0x9149  # <CJK>
+0x4654 0x701E  # <CJK>
+0x4655 0x5678  # <CJK>
+0x4656 0x5C6F  # <CJK>
+0x4657 0x60C7  # <CJK>
+0x4658 0x6566  # <CJK>
+0x4659 0x6C8C  # <CJK>
+0x465A 0x8C5A  # <CJK>
+0x465B 0x9041  # <CJK>
+0x465C 0x9813  # <CJK>
+0x465D 0x5451  # <CJK>
+0x465E 0x66C7  # <CJK>
+0x465F 0x920D  # <CJK>
+0x4660 0x5948  # <CJK>
+0x4661 0x90A3  # <CJK>
+0x4662 0x5185  # <CJK>
+0x4663 0x4E4D  # <CJK>
+0x4664 0x51EA  # <CJK>
+0x4665 0x8599  # <CJK>
+0x4666 0x8B0E  # <CJK>
+0x4667 0x7058  # <CJK>
+0x4668 0x637A  # <CJK>
+0x4669 0x934B  # <CJK>
+0x466A 0x6962  # <CJK>
+0x466B 0x99B4  # <CJK>
+0x466C 0x7E04  # <CJK>
+0x466D 0x7577  # <CJK>
+0x466E 0x5357  # <CJK>
+0x466F 0x6960  # <CJK>
+0x4670 0x8EDF  # <CJK>
+0x4671 0x96E3  # <CJK>
+0x4672 0x6C5D  # <CJK>
+0x4673 0x4E8C  # <CJK>
+0x4674 0x5C3C  # <CJK>
+0x4675 0x5F10  # <CJK>
+0x4676 0x8FE9  # <CJK>
+0x4677 0x5302  # <CJK>
+0x4678 0x8CD1  # <CJK>
+0x4679 0x8089  # <CJK>
+0x467A 0x8679  # <CJK>
+0x467B 0x5EFF  # <CJK>
+0x467C 0x65E5  # <CJK>
+0x467D 0x4E73  # <CJK>
+0x467E 0x5165  # <CJK>
+0x4721 0x5982  # <CJK>
+0x4722 0x5C3F  # <CJK>
+0x4723 0x97EE  # <CJK>
+0x4724 0x4EFB  # <CJK>
+0x4725 0x598A  # <CJK>
+0x4726 0x5FCD  # <CJK>
+0x4727 0x8A8D  # <CJK>
+0x4728 0x6FE1  # <CJK>
+0x4729 0x79B0  # <CJK>
+0x472A 0x7962  # <CJK>
+0x472B 0x5BE7  # <CJK>
+0x472C 0x8471  # <CJK>
+0x472D 0x732B  # <CJK>
+0x472E 0x71B1  # <CJK>
+0x472F 0x5E74  # <CJK>
+0x4730 0x5FF5  # <CJK>
+0x4731 0x637B  # <CJK>
+0x4732 0x649A  # <CJK>
+0x4733 0x71C3  # <CJK>
+0x4734 0x7C98  # <CJK>
+0x4735 0x4E43  # <CJK>
+0x4736 0x5EFC  # <CJK>
+0x4737 0x4E4B  # <CJK>
+0x4738 0x57DC  # <CJK>
+0x4739 0x56A2  # <CJK>
+0x473A 0x60A9  # <CJK>
+0x473B 0x6FC3  # <CJK>
+0x473C 0x7D0D  # <CJK>
+0x473D 0x80FD  # <CJK>
+0x473E 0x8133  # <CJK>
+0x473F 0x81BF  # <CJK>
+0x4740 0x8FB2  # <CJK>
+0x4741 0x8997  # <CJK>
+0x4742 0x86A4  # <CJK>
+0x4743 0x5DF4  # <CJK>
+0x4744 0x628A  # <CJK>
+0x4745 0x64AD  # <CJK>
+0x4746 0x8987  # <CJK>
+0x4747 0x6777  # <CJK>
+0x4748 0x6CE2  # <CJK>
+0x4749 0x6D3E  # <CJK>
+0x474A 0x7436  # <CJK>
+0x474B 0x7834  # <CJK>
+0x474C 0x5A46  # <CJK>
+0x474D 0x7F75  # <CJK>
+0x474E 0x82AD  # <CJK>
+0x474F 0x99AC  # <CJK>
+0x4750 0x4FF3  # <CJK>
+0x4751 0x5EC3  # <CJK>
+0x4752 0x62DD  # <CJK>
+0x4753 0x6392  # <CJK>
+0x4754 0x6557  # <CJK>
+0x4755 0x676F  # <CJK>
+0x4756 0x76C3  # <CJK>
+0x4757 0x724C  # <CJK>
+0x4758 0x80CC  # <CJK>
+0x4759 0x80BA  # <CJK>
+0x475A 0x8F29  # <CJK>
+0x475B 0x914D  # <CJK>
+0x475C 0x500D  # <CJK>
+0x475D 0x57F9  # <CJK>
+0x475E 0x5A92  # <CJK>
+0x475F 0x6885  # <CJK>
+0x4760 0x6973  # <CJK>
+0x4761 0x7164  # <CJK>
+0x4762 0x72FD  # <CJK>
+0x4763 0x8CB7  # <CJK>
+0x4764 0x58F2  # <CJK>
+0x4765 0x8CE0  # <CJK>
+0x4766 0x966A  # <CJK>
+0x4767 0x9019  # <CJK>
+0x4768 0x877F  # <CJK>
+0x4769 0x79E4  # <CJK>
+0x476A 0x77E7  # <CJK>
+0x476B 0x8429  # <CJK>
+0x476C 0x4F2F  # <CJK>
+0x476D 0x5265  # <CJK>
+0x476E 0x535A  # <CJK>
+0x476F 0x62CD  # <CJK>
+0x4770 0x67CF  # <CJK>
+0x4771 0x6CCA  # <CJK>
+0x4772 0x767D  # <CJK>
+0x4773 0x7B94  # <CJK>
+0x4774 0x7C95  # <CJK>
+0x4775 0x8236  # <CJK>
+0x4776 0x8584  # <CJK>
+0x4777 0x8FEB  # <CJK>
+0x4778 0x66DD  # <CJK>
+0x4779 0x6F20  # <CJK>
+0x477A 0x7206  # <CJK>
+0x477B 0x7E1B  # <CJK>
+0x477C 0x83AB  # <CJK>
+0x477D 0x99C1  # <CJK>
+0x477E 0x9EA6  # <CJK>
+0x4821 0x51FD  # <CJK>
+0x4822 0x7BB1  # <CJK>
+0x4823 0x7872  # <CJK>
+0x4824 0x7BB8  # <CJK>
+0x4825 0x8087  # <CJK>
+0x4826 0x7B48  # <CJK>
+0x4827 0x6AE8  # <CJK>
+0x4828 0x5E61  # <CJK>
+0x4829 0x808C  # <CJK>
+0x482A 0x7551  # <CJK>
+0x482B 0x7560  # <CJK>
+0x482C 0x516B  # <CJK>
+0x482D 0x9262  # <CJK>
+0x482E 0x6E8C  # <CJK>
+0x482F 0x767A  # <CJK>
+0x4830 0x9197  # <CJK>
+0x4831 0x9AEA  # <CJK>
+0x4832 0x4F10  # <CJK>
+0x4833 0x7F70  # <CJK>
+0x4834 0x629C  # <CJK>
+0x4835 0x7B4F  # <CJK>
+0x4836 0x95A5  # <CJK>
+0x4837 0x9CE9  # <CJK>
+0x4838 0x567A  # <CJK>
+0x4839 0x5859  # <CJK>
+0x483A 0x86E4  # <CJK>
+0x483B 0x96BC  # <CJK>
+0x483C 0x4F34  # <CJK>
+0x483D 0x5224  # <CJK>
+0x483E 0x534A  # <CJK>
+0x483F 0x53CD  # <CJK>
+0x4840 0x53DB  # <CJK>
+0x4841 0x5E06  # <CJK>
+0x4842 0x642C  # <CJK>
+0x4843 0x6591  # <CJK>
+0x4844 0x677F  # <CJK>
+0x4845 0x6C3E  # <CJK>
+0x4846 0x6C4E  # <CJK>
+0x4847 0x7248  # <CJK>
+0x4848 0x72AF  # <CJK>
+0x4849 0x73ED  # <CJK>
+0x484A 0x7554  # <CJK>
+0x484B 0x7E41  # <CJK>
+0x484C 0x822C  # <CJK>
+0x484D 0x85E9  # <CJK>
+0x484E 0x8CA9  # <CJK>
+0x484F 0x7BC4  # <CJK>
+0x4850 0x91C6  # <CJK>
+0x4851 0x7169  # <CJK>
+0x4852 0x9812  # <CJK>
+0x4853 0x98EF  # <CJK>
+0x4854 0x633D  # <CJK>
+0x4855 0x6669  # <CJK>
+0x4856 0x756A  # <CJK>
+0x4857 0x76E4  # <CJK>
+0x4858 0x78D0  # <CJK>
+0x4859 0x8543  # <CJK>
+0x485A 0x86EE  # <CJK>
+0x485B 0x532A  # <CJK>
+0x485C 0x5351  # <CJK>
+0x485D 0x5426  # <CJK>
+0x485E 0x5983  # <CJK>
+0x485F 0x5E87  # <CJK>
+0x4860 0x5F7C  # <CJK>
+0x4861 0x60B2  # <CJK>
+0x4862 0x6249  # <CJK>
+0x4863 0x6279  # <CJK>
+0x4864 0x62AB  # <CJK>
+0x4865 0x6590  # <CJK>
+0x4866 0x6BD4  # <CJK>
+0x4867 0x6CCC  # <CJK>
+0x4868 0x75B2  # <CJK>
+0x4869 0x76AE  # <CJK>
+0x486A 0x7891  # <CJK>
+0x486B 0x79D8  # <CJK>
+0x486C 0x7DCB  # <CJK>
+0x486D 0x7F77  # <CJK>
+0x486E 0x80A5  # <CJK>
+0x486F 0x88AB  # <CJK>
+0x4870 0x8AB9  # <CJK>
+0x4871 0x8CBB  # <CJK>
+0x4872 0x907F  # <CJK>
+0x4873 0x975E  # <CJK>
+0x4874 0x98DB  # <CJK>
+0x4875 0x6A0B  # <CJK>
+0x4876 0x7C38  # <CJK>
+0x4877 0x5099  # <CJK>
+0x4878 0x5C3E  # <CJK>
+0x4879 0x5FAE  # <CJK>
+0x487A 0x6787  # <CJK>
+0x487B 0x6BD8  # <CJK>
+0x487C 0x7435  # <CJK>
+0x487D 0x7709  # <CJK>
+0x487E 0x7F8E  # <CJK>
+0x4921 0x9F3B  # <CJK>
+0x4922 0x67CA  # <CJK>
+0x4923 0x7A17  # <CJK>
+0x4924 0x5339  # <CJK>
+0x4925 0x758B  # <CJK>
+0x4926 0x9AED  # <CJK>
+0x4927 0x5F66  # <CJK>
+0x4928 0x819D  # <CJK>
+0x4929 0x83F1  # <CJK>
+0x492A 0x8098  # <CJK>
+0x492B 0x5F3C  # <CJK>
+0x492C 0x5FC5  # <CJK>
+0x492D 0x7562  # <CJK>
+0x492E 0x7B46  # <CJK>
+0x492F 0x903C  # <CJK>
+0x4930 0x6867  # <CJK>
+0x4931 0x59EB  # <CJK>
+0x4932 0x5A9B  # <CJK>
+0x4933 0x7D10  # <CJK>
+0x4934 0x767E  # <CJK>
+0x4935 0x8B2C  # <CJK>
+0x4936 0x4FF5  # <CJK>
+0x4937 0x5F6A  # <CJK>
+0x4938 0x6A19  # <CJK>
+0x4939 0x6C37  # <CJK>
+0x493A 0x6F02  # <CJK>
+0x493B 0x74E2  # <CJK>
+0x493C 0x7968  # <CJK>
+0x493D 0x8868  # <CJK>
+0x493E 0x8A55  # <CJK>
+0x493F 0x8C79  # <CJK>
+0x4940 0x5EDF  # <CJK>
+0x4941 0x63CF  # <CJK>
+0x4942 0x75C5  # <CJK>
+0x4943 0x79D2  # <CJK>
+0x4944 0x82D7  # <CJK>
+0x4945 0x9328  # <CJK>
+0x4946 0x92F2  # <CJK>
+0x4947 0x849C  # <CJK>
+0x4948 0x86ED  # <CJK>
+0x4949 0x9C2D  # <CJK>
+0x494A 0x54C1  # <CJK>
+0x494B 0x5F6C  # <CJK>
+0x494C 0x658C  # <CJK>
+0x494D 0x6D5C  # <CJK>
+0x494E 0x7015  # <CJK>
+0x494F 0x8CA7  # <CJK>
+0x4950 0x8CD3  # <CJK>
+0x4951 0x983B  # <CJK>
+0x4952 0x654F  # <CJK>
+0x4953 0x74F6  # <CJK>
+0x4954 0x4E0D  # <CJK>
+0x4955 0x4ED8  # <CJK>
+0x4956 0x57E0  # <CJK>
+0x4957 0x592B  # <CJK>
+0x4958 0x5A66  # <CJK>
+0x4959 0x5BCC  # <CJK>
+0x495A 0x51A8  # <CJK>
+0x495B 0x5E03  # <CJK>
+0x495C 0x5E9C  # <CJK>
+0x495D 0x6016  # <CJK>
+0x495E 0x6276  # <CJK>
+0x495F 0x6577  # <CJK>
+0x4960 0x65A7  # <CJK>
+0x4961 0x666E  # <CJK>
+0x4962 0x6D6E  # <CJK>
+0x4963 0x7236  # <CJK>
+0x4964 0x7B26  # <CJK>
+0x4965 0x8150  # <CJK>
+0x4966 0x819A  # <CJK>
+0x4967 0x8299  # <CJK>
+0x4968 0x8B5C  # <CJK>
+0x4969 0x8CA0  # <CJK>
+0x496A 0x8CE6  # <CJK>
+0x496B 0x8D74  # <CJK>
+0x496C 0x961C  # <CJK>
+0x496D 0x9644  # <CJK>
+0x496E 0x4FAE  # <CJK>
+0x496F 0x64AB  # <CJK>
+0x4970 0x6B66  # <CJK>
+0x4971 0x821E  # <CJK>
+0x4972 0x8461  # <CJK>
+0x4973 0x856A  # <CJK>
+0x4974 0x90E8  # <CJK>
+0x4975 0x5C01  # <CJK>
+0x4976 0x6953  # <CJK>
+0x4977 0x98A8  # <CJK>
+0x4978 0x847A  # <CJK>
+0x4979 0x8557  # <CJK>
+0x497A 0x4F0F  # <CJK>
+0x497B 0x526F  # <CJK>
+0x497C 0x5FA9  # <CJK>
+0x497D 0x5E45  # <CJK>
+0x497E 0x670D  # <CJK>
+0x4A21 0x798F  # <CJK>
+0x4A22 0x8179  # <CJK>
+0x4A23 0x8907  # <CJK>
+0x4A24 0x8986  # <CJK>
+0x4A25 0x6DF5  # <CJK>
+0x4A26 0x5F17  # <CJK>
+0x4A27 0x6255  # <CJK>
+0x4A28 0x6CB8  # <CJK>
+0x4A29 0x4ECF  # <CJK>
+0x4A2A 0x7269  # <CJK>
+0x4A2B 0x9B92  # <CJK>
+0x4A2C 0x5206  # <CJK>
+0x4A2D 0x543B  # <CJK>
+0x4A2E 0x5674  # <CJK>
+0x4A2F 0x58B3  # <CJK>
+0x4A30 0x61A4  # <CJK>
+0x4A31 0x626E  # <CJK>
+0x4A32 0x711A  # <CJK>
+0x4A33 0x596E  # <CJK>
+0x4A34 0x7C89  # <CJK>
+0x4A35 0x7CDE  # <CJK>
+0x4A36 0x7D1B  # <CJK>
+0x4A37 0x96F0  # <CJK>
+0x4A38 0x6587  # <CJK>
+0x4A39 0x805E  # <CJK>
+0x4A3A 0x4E19  # <CJK>
+0x4A3B 0x4F75  # <CJK>
+0x4A3C 0x5175  # <CJK>
+0x4A3D 0x5840  # <CJK>
+0x4A3E 0x5E63  # <CJK>
+0x4A3F 0x5E73  # <CJK>
+0x4A40 0x5F0A  # <CJK>
+0x4A41 0x67C4  # <CJK>
+0x4A42 0x4E26  # <CJK>
+0x4A43 0x853D  # <CJK>
+0x4A44 0x9589  # <CJK>
+0x4A45 0x965B  # <CJK>
+0x4A46 0x7C73  # <CJK>
+0x4A47 0x9801  # <CJK>
+0x4A48 0x50FB  # <CJK>
+0x4A49 0x58C1  # <CJK>
+0x4A4A 0x7656  # <CJK>
+0x4A4B 0x78A7  # <CJK>
+0x4A4C 0x5225  # <CJK>
+0x4A4D 0x77A5  # <CJK>
+0x4A4E 0x8511  # <CJK>
+0x4A4F 0x7B86  # <CJK>
+0x4A50 0x504F  # <CJK>
+0x4A51 0x5909  # <CJK>
+0x4A52 0x7247  # <CJK>
+0x4A53 0x7BC7  # <CJK>
+0x4A54 0x7DE8  # <CJK>
+0x4A55 0x8FBA  # <CJK>
+0x4A56 0x8FD4  # <CJK>
+0x4A57 0x904D  # <CJK>
+0x4A58 0x4FBF  # <CJK>
+0x4A59 0x52C9  # <CJK>
+0x4A5A 0x5A29  # <CJK>
+0x4A5B 0x5F01  # <CJK>
+0x4A5C 0x97AD  # <CJK>
+0x4A5D 0x4FDD  # <CJK>
+0x4A5E 0x8217  # <CJK>
+0x4A5F 0x92EA  # <CJK>
+0x4A60 0x5703  # <CJK>
+0x4A61 0x6355  # <CJK>
+0x4A62 0x6B69  # <CJK>
+0x4A63 0x752B  # <CJK>
+0x4A64 0x88DC  # <CJK>
+0x4A65 0x8F14  # <CJK>
+0x4A66 0x7A42  # <CJK>
+0x4A67 0x52DF  # <CJK>
+0x4A68 0x5893  # <CJK>
+0x4A69 0x6155  # <CJK>
+0x4A6A 0x620A  # <CJK>
+0x4A6B 0x66AE  # <CJK>
+0x4A6C 0x6BCD  # <CJK>
+0x4A6D 0x7C3F  # <CJK>
+0x4A6E 0x83E9  # <CJK>
+0x4A6F 0x5023  # <CJK>
+0x4A70 0x4FF8  # <CJK>
+0x4A71 0x5305  # <CJK>
+0x4A72 0x5446  # <CJK>
+0x4A73 0x5831  # <CJK>
+0x4A74 0x5949  # <CJK>
+0x4A75 0x5B9D  # <CJK>
+0x4A76 0x5CF0  # <CJK>
+0x4A77 0x5CEF  # <CJK>
+0x4A78 0x5D29  # <CJK>
+0x4A79 0x5E96  # <CJK>
+0x4A7A 0x62B1  # <CJK>
+0x4A7B 0x6367  # <CJK>
+0x4A7C 0x653E  # <CJK>
+0x4A7D 0x65B9  # <CJK>
+0x4A7E 0x670B  # <CJK>
+0x4B21 0x6CD5  # <CJK>
+0x4B22 0x6CE1  # <CJK>
+0x4B23 0x70F9  # <CJK>
+0x4B24 0x7832  # <CJK>
+0x4B25 0x7E2B  # <CJK>
+0x4B26 0x80DE  # <CJK>
+0x4B27 0x82B3  # <CJK>
+0x4B28 0x840C  # <CJK>
+0x4B29 0x84EC  # <CJK>
+0x4B2A 0x8702  # <CJK>
+0x4B2B 0x8912  # <CJK>
+0x4B2C 0x8A2A  # <CJK>
+0x4B2D 0x8C4A  # <CJK>
+0x4B2E 0x90A6  # <CJK>
+0x4B2F 0x92D2  # <CJK>
+0x4B30 0x98FD  # <CJK>
+0x4B31 0x9CF3  # <CJK>
+0x4B32 0x9D6C  # <CJK>
+0x4B33 0x4E4F  # <CJK>
+0x4B34 0x4EA1  # <CJK>
+0x4B35 0x508D  # <CJK>
+0x4B36 0x5256  # <CJK>
+0x4B37 0x574A  # <CJK>
+0x4B38 0x59A8  # <CJK>
+0x4B39 0x5E3D  # <CJK>
+0x4B3A 0x5FD8  # <CJK>
+0x4B3B 0x5FD9  # <CJK>
+0x4B3C 0x623F  # <CJK>
+0x4B3D 0x66B4  # <CJK>
+0x4B3E 0x671B  # <CJK>
+0x4B3F 0x67D0  # <CJK>
+0x4B40 0x68D2  # <CJK>
+0x4B41 0x5192  # <CJK>
+0x4B42 0x7D21  # <CJK>
+0x4B43 0x80AA  # <CJK>
+0x4B44 0x81A8  # <CJK>
+0x4B45 0x8B00  # <CJK>
+0x4B46 0x8C8C  # <CJK>
+0x4B47 0x8CBF  # <CJK>
+0x4B48 0x927E  # <CJK>
+0x4B49 0x9632  # <CJK>
+0x4B4A 0x5420  # <CJK>
+0x4B4B 0x982C  # <CJK>
+0x4B4C 0x5317  # <CJK>
+0x4B4D 0x50D5  # <CJK>
+0x4B4E 0x535C  # <CJK>
+0x4B4F 0x58A8  # <CJK>
+0x4B50 0x64B2  # <CJK>
+0x4B51 0x6734  # <CJK>
+0x4B52 0x7267  # <CJK>
+0x4B53 0x7766  # <CJK>
+0x4B54 0x7A46  # <CJK>
+0x4B55 0x91E6  # <CJK>
+0x4B56 0x52C3  # <CJK>
+0x4B57 0x6CA1  # <CJK>
+0x4B58 0x6B86  # <CJK>
+0x4B59 0x5800  # <CJK>
+0x4B5A 0x5E4C  # <CJK>
+0x4B5B 0x5954  # <CJK>
+0x4B5C 0x672C  # <CJK>
+0x4B5D 0x7FFB  # <CJK>
+0x4B5E 0x51E1  # <CJK>
+0x4B5F 0x76C6  # <CJK>
+0x4B60 0x6469  # <CJK>
+0x4B61 0x78E8  # <CJK>
+0x4B62 0x9B54  # <CJK>
+0x4B63 0x9EBB  # <CJK>
+0x4B64 0x57CB  # <CJK>
+0x4B65 0x59B9  # <CJK>
+0x4B66 0x6627  # <CJK>
+0x4B67 0x679A  # <CJK>
+0x4B68 0x6BCE  # <CJK>
+0x4B69 0x54E9  # <CJK>
+0x4B6A 0x69D9  # <CJK>
+0x4B6B 0x5E55  # <CJK>
+0x4B6C 0x819C  # <CJK>
+0x4B6D 0x6795  # <CJK>
+0x4B6E 0x9BAA  # <CJK>
+0x4B6F 0x67FE  # <CJK>
+0x4B70 0x9C52  # <CJK>
+0x4B71 0x685D  # <CJK>
+0x4B72 0x4EA6  # <CJK>
+0x4B73 0x4FE3  # <CJK>
+0x4B74 0x53C8  # <CJK>
+0x4B75 0x62B9  # <CJK>
+0x4B76 0x672B  # <CJK>
+0x4B77 0x6CAB  # <CJK>
+0x4B78 0x8FC4  # <CJK>
+0x4B79 0x4FAD  # <CJK>
+0x4B7A 0x7E6D  # <CJK>
+0x4B7B 0x9EBF  # <CJK>
+0x4B7C 0x4E07  # <CJK>
+0x4B7D 0x6162  # <CJK>
+0x4B7E 0x6E80  # <CJK>
+0x4C21 0x6F2B  # <CJK>
+0x4C22 0x8513  # <CJK>
+0x4C23 0x5473  # <CJK>
+0x4C24 0x672A  # <CJK>
+0x4C25 0x9B45  # <CJK>
+0x4C26 0x5DF3  # <CJK>
+0x4C27 0x7B95  # <CJK>
+0x4C28 0x5CAC  # <CJK>
+0x4C29 0x5BC6  # <CJK>
+0x4C2A 0x871C  # <CJK>
+0x4C2B 0x6E4A  # <CJK>
+0x4C2C 0x84D1  # <CJK>
+0x4C2D 0x7A14  # <CJK>
+0x4C2E 0x8108  # <CJK>
+0x4C2F 0x5999  # <CJK>
+0x4C30 0x7C8D  # <CJK>
+0x4C31 0x6C11  # <CJK>
+0x4C32 0x7720  # <CJK>
+0x4C33 0x52D9  # <CJK>
+0x4C34 0x5922  # <CJK>
+0x4C35 0x7121  # <CJK>
+0x4C36 0x725F  # <CJK>
+0x4C37 0x77DB  # <CJK>
+0x4C38 0x9727  # <CJK>
+0x4C39 0x9D61  # <CJK>
+0x4C3A 0x690B  # <CJK>
+0x4C3B 0x5A7F  # <CJK>
+0x4C3C 0x5A18  # <CJK>
+0x4C3D 0x51A5  # <CJK>
+0x4C3E 0x540D  # <CJK>
+0x4C3F 0x547D  # <CJK>
+0x4C40 0x660E  # <CJK>
+0x4C41 0x76DF  # <CJK>
+0x4C42 0x8FF7  # <CJK>
+0x4C43 0x9298  # <CJK>
+0x4C44 0x9CF4  # <CJK>
+0x4C45 0x59EA  # <CJK>
+0x4C46 0x725D  # <CJK>
+0x4C47 0x6EC5  # <CJK>
+0x4C48 0x514D  # <CJK>
+0x4C49 0x68C9  # <CJK>
+0x4C4A 0x7DBF  # <CJK>
+0x4C4B 0x7DEC  # <CJK>
+0x4C4C 0x9762  # <CJK>
+0x4C4D 0x9EBA  # <CJK>
+0x4C4E 0x6478  # <CJK>
+0x4C4F 0x6A21  # <CJK>
+0x4C50 0x8302  # <CJK>
+0x4C51 0x5984  # <CJK>
+0x4C52 0x5B5F  # <CJK>
+0x4C53 0x6BDB  # <CJK>
+0x4C54 0x731B  # <CJK>
+0x4C55 0x76F2  # <CJK>
+0x4C56 0x7DB2  # <CJK>
+0x4C57 0x8017  # <CJK>
+0x4C58 0x8499  # <CJK>
+0x4C59 0x5132  # <CJK>
+0x4C5A 0x6728  # <CJK>
+0x4C5B 0x9ED9  # <CJK>
+0x4C5C 0x76EE  # <CJK>
+0x4C5D 0x6762  # <CJK>
+0x4C5E 0x52FF  # <CJK>
+0x4C5F 0x9905  # <CJK>
+0x4C60 0x5C24  # <CJK>
+0x4C61 0x623B  # <CJK>
+0x4C62 0x7C7E  # <CJK>
+0x4C63 0x8CB0  # <CJK>
+0x4C64 0x554F  # <CJK>
+0x4C65 0x60B6  # <CJK>
+0x4C66 0x7D0B  # <CJK>
+0x4C67 0x9580  # <CJK>
+0x4C68 0x5301  # <CJK>
+0x4C69 0x4E5F  # <CJK>
+0x4C6A 0x51B6  # <CJK>
+0x4C6B 0x591C  # <CJK>
+0x4C6C 0x723A  # <CJK>
+0x4C6D 0x8036  # <CJK>
+0x4C6E 0x91CE  # <CJK>
+0x4C6F 0x5F25  # <CJK>
+0x4C70 0x77E2  # <CJK>
+0x4C71 0x5384  # <CJK>
+0x4C72 0x5F79  # <CJK>
+0x4C73 0x7D04  # <CJK>
+0x4C74 0x85AC  # <CJK>
+0x4C75 0x8A33  # <CJK>
+0x4C76 0x8E8D  # <CJK>
+0x4C77 0x9756  # <CJK>
+0x4C78 0x67F3  # <CJK>
+0x4C79 0x85AE  # <CJK>
+0x4C7A 0x9453  # <CJK>
+0x4C7B 0x6109  # <CJK>
+0x4C7C 0x6108  # <CJK>
+0x4C7D 0x6CB9  # <CJK>
+0x4C7E 0x7652  # <CJK>
+0x4D21 0x8AED  # <CJK>
+0x4D22 0x8F38  # <CJK>
+0x4D23 0x552F  # <CJK>
+0x4D24 0x4F51  # <CJK>
+0x4D25 0x512A  # <CJK>
+0x4D26 0x52C7  # <CJK>
+0x4D27 0x53CB  # <CJK>
+0x4D28 0x5BA5  # <CJK>
+0x4D29 0x5E7D  # <CJK>
+0x4D2A 0x60A0  # <CJK>
+0x4D2B 0x6182  # <CJK>
+0x4D2C 0x63D6  # <CJK>
+0x4D2D 0x6709  # <CJK>
+0x4D2E 0x67DA  # <CJK>
+0x4D2F 0x6E67  # <CJK>
+0x4D30 0x6D8C  # <CJK>
+0x4D31 0x7336  # <CJK>
+0x4D32 0x7337  # <CJK>
+0x4D33 0x7531  # <CJK>
+0x4D34 0x7950  # <CJK>
+0x4D35 0x88D5  # <CJK>
+0x4D36 0x8A98  # <CJK>
+0x4D37 0x904A  # <CJK>
+0x4D38 0x9091  # <CJK>
+0x4D39 0x90F5  # <CJK>
+0x4D3A 0x96C4  # <CJK>
+0x4D3B 0x878D  # <CJK>
+0x4D3C 0x5915  # <CJK>
+0x4D3D 0x4E88  # <CJK>
+0x4D3E 0x4F59  # <CJK>
+0x4D3F 0x4E0E  # <CJK>
+0x4D40 0x8A89  # <CJK>
+0x4D41 0x8F3F  # <CJK>
+0x4D42 0x9810  # <CJK>
+0x4D43 0x50AD  # <CJK>
+0x4D44 0x5E7C  # <CJK>
+0x4D45 0x5996  # <CJK>
+0x4D46 0x5BB9  # <CJK>
+0x4D47 0x5EB8  # <CJK>
+0x4D48 0x63DA  # <CJK>
+0x4D49 0x63FA  # <CJK>
+0x4D4A 0x64C1  # <CJK>
+0x4D4B 0x66DC  # <CJK>
+0x4D4C 0x694A  # <CJK>
+0x4D4D 0x69D8  # <CJK>
+0x4D4E 0x6D0B  # <CJK>
+0x4D4F 0x6EB6  # <CJK>
+0x4D50 0x7194  # <CJK>
+0x4D51 0x7528  # <CJK>
+0x4D52 0x7AAF  # <CJK>
+0x4D53 0x7F8A  # <CJK>
+0x4D54 0x8000  # <CJK>
+0x4D55 0x8449  # <CJK>
+0x4D56 0x84C9  # <CJK>
+0x4D57 0x8981  # <CJK>
+0x4D58 0x8B21  # <CJK>
+0x4D59 0x8E0A  # <CJK>
+0x4D5A 0x9065  # <CJK>
+0x4D5B 0x967D  # <CJK>
+0x4D5C 0x990A  # <CJK>
+0x4D5D 0x617E  # <CJK>
+0x4D5E 0x6291  # <CJK>
+0x4D5F 0x6B32  # <CJK>
+0x4D60 0x6C83  # <CJK>
+0x4D61 0x6D74  # <CJK>
+0x4D62 0x7FCC  # <CJK>
+0x4D63 0x7FFC  # <CJK>
+0x4D64 0x6DC0  # <CJK>
+0x4D65 0x7F85  # <CJK>
+0x4D66 0x87BA  # <CJK>
+0x4D67 0x88F8  # <CJK>
+0x4D68 0x6765  # <CJK>
+0x4D69 0x83B1  # <CJK>
+0x4D6A 0x983C  # <CJK>
+0x4D6B 0x96F7  # <CJK>
+0x4D6C 0x6D1B  # <CJK>
+0x4D6D 0x7D61  # <CJK>
+0x4D6E 0x843D  # <CJK>
+0x4D6F 0x916A  # <CJK>
+0x4D70 0x4E71  # <CJK>
+0x4D71 0x5375  # <CJK>
+0x4D72 0x5D50  # <CJK>
+0x4D73 0x6B04  # <CJK>
+0x4D74 0x6FEB  # <CJK>
+0x4D75 0x85CD  # <CJK>
+0x4D76 0x862D  # <CJK>
+0x4D77 0x89A7  # <CJK>
+0x4D78 0x5229  # <CJK>
+0x4D79 0x540F  # <CJK>
+0x4D7A 0x5C65  # <CJK>
+0x4D7B 0x674E  # <CJK>
+0x4D7C 0x68A8  # <CJK>
+0x4D7D 0x7406  # <CJK>
+0x4D7E 0x7483  # <CJK>
+0x4E21 0x75E2  # <CJK>
+0x4E22 0x88CF  # <CJK>
+0x4E23 0x88E1  # <CJK>
+0x4E24 0x91CC  # <CJK>
+0x4E25 0x96E2  # <CJK>
+0x4E26 0x9678  # <CJK>
+0x4E27 0x5F8B  # <CJK>
+0x4E28 0x7387  # <CJK>
+0x4E29 0x7ACB  # <CJK>
+0x4E2A 0x844E  # <CJK>
+0x4E2B 0x63A0  # <CJK>
+0x4E2C 0x7565  # <CJK>
+0x4E2D 0x5289  # <CJK>
+0x4E2E 0x6D41  # <CJK>
+0x4E2F 0x6E9C  # <CJK>
+0x4E30 0x7409  # <CJK>
+0x4E31 0x7559  # <CJK>
+0x4E32 0x786B  # <CJK>
+0x4E33 0x7C92  # <CJK>
+0x4E34 0x9686  # <CJK>
+0x4E35 0x7ADC  # <CJK>
+0x4E36 0x9F8D  # <CJK>
+0x4E37 0x4FB6  # <CJK>
+0x4E38 0x616E  # <CJK>
+0x4E39 0x65C5  # <CJK>
+0x4E3A 0x865C  # <CJK>
+0x4E3B 0x4E86  # <CJK>
+0x4E3C 0x4EAE  # <CJK>
+0x4E3D 0x50DA  # <CJK>
+0x4E3E 0x4E21  # <CJK>
+0x4E3F 0x51CC  # <CJK>
+0x4E40 0x5BEE  # <CJK>
+0x4E41 0x6599  # <CJK>
+0x4E42 0x6881  # <CJK>
+0x4E43 0x6DBC  # <CJK>
+0x4E44 0x731F  # <CJK>
+0x4E45 0x7642  # <CJK>
+0x4E46 0x77AD  # <CJK>
+0x4E47 0x7A1C  # <CJK>
+0x4E48 0x7CE7  # <CJK>
+0x4E49 0x826F  # <CJK>
+0x4E4A 0x8AD2  # <CJK>
+0x4E4B 0x907C  # <CJK>
+0x4E4C 0x91CF  # <CJK>
+0x4E4D 0x9675  # <CJK>
+0x4E4E 0x9818  # <CJK>
+0x4E4F 0x529B  # <CJK>
+0x4E50 0x7DD1  # <CJK>
+0x4E51 0x502B  # <CJK>
+0x4E52 0x5398  # <CJK>
+0x4E53 0x6797  # <CJK>
+0x4E54 0x6DCB  # <CJK>
+0x4E55 0x71D0  # <CJK>
+0x4E56 0x7433  # <CJK>
+0x4E57 0x81E8  # <CJK>
+0x4E58 0x8F2A  # <CJK>
+0x4E59 0x96A3  # <CJK>
+0x4E5A 0x9C57  # <CJK>
+0x4E5B 0x9E9F  # <CJK>
+0x4E5C 0x7460  # <CJK>
+0x4E5D 0x5841  # <CJK>
+0x4E5E 0x6D99  # <CJK>
+0x4E5F 0x7D2F  # <CJK>
+0x4E60 0x985E  # <CJK>
+0x4E61 0x4EE4  # <CJK>
+0x4E62 0x4F36  # <CJK>
+0x4E63 0x4F8B  # <CJK>
+0x4E64 0x51B7  # <CJK>
+0x4E65 0x52B1  # <CJK>
+0x4E66 0x5DBA  # <CJK>
+0x4E67 0x601C  # <CJK>
+0x4E68 0x73B2  # <CJK>
+0x4E69 0x793C  # <CJK>
+0x4E6A 0x82D3  # <CJK>
+0x4E6B 0x9234  # <CJK>
+0x4E6C 0x96B7  # <CJK>
+0x4E6D 0x96F6  # <CJK>
+0x4E6E 0x970A  # <CJK>
+0x4E6F 0x9E97  # <CJK>
+0x4E70 0x9F62  # <CJK>
+0x4E71 0x66A6  # <CJK>
+0x4E72 0x6B74  # <CJK>
+0x4E73 0x5217  # <CJK>
+0x4E74 0x52A3  # <CJK>
+0x4E75 0x70C8  # <CJK>
+0x4E76 0x88C2  # <CJK>
+0x4E77 0x5EC9  # <CJK>
+0x4E78 0x604B  # <CJK>
+0x4E79 0x6190  # <CJK>
+0x4E7A 0x6F23  # <CJK>
+0x4E7B 0x7149  # <CJK>
+0x4E7C 0x7C3E  # <CJK>
+0x4E7D 0x7DF4  # <CJK>
+0x4E7E 0x806F  # <CJK>
+0x4F21 0x84EE  # <CJK>
+0x4F22 0x9023  # <CJK>
+0x4F23 0x932C  # <CJK>
+0x4F24 0x5442  # <CJK>
+0x4F25 0x9B6F  # <CJK>
+0x4F26 0x6AD3  # <CJK>
+0x4F27 0x7089  # <CJK>
+0x4F28 0x8CC2  # <CJK>
+0x4F29 0x8DEF  # <CJK>
+0x4F2A 0x9732  # <CJK>
+0x4F2B 0x52B4  # <CJK>
+0x4F2C 0x5A41  # <CJK>
+0x4F2D 0x5ECA  # <CJK>
+0x4F2E 0x5F04  # <CJK>
+0x4F2F 0x6717  # <CJK>
+0x4F30 0x697C  # <CJK>
+0x4F31 0x6994  # <CJK>
+0x4F32 0x6D6A  # <CJK>
+0x4F33 0x6F0F  # <CJK>
+0x4F34 0x7262  # <CJK>
+0x4F35 0x72FC  # <CJK>
+0x4F36 0x7BED  # <CJK>
+0x4F37 0x8001  # <CJK>
+0x4F38 0x807E  # <CJK>
+0x4F39 0x874B  # <CJK>
+0x4F3A 0x90CE  # <CJK>
+0x4F3B 0x516D  # <CJK>
+0x4F3C 0x9E93  # <CJK>
+0x4F3D 0x7984  # <CJK>
+0x4F3E 0x808B  # <CJK>
+0x4F3F 0x9332  # <CJK>
+0x4F40 0x8AD6  # <CJK>
+0x4F41 0x502D  # <CJK>
+0x4F42 0x548C  # <CJK>
+0x4F43 0x8A71  # <CJK>
+0x4F44 0x6B6A  # <CJK>
+0x4F45 0x8CC4  # <CJK>
+0x4F46 0x8107  # <CJK>
+0x4F47 0x60D1  # <CJK>
+0x4F48 0x67A0  # <CJK>
+0x4F49 0x9DF2  # <CJK>
+0x4F4A 0x4E99  # <CJK>
+0x4F4B 0x4E98  # <CJK>
+0x4F4C 0x9C10  # <CJK>
+0x4F4D 0x8A6B  # <CJK>
+0x4F4E 0x85C1  # <CJK>
+0x4F4F 0x8568  # <CJK>
+0x4F50 0x6900  # <CJK>
+0x4F51 0x6E7E  # <CJK>
+0x4F52 0x7897  # <CJK>
+0x4F53 0x8155  # <CJK>
+0x5021 0x5F0C  # <CJK>
+0x5022 0x4E10  # <CJK>
+0x5023 0x4E15  # <CJK>
+0x5024 0x4E2A  # <CJK>
+0x5025 0x4E31  # <CJK>
+0x5026 0x4E36  # <CJK>
+0x5027 0x4E3C  # <CJK>
+0x5028 0x4E3F  # <CJK>
+0x5029 0x4E42  # <CJK>
+0x502A 0x4E56  # <CJK>
+0x502B 0x4E58  # <CJK>
+0x502C 0x4E82  # <CJK>
+0x502D 0x4E85  # <CJK>
+0x502E 0x8C6B  # <CJK>
+0x502F 0x4E8A  # <CJK>
+0x5030 0x8212  # <CJK>
+0x5031 0x5F0D  # <CJK>
+0x5032 0x4E8E  # <CJK>
+0x5033 0x4E9E  # <CJK>
+0x5034 0x4E9F  # <CJK>
+0x5035 0x4EA0  # <CJK>
+0x5036 0x4EA2  # <CJK>
+0x5037 0x4EB0  # <CJK>
+0x5038 0x4EB3  # <CJK>
+0x5039 0x4EB6  # <CJK>
+0x503A 0x4ECE  # <CJK>
+0x503B 0x4ECD  # <CJK>
+0x503C 0x4EC4  # <CJK>
+0x503D 0x4EC6  # <CJK>
+0x503E 0x4EC2  # <CJK>
+0x503F 0x4ED7  # <CJK>
+0x5040 0x4EDE  # <CJK>
+0x5041 0x4EED  # <CJK>
+0x5042 0x4EDF  # <CJK>
+0x5043 0x4EF7  # <CJK>
+0x5044 0x4F09  # <CJK>
+0x5045 0x4F5A  # <CJK>
+0x5046 0x4F30  # <CJK>
+0x5047 0x4F5B  # <CJK>
+0x5048 0x4F5D  # <CJK>
+0x5049 0x4F57  # <CJK>
+0x504A 0x4F47  # <CJK>
+0x504B 0x4F76  # <CJK>
+0x504C 0x4F88  # <CJK>
+0x504D 0x4F8F  # <CJK>
+0x504E 0x4F98  # <CJK>
+0x504F 0x4F7B  # <CJK>
+0x5050 0x4F69  # <CJK>
+0x5051 0x4F70  # <CJK>
+0x5052 0x4F91  # <CJK>
+0x5053 0x4F6F  # <CJK>
+0x5054 0x4F86  # <CJK>
+0x5055 0x4F96  # <CJK>
+0x5056 0x5118  # <CJK>
+0x5057 0x4FD4  # <CJK>
+0x5058 0x4FDF  # <CJK>
+0x5059 0x4FCE  # <CJK>
+0x505A 0x4FD8  # <CJK>
+0x505B 0x4FDB  # <CJK>
+0x505C 0x4FD1  # <CJK>
+0x505D 0x4FDA  # <CJK>
+0x505E 0x4FD0  # <CJK>
+0x505F 0x4FE4  # <CJK>
+0x5060 0x4FE5  # <CJK>
+0x5061 0x501A  # <CJK>
+0x5062 0x5028  # <CJK>
+0x5063 0x5014  # <CJK>
+0x5064 0x502A  # <CJK>
+0x5065 0x5025  # <CJK>
+0x5066 0x5005  # <CJK>
+0x5067 0x4F1C  # <CJK>
+0x5068 0x4FF6  # <CJK>
+0x5069 0x5021  # <CJK>
+0x506A 0x5029  # <CJK>
+0x506B 0x502C  # <CJK>
+0x506C 0x4FFE  # <CJK>
+0x506D 0x4FEF  # <CJK>
+0x506E 0x5011  # <CJK>
+0x506F 0x5006  # <CJK>
+0x5070 0x5043  # <CJK>
+0x5071 0x5047  # <CJK>
+0x5072 0x6703  # <CJK>
+0x5073 0x5055  # <CJK>
+0x5074 0x5050  # <CJK>
+0x5075 0x5048  # <CJK>
+0x5076 0x505A  # <CJK>
+0x5077 0x5056  # <CJK>
+0x5078 0x506C  # <CJK>
+0x5079 0x5078  # <CJK>
+0x507A 0x5080  # <CJK>
+0x507B 0x509A  # <CJK>
+0x507C 0x5085  # <CJK>
+0x507D 0x50B4  # <CJK>
+0x507E 0x50B2  # <CJK>
+0x5121 0x50C9  # <CJK>
+0x5122 0x50CA  # <CJK>
+0x5123 0x50B3  # <CJK>
+0x5124 0x50C2  # <CJK>
+0x5125 0x50D6  # <CJK>
+0x5126 0x50DE  # <CJK>
+0x5127 0x50E5  # <CJK>
+0x5128 0x50ED  # <CJK>
+0x5129 0x50E3  # <CJK>
+0x512A 0x50EE  # <CJK>
+0x512B 0x50F9  # <CJK>
+0x512C 0x50F5  # <CJK>
+0x512D 0x5109  # <CJK>
+0x512E 0x5101  # <CJK>
+0x512F 0x5102  # <CJK>
+0x5130 0x5116  # <CJK>
+0x5131 0x5115  # <CJK>
+0x5132 0x5114  # <CJK>
+0x5133 0x511A  # <CJK>
+0x5134 0x5121  # <CJK>
+0x5135 0x513A  # <CJK>
+0x5136 0x5137  # <CJK>
+0x5137 0x513C  # <CJK>
+0x5138 0x513B  # <CJK>
+0x5139 0x513F  # <CJK>
+0x513A 0x5140  # <CJK>
+0x513B 0x5152  # <CJK>
+0x513C 0x514C  # <CJK>
+0x513D 0x5154  # <CJK>
+0x513E 0x5162  # <CJK>
+0x513F 0x7AF8  # <CJK>
+0x5140 0x5169  # <CJK>
+0x5141 0x516A  # <CJK>
+0x5142 0x516E  # <CJK>
+0x5143 0x5180  # <CJK>
+0x5144 0x5182  # <CJK>
+0x5145 0x56D8  # <CJK>
+0x5146 0x518C  # <CJK>
+0x5147 0x5189  # <CJK>
+0x5148 0x518F  # <CJK>
+0x5149 0x5191  # <CJK>
+0x514A 0x5193  # <CJK>
+0x514B 0x5195  # <CJK>
+0x514C 0x5196  # <CJK>
+0x514D 0x51A4  # <CJK>
+0x514E 0x51A6  # <CJK>
+0x514F 0x51A2  # <CJK>
+0x5150 0x51A9  # <CJK>
+0x5151 0x51AA  # <CJK>
+0x5152 0x51AB  # <CJK>
+0x5153 0x51B3  # <CJK>
+0x5154 0x51B1  # <CJK>
+0x5155 0x51B2  # <CJK>
+0x5156 0x51B0  # <CJK>
+0x5157 0x51B5  # <CJK>
+0x5158 0x51BD  # <CJK>
+0x5159 0x51C5  # <CJK>
+0x515A 0x51C9  # <CJK>
+0x515B 0x51DB  # <CJK>
+0x515C 0x51E0  # <CJK>
+0x515D 0x8655  # <CJK>
+0x515E 0x51E9  # <CJK>
+0x515F 0x51ED  # <CJK>
+0x5160 0x51F0  # <CJK>
+0x5161 0x51F5  # <CJK>
+0x5162 0x51FE  # <CJK>
+0x5163 0x5204  # <CJK>
+0x5164 0x520B  # <CJK>
+0x5165 0x5214  # <CJK>
+0x5166 0x520E  # <CJK>
+0x5167 0x5227  # <CJK>
+0x5168 0x522A  # <CJK>
+0x5169 0x522E  # <CJK>
+0x516A 0x5233  # <CJK>
+0x516B 0x5239  # <CJK>
+0x516C 0x524F  # <CJK>
+0x516D 0x5244  # <CJK>
+0x516E 0x524B  # <CJK>
+0x516F 0x524C  # <CJK>
+0x5170 0x525E  # <CJK>
+0x5171 0x5254  # <CJK>
+0x5172 0x526A  # <CJK>
+0x5173 0x5274  # <CJK>
+0x5174 0x5269  # <CJK>
+0x5175 0x5273  # <CJK>
+0x5176 0x527F  # <CJK>
+0x5177 0x527D  # <CJK>
+0x5178 0x528D  # <CJK>
+0x5179 0x5294  # <CJK>
+0x517A 0x5292  # <CJK>
+0x517B 0x5271  # <CJK>
+0x517C 0x5288  # <CJK>
+0x517D 0x5291  # <CJK>
+0x517E 0x8FA8  # <CJK>
+0x5221 0x8FA7  # <CJK>
+0x5222 0x52AC  # <CJK>
+0x5223 0x52AD  # <CJK>
+0x5224 0x52BC  # <CJK>
+0x5225 0x52B5  # <CJK>
+0x5226 0x52C1  # <CJK>
+0x5227 0x52CD  # <CJK>
+0x5228 0x52D7  # <CJK>
+0x5229 0x52DE  # <CJK>
+0x522A 0x52E3  # <CJK>
+0x522B 0x52E6  # <CJK>
+0x522C 0x98ED  # <CJK>
+0x522D 0x52E0  # <CJK>
+0x522E 0x52F3  # <CJK>
+0x522F 0x52F5  # <CJK>
+0x5230 0x52F8  # <CJK>
+0x5231 0x52F9  # <CJK>
+0x5232 0x5306  # <CJK>
+0x5233 0x5308  # <CJK>
+0x5234 0x7538  # <CJK>
+0x5235 0x530D  # <CJK>
+0x5236 0x5310  # <CJK>
+0x5237 0x530F  # <CJK>
+0x5238 0x5315  # <CJK>
+0x5239 0x531A  # <CJK>
+0x523A 0x5323  # <CJK>
+0x523B 0x532F  # <CJK>
+0x523C 0x5331  # <CJK>
+0x523D 0x5333  # <CJK>
+0x523E 0x5338  # <CJK>
+0x523F 0x5340  # <CJK>
+0x5240 0x5346  # <CJK>
+0x5241 0x5345  # <CJK>
+0x5242 0x4E17  # <CJK>
+0x5243 0x5349  # <CJK>
+0x5244 0x534D  # <CJK>
+0x5245 0x51D6  # <CJK>
+0x5246 0x535E  # <CJK>
+0x5247 0x5369  # <CJK>
+0x5248 0x536E  # <CJK>
+0x5249 0x5918  # <CJK>
+0x524A 0x537B  # <CJK>
+0x524B 0x5377  # <CJK>
+0x524C 0x5382  # <CJK>
+0x524D 0x5396  # <CJK>
+0x524E 0x53A0  # <CJK>
+0x524F 0x53A6  # <CJK>
+0x5250 0x53A5  # <CJK>
+0x5251 0x53AE  # <CJK>
+0x5252 0x53B0  # <CJK>
+0x5253 0x53B6  # <CJK>
+0x5254 0x53C3  # <CJK>
+0x5255 0x7C12  # <CJK>
+0x5256 0x96D9  # <CJK>
+0x5257 0x53DF  # <CJK>
+0x5258 0x66FC  # <CJK>
+0x5259 0x71EE  # <CJK>
+0x525A 0x53EE  # <CJK>
+0x525B 0x53E8  # <CJK>
+0x525C 0x53ED  # <CJK>
+0x525D 0x53FA  # <CJK>
+0x525E 0x5401  # <CJK>
+0x525F 0x543D  # <CJK>
+0x5260 0x5440  # <CJK>
+0x5261 0x542C  # <CJK>
+0x5262 0x542D  # <CJK>
+0x5263 0x543C  # <CJK>
+0x5264 0x542E  # <CJK>
+0x5265 0x5436  # <CJK>
+0x5266 0x5429  # <CJK>
+0x5267 0x541D  # <CJK>
+0x5268 0x544E  # <CJK>
+0x5269 0x548F  # <CJK>
+0x526A 0x5475  # <CJK>
+0x526B 0x548E  # <CJK>
+0x526C 0x545F  # <CJK>
+0x526D 0x5471  # <CJK>
+0x526E 0x5477  # <CJK>
+0x526F 0x5470  # <CJK>
+0x5270 0x5492  # <CJK>
+0x5271 0x547B  # <CJK>
+0x5272 0x5480  # <CJK>
+0x5273 0x5476  # <CJK>
+0x5274 0x5484  # <CJK>
+0x5275 0x5490  # <CJK>
+0x5276 0x5486  # <CJK>
+0x5277 0x54C7  # <CJK>
+0x5278 0x54A2  # <CJK>
+0x5279 0x54B8  # <CJK>
+0x527A 0x54A5  # <CJK>
+0x527B 0x54AC  # <CJK>
+0x527C 0x54C4  # <CJK>
+0x527D 0x54C8  # <CJK>
+0x527E 0x54A8  # <CJK>
+0x5321 0x54AB  # <CJK>
+0x5322 0x54C2  # <CJK>
+0x5323 0x54A4  # <CJK>
+0x5324 0x54BE  # <CJK>
+0x5325 0x54BC  # <CJK>
+0x5326 0x54D8  # <CJK>
+0x5327 0x54E5  # <CJK>
+0x5328 0x54E6  # <CJK>
+0x5329 0x550F  # <CJK>
+0x532A 0x5514  # <CJK>
+0x532B 0x54FD  # <CJK>
+0x532C 0x54EE  # <CJK>
+0x532D 0x54ED  # <CJK>
+0x532E 0x54FA  # <CJK>
+0x532F 0x54E2  # <CJK>
+0x5330 0x5539  # <CJK>
+0x5331 0x5540  # <CJK>
+0x5332 0x5563  # <CJK>
+0x5333 0x554C  # <CJK>
+0x5334 0x552E  # <CJK>
+0x5335 0x555C  # <CJK>
+0x5336 0x5545  # <CJK>
+0x5337 0x5556  # <CJK>
+0x5338 0x5557  # <CJK>
+0x5339 0x5538  # <CJK>
+0x533A 0x5533  # <CJK>
+0x533B 0x555D  # <CJK>
+0x533C 0x5599  # <CJK>
+0x533D 0x5580  # <CJK>
+0x533E 0x54AF  # <CJK>
+0x533F 0x558A  # <CJK>
+0x5340 0x559F  # <CJK>
+0x5341 0x557B  # <CJK>
+0x5342 0x557E  # <CJK>
+0x5343 0x5598  # <CJK>
+0x5344 0x559E  # <CJK>
+0x5345 0x55AE  # <CJK>
+0x5346 0x557C  # <CJK>
+0x5347 0x5583  # <CJK>
+0x5348 0x55A9  # <CJK>
+0x5349 0x5587  # <CJK>
+0x534A 0x55A8  # <CJK>
+0x534B 0x55DA  # <CJK>
+0x534C 0x55C5  # <CJK>
+0x534D 0x55DF  # <CJK>
+0x534E 0x55C4  # <CJK>
+0x534F 0x55DC  # <CJK>
+0x5350 0x55E4  # <CJK>
+0x5351 0x55D4  # <CJK>
+0x5352 0x5614  # <CJK>
+0x5353 0x55F7  # <CJK>
+0x5354 0x5616  # <CJK>
+0x5355 0x55FE  # <CJK>
+0x5356 0x55FD  # <CJK>
+0x5357 0x561B  # <CJK>
+0x5358 0x55F9  # <CJK>
+0x5359 0x564E  # <CJK>
+0x535A 0x5650  # <CJK>
+0x535B 0x71DF  # <CJK>
+0x535C 0x5634  # <CJK>
+0x535D 0x5636  # <CJK>
+0x535E 0x5632  # <CJK>
+0x535F 0x5638  # <CJK>
+0x5360 0x566B  # <CJK>
+0x5361 0x5664  # <CJK>
+0x5362 0x562F  # <CJK>
+0x5363 0x566C  # <CJK>
+0x5364 0x566A  # <CJK>
+0x5365 0x5686  # <CJK>
+0x5366 0x5680  # <CJK>
+0x5367 0x568A  # <CJK>
+0x5368 0x56A0  # <CJK>
+0x5369 0x5694  # <CJK>
+0x536A 0x568F  # <CJK>
+0x536B 0x56A5  # <CJK>
+0x536C 0x56AE  # <CJK>
+0x536D 0x56B6  # <CJK>
+0x536E 0x56B4  # <CJK>
+0x536F 0x56C2  # <CJK>
+0x5370 0x56BC  # <CJK>
+0x5371 0x56C1  # <CJK>
+0x5372 0x56C3  # <CJK>
+0x5373 0x56C0  # <CJK>
+0x5374 0x56C8  # <CJK>
+0x5375 0x56CE  # <CJK>
+0x5376 0x56D1  # <CJK>
+0x5377 0x56D3  # <CJK>
+0x5378 0x56D7  # <CJK>
+0x5379 0x56EE  # <CJK>
+0x537A 0x56F9  # <CJK>
+0x537B 0x5700  # <CJK>
+0x537C 0x56FF  # <CJK>
+0x537D 0x5704  # <CJK>
+0x537E 0x5709  # <CJK>
+0x5421 0x5708  # <CJK>
+0x5422 0x570B  # <CJK>
+0x5423 0x570D  # <CJK>
+0x5424 0x5713  # <CJK>
+0x5425 0x5718  # <CJK>
+0x5426 0x5716  # <CJK>
+0x5427 0x55C7  # <CJK>
+0x5428 0x571C  # <CJK>
+0x5429 0x5726  # <CJK>
+0x542A 0x5737  # <CJK>
+0x542B 0x5738  # <CJK>
+0x542C 0x574E  # <CJK>
+0x542D 0x573B  # <CJK>
+0x542E 0x5740  # <CJK>
+0x542F 0x574F  # <CJK>
+0x5430 0x5769  # <CJK>
+0x5431 0x57C0  # <CJK>
+0x5432 0x5788  # <CJK>
+0x5433 0x5761  # <CJK>
+0x5434 0x577F  # <CJK>
+0x5435 0x5789  # <CJK>
+0x5436 0x5793  # <CJK>
+0x5437 0x57A0  # <CJK>
+0x5438 0x57B3  # <CJK>
+0x5439 0x57A4  # <CJK>
+0x543A 0x57AA  # <CJK>
+0x543B 0x57B0  # <CJK>
+0x543C 0x57C3  # <CJK>
+0x543D 0x57C6  # <CJK>
+0x543E 0x57D4  # <CJK>
+0x543F 0x57D2  # <CJK>
+0x5440 0x57D3  # <CJK>
+0x5441 0x580A  # <CJK>
+0x5442 0x57D6  # <CJK>
+0x5443 0x57E3  # <CJK>
+0x5444 0x580B  # <CJK>
+0x5445 0x5819  # <CJK>
+0x5446 0x581D  # <CJK>
+0x5447 0x5872  # <CJK>
+0x5448 0x5821  # <CJK>
+0x5449 0x5862  # <CJK>
+0x544A 0x584B  # <CJK>
+0x544B 0x5870  # <CJK>
+0x544C 0x6BC0  # <CJK>
+0x544D 0x5852  # <CJK>
+0x544E 0x583D  # <CJK>
+0x544F 0x5879  # <CJK>
+0x5450 0x5885  # <CJK>
+0x5451 0x58B9  # <CJK>
+0x5452 0x589F  # <CJK>
+0x5453 0x58AB  # <CJK>
+0x5454 0x58BA  # <CJK>
+0x5455 0x58DE  # <CJK>
+0x5456 0x58BB  # <CJK>
+0x5457 0x58B8  # <CJK>
+0x5458 0x58AE  # <CJK>
+0x5459 0x58C5  # <CJK>
+0x545A 0x58D3  # <CJK>
+0x545B 0x58D1  # <CJK>
+0x545C 0x58D7  # <CJK>
+0x545D 0x58D9  # <CJK>
+0x545E 0x58D8  # <CJK>
+0x545F 0x58E5  # <CJK>
+0x5460 0x58DC  # <CJK>
+0x5461 0x58E4  # <CJK>
+0x5462 0x58DF  # <CJK>
+0x5463 0x58EF  # <CJK>
+0x5464 0x58FA  # <CJK>
+0x5465 0x58F9  # <CJK>
+0x5466 0x58FB  # <CJK>
+0x5467 0x58FC  # <CJK>
+0x5468 0x58FD  # <CJK>
+0x5469 0x5902  # <CJK>
+0x546A 0x590A  # <CJK>
+0x546B 0x5910  # <CJK>
+0x546C 0x591B  # <CJK>
+0x546D 0x68A6  # <CJK>
+0x546E 0x5925  # <CJK>
+0x546F 0x592C  # <CJK>
+0x5470 0x592D  # <CJK>
+0x5471 0x5932  # <CJK>
+0x5472 0x5938  # <CJK>
+0x5473 0x593E  # <CJK>
+0x5474 0x7AD2  # <CJK>
+0x5475 0x5955  # <CJK>
+0x5476 0x5950  # <CJK>
+0x5477 0x594E  # <CJK>
+0x5478 0x595A  # <CJK>
+0x5479 0x5958  # <CJK>
+0x547A 0x5962  # <CJK>
+0x547B 0x5960  # <CJK>
+0x547C 0x5967  # <CJK>
+0x547D 0x596C  # <CJK>
+0x547E 0x5969  # <CJK>
+0x5521 0x5978  # <CJK>
+0x5522 0x5981  # <CJK>
+0x5523 0x599D  # <CJK>
+0x5524 0x4F5E  # <CJK>
+0x5525 0x4FAB  # <CJK>
+0x5526 0x59A3  # <CJK>
+0x5527 0x59B2  # <CJK>
+0x5528 0x59C6  # <CJK>
+0x5529 0x59E8  # <CJK>
+0x552A 0x59DC  # <CJK>
+0x552B 0x598D  # <CJK>
+0x552C 0x59D9  # <CJK>
+0x552D 0x59DA  # <CJK>
+0x552E 0x5A25  # <CJK>
+0x552F 0x5A1F  # <CJK>
+0x5530 0x5A11  # <CJK>
+0x5531 0x5A1C  # <CJK>
+0x5532 0x5A09  # <CJK>
+0x5533 0x5A1A  # <CJK>
+0x5534 0x5A40  # <CJK>
+0x5535 0x5A6C  # <CJK>
+0x5536 0x5A49  # <CJK>
+0x5537 0x5A35  # <CJK>
+0x5538 0x5A36  # <CJK>
+0x5539 0x5A62  # <CJK>
+0x553A 0x5A6A  # <CJK>
+0x553B 0x5A9A  # <CJK>
+0x553C 0x5ABC  # <CJK>
+0x553D 0x5ABE  # <CJK>
+0x553E 0x5ACB  # <CJK>
+0x553F 0x5AC2  # <CJK>
+0x5540 0x5ABD  # <CJK>
+0x5541 0x5AE3  # <CJK>
+0x5542 0x5AD7  # <CJK>
+0x5543 0x5AE6  # <CJK>
+0x5544 0x5AE9  # <CJK>
+0x5545 0x5AD6  # <CJK>
+0x5546 0x5AFA  # <CJK>
+0x5547 0x5AFB  # <CJK>
+0x5548 0x5B0C  # <CJK>
+0x5549 0x5B0B  # <CJK>
+0x554A 0x5B16  # <CJK>
+0x554B 0x5B32  # <CJK>
+0x554C 0x5AD0  # <CJK>
+0x554D 0x5B2A  # <CJK>
+0x554E 0x5B36  # <CJK>
+0x554F 0x5B3E  # <CJK>
+0x5550 0x5B43  # <CJK>
+0x5551 0x5B45  # <CJK>
+0x5552 0x5B40  # <CJK>
+0x5553 0x5B51  # <CJK>
+0x5554 0x5B55  # <CJK>
+0x5555 0x5B5A  # <CJK>
+0x5556 0x5B5B  # <CJK>
+0x5557 0x5B65  # <CJK>
+0x5558 0x5B69  # <CJK>
+0x5559 0x5B70  # <CJK>
+0x555A 0x5B73  # <CJK>
+0x555B 0x5B75  # <CJK>
+0x555C 0x5B78  # <CJK>
+0x555D 0x6588  # <CJK>
+0x555E 0x5B7A  # <CJK>
+0x555F 0x5B80  # <CJK>
+0x5560 0x5B83  # <CJK>
+0x5561 0x5BA6  # <CJK>
+0x5562 0x5BB8  # <CJK>
+0x5563 0x5BC3  # <CJK>
+0x5564 0x5BC7  # <CJK>
+0x5565 0x5BC9  # <CJK>
+0x5566 0x5BD4  # <CJK>
+0x5567 0x5BD0  # <CJK>
+0x5568 0x5BE4  # <CJK>
+0x5569 0x5BE6  # <CJK>
+0x556A 0x5BE2  # <CJK>
+0x556B 0x5BDE  # <CJK>
+0x556C 0x5BE5  # <CJK>
+0x556D 0x5BEB  # <CJK>
+0x556E 0x5BF0  # <CJK>
+0x556F 0x5BF6  # <CJK>
+0x5570 0x5BF3  # <CJK>
+0x5571 0x5C05  # <CJK>
+0x5572 0x5C07  # <CJK>
+0x5573 0x5C08  # <CJK>
+0x5574 0x5C0D  # <CJK>
+0x5575 0x5C13  # <CJK>
+0x5576 0x5C20  # <CJK>
+0x5577 0x5C22  # <CJK>
+0x5578 0x5C28  # <CJK>
+0x5579 0x5C38  # <CJK>
+0x557A 0x5C39  # <CJK>
+0x557B 0x5C41  # <CJK>
+0x557C 0x5C46  # <CJK>
+0x557D 0x5C4E  # <CJK>
+0x557E 0x5C53  # <CJK>
+0x5621 0x5C50  # <CJK>
+0x5622 0x5C4F  # <CJK>
+0x5623 0x5B71  # <CJK>
+0x5624 0x5C6C  # <CJK>
+0x5625 0x5C6E  # <CJK>
+0x5626 0x4E62  # <CJK>
+0x5627 0x5C76  # <CJK>
+0x5628 0x5C79  # <CJK>
+0x5629 0x5C8C  # <CJK>
+0x562A 0x5C91  # <CJK>
+0x562B 0x5C94  # <CJK>
+0x562C 0x599B  # <CJK>
+0x562D 0x5CAB  # <CJK>
+0x562E 0x5CBB  # <CJK>
+0x562F 0x5CB6  # <CJK>
+0x5630 0x5CBC  # <CJK>
+0x5631 0x5CB7  # <CJK>
+0x5632 0x5CC5  # <CJK>
+0x5633 0x5CBE  # <CJK>
+0x5634 0x5CC7  # <CJK>
+0x5635 0x5CD9  # <CJK>
+0x5636 0x5CE9  # <CJK>
+0x5637 0x5CFD  # <CJK>
+0x5638 0x5CFA  # <CJK>
+0x5639 0x5CED  # <CJK>
+0x563A 0x5D8C  # <CJK>
+0x563B 0x5CEA  # <CJK>
+0x563C 0x5D0B  # <CJK>
+0x563D 0x5D15  # <CJK>
+0x563E 0x5D17  # <CJK>
+0x563F 0x5D5C  # <CJK>
+0x5640 0x5D1F  # <CJK>
+0x5641 0x5D1B  # <CJK>
+0x5642 0x5D11  # <CJK>
+0x5643 0x5D14  # <CJK>
+0x5644 0x5D22  # <CJK>
+0x5645 0x5D1A  # <CJK>
+0x5646 0x5D19  # <CJK>
+0x5647 0x5D18  # <CJK>
+0x5648 0x5D4C  # <CJK>
+0x5649 0x5D52  # <CJK>
+0x564A 0x5D4E  # <CJK>
+0x564B 0x5D4B  # <CJK>
+0x564C 0x5D6C  # <CJK>
+0x564D 0x5D73  # <CJK>
+0x564E 0x5D76  # <CJK>
+0x564F 0x5D87  # <CJK>
+0x5650 0x5D84  # <CJK>
+0x5651 0x5D82  # <CJK>
+0x5652 0x5DA2  # <CJK>
+0x5653 0x5D9D  # <CJK>
+0x5654 0x5DAC  # <CJK>
+0x5655 0x5DAE  # <CJK>
+0x5656 0x5DBD  # <CJK>
+0x5657 0x5D90  # <CJK>
+0x5658 0x5DB7  # <CJK>
+0x5659 0x5DBC  # <CJK>
+0x565A 0x5DC9  # <CJK>
+0x565B 0x5DCD  # <CJK>
+0x565C 0x5DD3  # <CJK>
+0x565D 0x5DD2  # <CJK>
+0x565E 0x5DD6  # <CJK>
+0x565F 0x5DDB  # <CJK>
+0x5660 0x5DEB  # <CJK>
+0x5661 0x5DF2  # <CJK>
+0x5662 0x5DF5  # <CJK>
+0x5663 0x5E0B  # <CJK>
+0x5664 0x5E1A  # <CJK>
+0x5665 0x5E19  # <CJK>
+0x5666 0x5E11  # <CJK>
+0x5667 0x5E1B  # <CJK>
+0x5668 0x5E36  # <CJK>
+0x5669 0x5E37  # <CJK>
+0x566A 0x5E44  # <CJK>
+0x566B 0x5E43  # <CJK>
+0x566C 0x5E40  # <CJK>
+0x566D 0x5E4E  # <CJK>
+0x566E 0x5E57  # <CJK>
+0x566F 0x5E54  # <CJK>
+0x5670 0x5E5F  # <CJK>
+0x5671 0x5E62  # <CJK>
+0x5672 0x5E64  # <CJK>
+0x5673 0x5E47  # <CJK>
+0x5674 0x5E75  # <CJK>
+0x5675 0x5E76  # <CJK>
+0x5676 0x5E7A  # <CJK>
+0x5677 0x9EBC  # <CJK>
+0x5678 0x5E7F  # <CJK>
+0x5679 0x5EA0  # <CJK>
+0x567A 0x5EC1  # <CJK>
+0x567B 0x5EC2  # <CJK>
+0x567C 0x5EC8  # <CJK>
+0x567D 0x5ED0  # <CJK>
+0x567E 0x5ECF  # <CJK>
+0x5721 0x5ED6  # <CJK>
+0x5722 0x5EE3  # <CJK>
+0x5723 0x5EDD  # <CJK>
+0x5724 0x5EDA  # <CJK>
+0x5725 0x5EDB  # <CJK>
+0x5726 0x5EE2  # <CJK>
+0x5727 0x5EE1  # <CJK>
+0x5728 0x5EE8  # <CJK>
+0x5729 0x5EE9  # <CJK>
+0x572A 0x5EEC  # <CJK>
+0x572B 0x5EF1  # <CJK>
+0x572C 0x5EF3  # <CJK>
+0x572D 0x5EF0  # <CJK>
+0x572E 0x5EF4  # <CJK>
+0x572F 0x5EF8  # <CJK>
+0x5730 0x5EFE  # <CJK>
+0x5731 0x5F03  # <CJK>
+0x5732 0x5F09  # <CJK>
+0x5733 0x5F5D  # <CJK>
+0x5734 0x5F5C  # <CJK>
+0x5735 0x5F0B  # <CJK>
+0x5736 0x5F11  # <CJK>
+0x5737 0x5F16  # <CJK>
+0x5738 0x5F29  # <CJK>
+0x5739 0x5F2D  # <CJK>
+0x573A 0x5F38  # <CJK>
+0x573B 0x5F41  # <CJK>
+0x573C 0x5F48  # <CJK>
+0x573D 0x5F4C  # <CJK>
+0x573E 0x5F4E  # <CJK>
+0x573F 0x5F2F  # <CJK>
+0x5740 0x5F51  # <CJK>
+0x5741 0x5F56  # <CJK>
+0x5742 0x5F57  # <CJK>
+0x5743 0x5F59  # <CJK>
+0x5744 0x5F61  # <CJK>
+0x5745 0x5F6D  # <CJK>
+0x5746 0x5F73  # <CJK>
+0x5747 0x5F77  # <CJK>
+0x5748 0x5F83  # <CJK>
+0x5749 0x5F82  # <CJK>
+0x574A 0x5F7F  # <CJK>
+0x574B 0x5F8A  # <CJK>
+0x574C 0x5F88  # <CJK>
+0x574D 0x5F91  # <CJK>
+0x574E 0x5F87  # <CJK>
+0x574F 0x5F9E  # <CJK>
+0x5750 0x5F99  # <CJK>
+0x5751 0x5F98  # <CJK>
+0x5752 0x5FA0  # <CJK>
+0x5753 0x5FA8  # <CJK>
+0x5754 0x5FAD  # <CJK>
+0x5755 0x5FBC  # <CJK>
+0x5756 0x5FD6  # <CJK>
+0x5757 0x5FFB  # <CJK>
+0x5758 0x5FE4  # <CJK>
+0x5759 0x5FF8  # <CJK>
+0x575A 0x5FF1  # <CJK>
+0x575B 0x5FDD  # <CJK>
+0x575C 0x60B3  # <CJK>
+0x575D 0x5FFF  # <CJK>
+0x575E 0x6021  # <CJK>
+0x575F 0x6060  # <CJK>
+0x5760 0x6019  # <CJK>
+0x5761 0x6010  # <CJK>
+0x5762 0x6029  # <CJK>
+0x5763 0x600E  # <CJK>
+0x5764 0x6031  # <CJK>
+0x5765 0x601B  # <CJK>
+0x5766 0x6015  # <CJK>
+0x5767 0x602B  # <CJK>
+0x5768 0x6026  # <CJK>
+0x5769 0x600F  # <CJK>
+0x576A 0x603A  # <CJK>
+0x576B 0x605A  # <CJK>
+0x576C 0x6041  # <CJK>
+0x576D 0x606A  # <CJK>
+0x576E 0x6077  # <CJK>
+0x576F 0x605F  # <CJK>
+0x5770 0x604A  # <CJK>
+0x5771 0x6046  # <CJK>
+0x5772 0x604D  # <CJK>
+0x5773 0x6063  # <CJK>
+0x5774 0x6043  # <CJK>
+0x5775 0x6064  # <CJK>
+0x5776 0x6042  # <CJK>
+0x5777 0x606C  # <CJK>
+0x5778 0x606B  # <CJK>
+0x5779 0x6059  # <CJK>
+0x577A 0x6081  # <CJK>
+0x577B 0x608D  # <CJK>
+0x577C 0x60E7  # <CJK>
+0x577D 0x6083  # <CJK>
+0x577E 0x609A  # <CJK>
+0x5821 0x6084  # <CJK>
+0x5822 0x609B  # <CJK>
+0x5823 0x6096  # <CJK>
+0x5824 0x6097  # <CJK>
+0x5825 0x6092  # <CJK>
+0x5826 0x60A7  # <CJK>
+0x5827 0x608B  # <CJK>
+0x5828 0x60E1  # <CJK>
+0x5829 0x60B8  # <CJK>
+0x582A 0x60E0  # <CJK>
+0x582B 0x60D3  # <CJK>
+0x582C 0x60B4  # <CJK>
+0x582D 0x5FF0  # <CJK>
+0x582E 0x60BD  # <CJK>
+0x582F 0x60C6  # <CJK>
+0x5830 0x60B5  # <CJK>
+0x5831 0x60D8  # <CJK>
+0x5832 0x614D  # <CJK>
+0x5833 0x6115  # <CJK>
+0x5834 0x6106  # <CJK>
+0x5835 0x60F6  # <CJK>
+0x5836 0x60F7  # <CJK>
+0x5837 0x6100  # <CJK>
+0x5838 0x60F4  # <CJK>
+0x5839 0x60FA  # <CJK>
+0x583A 0x6103  # <CJK>
+0x583B 0x6121  # <CJK>
+0x583C 0x60FB  # <CJK>
+0x583D 0x60F1  # <CJK>
+0x583E 0x610D  # <CJK>
+0x583F 0x610E  # <CJK>
+0x5840 0x6147  # <CJK>
+0x5841 0x613E  # <CJK>
+0x5842 0x6128  # <CJK>
+0x5843 0x6127  # <CJK>
+0x5844 0x614A  # <CJK>
+0x5845 0x613F  # <CJK>
+0x5846 0x613C  # <CJK>
+0x5847 0x612C  # <CJK>
+0x5848 0x6134  # <CJK>
+0x5849 0x613D  # <CJK>
+0x584A 0x6142  # <CJK>
+0x584B 0x6144  # <CJK>
+0x584C 0x6173  # <CJK>
+0x584D 0x6177  # <CJK>
+0x584E 0x6158  # <CJK>
+0x584F 0x6159  # <CJK>
+0x5850 0x615A  # <CJK>
+0x5851 0x616B  # <CJK>
+0x5852 0x6174  # <CJK>
+0x5853 0x616F  # <CJK>
+0x5854 0x6165  # <CJK>
+0x5855 0x6171  # <CJK>
+0x5856 0x615F  # <CJK>
+0x5857 0x615D  # <CJK>
+0x5858 0x6153  # <CJK>
+0x5859 0x6175  # <CJK>
+0x585A 0x6199  # <CJK>
+0x585B 0x6196  # <CJK>
+0x585C 0x6187  # <CJK>
+0x585D 0x61AC  # <CJK>
+0x585E 0x6194  # <CJK>
+0x585F 0x619A  # <CJK>
+0x5860 0x618A  # <CJK>
+0x5861 0x6191  # <CJK>
+0x5862 0x61AB  # <CJK>
+0x5863 0x61AE  # <CJK>
+0x5864 0x61CC  # <CJK>
+0x5865 0x61CA  # <CJK>
+0x5866 0x61C9  # <CJK>
+0x5867 0x61F7  # <CJK>
+0x5868 0x61C8  # <CJK>
+0x5869 0x61C3  # <CJK>
+0x586A 0x61C6  # <CJK>
+0x586B 0x61BA  # <CJK>
+0x586C 0x61CB  # <CJK>
+0x586D 0x7F79  # <CJK>
+0x586E 0x61CD  # <CJK>
+0x586F 0x61E6  # <CJK>
+0x5870 0x61E3  # <CJK>
+0x5871 0x61F6  # <CJK>
+0x5872 0x61FA  # <CJK>
+0x5873 0x61F4  # <CJK>
+0x5874 0x61FF  # <CJK>
+0x5875 0x61FD  # <CJK>
+0x5876 0x61FC  # <CJK>
+0x5877 0x61FE  # <CJK>
+0x5878 0x6200  # <CJK>
+0x5879 0x6208  # <CJK>
+0x587A 0x6209  # <CJK>
+0x587B 0x620D  # <CJK>
+0x587C 0x620C  # <CJK>
+0x587D 0x6214  # <CJK>
+0x587E 0x621B  # <CJK>
+0x5921 0x621E  # <CJK>
+0x5922 0x6221  # <CJK>
+0x5923 0x622A  # <CJK>
+0x5924 0x622E  # <CJK>
+0x5925 0x6230  # <CJK>
+0x5926 0x6232  # <CJK>
+0x5927 0x6233  # <CJK>
+0x5928 0x6241  # <CJK>
+0x5929 0x624E  # <CJK>
+0x592A 0x625E  # <CJK>
+0x592B 0x6263  # <CJK>
+0x592C 0x625B  # <CJK>
+0x592D 0x6260  # <CJK>
+0x592E 0x6268  # <CJK>
+0x592F 0x627C  # <CJK>
+0x5930 0x6282  # <CJK>
+0x5931 0x6289  # <CJK>
+0x5932 0x627E  # <CJK>
+0x5933 0x6292  # <CJK>
+0x5934 0x6293  # <CJK>
+0x5935 0x6296  # <CJK>
+0x5936 0x62D4  # <CJK>
+0x5937 0x6283  # <CJK>
+0x5938 0x6294  # <CJK>
+0x5939 0x62D7  # <CJK>
+0x593A 0x62D1  # <CJK>
+0x593B 0x62BB  # <CJK>
+0x593C 0x62CF  # <CJK>
+0x593D 0x62FF  # <CJK>
+0x593E 0x62C6  # <CJK>
+0x593F 0x64D4  # <CJK>
+0x5940 0x62C8  # <CJK>
+0x5941 0x62DC  # <CJK>
+0x5942 0x62CC  # <CJK>
+0x5943 0x62CA  # <CJK>
+0x5944 0x62C2  # <CJK>
+0x5945 0x62C7  # <CJK>
+0x5946 0x629B  # <CJK>
+0x5947 0x62C9  # <CJK>
+0x5948 0x630C  # <CJK>
+0x5949 0x62EE  # <CJK>
+0x594A 0x62F1  # <CJK>
+0x594B 0x6327  # <CJK>
+0x594C 0x6302  # <CJK>
+0x594D 0x6308  # <CJK>
+0x594E 0x62EF  # <CJK>
+0x594F 0x62F5  # <CJK>
+0x5950 0x6350  # <CJK>
+0x5951 0x633E  # <CJK>
+0x5952 0x634D  # <CJK>
+0x5953 0x641C  # <CJK>
+0x5954 0x634F  # <CJK>
+0x5955 0x6396  # <CJK>
+0x5956 0x638E  # <CJK>
+0x5957 0x6380  # <CJK>
+0x5958 0x63AB  # <CJK>
+0x5959 0x6376  # <CJK>
+0x595A 0x63A3  # <CJK>
+0x595B 0x638F  # <CJK>
+0x595C 0x6389  # <CJK>
+0x595D 0x639F  # <CJK>
+0x595E 0x63B5  # <CJK>
+0x595F 0x636B  # <CJK>
+0x5960 0x6369  # <CJK>
+0x5961 0x63BE  # <CJK>
+0x5962 0x63E9  # <CJK>
+0x5963 0x63C0  # <CJK>
+0x5964 0x63C6  # <CJK>
+0x5965 0x63E3  # <CJK>
+0x5966 0x63C9  # <CJK>
+0x5967 0x63D2  # <CJK>
+0x5968 0x63F6  # <CJK>
+0x5969 0x63C4  # <CJK>
+0x596A 0x6416  # <CJK>
+0x596B 0x6434  # <CJK>
+0x596C 0x6406  # <CJK>
+0x596D 0x6413  # <CJK>
+0x596E 0x6426  # <CJK>
+0x596F 0x6436  # <CJK>
+0x5970 0x651D  # <CJK>
+0x5971 0x6417  # <CJK>
+0x5972 0x6428  # <CJK>
+0x5973 0x640F  # <CJK>
+0x5974 0x6467  # <CJK>
+0x5975 0x646F  # <CJK>
+0x5976 0x6476  # <CJK>
+0x5977 0x644E  # <CJK>
+0x5978 0x652A  # <CJK>
+0x5979 0x6495  # <CJK>
+0x597A 0x6493  # <CJK>
+0x597B 0x64A5  # <CJK>
+0x597C 0x64A9  # <CJK>
+0x597D 0x6488  # <CJK>
+0x597E 0x64BC  # <CJK>
+0x5A21 0x64DA  # <CJK>
+0x5A22 0x64D2  # <CJK>
+0x5A23 0x64C5  # <CJK>
+0x5A24 0x64C7  # <CJK>
+0x5A25 0x64BB  # <CJK>
+0x5A26 0x64D8  # <CJK>
+0x5A27 0x64C2  # <CJK>
+0x5A28 0x64F1  # <CJK>
+0x5A29 0x64E7  # <CJK>
+0x5A2A 0x8209  # <CJK>
+0x5A2B 0x64E0  # <CJK>
+0x5A2C 0x64E1  # <CJK>
+0x5A2D 0x62AC  # <CJK>
+0x5A2E 0x64E3  # <CJK>
+0x5A2F 0x64EF  # <CJK>
+0x5A30 0x652C  # <CJK>
+0x5A31 0x64F6  # <CJK>
+0x5A32 0x64F4  # <CJK>
+0x5A33 0x64F2  # <CJK>
+0x5A34 0x64FA  # <CJK>
+0x5A35 0x6500  # <CJK>
+0x5A36 0x64FD  # <CJK>
+0x5A37 0x6518  # <CJK>
+0x5A38 0x651C  # <CJK>
+0x5A39 0x6505  # <CJK>
+0x5A3A 0x6524  # <CJK>
+0x5A3B 0x6523  # <CJK>
+0x5A3C 0x652B  # <CJK>
+0x5A3D 0x6534  # <CJK>
+0x5A3E 0x6535  # <CJK>
+0x5A3F 0x6537  # <CJK>
+0x5A40 0x6536  # <CJK>
+0x5A41 0x6538  # <CJK>
+0x5A42 0x754B  # <CJK>
+0x5A43 0x6548  # <CJK>
+0x5A44 0x6556  # <CJK>
+0x5A45 0x6555  # <CJK>
+0x5A46 0x654D  # <CJK>
+0x5A47 0x6558  # <CJK>
+0x5A48 0x655E  # <CJK>
+0x5A49 0x655D  # <CJK>
+0x5A4A 0x6572  # <CJK>
+0x5A4B 0x6578  # <CJK>
+0x5A4C 0x6582  # <CJK>
+0x5A4D 0x6583  # <CJK>
+0x5A4E 0x8B8A  # <CJK>
+0x5A4F 0x659B  # <CJK>
+0x5A50 0x659F  # <CJK>
+0x5A51 0x65AB  # <CJK>
+0x5A52 0x65B7  # <CJK>
+0x5A53 0x65C3  # <CJK>
+0x5A54 0x65C6  # <CJK>
+0x5A55 0x65C1  # <CJK>
+0x5A56 0x65C4  # <CJK>
+0x5A57 0x65CC  # <CJK>
+0x5A58 0x65D2  # <CJK>
+0x5A59 0x65DB  # <CJK>
+0x5A5A 0x65D9  # <CJK>
+0x5A5B 0x65E0  # <CJK>
+0x5A5C 0x65E1  # <CJK>
+0x5A5D 0x65F1  # <CJK>
+0x5A5E 0x6772  # <CJK>
+0x5A5F 0x660A  # <CJK>
+0x5A60 0x6603  # <CJK>
+0x5A61 0x65FB  # <CJK>
+0x5A62 0x6773  # <CJK>
+0x5A63 0x6635  # <CJK>
+0x5A64 0x6636  # <CJK>
+0x5A65 0x6634  # <CJK>
+0x5A66 0x661C  # <CJK>
+0x5A67 0x664F  # <CJK>
+0x5A68 0x6644  # <CJK>
+0x5A69 0x6649  # <CJK>
+0x5A6A 0x6641  # <CJK>
+0x5A6B 0x665E  # <CJK>
+0x5A6C 0x665D  # <CJK>
+0x5A6D 0x6664  # <CJK>
+0x5A6E 0x6667  # <CJK>
+0x5A6F 0x6668  # <CJK>
+0x5A70 0x665F  # <CJK>
+0x5A71 0x6662  # <CJK>
+0x5A72 0x6670  # <CJK>
+0x5A73 0x6683  # <CJK>
+0x5A74 0x6688  # <CJK>
+0x5A75 0x668E  # <CJK>
+0x5A76 0x6689  # <CJK>
+0x5A77 0x6684  # <CJK>
+0x5A78 0x6698  # <CJK>
+0x5A79 0x669D  # <CJK>
+0x5A7A 0x66C1  # <CJK>
+0x5A7B 0x66B9  # <CJK>
+0x5A7C 0x66C9  # <CJK>
+0x5A7D 0x66BE  # <CJK>
+0x5A7E 0x66BC  # <CJK>
+0x5B21 0x66C4  # <CJK>
+0x5B22 0x66B8  # <CJK>
+0x5B23 0x66D6  # <CJK>
+0x5B24 0x66DA  # <CJK>
+0x5B25 0x66E0  # <CJK>
+0x5B26 0x663F  # <CJK>
+0x5B27 0x66E6  # <CJK>
+0x5B28 0x66E9  # <CJK>
+0x5B29 0x66F0  # <CJK>
+0x5B2A 0x66F5  # <CJK>
+0x5B2B 0x66F7  # <CJK>
+0x5B2C 0x670F  # <CJK>
+0x5B2D 0x6716  # <CJK>
+0x5B2E 0x671E  # <CJK>
+0x5B2F 0x6726  # <CJK>
+0x5B30 0x6727  # <CJK>
+0x5B31 0x9738  # <CJK>
+0x5B32 0x672E  # <CJK>
+0x5B33 0x673F  # <CJK>
+0x5B34 0x6736  # <CJK>
+0x5B35 0x6741  # <CJK>
+0x5B36 0x6738  # <CJK>
+0x5B37 0x6737  # <CJK>
+0x5B38 0x6746  # <CJK>
+0x5B39 0x675E  # <CJK>
+0x5B3A 0x6760  # <CJK>
+0x5B3B 0x6759  # <CJK>
+0x5B3C 0x6763  # <CJK>
+0x5B3D 0x6764  # <CJK>
+0x5B3E 0x6789  # <CJK>
+0x5B3F 0x6770  # <CJK>
+0x5B40 0x67A9  # <CJK>
+0x5B41 0x677C  # <CJK>
+0x5B42 0x676A  # <CJK>
+0x5B43 0x678C  # <CJK>
+0x5B44 0x678B  # <CJK>
+0x5B45 0x67A6  # <CJK>
+0x5B46 0x67A1  # <CJK>
+0x5B47 0x6785  # <CJK>
+0x5B48 0x67B7  # <CJK>
+0x5B49 0x67EF  # <CJK>
+0x5B4A 0x67B4  # <CJK>
+0x5B4B 0x67EC  # <CJK>
+0x5B4C 0x67B3  # <CJK>
+0x5B4D 0x67E9  # <CJK>
+0x5B4E 0x67B8  # <CJK>
+0x5B4F 0x67E4  # <CJK>
+0x5B50 0x67DE  # <CJK>
+0x5B51 0x67DD  # <CJK>
+0x5B52 0x67E2  # <CJK>
+0x5B53 0x67EE  # <CJK>
+0x5B54 0x67B9  # <CJK>
+0x5B55 0x67CE  # <CJK>
+0x5B56 0x67C6  # <CJK>
+0x5B57 0x67E7  # <CJK>
+0x5B58 0x6A9C  # <CJK>
+0x5B59 0x681E  # <CJK>
+0x5B5A 0x6846  # <CJK>
+0x5B5B 0x6829  # <CJK>
+0x5B5C 0x6840  # <CJK>
+0x5B5D 0x684D  # <CJK>
+0x5B5E 0x6832  # <CJK>
+0x5B5F 0x684E  # <CJK>
+0x5B60 0x68B3  # <CJK>
+0x5B61 0x682B  # <CJK>
+0x5B62 0x6859  # <CJK>
+0x5B63 0x6863  # <CJK>
+0x5B64 0x6877  # <CJK>
+0x5B65 0x687F  # <CJK>
+0x5B66 0x689F  # <CJK>
+0x5B67 0x688F  # <CJK>
+0x5B68 0x68AD  # <CJK>
+0x5B69 0x6894  # <CJK>
+0x5B6A 0x689D  # <CJK>
+0x5B6B 0x689B  # <CJK>
+0x5B6C 0x6883  # <CJK>
+0x5B6D 0x6AAE  # <CJK>
+0x5B6E 0x68B9  # <CJK>
+0x5B6F 0x6874  # <CJK>
+0x5B70 0x68B5  # <CJK>
+0x5B71 0x68A0  # <CJK>
+0x5B72 0x68BA  # <CJK>
+0x5B73 0x690F  # <CJK>
+0x5B74 0x688D  # <CJK>
+0x5B75 0x687E  # <CJK>
+0x5B76 0x6901  # <CJK>
+0x5B77 0x68CA  # <CJK>
+0x5B78 0x6908  # <CJK>
+0x5B79 0x68D8  # <CJK>
+0x5B7A 0x6922  # <CJK>
+0x5B7B 0x6926  # <CJK>
+0x5B7C 0x68E1  # <CJK>
+0x5B7D 0x690C  # <CJK>
+0x5B7E 0x68CD  # <CJK>
+0x5C21 0x68D4  # <CJK>
+0x5C22 0x68E7  # <CJK>
+0x5C23 0x68D5  # <CJK>
+0x5C24 0x6936  # <CJK>
+0x5C25 0x6912  # <CJK>
+0x5C26 0x6904  # <CJK>
+0x5C27 0x68D7  # <CJK>
+0x5C28 0x68E3  # <CJK>
+0x5C29 0x6925  # <CJK>
+0x5C2A 0x68F9  # <CJK>
+0x5C2B 0x68E0  # <CJK>
+0x5C2C 0x68EF  # <CJK>
+0x5C2D 0x6928  # <CJK>
+0x5C2E 0x692A  # <CJK>
+0x5C2F 0x691A  # <CJK>
+0x5C30 0x6923  # <CJK>
+0x5C31 0x6921  # <CJK>
+0x5C32 0x68C6  # <CJK>
+0x5C33 0x6979  # <CJK>
+0x5C34 0x6977  # <CJK>
+0x5C35 0x695C  # <CJK>
+0x5C36 0x6978  # <CJK>
+0x5C37 0x696B  # <CJK>
+0x5C38 0x6954  # <CJK>
+0x5C39 0x697E  # <CJK>
+0x5C3A 0x696E  # <CJK>
+0x5C3B 0x6939  # <CJK>
+0x5C3C 0x6974  # <CJK>
+0x5C3D 0x693D  # <CJK>
+0x5C3E 0x6959  # <CJK>
+0x5C3F 0x6930  # <CJK>
+0x5C40 0x6961  # <CJK>
+0x5C41 0x695E  # <CJK>
+0x5C42 0x695D  # <CJK>
+0x5C43 0x6981  # <CJK>
+0x5C44 0x696A  # <CJK>
+0x5C45 0x69B2  # <CJK>
+0x5C46 0x69AE  # <CJK>
+0x5C47 0x69D0  # <CJK>
+0x5C48 0x69BF  # <CJK>
+0x5C49 0x69C1  # <CJK>
+0x5C4A 0x69D3  # <CJK>
+0x5C4B 0x69BE  # <CJK>
+0x5C4C 0x69CE  # <CJK>
+0x5C4D 0x5BE8  # <CJK>
+0x5C4E 0x69CA  # <CJK>
+0x5C4F 0x69DD  # <CJK>
+0x5C50 0x69BB  # <CJK>
+0x5C51 0x69C3  # <CJK>
+0x5C52 0x69A7  # <CJK>
+0x5C53 0x6A2E  # <CJK>
+0x5C54 0x6991  # <CJK>
+0x5C55 0x69A0  # <CJK>
+0x5C56 0x699C  # <CJK>
+0x5C57 0x6995  # <CJK>
+0x5C58 0x69B4  # <CJK>
+0x5C59 0x69DE  # <CJK>
+0x5C5A 0x69E8  # <CJK>
+0x5C5B 0x6A02  # <CJK>
+0x5C5C 0x6A1B  # <CJK>
+0x5C5D 0x69FF  # <CJK>
+0x5C5E 0x6B0A  # <CJK>
+0x5C5F 0x69F9  # <CJK>
+0x5C60 0x69F2  # <CJK>
+0x5C61 0x69E7  # <CJK>
+0x5C62 0x6A05  # <CJK>
+0x5C63 0x69B1  # <CJK>
+0x5C64 0x6A1E  # <CJK>
+0x5C65 0x69ED  # <CJK>
+0x5C66 0x6A14  # <CJK>
+0x5C67 0x69EB  # <CJK>
+0x5C68 0x6A0A  # <CJK>
+0x5C69 0x6A12  # <CJK>
+0x5C6A 0x6AC1  # <CJK>
+0x5C6B 0x6A23  # <CJK>
+0x5C6C 0x6A13  # <CJK>
+0x5C6D 0x6A44  # <CJK>
+0x5C6E 0x6A0C  # <CJK>
+0x5C6F 0x6A72  # <CJK>
+0x5C70 0x6A36  # <CJK>
+0x5C71 0x6A78  # <CJK>
+0x5C72 0x6A47  # <CJK>
+0x5C73 0x6A62  # <CJK>
+0x5C74 0x6A59  # <CJK>
+0x5C75 0x6A66  # <CJK>
+0x5C76 0x6A48  # <CJK>
+0x5C77 0x6A38  # <CJK>
+0x5C78 0x6A22  # <CJK>
+0x5C79 0x6A90  # <CJK>
+0x5C7A 0x6A8D  # <CJK>
+0x5C7B 0x6AA0  # <CJK>
+0x5C7C 0x6A84  # <CJK>
+0x5C7D 0x6AA2  # <CJK>
+0x5C7E 0x6AA3  # <CJK>
+0x5D21 0x6A97  # <CJK>
+0x5D22 0x8617  # <CJK>
+0x5D23 0x6ABB  # <CJK>
+0x5D24 0x6AC3  # <CJK>
+0x5D25 0x6AC2  # <CJK>
+0x5D26 0x6AB8  # <CJK>
+0x5D27 0x6AB3  # <CJK>
+0x5D28 0x6AAC  # <CJK>
+0x5D29 0x6ADE  # <CJK>
+0x5D2A 0x6AD1  # <CJK>
+0x5D2B 0x6ADF  # <CJK>
+0x5D2C 0x6AAA  # <CJK>
+0x5D2D 0x6ADA  # <CJK>
+0x5D2E 0x6AEA  # <CJK>
+0x5D2F 0x6AFB  # <CJK>
+0x5D30 0x6B05  # <CJK>
+0x5D31 0x8616  # <CJK>
+0x5D32 0x6AFA  # <CJK>
+0x5D33 0x6B12  # <CJK>
+0x5D34 0x6B16  # <CJK>
+0x5D35 0x9B31  # <CJK>
+0x5D36 0x6B1F  # <CJK>
+0x5D37 0x6B38  # <CJK>
+0x5D38 0x6B37  # <CJK>
+0x5D39 0x76DC  # <CJK>
+0x5D3A 0x6B39  # <CJK>
+0x5D3B 0x98EE  # <CJK>
+0x5D3C 0x6B47  # <CJK>
+0x5D3D 0x6B43  # <CJK>
+0x5D3E 0x6B49  # <CJK>
+0x5D3F 0x6B50  # <CJK>
+0x5D40 0x6B59  # <CJK>
+0x5D41 0x6B54  # <CJK>
+0x5D42 0x6B5B  # <CJK>
+0x5D43 0x6B5F  # <CJK>
+0x5D44 0x6B61  # <CJK>
+0x5D45 0x6B78  # <CJK>
+0x5D46 0x6B79  # <CJK>
+0x5D47 0x6B7F  # <CJK>
+0x5D48 0x6B80  # <CJK>
+0x5D49 0x6B84  # <CJK>
+0x5D4A 0x6B83  # <CJK>
+0x5D4B 0x6B8D  # <CJK>
+0x5D4C 0x6B98  # <CJK>
+0x5D4D 0x6B95  # <CJK>
+0x5D4E 0x6B9E  # <CJK>
+0x5D4F 0x6BA4  # <CJK>
+0x5D50 0x6BAA  # <CJK>
+0x5D51 0x6BAB  # <CJK>
+0x5D52 0x6BAF  # <CJK>
+0x5D53 0x6BB2  # <CJK>
+0x5D54 0x6BB1  # <CJK>
+0x5D55 0x6BB3  # <CJK>
+0x5D56 0x6BB7  # <CJK>
+0x5D57 0x6BBC  # <CJK>
+0x5D58 0x6BC6  # <CJK>
+0x5D59 0x6BCB  # <CJK>
+0x5D5A 0x6BD3  # <CJK>
+0x5D5B 0x6BDF  # <CJK>
+0x5D5C 0x6BEC  # <CJK>
+0x5D5D 0x6BEB  # <CJK>
+0x5D5E 0x6BF3  # <CJK>
+0x5D5F 0x6BEF  # <CJK>
+0x5D60 0x9EBE  # <CJK>
+0x5D61 0x6C08  # <CJK>
+0x5D62 0x6C13  # <CJK>
+0x5D63 0x6C14  # <CJK>
+0x5D64 0x6C1B  # <CJK>
+0x5D65 0x6C24  # <CJK>
+0x5D66 0x6C23  # <CJK>
+0x5D67 0x6C5E  # <CJK>
+0x5D68 0x6C55  # <CJK>
+0x5D69 0x6C62  # <CJK>
+0x5D6A 0x6C6A  # <CJK>
+0x5D6B 0x6C82  # <CJK>
+0x5D6C 0x6C8D  # <CJK>
+0x5D6D 0x6C9A  # <CJK>
+0x5D6E 0x6C81  # <CJK>
+0x5D6F 0x6C9B  # <CJK>
+0x5D70 0x6C7E  # <CJK>
+0x5D71 0x6C68  # <CJK>
+0x5D72 0x6C73  # <CJK>
+0x5D73 0x6C92  # <CJK>
+0x5D74 0x6C90  # <CJK>
+0x5D75 0x6CC4  # <CJK>
+0x5D76 0x6CF1  # <CJK>
+0x5D77 0x6CD3  # <CJK>
+0x5D78 0x6CBD  # <CJK>
+0x5D79 0x6CD7  # <CJK>
+0x5D7A 0x6CC5  # <CJK>
+0x5D7B 0x6CDD  # <CJK>
+0x5D7C 0x6CAE  # <CJK>
+0x5D7D 0x6CB1  # <CJK>
+0x5D7E 0x6CBE  # <CJK>
+0x5E21 0x6CBA  # <CJK>
+0x5E22 0x6CDB  # <CJK>
+0x5E23 0x6CEF  # <CJK>
+0x5E24 0x6CD9  # <CJK>
+0x5E25 0x6CEA  # <CJK>
+0x5E26 0x6D1F  # <CJK>
+0x5E27 0x884D  # <CJK>
+0x5E28 0x6D36  # <CJK>
+0x5E29 0x6D2B  # <CJK>
+0x5E2A 0x6D3D  # <CJK>
+0x5E2B 0x6D38  # <CJK>
+0x5E2C 0x6D19  # <CJK>
+0x5E2D 0x6D35  # <CJK>
+0x5E2E 0x6D33  # <CJK>
+0x5E2F 0x6D12  # <CJK>
+0x5E30 0x6D0C  # <CJK>
+0x5E31 0x6D63  # <CJK>
+0x5E32 0x6D93  # <CJK>
+0x5E33 0x6D64  # <CJK>
+0x5E34 0x6D5A  # <CJK>
+0x5E35 0x6D79  # <CJK>
+0x5E36 0x6D59  # <CJK>
+0x5E37 0x6D8E  # <CJK>
+0x5E38 0x6D95  # <CJK>
+0x5E39 0x6FE4  # <CJK>
+0x5E3A 0x6D85  # <CJK>
+0x5E3B 0x6DF9  # <CJK>
+0x5E3C 0x6E15  # <CJK>
+0x5E3D 0x6E0A  # <CJK>
+0x5E3E 0x6DB5  # <CJK>
+0x5E3F 0x6DC7  # <CJK>
+0x5E40 0x6DE6  # <CJK>
+0x5E41 0x6DB8  # <CJK>
+0x5E42 0x6DC6  # <CJK>
+0x5E43 0x6DEC  # <CJK>
+0x5E44 0x6DDE  # <CJK>
+0x5E45 0x6DCC  # <CJK>
+0x5E46 0x6DE8  # <CJK>
+0x5E47 0x6DD2  # <CJK>
+0x5E48 0x6DC5  # <CJK>
+0x5E49 0x6DFA  # <CJK>
+0x5E4A 0x6DD9  # <CJK>
+0x5E4B 0x6DE4  # <CJK>
+0x5E4C 0x6DD5  # <CJK>
+0x5E4D 0x6DEA  # <CJK>
+0x5E4E 0x6DEE  # <CJK>
+0x5E4F 0x6E2D  # <CJK>
+0x5E50 0x6E6E  # <CJK>
+0x5E51 0x6E2E  # <CJK>
+0x5E52 0x6E19  # <CJK>
+0x5E53 0x6E72  # <CJK>
+0x5E54 0x6E5F  # <CJK>
+0x5E55 0x6E3E  # <CJK>
+0x5E56 0x6E23  # <CJK>
+0x5E57 0x6E6B  # <CJK>
+0x5E58 0x6E2B  # <CJK>
+0x5E59 0x6E76  # <CJK>
+0x5E5A 0x6E4D  # <CJK>
+0x5E5B 0x6E1F  # <CJK>
+0x5E5C 0x6E43  # <CJK>
+0x5E5D 0x6E3A  # <CJK>
+0x5E5E 0x6E4E  # <CJK>
+0x5E5F 0x6E24  # <CJK>
+0x5E60 0x6EFF  # <CJK>
+0x5E61 0x6E1D  # <CJK>
+0x5E62 0x6E38  # <CJK>
+0x5E63 0x6E82  # <CJK>
+0x5E64 0x6EAA  # <CJK>
+0x5E65 0x6E98  # <CJK>
+0x5E66 0x6EC9  # <CJK>
+0x5E67 0x6EB7  # <CJK>
+0x5E68 0x6ED3  # <CJK>
+0x5E69 0x6EBD  # <CJK>
+0x5E6A 0x6EAF  # <CJK>
+0x5E6B 0x6EC4  # <CJK>
+0x5E6C 0x6EB2  # <CJK>
+0x5E6D 0x6ED4  # <CJK>
+0x5E6E 0x6ED5  # <CJK>
+0x5E6F 0x6E8F  # <CJK>
+0x5E70 0x6EA5  # <CJK>
+0x5E71 0x6EC2  # <CJK>
+0x5E72 0x6E9F  # <CJK>
+0x5E73 0x6F41  # <CJK>
+0x5E74 0x6F11  # <CJK>
+0x5E75 0x704C  # <CJK>
+0x5E76 0x6EEC  # <CJK>
+0x5E77 0x6EF8  # <CJK>
+0x5E78 0x6EFE  # <CJK>
+0x5E79 0x6F3F  # <CJK>
+0x5E7A 0x6EF2  # <CJK>
+0x5E7B 0x6F31  # <CJK>
+0x5E7C 0x6EEF  # <CJK>
+0x5E7D 0x6F32  # <CJK>
+0x5E7E 0x6ECC  # <CJK>
+0x5F21 0x6F3E  # <CJK>
+0x5F22 0x6F13  # <CJK>
+0x5F23 0x6EF7  # <CJK>
+0x5F24 0x6F86  # <CJK>
+0x5F25 0x6F7A  # <CJK>
+0x5F26 0x6F78  # <CJK>
+0x5F27 0x6F81  # <CJK>
+0x5F28 0x6F80  # <CJK>
+0x5F29 0x6F6F  # <CJK>
+0x5F2A 0x6F5B  # <CJK>
+0x5F2B 0x6FF3  # <CJK>
+0x5F2C 0x6F6D  # <CJK>
+0x5F2D 0x6F82  # <CJK>
+0x5F2E 0x6F7C  # <CJK>
+0x5F2F 0x6F58  # <CJK>
+0x5F30 0x6F8E  # <CJK>
+0x5F31 0x6F91  # <CJK>
+0x5F32 0x6FC2  # <CJK>
+0x5F33 0x6F66  # <CJK>
+0x5F34 0x6FB3  # <CJK>
+0x5F35 0x6FA3  # <CJK>
+0x5F36 0x6FA1  # <CJK>
+0x5F37 0x6FA4  # <CJK>
+0x5F38 0x6FB9  # <CJK>
+0x5F39 0x6FC6  # <CJK>
+0x5F3A 0x6FAA  # <CJK>
+0x5F3B 0x6FDF  # <CJK>
+0x5F3C 0x6FD5  # <CJK>
+0x5F3D 0x6FEC  # <CJK>
+0x5F3E 0x6FD4  # <CJK>
+0x5F3F 0x6FD8  # <CJK>
+0x5F40 0x6FF1  # <CJK>
+0x5F41 0x6FEE  # <CJK>
+0x5F42 0x6FDB  # <CJK>
+0x5F43 0x7009  # <CJK>
+0x5F44 0x700B  # <CJK>
+0x5F45 0x6FFA  # <CJK>
+0x5F46 0x7011  # <CJK>
+0x5F47 0x7001  # <CJK>
+0x5F48 0x700F  # <CJK>
+0x5F49 0x6FFE  # <CJK>
+0x5F4A 0x701B  # <CJK>
+0x5F4B 0x701A  # <CJK>
+0x5F4C 0x6F74  # <CJK>
+0x5F4D 0x701D  # <CJK>
+0x5F4E 0x7018  # <CJK>
+0x5F4F 0x701F  # <CJK>
+0x5F50 0x7030  # <CJK>
+0x5F51 0x703E  # <CJK>
+0x5F52 0x7032  # <CJK>
+0x5F53 0x7051  # <CJK>
+0x5F54 0x7063  # <CJK>
+0x5F55 0x7099  # <CJK>
+0x5F56 0x7092  # <CJK>
+0x5F57 0x70AF  # <CJK>
+0x5F58 0x70F1  # <CJK>
+0x5F59 0x70AC  # <CJK>
+0x5F5A 0x70B8  # <CJK>
+0x5F5B 0x70B3  # <CJK>
+0x5F5C 0x70AE  # <CJK>
+0x5F5D 0x70DF  # <CJK>
+0x5F5E 0x70CB  # <CJK>
+0x5F5F 0x70DD  # <CJK>
+0x5F60 0x70D9  # <CJK>
+0x5F61 0x7109  # <CJK>
+0x5F62 0x70FD  # <CJK>
+0x5F63 0x711C  # <CJK>
+0x5F64 0x7119  # <CJK>
+0x5F65 0x7165  # <CJK>
+0x5F66 0x7155  # <CJK>
+0x5F67 0x7188  # <CJK>
+0x5F68 0x7166  # <CJK>
+0x5F69 0x7162  # <CJK>
+0x5F6A 0x714C  # <CJK>
+0x5F6B 0x7156  # <CJK>
+0x5F6C 0x716C  # <CJK>
+0x5F6D 0x718F  # <CJK>
+0x5F6E 0x71FB  # <CJK>
+0x5F6F 0x7184  # <CJK>
+0x5F70 0x7195  # <CJK>
+0x5F71 0x71A8  # <CJK>
+0x5F72 0x71AC  # <CJK>
+0x5F73 0x71D7  # <CJK>
+0x5F74 0x71B9  # <CJK>
+0x5F75 0x71BE  # <CJK>
+0x5F76 0x71D2  # <CJK>
+0x5F77 0x71C9  # <CJK>
+0x5F78 0x71D4  # <CJK>
+0x5F79 0x71CE  # <CJK>
+0x5F7A 0x71E0  # <CJK>
+0x5F7B 0x71EC  # <CJK>
+0x5F7C 0x71E7  # <CJK>
+0x5F7D 0x71F5  # <CJK>
+0x5F7E 0x71FC  # <CJK>
+0x6021 0x71F9  # <CJK>
+0x6022 0x71FF  # <CJK>
+0x6023 0x720D  # <CJK>
+0x6024 0x7210  # <CJK>
+0x6025 0x721B  # <CJK>
+0x6026 0x7228  # <CJK>
+0x6027 0x722D  # <CJK>
+0x6028 0x722C  # <CJK>
+0x6029 0x7230  # <CJK>
+0x602A 0x7232  # <CJK>
+0x602B 0x723B  # <CJK>
+0x602C 0x723C  # <CJK>
+0x602D 0x723F  # <CJK>
+0x602E 0x7240  # <CJK>
+0x602F 0x7246  # <CJK>
+0x6030 0x724B  # <CJK>
+0x6031 0x7258  # <CJK>
+0x6032 0x7274  # <CJK>
+0x6033 0x727E  # <CJK>
+0x6034 0x7282  # <CJK>
+0x6035 0x7281  # <CJK>
+0x6036 0x7287  # <CJK>
+0x6037 0x7292  # <CJK>
+0x6038 0x7296  # <CJK>
+0x6039 0x72A2  # <CJK>
+0x603A 0x72A7  # <CJK>
+0x603B 0x72B9  # <CJK>
+0x603C 0x72B2  # <CJK>
+0x603D 0x72C3  # <CJK>
+0x603E 0x72C6  # <CJK>
+0x603F 0x72C4  # <CJK>
+0x6040 0x72CE  # <CJK>
+0x6041 0x72D2  # <CJK>
+0x6042 0x72E2  # <CJK>
+0x6043 0x72E0  # <CJK>
+0x6044 0x72E1  # <CJK>
+0x6045 0x72F9  # <CJK>
+0x6046 0x72F7  # <CJK>
+0x6047 0x500F  # <CJK>
+0x6048 0x7317  # <CJK>
+0x6049 0x730A  # <CJK>
+0x604A 0x731C  # <CJK>
+0x604B 0x7316  # <CJK>
+0x604C 0x731D  # <CJK>
+0x604D 0x7334  # <CJK>
+0x604E 0x732F  # <CJK>
+0x604F 0x7329  # <CJK>
+0x6050 0x7325  # <CJK>
+0x6051 0x733E  # <CJK>
+0x6052 0x734E  # <CJK>
+0x6053 0x734F  # <CJK>
+0x6054 0x9ED8  # <CJK>
+0x6055 0x7357  # <CJK>
+0x6056 0x736A  # <CJK>
+0x6057 0x7368  # <CJK>
+0x6058 0x7370  # <CJK>
+0x6059 0x7378  # <CJK>
+0x605A 0x7375  # <CJK>
+0x605B 0x737B  # <CJK>
+0x605C 0x737A  # <CJK>
+0x605D 0x73C8  # <CJK>
+0x605E 0x73B3  # <CJK>
+0x605F 0x73CE  # <CJK>
+0x6060 0x73BB  # <CJK>
+0x6061 0x73C0  # <CJK>
+0x6062 0x73E5  # <CJK>
+0x6063 0x73EE  # <CJK>
+0x6064 0x73DE  # <CJK>
+0x6065 0x74A2  # <CJK>
+0x6066 0x7405  # <CJK>
+0x6067 0x746F  # <CJK>
+0x6068 0x7425  # <CJK>
+0x6069 0x73F8  # <CJK>
+0x606A 0x7432  # <CJK>
+0x606B 0x743A  # <CJK>
+0x606C 0x7455  # <CJK>
+0x606D 0x743F  # <CJK>
+0x606E 0x745F  # <CJK>
+0x606F 0x7459  # <CJK>
+0x6070 0x7441  # <CJK>
+0x6071 0x745C  # <CJK>
+0x6072 0x7469  # <CJK>
+0x6073 0x7470  # <CJK>
+0x6074 0x7463  # <CJK>
+0x6075 0x746A  # <CJK>
+0x6076 0x7476  # <CJK>
+0x6077 0x747E  # <CJK>
+0x6078 0x748B  # <CJK>
+0x6079 0x749E  # <CJK>
+0x607A 0x74A7  # <CJK>
+0x607B 0x74CA  # <CJK>
+0x607C 0x74CF  # <CJK>
+0x607D 0x74D4  # <CJK>
+0x607E 0x73F1  # <CJK>
+0x6121 0x74E0  # <CJK>
+0x6122 0x74E3  # <CJK>
+0x6123 0x74E7  # <CJK>
+0x6124 0x74E9  # <CJK>
+0x6125 0x74EE  # <CJK>
+0x6126 0x74F2  # <CJK>
+0x6127 0x74F0  # <CJK>
+0x6128 0x74F1  # <CJK>
+0x6129 0x74F8  # <CJK>
+0x612A 0x74F7  # <CJK>
+0x612B 0x7504  # <CJK>
+0x612C 0x7503  # <CJK>
+0x612D 0x7505  # <CJK>
+0x612E 0x750C  # <CJK>
+0x612F 0x750E  # <CJK>
+0x6130 0x750D  # <CJK>
+0x6131 0x7515  # <CJK>
+0x6132 0x7513  # <CJK>
+0x6133 0x751E  # <CJK>
+0x6134 0x7526  # <CJK>
+0x6135 0x752C  # <CJK>
+0x6136 0x753C  # <CJK>
+0x6137 0x7544  # <CJK>
+0x6138 0x754D  # <CJK>
+0x6139 0x754A  # <CJK>
+0x613A 0x7549  # <CJK>
+0x613B 0x755B  # <CJK>
+0x613C 0x7546  # <CJK>
+0x613D 0x755A  # <CJK>
+0x613E 0x7569  # <CJK>
+0x613F 0x7564  # <CJK>
+0x6140 0x7567  # <CJK>
+0x6141 0x756B  # <CJK>
+0x6142 0x756D  # <CJK>
+0x6143 0x7578  # <CJK>
+0x6144 0x7576  # <CJK>
+0x6145 0x7586  # <CJK>
+0x6146 0x7587  # <CJK>
+0x6147 0x7574  # <CJK>
+0x6148 0x758A  # <CJK>
+0x6149 0x7589  # <CJK>
+0x614A 0x7582  # <CJK>
+0x614B 0x7594  # <CJK>
+0x614C 0x759A  # <CJK>
+0x614D 0x759D  # <CJK>
+0x614E 0x75A5  # <CJK>
+0x614F 0x75A3  # <CJK>
+0x6150 0x75C2  # <CJK>
+0x6151 0x75B3  # <CJK>
+0x6152 0x75C3  # <CJK>
+0x6153 0x75B5  # <CJK>
+0x6154 0x75BD  # <CJK>
+0x6155 0x75B8  # <CJK>
+0x6156 0x75BC  # <CJK>
+0x6157 0x75B1  # <CJK>
+0x6158 0x75CD  # <CJK>
+0x6159 0x75CA  # <CJK>
+0x615A 0x75D2  # <CJK>
+0x615B 0x75D9  # <CJK>
+0x615C 0x75E3  # <CJK>
+0x615D 0x75DE  # <CJK>
+0x615E 0x75FE  # <CJK>
+0x615F 0x75FF  # <CJK>
+0x6160 0x75FC  # <CJK>
+0x6161 0x7601  # <CJK>
+0x6162 0x75F0  # <CJK>
+0x6163 0x75FA  # <CJK>
+0x6164 0x75F2  # <CJK>
+0x6165 0x75F3  # <CJK>
+0x6166 0x760B  # <CJK>
+0x6167 0x760D  # <CJK>
+0x6168 0x7609  # <CJK>
+0x6169 0x761F  # <CJK>
+0x616A 0x7627  # <CJK>
+0x616B 0x7620  # <CJK>
+0x616C 0x7621  # <CJK>
+0x616D 0x7622  # <CJK>
+0x616E 0x7624  # <CJK>
+0x616F 0x7634  # <CJK>
+0x6170 0x7630  # <CJK>
+0x6171 0x763B  # <CJK>
+0x6172 0x7647  # <CJK>
+0x6173 0x7648  # <CJK>
+0x6174 0x7646  # <CJK>
+0x6175 0x765C  # <CJK>
+0x6176 0x7658  # <CJK>
+0x6177 0x7661  # <CJK>
+0x6178 0x7662  # <CJK>
+0x6179 0x7668  # <CJK>
+0x617A 0x7669  # <CJK>
+0x617B 0x766A  # <CJK>
+0x617C 0x7667  # <CJK>
+0x617D 0x766C  # <CJK>
+0x617E 0x7670  # <CJK>
+0x6221 0x7672  # <CJK>
+0x6222 0x7676  # <CJK>
+0x6223 0x7678  # <CJK>
+0x6224 0x767C  # <CJK>
+0x6225 0x7680  # <CJK>
+0x6226 0x7683  # <CJK>
+0x6227 0x7688  # <CJK>
+0x6228 0x768B  # <CJK>
+0x6229 0x768E  # <CJK>
+0x622A 0x7696  # <CJK>
+0x622B 0x7693  # <CJK>
+0x622C 0x7699  # <CJK>
+0x622D 0x769A  # <CJK>
+0x622E 0x76B0  # <CJK>
+0x622F 0x76B4  # <CJK>
+0x6230 0x76B8  # <CJK>
+0x6231 0x76B9  # <CJK>
+0x6232 0x76BA  # <CJK>
+0x6233 0x76C2  # <CJK>
+0x6234 0x76CD  # <CJK>
+0x6235 0x76D6  # <CJK>
+0x6236 0x76D2  # <CJK>
+0x6237 0x76DE  # <CJK>
+0x6238 0x76E1  # <CJK>
+0x6239 0x76E5  # <CJK>
+0x623A 0x76E7  # <CJK>
+0x623B 0x76EA  # <CJK>
+0x623C 0x862F  # <CJK>
+0x623D 0x76FB  # <CJK>
+0x623E 0x7708  # <CJK>
+0x623F 0x7707  # <CJK>
+0x6240 0x7704  # <CJK>
+0x6241 0x7729  # <CJK>
+0x6242 0x7724  # <CJK>
+0x6243 0x771E  # <CJK>
+0x6244 0x7725  # <CJK>
+0x6245 0x7726  # <CJK>
+0x6246 0x771B  # <CJK>
+0x6247 0x7737  # <CJK>
+0x6248 0x7738  # <CJK>
+0x6249 0x7747  # <CJK>
+0x624A 0x775A  # <CJK>
+0x624B 0x7768  # <CJK>
+0x624C 0x776B  # <CJK>
+0x624D 0x775B  # <CJK>
+0x624E 0x7765  # <CJK>
+0x624F 0x777F  # <CJK>
+0x6250 0x777E  # <CJK>
+0x6251 0x7779  # <CJK>
+0x6252 0x778E  # <CJK>
+0x6253 0x778B  # <CJK>
+0x6254 0x7791  # <CJK>
+0x6255 0x77A0  # <CJK>
+0x6256 0x779E  # <CJK>
+0x6257 0x77B0  # <CJK>
+0x6258 0x77B6  # <CJK>
+0x6259 0x77B9  # <CJK>
+0x625A 0x77BF  # <CJK>
+0x625B 0x77BC  # <CJK>
+0x625C 0x77BD  # <CJK>
+0x625D 0x77BB  # <CJK>
+0x625E 0x77C7  # <CJK>
+0x625F 0x77CD  # <CJK>
+0x6260 0x77D7  # <CJK>
+0x6261 0x77DA  # <CJK>
+0x6262 0x77DC  # <CJK>
+0x6263 0x77E3  # <CJK>
+0x6264 0x77EE  # <CJK>
+0x6265 0x77FC  # <CJK>
+0x6266 0x780C  # <CJK>
+0x6267 0x7812  # <CJK>
+0x6268 0x7926  # <CJK>
+0x6269 0x7820  # <CJK>
+0x626A 0x792A  # <CJK>
+0x626B 0x7845  # <CJK>
+0x626C 0x788E  # <CJK>
+0x626D 0x7874  # <CJK>
+0x626E 0x7886  # <CJK>
+0x626F 0x787C  # <CJK>
+0x6270 0x789A  # <CJK>
+0x6271 0x788C  # <CJK>
+0x6272 0x78A3  # <CJK>
+0x6273 0x78B5  # <CJK>
+0x6274 0x78AA  # <CJK>
+0x6275 0x78AF  # <CJK>
+0x6276 0x78D1  # <CJK>
+0x6277 0x78C6  # <CJK>
+0x6278 0x78CB  # <CJK>
+0x6279 0x78D4  # <CJK>
+0x627A 0x78BE  # <CJK>
+0x627B 0x78BC  # <CJK>
+0x627C 0x78C5  # <CJK>
+0x627D 0x78CA  # <CJK>
+0x627E 0x78EC  # <CJK>
+0x6321 0x78E7  # <CJK>
+0x6322 0x78DA  # <CJK>
+0x6323 0x78FD  # <CJK>
+0x6324 0x78F4  # <CJK>
+0x6325 0x7907  # <CJK>
+0x6326 0x7912  # <CJK>
+0x6327 0x7911  # <CJK>
+0x6328 0x7919  # <CJK>
+0x6329 0x792C  # <CJK>
+0x632A 0x792B  # <CJK>
+0x632B 0x7940  # <CJK>
+0x632C 0x7960  # <CJK>
+0x632D 0x7957  # <CJK>
+0x632E 0x795F  # <CJK>
+0x632F 0x795A  # <CJK>
+0x6330 0x7955  # <CJK>
+0x6331 0x7953  # <CJK>
+0x6332 0x797A  # <CJK>
+0x6333 0x797F  # <CJK>
+0x6334 0x798A  # <CJK>
+0x6335 0x799D  # <CJK>
+0x6336 0x79A7  # <CJK>
+0x6337 0x9F4B  # <CJK>
+0x6338 0x79AA  # <CJK>
+0x6339 0x79AE  # <CJK>
+0x633A 0x79B3  # <CJK>
+0x633B 0x79B9  # <CJK>
+0x633C 0x79BA  # <CJK>
+0x633D 0x79C9  # <CJK>
+0x633E 0x79D5  # <CJK>
+0x633F 0x79E7  # <CJK>
+0x6340 0x79EC  # <CJK>
+0x6341 0x79E1  # <CJK>
+0x6342 0x79E3  # <CJK>
+0x6343 0x7A08  # <CJK>
+0x6344 0x7A0D  # <CJK>
+0x6345 0x7A18  # <CJK>
+0x6346 0x7A19  # <CJK>
+0x6347 0x7A20  # <CJK>
+0x6348 0x7A1F  # <CJK>
+0x6349 0x7980  # <CJK>
+0x634A 0x7A31  # <CJK>
+0x634B 0x7A3B  # <CJK>
+0x634C 0x7A3E  # <CJK>
+0x634D 0x7A37  # <CJK>
+0x634E 0x7A43  # <CJK>
+0x634F 0x7A57  # <CJK>
+0x6350 0x7A49  # <CJK>
+0x6351 0x7A61  # <CJK>
+0x6352 0x7A62  # <CJK>
+0x6353 0x7A69  # <CJK>
+0x6354 0x9F9D  # <CJK>
+0x6355 0x7A70  # <CJK>
+0x6356 0x7A79  # <CJK>
+0x6357 0x7A7D  # <CJK>
+0x6358 0x7A88  # <CJK>
+0x6359 0x7A97  # <CJK>
+0x635A 0x7A95  # <CJK>
+0x635B 0x7A98  # <CJK>
+0x635C 0x7A96  # <CJK>
+0x635D 0x7AA9  # <CJK>
+0x635E 0x7AC8  # <CJK>
+0x635F 0x7AB0  # <CJK>
+0x6360 0x7AB6  # <CJK>
+0x6361 0x7AC5  # <CJK>
+0x6362 0x7AC4  # <CJK>
+0x6363 0x7ABF  # <CJK>
+0x6364 0x9083  # <CJK>
+0x6365 0x7AC7  # <CJK>
+0x6366 0x7ACA  # <CJK>
+0x6367 0x7ACD  # <CJK>
+0x6368 0x7ACF  # <CJK>
+0x6369 0x7AD5  # <CJK>
+0x636A 0x7AD3  # <CJK>
+0x636B 0x7AD9  # <CJK>
+0x636C 0x7ADA  # <CJK>
+0x636D 0x7ADD  # <CJK>
+0x636E 0x7AE1  # <CJK>
+0x636F 0x7AE2  # <CJK>
+0x6370 0x7AE6  # <CJK>
+0x6371 0x7AED  # <CJK>
+0x6372 0x7AF0  # <CJK>
+0x6373 0x7B02  # <CJK>
+0x6374 0x7B0F  # <CJK>
+0x6375 0x7B0A  # <CJK>
+0x6376 0x7B06  # <CJK>
+0x6377 0x7B33  # <CJK>
+0x6378 0x7B18  # <CJK>
+0x6379 0x7B19  # <CJK>
+0x637A 0x7B1E  # <CJK>
+0x637B 0x7B35  # <CJK>
+0x637C 0x7B28  # <CJK>
+0x637D 0x7B36  # <CJK>
+0x637E 0x7B50  # <CJK>
+0x6421 0x7B7A  # <CJK>
+0x6422 0x7B04  # <CJK>
+0x6423 0x7B4D  # <CJK>
+0x6424 0x7B0B  # <CJK>
+0x6425 0x7B4C  # <CJK>
+0x6426 0x7B45  # <CJK>
+0x6427 0x7B75  # <CJK>
+0x6428 0x7B65  # <CJK>
+0x6429 0x7B74  # <CJK>
+0x642A 0x7B67  # <CJK>
+0x642B 0x7B70  # <CJK>
+0x642C 0x7B71  # <CJK>
+0x642D 0x7B6C  # <CJK>
+0x642E 0x7B6E  # <CJK>
+0x642F 0x7B9D  # <CJK>
+0x6430 0x7B98  # <CJK>
+0x6431 0x7B9F  # <CJK>
+0x6432 0x7B8D  # <CJK>
+0x6433 0x7B9C  # <CJK>
+0x6434 0x7B9A  # <CJK>
+0x6435 0x7B8B  # <CJK>
+0x6436 0x7B92  # <CJK>
+0x6437 0x7B8F  # <CJK>
+0x6438 0x7B5D  # <CJK>
+0x6439 0x7B99  # <CJK>
+0x643A 0x7BCB  # <CJK>
+0x643B 0x7BC1  # <CJK>
+0x643C 0x7BCC  # <CJK>
+0x643D 0x7BCF  # <CJK>
+0x643E 0x7BB4  # <CJK>
+0x643F 0x7BC6  # <CJK>
+0x6440 0x7BDD  # <CJK>
+0x6441 0x7BE9  # <CJK>
+0x6442 0x7C11  # <CJK>
+0x6443 0x7C14  # <CJK>
+0x6444 0x7BE6  # <CJK>
+0x6445 0x7BE5  # <CJK>
+0x6446 0x7C60  # <CJK>
+0x6447 0x7C00  # <CJK>
+0x6448 0x7C07  # <CJK>
+0x6449 0x7C13  # <CJK>
+0x644A 0x7BF3  # <CJK>
+0x644B 0x7BF7  # <CJK>
+0x644C 0x7C17  # <CJK>
+0x644D 0x7C0D  # <CJK>
+0x644E 0x7BF6  # <CJK>
+0x644F 0x7C23  # <CJK>
+0x6450 0x7C27  # <CJK>
+0x6451 0x7C2A  # <CJK>
+0x6452 0x7C1F  # <CJK>
+0x6453 0x7C37  # <CJK>
+0x6454 0x7C2B  # <CJK>
+0x6455 0x7C3D  # <CJK>
+0x6456 0x7C4C  # <CJK>
+0x6457 0x7C43  # <CJK>
+0x6458 0x7C54  # <CJK>
+0x6459 0x7C4F  # <CJK>
+0x645A 0x7C40  # <CJK>
+0x645B 0x7C50  # <CJK>
+0x645C 0x7C58  # <CJK>
+0x645D 0x7C5F  # <CJK>
+0x645E 0x7C64  # <CJK>
+0x645F 0x7C56  # <CJK>
+0x6460 0x7C65  # <CJK>
+0x6461 0x7C6C  # <CJK>
+0x6462 0x7C75  # <CJK>
+0x6463 0x7C83  # <CJK>
+0x6464 0x7C90  # <CJK>
+0x6465 0x7CA4  # <CJK>
+0x6466 0x7CAD  # <CJK>
+0x6467 0x7CA2  # <CJK>
+0x6468 0x7CAB  # <CJK>
+0x6469 0x7CA1  # <CJK>
+0x646A 0x7CA8  # <CJK>
+0x646B 0x7CB3  # <CJK>
+0x646C 0x7CB2  # <CJK>
+0x646D 0x7CB1  # <CJK>
+0x646E 0x7CAE  # <CJK>
+0x646F 0x7CB9  # <CJK>
+0x6470 0x7CBD  # <CJK>
+0x6471 0x7CC0  # <CJK>
+0x6472 0x7CC5  # <CJK>
+0x6473 0x7CC2  # <CJK>
+0x6474 0x7CD8  # <CJK>
+0x6475 0x7CD2  # <CJK>
+0x6476 0x7CDC  # <CJK>
+0x6477 0x7CE2  # <CJK>
+0x6478 0x9B3B  # <CJK>
+0x6479 0x7CEF  # <CJK>
+0x647A 0x7CF2  # <CJK>
+0x647B 0x7CF4  # <CJK>
+0x647C 0x7CF6  # <CJK>
+0x647D 0x7CFA  # <CJK>
+0x647E 0x7D06  # <CJK>
+0x6521 0x7D02  # <CJK>
+0x6522 0x7D1C  # <CJK>
+0x6523 0x7D15  # <CJK>
+0x6524 0x7D0A  # <CJK>
+0x6525 0x7D45  # <CJK>
+0x6526 0x7D4B  # <CJK>
+0x6527 0x7D2E  # <CJK>
+0x6528 0x7D32  # <CJK>
+0x6529 0x7D3F  # <CJK>
+0x652A 0x7D35  # <CJK>
+0x652B 0x7D46  # <CJK>
+0x652C 0x7D73  # <CJK>
+0x652D 0x7D56  # <CJK>
+0x652E 0x7D4E  # <CJK>
+0x652F 0x7D72  # <CJK>
+0x6530 0x7D68  # <CJK>
+0x6531 0x7D6E  # <CJK>
+0x6532 0x7D4F  # <CJK>
+0x6533 0x7D63  # <CJK>
+0x6534 0x7D93  # <CJK>
+0x6535 0x7D89  # <CJK>
+0x6536 0x7D5B  # <CJK>
+0x6537 0x7D8F  # <CJK>
+0x6538 0x7D7D  # <CJK>
+0x6539 0x7D9B  # <CJK>
+0x653A 0x7DBA  # <CJK>
+0x653B 0x7DAE  # <CJK>
+0x653C 0x7DA3  # <CJK>
+0x653D 0x7DB5  # <CJK>
+0x653E 0x7DC7  # <CJK>
+0x653F 0x7DBD  # <CJK>
+0x6540 0x7DAB  # <CJK>
+0x6541 0x7E3D  # <CJK>
+0x6542 0x7DA2  # <CJK>
+0x6543 0x7DAF  # <CJK>
+0x6544 0x7DDC  # <CJK>
+0x6545 0x7DB8  # <CJK>
+0x6546 0x7D9F  # <CJK>
+0x6547 0x7DB0  # <CJK>
+0x6548 0x7DD8  # <CJK>
+0x6549 0x7DDD  # <CJK>
+0x654A 0x7DE4  # <CJK>
+0x654B 0x7DDE  # <CJK>
+0x654C 0x7DFB  # <CJK>
+0x654D 0x7DF2  # <CJK>
+0x654E 0x7DE1  # <CJK>
+0x654F 0x7E05  # <CJK>
+0x6550 0x7E0A  # <CJK>
+0x6551 0x7E23  # <CJK>
+0x6552 0x7E21  # <CJK>
+0x6553 0x7E12  # <CJK>
+0x6554 0x7E31  # <CJK>
+0x6555 0x7E1F  # <CJK>
+0x6556 0x7E09  # <CJK>
+0x6557 0x7E0B  # <CJK>
+0x6558 0x7E22  # <CJK>
+0x6559 0x7E46  # <CJK>
+0x655A 0x7E66  # <CJK>
+0x655B 0x7E3B  # <CJK>
+0x655C 0x7E35  # <CJK>
+0x655D 0x7E39  # <CJK>
+0x655E 0x7E43  # <CJK>
+0x655F 0x7E37  # <CJK>
+0x6560 0x7E32  # <CJK>
+0x6561 0x7E3A  # <CJK>
+0x6562 0x7E67  # <CJK>
+0x6563 0x7E5D  # <CJK>
+0x6564 0x7E56  # <CJK>
+0x6565 0x7E5E  # <CJK>
+0x6566 0x7E59  # <CJK>
+0x6567 0x7E5A  # <CJK>
+0x6568 0x7E79  # <CJK>
+0x6569 0x7E6A  # <CJK>
+0x656A 0x7E69  # <CJK>
+0x656B 0x7E7C  # <CJK>
+0x656C 0x7E7B  # <CJK>
+0x656D 0x7E83  # <CJK>
+0x656E 0x7DD5  # <CJK>
+0x656F 0x7E7D  # <CJK>
+0x6570 0x8FAE  # <CJK>
+0x6571 0x7E7F  # <CJK>
+0x6572 0x7E88  # <CJK>
+0x6573 0x7E89  # <CJK>
+0x6574 0x7E8C  # <CJK>
+0x6575 0x7E92  # <CJK>
+0x6576 0x7E90  # <CJK>
+0x6577 0x7E93  # <CJK>
+0x6578 0x7E94  # <CJK>
+0x6579 0x7E96  # <CJK>
+0x657A 0x7E8E  # <CJK>
+0x657B 0x7E9B  # <CJK>
+0x657C 0x7E9C  # <CJK>
+0x657D 0x7F38  # <CJK>
+0x657E 0x7F3A  # <CJK>
+0x6621 0x7F45  # <CJK>
+0x6622 0x7F4C  # <CJK>
+0x6623 0x7F4D  # <CJK>
+0x6624 0x7F4E  # <CJK>
+0x6625 0x7F50  # <CJK>
+0x6626 0x7F51  # <CJK>
+0x6627 0x7F55  # <CJK>
+0x6628 0x7F54  # <CJK>
+0x6629 0x7F58  # <CJK>
+0x662A 0x7F5F  # <CJK>
+0x662B 0x7F60  # <CJK>
+0x662C 0x7F68  # <CJK>
+0x662D 0x7F69  # <CJK>
+0x662E 0x7F67  # <CJK>
+0x662F 0x7F78  # <CJK>
+0x6630 0x7F82  # <CJK>
+0x6631 0x7F86  # <CJK>
+0x6632 0x7F83  # <CJK>
+0x6633 0x7F88  # <CJK>
+0x6634 0x7F87  # <CJK>
+0x6635 0x7F8C  # <CJK>
+0x6636 0x7F94  # <CJK>
+0x6637 0x7F9E  # <CJK>
+0x6638 0x7F9D  # <CJK>
+0x6639 0x7F9A  # <CJK>
+0x663A 0x7FA3  # <CJK>
+0x663B 0x7FAF  # <CJK>
+0x663C 0x7FB2  # <CJK>
+0x663D 0x7FB9  # <CJK>
+0x663E 0x7FAE  # <CJK>
+0x663F 0x7FB6  # <CJK>
+0x6640 0x7FB8  # <CJK>
+0x6641 0x8B71  # <CJK>
+0x6642 0x7FC5  # <CJK>
+0x6643 0x7FC6  # <CJK>
+0x6644 0x7FCA  # <CJK>
+0x6645 0x7FD5  # <CJK>
+0x6646 0x7FD4  # <CJK>
+0x6647 0x7FE1  # <CJK>
+0x6648 0x7FE6  # <CJK>
+0x6649 0x7FE9  # <CJK>
+0x664A 0x7FF3  # <CJK>
+0x664B 0x7FF9  # <CJK>
+0x664C 0x98DC  # <CJK>
+0x664D 0x8006  # <CJK>
+0x664E 0x8004  # <CJK>
+0x664F 0x800B  # <CJK>
+0x6650 0x8012  # <CJK>
+0x6651 0x8018  # <CJK>
+0x6652 0x8019  # <CJK>
+0x6653 0x801C  # <CJK>
+0x6654 0x8021  # <CJK>
+0x6655 0x8028  # <CJK>
+0x6656 0x803F  # <CJK>
+0x6657 0x803B  # <CJK>
+0x6658 0x804A  # <CJK>
+0x6659 0x8046  # <CJK>
+0x665A 0x8052  # <CJK>
+0x665B 0x8058  # <CJK>
+0x665C 0x805A  # <CJK>
+0x665D 0x805F  # <CJK>
+0x665E 0x8062  # <CJK>
+0x665F 0x8068  # <CJK>
+0x6660 0x8073  # <CJK>
+0x6661 0x8072  # <CJK>
+0x6662 0x8070  # <CJK>
+0x6663 0x8076  # <CJK>
+0x6664 0x8079  # <CJK>
+0x6665 0x807D  # <CJK>
+0x6666 0x807F  # <CJK>
+0x6667 0x8084  # <CJK>
+0x6668 0x8086  # <CJK>
+0x6669 0x8085  # <CJK>
+0x666A 0x809B  # <CJK>
+0x666B 0x8093  # <CJK>
+0x666C 0x809A  # <CJK>
+0x666D 0x80AD  # <CJK>
+0x666E 0x5190  # <CJK>
+0x666F 0x80AC  # <CJK>
+0x6670 0x80DB  # <CJK>
+0x6671 0x80E5  # <CJK>
+0x6672 0x80D9  # <CJK>
+0x6673 0x80DD  # <CJK>
+0x6674 0x80C4  # <CJK>
+0x6675 0x80DA  # <CJK>
+0x6676 0x80D6  # <CJK>
+0x6677 0x8109  # <CJK>
+0x6678 0x80EF  # <CJK>
+0x6679 0x80F1  # <CJK>
+0x667A 0x811B  # <CJK>
+0x667B 0x8129  # <CJK>
+0x667C 0x8123  # <CJK>
+0x667D 0x812F  # <CJK>
+0x667E 0x814B  # <CJK>
+0x6721 0x968B  # <CJK>
+0x6722 0x8146  # <CJK>
+0x6723 0x813E  # <CJK>
+0x6724 0x8153  # <CJK>
+0x6725 0x8151  # <CJK>
+0x6726 0x80FC  # <CJK>
+0x6727 0x8171  # <CJK>
+0x6728 0x816E  # <CJK>
+0x6729 0x8165  # <CJK>
+0x672A 0x8166  # <CJK>
+0x672B 0x8174  # <CJK>
+0x672C 0x8183  # <CJK>
+0x672D 0x8188  # <CJK>
+0x672E 0x818A  # <CJK>
+0x672F 0x8180  # <CJK>
+0x6730 0x8182  # <CJK>
+0x6731 0x81A0  # <CJK>
+0x6732 0x8195  # <CJK>
+0x6733 0x81A4  # <CJK>
+0x6734 0x81A3  # <CJK>
+0x6735 0x815F  # <CJK>
+0x6736 0x8193  # <CJK>
+0x6737 0x81A9  # <CJK>
+0x6738 0x81B0  # <CJK>
+0x6739 0x81B5  # <CJK>
+0x673A 0x81BE  # <CJK>
+0x673B 0x81B8  # <CJK>
+0x673C 0x81BD  # <CJK>
+0x673D 0x81C0  # <CJK>
+0x673E 0x81C2  # <CJK>
+0x673F 0x81BA  # <CJK>
+0x6740 0x81C9  # <CJK>
+0x6741 0x81CD  # <CJK>
+0x6742 0x81D1  # <CJK>
+0x6743 0x81D9  # <CJK>
+0x6744 0x81D8  # <CJK>
+0x6745 0x81C8  # <CJK>
+0x6746 0x81DA  # <CJK>
+0x6747 0x81DF  # <CJK>
+0x6748 0x81E0  # <CJK>
+0x6749 0x81E7  # <CJK>
+0x674A 0x81FA  # <CJK>
+0x674B 0x81FB  # <CJK>
+0x674C 0x81FE  # <CJK>
+0x674D 0x8201  # <CJK>
+0x674E 0x8202  # <CJK>
+0x674F 0x8205  # <CJK>
+0x6750 0x8207  # <CJK>
+0x6751 0x820A  # <CJK>
+0x6752 0x820D  # <CJK>
+0x6753 0x8210  # <CJK>
+0x6754 0x8216  # <CJK>
+0x6755 0x8229  # <CJK>
+0x6756 0x822B  # <CJK>
+0x6757 0x8238  # <CJK>
+0x6758 0x8233  # <CJK>
+0x6759 0x8240  # <CJK>
+0x675A 0x8259  # <CJK>
+0x675B 0x8258  # <CJK>
+0x675C 0x825D  # <CJK>
+0x675D 0x825A  # <CJK>
+0x675E 0x825F  # <CJK>
+0x675F 0x8264  # <CJK>
+0x6760 0x8262  # <CJK>
+0x6761 0x8268  # <CJK>
+0x6762 0x826A  # <CJK>
+0x6763 0x826B  # <CJK>
+0x6764 0x822E  # <CJK>
+0x6765 0x8271  # <CJK>
+0x6766 0x8277  # <CJK>
+0x6767 0x8278  # <CJK>
+0x6768 0x827E  # <CJK>
+0x6769 0x828D  # <CJK>
+0x676A 0x8292  # <CJK>
+0x676B 0x82AB  # <CJK>
+0x676C 0x829F  # <CJK>
+0x676D 0x82BB  # <CJK>
+0x676E 0x82AC  # <CJK>
+0x676F 0x82E1  # <CJK>
+0x6770 0x82E3  # <CJK>
+0x6771 0x82DF  # <CJK>
+0x6772 0x82D2  # <CJK>
+0x6773 0x82F4  # <CJK>
+0x6774 0x82F3  # <CJK>
+0x6775 0x82FA  # <CJK>
+0x6776 0x8393  # <CJK>
+0x6777 0x8303  # <CJK>
+0x6778 0x82FB  # <CJK>
+0x6779 0x82F9  # <CJK>
+0x677A 0x82DE  # <CJK>
+0x677B 0x8306  # <CJK>
+0x677C 0x82DC  # <CJK>
+0x677D 0x8309  # <CJK>
+0x677E 0x82D9  # <CJK>
+0x6821 0x8335  # <CJK>
+0x6822 0x8334  # <CJK>
+0x6823 0x8316  # <CJK>
+0x6824 0x8332  # <CJK>
+0x6825 0x8331  # <CJK>
+0x6826 0x8340  # <CJK>
+0x6827 0x8339  # <CJK>
+0x6828 0x8350  # <CJK>
+0x6829 0x8345  # <CJK>
+0x682A 0x832F  # <CJK>
+0x682B 0x832B  # <CJK>
+0x682C 0x8317  # <CJK>
+0x682D 0x8318  # <CJK>
+0x682E 0x8385  # <CJK>
+0x682F 0x839A  # <CJK>
+0x6830 0x83AA  # <CJK>
+0x6831 0x839F  # <CJK>
+0x6832 0x83A2  # <CJK>
+0x6833 0x8396  # <CJK>
+0x6834 0x8323  # <CJK>
+0x6835 0x838E  # <CJK>
+0x6836 0x8387  # <CJK>
+0x6837 0x838A  # <CJK>
+0x6838 0x837C  # <CJK>
+0x6839 0x83B5  # <CJK>
+0x683A 0x8373  # <CJK>
+0x683B 0x8375  # <CJK>
+0x683C 0x83A0  # <CJK>
+0x683D 0x8389  # <CJK>
+0x683E 0x83A8  # <CJK>
+0x683F 0x83F4  # <CJK>
+0x6840 0x8413  # <CJK>
+0x6841 0x83EB  # <CJK>
+0x6842 0x83CE  # <CJK>
+0x6843 0x83FD  # <CJK>
+0x6844 0x8403  # <CJK>
+0x6845 0x83D8  # <CJK>
+0x6846 0x840B  # <CJK>
+0x6847 0x83C1  # <CJK>
+0x6848 0x83F7  # <CJK>
+0x6849 0x8407  # <CJK>
+0x684A 0x83E0  # <CJK>
+0x684B 0x83F2  # <CJK>
+0x684C 0x840D  # <CJK>
+0x684D 0x8422  # <CJK>
+0x684E 0x8420  # <CJK>
+0x684F 0x83BD  # <CJK>
+0x6850 0x8438  # <CJK>
+0x6851 0x8506  # <CJK>
+0x6852 0x83FB  # <CJK>
+0x6853 0x846D  # <CJK>
+0x6854 0x842A  # <CJK>
+0x6855 0x843C  # <CJK>
+0x6856 0x855A  # <CJK>
+0x6857 0x8484  # <CJK>
+0x6858 0x8477  # <CJK>
+0x6859 0x846B  # <CJK>
+0x685A 0x84AD  # <CJK>
+0x685B 0x846E  # <CJK>
+0x685C 0x8482  # <CJK>
+0x685D 0x8469  # <CJK>
+0x685E 0x8446  # <CJK>
+0x685F 0x842C  # <CJK>
+0x6860 0x846F  # <CJK>
+0x6861 0x8479  # <CJK>
+0x6862 0x8435  # <CJK>
+0x6863 0x84CA  # <CJK>
+0x6864 0x8462  # <CJK>
+0x6865 0x84B9  # <CJK>
+0x6866 0x84BF  # <CJK>
+0x6867 0x849F  # <CJK>
+0x6868 0x84D9  # <CJK>
+0x6869 0x84CD  # <CJK>
+0x686A 0x84BB  # <CJK>
+0x686B 0x84DA  # <CJK>
+0x686C 0x84D0  # <CJK>
+0x686D 0x84C1  # <CJK>
+0x686E 0x84C6  # <CJK>
+0x686F 0x84D6  # <CJK>
+0x6870 0x84A1  # <CJK>
+0x6871 0x8521  # <CJK>
+0x6872 0x84FF  # <CJK>
+0x6873 0x84F4  # <CJK>
+0x6874 0x8517  # <CJK>
+0x6875 0x8518  # <CJK>
+0x6876 0x852C  # <CJK>
+0x6877 0x851F  # <CJK>
+0x6878 0x8515  # <CJK>
+0x6879 0x8514  # <CJK>
+0x687A 0x84FC  # <CJK>
+0x687B 0x8540  # <CJK>
+0x687C 0x8563  # <CJK>
+0x687D 0x8558  # <CJK>
+0x687E 0x8548  # <CJK>
+0x6921 0x8541  # <CJK>
+0x6922 0x8602  # <CJK>
+0x6923 0x854B  # <CJK>
+0x6924 0x8555  # <CJK>
+0x6925 0x8580  # <CJK>
+0x6926 0x85A4  # <CJK>
+0x6927 0x8588  # <CJK>
+0x6928 0x8591  # <CJK>
+0x6929 0x858A  # <CJK>
+0x692A 0x85A8  # <CJK>
+0x692B 0x856D  # <CJK>
+0x692C 0x8594  # <CJK>
+0x692D 0x859B  # <CJK>
+0x692E 0x85EA  # <CJK>
+0x692F 0x8587  # <CJK>
+0x6930 0x859C  # <CJK>
+0x6931 0x8577  # <CJK>
+0x6932 0x857E  # <CJK>
+0x6933 0x8590  # <CJK>
+0x6934 0x85C9  # <CJK>
+0x6935 0x85BA  # <CJK>
+0x6936 0x85CF  # <CJK>
+0x6937 0x85B9  # <CJK>
+0x6938 0x85D0  # <CJK>
+0x6939 0x85D5  # <CJK>
+0x693A 0x85DD  # <CJK>
+0x693B 0x85E5  # <CJK>
+0x693C 0x85DC  # <CJK>
+0x693D 0x85F9  # <CJK>
+0x693E 0x860A  # <CJK>
+0x693F 0x8613  # <CJK>
+0x6940 0x860B  # <CJK>
+0x6941 0x85FE  # <CJK>
+0x6942 0x85FA  # <CJK>
+0x6943 0x8606  # <CJK>
+0x6944 0x8622  # <CJK>
+0x6945 0x861A  # <CJK>
+0x6946 0x8630  # <CJK>
+0x6947 0x863F  # <CJK>
+0x6948 0x864D  # <CJK>
+0x6949 0x4E55  # <CJK>
+0x694A 0x8654  # <CJK>
+0x694B 0x865F  # <CJK>
+0x694C 0x8667  # <CJK>
+0x694D 0x8671  # <CJK>
+0x694E 0x8693  # <CJK>
+0x694F 0x86A3  # <CJK>
+0x6950 0x86A9  # <CJK>
+0x6951 0x86AA  # <CJK>
+0x6952 0x868B  # <CJK>
+0x6953 0x868C  # <CJK>
+0x6954 0x86B6  # <CJK>
+0x6955 0x86AF  # <CJK>
+0x6956 0x86C4  # <CJK>
+0x6957 0x86C6  # <CJK>
+0x6958 0x86B0  # <CJK>
+0x6959 0x86C9  # <CJK>
+0x695A 0x8823  # <CJK>
+0x695B 0x86AB  # <CJK>
+0x695C 0x86D4  # <CJK>
+0x695D 0x86DE  # <CJK>
+0x695E 0x86E9  # <CJK>
+0x695F 0x86EC  # <CJK>
+0x6960 0x86DF  # <CJK>
+0x6961 0x86DB  # <CJK>
+0x6962 0x86EF  # <CJK>
+0x6963 0x8712  # <CJK>
+0x6964 0x8706  # <CJK>
+0x6965 0x8708  # <CJK>
+0x6966 0x8700  # <CJK>
+0x6967 0x8703  # <CJK>
+0x6968 0x86FB  # <CJK>
+0x6969 0x8711  # <CJK>
+0x696A 0x8709  # <CJK>
+0x696B 0x870D  # <CJK>
+0x696C 0x86F9  # <CJK>
+0x696D 0x870A  # <CJK>
+0x696E 0x8734  # <CJK>
+0x696F 0x873F  # <CJK>
+0x6970 0x8737  # <CJK>
+0x6971 0x873B  # <CJK>
+0x6972 0x8725  # <CJK>
+0x6973 0x8729  # <CJK>
+0x6974 0x871A  # <CJK>
+0x6975 0x8760  # <CJK>
+0x6976 0x875F  # <CJK>
+0x6977 0x8778  # <CJK>
+0x6978 0x874C  # <CJK>
+0x6979 0x874E  # <CJK>
+0x697A 0x8774  # <CJK>
+0x697B 0x8757  # <CJK>
+0x697C 0x8768  # <CJK>
+0x697D 0x876E  # <CJK>
+0x697E 0x8759  # <CJK>
+0x6A21 0x8753  # <CJK>
+0x6A22 0x8763  # <CJK>
+0x6A23 0x876A  # <CJK>
+0x6A24 0x8805  # <CJK>
+0x6A25 0x87A2  # <CJK>
+0x6A26 0x879F  # <CJK>
+0x6A27 0x8782  # <CJK>
+0x6A28 0x87AF  # <CJK>
+0x6A29 0x87CB  # <CJK>
+0x6A2A 0x87BD  # <CJK>
+0x6A2B 0x87C0  # <CJK>
+0x6A2C 0x87D0  # <CJK>
+0x6A2D 0x96D6  # <CJK>
+0x6A2E 0x87AB  # <CJK>
+0x6A2F 0x87C4  # <CJK>
+0x6A30 0x87B3  # <CJK>
+0x6A31 0x87C7  # <CJK>
+0x6A32 0x87C6  # <CJK>
+0x6A33 0x87BB  # <CJK>
+0x6A34 0x87EF  # <CJK>
+0x6A35 0x87F2  # <CJK>
+0x6A36 0x87E0  # <CJK>
+0x6A37 0x880F  # <CJK>
+0x6A38 0x880D  # <CJK>
+0x6A39 0x87FE  # <CJK>
+0x6A3A 0x87F6  # <CJK>
+0x6A3B 0x87F7  # <CJK>
+0x6A3C 0x880E  # <CJK>
+0x6A3D 0x87D2  # <CJK>
+0x6A3E 0x8811  # <CJK>
+0x6A3F 0x8816  # <CJK>
+0x6A40 0x8815  # <CJK>
+0x6A41 0x8822  # <CJK>
+0x6A42 0x8821  # <CJK>
+0x6A43 0x8831  # <CJK>
+0x6A44 0x8836  # <CJK>
+0x6A45 0x8839  # <CJK>
+0x6A46 0x8827  # <CJK>
+0x6A47 0x883B  # <CJK>
+0x6A48 0x8844  # <CJK>
+0x6A49 0x8842  # <CJK>
+0x6A4A 0x8852  # <CJK>
+0x6A4B 0x8859  # <CJK>
+0x6A4C 0x885E  # <CJK>
+0x6A4D 0x8862  # <CJK>
+0x6A4E 0x886B  # <CJK>
+0x6A4F 0x8881  # <CJK>
+0x6A50 0x887E  # <CJK>
+0x6A51 0x889E  # <CJK>
+0x6A52 0x8875  # <CJK>
+0x6A53 0x887D  # <CJK>
+0x6A54 0x88B5  # <CJK>
+0x6A55 0x8872  # <CJK>
+0x6A56 0x8882  # <CJK>
+0x6A57 0x8897  # <CJK>
+0x6A58 0x8892  # <CJK>
+0x6A59 0x88AE  # <CJK>
+0x6A5A 0x8899  # <CJK>
+0x6A5B 0x88A2  # <CJK>
+0x6A5C 0x888D  # <CJK>
+0x6A5D 0x88A4  # <CJK>
+0x6A5E 0x88B0  # <CJK>
+0x6A5F 0x88BF  # <CJK>
+0x6A60 0x88B1  # <CJK>
+0x6A61 0x88C3  # <CJK>
+0x6A62 0x88C4  # <CJK>
+0x6A63 0x88D4  # <CJK>
+0x6A64 0x88D8  # <CJK>
+0x6A65 0x88D9  # <CJK>
+0x6A66 0x88DD  # <CJK>
+0x6A67 0x88F9  # <CJK>
+0x6A68 0x8902  # <CJK>
+0x6A69 0x88FC  # <CJK>
+0x6A6A 0x88F4  # <CJK>
+0x6A6B 0x88E8  # <CJK>
+0x6A6C 0x88F2  # <CJK>
+0x6A6D 0x8904  # <CJK>
+0x6A6E 0x890C  # <CJK>
+0x6A6F 0x890A  # <CJK>
+0x6A70 0x8913  # <CJK>
+0x6A71 0x8943  # <CJK>
+0x6A72 0x891E  # <CJK>
+0x6A73 0x8925  # <CJK>
+0x6A74 0x892A  # <CJK>
+0x6A75 0x892B  # <CJK>
+0x6A76 0x8941  # <CJK>
+0x6A77 0x8944  # <CJK>
+0x6A78 0x893B  # <CJK>
+0x6A79 0x8936  # <CJK>
+0x6A7A 0x8938  # <CJK>
+0x6A7B 0x894C  # <CJK>
+0x6A7C 0x891D  # <CJK>
+0x6A7D 0x8960  # <CJK>
+0x6A7E 0x895E  # <CJK>
+0x6B21 0x8966  # <CJK>
+0x6B22 0x8964  # <CJK>
+0x6B23 0x896D  # <CJK>
+0x6B24 0x896A  # <CJK>
+0x6B25 0x896F  # <CJK>
+0x6B26 0x8974  # <CJK>
+0x6B27 0x8977  # <CJK>
+0x6B28 0x897E  # <CJK>
+0x6B29 0x8983  # <CJK>
+0x6B2A 0x8988  # <CJK>
+0x6B2B 0x898A  # <CJK>
+0x6B2C 0x8993  # <CJK>
+0x6B2D 0x8998  # <CJK>
+0x6B2E 0x89A1  # <CJK>
+0x6B2F 0x89A9  # <CJK>
+0x6B30 0x89A6  # <CJK>
+0x6B31 0x89AC  # <CJK>
+0x6B32 0x89AF  # <CJK>
+0x6B33 0x89B2  # <CJK>
+0x6B34 0x89BA  # <CJK>
+0x6B35 0x89BD  # <CJK>
+0x6B36 0x89BF  # <CJK>
+0x6B37 0x89C0  # <CJK>
+0x6B38 0x89DA  # <CJK>
+0x6B39 0x89DC  # <CJK>
+0x6B3A 0x89DD  # <CJK>
+0x6B3B 0x89E7  # <CJK>
+0x6B3C 0x89F4  # <CJK>
+0x6B3D 0x89F8  # <CJK>
+0x6B3E 0x8A03  # <CJK>
+0x6B3F 0x8A16  # <CJK>
+0x6B40 0x8A10  # <CJK>
+0x6B41 0x8A0C  # <CJK>
+0x6B42 0x8A1B  # <CJK>
+0x6B43 0x8A1D  # <CJK>
+0x6B44 0x8A25  # <CJK>
+0x6B45 0x8A36  # <CJK>
+0x6B46 0x8A41  # <CJK>
+0x6B47 0x8A5B  # <CJK>
+0x6B48 0x8A52  # <CJK>
+0x6B49 0x8A46  # <CJK>
+0x6B4A 0x8A48  # <CJK>
+0x6B4B 0x8A7C  # <CJK>
+0x6B4C 0x8A6D  # <CJK>
+0x6B4D 0x8A6C  # <CJK>
+0x6B4E 0x8A62  # <CJK>
+0x6B4F 0x8A85  # <CJK>
+0x6B50 0x8A82  # <CJK>
+0x6B51 0x8A84  # <CJK>
+0x6B52 0x8AA8  # <CJK>
+0x6B53 0x8AA1  # <CJK>
+0x6B54 0x8A91  # <CJK>
+0x6B55 0x8AA5  # <CJK>
+0x6B56 0x8AA6  # <CJK>
+0x6B57 0x8A9A  # <CJK>
+0x6B58 0x8AA3  # <CJK>
+0x6B59 0x8AC4  # <CJK>
+0x6B5A 0x8ACD  # <CJK>
+0x6B5B 0x8AC2  # <CJK>
+0x6B5C 0x8ADA  # <CJK>
+0x6B5D 0x8AEB  # <CJK>
+0x6B5E 0x8AF3  # <CJK>
+0x6B5F 0x8AE7  # <CJK>
+0x6B60 0x8AE4  # <CJK>
+0x6B61 0x8AF1  # <CJK>
+0x6B62 0x8B14  # <CJK>
+0x6B63 0x8AE0  # <CJK>
+0x6B64 0x8AE2  # <CJK>
+0x6B65 0x8AF7  # <CJK>
+0x6B66 0x8ADE  # <CJK>
+0x6B67 0x8ADB  # <CJK>
+0x6B68 0x8B0C  # <CJK>
+0x6B69 0x8B07  # <CJK>
+0x6B6A 0x8B1A  # <CJK>
+0x6B6B 0x8AE1  # <CJK>
+0x6B6C 0x8B16  # <CJK>
+0x6B6D 0x8B10  # <CJK>
+0x6B6E 0x8B17  # <CJK>
+0x6B6F 0x8B20  # <CJK>
+0x6B70 0x8B33  # <CJK>
+0x6B71 0x97AB  # <CJK>
+0x6B72 0x8B26  # <CJK>
+0x6B73 0x8B2B  # <CJK>
+0x6B74 0x8B3E  # <CJK>
+0x6B75 0x8B28  # <CJK>
+0x6B76 0x8B41  # <CJK>
+0x6B77 0x8B4C  # <CJK>
+0x6B78 0x8B4F  # <CJK>
+0x6B79 0x8B4E  # <CJK>
+0x6B7A 0x8B49  # <CJK>
+0x6B7B 0x8B56  # <CJK>
+0x6B7C 0x8B5B  # <CJK>
+0x6B7D 0x8B5A  # <CJK>
+0x6B7E 0x8B6B  # <CJK>
+0x6C21 0x8B5F  # <CJK>
+0x6C22 0x8B6C  # <CJK>
+0x6C23 0x8B6F  # <CJK>
+0x6C24 0x8B74  # <CJK>
+0x6C25 0x8B7D  # <CJK>
+0x6C26 0x8B80  # <CJK>
+0x6C27 0x8B8C  # <CJK>
+0x6C28 0x8B8E  # <CJK>
+0x6C29 0x8B92  # <CJK>
+0x6C2A 0x8B93  # <CJK>
+0x6C2B 0x8B96  # <CJK>
+0x6C2C 0x8B99  # <CJK>
+0x6C2D 0x8B9A  # <CJK>
+0x6C2E 0x8C3A  # <CJK>
+0x6C2F 0x8C41  # <CJK>
+0x6C30 0x8C3F  # <CJK>
+0x6C31 0x8C48  # <CJK>
+0x6C32 0x8C4C  # <CJK>
+0x6C33 0x8C4E  # <CJK>
+0x6C34 0x8C50  # <CJK>
+0x6C35 0x8C55  # <CJK>
+0x6C36 0x8C62  # <CJK>
+0x6C37 0x8C6C  # <CJK>
+0x6C38 0x8C78  # <CJK>
+0x6C39 0x8C7A  # <CJK>
+0x6C3A 0x8C82  # <CJK>
+0x6C3B 0x8C89  # <CJK>
+0x6C3C 0x8C85  # <CJK>
+0x6C3D 0x8C8A  # <CJK>
+0x6C3E 0x8C8D  # <CJK>
+0x6C3F 0x8C8E  # <CJK>
+0x6C40 0x8C94  # <CJK>
+0x6C41 0x8C7C  # <CJK>
+0x6C42 0x8C98  # <CJK>
+0x6C43 0x621D  # <CJK>
+0x6C44 0x8CAD  # <CJK>
+0x6C45 0x8CAA  # <CJK>
+0x6C46 0x8CBD  # <CJK>
+0x6C47 0x8CB2  # <CJK>
+0x6C48 0x8CB3  # <CJK>
+0x6C49 0x8CAE  # <CJK>
+0x6C4A 0x8CB6  # <CJK>
+0x6C4B 0x8CC8  # <CJK>
+0x6C4C 0x8CC1  # <CJK>
+0x6C4D 0x8CE4  # <CJK>
+0x6C4E 0x8CE3  # <CJK>
+0x6C4F 0x8CDA  # <CJK>
+0x6C50 0x8CFD  # <CJK>
+0x6C51 0x8CFA  # <CJK>
+0x6C52 0x8CFB  # <CJK>
+0x6C53 0x8D04  # <CJK>
+0x6C54 0x8D05  # <CJK>
+0x6C55 0x8D0A  # <CJK>
+0x6C56 0x8D07  # <CJK>
+0x6C57 0x8D0F  # <CJK>
+0x6C58 0x8D0D  # <CJK>
+0x6C59 0x8D10  # <CJK>
+0x6C5A 0x9F4E  # <CJK>
+0x6C5B 0x8D13  # <CJK>
+0x6C5C 0x8CCD  # <CJK>
+0x6C5D 0x8D14  # <CJK>
+0x6C5E 0x8D16  # <CJK>
+0x6C5F 0x8D67  # <CJK>
+0x6C60 0x8D6D  # <CJK>
+0x6C61 0x8D71  # <CJK>
+0x6C62 0x8D73  # <CJK>
+0x6C63 0x8D81  # <CJK>
+0x6C64 0x8D99  # <CJK>
+0x6C65 0x8DC2  # <CJK>
+0x6C66 0x8DBE  # <CJK>
+0x6C67 0x8DBA  # <CJK>
+0x6C68 0x8DCF  # <CJK>
+0x6C69 0x8DDA  # <CJK>
+0x6C6A 0x8DD6  # <CJK>
+0x6C6B 0x8DCC  # <CJK>
+0x6C6C 0x8DDB  # <CJK>
+0x6C6D 0x8DCB  # <CJK>
+0x6C6E 0x8DEA  # <CJK>
+0x6C6F 0x8DEB  # <CJK>
+0x6C70 0x8DDF  # <CJK>
+0x6C71 0x8DE3  # <CJK>
+0x6C72 0x8DFC  # <CJK>
+0x6C73 0x8E08  # <CJK>
+0x6C74 0x8E09  # <CJK>
+0x6C75 0x8DFF  # <CJK>
+0x6C76 0x8E1D  # <CJK>
+0x6C77 0x8E1E  # <CJK>
+0x6C78 0x8E10  # <CJK>
+0x6C79 0x8E1F  # <CJK>
+0x6C7A 0x8E42  # <CJK>
+0x6C7B 0x8E35  # <CJK>
+0x6C7C 0x8E30  # <CJK>
+0x6C7D 0x8E34  # <CJK>
+0x6C7E 0x8E4A  # <CJK>
+0x6D21 0x8E47  # <CJK>
+0x6D22 0x8E49  # <CJK>
+0x6D23 0x8E4C  # <CJK>
+0x6D24 0x8E50  # <CJK>
+0x6D25 0x8E48  # <CJK>
+0x6D26 0x8E59  # <CJK>
+0x6D27 0x8E64  # <CJK>
+0x6D28 0x8E60  # <CJK>
+0x6D29 0x8E2A  # <CJK>
+0x6D2A 0x8E63  # <CJK>
+0x6D2B 0x8E55  # <CJK>
+0x6D2C 0x8E76  # <CJK>
+0x6D2D 0x8E72  # <CJK>
+0x6D2E 0x8E7C  # <CJK>
+0x6D2F 0x8E81  # <CJK>
+0x6D30 0x8E87  # <CJK>
+0x6D31 0x8E85  # <CJK>
+0x6D32 0x8E84  # <CJK>
+0x6D33 0x8E8B  # <CJK>
+0x6D34 0x8E8A  # <CJK>
+0x6D35 0x8E93  # <CJK>
+0x6D36 0x8E91  # <CJK>
+0x6D37 0x8E94  # <CJK>
+0x6D38 0x8E99  # <CJK>
+0x6D39 0x8EAA  # <CJK>
+0x6D3A 0x8EA1  # <CJK>
+0x6D3B 0x8EAC  # <CJK>
+0x6D3C 0x8EB0  # <CJK>
+0x6D3D 0x8EC6  # <CJK>
+0x6D3E 0x8EB1  # <CJK>
+0x6D3F 0x8EBE  # <CJK>
+0x6D40 0x8EC5  # <CJK>
+0x6D41 0x8EC8  # <CJK>
+0x6D42 0x8ECB  # <CJK>
+0x6D43 0x8EDB  # <CJK>
+0x6D44 0x8EE3  # <CJK>
+0x6D45 0x8EFC  # <CJK>
+0x6D46 0x8EFB  # <CJK>
+0x6D47 0x8EEB  # <CJK>
+0x6D48 0x8EFE  # <CJK>
+0x6D49 0x8F0A  # <CJK>
+0x6D4A 0x8F05  # <CJK>
+0x6D4B 0x8F15  # <CJK>
+0x6D4C 0x8F12  # <CJK>
+0x6D4D 0x8F19  # <CJK>
+0x6D4E 0x8F13  # <CJK>
+0x6D4F 0x8F1C  # <CJK>
+0x6D50 0x8F1F  # <CJK>
+0x6D51 0x8F1B  # <CJK>
+0x6D52 0x8F0C  # <CJK>
+0x6D53 0x8F26  # <CJK>
+0x6D54 0x8F33  # <CJK>
+0x6D55 0x8F3B  # <CJK>
+0x6D56 0x8F39  # <CJK>
+0x6D57 0x8F45  # <CJK>
+0x6D58 0x8F42  # <CJK>
+0x6D59 0x8F3E  # <CJK>
+0x6D5A 0x8F4C  # <CJK>
+0x6D5B 0x8F49  # <CJK>
+0x6D5C 0x8F46  # <CJK>
+0x6D5D 0x8F4E  # <CJK>
+0x6D5E 0x8F57  # <CJK>
+0x6D5F 0x8F5C  # <CJK>
+0x6D60 0x8F62  # <CJK>
+0x6D61 0x8F63  # <CJK>
+0x6D62 0x8F64  # <CJK>
+0x6D63 0x8F9C  # <CJK>
+0x6D64 0x8F9F  # <CJK>
+0x6D65 0x8FA3  # <CJK>
+0x6D66 0x8FAD  # <CJK>
+0x6D67 0x8FAF  # <CJK>
+0x6D68 0x8FB7  # <CJK>
+0x6D69 0x8FDA  # <CJK>
+0x6D6A 0x8FE5  # <CJK>
+0x6D6B 0x8FE2  # <CJK>
+0x6D6C 0x8FEA  # <CJK>
+0x6D6D 0x8FEF  # <CJK>
+0x6D6E 0x9087  # <CJK>
+0x6D6F 0x8FF4  # <CJK>
+0x6D70 0x9005  # <CJK>
+0x6D71 0x8FF9  # <CJK>
+0x6D72 0x8FFA  # <CJK>
+0x6D73 0x9011  # <CJK>
+0x6D74 0x9015  # <CJK>
+0x6D75 0x9021  # <CJK>
+0x6D76 0x900D  # <CJK>
+0x6D77 0x901E  # <CJK>
+0x6D78 0x9016  # <CJK>
+0x6D79 0x900B  # <CJK>
+0x6D7A 0x9027  # <CJK>
+0x6D7B 0x9036  # <CJK>
+0x6D7C 0x9035  # <CJK>
+0x6D7D 0x9039  # <CJK>
+0x6D7E 0x8FF8  # <CJK>
+0x6E21 0x904F  # <CJK>
+0x6E22 0x9050  # <CJK>
+0x6E23 0x9051  # <CJK>
+0x6E24 0x9052  # <CJK>
+0x6E25 0x900E  # <CJK>
+0x6E26 0x9049  # <CJK>
+0x6E27 0x903E  # <CJK>
+0x6E28 0x9056  # <CJK>
+0x6E29 0x9058  # <CJK>
+0x6E2A 0x905E  # <CJK>
+0x6E2B 0x9068  # <CJK>
+0x6E2C 0x906F  # <CJK>
+0x6E2D 0x9076  # <CJK>
+0x6E2E 0x96A8  # <CJK>
+0x6E2F 0x9072  # <CJK>
+0x6E30 0x9082  # <CJK>
+0x6E31 0x907D  # <CJK>
+0x6E32 0x9081  # <CJK>
+0x6E33 0x9080  # <CJK>
+0x6E34 0x908A  # <CJK>
+0x6E35 0x9089  # <CJK>
+0x6E36 0x908F  # <CJK>
+0x6E37 0x90A8  # <CJK>
+0x6E38 0x90AF  # <CJK>
+0x6E39 0x90B1  # <CJK>
+0x6E3A 0x90B5  # <CJK>
+0x6E3B 0x90E2  # <CJK>
+0x6E3C 0x90E4  # <CJK>
+0x6E3D 0x6248  # <CJK>
+0x6E3E 0x90DB  # <CJK>
+0x6E3F 0x9102  # <CJK>
+0x6E40 0x9112  # <CJK>
+0x6E41 0x9119  # <CJK>
+0x6E42 0x9132  # <CJK>
+0x6E43 0x9130  # <CJK>
+0x6E44 0x914A  # <CJK>
+0x6E45 0x9156  # <CJK>
+0x6E46 0x9158  # <CJK>
+0x6E47 0x9163  # <CJK>
+0x6E48 0x9165  # <CJK>
+0x6E49 0x9169  # <CJK>
+0x6E4A 0x9173  # <CJK>
+0x6E4B 0x9172  # <CJK>
+0x6E4C 0x918B  # <CJK>
+0x6E4D 0x9189  # <CJK>
+0x6E4E 0x9182  # <CJK>
+0x6E4F 0x91A2  # <CJK>
+0x6E50 0x91AB  # <CJK>
+0x6E51 0x91AF  # <CJK>
+0x6E52 0x91AA  # <CJK>
+0x6E53 0x91B5  # <CJK>
+0x6E54 0x91B4  # <CJK>
+0x6E55 0x91BA  # <CJK>
+0x6E56 0x91C0  # <CJK>
+0x6E57 0x91C1  # <CJK>
+0x6E58 0x91C9  # <CJK>
+0x6E59 0x91CB  # <CJK>
+0x6E5A 0x91D0  # <CJK>
+0x6E5B 0x91D6  # <CJK>
+0x6E5C 0x91DF  # <CJK>
+0x6E5D 0x91E1  # <CJK>
+0x6E5E 0x91DB  # <CJK>
+0x6E5F 0x91FC  # <CJK>
+0x6E60 0x91F5  # <CJK>
+0x6E61 0x91F6  # <CJK>
+0x6E62 0x921E  # <CJK>
+0x6E63 0x91FF  # <CJK>
+0x6E64 0x9214  # <CJK>
+0x6E65 0x922C  # <CJK>
+0x6E66 0x9215  # <CJK>
+0x6E67 0x9211  # <CJK>
+0x6E68 0x925E  # <CJK>
+0x6E69 0x9257  # <CJK>
+0x6E6A 0x9245  # <CJK>
+0x6E6B 0x9249  # <CJK>
+0x6E6C 0x9264  # <CJK>
+0x6E6D 0x9248  # <CJK>
+0x6E6E 0x9295  # <CJK>
+0x6E6F 0x923F  # <CJK>
+0x6E70 0x924B  # <CJK>
+0x6E71 0x9250  # <CJK>
+0x6E72 0x929C  # <CJK>
+0x6E73 0x9296  # <CJK>
+0x6E74 0x9293  # <CJK>
+0x6E75 0x929B  # <CJK>
+0x6E76 0x925A  # <CJK>
+0x6E77 0x92CF  # <CJK>
+0x6E78 0x92B9  # <CJK>
+0x6E79 0x92B7  # <CJK>
+0x6E7A 0x92E9  # <CJK>
+0x6E7B 0x930F  # <CJK>
+0x6E7C 0x92FA  # <CJK>
+0x6E7D 0x9344  # <CJK>
+0x6E7E 0x932E  # <CJK>
+0x6F21 0x9319  # <CJK>
+0x6F22 0x9322  # <CJK>
+0x6F23 0x931A  # <CJK>
+0x6F24 0x9323  # <CJK>
+0x6F25 0x933A  # <CJK>
+0x6F26 0x9335  # <CJK>
+0x6F27 0x933B  # <CJK>
+0x6F28 0x935C  # <CJK>
+0x6F29 0x9360  # <CJK>
+0x6F2A 0x937C  # <CJK>
+0x6F2B 0x936E  # <CJK>
+0x6F2C 0x9356  # <CJK>
+0x6F2D 0x93B0  # <CJK>
+0x6F2E 0x93AC  # <CJK>
+0x6F2F 0x93AD  # <CJK>
+0x6F30 0x9394  # <CJK>
+0x6F31 0x93B9  # <CJK>
+0x6F32 0x93D6  # <CJK>
+0x6F33 0x93D7  # <CJK>
+0x6F34 0x93E8  # <CJK>
+0x6F35 0x93E5  # <CJK>
+0x6F36 0x93D8  # <CJK>
+0x6F37 0x93C3  # <CJK>
+0x6F38 0x93DD  # <CJK>
+0x6F39 0x93D0  # <CJK>
+0x6F3A 0x93C8  # <CJK>
+0x6F3B 0x93E4  # <CJK>
+0x6F3C 0x941A  # <CJK>
+0x6F3D 0x9414  # <CJK>
+0x6F3E 0x9413  # <CJK>
+0x6F3F 0x9403  # <CJK>
+0x6F40 0x9407  # <CJK>
+0x6F41 0x9410  # <CJK>
+0x6F42 0x9436  # <CJK>
+0x6F43 0x942B  # <CJK>
+0x6F44 0x9435  # <CJK>
+0x6F45 0x9421  # <CJK>
+0x6F46 0x943A  # <CJK>
+0x6F47 0x9441  # <CJK>
+0x6F48 0x9452  # <CJK>
+0x6F49 0x9444  # <CJK>
+0x6F4A 0x945B  # <CJK>
+0x6F4B 0x9460  # <CJK>
+0x6F4C 0x9462  # <CJK>
+0x6F4D 0x945E  # <CJK>
+0x6F4E 0x946A  # <CJK>
+0x6F4F 0x9229  # <CJK>
+0x6F50 0x9470  # <CJK>
+0x6F51 0x9475  # <CJK>
+0x6F52 0x9477  # <CJK>
+0x6F53 0x947D  # <CJK>
+0x6F54 0x945A  # <CJK>
+0x6F55 0x947C  # <CJK>
+0x6F56 0x947E  # <CJK>
+0x6F57 0x9481  # <CJK>
+0x6F58 0x947F  # <CJK>
+0x6F59 0x9582  # <CJK>
+0x6F5A 0x9587  # <CJK>
+0x6F5B 0x958A  # <CJK>
+0x6F5C 0x9594  # <CJK>
+0x6F5D 0x9596  # <CJK>
+0x6F5E 0x9598  # <CJK>
+0x6F5F 0x9599  # <CJK>
+0x6F60 0x95A0  # <CJK>
+0x6F61 0x95A8  # <CJK>
+0x6F62 0x95A7  # <CJK>
+0x6F63 0x95AD  # <CJK>
+0x6F64 0x95BC  # <CJK>
+0x6F65 0x95BB  # <CJK>
+0x6F66 0x95B9  # <CJK>
+0x6F67 0x95BE  # <CJK>
+0x6F68 0x95CA  # <CJK>
+0x6F69 0x6FF6  # <CJK>
+0x6F6A 0x95C3  # <CJK>
+0x6F6B 0x95CD  # <CJK>
+0x6F6C 0x95CC  # <CJK>
+0x6F6D 0x95D5  # <CJK>
+0x6F6E 0x95D4  # <CJK>
+0x6F6F 0x95D6  # <CJK>
+0x6F70 0x95DC  # <CJK>
+0x6F71 0x95E1  # <CJK>
+0x6F72 0x95E5  # <CJK>
+0x6F73 0x95E2  # <CJK>
+0x6F74 0x9621  # <CJK>
+0x6F75 0x9628  # <CJK>
+0x6F76 0x962E  # <CJK>
+0x6F77 0x962F  # <CJK>
+0x6F78 0x9642  # <CJK>
+0x6F79 0x964C  # <CJK>
+0x6F7A 0x964F  # <CJK>
+0x6F7B 0x964B  # <CJK>
+0x6F7C 0x9677  # <CJK>
+0x6F7D 0x965C  # <CJK>
+0x6F7E 0x965E  # <CJK>
+0x7021 0x965D  # <CJK>
+0x7022 0x965F  # <CJK>
+0x7023 0x9666  # <CJK>
+0x7024 0x9672  # <CJK>
+0x7025 0x966C  # <CJK>
+0x7026 0x968D  # <CJK>
+0x7027 0x9698  # <CJK>
+0x7028 0x9695  # <CJK>
+0x7029 0x9697  # <CJK>
+0x702A 0x96AA  # <CJK>
+0x702B 0x96A7  # <CJK>
+0x702C 0x96B1  # <CJK>
+0x702D 0x96B2  # <CJK>
+0x702E 0x96B0  # <CJK>
+0x702F 0x96B4  # <CJK>
+0x7030 0x96B6  # <CJK>
+0x7031 0x96B8  # <CJK>
+0x7032 0x96B9  # <CJK>
+0x7033 0x96CE  # <CJK>
+0x7034 0x96CB  # <CJK>
+0x7035 0x96C9  # <CJK>
+0x7036 0x96CD  # <CJK>
+0x7037 0x894D  # <CJK>
+0x7038 0x96DC  # <CJK>
+0x7039 0x970D  # <CJK>
+0x703A 0x96D5  # <CJK>
+0x703B 0x96F9  # <CJK>
+0x703C 0x9704  # <CJK>
+0x703D 0x9706  # <CJK>
+0x703E 0x9708  # <CJK>
+0x703F 0x9713  # <CJK>
+0x7040 0x970E  # <CJK>
+0x7041 0x9711  # <CJK>
+0x7042 0x970F  # <CJK>
+0x7043 0x9716  # <CJK>
+0x7044 0x9719  # <CJK>
+0x7045 0x9724  # <CJK>
+0x7046 0x972A  # <CJK>
+0x7047 0x9730  # <CJK>
+0x7048 0x9739  # <CJK>
+0x7049 0x973D  # <CJK>
+0x704A 0x973E  # <CJK>
+0x704B 0x9744  # <CJK>
+0x704C 0x9746  # <CJK>
+0x704D 0x9748  # <CJK>
+0x704E 0x9742  # <CJK>
+0x704F 0x9749  # <CJK>
+0x7050 0x975C  # <CJK>
+0x7051 0x9760  # <CJK>
+0x7052 0x9764  # <CJK>
+0x7053 0x9766  # <CJK>
+0x7054 0x9768  # <CJK>
+0x7055 0x52D2  # <CJK>
+0x7056 0x976B  # <CJK>
+0x7057 0x9771  # <CJK>
+0x7058 0x9779  # <CJK>
+0x7059 0x9785  # <CJK>
+0x705A 0x977C  # <CJK>
+0x705B 0x9781  # <CJK>
+0x705C 0x977A  # <CJK>
+0x705D 0x9786  # <CJK>
+0x705E 0x978B  # <CJK>
+0x705F 0x978F  # <CJK>
+0x7060 0x9790  # <CJK>
+0x7061 0x979C  # <CJK>
+0x7062 0x97A8  # <CJK>
+0x7063 0x97A6  # <CJK>
+0x7064 0x97A3  # <CJK>
+0x7065 0x97B3  # <CJK>
+0x7066 0x97B4  # <CJK>
+0x7067 0x97C3  # <CJK>
+0x7068 0x97C6  # <CJK>
+0x7069 0x97C8  # <CJK>
+0x706A 0x97CB  # <CJK>
+0x706B 0x97DC  # <CJK>
+0x706C 0x97ED  # <CJK>
+0x706D 0x9F4F  # <CJK>
+0x706E 0x97F2  # <CJK>
+0x706F 0x7ADF  # <CJK>
+0x7070 0x97F6  # <CJK>
+0x7071 0x97F5  # <CJK>
+0x7072 0x980F  # <CJK>
+0x7073 0x980C  # <CJK>
+0x7074 0x9838  # <CJK>
+0x7075 0x9824  # <CJK>
+0x7076 0x9821  # <CJK>
+0x7077 0x9837  # <CJK>
+0x7078 0x983D  # <CJK>
+0x7079 0x9846  # <CJK>
+0x707A 0x984F  # <CJK>
+0x707B 0x984B  # <CJK>
+0x707C 0x986B  # <CJK>
+0x707D 0x986F  # <CJK>
+0x707E 0x9870  # <CJK>
+0x7121 0x9871  # <CJK>
+0x7122 0x9874  # <CJK>
+0x7123 0x9873  # <CJK>
+0x7124 0x98AA  # <CJK>
+0x7125 0x98AF  # <CJK>
+0x7126 0x98B1  # <CJK>
+0x7127 0x98B6  # <CJK>
+0x7128 0x98C4  # <CJK>
+0x7129 0x98C3  # <CJK>
+0x712A 0x98C6  # <CJK>
+0x712B 0x98E9  # <CJK>
+0x712C 0x98EB  # <CJK>
+0x712D 0x9903  # <CJK>
+0x712E 0x9909  # <CJK>
+0x712F 0x9912  # <CJK>
+0x7130 0x9914  # <CJK>
+0x7131 0x9918  # <CJK>
+0x7132 0x9921  # <CJK>
+0x7133 0x991D  # <CJK>
+0x7134 0x991E  # <CJK>
+0x7135 0x9924  # <CJK>
+0x7136 0x9920  # <CJK>
+0x7137 0x992C  # <CJK>
+0x7138 0x992E  # <CJK>
+0x7139 0x993D  # <CJK>
+0x713A 0x993E  # <CJK>
+0x713B 0x9942  # <CJK>
+0x713C 0x9949  # <CJK>
+0x713D 0x9945  # <CJK>
+0x713E 0x9950  # <CJK>
+0x713F 0x994B  # <CJK>
+0x7140 0x9951  # <CJK>
+0x7141 0x9952  # <CJK>
+0x7142 0x994C  # <CJK>
+0x7143 0x9955  # <CJK>
+0x7144 0x9997  # <CJK>
+0x7145 0x9998  # <CJK>
+0x7146 0x99A5  # <CJK>
+0x7147 0x99AD  # <CJK>
+0x7148 0x99AE  # <CJK>
+0x7149 0x99BC  # <CJK>
+0x714A 0x99DF  # <CJK>
+0x714B 0x99DB  # <CJK>
+0x714C 0x99DD  # <CJK>
+0x714D 0x99D8  # <CJK>
+0x714E 0x99D1  # <CJK>
+0x714F 0x99ED  # <CJK>
+0x7150 0x99EE  # <CJK>
+0x7151 0x99F1  # <CJK>
+0x7152 0x99F2  # <CJK>
+0x7153 0x99FB  # <CJK>
+0x7154 0x99F8  # <CJK>
+0x7155 0x9A01  # <CJK>
+0x7156 0x9A0F  # <CJK>
+0x7157 0x9A05  # <CJK>
+0x7158 0x99E2  # <CJK>
+0x7159 0x9A19  # <CJK>
+0x715A 0x9A2B  # <CJK>
+0x715B 0x9A37  # <CJK>
+0x715C 0x9A45  # <CJK>
+0x715D 0x9A42  # <CJK>
+0x715E 0x9A40  # <CJK>
+0x715F 0x9A43  # <CJK>
+0x7160 0x9A3E  # <CJK>
+0x7161 0x9A55  # <CJK>
+0x7162 0x9A4D  # <CJK>
+0x7163 0x9A5B  # <CJK>
+0x7164 0x9A57  # <CJK>
+0x7165 0x9A5F  # <CJK>
+0x7166 0x9A62  # <CJK>
+0x7167 0x9A65  # <CJK>
+0x7168 0x9A64  # <CJK>
+0x7169 0x9A69  # <CJK>
+0x716A 0x9A6B  # <CJK>
+0x716B 0x9A6A  # <CJK>
+0x716C 0x9AAD  # <CJK>
+0x716D 0x9AB0  # <CJK>
+0x716E 0x9ABC  # <CJK>
+0x716F 0x9AC0  # <CJK>
+0x7170 0x9ACF  # <CJK>
+0x7171 0x9AD1  # <CJK>
+0x7172 0x9AD3  # <CJK>
+0x7173 0x9AD4  # <CJK>
+0x7174 0x9ADE  # <CJK>
+0x7175 0x9ADF  # <CJK>
+0x7176 0x9AE2  # <CJK>
+0x7177 0x9AE3  # <CJK>
+0x7178 0x9AE6  # <CJK>
+0x7179 0x9AEF  # <CJK>
+0x717A 0x9AEB  # <CJK>
+0x717B 0x9AEE  # <CJK>
+0x717C 0x9AF4  # <CJK>
+0x717D 0x9AF1  # <CJK>
+0x717E 0x9AF7  # <CJK>
+0x7221 0x9AFB  # <CJK>
+0x7222 0x9B06  # <CJK>
+0x7223 0x9B18  # <CJK>
+0x7224 0x9B1A  # <CJK>
+0x7225 0x9B1F  # <CJK>
+0x7226 0x9B22  # <CJK>
+0x7227 0x9B23  # <CJK>
+0x7228 0x9B25  # <CJK>
+0x7229 0x9B27  # <CJK>
+0x722A 0x9B28  # <CJK>
+0x722B 0x9B29  # <CJK>
+0x722C 0x9B2A  # <CJK>
+0x722D 0x9B2E  # <CJK>
+0x722E 0x9B2F  # <CJK>
+0x722F 0x9B32  # <CJK>
+0x7230 0x9B44  # <CJK>
+0x7231 0x9B43  # <CJK>
+0x7232 0x9B4F  # <CJK>
+0x7233 0x9B4D  # <CJK>
+0x7234 0x9B4E  # <CJK>
+0x7235 0x9B51  # <CJK>
+0x7236 0x9B58  # <CJK>
+0x7237 0x9B74  # <CJK>
+0x7238 0x9B93  # <CJK>
+0x7239 0x9B83  # <CJK>
+0x723A 0x9B91  # <CJK>
+0x723B 0x9B96  # <CJK>
+0x723C 0x9B97  # <CJK>
+0x723D 0x9B9F  # <CJK>
+0x723E 0x9BA0  # <CJK>
+0x723F 0x9BA8  # <CJK>
+0x7240 0x9BB4  # <CJK>
+0x7241 0x9BC0  # <CJK>
+0x7242 0x9BCA  # <CJK>
+0x7243 0x9BB9  # <CJK>
+0x7244 0x9BC6  # <CJK>
+0x7245 0x9BCF  # <CJK>
+0x7246 0x9BD1  # <CJK>
+0x7247 0x9BD2  # <CJK>
+0x7248 0x9BE3  # <CJK>
+0x7249 0x9BE2  # <CJK>
+0x724A 0x9BE4  # <CJK>
+0x724B 0x9BD4  # <CJK>
+0x724C 0x9BE1  # <CJK>
+0x724D 0x9C3A  # <CJK>
+0x724E 0x9BF2  # <CJK>
+0x724F 0x9BF1  # <CJK>
+0x7250 0x9BF0  # <CJK>
+0x7251 0x9C15  # <CJK>
+0x7252 0x9C14  # <CJK>
+0x7253 0x9C09  # <CJK>
+0x7254 0x9C13  # <CJK>
+0x7255 0x9C0C  # <CJK>
+0x7256 0x9C06  # <CJK>
+0x7257 0x9C08  # <CJK>
+0x7258 0x9C12  # <CJK>
+0x7259 0x9C0A  # <CJK>
+0x725A 0x9C04  # <CJK>
+0x725B 0x9C2E  # <CJK>
+0x725C 0x9C1B  # <CJK>
+0x725D 0x9C25  # <CJK>
+0x725E 0x9C24  # <CJK>
+0x725F 0x9C21  # <CJK>
+0x7260 0x9C30  # <CJK>
+0x7261 0x9C47  # <CJK>
+0x7262 0x9C32  # <CJK>
+0x7263 0x9C46  # <CJK>
+0x7264 0x9C3E  # <CJK>
+0x7265 0x9C5A  # <CJK>
+0x7266 0x9C60  # <CJK>
+0x7267 0x9C67  # <CJK>
+0x7268 0x9C76  # <CJK>
+0x7269 0x9C78  # <CJK>
+0x726A 0x9CE7  # <CJK>
+0x726B 0x9CEC  # <CJK>
+0x726C 0x9CF0  # <CJK>
+0x726D 0x9D09  # <CJK>
+0x726E 0x9D08  # <CJK>
+0x726F 0x9CEB  # <CJK>
+0x7270 0x9D03  # <CJK>
+0x7271 0x9D06  # <CJK>
+0x7272 0x9D2A  # <CJK>
+0x7273 0x9D26  # <CJK>
+0x7274 0x9DAF  # <CJK>
+0x7275 0x9D23  # <CJK>
+0x7276 0x9D1F  # <CJK>
+0x7277 0x9D44  # <CJK>
+0x7278 0x9D15  # <CJK>
+0x7279 0x9D12  # <CJK>
+0x727A 0x9D41  # <CJK>
+0x727B 0x9D3F  # <CJK>
+0x727C 0x9D3E  # <CJK>
+0x727D 0x9D46  # <CJK>
+0x727E 0x9D48  # <CJK>
+0x7321 0x9D5D  # <CJK>
+0x7322 0x9D5E  # <CJK>
+0x7323 0x9D64  # <CJK>
+0x7324 0x9D51  # <CJK>
+0x7325 0x9D50  # <CJK>
+0x7326 0x9D59  # <CJK>
+0x7327 0x9D72  # <CJK>
+0x7328 0x9D89  # <CJK>
+0x7329 0x9D87  # <CJK>
+0x732A 0x9DAB  # <CJK>
+0x732B 0x9D6F  # <CJK>
+0x732C 0x9D7A  # <CJK>
+0x732D 0x9D9A  # <CJK>
+0x732E 0x9DA4  # <CJK>
+0x732F 0x9DA9  # <CJK>
+0x7330 0x9DB2  # <CJK>
+0x7331 0x9DC4  # <CJK>
+0x7332 0x9DC1  # <CJK>
+0x7333 0x9DBB  # <CJK>
+0x7334 0x9DB8  # <CJK>
+0x7335 0x9DBA  # <CJK>
+0x7336 0x9DC6  # <CJK>
+0x7337 0x9DCF  # <CJK>
+0x7338 0x9DC2  # <CJK>
+0x7339 0x9DD9  # <CJK>
+0x733A 0x9DD3  # <CJK>
+0x733B 0x9DF8  # <CJK>
+0x733C 0x9DE6  # <CJK>
+0x733D 0x9DED  # <CJK>
+0x733E 0x9DEF  # <CJK>
+0x733F 0x9DFD  # <CJK>
+0x7340 0x9E1A  # <CJK>
+0x7341 0x9E1B  # <CJK>
+0x7342 0x9E1E  # <CJK>
+0x7343 0x9E75  # <CJK>
+0x7344 0x9E79  # <CJK>
+0x7345 0x9E7D  # <CJK>
+0x7346 0x9E81  # <CJK>
+0x7347 0x9E88  # <CJK>
+0x7348 0x9E8B  # <CJK>
+0x7349 0x9E8C  # <CJK>
+0x734A 0x9E92  # <CJK>
+0x734B 0x9E95  # <CJK>
+0x734C 0x9E91  # <CJK>
+0x734D 0x9E9D  # <CJK>
+0x734E 0x9EA5  # <CJK>
+0x734F 0x9EA9  # <CJK>
+0x7350 0x9EB8  # <CJK>
+0x7351 0x9EAA  # <CJK>
+0x7352 0x9EAD  # <CJK>
+0x7353 0x9761  # <CJK>
+0x7354 0x9ECC  # <CJK>
+0x7355 0x9ECE  # <CJK>
+0x7356 0x9ECF  # <CJK>
+0x7357 0x9ED0  # <CJK>
+0x7358 0x9ED4  # <CJK>
+0x7359 0x9EDC  # <CJK>
+0x735A 0x9EDE  # <CJK>
+0x735B 0x9EDD  # <CJK>
+0x735C 0x9EE0  # <CJK>
+0x735D 0x9EE5  # <CJK>
+0x735E 0x9EE8  # <CJK>
+0x735F 0x9EEF  # <CJK>
+0x7360 0x9EF4  # <CJK>
+0x7361 0x9EF6  # <CJK>
+0x7362 0x9EF7  # <CJK>
+0x7363 0x9EF9  # <CJK>
+0x7364 0x9EFB  # <CJK>
+0x7365 0x9EFC  # <CJK>
+0x7366 0x9EFD  # <CJK>
+0x7367 0x9F07  # <CJK>
+0x7368 0x9F08  # <CJK>
+0x7369 0x76B7  # <CJK>
+0x736A 0x9F15  # <CJK>
+0x736B 0x9F21  # <CJK>
+0x736C 0x9F2C  # <CJK>
+0x736D 0x9F3E  # <CJK>
+0x736E 0x9F4A  # <CJK>
+0x736F 0x9F52  # <CJK>
+0x7370 0x9F54  # <CJK>
+0x7371 0x9F63  # <CJK>
+0x7372 0x9F5F  # <CJK>
+0x7373 0x9F60  # <CJK>
+0x7374 0x9F61  # <CJK>
+0x7375 0x9F66  # <CJK>
+0x7376 0x9F67  # <CJK>
+0x7377 0x9F6C  # <CJK>
+0x7378 0x9F6A  # <CJK>
+0x7379 0x9F77  # <CJK>
+0x737A 0x9F72  # <CJK>
+0x737B 0x9F76  # <CJK>
+0x737C 0x9F95  # <CJK>
+0x737D 0x9F9C  # <CJK>
+0x737E 0x9FA0  # <CJK>
+0x7421 0x582F  # <CJK>
+0x7422 0x69C7  # <CJK>
+0x7423 0x9059  # <CJK>
+0x7424 0x7464  # <CJK>
+0x7425 0x51DC  # <CJK>
+0x7426 0x7199  # <CJK>
diff --git a/basis/io/encodings/iso2022/212.txt b/basis/io/encodings/iso2022/212.txt
new file mode 100644 (file)
index 0000000..c1ea9f3
--- /dev/null
@@ -0,0 +1,6153 @@
+#
+#      Name:             JIS X 0212 (1990) to Unicode
+#      Unicode version:  1.1
+#      Table version:    0.9
+#      Table format:     Format A
+#      Date:             8 March 1994
+#
+#      Copyright (c) 1991-1994 Unicode, Inc.  All Rights reserved.
+#
+#      This file is provided as-is by Unicode, Inc. (The Unicode Consortium).
+#      No claims are made as to fitness for any particular purpose.  No
+#      warranties of any kind are expressed or implied.  The recipient
+#      agrees to determine applicability of information provided.  If this
+#      file has been provided on magnetic media by Unicode, Inc., the sole
+#      remedy for any claim will be exchange of defective media within 90
+#      days of receipt.
+#
+#      Recipient is granted the right to make copies in any form for
+#      internal distribution and to freely use the information supplied
+#      in the creation of products supporting Unicode.  Unicode, Inc.
+#      specifically excludes the right to re-distribute this file directly
+#      to third parties or other organizations whether for profit or not.
+#
+#      General notes:
+#
+#
+# This table contains one set of mappings from JIS X 0212 into Unicode.
+# Note that these data are *possible* mappings only and may not be the
+# same as those used by actual products, nor may they be the best suited
+# for all uses.  For more information on the mappings between various code
+# pages incorporating the repertoire of JIS X 0212 and Unicode, consult the
+# VENDORS mapping data.  Normative information on the mapping between
+# JIS X 0212 and Unicode may be found in the Unihan.txt file in the
+# latest Unicode Character Database.
+#
+# If you have carefully considered the fact that the mappings in
+# this table are only one possible set of mappings between JIS X 0212 and
+# Unicode and have no normative status, but still feel that you
+# have located an error in the table that requires fixing, you may
+# report any such error to errata@unicode.org.
+#
+#
+#      Format:  Three tab-separated columns
+#               Column #1 is the JIS X 0212 code (in hex as 0xXXXX)
+#               Column #2 is the Unicode (in hex as 0xXXXX)
+#               Column #3 the Unicode name (follows a comment sign, '#')
+#                      The official names for Unicode characters U+4E00
+#                      to U+9FA5, inclusive, is "CJK UNIFIED IDEOGRAPH-XXXX",
+#                      where XXXX is the code point.  Including all these
+#                      names in this file increases its size substantially
+#                      and needlessly.  The token "<CJK>" is used for the
+#                      name of these characters.  If necessary, it can be
+#                      expanded algorithmically by a parser or editor.
+#
+#      The entries are in JIS X 0212 order
+#
+#      The following algorithms can be used to change the hex form
+#              of JIS 0212 to other standard forms:
+#
+#              To change hex to EUC form, add 0x8080
+#              To change hex to kuten form, first subtract 0x2020.  Then
+#                      the high and low bytes correspond to the ku and ten of
+#                      the kuten form.  For example, 0x2121 -> 0x0101 -> 0101;
+#                      0x6D63 -> 0x4D43 -> 7767
+#
+#   The kanji mappings are a normative part of ISO/IEC 10646.  The
+#       non-kanji mappings are provisional, pending definition of
+#       official mappings by Japanese standards bodies
+#
+#      Any comments or problems, contact <John_Jenkins@taligent.com>
+#
+#      Notes:
+#
+#      1. JIS X 0212 apparently unified the following two symbols
+#         into a single character at 0x2922:
+#      
+#         LATIN CAPITAL LETTER D WITH STROKE
+#         LATIN CAPITAL LETTER ETH
+#
+#         However, JIS X 0212 maintains the distinction between
+#         the lowercase forms of these two elements at 0x2942 and 0x2943.
+#         Given the structre of these JIS encodings, it is clear that
+#         0x2922 and 0x2942 are intended to be a capital/small pair.
+#         Consequently, in the Unicode mapping, 0x2922 is treated as
+#         LATIN CAPITAL LETTER D WITH STROKE.
+#        
+0x222F 0x02D8  # BREVE
+0x2230 0x02C7  # CARON (Mandarin Chinese third tone)
+0x2231 0x00B8  # CEDILLA
+0x2232 0x02D9  # DOT ABOVE (Mandarin Chinese light tone)
+0x2233 0x02DD  # DOUBLE ACUTE ACCENT
+0x2234 0x00AF  # MACRON
+0x2235 0x02DB  # OGONEK
+0x2236 0x02DA  # RING ABOVE
+0x2237 0x007E  # TILDE
+0x2238 0x0384  # GREEK TONOS
+0x2239 0x0385  # GREEK DIALYTIKA TONOS
+0x2242 0x00A1  # INVERTED EXCLAMATION MARK
+0x2243 0x00A6  # BROKEN BAR
+0x2244 0x00BF  # INVERTED QUESTION MARK
+0x226B 0x00BA  # MASCULINE ORDINAL INDICATOR
+0x226C 0x00AA  # FEMININE ORDINAL INDICATOR
+0x226D 0x00A9  # COPYRIGHT SIGN
+0x226E 0x00AE  # REGISTERED SIGN
+0x226F 0x2122  # TRADE MARK SIGN
+0x2270 0x00A4  # CURRENCY SIGN
+0x2271 0x2116  # NUMERO SIGN
+0x2661 0x0386  # GREEK CAPITAL LETTER ALPHA WITH TONOS
+0x2662 0x0388  # GREEK CAPITAL LETTER EPSILON WITH TONOS
+0x2663 0x0389  # GREEK CAPITAL LETTER ETA WITH TONOS
+0x2664 0x038A  # GREEK CAPITAL LETTER IOTA WITH TONOS
+0x2665 0x03AA  # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
+0x2667 0x038C  # GREEK CAPITAL LETTER OMICRON WITH TONOS
+0x2669 0x038E  # GREEK CAPITAL LETTER UPSILON WITH TONOS
+0x266A 0x03AB  # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
+0x266C 0x038F  # GREEK CAPITAL LETTER OMEGA WITH TONOS
+0x2671 0x03AC  # GREEK SMALL LETTER ALPHA WITH TONOS
+0x2672 0x03AD  # GREEK SMALL LETTER EPSILON WITH TONOS
+0x2673 0x03AE  # GREEK SMALL LETTER ETA WITH TONOS
+0x2674 0x03AF  # GREEK SMALL LETTER IOTA WITH TONOS
+0x2675 0x03CA  # GREEK SMALL LETTER IOTA WITH DIALYTIKA
+0x2676 0x0390  # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+0x2677 0x03CC  # GREEK SMALL LETTER OMICRON WITH TONOS
+0x2678 0x03C2  # GREEK SMALL LETTER FINAL SIGMA
+0x2679 0x03CD  # GREEK SMALL LETTER UPSILON WITH TONOS
+0x267A 0x03CB  # GREEK SMALL LETTER UPSILON WITH DIALYTIKA
+0x267B 0x03B0  # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
+0x267C 0x03CE  # GREEK SMALL LETTER OMEGA WITH TONOS
+0x2742 0x0402  # CYRILLIC CAPITAL LETTER DJE
+0x2743 0x0403  # CYRILLIC CAPITAL LETTER GJE
+0x2744 0x0404  # CYRILLIC CAPITAL LETTER UKRAINIAN IE
+0x2745 0x0405  # CYRILLIC CAPITAL LETTER DZE
+0x2746 0x0406  # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
+0x2747 0x0407  # CYRILLIC CAPITAL LETTER YI
+0x2748 0x0408  # CYRILLIC CAPITAL LETTER JE
+0x2749 0x0409  # CYRILLIC CAPITAL LETTER LJE
+0x274A 0x040A  # CYRILLIC CAPITAL LETTER NJE
+0x274B 0x040B  # CYRILLIC CAPITAL LETTER TSHE
+0x274C 0x040C  # CYRILLIC CAPITAL LETTER KJE
+0x274D 0x040E  # CYRILLIC CAPITAL LETTER SHORT U
+0x274E 0x040F  # CYRILLIC CAPITAL LETTER DZHE
+0x2772 0x0452  # CYRILLIC SMALL LETTER DJE
+0x2773 0x0453  # CYRILLIC SMALL LETTER GJE
+0x2774 0x0454  # CYRILLIC SMALL LETTER UKRAINIAN IE
+0x2775 0x0455  # CYRILLIC SMALL LETTER DZE
+0x2776 0x0456  # CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
+0x2777 0x0457  # CYRILLIC SMALL LETTER YI
+0x2778 0x0458  # CYRILLIC SMALL LETTER JE
+0x2779 0x0459  # CYRILLIC SMALL LETTER LJE
+0x277A 0x045A  # CYRILLIC SMALL LETTER NJE
+0x277B 0x045B  # CYRILLIC SMALL LETTER TSHE
+0x277C 0x045C  # CYRILLIC SMALL LETTER KJE
+0x277D 0x045E  # CYRILLIC SMALL LETTER SHORT U
+0x277E 0x045F  # CYRILLIC SMALL LETTER DZHE
+0x2921 0x00C6  # LATIN CAPITAL LIGATURE AE
+0x2922 0x0110  # LATIN CAPITAL LETTER D WITH STROKE
+0x2924 0x0126  # LATIN CAPITAL LETTER H WITH STROKE
+0x2926 0x0132  # LATIN CAPITAL LIGATURE IJ
+0x2928 0x0141  # LATIN CAPITAL LETTER L WITH STROKE
+0x2929 0x013F  # LATIN CAPITAL LETTER L WITH MIDDLE DOT
+0x292B 0x014A  # LATIN CAPITAL LETTER ENG
+0x292C 0x00D8  # LATIN CAPITAL LETTER O WITH STROKE
+0x292D 0x0152  # LATIN CAPITAL LIGATURE OE
+0x292F 0x0166  # LATIN CAPITAL LETTER T WITH STROKE
+0x2930 0x00DE  # LATIN CAPITAL LETTER THORN
+0x2941 0x00E6  # LATIN SMALL LIGATURE AE
+0x2942 0x0111  # LATIN SMALL LETTER D WITH STROKE
+0x2943 0x00F0  # LATIN SMALL LETTER ETH
+0x2944 0x0127  # LATIN SMALL LETTER H WITH STROKE
+0x2945 0x0131  # LATIN SMALL LETTER DOTLESS I
+0x2946 0x0133  # LATIN SMALL LIGATURE IJ
+0x2947 0x0138  # LATIN SMALL LETTER KRA
+0x2948 0x0142  # LATIN SMALL LETTER L WITH STROKE
+0x2949 0x0140  # LATIN SMALL LETTER L WITH MIDDLE DOT
+0x294A 0x0149  # LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
+0x294B 0x014B  # LATIN SMALL LETTER ENG
+0x294C 0x00F8  # LATIN SMALL LETTER O WITH STROKE
+0x294D 0x0153  # LATIN SMALL LIGATURE OE
+0x294E 0x00DF  # LATIN SMALL LETTER SHARP S
+0x294F 0x0167  # LATIN SMALL LETTER T WITH STROKE
+0x2950 0x00FE  # LATIN SMALL LETTER THORN
+0x2A21 0x00C1  # LATIN CAPITAL LETTER A WITH ACUTE
+0x2A22 0x00C0  # LATIN CAPITAL LETTER A WITH GRAVE
+0x2A23 0x00C4  # LATIN CAPITAL LETTER A WITH DIAERESIS
+0x2A24 0x00C2  # LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+0x2A25 0x0102  # LATIN CAPITAL LETTER A WITH BREVE
+0x2A26 0x01CD  # LATIN CAPITAL LETTER A WITH CARON
+0x2A27 0x0100  # LATIN CAPITAL LETTER A WITH MACRON
+0x2A28 0x0104  # LATIN CAPITAL LETTER A WITH OGONEK
+0x2A29 0x00C5  # LATIN CAPITAL LETTER A WITH RING ABOVE
+0x2A2A 0x00C3  # LATIN CAPITAL LETTER A WITH TILDE
+0x2A2B 0x0106  # LATIN CAPITAL LETTER C WITH ACUTE
+0x2A2C 0x0108  # LATIN CAPITAL LETTER C WITH CIRCUMFLEX
+0x2A2D 0x010C  # LATIN CAPITAL LETTER C WITH CARON
+0x2A2E 0x00C7  # LATIN CAPITAL LETTER C WITH CEDILLA
+0x2A2F 0x010A  # LATIN CAPITAL LETTER C WITH DOT ABOVE
+0x2A30 0x010E  # LATIN CAPITAL LETTER D WITH CARON
+0x2A31 0x00C9  # LATIN CAPITAL LETTER E WITH ACUTE
+0x2A32 0x00C8  # LATIN CAPITAL LETTER E WITH GRAVE
+0x2A33 0x00CB  # LATIN CAPITAL LETTER E WITH DIAERESIS
+0x2A34 0x00CA  # LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+0x2A35 0x011A  # LATIN CAPITAL LETTER E WITH CARON
+0x2A36 0x0116  # LATIN CAPITAL LETTER E WITH DOT ABOVE
+0x2A37 0x0112  # LATIN CAPITAL LETTER E WITH MACRON
+0x2A38 0x0118  # LATIN CAPITAL LETTER E WITH OGONEK
+0x2A3A 0x011C  # LATIN CAPITAL LETTER G WITH CIRCUMFLEX
+0x2A3B 0x011E  # LATIN CAPITAL LETTER G WITH BREVE
+0x2A3C 0x0122  # LATIN CAPITAL LETTER G WITH CEDILLA
+0x2A3D 0x0120  # LATIN CAPITAL LETTER G WITH DOT ABOVE
+0x2A3E 0x0124  # LATIN CAPITAL LETTER H WITH CIRCUMFLEX
+0x2A3F 0x00CD  # LATIN CAPITAL LETTER I WITH ACUTE
+0x2A40 0x00CC  # LATIN CAPITAL LETTER I WITH GRAVE
+0x2A41 0x00CF  # LATIN CAPITAL LETTER I WITH DIAERESIS
+0x2A42 0x00CE  # LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+0x2A43 0x01CF  # LATIN CAPITAL LETTER I WITH CARON
+0x2A44 0x0130  # LATIN CAPITAL LETTER I WITH DOT ABOVE
+0x2A45 0x012A  # LATIN CAPITAL LETTER I WITH MACRON
+0x2A46 0x012E  # LATIN CAPITAL LETTER I WITH OGONEK
+0x2A47 0x0128  # LATIN CAPITAL LETTER I WITH TILDE
+0x2A48 0x0134  # LATIN CAPITAL LETTER J WITH CIRCUMFLEX
+0x2A49 0x0136  # LATIN CAPITAL LETTER K WITH CEDILLA
+0x2A4A 0x0139  # LATIN CAPITAL LETTER L WITH ACUTE
+0x2A4B 0x013D  # LATIN CAPITAL LETTER L WITH CARON
+0x2A4C 0x013B  # LATIN CAPITAL LETTER L WITH CEDILLA
+0x2A4D 0x0143  # LATIN CAPITAL LETTER N WITH ACUTE
+0x2A4E 0x0147  # LATIN CAPITAL LETTER N WITH CARON
+0x2A4F 0x0145  # LATIN CAPITAL LETTER N WITH CEDILLA
+0x2A50 0x00D1  # LATIN CAPITAL LETTER N WITH TILDE
+0x2A51 0x00D3  # LATIN CAPITAL LETTER O WITH ACUTE
+0x2A52 0x00D2  # LATIN CAPITAL LETTER O WITH GRAVE
+0x2A53 0x00D6  # LATIN CAPITAL LETTER O WITH DIAERESIS
+0x2A54 0x00D4  # LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+0x2A55 0x01D1  # LATIN CAPITAL LETTER O WITH CARON
+0x2A56 0x0150  # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
+0x2A57 0x014C  # LATIN CAPITAL LETTER O WITH MACRON
+0x2A58 0x00D5  # LATIN CAPITAL LETTER O WITH TILDE
+0x2A59 0x0154  # LATIN CAPITAL LETTER R WITH ACUTE
+0x2A5A 0x0158  # LATIN CAPITAL LETTER R WITH CARON
+0x2A5B 0x0156  # LATIN CAPITAL LETTER R WITH CEDILLA
+0x2A5C 0x015A  # LATIN CAPITAL LETTER S WITH ACUTE
+0x2A5D 0x015C  # LATIN CAPITAL LETTER S WITH CIRCUMFLEX
+0x2A5E 0x0160  # LATIN CAPITAL LETTER S WITH CARON
+0x2A5F 0x015E  # LATIN CAPITAL LETTER S WITH CEDILLA
+0x2A60 0x0164  # LATIN CAPITAL LETTER T WITH CARON
+0x2A61 0x0162  # LATIN CAPITAL LETTER T WITH CEDILLA
+0x2A62 0x00DA  # LATIN CAPITAL LETTER U WITH ACUTE
+0x2A63 0x00D9  # LATIN CAPITAL LETTER U WITH GRAVE
+0x2A64 0x00DC  # LATIN CAPITAL LETTER U WITH DIAERESIS
+0x2A65 0x00DB  # LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+0x2A66 0x016C  # LATIN CAPITAL LETTER U WITH BREVE
+0x2A67 0x01D3  # LATIN CAPITAL LETTER U WITH CARON
+0x2A68 0x0170  # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
+0x2A69 0x016A  # LATIN CAPITAL LETTER U WITH MACRON
+0x2A6A 0x0172  # LATIN CAPITAL LETTER U WITH OGONEK
+0x2A6B 0x016E  # LATIN CAPITAL LETTER U WITH RING ABOVE
+0x2A6C 0x0168  # LATIN CAPITAL LETTER U WITH TILDE
+0x2A6D 0x01D7  # LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE
+0x2A6E 0x01DB  # LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE
+0x2A6F 0x01D9  # LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON
+0x2A70 0x01D5  # LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON
+0x2A71 0x0174  # LATIN CAPITAL LETTER W WITH CIRCUMFLEX
+0x2A72 0x00DD  # LATIN CAPITAL LETTER Y WITH ACUTE
+0x2A73 0x0178  # LATIN CAPITAL LETTER Y WITH DIAERESIS
+0x2A74 0x0176  # LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
+0x2A75 0x0179  # LATIN CAPITAL LETTER Z WITH ACUTE
+0x2A76 0x017D  # LATIN CAPITAL LETTER Z WITH CARON
+0x2A77 0x017B  # LATIN CAPITAL LETTER Z WITH DOT ABOVE
+0x2B21 0x00E1  # LATIN SMALL LETTER A WITH ACUTE
+0x2B22 0x00E0  # LATIN SMALL LETTER A WITH GRAVE
+0x2B23 0x00E4  # LATIN SMALL LETTER A WITH DIAERESIS
+0x2B24 0x00E2  # LATIN SMALL LETTER A WITH CIRCUMFLEX
+0x2B25 0x0103  # LATIN SMALL LETTER A WITH BREVE
+0x2B26 0x01CE  # LATIN SMALL LETTER A WITH CARON
+0x2B27 0x0101  # LATIN SMALL LETTER A WITH MACRON
+0x2B28 0x0105  # LATIN SMALL LETTER A WITH OGONEK
+0x2B29 0x00E5  # LATIN SMALL LETTER A WITH RING ABOVE
+0x2B2A 0x00E3  # LATIN SMALL LETTER A WITH TILDE
+0x2B2B 0x0107  # LATIN SMALL LETTER C WITH ACUTE
+0x2B2C 0x0109  # LATIN SMALL LETTER C WITH CIRCUMFLEX
+0x2B2D 0x010D  # LATIN SMALL LETTER C WITH CARON
+0x2B2E 0x00E7  # LATIN SMALL LETTER C WITH CEDILLA
+0x2B2F 0x010B  # LATIN SMALL LETTER C WITH DOT ABOVE
+0x2B30 0x010F  # LATIN SMALL LETTER D WITH CARON
+0x2B31 0x00E9  # LATIN SMALL LETTER E WITH ACUTE
+0x2B32 0x00E8  # LATIN SMALL LETTER E WITH GRAVE
+0x2B33 0x00EB  # LATIN SMALL LETTER E WITH DIAERESIS
+0x2B34 0x00EA  # LATIN SMALL LETTER E WITH CIRCUMFLEX
+0x2B35 0x011B  # LATIN SMALL LETTER E WITH CARON
+0x2B36 0x0117  # LATIN SMALL LETTER E WITH DOT ABOVE
+0x2B37 0x0113  # LATIN SMALL LETTER E WITH MACRON
+0x2B38 0x0119  # LATIN SMALL LETTER E WITH OGONEK
+0x2B39 0x01F5  # LATIN SMALL LETTER G WITH ACUTE
+0x2B3A 0x011D  # LATIN SMALL LETTER G WITH CIRCUMFLEX
+0x2B3B 0x011F  # LATIN SMALL LETTER G WITH BREVE
+0x2B3D 0x0121  # LATIN SMALL LETTER G WITH DOT ABOVE
+0x2B3E 0x0125  # LATIN SMALL LETTER H WITH CIRCUMFLEX
+0x2B3F 0x00ED  # LATIN SMALL LETTER I WITH ACUTE
+0x2B40 0x00EC  # LATIN SMALL LETTER I WITH GRAVE
+0x2B41 0x00EF  # LATIN SMALL LETTER I WITH DIAERESIS
+0x2B42 0x00EE  # LATIN SMALL LETTER I WITH CIRCUMFLEX
+0x2B43 0x01D0  # LATIN SMALL LETTER I WITH CARON
+0x2B45 0x012B  # LATIN SMALL LETTER I WITH MACRON
+0x2B46 0x012F  # LATIN SMALL LETTER I WITH OGONEK
+0x2B47 0x0129  # LATIN SMALL LETTER I WITH TILDE
+0x2B48 0x0135  # LATIN SMALL LETTER J WITH CIRCUMFLEX
+0x2B49 0x0137  # LATIN SMALL LETTER K WITH CEDILLA
+0x2B4A 0x013A  # LATIN SMALL LETTER L WITH ACUTE
+0x2B4B 0x013E  # LATIN SMALL LETTER L WITH CARON
+0x2B4C 0x013C  # LATIN SMALL LETTER L WITH CEDILLA
+0x2B4D 0x0144  # LATIN SMALL LETTER N WITH ACUTE
+0x2B4E 0x0148  # LATIN SMALL LETTER N WITH CARON
+0x2B4F 0x0146  # LATIN SMALL LETTER N WITH CEDILLA
+0x2B50 0x00F1  # LATIN SMALL LETTER N WITH TILDE
+0x2B51 0x00F3  # LATIN SMALL LETTER O WITH ACUTE
+0x2B52 0x00F2  # LATIN SMALL LETTER O WITH GRAVE
+0x2B53 0x00F6  # LATIN SMALL LETTER O WITH DIAERESIS
+0x2B54 0x00F4  # LATIN SMALL LETTER O WITH CIRCUMFLEX
+0x2B55 0x01D2  # LATIN SMALL LETTER O WITH CARON
+0x2B56 0x0151  # LATIN SMALL LETTER O WITH DOUBLE ACUTE
+0x2B57 0x014D  # LATIN SMALL LETTER O WITH MACRON
+0x2B58 0x00F5  # LATIN SMALL LETTER O WITH TILDE
+0x2B59 0x0155  # LATIN SMALL LETTER R WITH ACUTE
+0x2B5A 0x0159  # LATIN SMALL LETTER R WITH CARON
+0x2B5B 0x0157  # LATIN SMALL LETTER R WITH CEDILLA
+0x2B5C 0x015B  # LATIN SMALL LETTER S WITH ACUTE
+0x2B5D 0x015D  # LATIN SMALL LETTER S WITH CIRCUMFLEX
+0x2B5E 0x0161  # LATIN SMALL LETTER S WITH CARON
+0x2B5F 0x015F  # LATIN SMALL LETTER S WITH CEDILLA
+0x2B60 0x0165  # LATIN SMALL LETTER T WITH CARON
+0x2B61 0x0163  # LATIN SMALL LETTER T WITH CEDILLA
+0x2B62 0x00FA  # LATIN SMALL LETTER U WITH ACUTE
+0x2B63 0x00F9  # LATIN SMALL LETTER U WITH GRAVE
+0x2B64 0x00FC  # LATIN SMALL LETTER U WITH DIAERESIS
+0x2B65 0x00FB  # LATIN SMALL LETTER U WITH CIRCUMFLEX
+0x2B66 0x016D  # LATIN SMALL LETTER U WITH BREVE
+0x2B67 0x01D4  # LATIN SMALL LETTER U WITH CARON
+0x2B68 0x0171  # LATIN SMALL LETTER U WITH DOUBLE ACUTE
+0x2B69 0x016B  # LATIN SMALL LETTER U WITH MACRON
+0x2B6A 0x0173  # LATIN SMALL LETTER U WITH OGONEK
+0x2B6B 0x016F  # LATIN SMALL LETTER U WITH RING ABOVE
+0x2B6C 0x0169  # LATIN SMALL LETTER U WITH TILDE
+0x2B6D 0x01D8  # LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE
+0x2B6E 0x01DC  # LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE
+0x2B6F 0x01DA  # LATIN SMALL LETTER U WITH DIAERESIS AND CARON
+0x2B70 0x01D6  # LATIN SMALL LETTER U WITH DIAERESIS AND MACRON
+0x2B71 0x0175  # LATIN SMALL LETTER W WITH CIRCUMFLEX
+0x2B72 0x00FD  # LATIN SMALL LETTER Y WITH ACUTE
+0x2B73 0x00FF  # LATIN SMALL LETTER Y WITH DIAERESIS
+0x2B74 0x0177  # LATIN SMALL LETTER Y WITH CIRCUMFLEX
+0x2B75 0x017A  # LATIN SMALL LETTER Z WITH ACUTE
+0x2B76 0x017E  # LATIN SMALL LETTER Z WITH CARON
+0x2B77 0x017C  # LATIN SMALL LETTER Z WITH DOT ABOVE
+0x3021 0x4E02  # <CJK>
+0x3022 0x4E04  # <CJK>
+0x3023 0x4E05  # <CJK>
+0x3024 0x4E0C  # <CJK>
+0x3025 0x4E12  # <CJK>
+0x3026 0x4E1F  # <CJK>
+0x3027 0x4E23  # <CJK>
+0x3028 0x4E24  # <CJK>
+0x3029 0x4E28  # <CJK>
+0x302A 0x4E2B  # <CJK>
+0x302B 0x4E2E  # <CJK>
+0x302C 0x4E2F  # <CJK>
+0x302D 0x4E30  # <CJK>
+0x302E 0x4E35  # <CJK>
+0x302F 0x4E40  # <CJK>
+0x3030 0x4E41  # <CJK>
+0x3031 0x4E44  # <CJK>
+0x3032 0x4E47  # <CJK>
+0x3033 0x4E51  # <CJK>
+0x3034 0x4E5A  # <CJK>
+0x3035 0x4E5C  # <CJK>
+0x3036 0x4E63  # <CJK>
+0x3037 0x4E68  # <CJK>
+0x3038 0x4E69  # <CJK>
+0x3039 0x4E74  # <CJK>
+0x303A 0x4E75  # <CJK>
+0x303B 0x4E79  # <CJK>
+0x303C 0x4E7F  # <CJK>
+0x303D 0x4E8D  # <CJK>
+0x303E 0x4E96  # <CJK>
+0x303F 0x4E97  # <CJK>
+0x3040 0x4E9D  # <CJK>
+0x3041 0x4EAF  # <CJK>
+0x3042 0x4EB9  # <CJK>
+0x3043 0x4EC3  # <CJK>
+0x3044 0x4ED0  # <CJK>
+0x3045 0x4EDA  # <CJK>
+0x3046 0x4EDB  # <CJK>
+0x3047 0x4EE0  # <CJK>
+0x3048 0x4EE1  # <CJK>
+0x3049 0x4EE2  # <CJK>
+0x304A 0x4EE8  # <CJK>
+0x304B 0x4EEF  # <CJK>
+0x304C 0x4EF1  # <CJK>
+0x304D 0x4EF3  # <CJK>
+0x304E 0x4EF5  # <CJK>
+0x304F 0x4EFD  # <CJK>
+0x3050 0x4EFE  # <CJK>
+0x3051 0x4EFF  # <CJK>
+0x3052 0x4F00  # <CJK>
+0x3053 0x4F02  # <CJK>
+0x3054 0x4F03  # <CJK>
+0x3055 0x4F08  # <CJK>
+0x3056 0x4F0B  # <CJK>
+0x3057 0x4F0C  # <CJK>
+0x3058 0x4F12  # <CJK>
+0x3059 0x4F15  # <CJK>
+0x305A 0x4F16  # <CJK>
+0x305B 0x4F17  # <CJK>
+0x305C 0x4F19  # <CJK>
+0x305D 0x4F2E  # <CJK>
+0x305E 0x4F31  # <CJK>
+0x305F 0x4F60  # <CJK>
+0x3060 0x4F33  # <CJK>
+0x3061 0x4F35  # <CJK>
+0x3062 0x4F37  # <CJK>
+0x3063 0x4F39  # <CJK>
+0x3064 0x4F3B  # <CJK>
+0x3065 0x4F3E  # <CJK>
+0x3066 0x4F40  # <CJK>
+0x3067 0x4F42  # <CJK>
+0x3068 0x4F48  # <CJK>
+0x3069 0x4F49  # <CJK>
+0x306A 0x4F4B  # <CJK>
+0x306B 0x4F4C  # <CJK>
+0x306C 0x4F52  # <CJK>
+0x306D 0x4F54  # <CJK>
+0x306E 0x4F56  # <CJK>
+0x306F 0x4F58  # <CJK>
+0x3070 0x4F5F  # <CJK>
+0x3071 0x4F63  # <CJK>
+0x3072 0x4F6A  # <CJK>
+0x3073 0x4F6C  # <CJK>
+0x3074 0x4F6E  # <CJK>
+0x3075 0x4F71  # <CJK>
+0x3076 0x4F77  # <CJK>
+0x3077 0x4F78  # <CJK>
+0x3078 0x4F79  # <CJK>
+0x3079 0x4F7A  # <CJK>
+0x307A 0x4F7D  # <CJK>
+0x307B 0x4F7E  # <CJK>
+0x307C 0x4F81  # <CJK>
+0x307D 0x4F82  # <CJK>
+0x307E 0x4F84  # <CJK>
+0x3121 0x4F85  # <CJK>
+0x3122 0x4F89  # <CJK>
+0x3123 0x4F8A  # <CJK>
+0x3124 0x4F8C  # <CJK>
+0x3125 0x4F8E  # <CJK>
+0x3126 0x4F90  # <CJK>
+0x3127 0x4F92  # <CJK>
+0x3128 0x4F93  # <CJK>
+0x3129 0x4F94  # <CJK>
+0x312A 0x4F97  # <CJK>
+0x312B 0x4F99  # <CJK>
+0x312C 0x4F9A  # <CJK>
+0x312D 0x4F9E  # <CJK>
+0x312E 0x4F9F  # <CJK>
+0x312F 0x4FB2  # <CJK>
+0x3130 0x4FB7  # <CJK>
+0x3131 0x4FB9  # <CJK>
+0x3132 0x4FBB  # <CJK>
+0x3133 0x4FBC  # <CJK>
+0x3134 0x4FBD  # <CJK>
+0x3135 0x4FBE  # <CJK>
+0x3136 0x4FC0  # <CJK>
+0x3137 0x4FC1  # <CJK>
+0x3138 0x4FC5  # <CJK>
+0x3139 0x4FC6  # <CJK>
+0x313A 0x4FC8  # <CJK>
+0x313B 0x4FC9  # <CJK>
+0x313C 0x4FCB  # <CJK>
+0x313D 0x4FCC  # <CJK>
+0x313E 0x4FCD  # <CJK>
+0x313F 0x4FCF  # <CJK>
+0x3140 0x4FD2  # <CJK>
+0x3141 0x4FDC  # <CJK>
+0x3142 0x4FE0  # <CJK>
+0x3143 0x4FE2  # <CJK>
+0x3144 0x4FF0  # <CJK>
+0x3145 0x4FF2  # <CJK>
+0x3146 0x4FFC  # <CJK>
+0x3147 0x4FFD  # <CJK>
+0x3148 0x4FFF  # <CJK>
+0x3149 0x5000  # <CJK>
+0x314A 0x5001  # <CJK>
+0x314B 0x5004  # <CJK>
+0x314C 0x5007  # <CJK>
+0x314D 0x500A  # <CJK>
+0x314E 0x500C  # <CJK>
+0x314F 0x500E  # <CJK>
+0x3150 0x5010  # <CJK>
+0x3151 0x5013  # <CJK>
+0x3152 0x5017  # <CJK>
+0x3153 0x5018  # <CJK>
+0x3154 0x501B  # <CJK>
+0x3155 0x501C  # <CJK>
+0x3156 0x501D  # <CJK>
+0x3157 0x501E  # <CJK>
+0x3158 0x5022  # <CJK>
+0x3159 0x5027  # <CJK>
+0x315A 0x502E  # <CJK>
+0x315B 0x5030  # <CJK>
+0x315C 0x5032  # <CJK>
+0x315D 0x5033  # <CJK>
+0x315E 0x5035  # <CJK>
+0x315F 0x5040  # <CJK>
+0x3160 0x5041  # <CJK>
+0x3161 0x5042  # <CJK>
+0x3162 0x5045  # <CJK>
+0x3163 0x5046  # <CJK>
+0x3164 0x504A  # <CJK>
+0x3165 0x504C  # <CJK>
+0x3166 0x504E  # <CJK>
+0x3167 0x5051  # <CJK>
+0x3168 0x5052  # <CJK>
+0x3169 0x5053  # <CJK>
+0x316A 0x5057  # <CJK>
+0x316B 0x5059  # <CJK>
+0x316C 0x505F  # <CJK>
+0x316D 0x5060  # <CJK>
+0x316E 0x5062  # <CJK>
+0x316F 0x5063  # <CJK>
+0x3170 0x5066  # <CJK>
+0x3171 0x5067  # <CJK>
+0x3172 0x506A  # <CJK>
+0x3173 0x506D  # <CJK>
+0x3174 0x5070  # <CJK>
+0x3175 0x5071  # <CJK>
+0x3176 0x503B  # <CJK>
+0x3177 0x5081  # <CJK>
+0x3178 0x5083  # <CJK>
+0x3179 0x5084  # <CJK>
+0x317A 0x5086  # <CJK>
+0x317B 0x508A  # <CJK>
+0x317C 0x508E  # <CJK>
+0x317D 0x508F  # <CJK>
+0x317E 0x5090  # <CJK>
+0x3221 0x5092  # <CJK>
+0x3222 0x5093  # <CJK>
+0x3223 0x5094  # <CJK>
+0x3224 0x5096  # <CJK>
+0x3225 0x509B  # <CJK>
+0x3226 0x509C  # <CJK>
+0x3227 0x509E  # <CJK>
+0x3228 0x509F  # <CJK>
+0x3229 0x50A0  # <CJK>
+0x322A 0x50A1  # <CJK>
+0x322B 0x50A2  # <CJK>
+0x322C 0x50AA  # <CJK>
+0x322D 0x50AF  # <CJK>
+0x322E 0x50B0  # <CJK>
+0x322F 0x50B9  # <CJK>
+0x3230 0x50BA  # <CJK>
+0x3231 0x50BD  # <CJK>
+0x3232 0x50C0  # <CJK>
+0x3233 0x50C3  # <CJK>
+0x3234 0x50C4  # <CJK>
+0x3235 0x50C7  # <CJK>
+0x3236 0x50CC  # <CJK>
+0x3237 0x50CE  # <CJK>
+0x3238 0x50D0  # <CJK>
+0x3239 0x50D3  # <CJK>
+0x323A 0x50D4  # <CJK>
+0x323B 0x50D8  # <CJK>
+0x323C 0x50DC  # <CJK>
+0x323D 0x50DD  # <CJK>
+0x323E 0x50DF  # <CJK>
+0x323F 0x50E2  # <CJK>
+0x3240 0x50E4  # <CJK>
+0x3241 0x50E6  # <CJK>
+0x3242 0x50E8  # <CJK>
+0x3243 0x50E9  # <CJK>
+0x3244 0x50EF  # <CJK>
+0x3245 0x50F1  # <CJK>
+0x3246 0x50F6  # <CJK>
+0x3247 0x50FA  # <CJK>
+0x3248 0x50FE  # <CJK>
+0x3249 0x5103  # <CJK>
+0x324A 0x5106  # <CJK>
+0x324B 0x5107  # <CJK>
+0x324C 0x5108  # <CJK>
+0x324D 0x510B  # <CJK>
+0x324E 0x510C  # <CJK>
+0x324F 0x510D  # <CJK>
+0x3250 0x510E  # <CJK>
+0x3251 0x50F2  # <CJK>
+0x3252 0x5110  # <CJK>
+0x3253 0x5117  # <CJK>
+0x3254 0x5119  # <CJK>
+0x3255 0x511B  # <CJK>
+0x3256 0x511C  # <CJK>
+0x3257 0x511D  # <CJK>
+0x3258 0x511E  # <CJK>
+0x3259 0x5123  # <CJK>
+0x325A 0x5127  # <CJK>
+0x325B 0x5128  # <CJK>
+0x325C 0x512C  # <CJK>
+0x325D 0x512D  # <CJK>
+0x325E 0x512F  # <CJK>
+0x325F 0x5131  # <CJK>
+0x3260 0x5133  # <CJK>
+0x3261 0x5134  # <CJK>
+0x3262 0x5135  # <CJK>
+0x3263 0x5138  # <CJK>
+0x3264 0x5139  # <CJK>
+0x3265 0x5142  # <CJK>
+0x3266 0x514A  # <CJK>
+0x3267 0x514F  # <CJK>
+0x3268 0x5153  # <CJK>
+0x3269 0x5155  # <CJK>
+0x326A 0x5157  # <CJK>
+0x326B 0x5158  # <CJK>
+0x326C 0x515F  # <CJK>
+0x326D 0x5164  # <CJK>
+0x326E 0x5166  # <CJK>
+0x326F 0x517E  # <CJK>
+0x3270 0x5183  # <CJK>
+0x3271 0x5184  # <CJK>
+0x3272 0x518B  # <CJK>
+0x3273 0x518E  # <CJK>
+0x3274 0x5198  # <CJK>
+0x3275 0x519D  # <CJK>
+0x3276 0x51A1  # <CJK>
+0x3277 0x51A3  # <CJK>
+0x3278 0x51AD  # <CJK>
+0x3279 0x51B8  # <CJK>
+0x327A 0x51BA  # <CJK>
+0x327B 0x51BC  # <CJK>
+0x327C 0x51BE  # <CJK>
+0x327D 0x51BF  # <CJK>
+0x327E 0x51C2  # <CJK>
+0x3321 0x51C8  # <CJK>
+0x3322 0x51CF  # <CJK>
+0x3323 0x51D1  # <CJK>
+0x3324 0x51D2  # <CJK>
+0x3325 0x51D3  # <CJK>
+0x3326 0x51D5  # <CJK>
+0x3327 0x51D8  # <CJK>
+0x3328 0x51DE  # <CJK>
+0x3329 0x51E2  # <CJK>
+0x332A 0x51E5  # <CJK>
+0x332B 0x51EE  # <CJK>
+0x332C 0x51F2  # <CJK>
+0x332D 0x51F3  # <CJK>
+0x332E 0x51F4  # <CJK>
+0x332F 0x51F7  # <CJK>
+0x3330 0x5201  # <CJK>
+0x3331 0x5202  # <CJK>
+0x3332 0x5205  # <CJK>
+0x3333 0x5212  # <CJK>
+0x3334 0x5213  # <CJK>
+0x3335 0x5215  # <CJK>
+0x3336 0x5216  # <CJK>
+0x3337 0x5218  # <CJK>
+0x3338 0x5222  # <CJK>
+0x3339 0x5228  # <CJK>
+0x333A 0x5231  # <CJK>
+0x333B 0x5232  # <CJK>
+0x333C 0x5235  # <CJK>
+0x333D 0x523C  # <CJK>
+0x333E 0x5245  # <CJK>
+0x333F 0x5249  # <CJK>
+0x3340 0x5255  # <CJK>
+0x3341 0x5257  # <CJK>
+0x3342 0x5258  # <CJK>
+0x3343 0x525A  # <CJK>
+0x3344 0x525C  # <CJK>
+0x3345 0x525F  # <CJK>
+0x3346 0x5260  # <CJK>
+0x3347 0x5261  # <CJK>
+0x3348 0x5266  # <CJK>
+0x3349 0x526E  # <CJK>
+0x334A 0x5277  # <CJK>
+0x334B 0x5278  # <CJK>
+0x334C 0x5279  # <CJK>
+0x334D 0x5280  # <CJK>
+0x334E 0x5282  # <CJK>
+0x334F 0x5285  # <CJK>
+0x3350 0x528A  # <CJK>
+0x3351 0x528C  # <CJK>
+0x3352 0x5293  # <CJK>
+0x3353 0x5295  # <CJK>
+0x3354 0x5296  # <CJK>
+0x3355 0x5297  # <CJK>
+0x3356 0x5298  # <CJK>
+0x3357 0x529A  # <CJK>
+0x3358 0x529C  # <CJK>
+0x3359 0x52A4  # <CJK>
+0x335A 0x52A5  # <CJK>
+0x335B 0x52A6  # <CJK>
+0x335C 0x52A7  # <CJK>
+0x335D 0x52AF  # <CJK>
+0x335E 0x52B0  # <CJK>
+0x335F 0x52B6  # <CJK>
+0x3360 0x52B7  # <CJK>
+0x3361 0x52B8  # <CJK>
+0x3362 0x52BA  # <CJK>
+0x3363 0x52BB  # <CJK>
+0x3364 0x52BD  # <CJK>
+0x3365 0x52C0  # <CJK>
+0x3366 0x52C4  # <CJK>
+0x3367 0x52C6  # <CJK>
+0x3368 0x52C8  # <CJK>
+0x3369 0x52CC  # <CJK>
+0x336A 0x52CF  # <CJK>
+0x336B 0x52D1  # <CJK>
+0x336C 0x52D4  # <CJK>
+0x336D 0x52D6  # <CJK>
+0x336E 0x52DB  # <CJK>
+0x336F 0x52DC  # <CJK>
+0x3370 0x52E1  # <CJK>
+0x3371 0x52E5  # <CJK>
+0x3372 0x52E8  # <CJK>
+0x3373 0x52E9  # <CJK>
+0x3374 0x52EA  # <CJK>
+0x3375 0x52EC  # <CJK>
+0x3376 0x52F0  # <CJK>
+0x3377 0x52F1  # <CJK>
+0x3378 0x52F4  # <CJK>
+0x3379 0x52F6  # <CJK>
+0x337A 0x52F7  # <CJK>
+0x337B 0x5300  # <CJK>
+0x337C 0x5303  # <CJK>
+0x337D 0x530A  # <CJK>
+0x337E 0x530B  # <CJK>
+0x3421 0x530C  # <CJK>
+0x3422 0x5311  # <CJK>
+0x3423 0x5313  # <CJK>
+0x3424 0x5318  # <CJK>
+0x3425 0x531B  # <CJK>
+0x3426 0x531C  # <CJK>
+0x3427 0x531E  # <CJK>
+0x3428 0x531F  # <CJK>
+0x3429 0x5325  # <CJK>
+0x342A 0x5327  # <CJK>
+0x342B 0x5328  # <CJK>
+0x342C 0x5329  # <CJK>
+0x342D 0x532B  # <CJK>
+0x342E 0x532C  # <CJK>
+0x342F 0x532D  # <CJK>
+0x3430 0x5330  # <CJK>
+0x3431 0x5332  # <CJK>
+0x3432 0x5335  # <CJK>
+0x3433 0x533C  # <CJK>
+0x3434 0x533D  # <CJK>
+0x3435 0x533E  # <CJK>
+0x3436 0x5342  # <CJK>
+0x3437 0x534C  # <CJK>
+0x3438 0x534B  # <CJK>
+0x3439 0x5359  # <CJK>
+0x343A 0x535B  # <CJK>
+0x343B 0x5361  # <CJK>
+0x343C 0x5363  # <CJK>
+0x343D 0x5365  # <CJK>
+0x343E 0x536C  # <CJK>
+0x343F 0x536D  # <CJK>
+0x3440 0x5372  # <CJK>
+0x3441 0x5379  # <CJK>
+0x3442 0x537E  # <CJK>
+0x3443 0x5383  # <CJK>
+0x3444 0x5387  # <CJK>
+0x3445 0x5388  # <CJK>
+0x3446 0x538E  # <CJK>
+0x3447 0x5393  # <CJK>
+0x3448 0x5394  # <CJK>
+0x3449 0x5399  # <CJK>
+0x344A 0x539D  # <CJK>
+0x344B 0x53A1  # <CJK>
+0x344C 0x53A4  # <CJK>
+0x344D 0x53AA  # <CJK>
+0x344E 0x53AB  # <CJK>
+0x344F 0x53AF  # <CJK>
+0x3450 0x53B2  # <CJK>
+0x3451 0x53B4  # <CJK>
+0x3452 0x53B5  # <CJK>
+0x3453 0x53B7  # <CJK>
+0x3454 0x53B8  # <CJK>
+0x3455 0x53BA  # <CJK>
+0x3456 0x53BD  # <CJK>
+0x3457 0x53C0  # <CJK>
+0x3458 0x53C5  # <CJK>
+0x3459 0x53CF  # <CJK>
+0x345A 0x53D2  # <CJK>
+0x345B 0x53D3  # <CJK>
+0x345C 0x53D5  # <CJK>
+0x345D 0x53DA  # <CJK>
+0x345E 0x53DD  # <CJK>
+0x345F 0x53DE  # <CJK>
+0x3460 0x53E0  # <CJK>
+0x3461 0x53E6  # <CJK>
+0x3462 0x53E7  # <CJK>
+0x3463 0x53F5  # <CJK>
+0x3464 0x5402  # <CJK>
+0x3465 0x5413  # <CJK>
+0x3466 0x541A  # <CJK>
+0x3467 0x5421  # <CJK>
+0x3468 0x5427  # <CJK>
+0x3469 0x5428  # <CJK>
+0x346A 0x542A  # <CJK>
+0x346B 0x542F  # <CJK>
+0x346C 0x5431  # <CJK>
+0x346D 0x5434  # <CJK>
+0x346E 0x5435  # <CJK>
+0x346F 0x5443  # <CJK>
+0x3470 0x5444  # <CJK>
+0x3471 0x5447  # <CJK>
+0x3472 0x544D  # <CJK>
+0x3473 0x544F  # <CJK>
+0x3474 0x545E  # <CJK>
+0x3475 0x5462  # <CJK>
+0x3476 0x5464  # <CJK>
+0x3477 0x5466  # <CJK>
+0x3478 0x5467  # <CJK>
+0x3479 0x5469  # <CJK>
+0x347A 0x546B  # <CJK>
+0x347B 0x546D  # <CJK>
+0x347C 0x546E  # <CJK>
+0x347D 0x5474  # <CJK>
+0x347E 0x547F  # <CJK>
+0x3521 0x5481  # <CJK>
+0x3522 0x5483  # <CJK>
+0x3523 0x5485  # <CJK>
+0x3524 0x5488  # <CJK>
+0x3525 0x5489  # <CJK>
+0x3526 0x548D  # <CJK>
+0x3527 0x5491  # <CJK>
+0x3528 0x5495  # <CJK>
+0x3529 0x5496  # <CJK>
+0x352A 0x549C  # <CJK>
+0x352B 0x549F  # <CJK>
+0x352C 0x54A1  # <CJK>
+0x352D 0x54A6  # <CJK>
+0x352E 0x54A7  # <CJK>
+0x352F 0x54A9  # <CJK>
+0x3530 0x54AA  # <CJK>
+0x3531 0x54AD  # <CJK>
+0x3532 0x54AE  # <CJK>
+0x3533 0x54B1  # <CJK>
+0x3534 0x54B7  # <CJK>
+0x3535 0x54B9  # <CJK>
+0x3536 0x54BA  # <CJK>
+0x3537 0x54BB  # <CJK>
+0x3538 0x54BF  # <CJK>
+0x3539 0x54C6  # <CJK>
+0x353A 0x54CA  # <CJK>
+0x353B 0x54CD  # <CJK>
+0x353C 0x54CE  # <CJK>
+0x353D 0x54E0  # <CJK>
+0x353E 0x54EA  # <CJK>
+0x353F 0x54EC  # <CJK>
+0x3540 0x54EF  # <CJK>
+0x3541 0x54F6  # <CJK>
+0x3542 0x54FC  # <CJK>
+0x3543 0x54FE  # <CJK>
+0x3544 0x54FF  # <CJK>
+0x3545 0x5500  # <CJK>
+0x3546 0x5501  # <CJK>
+0x3547 0x5505  # <CJK>
+0x3548 0x5508  # <CJK>
+0x3549 0x5509  # <CJK>
+0x354A 0x550C  # <CJK>
+0x354B 0x550D  # <CJK>
+0x354C 0x550E  # <CJK>
+0x354D 0x5515  # <CJK>
+0x354E 0x552A  # <CJK>
+0x354F 0x552B  # <CJK>
+0x3550 0x5532  # <CJK>
+0x3551 0x5535  # <CJK>
+0x3552 0x5536  # <CJK>
+0x3553 0x553B  # <CJK>
+0x3554 0x553C  # <CJK>
+0x3555 0x553D  # <CJK>
+0x3556 0x5541  # <CJK>
+0x3557 0x5547  # <CJK>
+0x3558 0x5549  # <CJK>
+0x3559 0x554A  # <CJK>
+0x355A 0x554D  # <CJK>
+0x355B 0x5550  # <CJK>
+0x355C 0x5551  # <CJK>
+0x355D 0x5558  # <CJK>
+0x355E 0x555A  # <CJK>
+0x355F 0x555B  # <CJK>
+0x3560 0x555E  # <CJK>
+0x3561 0x5560  # <CJK>
+0x3562 0x5561  # <CJK>
+0x3563 0x5564  # <CJK>
+0x3564 0x5566  # <CJK>
+0x3565 0x557F  # <CJK>
+0x3566 0x5581  # <CJK>
+0x3567 0x5582  # <CJK>
+0x3568 0x5586  # <CJK>
+0x3569 0x5588  # <CJK>
+0x356A 0x558E  # <CJK>
+0x356B 0x558F  # <CJK>
+0x356C 0x5591  # <CJK>
+0x356D 0x5592  # <CJK>
+0x356E 0x5593  # <CJK>
+0x356F 0x5594  # <CJK>
+0x3570 0x5597  # <CJK>
+0x3571 0x55A3  # <CJK>
+0x3572 0x55A4  # <CJK>
+0x3573 0x55AD  # <CJK>
+0x3574 0x55B2  # <CJK>
+0x3575 0x55BF  # <CJK>
+0x3576 0x55C1  # <CJK>
+0x3577 0x55C3  # <CJK>
+0x3578 0x55C6  # <CJK>
+0x3579 0x55C9  # <CJK>
+0x357A 0x55CB  # <CJK>
+0x357B 0x55CC  # <CJK>
+0x357C 0x55CE  # <CJK>
+0x357D 0x55D1  # <CJK>
+0x357E 0x55D2  # <CJK>
+0x3621 0x55D3  # <CJK>
+0x3622 0x55D7  # <CJK>
+0x3623 0x55D8  # <CJK>
+0x3624 0x55DB  # <CJK>
+0x3625 0x55DE  # <CJK>
+0x3626 0x55E2  # <CJK>
+0x3627 0x55E9  # <CJK>
+0x3628 0x55F6  # <CJK>
+0x3629 0x55FF  # <CJK>
+0x362A 0x5605  # <CJK>
+0x362B 0x5608  # <CJK>
+0x362C 0x560A  # <CJK>
+0x362D 0x560D  # <CJK>
+0x362E 0x560E  # <CJK>
+0x362F 0x560F  # <CJK>
+0x3630 0x5610  # <CJK>
+0x3631 0x5611  # <CJK>
+0x3632 0x5612  # <CJK>
+0x3633 0x5619  # <CJK>
+0x3634 0x562C  # <CJK>
+0x3635 0x5630  # <CJK>
+0x3636 0x5633  # <CJK>
+0x3637 0x5635  # <CJK>
+0x3638 0x5637  # <CJK>
+0x3639 0x5639  # <CJK>
+0x363A 0x563B  # <CJK>
+0x363B 0x563C  # <CJK>
+0x363C 0x563D  # <CJK>
+0x363D 0x563F  # <CJK>
+0x363E 0x5640  # <CJK>
+0x363F 0x5641  # <CJK>
+0x3640 0x5643  # <CJK>
+0x3641 0x5644  # <CJK>
+0x3642 0x5646  # <CJK>
+0x3643 0x5649  # <CJK>
+0x3644 0x564B  # <CJK>
+0x3645 0x564D  # <CJK>
+0x3646 0x564F  # <CJK>
+0x3647 0x5654  # <CJK>
+0x3648 0x565E  # <CJK>
+0x3649 0x5660  # <CJK>
+0x364A 0x5661  # <CJK>
+0x364B 0x5662  # <CJK>
+0x364C 0x5663  # <CJK>
+0x364D 0x5666  # <CJK>
+0x364E 0x5669  # <CJK>
+0x364F 0x566D  # <CJK>
+0x3650 0x566F  # <CJK>
+0x3651 0x5671  # <CJK>
+0x3652 0x5672  # <CJK>
+0x3653 0x5675  # <CJK>
+0x3654 0x5684  # <CJK>
+0x3655 0x5685  # <CJK>
+0x3656 0x5688  # <CJK>
+0x3657 0x568B  # <CJK>
+0x3658 0x568C  # <CJK>
+0x3659 0x5695  # <CJK>
+0x365A 0x5699  # <CJK>
+0x365B 0x569A  # <CJK>
+0x365C 0x569D  # <CJK>
+0x365D 0x569E  # <CJK>
+0x365E 0x569F  # <CJK>
+0x365F 0x56A6  # <CJK>
+0x3660 0x56A7  # <CJK>
+0x3661 0x56A8  # <CJK>
+0x3662 0x56A9  # <CJK>
+0x3663 0x56AB  # <CJK>
+0x3664 0x56AC  # <CJK>
+0x3665 0x56AD  # <CJK>
+0x3666 0x56B1  # <CJK>
+0x3667 0x56B3  # <CJK>
+0x3668 0x56B7  # <CJK>
+0x3669 0x56BE  # <CJK>
+0x366A 0x56C5  # <CJK>
+0x366B 0x56C9  # <CJK>
+0x366C 0x56CA  # <CJK>
+0x366D 0x56CB  # <CJK>
+0x366E 0x56CF  # <CJK>
+0x366F 0x56D0  # <CJK>
+0x3670 0x56CC  # <CJK>
+0x3671 0x56CD  # <CJK>
+0x3672 0x56D9  # <CJK>
+0x3673 0x56DC  # <CJK>
+0x3674 0x56DD  # <CJK>
+0x3675 0x56DF  # <CJK>
+0x3676 0x56E1  # <CJK>
+0x3677 0x56E4  # <CJK>
+0x3678 0x56E5  # <CJK>
+0x3679 0x56E6  # <CJK>
+0x367A 0x56E7  # <CJK>
+0x367B 0x56E8  # <CJK>
+0x367C 0x56F1  # <CJK>
+0x367D 0x56EB  # <CJK>
+0x367E 0x56ED  # <CJK>
+0x3721 0x56F6  # <CJK>
+0x3722 0x56F7  # <CJK>
+0x3723 0x5701  # <CJK>
+0x3724 0x5702  # <CJK>
+0x3725 0x5707  # <CJK>
+0x3726 0x570A  # <CJK>
+0x3727 0x570C  # <CJK>
+0x3728 0x5711  # <CJK>
+0x3729 0x5715  # <CJK>
+0x372A 0x571A  # <CJK>
+0x372B 0x571B  # <CJK>
+0x372C 0x571D  # <CJK>
+0x372D 0x5720  # <CJK>
+0x372E 0x5722  # <CJK>
+0x372F 0x5723  # <CJK>
+0x3730 0x5724  # <CJK>
+0x3731 0x5725  # <CJK>
+0x3732 0x5729  # <CJK>
+0x3733 0x572A  # <CJK>
+0x3734 0x572C  # <CJK>
+0x3735 0x572E  # <CJK>
+0x3736 0x572F  # <CJK>
+0x3737 0x5733  # <CJK>
+0x3738 0x5734  # <CJK>
+0x3739 0x573D  # <CJK>
+0x373A 0x573E  # <CJK>
+0x373B 0x573F  # <CJK>
+0x373C 0x5745  # <CJK>
+0x373D 0x5746  # <CJK>
+0x373E 0x574C  # <CJK>
+0x373F 0x574D  # <CJK>
+0x3740 0x5752  # <CJK>
+0x3741 0x5762  # <CJK>
+0x3742 0x5765  # <CJK>
+0x3743 0x5767  # <CJK>
+0x3744 0x5768  # <CJK>
+0x3745 0x576B  # <CJK>
+0x3746 0x576D  # <CJK>
+0x3747 0x576E  # <CJK>
+0x3748 0x576F  # <CJK>
+0x3749 0x5770  # <CJK>
+0x374A 0x5771  # <CJK>
+0x374B 0x5773  # <CJK>
+0x374C 0x5774  # <CJK>
+0x374D 0x5775  # <CJK>
+0x374E 0x5777  # <CJK>
+0x374F 0x5779  # <CJK>
+0x3750 0x577A  # <CJK>
+0x3751 0x577B  # <CJK>
+0x3752 0x577C  # <CJK>
+0x3753 0x577E  # <CJK>
+0x3754 0x5781  # <CJK>
+0x3755 0x5783  # <CJK>
+0x3756 0x578C  # <CJK>
+0x3757 0x5794  # <CJK>
+0x3758 0x5797  # <CJK>
+0x3759 0x5799  # <CJK>
+0x375A 0x579A  # <CJK>
+0x375B 0x579C  # <CJK>
+0x375C 0x579D  # <CJK>
+0x375D 0x579E  # <CJK>
+0x375E 0x579F  # <CJK>
+0x375F 0x57A1  # <CJK>
+0x3760 0x5795  # <CJK>
+0x3761 0x57A7  # <CJK>
+0x3762 0x57A8  # <CJK>
+0x3763 0x57A9  # <CJK>
+0x3764 0x57AC  # <CJK>
+0x3765 0x57B8  # <CJK>
+0x3766 0x57BD  # <CJK>
+0x3767 0x57C7  # <CJK>
+0x3768 0x57C8  # <CJK>
+0x3769 0x57CC  # <CJK>
+0x376A 0x57CF  # <CJK>
+0x376B 0x57D5  # <CJK>
+0x376C 0x57DD  # <CJK>
+0x376D 0x57DE  # <CJK>
+0x376E 0x57E4  # <CJK>
+0x376F 0x57E6  # <CJK>
+0x3770 0x57E7  # <CJK>
+0x3771 0x57E9  # <CJK>
+0x3772 0x57ED  # <CJK>
+0x3773 0x57F0  # <CJK>
+0x3774 0x57F5  # <CJK>
+0x3775 0x57F6  # <CJK>
+0x3776 0x57F8  # <CJK>
+0x3777 0x57FD  # <CJK>
+0x3778 0x57FE  # <CJK>
+0x3779 0x57FF  # <CJK>
+0x377A 0x5803  # <CJK>
+0x377B 0x5804  # <CJK>
+0x377C 0x5808  # <CJK>
+0x377D 0x5809  # <CJK>
+0x377E 0x57E1  # <CJK>
+0x3821 0x580C  # <CJK>
+0x3822 0x580D  # <CJK>
+0x3823 0x581B  # <CJK>
+0x3824 0x581E  # <CJK>
+0x3825 0x581F  # <CJK>
+0x3826 0x5820  # <CJK>
+0x3827 0x5826  # <CJK>
+0x3828 0x5827  # <CJK>
+0x3829 0x582D  # <CJK>
+0x382A 0x5832  # <CJK>
+0x382B 0x5839  # <CJK>
+0x382C 0x583F  # <CJK>
+0x382D 0x5849  # <CJK>
+0x382E 0x584C  # <CJK>
+0x382F 0x584D  # <CJK>
+0x3830 0x584F  # <CJK>
+0x3831 0x5850  # <CJK>
+0x3832 0x5855  # <CJK>
+0x3833 0x585F  # <CJK>
+0x3834 0x5861  # <CJK>
+0x3835 0x5864  # <CJK>
+0x3836 0x5867  # <CJK>
+0x3837 0x5868  # <CJK>
+0x3838 0x5878  # <CJK>
+0x3839 0x587C  # <CJK>
+0x383A 0x587F  # <CJK>
+0x383B 0x5880  # <CJK>
+0x383C 0x5881  # <CJK>
+0x383D 0x5887  # <CJK>
+0x383E 0x5888  # <CJK>
+0x383F 0x5889  # <CJK>
+0x3840 0x588A  # <CJK>
+0x3841 0x588C  # <CJK>
+0x3842 0x588D  # <CJK>
+0x3843 0x588F  # <CJK>
+0x3844 0x5890  # <CJK>
+0x3845 0x5894  # <CJK>
+0x3846 0x5896  # <CJK>
+0x3847 0x589D  # <CJK>
+0x3848 0x58A0  # <CJK>
+0x3849 0x58A1  # <CJK>
+0x384A 0x58A2  # <CJK>
+0x384B 0x58A6  # <CJK>
+0x384C 0x58A9  # <CJK>
+0x384D 0x58B1  # <CJK>
+0x384E 0x58B2  # <CJK>
+0x384F 0x58C4  # <CJK>
+0x3850 0x58BC  # <CJK>
+0x3851 0x58C2  # <CJK>
+0x3852 0x58C8  # <CJK>
+0x3853 0x58CD  # <CJK>
+0x3854 0x58CE  # <CJK>
+0x3855 0x58D0  # <CJK>
+0x3856 0x58D2  # <CJK>
+0x3857 0x58D4  # <CJK>
+0x3858 0x58D6  # <CJK>
+0x3859 0x58DA  # <CJK>
+0x385A 0x58DD  # <CJK>
+0x385B 0x58E1  # <CJK>
+0x385C 0x58E2  # <CJK>
+0x385D 0x58E9  # <CJK>
+0x385E 0x58F3  # <CJK>
+0x385F 0x5905  # <CJK>
+0x3860 0x5906  # <CJK>
+0x3861 0x590B  # <CJK>
+0x3862 0x590C  # <CJK>
+0x3863 0x5912  # <CJK>
+0x3864 0x5913  # <CJK>
+0x3865 0x5914  # <CJK>
+0x3866 0x8641  # <CJK>
+0x3867 0x591D  # <CJK>
+0x3868 0x5921  # <CJK>
+0x3869 0x5923  # <CJK>
+0x386A 0x5924  # <CJK>
+0x386B 0x5928  # <CJK>
+0x386C 0x592F  # <CJK>
+0x386D 0x5930  # <CJK>
+0x386E 0x5933  # <CJK>
+0x386F 0x5935  # <CJK>
+0x3870 0x5936  # <CJK>
+0x3871 0x593F  # <CJK>
+0x3872 0x5943  # <CJK>
+0x3873 0x5946  # <CJK>
+0x3874 0x5952  # <CJK>
+0x3875 0x5953  # <CJK>
+0x3876 0x5959  # <CJK>
+0x3877 0x595B  # <CJK>
+0x3878 0x595D  # <CJK>
+0x3879 0x595E  # <CJK>
+0x387A 0x595F  # <CJK>
+0x387B 0x5961  # <CJK>
+0x387C 0x5963  # <CJK>
+0x387D 0x596B  # <CJK>
+0x387E 0x596D  # <CJK>
+0x3921 0x596F  # <CJK>
+0x3922 0x5972  # <CJK>
+0x3923 0x5975  # <CJK>
+0x3924 0x5976  # <CJK>
+0x3925 0x5979  # <CJK>
+0x3926 0x597B  # <CJK>
+0x3927 0x597C  # <CJK>
+0x3928 0x598B  # <CJK>
+0x3929 0x598C  # <CJK>
+0x392A 0x598E  # <CJK>
+0x392B 0x5992  # <CJK>
+0x392C 0x5995  # <CJK>
+0x392D 0x5997  # <CJK>
+0x392E 0x599F  # <CJK>
+0x392F 0x59A4  # <CJK>
+0x3930 0x59A7  # <CJK>
+0x3931 0x59AD  # <CJK>
+0x3932 0x59AE  # <CJK>
+0x3933 0x59AF  # <CJK>
+0x3934 0x59B0  # <CJK>
+0x3935 0x59B3  # <CJK>
+0x3936 0x59B7  # <CJK>
+0x3937 0x59BA  # <CJK>
+0x3938 0x59BC  # <CJK>
+0x3939 0x59C1  # <CJK>
+0x393A 0x59C3  # <CJK>
+0x393B 0x59C4  # <CJK>
+0x393C 0x59C8  # <CJK>
+0x393D 0x59CA  # <CJK>
+0x393E 0x59CD  # <CJK>
+0x393F 0x59D2  # <CJK>
+0x3940 0x59DD  # <CJK>
+0x3941 0x59DE  # <CJK>
+0x3942 0x59DF  # <CJK>
+0x3943 0x59E3  # <CJK>
+0x3944 0x59E4  # <CJK>
+0x3945 0x59E7  # <CJK>
+0x3946 0x59EE  # <CJK>
+0x3947 0x59EF  # <CJK>
+0x3948 0x59F1  # <CJK>
+0x3949 0x59F2  # <CJK>
+0x394A 0x59F4  # <CJK>
+0x394B 0x59F7  # <CJK>
+0x394C 0x5A00  # <CJK>
+0x394D 0x5A04  # <CJK>
+0x394E 0x5A0C  # <CJK>
+0x394F 0x5A0D  # <CJK>
+0x3950 0x5A0E  # <CJK>
+0x3951 0x5A12  # <CJK>
+0x3952 0x5A13  # <CJK>
+0x3953 0x5A1E  # <CJK>
+0x3954 0x5A23  # <CJK>
+0x3955 0x5A24  # <CJK>
+0x3956 0x5A27  # <CJK>
+0x3957 0x5A28  # <CJK>
+0x3958 0x5A2A  # <CJK>
+0x3959 0x5A2D  # <CJK>
+0x395A 0x5A30  # <CJK>
+0x395B 0x5A44  # <CJK>
+0x395C 0x5A45  # <CJK>
+0x395D 0x5A47  # <CJK>
+0x395E 0x5A48  # <CJK>
+0x395F 0x5A4C  # <CJK>
+0x3960 0x5A50  # <CJK>
+0x3961 0x5A55  # <CJK>
+0x3962 0x5A5E  # <CJK>
+0x3963 0x5A63  # <CJK>
+0x3964 0x5A65  # <CJK>
+0x3965 0x5A67  # <CJK>
+0x3966 0x5A6D  # <CJK>
+0x3967 0x5A77  # <CJK>
+0x3968 0x5A7A  # <CJK>
+0x3969 0x5A7B  # <CJK>
+0x396A 0x5A7E  # <CJK>
+0x396B 0x5A8B  # <CJK>
+0x396C 0x5A90  # <CJK>
+0x396D 0x5A93  # <CJK>
+0x396E 0x5A96  # <CJK>
+0x396F 0x5A99  # <CJK>
+0x3970 0x5A9C  # <CJK>
+0x3971 0x5A9E  # <CJK>
+0x3972 0x5A9F  # <CJK>
+0x3973 0x5AA0  # <CJK>
+0x3974 0x5AA2  # <CJK>
+0x3975 0x5AA7  # <CJK>
+0x3976 0x5AAC  # <CJK>
+0x3977 0x5AB1  # <CJK>
+0x3978 0x5AB2  # <CJK>
+0x3979 0x5AB3  # <CJK>
+0x397A 0x5AB5  # <CJK>
+0x397B 0x5AB8  # <CJK>
+0x397C 0x5ABA  # <CJK>
+0x397D 0x5ABB  # <CJK>
+0x397E 0x5ABF  # <CJK>
+0x3A21 0x5AC4  # <CJK>
+0x3A22 0x5AC6  # <CJK>
+0x3A23 0x5AC8  # <CJK>
+0x3A24 0x5ACF  # <CJK>
+0x3A25 0x5ADA  # <CJK>
+0x3A26 0x5ADC  # <CJK>
+0x3A27 0x5AE0  # <CJK>
+0x3A28 0x5AE5  # <CJK>
+0x3A29 0x5AEA  # <CJK>
+0x3A2A 0x5AEE  # <CJK>
+0x3A2B 0x5AF5  # <CJK>
+0x3A2C 0x5AF6  # <CJK>
+0x3A2D 0x5AFD  # <CJK>
+0x3A2E 0x5B00  # <CJK>
+0x3A2F 0x5B01  # <CJK>
+0x3A30 0x5B08  # <CJK>
+0x3A31 0x5B17  # <CJK>
+0x3A32 0x5B34  # <CJK>
+0x3A33 0x5B19  # <CJK>
+0x3A34 0x5B1B  # <CJK>
+0x3A35 0x5B1D  # <CJK>
+0x3A36 0x5B21  # <CJK>
+0x3A37 0x5B25  # <CJK>
+0x3A38 0x5B2D  # <CJK>
+0x3A39 0x5B38  # <CJK>
+0x3A3A 0x5B41  # <CJK>
+0x3A3B 0x5B4B  # <CJK>
+0x3A3C 0x5B4C  # <CJK>
+0x3A3D 0x5B52  # <CJK>
+0x3A3E 0x5B56  # <CJK>
+0x3A3F 0x5B5E  # <CJK>
+0x3A40 0x5B68  # <CJK>
+0x3A41 0x5B6E  # <CJK>
+0x3A42 0x5B6F  # <CJK>
+0x3A43 0x5B7C  # <CJK>
+0x3A44 0x5B7D  # <CJK>
+0x3A45 0x5B7E  # <CJK>
+0x3A46 0x5B7F  # <CJK>
+0x3A47 0x5B81  # <CJK>
+0x3A48 0x5B84  # <CJK>
+0x3A49 0x5B86  # <CJK>
+0x3A4A 0x5B8A  # <CJK>
+0x3A4B 0x5B8E  # <CJK>
+0x3A4C 0x5B90  # <CJK>
+0x3A4D 0x5B91  # <CJK>
+0x3A4E 0x5B93  # <CJK>
+0x3A4F 0x5B94  # <CJK>
+0x3A50 0x5B96  # <CJK>
+0x3A51 0x5BA8  # <CJK>
+0x3A52 0x5BA9  # <CJK>
+0x3A53 0x5BAC  # <CJK>
+0x3A54 0x5BAD  # <CJK>
+0x3A55 0x5BAF  # <CJK>
+0x3A56 0x5BB1  # <CJK>
+0x3A57 0x5BB2  # <CJK>
+0x3A58 0x5BB7  # <CJK>
+0x3A59 0x5BBA  # <CJK>
+0x3A5A 0x5BBC  # <CJK>
+0x3A5B 0x5BC0  # <CJK>
+0x3A5C 0x5BC1  # <CJK>
+0x3A5D 0x5BCD  # <CJK>
+0x3A5E 0x5BCF  # <CJK>
+0x3A5F 0x5BD6  # <CJK>
+0x3A60 0x5BD7  # <CJK>
+0x3A61 0x5BD8  # <CJK>
+0x3A62 0x5BD9  # <CJK>
+0x3A63 0x5BDA  # <CJK>
+0x3A64 0x5BE0  # <CJK>
+0x3A65 0x5BEF  # <CJK>
+0x3A66 0x5BF1  # <CJK>
+0x3A67 0x5BF4  # <CJK>
+0x3A68 0x5BFD  # <CJK>
+0x3A69 0x5C0C  # <CJK>
+0x3A6A 0x5C17  # <CJK>
+0x3A6B 0x5C1E  # <CJK>
+0x3A6C 0x5C1F  # <CJK>
+0x3A6D 0x5C23  # <CJK>
+0x3A6E 0x5C26  # <CJK>
+0x3A6F 0x5C29  # <CJK>
+0x3A70 0x5C2B  # <CJK>
+0x3A71 0x5C2C  # <CJK>
+0x3A72 0x5C2E  # <CJK>
+0x3A73 0x5C30  # <CJK>
+0x3A74 0x5C32  # <CJK>
+0x3A75 0x5C35  # <CJK>
+0x3A76 0x5C36  # <CJK>
+0x3A77 0x5C59  # <CJK>
+0x3A78 0x5C5A  # <CJK>
+0x3A79 0x5C5C  # <CJK>
+0x3A7A 0x5C62  # <CJK>
+0x3A7B 0x5C63  # <CJK>
+0x3A7C 0x5C67  # <CJK>
+0x3A7D 0x5C68  # <CJK>
+0x3A7E 0x5C69  # <CJK>
+0x3B21 0x5C6D  # <CJK>
+0x3B22 0x5C70  # <CJK>
+0x3B23 0x5C74  # <CJK>
+0x3B24 0x5C75  # <CJK>
+0x3B25 0x5C7A  # <CJK>
+0x3B26 0x5C7B  # <CJK>
+0x3B27 0x5C7C  # <CJK>
+0x3B28 0x5C7D  # <CJK>
+0x3B29 0x5C87  # <CJK>
+0x3B2A 0x5C88  # <CJK>
+0x3B2B 0x5C8A  # <CJK>
+0x3B2C 0x5C8F  # <CJK>
+0x3B2D 0x5C92  # <CJK>
+0x3B2E 0x5C9D  # <CJK>
+0x3B2F 0x5C9F  # <CJK>
+0x3B30 0x5CA0  # <CJK>
+0x3B31 0x5CA2  # <CJK>
+0x3B32 0x5CA3  # <CJK>
+0x3B33 0x5CA6  # <CJK>
+0x3B34 0x5CAA  # <CJK>
+0x3B35 0x5CB2  # <CJK>
+0x3B36 0x5CB4  # <CJK>
+0x3B37 0x5CB5  # <CJK>
+0x3B38 0x5CBA  # <CJK>
+0x3B39 0x5CC9  # <CJK>
+0x3B3A 0x5CCB  # <CJK>
+0x3B3B 0x5CD2  # <CJK>
+0x3B3C 0x5CDD  # <CJK>
+0x3B3D 0x5CD7  # <CJK>
+0x3B3E 0x5CEE  # <CJK>
+0x3B3F 0x5CF1  # <CJK>
+0x3B40 0x5CF2  # <CJK>
+0x3B41 0x5CF4  # <CJK>
+0x3B42 0x5D01  # <CJK>
+0x3B43 0x5D06  # <CJK>
+0x3B44 0x5D0D  # <CJK>
+0x3B45 0x5D12  # <CJK>
+0x3B46 0x5D2B  # <CJK>
+0x3B47 0x5D23  # <CJK>
+0x3B48 0x5D24  # <CJK>
+0x3B49 0x5D26  # <CJK>
+0x3B4A 0x5D27  # <CJK>
+0x3B4B 0x5D31  # <CJK>
+0x3B4C 0x5D34  # <CJK>
+0x3B4D 0x5D39  # <CJK>
+0x3B4E 0x5D3D  # <CJK>
+0x3B4F 0x5D3F  # <CJK>
+0x3B50 0x5D42  # <CJK>
+0x3B51 0x5D43  # <CJK>
+0x3B52 0x5D46  # <CJK>
+0x3B53 0x5D48  # <CJK>
+0x3B54 0x5D55  # <CJK>
+0x3B55 0x5D51  # <CJK>
+0x3B56 0x5D59  # <CJK>
+0x3B57 0x5D4A  # <CJK>
+0x3B58 0x5D5F  # <CJK>
+0x3B59 0x5D60  # <CJK>
+0x3B5A 0x5D61  # <CJK>
+0x3B5B 0x5D62  # <CJK>
+0x3B5C 0x5D64  # <CJK>
+0x3B5D 0x5D6A  # <CJK>
+0x3B5E 0x5D6D  # <CJK>
+0x3B5F 0x5D70  # <CJK>
+0x3B60 0x5D79  # <CJK>
+0x3B61 0x5D7A  # <CJK>
+0x3B62 0x5D7E  # <CJK>
+0x3B63 0x5D7F  # <CJK>
+0x3B64 0x5D81  # <CJK>
+0x3B65 0x5D83  # <CJK>
+0x3B66 0x5D88  # <CJK>
+0x3B67 0x5D8A  # <CJK>
+0x3B68 0x5D92  # <CJK>
+0x3B69 0x5D93  # <CJK>
+0x3B6A 0x5D94  # <CJK>
+0x3B6B 0x5D95  # <CJK>
+0x3B6C 0x5D99  # <CJK>
+0x3B6D 0x5D9B  # <CJK>
+0x3B6E 0x5D9F  # <CJK>
+0x3B6F 0x5DA0  # <CJK>
+0x3B70 0x5DA7  # <CJK>
+0x3B71 0x5DAB  # <CJK>
+0x3B72 0x5DB0  # <CJK>
+0x3B73 0x5DB4  # <CJK>
+0x3B74 0x5DB8  # <CJK>
+0x3B75 0x5DB9  # <CJK>
+0x3B76 0x5DC3  # <CJK>
+0x3B77 0x5DC7  # <CJK>
+0x3B78 0x5DCB  # <CJK>
+0x3B79 0x5DD0  # <CJK>
+0x3B7A 0x5DCE  # <CJK>
+0x3B7B 0x5DD8  # <CJK>
+0x3B7C 0x5DD9  # <CJK>
+0x3B7D 0x5DE0  # <CJK>
+0x3B7E 0x5DE4  # <CJK>
+0x3C21 0x5DE9  # <CJK>
+0x3C22 0x5DF8  # <CJK>
+0x3C23 0x5DF9  # <CJK>
+0x3C24 0x5E00  # <CJK>
+0x3C25 0x5E07  # <CJK>
+0x3C26 0x5E0D  # <CJK>
+0x3C27 0x5E12  # <CJK>
+0x3C28 0x5E14  # <CJK>
+0x3C29 0x5E15  # <CJK>
+0x3C2A 0x5E18  # <CJK>
+0x3C2B 0x5E1F  # <CJK>
+0x3C2C 0x5E20  # <CJK>
+0x3C2D 0x5E2E  # <CJK>
+0x3C2E 0x5E28  # <CJK>
+0x3C2F 0x5E32  # <CJK>
+0x3C30 0x5E35  # <CJK>
+0x3C31 0x5E3E  # <CJK>
+0x3C32 0x5E4B  # <CJK>
+0x3C33 0x5E50  # <CJK>
+0x3C34 0x5E49  # <CJK>
+0x3C35 0x5E51  # <CJK>
+0x3C36 0x5E56  # <CJK>
+0x3C37 0x5E58  # <CJK>
+0x3C38 0x5E5B  # <CJK>
+0x3C39 0x5E5C  # <CJK>
+0x3C3A 0x5E5E  # <CJK>
+0x3C3B 0x5E68  # <CJK>
+0x3C3C 0x5E6A  # <CJK>
+0x3C3D 0x5E6B  # <CJK>
+0x3C3E 0x5E6C  # <CJK>
+0x3C3F 0x5E6D  # <CJK>
+0x3C40 0x5E6E  # <CJK>
+0x3C41 0x5E70  # <CJK>
+0x3C42 0x5E80  # <CJK>
+0x3C43 0x5E8B  # <CJK>
+0x3C44 0x5E8E  # <CJK>
+0x3C45 0x5EA2  # <CJK>
+0x3C46 0x5EA4  # <CJK>
+0x3C47 0x5EA5  # <CJK>
+0x3C48 0x5EA8  # <CJK>
+0x3C49 0x5EAA  # <CJK>
+0x3C4A 0x5EAC  # <CJK>
+0x3C4B 0x5EB1  # <CJK>
+0x3C4C 0x5EB3  # <CJK>
+0x3C4D 0x5EBD  # <CJK>
+0x3C4E 0x5EBE  # <CJK>
+0x3C4F 0x5EBF  # <CJK>
+0x3C50 0x5EC6  # <CJK>
+0x3C51 0x5ECC  # <CJK>
+0x3C52 0x5ECB  # <CJK>
+0x3C53 0x5ECE  # <CJK>
+0x3C54 0x5ED1  # <CJK>
+0x3C55 0x5ED2  # <CJK>
+0x3C56 0x5ED4  # <CJK>
+0x3C57 0x5ED5  # <CJK>
+0x3C58 0x5EDC  # <CJK>
+0x3C59 0x5EDE  # <CJK>
+0x3C5A 0x5EE5  # <CJK>
+0x3C5B 0x5EEB  # <CJK>
+0x3C5C 0x5F02  # <CJK>
+0x3C5D 0x5F06  # <CJK>
+0x3C5E 0x5F07  # <CJK>
+0x3C5F 0x5F08  # <CJK>
+0x3C60 0x5F0E  # <CJK>
+0x3C61 0x5F19  # <CJK>
+0x3C62 0x5F1C  # <CJK>
+0x3C63 0x5F1D  # <CJK>
+0x3C64 0x5F21  # <CJK>
+0x3C65 0x5F22  # <CJK>
+0x3C66 0x5F23  # <CJK>
+0x3C67 0x5F24  # <CJK>
+0x3C68 0x5F28  # <CJK>
+0x3C69 0x5F2B  # <CJK>
+0x3C6A 0x5F2C  # <CJK>
+0x3C6B 0x5F2E  # <CJK>
+0x3C6C 0x5F30  # <CJK>
+0x3C6D 0x5F34  # <CJK>
+0x3C6E 0x5F36  # <CJK>
+0x3C6F 0x5F3B  # <CJK>
+0x3C70 0x5F3D  # <CJK>
+0x3C71 0x5F3F  # <CJK>
+0x3C72 0x5F40  # <CJK>
+0x3C73 0x5F44  # <CJK>
+0x3C74 0x5F45  # <CJK>
+0x3C75 0x5F47  # <CJK>
+0x3C76 0x5F4D  # <CJK>
+0x3C77 0x5F50  # <CJK>
+0x3C78 0x5F54  # <CJK>
+0x3C79 0x5F58  # <CJK>
+0x3C7A 0x5F5B  # <CJK>
+0x3C7B 0x5F60  # <CJK>
+0x3C7C 0x5F63  # <CJK>
+0x3C7D 0x5F64  # <CJK>
+0x3C7E 0x5F67  # <CJK>
+0x3D21 0x5F6F  # <CJK>
+0x3D22 0x5F72  # <CJK>
+0x3D23 0x5F74  # <CJK>
+0x3D24 0x5F75  # <CJK>
+0x3D25 0x5F78  # <CJK>
+0x3D26 0x5F7A  # <CJK>
+0x3D27 0x5F7D  # <CJK>
+0x3D28 0x5F7E  # <CJK>
+0x3D29 0x5F89  # <CJK>
+0x3D2A 0x5F8D  # <CJK>
+0x3D2B 0x5F8F  # <CJK>
+0x3D2C 0x5F96  # <CJK>
+0x3D2D 0x5F9C  # <CJK>
+0x3D2E 0x5F9D  # <CJK>
+0x3D2F 0x5FA2  # <CJK>
+0x3D30 0x5FA7  # <CJK>
+0x3D31 0x5FAB  # <CJK>
+0x3D32 0x5FA4  # <CJK>
+0x3D33 0x5FAC  # <CJK>
+0x3D34 0x5FAF  # <CJK>
+0x3D35 0x5FB0  # <CJK>
+0x3D36 0x5FB1  # <CJK>
+0x3D37 0x5FB8  # <CJK>
+0x3D38 0x5FC4  # <CJK>
+0x3D39 0x5FC7  # <CJK>
+0x3D3A 0x5FC8  # <CJK>
+0x3D3B 0x5FC9  # <CJK>
+0x3D3C 0x5FCB  # <CJK>
+0x3D3D 0x5FD0  # <CJK>
+0x3D3E 0x5FD1  # <CJK>
+0x3D3F 0x5FD2  # <CJK>
+0x3D40 0x5FD3  # <CJK>
+0x3D41 0x5FD4  # <CJK>
+0x3D42 0x5FDE  # <CJK>
+0x3D43 0x5FE1  # <CJK>
+0x3D44 0x5FE2  # <CJK>
+0x3D45 0x5FE8  # <CJK>
+0x3D46 0x5FE9  # <CJK>
+0x3D47 0x5FEA  # <CJK>
+0x3D48 0x5FEC  # <CJK>
+0x3D49 0x5FED  # <CJK>
+0x3D4A 0x5FEE  # <CJK>
+0x3D4B 0x5FEF  # <CJK>
+0x3D4C 0x5FF2  # <CJK>
+0x3D4D 0x5FF3  # <CJK>
+0x3D4E 0x5FF6  # <CJK>
+0x3D4F 0x5FFA  # <CJK>
+0x3D50 0x5FFC  # <CJK>
+0x3D51 0x6007  # <CJK>
+0x3D52 0x600A  # <CJK>
+0x3D53 0x600D  # <CJK>
+0x3D54 0x6013  # <CJK>
+0x3D55 0x6014  # <CJK>
+0x3D56 0x6017  # <CJK>
+0x3D57 0x6018  # <CJK>
+0x3D58 0x601A  # <CJK>
+0x3D59 0x601F  # <CJK>
+0x3D5A 0x6024  # <CJK>
+0x3D5B 0x602D  # <CJK>
+0x3D5C 0x6033  # <CJK>
+0x3D5D 0x6035  # <CJK>
+0x3D5E 0x6040  # <CJK>
+0x3D5F 0x6047  # <CJK>
+0x3D60 0x6048  # <CJK>
+0x3D61 0x6049  # <CJK>
+0x3D62 0x604C  # <CJK>
+0x3D63 0x6051  # <CJK>
+0x3D64 0x6054  # <CJK>
+0x3D65 0x6056  # <CJK>
+0x3D66 0x6057  # <CJK>
+0x3D67 0x605D  # <CJK>
+0x3D68 0x6061  # <CJK>
+0x3D69 0x6067  # <CJK>
+0x3D6A 0x6071  # <CJK>
+0x3D6B 0x607E  # <CJK>
+0x3D6C 0x607F  # <CJK>
+0x3D6D 0x6082  # <CJK>
+0x3D6E 0x6086  # <CJK>
+0x3D6F 0x6088  # <CJK>
+0x3D70 0x608A  # <CJK>
+0x3D71 0x608E  # <CJK>
+0x3D72 0x6091  # <CJK>
+0x3D73 0x6093  # <CJK>
+0x3D74 0x6095  # <CJK>
+0x3D75 0x6098  # <CJK>
+0x3D76 0x609D  # <CJK>
+0x3D77 0x609E  # <CJK>
+0x3D78 0x60A2  # <CJK>
+0x3D79 0x60A4  # <CJK>
+0x3D7A 0x60A5  # <CJK>
+0x3D7B 0x60A8  # <CJK>
+0x3D7C 0x60B0  # <CJK>
+0x3D7D 0x60B1  # <CJK>
+0x3D7E 0x60B7  # <CJK>
+0x3E21 0x60BB  # <CJK>
+0x3E22 0x60BE  # <CJK>
+0x3E23 0x60C2  # <CJK>
+0x3E24 0x60C4  # <CJK>
+0x3E25 0x60C8  # <CJK>
+0x3E26 0x60C9  # <CJK>
+0x3E27 0x60CA  # <CJK>
+0x3E28 0x60CB  # <CJK>
+0x3E29 0x60CE  # <CJK>
+0x3E2A 0x60CF  # <CJK>
+0x3E2B 0x60D4  # <CJK>
+0x3E2C 0x60D5  # <CJK>
+0x3E2D 0x60D9  # <CJK>
+0x3E2E 0x60DB  # <CJK>
+0x3E2F 0x60DD  # <CJK>
+0x3E30 0x60DE  # <CJK>
+0x3E31 0x60E2  # <CJK>
+0x3E32 0x60E5  # <CJK>
+0x3E33 0x60F2  # <CJK>
+0x3E34 0x60F5  # <CJK>
+0x3E35 0x60F8  # <CJK>
+0x3E36 0x60FC  # <CJK>
+0x3E37 0x60FD  # <CJK>
+0x3E38 0x6102  # <CJK>
+0x3E39 0x6107  # <CJK>
+0x3E3A 0x610A  # <CJK>
+0x3E3B 0x610C  # <CJK>
+0x3E3C 0x6110  # <CJK>
+0x3E3D 0x6111  # <CJK>
+0x3E3E 0x6112  # <CJK>
+0x3E3F 0x6113  # <CJK>
+0x3E40 0x6114  # <CJK>
+0x3E41 0x6116  # <CJK>
+0x3E42 0x6117  # <CJK>
+0x3E43 0x6119  # <CJK>
+0x3E44 0x611C  # <CJK>
+0x3E45 0x611E  # <CJK>
+0x3E46 0x6122  # <CJK>
+0x3E47 0x612A  # <CJK>
+0x3E48 0x612B  # <CJK>
+0x3E49 0x6130  # <CJK>
+0x3E4A 0x6131  # <CJK>
+0x3E4B 0x6135  # <CJK>
+0x3E4C 0x6136  # <CJK>
+0x3E4D 0x6137  # <CJK>
+0x3E4E 0x6139  # <CJK>
+0x3E4F 0x6141  # <CJK>
+0x3E50 0x6145  # <CJK>
+0x3E51 0x6146  # <CJK>
+0x3E52 0x6149  # <CJK>
+0x3E53 0x615E  # <CJK>
+0x3E54 0x6160  # <CJK>
+0x3E55 0x616C  # <CJK>
+0x3E56 0x6172  # <CJK>
+0x3E57 0x6178  # <CJK>
+0x3E58 0x617B  # <CJK>
+0x3E59 0x617C  # <CJK>
+0x3E5A 0x617F  # <CJK>
+0x3E5B 0x6180  # <CJK>
+0x3E5C 0x6181  # <CJK>
+0x3E5D 0x6183  # <CJK>
+0x3E5E 0x6184  # <CJK>
+0x3E5F 0x618B  # <CJK>
+0x3E60 0x618D  # <CJK>
+0x3E61 0x6192  # <CJK>
+0x3E62 0x6193  # <CJK>
+0x3E63 0x6197  # <CJK>
+0x3E64 0x6198  # <CJK>
+0x3E65 0x619C  # <CJK>
+0x3E66 0x619D  # <CJK>
+0x3E67 0x619F  # <CJK>
+0x3E68 0x61A0  # <CJK>
+0x3E69 0x61A5  # <CJK>
+0x3E6A 0x61A8  # <CJK>
+0x3E6B 0x61AA  # <CJK>
+0x3E6C 0x61AD  # <CJK>
+0x3E6D 0x61B8  # <CJK>
+0x3E6E 0x61B9  # <CJK>
+0x3E6F 0x61BC  # <CJK>
+0x3E70 0x61C0  # <CJK>
+0x3E71 0x61C1  # <CJK>
+0x3E72 0x61C2  # <CJK>
+0x3E73 0x61CE  # <CJK>
+0x3E74 0x61CF  # <CJK>
+0x3E75 0x61D5  # <CJK>
+0x3E76 0x61DC  # <CJK>
+0x3E77 0x61DD  # <CJK>
+0x3E78 0x61DE  # <CJK>
+0x3E79 0x61DF  # <CJK>
+0x3E7A 0x61E1  # <CJK>
+0x3E7B 0x61E2  # <CJK>
+0x3E7C 0x61E7  # <CJK>
+0x3E7D 0x61E9  # <CJK>
+0x3E7E 0x61E5  # <CJK>
+0x3F21 0x61EC  # <CJK>
+0x3F22 0x61ED  # <CJK>
+0x3F23 0x61EF  # <CJK>
+0x3F24 0x6201  # <CJK>
+0x3F25 0x6203  # <CJK>
+0x3F26 0x6204  # <CJK>
+0x3F27 0x6207  # <CJK>
+0x3F28 0x6213  # <CJK>
+0x3F29 0x6215  # <CJK>
+0x3F2A 0x621C  # <CJK>
+0x3F2B 0x6220  # <CJK>
+0x3F2C 0x6222  # <CJK>
+0x3F2D 0x6223  # <CJK>
+0x3F2E 0x6227  # <CJK>
+0x3F2F 0x6229  # <CJK>
+0x3F30 0x622B  # <CJK>
+0x3F31 0x6239  # <CJK>
+0x3F32 0x623D  # <CJK>
+0x3F33 0x6242  # <CJK>
+0x3F34 0x6243  # <CJK>
+0x3F35 0x6244  # <CJK>
+0x3F36 0x6246  # <CJK>
+0x3F37 0x624C  # <CJK>
+0x3F38 0x6250  # <CJK>
+0x3F39 0x6251  # <CJK>
+0x3F3A 0x6252  # <CJK>
+0x3F3B 0x6254  # <CJK>
+0x3F3C 0x6256  # <CJK>
+0x3F3D 0x625A  # <CJK>
+0x3F3E 0x625C  # <CJK>
+0x3F3F 0x6264  # <CJK>
+0x3F40 0x626D  # <CJK>
+0x3F41 0x626F  # <CJK>
+0x3F42 0x6273  # <CJK>
+0x3F43 0x627A  # <CJK>
+0x3F44 0x627D  # <CJK>
+0x3F45 0x628D  # <CJK>
+0x3F46 0x628E  # <CJK>
+0x3F47 0x628F  # <CJK>
+0x3F48 0x6290  # <CJK>
+0x3F49 0x62A6  # <CJK>
+0x3F4A 0x62A8  # <CJK>
+0x3F4B 0x62B3  # <CJK>
+0x3F4C 0x62B6  # <CJK>
+0x3F4D 0x62B7  # <CJK>
+0x3F4E 0x62BA  # <CJK>
+0x3F4F 0x62BE  # <CJK>
+0x3F50 0x62BF  # <CJK>
+0x3F51 0x62C4  # <CJK>
+0x3F52 0x62CE  # <CJK>
+0x3F53 0x62D5  # <CJK>
+0x3F54 0x62D6  # <CJK>
+0x3F55 0x62DA  # <CJK>
+0x3F56 0x62EA  # <CJK>
+0x3F57 0x62F2  # <CJK>
+0x3F58 0x62F4  # <CJK>
+0x3F59 0x62FC  # <CJK>
+0x3F5A 0x62FD  # <CJK>
+0x3F5B 0x6303  # <CJK>
+0x3F5C 0x6304  # <CJK>
+0x3F5D 0x630A  # <CJK>
+0x3F5E 0x630B  # <CJK>
+0x3F5F 0x630D  # <CJK>
+0x3F60 0x6310  # <CJK>
+0x3F61 0x6313  # <CJK>
+0x3F62 0x6316  # <CJK>
+0x3F63 0x6318  # <CJK>
+0x3F64 0x6329  # <CJK>
+0x3F65 0x632A  # <CJK>
+0x3F66 0x632D  # <CJK>
+0x3F67 0x6335  # <CJK>
+0x3F68 0x6336  # <CJK>
+0x3F69 0x6339  # <CJK>
+0x3F6A 0x633C  # <CJK>
+0x3F6B 0x6341  # <CJK>
+0x3F6C 0x6342  # <CJK>
+0x3F6D 0x6343  # <CJK>
+0x3F6E 0x6344  # <CJK>
+0x3F6F 0x6346  # <CJK>
+0x3F70 0x634A  # <CJK>
+0x3F71 0x634B  # <CJK>
+0x3F72 0x634E  # <CJK>
+0x3F73 0x6352  # <CJK>
+0x3F74 0x6353  # <CJK>
+0x3F75 0x6354  # <CJK>
+0x3F76 0x6358  # <CJK>
+0x3F77 0x635B  # <CJK>
+0x3F78 0x6365  # <CJK>
+0x3F79 0x6366  # <CJK>
+0x3F7A 0x636C  # <CJK>
+0x3F7B 0x636D  # <CJK>
+0x3F7C 0x6371  # <CJK>
+0x3F7D 0x6374  # <CJK>
+0x3F7E 0x6375  # <CJK>
+0x4021 0x6378  # <CJK>
+0x4022 0x637C  # <CJK>
+0x4023 0x637D  # <CJK>
+0x4024 0x637F  # <CJK>
+0x4025 0x6382  # <CJK>
+0x4026 0x6384  # <CJK>
+0x4027 0x6387  # <CJK>
+0x4028 0x638A  # <CJK>
+0x4029 0x6390  # <CJK>
+0x402A 0x6394  # <CJK>
+0x402B 0x6395  # <CJK>
+0x402C 0x6399  # <CJK>
+0x402D 0x639A  # <CJK>
+0x402E 0x639E  # <CJK>
+0x402F 0x63A4  # <CJK>
+0x4030 0x63A6  # <CJK>
+0x4031 0x63AD  # <CJK>
+0x4032 0x63AE  # <CJK>
+0x4033 0x63AF  # <CJK>
+0x4034 0x63BD  # <CJK>
+0x4035 0x63C1  # <CJK>
+0x4036 0x63C5  # <CJK>
+0x4037 0x63C8  # <CJK>
+0x4038 0x63CE  # <CJK>
+0x4039 0x63D1  # <CJK>
+0x403A 0x63D3  # <CJK>
+0x403B 0x63D4  # <CJK>
+0x403C 0x63D5  # <CJK>
+0x403D 0x63DC  # <CJK>
+0x403E 0x63E0  # <CJK>
+0x403F 0x63E5  # <CJK>
+0x4040 0x63EA  # <CJK>
+0x4041 0x63EC  # <CJK>
+0x4042 0x63F2  # <CJK>
+0x4043 0x63F3  # <CJK>
+0x4044 0x63F5  # <CJK>
+0x4045 0x63F8  # <CJK>
+0x4046 0x63F9  # <CJK>
+0x4047 0x6409  # <CJK>
+0x4048 0x640A  # <CJK>
+0x4049 0x6410  # <CJK>
+0x404A 0x6412  # <CJK>
+0x404B 0x6414  # <CJK>
+0x404C 0x6418  # <CJK>
+0x404D 0x641E  # <CJK>
+0x404E 0x6420  # <CJK>
+0x404F 0x6422  # <CJK>
+0x4050 0x6424  # <CJK>
+0x4051 0x6425  # <CJK>
+0x4052 0x6429  # <CJK>
+0x4053 0x642A  # <CJK>
+0x4054 0x642F  # <CJK>
+0x4055 0x6430  # <CJK>
+0x4056 0x6435  # <CJK>
+0x4057 0x643D  # <CJK>
+0x4058 0x643F  # <CJK>
+0x4059 0x644B  # <CJK>
+0x405A 0x644F  # <CJK>
+0x405B 0x6451  # <CJK>
+0x405C 0x6452  # <CJK>
+0x405D 0x6453  # <CJK>
+0x405E 0x6454  # <CJK>
+0x405F 0x645A  # <CJK>
+0x4060 0x645B  # <CJK>
+0x4061 0x645C  # <CJK>
+0x4062 0x645D  # <CJK>
+0x4063 0x645F  # <CJK>
+0x4064 0x6460  # <CJK>
+0x4065 0x6461  # <CJK>
+0x4066 0x6463  # <CJK>
+0x4067 0x646D  # <CJK>
+0x4068 0x6473  # <CJK>
+0x4069 0x6474  # <CJK>
+0x406A 0x647B  # <CJK>
+0x406B 0x647D  # <CJK>
+0x406C 0x6485  # <CJK>
+0x406D 0x6487  # <CJK>
+0x406E 0x648F  # <CJK>
+0x406F 0x6490  # <CJK>
+0x4070 0x6491  # <CJK>
+0x4071 0x6498  # <CJK>
+0x4072 0x6499  # <CJK>
+0x4073 0x649B  # <CJK>
+0x4074 0x649D  # <CJK>
+0x4075 0x649F  # <CJK>
+0x4076 0x64A1  # <CJK>
+0x4077 0x64A3  # <CJK>
+0x4078 0x64A6  # <CJK>
+0x4079 0x64A8  # <CJK>
+0x407A 0x64AC  # <CJK>
+0x407B 0x64B3  # <CJK>
+0x407C 0x64BD  # <CJK>
+0x407D 0x64BE  # <CJK>
+0x407E 0x64BF  # <CJK>
+0x4121 0x64C4  # <CJK>
+0x4122 0x64C9  # <CJK>
+0x4123 0x64CA  # <CJK>
+0x4124 0x64CB  # <CJK>
+0x4125 0x64CC  # <CJK>
+0x4126 0x64CE  # <CJK>
+0x4127 0x64D0  # <CJK>
+0x4128 0x64D1  # <CJK>
+0x4129 0x64D5  # <CJK>
+0x412A 0x64D7  # <CJK>
+0x412B 0x64E4  # <CJK>
+0x412C 0x64E5  # <CJK>
+0x412D 0x64E9  # <CJK>
+0x412E 0x64EA  # <CJK>
+0x412F 0x64ED  # <CJK>
+0x4130 0x64F0  # <CJK>
+0x4131 0x64F5  # <CJK>
+0x4132 0x64F7  # <CJK>
+0x4133 0x64FB  # <CJK>
+0x4134 0x64FF  # <CJK>
+0x4135 0x6501  # <CJK>
+0x4136 0x6504  # <CJK>
+0x4137 0x6508  # <CJK>
+0x4138 0x6509  # <CJK>
+0x4139 0x650A  # <CJK>
+0x413A 0x650F  # <CJK>
+0x413B 0x6513  # <CJK>
+0x413C 0x6514  # <CJK>
+0x413D 0x6516  # <CJK>
+0x413E 0x6519  # <CJK>
+0x413F 0x651B  # <CJK>
+0x4140 0x651E  # <CJK>
+0x4141 0x651F  # <CJK>
+0x4142 0x6522  # <CJK>
+0x4143 0x6526  # <CJK>
+0x4144 0x6529  # <CJK>
+0x4145 0x652E  # <CJK>
+0x4146 0x6531  # <CJK>
+0x4147 0x653A  # <CJK>
+0x4148 0x653C  # <CJK>
+0x4149 0x653D  # <CJK>
+0x414A 0x6543  # <CJK>
+0x414B 0x6547  # <CJK>
+0x414C 0x6549  # <CJK>
+0x414D 0x6550  # <CJK>
+0x414E 0x6552  # <CJK>
+0x414F 0x6554  # <CJK>
+0x4150 0x655F  # <CJK>
+0x4151 0x6560  # <CJK>
+0x4152 0x6567  # <CJK>
+0x4153 0x656B  # <CJK>
+0x4154 0x657A  # <CJK>
+0x4155 0x657D  # <CJK>
+0x4156 0x6581  # <CJK>
+0x4157 0x6585  # <CJK>
+0x4158 0x658A  # <CJK>
+0x4159 0x6592  # <CJK>
+0x415A 0x6595  # <CJK>
+0x415B 0x6598  # <CJK>
+0x415C 0x659D  # <CJK>
+0x415D 0x65A0  # <CJK>
+0x415E 0x65A3  # <CJK>
+0x415F 0x65A6  # <CJK>
+0x4160 0x65AE  # <CJK>
+0x4161 0x65B2  # <CJK>
+0x4162 0x65B3  # <CJK>
+0x4163 0x65B4  # <CJK>
+0x4164 0x65BF  # <CJK>
+0x4165 0x65C2  # <CJK>
+0x4166 0x65C8  # <CJK>
+0x4167 0x65C9  # <CJK>
+0x4168 0x65CE  # <CJK>
+0x4169 0x65D0  # <CJK>
+0x416A 0x65D4  # <CJK>
+0x416B 0x65D6  # <CJK>
+0x416C 0x65D8  # <CJK>
+0x416D 0x65DF  # <CJK>
+0x416E 0x65F0  # <CJK>
+0x416F 0x65F2  # <CJK>
+0x4170 0x65F4  # <CJK>
+0x4171 0x65F5  # <CJK>
+0x4172 0x65F9  # <CJK>
+0x4173 0x65FE  # <CJK>
+0x4174 0x65FF  # <CJK>
+0x4175 0x6600  # <CJK>
+0x4176 0x6604  # <CJK>
+0x4177 0x6608  # <CJK>
+0x4178 0x6609  # <CJK>
+0x4179 0x660D  # <CJK>
+0x417A 0x6611  # <CJK>
+0x417B 0x6612  # <CJK>
+0x417C 0x6615  # <CJK>
+0x417D 0x6616  # <CJK>
+0x417E 0x661D  # <CJK>
+0x4221 0x661E  # <CJK>
+0x4222 0x6621  # <CJK>
+0x4223 0x6622  # <CJK>
+0x4224 0x6623  # <CJK>
+0x4225 0x6624  # <CJK>
+0x4226 0x6626  # <CJK>
+0x4227 0x6629  # <CJK>
+0x4228 0x662A  # <CJK>
+0x4229 0x662B  # <CJK>
+0x422A 0x662C  # <CJK>
+0x422B 0x662E  # <CJK>
+0x422C 0x6630  # <CJK>
+0x422D 0x6631  # <CJK>
+0x422E 0x6633  # <CJK>
+0x422F 0x6639  # <CJK>
+0x4230 0x6637  # <CJK>
+0x4231 0x6640  # <CJK>
+0x4232 0x6645  # <CJK>
+0x4233 0x6646  # <CJK>
+0x4234 0x664A  # <CJK>
+0x4235 0x664C  # <CJK>
+0x4236 0x6651  # <CJK>
+0x4237 0x664E  # <CJK>
+0x4238 0x6657  # <CJK>
+0x4239 0x6658  # <CJK>
+0x423A 0x6659  # <CJK>
+0x423B 0x665B  # <CJK>
+0x423C 0x665C  # <CJK>
+0x423D 0x6660  # <CJK>
+0x423E 0x6661  # <CJK>
+0x423F 0x66FB  # <CJK>
+0x4240 0x666A  # <CJK>
+0x4241 0x666B  # <CJK>
+0x4242 0x666C  # <CJK>
+0x4243 0x667E  # <CJK>
+0x4244 0x6673  # <CJK>
+0x4245 0x6675  # <CJK>
+0x4246 0x667F  # <CJK>
+0x4247 0x6677  # <CJK>
+0x4248 0x6678  # <CJK>
+0x4249 0x6679  # <CJK>
+0x424A 0x667B  # <CJK>
+0x424B 0x6680  # <CJK>
+0x424C 0x667C  # <CJK>
+0x424D 0x668B  # <CJK>
+0x424E 0x668C  # <CJK>
+0x424F 0x668D  # <CJK>
+0x4250 0x6690  # <CJK>
+0x4251 0x6692  # <CJK>
+0x4252 0x6699  # <CJK>
+0x4253 0x669A  # <CJK>
+0x4254 0x669B  # <CJK>
+0x4255 0x669C  # <CJK>
+0x4256 0x669F  # <CJK>
+0x4257 0x66A0  # <CJK>
+0x4258 0x66A4  # <CJK>
+0x4259 0x66AD  # <CJK>
+0x425A 0x66B1  # <CJK>
+0x425B 0x66B2  # <CJK>
+0x425C 0x66B5  # <CJK>
+0x425D 0x66BB  # <CJK>
+0x425E 0x66BF  # <CJK>
+0x425F 0x66C0  # <CJK>
+0x4260 0x66C2  # <CJK>
+0x4261 0x66C3  # <CJK>
+0x4262 0x66C8  # <CJK>
+0x4263 0x66CC  # <CJK>
+0x4264 0x66CE  # <CJK>
+0x4265 0x66CF  # <CJK>
+0x4266 0x66D4  # <CJK>
+0x4267 0x66DB  # <CJK>
+0x4268 0x66DF  # <CJK>
+0x4269 0x66E8  # <CJK>
+0x426A 0x66EB  # <CJK>
+0x426B 0x66EC  # <CJK>
+0x426C 0x66EE  # <CJK>
+0x426D 0x66FA  # <CJK>
+0x426E 0x6705  # <CJK>
+0x426F 0x6707  # <CJK>
+0x4270 0x670E  # <CJK>
+0x4271 0x6713  # <CJK>
+0x4272 0x6719  # <CJK>
+0x4273 0x671C  # <CJK>
+0x4274 0x6720  # <CJK>
+0x4275 0x6722  # <CJK>
+0x4276 0x6733  # <CJK>
+0x4277 0x673E  # <CJK>
+0x4278 0x6745  # <CJK>
+0x4279 0x6747  # <CJK>
+0x427A 0x6748  # <CJK>
+0x427B 0x674C  # <CJK>
+0x427C 0x6754  # <CJK>
+0x427D 0x6755  # <CJK>
+0x427E 0x675D  # <CJK>
+0x4321 0x6766  # <CJK>
+0x4322 0x676C  # <CJK>
+0x4323 0x676E  # <CJK>
+0x4324 0x6774  # <CJK>
+0x4325 0x6776  # <CJK>
+0x4326 0x677B  # <CJK>
+0x4327 0x6781  # <CJK>
+0x4328 0x6784  # <CJK>
+0x4329 0x678E  # <CJK>
+0x432A 0x678F  # <CJK>
+0x432B 0x6791  # <CJK>
+0x432C 0x6793  # <CJK>
+0x432D 0x6796  # <CJK>
+0x432E 0x6798  # <CJK>
+0x432F 0x6799  # <CJK>
+0x4330 0x679B  # <CJK>
+0x4331 0x67B0  # <CJK>
+0x4332 0x67B1  # <CJK>
+0x4333 0x67B2  # <CJK>
+0x4334 0x67B5  # <CJK>
+0x4335 0x67BB  # <CJK>
+0x4336 0x67BC  # <CJK>
+0x4337 0x67BD  # <CJK>
+0x4338 0x67F9  # <CJK>
+0x4339 0x67C0  # <CJK>
+0x433A 0x67C2  # <CJK>
+0x433B 0x67C3  # <CJK>
+0x433C 0x67C5  # <CJK>
+0x433D 0x67C8  # <CJK>
+0x433E 0x67C9  # <CJK>
+0x433F 0x67D2  # <CJK>
+0x4340 0x67D7  # <CJK>
+0x4341 0x67D9  # <CJK>
+0x4342 0x67DC  # <CJK>
+0x4343 0x67E1  # <CJK>
+0x4344 0x67E6  # <CJK>
+0x4345 0x67F0  # <CJK>
+0x4346 0x67F2  # <CJK>
+0x4347 0x67F6  # <CJK>
+0x4348 0x67F7  # <CJK>
+0x4349 0x6852  # <CJK>
+0x434A 0x6814  # <CJK>
+0x434B 0x6819  # <CJK>
+0x434C 0x681D  # <CJK>
+0x434D 0x681F  # <CJK>
+0x434E 0x6828  # <CJK>
+0x434F 0x6827  # <CJK>
+0x4350 0x682C  # <CJK>
+0x4351 0x682D  # <CJK>
+0x4352 0x682F  # <CJK>
+0x4353 0x6830  # <CJK>
+0x4354 0x6831  # <CJK>
+0x4355 0x6833  # <CJK>
+0x4356 0x683B  # <CJK>
+0x4357 0x683F  # <CJK>
+0x4358 0x6844  # <CJK>
+0x4359 0x6845  # <CJK>
+0x435A 0x684A  # <CJK>
+0x435B 0x684C  # <CJK>
+0x435C 0x6855  # <CJK>
+0x435D 0x6857  # <CJK>
+0x435E 0x6858  # <CJK>
+0x435F 0x685B  # <CJK>
+0x4360 0x686B  # <CJK>
+0x4361 0x686E  # <CJK>
+0x4362 0x686F  # <CJK>
+0x4363 0x6870  # <CJK>
+0x4364 0x6871  # <CJK>
+0x4365 0x6872  # <CJK>
+0x4366 0x6875  # <CJK>
+0x4367 0x6879  # <CJK>
+0x4368 0x687A  # <CJK>
+0x4369 0x687B  # <CJK>
+0x436A 0x687C  # <CJK>
+0x436B 0x6882  # <CJK>
+0x436C 0x6884  # <CJK>
+0x436D 0x6886  # <CJK>
+0x436E 0x6888  # <CJK>
+0x436F 0x6896  # <CJK>
+0x4370 0x6898  # <CJK>
+0x4371 0x689A  # <CJK>
+0x4372 0x689C  # <CJK>
+0x4373 0x68A1  # <CJK>
+0x4374 0x68A3  # <CJK>
+0x4375 0x68A5  # <CJK>
+0x4376 0x68A9  # <CJK>
+0x4377 0x68AA  # <CJK>
+0x4378 0x68AE  # <CJK>
+0x4379 0x68B2  # <CJK>
+0x437A 0x68BB  # <CJK>
+0x437B 0x68C5  # <CJK>
+0x437C 0x68C8  # <CJK>
+0x437D 0x68CC  # <CJK>
+0x437E 0x68CF  # <CJK>
+0x4421 0x68D0  # <CJK>
+0x4422 0x68D1  # <CJK>
+0x4423 0x68D3  # <CJK>
+0x4424 0x68D6  # <CJK>
+0x4425 0x68D9  # <CJK>
+0x4426 0x68DC  # <CJK>
+0x4427 0x68DD  # <CJK>
+0x4428 0x68E5  # <CJK>
+0x4429 0x68E8  # <CJK>
+0x442A 0x68EA  # <CJK>
+0x442B 0x68EB  # <CJK>
+0x442C 0x68EC  # <CJK>
+0x442D 0x68ED  # <CJK>
+0x442E 0x68F0  # <CJK>
+0x442F 0x68F1  # <CJK>
+0x4430 0x68F5  # <CJK>
+0x4431 0x68F6  # <CJK>
+0x4432 0x68FB  # <CJK>
+0x4433 0x68FC  # <CJK>
+0x4434 0x68FD  # <CJK>
+0x4435 0x6906  # <CJK>
+0x4436 0x6909  # <CJK>
+0x4437 0x690A  # <CJK>
+0x4438 0x6910  # <CJK>
+0x4439 0x6911  # <CJK>
+0x443A 0x6913  # <CJK>
+0x443B 0x6916  # <CJK>
+0x443C 0x6917  # <CJK>
+0x443D 0x6931  # <CJK>
+0x443E 0x6933  # <CJK>
+0x443F 0x6935  # <CJK>
+0x4440 0x6938  # <CJK>
+0x4441 0x693B  # <CJK>
+0x4442 0x6942  # <CJK>
+0x4443 0x6945  # <CJK>
+0x4444 0x6949  # <CJK>
+0x4445 0x694E  # <CJK>
+0x4446 0x6957  # <CJK>
+0x4447 0x695B  # <CJK>
+0x4448 0x6963  # <CJK>
+0x4449 0x6964  # <CJK>
+0x444A 0x6965  # <CJK>
+0x444B 0x6966  # <CJK>
+0x444C 0x6968  # <CJK>
+0x444D 0x6969  # <CJK>
+0x444E 0x696C  # <CJK>
+0x444F 0x6970  # <CJK>
+0x4450 0x6971  # <CJK>
+0x4451 0x6972  # <CJK>
+0x4452 0x697A  # <CJK>
+0x4453 0x697B  # <CJK>
+0x4454 0x697F  # <CJK>
+0x4455 0x6980  # <CJK>
+0x4456 0x698D  # <CJK>
+0x4457 0x6992  # <CJK>
+0x4458 0x6996  # <CJK>
+0x4459 0x6998  # <CJK>
+0x445A 0x69A1  # <CJK>
+0x445B 0x69A5  # <CJK>
+0x445C 0x69A6  # <CJK>
+0x445D 0x69A8  # <CJK>
+0x445E 0x69AB  # <CJK>
+0x445F 0x69AD  # <CJK>
+0x4460 0x69AF  # <CJK>
+0x4461 0x69B7  # <CJK>
+0x4462 0x69B8  # <CJK>
+0x4463 0x69BA  # <CJK>
+0x4464 0x69BC  # <CJK>
+0x4465 0x69C5  # <CJK>
+0x4466 0x69C8  # <CJK>
+0x4467 0x69D1  # <CJK>
+0x4468 0x69D6  # <CJK>
+0x4469 0x69D7  # <CJK>
+0x446A 0x69E2  # <CJK>
+0x446B 0x69E5  # <CJK>
+0x446C 0x69EE  # <CJK>
+0x446D 0x69EF  # <CJK>
+0x446E 0x69F1  # <CJK>
+0x446F 0x69F3  # <CJK>
+0x4470 0x69F5  # <CJK>
+0x4471 0x69FE  # <CJK>
+0x4472 0x6A00  # <CJK>
+0x4473 0x6A01  # <CJK>
+0x4474 0x6A03  # <CJK>
+0x4475 0x6A0F  # <CJK>
+0x4476 0x6A11  # <CJK>
+0x4477 0x6A15  # <CJK>
+0x4478 0x6A1A  # <CJK>
+0x4479 0x6A1D  # <CJK>
+0x447A 0x6A20  # <CJK>
+0x447B 0x6A24  # <CJK>
+0x447C 0x6A28  # <CJK>
+0x447D 0x6A30  # <CJK>
+0x447E 0x6A32  # <CJK>
+0x4521 0x6A34  # <CJK>
+0x4522 0x6A37  # <CJK>
+0x4523 0x6A3B  # <CJK>
+0x4524 0x6A3E  # <CJK>
+0x4525 0x6A3F  # <CJK>
+0x4526 0x6A45  # <CJK>
+0x4527 0x6A46  # <CJK>
+0x4528 0x6A49  # <CJK>
+0x4529 0x6A4A  # <CJK>
+0x452A 0x6A4E  # <CJK>
+0x452B 0x6A50  # <CJK>
+0x452C 0x6A51  # <CJK>
+0x452D 0x6A52  # <CJK>
+0x452E 0x6A55  # <CJK>
+0x452F 0x6A56  # <CJK>
+0x4530 0x6A5B  # <CJK>
+0x4531 0x6A64  # <CJK>
+0x4532 0x6A67  # <CJK>
+0x4533 0x6A6A  # <CJK>
+0x4534 0x6A71  # <CJK>
+0x4535 0x6A73  # <CJK>
+0x4536 0x6A7E  # <CJK>
+0x4537 0x6A81  # <CJK>
+0x4538 0x6A83  # <CJK>
+0x4539 0x6A86  # <CJK>
+0x453A 0x6A87  # <CJK>
+0x453B 0x6A89  # <CJK>
+0x453C 0x6A8B  # <CJK>
+0x453D 0x6A91  # <CJK>
+0x453E 0x6A9B  # <CJK>
+0x453F 0x6A9D  # <CJK>
+0x4540 0x6A9E  # <CJK>
+0x4541 0x6A9F  # <CJK>
+0x4542 0x6AA5  # <CJK>
+0x4543 0x6AAB  # <CJK>
+0x4544 0x6AAF  # <CJK>
+0x4545 0x6AB0  # <CJK>
+0x4546 0x6AB1  # <CJK>
+0x4547 0x6AB4  # <CJK>
+0x4548 0x6ABD  # <CJK>
+0x4549 0x6ABE  # <CJK>
+0x454A 0x6ABF  # <CJK>
+0x454B 0x6AC6  # <CJK>
+0x454C 0x6AC9  # <CJK>
+0x454D 0x6AC8  # <CJK>
+0x454E 0x6ACC  # <CJK>
+0x454F 0x6AD0  # <CJK>
+0x4550 0x6AD4  # <CJK>
+0x4551 0x6AD5  # <CJK>
+0x4552 0x6AD6  # <CJK>
+0x4553 0x6ADC  # <CJK>
+0x4554 0x6ADD  # <CJK>
+0x4555 0x6AE4  # <CJK>
+0x4556 0x6AE7  # <CJK>
+0x4557 0x6AEC  # <CJK>
+0x4558 0x6AF0  # <CJK>
+0x4559 0x6AF1  # <CJK>
+0x455A 0x6AF2  # <CJK>
+0x455B 0x6AFC  # <CJK>
+0x455C 0x6AFD  # <CJK>
+0x455D 0x6B02  # <CJK>
+0x455E 0x6B03  # <CJK>
+0x455F 0x6B06  # <CJK>
+0x4560 0x6B07  # <CJK>
+0x4561 0x6B09  # <CJK>
+0x4562 0x6B0F  # <CJK>
+0x4563 0x6B10  # <CJK>
+0x4564 0x6B11  # <CJK>
+0x4565 0x6B17  # <CJK>
+0x4566 0x6B1B  # <CJK>
+0x4567 0x6B1E  # <CJK>
+0x4568 0x6B24  # <CJK>
+0x4569 0x6B28  # <CJK>
+0x456A 0x6B2B  # <CJK>
+0x456B 0x6B2C  # <CJK>
+0x456C 0x6B2F  # <CJK>
+0x456D 0x6B35  # <CJK>
+0x456E 0x6B36  # <CJK>
+0x456F 0x6B3B  # <CJK>
+0x4570 0x6B3F  # <CJK>
+0x4571 0x6B46  # <CJK>
+0x4572 0x6B4A  # <CJK>
+0x4573 0x6B4D  # <CJK>
+0x4574 0x6B52  # <CJK>
+0x4575 0x6B56  # <CJK>
+0x4576 0x6B58  # <CJK>
+0x4577 0x6B5D  # <CJK>
+0x4578 0x6B60  # <CJK>
+0x4579 0x6B67  # <CJK>
+0x457A 0x6B6B  # <CJK>
+0x457B 0x6B6E  # <CJK>
+0x457C 0x6B70  # <CJK>
+0x457D 0x6B75  # <CJK>
+0x457E 0x6B7D  # <CJK>
+0x4621 0x6B7E  # <CJK>
+0x4622 0x6B82  # <CJK>
+0x4623 0x6B85  # <CJK>
+0x4624 0x6B97  # <CJK>
+0x4625 0x6B9B  # <CJK>
+0x4626 0x6B9F  # <CJK>
+0x4627 0x6BA0  # <CJK>
+0x4628 0x6BA2  # <CJK>
+0x4629 0x6BA3  # <CJK>
+0x462A 0x6BA8  # <CJK>
+0x462B 0x6BA9  # <CJK>
+0x462C 0x6BAC  # <CJK>
+0x462D 0x6BAD  # <CJK>
+0x462E 0x6BAE  # <CJK>
+0x462F 0x6BB0  # <CJK>
+0x4630 0x6BB8  # <CJK>
+0x4631 0x6BB9  # <CJK>
+0x4632 0x6BBD  # <CJK>
+0x4633 0x6BBE  # <CJK>
+0x4634 0x6BC3  # <CJK>
+0x4635 0x6BC4  # <CJK>
+0x4636 0x6BC9  # <CJK>
+0x4637 0x6BCC  # <CJK>
+0x4638 0x6BD6  # <CJK>
+0x4639 0x6BDA  # <CJK>
+0x463A 0x6BE1  # <CJK>
+0x463B 0x6BE3  # <CJK>
+0x463C 0x6BE6  # <CJK>
+0x463D 0x6BE7  # <CJK>
+0x463E 0x6BEE  # <CJK>
+0x463F 0x6BF1  # <CJK>
+0x4640 0x6BF7  # <CJK>
+0x4641 0x6BF9  # <CJK>
+0x4642 0x6BFF  # <CJK>
+0x4643 0x6C02  # <CJK>
+0x4644 0x6C04  # <CJK>
+0x4645 0x6C05  # <CJK>
+0x4646 0x6C09  # <CJK>
+0x4647 0x6C0D  # <CJK>
+0x4648 0x6C0E  # <CJK>
+0x4649 0x6C10  # <CJK>
+0x464A 0x6C12  # <CJK>
+0x464B 0x6C19  # <CJK>
+0x464C 0x6C1F  # <CJK>
+0x464D 0x6C26  # <CJK>
+0x464E 0x6C27  # <CJK>
+0x464F 0x6C28  # <CJK>
+0x4650 0x6C2C  # <CJK>
+0x4651 0x6C2E  # <CJK>
+0x4652 0x6C33  # <CJK>
+0x4653 0x6C35  # <CJK>
+0x4654 0x6C36  # <CJK>
+0x4655 0x6C3A  # <CJK>
+0x4656 0x6C3B  # <CJK>
+0x4657 0x6C3F  # <CJK>
+0x4658 0x6C4A  # <CJK>
+0x4659 0x6C4B  # <CJK>
+0x465A 0x6C4D  # <CJK>
+0x465B 0x6C4F  # <CJK>
+0x465C 0x6C52  # <CJK>
+0x465D 0x6C54  # <CJK>
+0x465E 0x6C59  # <CJK>
+0x465F 0x6C5B  # <CJK>
+0x4660 0x6C5C  # <CJK>
+0x4661 0x6C6B  # <CJK>
+0x4662 0x6C6D  # <CJK>
+0x4663 0x6C6F  # <CJK>
+0x4664 0x6C74  # <CJK>
+0x4665 0x6C76  # <CJK>
+0x4666 0x6C78  # <CJK>
+0x4667 0x6C79  # <CJK>
+0x4668 0x6C7B  # <CJK>
+0x4669 0x6C85  # <CJK>
+0x466A 0x6C86  # <CJK>
+0x466B 0x6C87  # <CJK>
+0x466C 0x6C89  # <CJK>
+0x466D 0x6C94  # <CJK>
+0x466E 0x6C95  # <CJK>
+0x466F 0x6C97  # <CJK>
+0x4670 0x6C98  # <CJK>
+0x4671 0x6C9C  # <CJK>
+0x4672 0x6C9F  # <CJK>
+0x4673 0x6CB0  # <CJK>
+0x4674 0x6CB2  # <CJK>
+0x4675 0x6CB4  # <CJK>
+0x4676 0x6CC2  # <CJK>
+0x4677 0x6CC6  # <CJK>
+0x4678 0x6CCD  # <CJK>
+0x4679 0x6CCF  # <CJK>
+0x467A 0x6CD0  # <CJK>
+0x467B 0x6CD1  # <CJK>
+0x467C 0x6CD2  # <CJK>
+0x467D 0x6CD4  # <CJK>
+0x467E 0x6CD6  # <CJK>
+0x4721 0x6CDA  # <CJK>
+0x4722 0x6CDC  # <CJK>
+0x4723 0x6CE0  # <CJK>
+0x4724 0x6CE7  # <CJK>
+0x4725 0x6CE9  # <CJK>
+0x4726 0x6CEB  # <CJK>
+0x4727 0x6CEC  # <CJK>
+0x4728 0x6CEE  # <CJK>
+0x4729 0x6CF2  # <CJK>
+0x472A 0x6CF4  # <CJK>
+0x472B 0x6D04  # <CJK>
+0x472C 0x6D07  # <CJK>
+0x472D 0x6D0A  # <CJK>
+0x472E 0x6D0E  # <CJK>
+0x472F 0x6D0F  # <CJK>
+0x4730 0x6D11  # <CJK>
+0x4731 0x6D13  # <CJK>
+0x4732 0x6D1A  # <CJK>
+0x4733 0x6D26  # <CJK>
+0x4734 0x6D27  # <CJK>
+0x4735 0x6D28  # <CJK>
+0x4736 0x6C67  # <CJK>
+0x4737 0x6D2E  # <CJK>
+0x4738 0x6D2F  # <CJK>
+0x4739 0x6D31  # <CJK>
+0x473A 0x6D39  # <CJK>
+0x473B 0x6D3C  # <CJK>
+0x473C 0x6D3F  # <CJK>
+0x473D 0x6D57  # <CJK>
+0x473E 0x6D5E  # <CJK>
+0x473F 0x6D5F  # <CJK>
+0x4740 0x6D61  # <CJK>
+0x4741 0x6D65  # <CJK>
+0x4742 0x6D67  # <CJK>
+0x4743 0x6D6F  # <CJK>
+0x4744 0x6D70  # <CJK>
+0x4745 0x6D7C  # <CJK>
+0x4746 0x6D82  # <CJK>
+0x4747 0x6D87  # <CJK>
+0x4748 0x6D91  # <CJK>
+0x4749 0x6D92  # <CJK>
+0x474A 0x6D94  # <CJK>
+0x474B 0x6D96  # <CJK>
+0x474C 0x6D97  # <CJK>
+0x474D 0x6D98  # <CJK>
+0x474E 0x6DAA  # <CJK>
+0x474F 0x6DAC  # <CJK>
+0x4750 0x6DB4  # <CJK>
+0x4751 0x6DB7  # <CJK>
+0x4752 0x6DB9  # <CJK>
+0x4753 0x6DBD  # <CJK>
+0x4754 0x6DBF  # <CJK>
+0x4755 0x6DC4  # <CJK>
+0x4756 0x6DC8  # <CJK>
+0x4757 0x6DCA  # <CJK>
+0x4758 0x6DCE  # <CJK>
+0x4759 0x6DCF  # <CJK>
+0x475A 0x6DD6  # <CJK>
+0x475B 0x6DDB  # <CJK>
+0x475C 0x6DDD  # <CJK>
+0x475D 0x6DDF  # <CJK>
+0x475E 0x6DE0  # <CJK>
+0x475F 0x6DE2  # <CJK>
+0x4760 0x6DE5  # <CJK>
+0x4761 0x6DE9  # <CJK>
+0x4762 0x6DEF  # <CJK>
+0x4763 0x6DF0  # <CJK>
+0x4764 0x6DF4  # <CJK>
+0x4765 0x6DF6  # <CJK>
+0x4766 0x6DFC  # <CJK>
+0x4767 0x6E00  # <CJK>
+0x4768 0x6E04  # <CJK>
+0x4769 0x6E1E  # <CJK>
+0x476A 0x6E22  # <CJK>
+0x476B 0x6E27  # <CJK>
+0x476C 0x6E32  # <CJK>
+0x476D 0x6E36  # <CJK>
+0x476E 0x6E39  # <CJK>
+0x476F 0x6E3B  # <CJK>
+0x4770 0x6E3C  # <CJK>
+0x4771 0x6E44  # <CJK>
+0x4772 0x6E45  # <CJK>
+0x4773 0x6E48  # <CJK>
+0x4774 0x6E49  # <CJK>
+0x4775 0x6E4B  # <CJK>
+0x4776 0x6E4F  # <CJK>
+0x4777 0x6E51  # <CJK>
+0x4778 0x6E52  # <CJK>
+0x4779 0x6E53  # <CJK>
+0x477A 0x6E54  # <CJK>
+0x477B 0x6E57  # <CJK>
+0x477C 0x6E5C  # <CJK>
+0x477D 0x6E5D  # <CJK>
+0x477E 0x6E5E  # <CJK>
+0x4821 0x6E62  # <CJK>
+0x4822 0x6E63  # <CJK>
+0x4823 0x6E68  # <CJK>
+0x4824 0x6E73  # <CJK>
+0x4825 0x6E7B  # <CJK>
+0x4826 0x6E7D  # <CJK>
+0x4827 0x6E8D  # <CJK>
+0x4828 0x6E93  # <CJK>
+0x4829 0x6E99  # <CJK>
+0x482A 0x6EA0  # <CJK>
+0x482B 0x6EA7  # <CJK>
+0x482C 0x6EAD  # <CJK>
+0x482D 0x6EAE  # <CJK>
+0x482E 0x6EB1  # <CJK>
+0x482F 0x6EB3  # <CJK>
+0x4830 0x6EBB  # <CJK>
+0x4831 0x6EBF  # <CJK>
+0x4832 0x6EC0  # <CJK>
+0x4833 0x6EC1  # <CJK>
+0x4834 0x6EC3  # <CJK>
+0x4835 0x6EC7  # <CJK>
+0x4836 0x6EC8  # <CJK>
+0x4837 0x6ECA  # <CJK>
+0x4838 0x6ECD  # <CJK>
+0x4839 0x6ECE  # <CJK>
+0x483A 0x6ECF  # <CJK>
+0x483B 0x6EEB  # <CJK>
+0x483C 0x6EED  # <CJK>
+0x483D 0x6EEE  # <CJK>
+0x483E 0x6EF9  # <CJK>
+0x483F 0x6EFB  # <CJK>
+0x4840 0x6EFD  # <CJK>
+0x4841 0x6F04  # <CJK>
+0x4842 0x6F08  # <CJK>
+0x4843 0x6F0A  # <CJK>
+0x4844 0x6F0C  # <CJK>
+0x4845 0x6F0D  # <CJK>
+0x4846 0x6F16  # <CJK>
+0x4847 0x6F18  # <CJK>
+0x4848 0x6F1A  # <CJK>
+0x4849 0x6F1B  # <CJK>
+0x484A 0x6F26  # <CJK>
+0x484B 0x6F29  # <CJK>
+0x484C 0x6F2A  # <CJK>
+0x484D 0x6F2F  # <CJK>
+0x484E 0x6F30  # <CJK>
+0x484F 0x6F33  # <CJK>
+0x4850 0x6F36  # <CJK>
+0x4851 0x6F3B  # <CJK>
+0x4852 0x6F3C  # <CJK>
+0x4853 0x6F2D  # <CJK>
+0x4854 0x6F4F  # <CJK>
+0x4855 0x6F51  # <CJK>
+0x4856 0x6F52  # <CJK>
+0x4857 0x6F53  # <CJK>
+0x4858 0x6F57  # <CJK>
+0x4859 0x6F59  # <CJK>
+0x485A 0x6F5A  # <CJK>
+0x485B 0x6F5D  # <CJK>
+0x485C 0x6F5E  # <CJK>
+0x485D 0x6F61  # <CJK>
+0x485E 0x6F62  # <CJK>
+0x485F 0x6F68  # <CJK>
+0x4860 0x6F6C  # <CJK>
+0x4861 0x6F7D  # <CJK>
+0x4862 0x6F7E  # <CJK>
+0x4863 0x6F83  # <CJK>
+0x4864 0x6F87  # <CJK>
+0x4865 0x6F88  # <CJK>
+0x4866 0x6F8B  # <CJK>
+0x4867 0x6F8C  # <CJK>
+0x4868 0x6F8D  # <CJK>
+0x4869 0x6F90  # <CJK>
+0x486A 0x6F92  # <CJK>
+0x486B 0x6F93  # <CJK>
+0x486C 0x6F94  # <CJK>
+0x486D 0x6F96  # <CJK>
+0x486E 0x6F9A  # <CJK>
+0x486F 0x6F9F  # <CJK>
+0x4870 0x6FA0  # <CJK>
+0x4871 0x6FA5  # <CJK>
+0x4872 0x6FA6  # <CJK>
+0x4873 0x6FA7  # <CJK>
+0x4874 0x6FA8  # <CJK>
+0x4875 0x6FAE  # <CJK>
+0x4876 0x6FAF  # <CJK>
+0x4877 0x6FB0  # <CJK>
+0x4878 0x6FB5  # <CJK>
+0x4879 0x6FB6  # <CJK>
+0x487A 0x6FBC  # <CJK>
+0x487B 0x6FC5  # <CJK>
+0x487C 0x6FC7  # <CJK>
+0x487D 0x6FC8  # <CJK>
+0x487E 0x6FCA  # <CJK>
+0x4921 0x6FDA  # <CJK>
+0x4922 0x6FDE  # <CJK>
+0x4923 0x6FE8  # <CJK>
+0x4924 0x6FE9  # <CJK>
+0x4925 0x6FF0  # <CJK>
+0x4926 0x6FF5  # <CJK>
+0x4927 0x6FF9  # <CJK>
+0x4928 0x6FFC  # <CJK>
+0x4929 0x6FFD  # <CJK>
+0x492A 0x7000  # <CJK>
+0x492B 0x7005  # <CJK>
+0x492C 0x7006  # <CJK>
+0x492D 0x7007  # <CJK>
+0x492E 0x700D  # <CJK>
+0x492F 0x7017  # <CJK>
+0x4930 0x7020  # <CJK>
+0x4931 0x7023  # <CJK>
+0x4932 0x702F  # <CJK>
+0x4933 0x7034  # <CJK>
+0x4934 0x7037  # <CJK>
+0x4935 0x7039  # <CJK>
+0x4936 0x703C  # <CJK>
+0x4937 0x7043  # <CJK>
+0x4938 0x7044  # <CJK>
+0x4939 0x7048  # <CJK>
+0x493A 0x7049  # <CJK>
+0x493B 0x704A  # <CJK>
+0x493C 0x704B  # <CJK>
+0x493D 0x7054  # <CJK>
+0x493E 0x7055  # <CJK>
+0x493F 0x705D  # <CJK>
+0x4940 0x705E  # <CJK>
+0x4941 0x704E  # <CJK>
+0x4942 0x7064  # <CJK>
+0x4943 0x7065  # <CJK>
+0x4944 0x706C  # <CJK>
+0x4945 0x706E  # <CJK>
+0x4946 0x7075  # <CJK>
+0x4947 0x7076  # <CJK>
+0x4948 0x707E  # <CJK>
+0x4949 0x7081  # <CJK>
+0x494A 0x7085  # <CJK>
+0x494B 0x7086  # <CJK>
+0x494C 0x7094  # <CJK>
+0x494D 0x7095  # <CJK>
+0x494E 0x7096  # <CJK>
+0x494F 0x7097  # <CJK>
+0x4950 0x7098  # <CJK>
+0x4951 0x709B  # <CJK>
+0x4952 0x70A4  # <CJK>
+0x4953 0x70AB  # <CJK>
+0x4954 0x70B0  # <CJK>
+0x4955 0x70B1  # <CJK>
+0x4956 0x70B4  # <CJK>
+0x4957 0x70B7  # <CJK>
+0x4958 0x70CA  # <CJK>
+0x4959 0x70D1  # <CJK>
+0x495A 0x70D3  # <CJK>
+0x495B 0x70D4  # <CJK>
+0x495C 0x70D5  # <CJK>
+0x495D 0x70D6  # <CJK>
+0x495E 0x70D8  # <CJK>
+0x495F 0x70DC  # <CJK>
+0x4960 0x70E4  # <CJK>
+0x4961 0x70FA  # <CJK>
+0x4962 0x7103  # <CJK>
+0x4963 0x7104  # <CJK>
+0x4964 0x7105  # <CJK>
+0x4965 0x7106  # <CJK>
+0x4966 0x7107  # <CJK>
+0x4967 0x710B  # <CJK>
+0x4968 0x710C  # <CJK>
+0x4969 0x710F  # <CJK>
+0x496A 0x711E  # <CJK>
+0x496B 0x7120  # <CJK>
+0x496C 0x712B  # <CJK>
+0x496D 0x712D  # <CJK>
+0x496E 0x712F  # <CJK>
+0x496F 0x7130  # <CJK>
+0x4970 0x7131  # <CJK>
+0x4971 0x7138  # <CJK>
+0x4972 0x7141  # <CJK>
+0x4973 0x7145  # <CJK>
+0x4974 0x7146  # <CJK>
+0x4975 0x7147  # <CJK>
+0x4976 0x714A  # <CJK>
+0x4977 0x714B  # <CJK>
+0x4978 0x7150  # <CJK>
+0x4979 0x7152  # <CJK>
+0x497A 0x7157  # <CJK>
+0x497B 0x715A  # <CJK>
+0x497C 0x715C  # <CJK>
+0x497D 0x715E  # <CJK>
+0x497E 0x7160  # <CJK>
+0x4A21 0x7168  # <CJK>
+0x4A22 0x7179  # <CJK>
+0x4A23 0x7180  # <CJK>
+0x4A24 0x7185  # <CJK>
+0x4A25 0x7187  # <CJK>
+0x4A26 0x718C  # <CJK>
+0x4A27 0x7192  # <CJK>
+0x4A28 0x719A  # <CJK>
+0x4A29 0x719B  # <CJK>
+0x4A2A 0x71A0  # <CJK>
+0x4A2B 0x71A2  # <CJK>
+0x4A2C 0x71AF  # <CJK>
+0x4A2D 0x71B0  # <CJK>
+0x4A2E 0x71B2  # <CJK>
+0x4A2F 0x71B3  # <CJK>
+0x4A30 0x71BA  # <CJK>
+0x4A31 0x71BF  # <CJK>
+0x4A32 0x71C0  # <CJK>
+0x4A33 0x71C1  # <CJK>
+0x4A34 0x71C4  # <CJK>
+0x4A35 0x71CB  # <CJK>
+0x4A36 0x71CC  # <CJK>
+0x4A37 0x71D3  # <CJK>
+0x4A38 0x71D6  # <CJK>
+0x4A39 0x71D9  # <CJK>
+0x4A3A 0x71DA  # <CJK>
+0x4A3B 0x71DC  # <CJK>
+0x4A3C 0x71F8  # <CJK>
+0x4A3D 0x71FE  # <CJK>
+0x4A3E 0x7200  # <CJK>
+0x4A3F 0x7207  # <CJK>
+0x4A40 0x7208  # <CJK>
+0x4A41 0x7209  # <CJK>
+0x4A42 0x7213  # <CJK>
+0x4A43 0x7217  # <CJK>
+0x4A44 0x721A  # <CJK>
+0x4A45 0x721D  # <CJK>
+0x4A46 0x721F  # <CJK>
+0x4A47 0x7224  # <CJK>
+0x4A48 0x722B  # <CJK>
+0x4A49 0x722F  # <CJK>
+0x4A4A 0x7234  # <CJK>
+0x4A4B 0x7238  # <CJK>
+0x4A4C 0x7239  # <CJK>
+0x4A4D 0x7241  # <CJK>
+0x4A4E 0x7242  # <CJK>
+0x4A4F 0x7243  # <CJK>
+0x4A50 0x7245  # <CJK>
+0x4A51 0x724E  # <CJK>
+0x4A52 0x724F  # <CJK>
+0x4A53 0x7250  # <CJK>
+0x4A54 0x7253  # <CJK>
+0x4A55 0x7255  # <CJK>
+0x4A56 0x7256  # <CJK>
+0x4A57 0x725A  # <CJK>
+0x4A58 0x725C  # <CJK>
+0x4A59 0x725E  # <CJK>
+0x4A5A 0x7260  # <CJK>
+0x4A5B 0x7263  # <CJK>
+0x4A5C 0x7268  # <CJK>
+0x4A5D 0x726B  # <CJK>
+0x4A5E 0x726E  # <CJK>
+0x4A5F 0x726F  # <CJK>
+0x4A60 0x7271  # <CJK>
+0x4A61 0x7277  # <CJK>
+0x4A62 0x7278  # <CJK>
+0x4A63 0x727B  # <CJK>
+0x4A64 0x727C  # <CJK>
+0x4A65 0x727F  # <CJK>
+0x4A66 0x7284  # <CJK>
+0x4A67 0x7289  # <CJK>
+0x4A68 0x728D  # <CJK>
+0x4A69 0x728E  # <CJK>
+0x4A6A 0x7293  # <CJK>
+0x4A6B 0x729B  # <CJK>
+0x4A6C 0x72A8  # <CJK>
+0x4A6D 0x72AD  # <CJK>
+0x4A6E 0x72AE  # <CJK>
+0x4A6F 0x72B1  # <CJK>
+0x4A70 0x72B4  # <CJK>
+0x4A71 0x72BE  # <CJK>
+0x4A72 0x72C1  # <CJK>
+0x4A73 0x72C7  # <CJK>
+0x4A74 0x72C9  # <CJK>
+0x4A75 0x72CC  # <CJK>
+0x4A76 0x72D5  # <CJK>
+0x4A77 0x72D6  # <CJK>
+0x4A78 0x72D8  # <CJK>
+0x4A79 0x72DF  # <CJK>
+0x4A7A 0x72E5  # <CJK>
+0x4A7B 0x72F3  # <CJK>
+0x4A7C 0x72F4  # <CJK>
+0x4A7D 0x72FA  # <CJK>
+0x4A7E 0x72FB  # <CJK>
+0x4B21 0x72FE  # <CJK>
+0x4B22 0x7302  # <CJK>
+0x4B23 0x7304  # <CJK>
+0x4B24 0x7305  # <CJK>
+0x4B25 0x7307  # <CJK>
+0x4B26 0x730B  # <CJK>
+0x4B27 0x730D  # <CJK>
+0x4B28 0x7312  # <CJK>
+0x4B29 0x7313  # <CJK>
+0x4B2A 0x7318  # <CJK>
+0x4B2B 0x7319  # <CJK>
+0x4B2C 0x731E  # <CJK>
+0x4B2D 0x7322  # <CJK>
+0x4B2E 0x7324  # <CJK>
+0x4B2F 0x7327  # <CJK>
+0x4B30 0x7328  # <CJK>
+0x4B31 0x732C  # <CJK>
+0x4B32 0x7331  # <CJK>
+0x4B33 0x7332  # <CJK>
+0x4B34 0x7335  # <CJK>
+0x4B35 0x733A  # <CJK>
+0x4B36 0x733B  # <CJK>
+0x4B37 0x733D  # <CJK>
+0x4B38 0x7343  # <CJK>
+0x4B39 0x734D  # <CJK>
+0x4B3A 0x7350  # <CJK>
+0x4B3B 0x7352  # <CJK>
+0x4B3C 0x7356  # <CJK>
+0x4B3D 0x7358  # <CJK>
+0x4B3E 0x735D  # <CJK>
+0x4B3F 0x735E  # <CJK>
+0x4B40 0x735F  # <CJK>
+0x4B41 0x7360  # <CJK>
+0x4B42 0x7366  # <CJK>
+0x4B43 0x7367  # <CJK>
+0x4B44 0x7369  # <CJK>
+0x4B45 0x736B  # <CJK>
+0x4B46 0x736C  # <CJK>
+0x4B47 0x736E  # <CJK>
+0x4B48 0x736F  # <CJK>
+0x4B49 0x7371  # <CJK>
+0x4B4A 0x7377  # <CJK>
+0x4B4B 0x7379  # <CJK>
+0x4B4C 0x737C  # <CJK>
+0x4B4D 0x7380  # <CJK>
+0x4B4E 0x7381  # <CJK>
+0x4B4F 0x7383  # <CJK>
+0x4B50 0x7385  # <CJK>
+0x4B51 0x7386  # <CJK>
+0x4B52 0x738E  # <CJK>
+0x4B53 0x7390  # <CJK>
+0x4B54 0x7393  # <CJK>
+0x4B55 0x7395  # <CJK>
+0x4B56 0x7397  # <CJK>
+0x4B57 0x7398  # <CJK>
+0x4B58 0x739C  # <CJK>
+0x4B59 0x739E  # <CJK>
+0x4B5A 0x739F  # <CJK>
+0x4B5B 0x73A0  # <CJK>
+0x4B5C 0x73A2  # <CJK>
+0x4B5D 0x73A5  # <CJK>
+0x4B5E 0x73A6  # <CJK>
+0x4B5F 0x73AA  # <CJK>
+0x4B60 0x73AB  # <CJK>
+0x4B61 0x73AD  # <CJK>
+0x4B62 0x73B5  # <CJK>
+0x4B63 0x73B7  # <CJK>
+0x4B64 0x73B9  # <CJK>
+0x4B65 0x73BC  # <CJK>
+0x4B66 0x73BD  # <CJK>
+0x4B67 0x73BF  # <CJK>
+0x4B68 0x73C5  # <CJK>
+0x4B69 0x73C6  # <CJK>
+0x4B6A 0x73C9  # <CJK>
+0x4B6B 0x73CB  # <CJK>
+0x4B6C 0x73CC  # <CJK>
+0x4B6D 0x73CF  # <CJK>
+0x4B6E 0x73D2  # <CJK>
+0x4B6F 0x73D3  # <CJK>
+0x4B70 0x73D6  # <CJK>
+0x4B71 0x73D9  # <CJK>
+0x4B72 0x73DD  # <CJK>
+0x4B73 0x73E1  # <CJK>
+0x4B74 0x73E3  # <CJK>
+0x4B75 0x73E6  # <CJK>
+0x4B76 0x73E7  # <CJK>
+0x4B77 0x73E9  # <CJK>
+0x4B78 0x73F4  # <CJK>
+0x4B79 0x73F5  # <CJK>
+0x4B7A 0x73F7  # <CJK>
+0x4B7B 0x73F9  # <CJK>
+0x4B7C 0x73FA  # <CJK>
+0x4B7D 0x73FB  # <CJK>
+0x4B7E 0x73FD  # <CJK>
+0x4C21 0x73FF  # <CJK>
+0x4C22 0x7400  # <CJK>
+0x4C23 0x7401  # <CJK>
+0x4C24 0x7404  # <CJK>
+0x4C25 0x7407  # <CJK>
+0x4C26 0x740A  # <CJK>
+0x4C27 0x7411  # <CJK>
+0x4C28 0x741A  # <CJK>
+0x4C29 0x741B  # <CJK>
+0x4C2A 0x7424  # <CJK>
+0x4C2B 0x7426  # <CJK>
+0x4C2C 0x7428  # <CJK>
+0x4C2D 0x7429  # <CJK>
+0x4C2E 0x742A  # <CJK>
+0x4C2F 0x742B  # <CJK>
+0x4C30 0x742C  # <CJK>
+0x4C31 0x742D  # <CJK>
+0x4C32 0x742E  # <CJK>
+0x4C33 0x742F  # <CJK>
+0x4C34 0x7430  # <CJK>
+0x4C35 0x7431  # <CJK>
+0x4C36 0x7439  # <CJK>
+0x4C37 0x7440  # <CJK>
+0x4C38 0x7443  # <CJK>
+0x4C39 0x7444  # <CJK>
+0x4C3A 0x7446  # <CJK>
+0x4C3B 0x7447  # <CJK>
+0x4C3C 0x744B  # <CJK>
+0x4C3D 0x744D  # <CJK>
+0x4C3E 0x7451  # <CJK>
+0x4C3F 0x7452  # <CJK>
+0x4C40 0x7457  # <CJK>
+0x4C41 0x745D  # <CJK>
+0x4C42 0x7462  # <CJK>
+0x4C43 0x7466  # <CJK>
+0x4C44 0x7467  # <CJK>
+0x4C45 0x7468  # <CJK>
+0x4C46 0x746B  # <CJK>
+0x4C47 0x746D  # <CJK>
+0x4C48 0x746E  # <CJK>
+0x4C49 0x7471  # <CJK>
+0x4C4A 0x7472  # <CJK>
+0x4C4B 0x7480  # <CJK>
+0x4C4C 0x7481  # <CJK>
+0x4C4D 0x7485  # <CJK>
+0x4C4E 0x7486  # <CJK>
+0x4C4F 0x7487  # <CJK>
+0x4C50 0x7489  # <CJK>
+0x4C51 0x748F  # <CJK>
+0x4C52 0x7490  # <CJK>
+0x4C53 0x7491  # <CJK>
+0x4C54 0x7492  # <CJK>
+0x4C55 0x7498  # <CJK>
+0x4C56 0x7499  # <CJK>
+0x4C57 0x749A  # <CJK>
+0x4C58 0x749C  # <CJK>
+0x4C59 0x749F  # <CJK>
+0x4C5A 0x74A0  # <CJK>
+0x4C5B 0x74A1  # <CJK>
+0x4C5C 0x74A3  # <CJK>
+0x4C5D 0x74A6  # <CJK>
+0x4C5E 0x74A8  # <CJK>
+0x4C5F 0x74A9  # <CJK>
+0x4C60 0x74AA  # <CJK>
+0x4C61 0x74AB  # <CJK>
+0x4C62 0x74AE  # <CJK>
+0x4C63 0x74AF  # <CJK>
+0x4C64 0x74B1  # <CJK>
+0x4C65 0x74B2  # <CJK>
+0x4C66 0x74B5  # <CJK>
+0x4C67 0x74B9  # <CJK>
+0x4C68 0x74BB  # <CJK>
+0x4C69 0x74BF  # <CJK>
+0x4C6A 0x74C8  # <CJK>
+0x4C6B 0x74C9  # <CJK>
+0x4C6C 0x74CC  # <CJK>
+0x4C6D 0x74D0  # <CJK>
+0x4C6E 0x74D3  # <CJK>
+0x4C6F 0x74D8  # <CJK>
+0x4C70 0x74DA  # <CJK>
+0x4C71 0x74DB  # <CJK>
+0x4C72 0x74DE  # <CJK>
+0x4C73 0x74DF  # <CJK>
+0x4C74 0x74E4  # <CJK>
+0x4C75 0x74E8  # <CJK>
+0x4C76 0x74EA  # <CJK>
+0x4C77 0x74EB  # <CJK>
+0x4C78 0x74EF  # <CJK>
+0x4C79 0x74F4  # <CJK>
+0x4C7A 0x74FA  # <CJK>
+0x4C7B 0x74FB  # <CJK>
+0x4C7C 0x74FC  # <CJK>
+0x4C7D 0x74FF  # <CJK>
+0x4C7E 0x7506  # <CJK>
+0x4D21 0x7512  # <CJK>
+0x4D22 0x7516  # <CJK>
+0x4D23 0x7517  # <CJK>
+0x4D24 0x7520  # <CJK>
+0x4D25 0x7521  # <CJK>
+0x4D26 0x7524  # <CJK>
+0x4D27 0x7527  # <CJK>
+0x4D28 0x7529  # <CJK>
+0x4D29 0x752A  # <CJK>
+0x4D2A 0x752F  # <CJK>
+0x4D2B 0x7536  # <CJK>
+0x4D2C 0x7539  # <CJK>
+0x4D2D 0x753D  # <CJK>
+0x4D2E 0x753E  # <CJK>
+0x4D2F 0x753F  # <CJK>
+0x4D30 0x7540  # <CJK>
+0x4D31 0x7543  # <CJK>
+0x4D32 0x7547  # <CJK>
+0x4D33 0x7548  # <CJK>
+0x4D34 0x754E  # <CJK>
+0x4D35 0x7550  # <CJK>
+0x4D36 0x7552  # <CJK>
+0x4D37 0x7557  # <CJK>
+0x4D38 0x755E  # <CJK>
+0x4D39 0x755F  # <CJK>
+0x4D3A 0x7561  # <CJK>
+0x4D3B 0x756F  # <CJK>
+0x4D3C 0x7571  # <CJK>
+0x4D3D 0x7579  # <CJK>
+0x4D3E 0x757A  # <CJK>
+0x4D3F 0x757B  # <CJK>
+0x4D40 0x757C  # <CJK>
+0x4D41 0x757D  # <CJK>
+0x4D42 0x757E  # <CJK>
+0x4D43 0x7581  # <CJK>
+0x4D44 0x7585  # <CJK>
+0x4D45 0x7590  # <CJK>
+0x4D46 0x7592  # <CJK>
+0x4D47 0x7593  # <CJK>
+0x4D48 0x7595  # <CJK>
+0x4D49 0x7599  # <CJK>
+0x4D4A 0x759C  # <CJK>
+0x4D4B 0x75A2  # <CJK>
+0x4D4C 0x75A4  # <CJK>
+0x4D4D 0x75B4  # <CJK>
+0x4D4E 0x75BA  # <CJK>
+0x4D4F 0x75BF  # <CJK>
+0x4D50 0x75C0  # <CJK>
+0x4D51 0x75C1  # <CJK>
+0x4D52 0x75C4  # <CJK>
+0x4D53 0x75C6  # <CJK>
+0x4D54 0x75CC  # <CJK>
+0x4D55 0x75CE  # <CJK>
+0x4D56 0x75CF  # <CJK>
+0x4D57 0x75D7  # <CJK>
+0x4D58 0x75DC  # <CJK>
+0x4D59 0x75DF  # <CJK>
+0x4D5A 0x75E0  # <CJK>
+0x4D5B 0x75E1  # <CJK>
+0x4D5C 0x75E4  # <CJK>
+0x4D5D 0x75E7  # <CJK>
+0x4D5E 0x75EC  # <CJK>
+0x4D5F 0x75EE  # <CJK>
+0x4D60 0x75EF  # <CJK>
+0x4D61 0x75F1  # <CJK>
+0x4D62 0x75F9  # <CJK>
+0x4D63 0x7600  # <CJK>
+0x4D64 0x7602  # <CJK>
+0x4D65 0x7603  # <CJK>
+0x4D66 0x7604  # <CJK>
+0x4D67 0x7607  # <CJK>
+0x4D68 0x7608  # <CJK>
+0x4D69 0x760A  # <CJK>
+0x4D6A 0x760C  # <CJK>
+0x4D6B 0x760F  # <CJK>
+0x4D6C 0x7612  # <CJK>
+0x4D6D 0x7613  # <CJK>
+0x4D6E 0x7615  # <CJK>
+0x4D6F 0x7616  # <CJK>
+0x4D70 0x7619  # <CJK>
+0x4D71 0x761B  # <CJK>
+0x4D72 0x761C  # <CJK>
+0x4D73 0x761D  # <CJK>
+0x4D74 0x761E  # <CJK>
+0x4D75 0x7623  # <CJK>
+0x4D76 0x7625  # <CJK>
+0x4D77 0x7626  # <CJK>
+0x4D78 0x7629  # <CJK>
+0x4D79 0x762D  # <CJK>
+0x4D7A 0x7632  # <CJK>
+0x4D7B 0x7633  # <CJK>
+0x4D7C 0x7635  # <CJK>
+0x4D7D 0x7638  # <CJK>
+0x4D7E 0x7639  # <CJK>
+0x4E21 0x763A  # <CJK>
+0x4E22 0x763C  # <CJK>
+0x4E23 0x764A  # <CJK>
+0x4E24 0x7640  # <CJK>
+0x4E25 0x7641  # <CJK>
+0x4E26 0x7643  # <CJK>
+0x4E27 0x7644  # <CJK>
+0x4E28 0x7645  # <CJK>
+0x4E29 0x7649  # <CJK>
+0x4E2A 0x764B  # <CJK>
+0x4E2B 0x7655  # <CJK>
+0x4E2C 0x7659  # <CJK>
+0x4E2D 0x765F  # <CJK>
+0x4E2E 0x7664  # <CJK>
+0x4E2F 0x7665  # <CJK>
+0x4E30 0x766D  # <CJK>
+0x4E31 0x766E  # <CJK>
+0x4E32 0x766F  # <CJK>
+0x4E33 0x7671  # <CJK>
+0x4E34 0x7674  # <CJK>
+0x4E35 0x7681  # <CJK>
+0x4E36 0x7685  # <CJK>
+0x4E37 0x768C  # <CJK>
+0x4E38 0x768D  # <CJK>
+0x4E39 0x7695  # <CJK>
+0x4E3A 0x769B  # <CJK>
+0x4E3B 0x769C  # <CJK>
+0x4E3C 0x769D  # <CJK>
+0x4E3D 0x769F  # <CJK>
+0x4E3E 0x76A0  # <CJK>
+0x4E3F 0x76A2  # <CJK>
+0x4E40 0x76A3  # <CJK>
+0x4E41 0x76A4  # <CJK>
+0x4E42 0x76A5  # <CJK>
+0x4E43 0x76A6  # <CJK>
+0x4E44 0x76A7  # <CJK>
+0x4E45 0x76A8  # <CJK>
+0x4E46 0x76AA  # <CJK>
+0x4E47 0x76AD  # <CJK>
+0x4E48 0x76BD  # <CJK>
+0x4E49 0x76C1  # <CJK>
+0x4E4A 0x76C5  # <CJK>
+0x4E4B 0x76C9  # <CJK>
+0x4E4C 0x76CB  # <CJK>
+0x4E4D 0x76CC  # <CJK>
+0x4E4E 0x76CE  # <CJK>
+0x4E4F 0x76D4  # <CJK>
+0x4E50 0x76D9  # <CJK>
+0x4E51 0x76E0  # <CJK>
+0x4E52 0x76E6  # <CJK>
+0x4E53 0x76E8  # <CJK>
+0x4E54 0x76EC  # <CJK>
+0x4E55 0x76F0  # <CJK>
+0x4E56 0x76F1  # <CJK>
+0x4E57 0x76F6  # <CJK>
+0x4E58 0x76F9  # <CJK>
+0x4E59 0x76FC  # <CJK>
+0x4E5A 0x7700  # <CJK>
+0x4E5B 0x7706  # <CJK>
+0x4E5C 0x770A  # <CJK>
+0x4E5D 0x770E  # <CJK>
+0x4E5E 0x7712  # <CJK>
+0x4E5F 0x7714  # <CJK>
+0x4E60 0x7715  # <CJK>
+0x4E61 0x7717  # <CJK>
+0x4E62 0x7719  # <CJK>
+0x4E63 0x771A  # <CJK>
+0x4E64 0x771C  # <CJK>
+0x4E65 0x7722  # <CJK>
+0x4E66 0x7728  # <CJK>
+0x4E67 0x772D  # <CJK>
+0x4E68 0x772E  # <CJK>
+0x4E69 0x772F  # <CJK>
+0x4E6A 0x7734  # <CJK>
+0x4E6B 0x7735  # <CJK>
+0x4E6C 0x7736  # <CJK>
+0x4E6D 0x7739  # <CJK>
+0x4E6E 0x773D  # <CJK>
+0x4E6F 0x773E  # <CJK>
+0x4E70 0x7742  # <CJK>
+0x4E71 0x7745  # <CJK>
+0x4E72 0x7746  # <CJK>
+0x4E73 0x774A  # <CJK>
+0x4E74 0x774D  # <CJK>
+0x4E75 0x774E  # <CJK>
+0x4E76 0x774F  # <CJK>
+0x4E77 0x7752  # <CJK>
+0x4E78 0x7756  # <CJK>
+0x4E79 0x7757  # <CJK>
+0x4E7A 0x775C  # <CJK>
+0x4E7B 0x775E  # <CJK>
+0x4E7C 0x775F  # <CJK>
+0x4E7D 0x7760  # <CJK>
+0x4E7E 0x7762  # <CJK>
+0x4F21 0x7764  # <CJK>
+0x4F22 0x7767  # <CJK>
+0x4F23 0x776A  # <CJK>
+0x4F24 0x776C  # <CJK>
+0x4F25 0x7770  # <CJK>
+0x4F26 0x7772  # <CJK>
+0x4F27 0x7773  # <CJK>
+0x4F28 0x7774  # <CJK>
+0x4F29 0x777A  # <CJK>
+0x4F2A 0x777D  # <CJK>
+0x4F2B 0x7780  # <CJK>
+0x4F2C 0x7784  # <CJK>
+0x4F2D 0x778C  # <CJK>
+0x4F2E 0x778D  # <CJK>
+0x4F2F 0x7794  # <CJK>
+0x4F30 0x7795  # <CJK>
+0x4F31 0x7796  # <CJK>
+0x4F32 0x779A  # <CJK>
+0x4F33 0x779F  # <CJK>
+0x4F34 0x77A2  # <CJK>
+0x4F35 0x77A7  # <CJK>
+0x4F36 0x77AA  # <CJK>
+0x4F37 0x77AE  # <CJK>
+0x4F38 0x77AF  # <CJK>
+0x4F39 0x77B1  # <CJK>
+0x4F3A 0x77B5  # <CJK>
+0x4F3B 0x77BE  # <CJK>
+0x4F3C 0x77C3  # <CJK>
+0x4F3D 0x77C9  # <CJK>
+0x4F3E 0x77D1  # <CJK>
+0x4F3F 0x77D2  # <CJK>
+0x4F40 0x77D5  # <CJK>
+0x4F41 0x77D9  # <CJK>
+0x4F42 0x77DE  # <CJK>
+0x4F43 0x77DF  # <CJK>
+0x4F44 0x77E0  # <CJK>
+0x4F45 0x77E4  # <CJK>
+0x4F46 0x77E6  # <CJK>
+0x4F47 0x77EA  # <CJK>
+0x4F48 0x77EC  # <CJK>
+0x4F49 0x77F0  # <CJK>
+0x4F4A 0x77F1  # <CJK>
+0x4F4B 0x77F4  # <CJK>
+0x4F4C 0x77F8  # <CJK>
+0x4F4D 0x77FB  # <CJK>
+0x4F4E 0x7805  # <CJK>
+0x4F4F 0x7806  # <CJK>
+0x4F50 0x7809  # <CJK>
+0x4F51 0x780D  # <CJK>
+0x4F52 0x780E  # <CJK>
+0x4F53 0x7811  # <CJK>
+0x4F54 0x781D  # <CJK>
+0x4F55 0x7821  # <CJK>
+0x4F56 0x7822  # <CJK>
+0x4F57 0x7823  # <CJK>
+0x4F58 0x782D  # <CJK>
+0x4F59 0x782E  # <CJK>
+0x4F5A 0x7830  # <CJK>
+0x4F5B 0x7835  # <CJK>
+0x4F5C 0x7837  # <CJK>
+0x4F5D 0x7843  # <CJK>
+0x4F5E 0x7844  # <CJK>
+0x4F5F 0x7847  # <CJK>
+0x4F60 0x7848  # <CJK>
+0x4F61 0x784C  # <CJK>
+0x4F62 0x784E  # <CJK>
+0x4F63 0x7852  # <CJK>
+0x4F64 0x785C  # <CJK>
+0x4F65 0x785E  # <CJK>
+0x4F66 0x7860  # <CJK>
+0x4F67 0x7861  # <CJK>
+0x4F68 0x7863  # <CJK>
+0x4F69 0x7864  # <CJK>
+0x4F6A 0x7868  # <CJK>
+0x4F6B 0x786A  # <CJK>
+0x4F6C 0x786E  # <CJK>
+0x4F6D 0x787A  # <CJK>
+0x4F6E 0x787E  # <CJK>
+0x4F6F 0x788A  # <CJK>
+0x4F70 0x788F  # <CJK>
+0x4F71 0x7894  # <CJK>
+0x4F72 0x7898  # <CJK>
+0x4F73 0x78A1  # <CJK>
+0x4F74 0x789D  # <CJK>
+0x4F75 0x789E  # <CJK>
+0x4F76 0x789F  # <CJK>
+0x4F77 0x78A4  # <CJK>
+0x4F78 0x78A8  # <CJK>
+0x4F79 0x78AC  # <CJK>
+0x4F7A 0x78AD  # <CJK>
+0x4F7B 0x78B0  # <CJK>
+0x4F7C 0x78B1  # <CJK>
+0x4F7D 0x78B2  # <CJK>
+0x4F7E 0x78B3  # <CJK>
+0x5021 0x78BB  # <CJK>
+0x5022 0x78BD  # <CJK>
+0x5023 0x78BF  # <CJK>
+0x5024 0x78C7  # <CJK>
+0x5025 0x78C8  # <CJK>
+0x5026 0x78C9  # <CJK>
+0x5027 0x78CC  # <CJK>
+0x5028 0x78CE  # <CJK>
+0x5029 0x78D2  # <CJK>
+0x502A 0x78D3  # <CJK>
+0x502B 0x78D5  # <CJK>
+0x502C 0x78D6  # <CJK>
+0x502D 0x78E4  # <CJK>
+0x502E 0x78DB  # <CJK>
+0x502F 0x78DF  # <CJK>
+0x5030 0x78E0  # <CJK>
+0x5031 0x78E1  # <CJK>
+0x5032 0x78E6  # <CJK>
+0x5033 0x78EA  # <CJK>
+0x5034 0x78F2  # <CJK>
+0x5035 0x78F3  # <CJK>
+0x5036 0x7900  # <CJK>
+0x5037 0x78F6  # <CJK>
+0x5038 0x78F7  # <CJK>
+0x5039 0x78FA  # <CJK>
+0x503A 0x78FB  # <CJK>
+0x503B 0x78FF  # <CJK>
+0x503C 0x7906  # <CJK>
+0x503D 0x790C  # <CJK>
+0x503E 0x7910  # <CJK>
+0x503F 0x791A  # <CJK>
+0x5040 0x791C  # <CJK>
+0x5041 0x791E  # <CJK>
+0x5042 0x791F  # <CJK>
+0x5043 0x7920  # <CJK>
+0x5044 0x7925  # <CJK>
+0x5045 0x7927  # <CJK>
+0x5046 0x7929  # <CJK>
+0x5047 0x792D  # <CJK>
+0x5048 0x7931  # <CJK>
+0x5049 0x7934  # <CJK>
+0x504A 0x7935  # <CJK>
+0x504B 0x793B  # <CJK>
+0x504C 0x793D  # <CJK>
+0x504D 0x793F  # <CJK>
+0x504E 0x7944  # <CJK>
+0x504F 0x7945  # <CJK>
+0x5050 0x7946  # <CJK>
+0x5051 0x794A  # <CJK>
+0x5052 0x794B  # <CJK>
+0x5053 0x794F  # <CJK>
+0x5054 0x7951  # <CJK>
+0x5055 0x7954  # <CJK>
+0x5056 0x7958  # <CJK>
+0x5057 0x795B  # <CJK>
+0x5058 0x795C  # <CJK>
+0x5059 0x7967  # <CJK>
+0x505A 0x7969  # <CJK>
+0x505B 0x796B  # <CJK>
+0x505C 0x7972  # <CJK>
+0x505D 0x7979  # <CJK>
+0x505E 0x797B  # <CJK>
+0x505F 0x797C  # <CJK>
+0x5060 0x797E  # <CJK>
+0x5061 0x798B  # <CJK>
+0x5062 0x798C  # <CJK>
+0x5063 0x7991  # <CJK>
+0x5064 0x7993  # <CJK>
+0x5065 0x7994  # <CJK>
+0x5066 0x7995  # <CJK>
+0x5067 0x7996  # <CJK>
+0x5068 0x7998  # <CJK>
+0x5069 0x799B  # <CJK>
+0x506A 0x799C  # <CJK>
+0x506B 0x79A1  # <CJK>
+0x506C 0x79A8  # <CJK>
+0x506D 0x79A9  # <CJK>
+0x506E 0x79AB  # <CJK>
+0x506F 0x79AF  # <CJK>
+0x5070 0x79B1  # <CJK>
+0x5071 0x79B4  # <CJK>
+0x5072 0x79B8  # <CJK>
+0x5073 0x79BB  # <CJK>
+0x5074 0x79C2  # <CJK>
+0x5075 0x79C4  # <CJK>
+0x5076 0x79C7  # <CJK>
+0x5077 0x79C8  # <CJK>
+0x5078 0x79CA  # <CJK>
+0x5079 0x79CF  # <CJK>
+0x507A 0x79D4  # <CJK>
+0x507B 0x79D6  # <CJK>
+0x507C 0x79DA  # <CJK>
+0x507D 0x79DD  # <CJK>
+0x507E 0x79DE  # <CJK>
+0x5121 0x79E0  # <CJK>
+0x5122 0x79E2  # <CJK>
+0x5123 0x79E5  # <CJK>
+0x5124 0x79EA  # <CJK>
+0x5125 0x79EB  # <CJK>
+0x5126 0x79ED  # <CJK>
+0x5127 0x79F1  # <CJK>
+0x5128 0x79F8  # <CJK>
+0x5129 0x79FC  # <CJK>
+0x512A 0x7A02  # <CJK>
+0x512B 0x7A03  # <CJK>
+0x512C 0x7A07  # <CJK>
+0x512D 0x7A09  # <CJK>
+0x512E 0x7A0A  # <CJK>
+0x512F 0x7A0C  # <CJK>
+0x5130 0x7A11  # <CJK>
+0x5131 0x7A15  # <CJK>
+0x5132 0x7A1B  # <CJK>
+0x5133 0x7A1E  # <CJK>
+0x5134 0x7A21  # <CJK>
+0x5135 0x7A27  # <CJK>
+0x5136 0x7A2B  # <CJK>
+0x5137 0x7A2D  # <CJK>
+0x5138 0x7A2F  # <CJK>
+0x5139 0x7A30  # <CJK>
+0x513A 0x7A34  # <CJK>
+0x513B 0x7A35  # <CJK>
+0x513C 0x7A38  # <CJK>
+0x513D 0x7A39  # <CJK>
+0x513E 0x7A3A  # <CJK>
+0x513F 0x7A44  # <CJK>
+0x5140 0x7A45  # <CJK>
+0x5141 0x7A47  # <CJK>
+0x5142 0x7A48  # <CJK>
+0x5143 0x7A4C  # <CJK>
+0x5144 0x7A55  # <CJK>
+0x5145 0x7A56  # <CJK>
+0x5146 0x7A59  # <CJK>
+0x5147 0x7A5C  # <CJK>
+0x5148 0x7A5D  # <CJK>
+0x5149 0x7A5F  # <CJK>
+0x514A 0x7A60  # <CJK>
+0x514B 0x7A65  # <CJK>
+0x514C 0x7A67  # <CJK>
+0x514D 0x7A6A  # <CJK>
+0x514E 0x7A6D  # <CJK>
+0x514F 0x7A75  # <CJK>
+0x5150 0x7A78  # <CJK>
+0x5151 0x7A7E  # <CJK>
+0x5152 0x7A80  # <CJK>
+0x5153 0x7A82  # <CJK>
+0x5154 0x7A85  # <CJK>
+0x5155 0x7A86  # <CJK>
+0x5156 0x7A8A  # <CJK>
+0x5157 0x7A8B  # <CJK>
+0x5158 0x7A90  # <CJK>
+0x5159 0x7A91  # <CJK>
+0x515A 0x7A94  # <CJK>
+0x515B 0x7A9E  # <CJK>
+0x515C 0x7AA0  # <CJK>
+0x515D 0x7AA3  # <CJK>
+0x515E 0x7AAC  # <CJK>
+0x515F 0x7AB3  # <CJK>
+0x5160 0x7AB5  # <CJK>
+0x5161 0x7AB9  # <CJK>
+0x5162 0x7ABB  # <CJK>
+0x5163 0x7ABC  # <CJK>
+0x5164 0x7AC6  # <CJK>
+0x5165 0x7AC9  # <CJK>
+0x5166 0x7ACC  # <CJK>
+0x5167 0x7ACE  # <CJK>
+0x5168 0x7AD1  # <CJK>
+0x5169 0x7ADB  # <CJK>
+0x516A 0x7AE8  # <CJK>
+0x516B 0x7AE9  # <CJK>
+0x516C 0x7AEB  # <CJK>
+0x516D 0x7AEC  # <CJK>
+0x516E 0x7AF1  # <CJK>
+0x516F 0x7AF4  # <CJK>
+0x5170 0x7AFB  # <CJK>
+0x5171 0x7AFD  # <CJK>
+0x5172 0x7AFE  # <CJK>
+0x5173 0x7B07  # <CJK>
+0x5174 0x7B14  # <CJK>
+0x5175 0x7B1F  # <CJK>
+0x5176 0x7B23  # <CJK>
+0x5177 0x7B27  # <CJK>
+0x5178 0x7B29  # <CJK>
+0x5179 0x7B2A  # <CJK>
+0x517A 0x7B2B  # <CJK>
+0x517B 0x7B2D  # <CJK>
+0x517C 0x7B2E  # <CJK>
+0x517D 0x7B2F  # <CJK>
+0x517E 0x7B30  # <CJK>
+0x5221 0x7B31  # <CJK>
+0x5222 0x7B34  # <CJK>
+0x5223 0x7B3D  # <CJK>
+0x5224 0x7B3F  # <CJK>
+0x5225 0x7B40  # <CJK>
+0x5226 0x7B41  # <CJK>
+0x5227 0x7B47  # <CJK>
+0x5228 0x7B4E  # <CJK>
+0x5229 0x7B55  # <CJK>
+0x522A 0x7B60  # <CJK>
+0x522B 0x7B64  # <CJK>
+0x522C 0x7B66  # <CJK>
+0x522D 0x7B69  # <CJK>
+0x522E 0x7B6A  # <CJK>
+0x522F 0x7B6D  # <CJK>
+0x5230 0x7B6F  # <CJK>
+0x5231 0x7B72  # <CJK>
+0x5232 0x7B73  # <CJK>
+0x5233 0x7B77  # <CJK>
+0x5234 0x7B84  # <CJK>
+0x5235 0x7B89  # <CJK>
+0x5236 0x7B8E  # <CJK>
+0x5237 0x7B90  # <CJK>
+0x5238 0x7B91  # <CJK>
+0x5239 0x7B96  # <CJK>
+0x523A 0x7B9B  # <CJK>
+0x523B 0x7B9E  # <CJK>
+0x523C 0x7BA0  # <CJK>
+0x523D 0x7BA5  # <CJK>
+0x523E 0x7BAC  # <CJK>
+0x523F 0x7BAF  # <CJK>
+0x5240 0x7BB0  # <CJK>
+0x5241 0x7BB2  # <CJK>
+0x5242 0x7BB5  # <CJK>
+0x5243 0x7BB6  # <CJK>
+0x5244 0x7BBA  # <CJK>
+0x5245 0x7BBB  # <CJK>
+0x5246 0x7BBC  # <CJK>
+0x5247 0x7BBD  # <CJK>
+0x5248 0x7BC2  # <CJK>
+0x5249 0x7BC5  # <CJK>
+0x524A 0x7BC8  # <CJK>
+0x524B 0x7BCA  # <CJK>
+0x524C 0x7BD4  # <CJK>
+0x524D 0x7BD6  # <CJK>
+0x524E 0x7BD7  # <CJK>
+0x524F 0x7BD9  # <CJK>
+0x5250 0x7BDA  # <CJK>
+0x5251 0x7BDB  # <CJK>
+0x5252 0x7BE8  # <CJK>
+0x5253 0x7BEA  # <CJK>
+0x5254 0x7BF2  # <CJK>
+0x5255 0x7BF4  # <CJK>
+0x5256 0x7BF5  # <CJK>
+0x5257 0x7BF8  # <CJK>
+0x5258 0x7BF9  # <CJK>
+0x5259 0x7BFA  # <CJK>
+0x525A 0x7BFC  # <CJK>
+0x525B 0x7BFE  # <CJK>
+0x525C 0x7C01  # <CJK>
+0x525D 0x7C02  # <CJK>
+0x525E 0x7C03  # <CJK>
+0x525F 0x7C04  # <CJK>
+0x5260 0x7C06  # <CJK>
+0x5261 0x7C09  # <CJK>
+0x5262 0x7C0B  # <CJK>
+0x5263 0x7C0C  # <CJK>
+0x5264 0x7C0E  # <CJK>
+0x5265 0x7C0F  # <CJK>
+0x5266 0x7C19  # <CJK>
+0x5267 0x7C1B  # <CJK>
+0x5268 0x7C20  # <CJK>
+0x5269 0x7C25  # <CJK>
+0x526A 0x7C26  # <CJK>
+0x526B 0x7C28  # <CJK>
+0x526C 0x7C2C  # <CJK>
+0x526D 0x7C31  # <CJK>
+0x526E 0x7C33  # <CJK>
+0x526F 0x7C34  # <CJK>
+0x5270 0x7C36  # <CJK>
+0x5271 0x7C39  # <CJK>
+0x5272 0x7C3A  # <CJK>
+0x5273 0x7C46  # <CJK>
+0x5274 0x7C4A  # <CJK>
+0x5275 0x7C55  # <CJK>
+0x5276 0x7C51  # <CJK>
+0x5277 0x7C52  # <CJK>
+0x5278 0x7C53  # <CJK>
+0x5279 0x7C59  # <CJK>
+0x527A 0x7C5A  # <CJK>
+0x527B 0x7C5B  # <CJK>
+0x527C 0x7C5C  # <CJK>
+0x527D 0x7C5D  # <CJK>
+0x527E 0x7C5E  # <CJK>
+0x5321 0x7C61  # <CJK>
+0x5322 0x7C63  # <CJK>
+0x5323 0x7C67  # <CJK>
+0x5324 0x7C69  # <CJK>
+0x5325 0x7C6D  # <CJK>
+0x5326 0x7C6E  # <CJK>
+0x5327 0x7C70  # <CJK>
+0x5328 0x7C72  # <CJK>
+0x5329 0x7C79  # <CJK>
+0x532A 0x7C7C  # <CJK>
+0x532B 0x7C7D  # <CJK>
+0x532C 0x7C86  # <CJK>
+0x532D 0x7C87  # <CJK>
+0x532E 0x7C8F  # <CJK>
+0x532F 0x7C94  # <CJK>
+0x5330 0x7C9E  # <CJK>
+0x5331 0x7CA0  # <CJK>
+0x5332 0x7CA6  # <CJK>
+0x5333 0x7CB0  # <CJK>
+0x5334 0x7CB6  # <CJK>
+0x5335 0x7CB7  # <CJK>
+0x5336 0x7CBA  # <CJK>
+0x5337 0x7CBB  # <CJK>
+0x5338 0x7CBC  # <CJK>
+0x5339 0x7CBF  # <CJK>
+0x533A 0x7CC4  # <CJK>
+0x533B 0x7CC7  # <CJK>
+0x533C 0x7CC8  # <CJK>
+0x533D 0x7CC9  # <CJK>
+0x533E 0x7CCD  # <CJK>
+0x533F 0x7CCF  # <CJK>
+0x5340 0x7CD3  # <CJK>
+0x5341 0x7CD4  # <CJK>
+0x5342 0x7CD5  # <CJK>
+0x5343 0x7CD7  # <CJK>
+0x5344 0x7CD9  # <CJK>
+0x5345 0x7CDA  # <CJK>
+0x5346 0x7CDD  # <CJK>
+0x5347 0x7CE6  # <CJK>
+0x5348 0x7CE9  # <CJK>
+0x5349 0x7CEB  # <CJK>
+0x534A 0x7CF5  # <CJK>
+0x534B 0x7D03  # <CJK>
+0x534C 0x7D07  # <CJK>
+0x534D 0x7D08  # <CJK>
+0x534E 0x7D09  # <CJK>
+0x534F 0x7D0F  # <CJK>
+0x5350 0x7D11  # <CJK>
+0x5351 0x7D12  # <CJK>
+0x5352 0x7D13  # <CJK>
+0x5353 0x7D16  # <CJK>
+0x5354 0x7D1D  # <CJK>
+0x5355 0x7D1E  # <CJK>
+0x5356 0x7D23  # <CJK>
+0x5357 0x7D26  # <CJK>
+0x5358 0x7D2A  # <CJK>
+0x5359 0x7D2D  # <CJK>
+0x535A 0x7D31  # <CJK>
+0x535B 0x7D3C  # <CJK>
+0x535C 0x7D3D  # <CJK>
+0x535D 0x7D3E  # <CJK>
+0x535E 0x7D40  # <CJK>
+0x535F 0x7D41  # <CJK>
+0x5360 0x7D47  # <CJK>
+0x5361 0x7D48  # <CJK>
+0x5362 0x7D4D  # <CJK>
+0x5363 0x7D51  # <CJK>
+0x5364 0x7D53  # <CJK>
+0x5365 0x7D57  # <CJK>
+0x5366 0x7D59  # <CJK>
+0x5367 0x7D5A  # <CJK>
+0x5368 0x7D5C  # <CJK>
+0x5369 0x7D5D  # <CJK>
+0x536A 0x7D65  # <CJK>
+0x536B 0x7D67  # <CJK>
+0x536C 0x7D6A  # <CJK>
+0x536D 0x7D70  # <CJK>
+0x536E 0x7D78  # <CJK>
+0x536F 0x7D7A  # <CJK>
+0x5370 0x7D7B  # <CJK>
+0x5371 0x7D7F  # <CJK>
+0x5372 0x7D81  # <CJK>
+0x5373 0x7D82  # <CJK>
+0x5374 0x7D83  # <CJK>
+0x5375 0x7D85  # <CJK>
+0x5376 0x7D86  # <CJK>
+0x5377 0x7D88  # <CJK>
+0x5378 0x7D8B  # <CJK>
+0x5379 0x7D8C  # <CJK>
+0x537A 0x7D8D  # <CJK>
+0x537B 0x7D91  # <CJK>
+0x537C 0x7D96  # <CJK>
+0x537D 0x7D97  # <CJK>
+0x537E 0x7D9D  # <CJK>
+0x5421 0x7D9E  # <CJK>
+0x5422 0x7DA6  # <CJK>
+0x5423 0x7DA7  # <CJK>
+0x5424 0x7DAA  # <CJK>
+0x5425 0x7DB3  # <CJK>
+0x5426 0x7DB6  # <CJK>
+0x5427 0x7DB7  # <CJK>
+0x5428 0x7DB9  # <CJK>
+0x5429 0x7DC2  # <CJK>
+0x542A 0x7DC3  # <CJK>
+0x542B 0x7DC4  # <CJK>
+0x542C 0x7DC5  # <CJK>
+0x542D 0x7DC6  # <CJK>
+0x542E 0x7DCC  # <CJK>
+0x542F 0x7DCD  # <CJK>
+0x5430 0x7DCE  # <CJK>
+0x5431 0x7DD7  # <CJK>
+0x5432 0x7DD9  # <CJK>
+0x5433 0x7E00  # <CJK>
+0x5434 0x7DE2  # <CJK>
+0x5435 0x7DE5  # <CJK>
+0x5436 0x7DE6  # <CJK>
+0x5437 0x7DEA  # <CJK>
+0x5438 0x7DEB  # <CJK>
+0x5439 0x7DED  # <CJK>
+0x543A 0x7DF1  # <CJK>
+0x543B 0x7DF5  # <CJK>
+0x543C 0x7DF6  # <CJK>
+0x543D 0x7DF9  # <CJK>
+0x543E 0x7DFA  # <CJK>
+0x543F 0x7E08  # <CJK>
+0x5440 0x7E10  # <CJK>
+0x5441 0x7E11  # <CJK>
+0x5442 0x7E15  # <CJK>
+0x5443 0x7E17  # <CJK>
+0x5444 0x7E1C  # <CJK>
+0x5445 0x7E1D  # <CJK>
+0x5446 0x7E20  # <CJK>
+0x5447 0x7E27  # <CJK>
+0x5448 0x7E28  # <CJK>
+0x5449 0x7E2C  # <CJK>
+0x544A 0x7E2D  # <CJK>
+0x544B 0x7E2F  # <CJK>
+0x544C 0x7E33  # <CJK>
+0x544D 0x7E36  # <CJK>
+0x544E 0x7E3F  # <CJK>
+0x544F 0x7E44  # <CJK>
+0x5450 0x7E45  # <CJK>
+0x5451 0x7E47  # <CJK>
+0x5452 0x7E4E  # <CJK>
+0x5453 0x7E50  # <CJK>
+0x5454 0x7E52  # <CJK>
+0x5455 0x7E58  # <CJK>
+0x5456 0x7E5F  # <CJK>
+0x5457 0x7E61  # <CJK>
+0x5458 0x7E62  # <CJK>
+0x5459 0x7E65  # <CJK>
+0x545A 0x7E6B  # <CJK>
+0x545B 0x7E6E  # <CJK>
+0x545C 0x7E6F  # <CJK>
+0x545D 0x7E73  # <CJK>
+0x545E 0x7E78  # <CJK>
+0x545F 0x7E7E  # <CJK>
+0x5460 0x7E81  # <CJK>
+0x5461 0x7E86  # <CJK>
+0x5462 0x7E87  # <CJK>
+0x5463 0x7E8A  # <CJK>
+0x5464 0x7E8D  # <CJK>
+0x5465 0x7E91  # <CJK>
+0x5466 0x7E95  # <CJK>
+0x5467 0x7E98  # <CJK>
+0x5468 0x7E9A  # <CJK>
+0x5469 0x7E9D  # <CJK>
+0x546A 0x7E9E  # <CJK>
+0x546B 0x7F3C  # <CJK>
+0x546C 0x7F3B  # <CJK>
+0x546D 0x7F3D  # <CJK>
+0x546E 0x7F3E  # <CJK>
+0x546F 0x7F3F  # <CJK>
+0x5470 0x7F43  # <CJK>
+0x5471 0x7F44  # <CJK>
+0x5472 0x7F47  # <CJK>
+0x5473 0x7F4F  # <CJK>
+0x5474 0x7F52  # <CJK>
+0x5475 0x7F53  # <CJK>
+0x5476 0x7F5B  # <CJK>
+0x5477 0x7F5C  # <CJK>
+0x5478 0x7F5D  # <CJK>
+0x5479 0x7F61  # <CJK>
+0x547A 0x7F63  # <CJK>
+0x547B 0x7F64  # <CJK>
+0x547C 0x7F65  # <CJK>
+0x547D 0x7F66  # <CJK>
+0x547E 0x7F6D  # <CJK>
+0x5521 0x7F71  # <CJK>
+0x5522 0x7F7D  # <CJK>
+0x5523 0x7F7E  # <CJK>
+0x5524 0x7F7F  # <CJK>
+0x5525 0x7F80  # <CJK>
+0x5526 0x7F8B  # <CJK>
+0x5527 0x7F8D  # <CJK>
+0x5528 0x7F8F  # <CJK>
+0x5529 0x7F90  # <CJK>
+0x552A 0x7F91  # <CJK>
+0x552B 0x7F96  # <CJK>
+0x552C 0x7F97  # <CJK>
+0x552D 0x7F9C  # <CJK>
+0x552E 0x7FA1  # <CJK>
+0x552F 0x7FA2  # <CJK>
+0x5530 0x7FA6  # <CJK>
+0x5531 0x7FAA  # <CJK>
+0x5532 0x7FAD  # <CJK>
+0x5533 0x7FB4  # <CJK>
+0x5534 0x7FBC  # <CJK>
+0x5535 0x7FBF  # <CJK>
+0x5536 0x7FC0  # <CJK>
+0x5537 0x7FC3  # <CJK>
+0x5538 0x7FC8  # <CJK>
+0x5539 0x7FCE  # <CJK>
+0x553A 0x7FCF  # <CJK>
+0x553B 0x7FDB  # <CJK>
+0x553C 0x7FDF  # <CJK>
+0x553D 0x7FE3  # <CJK>
+0x553E 0x7FE5  # <CJK>
+0x553F 0x7FE8  # <CJK>
+0x5540 0x7FEC  # <CJK>
+0x5541 0x7FEE  # <CJK>
+0x5542 0x7FEF  # <CJK>
+0x5543 0x7FF2  # <CJK>
+0x5544 0x7FFA  # <CJK>
+0x5545 0x7FFD  # <CJK>
+0x5546 0x7FFE  # <CJK>
+0x5547 0x7FFF  # <CJK>
+0x5548 0x8007  # <CJK>
+0x5549 0x8008  # <CJK>
+0x554A 0x800A  # <CJK>
+0x554B 0x800D  # <CJK>
+0x554C 0x800E  # <CJK>
+0x554D 0x800F  # <CJK>
+0x554E 0x8011  # <CJK>
+0x554F 0x8013  # <CJK>
+0x5550 0x8014  # <CJK>
+0x5551 0x8016  # <CJK>
+0x5552 0x801D  # <CJK>
+0x5553 0x801E  # <CJK>
+0x5554 0x801F  # <CJK>
+0x5555 0x8020  # <CJK>
+0x5556 0x8024  # <CJK>
+0x5557 0x8026  # <CJK>
+0x5558 0x802C  # <CJK>
+0x5559 0x802E  # <CJK>
+0x555A 0x8030  # <CJK>
+0x555B 0x8034  # <CJK>
+0x555C 0x8035  # <CJK>
+0x555D 0x8037  # <CJK>
+0x555E 0x8039  # <CJK>
+0x555F 0x803A  # <CJK>
+0x5560 0x803C  # <CJK>
+0x5561 0x803E  # <CJK>
+0x5562 0x8040  # <CJK>
+0x5563 0x8044  # <CJK>
+0x5564 0x8060  # <CJK>
+0x5565 0x8064  # <CJK>
+0x5566 0x8066  # <CJK>
+0x5567 0x806D  # <CJK>
+0x5568 0x8071  # <CJK>
+0x5569 0x8075  # <CJK>
+0x556A 0x8081  # <CJK>
+0x556B 0x8088  # <CJK>
+0x556C 0x808E  # <CJK>
+0x556D 0x809C  # <CJK>
+0x556E 0x809E  # <CJK>
+0x556F 0x80A6  # <CJK>
+0x5570 0x80A7  # <CJK>
+0x5571 0x80AB  # <CJK>
+0x5572 0x80B8  # <CJK>
+0x5573 0x80B9  # <CJK>
+0x5574 0x80C8  # <CJK>
+0x5575 0x80CD  # <CJK>
+0x5576 0x80CF  # <CJK>
+0x5577 0x80D2  # <CJK>
+0x5578 0x80D4  # <CJK>
+0x5579 0x80D5  # <CJK>
+0x557A 0x80D7  # <CJK>
+0x557B 0x80D8  # <CJK>
+0x557C 0x80E0  # <CJK>
+0x557D 0x80ED  # <CJK>
+0x557E 0x80EE  # <CJK>
+0x5621 0x80F0  # <CJK>
+0x5622 0x80F2  # <CJK>
+0x5623 0x80F3  # <CJK>
+0x5624 0x80F6  # <CJK>
+0x5625 0x80F9  # <CJK>
+0x5626 0x80FA  # <CJK>
+0x5627 0x80FE  # <CJK>
+0x5628 0x8103  # <CJK>
+0x5629 0x810B  # <CJK>
+0x562A 0x8116  # <CJK>
+0x562B 0x8117  # <CJK>
+0x562C 0x8118  # <CJK>
+0x562D 0x811C  # <CJK>
+0x562E 0x811E  # <CJK>
+0x562F 0x8120  # <CJK>
+0x5630 0x8124  # <CJK>
+0x5631 0x8127  # <CJK>
+0x5632 0x812C  # <CJK>
+0x5633 0x8130  # <CJK>
+0x5634 0x8135  # <CJK>
+0x5635 0x813A  # <CJK>
+0x5636 0x813C  # <CJK>
+0x5637 0x8145  # <CJK>
+0x5638 0x8147  # <CJK>
+0x5639 0x814A  # <CJK>
+0x563A 0x814C  # <CJK>
+0x563B 0x8152  # <CJK>
+0x563C 0x8157  # <CJK>
+0x563D 0x8160  # <CJK>
+0x563E 0x8161  # <CJK>
+0x563F 0x8167  # <CJK>
+0x5640 0x8168  # <CJK>
+0x5641 0x8169  # <CJK>
+0x5642 0x816D  # <CJK>
+0x5643 0x816F  # <CJK>
+0x5644 0x8177  # <CJK>
+0x5645 0x8181  # <CJK>
+0x5646 0x8190  # <CJK>
+0x5647 0x8184  # <CJK>
+0x5648 0x8185  # <CJK>
+0x5649 0x8186  # <CJK>
+0x564A 0x818B  # <CJK>
+0x564B 0x818E  # <CJK>
+0x564C 0x8196  # <CJK>
+0x564D 0x8198  # <CJK>
+0x564E 0x819B  # <CJK>
+0x564F 0x819E  # <CJK>
+0x5650 0x81A2  # <CJK>
+0x5651 0x81AE  # <CJK>
+0x5652 0x81B2  # <CJK>
+0x5653 0x81B4  # <CJK>
+0x5654 0x81BB  # <CJK>
+0x5655 0x81CB  # <CJK>
+0x5656 0x81C3  # <CJK>
+0x5657 0x81C5  # <CJK>
+0x5658 0x81CA  # <CJK>
+0x5659 0x81CE  # <CJK>
+0x565A 0x81CF  # <CJK>
+0x565B 0x81D5  # <CJK>
+0x565C 0x81D7  # <CJK>
+0x565D 0x81DB  # <CJK>
+0x565E 0x81DD  # <CJK>
+0x565F 0x81DE  # <CJK>
+0x5660 0x81E1  # <CJK>
+0x5661 0x81E4  # <CJK>
+0x5662 0x81EB  # <CJK>
+0x5663 0x81EC  # <CJK>
+0x5664 0x81F0  # <CJK>
+0x5665 0x81F1  # <CJK>
+0x5666 0x81F2  # <CJK>
+0x5667 0x81F5  # <CJK>
+0x5668 0x81F6  # <CJK>
+0x5669 0x81F8  # <CJK>
+0x566A 0x81F9  # <CJK>
+0x566B 0x81FD  # <CJK>
+0x566C 0x81FF  # <CJK>
+0x566D 0x8200  # <CJK>
+0x566E 0x8203  # <CJK>
+0x566F 0x820F  # <CJK>
+0x5670 0x8213  # <CJK>
+0x5671 0x8214  # <CJK>
+0x5672 0x8219  # <CJK>
+0x5673 0x821A  # <CJK>
+0x5674 0x821D  # <CJK>
+0x5675 0x8221  # <CJK>
+0x5676 0x8222  # <CJK>
+0x5677 0x8228  # <CJK>
+0x5678 0x8232  # <CJK>
+0x5679 0x8234  # <CJK>
+0x567A 0x823A  # <CJK>
+0x567B 0x8243  # <CJK>
+0x567C 0x8244  # <CJK>
+0x567D 0x8245  # <CJK>
+0x567E 0x8246  # <CJK>
+0x5721 0x824B  # <CJK>
+0x5722 0x824E  # <CJK>
+0x5723 0x824F  # <CJK>
+0x5724 0x8251  # <CJK>
+0x5725 0x8256  # <CJK>
+0x5726 0x825C  # <CJK>
+0x5727 0x8260  # <CJK>
+0x5728 0x8263  # <CJK>
+0x5729 0x8267  # <CJK>
+0x572A 0x826D  # <CJK>
+0x572B 0x8274  # <CJK>
+0x572C 0x827B  # <CJK>
+0x572D 0x827D  # <CJK>
+0x572E 0x827F  # <CJK>
+0x572F 0x8280  # <CJK>
+0x5730 0x8281  # <CJK>
+0x5731 0x8283  # <CJK>
+0x5732 0x8284  # <CJK>
+0x5733 0x8287  # <CJK>
+0x5734 0x8289  # <CJK>
+0x5735 0x828A  # <CJK>
+0x5736 0x828E  # <CJK>
+0x5737 0x8291  # <CJK>
+0x5738 0x8294  # <CJK>
+0x5739 0x8296  # <CJK>
+0x573A 0x8298  # <CJK>
+0x573B 0x829A  # <CJK>
+0x573C 0x829B  # <CJK>
+0x573D 0x82A0  # <CJK>
+0x573E 0x82A1  # <CJK>
+0x573F 0x82A3  # <CJK>
+0x5740 0x82A4  # <CJK>
+0x5741 0x82A7  # <CJK>
+0x5742 0x82A8  # <CJK>
+0x5743 0x82A9  # <CJK>
+0x5744 0x82AA  # <CJK>
+0x5745 0x82AE  # <CJK>
+0x5746 0x82B0  # <CJK>
+0x5747 0x82B2  # <CJK>
+0x5748 0x82B4  # <CJK>
+0x5749 0x82B7  # <CJK>
+0x574A 0x82BA  # <CJK>
+0x574B 0x82BC  # <CJK>
+0x574C 0x82BE  # <CJK>
+0x574D 0x82BF  # <CJK>
+0x574E 0x82C6  # <CJK>
+0x574F 0x82D0  # <CJK>
+0x5750 0x82D5  # <CJK>
+0x5751 0x82DA  # <CJK>
+0x5752 0x82E0  # <CJK>
+0x5753 0x82E2  # <CJK>
+0x5754 0x82E4  # <CJK>
+0x5755 0x82E8  # <CJK>
+0x5756 0x82EA  # <CJK>
+0x5757 0x82ED  # <CJK>
+0x5758 0x82EF  # <CJK>
+0x5759 0x82F6  # <CJK>
+0x575A 0x82F7  # <CJK>
+0x575B 0x82FD  # <CJK>
+0x575C 0x82FE  # <CJK>
+0x575D 0x8300  # <CJK>
+0x575E 0x8301  # <CJK>
+0x575F 0x8307  # <CJK>
+0x5760 0x8308  # <CJK>
+0x5761 0x830A  # <CJK>
+0x5762 0x830B  # <CJK>
+0x5763 0x8354  # <CJK>
+0x5764 0x831B  # <CJK>
+0x5765 0x831D  # <CJK>
+0x5766 0x831E  # <CJK>
+0x5767 0x831F  # <CJK>
+0x5768 0x8321  # <CJK>
+0x5769 0x8322  # <CJK>
+0x576A 0x832C  # <CJK>
+0x576B 0x832D  # <CJK>
+0x576C 0x832E  # <CJK>
+0x576D 0x8330  # <CJK>
+0x576E 0x8333  # <CJK>
+0x576F 0x8337  # <CJK>
+0x5770 0x833A  # <CJK>
+0x5771 0x833C  # <CJK>
+0x5772 0x833D  # <CJK>
+0x5773 0x8342  # <CJK>
+0x5774 0x8343  # <CJK>
+0x5775 0x8344  # <CJK>
+0x5776 0x8347  # <CJK>
+0x5777 0x834D  # <CJK>
+0x5778 0x834E  # <CJK>
+0x5779 0x8351  # <CJK>
+0x577A 0x8355  # <CJK>
+0x577B 0x8356  # <CJK>
+0x577C 0x8357  # <CJK>
+0x577D 0x8370  # <CJK>
+0x577E 0x8378  # <CJK>
+0x5821 0x837D  # <CJK>
+0x5822 0x837F  # <CJK>
+0x5823 0x8380  # <CJK>
+0x5824 0x8382  # <CJK>
+0x5825 0x8384  # <CJK>
+0x5826 0x8386  # <CJK>
+0x5827 0x838D  # <CJK>
+0x5828 0x8392  # <CJK>
+0x5829 0x8394  # <CJK>
+0x582A 0x8395  # <CJK>
+0x582B 0x8398  # <CJK>
+0x582C 0x8399  # <CJK>
+0x582D 0x839B  # <CJK>
+0x582E 0x839C  # <CJK>
+0x582F 0x839D  # <CJK>
+0x5830 0x83A6  # <CJK>
+0x5831 0x83A7  # <CJK>
+0x5832 0x83A9  # <CJK>
+0x5833 0x83AC  # <CJK>
+0x5834 0x83BE  # <CJK>
+0x5835 0x83BF  # <CJK>
+0x5836 0x83C0  # <CJK>
+0x5837 0x83C7  # <CJK>
+0x5838 0x83C9  # <CJK>
+0x5839 0x83CF  # <CJK>
+0x583A 0x83D0  # <CJK>
+0x583B 0x83D1  # <CJK>
+0x583C 0x83D4  # <CJK>
+0x583D 0x83DD  # <CJK>
+0x583E 0x8353  # <CJK>
+0x583F 0x83E8  # <CJK>
+0x5840 0x83EA  # <CJK>
+0x5841 0x83F6  # <CJK>
+0x5842 0x83F8  # <CJK>
+0x5843 0x83F9  # <CJK>
+0x5844 0x83FC  # <CJK>
+0x5845 0x8401  # <CJK>
+0x5846 0x8406  # <CJK>
+0x5847 0x840A  # <CJK>
+0x5848 0x840F  # <CJK>
+0x5849 0x8411  # <CJK>
+0x584A 0x8415  # <CJK>
+0x584B 0x8419  # <CJK>
+0x584C 0x83AD  # <CJK>
+0x584D 0x842F  # <CJK>
+0x584E 0x8439  # <CJK>
+0x584F 0x8445  # <CJK>
+0x5850 0x8447  # <CJK>
+0x5851 0x8448  # <CJK>
+0x5852 0x844A  # <CJK>
+0x5853 0x844D  # <CJK>
+0x5854 0x844F  # <CJK>
+0x5855 0x8451  # <CJK>
+0x5856 0x8452  # <CJK>
+0x5857 0x8456  # <CJK>
+0x5858 0x8458  # <CJK>
+0x5859 0x8459  # <CJK>
+0x585A 0x845A  # <CJK>
+0x585B 0x845C  # <CJK>
+0x585C 0x8460  # <CJK>
+0x585D 0x8464  # <CJK>
+0x585E 0x8465  # <CJK>
+0x585F 0x8467  # <CJK>
+0x5860 0x846A  # <CJK>
+0x5861 0x8470  # <CJK>
+0x5862 0x8473  # <CJK>
+0x5863 0x8474  # <CJK>
+0x5864 0x8476  # <CJK>
+0x5865 0x8478  # <CJK>
+0x5866 0x847C  # <CJK>
+0x5867 0x847D  # <CJK>
+0x5868 0x8481  # <CJK>
+0x5869 0x8485  # <CJK>
+0x586A 0x8492  # <CJK>
+0x586B 0x8493  # <CJK>
+0x586C 0x8495  # <CJK>
+0x586D 0x849E  # <CJK>
+0x586E 0x84A6  # <CJK>
+0x586F 0x84A8  # <CJK>
+0x5870 0x84A9  # <CJK>
+0x5871 0x84AA  # <CJK>
+0x5872 0x84AF  # <CJK>
+0x5873 0x84B1  # <CJK>
+0x5874 0x84B4  # <CJK>
+0x5875 0x84BA  # <CJK>
+0x5876 0x84BD  # <CJK>
+0x5877 0x84BE  # <CJK>
+0x5878 0x84C0  # <CJK>
+0x5879 0x84C2  # <CJK>
+0x587A 0x84C7  # <CJK>
+0x587B 0x84C8  # <CJK>
+0x587C 0x84CC  # <CJK>
+0x587D 0x84CF  # <CJK>
+0x587E 0x84D3  # <CJK>
+0x5921 0x84DC  # <CJK>
+0x5922 0x84E7  # <CJK>
+0x5923 0x84EA  # <CJK>
+0x5924 0x84EF  # <CJK>
+0x5925 0x84F0  # <CJK>
+0x5926 0x84F1  # <CJK>
+0x5927 0x84F2  # <CJK>
+0x5928 0x84F7  # <CJK>
+0x5929 0x8532  # <CJK>
+0x592A 0x84FA  # <CJK>
+0x592B 0x84FB  # <CJK>
+0x592C 0x84FD  # <CJK>
+0x592D 0x8502  # <CJK>
+0x592E 0x8503  # <CJK>
+0x592F 0x8507  # <CJK>
+0x5930 0x850C  # <CJK>
+0x5931 0x850E  # <CJK>
+0x5932 0x8510  # <CJK>
+0x5933 0x851C  # <CJK>
+0x5934 0x851E  # <CJK>
+0x5935 0x8522  # <CJK>
+0x5936 0x8523  # <CJK>
+0x5937 0x8524  # <CJK>
+0x5938 0x8525  # <CJK>
+0x5939 0x8527  # <CJK>
+0x593A 0x852A  # <CJK>
+0x593B 0x852B  # <CJK>
+0x593C 0x852F  # <CJK>
+0x593D 0x8533  # <CJK>
+0x593E 0x8534  # <CJK>
+0x593F 0x8536  # <CJK>
+0x5940 0x853F  # <CJK>
+0x5941 0x8546  # <CJK>
+0x5942 0x854F  # <CJK>
+0x5943 0x8550  # <CJK>
+0x5944 0x8551  # <CJK>
+0x5945 0x8552  # <CJK>
+0x5946 0x8553  # <CJK>
+0x5947 0x8556  # <CJK>
+0x5948 0x8559  # <CJK>
+0x5949 0x855C  # <CJK>
+0x594A 0x855D  # <CJK>
+0x594B 0x855E  # <CJK>
+0x594C 0x855F  # <CJK>
+0x594D 0x8560  # <CJK>
+0x594E 0x8561  # <CJK>
+0x594F 0x8562  # <CJK>
+0x5950 0x8564  # <CJK>
+0x5951 0x856B  # <CJK>
+0x5952 0x856F  # <CJK>
+0x5953 0x8579  # <CJK>
+0x5954 0x857A  # <CJK>
+0x5955 0x857B  # <CJK>
+0x5956 0x857D  # <CJK>
+0x5957 0x857F  # <CJK>
+0x5958 0x8581  # <CJK>
+0x5959 0x8585  # <CJK>
+0x595A 0x8586  # <CJK>
+0x595B 0x8589  # <CJK>
+0x595C 0x858B  # <CJK>
+0x595D 0x858C  # <CJK>
+0x595E 0x858F  # <CJK>
+0x595F 0x8593  # <CJK>
+0x5960 0x8598  # <CJK>
+0x5961 0x859D  # <CJK>
+0x5962 0x859F  # <CJK>
+0x5963 0x85A0  # <CJK>
+0x5964 0x85A2  # <CJK>
+0x5965 0x85A5  # <CJK>
+0x5966 0x85A7  # <CJK>
+0x5967 0x85B4  # <CJK>
+0x5968 0x85B6  # <CJK>
+0x5969 0x85B7  # <CJK>
+0x596A 0x85B8  # <CJK>
+0x596B 0x85BC  # <CJK>
+0x596C 0x85BD  # <CJK>
+0x596D 0x85BE  # <CJK>
+0x596E 0x85BF  # <CJK>
+0x596F 0x85C2  # <CJK>
+0x5970 0x85C7  # <CJK>
+0x5971 0x85CA  # <CJK>
+0x5972 0x85CB  # <CJK>
+0x5973 0x85CE  # <CJK>
+0x5974 0x85AD  # <CJK>
+0x5975 0x85D8  # <CJK>
+0x5976 0x85DA  # <CJK>
+0x5977 0x85DF  # <CJK>
+0x5978 0x85E0  # <CJK>
+0x5979 0x85E6  # <CJK>
+0x597A 0x85E8  # <CJK>
+0x597B 0x85ED  # <CJK>
+0x597C 0x85F3  # <CJK>
+0x597D 0x85F6  # <CJK>
+0x597E 0x85FC  # <CJK>
+0x5A21 0x85FF  # <CJK>
+0x5A22 0x8600  # <CJK>
+0x5A23 0x8604  # <CJK>
+0x5A24 0x8605  # <CJK>
+0x5A25 0x860D  # <CJK>
+0x5A26 0x860E  # <CJK>
+0x5A27 0x8610  # <CJK>
+0x5A28 0x8611  # <CJK>
+0x5A29 0x8612  # <CJK>
+0x5A2A 0x8618  # <CJK>
+0x5A2B 0x8619  # <CJK>
+0x5A2C 0x861B  # <CJK>
+0x5A2D 0x861E  # <CJK>
+0x5A2E 0x8621  # <CJK>
+0x5A2F 0x8627  # <CJK>
+0x5A30 0x8629  # <CJK>
+0x5A31 0x8636  # <CJK>
+0x5A32 0x8638  # <CJK>
+0x5A33 0x863A  # <CJK>
+0x5A34 0x863C  # <CJK>
+0x5A35 0x863D  # <CJK>
+0x5A36 0x8640  # <CJK>
+0x5A37 0x8642  # <CJK>
+0x5A38 0x8646  # <CJK>
+0x5A39 0x8652  # <CJK>
+0x5A3A 0x8653  # <CJK>
+0x5A3B 0x8656  # <CJK>
+0x5A3C 0x8657  # <CJK>
+0x5A3D 0x8658  # <CJK>
+0x5A3E 0x8659  # <CJK>
+0x5A3F 0x865D  # <CJK>
+0x5A40 0x8660  # <CJK>
+0x5A41 0x8661  # <CJK>
+0x5A42 0x8662  # <CJK>
+0x5A43 0x8663  # <CJK>
+0x5A44 0x8664  # <CJK>
+0x5A45 0x8669  # <CJK>
+0x5A46 0x866C  # <CJK>
+0x5A47 0x866F  # <CJK>
+0x5A48 0x8675  # <CJK>
+0x5A49 0x8676  # <CJK>
+0x5A4A 0x8677  # <CJK>
+0x5A4B 0x867A  # <CJK>
+0x5A4C 0x868D  # <CJK>
+0x5A4D 0x8691  # <CJK>
+0x5A4E 0x8696  # <CJK>
+0x5A4F 0x8698  # <CJK>
+0x5A50 0x869A  # <CJK>
+0x5A51 0x869C  # <CJK>
+0x5A52 0x86A1  # <CJK>
+0x5A53 0x86A6  # <CJK>
+0x5A54 0x86A7  # <CJK>
+0x5A55 0x86A8  # <CJK>
+0x5A56 0x86AD  # <CJK>
+0x5A57 0x86B1  # <CJK>
+0x5A58 0x86B3  # <CJK>
+0x5A59 0x86B4  # <CJK>
+0x5A5A 0x86B5  # <CJK>
+0x5A5B 0x86B7  # <CJK>
+0x5A5C 0x86B8  # <CJK>
+0x5A5D 0x86B9  # <CJK>
+0x5A5E 0x86BF  # <CJK>
+0x5A5F 0x86C0  # <CJK>
+0x5A60 0x86C1  # <CJK>
+0x5A61 0x86C3  # <CJK>
+0x5A62 0x86C5  # <CJK>
+0x5A63 0x86D1  # <CJK>
+0x5A64 0x86D2  # <CJK>
+0x5A65 0x86D5  # <CJK>
+0x5A66 0x86D7  # <CJK>
+0x5A67 0x86DA  # <CJK>
+0x5A68 0x86DC  # <CJK>
+0x5A69 0x86E0  # <CJK>
+0x5A6A 0x86E3  # <CJK>
+0x5A6B 0x86E5  # <CJK>
+0x5A6C 0x86E7  # <CJK>
+0x5A6D 0x8688  # <CJK>
+0x5A6E 0x86FA  # <CJK>
+0x5A6F 0x86FC  # <CJK>
+0x5A70 0x86FD  # <CJK>
+0x5A71 0x8704  # <CJK>
+0x5A72 0x8705  # <CJK>
+0x5A73 0x8707  # <CJK>
+0x5A74 0x870B  # <CJK>
+0x5A75 0x870E  # <CJK>
+0x5A76 0x870F  # <CJK>
+0x5A77 0x8710  # <CJK>
+0x5A78 0x8713  # <CJK>
+0x5A79 0x8714  # <CJK>
+0x5A7A 0x8719  # <CJK>
+0x5A7B 0x871E  # <CJK>
+0x5A7C 0x871F  # <CJK>
+0x5A7D 0x8721  # <CJK>
+0x5A7E 0x8723  # <CJK>
+0x5B21 0x8728  # <CJK>
+0x5B22 0x872E  # <CJK>
+0x5B23 0x872F  # <CJK>
+0x5B24 0x8731  # <CJK>
+0x5B25 0x8732  # <CJK>
+0x5B26 0x8739  # <CJK>
+0x5B27 0x873A  # <CJK>
+0x5B28 0x873C  # <CJK>
+0x5B29 0x873D  # <CJK>
+0x5B2A 0x873E  # <CJK>
+0x5B2B 0x8740  # <CJK>
+0x5B2C 0x8743  # <CJK>
+0x5B2D 0x8745  # <CJK>
+0x5B2E 0x874D  # <CJK>
+0x5B2F 0x8758  # <CJK>
+0x5B30 0x875D  # <CJK>
+0x5B31 0x8761  # <CJK>
+0x5B32 0x8764  # <CJK>
+0x5B33 0x8765  # <CJK>
+0x5B34 0x876F  # <CJK>
+0x5B35 0x8771  # <CJK>
+0x5B36 0x8772  # <CJK>
+0x5B37 0x877B  # <CJK>
+0x5B38 0x8783  # <CJK>
+0x5B39 0x8784  # <CJK>
+0x5B3A 0x8785  # <CJK>
+0x5B3B 0x8786  # <CJK>
+0x5B3C 0x8787  # <CJK>
+0x5B3D 0x8788  # <CJK>
+0x5B3E 0x8789  # <CJK>
+0x5B3F 0x878B  # <CJK>
+0x5B40 0x878C  # <CJK>
+0x5B41 0x8790  # <CJK>
+0x5B42 0x8793  # <CJK>
+0x5B43 0x8795  # <CJK>
+0x5B44 0x8797  # <CJK>
+0x5B45 0x8798  # <CJK>
+0x5B46 0x8799  # <CJK>
+0x5B47 0x879E  # <CJK>
+0x5B48 0x87A0  # <CJK>
+0x5B49 0x87A3  # <CJK>
+0x5B4A 0x87A7  # <CJK>
+0x5B4B 0x87AC  # <CJK>
+0x5B4C 0x87AD  # <CJK>
+0x5B4D 0x87AE  # <CJK>
+0x5B4E 0x87B1  # <CJK>
+0x5B4F 0x87B5  # <CJK>
+0x5B50 0x87BE  # <CJK>
+0x5B51 0x87BF  # <CJK>
+0x5B52 0x87C1  # <CJK>
+0x5B53 0x87C8  # <CJK>
+0x5B54 0x87C9  # <CJK>
+0x5B55 0x87CA  # <CJK>
+0x5B56 0x87CE  # <CJK>
+0x5B57 0x87D5  # <CJK>
+0x5B58 0x87D6  # <CJK>
+0x5B59 0x87D9  # <CJK>
+0x5B5A 0x87DA  # <CJK>
+0x5B5B 0x87DC  # <CJK>
+0x5B5C 0x87DF  # <CJK>
+0x5B5D 0x87E2  # <CJK>
+0x5B5E 0x87E3  # <CJK>
+0x5B5F 0x87E4  # <CJK>
+0x5B60 0x87EA  # <CJK>
+0x5B61 0x87EB  # <CJK>
+0x5B62 0x87ED  # <CJK>
+0x5B63 0x87F1  # <CJK>
+0x5B64 0x87F3  # <CJK>
+0x5B65 0x87F8  # <CJK>
+0x5B66 0x87FA  # <CJK>
+0x5B67 0x87FF  # <CJK>
+0x5B68 0x8801  # <CJK>
+0x5B69 0x8803  # <CJK>
+0x5B6A 0x8806  # <CJK>
+0x5B6B 0x8809  # <CJK>
+0x5B6C 0x880A  # <CJK>
+0x5B6D 0x880B  # <CJK>
+0x5B6E 0x8810  # <CJK>
+0x5B6F 0x8819  # <CJK>
+0x5B70 0x8812  # <CJK>
+0x5B71 0x8813  # <CJK>
+0x5B72 0x8814  # <CJK>
+0x5B73 0x8818  # <CJK>
+0x5B74 0x881A  # <CJK>
+0x5B75 0x881B  # <CJK>
+0x5B76 0x881C  # <CJK>
+0x5B77 0x881E  # <CJK>
+0x5B78 0x881F  # <CJK>
+0x5B79 0x8828  # <CJK>
+0x5B7A 0x882D  # <CJK>
+0x5B7B 0x882E  # <CJK>
+0x5B7C 0x8830  # <CJK>
+0x5B7D 0x8832  # <CJK>
+0x5B7E 0x8835  # <CJK>
+0x5C21 0x883A  # <CJK>
+0x5C22 0x883C  # <CJK>
+0x5C23 0x8841  # <CJK>
+0x5C24 0x8843  # <CJK>
+0x5C25 0x8845  # <CJK>
+0x5C26 0x8848  # <CJK>
+0x5C27 0x8849  # <CJK>
+0x5C28 0x884A  # <CJK>
+0x5C29 0x884B  # <CJK>
+0x5C2A 0x884E  # <CJK>
+0x5C2B 0x8851  # <CJK>
+0x5C2C 0x8855  # <CJK>
+0x5C2D 0x8856  # <CJK>
+0x5C2E 0x8858  # <CJK>
+0x5C2F 0x885A  # <CJK>
+0x5C30 0x885C  # <CJK>
+0x5C31 0x885F  # <CJK>
+0x5C32 0x8860  # <CJK>
+0x5C33 0x8864  # <CJK>
+0x5C34 0x8869  # <CJK>
+0x5C35 0x8871  # <CJK>
+0x5C36 0x8879  # <CJK>
+0x5C37 0x887B  # <CJK>
+0x5C38 0x8880  # <CJK>
+0x5C39 0x8898  # <CJK>
+0x5C3A 0x889A  # <CJK>
+0x5C3B 0x889B  # <CJK>
+0x5C3C 0x889C  # <CJK>
+0x5C3D 0x889F  # <CJK>
+0x5C3E 0x88A0  # <CJK>
+0x5C3F 0x88A8  # <CJK>
+0x5C40 0x88AA  # <CJK>
+0x5C41 0x88BA  # <CJK>
+0x5C42 0x88BD  # <CJK>
+0x5C43 0x88BE  # <CJK>
+0x5C44 0x88C0  # <CJK>
+0x5C45 0x88CA  # <CJK>
+0x5C46 0x88CB  # <CJK>
+0x5C47 0x88CC  # <CJK>
+0x5C48 0x88CD  # <CJK>
+0x5C49 0x88CE  # <CJK>
+0x5C4A 0x88D1  # <CJK>
+0x5C4B 0x88D2  # <CJK>
+0x5C4C 0x88D3  # <CJK>
+0x5C4D 0x88DB  # <CJK>
+0x5C4E 0x88DE  # <CJK>
+0x5C4F 0x88E7  # <CJK>
+0x5C50 0x88EF  # <CJK>
+0x5C51 0x88F0  # <CJK>
+0x5C52 0x88F1  # <CJK>
+0x5C53 0x88F5  # <CJK>
+0x5C54 0x88F7  # <CJK>
+0x5C55 0x8901  # <CJK>
+0x5C56 0x8906  # <CJK>
+0x5C57 0x890D  # <CJK>
+0x5C58 0x890E  # <CJK>
+0x5C59 0x890F  # <CJK>
+0x5C5A 0x8915  # <CJK>
+0x5C5B 0x8916  # <CJK>
+0x5C5C 0x8918  # <CJK>
+0x5C5D 0x8919  # <CJK>
+0x5C5E 0x891A  # <CJK>
+0x5C5F 0x891C  # <CJK>
+0x5C60 0x8920  # <CJK>
+0x5C61 0x8926  # <CJK>
+0x5C62 0x8927  # <CJK>
+0x5C63 0x8928  # <CJK>
+0x5C64 0x8930  # <CJK>
+0x5C65 0x8931  # <CJK>
+0x5C66 0x8932  # <CJK>
+0x5C67 0x8935  # <CJK>
+0x5C68 0x8939  # <CJK>
+0x5C69 0x893A  # <CJK>
+0x5C6A 0x893E  # <CJK>
+0x5C6B 0x8940  # <CJK>
+0x5C6C 0x8942  # <CJK>
+0x5C6D 0x8945  # <CJK>
+0x5C6E 0x8946  # <CJK>
+0x5C6F 0x8949  # <CJK>
+0x5C70 0x894F  # <CJK>
+0x5C71 0x8952  # <CJK>
+0x5C72 0x8957  # <CJK>
+0x5C73 0x895A  # <CJK>
+0x5C74 0x895B  # <CJK>
+0x5C75 0x895C  # <CJK>
+0x5C76 0x8961  # <CJK>
+0x5C77 0x8962  # <CJK>
+0x5C78 0x8963  # <CJK>
+0x5C79 0x896B  # <CJK>
+0x5C7A 0x896E  # <CJK>
+0x5C7B 0x8970  # <CJK>
+0x5C7C 0x8973  # <CJK>
+0x5C7D 0x8975  # <CJK>
+0x5C7E 0x897A  # <CJK>
+0x5D21 0x897B  # <CJK>
+0x5D22 0x897C  # <CJK>
+0x5D23 0x897D  # <CJK>
+0x5D24 0x8989  # <CJK>
+0x5D25 0x898D  # <CJK>
+0x5D26 0x8990  # <CJK>
+0x5D27 0x8994  # <CJK>
+0x5D28 0x8995  # <CJK>
+0x5D29 0x899B  # <CJK>
+0x5D2A 0x899C  # <CJK>
+0x5D2B 0x899F  # <CJK>
+0x5D2C 0x89A0  # <CJK>
+0x5D2D 0x89A5  # <CJK>
+0x5D2E 0x89B0  # <CJK>
+0x5D2F 0x89B4  # <CJK>
+0x5D30 0x89B5  # <CJK>
+0x5D31 0x89B6  # <CJK>
+0x5D32 0x89B7  # <CJK>
+0x5D33 0x89BC  # <CJK>
+0x5D34 0x89D4  # <CJK>
+0x5D35 0x89D5  # <CJK>
+0x5D36 0x89D6  # <CJK>
+0x5D37 0x89D7  # <CJK>
+0x5D38 0x89D8  # <CJK>
+0x5D39 0x89E5  # <CJK>
+0x5D3A 0x89E9  # <CJK>
+0x5D3B 0x89EB  # <CJK>
+0x5D3C 0x89ED  # <CJK>
+0x5D3D 0x89F1  # <CJK>
+0x5D3E 0x89F3  # <CJK>
+0x5D3F 0x89F6  # <CJK>
+0x5D40 0x89F9  # <CJK>
+0x5D41 0x89FD  # <CJK>
+0x5D42 0x89FF  # <CJK>
+0x5D43 0x8A04  # <CJK>
+0x5D44 0x8A05  # <CJK>
+0x5D45 0x8A07  # <CJK>
+0x5D46 0x8A0F  # <CJK>
+0x5D47 0x8A11  # <CJK>
+0x5D48 0x8A12  # <CJK>
+0x5D49 0x8A14  # <CJK>
+0x5D4A 0x8A15  # <CJK>
+0x5D4B 0x8A1E  # <CJK>
+0x5D4C 0x8A20  # <CJK>
+0x5D4D 0x8A22  # <CJK>
+0x5D4E 0x8A24  # <CJK>
+0x5D4F 0x8A26  # <CJK>
+0x5D50 0x8A2B  # <CJK>
+0x5D51 0x8A2C  # <CJK>
+0x5D52 0x8A2F  # <CJK>
+0x5D53 0x8A35  # <CJK>
+0x5D54 0x8A37  # <CJK>
+0x5D55 0x8A3D  # <CJK>
+0x5D56 0x8A3E  # <CJK>
+0x5D57 0x8A40  # <CJK>
+0x5D58 0x8A43  # <CJK>
+0x5D59 0x8A45  # <CJK>
+0x5D5A 0x8A47  # <CJK>
+0x5D5B 0x8A49  # <CJK>
+0x5D5C 0x8A4D  # <CJK>
+0x5D5D 0x8A4E  # <CJK>
+0x5D5E 0x8A53  # <CJK>
+0x5D5F 0x8A56  # <CJK>
+0x5D60 0x8A57  # <CJK>
+0x5D61 0x8A58  # <CJK>
+0x5D62 0x8A5C  # <CJK>
+0x5D63 0x8A5D  # <CJK>
+0x5D64 0x8A61  # <CJK>
+0x5D65 0x8A65  # <CJK>
+0x5D66 0x8A67  # <CJK>
+0x5D67 0x8A75  # <CJK>
+0x5D68 0x8A76  # <CJK>
+0x5D69 0x8A77  # <CJK>
+0x5D6A 0x8A79  # <CJK>
+0x5D6B 0x8A7A  # <CJK>
+0x5D6C 0x8A7B  # <CJK>
+0x5D6D 0x8A7E  # <CJK>
+0x5D6E 0x8A7F  # <CJK>
+0x5D6F 0x8A80  # <CJK>
+0x5D70 0x8A83  # <CJK>
+0x5D71 0x8A86  # <CJK>
+0x5D72 0x8A8B  # <CJK>
+0x5D73 0x8A8F  # <CJK>
+0x5D74 0x8A90  # <CJK>
+0x5D75 0x8A92  # <CJK>
+0x5D76 0x8A96  # <CJK>
+0x5D77 0x8A97  # <CJK>
+0x5D78 0x8A99  # <CJK>
+0x5D79 0x8A9F  # <CJK>
+0x5D7A 0x8AA7  # <CJK>
+0x5D7B 0x8AA9  # <CJK>
+0x5D7C 0x8AAE  # <CJK>
+0x5D7D 0x8AAF  # <CJK>
+0x5D7E 0x8AB3  # <CJK>
+0x5E21 0x8AB6  # <CJK>
+0x5E22 0x8AB7  # <CJK>
+0x5E23 0x8ABB  # <CJK>
+0x5E24 0x8ABE  # <CJK>
+0x5E25 0x8AC3  # <CJK>
+0x5E26 0x8AC6  # <CJK>
+0x5E27 0x8AC8  # <CJK>
+0x5E28 0x8AC9  # <CJK>
+0x5E29 0x8ACA  # <CJK>
+0x5E2A 0x8AD1  # <CJK>
+0x5E2B 0x8AD3  # <CJK>
+0x5E2C 0x8AD4  # <CJK>
+0x5E2D 0x8AD5  # <CJK>
+0x5E2E 0x8AD7  # <CJK>
+0x5E2F 0x8ADD  # <CJK>
+0x5E30 0x8ADF  # <CJK>
+0x5E31 0x8AEC  # <CJK>
+0x5E32 0x8AF0  # <CJK>
+0x5E33 0x8AF4  # <CJK>
+0x5E34 0x8AF5  # <CJK>
+0x5E35 0x8AF6  # <CJK>
+0x5E36 0x8AFC  # <CJK>
+0x5E37 0x8AFF  # <CJK>
+0x5E38 0x8B05  # <CJK>
+0x5E39 0x8B06  # <CJK>
+0x5E3A 0x8B0B  # <CJK>
+0x5E3B 0x8B11  # <CJK>
+0x5E3C 0x8B1C  # <CJK>
+0x5E3D 0x8B1E  # <CJK>
+0x5E3E 0x8B1F  # <CJK>
+0x5E3F 0x8B0A  # <CJK>
+0x5E40 0x8B2D  # <CJK>
+0x5E41 0x8B30  # <CJK>
+0x5E42 0x8B37  # <CJK>
+0x5E43 0x8B3C  # <CJK>
+0x5E44 0x8B42  # <CJK>
+0x5E45 0x8B43  # <CJK>
+0x5E46 0x8B44  # <CJK>
+0x5E47 0x8B45  # <CJK>
+0x5E48 0x8B46  # <CJK>
+0x5E49 0x8B48  # <CJK>
+0x5E4A 0x8B52  # <CJK>
+0x5E4B 0x8B53  # <CJK>
+0x5E4C 0x8B54  # <CJK>
+0x5E4D 0x8B59  # <CJK>
+0x5E4E 0x8B4D  # <CJK>
+0x5E4F 0x8B5E  # <CJK>
+0x5E50 0x8B63  # <CJK>
+0x5E51 0x8B6D  # <CJK>
+0x5E52 0x8B76  # <CJK>
+0x5E53 0x8B78  # <CJK>
+0x5E54 0x8B79  # <CJK>
+0x5E55 0x8B7C  # <CJK>
+0x5E56 0x8B7E  # <CJK>
+0x5E57 0x8B81  # <CJK>
+0x5E58 0x8B84  # <CJK>
+0x5E59 0x8B85  # <CJK>
+0x5E5A 0x8B8B  # <CJK>
+0x5E5B 0x8B8D  # <CJK>
+0x5E5C 0x8B8F  # <CJK>
+0x5E5D 0x8B94  # <CJK>
+0x5E5E 0x8B95  # <CJK>
+0x5E5F 0x8B9C  # <CJK>
+0x5E60 0x8B9E  # <CJK>
+0x5E61 0x8B9F  # <CJK>
+0x5E62 0x8C38  # <CJK>
+0x5E63 0x8C39  # <CJK>
+0x5E64 0x8C3D  # <CJK>
+0x5E65 0x8C3E  # <CJK>
+0x5E66 0x8C45  # <CJK>
+0x5E67 0x8C47  # <CJK>
+0x5E68 0x8C49  # <CJK>
+0x5E69 0x8C4B  # <CJK>
+0x5E6A 0x8C4F  # <CJK>
+0x5E6B 0x8C51  # <CJK>
+0x5E6C 0x8C53  # <CJK>
+0x5E6D 0x8C54  # <CJK>
+0x5E6E 0x8C57  # <CJK>
+0x5E6F 0x8C58  # <CJK>
+0x5E70 0x8C5B  # <CJK>
+0x5E71 0x8C5D  # <CJK>
+0x5E72 0x8C59  # <CJK>
+0x5E73 0x8C63  # <CJK>
+0x5E74 0x8C64  # <CJK>
+0x5E75 0x8C66  # <CJK>
+0x5E76 0x8C68  # <CJK>
+0x5E77 0x8C69  # <CJK>
+0x5E78 0x8C6D  # <CJK>
+0x5E79 0x8C73  # <CJK>
+0x5E7A 0x8C75  # <CJK>
+0x5E7B 0x8C76  # <CJK>
+0x5E7C 0x8C7B  # <CJK>
+0x5E7D 0x8C7E  # <CJK>
+0x5E7E 0x8C86  # <CJK>
+0x5F21 0x8C87  # <CJK>
+0x5F22 0x8C8B  # <CJK>
+0x5F23 0x8C90  # <CJK>
+0x5F24 0x8C92  # <CJK>
+0x5F25 0x8C93  # <CJK>
+0x5F26 0x8C99  # <CJK>
+0x5F27 0x8C9B  # <CJK>
+0x5F28 0x8C9C  # <CJK>
+0x5F29 0x8CA4  # <CJK>
+0x5F2A 0x8CB9  # <CJK>
+0x5F2B 0x8CBA  # <CJK>
+0x5F2C 0x8CC5  # <CJK>
+0x5F2D 0x8CC6  # <CJK>
+0x5F2E 0x8CC9  # <CJK>
+0x5F2F 0x8CCB  # <CJK>
+0x5F30 0x8CCF  # <CJK>
+0x5F31 0x8CD6  # <CJK>
+0x5F32 0x8CD5  # <CJK>
+0x5F33 0x8CD9  # <CJK>
+0x5F34 0x8CDD  # <CJK>
+0x5F35 0x8CE1  # <CJK>
+0x5F36 0x8CE8  # <CJK>
+0x5F37 0x8CEC  # <CJK>
+0x5F38 0x8CEF  # <CJK>
+0x5F39 0x8CF0  # <CJK>
+0x5F3A 0x8CF2  # <CJK>
+0x5F3B 0x8CF5  # <CJK>
+0x5F3C 0x8CF7  # <CJK>
+0x5F3D 0x8CF8  # <CJK>
+0x5F3E 0x8CFE  # <CJK>
+0x5F3F 0x8CFF  # <CJK>
+0x5F40 0x8D01  # <CJK>
+0x5F41 0x8D03  # <CJK>
+0x5F42 0x8D09  # <CJK>
+0x5F43 0x8D12  # <CJK>
+0x5F44 0x8D17  # <CJK>
+0x5F45 0x8D1B  # <CJK>
+0x5F46 0x8D65  # <CJK>
+0x5F47 0x8D69  # <CJK>
+0x5F48 0x8D6C  # <CJK>
+0x5F49 0x8D6E  # <CJK>
+0x5F4A 0x8D7F  # <CJK>
+0x5F4B 0x8D82  # <CJK>
+0x5F4C 0x8D84  # <CJK>
+0x5F4D 0x8D88  # <CJK>
+0x5F4E 0x8D8D  # <CJK>
+0x5F4F 0x8D90  # <CJK>
+0x5F50 0x8D91  # <CJK>
+0x5F51 0x8D95  # <CJK>
+0x5F52 0x8D9E  # <CJK>
+0x5F53 0x8D9F  # <CJK>
+0x5F54 0x8DA0  # <CJK>
+0x5F55 0x8DA6  # <CJK>
+0x5F56 0x8DAB  # <CJK>
+0x5F57 0x8DAC  # <CJK>
+0x5F58 0x8DAF  # <CJK>
+0x5F59 0x8DB2  # <CJK>
+0x5F5A 0x8DB5  # <CJK>
+0x5F5B 0x8DB7  # <CJK>
+0x5F5C 0x8DB9  # <CJK>
+0x5F5D 0x8DBB  # <CJK>
+0x5F5E 0x8DC0  # <CJK>
+0x5F5F 0x8DC5  # <CJK>
+0x5F60 0x8DC6  # <CJK>
+0x5F61 0x8DC7  # <CJK>
+0x5F62 0x8DC8  # <CJK>
+0x5F63 0x8DCA  # <CJK>
+0x5F64 0x8DCE  # <CJK>
+0x5F65 0x8DD1  # <CJK>
+0x5F66 0x8DD4  # <CJK>
+0x5F67 0x8DD5  # <CJK>
+0x5F68 0x8DD7  # <CJK>
+0x5F69 0x8DD9  # <CJK>
+0x5F6A 0x8DE4  # <CJK>
+0x5F6B 0x8DE5  # <CJK>
+0x5F6C 0x8DE7  # <CJK>
+0x5F6D 0x8DEC  # <CJK>
+0x5F6E 0x8DF0  # <CJK>
+0x5F6F 0x8DBC  # <CJK>
+0x5F70 0x8DF1  # <CJK>
+0x5F71 0x8DF2  # <CJK>
+0x5F72 0x8DF4  # <CJK>
+0x5F73 0x8DFD  # <CJK>
+0x5F74 0x8E01  # <CJK>
+0x5F75 0x8E04  # <CJK>
+0x5F76 0x8E05  # <CJK>
+0x5F77 0x8E06  # <CJK>
+0x5F78 0x8E0B  # <CJK>
+0x5F79 0x8E11  # <CJK>
+0x5F7A 0x8E14  # <CJK>
+0x5F7B 0x8E16  # <CJK>
+0x5F7C 0x8E20  # <CJK>
+0x5F7D 0x8E21  # <CJK>
+0x5F7E 0x8E22  # <CJK>
+0x6021 0x8E23  # <CJK>
+0x6022 0x8E26  # <CJK>
+0x6023 0x8E27  # <CJK>
+0x6024 0x8E31  # <CJK>
+0x6025 0x8E33  # <CJK>
+0x6026 0x8E36  # <CJK>
+0x6027 0x8E37  # <CJK>
+0x6028 0x8E38  # <CJK>
+0x6029 0x8E39  # <CJK>
+0x602A 0x8E3D  # <CJK>
+0x602B 0x8E40  # <CJK>
+0x602C 0x8E41  # <CJK>
+0x602D 0x8E4B  # <CJK>
+0x602E 0x8E4D  # <CJK>
+0x602F 0x8E4E  # <CJK>
+0x6030 0x8E4F  # <CJK>
+0x6031 0x8E54  # <CJK>
+0x6032 0x8E5B  # <CJK>
+0x6033 0x8E5C  # <CJK>
+0x6034 0x8E5D  # <CJK>
+0x6035 0x8E5E  # <CJK>
+0x6036 0x8E61  # <CJK>
+0x6037 0x8E62  # <CJK>
+0x6038 0x8E69  # <CJK>
+0x6039 0x8E6C  # <CJK>
+0x603A 0x8E6D  # <CJK>
+0x603B 0x8E6F  # <CJK>
+0x603C 0x8E70  # <CJK>
+0x603D 0x8E71  # <CJK>
+0x603E 0x8E79  # <CJK>
+0x603F 0x8E7A  # <CJK>
+0x6040 0x8E7B  # <CJK>
+0x6041 0x8E82  # <CJK>
+0x6042 0x8E83  # <CJK>
+0x6043 0x8E89  # <CJK>
+0x6044 0x8E90  # <CJK>
+0x6045 0x8E92  # <CJK>
+0x6046 0x8E95  # <CJK>
+0x6047 0x8E9A  # <CJK>
+0x6048 0x8E9B  # <CJK>
+0x6049 0x8E9D  # <CJK>
+0x604A 0x8E9E  # <CJK>
+0x604B 0x8EA2  # <CJK>
+0x604C 0x8EA7  # <CJK>
+0x604D 0x8EA9  # <CJK>
+0x604E 0x8EAD  # <CJK>
+0x604F 0x8EAE  # <CJK>
+0x6050 0x8EB3  # <CJK>
+0x6051 0x8EB5  # <CJK>
+0x6052 0x8EBA  # <CJK>
+0x6053 0x8EBB  # <CJK>
+0x6054 0x8EC0  # <CJK>
+0x6055 0x8EC1  # <CJK>
+0x6056 0x8EC3  # <CJK>
+0x6057 0x8EC4  # <CJK>
+0x6058 0x8EC7  # <CJK>
+0x6059 0x8ECF  # <CJK>
+0x605A 0x8ED1  # <CJK>
+0x605B 0x8ED4  # <CJK>
+0x605C 0x8EDC  # <CJK>
+0x605D 0x8EE8  # <CJK>
+0x605E 0x8EEE  # <CJK>
+0x605F 0x8EF0  # <CJK>
+0x6060 0x8EF1  # <CJK>
+0x6061 0x8EF7  # <CJK>
+0x6062 0x8EF9  # <CJK>
+0x6063 0x8EFA  # <CJK>
+0x6064 0x8EED  # <CJK>
+0x6065 0x8F00  # <CJK>
+0x6066 0x8F02  # <CJK>
+0x6067 0x8F07  # <CJK>
+0x6068 0x8F08  # <CJK>
+0x6069 0x8F0F  # <CJK>
+0x606A 0x8F10  # <CJK>
+0x606B 0x8F16  # <CJK>
+0x606C 0x8F17  # <CJK>
+0x606D 0x8F18  # <CJK>
+0x606E 0x8F1E  # <CJK>
+0x606F 0x8F20  # <CJK>
+0x6070 0x8F21  # <CJK>
+0x6071 0x8F23  # <CJK>
+0x6072 0x8F25  # <CJK>
+0x6073 0x8F27  # <CJK>
+0x6074 0x8F28  # <CJK>
+0x6075 0x8F2C  # <CJK>
+0x6076 0x8F2D  # <CJK>
+0x6077 0x8F2E  # <CJK>
+0x6078 0x8F34  # <CJK>
+0x6079 0x8F35  # <CJK>
+0x607A 0x8F36  # <CJK>
+0x607B 0x8F37  # <CJK>
+0x607C 0x8F3A  # <CJK>
+0x607D 0x8F40  # <CJK>
+0x607E 0x8F41  # <CJK>
+0x6121 0x8F43  # <CJK>
+0x6122 0x8F47  # <CJK>
+0x6123 0x8F4F  # <CJK>
+0x6124 0x8F51  # <CJK>
+0x6125 0x8F52  # <CJK>
+0x6126 0x8F53  # <CJK>
+0x6127 0x8F54  # <CJK>
+0x6128 0x8F55  # <CJK>
+0x6129 0x8F58  # <CJK>
+0x612A 0x8F5D  # <CJK>
+0x612B 0x8F5E  # <CJK>
+0x612C 0x8F65  # <CJK>
+0x612D 0x8F9D  # <CJK>
+0x612E 0x8FA0  # <CJK>
+0x612F 0x8FA1  # <CJK>
+0x6130 0x8FA4  # <CJK>
+0x6131 0x8FA5  # <CJK>
+0x6132 0x8FA6  # <CJK>
+0x6133 0x8FB5  # <CJK>
+0x6134 0x8FB6  # <CJK>
+0x6135 0x8FB8  # <CJK>
+0x6136 0x8FBE  # <CJK>
+0x6137 0x8FC0  # <CJK>
+0x6138 0x8FC1  # <CJK>
+0x6139 0x8FC6  # <CJK>
+0x613A 0x8FCA  # <CJK>
+0x613B 0x8FCB  # <CJK>
+0x613C 0x8FCD  # <CJK>
+0x613D 0x8FD0  # <CJK>
+0x613E 0x8FD2  # <CJK>
+0x613F 0x8FD3  # <CJK>
+0x6140 0x8FD5  # <CJK>
+0x6141 0x8FE0  # <CJK>
+0x6142 0x8FE3  # <CJK>
+0x6143 0x8FE4  # <CJK>
+0x6144 0x8FE8  # <CJK>
+0x6145 0x8FEE  # <CJK>
+0x6146 0x8FF1  # <CJK>
+0x6147 0x8FF5  # <CJK>
+0x6148 0x8FF6  # <CJK>
+0x6149 0x8FFB  # <CJK>
+0x614A 0x8FFE  # <CJK>
+0x614B 0x9002  # <CJK>
+0x614C 0x9004  # <CJK>
+0x614D 0x9008  # <CJK>
+0x614E 0x900C  # <CJK>
+0x614F 0x9018  # <CJK>
+0x6150 0x901B  # <CJK>
+0x6151 0x9028  # <CJK>
+0x6152 0x9029  # <CJK>
+0x6153 0x902F  # <CJK>
+0x6154 0x902A  # <CJK>
+0x6155 0x902C  # <CJK>
+0x6156 0x902D  # <CJK>
+0x6157 0x9033  # <CJK>
+0x6158 0x9034  # <CJK>
+0x6159 0x9037  # <CJK>
+0x615A 0x903F  # <CJK>
+0x615B 0x9043  # <CJK>
+0x615C 0x9044  # <CJK>
+0x615D 0x904C  # <CJK>
+0x615E 0x905B  # <CJK>
+0x615F 0x905D  # <CJK>
+0x6160 0x9062  # <CJK>
+0x6161 0x9066  # <CJK>
+0x6162 0x9067  # <CJK>
+0x6163 0x906C  # <CJK>
+0x6164 0x9070  # <CJK>
+0x6165 0x9074  # <CJK>
+0x6166 0x9079  # <CJK>
+0x6167 0x9085  # <CJK>
+0x6168 0x9088  # <CJK>
+0x6169 0x908B  # <CJK>
+0x616A 0x908C  # <CJK>
+0x616B 0x908E  # <CJK>
+0x616C 0x9090  # <CJK>
+0x616D 0x9095  # <CJK>
+0x616E 0x9097  # <CJK>
+0x616F 0x9098  # <CJK>
+0x6170 0x9099  # <CJK>
+0x6171 0x909B  # <CJK>
+0x6172 0x90A0  # <CJK>
+0x6173 0x90A1  # <CJK>
+0x6174 0x90A2  # <CJK>
+0x6175 0x90A5  # <CJK>
+0x6176 0x90B0  # <CJK>
+0x6177 0x90B2  # <CJK>
+0x6178 0x90B3  # <CJK>
+0x6179 0x90B4  # <CJK>
+0x617A 0x90B6  # <CJK>
+0x617B 0x90BD  # <CJK>
+0x617C 0x90CC  # <CJK>
+0x617D 0x90BE  # <CJK>
+0x617E 0x90C3  # <CJK>
+0x6221 0x90C4  # <CJK>
+0x6222 0x90C5  # <CJK>
+0x6223 0x90C7  # <CJK>
+0x6224 0x90C8  # <CJK>
+0x6225 0x90D5  # <CJK>
+0x6226 0x90D7  # <CJK>
+0x6227 0x90D8  # <CJK>
+0x6228 0x90D9  # <CJK>
+0x6229 0x90DC  # <CJK>
+0x622A 0x90DD  # <CJK>
+0x622B 0x90DF  # <CJK>
+0x622C 0x90E5  # <CJK>
+0x622D 0x90D2  # <CJK>
+0x622E 0x90F6  # <CJK>
+0x622F 0x90EB  # <CJK>
+0x6230 0x90EF  # <CJK>
+0x6231 0x90F0  # <CJK>
+0x6232 0x90F4  # <CJK>
+0x6233 0x90FE  # <CJK>
+0x6234 0x90FF  # <CJK>
+0x6235 0x9100  # <CJK>
+0x6236 0x9104  # <CJK>
+0x6237 0x9105  # <CJK>
+0x6238 0x9106  # <CJK>
+0x6239 0x9108  # <CJK>
+0x623A 0x910D  # <CJK>
+0x623B 0x9110  # <CJK>
+0x623C 0x9114  # <CJK>
+0x623D 0x9116  # <CJK>
+0x623E 0x9117  # <CJK>
+0x623F 0x9118  # <CJK>
+0x6240 0x911A  # <CJK>
+0x6241 0x911C  # <CJK>
+0x6242 0x911E  # <CJK>
+0x6243 0x9120  # <CJK>
+0x6244 0x9125  # <CJK>
+0x6245 0x9122  # <CJK>
+0x6246 0x9123  # <CJK>
+0x6247 0x9127  # <CJK>
+0x6248 0x9129  # <CJK>
+0x6249 0x912E  # <CJK>
+0x624A 0x912F  # <CJK>
+0x624B 0x9131  # <CJK>
+0x624C 0x9134  # <CJK>
+0x624D 0x9136  # <CJK>
+0x624E 0x9137  # <CJK>
+0x624F 0x9139  # <CJK>
+0x6250 0x913A  # <CJK>
+0x6251 0x913C  # <CJK>
+0x6252 0x913D  # <CJK>
+0x6253 0x9143  # <CJK>
+0x6254 0x9147  # <CJK>
+0x6255 0x9148  # <CJK>
+0x6256 0x914F  # <CJK>
+0x6257 0x9153  # <CJK>
+0x6258 0x9157  # <CJK>
+0x6259 0x9159  # <CJK>
+0x625A 0x915A  # <CJK>
+0x625B 0x915B  # <CJK>
+0x625C 0x9161  # <CJK>
+0x625D 0x9164  # <CJK>
+0x625E 0x9167  # <CJK>
+0x625F 0x916D  # <CJK>
+0x6260 0x9174  # <CJK>
+0x6261 0x9179  # <CJK>
+0x6262 0x917A  # <CJK>
+0x6263 0x917B  # <CJK>
+0x6264 0x9181  # <CJK>
+0x6265 0x9183  # <CJK>
+0x6266 0x9185  # <CJK>
+0x6267 0x9186  # <CJK>
+0x6268 0x918A  # <CJK>
+0x6269 0x918E  # <CJK>
+0x626A 0x9191  # <CJK>
+0x626B 0x9193  # <CJK>
+0x626C 0x9194  # <CJK>
+0x626D 0x9195  # <CJK>
+0x626E 0x9198  # <CJK>
+0x626F 0x919E  # <CJK>
+0x6270 0x91A1  # <CJK>
+0x6271 0x91A6  # <CJK>
+0x6272 0x91A8  # <CJK>
+0x6273 0x91AC  # <CJK>
+0x6274 0x91AD  # <CJK>
+0x6275 0x91AE  # <CJK>
+0x6276 0x91B0  # <CJK>
+0x6277 0x91B1  # <CJK>
+0x6278 0x91B2  # <CJK>
+0x6279 0x91B3  # <CJK>
+0x627A 0x91B6  # <CJK>
+0x627B 0x91BB  # <CJK>
+0x627C 0x91BC  # <CJK>
+0x627D 0x91BD  # <CJK>
+0x627E 0x91BF  # <CJK>
+0x6321 0x91C2  # <CJK>
+0x6322 0x91C3  # <CJK>
+0x6323 0x91C5  # <CJK>
+0x6324 0x91D3  # <CJK>
+0x6325 0x91D4  # <CJK>
+0x6326 0x91D7  # <CJK>
+0x6327 0x91D9  # <CJK>
+0x6328 0x91DA  # <CJK>
+0x6329 0x91DE  # <CJK>
+0x632A 0x91E4  # <CJK>
+0x632B 0x91E5  # <CJK>
+0x632C 0x91E9  # <CJK>
+0x632D 0x91EA  # <CJK>
+0x632E 0x91EC  # <CJK>
+0x632F 0x91ED  # <CJK>
+0x6330 0x91EE  # <CJK>
+0x6331 0x91EF  # <CJK>
+0x6332 0x91F0  # <CJK>
+0x6333 0x91F1  # <CJK>
+0x6334 0x91F7  # <CJK>
+0x6335 0x91F9  # <CJK>
+0x6336 0x91FB  # <CJK>
+0x6337 0x91FD  # <CJK>
+0x6338 0x9200  # <CJK>
+0x6339 0x9201  # <CJK>
+0x633A 0x9204  # <CJK>
+0x633B 0x9205  # <CJK>
+0x633C 0x9206  # <CJK>
+0x633D 0x9207  # <CJK>
+0x633E 0x9209  # <CJK>
+0x633F 0x920A  # <CJK>
+0x6340 0x920C  # <CJK>
+0x6341 0x9210  # <CJK>
+0x6342 0x9212  # <CJK>
+0x6343 0x9213  # <CJK>
+0x6344 0x9216  # <CJK>
+0x6345 0x9218  # <CJK>
+0x6346 0x921C  # <CJK>
+0x6347 0x921D  # <CJK>
+0x6348 0x9223  # <CJK>
+0x6349 0x9224  # <CJK>
+0x634A 0x9225  # <CJK>
+0x634B 0x9226  # <CJK>
+0x634C 0x9228  # <CJK>
+0x634D 0x922E  # <CJK>
+0x634E 0x922F  # <CJK>
+0x634F 0x9230  # <CJK>
+0x6350 0x9233  # <CJK>
+0x6351 0x9235  # <CJK>
+0x6352 0x9236  # <CJK>
+0x6353 0x9238  # <CJK>
+0x6354 0x9239  # <CJK>
+0x6355 0x923A  # <CJK>
+0x6356 0x923C  # <CJK>
+0x6357 0x923E  # <CJK>
+0x6358 0x9240  # <CJK>
+0x6359 0x9242  # <CJK>
+0x635A 0x9243  # <CJK>
+0x635B 0x9246  # <CJK>
+0x635C 0x9247  # <CJK>
+0x635D 0x924A  # <CJK>
+0x635E 0x924D  # <CJK>
+0x635F 0x924E  # <CJK>
+0x6360 0x924F  # <CJK>
+0x6361 0x9251  # <CJK>
+0x6362 0x9258  # <CJK>
+0x6363 0x9259  # <CJK>
+0x6364 0x925C  # <CJK>
+0x6365 0x925D  # <CJK>
+0x6366 0x9260  # <CJK>
+0x6367 0x9261  # <CJK>
+0x6368 0x9265  # <CJK>
+0x6369 0x9267  # <CJK>
+0x636A 0x9268  # <CJK>
+0x636B 0x9269  # <CJK>
+0x636C 0x926E  # <CJK>
+0x636D 0x926F  # <CJK>
+0x636E 0x9270  # <CJK>
+0x636F 0x9275  # <CJK>
+0x6370 0x9276  # <CJK>
+0x6371 0x9277  # <CJK>
+0x6372 0x9278  # <CJK>
+0x6373 0x9279  # <CJK>
+0x6374 0x927B  # <CJK>
+0x6375 0x927C  # <CJK>
+0x6376 0x927D  # <CJK>
+0x6377 0x927F  # <CJK>
+0x6378 0x9288  # <CJK>
+0x6379 0x9289  # <CJK>
+0x637A 0x928A  # <CJK>
+0x637B 0x928D  # <CJK>
+0x637C 0x928E  # <CJK>
+0x637D 0x9292  # <CJK>
+0x637E 0x9297  # <CJK>
+0x6421 0x9299  # <CJK>
+0x6422 0x929F  # <CJK>
+0x6423 0x92A0  # <CJK>
+0x6424 0x92A4  # <CJK>
+0x6425 0x92A5  # <CJK>
+0x6426 0x92A7  # <CJK>
+0x6427 0x92A8  # <CJK>
+0x6428 0x92AB  # <CJK>
+0x6429 0x92AF  # <CJK>
+0x642A 0x92B2  # <CJK>
+0x642B 0x92B6  # <CJK>
+0x642C 0x92B8  # <CJK>
+0x642D 0x92BA  # <CJK>
+0x642E 0x92BB  # <CJK>
+0x642F 0x92BC  # <CJK>
+0x6430 0x92BD  # <CJK>
+0x6431 0x92BF  # <CJK>
+0x6432 0x92C0  # <CJK>
+0x6433 0x92C1  # <CJK>
+0x6434 0x92C2  # <CJK>
+0x6435 0x92C3  # <CJK>
+0x6436 0x92C5  # <CJK>
+0x6437 0x92C6  # <CJK>
+0x6438 0x92C7  # <CJK>
+0x6439 0x92C8  # <CJK>
+0x643A 0x92CB  # <CJK>
+0x643B 0x92CC  # <CJK>
+0x643C 0x92CD  # <CJK>
+0x643D 0x92CE  # <CJK>
+0x643E 0x92D0  # <CJK>
+0x643F 0x92D3  # <CJK>
+0x6440 0x92D5  # <CJK>
+0x6441 0x92D7  # <CJK>
+0x6442 0x92D8  # <CJK>
+0x6443 0x92D9  # <CJK>
+0x6444 0x92DC  # <CJK>
+0x6445 0x92DD  # <CJK>
+0x6446 0x92DF  # <CJK>
+0x6447 0x92E0  # <CJK>
+0x6448 0x92E1  # <CJK>
+0x6449 0x92E3  # <CJK>
+0x644A 0x92E5  # <CJK>
+0x644B 0x92E7  # <CJK>
+0x644C 0x92E8  # <CJK>
+0x644D 0x92EC  # <CJK>
+0x644E 0x92EE  # <CJK>
+0x644F 0x92F0  # <CJK>
+0x6450 0x92F9  # <CJK>
+0x6451 0x92FB  # <CJK>
+0x6452 0x92FF  # <CJK>
+0x6453 0x9300  # <CJK>
+0x6454 0x9302  # <CJK>
+0x6455 0x9308  # <CJK>
+0x6456 0x930D  # <CJK>
+0x6457 0x9311  # <CJK>
+0x6458 0x9314  # <CJK>
+0x6459 0x9315  # <CJK>
+0x645A 0x931C  # <CJK>
+0x645B 0x931D  # <CJK>
+0x645C 0x931E  # <CJK>
+0x645D 0x931F  # <CJK>
+0x645E 0x9321  # <CJK>
+0x645F 0x9324  # <CJK>
+0x6460 0x9325  # <CJK>
+0x6461 0x9327  # <CJK>
+0x6462 0x9329  # <CJK>
+0x6463 0x932A  # <CJK>
+0x6464 0x9333  # <CJK>
+0x6465 0x9334  # <CJK>
+0x6466 0x9336  # <CJK>
+0x6467 0x9337  # <CJK>
+0x6468 0x9347  # <CJK>
+0x6469 0x9348  # <CJK>
+0x646A 0x9349  # <CJK>
+0x646B 0x9350  # <CJK>
+0x646C 0x9351  # <CJK>
+0x646D 0x9352  # <CJK>
+0x646E 0x9355  # <CJK>
+0x646F 0x9357  # <CJK>
+0x6470 0x9358  # <CJK>
+0x6471 0x935A  # <CJK>
+0x6472 0x935E  # <CJK>
+0x6473 0x9364  # <CJK>
+0x6474 0x9365  # <CJK>
+0x6475 0x9367  # <CJK>
+0x6476 0x9369  # <CJK>
+0x6477 0x936A  # <CJK>
+0x6478 0x936D  # <CJK>
+0x6479 0x936F  # <CJK>
+0x647A 0x9370  # <CJK>
+0x647B 0x9371  # <CJK>
+0x647C 0x9373  # <CJK>
+0x647D 0x9374  # <CJK>
+0x647E 0x9376  # <CJK>
+0x6521 0x937A  # <CJK>
+0x6522 0x937D  # <CJK>
+0x6523 0x937F  # <CJK>
+0x6524 0x9380  # <CJK>
+0x6525 0x9381  # <CJK>
+0x6526 0x9382  # <CJK>
+0x6527 0x9388  # <CJK>
+0x6528 0x938A  # <CJK>
+0x6529 0x938B  # <CJK>
+0x652A 0x938D  # <CJK>
+0x652B 0x938F  # <CJK>
+0x652C 0x9392  # <CJK>
+0x652D 0x9395  # <CJK>
+0x652E 0x9398  # <CJK>
+0x652F 0x939B  # <CJK>
+0x6530 0x939E  # <CJK>
+0x6531 0x93A1  # <CJK>
+0x6532 0x93A3  # <CJK>
+0x6533 0x93A4  # <CJK>
+0x6534 0x93A6  # <CJK>
+0x6535 0x93A8  # <CJK>
+0x6536 0x93AB  # <CJK>
+0x6537 0x93B4  # <CJK>
+0x6538 0x93B5  # <CJK>
+0x6539 0x93B6  # <CJK>
+0x653A 0x93BA  # <CJK>
+0x653B 0x93A9  # <CJK>
+0x653C 0x93C1  # <CJK>
+0x653D 0x93C4  # <CJK>
+0x653E 0x93C5  # <CJK>
+0x653F 0x93C6  # <CJK>
+0x6540 0x93C7  # <CJK>
+0x6541 0x93C9  # <CJK>
+0x6542 0x93CA  # <CJK>
+0x6543 0x93CB  # <CJK>
+0x6544 0x93CC  # <CJK>
+0x6545 0x93CD  # <CJK>
+0x6546 0x93D3  # <CJK>
+0x6547 0x93D9  # <CJK>
+0x6548 0x93DC  # <CJK>
+0x6549 0x93DE  # <CJK>
+0x654A 0x93DF  # <CJK>
+0x654B 0x93E2  # <CJK>
+0x654C 0x93E6  # <CJK>
+0x654D 0x93E7  # <CJK>
+0x654E 0x93F9  # <CJK>
+0x654F 0x93F7  # <CJK>
+0x6550 0x93F8  # <CJK>
+0x6551 0x93FA  # <CJK>
+0x6552 0x93FB  # <CJK>
+0x6553 0x93FD  # <CJK>
+0x6554 0x9401  # <CJK>
+0x6555 0x9402  # <CJK>
+0x6556 0x9404  # <CJK>
+0x6557 0x9408  # <CJK>
+0x6558 0x9409  # <CJK>
+0x6559 0x940D  # <CJK>
+0x655A 0x940E  # <CJK>
+0x655B 0x940F  # <CJK>
+0x655C 0x9415  # <CJK>
+0x655D 0x9416  # <CJK>
+0x655E 0x9417  # <CJK>
+0x655F 0x941F  # <CJK>
+0x6560 0x942E  # <CJK>
+0x6561 0x942F  # <CJK>
+0x6562 0x9431  # <CJK>
+0x6563 0x9432  # <CJK>
+0x6564 0x9433  # <CJK>
+0x6565 0x9434  # <CJK>
+0x6566 0x943B  # <CJK>
+0x6567 0x943F  # <CJK>
+0x6568 0x943D  # <CJK>
+0x6569 0x9443  # <CJK>
+0x656A 0x9445  # <CJK>
+0x656B 0x9448  # <CJK>
+0x656C 0x944A  # <CJK>
+0x656D 0x944C  # <CJK>
+0x656E 0x9455  # <CJK>
+0x656F 0x9459  # <CJK>
+0x6570 0x945C  # <CJK>
+0x6571 0x945F  # <CJK>
+0x6572 0x9461  # <CJK>
+0x6573 0x9463  # <CJK>
+0x6574 0x9468  # <CJK>
+0x6575 0x946B  # <CJK>
+0x6576 0x946D  # <CJK>
+0x6577 0x946E  # <CJK>
+0x6578 0x946F  # <CJK>
+0x6579 0x9471  # <CJK>
+0x657A 0x9472  # <CJK>
+0x657B 0x9484  # <CJK>
+0x657C 0x9483  # <CJK>
+0x657D 0x9578  # <CJK>
+0x657E 0x9579  # <CJK>
+0x6621 0x957E  # <CJK>
+0x6622 0x9584  # <CJK>
+0x6623 0x9588  # <CJK>
+0x6624 0x958C  # <CJK>
+0x6625 0x958D  # <CJK>
+0x6626 0x958E  # <CJK>
+0x6627 0x959D  # <CJK>
+0x6628 0x959E  # <CJK>
+0x6629 0x959F  # <CJK>
+0x662A 0x95A1  # <CJK>
+0x662B 0x95A6  # <CJK>
+0x662C 0x95A9  # <CJK>
+0x662D 0x95AB  # <CJK>
+0x662E 0x95AC  # <CJK>
+0x662F 0x95B4  # <CJK>
+0x6630 0x95B6  # <CJK>
+0x6631 0x95BA  # <CJK>
+0x6632 0x95BD  # <CJK>
+0x6633 0x95BF  # <CJK>
+0x6634 0x95C6  # <CJK>
+0x6635 0x95C8  # <CJK>
+0x6636 0x95C9  # <CJK>
+0x6637 0x95CB  # <CJK>
+0x6638 0x95D0  # <CJK>
+0x6639 0x95D1  # <CJK>
+0x663A 0x95D2  # <CJK>
+0x663B 0x95D3  # <CJK>
+0x663C 0x95D9  # <CJK>
+0x663D 0x95DA  # <CJK>
+0x663E 0x95DD  # <CJK>
+0x663F 0x95DE  # <CJK>
+0x6640 0x95DF  # <CJK>
+0x6641 0x95E0  # <CJK>
+0x6642 0x95E4  # <CJK>
+0x6643 0x95E6  # <CJK>
+0x6644 0x961D  # <CJK>
+0x6645 0x961E  # <CJK>
+0x6646 0x9622  # <CJK>
+0x6647 0x9624  # <CJK>
+0x6648 0x9625  # <CJK>
+0x6649 0x9626  # <CJK>
+0x664A 0x962C  # <CJK>
+0x664B 0x9631  # <CJK>
+0x664C 0x9633  # <CJK>
+0x664D 0x9637  # <CJK>
+0x664E 0x9638  # <CJK>
+0x664F 0x9639  # <CJK>
+0x6650 0x963A  # <CJK>
+0x6651 0x963C  # <CJK>
+0x6652 0x963D  # <CJK>
+0x6653 0x9641  # <CJK>
+0x6654 0x9652  # <CJK>
+0x6655 0x9654  # <CJK>
+0x6656 0x9656  # <CJK>
+0x6657 0x9657  # <CJK>
+0x6658 0x9658  # <CJK>
+0x6659 0x9661  # <CJK>
+0x665A 0x966E  # <CJK>
+0x665B 0x9674  # <CJK>
+0x665C 0x967B  # <CJK>
+0x665D 0x967C  # <CJK>
+0x665E 0x967E  # <CJK>
+0x665F 0x967F  # <CJK>
+0x6660 0x9681  # <CJK>
+0x6661 0x9682  # <CJK>
+0x6662 0x9683  # <CJK>
+0x6663 0x9684  # <CJK>
+0x6664 0x9689  # <CJK>
+0x6665 0x9691  # <CJK>
+0x6666 0x9696  # <CJK>
+0x6667 0x969A  # <CJK>
+0x6668 0x969D  # <CJK>
+0x6669 0x969F  # <CJK>
+0x666A 0x96A4  # <CJK>
+0x666B 0x96A5  # <CJK>
+0x666C 0x96A6  # <CJK>
+0x666D 0x96A9  # <CJK>
+0x666E 0x96AE  # <CJK>
+0x666F 0x96AF  # <CJK>
+0x6670 0x96B3  # <CJK>
+0x6671 0x96BA  # <CJK>
+0x6672 0x96CA  # <CJK>
+0x6673 0x96D2  # <CJK>
+0x6674 0x5DB2  # <CJK>
+0x6675 0x96D8  # <CJK>
+0x6676 0x96DA  # <CJK>
+0x6677 0x96DD  # <CJK>
+0x6678 0x96DE  # <CJK>
+0x6679 0x96DF  # <CJK>
+0x667A 0x96E9  # <CJK>
+0x667B 0x96EF  # <CJK>
+0x667C 0x96F1  # <CJK>
+0x667D 0x96FA  # <CJK>
+0x667E 0x9702  # <CJK>
+0x6721 0x9703  # <CJK>
+0x6722 0x9705  # <CJK>
+0x6723 0x9709  # <CJK>
+0x6724 0x971A  # <CJK>
+0x6725 0x971B  # <CJK>
+0x6726 0x971D  # <CJK>
+0x6727 0x9721  # <CJK>
+0x6728 0x9722  # <CJK>
+0x6729 0x9723  # <CJK>
+0x672A 0x9728  # <CJK>
+0x672B 0x9731  # <CJK>
+0x672C 0x9733  # <CJK>
+0x672D 0x9741  # <CJK>
+0x672E 0x9743  # <CJK>
+0x672F 0x974A  # <CJK>
+0x6730 0x974E  # <CJK>
+0x6731 0x974F  # <CJK>
+0x6732 0x9755  # <CJK>
+0x6733 0x9757  # <CJK>
+0x6734 0x9758  # <CJK>
+0x6735 0x975A  # <CJK>
+0x6736 0x975B  # <CJK>
+0x6737 0x9763  # <CJK>
+0x6738 0x9767  # <CJK>
+0x6739 0x976A  # <CJK>
+0x673A 0x976E  # <CJK>
+0x673B 0x9773  # <CJK>
+0x673C 0x9776  # <CJK>
+0x673D 0x9777  # <CJK>
+0x673E 0x9778  # <CJK>
+0x673F 0x977B  # <CJK>
+0x6740 0x977D  # <CJK>
+0x6741 0x977F  # <CJK>
+0x6742 0x9780  # <CJK>
+0x6743 0x9789  # <CJK>
+0x6744 0x9795  # <CJK>
+0x6745 0x9796  # <CJK>
+0x6746 0x9797  # <CJK>
+0x6747 0x9799  # <CJK>
+0x6748 0x979A  # <CJK>
+0x6749 0x979E  # <CJK>
+0x674A 0x979F  # <CJK>
+0x674B 0x97A2  # <CJK>
+0x674C 0x97AC  # <CJK>
+0x674D 0x97AE  # <CJK>
+0x674E 0x97B1  # <CJK>
+0x674F 0x97B2  # <CJK>
+0x6750 0x97B5  # <CJK>
+0x6751 0x97B6  # <CJK>
+0x6752 0x97B8  # <CJK>
+0x6753 0x97B9  # <CJK>
+0x6754 0x97BA  # <CJK>
+0x6755 0x97BC  # <CJK>
+0x6756 0x97BE  # <CJK>
+0x6757 0x97BF  # <CJK>
+0x6758 0x97C1  # <CJK>
+0x6759 0x97C4  # <CJK>
+0x675A 0x97C5  # <CJK>
+0x675B 0x97C7  # <CJK>
+0x675C 0x97C9  # <CJK>
+0x675D 0x97CA  # <CJK>
+0x675E 0x97CC  # <CJK>
+0x675F 0x97CD  # <CJK>
+0x6760 0x97CE  # <CJK>
+0x6761 0x97D0  # <CJK>
+0x6762 0x97D1  # <CJK>
+0x6763 0x97D4  # <CJK>
+0x6764 0x97D7  # <CJK>
+0x6765 0x97D8  # <CJK>
+0x6766 0x97D9  # <CJK>
+0x6767 0x97DD  # <CJK>
+0x6768 0x97DE  # <CJK>
+0x6769 0x97E0  # <CJK>
+0x676A 0x97DB  # <CJK>
+0x676B 0x97E1  # <CJK>
+0x676C 0x97E4  # <CJK>
+0x676D 0x97EF  # <CJK>
+0x676E 0x97F1  # <CJK>
+0x676F 0x97F4  # <CJK>
+0x6770 0x97F7  # <CJK>
+0x6771 0x97F8  # <CJK>
+0x6772 0x97FA  # <CJK>
+0x6773 0x9807  # <CJK>
+0x6774 0x980A  # <CJK>
+0x6775 0x9819  # <CJK>
+0x6776 0x980D  # <CJK>
+0x6777 0x980E  # <CJK>
+0x6778 0x9814  # <CJK>
+0x6779 0x9816  # <CJK>
+0x677A 0x981C  # <CJK>
+0x677B 0x981E  # <CJK>
+0x677C 0x9820  # <CJK>
+0x677D 0x9823  # <CJK>
+0x677E 0x9826  # <CJK>
+0x6821 0x982B  # <CJK>
+0x6822 0x982E  # <CJK>
+0x6823 0x982F  # <CJK>
+0x6824 0x9830  # <CJK>
+0x6825 0x9832  # <CJK>
+0x6826 0x9833  # <CJK>
+0x6827 0x9835  # <CJK>
+0x6828 0x9825  # <CJK>
+0x6829 0x983E  # <CJK>
+0x682A 0x9844  # <CJK>
+0x682B 0x9847  # <CJK>
+0x682C 0x984A  # <CJK>
+0x682D 0x9851  # <CJK>
+0x682E 0x9852  # <CJK>
+0x682F 0x9853  # <CJK>
+0x6830 0x9856  # <CJK>
+0x6831 0x9857  # <CJK>
+0x6832 0x9859  # <CJK>
+0x6833 0x985A  # <CJK>
+0x6834 0x9862  # <CJK>
+0x6835 0x9863  # <CJK>
+0x6836 0x9865  # <CJK>
+0x6837 0x9866  # <CJK>
+0x6838 0x986A  # <CJK>
+0x6839 0x986C  # <CJK>
+0x683A 0x98AB  # <CJK>
+0x683B 0x98AD  # <CJK>
+0x683C 0x98AE  # <CJK>
+0x683D 0x98B0  # <CJK>
+0x683E 0x98B4  # <CJK>
+0x683F 0x98B7  # <CJK>
+0x6840 0x98B8  # <CJK>
+0x6841 0x98BA  # <CJK>
+0x6842 0x98BB  # <CJK>
+0x6843 0x98BF  # <CJK>
+0x6844 0x98C2  # <CJK>
+0x6845 0x98C5  # <CJK>
+0x6846 0x98C8  # <CJK>
+0x6847 0x98CC  # <CJK>
+0x6848 0x98E1  # <CJK>
+0x6849 0x98E3  # <CJK>
+0x684A 0x98E5  # <CJK>
+0x684B 0x98E6  # <CJK>
+0x684C 0x98E7  # <CJK>
+0x684D 0x98EA  # <CJK>
+0x684E 0x98F3  # <CJK>
+0x684F 0x98F6  # <CJK>
+0x6850 0x9902  # <CJK>
+0x6851 0x9907  # <CJK>
+0x6852 0x9908  # <CJK>
+0x6853 0x9911  # <CJK>
+0x6854 0x9915  # <CJK>
+0x6855 0x9916  # <CJK>
+0x6856 0x9917  # <CJK>
+0x6857 0x991A  # <CJK>
+0x6858 0x991B  # <CJK>
+0x6859 0x991C  # <CJK>
+0x685A 0x991F  # <CJK>
+0x685B 0x9922  # <CJK>
+0x685C 0x9926  # <CJK>
+0x685D 0x9927  # <CJK>
+0x685E 0x992B  # <CJK>
+0x685F 0x9931  # <CJK>
+0x6860 0x9932  # <CJK>
+0x6861 0x9933  # <CJK>
+0x6862 0x9934  # <CJK>
+0x6863 0x9935  # <CJK>
+0x6864 0x9939  # <CJK>
+0x6865 0x993A  # <CJK>
+0x6866 0x993B  # <CJK>
+0x6867 0x993C  # <CJK>
+0x6868 0x9940  # <CJK>
+0x6869 0x9941  # <CJK>
+0x686A 0x9946  # <CJK>
+0x686B 0x9947  # <CJK>
+0x686C 0x9948  # <CJK>
+0x686D 0x994D  # <CJK>
+0x686E 0x994E  # <CJK>
+0x686F 0x9954  # <CJK>
+0x6870 0x9958  # <CJK>
+0x6871 0x9959  # <CJK>
+0x6872 0x995B  # <CJK>
+0x6873 0x995C  # <CJK>
+0x6874 0x995E  # <CJK>
+0x6875 0x995F  # <CJK>
+0x6876 0x9960  # <CJK>
+0x6877 0x999B  # <CJK>
+0x6878 0x999D  # <CJK>
+0x6879 0x999F  # <CJK>
+0x687A 0x99A6  # <CJK>
+0x687B 0x99B0  # <CJK>
+0x687C 0x99B1  # <CJK>
+0x687D 0x99B2  # <CJK>
+0x687E 0x99B5  # <CJK>
+0x6921 0x99B9  # <CJK>
+0x6922 0x99BA  # <CJK>
+0x6923 0x99BD  # <CJK>
+0x6924 0x99BF  # <CJK>
+0x6925 0x99C3  # <CJK>
+0x6926 0x99C9  # <CJK>
+0x6927 0x99D3  # <CJK>
+0x6928 0x99D4  # <CJK>
+0x6929 0x99D9  # <CJK>
+0x692A 0x99DA  # <CJK>
+0x692B 0x99DC  # <CJK>
+0x692C 0x99DE  # <CJK>
+0x692D 0x99E7  # <CJK>
+0x692E 0x99EA  # <CJK>
+0x692F 0x99EB  # <CJK>
+0x6930 0x99EC  # <CJK>
+0x6931 0x99F0  # <CJK>
+0x6932 0x99F4  # <CJK>
+0x6933 0x99F5  # <CJK>
+0x6934 0x99F9  # <CJK>
+0x6935 0x99FD  # <CJK>
+0x6936 0x99FE  # <CJK>
+0x6937 0x9A02  # <CJK>
+0x6938 0x9A03  # <CJK>
+0x6939 0x9A04  # <CJK>
+0x693A 0x9A0B  # <CJK>
+0x693B 0x9A0C  # <CJK>
+0x693C 0x9A10  # <CJK>
+0x693D 0x9A11  # <CJK>
+0x693E 0x9A16  # <CJK>
+0x693F 0x9A1E  # <CJK>
+0x6940 0x9A20  # <CJK>
+0x6941 0x9A22  # <CJK>
+0x6942 0x9A23  # <CJK>
+0x6943 0x9A24  # <CJK>
+0x6944 0x9A27  # <CJK>
+0x6945 0x9A2D  # <CJK>
+0x6946 0x9A2E  # <CJK>
+0x6947 0x9A33  # <CJK>
+0x6948 0x9A35  # <CJK>
+0x6949 0x9A36  # <CJK>
+0x694A 0x9A38  # <CJK>
+0x694B 0x9A47  # <CJK>
+0x694C 0x9A41  # <CJK>
+0x694D 0x9A44  # <CJK>
+0x694E 0x9A4A  # <CJK>
+0x694F 0x9A4B  # <CJK>
+0x6950 0x9A4C  # <CJK>
+0x6951 0x9A4E  # <CJK>
+0x6952 0x9A51  # <CJK>
+0x6953 0x9A54  # <CJK>
+0x6954 0x9A56  # <CJK>
+0x6955 0x9A5D  # <CJK>
+0x6956 0x9AAA  # <CJK>
+0x6957 0x9AAC  # <CJK>
+0x6958 0x9AAE  # <CJK>
+0x6959 0x9AAF  # <CJK>
+0x695A 0x9AB2  # <CJK>
+0x695B 0x9AB4  # <CJK>
+0x695C 0x9AB5  # <CJK>
+0x695D 0x9AB6  # <CJK>
+0x695E 0x9AB9  # <CJK>
+0x695F 0x9ABB  # <CJK>
+0x6960 0x9ABE  # <CJK>
+0x6961 0x9ABF  # <CJK>
+0x6962 0x9AC1  # <CJK>
+0x6963 0x9AC3  # <CJK>
+0x6964 0x9AC6  # <CJK>
+0x6965 0x9AC8  # <CJK>
+0x6966 0x9ACE  # <CJK>
+0x6967 0x9AD0  # <CJK>
+0x6968 0x9AD2  # <CJK>
+0x6969 0x9AD5  # <CJK>
+0x696A 0x9AD6  # <CJK>
+0x696B 0x9AD7  # <CJK>
+0x696C 0x9ADB  # <CJK>
+0x696D 0x9ADC  # <CJK>
+0x696E 0x9AE0  # <CJK>
+0x696F 0x9AE4  # <CJK>
+0x6970 0x9AE5  # <CJK>
+0x6971 0x9AE7  # <CJK>
+0x6972 0x9AE9  # <CJK>
+0x6973 0x9AEC  # <CJK>
+0x6974 0x9AF2  # <CJK>
+0x6975 0x9AF3  # <CJK>
+0x6976 0x9AF5  # <CJK>
+0x6977 0x9AF9  # <CJK>
+0x6978 0x9AFA  # <CJK>
+0x6979 0x9AFD  # <CJK>
+0x697A 0x9AFF  # <CJK>
+0x697B 0x9B00  # <CJK>
+0x697C 0x9B01  # <CJK>
+0x697D 0x9B02  # <CJK>
+0x697E 0x9B03  # <CJK>
+0x6A21 0x9B04  # <CJK>
+0x6A22 0x9B05  # <CJK>
+0x6A23 0x9B08  # <CJK>
+0x6A24 0x9B09  # <CJK>
+0x6A25 0x9B0B  # <CJK>
+0x6A26 0x9B0C  # <CJK>
+0x6A27 0x9B0D  # <CJK>
+0x6A28 0x9B0E  # <CJK>
+0x6A29 0x9B10  # <CJK>
+0x6A2A 0x9B12  # <CJK>
+0x6A2B 0x9B16  # <CJK>
+0x6A2C 0x9B19  # <CJK>
+0x6A2D 0x9B1B  # <CJK>
+0x6A2E 0x9B1C  # <CJK>
+0x6A2F 0x9B20  # <CJK>
+0x6A30 0x9B26  # <CJK>
+0x6A31 0x9B2B  # <CJK>
+0x6A32 0x9B2D  # <CJK>
+0x6A33 0x9B33  # <CJK>
+0x6A34 0x9B34  # <CJK>
+0x6A35 0x9B35  # <CJK>
+0x6A36 0x9B37  # <CJK>
+0x6A37 0x9B39  # <CJK>
+0x6A38 0x9B3A  # <CJK>
+0x6A39 0x9B3D  # <CJK>
+0x6A3A 0x9B48  # <CJK>
+0x6A3B 0x9B4B  # <CJK>
+0x6A3C 0x9B4C  # <CJK>
+0x6A3D 0x9B55  # <CJK>
+0x6A3E 0x9B56  # <CJK>
+0x6A3F 0x9B57  # <CJK>
+0x6A40 0x9B5B  # <CJK>
+0x6A41 0x9B5E  # <CJK>
+0x6A42 0x9B61  # <CJK>
+0x6A43 0x9B63  # <CJK>
+0x6A44 0x9B65  # <CJK>
+0x6A45 0x9B66  # <CJK>
+0x6A46 0x9B68  # <CJK>
+0x6A47 0x9B6A  # <CJK>
+0x6A48 0x9B6B  # <CJK>
+0x6A49 0x9B6C  # <CJK>
+0x6A4A 0x9B6D  # <CJK>
+0x6A4B 0x9B6E  # <CJK>
+0x6A4C 0x9B73  # <CJK>
+0x6A4D 0x9B75  # <CJK>
+0x6A4E 0x9B77  # <CJK>
+0x6A4F 0x9B78  # <CJK>
+0x6A50 0x9B79  # <CJK>
+0x6A51 0x9B7F  # <CJK>
+0x6A52 0x9B80  # <CJK>
+0x6A53 0x9B84  # <CJK>
+0x6A54 0x9B85  # <CJK>
+0x6A55 0x9B86  # <CJK>
+0x6A56 0x9B87  # <CJK>
+0x6A57 0x9B89  # <CJK>
+0x6A58 0x9B8A  # <CJK>
+0x6A59 0x9B8B  # <CJK>
+0x6A5A 0x9B8D  # <CJK>
+0x6A5B 0x9B8F  # <CJK>
+0x6A5C 0x9B90  # <CJK>
+0x6A5D 0x9B94  # <CJK>
+0x6A5E 0x9B9A  # <CJK>
+0x6A5F 0x9B9D  # <CJK>
+0x6A60 0x9B9E  # <CJK>
+0x6A61 0x9BA6  # <CJK>
+0x6A62 0x9BA7  # <CJK>
+0x6A63 0x9BA9  # <CJK>
+0x6A64 0x9BAC  # <CJK>
+0x6A65 0x9BB0  # <CJK>
+0x6A66 0x9BB1  # <CJK>
+0x6A67 0x9BB2  # <CJK>
+0x6A68 0x9BB7  # <CJK>
+0x6A69 0x9BB8  # <CJK>
+0x6A6A 0x9BBB  # <CJK>
+0x6A6B 0x9BBC  # <CJK>
+0x6A6C 0x9BBE  # <CJK>
+0x6A6D 0x9BBF  # <CJK>
+0x6A6E 0x9BC1  # <CJK>
+0x6A6F 0x9BC7  # <CJK>
+0x6A70 0x9BC8  # <CJK>
+0x6A71 0x9BCE  # <CJK>
+0x6A72 0x9BD0  # <CJK>
+0x6A73 0x9BD7  # <CJK>
+0x6A74 0x9BD8  # <CJK>
+0x6A75 0x9BDD  # <CJK>
+0x6A76 0x9BDF  # <CJK>
+0x6A77 0x9BE5  # <CJK>
+0x6A78 0x9BE7  # <CJK>
+0x6A79 0x9BEA  # <CJK>
+0x6A7A 0x9BEB  # <CJK>
+0x6A7B 0x9BEF  # <CJK>
+0x6A7C 0x9BF3  # <CJK>
+0x6A7D 0x9BF7  # <CJK>
+0x6A7E 0x9BF8  # <CJK>
+0x6B21 0x9BF9  # <CJK>
+0x6B22 0x9BFA  # <CJK>
+0x6B23 0x9BFD  # <CJK>
+0x6B24 0x9BFF  # <CJK>
+0x6B25 0x9C00  # <CJK>
+0x6B26 0x9C02  # <CJK>
+0x6B27 0x9C0B  # <CJK>
+0x6B28 0x9C0F  # <CJK>
+0x6B29 0x9C11  # <CJK>
+0x6B2A 0x9C16  # <CJK>
+0x6B2B 0x9C18  # <CJK>
+0x6B2C 0x9C19  # <CJK>
+0x6B2D 0x9C1A  # <CJK>
+0x6B2E 0x9C1C  # <CJK>
+0x6B2F 0x9C1E  # <CJK>
+0x6B30 0x9C22  # <CJK>
+0x6B31 0x9C23  # <CJK>
+0x6B32 0x9C26  # <CJK>
+0x6B33 0x9C27  # <CJK>
+0x6B34 0x9C28  # <CJK>
+0x6B35 0x9C29  # <CJK>
+0x6B36 0x9C2A  # <CJK>
+0x6B37 0x9C31  # <CJK>
+0x6B38 0x9C35  # <CJK>
+0x6B39 0x9C36  # <CJK>
+0x6B3A 0x9C37  # <CJK>
+0x6B3B 0x9C3D  # <CJK>
+0x6B3C 0x9C41  # <CJK>
+0x6B3D 0x9C43  # <CJK>
+0x6B3E 0x9C44  # <CJK>
+0x6B3F 0x9C45  # <CJK>
+0x6B40 0x9C49  # <CJK>
+0x6B41 0x9C4A  # <CJK>
+0x6B42 0x9C4E  # <CJK>
+0x6B43 0x9C4F  # <CJK>
+0x6B44 0x9C50  # <CJK>
+0x6B45 0x9C53  # <CJK>
+0x6B46 0x9C54  # <CJK>
+0x6B47 0x9C56  # <CJK>
+0x6B48 0x9C58  # <CJK>
+0x6B49 0x9C5B  # <CJK>
+0x6B4A 0x9C5D  # <CJK>
+0x6B4B 0x9C5E  # <CJK>
+0x6B4C 0x9C5F  # <CJK>
+0x6B4D 0x9C63  # <CJK>
+0x6B4E 0x9C69  # <CJK>
+0x6B4F 0x9C6A  # <CJK>
+0x6B50 0x9C5C  # <CJK>
+0x6B51 0x9C6B  # <CJK>
+0x6B52 0x9C68  # <CJK>
+0x6B53 0x9C6E  # <CJK>
+0x6B54 0x9C70  # <CJK>
+0x6B55 0x9C72  # <CJK>
+0x6B56 0x9C75  # <CJK>
+0x6B57 0x9C77  # <CJK>
+0x6B58 0x9C7B  # <CJK>
+0x6B59 0x9CE6  # <CJK>
+0x6B5A 0x9CF2  # <CJK>
+0x6B5B 0x9CF7  # <CJK>
+0x6B5C 0x9CF9  # <CJK>
+0x6B5D 0x9D0B  # <CJK>
+0x6B5E 0x9D02  # <CJK>
+0x6B5F 0x9D11  # <CJK>
+0x6B60 0x9D17  # <CJK>
+0x6B61 0x9D18  # <CJK>
+0x6B62 0x9D1C  # <CJK>
+0x6B63 0x9D1D  # <CJK>
+0x6B64 0x9D1E  # <CJK>
+0x6B65 0x9D2F  # <CJK>
+0x6B66 0x9D30  # <CJK>
+0x6B67 0x9D32  # <CJK>
+0x6B68 0x9D33  # <CJK>
+0x6B69 0x9D34  # <CJK>
+0x6B6A 0x9D3A  # <CJK>
+0x6B6B 0x9D3C  # <CJK>
+0x6B6C 0x9D45  # <CJK>
+0x6B6D 0x9D3D  # <CJK>
+0x6B6E 0x9D42  # <CJK>
+0x6B6F 0x9D43  # <CJK>
+0x6B70 0x9D47  # <CJK>
+0x6B71 0x9D4A  # <CJK>
+0x6B72 0x9D53  # <CJK>
+0x6B73 0x9D54  # <CJK>
+0x6B74 0x9D5F  # <CJK>
+0x6B75 0x9D63  # <CJK>
+0x6B76 0x9D62  # <CJK>
+0x6B77 0x9D65  # <CJK>
+0x6B78 0x9D69  # <CJK>
+0x6B79 0x9D6A  # <CJK>
+0x6B7A 0x9D6B  # <CJK>
+0x6B7B 0x9D70  # <CJK>
+0x6B7C 0x9D76  # <CJK>
+0x6B7D 0x9D77  # <CJK>
+0x6B7E 0x9D7B  # <CJK>
+0x6C21 0x9D7C  # <CJK>
+0x6C22 0x9D7E  # <CJK>
+0x6C23 0x9D83  # <CJK>
+0x6C24 0x9D84  # <CJK>
+0x6C25 0x9D86  # <CJK>
+0x6C26 0x9D8A  # <CJK>
+0x6C27 0x9D8D  # <CJK>
+0x6C28 0x9D8E  # <CJK>
+0x6C29 0x9D92  # <CJK>
+0x6C2A 0x9D93  # <CJK>
+0x6C2B 0x9D95  # <CJK>
+0x6C2C 0x9D96  # <CJK>
+0x6C2D 0x9D97  # <CJK>
+0x6C2E 0x9D98  # <CJK>
+0x6C2F 0x9DA1  # <CJK>
+0x6C30 0x9DAA  # <CJK>
+0x6C31 0x9DAC  # <CJK>
+0x6C32 0x9DAE  # <CJK>
+0x6C33 0x9DB1  # <CJK>
+0x6C34 0x9DB5  # <CJK>
+0x6C35 0x9DB9  # <CJK>
+0x6C36 0x9DBC  # <CJK>
+0x6C37 0x9DBF  # <CJK>
+0x6C38 0x9DC3  # <CJK>
+0x6C39 0x9DC7  # <CJK>
+0x6C3A 0x9DC9  # <CJK>
+0x6C3B 0x9DCA  # <CJK>
+0x6C3C 0x9DD4  # <CJK>
+0x6C3D 0x9DD5  # <CJK>
+0x6C3E 0x9DD6  # <CJK>
+0x6C3F 0x9DD7  # <CJK>
+0x6C40 0x9DDA  # <CJK>
+0x6C41 0x9DDE  # <CJK>
+0x6C42 0x9DDF  # <CJK>
+0x6C43 0x9DE0  # <CJK>
+0x6C44 0x9DE5  # <CJK>
+0x6C45 0x9DE7  # <CJK>
+0x6C46 0x9DE9  # <CJK>
+0x6C47 0x9DEB  # <CJK>
+0x6C48 0x9DEE  # <CJK>
+0x6C49 0x9DF0  # <CJK>
+0x6C4A 0x9DF3  # <CJK>
+0x6C4B 0x9DF4  # <CJK>
+0x6C4C 0x9DFE  # <CJK>
+0x6C4D 0x9E0A  # <CJK>
+0x6C4E 0x9E02  # <CJK>
+0x6C4F 0x9E07  # <CJK>
+0x6C50 0x9E0E  # <CJK>
+0x6C51 0x9E10  # <CJK>
+0x6C52 0x9E11  # <CJK>
+0x6C53 0x9E12  # <CJK>
+0x6C54 0x9E15  # <CJK>
+0x6C55 0x9E16  # <CJK>
+0x6C56 0x9E19  # <CJK>
+0x6C57 0x9E1C  # <CJK>
+0x6C58 0x9E1D  # <CJK>
+0x6C59 0x9E7A  # <CJK>
+0x6C5A 0x9E7B  # <CJK>
+0x6C5B 0x9E7C  # <CJK>
+0x6C5C 0x9E80  # <CJK>
+0x6C5D 0x9E82  # <CJK>
+0x6C5E 0x9E83  # <CJK>
+0x6C5F 0x9E84  # <CJK>
+0x6C60 0x9E85  # <CJK>
+0x6C61 0x9E87  # <CJK>
+0x6C62 0x9E8E  # <CJK>
+0x6C63 0x9E8F  # <CJK>
+0x6C64 0x9E96  # <CJK>
+0x6C65 0x9E98  # <CJK>
+0x6C66 0x9E9B  # <CJK>
+0x6C67 0x9E9E  # <CJK>
+0x6C68 0x9EA4  # <CJK>
+0x6C69 0x9EA8  # <CJK>
+0x6C6A 0x9EAC  # <CJK>
+0x6C6B 0x9EAE  # <CJK>
+0x6C6C 0x9EAF  # <CJK>
+0x6C6D 0x9EB0  # <CJK>
+0x6C6E 0x9EB3  # <CJK>
+0x6C6F 0x9EB4  # <CJK>
+0x6C70 0x9EB5  # <CJK>
+0x6C71 0x9EC6  # <CJK>
+0x6C72 0x9EC8  # <CJK>
+0x6C73 0x9ECB  # <CJK>
+0x6C74 0x9ED5  # <CJK>
+0x6C75 0x9EDF  # <CJK>
+0x6C76 0x9EE4  # <CJK>
+0x6C77 0x9EE7  # <CJK>
+0x6C78 0x9EEC  # <CJK>
+0x6C79 0x9EED  # <CJK>
+0x6C7A 0x9EEE  # <CJK>
+0x6C7B 0x9EF0  # <CJK>
+0x6C7C 0x9EF1  # <CJK>
+0x6C7D 0x9EF2  # <CJK>
+0x6C7E 0x9EF5  # <CJK>
+0x6D21 0x9EF8  # <CJK>
+0x6D22 0x9EFF  # <CJK>
+0x6D23 0x9F02  # <CJK>
+0x6D24 0x9F03  # <CJK>
+0x6D25 0x9F09  # <CJK>
+0x6D26 0x9F0F  # <CJK>
+0x6D27 0x9F10  # <CJK>
+0x6D28 0x9F11  # <CJK>
+0x6D29 0x9F12  # <CJK>
+0x6D2A 0x9F14  # <CJK>
+0x6D2B 0x9F16  # <CJK>
+0x6D2C 0x9F17  # <CJK>
+0x6D2D 0x9F19  # <CJK>
+0x6D2E 0x9F1A  # <CJK>
+0x6D2F 0x9F1B  # <CJK>
+0x6D30 0x9F1F  # <CJK>
+0x6D31 0x9F22  # <CJK>
+0x6D32 0x9F26  # <CJK>
+0x6D33 0x9F2A  # <CJK>
+0x6D34 0x9F2B  # <CJK>
+0x6D35 0x9F2F  # <CJK>
+0x6D36 0x9F31  # <CJK>
+0x6D37 0x9F32  # <CJK>
+0x6D38 0x9F34  # <CJK>
+0x6D39 0x9F37  # <CJK>
+0x6D3A 0x9F39  # <CJK>
+0x6D3B 0x9F3A  # <CJK>
+0x6D3C 0x9F3C  # <CJK>
+0x6D3D 0x9F3D  # <CJK>
+0x6D3E 0x9F3F  # <CJK>
+0x6D3F 0x9F41  # <CJK>
+0x6D40 0x9F43  # <CJK>
+0x6D41 0x9F44  # <CJK>
+0x6D42 0x9F45  # <CJK>
+0x6D43 0x9F46  # <CJK>
+0x6D44 0x9F47  # <CJK>
+0x6D45 0x9F53  # <CJK>
+0x6D46 0x9F55  # <CJK>
+0x6D47 0x9F56  # <CJK>
+0x6D48 0x9F57  # <CJK>
+0x6D49 0x9F58  # <CJK>
+0x6D4A 0x9F5A  # <CJK>
+0x6D4B 0x9F5D  # <CJK>
+0x6D4C 0x9F5E  # <CJK>
+0x6D4D 0x9F68  # <CJK>
+0x6D4E 0x9F69  # <CJK>
+0x6D4F 0x9F6D  # <CJK>
+0x6D50 0x9F6E  # <CJK>
+0x6D51 0x9F6F  # <CJK>
+0x6D52 0x9F70  # <CJK>
+0x6D53 0x9F71  # <CJK>
+0x6D54 0x9F73  # <CJK>
+0x6D55 0x9F75  # <CJK>
+0x6D56 0x9F7A  # <CJK>
+0x6D57 0x9F7D  # <CJK>
+0x6D58 0x9F8F  # <CJK>
+0x6D59 0x9F90  # <CJK>
+0x6D5A 0x9F91  # <CJK>
+0x6D5B 0x9F92  # <CJK>
+0x6D5C 0x9F94  # <CJK>
+0x6D5D 0x9F96  # <CJK>
+0x6D5E 0x9F97  # <CJK>
+0x6D5F 0x9F9E  # <CJK>
+0x6D60 0x9FA1  # <CJK>
+0x6D61 0x9FA2  # <CJK>
+0x6D62 0x9FA3  # <CJK>
+0x6D63 0x9FA5  # <CJK>
diff --git a/basis/io/encodings/iso2022/authors.txt b/basis/io/encodings/iso2022/authors.txt
new file mode 100644 (file)
index 0000000..f990dd0
--- /dev/null
@@ -0,0 +1 @@
+Daniel Ehrenberg
diff --git a/basis/io/encodings/iso2022/iso2022-docs.factor b/basis/io/encodings/iso2022/iso2022-docs.factor
new file mode 100644 (file)
index 0000000..7e21dd6
--- /dev/null
@@ -0,0 +1,13 @@
+! Copyright (C) 2009 Daniel Ehrenberg
+! See http://factorcode.org/license.txt for BSD license.
+USING: help.syntax help.markup ;
+IN: io.encodings.iso2022
+
+HELP: iso2022
+{ $class-description "This encoding class implements ISO 2022-JP-1, a Japanese text encoding commonly used for email." }
+{ $see-also "encodings-introduction" } ;
+
+ARTICLE: "io.encodings.iso2022" "ISO 2022-JP-1 encoding"
+{ $subsection iso2022 } ;
+
+ABOUT: "io.encodings.iso2022"
diff --git a/basis/io/encodings/iso2022/iso2022-tests.factor b/basis/io/encodings/iso2022/iso2022-tests.factor
new file mode 100644 (file)
index 0000000..9111eee
--- /dev/null
@@ -0,0 +1,36 @@
+! Copyright (C) 2009 Daniel Ehrenberg
+! See http://factorcode.org/license.txt for BSD license.
+USING: io.encodings.string io.encodings.iso2022 tools.test
+io.encodings.iso2022.private literals strings byte-arrays ;
+IN: io.encodings.iso2022
+
+[ "hello" ] [ "hello" >byte-array iso2022 decode ] unit-test
+[ "hello" ] [ "hello" iso2022 encode >string ] unit-test
+
+[ "hi" ] [ B{ CHAR: h ESC CHAR: ( CHAR: B CHAR: i } iso2022 decode ] unit-test
+[ "hi" ] [ B{ CHAR: h CHAR: i ESC CHAR: ( CHAR: B } iso2022 decode ] unit-test
+[ "hi\u00fffd" ] [ B{ CHAR: h CHAR: i ESC CHAR: ( } iso2022 decode ] unit-test
+[ "hi\u00fffd" ] [ B{ CHAR: h CHAR: i ESC } iso2022 decode ] unit-test
+
+[ B{ CHAR: h ESC CHAR: ( CHAR: J HEX: D8 } ] [ "h\u00ff98" iso2022 encode ] unit-test
+[ "h\u00ff98" ] [ B{ CHAR: h ESC CHAR: ( CHAR: J HEX: D8 } iso2022 decode ] unit-test
+[ "hi" ] [ B{ CHAR: h ESC CHAR: ( CHAR: J CHAR: i } iso2022 decode ] unit-test
+[ "h" ] [ B{ CHAR: h ESC CHAR: ( CHAR: J } iso2022 decode ] unit-test
+[ "h\u00fffd" ] [ B{ CHAR: h ESC CHAR: ( CHAR: J HEX: 80 } iso2022 decode ] unit-test
+
+[ B{ CHAR: h ESC CHAR: $ CHAR: B HEX: 3E HEX: 47 } ] [ "h\u007126" iso2022 encode ] unit-test
+[ "h\u007126" ] [ B{ CHAR: h ESC CHAR: $ CHAR: B HEX: 3E HEX: 47 } iso2022 decode ] unit-test
+[ "h\u00fffd" ] [ B{ CHAR: h ESC CHAR: $ CHAR: B HEX: 3E } iso2022 decode ] unit-test
+[ "h" ] [ B{ CHAR: h ESC CHAR: $ CHAR: B } iso2022 decode ] unit-test
+[ "h\u00fffd" ] [ B{ CHAR: h ESC CHAR: $ } iso2022 decode ] unit-test
+[ "h\u00fffd" ] [ B{ CHAR: h ESC } iso2022 decode ] unit-test
+[ "h\u00fffd" ] [ B{ CHAR: h ESC CHAR: $ CHAR: B HEX: 80 HEX: 80 } iso2022 decode ] unit-test
+
+[ B{ CHAR: h ESC CHAR: $ CHAR: ( CHAR: D HEX: 38 HEX: 54 } ] [ "h\u0058ce" iso2022 encode ] unit-test
+[ "h\u0058ce" ] [ B{ CHAR: h ESC CHAR: $ CHAR: ( CHAR: D HEX: 38 HEX: 54 } iso2022 decode ] unit-test
+[ "h\u00fffd" ] [ B{ CHAR: h ESC CHAR: $ CHAR: ( CHAR: D HEX: 38 } iso2022 decode ] unit-test
+[ "h" ] [ B{ CHAR: h ESC CHAR: $ CHAR: ( CHAR: D } iso2022 decode ] unit-test
+[ "h\u00fffd" ] [ B{ CHAR: h ESC CHAR: $ CHAR: ( } iso2022 decode ] unit-test
+[ "h\u00fffd" ] [ B{ CHAR: h ESC CHAR: $ CHAR: ( CHAR: D HEX: 70 HEX: 70 } iso2022 decode ] unit-test
+
+[ "\u{syriac-music}" iso2022 encode ] must-fail
diff --git a/basis/io/encodings/iso2022/iso2022.factor b/basis/io/encodings/iso2022/iso2022.factor
new file mode 100644 (file)
index 0000000..a057df2
--- /dev/null
@@ -0,0 +1,107 @@
+! Copyright (C) 2009 Daniel Ehrenberg
+! See http://factorcode.org/license.txt for BSD license.
+USING: io.encodings kernel sequences io simple-flat-file sets math
+combinators.short-circuit io.binary values arrays assocs
+locals accessors combinators biassocs byte-arrays parser ;
+IN: io.encodings.iso2022
+
+SINGLETON: iso2022
+
+<PRIVATE
+
+VALUE: jis201
+VALUE: jis208
+VALUE: jis212
+
+"vocab:io/encodings/iso2022/201.txt" flat-file>biassoc to: jis201
+"vocab:io/encodings/iso2022/208.txt" flat-file>biassoc to: jis208
+"vocab:io/encodings/iso2022/212.txt" flat-file>biassoc to: jis212
+
+VALUE: ascii
+128 unique >biassoc to: ascii
+
+TUPLE: iso2022-state type ;
+
+: make-iso-coder ( encoding -- state )
+    drop ascii iso2022-state boa ;
+
+M: iso2022 <encoder>
+    make-iso-coder <encoder> ;
+
+M: iso2022 <decoder>
+    make-iso-coder <decoder> ;
+
+<< SYNTAX: ESC HEX: 16 parsed ; >>
+
+CONSTANT: switch-ascii B{ ESC CHAR: ( CHAR: B }
+CONSTANT: switch-jis201 B{ ESC CHAR: ( CHAR: J }
+CONSTANT: switch-jis208 B{ ESC CHAR: $ CHAR: B }
+CONSTANT: switch-jis212 B{ ESC CHAR: $ CHAR: ( CHAR: D }
+
+: find-type ( char -- code type )
+    {
+        { [ dup ascii value? ] [ drop switch-ascii ascii ] }
+        { [ dup jis201 value? ] [ drop switch-jis201 jis201 ] }
+        { [ dup jis208 value? ] [ drop switch-jis208 jis208 ] }
+        { [ dup jis212 value? ] [ drop switch-jis212 jis212 ] }
+        [ encode-error ]
+    } cond ;
+
+: stream-write-num ( num stream -- )
+    over 256 >=
+    [ [ h>b/b swap 2byte-array ] dip stream-write ]
+    [ stream-write1 ] if ;
+
+M:: iso2022-state encode-char ( char stream encoding -- )
+    char encoding type>> value? [
+        char find-type
+        [ stream stream-write ]
+        [ encoding (>>type) ] bi*
+    ] unless
+    char encoding type>> value-at stream stream-write-num ;
+
+: read-escape ( stream -- type/f )
+    dup stream-read1 {
+        { CHAR: ( [
+            stream-read1 {
+                { CHAR: B [ ascii ] }
+                { CHAR: J [ jis201 ] }
+                [ drop f ]
+            } case
+        ] }
+        { CHAR: $ [
+            dup stream-read1 {
+                { CHAR: @ [ drop jis208 ] } ! want: JIS X 0208-1978 
+                { CHAR: B [ drop jis208 ] }
+                { CHAR: ( [
+                    stream-read1 CHAR: D = jis212 f ?
+                ] }
+                [ 2drop f ]
+            } case
+        ] }
+        [ 2drop f ]
+    } case ;
+
+: double-width? ( type -- ? )
+    { [ jis208 eq? ] [ jis212 eq? ] } 1|| ;
+
+: finish-decode ( num encoding -- char )
+    type>> at replacement-char or ;
+
+M:: iso2022-state decode-char ( stream encoding -- char )
+    stream stream-read1 {
+        { ESC [
+            stream read-escape [
+                encoding (>>type)
+                stream encoding decode-char
+            ] [ replacement-char ] if*
+        ] }
+        { f [ f ] }
+        [
+            encoding type>> double-width? [
+                stream stream-read1
+                [ 2byte-array be> encoding finish-decode ]
+                [ drop replacement-char ] if*
+            ] [ encoding finish-decode ] if
+        ]
+    } case ;
diff --git a/basis/io/encodings/iso2022/summary.txt b/basis/io/encodings/iso2022/summary.txt
new file mode 100644 (file)
index 0000000..a025a21
--- /dev/null
@@ -0,0 +1 @@
+ISO-2022-JP-1 text encoding
index b7edec2de7bb80517d5ad2d01e423e0bac6d328f..d93c5dd24edde37ed41bd970add584bda579603b 100644 (file)
@@ -3,6 +3,6 @@
 USING: help.syntax help.markup ;
 IN: io.encodings.strict
 
-HELP: strict ( encoding -- strict-encoding )
-{ $values { "encoding" "an encoding descriptor" } { "strict-encoding" "a strict encoding descriptor" } }
+HELP: strict ( code -- strict )
+{ $values { "code" "an encoding descriptor" } { "strict" "a strict encoding descriptor" } }
 { $description "Makes an encoding strict, that is, in the presence of a malformed code point, an error is thrown. Note that the existence of a replacement character in a file (U+FFFD) also throws an error." } ;
index 5e7d1af8f57622a5c35538a43c059f9978c535b4..9f3f35ff2a7136f01ab3256eee86f100e025d970 100644 (file)
@@ -2,7 +2,7 @@ USING: accessors alien.c-types kernel
 io.encodings.utf16 io.streams.byte-array tools.test ;
 IN: io.encodings.utf16n
 
-: correct-endian
+: correct-endian ( obj -- ? )
     code>> little-endian? [ utf16le = ] [ utf16be = ] if ;
 
 [ t ] [ B{ } utf16n <byte-reader> correct-endian ] unit-test
index b8a4431a73ba11724afbdd7171bb58964f863ef4..74fc0450329863eaa44f97d7f94d727b7e7d52e4 100644 (file)
@@ -23,7 +23,7 @@ HELP: unique-retries
 
 { unique-length unique-retries } related-words
 
-HELP: make-unique-file ( prefix suffix -- path )
+HELP: make-unique-file
 { $values { "prefix" "a string" } { "suffix" "a string" }
 { "path" "a pathname string" } }
 { $description "Creates a file that is guaranteed not to exist in the directory stored in " { $link current-temporary-directory } ". The file name is composed of a prefix, a number of random digits and letters, and the suffix. Returns the full pathname." }
@@ -31,18 +31,18 @@ HELP: make-unique-file ( prefix suffix -- path )
 
 { unique-file make-unique-file cleanup-unique-file } related-words
 
-HELP: cleanup-unique-file ( prefix suffix quot: ( path -- ) -- )
+HELP: cleanup-unique-file
 { $values { "prefix" "a string" } { "suffix" "a string" }
 { "quot" "a quotation" } }
 { $description "Creates a file with " { $link make-unique-file } " and calls the quotation with the path name on the stack." }
 { $notes "The unique file will be deleted after calling this word." } ;
 
-HELP: unique-directory ( -- path )
+HELP: unique-directory
 { $values { "path" "a pathname string" } }
 { $description "Creates a directory in the value in " { $link current-temporary-directory } " that is guaranteed not to exist in and returns the full pathname." }
 { $errors "Throws an error if the directory cannot be created after a number of tries. The most likely error is incorrect directory permissions on the temporary directory." } ;
 
-HELP: cleanup-unique-directory ( quot -- )
+HELP: cleanup-unique-directory
 { $values { "quot" "a quotation" } }
 { $description "Creates a directory with " { $link unique-directory } " and calls the quotation with the pathname on the stack using the " { $link with-temporary-directory } " combinator. The quotation can access the " { $link current-temporary-directory } " symbol for the name of the temporary directory. Subsequent unique files will be created in this unique directory until the combinator returns." }
 { $notes "The directory will be deleted after calling this word, even if an error is thrown in the quotation. This combinator is like " { $link with-unique-directory } " but does not delete the directory." } ;
index 860702c5635b50853db0b34f7d30a7f40a4aef8a..4903db2b1b79615c695cab06035ea0ef70250f13 100644 (file)
@@ -5,13 +5,13 @@ IN: io.streams.duplex.tests
 ! Test duplex stream close behavior
 TUPLE: closing-stream < disposable ;
 
-: <closing-stream> closing-stream new ;
+: <closing-stream> ( -- stream ) closing-stream new ;
 
 M: closing-stream dispose* drop ;
 
 TUPLE: unclosable-stream ;
 
-: <unclosable-stream> unclosable-stream new ;
+: <unclosable-stream> ( -- stream ) unclosable-stream new ;
 
 M: unclosable-stream dispose
     "Can't close me!" throw ;
index 61aa3239245824e73b0735f4defc59a8981ffe03..0616794939ee6a405eaa3fd1c5db3638dff6dbc8 100644 (file)
@@ -3,7 +3,7 @@ tools.test parser math namespaces continuations vocabs kernel
 compiler.units eval vocabs.parser ;
 IN: listener.tests
 
-: hello "Hi" print ; parsing
+SYNTAX: hello "Hi" print ;
 
 : parse-interactive ( string -- quot )
     <string-reader> stream-read-quot ;
@@ -50,7 +50,7 @@ IN: listener.tests
 
 [
     [ ] [
-        "IN: listener.tests : hello\n\"world\" ;" parse-interactive
+        "IN: listener.tests : hello ( -- )\n\"world\" ;" parse-interactive
         drop
     ] unit-test
 ] with-file-vocabs
index c03a869ebd13feebbcad0b5becbbb927aa6fb2b8..8782c3d9b4082d4026140a1a2128ce005eb2d115 100644 (file)
@@ -83,10 +83,6 @@ HELP: nil?
 
 { nil nil? } related-words
 
-HELP: list? ( object -- ? )
-{ $values { "object" "an object" } { "?" "a boolean" } }
-{ $description "Returns true if the object conforms to the list protocol." } ;
-
 { 1list 2list 3list } related-words
 
 HELP: 1list
index 558fa78494bd1eb34143bc614092d78b54792955..8e3b59fe69743d7a5d540fa1fff410f6d49ead3c 100644 (file)
@@ -192,14 +192,14 @@ M:: string lambda-generic ( a b -- c ) a b lambda-generic-2 ;
 DEFER: xyzzy
 
 [ ] [
-    "IN: locals.tests USE: math GENERIC: xyzzy M: integer xyzzy ;"
+    "IN: locals.tests USE: math GENERIC: xyzzy ( a -- b ) M: integer xyzzy ;"
     <string-reader> "lambda-generic-test" parse-stream drop
 ] unit-test
 
 [ 10 ] [ 10 xyzzy ] unit-test
 
 [ ] [
-    "IN: locals.tests USE: math USE: locals GENERIC: xyzzy M:: integer xyzzy ( n -- ) 5 ;"
+    "IN: locals.tests USE: math USE: locals GENERIC: xyzzy ( a -- b ) M:: integer xyzzy ( n -- x ) 5 ;"
     <string-reader> "lambda-generic-test" parse-stream drop
 ] unit-test
 
@@ -245,7 +245,7 @@ M:: fixnum next-method-test ( a -- b ) a call-next-method 1 + ;
 
 [ 5 ] [ 1 next-method-test ] unit-test
 
-: no-with-locals-test { 1 2 3 } [| x | x 3 + ] map ;
+: no-with-locals-test ( -- seq ) { 1 2 3 } [| x | x 3 + ] map ;
 
 [ { 4 5 6 } ] [ no-with-locals-test ] unit-test
 
@@ -259,7 +259,7 @@ M:: fixnum next-method-test ( a -- b ) a call-next-method 1 + ;
 
 :: a-word-with-locals ( a b -- ) ;
 
-: new-definition "USING: math ;\nIN: locals.tests\n: a-word-with-locals ( -- x ) 2 3 + ;\n" ;
+CONSTANT: new-definition "USING: math ;\nIN: locals.tests\n: a-word-with-locals ( -- x ) 2 3 + ;\n"
 
 [ ] [ new-definition eval ] unit-test
 
@@ -268,7 +268,7 @@ M:: fixnum next-method-test ( a -- b ) a call-next-method 1 + ;
     new-definition =
 ] unit-test
 
-: method-definition "USING: locals locals.tests sequences ;\nM:: sequence method-with-locals ( a -- y ) a reverse ;\n" ;
+CONSTANT: method-definition "USING: locals locals.tests sequences ;\nM:: sequence method-with-locals ( a -- y ) a reverse ;\n"
 
 GENERIC: method-with-locals ( x -- y )
 
index 190be61e23c2b59eb6aafef775de7e7534035cf9..9e26a8caaa413c143e06563021286e57412b58de 100644 (file)
@@ -1,31 +1,29 @@
-! Copyright (C) 2007, 2008 Slava Pestov, Eduardo Cavazos.
+! Copyright (C) 2007, 2009 Slava Pestov, Eduardo Cavazos.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: lexer macros memoize parser sequences vocabs
 vocabs.loader words kernel namespaces locals.parser locals.types
 locals.errors ;
 IN: locals
 
-: :>
+SYNTAX: :>
     scan locals get [ :>-outside-lambda-error ] unless*
-    [ make-local ] bind <def> parsed ; parsing
+    [ make-local ] bind <def> parsed ;
 
-: [| parse-lambda over push-all ; parsing
+SYNTAX: [| parse-lambda over push-all ;
 
-: [let parse-let over push-all ; parsing
+SYNTAX: [let parse-let over push-all ;
 
-: [let* parse-let* over push-all ; parsing
+SYNTAX: [let* parse-let* over push-all ;
 
-: [wlet parse-wlet over push-all ; parsing
+SYNTAX: [wlet parse-wlet over push-all ;
 
-: :: (::) define ; parsing
+SYNTAX: :: (::) define-declared ;
 
-: M:: (M::) define ; parsing
+SYNTAX: M:: (M::) define ;
 
-: MACRO:: (::) define-macro ; parsing
+SYNTAX: MACRO:: (::) define-macro ;
 
-: MEMO:: (::) define-memoized ; parsing
-
-USE: syntax
+SYNTAX: MEMO:: (::) define-memoized ;
 
 {
     "locals.macros"
index d987e2c91d42831447ecab0a0d7b39571768246d..5e9bdfbed6620286d98de669903471bc4d5d2b99 100644 (file)
@@ -103,18 +103,19 @@ M: lambda-parser parse-quotation ( -- quotation )
     "|" expect "|" parse-wbindings
     (parse-lambda) <wlet> ?rewrite-closures ;
 
-: parse-locals ( -- vars assoc )
-    "(" expect ")" parse-effect
-    word [ over "declared-effect" set-word-prop ] when*
+: parse-locals ( -- effect vars assoc )
+    complete-effect
+    dup
     in>> [ dup pair? [ first ] when ] map make-locals ;
 
-: parse-locals-definition ( word reader -- word quot )
+: parse-locals-definition ( word reader -- word quot effect )
     [ parse-locals ] dip
     ((parse-lambda)) <lambda>
-    [ "lambda" set-word-prop ]
-    [ rewrite-closures dup length 1 = [ first ] [ bad-rewrite ] if ] 2bi ; inline
+    [ nip "lambda" set-word-prop ]
+    [ nip rewrite-closures dup length 1 = [ first ] [ bad-rewrite ] if ]
+    [ drop nip ] 3tri ; inline
 
-: (::) ( -- word def )
+: (::) ( -- word def effect )
     CREATE-WORD
     [ parse-definition ]
     parse-locals-definition ;
@@ -123,5 +124,5 @@ M: lambda-parser parse-quotation ( -- quotation )
     CREATE-METHOD
     [
         [ parse-definition ] 
-        parse-locals-definition
+        parse-locals-definition drop
     ] with-method-definition ;
\ No newline at end of file
index c8413c14fe7a6b63750c7061b586b38e36d6fe45..c8179108ef12d359c2958bd413c5b68c164b09ff 100644 (file)
@@ -135,11 +135,11 @@ PRIVATE>
     [ [ input-logging-quot ] 2keep drop error-logging-quot ]\r
     (define-logging) ;\r
 \r
-: LOG:\r
+SYNTAX: LOG:\r
     #! Syntax: name level\r
     CREATE-WORD dup scan-word\r
     '[ 1array stack>message _ _ log-message ]\r
-    (( message -- )) define-declared ; parsing\r
+    (( message -- )) define-declared ;\r
 \r
 USE: vocabs.loader\r
 \r
index 7d93ce8a9ea4b83eb98ca66d1ca43819f77bc64d..91aa6880e6b6cfa845a81021906cb0808d84a1cd 100644 (file)
@@ -2,16 +2,22 @@ IN: macros.tests
 USING: tools.test macros math kernel arrays
 vectors io.streams.string prettyprint parser eval see ;
 
-MACRO: see-test ( a b -- c ) + ;
+MACRO: see-test ( a b -- quot ) + ;
 
-[ "USING: macros math ;\nIN: macros.tests\nMACRO: see-test ( a b -- c ) + ;\n" ]
+[ t ] [ \ see-test macro? ] unit-test
+
+[ "USING: macros math ;\nIN: macros.tests\nMACRO: see-test ( a b -- quot ) + ;\n" ]
 [ [ \ see-test see ] with-string-writer ]
 unit-test
 
+[ t ] [ \ see-test macro? ] unit-test
+
 [ t ] [
     "USING: math ;\nIN: macros.tests\n: see-test ( a b -- c ) - ;\n" dup eval
     [ \ see-test see ] with-string-writer =
 ] unit-test
 
+[ f ] [ \ see-test macro? ] unit-test
+
 [ ] [ "USING: macros stack-checker kernel ; IN: hanging-macro MACRO: c ( quot -- ) infer drop [ ] ; : a ( -- ) [ a ] c ;" eval ] unit-test
 
index 21a91e567d4e193756b3f03a41d47e53268cdf5b..a86b711340526c4b19b12d68005abd66d19c0d36 100644 (file)
@@ -6,17 +6,18 @@ IN: macros
 
 <PRIVATE
 
-: real-macro-effect ( word -- effect' )
-    stack-effect in>> 1 <effect> ;
+: real-macro-effect ( effect -- effect' )
+    in>> { "quot" } <effect> ;
 
 PRIVATE>
 
-: define-macro ( word definition -- )
-    [ "macro" set-word-prop ]
-    [ over real-macro-effect memoize-quot [ call ] append define ]
-    2bi ;
+: define-macro ( word definition effect -- )
+    real-macro-effect
+    [ [ memoize-quot [ call ] append ] keep define-declared ]
+    [ drop "macro" set-word-prop ]
+    3bi ;
 
-: MACRO: (:) define-macro ; parsing
+SYNTAX: MACRO: (:) define-macro ;
 
 PREDICATE: macro < word "macro" word-prop >boolean ;
 
index 3846dea3be6317944c30690230c60c36daca12cf..b21d8c6d733983bf237c6fc521dcdb16da43769a 100644 (file)
@@ -16,8 +16,8 @@ SYMBOL: _
 : define-match-vars ( seq -- )
     [ define-match-var ] each ;
 
-: MATCH-VARS: ! vars ...
-    ";" parse-tokens define-match-vars ; parsing
+SYNTAX: MATCH-VARS: ! vars ...
+    ";" parse-tokens define-match-vars ;
 
 : match-var? ( symbol -- bool )
     dup word? [ "match-var" word-prop ] [ drop f ] if ;
index 6fad54550104b00adeb1cbb463b52a65ddced9e8..1882ccd0d58ce4db8ad5359d0857e83c7f55ea9d 100755 (executable)
@@ -289,7 +289,7 @@ M: MATRIX n*V(*)V+M!
 M: MATRIX n*V(*)Vconj+M!
     (prepare-ger) [ XGERC ] dip ;
 
-: XMATRIX{ \ } [ >MATRIX ] parse-literal ; parsing
+SYNTAX: XMATRIX{ \ } [ >MATRIX ] parse-literal ;
 
 M: MATRIX pprint-delims
     drop \ XMATRIX{ \ } ;
index 84b5fd9e6f707490ca013ac89a3c997e93a71daa..d7c6ebc92739083c13b1dd176f489343a26ca124 100755 (executable)
@@ -179,7 +179,7 @@ M: VECTOR n*V+V!
 M: VECTOR n*V!
     (prepare-scal) [ XSCAL ] dip ;
 
-: XVECTOR{ \ } [ >VECTOR ] parse-literal ; parsing
+SYNTAX: XVECTOR{ \ } [ >VECTOR ] parse-literal ;
 
 M: VECTOR pprint-delims
     drop \ XVECTOR{ \ } ;
index 273fd0b2b52116759963f927d55234e429833bd7..c41faaf5585a1638e298b93638d00d220adb929d 100644 (file)
@@ -31,7 +31,7 @@ M: complex sqrt >polar [ fsqrt ] [ 2.0 / ] bi* polar> ;
 
 IN: syntax
 
-: C{ \ } [ first2 rect> ] parse-literal ; parsing
+SYNTAX: C{ \ } [ first2 rect> ] parse-literal ;
 
 USE: prettyprint.custom
 
index 3bc573dff513c73bb0bb3d3d0efc2e9aea616509..4e10fc3de4548e3afc165ad5b8b5a64c055cfb9f 100644 (file)
@@ -34,14 +34,13 @@ M: too-many-arguments summary
 
 PRIVATE>
 
-: define-memoized ( word quot -- )
-    [ H{ } clone ] dip
-    [ pick stack-effect make-memoizer define ]
-    [ nip "memo-quot" set-word-prop ]
-    [ drop "memoize" set-word-prop ]
+: define-memoized ( word quot effect -- )
+    [ drop "memo-quot" set-word-prop ]
+    [ 2drop H{ } clone "memoize" set-word-prop ]
+    [ [ [ dup "memoize" word-prop ] 2dip make-memoizer ] keep define-declared ]
     3tri ;
 
-: MEMO: (:) define-memoized ; parsing
+SYNTAX: MEMO: (:) define-memoized ;
 
 PREDICATE: memoized < word "memoize" word-prop ;
 
index 67155b83032f2ae6d877a63a45ab756bdfd99d81..f875fa31400d069b132c581388bb2796fcff6b69 100644 (file)
@@ -4,7 +4,7 @@ IN: models.tests
 
 TUPLE: model-tester hit? ;
 
-: <model-tester> model-tester new ;
+: <model-tester> ( -- model-tester ) model-tester new ;
 
 M: model-tester model-changed nip t >>hit? drop ;
 
index 50c0365728246e1ebc2fc0554de74d0045569197..e9119e8452e5e8896fbd98365c4e6192b3d06aea 100644 (file)
@@ -3,7 +3,7 @@ USING: arrays generic kernel math models namespaces sequences assocs
 tools.test models.range ;\r
 \r
 ! Test <range> \r
-: setup-range 0 0 0 255 <range> ;\r
+: setup-range ( -- range ) 0 0 0 255 <range> ;\r
 \r
 ! clamp-value should not go past range ends\r
 [ 0   ] [ -10 setup-range clamp-value ] unit-test\r
index 53c2789c50b669eb8355c5a30eebfb48a9b2b015..2e8f8eb4c497d1fb9252ee15b1b554f2d6645a6f 100644 (file)
@@ -20,10 +20,10 @@ PRIVATE>
     [ (parse-here) ] "" make but-last
     lexer get next-line ;
 
-: STRING:
+SYNTAX: STRING:
     CREATE-WORD
     parse-here 1quotation
-    (( -- string )) define-inline ; parsing
+    (( -- string )) define-inline ;
 
 <PRIVATE
 
@@ -48,16 +48,16 @@ PRIVATE>
         change-column drop
     ] "" make ;
 
-: <"
-    "\">" parse-multiline-string parsed ; parsing
+SYNTAX: <"
+    "\">" parse-multiline-string parsed ;
 
-: <'
-    "'>" parse-multiline-string parsed ; parsing
+SYNTAX: <'
+    "'>" parse-multiline-string parsed ;
 
-: {'
-    "'}" parse-multiline-string parsed ; parsing
+SYNTAX: {'
+    "'}" parse-multiline-string parsed ;
 
-: {"
-    "\"}" parse-multiline-string parsed ; parsing
+SYNTAX: {"
+    "\"}" parse-multiline-string parsed ;
 
-: /* "*/" parse-multiline-string drop ; parsing
+SYNTAX: /* "*/" parse-multiline-string drop ;
index 22a1515908fa7a1e8238c631cce6e20adaea2e08..16bea56862fe19bd921ae11d591cd89473043f7d 100644 (file)
@@ -62,7 +62,7 @@ M: nibble-array resize
 
 M: nibble-array byte-length length nibbles>bytes ;
 
-: N{ \ } [ >nibble-array ] parse-literal ; parsing
+SYNTAX: N{ \ } [ >nibble-array ] parse-literal ;
 
 INSTANCE: nibble-array sequence
 
index fb2ddfaf3e411498e22f449a7fb13d98d5e9c74b..ccd3f5fad74e2ed9806fe53f5b349fe91a3efd47 100644 (file)
@@ -47,7 +47,7 @@ reset-gl-function-number-counter
     parameters return parse-arglist [ abi indirect-quot ] dip
     define-declared ;
 
-: GL-FUNCTION:
+SYNTAX: GL-FUNCTION:
     gl-function-calling-convention
     scan
     scan dup
@@ -55,5 +55,4 @@ reset-gl-function-number-counter
     gl-function-number
     [ gl-function-pointer ] 2curry swap
     ";" parse-tokens [ "()" subseq? not ] filter
-    define-indirect
-    ; parsing
+    define-indirect ;
index e512e3134c66e644de062a9e8826fc1c02c2ab48..8ed15a4e5e2b2dd53963abdef639b0bf2f3cc035 100644 (file)
@@ -279,12 +279,12 @@ H{ } clone verify-messages set-global
 
 : verify-message ( n -- word ) verify-messages get-global at ;
 
-: X509_V_:
+SYNTAX: X509_V_:
     scan "X509_V_" prepend create-in
     scan-word
     [ 1quotation (( -- value )) define-inline ]
     [ verify-messages get set-at ]
-    2bi ; parsing
+    2bi ;
 
 >>
 
index 1f526d47f2bd3122a02197bf55d839fd2b2430ad..9f730831e79e11184a71d04814b20df6e88fc6de 100644 (file)
@@ -34,9 +34,9 @@ TUPLE: tokenizer any one many ;
 : reset-tokenizer ( -- )\r
   default-tokenizer \ tokenizer set-global ;\r
 \r
-: TOKENIZER: \r
+SYNTAX: TOKENIZER: \r
   scan search [ "Tokenizer not found" throw ] unless*\r
-  execute( -- tokenizer ) \ tokenizer set-global ; parsing\r
+  execute( -- tokenizer ) \ tokenizer set-global ;\r
 \r
 TUPLE: ebnf-non-terminal symbol ;\r
 TUPLE: ebnf-terminal symbol ;\r
@@ -522,16 +522,14 @@ M: ebnf-non-terminal (transform) ( ast -- parser )
   parse-ebnf dup dup parser [ main swap at compile ] with-variable\r
   [ compiled-parse ] curry [ with-scope ast>> ] curry ;\r
 \r
-: <EBNF "EBNF>" reset-tokenizer parse-multiline-string parse-ebnf main swap at  \r
-  parsed reset-tokenizer ; parsing\r
+SYNTAX: <EBNF "EBNF>" reset-tokenizer parse-multiline-string parse-ebnf main swap at  \r
+  parsed reset-tokenizer ;\r
 \r
-: [EBNF "EBNF]" reset-tokenizer parse-multiline-string ebnf>quot nip \r
-  parsed \ call parsed reset-tokenizer ; parsing\r
+SYNTAX: [EBNF "EBNF]" reset-tokenizer parse-multiline-string ebnf>quot nip \r
+  parsed \ call parsed reset-tokenizer ;\r
 \r
-: EBNF: \r
+SYNTAX: EBNF: \r
   reset-tokenizer CREATE-WORD dup ";EBNF" parse-multiline-string  \r
   ebnf>quot swapd (( input -- ast )) define-declared "ebnf-parser" set-word-prop \r
-  reset-tokenizer ; parsing\r
-\r
-\r
+  reset-tokenizer ;\r
 \r
index 6c0772aacc3269d883872d0874b25d8beeef14d1..98c92159ec6b0ac452e067b2d16e9dab38676a48 100644 (file)
@@ -616,9 +616,9 @@ PRIVATE>
 
 ERROR: parse-failed input word ;
 
-: PEG:
+SYNTAX: PEG:
   (:)
-  [let | def [ ] word [ ] |
+  [let | effect [ ] def [ ] word [ ] |
     [
       [
         [let | compiled-def [ def call compile ] |
@@ -626,11 +626,11 @@ ERROR: parse-failed input word ;
             dup compiled-def compiled-parse
             [ ast>> ] [ word parse-failed ] ?if
           ]
-          word swap define
+          word swap effect define-declared
         ]
       ] with-compilation-unit
     ] over push-all
-  ] ; parsing
+  ] ;
 
 USING: vocabs vocabs.loader ;
 
index 8c80782a2e5da3d8dfcda6d3e91ee63aa798848f..67886312c67379383fd7504e7e36178fc2ea5c7b 100644 (file)
@@ -48,7 +48,7 @@ M: persistent-hash hashcode* nip assoc-size ;
 
 M: persistent-hash clone ;
 
-: PH{ \ } [ >persistent-hash ] parse-literal ; parsing
+SYNTAX: PH{ \ } [ >persistent-hash ] parse-literal ;
 
 M: persistent-hash pprint-delims drop \ PH{ \ } ;
 M: persistent-hash >pprint-sequence >alist ;
index cecd6dab539bb57b72f4722c0b114d691e7415d9..3a1f910532cfcf07e83806fa219899818ea1d4dc 100644 (file)
@@ -1,9 +1,9 @@
 USING: persistent.heaps tools.test ;
 IN: persistent.heaps.tests
 
-: test-input
+CONSTANT: test-input
     { { "hello" 3 } { "goodbye" 2 } { "whatever" 5 }
-      { "foo" 1 } { "bar" -1 } { "baz" -7 } { "bing" 0 } } ;
+      { "foo" 1 } { "bar" -1 } { "baz" -7 } { "bing" 0 } }
 
 [
     { { "baz" -7 } { "bar" -1 } { "bing" 0 } { "foo" 1 }
index 478fc0ad254ade4c7cffdac81b4fa9147f57f4ca..ae33b7c39aa7f024d06e87ada22923e584a57cf8 100644 (file)
@@ -179,7 +179,7 @@ M: persistent-vector equal?
 : >persistent-vector ( seq -- pvec )
     T{ persistent-vector } like ;
 
-: PV{ \ } [ >persistent-vector ] parse-literal ; parsing
+SYNTAX: PV{ \ } [ >persistent-vector ] parse-literal ;
 
 M: persistent-vector pprint-delims drop \ PV{ \ } ;
 M: persistent-vector >pprint-sequence ;
index 2be725c0f65247045addf65c91e77974249c6222..f938ab30f763b32e77383b9b253f60bcbcdcdddd 100644 (file)
@@ -96,12 +96,12 @@ ARTICLE: "prettyprint-literal" "Literal prettyprinting protocol"
 { $code
     "TUPLE: rect w h ;"
     ""
-    ": RECT["
+    "SYNTAX: RECT["
     "    scan-word"
     "    scan-word \\ * assert="
     "    scan-word"
     "    scan-word \\ ] assert="
-    "    <rect> parsed ; parsing"
+    "    <rect> parsed ;"
 }
 "An example literal might be:"
 { $code "RECT[ 100 * 200 ]" }
index aaaf6b80d1040df7e062c0d26890568afa8e43f4..7e37aa0da57fe910de07c6c7c6a73543191a731f 100644 (file)
@@ -63,7 +63,7 @@ unit-test
 [ "USING: math ;\nIN: prettyprint.tests\n: bar ( x -- y ) 2 + ;\n" ]
 [ [ \ bar see ] with-string-writer ] unit-test
 
-: blah 
+: blah ( a a a a a a a a a a a a a a a a a a a a -- )
     drop
     drop
     drop
@@ -102,7 +102,7 @@ unit-test
         ] keep =
     ] with-scope ;
 
-GENERIC: method-layout
+GENERIC: method-layout ( a -- b )
 
 M: complex method-layout
     "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
@@ -135,7 +135,7 @@ M: object method-layout ;
     [ \ method-layout see-methods ] with-string-writer "\n" split
 ] unit-test
 
-: soft-break-test
+: soft-break-test ( -- str )
     {
         "USING: kernel math sequences strings ;"
         "IN: prettyprint.tests"
@@ -152,7 +152,7 @@ M: object method-layout ;
 
 DEFER: parse-error-file
 
-: another-soft-break-test
+: another-soft-break-test ( -- str )
     {
         "USING: make sequences ;"
         "IN: prettyprint.tests"
@@ -166,7 +166,7 @@ DEFER: parse-error-file
     check-see
 ] unit-test
 
-: string-layout
+: string-layout ( -- str )
     {
         "USING: accessors debugger io kernel ;"
         "IN: prettyprint.tests"
@@ -187,7 +187,7 @@ DEFER: parse-error-file
 
 \ send soft "break-after" set-word-prop
 
-: final-soft-break-test
+: final-soft-break-test ( -- str )
     {
         "USING: kernel sequences ;"
         "IN: prettyprint.tests"
@@ -202,7 +202,7 @@ DEFER: parse-error-file
     "final-soft-break-layout" final-soft-break-test check-see
 ] unit-test
 
-: narrow-test
+: narrow-test ( -- str )
     {
         "USING: arrays combinators continuations kernel sequences ;"
         "IN: prettyprint.tests"
@@ -218,7 +218,7 @@ DEFER: parse-error-file
     "narrow-layout" narrow-test check-see
 ] unit-test
 
-: another-narrow-test
+: another-narrow-test ( -- str )
     {
         "IN: prettyprint.tests"
         ": another-narrow-layout ( -- obj )"
@@ -326,7 +326,7 @@ INTERSECTION: intersection-see-test sequence number ;
     
 TUPLE: started-out-hustlin' ;
 
-GENERIC: ended-up-ballin'
+GENERIC: ended-up-ballin' ( a -- b )
 
 M: started-out-hustlin' ended-up-ballin' ; inline
 
diff --git a/basis/quoting/quoting-docs.factor b/basis/quoting/quoting-docs.factor
deleted file mode 100644 (file)
index 5fb68db..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-! Copyright (C) 2009 Doug Coleman.
-! See http://factorcode.org/license.txt for BSD license.
-USING: help.markup help.syntax strings ;
-IN: quoting
-
-HELP: quote?
-{ $values
-     { "ch" "a character" }
-     { "?" "a boolean" }
-}
-{ $description "Returns true if the character is a single or double quote." } ;
-
-HELP: quoted?
-{ $values
-     { "str" string }
-     { "?" "a boolean" }
-}
-{ $description "Returns true if a string is surrounded by matching single or double quotes as the first and last characters." } ;
-
-HELP: unquote
-{ $values
-     { "str" string }
-     { "newstr" string }
-}
-{ $description "Removes a pair of matching single or double quotes from a string." } ;
-
-ARTICLE: "quoting" "Quotation marks"
-"The " { $vocab-link "quoting" } " vocabulary is for removing quotes from a string." $nl
-"Removing quotes:"
-{ $subsection unquote } ;
-
-ABOUT: "quoting"
diff --git a/basis/quoting/quoting-tests.factor b/basis/quoting/quoting-tests.factor
deleted file mode 100644 (file)
index 0cc28a1..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-! Copyright (C) 2009 Doug Coleman.
-! See http://factorcode.org/license.txt for BSD license.
-USING: tools.test quoting ;
-IN: quoting.tests
-
-
-[ "abc" ] [ "'abc'" unquote ] unit-test
-[ "abc" ] [ "\"abc\"" unquote ] unit-test
-[ "'abc" ] [ "'abc" unquote ] unit-test
-[ "abc'" ] [ "abc'" unquote ] unit-test
index 9e25037cd996952df3f2cc7ece96236b470663ca..5b09347c8c21ca1cc3b7e2f7984104a553d4b7f5 100644 (file)
@@ -1,6 +1,6 @@
 ! Copyright (C) 2009 Doug Coleman.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: combinators.short-circuit kernel math sequences strings ;
+USING: sequences math kernel strings combinators.short-circuit ;
 IN: quoting
 
 : quote? ( ch -- ? ) "'\"" member? ;
@@ -13,4 +13,4 @@ IN: quoting
     } 1&& ;
 
 : unquote ( str -- newstr )
-    dup quoted? [ but-last-slice rest-slice >string ] when ;
+    dup quoted? [ but-last-slice rest-slice >string ] when ;
\ No newline at end of file
index 7c1b2f22790bfdca05f14a555a40b7eaa3ce2abd..a4a77d97e963679ec4dbe6317c19e936c2ce96d9 100644 (file)
@@ -1 +1,2 @@
 Doug Coleman
+Daniel Ehrenberg
index 28b0ed1563441aa7a410fa04fc50e434c6f685cd..a1c4e3ca2a53cc3e01725d62f307a8a45b3e823c 100644 (file)
@@ -108,21 +108,24 @@ M: terminator-class class-member? ( obj class -- ? )
 
 M: f class-member? 2drop f ;
 
+: same? ( obj1 obj2 quot1: ( obj1 -- val1 ) quot2: ( obj2 -- val2 ) -- ? )
+    bi* = ; inline
+
 M: script-class class-member?
-    [ script-of ] [ script>> ] bi* = ;
+    [ script-of ] [ script>> ] same? ;
 
 M: category-class class-member?
-    [ category# ] [ category>> ] bi* = ;
+    [ category ] [ category>> ] same? ;
 
 M: category-range-class class-member?
-    [ category first ] [ category>> ] bi* = ;
+    [ category first ] [ category>> ] same? ;
 
 TUPLE: not-class class ;
 
 PREDICATE: not-integer < not-class class>> integer? ;
 
 UNION: simple-class
-    primitive-class range-class category-class category-range-class dot ;
+    primitive-class range-class dot ;
 PREDICATE: not-simple < not-class class>> simple-class? ;
 
 M: not-class class-member?
@@ -227,7 +230,10 @@ TUPLE: class-partition integers not-integers simples not-simples and or other ;
     dup or-class flatten partition-classes
     dup not-integers>> length {
         { 0 [ nip make-or-class ] }
-        { 1 [ not-integers>> first [ class>> '[ _ swap class-member? ] any? ] keep or ] }
+        { 1 [
+            not-integers>> first
+            [ class>> '[ _ swap class-member? ] any? ] keep or
+        ] }
         [ 3drop t ]
     } case ;
 
@@ -248,6 +254,12 @@ M: or-class <not-class>
 M: t <not-class> drop f ;
 M: f <not-class> drop t ;
 
+: <minus-class> ( a b -- a-b )
+    <not-class> 2array <and-class> ;
+
+: <sym-diff-class> ( a b -- a~b )
+    2array [ <or-class> ] [ <and-class> ] bi <minus-class> ;
+
 M: primitive-class class-member?
     class>> class-member? ;
 
index d606015f617e19e5e3a181174e0425df838593c1..5ea9753fbaf66b9ec2a964a7a8db951f30a0cb9d 100644 (file)
@@ -11,7 +11,7 @@ IN: regexp.parser.tests
     "a|b" "a.b" "a|b|c" "abc|b" "a|bcd" "a|(b)" "(?-i:a)" "||"
     "(a)|b" "(a|b)" "((a)|(b))" "(?:a)" "(?i:a)" "|b" "b|"
     "[abc]" "[a-c]" "[^a-c]" "[^]]" "[]a]" "[[]" "[]-a]" "[a-]" "[-]"
-    "[--a]" "foo*" "(foo)*" "(a|b)|c" "(foo){2,3}" "(foo){2,}"
+    "foo*" "(foo)*" "(a|b)|c" "(foo){2,3}" "(foo){2,}"
     "(foo){2}" "{2,3}" "{," "{,}" "}" "foo}" "[^]-a]" "[^-]a]"
     "[a-]" "[^a-]" "[^a-]" "a{,2}" "(?#foobar)"
     "\\p{Space}" "\\t" "\\[" "[\\]]" "\\P{Space}"
index bf5465e0e2607f0e8142360dfa9f84dde122c81a..9fcadc40084f78d7e3924d2b5264afcee144cab4 100644 (file)
@@ -2,7 +2,8 @@
 ! See http://factorcode.org/license.txt for BSD license.
 USING: peg.ebnf kernel math.parser sequences assocs arrays fry math
 combinators regexp.classes strings splitting peg locals accessors
-regexp.ast unicode.case ;
+regexp.ast unicode.case unicode.script.private unicode.categories
+memoize interval-maps sets unicode.data combinators.short-circuit ;
 IN: regexp.parser
 
 : allowed-char? ( ch -- ? )
@@ -18,15 +19,41 @@ ERROR: bad-number ;
 
 ERROR: bad-class name ;
 
+: simple ( str -- simple )
+    ! Alternatively, first collation key level?
+    >case-fold [ " \t_" member? not ] filter ;
+
+: simple-table ( seq -- table )
+    [ [ simple ] keep ] H{ } map>assoc ;
+
+MEMO: simple-script-table ( -- table )
+    script-table interval-values prune simple-table ;
+
+MEMO: simple-category-table ( -- table )
+    categories simple-table ;
+
 : parse-unicode-class ( name -- class )
-    ! Implement this!
-    drop f ;
+    {
+        { [ dup { [ length 1 = ] [ first "clmnpsz" member? ] } 1&& ] [
+            >upper first
+            <category-range-class>
+        ] }
+        { [ dup >title categories member? ] [
+            simple-category-table at <category-class>
+        ] }
+        { [ "script=" ?head ] [
+            dup simple-script-table at
+            [ <script-class> ]
+            [ "script=" prepend bad-class ] ?if
+        ] }
+        [ bad-class ]
+    } cond ;
 
 : unicode-class ( name -- class )
     dup parse-unicode-class [ ] [ bad-class ] ?if ;
 
 : name>class ( name -- class )
-    >string >case-fold {
+    >string simple {
         { "lower" letter-class }
         { "upper" LETTER-class }
         { "alpha" Letter-class }
@@ -121,19 +148,29 @@ Character = EscapeSequence
           | "^" => [[ ^ <tagged-epsilon> ]]
           | . ?[ allowed-char? ]?
 
-AnyRangeCharacter = EscapeSequence | .
+AnyRangeCharacter = !("&&"|"||"|"--"|"~~") (EscapeSequence | .)
 
 RangeCharacter = !("]") AnyRangeCharacter
 
-Range = RangeCharacter:a "-" RangeCharacter:b => [[ a b <range-class> ]]
+Range = RangeCharacter:a "-" !("-") RangeCharacter:b => [[ a b <range-class> ]]
       | RangeCharacter
 
-StartRange = AnyRangeCharacter:a "-" RangeCharacter:b => [[ a b <range-class> ]]
+StartRange = AnyRangeCharacter:a "-" !("-") RangeCharacter:b => [[ a b <range-class> ]]
            | AnyRangeCharacter
 
 Ranges = StartRange:s Range*:r => [[ r s prefix ]]
 
-CharClass = "^"?:n Ranges:e => [[ e n char-class ]]
+BasicCharClass =  "^"?:n Ranges:e => [[ e n char-class ]]
+
+CharClass = BasicCharClass:b "&&" CharClass:c
+                => [[ b c 2array <and-class> ]]
+          | BasicCharClass:b "||" CharClass:c
+                => [[ b c 2array <or-class> ]]
+          | BasicCharClass:b "~~" CharClass:c
+                => [[ b c <sym-diff-class> ]]
+          | BasicCharClass:b "--" CharClass:c
+                => [[ b c <minus-class> ]]
+          | BasicCharClass
 
 Options = [idmsux]*
 
index 6ad340a82ddbff38031e4de1f2f5b69385d4f887..2ff31f0cecdba204c80f231728bc5b89b50b33e1 100644 (file)
@@ -45,11 +45,11 @@ ARTICLE: { "regexp" "construction" } "Constructing regular expressions"
 ARTICLE: { "regexp" "syntax" } "Regular expression syntax"
 "Regexp syntax is largely compatible with Perl, Java and extended POSIX regexps, but not completely. Below, the syntax is documented."
 { $heading "Characters" }
-"At its core, regular expressions consist of character literals. For example, " { $snippet "R/ f/" } " is a regular expression matching just the string 'f'. In addition, the normal escape codes are provided, like " { $snippet "\\t" } " for the tab character and " { $snippet "\\uxxxxxx" } "for an arbitrary Unicode code point, by its hex value. In addition, any character can be preceded by a backslash to escape it, unless this has special meaning. For example, to match a literal opening parenthesis, use " { $snippet "\\(" } "."
+"At its core, regular expressions consist of character literals. For example, " { $snippet "R/ f/" } " is a regular expression matching just the string 'f'. In addition, the normal escape codes are provided, like " { $snippet "\\t" } " for the tab character and " { $snippet "\\uxxxxxx" } " for an arbitrary Unicode code point, by its hex value. In addition, any character can be preceded by a backslash to escape it, unless this has special meaning. For example, to match a literal opening parenthesis, use " { $snippet "\\(" } "."
 { $heading "Concatenation, alternation and grouping" }
-"Regular expressions can be built out of multiple characters by concatenation. For example, " { $snippet "R/ ab/" } " matches a followed by b. The " { $snippet "|" } " (alternation) operator can construct a regexp which matches one of two alternatives. Parentheses can be used for gropuing. So " { $snippet "R/ f(oo|ar)/" } " would match either 'foo' or 'far'."
+"Regular expressions can be built out of multiple characters by concatenation. For example, " { $snippet "R/ ab/" } " matches a followed by b. The " { $snippet "|" } " (alternation) operator can construct a regexp which matches one of two alternatives. Parentheses can be used for grouping. So " { $snippet "R/ f(oo|ar)/" } " would match either 'foo' or 'far'."
 { $heading "Character classes" }
-"Square brackets define a convenient way to refer to a set of characters. For example, " { $snippet "[ab]" } " refers to either a or b. And " { $snippet "[a-z]" } " refers to all of the characters between a and z, in code point order. You can use these together, as in " { $snippet "[ac-fz]" } " which matches all of the characters between c and f, in addition to a and z. Character classes can be negated using a carat, as in " { $snippet "[^a]" } " which matches all characters which are not a."
+"Square brackets define a convenient way to refer to a set of characters. For example, " { $snippet "[ab]" } " refers to either a or b. And " { $snippet "[a-z]" } " refers to all of the characters between a and z, in code point order. You can use these together, as in " { $snippet "[ac-fz]" } " which matches all of the characters between c and f, in addition to a and z. Character classes can be negated using a caret, as in " { $snippet "[^a]" } " which matches all characters which are not a."
 { $heading "Predefined character classes" }
 "Several character classes are predefined, both for convenience and because they are too large to represent directly. In Factor regular expressions, all character classes are Unicode-aware."
 { $table
@@ -72,8 +72,12 @@ ARTICLE: { "regexp" "syntax" } "Regular expression syntax"
     { { $snippet "\\p{blank}" } "Non-newline whitespace" }
     { { $snippet "\\p{cntrl}" } "Control character" }
     { { $snippet "\\p{space}" } "Whitespace" }
-    { { $snippet "\\p{xdigit}" } "Hexidecimal digit" } } ! In the future: Unicode
-"Full unicode properties are not yet supported."
+    { { $snippet "\\p{xdigit}" } "Hexadecimal digit" }
+    { { $snippet "\\p{Nd}" } "Character in Unicode category Nd" } 
+    { { $snippet "\\p{Z}" } "Character in Unicode category beginning with Z" } 
+    { { $snippet "\\p{script=Cham}" } "Character in the Cham writing system" } }
+{ $heading "Character class operations" }
+"Character classes can be composed using four binary operations: " { $snippet "|| && ~~ --" } ". These do the operations union, intersection, symmetric difference and difference, respectively. For example, characters which are lower-case but not Latin script could be matched as " { $snippet "[\\p{lower}--\\p{script=latin}]" } ". These operations are right-associative, and " { $snippet "^" } " binds tighter than them. There is no syntax for grouping."
 { $heading "Boundaries" }
 "Special operators exist to match certain points in the string. These are called 'zero-width' because they do not consume any characters."
 { $table
@@ -105,9 +109,18 @@ ARTICLE: { "regexp" "syntax" } "Regular expression syntax"
 { $heading "Quotation" }
 "To make it convenient to have a long string which uses regexp operators, a special syntax is provided. If a substring begins with " { $snippet "\\Q" } " then everything until " { $snippet "\\E" } " is quoted (escaped). For example, " { $snippet "R/ \\Qfoo\\bar|baz()\\E/" } " matches exactly the string " { $snippet "\"foo\\bar|baz()\"" } "."
 { $heading "Unsupported features" }
-"One missing feature is backreferences. This is because of a design decision to allow only regular expressions following the formal theory of regular languages. For more information, see " { $link { "regexp" "theory" } } ". You can create a new regular expression to match a particular string using " { $vocab-link "regexp.combinators" } " and group capture is available to extract parts of a regular expression match." $nl
-"Another feature is Perl's " { $snippet "\\G" } " syntax, which references the previous match, is not included. This is because that sequence is inherently stateful, and Factor regexps don't hold state." $nl
-"None of the operations which embed code into a regexp are supported, as this would require the inclusion of the Factor parser and compiler in any application which wants to expose regexps to the user. None of the casing operations are included of Perl like \\L, for simplicity." ; ! Also describe syntax, from the beginning
+{ $subheading "Group capture" }
+{ $subheading "Reluctant and posessive quantifiers" }
+{ $subheading "Backreferences" }
+"Backreferences were omitted because of a design decision to allow only regular expressions following the formal theory of regular languages. For more information, see " { $link { "regexp" "theory" } } "."
+$nl
+"To work around the lack of backreferences, consider using group capture and then creating a new regular expression to match the captured string using " { $vocab-link "regexp.combinators" } "."
+{ $subheading "Previous match" }
+"Another feature that is not included is Perl's " { $snippet "\\G" } " syntax, which references the previous match. This is because that sequence is inherently stateful, and Factor regexps don't hold state."
+{ $subheading "Embedding code" }
+"Operations which embed code into a regexp are not supported. This would require the inclusion of the Factor parser and compiler in any deployed application which wants to expose regexps to the user, leading to an undesirable increase in the code size."
+{ $heading "Casing operations" }
+"No special casing operations are included, for example Perl's " { $snippet "\\L" } "." ;
 
 ARTICLE: { "regexp" "options" } "Regular expression options"
 "When " { $link { "regexp" "construction" } } ", various options can be provided. Options have single-character names. A string of options has one of the following two forms:"
@@ -150,7 +163,7 @@ ARTICLE: { "regexp" "theory" } "The theory of regular expressions"
 "This implies, by DeMorgan's law, that, if you have two regular languages, their intersection is also regular. That is, for any two regular expressions, there exists a regular expression which matches strings that match both inputs." $nl
 "Traditionally, regular expressions on computer support an additional operation: backreferences. For example, the Perl regexp " { $snippet "/(.*)$1/" } " matches a string repated twice. If a backreference refers to a string with a predetermined maximum length, then the resulting language is still regular." $nl
 "But, if not, the language is not regular. There is strong evidence that there is no efficient way to parse with backreferences in the general case. Perl uses a naive backtracking algorithm which has pathological behavior in some cases, taking exponential time to match even if backreferences aren't used. Additionally, expressions with backreferences don't have the properties with negation and intersection described above." $nl
-"The Factor regular expression engine was built with the design decision to support negation and intersection at the expense of backreferences. This lets us have a guaranteed linear-time matching algorithm. Systems like Ragel and Lex also use this algorithm, but in the Factor regular expression engine, all other features of regexps are still present." ;
+"The Factor regular expression engine was built with the design decision to support negation and intersection at the expense of backreferences. This lets us have a guaranteed linear-time matching algorithm. Systems like Ragel and Lex use the same algorithm." ;
 
 ARTICLE: { "regexp" "operations" } "Matching operations with regular expressions"
 "Testing if a string matches a regular expression:"
index 0836c0988b1a434efb880f7da3061ba2d6fb42ca..22343868032108956f864c87579bf6f61736c5be 100644 (file)
@@ -480,3 +480,57 @@ IN: regexp-tests
 [ f ] [ "a\r" R/ a$./mds matches? ] unit-test
 [ t ] [ "a\n" R/ a$./ms matches? ] unit-test
 [ t ] [ "a\n" R/ a$./mds matches? ] unit-test
+
+! Unicode categories
+[ t ] [ "a" R/ \p{L}/ matches? ] unit-test
+[ t ] [ "A" R/ \p{L}/ matches? ] unit-test
+[ f ] [ " " R/ \p{L}/ matches? ] unit-test
+[ f ] [ "a" R/ \P{L}/ matches? ] unit-test
+[ f ] [ "A" R/ \P{L}/ matches? ] unit-test
+[ t ] [ " " R/ \P{L}/ matches? ] unit-test
+
+[ t ] [ "a" R/ \p{Ll}/ matches? ] unit-test
+[ f ] [ "A" R/ \p{Ll}/ matches? ] unit-test
+[ f ] [ " " R/ \p{Ll}/ matches? ] unit-test
+[ f ] [ "a" R/ \P{Ll}/ matches? ] unit-test
+[ t ] [ "A" R/ \P{Ll}/ matches? ] unit-test
+[ t ] [ " " R/ \P{Ll}/ matches? ] unit-test
+
+[ t ] [ "a" R/ \p{script=Latin}/ matches? ] unit-test
+[ f ] [ " " R/ \p{script=Latin}/ matches? ] unit-test
+[ f ] [ "a" R/ \P{script=Latin}/ matches? ] unit-test
+[ t ] [ " " R/ \P{script=Latin}/ matches? ] unit-test
+
+! These should be case-insensitive
+[ f ] [ " " R/ \p{l}/ matches? ] unit-test
+[ f ] [ "a" R/ \P{l}/ matches? ] unit-test
+[ f ] [ "a" R/ \P{ll}/ matches? ] unit-test
+[ t ] [ " " R/ \P{LL}/ matches? ] unit-test
+[ f ] [ "a" R/ \P{sCriPt = latin}/ matches? ] unit-test
+[ t ] [ " " R/ \P{SCRIPT = laTIn}/ matches? ] unit-test
+
+! Logical operators
+[ t ] [ "a" R/ [\p{script=latin}\p{lower}]/ matches? ] unit-test
+[ t ] [ "Ï€" R/ [\p{script=latin}\p{lower}]/ matches? ] unit-test
+[ t ] [ "A" R/ [\p{script=latin}\p{lower}]/ matches? ] unit-test
+[ f ] [ "3" R/ [\p{script=latin}\p{lower}]/ matches? ] unit-test
+
+[ t ] [ "a" R/ [\p{script=latin}||\p{lower}]/ matches? ] unit-test
+[ t ] [ "Ï€" R/ [\p{script=latin}||\p{lower}]/ matches? ] unit-test
+[ t ] [ "A" R/ [\p{script=latin}||\p{lower}]/ matches? ] unit-test
+[ f ] [ "3" R/ [\p{script=latin}||\p{lower}]/ matches? ] unit-test
+
+[ t ] [ "a" R/ [\p{script=latin}&&\p{lower}]/ matches? ] unit-test
+[ f ] [ "Ï€" R/ [\p{script=latin}&&\p{lower}]/ matches? ] unit-test
+[ f ] [ "A" R/ [\p{script=latin}&&\p{lower}]/ matches? ] unit-test
+[ f ] [ "3" R/ [\p{script=latin}&&\p{lower}]/ matches? ] unit-test
+
+[ f ] [ "a" R/ [\p{script=latin}~~\p{lower}]/ matches? ] unit-test
+[ t ] [ "Ï€" R/ [\p{script=latin}~~\p{lower}]/ matches? ] unit-test
+[ t ] [ "A" R/ [\p{script=latin}~~\p{lower}]/ matches? ] unit-test
+[ f ] [ "3" R/ [\p{script=latin}~~\p{lower}]/ matches? ] unit-test
+
+[ f ] [ "a" R/ [\p{script=latin}--\p{lower}]/ matches? ] unit-test
+[ f ] [ "Ï€" R/ [\p{script=latin}--\p{lower}]/ matches? ] unit-test
+[ t ] [ "A" R/ [\p{script=latin}--\p{lower}]/ matches? ] unit-test
+[ f ] [ "3" R/ [\p{script=latin}--\p{lower}]/ matches? ] unit-test
index 33499b14372bc5e7a143cfda03d0afc6248f35fe..21439640fe18f6934606946006062c301265ab14 100644 (file)
@@ -204,17 +204,17 @@ PRIVATE>
 
 PRIVATE>
 
-: R! CHAR: ! parsing-regexp ; parsing
-: R" CHAR: " parsing-regexp ; parsing
-: R# CHAR: # parsing-regexp ; parsing
-: R' CHAR: ' parsing-regexp ; parsing
-: R( CHAR: ) parsing-regexp ; parsing
-: R/ CHAR: / parsing-regexp ; parsing
-: R@ CHAR: @ parsing-regexp ; parsing
-: R[ CHAR: ] parsing-regexp ; parsing
-: R` CHAR: ` parsing-regexp ; parsing
-: R{ CHAR: } parsing-regexp ; parsing
-: R| CHAR: | parsing-regexp ; parsing
+SYNTAX: R! CHAR: ! parsing-regexp ;
+SYNTAX: R" CHAR: " parsing-regexp ;
+SYNTAX: R# CHAR: # parsing-regexp ;
+SYNTAX: R' CHAR: ' parsing-regexp ;
+SYNTAX: R( CHAR: ) parsing-regexp ;
+SYNTAX: R/ CHAR: / parsing-regexp ;
+SYNTAX: R@ CHAR: @ parsing-regexp ;
+SYNTAX: R[ CHAR: ] parsing-regexp ;
+SYNTAX: R` CHAR: ` parsing-regexp ;
+SYNTAX: R{ CHAR: } parsing-regexp ;
+SYNTAX: R| CHAR: | parsing-regexp ;
 
 USING: vocabs vocabs.loader ;
 
index 24713545b136a92064b058569f5719cae4c05716..71343b723d1da06bd13ed284d83522a2065c1724 100644 (file)
@@ -74,4 +74,4 @@ PRIVATE>
 : roman/mod ( str1 str2 -- str3 str4 )
     [ /mod ] binary-roman-op [ >roman ] dip ;
 
-: ROMAN: scan roman> parsed ; parsing
+SYNTAX: ROMAN: scan roman> parsed ;
index ab9fa2006f16288e020a2ba69f8d774c4b139d05..041a72ea0e7a1999dc0d5c1bb24ac8a5e6407fd4 100644 (file)
@@ -93,7 +93,6 @@ M: object declarations. drop ;
 
 M: word declarations.
     {
-        POSTPONE: parsing
         POSTPONE: delimiter
         POSTPONE: inline
         POSTPONE: recursive
index 99c6d0e255f7afa586f2cae27d67d0d8853ec7b0..d23c8be84b928aef2aa3ed69c719918dd0e98711 100644 (file)
@@ -7,7 +7,7 @@ sequences math prettyprint parser classes math.constants
 io.encodings.binary random assocs serialize.private ;
 IN: serialize.tests
 
-: test-serialize-cell
+: test-serialize-cell ( a -- ? )
     2^ random dup
     binary [ serialize-cell ] with-byte-writer
     binary [ deserialize-cell ] with-byte-reader = ;
@@ -27,7 +27,7 @@ TUPLE: serialize-test a b ;
 
 C: <serialize-test> serialize-test
 
-: objects
+CONSTANT: objects
     {
         f
         t
@@ -52,7 +52,7 @@ C: <serialize-test> serialize-test
         << 1 [ 2 ] curry parsed >>
         { { "a" "bc" } { "de" "fg" } }
         H{ { "a" "bc" } { "de" "fg" } }
-    } ;
+    }
 
 : check-serialize-1 ( obj -- ? )
     "=====" print
index 6cae048d2764290f7ca9371725068f0fd894f95e..d6a4ba8bbbfad58715825ca05269955eaeabad45 100644 (file)
@@ -19,8 +19,8 @@ MACRO: shuffle-effect ( effect -- )
         [ [ at \ swap \ nth [ ] 3sequence ] curry map , \ cleave , ] 2bi
     ] [ ] make ;
 
-: shuffle(
-    ")" parse-effect parsed \ shuffle-effect parsed ; parsing
+SYNTAX: shuffle(
+    ")" parse-effect parsed \ shuffle-effect parsed ;
 
 : 2swap ( x y z t -- z t x y ) 2 2 mnswap ; inline
 
index 9ed5de7d2b3da93614db649879e51930e08b8e93..0223d94af9b0f16301dd145046929ea7355823fb 100644 (file)
@@ -1,8 +1,24 @@
-USING: help.syntax help.markup strings ;
+! Copyright (C) 2009 Daniel Ehrenberg
+! See http://factorcode.org/license.txt for BSD license.
+USING: help.syntax help.markup strings biassocs arrays ;
 IN: simple-flat-file
 
 ABOUT: "simple-flat-file"
 
 ARTICLE: "simple-flat-file" "Parsing simple flat files"
-"The " { $vocab-link "simple-flat-file" } " vocabulary provides words for loading and parsing simple flat files in a particular format which is common for encoding tasks."
-{ $subsection flat-file>biassoc } ;
+"The " { $vocab-link "simple-flat-file" } " vocabulary provides words for loading and parsing simple flat files in a particular format which is common for encoding and Unicode tasks."
+{ $subsection flat-file>biassoc }
+{ $subsection load-interval-file }
+{ $subsection data } ;
+
+HELP: load-interval-file
+{ $values { "filename" string } { "table" "an interval map" } }
+{ $description "This loads a file that looks like Script.txt in the Unicode Character Database and converts it into an efficient interval map, where the keys are characters and the values are strings for the properties." } ;
+
+HELP: data
+{ $values { "filename" string } { "data" array } }
+{ $description "This loads a file that's delineated by semicolons and lines, returning an array of lines, where each line is an array split by the semicolons, with whitespace trimmed off." } ;
+
+HELP: flat-file>biassoc
+{ $values { "filename" string } { "biassoc" biassoc } }
+{ $description "This loads a flat file, in the form that many encoding resource files are in, with two columns of numeric data in hex, and returns a biassoc associating them." } ;
index 6e53c97738d476a4c99098b0745ceb95239715b8..88a64b7746592e0c218c8a7a0d4b6bdefcb5a00c 100644 (file)
@@ -1,7 +1,7 @@
 ! Copyright (C) 2009 Daniel Ehrenberg
 ! See http://factorcode.org/license.txt for BSD license.
 USING: sequences splitting kernel math.parser io.files io.encodings.utf8
-biassocs ascii ;
+biassocs ascii namespaces arrays make assocs interval-maps sets ;
 IN: simple-flat-file
 
 : drop-comments ( seq -- newseq )
@@ -30,3 +30,25 @@ IN: simple-flat-file
 
 : data ( filename -- data )
     utf8 file-lines drop-comments [ split-; ] map ;
+
+SYMBOL: interned
+
+: range, ( value key -- )
+    swap interned get
+    [ = ] with find nip 2array , ;
+
+: expand-ranges ( assoc -- interval-map )
+    [
+        [
+            swap CHAR: . over member? [
+                ".." split1 [ hex> ] bi@ 2array
+            ] [ hex> ] if range,
+        ] assoc-each
+    ] { } make <interval-map> ;
+
+: process-interval-file ( ranges -- table )
+    dup values prune interned
+    [ expand-ranges ] with-variable ;
+
+: load-interval-file ( filename -- table )
+    data process-interval-file ;
index 09433a3b51c7181ba62475a501acb441c2e50223..c6641463f90fabcf7fa7ee1211633c5d3587bf4a 100644 (file)
@@ -70,7 +70,7 @@ M: A >pprint-sequence ;
 
 M: A pprint* pprint-object ;
 
-: A{ \ } [ >A ] parse-literal ; parsing
+SYNTAX: A{ \ } [ >A ] parse-literal ;
 
 INSTANCE: A sequence
 
index 9d48a9e79e4c85c576bb7af075458064b82dcbd6..412e5b468984a302b4e2705aeb901a5a1f9e04c8 100644 (file)
@@ -39,7 +39,7 @@ M: V >pprint-sequence ;
 
 M: V pprint* pprint-object ;
 
-: V{ \ } [ >V ] parse-literal ; parsing
+SYNTAX: V{ \ } [ >V ] parse-literal ;
 
 INSTANCE: V growable
 
index 521cf9fcb7064c33cd489d682bbeb6618c4465c7..0aa38769079edfbade031f4ba86f425561bf4d5f 100644 (file)
@@ -65,4 +65,9 @@ DEFER: curry-folding-test ( quot -- )
 
 { 3 0 } [ [ 1 2 3 ] curry-folding-test ] must-infer-as
 { 3 0 } [ 1 [ 2 3 ] curry curry-folding-test ] must-infer-as
-{ 3 0 } [ [ 1 2 ] 3 [ ] curry compose curry-folding-test ] must-infer-as
\ No newline at end of file
+{ 3 0 } [ [ 1 2 ] 3 [ ] curry compose curry-folding-test ] must-infer-as
+
+: member?-test ( a -- ? ) { 1 2 3 10 7 58 } member? ;
+
+[ f ] [ 1.0 member?-test ] unit-test
+[ t ] [ \ member?-test def>> first [ member?-test ] all? ] unit-test
\ No newline at end of file
index 3b783ce46783d3ba03fd88a7167ee2e2a360a6af..dd36c5a82b9dacc73782bf496724188519bf7290 100755 (executable)
@@ -1,12 +1,12 @@
 ! Copyright (C) 2007, 2009 Slava Pestov, Daniel Ehrenberg.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: fry accessors arrays kernel kernel.private combinators.private
-words sequences generic math namespaces make quotations assocs
-combinators classes.tuple classes.tuple.private effects summary
-hashtables classes generic sets definitions generic.standard
-slots.private continuations locals generalizations
-stack-checker.backend stack-checker.state stack-checker.visitor
-stack-checker.errors stack-checker.values
+words sequences generic math math.order namespaces make quotations assocs
+combinators combinators.short-circuit classes.tuple
+classes.tuple.private effects summary hashtables classes generic sets
+definitions generic.standard slots.private continuations locals
+generalizations stack-checker.backend stack-checker.state
+stack-checker.visitor stack-checker.errors stack-checker.values
 stack-checker.recursive-state ;
 IN: stack-checker.transforms
 
@@ -107,36 +107,28 @@ IN: stack-checker.transforms
 ] 1 define-transform
 
 ! Membership testing
-CONSTANT: bit-member-n 256
+CONSTANT: bit-member-max 256
 
 : bit-member? ( seq -- ? )
     #! Can we use a fast byte array test here?
     {
-        { [ dup length 8 < ] [ f ] }
-        { [ dup [ integer? not ] any? ] [ f ] }
-        { [ dup [ 0 < ] any? ] [ f ] }
-        { [ dup [ bit-member-n >= ] any? ] [ f ] }
-        [ t ]
-    } cond nip ;
+        [ length 4 > ]
+        [ [ integer? ] all? ]
+        [ [ 0 bit-member-max between? ] any? ]
+    } 1&& ;
 
 : bit-member-seq ( seq -- flags )
-    bit-member-n swap [ member? 1 0 ? ] curry B{ } map-as ;
-
-: exact-float? ( f -- ? )
-    dup float? [ dup >integer >float = ] [ drop f ] if ; inline
+    [ supremum 1+ ] keep '[ _ member? 1 0 ? ] B{ } map-as ;
 
 : bit-member-quot ( seq -- newquot )
-    [
-        bit-member-seq ,
-        [
-            {
-                { [ over fixnum? ] [ ?nth 1 eq? ] }
-                { [ over bignum? ] [ ?nth 1 eq? ] }
-                { [ over exact-float? ] [ ?nth 1 eq? ] }
-                [ 2drop f ]
-            } cond
-        ] %
-    ] [ ] make ;
+    bit-member-seq
+    '[
+        _ {
+            { [ over fixnum? ] [ ?nth 1 eq? ] }
+            { [ over bignum? ] [ ?nth 1 eq? ] }
+            [ 2drop f ]
+        } cond
+    ] ;
 
 : member-quot ( seq -- newquot )
     dup bit-member? [
index fa68cc0a8e0a1f63bb3be31d1f4e134ee650cdec..f4bd56348130f88a8b2a3c74ca7d13ef9892075d 100755 (executable)
@@ -32,7 +32,7 @@ PRIVATE>
 : >suffix-array ( seq -- array )
     [ suffixes ] map concat natural-sort ;
 
-: SA{ \ } [ >suffix-array ] parse-literal ; parsing
+SYNTAX: SA{ \ } [ >suffix-array ] parse-literal ;
 
 : query ( begin suffix-array -- matches )
     2dup find-index dup
index 7e377aedd90abe4390ddebc3b9ddfa8d64a52337..f47852aca754115dcb54d1f9ec944c27f748b8e4 100644 (file)
@@ -2,7 +2,7 @@ USING: tools.test tools.annotations tools.time math parser eval
 io.streams.string kernel strings ;
 IN: tools.annotations.tests
 
-: foo ;
+: foo ( -- ) ;
 \ foo watch
 
 [ ] [ foo ] unit-test
index d4f2fea2e5c97229f1cf1198ab71c55e46243f90..d08a17fd020eb1157e7980770347ae6e0a751902 100755 (executable)
@@ -3,7 +3,7 @@ tools.crossref tools.test parser namespaces source-files generic
 definitions ;
 IN: tools.crossref.tests
 
-GENERIC: foo
+GENERIC: foo ( a b -- c )
 
 M: integer foo + ;
 
old mode 100644 (file)
new mode 100755 (executable)
index 2a717c0..83b7dfe
@@ -18,7 +18,7 @@ M: word disassemble word-xt 2array disassemble ;
 
 M: method-spec disassemble first2 method disassemble ;
 
-cpu x86? os unix? and
+cpu x86?
 "tools.disassembler.udis"
 "tools.disassembler.gdb" ?
 require
old mode 100644 (file)
new mode 100755 (executable)
index 8f99e4f..304595f
@@ -30,9 +30,9 @@ CONSTANT: UD_VENDOR_AMD   0
 CONSTANT: UD_VENDOR_INTEL 1
 
 FUNCTION: void ud_init ( ud* u ) ;
-FUNCTION: void ud_set_mode ( ud* u, uint8_t mode ) ;
+FUNCTION: void ud_set_mode ( ud* u, uchar mode ) ;
 FUNCTION: void ud_set_pc ( ud* u, ulonglong pc ) ;
-FUNCTION: void ud_set_input_buffer ( ud* u, uint8_t* offset, size_t size ) ;
+FUNCTION: void ud_set_input_buffer ( ud* u, uchar* offset, size_t size ) ;
 FUNCTION: void ud_set_vendor ( ud* u, uint vendor ) ;
 FUNCTION: void ud_set_syntax ( ud* u, void* syntax ) ;
 FUNCTION: void ud_input_skip ( ud* u, size_t size ) ;
index f8026765830160e95a7d10b151bac86c2d4e6da2..3a5877c2861c5095f91cec26ff457612a4e2afef 100644 (file)
@@ -36,7 +36,7 @@ IN: tools.walker.tests
     [ 2 2 fixnum+ ] test-walker
 ] unit-test
 
-: foo 2 2 fixnum+ ;
+: foo ( -- x ) 2 2 fixnum+ ;
 
 [ { 8 } ] [
     [ foo 4 fixnum+ ] test-walker
index 66c0276055d460bc94242032f00289082e6f30b7..daac3c96c75035122abb8f9cb0b291f873c08484 100644 (file)
@@ -40,10 +40,9 @@ M: bad-tr summary
 
 PRIVATE>
 
-: TR:
+SYNTAX: TR:
     scan parse-definition
     unclip-last [ unclip-last ] dip compute-tr
     [ check-tr ]
     [ [ create-tr ] dip define-tr ]
     [ [ "-fast" append create-tr ] dip define-fast-tr ] 2tri ;
-    parsing
index 6d1706ee748fdc4552bf4455ba5f15a182ef1404..0aa12f72793dff3816c27ba9d54792144f3ae0c3 100644 (file)
@@ -5,9 +5,9 @@ IN: ui.gadgets.buttons.tests
 
 TUPLE: foo-gadget ;
 
-: com-foo-a ;
+: com-foo-a ( -- ) ;
 
-: com-foo-b ;
+: com-foo-b ( -- ) ;
 
 \ foo-gadget "toolbar" f {
     { f com-foo-a }
index baeb320447ec129ddbca4986f26b4a685ca571ea..03219c66fdf5ecc11e53b187e5eeafe049f5c283 100644 (file)
@@ -119,14 +119,14 @@ M: mock-gadget ungraft*
         [ { f f } ] [ "g" get graft-state>> ] unit-test
     ] with-variable
 
-    : add-some-children
+    : add-some-children ( gadget -- gadget )
         3 [
             <mock-gadget> over <model> >>model
             "g" get over add-gadget drop
             swap 1+ number>string set
         ] each ;
 
-    : status-flags
+    : status-flags ( -- seq )
         { "g" "1" "2" "3" } [ get graft-state>> ] map prune ;
 
     : notify-combo ( ? ? -- )
index 2947ce242d14f451cc9517052482319762ca80e3..0c47af0214f8b498acc7ffa984f261c12ee19158 100644 (file)
@@ -5,7 +5,7 @@ help.stylesheet splitting tools.test.ui models math summary
 inspector accessors help.topics see ;
 IN: ui.gadgets.panes.tests
 
-: #children "pane" get children>> length ;
+: #children ( -- n ) "pane" get children>> length ;
 
 [ ] [ <pane> "pane" set ] unit-test
 
index fe7a8b52c5b31674c3c84ae75b25d0220d00bf83..4612ea79b0a1cfe13b783ce9ed2dd5885fb440fa 100644 (file)
@@ -3,7 +3,7 @@ USING: ui.operations ui.commands prettyprint kernel namespaces
 tools.test ui.gadgets ui.gadgets.editors parser io
 io.streams.string math help help.markup accessors ;
 
-: my-pprint pprint ;
+: my-pprint ( obj -- ) pprint ;
 
 [ drop t ] \ my-pprint [ ] f operation boa "op" set
 
index cd56dd876e6812f8c06a3d84a696980864a4bb88..63df55b71a488edb9470132d83374dd5ce759be5 100644 (file)
@@ -68,7 +68,7 @@ IN: ui.tools.listener.tests
 
 [ ] [ <interactor> <pane> <pane-stream> >>output "interactor" set ] unit-test
 
-: text "Hello world.\nThis is a test." ;
+CONSTANT: text "Hello world.\nThis is a test."
 
 [ ] [ text "interactor" get set-editor-string ] unit-test
 
index 91f6a45911cce51ada86bbd44f4c6896ec1e6edd..22d6cddfb973c40b46fff7f019ff6acd8e353556 100644 (file)
@@ -4,8 +4,9 @@ USING: combinators.short-circuit unicode.categories kernel math
 combinators splitting sequences math.parser io.files io assocs
 arrays namespaces make math.ranges unicode.normalize
 unicode.normalize.private values io.encodings.ascii
-unicode.syntax unicode.data compiler.units fry
-alien.syntax sets accessors interval-maps memoize locals words ;
+unicode.data compiler.units fry unicode.categories.syntax
+alien.syntax sets accessors interval-maps memoize locals words
+simple-flat-file ;
 IN: unicode.breaks
 
 <PRIVATE
@@ -31,9 +32,9 @@ CATEGORY: grapheme-control Zl Zp Cc Cf ;
         [ drop Control ]
     } case ;
 
-CATEGORY: (extend) Me Mn ;
-: extend? ( ch -- ? )
-    { [ (extend)? ] [ "Other_Grapheme_Extend" property? ] } 1|| ;
+CATEGORY: extend
+    Me Mn |
+    "Other_Grapheme_Extend" property? ;
 
 : loe? ( ch -- ? )
     "Logical_Order_Exception" property? ;
@@ -127,7 +128,7 @@ to: grapheme-table
 
 VALUE: word-break-table
 
-"vocab:unicode/data/WordBreakProperty.txt" load-key-value
+"vocab:unicode/data/WordBreakProperty.txt" load-interval-file
 to: word-break-table
 
 C-ENUM: wOther wCR wLF wNewline wExtend wFormat wKatakana wALetter wMidLetter
index fa842b8b818a1bed743ea5e46c647877f4c7469d..1ad39317469939c54b144961b84f3df21598c440 100644 (file)
@@ -1,8 +1,8 @@
 ! Copyright (C) 2008, 2009 Daniel Ehrenberg.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: unicode.data sequences namespaces
-sbufs make unicode.syntax unicode.normalize math hints
-unicode.categories combinators unicode.syntax assocs combinators.short-circuit
+sbufs make unicode.normalize math hints
+unicode.categories combinators assocs combinators.short-circuit
 strings splitting kernel accessors unicode.breaks fry locals ;
 QUALIFIED: ascii
 IN: unicode.case
index b0870e28fb881c90705b87383449d9bccada73bc..924b197417d74fa72ffa29dca29b85c3726e0fbc 100644 (file)
@@ -12,6 +12,9 @@ HELP: Letter
 HELP: alpha
 { $class-description "The class of alphanumeric characters." } ;
 
+HELP: math
+{ $class-description "The class of Unicode math characters." } ;
+
 HELP: blank
 { $class-description "The class of whitespace characters." } ;
 
@@ -54,6 +57,8 @@ ARTICLE: "unicode.categories" "Character classes"
 { $subsection uncased }
 { $subsection uncased? }
 { $subsection character }
-{ $subsection character? } ;
+{ $subsection character? }
+{ $subsection math }
+{ $subsection math? } ;
 
 ABOUT: "unicode.categories"
index 0464e31b125063b60fa21489d8865b055efd60b4..126c03c8698c431e5fea9b32be446675122f1948 100644 (file)
@@ -1,15 +1,16 @@
 ! Copyright (C) 2008 Daniel Ehrenberg.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: unicode.syntax ;
+USING: unicode.categories.syntax sequences unicode.data ;
 IN: unicode.categories
 
-CATEGORY: blank Zs Zl Zp \r\n ;
-CATEGORY: letter Ll ;
-CATEGORY: LETTER Lu ;
-CATEGORY: Letter Lu Ll Lt Lm Lo ;
+CATEGORY: blank Zs Zl Zp | "\r\n" member? ;
+CATEGORY: letter Ll | "Other_Lowercase" property? ;
+CATEGORY: LETTER Lu | "Other_Uppercase" property? ;
+CATEGORY: Letter Lu Ll Lt Lm Lo Nl ;
 CATEGORY: digit Nd Nl No ;
 CATEGORY-NOT: printable Cc Cf Cs Co Cn ;
-CATEGORY: alpha Lu Ll Lt Lm Lo Nd Nl No ;
+CATEGORY: alpha Lu Ll Lt Lm Lo Nd Nl No | "Other_Alphabetic" property? ;
 CATEGORY: control Cc ;
 CATEGORY-NOT: uncased Lu Ll Lt Lm Mn Me ; 
 CATEGORY-NOT: character Cn ;
+CATEGORY: math Sm | "Other_Math" property? ;
diff --git a/basis/unicode/categories/syntax/authors.txt b/basis/unicode/categories/syntax/authors.txt
new file mode 100755 (executable)
index 0000000..f990dd0
--- /dev/null
@@ -0,0 +1 @@
+Daniel Ehrenberg
diff --git a/basis/unicode/categories/syntax/summary.txt b/basis/unicode/categories/syntax/summary.txt
new file mode 100644 (file)
index 0000000..651d51c
--- /dev/null
@@ -0,0 +1 @@
+Parsing words used by Unicode implementation
diff --git a/basis/unicode/categories/syntax/syntax-docs.factor b/basis/unicode/categories/syntax/syntax-docs.factor
new file mode 100644 (file)
index 0000000..6293b92
--- /dev/null
@@ -0,0 +1,19 @@
+! Copyright (C) 2008 Daniel Ehrenberg.
+! See http://factorcode.org/license.txt for BSD license.
+USING: help.syntax help.markup ;
+IN: unicode.categories.syntax
+
+ABOUT: "unicode.categories.syntax"
+
+ARTICLE: "unicode.categories.syntax" "Unicode category syntax"
+"There is special syntax sugar for making predicate classes which are unions of Unicode general categories, plus some other code."
+{ $subsection POSTPONE: CATEGORY: }
+{ $subsection POSTPONE: CATEGORY-NOT: } ;
+
+HELP: CATEGORY:
+{ $syntax "CATEGORY: foo Nl Pd Lu | \"Diacritic\" property? ;" }
+{ $description "This defines a predicate class which is a subset of code points. In this example, " { $snippet "foo" } " is the class of characters which are in the general category Nl or Pd or Lu, or which have the Diacritic property." } ;
+
+HELP: CATEGORY-NOT:
+{ $syntax "CATEGORY-NOT: foo Nl Pd Lu | \"Diacritic\" property? ;" }
+{ $description "This defines a predicate class which is a subset of code points, the complement of what " { $link POSTPONE: CATEGORY: } " would define. In this example, " { $snippet "foo" } " is the class of characters which are neither in the general category Nl or Pd or Lu, nor have the Diacritic property." } ;
diff --git a/basis/unicode/categories/syntax/syntax-tests.factor b/basis/unicode/categories/syntax/syntax-tests.factor
new file mode 100644 (file)
index 0000000..1ec622f
--- /dev/null
@@ -0,0 +1,3 @@
+! Copyright (C) 2009 Daniel Ehrenberg.
+! See http://factorcode.org/license.txt for BSD license.
+
diff --git a/basis/unicode/categories/syntax/syntax.factor b/basis/unicode/categories/syntax/syntax.factor
new file mode 100644 (file)
index 0000000..849f361
--- /dev/null
@@ -0,0 +1,34 @@
+! Copyright (C) 2008, 2009 Daniel Ehrenberg.
+! See http://factorcode.org/license.txt for BSD license.
+USING: unicode.data kernel math sequences parser unicode.data.private
+bit-arrays namespaces sequences.private arrays classes.parser
+assocs classes.predicate sets fry splitting accessors ;
+IN: unicode.categories.syntax
+
+! For use in CATEGORY:
+SYMBOLS: Cn Lu Ll Lt Lm Lo Mn Mc Me Nd Nl No Pc Pd Ps Pe Pi Pf Po Sm Sc Sk So Zs Zl Zp Cc Cf Cs Co | ;
+
+<PRIVATE
+
+: [category] ( categories code -- quot )
+    '[ dup category# _ member? [ drop t ] _ if ] ;
+
+: integer-predicate-class ( word predicate -- )
+    integer swap define-predicate-class ;
+
+: define-category ( word categories code -- )
+    [category] integer-predicate-class ;
+
+: define-not-category ( word categories code -- )
+    [category] [ not ] compose integer-predicate-class ;
+
+: parse-category ( -- word tokens quot )
+    CREATE-CLASS \ ; parse-until { | } split1
+    [ [ name>> categories-map at ] map ]
+    [ [ [ ] like ] [ [ drop f ] ] if* ] bi* ;
+
+PRIVATE>
+
+SYNTAX: CATEGORY: parse-category define-category ;
+
+SYNTAX: CATEGORY-NOT: parse-category define-not-category ;
diff --git a/basis/unicode/categories/syntax/tags.txt b/basis/unicode/categories/syntax/tags.txt
new file mode 100755 (executable)
index 0000000..8e27be7
--- /dev/null
@@ -0,0 +1 @@
+text
index 0c51ea4352efda97386b7528886f4bc2639a288c..b6eddccae074f7257f9226af3e3f217c6b02bb5e 100755 (executable)
@@ -4,7 +4,7 @@ USING: combinators.short-circuit sequences io.files
 io.encodings.ascii kernel values splitting accessors math.parser\r
 ascii io assocs strings math namespaces make sorting combinators\r
 math.order arrays unicode.normalize unicode.data locals\r
-unicode.syntax macros sequences.deep words unicode.breaks\r
+macros sequences.deep words unicode.breaks\r
 quotations combinators.short-circuit simple-flat-file ;\r
 IN: unicode.collation\r
 \r
index d1a458eb480066de5fe5bb8fd913f30375268156..82706729bf94ee7e2ed6ea97e5a13ab0b63b8517 100644 (file)
@@ -6,7 +6,7 @@ IN: unicode.data
 ABOUT: "unicode.data"
 
 ARTICLE: "unicode.data" "Unicode data tables"
-"The " { $vocab-link "unicode.data" "unicode.data" } " vocabulary contains core Unicode data tables and code for parsing this from files."
+"The " { $vocab-link "unicode.data" "unicode.data" } " vocabulary contains core Unicode data tables and code for parsing this from files. The following words access these data tables."
 { $subsection canonical-entry }
 { $subsection combine-chars }
 { $subsection combining-class }
@@ -14,7 +14,11 @@ ARTICLE: "unicode.data" "Unicode data tables"
 { $subsection name>char }
 { $subsection char>name }
 { $subsection property? }
-{ $subsection load-key-value } ;
+{ $subsection category }
+{ $subsection ch>upper }
+{ $subsection ch>lower } 
+{ $subsection ch>title } 
+{ $subsection special-case } ;
 
 HELP: canonical-entry
 { $values { "char" "a code point" } { "seq" string } }
@@ -48,6 +52,22 @@ HELP: property?
 { $values { "char" "a code point" } { "property" string } { "?" "a boolean" } }
 { $description "Tests whether the code point is listed under the given property in PropList.txt in the Unicode Character Database." } ;
 
-HELP: load-key-value
-{ $values { "filename" string } { "table" "an interval map" } }
-{ $description "This loads a file that looks like Script.txt in the Unicode Character Database and converts it into an efficient interval map, where the keys are characters and the values are strings for the properties." } ;
+HELP: category
+{ $values { "char" "a code point" } { "category" string } }
+{ $description "Returns the general category of a code point, in the form of a string. This will always be a string within the ASCII range of length two. If the code point is unassigned, then it returns " { $snippet "Cn" } "." } ;
+
+HELP: ch>upper
+{ $values { "ch" "a code point" } { "upper" "a code point" } }
+{ $description "Returns the simple upper-cased version of the code point, if it exists. This does not handle context-sensitive or locale-dependent properties of linguistically accurate case conversion, and does not correctly handle characters which become multiple characters on conversion to this case." } ;
+
+HELP: ch>lower
+{ $values { "ch" "a code point" } { "lower" "a code point" } }
+{ $description "Returns the simple lower-cased version of the code point, if it exists. This does not handle context-sensitive or locale-dependent properties of linguistically accurate case conversion, and does not correctly handle characters which become multiple characters on conversion to this case." } ;
+
+HELP: ch>title
+{ $values { "ch" "a code point" } { "title" "a code point" } }
+{ $description "Returns the simple title-cased version of the code point, if it exists. This does not handle context-sensitive or locale-dependent properties of linguistically accurate case conversion, and does not correctly handle characters which become multiple characters on conversion to this case." } ;
+
+HELP: special-case
+{ $values { "ch" "a code point" } { "casing-tuple" { "a tuple, or " { $link f } } } }
+{ $description "If a code point has special casing behavior, returns a tuple which represents that information." } ;
index e94036a85e6cf4bb6944526ee2b6b97b41e58547..779ae64d485b3ee293c251183b5217d697a995df 100644 (file)
@@ -58,7 +58,7 @@ CONSTANT: num-chars HEX: 2FA1E
 
 PRIVATE>
 
-: category# ( char -- category )
+: category# ( char -- n )
     ! There are a few characters that should be Cn
     ! that this gives Cf or Mn
     ! Cf = 26; Mn = 5; Cn = 29
@@ -219,27 +219,3 @@ load-properties to: properties
 
 [ name>char [ "Invalid character" throw ] unless* ]
 name>char-hook set-global
-
-SYMBOL: interned
-
-: range, ( value key -- )
-    swap interned get
-    [ = ] with find nip 2array , ;
-
-: expand-ranges ( assoc -- interval-map )
-    [
-        [
-            swap CHAR: . over member? [
-                ".." split1 [ hex> ] bi@ 2array
-            ] [ hex> ] if range,
-        ] assoc-each
-    ] { } make <interval-map> ;
-
-: process-key-value ( ranges -- table )
-    dup values prune interned
-    [ expand-ranges ] with-variable ;
-
-PRIVATE>
-
-: load-key-value ( filename -- table )
-    data process-key-value ;
index 602d9555ea64c26d775f0057cd8b3140b0f1c43f..aca96a56942c315303dc84afd4c52a9061883c7c 100644 (file)
@@ -2,7 +2,7 @@
 ! See http://factorcode.org/license.txt for BSD license.
 USING: ascii sequences namespaces make unicode.data kernel math arrays
 locals sorting.insertion accessors assocs math.order combinators
-unicode.syntax strings sbufs hints combinators.short-circuit vectors ;
+strings sbufs hints combinators.short-circuit vectors ;
 IN: unicode.normalize
 
 <PRIVATE
index ed804760848a07c8c275b4e6dbce4c3d719678e4..4243c816234ffb5de1eb0c5d642b243ff426c380 100644 (file)
@@ -1,17 +1,13 @@
 ! Copyright (C) 2008 Daniel Ehrenberg.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: accessors values kernel sequences assocs io.files
-io.encodings ascii math.ranges io splitting math.parser
-namespaces make byte-arrays locals math sets io.encodings.ascii
-words words.symbol compiler.units arrays interval-maps
-unicode.data ;
+USING: values interval-maps simple-flat-file ;
 IN: unicode.script
 
 <PRIVATE
 
 VALUE: script-table
 
-"vocab:unicode/script/Scripts.txt" load-key-value
+"vocab:unicode/script/Scripts.txt" load-interval-file
 to: script-table
 
 PRIVATE>
diff --git a/basis/unicode/syntax/authors.txt b/basis/unicode/syntax/authors.txt
deleted file mode 100755 (executable)
index f990dd0..0000000
+++ /dev/null
@@ -1 +0,0 @@
-Daniel Ehrenberg
diff --git a/basis/unicode/syntax/summary.txt b/basis/unicode/syntax/summary.txt
deleted file mode 100644 (file)
index 651d51c..0000000
+++ /dev/null
@@ -1 +0,0 @@
-Parsing words used by Unicode implementation
diff --git a/basis/unicode/syntax/syntax.factor b/basis/unicode/syntax/syntax.factor
deleted file mode 100644 (file)
index 5bd8c05..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-! Copyright (C) 2008 Daniel Ehrenberg.
-! See http://factorcode.org/license.txt for BSD license.
-USING: unicode.data kernel math sequences parser lexer
-bit-arrays namespaces make sequences.private arrays quotations
-assocs classes.predicate math.order strings.parser ;
-IN: unicode.syntax
-
-<PRIVATE
-
-: >category-array ( categories -- bitarray )
-    categories [ swap member? ] with map >bit-array ;
-
-: as-string ( strings -- bit-array )
-    concat unescape-string ;
-
-: [category] ( categories -- quot )
-    [
-        [ [ categories member? not ] filter as-string ] keep 
-        [ categories member? ] filter >category-array
-        [ dup category# ] % , [ nth-unsafe [ drop t ] ] %
-        \ member? 2array >quotation ,
-        \ if ,
-    ] [ ] make ;
-
-: define-category ( word categories -- )
-    [category] integer swap define-predicate-class ;
-
-PRIVATE>
-
-: CATEGORY:
-    CREATE ";" parse-tokens define-category ; parsing
-
-: seq-minus ( seq1 seq2 -- diff )
-    [ member? not ] curry filter ;
-
-: CATEGORY-NOT:
-    CREATE ";" parse-tokens
-    categories swap seq-minus define-category ; parsing
diff --git a/basis/unicode/syntax/tags.txt b/basis/unicode/syntax/tags.txt
deleted file mode 100755 (executable)
index 8e27be7..0000000
+++ /dev/null
@@ -1 +0,0 @@
-text
index 4ae326ac84bf3429c33edb0960b4856fff625277..9450b49f0bd2f14bae20dcc19c15ecfb7093f92c 100644 (file)
@@ -15,7 +15,7 @@ $nl
 { $vocab-subsection "Word and grapheme breaks" "unicode.breaks" }
 { $vocab-subsection "Unicode normalization" "unicode.normalize" }
 "The following are mostly for internal use:"
-{ $vocab-subsection "Unicode syntax" "unicode.syntax" }
+{ $vocab-subsection "Unicode category syntax" "unicode.categories.syntax" }
 { $vocab-subsection "Unicode data tables" "unicode.data" }
 { $see-also "ascii" "io.encodings" } ;
 
index cac206bf3cc8cfe44e39c2c84a5e5c232411127e..74eea9506c2bc428016eb0fcb91414a8e7b97667 100644 (file)
@@ -2,7 +2,7 @@ IN: urls.tests
 USING: urls urls.private tools.test
 arrays kernel assocs present accessors ;
 
-: urls
+CONSTANT: urls
     {
         {
             T{ url
@@ -80,7 +80,7 @@ arrays kernel assocs present accessors ;
             }
             "ftp://slava:secret@ftp.kernel.org/"
         }
-    } ;
+    }
 
 urls [
     [ 1array ] [ [ >url ] curry ] bi* unit-test
index d71ce4ef7b992a3791f76975e8fe4edee36c67ba..38d0016d5658ab5d183ccfe32c668dcef38373ed 100644 (file)
@@ -179,7 +179,7 @@ PRIVATE>
     dup protocol>> '[ _ protocol-port or ] change-port ;
 
 ! Literal syntax
-: URL" lexer get skip-blank parse-string >url parsed ; parsing
+SYNTAX: URL" lexer get skip-blank parse-string >url parsed ;
 
 USING: vocabs vocabs.loader ;
 
index 75a37339b1797c60bcab6b6c8663b6dab74f5b8f..b15dcebe491ea0d76494815433a76c1651360e17 100644 (file)
@@ -30,11 +30,11 @@ PREDICATE: value-word < word
         [ second \ obj>> = ]
     } 1&& ;
 
-: VALUE:
+SYNTAX: VALUE:
     CREATE-WORD
     dup t "no-def-strip" set-word-prop
     T{ value-holder } clone [ obj>> ] curry
-    (( -- value )) define-declared ; parsing
+    (( -- value )) define-declared ;
 
 M: value-word definer drop \ VALUE: f ;
 
@@ -43,9 +43,9 @@ M: value-word definition drop f ;
 : set-value ( value word -- )
     def>> first (>>obj) ;
 
-: to:
+SYNTAX: to:
     scan-word literalize parsed
-    \ set-value parsed ; parsing
+    \ set-value parsed ;
 
 : get-value ( word -- value )
     def>> first obj>> ;
index e4f64ca8f80c42119c766b815d82d2b7e73ed0c4..ae106cbf93b9dfbb3ce2ada86972815320dfaac2 100644 (file)
@@ -50,7 +50,7 @@ M: vlist like
 
 INSTANCE: vlist immutable-sequence
 
-: VL{ \ } [ >vlist ] parse-literal ; parsing
+SYNTAX: VL{ \ } [ >vlist ] parse-literal ;
 
 M: vlist pprint-delims drop \ VL{ \ } ;
 M: vlist >pprint-sequence ;
@@ -87,7 +87,7 @@ M: valist assoc-like
 
 INSTANCE: valist assoc
 
-: VA{ \ } [ >valist ] parse-literal ; parsing
+SYNTAX: VA{ \ } [ >valist ] parse-literal ;
 
 M: valist pprint-delims drop \ VA{ \ } ;
 M: valist >pprint-sequence >alist ;
index 620b608afc6297a616240a3144e17a67f1b35133..59a76bf4d7df97a763d6f22af27a063eae6f4a0f 100755 (executable)
@@ -90,14 +90,13 @@ unless
 
 PRIVATE>
 
-: COM-INTERFACE:
+SYNTAX: COM-INTERFACE:
     scan
     scan find-com-interface-definition
     scan string>guid
     parse-com-functions
     <com-interface-definition>
     dup save-com-interface-definition
-    define-words-for-com-interface
-    ; parsing
+    define-words-for-com-interface ;
 
-: GUID: scan string>guid parsed ; parsing
+SYNTAX: GUID: scan string>guid parsed ;
index d510c8a881d47e8d9538db82b0653b0d1b7b3be3..3deab0a2872189681a76e52d5d4a7bd26474b3be 100644 (file)
@@ -1,19 +1,26 @@
 ! Copyright (C) 2005, 2009 Daniel Ehrenberg
 ! See http://factorcode.org/license.txt for BSD license.
-USING: kernel sequences unicode.syntax math math.order combinators
-hints ;
+USING: kernel sequences unicode.categories.syntax math math.order
+combinators hints combinators.short-circuit ;
 IN: xml.char-classes
 
-CATEGORY: 1.0name-start* Ll Lu Lo Lt Nl \u000559\u0006E5\u0006E6_: ;
-: 1.0name-start? ( char -- ? )
-    dup 1.0name-start*? [ drop t ] 
-    [ HEX: 2BB HEX: 2C1 between? ] if ;
+CATEGORY: 1.0name-start
+    Ll Lu Lo Lt Nl | {
+        [ HEX: 2BB HEX: 2C1 between? ]
+        [ "\u000559\u0006E5\u0006E6_:" member? ]
+    } 1|| ;
 
-CATEGORY: 1.0name-char Ll Lu Lo Lt Nl Mc Me Mn Lm Nd _-.\u000387: ;
+CATEGORY: 1.0name-char
+    Ll Lu Lo Lt Nl Mc Me Mn Lm Nd |
+    "_-.\u000387:" member? ;
 
-CATEGORY: 1.1name-start Ll Lu Lo Lm Ln Nl _: ;
+CATEGORY: 1.1name-start
+    Ll Lu Lo Lm Nl |
+    "_:" member? ;
 
-CATEGORY: 1.1name-char Ll Lu Lo Lm Ln Nl Mc Mn Nd Pc Cf _-.\u0000b7: ;
+CATEGORY: 1.1name-char
+    Ll Lu Lo Lm Nl Mc Mn Nd Pc Cf |
+    "_-.\u0000b7:" member? ;
 
 : name-start? ( 1.0? char -- ? )
     swap [ 1.0name-start? ] [ 1.1name-start? ] if ;
index 067bb9ec1173756fca636c8bbf75524bf8f2fa64..f39592036cd35e17c4606a1f2c587167c4fcc98c 100644 (file)
@@ -1,10 +1,11 @@
 ! Copyright (C) 2005, 2009 Daniel Ehrenberg
 ! See http://factorcode.org/license.txt for BSD license.
-USING: words assocs kernel accessors parser sequences summary
-lexer splitting combinators locals xml.data memoize sequences.deep
-xml.data xml.state xml namespaces present arrays generalizations strings
-make math macros multiline inverse combinators.short-circuit 
-sorting fry unicode.categories ;
+USING: words assocs kernel accessors parser effects.parser
+sequences summary lexer splitting combinators locals xml.data
+memoize sequences.deep xml.data xml.state xml namespaces present
+arrays generalizations strings make math macros multiline
+inverse combinators.short-circuit sorting fry unicode.categories
+effects ;
 IN: xml.syntax
 
 <PRIVATE
@@ -17,26 +18,26 @@ M: no-tag summary
     >alist swap '[ _ no-tag boa throw ] suffix
     '[ dup main>> _ case ] ;
 
-: define-tags ( word -- )
-    dup dup "xtable" word-prop compile-tags define ;
+: define-tags ( word effect -- )
+    [ dup dup "xtable" word-prop compile-tags ] dip define-declared ;
 
 :: define-tag ( string word quot -- )
     quot string word "xtable" word-prop set-at
-    word define-tags ;
+    word word stack-effect define-tags ;
 
 PRIVATE>
 
-: TAGS:
-    CREATE
-    [ H{ } clone "xtable" set-word-prop ]
-    [ define-tags ] bi ; parsing
+SYNTAX: TAGS:
+    CREATE-WORD complete-effect
+    [ drop H{ } clone "xtable" set-word-prop ]
+    [ define-tags ]
+    2bi ;
 
-: TAG:
-    scan scan-word parse-definition define-tag ; parsing
+SYNTAX: TAG:
+    scan scan-word parse-definition define-tag ;
 
-: XML-NS:
-    CREATE-WORD (( string -- name )) over set-stack-effect
-    scan '[ f swap _ <name> ] define-memoized ; parsing
+SYNTAX: XML-NS:
+    CREATE-WORD scan '[ f swap _ <name> ] (( string -- name )) define-memoized ;
 
 <PRIVATE
 
@@ -168,11 +169,11 @@ MACRO: interpolate-xml ( xml -- quot )
 
 PRIVATE>
 
-: <XML
-    "XML>" [ string>doc ] parse-def ; parsing
+SYNTAX: <XML
+    "XML>" [ string>doc ] parse-def ;
 
-: [XML
-    "XML]" [ string>chunk ] parse-def ; parsing
+SYNTAX: [XML
+    "XML]" [ string>chunk ] parse-def ;
 
 <PRIVATE
 
index 4861f86d7b98f00e234ef5e65099b5a2c702521d..7f7d8d28918e73ecefb1d4745d95fb0c72d378fa 100644 (file)
@@ -2,8 +2,8 @@ USING: kernel xml sequences assocs tools.test io arrays namespaces fry
 accessors xml.data xml.traversal xml.writer generic sequences.deep multiline ;
 IN: xml.tests
 
-: sub-tag
-    T{ name f f "sub" "http://littledan.onigirihouse.com/namespaces/replace" } ;
+CONSTANT: sub-tag
+    T{ name f f "sub" "http://littledan.onigirihouse.com/namespaces/replace" }
 
 SYMBOL: ref-table
 
index 532c1db29f4e3bf44fbc2c4c3daf6a63baa5dcc5..c41b05eb8539a69cc1497f4224952e93f27037da 100644 (file)
@@ -17,7 +17,7 @@ TUPLE: xml-test id uri sections description type ;
 : parse-tests ( xml -- tests )
     "TEST" tags-named [ >xml-test ] map ;
 
-: base "vocab:xml/tests/xmltest/" ;
+CONSTANT: base "vocab:xml/tests/xmltest/"
 
 MACRO: drop-output ( quot -- newquot )
     dup infer out>> '[ @ _ ndrop ] ;
index 421c2a2b5db7fc7c705dbec8f487a03b4fad4a77..f19e845ab926fc1cd338527824c1f449f0757d0c 100644 (file)
@@ -61,7 +61,7 @@ IN: xml.writer.tests
 [ "<foo>         bar            </foo>" string>xml pprint-xml>string ] unit-test
 [ "<foo'>" ] [ "<foo'>" <unescaped> xml>string ] unit-test
 
-: test-file "resource:basis/xml/writer/test.xml" ;
+CONSTANT: test-file "resource:basis/xml/writer/test.xml"
 
 [ ] [ "<?xml version='1.0' encoding='UTF-16BE'?><x/>" string>xml test-file utf8 [ write-xml ] with-file-writer ] unit-test
 [ "x" ] [ test-file file>xml body>> name>> main>> ] unit-test
index 4cbf58c8aa62c59a244c631a72db353c5854e2a4..d2e1d997216dd73bb161607fabe8768509e8f052 100644 (file)
@@ -10,11 +10,11 @@ IN: xmode.loader.syntax
 : (parse-rule-tag) ( rule-set tag specs class -- )
     new swap init-from-tag swap add-rule ; inline
 
-: RULE:
+SYNTAX: RULE:
     scan scan-word scan-word [
         [ parse-definition call( -- ) ] { } make
         swap [ (parse-rule-tag) ] 2curry
-    ] dip swap define-tag ; parsing
+    ] dip swap define-tag ;
 
 ! Attribute utilities
 : string>boolean ( string -- ? ) "TRUE" = ;
index cf6aacb84fe274172577dfb8ab308ea659929fb0..c5be9f8957ac5c66e5850d699c5cb61c66defb84 100755 (executable)
@@ -139,10 +139,10 @@ check_library_exists() {
 }
 
 check_X11_libraries() {
-    check_library_exists freetype
     check_library_exists GLU
     check_library_exists GL
     check_library_exists X11
+    check_library_exists pango
 }
 
 check_libraries() {
@@ -502,7 +502,7 @@ make_boot_image() {
 }
 
 install_build_system_apt() {
-    sudo apt-get --yes install libc6-dev libpango-1.0-dev libx11-dev xorg-dev glutg3-dev wget git-core git-doc rlwrap gcc make
+    sudo apt-get --yes install libc6-dev libpango1.0-dev libx11-dev xorg-dev glutg3-dev wget git-core git-doc rlwrap gcc make
     check_ret sudo
 }
 
index 48aae3667e29eaf4a77d1383c15e7da91da706e4..ed645715821331f39255731dc4d9227546eabb2f 100644 (file)
@@ -36,7 +36,7 @@ H{ } clone sub-primitives set
 "syntax" vocab vocab-words bootstrap-syntax set {
     dictionary
     new-classes
-    changed-definitions changed-generics
+    changed-definitions changed-generics changed-effects
     outdated-generics forgotten-definitions
     root-cache source-files update-map implementors-map
 } [ H{ } clone swap set ] each
@@ -48,9 +48,9 @@ init-caches
 
 dummy-compiler compiler-impl set
 
-call
-call
-call
+call( -- )
+call( -- )
+call( -- )
 
 ! After we execute bootstrap/layouts
 num-types get f <array> builtins set
@@ -335,205 +335,204 @@ tuple
 (( quot1 quot2 -- compose )) define-declared
 
 ! Sub-primitive words
-: make-sub-primitive ( word vocab -- )
-    create
-    dup reset-word
-    dup 1quotation define ;
+: make-sub-primitive ( word vocab effect -- )
+    [ create dup 1quotation ] dip define-declared ;
 
 {
-    { "(execute)" "words.private" }
-    { "(call)" "kernel.private" }
-    { "both-fixnums?" "math.private" }
-    { "fixnum+fast" "math.private" }
-    { "fixnum-fast" "math.private" }
-    { "fixnum*fast" "math.private" }
-    { "fixnum-bitand" "math.private" }
-    { "fixnum-bitor" "math.private" }
-    { "fixnum-bitxor" "math.private" }
-    { "fixnum-bitnot" "math.private" }
-    { "fixnum-mod" "math.private" }
-    { "fixnum-shift-fast" "math.private" }
-    { "fixnum/i-fast" "math.private" }
-    { "fixnum/mod-fast" "math.private" }
-    { "fixnum<" "math.private" }
-    { "fixnum<=" "math.private" }
-    { "fixnum>" "math.private" }
-    { "fixnum>=" "math.private" }
-    { "drop" "kernel" }
-    { "2drop" "kernel" }
-    { "3drop" "kernel" }
-    { "dup" "kernel" }
-    { "2dup" "kernel" }
-    { "3dup" "kernel" }
-    { "rot" "kernel" }
-    { "-rot" "kernel" }
-    { "dupd" "kernel" }
-    { "swapd" "kernel" }
-    { "nip" "kernel" }
-    { "2nip" "kernel" }
-    { "tuck" "kernel" }
-    { "over" "kernel" }
-    { "pick" "kernel" }
-    { "swap" "kernel" }
-    { "eq?" "kernel" }
-    { "tag" "kernel.private" }
-    { "slot" "slots.private" }
-    { "get-local" "locals.backend" }
-    { "load-local" "locals.backend" }
-    { "drop-locals" "locals.backend" }
-} [ make-sub-primitive ] assoc-each
+    { "(execute)" "words.private" (( word -- )) }
+    { "(call)" "kernel.private" (( quot -- )) }
+    { "both-fixnums?" "math.private" (( x y -- ? )) }
+    { "fixnum+fast" "math.private" (( x y -- z )) }
+    { "fixnum-fast" "math.private" (( x y -- z )) }
+    { "fixnum*fast" "math.private" (( x y -- z )) }
+    { "fixnum-bitand" "math.private" (( x y -- z )) }
+    { "fixnum-bitor" "math.private" (( x y -- z )) }
+    { "fixnum-bitxor" "math.private" (( x y -- z )) }
+    { "fixnum-bitnot" "math.private" (( x -- y )) }
+    { "fixnum-mod" "math.private" (( x y -- z )) }
+    { "fixnum-shift-fast" "math.private" (( x y -- z )) }
+    { "fixnum/i-fast" "math.private" (( x y -- z )) }
+    { "fixnum/mod-fast" "math.private" (( x y -- z w )) }
+    { "fixnum<" "math.private" (( x y -- ? )) }
+    { "fixnum<=" "math.private" (( x y -- z )) }
+    { "fixnum>" "math.private" (( x y -- ? )) }
+    { "fixnum>=" "math.private" (( x y -- ? )) }
+    { "drop" "kernel" (( x -- )) }
+    { "2drop" "kernel" (( x y -- )) }
+    { "3drop" "kernel" (( x y z -- )) }
+    { "dup" "kernel" (( x -- x x )) }
+    { "2dup" "kernel" (( x y -- x y x y )) }
+    { "3dup" "kernel" (( x y z -- x y z x y z )) }
+    { "rot" "kernel" (( x y z -- y z x )) }
+    { "-rot" "kernel" (( x y z -- z x y )) }
+    { "dupd" "kernel" (( x y -- x x y )) }
+    { "swapd" "kernel" (( x y z -- y x z )) }
+    { "nip" "kernel" (( x y -- y )) }
+    { "2nip" "kernel" (( x y z -- z )) }
+    { "tuck" "kernel" (( x y -- y x y )) }
+    { "over" "kernel" (( x y -- x y x )) }
+    { "pick" "kernel" (( x y z -- x y z x )) }
+    { "swap" "kernel" (( x y -- y x )) }
+    { "eq?" "kernel" (( obj1 obj2 -- ? )) }
+    { "tag" "kernel.private" (( object -- n )) }
+    { "slot" "slots.private" (( obj m -- value )) }
+    { "get-local" "locals.backend" (( n -- obj )) }
+    { "load-local" "locals.backend" (( obj -- )) }
+    { "drop-locals" "locals.backend" (( n -- )) }
+} [ first3 make-sub-primitive ] each
 
 ! Primitive words
-: make-primitive ( word vocab n -- )
-    [ create dup reset-word ] dip
-    [ do-primitive ] curry [ ] like define ;
+: make-primitive ( word vocab n effect -- )
+    [
+        [ create dup reset-word ] dip
+        [ do-primitive ] curry
+    ] dip define-declared ;
 
 {
-    { "bignum>fixnum" "math.private" }
-    { "float>fixnum" "math.private" }
-    { "fixnum>bignum" "math.private" }
-    { "float>bignum" "math.private" }
-    { "fixnum>float" "math.private" }
-    { "bignum>float" "math.private" }
-    { "<ratio>" "math.private" }
-    { "string>float" "math.private" }
-    { "float>string" "math.private" }
-    { "float>bits" "math" }
-    { "double>bits" "math" }
-    { "bits>float" "math" }
-    { "bits>double" "math" }
-    { "<complex>" "math.private" }
-    { "fixnum+" "math.private" }
-    { "fixnum-" "math.private" }
-    { "fixnum*" "math.private" }
-    { "fixnum/i" "math.private" }
-    { "fixnum/mod" "math.private" }
-    { "fixnum-shift" "math.private" }
-    { "bignum=" "math.private" }
-    { "bignum+" "math.private" }
-    { "bignum-" "math.private" }
-    { "bignum*" "math.private" }
-    { "bignum/i" "math.private" }
-    { "bignum-mod" "math.private" }
-    { "bignum/mod" "math.private" }
-    { "bignum-bitand" "math.private" }
-    { "bignum-bitor" "math.private" }
-    { "bignum-bitxor" "math.private" }
-    { "bignum-bitnot" "math.private" }
-    { "bignum-shift" "math.private" }
-    { "bignum<" "math.private" }
-    { "bignum<=" "math.private" }
-    { "bignum>" "math.private" }
-    { "bignum>=" "math.private" }
-    { "bignum-bit?" "math.private" }
-    { "bignum-log2" "math.private" }
-    { "byte-array>bignum" "math" }
-    { "float=" "math.private" }
-    { "float+" "math.private" }
-    { "float-" "math.private" }
-    { "float*" "math.private" }
-    { "float/f" "math.private" }
-    { "float-mod" "math.private" }
-    { "float<" "math.private" }
-    { "float<=" "math.private" }
-    { "float>" "math.private" }
-    { "float>=" "math.private" }
-    { "<word>" "words" }
-    { "word-xt" "words" }
-    { "getenv" "kernel.private" }
-    { "setenv" "kernel.private" }
-    { "(exists?)" "io.files.private" }
-    { "gc" "memory" }
-    { "gc-stats" "memory" }
-    { "save-image" "memory" }
-    { "save-image-and-exit" "memory" }
-    { "datastack" "kernel" }
-    { "retainstack" "kernel" }
-    { "callstack" "kernel" }
-    { "set-datastack" "kernel" }
-    { "set-retainstack" "kernel" }
-    { "set-callstack" "kernel" }
-    { "exit" "system" }
-    { "data-room" "memory" }
-    { "code-room" "memory" }
-    { "micros" "system" }
-    { "modify-code-heap" "compiler.units" }
-    { "dlopen" "alien" }
-    { "dlsym" "alien" }
-    { "dlclose" "alien" }
-    { "<byte-array>" "byte-arrays" }
-    { "(byte-array)" "byte-arrays" }
-    { "<displaced-alien>" "alien" }
-    { "alien-signed-cell" "alien.accessors" }
-    { "set-alien-signed-cell" "alien.accessors" }
-    { "alien-unsigned-cell" "alien.accessors" }
-    { "set-alien-unsigned-cell" "alien.accessors" }
-    { "alien-signed-8" "alien.accessors" }
-    { "set-alien-signed-8" "alien.accessors" }
-    { "alien-unsigned-8" "alien.accessors" }
-    { "set-alien-unsigned-8" "alien.accessors" }
-    { "alien-signed-4" "alien.accessors" }
-    { "set-alien-signed-4" "alien.accessors" }
-    { "alien-unsigned-4" "alien.accessors" }
-    { "set-alien-unsigned-4" "alien.accessors" }
-    { "alien-signed-2" "alien.accessors" }
-    { "set-alien-signed-2" "alien.accessors" }
-    { "alien-unsigned-2" "alien.accessors" }
-    { "set-alien-unsigned-2" "alien.accessors" }
-    { "alien-signed-1" "alien.accessors" }
-    { "set-alien-signed-1" "alien.accessors" }
-    { "alien-unsigned-1" "alien.accessors" }
-    { "set-alien-unsigned-1" "alien.accessors" }
-    { "alien-float" "alien.accessors" }
-    { "set-alien-float" "alien.accessors" }
-    { "alien-double" "alien.accessors" }
-    { "set-alien-double" "alien.accessors" }
-    { "alien-cell" "alien.accessors" }
-    { "set-alien-cell" "alien.accessors" }
-    { "alien-address" "alien" }
-    { "set-slot" "slots.private" }
-    { "string-nth" "strings.private" }
-    { "set-string-nth-fast" "strings.private" }
-    { "set-string-nth-slow" "strings.private" }
-    { "resize-array" "arrays" }
-    { "resize-string" "strings" }
-    { "<array>" "arrays" }
-    { "begin-scan" "memory" }
-    { "next-object" "memory" }
-    { "end-scan" "memory" }
-    { "size" "memory" }
-    { "die" "kernel" }
-    { "fopen" "io.streams.c" }
-    { "fgetc" "io.streams.c" }
-    { "fread" "io.streams.c" }
-    { "fputc" "io.streams.c" }
-    { "fwrite" "io.streams.c" }
-    { "fflush" "io.streams.c" }
-    { "fclose" "io.streams.c" }
-    { "<wrapper>" "kernel" }
-    { "(clone)" "kernel" }
-    { "<string>" "strings" }
-    { "array>quotation" "quotations.private" }
-    { "quotation-xt" "quotations" }
-    { "<tuple>" "classes.tuple.private" }
-    { "profiling" "tools.profiler.private" }
-    { "become" "kernel.private" }
-    { "(sleep)" "threads.private" }
-    { "<tuple-boa>" "classes.tuple.private" }
-    { "callstack>array" "kernel" }
-    { "innermost-frame-quot" "kernel.private" }
-    { "innermost-frame-scan" "kernel.private" }
-    { "set-innermost-frame-quot" "kernel.private" }
-    { "call-clear" "kernel" }
-    { "resize-byte-array" "byte-arrays" }
-    { "dll-valid?" "alien" }
-    { "unimplemented" "kernel.private" }
-    { "gc-reset" "memory" }
-    { "jit-compile" "quotations" }
-    { "load-locals" "locals.backend" }
-    { "check-datastack" "kernel.private" }
-}
-[ [ first2 ] dip make-primitive ] each-index
+    { "bignum>fixnum" "math.private" (( x -- y )) }
+    { "float>fixnum" "math.private" (( x -- y )) }
+    { "fixnum>bignum" "math.private" (( x -- y )) }
+    { "float>bignum" "math.private" (( x -- y )) }
+    { "fixnum>float" "math.private" (( x -- y )) }
+    { "bignum>float" "math.private" (( x -- y )) }
+    { "<ratio>" "math.private" (( a b -- a/b )) }
+    { "string>float" "math.private" (( str -- n/f )) }
+    { "float>string" "math.private" (( n -- str )) }
+    { "float>bits" "math" (( x -- n )) }
+    { "double>bits" "math" (( x -- n )) }
+    { "bits>float" "math" (( n -- x )) }
+    { "bits>double" "math" (( n -- x )) }
+    { "<complex>" "math.private" (( x y -- z )) }
+    { "fixnum+" "math.private" (( x y -- z )) }
+    { "fixnum-" "math.private" (( x y -- z )) }
+    { "fixnum*" "math.private" (( x y -- z )) }
+    { "fixnum/i" "math.private" (( x y -- z )) }
+    { "fixnum/mod" "math.private" (( x y -- z w )) }
+    { "fixnum-shift" "math.private" (( x y -- z )) }
+    { "bignum=" "math.private" (( x y -- ? )) }
+    { "bignum+" "math.private" (( x y -- z )) }
+    { "bignum-" "math.private" (( x y -- z )) }
+    { "bignum*" "math.private" (( x y -- z )) }
+    { "bignum/i" "math.private" (( x y -- z )) }
+    { "bignum-mod" "math.private" (( x y -- z )) }
+    { "bignum/mod" "math.private" (( x y -- z w )) }
+    { "bignum-bitand" "math.private" (( x y -- z )) }
+    { "bignum-bitor" "math.private" (( x y -- z )) }
+    { "bignum-bitxor" "math.private" (( x y -- z )) }
+    { "bignum-bitnot" "math.private" (( x -- y )) }
+    { "bignum-shift" "math.private" (( x y -- z )) }
+    { "bignum<" "math.private" (( x y -- ? )) }
+    { "bignum<=" "math.private" (( x y -- ? )) }
+    { "bignum>" "math.private" (( x y -- ? )) }
+    { "bignum>=" "math.private" (( x y -- ? )) }
+    { "bignum-bit?" "math.private" (( n x -- ? )) }
+    { "bignum-log2" "math.private" (( x -- n )) }
+    { "byte-array>bignum" "math" (( x -- y ))  }
+    { "float=" "math.private" (( x y -- ? )) }
+    { "float+" "math.private" (( x y -- z )) }
+    { "float-" "math.private" (( x y -- z )) }
+    { "float*" "math.private" (( x y -- z )) }
+    { "float/f" "math.private" (( x y -- z )) }
+    { "float-mod" "math.private" (( x y -- z )) }
+    { "float<" "math.private" (( x y -- ? )) }
+    { "float<=" "math.private" (( x y -- ? )) }
+    { "float>" "math.private" (( x y -- ? )) }
+    { "float>=" "math.private" (( x y -- ? )) }
+    { "<word>" "words" (( name vocab -- word )) }
+    { "word-xt" "words" (( word -- start end )) }
+    { "getenv" "kernel.private" (( n -- obj )) }
+    { "setenv" "kernel.private" (( obj n -- )) }
+    { "(exists?)" "io.files.private" (( path -- ? )) }
+    { "gc" "memory" (( -- )) }
+    { "gc-stats" "memory" f }
+    { "save-image" "memory" (( path -- )) }
+    { "save-image-and-exit" "memory" (( path -- )) }
+    { "datastack" "kernel" (( -- ds )) }
+    { "retainstack" "kernel" (( -- rs )) }
+    { "callstack" "kernel" (( -- cs )) }
+    { "set-datastack" "kernel" (( ds -- )) }
+    { "set-retainstack" "kernel" (( rs -- )) }
+    { "set-callstack" "kernel" (( cs -- )) }
+    { "exit" "system" (( n -- )) }
+    { "data-room" "memory" (( -- cards generations )) }
+    { "code-room" "memory" (( -- code-free code-total )) }
+    { "micros" "system" (( -- us )) }
+    { "modify-code-heap" "compiler.units" (( alist -- )) }
+    { "dlopen" "alien" (( path -- dll )) }
+    { "dlsym" "alien" (( name dll -- alien )) }
+    { "dlclose" "alien" (( dll -- )) }
+    { "<byte-array>" "byte-arrays" (( n -- byte-array )) }
+    { "(byte-array)" "byte-arrays" (( n -- byte-array )) }
+    { "<displaced-alien>" "alien" (( displacement c-ptr -- alien )) }
+    { "alien-signed-cell" "alien.accessors" f }
+    { "set-alien-signed-cell" "alien.accessors" f }
+    { "alien-unsigned-cell" "alien.accessors" f }
+    { "set-alien-unsigned-cell" "alien.accessors" f }
+    { "alien-signed-8" "alien.accessors" f }
+    { "set-alien-signed-8" "alien.accessors" f }
+    { "alien-unsigned-8" "alien.accessors" f }
+    { "set-alien-unsigned-8" "alien.accessors" f }
+    { "alien-signed-4" "alien.accessors" f }
+    { "set-alien-signed-4" "alien.accessors" f }
+    { "alien-unsigned-4" "alien.accessors" f }
+    { "set-alien-unsigned-4" "alien.accessors" f }
+    { "alien-signed-2" "alien.accessors" f }
+    { "set-alien-signed-2" "alien.accessors" f }
+    { "alien-unsigned-2" "alien.accessors" f }
+    { "set-alien-unsigned-2" "alien.accessors" f }
+    { "alien-signed-1" "alien.accessors" f }
+    { "set-alien-signed-1" "alien.accessors" f }
+    { "alien-unsigned-1" "alien.accessors" f }
+    { "set-alien-unsigned-1" "alien.accessors" f }
+    { "alien-float" "alien.accessors" f }
+    { "set-alien-float" "alien.accessors" f }
+    { "alien-double" "alien.accessors" f }
+    { "set-alien-double" "alien.accessors" f }
+    { "alien-cell" "alien.accessors" f }
+    { "set-alien-cell" "alien.accessors" f }
+    { "alien-address" "alien" (( c-ptr -- addr )) }
+    { "set-slot" "slots.private" (( value obj n -- )) }
+    { "string-nth" "strings.private" (( n string -- ch )) }
+    { "set-string-nth-fast" "strings.private" (( ch n string -- )) }
+    { "set-string-nth-slow" "strings.private" (( ch n string -- )) }
+    { "resize-array" "arrays" (( n array -- newarray )) }
+    { "resize-string" "strings" (( n str -- newstr )) }
+    { "<array>" "arrays" (( n elt -- array )) }
+    { "begin-scan" "memory" (( -- )) }
+    { "next-object" "memory" (( -- obj )) }
+    { "end-scan" "memory" (( -- )) }
+    { "size" "memory" (( obj -- n )) }
+    { "die" "kernel" (( -- )) }
+    { "fopen" "io.streams.c" (( path mode -- alien )) }
+    { "fgetc" "io.streams.c" (( alien -- ch/f )) }
+    { "fread" "io.streams.c" (( n alien -- str/f )) }
+    { "fputc" "io.streams.c" (( ch alien -- )) }
+    { "fwrite" "io.streams.c" (( string alien -- )) }
+    { "fflush" "io.streams.c" (( alien -- )) }
+    { "fclose" "io.streams.c" (( alien -- )) }
+    { "<wrapper>" "kernel" (( obj -- wrapper )) }
+    { "(clone)" "kernel" (( obj -- newobj )) }
+    { "<string>" "strings" (( n ch -- string )) }
+    { "array>quotation" "quotations.private" (( array -- quot )) }
+    { "quotation-xt" "quotations" (( quot -- xt )) }
+    { "<tuple>" "classes.tuple.private" (( layout -- tuple )) }
+    { "profiling" "tools.profiler.private" (( ? -- )) }
+    { "become" "kernel.private" (( old new -- )) }
+    { "(sleep)" "threads.private" (( us -- )) }
+    { "<tuple-boa>" "classes.tuple.private" (( ... layout -- tuple )) }
+    { "callstack>array" "kernel" (( callstack -- array )) }
+    { "innermost-frame-quot" "kernel.private" (( callstack -- quot )) }
+    { "innermost-frame-scan" "kernel.private" (( callstack -- n )) }
+    { "set-innermost-frame-quot" "kernel.private" (( n callstack -- )) }
+    { "call-clear" "kernel" (( quot -- )) }
+    { "resize-byte-array" "byte-arrays" (( n byte-array -- newbyte-array )) }
+    { "dll-valid?" "alien" (( dll -- ? )) }
+    { "unimplemented" "kernel.private" (( -- * )) }
+    { "gc-reset" "memory" (( -- )) }
+    { "jit-compile" "quotations" (( quot -- )) }
+    { "load-locals" "locals.backend" (( ... n -- )) }
+    { "check-datastack" "kernel.private" (( array in# out# -- ? )) }
+} [ [ first3 ] dip swap make-primitive ] each-index
 
 ! Bump build number
 "build" "kernel" create build 1+ [ ] curry (( -- n )) define-declared
index 1c97ee5a500cf482428bc25d74e0cd5fbc41b30d..6e6812e25c3ca3e1c098bc75bfc6f49530ed3489 100644 (file)
@@ -57,6 +57,7 @@ IN: bootstrap.syntax
     "EXCLUDE:"
     "RENAME:"
     "ALIAS:"
+    "SYNTAX:"
     "V{"
     "W{"
     "["
@@ -68,7 +69,6 @@ IN: bootstrap.syntax
     "foldable"
     "inline"
     "recursive"
-    "parsing"
     "t"
     "{"
     "}"
index 888eac76450ba0c266552730733e7dc66d8e7dc4..eded33beed3788bbd69e21493204f151b7349229 100644 (file)
@@ -1,4 +1,4 @@
-! Copyright (C) 2004, 2008 Slava Pestov.
+! Copyright (C) 2004, 2009 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors arrays definitions assocs kernel kernel.private
 slots.private namespaces make sequences strings words words.symbol
@@ -126,14 +126,19 @@ M: sequence implementors [ implementors ] gather ;
         } spread
     ] H{ } make-assoc ;
 
+: ?define-symbol ( word -- )
+    dup deferred? [ define-symbol ] [ drop ] if ;
+
 : (define-class) ( word props -- )
     [
-        dup class? [ dup [ implementors-map+ ] [ new-class ] bi ] unless
-        dup reset-class
-        dup deferred? [ dup define-symbol ] when
-        dup redefined
-        dup props>>
-    ] dip assoc-union >>props
+        {
+            [ dup class? [ drop ] [ [ implementors-map+ ] [ new-class ] bi ] if ]
+            [ reset-class ]
+            [ ?define-symbol ]
+            [ redefined ]
+            [ ]
+        } cleave
+    ] dip [ assoc-union ] curry change-props
     dup predicate-word
     [ 1quotation "predicate" set-word-prop ]
     [ swap "predicating" set-word-prop ]
index d9011ad776b61710d371b83f9bc338df00fbbc57..9d0bb7d16f35ea87e82e4fdf68c143d10699fe5b 100644 (file)
@@ -13,7 +13,7 @@ GENERIC: zammo ( obj -- str )
 
 SINGLETON: word-and-singleton
 
-: word-and-singleton 3 ;
+: word-and-singleton ( -- x ) 3 ;
 
 [ t ] [ \ word-and-singleton word-and-singleton? ] unit-test
 [ 3 ] [ word-and-singleton ] unit-test
index f27d24e39dfeb04daabf67e23d0e0c7e20940e40..fa2df4e3121c18507b42b460f81209e763cb763f 100644 (file)
@@ -4,7 +4,8 @@ namespaces quotations sequences.private classes continuations
 generic.standard effects classes.tuple classes.tuple.private
 arrays vectors strings compiler.units accessors classes.algebra
 calendar prettyprint io.streams.string splitting summary
-columns math.order classes.private slots slots.private eval see ;
+columns math.order classes.private slots slots.private eval see
+words.symbol ;
 IN: classes.tuple.tests
 
 TUPLE: rect x y w h ;
@@ -62,7 +63,7 @@ TUPLE: predicate-test ;
 
 C: <predicate-test> predicate-test
 
-: predicate-test drop f ;
+: predicate-test ( a -- ? ) drop f ;
 
 [ t ] [ <predicate-test> predicate-test? ] unit-test
 
@@ -97,7 +98,7 @@ TUPLE: size-test a b c d ;
     size-test tuple-layout second =
 ] unit-test
 
-GENERIC: <yo-momma>
+GENERIC: <yo-momma> ( a -- b )
 
 TUPLE: yo-momma ;
 
@@ -123,7 +124,7 @@ TUPLE: loc-recording ;
 
 TUPLE: forget-robustness ;
 
-GENERIC: forget-robustness-generic
+GENERIC: forget-robustness-generic ( a -- b )
 
 M: forget-robustness forget-robustness-generic ;
 
@@ -493,7 +494,7 @@ must-fail-with
 [ t ] [ "z" accessor-exists? ] unit-test
 
 [ [ ] ] [
-    "IN: classes.tuple.tests GENERIC: forget-accessors-test"
+    "IN: classes.tuple.tests GENERIC: forget-accessors-test ( a -- b )"
     <string-reader>
     "forget-accessors-test" parse-stream
 ] unit-test
@@ -508,7 +509,7 @@ TUPLE: another-forget-accessors-test ;
 
 
 [ [ ] ] [
-    "IN: classes.tuple.tests GENERIC: another-forget-accessors-test"
+    "IN: classes.tuple.tests GENERIC: another-forget-accessors-test ( a -- b )"
     <string-reader>
     "another-forget-accessors-test" parse-stream
 ] unit-test
@@ -567,7 +568,7 @@ GENERIC: break-me ( obj -- )
 
 [ ] [ "IN: classes.tuple.tests USE: kernel M: subclass-reset-test-1 break-me drop ;" eval ] unit-test
 
-[ ] [ "IN: classes.tuple.tests : subclass-reset-test ;" <string-reader> "subclass-reset-test" parse-stream drop ] unit-test
+[ ] [ "IN: classes.tuple.tests : subclass-reset-test ( -- ) ;" <string-reader> "subclass-reset-test" parse-stream drop ] unit-test
 
 [ f ] [ subclass-reset-test-1 tuple-class? ] unit-test
 [ f ] [ subclass-reset-test-2 tuple-class? ] unit-test
@@ -666,7 +667,7 @@ DEFER: error-y
 
 [ ] [ [ \ error-y dup class? [ forget-class ] [ drop ] if ] with-compilation-unit ] unit-test
 
-[ ] [ "IN: classes.tuple.tests GENERIC: error-y" eval ] unit-test
+[ ] [ "IN: classes.tuple.tests GENERIC: error-y ( a -- b )" eval ] unit-test
 
 [ f ] [ \ error-y tuple-class? ] unit-test
 
@@ -730,4 +731,18 @@ SLOT: kex
 ] unit-test
 
 [ t ] [ \ change-slot-test \ kex>> method >boolean ] unit-test
-[ f ] [ \ change-slot-test \ kex>> method "reading" word-prop ] unit-test
\ No newline at end of file
+[ f ] [ \ change-slot-test \ kex>> method "reading" word-prop ] unit-test
+
+DEFER: redefine-tuple-twice
+
+[ ] [ "IN: classes.tuple.tests TUPLE: redefine-tuple-twice ;" eval ] unit-test
+
+[ t ] [ \ redefine-tuple-twice symbol? ] unit-test
+
+[ ] [ "IN: classes.tuple.tests DEFER: redefine-tuple-twice" eval ] unit-test
+
+[ t ] [ \ redefine-tuple-twice deferred? ] unit-test
+
+[ ] [ "IN: classes.tuple.tests TUPLE: redefine-tuple-twice ;" eval ] unit-test
+
+[ t ] [ \ redefine-tuple-twice symbol? ] unit-test
\ No newline at end of file
index a01c9db53e68089360e943db0dbe1418c1734a20..fb7a0732050d4640ba5aaf26f4d6564edd36f6a4 100755 (executable)
@@ -247,8 +247,7 @@ M: tuple-class update-class
             bi
         ] each-subclass
     ]
-    [ define-new-tuple-class ]
-    3bi ;
+    [ define-new-tuple-class ] 3bi ;
 
 : tuple-class-unchanged? ( class superclass slots -- ? )
     [ [ superclass ] [ bootstrap-word ] bi* = ]
@@ -275,7 +274,7 @@ M: word (define-tuple-class)
 
 M: tuple-class (define-tuple-class)
     3dup tuple-class-unchanged?
-    [ 3drop ] [ redefine-tuple-class ] if ;
+    [ 2drop ?define-symbol ] [ redefine-tuple-class ] if ;
 
 : thrower-effect ( slots -- effect )
     [ dup array? [ first ] when ] map { "*" } <effect> ;
index be7d93873e40328595f1fefac15c919e53c379a1..76f9f63c49be13be25f66bd60a7e08af227d05c4 100644 (file)
@@ -288,7 +288,7 @@ CONSTANT: case-const-2 2
     } case
 ] unit-test
 
-: do-not-call "do not call" throw ;
+: do-not-call ( -- * ) "do not call" throw ;
 
 : test-case-6 ( obj -- value )
     {
index eac288a0799325aaeb2d10df6bf38d7272caae4f..afa05f94426e20657ff84a932902518a27e08e22 100644 (file)
@@ -148,6 +148,7 @@ GENERIC: definitions-changed ( assoc obj -- )
     [
         H{ } clone changed-definitions set
         H{ } clone changed-generics set
+        H{ } clone changed-effects set
         H{ } clone outdated-generics set
         H{ } clone outdated-tuples set
         H{ } clone new-classes set
@@ -158,6 +159,7 @@ GENERIC: definitions-changed ( assoc obj -- )
     [
         H{ } clone changed-definitions set
         H{ } clone changed-generics set
+        H{ } clone changed-effects set
         H{ } clone outdated-generics set
         H{ } clone forgotten-definitions set
         H{ } clone outdated-tuples set
index d5bd0da663b5b2e581657f0e632c914f5413583b..34a4ed28794c7b5d32f41902a0c0b74955c43cc9 100644 (file)
@@ -3,7 +3,7 @@ continuations debugger parser memory arrays words
 kernel.private accessors eval ;
 IN: continuations.tests
 
-: (callcc1-test)
+: (callcc1-test) ( -- )
     [ 1- dup ] dip ?push
     over 0 = [ "test-cc" get continue-with ] when
     (callcc1-test) ;
@@ -59,10 +59,10 @@ IN: continuations.tests
 ! : callstack-overflow callstack-overflow f ;
 ! [ callstack-overflow ] must-fail
 
-: don't-compile-me { } [ ] each ;
+: don't-compile-me ( -- ) { } [ ] each ;
 
-: foo callstack "c" set 3 don't-compile-me ;
-: bar 1 foo 2 ;
+: foo ( -- ) callstack "c" set 3 don't-compile-me ;
+: bar ( -- a b ) 1 foo 2 ;
 
 [ 1 3 2 ] [ bar ] unit-test
 
index 3fa30b63ee2799e93f9afd5543908accbe6013a3..434b133b3f2ad38cc789c43aaf629ac82a0ca0ed 100644 (file)
@@ -1,13 +1,11 @@
-! Copyright (C) 2006, 2008 Slava Pestov.
+! Copyright (C) 2006, 2009 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-IN: definitions
 USING: kernel sequences namespaces assocs graphs math math.order ;
+IN: definitions
 
 ERROR: no-compilation-unit definition ;
 
-SYMBOL: inlined-dependency
-SYMBOL: flushed-dependency
-SYMBOL: called-dependency
+SYMBOLS: inlined-dependency flushed-dependency called-dependency ;
 
 : set-in-unit ( value key assoc -- )
     [ set-at ] [ no-compilation-unit ] if* ;
@@ -17,6 +15,11 @@ SYMBOL: changed-definitions
 : changed-definition ( defspec -- )
     inlined-dependency swap changed-definitions get set-in-unit ;
 
+SYMBOL: changed-effects
+
+: changed-effect ( word -- )
+    dup changed-effects get set-in-unit ;
+
 SYMBOL: changed-generics
 
 SYMBOL: outdated-generics
index e09a88aee4ba7acef0643b612f5fd1b45158597e..f9d0770d0238f4605b0b93786e8260add302db95 100644 (file)
@@ -21,7 +21,7 @@ T{ dispose-dummy } "b" set
 
 TUPLE: dummy-obj destroyed? ;
 
-: <dummy-obj> dummy-obj new ;
+: <dummy-obj> ( -- obj ) dummy-obj new ;
 
 TUPLE: dummy-destructor obj ;
 
@@ -30,10 +30,10 @@ C: <dummy-destructor> dummy-destructor
 M: dummy-destructor dispose ( obj -- )
     obj>> t >>destroyed? drop ;
 
-: destroy-always
+: destroy-always ( obj -- )
     <dummy-destructor> &dispose drop ;
 
-: destroy-later
+: destroy-later ( obj -- )
     <dummy-destructor> |dispose drop ;
 
 [ t ] [
index 04dc42712ce027ff0d3648c7b6da12a7189f6afa..b9cb0ddcc9e101e127de7bb84de0be3debb55888 100644 (file)
@@ -1,7 +1,7 @@
 ! Copyright (C) 2008, 2009 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: lexer sets sequences kernel splitting effects
-combinators arrays parser ;
+combinators arrays ;
 IN: effects.parser
 
 DEFER: parse-effect
@@ -12,9 +12,9 @@ ERROR: bad-effect ;
     scan [ nip ] [ = ] 2bi [ drop f ] [
         dup { f "(" "((" } member? [ bad-effect ] [
             ":" ?tail [
-                scan-word {
-                    { \ ( [ ")" parse-effect ] }
-                    [ ]
+                scan {
+                    { "(" [ ")" parse-effect ] }
+                    { f [ ")" unexpected-eof ] }
                 } case 2array
             ] when
         ] if
@@ -27,5 +27,8 @@ ERROR: bad-effect ;
     parse-effect-tokens { "--" } split1 dup
     [ <effect> ] [ "Stack effect declaration must contain --" throw ] if ;
 
+: complete-effect ( -- effect )
+    "(" expect ")" parse-effect ;
+
 : parse-call( ( accum word -- accum )
-    [ ")" parse-effect parsed ] dip parsed ;
\ No newline at end of file
+    [ ")" parse-effect ] dip 2array over push-all ;
\ No newline at end of file
index 613dbf72a4a191ae420d528974e936514c96d059..b90bcc8fc1e20d9f2690c1e7489c9d842a507231 100644 (file)
@@ -1,6 +1,6 @@
 USING: help.markup help.syntax words classes classes.algebra
 definitions kernel alien sequences math quotations
-generic.standard generic.math combinators prettyprint ;
+generic.standard generic.math combinators prettyprint effects ;
 IN: generic
 
 ARTICLE: "method-order" "Method precedence"
@@ -115,7 +115,7 @@ HELP: make-generic
 $low-level-note ;
 
 HELP: define-generic
-{ $values { "word" word } { "combination" "a method combination" } }
+{ $values { "word" word } { "effect" effect } { "combination" "a method combination" } }
 { $description "Defines a generic word. A method combination is an object which responds to the " { $link perform-combination } " generic word." }
 { $contract "The method combination quotation is called each time the generic word has to be updated (for example, when a method is added), and thus must be side-effect free." } ;
 
index aea7875b202d8efbe13aa5f6fe481246030e012e..aadc44833fa8c3713c41e50f99c1fb04cc42f0e0 100755 (executable)
@@ -186,7 +186,7 @@ M: f generic-forget-test-3 ;
 
 [ f ] [ f generic-forget-test-3 ] unit-test
 
-: a-word ;
+: a-word ( -- ) ;
 
 GENERIC: a-generic ( a -- b )
 
@@ -196,7 +196,7 @@ M: integer a-generic a-word ;
 
 [ t ] [ "m" get \ a-word usage memq? ] unit-test
 
-[ ] [ "IN: generic.tests : a-generic ;" eval ] unit-test
+[ ] [ "IN: generic.tests : a-generic ( -- ) ;" eval ] unit-test
 
 [ f ] [ "m" get \ a-word usage memq? ] unit-test
 
index ef1ca6f1ab5c4d4d8c49804a2b519d8e7751ca17..8380a41207a16afa017238cb9ce1bc234bbb4d79 100644 (file)
@@ -185,13 +185,21 @@ M: sequence update-methods ( class seq -- )
         [ changed-generic ] [ remake-generic drop ] 2bi
     ] with each ;
 
-: define-generic ( word combination -- )
-    over "combination" word-prop over = [ drop ] [
-        2dup "combination" set-word-prop
-        over "methods" word-prop values forget-all
-        over H{ } clone "methods" set-word-prop
-        dupd define-default-method
-    ] if remake-generic ;
+: define-generic ( word combination effect -- )
+    [ nip swap set-stack-effect ]
+    [
+        drop
+        2dup [ "combination" word-prop ] dip = [ 2drop ] [
+            {
+                [ "combination" set-word-prop ]
+                [ drop "methods" word-prop values forget-all ]
+                [ drop H{ } clone "methods" set-word-prop ]
+                [ define-default-method ]
+            }
+            2cleave
+        ] if
+    ]
+    [ 2drop remake-generic ] 3tri ;
 
 M: generic subwords
     [
index 738c011a48586225161e8de283fb725a885cd41c..8d4610dabed96986dd781ea81fbd507431b752a5 100644 (file)
@@ -72,7 +72,7 @@ SYMBOL: picker
         \ dispatch ,
     ] [ ] make ; inline
 
-TUPLE: math-combination ;
+SINGLETON: math-combination
 
 M: math-combination make-default-method
     drop default-math-method ;
index bf9cdb19f5de56506a91c7693bb7c51ef42a2bf0..ce048c41dafd8fa45c87375ec956eb5613221f49 100644 (file)
@@ -1,12 +1,15 @@
-! Copyright (C) 2008 Slava Pestov.
+! Copyright (C) 2008, 2009 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: parser kernel words generic namespaces ;
+USING: parser kernel words generic namespaces effects.parser ;
 IN: generic.parser
 
 ERROR: not-in-a-method-error ;
 
 : CREATE-GENERIC ( -- word ) CREATE dup reset-word ;
 
+: (GENERIC:) ( quot -- )
+    [ CREATE-GENERIC ] dip call complete-effect define-generic ; inline
+
 : create-method-in ( class generic -- method )
     create-method dup set-word dup save-location ;
 
index ec2e78c48d17c8bf33f9cd64342ff7e2137f025e..6e788eb947e26984a203189a3d1a8e0dc21e4ea7 100644 (file)
@@ -1,5 +1,5 @@
 USING: generic help.markup help.syntax sequences math
-math.parser ;
+math.parser effects ;
 IN: generic.standard
 
 HELP: no-method
@@ -28,7 +28,7 @@ HELP: hook-combination
 } ;
 
 HELP: define-simple-generic
-{ $values { "word" "a word" } }
+{ $values { "word" "a word" } { "effect" effect } }
 { $description "Defines a generic word with the " { $link standard-combination } " method combination and a dispatch position of 0." } ;
 
 { standard-combination hook-combination } related-words
index 2cd64ac9f4f7b06c06408c057fd83db4f7472a7d..a6269135f4193db65ebe15788d2ecdef1f1c6a46 100644 (file)
@@ -280,16 +280,6 @@ M: growable call-next-hooker call-next-method "growable " prepend ;
     V{ } my-var [ call-next-hooker ] with-variable
 ] unit-test
 
-GENERIC: no-stack-effect-decl
-
-M: hashtable no-stack-effect-decl ;
-M: vector no-stack-effect-decl ;
-M: sbuf no-stack-effect-decl ;
-
-[ ] [ \ no-stack-effect-decl see ] unit-test
-
-[ ] [ \ no-stack-effect-decl def>> . ] unit-test
-
 ! Cross-referencing with generic words
 TUPLE: xref-tuple-1 ;
 TUPLE: xref-tuple-2 < xref-tuple-1 ;
index f9fe3a6e9e347a8473e252746fee2dd9dd65b0e0..5dbc0d17a1284993180d83bde72b4f7193369550 100644 (file)
@@ -24,7 +24,7 @@ M: quotation engine>quot
 ERROR: no-method object generic ;
 
 : error-method ( word -- quot )
-    picker swap [ no-method ] curry append ;
+    [ picker ] dip [ no-method ] curry append ;
 
 : push-method ( method specializer atomic assoc -- )
     [
@@ -56,7 +56,7 @@ ERROR: no-method object generic ;
 
 : find-default ( methods -- quot )
     #! Side-effects methods.
-    object bootstrap-word swap delete-at* [
+    [ object bootstrap-word ] dip delete-at* [
         drop generic get "default-method" word-prop mangle-method
     ] unless ;
 
@@ -104,8 +104,10 @@ PREDICATE: standard-generic < generic
 PREDICATE: simple-generic < standard-generic
     "combination" word-prop #>> zero? ;
 
-: define-simple-generic ( word -- )
-    T{ standard-combination f 0 } define-generic ;
+CONSTANT: simple-combination T{ standard-combination f 0 }
+
+: define-simple-generic ( word effect -- )
+    [ simple-combination ] dip define-generic ;
 
 : with-standard ( combination quot -- quot' )
     [ #>> (dispatch#) ] dip with-variable ; inline
index 959f145bf53f75f63191a3b0d1cb814f16af3667..e6ac5760aaa2a4dcfdb58c2b768cd24113e33e2f 100644 (file)
@@ -1,4 +1,4 @@
 IN: io.tests
 USE: math
-: foo 2 2 + ;
+: foo ( -- x ) 2 2 + ;
 FORGET: foo
\ No newline at end of file
index 4d725e57f892c3b150a992c63b838d5573d2545b..63346f4701fecfea0a490c394377aa83be4408c3 100644 (file)
@@ -21,21 +21,21 @@ IN: kernel.tests
 
 [ ] [ :c ] unit-test
 
-: overflow-d 3 overflow-d ;
+: overflow-d ( -- ) 3 overflow-d ;
 
 [ overflow-d ] [ { "kernel-error" 12 f f } = ] must-fail-with
 
 [ ] [ :c ] unit-test
 
-: (overflow-d-alt) 3 ;
+: (overflow-d-alt) ( -- ) 3 ;
 
-: overflow-d-alt (overflow-d-alt) overflow-d-alt ;
+: overflow-d-alt ( -- ) (overflow-d-alt) overflow-d-alt ;
 
 [ overflow-d-alt ] [ { "kernel-error" 12 f f } = ] must-fail-with
 
 [ ] [ [ :c ] with-string-writer drop ] unit-test
 
-: overflow-r 3 load-local overflow-r ;
+: overflow-r ( -- ) 3 load-local overflow-r ;
 
 [ overflow-r ] [ { "kernel-error" 14 f f } = ] must-fail-with
 
@@ -99,7 +99,7 @@ IN: kernel.tests
 [ ] [ :c ] unit-test
 
 ! Doesn't compile; important
-: foo 5 + 0 [ ] each ;
+: foo ( a -- b ) 5 + 0 [ ] each ;
 
 [ drop foo ] must-fail
 [ ] [ :c ] unit-test
@@ -115,7 +115,7 @@ IN: kernel.tests
 [ loop ] must-fail
 
 ! Discovered on Windows
-: total-failure-1 "" [ ] map unimplemented ;
+: total-failure-1 ( -- ) "" [ ] map unimplemented ;
 
 [ total-failure-1 ] must-fail
 
index 52529892f42008f2460e24a91391e1c83bef2a9a..56f19595cbbabb099b432033a41f26a2165099ee 100644 (file)
@@ -1,7 +1,6 @@
 ! Copyright (C) 2004, 2009 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: kernel.private slots.private math.private
-classes.tuple.private ;
+USING: kernel.private slots.private math.private ;
 IN: kernel
 
 DEFER: dip
index 23bc41a1bb30f2b320d00be0877ee5760ca3938d..547f7c0490ebd3805c2ca5277eaa85b8be8245b7 100644 (file)
@@ -54,8 +54,10 @@ $nl
 ARTICLE: "parsing-words" "Parsing words"
 "The Factor parser follows a simple recursive-descent design. The parser reads successive tokens from the input; if the token identifies a number or an ordinary word, it is added to an accumulator vector. Otherwise if the token identifies a parsing word, the parsing word is executed immediately."
 $nl
-"Parsing words are marked by suffixing the definition with a " { $link POSTPONE: parsing } " declaration. Here is the simplest possible parsing word; it prints a greeting at parse time:"
-{ $code ": hello \"Hello world\" print ; parsing" }
+"Parsing words are defined using the a defining word:"
+{ $subsection POSTPONE: SYNTAX: }
+"Parsing words have uppercase names by convention. Here is the simplest possible parsing word; it prints a greeting at parse time:"
+{ $code "SYNTAX: HELLO \"Hello world\" print ;" }
 "Parsing words must not pop or push items from the stack; however, they are permitted to access the accumulator vector supplied by the parser at the top of the stack. That is, parsing words must have stack effect " { $snippet "( accum -- accum )" } ", where " { $snippet "accum" } " is the accumulator vector supplied by the parser."
 $nl
 "Parsing words can read input, add word definitions to the dictionary, and do anything an ordinary word can."
index adf1c8adcf84d377811804bb1f2a423b2ea5b8d8..3ba414fe6beb9304cbd6ff56def0e823ddd92697 100644 (file)
@@ -27,7 +27,7 @@ IN: parser.tests
 
     [ "hello world" ]
     [
-        "IN: parser.tests : hello \"hello world\" ;"
+        "IN: parser.tests : hello ( -- str ) \"hello world\" ;"
         eval "USE: parser.tests hello" eval
     ] unit-test
 
@@ -78,12 +78,8 @@ IN: parser.tests
     [ T{ effect f { "a" "b" } { "d" } f } ]
     [ \ effect-parsing-test "declared-effect" word-prop ] unit-test
 
-    [ ] [ "IN: parser.tests : effect-parsing-test ;" eval ] unit-test
-
-    [ f ] [ \ effect-parsing-test "declared-effect" word-prop ] unit-test
-
     ! Funny bug
-    [ 2 ] [ "IN: parser.tests : \0. 2 ; \0." eval ] unit-test
+    [ 2 ] [ "IN: parser.tests : \0. ( -- x ) 2 ; \0." eval ] unit-test
 
     [ "IN: parser.tests : missing-- ( a b ) ;" eval ] must-fail
 
@@ -106,11 +102,11 @@ IN: parser.tests
     ] unit-test
     DEFER: foo
 
-    "IN: parser.tests USING: math prettyprint ; : foo 2 2 + . ; parsing" eval
+    "IN: parser.tests USING: math prettyprint ; SYNTAX: foo 2 2 + . ;" eval
 
     [ ] [ "USE: parser.tests foo" eval ] unit-test
 
-    "IN: parser.tests USING: math prettyprint ; : foo 2 2 + . ;" eval
+    "IN: parser.tests USING: math prettyprint ; : foo ( -- ) 2 2 + . ;" eval
 
     [ t ] [
         "USE: parser.tests \\ foo" eval
@@ -120,7 +116,7 @@ IN: parser.tests
     ! Test smudging
 
     [ 1 ] [
-        "IN: parser.tests : smudge-me ;" <string-reader> "foo"
+        "IN: parser.tests : smudge-me ( -- ) ;" <string-reader> "foo"
         parse-stream drop
 
         "foo" source-file definitions>> first assoc-size
@@ -129,7 +125,7 @@ IN: parser.tests
     [ t ] [ "smudge-me" "parser.tests" lookup >boolean ] unit-test
 
     [ ] [
-        "IN: parser.tests : smudge-me-more ;" <string-reader> "foo"
+        "IN: parser.tests : smudge-me-more ( -- ) ;" <string-reader> "foo"
         parse-stream drop
     ] unit-test
 
@@ -137,7 +133,7 @@ IN: parser.tests
     [ f ] [ "smudge-me" "parser.tests" lookup >boolean ] unit-test
 
     [ 3 ] [
-        "IN: parser.tests USING: math strings ; GENERIC: smudge-me M: integer smudge-me ; M: string smudge-me ;" <string-reader> "foo"
+        "IN: parser.tests USING: math strings ; GENERIC: smudge-me ( a -- b ) M: integer smudge-me ; M: string smudge-me ;" <string-reader> "foo"
         parse-stream drop
 
         "foo" source-file definitions>> first assoc-size
@@ -151,7 +147,7 @@ IN: parser.tests
     ] unit-test
 
     [ 2 ] [
-        "IN: parser.tests USING: math strings ; GENERIC: smudge-me M: integer smudge-me ;" <string-reader> "foo"
+        "IN: parser.tests USING: math strings ; GENERIC: smudge-me ( a -- b ) M: integer smudge-me ;" <string-reader> "foo"
         parse-stream drop
 
         "foo" source-file definitions>> first assoc-size
@@ -190,7 +186,7 @@ IN: parser.tests
     [ ] [
         "a" source-files get delete-at
         2 [
-            "IN: parser.tests DEFER: x : y x ; : x y ;"
+            "IN: parser.tests DEFER: x : y ( -- ) x ; : x ( -- ) y ;"
             <string-reader> "a" parse-stream drop
         ] times
     ] unit-test
@@ -198,7 +194,7 @@ IN: parser.tests
     "a" source-files get delete-at
 
     [
-        "IN: parser.tests : x ; : y 3 throw ; this is an error"
+        "IN: parser.tests : x ( -- ) ; : y ( -- * ) 3 throw ; this is an error"
         <string-reader> "a" parse-stream
     ] [ source-file-error? ] must-fail-with
 
@@ -207,7 +203,7 @@ IN: parser.tests
     ] unit-test
 
     [ f ] [
-        "IN: parser.tests : x ;"
+        "IN: parser.tests : x ( -- ) ;"
         <string-reader> "a" parse-stream drop
         
         "y" "parser.tests" lookup
@@ -215,18 +211,18 @@ IN: parser.tests
 
     ! Test new forward definition logic
     [ ] [
-        "IN: axx : axx ;"
+        "IN: axx : axx ( -- ) ;"
         <string-reader> "axx" parse-stream drop
     ] unit-test
 
     [ ] [
-        "USE: axx IN: bxx : bxx ; : cxx axx bxx ;"
+        "USE: axx IN: bxx : bxx ( -- ) ; : cxx ( -- ) axx bxx ;"
         <string-reader> "bxx" parse-stream drop
     ] unit-test
 
     ! So we move the bxx word to axx...
     [ ] [
-        "IN: axx : axx ; : bxx ;"
+        "IN: axx : axx ( -- ) ; : bxx ( -- ) ;"
         <string-reader> "axx" parse-stream drop
     ] unit-test
 
@@ -234,7 +230,7 @@ IN: parser.tests
 
     ! And reload the file that uses it...
     [ ] [
-        "USE: axx IN: bxx : cxx axx bxx ;"
+        "USE: axx IN: bxx ( -- ) : cxx ( -- ) axx bxx ;"
         <string-reader> "bxx" parse-stream drop
     ] unit-test
     
@@ -243,17 +239,17 @@ IN: parser.tests
     ! Turning a generic into a non-generic could cause all
     ! kinds of funnyness
     [ ] [
-        "IN: ayy USE: kernel GENERIC: ayy M: object ayy ;"
+        "IN: ayy USE: kernel GENERIC: ayy ( a -- b ) M: object ayy ;"
         <string-reader> "ayy" parse-stream drop
     ] unit-test
 
     [ ] [
-        "IN: ayy USE: kernel : ayy ;"
+        "IN: ayy USE: kernel : ayy ( -- ) ;"
         <string-reader> "ayy" parse-stream drop
     ] unit-test
 
     [ ] [
-        "IN: azz TUPLE: my-class ; GENERIC: a-generic"
+        "IN: azz TUPLE: my-class ; GENERIC: a-generic ( a -- b )"
         <string-reader> "azz" parse-stream drop
     ] unit-test
 
@@ -263,7 +259,7 @@ IN: parser.tests
     ] unit-test
 
     [ ] [
-        "IN: azz GENERIC: a-generic"
+        "IN: azz GENERIC: a-generic ( a -- b )"
         <string-reader> "azz" parse-stream drop
     ] unit-test
 
@@ -273,12 +269,12 @@ IN: parser.tests
     ] unit-test
 
     [ ] [
-        "IN: parser.tests : <bogus-error> ; : bogus <bogus-error> ;"
+        "IN: parser.tests : <bogus-error> ( -- ) ; : bogus ( -- ) <bogus-error> ;"
         <string-reader> "bogus-error" parse-stream drop
     ] unit-test
 
     [ ] [
-        "IN: parser.tests TUPLE: bogus-error ; C: <bogus-error> bogus-error : bogus <bogus-error> ;"
+        "IN: parser.tests TUPLE: bogus-error ; C: <bogus-error> bogus-error : bogus ( -- ) <bogus-error> ;"
         <string-reader> "bogus-error" parse-stream drop
     ] unit-test
 
@@ -298,7 +294,7 @@ IN: parser.tests
     ] unit-test
 
     [
-        "IN: parser.tests TUPLE: another-pred-test ; GENERIC: another-pred-test?"
+        "IN: parser.tests TUPLE: another-pred-test ; GENERIC: another-pred-test? ( a -- b )"
         <string-reader> "removing-the-predicate" parse-stream
     ] [ error>> error>> error>> redefine-error? ] must-fail-with
 
@@ -313,7 +309,7 @@ IN: parser.tests
     ] unit-test
 
     [
-        "IN: parser.tests TUPLE: class-redef-test ; SYMBOL: class-redef-test : class-redef-test ;"
+        "IN: parser.tests TUPLE: class-redef-test ; SYMBOL: class-redef-test : class-redef-test ( -- ) ;"
         <string-reader> "redefining-a-class-3" parse-stream drop
     ] [ error>> error>> error>> redefine-error? ] must-fail-with
 
@@ -338,7 +334,7 @@ IN: parser.tests
     ] [ error>> error>> error>> no-word-error? ] must-fail-with
 
     [
-        "IN: parser.tests : foo ; TUPLE: foo ;"
+        "IN: parser.tests : foo ( -- ) ; TUPLE: foo ;"
         <string-reader> "redefining-a-class-4" parse-stream drop
     ] [ error>> error>> error>> redefine-error? ] must-fail-with
 
@@ -369,7 +365,7 @@ IN: parser.tests
 
 2 [
     [ ] [
-        "IN: parser.tests TUPLE: foo ; GENERIC: foo"
+        "IN: parser.tests TUPLE: foo ; GENERIC: foo ( a -- b )"
         <string-reader> "redefining-a-class-5" parse-stream drop
     ] unit-test
 
@@ -381,14 +377,14 @@ IN: parser.tests
     [ f ] [ f "foo" "parser.tests" lookup execute ] unit-test
 
     [ ] [
-        "IN: parser.tests TUPLE: foo ; GENERIC: foo"
+        "IN: parser.tests TUPLE: foo ; GENERIC: foo ( a -- b )"
         <string-reader> "redefining-a-class-5" parse-stream drop
     ] unit-test
 
     [ f ] [ f "foo" "parser.tests" lookup execute ] unit-test
 
     [ ] [
-        "IN: parser.tests TUPLE: foo ; GENERIC: foo"
+        "IN: parser.tests TUPLE: foo ; GENERIC: foo ( a -- b )"
     <string-reader> "redefining-a-class-7" parse-stream drop
     ] unit-test
 
@@ -438,7 +434,7 @@ IN: parser.tests
     {
         "IN: parser.tests"
         "USING: math arrays ;"
-        "GENERIC: change-combination"
+        "GENERIC: change-combination ( a -- b )"
         "M: integer change-combination 1 ;"
         "M: array change-combination 2 ;"
     } "\n" join <string-reader> "change-combination-test" parse-stream drop
@@ -448,7 +444,7 @@ IN: parser.tests
     {
         "IN: parser.tests"
         "USING: math arrays ;"
-        "GENERIC# change-combination 1"
+        "GENERIC# change-combination 1 ( a -- b )"
         "M: integer change-combination 1 ;"
         "M: array change-combination 2 ;"
     } "\n" join <string-reader> "change-combination-test" parse-stream drop
@@ -467,7 +463,7 @@ IN: parser.tests
 ] unit-test
 
 [ [ ] ] [
-    "IN: parser.tests : staging-problem-test-1 1 ; : staging-problem-test-2 staging-problem-test-1 ;"
+    "IN: parser.tests : staging-problem-test-1 ( -- ) 1 ; : staging-problem-test-2 ( -- ) staging-problem-test-1 ;"
     <string-reader> "staging-problem-test" parse-stream
 ] unit-test
 
@@ -476,7 +472,7 @@ IN: parser.tests
 [ t ] [ "staging-problem-test-2" "parser.tests" lookup >boolean ] unit-test
 
 [ [ ] ] [
-    "IN: parser.tests << : staging-problem-test-1 1 ; >> : staging-problem-test-2 staging-problem-test-1 ;"
+    "IN: parser.tests << : staging-problem-test-1 ( -- ) 1 ; >> : staging-problem-test-2 ( -- ) staging-problem-test-1 ;"
     <string-reader> "staging-problem-test" parse-stream
 ] unit-test
 
@@ -487,7 +483,7 @@ IN: parser.tests
 [ "DEFER: blahy" eval ] [ error>> error>> no-current-vocab? ] must-fail-with
 
 [
-    "IN: parser.tests : blahy ; parsing FORGET: blahy" eval
+    "IN: parser.tests SYNTAX: blahy ; FORGET: blahy" eval
 ] [
     error>> staging-violation?
 ] must-fail-with
@@ -495,7 +491,7 @@ IN: parser.tests
 ! Bogus error message
 DEFER: blahy
 
-[ "IN: parser.tests USE: kernel TUPLE: blahy < tuple ; : blahy ; TUPLE: blahy < tuple ; : blahy ;" eval ]
+[ "IN: parser.tests USE: kernel TUPLE: blahy < tuple ; : blahy ( -- ) ; TUPLE: blahy < tuple ; : blahy ( -- ) ;" eval ]
 [ error>> error>> def>> \ blahy eq? ] must-fail-with
 
 [ ] [ f lexer set f file set "Hello world" note. ] unit-test
@@ -510,7 +506,7 @@ SYMBOLS: a b c ;
 
 DEFER: blah
 
-[ ] [ "IN: parser.tests GENERIC: blah" eval ] unit-test
+[ ] [ "IN: parser.tests GENERIC: blah ( -- )" eval ] unit-test
 [ ] [ "IN: parser.tests SYMBOLS: blah ;" eval ] unit-test
 
 [ f ] [ \ blah generic? ] unit-test
@@ -523,13 +519,13 @@ DEFER: blah1
 must-fail-with
 
 IN: qualified.tests.foo
-: x 1 ;
-: y 5 ;
+: x ( -- a ) 1 ;
+: y ( -- a ) 5 ;
 IN: qualified.tests.bar
-: x 2 ;
-: y 4 ;
+: x ( -- a ) 2 ;
+: y ( -- a ) 4 ;
 IN: qualified.tests.baz
-: x 3 ;
+: x ( -- a ) 3 ;
 
 QUALIFIED: qualified.tests.foo
 QUALIFIED: qualified.tests.bar
index 1f4d377b27ce599374cc7b72e2116dfa91eed77a..871f7c5321444b4d64f7420aec542fc3d790d4f1 100644 (file)
@@ -4,7 +4,7 @@ USING: arrays definitions generic assocs kernel math namespaces
 sequences strings vectors words words.symbol quotations io combinators
 sorting splitting math.parser effects continuations io.files vocabs
 io.encodings.utf8 source-files classes hashtables compiler.errors
-compiler.units accessors sets lexer vocabs.parser slots ;
+compiler.units accessors sets lexer vocabs.parser effects.parser slots ;
 IN: parser
 
 : location ( -- loc )
@@ -132,7 +132,10 @@ M: f parse-quotation \ ] parse-until >quotation ;
 : parse-definition ( -- quot )
     \ ; parse-until >quotation ;
 
-: (:) ( -- word def ) CREATE-WORD parse-definition ;
+: (:) ( -- word def effect )
+    CREATE-WORD
+    complete-effect
+    parse-definition swap ;
 
 ERROR: bad-number ;
 
index 144b417f04b9a8d209ade4eb52c8b3d47adfeb0c..f352705e85698751916d02bb1b23ed236f2acb3d 100755 (executable)
@@ -176,7 +176,7 @@ PRIVATE>
     3 swap bounds-check nip first4-unsafe ; flushable
 
 : ?nth ( n seq -- elt/f )
-    2dup bounds-check? [ nth-unsafe ] [ 2drop f ] if ; flushable
+    2dup bounds-check? [ nth-unsafe ] [ 2drop f ] if ; inline
 
 MIXIN: virtual-sequence
 GENERIC: virtual-seq ( seq -- seq' )
index 71c2bdcc900b6848cd44fbfe1e43dbbce0d0d75a..46fd325fa5174a0f9421e39004bbffe0a232e9d4 100755 (executable)
@@ -21,7 +21,7 @@ PREDICATE: writer-method < method-body "writing" word-prop ;
         object bootstrap-word >>class ;
 
 : define-typecheck ( class generic quot props -- )
-    [ dup define-simple-generic create-method ] 2dip
+    [ create-method ] 2dip
     [ [ props>> ] [ drop ] [ ] tri* update ]
     [ drop define ]
     3bi ;
@@ -36,7 +36,6 @@ PREDICATE: writer-method < method-body "writing" word-prop ;
 
 : reader-word ( name -- word )
     ">>" append "accessors" create
-    dup (( object -- value )) "declared-effect" set-word-prop
     dup t "reader" set-word-prop ;
 
 : reader-props ( slot-spec -- assoc )
@@ -46,13 +45,18 @@ PREDICATE: writer-method < method-body "writing" word-prop ;
         t "flushable" set
     ] H{ } make-assoc ;
 
+: define-reader-generic ( name -- )
+    reader-word (( object -- value )) define-simple-generic ;
+
 : define-reader ( class slot-spec -- )
-    [ name>> reader-word ] [ reader-quot ] [ reader-props ] tri
-    define-typecheck ;
+    [ nip name>> define-reader-generic ]
+    [
+        [ name>> reader-word ] [ reader-quot ] [ reader-props ] tri
+        define-typecheck
+    ] 2bi ;
 
 : writer-word ( name -- word )
     "(>>" ")" surround "accessors" create
-    dup (( value object -- )) "declared-effect" set-word-prop
     dup t "writer" set-word-prop ;
 
 ERROR: bad-slot-value value class ;
@@ -92,9 +96,14 @@ ERROR: bad-slot-value value class ;
 : writer-props ( slot-spec -- assoc )
     "writing" associate ;
 
+: define-writer-generic ( name -- )
+    writer-word (( object value -- )) define-simple-generic ;
+
 : define-writer ( class slot-spec -- )
-    [ name>> writer-word ] [ writer-quot ] [ writer-props ] tri
-    define-typecheck ;
+    [ nip name>> define-writer-generic ] [
+        [ name>> writer-word ] [ writer-quot ] [ writer-props ] tri
+        define-typecheck
+    ] 2bi ;
 
 : setter-word ( name -- word )
     ">>" prepend "accessors" create ;
@@ -134,8 +143,8 @@ ERROR: bad-slot-value value class ;
 
 : define-protocol-slot ( name -- )
     {
-        [ reader-word define-simple-generic ]
-        [ writer-word define-simple-generic ]
+        [ define-reader-generic ]
+        [ define-writer-generic ]
         [ define-setter ]
         [ define-changer ]
     } cleave ;
index 1a61845fd183d50ce42f34f25cc0a43b03ab17cb..79aeee5b554ef8b904ccd56d54889bb82ec2a659 100644 (file)
@@ -177,10 +177,10 @@ HELP: delimiter
 { $syntax ": foo ... ; delimiter" }
 { $description "Declares the most recently defined word as a delimiter. Delimiters are words which are only ever valid as the end of a nested block to be read by " { $link parse-until } ". An unpaired occurrence of a delimiter is a parse error." } ;
 
-HELP: parsing
-{ $syntax ": foo ... ; parsing" }
-{ $description "Declares the most recently defined word as a parsing word." }
-{ $examples "In the below example, the " { $snippet "world" } " word is never called, however its body references a parsing word which executes immediately:" { $example "USE: io" "IN: scratchpad" "<< : hello \"Hello parser!\" print ; parsing >>\n: world hello ;" "Hello parser!" } } ;
+HELP: SYNTAX:
+{ $syntax "SYNTAX: foo ... ;" }
+{ $description "Defines a parsing word." }
+{ $examples "In the below example, the " { $snippet "world" } " word is never called, however its body references a parsing word which executes immediately:" { $example "USE: io" "IN: scratchpad" "<< SYNTAX: HELLO \"Hello parser!\" print ; >>\n: world HELLO ;" "Hello parser!" } } ;
 
 HELP: inline
 { $syntax ": foo ... ; inline" }
@@ -508,8 +508,8 @@ HELP: P"
 HELP: (
 { $syntax "( inputs -- outputs )" }
 { $values { "inputs" "a list of tokens" } { "outputs" "a list of tokens" } }
-{ $description "Declares the stack effect of the most recently defined word, storing a new " { $link effect } " instance in the " { $snippet "\"declared-effect\"" } " word property." }
-{ $notes "All words except those only pushing literals on the stack must have a stack effect declaration. See " { $link "effect-declaration" } " for details." } ;
+{ $description "A stack effect declaration. This is treated as a comment unless it appears inside a word definition." }
+{ $see-also "effect-declaration" } ;
 
 HELP: ((
 { $syntax "(( inputs -- outputs ))" }
index d01a9ebb2c2422ed64e1c38c29d3efd288abaead..bcf9decdf38a19ffd522a3e7bc63e03acee5b80f 100644 (file)
@@ -22,58 +22,58 @@ IN: bootstrap.syntax
 : define-delimiter ( name -- )
     "syntax" lookup t "delimiter" set-word-prop ;
 
-: define-syntax ( name quot -- )
-    [ dup "syntax" lookup [ dup ] [ no-word-error ] ?if ] dip
-    define make-parsing ;
+: define-core-syntax ( name quot -- )
+    [ dup "syntax" lookup [ ] [ no-word-error ] ?if ] dip
+    define-syntax ;
 
 [
     { "]" "}" ";" ">>" } [ define-delimiter ] each
 
     "PRIMITIVE:" [
         "Primitive definition is not supported" throw
-    ] define-syntax
+    ] define-core-syntax
 
     "CS{" [
         "Call stack literals are not supported" throw
-    ] define-syntax
+    ] define-core-syntax
 
-    "!" [ lexer get next-line ] define-syntax
+    "!" [ lexer get next-line ] define-core-syntax
 
-    "#!" [ POSTPONE: ! ] define-syntax
+    "#!" [ POSTPONE: ! ] define-core-syntax
 
-    "IN:" [ scan set-in ] define-syntax
+    "IN:" [ scan set-in ] define-core-syntax
 
-    "PRIVATE>" [ in get ".private" ?tail drop set-in ] define-syntax
+    "PRIVATE>" [ in get ".private" ?tail drop set-in ] define-core-syntax
 
     "<PRIVATE" [
         POSTPONE: PRIVATE> in get ".private" append set-in
-    ] define-syntax
+    ] define-core-syntax
 
-    "USE:" [ scan use+ ] define-syntax
+    "USE:" [ scan use+ ] define-core-syntax
 
-    "USING:" [ ";" parse-tokens add-use ] define-syntax
+    "USING:" [ ";" parse-tokens add-use ] define-core-syntax
 
-    "QUALIFIED:" [ scan dup add-qualified ] define-syntax
+    "QUALIFIED:" [ scan dup add-qualified ] define-core-syntax
 
-    "QUALIFIED-WITH:" [ scan scan add-qualified ] define-syntax
+    "QUALIFIED-WITH:" [ scan scan add-qualified ] define-core-syntax
 
     "FROM:" [
         scan "=>" expect ";" parse-tokens swap add-words-from
-    ] define-syntax
+    ] define-core-syntax
 
     "EXCLUDE:" [
         scan "=>" expect ";" parse-tokens swap add-words-excluding
-    ] define-syntax
+    ] define-core-syntax
 
     "RENAME:" [
         scan scan "=>" expect scan add-renamed-word
-    ] define-syntax
+    ] define-core-syntax
 
-    "HEX:" [ 16 parse-base ] define-syntax
-    "OCT:" [ 8 parse-base ] define-syntax
-    "BIN:" [ 2 parse-base ] define-syntax
+    "HEX:" [ 16 parse-base ] define-core-syntax
+    "OCT:" [ 8 parse-base ] define-core-syntax
+    "BIN:" [ 2 parse-base ] define-core-syntax
 
-    "f" [ f parsed ] define-syntax
+    "f" [ f parsed ] define-core-syntax
     "t" "syntax" lookup define-singleton-class
 
     "CHAR:" [
@@ -82,157 +82,156 @@ IN: bootstrap.syntax
             { [ "\\" ?head ] [ next-escape >string "" assert= ] }
             [ name>char-hook get call( name -- char ) ]
         } cond parsed
-    ] define-syntax
+    ] define-core-syntax
 
-    "\"" [ parse-string parsed ] define-syntax
+    "\"" [ parse-string parsed ] define-core-syntax
 
     "SBUF\"" [
         lexer get skip-blank parse-string >sbuf parsed
-    ] define-syntax
+    ] define-core-syntax
 
     "P\"" [
         lexer get skip-blank parse-string <pathname> parsed
-    ] define-syntax
-
-    "[" [ parse-quotation parsed ] define-syntax
-    "{" [ \ } [ >array ] parse-literal ] define-syntax
-    "V{" [ \ } [ >vector ] parse-literal ] define-syntax
-    "B{" [ \ } [ >byte-array ] parse-literal ] define-syntax
-    "H{" [ \ } [ >hashtable ] parse-literal ] define-syntax
-    "T{" [ parse-tuple-literal parsed ] define-syntax
-    "W{" [ \ } [ first <wrapper> ] parse-literal ] define-syntax
-
-    "POSTPONE:" [ scan-word parsed ] define-syntax
-    "\\" [ scan-word <wrapper> parsed ] define-syntax
-    "inline" [ word make-inline ] define-syntax
-    "recursive" [ word make-recursive ] define-syntax
-    "foldable" [ word make-foldable ] define-syntax
-    "flushable" [ word make-flushable ] define-syntax
-    "delimiter" [ word t "delimiter" set-word-prop ] define-syntax
-    "parsing" [ word make-parsing ] define-syntax
+    ] define-core-syntax
+
+    "[" [ parse-quotation parsed ] define-core-syntax
+    "{" [ \ } [ >array ] parse-literal ] define-core-syntax
+    "V{" [ \ } [ >vector ] parse-literal ] define-core-syntax
+    "B{" [ \ } [ >byte-array ] parse-literal ] define-core-syntax
+    "H{" [ \ } [ >hashtable ] parse-literal ] define-core-syntax
+    "T{" [ parse-tuple-literal parsed ] define-core-syntax
+    "W{" [ \ } [ first <wrapper> ] parse-literal ] define-core-syntax
+
+    "POSTPONE:" [ scan-word parsed ] define-core-syntax
+    "\\" [ scan-word <wrapper> parsed ] define-core-syntax
+    "inline" [ word make-inline ] define-core-syntax
+    "recursive" [ word make-recursive ] define-core-syntax
+    "foldable" [ word make-foldable ] define-core-syntax
+    "flushable" [ word make-flushable ] define-core-syntax
+    "delimiter" [ word t "delimiter" set-word-prop ] define-core-syntax
+
+    "SYNTAX:" [
+        CREATE-WORD parse-definition define-syntax
+    ] define-core-syntax
 
     "SYMBOL:" [
         CREATE-WORD define-symbol
-    ] define-syntax
+    ] define-core-syntax
 
     "SYMBOLS:" [
         ";" parse-tokens
         [ create-in dup reset-generic define-symbol ] each
-    ] define-syntax
+    ] define-core-syntax
 
     "SINGLETONS:" [
         ";" parse-tokens
         [ create-class-in define-singleton-class ] each
-    ] define-syntax
+    ] define-core-syntax
+
+    "DEFER:" [
+        scan current-vocab create
+        [ fake-definition ] [ set-word ] [ [ undefined ] define ] tri
+    ] define-core-syntax
     
     "ALIAS:" [
         CREATE-WORD scan-word define-alias
-    ] define-syntax
+    ] define-core-syntax
 
     "CONSTANT:" [
         CREATE scan-object define-constant
-    ] define-syntax
-
-    "DEFER:" [
-        scan current-vocab create
-        [ fake-definition ] [ set-word ] [ [ undefined ] define ] tri
-    ] define-syntax
+    ] define-core-syntax
 
     ":" [
-        (:) define
-    ] define-syntax
+        (:) define-declared
+    ] define-core-syntax
 
     "GENERIC:" [
-        CREATE-GENERIC define-simple-generic
-    ] define-syntax
+        [ simple-combination ] (GENERIC:)
+    ] define-core-syntax
 
     "GENERIC#" [
-        CREATE-GENERIC
-        scan-word <standard-combination> define-generic
-    ] define-syntax
+        [ scan-word <standard-combination> ] (GENERIC:)
+    ] define-core-syntax
 
     "MATH:" [
-        CREATE-GENERIC
-        T{ math-combination } define-generic
-    ] define-syntax
+        [ math-combination ] (GENERIC:)
+    ] define-core-syntax
 
     "HOOK:" [
-        CREATE-GENERIC scan-word
-        <hook-combination> define-generic
-    ] define-syntax
+        [ scan-word <hook-combination> ] (GENERIC:)
+    ] define-core-syntax
 
     "M:" [
         (M:) define
-    ] define-syntax
+    ] define-core-syntax
 
     "UNION:" [
         CREATE-CLASS parse-definition define-union-class
-    ] define-syntax
+    ] define-core-syntax
 
     "INTERSECTION:" [
         CREATE-CLASS parse-definition define-intersection-class
-    ] define-syntax
+    ] define-core-syntax
 
     "MIXIN:" [
         CREATE-CLASS define-mixin-class
-    ] define-syntax
+    ] define-core-syntax
 
     "INSTANCE:" [
         location [
             scan-word scan-word 2dup add-mixin-instance
             <mixin-instance>
         ] dip remember-definition
-    ] define-syntax
+    ] define-core-syntax
 
     "PREDICATE:" [
         CREATE-CLASS
         scan "<" assert=
         scan-word
         parse-definition define-predicate-class
-    ] define-syntax
+    ] define-core-syntax
 
     "SINGLETON:" [
         CREATE-CLASS define-singleton-class
-    ] define-syntax
+    ] define-core-syntax
 
     "TUPLE:" [
         parse-tuple-definition define-tuple-class
-    ] define-syntax
+    ] define-core-syntax
 
     "SLOT:" [
         scan define-protocol-slot
-    ] define-syntax
+    ] define-core-syntax
 
     "C:" [
         CREATE-WORD scan-word define-boa-word
-    ] define-syntax
+    ] define-core-syntax
 
     "ERROR:" [
         parse-tuple-definition
         pick save-location
         define-error-class
-    ] define-syntax
+    ] define-core-syntax
 
     "FORGET:" [
         scan-object forget
-    ] define-syntax
+    ] define-core-syntax
 
     "(" [
-        ")" parse-effect
-        word dup [ set-stack-effect ] [ 2drop ] if
-    ] define-syntax
+        ")" parse-effect drop
+    ] define-core-syntax
 
     "((" [
         "))" parse-effect parsed
-    ] define-syntax
+    ] define-core-syntax
 
-    "MAIN:" [ scan-word in get vocab (>>main) ] define-syntax
+    "MAIN:" [ scan-word in get vocab (>>main) ] define-core-syntax
 
     "<<" [
         [
             \ >> parse-until >quotation
         ] with-nested-compilation-unit call( -- )
-    ] define-syntax
+    ] define-core-syntax
 
     "call-next-method" [
         current-method get [
@@ -241,13 +240,13 @@ IN: bootstrap.syntax
         ] [
             not-in-a-method-error
         ] if*
-    ] define-syntax
+    ] define-core-syntax
     
     "initial:" "syntax" lookup define-symbol
     
     "read-only" "syntax" lookup define-symbol
 
-    "call(" [ \ call-effect parse-call( ] define-syntax
+    "call(" [ \ call-effect parse-call( ] define-core-syntax
 
-    "execute(" [ \ execute-effect parse-call( ] define-syntax
+    "execute(" [ \ execute-effect parse-call( ] define-core-syntax
 ] with-compilation-unit
index 4241999bcd221c89f1faf620823575d85d187aa9..87531caee4c5107c65e24e6020960e404127dd01 100644 (file)
@@ -132,7 +132,7 @@ IN: vocabs.loader.tests
     "vocabs.loader.test.d" vocab source-loaded?>>
 ] unit-test
 
-: forget-junk
+: forget-junk ( -- )
     [
         { "2" "a" "b" "d" "e" "f" }
         [
index e4f1c02a3a0ef767f3fad96e2d0ac49d7b2c82ab..a07695f1c3691009144180636a32203b35715181 100644 (file)
@@ -1,3 +1,3 @@
 IN: vocabs.loader.test.d
 
-: foo iterate-next ;
\ No newline at end of file
+: foo ( -- ) iterate-next ;
\ No newline at end of file
index 35feae34bbddfc73525836ac15bcf7a9c2c0d63f..e8783c0dbe1655fcadf5d7a141659fbd8ee0a87b 100644 (file)
@@ -1,4 +1,4 @@
-! Copyright (C) 2007, 2008 Daniel Ehrenberg, Bruno Deferrari,
+! Copyright (C) 2007, 2009 Daniel Ehrenberg, Bruno Deferrari,
 ! Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: assocs hashtables kernel namespaces sequences
@@ -56,4 +56,4 @@ SYMBOL: in
     dup string? [ "Vocabulary name must be a string" throw ] unless ;
 
 : set-in ( name -- )
-    check-vocab-string dup in set create-vocab (use+) ;
+    check-vocab-string dup in set create-vocab (use+) ;
\ No newline at end of file
index 9c32a8094e8340dddc53261e5cb46a5e81f0edf3..63b58bf9d519201d07f6f506224f15c955592271 100644 (file)
@@ -57,16 +57,12 @@ $nl
 } ;
 
 ARTICLE: "declarations" "Declarations"
-"Declarations give special behavior to a word. Declarations are parsing words that set a word property in the most recently defined word."
-$nl
-"The first declaration specifies the time when a word runs. It affects both the non-optimizing and optimizing compilers:"
-{ $subsection POSTPONE: parsing }
-"The remaining declarations only affect definitions compiled with the optimizing compiler. They do not change evaluation semantics of a word, but instead declare that the word follows a certain contract, and thus may be compiled differently."
-{ $warning "If a generic word is declared " { $link POSTPONE: foldable } " or " { $link POSTPONE: flushable } ", all methods must satisfy the contract, otherwise unpredicable behavior will occur." }
+"Declarations are parsing words that set a word property in the most recently defined word. Declarations only affect definitions compiled with the optimizing compiler. They do not change evaluation semantics of a word, but instead declare that the word follows a certain contract, and thus may be compiled differently."
 { $subsection POSTPONE: inline }
 { $subsection POSTPONE: foldable }
 { $subsection POSTPONE: flushable }
 { $subsection POSTPONE: recursive }
+{ $warning "If a generic word is declared " { $link POSTPONE: foldable } " or " { $link POSTPONE: flushable } ", all methods must satisfy the contract, otherwise unpredicable behavior will occur." }
 "Stack effect declarations are documented in " { $link "effect-declaration" } "." ;
 
 ARTICLE: "word-definition" "Defining words"
@@ -279,7 +275,7 @@ HELP: bootstrap-word
 
 HELP: parsing-word? ( obj -- ? )
 { $values { "obj" object } { "?" "a boolean" } }
-{ $description "Tests if an object is a parsing word declared by " { $link POSTPONE: parsing } "." }
+{ $description "Tests if an object is a parsing word declared by " { $link POSTPONE: SYNTAX: } "." }
 { $notes "Outputs " { $link f } " if the object is not a word." } ;
 
 HELP: define-declared
index 52a20ba48a476f40df0ff17c280e56b7124f5c84..305541119b692d8e8845f14020b261ec69cd791d 100755 (executable)
@@ -50,8 +50,8 @@ SYMBOL: a-symbol
 
 ! See if redefining a generic as a colon def clears some
 ! word props.
-GENERIC: testing
-"IN: words.tests : testing ;" eval
+GENERIC: testing ( a -- b )
+"IN: words.tests : testing ( -- ) ;" eval
 
 [ f ] [ \ testing generic? ] unit-test
 
@@ -106,7 +106,7 @@ DEFER: calls-a-gensym
 
 ! regression
 GENERIC: freakish ( x -- y )
-: bar freakish ;
+: bar ( x -- y ) freakish ;
 M: array freakish ;
 [ t ] [ \ bar \ freakish usage member? ] unit-test
 
@@ -116,7 +116,7 @@ DEFER: x
 [ ] [ "no-loc" "words.tests" create drop ] unit-test
 [ f ] [ "no-loc" "words.tests" lookup where ] unit-test
 
-[ ] [ "IN: words.tests : no-loc-2 ;" eval ] unit-test
+[ ] [ "IN: words.tests : no-loc-2 ( -- ) ;" eval ] unit-test
 [ f ] [ "no-loc-2" "words.tests" lookup where ] unit-test
 
 [ ] [ "IN: words.tests : test-last ( -- ) ;" eval ] unit-test
@@ -146,11 +146,11 @@ SYMBOL: quot-uses-b
     [ forget ] with-compilation-unit
 ] when*
 
-[ "IN: words.tests : undef-test ; << undef-test >>" eval ]
+[ "IN: words.tests : undef-test ( -- ) ; << undef-test >>" eval ]
 [ error>> undefined? ] must-fail-with
 
 [ ] [
-    "IN: words.tests GENERIC: symbol-generic" eval
+    "IN: words.tests GENERIC: symbol-generic ( -- )" eval
 ] unit-test
 
 [ ] [
@@ -161,7 +161,7 @@ SYMBOL: quot-uses-b
 [ f ] [ "symbol-generic" "words.tests" lookup generic? ] unit-test
 
 [ ] [
-    "IN: words.tests GENERIC: symbol-generic" <string-reader>
+    "IN: words.tests GENERIC: symbol-generic ( a -- b )" <string-reader>
     "symbol-generic-test" parse-stream drop
 ] unit-test
 
@@ -174,14 +174,14 @@ SYMBOL: quot-uses-b
 [ f ] [ "symbol-generic" "words.tests" lookup generic? ] unit-test
 
 ! Regressions
-[ ] [ "IN: words.tests : decl-forget-test ; foldable" eval ] unit-test
+[ ] [ "IN: words.tests : decl-forget-test ( -- ) ; foldable" eval ] unit-test
 [ t ] [ "decl-forget-test" "words.tests" lookup "foldable" word-prop ] unit-test
-[ ] [ "IN: words.tests : decl-forget-test ;" eval ] unit-test
+[ ] [ "IN: words.tests : decl-forget-test ( -- ) ;" eval ] unit-test
 [ f ] [ "decl-forget-test" "words.tests" lookup "foldable" word-prop ] unit-test
 
-[ ] [ "IN: words.tests : decl-forget-test ; flushable" eval ] unit-test
+[ ] [ "IN: words.tests : decl-forget-test ( -- ) ; flushable" eval ] unit-test
 [ t ] [ "decl-forget-test" "words.tests" lookup "flushable" word-prop ] unit-test
-[ ] [ "IN: words.tests : decl-forget-test ;" eval ] unit-test
+[ ] [ "IN: words.tests : decl-forget-test ( -- ) ;" eval ] unit-test
 [ f ] [ "decl-forget-test" "words.tests" lookup "flushable" word-prop ] unit-test
 
 [ { } ]
index c4a94f0a4cfae8ea4d50e91759141a7ceeeb6618..cfdcd4517f2e1e49110fa3197de2d61d262dbcc2 100755 (executable)
@@ -164,13 +164,14 @@ CONSTANT: reset-on-redefine { "inferred-effect" "cannot-infer" }
 : set-stack-effect ( effect word -- )
     2dup "declared-effect" word-prop = [ 2drop ] [
         swap
+        [ drop changed-effect ]
         [ "declared-effect" set-word-prop ]
-        [ drop dup primitive? [ dup redefined ] unless drop ] 2bi
+        [ drop dup primitive? [ drop ] [ redefined ] if ]
+        2tri
     ] if ;
 
 : define-declared ( word def effect -- )
-    pick swap "declared-effect" set-word-prop
-    define ;
+    [ nip swap set-stack-effect ] [ drop define ] 3bi ;
 
 : make-inline ( word -- )
     t "inline" set-word-prop ;
@@ -193,7 +194,7 @@ M: word reset-word
     {
         "unannotated-def" "parsing" "inline" "recursive"
         "foldable" "flushable" "reading" "writing" "reader"
-        "writer" "declared-effect" "delimiter"
+        "writer" "delimiter"
     } reset-props ;
 
 GENERIC: subwords ( word -- seq )
@@ -232,7 +233,10 @@ ERROR: bad-create name vocab ;
 
 PREDICATE: parsing-word < word "parsing" word-prop ;
 
-: make-parsing ( word -- ) t "parsing" set-word-prop ;
+M: parsing-word definer drop \ SYNTAX: \ ; ;
+
+: define-syntax ( word quot -- )
+    [ drop ] [ define ] 2bi t "parsing" set-word-prop ;
 
 : delimiter? ( obj -- ? )
     dup word? [ "delimiter" word-prop ] [ drop f ] if ;
@@ -255,6 +259,4 @@ M: word hashcode*
 
 M: word literalize <wrapper> ;
 
-: ?word-name ( word -- name ) dup word? [ name>> ] when ;
-
 : xref-words ( -- ) all-words [ xref ] each ;
index ee37b33fbff41b7765b82ea2c1009089458d2e55..aae0b40d381b521ec920dd6df43dcf852a1dd145 100755 (executable)
@@ -172,7 +172,7 @@ VAR: present-space
         swap call space-ensure-solids \r
     >present-space \r
     update-model-projections \r
-    update-observer-projections ;\r
+    update-observer-projections ; inline\r
 \r
 : rotation-4D ( m -- ) \r
     '[ _ [ [ middle-of-space dup vneg ] keep \r
index ec77501b8ffb067dbdfac59d003fe4d654d996ed..4042528eba3b5f5201bebdb69cc6f7082ab0b9b1 100755 (executable)
@@ -60,7 +60,7 @@ t to: remove-hidden-solids?
 : dimension ( array -- x )      length 1- ; inline \r
 : last ( seq -- x )           [ dimension ] [ nth ] bi ; inline\r
 : change-last ( seq quot -- ) \r
-    [ [ dimension ] keep ] dip change-nth  ; \r
+    [ [ dimension ] keep ] dip change-nth  ; inline\r
 \r
 ! -------------------------------------------------------------\r
 ! light\r
@@ -445,7 +445,7 @@ TUPLE: space name dimension solids ambient-color lights ;
 \r
 : space-apply ( space m quot -- space ) \r
         curry [ map ] curry [ dup solids>> ] dip\r
-        [ call ] [ drop ] recover drop ;\r
+        [ call ] [ 2drop ] recover drop ; inline\r
 : space-transform ( space m -- space ) \r
     [ solid-transform ] space-apply ;\r
 : space-translate ( space v -- space ) \r
index be16150c2e003931ca520ce4d337264709188d10..a141489a0fd7b1d919d13dfadb709d4260260c5d 100644 (file)
@@ -7,7 +7,7 @@ IN: advice.tests
 [
     [ ad-do-it ] must-fail
     
-    : foo "foo" ; 
+    : foo ( -- str ) "foo" ; 
     \ foo make-advised
  
     { "bar" "foo" } [
index be9835c5b9bec8d819800750356089defc51dcae..9c0963469e42bbeabf6eb87a0102a0a50019542b 100644 (file)
@@ -56,8 +56,8 @@ PRIVATE>
 : unadvise ( word --  )
     [ reset ] [ { before after around advised } [ f swap set-word-prop ] with each ] bi ;
 
-: ADVISE: ! word adname location => word adname quot loc
-    scan-word scan scan-word parse-definition swap [ spin ] dip advise ; parsing
+SYNTAX: ADVISE: ! word adname location => word adname quot loc
+    scan-word scan scan-word parse-definition swap [ spin ] dip advise ;
     
-: UNADVISE:    
-    scan-word parsed \ unadvise parsed ; parsing
\ No newline at end of file
+SYNTAX: UNADVISE:    
+    scan-word parsed \ unadvise parsed ;
\ No newline at end of file
index b3eccad6a32d4d33c65ddd4b0912318811224871..387c73abe4807e0f2eb4ede82d245b91f4bf4ecf 100644 (file)
@@ -24,7 +24,7 @@ NAMEs. DEFINES ${NAME}s.
 WHERE
 
 : (NAME) ( str -- ) drop ; inline
-: !NAME (parse-annotation) \ (NAME) parsed ; parsing
+SYNTAX: !NAME (parse-annotation) \ (NAME) parsed ;
 
 : NAMEs ( -- usages )
     \ (NAME) (non-annotation-usage) ;
index 64d2bdbb1f8fd9b897df4786cb57cb5515c050e3..b86e11e239d69757fca872e90c4579f89c431b6b 100644 (file)
@@ -48,6 +48,6 @@ IN: benchmark.spectral-norm
 HINTS: spectral-norm fixnum ;
 
 : spectral-norm-main ( -- )
-    5500 spectral-norm . ;
+    2000 spectral-norm . ;
 
 MAIN: spectral-norm-main
index 38160de0e9cf7780711dcf145c645ba7cf34d48b..393c9324825f7ee66c23110f52aee7ddca4a65fd 100644 (file)
@@ -6,7 +6,7 @@
 
 USING: arrays kernel sequences io io.files io.backend
 io.encodings.ascii math.parser vocabs definitions
-namespaces make words sorting ;
+namespaces make words sorting present ;
 IN: ctags
 
 : ctag-word ( ctag -- word )
@@ -20,7 +20,7 @@ IN: ctags
 
 : ctag ( seq -- str )
   [
-    dup ctag-word ?word-name %
+    dup ctag-word present %
     "\t" %
     dup ctag-path normalize-path %
     "\t" %
index 9fe63e914e6bf65f6c4a013b63f02a34c746eab1..40c0b791cfd43ca4a72b200e2bac21c530b46115 100644 (file)
@@ -5,7 +5,7 @@
 ! Alfredo Beaumont <alfredo.beaumont@gmail.com>
 USING: kernel sequences sorting assocs words prettyprint ctags
 io.encodings.ascii io.files math math.parser namespaces make
-strings shuffle io.backend arrays ;
+strings shuffle io.backend arrays present ;
 IN: ctags.etags
 
 : etag-at ( key hash -- vector )
@@ -36,7 +36,7 @@ IN: ctags.etags
 
 : etag ( lines seq -- str )
   [
-    dup first ?word-name %
+    dup first present %
     1 HEX: 7f <string> %
     second dup number>string %
     1 CHAR: , <string> %
index dd0042455cc3d66e6ce6fefc0a94ca7a2afc574e..ba3438e37d41751b3d3ad5b1bcadb3bd53e770ee 100755 (executable)
@@ -1,45 +1,45 @@
-USING: words kernel sequences locals locals.parser\r
-locals.definitions accessors parser namespaces continuations\r
-summary definitions generalizations arrays ;\r
-IN: descriptive\r
-\r
-ERROR: descriptive-error args underlying word ;\r
-\r
-M: descriptive-error summary\r
-    word>> "The " swap name>> " word encountered an error."\r
-    3append ;\r
-\r
-<PRIVATE\r
-: rethrower ( word inputs -- quot )\r
-    [ length ] keep [ [ narray ] dip swap 2array flip ] 2curry\r
-    [ 2 ndip descriptive-error ] 2curry ;\r
-\r
-: [descriptive] ( word def -- newdef )\r
-    swap dup "declared-effect" word-prop in>> rethrower\r
-    [ recover ] 2curry ;\r
-PRIVATE>\r
-\r
-: define-descriptive ( word def -- )\r
-    [ "descriptive-definition" set-word-prop ]\r
-    [ dupd [descriptive] define ] 2bi ;\r
-\r
-: DESCRIPTIVE:\r
-    (:) define-descriptive ; parsing\r
-\r
-PREDICATE: descriptive < word\r
-    "descriptive-definition" word-prop ;\r
-\r
-M: descriptive definer drop \ DESCRIPTIVE: \ ; ;\r
-\r
-M: descriptive definition\r
-    "descriptive-definition" word-prop ;\r
-\r
-: DESCRIPTIVE::\r
-    (::) define-descriptive ; parsing\r
-\r
-INTERSECTION: descriptive-lambda descriptive lambda-word ;\r
-\r
-M: descriptive-lambda definer drop \ DESCRIPTIVE:: \ ; ;\r
-\r
-M: descriptive-lambda definition\r
-    "lambda" word-prop body>> ;\r
+USING: words kernel sequences locals locals.parser
+locals.definitions accessors parser namespaces continuations
+summary definitions generalizations arrays ;
+IN: descriptive
+
+ERROR: descriptive-error args underlying word ;
+
+M: descriptive-error summary
+    word>> "The " swap name>> " word encountered an error."
+    3append ;
+
+<PRIVATE
+
+: rethrower ( word inputs -- quot )
+    [ length ] keep [ [ narray ] dip swap 2array flip ] 2curry
+    [ 2 ndip descriptive-error ] 2curry ;
+
+: [descriptive] ( word def effect -- newdef )
+    swapd in>> rethrower [ recover ] 2curry ;
+
+PRIVATE>
+
+: define-descriptive ( word def effect -- )
+    [ drop "descriptive-definition" set-word-prop ]
+    [ [ [ dup ] 2dip [descriptive] ] keep define-declared ]
+    3bi ;
+
+SYNTAX: DESCRIPTIVE: (:) define-descriptive ;
+
+PREDICATE: descriptive < word
+    "descriptive-definition" word-prop ;
+
+M: descriptive definer drop \ DESCRIPTIVE: \ ; ;
+
+M: descriptive definition
+    "descriptive-definition" word-prop ;
+
+SYNTAX: DESCRIPTIVE:: (::) define-descriptive ;
+
+INTERSECTION: descriptive-lambda descriptive lambda-word ;
+
+M: descriptive-lambda definer drop \ DESCRIPTIVE:: \ ; ;
+
+M: descriptive-lambda definition
+    "lambda" word-prop body>> ;
index 7e8e2dfcc97c2ecfa4342a3b0142cdea5c4cb87f..5e3d5d67cb6eb913c7469f60106154690258e84c 100644 (file)
@@ -31,8 +31,6 @@ IN: infix.tests
 [ f ] [ 2 \ gcd check-word ] unit-test ! multiple return values
 [ f ] [ 1 \ drop check-word ] unit-test ! no return value
 [ f ] [ 1 \ lcm check-word ] unit-test ! takes 2 args
-: no-stack-effect-declared + ;
-[ 0 \ no-stack-effect-declared check-word ] must-fail
 
 : qux ( -- x ) 2 ;
 [ t ] [ 0 \ qux check-word ] unit-test
index 87080683b2c4e773ca27b2dff05531f88656a7d6..ed268e558daaee26b47325b1ef03b13c6672861b 100644 (file)
@@ -81,8 +81,8 @@ M: ast-function infix-codegen
     infix-codegen prepare-operand ;
 PRIVATE>
 
-: [infix
-    "infix]" [infix-parse parsed \ call parsed ; parsing
+SYNTAX: [infix
+    "infix]" [infix-parse parsed \ call parsed ;
 
 <PRIVATE
 : parse-infix-locals ( assoc end -- quot )
@@ -93,6 +93,6 @@ PRIVATE>
     ] with-scope ;
 PRIVATE>
 
-: [infix|
+SYNTAX: [infix|
     "|" parse-bindings "infix]" parse-infix-locals <let>
-    ?rewrite-closures over push-all ; parsing
+    ?rewrite-closures over push-all ;
index e2ca8816d9822a3ccb094aa50386cffecc721d18..70035f18546769168ee95181ffa24f5c9775ac44 100644 (file)
@@ -9,6 +9,6 @@ IN: lint.tests
 : lint2 ( n -- n' ) 1 + ; ! 1+
 [ { [ 1 + ] } ] [ \ lint2 lint ] unit-test
 
-: lint3 dup -rot ; ! tuck
+: lint3 ( a b -- b a b ) dup -rot ; ! tuck
 
 [ { { lint3 { [ dup -rot ] } } } ] [ \ lint3 lint-word ] unit-test
index 6bff666f072c0672a19e6810ca644adc4e288989..e55d78ab6ef183781192d04f69da15f90b4ded77 100644 (file)
@@ -2,5 +2,5 @@
 USING: accessors continuations kernel parser words quotations vectors ;
 IN: literals
 
-: $ scan-word [ def>> call ] curry with-datastack >vector ; parsing
-: $[ parse-quotation with-datastack >vector ; parsing
+SYNTAX: $ scan-word [ def>> call ] curry with-datastack >vector ;
+SYNTAX: $[ parse-quotation with-datastack >vector ;
index 1999c76d83545fb2ab07f7576ccdb879ade1b643..04c4a09f6186754ea0a142b056ab9df8e3adf03a 100644 (file)
@@ -67,7 +67,7 @@ IN: mason.child
         try-process
     ] with-directory ;
 
-: return-with ( obj -- ) return-continuation get continue-with ;
+: return-with ( obj -- ) return-continuation get continue-with ;
 
 : build-clean? ( -- ? )
     {
index 1b2697a5d1cba3ade471428c3318b4f24058e877..52e1608885f6e3901de4250523d8fbc2aa4ecddc 100644 (file)
@@ -16,7 +16,7 @@ IN: mason.report
     "git id: " write "git-id" eval-file print nl ;
 
 : with-report ( quot -- )
-    [ "report" utf8 ] dip '[ common-report @ ] with-file-writer ;
+    [ "report" utf8 ] dip '[ common-report @ ] with-file-writer ; inline
 
 : compile-failed-report ( error -- )
     [
index 5b537c2621ba5777998440f42d7b7814cfc15609..1c11162a68370c0f7b0f28e4e4cfcf60f845bcce 100644 (file)
@@ -2,8 +2,7 @@ USING: kernel math math.functions tools.test math.analysis
 math.constants ;
 IN: math.analysis.tests
 
-: eps
-    .00000001 ;
+CONSTANT: eps .00000001
 
 [ t ] [ -9000000000000000000000000000000000000000000 gamma 1/0. = ] unit-test
 [ t ] [ -1.5 gamma 2.363271801207344 eps ~ ] unit-test
index 02b0608ed817251e1632abbd93cb8fdd26b4056a..1dadfd18c83c65182a8a7ce9c1b100a4732b3ce1 100644 (file)
@@ -5,6 +5,6 @@ USING: kernel parser words effects accessors sequences
     
 IN: math.derivatives.syntax
 
-: DERIVATIVE: scan-object dup stack-effect in>> length [1,b] 
+SYNTAX: DERIVATIVE: scan-object dup stack-effect in>> length [1,b] 
     [ drop scan-object ] map 
-    "derivative" set-word-prop ; parsing
\ No newline at end of file
+    "derivative" set-word-prop ;
\ No newline at end of file
index ae1801a8b590188670553356c6196878ac8aa4e9..5d243118981d822fd95050a110c66bcf6f61484f 100644 (file)
@@ -3,5 +3,5 @@
 USING: kernel generic generic.parser words fry ;
 IN: method-chains
 
-: AFTER: (M:) dupd '[ [ _ (call-next-method) ] _ bi ] define ; parsing
-: BEFORE: (M:) over '[ _ [ _ (call-next-method) ] bi ] define ; parsing
+SYNTAX: AFTER: (M:) dupd '[ [ _ (call-next-method) ] _ bi ] define ;
+SYNTAX: BEFORE: (M:) over '[ _ [ _ (call-next-method) ] bi ] define ;
index 1b9dee74b7ec6e9d7d6c513e02888bbaaf29304d..994d2143355c5925e2c583b855625ac325215d14 100644 (file)
@@ -30,5 +30,4 @@ ERROR: not-an-integer x ;
     ] keep length
     10 swap ^ / + swap [ neg ] when ;
 
-: DECIMAL:
-    scan parse-decimal parsed ; parsing
+SYNTAX: DECIMAL: scan parse-decimal parsed ;
index 7c5d5fb431c1d01414efeb024af994ca401e9f63..ec069a4894cb7b51b1d2a2366721e12ad7d93e1f 100755 (executable)
@@ -224,8 +224,7 @@ M: no-method error.
     ] if ;
 
 ! Syntax
-: GENERIC:
-    CREATE define-generic ; parsing
+SYNTAX: GENERIC: CREATE define-generic ;
 
 : parse-method ( -- quot classes generic )
     parse-definition [ 2 tail ] [ second ] [ first ] tri ;
@@ -238,13 +237,13 @@ M: no-method error.
 
 : (METHOD:) ( -- method def ) CREATE-METHOD parse-definition ;
 
-: METHOD: (METHOD:) define ; parsing
+SYNTAX: METHOD: (METHOD:) define ;
 
 ! For compatibility
-: M:
+SYNTAX: M:
     scan-word 1array scan-word create-method-in
     parse-definition
-    define ; parsing
+    define ;
 
 ! Definition protocol. We qualify core generics here
 QUALIFIED: syntax
index 991551c00959915cd37bd6c7dcda4167d7231e94..91982de95cc33e5eb2da99079171e09dd7b4a9fa 100644 (file)
@@ -4,11 +4,11 @@ kernel strings ;
 
 [ { POSTPONE: f integer } ] [ { f integer } canonicalize-specializer-0 ] unit-test
 
-: setup-canon-test
+: setup-canon-test ( -- )
     0 args set
     V{ } clone hooks set ;
 
-: canon-test-1
+: canon-test-1 ( -- seq )
     { integer { cpu x86 } sequence } canonicalize-specializer-1 ;
 
 [ { { -2 integer } { -1 sequence } { cpu x86 } } ] [
@@ -36,12 +36,12 @@ kernel strings ;
     ] with-scope
 ] unit-test
 
-: example-1
+CONSTANT: example-1
     {
         { { { cpu x86 } { os linux } } "a" }
         { { { cpu ppc } } "b" }
         { { string { os windows } } "c" }
-    } ;
+    }
 
 [
     {
index f4bd0a00b224bcb973b949e23b0c2e9c0caedb1e..b6d732643fb8a5d2a587d8476e20633a8248bf9d 100644 (file)
@@ -1,7 +1,7 @@
 IN: multi-methods.tests
 USING: math strings sequences tools.test ;
 
-GENERIC: legacy-test
+GENERIC: legacy-test ( a -- b )
 
 M: integer legacy-test sq ;
 M: string legacy-test " hey" append ;
index d48d67cfd40c6ef9239ca38cb408d6d6ed57672c..90d2e0e34c80d6782552400b2a36d6ba548a26cc 100644 (file)
@@ -9,39 +9,50 @@ CONSULT: assoc-protocol lex-hash hash>> ;
 : pos-or-0 ( neg? -- pos/0 ) dup 0 < [ drop 0 ] when ;
 
 :: prepare-pos ( v i -- c l )
- [let | n [ i v head-slice ] |
-      v CHAR: \n n last-index -1 or 1+ -
-      n [ CHAR: \n = ] count 1+ ] ;
+    [let | n [ i v head-slice ] |
+           v CHAR: \n n last-index -1 or 1+ -
+           n [ CHAR: \n = ] count 1+
+    ] ;
       
-: store-pos ( v a -- ) input swap at prepare-pos
-   lexer get [ (>>line) ] keep (>>column) ;
+: store-pos ( v a -- )
+    input swap at prepare-pos
+    lexer get [ (>>line) ] keep (>>column) ;
 
-M: lex-hash set-at swap {
-   { pos [ store-pos ] }
-   [ swap hash>> set-at ] } case ;
+M: lex-hash set-at
+    swap {
+        { pos [ store-pos ] }
+        [ swap hash>> set-at ]
+    } case ;
 
 :: at-pos ( t l c -- p ) t l head-slice [ length ] map sum l 1- + c + ;
 
-M: lex-hash at* swap {
+M: lex-hash at*
+    swap {
       { input [ drop lexer get text>> "\n" join t ] }
       { pos [ drop lexer get [ text>> ] [ line>> 1- ] [ column>> 1+ ] tri at-pos t ] }
-      [ swap hash>> at* ] } case ;
+      [ swap hash>> at* ]
+    } case ;
 
 : with-global-lexer ( quot -- result )
-   [ f lrstack set
-        V{ } clone error-stack set H{ } clone \ heads set
-        H{ } clone \ packrat set ] f make-assoc <lex-hash>
+   [
+       f lrstack set
+       V{ } clone error-stack set H{ } clone \ heads set
+       H{ } clone \ packrat set
+   ] f make-assoc <lex-hash>
    swap bind ; inline
 
-: parse* ( parser -- ast ) compile
-   [ execute [ error-stack get first throw ] unless* ] with-global-lexer
-   ast>> ;
+: parse* ( parser -- ast )
+    compile
+    [ execute [ error-stack get first throw ] unless* ] with-global-lexer
+    ast>> ;
 
-: create-bnf ( name parser -- ) reset-tokenizer [ lexer get skip-blank parse* parsed ] curry
-    define word make-parsing ;
+: create-bnf ( name parser -- )
+    reset-tokenizer [ lexer get skip-blank parse* parsed ] curry
+    define-syntax ;
     
-: ON-BNF: CREATE-WORD reset-tokenizer ";ON-BNF" parse-multiline-string parse-ebnf
-    main swap at create-bnf ; parsing
+SYNTAX: ON-BNF:
+    CREATE-WORD reset-tokenizer ";ON-BNF" parse-multiline-string parse-ebnf
+    main swap at create-bnf ;
 
 ! Tokenizer like standard factor lexer
 EBNF: factor
index bd50f817b6dd8b5296aa081b38b45d3ab364ee2e..423512465eda8cf7d1d0fa312411c046f6c8db84 100644 (file)
@@ -128,10 +128,10 @@ PRIVATE>
 : d-transform ( triple -- new-triple )
     { { -1 -2 -2 } { 2 1 2 } { 2 2 3 } } transform ;
 
-: SOLUTION:
+SYNTAX: SOLUTION:
     scan-word
     [ name>> "-main" append create-in ] keep
     [ drop in get vocab (>>main) ]
     [ [ . ] swap prefix (( -- )) define-declared ]
-    2bi ; parsing
+    2bi ;
 
index 4e8dc9a9a2ed5201673463c7400b4fe0897b4312..d416842ef50d7ece518efdac84c6a29d67fe03f2 100755 (executable)
@@ -1,34 +1,20 @@
 ! Copyright (C) 2006 Chris Double.
 ! See http://factorcode.org/license.txt for BSD license.
-
 USING: help.markup help.syntax ;
 IN: promises
 
 HELP: promise 
 { $values { "quot" { $quotation "( -- X )" } } { "promise" "a promise object" } }
-{ $description "Creates a promise to return a value. When forced this quotation is called and the value returned. The value is memorised so that calling " { $link force } " again does not call the quotation again, instead the previous value is returned directly." } 
-{ $see-also force promise-with promise-with2 } ;
-
-HELP: promise-with
-{ $values { "value" "an object" } { "quot" { $quotation "( value -- X )" } } { "promise" "a promise object" } }
-{ $description "Creates a promise to return a value. When forced this quotation is called with the given value on the stack and the result returned. The value is memorised so that calling " { $link force } " again does not call the quotation again, instead the previous value is returned directly." } 
-{ $see-also force promise promise-with2 } ;
-
-HELP: promise-with2
-{ $values { "value1" "an object" } { "value2" "an object" } { "quot" { $quotation "( value1 value2 -- X )" } } { "promise" "a promise object" } }
-{ $description "Creates a promise to return a value. When forced this quotation is called with the given values on the stack and the result returned. The value is memorised so that calling " { $link force } " again does not call the quotation again, instead the previous value is returned directly." } 
-{ $see-also force promise promise-with2 } ;
+{ $description "Creates a promise to return a value. When forced this quotation is called and the value returned. The value is memorised so that calling " { $link force } " again does not call the quotation again, instead the previous value is returned directly." } ;
 
 HELP: force
 { $values { "promise" "a promise object" } { "value" "a factor object" } }
-{ $description "Calls the quotation associated with the promise if it has not been called before, and returns the value. If the promise has been forced previously, returns the value from the previous call." } 
-{ $see-also promise promise-with promise-with2 } ;
+{ $description "Calls the quotation associated with the promise if it has not been called before, and returns the value. If the promise has been forced previously, returns the value from the previous call." } ;
 
 HELP: LAZY:
-{ $syntax "LAZY: word definition... ;" } 
+{ $syntax "LAZY: word ( stack -- effect ) definition... ;" } 
 { $values { "word" "a new word to define" } { "definition" "a word definition" } }
 { $description "Creates a lazy word in the current vocabulary. When executed the word will return a " { $link promise } " that when forced, executes the word definition. Any values on the stack that are required by the word definition are captured along with the promise." } 
 { $examples
   { $example "USING: arrays sequences prettyprint promises ;" "IN: scratchpad" "LAZY: zeroes ( -- pair ) 0 zeroes 2array ;" "zeroes force second force first ." "0" }
-}
-{ $see-also force promise-with promise-with2 } ;
+} ;
diff --git a/extra/promises/promises-tests.factor b/extra/promises/promises-tests.factor
new file mode 100644 (file)
index 0000000..79e7dc5
--- /dev/null
@@ -0,0 +1,7 @@
+IN: promises.tests
+USING: promises math tools.test ;
+
+LAZY: lazy-test ( a -- b ) 1 + ;
+
+{ 1 1 } [ lazy-test ] must-infer-as
+[ 3 ] [ 2 lazy-test force ] unit-test
\ No newline at end of file
index 0e193741ebba35be1f1e7cad179dd691062fe385..c3951f46ba60d927a0e9556684d53f4e41ecf9d6 100755 (executable)
@@ -1,41 +1,22 @@
 ! Copyright (C) 2004, 2006 Chris Double, Matthew Willis.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: arrays kernel sequences math vectors arrays namespaces
-make quotations parser effects stack-checker words accessors ;
+USING: arrays kernel sequences math arrays namespaces
+parser effects generalizations fry words accessors ;
 IN: promises
 
 TUPLE: promise quot forced? value ;
 
-: promise ( quot -- promise )
-  f f \ promise boa ;
-
-: promise-with ( value quot -- promise )
-  curry promise ;
-
-: promise-with2 ( value1 value2 quot -- promise )
-  2curry promise ;
+: promise ( quot -- promise ) f f \ promise boa ;
 
 : force ( promise -- value )
-    #! Force the given promise leaving the value of calling the
-    #! promises quotation on the stack. Re-forcing the promise
-    #! will return the same value and not recall the quotation.
     dup forced?>> [
         dup quot>> call( -- value ) >>value
         t >>forced?
     ] unless
     value>> ;
 
-: stack-effect-in ( quot word -- n )
-  stack-effect [ ] [ infer ] ?if in>> length ;
-
-: make-lazy-quot ( word quot -- quot )
-  [
-    dup ,
-    swap stack-effect-in \ curry <repetition> % 
-    \ promise ,
-  ] [ ] make ;
+: make-lazy-quot ( quot effect -- quot )
+    in>> length '[ _ _ ncurry promise ] ;
 
-: LAZY:
-  CREATE-WORD
-  dup parse-definition
-  make-lazy-quot define ; parsing
+SYNTAX: LAZY:
+    (:) [ make-lazy-quot ] [ 2nip ] 3bi define-declared ;
index 7ee5bd649f241863b3211b079910d624c54e9c8a..eed5540cb39490151cf9c09ab281408c958a923d 100644 (file)
@@ -3,7 +3,7 @@ USING: kernel accessors assocs
 sequences sequences.n-based tools.test ;
 IN: sequences.n-based.tests
 
-: months
+: months ( -- assoc )
     V{
         "January"
         "February"
index c7a27f87a486d46040dccbd9230359d3d53ec05b..29367a2b2bfd8a9382196da075073c38a8fcb571 100755 (executable)
@@ -94,8 +94,8 @@ TUPLE: slides < book ;
         2 + (strip-tease)
     ] with map ;
 
-: STRIP-TEASE:
-    parse-definition strip-tease [ parsed ] each ; parsing
+SYNTAX: STRIP-TEASE:
+    parse-definition strip-tease [ parsed ] each ;
 
 \ slides H{
     { T{ button-down } [ request-focus ] }
diff --git a/extra/state-machine/authors.txt b/extra/state-machine/authors.txt
deleted file mode 100755 (executable)
index f990dd0..0000000
+++ /dev/null
@@ -1 +0,0 @@
-Daniel Ehrenberg
diff --git a/extra/state-machine/state-machine.factor b/extra/state-machine/state-machine.factor
deleted file mode 100755 (executable)
index 18c3720..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-USING: kernel parser lexer strings math namespaces make
-sequences words io arrays quotations debugger accessors
-sequences.private ;
-IN: state-machine
-
-: STATES:
-    ! STATES: set-name state1 state2 ... ;
-    ";" parse-tokens
-    [ length ] keep
-    unclip suffix
-    [ create-in swap 1quotation define ] 2each ; parsing
-
-TUPLE: state place data ;
-
-ERROR: missing-state ;
-
-M: missing-state error.
-    drop "Missing state" print ;
-
-: make-machine ( states -- table quot )
-    ! quot is ( state string -- output-string )
-    [ missing-state ] <array> dup
-    [
-        [ [ dup [ data>> ] [ place>> ] bi ] dip ] %
-        [ swapd bounds-check dispatch ] curry ,
-        [ each pick (>>place) swap (>>date) ] %
-    ] [ ] make [ over make ] curry ;
-
-: define-machine ( word state-class -- )
-    execute make-machine
-    [ over ] dip define
-    "state-table" set-word-prop ;
-
-: MACHINE:
-    ! MACHINE: utf8 unicode-states
-    CREATE scan-word define-machine ; parsing
-
-: S:
-    ! S: state state-machine definition... ;
-    ! definition MUST be ( data char -- newdata state )
-    scan-word execute scan-word "state-table" word-prop
-    parse-definition -rot set-nth ; parsing
index 932904eff40bcabecb522c9e2aaaca97d0a75843..71b30cd175fd1be468e29d15ecd5f579aae1bec7 100644 (file)
@@ -106,7 +106,7 @@ STRING: test-svg-string
 </svg>
 ;
 
-: test-svg-path
+: test-svg-path ( -- obj )
     test-svg-string string>xml body>> children-tags first ;
 
 [ { T{ moveto f { -1.0 -1.0 } f } T{ lineto f { 2.0 2.0 } t } } ]
index 264db53a9eb8dfdf140cfd13384133a22bdbc364..04c7022077c0c4bb0914c5ded36c66e595b7e935 100755 (executable)
@@ -152,7 +152,7 @@ M: avl new-assoc 2drop <avl> ;
 M: avl assoc-like
     drop dup avl? [ >avl ] unless ;
 
-: AVL{
-    \ } [ >avl ] parse-literal ; parsing
+SYNTAX: AVL{
+    \ } [ >avl ] parse-literal ;
 
 M: avl pprint-delims drop \ AVL{ \ } ;
index c47b6b5d07345e0b15ac43927f60d6a837137c37..66ef154b63c726faf70f6e5bc586ecda2026e108 100755 (executable)
@@ -131,8 +131,8 @@ M: splay new-assoc
 : >splay ( assoc -- tree )
     T{ splay f f 0 } assoc-clone-like ;
 
-: SPLAY{
-    \ } [ >splay ] parse-literal ; parsing
+SYNTAX: SPLAY{
+    \ } [ >splay ] parse-literal ;
 
 M: splay assoc-like
     drop dup splay? [ >splay ] unless ;
index 41a8a21c1d9769e716a38ccc388bae48f429ca0a..4efea6ae427944efe9b40b90a9236ee549ec3e84 100755 (executable)
@@ -198,8 +198,8 @@ M: tree clone dup assoc-clone-like ;
 
 M: tree assoc-like drop dup tree? [ >tree ] unless ;
 
-: TREE{
-    \ } [ >tree ] parse-literal ; parsing
+SYNTAX: TREE{
+    \ } [ >tree ] parse-literal ;
                                                         
 M: tree assoc-size count>> ;
 M: tree pprint-delims drop \ TREE{ \ } ;
index 9b450ed18bd7f1d4750f4b0feb36beda9f4f0838..96497b8bbc5c0cc8c2a992f3bc7af8a5c78ff2f7 100755 (executable)
@@ -15,7 +15,7 @@ IN: units.tests
 [ t ] [ 1 m 2 m 3 m 3array d-product 6 m^3 = ] unit-test
 [ t ] [ 3 m d-recip 1/3 { } { m } <dimensioned> = ] unit-test
 
-: km/L km 1 L d/ ;
-: mpg miles 1 gallons d/ ;
+: km/L ( n -- d ) km 1 L d/ ;
+: mpg ( n -- d ) miles 1 gallons d/ ;
 
 [ t ] [ 100 10 / km/L [ mpg ] undo 23 1 ~ ] unit-test
index c12367ba5ea35a82952aea6e68f9e3173d5c25b7..21c9b303f304946512cc5c85b8f6e342631667b1 100644 (file)
@@ -21,11 +21,11 @@ IN: vars
     [ define-var-getter ]
     [ define-var-setter ] tri ;
 
-: VAR: ! var
-    scan define-var ; parsing
+SYNTAX: VAR: ! var
+    scan define-var ;
 
 : define-vars ( seq -- )
     [ define-var ] each ;
 
-: VARS: ! vars ...
-    ";" parse-tokens define-vars ; parsing
+SYNTAX: VARS: ! vars ...
+    ";" parse-tokens define-vars ;