diff --git a/.travis.yml b/.travis.yml index 34d2f2b74a271..e597e50bb63d4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -70,8 +70,10 @@ jobs: include: - env: ENABLE_ZTS=0 ENABLE_DEBUG=0 arch: amd64 + if: type = cron - env: ENABLE_ZTS=1 ENABLE_DEBUG=1 arch: amd64 + if: type = cron - env: ENABLE_ZTS=1 ENABLE_DEBUG=1 SKIP_IO_CAPTURE_TESTS=1 ARM64=1 arch: arm64 if: type = cron diff --git a/NEWS b/NEWS index b9e81b417f60c..73f97611bc6c1 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,10 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ?? ??? ????, PHP 8.1.0alpha1 +- Core: + . Fixed inclusion order for phpize builds on Windows. (cmb) + . Added missing hashtable insertion APIs for arr/obj/ref. (Sara) + - FTP: . Convert resource to object \FTPConnection. (Sara) diff --git a/UPGRADING b/UPGRADING index c8c8d4b09e089..7f530497e7f5f 100644 --- a/UPGRADING +++ b/UPGRADING @@ -19,17 +19,49 @@ PHP 8.1 UPGRADE NOTES 1. Backward Incompatible Changes ======================================== +- MySQLi: + . mysqli_fetch_fields() and mysqli_fetch_field_direct() will now always return + zero for max_length. You can compute this information by iterating over the + result set and taking the maximum length. This is what PHP was doing + internally previously. + . The MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH option no longer has an effect. + . The MYSQLI_STORE_RESULT_COPY_DATA option no longer has an effect. + +- MySQLnd: + . The mysqlnd.fetch_copy_data ini setting has been removed. However, this + should not result in user-visible behavior changes. + +- Standard: + . version_compare() no longer accepts undocumented operator abbreviations. + ======================================== 2. New Features ======================================== - hash: - . Added MurmurHash3 with streaming support. The following variants are implemented + . The following functions have changed signatures: + + - function hash(string $algo, string $data, bool $binary = false, array $options = []): string|false {} + - function hash_file(string $algo, string $filename, bool $binary = false, array $options = []): string|false {} + - function hash_init(string $algo, int $flags = 0, string $key = "", array $options = []): HashContext {} + + The additional `$options` argument can be used to pass algorithm specific data. + + . Added MurmurHash3 with streaming support. The following variants are implemented: - murmur3a, 32-bit hash - murmur3c, 128-bit hash for x86 - murmur3f, 128-bit hash for x64 + The initial hash state can be passed through the `seed` key in the `$options` array, for example: + + ```php + $h = hash("murmur3f", $data, options: ["seed" => 42]); + echo $h, "\n"; + ``` + + A valid seed value is within the range from 0 to the plaform defined UINT_MAX, usually 4294967295. + ======================================== 3. Changes in SAPI modules ======================================== @@ -61,6 +93,11 @@ PHP 8.1 UPGRADE NOTES - OpenSSL: . The OpenSSL extension now requires at least OpenSSL version 1.0.2. +- Standard: + . --with-password-argon2 now uses pkg-config to detect libargon2. As such, + an alternative libargon2 location should now be specified using + PKG_CONFIG_PATH. + ======================================== 10. New Global Constants ======================================== diff --git a/UPGRADING.INTERNALS b/UPGRADING.INTERNALS index 3e2aeb70a4def..c1ddd4fad2130 100644 --- a/UPGRADING.INTERNALS +++ b/UPGRADING.INTERNALS @@ -5,6 +5,7 @@ PHP 8.1 INTERNALS UPGRADE NOTES 2. Build system changes 3. Module changes + a. ext/hash ======================== 1. Internal API changes @@ -17,3 +18,10 @@ PHP 8.1 INTERNALS UPGRADE NOTES ======================== 3. Module changes ======================== + + a. ext/hash + - The init signatures are extended with an additional `HashTable*` + argument. The passed HT is to contain the algorithm specific + configuration. If the an algorithm doesn't make use of any + additional configuration, the argument is to be marked with + ZEND_ATTRIBUTE_UNUSED. diff --git a/Zend/Zend.m4 b/Zend/Zend.m4 index 0a9170709d85b..081a237012f3e 100644 --- a/Zend/Zend.m4 +++ b/Zend/Zend.m4 @@ -190,12 +190,6 @@ dnl LIBZEND_OTHER_CHECKS dnl AC_DEFUN([LIBZEND_OTHER_CHECKS],[ -AC_ARG_ENABLE([zts], - [AS_HELP_STRING([--enable-zts], - [Enable thread safety])], - [ZEND_ZTS=$enableval], - [ZEND_ZTS=no]) - AC_MSG_CHECKING(whether to enable thread-safety) AC_MSG_RESULT($ZEND_ZTS) diff --git a/Zend/tests/attributes/032_attribute_validation_scope.phpt b/Zend/tests/attributes/032_attribute_validation_scope.phpt new file mode 100644 index 0000000000000..039a427254f4d --- /dev/null +++ b/Zend/tests/attributes/032_attribute_validation_scope.phpt @@ -0,0 +1,9 @@ +--TEST-- +Validation for "Attribute" does not use a scope when evaluating constant ASTs +--FILE-- + +--EXPECTF-- +Fatal error: Cannot access "parent" when no class scope is active in %s on line %d diff --git a/Zend/tests/bug70630.phpt b/Zend/tests/bug70630.phpt index d78ee62c6aded..0e9e5449758f9 100644 --- a/Zend/tests/bug70630.phpt +++ b/Zend/tests/bug70630.phpt @@ -7,4 +7,4 @@ $x = (new ReflectionFunction("substr"))->getClosure(); $x->call(new a); ?> --EXPECTF-- -Warning: Cannot rebind scope of closure created by ReflectionFunctionAbstract::getClosure() in %s on line %d +Warning: Cannot rebind scope of closure created from function in %s on line %d diff --git a/Zend/tests/bug70685.phpt b/Zend/tests/bug70685.phpt index 8ae97f1bf0cae..737b4469fdbe4 100644 --- a/Zend/tests/bug70685.phpt +++ b/Zend/tests/bug70685.phpt @@ -18,5 +18,5 @@ var_dump($c); Warning: Cannot bind method SplDoublyLinkedList::count() to object of class cls in %s on line %d NULL -Warning: Cannot rebind scope of closure created by ReflectionFunctionAbstract::getClosure() in %s on line %d +Warning: Cannot rebind scope of closure created from method in %s on line %d NULL diff --git a/Zend/tests/bug80391.phpt b/Zend/tests/bug80391.phpt new file mode 100644 index 0000000000000..f483ed80fc9be --- /dev/null +++ b/Zend/tests/bug80391.phpt @@ -0,0 +1,23 @@ +--TEST-- +Iterable not covariant to mixed +--FILE-- + +===DONE=== +--EXPECT-- +===DONE=== diff --git a/Zend/tests/bug80404.phpt b/Zend/tests/bug80404.phpt new file mode 100644 index 0000000000000..e16b9c08b350a --- /dev/null +++ b/Zend/tests/bug80404.phpt @@ -0,0 +1,11 @@ +--TEST-- +Bug #80404: Incorrect range inference result when division results in float +--FILE-- + +--EXPECT-- +int(52) diff --git a/Zend/tests/closure_061.phpt b/Zend/tests/closure_061.phpt index 2c574c49c0167..240f22e036ef7 100644 --- a/Zend/tests/closure_061.phpt +++ b/Zend/tests/closure_061.phpt @@ -118,10 +118,10 @@ bindTo(new Cls, null): Success! bindTo(new Cls, Cls::class): -Cannot rebind scope of closure created by ReflectionFunctionAbstract::getClosure() +Cannot rebind scope of closure created from function bindTo(null, Cls::class): -Cannot rebind scope of closure created by ReflectionFunctionAbstract::getClosure() +Cannot rebind scope of closure created from function bindTo(null, stdClass::class): Cannot bind closure to scope of internal class stdClass @@ -139,10 +139,10 @@ bindTo(new Cls, null): Success! bindTo(new Cls, Cls::class): -Cannot rebind scope of closure created by ReflectionFunctionAbstract::getClosure() +Cannot rebind scope of closure created from function bindTo(null, Cls::class): -Cannot rebind scope of closure created by ReflectionFunctionAbstract::getClosure() +Cannot rebind scope of closure created from function bindTo(null, stdClass::class): Cannot bind closure to scope of internal class stdClass @@ -163,13 +163,13 @@ bindTo(new Cls, Cls::class): Cannot bind an instance to a static closure bindTo(null, null): -Cannot rebind scope of closure created by ReflectionFunctionAbstract::getClosure() +Cannot rebind scope of closure created from method bindTo(null, ClsChild::class): -Cannot rebind scope of closure created by ReflectionFunctionAbstract::getClosure() +Cannot rebind scope of closure created from method bindTo(null, ClsUnrelated::class): -Cannot rebind scope of closure created by ReflectionFunctionAbstract::getClosure() +Cannot rebind scope of closure created from method (new Cls)->method() ------------------- @@ -187,13 +187,13 @@ bindTo(new ClsUnrelated, Cls::class): Cannot bind method Cls::method() to object of class ClsUnrelated bindTo(new Cls, null): -Cannot rebind scope of closure created by ReflectionFunctionAbstract::getClosure() +Cannot rebind scope of closure created from method bindTo(new Cls, ClsUnrelated::class): -Cannot rebind scope of closure created by ReflectionFunctionAbstract::getClosure() +Cannot rebind scope of closure created from method bindTo(new Cls, ClsChild::class): -Cannot rebind scope of closure created by ReflectionFunctionAbstract::getClosure() +Cannot rebind scope of closure created from method (new SplDoublyLinkedList)->count() ---------------------------------- @@ -214,10 +214,10 @@ bindTo(null, SplDoublyLinkedList::class): Cannot unbind $this of method bindTo(new SplDoublyLinkedList, null): -Cannot rebind scope of closure created by ReflectionFunctionAbstract::getClosure() +Cannot rebind scope of closure created from method bindTo(new SplDoublyLinkedList, ClsUnrelated::class): -Cannot rebind scope of closure created by ReflectionFunctionAbstract::getClosure() +Cannot rebind scope of closure created from method (function() {})() ----------------- diff --git a/Zend/tests/generators/gc_running_generator.phpt b/Zend/tests/generators/gc_running_generator.phpt new file mode 100644 index 0000000000000..e702381b62876 --- /dev/null +++ b/Zend/tests/generators/gc_running_generator.phpt @@ -0,0 +1,25 @@ +--TEST-- +GC on running generator +--FILE-- +foo = $ary; + foreach ($ary as &$v) { } +} + +for ($i = 0; $i < 10000; $i++) { + // Make sure gen is registered as a GC root. + $gen = gen(); + $gen2 = $gen; + unset($gen); + foreach ($gen2 as $v) {} +} + +?> +===DONE=== +--EXPECT-- +===DONE=== diff --git a/Zend/tests/live_range_phi_leak.phpt b/Zend/tests/live_range_phi_leak.phpt new file mode 100644 index 0000000000000..f072584053018 --- /dev/null +++ b/Zend/tests/live_range_phi_leak.phpt @@ -0,0 +1,19 @@ +--TEST-- +Missing live range if part of phi +--FILE-- +getMessage(), "\n"; +} +?> +--EXPECT-- +Test diff --git a/Zend/tests/lsb_023.phpt b/Zend/tests/lsb_023.phpt new file mode 100644 index 0000000000000..a8051aa85fe47 --- /dev/null +++ b/Zend/tests/lsb_023.phpt @@ -0,0 +1,26 @@ +--TEST-- +Late Static Binding static:: calls protected / public method of child class even then +the method is private in parent class +--FILE-- +prev_execute_data; } - zend_bool ret = zend_is_callable_impl(callable, object, frame, check_flags, fcc, error); + zend_bool ret = zend_is_callable_at_frame(callable, object, frame, check_flags, fcc, error); if (callable_name) { *callable_name = zend_get_callable_name_ex(callable, object); } diff --git a/Zend/zend_API.h b/Zend/zend_API.h index 301b0400041e5..46545582e600e 100644 --- a/Zend/zend_API.h +++ b/Zend/zend_API.h @@ -352,6 +352,9 @@ ZEND_API ZEND_COLD void zend_wrong_param_count(void); ZEND_API void zend_release_fcall_info_cache(zend_fcall_info_cache *fcc); ZEND_API zend_string *zend_get_callable_name_ex(zval *callable, zend_object *object); ZEND_API zend_string *zend_get_callable_name(zval *callable); +ZEND_API zend_bool zend_is_callable_at_frame( + zval *callable, zend_object *object, zend_execute_data *frame, + uint32_t check_flags, zend_fcall_info_cache *fcc, char **error); ZEND_API zend_bool zend_is_callable_ex(zval *callable, zend_object *object, uint32_t check_flags, zend_string **callable_name, zend_fcall_info_cache *fcc, char **error); ZEND_API zend_bool zend_is_callable(zval *callable, uint32_t check_flags, zend_string **callable_name); ZEND_API zend_bool zend_make_callable(zval *callable, zend_string **callable_name); @@ -442,6 +445,9 @@ ZEND_API void add_assoc_double_ex(zval *arg, const char *key, size_t key_len, do ZEND_API void add_assoc_str_ex(zval *arg, const char *key, size_t key_len, zend_string *str); ZEND_API void add_assoc_string_ex(zval *arg, const char *key, size_t key_len, const char *str); ZEND_API void add_assoc_stringl_ex(zval *arg, const char *key, size_t key_len, const char *str, size_t length); +ZEND_API void add_assoc_array_ex(zval *arg, const char *key, size_t key_len, zend_array *arr); +ZEND_API void add_assoc_object_ex(zval *arg, const char *key, size_t key_len, zend_object *obj); +ZEND_API void add_assoc_reference_ex(zval *arg, const char *key, size_t key_len, zend_reference *ref); ZEND_API void add_assoc_zval_ex(zval *arg, const char *key, size_t key_len, zval *value); #define add_assoc_long(__arg, __key, __n) add_assoc_long_ex(__arg, __key, strlen(__key), __n) @@ -452,6 +458,9 @@ ZEND_API void add_assoc_zval_ex(zval *arg, const char *key, size_t key_len, zval #define add_assoc_str(__arg, __key, __str) add_assoc_str_ex(__arg, __key, strlen(__key), __str) #define add_assoc_string(__arg, __key, __str) add_assoc_string_ex(__arg, __key, strlen(__key), __str) #define add_assoc_stringl(__arg, __key, __str, __length) add_assoc_stringl_ex(__arg, __key, strlen(__key), __str, __length) +#define add_assoc_array(__arg, __key, __arr) add_assoc_array_ex(__arg, __key, strlen(__key), __arr) +#define add_assoc_object(__arg, __key, __obj) add_assoc_object_ex(__arg, __key, strlen(__key), __obj) +#define add_assoc_reference(__arg, __key, __ref) add_assoc_object_ex(__arg, __key, strlen(__key), __ref) #define add_assoc_zval(__arg, __key, __value) add_assoc_zval_ex(__arg, __key, strlen(__key), __value) ZEND_API void add_index_long(zval *arg, zend_ulong index, zend_long n); @@ -462,6 +471,9 @@ ZEND_API void add_index_double(zval *arg, zend_ulong index, double d); ZEND_API void add_index_str(zval *arg, zend_ulong index, zend_string *str); ZEND_API void add_index_string(zval *arg, zend_ulong index, const char *str); ZEND_API void add_index_stringl(zval *arg, zend_ulong index, const char *str, size_t length); +ZEND_API void add_index_array(zval *arg, zend_ulong index, zend_array *arr); +ZEND_API void add_index_object(zval *arg, zend_ulong index, zend_object *obj); +ZEND_API void add_index_reference(zval *arg, zend_ulong index, zend_reference *ref); static zend_always_inline zend_result add_index_zval(zval *arg, zend_ulong index, zval *value) { @@ -476,6 +488,9 @@ ZEND_API zend_result add_next_index_double(zval *arg, double d); ZEND_API zend_result add_next_index_str(zval *arg, zend_string *str); ZEND_API zend_result add_next_index_string(zval *arg, const char *str); ZEND_API zend_result add_next_index_stringl(zval *arg, const char *str, size_t length); +ZEND_API zend_result add_next_index_array(zval *arg, zend_array *arr); +ZEND_API zend_result add_next_index_object(zval *arg, zend_object *obj); +ZEND_API zend_result add_next_index_reference(zval *arg, zend_reference *ref); static zend_always_inline zend_result add_next_index_zval(zval *arg, zval *value) { @@ -492,6 +507,9 @@ ZEND_API void add_property_double_ex(zval *arg, const char *key, size_t key_len, ZEND_API void add_property_str_ex(zval *arg, const char *key, size_t key_len, zend_string *str); ZEND_API void add_property_string_ex(zval *arg, const char *key, size_t key_len, const char *str); ZEND_API void add_property_stringl_ex(zval *arg, const char *key, size_t key_len, const char *str, size_t length); +ZEND_API void add_property_array_ex(zval *arg, const char *key, size_t key_len, zend_array *arr); +ZEND_API void add_property_object_ex(zval *arg, const char *key, size_t key_len, zend_object *obj); +ZEND_API void add_property_reference_ex(zval *arg, const char *key, size_t key_len, zend_reference *ref); ZEND_API void add_property_zval_ex(zval *arg, const char *key, size_t key_len, zval *value); #define add_property_long(__arg, __key, __n) add_property_long_ex(__arg, __key, strlen(__key), __n) @@ -502,6 +520,9 @@ ZEND_API void add_property_zval_ex(zval *arg, const char *key, size_t key_len, z #define add_property_str(__arg, __key, __str) add_property_str_ex(__arg, __key, strlen(__key), __str) #define add_property_string(__arg, __key, __str) add_property_string_ex(__arg, __key, strlen(__key), __str) #define add_property_stringl(__arg, __key, __str, __length) add_property_stringl_ex(__arg, __key, strlen(__key), __str, __length) +#define add_property_array(__arg, __key, __arr) add_property_array_ex(__arg, __key, strlen(__key), __arr) +#define add_property_object(__arg, __key, __obj) add_property_object_ex(__arg, __key, strlen(__key), __obj) +#define add_property_reference(__arg, __key, __ref) add_property_reference_ex(__arg, __key, strlen(__key), __ref) #define add_property_zval(__arg, __key, __value) add_property_zval_ex(__arg, __key, strlen(__key), __value) diff --git a/Zend/zend_alloc.c b/Zend/zend_alloc.c index 098dda104a443..750a4a6375cba 100644 --- a/Zend/zend_alloc.c +++ b/Zend/zend_alloc.c @@ -117,7 +117,7 @@ static size_t _real_page_size = ZEND_MM_PAGE_SIZE; /* Mac allows to track anonymous page via vmmap per TAG id. * user land applications are allowed to take from 240 to 255. */ -# define ZEND_MM_FD (250<<24) +# define ZEND_MM_FD (250u << 24u) #endif #ifndef ZEND_MM_STAT diff --git a/Zend/zend_attributes.c b/Zend/zend_attributes.c index 29a2f4a732546..ae07802b5bcb5 100644 --- a/Zend/zend_attributes.c +++ b/Zend/zend_attributes.c @@ -33,7 +33,10 @@ void validate_attribute(zend_attribute *attr, uint32_t target, zend_class_entry if (attr->argc > 0) { zval flags; - if (FAILURE == zend_get_attribute_value(&flags, attr, 0, scope)) { + /* As this is run in the middle of compilation, fetch the attribute value without + * specifying a scope. The class is not fully linked yet, and we may seen an + * inconsistent state. */ + if (FAILURE == zend_get_attribute_value(&flags, attr, 0, NULL)) { return; } diff --git a/Zend/zend_builtin_functions.stub.php b/Zend/zend_builtin_functions.stub.php index 6209967b235e8..187e789d235bb 100644 --- a/Zend/zend_builtin_functions.stub.php +++ b/Zend/zend_builtin_functions.stub.php @@ -48,10 +48,10 @@ function get_mangled_object_vars(object $object): array {} function get_class_methods(object|string $object_or_class): array {} /** @param object|string $object_or_class */ -function method_exists(mixed $object_or_class, string $method): bool {} +function method_exists($object_or_class, string $method): bool {} /** @param object|string $object_or_class */ -function property_exists(mixed $object_or_class, string $property): bool {} +function property_exists($object_or_class, string $property): bool {} function class_exists(string $class, bool $autoload = true): bool {} diff --git a/Zend/zend_builtin_functions_arginfo.h b/Zend/zend_builtin_functions_arginfo.h index d5d2fb9113559..e2d640d22fbc3 100644 --- a/Zend/zend_builtin_functions_arginfo.h +++ b/Zend/zend_builtin_functions_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 9a77101b93e8584315bf43305830e129d359b033 */ + * Stub hash: b09e9199a21595a3b6f6c02db81c8e22c36c277f */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_zend_version, 0, 0, IS_STRING, 0) ZEND_END_ARG_INFO() @@ -84,12 +84,12 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_get_class_methods, 0, 1, IS_ARRA ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_method_exists, 0, 2, _IS_BOOL, 0) - ZEND_ARG_TYPE_INFO(0, object_or_class, IS_MIXED, 0) + ZEND_ARG_INFO(0, object_or_class) ZEND_ARG_TYPE_INFO(0, method, IS_STRING, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_property_exists, 0, 2, _IS_BOOL, 0) - ZEND_ARG_TYPE_INFO(0, object_or_class, IS_MIXED, 0) + ZEND_ARG_INFO(0, object_or_class) ZEND_ARG_TYPE_INFO(0, property, IS_STRING, 0) ZEND_END_ARG_INFO() diff --git a/Zend/zend_closures.c b/Zend/zend_closures.c index 034b0d2d071b8..e7777c58cf3bb 100644 --- a/Zend/zend_closures.c +++ b/Zend/zend_closures.c @@ -107,7 +107,11 @@ static zend_bool zend_valid_closure_binding( } if (is_fake_closure && scope != func->common.scope) { - zend_error(E_WARNING, "Cannot rebind scope of closure created by ReflectionFunctionAbstract::getClosure()"); + if (func->common.scope == NULL) { + zend_error(E_WARNING, "Cannot rebind scope of closure created from function"); + } else { + zend_error(E_WARNING, "Cannot rebind scope of closure created from method"); + } return 0; } diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index dbb21944371f4..83942be57015c 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -422,6 +422,9 @@ void init_compiler(void) /* {{{ */ void shutdown_compiler(void) /* {{{ */ { + /* Reset filename before destroying the arena, as file cache may use arena allocated strings. */ + zend_restore_compiled_filename(NULL); + zend_stack_destroy(&CG(loop_var_stack)); zend_stack_destroy(&CG(delayed_oplines_stack)); zend_stack_destroy(&CG(short_circuiting_opnums)); @@ -437,7 +440,6 @@ void shutdown_compiler(void) /* {{{ */ FREE_HASHTABLE(CG(delayed_autoloads)); CG(delayed_autoloads) = NULL; } - zend_restore_compiled_filename(NULL); } /* }}} */ diff --git a/Zend/zend_cpuinfo.c b/Zend/zend_cpuinfo.c index 8851764f5734e..529ab529a3361 100644 --- a/Zend/zend_cpuinfo.c +++ b/Zend/zend_cpuinfo.c @@ -73,6 +73,44 @@ static void __zend_cpuid(uint32_t func, uint32_t subfunc, zend_cpu_info *cpuinfo } #endif +#if defined(__i386__) || defined(__x86_64__) +/* Function based on compiler-rt implementation. */ +static unsigned get_xcr0_eax() { +# if defined(__GNUC__) || defined(__clang__) + // Check xgetbv; this uses a .byte sequence instead of the instruction + // directly because older assemblers do not include support for xgetbv and + // there is no easy way to conditionally compile based on the assembler used. + unsigned eax, edx; + __asm__(".byte 0x0f, 0x01, 0xd0" : "=a"(eax), "=d"(edx) : "c"(0)); + return eax; +# elif defined(ZEND_WIN32) && defined(_XCR_XFEATURE_ENABLED_MASK) + return _xgetbv(_XCR_XFEATURE_ENABLED_MASK); +# else + return 0; +# endif +} + +static zend_bool is_avx_supported() { + if (!(cpuinfo.ecx & ZEND_CPU_FEATURE_AVX)) { + /* No support for AVX */ + return 0; + } + if (!(cpuinfo.ecx & ZEND_CPU_FEATURE_OSXSAVE)) { + /* The operating system does not support XSAVE. */ + return 0; + } + if ((get_xcr0_eax() & 0x6) != 0x6) { + /* XCR0 SSE and AVX bits must be set. */ + return 0; + } + return 1; +} +#else +static zend_bool is_avx_supported() { + return 0; +} +#endif + void zend_cpu_startup(void) { if (!cpuinfo.initialized) { @@ -95,10 +133,16 @@ void zend_cpu_startup(void) } else { cpuinfo.ebx = 0; } + + if (!is_avx_supported()) { + cpuinfo.edx &= ~ZEND_CPU_FEATURE_AVX; + cpuinfo.ebx &= ~(ZEND_CPU_FEATURE_AVX2 & ~ZEND_CPU_EBX_MASK); + } } } ZEND_API int zend_cpu_supports(zend_cpu_feature feature) { + ZEND_ASSERT(cpuinfo.initialized); if (feature & ZEND_CPU_EDX_MASK) { return (cpuinfo.edx & (feature & ~ZEND_CPU_EDX_MASK)); } else if (feature & ZEND_CPU_EBX_MASK) { diff --git a/Zend/zend_cpuinfo.h b/Zend/zend_cpuinfo.h index 0baec57c23a88..92227ca6c063e 100644 --- a/Zend/zend_cpuinfo.h +++ b/Zend/zend_cpuinfo.h @@ -120,7 +120,7 @@ ZEND_API int zend_cpu_supports(zend_cpu_feature feature); * resolver functions should not depend on any external * functions */ ZEND_NO_SANITIZE_ADDRESS -static zend_always_inline int zend_cpu_supports_sse2() { +static inline int zend_cpu_supports_sse2() { #if PHP_HAVE_BUILTIN_CPU_INIT __builtin_cpu_init(); #endif @@ -128,7 +128,7 @@ static zend_always_inline int zend_cpu_supports_sse2() { } ZEND_NO_SANITIZE_ADDRESS -static zend_always_inline int zend_cpu_supports_sse3() { +static inline int zend_cpu_supports_sse3() { #if PHP_HAVE_BUILTIN_CPU_INIT __builtin_cpu_init(); #endif @@ -136,7 +136,7 @@ static zend_always_inline int zend_cpu_supports_sse3() { } ZEND_NO_SANITIZE_ADDRESS -static zend_always_inline int zend_cpu_supports_ssse3() { +static inline int zend_cpu_supports_ssse3() { #if PHP_HAVE_BUILTIN_CPU_INIT __builtin_cpu_init(); #endif @@ -144,7 +144,7 @@ static zend_always_inline int zend_cpu_supports_ssse3() { } ZEND_NO_SANITIZE_ADDRESS -static zend_always_inline int zend_cpu_supports_sse41() { +static inline int zend_cpu_supports_sse41() { #if PHP_HAVE_BUILTIN_CPU_INIT __builtin_cpu_init(); #endif @@ -152,26 +152,15 @@ static zend_always_inline int zend_cpu_supports_sse41() { } ZEND_NO_SANITIZE_ADDRESS -static zend_always_inline int zend_cpu_supports_sse42() { +static inline int zend_cpu_supports_sse42() { #if PHP_HAVE_BUILTIN_CPU_INIT __builtin_cpu_init(); #endif return __builtin_cpu_supports("sse4.2"); } -/* __builtin_cpu_supports has pclmul from gcc9 */ -#if (!defined(__GNUC__) || (ZEND_GCC_VERSION >= 9000)) ZEND_NO_SANITIZE_ADDRESS -static zend_always_inline int zend_cpu_supports_pclmul() { -#if PHP_HAVE_BUILTIN_CPU_INIT - __builtin_cpu_init(); -#endif - return __builtin_cpu_supports("pclmul"); -} -#endif - -ZEND_NO_SANITIZE_ADDRESS -static zend_always_inline int zend_cpu_supports_avx() { +static inline int zend_cpu_supports_avx() { #if PHP_HAVE_BUILTIN_CPU_INIT __builtin_cpu_init(); #endif @@ -179,7 +168,7 @@ static zend_always_inline int zend_cpu_supports_avx() { } ZEND_NO_SANITIZE_ADDRESS -static zend_always_inline int zend_cpu_supports_avx2() { +static inline int zend_cpu_supports_avx2() { #if PHP_HAVE_BUILTIN_CPU_INIT __builtin_cpu_init(); #endif @@ -187,38 +176,48 @@ static zend_always_inline int zend_cpu_supports_avx2() { } #else -static zend_always_inline int zend_cpu_supports_sse2() { +static inline int zend_cpu_supports_sse2() { return zend_cpu_supports(ZEND_CPU_FEATURE_SSE2); } -static zend_always_inline int zend_cpu_supports_sse3() { +static inline int zend_cpu_supports_sse3() { return zend_cpu_supports(ZEND_CPU_FEATURE_SSE3); } -static zend_always_inline int zend_cpu_supports_ssse3() { +static inline int zend_cpu_supports_ssse3() { return zend_cpu_supports(ZEND_CPU_FEATURE_SSSE3); } -static zend_always_inline int zend_cpu_supports_sse41() { +static inline int zend_cpu_supports_sse41() { return zend_cpu_supports(ZEND_CPU_FEATURE_SSE41); } -static zend_always_inline int zend_cpu_supports_sse42() { +static inline int zend_cpu_supports_sse42() { return zend_cpu_supports(ZEND_CPU_FEATURE_SSE42); } -static zend_always_inline int zend_cpu_supports_pclmul() { - return zend_cpu_supports(ZEND_CPU_FEATURE_PCLMULQDQ); -} - -static zend_always_inline int zend_cpu_supports_avx() { +static inline int zend_cpu_supports_avx() { return zend_cpu_supports(ZEND_CPU_FEATURE_AVX); } -static zend_always_inline int zend_cpu_supports_avx2() { +static inline int zend_cpu_supports_avx2() { return zend_cpu_supports(ZEND_CPU_FEATURE_AVX2); } +#endif +/* __builtin_cpu_supports has pclmul from gcc9 */ +#if PHP_HAVE_BUILTIN_CPU_SUPPORTS && (!defined(__GNUC__) || (ZEND_GCC_VERSION >= 9000)) +ZEND_NO_SANITIZE_ADDRESS +static inline int zend_cpu_supports_pclmul() { +#if PHP_HAVE_BUILTIN_CPU_INIT + __builtin_cpu_init(); +#endif + return __builtin_cpu_supports("pclmul"); +} +#else +static inline int zend_cpu_supports_pclmul() { + return zend_cpu_supports(ZEND_CPU_FEATURE_PCLMULQDQ); +} #endif #endif diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index c58e1fa228e17..cb6e63c5154a4 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -3262,6 +3262,7 @@ ZEND_API void ZEND_FASTCALL zend_ref_del_type_source(zend_property_info_source_l zend_property_info_list *list = ZEND_PROPERTY_INFO_SOURCE_TO_LIST(source_list->list); zend_property_info **ptr, **end; + ZEND_ASSERT(prop); if (!ZEND_PROPERTY_INFO_SOURCE_IS_LIST(source_list->list)) { ZEND_ASSERT(source_list->ptr == prop); source_list->ptr = NULL; @@ -4757,6 +4758,11 @@ static zend_always_inline zend_execute_data *_zend_vm_stack_push_call_frame(uint } \ } while (0) +#ifdef ZEND_VM_HYBRID_JIT_RED_ZONE_SIZE +/* This callback disables optimization of "vm_stack_data" variable in VM */ +void (*zend_touch_vm_stack_data)(void *vm_stack_data) = NULL; +#endif + #include "zend_vm_execute.h" ZEND_API zend_result zend_set_user_opcode_handler(zend_uchar opcode, user_opcode_handler_t handler) diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c index 8fb85f0d2f280..2f200bb5b9643 100644 --- a/Zend/zend_execute_API.c +++ b/Zend/zend_execute_API.c @@ -1382,7 +1382,7 @@ static void zend_set_timeout_ex(zend_long seconds, bool reset_signals) /* {{{ */ t_r.it_value.tv_sec = seconds; t_r.it_value.tv_usec = t_r.it_interval.tv_sec = t_r.it_interval.tv_usec = 0; -# ifdef __CYGWIN__ +# if defined(__CYGWIN__) || defined(__PASE__) setitimer(ITIMER_REAL, &t_r, NULL); } signo = SIGALRM; @@ -1444,7 +1444,7 @@ void zend_unset_timeout(void) /* {{{ */ no_timeout.it_value.tv_sec = no_timeout.it_value.tv_usec = no_timeout.it_interval.tv_sec = no_timeout.it_interval.tv_usec = 0; -# ifdef __CYGWIN__ +# if defined(__CYGWIN__) || defined(__PASE__) setitimer(ITIMER_REAL, &no_timeout, NULL); # else setitimer(ITIMER_PROF, &no_timeout, NULL); diff --git a/Zend/zend_extensions.h b/Zend/zend_extensions.h index 3f330d2a2c406..49ce115548490 100644 --- a/Zend/zend_extensions.h +++ b/Zend/zend_extensions.h @@ -75,11 +75,11 @@ typedef size_t (*op_array_persist_calc_func_t)(zend_op_array *op_array); typedef size_t (*op_array_persist_func_t)(zend_op_array *op_array, void *mem); struct _zend_extension { - char *name; - char *version; - char *author; - char *URL; - char *copyright; + const char *name; + const char *version; + const char *author; + const char *URL; + const char *copyright; startup_func_t startup; shutdown_func_t shutdown; diff --git a/Zend/zend_gc.h b/Zend/zend_gc.h index b334173763f76..f44786425f6bf 100644 --- a/Zend/zend_gc.h +++ b/Zend/zend_gc.h @@ -55,8 +55,6 @@ void gc_reset(void); size_t zend_gc_globals_size(void); #endif -END_EXTERN_C() - #define GC_REMOVE_FROM_BUFFER(p) do { \ zend_refcounted *_p = (zend_refcounted*)(p); \ if (GC_TYPE_INFO(_p) & GC_INFO_MASK) { \ @@ -122,4 +120,6 @@ static zend_always_inline void zend_get_gc_buffer_use( *n = gc_buffer->cur - gc_buffer->start; } +END_EXTERN_C() + #endif /* ZEND_GC_H */ diff --git a/Zend/zend_generators.c b/Zend/zend_generators.c index ff3b66a13d85e..6973ad102051b 100644 --- a/Zend/zend_generators.c +++ b/Zend/zend_generators.c @@ -324,6 +324,16 @@ static HashTable *zend_generator_get_gc(zend_object *object, zval **table, int * return NULL; } + if (generator->flags & ZEND_GENERATOR_CURRENTLY_RUNNING) { + /* If the generator is currently running, we certainly won't be able to GC any values it + * holds on to. The execute_data state might be inconsistent during execution (e.g. because + * GC has been triggered in the middle of a variable reassignment), so we should not try + * to inspect it here. */ + *table = NULL; + *n = 0; + return NULL; + } + op_array = &EX(func)->op_array; zend_get_gc_buffer *gc_buffer = zend_get_gc_buffer_create(); diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c index 7401456d8f09b..882738b758581 100644 --- a/Zend/zend_inheritance.c +++ b/Zend/zend_inheritance.c @@ -323,6 +323,10 @@ static zend_bool unlinked_instanceof(zend_class_entry *ce1, zend_class_entry *ce static zend_bool zend_type_contains_traversable(zend_type type) { zend_type *single_type; + if (ZEND_TYPE_FULL_MASK(type) & MAY_BE_OBJECT) { + return 1; + } + ZEND_TYPE_FOREACH(type, single_type) { if (ZEND_TYPE_HAS_NAME(*single_type) && zend_string_equals_literal_ci(ZEND_TYPE_NAME(*single_type), "Traversable")) { diff --git a/Zend/zend_language_scanner.l b/Zend/zend_language_scanner.l index cd31878eb9d10..c381d50a2875b 100644 --- a/Zend/zend_language_scanner.l +++ b/Zend/zend_language_scanner.l @@ -177,7 +177,7 @@ static void yy_pop_state(void) zend_stack_del_top(&SCNG(state_stack)); } -static void yy_scan_buffer(char *str, unsigned int len) +static void yy_scan_buffer(char *str, size_t len) { YYCURSOR = (YYCTYPE*)str; YYLIMIT = YYCURSOR + len; @@ -571,7 +571,7 @@ ZEND_API zend_result open_file_for_scanning(zend_file_handle *file_handle) } } SCNG(yy_start) = (unsigned char *)buf; - yy_scan_buffer(buf, (unsigned int)size); + yy_scan_buffer(buf, size); } else { zend_error_noreturn(E_COMPILE_ERROR, "zend_stream_mmap() failed"); } @@ -772,7 +772,7 @@ ZEND_API void zend_prepare_string_for_scanning(zval *str, const char *filename) } } - yy_scan_buffer(buf, (unsigned int)size); + yy_scan_buffer(buf, size); new_compiled_filename = zend_string_init(filename, strlen(filename), 0); zend_set_compiled_filename(new_compiled_filename); @@ -1558,7 +1558,7 @@ NEWLINE ("\r"|"\n"|"\r\n") "?->" { yy_push_state(ST_LOOKING_FOR_PROPERTY); - return T_NULLSAFE_OBJECT_OPERATOR; + RETURN_TOKEN(T_NULLSAFE_OBJECT_OPERATOR); } {WHITESPACE}+ { diff --git a/Zend/zend_observer.c b/Zend/zend_observer.c index 9c2d1cdf51c4e..a8ce1eb5c057f 100644 --- a/Zend/zend_observer.c +++ b/Zend/zend_observer.c @@ -44,11 +44,13 @@ zend_llist zend_observer_error_callbacks; int zend_observer_fcall_op_array_extension = -1; ZEND_TLS zend_arena *fcall_handlers_arena = NULL; +ZEND_TLS zend_execute_data *first_observed_frame = NULL; +ZEND_TLS zend_execute_data *current_observed_frame = NULL; // Call during minit/startup ONLY ZEND_API void zend_observer_fcall_register(zend_observer_fcall_init init) { - /* We don't want to get an extension handle unless an ext installs an observer */ if (!ZEND_OBSERVER_ENABLED) { + /* We don't want to get an extension handle unless an ext installs an observer */ zend_observer_fcall_op_array_extension = zend_get_op_array_extension_handle("Zend Observer"); @@ -160,6 +162,11 @@ static void ZEND_FASTCALL _zend_observe_fcall_begin(zend_execute_data *execute_d return; } + if (first_observed_frame == NULL) { + first_observed_frame = execute_data; + } + current_observed_frame = execute_data; + end = fcall_data->end; for (handlers = fcall_data->handlers; handlers != end; ++handlers) { if (handlers->begin) { @@ -208,6 +215,25 @@ ZEND_API void ZEND_FASTCALL zend_observer_fcall_end( handlers->end(execute_data, return_value); } } + + if (first_observed_frame == execute_data) { + first_observed_frame = NULL; + current_observed_frame = NULL; + } else { + current_observed_frame = execute_data->prev_execute_data; + } +} + +ZEND_API void zend_observer_fcall_end_all(void) +{ + zend_execute_data *ex = current_observed_frame; + while (ex != NULL) { + if (ex->func->type != ZEND_INTERNAL_FUNCTION) { + zend_observer_fcall_end(ex, NULL); + } + ex = ex->prev_execute_data; + } + current_observed_frame = NULL; } ZEND_API void zend_observer_error_register(zend_observer_error_cb cb) diff --git a/Zend/zend_observer.h b/Zend/zend_observer.h index 1d20306a17018..cb29729ec45da 100644 --- a/Zend/zend_observer.h +++ b/Zend/zend_observer.h @@ -70,6 +70,8 @@ ZEND_API void ZEND_FASTCALL zend_observer_fcall_end( zend_execute_data *execute_data, zval *return_value); +ZEND_API void zend_observer_fcall_end_all(void); + typedef void (*zend_observer_error_cb)(int type, const char *error_filename, uint32_t error_lineno, zend_string *message); ZEND_API void zend_observer_error_register(zend_observer_error_cb callback); diff --git a/Zend/zend_signal.c b/Zend/zend_signal.c index 80feecd98ff3a..af3ef8cbc6d7c 100644 --- a/Zend/zend_signal.c +++ b/Zend/zend_signal.c @@ -62,7 +62,8 @@ ZEND_API zend_signal_globals_t zend_signal_globals; static void zend_signal_handler(int signo, siginfo_t *siginfo, void *context); static int zend_signal_register(int signo, void (*handler)(int, siginfo_t*, void*)); -#ifdef __CYGWIN__ +#if defined(__CYGWIN__) || defined(__PASE__) +/* Matches zend_excute_API.c; these platforms don't support ITIMER_PROF. */ #define TIMEOUT_SIG SIGALRM #else #define TIMEOUT_SIG SIGPROF diff --git a/Zend/zend_string.h b/Zend/zend_string.h index 557042b3e31c7..96f1a6f4a072d 100644 --- a/Zend/zend_string.h +++ b/Zend/zend_string.h @@ -195,6 +195,19 @@ static zend_always_inline zend_string *zend_string_dup(zend_string *s, bool pers } } +static zend_always_inline zend_string *zend_string_separate(zend_string *s, bool persistent) +{ + if (ZSTR_IS_INTERNED(s) || GC_REFCOUNT(s) > 1) { + if (!ZSTR_IS_INTERNED(s)) { + GC_DELREF(s); + } + return zend_string_init(ZSTR_VAL(s), ZSTR_LEN(s), persistent); + } + + zend_string_forget_hash_val(s); + return s; +} + static zend_always_inline zend_string *zend_string_realloc(zend_string *s, size_t len, bool persistent) { zend_string *ret; diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index c8e7774efcbe3..2932bfbdfaaef 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -4239,9 +4239,11 @@ ZEND_VM_INLINE_HANDLER(62, ZEND_RETURN, CONST|TMP|VAR|CV, ANY, SPEC(OBSERVER)) USE_OPLINE zval *retval_ptr; zval *return_value; + ZEND_OBSERVER_USE_RETVAL; retval_ptr = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R); return_value = EX(return_value); + ZEND_OBSERVER_SET_RETVAL(); if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(retval_ptr) == IS_UNDEF)) { SAVE_OPLINE(); retval_ptr = ZVAL_UNDEFINED_OP1(); @@ -4305,6 +4307,7 @@ ZEND_VM_INLINE_HANDLER(62, ZEND_RETURN, CONST|TMP|VAR|CV, ANY, SPEC(OBSERVER)) } ZEND_OBSERVER_SAVE_OPLINE(); ZEND_OBSERVER_FCALL_END(execute_data, return_value); + ZEND_OBSERVER_FREE_RETVAL(); ZEND_VM_DISPATCH_TO_HELPER(zend_leave_helper); } @@ -4312,9 +4315,13 @@ ZEND_VM_COLD_CONST_HANDLER(111, ZEND_RETURN_BY_REF, CONST|TMP|VAR|CV, ANY, SRC, { USE_OPLINE zval *retval_ptr; + zval *return_value; + ZEND_OBSERVER_USE_RETVAL; SAVE_OPLINE(); + return_value = EX(return_value); + ZEND_OBSERVER_SET_RETVAL(); do { if ((OP1_TYPE & (IS_CONST|IS_TMP_VAR)) || (OP1_TYPE == IS_VAR && opline->extended_value == ZEND_RETURNS_VALUE)) { @@ -4322,15 +4329,15 @@ ZEND_VM_COLD_CONST_HANDLER(111, ZEND_RETURN_BY_REF, CONST|TMP|VAR|CV, ANY, SRC, zend_error(E_NOTICE, "Only variable references should be returned by reference"); retval_ptr = GET_OP1_ZVAL_PTR(BP_VAR_R); - if (!EX(return_value)) { + if (!return_value) { FREE_OP1(); } else { if (OP1_TYPE == IS_VAR && UNEXPECTED(Z_ISREF_P(retval_ptr))) { - ZVAL_COPY_VALUE(EX(return_value), retval_ptr); + ZVAL_COPY_VALUE(return_value, retval_ptr); break; } - ZVAL_NEW_REF(EX(return_value), retval_ptr); + ZVAL_NEW_REF(return_value, retval_ptr); if (OP1_TYPE == IS_CONST) { Z_TRY_ADDREF_P(retval_ptr); } @@ -4344,8 +4351,8 @@ ZEND_VM_COLD_CONST_HANDLER(111, ZEND_RETURN_BY_REF, CONST|TMP|VAR|CV, ANY, SRC, ZEND_ASSERT(retval_ptr != &EG(uninitialized_zval)); if (opline->extended_value == ZEND_RETURNS_FUNCTION && !Z_ISREF_P(retval_ptr)) { zend_error(E_NOTICE, "Only variable references should be returned by reference"); - if (EX(return_value)) { - ZVAL_NEW_REF(EX(return_value), retval_ptr); + if (return_value) { + ZVAL_NEW_REF(return_value, retval_ptr); } else { FREE_OP1_VAR_PTR(); } @@ -4353,19 +4360,20 @@ ZEND_VM_COLD_CONST_HANDLER(111, ZEND_RETURN_BY_REF, CONST|TMP|VAR|CV, ANY, SRC, } } - if (EX(return_value)) { + if (return_value) { if (Z_ISREF_P(retval_ptr)) { Z_ADDREF_P(retval_ptr); } else { ZVAL_MAKE_REF_EX(retval_ptr, 2); } - ZVAL_REF(EX(return_value), Z_REF_P(retval_ptr)); + ZVAL_REF(return_value, Z_REF_P(retval_ptr)); } FREE_OP1_VAR_PTR(); } while (0); - ZEND_OBSERVER_FCALL_END(execute_data, EX(return_value)); + ZEND_OBSERVER_FCALL_END(execute_data, return_value); + ZEND_OBSERVER_FREE_RETVAL(); ZEND_VM_DISPATCH_TO_HELPER(zend_leave_helper); } @@ -7710,7 +7718,7 @@ ZEND_VM_HELPER(zend_dispatch_try_catch_finally_helper, ANY, ANY, uint32_t try_ca /* Uncaught exception */ if (zend_observer_fcall_op_array_extension != -1) { - zend_observer_fcall_end(execute_data, EX(return_value)); + zend_observer_fcall_end(execute_data, NULL); } cleanup_live_vars(execute_data, op_num, 0); if (UNEXPECTED((EX_CALL_INFO() & ZEND_CALL_GENERATOR) != 0)) { diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 6fca6f4d138c9..60d725b3654be 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -2905,7 +2905,7 @@ static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_dispatch_try /* Uncaught exception */ if (zend_observer_fcall_op_array_extension != -1) { - zend_observer_fcall_end(execute_data, EX(return_value)); + zend_observer_fcall_end(execute_data, NULL); } cleanup_live_vars(execute_data, op_num, 0); if (UNEXPECTED((EX_CALL_INFO() & ZEND_CALL_GENERATOR) != 0)) { @@ -4021,6 +4021,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_SPEC_CONST_ retval_ptr = RT_CONSTANT(opline, opline->op1); return_value = EX(return_value); + if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(retval_ptr) == IS_UNDEF)) { SAVE_OPLINE(); retval_ptr = ZVAL_UNDEFINED_OP1(); @@ -4084,6 +4085,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_SPEC_CONST_ } + ZEND_VM_TAIL_CALL(zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } @@ -4092,9 +4094,11 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_SPEC_OBSER USE_OPLINE zval *retval_ptr; zval *return_value; + zval observer_retval; retval_ptr = get_zval_ptr_undef(opline->op1_type, opline->op1, BP_VAR_R); return_value = EX(return_value); + if (!return_value) { return_value = &observer_retval; }; if (opline->op1_type == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(retval_ptr) == IS_UNDEF)) { SAVE_OPLINE(); retval_ptr = ZVAL_UNDEFINED_OP1(); @@ -4158,6 +4162,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_SPEC_OBSER } SAVE_OPLINE(); zend_observer_fcall_end(execute_data, return_value); + if (return_value == &observer_retval) { zval_ptr_dtor_nogc(&observer_retval); }; ZEND_VM_TAIL_CALL(zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } @@ -4165,9 +4170,12 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_BY_REF_SPE { USE_OPLINE zval *retval_ptr; + zval *return_value; SAVE_OPLINE(); + return_value = EX(return_value); + do { if ((IS_CONST & (IS_CONST|IS_TMP_VAR)) || (IS_CONST == IS_VAR && opline->extended_value == ZEND_RETURNS_VALUE)) { @@ -4175,15 +4183,15 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_BY_REF_SPE zend_error(E_NOTICE, "Only variable references should be returned by reference"); retval_ptr = RT_CONSTANT(opline, opline->op1); - if (!EX(return_value)) { + if (!return_value) { } else { if (IS_CONST == IS_VAR && UNEXPECTED(Z_ISREF_P(retval_ptr))) { - ZVAL_COPY_VALUE(EX(return_value), retval_ptr); + ZVAL_COPY_VALUE(return_value, retval_ptr); break; } - ZVAL_NEW_REF(EX(return_value), retval_ptr); + ZVAL_NEW_REF(return_value, retval_ptr); if (IS_CONST == IS_CONST) { Z_TRY_ADDREF_P(retval_ptr); } @@ -4197,8 +4205,8 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_BY_REF_SPE ZEND_ASSERT(retval_ptr != &EG(uninitialized_zval)); if (opline->extended_value == ZEND_RETURNS_FUNCTION && !Z_ISREF_P(retval_ptr)) { zend_error(E_NOTICE, "Only variable references should be returned by reference"); - if (EX(return_value)) { - ZVAL_NEW_REF(EX(return_value), retval_ptr); + if (return_value) { + ZVAL_NEW_REF(return_value, retval_ptr); } else { } @@ -4206,17 +4214,18 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_BY_REF_SPE } } - if (EX(return_value)) { + if (return_value) { if (Z_ISREF_P(retval_ptr)) { Z_ADDREF_P(retval_ptr); } else { ZVAL_MAKE_REF_EX(retval_ptr, 2); } - ZVAL_REF(EX(return_value), Z_REF_P(retval_ptr)); + ZVAL_REF(return_value, Z_REF_P(retval_ptr)); } } while (0); + ZEND_VM_TAIL_CALL(zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } @@ -4224,9 +4233,13 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_BY_REF_SPE { USE_OPLINE zval *retval_ptr; + zval *return_value; + zval observer_retval; SAVE_OPLINE(); + return_value = EX(return_value); + if (!return_value) { return_value = &observer_retval; }; do { if ((opline->op1_type & (IS_CONST|IS_TMP_VAR)) || (opline->op1_type == IS_VAR && opline->extended_value == ZEND_RETURNS_VALUE)) { @@ -4234,15 +4247,15 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_BY_REF_SPE zend_error(E_NOTICE, "Only variable references should be returned by reference"); retval_ptr = get_zval_ptr(opline->op1_type, opline->op1, BP_VAR_R); - if (!EX(return_value)) { + if (!return_value) { FREE_OP(opline->op1_type, opline->op1.var); } else { if (opline->op1_type == IS_VAR && UNEXPECTED(Z_ISREF_P(retval_ptr))) { - ZVAL_COPY_VALUE(EX(return_value), retval_ptr); + ZVAL_COPY_VALUE(return_value, retval_ptr); break; } - ZVAL_NEW_REF(EX(return_value), retval_ptr); + ZVAL_NEW_REF(return_value, retval_ptr); if (opline->op1_type == IS_CONST) { Z_TRY_ADDREF_P(retval_ptr); } @@ -4256,8 +4269,8 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_BY_REF_SPE ZEND_ASSERT(retval_ptr != &EG(uninitialized_zval)); if (opline->extended_value == ZEND_RETURNS_FUNCTION && !Z_ISREF_P(retval_ptr)) { zend_error(E_NOTICE, "Only variable references should be returned by reference"); - if (EX(return_value)) { - ZVAL_NEW_REF(EX(return_value), retval_ptr); + if (return_value) { + ZVAL_NEW_REF(return_value, retval_ptr); } else { if (opline->op1_type == IS_VAR) {zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));}; } @@ -4265,19 +4278,20 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_BY_REF_SPE } } - if (EX(return_value)) { + if (return_value) { if (Z_ISREF_P(retval_ptr)) { Z_ADDREF_P(retval_ptr); } else { ZVAL_MAKE_REF_EX(retval_ptr, 2); } - ZVAL_REF(EX(return_value), Z_REF_P(retval_ptr)); + ZVAL_REF(return_value, Z_REF_P(retval_ptr)); } if (opline->op1_type == IS_VAR) {zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));}; } while (0); - zend_observer_fcall_end(execute_data, EX(return_value)); + zend_observer_fcall_end(execute_data, return_value); + if (return_value == &observer_retval) { zval_ptr_dtor_nogc(&observer_retval); }; ZEND_VM_TAIL_CALL(zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } @@ -18528,6 +18542,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_SPEC_TMP_HA retval_ptr = _get_zval_ptr_tmp(opline->op1.var EXECUTE_DATA_CC); return_value = EX(return_value); + if (IS_TMP_VAR == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(retval_ptr) == IS_UNDEF)) { SAVE_OPLINE(); retval_ptr = ZVAL_UNDEFINED_OP1(); @@ -18591,6 +18606,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_SPEC_TMP_HA } + ZEND_VM_TAIL_CALL(zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } @@ -18598,9 +18614,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_BY_REF_SPEC_TMP_HANDLER { USE_OPLINE zval *retval_ptr; + zval *return_value; SAVE_OPLINE(); + return_value = EX(return_value); + do { if ((IS_TMP_VAR & (IS_CONST|IS_TMP_VAR)) || (IS_TMP_VAR == IS_VAR && opline->extended_value == ZEND_RETURNS_VALUE)) { @@ -18608,15 +18627,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_BY_REF_SPEC_TMP_HANDLER zend_error(E_NOTICE, "Only variable references should be returned by reference"); retval_ptr = _get_zval_ptr_tmp(opline->op1.var EXECUTE_DATA_CC); - if (!EX(return_value)) { + if (!return_value) { zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); } else { if (IS_TMP_VAR == IS_VAR && UNEXPECTED(Z_ISREF_P(retval_ptr))) { - ZVAL_COPY_VALUE(EX(return_value), retval_ptr); + ZVAL_COPY_VALUE(return_value, retval_ptr); break; } - ZVAL_NEW_REF(EX(return_value), retval_ptr); + ZVAL_NEW_REF(return_value, retval_ptr); if (IS_TMP_VAR == IS_CONST) { Z_TRY_ADDREF_P(retval_ptr); } @@ -18630,8 +18649,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_BY_REF_SPEC_TMP_HANDLER ZEND_ASSERT(retval_ptr != &EG(uninitialized_zval)); if (opline->extended_value == ZEND_RETURNS_FUNCTION && !Z_ISREF_P(retval_ptr)) { zend_error(E_NOTICE, "Only variable references should be returned by reference"); - if (EX(return_value)) { - ZVAL_NEW_REF(EX(return_value), retval_ptr); + if (return_value) { + ZVAL_NEW_REF(return_value, retval_ptr); } else { } @@ -18639,17 +18658,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_BY_REF_SPEC_TMP_HANDLER } } - if (EX(return_value)) { + if (return_value) { if (Z_ISREF_P(retval_ptr)) { Z_ADDREF_P(retval_ptr); } else { ZVAL_MAKE_REF_EX(retval_ptr, 2); } - ZVAL_REF(EX(return_value), Z_REF_P(retval_ptr)); + ZVAL_REF(return_value, Z_REF_P(retval_ptr)); } } while (0); + ZEND_VM_TAIL_CALL(zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } @@ -21094,6 +21114,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_SPEC_VAR_HA retval_ptr = _get_zval_ptr_var(opline->op1.var EXECUTE_DATA_CC); return_value = EX(return_value); + if (IS_VAR == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(retval_ptr) == IS_UNDEF)) { SAVE_OPLINE(); retval_ptr = ZVAL_UNDEFINED_OP1(); @@ -21157,6 +21178,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_SPEC_VAR_HA } + ZEND_VM_TAIL_CALL(zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } @@ -21164,9 +21186,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_BY_REF_SPEC_VAR_HANDLER { USE_OPLINE zval *retval_ptr; + zval *return_value; SAVE_OPLINE(); + return_value = EX(return_value); + do { if ((IS_VAR & (IS_CONST|IS_TMP_VAR)) || (IS_VAR == IS_VAR && opline->extended_value == ZEND_RETURNS_VALUE)) { @@ -21174,15 +21199,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_BY_REF_SPEC_VAR_HANDLER zend_error(E_NOTICE, "Only variable references should be returned by reference"); retval_ptr = _get_zval_ptr_var(opline->op1.var EXECUTE_DATA_CC); - if (!EX(return_value)) { + if (!return_value) { zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); } else { if (IS_VAR == IS_VAR && UNEXPECTED(Z_ISREF_P(retval_ptr))) { - ZVAL_COPY_VALUE(EX(return_value), retval_ptr); + ZVAL_COPY_VALUE(return_value, retval_ptr); break; } - ZVAL_NEW_REF(EX(return_value), retval_ptr); + ZVAL_NEW_REF(return_value, retval_ptr); if (IS_VAR == IS_CONST) { Z_TRY_ADDREF_P(retval_ptr); } @@ -21196,8 +21221,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_BY_REF_SPEC_VAR_HANDLER ZEND_ASSERT(retval_ptr != &EG(uninitialized_zval)); if (opline->extended_value == ZEND_RETURNS_FUNCTION && !Z_ISREF_P(retval_ptr)) { zend_error(E_NOTICE, "Only variable references should be returned by reference"); - if (EX(return_value)) { - ZVAL_NEW_REF(EX(return_value), retval_ptr); + if (return_value) { + ZVAL_NEW_REF(return_value, retval_ptr); } else { zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); } @@ -21205,18 +21230,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_BY_REF_SPEC_VAR_HANDLER } } - if (EX(return_value)) { + if (return_value) { if (Z_ISREF_P(retval_ptr)) { Z_ADDREF_P(retval_ptr); } else { ZVAL_MAKE_REF_EX(retval_ptr, 2); } - ZVAL_REF(EX(return_value), Z_REF_P(retval_ptr)); + ZVAL_REF(return_value, Z_REF_P(retval_ptr)); } zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); } while (0); + ZEND_VM_TAIL_CALL(zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } @@ -37626,6 +37652,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_SPEC_CV_HAN retval_ptr = EX_VAR(opline->op1.var); return_value = EX(return_value); + if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(retval_ptr) == IS_UNDEF)) { SAVE_OPLINE(); retval_ptr = ZVAL_UNDEFINED_OP1(); @@ -37689,6 +37716,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_SPEC_CV_HAN } + ZEND_VM_TAIL_CALL(zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } @@ -37696,9 +37724,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_BY_REF_SPEC_CV_HANDLER( { USE_OPLINE zval *retval_ptr; + zval *return_value; SAVE_OPLINE(); + return_value = EX(return_value); + do { if ((IS_CV & (IS_CONST|IS_TMP_VAR)) || (IS_CV == IS_VAR && opline->extended_value == ZEND_RETURNS_VALUE)) { @@ -37706,15 +37737,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_BY_REF_SPEC_CV_HANDLER( zend_error(E_NOTICE, "Only variable references should be returned by reference"); retval_ptr = _get_zval_ptr_cv_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC); - if (!EX(return_value)) { + if (!return_value) { } else { if (IS_CV == IS_VAR && UNEXPECTED(Z_ISREF_P(retval_ptr))) { - ZVAL_COPY_VALUE(EX(return_value), retval_ptr); + ZVAL_COPY_VALUE(return_value, retval_ptr); break; } - ZVAL_NEW_REF(EX(return_value), retval_ptr); + ZVAL_NEW_REF(return_value, retval_ptr); if (IS_CV == IS_CONST) { Z_TRY_ADDREF_P(retval_ptr); } @@ -37728,8 +37759,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_BY_REF_SPEC_CV_HANDLER( ZEND_ASSERT(retval_ptr != &EG(uninitialized_zval)); if (opline->extended_value == ZEND_RETURNS_FUNCTION && !Z_ISREF_P(retval_ptr)) { zend_error(E_NOTICE, "Only variable references should be returned by reference"); - if (EX(return_value)) { - ZVAL_NEW_REF(EX(return_value), retval_ptr); + if (return_value) { + ZVAL_NEW_REF(return_value, retval_ptr); } else { } @@ -37737,17 +37768,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_BY_REF_SPEC_CV_HANDLER( } } - if (EX(return_value)) { + if (return_value) { if (Z_ISREF_P(retval_ptr)) { Z_ADDREF_P(retval_ptr); } else { ZVAL_MAKE_REF_EX(retval_ptr, 2); } - ZVAL_REF(EX(return_value), Z_REF_P(retval_ptr)); + ZVAL_REF(return_value, Z_REF_P(retval_ptr)); } } while (0); + ZEND_VM_TAIL_CALL(zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } @@ -50794,15 +50826,34 @@ ZEND_API void execute_ex(zend_execute_data *ex) { DCL_OPLINE +#if defined(ZEND_VM_IP_GLOBAL_REG) || defined(ZEND_VM_IP_GLOBAL_REG) + struct { #ifdef ZEND_VM_IP_GLOBAL_REG - const zend_op *orig_opline = opline; + const zend_op *orig_opline; #endif #ifdef ZEND_VM_FP_GLOBAL_REG - zend_execute_data *orig_execute_data = execute_data; + zend_execute_data *orig_execute_data; +#ifdef ZEND_VM_HYBRID_JIT_RED_ZONE_SIZE + char hybrid_jit_red_zone[ZEND_VM_HYBRID_JIT_RED_ZONE_SIZE]; +#endif +#endif + } vm_stack_data; +#endif +#ifdef ZEND_VM_IP_GLOBAL_REG + vm_stack_data.orig_opline = opline; +#endif +#ifdef ZEND_VM_FP_GLOBAL_REG + vm_stack_data.orig_execute_data = execute_data; execute_data = ex; #else zend_execute_data *execute_data = ex; #endif +#ifdef ZEND_VM_HYBRID_JIT_RED_ZONE_SIZE + memset(vm_stack_data.hybrid_jit_red_zone, 0, ZEND_VM_HYBRID_JIT_RED_ZONE_SIZE); + if (zend_touch_vm_stack_data) { + zend_touch_vm_stack_data(&vm_stack_data); + } +#endif #if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID) if (UNEXPECTED(execute_data == NULL)) { @@ -54693,6 +54744,7 @@ ZEND_API void execute_ex(zend_execute_data *ex) retval_ptr = RT_CONSTANT(opline, opline->op1); return_value = EX(return_value); + if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(retval_ptr) == IS_UNDEF)) { SAVE_OPLINE(); retval_ptr = ZVAL_UNDEFINED_OP1(); @@ -54756,6 +54808,7 @@ ZEND_API void execute_ex(zend_execute_data *ex) } + goto zend_leave_helper_SPEC_LABEL; } @@ -54765,9 +54818,11 @@ ZEND_API void execute_ex(zend_execute_data *ex) USE_OPLINE zval *retval_ptr; zval *return_value; + zval observer_retval; retval_ptr = get_zval_ptr_undef(opline->op1_type, opline->op1, BP_VAR_R); return_value = EX(return_value); + if (!return_value) { return_value = &observer_retval; }; if (opline->op1_type == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(retval_ptr) == IS_UNDEF)) { SAVE_OPLINE(); retval_ptr = ZVAL_UNDEFINED_OP1(); @@ -54831,6 +54886,7 @@ ZEND_API void execute_ex(zend_execute_data *ex) } SAVE_OPLINE(); zend_observer_fcall_end(execute_data, return_value); + if (return_value == &observer_retval) { zval_ptr_dtor_nogc(&observer_retval); }; goto zend_leave_helper_SPEC_LABEL; } @@ -56303,6 +56359,7 @@ ZEND_API void execute_ex(zend_execute_data *ex) retval_ptr = _get_zval_ptr_tmp(opline->op1.var EXECUTE_DATA_CC); return_value = EX(return_value); + if (IS_TMP_VAR == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(retval_ptr) == IS_UNDEF)) { SAVE_OPLINE(); retval_ptr = ZVAL_UNDEFINED_OP1(); @@ -56366,6 +56423,7 @@ ZEND_API void execute_ex(zend_execute_data *ex) } + goto zend_leave_helper_SPEC_LABEL; } @@ -56602,6 +56660,7 @@ ZEND_API void execute_ex(zend_execute_data *ex) retval_ptr = _get_zval_ptr_var(opline->op1.var EXECUTE_DATA_CC); return_value = EX(return_value); + if (IS_VAR == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(retval_ptr) == IS_UNDEF)) { SAVE_OPLINE(); retval_ptr = ZVAL_UNDEFINED_OP1(); @@ -56665,6 +56724,7 @@ ZEND_API void execute_ex(zend_execute_data *ex) } + goto zend_leave_helper_SPEC_LABEL; } @@ -57717,6 +57777,7 @@ ZEND_API void execute_ex(zend_execute_data *ex) retval_ptr = EX_VAR(opline->op1.var); return_value = EX(return_value); + if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(retval_ptr) == IS_UNDEF)) { SAVE_OPLINE(); retval_ptr = ZVAL_UNDEFINED_OP1(); @@ -57780,6 +57841,7 @@ ZEND_API void execute_ex(zend_execute_data *ex) } + goto zend_leave_helper_SPEC_LABEL; } @@ -58745,10 +58807,10 @@ ZEND_API void execute_ex(zend_execute_data *ex) HYBRID_BREAK(); HYBRID_CASE(HYBRID_HALT): #ifdef ZEND_VM_FP_GLOBAL_REG - execute_data = orig_execute_data; + execute_data = vm_stack_data.orig_execute_data; #endif #ifdef ZEND_VM_IP_GLOBAL_REG - opline = orig_opline; + opline = vm_stack_data.orig_opline; #endif return; HYBRID_DEFAULT: @@ -58757,9 +58819,9 @@ ZEND_API void execute_ex(zend_execute_data *ex) HYBRID_BREAK(); /* Never reached */ #else #ifdef ZEND_VM_FP_GLOBAL_REG - execute_data = orig_execute_data; + execute_data = vm_stack_data.orig_execute_data; # ifdef ZEND_VM_IP_GLOBAL_REG - opline = orig_opline; + opline = vm_stack_data.orig_opline; # endif return; #else @@ -58768,7 +58830,7 @@ ZEND_API void execute_ex(zend_execute_data *ex) ZEND_VM_LOOP_INTERRUPT_CHECK(); } else { # ifdef ZEND_VM_IP_GLOBAL_REG - opline = orig_opline; + opline = vm_stack_data.orig_opline; # endif return; } diff --git a/Zend/zend_vm_gen.php b/Zend/zend_vm_gen.php index f8baea0d053c7..0795822f96558 100755 --- a/Zend/zend_vm_gen.php +++ b/Zend/zend_vm_gen.php @@ -794,6 +794,9 @@ function gen_code($f, $spec, $kind, $code, $op1, $op2, $name, $extra_spec=null) ($extra_spec['ISSET'] == 0 ? "\\0" : "opline->extended_value") : "\\0", "/ZEND_OBSERVER_ENABLED/" => isset($extra_spec['OBSERVER']) && $extra_spec['OBSERVER'] == 1 ? "1" : "0", + "/ZEND_OBSERVER_USE_RETVAL/" => isset($extra_spec['OBSERVER']) && $extra_spec['OBSERVER'] == 1 ? "zval observer_retval" : "", + "/ZEND_OBSERVER_SET_RETVAL\(\)/" => isset($extra_spec['OBSERVER']) && $extra_spec['OBSERVER'] == 1 ? "if (!return_value) { return_value = &observer_retval; }" : "", + "/ZEND_OBSERVER_FREE_RETVAL\(\)/" => isset($extra_spec['OBSERVER']) && $extra_spec['OBSERVER'] == 1 ? "if (return_value == &observer_retval) { zval_ptr_dtor_nogc(&observer_retval); }" : "", "/ZEND_OBSERVER_SAVE_OPLINE\(\)/" => isset($extra_spec['OBSERVER']) && $extra_spec['OBSERVER'] == 1 ? "SAVE_OPLINE()" : "", "/ZEND_OBSERVER_FCALL_BEGIN\(\s*(.*)\s*\)/" => isset($extra_spec['OBSERVER']) ? ($extra_spec['OBSERVER'] == 0 ? "" : "zend_observer_fcall_begin(\\1)") @@ -1777,10 +1780,10 @@ function gen_executor_code($f, $spec, $kind, $prolog, &$switch_labels = array()) case ZEND_VM_KIND_HYBRID: out($f,"\t\t\tHYBRID_CASE(HYBRID_HALT):\n"); out($f,"#ifdef ZEND_VM_FP_GLOBAL_REG\n"); - out($f,"\t\t\t\texecute_data = orig_execute_data;\n"); + out($f,"\t\t\t\texecute_data = vm_stack_data.orig_execute_data;\n"); out($f,"#endif\n"); out($f,"#ifdef ZEND_VM_IP_GLOBAL_REG\n"); - out($f,"\t\t\t\topline = orig_opline;\n"); + out($f,"\t\t\t\topline = vm_stack_data.orig_opline;\n"); out($f,"#endif\n"); out($f,"\t\t\t\treturn;\n"); out($f,"\t\t\tHYBRID_DEFAULT:\n"); @@ -2062,15 +2065,34 @@ function gen_executor($f, $skl, $spec, $kind, $executor_name, $initializer_name) out($f,$m[1]."zend_execute_data *execute_data = ex;\n"); out($f,"#endif\n"); } else { + out($f,"#if defined(ZEND_VM_IP_GLOBAL_REG) || defined(ZEND_VM_IP_GLOBAL_REG)\n"); + out($f,$m[1]."struct {\n"); out($f,"#ifdef ZEND_VM_IP_GLOBAL_REG\n"); - out($f,$m[1]."const zend_op *orig_opline = opline;\n"); + out($f,$m[1]."\tconst zend_op *orig_opline;\n"); out($f,"#endif\n"); out($f,"#ifdef ZEND_VM_FP_GLOBAL_REG\n"); - out($f,$m[1]."zend_execute_data *orig_execute_data = execute_data;\n"); + out($f,$m[1]."\tzend_execute_data *orig_execute_data;\n"); + out($f,"#ifdef ZEND_VM_HYBRID_JIT_RED_ZONE_SIZE\n"); + out($f,$m[1]."\tchar hybrid_jit_red_zone[ZEND_VM_HYBRID_JIT_RED_ZONE_SIZE];\n"); + out($f,"#endif\n"); + out($f,"#endif\n"); + out($f,$m[1]."} vm_stack_data;\n"); + out($f,"#endif\n"); + out($f,"#ifdef ZEND_VM_IP_GLOBAL_REG\n"); + out($f,$m[1]."vm_stack_data.orig_opline = opline;\n"); + out($f,"#endif\n"); + out($f,"#ifdef ZEND_VM_FP_GLOBAL_REG\n"); + out($f,$m[1]."vm_stack_data.orig_execute_data = execute_data;\n"); out($f,$m[1]."execute_data = ex;\n"); out($f,"#else\n"); out($f,$m[1]."zend_execute_data *execute_data = ex;\n"); out($f,"#endif\n"); + out($f,"#ifdef ZEND_VM_HYBRID_JIT_RED_ZONE_SIZE\n"); + out($f,$m[1]."memset(vm_stack_data.hybrid_jit_red_zone, 0, ZEND_VM_HYBRID_JIT_RED_ZONE_SIZE);\n"); + out($f,$m[1]."if (zend_touch_vm_stack_data) {\n"); + out($f,$m[1]."\tzend_touch_vm_stack_data(&vm_stack_data);\n"); + out($f,$m[1]."}\n"); + out($f,"#endif\n"); } break; case "INTERNAL_LABELS": @@ -2156,9 +2178,9 @@ function gen_executor($f, $skl, $spec, $kind, $executor_name, $initializer_name) } out($f, "#ifdef ZEND_VM_FP_GLOBAL_REG\n" . - $m[1]."execute_data = orig_execute_data;\n" . + $m[1]."execute_data = vm_stack_data.orig_execute_data;\n" . "# ifdef ZEND_VM_IP_GLOBAL_REG\n" . - $m[1]."opline = orig_opline;\n" . + $m[1]."opline = vm_stack_data.orig_opline;\n" . "# endif\n" . $m[1]."return;\n" . "#else\n" . @@ -2167,7 +2189,7 @@ function gen_executor($f, $skl, $spec, $kind, $executor_name, $initializer_name) $m[1]."\tZEND_VM_LOOP_INTERRUPT_CHECK();\n". $m[1]."} else {\n" . "# ifdef ZEND_VM_IP_GLOBAL_REG\n" . - $m[1]."\topline = orig_opline;\n" . + $m[1]."\topline = vm_stack_data.orig_opline;\n" . "# endif\n". $m[1]."\treturn;\n". $m[1]."}\n". @@ -2575,6 +2597,12 @@ function gen_vm($def, $skel) { fputs($f, "#define ZEND_VM_KIND\t\t" . $GLOBALS["vm_kind_name"][ZEND_VM_KIND] . "\n"); } fputs($f, "\n"); + fputs($f, "#if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID) && !defined(__SANITIZE_ADDRESS__)\n"); + fputs($f, "# if ((defined(i386) && !defined(__PIC__)) || defined(__x86_64__) || defined(_M_X64))\n"); + fputs($f, "# define ZEND_VM_HYBRID_JIT_RED_ZONE_SIZE 16\n"); + fputs($f, "# endif\n"); + fputs($f, "#endif\n"); + fputs($f, "\n"); foreach($vm_op_flags as $name => $val) { fprintf($f, "#define %-24s 0x%08x\n", $name, $val); } diff --git a/Zend/zend_vm_opcodes.h b/Zend/zend_vm_opcodes.h index df5a14799953a..653e320b85d54 100644 --- a/Zend/zend_vm_opcodes.h +++ b/Zend/zend_vm_opcodes.h @@ -34,6 +34,12 @@ # define ZEND_VM_KIND ZEND_VM_KIND_CALL #endif +#if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID) && !defined(__SANITIZE_ADDRESS__) +# if ((defined(i386) && !defined(__PIC__)) || defined(__x86_64__) || defined(_M_X64)) +# define ZEND_VM_HYBRID_JIT_RED_ZONE_SIZE 16 +# endif +#endif + #define ZEND_VM_OP_SPEC 0x00000001 #define ZEND_VM_OP_CONST 0x00000002 #define ZEND_VM_OP_TMPVAR 0x00000004 diff --git a/Zend/zend_weakrefs.c b/Zend/zend_weakrefs.c index 04c50432103cf..85b56518abc30 100644 --- a/Zend/zend_weakrefs.c +++ b/Zend/zend_weakrefs.c @@ -402,12 +402,12 @@ static HashTable *zend_weakmap_get_properties_for(zend_object *object, zend_prop zend_ulong obj_addr; zval *val; ZEND_HASH_FOREACH_NUM_KEY_VAL(&wm->ht, obj_addr, val) { + zend_object *obj = (zend_object*)obj_addr; zval pair; - zval obj_zv; array_init(&pair); - ZVAL_OBJ_COPY(&obj_zv, (zend_object *) obj_addr); - add_assoc_zval(&pair, "key", &obj_zv); + GC_ADDREF(obj); + add_assoc_object(&pair, "key", obj); Z_TRY_ADDREF_P(val); add_assoc_zval(&pair, "value", val); diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 1932b1cdeeebb..7517e58bf2094 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -85,7 +85,7 @@ jobs: configurationName: DEBUG_ZTS_MSAN configurationParameters: '--enable-debug --enable-zts' runTestsParameters: --msan - timeoutInMinutes: 90 + timeoutInMinutes: 120 - template: azure/community_job.yml parameters: configurationName: COMMUNITY diff --git a/azure/coverage_job.yml b/azure/coverage_job.yml index 01bde10281c59..184ebcfafa779 100644 --- a/azure/coverage_job.yml +++ b/azure/coverage_job.yml @@ -32,10 +32,13 @@ jobs: runTestsParameters: >- ${{ parameters.runTestsParameters }} -d zend_extension=opcache.so + - script: bash <(curl -s https://codecov.io/bash) + displayName: 'Upload ${{ parameters.configurationName }} Test Coverage to Codecov.io' + condition: or(succeeded(), failed()) - script: | make gcovr-xml mv gcovr.xml coverage.xml - displayName: 'Generate ${{ parameters.configurationName }} Test Coverage' + displayName: 'Generate ${{ parameters.configurationName }} Test Coverage Cobertura XML Report' condition: or(succeeded(), failed()) - task: PublishCodeCoverageResults@1 inputs: diff --git a/azure/macos/job.yml b/azure/macos/job.yml index 39fe19268b9fd..de22bbb2ddd24 100644 --- a/azure/macos/job.yml +++ b/azure/macos/job.yml @@ -21,7 +21,6 @@ jobs: ./configure ${{ parameters.configurationParameters }} \ --enable-option-checking=fatal \ --prefix=/usr/local \ - --disable-phpdbg \ --enable-fpm \ --with-pdo-mysql=mysqlnd \ --with-mysqli=mysqlnd \ diff --git a/build/libtool.m4 b/build/libtool.m4 index 97cd79029efc2..e69603679d861 100644 --- a/build/libtool.m4 +++ b/build/libtool.m4 @@ -340,7 +340,7 @@ AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS],[ _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 10.[[012]]*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; - 10.*) + *) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; @@ -1522,7 +1522,7 @@ darwin* | rhapsody*) shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' ifelse([$1], [],[ - sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; @@ -5800,7 +5800,7 @@ _LT_EOF 10.[[012]]) _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; - 10.*) + *) _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}dynamic_lookup' ;; esac diff --git a/build/php.m4 b/build/php.m4 index fe2f176e3cb33..70abfc864c869 100644 --- a/build/php.m4 +++ b/build/php.m4 @@ -478,7 +478,7 @@ dnl Internal, don't use. dnl AC_DEFUN([_PHP_ADD_LIBRARY_SKELETON],[ case $1 in - c|c_r|pthread*[)] ;; + c|c_r[)] ;; *[)] ifelse($3,,[ _PHP_X_ADD_LIBRARY($1,$2,$5) ],[ diff --git a/configure.ac b/configure.ac index 6b33047538fe2..cc791157acf1e 100644 --- a/configure.ac +++ b/configure.ac @@ -222,12 +222,6 @@ case $host_alias in *dgux*) CPPFLAGS="$CPPFLAGS -D_BSD_TIMEOFDAY_FLAVOR" ;; - *darwin*) - if test -n "$GCC"; then - AX_CHECK_COMPILE_FLAG([-no-cpp-precomp], - [CPPFLAGS="$CPPFLAGS -no-cpp-precomp"]) - fi - ;; *mips*) CPPFLAGS="$CPPFLAGS -D_XPG_IV" ;; @@ -797,6 +791,19 @@ if test "$PHP_DEBUG_ASSERTIONS" = "yes"; then ZEND_DEBUG=yes fi +AC_ARG_ENABLE([zts], + [AS_HELP_STRING([--enable-zts], + [Enable thread safety])], + [ZEND_ZTS=$enableval], + [ZEND_ZTS=no]) + +if test "$ZEND_ZTS" = "yes"; then + AC_DEFINE(ZTS, 1,[ ]) + PHP_THREAD_SAFETY=yes +else + PHP_THREAD_SAFETY=no +fi + PHP_ARG_ENABLE([rtld-now], [whether to dlopen extensions with RTLD_NOW instead of RTLD_LAZY], [AS_HELP_STRING([--enable-rtld-now], @@ -1136,13 +1143,6 @@ LIBZEND_BASIC_CHECKS LIBZEND_DLSYM_CHECK LIBZEND_OTHER_CHECKS -if test "$ZEND_ZTS" = "yes"; then - AC_DEFINE(ZTS,1,[ ]) - PHP_THREAD_SAFETY=yes -else - PHP_THREAD_SAFETY=no -fi - INCLUDES="$INCLUDES -I\$(top_builddir)/TSRM" INCLUDES="$INCLUDES -I\$(top_builddir)/Zend" diff --git a/ext/bcmath/libbcmath/src/sqrt.c b/ext/bcmath/libbcmath/src/sqrt.c index 6358ff7bcd617..96cff294754a7 100644 --- a/ext/bcmath/libbcmath/src/sqrt.c +++ b/ext/bcmath/libbcmath/src/sqrt.c @@ -70,7 +70,6 @@ bc_sqrt (bc_num *num, int scale) /* Initialize the variables. */ rscale = MAX (scale, (*num)->n_scale); - bc_init_num(&guess); bc_init_num(&guess1); bc_init_num(&diff); point5 = bc_new_num (1,1); @@ -87,6 +86,7 @@ bc_sqrt (bc_num *num, int scale) else { /* The number is greater than 1. Guess should start at 10^(exp/2). */ + bc_init_num(&guess); bc_int2num (&guess,10); bc_int2num (&guess1,(*num)->n_len); diff --git a/ext/bcmath/tests/bcsqrt.phpt b/ext/bcmath/tests/bcsqrt.phpt index 9f4a8ec6a577c..b2a8d8adbc16a 100644 --- a/ext/bcmath/tests/bcsqrt.phpt +++ b/ext/bcmath/tests/bcsqrt.phpt @@ -9,8 +9,10 @@ bcmath.scale=0 echo bcsqrt("9"),"\n"; echo bcsqrt("9.444", 2),"\n"; echo bcsqrt("1928372132132819737213", 5),"\n"; +echo bcsqrt("0.5", 5), "\n"; ?> --EXPECT-- 3 3.07 43913234134.28826 +0.70710 diff --git a/ext/com_dotnet/com_persist.stub.php b/ext/com_dotnet/com_persist.stub.php index 381c086188492..b0e9ef6b5c785 100644 --- a/ext/com_dotnet/com_persist.stub.php +++ b/ext/com_dotnet/com_persist.stub.php @@ -4,7 +4,7 @@ final class COMPersistHelper { - public function __construct(?variant $variant) {} + public function __construct(?variant $variant = null) {} public function GetCurFileName(): string|false {} diff --git a/ext/com_dotnet/com_persist_arginfo.h b/ext/com_dotnet/com_persist_arginfo.h index 7c4a964545d67..dc8bd6fa4817f 100644 --- a/ext/com_dotnet/com_persist_arginfo.h +++ b/ext/com_dotnet/com_persist_arginfo.h @@ -1,8 +1,8 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: d04d007cac328014c6cc76a00cc291237965d56d */ + * Stub hash: 2c2759e6c1894713439e3ee8da7f56810d00d8cf */ -ZEND_BEGIN_ARG_INFO_EX(arginfo_class_COMPersistHelper___construct, 0, 0, 1) - ZEND_ARG_OBJ_INFO(0, variant, variant, 1) +ZEND_BEGIN_ARG_INFO_EX(arginfo_class_COMPersistHelper___construct, 0, 0, 0) + ZEND_ARG_OBJ_INFO_WITH_DEFAULT_VALUE(0, variant, variant, 1, "null") ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_class_COMPersistHelper_GetCurFileName, 0, 0, MAY_BE_STRING|MAY_BE_FALSE) diff --git a/ext/com_dotnet/tests/variants.phpt b/ext/com_dotnet/tests/variants.phpt index 0bcd473f610e3..e28823c3ad7f5 100644 --- a/ext/com_dotnet/tests/variants.phpt +++ b/ext/com_dotnet/tests/variants.phpt @@ -34,7 +34,7 @@ foreach ($values as $t => $val) { echo "$op:\n"; echo "\tvariant_$op($v, $op2)\n"; echo "\texception " . $e->getMessage(); - printf("\tcode %08x\n\n", $e->getCode()); + printf("\n\tcode %08x\n\n", $e->getCode()); } } } @@ -74,63 +74,63 @@ xor: 46 -- add: variant_add(42, hello) - exception Type mismatch. + exception Type mismatch code 80020005 cat: 42hello sub: variant_sub(42, hello) - exception Type mismatch. + exception Type mismatch code 80020005 mul: variant_mul(42, hello) - exception Type mismatch. + exception Type mismatch code 80020005 and: variant_and(42, hello) - exception Type mismatch. + exception Type mismatch code 80020005 div: variant_div(42, hello) - exception Type mismatch. + exception Type mismatch code 80020005 eqv: variant_eqv(42, hello) - exception Type mismatch. + exception Type mismatch code 80020005 idiv: variant_idiv(42, hello) - exception Type mismatch. + exception Type mismatch code 80020005 imp: variant_imp(42, hello) - exception Type mismatch. + exception Type mismatch code 80020005 mod: variant_mod(42, hello) - exception Type mismatch. + exception Type mismatch code 80020005 or: variant_or(42, hello) - exception Type mismatch. + exception Type mismatch code 80020005 pow: variant_pow(42, hello) - exception Type mismatch. + exception Type mismatch code 80020005 xor: variant_xor(42, hello) - exception Type mismatch. + exception Type mismatch code 80020005 -- @@ -141,19 +141,19 @@ mul: 0 and: 0 div: variant_div(42, ) - exception Division by zero. + exception Division by zero code 80020012 eqv: -43 idiv: variant_idiv(42, ) - exception Division by zero. + exception Division by zero code 80020012 imp: -43 mod: variant_mod(42, ) - exception Division by zero. + exception Division by zero code 80020012 or: 42 @@ -190,63 +190,63 @@ xor: 0 -- add: variant_add(3.5, hello) - exception Type mismatch. + exception Type mismatch code 80020005 cat: 3.5hello sub: variant_sub(3.5, hello) - exception Type mismatch. + exception Type mismatch code 80020005 mul: variant_mul(3.5, hello) - exception Type mismatch. + exception Type mismatch code 80020005 and: variant_and(3.5, hello) - exception Type mismatch. + exception Type mismatch code 80020005 div: variant_div(3.5, hello) - exception Type mismatch. + exception Type mismatch code 80020005 eqv: variant_eqv(3.5, hello) - exception Type mismatch. + exception Type mismatch code 80020005 idiv: variant_idiv(3.5, hello) - exception Type mismatch. + exception Type mismatch code 80020005 imp: variant_imp(3.5, hello) - exception Type mismatch. + exception Type mismatch code 80020005 mod: variant_mod(3.5, hello) - exception Type mismatch. + exception Type mismatch code 80020005 or: variant_or(3.5, hello) - exception Type mismatch. + exception Type mismatch code 80020005 pow: variant_pow(3.5, hello) - exception Type mismatch. + exception Type mismatch code 80020005 xor: variant_xor(3.5, hello) - exception Type mismatch. + exception Type mismatch code 80020005 -- @@ -257,19 +257,19 @@ mul: 0 and: 0 div: variant_div(3.5, ) - exception Division by zero. + exception Division by zero code 80020012 eqv: -5 idiv: variant_idiv(3.5, ) - exception Division by zero. + exception Division by zero code 80020012 imp: -5 mod: variant_mod(3.5, ) - exception Division by zero. + exception Division by zero code 80020012 or: 4 @@ -278,125 +278,125 @@ xor: 4 -- add: variant_add(hello, 42) - exception Type mismatch. + exception Type mismatch code 80020005 cat: hello42 sub: variant_sub(hello, 42) - exception Type mismatch. + exception Type mismatch code 80020005 mul: variant_mul(hello, 42) - exception Type mismatch. + exception Type mismatch code 80020005 and: variant_and(hello, 42) - exception Type mismatch. + exception Type mismatch code 80020005 div: variant_div(hello, 42) - exception Type mismatch. + exception Type mismatch code 80020005 eqv: variant_eqv(hello, 42) - exception Type mismatch. + exception Type mismatch code 80020005 idiv: variant_idiv(hello, 42) - exception Type mismatch. + exception Type mismatch code 80020005 imp: variant_imp(hello, 42) - exception Type mismatch. + exception Type mismatch code 80020005 mod: variant_mod(hello, 42) - exception Type mismatch. + exception Type mismatch code 80020005 or: variant_or(hello, 42) - exception Type mismatch. + exception Type mismatch code 80020005 pow: variant_pow(hello, 42) - exception Type mismatch. + exception Type mismatch code 80020005 xor: variant_xor(hello, 42) - exception Type mismatch. + exception Type mismatch code 80020005 -- add: variant_add(hello, 3.5) - exception Type mismatch. + exception Type mismatch code 80020005 cat: hello3.5 sub: variant_sub(hello, 3.5) - exception Type mismatch. + exception Type mismatch code 80020005 mul: variant_mul(hello, 3.5) - exception Type mismatch. + exception Type mismatch code 80020005 and: variant_and(hello, 3.5) - exception Type mismatch. + exception Type mismatch code 80020005 div: variant_div(hello, 3.5) - exception Type mismatch. + exception Type mismatch code 80020005 eqv: variant_eqv(hello, 3.5) - exception Type mismatch. + exception Type mismatch code 80020005 idiv: variant_idiv(hello, 3.5) - exception Type mismatch. + exception Type mismatch code 80020005 imp: variant_imp(hello, 3.5) - exception Type mismatch. + exception Type mismatch code 80020005 mod: variant_mod(hello, 3.5) - exception Type mismatch. + exception Type mismatch code 80020005 or: variant_or(hello, 3.5) - exception Type mismatch. + exception Type mismatch code 80020005 pow: variant_pow(hello, 3.5) - exception Type mismatch. + exception Type mismatch code 80020005 xor: variant_xor(hello, 3.5) - exception Type mismatch. + exception Type mismatch code 80020005 -- @@ -404,119 +404,119 @@ add: hellohello cat: hellohello sub: variant_sub(hello, hello) - exception Type mismatch. + exception Type mismatch code 80020005 mul: variant_mul(hello, hello) - exception Type mismatch. + exception Type mismatch code 80020005 and: variant_and(hello, hello) - exception Type mismatch. + exception Type mismatch code 80020005 div: variant_div(hello, hello) - exception Type mismatch. + exception Type mismatch code 80020005 eqv: variant_eqv(hello, hello) - exception Type mismatch. + exception Type mismatch code 80020005 idiv: variant_idiv(hello, hello) - exception Type mismatch. + exception Type mismatch code 80020005 imp: variant_imp(hello, hello) - exception Type mismatch. + exception Type mismatch code 80020005 mod: variant_mod(hello, hello) - exception Type mismatch. + exception Type mismatch code 80020005 or: variant_or(hello, hello) - exception Type mismatch. + exception Type mismatch code 80020005 pow: variant_pow(hello, hello) - exception Type mismatch. + exception Type mismatch code 80020005 xor: variant_xor(hello, hello) - exception Type mismatch. + exception Type mismatch code 80020005 -- add: variant_add(hello, ) - exception Type mismatch. + exception Type mismatch code 80020005 cat: helloFalse sub: variant_sub(hello, ) - exception Type mismatch. + exception Type mismatch code 80020005 mul: variant_mul(hello, ) - exception Type mismatch. + exception Type mismatch code 80020005 and: variant_and(hello, ) - exception Type mismatch. + exception Type mismatch code 80020005 div: variant_div(hello, ) - exception Type mismatch. + exception Type mismatch code 80020005 eqv: variant_eqv(hello, ) - exception Type mismatch. + exception Type mismatch code 80020005 idiv: variant_idiv(hello, ) - exception Type mismatch. + exception Type mismatch code 80020005 imp: variant_imp(hello, ) - exception Type mismatch. + exception Type mismatch code 80020005 mod: variant_mod(hello, ) - exception Type mismatch. + exception Type mismatch code 80020005 or: variant_or(hello, ) - exception Type mismatch. + exception Type mismatch code 80020005 pow: variant_pow(hello, ) - exception Type mismatch. + exception Type mismatch code 80020005 xor: variant_xor(hello, ) - exception Type mismatch. + exception Type mismatch code 80020005 -- @@ -550,63 +550,63 @@ xor: 4 -- add: variant_add(0, hello) - exception Type mismatch. + exception Type mismatch code 80020005 cat: Falsehello sub: variant_sub(0, hello) - exception Type mismatch. + exception Type mismatch code 80020005 mul: variant_mul(0, hello) - exception Type mismatch. + exception Type mismatch code 80020005 and: variant_and(0, hello) - exception Type mismatch. + exception Type mismatch code 80020005 div: variant_div(0, hello) - exception Type mismatch. + exception Type mismatch code 80020005 eqv: variant_eqv(0, hello) - exception Type mismatch. + exception Type mismatch code 80020005 idiv: variant_idiv(0, hello) - exception Type mismatch. + exception Type mismatch code 80020005 imp: variant_imp(0, hello) - exception Type mismatch. + exception Type mismatch code 80020005 mod: variant_mod(0, hello) - exception Type mismatch. + exception Type mismatch code 80020005 or: variant_or(0, hello) - exception Type mismatch. + exception Type mismatch code 80020005 pow: variant_pow(0, hello) - exception Type mismatch. + exception Type mismatch code 80020005 xor: variant_xor(0, hello) - exception Type mismatch. + exception Type mismatch code 80020005 -- @@ -617,19 +617,19 @@ mul: 0 and: 0 div: variant_div(0, ) - exception Out of present range. + exception Out of present range code 8002000a eqv: -1 idiv: variant_idiv(0, ) - exception Division by zero. + exception Division by zero code 80020012 imp: -1 mod: variant_mod(0, ) - exception Division by zero. + exception Division by zero code 80020012 or: 0 diff --git a/ext/com_dotnet/tests/variants_x64.phpt b/ext/com_dotnet/tests/variants_x64.phpt index 6a1b7e1c12925..1ca93c5709622 100644 --- a/ext/com_dotnet/tests/variants_x64.phpt +++ b/ext/com_dotnet/tests/variants_x64.phpt @@ -37,7 +37,7 @@ foreach ($values as $t => $val) { echo "$op:\n"; echo "\tvariant_$op($v, $op2)\n"; echo "\texception " . $e->getMessage(); - printf("\tcode %08x\n\n", $e->getCode()); + printf("\n\tcode %08x\n\n", $e->getCode()); } } } @@ -77,63 +77,63 @@ xor: 46 -- add: variant_add(42, hello) - exception Type mismatch. + exception Type mismatch code 80020005 cat: 42hello sub: variant_sub(42, hello) - exception Type mismatch. + exception Type mismatch code 80020005 mul: variant_mul(42, hello) - exception Type mismatch. + exception Type mismatch code 80020005 and: variant_and(42, hello) - exception Type mismatch. + exception Type mismatch code 80020005 div: variant_div(42, hello) - exception Type mismatch. + exception Type mismatch code 80020005 eqv: variant_eqv(42, hello) - exception Type mismatch. + exception Type mismatch code 80020005 idiv: variant_idiv(42, hello) - exception Type mismatch. + exception Type mismatch code 80020005 imp: variant_imp(42, hello) - exception Type mismatch. + exception Type mismatch code 80020005 mod: variant_mod(42, hello) - exception Type mismatch. + exception Type mismatch code 80020005 or: variant_or(42, hello) - exception Type mismatch. + exception Type mismatch code 80020005 pow: variant_pow(42, hello) - exception Type mismatch. + exception Type mismatch code 80020005 xor: variant_xor(42, hello) - exception Type mismatch. + exception Type mismatch code 80020005 -- @@ -144,19 +144,19 @@ mul: 0 and: 0 div: variant_div(42, ) - exception Division by zero. + exception Division by zero code 80020012 eqv: -43 idiv: variant_idiv(42, ) - exception Division by zero. + exception Division by zero code 80020012 imp: -43 mod: variant_mod(42, ) - exception Division by zero. + exception Division by zero code 80020012 or: 42 @@ -193,63 +193,63 @@ xor: 0 -- add: variant_add(3.5, hello) - exception Type mismatch. + exception Type mismatch code 80020005 cat: 3.5hello sub: variant_sub(3.5, hello) - exception Type mismatch. + exception Type mismatch code 80020005 mul: variant_mul(3.5, hello) - exception Type mismatch. + exception Type mismatch code 80020005 and: variant_and(3.5, hello) - exception Type mismatch. + exception Type mismatch code 80020005 div: variant_div(3.5, hello) - exception Type mismatch. + exception Type mismatch code 80020005 eqv: variant_eqv(3.5, hello) - exception Type mismatch. + exception Type mismatch code 80020005 idiv: variant_idiv(3.5, hello) - exception Type mismatch. + exception Type mismatch code 80020005 imp: variant_imp(3.5, hello) - exception Type mismatch. + exception Type mismatch code 80020005 mod: variant_mod(3.5, hello) - exception Type mismatch. + exception Type mismatch code 80020005 or: variant_or(3.5, hello) - exception Type mismatch. + exception Type mismatch code 80020005 pow: variant_pow(3.5, hello) - exception Type mismatch. + exception Type mismatch code 80020005 xor: variant_xor(3.5, hello) - exception Type mismatch. + exception Type mismatch code 80020005 -- @@ -260,19 +260,19 @@ mul: 0 and: 0 div: variant_div(3.5, ) - exception Division by zero. + exception Division by zero code 80020012 eqv: -5 idiv: variant_idiv(3.5, ) - exception Division by zero. + exception Division by zero code 80020012 imp: -5 mod: variant_mod(3.5, ) - exception Division by zero. + exception Division by zero code 80020012 or: 4 @@ -281,125 +281,125 @@ xor: 4 -- add: variant_add(hello, 42) - exception Type mismatch. + exception Type mismatch code 80020005 cat: hello42 sub: variant_sub(hello, 42) - exception Type mismatch. + exception Type mismatch code 80020005 mul: variant_mul(hello, 42) - exception Type mismatch. + exception Type mismatch code 80020005 and: variant_and(hello, 42) - exception Type mismatch. + exception Type mismatch code 80020005 div: variant_div(hello, 42) - exception Type mismatch. + exception Type mismatch code 80020005 eqv: variant_eqv(hello, 42) - exception Type mismatch. + exception Type mismatch code 80020005 idiv: variant_idiv(hello, 42) - exception Type mismatch. + exception Type mismatch code 80020005 imp: variant_imp(hello, 42) - exception Type mismatch. + exception Type mismatch code 80020005 mod: variant_mod(hello, 42) - exception Type mismatch. + exception Type mismatch code 80020005 or: variant_or(hello, 42) - exception Type mismatch. + exception Type mismatch code 80020005 pow: variant_pow(hello, 42) - exception Type mismatch. + exception Type mismatch code 80020005 xor: variant_xor(hello, 42) - exception Type mismatch. + exception Type mismatch code 80020005 -- add: variant_add(hello, 3.5) - exception Type mismatch. + exception Type mismatch code 80020005 cat: hello3.5 sub: variant_sub(hello, 3.5) - exception Type mismatch. + exception Type mismatch code 80020005 mul: variant_mul(hello, 3.5) - exception Type mismatch. + exception Type mismatch code 80020005 and: variant_and(hello, 3.5) - exception Type mismatch. + exception Type mismatch code 80020005 div: variant_div(hello, 3.5) - exception Type mismatch. + exception Type mismatch code 80020005 eqv: variant_eqv(hello, 3.5) - exception Type mismatch. + exception Type mismatch code 80020005 idiv: variant_idiv(hello, 3.5) - exception Type mismatch. + exception Type mismatch code 80020005 imp: variant_imp(hello, 3.5) - exception Type mismatch. + exception Type mismatch code 80020005 mod: variant_mod(hello, 3.5) - exception Type mismatch. + exception Type mismatch code 80020005 or: variant_or(hello, 3.5) - exception Type mismatch. + exception Type mismatch code 80020005 pow: variant_pow(hello, 3.5) - exception Type mismatch. + exception Type mismatch code 80020005 xor: variant_xor(hello, 3.5) - exception Type mismatch. + exception Type mismatch code 80020005 -- @@ -407,119 +407,119 @@ add: hellohello cat: hellohello sub: variant_sub(hello, hello) - exception Type mismatch. + exception Type mismatch code 80020005 mul: variant_mul(hello, hello) - exception Type mismatch. + exception Type mismatch code 80020005 and: variant_and(hello, hello) - exception Type mismatch. + exception Type mismatch code 80020005 div: variant_div(hello, hello) - exception Type mismatch. + exception Type mismatch code 80020005 eqv: variant_eqv(hello, hello) - exception Type mismatch. + exception Type mismatch code 80020005 idiv: variant_idiv(hello, hello) - exception Type mismatch. + exception Type mismatch code 80020005 imp: variant_imp(hello, hello) - exception Type mismatch. + exception Type mismatch code 80020005 mod: variant_mod(hello, hello) - exception Type mismatch. + exception Type mismatch code 80020005 or: variant_or(hello, hello) - exception Type mismatch. + exception Type mismatch code 80020005 pow: variant_pow(hello, hello) - exception Type mismatch. + exception Type mismatch code 80020005 xor: variant_xor(hello, hello) - exception Type mismatch. + exception Type mismatch code 80020005 -- add: variant_add(hello, ) - exception Type mismatch. + exception Type mismatch code 80020005 cat: helloFalse sub: variant_sub(hello, ) - exception Type mismatch. + exception Type mismatch code 80020005 mul: variant_mul(hello, ) - exception Type mismatch. + exception Type mismatch code 80020005 and: variant_and(hello, ) - exception Type mismatch. + exception Type mismatch code 80020005 div: variant_div(hello, ) - exception Type mismatch. + exception Type mismatch code 80020005 eqv: variant_eqv(hello, ) - exception Type mismatch. + exception Type mismatch code 80020005 idiv: variant_idiv(hello, ) - exception Type mismatch. + exception Type mismatch code 80020005 imp: variant_imp(hello, ) - exception Type mismatch. + exception Type mismatch code 80020005 mod: variant_mod(hello, ) - exception Type mismatch. + exception Type mismatch code 80020005 or: variant_or(hello, ) - exception Type mismatch. + exception Type mismatch code 80020005 pow: variant_pow(hello, ) - exception Type mismatch. + exception Type mismatch code 80020005 xor: variant_xor(hello, ) - exception Type mismatch. + exception Type mismatch code 80020005 -- @@ -553,63 +553,63 @@ xor: 4 -- add: variant_add(0, hello) - exception Type mismatch. + exception Type mismatch code 80020005 cat: Falsehello sub: variant_sub(0, hello) - exception Type mismatch. + exception Type mismatch code 80020005 mul: variant_mul(0, hello) - exception Type mismatch. + exception Type mismatch code 80020005 and: variant_and(0, hello) - exception Type mismatch. + exception Type mismatch code 80020005 div: variant_div(0, hello) - exception Type mismatch. + exception Type mismatch code 80020005 eqv: variant_eqv(0, hello) - exception Type mismatch. + exception Type mismatch code 80020005 idiv: variant_idiv(0, hello) - exception Type mismatch. + exception Type mismatch code 80020005 imp: variant_imp(0, hello) - exception Type mismatch. + exception Type mismatch code 80020005 mod: variant_mod(0, hello) - exception Type mismatch. + exception Type mismatch code 80020005 or: variant_or(0, hello) - exception Type mismatch. + exception Type mismatch code 80020005 pow: variant_pow(0, hello) - exception Type mismatch. + exception Type mismatch code 80020005 xor: variant_xor(0, hello) - exception Type mismatch. + exception Type mismatch code 80020005 -- @@ -620,19 +620,19 @@ mul: 0 and: 0 div: variant_div(0, ) - exception Out of present range. + exception Out of present range code 8002000a eqv: -1 idiv: variant_idiv(0, ) - exception Division by zero. + exception Division by zero code 80020012 imp: -1 mod: variant_mod(0, ) - exception Division by zero. + exception Division by zero code 80020012 or: 0 diff --git a/ext/curl/config.w32 b/ext/curl/config.w32 index 9402e5b3ec801..f722c5faca5e3 100644 --- a/ext/curl/config.w32 +++ b/ext/curl/config.w32 @@ -28,7 +28,7 @@ if (PHP_CURL != "no") { ) { EXTENSION("curl", "interface.c multi.c share.c curl_file.c"); AC_DEFINE('HAVE_CURL', 1, 'Have cURL library'); - ADD_FLAG("CFLAGS_CURL", "/D CURL_STATICLIB"); + ADD_FLAG("CFLAGS_CURL", "/D CURL_STATICLIB /D PHP_CURL_EXPORTS=1"); PHP_INSTALL_HEADERS("ext/curl", "php_curl.h"); // TODO: check for curl_version_info } else { diff --git a/ext/curl/curl.stub.php b/ext/curl/curl.stub.php index 2eba460d6c66a..8fd8fd91c52db 100644 --- a/ext/curl/curl.stub.php +++ b/ext/curl/curl.stub.php @@ -48,7 +48,7 @@ function curl_multi_errno(CurlMultiHandle $multi_handle): int {} /** @param int $still_running */ function curl_multi_exec(CurlMultiHandle $multi_handle, &$still_running): int {} -function curl_multi_getcontent(CurlHandle $multi_handle): ?string {} +function curl_multi_getcontent(CurlHandle $handle): ?string {} /** @param int $queued_messages */ function curl_multi_info_read(CurlMultiHandle $multi_handle, &$queued_messages = null): array|false {} diff --git a/ext/curl/curl_arginfo.h b/ext/curl/curl_arginfo.h index e213f9d3184e7..e6bb94b7b4b21 100644 --- a/ext/curl/curl_arginfo.h +++ b/ext/curl/curl_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: afeae538b49eb43a661e5b491da79c17d10c6bfe */ + * Stub hash: f1d616c644ad366405816cde0384f6f391773ebf */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_curl_close, 0, 1, IS_VOID, 0) ZEND_ARG_OBJ_INFO(0, handle, CurlHandle, 0) @@ -74,7 +74,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_curl_multi_exec, 0, 2, IS_LONG, ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_curl_multi_getcontent, 0, 1, IS_STRING, 1) - ZEND_ARG_OBJ_INFO(0, multi_handle, CurlHandle, 0) + ZEND_ARG_OBJ_INFO(0, handle, CurlHandle, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_curl_multi_info_read, 0, 1, MAY_BE_ARRAY|MAY_BE_FALSE) diff --git a/ext/curl/php_curl.h b/ext/curl/php_curl.h index ebb56278aa24f..88806262eceb9 100644 --- a/ext/curl/php_curl.h +++ b/ext/curl/php_curl.h @@ -21,7 +21,11 @@ #include "php.h" #ifdef PHP_WIN32 -# define PHP_CURL_API __declspec(dllexport) +# ifdef PHP_CURL_EXPORTS +# define PHP_CURL_API __declspec(dllexport) +# else +# define PHP_CURL_API __declspec(dllimport) +# endif #elif defined(__GNUC__) && __GNUC__ >= 4 # define PHP_CURL_API __attribute__ ((visibility("default"))) #else diff --git a/ext/fileinfo/generate_patch.sh b/ext/fileinfo/generate_patch.sh index 5431ca5e4f4a2..8874626154032 100755 --- a/ext/fileinfo/generate_patch.sh +++ b/ext/fileinfo/generate_patch.sh @@ -1,4 +1,4 @@ -VERSION=5.37 +VERSION=5.39 if [[ ! -d libmagic.orig ]]; then mkdir libmagic.orig wget -O - ftp://ftp.astron.com/pub/file/file-$VERSION.tar.gz \ diff --git a/ext/fileinfo/libmagic.patch b/ext/fileinfo/libmagic.patch index 54ee11378dbca..f6ca9412c4b88 100644 --- a/ext/fileinfo/libmagic.patch +++ b/ext/fileinfo/libmagic.patch @@ -1,6 +1,6 @@ -diff -ur libmagic.orig/apprentice.c libmagic/apprentice.c +diff -u libmagic.orig/apprentice.c libmagic/apprentice.c --- libmagic.orig/apprentice.c 2020-05-09 20:57:15.000000000 +0200 -+++ libmagic/apprentice.c 2020-08-29 19:56:29.638061530 +0200 ++++ libmagic/apprentice.c 2020-11-07 14:41:13.543842900 +0100 @@ -29,6 +29,8 @@ * apprentice - make one pass through /etc/magic, learning its secrets. */ @@ -927,9 +927,9 @@ diff -ur libmagic.orig/apprentice.c libmagic/apprentice.c m->str_range = swap4(m->str_range); m->str_flags = swap4(m->str_flags); } -diff -ur libmagic.orig/ascmagic.c libmagic/ascmagic.c +diff -u libmagic.orig/ascmagic.c libmagic/ascmagic.c --- libmagic.orig/ascmagic.c 2020-06-15 02:01:01.000000000 +0200 -+++ libmagic/ascmagic.c 2020-08-29 02:05:56.212049441 +0200 ++++ libmagic/ascmagic.c 2020-11-07 14:41:13.543842900 +0100 @@ -50,7 +50,7 @@ #define ISSPC(x) ((x) == ' ' || (x) == '\t' || (x) == '\r' || (x) == '\n' \ || (x) == 0x85 || (x) == '\f') @@ -993,9 +993,9 @@ diff -ur libmagic.orig/ascmagic.c libmagic/ascmagic.c { size_t i; unsigned char *end = buf + len; -diff -ur libmagic.orig/buffer.c libmagic/buffer.c +diff -u libmagic.orig/buffer.c libmagic/buffer.c --- libmagic.orig/buffer.c 2020-02-16 16:52:49.000000000 +0100 -+++ libmagic/buffer.c 2020-08-29 02:05:56.212049441 +0200 ++++ libmagic/buffer.c 2020-11-07 14:41:13.543842900 +0100 @@ -31,19 +31,23 @@ #endif /* lint */ @@ -1049,9 +1049,9 @@ diff -ur libmagic.orig/buffer.c libmagic/buffer.c b->ebuf = NULL; goto out; } -diff -ur libmagic.orig/cdf.c libmagic/cdf.c +diff -u libmagic.orig/cdf.c libmagic/cdf.c --- libmagic.orig/cdf.c 2019-09-30 17:42:50.000000000 +0200 -+++ libmagic/cdf.c 2020-08-29 02:05:56.212049441 +0200 ++++ libmagic/cdf.c 2020-11-07 14:41:13.559464400 +0100 @@ -43,7 +43,17 @@ #include #endif @@ -1284,9 +1284,9 @@ diff -ur libmagic.orig/cdf.c libmagic/cdf.c } #endif -diff -ur libmagic.orig/cdf.h libmagic/cdf.h +diff -u libmagic.orig/cdf.h libmagic/cdf.h --- libmagic.orig/cdf.h 2019-09-30 17:42:50.000000000 +0200 -+++ libmagic/cdf.h 2020-07-04 12:40:36.663619335 +0200 ++++ libmagic/cdf.h 2020-10-09 14:15:33.483358900 +0200 @@ -35,10 +35,10 @@ #ifndef _H_CDF_ #define _H_CDF_ @@ -1301,9 +1301,9 @@ diff -ur libmagic.orig/cdf.h libmagic/cdf.h #endif #ifdef __DJGPP__ #define timespec timeval -diff -ur libmagic.orig/cdf_time.c libmagic/cdf_time.c +diff -u libmagic.orig/cdf_time.c libmagic/cdf_time.c --- libmagic.orig/cdf_time.c 2019-03-12 21:43:05.000000000 +0100 -+++ libmagic/cdf_time.c 2020-07-04 12:40:36.667619309 +0200 ++++ libmagic/cdf_time.c 2020-10-09 14:15:33.484360000 +0200 @@ -23,6 +23,7 @@ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. @@ -1330,9 +1330,9 @@ diff -ur libmagic.orig/cdf_time.c libmagic/cdf_time.c if (ptr != NULL) return buf; (void)snprintf(buf, 26, "*Bad* %#16.16" INT64_T_FORMAT "x\n", -diff -ur libmagic.orig/compress.c libmagic/compress.c +diff -u libmagic.orig/compress.c libmagic/compress.c --- libmagic.orig/compress.c 2020-05-31 02:11:06.000000000 +0200 -+++ libmagic/compress.c 2020-08-29 02:05:56.212049441 +0200 ++++ libmagic/compress.c 2020-11-07 14:41:13.559464400 +0100 @@ -51,7 +51,7 @@ #ifndef HAVE_SIG_T typedef void (*sig_t)(int); @@ -1467,9 +1467,9 @@ diff -ur libmagic.orig/compress.c libmagic/compress.c } #endif +#endif -diff -ur libmagic.orig/der.c libmagic/der.c +diff -u libmagic.orig/der.c libmagic/der.c --- libmagic.orig/der.c 2020-06-15 02:01:01.000000000 +0200 -+++ libmagic/der.c 2020-08-29 11:56:12.303522747 +0200 ++++ libmagic/der.c 2020-11-07 14:41:13.559464400 +0100 @@ -54,7 +54,9 @@ #include "magic.h" #include "der.h" @@ -1480,9 +1480,9 @@ diff -ur libmagic.orig/der.c libmagic/der.c #include #include #endif -diff -ur libmagic.orig/elfclass.h libmagic/elfclass.h +diff -u libmagic.orig/elfclass.h libmagic/elfclass.h --- libmagic.orig/elfclass.h 2019-02-20 02:30:19.000000000 +0100 -+++ libmagic/elfclass.h 2020-07-04 12:40:36.667619309 +0200 ++++ libmagic/elfclass.h 2020-10-09 14:15:33.488358700 +0200 @@ -41,7 +41,7 @@ return toomany(ms, "program headers", phnum); flags |= FLAGS_IS_CORE; @@ -1510,9 +1510,9 @@ diff -ur libmagic.orig/elfclass.h libmagic/elfclass.h CAST(size_t, elf_getu16(swap, elfhdr.e_shentsize)), fsize, elf_getu16(swap, elfhdr.e_machine), CAST(int, elf_getu16(swap, elfhdr.e_shstrndx)), -diff -ur libmagic.orig/encoding.c libmagic/encoding.c +diff -u libmagic.orig/encoding.c libmagic/encoding.c --- libmagic.orig/encoding.c 2019-06-10 23:34:41.000000000 +0200 -+++ libmagic/encoding.c 2020-08-29 02:05:56.212049441 +0200 ++++ libmagic/encoding.c 2020-11-07 14:41:13.559464400 +0100 @@ -43,14 +43,14 @@ #include @@ -1700,9 +1700,9 @@ diff -ur libmagic.orig/encoding.c libmagic/encoding.c if (ubf[*ulen - 1] == 0xfffe) return 0; -diff -ur libmagic.orig/file.h libmagic/file.h +diff -u libmagic.orig/file.h libmagic/file.h --- libmagic.orig/file.h 2020-06-15 02:01:01.000000000 +0200 -+++ libmagic/file.h 2020-09-02 17:35:51.709611515 +0200 ++++ libmagic/file.h 2020-11-24 13:44:41.506472900 +0100 @@ -33,17 +33,13 @@ #ifndef __file_h__ #define __file_h__ @@ -1725,7 +1725,7 @@ diff -ur libmagic.orig/file.h libmagic/file.h #ifndef __STDC_LIMIT_MACROS #define __STDC_LIMIT_MACROS -@@ -79,10 +75,11 @@ +@@ -79,23 +75,26 @@ #include /* Include that here, to make sure __P gets defined */ #include #include /* For open and flags */ @@ -1740,7 +1740,14 @@ diff -ur libmagic.orig/file.h libmagic/file.h #include #endif /* Do this here and now, because struct stat gets re-defined on solaris */ -@@ -95,7 +92,7 @@ + #include + #include + ++#define abort() zend_error_noreturn(E_ERROR, "fatal libmagic error") ++ + #define ENABLE_CONDITIONALS + + #ifndef MAGIC #define MAGIC "/etc/magic" #endif @@ -1749,7 +1756,7 @@ diff -ur libmagic.orig/file.h libmagic/file.h #define PATHSEP ';' #else #define PATHSEP ':' -@@ -129,12 +126,6 @@ +@@ -129,12 +128,6 @@ #endif #endif @@ -1762,7 +1769,7 @@ diff -ur libmagic.orig/file.h libmagic/file.h #ifndef MIN #define MIN(a,b) (((a) < (b)) ? (a) : (b)) #endif -@@ -161,10 +152,10 @@ +@@ -161,10 +154,10 @@ struct buffer { int fd; @@ -1775,7 +1782,7 @@ diff -ur libmagic.orig/file.h libmagic/file.h void *ebuf; size_t elen; }; -@@ -258,7 +249,7 @@ +@@ -258,7 +251,7 @@ #define FILE_OFFSET 50 #define FILE_NAMES_SIZE 51 /* size of array to contain all names */ @@ -1784,7 +1791,7 @@ diff -ur libmagic.orig/file.h libmagic/file.h ((t) == FILE_STRING || \ (t) == FILE_PSTRING || \ (t) == FILE_BESTRING16 || \ -@@ -464,21 +455,17 @@ +@@ -464,21 +457,17 @@ }; /* Type for Unicode characters */ @@ -1810,7 +1817,7 @@ diff -ur libmagic.orig/file.h libmagic/file.h protected int file_separator(struct magic_set *); protected char *file_copystr(char *, size_t, size_t, const char *); protected int file_checkfmt(char *, size_t, const char *); -@@ -486,48 +473,42 @@ +@@ -486,48 +475,42 @@ protected int file_print_guid(char *, size_t, const uint64_t *); protected int file_parse_guid(const char *, uint64_t *); protected int file_replace(struct magic_set *, const char *, const char *); @@ -1867,7 +1874,7 @@ diff -ur libmagic.orig/file.h libmagic/file.h size_t *); protected size_t file_pstring_length_size(struct magic_set *, const struct magic *); -@@ -539,34 +520,12 @@ +@@ -539,34 +522,12 @@ size_t); #endif /* __EMX__ */ @@ -1904,7 +1911,7 @@ diff -ur libmagic.orig/file.h libmagic/file.h typedef struct { char *buf; -@@ -582,23 +541,10 @@ +@@ -582,23 +543,10 @@ extern const size_t file_nnames; #endif @@ -1930,7 +1937,7 @@ diff -ur libmagic.orig/file.h libmagic/file.h size_t strlcat(char *, const char *, size_t); #endif #ifndef HAVE_STRCASESTR -@@ -614,39 +560,6 @@ +@@ -614,39 +562,6 @@ #ifndef HAVE_ASCTIME_R char *asctime_r(const struct tm *, char *); #endif @@ -1970,7 +1977,7 @@ diff -ur libmagic.orig/file.h libmagic/file.h #if defined(HAVE_MMAP) && defined(HAVE_SYS_MMAN_H) && !defined(QUICK) #define QUICK -@@ -676,4 +589,16 @@ +@@ -676,4 +591,16 @@ #define __RCSID(a) #endif @@ -1987,9 +1994,9 @@ diff -ur libmagic.orig/file.h libmagic/file.h +#endif + #endif /* __file_h__ */ -diff -ur libmagic.orig/fsmagic.c libmagic/fsmagic.c +diff -u libmagic.orig/fsmagic.c libmagic/fsmagic.c --- libmagic.orig/fsmagic.c 2019-07-16 15:30:32.000000000 +0200 -+++ libmagic/fsmagic.c 2020-08-29 02:05:56.212049441 +0200 ++++ libmagic/fsmagic.c 2020-11-07 14:41:13.559464400 +0100 @@ -66,26 +66,10 @@ # define minor(dev) ((dev) & 0xff) #endif @@ -2280,9 +2287,9 @@ diff -ur libmagic.orig/fsmagic.c libmagic/fsmagic.c #ifdef S_IFSOCK #ifndef __COHERENT__ case S_IFSOCK: -diff -ur libmagic.orig/funcs.c libmagic/funcs.c +diff -u libmagic.orig/funcs.c libmagic/funcs.c --- libmagic.orig/funcs.c 2020-02-20 16:50:20.000000000 +0100 -+++ libmagic/funcs.c 2020-08-29 11:56:12.303522747 +0200 ++++ libmagic/funcs.c 2020-11-07 14:41:13.559464400 +0100 @@ -48,6 +48,13 @@ #define SIZE_MAX ((size_t)~0) #endif @@ -2655,9 +2662,9 @@ diff -ur libmagic.orig/funcs.c libmagic/funcs.c return rbuf; } -diff -ur libmagic.orig/magic.c libmagic/magic.c +diff -u libmagic.orig/magic.c libmagic/magic.c --- libmagic.orig/magic.c 2020-06-15 02:01:01.000000000 +0200 -+++ libmagic/magic.c 2020-08-29 11:56:12.303522747 +0200 ++++ libmagic/magic.c 2020-11-07 14:41:13.559464400 +0100 @@ -25,11 +25,6 @@ * SUCH DAMAGE. */ @@ -3131,9 +3138,9 @@ diff -ur libmagic.orig/magic.c libmagic/magic.c return NULL; } return file_getbuffer(ms); -diff -ur libmagic.orig/magic.h libmagic/magic.h ---- libmagic.orig/magic.h 2020-06-29 01:13:35.424557511 +0200 -+++ libmagic/magic.h 2020-08-29 02:05:56.212049441 +0200 +diff -u libmagic.orig/magic.h libmagic/magic.h +--- libmagic.orig/magic.h 2020-11-24 13:45:15.355600300 +0100 ++++ libmagic/magic.h 2020-11-07 14:41:13.559464400 +0100 @@ -126,6 +126,7 @@ const char *magic_getpath(const char *, int); @@ -3142,9 +3149,9 @@ diff -ur libmagic.orig/magic.h libmagic/magic.h const char *magic_descriptor(magic_t, int); const char *magic_buffer(magic_t, const void *, size_t); -diff -ur libmagic.orig/print.c libmagic/print.c +diff -u libmagic.orig/print.c libmagic/print.c --- libmagic.orig/print.c 2020-05-09 20:57:15.000000000 +0200 -+++ libmagic/print.c 2020-08-29 11:56:12.303522747 +0200 ++++ libmagic/print.c 2020-11-07 14:41:13.559464400 +0100 @@ -28,6 +28,7 @@ /* * print.c - debugging printout routines @@ -3207,9 +3214,9 @@ diff -ur libmagic.orig/print.c libmagic/print.c if (pp == NULL) goto out; -diff -ur libmagic.orig/readcdf.c libmagic/readcdf.c +diff -u libmagic.orig/readcdf.c libmagic/readcdf.c --- libmagic.orig/readcdf.c 2019-09-30 17:42:50.000000000 +0200 -+++ libmagic/readcdf.c 2020-08-29 02:05:56.212049441 +0200 ++++ libmagic/readcdf.c 2020-11-07 14:41:13.559464400 +0100 @@ -31,7 +31,11 @@ #include @@ -3331,9 +3338,9 @@ diff -ur libmagic.orig/readcdf.c libmagic/readcdf.c out0: /* If we handled it already, return */ if (i != -1) -diff -ur libmagic.orig/softmagic.c libmagic/softmagic.c +diff -u libmagic.orig/softmagic.c libmagic/softmagic.c --- libmagic.orig/softmagic.c 2020-06-15 02:01:01.000000000 +0200 -+++ libmagic/softmagic.c 2020-09-02 20:04:00.794667114 +0200 ++++ libmagic/softmagic.c 2020-11-07 14:41:13.559464400 +0100 @@ -43,6 +43,10 @@ #include #include "der.h" @@ -3682,9 +3689,9 @@ diff -ur libmagic.orig/softmagic.c libmagic/softmagic.c break; } case FILE_INDIRECT: -diff -ur libmagic.orig/strcasestr.c libmagic/strcasestr.c +diff -u libmagic.orig/strcasestr.c libmagic/strcasestr.c --- libmagic.orig/strcasestr.c 2014-09-11 17:05:33.000000000 +0200 -+++ libmagic/strcasestr.c 2020-07-04 12:40:36.675619260 +0200 ++++ libmagic/strcasestr.c 2020-10-09 14:15:33.499288400 +0200 @@ -39,6 +39,8 @@ #include "file.h" diff --git a/ext/fileinfo/libmagic/file.h b/ext/fileinfo/libmagic/file.h index ea19faf7d4405..b4d083f3c91a9 100644 --- a/ext/fileinfo/libmagic/file.h +++ b/ext/fileinfo/libmagic/file.h @@ -86,6 +86,8 @@ #include #include +#define abort() zend_error_noreturn(E_ERROR, "fatal libmagic error") + #define ENABLE_CONDITIONALS #ifndef MAGIC diff --git a/ext/fileinfo/tests/bug77961.magic b/ext/fileinfo/tests/bug77961.magic new file mode 100644 index 0000000000000..db0a90d883d9c --- /dev/null +++ b/ext/fileinfo/tests/bug77961.magic @@ -0,0 +1,50 @@ +0 string 1 +>1 regex \^[0-9:,\ ]*-->[0-9:,\ ]* SubRip File +!:mime text/x-srt + +0 lelong 0xc3cbc6c5 RISC OS Chunk data +>12 string OBJ_ \b, AOF object +>12 string LIB_ \b, ALF library + +0 name mach-o \b [ +>0 use mach-o-cpu \b +>(8.L) indirect 8 \b: +>0 belong x \b] + +0 belong 0xcafed00d JAR compressed with pack200, +>5 byte x version %d. +>4 byte x \b%d +!:mime application/x-java-pack200 + +# Objective-C +0 regex \^#import Objective-C source text +!:strength + 25 +!:mime text/x-objective-c + +0 string \x20\x20\x20\x20\x20\x20\x20\x20-:\x20\x20\x20\ 0:Source: +>&0 search/128 \x20\x20\x20\x20\x20\x20\x20\x20-:\x20\x20\x20\ 0:Graph: +>>&0 search/128 \x20\x20\x20\x20\x20\x20\x20\x20-:\x20\x20\x20\ 0:Data: GCOV coverage report + +0 name certinfo +>0 der seq +>>&0 der set +>>>&0 der seq +>>>>&0 der obj_id3=550406 +>>>>&0 der prt_str=x \b, countryName=%s +>>&0 der set +>>>&0 der seq +>>>>&0 der obj_id3=550408 +>>>>&0 der utf8_str=x \b, stateOrProvinceName=%s +>>&0 der set +>>>&0 der seq +>>>>&0 der obj_id3=55040a +>>>>&0 der utf8_str=x \b, organizationName=%s +>>&0 der set +>>>&0 der seq +>>>>&0 der obj_id3=550403 +>>>>&0 der utf8_str=x \b, commonName=%s +>>&0 der seq + +0 search/1 FONT ASCII vfont text +0 short 0436 Berkeley vfont data +0 short 017001 byte-swapped Berkeley vfont data diff --git a/ext/fileinfo/tests/bug77961.phpt b/ext/fileinfo/tests/bug77961.phpt new file mode 100644 index 0000000000000..b059a5d4582d9 --- /dev/null +++ b/ext/fileinfo/tests/bug77961.phpt @@ -0,0 +1,14 @@ +--TEST-- +Bug #77961 (finfo_open crafted magic parsing SIGABRT) +--SKIPIF-- + +--FILE-- + +--EXPECTF-- +Warning: finfo_open(): Expected numeric type got `indirect' in %s on line %d + +Fatal error: fatal libmagic error in %s on line %d diff --git a/ext/gd/gd.c b/ext/gd/gd.c index d811b66866482..4f5f41099f000 100644 --- a/ext/gd/gd.c +++ b/ext/gd/gd.c @@ -1531,8 +1531,9 @@ PHP_FUNCTION(imagecreatefromstring) } if (ZSTR_LEN(data) < sizeof(sig)) { - zend_argument_value_error(1, "cannot be empty"); - RETURN_THROWS(); + /* Handle this the same way as an unknown image type. */ + php_error_docref(NULL, E_WARNING, "Data is not in a recognized format"); + RETURN_FALSE; } memcpy(sig, ZSTR_VAL(data), sizeof(sig)); diff --git a/ext/gd/tests/createfromstring.phpt b/ext/gd/tests/createfromstring.phpt index 6586d17c31d7f..f3e40b26a9007 100644 --- a/ext/gd/tests/createfromstring.phpt +++ b/ext/gd/tests/createfromstring.phpt @@ -62,6 +62,7 @@ $im = imagecreatefromstring(' asdf jklp foo'); --EXPECTF-- createfromstring truecolor png: ok createfromstring palette png: ok -imagecreatefromstring(): Argument #1 ($data) cannot be empty -Warning: imagecreatefromstring(): Data is not in a recognized format in %screatefromstring.php on line %d +Warning: imagecreatefromstring(): Data is not in a recognized format in %s on line %d + +Warning: imagecreatefromstring(): Data is not in a recognized format in %s on line %d diff --git a/ext/hash/config.m4 b/ext/hash/config.m4 index 2d6a81b7febed..8a900748c03af 100644 --- a/ext/hash/config.m4 +++ b/ext/hash/config.m4 @@ -33,6 +33,8 @@ else PHP_ADD_BUILD_DIR(ext/hash/$SHA3_DIR, 1) fi +PHP_ADD_BUILD_DIR(ext/hash/murmur, 1) + EXT_HASH_SOURCES="hash.c hash_md.c hash_sha.c hash_ripemd.c hash_haval.c \ hash_tiger.c hash_gost.c hash_snefru.c hash_whirlpool.c hash_adler32.c \ hash_crc32.c hash_fnv.c hash_joaat.c $EXT_HASH_SHA3_SOURCES diff --git a/ext/hash/hash.c b/ext/hash/hash.c index f7b851f5a49fe..a337ef0489342 100644 --- a/ext/hash/hash.c +++ b/ext/hash/hash.c @@ -349,7 +349,7 @@ PHP_HASH_API int php_hash_unserialize(php_hashcontext_object *hash, zend_long ma /* Userspace */ static void php_hash_do_hash( - zval *return_value, zend_string *algo, char *data, size_t data_len, zend_bool raw_output, bool isfilename + zval *return_value, zend_string *algo, char *data, size_t data_len, zend_bool raw_output, bool isfilename, HashTable *args ) /* {{{ */ { zend_string *digest; const php_hash_ops *ops; @@ -374,7 +374,7 @@ static void php_hash_do_hash( } context = php_hash_alloc_context(ops); - ops->hash_init(context); + ops->hash_init(context, args); if (isfilename) { char buf[1024]; @@ -418,15 +418,17 @@ PHP_FUNCTION(hash) char *data; size_t data_len; zend_bool raw_output = 0; + HashTable *args = NULL; - ZEND_PARSE_PARAMETERS_START(2, 3) + ZEND_PARSE_PARAMETERS_START(2, 4) Z_PARAM_STR(algo) Z_PARAM_STRING(data, data_len) Z_PARAM_OPTIONAL Z_PARAM_BOOL(raw_output) + Z_PARAM_ARRAY_HT(args) ZEND_PARSE_PARAMETERS_END(); - php_hash_do_hash(return_value, algo, data, data_len, raw_output, 0); + php_hash_do_hash(return_value, algo, data, data_len, raw_output, 0, args); } /* }}} */ @@ -438,15 +440,17 @@ PHP_FUNCTION(hash_file) char *data; size_t data_len; zend_bool raw_output = 0; + HashTable *args = NULL; ZEND_PARSE_PARAMETERS_START(2, 3) Z_PARAM_STR(algo) Z_PARAM_STRING(data, data_len) Z_PARAM_OPTIONAL Z_PARAM_BOOL(raw_output) + Z_PARAM_ARRAY_HT(args) ZEND_PARSE_PARAMETERS_END(); - php_hash_do_hash(return_value, algo, data, data_len, raw_output, 1); + php_hash_do_hash(return_value, algo, data, data_len, raw_output, 1, args); } /* }}} */ @@ -468,7 +472,7 @@ static inline void php_hash_hmac_prep_key(unsigned char *K, const php_hash_ops * memset(K, 0, ops->block_size); if (key_len > ops->block_size) { /* Reduce the key first */ - ops->hash_init(context); + ops->hash_init(context, NULL); ops->hash_update(context, key, key_len); ops->hash_final(K, context); } else { @@ -479,7 +483,7 @@ static inline void php_hash_hmac_prep_key(unsigned char *K, const php_hash_ops * } static inline void php_hash_hmac_round(unsigned char *final, const php_hash_ops *ops, void *context, const unsigned char *key, const unsigned char *data, const zend_long data_size) { - ops->hash_init(context); + ops->hash_init(context, NULL); ops->hash_update(context, key, ops->block_size); ops->hash_update(context, data, data_size); ops->hash_final(final, context); @@ -522,7 +526,7 @@ static void php_hash_do_hash_hmac( if (isfilename) { char buf[1024]; ssize_t n; - ops->hash_init(context); + ops->hash_init(context, NULL); ops->hash_update(context, K, ops->block_size); while ((n = php_stream_read(stream, buf, sizeof(buf))) > 0) { ops->hash_update(context, (unsigned char *) buf, n); @@ -605,8 +609,9 @@ PHP_FUNCTION(hash_init) void *context; const php_hash_ops *ops; php_hashcontext_object *hash; + HashTable *args = NULL; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "S|lS", &algo, &options, &key) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "S|lSh", &algo, &options, &key, &args) == FAILURE) { RETURN_THROWS(); } @@ -632,7 +637,7 @@ PHP_FUNCTION(hash_init) hash = php_hashcontext_from_object(Z_OBJ_P(return_value)); context = php_hash_alloc_context(ops); - ops->hash_init(context); + ops->hash_init(context, args); hash->ops = ops; hash->context = context; @@ -650,7 +655,7 @@ PHP_FUNCTION(hash_init) ops->hash_update(context, (unsigned char *) ZSTR_VAL(key), ZSTR_LEN(key)); ops->hash_final((unsigned char *) K, context); /* Make the context ready to start over */ - ops->hash_init(context); + ops->hash_init(context, args); } else { memcpy(K, ZSTR_VAL(key), ZSTR_LEN(key)); } @@ -792,7 +797,7 @@ PHP_FUNCTION(hash_final) } /* Feed this result into the outer hash */ - hash->ops->hash_init(hash->context); + hash->ops->hash_init(hash->context, NULL); hash->ops->hash_update(hash->context, hash->key, hash->ops->block_size); hash->ops->hash_update(hash->context, (unsigned char *) ZSTR_VAL(digest), hash->ops->digest_size); hash->ops->hash_final((unsigned char *) ZSTR_VAL(digest), hash->context); @@ -915,7 +920,7 @@ PHP_FUNCTION(hash_hkdf) context = php_hash_alloc_context(ops); // Extract - ops->hash_init(context); + ops->hash_init(context, NULL); K = emalloc(ops->block_size); php_hash_hmac_prep_key(K, ops, context, (unsigned char *) (salt ? ZSTR_VAL(salt) : ""), salt ? ZSTR_LEN(salt) : 0); @@ -935,7 +940,7 @@ PHP_FUNCTION(hash_hkdf) c[0] = (i & 0xFF); php_hash_hmac_prep_key(K, ops, context, prk, ops->digest_size); - ops->hash_init(context); + ops->hash_init(context, NULL); ops->hash_update(context, K, ops->block_size); if (i > 1) { @@ -980,8 +985,9 @@ PHP_FUNCTION(hash_pbkdf2) zend_bool raw_output = 0; const php_hash_ops *ops; void *context; + HashTable *args; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "Sssl|lb", &algo, &pass, &pass_len, &salt, &salt_len, &iterations, &length, &raw_output) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "Sssl|lbh", &algo, &pass, &pass_len, &salt, &salt_len, &iterations, &length, &raw_output, &args) == FAILURE) { RETURN_THROWS(); } @@ -1007,7 +1013,7 @@ PHP_FUNCTION(hash_pbkdf2) } context = php_hash_alloc_context(ops); - ops->hash_init(context); + ops->hash_init(context, args); K1 = emalloc(ops->block_size); K2 = emalloc(ops->block_size); @@ -1212,7 +1218,7 @@ PHP_FUNCTION(mhash) if (key) { php_hash_do_hash_hmac(return_value, algo, data, data_len, key, key_len, 1, 0); } else { - php_hash_do_hash(return_value, algo, data, data_len, 1, 0); + php_hash_do_hash(return_value, algo, data, data_len, 1, 0, NULL); } if (algo) { @@ -1319,13 +1325,13 @@ PHP_FUNCTION(mhash_keygen_s2k) } context = php_hash_alloc_context(ops); - ops->hash_init(context); + ops->hash_init(context, NULL); key = ecalloc(1, times * block_size); digest = emalloc(ops->digest_size + 1); for (i = 0; i < times; i++) { - ops->hash_init(context); + ops->hash_init(context, NULL); for (j=0;jhash_update(context, &null, 1); @@ -1392,7 +1398,7 @@ static zend_object *php_hashcontext_clone(zend_object *zobj) { newobj->ops = oldobj->ops; newobj->options = oldobj->options; newobj->context = php_hash_alloc_context(newobj->ops); - newobj->ops->hash_init(newobj->context); + newobj->ops->hash_init(newobj->context, NULL); if (SUCCESS != newobj->ops->hash_copy(newobj->ops, oldobj->context, newobj->context)) { efree(newobj->context); @@ -1529,8 +1535,8 @@ PHP_METHOD(HashContext, __unserialize) hash->ops = ops; hash->context = php_hash_alloc_context(ops); - ops->hash_init(hash->context); hash->options = options; + ops->hash_init(hash->context, NULL); unserialize_result = ops->hash_unserialize(hash, magic, hash_zv); if (unserialize_result != SUCCESS) { diff --git a/ext/hash/hash.stub.php b/ext/hash/hash.stub.php index c0d4cbca7c3d5..7eb3925c353b4 100644 --- a/ext/hash/hash.stub.php +++ b/ext/hash/hash.stub.php @@ -2,15 +2,15 @@ /** @generate-function-entries */ -function hash(string $algo, string $data, bool $binary = false): string|false {} +function hash(string $algo, string $data, bool $binary = false, array $options = []): string|false {} -function hash_file(string $algo, string $filename, bool $binary = false): string|false {} +function hash_file(string $algo, string $filename, bool $binary = false, array $options = []): string|false {} function hash_hmac(string $algo, string $data, string $key, bool $binary = false): string|false {} function hash_hmac_file(string $algo, string $data, string $key, bool $binary = false): string|false {} -function hash_init(string $algo, int $flags = 0, string $key = ""): HashContext {} +function hash_init(string $algo, int $flags = 0, string $key = "", array $options = []): HashContext {} function hash_update(HashContext $context, string $data): bool {} diff --git a/ext/hash/hash_adler32.c b/ext/hash/hash_adler32.c index d45012f8e6d51..5acd621b2d3f4 100644 --- a/ext/hash/hash_adler32.c +++ b/ext/hash/hash_adler32.c @@ -18,7 +18,7 @@ #include "php_hash.h" #include "php_hash_adler32.h" -PHP_HASH_API void PHP_ADLER32Init(PHP_ADLER32_CTX *context) +PHP_HASH_API void PHP_ADLER32Init(PHP_ADLER32_CTX *context, ZEND_ATTRIBUTE_UNUSED HashTable *args) { context->state = 1; } diff --git a/ext/hash/hash_arginfo.h b/ext/hash/hash_arginfo.h index db043da97b477..1d654b546ee1f 100644 --- a/ext/hash/hash_arginfo.h +++ b/ext/hash/hash_arginfo.h @@ -1,16 +1,18 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 9352e0ac98e2ac53dc15d5024f9ef0c8092c4e9c */ + * Stub hash: e8466049fca2eae179adbc19bb67e71f6486ec4e */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_hash, 0, 2, MAY_BE_STRING|MAY_BE_FALSE) ZEND_ARG_TYPE_INFO(0, algo, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, data, IS_STRING, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, binary, _IS_BOOL, 0, "false") + ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, options, IS_ARRAY, 0, "[]") ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_hash_file, 0, 2, MAY_BE_STRING|MAY_BE_FALSE) ZEND_ARG_TYPE_INFO(0, algo, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, filename, IS_STRING, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, binary, _IS_BOOL, 0, "false") + ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, options, IS_ARRAY, 0, "[]") ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_hash_hmac, 0, 3, MAY_BE_STRING|MAY_BE_FALSE) @@ -26,6 +28,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_hash_init, 0, 1, HashContext, 0) ZEND_ARG_TYPE_INFO(0, algo, IS_STRING, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, flags, IS_LONG, 0, "0") ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, key, IS_STRING, 0, "\"\"") + ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, options, IS_ARRAY, 0, "[]") ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_hash_update, 0, 2, _IS_BOOL, 0) diff --git a/ext/hash/hash_crc32.c b/ext/hash/hash_crc32.c index ade32a3b35c1c..d77cdde013fbd 100644 --- a/ext/hash/hash_crc32.c +++ b/ext/hash/hash_crc32.c @@ -20,7 +20,7 @@ #include "php_hash_crc32_tables.h" #include "ext/standard/crc32_x86.h" -PHP_HASH_API void PHP_CRC32Init(PHP_CRC32_CTX *context) +PHP_HASH_API void PHP_CRC32Init(PHP_CRC32_CTX *context, ZEND_ATTRIBUTE_UNUSED HashTable *args) { context->state = ~0; } diff --git a/ext/hash/hash_fnv.c b/ext/hash/hash_fnv.c index 2ee81b9c8601b..3a48d404841a3 100644 --- a/ext/hash/hash_fnv.c +++ b/ext/hash/hash_fnv.c @@ -83,7 +83,7 @@ const php_hash_ops php_hash_fnv1a64_ops = { /* {{{ PHP_FNV132Init * 32-bit FNV-1 hash initialisation */ -PHP_HASH_API void PHP_FNV132Init(PHP_FNV132_CTX *context) +PHP_HASH_API void PHP_FNV132Init(PHP_FNV132_CTX *context, ZEND_ATTRIBUTE_UNUSED HashTable *args) { context->state = PHP_FNV1_32_INIT; } @@ -118,7 +118,7 @@ PHP_HASH_API void PHP_FNV132Final(unsigned char digest[4], PHP_FNV132_CTX * cont /* {{{ PHP_FNV164Init * 64-bit FNV-1 hash initialisation */ -PHP_HASH_API void PHP_FNV164Init(PHP_FNV164_CTX *context) +PHP_HASH_API void PHP_FNV164Init(PHP_FNV164_CTX *context, ZEND_ATTRIBUTE_UNUSED HashTable *args) { context->state = PHP_FNV1_64_INIT; } diff --git a/ext/hash/hash_gost.c b/ext/hash/hash_gost.c index 46ea032c32e30..d1f4a31765a9a 100644 --- a/ext/hash/hash_gost.c +++ b/ext/hash/hash_gost.c @@ -235,15 +235,15 @@ static inline void GostTransform(PHP_GOST_CTX *context, const unsigned char inpu Gost(context, data); } -PHP_HASH_API void PHP_GOSTInit(PHP_GOST_CTX *context) +PHP_HASH_API void PHP_GOSTInit(PHP_GOST_CTX *context, ZEND_ATTRIBUTE_UNUSED HashTable *args) { memset(context, 0, sizeof(*context)); context->tables = &tables_test; } -PHP_HASH_API void PHP_GOSTInitCrypto(PHP_GOST_CTX *context) +PHP_HASH_API void PHP_GOSTInitCrypto(PHP_GOST_CTX *context, ZEND_ATTRIBUTE_UNUSED HashTable *args) { - PHP_GOSTInit(context); + PHP_GOSTInit(context, NULL); context->tables = &tables_crypto; } diff --git a/ext/hash/hash_haval.c b/ext/hash/hash_haval.c index 84ff242bd90d5..9b117db8d9b01 100644 --- a/ext/hash/hash_haval.c +++ b/ext/hash/hash_haval.c @@ -253,7 +253,7 @@ const php_hash_ops php_hash_##p##haval##b##_ops = { \ php_hash_unserialize, \ PHP_HAVAL_SPEC, \ ((b) / 8), 128, sizeof(PHP_HAVAL_CTX), 1 }; \ -PHP_HASH_API void PHP_##p##HAVAL##b##Init(PHP_HAVAL_CTX *context) \ +PHP_HASH_API void PHP_##p##HAVAL##b##Init(PHP_HAVAL_CTX *context, ZEND_ATTRIBUTE_UNUSED HashTable *args) \ { int i; context->count[0] = context->count[1] = 0; \ for(i = 0; i < 8; i++) context->state[i] = D0[i]; \ context->passes = p; context->output = b; \ diff --git a/ext/hash/hash_joaat.c b/ext/hash/hash_joaat.c index 5d5a2e53b9b39..41fde52f30474 100644 --- a/ext/hash/hash_joaat.c +++ b/ext/hash/hash_joaat.c @@ -36,7 +36,7 @@ const php_hash_ops php_hash_joaat_ops = { 0 }; -PHP_HASH_API void PHP_JOAATInit(PHP_JOAAT_CTX *context) +PHP_HASH_API void PHP_JOAATInit(PHP_JOAAT_CTX *context, ZEND_ATTRIBUTE_UNUSED HashTable *args) { context->state = 0; } diff --git a/ext/hash/hash_md.c b/ext/hash/hash_md.c index 94fafbbf798a8..a34936d625304 100644 --- a/ext/hash/hash_md.c +++ b/ext/hash/hash_md.c @@ -19,7 +19,7 @@ const php_hash_ops php_hash_md5_ops = { "md5", - (php_hash_init_func_t) PHP_MD5Init, + (php_hash_init_func_t) PHP_MD5InitArgs, (php_hash_update_func_t) PHP_MD5Update, (php_hash_final_func_t) PHP_MD5Final, php_hash_copy, @@ -34,7 +34,7 @@ const php_hash_ops php_hash_md5_ops = { const php_hash_ops php_hash_md4_ops = { "md4", - (php_hash_init_func_t) PHP_MD4Init, + (php_hash_init_func_t) PHP_MD4InitArgs, (php_hash_update_func_t) PHP_MD4Update, (php_hash_final_func_t) PHP_MD4Final, php_hash_copy, @@ -51,7 +51,7 @@ static int php_md2_unserialize(php_hashcontext_object *hash, zend_long magic, co const php_hash_ops php_hash_md2_ops = { "md2", - (php_hash_init_func_t) PHP_MD2Init, + (php_hash_init_func_t) PHP_MD2InitArgs, (php_hash_update_func_t) PHP_MD2Update, (php_hash_final_func_t) PHP_MD2Final, php_hash_copy, @@ -182,10 +182,10 @@ static void MD4Transform(uint32_t state[4], const unsigned char block[64]) state[3] += d; } -/* {{{ PHP_MD4Init +/* {{{ PHP_MD4InitArgs * MD4 initialization. Begins an MD4 operation, writing a new context. */ -PHP_HASH_API void PHP_MD4Init(PHP_MD4_CTX * context) +PHP_HASH_API void PHP_MD4InitArgs(PHP_MD4_CTX * context, ZEND_ATTRIBUTE_UNUSED HashTable *args) { context->count[0] = context->count[1] = 0; /* Load magic initialization constants. @@ -287,7 +287,7 @@ static const unsigned char MD2_S[256] = { 242, 239, 183, 14, 102, 88, 208, 228, 166, 119, 114, 248, 235, 117, 75, 10, 49, 68, 80, 180, 143, 237, 31, 26, 219, 153, 141, 51, 159, 17, 131, 20 }; -PHP_HASH_API void PHP_MD2Init(PHP_MD2_CTX *context) +PHP_HASH_API void PHP_MD2InitArgs(PHP_MD2_CTX *context, ZEND_ATTRIBUTE_UNUSED HashTable *args) { memset(context, 0, sizeof(PHP_MD2_CTX)); } diff --git a/ext/hash/hash_murmur.c b/ext/hash/hash_murmur.c index ab01b4f19fce6..d3d9f640c0e4c 100644 --- a/ext/hash/hash_murmur.c +++ b/ext/hash/hash_murmur.c @@ -36,9 +36,20 @@ const php_hash_ops php_hash_murmur3a_ops = { 0 }; -PHP_HASH_API void PHP_MURMUR3AInit(PHP_MURMUR3A_CTX *ctx) +PHP_HASH_API void PHP_MURMUR3AInit(PHP_MURMUR3A_CTX *ctx, HashTable *args) { - ctx->h = 0; + if (args) { + zval *seed = zend_hash_str_find_deref(args, "seed", sizeof("seed") - 1); + /* This might be a bit too restrictive, but thinking that a seed might be set + once and for all, it should be done a clean way. */ + if (seed && IS_LONG == Z_TYPE_P(seed)) { + ctx->h = (uint32_t)Z_LVAL_P(seed); + } else { + ctx->h = 0; + } + } else { + ctx->h = 0; + } ctx->carry = 0; ctx->len = 0; } @@ -82,9 +93,24 @@ const php_hash_ops php_hash_murmur3c_ops = { 0 }; -PHP_HASH_API void PHP_MURMUR3CInit(PHP_MURMUR3C_CTX *ctx) +PHP_HASH_API void PHP_MURMUR3CInit(PHP_MURMUR3C_CTX *ctx, HashTable *args) { - memset(&ctx->h, 0, sizeof ctx->h); + if (args) { + zval *seed = zend_hash_str_find_deref(args, "seed", sizeof("seed") - 1); + /* This might be a bit too restrictive, but thinking that a seed might be set + once and for all, it should be done a clean way. */ + if (seed && IS_LONG == Z_TYPE_P(seed)) { + uint32_t _seed = (uint32_t)Z_LVAL_P(seed); + ctx->h[0] = _seed; + ctx->h[1] = _seed; + ctx->h[2] = _seed; + ctx->h[3] = _seed; + } else { + memset(&ctx->h, 0, sizeof ctx->h); + } + } else { + memset(&ctx->h, 0, sizeof ctx->h); + } memset(&ctx->carry, 0, sizeof ctx->carry); ctx->len = 0; } @@ -95,7 +121,7 @@ PHP_HASH_API void PHP_MURMUR3CUpdate(PHP_MURMUR3C_CTX *ctx, const unsigned char PMurHash128x86_Process(ctx->h, ctx->carry, in, len); } -PHP_HASH_API void PHP_MURMUR3CFinal(unsigned char digest[4], PHP_MURMUR3C_CTX *ctx) +PHP_HASH_API void PHP_MURMUR3CFinal(unsigned char digest[16], PHP_MURMUR3C_CTX *ctx) { uint32_t h[4] = {0, 0, 0, 0}; PMurHash128x86_Result(ctx->h, ctx->carry, ctx->len, h); @@ -141,9 +167,22 @@ const php_hash_ops php_hash_murmur3f_ops = { 0 }; -PHP_HASH_API void PHP_MURMUR3FInit(PHP_MURMUR3F_CTX *ctx) +PHP_HASH_API void PHP_MURMUR3FInit(PHP_MURMUR3F_CTX *ctx, HashTable *args) { - memset(&ctx->h, 0, sizeof ctx->h); + if (args) { + zval *seed = zend_hash_str_find_deref(args, "seed", sizeof("seed") - 1); + /* This might be a bit too restrictive, but thinking that a seed might be set + once and for all, it should be done a clean way. */ + if (seed && IS_LONG == Z_TYPE_P(seed)) { + uint64_t _seed = (uint64_t)Z_LVAL_P(seed); + ctx->h[0] = _seed; + ctx->h[1] = _seed; + } else { + memset(&ctx->h, 0, sizeof ctx->h); + } + } else { + memset(&ctx->h, 0, sizeof ctx->h); + } memset(&ctx->carry, 0, sizeof ctx->carry); ctx->len = 0; } @@ -154,7 +193,7 @@ PHP_HASH_API void PHP_MURMUR3FUpdate(PHP_MURMUR3F_CTX *ctx, const unsigned char PMurHash128x64_Process(ctx->h, ctx->carry, in, len); } -PHP_HASH_API void PHP_MURMUR3FFinal(unsigned char digest[4], PHP_MURMUR3F_CTX *ctx) +PHP_HASH_API void PHP_MURMUR3FFinal(unsigned char digest[16], PHP_MURMUR3F_CTX *ctx) { uint64_t h[2] = {0, 0}; PMurHash128x64_Result(ctx->h, ctx->carry, ctx->len, h); diff --git a/ext/hash/hash_ripemd.c b/ext/hash/hash_ripemd.c index db1d1dc02b9e2..58c40b06a78cc 100644 --- a/ext/hash/hash_ripemd.c +++ b/ext/hash/hash_ripemd.c @@ -84,7 +84,7 @@ const php_hash_ops php_hash_ripemd320_ops = { /* {{{ PHP_RIPEMD128Init * ripemd128 initialization. Begins a ripemd128 operation, writing a new context. */ -PHP_HASH_API void PHP_RIPEMD128Init(PHP_RIPEMD128_CTX * context) +PHP_HASH_API void PHP_RIPEMD128Init(PHP_RIPEMD128_CTX * context, ZEND_ATTRIBUTE_UNUSED HashTable *args) { context->count[0] = context->count[1] = 0; /* Load magic initialization constants. @@ -99,7 +99,7 @@ PHP_HASH_API void PHP_RIPEMD128Init(PHP_RIPEMD128_CTX * context) /* {{{ PHP_RIPEMD256Init * ripemd256 initialization. Begins a ripemd256 operation, writing a new context. */ -PHP_HASH_API void PHP_RIPEMD256Init(PHP_RIPEMD256_CTX * context) +PHP_HASH_API void PHP_RIPEMD256Init(PHP_RIPEMD256_CTX * context, ZEND_ATTRIBUTE_UNUSED HashTable *args) { context->count[0] = context->count[1] = 0; /* Load magic initialization constants. @@ -118,7 +118,7 @@ PHP_HASH_API void PHP_RIPEMD256Init(PHP_RIPEMD256_CTX * context) /* {{{ PHP_RIPEMD160Init * ripemd160 initialization. Begins a ripemd160 operation, writing a new context. */ -PHP_HASH_API void PHP_RIPEMD160Init(PHP_RIPEMD160_CTX * context) +PHP_HASH_API void PHP_RIPEMD160Init(PHP_RIPEMD160_CTX * context, ZEND_ATTRIBUTE_UNUSED HashTable *args) { context->count[0] = context->count[1] = 0; /* Load magic initialization constants. @@ -134,7 +134,7 @@ PHP_HASH_API void PHP_RIPEMD160Init(PHP_RIPEMD160_CTX * context) /* {{{ PHP_RIPEMD320Init * ripemd320 initialization. Begins a ripemd320 operation, writing a new context. */ -PHP_HASH_API void PHP_RIPEMD320Init(PHP_RIPEMD320_CTX * context) +PHP_HASH_API void PHP_RIPEMD320Init(PHP_RIPEMD320_CTX * context, ZEND_ATTRIBUTE_UNUSED HashTable *args) { context->count[0] = context->count[1] = 0; /* Load magic initialization constants. diff --git a/ext/hash/hash_sha.c b/ext/hash/hash_sha.c index 4ea5b768d703c..acc23a21bf096 100644 --- a/ext/hash/hash_sha.c +++ b/ext/hash/hash_sha.c @@ -64,7 +64,7 @@ static void SHADecode32(uint32_t *output, const unsigned char *input, unsigned i const php_hash_ops php_hash_sha1_ops = { "sha1", - (php_hash_init_func_t) PHP_SHA1Init, + (php_hash_init_func_t) PHP_SHA1InitArgs, (php_hash_update_func_t) PHP_SHA1Update, (php_hash_final_func_t) PHP_SHA1Final, php_hash_copy, @@ -81,7 +81,7 @@ const php_hash_ops php_hash_sha1_ops = { const php_hash_ops php_hash_sha256_ops = { "sha256", - (php_hash_init_func_t) PHP_SHA256Init, + (php_hash_init_func_t) PHP_SHA256InitArgs, (php_hash_update_func_t) PHP_SHA256Update, (php_hash_final_func_t) PHP_SHA256Final, php_hash_copy, @@ -96,7 +96,7 @@ const php_hash_ops php_hash_sha256_ops = { const php_hash_ops php_hash_sha224_ops = { "sha224", - (php_hash_init_func_t) PHP_SHA224Init, + (php_hash_init_func_t) PHP_SHA224InitArgs, (php_hash_update_func_t) PHP_SHA224Update, (php_hash_final_func_t) PHP_SHA224Final, php_hash_copy, @@ -136,10 +136,10 @@ static const uint32_t SHA256_K[64] = { 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 }; -/* {{{ PHP_SHA256Init +/* {{{ PHP_SHA256InitArgs * SHA256 initialization. Begins an SHA256 operation, writing a new context. */ -PHP_HASH_API void PHP_SHA256Init(PHP_SHA256_CTX * context) +PHP_HASH_API void PHP_SHA256InitArgs(PHP_SHA256_CTX * context, ZEND_ATTRIBUTE_UNUSED HashTable *args) { context->count[0] = context->count[1] = 0; /* Load magic initialization constants. @@ -196,10 +196,10 @@ static void SHA256Transform(uint32_t state[8], const unsigned char block[64]) } /* }}} */ -/* {{{ PHP_SHA224Init +/* {{{ PHP_SHA224InitArgs * SHA224 initialization. Begins an SHA224 operation, writing a new context. */ -PHP_HASH_API void PHP_SHA224Init(PHP_SHA224_CTX * context) +PHP_HASH_API void PHP_SHA224InitArgs(PHP_SHA224_CTX * context, ZEND_ATTRIBUTE_UNUSED HashTable *args) { context->count[0] = context->count[1] = 0; /* Load magic initialization constants. @@ -445,10 +445,10 @@ static void SHADecode64(uint64_t *output, const unsigned char *input, unsigned i } /* }}} */ -/* {{{ PHP_SHA384Init +/* {{{ PHP_SHA384InitArgs * SHA384 initialization. Begins an SHA384 operation, writing a new context. */ -PHP_HASH_API void PHP_SHA384Init(PHP_SHA384_CTX * context) +PHP_HASH_API void PHP_SHA384InitArgs(PHP_SHA384_CTX * context, ZEND_ATTRIBUTE_UNUSED HashTable *args) { context->count[0] = context->count[1] = 0; /* Load magic initialization constants. @@ -591,7 +591,7 @@ PHP_HASH_API void PHP_SHA384Final(unsigned char digest[48], PHP_SHA384_CTX * con const php_hash_ops php_hash_sha384_ops = { "sha384", - (php_hash_init_func_t) PHP_SHA384Init, + (php_hash_init_func_t) PHP_SHA384InitArgs, (php_hash_update_func_t) PHP_SHA384Update, (php_hash_final_func_t) PHP_SHA384Final, php_hash_copy, @@ -604,10 +604,10 @@ const php_hash_ops php_hash_sha384_ops = { 1 }; -/* {{{ PHP_SHA512Init +/* {{{ PHP_SHA512InitArgs * SHA512 initialization. Begins an SHA512 operation, writing a new context. */ -PHP_HASH_API void PHP_SHA512Init(PHP_SHA512_CTX * context) +PHP_HASH_API void PHP_SHA512InitArgs(PHP_SHA512_CTX * context, ZEND_ATTRIBUTE_UNUSED HashTable *args) { context->count[0] = context->count[1] = 0; /* Load magic initialization constants. @@ -623,10 +623,10 @@ PHP_HASH_API void PHP_SHA512Init(PHP_SHA512_CTX * context) } /* }}} */ -/* {{{ PHP_SHA512_256Init +/* {{{ PHP_SHA512_256InitArgs * SHA512/245 initialization. Identical algorithm to SHA512, using alternate initval and truncation */ -PHP_HASH_API void PHP_SHA512_256Init(PHP_SHA512_CTX * context) +PHP_HASH_API void PHP_SHA512_256InitArgs(PHP_SHA512_CTX * context, ZEND_ATTRIBUTE_UNUSED HashTable *args) { context->count[0] = context->count[1] = 0; @@ -641,10 +641,10 @@ PHP_HASH_API void PHP_SHA512_256Init(PHP_SHA512_CTX * context) } /* }}} */ -/* {{{ PHP_SHA512_224Init +/* {{{ PHP_SHA512_224InitArgs * SHA512/224 initialization. Identical algorithm to SHA512, using alternate initval and truncation */ -PHP_HASH_API void PHP_SHA512_224Init(PHP_SHA512_CTX * context) +PHP_HASH_API void PHP_SHA512_224InitArgs(PHP_SHA512_CTX * context, ZEND_ATTRIBUTE_UNUSED HashTable *args) { context->count[0] = context->count[1] = 0; @@ -768,7 +768,7 @@ PHP_HASH_API void PHP_SHA512_224Final(unsigned char digest[28], PHP_SHA512_CTX * const php_hash_ops php_hash_sha512_ops = { "sha512", - (php_hash_init_func_t) PHP_SHA512Init, + (php_hash_init_func_t) PHP_SHA512InitArgs, (php_hash_update_func_t) PHP_SHA512Update, (php_hash_final_func_t) PHP_SHA512Final, php_hash_copy, @@ -783,7 +783,7 @@ const php_hash_ops php_hash_sha512_ops = { const php_hash_ops php_hash_sha512_256_ops = { "sha512/256", - (php_hash_init_func_t) PHP_SHA512_256Init, + (php_hash_init_func_t) PHP_SHA512_256InitArgs, (php_hash_update_func_t) PHP_SHA512_256Update, (php_hash_final_func_t) PHP_SHA512_256Final, php_hash_copy, @@ -798,7 +798,7 @@ const php_hash_ops php_hash_sha512_256_ops = { const php_hash_ops php_hash_sha512_224_ops = { "sha512/224", - (php_hash_init_func_t) PHP_SHA512_224Init, + (php_hash_init_func_t) PHP_SHA512_224InitArgs, (php_hash_update_func_t) PHP_SHA512_224Update, (php_hash_final_func_t) PHP_SHA512_224Final, php_hash_copy, diff --git a/ext/hash/hash_sha3.c b/ext/hash/hash_sha3.c index 52bd495f9df60..123e599d04c31 100644 --- a/ext/hash/hash_sha3.c +++ b/ext/hash/hash_sha3.c @@ -220,7 +220,7 @@ static int php_sha3_unserialize(php_hashcontext_object *hash, // ========================================================================== #define DECLARE_SHA3_OPS(bits) \ -void PHP_SHA3##bits##Init(PHP_SHA3_##bits##_CTX* ctx) { \ +void PHP_SHA3##bits##Init(PHP_SHA3_##bits##_CTX* ctx, ZEND_ATTRIBUTE_UNUSED HashTable *args) { \ PHP_SHA3_Init(ctx, bits); \ } \ void PHP_SHA3##bits##Update(PHP_SHA3_##bits##_CTX* ctx, \ @@ -315,7 +315,7 @@ static int php_keccak_unserialize(php_hashcontext_object *hash, zend_long magic, // ========================================================================== #define DECLARE_SHA3_OPS(bits) \ -void PHP_SHA3##bits##Init(PHP_SHA3_##bits##_CTX* ctx) { \ +void PHP_SHA3##bits##Init(PHP_SHA3_##bits##_CTX* ctx, ZEND_ATTRIBUTE_UNUSED HashTable *args) { \ ZEND_ASSERT(sizeof(Keccak_HashInstance) <= sizeof(PHP_SHA3_##bits##_CTX)); \ Keccak_HashInitialize_SHA3_##bits((Keccak_HashInstance *)ctx); \ } \ diff --git a/ext/hash/hash_snefru.c b/ext/hash/hash_snefru.c index 292bfef2cb8da..66f9300b11506 100644 --- a/ext/hash/hash_snefru.c +++ b/ext/hash/hash_snefru.c @@ -128,7 +128,7 @@ static inline void SnefruTransform(PHP_SNEFRU_CTX *context, const unsigned char ZEND_SECURE_ZERO(&context->state[8], sizeof(uint32_t) * 8); } -PHP_HASH_API void PHP_SNEFRUInit(PHP_SNEFRU_CTX *context) +PHP_HASH_API void PHP_SNEFRUInit(PHP_SNEFRU_CTX *context, ZEND_ATTRIBUTE_UNUSED HashTable *args) { memset(context, 0, sizeof(*context)); } diff --git a/ext/hash/hash_tiger.c b/ext/hash/hash_tiger.c index 8e0f365dc49eb..b360dd6adec31 100644 --- a/ext/hash/hash_tiger.c +++ b/ext/hash/hash_tiger.c @@ -174,7 +174,7 @@ static inline void TigerDigest(unsigned char *digest_str, unsigned int digest_le } } -PHP_HASH_API void PHP_3TIGERInit(PHP_TIGER_CTX *context) +PHP_HASH_API void PHP_3TIGERInit(PHP_TIGER_CTX *context, ZEND_ATTRIBUTE_UNUSED HashTable *args) { memset(context, 0, sizeof(*context)); context->state[0] = L64(0x0123456789ABCDEF); @@ -182,7 +182,7 @@ PHP_HASH_API void PHP_3TIGERInit(PHP_TIGER_CTX *context) context->state[2] = L64(0xF096A5B4C3B2E187); } -PHP_HASH_API void PHP_4TIGERInit(PHP_TIGER_CTX *context) +PHP_HASH_API void PHP_4TIGERInit(PHP_TIGER_CTX *context, ZEND_ATTRIBUTE_UNUSED HashTable *args) { memset(context, 0, sizeof(*context)); context->passes = 1; diff --git a/ext/hash/hash_whirlpool.c b/ext/hash/hash_whirlpool.c index 8d5cbb77370a8..2a64e864c1cc4 100644 --- a/ext/hash/hash_whirlpool.c +++ b/ext/hash/hash_whirlpool.c @@ -263,7 +263,7 @@ static void WhirlpoolTransform(PHP_WHIRLPOOL_CTX *context) ZEND_SECURE_ZERO(state, sizeof(state)); } -PHP_HASH_API void PHP_WHIRLPOOLInit(PHP_WHIRLPOOL_CTX *context) +PHP_HASH_API void PHP_WHIRLPOOLInit(PHP_WHIRLPOOL_CTX *context, ZEND_ATTRIBUTE_UNUSED HashTable *args) { memset(context, 0, sizeof(*context)); } diff --git a/ext/hash/php_hash.h b/ext/hash/php_hash.h index 69d1330072daf..7f57fe567d0f9 100644 --- a/ext/hash/php_hash.h +++ b/ext/hash/php_hash.h @@ -31,7 +31,7 @@ typedef struct _php_hashcontext_object php_hashcontext_object; -typedef void (*php_hash_init_func_t)(void *context); +typedef void (*php_hash_init_func_t)(void *context, HashTable *args); typedef void (*php_hash_update_func_t)(void *context, const unsigned char *buf, size_t count); typedef void (*php_hash_final_func_t)(unsigned char *digest, void *context); typedef int (*php_hash_copy_func_t)(const void *ops, void *orig_context, void *dest_context); diff --git a/ext/hash/php_hash_adler32.h b/ext/hash/php_hash_adler32.h index 049f16b28e956..db2db38114012 100644 --- a/ext/hash/php_hash_adler32.h +++ b/ext/hash/php_hash_adler32.h @@ -24,7 +24,7 @@ typedef struct { } PHP_ADLER32_CTX; #define PHP_ADLER32_SPEC "l." -PHP_HASH_API void PHP_ADLER32Init(PHP_ADLER32_CTX *context); +PHP_HASH_API void PHP_ADLER32Init(PHP_ADLER32_CTX *context, ZEND_ATTRIBUTE_UNUSED HashTable *args); PHP_HASH_API void PHP_ADLER32Update(PHP_ADLER32_CTX *context, const unsigned char *input, size_t len); PHP_HASH_API void PHP_ADLER32Final(unsigned char digest[4], PHP_ADLER32_CTX *context); PHP_HASH_API int PHP_ADLER32Copy(const php_hash_ops *ops, PHP_ADLER32_CTX *orig_context, PHP_ADLER32_CTX *copy_context); diff --git a/ext/hash/php_hash_crc32.h b/ext/hash/php_hash_crc32.h index 4c1b0fedc9159..1003e4b39bc07 100644 --- a/ext/hash/php_hash_crc32.h +++ b/ext/hash/php_hash_crc32.h @@ -24,7 +24,7 @@ typedef struct { } PHP_CRC32_CTX; #define PHP_CRC32_SPEC "l." -PHP_HASH_API void PHP_CRC32Init(PHP_CRC32_CTX *context); +PHP_HASH_API void PHP_CRC32Init(PHP_CRC32_CTX *context, ZEND_ATTRIBUTE_UNUSED HashTable *args); PHP_HASH_API void PHP_CRC32Update(PHP_CRC32_CTX *context, const unsigned char *input, size_t len); PHP_HASH_API void PHP_CRC32BUpdate(PHP_CRC32_CTX *context, const unsigned char *input, size_t len); PHP_HASH_API void PHP_CRC32CUpdate(PHP_CRC32_CTX *context, const unsigned char *input, size_t len); diff --git a/ext/hash/php_hash_fnv.h b/ext/hash/php_hash_fnv.h index 6728b2e90205e..f4dacb223e894 100644 --- a/ext/hash/php_hash_fnv.h +++ b/ext/hash/php_hash_fnv.h @@ -52,12 +52,12 @@ typedef struct { #define PHP_FNV164_SPEC "q." -PHP_HASH_API void PHP_FNV132Init(PHP_FNV132_CTX *context); +PHP_HASH_API void PHP_FNV132Init(PHP_FNV132_CTX *context, ZEND_ATTRIBUTE_UNUSED HashTable *args); PHP_HASH_API void PHP_FNV132Update(PHP_FNV132_CTX *context, const unsigned char *input, size_t inputLen); PHP_HASH_API void PHP_FNV1a32Update(PHP_FNV132_CTX *context, const unsigned char *input, size_t inputLen); PHP_HASH_API void PHP_FNV132Final(unsigned char digest[16], PHP_FNV132_CTX * context); -PHP_HASH_API void PHP_FNV164Init(PHP_FNV164_CTX *context); +PHP_HASH_API void PHP_FNV164Init(PHP_FNV164_CTX *context, ZEND_ATTRIBUTE_UNUSED HashTable *args); PHP_HASH_API void PHP_FNV164Update(PHP_FNV164_CTX *context, const unsigned char *input, size_t inputLen); PHP_HASH_API void PHP_FNV1a64Update(PHP_FNV164_CTX *context, const unsigned char *input, size_t inputLen); PHP_HASH_API void PHP_FNV164Final(unsigned char digest[16], PHP_FNV164_CTX * context); diff --git a/ext/hash/php_hash_gost.h b/ext/hash/php_hash_gost.h index eb9441faa66a4..850b089506810 100644 --- a/ext/hash/php_hash_gost.h +++ b/ext/hash/php_hash_gost.h @@ -29,7 +29,7 @@ typedef struct { } PHP_GOST_CTX; #define PHP_GOST_SPEC "l16l2bb32" -PHP_HASH_API void PHP_GOSTInit(PHP_GOST_CTX *); +PHP_HASH_API void PHP_GOSTInit(PHP_GOST_CTX *, ZEND_ATTRIBUTE_UNUSED HashTable *args); PHP_HASH_API void PHP_GOSTUpdate(PHP_GOST_CTX *, const unsigned char *, size_t); PHP_HASH_API void PHP_GOSTFinal(unsigned char[64], PHP_GOST_CTX *); diff --git a/ext/hash/php_hash_haval.h b/ext/hash/php_hash_haval.h index 43802b41834fa..2ae0af6bf8ea2 100644 --- a/ext/hash/php_hash_haval.h +++ b/ext/hash/php_hash_haval.h @@ -30,7 +30,7 @@ typedef struct { } PHP_HAVAL_CTX; #define PHP_HAVAL_SPEC "l8l2b128" -#define PHP_HASH_HAVAL_INIT_DECL(p,b) PHP_HASH_API void PHP_##p##HAVAL##b##Init(PHP_HAVAL_CTX *); \ +#define PHP_HASH_HAVAL_INIT_DECL(p,b) PHP_HASH_API void PHP_##p##HAVAL##b##Init(PHP_HAVAL_CTX *, ZEND_ATTRIBUTE_UNUSED HashTable *); \ PHP_HASH_API void PHP_HAVAL##b##Final(unsigned char*, PHP_HAVAL_CTX *); PHP_HASH_API void PHP_HAVALUpdate(PHP_HAVAL_CTX *, const unsigned char *, size_t); diff --git a/ext/hash/php_hash_joaat.h b/ext/hash/php_hash_joaat.h index b0df8a67b38ae..113983c2a4254 100644 --- a/ext/hash/php_hash_joaat.h +++ b/ext/hash/php_hash_joaat.h @@ -22,7 +22,7 @@ typedef struct { } PHP_JOAAT_CTX; #define PHP_JOAAT_SPEC "l." -PHP_HASH_API void PHP_JOAATInit(PHP_JOAAT_CTX *context); +PHP_HASH_API void PHP_JOAATInit(PHP_JOAAT_CTX *context, ZEND_ATTRIBUTE_UNUSED HashTable *args); PHP_HASH_API void PHP_JOAATUpdate(PHP_JOAAT_CTX *context, const unsigned char *input, size_t inputLen); PHP_HASH_API void PHP_JOAATFinal(unsigned char digest[16], PHP_JOAAT_CTX * context); diff --git a/ext/hash/php_hash_md.h b/ext/hash/php_hash_md.h index 2a677fe54d662..ce155b3e1f295 100644 --- a/ext/hash/php_hash_md.h +++ b/ext/hash/php_hash_md.h @@ -28,7 +28,8 @@ typedef struct { } PHP_MD4_CTX; #define PHP_MD4_SPEC "l4l2b64." -PHP_HASH_API void PHP_MD4Init(PHP_MD4_CTX *); +#define PHP_MD4Init(ctx) PHP_MD4InitArgs(ctx, NULL) +PHP_HASH_API void PHP_MD4InitArgs(PHP_MD4_CTX *, ZEND_ATTRIBUTE_UNUSED HashTable *); PHP_HASH_API void PHP_MD4Update(PHP_MD4_CTX *context, const unsigned char *, size_t); PHP_HASH_API void PHP_MD4Final(unsigned char[16], PHP_MD4_CTX *); @@ -41,7 +42,8 @@ typedef struct { } PHP_MD2_CTX; #define PHP_MD2_SPEC "b48b16b16b." -PHP_HASH_API void PHP_MD2Init(PHP_MD2_CTX *context); +#define PHP_MD2Init(ctx) PHP_MD2InitArgs(ctx, NULL) +PHP_HASH_API void PHP_MD2InitArgs(PHP_MD2_CTX *context, ZEND_ATTRIBUTE_UNUSED HashTable *args); PHP_HASH_API void PHP_MD2Update(PHP_MD2_CTX *context, const unsigned char *, size_t); PHP_HASH_API void PHP_MD2Final(unsigned char[16], PHP_MD2_CTX *); diff --git a/ext/hash/php_hash_murmur.h b/ext/hash/php_hash_murmur.h index 100a8d1fa32f1..598912141b5c4 100644 --- a/ext/hash/php_hash_murmur.h +++ b/ext/hash/php_hash_murmur.h @@ -24,7 +24,7 @@ typedef struct { } PHP_MURMUR3A_CTX; #define PHP_MURMUR3A_SPEC "lll" -PHP_HASH_API void PHP_MURMUR3AInit(PHP_MURMUR3A_CTX *ctx); +PHP_HASH_API void PHP_MURMUR3AInit(PHP_MURMUR3A_CTX *ctx, HashTable *args); PHP_HASH_API void PHP_MURMUR3AUpdate(PHP_MURMUR3A_CTX *ctx, const unsigned char *in, size_t len); PHP_HASH_API void PHP_MURMUR3AFinal(unsigned char digest[4], PHP_MURMUR3A_CTX *ctx); PHP_HASH_API int PHP_MURMUR3ACopy(const php_hash_ops *ops, PHP_MURMUR3A_CTX *orig_context, PHP_MURMUR3A_CTX *copy_context); @@ -36,7 +36,7 @@ typedef struct { } PHP_MURMUR3C_CTX; #define PHP_MURMUR3C_SPEC "lllllllll" -PHP_HASH_API void PHP_MURMUR3CInit(PHP_MURMUR3C_CTX *ctx); +PHP_HASH_API void PHP_MURMUR3CInit(PHP_MURMUR3C_CTX *ctx, HashTable *args); PHP_HASH_API void PHP_MURMUR3CUpdate(PHP_MURMUR3C_CTX *ctx, const unsigned char *in, size_t len); PHP_HASH_API void PHP_MURMUR3CFinal(unsigned char digest[16], PHP_MURMUR3C_CTX *ctx); PHP_HASH_API int PHP_MURMUR3CCopy(const php_hash_ops *ops, PHP_MURMUR3C_CTX *orig_context, PHP_MURMUR3C_CTX *copy_context); @@ -48,7 +48,7 @@ typedef struct { } PHP_MURMUR3F_CTX; #define PHP_MURMUR3F_SPEC "qqqql" -PHP_HASH_API void PHP_MURMUR3FInit(PHP_MURMUR3F_CTX *ctx); +PHP_HASH_API void PHP_MURMUR3FInit(PHP_MURMUR3F_CTX *ctx, HashTable *args); PHP_HASH_API void PHP_MURMUR3FUpdate(PHP_MURMUR3F_CTX *ctx, const unsigned char *in, size_t len); PHP_HASH_API void PHP_MURMUR3FFinal(unsigned char digest[16], PHP_MURMUR3F_CTX *ctx); PHP_HASH_API int PHP_MURMUR3FCopy(const php_hash_ops *ops, PHP_MURMUR3F_CTX *orig_context, PHP_MURMUR3F_CTX *copy_context); diff --git a/ext/hash/php_hash_ripemd.h b/ext/hash/php_hash_ripemd.h index dd9913b85b72a..55a430a4f2bdc 100644 --- a/ext/hash/php_hash_ripemd.h +++ b/ext/hash/php_hash_ripemd.h @@ -47,19 +47,19 @@ typedef struct { } PHP_RIPEMD320_CTX; #define PHP_RIPEMD320_SPEC "l10l2b64." -PHP_HASH_API void PHP_RIPEMD128Init(PHP_RIPEMD128_CTX *); +PHP_HASH_API void PHP_RIPEMD128Init(PHP_RIPEMD128_CTX *, ZEND_ATTRIBUTE_UNUSED HashTable *); PHP_HASH_API void PHP_RIPEMD128Update(PHP_RIPEMD128_CTX *, const unsigned char *, size_t); PHP_HASH_API void PHP_RIPEMD128Final(unsigned char[16], PHP_RIPEMD128_CTX *); -PHP_HASH_API void PHP_RIPEMD160Init(PHP_RIPEMD160_CTX *); +PHP_HASH_API void PHP_RIPEMD160Init(PHP_RIPEMD160_CTX *, ZEND_ATTRIBUTE_UNUSED HashTable *); PHP_HASH_API void PHP_RIPEMD160Update(PHP_RIPEMD160_CTX *, const unsigned char *, size_t); PHP_HASH_API void PHP_RIPEMD160Final(unsigned char[20], PHP_RIPEMD160_CTX *); -PHP_HASH_API void PHP_RIPEMD256Init(PHP_RIPEMD256_CTX *); +PHP_HASH_API void PHP_RIPEMD256Init(PHP_RIPEMD256_CTX *, ZEND_ATTRIBUTE_UNUSED HashTable *); PHP_HASH_API void PHP_RIPEMD256Update(PHP_RIPEMD256_CTX *, const unsigned char *, size_t); PHP_HASH_API void PHP_RIPEMD256Final(unsigned char[32], PHP_RIPEMD256_CTX *); -PHP_HASH_API void PHP_RIPEMD320Init(PHP_RIPEMD320_CTX *); +PHP_HASH_API void PHP_RIPEMD320Init(PHP_RIPEMD320_CTX *, ZEND_ATTRIBUTE_UNUSED HashTable *); PHP_HASH_API void PHP_RIPEMD320Update(PHP_RIPEMD320_CTX *, const unsigned char *, size_t); PHP_HASH_API void PHP_RIPEMD320Final(unsigned char[40], PHP_RIPEMD320_CTX *); diff --git a/ext/hash/php_hash_sha.h b/ext/hash/php_hash_sha.h index 16da9273636a7..4240a6228e147 100644 --- a/ext/hash/php_hash_sha.h +++ b/ext/hash/php_hash_sha.h @@ -29,7 +29,8 @@ typedef struct { } PHP_SHA224_CTX; #define PHP_SHA224_SPEC "l8l2b64." -PHP_HASH_API void PHP_SHA224Init(PHP_SHA224_CTX *); +#define PHP_SHA224Init(ctx) PHP_SHA224InitArgs(ctx, NULL) +PHP_HASH_API void PHP_SHA224InitArgs(PHP_SHA224_CTX *, ZEND_ATTRIBUTE_UNUSED HashTable *); PHP_HASH_API void PHP_SHA224Update(PHP_SHA224_CTX *, const unsigned char *, size_t); PHP_HASH_API void PHP_SHA224Final(unsigned char[28], PHP_SHA224_CTX *); @@ -41,7 +42,8 @@ typedef struct { } PHP_SHA256_CTX; #define PHP_SHA256_SPEC "l8l2b64." -PHP_HASH_API void PHP_SHA256Init(PHP_SHA256_CTX *); +#define PHP_SHA256Init(ctx) PHP_SHA256InitArgs(ctx, NULL) +PHP_HASH_API void PHP_SHA256InitArgs(PHP_SHA256_CTX *, ZEND_ATTRIBUTE_UNUSED HashTable *); PHP_HASH_API void PHP_SHA256Update(PHP_SHA256_CTX *, const unsigned char *, size_t); PHP_HASH_API void PHP_SHA256Final(unsigned char[32], PHP_SHA256_CTX *); @@ -53,7 +55,8 @@ typedef struct { } PHP_SHA384_CTX; #define PHP_SHA384_SPEC "q8q2b128." -PHP_HASH_API void PHP_SHA384Init(PHP_SHA384_CTX *); +#define PHP_SHA384Init(ctx) PHP_SHA384InitArgs(ctx, NULL) +PHP_HASH_API void PHP_SHA384InitArgs(PHP_SHA384_CTX *, ZEND_ATTRIBUTE_UNUSED HashTable *); PHP_HASH_API void PHP_SHA384Update(PHP_SHA384_CTX *, const unsigned char *, size_t); PHP_HASH_API void PHP_SHA384Final(unsigned char[48], PHP_SHA384_CTX *); @@ -65,15 +68,18 @@ typedef struct { } PHP_SHA512_CTX; #define PHP_SHA512_SPEC "q8q2b128." -PHP_HASH_API void PHP_SHA512Init(PHP_SHA512_CTX *); +#define PHP_SHA512Init(ctx) PHP_SHA512InitArgs(ctx, NULL) +PHP_HASH_API void PHP_SHA512InitArgs(PHP_SHA512_CTX *, ZEND_ATTRIBUTE_UNUSED HashTable *); PHP_HASH_API void PHP_SHA512Update(PHP_SHA512_CTX *, const unsigned char *, size_t); PHP_HASH_API void PHP_SHA512Final(unsigned char[64], PHP_SHA512_CTX *); -PHP_HASH_API void PHP_SHA512_256Init(PHP_SHA512_CTX *); +#define PHP_SHA512_256Init(ctx) PHP_SHA512_256InitArgs(ctx, NULL) +PHP_HASH_API void PHP_SHA512_256InitArgs(PHP_SHA512_CTX *, ZEND_ATTRIBUTE_UNUSED HashTable *); #define PHP_SHA512_256Update PHP_SHA512Update PHP_HASH_API void PHP_SHA512_256Final(unsigned char[32], PHP_SHA512_CTX *); -PHP_HASH_API void PHP_SHA512_224Init(PHP_SHA512_CTX *); +#define PHP_SHA512_224Init(ctx) PHP_SHA512_224InitArgs(ctx, NULL) +PHP_HASH_API void PHP_SHA512_224InitArgs(PHP_SHA512_CTX *, ZEND_ATTRIBUTE_UNUSED HashTable *); #define PHP_SHA512_224Update PHP_SHA512Update PHP_HASH_API void PHP_SHA512_224Final(unsigned char[28], PHP_SHA512_CTX *); diff --git a/ext/hash/php_hash_sha3.h b/ext/hash/php_hash_sha3.h index f75191f339fc6..b8bd310ccef66 100644 --- a/ext/hash/php_hash_sha3.h +++ b/ext/hash/php_hash_sha3.h @@ -36,19 +36,19 @@ typedef PHP_SHA3_CTX PHP_SHA3_256_CTX; typedef PHP_SHA3_CTX PHP_SHA3_384_CTX; typedef PHP_SHA3_CTX PHP_SHA3_512_CTX; -PHP_HASH_API void PHP_SHA3224Init(PHP_SHA3_224_CTX*); +PHP_HASH_API void PHP_SHA3224Init(PHP_SHA3_224_CTX*, ZEND_ATTRIBUTE_UNUSED HashTable *); PHP_HASH_API void PHP_SHA3224Update(PHP_SHA3_224_CTX*, const unsigned char*, size_t); PHP_HASH_API void PHP_SAH3224Final(unsigned char[32], PHP_SHA3_224_CTX*); -PHP_HASH_API void PHP_SHA3256Init(PHP_SHA3_256_CTX*); +PHP_HASH_API void PHP_SHA3256Init(PHP_SHA3_256_CTX*, ZEND_ATTRIBUTE_UNUSED HashTable *); PHP_HASH_API void PHP_SHA3256Update(PHP_SHA3_256_CTX*, const unsigned char*, size_t); PHP_HASH_API void PHP_SAH3256Final(unsigned char[32], PHP_SHA3_256_CTX*); -PHP_HASH_API void PHP_SHA3384Init(PHP_SHA3_384_CTX*); +PHP_HASH_API void PHP_SHA3384Init(PHP_SHA3_384_CTX*, ZEND_ATTRIBUTE_UNUSED HashTable *); PHP_HASH_API void PHP_SHA3384Update(PHP_SHA3_384_CTX*, const unsigned char*, size_t); PHP_HASH_API void PHP_SAH3384Final(unsigned char[32], PHP_SHA3_384_CTX*); -PHP_HASH_API void PHP_SHA3512Init(PHP_SHA3_512_CTX*); +PHP_HASH_API void PHP_SHA3512Init(PHP_SHA3_512_CTX*, ZEND_ATTRIBUTE_UNUSED HashTable *); PHP_HASH_API void PHP_SHA3512Update(PHP_SHA3_512_CTX*, const unsigned char*, size_t); PHP_HASH_API void PHP_SAH3512Final(unsigned char[32], PHP_SHA3_512_CTX*); diff --git a/ext/hash/php_hash_snefru.h b/ext/hash/php_hash_snefru.h index 0f339e93090ab..c533b576a909f 100644 --- a/ext/hash/php_hash_snefru.h +++ b/ext/hash/php_hash_snefru.h @@ -32,7 +32,7 @@ typedef struct { } PHP_SNEFRU_CTX; #define PHP_SNEFRU_SPEC "l16l2bb32" -PHP_HASH_API void PHP_SNEFRUInit(PHP_SNEFRU_CTX *); +PHP_HASH_API void PHP_SNEFRUInit(PHP_SNEFRU_CTX *, ZEND_ATTRIBUTE_UNUSED HashTable *); PHP_HASH_API void PHP_SNEFRUUpdate(PHP_SNEFRU_CTX *, const unsigned char *, size_t); PHP_HASH_API void PHP_SNEFRUFinal(unsigned char[32], PHP_SNEFRU_CTX *); diff --git a/ext/hash/php_hash_tiger.h b/ext/hash/php_hash_tiger.h index d30276ddeaa29..6854c3588715f 100644 --- a/ext/hash/php_hash_tiger.h +++ b/ext/hash/php_hash_tiger.h @@ -27,8 +27,8 @@ typedef struct { } PHP_TIGER_CTX; #define PHP_TIGER_SPEC "q3qb64l" -PHP_HASH_API void PHP_3TIGERInit(PHP_TIGER_CTX *context); -PHP_HASH_API void PHP_4TIGERInit(PHP_TIGER_CTX *context); +PHP_HASH_API void PHP_3TIGERInit(PHP_TIGER_CTX *context, ZEND_ATTRIBUTE_UNUSED HashTable *args); +PHP_HASH_API void PHP_4TIGERInit(PHP_TIGER_CTX *context, ZEND_ATTRIBUTE_UNUSED HashTable *args); PHP_HASH_API void PHP_TIGERUpdate(PHP_TIGER_CTX *context, const unsigned char *input, size_t len); PHP_HASH_API void PHP_TIGER128Final(unsigned char digest[16], PHP_TIGER_CTX *context); PHP_HASH_API void PHP_TIGER160Final(unsigned char digest[20], PHP_TIGER_CTX *context); diff --git a/ext/hash/php_hash_whirlpool.h b/ext/hash/php_hash_whirlpool.h index fbd5948a4817b..376d75a94009f 100644 --- a/ext/hash/php_hash_whirlpool.h +++ b/ext/hash/php_hash_whirlpool.h @@ -29,7 +29,7 @@ typedef struct { } PHP_WHIRLPOOL_CTX; #define PHP_WHIRLPOOL_SPEC "q8b32iib64." -PHP_HASH_API void PHP_WHIRLPOOLInit(PHP_WHIRLPOOL_CTX *); +PHP_HASH_API void PHP_WHIRLPOOLInit(PHP_WHIRLPOOL_CTX *, ZEND_ATTRIBUTE_UNUSED HashTable *); PHP_HASH_API void PHP_WHIRLPOOLUpdate(PHP_WHIRLPOOL_CTX *, const unsigned char *, size_t); PHP_HASH_API void PHP_WHIRLPOOLFinal(unsigned char[64], PHP_WHIRLPOOL_CTX *); diff --git a/ext/hash/tests/murmurhash3_seed.phpt b/ext/hash/tests/murmurhash3_seed.phpt new file mode 100644 index 0000000000000..68cc10a71935a --- /dev/null +++ b/ext/hash/tests/murmurhash3_seed.phpt @@ -0,0 +1,52 @@ +--TEST-- +Hash: MurmurHash3 seed +--FILE-- + 42]); +hash_update($ctx, "Two"); +hash_update($ctx, " hashes"); +hash_update($ctx, " meet"); +hash_update($ctx, " in"); +hash_update($ctx, " a"); +hash_update($ctx, " bar."); +$h0 = hash_final($ctx); +echo $h0, "\n"; + +$h0 = hash("murmur3f", "Two hashes meet in a bar.", options: ["seed" => 42]); +echo $h0, "\n"; + +$ctx = hash_init("murmur3c", options: ["seed" => 106]); +hash_update($ctx, "Two"); +hash_update($ctx, " hashes"); +hash_update($ctx, " meet"); +hash_update($ctx, " in"); +hash_update($ctx, " a"); +hash_update($ctx, " bar."); +$h0 = hash_final($ctx); +echo $h0, "\n"; + +$h0 = hash("murmur3c", "Two hashes meet in a bar.", options: ["seed" => 106]); +echo $h0, "\n"; + +$ctx = hash_init("murmur3a", options: ["seed" => 2345]); +hash_update($ctx, "Two"); +hash_update($ctx, " hashes"); +hash_update($ctx, " meet"); +hash_update($ctx, " in"); +hash_update($ctx, " a"); +hash_update($ctx, " bar."); +$h0 = hash_final($ctx); +echo $h0, "\n"; + +$h0 = hash("murmur3a", "Two hashes meet in a bar.", options: ["seed" => 2345]); +echo $h0, "\n"; + +?> +--EXPECT-- +95855f9be0db784a5c37e878c4a4dcee +95855f9be0db784a5c37e878c4a4dcee +f64c9eb40287fa686575163893e283b2 +f64c9eb40287fa686575163893e283b2 +7f7ec59b +7f7ec59b diff --git a/ext/imap/php_imap.c b/ext/imap/php_imap.c index 4c72c90ff625f..dc7f3b087a343 100644 --- a/ext/imap/php_imap.c +++ b/ext/imap/php_imap.c @@ -152,6 +152,28 @@ static int le_imap; RETURN_FALSE; \ } \ +#define PHP_IMAP_CHECK_MSGNO_MAYBE_UID_PRE_FLAG_CHECKS(msgindex, arg_pos) \ + if (msgindex < 1) { \ + zend_argument_value_error(arg_pos, "must be greater than 0"); \ + RETURN_THROWS(); \ + } \ + +#define PHP_IMAP_CHECK_MSGNO_MAYBE_UID_POST_FLAG_CHECKS(msgindex, arg_pos, func_flags, uid_flag) \ + if (func_flags & uid_flag) { \ + /* This should be cached; if it causes an extra RTT to the IMAP server, */ \ + /* then that's the price we pay for making sure we don't crash. */ \ + unsigned int msg_no_from_uid = mail_msgno(imap_le_struct->imap_stream, msgindex); \ + if (msg_no_from_uid == 0) { \ + php_error_docref(NULL, E_WARNING, "UID does not exist"); \ + RETURN_FALSE; \ + } \ + } else { \ + if (((unsigned) msgindex) > imap_le_struct->imap_stream->nmsgs) { \ + php_error_docref(NULL, E_WARNING, "Bad message number"); \ + RETURN_FALSE; \ + } \ + } \ + /* {{{ mail_close_it */ static void mail_close_it(zend_resource *rsrc) { @@ -175,8 +197,8 @@ static void mail_close_it(zend_resource *rsrc) } /* }}} */ -/* {{{ add_assoc_object */ -static zval *add_assoc_object(zval *arg, char *key, zval *tmp) +/* {{{ php_imap_hash_add_object */ +static zval *php_imap_hash_add_object(zval *arg, char *key, zval *tmp) { HashTable *symtable; @@ -189,8 +211,8 @@ static zval *add_assoc_object(zval *arg, char *key, zval *tmp) } /* }}} */ -/* {{{ add_next_index_object */ -static inline zval *add_next_index_object(zval *arg, zval *tmp) +/* {{{ php_imap_list_add_object */ +static inline zval *php_imap_list_add_object(zval *arg, zval *tmp) { HashTable *symtable; @@ -1258,7 +1280,6 @@ PHP_FUNCTION(imap_body) zval *streamind; zend_long msgno, flags = 0; pils *imap_le_struct; - unsigned long msgindex; char *body; unsigned long body_len = 0; @@ -1270,32 +1291,15 @@ PHP_FUNCTION(imap_body) RETURN_THROWS(); } - if (msgno < 1) { - zend_argument_value_error(2, "must be greater than 0"); - RETURN_THROWS(); - } + PHP_IMAP_CHECK_MSGNO_MAYBE_UID_PRE_FLAG_CHECKS(msgno, 2); if (flags && ((flags & ~(FT_UID|FT_PEEK|FT_INTERNAL)) != 0)) { zend_argument_value_error(3, "must be a bitmask of FT_UID, FT_PEEK, and FT_INTERNAL"); RETURN_THROWS(); } - if (flags && (flags & FT_UID)) { - /* This should be cached; if it causes an extra RTT to the - IMAP server, then that's the price we pay for making - sure we don't crash. */ - msgindex = mail_msgno(imap_le_struct->imap_stream, msgno); - if (msgindex == 0) { - php_error_docref(NULL, E_WARNING, "UID does not exist"); - RETURN_FALSE; - } - } else { - msgindex = (unsigned long) msgno; - } + PHP_IMAP_CHECK_MSGNO_MAYBE_UID_POST_FLAG_CHECKS(msgno, 2, flags, FT_UID); - PHP_IMAP_CHECK_MSGNO(msgindex, 2); - - /* TODO Shouldn't this pass msgindex??? */ body = mail_fetchtext_full (imap_le_struct->imap_stream, msgno, &body_len, flags); if (body_len == 0) { RETVAL_EMPTY_STRING(); @@ -1305,6 +1309,7 @@ PHP_FUNCTION(imap_body) } /* }}} */ +/* TODO UID Tests */ /* {{{ Copy specified message to a mailbox */ PHP_FUNCTION(imap_mail_copy) { @@ -1334,6 +1339,7 @@ PHP_FUNCTION(imap_mail_copy) } /* }}} */ +/* TODO UID Tests */ /* {{{ Move specified message to a mailbox */ PHP_FUNCTION(imap_mail_move) { @@ -1513,7 +1519,7 @@ PHP_FUNCTION(imap_getmailboxes) #else add_property_string(&mboxob, "delimiter", cur->delimiter); #endif - add_next_index_object(return_value, &mboxob); + php_imap_list_add_object(return_value, &mboxob); cur=cur->next; } mail_free_foblist(&IMAPG(imap_folder_objects), &IMAPG(imap_folder_objects_tail)); @@ -1605,13 +1611,15 @@ PHP_FUNCTION(imap_delete) RETURN_THROWS(); } + // TODO Check sequence validity? + if (flags && ((flags & ~FT_UID) != 0)) { zend_argument_value_error(3, "must be FT_UID or 0"); RETURN_THROWS(); } mail_setflag_full(imap_le_struct->imap_stream, ZSTR_VAL(sequence), "\\DELETED", flags); - RETVAL_TRUE; + RETURN_TRUE; } /* }}} */ @@ -1820,7 +1828,7 @@ PHP_FUNCTION(imap_getsubscribed) #else add_property_string(&mboxob, "delimiter", cur->delimiter); #endif - add_next_index_object(return_value, &mboxob); + php_imap_list_add_object(return_value, &mboxob); cur=cur->next; } mail_free_foblist (&IMAPG(imap_sfolder_objects), &IMAPG(imap_sfolder_objects_tail)); @@ -1882,7 +1890,6 @@ PHP_FUNCTION(imap_fetchstructure) zend_long msgno, flags = 0; pils *imap_le_struct; BODY *body; - int msgindex; if (zend_parse_parameters(ZEND_NUM_ARGS(), "rl|l", &streamind, &msgno, &flags) == FAILURE) { RETURN_THROWS(); @@ -1892,34 +1899,18 @@ PHP_FUNCTION(imap_fetchstructure) RETURN_THROWS(); } - if (msgno < 1) { - zend_argument_value_error(2, "must be greater than 0"); - RETURN_THROWS(); - } + PHP_IMAP_CHECK_MSGNO_MAYBE_UID_PRE_FLAG_CHECKS(msgno, 2); if (flags && ((flags & ~FT_UID) != 0)) { zend_argument_value_error(3, "must be FT_UID or 0"); RETURN_THROWS(); } - object_init(return_value); + PHP_IMAP_CHECK_MSGNO_MAYBE_UID_POST_FLAG_CHECKS(msgno, 2, flags, FT_UID); - if (flags & FT_UID) { - /* This should be cached; if it causes an extra RTT to the - IMAP server, then that's the price we pay for making - sure we don't crash. */ - msgindex = mail_msgno(imap_le_struct->imap_stream, msgno); - if (msgindex == 0) { - php_error_docref(NULL, E_WARNING, "UID does not exist"); - RETURN_FALSE; - } - } else { - msgindex = msgno; - } - PHP_IMAP_CHECK_MSGNO(msgindex, 2); + object_init(return_value); - /* TODO Shouldn't this pass msgindex??? */ - mail_fetchstructure_full(imap_le_struct->imap_stream, msgno, &body , (ZEND_NUM_ARGS() == 3 ? flags : NIL)); + mail_fetchstructure_full(imap_le_struct->imap_stream, msgno, &body , flags); if (!body) { php_error_docref(NULL, E_WARNING, "No body information available"); @@ -1948,20 +1939,14 @@ PHP_FUNCTION(imap_fetchbody) RETURN_THROWS(); } - if (msgno < 1) { - zend_argument_value_error(2, "must be greater than 0"); - RETURN_THROWS(); - } + PHP_IMAP_CHECK_MSGNO_MAYBE_UID_PRE_FLAG_CHECKS(msgno, 2); if (flags && ((flags & ~(FT_UID|FT_PEEK|FT_INTERNAL)) != 0)) { zend_argument_value_error(4, "must be a bitmask of FT_UID, FT_PEEK, and FT_INTERNAL"); RETURN_THROWS(); } - if (!(flags & FT_UID)) { - /* only perform the check if the msgno is a message number and not a UID */ - PHP_IMAP_CHECK_MSGNO(msgno, 2); - } + PHP_IMAP_CHECK_MSGNO_MAYBE_UID_POST_FLAG_CHECKS(msgno, 2, flags, FT_UID); body = mail_fetchbody_full(imap_le_struct->imap_stream, msgno, ZSTR_VAL(sec), &len, flags); @@ -1989,24 +1974,18 @@ PHP_FUNCTION(imap_fetchmime) RETURN_THROWS(); } - if (msgno < 1) { - zend_argument_value_error(2, "must be greater than 0"); + if ((imap_le_struct = (pils *)zend_fetch_resource(Z_RES_P(streamind), "imap", le_imap)) == NULL) { RETURN_THROWS(); } + PHP_IMAP_CHECK_MSGNO_MAYBE_UID_PRE_FLAG_CHECKS(msgno, 2); + if (flags && ((flags & ~(FT_UID|FT_PEEK|FT_INTERNAL)) != 0)) { zend_argument_value_error(4, "must be a bitmask of FT_UID, FT_PEEK, and FT_INTERNAL"); RETURN_THROWS(); } - if ((imap_le_struct = (pils *)zend_fetch_resource(Z_RES_P(streamind), "imap", le_imap)) == NULL) { - RETURN_THROWS(); - } - - if (!(flags & FT_UID)) { - /* only perform the check if the msgno is a message number and not a UID */ - PHP_IMAP_CHECK_MSGNO(msgno, 2); - } + PHP_IMAP_CHECK_MSGNO_MAYBE_UID_POST_FLAG_CHECKS(msgno, 2, flags, FT_UID); body = mail_fetch_mime(imap_le_struct->imap_stream, msgno, ZSTR_VAL(sec), &len, flags); @@ -2037,17 +2016,14 @@ PHP_FUNCTION(imap_savebody) RETURN_THROWS(); } - PHP_IMAP_CHECK_MSGNO(msgno, 3); + PHP_IMAP_CHECK_MSGNO_MAYBE_UID_PRE_FLAG_CHECKS(msgno, 3) if (flags && ((flags & ~(FT_UID|FT_PEEK|FT_INTERNAL)) != 0)) { zend_argument_value_error(5, "must be a bitmask of FT_UID, FT_PEEK, and FT_INTERNAL"); RETURN_THROWS(); } - // TODO Drop this? - if (!imap_le_struct) { - RETURN_FALSE; - } + PHP_IMAP_CHECK_MSGNO_MAYBE_UID_POST_FLAG_CHECKS(msgno, 3, flags, FT_UID); switch (Z_TYPE_P(out)) { @@ -2294,7 +2270,7 @@ PHP_FUNCTION(imap_rfc822_parse_adrlist) if (addresstmp->adl) { add_property_string(&tovals, "adl", addresstmp->adl); } - add_next_index_object(return_value, &tovals); + php_imap_list_add_object(return_value, &tovals); } while ((addresstmp = addresstmp->next)); mail_free_envelope(&env); @@ -2771,9 +2747,8 @@ PHP_FUNCTION(imap_sort) PHP_FUNCTION(imap_fetchheader) { zval *streamind; - zend_long msgno, flags = 0L; + zend_long msgno, flags = 0; pils *imap_le_struct; - int msgindex; if (zend_parse_parameters(ZEND_NUM_ARGS(), "rl|l", &streamind, &msgno, &flags) == FAILURE) { RETURN_THROWS(); @@ -2783,30 +2758,16 @@ PHP_FUNCTION(imap_fetchheader) RETURN_THROWS(); } - // TODO Check for msgno < 1 now or wait later for PHP_IMAP_CHECK_MSGNO check? + PHP_IMAP_CHECK_MSGNO_MAYBE_UID_PRE_FLAG_CHECKS(msgno, 2); if (flags && ((flags & ~(FT_UID|FT_INTERNAL|FT_PREFETCHTEXT)) != 0)) { zend_argument_value_error(3, "must be a bitmask of FT_UID, FT_PREFETCHTEXT, and FT_INTERNAL"); RETURN_THROWS(); } - if (flags & FT_UID) { - /* This should be cached; if it causes an extra RTT to the - IMAP server, then that's the price we pay for making sure - we don't crash. */ - msgindex = mail_msgno(imap_le_struct->imap_stream, msgno); - if (msgindex == 0) { - php_error_docref(NULL, E_WARNING, "UID does not exist"); - RETURN_FALSE; - } - } else { - msgindex = msgno; - } - - PHP_IMAP_CHECK_MSGNO(msgindex, 2); + PHP_IMAP_CHECK_MSGNO_MAYBE_UID_POST_FLAG_CHECKS(msgno, 2, flags, FT_UID); - /* TODO Check shouldn't this pass msgindex???? */ - RETVAL_STRING(mail_fetchheader_full(imap_le_struct->imap_stream, msgno, NIL, NIL, (ZEND_NUM_ARGS() == 3 ? flags : NIL))); + RETVAL_STRING(mail_fetchheader_full(imap_le_struct->imap_stream, msgno, NIL, NIL, flags)); } /* }}} */ @@ -2835,10 +2796,10 @@ PHP_FUNCTION(imap_uid) PHP_FUNCTION(imap_msgno) { zval *streamind; - zend_long msgno; + zend_long msg_uid; pils *imap_le_struct; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rl", &streamind, &msgno) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rl", &streamind, &msg_uid) == FAILURE) { RETURN_THROWS(); } @@ -2846,9 +2807,13 @@ PHP_FUNCTION(imap_msgno) RETURN_THROWS(); } - PHP_IMAP_CHECK_MSGNO(msgno, 2); + /* Do NOT use the PHP_IMAP_CHECK_MSGNO() macro as UID cannot be checked for their upper bound. */ + if (msg_uid < 1) { + zend_argument_value_error(2, "must be greater than 0"); + RETURN_THROWS(); + } - RETURN_LONG(mail_msgno(imap_le_struct->imap_stream, msgno)); + RETURN_LONG(mail_msgno(imap_le_struct->imap_stream, msg_uid)); } /* }}} */ @@ -2974,9 +2939,9 @@ PHP_FUNCTION(imap_bodystruct) object_init(&dparam); add_property_string(&dparam, "attribute", dpar->attribute); add_property_string(&dparam, "value", dpar->value); - add_next_index_object(&dparametres, &dparam); + php_imap_list_add_object(&dparametres, &dparam); } while ((dpar = dpar->next)); - add_assoc_object(return_value, "dparameters", &dparametres); + php_imap_hash_add_object(return_value, "dparameters", &dparametres); } else { add_property_long(return_value, "ifdparameters", 0); } @@ -2995,13 +2960,13 @@ PHP_FUNCTION(imap_bodystruct) add_property_string(¶m, "value", par->value); } - add_next_index_object(¶metres, ¶m); + php_imap_list_add_object(¶metres, ¶m); } while ((par = par->next)); } else { object_init(¶metres); add_property_long(return_value, "ifparameters", 0); } - add_assoc_object(return_value, "parameters", ¶metres); + php_imap_hash_add_object(return_value, "parameters", ¶metres); } /* }}} */ @@ -3083,7 +3048,7 @@ PHP_FUNCTION(imap_fetch_overview) add_property_long(&myoverview, "seen", elt->seen); add_property_long(&myoverview, "draft", elt->draft); add_property_long(&myoverview, "udate", mail_longdate(elt)); - add_next_index_object(return_value, &myoverview); + php_imap_list_add_object(return_value, &myoverview); } } } @@ -4078,7 +4043,7 @@ static zend_string* _php_imap_parse_address (ADDRESS *addresslist, zval *paddres if (addresstmp->adl) add_property_string(&tmpvals, "adl", addresstmp->adl); if (addresstmp->mailbox) add_property_string(&tmpvals, "mailbox", addresstmp->mailbox); if (addresstmp->host) add_property_string(&tmpvals, "host", addresstmp->host); - add_next_index_object(paddress, &tmpvals); + php_imap_list_add_object(paddress, &tmpvals); } while ((addresstmp = addresstmp->next)); return fulladdress; } @@ -4109,7 +4074,7 @@ static void _php_make_header_object(zval *myzvalue, ENVELOPE *en) if (fulladdress) { add_property_str(myzvalue, "toaddress", fulladdress); } - add_assoc_object(myzvalue, "to", &paddress); + php_imap_hash_add_object(myzvalue, "to", &paddress); } if (en->from) { @@ -4118,7 +4083,7 @@ static void _php_make_header_object(zval *myzvalue, ENVELOPE *en) if (fulladdress) { add_property_str(myzvalue, "fromaddress", fulladdress); } - add_assoc_object(myzvalue, "from", &paddress); + php_imap_hash_add_object(myzvalue, "from", &paddress); } if (en->cc) { @@ -4127,7 +4092,7 @@ static void _php_make_header_object(zval *myzvalue, ENVELOPE *en) if (fulladdress) { add_property_str(myzvalue, "ccaddress", fulladdress); } - add_assoc_object(myzvalue, "cc", &paddress); + php_imap_hash_add_object(myzvalue, "cc", &paddress); } if (en->bcc) { @@ -4136,7 +4101,7 @@ static void _php_make_header_object(zval *myzvalue, ENVELOPE *en) if (fulladdress) { add_property_str(myzvalue, "bccaddress", fulladdress); } - add_assoc_object(myzvalue, "bcc", &paddress); + php_imap_hash_add_object(myzvalue, "bcc", &paddress); } if (en->reply_to) { @@ -4145,7 +4110,7 @@ static void _php_make_header_object(zval *myzvalue, ENVELOPE *en) if (fulladdress) { add_property_str(myzvalue, "reply_toaddress", fulladdress); } - add_assoc_object(myzvalue, "reply_to", &paddress); + php_imap_hash_add_object(myzvalue, "reply_to", &paddress); } if (en->sender) { @@ -4154,7 +4119,7 @@ static void _php_make_header_object(zval *myzvalue, ENVELOPE *en) if (fulladdress) { add_property_str(myzvalue, "senderaddress", fulladdress); } - add_assoc_object(myzvalue, "sender", &paddress); + php_imap_hash_add_object(myzvalue, "sender", &paddress); } if (en->return_path) { @@ -4163,7 +4128,7 @@ static void _php_make_header_object(zval *myzvalue, ENVELOPE *en) if (fulladdress) { add_property_str(myzvalue, "return_pathaddress", fulladdress); } - add_assoc_object(myzvalue, "return_path", &paddress); + php_imap_hash_add_object(myzvalue, "return_path", &paddress); } } /* }}} */ @@ -4228,9 +4193,9 @@ void _php_imap_add_body(zval *arg, BODY *body) object_init(&dparam); add_property_string(&dparam, "attribute", dpar->attribute); add_property_string(&dparam, "value", dpar->value); - add_next_index_object(&dparametres, &dparam); + php_imap_list_add_object(&dparametres, &dparam); } while ((dpar = dpar->next)); - add_assoc_object(arg, "dparameters", &dparametres); + php_imap_hash_add_object(arg, "dparameters", &dparametres); } else { add_property_long(arg, "ifdparameters", 0); } @@ -4249,13 +4214,13 @@ void _php_imap_add_body(zval *arg, BODY *body) add_property_string(¶m, "value", par->value); } - add_next_index_object(¶metres, ¶m); + php_imap_list_add_object(¶metres, ¶m); } while ((par = par->next)); } else { object_init(¶metres); add_property_long(arg, "ifparameters", 0); } - add_assoc_object(arg, "parameters", ¶metres); + php_imap_hash_add_object(arg, "parameters", ¶metres); /* multipart message ? */ if (body->type == TYPEMULTIPART) { @@ -4263,9 +4228,9 @@ void _php_imap_add_body(zval *arg, BODY *body) for (part = body->CONTENT_PART; part; part = part->next) { object_init(¶m); _php_imap_add_body(¶m, &part->body); - add_next_index_object(¶metres, ¶m); + php_imap_list_add_object(¶metres, ¶m); } - add_assoc_object(arg, "parts", ¶metres); + php_imap_hash_add_object(arg, "parts", ¶metres); } /* encapsulated message ? */ @@ -4274,8 +4239,8 @@ void _php_imap_add_body(zval *arg, BODY *body) array_init(¶metres); object_init(¶m); _php_imap_add_body(¶m, body); - add_next_index_object(¶metres, ¶m); - add_assoc_object(arg, "parts", ¶metres); + php_imap_list_add_object(¶metres, ¶m); + php_imap_hash_add_object(arg, "parts", ¶metres); } } /* }}} */ diff --git a/ext/imap/tests/bug80438.phpt b/ext/imap/tests/bug80438.phpt new file mode 100644 index 0000000000000..70f0270e4f991 --- /dev/null +++ b/ext/imap/tests/bug80438.phpt @@ -0,0 +1,64 @@ +--TEST-- +Bug #80438: imap_msgno() incorrectly warns and return false on valid UIDs in PHP 8.0.0 +--SKIPIF-- + +--FILE-- + +--CLEAN-- + +--EXPECT-- +Create a temporary mailbox and add 10 msgs +New mailbox created +Delete 4 messages for Unique ID generation +array(6) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(7) + [3]=> + int(8) + [4]=> + int(9) + [5]=> + int(10) +} +Unique ID: int(1) +Ordered message number: int(1) +Unique ID: int(2) +Ordered message number: int(2) +Unique ID: int(7) +Ordered message number: int(3) +Unique ID: int(8) +Ordered message number: int(4) +Unique ID: int(9) +Ordered message number: int(5) +Unique ID: int(10) +Ordered message number: int(6) diff --git a/ext/imap/tests/imap_body.phpt b/ext/imap/tests/imap_body_errors.phpt similarity index 62% rename from ext/imap/tests/imap_body.phpt rename to ext/imap/tests/imap_body_errors.phpt index 59678ad53980f..8cc33b35c0527 100644 --- a/ext/imap/tests/imap_body.phpt +++ b/ext/imap/tests/imap_body_errors.phpt @@ -1,5 +1,5 @@ --TEST-- -imap_body() ValueError +imap_body() errors: ValueError and Warnings --CREDITS-- Paul Sohier #phptestfest utrecht @@ -12,28 +12,29 @@ require_once(__DIR__.'/setup/skipif.inc'); require_once(__DIR__.'/setup/imap_include.inc'); -$imap_stream = setup_test_mailbox("imapbodyvalueerror", 0); +$imap_mail_box = setup_test_mailbox("imapbodyerror", 0); try { - imap_body($imap_stream,-1); + imap_body($imap_mail_box, -1); } catch (\ValueError $e) { echo $e->getMessage() . \PHP_EOL; } try { - imap_body($imap_stream,1,-1); + imap_body($imap_mail_box, 1, -1); } catch (\ValueError $e) { echo $e->getMessage() . \PHP_EOL; } -//Access not existing -var_dump(imap_body($imap_stream, 255, FT_UID)); +// Access not existing +var_dump(imap_body($imap_mail_box, 255)); +var_dump(imap_body($imap_mail_box, 255, FT_UID)); -imap_close($imap_stream); +imap_close($imap_mail_box); ?> --CLEAN-- --EXPECTF-- @@ -42,5 +43,8 @@ New mailbox created imap_body(): Argument #2 ($message_num) must be greater than 0 imap_body(): Argument #3 ($flags) must be a bitmask of FT_UID, FT_PEEK, and FT_INTERNAL +Warning: imap_body(): Bad message number in %s on line %d +bool(false) + Warning: imap_body(): UID does not exist in %s on line %d bool(false) diff --git a/ext/imap/tests/imap_body_uid.phpt b/ext/imap/tests/imap_body_uid.phpt new file mode 100644 index 0000000000000..1c0de85a61c41 --- /dev/null +++ b/ext/imap/tests/imap_body_uid.phpt @@ -0,0 +1,28 @@ +--TEST-- +imap_body() passing a unique ID +--SKIPIF-- + +--FILE-- + +--CLEAN-- + +--EXPECT-- +Create a temporary mailbox and add 10 msgs +New mailbox created +Delete 4 messages for Unique ID generation +bool(true) diff --git a/ext/imap/tests/imap_clearflag_full_uid.phpt b/ext/imap/tests/imap_clearflag_full_uid.phpt new file mode 100644 index 0000000000000..3a218656e3709 --- /dev/null +++ b/ext/imap/tests/imap_clearflag_full_uid.phpt @@ -0,0 +1,90 @@ +--TEST-- +imap_clearflag_full() passing a unique ID +--SKIPIF-- + +--FILE-- + +--CLEAN-- + +--EXPECT-- +Create a temporary mailbox and add 10 msgs +New mailbox created +Delete 4 messages for Unique ID generation +ALL: array(6) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(3) + [3]=> + int(4) + [4]=> + int(5) + [5]=> + int(6) +} +ALL (with UID correspondance): array(6) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(7) + [3]=> + int(8) + [4]=> + int(9) + [5]=> + int(10) +} +ANSWERED: array(1) { + [0]=> + int(4) +} +DELETED: array(1) { + [0]=> + int(3) +} +FLAGGED: array(1) { + [0]=> + int(5) +} diff --git a/ext/imap/tests/imap_delete_uid.phpt b/ext/imap/tests/imap_delete_uid.phpt new file mode 100644 index 0000000000000..433e015f851a5 --- /dev/null +++ b/ext/imap/tests/imap_delete_uid.phpt @@ -0,0 +1,51 @@ +--TEST-- +imap_delete() passing a unique ID +--SKIPIF-- + +--FILE-- + +--CLEAN-- + +--EXPECT-- +Create a temporary mailbox and add 10 msgs +New mailbox created +Delete 4 messages for Unique ID generation +array(1) { + [0]=> + int(9) +} +After expunging: bool(false) +array(5) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(7) + [3]=> + int(8) + [4]=> + int(10) +} diff --git a/ext/imap/tests/imap_fetch_overview_uid.phpt b/ext/imap/tests/imap_fetch_overview_uid.phpt new file mode 100644 index 0000000000000..4c460edae1931 --- /dev/null +++ b/ext/imap/tests/imap_fetch_overview_uid.phpt @@ -0,0 +1,29 @@ +--TEST-- +imap_fetch_overview() passing a unique ID +--SKIPIF-- + +--FILE-- + +--CLEAN-- + +--EXPECT-- +Create a temporary mailbox and add 10 msgs +New mailbox created +Delete 4 messages for Unique ID generation +bool(true) diff --git a/ext/imap/tests/imap_fetchbody_errors.phpt b/ext/imap/tests/imap_fetchbody_errors.phpt new file mode 100644 index 0000000000000..e4eb13b3aedd2 --- /dev/null +++ b/ext/imap/tests/imap_fetchbody_errors.phpt @@ -0,0 +1,49 @@ +--TEST-- +imap_fetchbody() errors: ValueError and Warnings +--SKIPIF-- + +--FILE-- +getMessage() . \PHP_EOL; +} +try { + imap_fetchbody($imap_mail_box, 1, $section, -1); +} catch (\ValueError $e) { + echo $e->getMessage() . \PHP_EOL; +} + +// Access not existing +var_dump(imap_fetchbody($imap_mail_box, 255, $section)); +var_dump(imap_fetchbody($imap_mail_box, 255, $section, FT_UID)); + +imap_close($imap_mail_box); + +?> +--CLEAN-- + +--EXPECTF-- +Create a temporary mailbox and add 0 msgs +New mailbox created +imap_fetchbody(): Argument #2 ($message_num) must be greater than 0 +imap_fetchbody(): Argument #4 ($flags) must be a bitmask of FT_UID, FT_PEEK, and FT_INTERNAL + +Warning: imap_fetchbody(): Bad message number in %s on line %d +bool(false) + +Warning: imap_fetchbody(): UID does not exist in %s on line %d +bool(false) diff --git a/ext/imap/tests/imap_fetchbody_uid.phpt b/ext/imap/tests/imap_fetchbody_uid.phpt new file mode 100644 index 0000000000000..2415ddd04cafe --- /dev/null +++ b/ext/imap/tests/imap_fetchbody_uid.phpt @@ -0,0 +1,29 @@ +--TEST-- +imap_fetchbody() passing a unique ID +--SKIPIF-- + +--FILE-- + +--CLEAN-- + +--EXPECT-- +Create a temporary mailbox and add 10 msgs +New mailbox created +Delete 4 messages for Unique ID generation +bool(true) diff --git a/ext/imap/tests/imap_fetchheader_errors.phpt b/ext/imap/tests/imap_fetchheader_errors.phpt new file mode 100644 index 0000000000000..72723a89c00d6 --- /dev/null +++ b/ext/imap/tests/imap_fetchheader_errors.phpt @@ -0,0 +1,47 @@ +--TEST-- +imap_fetchheader() errors: ValueError and Warnings +--SKIPIF-- + +--FILE-- +getMessage() . \PHP_EOL; +} +try { + imap_fetchheader($imap_mail_box, 1, -1); +} catch (\ValueError $e) { + echo $e->getMessage() . \PHP_EOL; +} + +// Access not existing +var_dump(imap_fetchheader($imap_mail_box, 255)); +var_dump(imap_fetchheader($imap_mail_box, 255, FT_UID)); + +imap_close($imap_mail_box); + +?> +--CLEAN-- + +--EXPECTF-- +Create a temporary mailbox and add 0 msgs +New mailbox created +imap_fetchheader(): Argument #2 ($message_num) must be greater than 0 +imap_fetchheader(): Argument #3 ($flags) must be a bitmask of FT_UID, FT_PREFETCHTEXT, and FT_INTERNAL + +Warning: imap_fetchheader(): Bad message number in %s on line %d +bool(false) + +Warning: imap_fetchheader(): UID does not exist in %s on line %d +bool(false) diff --git a/ext/imap/tests/imap_fetchheader_uid.phpt b/ext/imap/tests/imap_fetchheader_uid.phpt new file mode 100644 index 0000000000000..fa412c6c37d88 --- /dev/null +++ b/ext/imap/tests/imap_fetchheader_uid.phpt @@ -0,0 +1,28 @@ +--TEST-- +imap_fetchheader() passing a unique ID +--SKIPIF-- + +--FILE-- + +--CLEAN-- + +--EXPECT-- +Create a temporary mailbox and add 10 msgs +New mailbox created +Delete 4 messages for Unique ID generation +bool(true) diff --git a/ext/imap/tests/imap_fetchmime_errors.phpt b/ext/imap/tests/imap_fetchmime_errors.phpt new file mode 100644 index 0000000000000..d99168a7082c9 --- /dev/null +++ b/ext/imap/tests/imap_fetchmime_errors.phpt @@ -0,0 +1,49 @@ +--TEST-- +imap_fetchmime() errors: ValueError and Warnings +--SKIPIF-- + +--FILE-- +getMessage() . \PHP_EOL; +} +try { + imap_fetchmime($imap_mail_box, 1, $section, -1); +} catch (\ValueError $e) { + echo $e->getMessage() . \PHP_EOL; +} + +// Access not existing +var_dump(imap_fetchmime($imap_mail_box, 255, $section)); +var_dump(imap_fetchmime($imap_mail_box, 255, $section, FT_UID)); + +imap_close($imap_mail_box); + +?> +--CLEAN-- + +--EXPECTF-- +Create a temporary mailbox and add 0 msgs +New mailbox created +imap_fetchmime(): Argument #2 ($message_num) must be greater than 0 +imap_fetchmime(): Argument #4 ($flags) must be a bitmask of FT_UID, FT_PEEK, and FT_INTERNAL + +Warning: imap_fetchmime(): Bad message number in %s on line %d +bool(false) + +Warning: imap_fetchmime(): UID does not exist in %s on line %d +bool(false) diff --git a/ext/imap/tests/imap_fetchmime_uid.phpt b/ext/imap/tests/imap_fetchmime_uid.phpt new file mode 100644 index 0000000000000..8711e8e5d3af7 --- /dev/null +++ b/ext/imap/tests/imap_fetchmime_uid.phpt @@ -0,0 +1,29 @@ +--TEST-- +imap_fetchmime() passing a unique ID +--SKIPIF-- + +--FILE-- + +--CLEAN-- + +--EXPECT-- +Create a temporary mailbox and add 10 msgs +New mailbox created +Delete 4 messages for Unique ID generation +bool(true) diff --git a/ext/imap/tests/imap_fetchstructure_errors.phpt b/ext/imap/tests/imap_fetchstructure_errors.phpt new file mode 100644 index 0000000000000..4e834fa2c4cce --- /dev/null +++ b/ext/imap/tests/imap_fetchstructure_errors.phpt @@ -0,0 +1,47 @@ +--TEST-- +imap_fetchstructure() errors: ValueError and Warnings +--SKIPIF-- + +--FILE-- +getMessage() . \PHP_EOL; +} +try { + imap_fetchstructure($imap_mail_box, 1, -1); +} catch (\ValueError $e) { + echo $e->getMessage() . \PHP_EOL; +} + +// Access not existing +var_dump(imap_fetchstructure($imap_mail_box, 255)); +var_dump(imap_fetchstructure($imap_mail_box, 255, FT_UID)); + +imap_close($imap_mail_box); + +?> +--CLEAN-- + +--EXPECTF-- +Create a temporary mailbox and add 0 msgs +New mailbox created +imap_fetchstructure(): Argument #2 ($message_num) must be greater than 0 +imap_fetchstructure(): Argument #3 ($flags) must be FT_UID or 0 + +Warning: imap_fetchstructure(): Bad message number in %s on line %d +bool(false) + +Warning: imap_fetchstructure(): UID does not exist in %s on line %d +bool(false) diff --git a/ext/imap/tests/imap_fetchstructure_uid.phpt b/ext/imap/tests/imap_fetchstructure_uid.phpt new file mode 100644 index 0000000000000..bcb2552218543 --- /dev/null +++ b/ext/imap/tests/imap_fetchstructure_uid.phpt @@ -0,0 +1,29 @@ +--TEST-- +imap_fetchstructure() passing a unique ID +--SKIPIF-- + +--FILE-- + +--CLEAN-- + +--EXPECT-- +Create a temporary mailbox and add 10 msgs +New mailbox created +Delete 4 messages for Unique ID generation +bool(true) diff --git a/ext/imap/tests/imap_savebody_errors.phpt b/ext/imap/tests/imap_savebody_errors.phpt new file mode 100644 index 0000000000000..e7cff603f6c5b --- /dev/null +++ b/ext/imap/tests/imap_savebody_errors.phpt @@ -0,0 +1,49 @@ +--TEST-- +imap_savebody() errors: ValueError and Warnings +--SKIPIF-- + +--FILE-- +getMessage() . \PHP_EOL; +} +try { + imap_savebody($imap_mail_box, '', 1, $section, -1); +} catch (\ValueError $e) { + echo $e->getMessage() . \PHP_EOL; +} + +// Access not existing +var_dump(imap_savebody($imap_mail_box, '', 255, $section)); +var_dump(imap_savebody($imap_mail_box, '', 255, $section, FT_UID)); + +imap_close($imap_mail_box); + +?> +--CLEAN-- + +--EXPECTF-- +Create a temporary mailbox and add 0 msgs +New mailbox created +imap_savebody(): Argument #3 ($message_num) must be greater than 0 +imap_savebody(): Argument #5 ($flags) must be a bitmask of FT_UID, FT_PEEK, and FT_INTERNAL + +Warning: imap_savebody(): Bad message number in %s on line %d +bool(false) + +Warning: imap_savebody(): UID does not exist in %s on line %d +bool(false) diff --git a/ext/imap/tests/imap_savebody_uid.phpt b/ext/imap/tests/imap_savebody_uid.phpt new file mode 100644 index 0000000000000..9d4c058c10aee --- /dev/null +++ b/ext/imap/tests/imap_savebody_uid.phpt @@ -0,0 +1,39 @@ +--TEST-- +imap_savebody() passing a unique ID +--SKIPIF-- + +--FILE-- + +--CLEAN-- + +--EXPECT-- +Create a temporary mailbox and add 10 msgs +New mailbox created +Delete 4 messages for Unique ID generation +bool(true) diff --git a/ext/imap/tests/imap_search_basic.phpt b/ext/imap/tests/imap_search_basic.phpt new file mode 100644 index 0000000000000..11078da1dbeec --- /dev/null +++ b/ext/imap/tests/imap_search_basic.phpt @@ -0,0 +1,41 @@ +--TEST-- +imap_search() with unique ID (SE_UID) flag +--SKIPIF-- + +--FILE-- + +--CLEAN-- + +--EXPECT-- +Create a temporary mailbox and add 10 msgs +New mailbox created +Delete 4 messages for Unique ID generation +array(6) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(7) + [3]=> + int(8) + [4]=> + int(9) + [5]=> + int(10) +} diff --git a/ext/imap/tests/imap_setflag_full_basic.phpt b/ext/imap/tests/imap_setflag_full_basic.phpt new file mode 100644 index 0000000000000..10ab481cea8bb --- /dev/null +++ b/ext/imap/tests/imap_setflag_full_basic.phpt @@ -0,0 +1,82 @@ +--TEST-- +imap_setflag_full() basic test +--SKIPIF-- + +--FILE-- + +--CLEAN-- + +--EXPECT-- +Create a temporary mailbox and add 10 msgs +New mailbox created +ALL: array(10) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(3) + [3]=> + int(4) + [4]=> + int(5) + [5]=> + int(6) + [6]=> + int(7) + [7]=> + int(8) + [8]=> + int(9) + [9]=> + int(10) +} +ANSWERED: array(1) { + [0]=> + int(1) +} +DELETED: array(2) { + [0]=> + int(2) + [1]=> + int(7) +} +FLAGGED: array(3) { + [0]=> + int(3) + [1]=> + int(4) + [2]=> + int(5) +} diff --git a/ext/imap/tests/imap_setflag_full_uid.phpt b/ext/imap/tests/imap_setflag_full_uid.phpt new file mode 100644 index 0000000000000..86654213908e8 --- /dev/null +++ b/ext/imap/tests/imap_setflag_full_uid.phpt @@ -0,0 +1,108 @@ +--TEST-- +imap_setflag_full() passing a unique ID +--SKIPIF-- + +--FILE-- + +--CLEAN-- + +--EXPECT-- +Create a temporary mailbox and add 10 msgs +New mailbox created +Delete 4 messages for Unique ID generation +bool(true) +ALL: array(6) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(3) + [3]=> + int(4) + [4]=> + int(5) + [5]=> + int(6) +} +ALL (with UID correspondance): array(6) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(7) + [3]=> + int(8) + [4]=> + int(9) + [5]=> + int(10) +} +ANSWERED: array(1) { + [0]=> + int(4) +} +DELETED: array(2) { + [0]=> + int(3) + [1]=> + int(6) +} +FLAGGED: array(3) { + [0]=> + int(3) + [1]=> + int(4) + [2]=> + int(5) +} +SEEN: array(3) { + [0]=> + int(3) + [1]=> + int(4) + [2]=> + int(5) +} diff --git a/ext/imap/tests/imap_sort_uid.phpt b/ext/imap/tests/imap_sort_uid.phpt new file mode 100644 index 0000000000000..dff1e7c30bcac --- /dev/null +++ b/ext/imap/tests/imap_sort_uid.phpt @@ -0,0 +1,56 @@ +--TEST-- +imap_sort() basics +--SKIPIF-- + +--FILE-- + +--CLEAN-- + +--EXPECT-- +Create a temporary mailbox and add 10 msgs +New mailbox created +Delete 4 messages for Unique ID generation +array(6) { + [0]=> + int(1) + [1]=> + int(6) + [2]=> + int(2) + [3]=> + int(3) + [4]=> + int(4) + [5]=> + int(5) +} +array(6) { + [0]=> + int(1) + [1]=> + int(10) + [2]=> + int(2) + [3]=> + int(7) + [4]=> + int(8) + [5]=> + int(9) +} diff --git a/ext/imap/tests/imap_undelete_uid.phpt b/ext/imap/tests/imap_undelete_uid.phpt new file mode 100644 index 0000000000000..aff7e47bdb92b --- /dev/null +++ b/ext/imap/tests/imap_undelete_uid.phpt @@ -0,0 +1,45 @@ +--TEST-- +imap_undelete() passing a unique ID +--SKIPIF-- + +--FILE-- + +--CLEAN-- + +--EXPECT-- +Create a temporary mailbox and add 10 msgs +New mailbox created +Delete 4 messages for Unique ID generation +array(6) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(7) + [3]=> + int(8) + [4]=> + int(9) + [5]=> + int(10) +} diff --git a/ext/imap/tests/setup/imap_include.inc b/ext/imap/tests/setup/imap_include.inc index 33e4e5ca16f7f..223278f077302 100644 --- a/ext/imap/tests/setup/imap_include.inc +++ b/ext/imap/tests/setup/imap_include.inc @@ -123,6 +123,22 @@ function create_mailbox($imap_stream, string $mailbox_suffix, int $message_count return $mailbox; } +function setup_test_mailbox_for_uid_tests(string $mailbox_suffix, &$msg_no = null, &$msg_uid = null) +{ + $mail_box = setup_test_mailbox($mailbox_suffix, 10); + echo "Delete 4 messages for Unique ID generation\n"; + // Delete messages to remove the numerical ordering + imap_delete($mail_box, 3); + imap_delete($mail_box, 4); + imap_delete($mail_box, 5); + imap_delete($mail_box, 6); + imap_expunge($mail_box); + $msg_no = 5; + $msg_uid = 9; + + return $mail_box; +} + /** * Populate a mailbox with generic emails * diff --git a/ext/intl/msgformat/msgformat_helpers.cpp b/ext/intl/msgformat/msgformat_helpers.cpp index 55d3bdd7861e8..730a445577994 100644 --- a/ext/intl/msgformat/msgformat_helpers.cpp +++ b/ext/intl/msgformat/msgformat_helpers.cpp @@ -43,25 +43,26 @@ extern "C" { U_NAMESPACE_BEGIN /** - * This class isolates our access to private internal methods of - * MessageFormat. It is never instantiated; it exists only for C++ - * access management. + * ICU declares MessageFormatAdapter as a friend class of MessageFormat, + * to use as a backdoor for accessing private MessageFormat members. + * We use it for the same purpose here. Prefix the methods with php to + * avoid clashes with any definitions in ICU. */ class MessageFormatAdapter { public: - static const Formattable::Type* getArgTypeList(const MessageFormat& m, + static const Formattable::Type* phpGetArgTypeList(const MessageFormat& m, int32_t& count); - static const MessagePattern getMessagePattern(MessageFormat* m); + static const MessagePattern phpGetMessagePattern(MessageFormat* m); }; const Formattable::Type* -MessageFormatAdapter::getArgTypeList(const MessageFormat& m, +MessageFormatAdapter::phpGetArgTypeList(const MessageFormat& m, int32_t& count) { return m.getArgTypeList(count); } const MessagePattern -MessageFormatAdapter::getMessagePattern(MessageFormat* m) { +MessageFormatAdapter::phpGetMessagePattern(MessageFormat* m) { return m->msgPattern; } U_NAMESPACE_END @@ -77,7 +78,7 @@ using icu::FieldPosition; U_CFUNC int32_t umsg_format_arg_count(UMessageFormat *fmt) { int32_t fmt_count = 0; - MessageFormatAdapter::getArgTypeList(*(const MessageFormat*)fmt, fmt_count); + MessageFormatAdapter::phpGetArgTypeList(*(const MessageFormat*)fmt, fmt_count); return fmt_count; } @@ -100,7 +101,7 @@ static HashTable *umsg_get_numeric_types(MessageFormatter_object *mfo, return mfo->mf_data.arg_types; } - const Formattable::Type *types = MessageFormatAdapter::getArgTypeList( + const Formattable::Type *types = MessageFormatAdapter::phpGetArgTypeList( *(MessageFormat*)mfo->mf_data.umsgf, parts_count); /* Hash table will store Formattable::Type objects directly, @@ -285,7 +286,7 @@ static HashTable *umsg_get_types(MessageFormatter_object *mfo, { MessageFormat *mf = (MessageFormat *)mfo->mf_data.umsgf; - const MessagePattern mp = MessageFormatAdapter::getMessagePattern(mf); + const MessagePattern mp = MessageFormatAdapter::phpGetMessagePattern(mf); return umsg_parse_format(mfo, mp, err); } diff --git a/ext/json/json_parser.y b/ext/json/json_parser.y index 77df0eef6a572..8186040088099 100644 --- a/ext/json/json_parser.y +++ b/ext/json/json_parser.y @@ -47,10 +47,6 @@ int json_yydebug = 1; %union { zval value; - struct { - zend_string *key; - zval val; - } pair; } @@ -66,10 +62,8 @@ int json_yydebug = 1; %type start object key value array %type members member elements element -%type pair %destructor { zval_ptr_dtor_nogc(&$$); } -%destructor { zend_string_release_ex($$.key, 0); zval_ptr_dtor_nogc(&$$.val); } %code { static int php_json_yylex(union YYSTYPE *value, php_json_parser *parser); @@ -130,30 +124,22 @@ members: ; member: - pair + key ':' value { parser->methods.object_create(parser, &$$); - if (parser->methods.object_update(parser, &$$, $1.key, &$1.val) == FAILURE) { + if (parser->methods.object_update(parser, &$$, Z_STR($1), &$3) == FAILURE) { YYERROR; } } - | member ',' pair + | member ',' key ':' value { - if (parser->methods.object_update(parser, &$1, $3.key, &$3.val) == FAILURE) { + if (parser->methods.object_update(parser, &$1, Z_STR($3), &$5) == FAILURE) { YYERROR; } ZVAL_COPY_VALUE(&$$, &$1); } ; -pair: - key ':' value - { - $$.key = Z_STR($1); - ZVAL_COPY_VALUE(&$$.val, &$3); - } -; - array: '[' { diff --git a/ext/ldap/ldap.stub.php b/ext/ldap/ldap.stub.php index eb790d483fa0c..987c1120b9faf 100644 --- a/ext/ldap/ldap.stub.php +++ b/ext/ldap/ldap.stub.php @@ -293,7 +293,7 @@ function ldap_exop_passwd($ldap, string $user = "", string $old_password = "", s #ifdef HAVE_LDAP_WHOAMI_S /** @param resource $ldap */ -function ldap_exop_whoami($ldap): string|bool {} +function ldap_exop_whoami($ldap): string|false {} #endif #ifdef HAVE_LDAP_REFRESH_S diff --git a/ext/ldap/ldap_arginfo.h b/ext/ldap/ldap_arginfo.h index c7aef8ae228ac..f235aa1f89977 100644 --- a/ext/ldap/ldap_arginfo.h +++ b/ext/ldap/ldap_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 980ee25422e1b026259d63e7a61adea699751b86 */ + * Stub hash: 836e18943977613fc0abf7443ad4d5afdbe65a0a */ #if defined(HAVE_ORALDAP) ZEND_BEGIN_ARG_INFO_EX(arginfo_ldap_connect, 0, 0, 0) @@ -313,7 +313,7 @@ ZEND_END_ARG_INFO() #endif #if defined(HAVE_LDAP_WHOAMI_S) -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_ldap_exop_whoami, 0, 1, MAY_BE_STRING|MAY_BE_BOOL) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_ldap_exop_whoami, 0, 1, MAY_BE_STRING|MAY_BE_FALSE) ZEND_ARG_INFO(0, ldap) ZEND_END_ARG_INFO() #endif diff --git a/ext/mbstring/libmbfl/filters/emoji2uni.h b/ext/mbstring/libmbfl/filters/emoji2uni.h index 198b2354d3b3f..644244bdb2623 100644 --- a/ext/mbstring/libmbfl/filters/emoji2uni.h +++ b/ext/mbstring/libmbfl/filters/emoji2uni.h @@ -34,9 +34,9 @@ static const unsigned short mb_tbl_code2uni_docomo1[] = { // 0x28c2 - 0x29db 0xf4ba, 0xf303, 0xEE1E, 0xEE1F, 0xEE20, 0xf51c, 0xf51b, 0xf51a, 0x23f0, 0xEE21, 0xEE22, 0xEE23, - 0xEE24, 0xEE25, 0xEE26, 0xEE27, - 0xEE28, 0xEE29, 0xEE2A, 0xEE2B, - 0xEE2C, 0xEE2D, 0xEE2E, 0xEE2F, + 0xEE24, 0xEE25, 0x25EA, 0x25A0, + 0x25BF, 0xEE29, 0xEE2A, 0xEE2B, + 0x2020, 0xEE2D, 0xEE2E, 0xEE2F, 0xEE30, 0xEE31, 0xEE32, 0xEE33, 0xf4f2, 0xf4e9, 0xf4e0, 0xEE10, 0xEE11, 0x2709, 0xEE12, 0xEE13, diff --git a/ext/mbstring/libmbfl/filters/mbfilter_cp5022x.c b/ext/mbstring/libmbfl/filters/mbfilter_cp5022x.c index a4d1724e8fa54..55cb154b622cf 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_cp5022x.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_cp5022x.c @@ -383,9 +383,8 @@ mbfl_filt_conv_jis_ms_wchar(int c, mbfl_convert_filter *filter) int mbfl_filt_conv_wchar_jis_ms(int c, mbfl_convert_filter *filter) { - int c1, s; + int s = 0; - s = 0; if (c >= ucs_a1_jis_table_min && c < ucs_a1_jis_table_max) { s = ucs_a1_jis_table[c - ucs_a1_jis_table_min]; } else if (c >= ucs_a2_jis_table_min && c < ucs_a2_jis_table_max) { @@ -408,20 +407,12 @@ mbfl_filt_conv_wchar_jis_ms(int c, mbfl_convert_filter *filter) /* do some transliteration */ if (s <= 0) { - c1 = c & ~MBFL_WCSPLANE_MASK; - if (c1 == MBFL_WCSPLANE_JIS0208) { - s = c & MBFL_WCSPLANE_MASK; - } else if (c1 == MBFL_WCSPLANE_JIS0212) { - s = c & MBFL_WCSPLANE_MASK; - s |= 0x8080; - } else if (c == 0xa5) { /* YEN SIGN */ + if (c == 0xa5) { /* YEN SIGN */ s = 0x1005c; } else if (c == 0x203e) { /* OVER LINE */ s = 0x1007e; } else if (c == 0xff3c) { /* FULLWIDTH REVERSE SOLIDUS */ s = 0x2140; - } else if (c == 0xff5e) { /* FULLWIDTH TILDE */ - s = 0x2141; } else if (c == 0x2225) { /* PARALLEL TO */ s = 0x2142; } else if (c == 0xff0d) { /* FULLWIDTH HYPHEN-MINUS */ @@ -636,8 +627,6 @@ mbfl_filt_conv_wchar_cp50221(int c, mbfl_convert_filter *filter) s = 0x1007e; } else if (c == 0xff3c) { /* FULLWIDTH REVERSE SOLIDUS */ s = 0x2140; - } else if (c == 0xff5e) { /* FULLWIDTH TILDE */ - s = 0x2141; } else if (c == 0x2225) { /* PARALLEL TO */ s = 0x2142; } else if (c == 0xff0d) { /* FULLWIDTH HYPHEN-MINUS */ @@ -780,8 +769,6 @@ mbfl_filt_conv_wchar_cp50222(int c, mbfl_convert_filter *filter) s = 0x1007e; } else if (c == 0xff3c) { /* FULLWIDTH REVERSE SOLIDUS */ s = 0x2140; - } else if (c == 0xff5e) { /* FULLWIDTH TILDE */ - s = 0x2141; } else if (c == 0x2225) { /* PARALLEL TO */ s = 0x2142; } else if (c == 0xff0d) { /* FULLWIDTH HYPHEN-MINUS */ diff --git a/ext/mbstring/libmbfl/filters/mbfilter_cp51932.c b/ext/mbstring/libmbfl/filters/mbfilter_cp51932.c index cb95469408b55..1d64429c21651 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_cp51932.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_cp51932.c @@ -34,6 +34,8 @@ #include "unicode_table_jis.h" #include "cp932_table.h" +static int mbfl_filt_conv_cp51932_wchar_flush(mbfl_convert_filter *filter); + static const unsigned char mblen_table_eucjp[] = { /* 0xA1-0xFE */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -72,7 +74,7 @@ const struct mbfl_convert_vtbl vtbl_cp51932_wchar = { mbfl_filt_conv_common_ctor, NULL, mbfl_filt_conv_cp51932_wchar, - mbfl_filt_conv_common_flush, + mbfl_filt_conv_cp51932_wchar_flush, NULL, }; @@ -105,17 +107,15 @@ mbfl_filt_conv_cp51932_wchar(int c, mbfl_convert_filter *filter) switch (filter->status) { case 0: - if (c >= 0 && c < 0x80) { /* latin */ + if (c >= 0 && c < 0x80) { /* latin */ CK((*filter->output_function)(c, filter->data)); - } else if (c > 0xa0 && c < 0xff) { /* CP932 first char */ + } else if (c >= 0xA1 && c <= 0xFE) { /* CP932, first byte */ filter->status = 1; filter->cache = c; - } else if (c == 0x8e) { /* kana first char */ + } else if (c == 0x8e) { /* kana first char */ filter->status = 2; } else { - w = c & MBFL_WCSGROUP_MASK; - w |= MBFL_WCSGROUP_THROUGH; - CK((*filter->output_function)(w, filter->data)); + CK((*filter->output_function)(c | MBFL_WCSGROUP_THROUGH, filter->data)); } break; @@ -152,17 +152,11 @@ mbfl_filt_conv_cp51932_wchar(int c, mbfl_convert_filter *filter) } } if (w <= 0) { - w = ((c1 & 0x7f) << 8) | (c & 0x7f); - w &= MBFL_WCSPLANE_MASK; - w |= MBFL_WCSPLANE_WINCP932; + w = ((c1 & 0x7f) << 8) | (c & 0x7f) | MBFL_WCSPLANE_WINCP932; } CK((*filter->output_function)(w, filter->data)); - } else if ((c >= 0 && c < 0x21) || c == 0x7f) { /* CTLs */ - CK((*filter->output_function)(c, filter->data)); } else { - w = (c1 << 8) | c; - w &= MBFL_WCSGROUP_MASK; - w |= MBFL_WCSGROUP_THROUGH; + w = (c1 << 8) | c | MBFL_WCSGROUP_THROUGH; CK((*filter->output_function)(w, filter->data)); } break; @@ -172,12 +166,8 @@ mbfl_filt_conv_cp51932_wchar(int c, mbfl_convert_filter *filter) if (c > 0xa0 && c < 0xe0) { w = 0xfec0 + c; CK((*filter->output_function)(w, filter->data)); - } else if ((c >= 0 && c < 0x21) || c == 0x7f) { /* CTLs */ - CK((*filter->output_function)(c, filter->data)); } else { - w = 0x8e00 | c; - w &= MBFL_WCSGROUP_MASK; - w |= MBFL_WCSGROUP_THROUGH; + w = 0x8e00 | c | MBFL_WCSGROUP_THROUGH; CK((*filter->output_function)(w, filter->data)); } break; @@ -190,6 +180,20 @@ mbfl_filt_conv_cp51932_wchar(int c, mbfl_convert_filter *filter) return c; } +static int mbfl_filt_conv_cp51932_wchar_flush(mbfl_convert_filter *filter) +{ + if (filter->status) { + /* Input string was truncated */ + (*filter->output_function)(filter->cache | MBFL_WCSGROUP_THROUGH, filter->data); + } + + if (filter->flush_function) { + (*filter->flush_function)(filter->data); + } + + return 0; +} + /* * wchar => cp51932 */ @@ -210,28 +214,10 @@ mbfl_filt_conv_wchar_cp51932(int c, mbfl_convert_filter *filter) } if (s1 >= 0x8080) s1 = -1; /* we don't support JIS X0213 */ if (s1 <= 0) { - c1 = c & ~MBFL_WCSPLANE_MASK; - if (c1 == MBFL_WCSPLANE_WINCP932) { - s1 = c & MBFL_WCSPLANE_MASK; - if (s1 >= ((85 + 0x20) << 8)) { /* 85ku - 120ku */ - s1 = -1; - } - } else if (c1 == MBFL_WCSPLANE_JIS0208) { - s1 = c & MBFL_WCSPLANE_MASK; - if ((s1 >= ((85 + 0x20) << 8) && /* 85ku - 94ku */ - s1 <= ((88 + 0x20) << 8)) ||/* IBM extension */ - (s1 >= ((93 + 0x20) << 8) && /* 89ku - 92ku */ - s1 <= ((94 + 0x20) << 8))) { - s1 = -1; - } - } else if (c == 0xa5) { /* YEN SIGN */ - s1 = 0x005c; /* YEN SIGN */ - } else if (c == 0x203e) { /* OVER LINE */ - s1 = 0x007e; /* FULLWIDTH MACRON */ + if (c == 0xa5) { /* YEN SIGN */ + s1 = 0x216F; /* FULLWIDTH YEN SIGN */ } else if (c == 0xff3c) { /* FULLWIDTH REVERSE SOLIDUS */ s1 = 0x2140; - } else if (c == 0xff5e) { /* FULLWIDTH TILDE */ - s1 = 0x2141; } else if (c == 0x2225) { /* PARALLEL TO */ s1 = 0x2142; } else if (c == 0xff0d) { /* FULLWIDTH HYPHEN-MINUS */ diff --git a/ext/mbstring/libmbfl/filters/mbfilter_cp932.c b/ext/mbstring/libmbfl/filters/mbfilter_cp932.c index 351a94c81c594..64c02471193d4 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_cp932.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_cp932.c @@ -33,6 +33,8 @@ #include "unicode_table_cp932_ext.h" #include "unicode_table_jis.h" +static int mbfl_filt_conv_cp932_wchar_flush(mbfl_convert_filter *filter); + static const unsigned char mblen_table_sjis[] = { /* 0x80-0x9f,0xE0-0xFF */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -71,7 +73,7 @@ const struct mbfl_convert_vtbl vtbl_cp932_wchar = { mbfl_filt_conv_common_ctor, NULL, mbfl_filt_conv_cp932_wchar, - mbfl_filt_conv_common_flush, + mbfl_filt_conv_cp932_wchar_flush, NULL, }; @@ -193,17 +195,11 @@ mbfl_filt_conv_cp932_wchar(int c, mbfl_convert_filter *filter) } } if (w <= 0) { - w = (s1 << 8) | s2; - w &= MBFL_WCSPLANE_MASK; - w |= MBFL_WCSPLANE_WINCP932; + w = (s1 << 8) | s2 | MBFL_WCSPLANE_WINCP932; } CK((*filter->output_function)(w, filter->data)); - } else if ((c >= 0 && c < 0x21) || c == 0x7f) { /* CTLs */ - CK((*filter->output_function)(c, filter->data)); } else { - w = (c1 << 8) | c; - w &= MBFL_WCSGROUP_MASK; - w |= MBFL_WCSGROUP_THROUGH; + w = (c1 << 8) | c | MBFL_WCSGROUP_THROUGH; CK((*filter->output_function)(w, filter->data)); } break; @@ -216,6 +212,19 @@ mbfl_filt_conv_cp932_wchar(int c, mbfl_convert_filter *filter) return c; } +static int mbfl_filt_conv_cp932_wchar_flush(mbfl_convert_filter *filter) +{ + if (filter->status) { + (*filter->filter_function)(filter->cache | MBFL_WCSGROUP_THROUGH, filter); + } + + if (filter->flush_function) { + (*filter->flush_function)(filter->data); + } + + return 0; +} + /* * wchar => SJIS-win */ @@ -242,23 +251,10 @@ mbfl_filt_conv_wchar_cp932(int c, mbfl_convert_filter *filter) s2 = 1; } if (s1 <= 0) { - c1 = c & ~MBFL_WCSPLANE_MASK; - if (c1 == MBFL_WCSPLANE_WINCP932) { - s1 = c & MBFL_WCSPLANE_MASK; - s2 = 1; - } else if (c1 == MBFL_WCSPLANE_JIS0208) { - s1 = c & MBFL_WCSPLANE_MASK; - } else if (c1 == MBFL_WCSPLANE_JIS0212) { - s1 = c & MBFL_WCSPLANE_MASK; - s1 |= 0x8080; - } else if (c == 0xa5) { /* YEN SIGN */ - s1 = 0x005c; /* YEN SIGN */ - } else if (c == 0x203e) { /* OVER LINE */ - s1 = 0x007e; /* FULLWIDTH MACRON */ + if (c == 0xa5) { /* YEN SIGN */ + s1 = 0x216F; /* FULLWIDTH YEN SIGN */ } else if (c == 0xff3c) { /* FULLWIDTH REVERSE SOLIDUS */ s1 = 0x2140; - } else if (c == 0xff5e) { /* FULLWIDTH TILDE */ - s1 = 0x2141; } else if (c == 0x2225) { /* PARALLEL TO */ s1 = 0x2142; } else if (c == 0xff0d) { /* FULLWIDTH HYPHEN-MINUS */ diff --git a/ext/mbstring/libmbfl/filters/mbfilter_euc_jp.c b/ext/mbstring/libmbfl/filters/mbfilter_euc_jp.c index 1589ae7966d88..25ce6c92bc297 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_euc_jp.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_euc_jp.c @@ -192,10 +192,11 @@ static int mbfl_filt_conv_eucjp_wchar_flush(mbfl_convert_filter *filter) int mbfl_filt_conv_wchar_eucjp(int c, mbfl_convert_filter *filter) { - int s; + int s = 0; - s = 0; - if (c >= ucs_a1_jis_table_min && c < ucs_a1_jis_table_max) { + if (c == 0xAF) { /* U+00AF is MACRON */ + s = 0xA2B4; /* Use JIS X 0212 overline */ + } else if (c >= ucs_a1_jis_table_min && c < ucs_a1_jis_table_max) { s = ucs_a1_jis_table[c - ucs_a1_jis_table_min]; } else if (c >= ucs_a2_jis_table_min && c < ucs_a2_jis_table_max) { s = ucs_a2_jis_table[c - ucs_a2_jis_table_min]; diff --git a/ext/mbstring/libmbfl/filters/mbfilter_euc_jp_win.c b/ext/mbstring/libmbfl/filters/mbfilter_euc_jp_win.c index b93fc9101a406..569dabd92da5f 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_euc_jp_win.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_euc_jp_win.c @@ -273,25 +273,7 @@ mbfl_filt_conv_wchar_eucjpwin(int c, mbfl_convert_filter *filter) s1 = 0x2d62; /* NUMERO SIGN */ } if (s1 <= 0) { - c1 = c & ~MBFL_WCSPLANE_MASK; - if (c1 == MBFL_WCSPLANE_WINCP932) { - s1 = c & MBFL_WCSPLANE_MASK; - if (s1 >= ((85 + 0x20) << 8)) { /* 85ku - 120ku */ - s1 = -1; - } - } else if (c1 == MBFL_WCSPLANE_JIS0208) { - s1 = c & MBFL_WCSPLANE_MASK; - if (s1 >= ((85 + 0x20) << 8)) { /* 85ku - 94ku */ - s1 = -1; - } - } else if (c1 == MBFL_WCSPLANE_JIS0212) { - s1 = c & MBFL_WCSPLANE_MASK; - if (s1 >= ((83 + 0x20) << 8)) { /* 83ku - 94ku */ - s1 = -1; - } else { - s1 |= 0x8080; - } - } else if (c == 0xa5) { /* YEN SIGN */ + if (c == 0xa5) { /* YEN SIGN */ s1 = 0x216f; /* FULLWIDTH YEN SIGN */ } else if (c == 0x203e) { /* OVER LINE */ s1 = 0x2131; /* FULLWIDTH MACRON */ diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso2022_jp_ms.c b/ext/mbstring/libmbfl/filters/mbfilter_iso2022_jp_ms.c index 950365045c82e..5e0a63958b68c 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_iso2022_jp_ms.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_iso2022_jp_ms.c @@ -302,16 +302,7 @@ mbfl_filt_conv_wchar_2022jpms(int c, mbfl_convert_filter *filter) s1 = (c1 << 8) | c2; } if (s1 <= 0) { - c1 = c & ~MBFL_WCSPLANE_MASK; - if (c1 == MBFL_WCSPLANE_WINCP932) { - s1 = c & MBFL_WCSPLANE_MASK; - s2 = 1; - } else if (c1 == MBFL_WCSPLANE_JIS0208) { - s1 = c & MBFL_WCSPLANE_MASK; - } else if (c1 == MBFL_WCSPLANE_JIS0212) { - s1 = c & MBFL_WCSPLANE_MASK; - s1 |= 0x8080; - } else if (c == 0xa5) { /* YEN SIGN */ + if (c == 0xa5) { /* YEN SIGN */ s1 = 0x216f; /* FULLWIDTH YEN SIGN */ } else if (c == 0x203e) { /* OVER LINE */ s1 = 0x2131; /* FULLWIDTH MACRON */ diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso2022jp_mobile.c b/ext/mbstring/libmbfl/filters/mbfilter_iso2022jp_mobile.c index e6300675e81f1..0099fb1ebb93a 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_iso2022jp_mobile.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_iso2022jp_mobile.c @@ -330,16 +330,7 @@ mbfl_filt_conv_wchar_2022jp_mobile(int c, mbfl_convert_filter *filter) s1 = (c1 << 8) | c2; } if (s1 <= 0) { - c1 = c & ~MBFL_WCSPLANE_MASK; - if (c1 == MBFL_WCSPLANE_WINCP932) { - s1 = c & MBFL_WCSPLANE_MASK; - s2 = 1; - } else if (c1 == MBFL_WCSPLANE_JIS0208) { - s1 = c & MBFL_WCSPLANE_MASK; - } else if (c1 == MBFL_WCSPLANE_JIS0212) { - s1 = c & MBFL_WCSPLANE_MASK; - s1 |= 0x8080; - } else if (c == 0xa5) { /* YEN SIGN */ + if (c == 0xa5) { /* YEN SIGN */ s1 = 0x216f; /* FULLWIDTH YEN SIGN */ } else if (c == 0x203e) { /* OVER LINE */ s1 = 0x2131; /* FULLWIDTH MACRON */ diff --git a/ext/mbstring/libmbfl/filters/mbfilter_jis.c b/ext/mbstring/libmbfl/filters/mbfilter_jis.c index ba43872d83e5d..15c1bb30a1559 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_jis.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_jis.c @@ -274,9 +274,8 @@ mbfl_filt_conv_jis_wchar(int c, mbfl_convert_filter *filter) int mbfl_filt_conv_wchar_jis(int c, mbfl_convert_filter *filter) { - int c1, s; + int s = 0; - s = 0; if (c >= ucs_a1_jis_table_min && c < ucs_a1_jis_table_max) { s = ucs_a1_jis_table[c - ucs_a1_jis_table_min]; } else if (c >= ucs_a2_jis_table_min && c < ucs_a2_jis_table_max) { @@ -287,20 +286,12 @@ mbfl_filt_conv_wchar_jis(int c, mbfl_convert_filter *filter) s = ucs_r_jis_table[c - ucs_r_jis_table_min]; } if (s <= 0) { - c1 = c & ~MBFL_WCSPLANE_MASK; - if (c1 == MBFL_WCSPLANE_JIS0208) { - s = c & MBFL_WCSPLANE_MASK; - } else if (c1 == MBFL_WCSPLANE_JIS0212) { - s = c & MBFL_WCSPLANE_MASK; - s |= 0x8080; - } else if (c == 0xa5) { /* YEN SIGN */ + if (c == 0xa5) { /* YEN SIGN */ s = 0x1005c; } else if (c == 0x203e) { /* OVER LINE */ s = 0x1007e; } else if (c == 0xff3c) { /* FULLWIDTH REVERSE SOLIDUS */ s = 0x2140; - } else if (c == 0xff5e) { /* FULLWIDTH TILDE */ - s = 0x2141; } else if (c == 0x2225) { /* PARALLEL TO */ s = 0x2142; } else if (c == 0xff0d) { /* FULLWIDTH HYPHEN-MINUS */ @@ -396,8 +387,6 @@ mbfl_filt_conv_wchar_2022jp(int c, mbfl_convert_filter *filter) s = 0x1007e; } else if (c == 0xff3c) { /* FULLWIDTH REVERSE SOLIDUS */ s = 0x2140; - } else if (c == 0xff5e) { /* FULLWIDTH TILDE */ - s = 0x2141; } else if (c == 0x2225) { /* PARALLEL TO */ s = 0x2142; } else if (c == 0xff0d) { /* FULLWIDTH HYPHEN-MINUS */ diff --git a/ext/mbstring/libmbfl/filters/mbfilter_sjis.c b/ext/mbstring/libmbfl/filters/mbfilter_sjis.c index 39e7879c1a065..bde382a6d3df4 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_sjis.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_sjis.c @@ -207,6 +207,12 @@ int mbfl_filt_conv_wchar_sjis(int c, mbfl_convert_filter *filter) /* Unicode 0x5C is a backslash; but Shift-JIS uses 0x5C for the * Yen sign. JIS X 0208 kuten 0x2140 is a backslash. */ s1 = 0x2140; + } else if (c == 0x7E) { + /* Unicode 0x7E is a tilde, but Shift-JIS uses 0x7E for overline (or + * macron). JIS X 0208 kuten 0x2141 is 'WAVE DASH' */ + s1 = 0x2141; + } else if (c == 0xAF || c == 0x203E) { /* U+00AF is MACRON, U+203E is OVERLINE */ + s1 = 0x7E; /* Halfwidth overline/macron */ } else if (c >= ucs_a1_jis_table_min && c < ucs_a1_jis_table_max) { s1 = ucs_a1_jis_table[c - ucs_a1_jis_table_min]; } else if (c >= ucs_a2_jis_table_min && c < ucs_a2_jis_table_max) { @@ -219,8 +225,6 @@ int mbfl_filt_conv_wchar_sjis(int c, mbfl_convert_filter *filter) if (s1 <= 0) { if (c == 0xA5) { /* YEN SIGN */ s1 = 0x5C; - } else if (c == 0x203E) { /* OVER LINE */ - s1 = 0x7E; } else if (c == 0xFF3C) { /* FULLWIDTH REVERSE SOLIDUS */ s1 = 0x2140; } else if (c == 0xFF5E) { /* FULLWIDTH TILDE */ diff --git a/ext/mbstring/libmbfl/filters/mbfilter_sjis_2004.c b/ext/mbstring/libmbfl/filters/mbfilter_sjis_2004.c index 02bbdccdc8733..1e549fdebb8f3 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_sjis_2004.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_sjis_2004.c @@ -590,10 +590,6 @@ mbfl_filt_conv_wchar_jis2004(int c, mbfl_convert_filter *filter) { } if (s1 <= 0) { - c1 = c & ~MBFL_WCSPLANE_MASK; - if (c1 == MBFL_WCSPLANE_JIS0213) { - s1 = c & MBFL_WCSPLANE_MASK; - } if (c == 0) { s1 = 0; } else if (s1 <= 0) { diff --git a/ext/mbstring/libmbfl/filters/mbfilter_sjis_mac.c b/ext/mbstring/libmbfl/filters/mbfilter_sjis_mac.c index 45b87a8f989f1..4dead25a78def 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_sjis_mac.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_sjis_mac.c @@ -416,16 +416,7 @@ mbfl_filt_conv_wchar_sjis_mac(int c, mbfl_convert_filter *filter) } if (s1 <= 0) { - c1 = c & ~MBFL_WCSPLANE_MASK; - if (c1 == MBFL_WCSPLANE_WINCP932) { - s1 = c & MBFL_WCSPLANE_MASK; - s2 = 1; - } else if (c1 == MBFL_WCSPLANE_JIS0208) { - s1 = c & MBFL_WCSPLANE_MASK; - } else if (c1 == MBFL_WCSPLANE_JIS0212) { - s1 = c & MBFL_WCSPLANE_MASK; - s1 |= 0x8080; - } else if (c == 0xa0) { + if (c == 0xa0) { s1 = 0x00a0; } else if (c == 0xa5) { /* YEN SIGN */ /* Unicode has codepoint 0xFFE5 for a fullwidth Yen sign; diff --git a/ext/mbstring/libmbfl/filters/mbfilter_sjis_mobile.c b/ext/mbstring/libmbfl/filters/mbfilter_sjis_mobile.c index 255a457c58364..53f5242dda3f9 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_sjis_mobile.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_sjis_mobile.c @@ -38,14 +38,16 @@ extern int mbfl_bisec_srch2(int w, const unsigned short tbl[], int n); extern const unsigned char mblen_table_sjis[]; +static int mbfl_filt_conv_sjis_wchar_flush(mbfl_convert_filter *filter); + static const char *mbfl_encoding_sjis_docomo_aliases[] = {"SJIS-DOCOMO", "shift_jis-imode", "x-sjis-emoji-docomo", NULL}; static const char *mbfl_encoding_sjis_kddi_aliases[] = {"SJIS-KDDI", "shift_jis-kddi", "x-sjis-emoji-kddi", NULL}; static const char *mbfl_encoding_sjis_sb_aliases[] = {"SJIS-SOFTBANK", "shift_jis-softbank", "x-sjis-emoji-softbank", NULL}; const mbfl_encoding mbfl_encoding_sjis_docomo = { - mbfl_no_encoding_sjis_docomo, - "SJIS-Mobile#DOCOMO", - "Shift_JIS", + mbfl_no_encoding_sjis_docomo, + "SJIS-Mobile#DOCOMO", + "Shift_JIS", mbfl_encoding_sjis_docomo_aliases, mblen_table_sjis, MBFL_ENCTYPE_MBCS | MBFL_ENCTYPE_GL_UNSAFE, @@ -54,9 +56,9 @@ const mbfl_encoding mbfl_encoding_sjis_docomo = { }; const mbfl_encoding mbfl_encoding_sjis_kddi = { - mbfl_no_encoding_sjis_kddi, - "SJIS-Mobile#KDDI", - "Shift_JIS", + mbfl_no_encoding_sjis_kddi, + "SJIS-Mobile#KDDI", + "Shift_JIS", mbfl_encoding_sjis_kddi_aliases, mblen_table_sjis, MBFL_ENCTYPE_MBCS | MBFL_ENCTYPE_GL_UNSAFE, @@ -65,9 +67,9 @@ const mbfl_encoding mbfl_encoding_sjis_kddi = { }; const mbfl_encoding mbfl_encoding_sjis_sb = { - mbfl_no_encoding_sjis_sb, - "SJIS-Mobile#SOFTBANK", - "Shift_JIS", + mbfl_no_encoding_sjis_sb, + "SJIS-Mobile#SOFTBANK", + "Shift_JIS", mbfl_encoding_sjis_sb_aliases, mblen_table_sjis, MBFL_ENCTYPE_MBCS | MBFL_ENCTYPE_GL_UNSAFE, @@ -76,61 +78,61 @@ const mbfl_encoding mbfl_encoding_sjis_sb = { }; const struct mbfl_convert_vtbl vtbl_sjis_docomo_wchar = { - mbfl_no_encoding_sjis_docomo, - mbfl_no_encoding_wchar, - mbfl_filt_conv_common_ctor, + mbfl_no_encoding_sjis_docomo, + mbfl_no_encoding_wchar, + mbfl_filt_conv_common_ctor, + NULL, + mbfl_filt_conv_sjis_mobile_wchar, + mbfl_filt_conv_sjis_wchar_flush, NULL, - mbfl_filt_conv_sjis_mobile_wchar, - mbfl_filt_conv_common_flush, - NULL, }; const struct mbfl_convert_vtbl vtbl_wchar_sjis_docomo = { - mbfl_no_encoding_wchar, - mbfl_no_encoding_sjis_docomo, - mbfl_filt_conv_common_ctor, + mbfl_no_encoding_wchar, + mbfl_no_encoding_sjis_docomo, + mbfl_filt_conv_common_ctor, + NULL, + mbfl_filt_conv_wchar_sjis_mobile, + mbfl_filt_conv_sjis_mobile_flush, NULL, - mbfl_filt_conv_wchar_sjis_mobile, - mbfl_filt_conv_sjis_mobile_flush, - NULL, }; const struct mbfl_convert_vtbl vtbl_sjis_kddi_wchar = { - mbfl_no_encoding_sjis_kddi, - mbfl_no_encoding_wchar, - mbfl_filt_conv_common_ctor, + mbfl_no_encoding_sjis_kddi, + mbfl_no_encoding_wchar, + mbfl_filt_conv_common_ctor, + NULL, + mbfl_filt_conv_sjis_mobile_wchar, + mbfl_filt_conv_sjis_wchar_flush, NULL, - mbfl_filt_conv_sjis_mobile_wchar, - mbfl_filt_conv_common_flush, - NULL, }; const struct mbfl_convert_vtbl vtbl_wchar_sjis_kddi = { - mbfl_no_encoding_wchar, - mbfl_no_encoding_sjis_kddi, - mbfl_filt_conv_common_ctor, + mbfl_no_encoding_wchar, + mbfl_no_encoding_sjis_kddi, + mbfl_filt_conv_common_ctor, NULL, - mbfl_filt_conv_wchar_sjis_mobile, + mbfl_filt_conv_wchar_sjis_mobile, mbfl_filt_conv_sjis_mobile_flush, NULL, }; const struct mbfl_convert_vtbl vtbl_sjis_sb_wchar = { - mbfl_no_encoding_sjis_sb, - mbfl_no_encoding_wchar, - mbfl_filt_conv_common_ctor, + mbfl_no_encoding_sjis_sb, + mbfl_no_encoding_wchar, + mbfl_filt_conv_common_ctor, + NULL, + mbfl_filt_conv_sjis_mobile_wchar, + mbfl_filt_conv_sjis_wchar_flush, NULL, - mbfl_filt_conv_sjis_mobile_wchar, - mbfl_filt_conv_common_flush, - NULL, }; const struct mbfl_convert_vtbl vtbl_wchar_sjis_sb = { - mbfl_no_encoding_wchar, - mbfl_no_encoding_sjis_sb, - mbfl_filt_conv_common_ctor, + mbfl_no_encoding_wchar, + mbfl_no_encoding_sjis_sb, + mbfl_filt_conv_common_ctor, NULL, - mbfl_filt_conv_wchar_sjis_mobile, + mbfl_filt_conv_wchar_sjis_mobile, mbfl_filt_conv_sjis_mobile_flush, NULL, }; @@ -176,467 +178,431 @@ const unsigned short mbfl_kddi2uni_pua_b[8][3] = { {0x27e7, 0x2863, 0xf080}, }; +/* Regional Indicator Unicode codepoints are from 0x1F1E6-0x1F1FF + * These correspond to the letters A-Z + * To display the flag emoji for a country, two unicode codepoints are combined, + * which correspond to the two-letter code for that country + * This macro converts uppercase ASCII values to Regional Indicator codepoints */ #define NFLAGS(c) (0x1F1A5+(int)(c)) #define CK(statement) do { if ((statement) < 0) return (-1); } while (0) -#define SJIS_ENCODE(c1,c2,s1,s2) \ - do { \ - s1 = c1; \ - s1--; \ - s1 >>= 1; \ - if ((c1) < 0x5f) { \ - s1 += 0x71; \ - } else { \ - s1 += 0xb1; \ - } \ - s2 = c2; \ - if ((c1) & 1) { \ - if ((c2) < 0x60) { \ - s2--; \ - } \ - s2 += 0x20; \ - } else { \ - s2 += 0x7e; \ - } \ +#define SJIS_ENCODE(c1,c2,s1,s2) \ + do { \ + s1 = ((c1 - 1) >> 1) + ((c1) < 0x5F ? 0x71 : 0xB1); \ + s2 = c2; \ + if ((c1) & 1) { \ + if ((c2) < 0x60) { \ + s2--; \ + } \ + s2 += 0x20; \ + } else { \ + s2 += 0x7e; \ + } \ } while (0) -#define SJIS_DECODE(c1,c2,s1,s2) \ - do { \ - s1 = c1; \ - if (s1 < 0xa0) { \ - s1 -= 0x81; \ - } else { \ - s1 -= 0xc1; \ - } \ - s1 <<= 1; \ - s1 += 0x21; \ - s2 = c2; \ - if (s2 < 0x9f) { \ - if (s2 < 0x7f) { \ - s2++; \ - } \ - s2 -= 0x20; \ - } else { \ - s1++; \ - s2 -= 0x7e; \ - } \ +#define SJIS_DECODE(c1,c2,s1,s2) \ + do { \ + if (c1 < 0xa0) { \ + s1 = ((c1 - 0x81) << 1) + 0x21; \ + } else { \ + s1 = ((c1 - 0xc1) << 1) + 0x21; \ + } \ + s2 = c2; \ + if (c2 < 0x9f) { \ + if (c2 < 0x7f) { \ + s2++; \ + } \ + s2 -= 0x20; \ + } else { \ + s1++; \ + s2 -= 0x7e; \ + } \ } while (0) -#define CODE2JIS(c1,c2,s1,s2) \ - c1 = (s1)/94+0x21; \ - c2 = (s1)-94*((c1)-0x21)+0x21; \ - s1 = ((c1) << 8) | (c2); \ +/* (ku*94)+ten value -> Shift-JIS byte sequence */ +#define CODE2JIS(c1,c2,s1,s2) \ + c1 = (s1)/94+0x21; \ + c2 = (s1)-94*((c1)-0x21)+0x21; \ + s1 = ((c1) << 8) | (c2); \ s2 = 1 -int -mbfilter_conv_map_tbl(int c, int *w, const unsigned short map[][3], int n) +int mbfilter_conv_map_tbl(int c, int *w, const unsigned short map[][3], int n) { - int i, match = 0; - - for (i = 0; i < n; i++) { + for (int i = 0; i < n; i++) { if (map[i][0] <= c && c <= map[i][1]) { *w = c - map[i][0] + map[i][2]; - match = 1; - break; + return 1; } } - return match; + return 0; } -int -mbfilter_conv_r_map_tbl(int c, int *w, const unsigned short map[][3], int n) +int mbfilter_conv_r_map_tbl(int c, int *w, const unsigned short map[][3], int n) { - int i, match = 0; - - for (i = 0; i < n; i++) { + /* Convert in reverse direction */ + for (int i = 0; i < n; i++) { if (map[i][2] <= c && c <= map[i][2] - map[i][0] + map[i][1]) { *w = c + map[i][0] - map[i][2]; - match = 1; - break; + return 1; } } - return match; + return 0; } -int -mbfilter_sjis_emoji_docomo2unicode(int s, int *snd) +/* number -> (ku*94)+ten value for telephone keypad character */ +#define DOCOMO_KEYPAD(n) ((n) == 0 ? 0x296F : (0x2965 + (n))) +#define DOCOMO_KEYPAD_HASH 0x2964 + +#define EMIT_KEYPAD_EMOJI(c) do { *snd = (c); return 0x20E3; } while(0) + +/* Unicode codepoints for emoji are above 0x1F000, but we only store 16-bits + * in our tables. Therefore, add 0x10000 to recover the true values. + * + * Again, for some emoji which are not supported by Unicode, we use codepoints + * in the Private Use Area above 0xFE000. Again, add 0xF0000 to recover the + * true value. */ +static inline int convert_emoji_cp(int cp) +{ + if (cp > 0xF000) + return cp + 0x10000; + else if (cp > 0xE000) + return cp + 0xF0000; + return cp; +} + +int mbfilter_sjis_emoji_docomo2unicode(int s, int *snd) { - int w = s; + /* All three mobile vendors had emoji for numbers on a telephone keypad + * Unicode doesn't have those, but it has a combining character which puts + * a 'keypad button' around the following character, making it look like + * a key on a telephone or keyboard. That combining char is codepoint 0x20E3. */ if (s >= mb_tbl_code2uni_docomo1_min && s <= mb_tbl_code2uni_docomo1_max) { - if (s >= mb_tbl_code2uni_docomo1_min + 0x00a2 && - s <= mb_tbl_code2uni_docomo1_min + 0x00ad && - s != mb_tbl_code2uni_docomo1_min + 0x00a3) { - w = 0x20E3; - *snd = mb_tbl_code2uni_docomo1[s - mb_tbl_code2uni_docomo1_min]; - if (*snd > 0xf000) { - *snd += 0x10000; - } + if ((s >= DOCOMO_KEYPAD(1) && s <= DOCOMO_KEYPAD(9)) || s == DOCOMO_KEYPAD(0) || s == DOCOMO_KEYPAD_HASH) { + EMIT_KEYPAD_EMOJI(convert_emoji_cp(mb_tbl_code2uni_docomo1[s - mb_tbl_code2uni_docomo1_min])); } else { - w = mb_tbl_code2uni_docomo1[s - mb_tbl_code2uni_docomo1_min]; - if (w > 0xf000) { - w += 0x10000; - } else if (w > 0xe000) { /* unsupported by Unicode 6.0 */ - w += 0xf0000; - } *snd = 0; - if (!w) { - w = s; - } + return convert_emoji_cp(mb_tbl_code2uni_docomo1[s - mb_tbl_code2uni_docomo1_min]); } } - - return w; + return 0; } -int -mbfilter_sjis_emoji_kddi2unicode(int s, int *snd) -{ - int w = s, si, c; - const int nflags_order_kddi[] = {3, 1, 5, 4, 0, 7}; +#define EMIT_FLAG_EMOJI(country) do { *snd = NFLAGS((country)[0]); return NFLAGS((country)[1]); } while(0) + +static const char nflags_kddi[6][2] = {"FR", "DE", "IT", "GB", "CN", "KR"}; - *snd = 0; +int mbfilter_sjis_emoji_kddi2unicode(int s, int *snd) +{ if (s >= mb_tbl_code2uni_kddi1_min && s <= mb_tbl_code2uni_kddi1_max) { - si = s - mb_tbl_code2uni_kddi1_min; - if (si == 0x0008) { /* ES */ - *snd = NFLAGS(nflags_s[2][0]); w = NFLAGS(nflags_s[2][1]); - } else if (si == 0x0009) { /* RU */ - *snd = NFLAGS(nflags_s[8][0]); w = NFLAGS(nflags_s[8][1]); - } else if (si >= 0x008d && si <= 0x0092) { - c = nflags_order_kddi[si-0x008d]; - *snd = NFLAGS(nflags_s[c][0]); w = NFLAGS(nflags_s[c][1]); - } else if (si == 0x0104) { - *snd = 0x0023; w = 0x20E3; + if (s == 0x24C0) { /* Spain */ + EMIT_FLAG_EMOJI("ES"); + } else if (s == 0x24C1) { /* Russia */ + EMIT_FLAG_EMOJI("RU"); + } else if (s >= 0x2545 && s <= 0x254A) { + EMIT_FLAG_EMOJI(nflags_kddi[s - 0x2545]); + } else if (s == 0x25BC) { + EMIT_KEYPAD_EMOJI('#'); } else { - w = mb_tbl_code2uni_kddi1[si]; - if (w > 0xf000) { - w += 0x10000; - } else if (w > 0xe000) { /* unsupported by Unicode 6.0 */ - w += 0xf0000; - } + *snd = 0; + return convert_emoji_cp(mb_tbl_code2uni_kddi1[s - mb_tbl_code2uni_kddi1_min]); } } else if (s >= mb_tbl_code2uni_kddi2_min && s <= mb_tbl_code2uni_kddi2_max) { - si = s - mb_tbl_code2uni_kddi2_min; - if (si == 100) { /* JP */ - *snd = NFLAGS(nflags_s[6][0]); w = NFLAGS(nflags_s[6][1]); - } else if (si >= 0x00ba && si <= 0x00c2) { - *snd = si-0x00ba+0x0031; w = 0x20E3; - } else if (si == 0x010b) { /* US */ - *snd = NFLAGS(nflags_s[9][0]); w = NFLAGS(nflags_s[9][1]); - } else if (si == 0x0144) { - *snd = 0x0030; w = 0x20E3; + if (s == 0x2750) { /* Japan */ + EMIT_FLAG_EMOJI("JP"); + } else if (s >= 0x27A6 && s <= 0x27AE) { + EMIT_KEYPAD_EMOJI(s - 0x27A6 + '1'); + } else if (s == 0x27F7) { /* United States */ + EMIT_FLAG_EMOJI("US"); + } else if (s == 0x2830) { + EMIT_KEYPAD_EMOJI('0'); } else { - w = mb_tbl_code2uni_kddi2[si]; - if (w > 0xf000) { - w += 0x10000; - } else if (w > 0xe000) { /* unsupported by Unicode 6.0 */ - w += 0xf0000; - } + *snd = 0; + return convert_emoji_cp(mb_tbl_code2uni_kddi2[s - mb_tbl_code2uni_kddi2_min]); } } - return w; + return 0; } -int -mbfilter_sjis_emoji_sb2unicode(int s, int *snd) +static const char nflags_sb[10][2] = {"JP", "US", "FR", "DE", "IT", "GB", "ES", "RU", "CN", "KR"}; + +int mbfilter_sjis_emoji_sb2unicode(int s, int *snd) { - int w = s, si, c; - const int nflags_order_sb[10] = {6, 9, 3, 1, 5, 4, 2, 8, 0, 7}; - - *snd = 0; - if (s >= mb_tbl_code2uni_sb1_min && s <= mb_tbl_code2uni_sb1_max) { - si = s - mb_tbl_code2uni_sb1_min; - if (si == 0x006e || (si >= 0x007a && si <= 0x0083)) { - *snd = mb_tbl_code2uni_sb1[si]; - if (*snd > 0xf000) { - *snd += 0x10000; - } - w = 0x20E3; + if (s >= mb_tbl_code2uni_sb1_min && s <= mb_tbl_code2uni_sb1_max) { + if (s == 0x2817 || (s >= 0x2823 && s <= 0x282C)) { + EMIT_KEYPAD_EMOJI(mb_tbl_code2uni_sb1[s - mb_tbl_code2uni_sb1_min]); } else { - w = mb_tbl_code2uni_sb1[si]; - if (w > 0xf000) { - w += 0x10000; - } else if (w > 0xe000) { /* unsupported by Unicode 6.0 */ - w += 0xf0000; - } + *snd = 0; + return convert_emoji_cp(mb_tbl_code2uni_sb1[s - mb_tbl_code2uni_sb1_min]); } } else if (s >= mb_tbl_code2uni_sb2_min && s <= mb_tbl_code2uni_sb2_max) { - si = s - mb_tbl_code2uni_sb2_min; - w = mb_tbl_code2uni_sb2[si]; - if (w > 0xf000) { - w += 0x10000; - } else if (w > 0xe000) { /* unsupported by Unicode 6.0 */ - w += 0xf0000; - } + *snd = 0; + return convert_emoji_cp(mb_tbl_code2uni_sb2[s - mb_tbl_code2uni_sb2_min]); } else if (s >= mb_tbl_code2uni_sb3_min && s <= mb_tbl_code2uni_sb3_max) { - si = s - mb_tbl_code2uni_sb3_min; - if (si >= 0x0069 && si <= 0x0072) { - c = nflags_order_sb[si-0x0069]; - *snd = NFLAGS(nflags_s[c][0]); w = NFLAGS(nflags_s[c][1]); + if (s >= 0x2B02 && s <= 0x2B0B) { + EMIT_FLAG_EMOJI(nflags_sb[s - 0x2B02]); } else { - w = mb_tbl_code2uni_sb3[si]; - if (w > 0xf000) { - w += 0x10000; - } else if (w > 0xe000) { /* unsupported by Unicode 6.0 */ - w += 0xf0000; - } + *snd = 0; + return convert_emoji_cp(mb_tbl_code2uni_sb3[s - mb_tbl_code2uni_sb3_min]); } } - return w; + return 0; } int mbfilter_unicode2sjis_emoji_docomo(int c, int *s1, mbfl_convert_filter *filter) { - int i, match = 0, c1s; - + /* When converting SJIS-Mobile to Unicode, we convert keypad symbol emoji + * to a sequence of 2 codepoints, one of which is a combining character which + * adds the 'key' image around the other + * + * In the other direction, look for such sequences and convert them to a + * single emoji */ if (filter->status == 1) { - c1s = filter->cache; - filter->cache = 0; - filter->status = 0; + int c1 = filter->cache; + filter->cache = filter->status = 0; if (c == 0x20E3) { - if (c1s == 0x0023) { + if (c1 == '#') { *s1 = 0x2964; - match = 1; - } else if (c1s == 0x0030) { - *s1 = 0x296f; - match = 1; - } else if (c1s >= 0x0031 && c1s <= 0x0039) { - *s1 = 0x2966 + (c1s - 0x0031); - match = 1; + } else if (c1 == '0') { + *s1 = 0x296F; + } else { /* Previous character was '1'-'9' */ + *s1 = 0x2966 + (c1 - '1'); } + return 1; } else { - CK((*filter->output_function)(c1s, filter->data)); - } - } else { - if (c == 0x0023 || (c >= 0x0030 && c<=0x0039)) { - filter->status = 1; - filter->cache = c; - *s1 = -1; - return match; - } - - if (c == 0x00A9) { - *s1 = 0x29b5; match = 1; - } else if (c == 0x00AE) { - *s1 = 0x29ba; match = 1; - } else if (c >= mb_tbl_uni_docomo2code2_min && c <= mb_tbl_uni_docomo2code2_max) { - i = mbfl_bisec_srch2(c, mb_tbl_uni_docomo2code2_key, mb_tbl_uni_docomo2code2_len); - if (i >= 0) { - *s1 = mb_tbl_uni_docomo2code2_value[i]; - match = 1; - } - } else if (c >= mb_tbl_uni_docomo2code3_min && c <= mb_tbl_uni_docomo2code3_max) { - i = mbfl_bisec_srch2(c - 0x10000, mb_tbl_uni_docomo2code3_key, mb_tbl_uni_docomo2code3_len); - if (i >= 0) { - *s1 = mb_tbl_uni_docomo2code3_value[i]; - match = 1; - } - } else if (c >= mb_tbl_uni_docomo2code5_min && c <= mb_tbl_uni_docomo2code5_max) { - i = mbfl_bisec_srch2(c - 0xf0000, mb_tbl_uni_docomo2code5_key, mb_tbl_uni_docomo2code5_len); - if (i >= 0) { - *s1 = mb_tbl_uni_docomo2code5_val[i]; - match = 1; - } + /* This character wasn't combining character to make keypad symbol, + * so pass the previous character through... and proceed to process the + * current character as usual + * (Single-byte ASCII characters are valid in Shift-JIS...) */ + CK((*filter->output_function)(c1, filter->data)); } } - return match; + if (c == '#' || (c >= '0' && c <= '9')) { + filter->status = 1; + filter->cache = c; + return 0; + } + + if (c == 0xA9) { /* Copyright sign */ + *s1 = 0x29B5; + return 1; + } else if (c == 0x00AE) { /* Registered sign */ + *s1 = 0x29BA; + return 1; + } else if (c >= mb_tbl_uni_docomo2code2_min && c <= mb_tbl_uni_docomo2code2_max) { + int i = mbfl_bisec_srch2(c, mb_tbl_uni_docomo2code2_key, mb_tbl_uni_docomo2code2_len); + if (i >= 0) { + *s1 = mb_tbl_uni_docomo2code2_value[i]; + return 1; + } + } else if (c >= mb_tbl_uni_docomo2code3_min && c <= mb_tbl_uni_docomo2code3_max) { + int i = mbfl_bisec_srch2(c - 0x10000, mb_tbl_uni_docomo2code3_key, mb_tbl_uni_docomo2code3_len); + if (i >= 0) { + *s1 = mb_tbl_uni_docomo2code3_value[i]; + return 1; + } + } else if (c >= mb_tbl_uni_docomo2code5_min && c <= mb_tbl_uni_docomo2code5_max) { + int i = mbfl_bisec_srch2(c - 0xF0000, mb_tbl_uni_docomo2code5_key, mb_tbl_uni_docomo2code5_len); + if (i >= 0) { + *s1 = mb_tbl_uni_docomo2code5_val[i]; + return 1; + } + } + return 0; } -int -mbfilter_unicode2sjis_emoji_kddi(int c, int *s1, mbfl_convert_filter *filter) +int mbfilter_unicode2sjis_emoji_kddi(int c, int *s1, mbfl_convert_filter *filter) { - int i, match = 0, c1s; - if (filter->status == 1) { - c1s = filter->cache; - filter->cache = 0; - filter->status = 0; + int c1 = filter->cache; + filter->cache = filter->status = 0; if (c == 0x20E3) { - if (c1s == 0x0023) { - *s1 = 0x25bc; - match = 1; - } else if (c1s == 0x0030) { + if (c1 == '#') { + *s1 = 0x25BC; + } else if (c1 == '0') { *s1 = 0x2830; - match = 1; - } else if (c1s >= 0x0031 && c1s <= 0x0039) { - *s1 = 0x27a6 + (c1s - 0x0031); - match = 1; - } - } else if ((c >= NFLAGS(0x41) && c <= NFLAGS(0x5A)) && (c1s >= NFLAGS(0x41) && c1s <= NFLAGS(0x5A))) { - for (i=0; i<10; i++) { - if (c1s == NFLAGS(nflags_s[i][0]) && c == NFLAGS(nflags_s[i][1])) { - *s1 = nflags_code_kddi[i]; - match = 1; - break; - } + } else { /* Previous character was '1'-'9' */ + *s1 = 0x27a6 + (c1 - '1'); } + return 1; } else { - if (c1s >= ucs_a1_jis_table_min && c1s < ucs_a1_jis_table_max) { - c1s = ucs_a1_jis_table[c1s - ucs_a1_jis_table_min]; - CK((*filter->output_function)(c1s, filter->data)); - } + CK((*filter->output_function)(c1, filter->data)); } - } else { - if (c == 0x0023 || ( c >= 0x0030 && c<=0x0039) || - (c >= NFLAGS(0x41) && c<= NFLAGS(0x5A))) { - filter->status = 1; - filter->cache = c; - *s1 = -1; - return match; - } - - if (c == 0x00A9) { - *s1 = 0x27dc; match = 1; - } else if (c == 0x00AE) { - *s1 = 0x27dd; match = 1; - } else if (c >= mb_tbl_uni_kddi2code2_min && c <= mb_tbl_uni_kddi2code2_max) { - i = mbfl_bisec_srch2(c, mb_tbl_uni_kddi2code2_key, mb_tbl_uni_kddi2code2_len); - if (i >= 0) { - *s1 = mb_tbl_uni_kddi2code2_value[i]; - match = 1; - } - } else if (c >= mb_tbl_uni_kddi2code3_min && c <= mb_tbl_uni_kddi2code3_max) { - i = mbfl_bisec_srch2(c - 0x10000, mb_tbl_uni_kddi2code3_key, mb_tbl_uni_kddi2code3_len); - if (i >= 0) { - *s1 = mb_tbl_uni_kddi2code3_value[i]; - match = 1; - } - } else if (c >= mb_tbl_uni_kddi2code5_min && c <= mb_tbl_uni_kddi2code5_max) { - i = mbfl_bisec_srch2(c - 0xf0000, mb_tbl_uni_kddi2code5_key, mb_tbl_uni_kddi2code5_len); - if (i >= 0) { - *s1 = mb_tbl_uni_kddi2code5_val[i]; - match = 1; + } else if (filter->status == 2) { + int c1 = filter->cache; + filter->cache = filter->status = 0; + if (c >= NFLAGS('B') && c <= NFLAGS('U')) { /* B for GB, U for RU */ + for (int i = 0; i < 10; i++) { + if (c1 == NFLAGS(nflags_s[i][0]) && c == NFLAGS(nflags_s[i][1])) { + *s1 = nflags_code_kddi[i]; + return 1; + } } } + + /* If none of the KDDI national flag emoji matched, then we have no way + * to convert the previous codepoint... */ + mbfl_filt_conv_illegal_output(c1, filter); + } + + if (c == '#' || (c >= '0' && c <= '9')) { + filter->status = 1; + filter->cache = c; + return 0; + } else if (c >= NFLAGS('C') && c <= NFLAGS('U')) { /* C for CN, U for US */ + filter->status = 2; + filter->cache = c; + return 0; } - return match; + if (c == 0xA9) { /* Copyright sign */ + *s1 = 0x27DC; + return 1; + } else if (c == 0xAE) { /* Registered sign */ + *s1 = 0x27DD; + return 1; + } else if (c >= mb_tbl_uni_kddi2code2_min && c <= mb_tbl_uni_kddi2code2_max) { + int i = mbfl_bisec_srch2(c, mb_tbl_uni_kddi2code2_key, mb_tbl_uni_kddi2code2_len); + if (i >= 0) { + *s1 = mb_tbl_uni_kddi2code2_value[i]; + return 1; + } + } else if (c >= mb_tbl_uni_kddi2code3_min && c <= mb_tbl_uni_kddi2code3_max) { + int i = mbfl_bisec_srch2(c - 0x10000, mb_tbl_uni_kddi2code3_key, mb_tbl_uni_kddi2code3_len); + if (i >= 0) { + *s1 = mb_tbl_uni_kddi2code3_value[i]; + return 1; + } + } else if (c >= mb_tbl_uni_kddi2code5_min && c <= mb_tbl_uni_kddi2code5_max) { + int i = mbfl_bisec_srch2(c - 0xF0000, mb_tbl_uni_kddi2code5_key, mb_tbl_uni_kddi2code5_len); + if (i >= 0) { + *s1 = mb_tbl_uni_kddi2code5_val[i]; + return 1; + } + } + return 0; } -int -mbfilter_unicode2sjis_emoji_sb(int c, int *s1, mbfl_convert_filter *filter) +int mbfilter_unicode2sjis_emoji_sb(int c, int *s1, mbfl_convert_filter *filter) { - int i, match = 0, c1s; - if (filter->status == 1) { - filter->status = 0; - c1s = filter->cache; - filter->cache = 0; + int c1 = filter->cache; + filter->cache = filter->status = 0; if (c == 0x20E3) { - if (c1s == 0x0023) { + if (c1 == '#') { *s1 = 0x2817; - match = 1; - } else if (c1s == 0x0030) { + } else if (c1 == '0') { *s1 = 0x282c; - match = 1; - } else if (c1s >= 0x0031 && c1s <= 0x0039) { - *s1 = 0x2823 + (c1s - 0x0031); - match = 1; + } else { /* Previous character was '1'-'9' */ + *s1 = 0x2823 + (c1 - '1'); } - } else if ((c >= NFLAGS(0x41) && c <= NFLAGS(0x5A)) && (c1s >= NFLAGS(0x41) && c1s <= NFLAGS(0x5A))) { - for (i=0; i<10; i++) { - if (c1s == NFLAGS(nflags_s[i][0]) && c == NFLAGS(nflags_s[i][1])) { + return 1; + } else { + (*filter->output_function)(c1, filter->data); + } + } else if (filter->status == 2) { + int c1 = filter->cache; + filter->cache = filter->status = 0; + if (c >= NFLAGS('B') && c <= NFLAGS('U')) { /* B for GB, U for RU */ + for (int i = 0; i < 10; i++) { + if (c1 == NFLAGS(nflags_s[i][0]) && c == NFLAGS(nflags_s[i][1])) { *s1 = nflags_code_sb[i]; - match = 1; - break; + return 1; } } - } else { - if (c1s >= ucs_a1_jis_table_min && c1s < ucs_a1_jis_table_max) { - c1s = ucs_a1_jis_table[c1s - ucs_a1_jis_table_min]; - CK((*filter->output_function)(c1s, filter->data)); - } } - } else { - if (c == 0x0023 || ( c >= 0x0030 && c<=0x0039) || (c >= NFLAGS(0x41) && c<= NFLAGS(0x5A))) { - filter->status = 1; - filter->cache = c; - *s1 = -1; - return match; - } - - if (c == 0x00A9) { - *s1 = 0x2855; match = 1; - } else if (c == 0x00AE) { - *s1 = 0x2856; match = 1; - } else if (c >= mb_tbl_uni_sb2code2_min && c <= mb_tbl_uni_sb2code2_max) { - i = mbfl_bisec_srch2(c, mb_tbl_uni_sb2code2_key, mb_tbl_uni_sb2code2_len); - if (i >= 0) { - *s1 = mb_tbl_uni_sb2code2_value[i]; - match = 1; - } - } else if (c >= mb_tbl_uni_sb2code3_min && c <= mb_tbl_uni_sb2code3_max) { - i = mbfl_bisec_srch2(c - 0x10000, mb_tbl_uni_sb2code3_key, mb_tbl_uni_sb2code3_len); - if (i >= 0) { - *s1 = mb_tbl_uni_sb2code3_value[i]; - match = 1; - } - } else if (c >= mb_tbl_uni_sb2code5_min && c <= mb_tbl_uni_sb2code5_max) { - i = mbfl_bisec_srch2(c - 0xf0000, mb_tbl_uni_sb2code5_key, mb_tbl_uni_sb2code5_len); - if (i >= 0) { - *s1 = mb_tbl_uni_sb2code5_val[i]; - match = 1; - } + + /* If none of the SoftBank national flag emoji matched, then we have no way + * to convert the previous codepoint... */ + mbfl_filt_conv_illegal_output(c1, filter); + } + + if (c == '#' || (c >= '0' && c <= '9')) { + filter->status = 1; + filter->cache = c; + return 0; + } else if (c >= NFLAGS('C') && c <= NFLAGS('U')) { /* C for CN, U for US */ + filter->status = 2; + filter->cache = c; + return 0; + } + + if (c == 0xA9) { /* Copyright sign */ + *s1 = 0x2855; + return 1; + } else if (c == 0xAE) { /* Registered sign */ + *s1 = 0x2856; + return 1; + } else if (c >= mb_tbl_uni_sb2code2_min && c <= mb_tbl_uni_sb2code2_max) { + int i = mbfl_bisec_srch2(c, mb_tbl_uni_sb2code2_key, mb_tbl_uni_sb2code2_len); + if (i >= 0) { + *s1 = mb_tbl_uni_sb2code2_value[i]; + return 1; + } + } else if (c >= mb_tbl_uni_sb2code3_min && c <= mb_tbl_uni_sb2code3_max) { + int i = mbfl_bisec_srch2(c - 0x10000, mb_tbl_uni_sb2code3_key, mb_tbl_uni_sb2code3_len); + if (i >= 0) { + *s1 = mb_tbl_uni_sb2code3_value[i]; + return 1; + } + } else if (c >= mb_tbl_uni_sb2code5_min && c <= mb_tbl_uni_sb2code5_max) { + int i = mbfl_bisec_srch2(c - 0xF0000, mb_tbl_uni_sb2code5_key, mb_tbl_uni_sb2code5_len); + if (i >= 0) { + *s1 = mb_tbl_uni_sb2code5_val[i]; + return 1; } } - return match; + return 0; } -/* - * SJIS-win => wchar - */ -int -mbfl_filt_conv_sjis_mobile_wchar(int c, mbfl_convert_filter *filter) +int mbfl_filt_conv_sjis_mobile_wchar(int c, mbfl_convert_filter *filter) { - int c1, s, s1 = 0, s2 = 0, w; - int snd = 0; + int c1, s, s1, s2, w, snd = 0; -retry: switch (filter->status) { case 0: - if (c >= 0 && c < 0x80) { /* latin */ - if (filter->from->no_encoding == mbfl_no_encoding_sjis_sb && c == 0x1b) { + if (c >= 0 && c < 0x80) { /* ASCII */ + if (filter->from == &mbfl_encoding_sjis_sb && c == 0x1B) { + /* ESC; escape sequences were used on older SoftBank phones for emoji */ filter->cache = c; filter->status = 2; } else { CK((*filter->output_function)(c, filter->data)); } - } else if (c > 0xa0 && c < 0xe0) { /* kana */ - CK((*filter->output_function)(0xfec0 + c, filter->data)); - } else if (c > 0x80 && c < 0xfd && c != 0xa0) { /* kanji first char */ + } else if (c > 0xA0 && c < 0xE0) { /* Kana */ + CK((*filter->output_function)(0xFEC0 + c, filter->data)); + } else if (c > 0x80 && c < 0xFD && c != 0xA0) { /* Kanji, first byte */ filter->status = 1; filter->cache = c; } else { - w = c & MBFL_WCSGROUP_MASK; - w |= MBFL_WCSGROUP_THROUGH; - CK((*filter->output_function)(w, filter->data)); + CK((*filter->output_function)(c | MBFL_WCSGROUP_THROUGH, filter->data)); } break; - case 1: /* kanji second char */ + case 1: /* Kanji, second byte */ filter->status = 0; c1 = filter->cache; - if (c >= 0x40 && c <= 0xfc && c != 0x7f) { + if (c >= 0x40 && c <= 0xFC && c != 0x7F) { w = 0; SJIS_DECODE(c1, c, s1, s2); - s = (s1 - 0x21)*94 + s2 - 0x21; + s = ((s1 - 0x21) * 94) + s2 - 0x21; if (s <= 137) { if (s == 31) { - w = 0xff3c; /* FULLWIDTH REVERSE SOLIDUS */ + w = 0xFF3C; /* FULLWIDTH REVERSE SOLIDUS */ } else if (s == 32) { - w = 0xff5e; /* FULLWIDTH TILDE */ + w = 0xFF5E; /* FULLWIDTH TILDE */ } else if (s == 33) { - w = 0x2225; /* PARALLEL TO */ + w = 0x2225; /* PARALLEL TO */ } else if (s == 60) { - w = 0xff0d; /* FULLWIDTH HYPHEN-MINUS */ + w = 0xFF0D; /* FULLWIDTH HYPHEN-MINUS */ } else if (s == 80) { - w = 0xffe0; /* FULLWIDTH CENT SIGN */ + w = 0xFFE0; /* FULLWIDTH CENT SIGN */ } else if (s == 81) { - w = 0xffe1; /* FULLWIDTH POUND SIGN */ + w = 0xFFE1; /* FULLWIDTH POUND SIGN */ } else if (s == 137) { - w = 0xffe2; /* FULLWIDTH NOT SIGN */ + w = 0xFFE2; /* FULLWIDTH NOT SIGN */ } } if (w == 0) { @@ -646,134 +612,123 @@ mbfl_filt_conv_sjis_mobile_wchar(int c, mbfl_convert_filter *filter) w = jisx0208_ucs_table[s]; } else if (s >= cp932ext2_ucs_table_min && s < cp932ext2_ucs_table_max) { /* vendor ext2 (89ku - 92ku) */ w = cp932ext2_ucs_table[s - cp932ext2_ucs_table_min]; - } else if (s >= cp932ext3_ucs_table_min && s < cp932ext3_ucs_table_max) { /* vendor ext3 (115ku - 119ku) */ - w = cp932ext3_ucs_table[s - cp932ext3_ucs_table_min]; - } else if (s >= (94*94) && s < (114*94)) { /* user (95ku - 114ku) */ - w = s - (94*94) + 0xe000; } - if (s >= (94*94) && s < 119*94) { - if (filter->from->no_encoding == mbfl_no_encoding_sjis_docomo) { - w = mbfilter_sjis_emoji_docomo2unicode(s, &snd); - } else if (filter->from->no_encoding == mbfl_no_encoding_sjis_kddi) { - w = mbfilter_sjis_emoji_kddi2unicode(s, &snd); - } else if (filter->from->no_encoding == mbfl_no_encoding_sjis_sb) { - w = mbfilter_sjis_emoji_sb2unicode(s, &snd); + /* Emoji */ + if (filter->from == &mbfl_encoding_sjis_docomo && s >= mb_tbl_code2uni_docomo1_min && s <= mb_tbl_code2uni_docomo1_max) { + w = mbfilter_sjis_emoji_docomo2unicode(s, &snd); + if (snd > 0) { + CK((*filter->output_function)(snd, filter->data)); } - - if (w > 0 && snd > 0) { + } else if (filter->from == &mbfl_encoding_sjis_kddi && s >= mb_tbl_code2uni_kddi1_min && s <= mb_tbl_code2uni_kddi2_max) { + w = mbfilter_sjis_emoji_kddi2unicode(s, &snd); + if (snd > 0) { + CK((*filter->output_function)(snd, filter->data)); + } + } else if (filter->from == &mbfl_encoding_sjis_sb && s >= mb_tbl_code2uni_sb1_min && s <= mb_tbl_code2uni_sb3_max) { + w = mbfilter_sjis_emoji_sb2unicode(s, &snd); + if (snd > 0) { CK((*filter->output_function)(snd, filter->data)); } } + + if (w == 0) { + if (s >= cp932ext3_ucs_table_min && s < cp932ext3_ucs_table_max) { /* vendor ext3 (115ku - 119ku) */ + w = cp932ext3_ucs_table[s - cp932ext3_ucs_table_min]; + } else if (s >= (94*94) && s < (114*94)) { /* user (95ku - 114ku) */ + w = s - (94*94) + 0xe000; + } + } } if (w <= 0) { - w = (s1 << 8) | s2; - w &= MBFL_WCSPLANE_MASK; - w |= MBFL_WCSPLANE_WINCP932; + w = (s1 << 8) | s2 | MBFL_WCSPLANE_WINCP932; } CK((*filter->output_function)(w, filter->data)); - } else if ((c >= 0 && c < 0x21) || c == 0x7f) { /* CTLs */ - CK((*filter->output_function)(c, filter->data)); } else { - w = (c1 << 8) | c; - w &= MBFL_WCSGROUP_MASK; - w |= MBFL_WCSGROUP_THROUGH; - CK((*filter->output_function)(w, filter->data)); + CK((*filter->output_function)((c1 << 8) | c | MBFL_WCSGROUP_THROUGH, filter->data)); } break; - /* ESC : Softbank Emoji */ + + /* ESC: Softbank Emoji */ case 2: - if (filter->from->no_encoding == mbfl_no_encoding_sjis_sb && - c == 0x24) { - filter->cache = c; - filter->status++; + if (c == '$') { + filter->cache = c; + filter->status++; } else { - filter->cache = 0; - filter->status = 0; - CK((*filter->output_function)(0x1b, filter->data)); - goto retry; + CK((*filter->output_function)((filter->cache << 8) | c | MBFL_WCSGROUP_THROUGH, filter->data)); + filter->status = filter->cache = 0; } break; - /* ESC $ : Softbank Emoji */ + /* ESC $: Softbank Emoji */ case 3: - if (filter->from->no_encoding == mbfl_no_encoding_sjis_sb && - ((c >= 0x45 && c <= 0x47) || (c >= 0x4f && c <= 0x51))) { - filter->cache = c; - filter->status++; + if ((c >= 'E' && c <= 'G') || (c >= 'O' && c <= 'Q')) { + filter->cache = c; + filter->status++; } else { - filter->cache = 0; - filter->status = 0; - CK((*filter->output_function)(0x1b, filter->data)); - CK((*filter->output_function)(0x24, filter->data)); - goto retry; + CK((*filter->output_function)(0x1B2400 | c | MBFL_WCSGROUP_THROUGH, filter->data)); + filter->status = filter->cache = 0; } break; - /* ESC [GEFOPQ] : Softbank Emoji */ + /* ESC $ [GEFOPQ]: Softbank Emoji */ case 4: - w = 0; - if (filter->from->no_encoding == mbfl_no_encoding_sjis_sb) { - c1 = filter->cache; - - if (c == 0x0f) { - w = c; - filter->cache = 0; - filter->status = 0; + c1 = filter->cache; + if (c == 0xF) { /* Terminate sequence of emoji */ + filter->status = filter->cache = 0; + return c; + } else { + if (c1 == 'G' && c >= 0x21 && c <= 0x7a) { + s1 = (0x91 - 0x21) * 94; + } else if (c1 == 'E' && c >= 0x21 && c <= 0x7A) { + s1 = (0x8D - 0x21) * 94; + } else if (c1 == 'F' && c >= 0x21 && c <= 0x7A) { + s1 = (0x8E - 0x21) * 94; + } else if (c1 == 'O' && c >= 0x21 && c <= 0x6D) { + s1 = (0x92 - 0x21) * 94; + } else if (c1 == 'P' && c >= 0x21 && c <= 0x6C) { + s1 = (0x95 - 0x21) * 94; + } else if (c1 == 'Q' && c >= 0x21 && c <= 0x5E) { + s1 = (0x96 - 0x21) * 94; } else { - if (c1 == 0x47 && c >= 0x21 && c <= 0x7a) { - s1 = 0x91; s2 = c; - } else if (c1 == 0x45 && c >= 0x21 && c <= 0x7a) { - s1 = 0x8d; s2 = c; - } else if (c1 == 0x46 && c >= 0x21 && c <= 0x7a) { - s1 = 0x8e; s2 = c; - } else if (c1 == 0x4f && c >= 0x21 && c <= 0x6d) { - s1 = 0x92; s2 = c; - } else if (c1 == 0x50 && c >= 0x21 && c <= 0x6c) { - s1 = 0x95; s2 = c; - } else if (c1 == 0x51 && c >= 0x21 && c <= 0x5e) { - s1 = 0x96; s2 = c; - } - s = (s1 - 0x21)*94 + s2 - 0x21; - w = mbfilter_sjis_emoji_sb2unicode(s, &snd); - if (w > 0) { - if (snd > 0) { - CK((*filter->output_function)(snd, filter->data)); - } - CK((*filter->output_function)(w, filter->data)); + CK((*filter->output_function)((c1 << 8) | c | MBFL_WCSGROUP_THROUGH, filter->data)); + filter->status = filter->cache = 0; + return c; + } + + w = mbfilter_sjis_emoji_sb2unicode(s1 + c - 0x21, &snd); + if (w > 0) { + if (snd > 0) { + CK((*filter->output_function)(snd, filter->data)); } + CK((*filter->output_function)(w, filter->data)); + } else { + CK((*filter->output_function)((c1 << 8) | c | MBFL_WCSGROUP_THROUGH, filter->data)); + filter->status = filter->cache = 0; } } + } - if (w <= 0) { - c1 = filter->cache; - filter->cache = 0; - filter->status = 0; - CK((*filter->output_function)(0x1b, filter->data)); - CK((*filter->output_function)(0x24, filter->data)); - CK((*filter->output_function)(c1 & 0xff, filter->data)); - goto retry; - } - break; + return c; +} - default: - filter->status = 0; - break; +static int mbfl_filt_conv_sjis_wchar_flush(mbfl_convert_filter *filter) +{ + if (filter->status && filter->status != 4) { + mbfl_filt_conv_illegal_output(filter->cache, filter); } - return c; + if (filter->flush_function) { + (*filter->flush_function)(filter->data); + } + + return 0; } -/* - * wchar => SJIS-win - */ -int -mbfl_filt_conv_wchar_sjis_mobile(int c, mbfl_convert_filter *filter) +int mbfl_filt_conv_wchar_sjis_mobile(int c, mbfl_convert_filter *filter) { - int c1, c2, s1, s2; + int c1, c2, s1 = 0, s2 = 0; - s1 = 0; - s2 = 0; if (c >= ucs_a1_jis_table_min && c < ucs_a1_jis_table_max) { s1 = ucs_a1_jis_table[c - ucs_a1_jis_table_min]; } else if (c >= ucs_a2_jis_table_min && c < ucs_a2_jis_table_max) { @@ -782,102 +737,83 @@ mbfl_filt_conv_wchar_sjis_mobile(int c, mbfl_convert_filter *filter) s1 = ucs_i_jis_table[c - ucs_i_jis_table_min]; } else if (c >= ucs_r_jis_table_min && c < ucs_r_jis_table_max) { s1 = ucs_r_jis_table[c - ucs_r_jis_table_min]; - } else if (c >= 0xe000 && c < (0xe000 + 20*94)) { /* user (95ku - 114ku) */ - s1 = c - 0xe000; - c1 = s1/94 + 0x7f; - c2 = s1%94 + 0x21; + } else if (c >= 0xE000 && c < (0xE000 + 20*94)) { + /* Private User Area (95ku - 114ku) */ + s1 = c - 0xE000; + c1 = (s1 / 94) + 0x7F; + c2 = (s1 % 94) + 0x21; s1 = (c1 << 8) | c2; s2 = 1; } + if (s1 <= 0) { - c1 = c & ~MBFL_WCSPLANE_MASK; - if (c1 == MBFL_WCSPLANE_WINCP932) { - s1 = c & MBFL_WCSPLANE_MASK; - s2 = 1; - } else if (c1 == MBFL_WCSPLANE_JIS0208) { - s1 = c & MBFL_WCSPLANE_MASK; - } else if (c1 == MBFL_WCSPLANE_JIS0212) { - s1 = c & MBFL_WCSPLANE_MASK; - s1 |= 0x8080; - } else if (c == 0xa5) { /* YEN SIGN */ - s1 = 0x216f; /* FULLWIDTH YEN SIGN */ - } else if (c == 0x203e) { /* OVER LINE */ - s1 = 0x2131; /* FULLWIDTH MACRON */ - } else if (c == 0xff3c) { /* FULLWIDTH REVERSE SOLIDUS */ + if (c == 0xA5) { /* YEN SIGN */ + s1 = 0x216F; /* FULLWIDTH YEN SIGN */ + } else if (c == 0xFF3c) { /* FULLWIDTH REVERSE SOLIDUS */ s1 = 0x2140; - } else if (c == 0xff5e) { /* FULLWIDTH TILDE */ - s1 = 0x2141; - } else if (c == 0x2225) { /* PARALLEL TO */ + } else if (c == 0x2225) { /* PARALLEL TO */ s1 = 0x2142; - } else if (c == 0xff0d) { /* FULLWIDTH HYPHEN-MINUS */ - s1 = 0x215d; - } else if (c == 0xffe0) { /* FULLWIDTH CENT SIGN */ + } else if (c == 0xFF0D) { /* FULLWIDTH HYPHEN-MINUS */ + s1 = 0x215D; + } else if (c == 0xFFE0) { /* FULLWIDTH CENT SIGN */ s1 = 0x2171; - } else if (c == 0xffe1) { /* FULLWIDTH POUND SIGN */ + } else if (c == 0xFFE1) { /* FULLWIDTH POUND SIGN */ s1 = 0x2172; - } else if (c == 0xffe2) { /* FULLWIDTH NOT SIGN */ - s1 = 0x224c; + } else if (c == 0xFFE2) { /* FULLWIDTH NOT SIGN */ + s1 = 0x224C; } } if ((s1 <= 0) || (s1 >= 0x8080 && s2 == 0)) { /* not found or X 0212 */ s1 = -1; - c1 = 0; - c2 = cp932ext1_ucs_table_max - cp932ext1_ucs_table_min; - while (c1 < c2) { /* CP932 vendor ext1 (13ku) */ + + /* CP932 vendor ext1 (13ku) */ + for (c1 = 0; c1 < cp932ext1_ucs_table_max - cp932ext1_ucs_table_min; c1++) { if (c == cp932ext1_ucs_table[c1]) { - s1 = ((c1/94 + 0x2d) << 8) + (c1%94 + 0x21); + s1 = (((c1 / 94) + 0x2D) << 8) + (c1 % 94) + 0x21; break; } - c1++; } + if (s1 <= 0) { - c1 = 0; - c2 = cp932ext2_ucs_table_max - cp932ext2_ucs_table_min; - while (c1 < c2) { /* CP932 vendor ext2 (115ku - 119ku) */ + /* CP932 vendor ext2 (115ku - 119ku) */ + for (c1 = 0; c1 < cp932ext2_ucs_table_max - cp932ext2_ucs_table_min; c1++) { if (c == cp932ext2_ucs_table[c1]) { - s1 = ((c1/94 + 0x93) << 8) + (c1%94 + 0x21); + s1 = (((c1 / 94) + 0x79) << 8) + (c1 % 94) + 0x21; break; } - c1++; } } if (s1 <= 0) { - c1 = 0; - c2 = cp932ext3_ucs_table_max - cp932ext3_ucs_table_min; - while (c1 < c2) { /* CP932 vendor ext3 (115ku - 119ku) */ + /* CP932 vendor ext3 (115ku - 119ku) */ + for (c1 = 0; c1 < cp932ext3_ucs_table_max - cp932ext3_ucs_table_min; c1++) { if (c == cp932ext3_ucs_table[c1]) { - s1 = ((c1/94 + 0x93) << 8) + (c1%94 + 0x21); + s1 = (((c1 / 94) + 0x93) << 8) + (c1 % 94) + 0x21; break; } - c1++; } } + if (c == 0) { s1 = 0; - } else if (s1 <= 0) { - s1 = -1; } } - if ((filter->to->no_encoding == mbfl_no_encoding_sjis_docomo && - mbfilter_unicode2sjis_emoji_docomo(c, &s1, filter) > 0) || - (filter->to->no_encoding == mbfl_no_encoding_sjis_kddi && - mbfilter_unicode2sjis_emoji_kddi(c, &s1, filter) > 0) || - (filter->to->no_encoding == mbfl_no_encoding_sjis_sb && - mbfilter_unicode2sjis_emoji_sb(c, &s1, filter) > 0 )) { + if ((filter->to == &mbfl_encoding_sjis_docomo && mbfilter_unicode2sjis_emoji_docomo(c, &s1, filter)) || + (filter->to == &mbfl_encoding_sjis_kddi && mbfilter_unicode2sjis_emoji_kddi(c, &s1, filter)) || + (filter->to == &mbfl_encoding_sjis_sb && mbfilter_unicode2sjis_emoji_sb(c, &s1, filter))) { CODE2JIS(c1,c2,s1,s2); } - if (filter->status == 1 && filter->cache > 0) { + if (filter->status) { return c; } if (s1 >= 0) { - if (s1 < 0x100) { /* latin or kana */ + if (s1 < 0x100) { /* Latin/Kana */ CK((*filter->output_function)(s1, filter->data)); - } else { /* kanji */ + } else { /* Kanji */ c1 = (s1 >> 8) & 0xff; c2 = s1 & 0xff; SJIS_ENCODE(c1, c2, s1, s2); @@ -891,18 +827,15 @@ mbfl_filt_conv_wchar_sjis_mobile(int c, mbfl_convert_filter *filter) return c; } -int -mbfl_filt_conv_sjis_mobile_flush(mbfl_convert_filter *filter) +int mbfl_filt_conv_sjis_mobile_flush(mbfl_convert_filter *filter) { int c1 = filter->cache; - if (filter->status == 1 && (c1 == 0x0023 || (c1 >= 0x0030 && c1<=0x0039))) { + if (filter->status == 1 && (c1 == '#' || (c1 >= '0' && c1 <= '9'))) { CK((*filter->output_function)(c1, filter->data)); } - filter->status = 0; - filter->cache = 0; - if (filter->flush_function != NULL) { - return (*filter->flush_function)(filter->data); + if (filter->flush_function) { + (*filter->flush_function)(filter->data); } return 0; diff --git a/ext/mbstring/libmbfl/filters/mbfilter_sjis_open.c b/ext/mbstring/libmbfl/filters/mbfilter_sjis_open.c index d37f01568e281..d1dd5efd954b2 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_sjis_open.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_sjis_open.c @@ -241,16 +241,7 @@ mbfl_filt_conv_wchar_sjis_open(int c, mbfl_convert_filter *filter) s2 = 1; } if (s1 <= 0) { - c1 = c & ~MBFL_WCSPLANE_MASK; - if (c1 == MBFL_WCSPLANE_WINCP932) { - s1 = c & MBFL_WCSPLANE_MASK; - s2 = 1; - } else if (c1 == MBFL_WCSPLANE_JIS0208) { - s1 = c & MBFL_WCSPLANE_MASK; - } else if (c1 == MBFL_WCSPLANE_JIS0212) { - s1 = c & MBFL_WCSPLANE_MASK; - s1 |= 0x8080; - } else if (c == 0xa5) { /* YEN SIGN */ + if (c == 0xa5) { /* YEN SIGN */ s1 = 0x216f; /* FULLWIDTH YEN SIGN */ } else if (c == 0x203e) { /* OVER LINE */ s1 = 0x2131; /* FULLWIDTH MACRON */ diff --git a/ext/mbstring/libmbfl/filters/mbfilter_ucs2.c b/ext/mbstring/libmbfl/filters/mbfilter_ucs2.c index c886654f61a94..efe8cc2d4ac88 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_ucs2.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_ucs2.c @@ -47,7 +47,7 @@ const mbfl_encoding mbfl_encoding_ucs2 = { "UCS-2", mbfl_encoding_ucs2_aliases, NULL, - MBFL_ENCTYPE_WCS2BE, + MBFL_ENCTYPE_WCS2, &vtbl_ucs2_wchar, &vtbl_wchar_ucs2 }; @@ -58,7 +58,7 @@ const mbfl_encoding mbfl_encoding_ucs2be = { "UCS-2BE", mbfl_encoding_ucs2be_aliases, NULL, - MBFL_ENCTYPE_WCS2BE, + MBFL_ENCTYPE_WCS2, &vtbl_ucs2be_wchar, &vtbl_wchar_ucs2be }; @@ -69,7 +69,7 @@ const mbfl_encoding mbfl_encoding_ucs2le = { "UCS-2LE", mbfl_encoding_ucs2le_aliases, NULL, - MBFL_ENCTYPE_WCS2LE, + MBFL_ENCTYPE_WCS2, &vtbl_ucs2le_wchar, &vtbl_wchar_ucs2le }; diff --git a/ext/mbstring/libmbfl/filters/mbfilter_ucs4.c b/ext/mbstring/libmbfl/filters/mbfilter_ucs4.c index 96ef6fbf6df57..7cc432750edfb 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_ucs4.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_ucs4.c @@ -44,7 +44,7 @@ const mbfl_encoding mbfl_encoding_ucs4 = { "UCS-4", mbfl_encoding_ucs4_aliases, NULL, - MBFL_ENCTYPE_WCS4BE, + MBFL_ENCTYPE_WCS4, &vtbl_ucs4_wchar, &vtbl_wchar_ucs4 }; @@ -55,7 +55,7 @@ const mbfl_encoding mbfl_encoding_ucs4be = { "UCS-4BE", mbfl_encoding_ucs4be_aliases, NULL, - MBFL_ENCTYPE_WCS4BE, + MBFL_ENCTYPE_WCS4, &vtbl_ucs4be_wchar, &vtbl_wchar_ucs4be }; @@ -66,7 +66,7 @@ const mbfl_encoding mbfl_encoding_ucs4le = { "UCS-4LE", mbfl_encoding_ucs4le_aliases, NULL, - MBFL_ENCTYPE_WCS4LE, + MBFL_ENCTYPE_WCS4, &vtbl_ucs4le_wchar, &vtbl_wchar_ucs4le }; diff --git a/ext/mbstring/libmbfl/filters/mbfilter_utf16.c b/ext/mbstring/libmbfl/filters/mbfilter_utf16.c index 10063883f2e61..c2c30973db469 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_utf16.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_utf16.c @@ -40,7 +40,7 @@ const mbfl_encoding mbfl_encoding_utf16 = { "UTF-16", mbfl_encoding_utf16_aliases, NULL, - MBFL_ENCTYPE_MWC2BE, + MBFL_ENCTYPE_MWC2, &vtbl_utf16_wchar, &vtbl_wchar_utf16 }; @@ -51,7 +51,7 @@ const mbfl_encoding mbfl_encoding_utf16be = { "UTF-16BE", NULL, NULL, - MBFL_ENCTYPE_MWC2BE, + MBFL_ENCTYPE_MWC2, &vtbl_utf16be_wchar, &vtbl_wchar_utf16be }; @@ -62,7 +62,7 @@ const mbfl_encoding mbfl_encoding_utf16le = { "UTF-16LE", NULL, NULL, - MBFL_ENCTYPE_MWC2LE, + MBFL_ENCTYPE_MWC2, &vtbl_utf16le_wchar, &vtbl_wchar_utf16le }; diff --git a/ext/mbstring/libmbfl/filters/mbfilter_utf32.c b/ext/mbstring/libmbfl/filters/mbfilter_utf32.c index a9a7903b5db7a..e56a728ddc812 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_utf32.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_utf32.c @@ -40,7 +40,7 @@ const mbfl_encoding mbfl_encoding_utf32 = { "UTF-32", mbfl_encoding_utf32_aliases, NULL, - MBFL_ENCTYPE_WCS4BE, + MBFL_ENCTYPE_WCS4, &vtbl_utf32_wchar, &vtbl_wchar_utf32 }; @@ -51,7 +51,7 @@ const mbfl_encoding mbfl_encoding_utf32be = { "UTF-32BE", NULL, NULL, - MBFL_ENCTYPE_WCS4BE, + MBFL_ENCTYPE_WCS4, &vtbl_utf32be_wchar, &vtbl_wchar_utf32be }; @@ -62,7 +62,7 @@ const mbfl_encoding mbfl_encoding_utf32le = { "UTF-32LE", NULL, NULL, - MBFL_ENCTYPE_WCS4LE, + MBFL_ENCTYPE_WCS4, &vtbl_utf32le_wchar, &vtbl_wchar_utf32le }; diff --git a/ext/mbstring/libmbfl/filters/mbfilter_utf8_mobile.c b/ext/mbstring/libmbfl/filters/mbfilter_utf8_mobile.c index 763ed90fabd4e..b30a1c684fcd0 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_utf8_mobile.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_utf8_mobile.c @@ -294,7 +294,7 @@ int mbfl_filt_conv_wchar_utf8_mobile(int c, mbfl_convert_filter *filter) c = c1; } - if (filter->status == 1 && filter->cache > 0) { + if (filter->status) { return c; } diff --git a/ext/mbstring/libmbfl/filters/unicode_table_jis.h b/ext/mbstring/libmbfl/filters/unicode_table_jis.h index 3236578f9b185..04e6a63b9e274 100644 --- a/ext/mbstring/libmbfl/filters/unicode_table_jis.h +++ b/ext/mbstring/libmbfl/filters/unicode_table_jis.h @@ -2303,7 +2303,7 @@ const unsigned short ucs_a1_jis_table[] = { 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0xA2C2,0x2171,0x2172,0xA2F0,0x0000,0xA2C3,0x2178, - 0x212F,0xA2ED,0xA2EC,0x0000,0x224C,0x0000,0xA2EE,0xA2B4, + 0x212F,0xA2ED,0xA2EC,0x0000,0x224C,0x0000,0xA2EE,0x2131, 0x216B,0x215E,0x0000,0x0000,0x212D,0x0000,0x2279,0x0000, 0xA2B1,0x0000,0xA2EB,0x0000,0x0000,0x0000,0x0000,0xA2C4, 0xAAA2,0xAAA1,0xAAA4,0xAAAA,0xAAA3,0xAAA9,0xA9A1,0xAAAE, @@ -2444,7 +2444,7 @@ const unsigned short ucs_a2_jis_table[] = { 0x2277,0x2278,0x0000,0x0000,0x0000,0x2145,0x2144,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x2273,0x0000,0x216C,0x216D,0x0000,0x0000,0x0000,0x0000, - 0x0000,0x0000,0x0000,0x2228,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x2228,0x0000,0x0000,0x2131,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, @@ -5824,7 +5824,7 @@ const unsigned short ucs_r_jis_table[] = { 0x212E,0x2361,0x2362,0x2363,0x2364,0x2365,0x2366,0x2367, 0x2368,0x2369,0x236A,0x236B,0x236C,0x236D,0x236E,0x236F, 0x2370,0x2371,0x2372,0x2373,0x2374,0x2375,0x2376,0x2377, - 0x2378,0x2379,0x237A,0x2150,0x2143,0x2151,0x0000,0x0000, + 0x2378,0x2379,0x237A,0x2150,0x2143,0x2151,0x2141,0x0000, 0x0000,0x00A1,0x00A2,0x00A3,0x00A4,0x00A5,0x00A6,0x00A7, 0x00A8,0x00A9,0x00AA,0x00AB,0x00AC,0x00AD,0x00AE,0x00AF, 0x00B0,0x00B1,0x00B2,0x00B3,0x00B4,0x00B5,0x00B6,0x00B7, diff --git a/ext/mbstring/libmbfl/filters/unicode_table_jis2004.h b/ext/mbstring/libmbfl/filters/unicode_table_jis2004.h index 01afcc1f2d9f4..09f7c43726178 100644 --- a/ext/mbstring/libmbfl/filters/unicode_table_jis2004.h +++ b/ext/mbstring/libmbfl/filters/unicode_table_jis2004.h @@ -1608,11 +1608,11 @@ static const unsigned short ucs_a1_jisx0213_table[] = { // 0x0000 - 0x045f 0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047, 0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F, 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057, -0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F, +0x0058,0x0059,0x005A,0x005B,0x2140,0x005D,0x005E,0x005F, 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067, 0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F, 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077, -0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F, +0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x2141,0x007F, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, diff --git a/ext/mbstring/libmbfl/mbfl/mbfilter.c b/ext/mbstring/libmbfl/mbfl/mbfilter.c index a20960f92651c..190478657603e 100644 --- a/ext/mbstring/libmbfl/mbfl/mbfilter.c +++ b/ext/mbstring/libmbfl/mbfl/mbfilter.c @@ -484,9 +484,9 @@ mbfl_strlen(const mbfl_string *string) len = 0; if (encoding->flag & MBFL_ENCTYPE_SBCS) { len = string->len; - } else if (encoding->flag & (MBFL_ENCTYPE_WCS2BE | MBFL_ENCTYPE_WCS2LE)) { + } else if (encoding->flag & MBFL_ENCTYPE_WCS2) { len = string->len/2; - } else if (encoding->flag & (MBFL_ENCTYPE_WCS4BE | MBFL_ENCTYPE_WCS4LE)) { + } else if (encoding->flag & MBFL_ENCTYPE_WCS4) { len = string->len/4; } else if (encoding->mblen_table != NULL) { const unsigned char *mbtab = encoding->mblen_table; @@ -837,14 +837,14 @@ mbfl_substr( mbfl_string_init(result); result->encoding = string->encoding; - if ((encoding->flag & (MBFL_ENCTYPE_SBCS | MBFL_ENCTYPE_WCS2BE | MBFL_ENCTYPE_WCS2LE | MBFL_ENCTYPE_WCS4BE | MBFL_ENCTYPE_WCS4LE)) || + if ((encoding->flag & (MBFL_ENCTYPE_SBCS | MBFL_ENCTYPE_WCS2 | MBFL_ENCTYPE_WCS4)) || encoding->mblen_table != NULL) { len = string->len; if (encoding->flag & MBFL_ENCTYPE_SBCS) { start = from; - } else if (encoding->flag & (MBFL_ENCTYPE_WCS2BE | MBFL_ENCTYPE_WCS2LE)) { + } else if (encoding->flag & MBFL_ENCTYPE_WCS2) { start = from*2; - } else if (encoding->flag & (MBFL_ENCTYPE_WCS4BE | MBFL_ENCTYPE_WCS4LE)) { + } else if (encoding->flag & MBFL_ENCTYPE_WCS4) { start = from*4; } else { const unsigned char *mbtab = encoding->mblen_table; @@ -869,9 +869,9 @@ mbfl_substr( end = len; } else if (encoding->flag & MBFL_ENCTYPE_SBCS) { end = start + length; - } else if (encoding->flag & (MBFL_ENCTYPE_WCS2BE | MBFL_ENCTYPE_WCS2LE)) { + } else if (encoding->flag & MBFL_ENCTYPE_WCS2) { end = start + length*2; - } else if (encoding->flag & (MBFL_ENCTYPE_WCS4BE | MBFL_ENCTYPE_WCS4LE)) { + } else if (encoding->flag & MBFL_ENCTYPE_WCS4) { end = start + length*4; } else { const unsigned char *mbtab = encoding->mblen_table; @@ -984,18 +984,13 @@ mbfl_strcut( mbfl_string_init(result); result->encoding = string->encoding; - if ((encoding->flag & (MBFL_ENCTYPE_SBCS - | MBFL_ENCTYPE_WCS2BE - | MBFL_ENCTYPE_WCS2LE - | MBFL_ENCTYPE_WCS4BE - | MBFL_ENCTYPE_WCS4LE)) - || encoding->mblen_table != NULL) { + if ((encoding->flag & (MBFL_ENCTYPE_SBCS | MBFL_ENCTYPE_WCS2 | MBFL_ENCTYPE_WCS4)) || encoding->mblen_table != NULL) { const unsigned char *start = NULL; const unsigned char *end = NULL; unsigned char *w; size_t sz; - if (encoding->flag & (MBFL_ENCTYPE_WCS2BE | MBFL_ENCTYPE_WCS2LE)) { + if (encoding->flag & MBFL_ENCTYPE_WCS2) { from &= -2; if (length >= string->len - from) { @@ -1004,7 +999,7 @@ mbfl_strcut( start = string->val + from; end = start + (length & -2); - } else if (encoding->flag & (MBFL_ENCTYPE_WCS4BE | MBFL_ENCTYPE_WCS4LE)) { + } else if (encoding->flag & MBFL_ENCTYPE_WCS4) { from &= -4; if (length >= string->len - from) { diff --git a/ext/mbstring/libmbfl/mbfl/mbfilter_wchar.c b/ext/mbstring/libmbfl/mbfl/mbfilter_wchar.c index f69e70a64a423..a2b22c9105acc 100644 --- a/ext/mbstring/libmbfl/mbfl/mbfilter_wchar.c +++ b/ext/mbstring/libmbfl/mbfl/mbfilter_wchar.c @@ -38,7 +38,7 @@ const mbfl_encoding mbfl_encoding_wchar = { NULL, NULL, NULL, - MBFL_ENCTYPE_WCS4BE, + MBFL_ENCTYPE_WCS4, NULL, NULL }; diff --git a/ext/mbstring/libmbfl/mbfl/mbfl_consts.h b/ext/mbstring/libmbfl/mbfl/mbfl_consts.h index 0f57310d5e11f..137cd0fcb8993 100644 --- a/ext/mbstring/libmbfl/mbfl/mbfl_consts.h +++ b/ext/mbstring/libmbfl/mbfl/mbfl_consts.h @@ -33,12 +33,9 @@ #define MBFL_ENCTYPE_SBCS 0x00000001 /* single-byte encoding */ #define MBFL_ENCTYPE_MBCS 0x00000002 /* multi-byte encoding */ -#define MBFL_ENCTYPE_WCS2BE 0x00000010 /* 2 bytes/char, big endian */ -#define MBFL_ENCTYPE_WCS2LE 0x00000020 /* 2 bytes/char, little endian */ -#define MBFL_ENCTYPE_MWC2BE 0x00000040 /* 2+ bytes/char, big endian */ -#define MBFL_ENCTYPE_MWC2LE 0x00000080 /* 2+ bytes/char, little endian */ -#define MBFL_ENCTYPE_WCS4BE 0x00000100 /* 4 bytes/char, big endian */ -#define MBFL_ENCTYPE_WCS4LE 0x00000200 /* 4 bytes/char, little endian */ +#define MBFL_ENCTYPE_WCS2 0x00000010 /* 2 bytes/char */ +#define MBFL_ENCTYPE_MWC2 0x00000040 /* 2+ bytes/char */ +#define MBFL_ENCTYPE_WCS4 0x00000100 /* 4 bytes/char */ #define MBFL_ENCTYPE_GL_UNSAFE 0x00004000 /* wchar plane, special character */ diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index 6d5541f073f81..dd3b83649d36d 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -1714,10 +1714,10 @@ PHP_FUNCTION(mb_str_split) if (mbfl_encoding->flag & MBFL_ENCTYPE_SBCS) { /* 1 byte */ mb_len = string.len; chunk_len = (size_t)split_length; /* chunk length in bytes */ - } else if (mbfl_encoding->flag & (MBFL_ENCTYPE_WCS2BE | MBFL_ENCTYPE_WCS2LE)) { /* 2 bytes */ + } else if (mbfl_encoding->flag & MBFL_ENCTYPE_WCS2) { /* 2 bytes */ mb_len = string.len / 2; chunk_len = split_length * 2; - } else if (mbfl_encoding->flag & (MBFL_ENCTYPE_WCS4BE | MBFL_ENCTYPE_WCS4LE)) { /* 4 bytes */ + } else if (mbfl_encoding->flag & MBFL_ENCTYPE_WCS4) { /* 4 bytes */ mb_len = string.len / 4; chunk_len = split_length * 4; } else if (mbfl_encoding->mblen_table != NULL) { @@ -4215,9 +4215,9 @@ MBSTRING_API size_t php_mb_mbchar_bytes_ex(const char *s, const mbfl_encoding *e if (enc->mblen_table != NULL) { if (s != NULL) return enc->mblen_table[*(unsigned char *)s]; } - } else if (enc->flag & (MBFL_ENCTYPE_WCS2BE | MBFL_ENCTYPE_WCS2LE)) { + } else if (enc->flag & MBFL_ENCTYPE_WCS2) { return 2; - } else if (enc->flag & (MBFL_ENCTYPE_WCS4BE | MBFL_ENCTYPE_WCS4LE)) { + } else if (enc->flag & MBFL_ENCTYPE_WCS4) { return 4; } } diff --git a/ext/mbstring/tests/cp51932_encoding.phpt b/ext/mbstring/tests/cp51932_encoding.phpt new file mode 100644 index 0000000000000..bf7b60bcc3421 --- /dev/null +++ b/ext/mbstring/tests/cp51932_encoding.phpt @@ -0,0 +1,111 @@ +--TEST-- +Exhaustive test of CP51932 encoding verification and conversion +--SKIPIF-- + +--FILE-- + UTF-16BE string */ +$fromUnicode = array(); + +$fp = fopen(realpath(__DIR__ . '/data/CP51932.txt'), 'r+'); +while ($line = fgets($fp, 256)) { + if ($line[0] == '#') + continue; + + $byte2 = null; + if (sscanf($line, ' \x%x\x%x', $codepoint, $byte1, $byte2) >= 2) { + /* The table we are using tries to map as many Unicode codepoints into + * CP51932 as possible, including by mapping latin characters with accents + * to the equivalent without accents; but since CP51932 is based on the + * CP932 character set, we don't need to handle codepoints which are not + * mapped from any character in CP932 */ + if (($codepoint >= 0xC0 && $codepoint <= 0xD6) || + ($codepoint >= 0xD8 && $codepoint <= 0xF6) || + ($codepoint >= 0xF8 && $codepoint <= 0xFF)) + continue; + $cp51932 = ($byte2 ? (chr($byte1) . chr($byte2)) : chr($byte1)); + $utf16 = pack('n', $codepoint); + $validChars[$cp51932] = $utf16; + $fromUnicode[$utf16] = $cp51932; + } +} + +/* We map the JIS X 0208 FULLWIDTH TILDE to U+FF5E (FULLWIDTH TILDE) + * But when converting Unicode to CP51932, we also accept U+301C (WAVE DASH) */ +$fromUnicode["\x30\x1C"] = "\xA1\xC1"; +/* We map the JIS X 0208 MINUS SIGN to U+FF0D (FULLWIDTH HYPHEN-MINUS SIGN), + * but when converting Unicode to CP51932, we also accept U+2212 (MINUS SIGN) */ +$fromUnicode["\x22\x12"] = "\xA1\xDD"; +/* We map the JIS X 0208 PARALLEL TO symbol to U+2225 (PARALLEL TO), + * but when converting Unicode to CP51932, we also accept U+2016 + * (DOUBLE VERTICAL LINE) */ +$fromUnicode["\x20\x16"] = "\xA1\xC2"; + +/* There are a number of duplicate, irreversible mappings in the CP51932 table + * In most cases, the one which we primarily use appears last in the table, + * but in some cases, it is first and will be overwritten in the above loop + * + * Interestingly, the "collisions" happen in both directions! Part of this is + * because the table we are using attempts to map as many Unicode codepoints + * as possible to CP932 characters */ +$fromUnicode["\x22\x20"] = "\xA2\xDC"; +$fromUnicode["\x22\x29"] = "\xA2\xC1"; +$fromUnicode["\x22\x2B"] = "\xA2\xE9"; +$fromUnicode["\x22\x35"] = "\xA2\xE8"; +$fromUnicode["\x22\x1A"] = "\xA2\xE5"; +$fromUnicode["\x22\x2A"] = "\xA2\xC0"; +$fromUnicode["\x22\x61"] = "\xA2\xE1"; +$fromUnicode["\x22\xA5"] = "\xA2\xDD"; +$fromUnicode["\x22\x52"] = "\xA2\xE2"; +$fromUnicode["\xFF\xE2"] = "\xA2\xCC"; +unset($fromUnicode["\x00\xA1"]); // Don't map upside-down ! to ordinary ! +unset($fromUnicode["\x00\xA6"]); // Don't map broken bar to ordinary pipe character +unset($fromUnicode["\x00\xA9"]); // Don't map © to c +unset($fromUnicode["\x00\xAA"]); // Don't map feminine ordinal indicator +unset($fromUnicode["\x00\xAB"]); // Don't map left double angled quote mark to "much less than" +unset($fromUnicode["\x00\xAD"]); // Don't map soft hyphen to ordinary hyphen +unset($fromUnicode["\x00\xAE"]); // Don't map ® to R +unset($fromUnicode["\x00\xAF"]); // Don't map Unicode halfwidth macron to CP932 fullwidth macron +unset($fromUnicode["\x00\xB2"]); // Don't map ² to ordinary 2 +unset($fromUnicode["\x00\xB3"]); // Don't map ³ to ordinary 3 +unset($fromUnicode["\x00\xB5"]); // Don't map micro sign to Greek mu +unset($fromUnicode["\x00\xB7"]); // Don't map middle dot to katakana middle dot +unset($fromUnicode["\x00\xB8"]); // Don't map cedilla to fullwidth comma +unset($fromUnicode["\x00\xB9"]); // Don't map ¹ to ordinary 1 +unset($fromUnicode["\x00\xBA"]); // Don't map "masculine ordinal indicator" +unset($fromUnicode["\x00\xBB"]); // Don't map right double angled quote mark to "much greater than" +unset($fromUnicode["\x30\x94"]); // Don't map hiragana vu to katakana vu + +for ($i = 0; $i <= 0x7F; $i++) + $validChars[chr($i)] = "\x00" . chr($i); + +/* U+00A5 is YEN SIGN; convert to FULLWIDTH YEN SIGN */ +$fromUnicode["\x00\xA5"] = "\xA1\xEF"; +/* U+203E is OVERLINE; convert to FULLWIDTH MACRON */ +$fromUnicode["\x20\x3E"] = "\xA1\xB1"; +/* U+00AF is MACRON; convert to FULLWIDTH MACRON */ +$fromUnicode["\x00\xAF"] = "\xA1\xB1"; + +testAllValidChars($validChars, 'CP51932', 'UTF-16BE', false); +testAllValidChars($fromUnicode, 'UTF-16BE', 'CP51932', false); +echo "CP51932 verification and conversion works on all valid characters\n"; + +findInvalidChars($validChars, $invalidChars, $truncated, array_fill_keys(range(0xA9, 0xAF), 2) + array_fill_keys(range(0xF5, 0xF8), 2) + array(0xFD => 2, 0xFE => 2)); + +testAllInvalidChars($invalidChars, $validChars, 'CP51932', 'UTF-16BE', "\x00%"); +testTruncatedChars($truncated, 'CP51932', 'UTF-16BE', "\x00%"); +echo "CP51932 verification and conversion works on all invalid characters\n"; + +findInvalidChars($fromUnicode, $invalidCodepoints, $unused, array_fill_keys(range(0, 0xFF), 2)); +convertAllInvalidChars($invalidCodepoints, $fromUnicode, 'UTF-16BE', 'CP51932', '%'); +echo "Unicode -> CP51932 conversion works on all invalid codepoints\n"; +?> +--EXPECT-- +CP51932 verification and conversion works on all valid characters +CP51932 verification and conversion works on all invalid characters +Unicode -> CP51932 conversion works on all invalid codepoints diff --git a/ext/mbstring/tests/cp932_encoding.phpt b/ext/mbstring/tests/cp932_encoding.phpt new file mode 100644 index 0000000000000..b426281f24297 --- /dev/null +++ b/ext/mbstring/tests/cp932_encoding.phpt @@ -0,0 +1,108 @@ +--TEST-- +Exhaustive test of CP932 encoding verification and conversion +--SKIPIF-- + +--FILE-- + $unicode) + testValidString($cp932, $unicode, 'CP932', 'UTF-16BE', false); +echo "CP932 verification and conversion works on all valid characters\n"; + +testAllInvalidChars($invalidChars, $validChars, 'CP932', 'UTF-16BE', "\x00%"); +echo "CP932 verification and conversion works on all invalid characters\n"; + +convertAllInvalidChars($invalidCodepoints, $fromUnicode, 'UTF-16BE', 'CP932', '%'); +echo "Unicode -> CP932 conversion works on all invalid codepoints\n"; +?> +--EXPECT-- +CP932 verification and conversion works on all valid characters +CP932 verification and conversion works on all invalid characters +Unicode -> CP932 conversion works on all invalid codepoints diff --git a/ext/mbstring/tests/data/CP51932.txt b/ext/mbstring/tests/data/CP51932.txt new file mode 100644 index 0000000000000..7dc3aad86c88e --- /dev/null +++ b/ext/mbstring/tests/data/CP51932.txt @@ -0,0 +1,7613 @@ +# +# cp51932 - Microsoft Windows Codepage 51932 (EUC - Japanese) + \x00 |0 # NULL + \x01 |0 # START OF HEADING + \x02 |0 # START OF TEXT + \x03 |0 # END OF TEXT + \x04 |0 # END OF TRANSMISSION + \x05 |0 # ENQUIRY + \x06 |0 # ACKNOWLEDGE + \x07 |0 # BELL + \x08 |0 # BACKSPACE + \x09 |0 # HORIZONTAL TABULATION + \x0A |0 # LINE FEED + \x0B |0 # VERTICAL TABULATION + \x0C |0 # FORM FEED + \x0D |0 # CARRIAGE RETURN + \x0E |0 # SHIFT OUT + \x0F |0 # SHIFT IN + \x10 |0 # DATA LINK ESCAPE + \x11 |0 # DEVICE CONTROL ONE + \x12 |0 # DEVICE CONTROL TWO + \x13 |0 # DEVICE CONTROL THREE + \x14 |0 # DEVICE CONTROL FOUR + \x15 |0 # NEGATIVE ACKNOWLEDGE + \x16 |0 # SYNCHRONOUS IDLE + \x17 |0 # END OF TRANSMISSION BLOCK + \x18 |0 # CANCEL + \x19 |0 # END OF MEDIUM + \x1A |0 # SUBSTITUTE + \x1B |0 # ESCAPE + \x1C |0 # FILE SEPARATOR + \x1D |0 # GROUP SEPARATOR + \x1E |0 # RECORD SEPARATOR + \x1F |0 # UNIT SEPARATOR + \x20 |0 # SPACE + \x21 |0 # EXCLAMATION MARK + \x22 |0 # QUOTATION MARK + \x23 |0 # NUMBER SIGN + \x24 |0 # DOLLAR SIGN + \x25 |0 # PERCENT SIGN + \x26 |0 # AMPERSAND + \x27 |0 # APOSTROPHE + \x28 |0 # LEFT PARENTHESIS + \x29 |0 # RIGHT PARENTHESIS + \x2A |0 # ASTERISK + \x2B |0 # PLUS SIGN + \x2C |0 # COMMA + \x2D |0 # HYPHEN-MINUS + \x2E |0 # FULL STOP + \x2F |0 # SOLIDUS + \x30 |0 # DIGIT ZERO + \x31 |0 # DIGIT ONE + \x32 |0 # DIGIT TWO + \x33 |0 # DIGIT THREE + \x34 |0 # DIGIT FOUR + \x35 |0 # DIGIT FIVE + \x36 |0 # DIGIT SIX + \x37 |0 # DIGIT SEVEN + \x38 |0 # DIGIT EIGHT + \x39 |0 # DIGIT NINE + \x3A |0 # COLON + \x3B |0 # SEMICOLON + \x3C |0 # LESS-THAN SIGN + \x3D |0 # EQUALS SIGN + \x3E |0 # GREATER-THAN SIGN + \x3F |0 # QUESTION MARK + \x40 |0 # COMMERCIAL AT + \x41 |0 # LATIN CAPITAL LETTER A + \x42 |0 # LATIN CAPITAL LETTER B + \x43 |0 # LATIN CAPITAL LETTER C + \x44 |0 # LATIN CAPITAL LETTER D + \x45 |0 # LATIN CAPITAL LETTER E + \x46 |0 # LATIN CAPITAL LETTER F + \x47 |0 # LATIN CAPITAL LETTER G + \x48 |0 # LATIN CAPITAL LETTER H + \x49 |0 # LATIN CAPITAL LETTER I + \x4A |0 # LATIN CAPITAL LETTER J + \x4B |0 # LATIN CAPITAL LETTER K + \x4C |0 # LATIN CAPITAL LETTER L + \x4D |0 # LATIN CAPITAL LETTER M + \x4E |0 # LATIN CAPITAL LETTER N + \x4F |0 # LATIN CAPITAL LETTER O + \x50 |0 # LATIN CAPITAL LETTER P + \x51 |0 # LATIN CAPITAL LETTER Q + \x52 |0 # LATIN CAPITAL LETTER R + \x53 |0 # LATIN CAPITAL LETTER S + \x54 |0 # LATIN CAPITAL LETTER T + \x55 |0 # LATIN CAPITAL LETTER U + \x56 |0 # LATIN CAPITAL LETTER V + \x57 |0 # LATIN CAPITAL LETTER W + \x58 |0 # LATIN CAPITAL LETTER X + \x59 |0 # LATIN CAPITAL LETTER Y + \x5A |0 # LATIN CAPITAL LETTER Z + \x5B |0 # LEFT SQUARE BRACKET + \x5C |0 # REVERSE SOLIDUS + \x5D |0 # RIGHT SQUARE BRACKET + \x5E |0 # CIRCUMFLEX ACCENT + \x5F |0 # LOW LINE + \x60 |0 # GRAVE ACCENT + \x61 |0 # LATIN SMALL LETTER A + \x62 |0 # LATIN SMALL LETTER B + \x63 |0 # LATIN SMALL LETTER C + \x64 |0 # LATIN SMALL LETTER D + \x65 |0 # LATIN SMALL LETTER E + \x66 |0 # LATIN SMALL LETTER F + \x67 |0 # LATIN SMALL LETTER G + \x68 |0 # LATIN SMALL LETTER H + \x69 |0 # LATIN SMALL LETTER I + \x6A |0 # LATIN SMALL LETTER J + \x6B |0 # LATIN SMALL LETTER K + \x6C |0 # LATIN SMALL LETTER L + \x6D |0 # LATIN SMALL LETTER M + \x6E |0 # LATIN SMALL LETTER N + \x6F |0 # LATIN SMALL LETTER O + \x70 |0 # LATIN SMALL LETTER P + \x71 |0 # LATIN SMALL LETTER Q + \x72 |0 # LATIN SMALL LETTER R + \x73 |0 # LATIN SMALL LETTER S + \x74 |0 # LATIN SMALL LETTER T + \x75 |0 # LATIN SMALL LETTER U + \x76 |0 # LATIN SMALL LETTER V + \x77 |0 # LATIN SMALL LETTER W + \x78 |0 # LATIN SMALL LETTER X + \x79 |0 # LATIN SMALL LETTER Y + \x7A |0 # LATIN SMALL LETTER Z + \x7B |0 # LEFT CURLY BRACKET + \x7C |0 # VERTICAL LINE + \x7D |0 # RIGHT CURLY BRACKET + \x7E |0 # TILDE + \x7F |0 # DELETE + \x21 |1 # INVERTED EXCLAMATION MARK + \xA1\xF1 |1 # CENT SIGN + \xA1\xF2 |1 # POUND SIGN + \x5C |1 # YEN SIGN + \x7C |1 # BROKEN BAR + \xA1\xF8 |0 # SECTION SIGN + \xA1\xAF |0 # DIAERESIS + \x63 |1 # COPYRIGHT SIGN + \x61 |1 # FEMININE ORDINAL INDICATOR + \xA2\xE3 |1 # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + \xA2\xCC |1 # NOT SIGN + \x2D |1 # SOFT HYPHEN + \x52 |1 # REGISTERED SIGN + \xA1\xB1 |1 # MACRON + \xA1\xEB |0 # DEGREE SIGN + \xA1\xDE |0 # PLUS-MINUS SIGN + \x32 |1 # SUPERSCRIPT TWO + \x33 |1 # SUPERSCRIPT THREE + \xA1\xAD |0 # ACUTE ACCENT + \xA6\xCC |1 # MICRO SIGN + \xA2\xF9 |0 # PILCROW SIGN + \xA1\xA6 |1 # MIDDLE DOT + \xA1\xA4 |1 # CEDILLA + \x31 |1 # SUPERSCRIPT ONE + \x6F |1 # MASCULINE ORDINAL INDICATOR + \xA2\xE4 |1 # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + \x41 |1 # LATIN CAPITAL LETTER A WITH GRAVE + \x41 |1 # LATIN CAPITAL LETTER A WITH ACUTE + \x41 |1 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX + \x41 |1 # LATIN CAPITAL LETTER A WITH TILDE + \x41 |1 # LATIN CAPITAL LETTER A WITH DIAERESIS + \x41 |1 # LATIN CAPITAL LETTER A WITH RING ABOVE + \x41 |1 # LATIN CAPITAL LETTER AE + \x43 |1 # LATIN CAPITAL LETTER C WITH CEDILLA + \x45 |1 # LATIN CAPITAL LETTER E WITH GRAVE + \x45 |1 # LATIN CAPITAL LETTER E WITH ACUTE + \x45 |1 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX + \x45 |1 # LATIN CAPITAL LETTER E WITH DIAERESIS + \x49 |1 # LATIN CAPITAL LETTER I WITH GRAVE + \x49 |1 # LATIN CAPITAL LETTER I WITH ACUTE + \x49 |1 # LATIN CAPITAL LETTER I WITH CIRCUMFLEX + \x49 |1 # LATIN CAPITAL LETTER I WITH DIAERESIS + \x44 |1 # LATIN CAPITAL LETTER ETH + \x4E |1 # LATIN CAPITAL LETTER N WITH TILDE + \x4F |1 # LATIN CAPITAL LETTER O WITH GRAVE + \x4F |1 # LATIN CAPITAL LETTER O WITH ACUTE + \x4F |1 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX + \x4F |1 # LATIN CAPITAL LETTER O WITH TILDE + \x4F |1 # LATIN CAPITAL LETTER O WITH DIAERESIS + \xA1\xDF |0 # MULTIPLICATION SIGN + \x4F |1 # LATIN CAPITAL LETTER O WITH STROKE + \x55 |1 # LATIN CAPITAL LETTER U WITH GRAVE + \x55 |1 # LATIN CAPITAL LETTER U WITH ACUTE + \x55 |1 # LATIN CAPITAL LETTER U WITH CIRCUMFLEX + \x55 |1 # LATIN CAPITAL LETTER U WITH DIAERESIS + \x59 |1 # LATIN CAPITAL LETTER Y WITH ACUTE + \x54 |1 # LATIN CAPITAL LETTER THORN + \x73 |1 # LATIN SMALL LETTER SHARP S + \x61 |1 # LATIN SMALL LETTER A WITH GRAVE + \x61 |1 # LATIN SMALL LETTER A WITH ACUTE + \x61 |1 # LATIN SMALL LETTER A WITH CIRCUMFLEX + \x61 |1 # LATIN SMALL LETTER A WITH TILDE + \x61 |1 # LATIN SMALL LETTER A WITH DIAERESIS + \x61 |1 # LATIN SMALL LETTER A WITH RING ABOVE + \x61 |1 # LATIN SMALL LETTER AE + \x63 |1 # LATIN SMALL LETTER C WITH CEDILLA + \x65 |1 # LATIN SMALL LETTER E WITH GRAVE + \x65 |1 # LATIN SMALL LETTER E WITH ACUTE + \x65 |1 # LATIN SMALL LETTER E WITH CIRCUMFLEX + \x65 |1 # LATIN SMALL LETTER E WITH DIAERESIS + \x69 |1 # LATIN SMALL LETTER I WITH GRAVE + \x69 |1 # LATIN SMALL LETTER I WITH ACUTE + \x69 |1 # LATIN SMALL LETTER I WITH CIRCUMFLEX + \x69 |1 # LATIN SMALL LETTER I WITH DIAERESIS + \x64 |1 # LATIN SMALL LETTER ETH + \x6E |1 # LATIN SMALL LETTER N WITH TILDE + \x6F |1 # LATIN SMALL LETTER O WITH GRAVE + \x6F |1 # LATIN SMALL LETTER O WITH ACUTE + \x6F |1 # LATIN SMALL LETTER O WITH CIRCUMFLEX + \x6F |1 # LATIN SMALL LETTER O WITH TILDE + \x6F |1 # LATIN SMALL LETTER O WITH DIAERESIS + \xA1\xE0 |0 # DIVISION SIGN + \x6F |1 # LATIN SMALL LETTER O WITH STROKE + \x75 |1 # LATIN SMALL LETTER U WITH GRAVE + \x75 |1 # LATIN SMALL LETTER U WITH ACUTE + \x75 |1 # LATIN SMALL LETTER U WITH CIRCUMFLEX + \x75 |1 # LATIN SMALL LETTER U WITH DIAERESIS + \x79 |1 # LATIN SMALL LETTER Y WITH ACUTE + \x74 |1 # LATIN SMALL LETTER THORN + \x79 |1 # LATIN SMALL LETTER Y WITH DIAERESIS + \xA6\xA1 |0 # GREEK CAPITAL LETTER ALPHA + \xA6\xA2 |0 # GREEK CAPITAL LETTER BETA + \xA6\xA3 |0 # GREEK CAPITAL LETTER GAMMA + \xA6\xA4 |0 # GREEK CAPITAL LETTER DELTA + \xA6\xA5 |0 # GREEK CAPITAL LETTER EPSILON + \xA6\xA6 |0 # GREEK CAPITAL LETTER ZETA + \xA6\xA7 |0 # GREEK CAPITAL LETTER ETA + \xA6\xA8 |0 # GREEK CAPITAL LETTER THETA + \xA6\xA9 |0 # GREEK CAPITAL LETTER IOTA + \xA6\xAA |0 # GREEK CAPITAL LETTER KAPPA + \xA6\xAB |0 # GREEK CAPITAL LETTER LAMDA + \xA6\xAC |0 # GREEK CAPITAL LETTER MU + \xA6\xAD |0 # GREEK CAPITAL LETTER NU + \xA6\xAE |0 # GREEK CAPITAL LETTER XI + \xA6\xAF |0 # GREEK CAPITAL LETTER OMICRON + \xA6\xB0 |0 # GREEK CAPITAL LETTER PI + \xA6\xB1 |0 # GREEK CAPITAL LETTER RHO + \xA6\xB2 |0 # GREEK CAPITAL LETTER SIGMA + \xA6\xB3 |0 # GREEK CAPITAL LETTER TAU + \xA6\xB4 |0 # GREEK CAPITAL LETTER UPSILON + \xA6\xB5 |0 # GREEK CAPITAL LETTER PHI + \xA6\xB6 |0 # GREEK CAPITAL LETTER CHI + \xA6\xB7 |0 # GREEK CAPITAL LETTER PSI + \xA6\xB8 |0 # GREEK CAPITAL LETTER OMEGA + \xA6\xC1 |0 # GREEK SMALL LETTER ALPHA + \xA6\xC2 |0 # GREEK SMALL LETTER BETA + \xA6\xC3 |0 # GREEK SMALL LETTER GAMMA + \xA6\xC4 |0 # GREEK SMALL LETTER DELTA + \xA6\xC5 |0 # GREEK SMALL LETTER EPSILON + \xA6\xC6 |0 # GREEK SMALL LETTER ZETA + \xA6\xC7 |0 # GREEK SMALL LETTER ETA + \xA6\xC8 |0 # GREEK SMALL LETTER THETA + \xA6\xC9 |0 # GREEK SMALL LETTER IOTA + \xA6\xCA |0 # GREEK SMALL LETTER KAPPA + \xA6\xCB |0 # GREEK SMALL LETTER LAMDA + \xA6\xCC |0 # GREEK SMALL LETTER MU + \xA6\xCD |0 # GREEK SMALL LETTER NU + \xA6\xCE |0 # GREEK SMALL LETTER XI + \xA6\xCF |0 # GREEK SMALL LETTER OMICRON + \xA6\xD0 |0 # GREEK SMALL LETTER PI + \xA6\xD1 |0 # GREEK SMALL LETTER RHO + \xA6\xD2 |0 # GREEK SMALL LETTER SIGMA + \xA6\xD3 |0 # GREEK SMALL LETTER TAU + \xA6\xD4 |0 # GREEK SMALL LETTER UPSILON + \xA6\xD5 |0 # GREEK SMALL LETTER PHI + \xA6\xD6 |0 # GREEK SMALL LETTER CHI + \xA6\xD7 |0 # GREEK SMALL LETTER PSI + \xA6\xD8 |0 # GREEK SMALL LETTER OMEGA + \xA7\xA7 |0 # CYRILLIC CAPITAL LETTER IO + \xA7\xA1 |0 # CYRILLIC CAPITAL LETTER A + \xA7\xA2 |0 # CYRILLIC CAPITAL LETTER BE + \xA7\xA3 |0 # CYRILLIC CAPITAL LETTER VE + \xA7\xA4 |0 # CYRILLIC CAPITAL LETTER GHE + \xA7\xA5 |0 # CYRILLIC CAPITAL LETTER DE + \xA7\xA6 |0 # CYRILLIC CAPITAL LETTER IE + \xA7\xA8 |0 # CYRILLIC CAPITAL LETTER ZHE + \xA7\xA9 |0 # CYRILLIC CAPITAL LETTER ZE + \xA7\xAA |0 # CYRILLIC CAPITAL LETTER I + \xA7\xAB |0 # CYRILLIC CAPITAL LETTER SHORT I + \xA7\xAC |0 # CYRILLIC CAPITAL LETTER KA + \xA7\xAD |0 # CYRILLIC CAPITAL LETTER EL + \xA7\xAE |0 # CYRILLIC CAPITAL LETTER EM + \xA7\xAF |0 # CYRILLIC CAPITAL LETTER EN + \xA7\xB0 |0 # CYRILLIC CAPITAL LETTER O + \xA7\xB1 |0 # CYRILLIC CAPITAL LETTER PE + \xA7\xB2 |0 # CYRILLIC CAPITAL LETTER ER + \xA7\xB3 |0 # CYRILLIC CAPITAL LETTER ES + \xA7\xB4 |0 # CYRILLIC CAPITAL LETTER TE + \xA7\xB5 |0 # CYRILLIC CAPITAL LETTER U + \xA7\xB6 |0 # CYRILLIC CAPITAL LETTER EF + \xA7\xB7 |0 # CYRILLIC CAPITAL LETTER HA + \xA7\xB8 |0 # CYRILLIC CAPITAL LETTER TSE + \xA7\xB9 |0 # CYRILLIC CAPITAL LETTER CHE + \xA7\xBA |0 # CYRILLIC CAPITAL LETTER SHA + \xA7\xBB |0 # CYRILLIC CAPITAL LETTER SHCHA + \xA7\xBC |0 # CYRILLIC CAPITAL LETTER HARD SIGN + \xA7\xBD |0 # CYRILLIC CAPITAL LETTER YERU + \xA7\xBE |0 # CYRILLIC CAPITAL LETTER SOFT SIGN + \xA7\xBF |0 # CYRILLIC CAPITAL LETTER E + \xA7\xC0 |0 # CYRILLIC CAPITAL LETTER YU + \xA7\xC1 |0 # CYRILLIC CAPITAL LETTER YA + \xA7\xD1 |0 # CYRILLIC SMALL LETTER A + \xA7\xD2 |0 # CYRILLIC SMALL LETTER BE + \xA7\xD3 |0 # CYRILLIC SMALL LETTER VE + \xA7\xD4 |0 # CYRILLIC SMALL LETTER GHE + \xA7\xD5 |0 # CYRILLIC SMALL LETTER DE + \xA7\xD6 |0 # CYRILLIC SMALL LETTER IE + \xA7\xD8 |0 # CYRILLIC SMALL LETTER ZHE + \xA7\xD9 |0 # CYRILLIC SMALL LETTER ZE + \xA7\xDA |0 # CYRILLIC SMALL LETTER I + \xA7\xDB |0 # CYRILLIC SMALL LETTER SHORT I + \xA7\xDC |0 # CYRILLIC SMALL LETTER KA + \xA7\xDD |0 # CYRILLIC SMALL LETTER EL + \xA7\xDE |0 # CYRILLIC SMALL LETTER EM + \xA7\xDF |0 # CYRILLIC SMALL LETTER EN + \xA7\xE0 |0 # CYRILLIC SMALL LETTER O + \xA7\xE1 |0 # CYRILLIC SMALL LETTER PE + \xA7\xE2 |0 # CYRILLIC SMALL LETTER ER + \xA7\xE3 |0 # CYRILLIC SMALL LETTER ES + \xA7\xE4 |0 # CYRILLIC SMALL LETTER TE + \xA7\xE5 |0 # CYRILLIC SMALL LETTER U + \xA7\xE6 |0 # CYRILLIC SMALL LETTER EF + \xA7\xE7 |0 # CYRILLIC SMALL LETTER HA + \xA7\xE8 |0 # CYRILLIC SMALL LETTER TSE + \xA7\xE9 |0 # CYRILLIC SMALL LETTER CHE + \xA7\xEA |0 # CYRILLIC SMALL LETTER SHA + \xA7\xEB |0 # CYRILLIC SMALL LETTER SHCHA + \xA7\xEC |0 # CYRILLIC SMALL LETTER HARD SIGN + \xA7\xED |0 # CYRILLIC SMALL LETTER YERU + \xA7\xEE |0 # CYRILLIC SMALL LETTER SOFT SIGN + \xA7\xEF |0 # CYRILLIC SMALL LETTER E + \xA7\xF0 |0 # CYRILLIC SMALL LETTER YU + \xA7\xF1 |0 # CYRILLIC SMALL LETTER YA + \xA7\xD7 |0 # CYRILLIC SMALL LETTER IO + \xA1\xBE |0 # HYPHEN + \xA1\xBD |0 # HORIZONTAL BAR + \xA1\xC6 |0 # LEFT SINGLE QUOTATION MARK + \xA1\xC7 |0 # RIGHT SINGLE QUOTATION MARK + \xA1\xC8 |0 # LEFT DOUBLE QUOTATION MARK + \xA1\xC9 |0 # RIGHT DOUBLE QUOTATION MARK + \xA2\xF7 |0 # DAGGER + \xA2\xF8 |0 # DOUBLE DAGGER + \xA1\xC5 |0 # TWO DOT LEADER + \xA1\xC4 |0 # HORIZONTAL ELLIPSIS + \xA2\xF3 |0 # PER MILLE SIGN + \xA1\xEC |0 # PRIME + \xA1\xED |0 # DOUBLE PRIME + \xA2\xA8 |0 # REFERENCE MARK + \xA1\xEE |0 # DEGREE CELSIUS + \xAD\xE2 |0 # NUMERO SIGN + \xAD\xE4 |0 # TELEPHONE SIGN + \xA2\xF2 |0 # ANGSTROM SIGN + \xAD\xB5 |0 # ROMAN NUMERAL ONE + \xAD\xB6 |0 # ROMAN NUMERAL TWO + \xAD\xB7 |0 # ROMAN NUMERAL THREE + \xAD\xB8 |0 # ROMAN NUMERAL FOUR + \xAD\xB9 |0 # ROMAN NUMERAL FIVE + \xAD\xBA |0 # ROMAN NUMERAL SIX + \xAD\xBB |0 # ROMAN NUMERAL SEVEN + \xAD\xBC |0 # ROMAN NUMERAL EIGHT + \xAD\xBD |0 # ROMAN NUMERAL NINE + \xAD\xBE |0 # ROMAN NUMERAL TEN + \xFC\xF1 |0 # SMALL ROMAN NUMERAL ONE + \xFC\xF2 |0 # SMALL ROMAN NUMERAL TWO + \xFC\xF3 |0 # SMALL ROMAN NUMERAL THREE + \xFC\xF4 |0 # SMALL ROMAN NUMERAL FOUR + \xFC\xF5 |0 # SMALL ROMAN NUMERAL FIVE + \xFC\xF6 |0 # SMALL ROMAN NUMERAL SIX + \xFC\xF7 |0 # SMALL ROMAN NUMERAL SEVEN + \xFC\xF8 |0 # SMALL ROMAN NUMERAL EIGHT + \xFC\xF9 |0 # SMALL ROMAN NUMERAL NINE + \xFC\xFA |0 # SMALL ROMAN NUMERAL TEN + \xA2\xAB |0 # LEFTWARDS ARROW + \xA2\xAC |0 # UPWARDS ARROW + \xA2\xAA |0 # RIGHTWARDS ARROW + \xA2\xAD |0 # DOWNWARDS ARROW + \xA2\xCD |0 # RIGHTWARDS DOUBLE ARROW + \xA2\xCE |0 # LEFT RIGHT DOUBLE ARROW + \xA2\xCF |0 # FOR ALL + \xA2\xDF |0 # PARTIAL DIFFERENTIAL + \xA2\xD0 |0 # THERE EXISTS + \xA2\xE0 |0 # NABLA + \xA2\xBA |0 # ELEMENT OF + \xA2\xBB |0 # CONTAINS AS MEMBER + \xAD\xF4 |0 # N-ARY SUMMATION + \xA2\xE5 |0 # SQUARE ROOT + \xAD\xF5 |3 # SQUARE ROOT + \xA2\xE7 |0 # PROPORTIONAL TO + \xA1\xE7 |0 # INFINITY + \xAD\xF8 |0 # RIGHT ANGLE + \xA2\xDC |0 # ANGLE + \xAD\xF7 |3 # ANGLE + \xA1\xC2 |0 # PARALLEL TO + \xA2\xCA |0 # LOGICAL AND + \xA2\xCB |0 # LOGICAL OR + \xA2\xC1 |0 # INTERSECTION + \xAD\xFB |3 # INTERSECTION + \xA2\xC0 |0 # UNION + \xAD\xFC |3 # UNION + \xA2\xE9 |0 # INTEGRAL + \xAD\xF2 |3 # INTEGRAL + \xA2\xEA |0 # DOUBLE INTEGRAL + \xAD\xF3 |0 # CONTOUR INTEGRAL + \xA1\xE8 |0 # THEREFORE + \xA2\xE8 |0 # BECAUSE + \xAD\xFA |3 # BECAUSE + \xA2\xE6 |0 # REVERSED TILDE + \xA2\xE2 |0 # APPROXIMATELY EQUAL TO OR THE IMAGE OF + \xAD\xF0 |3 # APPROXIMATELY EQUAL TO OR THE IMAGE OF + \xA1\xE2 |0 # NOT EQUAL TO + \xA2\xE1 |0 # IDENTICAL TO + \xAD\xF1 |3 # IDENTICAL TO + \xA1\xE5 |0 # LESS-THAN OVER EQUAL TO + \xA1\xE6 |0 # GREATER-THAN OVER EQUAL TO + \xA2\xE3 |0 # MUCH LESS-THAN + \xA2\xE4 |0 # MUCH GREATER-THAN + \xA2\xBE |0 # SUBSET OF + \xA2\xBF |0 # SUPERSET OF + \xA2\xBC |0 # SUBSET OF OR EQUAL TO + \xA2\xBD |0 # SUPERSET OF OR EQUAL TO + \xA2\xDD |0 # UP TACK + \xAD\xF6 |3 # UP TACK + \xAD\xF9 |0 # RIGHT TRIANGLE + \xA2\xDE |0 # ARC + \xAD\xA1 |0 # CIRCLED DIGIT ONE + \xAD\xA2 |0 # CIRCLED DIGIT TWO + \xAD\xA3 |0 # CIRCLED DIGIT THREE + \xAD\xA4 |0 # CIRCLED DIGIT FOUR + \xAD\xA5 |0 # CIRCLED DIGIT FIVE + \xAD\xA6 |0 # CIRCLED DIGIT SIX + \xAD\xA7 |0 # CIRCLED DIGIT SEVEN + \xAD\xA8 |0 # CIRCLED DIGIT EIGHT + \xAD\xA9 |0 # CIRCLED DIGIT NINE + \xAD\xAA |0 # CIRCLED NUMBER TEN + \xAD\xAB |0 # CIRCLED NUMBER ELEVEN + \xAD\xAC |0 # CIRCLED NUMBER TWELVE + \xAD\xAD |0 # CIRCLED NUMBER THIRTEEN + \xAD\xAE |0 # CIRCLED NUMBER FOURTEEN + \xAD\xAF |0 # CIRCLED NUMBER FIFTEEN + \xAD\xB0 |0 # CIRCLED NUMBER SIXTEEN + \xAD\xB1 |0 # CIRCLED NUMBER SEVENTEEN + \xAD\xB2 |0 # CIRCLED NUMBER EIGHTEEN + \xAD\xB3 |0 # CIRCLED NUMBER NINETEEN + \xAD\xB4 |0 # CIRCLED NUMBER TWENTY + \xA8\xA1 |0 # BOX DRAWINGS LIGHT HORIZONTAL + \xA8\xAC |0 # BOX DRAWINGS HEAVY HORIZONTAL + \xA8\xA2 |0 # BOX DRAWINGS LIGHT VERTICAL + \xA8\xAD |0 # BOX DRAWINGS HEAVY VERTICAL + \xA8\xA3 |0 # BOX DRAWINGS LIGHT DOWN AND RIGHT + \xA8\xAE |0 # BOX DRAWINGS HEAVY DOWN AND RIGHT + \xA8\xA4 |0 # BOX DRAWINGS LIGHT DOWN AND LEFT + \xA8\xAF |0 # BOX DRAWINGS HEAVY DOWN AND LEFT + \xA8\xA6 |0 # BOX DRAWINGS LIGHT UP AND RIGHT + \xA8\xB1 |0 # BOX DRAWINGS HEAVY UP AND RIGHT + \xA8\xA5 |0 # BOX DRAWINGS LIGHT UP AND LEFT + \xA8\xB0 |0 # BOX DRAWINGS HEAVY UP AND LEFT + \xA8\xA7 |0 # BOX DRAWINGS LIGHT VERTICAL AND RIGHT + \xA8\xBC |0 # BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY + \xA8\xB7 |0 # BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT + \xA8\xB2 |0 # BOX DRAWINGS HEAVY VERTICAL AND RIGHT + \xA8\xA9 |0 # BOX DRAWINGS LIGHT VERTICAL AND LEFT + \xA8\xBE |0 # BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY + \xA8\xB9 |0 # BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT + \xA8\xB4 |0 # BOX DRAWINGS HEAVY VERTICAL AND LEFT + \xA8\xA8 |0 # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + \xA8\xB8 |0 # BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY + \xA8\xBD |0 # BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT + \xA8\xB3 |0 # BOX DRAWINGS HEAVY DOWN AND HORIZONTAL + \xA8\xAA |0 # BOX DRAWINGS LIGHT UP AND HORIZONTAL + \xA8\xBA |0 # BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY + \xA8\xBF |0 # BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT + \xA8\xB5 |0 # BOX DRAWINGS HEAVY UP AND HORIZONTAL + \xA8\xAB |0 # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + \xA8\xBB |0 # BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY + \xA8\xC0 |0 # BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT + \xA8\xB6 |0 # BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL + \xA2\xA3 |0 # BLACK SQUARE + \xA2\xA2 |0 # WHITE SQUARE + \xA2\xA5 |0 # BLACK UP-POINTING TRIANGLE + \xA2\xA4 |0 # WHITE UP-POINTING TRIANGLE + \xA2\xA7 |0 # BLACK DOWN-POINTING TRIANGLE + \xA2\xA6 |0 # WHITE DOWN-POINTING TRIANGLE + \xA2\xA1 |0 # BLACK DIAMOND + \xA1\xFE |0 # WHITE DIAMOND + \xA1\xFB |0 # WHITE CIRCLE + \xA1\xFD |0 # BULLSEYE + \xA1\xFC |0 # BLACK CIRCLE + \xA2\xFE |0 # LARGE CIRCLE + \xA1\xFA |0 # BLACK STAR + \xA1\xF9 |0 # WHITE STAR + \xA1\xEA |0 # FEMALE SIGN + \xA1\xE9 |0 # MALE SIGN + \xA2\xF6 |0 # EIGHTH NOTE + \xA2\xF5 |0 # MUSIC FLAT SIGN + \xA2\xF4 |0 # MUSIC SHARP SIGN + \xA1\xA1 |0 # IDEOGRAPHIC SPACE + \xA1\xA2 |0 # IDEOGRAPHIC COMMA + \xA1\xA3 |0 # IDEOGRAPHIC FULL STOP + \xA1\xB7 |0 # DITTO MARK + \xA1\xB9 |0 # IDEOGRAPHIC ITERATION MARK + \xA1\xBA |0 # IDEOGRAPHIC CLOSING MARK + \xA1\xBB |0 # IDEOGRAPHIC NUMBER ZERO + \xA1\xD2 |0 # LEFT ANGLE BRACKET + \xA1\xD3 |0 # RIGHT ANGLE BRACKET + \xA1\xD4 |0 # LEFT DOUBLE ANGLE BRACKET + \xA1\xD5 |0 # RIGHT DOUBLE ANGLE BRACKET + \xA1\xD6 |0 # LEFT CORNER BRACKET + \xA1\xD7 |0 # RIGHT CORNER BRACKET + \xA1\xD8 |0 # LEFT WHITE CORNER BRACKET + \xA1\xD9 |0 # RIGHT WHITE CORNER BRACKET + \xA1\xDA |0 # LEFT BLACK LENTICULAR BRACKET + \xA1\xDB |0 # RIGHT BLACK LENTICULAR BRACKET + \xA2\xA9 |0 # POSTAL MARK + \xA2\xAE |0 # GETA MARK + \xA1\xCC |0 # LEFT TORTOISE SHELL BRACKET + \xA1\xCD |0 # RIGHT TORTOISE SHELL BRACKET + \xAD\xE0 |0 # REVERSED DOUBLE PRIME QUOTATION MARK + \xAD\xE1 |0 # LOW DOUBLE PRIME QUOTATION MARK + \xA4\xA1 |0 # HIRAGANA LETTER SMALL A + \xA4\xA2 |0 # HIRAGANA LETTER A + \xA4\xA3 |0 # HIRAGANA LETTER SMALL I + \xA4\xA4 |0 # HIRAGANA LETTER I + \xA4\xA5 |0 # HIRAGANA LETTER SMALL U + \xA4\xA6 |0 # HIRAGANA LETTER U + \xA4\xA7 |0 # HIRAGANA LETTER SMALL E + \xA4\xA8 |0 # HIRAGANA LETTER E + \xA4\xA9 |0 # HIRAGANA LETTER SMALL O + \xA4\xAA |0 # HIRAGANA LETTER O + \xA4\xAB |0 # HIRAGANA LETTER KA + \xA4\xAC |0 # HIRAGANA LETTER GA + \xA4\xAD |0 # HIRAGANA LETTER KI + \xA4\xAE |0 # HIRAGANA LETTER GI + \xA4\xAF |0 # HIRAGANA LETTER KU + \xA4\xB0 |0 # HIRAGANA LETTER GU + \xA4\xB1 |0 # HIRAGANA LETTER KE + \xA4\xB2 |0 # HIRAGANA LETTER GE + \xA4\xB3 |0 # HIRAGANA LETTER KO + \xA4\xB4 |0 # HIRAGANA LETTER GO + \xA4\xB5 |0 # HIRAGANA LETTER SA + \xA4\xB6 |0 # HIRAGANA LETTER ZA + \xA4\xB7 |0 # HIRAGANA LETTER SI + \xA4\xB8 |0 # HIRAGANA LETTER ZI + \xA4\xB9 |0 # HIRAGANA LETTER SU + \xA4\xBA |0 # HIRAGANA LETTER ZU + \xA4\xBB |0 # HIRAGANA LETTER SE + \xA4\xBC |0 # HIRAGANA LETTER ZE + \xA4\xBD |0 # HIRAGANA LETTER SO + \xA4\xBE |0 # HIRAGANA LETTER ZO + \xA4\xBF |0 # HIRAGANA LETTER TA + \xA4\xC0 |0 # HIRAGANA LETTER DA + \xA4\xC1 |0 # HIRAGANA LETTER TI + \xA4\xC2 |0 # HIRAGANA LETTER DI + \xA4\xC3 |0 # HIRAGANA LETTER SMALL TU + \xA4\xC4 |0 # HIRAGANA LETTER TU + \xA4\xC5 |0 # HIRAGANA LETTER DU + \xA4\xC6 |0 # HIRAGANA LETTER TE + \xA4\xC7 |0 # HIRAGANA LETTER DE + \xA4\xC8 |0 # HIRAGANA LETTER TO + \xA4\xC9 |0 # HIRAGANA LETTER DO + \xA4\xCA |0 # HIRAGANA LETTER NA + \xA4\xCB |0 # HIRAGANA LETTER NI + \xA4\xCC |0 # HIRAGANA LETTER NU + \xA4\xCD |0 # HIRAGANA LETTER NE + \xA4\xCE |0 # HIRAGANA LETTER NO + \xA4\xCF |0 # HIRAGANA LETTER HA + \xA4\xD0 |0 # HIRAGANA LETTER BA + \xA4\xD1 |0 # HIRAGANA LETTER PA + \xA4\xD2 |0 # HIRAGANA LETTER HI + \xA4\xD3 |0 # HIRAGANA LETTER BI + \xA4\xD4 |0 # HIRAGANA LETTER PI + \xA4\xD5 |0 # HIRAGANA LETTER HU + \xA4\xD6 |0 # HIRAGANA LETTER BU + \xA4\xD7 |0 # HIRAGANA LETTER PU + \xA4\xD8 |0 # HIRAGANA LETTER HE + \xA4\xD9 |0 # HIRAGANA LETTER BE + \xA4\xDA |0 # HIRAGANA LETTER PE + \xA4\xDB |0 # HIRAGANA LETTER HO + \xA4\xDC |0 # HIRAGANA LETTER BO + \xA4\xDD |0 # HIRAGANA LETTER PO + \xA4\xDE |0 # HIRAGANA LETTER MA + \xA4\xDF |0 # HIRAGANA LETTER MI + \xA4\xE0 |0 # HIRAGANA LETTER MU + \xA4\xE1 |0 # HIRAGANA LETTER ME + \xA4\xE2 |0 # HIRAGANA LETTER MO + \xA4\xE3 |0 # HIRAGANA LETTER SMALL YA + \xA4\xE4 |0 # HIRAGANA LETTER YA + \xA4\xE5 |0 # HIRAGANA LETTER SMALL YU + \xA4\xE6 |0 # HIRAGANA LETTER YU + \xA4\xE7 |0 # HIRAGANA LETTER SMALL YO + \xA4\xE8 |0 # HIRAGANA LETTER YO + \xA4\xE9 |0 # HIRAGANA LETTER RA + \xA4\xEA |0 # HIRAGANA LETTER RI + \xA4\xEB |0 # HIRAGANA LETTER RU + \xA4\xEC |0 # HIRAGANA LETTER RE + \xA4\xED |0 # HIRAGANA LETTER RO + \xA4\xEE |0 # HIRAGANA LETTER SMALL WA + \xA4\xEF |0 # HIRAGANA LETTER WA + \xA4\xF0 |0 # HIRAGANA LETTER WI + \xA4\xF1 |0 # HIRAGANA LETTER WE + \xA4\xF2 |0 # HIRAGANA LETTER WO + \xA4\xF3 |0 # HIRAGANA LETTER N + \xA5\xF4 |1 # HIRAGANA LETTER VU + \xA1\xAB |0 # KATAKANA-HIRAGANA VOICED SOUND MARK + \xA1\xAC |0 # KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK + \xA1\xB5 |0 # HIRAGANA ITERATION MARK + \xA1\xB6 |0 # HIRAGANA VOICED ITERATION MARK + \xA5\xA1 |0 # KATAKANA LETTER SMALL A + \xA5\xA2 |0 # KATAKANA LETTER A + \xA5\xA3 |0 # KATAKANA LETTER SMALL I + \xA5\xA4 |0 # KATAKANA LETTER I + \xA5\xA5 |0 # KATAKANA LETTER SMALL U + \xA5\xA6 |0 # KATAKANA LETTER U + \xA5\xA7 |0 # KATAKANA LETTER SMALL E + \xA5\xA8 |0 # KATAKANA LETTER E + \xA5\xA9 |0 # KATAKANA LETTER SMALL O + \xA5\xAA |0 # KATAKANA LETTER O + \xA5\xAB |0 # KATAKANA LETTER KA + \xA5\xAC |0 # KATAKANA LETTER GA + \xA5\xAD |0 # KATAKANA LETTER KI + \xA5\xAE |0 # KATAKANA LETTER GI + \xA5\xAF |0 # KATAKANA LETTER KU + \xA5\xB0 |0 # KATAKANA LETTER GU + \xA5\xB1 |0 # KATAKANA LETTER KE + \xA5\xB2 |0 # KATAKANA LETTER GE + \xA5\xB3 |0 # KATAKANA LETTER KO + \xA5\xB4 |0 # KATAKANA LETTER GO + \xA5\xB5 |0 # KATAKANA LETTER SA + \xA5\xB6 |0 # KATAKANA LETTER ZA + \xA5\xB7 |0 # KATAKANA LETTER SI + \xA5\xB8 |0 # KATAKANA LETTER ZI + \xA5\xB9 |0 # KATAKANA LETTER SU + \xA5\xBA |0 # KATAKANA LETTER ZU + \xA5\xBB |0 # KATAKANA LETTER SE + \xA5\xBC |0 # KATAKANA LETTER ZE + \xA5\xBD |0 # KATAKANA LETTER SO + \xA5\xBE |0 # KATAKANA LETTER ZO + \xA5\xBF |0 # KATAKANA LETTER TA + \xA5\xC0 |0 # KATAKANA LETTER DA + \xA5\xC1 |0 # KATAKANA LETTER TI + \xA5\xC2 |0 # KATAKANA LETTER DI + \xA5\xC3 |0 # KATAKANA LETTER SMALL TU + \xA5\xC4 |0 # KATAKANA LETTER TU + \xA5\xC5 |0 # KATAKANA LETTER DU + \xA5\xC6 |0 # KATAKANA LETTER TE + \xA5\xC7 |0 # KATAKANA LETTER DE + \xA5\xC8 |0 # KATAKANA LETTER TO + \xA5\xC9 |0 # KATAKANA LETTER DO + \xA5\xCA |0 # KATAKANA LETTER NA + \xA5\xCB |0 # KATAKANA LETTER NI + \xA5\xCC |0 # KATAKANA LETTER NU + \xA5\xCD |0 # KATAKANA LETTER NE + \xA5\xCE |0 # KATAKANA LETTER NO + \xA5\xCF |0 # KATAKANA LETTER HA + \xA5\xD0 |0 # KATAKANA LETTER BA + \xA5\xD1 |0 # KATAKANA LETTER PA + \xA5\xD2 |0 # KATAKANA LETTER HI + \xA5\xD3 |0 # KATAKANA LETTER BI + \xA5\xD4 |0 # KATAKANA LETTER PI + \xA5\xD5 |0 # KATAKANA LETTER HU + \xA5\xD6 |0 # KATAKANA LETTER BU + \xA5\xD7 |0 # KATAKANA LETTER PU + \xA5\xD8 |0 # KATAKANA LETTER HE + \xA5\xD9 |0 # KATAKANA LETTER BE + \xA5\xDA |0 # KATAKANA LETTER PE + \xA5\xDB |0 # KATAKANA LETTER HO + \xA5\xDC |0 # KATAKANA LETTER BO + \xA5\xDD |0 # KATAKANA LETTER PO + \xA5\xDE |0 # KATAKANA LETTER MA + \xA5\xDF |0 # KATAKANA LETTER MI + \xA5\xE0 |0 # KATAKANA LETTER MU + \xA5\xE1 |0 # KATAKANA LETTER ME + \xA5\xE2 |0 # KATAKANA LETTER MO + \xA5\xE3 |0 # KATAKANA LETTER SMALL YA + \xA5\xE4 |0 # KATAKANA LETTER YA + \xA5\xE5 |0 # KATAKANA LETTER SMALL YU + \xA5\xE6 |0 # KATAKANA LETTER YU + \xA5\xE7 |0 # KATAKANA LETTER SMALL YO + \xA5\xE8 |0 # KATAKANA LETTER YO + \xA5\xE9 |0 # KATAKANA LETTER RA + \xA5\xEA |0 # KATAKANA LETTER RI + \xA5\xEB |0 # KATAKANA LETTER RU + \xA5\xEC |0 # KATAKANA LETTER RE + \xA5\xED |0 # KATAKANA LETTER RO + \xA5\xEE |0 # KATAKANA LETTER SMALL WA + \xA5\xEF |0 # KATAKANA LETTER WA + \xA5\xF0 |0 # KATAKANA LETTER WI + \xA5\xF1 |0 # KATAKANA LETTER WE + \xA5\xF2 |0 # KATAKANA LETTER WO + \xA5\xF3 |0 # KATAKANA LETTER N + \xA5\xF4 |0 # KATAKANA LETTER VU + \xA5\xF5 |0 # KATAKANA LETTER SMALL KA + \xA5\xF6 |0 # KATAKANA LETTER SMALL KE + \xA1\xA6 |0 # KATAKANA MIDDLE DOT + \xA1\xBC |0 # KATAKANA-HIRAGANA PROLONGED SOUND MARK + \xA1\xB3 |0 # KATAKANA ITERATION MARK + \xA1\xB4 |0 # KATAKANA VOICED ITERATION MARK + \xAD\xEA |0 # PARENTHESIZED IDEOGRAPH STOCK + \xAD\xEB |0 # PARENTHESIZED IDEOGRAPH HAVE + \xAD\xEC |0 # PARENTHESIZED IDEOGRAPH REPRESENT + \xAD\xE5 |0 # CIRCLED IDEOGRAPH HIGH + \xAD\xE6 |0 # CIRCLED IDEOGRAPH CENTRE + \xAD\xE7 |0 # CIRCLED IDEOGRAPH LOW + \xAD\xE8 |0 # CIRCLED IDEOGRAPH LEFT + \xAD\xE9 |0 # CIRCLED IDEOGRAPH RIGHT + \xAD\xC6 |0 # SQUARE AARU + \xAD\xCA |0 # SQUARE KARORII + \xAD\xC1 |0 # SQUARE KIRO + \xAD\xC4 |0 # SQUARE GURAMU + \xAD\xC2 |0 # SQUARE SENTI + \xAD\xCC |0 # SQUARE SENTO + \xAD\xCB |0 # SQUARE DORU + \xAD\xC5 |0 # SQUARE TON + \xAD\xCD |0 # SQUARE PAASENTO + \xAD\xC7 |0 # SQUARE HEKUTAARU + \xAD\xCF |0 # SQUARE PEEZI + \xAD\xC0 |0 # SQUARE MIRI + \xAD\xCE |0 # SQUARE MIRIBAARU + \xAD\xC3 |0 # SQUARE MEETORU + \xAD\xC8 |0 # SQUARE RITTORU + \xAD\xC9 |0 # SQUARE WATTO + \xAD\xDF |0 # SQUARE ERA NAME HEISEI + \xAD\xEF |0 # SQUARE ERA NAME SYOUWA + \xAD\xEE |0 # SQUARE ERA NAME TAISYOU + \xAD\xED |0 # SQUARE ERA NAME MEIZI + \xAD\xD3 |0 # SQUARE MG + \xAD\xD4 |0 # SQUARE KG + \xAD\xD0 |0 # SQUARE MM + \xAD\xD1 |0 # SQUARE CM + \xAD\xD2 |0 # SQUARE KM + \xAD\xD6 |0 # SQUARE M SQUARED + \xAD\xD5 |0 # SQUARE CC + \xAD\xE3 |0 # SQUARE KK + \xB0\xEC |0 # CJK UNIFIED IDEOGRAPH + \xC3\xFA |0 # CJK UNIFIED IDEOGRAPH + \xBC\xB7 |0 # CJK UNIFIED IDEOGRAPH + \xCB\xFC |0 # CJK UNIFIED IDEOGRAPH + \xBE\xE6 |0 # CJK UNIFIED IDEOGRAPH + \xBB\xB0 |0 # CJK UNIFIED IDEOGRAPH + \xBE\xE5 |0 # CJK UNIFIED IDEOGRAPH + \xB2\xBC |0 # CJK UNIFIED IDEOGRAPH + \xC9\xD4 |0 # CJK UNIFIED IDEOGRAPH + \xCD\xBF |0 # CJK UNIFIED IDEOGRAPH + \xD0\xA2 |0 # CJK UNIFIED IDEOGRAPH + \xB1\xAF |0 # CJK UNIFIED IDEOGRAPH + \xB3\xEE |0 # CJK UNIFIED IDEOGRAPH + \xD0\xA3 |0 # CJK UNIFIED IDEOGRAPH + \xC0\xA4 |0 # CJK UNIFIED IDEOGRAPH + \xD2\xC2 |0 # CJK UNIFIED IDEOGRAPH + \xB5\xD6 |0 # CJK UNIFIED IDEOGRAPH + \xCA\xBA |0 # CJK UNIFIED IDEOGRAPH + \xBE\xE7 |0 # CJK UNIFIED IDEOGRAPH + \xCE\xBE |0 # CJK UNIFIED IDEOGRAPH + \xCA\xC2 |0 # CJK UNIFIED IDEOGRAPH + \xF9\xAD |0 # CJK UNIFIED IDEOGRAPH + \xD0\xA4 |0 # CJK UNIFIED IDEOGRAPH + \xC3\xE6 |0 # CJK UNIFIED IDEOGRAPH + \xD0\xA5 |0 # CJK UNIFIED IDEOGRAPH + \xB6\xFA |0 # CJK UNIFIED IDEOGRAPH + \xD0\xA6 |0 # CJK UNIFIED IDEOGRAPH + \xB4\xDD |0 # CJK UNIFIED IDEOGRAPH + \xC3\xB0 |0 # CJK UNIFIED IDEOGRAPH + \xBC\xE7 |0 # CJK UNIFIED IDEOGRAPH + \xD0\xA7 |0 # CJK UNIFIED IDEOGRAPH + \xD0\xA8 |0 # CJK UNIFIED IDEOGRAPH + \xD0\xA9 |0 # CJK UNIFIED IDEOGRAPH + \xC7\xB5 |0 # CJK UNIFIED IDEOGRAPH + \xB5\xD7 |0 # CJK UNIFIED IDEOGRAPH + \xC7\xB7 |0 # CJK UNIFIED IDEOGRAPH + \xC6\xE3 |0 # CJK UNIFIED IDEOGRAPH + \xB8\xC3 |0 # CJK UNIFIED IDEOGRAPH + \xCB\xB3 |0 # CJK UNIFIED IDEOGRAPH + \xE9\xC9 |0 # CJK UNIFIED IDEOGRAPH + \xD0\xAA |0 # CJK UNIFIED IDEOGRAPH + \xBE\xE8 |0 # CJK UNIFIED IDEOGRAPH + \xD0\xAB |0 # CJK UNIFIED IDEOGRAPH + \xB2\xB5 |0 # CJK UNIFIED IDEOGRAPH + \xB6\xE5 |0 # CJK UNIFIED IDEOGRAPH + \xB8\xF0 |0 # CJK UNIFIED IDEOGRAPH + \xCC\xE9 |0 # CJK UNIFIED IDEOGRAPH + \xD6\xA6 |0 # CJK UNIFIED IDEOGRAPH + \xCD\xF0 |0 # CJK UNIFIED IDEOGRAPH + \xC6\xFD |0 # CJK UNIFIED IDEOGRAPH + \xB4\xA5 |0 # CJK UNIFIED IDEOGRAPH + \xB5\xB5 |0 # CJK UNIFIED IDEOGRAPH + \xD0\xAC |0 # CJK UNIFIED IDEOGRAPH + \xD0\xAD |0 # CJK UNIFIED IDEOGRAPH + \xCE\xBB |0 # CJK UNIFIED IDEOGRAPH + \xCD\xBD |0 # CJK UNIFIED IDEOGRAPH + \xC1\xE8 |0 # CJK UNIFIED IDEOGRAPH + \xD0\xAF |0 # CJK UNIFIED IDEOGRAPH + \xBB\xF6 |0 # CJK UNIFIED IDEOGRAPH + \xC6\xF3 |0 # CJK UNIFIED IDEOGRAPH + \xD0\xB2 |0 # CJK UNIFIED IDEOGRAPH + \xB1\xBE |0 # CJK UNIFIED IDEOGRAPH + \xB8\xDF |0 # CJK UNIFIED IDEOGRAPH + \xB8\xDE |0 # CJK UNIFIED IDEOGRAPH + \xB0\xE6 |0 # CJK UNIFIED IDEOGRAPH + \xCF\xCB |0 # CJK UNIFIED IDEOGRAPH + \xCF\xCA |0 # CJK UNIFIED IDEOGRAPH + \xBA\xB3 |0 # CJK UNIFIED IDEOGRAPH + \xB0\xA1 |0 # CJK UNIFIED IDEOGRAPH + \xD0\xB3 |0 # CJK UNIFIED IDEOGRAPH + \xD0\xB4 |0 # CJK UNIFIED IDEOGRAPH + \xD0\xB5 |0 # CJK UNIFIED IDEOGRAPH + \xCB\xB4 |0 # CJK UNIFIED IDEOGRAPH + \xD0\xB6 |0 # CJK UNIFIED IDEOGRAPH + \xB8\xF2 |0 # CJK UNIFIED IDEOGRAPH + \xB0\xE7 |0 # CJK UNIFIED IDEOGRAPH + \xCB\xF2 |0 # CJK UNIFIED IDEOGRAPH + \xB5\xFC |0 # CJK UNIFIED IDEOGRAPH + \xB5\xFD |0 # CJK UNIFIED IDEOGRAPH + \xB5\xFE |0 # CJK UNIFIED IDEOGRAPH + \xC4\xE2 |0 # CJK UNIFIED IDEOGRAPH + \xCE\xBC |0 # CJK UNIFIED IDEOGRAPH + \xD0\xB7 |0 # CJK UNIFIED IDEOGRAPH + \xD0\xB8 |0 # CJK UNIFIED IDEOGRAPH + \xD0\xB9 |0 # CJK UNIFIED IDEOGRAPH + \xBF\xCD |0 # CJK UNIFIED IDEOGRAPH + \xBD\xBA |0 # CJK UNIFIED IDEOGRAPH + \xBF\xCE |0 # CJK UNIFIED IDEOGRAPH + \xD0\xBE |0 # CJK UNIFIED IDEOGRAPH + \xD0\xBC |0 # CJK UNIFIED IDEOGRAPH + \xD0\xBD |0 # CJK UNIFIED IDEOGRAPH + \xB5\xD8 |0 # CJK UNIFIED IDEOGRAPH + \xBA\xA3 |0 # CJK UNIFIED IDEOGRAPH + \xB2\xF0 |0 # CJK UNIFIED IDEOGRAPH + \xD0\xBB |0 # CJK UNIFIED IDEOGRAPH + \xD0\xBA |0 # CJK UNIFIED IDEOGRAPH + \xCA\xA9 |0 # CJK UNIFIED IDEOGRAPH + \xBB\xC6 |0 # CJK UNIFIED IDEOGRAPH + \xBB\xC5 |0 # CJK UNIFIED IDEOGRAPH + \xC2\xBE |0 # CJK UNIFIED IDEOGRAPH + \xD0\xBF |0 # CJK UNIFIED IDEOGRAPH + \xC9\xD5 |0 # CJK UNIFIED IDEOGRAPH + \xC0\xE7 |0 # CJK UNIFIED IDEOGRAPH + \xA1\xB8 |0 # CJK UNIFIED IDEOGRAPH + \xD0\xC0 |0 # CJK UNIFIED IDEOGRAPH + \xD0\xC2 |0 # CJK UNIFIED IDEOGRAPH + \xF9\xAE |0 # CJK UNIFIED IDEOGRAPH + \xC2\xE5 |0 # CJK UNIFIED IDEOGRAPH + \xCE\xE1 |0 # CJK UNIFIED IDEOGRAPH + \xB0\xCA |0 # CJK UNIFIED IDEOGRAPH + \xD0\xC1 |0 # CJK UNIFIED IDEOGRAPH + \xB2\xBE |0 # CJK UNIFIED IDEOGRAPH + \xB6\xC4 |0 # CJK UNIFIED IDEOGRAPH + \xC3\xE7 |0 # CJK UNIFIED IDEOGRAPH + \xB7\xEF |0 # CJK UNIFIED IDEOGRAPH + \xD0\xC3 |0 # CJK UNIFIED IDEOGRAPH + \xC7\xA4 |0 # CJK UNIFIED IDEOGRAPH + \xF9\xAF |0 # CJK UNIFIED IDEOGRAPH + \xF9\xB0 |0 # CJK UNIFIED IDEOGRAPH + \xB4\xEB |0 # CJK UNIFIED IDEOGRAPH + \xF9\xB1 |0 # CJK UNIFIED IDEOGRAPH + \xD0\xC4 |0 # CJK UNIFIED IDEOGRAPH + \xB0\xCB |0 # CJK UNIFIED IDEOGRAPH + \xB8\xE0 |0 # CJK UNIFIED IDEOGRAPH + \xB4\xEC |0 # CJK UNIFIED IDEOGRAPH + \xC9\xFA |0 # CJK UNIFIED IDEOGRAPH + \xC8\xB2 |0 # CJK UNIFIED IDEOGRAPH + \xB5\xD9 |0 # CJK UNIFIED IDEOGRAPH + \xB2\xF1 |0 # CJK UNIFIED IDEOGRAPH + \xD0\xE7 |0 # CJK UNIFIED IDEOGRAPH + \xC5\xC1 |0 # CJK UNIFIED IDEOGRAPH + \xC7\xEC |0 # CJK UNIFIED IDEOGRAPH + \xD0\xC6 |0 # CJK UNIFIED IDEOGRAPH + \xC8\xBC |0 # CJK UNIFIED IDEOGRAPH + \xCE\xE2 |0 # CJK UNIFIED IDEOGRAPH + \xBF\xAD |0 # CJK UNIFIED IDEOGRAPH + \xF9\xB2 |0 # CJK UNIFIED IDEOGRAPH + \xBB\xC7 |0 # CJK UNIFIED IDEOGRAPH + \xBB\xF7 |0 # CJK UNIFIED IDEOGRAPH + \xB2\xC0 |0 # CJK UNIFIED IDEOGRAPH + \xC4\xD1 |0 # CJK UNIFIED IDEOGRAPH + \xC3\xA2 |0 # CJK UNIFIED IDEOGRAPH + \xD0\xCA |0 # CJK UNIFIED IDEOGRAPH + \xB0\xCC |0 # CJK UNIFIED IDEOGRAPH + \xC4\xE3 |0 # CJK UNIFIED IDEOGRAPH + \xBD\xBB |0 # CJK UNIFIED IDEOGRAPH + \xBA\xB4 |0 # CJK UNIFIED IDEOGRAPH + \xCD\xA4 |0 # CJK UNIFIED IDEOGRAPH + \xC2\xCE |0 # CJK UNIFIED IDEOGRAPH + \xB2\xBF |0 # CJK UNIFIED IDEOGRAPH + \xF9\xB3 |0 # CJK UNIFIED IDEOGRAPH + \xD0\xC9 |0 # CJK UNIFIED IDEOGRAPH + \xCD\xBE |0 # CJK UNIFIED IDEOGRAPH + \xD0\xC5 |0 # CJK UNIFIED IDEOGRAPH + \xD0\xC7 |0 # CJK UNIFIED IDEOGRAPH + \xBA\xEE |0 # CJK UNIFIED IDEOGRAPH + \xD0\xC8 |0 # CJK UNIFIED IDEOGRAPH + \xD5\xA4 |0 # CJK UNIFIED IDEOGRAPH + \xD0\xD0 |0 # CJK UNIFIED IDEOGRAPH + \xD0\xD3 |0 # CJK UNIFIED IDEOGRAPH + \xD0\xD1 |0 # CJK UNIFIED IDEOGRAPH + \xB2\xC2 |0 # CJK UNIFIED IDEOGRAPH + \xCA\xBB |0 # CJK UNIFIED IDEOGRAPH + \xD0\xCB |0 # CJK UNIFIED IDEOGRAPH + \xD0\xCF |0 # CJK UNIFIED IDEOGRAPH + \xB8\xF3 |0 # CJK UNIFIED IDEOGRAPH + \xBB\xC8 |0 # CJK UNIFIED IDEOGRAPH + \xB4\xA6 |0 # CJK UNIFIED IDEOGRAPH + \xD0\xD4 |0 # CJK UNIFIED IDEOGRAPH + \xD0\xCC |0 # CJK UNIFIED IDEOGRAPH + \xF9\xB5 |0 # CJK UNIFIED IDEOGRAPH + \xCE\xE3 |0 # CJK UNIFIED IDEOGRAPH + \xBB\xF8 |0 # CJK UNIFIED IDEOGRAPH + \xD0\xCD |0 # CJK UNIFIED IDEOGRAPH + \xD0\xD2 |0 # CJK UNIFIED IDEOGRAPH + \xF9\xB4 |0 # CJK UNIFIED IDEOGRAPH + \xF9\xB7 |0 # CJK UNIFIED IDEOGRAPH + \xD0\xD5 |0 # CJK UNIFIED IDEOGRAPH + \xD0\xCE |0 # CJK UNIFIED IDEOGRAPH + \xF9\xB6 |0 # CJK UNIFIED IDEOGRAPH + \xB6\xA1 |0 # CJK UNIFIED IDEOGRAPH + \xB0\xCD |0 # CJK UNIFIED IDEOGRAPH + \xB6\xA2 |0 # CJK UNIFIED IDEOGRAPH + \xB2\xC1 |0 # CJK UNIFIED IDEOGRAPH + \xD5\xA5 |0 # CJK UNIFIED IDEOGRAPH + \xCB\xF9 |0 # CJK UNIFIED IDEOGRAPH + \xC9\xEE |0 # CJK UNIFIED IDEOGRAPH + \xB8\xF4 |0 # CJK UNIFIED IDEOGRAPH + \xBF\xAF |0 # CJK UNIFIED IDEOGRAPH + \xCE\xB7 |0 # CJK UNIFIED IDEOGRAPH + \xCA\xD8 |0 # CJK UNIFIED IDEOGRAPH + \xB7\xB8 |0 # CJK UNIFIED IDEOGRAPH + \xC2\xA5 |0 # CJK UNIFIED IDEOGRAPH + \xB2\xE4 |0 # CJK UNIFIED IDEOGRAPH + \xF9\xA6 |0 # CJK UNIFIED IDEOGRAPH + \xBD\xD3 |0 # CJK UNIFIED IDEOGRAPH + \xF9\xB8 |0 # CJK UNIFIED IDEOGRAPH + \xD0\xD9 |0 # CJK UNIFIED IDEOGRAPH + \xD0\xDE |0 # CJK UNIFIED IDEOGRAPH + \xD0\xDC |0 # CJK UNIFIED IDEOGRAPH + \xD0\xD7 |0 # CJK UNIFIED IDEOGRAPH + \xC2\xAF |0 # CJK UNIFIED IDEOGRAPH + \xD0\xDA |0 # CJK UNIFIED IDEOGRAPH + \xD0\xDD |0 # CJK UNIFIED IDEOGRAPH + \xD0\xDB |0 # CJK UNIFIED IDEOGRAPH + \xCA\xDD |0 # CJK UNIFIED IDEOGRAPH + \xD0\xD8 |0 # CJK UNIFIED IDEOGRAPH + \xBF\xAE |0 # CJK UNIFIED IDEOGRAPH + \xCB\xF3 |0 # CJK UNIFIED IDEOGRAPH + \xD0\xDF |0 # CJK UNIFIED IDEOGRAPH + \xD0\xE0 |0 # CJK UNIFIED IDEOGRAPH + \xBD\xA4 |0 # CJK UNIFIED IDEOGRAPH + \xD0\xED |0 # CJK UNIFIED IDEOGRAPH + \xC7\xD0 |0 # CJK UNIFIED IDEOGRAPH + \xC9\xB6 |0 # CJK UNIFIED IDEOGRAPH + \xD0\xE8 |0 # CJK UNIFIED IDEOGRAPH + \xCA\xF0 |0 # CJK UNIFIED IDEOGRAPH + \xB2\xB6 |0 # CJK UNIFIED IDEOGRAPH + \xD0\xEC |0 # CJK UNIFIED IDEOGRAPH + \xF9\xBB |0 # CJK UNIFIED IDEOGRAPH + \xD0\xE6 |0 # CJK UNIFIED IDEOGRAPH + \xD0\xEF |0 # CJK UNIFIED IDEOGRAPH + \xC1\xD2 |0 # CJK UNIFIED IDEOGRAPH + \xB8\xC4 |0 # CJK UNIFIED IDEOGRAPH + \xC7\xDC |0 # CJK UNIFIED IDEOGRAPH + \xE0\xC7 |0 # CJK UNIFIED IDEOGRAPH + \xD0\xEE |0 # CJK UNIFIED IDEOGRAPH + \xC5\xDD |0 # CJK UNIFIED IDEOGRAPH + \xD0\xE3 |0 # CJK UNIFIED IDEOGRAPH + \xB8\xF6 |0 # CJK UNIFIED IDEOGRAPH + \xB8\xF5 |0 # CJK UNIFIED IDEOGRAPH + \xD0\xE1 |0 # CJK UNIFIED IDEOGRAPH + \xF9\xBC |0 # CJK UNIFIED IDEOGRAPH + \xBC\xDA |0 # CJK UNIFIED IDEOGRAPH + \xD0\xE9 |0 # CJK UNIFIED IDEOGRAPH + \xF9\xBA |0 # CJK UNIFIED IDEOGRAPH + \xCA\xEF |0 # CJK UNIFIED IDEOGRAPH + \xC3\xCD |0 # CJK UNIFIED IDEOGRAPH + \xD0\xE5 |0 # CJK UNIFIED IDEOGRAPH + \xB7\xF1 |0 # CJK UNIFIED IDEOGRAPH + \xD0\xE2 |0 # CJK UNIFIED IDEOGRAPH + \xD0\xEA |0 # CJK UNIFIED IDEOGRAPH + \xD0\xE4 |0 # CJK UNIFIED IDEOGRAPH + \xCE\xD1 |0 # CJK UNIFIED IDEOGRAPH + \xD0\xEB |0 # CJK UNIFIED IDEOGRAPH + \xCF\xC1 |0 # CJK UNIFIED IDEOGRAPH + \xB6\xE6 |0 # CJK UNIFIED IDEOGRAPH + \xB7\xF0 |0 # CJK UNIFIED IDEOGRAPH + \xF9\xB9 |0 # CJK UNIFIED IDEOGRAPH + \xF9\xBF |0 # CJK UNIFIED IDEOGRAPH + \xD0\xF0 |0 # CJK UNIFIED IDEOGRAPH + \xF9\xBD |0 # CJK UNIFIED IDEOGRAPH + \xD0\xF1 |0 # CJK UNIFIED IDEOGRAPH + \xD0\xF5 |0 # CJK UNIFIED IDEOGRAPH + \xB0\xCE |0 # CJK UNIFIED IDEOGRAPH + \xCA\xD0 |0 # CJK UNIFIED IDEOGRAPH + \xD0\xF4 |0 # CJK UNIFIED IDEOGRAPH + \xD0\xF3 |0 # CJK UNIFIED IDEOGRAPH + \xD0\xF7 |0 # CJK UNIFIED IDEOGRAPH + \xD0\xF6 |0 # CJK UNIFIED IDEOGRAPH + \xC4\xE4 |0 # CJK UNIFIED IDEOGRAPH + \xB7\xF2 |0 # CJK UNIFIED IDEOGRAPH + \xD0\xF8 |0 # CJK UNIFIED IDEOGRAPH + \xF9\xBE |0 # CJK UNIFIED IDEOGRAPH + \xBC\xC5 |0 # CJK UNIFIED IDEOGRAPH + \xC2\xA6 |0 # CJK UNIFIED IDEOGRAPH + \xC4\xE5 |0 # CJK UNIFIED IDEOGRAPH + \xB6\xF6 |0 # CJK UNIFIED IDEOGRAPH + \xD0\xF9 |0 # CJK UNIFIED IDEOGRAPH + \xB5\xB6 |0 # CJK UNIFIED IDEOGRAPH + \xD0\xFA |0 # CJK UNIFIED IDEOGRAPH + \xD0\xFC |0 # CJK UNIFIED IDEOGRAPH + \xCB\xB5 |0 # CJK UNIFIED IDEOGRAPH + \xB7\xE6 |0 # CJK UNIFIED IDEOGRAPH + \xF9\xC0 |0 # CJK UNIFIED IDEOGRAPH + \xBB\xB1 |0 # CJK UNIFIED IDEOGRAPH + \xC8\xF7 |0 # CJK UNIFIED IDEOGRAPH + \xD0\xFB |0 # CJK UNIFIED IDEOGRAPH + \xBA\xC5 |0 # CJK UNIFIED IDEOGRAPH + \xCD\xC3 |0 # CJK UNIFIED IDEOGRAPH + \xD0\xFE |0 # CJK UNIFIED IDEOGRAPH + \xD1\xA3 |0 # CJK UNIFIED IDEOGRAPH + \xD0\xFD |0 # CJK UNIFIED IDEOGRAPH + \xBA\xC4 |0 # CJK UNIFIED IDEOGRAPH + \xBD\xFD |0 # CJK UNIFIED IDEOGRAPH + \xB7\xB9 |0 # CJK UNIFIED IDEOGRAPH + \xD1\xA4 |0 # CJK UNIFIED IDEOGRAPH + \xB6\xCF |0 # CJK UNIFIED IDEOGRAPH + \xD1\xA1 |0 # CJK UNIFIED IDEOGRAPH + \xD1\xA2 |0 # CJK UNIFIED IDEOGRAPH + \xC6\xAF |0 # CJK UNIFIED IDEOGRAPH + \xC1\xFC |0 # CJK UNIFIED IDEOGRAPH + \xB6\xA3 |0 # CJK UNIFIED IDEOGRAPH + \xCB\xCD |0 # CJK UNIFIED IDEOGRAPH + \xD1\xA5 |0 # CJK UNIFIED IDEOGRAPH + \xF9\xC2 |0 # CJK UNIFIED IDEOGRAPH + \xCE\xBD |0 # CJK UNIFIED IDEOGRAPH + \xD1\xA6 |0 # CJK UNIFIED IDEOGRAPH + \xD1\xA9 |0 # CJK UNIFIED IDEOGRAPH + \xD1\xA7 |0 # CJK UNIFIED IDEOGRAPH + \xC1\xCE |0 # CJK UNIFIED IDEOGRAPH + \xD1\xA8 |0 # CJK UNIFIED IDEOGRAPH + \xD1\xAA |0 # CJK UNIFIED IDEOGRAPH + \xF9\xC1 |0 # CJK UNIFIED IDEOGRAPH + \xD1\xAC |0 # CJK UNIFIED IDEOGRAPH + \xD1\xAB |0 # CJK UNIFIED IDEOGRAPH + \xCA\xC8 |0 # CJK UNIFIED IDEOGRAPH + \xB5\xB7 |0 # CJK UNIFIED IDEOGRAPH + \xD1\xAE |0 # CJK UNIFIED IDEOGRAPH + \xD1\xAF |0 # CJK UNIFIED IDEOGRAPH + \xB2\xAF |0 # CJK UNIFIED IDEOGRAPH + \xD1\xAD |0 # CJK UNIFIED IDEOGRAPH + \xBC\xF4 |0 # CJK UNIFIED IDEOGRAPH + \xD1\xB2 |0 # CJK UNIFIED IDEOGRAPH + \xD1\xB1 |0 # CJK UNIFIED IDEOGRAPH + \xD1\xB0 |0 # CJK UNIFIED IDEOGRAPH + \xD0\xD6 |0 # CJK UNIFIED IDEOGRAPH + \xD1\xB3 |0 # CJK UNIFIED IDEOGRAPH + \xBD\xFE |0 # CJK UNIFIED IDEOGRAPH + \xD1\xB4 |0 # CJK UNIFIED IDEOGRAPH + \xCD\xA5 |0 # CJK UNIFIED IDEOGRAPH + \xCC\xD9 |0 # CJK UNIFIED IDEOGRAPH + \xD1\xB6 |0 # CJK UNIFIED IDEOGRAPH + \xD1\xB5 |0 # CJK UNIFIED IDEOGRAPH + \xD1\xB8 |0 # CJK UNIFIED IDEOGRAPH + \xD1\xB7 |0 # CJK UNIFIED IDEOGRAPH + \xD1\xB9 |0 # CJK UNIFIED IDEOGRAPH + \xD1\xBA |0 # CJK UNIFIED IDEOGRAPH + \xB0\xF4 |0 # CJK UNIFIED IDEOGRAPH + \xB8\xB5 |0 # CJK UNIFIED IDEOGRAPH + \xB7\xBB |0 # CJK UNIFIED IDEOGRAPH + \xBD\xBC |0 # CJK UNIFIED IDEOGRAPH + \xC3\xFB |0 # CJK UNIFIED IDEOGRAPH + \xB6\xA4 |0 # CJK UNIFIED IDEOGRAPH + \xC0\xE8 |0 # CJK UNIFIED IDEOGRAPH + \xB8\xF7 |0 # CJK UNIFIED IDEOGRAPH + \xF9\xC3 |0 # CJK UNIFIED IDEOGRAPH + \xB9\xEE |0 # CJK UNIFIED IDEOGRAPH + \xD1\xBC |0 # CJK UNIFIED IDEOGRAPH + \xCC\xC8 |0 # CJK UNIFIED IDEOGRAPH + \xC5\xC6 |0 # CJK UNIFIED IDEOGRAPH + \xBB\xF9 |0 # CJK UNIFIED IDEOGRAPH + \xD1\xBB |0 # CJK UNIFIED IDEOGRAPH + \xD1\xBD |0 # CJK UNIFIED IDEOGRAPH + \xC5\xDE |0 # CJK UNIFIED IDEOGRAPH + \xB3\xF5 |0 # CJK UNIFIED IDEOGRAPH + \xD1\xBE |0 # CJK UNIFIED IDEOGRAPH + \xF9\xC4 |0 # CJK UNIFIED IDEOGRAPH + \xC6\xFE |0 # CJK UNIFIED IDEOGRAPH + \xC1\xB4 |0 # CJK UNIFIED IDEOGRAPH + \xD1\xC0 |0 # CJK UNIFIED IDEOGRAPH + \xD1\xC1 |0 # CJK UNIFIED IDEOGRAPH + \xC8\xAC |0 # CJK UNIFIED IDEOGRAPH + \xB8\xF8 |0 # CJK UNIFIED IDEOGRAPH + \xCF\xBB |0 # CJK UNIFIED IDEOGRAPH + \xD1\xC2 |0 # CJK UNIFIED IDEOGRAPH + \xB6\xA6 |0 # CJK UNIFIED IDEOGRAPH + \xCA\xBC |0 # CJK UNIFIED IDEOGRAPH + \xC2\xB6 |0 # CJK UNIFIED IDEOGRAPH + \xB6\xF1 |0 # CJK UNIFIED IDEOGRAPH + \xC5\xB5 |0 # CJK UNIFIED IDEOGRAPH + \xB7\xF3 |0 # CJK UNIFIED IDEOGRAPH + \xD1\xC3 |0 # CJK UNIFIED IDEOGRAPH + \xD1\xC4 |0 # CJK UNIFIED IDEOGRAPH + \xC6\xE2 |0 # CJK UNIFIED IDEOGRAPH + \xB1\xDF |0 # CJK UNIFIED IDEOGRAPH + \xD1\xC7 |0 # CJK UNIFIED IDEOGRAPH + \xBA\xFD |0 # CJK UNIFIED IDEOGRAPH + \xD1\xC6 |0 # CJK UNIFIED IDEOGRAPH + \xBA\xC6 |0 # CJK UNIFIED IDEOGRAPH + \xD1\xC8 |0 # CJK UNIFIED IDEOGRAPH + \xE6\xEE |0 # CJK UNIFIED IDEOGRAPH + \xD1\xC9 |0 # CJK UNIFIED IDEOGRAPH + \xCB\xC1 |0 # CJK UNIFIED IDEOGRAPH + \xD1\xCA |0 # CJK UNIFIED IDEOGRAPH + \xD1\xCB |0 # CJK UNIFIED IDEOGRAPH + \xD1\xCC |0 # CJK UNIFIED IDEOGRAPH + \xBE\xE9 |0 # CJK UNIFIED IDEOGRAPH + \xBC\xCC |0 # CJK UNIFIED IDEOGRAPH + \xF9\xC5 |0 # CJK UNIFIED IDEOGRAPH + \xB4\xA7 |0 # CJK UNIFIED IDEOGRAPH + \xD1\xCF |0 # CJK UNIFIED IDEOGRAPH + \xD1\xCD |0 # CJK UNIFIED IDEOGRAPH + \xCC\xBD |0 # CJK UNIFIED IDEOGRAPH + \xD1\xCE |0 # CJK UNIFIED IDEOGRAPH + \xC9\xDA |0 # CJK UNIFIED IDEOGRAPH + \xD1\xD0 |0 # CJK UNIFIED IDEOGRAPH + \xD1\xD1 |0 # CJK UNIFIED IDEOGRAPH + \xD1\xD2 |0 # CJK UNIFIED IDEOGRAPH + \xC5\xDF |0 # CJK UNIFIED IDEOGRAPH + \xD1\xD6 |0 # CJK UNIFIED IDEOGRAPH + \xD1\xD4 |0 # CJK UNIFIED IDEOGRAPH + \xD1\xD5 |0 # CJK UNIFIED IDEOGRAPH + \xD1\xD3 |0 # CJK UNIFIED IDEOGRAPH + \xBA\xE3 |0 # CJK UNIFIED IDEOGRAPH + \xD1\xD7 |0 # CJK UNIFIED IDEOGRAPH + \xCC\xEA |0 # CJK UNIFIED IDEOGRAPH + \xCE\xE4 |0 # CJK UNIFIED IDEOGRAPH + \xD1\xD8 |0 # CJK UNIFIED IDEOGRAPH + \xF9\xC6 |0 # CJK UNIFIED IDEOGRAPH + \xC0\xA8 |0 # CJK UNIFIED IDEOGRAPH + \xD1\xD9 |0 # CJK UNIFIED IDEOGRAPH + \xBD\xDA |0 # CJK UNIFIED IDEOGRAPH + \xD1\xDA |0 # CJK UNIFIED IDEOGRAPH + \xC3\xFC |0 # CJK UNIFIED IDEOGRAPH + \xCE\xBF |0 # CJK UNIFIED IDEOGRAPH + \xC5\xE0 |0 # CJK UNIFIED IDEOGRAPH + \xD2\xC5 |0 # CJK UNIFIED IDEOGRAPH + \xD1\xDB |0 # CJK UNIFIED IDEOGRAPH + \xF4\xA5 |0 # CJK UNIFIED IDEOGRAPH + \xB6\xC5 |0 # CJK UNIFIED IDEOGRAPH + \xD1\xDC |0 # CJK UNIFIED IDEOGRAPH + \xCB\xDE |0 # CJK UNIFIED IDEOGRAPH + \xBD\xE8 |0 # CJK UNIFIED IDEOGRAPH + \xC2\xFC |0 # CJK UNIFIED IDEOGRAPH + \xD1\xDE |0 # CJK UNIFIED IDEOGRAPH + \xC6\xE4 |0 # CJK UNIFIED IDEOGRAPH + \xF9\xC7 |0 # CJK UNIFIED IDEOGRAPH + \xD1\xDF |0 # CJK UNIFIED IDEOGRAPH + \xD1\xE0 |0 # CJK UNIFIED IDEOGRAPH + \xB3\xAE |0 # CJK UNIFIED IDEOGRAPH + \xD1\xE1 |0 # CJK UNIFIED IDEOGRAPH + \xB6\xA7 |0 # CJK UNIFIED IDEOGRAPH + \xC6\xCC |0 # CJK UNIFIED IDEOGRAPH + \xB1\xFA |0 # CJK UNIFIED IDEOGRAPH + \xBD\xD0 |0 # CJK UNIFIED IDEOGRAPH + \xC8\xA1 |0 # CJK UNIFIED IDEOGRAPH + \xD1\xE2 |0 # CJK UNIFIED IDEOGRAPH + \xC5\xE1 |0 # CJK UNIFIED IDEOGRAPH + \xBF\xCF |0 # CJK UNIFIED IDEOGRAPH + \xD1\xE3 |0 # CJK UNIFIED IDEOGRAPH + \xCA\xAC |0 # CJK UNIFIED IDEOGRAPH + \xC0\xDA |0 # CJK UNIFIED IDEOGRAPH + \xB4\xA2 |0 # CJK UNIFIED IDEOGRAPH + \xB4\xA9 |0 # CJK UNIFIED IDEOGRAPH + \xD1\xE4 |0 # CJK UNIFIED IDEOGRAPH + \xD1\xE6 |0 # CJK UNIFIED IDEOGRAPH + \xB7\xBA |0 # CJK UNIFIED IDEOGRAPH + \xD1\xE5 |0 # CJK UNIFIED IDEOGRAPH + \xF9\xC8 |0 # CJK UNIFIED IDEOGRAPH + \xCE\xF3 |0 # CJK UNIFIED IDEOGRAPH + \xBD\xE9 |0 # CJK UNIFIED IDEOGRAPH + \xC8\xBD |0 # CJK UNIFIED IDEOGRAPH + \xCA\xCC |0 # CJK UNIFIED IDEOGRAPH + \xD1\xE7 |0 # CJK UNIFIED IDEOGRAPH + \xCD\xF8 |0 # CJK UNIFIED IDEOGRAPH + \xD1\xE8 |0 # CJK UNIFIED IDEOGRAPH + \xD1\xE9 |0 # CJK UNIFIED IDEOGRAPH + \xC5\xFE |0 # CJK UNIFIED IDEOGRAPH + \xD1\xEA |0 # CJK UNIFIED IDEOGRAPH + \xC0\xA9 |0 # CJK UNIFIED IDEOGRAPH + \xBA\xFE |0 # CJK UNIFIED IDEOGRAPH + \xB7\xF4 |0 # CJK UNIFIED IDEOGRAPH + \xD1\xEB |0 # CJK UNIFIED IDEOGRAPH + \xBB\xC9 |0 # CJK UNIFIED IDEOGRAPH + \xB9\xEF |0 # CJK UNIFIED IDEOGRAPH + \xC4\xE6 |0 # CJK UNIFIED IDEOGRAPH + \xD1\xED |0 # CJK UNIFIED IDEOGRAPH + \xC2\xA7 |0 # CJK UNIFIED IDEOGRAPH + \xBA\xEF |0 # CJK UNIFIED IDEOGRAPH + \xD1\xEE |0 # CJK UNIFIED IDEOGRAPH + \xD1\xEF |0 # CJK UNIFIED IDEOGRAPH + \xC1\xB0 |0 # CJK UNIFIED IDEOGRAPH + \xD1\xEC |0 # CJK UNIFIED IDEOGRAPH + \xD1\xF1 |0 # CJK UNIFIED IDEOGRAPH + \xCB\xB6 |0 # CJK UNIFIED IDEOGRAPH + \xB9\xE4 |0 # CJK UNIFIED IDEOGRAPH + \xD1\xF0 |0 # CJK UNIFIED IDEOGRAPH + \xB7\xF5 |0 # CJK UNIFIED IDEOGRAPH + \xBA\xDE |0 # CJK UNIFIED IDEOGRAPH + \xC7\xED |0 # CJK UNIFIED IDEOGRAPH + \xD1\xF4 |0 # CJK UNIFIED IDEOGRAPH + \xD1\xF2 |0 # CJK UNIFIED IDEOGRAPH + \xC9\xFB |0 # CJK UNIFIED IDEOGRAPH + \xBE\xEA |0 # CJK UNIFIED IDEOGRAPH + \xD1\xFB |0 # CJK UNIFIED IDEOGRAPH + \xB3\xE4 |0 # CJK UNIFIED IDEOGRAPH + \xD1\xF5 |0 # CJK UNIFIED IDEOGRAPH + \xD1\xF3 |0 # CJK UNIFIED IDEOGRAPH + \xC1\xCF |0 # CJK UNIFIED IDEOGRAPH + \xD1\xF7 |0 # CJK UNIFIED IDEOGRAPH + \xD1\xF6 |0 # CJK UNIFIED IDEOGRAPH + \xB3\xC4 |0 # CJK UNIFIED IDEOGRAPH + \xB7\xE0 |0 # CJK UNIFIED IDEOGRAPH + \xD1\xFC |0 # CJK UNIFIED IDEOGRAPH + \xCE\xAD |0 # CJK UNIFIED IDEOGRAPH + \xD1\xF8 |0 # CJK UNIFIED IDEOGRAPH + \xD1\xFD |0 # CJK UNIFIED IDEOGRAPH + \xD1\xFA |0 # CJK UNIFIED IDEOGRAPH + \xD1\xF9 |0 # CJK UNIFIED IDEOGRAPH + \xCE\xCF |0 # CJK UNIFIED IDEOGRAPH + \xF9\xC9 |0 # CJK UNIFIED IDEOGRAPH + \xB8\xF9 |0 # CJK UNIFIED IDEOGRAPH + \xB2\xC3 |0 # CJK UNIFIED IDEOGRAPH + \xCE\xF4 |0 # CJK UNIFIED IDEOGRAPH + \xF9\xCA |0 # CJK UNIFIED IDEOGRAPH + \xBD\xF5 |0 # CJK UNIFIED IDEOGRAPH + \xC5\xD8 |0 # CJK UNIFIED IDEOGRAPH + \xB9\xE5 |0 # CJK UNIFIED IDEOGRAPH + \xD2\xA2 |0 # CJK UNIFIED IDEOGRAPH + \xD2\xA3 |0 # CJK UNIFIED IDEOGRAPH + \xFB\xBC |0 # CJK UNIFIED IDEOGRAPH + \xCE\xE5 |0 # CJK UNIFIED IDEOGRAPH + \xCF\xAB |0 # CJK UNIFIED IDEOGRAPH + \xD2\xA5 |0 # CJK UNIFIED IDEOGRAPH + \xB8\xFA |0 # CJK UNIFIED IDEOGRAPH + \xD2\xA4 |0 # CJK UNIFIED IDEOGRAPH + \xB3\xAF |0 # CJK UNIFIED IDEOGRAPH + \xF9\xCB |0 # CJK UNIFIED IDEOGRAPH + \xD2\xA6 |0 # CJK UNIFIED IDEOGRAPH + \xCB\xD6 |0 # CJK UNIFIED IDEOGRAPH + \xC4\xBC |0 # CJK UNIFIED IDEOGRAPH + \xCD\xA6 |0 # CJK UNIFIED IDEOGRAPH + \xCA\xD9 |0 # CJK UNIFIED IDEOGRAPH + \xD2\xA7 |0 # CJK UNIFIED IDEOGRAPH + \xF0\xD5 |0 # CJK UNIFIED IDEOGRAPH + \xC6\xB0 |0 # CJK UNIFIED IDEOGRAPH + \xD2\xA8 |0 # CJK UNIFIED IDEOGRAPH + \xB4\xAA |0 # CJK UNIFIED IDEOGRAPH + \xCC\xB3 |0 # CJK UNIFIED IDEOGRAPH + \xF9\xCC |0 # CJK UNIFIED IDEOGRAPH + \xBE\xA1 |0 # CJK UNIFIED IDEOGRAPH + \xD2\xA9 |0 # CJK UNIFIED IDEOGRAPH + \xCA\xE7 |0 # CJK UNIFIED IDEOGRAPH + \xD2\xAD |0 # CJK UNIFIED IDEOGRAPH + \xC0\xAA |0 # CJK UNIFIED IDEOGRAPH + \xD2\xAA |0 # CJK UNIFIED IDEOGRAPH + \xB6\xD0 |0 # CJK UNIFIED IDEOGRAPH + \xD2\xAB |0 # CJK UNIFIED IDEOGRAPH + \xB4\xAB |0 # CJK UNIFIED IDEOGRAPH + \xB7\xAE |0 # CJK UNIFIED IDEOGRAPH + \xD2\xAE |0 # CJK UNIFIED IDEOGRAPH + \xD2\xAF |0 # CJK UNIFIED IDEOGRAPH + \xD2\xB0 |0 # CJK UNIFIED IDEOGRAPH + \xD2\xB1 |0 # CJK UNIFIED IDEOGRAPH + \xBC\xDB |0 # CJK UNIFIED IDEOGRAPH + \xB8\xFB |0 # CJK UNIFIED IDEOGRAPH + \xCC\xDE |0 # CJK UNIFIED IDEOGRAPH + \xF9\xCD |0 # CJK UNIFIED IDEOGRAPH + \xCC\xE8 |0 # CJK UNIFIED IDEOGRAPH + \xC6\xF7 |0 # CJK UNIFIED IDEOGRAPH + \xCA\xF1 |0 # CJK UNIFIED IDEOGRAPH + \xD2\xB2 |0 # CJK UNIFIED IDEOGRAPH + \xF9\xCE |0 # CJK UNIFIED IDEOGRAPH + \xD2\xB3 |0 # CJK UNIFIED IDEOGRAPH + \xD2\xB5 |0 # CJK UNIFIED IDEOGRAPH + \xD2\xB7 |0 # CJK UNIFIED IDEOGRAPH + \xD2\xB6 |0 # CJK UNIFIED IDEOGRAPH + \xD2\xB8 |0 # CJK UNIFIED IDEOGRAPH + \xB2\xBD |0 # CJK UNIFIED IDEOGRAPH + \xCB\xCC |0 # CJK UNIFIED IDEOGRAPH + \xBA\xFC |0 # CJK UNIFIED IDEOGRAPH + \xD2\xB9 |0 # CJK UNIFIED IDEOGRAPH + \xC1\xD9 |0 # CJK UNIFIED IDEOGRAPH + \xBE\xA2 |0 # CJK UNIFIED IDEOGRAPH + \xB6\xA9 |0 # CJK UNIFIED IDEOGRAPH + \xD2\xBA |0 # CJK UNIFIED IDEOGRAPH + \xF9\xCF |0 # CJK UNIFIED IDEOGRAPH + \xC8\xDB |0 # CJK UNIFIED IDEOGRAPH + \xD2\xBB |0 # CJK UNIFIED IDEOGRAPH + \xD2\xBC |0 # CJK UNIFIED IDEOGRAPH + \xD2\xBD |0 # CJK UNIFIED IDEOGRAPH + \xD2\xBE |0 # CJK UNIFIED IDEOGRAPH + \xC9\xA4 |0 # CJK UNIFIED IDEOGRAPH + \xB6\xE8 |0 # CJK UNIFIED IDEOGRAPH + \xB0\xE5 |0 # CJK UNIFIED IDEOGRAPH + \xC6\xBF |0 # CJK UNIFIED IDEOGRAPH + \xD2\xBF |0 # CJK UNIFIED IDEOGRAPH + \xBD\xBD |0 # CJK UNIFIED IDEOGRAPH + \xC0\xE9 |0 # CJK UNIFIED IDEOGRAPH + \xD2\xC1 |0 # CJK UNIFIED IDEOGRAPH + \xD2\xC0 |0 # CJK UNIFIED IDEOGRAPH + \xBE\xA3 |0 # CJK UNIFIED IDEOGRAPH + \xB8\xE1 |0 # CJK UNIFIED IDEOGRAPH + \xD2\xC3 |0 # CJK UNIFIED IDEOGRAPH + \xC8\xBE |0 # CJK UNIFIED IDEOGRAPH + \xD2\xC4 |0 # CJK UNIFIED IDEOGRAPH + \xC8\xDC |0 # CJK UNIFIED IDEOGRAPH + \xC2\xB4 |0 # CJK UNIFIED IDEOGRAPH + \xC2\xEE |0 # CJK UNIFIED IDEOGRAPH + \xB6\xA8 |0 # CJK UNIFIED IDEOGRAPH + \xC6\xEE |0 # CJK UNIFIED IDEOGRAPH + \xC3\xB1 |0 # CJK UNIFIED IDEOGRAPH + \xC7\xEE |0 # CJK UNIFIED IDEOGRAPH + \xCB\xCE |0 # CJK UNIFIED IDEOGRAPH + \xD2\xC6 |0 # CJK UNIFIED IDEOGRAPH + \xC0\xEA |0 # CJK UNIFIED IDEOGRAPH + \xB7\xB5 |0 # CJK UNIFIED IDEOGRAPH + \xD2\xC7 |0 # CJK UNIFIED IDEOGRAPH + \xD2\xC8 |0 # CJK UNIFIED IDEOGRAPH + \xB1\xAC |0 # CJK UNIFIED IDEOGRAPH + \xB0\xF5 |0 # CJK UNIFIED IDEOGRAPH + \xB4\xED |0 # CJK UNIFIED IDEOGRAPH + \xF9\xD0 |0 # CJK UNIFIED IDEOGRAPH + \xC2\xA8 |0 # CJK UNIFIED IDEOGRAPH + \xB5\xD1 |0 # CJK UNIFIED IDEOGRAPH + \xCD\xF1 |0 # CJK UNIFIED IDEOGRAPH + \xD2\xCB |0 # CJK UNIFIED IDEOGRAPH + \xB2\xB7 |0 # CJK UNIFIED IDEOGRAPH + \xD2\xCA |0 # CJK UNIFIED IDEOGRAPH + \xB6\xAA |0 # CJK UNIFIED IDEOGRAPH + \xD2\xCC |0 # CJK UNIFIED IDEOGRAPH + \xCC\xF1 |0 # CJK UNIFIED IDEOGRAPH + \xF9\xD1 |0 # CJK UNIFIED IDEOGRAPH + \xD2\xCD |0 # CJK UNIFIED IDEOGRAPH + \xCE\xD2 |0 # CJK UNIFIED IDEOGRAPH + \xB8\xFC |0 # CJK UNIFIED IDEOGRAPH + \xB8\xB6 |0 # CJK UNIFIED IDEOGRAPH + \xD2\xCE |0 # CJK UNIFIED IDEOGRAPH + \xD2\xD0 |0 # CJK UNIFIED IDEOGRAPH + \xD2\xCF |0 # CJK UNIFIED IDEOGRAPH + \xBF\xDF |0 # CJK UNIFIED IDEOGRAPH + \xB1\xB9 |0 # CJK UNIFIED IDEOGRAPH + \xB1\xDE |0 # CJK UNIFIED IDEOGRAPH + \xD2\xD1 |0 # CJK UNIFIED IDEOGRAPH + \xD2\xD2 |0 # CJK UNIFIED IDEOGRAPH + \xF9\xD2 |0 # CJK UNIFIED IDEOGRAPH + \xB8\xB7 |0 # CJK UNIFIED IDEOGRAPH + \xD2\xD3 |0 # CJK UNIFIED IDEOGRAPH + \xB5\xEE |0 # CJK UNIFIED IDEOGRAPH + \xBB\xB2 |0 # CJK UNIFIED IDEOGRAPH + \xD2\xD4 |0 # CJK UNIFIED IDEOGRAPH + \xCB\xF4 |0 # CJK UNIFIED IDEOGRAPH + \xBA\xB5 |0 # CJK UNIFIED IDEOGRAPH + \xB5\xDA |0 # CJK UNIFIED IDEOGRAPH + \xCD\xA7 |0 # CJK UNIFIED IDEOGRAPH + \xC1\xD0 |0 # CJK UNIFIED IDEOGRAPH + \xC8\xBF |0 # CJK UNIFIED IDEOGRAPH + \xBC\xFD |0 # CJK UNIFIED IDEOGRAPH + \xBD\xC7 |0 # CJK UNIFIED IDEOGRAPH + \xBC\xE8 |0 # CJK UNIFIED IDEOGRAPH + \xBC\xF5 |0 # CJK UNIFIED IDEOGRAPH + \xBD\xF6 |0 # CJK UNIFIED IDEOGRAPH + \xC8\xC0 |0 # CJK UNIFIED IDEOGRAPH + \xF9\xD3 |0 # CJK UNIFIED IDEOGRAPH + \xD2\xD7 |0 # CJK UNIFIED IDEOGRAPH + \xB1\xC3 |0 # CJK UNIFIED IDEOGRAPH + \xC1\xD1 |0 # CJK UNIFIED IDEOGRAPH + \xB8\xFD |0 # CJK UNIFIED IDEOGRAPH + \xB8\xC5 |0 # CJK UNIFIED IDEOGRAPH + \xB6\xE7 |0 # CJK UNIFIED IDEOGRAPH + \xD2\xDB |0 # CJK UNIFIED IDEOGRAPH + \xC3\xA1 |0 # CJK UNIFIED IDEOGRAPH + \xC2\xFE |0 # CJK UNIFIED IDEOGRAPH + \xB6\xAB |0 # CJK UNIFIED IDEOGRAPH + \xBE\xA4 |0 # CJK UNIFIED IDEOGRAPH + \xD2\xDC |0 # CJK UNIFIED IDEOGRAPH + \xD2\xDA |0 # CJK UNIFIED IDEOGRAPH + \xB2\xC4 |0 # CJK UNIFIED IDEOGRAPH + \xC2\xE6 |0 # CJK UNIFIED IDEOGRAPH + \xBC\xB8 |0 # CJK UNIFIED IDEOGRAPH + \xBB\xCB |0 # CJK UNIFIED IDEOGRAPH + \xB1\xA6 |0 # CJK UNIFIED IDEOGRAPH + \xB3\xF0 |0 # CJK UNIFIED IDEOGRAPH + \xB9\xE6 |0 # CJK UNIFIED IDEOGRAPH + \xBB\xCA |0 # CJK UNIFIED IDEOGRAPH + \xD2\xDD |0 # CJK UNIFIED IDEOGRAPH + \xD2\xDE |0 # CJK UNIFIED IDEOGRAPH + \xB5\xC9 |0 # CJK UNIFIED IDEOGRAPH + \xB3\xC6 |0 # CJK UNIFIED IDEOGRAPH + \xB9\xE7 |0 # CJK UNIFIED IDEOGRAPH + \xB5\xC8 |0 # CJK UNIFIED IDEOGRAPH + \xC4\xDF |0 # CJK UNIFIED IDEOGRAPH + \xB1\xA5 |0 # CJK UNIFIED IDEOGRAPH + \xC6\xB1 |0 # CJK UNIFIED IDEOGRAPH + \xCC\xBE |0 # CJK UNIFIED IDEOGRAPH + \xB9\xA1 |0 # CJK UNIFIED IDEOGRAPH + \xCD\xF9 |0 # CJK UNIFIED IDEOGRAPH + \xC5\xC7 |0 # CJK UNIFIED IDEOGRAPH + \xB8\xFE |0 # CJK UNIFIED IDEOGRAPH + \xB7\xAF |0 # CJK UNIFIED IDEOGRAPH + \xD2\xE7 |0 # CJK UNIFIED IDEOGRAPH + \xB6\xE3 |0 # CJK UNIFIED IDEOGRAPH + \xCB\xCA |0 # CJK UNIFIED IDEOGRAPH + \xC8\xDD |0 # CJK UNIFIED IDEOGRAPH + \xD2\xE6 |0 # CJK UNIFIED IDEOGRAPH + \xB4\xDE |0 # CJK UNIFIED IDEOGRAPH + \xD2\xE1 |0 # CJK UNIFIED IDEOGRAPH + \xD2\xE2 |0 # CJK UNIFIED IDEOGRAPH + \xD2\xE4 |0 # CJK UNIFIED IDEOGRAPH + \xD2\xE5 |0 # CJK UNIFIED IDEOGRAPH + \xB5\xDB |0 # CJK UNIFIED IDEOGRAPH + \xBF\xE1 |0 # CJK UNIFIED IDEOGRAPH + \xCA\xAD |0 # CJK UNIFIED IDEOGRAPH + \xD2\xE3 |0 # CJK UNIFIED IDEOGRAPH + \xD2\xDF |0 # CJK UNIFIED IDEOGRAPH + \xB8\xE3 |0 # CJK UNIFIED IDEOGRAPH + \xD2\xE0 |0 # CJK UNIFIED IDEOGRAPH + \xCF\xA4 |0 # CJK UNIFIED IDEOGRAPH + \xCA\xF2 |0 # CJK UNIFIED IDEOGRAPH + \xC4\xE8 |0 # CJK UNIFIED IDEOGRAPH + \xB8\xE2 |0 # CJK UNIFIED IDEOGRAPH + \xB9\xF0 |0 # CJK UNIFIED IDEOGRAPH + \xD2\xE8 |0 # CJK UNIFIED IDEOGRAPH + \xC6\xDD |0 # CJK UNIFIED IDEOGRAPH + \xD2\xEC |0 # CJK UNIFIED IDEOGRAPH + \xBC\xFE |0 # CJK UNIFIED IDEOGRAPH + \xBC\xF6 |0 # CJK UNIFIED IDEOGRAPH + \xD2\xEF |0 # CJK UNIFIED IDEOGRAPH + \xD2\xED |0 # CJK UNIFIED IDEOGRAPH + \xCC\xA3 |0 # CJK UNIFIED IDEOGRAPH + \xD2\xEA |0 # CJK UNIFIED IDEOGRAPH + \xD2\xF3 |0 # CJK UNIFIED IDEOGRAPH + \xD2\xEE |0 # CJK UNIFIED IDEOGRAPH + \xD2\xF1 |0 # CJK UNIFIED IDEOGRAPH + \xB8\xC6 |0 # CJK UNIFIED IDEOGRAPH + \xCC\xBF |0 # CJK UNIFIED IDEOGRAPH + \xD2\xF2 |0 # CJK UNIFIED IDEOGRAPH + \xD2\xF4 |0 # CJK UNIFIED IDEOGRAPH + \xD2\xF6 |0 # CJK UNIFIED IDEOGRAPH + \xF9\xD6 |0 # CJK UNIFIED IDEOGRAPH + \xBA\xF0 |0 # CJK UNIFIED IDEOGRAPH + \xCF\xC2 |0 # CJK UNIFIED IDEOGRAPH + \xD2\xEB |0 # CJK UNIFIED IDEOGRAPH + \xD2\xE9 |0 # CJK UNIFIED IDEOGRAPH + \xD2\xF5 |0 # CJK UNIFIED IDEOGRAPH + \xD2\xF0 |0 # CJK UNIFIED IDEOGRAPH + \xF9\xD5 |0 # CJK UNIFIED IDEOGRAPH + \xD2\xF8 |0 # CJK UNIFIED IDEOGRAPH + \xD3\xA3 |0 # CJK UNIFIED IDEOGRAPH + \xD2\xFA |0 # CJK UNIFIED IDEOGRAPH + \xD2\xFE |0 # CJK UNIFIED IDEOGRAPH + \xF9\xD7 |0 # CJK UNIFIED IDEOGRAPH + \xD3\xA1 |0 # CJK UNIFIED IDEOGRAPH + \xD2\xFB |0 # CJK UNIFIED IDEOGRAPH + \xD3\xBE |0 # CJK UNIFIED IDEOGRAPH + \xBA\xE9 |0 # CJK UNIFIED IDEOGRAPH + \xB3\xB1 |0 # CJK UNIFIED IDEOGRAPH + \xD2\xF9 |0 # CJK UNIFIED IDEOGRAPH + \xD3\xA5 |0 # CJK UNIFIED IDEOGRAPH + \xB0\xF6 |0 # CJK UNIFIED IDEOGRAPH + \xD3\xA4 |0 # CJK UNIFIED IDEOGRAPH + \xB0\xA5 |0 # CJK UNIFIED IDEOGRAPH + \xC9\xCA |0 # CJK UNIFIED IDEOGRAPH + \xD3\xA2 |0 # CJK UNIFIED IDEOGRAPH + \xD2\xFC |0 # CJK UNIFIED IDEOGRAPH + \xD2\xF7 |0 # CJK UNIFIED IDEOGRAPH + \xD2\xFD |0 # CJK UNIFIED IDEOGRAPH + \xBA\xC8 |0 # CJK UNIFIED IDEOGRAPH + \xD3\xA6 |0 # CJK UNIFIED IDEOGRAPH + \xB0\xF7 |0 # CJK UNIFIED IDEOGRAPH + \xD3\xAF |0 # CJK UNIFIED IDEOGRAPH + \xD3\xA7 |0 # CJK UNIFIED IDEOGRAPH + \xD3\xA8 |0 # CJK UNIFIED IDEOGRAPH + \xBE\xA5 |0 # CJK UNIFIED IDEOGRAPH + \xCB\xE9 |0 # CJK UNIFIED IDEOGRAPH + \xD3\xAD |0 # CJK UNIFIED IDEOGRAPH + \xD3\xAC |0 # CJK UNIFIED IDEOGRAPH + \xC5\xAF |0 # CJK UNIFIED IDEOGRAPH + \xD3\xAE |0 # CJK UNIFIED IDEOGRAPH + \xD3\xAB |0 # CJK UNIFIED IDEOGRAPH + \xF9\xD8 |0 # CJK UNIFIED IDEOGRAPH + \xB1\xB4 |0 # CJK UNIFIED IDEOGRAPH + \xBA\xB6 |0 # CJK UNIFIED IDEOGRAPH + \xBF\xB0 |0 # CJK UNIFIED IDEOGRAPH + \xD3\xA9 |0 # CJK UNIFIED IDEOGRAPH + \xC5\xE2 |0 # CJK UNIFIED IDEOGRAPH + \xD3\xAA |0 # CJK UNIFIED IDEOGRAPH + \xB0\xA2 |0 # CJK UNIFIED IDEOGRAPH + \xD3\xB4 |0 # CJK UNIFIED IDEOGRAPH + \xCD\xA3 |0 # CJK UNIFIED IDEOGRAPH + \xBE\xA7 |0 # CJK UNIFIED IDEOGRAPH + \xD3\xBA |0 # CJK UNIFIED IDEOGRAPH + \xD3\xB9 |0 # CJK UNIFIED IDEOGRAPH + \xD3\xB0 |0 # CJK UNIFIED IDEOGRAPH + \xC2\xC3 |0 # CJK UNIFIED IDEOGRAPH + \xD3\xB1 |0 # CJK UNIFIED IDEOGRAPH + \xC2\xEF |0 # CJK UNIFIED IDEOGRAPH + \xD3\xB6 |0 # CJK UNIFIED IDEOGRAPH + \xBE\xA6 |0 # CJK UNIFIED IDEOGRAPH + \xD3\xB3 |0 # CJK UNIFIED IDEOGRAPH + \xCC\xE4 |0 # CJK UNIFIED IDEOGRAPH + \xB7\xBC |0 # CJK UNIFIED IDEOGRAPH + \xD3\xB7 |0 # CJK UNIFIED IDEOGRAPH + \xD3\xB8 |0 # CJK UNIFIED IDEOGRAPH + \xD3\xB5 |0 # CJK UNIFIED IDEOGRAPH + \xD3\xBB |0 # CJK UNIFIED IDEOGRAPH + \xD3\xB2 |0 # CJK UNIFIED IDEOGRAPH + \xD3\xC1 |0 # CJK UNIFIED IDEOGRAPH + \xD3\xC6 |0 # CJK UNIFIED IDEOGRAPH + \xD3\xC2 |0 # CJK UNIFIED IDEOGRAPH + \xD3\xBD |0 # CJK UNIFIED IDEOGRAPH + \xD3\xC7 |0 # CJK UNIFIED IDEOGRAPH + \xC1\xB1 |0 # CJK UNIFIED IDEOGRAPH + \xF9\xD9 |0 # CJK UNIFIED IDEOGRAPH + \xD3\xC9 |0 # CJK UNIFIED IDEOGRAPH + \xB9\xA2 |0 # CJK UNIFIED IDEOGRAPH + \xD3\xBF |0 # CJK UNIFIED IDEOGRAPH + \xC3\xFD |0 # CJK UNIFIED IDEOGRAPH + \xD3\xC3 |0 # CJK UNIFIED IDEOGRAPH + \xD3\xBC |0 # CJK UNIFIED IDEOGRAPH + \xB4\xAD |0 # CJK UNIFIED IDEOGRAPH + \xB4\xEE |0 # CJK UNIFIED IDEOGRAPH + \xB3\xE5 |0 # CJK UNIFIED IDEOGRAPH + \xD3\xC4 |0 # CJK UNIFIED IDEOGRAPH + \xD3\xC0 |0 # CJK UNIFIED IDEOGRAPH + \xB7\xF6 |0 # CJK UNIFIED IDEOGRAPH + \xD3\xCA |0 # CJK UNIFIED IDEOGRAPH + \xD3\xC8 |0 # CJK UNIFIED IDEOGRAPH + \xC1\xD3 |0 # CJK UNIFIED IDEOGRAPH + \xB5\xCA |0 # CJK UNIFIED IDEOGRAPH + \xB6\xAC |0 # CJK UNIFIED IDEOGRAPH + \xD3\xC5 |0 # CJK UNIFIED IDEOGRAPH + \xB6\xF4 |0 # CJK UNIFIED IDEOGRAPH + \xB1\xC4 |0 # CJK UNIFIED IDEOGRAPH + \xD3\xCE |0 # CJK UNIFIED IDEOGRAPH + \xD3\xCC |0 # CJK UNIFIED IDEOGRAPH + \xD4\xA7 |0 # CJK UNIFIED IDEOGRAPH + \xD3\xD1 |0 # CJK UNIFIED IDEOGRAPH + \xD3\xCB |0 # CJK UNIFIED IDEOGRAPH + \xD3\xCF |0 # CJK UNIFIED IDEOGRAPH + \xD3\xCD |0 # CJK UNIFIED IDEOGRAPH + \xBB\xCC |0 # CJK UNIFIED IDEOGRAPH + \xD3\xD0 |0 # CJK UNIFIED IDEOGRAPH + \xD3\xD3 |0 # CJK UNIFIED IDEOGRAPH + \xD3\xD8 |0 # CJK UNIFIED IDEOGRAPH + \xD3\xD6 |0 # CJK UNIFIED IDEOGRAPH + \xD3\xD5 |0 # CJK UNIFIED IDEOGRAPH + \xC3\xB2 |0 # CJK UNIFIED IDEOGRAPH + \xB2\xC5 |0 # CJK UNIFIED IDEOGRAPH + \xD3\xD2 |0 # CJK UNIFIED IDEOGRAPH + \xD3\xD4 |0 # CJK UNIFIED IDEOGRAPH + \xBE\xA8 |0 # CJK UNIFIED IDEOGRAPH + \xB1\xB3 |0 # CJK UNIFIED IDEOGRAPH + \xD3\xD7 |0 # CJK UNIFIED IDEOGRAPH + \xB2\xDE |0 # CJK UNIFIED IDEOGRAPH + \xD3\xE2 |0 # CJK UNIFIED IDEOGRAPH + \xBE\xFC |0 # CJK UNIFIED IDEOGRAPH + \xD3\xDE |0 # CJK UNIFIED IDEOGRAPH + \xD3\xDC |0 # CJK UNIFIED IDEOGRAPH + \xD3\xDD |0 # CJK UNIFIED IDEOGRAPH + \xD3\xDF |0 # CJK UNIFIED IDEOGRAPH + \xB1\xBD |0 # CJK UNIFIED IDEOGRAPH + \xC1\xB9 |0 # CJK UNIFIED IDEOGRAPH + \xD3\xD9 |0 # CJK UNIFIED IDEOGRAPH + \xD3\xDA |0 # CJK UNIFIED IDEOGRAPH + \xB3\xFA |0 # CJK UNIFIED IDEOGRAPH + \xD3\xE1 |0 # CJK UNIFIED IDEOGRAPH + \xB4\xEF |0 # CJK UNIFIED IDEOGRAPH + \xD3\xE4 |0 # CJK UNIFIED IDEOGRAPH + \xD3\xE0 |0 # CJK UNIFIED IDEOGRAPH + \xD3\xE3 |0 # CJK UNIFIED IDEOGRAPH + \xCA\xAE |0 # CJK UNIFIED IDEOGRAPH + \xC6\xD5 |0 # CJK UNIFIED IDEOGRAPH + \xC8\xB8 |0 # CJK UNIFIED IDEOGRAPH + \xD3\xE6 |0 # CJK UNIFIED IDEOGRAPH + \xD3\xE5 |0 # CJK UNIFIED IDEOGRAPH + \xB3\xC5 |0 # CJK UNIFIED IDEOGRAPH + \xD3\xE7 |0 # CJK UNIFIED IDEOGRAPH + \xD3\xEA |0 # CJK UNIFIED IDEOGRAPH + \xD3\xE9 |0 # CJK UNIFIED IDEOGRAPH + \xD3\xE8 |0 # CJK UNIFIED IDEOGRAPH + \xC7\xB9 |0 # CJK UNIFIED IDEOGRAPH + \xD3\xEB |0 # CJK UNIFIED IDEOGRAPH + \xD3\xEC |0 # CJK UNIFIED IDEOGRAPH + \xD3\xEE |0 # CJK UNIFIED IDEOGRAPH + \xD3\xED |0 # CJK UNIFIED IDEOGRAPH + \xD3\xF0 |0 # CJK UNIFIED IDEOGRAPH + \xD3\xF3 |0 # CJK UNIFIED IDEOGRAPH + \xD3\xF1 |0 # CJK UNIFIED IDEOGRAPH + \xD3\xEF |0 # CJK UNIFIED IDEOGRAPH + \xD3\xF2 |0 # CJK UNIFIED IDEOGRAPH + \xD3\xF4 |0 # CJK UNIFIED IDEOGRAPH + \xD3\xF5 |0 # CJK UNIFIED IDEOGRAPH + \xD3\xF6 |0 # CJK UNIFIED IDEOGRAPH + \xD3\xF7 |0 # CJK UNIFIED IDEOGRAPH + \xD3\xF8 |0 # CJK UNIFIED IDEOGRAPH + \xD1\xC5 |0 # CJK UNIFIED IDEOGRAPH + \xBC\xFC |0 # CJK UNIFIED IDEOGRAPH + \xBB\xCD |0 # CJK UNIFIED IDEOGRAPH + \xB2\xF3 |0 # CJK UNIFIED IDEOGRAPH + \xB0\xF8 |0 # CJK UNIFIED IDEOGRAPH + \xC3\xC4 |0 # CJK UNIFIED IDEOGRAPH + \xD3\xF9 |0 # CJK UNIFIED IDEOGRAPH + \xBA\xA4 |0 # CJK UNIFIED IDEOGRAPH + \xB0\xCF |0 # CJK UNIFIED IDEOGRAPH + \xBF\xDE |0 # CJK UNIFIED IDEOGRAPH + \xD3\xFA |0 # CJK UNIFIED IDEOGRAPH + \xB8\xC7 |0 # CJK UNIFIED IDEOGRAPH + \xB9\xF1 |0 # CJK UNIFIED IDEOGRAPH + \xD3\xFC |0 # CJK UNIFIED IDEOGRAPH + \xD3\xFB |0 # CJK UNIFIED IDEOGRAPH + \xCA\xE0 |0 # CJK UNIFIED IDEOGRAPH + \xD3\xFD |0 # CJK UNIFIED IDEOGRAPH + \xD4\xA1 |0 # CJK UNIFIED IDEOGRAPH + \xD3\xFE |0 # CJK UNIFIED IDEOGRAPH + \xD4\xA2 |0 # CJK UNIFIED IDEOGRAPH + \xD4\xA3 |0 # CJK UNIFIED IDEOGRAPH + \xB7\xF7 |0 # CJK UNIFIED IDEOGRAPH + \xB1\xE0 |0 # CJK UNIFIED IDEOGRAPH + \xD4\xA4 |0 # CJK UNIFIED IDEOGRAPH + \xD4\xA6 |0 # CJK UNIFIED IDEOGRAPH + \xD4\xA5 |0 # CJK UNIFIED IDEOGRAPH + \xD4\xA8 |0 # CJK UNIFIED IDEOGRAPH + \xC5\xDA |0 # CJK UNIFIED IDEOGRAPH + \xD4\xA9 |0 # CJK UNIFIED IDEOGRAPH + \xB0\xB5 |0 # CJK UNIFIED IDEOGRAPH + \xBA\xDF |0 # CJK UNIFIED IDEOGRAPH + \xB7\xBD |0 # CJK UNIFIED IDEOGRAPH + \xC3\xCF |0 # CJK UNIFIED IDEOGRAPH + \xD4\xAA |0 # CJK UNIFIED IDEOGRAPH + \xD4\xAB |0 # CJK UNIFIED IDEOGRAPH + \xD4\xAD |0 # CJK UNIFIED IDEOGRAPH + \xD4\xAE |0 # CJK UNIFIED IDEOGRAPH + \xBA\xE4 |0 # CJK UNIFIED IDEOGRAPH + \xB6\xD1 |0 # CJK UNIFIED IDEOGRAPH + \xCB\xB7 |0 # CJK UNIFIED IDEOGRAPH + \xD4\xAC |0 # CJK UNIFIED IDEOGRAPH + \xD4\xAF |0 # CJK UNIFIED IDEOGRAPH + \xBA\xC1 |0 # CJK UNIFIED IDEOGRAPH + \xB9\xA3 |0 # CJK UNIFIED IDEOGRAPH + \xF9\xDA |0 # CJK UNIFIED IDEOGRAPH + \xD4\xB3 |0 # CJK UNIFIED IDEOGRAPH + \xBA\xA5 |0 # CJK UNIFIED IDEOGRAPH + \xF9\xDB |0 # CJK UNIFIED IDEOGRAPH + \xC3\xB3 |0 # CJK UNIFIED IDEOGRAPH + \xD4\xB0 |0 # CJK UNIFIED IDEOGRAPH + \xC4\xDA |0 # CJK UNIFIED IDEOGRAPH + \xD4\xB4 |0 # CJK UNIFIED IDEOGRAPH + \xBF\xE2 |0 # CJK UNIFIED IDEOGRAPH + \xD4\xB2 |0 # CJK UNIFIED IDEOGRAPH + \xD4\xB5 |0 # CJK UNIFIED IDEOGRAPH + \xB7\xBF |0 # CJK UNIFIED IDEOGRAPH + \xD4\xB6 |0 # CJK UNIFIED IDEOGRAPH + \xD4\xB7 |0 # CJK UNIFIED IDEOGRAPH + \xB9\xA4 |0 # CJK UNIFIED IDEOGRAPH + \xB3\xC0 |0 # CJK UNIFIED IDEOGRAPH + \xD4\xB9 |0 # CJK UNIFIED IDEOGRAPH + \xD4\xBA |0 # CJK UNIFIED IDEOGRAPH + \xF9\xDC |0 # CJK UNIFIED IDEOGRAPH + \xD4\xBB |0 # CJK UNIFIED IDEOGRAPH + \xD4\xB8 |0 # CJK UNIFIED IDEOGRAPH + \xD4\xB1 |0 # CJK UNIFIED IDEOGRAPH + \xD4\xBC |0 # CJK UNIFIED IDEOGRAPH + \xD4\xBD |0 # CJK UNIFIED IDEOGRAPH + \xF9\xDE |0 # CJK UNIFIED IDEOGRAPH + \xF9\xDD |0 # CJK UNIFIED IDEOGRAPH + \xCB\xE4 |0 # CJK UNIFIED IDEOGRAPH + \xBE\xEB |0 # CJK UNIFIED IDEOGRAPH + \xD4\xBF |0 # CJK UNIFIED IDEOGRAPH + \xD4\xC0 |0 # CJK UNIFIED IDEOGRAPH + \xD4\xBE |0 # CJK UNIFIED IDEOGRAPH + \xD4\xC2 |0 # CJK UNIFIED IDEOGRAPH + \xC7\xB8 |0 # CJK UNIFIED IDEOGRAPH + \xB0\xE8 |0 # CJK UNIFIED IDEOGRAPH + \xC9\xD6 |0 # CJK UNIFIED IDEOGRAPH + \xD4\xC3 |0 # CJK UNIFIED IDEOGRAPH + \xBE\xFD |0 # CJK UNIFIED IDEOGRAPH + \xBC\xB9 |0 # CJK UNIFIED IDEOGRAPH + \xC7\xDD |0 # CJK UNIFIED IDEOGRAPH + \xB4\xF0 |0 # CJK UNIFIED IDEOGRAPH + \xBA\xEB |0 # CJK UNIFIED IDEOGRAPH + \xCB\xD9 |0 # CJK UNIFIED IDEOGRAPH + \xC6\xB2 |0 # CJK UNIFIED IDEOGRAPH + \xB7\xF8 |0 # CJK UNIFIED IDEOGRAPH + \xC2\xCF |0 # CJK UNIFIED IDEOGRAPH + \xD4\xC1 |0 # CJK UNIFIED IDEOGRAPH + \xD4\xC4 |0 # CJK UNIFIED IDEOGRAPH + \xC2\xC4 |0 # CJK UNIFIED IDEOGRAPH + \xD4\xC5 |0 # CJK UNIFIED IDEOGRAPH + \xD4\xC6 |0 # CJK UNIFIED IDEOGRAPH + \xD4\xC8 |0 # CJK UNIFIED IDEOGRAPH + \xC4\xE9 |0 # CJK UNIFIED IDEOGRAPH + \xB4\xAE |0 # CJK UNIFIED IDEOGRAPH + \xF4\xA1 |0 # CJK UNIFIED IDEOGRAPH + \xB1\xE1 |0 # CJK UNIFIED IDEOGRAPH + \xCA\xF3 |0 # CJK UNIFIED IDEOGRAPH + \xBE\xEC |0 # CJK UNIFIED IDEOGRAPH + \xC5\xC8 |0 # CJK UNIFIED IDEOGRAPH + \xBA\xE6 |0 # CJK UNIFIED IDEOGRAPH + \xD4\xCE |0 # CJK UNIFIED IDEOGRAPH + \xCA\xBD |0 # CJK UNIFIED IDEOGRAPH + \xCE\xDD |0 # CJK UNIFIED IDEOGRAPH + \xB2\xF4 |0 # CJK UNIFIED IDEOGRAPH + \xD4\xCA |0 # CJK UNIFIED IDEOGRAPH + \xC1\xBA |0 # CJK UNIFIED IDEOGRAPH + \xD4\xCD |0 # CJK UNIFIED IDEOGRAPH + \xC5\xE3 |0 # CJK UNIFIED IDEOGRAPH + \xC5\xC9 |0 # CJK UNIFIED IDEOGRAPH + \xC5\xE4 |0 # CJK UNIFIED IDEOGRAPH + \xC8\xB9 |0 # CJK UNIFIED IDEOGRAPH + \xC4\xCD |0 # CJK UNIFIED IDEOGRAPH + \xBA\xC9 |0 # CJK UNIFIED IDEOGRAPH + \xD4\xC9 |0 # CJK UNIFIED IDEOGRAPH + \xB1\xF6 |0 # CJK UNIFIED IDEOGRAPH + \xC5\xB6 |0 # CJK UNIFIED IDEOGRAPH + \xD4\xCB |0 # CJK UNIFIED IDEOGRAPH + \xD4\xC7 |0 # CJK UNIFIED IDEOGRAPH + \xBF\xD0 |0 # CJK UNIFIED IDEOGRAPH + \xD4\xCF |0 # CJK UNIFIED IDEOGRAPH + \xBD\xCE |0 # CJK UNIFIED IDEOGRAPH + \xB6\xAD |0 # CJK UNIFIED IDEOGRAPH + \xD4\xD0 |0 # CJK UNIFIED IDEOGRAPH + \xCA\xE8 |0 # CJK UNIFIED IDEOGRAPH + \xC1\xFD |0 # CJK UNIFIED IDEOGRAPH + \xC4\xC6 |0 # CJK UNIFIED IDEOGRAPH + \xF9\xE1 |0 # CJK UNIFIED IDEOGRAPH + \xD4\xD2 |0 # CJK UNIFIED IDEOGRAPH + \xCB\xCF |0 # CJK UNIFIED IDEOGRAPH + \xD4\xD3 |0 # CJK UNIFIED IDEOGRAPH + \xD4\xD8 |0 # CJK UNIFIED IDEOGRAPH + \xF9\xE2 |0 # CJK UNIFIED IDEOGRAPH + \xCA\xAF |0 # CJK UNIFIED IDEOGRAPH + \xD4\xD7 |0 # CJK UNIFIED IDEOGRAPH + \xD4\xD1 |0 # CJK UNIFIED IDEOGRAPH + \xD4\xD4 |0 # CJK UNIFIED IDEOGRAPH + \xD4\xD6 |0 # CJK UNIFIED IDEOGRAPH + \xBA\xA6 |0 # CJK UNIFIED IDEOGRAPH + \xCA\xC9 |0 # CJK UNIFIED IDEOGRAPH + \xD4\xD9 |0 # CJK UNIFIED IDEOGRAPH + \xC3\xC5 |0 # CJK UNIFIED IDEOGRAPH + \xB2\xF5 |0 # CJK UNIFIED IDEOGRAPH + \xBE\xED |0 # CJK UNIFIED IDEOGRAPH + \xD4\xDB |0 # CJK UNIFIED IDEOGRAPH + \xD4\xDA |0 # CJK UNIFIED IDEOGRAPH + \xB9\xE8 |0 # CJK UNIFIED IDEOGRAPH + \xD4\xDC |0 # CJK UNIFIED IDEOGRAPH + \xD4\xDE |0 # CJK UNIFIED IDEOGRAPH + \xD4\xDD |0 # CJK UNIFIED IDEOGRAPH + \xD4\xE0 |0 # CJK UNIFIED IDEOGRAPH + \xD4\xD5 |0 # CJK UNIFIED IDEOGRAPH + \xD4\xE2 |0 # CJK UNIFIED IDEOGRAPH + \xD4\xE1 |0 # CJK UNIFIED IDEOGRAPH + \xD4\xDF |0 # CJK UNIFIED IDEOGRAPH + \xBB\xCE |0 # CJK UNIFIED IDEOGRAPH + \xBF\xD1 |0 # CJK UNIFIED IDEOGRAPH + \xC1\xD4 |0 # CJK UNIFIED IDEOGRAPH + \xD4\xE3 |0 # CJK UNIFIED IDEOGRAPH + \xC0\xBC |0 # CJK UNIFIED IDEOGRAPH + \xB0\xED |0 # CJK UNIFIED IDEOGRAPH + \xC7\xE4 |0 # CJK UNIFIED IDEOGRAPH + \xC4\xDB |0 # CJK UNIFIED IDEOGRAPH + \xD4\xE5 |0 # CJK UNIFIED IDEOGRAPH + \xD4\xE4 |0 # CJK UNIFIED IDEOGRAPH + \xD4\xE6 |0 # CJK UNIFIED IDEOGRAPH + \xD4\xE7 |0 # CJK UNIFIED IDEOGRAPH + \xD4\xE8 |0 # CJK UNIFIED IDEOGRAPH + \xD4\xE9 |0 # CJK UNIFIED IDEOGRAPH + \xCA\xD1 |0 # CJK UNIFIED IDEOGRAPH + \xD4\xEA |0 # CJK UNIFIED IDEOGRAPH + \xF9\xE3 |0 # CJK UNIFIED IDEOGRAPH + \xB2\xC6 |0 # CJK UNIFIED IDEOGRAPH + \xD4\xEB |0 # CJK UNIFIED IDEOGRAPH + \xCD\xBC |0 # CJK UNIFIED IDEOGRAPH + \xB3\xB0 |0 # CJK UNIFIED IDEOGRAPH + \xD2\xC9 |0 # CJK UNIFIED IDEOGRAPH + \xBD\xC8 |0 # CJK UNIFIED IDEOGRAPH + \xC2\xBF |0 # CJK UNIFIED IDEOGRAPH + \xD4\xEC |0 # CJK UNIFIED IDEOGRAPH + \xCC\xEB |0 # CJK UNIFIED IDEOGRAPH + \xCC\xB4 |0 # CJK UNIFIED IDEOGRAPH + \xD4\xEE |0 # CJK UNIFIED IDEOGRAPH + \xC2\xE7 |0 # CJK UNIFIED IDEOGRAPH + \xC5\xB7 |0 # CJK UNIFIED IDEOGRAPH + \xC2\xC0 |0 # CJK UNIFIED IDEOGRAPH + \xC9\xD7 |0 # CJK UNIFIED IDEOGRAPH + \xD4\xEF |0 # CJK UNIFIED IDEOGRAPH + \xD4\xF0 |0 # CJK UNIFIED IDEOGRAPH + \xB1\xFB |0 # CJK UNIFIED IDEOGRAPH + \xBC\xBA |0 # CJK UNIFIED IDEOGRAPH + \xD4\xF1 |0 # CJK UNIFIED IDEOGRAPH + \xB0\xD0 |0 # CJK UNIFIED IDEOGRAPH + \xD4\xF2 |0 # CJK UNIFIED IDEOGRAPH + \xD4\xF3 |0 # CJK UNIFIED IDEOGRAPH + \xB1\xE2 |0 # CJK UNIFIED IDEOGRAPH + \xB4\xF1 |0 # CJK UNIFIED IDEOGRAPH + \xC6\xE0 |0 # CJK UNIFIED IDEOGRAPH + \xCA\xF4 |0 # CJK UNIFIED IDEOGRAPH + \xD4\xF7 |0 # CJK UNIFIED IDEOGRAPH + \xC1\xD5 |0 # CJK UNIFIED IDEOGRAPH + \xD4\xF6 |0 # CJK UNIFIED IDEOGRAPH + \xB7\xC0 |0 # CJK UNIFIED IDEOGRAPH + \xF9\xE4 |0 # CJK UNIFIED IDEOGRAPH + \xCB\xDB |0 # CJK UNIFIED IDEOGRAPH + \xD4\xF5 |0 # CJK UNIFIED IDEOGRAPH + \xC5\xE5 |0 # CJK UNIFIED IDEOGRAPH + \xD4\xF9 |0 # CJK UNIFIED IDEOGRAPH + \xD4\xF8 |0 # CJK UNIFIED IDEOGRAPH + \xF9\xE5 |0 # CJK UNIFIED IDEOGRAPH + \xF9\xE6 |0 # CJK UNIFIED IDEOGRAPH + \xD4\xFB |0 # CJK UNIFIED IDEOGRAPH + \xD4\xFA |0 # CJK UNIFIED IDEOGRAPH + \xF9\xE7 |0 # CJK UNIFIED IDEOGRAPH + \xB1\xFC |0 # CJK UNIFIED IDEOGRAPH + \xD4\xFC |0 # CJK UNIFIED IDEOGRAPH + \xBE\xA9 |0 # CJK UNIFIED IDEOGRAPH + \xD4\xFE |0 # CJK UNIFIED IDEOGRAPH + \xC3\xA5 |0 # CJK UNIFIED IDEOGRAPH + \xD4\xFD |0 # CJK UNIFIED IDEOGRAPH + \xCA\xB3 |0 # CJK UNIFIED IDEOGRAPH + \xBD\xF7 |0 # CJK UNIFIED IDEOGRAPH + \xC5\xDB |0 # CJK UNIFIED IDEOGRAPH + \xD5\xA1 |0 # CJK UNIFIED IDEOGRAPH + \xB9\xA5 |0 # CJK UNIFIED IDEOGRAPH + \xD5\xA2 |0 # CJK UNIFIED IDEOGRAPH + \xC7\xA1 |0 # CJK UNIFIED IDEOGRAPH + \xC8\xDE |0 # CJK UNIFIED IDEOGRAPH + \xCC\xD1 |0 # CJK UNIFIED IDEOGRAPH + \xC7\xA5 |0 # CJK UNIFIED IDEOGRAPH + \xD5\xAB |0 # CJK UNIFIED IDEOGRAPH + \xB5\xB8 |0 # CJK UNIFIED IDEOGRAPH + \xCD\xC5 |0 # CJK UNIFIED IDEOGRAPH + \xCC\xAF |0 # CJK UNIFIED IDEOGRAPH + \xD6\xAC |0 # CJK UNIFIED IDEOGRAPH + \xD5\xA3 |0 # CJK UNIFIED IDEOGRAPH + \xD5\xA6 |0 # CJK UNIFIED IDEOGRAPH + \xF9\xE8 |0 # CJK UNIFIED IDEOGRAPH + \xC2\xC5 |0 # CJK UNIFIED IDEOGRAPH + \xCB\xB8 |0 # CJK UNIFIED IDEOGRAPH + \xC5\xCA |0 # CJK UNIFIED IDEOGRAPH + \xD5\xA7 |0 # CJK UNIFIED IDEOGRAPH + \xCB\xE5 |0 # CJK UNIFIED IDEOGRAPH + \xF9\xE9 |0 # CJK UNIFIED IDEOGRAPH + \xBA\xCA |0 # CJK UNIFIED IDEOGRAPH + \xBE\xAA |0 # CJK UNIFIED IDEOGRAPH + \xD5\xA8 |0 # CJK UNIFIED IDEOGRAPH + \xBB\xD0 |0 # CJK UNIFIED IDEOGRAPH + \xBB\xCF |0 # CJK UNIFIED IDEOGRAPH + \xB0\xB9 |0 # CJK UNIFIED IDEOGRAPH + \xB8\xC8 |0 # CJK UNIFIED IDEOGRAPH + \xC0\xAB |0 # CJK UNIFIED IDEOGRAPH + \xB0\xD1 |0 # CJK UNIFIED IDEOGRAPH + \xD5\xAC |0 # CJK UNIFIED IDEOGRAPH + \xD5\xAD |0 # CJK UNIFIED IDEOGRAPH + \xD5\xAA |0 # CJK UNIFIED IDEOGRAPH + \xB1\xB8 |0 # CJK UNIFIED IDEOGRAPH + \xB4\xAF |0 # CJK UNIFIED IDEOGRAPH + \xD5\xA9 |0 # CJK UNIFIED IDEOGRAPH + \xCC\xC5 |0 # CJK UNIFIED IDEOGRAPH + \xC9\xB1 |0 # CJK UNIFIED IDEOGRAPH + \xB0\xA8 |0 # CJK UNIFIED IDEOGRAPH + \xB0\xF9 |0 # CJK UNIFIED IDEOGRAPH + \xBB\xD1 |0 # CJK UNIFIED IDEOGRAPH + \xB0\xD2 |0 # CJK UNIFIED IDEOGRAPH + \xB0\xA3 |0 # CJK UNIFIED IDEOGRAPH + \xD5\xB2 |0 # CJK UNIFIED IDEOGRAPH + \xD5\xB0 |0 # CJK UNIFIED IDEOGRAPH + \xCC\xBC |0 # CJK UNIFIED IDEOGRAPH + \xD5\xB3 |0 # CJK UNIFIED IDEOGRAPH + \xD5\xB1 |0 # CJK UNIFIED IDEOGRAPH + \xD5\xAF |0 # CJK UNIFIED IDEOGRAPH + \xBF\xB1 |0 # CJK UNIFIED IDEOGRAPH + \xD5\xAE |0 # CJK UNIFIED IDEOGRAPH + \xCA\xDA |0 # CJK UNIFIED IDEOGRAPH + \xB8\xE4 |0 # CJK UNIFIED IDEOGRAPH + \xD5\xB7 |0 # CJK UNIFIED IDEOGRAPH + \xD5\xB8 |0 # CJK UNIFIED IDEOGRAPH + \xBE\xAB |0 # CJK UNIFIED IDEOGRAPH + \xD5\xB4 |0 # CJK UNIFIED IDEOGRAPH + \xCF\xAC |0 # CJK UNIFIED IDEOGRAPH + \xC7\xCC |0 # CJK UNIFIED IDEOGRAPH + \xD5\xB6 |0 # CJK UNIFIED IDEOGRAPH + \xBA\xA7 |0 # CJK UNIFIED IDEOGRAPH + \xD5\xB9 |0 # CJK UNIFIED IDEOGRAPH + \xC9\xD8 |0 # CJK UNIFIED IDEOGRAPH + \xD5\xBA |0 # CJK UNIFIED IDEOGRAPH + \xD5\xB5 |0 # CJK UNIFIED IDEOGRAPH + \xCC\xBB |0 # CJK UNIFIED IDEOGRAPH + \xC7\xDE |0 # CJK UNIFIED IDEOGRAPH + \xD5\xBB |0 # CJK UNIFIED IDEOGRAPH + \xC9\xB2 |0 # CJK UNIFIED IDEOGRAPH + \xD5\xBC |0 # CJK UNIFIED IDEOGRAPH + \xD5\xC0 |0 # CJK UNIFIED IDEOGRAPH + \xD5\xBD |0 # CJK UNIFIED IDEOGRAPH + \xB2\xC7 |0 # CJK UNIFIED IDEOGRAPH + \xD5\xBF |0 # CJK UNIFIED IDEOGRAPH + \xBC\xBB |0 # CJK UNIFIED IDEOGRAPH + \xD5\xBE |0 # CJK UNIFIED IDEOGRAPH + \xB7\xF9 |0 # CJK UNIFIED IDEOGRAPH + \xD5\xCC |0 # CJK UNIFIED IDEOGRAPH + \xD5\xC5 |0 # CJK UNIFIED IDEOGRAPH + \xD5\xC2 |0 # CJK UNIFIED IDEOGRAPH + \xC3\xE4 |0 # CJK UNIFIED IDEOGRAPH + \xD5\xC1 |0 # CJK UNIFIED IDEOGRAPH + \xD5\xC3 |0 # CJK UNIFIED IDEOGRAPH + \xD5\xC4 |0 # CJK UNIFIED IDEOGRAPH + \xD5\xC6 |0 # CJK UNIFIED IDEOGRAPH + \xD5\xC7 |0 # CJK UNIFIED IDEOGRAPH + \xB4\xF2 |0 # CJK UNIFIED IDEOGRAPH + \xD5\xC9 |0 # CJK UNIFIED IDEOGRAPH + \xD5\xC8 |0 # CJK UNIFIED IDEOGRAPH + \xD5\xCA |0 # CJK UNIFIED IDEOGRAPH + \xBE\xEE |0 # CJK UNIFIED IDEOGRAPH + \xD5\xCD |0 # CJK UNIFIED IDEOGRAPH + \xC4\xDC |0 # CJK UNIFIED IDEOGRAPH + \xB1\xC5 |0 # CJK UNIFIED IDEOGRAPH + \xD5\xCB |0 # CJK UNIFIED IDEOGRAPH + \xD5\xCE |0 # CJK UNIFIED IDEOGRAPH + \xD5\xCF |0 # CJK UNIFIED IDEOGRAPH + \xD5\xD2 |0 # CJK UNIFIED IDEOGRAPH + \xD5\xD0 |0 # CJK UNIFIED IDEOGRAPH + \xD5\xD1 |0 # CJK UNIFIED IDEOGRAPH + \xBB\xD2 |0 # CJK UNIFIED IDEOGRAPH + \xD5\xD3 |0 # CJK UNIFIED IDEOGRAPH + \xB9\xA6 |0 # CJK UNIFIED IDEOGRAPH + \xD5\xD4 |0 # CJK UNIFIED IDEOGRAPH + \xF9\xEA |0 # CJK UNIFIED IDEOGRAPH + \xBB\xFA |0 # CJK UNIFIED IDEOGRAPH + \xC2\xB8 |0 # CJK UNIFIED IDEOGRAPH + \xD5\xD5 |0 # CJK UNIFIED IDEOGRAPH + \xD5\xD6 |0 # CJK UNIFIED IDEOGRAPH + \xBB\xDA |0 # CJK UNIFIED IDEOGRAPH + \xB9\xA7 |0 # CJK UNIFIED IDEOGRAPH + \xCC\xD2 |0 # CJK UNIFIED IDEOGRAPH + \xB5\xA8 |0 # CJK UNIFIED IDEOGRAPH + \xB8\xC9 |0 # CJK UNIFIED IDEOGRAPH + \xD5\xD7 |0 # CJK UNIFIED IDEOGRAPH + \xB3\xD8 |0 # CJK UNIFIED IDEOGRAPH + \xD5\xD8 |0 # CJK UNIFIED IDEOGRAPH + \xC2\xB9 |0 # CJK UNIFIED IDEOGRAPH + \xD5\xD9 |0 # CJK UNIFIED IDEOGRAPH + \xD6\xA3 |0 # CJK UNIFIED IDEOGRAPH + \xD5\xDA |0 # CJK UNIFIED IDEOGRAPH + \xD5\xDB |0 # CJK UNIFIED IDEOGRAPH + \xD5\xDC |0 # CJK UNIFIED IDEOGRAPH + \xD5\xDE |0 # CJK UNIFIED IDEOGRAPH + \xD5\xDF |0 # CJK UNIFIED IDEOGRAPH + \xD5\xE0 |0 # CJK UNIFIED IDEOGRAPH + \xC2\xF0 |0 # CJK UNIFIED IDEOGRAPH + \xB1\xA7 |0 # CJK UNIFIED IDEOGRAPH + \xBC\xE9 |0 # CJK UNIFIED IDEOGRAPH + \xB0\xC2 |0 # CJK UNIFIED IDEOGRAPH + \xC1\xD7 |0 # CJK UNIFIED IDEOGRAPH + \xB4\xB0 |0 # CJK UNIFIED IDEOGRAPH + \xBC\xB5 |0 # CJK UNIFIED IDEOGRAPH + \xB9\xA8 |0 # CJK UNIFIED IDEOGRAPH + \xC5\xE6 |0 # CJK UNIFIED IDEOGRAPH + \xBD\xA1 |0 # CJK UNIFIED IDEOGRAPH + \xB4\xB1 |0 # CJK UNIFIED IDEOGRAPH + \xC3\xE8 |0 # CJK UNIFIED IDEOGRAPH + \xC4\xEA |0 # CJK UNIFIED IDEOGRAPH + \xB0\xB8 |0 # CJK UNIFIED IDEOGRAPH + \xB5\xB9 |0 # CJK UNIFIED IDEOGRAPH + \xCA\xF5 |0 # CJK UNIFIED IDEOGRAPH + \xBC\xC2 |0 # CJK UNIFIED IDEOGRAPH + \xB5\xD2 |0 # CJK UNIFIED IDEOGRAPH + \xC0\xEB |0 # CJK UNIFIED IDEOGRAPH + \xBC\xBC |0 # CJK UNIFIED IDEOGRAPH + \xCD\xA8 |0 # CJK UNIFIED IDEOGRAPH + \xD5\xE1 |0 # CJK UNIFIED IDEOGRAPH + \xB5\xDC |0 # CJK UNIFIED IDEOGRAPH + \xBA\xCB |0 # CJK UNIFIED IDEOGRAPH + \xB3\xB2 |0 # CJK UNIFIED IDEOGRAPH + \xB1\xE3 |0 # CJK UNIFIED IDEOGRAPH + \xBE\xAC |0 # CJK UNIFIED IDEOGRAPH + \xB2\xC8 |0 # CJK UNIFIED IDEOGRAPH + \xD5\xE2 |0 # CJK UNIFIED IDEOGRAPH + \xCD\xC6 |0 # CJK UNIFIED IDEOGRAPH + \xBD\xC9 |0 # CJK UNIFIED IDEOGRAPH + \xF9\xEB |0 # CJK UNIFIED IDEOGRAPH + \xBC\xE4 |0 # CJK UNIFIED IDEOGRAPH + \xD5\xE3 |0 # CJK UNIFIED IDEOGRAPH + \xB4\xF3 |0 # CJK UNIFIED IDEOGRAPH + \xC6\xD2 |0 # CJK UNIFIED IDEOGRAPH + \xCC\xA9 |0 # CJK UNIFIED IDEOGRAPH + \xD5\xE4 |0 # CJK UNIFIED IDEOGRAPH + \xD5\xE5 |0 # CJK UNIFIED IDEOGRAPH + \xC9\xD9 |0 # CJK UNIFIED IDEOGRAPH + \xD5\xE7 |0 # CJK UNIFIED IDEOGRAPH + \xB4\xA8 |0 # CJK UNIFIED IDEOGRAPH + \xB6\xF7 |0 # CJK UNIFIED IDEOGRAPH + \xD5\xE6 |0 # CJK UNIFIED IDEOGRAPH + \xF9\xED |0 # CJK UNIFIED IDEOGRAPH + \xB4\xB2 |0 # CJK UNIFIED IDEOGRAPH + \xBF\xB2 |0 # CJK UNIFIED IDEOGRAPH + \xD5\xEB |0 # CJK UNIFIED IDEOGRAPH + \xBB\xA1 |0 # CJK UNIFIED IDEOGRAPH + \xB2\xC9 |0 # CJK UNIFIED IDEOGRAPH + \xD5\xEA |0 # CJK UNIFIED IDEOGRAPH + \xD5\xE8 |0 # CJK UNIFIED IDEOGRAPH + \xD5\xEC |0 # CJK UNIFIED IDEOGRAPH + \xD5\xE9 |0 # CJK UNIFIED IDEOGRAPH + \xC7\xAB |0 # CJK UNIFIED IDEOGRAPH + \xDC\xCD |0 # CJK UNIFIED IDEOGRAPH + \xBF\xB3 |0 # CJK UNIFIED IDEOGRAPH + \xD5\xED |0 # CJK UNIFIED IDEOGRAPH + \xF9\xEE |0 # CJK UNIFIED IDEOGRAPH + \xCE\xC0 |0 # CJK UNIFIED IDEOGRAPH + \xD5\xEE |0 # CJK UNIFIED IDEOGRAPH + \xD5\xF0 |0 # CJK UNIFIED IDEOGRAPH + \xC3\xFE |0 # CJK UNIFIED IDEOGRAPH + \xD5\xEF |0 # CJK UNIFIED IDEOGRAPH + \xC0\xA3 |0 # CJK UNIFIED IDEOGRAPH + \xBB\xFB |0 # CJK UNIFIED IDEOGRAPH + \xC2\xD0 |0 # CJK UNIFIED IDEOGRAPH + \xBC\xF7 |0 # CJK UNIFIED IDEOGRAPH + \xC9\xF5 |0 # CJK UNIFIED IDEOGRAPH + \xC0\xEC |0 # CJK UNIFIED IDEOGRAPH + \xBC\xCD |0 # CJK UNIFIED IDEOGRAPH + \xD5\xF1 |0 # CJK UNIFIED IDEOGRAPH + \xBE\xAD |0 # CJK UNIFIED IDEOGRAPH + \xD5\xF2 |0 # CJK UNIFIED IDEOGRAPH + \xD5\xF3 |0 # CJK UNIFIED IDEOGRAPH + \xB0\xD3 |0 # CJK UNIFIED IDEOGRAPH + \xC2\xBA |0 # CJK UNIFIED IDEOGRAPH + \xBF\xD2 |0 # CJK UNIFIED IDEOGRAPH + \xD5\xF4 |0 # CJK UNIFIED IDEOGRAPH + \xC6\xB3 |0 # CJK UNIFIED IDEOGRAPH + \xBE\xAE |0 # CJK UNIFIED IDEOGRAPH + \xBE\xAF |0 # CJK UNIFIED IDEOGRAPH + \xD5\xF5 |0 # CJK UNIFIED IDEOGRAPH + \xC0\xED |0 # CJK UNIFIED IDEOGRAPH + \xBE\xB0 |0 # CJK UNIFIED IDEOGRAPH + \xF9\xEF |0 # CJK UNIFIED IDEOGRAPH + \xD5\xF6 |0 # CJK UNIFIED IDEOGRAPH + \xD5\xF7 |0 # CJK UNIFIED IDEOGRAPH + \xCC\xE0 |0 # CJK UNIFIED IDEOGRAPH + \xD5\xF8 |0 # CJK UNIFIED IDEOGRAPH + \xB6\xC6 |0 # CJK UNIFIED IDEOGRAPH + \xBD\xA2 |0 # CJK UNIFIED IDEOGRAPH + \xD5\xF9 |0 # CJK UNIFIED IDEOGRAPH + \xD5\xFA |0 # CJK UNIFIED IDEOGRAPH + \xBC\xDC |0 # CJK UNIFIED IDEOGRAPH + \xBF\xAC |0 # CJK UNIFIED IDEOGRAPH + \xC6\xF4 |0 # CJK UNIFIED IDEOGRAPH + \xBF\xD4 |0 # CJK UNIFIED IDEOGRAPH + \xC8\xF8 |0 # CJK UNIFIED IDEOGRAPH + \xC7\xA2 |0 # CJK UNIFIED IDEOGRAPH + \xB6\xC9 |0 # CJK UNIFIED IDEOGRAPH + \xD5\xFB |0 # CJK UNIFIED IDEOGRAPH + \xB5\xEF |0 # CJK UNIFIED IDEOGRAPH + \xD5\xFC |0 # CJK UNIFIED IDEOGRAPH + \xB6\xFE |0 # CJK UNIFIED IDEOGRAPH + \xC6\xCF |0 # CJK UNIFIED IDEOGRAPH + \xB2\xB0 |0 # CJK UNIFIED IDEOGRAPH + \xBB\xD3 |0 # CJK UNIFIED IDEOGRAPH + \xD5\xFD |0 # CJK UNIFIED IDEOGRAPH + \xD6\xA2 |0 # CJK UNIFIED IDEOGRAPH + \xD6\xA1 |0 # CJK UNIFIED IDEOGRAPH + \xB6\xFD |0 # CJK UNIFIED IDEOGRAPH + \xD5\xFE |0 # CJK UNIFIED IDEOGRAPH + \xC5\xB8 |0 # CJK UNIFIED IDEOGRAPH + \xC2\xB0 |0 # CJK UNIFIED IDEOGRAPH + \xC5\xCB |0 # CJK UNIFIED IDEOGRAPH + \xBC\xC8 |0 # CJK UNIFIED IDEOGRAPH + \xC1\xD8 |0 # CJK UNIFIED IDEOGRAPH + \xCD\xFA |0 # CJK UNIFIED IDEOGRAPH + \xD6\xA4 |0 # CJK UNIFIED IDEOGRAPH + \xD6\xA5 |0 # CJK UNIFIED IDEOGRAPH + \xC6\xD6 |0 # CJK UNIFIED IDEOGRAPH + \xBB\xB3 |0 # CJK UNIFIED IDEOGRAPH + \xD6\xA7 |0 # CJK UNIFIED IDEOGRAPH + \xD6\xA8 |0 # CJK UNIFIED IDEOGRAPH + \xD6\xA9 |0 # CJK UNIFIED IDEOGRAPH + \xB4\xF4 |0 # CJK UNIFIED IDEOGRAPH + \xD6\xAA |0 # CJK UNIFIED IDEOGRAPH + \xD6\xAB |0 # CJK UNIFIED IDEOGRAPH + \xB2\xAC |0 # CJK UNIFIED IDEOGRAPH + \xF9\xF0 |0 # CJK UNIFIED IDEOGRAPH + \xC1\xBB |0 # CJK UNIFIED IDEOGRAPH + \xB4\xE4 |0 # CJK UNIFIED IDEOGRAPH + \xD6\xAD |0 # CJK UNIFIED IDEOGRAPH + \xCC\xA8 |0 # CJK UNIFIED IDEOGRAPH + \xC2\xD2 |0 # CJK UNIFIED IDEOGRAPH + \xB3\xD9 |0 # CJK UNIFIED IDEOGRAPH + \xD6\xAF |0 # CJK UNIFIED IDEOGRAPH + \xD6\xB1 |0 # CJK UNIFIED IDEOGRAPH + \xB4\xDF |0 # CJK UNIFIED IDEOGRAPH + \xF9\xF1 |0 # CJK UNIFIED IDEOGRAPH + \xD6\xAE |0 # CJK UNIFIED IDEOGRAPH + \xD6\xB0 |0 # CJK UNIFIED IDEOGRAPH + \xD6\xB3 |0 # CJK UNIFIED IDEOGRAPH + \xD6\xB2 |0 # CJK UNIFIED IDEOGRAPH + \xD6\xB4 |0 # CJK UNIFIED IDEOGRAPH + \xD6\xB5 |0 # CJK UNIFIED IDEOGRAPH + \xC6\xBD |0 # CJK UNIFIED IDEOGRAPH + \xB6\xAE |0 # CJK UNIFIED IDEOGRAPH + \xB2\xE5 |0 # CJK UNIFIED IDEOGRAPH + \xD6\xB6 |0 # CJK UNIFIED IDEOGRAPH + \xD6\xBB |0 # CJK UNIFIED IDEOGRAPH + \xD6\xB9 |0 # CJK UNIFIED IDEOGRAPH + \xCA\xF7 |0 # CJK UNIFIED IDEOGRAPH + \xCA\xF6 |0 # CJK UNIFIED IDEOGRAPH + \xF9\xF2 |0 # CJK UNIFIED IDEOGRAPH + \xC5\xE7 |0 # CJK UNIFIED IDEOGRAPH + \xD6\xB8 |0 # CJK UNIFIED IDEOGRAPH + \xBD\xD4 |0 # CJK UNIFIED IDEOGRAPH + \xD6\xB7 |0 # CJK UNIFIED IDEOGRAPH + \xBF\xF2 |0 # CJK UNIFIED IDEOGRAPH + \xD6\xBC |0 # CJK UNIFIED IDEOGRAPH + \xBA\xEA |0 # CJK UNIFIED IDEOGRAPH + \xD6\xC2 |0 # CJK UNIFIED IDEOGRAPH + \xD6\xC3 |0 # CJK UNIFIED IDEOGRAPH + \xD6\xBD |0 # CJK UNIFIED IDEOGRAPH + \xB3\xB3 |0 # CJK UNIFIED IDEOGRAPH + \xD6\xBE |0 # CJK UNIFIED IDEOGRAPH + \xD6\xC7 |0 # CJK UNIFIED IDEOGRAPH + \xD6\xC6 |0 # CJK UNIFIED IDEOGRAPH + \xD6\xC5 |0 # CJK UNIFIED IDEOGRAPH + \xD6\xC1 |0 # CJK UNIFIED IDEOGRAPH + \xD6\xC0 |0 # CJK UNIFIED IDEOGRAPH + \xD6\xC4 |0 # CJK UNIFIED IDEOGRAPH + \xF9\xF3 |0 # CJK UNIFIED IDEOGRAPH + \xCA\xF8 |0 # CJK UNIFIED IDEOGRAPH + \xF9\xF6 |0 # CJK UNIFIED IDEOGRAPH + \xD6\xCB |0 # CJK UNIFIED IDEOGRAPH + \xD6\xC8 |0 # CJK UNIFIED IDEOGRAPH + \xD6\xCA |0 # CJK UNIFIED IDEOGRAPH + \xCD\xF2 |0 # CJK UNIFIED IDEOGRAPH + \xD6\xC9 |0 # CJK UNIFIED IDEOGRAPH + \xF9\xF4 |0 # CJK UNIFIED IDEOGRAPH + \xD6\xBF |0 # CJK UNIFIED IDEOGRAPH + \xBF\xF3 |0 # CJK UNIFIED IDEOGRAPH + \xD6\xCC |0 # CJK UNIFIED IDEOGRAPH + \xF9\xF7 |0 # CJK UNIFIED IDEOGRAPH + \xBA\xB7 |0 # CJK UNIFIED IDEOGRAPH + \xD6\xCD |0 # CJK UNIFIED IDEOGRAPH + \xD6\xCE |0 # CJK UNIFIED IDEOGRAPH + \xD6\xD1 |0 # CJK UNIFIED IDEOGRAPH + \xD6\xD0 |0 # CJK UNIFIED IDEOGRAPH + \xD6\xCF |0 # CJK UNIFIED IDEOGRAPH + \xC5\xE8 |0 # CJK UNIFIED IDEOGRAPH + \xD6\xBA |0 # CJK UNIFIED IDEOGRAPH + \xD6\xD7 |0 # CJK UNIFIED IDEOGRAPH + \xD6\xD3 |0 # CJK UNIFIED IDEOGRAPH + \xD6\xD2 |0 # CJK UNIFIED IDEOGRAPH + \xD6\xD4 |0 # CJK UNIFIED IDEOGRAPH + \xD6\xD5 |0 # CJK UNIFIED IDEOGRAPH + \xD6\xD8 |0 # CJK UNIFIED IDEOGRAPH + \xF9\xF8 |0 # CJK UNIFIED IDEOGRAPH + \xF9\xF9 |0 # CJK UNIFIED IDEOGRAPH + \xCE\xE6 |0 # CJK UNIFIED IDEOGRAPH + \xD6\xD9 |0 # CJK UNIFIED IDEOGRAPH + \xD6\xD6 |0 # CJK UNIFIED IDEOGRAPH + \xD6\xDA |0 # CJK UNIFIED IDEOGRAPH + \xB4\xE0 |0 # CJK UNIFIED IDEOGRAPH + \xD6\xDB |0 # CJK UNIFIED IDEOGRAPH + \xF9\xFA |0 # CJK UNIFIED IDEOGRAPH + \xD6\xDD |0 # CJK UNIFIED IDEOGRAPH + \xD6\xDC |0 # CJK UNIFIED IDEOGRAPH + \xD6\xDE |0 # CJK UNIFIED IDEOGRAPH + \xD6\xDF |0 # CJK UNIFIED IDEOGRAPH + \xC0\xEE |0 # CJK UNIFIED IDEOGRAPH + \xBD\xA3 |0 # CJK UNIFIED IDEOGRAPH + \xBD\xE4 |0 # CJK UNIFIED IDEOGRAPH + \xC1\xE3 |0 # CJK UNIFIED IDEOGRAPH + \xB9\xA9 |0 # CJK UNIFIED IDEOGRAPH + \xBA\xB8 |0 # CJK UNIFIED IDEOGRAPH + \xB9\xAA |0 # CJK UNIFIED IDEOGRAPH + \xB5\xF0 |0 # CJK UNIFIED IDEOGRAPH + \xD6\xE0 |0 # CJK UNIFIED IDEOGRAPH + \xBA\xB9 |0 # CJK UNIFIED IDEOGRAPH + \xB8\xCA |0 # CJK UNIFIED IDEOGRAPH + \xD6\xE1 |0 # CJK UNIFIED IDEOGRAPH + \xCC\xA6 |0 # CJK UNIFIED IDEOGRAPH + \xC7\xC3 |0 # CJK UNIFIED IDEOGRAPH + \xD6\xE2 |0 # CJK UNIFIED IDEOGRAPH + \xB9\xAB |0 # CJK UNIFIED IDEOGRAPH + \xB4\xAC |0 # CJK UNIFIED IDEOGRAPH + \xC3\xA7 |0 # CJK UNIFIED IDEOGRAPH + \xB6\xD2 |0 # CJK UNIFIED IDEOGRAPH + \xBB\xD4 |0 # CJK UNIFIED IDEOGRAPH + \xC9\xDB |0 # CJK UNIFIED IDEOGRAPH + \xC8\xC1 |0 # CJK UNIFIED IDEOGRAPH + \xD6\xE3 |0 # CJK UNIFIED IDEOGRAPH + \xB4\xF5 |0 # CJK UNIFIED IDEOGRAPH + \xD6\xE6 |0 # CJK UNIFIED IDEOGRAPH + \xC4\xA1 |0 # CJK UNIFIED IDEOGRAPH + \xD6\xE5 |0 # CJK UNIFIED IDEOGRAPH + \xD6\xE4 |0 # CJK UNIFIED IDEOGRAPH + \xD6\xE7 |0 # CJK UNIFIED IDEOGRAPH + \xC4\xEB |0 # CJK UNIFIED IDEOGRAPH + \xBF\xE3 |0 # CJK UNIFIED IDEOGRAPH + \xBB\xD5 |0 # CJK UNIFIED IDEOGRAPH + \xC0\xCA |0 # CJK UNIFIED IDEOGRAPH + \xC2\xD3 |0 # CJK UNIFIED IDEOGRAPH + \xB5\xA2 |0 # CJK UNIFIED IDEOGRAPH + \xC4\xA2 |0 # CJK UNIFIED IDEOGRAPH + \xD6\xE8 |0 # CJK UNIFIED IDEOGRAPH + \xD6\xE9 |0 # CJK UNIFIED IDEOGRAPH + \xBE\xEF |0 # CJK UNIFIED IDEOGRAPH + \xCB\xB9 |0 # CJK UNIFIED IDEOGRAPH + \xD6\xEC |0 # CJK UNIFIED IDEOGRAPH + \xD6\xEB |0 # CJK UNIFIED IDEOGRAPH + \xD6\xEA |0 # CJK UNIFIED IDEOGRAPH + \xC9\xFD |0 # CJK UNIFIED IDEOGRAPH + \xD6\xF3 |0 # CJK UNIFIED IDEOGRAPH + \xCB\xDA |0 # CJK UNIFIED IDEOGRAPH + \xD6\xED |0 # CJK UNIFIED IDEOGRAPH + \xD6\xEF |0 # CJK UNIFIED IDEOGRAPH + \xCB\xEB |0 # CJK UNIFIED IDEOGRAPH + \xD6\xEE |0 # CJK UNIFIED IDEOGRAPH + \xD6\xF0 |0 # CJK UNIFIED IDEOGRAPH + \xC8\xA8 |0 # CJK UNIFIED IDEOGRAPH + \xD6\xF1 |0 # CJK UNIFIED IDEOGRAPH + \xCA\xBE |0 # CJK UNIFIED IDEOGRAPH + \xD6\xF2 |0 # CJK UNIFIED IDEOGRAPH + \xB4\xB3 |0 # CJK UNIFIED IDEOGRAPH + \xCA\xBF |0 # CJK UNIFIED IDEOGRAPH + \xC7\xAF |0 # CJK UNIFIED IDEOGRAPH + \xD6\xF4 |0 # CJK UNIFIED IDEOGRAPH + \xD6\xF5 |0 # CJK UNIFIED IDEOGRAPH + \xB9\xAC |0 # CJK UNIFIED IDEOGRAPH + \xB4\xB4 |0 # CJK UNIFIED IDEOGRAPH + \xD6\xF6 |0 # CJK UNIFIED IDEOGRAPH + \xB8\xB8 |0 # CJK UNIFIED IDEOGRAPH + \xCD\xC4 |0 # CJK UNIFIED IDEOGRAPH + \xCD\xA9 |0 # CJK UNIFIED IDEOGRAPH + \xB4\xF6 |0 # CJK UNIFIED IDEOGRAPH + \xD6\xF8 |0 # CJK UNIFIED IDEOGRAPH + \xC4\xA3 |0 # CJK UNIFIED IDEOGRAPH + \xB9\xAD |0 # CJK UNIFIED IDEOGRAPH + \xBE\xB1 |0 # CJK UNIFIED IDEOGRAPH + \xC8\xDF |0 # CJK UNIFIED IDEOGRAPH + \xBE\xB2 |0 # CJK UNIFIED IDEOGRAPH + \xBD\xF8 |0 # CJK UNIFIED IDEOGRAPH + \xC4\xEC |0 # CJK UNIFIED IDEOGRAPH + \xCA\xF9 |0 # CJK UNIFIED IDEOGRAPH + \xC5\xB9 |0 # CJK UNIFIED IDEOGRAPH + \xB9\xAE |0 # CJK UNIFIED IDEOGRAPH + \xC9\xDC |0 # CJK UNIFIED IDEOGRAPH + \xD6\xF9 |0 # CJK UNIFIED IDEOGRAPH + \xC5\xD9 |0 # CJK UNIFIED IDEOGRAPH + \xBA\xC2 |0 # CJK UNIFIED IDEOGRAPH + \xB8\xCB |0 # CJK UNIFIED IDEOGRAPH + \xC4\xED |0 # CJK UNIFIED IDEOGRAPH + \xB0\xC3 |0 # CJK UNIFIED IDEOGRAPH + \xBD\xEE |0 # CJK UNIFIED IDEOGRAPH + \xB9\xAF |0 # CJK UNIFIED IDEOGRAPH + \xCD\xC7 |0 # CJK UNIFIED IDEOGRAPH + \xD6\xFA |0 # CJK UNIFIED IDEOGRAPH + \xD6\xFB |0 # CJK UNIFIED IDEOGRAPH + \xC7\xD1 |0 # CJK UNIFIED IDEOGRAPH + \xD6\xFC |0 # CJK UNIFIED IDEOGRAPH + \xCE\xF7 |0 # CJK UNIFIED IDEOGRAPH + \xCF\xAD |0 # CJK UNIFIED IDEOGRAPH + \xD6\xFE |0 # CJK UNIFIED IDEOGRAPH + \xD6\xFD |0 # CJK UNIFIED IDEOGRAPH + \xB3\xC7 |0 # CJK UNIFIED IDEOGRAPH + \xD7\xA1 |0 # CJK UNIFIED IDEOGRAPH + \xD7\xA4 |0 # CJK UNIFIED IDEOGRAPH + \xD7\xA5 |0 # CJK UNIFIED IDEOGRAPH + \xD7\xA3 |0 # CJK UNIFIED IDEOGRAPH + \xC9\xC0 |0 # CJK UNIFIED IDEOGRAPH + \xBE\xB3 |0 # CJK UNIFIED IDEOGRAPH + \xD7\xA7 |0 # CJK UNIFIED IDEOGRAPH + \xD7\xA6 |0 # CJK UNIFIED IDEOGRAPH + \xD7\xA2 |0 # CJK UNIFIED IDEOGRAPH + \xD7\xA8 |0 # CJK UNIFIED IDEOGRAPH + \xD7\xA9 |0 # CJK UNIFIED IDEOGRAPH + \xD7\xAA |0 # CJK UNIFIED IDEOGRAPH + \xD7\xAD |0 # CJK UNIFIED IDEOGRAPH + \xD7\xAB |0 # CJK UNIFIED IDEOGRAPH + \xD7\xAC |0 # CJK UNIFIED IDEOGRAPH + \xD7\xAE |0 # CJK UNIFIED IDEOGRAPH + \xB1\xE4 |0 # CJK UNIFIED IDEOGRAPH + \xC4\xEE |0 # CJK UNIFIED IDEOGRAPH + \xD7\xAF |0 # CJK UNIFIED IDEOGRAPH + \xB7\xFA |0 # CJK UNIFIED IDEOGRAPH + \xB2\xF6 |0 # CJK UNIFIED IDEOGRAPH + \xC7\xB6 |0 # CJK UNIFIED IDEOGRAPH + \xD7\xB0 |0 # CJK UNIFIED IDEOGRAPH + \xC6\xFB |0 # CJK UNIFIED IDEOGRAPH + \xCA\xDB |0 # CJK UNIFIED IDEOGRAPH + \xD7\xB1 |0 # CJK UNIFIED IDEOGRAPH + \xCF\xAE |0 # CJK UNIFIED IDEOGRAPH + \xD7\xB2 |0 # CJK UNIFIED IDEOGRAPH + \xCA\xC0 |0 # CJK UNIFIED IDEOGRAPH + \xD7\xB5 |0 # CJK UNIFIED IDEOGRAPH + \xD0\xA1 |0 # CJK UNIFIED IDEOGRAPH + \xD0\xB1 |0 # CJK UNIFIED IDEOGRAPH + \xBC\xB0 |0 # CJK UNIFIED IDEOGRAPH + \xC6\xF5 |0 # CJK UNIFIED IDEOGRAPH + \xD7\xB6 |0 # CJK UNIFIED IDEOGRAPH + \xB5\xDD |0 # CJK UNIFIED IDEOGRAPH + \xC4\xA4 |0 # CJK UNIFIED IDEOGRAPH + \xB0\xFA |0 # CJK UNIFIED IDEOGRAPH + \xD7\xB7 |0 # CJK UNIFIED IDEOGRAPH + \xCA\xA6 |0 # CJK UNIFIED IDEOGRAPH + \xB9\xB0 |0 # CJK UNIFIED IDEOGRAPH + \xC3\xD0 |0 # CJK UNIFIED IDEOGRAPH + \xC4\xEF |0 # CJK UNIFIED IDEOGRAPH + \xF9\xFB |0 # CJK UNIFIED IDEOGRAPH + \xCC\xEF |0 # CJK UNIFIED IDEOGRAPH + \xB8\xB9 |0 # CJK UNIFIED IDEOGRAPH + \xB8\xCC |0 # CJK UNIFIED IDEOGRAPH + \xD7\xB8 |0 # CJK UNIFIED IDEOGRAPH + \xD7\xB9 |0 # CJK UNIFIED IDEOGRAPH + \xD7\xBF |0 # CJK UNIFIED IDEOGRAPH + \xBC\xE5 |0 # CJK UNIFIED IDEOGRAPH + \xF9\xFC |0 # CJK UNIFIED IDEOGRAPH + \xC4\xA5 |0 # CJK UNIFIED IDEOGRAPH + \xB6\xAF |0 # CJK UNIFIED IDEOGRAPH + \xD7\xBA |0 # CJK UNIFIED IDEOGRAPH + \xC9\xAB |0 # CJK UNIFIED IDEOGRAPH + \xC3\xC6 |0 # CJK UNIFIED IDEOGRAPH + \xD7\xBB |0 # CJK UNIFIED IDEOGRAPH + \xF9\xAC |0 # CJK UNIFIED IDEOGRAPH + \xD7\xBC |0 # CJK UNIFIED IDEOGRAPH + \xB6\xB0 |0 # CJK UNIFIED IDEOGRAPH + \xD7\xBD |0 # CJK UNIFIED IDEOGRAPH + \xD7\xBE |0 # CJK UNIFIED IDEOGRAPH + \xD7\xC0 |0 # CJK UNIFIED IDEOGRAPH + \xC5\xF6 |0 # CJK UNIFIED IDEOGRAPH + \xD7\xC1 |0 # CJK UNIFIED IDEOGRAPH + \xD7\xC2 |0 # CJK UNIFIED IDEOGRAPH + \xD7\xC3 |0 # CJK UNIFIED IDEOGRAPH + \xD7\xB4 |0 # CJK UNIFIED IDEOGRAPH + \xD7\xB3 |0 # CJK UNIFIED IDEOGRAPH + \xD7\xC4 |0 # CJK UNIFIED IDEOGRAPH + \xB7\xC1 |0 # CJK UNIFIED IDEOGRAPH + \xC9\xA7 |0 # CJK UNIFIED IDEOGRAPH + \xF9\xFD |0 # CJK UNIFIED IDEOGRAPH + \xBA\xCC |0 # CJK UNIFIED IDEOGRAPH + \xC9\xB7 |0 # CJK UNIFIED IDEOGRAPH + \xC4\xA6 |0 # CJK UNIFIED IDEOGRAPH + \xC9\xCB |0 # CJK UNIFIED IDEOGRAPH + \xD7\xC5 |0 # CJK UNIFIED IDEOGRAPH + \xBE\xB4 |0 # CJK UNIFIED IDEOGRAPH + \xB1\xC6 |0 # CJK UNIFIED IDEOGRAPH + \xD7\xC6 |0 # CJK UNIFIED IDEOGRAPH + \xD7\xC7 |0 # CJK UNIFIED IDEOGRAPH + \xCC\xF2 |0 # CJK UNIFIED IDEOGRAPH + \xC8\xE0 |0 # CJK UNIFIED IDEOGRAPH + \xD7\xCA |0 # CJK UNIFIED IDEOGRAPH + \xB1\xFD |0 # CJK UNIFIED IDEOGRAPH + \xC0\xAC |0 # CJK UNIFIED IDEOGRAPH + \xD7\xC9 |0 # CJK UNIFIED IDEOGRAPH + \xD7\xC8 |0 # CJK UNIFIED IDEOGRAPH + \xB7\xC2 |0 # CJK UNIFIED IDEOGRAPH + \xC2\xD4 |0 # CJK UNIFIED IDEOGRAPH + \xD7\xCE |0 # CJK UNIFIED IDEOGRAPH + \xD7\xCC |0 # CJK UNIFIED IDEOGRAPH + \xD7\xCB |0 # CJK UNIFIED IDEOGRAPH + \xCE\xA7 |0 # CJK UNIFIED IDEOGRAPH + \xB8\xE5 |0 # CJK UNIFIED IDEOGRAPH + \xBD\xF9 |0 # CJK UNIFIED IDEOGRAPH + \xD7\xCD |0 # CJK UNIFIED IDEOGRAPH + \xC5\xCC |0 # CJK UNIFIED IDEOGRAPH + \xBD\xBE |0 # CJK UNIFIED IDEOGRAPH + \xC6\xC0 |0 # CJK UNIFIED IDEOGRAPH + \xD7\xD1 |0 # CJK UNIFIED IDEOGRAPH + \xD7\xD0 |0 # CJK UNIFIED IDEOGRAPH + \xD7\xCF |0 # CJK UNIFIED IDEOGRAPH + \xD7\xD2 |0 # CJK UNIFIED IDEOGRAPH + \xB8\xE6 |0 # CJK UNIFIED IDEOGRAPH + \xD7\xD3 |0 # CJK UNIFIED IDEOGRAPH + \xC9\xFC |0 # CJK UNIFIED IDEOGRAPH + \xBD\xDB |0 # CJK UNIFIED IDEOGRAPH + \xD7\xD4 |0 # CJK UNIFIED IDEOGRAPH + \xC8\xF9 |0 # CJK UNIFIED IDEOGRAPH + \xC6\xC1 |0 # CJK UNIFIED IDEOGRAPH + \xC4\xA7 |0 # CJK UNIFIED IDEOGRAPH + \xF9\xFE |0 # CJK UNIFIED IDEOGRAPH + \xC5\xB0 |0 # CJK UNIFIED IDEOGRAPH + \xD7\xD5 |0 # CJK UNIFIED IDEOGRAPH + \xB5\xAB |0 # CJK UNIFIED IDEOGRAPH + \xBF\xB4 |0 # CJK UNIFIED IDEOGRAPH + \xC9\xAC |0 # CJK UNIFIED IDEOGRAPH + \xB4\xF7 |0 # CJK UNIFIED IDEOGRAPH + \xC7\xA6 |0 # CJK UNIFIED IDEOGRAPH + \xD7\xD6 |0 # CJK UNIFIED IDEOGRAPH + \xBB\xD6 |0 # CJK UNIFIED IDEOGRAPH + \xCB\xBA |0 # CJK UNIFIED IDEOGRAPH + \xCB\xBB |0 # CJK UNIFIED IDEOGRAPH + \xB1\xFE |0 # CJK UNIFIED IDEOGRAPH + \xD7\xDB |0 # CJK UNIFIED IDEOGRAPH + \xFA\xA1 |0 # CJK UNIFIED IDEOGRAPH + \xC3\xE9 |0 # CJK UNIFIED IDEOGRAPH + \xD7\xD8 |0 # CJK UNIFIED IDEOGRAPH + \xB2\xF7 |0 # CJK UNIFIED IDEOGRAPH + \xD8\xAD |0 # CJK UNIFIED IDEOGRAPH + \xD7\xDA |0 # CJK UNIFIED IDEOGRAPH + \xC7\xB0 |0 # CJK UNIFIED IDEOGRAPH + \xD7\xD9 |0 # CJK UNIFIED IDEOGRAPH + \xD7\xD7 |0 # CJK UNIFIED IDEOGRAPH + \xB9\xFA |0 # CJK UNIFIED IDEOGRAPH + \xD7\xDD |0 # CJK UNIFIED IDEOGRAPH + \xD7\xE3 |0 # CJK UNIFIED IDEOGRAPH + \xD7\xE9 |0 # CJK UNIFIED IDEOGRAPH + \xD7\xE1 |0 # CJK UNIFIED IDEOGRAPH + \xC5\xDC |0 # CJK UNIFIED IDEOGRAPH + \xD7\xE6 |0 # CJK UNIFIED IDEOGRAPH + \xC9\xDD |0 # CJK UNIFIED IDEOGRAPH + \xD7\xE0 |0 # CJK UNIFIED IDEOGRAPH + \xD7\xE5 |0 # CJK UNIFIED IDEOGRAPH + \xCE\xE7 |0 # CJK UNIFIED IDEOGRAPH + \xBB\xD7 |0 # CJK UNIFIED IDEOGRAPH + \xC2\xD5 |0 # CJK UNIFIED IDEOGRAPH + \xD7\xDE |0 # CJK UNIFIED IDEOGRAPH + \xB5\xDE |0 # CJK UNIFIED IDEOGRAPH + \xD7\xE8 |0 # CJK UNIFIED IDEOGRAPH + \xC0\xAD |0 # CJK UNIFIED IDEOGRAPH + \xB1\xE5 |0 # CJK UNIFIED IDEOGRAPH + \xD7\xE2 |0 # CJK UNIFIED IDEOGRAPH + \xB2\xF8 |0 # CJK UNIFIED IDEOGRAPH + \xD7\xE7 |0 # CJK UNIFIED IDEOGRAPH + \xB6\xB1 |0 # CJK UNIFIED IDEOGRAPH + \xD7\xE4 |0 # CJK UNIFIED IDEOGRAPH + \xD7\xEA |0 # CJK UNIFIED IDEOGRAPH + \xD7\xEC |0 # CJK UNIFIED IDEOGRAPH + \xD7\xF6 |0 # CJK UNIFIED IDEOGRAPH + \xD7\xF4 |0 # CJK UNIFIED IDEOGRAPH + \xD7\xF1 |0 # CJK UNIFIED IDEOGRAPH + \xD7\xF0 |0 # CJK UNIFIED IDEOGRAPH + \xCE\xF8 |0 # CJK UNIFIED IDEOGRAPH + \xD7\xF2 |0 # CJK UNIFIED IDEOGRAPH + \xB6\xB2 |0 # CJK UNIFIED IDEOGRAPH + \xB9\xB1 |0 # CJK UNIFIED IDEOGRAPH + \xBD\xFA |0 # CJK UNIFIED IDEOGRAPH + \xD7\xF9 |0 # CJK UNIFIED IDEOGRAPH + \xD7\xEB |0 # CJK UNIFIED IDEOGRAPH + \xFA\xA2 |0 # CJK UNIFIED IDEOGRAPH + \xD7\xEF |0 # CJK UNIFIED IDEOGRAPH + \xD7\xDF |0 # CJK UNIFIED IDEOGRAPH + \xB2\xFA |0 # CJK UNIFIED IDEOGRAPH + \xD7\xF3 |0 # CJK UNIFIED IDEOGRAPH + \xD7\xF5 |0 # CJK UNIFIED IDEOGRAPH + \xC3\xD1 |0 # CJK UNIFIED IDEOGRAPH + \xBA\xA8 |0 # CJK UNIFIED IDEOGRAPH + \xB2\xB8 |0 # CJK UNIFIED IDEOGRAPH + \xD7\xED |0 # CJK UNIFIED IDEOGRAPH + \xD7\xF8 |0 # CJK UNIFIED IDEOGRAPH + \xD7\xF7 |0 # CJK UNIFIED IDEOGRAPH + \xB6\xB3 |0 # CJK UNIFIED IDEOGRAPH + \xC2\xA9 |0 # CJK UNIFIED IDEOGRAPH + \xB3\xE6 |0 # CJK UNIFIED IDEOGRAPH + \xB7\xC3 |0 # CJK UNIFIED IDEOGRAPH + \xD7\xEE |0 # CJK UNIFIED IDEOGRAPH + \xD7\xFA |0 # CJK UNIFIED IDEOGRAPH + \xD7\xFD |0 # CJK UNIFIED IDEOGRAPH + \xD8\xA1 |0 # CJK UNIFIED IDEOGRAPH + \xFA\xA3 |0 # CJK UNIFIED IDEOGRAPH + \xBC\xBD |0 # CJK UNIFIED IDEOGRAPH + \xFA\xA4 |0 # CJK UNIFIED IDEOGRAPH + \xD8\xA7 |0 # CJK UNIFIED IDEOGRAPH + \xC4\xF0 |0 # CJK UNIFIED IDEOGRAPH + \xD7\xFB |0 # CJK UNIFIED IDEOGRAPH + \xD8\xA5 |0 # CJK UNIFIED IDEOGRAPH + \xB2\xF9 |0 # CJK UNIFIED IDEOGRAPH + \xD8\xA3 |0 # CJK UNIFIED IDEOGRAPH + \xD8\xA4 |0 # CJK UNIFIED IDEOGRAPH + \xD7\xFE |0 # CJK UNIFIED IDEOGRAPH + \xD8\xA2 |0 # CJK UNIFIED IDEOGRAPH + \xB8\xE7 |0 # CJK UNIFIED IDEOGRAPH + \xCD\xAA |0 # CJK UNIFIED IDEOGRAPH + \xB4\xB5 |0 # CJK UNIFIED IDEOGRAPH + \xB1\xD9 |0 # CJK UNIFIED IDEOGRAPH + \xD8\xA6 |0 # CJK UNIFIED IDEOGRAPH + \xC7\xBA |0 # CJK UNIFIED IDEOGRAPH + \xB0\xAD |0 # CJK UNIFIED IDEOGRAPH + \xC8\xE1 |0 # CJK UNIFIED IDEOGRAPH + \xD7\xDC |0 # CJK UNIFIED IDEOGRAPH + \xD8\xAC |0 # CJK UNIFIED IDEOGRAPH + \xD8\xB0 |0 # CJK UNIFIED IDEOGRAPH + \xCC\xE5 |0 # CJK UNIFIED IDEOGRAPH + \xD8\xA9 |0 # CJK UNIFIED IDEOGRAPH + \xC5\xE9 |0 # CJK UNIFIED IDEOGRAPH + \xD8\xAE |0 # CJK UNIFIED IDEOGRAPH + \xBE\xF0 |0 # CJK UNIFIED IDEOGRAPH + \xD8\xAF |0 # CJK UNIFIED IDEOGRAPH + \xC6\xD7 |0 # CJK UNIFIED IDEOGRAPH + \xCF\xC7 |0 # CJK UNIFIED IDEOGRAPH + \xD8\xAB |0 # CJK UNIFIED IDEOGRAPH + \xFA\xA6 |0 # CJK UNIFIED IDEOGRAPH + \xD8\xB1 |0 # CJK UNIFIED IDEOGRAPH + \xB9\xFB |0 # CJK UNIFIED IDEOGRAPH + \xC0\xCB |0 # CJK UNIFIED IDEOGRAPH + \xFA\xA5 |0 # CJK UNIFIED IDEOGRAPH + \xB0\xD4 |0 # CJK UNIFIED IDEOGRAPH + \xD8\xAA |0 # CJK UNIFIED IDEOGRAPH + \xD8\xA8 |0 # CJK UNIFIED IDEOGRAPH + \xC1\xDA |0 # CJK UNIFIED IDEOGRAPH + \xD7\xFC |0 # CJK UNIFIED IDEOGRAPH + \xBB\xB4 |0 # CJK UNIFIED IDEOGRAPH + \xC2\xC6 |0 # CJK UNIFIED IDEOGRAPH + \xD8\xBD |0 # CJK UNIFIED IDEOGRAPH + \xFA\xA8 |0 # CJK UNIFIED IDEOGRAPH + \xC1\xDB |0 # CJK UNIFIED IDEOGRAPH + \xD8\xB8 |0 # CJK UNIFIED IDEOGRAPH + \xD8\xB5 |0 # CJK UNIFIED IDEOGRAPH + \xD8\xB6 |0 # CJK UNIFIED IDEOGRAPH + \xBC\xE6 |0 # CJK UNIFIED IDEOGRAPH + \xD8\xB9 |0 # CJK UNIFIED IDEOGRAPH + \xD8\xBC |0 # CJK UNIFIED IDEOGRAPH + \xD8\xB7 |0 # CJK UNIFIED IDEOGRAPH + \xBD\xA5 |0 # CJK UNIFIED IDEOGRAPH + \xD8\xBA |0 # CJK UNIFIED IDEOGRAPH + \xD8\xB4 |0 # CJK UNIFIED IDEOGRAPH + \xCC\xFC |0 # CJK UNIFIED IDEOGRAPH + \xCC\xFB |0 # CJK UNIFIED IDEOGRAPH + \xD8\xBE |0 # CJK UNIFIED IDEOGRAPH + \xD8\xBF |0 # CJK UNIFIED IDEOGRAPH + \xB0\xD5 |0 # CJK UNIFIED IDEOGRAPH + \xFA\xA9 |0 # CJK UNIFIED IDEOGRAPH + \xD8\xB3 |0 # CJK UNIFIED IDEOGRAPH + \xB6\xF2 |0 # CJK UNIFIED IDEOGRAPH + \xB0\xA6 |0 # CJK UNIFIED IDEOGRAPH + \xB4\xB6 |0 # CJK UNIFIED IDEOGRAPH + \xFA\xA7 |0 # CJK UNIFIED IDEOGRAPH + \xD8\xBB |0 # CJK UNIFIED IDEOGRAPH + \xD8\xC3 |0 # CJK UNIFIED IDEOGRAPH + \xD8\xC2 |0 # CJK UNIFIED IDEOGRAPH + \xD8\xC7 |0 # CJK UNIFIED IDEOGRAPH + \xFA\xAB |0 # CJK UNIFIED IDEOGRAPH + \xD8\xC8 |0 # CJK UNIFIED IDEOGRAPH + \xFA\xAA |0 # CJK UNIFIED IDEOGRAPH + \xD8\xC6 |0 # CJK UNIFIED IDEOGRAPH + \xD8\xC9 |0 # CJK UNIFIED IDEOGRAPH + \xD8\xC1 |0 # CJK UNIFIED IDEOGRAPH + \xD8\xC5 |0 # CJK UNIFIED IDEOGRAPH + \xD8\xCA |0 # CJK UNIFIED IDEOGRAPH + \xD8\xCB |0 # CJK UNIFIED IDEOGRAPH + \xD8\xC0 |0 # CJK UNIFIED IDEOGRAPH + \xBB\xFC |0 # CJK UNIFIED IDEOGRAPH + \xD8\xC4 |0 # CJK UNIFIED IDEOGRAPH + \xC2\xD6 |0 # CJK UNIFIED IDEOGRAPH + \xB9\xB2 |0 # CJK UNIFIED IDEOGRAPH + \xD8\xB2 |0 # CJK UNIFIED IDEOGRAPH + \xBF\xB5 |0 # CJK UNIFIED IDEOGRAPH + \xD8\xD8 |0 # CJK UNIFIED IDEOGRAPH + \xCA\xE9 |0 # CJK UNIFIED IDEOGRAPH + \xD8\xCE |0 # CJK UNIFIED IDEOGRAPH + \xD8\xCF |0 # CJK UNIFIED IDEOGRAPH + \xD8\xD0 |0 # CJK UNIFIED IDEOGRAPH + \xD8\xD7 |0 # CJK UNIFIED IDEOGRAPH + \xD8\xD6 |0 # CJK UNIFIED IDEOGRAPH + \xCB\xFD |0 # CJK UNIFIED IDEOGRAPH + \xB4\xB7 |0 # CJK UNIFIED IDEOGRAPH + \xD8\xD4 |0 # CJK UNIFIED IDEOGRAPH + \xB7\xC5 |0 # CJK UNIFIED IDEOGRAPH + \xB3\xB4 |0 # CJK UNIFIED IDEOGRAPH + \xD8\xD1 |0 # CJK UNIFIED IDEOGRAPH + \xCE\xB8 |0 # CJK UNIFIED IDEOGRAPH + \xD8\xD3 |0 # CJK UNIFIED IDEOGRAPH + \xB0\xD6 |0 # CJK UNIFIED IDEOGRAPH + \xD8\xD5 |0 # CJK UNIFIED IDEOGRAPH + \xD8\xCC |0 # CJK UNIFIED IDEOGRAPH + \xD8\xD2 |0 # CJK UNIFIED IDEOGRAPH + \xD8\xD9 |0 # CJK UNIFIED IDEOGRAPH + \xB7\xC4 |0 # CJK UNIFIED IDEOGRAPH + \xD8\xCD |0 # CJK UNIFIED IDEOGRAPH + \xCD\xDD |0 # CJK UNIFIED IDEOGRAPH + \xCD\xAB |0 # CJK UNIFIED IDEOGRAPH + \xD8\xDC |0 # CJK UNIFIED IDEOGRAPH + \xD8\xE0 |0 # CJK UNIFIED IDEOGRAPH + \xC1\xFE |0 # CJK UNIFIED IDEOGRAPH + \xCE\xF9 |0 # CJK UNIFIED IDEOGRAPH + \xD8\xE1 |0 # CJK UNIFIED IDEOGRAPH + \xD8\xDE |0 # CJK UNIFIED IDEOGRAPH + \xD8\xDB |0 # CJK UNIFIED IDEOGRAPH + \xFA\xAC |0 # CJK UNIFIED IDEOGRAPH + \xD8\xDA |0 # CJK UNIFIED IDEOGRAPH + \xD8\xDF |0 # CJK UNIFIED IDEOGRAPH + \xCA\xB0 |0 # CJK UNIFIED IDEOGRAPH + \xC6\xB4 |0 # CJK UNIFIED IDEOGRAPH + \xB7\xC6 |0 # CJK UNIFIED IDEOGRAPH + \xD8\xE2 |0 # CJK UNIFIED IDEOGRAPH + \xD8\xDD |0 # CJK UNIFIED IDEOGRAPH + \xD8\xE3 |0 # CJK UNIFIED IDEOGRAPH + \xB7\xFB |0 # CJK UNIFIED IDEOGRAPH + \xB2\xB1 |0 # CJK UNIFIED IDEOGRAPH + \xD8\xEB |0 # CJK UNIFIED IDEOGRAPH + \xB4\xB8 |0 # CJK UNIFIED IDEOGRAPH + \xD8\xE9 |0 # CJK UNIFIED IDEOGRAPH + \xD8\xEA |0 # CJK UNIFIED IDEOGRAPH + \xBA\xA9 |0 # CJK UNIFIED IDEOGRAPH + \xD8\xE8 |0 # CJK UNIFIED IDEOGRAPH + \xD8\xE6 |0 # CJK UNIFIED IDEOGRAPH + \xD8\xE5 |0 # CJK UNIFIED IDEOGRAPH + \xD8\xEC |0 # CJK UNIFIED IDEOGRAPH + \xD8\xE4 |0 # CJK UNIFIED IDEOGRAPH + \xD8\xEE |0 # CJK UNIFIED IDEOGRAPH + \xB2\xFB |0 # CJK UNIFIED IDEOGRAPH + \xD8\xF0 |0 # CJK UNIFIED IDEOGRAPH + \xD8\xEF |0 # CJK UNIFIED IDEOGRAPH + \xC4\xA8 |0 # CJK UNIFIED IDEOGRAPH + \xD8\xF3 |0 # CJK UNIFIED IDEOGRAPH + \xD8\xF1 |0 # CJK UNIFIED IDEOGRAPH + \xD8\xE7 |0 # CJK UNIFIED IDEOGRAPH + \xB7\xFC |0 # CJK UNIFIED IDEOGRAPH + \xD8\xF2 |0 # CJK UNIFIED IDEOGRAPH + \xD8\xF6 |0 # CJK UNIFIED IDEOGRAPH + \xD8\xF5 |0 # CJK UNIFIED IDEOGRAPH + \xD8\xF7 |0 # CJK UNIFIED IDEOGRAPH + \xD8\xF4 |0 # CJK UNIFIED IDEOGRAPH + \xD8\xF8 |0 # CJK UNIFIED IDEOGRAPH + \xD8\xF9 |0 # CJK UNIFIED IDEOGRAPH + \xD8\xFA |0 # CJK UNIFIED IDEOGRAPH + \xCA\xEA |0 # CJK UNIFIED IDEOGRAPH + \xD8\xFC |0 # CJK UNIFIED IDEOGRAPH + \xD8\xFB |0 # CJK UNIFIED IDEOGRAPH + \xBD\xBF |0 # CJK UNIFIED IDEOGRAPH + \xC0\xAE |0 # CJK UNIFIED IDEOGRAPH + \xB2\xE6 |0 # CJK UNIFIED IDEOGRAPH + \xB2\xFC |0 # CJK UNIFIED IDEOGRAPH + \xFA\xAD |0 # CJK UNIFIED IDEOGRAPH + \xD8\xFD |0 # CJK UNIFIED IDEOGRAPH + \xB0\xBF |0 # CJK UNIFIED IDEOGRAPH + \xC0\xCC |0 # CJK UNIFIED IDEOGRAPH + \xD8\xFE |0 # CJK UNIFIED IDEOGRAPH + \xEC\xC3 |0 # CJK UNIFIED IDEOGRAPH + \xD9\xA1 |0 # CJK UNIFIED IDEOGRAPH + \xB7\xE1 |0 # CJK UNIFIED IDEOGRAPH + \xD9\xA2 |0 # CJK UNIFIED IDEOGRAPH + \xC0\xEF |0 # CJK UNIFIED IDEOGRAPH + \xD9\xA3 |0 # CJK UNIFIED IDEOGRAPH + \xD9\xA4 |0 # CJK UNIFIED IDEOGRAPH + \xB5\xBA |0 # CJK UNIFIED IDEOGRAPH + \xD9\xA5 |0 # CJK UNIFIED IDEOGRAPH + \xD9\xA6 |0 # CJK UNIFIED IDEOGRAPH + \xD9\xA7 |0 # CJK UNIFIED IDEOGRAPH + \xC2\xD7 |0 # CJK UNIFIED IDEOGRAPH + \xB8\xCD |0 # CJK UNIFIED IDEOGRAPH + \xCC\xE1 |0 # CJK UNIFIED IDEOGRAPH + \xCB\xBC |0 # CJK UNIFIED IDEOGRAPH + \xBD\xEA |0 # CJK UNIFIED IDEOGRAPH + \xD9\xA8 |0 # CJK UNIFIED IDEOGRAPH + \xC0\xF0 |0 # CJK UNIFIED IDEOGRAPH + \xEE\xBD |0 # CJK UNIFIED IDEOGRAPH + \xC8\xE2 |0 # CJK UNIFIED IDEOGRAPH + \xBC\xEA |0 # CJK UNIFIED IDEOGRAPH + \xBA\xCD |0 # CJK UNIFIED IDEOGRAPH + \xD9\xA9 |0 # CJK UNIFIED IDEOGRAPH + \xC2\xC7 |0 # CJK UNIFIED IDEOGRAPH + \xCA\xA7 |0 # CJK UNIFIED IDEOGRAPH + \xC2\xF1 |0 # CJK UNIFIED IDEOGRAPH + \xD9\xAC |0 # CJK UNIFIED IDEOGRAPH + \xD9\xAA |0 # CJK UNIFIED IDEOGRAPH + \xD9\xAD |0 # CJK UNIFIED IDEOGRAPH + \xD9\xAB |0 # CJK UNIFIED IDEOGRAPH + \xD9\xAE |0 # CJK UNIFIED IDEOGRAPH + \xCA\xB1 |0 # CJK UNIFIED IDEOGRAPH + \xB0\xB7 |0 # CJK UNIFIED IDEOGRAPH + \xC9\xDE |0 # CJK UNIFIED IDEOGRAPH + \xC8\xE3 |0 # CJK UNIFIED IDEOGRAPH + \xD9\xAF |0 # CJK UNIFIED IDEOGRAPH + \xD9\xB2 |0 # CJK UNIFIED IDEOGRAPH + \xBE\xB5 |0 # CJK UNIFIED IDEOGRAPH + \xB5\xBB |0 # CJK UNIFIED IDEOGRAPH + \xD9\xB0 |0 # CJK UNIFIED IDEOGRAPH + \xD9\xB7 |0 # CJK UNIFIED IDEOGRAPH + \xBE\xB6 |0 # CJK UNIFIED IDEOGRAPH + \xD9\xB1 |0 # CJK UNIFIED IDEOGRAPH + \xC7\xC4 |0 # CJK UNIFIED IDEOGRAPH + \xCD\xDE |0 # CJK UNIFIED IDEOGRAPH + \xD9\xB3 |0 # CJK UNIFIED IDEOGRAPH + \xD9\xB4 |0 # CJK UNIFIED IDEOGRAPH + \xD9\xB8 |0 # CJK UNIFIED IDEOGRAPH + \xC5\xEA |0 # CJK UNIFIED IDEOGRAPH + \xD9\xB5 |0 # CJK UNIFIED IDEOGRAPH + \xB9\xB3 |0 # CJK UNIFIED IDEOGRAPH + \xC0\xDE |0 # CJK UNIFIED IDEOGRAPH + \xD9\xC6 |0 # CJK UNIFIED IDEOGRAPH + \xC8\xB4 |0 # CJK UNIFIED IDEOGRAPH + \xC2\xF2 |0 # CJK UNIFIED IDEOGRAPH + \xFA\xAE |0 # CJK UNIFIED IDEOGRAPH + \xC8\xE4 |0 # CJK UNIFIED IDEOGRAPH + \xDA\xAD |0 # CJK UNIFIED IDEOGRAPH + \xCA\xFA |0 # CJK UNIFIED IDEOGRAPH + \xC4\xF1 |0 # CJK UNIFIED IDEOGRAPH + \xCB\xF5 |0 # CJK UNIFIED IDEOGRAPH + \xD9\xBB |0 # CJK UNIFIED IDEOGRAPH + \xB2\xA1 |0 # CJK UNIFIED IDEOGRAPH + \xC3\xEA |0 # CJK UNIFIED IDEOGRAPH + \xD9\xC4 |0 # CJK UNIFIED IDEOGRAPH + \xC3\xB4 |0 # CJK UNIFIED IDEOGRAPH + \xD9\xBE |0 # CJK UNIFIED IDEOGRAPH + \xD9\xC5 |0 # CJK UNIFIED IDEOGRAPH + \xD9\xC0 |0 # CJK UNIFIED IDEOGRAPH + \xD9\xC7 |0 # CJK UNIFIED IDEOGRAPH + \xD9\xC3 |0 # CJK UNIFIED IDEOGRAPH + \xD9\xC2 |0 # CJK UNIFIED IDEOGRAPH + \xC7\xEF |0 # CJK UNIFIED IDEOGRAPH + \xD9\xBC |0 # CJK UNIFIED IDEOGRAPH + \xB2\xFD |0 # CJK UNIFIED IDEOGRAPH + \xD9\xBA |0 # CJK UNIFIED IDEOGRAPH + \xB5\xF1 |0 # CJK UNIFIED IDEOGRAPH + \xC2\xF3 |0 # CJK UNIFIED IDEOGRAPH + \xD9\xB6 |0 # CJK UNIFIED IDEOGRAPH + \xD9\xB9 |0 # CJK UNIFIED IDEOGRAPH + \xB9\xB4 |0 # CJK UNIFIED IDEOGRAPH + \xC0\xDB |0 # CJK UNIFIED IDEOGRAPH + \xBE\xB7 |0 # CJK UNIFIED IDEOGRAPH + \xD9\xC1 |0 # CJK UNIFIED IDEOGRAPH + \xC7\xD2 |0 # CJK UNIFIED IDEOGRAPH + \xB5\xF2 |0 # CJK UNIFIED IDEOGRAPH + \xB3\xC8 |0 # CJK UNIFIED IDEOGRAPH + \xB3\xE7 |0 # CJK UNIFIED IDEOGRAPH + \xBF\xA1 |0 # CJK UNIFIED IDEOGRAPH + \xD9\xC9 |0 # CJK UNIFIED IDEOGRAPH + \xD9\xCE |0 # CJK UNIFIED IDEOGRAPH + \xD9\xCA |0 # CJK UNIFIED IDEOGRAPH + \xB7\xFD |0 # CJK UNIFIED IDEOGRAPH + \xD9\xCF |0 # CJK UNIFIED IDEOGRAPH + \xBB\xA2 |0 # CJK UNIFIED IDEOGRAPH + \xB9\xE9 |0 # CJK UNIFIED IDEOGRAPH + \xBD\xA6 |0 # CJK UNIFIED IDEOGRAPH + \xD9\xBD |0 # CJK UNIFIED IDEOGRAPH + \xBB\xFD |0 # CJK UNIFIED IDEOGRAPH + \xD9\xCC |0 # CJK UNIFIED IDEOGRAPH + \xBB\xD8 |0 # CJK UNIFIED IDEOGRAPH + \xD9\xCD |0 # CJK UNIFIED IDEOGRAPH + \xB0\xC4 |0 # CJK UNIFIED IDEOGRAPH + \xD9\xC8 |0 # CJK UNIFIED IDEOGRAPH + \xC4\xA9 |0 # CJK UNIFIED IDEOGRAPH + \xB5\xF3 |0 # CJK UNIFIED IDEOGRAPH + \xB6\xB4 |0 # CJK UNIFIED IDEOGRAPH + \xD9\xCB |0 # CJK UNIFIED IDEOGRAPH + \xB0\xA7 |0 # CJK UNIFIED IDEOGRAPH + \xBA\xC3 |0 # CJK UNIFIED IDEOGRAPH + \xBF\xB6 |0 # CJK UNIFIED IDEOGRAPH + \xC4\xF2 |0 # CJK UNIFIED IDEOGRAPH + \xC8\xD4 |0 # CJK UNIFIED IDEOGRAPH + \xD9\xD1 |0 # CJK UNIFIED IDEOGRAPH + \xC1\xDE |0 # CJK UNIFIED IDEOGRAPH + \xC2\xAA |0 # CJK UNIFIED IDEOGRAPH + \xBB\xAB |0 # CJK UNIFIED IDEOGRAPH + \xD9\xD2 |0 # CJK UNIFIED IDEOGRAPH + \xD9\xD4 |0 # CJK UNIFIED IDEOGRAPH + \xD9\xD0 |0 # CJK UNIFIED IDEOGRAPH + \xCA\xE1 |0 # CJK UNIFIED IDEOGRAPH + \xC4\xBD |0 # CJK UNIFIED IDEOGRAPH + \xC1\xDC |0 # CJK UNIFIED IDEOGRAPH + \xCA\xFB |0 # CJK UNIFIED IDEOGRAPH + \xBC\xCE |0 # CJK UNIFIED IDEOGRAPH + \xD9\xE0 |0 # CJK UNIFIED IDEOGRAPH + \xD9\xDF |0 # CJK UNIFIED IDEOGRAPH + \xBF\xF8 |0 # CJK UNIFIED IDEOGRAPH + \xB7\xFE |0 # CJK UNIFIED IDEOGRAPH + \xD9\xD9 |0 # CJK UNIFIED IDEOGRAPH + \xBE\xB9 |0 # CJK UNIFIED IDEOGRAPH + \xC6\xE8 |0 # CJK UNIFIED IDEOGRAPH + \xC7\xB1 |0 # CJK UNIFIED IDEOGRAPH + \xD9\xD7 |0 # CJK UNIFIED IDEOGRAPH + \xC1\xDD |0 # CJK UNIFIED IDEOGRAPH + \xBC\xF8 |0 # CJK UNIFIED IDEOGRAPH + \xD9\xDC |0 # CJK UNIFIED IDEOGRAPH + \xBE\xB8 |0 # CJK UNIFIED IDEOGRAPH + \xD9\xD6 |0 # CJK UNIFIED IDEOGRAPH + \xD9\xDB |0 # CJK UNIFIED IDEOGRAPH + \xC7\xD3 |0 # CJK UNIFIED IDEOGRAPH + \xD9\xD5 |0 # CJK UNIFIED IDEOGRAPH + \xB7\xA1 |0 # CJK UNIFIED IDEOGRAPH + \xB3\xDD |0 # CJK UNIFIED IDEOGRAPH + \xD9\xDD |0 # CJK UNIFIED IDEOGRAPH + \xCE\xAB |0 # CJK UNIFIED IDEOGRAPH + \xBA\xCE |0 # CJK UNIFIED IDEOGRAPH + \xC3\xB5 |0 # CJK UNIFIED IDEOGRAPH + \xD9\xDA |0 # CJK UNIFIED IDEOGRAPH + \xC0\xDC |0 # CJK UNIFIED IDEOGRAPH + \xB9\xB5 |0 # CJK UNIFIED IDEOGRAPH + \xBF\xE4 |0 # CJK UNIFIED IDEOGRAPH + \xB1\xE6 |0 # CJK UNIFIED IDEOGRAPH + \xC1\xBC |0 # CJK UNIFIED IDEOGRAPH + \xD9\xD8 |0 # CJK UNIFIED IDEOGRAPH + \xB5\xC5 |0 # CJK UNIFIED IDEOGRAPH + \xB7\xC7 |0 # CJK UNIFIED IDEOGRAPH + \xC4\xCF |0 # CJK UNIFIED IDEOGRAPH + \xD9\xDE |0 # CJK UNIFIED IDEOGRAPH + \xC1\xDF |0 # CJK UNIFIED IDEOGRAPH + \xD9\xE1 |0 # CJK UNIFIED IDEOGRAPH + \xD9\xE3 |0 # CJK UNIFIED IDEOGRAPH + \xC2\xB7 |0 # CJK UNIFIED IDEOGRAPH + \xD9\xE9 |0 # CJK UNIFIED IDEOGRAPH + \xD9\xE4 |0 # CJK UNIFIED IDEOGRAPH + \xD9\xE6 |0 # CJK UNIFIED IDEOGRAPH + \xC9\xC1 |0 # CJK UNIFIED IDEOGRAPH + \xC4\xF3 |0 # CJK UNIFIED IDEOGRAPH + \xD9\xE7 |0 # CJK UNIFIED IDEOGRAPH + \xCD\xAC |0 # CJK UNIFIED IDEOGRAPH + \xCD\xC8 |0 # CJK UNIFIED IDEOGRAPH + \xB4\xB9 |0 # CJK UNIFIED IDEOGRAPH + \xB0\xAE |0 # CJK UNIFIED IDEOGRAPH + \xD9\xE5 |0 # CJK UNIFIED IDEOGRAPH + \xD9\xE2 |0 # CJK UNIFIED IDEOGRAPH + \xB4\xF8 |0 # CJK UNIFIED IDEOGRAPH + \xB1\xE7 |0 # CJK UNIFIED IDEOGRAPH + \xFA\xAF |0 # CJK UNIFIED IDEOGRAPH + \xD9\xE8 |0 # CJK UNIFIED IDEOGRAPH + \xCD\xC9 |0 # CJK UNIFIED IDEOGRAPH + \xD9\xEC |0 # CJK UNIFIED IDEOGRAPH + \xC2\xBB |0 # CJK UNIFIED IDEOGRAPH + \xD9\xF3 |0 # CJK UNIFIED IDEOGRAPH + \xD9\xED |0 # CJK UNIFIED IDEOGRAPH + \xD9\xEA |0 # CJK UNIFIED IDEOGRAPH + \xD9\xF1 |0 # CJK UNIFIED IDEOGRAPH + \xD9\xD3 |0 # CJK UNIFIED IDEOGRAPH + \xD9\xEE |0 # CJK UNIFIED IDEOGRAPH + \xD9\xF2 |0 # CJK UNIFIED IDEOGRAPH + \xC8\xC2 |0 # CJK UNIFIED IDEOGRAPH + \xC5\xEB |0 # CJK UNIFIED IDEOGRAPH + \xD9\xEB |0 # CJK UNIFIED IDEOGRAPH + \xD9\xEF |0 # CJK UNIFIED IDEOGRAPH + \xB7\xC8 |0 # CJK UNIFIED IDEOGRAPH + \xBA\xF1 |0 # CJK UNIFIED IDEOGRAPH + \xC0\xDD |0 # CJK UNIFIED IDEOGRAPH + \xD9\xF7 |0 # CJK UNIFIED IDEOGRAPH + \xC5\xA6 |0 # CJK UNIFIED IDEOGRAPH + \xFA\xB0 |0 # CJK UNIFIED IDEOGRAPH + \xD9\xF4 |0 # CJK UNIFIED IDEOGRAPH + \xCB\xE0 |0 # CJK UNIFIED IDEOGRAPH + \xD9\xF5 |0 # CJK UNIFIED IDEOGRAPH + \xD9\xF6 |0 # CJK UNIFIED IDEOGRAPH + \xCC\xCE |0 # CJK UNIFIED IDEOGRAPH + \xC0\xA2 |0 # CJK UNIFIED IDEOGRAPH + \xB7\xE2 |0 # CJK UNIFIED IDEOGRAPH + \xD9\xFD |0 # CJK UNIFIED IDEOGRAPH + \xBB\xB5 |0 # CJK UNIFIED IDEOGRAPH + \xD9\xFA |0 # CJK UNIFIED IDEOGRAPH + \xD9\xF9 |0 # CJK UNIFIED IDEOGRAPH + \xC7\xB2 |0 # CJK UNIFIED IDEOGRAPH + \xFA\xB1 |0 # CJK UNIFIED IDEOGRAPH + \xC6\xB5 |0 # CJK UNIFIED IDEOGRAPH + \xC5\xB1 |0 # CJK UNIFIED IDEOGRAPH + \xD9\xFB |0 # CJK UNIFIED IDEOGRAPH + \xD9\xFC |0 # CJK UNIFIED IDEOGRAPH + \xC9\xEF |0 # CJK UNIFIED IDEOGRAPH + \xC7\xC5 |0 # CJK UNIFIED IDEOGRAPH + \xBB\xA3 |0 # CJK UNIFIED IDEOGRAPH + \xC0\xF1 |0 # CJK UNIFIED IDEOGRAPH + \xCB\xD0 |0 # CJK UNIFIED IDEOGRAPH + \xB3\xC9 |0 # CJK UNIFIED IDEOGRAPH + \xDA\xA5 |0 # CJK UNIFIED IDEOGRAPH + \xD9\xFE |0 # CJK UNIFIED IDEOGRAPH + \xCD\xCA |0 # CJK UNIFIED IDEOGRAPH + \xDA\xA7 |0 # CJK UNIFIED IDEOGRAPH + \xDA\xA3 |0 # CJK UNIFIED IDEOGRAPH + \xDA\xA4 |0 # CJK UNIFIED IDEOGRAPH + \xC1\xE0 |0 # CJK UNIFIED IDEOGRAPH + \xFA\xB2 |0 # CJK UNIFIED IDEOGRAPH + \xDA\xA2 |0 # CJK UNIFIED IDEOGRAPH + \xD9\xBF |0 # CJK UNIFIED IDEOGRAPH + \xDA\xA6 |0 # CJK UNIFIED IDEOGRAPH + \xDA\xA1 |0 # CJK UNIFIED IDEOGRAPH + \xDA\xAB |0 # CJK UNIFIED IDEOGRAPH + \xDA\xAC |0 # CJK UNIFIED IDEOGRAPH + \xC5\xA7 |0 # CJK UNIFIED IDEOGRAPH + \xDA\xAE |0 # CJK UNIFIED IDEOGRAPH + \xBB\xA4 |0 # CJK UNIFIED IDEOGRAPH + \xDA\xA9 |0 # CJK UNIFIED IDEOGRAPH + \xB5\xBC |0 # CJK UNIFIED IDEOGRAPH + \xDA\xAF |0 # CJK UNIFIED IDEOGRAPH + \xDA\xA8 |0 # CJK UNIFIED IDEOGRAPH + \xDA\xB3 |0 # CJK UNIFIED IDEOGRAPH + \xDA\xB2 |0 # CJK UNIFIED IDEOGRAPH + \xDA\xB1 |0 # CJK UNIFIED IDEOGRAPH + \xDA\xB4 |0 # CJK UNIFIED IDEOGRAPH + \xDA\xB6 |0 # CJK UNIFIED IDEOGRAPH + \xBE\xF1 |0 # CJK UNIFIED IDEOGRAPH + \xDA\xB5 |0 # CJK UNIFIED IDEOGRAPH + \xDA\xB9 |0 # CJK UNIFIED IDEOGRAPH + \xDA\xB7 |0 # CJK UNIFIED IDEOGRAPH + \xDA\xB8 |0 # CJK UNIFIED IDEOGRAPH + \xD9\xF0 |0 # CJK UNIFIED IDEOGRAPH + \xDA\xBB |0 # CJK UNIFIED IDEOGRAPH + \xDA\xBA |0 # CJK UNIFIED IDEOGRAPH + \xD9\xF8 |0 # CJK UNIFIED IDEOGRAPH + \xDA\xBC |0 # CJK UNIFIED IDEOGRAPH + \xDA\xB0 |0 # CJK UNIFIED IDEOGRAPH + \xBB\xD9 |0 # CJK UNIFIED IDEOGRAPH + \xDA\xBD |0 # CJK UNIFIED IDEOGRAPH + \xDA\xBE |0 # CJK UNIFIED IDEOGRAPH + \xDA\xC0 |0 # CJK UNIFIED IDEOGRAPH + \xDA\xBF |0 # CJK UNIFIED IDEOGRAPH + \xDA\xC1 |0 # CJK UNIFIED IDEOGRAPH + \xB2\xFE |0 # CJK UNIFIED IDEOGRAPH + \xB9\xB6 |0 # CJK UNIFIED IDEOGRAPH + \xCA\xFC |0 # CJK UNIFIED IDEOGRAPH + \xC0\xAF |0 # CJK UNIFIED IDEOGRAPH + \xB8\xCE |0 # CJK UNIFIED IDEOGRAPH + \xDA\xC3 |0 # CJK UNIFIED IDEOGRAPH + \xDA\xC6 |0 # CJK UNIFIED IDEOGRAPH + \xFA\xB3 |0 # CJK UNIFIED IDEOGRAPH + \xC9\xD2 |0 # CJK UNIFIED IDEOGRAPH + \xB5\xDF |0 # CJK UNIFIED IDEOGRAPH + \xDA\xC5 |0 # CJK UNIFIED IDEOGRAPH + \xDA\xC4 |0 # CJK UNIFIED IDEOGRAPH + \xC7\xD4 |0 # CJK UNIFIED IDEOGRAPH + \xDA\xC7 |0 # CJK UNIFIED IDEOGRAPH + \xB6\xB5 |0 # CJK UNIFIED IDEOGRAPH + \xDA\xC9 |0 # CJK UNIFIED IDEOGRAPH + \xDA\xC8 |0 # CJK UNIFIED IDEOGRAPH + \xB4\xBA |0 # CJK UNIFIED IDEOGRAPH + \xBB\xB6 |0 # CJK UNIFIED IDEOGRAPH + \xC6\xD8 |0 # CJK UNIFIED IDEOGRAPH + \xB7\xC9 |0 # CJK UNIFIED IDEOGRAPH + \xBF\xF4 |0 # CJK UNIFIED IDEOGRAPH + \xDA\xCA |0 # CJK UNIFIED IDEOGRAPH + \xC0\xB0 |0 # CJK UNIFIED IDEOGRAPH + \xC5\xA8 |0 # CJK UNIFIED IDEOGRAPH + \xC9\xDF |0 # CJK UNIFIED IDEOGRAPH + \xDA\xCB |0 # CJK UNIFIED IDEOGRAPH + \xDA\xCC |0 # CJK UNIFIED IDEOGRAPH + \xDA\xCD |0 # CJK UNIFIED IDEOGRAPH + \xCA\xB8 |0 # CJK UNIFIED IDEOGRAPH + \xD5\xDD |0 # CJK UNIFIED IDEOGRAPH + \xC0\xC6 |0 # CJK UNIFIED IDEOGRAPH + \xC9\xCC |0 # CJK UNIFIED IDEOGRAPH + \xBA\xD8 |0 # CJK UNIFIED IDEOGRAPH + \xC8\xE5 |0 # CJK UNIFIED IDEOGRAPH + \xC8\xC3 |0 # CJK UNIFIED IDEOGRAPH + \xC5\xCD |0 # CJK UNIFIED IDEOGRAPH + \xCE\xC1 |0 # CJK UNIFIED IDEOGRAPH + \xDA\xCF |0 # CJK UNIFIED IDEOGRAPH + \xBC\xD0 |0 # CJK UNIFIED IDEOGRAPH + \xDA\xD0 |0 # CJK UNIFIED IDEOGRAPH + \xB0\xB6 |0 # CJK UNIFIED IDEOGRAPH + \xB6\xD4 |0 # CJK UNIFIED IDEOGRAPH + \xC0\xCD |0 # CJK UNIFIED IDEOGRAPH + \xC9\xE0 |0 # CJK UNIFIED IDEOGRAPH + \xDA\xD1 |0 # CJK UNIFIED IDEOGRAPH + \xBB\xC2 |0 # CJK UNIFIED IDEOGRAPH + \xC3\xC7 |0 # CJK UNIFIED IDEOGRAPH + \xBB\xDB |0 # CJK UNIFIED IDEOGRAPH + \xBF\xB7 |0 # CJK UNIFIED IDEOGRAPH + \xDA\xD2 |0 # CJK UNIFIED IDEOGRAPH + \xCA\xFD |0 # CJK UNIFIED IDEOGRAPH + \xB1\xF7 |0 # CJK UNIFIED IDEOGRAPH + \xBB\xDC |0 # CJK UNIFIED IDEOGRAPH + \xDA\xD5 |0 # CJK UNIFIED IDEOGRAPH + \xDA\xD3 |0 # CJK UNIFIED IDEOGRAPH + \xDA\xD6 |0 # CJK UNIFIED IDEOGRAPH + \xCE\xB9 |0 # CJK UNIFIED IDEOGRAPH + \xDA\xD4 |0 # CJK UNIFIED IDEOGRAPH + \xC0\xFB |0 # CJK UNIFIED IDEOGRAPH + \xDA\xD7 |0 # CJK UNIFIED IDEOGRAPH + \xC2\xB2 |0 # CJK UNIFIED IDEOGRAPH + \xDA\xD8 |0 # CJK UNIFIED IDEOGRAPH + \xB4\xFA |0 # CJK UNIFIED IDEOGRAPH + \xDA\xDA |0 # CJK UNIFIED IDEOGRAPH + \xDA\xD9 |0 # CJK UNIFIED IDEOGRAPH + \xDA\xDB |0 # CJK UNIFIED IDEOGRAPH + \xDA\xDC |0 # CJK UNIFIED IDEOGRAPH + \xB4\xFB |0 # CJK UNIFIED IDEOGRAPH + \xC6\xFC |0 # CJK UNIFIED IDEOGRAPH + \xC3\xB6 |0 # CJK UNIFIED IDEOGRAPH + \xB5\xEC |0 # CJK UNIFIED IDEOGRAPH + \xBB\xDD |0 # CJK UNIFIED IDEOGRAPH + \xC1\xE1 |0 # CJK UNIFIED IDEOGRAPH + \xBD\xDC |0 # CJK UNIFIED IDEOGRAPH + \xB0\xB0 |0 # CJK UNIFIED IDEOGRAPH + \xDA\xDD |0 # CJK UNIFIED IDEOGRAPH + \xB2\xA2 |0 # CJK UNIFIED IDEOGRAPH + \xDA\xE1 |0 # CJK UNIFIED IDEOGRAPH + \xFA\xB4 |0 # CJK UNIFIED IDEOGRAPH + \xB9\xB7 |0 # CJK UNIFIED IDEOGRAPH + \xDA\xE0 |0 # CJK UNIFIED IDEOGRAPH + \xBA\xAB |0 # CJK UNIFIED IDEOGRAPH + \xBE\xBA |0 # CJK UNIFIED IDEOGRAPH + \xFA\xB7 |0 # CJK UNIFIED IDEOGRAPH + \xDA\xDF |0 # CJK UNIFIED IDEOGRAPH + \xBE\xBB |0 # CJK UNIFIED IDEOGRAPH + \xCC\xC0 |0 # CJK UNIFIED IDEOGRAPH + \xBA\xAA |0 # CJK UNIFIED IDEOGRAPH + \xB0\xD7 |0 # CJK UNIFIED IDEOGRAPH + \xC0\xCE |0 # CJK UNIFIED IDEOGRAPH + \xFA\xB5 |0 # CJK UNIFIED IDEOGRAPH + \xDA\xE6 |0 # CJK UNIFIED IDEOGRAPH + \xFA\xB9 |0 # CJK UNIFIED IDEOGRAPH + \xC0\xB1 |0 # CJK UNIFIED IDEOGRAPH + \xB1\xC7 |0 # CJK UNIFIED IDEOGRAPH + \xFA\xBA |0 # CJK UNIFIED IDEOGRAPH + \xBD\xD5 |0 # CJK UNIFIED IDEOGRAPH + \xCB\xE6 |0 # CJK UNIFIED IDEOGRAPH + \xBA\xF2 |0 # CJK UNIFIED IDEOGRAPH + \xBE\xBC |0 # CJK UNIFIED IDEOGRAPH + \xFA\xB8 |0 # CJK UNIFIED IDEOGRAPH + \xC0\xA7 |0 # CJK UNIFIED IDEOGRAPH + \xF9\xA8 |0 # CJK UNIFIED IDEOGRAPH + \xDA\xE5 |0 # CJK UNIFIED IDEOGRAPH + \xDA\xE3 |0 # CJK UNIFIED IDEOGRAPH + \xDA\xE4 |0 # CJK UNIFIED IDEOGRAPH + \xFA\xB6 |0 # CJK UNIFIED IDEOGRAPH + \xC3\xEB |0 # CJK UNIFIED IDEOGRAPH + \xDB\xA6 |0 # CJK UNIFIED IDEOGRAPH + \xDA\xEA |0 # CJK UNIFIED IDEOGRAPH + \xBB\xFE |0 # CJK UNIFIED IDEOGRAPH + \xB9\xB8 |0 # CJK UNIFIED IDEOGRAPH + \xDA\xE8 |0 # CJK UNIFIED IDEOGRAPH + \xDA\xE9 |0 # CJK UNIFIED IDEOGRAPH + \xBF\xB8 |0 # CJK UNIFIED IDEOGRAPH + \xDA\xE7 |0 # CJK UNIFIED IDEOGRAPH + \xBB\xAF |0 # CJK UNIFIED IDEOGRAPH + \xFA\xBC |0 # CJK UNIFIED IDEOGRAPH + \xFA\xBD |0 # CJK UNIFIED IDEOGRAPH + \xDA\xEC |0 # CJK UNIFIED IDEOGRAPH + \xDA\xEB |0 # CJK UNIFIED IDEOGRAPH + \xDA\xF0 |0 # CJK UNIFIED IDEOGRAPH + \xDA\xF1 |0 # CJK UNIFIED IDEOGRAPH + \xDA\xED |0 # CJK UNIFIED IDEOGRAPH + \xFA\xBB |0 # CJK UNIFIED IDEOGRAPH + \xB3\xA2 |0 # CJK UNIFIED IDEOGRAPH + \xDA\xEE |0 # CJK UNIFIED IDEOGRAPH + \xDA\xEF |0 # CJK UNIFIED IDEOGRAPH + \xC8\xD5 |0 # CJK UNIFIED IDEOGRAPH + \xC9\xE1 |0 # CJK UNIFIED IDEOGRAPH + \xB7\xCA |0 # CJK UNIFIED IDEOGRAPH + \xDA\xF2 |0 # CJK UNIFIED IDEOGRAPH + \xFA\xBF |0 # CJK UNIFIED IDEOGRAPH + \xC0\xB2 |0 # CJK UNIFIED IDEOGRAPH + \xBE\xBD |0 # CJK UNIFIED IDEOGRAPH + \xC3\xD2 |0 # CJK UNIFIED IDEOGRAPH + \xB6\xC7 |0 # CJK UNIFIED IDEOGRAPH + \xDA\xF3 |0 # CJK UNIFIED IDEOGRAPH + \xDA\xF7 |0 # CJK UNIFIED IDEOGRAPH + \xB2\xCB |0 # CJK UNIFIED IDEOGRAPH + \xDA\xF4 |0 # CJK UNIFIED IDEOGRAPH + \xDA\xF6 |0 # CJK UNIFIED IDEOGRAPH + \xDA\xF5 |0 # CJK UNIFIED IDEOGRAPH + \xBD\xEB |0 # CJK UNIFIED IDEOGRAPH + \xC3\xC8 |0 # CJK UNIFIED IDEOGRAPH + \xB0\xC5 |0 # CJK UNIFIED IDEOGRAPH + \xDA\xF8 |0 # CJK UNIFIED IDEOGRAPH + \xFA\xC0 |0 # CJK UNIFIED IDEOGRAPH + \xDA\xF9 |0 # CJK UNIFIED IDEOGRAPH + \xFA\xC1 |0 # CJK UNIFIED IDEOGRAPH + \xC4\xAA |0 # CJK UNIFIED IDEOGRAPH + \xCE\xF1 |0 # CJK UNIFIED IDEOGRAPH + \xBB\xC3 |0 # CJK UNIFIED IDEOGRAPH + \xCA\xEB |0 # CJK UNIFIED IDEOGRAPH + \xFA\xC2 |0 # CJK UNIFIED IDEOGRAPH + \xCB\xBD |0 # CJK UNIFIED IDEOGRAPH + \xDB\xA2 |0 # CJK UNIFIED IDEOGRAPH + \xDA\xFB |0 # CJK UNIFIED IDEOGRAPH + \xDA\xFE |0 # CJK UNIFIED IDEOGRAPH + \xDA\xFD |0 # CJK UNIFIED IDEOGRAPH + \xFA\xC3 |0 # CJK UNIFIED IDEOGRAPH + \xDA\xFA |0 # CJK UNIFIED IDEOGRAPH + \xDB\xA1 |0 # CJK UNIFIED IDEOGRAPH + \xC6\xDE |0 # CJK UNIFIED IDEOGRAPH + \xDA\xFC |0 # CJK UNIFIED IDEOGRAPH + \xDB\xA3 |0 # CJK UNIFIED IDEOGRAPH + \xBD\xEC |0 # CJK UNIFIED IDEOGRAPH + \xDB\xA4 |0 # CJK UNIFIED IDEOGRAPH + \xCD\xCB |0 # CJK UNIFIED IDEOGRAPH + \xC7\xF8 |0 # CJK UNIFIED IDEOGRAPH + \xDB\xA5 |0 # CJK UNIFIED IDEOGRAPH + \xDB\xA7 |0 # CJK UNIFIED IDEOGRAPH + \xDB\xA8 |0 # CJK UNIFIED IDEOGRAPH + \xDB\xA9 |0 # CJK UNIFIED IDEOGRAPH + \xB6\xCA |0 # CJK UNIFIED IDEOGRAPH + \xB1\xC8 |0 # CJK UNIFIED IDEOGRAPH + \xB9\xB9 |0 # CJK UNIFIED IDEOGRAPH + \xDB\xAA |0 # CJK UNIFIED IDEOGRAPH + \xDB\xAB |0 # CJK UNIFIED IDEOGRAPH + \xBD\xF1 |0 # CJK UNIFIED IDEOGRAPH + \xC1\xE2 |0 # CJK UNIFIED IDEOGRAPH + \xFA\xC4 |0 # CJK UNIFIED IDEOGRAPH + \xF9\xAB |0 # CJK UNIFIED IDEOGRAPH + \xD2\xD8 |0 # CJK UNIFIED IDEOGRAPH + \xC1\xBE |0 # CJK UNIFIED IDEOGRAPH + \xC1\xBD |0 # CJK UNIFIED IDEOGRAPH + \xC2\xD8 |0 # CJK UNIFIED IDEOGRAPH + \xBA\xC7 |0 # CJK UNIFIED IDEOGRAPH + \xD0\xF2 |0 # CJK UNIFIED IDEOGRAPH + \xB7\xEE |0 # CJK UNIFIED IDEOGRAPH + \xCD\xAD |0 # CJK UNIFIED IDEOGRAPH + \xCA\xFE |0 # CJK UNIFIED IDEOGRAPH + \xC9\xFE |0 # CJK UNIFIED IDEOGRAPH + \xFA\xC5 |0 # CJK UNIFIED IDEOGRAPH + \xDB\xAC |0 # CJK UNIFIED IDEOGRAPH + \xBA\xF3 |0 # CJK UNIFIED IDEOGRAPH + \xC4\xBF |0 # CJK UNIFIED IDEOGRAPH + \xDB\xAD |0 # CJK UNIFIED IDEOGRAPH + \xCF\xAF |0 # CJK UNIFIED IDEOGRAPH + \xCB\xBE |0 # CJK UNIFIED IDEOGRAPH + \xC4\xAB |0 # CJK UNIFIED IDEOGRAPH + \xDB\xAE |0 # CJK UNIFIED IDEOGRAPH + \xB4\xFC |0 # CJK UNIFIED IDEOGRAPH + \xDB\xAF |0 # CJK UNIFIED IDEOGRAPH + \xDB\xB0 |0 # CJK UNIFIED IDEOGRAPH + \xCC\xDA |0 # CJK UNIFIED IDEOGRAPH + \xCC\xA4 |0 # CJK UNIFIED IDEOGRAPH + \xCB\xF6 |0 # CJK UNIFIED IDEOGRAPH + \xCB\xDC |0 # CJK UNIFIED IDEOGRAPH + \xBB\xA5 |0 # CJK UNIFIED IDEOGRAPH + \xDB\xB2 |0 # CJK UNIFIED IDEOGRAPH + \xBC\xEB |0 # CJK UNIFIED IDEOGRAPH + \xCB\xD1 |0 # CJK UNIFIED IDEOGRAPH + \xDB\xB4 |0 # CJK UNIFIED IDEOGRAPH + \xDB\xB7 |0 # CJK UNIFIED IDEOGRAPH + \xDB\xB6 |0 # CJK UNIFIED IDEOGRAPH + \xB4\xF9 |0 # CJK UNIFIED IDEOGRAPH + \xB5\xE0 |0 # CJK UNIFIED IDEOGRAPH + \xDB\xB3 |0 # CJK UNIFIED IDEOGRAPH + \xDB\xB5 |0 # CJK UNIFIED IDEOGRAPH + \xDB\xB8 |0 # CJK UNIFIED IDEOGRAPH + \xBF\xF9 |0 # CJK UNIFIED IDEOGRAPH + \xCD\xFB |0 # CJK UNIFIED IDEOGRAPH + \xB0\xC9 |0 # CJK UNIFIED IDEOGRAPH + \xBA\xE0 |0 # CJK UNIFIED IDEOGRAPH + \xC2\xBC |0 # CJK UNIFIED IDEOGRAPH + \xBC\xDD |0 # CJK UNIFIED IDEOGRAPH + \xBE\xF3 |0 # CJK UNIFIED IDEOGRAPH + \xDB\xBB |0 # CJK UNIFIED IDEOGRAPH + \xC5\xCE |0 # CJK UNIFIED IDEOGRAPH + \xDB\xB9 |0 # CJK UNIFIED IDEOGRAPH + \xC2\xAB |0 # CJK UNIFIED IDEOGRAPH + \xDB\xBA |0 # CJK UNIFIED IDEOGRAPH + \xBE\xF2 |0 # CJK UNIFIED IDEOGRAPH + \xCC\xDD |0 # CJK UNIFIED IDEOGRAPH + \xDB\xBC |0 # CJK UNIFIED IDEOGRAPH + \xDB\xBD |0 # CJK UNIFIED IDEOGRAPH + \xCD\xE8 |0 # CJK UNIFIED IDEOGRAPH + \xFA\xC7 |0 # CJK UNIFIED IDEOGRAPH + \xDB\xC2 |0 # CJK UNIFIED IDEOGRAPH + \xB9\xBA |0 # CJK UNIFIED IDEOGRAPH + \xC7\xD5 |0 # CJK UNIFIED IDEOGRAPH + \xDB\xBF |0 # CJK UNIFIED IDEOGRAPH + \xC5\xEC |0 # CJK UNIFIED IDEOGRAPH + \xDA\xDE |0 # CJK UNIFIED IDEOGRAPH + \xDA\xE2 |0 # CJK UNIFIED IDEOGRAPH + \xB5\xCF |0 # CJK UNIFIED IDEOGRAPH + \xC7\xC7 |0 # CJK UNIFIED IDEOGRAPH + \xDB\xC1 |0 # CJK UNIFIED IDEOGRAPH + \xBE\xBE |0 # CJK UNIFIED IDEOGRAPH + \xC8\xC4 |0 # CJK UNIFIED IDEOGRAPH + \xDB\xC7 |0 # CJK UNIFIED IDEOGRAPH + \xC8\xFA |0 # CJK UNIFIED IDEOGRAPH + \xDB\xBE |0 # CJK UNIFIED IDEOGRAPH + \xDB\xC4 |0 # CJK UNIFIED IDEOGRAPH + \xDB\xC3 |0 # CJK UNIFIED IDEOGRAPH + \xC0\xCF |0 # CJK UNIFIED IDEOGRAPH + \xCB\xED |0 # CJK UNIFIED IDEOGRAPH + \xCE\xD3 |0 # CJK UNIFIED IDEOGRAPH + \xCB\xE7 |0 # CJK UNIFIED IDEOGRAPH + \xB2\xCC |0 # CJK UNIFIED IDEOGRAPH + \xBB\xDE |0 # CJK UNIFIED IDEOGRAPH + \xCF\xC8 |0 # CJK UNIFIED IDEOGRAPH + \xDB\xC6 |0 # CJK UNIFIED IDEOGRAPH + \xBF\xF5 |0 # CJK UNIFIED IDEOGRAPH + \xDB\xC5 |0 # CJK UNIFIED IDEOGRAPH + \xDB\xC0 |0 # CJK UNIFIED IDEOGRAPH + \xB8\xCF |0 # CJK UNIFIED IDEOGRAPH + \xDB\xCC |0 # CJK UNIFIED IDEOGRAPH + \xDB\xCA |0 # CJK UNIFIED IDEOGRAPH + \xB2\xCD |0 # CJK UNIFIED IDEOGRAPH + \xDB\xC8 |0 # CJK UNIFIED IDEOGRAPH + \xDB\xCE |0 # CJK UNIFIED IDEOGRAPH + \xDB\xD4 |0 # CJK UNIFIED IDEOGRAPH + \xFA\xC8 |0 # CJK UNIFIED IDEOGRAPH + \xFA\xCA |0 # CJK UNIFIED IDEOGRAPH + \xC2\xC8 |0 # CJK UNIFIED IDEOGRAPH + \xCA\xC1 |0 # CJK UNIFIED IDEOGRAPH + \xDB\xD6 |0 # CJK UNIFIED IDEOGRAPH + \xC9\xA2 |0 # CJK UNIFIED IDEOGRAPH + \xDB\xD5 |0 # CJK UNIFIED IDEOGRAPH + \xC7\xF0 |0 # CJK UNIFIED IDEOGRAPH + \xCB\xBF |0 # CJK UNIFIED IDEOGRAPH + \xB4\xBB |0 # CJK UNIFIED IDEOGRAPH + \xC0\xF7 |0 # CJK UNIFIED IDEOGRAPH + \xBD\xC0 |0 # CJK UNIFIED IDEOGRAPH + \xC4\xD3 |0 # CJK UNIFIED IDEOGRAPH + \xCD\xAE |0 # CJK UNIFIED IDEOGRAPH + \xDB\xD1 |0 # CJK UNIFIED IDEOGRAPH + \xDB\xD0 |0 # CJK UNIFIED IDEOGRAPH + \xDB\xD2 |0 # CJK UNIFIED IDEOGRAPH + \xDB\xCF |0 # CJK UNIFIED IDEOGRAPH + \xDB\xD7 |0 # CJK UNIFIED IDEOGRAPH + \xDB\xCD |0 # CJK UNIFIED IDEOGRAPH + \xDB\xCB |0 # CJK UNIFIED IDEOGRAPH + \xDB\xD3 |0 # CJK UNIFIED IDEOGRAPH + \xDB\xC9 |0 # CJK UNIFIED IDEOGRAPH + \xC3\xEC |0 # CJK UNIFIED IDEOGRAPH + \xCC\xF8 |0 # CJK UNIFIED IDEOGRAPH + \xBC\xC6 |0 # CJK UNIFIED IDEOGRAPH + \xBA\xF4 |0 # CJK UNIFIED IDEOGRAPH + \xBA\xBA |0 # CJK UNIFIED IDEOGRAPH + \xCB\xEF |0 # CJK UNIFIED IDEOGRAPH + \xB3\xC1 |0 # CJK UNIFIED IDEOGRAPH + \xFA\xCB |0 # CJK UNIFIED IDEOGRAPH + \xC4\xCE |0 # CJK UNIFIED IDEOGRAPH + \xC6\xCA |0 # CJK UNIFIED IDEOGRAPH + \xB1\xC9 |0 # CJK UNIFIED IDEOGRAPH + \xC0\xF2 |0 # CJK UNIFIED IDEOGRAPH + \xC0\xB4 |0 # CJK UNIFIED IDEOGRAPH + \xB7\xAA |0 # CJK UNIFIED IDEOGRAPH + \xDB\xD9 |0 # CJK UNIFIED IDEOGRAPH + \xB9\xBB |0 # CJK UNIFIED IDEOGRAPH + \xB3\xFC |0 # CJK UNIFIED IDEOGRAPH + \xDB\xDB |0 # CJK UNIFIED IDEOGRAPH + \xB3\xF4 |0 # CJK UNIFIED IDEOGRAPH + \xDB\xE1 |0 # CJK UNIFIED IDEOGRAPH + \xDB\xDE |0 # CJK UNIFIED IDEOGRAPH + \xC0\xF3 |0 # CJK UNIFIED IDEOGRAPH + \xB3\xCB |0 # CJK UNIFIED IDEOGRAPH + \xBA\xAC |0 # CJK UNIFIED IDEOGRAPH + \xB3\xCA |0 # CJK UNIFIED IDEOGRAPH + \xBA\xCF |0 # CJK UNIFIED IDEOGRAPH + \xDB\xDC |0 # CJK UNIFIED IDEOGRAPH + \xB7\xE5 |0 # CJK UNIFIED IDEOGRAPH + \xB7\xCB |0 # CJK UNIFIED IDEOGRAPH + \xC5\xED |0 # CJK UNIFIED IDEOGRAPH + \xFA\xCC |0 # CJK UNIFIED IDEOGRAPH + \xDB\xDA |0 # CJK UNIFIED IDEOGRAPH + \xB0\xC6 |0 # CJK UNIFIED IDEOGRAPH + \xDB\xDD |0 # CJK UNIFIED IDEOGRAPH + \xDB\xDF |0 # CJK UNIFIED IDEOGRAPH + \xB6\xCD |0 # CJK UNIFIED IDEOGRAPH + \xB7\xAC |0 # CJK UNIFIED IDEOGRAPH + \xFA\xC9 |0 # CJK UNIFIED IDEOGRAPH + \xB4\xBC |0 # CJK UNIFIED IDEOGRAPH + \xB5\xCB |0 # CJK UNIFIED IDEOGRAPH + \xDB\xE2 |0 # CJK UNIFIED IDEOGRAPH + \xBA\xF9 |0 # CJK UNIFIED IDEOGRAPH + \xCB\xF1 |0 # CJK UNIFIED IDEOGRAPH + \xBB\xB7 |0 # CJK UNIFIED IDEOGRAPH + \xDB\xE3 |0 # CJK UNIFIED IDEOGRAPH + \xC9\xB0 |0 # CJK UNIFIED IDEOGRAPH + \xDB\xEF |0 # CJK UNIFIED IDEOGRAPH + \xB2\xB3 |0 # CJK UNIFIED IDEOGRAPH + \xDB\xE4 |0 # CJK UNIFIED IDEOGRAPH + \xDB\xF5 |0 # CJK UNIFIED IDEOGRAPH + \xDB\xE5 |0 # CJK UNIFIED IDEOGRAPH + \xCE\xC2 |0 # CJK UNIFIED IDEOGRAPH + \xDB\xEC |0 # CJK UNIFIED IDEOGRAPH + \xC7\xDF |0 # CJK UNIFIED IDEOGRAPH + \xDB\xF4 |0 # CJK UNIFIED IDEOGRAPH + \xDB\xE7 |0 # CJK UNIFIED IDEOGRAPH + \xB0\xB4 |0 # CJK UNIFIED IDEOGRAPH + \xDB\xE9 |0 # CJK UNIFIED IDEOGRAPH + \xB9\xBC |0 # CJK UNIFIED IDEOGRAPH + \xDB\xEB |0 # CJK UNIFIED IDEOGRAPH + \xDB\xEA |0 # CJK UNIFIED IDEOGRAPH + \xDB\xE6 |0 # CJK UNIFIED IDEOGRAPH + \xDB\xF1 |0 # CJK UNIFIED IDEOGRAPH + \xBE\xBF |0 # CJK UNIFIED IDEOGRAPH + \xD4\xED |0 # CJK UNIFIED IDEOGRAPH + \xB8\xE8 |0 # CJK UNIFIED IDEOGRAPH + \xCD\xFC |0 # CJK UNIFIED IDEOGRAPH + \xDB\xE8 |0 # CJK UNIFIED IDEOGRAPH + \xC4\xF4 |0 # CJK UNIFIED IDEOGRAPH + \xB3\xA3 |0 # CJK UNIFIED IDEOGRAPH + \xBA\xAD |0 # CJK UNIFIED IDEOGRAPH + \xDB\xE0 |0 # CJK UNIFIED IDEOGRAPH + \xDB\xF0 |0 # CJK UNIFIED IDEOGRAPH + \xB3\xE1 |0 # CJK UNIFIED IDEOGRAPH + \xDB\xEE |0 # CJK UNIFIED IDEOGRAPH + \xDB\xF2 |0 # CJK UNIFIED IDEOGRAPH + \xC5\xEE |0 # CJK UNIFIED IDEOGRAPH + \xB4\xFE |0 # CJK UNIFIED IDEOGRAPH + \xDC\xB2 |0 # CJK UNIFIED IDEOGRAPH + \xF9\xA9 |0 # CJK UNIFIED IDEOGRAPH + \xCC\xC9 |0 # CJK UNIFIED IDEOGRAPH + \xDB\xF7 |0 # CJK UNIFIED IDEOGRAPH + \xB4\xFD |0 # CJK UNIFIED IDEOGRAPH + \xDB\xFE |0 # CJK UNIFIED IDEOGRAPH + \xFA\xCD |0 # CJK UNIFIED IDEOGRAPH + \xCB\xC0 |0 # CJK UNIFIED IDEOGRAPH + \xDC\xA1 |0 # CJK UNIFIED IDEOGRAPH + \xDC\xA3 |0 # CJK UNIFIED IDEOGRAPH + \xDC\xA7 |0 # CJK UNIFIED IDEOGRAPH + \xDB\xF9 |0 # CJK UNIFIED IDEOGRAPH + \xC3\xAA |0 # CJK UNIFIED IDEOGRAPH + \xC5\xEF |0 # CJK UNIFIED IDEOGRAPH + \xDC\xAB |0 # CJK UNIFIED IDEOGRAPH + \xDB\xFC |0 # CJK UNIFIED IDEOGRAPH + \xDC\xA8 |0 # CJK UNIFIED IDEOGRAPH + \xDC\xA2 |0 # CJK UNIFIED IDEOGRAPH + \xBF\xB9 |0 # CJK UNIFIED IDEOGRAPH + \xDC\xAC |0 # CJK UNIFIED IDEOGRAPH + \xC0\xB3 |0 # CJK UNIFIED IDEOGRAPH + \xDC\xAA |0 # CJK UNIFIED IDEOGRAPH + \xB4\xBD |0 # CJK UNIFIED IDEOGRAPH + \xCF\xD0 |0 # CJK UNIFIED IDEOGRAPH + \xDB\xF6 |0 # CJK UNIFIED IDEOGRAPH + \xDC\xA6 |0 # CJK UNIFIED IDEOGRAPH + \xB0\xD8 |0 # CJK UNIFIED IDEOGRAPH + \xDB\xF8 |0 # CJK UNIFIED IDEOGRAPH + \xCC\xBA |0 # CJK UNIFIED IDEOGRAPH + \xDB\xFD |0 # CJK UNIFIED IDEOGRAPH + \xBF\xA2 |0 # CJK UNIFIED IDEOGRAPH + \xC4\xC7 |0 # CJK UNIFIED IDEOGRAPH + \xDB\xF3 |0 # CJK UNIFIED IDEOGRAPH + \xDC\xA5 |0 # CJK UNIFIED IDEOGRAPH + \xBF\xFA |0 # CJK UNIFIED IDEOGRAPH + \xDC\xAF |0 # CJK UNIFIED IDEOGRAPH + \xB3\xF1 |0 # CJK UNIFIED IDEOGRAPH + \xB8\xA1 |0 # CJK UNIFIED IDEOGRAPH + \xDC\xB1 |0 # CJK UNIFIED IDEOGRAPH + \xDB\xFA |0 # CJK UNIFIED IDEOGRAPH + \xDC\xB0 |0 # CJK UNIFIED IDEOGRAPH + \xDC\xA9 |0 # CJK UNIFIED IDEOGRAPH + \xDB\xFB |0 # CJK UNIFIED IDEOGRAPH + \xDC\xAD |0 # CJK UNIFIED IDEOGRAPH + \xDC\xAE |0 # CJK UNIFIED IDEOGRAPH + \xDC\xBF |0 # CJK UNIFIED IDEOGRAPH + \xC6\xCE |0 # CJK UNIFIED IDEOGRAPH + \xDC\xA4 |0 # CJK UNIFIED IDEOGRAPH + \xDC\xBB |0 # CJK UNIFIED IDEOGRAPH + \xDC\xBD |0 # CJK UNIFIED IDEOGRAPH + \xC4\xD8 |0 # CJK UNIFIED IDEOGRAPH + \xCD\xCC |0 # CJK UNIFIED IDEOGRAPH + \xC9\xF6 |0 # CJK UNIFIED IDEOGRAPH + \xDC\xB8 |0 # CJK UNIFIED IDEOGRAPH + \xC2\xCA |0 # CJK UNIFIED IDEOGRAPH + \xDC\xBE |0 # CJK UNIFIED IDEOGRAPH + \xC1\xBF |0 # CJK UNIFIED IDEOGRAPH + \xDC\xB5 |0 # CJK UNIFIED IDEOGRAPH + \xDC\xC2 |0 # CJK UNIFIED IDEOGRAPH + \xDC\xC1 |0 # CJK UNIFIED IDEOGRAPH + \xC6\xEF |0 # CJK UNIFIED IDEOGRAPH + \xDC\xC0 |0 # CJK UNIFIED IDEOGRAPH + \xC6\xEA |0 # CJK UNIFIED IDEOGRAPH + \xFA\xCF |0 # CJK UNIFIED IDEOGRAPH + \xDC\xC4 |0 # CJK UNIFIED IDEOGRAPH + \xDC\xB7 |0 # CJK UNIFIED IDEOGRAPH + \xB6\xC8 |0 # CJK UNIFIED IDEOGRAPH + \xDC\xBA |0 # CJK UNIFIED IDEOGRAPH + \xBD\xDD |0 # CJK UNIFIED IDEOGRAPH + \xC7\xE0 |0 # CJK UNIFIED IDEOGRAPH + \xDC\xBC |0 # CJK UNIFIED IDEOGRAPH + \xB6\xCB |0 # CJK UNIFIED IDEOGRAPH + \xDC\xB4 |0 # CJK UNIFIED IDEOGRAPH + \xDC\xB6 |0 # CJK UNIFIED IDEOGRAPH + \xDC\xB3 |0 # CJK UNIFIED IDEOGRAPH + \xCF\xB0 |0 # CJK UNIFIED IDEOGRAPH + \xB3\xDA |0 # CJK UNIFIED IDEOGRAPH + \xDC\xB9 |0 # CJK UNIFIED IDEOGRAPH + \xDC\xC3 |0 # CJK UNIFIED IDEOGRAPH + \xB3\xB5 |0 # CJK UNIFIED IDEOGRAPH + \xBA\xE7 |0 # CJK UNIFIED IDEOGRAPH + \xB1\xDD |0 # CJK UNIFIED IDEOGRAPH + \xDC\xD4 |0 # CJK UNIFIED IDEOGRAPH + \xCF\xB1 |0 # CJK UNIFIED IDEOGRAPH + \xDC\xD7 |0 # CJK UNIFIED IDEOGRAPH + \xFA\xD1 |0 # CJK UNIFIED IDEOGRAPH + \xBF\xBA |0 # CJK UNIFIED IDEOGRAPH + \xDC\xD6 |0 # CJK UNIFIED IDEOGRAPH + \xDC\xD5 |0 # CJK UNIFIED IDEOGRAPH + \xDC\xD2 |0 # CJK UNIFIED IDEOGRAPH + \xDC\xC6 |0 # CJK UNIFIED IDEOGRAPH + \xDC\xE3 |0 # CJK UNIFIED IDEOGRAPH + \xDC\xC5 |0 # CJK UNIFIED IDEOGRAPH + \xDC\xD8 |0 # CJK UNIFIED IDEOGRAPH + \xDC\xD0 |0 # CJK UNIFIED IDEOGRAPH + \xDC\xCB |0 # CJK UNIFIED IDEOGRAPH + \xDC\xC8 |0 # CJK UNIFIED IDEOGRAPH + \xDC\xC9 |0 # CJK UNIFIED IDEOGRAPH + \xDC\xD1 |0 # CJK UNIFIED IDEOGRAPH + \xF4\xA2 |0 # CJK UNIFIED IDEOGRAPH + \xDC\xCE |0 # CJK UNIFIED IDEOGRAPH + \xB9\xBD |0 # CJK UNIFIED IDEOGRAPH + \xC4\xC8 |0 # CJK UNIFIED IDEOGRAPH + \xC1\xE4 |0 # CJK UNIFIED IDEOGRAPH + \xDC\xCC |0 # CJK UNIFIED IDEOGRAPH + \xDC\xC7 |0 # CJK UNIFIED IDEOGRAPH + \xDC\xCA |0 # CJK UNIFIED IDEOGRAPH + \xCD\xCD |0 # CJK UNIFIED IDEOGRAPH + \xCB\xEA |0 # CJK UNIFIED IDEOGRAPH + \xDC\xCF |0 # CJK UNIFIED IDEOGRAPH + \xDC\xD9 |0 # CJK UNIFIED IDEOGRAPH + \xFA\xD2 |0 # CJK UNIFIED IDEOGRAPH + \xDC\xE1 |0 # CJK UNIFIED IDEOGRAPH + \xDC\xDA |0 # CJK UNIFIED IDEOGRAPH + \xDC\xE7 |0 # CJK UNIFIED IDEOGRAPH + \xDC\xE5 |0 # CJK UNIFIED IDEOGRAPH + \xDC\xE0 |0 # CJK UNIFIED IDEOGRAPH + \xDC\xDF |0 # CJK UNIFIED IDEOGRAPH + \xC4\xD0 |0 # CJK UNIFIED IDEOGRAPH + \xC1\xE5 |0 # CJK UNIFIED IDEOGRAPH + \xDC\xDD |0 # CJK UNIFIED IDEOGRAPH + \xDC\xDB |0 # CJK UNIFIED IDEOGRAPH + \xDC\xE2 |0 # CJK UNIFIED IDEOGRAPH + \xDC\xE8 |0 # CJK UNIFIED IDEOGRAPH + \xC8\xF5 |0 # CJK UNIFIED IDEOGRAPH + \xDC\xEE |0 # CJK UNIFIED IDEOGRAPH + \xDC\xE9 |0 # CJK UNIFIED IDEOGRAPH + \xDC\xEC |0 # CJK UNIFIED IDEOGRAPH + \xDC\xE6 |0 # CJK UNIFIED IDEOGRAPH + \xC3\xF4 |0 # CJK UNIFIED IDEOGRAPH + \xC9\xB8 |0 # CJK UNIFIED IDEOGRAPH + \xDC\xDC |0 # CJK UNIFIED IDEOGRAPH + \xDC\xE4 |0 # CJK UNIFIED IDEOGRAPH + \xBE\xC0 |0 # CJK UNIFIED IDEOGRAPH + \xCC\xCF |0 # CJK UNIFIED IDEOGRAPH + \xDC\xF8 |0 # CJK UNIFIED IDEOGRAPH + \xDC\xEB |0 # CJK UNIFIED IDEOGRAPH + \xB8\xA2 |0 # CJK UNIFIED IDEOGRAPH + \xB2\xA3 |0 # CJK UNIFIED IDEOGRAPH + \xB3\xDF |0 # CJK UNIFIED IDEOGRAPH + \xDC\xD3 |0 # CJK UNIFIED IDEOGRAPH + \xFA\xD3 |0 # CJK UNIFIED IDEOGRAPH + \xBE\xC1 |0 # CJK UNIFIED IDEOGRAPH + \xDC\xF0 |0 # CJK UNIFIED IDEOGRAPH + \xDC\xF7 |0 # CJK UNIFIED IDEOGRAPH + \xBC\xF9 |0 # CJK UNIFIED IDEOGRAPH + \xB3\xF2 |0 # CJK UNIFIED IDEOGRAPH + \xC3\xAE |0 # CJK UNIFIED IDEOGRAPH + \xDC\xED |0 # CJK UNIFIED IDEOGRAPH + \xFA\xD5 |0 # CJK UNIFIED IDEOGRAPH + \xDC\xF2 |0 # CJK UNIFIED IDEOGRAPH + \xDC\xF6 |0 # CJK UNIFIED IDEOGRAPH + \xB6\xB6 |0 # CJK UNIFIED IDEOGRAPH + \xB5\xCC |0 # CJK UNIFIED IDEOGRAPH + \xDC\xF4 |0 # CJK UNIFIED IDEOGRAPH + \xB5\xA1 |0 # CJK UNIFIED IDEOGRAPH + \xC6\xCB |0 # CJK UNIFIED IDEOGRAPH + \xDC\xF3 |0 # CJK UNIFIED IDEOGRAPH + \xDC\xF5 |0 # CJK UNIFIED IDEOGRAPH + \xFA\xD4 |0 # CJK UNIFIED IDEOGRAPH + \xDC\xEF |0 # CJK UNIFIED IDEOGRAPH + \xFA\xD6 |0 # CJK UNIFIED IDEOGRAPH + \xDC\xF1 |0 # CJK UNIFIED IDEOGRAPH + \xFA\xD7 |0 # CJK UNIFIED IDEOGRAPH + \xB3\xE0 |0 # CJK UNIFIED IDEOGRAPH + \xC3\xC9 |0 # CJK UNIFIED IDEOGRAPH + \xDC\xFC |0 # CJK UNIFIED IDEOGRAPH + \xDC\xFA |0 # CJK UNIFIED IDEOGRAPH + \xB8\xE9 |0 # CJK UNIFIED IDEOGRAPH + \xDC\xF9 |0 # CJK UNIFIED IDEOGRAPH + \xDD\xA1 |0 # CJK UNIFIED IDEOGRAPH + \xDB\xD8 |0 # CJK UNIFIED IDEOGRAPH + \xDC\xFB |0 # CJK UNIFIED IDEOGRAPH + \xDC\xFD |0 # CJK UNIFIED IDEOGRAPH + \xDC\xFE |0 # CJK UNIFIED IDEOGRAPH + \xDD\xAC |0 # CJK UNIFIED IDEOGRAPH + \xDD\xA8 |0 # CJK UNIFIED IDEOGRAPH + \xDB\xED |0 # CJK UNIFIED IDEOGRAPH + \xDD\xA7 |0 # CJK UNIFIED IDEOGRAPH + \xDD\xA6 |0 # CJK UNIFIED IDEOGRAPH + \xDD\xA3 |0 # CJK UNIFIED IDEOGRAPH + \xDC\xEA |0 # CJK UNIFIED IDEOGRAPH + \xDD\xA5 |0 # CJK UNIFIED IDEOGRAPH + \xDD\xA4 |0 # CJK UNIFIED IDEOGRAPH + \xDD\xAA |0 # CJK UNIFIED IDEOGRAPH + \xCF\xA6 |0 # CJK UNIFIED IDEOGRAPH + \xDD\xAD |0 # CJK UNIFIED IDEOGRAPH + \xB6\xFB |0 # CJK UNIFIED IDEOGRAPH + \xDD\xA9 |0 # CJK UNIFIED IDEOGRAPH + \xDD\xAB |0 # CJK UNIFIED IDEOGRAPH + \xFA\xD8 |0 # CJK UNIFIED IDEOGRAPH + \xFA\xD9 |0 # CJK UNIFIED IDEOGRAPH + \xC8\xA7 |0 # CJK UNIFIED IDEOGRAPH + \xDD\xAE |0 # CJK UNIFIED IDEOGRAPH + \xDD\xB2 |0 # CJK UNIFIED IDEOGRAPH + \xDD\xAF |0 # CJK UNIFIED IDEOGRAPH + \xCD\xF3 |0 # CJK UNIFIED IDEOGRAPH + \xDD\xB0 |0 # CJK UNIFIED IDEOGRAPH + \xDC\xDE |0 # CJK UNIFIED IDEOGRAPH + \xDD\xB3 |0 # CJK UNIFIED IDEOGRAPH + \xDD\xB4 |0 # CJK UNIFIED IDEOGRAPH + \xB1\xB5 |0 # CJK UNIFIED IDEOGRAPH + \xDD\xB6 |0 # CJK UNIFIED IDEOGRAPH + \xB7\xE7 |0 # CJK UNIFIED IDEOGRAPH + \xBC\xA1 |0 # CJK UNIFIED IDEOGRAPH + \xB6\xD5 |0 # CJK UNIFIED IDEOGRAPH + \xB2\xA4 |0 # CJK UNIFIED IDEOGRAPH + \xCD\xDF |0 # CJK UNIFIED IDEOGRAPH + \xDD\xB8 |0 # CJK UNIFIED IDEOGRAPH + \xDD\xB7 |0 # CJK UNIFIED IDEOGRAPH + \xDD\xBA |0 # CJK UNIFIED IDEOGRAPH + \xB5\xBD |0 # CJK UNIFIED IDEOGRAPH + \xB6\xD6 |0 # CJK UNIFIED IDEOGRAPH + \xB4\xBE |0 # CJK UNIFIED IDEOGRAPH + \xDD\xBD |0 # CJK UNIFIED IDEOGRAPH + \xDD\xBC |0 # CJK UNIFIED IDEOGRAPH + \xDD\xBE |0 # CJK UNIFIED IDEOGRAPH + \xB2\xCE |0 # CJK UNIFIED IDEOGRAPH + \xC3\xB7 |0 # CJK UNIFIED IDEOGRAPH + \xDD\xBF |0 # CJK UNIFIED IDEOGRAPH + \xB4\xBF |0 # CJK UNIFIED IDEOGRAPH + \xDD\xC1 |0 # CJK UNIFIED IDEOGRAPH + \xDD\xC0 |0 # CJK UNIFIED IDEOGRAPH + \xDD\xC2 |0 # CJK UNIFIED IDEOGRAPH + \xDD\xC3 |0 # CJK UNIFIED IDEOGRAPH + \xDD\xC4 |0 # CJK UNIFIED IDEOGRAPH + \xBB\xDF |0 # CJK UNIFIED IDEOGRAPH + \xC0\xB5 |0 # CJK UNIFIED IDEOGRAPH + \xBA\xA1 |0 # CJK UNIFIED IDEOGRAPH + \xC9\xF0 |0 # CJK UNIFIED IDEOGRAPH + \xCA\xE2 |0 # CJK UNIFIED IDEOGRAPH + \xCF\xC4 |0 # CJK UNIFIED IDEOGRAPH + \xBB\xF5 |0 # CJK UNIFIED IDEOGRAPH + \xBA\xD0 |0 # CJK UNIFIED IDEOGRAPH + \xCE\xF2 |0 # CJK UNIFIED IDEOGRAPH + \xDD\xC5 |0 # CJK UNIFIED IDEOGRAPH + \xDD\xC6 |0 # CJK UNIFIED IDEOGRAPH + \xBB\xE0 |0 # CJK UNIFIED IDEOGRAPH + \xDD\xC7 |0 # CJK UNIFIED IDEOGRAPH + \xDD\xC8 |0 # CJK UNIFIED IDEOGRAPH + \xDD\xCA |0 # CJK UNIFIED IDEOGRAPH + \xDD\xC9 |0 # CJK UNIFIED IDEOGRAPH + \xCB\xD8 |0 # CJK UNIFIED IDEOGRAPH + \xBD\xDE |0 # CJK UNIFIED IDEOGRAPH + \xBC\xEC |0 # CJK UNIFIED IDEOGRAPH + \xBB\xC4 |0 # CJK UNIFIED IDEOGRAPH + \xDD\xCB |0 # CJK UNIFIED IDEOGRAPH + \xDD\xCD |0 # CJK UNIFIED IDEOGRAPH + \xBF\xA3 |0 # CJK UNIFIED IDEOGRAPH + \xDD\xCC |0 # CJK UNIFIED IDEOGRAPH + \xDD\xCE |0 # CJK UNIFIED IDEOGRAPH + \xDD\xCF |0 # CJK UNIFIED IDEOGRAPH + \xDD\xD0 |0 # CJK UNIFIED IDEOGRAPH + \xDD\xD1 |0 # CJK UNIFIED IDEOGRAPH + \xDD\xD2 |0 # CJK UNIFIED IDEOGRAPH + \xDD\xD4 |0 # CJK UNIFIED IDEOGRAPH + \xDD\xD3 |0 # CJK UNIFIED IDEOGRAPH + \xDD\xD5 |0 # CJK UNIFIED IDEOGRAPH + \xB2\xA5 |0 # CJK UNIFIED IDEOGRAPH + \xC3\xCA |0 # CJK UNIFIED IDEOGRAPH + \xDD\xD6 |0 # CJK UNIFIED IDEOGRAPH + \xBB\xA6 |0 # CJK UNIFIED IDEOGRAPH + \xB3\xCC |0 # CJK UNIFIED IDEOGRAPH + \xDD\xD7 |0 # CJK UNIFIED IDEOGRAPH + \xC5\xC2 |0 # CJK UNIFIED IDEOGRAPH + \xD4\xCC |0 # CJK UNIFIED IDEOGRAPH + \xB5\xA3 |0 # CJK UNIFIED IDEOGRAPH + \xDD\xD8 |0 # CJK UNIFIED IDEOGRAPH + \xDD\xD9 |0 # CJK UNIFIED IDEOGRAPH + \xCA\xEC |0 # CJK UNIFIED IDEOGRAPH + \xCB\xE8 |0 # CJK UNIFIED IDEOGRAPH + \xC6\xC7 |0 # CJK UNIFIED IDEOGRAPH + \xDD\xDA |0 # CJK UNIFIED IDEOGRAPH + \xC8\xE6 |0 # CJK UNIFIED IDEOGRAPH + \xFA\xDA |0 # CJK UNIFIED IDEOGRAPH + \xC8\xFB |0 # CJK UNIFIED IDEOGRAPH + \xCC\xD3 |0 # CJK UNIFIED IDEOGRAPH + \xDD\xDB |0 # CJK UNIFIED IDEOGRAPH + \xDD\xDD |0 # CJK UNIFIED IDEOGRAPH + \xDD\xDC |0 # CJK UNIFIED IDEOGRAPH + \xDD\xDF |0 # CJK UNIFIED IDEOGRAPH + \xDD\xDE |0 # CJK UNIFIED IDEOGRAPH + \xDD\xE1 |0 # CJK UNIFIED IDEOGRAPH + \xBB\xE1 |0 # CJK UNIFIED IDEOGRAPH + \xCC\xB1 |0 # CJK UNIFIED IDEOGRAPH + \xDD\xE2 |0 # CJK UNIFIED IDEOGRAPH + \xDD\xE3 |0 # CJK UNIFIED IDEOGRAPH + \xB5\xA4 |0 # CJK UNIFIED IDEOGRAPH + \xDD\xE4 |0 # CJK UNIFIED IDEOGRAPH + \xDD\xE6 |0 # CJK UNIFIED IDEOGRAPH + \xDD\xE5 |0 # CJK UNIFIED IDEOGRAPH + \xBF\xE5 |0 # CJK UNIFIED IDEOGRAPH + \xC9\xB9 |0 # CJK UNIFIED IDEOGRAPH + \xB1\xCA |0 # CJK UNIFIED IDEOGRAPH + \xC8\xC5 |0 # CJK UNIFIED IDEOGRAPH + \xFA\xDB |0 # CJK UNIFIED IDEOGRAPH + \xC4\xF5 |0 # CJK UNIFIED IDEOGRAPH + \xBD\xC1 |0 # CJK UNIFIED IDEOGRAPH + \xB5\xE1 |0 # CJK UNIFIED IDEOGRAPH + \xC8\xC6 |0 # CJK UNIFIED IDEOGRAPH + \xBC\xAE |0 # CJK UNIFIED IDEOGRAPH + \xDD\xE8 |0 # CJK UNIFIED IDEOGRAPH + \xB4\xC0 |0 # CJK UNIFIED IDEOGRAPH + \xB1\xF8 |0 # CJK UNIFIED IDEOGRAPH + \xFA\xDC |0 # CJK UNIFIED IDEOGRAPH + \xC6\xF2 |0 # CJK UNIFIED IDEOGRAPH + \xDD\xE7 |0 # CJK UNIFIED IDEOGRAPH + \xB9\xBE |0 # CJK UNIFIED IDEOGRAPH + \xC3\xD3 |0 # CJK UNIFIED IDEOGRAPH + \xDD\xE9 |0 # CJK UNIFIED IDEOGRAPH + \xDD\xF1 |0 # CJK UNIFIED IDEOGRAPH + \xDD\xEA |0 # CJK UNIFIED IDEOGRAPH + \xFA\xDE |0 # CJK UNIFIED IDEOGRAPH + \xC2\xC1 |0 # CJK UNIFIED IDEOGRAPH + \xB5\xE2 |0 # CJK UNIFIED IDEOGRAPH + \xDD\xF2 |0 # CJK UNIFIED IDEOGRAPH + \xB7\xE8 |0 # CJK UNIFIED IDEOGRAPH + \xB5\xA5 |0 # CJK UNIFIED IDEOGRAPH + \xDD\xF0 |0 # CJK UNIFIED IDEOGRAPH + \xDD\xEE |0 # CJK UNIFIED IDEOGRAPH + \xDD\xEB |0 # CJK UNIFIED IDEOGRAPH + \xCD\xE0 |0 # CJK UNIFIED IDEOGRAPH + \xFA\xDD |0 # CJK UNIFIED IDEOGRAPH + \xC4\xC0 |0 # CJK UNIFIED IDEOGRAPH + \xC6\xD9 |0 # CJK UNIFIED IDEOGRAPH + \xDD\xEC |0 # CJK UNIFIED IDEOGRAPH + \xDD\xF4 |0 # CJK UNIFIED IDEOGRAPH + \xDD\xF3 |0 # CJK UNIFIED IDEOGRAPH + \xB7\xA3 |0 # CJK UNIFIED IDEOGRAPH + \xB2\xAD |0 # CJK UNIFIED IDEOGRAPH + \xBA\xBB |0 # CJK UNIFIED IDEOGRAPH + \xDD\xED |0 # CJK UNIFIED IDEOGRAPH + \xDD\xEF |0 # CJK UNIFIED IDEOGRAPH + \xCB\xD7 |0 # CJK UNIFIED IDEOGRAPH + \xC2\xF4 |0 # CJK UNIFIED IDEOGRAPH + \xCB\xF7 |0 # CJK UNIFIED IDEOGRAPH + \xDD\xFC |0 # CJK UNIFIED IDEOGRAPH + \xDD\xFD |0 # CJK UNIFIED IDEOGRAPH + \xB2\xCF |0 # CJK UNIFIED IDEOGRAPH + \xCA\xA8 |0 # CJK UNIFIED IDEOGRAPH + \xCC\xFD |0 # CJK UNIFIED IDEOGRAPH + \xDE\xA1 |0 # CJK UNIFIED IDEOGRAPH + \xBC\xA3 |0 # CJK UNIFIED IDEOGRAPH + \xBE\xC2 |0 # CJK UNIFIED IDEOGRAPH + \xDD\xF8 |0 # CJK UNIFIED IDEOGRAPH + \xDD\xFE |0 # CJK UNIFIED IDEOGRAPH + \xB1\xE8 |0 # CJK UNIFIED IDEOGRAPH + \xB6\xB7 |0 # CJK UNIFIED IDEOGRAPH + \xDD\xF5 |0 # CJK UNIFIED IDEOGRAPH + \xDD\xFA |0 # CJK UNIFIED IDEOGRAPH + \xC0\xF4 |0 # CJK UNIFIED IDEOGRAPH + \xC7\xF1 |0 # CJK UNIFIED IDEOGRAPH + \xC8\xE7 |0 # CJK UNIFIED IDEOGRAPH + \xDD\xF7 |0 # CJK UNIFIED IDEOGRAPH + \xCB\xA1 |0 # CJK UNIFIED IDEOGRAPH + \xDD\xF9 |0 # CJK UNIFIED IDEOGRAPH + \xDE\xA4 |0 # CJK UNIFIED IDEOGRAPH + \xFA\xDF |0 # CJK UNIFIED IDEOGRAPH + \xDE\xA2 |0 # CJK UNIFIED IDEOGRAPH + \xDD\xFB |0 # CJK UNIFIED IDEOGRAPH + \xCB\xA2 |0 # CJK UNIFIED IDEOGRAPH + \xC7\xC8 |0 # CJK UNIFIED IDEOGRAPH + \xB5\xE3 |0 # CJK UNIFIED IDEOGRAPH + \xC5\xA5 |0 # CJK UNIFIED IDEOGRAPH + \xC3\xED |0 # CJK UNIFIED IDEOGRAPH + \xDE\xA5 |0 # CJK UNIFIED IDEOGRAPH + \xDE\xA3 |0 # CJK UNIFIED IDEOGRAPH + \xC2\xD9 |0 # CJK UNIFIED IDEOGRAPH + \xDD\xF6 |0 # CJK UNIFIED IDEOGRAPH + \xB1\xCB |0 # CJK UNIFIED IDEOGRAPH + \xFA\xE0 |0 # CJK UNIFIED IDEOGRAPH + \xCD\xCE |0 # CJK UNIFIED IDEOGRAPH + \xDE\xB0 |0 # CJK UNIFIED IDEOGRAPH + \xDE\xAF |0 # CJK UNIFIED IDEOGRAPH + \xC0\xF6 |0 # CJK UNIFIED IDEOGRAPH + \xDE\xAC |0 # CJK UNIFIED IDEOGRAPH + \xCD\xEC |0 # CJK UNIFIED IDEOGRAPH + \xC6\xB6 |0 # CJK UNIFIED IDEOGRAPH + \xDE\xA6 |0 # CJK UNIFIED IDEOGRAPH + \xC4\xC5 |0 # CJK UNIFIED IDEOGRAPH + \xB1\xCC |0 # CJK UNIFIED IDEOGRAPH + \xB9\xBF |0 # CJK UNIFIED IDEOGRAPH + \xDE\xA9 |0 # CJK UNIFIED IDEOGRAPH + \xBD\xA7 |0 # CJK UNIFIED IDEOGRAPH + \xDE\xAE |0 # CJK UNIFIED IDEOGRAPH + \xDE\xAD |0 # CJK UNIFIED IDEOGRAPH + \xDE\xA8 |0 # CJK UNIFIED IDEOGRAPH + \xDE\xAB |0 # CJK UNIFIED IDEOGRAPH + \xB3\xE8 |0 # CJK UNIFIED IDEOGRAPH + \xDE\xAA |0 # CJK UNIFIED IDEOGRAPH + \xC7\xC9 |0 # CJK UNIFIED IDEOGRAPH + \xCE\xAE |0 # CJK UNIFIED IDEOGRAPH + \xBE\xF4 |0 # CJK UNIFIED IDEOGRAPH + \xC0\xF5 |0 # CJK UNIFIED IDEOGRAPH + \xDE\xB6 |0 # CJK UNIFIED IDEOGRAPH + \xDE\xB4 |0 # CJK UNIFIED IDEOGRAPH + \xC9\xCD |0 # CJK UNIFIED IDEOGRAPH + \xDE\xB1 |0 # CJK UNIFIED IDEOGRAPH + \xDE\xB3 |0 # CJK UNIFIED IDEOGRAPH + \xB1\xBA |0 # CJK UNIFIED IDEOGRAPH + \xB9\xC0 |0 # CJK UNIFIED IDEOGRAPH + \xCF\xB2 |0 # CJK UNIFIED IDEOGRAPH + \xB3\xBD |0 # CJK UNIFIED IDEOGRAPH + \xC9\xE2 |0 # CJK UNIFIED IDEOGRAPH + \xFA\xE2 |0 # CJK UNIFIED IDEOGRAPH + \xCD\xE1 |0 # CJK UNIFIED IDEOGRAPH + \xB3\xA4 |0 # CJK UNIFIED IDEOGRAPH + \xBF\xBB |0 # CJK UNIFIED IDEOGRAPH + \xDE\xB5 |0 # CJK UNIFIED IDEOGRAPH + \xDE\xBA |0 # CJK UNIFIED IDEOGRAPH + \xFA\xE1 |0 # CJK UNIFIED IDEOGRAPH + \xBE\xC3 |0 # CJK UNIFIED IDEOGRAPH + \xCD\xB0 |0 # CJK UNIFIED IDEOGRAPH + \xDE\xB7 |0 # CJK UNIFIED IDEOGRAPH + \xDE\xB2 |0 # CJK UNIFIED IDEOGRAPH + \xDE\xB8 |0 # CJK UNIFIED IDEOGRAPH + \xFA\xE3 |0 # CJK UNIFIED IDEOGRAPH + \xCE\xDE |0 # CJK UNIFIED IDEOGRAPH + \xC5\xF3 |0 # CJK UNIFIED IDEOGRAPH + \xC6\xC2 |0 # CJK UNIFIED IDEOGRAPH + \xFA\xE4 |0 # CJK UNIFIED IDEOGRAPH + \xB3\xB6 |0 # CJK UNIFIED IDEOGRAPH + \xB1\xD5 |0 # CJK UNIFIED IDEOGRAPH + \xDE\xBE |0 # CJK UNIFIED IDEOGRAPH + \xDE\xC1 |0 # CJK UNIFIED IDEOGRAPH + \xCE\xC3 |0 # CJK UNIFIED IDEOGRAPH + \xCD\xE4 |0 # CJK UNIFIED IDEOGRAPH + \xDE\xC8 |0 # CJK UNIFIED IDEOGRAPH + \xDE\xC2 |0 # CJK UNIFIED IDEOGRAPH + \xDE\xBF |0 # CJK UNIFIED IDEOGRAPH + \xCE\xD4 |0 # CJK UNIFIED IDEOGRAPH + \xDE\xC5 |0 # CJK UNIFIED IDEOGRAPH + \xFA\xE5 |0 # CJK UNIFIED IDEOGRAPH + \xBD\xCA |0 # CJK UNIFIED IDEOGRAPH + \xDE\xC7 |0 # CJK UNIFIED IDEOGRAPH + \xDE\xCC |0 # CJK UNIFIED IDEOGRAPH + \xC5\xF1 |0 # CJK UNIFIED IDEOGRAPH + \xDE\xCA |0 # CJK UNIFIED IDEOGRAPH + \xDE\xC4 |0 # CJK UNIFIED IDEOGRAPH + \xC3\xB8 |0 # CJK UNIFIED IDEOGRAPH + \xDE\xCB |0 # CJK UNIFIED IDEOGRAPH + \xDE\xC0 |0 # CJK UNIFIED IDEOGRAPH + \xDE\xC6 |0 # CJK UNIFIED IDEOGRAPH + \xDE\xCD |0 # CJK UNIFIED IDEOGRAPH + \xB0\xFC |0 # CJK UNIFIED IDEOGRAPH + \xDE\xC3 |0 # CJK UNIFIED IDEOGRAPH + \xDE\xCE |0 # CJK UNIFIED IDEOGRAPH + \xBF\xBC |0 # CJK UNIFIED IDEOGRAPH + \xFA\xE7 |0 # CJK UNIFIED IDEOGRAPH + \xBD\xDF |0 # CJK UNIFIED IDEOGRAPH + \xCA\xA5 |0 # CJK UNIFIED IDEOGRAPH + \xBA\xAE |0 # CJK UNIFIED IDEOGRAPH + \xFA\xE6 |0 # CJK UNIFIED IDEOGRAPH + \xDE\xBB |0 # CJK UNIFIED IDEOGRAPH + \xDE\xC9 |0 # CJK UNIFIED IDEOGRAPH + \xC5\xBA |0 # CJK UNIFIED IDEOGRAPH + \xFA\xE8 |0 # CJK UNIFIED IDEOGRAPH + \xC0\xB6 |0 # CJK UNIFIED IDEOGRAPH + \xB3\xE9 |0 # CJK UNIFIED IDEOGRAPH + \xBA\xD1 |0 # CJK UNIFIED IDEOGRAPH + \xBE\xC4 |0 # CJK UNIFIED IDEOGRAPH + \xDE\xBD |0 # CJK UNIFIED IDEOGRAPH + \xBD\xC2 |0 # CJK UNIFIED IDEOGRAPH + \xB7\xCC |0 # CJK UNIFIED IDEOGRAPH + \xDE\xBC |0 # CJK UNIFIED IDEOGRAPH + \xDE\xD2 |0 # CJK UNIFIED IDEOGRAPH + \xBD\xED |0 # CJK UNIFIED IDEOGRAPH + \xB8\xBA |0 # CJK UNIFIED IDEOGRAPH + \xDE\xE1 |0 # CJK UNIFIED IDEOGRAPH + \xDE\xDB |0 # CJK UNIFIED IDEOGRAPH + \xB5\xF4 |0 # CJK UNIFIED IDEOGRAPH + \xC5\xCF |0 # CJK UNIFIED IDEOGRAPH + \xDE\xD6 |0 # CJK UNIFIED IDEOGRAPH + \xDE\xDF |0 # CJK UNIFIED IDEOGRAPH + \xB0\xAF |0 # CJK UNIFIED IDEOGRAPH + \xB1\xB2 |0 # CJK UNIFIED IDEOGRAPH + \xFA\xEB |0 # CJK UNIFIED IDEOGRAPH + \xB2\xB9 |0 # CJK UNIFIED IDEOGRAPH + \xDE\xD8 |0 # CJK UNIFIED IDEOGRAPH + \xC2\xAC |0 # CJK UNIFIED IDEOGRAPH + \xDE\xCF |0 # CJK UNIFIED IDEOGRAPH + \xDE\xD1 |0 # CJK UNIFIED IDEOGRAPH + \xB9\xC1 |0 # CJK UNIFIED IDEOGRAPH + \xDE\xE2 |0 # CJK UNIFIED IDEOGRAPH + \xFA\xE9 |0 # CJK UNIFIED IDEOGRAPH + \xDE\xDD |0 # CJK UNIFIED IDEOGRAPH + \xFA\xEC |0 # CJK UNIFIED IDEOGRAPH + \xDE\xD5 |0 # CJK UNIFIED IDEOGRAPH + \xDE\xDC |0 # CJK UNIFIED IDEOGRAPH + \xCC\xAB |0 # CJK UNIFIED IDEOGRAPH + \xDE\xDA |0 # CJK UNIFIED IDEOGRAPH + \xDE\xDE |0 # CJK UNIFIED IDEOGRAPH + \xB8\xD0 |0 # CJK UNIFIED IDEOGRAPH + \xBE\xC5 |0 # CJK UNIFIED IDEOGRAPH + \xC3\xB9 |0 # CJK UNIFIED IDEOGRAPH + \xFA\xEA |0 # CJK UNIFIED IDEOGRAPH + \xDE\xD4 |0 # CJK UNIFIED IDEOGRAPH + \xCD\xAF |0 # CJK UNIFIED IDEOGRAPH + \xDE\xD7 |0 # CJK UNIFIED IDEOGRAPH + \xDE\xD0 |0 # CJK UNIFIED IDEOGRAPH + \xC5\xF2 |0 # CJK UNIFIED IDEOGRAPH + \xDE\xD3 |0 # CJK UNIFIED IDEOGRAPH + \xDE\xD9 |0 # CJK UNIFIED IDEOGRAPH + \xCF\xD1 |0 # CJK UNIFIED IDEOGRAPH + \xBC\xBE |0 # CJK UNIFIED IDEOGRAPH + \xCB\xFE |0 # CJK UNIFIED IDEOGRAPH + \xDE\xE3 |0 # CJK UNIFIED IDEOGRAPH + \xC8\xAE |0 # CJK UNIFIED IDEOGRAPH + \xDE\xEF |0 # CJK UNIFIED IDEOGRAPH + \xB8\xBB |0 # CJK UNIFIED IDEOGRAPH + \xBD\xE0 |0 # CJK UNIFIED IDEOGRAPH + \xDE\xE5 |0 # CJK UNIFIED IDEOGRAPH + \xCE\xAF |0 # CJK UNIFIED IDEOGRAPH + \xB9\xC2 |0 # CJK UNIFIED IDEOGRAPH + \xDE\xF2 |0 # CJK UNIFIED IDEOGRAPH + \xB0\xEE |0 # CJK UNIFIED IDEOGRAPH + \xDE\xF0 |0 # CJK UNIFIED IDEOGRAPH + \xDE\xE4 |0 # CJK UNIFIED IDEOGRAPH + \xDE\xEA |0 # CJK UNIFIED IDEOGRAPH + \xDE\xEC |0 # CJK UNIFIED IDEOGRAPH + \xCD\xCF |0 # CJK UNIFIED IDEOGRAPH + \xDE\xE7 |0 # CJK UNIFIED IDEOGRAPH + \xC5\xAE |0 # CJK UNIFIED IDEOGRAPH + \xDE\xE9 |0 # CJK UNIFIED IDEOGRAPH + \xFA\xED |0 # CJK UNIFIED IDEOGRAPH + \xDE\xF1 |0 # CJK UNIFIED IDEOGRAPH + \xDE\xEB |0 # CJK UNIFIED IDEOGRAPH + \xCC\xC7 |0 # CJK UNIFIED IDEOGRAPH + \xDE\xE6 |0 # CJK UNIFIED IDEOGRAPH + \xBC\xA2 |0 # CJK UNIFIED IDEOGRAPH + \xDE\xFE |0 # CJK UNIFIED IDEOGRAPH + \xB3\xEA |0 # CJK UNIFIED IDEOGRAPH + \xDE\xE8 |0 # CJK UNIFIED IDEOGRAPH + \xDE\xED |0 # CJK UNIFIED IDEOGRAPH + \xDE\xEE |0 # CJK UNIFIED IDEOGRAPH + \xC2\xEC |0 # CJK UNIFIED IDEOGRAPH + \xC2\xDA |0 # CJK UNIFIED IDEOGRAPH + \xDE\xF6 |0 # CJK UNIFIED IDEOGRAPH + \xDE\xFC |0 # CJK UNIFIED IDEOGRAPH + \xDE\xFA |0 # CJK UNIFIED IDEOGRAPH + \xC5\xA9 |0 # CJK UNIFIED IDEOGRAPH + \xDF\xA3 |0 # CJK UNIFIED IDEOGRAPH + \xDE\xF7 |0 # CJK UNIFIED IDEOGRAPH + \xDE\xF8 |0 # CJK UNIFIED IDEOGRAPH + \xDE\xE0 |0 # CJK UNIFIED IDEOGRAPH + \xB5\xF9 |0 # CJK UNIFIED IDEOGRAPH + \xC9\xBA |0 # CJK UNIFIED IDEOGRAPH + \xBC\xBF |0 # CJK UNIFIED IDEOGRAPH + \xB9\xF7 |0 # CJK UNIFIED IDEOGRAPH + \xCF\xB3 |0 # CJK UNIFIED IDEOGRAPH + \xDE\xF4 |0 # CJK UNIFIED IDEOGRAPH + \xDF\xA2 |0 # CJK UNIFIED IDEOGRAPH + \xB1\xE9 |0 # CJK UNIFIED IDEOGRAPH + \xC1\xE6 |0 # CJK UNIFIED IDEOGRAPH + \xC7\xF9 |0 # CJK UNIFIED IDEOGRAPH + \xB4\xC1 |0 # CJK UNIFIED IDEOGRAPH + \xCE\xFA |0 # CJK UNIFIED IDEOGRAPH + \xCC\xA1 |0 # CJK UNIFIED IDEOGRAPH + \xC4\xD2 |0 # CJK UNIFIED IDEOGRAPH + \xDE\xFB |0 # CJK UNIFIED IDEOGRAPH + \xDE\xFD |0 # CJK UNIFIED IDEOGRAPH + \xC1\xB2 |0 # CJK UNIFIED IDEOGRAPH + \xDF\xA1 |0 # CJK UNIFIED IDEOGRAPH + \xDE\xF9 |0 # CJK UNIFIED IDEOGRAPH + \xDE\xF3 |0 # CJK UNIFIED IDEOGRAPH + \xB4\xC3 |0 # CJK UNIFIED IDEOGRAPH + \xB7\xE9 |0 # CJK UNIFIED IDEOGRAPH + \xDF\xAF |0 # CJK UNIFIED IDEOGRAPH + \xDF\xAA |0 # CJK UNIFIED IDEOGRAPH + \xC0\xF8 |0 # CJK UNIFIED IDEOGRAPH + \xB3\xE3 |0 # CJK UNIFIED IDEOGRAPH + \xBD\xE1 |0 # CJK UNIFIED IDEOGRAPH + \xDF\xB3 |0 # CJK UNIFIED IDEOGRAPH + \xDF\xAC |0 # CJK UNIFIED IDEOGRAPH + \xC4\xAC |0 # CJK UNIFIED IDEOGRAPH + \xDF\xA9 |0 # CJK UNIFIED IDEOGRAPH + \xC4\xD9 |0 # CJK UNIFIED IDEOGRAPH + \xDF\xCC |0 # CJK UNIFIED IDEOGRAPH + \xDF\xA6 |0 # CJK UNIFIED IDEOGRAPH + \xDF\xA5 |0 # CJK UNIFIED IDEOGRAPH + \xDF\xAE |0 # CJK UNIFIED IDEOGRAPH + \xDF\xA8 |0 # CJK UNIFIED IDEOGRAPH + \xDF\xA7 |0 # CJK UNIFIED IDEOGRAPH + \xDF\xAD |0 # CJK UNIFIED IDEOGRAPH + \xC0\xA1 |0 # CJK UNIFIED IDEOGRAPH + \xDF\xA4 |0 # CJK UNIFIED IDEOGRAPH + \xFA\xEE |0 # CJK UNIFIED IDEOGRAPH + \xDF\xB0 |0 # CJK UNIFIED IDEOGRAPH + \xDF\xB1 |0 # CJK UNIFIED IDEOGRAPH + \xB4\xC2 |0 # CJK UNIFIED IDEOGRAPH + \xDF\xB6 |0 # CJK UNIFIED IDEOGRAPH + \xDF\xB5 |0 # CJK UNIFIED IDEOGRAPH + \xDF\xB7 |0 # CJK UNIFIED IDEOGRAPH + \xDF\xBA |0 # CJK UNIFIED IDEOGRAPH + \xC5\xC3 |0 # CJK UNIFIED IDEOGRAPH + \xDF\xB4 |0 # CJK UNIFIED IDEOGRAPH + \xFA\xEF |0 # CJK UNIFIED IDEOGRAPH + \xDF\xB8 |0 # CJK UNIFIED IDEOGRAPH + \xB7\xE3 |0 # CJK UNIFIED IDEOGRAPH + \xC2\xF9 |0 # CJK UNIFIED IDEOGRAPH + \xDF\xB2 |0 # CJK UNIFIED IDEOGRAPH + \xC7\xBB |0 # CJK UNIFIED IDEOGRAPH + \xDF\xB9 |0 # CJK UNIFIED IDEOGRAPH + \xDF\xBE |0 # CJK UNIFIED IDEOGRAPH + \xDF\xBC |0 # CJK UNIFIED IDEOGRAPH + \xDF\xBF |0 # CJK UNIFIED IDEOGRAPH + \xDF\xC2 |0 # CJK UNIFIED IDEOGRAPH + \xDF\xBB |0 # CJK UNIFIED IDEOGRAPH + \xB9\xEA |0 # CJK UNIFIED IDEOGRAPH + \xC7\xA8 |0 # CJK UNIFIED IDEOGRAPH + \xDE\xB9 |0 # CJK UNIFIED IDEOGRAPH + \xCD\xF4 |0 # CJK UNIFIED IDEOGRAPH + \xDF\xBD |0 # CJK UNIFIED IDEOGRAPH + \xDF\xC1 |0 # CJK UNIFIED IDEOGRAPH + \xC2\xF5 |0 # CJK UNIFIED IDEOGRAPH + \xDF\xC0 |0 # CJK UNIFIED IDEOGRAPH + \xDF\xAB |0 # CJK UNIFIED IDEOGRAPH + \xFA\xF0 |0 # CJK UNIFIED IDEOGRAPH + \xEF\xE9 |0 # CJK UNIFIED IDEOGRAPH + \xDF\xC5 |0 # CJK UNIFIED IDEOGRAPH + \xDF\xC9 |0 # CJK UNIFIED IDEOGRAPH + \xDF\xC7 |0 # CJK UNIFIED IDEOGRAPH + \xFA\xF1 |0 # CJK UNIFIED IDEOGRAPH + \xFA\xF2 |0 # CJK UNIFIED IDEOGRAPH + \xDF\xC3 |0 # CJK UNIFIED IDEOGRAPH + \xDF\xC4 |0 # CJK UNIFIED IDEOGRAPH + \xDF\xC8 |0 # CJK UNIFIED IDEOGRAPH + \xDF\xC6 |0 # CJK UNIFIED IDEOGRAPH + \xC9\xCE |0 # CJK UNIFIED IDEOGRAPH + \xDF\xCE |0 # CJK UNIFIED IDEOGRAPH + \xDF\xCB |0 # CJK UNIFIED IDEOGRAPH + \xDF\xCA |0 # CJK UNIFIED IDEOGRAPH + \xDF\xCD |0 # CJK UNIFIED IDEOGRAPH + \xC6\xD4 |0 # CJK UNIFIED IDEOGRAPH + \xDF\xCF |0 # CJK UNIFIED IDEOGRAPH + \xC3\xF5 |0 # CJK UNIFIED IDEOGRAPH + \xC2\xED |0 # CJK UNIFIED IDEOGRAPH + \xFA\xF3 |0 # CJK UNIFIED IDEOGRAPH + \xC0\xA5 |0 # CJK UNIFIED IDEOGRAPH + \xDF\xD0 |0 # CJK UNIFIED IDEOGRAPH + \xDF\xD2 |0 # CJK UNIFIED IDEOGRAPH + \xDF\xD1 |0 # CJK UNIFIED IDEOGRAPH + \xDE\xF5 |0 # CJK UNIFIED IDEOGRAPH + \xDF\xD3 |0 # CJK UNIFIED IDEOGRAPH + \xC6\xE7 |0 # CJK UNIFIED IDEOGRAPH + \xDF\xD4 |0 # CJK UNIFIED IDEOGRAPH + \xB2\xD0 |0 # CJK UNIFIED IDEOGRAPH + \xC5\xF4 |0 # CJK UNIFIED IDEOGRAPH + \xB3\xA5 |0 # CJK UNIFIED IDEOGRAPH + \xB5\xE4 |0 # CJK UNIFIED IDEOGRAPH + \xBC\xDE |0 # CJK UNIFIED IDEOGRAPH + \xBA\xD2 |0 # CJK UNIFIED IDEOGRAPH + \xFA\xF4 |0 # CJK UNIFIED IDEOGRAPH + \xCF\xA7 |0 # CJK UNIFIED IDEOGRAPH + \xBF\xE6 |0 # CJK UNIFIED IDEOGRAPH + \xB1\xEA |0 # CJK UNIFIED IDEOGRAPH + \xDF\xD6 |0 # CJK UNIFIED IDEOGRAPH + \xDF\xD5 |0 # CJK UNIFIED IDEOGRAPH + \xFA\xF5 |0 # CJK UNIFIED IDEOGRAPH + \xDF\xD9 |0 # CJK UNIFIED IDEOGRAPH + \xC3\xBA |0 # CJK UNIFIED IDEOGRAPH + \xDF\xDC |0 # CJK UNIFIED IDEOGRAPH + \xDF\xD7 |0 # CJK UNIFIED IDEOGRAPH + \xDF\xDB |0 # CJK UNIFIED IDEOGRAPH + \xDF\xDA |0 # CJK UNIFIED IDEOGRAPH + \xC5\xC0 |0 # CJK UNIFIED IDEOGRAPH + \xB0\xD9 |0 # CJK UNIFIED IDEOGRAPH + \xF9\xA7 |0 # CJK UNIFIED IDEOGRAPH + \xCE\xF5 |0 # CJK UNIFIED IDEOGRAPH + \xDF\xDE |0 # CJK UNIFIED IDEOGRAPH + \xB1\xA8 |0 # CJK UNIFIED IDEOGRAPH + \xDF\xE0 |0 # CJK UNIFIED IDEOGRAPH + \xDF\xDF |0 # CJK UNIFIED IDEOGRAPH + \xDF\xDD |0 # CJK UNIFIED IDEOGRAPH + \xDF\xD8 |0 # CJK UNIFIED IDEOGRAPH + \xCB\xA3 |0 # CJK UNIFIED IDEOGRAPH + \xDF\xE2 |0 # CJK UNIFIED IDEOGRAPH + \xFA\xF7 |0 # CJK UNIFIED IDEOGRAPH + \xDF\xE1 |0 # CJK UNIFIED IDEOGRAPH + \xFA\xF6 |0 # CJK UNIFIED IDEOGRAPH + \xB1\xEB |0 # CJK UNIFIED IDEOGRAPH + \xDF\xE4 |0 # CJK UNIFIED IDEOGRAPH + \xCA\xB2 |0 # CJK UNIFIED IDEOGRAPH + \xDF\xE3 |0 # CJK UNIFIED IDEOGRAPH + \xCC\xB5 |0 # CJK UNIFIED IDEOGRAPH + \xBE\xC7 |0 # CJK UNIFIED IDEOGRAPH + \xC1\xB3 |0 # CJK UNIFIED IDEOGRAPH + \xBE\xC6 |0 # CJK UNIFIED IDEOGRAPH + \xFA\xF9 |0 # CJK UNIFIED IDEOGRAPH + \xFA\xFA |0 # CJK UNIFIED IDEOGRAPH + \xCE\xFB |0 # CJK UNIFIED IDEOGRAPH + \xDF\xEA |0 # CJK UNIFIED IDEOGRAPH + \xC0\xF9 |0 # CJK UNIFIED IDEOGRAPH + \xDF\xE6 |0 # CJK UNIFIED IDEOGRAPH + \xDF\xEB |0 # CJK UNIFIED IDEOGRAPH + \xB1\xEC |0 # CJK UNIFIED IDEOGRAPH + \xFA\xF8 |0 # CJK UNIFIED IDEOGRAPH + \xDF\xE9 |0 # CJK UNIFIED IDEOGRAPH + \xC7\xE1 |0 # CJK UNIFIED IDEOGRAPH + \xDF\xE5 |0 # CJK UNIFIED IDEOGRAPH + \xDF\xE8 |0 # CJK UNIFIED IDEOGRAPH + \xBE\xC8 |0 # CJK UNIFIED IDEOGRAPH + \xC8\xD1 |0 # CJK UNIFIED IDEOGRAPH + \xDF\xEC |0 # CJK UNIFIED IDEOGRAPH + \xBC\xD1 |0 # CJK UNIFIED IDEOGRAPH + \xC0\xFA |0 # CJK UNIFIED IDEOGRAPH + \xDF\xEF |0 # CJK UNIFIED IDEOGRAPH + \xDF\xE7 |0 # CJK UNIFIED IDEOGRAPH + \xB7\xA7 |0 # CJK UNIFIED IDEOGRAPH + \xDF\xED |0 # CJK UNIFIED IDEOGRAPH + \xCD\xD0 |0 # CJK UNIFIED IDEOGRAPH + \xDF\xF0 |0 # CJK UNIFIED IDEOGRAPH + \xF4\xA6 |0 # CJK UNIFIED IDEOGRAPH + \xBD\xCF |0 # CJK UNIFIED IDEOGRAPH + \xDF\xF1 |0 # CJK UNIFIED IDEOGRAPH + \xDF\xF2 |0 # CJK UNIFIED IDEOGRAPH + \xC7\xAE |0 # CJK UNIFIED IDEOGRAPH + \xDF\xF4 |0 # CJK UNIFIED IDEOGRAPH + \xDF\xF5 |0 # CJK UNIFIED IDEOGRAPH + \xFA\xFC |0 # CJK UNIFIED IDEOGRAPH + \xC7\xB3 |0 # CJK UNIFIED IDEOGRAPH + \xC5\xF5 |0 # CJK UNIFIED IDEOGRAPH + \xDF\xF7 |0 # CJK UNIFIED IDEOGRAPH + \xDF\xF9 |0 # CJK UNIFIED IDEOGRAPH + \xCE\xD5 |0 # CJK UNIFIED IDEOGRAPH + \xDF\xF6 |0 # CJK UNIFIED IDEOGRAPH + \xDF\xF8 |0 # CJK UNIFIED IDEOGRAPH + \xB1\xED |0 # CJK UNIFIED IDEOGRAPH + \xDF\xF3 |0 # CJK UNIFIED IDEOGRAPH + \xD3\xDB |0 # CJK UNIFIED IDEOGRAPH + \xDF\xFA |0 # CJK UNIFIED IDEOGRAPH + \xC1\xE7 |0 # CJK UNIFIED IDEOGRAPH + \xBB\xB8 |0 # CJK UNIFIED IDEOGRAPH + \xDF\xFC |0 # CJK UNIFIED IDEOGRAPH + \xDF\xFB |0 # CJK UNIFIED IDEOGRAPH + \xBF\xA4 |0 # CJK UNIFIED IDEOGRAPH + \xD2\xD9 |0 # CJK UNIFIED IDEOGRAPH + \xDF\xFD |0 # CJK UNIFIED IDEOGRAPH + \xE0\xA1 |0 # CJK UNIFIED IDEOGRAPH + \xDF\xEE |0 # CJK UNIFIED IDEOGRAPH + \xDF\xFE |0 # CJK UNIFIED IDEOGRAPH + \xFA\xFD |0 # CJK UNIFIED IDEOGRAPH + \xE0\xA2 |0 # CJK UNIFIED IDEOGRAPH + \xC7\xFA |0 # CJK UNIFIED IDEOGRAPH + \xE0\xA3 |0 # CJK UNIFIED IDEOGRAPH + \xE0\xA4 |0 # CJK UNIFIED IDEOGRAPH + \xE0\xA5 |0 # CJK UNIFIED IDEOGRAPH + \xE0\xA6 |0 # CJK UNIFIED IDEOGRAPH + \xC4\xDE |0 # CJK UNIFIED IDEOGRAPH + \xE0\xA8 |0 # CJK UNIFIED IDEOGRAPH + \xE0\xA7 |0 # CJK UNIFIED IDEOGRAPH + \xE0\xA9 |0 # CJK UNIFIED IDEOGRAPH + \xE0\xAA |0 # CJK UNIFIED IDEOGRAPH + \xBC\xDF |0 # CJK UNIFIED IDEOGRAPH + \xC9\xE3 |0 # CJK UNIFIED IDEOGRAPH + \xCC\xEC |0 # CJK UNIFIED IDEOGRAPH + \xE0\xAB |0 # CJK UNIFIED IDEOGRAPH + \xE0\xAC |0 # CJK UNIFIED IDEOGRAPH + \xC1\xD6 |0 # CJK UNIFIED IDEOGRAPH + \xBC\xA4 |0 # CJK UNIFIED IDEOGRAPH + \xE0\xAD |0 # CJK UNIFIED IDEOGRAPH + \xE0\xAE |0 # CJK UNIFIED IDEOGRAPH + \xE0\xAF |0 # CJK UNIFIED IDEOGRAPH + \xCA\xD2 |0 # CJK UNIFIED IDEOGRAPH + \xC8\xC7 |0 # CJK UNIFIED IDEOGRAPH + \xE0\xB0 |0 # CJK UNIFIED IDEOGRAPH + \xC7\xD7 |0 # CJK UNIFIED IDEOGRAPH + \xC4\xAD |0 # CJK UNIFIED IDEOGRAPH + \xE0\xB1 |0 # CJK UNIFIED IDEOGRAPH + \xB2\xE7 |0 # CJK UNIFIED IDEOGRAPH + \xB5\xED |0 # CJK UNIFIED IDEOGRAPH + \xCC\xC6 |0 # CJK UNIFIED IDEOGRAPH + \xCC\xB6 |0 # CJK UNIFIED IDEOGRAPH + \xB2\xB4 |0 # CJK UNIFIED IDEOGRAPH + \xCF\xB4 |0 # CJK UNIFIED IDEOGRAPH + \xCB\xD2 |0 # CJK UNIFIED IDEOGRAPH + \xCA\xAA |0 # CJK UNIFIED IDEOGRAPH + \xC0\xB7 |0 # CJK UNIFIED IDEOGRAPH + \xE0\xB2 |0 # CJK UNIFIED IDEOGRAPH + \xC6\xC3 |0 # CJK UNIFIED IDEOGRAPH + \xB8\xA3 |0 # CJK UNIFIED IDEOGRAPH + \xE0\xB3 |0 # CJK UNIFIED IDEOGRAPH + \xBA\xD4 |0 # CJK UNIFIED IDEOGRAPH + \xE0\xB5 |0 # CJK UNIFIED IDEOGRAPH + \xE0\xB4 |0 # CJK UNIFIED IDEOGRAPH + \xE0\xB6 |0 # CJK UNIFIED IDEOGRAPH + \xE0\xB7 |0 # CJK UNIFIED IDEOGRAPH + \xE0\xB8 |0 # CJK UNIFIED IDEOGRAPH + \xB5\xBE |0 # CJK UNIFIED IDEOGRAPH + \xE0\xB9 |0 # CJK UNIFIED IDEOGRAPH + \xE0\xBA |0 # CJK UNIFIED IDEOGRAPH + \xB8\xA4 |0 # CJK UNIFIED IDEOGRAPH + \xC8\xC8 |0 # CJK UNIFIED IDEOGRAPH + \xFA\xFE |0 # CJK UNIFIED IDEOGRAPH + \xE0\xBC |0 # CJK UNIFIED IDEOGRAPH + \xBE\xF5 |0 # CJK UNIFIED IDEOGRAPH + \xE0\xBB |0 # CJK UNIFIED IDEOGRAPH + \xFB\xA1 |0 # CJK UNIFIED IDEOGRAPH + \xB6\xB8 |0 # CJK UNIFIED IDEOGRAPH + \xE0\xBD |0 # CJK UNIFIED IDEOGRAPH + \xE0\xBF |0 # CJK UNIFIED IDEOGRAPH + \xE0\xBE |0 # CJK UNIFIED IDEOGRAPH + \xE0\xC0 |0 # CJK UNIFIED IDEOGRAPH + \xB8\xD1 |0 # CJK UNIFIED IDEOGRAPH + \xE0\xC1 |0 # CJK UNIFIED IDEOGRAPH + \xB6\xE9 |0 # CJK UNIFIED IDEOGRAPH + \xC1\xC0 |0 # CJK UNIFIED IDEOGRAPH + \xB9\xFD |0 # CJK UNIFIED IDEOGRAPH + \xE0\xC3 |0 # CJK UNIFIED IDEOGRAPH + \xE0\xC4 |0 # CJK UNIFIED IDEOGRAPH + \xE0\xC2 |0 # CJK UNIFIED IDEOGRAPH + \xBC\xED |0 # CJK UNIFIED IDEOGRAPH + \xC6\xC8 |0 # CJK UNIFIED IDEOGRAPH + \xB6\xB9 |0 # CJK UNIFIED IDEOGRAPH + \xE0\xC6 |0 # CJK UNIFIED IDEOGRAPH + \xC3\xAC |0 # CJK UNIFIED IDEOGRAPH + \xE0\xC5 |0 # CJK UNIFIED IDEOGRAPH + \xCF\xB5 |0 # CJK UNIFIED IDEOGRAPH + \xC7\xE2 |0 # CJK UNIFIED IDEOGRAPH + \xE0\xC9 |0 # CJK UNIFIED IDEOGRAPH + \xE0\xCB |0 # CJK UNIFIED IDEOGRAPH + \xE0\xC8 |0 # CJK UNIFIED IDEOGRAPH + \xCC\xD4 |0 # CJK UNIFIED IDEOGRAPH + \xE0\xCA |0 # CJK UNIFIED IDEOGRAPH + \xE0\xCC |0 # CJK UNIFIED IDEOGRAPH + \xCE\xC4 |0 # CJK UNIFIED IDEOGRAPH + \xFB\xA2 |0 # CJK UNIFIED IDEOGRAPH + \xE0\xD0 |0 # CJK UNIFIED IDEOGRAPH + \xE0\xCF |0 # CJK UNIFIED IDEOGRAPH + \xC3\xF6 |0 # CJK UNIFIED IDEOGRAPH + \xC7\xAD |0 # CJK UNIFIED IDEOGRAPH + \xB8\xA5 |0 # CJK UNIFIED IDEOGRAPH + \xE0\xCE |0 # CJK UNIFIED IDEOGRAPH + \xE0\xCD |0 # CJK UNIFIED IDEOGRAPH + \xCD\xB1 |0 # CJK UNIFIED IDEOGRAPH + \xCD\xB2 |0 # CJK UNIFIED IDEOGRAPH + \xE0\xD1 |0 # CJK UNIFIED IDEOGRAPH + \xB1\xEE |0 # CJK UNIFIED IDEOGRAPH + \xB9\xF6 |0 # CJK UNIFIED IDEOGRAPH + \xBB\xE2 |0 # CJK UNIFIED IDEOGRAPH + \xE0\xD2 |0 # CJK UNIFIED IDEOGRAPH + \xE0\xD3 |0 # CJK UNIFIED IDEOGRAPH + \xE0\xD5 |0 # CJK UNIFIED IDEOGRAPH + \xBD\xC3 |0 # CJK UNIFIED IDEOGRAPH + \xE0\xD7 |0 # CJK UNIFIED IDEOGRAPH + \xE0\xD6 |0 # CJK UNIFIED IDEOGRAPH + \xE0\xD8 |0 # CJK UNIFIED IDEOGRAPH + \xB3\xCD |0 # CJK UNIFIED IDEOGRAPH + \xE0\xDA |0 # CJK UNIFIED IDEOGRAPH + \xFB\xA4 |0 # CJK UNIFIED IDEOGRAPH + \xE0\xD9 |0 # CJK UNIFIED IDEOGRAPH + \xE0\xDC |0 # CJK UNIFIED IDEOGRAPH + \xE0\xDB |0 # CJK UNIFIED IDEOGRAPH + \xB8\xBC |0 # CJK UNIFIED IDEOGRAPH + \xCE\xA8 |0 # CJK UNIFIED IDEOGRAPH + \xB6\xCC |0 # CJK UNIFIED IDEOGRAPH + \xB2\xA6 |0 # CJK UNIFIED IDEOGRAPH + \xB6\xEA |0 # CJK UNIFIED IDEOGRAPH + \xB4\xE1 |0 # CJK UNIFIED IDEOGRAPH + \xCE\xE8 |0 # CJK UNIFIED IDEOGRAPH + \xE0\xDE |0 # CJK UNIFIED IDEOGRAPH + \xE0\xE0 |0 # CJK UNIFIED IDEOGRAPH + \xFB\xA5 |0 # CJK UNIFIED IDEOGRAPH + \xE0\xE1 |0 # CJK UNIFIED IDEOGRAPH + \xB2\xD1 |0 # CJK UNIFIED IDEOGRAPH + \xE0\xDD |0 # CJK UNIFIED IDEOGRAPH + \xFB\xA6 |0 # CJK UNIFIED IDEOGRAPH + \xBB\xB9 |0 # CJK UNIFIED IDEOGRAPH + \xC4\xC1 |0 # CJK UNIFIED IDEOGRAPH + \xE0\xDF |0 # CJK UNIFIED IDEOGRAPH + \xFB\xA9 |0 # CJK UNIFIED IDEOGRAPH + \xFB\xA7 |0 # CJK UNIFIED IDEOGRAPH + \xE0\xE4 |0 # CJK UNIFIED IDEOGRAPH + \xBC\xEE |0 # CJK UNIFIED IDEOGRAPH + \xFB\xA8 |0 # CJK UNIFIED IDEOGRAPH + \xE0\xE2 |0 # CJK UNIFIED IDEOGRAPH + \xB7\xBE |0 # CJK UNIFIED IDEOGRAPH + \xC8\xC9 |0 # CJK UNIFIED IDEOGRAPH + \xE0\xE3 |0 # CJK UNIFIED IDEOGRAPH + \xE0\xFE |0 # CJK UNIFIED IDEOGRAPH + \xFB\xAB |0 # CJK UNIFIED IDEOGRAPH + \xE0\xE9 |0 # CJK UNIFIED IDEOGRAPH + \xB8\xBD |0 # CJK UNIFIED IDEOGRAPH + \xB5\xE5 |0 # CJK UNIFIED IDEOGRAPH + \xE0\xE6 |0 # CJK UNIFIED IDEOGRAPH + \xCD\xFD |0 # CJK UNIFIED IDEOGRAPH + \xFB\xAA |0 # CJK UNIFIED IDEOGRAPH + \xCE\xB0 |0 # CJK UNIFIED IDEOGRAPH + \xC2\xF6 |0 # CJK UNIFIED IDEOGRAPH + \xE0\xE8 |0 # CJK UNIFIED IDEOGRAPH + \xFB\xAC |0 # CJK UNIFIED IDEOGRAPH + \xFB\xAE |0 # CJK UNIFIED IDEOGRAPH + \xFB\xAD |0 # CJK UNIFIED IDEOGRAPH + \xFB\xAF |0 # CJK UNIFIED IDEOGRAPH + \xE0\xEA |0 # CJK UNIFIED IDEOGRAPH + \xCE\xD6 |0 # CJK UNIFIED IDEOGRAPH + \xB6\xD7 |0 # CJK UNIFIED IDEOGRAPH + \xC8\xFC |0 # CJK UNIFIED IDEOGRAPH + \xC7\xCA |0 # CJK UNIFIED IDEOGRAPH + \xE0\xEB |0 # CJK UNIFIED IDEOGRAPH + \xE0\xED |0 # CJK UNIFIED IDEOGRAPH + \xE0\xF0 |0 # CJK UNIFIED IDEOGRAPH + \xE0\xEC |0 # CJK UNIFIED IDEOGRAPH + \xE0\xEF |0 # CJK UNIFIED IDEOGRAPH + \xB8\xEA |0 # CJK UNIFIED IDEOGRAPH + \xB1\xCD |0 # CJK UNIFIED IDEOGRAPH + \xE0\xF1 |0 # CJK UNIFIED IDEOGRAPH + \xBF\xF0 |0 # CJK UNIFIED IDEOGRAPH + \xE0\xEE |0 # CJK UNIFIED IDEOGRAPH + \xCE\xDC |0 # CJK UNIFIED IDEOGRAPH + \xFB\xB0 |0 # CJK UNIFIED IDEOGRAPH + \xE0\xF4 |0 # CJK UNIFIED IDEOGRAPH + \xF4\xA4 |0 # CJK UNIFIED IDEOGRAPH + \xE0\xF2 |0 # CJK UNIFIED IDEOGRAPH + \xE0\xF5 |0 # CJK UNIFIED IDEOGRAPH + \xE0\xE7 |0 # CJK UNIFIED IDEOGRAPH + \xE0\xF3 |0 # CJK UNIFIED IDEOGRAPH + \xBA\xBC |0 # CJK UNIFIED IDEOGRAPH + \xE0\xF6 |0 # CJK UNIFIED IDEOGRAPH + \xE0\xF7 |0 # CJK UNIFIED IDEOGRAPH + \xCD\xFE |0 # CJK UNIFIED IDEOGRAPH + \xFB\xB1 |0 # CJK UNIFIED IDEOGRAPH + \xE0\xF8 |0 # CJK UNIFIED IDEOGRAPH + \xE0\xF9 |0 # CJK UNIFIED IDEOGRAPH + \xFB\xB2 |0 # CJK UNIFIED IDEOGRAPH + \xE0\xE5 |0 # CJK UNIFIED IDEOGRAPH + \xE0\xFA |0 # CJK UNIFIED IDEOGRAPH + \xB4\xC4 |0 # CJK UNIFIED IDEOGRAPH + \xBC\xA5 |0 # CJK UNIFIED IDEOGRAPH + \xE0\xFB |0 # CJK UNIFIED IDEOGRAPH + \xE0\xFC |0 # CJK UNIFIED IDEOGRAPH + \xE0\xFD |0 # CJK UNIFIED IDEOGRAPH + \xB1\xBB |0 # CJK UNIFIED IDEOGRAPH + \xE1\xA1 |0 # CJK UNIFIED IDEOGRAPH + \xC9\xBB |0 # CJK UNIFIED IDEOGRAPH + \xE1\xA2 |0 # CJK UNIFIED IDEOGRAPH + \xB4\xA4 |0 # CJK UNIFIED IDEOGRAPH + \xE1\xA3 |0 # CJK UNIFIED IDEOGRAPH + \xE1\xA4 |0 # CJK UNIFIED IDEOGRAPH + \xE1\xA5 |0 # CJK UNIFIED IDEOGRAPH + \xE1\xA7 |0 # CJK UNIFIED IDEOGRAPH + \xE1\xA8 |0 # CJK UNIFIED IDEOGRAPH + \xE1\xA6 |0 # CJK UNIFIED IDEOGRAPH + \xC9\xD3 |0 # CJK UNIFIED IDEOGRAPH + \xE1\xAA |0 # CJK UNIFIED IDEOGRAPH + \xE1\xA9 |0 # CJK UNIFIED IDEOGRAPH + \xFB\xB3 |0 # CJK UNIFIED IDEOGRAPH + \xE1\xAC |0 # CJK UNIFIED IDEOGRAPH + \xE1\xAB |0 # CJK UNIFIED IDEOGRAPH + \xE1\xAD |0 # CJK UNIFIED IDEOGRAPH + \xE1\xAE |0 # CJK UNIFIED IDEOGRAPH + \xE1\xB0 |0 # CJK UNIFIED IDEOGRAPH + \xE1\xAF |0 # CJK UNIFIED IDEOGRAPH + \xB9\xF9 |0 # CJK UNIFIED IDEOGRAPH + \xE1\xB2 |0 # CJK UNIFIED IDEOGRAPH + \xE1\xB1 |0 # CJK UNIFIED IDEOGRAPH + \xB4\xC5 |0 # CJK UNIFIED IDEOGRAPH + \xBF\xD3 |0 # CJK UNIFIED IDEOGRAPH + \xC5\xBC |0 # CJK UNIFIED IDEOGRAPH + \xE1\xB3 |0 # CJK UNIFIED IDEOGRAPH + \xC0\xB8 |0 # CJK UNIFIED IDEOGRAPH + \xBB\xBA |0 # CJK UNIFIED IDEOGRAPH + \xB1\xF9 |0 # CJK UNIFIED IDEOGRAPH + \xE1\xB4 |0 # CJK UNIFIED IDEOGRAPH + \xCD\xD1 |0 # CJK UNIFIED IDEOGRAPH + \xCA\xE3 |0 # CJK UNIFIED IDEOGRAPH + \xE1\xB5 |0 # CJK UNIFIED IDEOGRAPH + \xF9\xEC |0 # CJK UNIFIED IDEOGRAPH + \xC5\xC4 |0 # CJK UNIFIED IDEOGRAPH + \xCD\xB3 |0 # CJK UNIFIED IDEOGRAPH + \xB9\xC3 |0 # CJK UNIFIED IDEOGRAPH + \xBF\xBD |0 # CJK UNIFIED IDEOGRAPH + \xC3\xCB |0 # CJK UNIFIED IDEOGRAPH + \xD2\xB4 |0 # CJK UNIFIED IDEOGRAPH + \xC4\xAE |0 # CJK UNIFIED IDEOGRAPH + \xB2\xE8 |0 # CJK UNIFIED IDEOGRAPH + \xE1\xB6 |0 # CJK UNIFIED IDEOGRAPH + \xE1\xB7 |0 # CJK UNIFIED IDEOGRAPH + \xE1\xBC |0 # CJK UNIFIED IDEOGRAPH + \xE1\xBA |0 # CJK UNIFIED IDEOGRAPH + \xE1\xB9 |0 # CJK UNIFIED IDEOGRAPH + \xDA\xC2 |0 # CJK UNIFIED IDEOGRAPH + \xB3\xA6 |0 # CJK UNIFIED IDEOGRAPH + \xE1\xB8 |0 # CJK UNIFIED IDEOGRAPH + \xB0\xDA |0 # CJK UNIFIED IDEOGRAPH + \xC8\xAA |0 # CJK UNIFIED IDEOGRAPH + \xC8\xCA |0 # CJK UNIFIED IDEOGRAPH + \xCE\xB1 |0 # CJK UNIFIED IDEOGRAPH + \xE1\xBD |0 # CJK UNIFIED IDEOGRAPH + \xE1\xBB |0 # CJK UNIFIED IDEOGRAPH + \xC3\xDC |0 # CJK UNIFIED IDEOGRAPH + \xC0\xA6 |0 # CJK UNIFIED IDEOGRAPH + \xC8\xAB |0 # CJK UNIFIED IDEOGRAPH + \xC9\xAD |0 # CJK UNIFIED IDEOGRAPH + \xE1\xBF |0 # CJK UNIFIED IDEOGRAPH + \xCE\xAC |0 # CJK UNIFIED IDEOGRAPH + \xB7\xCD |0 # CJK UNIFIED IDEOGRAPH + \xE1\xC0 |0 # CJK UNIFIED IDEOGRAPH + \xE1\xBE |0 # CJK UNIFIED IDEOGRAPH + \xC8\xD6 |0 # CJK UNIFIED IDEOGRAPH + \xE1\xC1 |0 # CJK UNIFIED IDEOGRAPH + \xE1\xC2 |0 # CJK UNIFIED IDEOGRAPH + \xFB\xB4 |0 # CJK UNIFIED IDEOGRAPH + \xB0\xDB |0 # CJK UNIFIED IDEOGRAPH + \xBE\xF6 |0 # CJK UNIFIED IDEOGRAPH + \xE1\xC7 |0 # CJK UNIFIED IDEOGRAPH + \xE1\xC4 |0 # CJK UNIFIED IDEOGRAPH + \xC6\xED |0 # CJK UNIFIED IDEOGRAPH + \xE1\xC3 |0 # CJK UNIFIED IDEOGRAPH + \xB5\xA6 |0 # CJK UNIFIED IDEOGRAPH + \xE1\xCA |0 # CJK UNIFIED IDEOGRAPH + \xE1\xC5 |0 # CJK UNIFIED IDEOGRAPH + \xE1\xC6 |0 # CJK UNIFIED IDEOGRAPH + \xE1\xC9 |0 # CJK UNIFIED IDEOGRAPH + \xE1\xC8 |0 # CJK UNIFIED IDEOGRAPH + \xC9\xA5 |0 # CJK UNIFIED IDEOGRAPH + \xC1\xC2 |0 # CJK UNIFIED IDEOGRAPH + \xC1\xC1 |0 # CJK UNIFIED IDEOGRAPH + \xB5\xBF |0 # CJK UNIFIED IDEOGRAPH + \xE1\xCB |0 # CJK UNIFIED IDEOGRAPH + \xE1\xCC |0 # CJK UNIFIED IDEOGRAPH + \xE1\xCD |0 # CJK UNIFIED IDEOGRAPH + \xE1\xCF |0 # CJK UNIFIED IDEOGRAPH + \xE1\xCE |0 # CJK UNIFIED IDEOGRAPH + \xB1\xD6 |0 # CJK UNIFIED IDEOGRAPH + \xE1\xD7 |0 # CJK UNIFIED IDEOGRAPH + \xC8\xE8 |0 # CJK UNIFIED IDEOGRAPH + \xE1\xD1 |0 # CJK UNIFIED IDEOGRAPH + \xE1\xD3 |0 # CJK UNIFIED IDEOGRAPH + \xE1\xD5 |0 # CJK UNIFIED IDEOGRAPH + \xBF\xBE |0 # CJK UNIFIED IDEOGRAPH + \xE1\xD6 |0 # CJK UNIFIED IDEOGRAPH + \xE1\xD4 |0 # CJK UNIFIED IDEOGRAPH + \xBC\xC0 |0 # CJK UNIFIED IDEOGRAPH + \xE1\xD0 |0 # CJK UNIFIED IDEOGRAPH + \xE1\xD2 |0 # CJK UNIFIED IDEOGRAPH + \xC9\xC2 |0 # CJK UNIFIED IDEOGRAPH + \xBE\xC9 |0 # CJK UNIFIED IDEOGRAPH + \xE1\xD9 |0 # CJK UNIFIED IDEOGRAPH + \xE1\xD8 |0 # CJK UNIFIED IDEOGRAPH + \xE1\xDA |0 # CJK UNIFIED IDEOGRAPH + \xBC\xA6 |0 # CJK UNIFIED IDEOGRAPH + \xBA\xAF |0 # CJK UNIFIED IDEOGRAPH + \xC5\xF7 |0 # CJK UNIFIED IDEOGRAPH + \xE1\xDB |0 # CJK UNIFIED IDEOGRAPH + \xC4\xCB |0 # CJK UNIFIED IDEOGRAPH + \xE1\xDD |0 # CJK UNIFIED IDEOGRAPH + \xCE\xA1 |0 # CJK UNIFIED IDEOGRAPH + \xE1\xDC |0 # CJK UNIFIED IDEOGRAPH + \xC1\xE9 |0 # CJK UNIFIED IDEOGRAPH + \xE1\xE2 |0 # CJK UNIFIED IDEOGRAPH + \xE1\xE4 |0 # CJK UNIFIED IDEOGRAPH + \xE1\xE5 |0 # CJK UNIFIED IDEOGRAPH + \xC3\xD4 |0 # CJK UNIFIED IDEOGRAPH + \xE1\xE3 |0 # CJK UNIFIED IDEOGRAPH + \xE1\xE0 |0 # CJK UNIFIED IDEOGRAPH + \xE1\xDE |0 # CJK UNIFIED IDEOGRAPH + \xE1\xDF |0 # CJK UNIFIED IDEOGRAPH + \xE1\xE1 |0 # CJK UNIFIED IDEOGRAPH + \xE1\xE8 |0 # CJK UNIFIED IDEOGRAPH + \xE1\xE6 |0 # CJK UNIFIED IDEOGRAPH + \xE1\xE7 |0 # CJK UNIFIED IDEOGRAPH + \xE1\xE9 |0 # CJK UNIFIED IDEOGRAPH + \xE1\xEB |0 # CJK UNIFIED IDEOGRAPH + \xE1\xEC |0 # CJK UNIFIED IDEOGRAPH + \xE1\xED |0 # CJK UNIFIED IDEOGRAPH + \xE1\xEE |0 # CJK UNIFIED IDEOGRAPH + \xE1\xEA |0 # CJK UNIFIED IDEOGRAPH + \xE1\xF0 |0 # CJK UNIFIED IDEOGRAPH + \xE1\xEF |0 # CJK UNIFIED IDEOGRAPH + \xE1\xF1 |0 # CJK UNIFIED IDEOGRAPH + \xCE\xC5 |0 # CJK UNIFIED IDEOGRAPH + \xE1\xF4 |0 # CJK UNIFIED IDEOGRAPH + \xE1\xF2 |0 # CJK UNIFIED IDEOGRAPH + \xE1\xF3 |0 # CJK UNIFIED IDEOGRAPH + \xB4\xE2 |0 # CJK UNIFIED IDEOGRAPH + \xCC\xFE |0 # CJK UNIFIED IDEOGRAPH + \xCA\xCA |0 # CJK UNIFIED IDEOGRAPH + \xE1\xF6 |0 # CJK UNIFIED IDEOGRAPH + \xE1\xF5 |0 # CJK UNIFIED IDEOGRAPH + \xE1\xF7 |0 # CJK UNIFIED IDEOGRAPH + \xE1\xF8 |0 # CJK UNIFIED IDEOGRAPH + \xE1\xFC |0 # CJK UNIFIED IDEOGRAPH + \xE1\xF9 |0 # CJK UNIFIED IDEOGRAPH + \xE1\xFA |0 # CJK UNIFIED IDEOGRAPH + \xE1\xFB |0 # CJK UNIFIED IDEOGRAPH + \xE1\xFD |0 # CJK UNIFIED IDEOGRAPH + \xE1\xFE |0 # CJK UNIFIED IDEOGRAPH + \xE2\xA1 |0 # CJK UNIFIED IDEOGRAPH + \xE2\xA2 |0 # CJK UNIFIED IDEOGRAPH + \xE2\xA3 |0 # CJK UNIFIED IDEOGRAPH + \xC8\xAF |0 # CJK UNIFIED IDEOGRAPH + \xC5\xD0 |0 # CJK UNIFIED IDEOGRAPH + \xE2\xA4 |0 # CJK UNIFIED IDEOGRAPH + \xC7\xF2 |0 # CJK UNIFIED IDEOGRAPH + \xC9\xB4 |0 # CJK UNIFIED IDEOGRAPH + \xE2\xA5 |0 # CJK UNIFIED IDEOGRAPH + \xFB\xB5 |0 # CJK UNIFIED IDEOGRAPH + \xE2\xA6 |0 # CJK UNIFIED IDEOGRAPH + \xC5\xAA |0 # CJK UNIFIED IDEOGRAPH + \xB3\xA7 |0 # CJK UNIFIED IDEOGRAPH + \xB9\xC4 |0 # CJK UNIFIED IDEOGRAPH + \xE2\xA7 |0 # CJK UNIFIED IDEOGRAPH + \xE2\xA8 |0 # CJK UNIFIED IDEOGRAPH + \xE2\xA9 |0 # CJK UNIFIED IDEOGRAPH + \xBB\xA9 |0 # CJK UNIFIED IDEOGRAPH + \xE2\xAB |0 # CJK UNIFIED IDEOGRAPH + \xE2\xAA |0 # CJK UNIFIED IDEOGRAPH + \xE2\xAC |0 # CJK UNIFIED IDEOGRAPH + \xE2\xAD |0 # CJK UNIFIED IDEOGRAPH + \xFB\xB8 |0 # CJK UNIFIED IDEOGRAPH + \xFB\xB6 |0 # CJK UNIFIED IDEOGRAPH + \xFB\xB7 |0 # CJK UNIFIED IDEOGRAPH + \xFB\xB9 |0 # CJK UNIFIED IDEOGRAPH + \xC8\xE9 |0 # CJK UNIFIED IDEOGRAPH + \xE2\xAE |0 # CJK UNIFIED IDEOGRAPH + \xE2\xAF |0 # CJK UNIFIED IDEOGRAPH + \xF3\xE9 |0 # CJK UNIFIED IDEOGRAPH + \xE2\xB0 |0 # CJK UNIFIED IDEOGRAPH + \xE2\xB1 |0 # CJK UNIFIED IDEOGRAPH + \xE2\xB2 |0 # CJK UNIFIED IDEOGRAPH + \xBB\xAE |0 # CJK UNIFIED IDEOGRAPH + \xE2\xB3 |0 # CJK UNIFIED IDEOGRAPH + \xC7\xD6 |0 # CJK UNIFIED IDEOGRAPH + \xCB\xDF |0 # CJK UNIFIED IDEOGRAPH + \xB1\xCE |0 # CJK UNIFIED IDEOGRAPH + \xB1\xD7 |0 # CJK UNIFIED IDEOGRAPH + \xE2\xB4 |0 # CJK UNIFIED IDEOGRAPH + \xE2\xB6 |0 # CJK UNIFIED IDEOGRAPH + \xE2\xB5 |0 # CJK UNIFIED IDEOGRAPH + \xC5\xF0 |0 # CJK UNIFIED IDEOGRAPH + \xC0\xB9 |0 # CJK UNIFIED IDEOGRAPH + \xDD\xB9 |0 # CJK UNIFIED IDEOGRAPH + \xE2\xB7 |0 # CJK UNIFIED IDEOGRAPH + \xCC\xC1 |0 # CJK UNIFIED IDEOGRAPH + \xE2\xB8 |0 # CJK UNIFIED IDEOGRAPH + \xB4\xC6 |0 # CJK UNIFIED IDEOGRAPH + \xC8\xD7 |0 # CJK UNIFIED IDEOGRAPH + \xE2\xB9 |0 # CJK UNIFIED IDEOGRAPH + \xE2\xBA |0 # CJK UNIFIED IDEOGRAPH + \xE2\xBB |0 # CJK UNIFIED IDEOGRAPH + \xCC\xDC |0 # CJK UNIFIED IDEOGRAPH + \xCC\xD5 |0 # CJK UNIFIED IDEOGRAPH + \xC4\xBE |0 # CJK UNIFIED IDEOGRAPH + \xC1\xEA |0 # CJK UNIFIED IDEOGRAPH + \xE2\xBD |0 # CJK UNIFIED IDEOGRAPH + \xBD\xE2 |0 # CJK UNIFIED IDEOGRAPH + \xBE\xCA |0 # CJK UNIFIED IDEOGRAPH + \xE2\xC0 |0 # CJK UNIFIED IDEOGRAPH + \xE2\xBF |0 # CJK UNIFIED IDEOGRAPH + \xE2\xBE |0 # CJK UNIFIED IDEOGRAPH + \xC8\xFD |0 # CJK UNIFIED IDEOGRAPH + \xB4\xC7 |0 # CJK UNIFIED IDEOGRAPH + \xB8\xA9 |0 # CJK UNIFIED IDEOGRAPH + \xE2\xC6 |0 # CJK UNIFIED IDEOGRAPH + \xE2\xC3 |0 # CJK UNIFIED IDEOGRAPH + \xBF\xBF |0 # CJK UNIFIED IDEOGRAPH + \xCC\xB2 |0 # CJK UNIFIED IDEOGRAPH + \xE2\xC2 |0 # CJK UNIFIED IDEOGRAPH + \xE2\xC4 |0 # CJK UNIFIED IDEOGRAPH + \xE2\xC5 |0 # CJK UNIFIED IDEOGRAPH + \xE2\xC1 |0 # CJK UNIFIED IDEOGRAPH + \xE2\xC7 |0 # CJK UNIFIED IDEOGRAPH + \xE2\xC8 |0 # CJK UNIFIED IDEOGRAPH + \xC4\xAF |0 # CJK UNIFIED IDEOGRAPH + \xB4\xE3 |0 # CJK UNIFIED IDEOGRAPH + \xC3\xE5 |0 # CJK UNIFIED IDEOGRAPH + \xFB\xBB |0 # CJK UNIFIED IDEOGRAPH + \xE2\xC9 |0 # CJK UNIFIED IDEOGRAPH + \xE2\xCA |0 # CJK UNIFIED IDEOGRAPH + \xE2\xCD |0 # CJK UNIFIED IDEOGRAPH + \xBF\xE7 |0 # CJK UNIFIED IDEOGRAPH + \xC6\xC4 |0 # CJK UNIFIED IDEOGRAPH + \xE2\xCE |0 # CJK UNIFIED IDEOGRAPH + \xCB\xD3 |0 # CJK UNIFIED IDEOGRAPH + \xE2\xCB |0 # CJK UNIFIED IDEOGRAPH + \xE2\xCC |0 # CJK UNIFIED IDEOGRAPH + \xE2\xD1 |0 # CJK UNIFIED IDEOGRAPH + \xE2\xD0 |0 # CJK UNIFIED IDEOGRAPH + \xE2\xCF |0 # CJK UNIFIED IDEOGRAPH + \xE2\xD3 |0 # CJK UNIFIED IDEOGRAPH + \xE2\xD2 |0 # CJK UNIFIED IDEOGRAPH + \xE2\xD4 |0 # CJK UNIFIED IDEOGRAPH + \xE2\xD6 |0 # CJK UNIFIED IDEOGRAPH + \xE2\xD5 |0 # CJK UNIFIED IDEOGRAPH + \xCA\xCD |0 # CJK UNIFIED IDEOGRAPH + \xBD\xD6 |0 # CJK UNIFIED IDEOGRAPH + \xCE\xC6 |0 # CJK UNIFIED IDEOGRAPH + \xE2\xD7 |0 # CJK UNIFIED IDEOGRAPH + \xC6\xB7 |0 # CJK UNIFIED IDEOGRAPH + \xE2\xD8 |0 # CJK UNIFIED IDEOGRAPH + \xE2\xD9 |0 # CJK UNIFIED IDEOGRAPH + \xE2\xDD |0 # CJK UNIFIED IDEOGRAPH + \xE2\xDB |0 # CJK UNIFIED IDEOGRAPH + \xE2\xDC |0 # CJK UNIFIED IDEOGRAPH + \xE2\xDA |0 # CJK UNIFIED IDEOGRAPH + \xE2\xDE |0 # CJK UNIFIED IDEOGRAPH + \xE2\xDF |0 # CJK UNIFIED IDEOGRAPH + \xE2\xE0 |0 # CJK UNIFIED IDEOGRAPH + \xE2\xE1 |0 # CJK UNIFIED IDEOGRAPH + \xCC\xB7 |0 # CJK UNIFIED IDEOGRAPH + \xE2\xE2 |0 # CJK UNIFIED IDEOGRAPH + \xCC\xF0 |0 # CJK UNIFIED IDEOGRAPH + \xE2\xE3 |0 # CJK UNIFIED IDEOGRAPH + \xC3\xCE |0 # CJK UNIFIED IDEOGRAPH + \xC7\xEA |0 # CJK UNIFIED IDEOGRAPH + \xB6\xEB |0 # CJK UNIFIED IDEOGRAPH + \xC3\xBB |0 # CJK UNIFIED IDEOGRAPH + \xE2\xE4 |0 # CJK UNIFIED IDEOGRAPH + \xB6\xBA |0 # CJK UNIFIED IDEOGRAPH + \xC0\xD0 |0 # CJK UNIFIED IDEOGRAPH + \xE2\xE5 |0 # CJK UNIFIED IDEOGRAPH + \xBA\xBD |0 # CJK UNIFIED IDEOGRAPH + \xE2\xE6 |0 # CJK UNIFIED IDEOGRAPH + \xE2\xE7 |0 # CJK UNIFIED IDEOGRAPH + \xB8\xA6 |0 # CJK UNIFIED IDEOGRAPH + \xBA\xD5 |0 # CJK UNIFIED IDEOGRAPH + \xE2\xE9 |0 # CJK UNIFIED IDEOGRAPH + \xFB\xBD |0 # CJK UNIFIED IDEOGRAPH + \xC5\xD6 |0 # CJK UNIFIED IDEOGRAPH + \xBA\xD6 |0 # CJK UNIFIED IDEOGRAPH + \xB5\xCE |0 # CJK UNIFIED IDEOGRAPH + \xCB\xA4 |0 # CJK UNIFIED IDEOGRAPH + \xC7\xCB |0 # CJK UNIFIED IDEOGRAPH + \xC5\xD7 |0 # CJK UNIFIED IDEOGRAPH + \xB9\xDC |0 # CJK UNIFIED IDEOGRAPH + \xE2\xEB |0 # CJK UNIFIED IDEOGRAPH + \xFB\xBE |0 # CJK UNIFIED IDEOGRAPH + \xBE\xCB |0 # CJK UNIFIED IDEOGRAPH + \xFB\xBF |0 # CJK UNIFIED IDEOGRAPH + \xCE\xB2 |0 # CJK UNIFIED IDEOGRAPH + \xB9\xC5 |0 # CJK UNIFIED IDEOGRAPH + \xB8\xA7 |0 # CJK UNIFIED IDEOGRAPH + \xC8\xA3 |0 # CJK UNIFIED IDEOGRAPH + \xE2\xED |0 # CJK UNIFIED IDEOGRAPH + \xFB\xC0 |0 # CJK UNIFIED IDEOGRAPH + \xE2\xEF |0 # CJK UNIFIED IDEOGRAPH + \xB8\xEB |0 # CJK UNIFIED IDEOGRAPH + \xE2\xEE |0 # CJK UNIFIED IDEOGRAPH + \xC4\xF6 |0 # CJK UNIFIED IDEOGRAPH + \xE2\xF1 |0 # CJK UNIFIED IDEOGRAPH + \xB3\xB7 |0 # CJK UNIFIED IDEOGRAPH + \xE2\xEC |0 # CJK UNIFIED IDEOGRAPH + \xC8\xEA |0 # CJK UNIFIED IDEOGRAPH + \xB1\xB0 |0 # CJK UNIFIED IDEOGRAPH + \xBA\xEC |0 # CJK UNIFIED IDEOGRAPH + \xCF\xD2 |0 # CJK UNIFIED IDEOGRAPH + \xE2\xF0 |0 # CJK UNIFIED IDEOGRAPH + \xE2\xF2 |0 # CJK UNIFIED IDEOGRAPH + \xCA\xCB |0 # CJK UNIFIED IDEOGRAPH + \xC0\xD9 |0 # CJK UNIFIED IDEOGRAPH + \xE2\xF4 |0 # CJK UNIFIED IDEOGRAPH + \xE2\xF5 |0 # CJK UNIFIED IDEOGRAPH + \xE2\xF3 |0 # CJK UNIFIED IDEOGRAPH + \xB3\xCE |0 # CJK UNIFIED IDEOGRAPH + \xE2\xFB |0 # CJK UNIFIED IDEOGRAPH + \xE2\xFA |0 # CJK UNIFIED IDEOGRAPH + \xBC\xA7 |0 # CJK UNIFIED IDEOGRAPH + \xE2\xFC |0 # CJK UNIFIED IDEOGRAPH + \xE2\xF7 |0 # CJK UNIFIED IDEOGRAPH + \xE2\xFD |0 # CJK UNIFIED IDEOGRAPH + \xE2\xF8 |0 # CJK UNIFIED IDEOGRAPH + \xC8\xD8 |0 # CJK UNIFIED IDEOGRAPH + \xE2\xF6 |0 # CJK UNIFIED IDEOGRAPH + \xE2\xF9 |0 # CJK UNIFIED IDEOGRAPH + \xE3\xA2 |0 # CJK UNIFIED IDEOGRAPH + \xE3\xA1 |0 # CJK UNIFIED IDEOGRAPH + \xCB\xE1 |0 # CJK UNIFIED IDEOGRAPH + \xE2\xFE |0 # CJK UNIFIED IDEOGRAPH + \xB0\xEB |0 # CJK UNIFIED IDEOGRAPH + \xE3\xA4 |0 # CJK UNIFIED IDEOGRAPH + \xE3\xA3 |0 # CJK UNIFIED IDEOGRAPH + \xBE\xCC |0 # CJK UNIFIED IDEOGRAPH + \xE3\xA5 |0 # CJK UNIFIED IDEOGRAPH + \xC1\xC3 |0 # CJK UNIFIED IDEOGRAPH + \xE3\xA7 |0 # CJK UNIFIED IDEOGRAPH + \xE3\xA6 |0 # CJK UNIFIED IDEOGRAPH + \xE3\xA8 |0 # CJK UNIFIED IDEOGRAPH + \xE2\xE8 |0 # CJK UNIFIED IDEOGRAPH + \xE2\xEA |0 # CJK UNIFIED IDEOGRAPH + \xE3\xAA |0 # CJK UNIFIED IDEOGRAPH + \xE3\xA9 |0 # CJK UNIFIED IDEOGRAPH + \xFB\xC1 |0 # CJK UNIFIED IDEOGRAPH + \xBC\xA8 |0 # CJK UNIFIED IDEOGRAPH + \xCE\xE9 |0 # CJK UNIFIED IDEOGRAPH + \xBC\xD2 |0 # CJK UNIFIED IDEOGRAPH + \xE3\xAB |0 # CJK UNIFIED IDEOGRAPH + \xB7\xB7 |0 # CJK UNIFIED IDEOGRAPH + \xB5\xC0 |0 # CJK UNIFIED IDEOGRAPH + \xB5\xA7 |0 # CJK UNIFIED IDEOGRAPH + \xBB\xE3 |0 # CJK UNIFIED IDEOGRAPH + \xCD\xB4 |0 # CJK UNIFIED IDEOGRAPH + \xE3\xB1 |0 # CJK UNIFIED IDEOGRAPH + \xE3\xB0 |0 # CJK UNIFIED IDEOGRAPH + \xC1\xC4 |0 # CJK UNIFIED IDEOGRAPH + \xE3\xAD |0 # CJK UNIFIED IDEOGRAPH + \xE3\xAF |0 # CJK UNIFIED IDEOGRAPH + \xBD\xCB |0 # CJK UNIFIED IDEOGRAPH + \xBF\xC0 |0 # CJK UNIFIED IDEOGRAPH + \xE3\xAE |0 # CJK UNIFIED IDEOGRAPH + \xE3\xAC |0 # CJK UNIFIED IDEOGRAPH + \xC7\xAA |0 # CJK UNIFIED IDEOGRAPH + \xBE\xCD |0 # CJK UNIFIED IDEOGRAPH + \xC9\xBC |0 # CJK UNIFIED IDEOGRAPH + \xBA\xD7 |0 # CJK UNIFIED IDEOGRAPH + \xC5\xF8 |0 # CJK UNIFIED IDEOGRAPH + \xE3\xB2 |0 # CJK UNIFIED IDEOGRAPH + \xE3\xB3 |0 # CJK UNIFIED IDEOGRAPH + \xE3\xC9 |0 # CJK UNIFIED IDEOGRAPH + \xB6\xD8 |0 # CJK UNIFIED IDEOGRAPH + \xCF\xBD |0 # CJK UNIFIED IDEOGRAPH + \xC1\xB5 |0 # CJK UNIFIED IDEOGRAPH + \xE3\xB4 |0 # CJK UNIFIED IDEOGRAPH + \xB2\xD2 |0 # CJK UNIFIED IDEOGRAPH + \xC4\xF7 |0 # CJK UNIFIED IDEOGRAPH + \xCA\xA1 |0 # CJK UNIFIED IDEOGRAPH + \xFB\xC5 |0 # CJK UNIFIED IDEOGRAPH + \xFB\xC7 |0 # CJK UNIFIED IDEOGRAPH + \xE3\xB5 |0 # CJK UNIFIED IDEOGRAPH + \xB5\xFA |0 # CJK UNIFIED IDEOGRAPH + \xE3\xB6 |0 # CJK UNIFIED IDEOGRAPH + \xE3\xB8 |0 # CJK UNIFIED IDEOGRAPH + \xE3\xB9 |0 # CJK UNIFIED IDEOGRAPH + \xC7\xA9 |0 # CJK UNIFIED IDEOGRAPH + \xE3\xBA |0 # CJK UNIFIED IDEOGRAPH + \xE3\xBB |0 # CJK UNIFIED IDEOGRAPH + \xE3\xBC |0 # CJK UNIFIED IDEOGRAPH + \xB6\xD9 |0 # CJK UNIFIED IDEOGRAPH + \xB2\xD3 |0 # CJK UNIFIED IDEOGRAPH + \xC6\xC5 |0 # CJK UNIFIED IDEOGRAPH + \xBD\xA8 |0 # CJK UNIFIED IDEOGRAPH + \xBB\xE4 |0 # CJK UNIFIED IDEOGRAPH + \xE3\xBD |0 # CJK UNIFIED IDEOGRAPH + \xBD\xA9 |0 # CJK UNIFIED IDEOGRAPH + \xB2\xCA |0 # CJK UNIFIED IDEOGRAPH + \xC9\xC3 |0 # CJK UNIFIED IDEOGRAPH + \xE3\xBE |0 # CJK UNIFIED IDEOGRAPH + \xC8\xEB |0 # CJK UNIFIED IDEOGRAPH + \xC1\xC5 |0 # CJK UNIFIED IDEOGRAPH + \xE3\xC1 |0 # CJK UNIFIED IDEOGRAPH + \xE3\xC2 |0 # CJK UNIFIED IDEOGRAPH + \xC7\xE9 |0 # CJK UNIFIED IDEOGRAPH + \xBF\xC1 |0 # CJK UNIFIED IDEOGRAPH + \xE3\xBF |0 # CJK UNIFIED IDEOGRAPH + \xC3\xE1 |0 # CJK UNIFIED IDEOGRAPH + \xE3\xC0 |0 # CJK UNIFIED IDEOGRAPH + \xBE\xCE |0 # CJK UNIFIED IDEOGRAPH + \xB0\xDC |0 # CJK UNIFIED IDEOGRAPH + \xB5\xA9 |0 # CJK UNIFIED IDEOGRAPH + \xE3\xC3 |0 # CJK UNIFIED IDEOGRAPH + \xC4\xF8 |0 # CJK UNIFIED IDEOGRAPH + \xE3\xC4 |0 # CJK UNIFIED IDEOGRAPH + \xC0\xC7 |0 # CJK UNIFIED IDEOGRAPH + \xCC\xAD |0 # CJK UNIFIED IDEOGRAPH + \xC9\xA3 |0 # CJK UNIFIED IDEOGRAPH + \xE3\xC5 |0 # CJK UNIFIED IDEOGRAPH + \xE3\xC6 |0 # CJK UNIFIED IDEOGRAPH + \xC3\xD5 |0 # CJK UNIFIED IDEOGRAPH + \xCE\xC7 |0 # CJK UNIFIED IDEOGRAPH + \xE3\xC8 |0 # CJK UNIFIED IDEOGRAPH + \xE3\xC7 |0 # CJK UNIFIED IDEOGRAPH + \xBC\xEF |0 # CJK UNIFIED IDEOGRAPH + \xE3\xCA |0 # CJK UNIFIED IDEOGRAPH + \xB0\xF0 |0 # CJK UNIFIED IDEOGRAPH + \xE3\xCD |0 # CJK UNIFIED IDEOGRAPH + \xE3\xCB |0 # CJK UNIFIED IDEOGRAPH + \xB2\xD4 |0 # CJK UNIFIED IDEOGRAPH + \xB7\xCE |0 # CJK UNIFIED IDEOGRAPH + \xE3\xCC |0 # CJK UNIFIED IDEOGRAPH + \xB9\xC6 |0 # CJK UNIFIED IDEOGRAPH + \xB9\xF2 |0 # CJK UNIFIED IDEOGRAPH + \xCA\xE6 |0 # CJK UNIFIED IDEOGRAPH + \xE3\xCE |0 # CJK UNIFIED IDEOGRAPH + \xCB\xD4 |0 # CJK UNIFIED IDEOGRAPH + \xE3\xD0 |0 # CJK UNIFIED IDEOGRAPH + \xC0\xD1 |0 # CJK UNIFIED IDEOGRAPH + \xB1\xCF |0 # CJK UNIFIED IDEOGRAPH + \xB2\xBA |0 # CJK UNIFIED IDEOGRAPH + \xB0\xAC |0 # CJK UNIFIED IDEOGRAPH + \xE3\xCF |0 # CJK UNIFIED IDEOGRAPH + \xE3\xD1 |0 # CJK UNIFIED IDEOGRAPH + \xE3\xD2 |0 # CJK UNIFIED IDEOGRAPH + \xBE\xF7 |0 # CJK UNIFIED IDEOGRAPH + \xE3\xD3 |0 # CJK UNIFIED IDEOGRAPH + \xB3\xCF |0 # CJK UNIFIED IDEOGRAPH + \xE3\xD5 |0 # CJK UNIFIED IDEOGRAPH + \xB7\xEA |0 # CJK UNIFIED IDEOGRAPH + \xB5\xE6 |0 # CJK UNIFIED IDEOGRAPH + \xE3\xD6 |0 # CJK UNIFIED IDEOGRAPH + \xB6\xF5 |0 # CJK UNIFIED IDEOGRAPH + \xE3\xD7 |0 # CJK UNIFIED IDEOGRAPH + \xC0\xFC |0 # CJK UNIFIED IDEOGRAPH + \xC6\xCD |0 # CJK UNIFIED IDEOGRAPH + \xC0\xE0 |0 # CJK UNIFIED IDEOGRAPH + \xBA\xF5 |0 # CJK UNIFIED IDEOGRAPH + \xE3\xD8 |0 # CJK UNIFIED IDEOGRAPH + \xC3\xE2 |0 # CJK UNIFIED IDEOGRAPH + \xC1\xEB |0 # CJK UNIFIED IDEOGRAPH + \xE3\xDA |0 # CJK UNIFIED IDEOGRAPH + \xE3\xDC |0 # CJK UNIFIED IDEOGRAPH + \xE3\xD9 |0 # CJK UNIFIED IDEOGRAPH + \xE3\xDB |0 # CJK UNIFIED IDEOGRAPH + \xB7\xA2 |0 # CJK UNIFIED IDEOGRAPH + \xE3\xDD |0 # CJK UNIFIED IDEOGRAPH + \xB7\xA6 |0 # CJK UNIFIED IDEOGRAPH + \xB5\xE7 |0 # CJK UNIFIED IDEOGRAPH + \xCD\xD2 |0 # CJK UNIFIED IDEOGRAPH + \xE3\xDF |0 # CJK UNIFIED IDEOGRAPH + \xE3\xE0 |0 # CJK UNIFIED IDEOGRAPH + \xB1\xAE |0 # CJK UNIFIED IDEOGRAPH + \xE3\xE3 |0 # CJK UNIFIED IDEOGRAPH + \xB3\xF6 |0 # CJK UNIFIED IDEOGRAPH + \xE3\xE2 |0 # CJK UNIFIED IDEOGRAPH + \xE3\xE1 |0 # CJK UNIFIED IDEOGRAPH + \xE3\xE5 |0 # CJK UNIFIED IDEOGRAPH + \xE3\xDE |0 # CJK UNIFIED IDEOGRAPH + \xE3\xE6 |0 # CJK UNIFIED IDEOGRAPH + \xCE\xA9 |0 # CJK UNIFIED IDEOGRAPH + \xE3\xE7 |0 # CJK UNIFIED IDEOGRAPH + \xE3\xE8 |0 # CJK UNIFIED IDEOGRAPH + \xFB\xC8 |0 # CJK UNIFIED IDEOGRAPH + \xD4\xF4 |0 # CJK UNIFIED IDEOGRAPH + \xE3\xEA |0 # CJK UNIFIED IDEOGRAPH + \xE3\xE9 |0 # CJK UNIFIED IDEOGRAPH + \xE3\xEB |0 # CJK UNIFIED IDEOGRAPH + \xE3\xEC |0 # CJK UNIFIED IDEOGRAPH + \xCE\xB5 |0 # CJK UNIFIED IDEOGRAPH + \xE3\xED |0 # CJK UNIFIED IDEOGRAPH + \xF0\xEF |0 # CJK UNIFIED IDEOGRAPH + \xBE\xCF |0 # CJK UNIFIED IDEOGRAPH + \xE3\xEE |0 # CJK UNIFIED IDEOGRAPH + \xE3\xEF |0 # CJK UNIFIED IDEOGRAPH + \xBD\xD7 |0 # CJK UNIFIED IDEOGRAPH + \xC6\xB8 |0 # CJK UNIFIED IDEOGRAPH + \xE3\xF0 |0 # CJK UNIFIED IDEOGRAPH + \xFB\xC9 |0 # CJK UNIFIED IDEOGRAPH + \xC3\xA8 |0 # CJK UNIFIED IDEOGRAPH + \xFB\xCB |0 # CJK UNIFIED IDEOGRAPH + \xE3\xF1 |0 # CJK UNIFIED IDEOGRAPH + \xC3\xBC |0 # CJK UNIFIED IDEOGRAPH + \xE3\xF2 |0 # CJK UNIFIED IDEOGRAPH + \xB6\xA5 |0 # CJK UNIFIED IDEOGRAPH + \xD1\xBF |0 # CJK UNIFIED IDEOGRAPH + \xC3\xDD |0 # CJK UNIFIED IDEOGRAPH + \xBC\xB3 |0 # CJK UNIFIED IDEOGRAPH + \xB4\xC8 |0 # CJK UNIFIED IDEOGRAPH + \xE3\xF3 |0 # CJK UNIFIED IDEOGRAPH + \xE4\xA2 |0 # CJK UNIFIED IDEOGRAPH + \xE3\xF6 |0 # CJK UNIFIED IDEOGRAPH + \xB5\xE8 |0 # CJK UNIFIED IDEOGRAPH + \xE3\xF5 |0 # CJK UNIFIED IDEOGRAPH + \xE4\xA4 |0 # CJK UNIFIED IDEOGRAPH + \xE3\xF4 |0 # CJK UNIFIED IDEOGRAPH + \xBE\xD0 |0 # CJK UNIFIED IDEOGRAPH + \xE3\xF8 |0 # CJK UNIFIED IDEOGRAPH + \xE3\xF9 |0 # CJK UNIFIED IDEOGRAPH + \xC5\xAB |0 # CJK UNIFIED IDEOGRAPH + \xE3\xFA |0 # CJK UNIFIED IDEOGRAPH + \xB3\xDE |0 # CJK UNIFIED IDEOGRAPH + \xBF\xDA |0 # CJK UNIFIED IDEOGRAPH + \xC9\xE4 |0 # CJK UNIFIED IDEOGRAPH + \xE3\xFC |0 # CJK UNIFIED IDEOGRAPH + \xC2\xE8 |0 # CJK UNIFIED IDEOGRAPH + \xE3\xF7 |0 # CJK UNIFIED IDEOGRAPH + \xE3\xFB |0 # CJK UNIFIED IDEOGRAPH + \xE3\xFD |0 # CJK UNIFIED IDEOGRAPH + \xBA\xFB |0 # CJK UNIFIED IDEOGRAPH + \xE4\xA6 |0 # CJK UNIFIED IDEOGRAPH + \xC9\xAE |0 # CJK UNIFIED IDEOGRAPH + \xC8\xA6 |0 # CJK UNIFIED IDEOGRAPH + \xC5\xF9 |0 # CJK UNIFIED IDEOGRAPH + \xB6\xDA |0 # CJK UNIFIED IDEOGRAPH + \xE4\xA5 |0 # CJK UNIFIED IDEOGRAPH + \xE4\xA3 |0 # CJK UNIFIED IDEOGRAPH + \xC8\xB5 |0 # CJK UNIFIED IDEOGRAPH + \xE3\xFE |0 # CJK UNIFIED IDEOGRAPH + \xC3\xDE |0 # CJK UNIFIED IDEOGRAPH + \xC5\xFB |0 # CJK UNIFIED IDEOGRAPH + \xC5\xFA |0 # CJK UNIFIED IDEOGRAPH + \xBA\xF6 |0 # CJK UNIFIED IDEOGRAPH + \xE4\xB8 |0 # CJK UNIFIED IDEOGRAPH + \xE4\xA8 |0 # CJK UNIFIED IDEOGRAPH + \xE4\xAA |0 # CJK UNIFIED IDEOGRAPH + \xE4\xAD |0 # CJK UNIFIED IDEOGRAPH + \xE4\xAE |0 # CJK UNIFIED IDEOGRAPH + \xE4\xAB |0 # CJK UNIFIED IDEOGRAPH + \xE4\xAC |0 # CJK UNIFIED IDEOGRAPH + \xE4\xA9 |0 # CJK UNIFIED IDEOGRAPH + \xE4\xA7 |0 # CJK UNIFIED IDEOGRAPH + \xE4\xA1 |0 # CJK UNIFIED IDEOGRAPH + \xCA\xCF |0 # CJK UNIFIED IDEOGRAPH + \xB2\xD5 |0 # CJK UNIFIED IDEOGRAPH + \xE4\xB5 |0 # CJK UNIFIED IDEOGRAPH + \xE4\xB2 |0 # CJK UNIFIED IDEOGRAPH + \xE4\xB7 |0 # CJK UNIFIED IDEOGRAPH + \xE4\xB6 |0 # CJK UNIFIED IDEOGRAPH + \xC7\xF3 |0 # CJK UNIFIED IDEOGRAPH + \xCC\xA7 |0 # CJK UNIFIED IDEOGRAPH + \xBB\xBB |0 # CJK UNIFIED IDEOGRAPH + \xE4\xB0 |0 # CJK UNIFIED IDEOGRAPH + \xE4\xB9 |0 # CJK UNIFIED IDEOGRAPH + \xE4\xB4 |0 # CJK UNIFIED IDEOGRAPH + \xE4\xB3 |0 # CJK UNIFIED IDEOGRAPH + \xE4\xAF |0 # CJK UNIFIED IDEOGRAPH + \xFB\xCC |0 # CJK UNIFIED IDEOGRAPH + \xE4\xB1 |0 # CJK UNIFIED IDEOGRAPH + \xB4\xC9 |0 # CJK UNIFIED IDEOGRAPH + \xC3\xBD |0 # CJK UNIFIED IDEOGRAPH + \xC0\xFD |0 # CJK UNIFIED IDEOGRAPH + \xC8\xA2 |0 # CJK UNIFIED IDEOGRAPH + \xE4\xBE |0 # CJK UNIFIED IDEOGRAPH + \xC8\xA4 |0 # CJK UNIFIED IDEOGRAPH + \xC0\xE1 |0 # CJK UNIFIED IDEOGRAPH + \xE4\xBB |0 # CJK UNIFIED IDEOGRAPH + \xC8\xCF |0 # CJK UNIFIED IDEOGRAPH + \xE4\xBF |0 # CJK UNIFIED IDEOGRAPH + \xCA\xD3 |0 # CJK UNIFIED IDEOGRAPH + \xC3\xDB |0 # CJK UNIFIED IDEOGRAPH + \xE4\xBA |0 # CJK UNIFIED IDEOGRAPH + \xE4\xBC |0 # CJK UNIFIED IDEOGRAPH + \xE4\xBD |0 # CJK UNIFIED IDEOGRAPH + \xE4\xC0 |0 # CJK UNIFIED IDEOGRAPH + \xBC\xC4 |0 # CJK UNIFIED IDEOGRAPH + \xC6\xC6 |0 # CJK UNIFIED IDEOGRAPH + \xE4\xC5 |0 # CJK UNIFIED IDEOGRAPH + \xE4\xC4 |0 # CJK UNIFIED IDEOGRAPH + \xE4\xC1 |0 # CJK UNIFIED IDEOGRAPH + \xCF\xB6 |0 # CJK UNIFIED IDEOGRAPH + \xE4\xCA |0 # CJK UNIFIED IDEOGRAPH + \xE4\xCE |0 # CJK UNIFIED IDEOGRAPH + \xE4\xCB |0 # CJK UNIFIED IDEOGRAPH + \xE4\xC7 |0 # CJK UNIFIED IDEOGRAPH + \xE4\xC8 |0 # CJK UNIFIED IDEOGRAPH + \xE4\xCD |0 # CJK UNIFIED IDEOGRAPH + \xE4\xC2 |0 # CJK UNIFIED IDEOGRAPH + \xD2\xD5 |0 # CJK UNIFIED IDEOGRAPH + \xE4\xC9 |0 # CJK UNIFIED IDEOGRAPH + \xE4\xC3 |0 # CJK UNIFIED IDEOGRAPH + \xE4\xCC |0 # CJK UNIFIED IDEOGRAPH + \xE4\xD2 |0 # CJK UNIFIED IDEOGRAPH + \xB4\xCA |0 # CJK UNIFIED IDEOGRAPH + \xE4\xCF |0 # CJK UNIFIED IDEOGRAPH + \xE4\xD0 |0 # CJK UNIFIED IDEOGRAPH + \xE4\xD1 |0 # CJK UNIFIED IDEOGRAPH + \xE4\xD4 |0 # CJK UNIFIED IDEOGRAPH + \xE4\xD3 |0 # CJK UNIFIED IDEOGRAPH + \xC8\xF6 |0 # CJK UNIFIED IDEOGRAPH + \xE4\xD5 |0 # CJK UNIFIED IDEOGRAPH + \xCE\xFC |0 # CJK UNIFIED IDEOGRAPH + \xCA\xED |0 # CJK UNIFIED IDEOGRAPH + \xE4\xDA |0 # CJK UNIFIED IDEOGRAPH + \xE4\xD7 |0 # CJK UNIFIED IDEOGRAPH + \xE4\xD6 |0 # CJK UNIFIED IDEOGRAPH + \xC0\xD2 |0 # CJK UNIFIED IDEOGRAPH + \xE4\xD9 |0 # CJK UNIFIED IDEOGRAPH + \xE4\xDB |0 # CJK UNIFIED IDEOGRAPH + \xE4\xD8 |0 # CJK UNIFIED IDEOGRAPH + \xE4\xDF |0 # CJK UNIFIED IDEOGRAPH + \xE4\xDC |0 # CJK UNIFIED IDEOGRAPH + \xE4\xDD |0 # CJK UNIFIED IDEOGRAPH + \xE4\xC6 |0 # CJK UNIFIED IDEOGRAPH + \xE4\xDE |0 # CJK UNIFIED IDEOGRAPH + \xE4\xE0 |0 # CJK UNIFIED IDEOGRAPH + \xE4\xE1 |0 # CJK UNIFIED IDEOGRAPH + \xCA\xC6 |0 # CJK UNIFIED IDEOGRAPH + \xE4\xE2 |0 # CJK UNIFIED IDEOGRAPH + \xCC\xE2 |0 # CJK UNIFIED IDEOGRAPH + \xB6\xCE |0 # CJK UNIFIED IDEOGRAPH + \xB7\xA9 |0 # CJK UNIFIED IDEOGRAPH + \xE4\xE3 |0 # CJK UNIFIED IDEOGRAPH + \xCA\xB4 |0 # CJK UNIFIED IDEOGRAPH + \xBF\xE8 |0 # CJK UNIFIED IDEOGRAPH + \xCC\xB0 |0 # CJK UNIFIED IDEOGRAPH + \xE4\xE4 |0 # CJK UNIFIED IDEOGRAPH + \xCE\xB3 |0 # CJK UNIFIED IDEOGRAPH + \xC7\xF4 |0 # CJK UNIFIED IDEOGRAPH + \xC1\xC6 |0 # CJK UNIFIED IDEOGRAPH + \xC7\xB4 |0 # CJK UNIFIED IDEOGRAPH + \xBD\xCD |0 # CJK UNIFIED IDEOGRAPH + \xB0\xC0 |0 # CJK UNIFIED IDEOGRAPH + \xE4\xE9 |0 # CJK UNIFIED IDEOGRAPH + \xE4\xE7 |0 # CJK UNIFIED IDEOGRAPH + \xE4\xE5 |0 # CJK UNIFIED IDEOGRAPH + \xB4\xA1 |0 # CJK UNIFIED IDEOGRAPH + \xBE\xD1 |0 # CJK UNIFIED IDEOGRAPH + \xE4\xEA |0 # CJK UNIFIED IDEOGRAPH + \xE4\xE8 |0 # CJK UNIFIED IDEOGRAPH + \xE4\xE6 |0 # CJK UNIFIED IDEOGRAPH + \xE4\xEE |0 # CJK UNIFIED IDEOGRAPH + \xE4\xED |0 # CJK UNIFIED IDEOGRAPH + \xE4\xEC |0 # CJK UNIFIED IDEOGRAPH + \xE4\xEB |0 # CJK UNIFIED IDEOGRAPH + \xE4\xEF |0 # CJK UNIFIED IDEOGRAPH + \xE4\xF0 |0 # CJK UNIFIED IDEOGRAPH + \xC0\xBA |0 # CJK UNIFIED IDEOGRAPH + \xE4\xF1 |0 # CJK UNIFIED IDEOGRAPH + \xE4\xF3 |0 # CJK UNIFIED IDEOGRAPH + \xE4\xF2 |0 # CJK UNIFIED IDEOGRAPH + \xB8\xD2 |0 # CJK UNIFIED IDEOGRAPH + \xC1\xB8 |0 # CJK UNIFIED IDEOGRAPH + \xE4\xF5 |0 # CJK UNIFIED IDEOGRAPH + \xC5\xFC |0 # CJK UNIFIED IDEOGRAPH + \xE4\xF4 |0 # CJK UNIFIED IDEOGRAPH + \xE4\xF6 |0 # CJK UNIFIED IDEOGRAPH + \xCA\xB5 |0 # CJK UNIFIED IDEOGRAPH + \xC1\xEC |0 # CJK UNIFIED IDEOGRAPH + \xB9\xC7 |0 # CJK UNIFIED IDEOGRAPH + \xE4\xF7 |0 # CJK UNIFIED IDEOGRAPH + \xCE\xC8 |0 # CJK UNIFIED IDEOGRAPH + \xE4\xF9 |0 # CJK UNIFIED IDEOGRAPH + \xE4\xFA |0 # CJK UNIFIED IDEOGRAPH + \xE4\xFB |0 # CJK UNIFIED IDEOGRAPH + \xE4\xFC |0 # CJK UNIFIED IDEOGRAPH + \xBB\xE5 |0 # CJK UNIFIED IDEOGRAPH + \xE4\xFD |0 # CJK UNIFIED IDEOGRAPH + \xB7\xCF |0 # CJK UNIFIED IDEOGRAPH + \xB5\xEA |0 # CJK UNIFIED IDEOGRAPH + \xB5\xAA |0 # CJK UNIFIED IDEOGRAPH + \xE5\xA1 |0 # CJK UNIFIED IDEOGRAPH + \xCC\xF3 |0 # CJK UNIFIED IDEOGRAPH + \xB9\xC8 |0 # CJK UNIFIED IDEOGRAPH + \xE4\xFE |0 # CJK UNIFIED IDEOGRAPH + \xE5\xA4 |0 # CJK UNIFIED IDEOGRAPH + \xCC\xE6 |0 # CJK UNIFIED IDEOGRAPH + \xC7\xBC |0 # CJK UNIFIED IDEOGRAPH + \xC9\xB3 |0 # CJK UNIFIED IDEOGRAPH + \xBD\xE3 |0 # CJK UNIFIED IDEOGRAPH + \xE5\xA3 |0 # CJK UNIFIED IDEOGRAPH + \xBC\xD3 |0 # CJK UNIFIED IDEOGRAPH + \xB9\xC9 |0 # CJK UNIFIED IDEOGRAPH + \xBB\xE6 |0 # CJK UNIFIED IDEOGRAPH + \xB5\xE9 |0 # CJK UNIFIED IDEOGRAPH + \xCA\xB6 |0 # CJK UNIFIED IDEOGRAPH + \xE5\xA2 |0 # CJK UNIFIED IDEOGRAPH + \xC1\xC7 |0 # CJK UNIFIED IDEOGRAPH + \xCB\xC2 |0 # CJK UNIFIED IDEOGRAPH + \xBA\xF7 |0 # CJK UNIFIED IDEOGRAPH + \xBB\xE7 |0 # CJK UNIFIED IDEOGRAPH + \xC4\xDD |0 # CJK UNIFIED IDEOGRAPH + \xE5\xA7 |0 # CJK UNIFIED IDEOGRAPH + \xCE\xDF |0 # CJK UNIFIED IDEOGRAPH + \xBA\xD9 |0 # CJK UNIFIED IDEOGRAPH + \xE5\xA8 |0 # CJK UNIFIED IDEOGRAPH + \xBF\xC2 |0 # CJK UNIFIED IDEOGRAPH + \xE5\xAA |0 # CJK UNIFIED IDEOGRAPH + \xBE\xD2 |0 # CJK UNIFIED IDEOGRAPH + \xBA\xB0 |0 # CJK UNIFIED IDEOGRAPH + \xE5\xA9 |0 # CJK UNIFIED IDEOGRAPH + \xBD\xAA |0 # CJK UNIFIED IDEOGRAPH + \xB8\xBE |0 # CJK UNIFIED IDEOGRAPH + \xC1\xC8 |0 # CJK UNIFIED IDEOGRAPH + \xE5\xA5 |0 # CJK UNIFIED IDEOGRAPH + \xE5\xAB |0 # CJK UNIFIED IDEOGRAPH + \xFB\xCE |0 # CJK UNIFIED IDEOGRAPH + \xE5\xA6 |0 # CJK UNIFIED IDEOGRAPH + \xB7\xD0 |0 # CJK UNIFIED IDEOGRAPH + \xE5\xAE |0 # CJK UNIFIED IDEOGRAPH + \xE5\xB2 |0 # CJK UNIFIED IDEOGRAPH + \xB7\xEB |0 # CJK UNIFIED IDEOGRAPH + \xE5\xAD |0 # CJK UNIFIED IDEOGRAPH + \xE5\xB6 |0 # CJK UNIFIED IDEOGRAPH + \xFB\xCF |0 # CJK UNIFIED IDEOGRAPH + \xB9\xCA |0 # CJK UNIFIED IDEOGRAPH + \xCD\xED |0 # CJK UNIFIED IDEOGRAPH + \xB0\xBC |0 # CJK UNIFIED IDEOGRAPH + \xE5\xB3 |0 # CJK UNIFIED IDEOGRAPH + \xB5\xEB |0 # CJK UNIFIED IDEOGRAPH + \xE5\xB0 |0 # CJK UNIFIED IDEOGRAPH + \xE5\xB1 |0 # CJK UNIFIED IDEOGRAPH + \xC5\xFD |0 # CJK UNIFIED IDEOGRAPH + \xE5\xAF |0 # CJK UNIFIED IDEOGRAPH + \xE5\xAC |0 # CJK UNIFIED IDEOGRAPH + \xB3\xA8 |0 # CJK UNIFIED IDEOGRAPH + \xC0\xE4 |0 # CJK UNIFIED IDEOGRAPH + \xB8\xA8 |0 # CJK UNIFIED IDEOGRAPH + \xE5\xB8 |0 # CJK UNIFIED IDEOGRAPH + \xE5\xB5 |0 # CJK UNIFIED IDEOGRAPH + \xE5\xB7 |0 # CJK UNIFIED IDEOGRAPH + \xE5\xB4 |0 # CJK UNIFIED IDEOGRAPH + \xB7\xD1 |0 # CJK UNIFIED IDEOGRAPH + \xC2\xB3 |0 # CJK UNIFIED IDEOGRAPH + \xE5\xB9 |0 # CJK UNIFIED IDEOGRAPH + \xC1\xEE |0 # CJK UNIFIED IDEOGRAPH + \xE5\xC6 |0 # CJK UNIFIED IDEOGRAPH + \xFB\xD1 |0 # CJK UNIFIED IDEOGRAPH + \xE5\xC2 |0 # CJK UNIFIED IDEOGRAPH + \xE5\xBC |0 # CJK UNIFIED IDEOGRAPH + \xE5\xC0 |0 # CJK UNIFIED IDEOGRAPH + \xBC\xFA |0 # CJK UNIFIED IDEOGRAPH + \xB0\xDD |0 # CJK UNIFIED IDEOGRAPH + \xE5\xBB |0 # CJK UNIFIED IDEOGRAPH + \xE5\xC3 |0 # CJK UNIFIED IDEOGRAPH + \xE5\xC7 |0 # CJK UNIFIED IDEOGRAPH + \xB9\xCB |0 # CJK UNIFIED IDEOGRAPH + \xCC\xD6 |0 # CJK UNIFIED IDEOGRAPH + \xC4\xD6 |0 # CJK UNIFIED IDEOGRAPH + \xE5\xBD |0 # CJK UNIFIED IDEOGRAPH + \xFB\xD0 |0 # CJK UNIFIED IDEOGRAPH + \xE5\xC5 |0 # CJK UNIFIED IDEOGRAPH + \xE5\xBA |0 # CJK UNIFIED IDEOGRAPH + \xC3\xBE |0 # CJK UNIFIED IDEOGRAPH + \xE5\xBF |0 # CJK UNIFIED IDEOGRAPH + \xB0\xBD |0 # CJK UNIFIED IDEOGRAPH + \xCC\xCA |0 # CJK UNIFIED IDEOGRAPH + \xE5\xBE |0 # CJK UNIFIED IDEOGRAPH + \xB6\xDB |0 # CJK UNIFIED IDEOGRAPH + \xC8\xEC |0 # CJK UNIFIED IDEOGRAPH + \xC1\xED |0 # CJK UNIFIED IDEOGRAPH + \xCE\xD0 |0 # CJK UNIFIED IDEOGRAPH + \xBD\xEF |0 # CJK UNIFIED IDEOGRAPH + \xE5\xEE |0 # CJK UNIFIED IDEOGRAPH + \xFB\xD2 |0 # CJK UNIFIED IDEOGRAPH + \xE5\xC8 |0 # CJK UNIFIED IDEOGRAPH + \xC0\xFE |0 # CJK UNIFIED IDEOGRAPH + \xE5\xC4 |0 # CJK UNIFIED IDEOGRAPH + \xE5\xC9 |0 # CJK UNIFIED IDEOGRAPH + \xE5\xCB |0 # CJK UNIFIED IDEOGRAPH + \xC4\xF9 |0 # CJK UNIFIED IDEOGRAPH + \xE5\xCE |0 # CJK UNIFIED IDEOGRAPH + \xE5\xCA |0 # CJK UNIFIED IDEOGRAPH + \xCA\xD4 |0 # CJK UNIFIED IDEOGRAPH + \xB4\xCB |0 # CJK UNIFIED IDEOGRAPH + \xCC\xCB |0 # CJK UNIFIED IDEOGRAPH + \xB0\xDE |0 # CJK UNIFIED IDEOGRAPH + \xE5\xCD |0 # CJK UNIFIED IDEOGRAPH + \xCE\xFD |0 # CJK UNIFIED IDEOGRAPH + \xE5\xCC |0 # CJK UNIFIED IDEOGRAPH + \xB1\xEF |0 # CJK UNIFIED IDEOGRAPH + \xC6\xEC |0 # CJK UNIFIED IDEOGRAPH + \xE5\xCF |0 # CJK UNIFIED IDEOGRAPH + \xE5\xD6 |0 # CJK UNIFIED IDEOGRAPH + \xE5\xD0 |0 # CJK UNIFIED IDEOGRAPH + \xE5\xD7 |0 # CJK UNIFIED IDEOGRAPH + \xE5\xD3 |0 # CJK UNIFIED IDEOGRAPH + \xC7\xFB |0 # CJK UNIFIED IDEOGRAPH + \xBC\xCA |0 # CJK UNIFIED IDEOGRAPH + \xE5\xD5 |0 # CJK UNIFIED IDEOGRAPH + \xE5\xD2 |0 # CJK UNIFIED IDEOGRAPH + \xE5\xD8 |0 # CJK UNIFIED IDEOGRAPH + \xE5\xD1 |0 # CJK UNIFIED IDEOGRAPH + \xBD\xC4 |0 # CJK UNIFIED IDEOGRAPH + \xCB\xA5 |0 # CJK UNIFIED IDEOGRAPH + \xBD\xCC |0 # CJK UNIFIED IDEOGRAPH + \xE5\xD4 |0 # CJK UNIFIED IDEOGRAPH + \xE5\xE0 |0 # CJK UNIFIED IDEOGRAPH + \xE5\xDC |0 # CJK UNIFIED IDEOGRAPH + \xE5\xDF |0 # CJK UNIFIED IDEOGRAPH + \xE5\xDD |0 # CJK UNIFIED IDEOGRAPH + \xE5\xE1 |0 # CJK UNIFIED IDEOGRAPH + \xE5\xDB |0 # CJK UNIFIED IDEOGRAPH + \xE5\xC1 |0 # CJK UNIFIED IDEOGRAPH + \xC0\xD3 |0 # CJK UNIFIED IDEOGRAPH + \xC8\xCB |0 # CJK UNIFIED IDEOGRAPH + \xE5\xDE |0 # CJK UNIFIED IDEOGRAPH + \xE5\xD9 |0 # CJK UNIFIED IDEOGRAPH + \xC1\xA1 |0 # CJK UNIFIED IDEOGRAPH + \xB7\xD2 |0 # CJK UNIFIED IDEOGRAPH + \xBD\xAB |0 # CJK UNIFIED IDEOGRAPH + \xFB\xD3 |0 # CJK UNIFIED IDEOGRAPH + \xBF\xA5 |0 # CJK UNIFIED IDEOGRAPH + \xC1\xB6 |0 # CJK UNIFIED IDEOGRAPH + \xE5\xE4 |0 # CJK UNIFIED IDEOGRAPH + \xE5\xE6 |0 # CJK UNIFIED IDEOGRAPH + \xE5\xE7 |0 # CJK UNIFIED IDEOGRAPH + \xE5\xE3 |0 # CJK UNIFIED IDEOGRAPH + \xE5\xE5 |0 # CJK UNIFIED IDEOGRAPH + \xE5\xDA |0 # CJK UNIFIED IDEOGRAPH + \xE5\xE2 |0 # CJK UNIFIED IDEOGRAPH + \xE5\xEA |0 # CJK UNIFIED IDEOGRAPH + \xE5\xE9 |0 # CJK UNIFIED IDEOGRAPH + \xCB\xFA |0 # CJK UNIFIED IDEOGRAPH + \xB7\xAB |0 # CJK UNIFIED IDEOGRAPH + \xE5\xE8 |0 # CJK UNIFIED IDEOGRAPH + \xE5\xEC |0 # CJK UNIFIED IDEOGRAPH + \xE5\xEB |0 # CJK UNIFIED IDEOGRAPH + \xE5\xEF |0 # CJK UNIFIED IDEOGRAPH + \xE5\xF1 |0 # CJK UNIFIED IDEOGRAPH + \xBB\xBC |0 # CJK UNIFIED IDEOGRAPH + \xE5\xED |0 # CJK UNIFIED IDEOGRAPH + \xE5\xF2 |0 # CJK UNIFIED IDEOGRAPH + \xE5\xF3 |0 # CJK UNIFIED IDEOGRAPH + \xF9\xA1 |0 # CJK UNIFIED IDEOGRAPH + \xE5\xF4 |0 # CJK UNIFIED IDEOGRAPH + \xE5\xFA |0 # CJK UNIFIED IDEOGRAPH + \xC5\xBB |0 # CJK UNIFIED IDEOGRAPH + \xE5\xF6 |0 # CJK UNIFIED IDEOGRAPH + \xE5\xF5 |0 # CJK UNIFIED IDEOGRAPH + \xE5\xF7 |0 # CJK UNIFIED IDEOGRAPH + \xE5\xF8 |0 # CJK UNIFIED IDEOGRAPH + \xE5\xF9 |0 # CJK UNIFIED IDEOGRAPH + \xE5\xFB |0 # CJK UNIFIED IDEOGRAPH + \xE5\xFC |0 # CJK UNIFIED IDEOGRAPH + \xB4\xCC |0 # CJK UNIFIED IDEOGRAPH + \xE5\xFD |0 # CJK UNIFIED IDEOGRAPH + \xE5\xFE |0 # CJK UNIFIED IDEOGRAPH + \xE6\xA1 |0 # CJK UNIFIED IDEOGRAPH + \xFB\xD4 |0 # CJK UNIFIED IDEOGRAPH + \xE6\xA2 |0 # CJK UNIFIED IDEOGRAPH + \xE6\xA3 |0 # CJK UNIFIED IDEOGRAPH + \xE6\xA4 |0 # CJK UNIFIED IDEOGRAPH + \xE6\xA5 |0 # CJK UNIFIED IDEOGRAPH + \xE6\xA6 |0 # CJK UNIFIED IDEOGRAPH + \xE6\xA8 |0 # CJK UNIFIED IDEOGRAPH + \xE6\xA7 |0 # CJK UNIFIED IDEOGRAPH + \xE6\xA9 |0 # CJK UNIFIED IDEOGRAPH + \xE6\xAA |0 # CJK UNIFIED IDEOGRAPH + \xE6\xAB |0 # CJK UNIFIED IDEOGRAPH + \xE6\xAE |0 # CJK UNIFIED IDEOGRAPH + \xE6\xAC |0 # CJK UNIFIED IDEOGRAPH + \xE6\xAD |0 # CJK UNIFIED IDEOGRAPH + \xBA\xE1 |0 # CJK UNIFIED IDEOGRAPH + \xB7\xD3 |0 # CJK UNIFIED IDEOGRAPH + \xC3\xD6 |0 # CJK UNIFIED IDEOGRAPH + \xC8\xB3 |0 # CJK UNIFIED IDEOGRAPH + \xBD\xF0 |0 # CJK UNIFIED IDEOGRAPH + \xC7\xCD |0 # CJK UNIFIED IDEOGRAPH + \xC8\xED |0 # CJK UNIFIED IDEOGRAPH + \xE6\xAF |0 # CJK UNIFIED IDEOGRAPH + \xD8\xED |0 # CJK UNIFIED IDEOGRAPH + \xE6\xB0 |0 # CJK UNIFIED IDEOGRAPH + \xE6\xB2 |0 # CJK UNIFIED IDEOGRAPH + \xCD\xE5 |0 # CJK UNIFIED IDEOGRAPH + \xE6\xB1 |0 # CJK UNIFIED IDEOGRAPH + \xE6\xB4 |0 # CJK UNIFIED IDEOGRAPH + \xE6\xB3 |0 # CJK UNIFIED IDEOGRAPH + \xCD\xD3 |0 # CJK UNIFIED IDEOGRAPH + \xE6\xB5 |0 # CJK UNIFIED IDEOGRAPH + \xC8\xFE |0 # CJK UNIFIED IDEOGRAPH + \xE6\xB6 |0 # CJK UNIFIED IDEOGRAPH + \xE6\xB9 |0 # CJK UNIFIED IDEOGRAPH + \xE6\xB8 |0 # CJK UNIFIED IDEOGRAPH + \xE6\xB7 |0 # CJK UNIFIED IDEOGRAPH + \xFB\xD5 |0 # CJK UNIFIED IDEOGRAPH + \xE6\xBA |0 # CJK UNIFIED IDEOGRAPH + \xB7\xB2 |0 # CJK UNIFIED IDEOGRAPH + \xC1\xA2 |0 # CJK UNIFIED IDEOGRAPH + \xB5\xC1 |0 # CJK UNIFIED IDEOGRAPH + \xE6\xBE |0 # CJK UNIFIED IDEOGRAPH + \xE6\xBB |0 # CJK UNIFIED IDEOGRAPH + \xE6\xBC |0 # CJK UNIFIED IDEOGRAPH + \xE6\xBF |0 # CJK UNIFIED IDEOGRAPH + \xE6\xC0 |0 # CJK UNIFIED IDEOGRAPH + \xE6\xBD |0 # CJK UNIFIED IDEOGRAPH + \xB1\xA9 |0 # CJK UNIFIED IDEOGRAPH + \xB2\xA7 |0 # CJK UNIFIED IDEOGRAPH + \xE6\xC2 |0 # CJK UNIFIED IDEOGRAPH + \xE6\xC3 |0 # CJK UNIFIED IDEOGRAPH + \xE6\xC4 |0 # CJK UNIFIED IDEOGRAPH + \xCD\xE2 |0 # CJK UNIFIED IDEOGRAPH + \xBD\xAC |0 # CJK UNIFIED IDEOGRAPH + \xE6\xC6 |0 # CJK UNIFIED IDEOGRAPH + \xE6\xC5 |0 # CJK UNIFIED IDEOGRAPH + \xBF\xE9 |0 # CJK UNIFIED IDEOGRAPH + \xE6\xC7 |0 # CJK UNIFIED IDEOGRAPH + \xE6\xC8 |0 # CJK UNIFIED IDEOGRAPH + \xE6\xC9 |0 # CJK UNIFIED IDEOGRAPH + \xB4\xE5 |0 # CJK UNIFIED IDEOGRAPH + \xB4\xCD |0 # CJK UNIFIED IDEOGRAPH + \xE6\xCA |0 # CJK UNIFIED IDEOGRAPH + \xE6\xCB |0 # CJK UNIFIED IDEOGRAPH + \xCB\xDD |0 # CJK UNIFIED IDEOGRAPH + \xCD\xE3 |0 # CJK UNIFIED IDEOGRAPH + \xCD\xD4 |0 # CJK UNIFIED IDEOGRAPH + \xCF\xB7 |0 # CJK UNIFIED IDEOGRAPH + \xB9\xCD |0 # CJK UNIFIED IDEOGRAPH + \xE6\xCE |0 # CJK UNIFIED IDEOGRAPH + \xBC\xD4 |0 # CJK UNIFIED IDEOGRAPH + \xE6\xCD |0 # CJK UNIFIED IDEOGRAPH + \xE6\xCF |0 # CJK UNIFIED IDEOGRAPH + \xBC\xA9 |0 # CJK UNIFIED IDEOGRAPH + \xC2\xD1 |0 # CJK UNIFIED IDEOGRAPH + \xE6\xD0 |0 # CJK UNIFIED IDEOGRAPH + \xB9\xCC |0 # CJK UNIFIED IDEOGRAPH + \xCC\xD7 |0 # CJK UNIFIED IDEOGRAPH + \xE6\xD1 |0 # CJK UNIFIED IDEOGRAPH + \xE6\xD2 |0 # CJK UNIFIED IDEOGRAPH + \xE6\xD3 |0 # CJK UNIFIED IDEOGRAPH + \xE6\xD4 |0 # CJK UNIFIED IDEOGRAPH + \xE6\xD5 |0 # CJK UNIFIED IDEOGRAPH + \xBC\xAA |0 # CJK UNIFIED IDEOGRAPH + \xCC\xED |0 # CJK UNIFIED IDEOGRAPH + \xE6\xD7 |0 # CJK UNIFIED IDEOGRAPH + \xC3\xBF |0 # CJK UNIFIED IDEOGRAPH + \xE6\xD6 |0 # CJK UNIFIED IDEOGRAPH + \xE6\xD9 |0 # CJK UNIFIED IDEOGRAPH + \xE6\xD8 |0 # CJK UNIFIED IDEOGRAPH + \xE6\xDA |0 # CJK UNIFIED IDEOGRAPH + \xC0\xBB |0 # CJK UNIFIED IDEOGRAPH + \xE6\xDB |0 # CJK UNIFIED IDEOGRAPH + \xE6\xDC |0 # CJK UNIFIED IDEOGRAPH + \xCA\xB9 |0 # CJK UNIFIED IDEOGRAPH + \xE6\xDD |0 # CJK UNIFIED IDEOGRAPH + \xC1\xEF |0 # CJK UNIFIED IDEOGRAPH + \xE6\xDE |0 # CJK UNIFIED IDEOGRAPH + \xE6\xDF |0 # CJK UNIFIED IDEOGRAPH + \xCE\xFE |0 # CJK UNIFIED IDEOGRAPH + \xE6\xE2 |0 # CJK UNIFIED IDEOGRAPH + \xE6\xE1 |0 # CJK UNIFIED IDEOGRAPH + \xE6\xE0 |0 # CJK UNIFIED IDEOGRAPH + \xC4\xB0 |0 # CJK UNIFIED IDEOGRAPH + \xE6\xE3 |0 # CJK UNIFIED IDEOGRAPH + \xBF\xA6 |0 # CJK UNIFIED IDEOGRAPH + \xE6\xE4 |0 # CJK UNIFIED IDEOGRAPH + \xE6\xE5 |0 # CJK UNIFIED IDEOGRAPH + \xCF\xB8 |0 # CJK UNIFIED IDEOGRAPH + \xE6\xE6 |0 # CJK UNIFIED IDEOGRAPH + \xE6\xE7 |0 # CJK UNIFIED IDEOGRAPH + \xE6\xE9 |0 # CJK UNIFIED IDEOGRAPH + \xE6\xE8 |0 # CJK UNIFIED IDEOGRAPH + \xC8\xA5 |0 # CJK UNIFIED IDEOGRAPH + \xC6\xF9 |0 # CJK UNIFIED IDEOGRAPH + \xCF\xBE |0 # CJK UNIFIED IDEOGRAPH + \xC8\xA9 |0 # CJK UNIFIED IDEOGRAPH + \xE6\xEB |0 # CJK UNIFIED IDEOGRAPH + \xBE\xD3 |0 # CJK UNIFIED IDEOGRAPH + \xC9\xAA |0 # CJK UNIFIED IDEOGRAPH + \xE6\xEC |0 # CJK UNIFIED IDEOGRAPH + \xE6\xEA |0 # CJK UNIFIED IDEOGRAPH + \xB4\xCE |0 # CJK UNIFIED IDEOGRAPH + \xB8\xD4 |0 # CJK UNIFIED IDEOGRAPH + \xBB\xE8 |0 # CJK UNIFIED IDEOGRAPH + \xC8\xEE |0 # CJK UNIFIED IDEOGRAPH + \xB8\xAA |0 # CJK UNIFIED IDEOGRAPH + \xCB\xC3 |0 # CJK UNIFIED IDEOGRAPH + \xE6\xEF |0 # CJK UNIFIED IDEOGRAPH + \xE6\xED |0 # CJK UNIFIED IDEOGRAPH + \xB9\xCE |0 # CJK UNIFIED IDEOGRAPH + \xB9\xCF |0 # CJK UNIFIED IDEOGRAPH + \xB0\xE9 |0 # CJK UNIFIED IDEOGRAPH + \xBA\xE8 |0 # CJK UNIFIED IDEOGRAPH + \xC7\xD9 |0 # CJK UNIFIED IDEOGRAPH + \xB0\xDF |0 # CJK UNIFIED IDEOGRAPH + \xE6\xF4 |0 # CJK UNIFIED IDEOGRAPH + \xC3\xC0 |0 # CJK UNIFIED IDEOGRAPH + \xC7\xD8 |0 # CJK UNIFIED IDEOGRAPH + \xC2\xDB |0 # CJK UNIFIED IDEOGRAPH + \xE6\xF6 |0 # CJK UNIFIED IDEOGRAPH + \xE6\xF2 |0 # CJK UNIFIED IDEOGRAPH + \xE6\xF5 |0 # CJK UNIFIED IDEOGRAPH + \xE6\xF0 |0 # CJK UNIFIED IDEOGRAPH + \xE6\xF3 |0 # CJK UNIFIED IDEOGRAPH + \xCB\xA6 |0 # CJK UNIFIED IDEOGRAPH + \xB8\xD5 |0 # CJK UNIFIED IDEOGRAPH + \xB0\xFD |0 # CJK UNIFIED IDEOGRAPH + \xE6\xF1 |0 # CJK UNIFIED IDEOGRAPH + \xE6\xF8 |0 # CJK UNIFIED IDEOGRAPH + \xE6\xF9 |0 # CJK UNIFIED IDEOGRAPH + \xC6\xB9 |0 # CJK UNIFIED IDEOGRAPH + \xB6\xBB |0 # CJK UNIFIED IDEOGRAPH + \xE7\xA6 |0 # CJK UNIFIED IDEOGRAPH + \xC7\xBD |0 # CJK UNIFIED IDEOGRAPH + \xBB\xE9 |0 # CJK UNIFIED IDEOGRAPH + \xB6\xBC |0 # CJK UNIFIED IDEOGRAPH + \xC0\xC8 |0 # CJK UNIFIED IDEOGRAPH + \xCF\xC6 |0 # CJK UNIFIED IDEOGRAPH + \xCC\xAE |0 # CJK UNIFIED IDEOGRAPH + \xE6\xF7 |0 # CJK UNIFIED IDEOGRAPH + \xC0\xD4 |0 # CJK UNIFIED IDEOGRAPH + \xB5\xD3 |0 # CJK UNIFIED IDEOGRAPH + \xE6\xFA |0 # CJK UNIFIED IDEOGRAPH + \xE6\xFC |0 # CJK UNIFIED IDEOGRAPH + \xE6\xFB |0 # CJK UNIFIED IDEOGRAPH + \xE6\xFD |0 # CJK UNIFIED IDEOGRAPH + \xC3\xA6 |0 # CJK UNIFIED IDEOGRAPH + \xC7\xBE |0 # CJK UNIFIED IDEOGRAPH + \xC4\xB1 |0 # CJK UNIFIED IDEOGRAPH + \xE7\xA3 |0 # CJK UNIFIED IDEOGRAPH + \xE7\xA2 |0 # CJK UNIFIED IDEOGRAPH + \xE6\xFE |0 # CJK UNIFIED IDEOGRAPH + \xBF\xD5 |0 # CJK UNIFIED IDEOGRAPH + \xC9\xE5 |0 # CJK UNIFIED IDEOGRAPH + \xE7\xA5 |0 # CJK UNIFIED IDEOGRAPH + \xE7\xA4 |0 # CJK UNIFIED IDEOGRAPH + \xB9\xD0 |0 # CJK UNIFIED IDEOGRAPH + \xCF\xD3 |0 # CJK UNIFIED IDEOGRAPH + \xE7\xB5 |0 # CJK UNIFIED IDEOGRAPH + \xE7\xA9 |0 # CJK UNIFIED IDEOGRAPH + \xE7\xAA |0 # CJK UNIFIED IDEOGRAPH + \xBC\xF0 |0 # CJK UNIFIED IDEOGRAPH + \xE7\xA8 |0 # CJK UNIFIED IDEOGRAPH + \xB9\xF8 |0 # CJK UNIFIED IDEOGRAPH + \xE7\xA7 |0 # CJK UNIFIED IDEOGRAPH + \xE7\xAB |0 # CJK UNIFIED IDEOGRAPH + \xC4\xB2 |0 # CJK UNIFIED IDEOGRAPH + \xCA\xA2 |0 # CJK UNIFIED IDEOGRAPH + \xC1\xA3 |0 # CJK UNIFIED IDEOGRAPH + \xC2\xDC |0 # CJK UNIFIED IDEOGRAPH + \xE7\xAF |0 # CJK UNIFIED IDEOGRAPH + \xE7\xB0 |0 # CJK UNIFIED IDEOGRAPH + \xE7\xAC |0 # CJK UNIFIED IDEOGRAPH + \xE7\xAD |0 # CJK UNIFIED IDEOGRAPH + \xE7\xAE |0 # CJK UNIFIED IDEOGRAPH + \xB9\xD1 |0 # CJK UNIFIED IDEOGRAPH + \xE7\xB6 |0 # CJK UNIFIED IDEOGRAPH + \xE7\xB2 |0 # CJK UNIFIED IDEOGRAPH + \xC9\xE6 |0 # CJK UNIFIED IDEOGRAPH + \xCB\xEC |0 # CJK UNIFIED IDEOGRAPH + \xC9\xA8 |0 # CJK UNIFIED IDEOGRAPH + \xE7\xB1 |0 # CJK UNIFIED IDEOGRAPH + \xE7\xB4 |0 # CJK UNIFIED IDEOGRAPH + \xE7\xB3 |0 # CJK UNIFIED IDEOGRAPH + \xCB\xC4 |0 # CJK UNIFIED IDEOGRAPH + \xE7\xB7 |0 # CJK UNIFIED IDEOGRAPH + \xE7\xB8 |0 # CJK UNIFIED IDEOGRAPH + \xC1\xB7 |0 # CJK UNIFIED IDEOGRAPH + \xE7\xB9 |0 # CJK UNIFIED IDEOGRAPH + \xE7\xBB |0 # CJK UNIFIED IDEOGRAPH + \xE7\xBF |0 # CJK UNIFIED IDEOGRAPH + \xE7\xBC |0 # CJK UNIFIED IDEOGRAPH + \xE7\xBA |0 # CJK UNIFIED IDEOGRAPH + \xC7\xBF |0 # CJK UNIFIED IDEOGRAPH + \xE7\xBD |0 # CJK UNIFIED IDEOGRAPH + \xE7\xBE |0 # CJK UNIFIED IDEOGRAPH + \xB2\xB2 |0 # CJK UNIFIED IDEOGRAPH + \xE7\xC5 |0 # CJK UNIFIED IDEOGRAPH + \xE7\xC0 |0 # CJK UNIFIED IDEOGRAPH + \xE7\xC1 |0 # CJK UNIFIED IDEOGRAPH + \xE7\xC2 |0 # CJK UNIFIED IDEOGRAPH + \xC2\xA1 |0 # CJK UNIFIED IDEOGRAPH + \xE7\xC4 |0 # CJK UNIFIED IDEOGRAPH + \xE7\xC3 |0 # CJK UNIFIED IDEOGRAPH + \xE7\xC6 |0 # CJK UNIFIED IDEOGRAPH + \xE7\xC7 |0 # CJK UNIFIED IDEOGRAPH + \xE7\xC8 |0 # CJK UNIFIED IDEOGRAPH + \xBF\xC3 |0 # CJK UNIFIED IDEOGRAPH + \xB2\xE9 |0 # CJK UNIFIED IDEOGRAPH + \xE7\xC9 |0 # CJK UNIFIED IDEOGRAPH + \xCE\xD7 |0 # CJK UNIFIED IDEOGRAPH + \xBC\xAB |0 # CJK UNIFIED IDEOGRAPH + \xBD\xAD |0 # CJK UNIFIED IDEOGRAPH + \xBB\xEA |0 # CJK UNIFIED IDEOGRAPH + \xC3\xD7 |0 # CJK UNIFIED IDEOGRAPH + \xE7\xCA |0 # CJK UNIFIED IDEOGRAPH + \xE7\xCB |0 # CJK UNIFIED IDEOGRAPH + \xB1\xB1 |0 # CJK UNIFIED IDEOGRAPH + \xE7\xCC |0 # CJK UNIFIED IDEOGRAPH + \xE7\xCD |0 # CJK UNIFIED IDEOGRAPH + \xE7\xCE |0 # CJK UNIFIED IDEOGRAPH + \xE7\xCF |0 # CJK UNIFIED IDEOGRAPH + \xE7\xD0 |0 # CJK UNIFIED IDEOGRAPH + \xB6\xBD |0 # CJK UNIFIED IDEOGRAPH + \xDA\xAA |0 # CJK UNIFIED IDEOGRAPH + \xE7\xD1 |0 # CJK UNIFIED IDEOGRAPH + \xC0\xE5 |0 # CJK UNIFIED IDEOGRAPH + \xE7\xD2 |0 # CJK UNIFIED IDEOGRAPH + \xBC\xCB |0 # CJK UNIFIED IDEOGRAPH + \xE7\xD3 |0 # CJK UNIFIED IDEOGRAPH + \xD0\xB0 |0 # CJK UNIFIED IDEOGRAPH + \xE7\xD4 |0 # CJK UNIFIED IDEOGRAPH + \xCA\xDE |0 # CJK UNIFIED IDEOGRAPH + \xB4\xDC |0 # CJK UNIFIED IDEOGRAPH + \xC1\xA4 |0 # CJK UNIFIED IDEOGRAPH + \xBD\xD8 |0 # CJK UNIFIED IDEOGRAPH + \xC9\xF1 |0 # CJK UNIFIED IDEOGRAPH + \xBD\xAE |0 # CJK UNIFIED IDEOGRAPH + \xE7\xD5 |0 # CJK UNIFIED IDEOGRAPH + \xB9\xD2 |0 # CJK UNIFIED IDEOGRAPH + \xE7\xD6 |0 # CJK UNIFIED IDEOGRAPH + \xC8\xCC |0 # CJK UNIFIED IDEOGRAPH + \xE7\xE4 |0 # CJK UNIFIED IDEOGRAPH + \xE7\xD8 |0 # CJK UNIFIED IDEOGRAPH + \xC2\xC9 |0 # CJK UNIFIED IDEOGRAPH + \xC7\xF5 |0 # CJK UNIFIED IDEOGRAPH + \xB8\xBF |0 # CJK UNIFIED IDEOGRAPH + \xE7\xD7 |0 # CJK UNIFIED IDEOGRAPH + \xC1\xA5 |0 # CJK UNIFIED IDEOGRAPH + \xE7\xD9 |0 # CJK UNIFIED IDEOGRAPH + \xC4\xFA |0 # CJK UNIFIED IDEOGRAPH + \xE7\xDB |0 # CJK UNIFIED IDEOGRAPH + \xE7\xDA |0 # CJK UNIFIED IDEOGRAPH + \xE7\xDD |0 # CJK UNIFIED IDEOGRAPH + \xE7\xDC |0 # CJK UNIFIED IDEOGRAPH + \xE7\xDE |0 # CJK UNIFIED IDEOGRAPH + \xE7\xE0 |0 # CJK UNIFIED IDEOGRAPH + \xE7\xDF |0 # CJK UNIFIED IDEOGRAPH + \xB4\xCF |0 # CJK UNIFIED IDEOGRAPH + \xE7\xE1 |0 # CJK UNIFIED IDEOGRAPH + \xE7\xE2 |0 # CJK UNIFIED IDEOGRAPH + \xE7\xE3 |0 # CJK UNIFIED IDEOGRAPH + \xBA\xB1 |0 # CJK UNIFIED IDEOGRAPH + \xCE\xC9 |0 # CJK UNIFIED IDEOGRAPH + \xE7\xE5 |0 # CJK UNIFIED IDEOGRAPH + \xBF\xA7 |0 # CJK UNIFIED IDEOGRAPH + \xB1\xF0 |0 # CJK UNIFIED IDEOGRAPH + \xE7\xE6 |0 # CJK UNIFIED IDEOGRAPH + \xE7\xE7 |0 # CJK UNIFIED IDEOGRAPH + \xE7\xE8 |0 # CJK UNIFIED IDEOGRAPH + \xB0\xF2 |0 # CJK UNIFIED IDEOGRAPH + \xE7\xE9 |0 # CJK UNIFIED IDEOGRAPH + \xE7\xEA |0 # CJK UNIFIED IDEOGRAPH + \xC9\xE7 |0 # CJK UNIFIED IDEOGRAPH + \xBC\xC7 |0 # CJK UNIFIED IDEOGRAPH + \xE7\xEC |0 # CJK UNIFIED IDEOGRAPH + \xB3\xA9 |0 # CJK UNIFIED IDEOGRAPH + \xB0\xB2 |0 # CJK UNIFIED IDEOGRAPH + \xE7\xEB |0 # CJK UNIFIED IDEOGRAPH + \xE7\xEE |0 # CJK UNIFIED IDEOGRAPH + \xC7\xCE |0 # CJK UNIFIED IDEOGRAPH + \xBF\xC4 |0 # CJK UNIFIED IDEOGRAPH + \xB2\xD6 |0 # CJK UNIFIED IDEOGRAPH + \xCB\xA7 |0 # CJK UNIFIED IDEOGRAPH + \xB7\xDD |0 # CJK UNIFIED IDEOGRAPH + \xB6\xDC |0 # CJK UNIFIED IDEOGRAPH + \xE7\xED |0 # CJK UNIFIED IDEOGRAPH + \xB2\xEA |0 # CJK UNIFIED IDEOGRAPH + \xB4\xA3 |0 # CJK UNIFIED IDEOGRAPH + \xB1\xF1 |0 # CJK UNIFIED IDEOGRAPH + \xE7\xF2 |0 # CJK UNIFIED IDEOGRAPH + \xCE\xEA |0 # CJK UNIFIED IDEOGRAPH + \xC2\xDD |0 # CJK UNIFIED IDEOGRAPH + \xC9\xC4 |0 # CJK UNIFIED IDEOGRAPH + \xE7\xFE |0 # CJK UNIFIED IDEOGRAPH + \xB2\xD7 |0 # CJK UNIFIED IDEOGRAPH + \xE7\xFC |0 # CJK UNIFIED IDEOGRAPH + \xE7\xFA |0 # CJK UNIFIED IDEOGRAPH + \xE7\xF1 |0 # CJK UNIFIED IDEOGRAPH + \xE7\xEF |0 # CJK UNIFIED IDEOGRAPH + \xE7\xF0 |0 # CJK UNIFIED IDEOGRAPH + \xBC\xE3 |0 # CJK UNIFIED IDEOGRAPH + \xB6\xEC |0 # CJK UNIFIED IDEOGRAPH + \xC3\xF7 |0 # CJK UNIFIED IDEOGRAPH + \xC6\xD1 |0 # CJK UNIFIED IDEOGRAPH + \xB1\xD1 |0 # CJK UNIFIED IDEOGRAPH + \xE7\xF4 |0 # CJK UNIFIED IDEOGRAPH + \xE7\xF3 |0 # CJK UNIFIED IDEOGRAPH + \xE7\xF9 |0 # CJK UNIFIED IDEOGRAPH + \xE7\xF5 |0 # CJK UNIFIED IDEOGRAPH + \xE7\xF8 |0 # CJK UNIFIED IDEOGRAPH + \xFB\xD7 |0 # CJK UNIFIED IDEOGRAPH + \xCC\xD0 |0 # CJK UNIFIED IDEOGRAPH + \xE7\xF7 |0 # CJK UNIFIED IDEOGRAPH + \xB2\xD8 |0 # CJK UNIFIED IDEOGRAPH + \xB3\xFD |0 # CJK UNIFIED IDEOGRAPH + \xE7\xFB |0 # CJK UNIFIED IDEOGRAPH + \xE7\xFD |0 # CJK UNIFIED IDEOGRAPH + \xB7\xD4 |0 # CJK UNIFIED IDEOGRAPH + \xE8\xA3 |0 # CJK UNIFIED IDEOGRAPH + \xE8\xAC |0 # CJK UNIFIED IDEOGRAPH + \xE8\xAD |0 # CJK UNIFIED IDEOGRAPH + \xB0\xAB |0 # CJK UNIFIED IDEOGRAPH + \xE8\xB4 |0 # CJK UNIFIED IDEOGRAPH + \xB0\xF1 |0 # CJK UNIFIED IDEOGRAPH + \xE8\xAB |0 # CJK UNIFIED IDEOGRAPH + \xE8\xAA |0 # CJK UNIFIED IDEOGRAPH + \xE8\xA5 |0 # CJK UNIFIED IDEOGRAPH + \xE8\xA4 |0 # CJK UNIFIED IDEOGRAPH + \xE8\xA2 |0 # CJK UNIFIED IDEOGRAPH + \xE8\xA1 |0 # CJK UNIFIED IDEOGRAPH + \xC3\xE3 |0 # CJK UNIFIED IDEOGRAPH + \xC2\xFB |0 # CJK UNIFIED IDEOGRAPH + \xE8\xA7 |0 # CJK UNIFIED IDEOGRAPH + \xE8\xA6 |0 # CJK UNIFIED IDEOGRAPH + \xE8\xA9 |0 # CJK UNIFIED IDEOGRAPH + \xC1\xF0 |0 # CJK UNIFIED IDEOGRAPH + \xB7\xD5 |0 # CJK UNIFIED IDEOGRAPH + \xB1\xC1 |0 # CJK UNIFIED IDEOGRAPH + \xE8\xA8 |0 # CJK UNIFIED IDEOGRAPH + \xB9\xD3 |0 # CJK UNIFIED IDEOGRAPH + \xC1\xF1 |0 # CJK UNIFIED IDEOGRAPH + \xFB\xD8 |0 # CJK UNIFIED IDEOGRAPH + \xE8\xBA |0 # CJK UNIFIED IDEOGRAPH + \xE8\xBB |0 # CJK UNIFIED IDEOGRAPH + \xB2\xD9 |0 # CJK UNIFIED IDEOGRAPH + \xB2\xAE |0 # CJK UNIFIED IDEOGRAPH + \xE8\xB8 |0 # CJK UNIFIED IDEOGRAPH + \xFB\xD9 |0 # CJK UNIFIED IDEOGRAPH + \xE8\xAE |0 # CJK UNIFIED IDEOGRAPH + \xE8\xB6 |0 # CJK UNIFIED IDEOGRAPH + \xE8\xBD |0 # CJK UNIFIED IDEOGRAPH + \xE8\xB7 |0 # CJK UNIFIED IDEOGRAPH + \xE8\xB5 |0 # CJK UNIFIED IDEOGRAPH + \xE7\xF6 |0 # CJK UNIFIED IDEOGRAPH + \xE8\xB3 |0 # CJK UNIFIED IDEOGRAPH + \xE8\xAF |0 # CJK UNIFIED IDEOGRAPH + \xB4\xD0 |0 # CJK UNIFIED IDEOGRAPH + \xE8\xB1 |0 # CJK UNIFIED IDEOGRAPH + \xE8\xBC |0 # CJK UNIFIED IDEOGRAPH + \xE8\xB2 |0 # CJK UNIFIED IDEOGRAPH + \xE8\xBE |0 # CJK UNIFIED IDEOGRAPH + \xE8\xB0 |0 # CJK UNIFIED IDEOGRAPH + \xC7\xFC |0 # CJK UNIFIED IDEOGRAPH + \xCD\xE9 |0 # CJK UNIFIED IDEOGRAPH + \xE8\xB9 |0 # CJK UNIFIED IDEOGRAPH + \xE8\xCF |0 # CJK UNIFIED IDEOGRAPH + \xE8\xC7 |0 # CJK UNIFIED IDEOGRAPH + \xBF\xFB |0 # CJK UNIFIED IDEOGRAPH + \xFB\xDA |0 # CJK UNIFIED IDEOGRAPH + \xB5\xC6 |0 # CJK UNIFIED IDEOGRAPH + \xB6\xDD |0 # CJK UNIFIED IDEOGRAPH + \xE8\xC2 |0 # CJK UNIFIED IDEOGRAPH + \xB2\xDB |0 # CJK UNIFIED IDEOGRAPH + \xBE\xD4 |0 # CJK UNIFIED IDEOGRAPH + \xE8\xC5 |0 # CJK UNIFIED IDEOGRAPH + \xBA\xDA |0 # CJK UNIFIED IDEOGRAPH + \xC5\xD1 |0 # CJK UNIFIED IDEOGRAPH + \xE8\xCA |0 # CJK UNIFIED IDEOGRAPH + \xCA\xEE |0 # CJK UNIFIED IDEOGRAPH + \xE8\xC1 |0 # CJK UNIFIED IDEOGRAPH + \xB2\xDA |0 # CJK UNIFIED IDEOGRAPH + \xB8\xD6 |0 # CJK UNIFIED IDEOGRAPH + \xC9\xA9 |0 # CJK UNIFIED IDEOGRAPH + \xE8\xCB |0 # CJK UNIFIED IDEOGRAPH + \xE8\xBF |0 # CJK UNIFIED IDEOGRAPH + \xFB\xDB |0 # CJK UNIFIED IDEOGRAPH + \xE8\xC8 |0 # CJK UNIFIED IDEOGRAPH + \xE8\xD2 |0 # CJK UNIFIED IDEOGRAPH + \xE8\xC3 |0 # CJK UNIFIED IDEOGRAPH + \xE8\xC4 |0 # CJK UNIFIED IDEOGRAPH + \xC6\xBA |0 # CJK UNIFIED IDEOGRAPH + \xE8\xC9 |0 # CJK UNIFIED IDEOGRAPH + \xE8\xC6 |0 # CJK UNIFIED IDEOGRAPH + \xCB\xA8 |0 # CJK UNIFIED IDEOGRAPH + \xE8\xCC |0 # CJK UNIFIED IDEOGRAPH + \xB0\xE0 |0 # CJK UNIFIED IDEOGRAPH + \xE8\xC0 |0 # CJK UNIFIED IDEOGRAPH + \xE8\xCE |0 # CJK UNIFIED IDEOGRAPH + \xE8\xCD |0 # CJK UNIFIED IDEOGRAPH + \xC7\xEB |0 # CJK UNIFIED IDEOGRAPH + \xE8\xD4 |0 # CJK UNIFIED IDEOGRAPH + \xE8\xDF |0 # CJK UNIFIED IDEOGRAPH + \xB3\xFE |0 # CJK UNIFIED IDEOGRAPH + \xE8\xE2 |0 # CJK UNIFIED IDEOGRAPH + \xE8\xD0 |0 # CJK UNIFIED IDEOGRAPH + \xE8\xD5 |0 # CJK UNIFIED IDEOGRAPH + \xCD\xEE |0 # CJK UNIFIED IDEOGRAPH + \xE8\xDE |0 # CJK UNIFIED IDEOGRAPH + \xFB\xDC |0 # CJK UNIFIED IDEOGRAPH + \xCD\xD5 |0 # CJK UNIFIED IDEOGRAPH + \xCE\xAA |0 # CJK UNIFIED IDEOGRAPH + \xC3\xF8 |0 # CJK UNIFIED IDEOGRAPH + \xB3\xEB |0 # CJK UNIFIED IDEOGRAPH + \xC9\xF2 |0 # CJK UNIFIED IDEOGRAPH + \xE8\xE4 |0 # CJK UNIFIED IDEOGRAPH + \xC6\xA1 |0 # CJK UNIFIED IDEOGRAPH + \xB0\xB1 |0 # CJK UNIFIED IDEOGRAPH + \xE8\xDD |0 # CJK UNIFIED IDEOGRAPH + \xE8\xD9 |0 # CJK UNIFIED IDEOGRAPH + \xC1\xF2 |0 # CJK UNIFIED IDEOGRAPH + \xE8\xD3 |0 # CJK UNIFIED IDEOGRAPH + \xE8\xDB |0 # CJK UNIFIED IDEOGRAPH + \xE8\xE0 |0 # CJK UNIFIED IDEOGRAPH + \xC7\xAC |0 # CJK UNIFIED IDEOGRAPH + \xB0\xAA |0 # CJK UNIFIED IDEOGRAPH + \xE8\xD8 |0 # CJK UNIFIED IDEOGRAPH + \xE8\xE1 |0 # CJK UNIFIED IDEOGRAPH + \xC9\xF8 |0 # CJK UNIFIED IDEOGRAPH + \xE8\xDC |0 # CJK UNIFIED IDEOGRAPH + \xE8\xD7 |0 # CJK UNIFIED IDEOGRAPH + \xBE\xD5 |0 # CJK UNIFIED IDEOGRAPH + \xBD\xAF |0 # CJK UNIFIED IDEOGRAPH + \xBC\xAC |0 # CJK UNIFIED IDEOGRAPH + \xCC\xD8 |0 # CJK UNIFIED IDEOGRAPH + \xC9\xC7 |0 # CJK UNIFIED IDEOGRAPH + \xE8\xE7 |0 # CJK UNIFIED IDEOGRAPH + \xE8\xF0 |0 # CJK UNIFIED IDEOGRAPH + \xE8\xDA |0 # CJK UNIFIED IDEOGRAPH + \xB3\xF7 |0 # CJK UNIFIED IDEOGRAPH + \xFB\xDD |0 # CJK UNIFIED IDEOGRAPH + \xBE\xF8 |0 # CJK UNIFIED IDEOGRAPH + \xE8\xE5 |0 # CJK UNIFIED IDEOGRAPH + \xE8\xEA |0 # CJK UNIFIED IDEOGRAPH + \xC1\xF3 |0 # CJK UNIFIED IDEOGRAPH + \xE8\xE6 |0 # CJK UNIFIED IDEOGRAPH + \xE8\xED |0 # CJK UNIFIED IDEOGRAPH + \xC3\xDF |0 # CJK UNIFIED IDEOGRAPH + \xE8\xEE |0 # CJK UNIFIED IDEOGRAPH + \xCD\xD6 |0 # CJK UNIFIED IDEOGRAPH + \xE8\xE3 |0 # CJK UNIFIED IDEOGRAPH + \xB3\xB8 |0 # CJK UNIFIED IDEOGRAPH + \xE8\xE9 |0 # CJK UNIFIED IDEOGRAPH + \xE8\xEC |0 # CJK UNIFIED IDEOGRAPH + \xCC\xAC |0 # CJK UNIFIED IDEOGRAPH + \xE8\xEF |0 # CJK UNIFIED IDEOGRAPH + \xE8\xE8 |0 # CJK UNIFIED IDEOGRAPH + \xE8\xEB |0 # CJK UNIFIED IDEOGRAPH + \xF9\xA5 |0 # CJK UNIFIED IDEOGRAPH + \xCB\xA9 |0 # CJK UNIFIED IDEOGRAPH + \xCF\xA1 |0 # CJK UNIFIED IDEOGRAPH + \xE8\xF3 |0 # CJK UNIFIED IDEOGRAPH + \xE8\xFA |0 # CJK UNIFIED IDEOGRAPH + \xE8\xF2 |0 # CJK UNIFIED IDEOGRAPH + \xBC\xC3 |0 # CJK UNIFIED IDEOGRAPH + \xE8\xD1 |0 # CJK UNIFIED IDEOGRAPH + \xCA\xCE |0 # CJK UNIFIED IDEOGRAPH + \xCC\xA2 |0 # CJK UNIFIED IDEOGRAPH + \xE8\xF9 |0 # CJK UNIFIED IDEOGRAPH + \xE8\xF8 |0 # CJK UNIFIED IDEOGRAPH + \xE8\xF4 |0 # CJK UNIFIED IDEOGRAPH + \xE8\xF5 |0 # CJK UNIFIED IDEOGRAPH + \xB1\xB6 |0 # CJK UNIFIED IDEOGRAPH + \xE8\xF7 |0 # CJK UNIFIED IDEOGRAPH + \xE8\xF1 |0 # CJK UNIFIED IDEOGRAPH + \xC4\xD5 |0 # CJK UNIFIED IDEOGRAPH + \xE8\xF6 |0 # CJK UNIFIED IDEOGRAPH + \xB0\xFE |0 # CJK UNIFIED IDEOGRAPH + \xC2\xA2 |0 # CJK UNIFIED IDEOGRAPH + \xCA\xC3 |0 # CJK UNIFIED IDEOGRAPH + \xE8\xFB |0 # CJK UNIFIED IDEOGRAPH + \xE9\xA1 |0 # CJK UNIFIED IDEOGRAPH + \xC8\xD9 |0 # CJK UNIFIED IDEOGRAPH + \xE8\xFE |0 # CJK UNIFIED IDEOGRAPH + \xBE\xD6 |0 # CJK UNIFIED IDEOGRAPH + \xBC\xC9 |0 # CJK UNIFIED IDEOGRAPH + \xE9\xA3 |0 # CJK UNIFIED IDEOGRAPH + \xB6\xBE |0 # CJK UNIFIED IDEOGRAPH + \xFB\xDE |0 # CJK UNIFIED IDEOGRAPH + \xE9\xA4 |0 # CJK UNIFIED IDEOGRAPH + \xC9\xF9 |0 # CJK UNIFIED IDEOGRAPH + \xE8\xFD |0 # CJK UNIFIED IDEOGRAPH + \xFB\xDF |0 # CJK UNIFIED IDEOGRAPH + \xE8\xD6 |0 # CJK UNIFIED IDEOGRAPH + \xE8\xFC |0 # CJK UNIFIED IDEOGRAPH + \xCF\xCF |0 # CJK UNIFIED IDEOGRAPH + \xC6\xA2 |0 # CJK UNIFIED IDEOGRAPH + \xC9\xF3 |0 # CJK UNIFIED IDEOGRAPH + \xFB\xE0 |0 # CJK UNIFIED IDEOGRAPH + \xE9\xAB |0 # CJK UNIFIED IDEOGRAPH + \xE9\xB1 |0 # CJK UNIFIED IDEOGRAPH + \xE9\xB2 |0 # CJK UNIFIED IDEOGRAPH + \xE9\xA5 |0 # CJK UNIFIED IDEOGRAPH + \xC7\xF6 |0 # CJK UNIFIED IDEOGRAPH + \xE9\xAF |0 # CJK UNIFIED IDEOGRAPH + \xE9\xA7 |0 # CJK UNIFIED IDEOGRAPH + \xE9\xA9 |0 # CJK UNIFIED IDEOGRAPH + \xE9\xB3 |0 # CJK UNIFIED IDEOGRAPH + \xE9\xA8 |0 # CJK UNIFIED IDEOGRAPH + \xE9\xAC |0 # CJK UNIFIED IDEOGRAPH + \xB1\xF2 |0 # CJK UNIFIED IDEOGRAPH + \xC6\xE5 |0 # CJK UNIFIED IDEOGRAPH + \xE9\xAD |0 # CJK UNIFIED IDEOGRAPH + \xE9\xB0 |0 # CJK UNIFIED IDEOGRAPH + \xE9\xA6 |0 # CJK UNIFIED IDEOGRAPH + \xC1\xA6 |0 # CJK UNIFIED IDEOGRAPH + \xE9\xAA |0 # CJK UNIFIED IDEOGRAPH + \xBB\xA7 |0 # CJK UNIFIED IDEOGRAPH + \xBF\xC5 |0 # CJK UNIFIED IDEOGRAPH + \xB7\xB0 |0 # CJK UNIFIED IDEOGRAPH + \xCC\xF4 |0 # CJK UNIFIED IDEOGRAPH + \xCC\xF9 |0 # CJK UNIFIED IDEOGRAPH + \xBD\xF2 |0 # CJK UNIFIED IDEOGRAPH + \xFB\xE2 |0 # CJK UNIFIED IDEOGRAPH + \xE9\xB7 |0 # CJK UNIFIED IDEOGRAPH + \xE9\xB5 |0 # CJK UNIFIED IDEOGRAPH + \xCF\xCE |0 # CJK UNIFIED IDEOGRAPH + \xE9\xB4 |0 # CJK UNIFIED IDEOGRAPH + \xCD\xF5 |0 # CJK UNIFIED IDEOGRAPH + \xE9\xB6 |0 # CJK UNIFIED IDEOGRAPH + \xE9\xB8 |0 # CJK UNIFIED IDEOGRAPH + \xE9\xB9 |0 # CJK UNIFIED IDEOGRAPH + \xE9\xBC |0 # CJK UNIFIED IDEOGRAPH + \xE9\xBA |0 # CJK UNIFIED IDEOGRAPH + \xC6\xA3 |0 # CJK UNIFIED IDEOGRAPH + \xE9\xBB |0 # CJK UNIFIED IDEOGRAPH + \xC8\xCD |0 # CJK UNIFIED IDEOGRAPH + \xE9\xAE |0 # CJK UNIFIED IDEOGRAPH + \xBD\xF3 |0 # CJK UNIFIED IDEOGRAPH + \xE9\xBD |0 # CJK UNIFIED IDEOGRAPH + \xE9\xC2 |0 # CJK UNIFIED IDEOGRAPH + \xC1\xF4 |0 # CJK UNIFIED IDEOGRAPH + \xE9\xC1 |0 # CJK UNIFIED IDEOGRAPH + \xE9\xA2 |0 # CJK UNIFIED IDEOGRAPH + \xE9\xC3 |0 # CJK UNIFIED IDEOGRAPH + \xC1\xC9 |0 # CJK UNIFIED IDEOGRAPH + \xE9\xBE |0 # CJK UNIFIED IDEOGRAPH + \xE9\xC0 |0 # CJK UNIFIED IDEOGRAPH + \xE9\xBF |0 # CJK UNIFIED IDEOGRAPH + \xDD\xB1 |0 # CJK UNIFIED IDEOGRAPH + \xDD\xA2 |0 # CJK UNIFIED IDEOGRAPH + \xE9\xC5 |0 # CJK UNIFIED IDEOGRAPH + \xE9\xC4 |0 # CJK UNIFIED IDEOGRAPH + \xCD\xF6 |0 # CJK UNIFIED IDEOGRAPH + \xE2\xBC |0 # CJK UNIFIED IDEOGRAPH + \xE9\xC6 |0 # CJK UNIFIED IDEOGRAPH + \xE9\xC7 |0 # CJK UNIFIED IDEOGRAPH + \xE9\xC8 |0 # CJK UNIFIED IDEOGRAPH + \xB8\xD7 |0 # CJK UNIFIED IDEOGRAPH + \xB5\xD4 |0 # CJK UNIFIED IDEOGRAPH + \xE9\xCA |0 # CJK UNIFIED IDEOGRAPH + \xD1\xDD |0 # CJK UNIFIED IDEOGRAPH + \xB5\xF5 |0 # CJK UNIFIED IDEOGRAPH + \xCE\xBA |0 # CJK UNIFIED IDEOGRAPH + \xB6\xF3 |0 # CJK UNIFIED IDEOGRAPH + \xE9\xCB |0 # CJK UNIFIED IDEOGRAPH + \xE9\xCC |0 # CJK UNIFIED IDEOGRAPH + \xC3\xEE |0 # CJK UNIFIED IDEOGRAPH + \xE9\xCD |0 # CJK UNIFIED IDEOGRAPH + \xC6\xFA |0 # CJK UNIFIED IDEOGRAPH + \xB0\xBA |0 # CJK UNIFIED IDEOGRAPH + \xB2\xE3 |0 # CJK UNIFIED IDEOGRAPH + \xE9\xD2 |0 # CJK UNIFIED IDEOGRAPH + \xE9\xD3 |0 # CJK UNIFIED IDEOGRAPH + \xE9\xCE |0 # CJK UNIFIED IDEOGRAPH + \xBB\xBD |0 # CJK UNIFIED IDEOGRAPH + \xE9\xCF |0 # CJK UNIFIED IDEOGRAPH + \xC7\xC2 |0 # CJK UNIFIED IDEOGRAPH + \xE9\xD0 |0 # CJK UNIFIED IDEOGRAPH + \xE9\xD1 |0 # CJK UNIFIED IDEOGRAPH + \xE9\xDB |0 # CJK UNIFIED IDEOGRAPH + \xE9\xD5 |0 # CJK UNIFIED IDEOGRAPH + \xE9\xD8 |0 # CJK UNIFIED IDEOGRAPH + \xE9\xD4 |0 # CJK UNIFIED IDEOGRAPH + \xE9\xD6 |0 # CJK UNIFIED IDEOGRAPH + \xE9\xD7 |0 # CJK UNIFIED IDEOGRAPH + \xBC\xD8 |0 # CJK UNIFIED IDEOGRAPH + \xE9\xD9 |0 # CJK UNIFIED IDEOGRAPH + \xC3\xC1 |0 # CJK UNIFIED IDEOGRAPH + \xB7\xD6 |0 # CJK UNIFIED IDEOGRAPH + \xB3\xC2 |0 # CJK UNIFIED IDEOGRAPH + \xE9\xDC |0 # CJK UNIFIED IDEOGRAPH + \xB3\xBF |0 # CJK UNIFIED IDEOGRAPH + \xE9\xE1 |0 # CJK UNIFIED IDEOGRAPH + \xE9\xDD |0 # CJK UNIFIED IDEOGRAPH + \xE9\xE0 |0 # CJK UNIFIED IDEOGRAPH + \xC8\xBA |0 # CJK UNIFIED IDEOGRAPH + \xE9\xDE |0 # CJK UNIFIED IDEOGRAPH + \xE9\xDF |0 # CJK UNIFIED IDEOGRAPH + \xC9\xC8 |0 # CJK UNIFIED IDEOGRAPH + \xC8\xDA |0 # CJK UNIFIED IDEOGRAPH + \xE9\xE2 |0 # CJK UNIFIED IDEOGRAPH + \xC2\xFD |0 # CJK UNIFIED IDEOGRAPH + \xE9\xEC |0 # CJK UNIFIED IDEOGRAPH + \xE9\xE8 |0 # CJK UNIFIED IDEOGRAPH + \xB2\xEB |0 # CJK UNIFIED IDEOGRAPH + \xE9\xE6 |0 # CJK UNIFIED IDEOGRAPH + \xCB\xAA |0 # CJK UNIFIED IDEOGRAPH + \xE9\xE7 |0 # CJK UNIFIED IDEOGRAPH + \xE9\xE4 |0 # CJK UNIFIED IDEOGRAPH + \xE9\xE5 |0 # CJK UNIFIED IDEOGRAPH + \xE9\xEA |0 # CJK UNIFIED IDEOGRAPH + \xE9\xED |0 # CJK UNIFIED IDEOGRAPH + \xE9\xEB |0 # CJK UNIFIED IDEOGRAPH + \xE9\xE9 |0 # CJK UNIFIED IDEOGRAPH + \xE9\xE3 |0 # CJK UNIFIED IDEOGRAPH + \xC3\xD8 |0 # CJK UNIFIED IDEOGRAPH + \xE9\xF4 |0 # CJK UNIFIED IDEOGRAPH + \xCC\xAA |0 # CJK UNIFIED IDEOGRAPH + \xE9\xF2 |0 # CJK UNIFIED IDEOGRAPH + \xE9\xF3 |0 # CJK UNIFIED IDEOGRAPH + \xE9\xEE |0 # CJK UNIFIED IDEOGRAPH + \xE9\xF0 |0 # CJK UNIFIED IDEOGRAPH + \xE9\xF1 |0 # CJK UNIFIED IDEOGRAPH + \xE9\xEF |0 # CJK UNIFIED IDEOGRAPH + \xC0\xE6 |0 # CJK UNIFIED IDEOGRAPH + \xCF\xB9 |0 # CJK UNIFIED IDEOGRAPH + \xE9\xF8 |0 # CJK UNIFIED IDEOGRAPH + \xE9\xF9 |0 # CJK UNIFIED IDEOGRAPH + \xEA\xA1 |0 # CJK UNIFIED IDEOGRAPH + \xBF\xAA |0 # CJK UNIFIED IDEOGRAPH + \xE9\xFB |0 # CJK UNIFIED IDEOGRAPH + \xE9\xFE |0 # CJK UNIFIED IDEOGRAPH + \xE9\xF6 |0 # CJK UNIFIED IDEOGRAPH + \xE9\xF5 |0 # CJK UNIFIED IDEOGRAPH + \xEA\xA2 |0 # CJK UNIFIED IDEOGRAPH + \xB2\xDC |0 # CJK UNIFIED IDEOGRAPH + \xE9\xFC |0 # CJK UNIFIED IDEOGRAPH + \xEA\xA3 |0 # CJK UNIFIED IDEOGRAPH + \xE9\xFD |0 # CJK UNIFIED IDEOGRAPH + \xE9\xFA |0 # CJK UNIFIED IDEOGRAPH + \xC4\xB3 |0 # CJK UNIFIED IDEOGRAPH + \xE9\xF7 |0 # CJK UNIFIED IDEOGRAPH + \xC7\xE8 |0 # CJK UNIFIED IDEOGRAPH + \xEA\xA7 |0 # CJK UNIFIED IDEOGRAPH + \xCD\xBB |0 # CJK UNIFIED IDEOGRAPH + \xEA\xA6 |0 # CJK UNIFIED IDEOGRAPH + \xEA\xA5 |0 # CJK UNIFIED IDEOGRAPH + \xEA\xAE |0 # CJK UNIFIED IDEOGRAPH + \xEA\xA8 |0 # CJK UNIFIED IDEOGRAPH + \xEA\xB0 |0 # CJK UNIFIED IDEOGRAPH + \xCD\xE6 |0 # CJK UNIFIED IDEOGRAPH + \xEA\xB3 |0 # CJK UNIFIED IDEOGRAPH + \xEA\xAA |0 # CJK UNIFIED IDEOGRAPH + \xEA\xAB |0 # CJK UNIFIED IDEOGRAPH + \xEA\xAF |0 # CJK UNIFIED IDEOGRAPH + \xEA\xB2 |0 # CJK UNIFIED IDEOGRAPH + \xEA\xB1 |0 # CJK UNIFIED IDEOGRAPH + \xEA\xA9 |0 # CJK UNIFIED IDEOGRAPH + \xEA\xAC |0 # CJK UNIFIED IDEOGRAPH + \xEA\xBD |0 # CJK UNIFIED IDEOGRAPH + \xEA\xB6 |0 # CJK UNIFIED IDEOGRAPH + \xEA\xB4 |0 # CJK UNIFIED IDEOGRAPH + \xEA\xB5 |0 # CJK UNIFIED IDEOGRAPH + \xEA\xBA |0 # CJK UNIFIED IDEOGRAPH + \xEA\xBB |0 # CJK UNIFIED IDEOGRAPH + \xB3\xAA |0 # CJK UNIFIED IDEOGRAPH + \xB5\xC2 |0 # CJK UNIFIED IDEOGRAPH + \xEA\xB9 |0 # CJK UNIFIED IDEOGRAPH + \xEA\xA4 |0 # CJK UNIFIED IDEOGRAPH + \xFB\xE5 |0 # CJK UNIFIED IDEOGRAPH + \xEA\xB8 |0 # CJK UNIFIED IDEOGRAPH + \xEA\xBC |0 # CJK UNIFIED IDEOGRAPH + \xEA\xB7 |0 # CJK UNIFIED IDEOGRAPH + \xEA\xBE |0 # CJK UNIFIED IDEOGRAPH + \xEA\xC0 |0 # CJK UNIFIED IDEOGRAPH + \xEA\xBF |0 # CJK UNIFIED IDEOGRAPH + \xEA\xC2 |0 # CJK UNIFIED IDEOGRAPH + \xEA\xC1 |0 # CJK UNIFIED IDEOGRAPH + \xE9\xDA |0 # CJK UNIFIED IDEOGRAPH + \xEA\xC6 |0 # CJK UNIFIED IDEOGRAPH + \xEA\xC3 |0 # CJK UNIFIED IDEOGRAPH + \xEA\xC4 |0 # CJK UNIFIED IDEOGRAPH + \xEA\xC5 |0 # CJK UNIFIED IDEOGRAPH + \xEA\xC7 |0 # CJK UNIFIED IDEOGRAPH + \xB7\xEC |0 # CJK UNIFIED IDEOGRAPH + \xEA\xC9 |0 # CJK UNIFIED IDEOGRAPH + \xEA\xC8 |0 # CJK UNIFIED IDEOGRAPH + \xBD\xB0 |0 # CJK UNIFIED IDEOGRAPH + \xB9\xD4 |0 # CJK UNIFIED IDEOGRAPH + \xDE\xA7 |0 # CJK UNIFIED IDEOGRAPH + \xEA\xCA |0 # CJK UNIFIED IDEOGRAPH + \xBD\xD1 |0 # CJK UNIFIED IDEOGRAPH + \xB3\xB9 |0 # CJK UNIFIED IDEOGRAPH + \xEA\xCB |0 # CJK UNIFIED IDEOGRAPH + \xB1\xD2 |0 # CJK UNIFIED IDEOGRAPH + \xBE\xD7 |0 # CJK UNIFIED IDEOGRAPH + \xEA\xCC |0 # CJK UNIFIED IDEOGRAPH + \xB9\xD5 |0 # CJK UNIFIED IDEOGRAPH + \xEA\xCD |0 # CJK UNIFIED IDEOGRAPH + \xB0\xE1 |0 # CJK UNIFIED IDEOGRAPH + \xC9\xBD |0 # CJK UNIFIED IDEOGRAPH + \xEA\xCE |0 # CJK UNIFIED IDEOGRAPH + \xBF\xEA |0 # CJK UNIFIED IDEOGRAPH + \xEA\xD5 |0 # CJK UNIFIED IDEOGRAPH + \xEA\xD2 |0 # CJK UNIFIED IDEOGRAPH + \xC3\xEF |0 # CJK UNIFIED IDEOGRAPH + \xEA\xD3 |0 # CJK UNIFIED IDEOGRAPH + \xEA\xD0 |0 # CJK UNIFIED IDEOGRAPH + \xB6\xDE |0 # CJK UNIFIED IDEOGRAPH + \xEA\xCF |0 # CJK UNIFIED IDEOGRAPH + \xEA\xD6 |0 # CJK UNIFIED IDEOGRAPH + \xB7\xB6 |0 # CJK UNIFIED IDEOGRAPH + \xC2\xDE |0 # CJK UNIFIED IDEOGRAPH + \xEA\xDC |0 # CJK UNIFIED IDEOGRAPH + \xEA\xD8 |0 # CJK UNIFIED IDEOGRAPH + \xC2\xB5 |0 # CJK UNIFIED IDEOGRAPH + \xEA\xD7 |0 # CJK UNIFIED IDEOGRAPH + \xEA\xDA |0 # CJK UNIFIED IDEOGRAPH + \xEA\xD1 |0 # CJK UNIFIED IDEOGRAPH + \xEA\xDB |0 # CJK UNIFIED IDEOGRAPH + \xEA\xDD |0 # CJK UNIFIED IDEOGRAPH + \xC8\xEF |0 # CJK UNIFIED IDEOGRAPH + \xEA\xD9 |0 # CJK UNIFIED IDEOGRAPH + \xEA\xDE |0 # CJK UNIFIED IDEOGRAPH + \xEA\xE0 |0 # CJK UNIFIED IDEOGRAPH + \xB8\xD3 |0 # CJK UNIFIED IDEOGRAPH + \xEA\xD4 |0 # CJK UNIFIED IDEOGRAPH + \xB0\xC1 |0 # CJK UNIFIED IDEOGRAPH + \xEA\xDF |0 # CJK UNIFIED IDEOGRAPH + \xBA\xDB |0 # CJK UNIFIED IDEOGRAPH + \xCE\xF6 |0 # CJK UNIFIED IDEOGRAPH + \xEA\xE1 |0 # CJK UNIFIED IDEOGRAPH + \xEA\xE2 |0 # CJK UNIFIED IDEOGRAPH + \xC1\xF5 |0 # CJK UNIFIED IDEOGRAPH + \xCE\xA2 |0 # CJK UNIFIED IDEOGRAPH + \xEA\xE3 |0 # CJK UNIFIED IDEOGRAPH + \xCD\xB5 |0 # CJK UNIFIED IDEOGRAPH + \xEA\xE4 |0 # CJK UNIFIED IDEOGRAPH + \xEA\xE5 |0 # CJK UNIFIED IDEOGRAPH + \xCA\xE4 |0 # CJK UNIFIED IDEOGRAPH + \xEA\xE6 |0 # CJK UNIFIED IDEOGRAPH + \xBA\xC0 |0 # CJK UNIFIED IDEOGRAPH + \xCE\xA3 |0 # CJK UNIFIED IDEOGRAPH + \xEA\xEB |0 # CJK UNIFIED IDEOGRAPH + \xEA\xEC |0 # CJK UNIFIED IDEOGRAPH + \xBE\xD8 |0 # CJK UNIFIED IDEOGRAPH + \xEA\xEA |0 # CJK UNIFIED IDEOGRAPH + \xFB\xE6 |0 # CJK UNIFIED IDEOGRAPH + \xCD\xE7 |0 # CJK UNIFIED IDEOGRAPH + \xEA\xE7 |0 # CJK UNIFIED IDEOGRAPH + \xEA\xE9 |0 # CJK UNIFIED IDEOGRAPH + \xC0\xBD |0 # CJK UNIFIED IDEOGRAPH + \xBF\xFE |0 # CJK UNIFIED IDEOGRAPH + \xEA\xE8 |0 # CJK UNIFIED IDEOGRAPH + \xEA\xED |0 # CJK UNIFIED IDEOGRAPH + \xCA\xA3 |0 # CJK UNIFIED IDEOGRAPH + \xEA\xEF |0 # CJK UNIFIED IDEOGRAPH + \xEA\xEE |0 # CJK UNIFIED IDEOGRAPH + \xB3\xEC |0 # CJK UNIFIED IDEOGRAPH + \xCB\xAB |0 # CJK UNIFIED IDEOGRAPH + \xEA\xF0 |0 # CJK UNIFIED IDEOGRAPH + \xF9\xA2 |0 # CJK UNIFIED IDEOGRAPH + \xEA\xFC |0 # CJK UNIFIED IDEOGRAPH + \xEA\xF2 |0 # CJK UNIFIED IDEOGRAPH + \xEA\xF3 |0 # CJK UNIFIED IDEOGRAPH + \xEA\xF4 |0 # CJK UNIFIED IDEOGRAPH + \xEA\xF5 |0 # CJK UNIFIED IDEOGRAPH + \xEA\xF9 |0 # CJK UNIFIED IDEOGRAPH + \xEA\xFA |0 # CJK UNIFIED IDEOGRAPH + \xEA\xF8 |0 # CJK UNIFIED IDEOGRAPH + \xEA\xF6 |0 # CJK UNIFIED IDEOGRAPH + \xEA\xF1 |0 # CJK UNIFIED IDEOGRAPH + \xEA\xF7 |0 # CJK UNIFIED IDEOGRAPH + \xEA\xFB |0 # CJK UNIFIED IDEOGRAPH + \xF0\xB7 |0 # CJK UNIFIED IDEOGRAPH + \xB2\xA8 |0 # CJK UNIFIED IDEOGRAPH + \xEA\xFE |0 # CJK UNIFIED IDEOGRAPH + \xB6\xDF |0 # CJK UNIFIED IDEOGRAPH + \xEA\xFD |0 # CJK UNIFIED IDEOGRAPH + \xEB\xA2 |0 # CJK UNIFIED IDEOGRAPH + \xEB\xA1 |0 # CJK UNIFIED IDEOGRAPH + \xEB\xA4 |0 # CJK UNIFIED IDEOGRAPH + \xEB\xA3 |0 # CJK UNIFIED IDEOGRAPH + \xEB\xA5 |0 # CJK UNIFIED IDEOGRAPH + \xBD\xB1 |0 # CJK UNIFIED IDEOGRAPH + \xEB\xA6 |0 # CJK UNIFIED IDEOGRAPH + \xEB\xA7 |0 # CJK UNIFIED IDEOGRAPH + \xEB\xA8 |0 # CJK UNIFIED IDEOGRAPH + \xC0\xBE |0 # CJK UNIFIED IDEOGRAPH + \xCD\xD7 |0 # CJK UNIFIED IDEOGRAPH + \xEB\xA9 |0 # CJK UNIFIED IDEOGRAPH + \xCA\xA4 |0 # CJK UNIFIED IDEOGRAPH + \xC7\xC6 |0 # CJK UNIFIED IDEOGRAPH + \xEB\xAA |0 # CJK UNIFIED IDEOGRAPH + \xEB\xAB |0 # CJK UNIFIED IDEOGRAPH + \xB8\xAB |0 # CJK UNIFIED IDEOGRAPH + \xB5\xAC |0 # CJK UNIFIED IDEOGRAPH + \xEB\xAC |0 # CJK UNIFIED IDEOGRAPH + \xBB\xEB |0 # CJK UNIFIED IDEOGRAPH + \xC7\xC1 |0 # CJK UNIFIED IDEOGRAPH + \xEB\xAD |0 # CJK UNIFIED IDEOGRAPH + \xB3\xD0 |0 # CJK UNIFIED IDEOGRAPH + \xEB\xAE |0 # CJK UNIFIED IDEOGRAPH + \xEB\xB0 |0 # CJK UNIFIED IDEOGRAPH + \xCD\xF7 |0 # CJK UNIFIED IDEOGRAPH + \xEB\xAF |0 # CJK UNIFIED IDEOGRAPH + \xBF\xC6 |0 # CJK UNIFIED IDEOGRAPH + \xEB\xB1 |0 # CJK UNIFIED IDEOGRAPH + \xEB\xB2 |0 # CJK UNIFIED IDEOGRAPH + \xEB\xB3 |0 # CJK UNIFIED IDEOGRAPH + \xB4\xD1 |0 # CJK UNIFIED IDEOGRAPH + \xEB\xB4 |0 # CJK UNIFIED IDEOGRAPH + \xEB\xB5 |0 # CJK UNIFIED IDEOGRAPH + \xEB\xB6 |0 # CJK UNIFIED IDEOGRAPH + \xEB\xB7 |0 # CJK UNIFIED IDEOGRAPH + \xB3\xD1 |0 # CJK UNIFIED IDEOGRAPH + \xEB\xB8 |0 # CJK UNIFIED IDEOGRAPH + \xEB\xB9 |0 # CJK UNIFIED IDEOGRAPH + \xEB\xBA |0 # CJK UNIFIED IDEOGRAPH + \xB2\xF2 |0 # CJK UNIFIED IDEOGRAPH + \xBF\xA8 |0 # CJK UNIFIED IDEOGRAPH + \xEB\xBB |0 # CJK UNIFIED IDEOGRAPH + \xEB\xBC |0 # CJK UNIFIED IDEOGRAPH + \xEB\xBD |0 # CJK UNIFIED IDEOGRAPH + \xB8\xC0 |0 # CJK UNIFIED IDEOGRAPH + \xC4\xFB |0 # CJK UNIFIED IDEOGRAPH + \xEB\xBE |0 # CJK UNIFIED IDEOGRAPH + \xB7\xD7 |0 # CJK UNIFIED IDEOGRAPH + \xBF\xD6 |0 # CJK UNIFIED IDEOGRAPH + \xEB\xC1 |0 # CJK UNIFIED IDEOGRAPH + \xC6\xA4 |0 # CJK UNIFIED IDEOGRAPH + \xEB\xC0 |0 # CJK UNIFIED IDEOGRAPH + \xFB\xE7 |0 # CJK UNIFIED IDEOGRAPH + \xB7\xB1 |0 # CJK UNIFIED IDEOGRAPH + \xEB\xBF |0 # CJK UNIFIED IDEOGRAPH + \xC2\xF7 |0 # CJK UNIFIED IDEOGRAPH + \xB5\xAD |0 # CJK UNIFIED IDEOGRAPH + \xEB\xC2 |0 # CJK UNIFIED IDEOGRAPH + \xEB\xC3 |0 # CJK UNIFIED IDEOGRAPH + \xBE\xD9 |0 # CJK UNIFIED IDEOGRAPH + \xB7\xED |0 # CJK UNIFIED IDEOGRAPH + \xEB\xC4 |0 # CJK UNIFIED IDEOGRAPH + \xCB\xAC |0 # CJK UNIFIED IDEOGRAPH + \xC0\xDF |0 # CJK UNIFIED IDEOGRAPH + \xB5\xF6 |0 # CJK UNIFIED IDEOGRAPH + \xCC\xF5 |0 # CJK UNIFIED IDEOGRAPH + \xC1\xCA |0 # CJK UNIFIED IDEOGRAPH + \xEB\xC5 |0 # CJK UNIFIED IDEOGRAPH + \xFB\xE8 |0 # CJK UNIFIED IDEOGRAPH + \xBF\xC7 |0 # CJK UNIFIED IDEOGRAPH + \xC3\xF0 |0 # CJK UNIFIED IDEOGRAPH + \xBE\xDA |0 # CJK UNIFIED IDEOGRAPH + \xEB\xC6 |0 # CJK UNIFIED IDEOGRAPH + \xEB\xC9 |0 # CJK UNIFIED IDEOGRAPH + \xEB\xCA |0 # CJK UNIFIED IDEOGRAPH + \xBA\xBE |0 # CJK UNIFIED IDEOGRAPH + \xC2\xC2 |0 # CJK UNIFIED IDEOGRAPH + \xEB\xC8 |0 # CJK UNIFIED IDEOGRAPH + \xBE\xDB |0 # CJK UNIFIED IDEOGRAPH + \xC9\xBE |0 # CJK UNIFIED IDEOGRAPH + \xEB\xC7 |0 # CJK UNIFIED IDEOGRAPH + \xBB\xEC |0 # CJK UNIFIED IDEOGRAPH + \xB1\xD3 |0 # CJK UNIFIED IDEOGRAPH + \xEB\xCE |0 # CJK UNIFIED IDEOGRAPH + \xB7\xD8 |0 # CJK UNIFIED IDEOGRAPH + \xBB\xEE |0 # CJK UNIFIED IDEOGRAPH + \xBB\xED |0 # CJK UNIFIED IDEOGRAPH + \xCF\xCD |0 # CJK UNIFIED IDEOGRAPH + \xEB\xCD |0 # CJK UNIFIED IDEOGRAPH + \xEB\xCC |0 # CJK UNIFIED IDEOGRAPH + \xC1\xA7 |0 # CJK UNIFIED IDEOGRAPH + \xB5\xCD |0 # CJK UNIFIED IDEOGRAPH + \xCF\xC3 |0 # CJK UNIFIED IDEOGRAPH + \xB3\xBA |0 # CJK UNIFIED IDEOGRAPH + \xBE\xDC |0 # CJK UNIFIED IDEOGRAPH + \xFB\xE9 |0 # CJK UNIFIED IDEOGRAPH + \xEB\xCB |0 # CJK UNIFIED IDEOGRAPH + \xEB\xD0 |0 # CJK UNIFIED IDEOGRAPH + \xEB\xD1 |0 # CJK UNIFIED IDEOGRAPH + \xEB\xCF |0 # CJK UNIFIED IDEOGRAPH + \xB8\xD8 |0 # CJK UNIFIED IDEOGRAPH + \xCD\xC0 |0 # CJK UNIFIED IDEOGRAPH + \xBB\xEF |0 # CJK UNIFIED IDEOGRAPH + \xC7\xA7 |0 # CJK UNIFIED IDEOGRAPH + \xEB\xD4 |0 # CJK UNIFIED IDEOGRAPH + \xC0\xC0 |0 # CJK UNIFIED IDEOGRAPH + \xC3\xC2 |0 # CJK UNIFIED IDEOGRAPH + \xCD\xB6 |0 # CJK UNIFIED IDEOGRAPH + \xEB\xD7 |0 # CJK UNIFIED IDEOGRAPH + \xB8\xEC |0 # CJK UNIFIED IDEOGRAPH + \xC0\xBF |0 # CJK UNIFIED IDEOGRAPH + \xEB\xD3 |0 # CJK UNIFIED IDEOGRAPH + \xEB\xD8 |0 # CJK UNIFIED IDEOGRAPH + \xB8\xED |0 # CJK UNIFIED IDEOGRAPH + \xEB\xD5 |0 # CJK UNIFIED IDEOGRAPH + \xEB\xD6 |0 # CJK UNIFIED IDEOGRAPH + \xFB\xEA |0 # CJK UNIFIED IDEOGRAPH + \xEB\xD2 |0 # CJK UNIFIED IDEOGRAPH + \xC0\xE2 |0 # CJK UNIFIED IDEOGRAPH + \xC6\xC9 |0 # CJK UNIFIED IDEOGRAPH + \xC3\xAF |0 # CJK UNIFIED IDEOGRAPH + \xB2\xDD |0 # CJK UNIFIED IDEOGRAPH + \xC8\xF0 |0 # CJK UNIFIED IDEOGRAPH + \xB5\xC3 |0 # CJK UNIFIED IDEOGRAPH + \xFB\xEB |0 # CJK UNIFIED IDEOGRAPH + \xC4\xB4 |0 # CJK UNIFIED IDEOGRAPH + \xEB\xDB |0 # CJK UNIFIED IDEOGRAPH + \xEB\xD9 |0 # CJK UNIFIED IDEOGRAPH + \xC3\xCC |0 # CJK UNIFIED IDEOGRAPH + \xC0\xC1 |0 # CJK UNIFIED IDEOGRAPH + \xB4\xD2 |0 # CJK UNIFIED IDEOGRAPH + \xEB\xDA |0 # CJK UNIFIED IDEOGRAPH + \xBF\xDB |0 # CJK UNIFIED IDEOGRAPH + \xCE\xCA |0 # CJK UNIFIED IDEOGRAPH + \xCF\xC0 |0 # CJK UNIFIED IDEOGRAPH + \xEB\xDC |0 # CJK UNIFIED IDEOGRAPH + \xEB\xE7 |0 # CJK UNIFIED IDEOGRAPH + \xC4\xB5 |0 # CJK UNIFIED IDEOGRAPH + \xEB\xE6 |0 # CJK UNIFIED IDEOGRAPH + \xFB\xEC |0 # CJK UNIFIED IDEOGRAPH + \xEB\xE3 |0 # CJK UNIFIED IDEOGRAPH + \xEB\xEB |0 # CJK UNIFIED IDEOGRAPH + \xEB\xE4 |0 # CJK UNIFIED IDEOGRAPH + \xEB\xE0 |0 # CJK UNIFIED IDEOGRAPH + \xC4\xFC |0 # CJK UNIFIED IDEOGRAPH + \xEB\xDF |0 # CJK UNIFIED IDEOGRAPH + \xEB\xDD |0 # CJK UNIFIED IDEOGRAPH + \xCD\xA1 |0 # CJK UNIFIED IDEOGRAPH + \xBB\xF0 |0 # CJK UNIFIED IDEOGRAPH + \xEB\xE1 |0 # CJK UNIFIED IDEOGRAPH + \xEB\xDE |0 # CJK UNIFIED IDEOGRAPH + \xFB\xEE |0 # CJK UNIFIED IDEOGRAPH + \xEB\xE5 |0 # CJK UNIFIED IDEOGRAPH + \xBD\xF4 |0 # CJK UNIFIED IDEOGRAPH + \xB8\xC1 |0 # CJK UNIFIED IDEOGRAPH + \xC2\xFA |0 # CJK UNIFIED IDEOGRAPH + \xCB\xC5 |0 # CJK UNIFIED IDEOGRAPH + \xB1\xDA |0 # CJK UNIFIED IDEOGRAPH + \xB0\xE2 |0 # CJK UNIFIED IDEOGRAPH + \xC6\xA5 |0 # CJK UNIFIED IDEOGRAPH + \xEB\xE9 |0 # CJK UNIFIED IDEOGRAPH + \xEB\xE8 |0 # CJK UNIFIED IDEOGRAPH + \xC6\xE6 |0 # CJK UNIFIED IDEOGRAPH + \xEB\xED |0 # CJK UNIFIED IDEOGRAPH + \xEB\xE2 |0 # CJK UNIFIED IDEOGRAPH + \xEB\xEC |0 # CJK UNIFIED IDEOGRAPH + \xEB\xEE |0 # CJK UNIFIED IDEOGRAPH + \xB8\xAC |0 # CJK UNIFIED IDEOGRAPH + \xEB\xEA |0 # CJK UNIFIED IDEOGRAPH + \xB9\xD6 |0 # CJK UNIFIED IDEOGRAPH + \xBC\xD5 |0 # CJK UNIFIED IDEOGRAPH + \xEB\xEF |0 # CJK UNIFIED IDEOGRAPH + \xCD\xD8 |0 # CJK UNIFIED IDEOGRAPH + \xEB\xF2 |0 # CJK UNIFIED IDEOGRAPH + \xEB\xF5 |0 # CJK UNIFIED IDEOGRAPH + \xEB\xF3 |0 # CJK UNIFIED IDEOGRAPH + \xC9\xB5 |0 # CJK UNIFIED IDEOGRAPH + \xEB\xF0 |0 # CJK UNIFIED IDEOGRAPH + \xB6\xE0 |0 # CJK UNIFIED IDEOGRAPH + \xEB\xF4 |0 # CJK UNIFIED IDEOGRAPH + \xEB\xF6 |0 # CJK UNIFIED IDEOGRAPH + \xEB\xFA |0 # CJK UNIFIED IDEOGRAPH + \xEB\xF7 |0 # CJK UNIFIED IDEOGRAPH + \xEB\xF9 |0 # CJK UNIFIED IDEOGRAPH + \xEB\xF8 |0 # CJK UNIFIED IDEOGRAPH + \xFB\xEF |0 # CJK UNIFIED IDEOGRAPH + \xEB\xFB |0 # CJK UNIFIED IDEOGRAPH + \xBC\xB1 |0 # CJK UNIFIED IDEOGRAPH + \xEB\xFD |0 # CJK UNIFIED IDEOGRAPH + \xEB\xFC |0 # CJK UNIFIED IDEOGRAPH + \xC9\xE8 |0 # CJK UNIFIED IDEOGRAPH + \xEC\xA1 |0 # CJK UNIFIED IDEOGRAPH + \xB7\xD9 |0 # CJK UNIFIED IDEOGRAPH + \xEB\xFE |0 # CJK UNIFIED IDEOGRAPH + \xEC\xA2 |0 # CJK UNIFIED IDEOGRAPH + \xEC\xA3 |0 # CJK UNIFIED IDEOGRAPH + \xB5\xC4 |0 # CJK UNIFIED IDEOGRAPH + \xE6\xC1 |0 # CJK UNIFIED IDEOGRAPH + \xBE\xF9 |0 # CJK UNIFIED IDEOGRAPH + \xEC\xA4 |0 # CJK UNIFIED IDEOGRAPH + \xB8\xEE |0 # CJK UNIFIED IDEOGRAPH + \xEC\xA5 |0 # CJK UNIFIED IDEOGRAPH + \xFB\xF0 |0 # CJK UNIFIED IDEOGRAPH + \xEC\xA6 |0 # CJK UNIFIED IDEOGRAPH + \xBB\xBE |0 # CJK UNIFIED IDEOGRAPH + \xDA\xCE |0 # CJK UNIFIED IDEOGRAPH + \xEC\xA7 |0 # CJK UNIFIED IDEOGRAPH + \xEC\xA8 |0 # CJK UNIFIED IDEOGRAPH + \xBD\xB2 |0 # CJK UNIFIED IDEOGRAPH + \xEC\xA9 |0 # CJK UNIFIED IDEOGRAPH + \xEC\xAA |0 # CJK UNIFIED IDEOGRAPH + \xEC\xAB |0 # CJK UNIFIED IDEOGRAPH + \xEC\xAC |0 # CJK UNIFIED IDEOGRAPH + \xEC\xAD |0 # CJK UNIFIED IDEOGRAPH + \xC3\xAB |0 # CJK UNIFIED IDEOGRAPH + \xEC\xAE |0 # CJK UNIFIED IDEOGRAPH + \xEC\xB0 |0 # CJK UNIFIED IDEOGRAPH + \xEC\xAF |0 # CJK UNIFIED IDEOGRAPH + \xC6\xA6 |0 # CJK UNIFIED IDEOGRAPH + \xEC\xB1 |0 # CJK UNIFIED IDEOGRAPH + \xCB\xAD |0 # CJK UNIFIED IDEOGRAPH + \xEC\xB2 |0 # CJK UNIFIED IDEOGRAPH + \xEC\xB3 |0 # CJK UNIFIED IDEOGRAPH + \xEC\xB4 |0 # CJK UNIFIED IDEOGRAPH + \xEC\xB5 |0 # CJK UNIFIED IDEOGRAPH + \xC6\xDA |0 # CJK UNIFIED IDEOGRAPH + \xBE\xDD |0 # CJK UNIFIED IDEOGRAPH + \xEC\xB6 |0 # CJK UNIFIED IDEOGRAPH + \xB9\xEB |0 # CJK UNIFIED IDEOGRAPH + \xD0\xAE |0 # CJK UNIFIED IDEOGRAPH + \xEC\xB7 |0 # CJK UNIFIED IDEOGRAPH + \xEC\xB8 |0 # CJK UNIFIED IDEOGRAPH + \xC9\xBF |0 # CJK UNIFIED IDEOGRAPH + \xEC\xB9 |0 # CJK UNIFIED IDEOGRAPH + \xEC\xC1 |0 # CJK UNIFIED IDEOGRAPH + \xEC\xBA |0 # CJK UNIFIED IDEOGRAPH + \xEC\xBC |0 # CJK UNIFIED IDEOGRAPH + \xEC\xBB |0 # CJK UNIFIED IDEOGRAPH + \xEC\xBD |0 # CJK UNIFIED IDEOGRAPH + \xCB\xC6 |0 # CJK UNIFIED IDEOGRAPH + \xEC\xBE |0 # CJK UNIFIED IDEOGRAPH + \xEC\xBF |0 # CJK UNIFIED IDEOGRAPH + \xEC\xC0 |0 # CJK UNIFIED IDEOGRAPH + \xEC\xC2 |0 # CJK UNIFIED IDEOGRAPH + \xB3\xAD |0 # CJK UNIFIED IDEOGRAPH + \xC4\xE7 |0 # CJK UNIFIED IDEOGRAPH + \xC9\xE9 |0 # CJK UNIFIED IDEOGRAPH + \xBA\xE2 |0 # CJK UNIFIED IDEOGRAPH + \xB9\xD7 |0 # CJK UNIFIED IDEOGRAPH + \xC9\xCF |0 # CJK UNIFIED IDEOGRAPH + \xB2\xDF |0 # CJK UNIFIED IDEOGRAPH + \xC8\xCE |0 # CJK UNIFIED IDEOGRAPH + \xEC\xC5 |0 # CJK UNIFIED IDEOGRAPH + \xB4\xD3 |0 # CJK UNIFIED IDEOGRAPH + \xC0\xD5 |0 # CJK UNIFIED IDEOGRAPH + \xEC\xC4 |0 # CJK UNIFIED IDEOGRAPH + \xEC\xC9 |0 # CJK UNIFIED IDEOGRAPH + \xC3\xF9 |0 # CJK UNIFIED IDEOGRAPH + \xCC\xE3 |0 # CJK UNIFIED IDEOGRAPH + \xEC\xC7 |0 # CJK UNIFIED IDEOGRAPH + \xEC\xC8 |0 # CJK UNIFIED IDEOGRAPH + \xB5\xAE |0 # CJK UNIFIED IDEOGRAPH + \xEC\xCA |0 # CJK UNIFIED IDEOGRAPH + \xC7\xE3 |0 # CJK UNIFIED IDEOGRAPH + \xC2\xDF |0 # CJK UNIFIED IDEOGRAPH + \xC8\xF1 |0 # CJK UNIFIED IDEOGRAPH + \xC5\xBD |0 # CJK UNIFIED IDEOGRAPH + \xEC\xC6 |0 # CJK UNIFIED IDEOGRAPH + \xCB\xC7 |0 # CJK UNIFIED IDEOGRAPH + \xB2\xEC |0 # CJK UNIFIED IDEOGRAPH + \xEC\xCC |0 # CJK UNIFIED IDEOGRAPH + \xCF\xA8 |0 # CJK UNIFIED IDEOGRAPH + \xC4\xC2 |0 # CJK UNIFIED IDEOGRAPH + \xCF\xC5 |0 # CJK UNIFIED IDEOGRAPH + \xBB\xF1 |0 # CJK UNIFIED IDEOGRAPH + \xEC\xCB |0 # CJK UNIFIED IDEOGRAPH + \xC2\xB1 |0 # CJK UNIFIED IDEOGRAPH + \xEC\xDC |0 # CJK UNIFIED IDEOGRAPH + \xC1\xA8 |0 # CJK UNIFIED IDEOGRAPH + \xC6\xF8 |0 # CJK UNIFIED IDEOGRAPH + \xC9\xD0 |0 # CJK UNIFIED IDEOGRAPH + \xEC\xCF |0 # CJK UNIFIED IDEOGRAPH + \xBB\xBF |0 # CJK UNIFIED IDEOGRAPH + \xBB\xF2 |0 # CJK UNIFIED IDEOGRAPH + \xBE\xDE |0 # CJK UNIFIED IDEOGRAPH + \xC7\xE5 |0 # CJK UNIFIED IDEOGRAPH + \xB8\xAD |0 # CJK UNIFIED IDEOGRAPH + \xEC\xCE |0 # CJK UNIFIED IDEOGRAPH + \xEC\xCD |0 # CJK UNIFIED IDEOGRAPH + \xC9\xEA |0 # CJK UNIFIED IDEOGRAPH + \xBC\xC1 |0 # CJK UNIFIED IDEOGRAPH + \xC5\xD2 |0 # CJK UNIFIED IDEOGRAPH + \xFB\xF1 |0 # CJK UNIFIED IDEOGRAPH + \xFB\xF2 |0 # CJK UNIFIED IDEOGRAPH + \xEC\xD1 |0 # CJK UNIFIED IDEOGRAPH + \xEC\xD2 |0 # CJK UNIFIED IDEOGRAPH + \xB9\xD8 |0 # CJK UNIFIED IDEOGRAPH + \xEC\xD0 |0 # CJK UNIFIED IDEOGRAPH + \xEC\xD3 |0 # CJK UNIFIED IDEOGRAPH + \xEC\xD4 |0 # CJK UNIFIED IDEOGRAPH + \xEC\xD6 |0 # CJK UNIFIED IDEOGRAPH + \xC2\xA3 |0 # CJK UNIFIED IDEOGRAPH + \xEC\xD5 |0 # CJK UNIFIED IDEOGRAPH + \xB4\xE6 |0 # CJK UNIFIED IDEOGRAPH + \xEC\xD8 |0 # CJK UNIFIED IDEOGRAPH + \xEC\xD7 |0 # CJK UNIFIED IDEOGRAPH + \xEC\xD9 |0 # CJK UNIFIED IDEOGRAPH + \xFB\xF3 |0 # CJK UNIFIED IDEOGRAPH + \xEC\xDB |0 # CJK UNIFIED IDEOGRAPH + \xEC\xDD |0 # CJK UNIFIED IDEOGRAPH + \xEC\xDE |0 # CJK UNIFIED IDEOGRAPH + \xC0\xD6 |0 # CJK UNIFIED IDEOGRAPH + \xBC\xCF |0 # CJK UNIFIED IDEOGRAPH + \xEC\xDF |0 # CJK UNIFIED IDEOGRAPH + \xB3\xD2 |0 # CJK UNIFIED IDEOGRAPH + \xEC\xE0 |0 # CJK UNIFIED IDEOGRAPH + \xC1\xF6 |0 # CJK UNIFIED IDEOGRAPH + \xEC\xE1 |0 # CJK UNIFIED IDEOGRAPH + \xEC\xE2 |0 # CJK UNIFIED IDEOGRAPH + \xC9\xEB |0 # CJK UNIFIED IDEOGRAPH + \xFB\xF4 |0 # CJK UNIFIED IDEOGRAPH + \xB5\xAF |0 # CJK UNIFIED IDEOGRAPH + \xEC\xE3 |0 # CJK UNIFIED IDEOGRAPH + \xC4\xB6 |0 # CJK UNIFIED IDEOGRAPH + \xB1\xDB |0 # CJK UNIFIED IDEOGRAPH + \xEC\xE4 |0 # CJK UNIFIED IDEOGRAPH + \xBC\xF1 |0 # CJK UNIFIED IDEOGRAPH + \xBF\xF6 |0 # CJK UNIFIED IDEOGRAPH + \xC2\xAD |0 # CJK UNIFIED IDEOGRAPH + \xEC\xE7 |0 # CJK UNIFIED IDEOGRAPH + \xEC\xE6 |0 # CJK UNIFIED IDEOGRAPH + \xEC\xE5 |0 # CJK UNIFIED IDEOGRAPH + \xEC\xED |0 # CJK UNIFIED IDEOGRAPH + \xEC\xEB |0 # CJK UNIFIED IDEOGRAPH + \xEC\xE8 |0 # CJK UNIFIED IDEOGRAPH + \xEC\xEA |0 # CJK UNIFIED IDEOGRAPH + \xEC\xE9 |0 # CJK UNIFIED IDEOGRAPH + \xEC\xEC |0 # CJK UNIFIED IDEOGRAPH + \xB5\xF7 |0 # CJK UNIFIED IDEOGRAPH + \xEC\xF0 |0 # CJK UNIFIED IDEOGRAPH + \xC0\xD7 |0 # CJK UNIFIED IDEOGRAPH + \xEC\xF1 |0 # CJK UNIFIED IDEOGRAPH + \xB8\xD9 |0 # CJK UNIFIED IDEOGRAPH + \xEC\xEE |0 # CJK UNIFIED IDEOGRAPH + \xEC\xEF |0 # CJK UNIFIED IDEOGRAPH + \xCF\xA9 |0 # CJK UNIFIED IDEOGRAPH + \xC4\xB7 |0 # CJK UNIFIED IDEOGRAPH + \xC1\xA9 |0 # CJK UNIFIED IDEOGRAPH + \xEC\xF2 |0 # CJK UNIFIED IDEOGRAPH + \xEC\xF5 |0 # CJK UNIFIED IDEOGRAPH + \xEC\xF3 |0 # CJK UNIFIED IDEOGRAPH + \xEC\xF4 |0 # CJK UNIFIED IDEOGRAPH + \xCD\xD9 |0 # CJK UNIFIED IDEOGRAPH + \xC6\xA7 |0 # CJK UNIFIED IDEOGRAPH + \xEC\xF8 |0 # CJK UNIFIED IDEOGRAPH + \xEC\xF6 |0 # CJK UNIFIED IDEOGRAPH + \xEC\xF7 |0 # CJK UNIFIED IDEOGRAPH + \xEC\xF9 |0 # CJK UNIFIED IDEOGRAPH + \xED\xA9 |0 # CJK UNIFIED IDEOGRAPH + \xEC\xFC |0 # CJK UNIFIED IDEOGRAPH + \xEC\xFD |0 # CJK UNIFIED IDEOGRAPH + \xEC\xFB |0 # CJK UNIFIED IDEOGRAPH + \xEC\xFA |0 # CJK UNIFIED IDEOGRAPH + \xC4\xFD |0 # CJK UNIFIED IDEOGRAPH + \xED\xA1 |0 # CJK UNIFIED IDEOGRAPH + \xED\xA5 |0 # CJK UNIFIED IDEOGRAPH + \xED\xA2 |0 # CJK UNIFIED IDEOGRAPH + \xEC\xFE |0 # CJK UNIFIED IDEOGRAPH + \xED\xA3 |0 # CJK UNIFIED IDEOGRAPH + \xED\xA4 |0 # CJK UNIFIED IDEOGRAPH + \xED\xAB |0 # CJK UNIFIED IDEOGRAPH + \xED\xA6 |0 # CJK UNIFIED IDEOGRAPH + \xC0\xD8 |0 # CJK UNIFIED IDEOGRAPH + \xED\xA8 |0 # CJK UNIFIED IDEOGRAPH + \xED\xAA |0 # CJK UNIFIED IDEOGRAPH + \xED\xA7 |0 # CJK UNIFIED IDEOGRAPH + \xED\xAD |0 # CJK UNIFIED IDEOGRAPH + \xBD\xB3 |0 # CJK UNIFIED IDEOGRAPH + \xED\xAC |0 # CJK UNIFIED IDEOGRAPH + \xED\xAE |0 # CJK UNIFIED IDEOGRAPH + \xED\xAF |0 # CJK UNIFIED IDEOGRAPH + \xED\xB2 |0 # CJK UNIFIED IDEOGRAPH + \xED\xB1 |0 # CJK UNIFIED IDEOGRAPH + \xED\xB0 |0 # CJK UNIFIED IDEOGRAPH + \xED\xB4 |0 # CJK UNIFIED IDEOGRAPH + \xED\xB3 |0 # CJK UNIFIED IDEOGRAPH + \xCC\xF6 |0 # CJK UNIFIED IDEOGRAPH + \xED\xB6 |0 # CJK UNIFIED IDEOGRAPH + \xED\xB5 |0 # CJK UNIFIED IDEOGRAPH + \xED\xB7 |0 # CJK UNIFIED IDEOGRAPH + \xED\xB8 |0 # CJK UNIFIED IDEOGRAPH + \xED\xBA |0 # CJK UNIFIED IDEOGRAPH + \xED\xB9 |0 # CJK UNIFIED IDEOGRAPH + \xBF\xC8 |0 # CJK UNIFIED IDEOGRAPH + \xED\xBB |0 # CJK UNIFIED IDEOGRAPH + \xB6\xED |0 # CJK UNIFIED IDEOGRAPH + \xED\xBC |0 # CJK UNIFIED IDEOGRAPH + \xED\xBE |0 # CJK UNIFIED IDEOGRAPH + \xED\xBF |0 # CJK UNIFIED IDEOGRAPH + \xED\xC0 |0 # CJK UNIFIED IDEOGRAPH + \xED\xBD |0 # CJK UNIFIED IDEOGRAPH + \xED\xC1 |0 # CJK UNIFIED IDEOGRAPH + \xBC\xD6 |0 # CJK UNIFIED IDEOGRAPH + \xED\xC2 |0 # CJK UNIFIED IDEOGRAPH + \xB5\xB0 |0 # CJK UNIFIED IDEOGRAPH + \xB7\xB3 |0 # CJK UNIFIED IDEOGRAPH + \xFB\xF6 |0 # CJK UNIFIED IDEOGRAPH + \xB8\xAE |0 # CJK UNIFIED IDEOGRAPH + \xED\xC3 |0 # CJK UNIFIED IDEOGRAPH + \xC6\xF0 |0 # CJK UNIFIED IDEOGRAPH + \xC5\xBE |0 # CJK UNIFIED IDEOGRAPH + \xED\xC4 |0 # CJK UNIFIED IDEOGRAPH + \xED\xC7 |0 # CJK UNIFIED IDEOGRAPH + \xBC\xB4 |0 # CJK UNIFIED IDEOGRAPH + \xED\xC6 |0 # CJK UNIFIED IDEOGRAPH + \xED\xC5 |0 # CJK UNIFIED IDEOGRAPH + \xB7\xDA |0 # CJK UNIFIED IDEOGRAPH + \xED\xC8 |0 # CJK UNIFIED IDEOGRAPH + \xB3\xD3 |0 # CJK UNIFIED IDEOGRAPH + \xED\xCA |0 # CJK UNIFIED IDEOGRAPH + \xBA\xDC |0 # CJK UNIFIED IDEOGRAPH + \xED\xC9 |0 # CJK UNIFIED IDEOGRAPH + \xED\xD2 |0 # CJK UNIFIED IDEOGRAPH + \xED\xCC |0 # CJK UNIFIED IDEOGRAPH + \xED\xCE |0 # CJK UNIFIED IDEOGRAPH + \xCA\xE5 |0 # CJK UNIFIED IDEOGRAPH + \xED\xCB |0 # CJK UNIFIED IDEOGRAPH + \xED\xCD |0 # CJK UNIFIED IDEOGRAPH + \xED\xD1 |0 # CJK UNIFIED IDEOGRAPH + \xED\xCF |0 # CJK UNIFIED IDEOGRAPH + \xB5\xB1 |0 # CJK UNIFIED IDEOGRAPH + \xED\xD0 |0 # CJK UNIFIED IDEOGRAPH + \xED\xD3 |0 # CJK UNIFIED IDEOGRAPH + \xC7\xDA |0 # CJK UNIFIED IDEOGRAPH + \xCE\xD8 |0 # CJK UNIFIED IDEOGRAPH + \xBD\xB4 |0 # CJK UNIFIED IDEOGRAPH + \xED\xD4 |0 # CJK UNIFIED IDEOGRAPH + \xCD\xA2 |0 # CJK UNIFIED IDEOGRAPH + \xED\xD6 |0 # CJK UNIFIED IDEOGRAPH + \xED\xD5 |0 # CJK UNIFIED IDEOGRAPH + \xED\xD9 |0 # CJK UNIFIED IDEOGRAPH + \xCD\xC1 |0 # CJK UNIFIED IDEOGRAPH + \xED\xD8 |0 # CJK UNIFIED IDEOGRAPH + \xB3\xED |0 # CJK UNIFIED IDEOGRAPH + \xED\xD7 |0 # CJK UNIFIED IDEOGRAPH + \xED\xDC |0 # CJK UNIFIED IDEOGRAPH + \xED\xDB |0 # CJK UNIFIED IDEOGRAPH + \xED\xDA |0 # CJK UNIFIED IDEOGRAPH + \xC5\xB2 |0 # CJK UNIFIED IDEOGRAPH + \xED\xDD |0 # CJK UNIFIED IDEOGRAPH + \xED\xDE |0 # CJK UNIFIED IDEOGRAPH + \xED\xDF |0 # CJK UNIFIED IDEOGRAPH + \xB9\xEC |0 # CJK UNIFIED IDEOGRAPH + \xB7\xA5 |0 # CJK UNIFIED IDEOGRAPH + \xED\xE0 |0 # CJK UNIFIED IDEOGRAPH + \xED\xE1 |0 # CJK UNIFIED IDEOGRAPH + \xED\xE2 |0 # CJK UNIFIED IDEOGRAPH + \xBF\xC9 |0 # CJK UNIFIED IDEOGRAPH + \xED\xE3 |0 # CJK UNIFIED IDEOGRAPH + \xBC\xAD |0 # CJK UNIFIED IDEOGRAPH + \xED\xE4 |0 # CJK UNIFIED IDEOGRAPH + \xED\xE5 |0 # CJK UNIFIED IDEOGRAPH + \xD2\xA1 |0 # CJK UNIFIED IDEOGRAPH + \xD1\xFE |0 # CJK UNIFIED IDEOGRAPH + \xED\xE6 |0 # CJK UNIFIED IDEOGRAPH + \xE5\xF0 |0 # CJK UNIFIED IDEOGRAPH + \xED\xE7 |0 # CJK UNIFIED IDEOGRAPH + \xC3\xA4 |0 # CJK UNIFIED IDEOGRAPH + \xBF\xAB |0 # CJK UNIFIED IDEOGRAPH + \xC7\xC0 |0 # CJK UNIFIED IDEOGRAPH + \xED\xE8 |0 # CJK UNIFIED IDEOGRAPH + \xCA\xD5 |0 # CJK UNIFIED IDEOGRAPH + \xC4\xD4 |0 # CJK UNIFIED IDEOGRAPH + \xB9\xFE |0 # CJK UNIFIED IDEOGRAPH + \xC3\xA9 |0 # CJK UNIFIED IDEOGRAPH + \xB1\xAA |0 # CJK UNIFIED IDEOGRAPH + \xCB\xF8 |0 # CJK UNIFIED IDEOGRAPH + \xBF\xD7 |0 # CJK UNIFIED IDEOGRAPH + \xB7\xDE |0 # CJK UNIFIED IDEOGRAPH + \xB6\xE1 |0 # CJK UNIFIED IDEOGRAPH + \xCA\xD6 |0 # CJK UNIFIED IDEOGRAPH + \xED\xE9 |0 # CJK UNIFIED IDEOGRAPH + \xED\xEB |0 # CJK UNIFIED IDEOGRAPH + \xED\xEA |0 # CJK UNIFIED IDEOGRAPH + \xB2\xE0 |0 # CJK UNIFIED IDEOGRAPH + \xC6\xF6 |0 # CJK UNIFIED IDEOGRAPH + \xED\xEC |0 # CJK UNIFIED IDEOGRAPH + \xC7\xF7 |0 # CJK UNIFIED IDEOGRAPH + \xC5\xB3 |0 # CJK UNIFIED IDEOGRAPH + \xED\xED |0 # CJK UNIFIED IDEOGRAPH + \xBD\xD2 |0 # CJK UNIFIED IDEOGRAPH + \xED\xEF |0 # CJK UNIFIED IDEOGRAPH + \xCC\xC2 |0 # CJK UNIFIED IDEOGRAPH + \xED\xFE |0 # CJK UNIFIED IDEOGRAPH + \xED\xF1 |0 # CJK UNIFIED IDEOGRAPH + \xED\xF2 |0 # CJK UNIFIED IDEOGRAPH + \xC4\xC9 |0 # CJK UNIFIED IDEOGRAPH + \xC2\xE0 |0 # CJK UNIFIED IDEOGRAPH + \xC1\xF7 |0 # CJK UNIFIED IDEOGRAPH + \xC6\xA8 |0 # CJK UNIFIED IDEOGRAPH + \xED\xF0 |0 # CJK UNIFIED IDEOGRAPH + \xB5\xD5 |0 # CJK UNIFIED IDEOGRAPH + \xED\xF9 |0 # CJK UNIFIED IDEOGRAPH + \xED\xF6 |0 # CJK UNIFIED IDEOGRAPH + \xEE\xA5 |0 # CJK UNIFIED IDEOGRAPH + \xC6\xA9 |0 # CJK UNIFIED IDEOGRAPH + \xC3\xE0 |0 # CJK UNIFIED IDEOGRAPH + \xED\xF3 |0 # CJK UNIFIED IDEOGRAPH + \xC4\xFE |0 # CJK UNIFIED IDEOGRAPH + \xC5\xD3 |0 # CJK UNIFIED IDEOGRAPH + \xED\xF4 |0 # CJK UNIFIED IDEOGRAPH + \xED\xF8 |0 # CJK UNIFIED IDEOGRAPH + \xBF\xE0 |0 # CJK UNIFIED IDEOGRAPH + \xC7\xE7 |0 # CJK UNIFIED IDEOGRAPH + \xC4\xCC |0 # CJK UNIFIED IDEOGRAPH + \xC0\xC2 |0 # CJK UNIFIED IDEOGRAPH + \xED\xF7 |0 # CJK UNIFIED IDEOGRAPH + \xC2\xAE |0 # CJK UNIFIED IDEOGRAPH + \xC2\xA4 |0 # CJK UNIFIED IDEOGRAPH + \xED\xF5 |0 # CJK UNIFIED IDEOGRAPH + \xB0\xA9 |0 # CJK UNIFIED IDEOGRAPH + \xCF\xA2 |0 # CJK UNIFIED IDEOGRAPH + \xED\xFA |0 # CJK UNIFIED IDEOGRAPH + \xC2\xE1 |0 # CJK UNIFIED IDEOGRAPH + \xBD\xB5 |0 # CJK UNIFIED IDEOGRAPH + \xBF\xCA |0 # CJK UNIFIED IDEOGRAPH + \xED\xFC |0 # CJK UNIFIED IDEOGRAPH + \xED\xFB |0 # CJK UNIFIED IDEOGRAPH + \xB0\xEF |0 # CJK UNIFIED IDEOGRAPH + \xED\xFD |0 # CJK UNIFIED IDEOGRAPH + \xC9\xAF |0 # CJK UNIFIED IDEOGRAPH + \xEE\xA7 |0 # CJK UNIFIED IDEOGRAPH + \xC6\xDB |0 # CJK UNIFIED IDEOGRAPH + \xBF\xEB |0 # CJK UNIFIED IDEOGRAPH + \xC3\xD9 |0 # CJK UNIFIED IDEOGRAPH + \xB6\xF8 |0 # CJK UNIFIED IDEOGRAPH + \xEE\xA6 |0 # CJK UNIFIED IDEOGRAPH + \xCD\xB7 |0 # CJK UNIFIED IDEOGRAPH + \xB1\xBF |0 # CJK UNIFIED IDEOGRAPH + \xCA\xD7 |0 # CJK UNIFIED IDEOGRAPH + \xB2\xE1 |0 # CJK UNIFIED IDEOGRAPH + \xEE\xA1 |0 # CJK UNIFIED IDEOGRAPH + \xEE\xA2 |0 # CJK UNIFIED IDEOGRAPH + \xEE\xA3 |0 # CJK UNIFIED IDEOGRAPH + \xEE\xA4 |0 # CJK UNIFIED IDEOGRAPH + \xC6\xBB |0 # CJK UNIFIED IDEOGRAPH + \xC3\xA3 |0 # CJK UNIFIED IDEOGRAPH + \xB0\xE3 |0 # CJK UNIFIED IDEOGRAPH + \xEE\xA8 |0 # CJK UNIFIED IDEOGRAPH + \xEE\xA9 |0 # CJK UNIFIED IDEOGRAPH + \xF4\xA3 |0 # CJK UNIFIED IDEOGRAPH + \xC2\xBD |0 # CJK UNIFIED IDEOGRAPH + \xEE\xAA |0 # CJK UNIFIED IDEOGRAPH + \xB1\xF3 |0 # CJK UNIFIED IDEOGRAPH + \xC1\xCC |0 # CJK UNIFIED IDEOGRAPH + \xB8\xAF |0 # CJK UNIFIED IDEOGRAPH + \xCD\xDA |0 # CJK UNIFIED IDEOGRAPH + \xFB\xF9 |0 # CJK UNIFIED IDEOGRAPH + \xEE\xAB |0 # CJK UNIFIED IDEOGRAPH + \xC5\xAC |0 # CJK UNIFIED IDEOGRAPH + \xC1\xF8 |0 # CJK UNIFIED IDEOGRAPH + \xBC\xD7 |0 # CJK UNIFIED IDEOGRAPH + \xEE\xAC |0 # CJK UNIFIED IDEOGRAPH + \xEE\xAF |0 # CJK UNIFIED IDEOGRAPH + \xBD\xE5 |0 # CJK UNIFIED IDEOGRAPH + \xEE\xAD |0 # CJK UNIFIED IDEOGRAPH + \xC1\xAB |0 # CJK UNIFIED IDEOGRAPH + \xC1\xAA |0 # CJK UNIFIED IDEOGRAPH + \xB0\xE4 |0 # CJK UNIFIED IDEOGRAPH + \xCE\xCB |0 # CJK UNIFIED IDEOGRAPH + \xEE\xB1 |0 # CJK UNIFIED IDEOGRAPH + \xC8\xF2 |0 # CJK UNIFIED IDEOGRAPH + \xEE\xB3 |0 # CJK UNIFIED IDEOGRAPH + \xEE\xB2 |0 # CJK UNIFIED IDEOGRAPH + \xEE\xB0 |0 # CJK UNIFIED IDEOGRAPH + \xE3\xE4 |0 # CJK UNIFIED IDEOGRAPH + \xB4\xD4 |0 # CJK UNIFIED IDEOGRAPH + \xED\xEE |0 # CJK UNIFIED IDEOGRAPH + \xEE\xB5 |0 # CJK UNIFIED IDEOGRAPH + \xEE\xB4 |0 # CJK UNIFIED IDEOGRAPH + \xEE\xB6 |0 # CJK UNIFIED IDEOGRAPH + \xCD\xB8 |0 # CJK UNIFIED IDEOGRAPH + \xC6\xE1 |0 # CJK UNIFIED IDEOGRAPH + \xCB\xAE |0 # CJK UNIFIED IDEOGRAPH + \xEE\xB7 |0 # CJK UNIFIED IDEOGRAPH + \xBC\xD9 |0 # CJK UNIFIED IDEOGRAPH + \xEE\xB8 |0 # CJK UNIFIED IDEOGRAPH + \xEE\xB9 |0 # CJK UNIFIED IDEOGRAPH + \xEE\xBA |0 # CJK UNIFIED IDEOGRAPH + \xC5\xA1 |0 # CJK UNIFIED IDEOGRAPH + \xB0\xEA |0 # CJK UNIFIED IDEOGRAPH + \xB9\xD9 |0 # CJK UNIFIED IDEOGRAPH + \xCF\xBA |0 # CJK UNIFIED IDEOGRAPH + \xEE\xBE |0 # CJK UNIFIED IDEOGRAPH + \xFB\xFA |0 # CJK UNIFIED IDEOGRAPH + \xB7\xB4 |0 # CJK UNIFIED IDEOGRAPH + \xEE\xBB |0 # CJK UNIFIED IDEOGRAPH + \xEE\xBC |0 # CJK UNIFIED IDEOGRAPH + \xC9\xF4 |0 # CJK UNIFIED IDEOGRAPH + \xB3\xD4 |0 # CJK UNIFIED IDEOGRAPH + \xCD\xB9 |0 # CJK UNIFIED IDEOGRAPH + \xB6\xBF |0 # CJK UNIFIED IDEOGRAPH + \xC5\xD4 |0 # CJK UNIFIED IDEOGRAPH + \xEE\xBF |0 # CJK UNIFIED IDEOGRAPH + \xEE\xC0 |0 # CJK UNIFIED IDEOGRAPH + \xFB\xFC |0 # CJK UNIFIED IDEOGRAPH + \xEE\xC1 |0 # CJK UNIFIED IDEOGRAPH + \xFB\xFD |0 # CJK UNIFIED IDEOGRAPH + \xC5\xA2 |0 # CJK UNIFIED IDEOGRAPH + \xEE\xC3 |0 # CJK UNIFIED IDEOGRAPH + \xEE\xC2 |0 # CJK UNIFIED IDEOGRAPH + \xC6\xD3 |0 # CJK UNIFIED IDEOGRAPH + \xEE\xC4 |0 # CJK UNIFIED IDEOGRAPH + \xBD\xB6 |0 # CJK UNIFIED IDEOGRAPH + \xBC\xE0 |0 # CJK UNIFIED IDEOGRAPH + \xC7\xDB |0 # CJK UNIFIED IDEOGRAPH + \xC3\xF1 |0 # CJK UNIFIED IDEOGRAPH + \xBC\xF2 |0 # CJK UNIFIED IDEOGRAPH + \xBF\xEC |0 # CJK UNIFIED IDEOGRAPH + \xEE\xC5 |0 # CJK UNIFIED IDEOGRAPH + \xEE\xC6 |0 # CJK UNIFIED IDEOGRAPH + \xBF\xDD |0 # CJK UNIFIED IDEOGRAPH + \xEE\xC7 |0 # CJK UNIFIED IDEOGRAPH + \xEE\xC8 |0 # CJK UNIFIED IDEOGRAPH + \xEE\xC9 |0 # CJK UNIFIED IDEOGRAPH + \xCD\xEF |0 # CJK UNIFIED IDEOGRAPH + \xBD\xB7 |0 # CJK UNIFIED IDEOGRAPH + \xEE\xCB |0 # CJK UNIFIED IDEOGRAPH + \xEE\xCA |0 # CJK UNIFIED IDEOGRAPH + \xB9\xDA |0 # CJK UNIFIED IDEOGRAPH + \xB9\xF3 |0 # CJK UNIFIED IDEOGRAPH + \xBB\xC0 |0 # CJK UNIFIED IDEOGRAPH + \xEE\xCE |0 # CJK UNIFIED IDEOGRAPH + \xBD\xE6 |0 # CJK UNIFIED IDEOGRAPH + \xEE\xCD |0 # CJK UNIFIED IDEOGRAPH + \xEE\xCC |0 # CJK UNIFIED IDEOGRAPH + \xC2\xE9 |0 # CJK UNIFIED IDEOGRAPH + \xB8\xEF |0 # CJK UNIFIED IDEOGRAPH + \xC0\xC3 |0 # CJK UNIFIED IDEOGRAPH + \xC8\xB0 |0 # CJK UNIFIED IDEOGRAPH + \xBD\xB9 |0 # CJK UNIFIED IDEOGRAPH + \xEE\xCF |0 # CJK UNIFIED IDEOGRAPH + \xBE\xDF |0 # CJK UNIFIED IDEOGRAPH + \xEE\xD2 |0 # CJK UNIFIED IDEOGRAPH + \xEE\xD0 |0 # CJK UNIFIED IDEOGRAPH + \xEE\xD1 |0 # CJK UNIFIED IDEOGRAPH + \xEE\xD4 |0 # CJK UNIFIED IDEOGRAPH + \xEE\xD3 |0 # CJK UNIFIED IDEOGRAPH + \xBE\xFA |0 # CJK UNIFIED IDEOGRAPH + \xEE\xD5 |0 # CJK UNIFIED IDEOGRAPH + \xEE\xD6 |0 # CJK UNIFIED IDEOGRAPH + \xEE\xD7 |0 # CJK UNIFIED IDEOGRAPH + \xC8\xD0 |0 # CJK UNIFIED IDEOGRAPH + \xBA\xD3 |0 # CJK UNIFIED IDEOGRAPH + \xBC\xE1 |0 # CJK UNIFIED IDEOGRAPH + \xEE\xD8 |0 # CJK UNIFIED IDEOGRAPH + \xEE\xD9 |0 # CJK UNIFIED IDEOGRAPH + \xCE\xA4 |0 # CJK UNIFIED IDEOGRAPH + \xBD\xC5 |0 # CJK UNIFIED IDEOGRAPH + \xCC\xEE |0 # CJK UNIFIED IDEOGRAPH + \xCE\xCC |0 # CJK UNIFIED IDEOGRAPH + \xEE\xDA |0 # CJK UNIFIED IDEOGRAPH + \xB6\xE2 |0 # CJK UNIFIED IDEOGRAPH + \xEE\xDB |0 # CJK UNIFIED IDEOGRAPH + \xFC\xA1 |0 # CJK UNIFIED IDEOGRAPH + \xC5\xA3 |0 # CJK UNIFIED IDEOGRAPH + \xFB\xFE |0 # CJK UNIFIED IDEOGRAPH + \xEE\xDE |0 # CJK UNIFIED IDEOGRAPH + \xB3\xF8 |0 # CJK UNIFIED IDEOGRAPH + \xBF\xCB |0 # CJK UNIFIED IDEOGRAPH + \xFC\xA2 |0 # CJK UNIFIED IDEOGRAPH + \xEE\xDC |0 # CJK UNIFIED IDEOGRAPH + \xEE\xDD |0 # CJK UNIFIED IDEOGRAPH + \xC4\xE0 |0 # CJK UNIFIED IDEOGRAPH + \xFC\xA5 |0 # CJK UNIFIED IDEOGRAPH + \xFC\xA6 |0 # CJK UNIFIED IDEOGRAPH + \xCB\xD5 |0 # CJK UNIFIED IDEOGRAPH + \xB6\xFC |0 # CJK UNIFIED IDEOGRAPH + \xFC\xA3 |0 # CJK UNIFIED IDEOGRAPH + \xFC\xA4 |0 # CJK UNIFIED IDEOGRAPH + \xEE\xE0 |0 # CJK UNIFIED IDEOGRAPH + \xEE\xE1 |0 # CJK UNIFIED IDEOGRAPH + \xEE\xDF |0 # CJK UNIFIED IDEOGRAPH + \xEE\xE3 |0 # CJK UNIFIED IDEOGRAPH + \xFC\xA7 |0 # CJK UNIFIED IDEOGRAPH + \xFC\xA9 |0 # CJK UNIFIED IDEOGRAPH + \xC6\xDF |0 # CJK UNIFIED IDEOGRAPH + \xB3\xC3 |0 # CJK UNIFIED IDEOGRAPH + \xFC\xA8 |0 # CJK UNIFIED IDEOGRAPH + \xEE\xE7 |0 # CJK UNIFIED IDEOGRAPH + \xEE\xE4 |0 # CJK UNIFIED IDEOGRAPH + \xEE\xE6 |0 # CJK UNIFIED IDEOGRAPH + \xEE\xE2 |0 # CJK UNIFIED IDEOGRAPH + \xEF\xCF |0 # CJK UNIFIED IDEOGRAPH + \xEE\xE5 |0 # CJK UNIFIED IDEOGRAPH + \xCE\xEB |0 # CJK UNIFIED IDEOGRAPH + \xB8\xDA |0 # CJK UNIFIED IDEOGRAPH + \xFC\xB0 |0 # CJK UNIFIED IDEOGRAPH + \xFC\xAA |0 # CJK UNIFIED IDEOGRAPH + \xFC\xAC |0 # CJK UNIFIED IDEOGRAPH + \xEE\xEF |0 # CJK UNIFIED IDEOGRAPH + \xFC\xAB |0 # CJK UNIFIED IDEOGRAPH + \xC5\xB4 |0 # CJK UNIFIED IDEOGRAPH + \xEE\xEA |0 # CJK UNIFIED IDEOGRAPH + \xEE\xED |0 # CJK UNIFIED IDEOGRAPH + \xEE\xEB |0 # CJK UNIFIED IDEOGRAPH + \xEE\xF0 |0 # CJK UNIFIED IDEOGRAPH + \xFC\xAD |0 # CJK UNIFIED IDEOGRAPH + \xEE\xF1 |0 # CJK UNIFIED IDEOGRAPH + \xFC\xAF |0 # CJK UNIFIED IDEOGRAPH + \xEE\xE9 |0 # CJK UNIFIED IDEOGRAPH + \xFC\xAE |0 # CJK UNIFIED IDEOGRAPH + \xEE\xF6 |0 # CJK UNIFIED IDEOGRAPH + \xB1\xF4 |0 # CJK UNIFIED IDEOGRAPH + \xEE\xE8 |0 # CJK UNIFIED IDEOGRAPH + \xC8\xAD |0 # CJK UNIFIED IDEOGRAPH + \xEE\xEC |0 # CJK UNIFIED IDEOGRAPH + \xBE\xE0 |0 # CJK UNIFIED IDEOGRAPH + \xFC\xB1 |0 # CJK UNIFIED IDEOGRAPH + \xB9\xDB |0 # CJK UNIFIED IDEOGRAPH + \xFC\xB3 |0 # CJK UNIFIED IDEOGRAPH + \xFC\xB4 |0 # CJK UNIFIED IDEOGRAPH + \xCB\xC8 |0 # CJK UNIFIED IDEOGRAPH + \xB6\xE4 |0 # CJK UNIFIED IDEOGRAPH + \xBD\xC6 |0 # CJK UNIFIED IDEOGRAPH + \xC6\xBC |0 # CJK UNIFIED IDEOGRAPH + \xF9\xA4 |0 # CJK UNIFIED IDEOGRAPH + \xC1\xAD |0 # CJK UNIFIED IDEOGRAPH + \xEE\xF4 |0 # CJK UNIFIED IDEOGRAPH + \xEE\xEE |0 # CJK UNIFIED IDEOGRAPH + \xEE\xF3 |0 # CJK UNIFIED IDEOGRAPH + \xCC\xC3 |0 # CJK UNIFIED IDEOGRAPH + \xC4\xB8 |0 # CJK UNIFIED IDEOGRAPH + \xEE\xF5 |0 # CJK UNIFIED IDEOGRAPH + \xEE\xF2 |0 # CJK UNIFIED IDEOGRAPH + \xFC\xB2 |0 # CJK UNIFIED IDEOGRAPH + \xC1\xAC |0 # CJK UNIFIED IDEOGRAPH + \xEE\xF9 |0 # CJK UNIFIED IDEOGRAPH + \xEE\xF8 |0 # CJK UNIFIED IDEOGRAPH + \xEE\xF7 |0 # CJK UNIFIED IDEOGRAPH + \xFC\xB8 |0 # CJK UNIFIED IDEOGRAPH + \xCB\xAF |0 # CJK UNIFIED IDEOGRAPH + \xFC\xBC |0 # CJK UNIFIED IDEOGRAPH + \xFC\xBA |0 # CJK UNIFIED IDEOGRAPH + \xFC\xB6 |0 # CJK UNIFIED IDEOGRAPH + \xFC\xB7 |0 # CJK UNIFIED IDEOGRAPH + \xFC\xBB |0 # CJK UNIFIED IDEOGRAPH + \xBD\xFB |0 # CJK UNIFIED IDEOGRAPH + \xFC\xB5 |0 # CJK UNIFIED IDEOGRAPH + \xEE\xFA |0 # CJK UNIFIED IDEOGRAPH + \xCA\xDF |0 # CJK UNIFIED IDEOGRAPH + \xB1\xD4 |0 # CJK UNIFIED IDEOGRAPH + \xC9\xC6 |0 # CJK UNIFIED IDEOGRAPH + \xC3\xF2 |0 # CJK UNIFIED IDEOGRAPH + \xB5\xF8 |0 # CJK UNIFIED IDEOGRAPH + \xF9\xAA |0 # CJK UNIFIED IDEOGRAPH + \xEE\xFC |0 # CJK UNIFIED IDEOGRAPH + \xFC\xBF |0 # CJK UNIFIED IDEOGRAPH + \xB9\xDD |0 # CJK UNIFIED IDEOGRAPH + \xFC\xC2 |0 # CJK UNIFIED IDEOGRAPH + \xFC\xC4 |0 # CJK UNIFIED IDEOGRAPH + \xBB\xAC |0 # CJK UNIFIED IDEOGRAPH + \xEE\xFB |0 # CJK UNIFIED IDEOGRAPH + \xBF\xED |0 # CJK UNIFIED IDEOGRAPH + \xBF\xEE |0 # CJK UNIFIED IDEOGRAPH + \xEF\xA1 |0 # CJK UNIFIED IDEOGRAPH + \xEF\xA3 |0 # CJK UNIFIED IDEOGRAPH + \xFC\xC3 |0 # CJK UNIFIED IDEOGRAPH + \xFC\xC1 |0 # CJK UNIFIED IDEOGRAPH + \xBE\xFB |0 # CJK UNIFIED IDEOGRAPH + \xFC\xBE |0 # CJK UNIFIED IDEOGRAPH + \xEF\xA2 |0 # CJK UNIFIED IDEOGRAPH + \xEF\xA4 |0 # CJK UNIFIED IDEOGRAPH + \xFC\xBD |0 # CJK UNIFIED IDEOGRAPH + \xB6\xD3 |0 # CJK UNIFIED IDEOGRAPH + \xC9\xC5 |0 # CJK UNIFIED IDEOGRAPH + \xBC\xE2 |0 # CJK UNIFIED IDEOGRAPH + \xCF\xA3 |0 # CJK UNIFIED IDEOGRAPH + \xEE\xFE |0 # CJK UNIFIED IDEOGRAPH + \xBA\xF8 |0 # CJK UNIFIED IDEOGRAPH + \xCF\xBF |0 # CJK UNIFIED IDEOGRAPH + \xEF\xA6 |0 # CJK UNIFIED IDEOGRAPH + \xEF\xA5 |0 # CJK UNIFIED IDEOGRAPH + \xEF\xA7 |0 # CJK UNIFIED IDEOGRAPH + \xEE\xFD |0 # CJK UNIFIED IDEOGRAPH + \xF9\xA3 |0 # CJK UNIFIED IDEOGRAPH + \xC6\xE9 |0 # CJK UNIFIED IDEOGRAPH + \xC5\xD5 |0 # CJK UNIFIED IDEOGRAPH + \xC4\xD7 |0 # CJK UNIFIED IDEOGRAPH + \xEF\xAC |0 # CJK UNIFIED IDEOGRAPH + \xFC\xC6 |0 # CJK UNIFIED IDEOGRAPH + \xC3\xC3 |0 # CJK UNIFIED IDEOGRAPH + \xEF\xA8 |0 # CJK UNIFIED IDEOGRAPH + \xEF\xA9 |0 # CJK UNIFIED IDEOGRAPH + \xB7\xAD |0 # CJK UNIFIED IDEOGRAPH + \xEF\xAB |0 # CJK UNIFIED IDEOGRAPH + \xFC\xC5 |0 # CJK UNIFIED IDEOGRAPH + \xB8\xB0 |0 # CJK UNIFIED IDEOGRAPH + \xEF\xAA |0 # CJK UNIFIED IDEOGRAPH + \xBE\xE1 |0 # CJK UNIFIED IDEOGRAPH + \xB3\xF9 |0 # CJK UNIFIED IDEOGRAPH + \xEF\xB0 |0 # CJK UNIFIED IDEOGRAPH + \xBA\xBF |0 # CJK UNIFIED IDEOGRAPH + \xC1\xF9 |0 # CJK UNIFIED IDEOGRAPH + \xC4\xCA |0 # CJK UNIFIED IDEOGRAPH + \xFC\xC7 |0 # CJK UNIFIED IDEOGRAPH + \xB3\xBB |0 # CJK UNIFIED IDEOGRAPH + \xEF\xAE |0 # CJK UNIFIED IDEOGRAPH + \xEF\xAF |0 # CJK UNIFIED IDEOGRAPH + \xC4\xC3 |0 # CJK UNIFIED IDEOGRAPH + \xEF\xAD |0 # CJK UNIFIED IDEOGRAPH + \xEF\xB1 |0 # CJK UNIFIED IDEOGRAPH + \xEF\xB7 |0 # CJK UNIFIED IDEOGRAPH + \xFC\xC8 |0 # CJK UNIFIED IDEOGRAPH + \xEF\xBA |0 # CJK UNIFIED IDEOGRAPH + \xEF\xB9 |0 # CJK UNIFIED IDEOGRAPH + \xC5\xAD |0 # CJK UNIFIED IDEOGRAPH + \xEF\xB2 |0 # CJK UNIFIED IDEOGRAPH + \xEF\xB3 |0 # CJK UNIFIED IDEOGRAPH + \xEF\xB6 |0 # CJK UNIFIED IDEOGRAPH + \xEF\xB8 |0 # CJK UNIFIED IDEOGRAPH + \xFC\xC9 |0 # CJK UNIFIED IDEOGRAPH + \xB6\xC0 |0 # CJK UNIFIED IDEOGRAPH + \xEF\xBB |0 # CJK UNIFIED IDEOGRAPH + \xEF\xB5 |0 # CJK UNIFIED IDEOGRAPH + \xEF\xB4 |0 # CJK UNIFIED IDEOGRAPH + \xFC\xCA |0 # CJK UNIFIED IDEOGRAPH + \xEF\xBF |0 # CJK UNIFIED IDEOGRAPH + \xEF\xC0 |0 # CJK UNIFIED IDEOGRAPH + \xEF\xC1 |0 # CJK UNIFIED IDEOGRAPH + \xEF\xBE |0 # CJK UNIFIED IDEOGRAPH + \xEF\xBD |0 # CJK UNIFIED IDEOGRAPH + \xBE\xE2 |0 # CJK UNIFIED IDEOGRAPH + \xC6\xAA |0 # CJK UNIFIED IDEOGRAPH + \xEF\xBC |0 # CJK UNIFIED IDEOGRAPH + \xEF\xC5 |0 # CJK UNIFIED IDEOGRAPH + \xEF\xC3 |0 # CJK UNIFIED IDEOGRAPH + \xFC\xCB |0 # CJK UNIFIED IDEOGRAPH + \xEF\xC4 |0 # CJK UNIFIED IDEOGRAPH + \xEF\xC2 |0 # CJK UNIFIED IDEOGRAPH + \xC2\xF8 |0 # CJK UNIFIED IDEOGRAPH + \xEF\xC6 |0 # CJK UNIFIED IDEOGRAPH + \xEF\xC7 |0 # CJK UNIFIED IDEOGRAPH + \xEF\xC9 |0 # CJK UNIFIED IDEOGRAPH + \xFC\xCC |0 # CJK UNIFIED IDEOGRAPH + \xFC\xCD |0 # CJK UNIFIED IDEOGRAPH + \xB4\xD5 |0 # CJK UNIFIED IDEOGRAPH + \xEF\xC8 |0 # CJK UNIFIED IDEOGRAPH + \xCC\xFA |0 # CJK UNIFIED IDEOGRAPH + \xEF\xD4 |0 # CJK UNIFIED IDEOGRAPH + \xEF\xCA |0 # CJK UNIFIED IDEOGRAPH + \xEF\xCD |0 # CJK UNIFIED IDEOGRAPH + \xEF\xCB |0 # CJK UNIFIED IDEOGRAPH + \xEF\xCC |0 # CJK UNIFIED IDEOGRAPH + \xEF\xCE |0 # CJK UNIFIED IDEOGRAPH + \xEF\xD0 |0 # CJK UNIFIED IDEOGRAPH + \xEF\xD1 |0 # CJK UNIFIED IDEOGRAPH + \xEF\xD2 |0 # CJK UNIFIED IDEOGRAPH + \xEF\xD5 |0 # CJK UNIFIED IDEOGRAPH + \xEF\xD3 |0 # CJK UNIFIED IDEOGRAPH + \xEF\xD6 |0 # CJK UNIFIED IDEOGRAPH + \xEF\xD8 |0 # CJK UNIFIED IDEOGRAPH + \xEF\xD7 |0 # CJK UNIFIED IDEOGRAPH + \xC4\xB9 |0 # CJK UNIFIED IDEOGRAPH + \xCC\xE7 |0 # CJK UNIFIED IDEOGRAPH + \xEF\xD9 |0 # CJK UNIFIED IDEOGRAPH + \xC1\xAE |0 # CJK UNIFIED IDEOGRAPH + \xEF\xDA |0 # CJK UNIFIED IDEOGRAPH + \xCA\xC4 |0 # CJK UNIFIED IDEOGRAPH + \xEF\xDB |0 # CJK UNIFIED IDEOGRAPH + \xB3\xAB |0 # CJK UNIFIED IDEOGRAPH + \xB1\xBC |0 # CJK UNIFIED IDEOGRAPH + \xB4\xD7 |0 # CJK UNIFIED IDEOGRAPH + \xFC\xCE |0 # CJK UNIFIED IDEOGRAPH + \xB4\xD6 |0 # CJK UNIFIED IDEOGRAPH + \xEF\xDC |0 # CJK UNIFIED IDEOGRAPH + \xEF\xDD |0 # CJK UNIFIED IDEOGRAPH + \xEF\xDE |0 # CJK UNIFIED IDEOGRAPH + \xEF\xDF |0 # CJK UNIFIED IDEOGRAPH + \xEF\xE0 |0 # CJK UNIFIED IDEOGRAPH + \xB4\xD8 |0 # CJK UNIFIED IDEOGRAPH + \xB3\xD5 |0 # CJK UNIFIED IDEOGRAPH + \xB9\xDE |0 # CJK UNIFIED IDEOGRAPH + \xC8\xB6 |0 # CJK UNIFIED IDEOGRAPH + \xEF\xE2 |0 # CJK UNIFIED IDEOGRAPH + \xEF\xE1 |0 # CJK UNIFIED IDEOGRAPH + \xEF\xE3 |0 # CJK UNIFIED IDEOGRAPH + \xB1\xDC |0 # CJK UNIFIED IDEOGRAPH + \xEF\xE6 |0 # CJK UNIFIED IDEOGRAPH + \xEF\xE5 |0 # CJK UNIFIED IDEOGRAPH + \xEF\xE4 |0 # CJK UNIFIED IDEOGRAPH + \xEF\xE7 |0 # CJK UNIFIED IDEOGRAPH + \xEF\xEA |0 # CJK UNIFIED IDEOGRAPH + \xB0\xC7 |0 # CJK UNIFIED IDEOGRAPH + \xEF\xE8 |0 # CJK UNIFIED IDEOGRAPH + \xEF\xEC |0 # CJK UNIFIED IDEOGRAPH + \xEF\xEB |0 # CJK UNIFIED IDEOGRAPH + \xEF\xEE |0 # CJK UNIFIED IDEOGRAPH + \xEF\xED |0 # CJK UNIFIED IDEOGRAPH + \xEF\xEF |0 # CJK UNIFIED IDEOGRAPH + \xC6\xAE |0 # CJK UNIFIED IDEOGRAPH + \xEF\xF0 |0 # CJK UNIFIED IDEOGRAPH + \xEF\xF1 |0 # CJK UNIFIED IDEOGRAPH + \xEF\xF3 |0 # CJK UNIFIED IDEOGRAPH + \xEF\xF2 |0 # CJK UNIFIED IDEOGRAPH + \xC9\xEC |0 # CJK UNIFIED IDEOGRAPH + \xEF\xF4 |0 # CJK UNIFIED IDEOGRAPH + \xEF\xF5 |0 # CJK UNIFIED IDEOGRAPH + \xBA\xE5 |0 # CJK UNIFIED IDEOGRAPH + \xEF\xF6 |0 # CJK UNIFIED IDEOGRAPH + \xEF\xF7 |0 # CJK UNIFIED IDEOGRAPH + \xCB\xC9 |0 # CJK UNIFIED IDEOGRAPH + \xC1\xCB |0 # CJK UNIFIED IDEOGRAPH + \xB0\xA4 |0 # CJK UNIFIED IDEOGRAPH + \xC2\xCB |0 # CJK UNIFIED IDEOGRAPH + \xEF\xF8 |0 # CJK UNIFIED IDEOGRAPH + \xC9\xED |0 # CJK UNIFIED IDEOGRAPH + \xEF\xFB |0 # CJK UNIFIED IDEOGRAPH + \xEF\xF9 |0 # CJK UNIFIED IDEOGRAPH + \xB9\xDF |0 # CJK UNIFIED IDEOGRAPH + \xEF\xFA |0 # CJK UNIFIED IDEOGRAPH + \xB8\xC2 |0 # CJK UNIFIED IDEOGRAPH + \xCA\xC5 |0 # CJK UNIFIED IDEOGRAPH + \xEF\xFD |0 # CJK UNIFIED IDEOGRAPH + \xF0\xA1 |0 # CJK UNIFIED IDEOGRAPH + \xEF\xFE |0 # CJK UNIFIED IDEOGRAPH + \xF0\xA2 |0 # CJK UNIFIED IDEOGRAPH + \xB1\xA1 |0 # CJK UNIFIED IDEOGRAPH + \xBF\xD8 |0 # CJK UNIFIED IDEOGRAPH + \xBD\xFC |0 # CJK UNIFIED IDEOGRAPH + \xB4\xD9 |0 # CJK UNIFIED IDEOGRAPH + \xF0\xA3 |0 # CJK UNIFIED IDEOGRAPH + \xC7\xE6 |0 # CJK UNIFIED IDEOGRAPH + \xF0\xA5 |0 # CJK UNIFIED IDEOGRAPH + \xB1\xA2 |0 # CJK UNIFIED IDEOGRAPH + \xF0\xA4 |0 # CJK UNIFIED IDEOGRAPH + \xC4\xC4 |0 # CJK UNIFIED IDEOGRAPH + \xCE\xCD |0 # CJK UNIFIED IDEOGRAPH + \xC6\xAB |0 # CJK UNIFIED IDEOGRAPH + \xEF\xFC |0 # CJK UNIFIED IDEOGRAPH + \xCE\xA6 |0 # CJK UNIFIED IDEOGRAPH + \xB8\xB1 |0 # CJK UNIFIED IDEOGRAPH + \xCD\xDB |0 # CJK UNIFIED IDEOGRAPH + \xB6\xF9 |0 # CJK UNIFIED IDEOGRAPH + \xCE\xB4 |0 # CJK UNIFIED IDEOGRAPH + \xB7\xA8 |0 # CJK UNIFIED IDEOGRAPH + \xC2\xE2 |0 # CJK UNIFIED IDEOGRAPH + \xE7\xA1 |0 # CJK UNIFIED IDEOGRAPH + \xF0\xA6 |0 # CJK UNIFIED IDEOGRAPH + \xB3\xAC |0 # CJK UNIFIED IDEOGRAPH + \xBF\xEF |0 # CJK UNIFIED IDEOGRAPH + \xB3\xD6 |0 # CJK UNIFIED IDEOGRAPH + \xF0\xA8 |0 # CJK UNIFIED IDEOGRAPH + \xF0\xA9 |0 # CJK UNIFIED IDEOGRAPH + \xF0\xA7 |0 # CJK UNIFIED IDEOGRAPH + \xB7\xE4 |0 # CJK UNIFIED IDEOGRAPH + \xBA\xDD |0 # CJK UNIFIED IDEOGRAPH + \xBE\xE3 |0 # CJK UNIFIED IDEOGRAPH + \xFC\xD1 |0 # CJK UNIFIED IDEOGRAPH + \xB1\xA3 |0 # CJK UNIFIED IDEOGRAPH + \xCE\xD9 |0 # CJK UNIFIED IDEOGRAPH + \xF0\xAB |0 # CJK UNIFIED IDEOGRAPH + \xEE\xAE |0 # CJK UNIFIED IDEOGRAPH + \xF0\xAA |0 # CJK UNIFIED IDEOGRAPH + \xFC\xD2 |0 # CJK UNIFIED IDEOGRAPH + \xF0\xAE |0 # CJK UNIFIED IDEOGRAPH + \xF0\xAC |0 # CJK UNIFIED IDEOGRAPH + \xF0\xAD |0 # CJK UNIFIED IDEOGRAPH + \xF0\xAF |0 # CJK UNIFIED IDEOGRAPH + \xF0\xB0 |0 # CJK UNIFIED IDEOGRAPH + \xCE\xEC |0 # CJK UNIFIED IDEOGRAPH + \xF0\xB1 |0 # CJK UNIFIED IDEOGRAPH + \xF0\xB2 |0 # CJK UNIFIED IDEOGRAPH + \xC0\xC9 |0 # CJK UNIFIED IDEOGRAPH + \xC8\xBB |0 # CJK UNIFIED IDEOGRAPH + \xBF\xFD |0 # CJK UNIFIED IDEOGRAPH + \xB4\xE7 |0 # CJK UNIFIED IDEOGRAPH + \xCD\xBA |0 # CJK UNIFIED IDEOGRAPH + \xB2\xED |0 # CJK UNIFIED IDEOGRAPH + \xBD\xB8 |0 # CJK UNIFIED IDEOGRAPH + \xB8\xDB |0 # CJK UNIFIED IDEOGRAPH + \xF0\xB5 |0 # CJK UNIFIED IDEOGRAPH + \xF0\xB4 |0 # CJK UNIFIED IDEOGRAPH + \xBB\xF3 |0 # CJK UNIFIED IDEOGRAPH + \xF0\xB6 |0 # CJK UNIFIED IDEOGRAPH + \xF0\xB3 |0 # CJK UNIFIED IDEOGRAPH + \xBB\xA8 |0 # CJK UNIFIED IDEOGRAPH + \xF0\xBA |0 # CJK UNIFIED IDEOGRAPH + \xEA\xAD |0 # CJK UNIFIED IDEOGRAPH + \xD2\xD6 |0 # CJK UNIFIED IDEOGRAPH + \xBF\xF7 |0 # CJK UNIFIED IDEOGRAPH + \xF0\xB8 |0 # CJK UNIFIED IDEOGRAPH + \xCE\xA5 |0 # CJK UNIFIED IDEOGRAPH + \xC6\xF1 |0 # CJK UNIFIED IDEOGRAPH + \xB1\xAB |0 # CJK UNIFIED IDEOGRAPH + \xC0\xE3 |0 # CJK UNIFIED IDEOGRAPH + \xBC\xB6 |0 # CJK UNIFIED IDEOGRAPH + \xCA\xB7 |0 # CJK UNIFIED IDEOGRAPH + \xB1\xC0 |0 # CJK UNIFIED IDEOGRAPH + \xCE\xED |0 # CJK UNIFIED IDEOGRAPH + \xCD\xEB |0 # CJK UNIFIED IDEOGRAPH + \xF0\xBB |0 # CJK UNIFIED IDEOGRAPH + \xC5\xC5 |0 # CJK UNIFIED IDEOGRAPH + \xBC\xFB |0 # CJK UNIFIED IDEOGRAPH + \xF0\xBC |0 # CJK UNIFIED IDEOGRAPH + \xF0\xBD |0 # CJK UNIFIED IDEOGRAPH + \xBF\xCC |0 # CJK UNIFIED IDEOGRAPH + \xF0\xBE |0 # CJK UNIFIED IDEOGRAPH + \xCE\xEE |0 # CJK UNIFIED IDEOGRAPH + \xF0\xB9 |0 # CJK UNIFIED IDEOGRAPH + \xF0\xC0 |0 # CJK UNIFIED IDEOGRAPH + \xF0\xC2 |0 # CJK UNIFIED IDEOGRAPH + \xF0\xC1 |0 # CJK UNIFIED IDEOGRAPH + \xF0\xBF |0 # CJK UNIFIED IDEOGRAPH + \xF0\xC3 |0 # CJK UNIFIED IDEOGRAPH + \xF0\xC4 |0 # CJK UNIFIED IDEOGRAPH + \xC1\xFA |0 # CJK UNIFIED IDEOGRAPH + \xB2\xE2 |0 # CJK UNIFIED IDEOGRAPH + \xF0\xC5 |0 # CJK UNIFIED IDEOGRAPH + \xCC\xB8 |0 # CJK UNIFIED IDEOGRAPH + \xF0\xC6 |0 # CJK UNIFIED IDEOGRAPH + \xF0\xC7 |0 # CJK UNIFIED IDEOGRAPH + \xCF\xAA |0 # CJK UNIFIED IDEOGRAPH + \xFC\xD3 |0 # CJK UNIFIED IDEOGRAPH + \xDB\xB1 |0 # CJK UNIFIED IDEOGRAPH + \xF0\xC8 |0 # CJK UNIFIED IDEOGRAPH + \xFC\xD4 |0 # CJK UNIFIED IDEOGRAPH + \xF0\xC9 |0 # CJK UNIFIED IDEOGRAPH + \xF0\xCA |0 # CJK UNIFIED IDEOGRAPH + \xF0\xCE |0 # CJK UNIFIED IDEOGRAPH + \xFC\xD5 |0 # CJK UNIFIED IDEOGRAPH + \xF0\xCB |0 # CJK UNIFIED IDEOGRAPH + \xF0\xCC |0 # CJK UNIFIED IDEOGRAPH + \xF0\xCD |0 # CJK UNIFIED IDEOGRAPH + \xF0\xCF |0 # CJK UNIFIED IDEOGRAPH + \xFC\xD6 |0 # CJK UNIFIED IDEOGRAPH + \xFC\xD7 |0 # CJK UNIFIED IDEOGRAPH + \xFC\xD8 |0 # CJK UNIFIED IDEOGRAPH + \xC0\xC4 |0 # CJK UNIFIED IDEOGRAPH + \xFC\xD9 |0 # CJK UNIFIED IDEOGRAPH + \xCC\xF7 |0 # CJK UNIFIED IDEOGRAPH + \xC0\xC5 |0 # CJK UNIFIED IDEOGRAPH + \xF0\xD0 |0 # CJK UNIFIED IDEOGRAPH + \xC8\xF3 |0 # CJK UNIFIED IDEOGRAPH + \xF0\xD1 |0 # CJK UNIFIED IDEOGRAPH + \xF3\xD3 |0 # CJK UNIFIED IDEOGRAPH + \xCC\xCC |0 # CJK UNIFIED IDEOGRAPH + \xF0\xD2 |0 # CJK UNIFIED IDEOGRAPH + \xF0\xD3 |0 # CJK UNIFIED IDEOGRAPH + \xF0\xD4 |0 # CJK UNIFIED IDEOGRAPH + \xB3\xD7 |0 # CJK UNIFIED IDEOGRAPH + \xF0\xD6 |0 # CJK UNIFIED IDEOGRAPH + \xBF\xD9 |0 # CJK UNIFIED IDEOGRAPH + \xF0\xD7 |0 # CJK UNIFIED IDEOGRAPH + \xB7\xA4 |0 # CJK UNIFIED IDEOGRAPH + \xF0\xD8 |0 # CJK UNIFIED IDEOGRAPH + \xF0\xDC |0 # CJK UNIFIED IDEOGRAPH + \xF0\xDA |0 # CJK UNIFIED IDEOGRAPH + \xF0\xDB |0 # CJK UNIFIED IDEOGRAPH + \xB3\xF3 |0 # CJK UNIFIED IDEOGRAPH + \xF0\xD9 |0 # CJK UNIFIED IDEOGRAPH + \xF0\xDD |0 # CJK UNIFIED IDEOGRAPH + \xF0\xDE |0 # CJK UNIFIED IDEOGRAPH + \xB0\xC8 |0 # CJK UNIFIED IDEOGRAPH + \xF0\xDF |0 # CJK UNIFIED IDEOGRAPH + \xF0\xE0 |0 # CJK UNIFIED IDEOGRAPH + \xBE\xE4 |0 # CJK UNIFIED IDEOGRAPH + \xF0\xE1 |0 # CJK UNIFIED IDEOGRAPH + \xB5\xC7 |0 # CJK UNIFIED IDEOGRAPH + \xF0\xE4 |0 # CJK UNIFIED IDEOGRAPH + \xF0\xE3 |0 # CJK UNIFIED IDEOGRAPH + \xF0\xE2 |0 # CJK UNIFIED IDEOGRAPH + \xEB\xF1 |0 # CJK UNIFIED IDEOGRAPH + \xCA\xDC |0 # CJK UNIFIED IDEOGRAPH + \xF0\xE5 |0 # CJK UNIFIED IDEOGRAPH + \xF0\xE6 |0 # CJK UNIFIED IDEOGRAPH + \xF0\xE7 |0 # CJK UNIFIED IDEOGRAPH + \xF0\xE8 |0 # CJK UNIFIED IDEOGRAPH + \xF0\xE9 |0 # CJK UNIFIED IDEOGRAPH + \xF0\xEA |0 # CJK UNIFIED IDEOGRAPH + \xB4\xDA |0 # CJK UNIFIED IDEOGRAPH + \xF0\xEB |0 # CJK UNIFIED IDEOGRAPH + \xF0\xEC |0 # CJK UNIFIED IDEOGRAPH + \xC7\xA3 |0 # CJK UNIFIED IDEOGRAPH + \xF0\xEE |0 # CJK UNIFIED IDEOGRAPH + \xB2\xBB |0 # CJK UNIFIED IDEOGRAPH + \xF0\xF1 |0 # CJK UNIFIED IDEOGRAPH + \xF0\xF0 |0 # CJK UNIFIED IDEOGRAPH + \xB1\xA4 |0 # CJK UNIFIED IDEOGRAPH + \xB6\xC1 |0 # CJK UNIFIED IDEOGRAPH + \xCA\xC7 |0 # CJK UNIFIED IDEOGRAPH + \xC4\xBA |0 # CJK UNIFIED IDEOGRAPH + \xBA\xA2 |0 # CJK UNIFIED IDEOGRAPH + \xB9\xE0 |0 # CJK UNIFIED IDEOGRAPH + \xBD\xE7 |0 # CJK UNIFIED IDEOGRAPH + \xBF\xDC |0 # CJK UNIFIED IDEOGRAPH + \xF0\xF3 |0 # CJK UNIFIED IDEOGRAPH + \xF0\xF2 |0 # CJK UNIFIED IDEOGRAPH + \xCD\xC2 |0 # CJK UNIFIED IDEOGRAPH + \xB4\xE8 |0 # CJK UNIFIED IDEOGRAPH + \xC8\xD2 |0 # CJK UNIFIED IDEOGRAPH + \xC6\xDC |0 # CJK UNIFIED IDEOGRAPH + \xBF\xFC |0 # CJK UNIFIED IDEOGRAPH + \xCE\xCE |0 # CJK UNIFIED IDEOGRAPH + \xB7\xDB |0 # CJK UNIFIED IDEOGRAPH + \xF0\xF6 |0 # CJK UNIFIED IDEOGRAPH + \xF0\xF5 |0 # CJK UNIFIED IDEOGRAPH + \xCB\xCB |0 # CJK UNIFIED IDEOGRAPH + \xC6\xAC |0 # CJK UNIFIED IDEOGRAPH + \xB1\xD0 |0 # CJK UNIFIED IDEOGRAPH + \xF0\xF7 |0 # CJK UNIFIED IDEOGRAPH + \xF0\xF4 |0 # CJK UNIFIED IDEOGRAPH + \xC9\xD1 |0 # CJK UNIFIED IDEOGRAPH + \xCD\xEA |0 # CJK UNIFIED IDEOGRAPH + \xF0\xF8 |0 # CJK UNIFIED IDEOGRAPH + \xF0\xF9 |0 # CJK UNIFIED IDEOGRAPH + \xF0\xFB |0 # CJK UNIFIED IDEOGRAPH + \xC2\xEA |0 # CJK UNIFIED IDEOGRAPH + \xB3\xDB |0 # CJK UNIFIED IDEOGRAPH + \xB3\xDC |0 # CJK UNIFIED IDEOGRAPH + \xF0\xFA |0 # CJK UNIFIED IDEOGRAPH + \xB4\xE9 |0 # CJK UNIFIED IDEOGRAPH + \xB8\xB2 |0 # CJK UNIFIED IDEOGRAPH + \xFC\xDA |0 # CJK UNIFIED IDEOGRAPH + \xB4\xEA |0 # CJK UNIFIED IDEOGRAPH + \xC5\xBF |0 # CJK UNIFIED IDEOGRAPH + \xCE\xE0 |0 # CJK UNIFIED IDEOGRAPH + \xFC\xDB |0 # CJK UNIFIED IDEOGRAPH + \xB8\xDC |0 # CJK UNIFIED IDEOGRAPH + \xF0\xFC |0 # CJK UNIFIED IDEOGRAPH + \xF0\xFD |0 # CJK UNIFIED IDEOGRAPH + \xF0\xFE |0 # CJK UNIFIED IDEOGRAPH + \xF1\xA1 |0 # CJK UNIFIED IDEOGRAPH + \xF1\xA3 |0 # CJK UNIFIED IDEOGRAPH + \xF1\xA2 |0 # CJK UNIFIED IDEOGRAPH + \xC9\xF7 |0 # CJK UNIFIED IDEOGRAPH + \xF1\xA4 |0 # CJK UNIFIED IDEOGRAPH + \xF1\xA5 |0 # CJK UNIFIED IDEOGRAPH + \xF1\xA6 |0 # CJK UNIFIED IDEOGRAPH + \xF1\xA7 |0 # CJK UNIFIED IDEOGRAPH + \xF1\xA9 |0 # CJK UNIFIED IDEOGRAPH + \xF1\xA8 |0 # CJK UNIFIED IDEOGRAPH + \xF1\xAA |0 # CJK UNIFIED IDEOGRAPH + \xC8\xF4 |0 # CJK UNIFIED IDEOGRAPH + \xE6\xCC |0 # CJK UNIFIED IDEOGRAPH + \xBF\xA9 |0 # CJK UNIFIED IDEOGRAPH + \xB5\xB2 |0 # CJK UNIFIED IDEOGRAPH + \xF1\xAB |0 # CJK UNIFIED IDEOGRAPH + \xF1\xAC |0 # CJK UNIFIED IDEOGRAPH + \xD2\xAC |0 # CJK UNIFIED IDEOGRAPH + \xDD\xBB |0 # CJK UNIFIED IDEOGRAPH + \xC8\xD3 |0 # CJK UNIFIED IDEOGRAPH + \xB0\xFB |0 # CJK UNIFIED IDEOGRAPH + \xB0\xBB |0 # CJK UNIFIED IDEOGRAPH + \xBB\xF4 |0 # CJK UNIFIED IDEOGRAPH + \xCB\xB0 |0 # CJK UNIFIED IDEOGRAPH + \xBE\xFE |0 # CJK UNIFIED IDEOGRAPH + \xF1\xAD |0 # CJK UNIFIED IDEOGRAPH + \xCC\xDF |0 # CJK UNIFIED IDEOGRAPH + \xF1\xAE |0 # CJK UNIFIED IDEOGRAPH + \xCD\xDC |0 # CJK UNIFIED IDEOGRAPH + \xB1\xC2 |0 # CJK UNIFIED IDEOGRAPH + \xBB\xC1 |0 # CJK UNIFIED IDEOGRAPH + \xF1\xAF |0 # CJK UNIFIED IDEOGRAPH + \xB2\xEE |0 # CJK UNIFIED IDEOGRAPH + \xF1\xB0 |0 # CJK UNIFIED IDEOGRAPH + \xF1\xB1 |0 # CJK UNIFIED IDEOGRAPH + \xF1\xB3 |0 # CJK UNIFIED IDEOGRAPH + \xF1\xB4 |0 # CJK UNIFIED IDEOGRAPH + \xF1\xB6 |0 # CJK UNIFIED IDEOGRAPH + \xF1\xB2 |0 # CJK UNIFIED IDEOGRAPH + \xF1\xB5 |0 # CJK UNIFIED IDEOGRAPH + \xFC\xDE |0 # CJK UNIFIED IDEOGRAPH + \xB4\xDB |0 # CJK UNIFIED IDEOGRAPH + \xF1\xB7 |0 # CJK UNIFIED IDEOGRAPH + \xF1\xB8 |0 # CJK UNIFIED IDEOGRAPH + \xF1\xB9 |0 # CJK UNIFIED IDEOGRAPH + \xF1\xBA |0 # CJK UNIFIED IDEOGRAPH + \xF1\xBB |0 # CJK UNIFIED IDEOGRAPH + \xF1\xBD |0 # CJK UNIFIED IDEOGRAPH + \xF1\xBC |0 # CJK UNIFIED IDEOGRAPH + \xF1\xBF |0 # CJK UNIFIED IDEOGRAPH + \xF1\xC2 |0 # CJK UNIFIED IDEOGRAPH + \xF1\xBE |0 # CJK UNIFIED IDEOGRAPH + \xF1\xC0 |0 # CJK UNIFIED IDEOGRAPH + \xF1\xC1 |0 # CJK UNIFIED IDEOGRAPH + \xF1\xC3 |0 # CJK UNIFIED IDEOGRAPH + \xB6\xC2 |0 # CJK UNIFIED IDEOGRAPH + \xBC\xF3 |0 # CJK UNIFIED IDEOGRAPH + \xF1\xC4 |0 # CJK UNIFIED IDEOGRAPH + \xF1\xC5 |0 # CJK UNIFIED IDEOGRAPH + \xB9\xE1 |0 # CJK UNIFIED IDEOGRAPH + \xFC\xE0 |0 # CJK UNIFIED IDEOGRAPH + \xF1\xC6 |0 # CJK UNIFIED IDEOGRAPH + \xB3\xBE |0 # CJK UNIFIED IDEOGRAPH + \xC7\xCF |0 # CJK UNIFIED IDEOGRAPH + \xF1\xC7 |0 # CJK UNIFIED IDEOGRAPH + \xF1\xC8 |0 # CJK UNIFIED IDEOGRAPH + \xC3\xDA |0 # CJK UNIFIED IDEOGRAPH + \xC6\xEB |0 # CJK UNIFIED IDEOGRAPH + \xF1\xC9 |0 # CJK UNIFIED IDEOGRAPH + \xC7\xFD |0 # CJK UNIFIED IDEOGRAPH + \xC2\xCC |0 # CJK UNIFIED IDEOGRAPH + \xB1\xD8 |0 # CJK UNIFIED IDEOGRAPH + \xB6\xEE |0 # CJK UNIFIED IDEOGRAPH + \xB6\xEF |0 # CJK UNIFIED IDEOGRAPH + \xC3\xF3 |0 # CJK UNIFIED IDEOGRAPH + \xF1\xCE |0 # CJK UNIFIED IDEOGRAPH + \xB6\xF0 |0 # CJK UNIFIED IDEOGRAPH + \xB2\xEF |0 # CJK UNIFIED IDEOGRAPH + \xF1\xCD |0 # CJK UNIFIED IDEOGRAPH + \xF1\xCB |0 # CJK UNIFIED IDEOGRAPH + \xF1\xCC |0 # CJK UNIFIED IDEOGRAPH + \xF1\xCA |0 # CJK UNIFIED IDEOGRAPH + \xF1\xD8 |0 # CJK UNIFIED IDEOGRAPH + \xF1\xCF |0 # CJK UNIFIED IDEOGRAPH + \xF1\xD0 |0 # CJK UNIFIED IDEOGRAPH + \xF1\xD1 |0 # CJK UNIFIED IDEOGRAPH + \xF1\xD2 |0 # CJK UNIFIED IDEOGRAPH + \xF1\xD4 |0 # CJK UNIFIED IDEOGRAPH + \xF1\xD3 |0 # CJK UNIFIED IDEOGRAPH + \xBD\xD9 |0 # CJK UNIFIED IDEOGRAPH + \xF1\xD5 |0 # CJK UNIFIED IDEOGRAPH + \xF1\xD7 |0 # CJK UNIFIED IDEOGRAPH + \xB5\xB3 |0 # CJK UNIFIED IDEOGRAPH + \xF1\xD6 |0 # CJK UNIFIED IDEOGRAPH + \xC1\xFB |0 # CJK UNIFIED IDEOGRAPH + \xB8\xB3 |0 # CJK UNIFIED IDEOGRAPH + \xF1\xD9 |0 # CJK UNIFIED IDEOGRAPH + \xC2\xCD |0 # CJK UNIFIED IDEOGRAPH + \xF1\xDA |0 # CJK UNIFIED IDEOGRAPH + \xC6\xAD |0 # CJK UNIFIED IDEOGRAPH + \xF1\xDB |0 # CJK UNIFIED IDEOGRAPH + \xF1\xE0 |0 # CJK UNIFIED IDEOGRAPH + \xF1\xDE |0 # CJK UNIFIED IDEOGRAPH + \xF1\xDD |0 # CJK UNIFIED IDEOGRAPH + \xF1\xDF |0 # CJK UNIFIED IDEOGRAPH + \xF1\xDC |0 # CJK UNIFIED IDEOGRAPH + \xF1\xE2 |0 # CJK UNIFIED IDEOGRAPH + \xFC\xE1 |0 # CJK UNIFIED IDEOGRAPH + \xF1\xE1 |0 # CJK UNIFIED IDEOGRAPH + \xF1\xE4 |0 # CJK UNIFIED IDEOGRAPH + \xB6\xC3 |0 # CJK UNIFIED IDEOGRAPH + \xF1\xE3 |0 # CJK UNIFIED IDEOGRAPH + \xF1\xE5 |0 # CJK UNIFIED IDEOGRAPH + \xF1\xE6 |0 # CJK UNIFIED IDEOGRAPH + \xF1\xE8 |0 # CJK UNIFIED IDEOGRAPH + \xF1\xE7 |0 # CJK UNIFIED IDEOGRAPH + \xF1\xE9 |0 # CJK UNIFIED IDEOGRAPH + \xF1\xEB |0 # CJK UNIFIED IDEOGRAPH + \xF1\xEA |0 # CJK UNIFIED IDEOGRAPH + \xB9\xFC |0 # CJK UNIFIED IDEOGRAPH + \xF1\xEC |0 # CJK UNIFIED IDEOGRAPH + \xF1\xED |0 # CJK UNIFIED IDEOGRAPH + \xB3\xBC |0 # CJK UNIFIED IDEOGRAPH + \xF1\xEE |0 # CJK UNIFIED IDEOGRAPH + \xF1\xEF |0 # CJK UNIFIED IDEOGRAPH + \xBF\xF1 |0 # CJK UNIFIED IDEOGRAPH + \xF1\xF0 |0 # CJK UNIFIED IDEOGRAPH + \xF1\xF1 |0 # CJK UNIFIED IDEOGRAPH + \xF1\xF2 |0 # CJK UNIFIED IDEOGRAPH + \xF1\xF3 |0 # CJK UNIFIED IDEOGRAPH + \xB9\xE2 |0 # CJK UNIFIED IDEOGRAPH + \xFC\xE2 |0 # CJK UNIFIED IDEOGRAPH + \xFC\xE3 |0 # CJK UNIFIED IDEOGRAPH + \xF1\xF4 |0 # CJK UNIFIED IDEOGRAPH + \xF1\xF5 |0 # CJK UNIFIED IDEOGRAPH + \xF1\xF6 |0 # CJK UNIFIED IDEOGRAPH + \xF1\xF7 |0 # CJK UNIFIED IDEOGRAPH + \xF1\xF8 |0 # CJK UNIFIED IDEOGRAPH + \xC8\xB1 |0 # CJK UNIFIED IDEOGRAPH + \xF1\xFA |0 # CJK UNIFIED IDEOGRAPH + \xC9\xA6 |0 # CJK UNIFIED IDEOGRAPH + \xF1\xFB |0 # CJK UNIFIED IDEOGRAPH + \xF1\xF9 |0 # CJK UNIFIED IDEOGRAPH + \xF1\xFD |0 # CJK UNIFIED IDEOGRAPH + \xF1\xFC |0 # CJK UNIFIED IDEOGRAPH + \xF1\xFE |0 # CJK UNIFIED IDEOGRAPH + \xF2\xA1 |0 # CJK UNIFIED IDEOGRAPH + \xF2\xA2 |0 # CJK UNIFIED IDEOGRAPH + \xF2\xA3 |0 # CJK UNIFIED IDEOGRAPH + \xF2\xA4 |0 # CJK UNIFIED IDEOGRAPH + \xF2\xA5 |0 # CJK UNIFIED IDEOGRAPH + \xF2\xA6 |0 # CJK UNIFIED IDEOGRAPH + \xF2\xA7 |0 # CJK UNIFIED IDEOGRAPH + \xF2\xA8 |0 # CJK UNIFIED IDEOGRAPH + \xF2\xA9 |0 # CJK UNIFIED IDEOGRAPH + \xF2\xAA |0 # CJK UNIFIED IDEOGRAPH + \xF2\xAB |0 # CJK UNIFIED IDEOGRAPH + \xF2\xAC |0 # CJK UNIFIED IDEOGRAPH + \xF2\xAD |0 # CJK UNIFIED IDEOGRAPH + \xF2\xAE |0 # CJK UNIFIED IDEOGRAPH + \xDD\xB5 |0 # CJK UNIFIED IDEOGRAPH + \xF2\xAF |0 # CJK UNIFIED IDEOGRAPH + \xE4\xF8 |0 # CJK UNIFIED IDEOGRAPH + \xB5\xB4 |0 # CJK UNIFIED IDEOGRAPH + \xB3\xA1 |0 # CJK UNIFIED IDEOGRAPH + \xBA\xB2 |0 # CJK UNIFIED IDEOGRAPH + \xF2\xB1 |0 # CJK UNIFIED IDEOGRAPH + \xF2\xB0 |0 # CJK UNIFIED IDEOGRAPH + \xCC\xA5 |0 # CJK UNIFIED IDEOGRAPH + \xF2\xB3 |0 # CJK UNIFIED IDEOGRAPH + \xF2\xB4 |0 # CJK UNIFIED IDEOGRAPH + \xF2\xB2 |0 # CJK UNIFIED IDEOGRAPH + \xF2\xB5 |0 # CJK UNIFIED IDEOGRAPH + \xCB\xE2 |0 # CJK UNIFIED IDEOGRAPH + \xF2\xB6 |0 # CJK UNIFIED IDEOGRAPH + \xB5\xFB |0 # CJK UNIFIED IDEOGRAPH + \xCF\xA5 |0 # CJK UNIFIED IDEOGRAPH + \xFC\xE5 |0 # CJK UNIFIED IDEOGRAPH + \xF2\xB7 |0 # CJK UNIFIED IDEOGRAPH + \xFC\xE4 |0 # CJK UNIFIED IDEOGRAPH + \xF2\xB9 |0 # CJK UNIFIED IDEOGRAPH + \xB0\xBE |0 # CJK UNIFIED IDEOGRAPH + \xFC\xE6 |0 # CJK UNIFIED IDEOGRAPH + \xF2\xBA |0 # CJK UNIFIED IDEOGRAPH + \xCA\xAB |0 # CJK UNIFIED IDEOGRAPH + \xF2\xB8 |0 # CJK UNIFIED IDEOGRAPH + \xF2\xBB |0 # CJK UNIFIED IDEOGRAPH + \xF2\xBC |0 # CJK UNIFIED IDEOGRAPH + \xF2\xBD |0 # CJK UNIFIED IDEOGRAPH + \xF2\xBE |0 # CJK UNIFIED IDEOGRAPH + \xF2\xBF |0 # CJK UNIFIED IDEOGRAPH + \xCB\xEE |0 # CJK UNIFIED IDEOGRAPH + \xBB\xAD |0 # CJK UNIFIED IDEOGRAPH + \xBA\xFA |0 # CJK UNIFIED IDEOGRAPH + \xC1\xAF |0 # CJK UNIFIED IDEOGRAPH + \xFC\xE7 |0 # CJK UNIFIED IDEOGRAPH + \xF2\xC0 |0 # CJK UNIFIED IDEOGRAPH + \xF2\xC3 |0 # CJK UNIFIED IDEOGRAPH + \xFC\xE8 |0 # CJK UNIFIED IDEOGRAPH + \xF2\xC1 |0 # CJK UNIFIED IDEOGRAPH + \xF2\xC4 |0 # CJK UNIFIED IDEOGRAPH + \xB8\xF1 |0 # CJK UNIFIED IDEOGRAPH + \xF2\xC2 |0 # CJK UNIFIED IDEOGRAPH + \xF2\xC5 |0 # CJK UNIFIED IDEOGRAPH + \xF2\xC6 |0 # CJK UNIFIED IDEOGRAPH + \xF2\xC7 |0 # CJK UNIFIED IDEOGRAPH + \xF2\xCB |0 # CJK UNIFIED IDEOGRAPH + \xBB\xAA |0 # CJK UNIFIED IDEOGRAPH + \xC2\xE4 |0 # CJK UNIFIED IDEOGRAPH + \xF2\xCC |0 # CJK UNIFIED IDEOGRAPH + \xF2\xC9 |0 # CJK UNIFIED IDEOGRAPH + \xF2\xC8 |0 # CJK UNIFIED IDEOGRAPH + \xF2\xCA |0 # CJK UNIFIED IDEOGRAPH + \xB7\xDF |0 # CJK UNIFIED IDEOGRAPH + \xF2\xD0 |0 # CJK UNIFIED IDEOGRAPH + \xF2\xCF |0 # CJK UNIFIED IDEOGRAPH + \xF2\xCE |0 # CJK UNIFIED IDEOGRAPH + \xB0\xB3 |0 # CJK UNIFIED IDEOGRAPH + \xFC\xE9 |0 # CJK UNIFIED IDEOGRAPH + \xF2\xDA |0 # CJK UNIFIED IDEOGRAPH + \xF2\xD6 |0 # CJK UNIFIED IDEOGRAPH + \xF2\xD7 |0 # CJK UNIFIED IDEOGRAPH + \xF2\xD3 |0 # CJK UNIFIED IDEOGRAPH + \xF2\xD9 |0 # CJK UNIFIED IDEOGRAPH + \xF2\xD5 |0 # CJK UNIFIED IDEOGRAPH + \xB3\xE2 |0 # CJK UNIFIED IDEOGRAPH + \xCF\xCC |0 # CJK UNIFIED IDEOGRAPH + \xF2\xD8 |0 # CJK UNIFIED IDEOGRAPH + \xF2\xD4 |0 # CJK UNIFIED IDEOGRAPH + \xF2\xD2 |0 # CJK UNIFIED IDEOGRAPH + \xF2\xD1 |0 # CJK UNIFIED IDEOGRAPH + \xF2\xDC |0 # CJK UNIFIED IDEOGRAPH + \xF2\xDF |0 # CJK UNIFIED IDEOGRAPH + \xF2\xDE |0 # CJK UNIFIED IDEOGRAPH + \xF2\xDD |0 # CJK UNIFIED IDEOGRAPH + \xC9\xC9 |0 # CJK UNIFIED IDEOGRAPH + \xF2\xDB |0 # CJK UNIFIED IDEOGRAPH + \xB0\xF3 |0 # CJK UNIFIED IDEOGRAPH + \xF2\xE0 |0 # CJK UNIFIED IDEOGRAPH + \xF2\xE2 |0 # CJK UNIFIED IDEOGRAPH + \xB3\xEF |0 # CJK UNIFIED IDEOGRAPH + \xF2\xCD |0 # CJK UNIFIED IDEOGRAPH + \xB1\xB7 |0 # CJK UNIFIED IDEOGRAPH + \xF2\xE4 |0 # CJK UNIFIED IDEOGRAPH + \xF2\xE3 |0 # CJK UNIFIED IDEOGRAPH + \xF2\xE1 |0 # CJK UNIFIED IDEOGRAPH + \xC3\xAD |0 # CJK UNIFIED IDEOGRAPH + \xCB\xF0 |0 # CJK UNIFIED IDEOGRAPH + \xCE\xDA |0 # CJK UNIFIED IDEOGRAPH + \xF2\xE5 |0 # CJK UNIFIED IDEOGRAPH + \xF2\xE6 |0 # CJK UNIFIED IDEOGRAPH + \xF2\xE7 |0 # CJK UNIFIED IDEOGRAPH + \xF2\xE8 |0 # CJK UNIFIED IDEOGRAPH + \xF2\xE9 |0 # CJK UNIFIED IDEOGRAPH + \xC4\xBB |0 # CJK UNIFIED IDEOGRAPH + \xF2\xEA |0 # CJK UNIFIED IDEOGRAPH + \xC8\xB7 |0 # CJK UNIFIED IDEOGRAPH + \xF2\xEF |0 # CJK UNIFIED IDEOGRAPH + \xF2\xEB |0 # CJK UNIFIED IDEOGRAPH + \xF2\xEC |0 # CJK UNIFIED IDEOGRAPH + \xCB\xB1 |0 # CJK UNIFIED IDEOGRAPH + \xCC\xC4 |0 # CJK UNIFIED IDEOGRAPH + \xC6\xD0 |0 # CJK UNIFIED IDEOGRAPH + \xF2\xF0 |0 # CJK UNIFIED IDEOGRAPH + \xF2\xF1 |0 # CJK UNIFIED IDEOGRAPH + \xC6\xBE |0 # CJK UNIFIED IDEOGRAPH + \xF2\xEE |0 # CJK UNIFIED IDEOGRAPH + \xF2\xED |0 # CJK UNIFIED IDEOGRAPH + \xB2\xAA |0 # CJK UNIFIED IDEOGRAPH + \xF2\xF9 |0 # CJK UNIFIED IDEOGRAPH + \xF2\xF8 |0 # CJK UNIFIED IDEOGRAPH + \xB1\xF5 |0 # CJK UNIFIED IDEOGRAPH + \xF2\xF6 |0 # CJK UNIFIED IDEOGRAPH + \xF2\xF5 |0 # CJK UNIFIED IDEOGRAPH + \xF2\xF3 |0 # CJK UNIFIED IDEOGRAPH + \xB3\xFB |0 # CJK UNIFIED IDEOGRAPH + \xF2\xF2 |0 # CJK UNIFIED IDEOGRAPH + \xBC\xB2 |0 # CJK UNIFIED IDEOGRAPH + \xB2\xA9 |0 # CJK UNIFIED IDEOGRAPH + \xB9\xE3 |0 # CJK UNIFIED IDEOGRAPH + \xF2\xFC |0 # CJK UNIFIED IDEOGRAPH + \xF2\xFB |0 # CJK UNIFIED IDEOGRAPH + \xF2\xFA |0 # CJK UNIFIED IDEOGRAPH + \xF2\xF7 |0 # CJK UNIFIED IDEOGRAPH + \xF2\xFD |0 # CJK UNIFIED IDEOGRAPH + \xF2\xFE |0 # CJK UNIFIED IDEOGRAPH + \xF3\xA5 |0 # CJK UNIFIED IDEOGRAPH + \xF3\xA4 |0 # CJK UNIFIED IDEOGRAPH + \xF3\xA6 |0 # CJK UNIFIED IDEOGRAPH + \xB1\xAD |0 # CJK UNIFIED IDEOGRAPH + \xF3\xA1 |0 # CJK UNIFIED IDEOGRAPH + \xF3\xA2 |0 # CJK UNIFIED IDEOGRAPH + \xB9\xF4 |0 # CJK UNIFIED IDEOGRAPH + \xCC\xB9 |0 # CJK UNIFIED IDEOGRAPH + \xF3\xA3 |0 # CJK UNIFIED IDEOGRAPH + \xFC\xEB |0 # CJK UNIFIED IDEOGRAPH + \xCB\xB2 |0 # CJK UNIFIED IDEOGRAPH + \xF3\xAB |0 # CJK UNIFIED IDEOGRAPH + \xFC\xEA |0 # CJK UNIFIED IDEOGRAPH + \xF3\xA7 |0 # CJK UNIFIED IDEOGRAPH + \xF3\xAC |0 # CJK UNIFIED IDEOGRAPH + \xF3\xA9 |0 # CJK UNIFIED IDEOGRAPH + \xF3\xA8 |0 # CJK UNIFIED IDEOGRAPH + \xB7\xDC |0 # CJK UNIFIED IDEOGRAPH + \xF3\xAD |0 # CJK UNIFIED IDEOGRAPH + \xF3\xAE |0 # CJK UNIFIED IDEOGRAPH + \xF3\xAF |0 # CJK UNIFIED IDEOGRAPH + \xF3\xAA |0 # CJK UNIFIED IDEOGRAPH + \xF2\xF4 |0 # CJK UNIFIED IDEOGRAPH + \xF3\xB0 |0 # CJK UNIFIED IDEOGRAPH + \xC4\xE1 |0 # CJK UNIFIED IDEOGRAPH + \xF3\xB4 |0 # CJK UNIFIED IDEOGRAPH + \xF3\xB5 |0 # CJK UNIFIED IDEOGRAPH + \xF3\xB3 |0 # CJK UNIFIED IDEOGRAPH + \xF3\xB2 |0 # CJK UNIFIED IDEOGRAPH + \xF3\xB8 |0 # CJK UNIFIED IDEOGRAPH + \xF3\xB1 |0 # CJK UNIFIED IDEOGRAPH + \xF3\xB6 |0 # CJK UNIFIED IDEOGRAPH + \xF3\xB7 |0 # CJK UNIFIED IDEOGRAPH + \xF3\xBA |0 # CJK UNIFIED IDEOGRAPH + \xF3\xB9 |0 # CJK UNIFIED IDEOGRAPH + \xF3\xBC |0 # CJK UNIFIED IDEOGRAPH + \xF3\xBD |0 # CJK UNIFIED IDEOGRAPH + \xF3\xBE |0 # CJK UNIFIED IDEOGRAPH + \xCF\xC9 |0 # CJK UNIFIED IDEOGRAPH + \xF3\xBB |0 # CJK UNIFIED IDEOGRAPH + \xC2\xEB |0 # CJK UNIFIED IDEOGRAPH + \xBA\xED |0 # CJK UNIFIED IDEOGRAPH + \xF3\xBF |0 # CJK UNIFIED IDEOGRAPH + \xFC\xED |0 # CJK UNIFIED IDEOGRAPH + \xF3\xC0 |0 # CJK UNIFIED IDEOGRAPH + \xF3\xC1 |0 # CJK UNIFIED IDEOGRAPH + \xF3\xC2 |0 # CJK UNIFIED IDEOGRAPH + \xF3\xC3 |0 # CJK UNIFIED IDEOGRAPH + \xB8\xB4 |0 # CJK UNIFIED IDEOGRAPH + \xF3\xC4 |0 # CJK UNIFIED IDEOGRAPH + \xF3\xC5 |0 # CJK UNIFIED IDEOGRAPH + \xBC\xAF |0 # CJK UNIFIED IDEOGRAPH + \xF3\xC6 |0 # CJK UNIFIED IDEOGRAPH + \xF3\xC7 |0 # CJK UNIFIED IDEOGRAPH + \xF3\xC8 |0 # CJK UNIFIED IDEOGRAPH + \xF3\xC9 |0 # CJK UNIFIED IDEOGRAPH + \xF3\xCC |0 # CJK UNIFIED IDEOGRAPH + \xF3\xCA |0 # CJK UNIFIED IDEOGRAPH + \xCF\xBC |0 # CJK UNIFIED IDEOGRAPH + \xF3\xCB |0 # CJK UNIFIED IDEOGRAPH + \xCE\xEF |0 # CJK UNIFIED IDEOGRAPH + \xF3\xCD |0 # CJK UNIFIED IDEOGRAPH + \xCE\xDB |0 # CJK UNIFIED IDEOGRAPH + \xF3\xCE |0 # CJK UNIFIED IDEOGRAPH + \xC7\xFE |0 # CJK UNIFIED IDEOGRAPH + \xF3\xCF |0 # CJK UNIFIED IDEOGRAPH + \xF3\xD1 |0 # CJK UNIFIED IDEOGRAPH + \xF3\xD2 |0 # CJK UNIFIED IDEOGRAPH + \xF3\xD0 |0 # CJK UNIFIED IDEOGRAPH + \xB9\xED |0 # CJK UNIFIED IDEOGRAPH + \xCC\xCD |0 # CJK UNIFIED IDEOGRAPH + \xCB\xE3 |0 # CJK UNIFIED IDEOGRAPH + \xD6\xF7 |0 # CJK UNIFIED IDEOGRAPH + \xDD\xE0 |0 # CJK UNIFIED IDEOGRAPH + \xCB\xFB |0 # CJK UNIFIED IDEOGRAPH + \xB2\xAB |0 # CJK UNIFIED IDEOGRAPH + \xF3\xD4 |0 # CJK UNIFIED IDEOGRAPH + \xB5\xD0 |0 # CJK UNIFIED IDEOGRAPH + \xF3\xD5 |0 # CJK UNIFIED IDEOGRAPH + \xF3\xD6 |0 # CJK UNIFIED IDEOGRAPH + \xF3\xD7 |0 # CJK UNIFIED IDEOGRAPH + \xFC\xEE |0 # CJK UNIFIED IDEOGRAPH + \xB9\xF5 |0 # CJK UNIFIED IDEOGRAPH + \xF3\xD8 |0 # CJK UNIFIED IDEOGRAPH + \xE0\xD4 |0 # CJK UNIFIED IDEOGRAPH + \xCC\xDB |0 # CJK UNIFIED IDEOGRAPH + \xC2\xE3 |0 # CJK UNIFIED IDEOGRAPH + \xF3\xD9 |0 # CJK UNIFIED IDEOGRAPH + \xF3\xDB |0 # CJK UNIFIED IDEOGRAPH + \xF3\xDA |0 # CJK UNIFIED IDEOGRAPH + \xF3\xDC |0 # CJK UNIFIED IDEOGRAPH + \xF3\xDD |0 # CJK UNIFIED IDEOGRAPH + \xF3\xDE |0 # CJK UNIFIED IDEOGRAPH + \xF3\xDF |0 # CJK UNIFIED IDEOGRAPH + \xF3\xE0 |0 # CJK UNIFIED IDEOGRAPH + \xF3\xE1 |0 # CJK UNIFIED IDEOGRAPH + \xF3\xE2 |0 # CJK UNIFIED IDEOGRAPH + \xF3\xE3 |0 # CJK UNIFIED IDEOGRAPH + \xF3\xE4 |0 # CJK UNIFIED IDEOGRAPH + \xF3\xE5 |0 # CJK UNIFIED IDEOGRAPH + \xF3\xE6 |0 # CJK UNIFIED IDEOGRAPH + \xF3\xE7 |0 # CJK UNIFIED IDEOGRAPH + \xF3\xE8 |0 # CJK UNIFIED IDEOGRAPH + \xC5\xA4 |0 # CJK UNIFIED IDEOGRAPH + \xB8\xDD |0 # CJK UNIFIED IDEOGRAPH + \xF3\xEA |0 # CJK UNIFIED IDEOGRAPH + \xC1\xCD |0 # CJK UNIFIED IDEOGRAPH + \xF3\xEB |0 # CJK UNIFIED IDEOGRAPH + \xF3\xEC |0 # CJK UNIFIED IDEOGRAPH + \xC9\xA1 |0 # CJK UNIFIED IDEOGRAPH + \xF3\xED |0 # CJK UNIFIED IDEOGRAPH + \xF3\xEE |0 # CJK UNIFIED IDEOGRAPH + \xE3\xB7 |0 # CJK UNIFIED IDEOGRAPH + \xEC\xDA |0 # CJK UNIFIED IDEOGRAPH + \xF0\xED |0 # CJK UNIFIED IDEOGRAPH + \xF3\xEF |0 # CJK UNIFIED IDEOGRAPH + \xF3\xF0 |0 # CJK UNIFIED IDEOGRAPH + \xF3\xF2 |0 # CJK UNIFIED IDEOGRAPH + \xF3\xF3 |0 # CJK UNIFIED IDEOGRAPH + \xF3\xF4 |0 # CJK UNIFIED IDEOGRAPH + \xCE\xF0 |0 # CJK UNIFIED IDEOGRAPH + \xF3\xF1 |0 # CJK UNIFIED IDEOGRAPH + \xF3\xF5 |0 # CJK UNIFIED IDEOGRAPH + \xF3\xF6 |0 # CJK UNIFIED IDEOGRAPH + \xF3\xF8 |0 # CJK UNIFIED IDEOGRAPH + \xF3\xF7 |0 # CJK UNIFIED IDEOGRAPH + \xF3\xFA |0 # CJK UNIFIED IDEOGRAPH + \xF3\xFB |0 # CJK UNIFIED IDEOGRAPH + \xF3\xF9 |0 # CJK UNIFIED IDEOGRAPH + \xCE\xB6 |0 # CJK UNIFIED IDEOGRAPH + \xF3\xFC |0 # CJK UNIFIED IDEOGRAPH + \xF3\xFD |0 # CJK UNIFIED IDEOGRAPH + \xE3\xD4 |0 # CJK UNIFIED IDEOGRAPH + \xF3\xFE |0 # CJK UNIFIED IDEOGRAPH + \xFA\xC6 |0 # CJK COMPATIBILITY IDEOGRAPH + \xFC\xCF |0 # CJK COMPATIBILITY IDEOGRAPH + \xF9\xD4 |0 # CJK COMPATIBILITY IDEOGRAPH + \xF9\xDF |0 # CJK COMPATIBILITY IDEOGRAPH + \xF9\xE0 |0 # CJK COMPATIBILITY IDEOGRAPH + \xF9\xF5 |0 # CJK COMPATIBILITY IDEOGRAPH + \xFA\xBE |0 # CJK COMPATIBILITY IDEOGRAPH + \xFA\xCE |0 # CJK COMPATIBILITY IDEOGRAPH + \xFA\xD0 |0 # CJK COMPATIBILITY IDEOGRAPH + \xFA\xFB |0 # CJK COMPATIBILITY IDEOGRAPH + \xFB\xA3 |0 # CJK COMPATIBILITY IDEOGRAPH + \xFB\xBA |0 # CJK COMPATIBILITY IDEOGRAPH + \xFB\xC2 |0 # CJK COMPATIBILITY IDEOGRAPH + \xFB\xC3 |0 # CJK COMPATIBILITY IDEOGRAPH + \xFB\xC4 |0 # CJK COMPATIBILITY IDEOGRAPH + \xFB\xC6 |0 # CJK COMPATIBILITY IDEOGRAPH + \xFB\xCA |0 # CJK COMPATIBILITY IDEOGRAPH + \xFB\xCD |0 # CJK COMPATIBILITY IDEOGRAPH + \xFB\xD6 |0 # CJK COMPATIBILITY IDEOGRAPH + \xFB\xE1 |0 # CJK COMPATIBILITY IDEOGRAPH + \xFB\xE3 |0 # CJK COMPATIBILITY IDEOGRAPH + \xFB\xE4 |0 # CJK COMPATIBILITY IDEOGRAPH + \xFB\xED |0 # CJK COMPATIBILITY IDEOGRAPH + \xFB\xF5 |0 # CJK COMPATIBILITY IDEOGRAPH + \xFB\xF7 |0 # CJK COMPATIBILITY IDEOGRAPH + \xFB\xF8 |0 # CJK COMPATIBILITY IDEOGRAPH + \xFB\xFB |0 # CJK COMPATIBILITY IDEOGRAPH + \xFC\xB9 |0 # CJK COMPATIBILITY IDEOGRAPH + \xFC\xC0 |0 # CJK COMPATIBILITY IDEOGRAPH + \xFC\xD0 |0 # CJK COMPATIBILITY IDEOGRAPH + \xFC\xDC |0 # CJK COMPATIBILITY IDEOGRAPH + \xFC\xDD |0 # CJK COMPATIBILITY IDEOGRAPH + \xFC\xDF |0 # CJK COMPATIBILITY IDEOGRAPH + \xFC\xEC |0 # CJK COMPATIBILITY IDEOGRAPH + \xA1\xAA |0 # FULLWIDTH EXCLAMATION MARK + \xFC\xFE |0 # FULLWIDTH QUOTATION MARK + \xA1\xF4 |0 # FULLWIDTH NUMBER SIGN + \xA1\xF0 |0 # FULLWIDTH DOLLAR SIGN + \xA1\xF3 |0 # FULLWIDTH PERCENT SIGN + \xA1\xF5 |0 # FULLWIDTH AMPERSAND + \xFC\xFD |0 # FULLWIDTH APOSTROPHE + \xA1\xCA |0 # FULLWIDTH LEFT PARENTHESIS + \xA1\xCB |0 # FULLWIDTH RIGHT PARENTHESIS + \xA1\xF6 |0 # FULLWIDTH ASTERISK + \xA1\xDC |0 # FULLWIDTH PLUS SIGN + \xA1\xA4 |0 # FULLWIDTH COMMA + \xA1\xDD |0 # FULLWIDTH HYPHEN-MINUS + \xA1\xA5 |0 # FULLWIDTH FULL STOP + \xA1\xBF |0 # FULLWIDTH SOLIDUS + \xA3\xB0 |0 # FULLWIDTH DIGIT ZERO + \xA3\xB1 |0 # FULLWIDTH DIGIT ONE + \xA3\xB2 |0 # FULLWIDTH DIGIT TWO + \xA3\xB3 |0 # FULLWIDTH DIGIT THREE + \xA3\xB4 |0 # FULLWIDTH DIGIT FOUR + \xA3\xB5 |0 # FULLWIDTH DIGIT FIVE + \xA3\xB6 |0 # FULLWIDTH DIGIT SIX + \xA3\xB7 |0 # FULLWIDTH DIGIT SEVEN + \xA3\xB8 |0 # FULLWIDTH DIGIT EIGHT + \xA3\xB9 |0 # FULLWIDTH DIGIT NINE + \xA1\xA7 |0 # FULLWIDTH COLON + \xA1\xA8 |0 # FULLWIDTH SEMICOLON + \xA1\xE3 |0 # FULLWIDTH LESS-THAN SIGN + \xA1\xE1 |0 # FULLWIDTH EQUALS SIGN + \xA1\xE4 |0 # FULLWIDTH GREATER-THAN SIGN + \xA1\xA9 |0 # FULLWIDTH QUESTION MARK + \xA1\xF7 |0 # FULLWIDTH COMMERCIAL AT + \xA3\xC1 |0 # FULLWIDTH LATIN CAPITAL LETTER A + \xA3\xC2 |0 # FULLWIDTH LATIN CAPITAL LETTER B + \xA3\xC3 |0 # FULLWIDTH LATIN CAPITAL LETTER C + \xA3\xC4 |0 # FULLWIDTH LATIN CAPITAL LETTER D + \xA3\xC5 |0 # FULLWIDTH LATIN CAPITAL LETTER E + \xA3\xC6 |0 # FULLWIDTH LATIN CAPITAL LETTER F + \xA3\xC7 |0 # FULLWIDTH LATIN CAPITAL LETTER G + \xA3\xC8 |0 # FULLWIDTH LATIN CAPITAL LETTER H + \xA3\xC9 |0 # FULLWIDTH LATIN CAPITAL LETTER I + \xA3\xCA |0 # FULLWIDTH LATIN CAPITAL LETTER J + \xA3\xCB |0 # FULLWIDTH LATIN CAPITAL LETTER K + \xA3\xCC |0 # FULLWIDTH LATIN CAPITAL LETTER L + \xA3\xCD |0 # FULLWIDTH LATIN CAPITAL LETTER M + \xA3\xCE |0 # FULLWIDTH LATIN CAPITAL LETTER N + \xA3\xCF |0 # FULLWIDTH LATIN CAPITAL LETTER O + \xA3\xD0 |0 # FULLWIDTH LATIN CAPITAL LETTER P + \xA3\xD1 |0 # FULLWIDTH LATIN CAPITAL LETTER Q + \xA3\xD2 |0 # FULLWIDTH LATIN CAPITAL LETTER R + \xA3\xD3 |0 # FULLWIDTH LATIN CAPITAL LETTER S + \xA3\xD4 |0 # FULLWIDTH LATIN CAPITAL LETTER T + \xA3\xD5 |0 # FULLWIDTH LATIN CAPITAL LETTER U + \xA3\xD6 |0 # FULLWIDTH LATIN CAPITAL LETTER V + \xA3\xD7 |0 # FULLWIDTH LATIN CAPITAL LETTER W + \xA3\xD8 |0 # FULLWIDTH LATIN CAPITAL LETTER X + \xA3\xD9 |0 # FULLWIDTH LATIN CAPITAL LETTER Y + \xA3\xDA |0 # FULLWIDTH LATIN CAPITAL LETTER Z + \xA1\xCE |0 # FULLWIDTH LEFT SQUARE BRACKET + \xA1\xC0 |0 # FULLWIDTH REVERSE SOLIDUS + \xA1\xCF |0 # FULLWIDTH RIGHT SQUARE BRACKET + \xA1\xB0 |0 # FULLWIDTH CIRCUMFLEX ACCENT + \xA1\xB2 |0 # FULLWIDTH LOW LINE + \xA1\xAE |0 # FULLWIDTH GRAVE ACCENT + \xA3\xE1 |0 # FULLWIDTH LATIN SMALL LETTER A + \xA3\xE2 |0 # FULLWIDTH LATIN SMALL LETTER B + \xA3\xE3 |0 # FULLWIDTH LATIN SMALL LETTER C + \xA3\xE4 |0 # FULLWIDTH LATIN SMALL LETTER D + \xA3\xE5 |0 # FULLWIDTH LATIN SMALL LETTER E + \xA3\xE6 |0 # FULLWIDTH LATIN SMALL LETTER F + \xA3\xE7 |0 # FULLWIDTH LATIN SMALL LETTER G + \xA3\xE8 |0 # FULLWIDTH LATIN SMALL LETTER H + \xA3\xE9 |0 # FULLWIDTH LATIN SMALL LETTER I + \xA3\xEA |0 # FULLWIDTH LATIN SMALL LETTER J + \xA3\xEB |0 # FULLWIDTH LATIN SMALL LETTER K + \xA3\xEC |0 # FULLWIDTH LATIN SMALL LETTER L + \xA3\xED |0 # FULLWIDTH LATIN SMALL LETTER M + \xA3\xEE |0 # FULLWIDTH LATIN SMALL LETTER N + \xA3\xEF |0 # FULLWIDTH LATIN SMALL LETTER O + \xA3\xF0 |0 # FULLWIDTH LATIN SMALL LETTER P + \xA3\xF1 |0 # FULLWIDTH LATIN SMALL LETTER Q + \xA3\xF2 |0 # FULLWIDTH LATIN SMALL LETTER R + \xA3\xF3 |0 # FULLWIDTH LATIN SMALL LETTER S + \xA3\xF4 |0 # FULLWIDTH LATIN SMALL LETTER T + \xA3\xF5 |0 # FULLWIDTH LATIN SMALL LETTER U + \xA3\xF6 |0 # FULLWIDTH LATIN SMALL LETTER V + \xA3\xF7 |0 # FULLWIDTH LATIN SMALL LETTER W + \xA3\xF8 |0 # FULLWIDTH LATIN SMALL LETTER X + \xA3\xF9 |0 # FULLWIDTH LATIN SMALL LETTER Y + \xA3\xFA |0 # FULLWIDTH LATIN SMALL LETTER Z + \xA1\xD0 |0 # FULLWIDTH LEFT CURLY BRACKET + \xA1\xC3 |0 # FULLWIDTH VERTICAL LINE + \xA1\xD1 |0 # FULLWIDTH RIGHT CURLY BRACKET + \xA1\xC1 |0 # FULLWIDTH TILDE + \x8E\xA1 |0 # HALFWIDTH IDEOGRAPHIC FULL STOP + \x8E\xA2 |0 # HALFWIDTH LEFT CORNER BRACKET + \x8E\xA3 |0 # HALFWIDTH RIGHT CORNER BRACKET + \x8E\xA4 |0 # HALFWIDTH IDEOGRAPHIC COMMA + \x8E\xA5 |0 # HALFWIDTH KATAKANA MIDDLE DOT + \x8E\xA6 |0 # HALFWIDTH KATAKANA LETTER WO + \x8E\xA7 |0 # HALFWIDTH KATAKANA LETTER SMALL A + \x8E\xA8 |0 # HALFWIDTH KATAKANA LETTER SMALL I + \x8E\xA9 |0 # HALFWIDTH KATAKANA LETTER SMALL U + \x8E\xAA |0 # HALFWIDTH KATAKANA LETTER SMALL E + \x8E\xAB |0 # HALFWIDTH KATAKANA LETTER SMALL O + \x8E\xAC |0 # HALFWIDTH KATAKANA LETTER SMALL YA + \x8E\xAD |0 # HALFWIDTH KATAKANA LETTER SMALL YU + \x8E\xAE |0 # HALFWIDTH KATAKANA LETTER SMALL YO + \x8E\xAF |0 # HALFWIDTH KATAKANA LETTER SMALL TU + \x8E\xB0 |0 # HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK + \x8E\xB1 |0 # HALFWIDTH KATAKANA LETTER A + \x8E\xB2 |0 # HALFWIDTH KATAKANA LETTER I + \x8E\xB3 |0 # HALFWIDTH KATAKANA LETTER U + \x8E\xB4 |0 # HALFWIDTH KATAKANA LETTER E + \x8E\xB5 |0 # HALFWIDTH KATAKANA LETTER O + \x8E\xB6 |0 # HALFWIDTH KATAKANA LETTER KA + \x8E\xB7 |0 # HALFWIDTH KATAKANA LETTER KI + \x8E\xB8 |0 # HALFWIDTH KATAKANA LETTER KU + \x8E\xB9 |0 # HALFWIDTH KATAKANA LETTER KE + \x8E\xBA |0 # HALFWIDTH KATAKANA LETTER KO + \x8E\xBB |0 # HALFWIDTH KATAKANA LETTER SA + \x8E\xBC |0 # HALFWIDTH KATAKANA LETTER SI + \x8E\xBD |0 # HALFWIDTH KATAKANA LETTER SU + \x8E\xBE |0 # HALFWIDTH KATAKANA LETTER SE + \x8E\xBF |0 # HALFWIDTH KATAKANA LETTER SO + \x8E\xC0 |0 # HALFWIDTH KATAKANA LETTER TA + \x8E\xC1 |0 # HALFWIDTH KATAKANA LETTER TI + \x8E\xC2 |0 # HALFWIDTH KATAKANA LETTER TU + \x8E\xC3 |0 # HALFWIDTH KATAKANA LETTER TE + \x8E\xC4 |0 # HALFWIDTH KATAKANA LETTER TO + \x8E\xC5 |0 # HALFWIDTH KATAKANA LETTER NA + \x8E\xC6 |0 # HALFWIDTH KATAKANA LETTER NI + \x8E\xC7 |0 # HALFWIDTH KATAKANA LETTER NU + \x8E\xC8 |0 # HALFWIDTH KATAKANA LETTER NE + \x8E\xC9 |0 # HALFWIDTH KATAKANA LETTER NO + \x8E\xCA |0 # HALFWIDTH KATAKANA LETTER HA + \x8E\xCB |0 # HALFWIDTH KATAKANA LETTER HI + \x8E\xCC |0 # HALFWIDTH KATAKANA LETTER HU + \x8E\xCD |0 # HALFWIDTH KATAKANA LETTER HE + \x8E\xCE |0 # HALFWIDTH KATAKANA LETTER HO + \x8E\xCF |0 # HALFWIDTH KATAKANA LETTER MA + \x8E\xD0 |0 # HALFWIDTH KATAKANA LETTER MI + \x8E\xD1 |0 # HALFWIDTH KATAKANA LETTER MU + \x8E\xD2 |0 # HALFWIDTH KATAKANA LETTER ME + \x8E\xD3 |0 # HALFWIDTH KATAKANA LETTER MO + \x8E\xD4 |0 # HALFWIDTH KATAKANA LETTER YA + \x8E\xD5 |0 # HALFWIDTH KATAKANA LETTER YU + \x8E\xD6 |0 # HALFWIDTH KATAKANA LETTER YO + \x8E\xD7 |0 # HALFWIDTH KATAKANA LETTER RA + \x8E\xD8 |0 # HALFWIDTH KATAKANA LETTER RI + \x8E\xD9 |0 # HALFWIDTH KATAKANA LETTER RU + \x8E\xDA |0 # HALFWIDTH KATAKANA LETTER RE + \x8E\xDB |0 # HALFWIDTH KATAKANA LETTER RO + \x8E\xDC |0 # HALFWIDTH KATAKANA LETTER WA + \x8E\xDD |0 # HALFWIDTH KATAKANA LETTER N + \x8E\xDE |0 # HALFWIDTH KATAKANA VOICED SOUND MARK + \x8E\xDF |0 # HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK + \xA1\xF1 |0 # FULLWIDTH CENT SIGN + \xA1\xF2 |0 # FULLWIDTH POUND SIGN + \xA2\xCC |0 # FULLWIDTH NOT SIGN + \xFC\xFB |3 # FULLWIDTH NOT SIGN + \xA1\xB1 |0 # FULLWIDTH MACRON + \xFC\xFC |0 # FULLWIDTH BROKEN BAR + \xA1\xEF |0 # FULLWIDTH YEN SIGN +END CHARMAP diff --git a/ext/mbstring/tests/data/CP932.txt b/ext/mbstring/tests/data/CP932.txt new file mode 100644 index 0000000000000..7ff471bcd1058 --- /dev/null +++ b/ext/mbstring/tests/data/CP932.txt @@ -0,0 +1,7998 @@ +# +# Name: cp932 to Unicode table +# Unicode version: 2.0 +# Table version: 2.01 +# Table format: Format A +# Date: 04/15/98 +# +# Contact: Shawn.Steele@microsoft.com +# +# General notes: none +# +# Format: Three tab-separated columns +# Column #1 is the cp932 code (in hex) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 is the Unicode name (follows a comment sign, '#') +# +# The entries are in cp932 order +# +0x00 0x0000 #NULL +0x01 0x0001 #START OF HEADING +0x02 0x0002 #START OF TEXT +0x03 0x0003 #END OF TEXT +0x04 0x0004 #END OF TRANSMISSION +0x05 0x0005 #ENQUIRY +0x06 0x0006 #ACKNOWLEDGE +0x07 0x0007 #BELL +0x08 0x0008 #BACKSPACE +0x09 0x0009 #HORIZONTAL TABULATION +0x0A 0x000A #LINE FEED +0x0B 0x000B #VERTICAL TABULATION +0x0C 0x000C #FORM FEED +0x0D 0x000D #CARRIAGE RETURN +0x0E 0x000E #SHIFT OUT +0x0F 0x000F #SHIFT IN +0x10 0x0010 #DATA LINK ESCAPE +0x11 0x0011 #DEVICE CONTROL ONE +0x12 0x0012 #DEVICE CONTROL TWO +0x13 0x0013 #DEVICE CONTROL THREE +0x14 0x0014 #DEVICE CONTROL FOUR +0x15 0x0015 #NEGATIVE ACKNOWLEDGE +0x16 0x0016 #SYNCHRONOUS IDLE +0x17 0x0017 #END OF TRANSMISSION BLOCK +0x18 0x0018 #CANCEL +0x19 0x0019 #END OF MEDIUM +0x1A 0x001A #SUBSTITUTE +0x1B 0x001B #ESCAPE +0x1C 0x001C #FILE SEPARATOR +0x1D 0x001D #GROUP SEPARATOR +0x1E 0x001E #RECORD SEPARATOR +0x1F 0x001F #UNIT SEPARATOR +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 0x005C #REVERSE SOLIDUS +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 0x007E #TILDE +0x7F 0x007F #DELETE +0x80 #UNDEFINED +0x81 #DBCS LEAD BYTE +0x82 #DBCS LEAD BYTE +0x83 #DBCS LEAD BYTE +0x84 #DBCS LEAD BYTE +0x85 #DBCS LEAD BYTE +0x86 #DBCS LEAD BYTE +0x87 #DBCS LEAD BYTE +0x88 #DBCS LEAD BYTE +0x89 #DBCS LEAD BYTE +0x8A #DBCS LEAD BYTE +0x8B #DBCS LEAD BYTE +0x8C #DBCS LEAD BYTE +0x8D #DBCS LEAD BYTE +0x8E #DBCS LEAD BYTE +0x8F #DBCS LEAD BYTE +0x90 #DBCS LEAD BYTE +0x91 #DBCS LEAD BYTE +0x92 #DBCS LEAD BYTE +0x93 #DBCS LEAD BYTE +0x94 #DBCS LEAD BYTE +0x95 #DBCS LEAD BYTE +0x96 #DBCS LEAD BYTE +0x97 #DBCS LEAD BYTE +0x98 #DBCS LEAD BYTE +0x99 #DBCS LEAD BYTE +0x9A #DBCS LEAD BYTE +0x9B #DBCS LEAD BYTE +0x9C #DBCS LEAD BYTE +0x9D #DBCS LEAD BYTE +0x9E #DBCS LEAD BYTE +0x9F #DBCS LEAD BYTE +0xA0 #UNDEFINED +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 +0xE0 #DBCS LEAD BYTE +0xE1 #DBCS LEAD BYTE +0xE2 #DBCS LEAD BYTE +0xE3 #DBCS LEAD BYTE +0xE4 #DBCS LEAD BYTE +0xE5 #DBCS LEAD BYTE +0xE6 #DBCS LEAD BYTE +0xE7 #DBCS LEAD BYTE +0xE8 #DBCS LEAD BYTE +0xE9 #DBCS LEAD BYTE +0xEA #DBCS LEAD BYTE +0xEB #DBCS LEAD BYTE +0xEC #DBCS LEAD BYTE +0xED #DBCS LEAD BYTE +0xEE #DBCS LEAD BYTE +0xEF #DBCS LEAD BYTE +0xF0 #DBCS LEAD BYTE +0xF1 #DBCS LEAD BYTE +0xF2 #DBCS LEAD BYTE +0xF3 #DBCS LEAD BYTE +0xF4 #DBCS LEAD BYTE +0xF5 #DBCS LEAD BYTE +0xF6 #DBCS LEAD BYTE +0xF7 #DBCS LEAD BYTE +0xF8 #DBCS LEAD BYTE +0xF9 #DBCS LEAD BYTE +0xFA #DBCS LEAD BYTE +0xFB #DBCS LEAD BYTE +0xFC #DBCS LEAD BYTE +0xFD #UNDEFINED +0xFE #UNDEFINED +0xFF #UNDEFINED +0x8140 0x3000 #IDEOGRAPHIC SPACE +0x8141 0x3001 #IDEOGRAPHIC COMMA +0x8142 0x3002 #IDEOGRAPHIC FULL STOP +0x8143 0xFF0C #FULLWIDTH COMMA +0x8144 0xFF0E #FULLWIDTH FULL STOP +0x8145 0x30FB #KATAKANA MIDDLE DOT +0x8146 0xFF1A #FULLWIDTH COLON +0x8147 0xFF1B #FULLWIDTH SEMICOLON +0x8148 0xFF1F #FULLWIDTH QUESTION MARK +0x8149 0xFF01 #FULLWIDTH EXCLAMATION MARK +0x814A 0x309B #KATAKANA-HIRAGANA VOICED SOUND MARK +0x814B 0x309C #KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK +0x814C 0x00B4 #ACUTE ACCENT +0x814D 0xFF40 #FULLWIDTH GRAVE ACCENT +0x814E 0x00A8 #DIAERESIS +0x814F 0xFF3E #FULLWIDTH CIRCUMFLEX ACCENT +0x8150 0xFFE3 #FULLWIDTH MACRON +0x8151 0xFF3F #FULLWIDTH LOW LINE +0x8152 0x30FD #KATAKANA ITERATION MARK +0x8153 0x30FE #KATAKANA VOICED ITERATION MARK +0x8154 0x309D #HIRAGANA ITERATION MARK +0x8155 0x309E #HIRAGANA VOICED ITERATION MARK +0x8156 0x3003 #DITTO MARK +0x8157 0x4EDD #CJK UNIFIED IDEOGRAPH +0x8158 0x3005 #IDEOGRAPHIC ITERATION MARK +0x8159 0x3006 #IDEOGRAPHIC CLOSING MARK +0x815A 0x3007 #IDEOGRAPHIC NUMBER ZERO +0x815B 0x30FC #KATAKANA-HIRAGANA PROLONGED SOUND MARK +0x815C 0x2015 #HORIZONTAL BAR +0x815D 0x2010 #HYPHEN +0x815E 0xFF0F #FULLWIDTH SOLIDUS +0x815F 0xFF3C #FULLWIDTH REVERSE SOLIDUS +0x8160 0xFF5E #FULLWIDTH TILDE +0x8161 0x2225 #PARALLEL TO +0x8162 0xFF5C #FULLWIDTH VERTICAL LINE +0x8163 0x2026 #HORIZONTAL ELLIPSIS +0x8164 0x2025 #TWO DOT LEADER +0x8165 0x2018 #LEFT SINGLE QUOTATION MARK +0x8166 0x2019 #RIGHT SINGLE QUOTATION MARK +0x8167 0x201C #LEFT DOUBLE QUOTATION MARK +0x8168 0x201D #RIGHT DOUBLE QUOTATION MARK +0x8169 0xFF08 #FULLWIDTH LEFT PARENTHESIS +0x816A 0xFF09 #FULLWIDTH RIGHT PARENTHESIS +0x816B 0x3014 #LEFT TORTOISE SHELL BRACKET +0x816C 0x3015 #RIGHT TORTOISE SHELL BRACKET +0x816D 0xFF3B #FULLWIDTH LEFT SQUARE BRACKET +0x816E 0xFF3D #FULLWIDTH RIGHT SQUARE BRACKET +0x816F 0xFF5B #FULLWIDTH LEFT CURLY BRACKET +0x8170 0xFF5D #FULLWIDTH RIGHT CURLY BRACKET +0x8171 0x3008 #LEFT ANGLE BRACKET +0x8172 0x3009 #RIGHT ANGLE BRACKET +0x8173 0x300A #LEFT DOUBLE ANGLE BRACKET +0x8174 0x300B #RIGHT DOUBLE ANGLE BRACKET +0x8175 0x300C #LEFT CORNER BRACKET +0x8176 0x300D #RIGHT CORNER BRACKET +0x8177 0x300E #LEFT WHITE CORNER BRACKET +0x8178 0x300F #RIGHT WHITE CORNER BRACKET +0x8179 0x3010 #LEFT BLACK LENTICULAR BRACKET +0x817A 0x3011 #RIGHT BLACK LENTICULAR BRACKET +0x817B 0xFF0B #FULLWIDTH PLUS SIGN +0x817C 0xFF0D #FULLWIDTH HYPHEN-MINUS +0x817D 0x00B1 #PLUS-MINUS SIGN +0x817E 0x00D7 #MULTIPLICATION SIGN +0x8180 0x00F7 #DIVISION SIGN +0x8181 0xFF1D #FULLWIDTH EQUALS SIGN +0x8182 0x2260 #NOT EQUAL TO +0x8183 0xFF1C #FULLWIDTH LESS-THAN SIGN +0x8184 0xFF1E #FULLWIDTH GREATER-THAN SIGN +0x8185 0x2266 #LESS-THAN OVER EQUAL TO +0x8186 0x2267 #GREATER-THAN OVER EQUAL TO +0x8187 0x221E #INFINITY +0x8188 0x2234 #THEREFORE +0x8189 0x2642 #MALE SIGN +0x818A 0x2640 #FEMALE SIGN +0x818B 0x00B0 #DEGREE SIGN +0x818C 0x2032 #PRIME +0x818D 0x2033 #DOUBLE PRIME +0x818E 0x2103 #DEGREE CELSIUS +0x818F 0xFFE5 #FULLWIDTH YEN SIGN +0x8190 0xFF04 #FULLWIDTH DOLLAR SIGN +0x8191 0xFFE0 #FULLWIDTH CENT SIGN +0x8192 0xFFE1 #FULLWIDTH POUND SIGN +0x8193 0xFF05 #FULLWIDTH PERCENT SIGN +0x8194 0xFF03 #FULLWIDTH NUMBER SIGN +0x8195 0xFF06 #FULLWIDTH AMPERSAND +0x8196 0xFF0A #FULLWIDTH ASTERISK +0x8197 0xFF20 #FULLWIDTH COMMERCIAL AT +0x8198 0x00A7 #SECTION SIGN +0x8199 0x2606 #WHITE STAR +0x819A 0x2605 #BLACK STAR +0x819B 0x25CB #WHITE CIRCLE +0x819C 0x25CF #BLACK CIRCLE +0x819D 0x25CE #BULLSEYE +0x819E 0x25C7 #WHITE DIAMOND +0x819F 0x25C6 #BLACK DIAMOND +0x81A0 0x25A1 #WHITE SQUARE +0x81A1 0x25A0 #BLACK SQUARE +0x81A2 0x25B3 #WHITE UP-POINTING TRIANGLE +0x81A3 0x25B2 #BLACK UP-POINTING TRIANGLE +0x81A4 0x25BD #WHITE DOWN-POINTING TRIANGLE +0x81A5 0x25BC #BLACK DOWN-POINTING TRIANGLE +0x81A6 0x203B #REFERENCE MARK +0x81A7 0x3012 #POSTAL MARK +0x81A8 0x2192 #RIGHTWARDS ARROW +0x81A9 0x2190 #LEFTWARDS ARROW +0x81AA 0x2191 #UPWARDS ARROW +0x81AB 0x2193 #DOWNWARDS ARROW +0x81AC 0x3013 #GETA MARK +0x81B8 0x2208 #ELEMENT OF +0x81B9 0x220B #CONTAINS AS MEMBER +0x81BA 0x2286 #SUBSET OF OR EQUAL TO +0x81BB 0x2287 #SUPERSET OF OR EQUAL TO +0x81BC 0x2282 #SUBSET OF +0x81BD 0x2283 #SUPERSET OF +0x81BE 0x222A #UNION +0x81BF 0x2229 #INTERSECTION +0x81C8 0x2227 #LOGICAL AND +0x81C9 0x2228 #LOGICAL OR +0x81CA 0xFFE2 #FULLWIDTH NOT SIGN +0x81CB 0x21D2 #RIGHTWARDS DOUBLE ARROW +0x81CC 0x21D4 #LEFT RIGHT DOUBLE ARROW +0x81CD 0x2200 #FOR ALL +0x81CE 0x2203 #THERE EXISTS +0x81DA 0x2220 #ANGLE +0x81DB 0x22A5 #UP TACK +0x81DC 0x2312 #ARC +0x81DD 0x2202 #PARTIAL DIFFERENTIAL +0x81DE 0x2207 #NABLA +0x81DF 0x2261 #IDENTICAL TO +0x81E0 0x2252 #APPROXIMATELY EQUAL TO OR THE IMAGE OF +0x81E1 0x226A #MUCH LESS-THAN +0x81E2 0x226B #MUCH GREATER-THAN +0x81E3 0x221A #SQUARE ROOT +0x81E4 0x223D #REVERSED TILDE +0x81E5 0x221D #PROPORTIONAL TO +0x81E6 0x2235 #BECAUSE +0x81E7 0x222B #INTEGRAL +0x81E8 0x222C #DOUBLE INTEGRAL +0x81F0 0x212B #ANGSTROM SIGN +0x81F1 0x2030 #PER MILLE SIGN +0x81F2 0x266F #MUSIC SHARP SIGN +0x81F3 0x266D #MUSIC FLAT SIGN +0x81F4 0x266A #EIGHTH NOTE +0x81F5 0x2020 #DAGGER +0x81F6 0x2021 #DOUBLE DAGGER +0x81F7 0x00B6 #PILCROW SIGN +0x81FC 0x25EF #LARGE CIRCLE +0x824F 0xFF10 #FULLWIDTH DIGIT ZERO +0x8250 0xFF11 #FULLWIDTH DIGIT ONE +0x8251 0xFF12 #FULLWIDTH DIGIT TWO +0x8252 0xFF13 #FULLWIDTH DIGIT THREE +0x8253 0xFF14 #FULLWIDTH DIGIT FOUR +0x8254 0xFF15 #FULLWIDTH DIGIT FIVE +0x8255 0xFF16 #FULLWIDTH DIGIT SIX +0x8256 0xFF17 #FULLWIDTH DIGIT SEVEN +0x8257 0xFF18 #FULLWIDTH DIGIT EIGHT +0x8258 0xFF19 #FULLWIDTH DIGIT NINE +0x8260 0xFF21 #FULLWIDTH LATIN CAPITAL LETTER A +0x8261 0xFF22 #FULLWIDTH LATIN CAPITAL LETTER B +0x8262 0xFF23 #FULLWIDTH LATIN CAPITAL LETTER C +0x8263 0xFF24 #FULLWIDTH LATIN CAPITAL LETTER D +0x8264 0xFF25 #FULLWIDTH LATIN CAPITAL LETTER E +0x8265 0xFF26 #FULLWIDTH LATIN CAPITAL LETTER F +0x8266 0xFF27 #FULLWIDTH LATIN CAPITAL LETTER G +0x8267 0xFF28 #FULLWIDTH LATIN CAPITAL LETTER H +0x8268 0xFF29 #FULLWIDTH LATIN CAPITAL LETTER I +0x8269 0xFF2A #FULLWIDTH LATIN CAPITAL LETTER J +0x826A 0xFF2B #FULLWIDTH LATIN CAPITAL LETTER K +0x826B 0xFF2C #FULLWIDTH LATIN CAPITAL LETTER L +0x826C 0xFF2D #FULLWIDTH LATIN CAPITAL LETTER M +0x826D 0xFF2E #FULLWIDTH LATIN CAPITAL LETTER N +0x826E 0xFF2F #FULLWIDTH LATIN CAPITAL LETTER O +0x826F 0xFF30 #FULLWIDTH LATIN CAPITAL LETTER P +0x8270 0xFF31 #FULLWIDTH LATIN CAPITAL LETTER Q +0x8271 0xFF32 #FULLWIDTH LATIN CAPITAL LETTER R +0x8272 0xFF33 #FULLWIDTH LATIN CAPITAL LETTER S +0x8273 0xFF34 #FULLWIDTH LATIN CAPITAL LETTER T +0x8274 0xFF35 #FULLWIDTH LATIN CAPITAL LETTER U +0x8275 0xFF36 #FULLWIDTH LATIN CAPITAL LETTER V +0x8276 0xFF37 #FULLWIDTH LATIN CAPITAL LETTER W +0x8277 0xFF38 #FULLWIDTH LATIN CAPITAL LETTER X +0x8278 0xFF39 #FULLWIDTH LATIN CAPITAL LETTER Y +0x8279 0xFF3A #FULLWIDTH LATIN CAPITAL LETTER Z +0x8281 0xFF41 #FULLWIDTH LATIN SMALL LETTER A +0x8282 0xFF42 #FULLWIDTH LATIN SMALL LETTER B +0x8283 0xFF43 #FULLWIDTH LATIN SMALL LETTER C +0x8284 0xFF44 #FULLWIDTH LATIN SMALL LETTER D +0x8285 0xFF45 #FULLWIDTH LATIN SMALL LETTER E +0x8286 0xFF46 #FULLWIDTH LATIN SMALL LETTER F +0x8287 0xFF47 #FULLWIDTH LATIN SMALL LETTER G +0x8288 0xFF48 #FULLWIDTH LATIN SMALL LETTER H +0x8289 0xFF49 #FULLWIDTH LATIN SMALL LETTER I +0x828A 0xFF4A #FULLWIDTH LATIN SMALL LETTER J +0x828B 0xFF4B #FULLWIDTH LATIN SMALL LETTER K +0x828C 0xFF4C #FULLWIDTH LATIN SMALL LETTER L +0x828D 0xFF4D #FULLWIDTH LATIN SMALL LETTER M +0x828E 0xFF4E #FULLWIDTH LATIN SMALL LETTER N +0x828F 0xFF4F #FULLWIDTH LATIN SMALL LETTER O +0x8290 0xFF50 #FULLWIDTH LATIN SMALL LETTER P +0x8291 0xFF51 #FULLWIDTH LATIN SMALL LETTER Q +0x8292 0xFF52 #FULLWIDTH LATIN SMALL LETTER R +0x8293 0xFF53 #FULLWIDTH LATIN SMALL LETTER S +0x8294 0xFF54 #FULLWIDTH LATIN SMALL LETTER T +0x8295 0xFF55 #FULLWIDTH LATIN SMALL LETTER U +0x8296 0xFF56 #FULLWIDTH LATIN SMALL LETTER V +0x8297 0xFF57 #FULLWIDTH LATIN SMALL LETTER W +0x8298 0xFF58 #FULLWIDTH LATIN SMALL LETTER X +0x8299 0xFF59 #FULLWIDTH LATIN SMALL LETTER Y +0x829A 0xFF5A #FULLWIDTH LATIN SMALL LETTER Z +0x829F 0x3041 #HIRAGANA LETTER SMALL A +0x82A0 0x3042 #HIRAGANA LETTER A +0x82A1 0x3043 #HIRAGANA LETTER SMALL I +0x82A2 0x3044 #HIRAGANA LETTER I +0x82A3 0x3045 #HIRAGANA LETTER SMALL U +0x82A4 0x3046 #HIRAGANA LETTER U +0x82A5 0x3047 #HIRAGANA LETTER SMALL E +0x82A6 0x3048 #HIRAGANA LETTER E +0x82A7 0x3049 #HIRAGANA LETTER SMALL O +0x82A8 0x304A #HIRAGANA LETTER O +0x82A9 0x304B #HIRAGANA LETTER KA +0x82AA 0x304C #HIRAGANA LETTER GA +0x82AB 0x304D #HIRAGANA LETTER KI +0x82AC 0x304E #HIRAGANA LETTER GI +0x82AD 0x304F #HIRAGANA LETTER KU +0x82AE 0x3050 #HIRAGANA LETTER GU +0x82AF 0x3051 #HIRAGANA LETTER KE +0x82B0 0x3052 #HIRAGANA LETTER GE +0x82B1 0x3053 #HIRAGANA LETTER KO +0x82B2 0x3054 #HIRAGANA LETTER GO +0x82B3 0x3055 #HIRAGANA LETTER SA +0x82B4 0x3056 #HIRAGANA LETTER ZA +0x82B5 0x3057 #HIRAGANA LETTER SI +0x82B6 0x3058 #HIRAGANA LETTER ZI +0x82B7 0x3059 #HIRAGANA LETTER SU +0x82B8 0x305A #HIRAGANA LETTER ZU +0x82B9 0x305B #HIRAGANA LETTER SE +0x82BA 0x305C #HIRAGANA LETTER ZE +0x82BB 0x305D #HIRAGANA LETTER SO +0x82BC 0x305E #HIRAGANA LETTER ZO +0x82BD 0x305F #HIRAGANA LETTER TA +0x82BE 0x3060 #HIRAGANA LETTER DA +0x82BF 0x3061 #HIRAGANA LETTER TI +0x82C0 0x3062 #HIRAGANA LETTER DI +0x82C1 0x3063 #HIRAGANA LETTER SMALL TU +0x82C2 0x3064 #HIRAGANA LETTER TU +0x82C3 0x3065 #HIRAGANA LETTER DU +0x82C4 0x3066 #HIRAGANA LETTER TE +0x82C5 0x3067 #HIRAGANA LETTER DE +0x82C6 0x3068 #HIRAGANA LETTER TO +0x82C7 0x3069 #HIRAGANA LETTER DO +0x82C8 0x306A #HIRAGANA LETTER NA +0x82C9 0x306B #HIRAGANA LETTER NI +0x82CA 0x306C #HIRAGANA LETTER NU +0x82CB 0x306D #HIRAGANA LETTER NE +0x82CC 0x306E #HIRAGANA LETTER NO +0x82CD 0x306F #HIRAGANA LETTER HA +0x82CE 0x3070 #HIRAGANA LETTER BA +0x82CF 0x3071 #HIRAGANA LETTER PA +0x82D0 0x3072 #HIRAGANA LETTER HI +0x82D1 0x3073 #HIRAGANA LETTER BI +0x82D2 0x3074 #HIRAGANA LETTER PI +0x82D3 0x3075 #HIRAGANA LETTER HU +0x82D4 0x3076 #HIRAGANA LETTER BU +0x82D5 0x3077 #HIRAGANA LETTER PU +0x82D6 0x3078 #HIRAGANA LETTER HE +0x82D7 0x3079 #HIRAGANA LETTER BE +0x82D8 0x307A #HIRAGANA LETTER PE +0x82D9 0x307B #HIRAGANA LETTER HO +0x82DA 0x307C #HIRAGANA LETTER BO +0x82DB 0x307D #HIRAGANA LETTER PO +0x82DC 0x307E #HIRAGANA LETTER MA +0x82DD 0x307F #HIRAGANA LETTER MI +0x82DE 0x3080 #HIRAGANA LETTER MU +0x82DF 0x3081 #HIRAGANA LETTER ME +0x82E0 0x3082 #HIRAGANA LETTER MO +0x82E1 0x3083 #HIRAGANA LETTER SMALL YA +0x82E2 0x3084 #HIRAGANA LETTER YA +0x82E3 0x3085 #HIRAGANA LETTER SMALL YU +0x82E4 0x3086 #HIRAGANA LETTER YU +0x82E5 0x3087 #HIRAGANA LETTER SMALL YO +0x82E6 0x3088 #HIRAGANA LETTER YO +0x82E7 0x3089 #HIRAGANA LETTER RA +0x82E8 0x308A #HIRAGANA LETTER RI +0x82E9 0x308B #HIRAGANA LETTER RU +0x82EA 0x308C #HIRAGANA LETTER RE +0x82EB 0x308D #HIRAGANA LETTER RO +0x82EC 0x308E #HIRAGANA LETTER SMALL WA +0x82ED 0x308F #HIRAGANA LETTER WA +0x82EE 0x3090 #HIRAGANA LETTER WI +0x82EF 0x3091 #HIRAGANA LETTER WE +0x82F0 0x3092 #HIRAGANA LETTER WO +0x82F1 0x3093 #HIRAGANA LETTER N +0x8340 0x30A1 #KATAKANA LETTER SMALL A +0x8341 0x30A2 #KATAKANA LETTER A +0x8342 0x30A3 #KATAKANA LETTER SMALL I +0x8343 0x30A4 #KATAKANA LETTER I +0x8344 0x30A5 #KATAKANA LETTER SMALL U +0x8345 0x30A6 #KATAKANA LETTER U +0x8346 0x30A7 #KATAKANA LETTER SMALL E +0x8347 0x30A8 #KATAKANA LETTER E +0x8348 0x30A9 #KATAKANA LETTER SMALL O +0x8349 0x30AA #KATAKANA LETTER O +0x834A 0x30AB #KATAKANA LETTER KA +0x834B 0x30AC #KATAKANA LETTER GA +0x834C 0x30AD #KATAKANA LETTER KI +0x834D 0x30AE #KATAKANA LETTER GI +0x834E 0x30AF #KATAKANA LETTER KU +0x834F 0x30B0 #KATAKANA LETTER GU +0x8350 0x30B1 #KATAKANA LETTER KE +0x8351 0x30B2 #KATAKANA LETTER GE +0x8352 0x30B3 #KATAKANA LETTER KO +0x8353 0x30B4 #KATAKANA LETTER GO +0x8354 0x30B5 #KATAKANA LETTER SA +0x8355 0x30B6 #KATAKANA LETTER ZA +0x8356 0x30B7 #KATAKANA LETTER SI +0x8357 0x30B8 #KATAKANA LETTER ZI +0x8358 0x30B9 #KATAKANA LETTER SU +0x8359 0x30BA #KATAKANA LETTER ZU +0x835A 0x30BB #KATAKANA LETTER SE +0x835B 0x30BC #KATAKANA LETTER ZE +0x835C 0x30BD #KATAKANA LETTER SO +0x835D 0x30BE #KATAKANA LETTER ZO +0x835E 0x30BF #KATAKANA LETTER TA +0x835F 0x30C0 #KATAKANA LETTER DA +0x8360 0x30C1 #KATAKANA LETTER TI +0x8361 0x30C2 #KATAKANA LETTER DI +0x8362 0x30C3 #KATAKANA LETTER SMALL TU +0x8363 0x30C4 #KATAKANA LETTER TU +0x8364 0x30C5 #KATAKANA LETTER DU +0x8365 0x30C6 #KATAKANA LETTER TE +0x8366 0x30C7 #KATAKANA LETTER DE +0x8367 0x30C8 #KATAKANA LETTER TO +0x8368 0x30C9 #KATAKANA LETTER DO +0x8369 0x30CA #KATAKANA LETTER NA +0x836A 0x30CB #KATAKANA LETTER NI +0x836B 0x30CC #KATAKANA LETTER NU +0x836C 0x30CD #KATAKANA LETTER NE +0x836D 0x30CE #KATAKANA LETTER NO +0x836E 0x30CF #KATAKANA LETTER HA +0x836F 0x30D0 #KATAKANA LETTER BA +0x8370 0x30D1 #KATAKANA LETTER PA +0x8371 0x30D2 #KATAKANA LETTER HI +0x8372 0x30D3 #KATAKANA LETTER BI +0x8373 0x30D4 #KATAKANA LETTER PI +0x8374 0x30D5 #KATAKANA LETTER HU +0x8375 0x30D6 #KATAKANA LETTER BU +0x8376 0x30D7 #KATAKANA LETTER PU +0x8377 0x30D8 #KATAKANA LETTER HE +0x8378 0x30D9 #KATAKANA LETTER BE +0x8379 0x30DA #KATAKANA LETTER PE +0x837A 0x30DB #KATAKANA LETTER HO +0x837B 0x30DC #KATAKANA LETTER BO +0x837C 0x30DD #KATAKANA LETTER PO +0x837D 0x30DE #KATAKANA LETTER MA +0x837E 0x30DF #KATAKANA LETTER MI +0x8380 0x30E0 #KATAKANA LETTER MU +0x8381 0x30E1 #KATAKANA LETTER ME +0x8382 0x30E2 #KATAKANA LETTER MO +0x8383 0x30E3 #KATAKANA LETTER SMALL YA +0x8384 0x30E4 #KATAKANA LETTER YA +0x8385 0x30E5 #KATAKANA LETTER SMALL YU +0x8386 0x30E6 #KATAKANA LETTER YU +0x8387 0x30E7 #KATAKANA LETTER SMALL YO +0x8388 0x30E8 #KATAKANA LETTER YO +0x8389 0x30E9 #KATAKANA LETTER RA +0x838A 0x30EA #KATAKANA LETTER RI +0x838B 0x30EB #KATAKANA LETTER RU +0x838C 0x30EC #KATAKANA LETTER RE +0x838D 0x30ED #KATAKANA LETTER RO +0x838E 0x30EE #KATAKANA LETTER SMALL WA +0x838F 0x30EF #KATAKANA LETTER WA +0x8390 0x30F0 #KATAKANA LETTER WI +0x8391 0x30F1 #KATAKANA LETTER WE +0x8392 0x30F2 #KATAKANA LETTER WO +0x8393 0x30F3 #KATAKANA LETTER N +0x8394 0x30F4 #KATAKANA LETTER VU +0x8395 0x30F5 #KATAKANA LETTER SMALL KA +0x8396 0x30F6 #KATAKANA LETTER SMALL KE +0x839F 0x0391 #GREEK CAPITAL LETTER ALPHA +0x83A0 0x0392 #GREEK CAPITAL LETTER BETA +0x83A1 0x0393 #GREEK CAPITAL LETTER GAMMA +0x83A2 0x0394 #GREEK CAPITAL LETTER DELTA +0x83A3 0x0395 #GREEK CAPITAL LETTER EPSILON +0x83A4 0x0396 #GREEK CAPITAL LETTER ZETA +0x83A5 0x0397 #GREEK CAPITAL LETTER ETA +0x83A6 0x0398 #GREEK CAPITAL LETTER THETA +0x83A7 0x0399 #GREEK CAPITAL LETTER IOTA +0x83A8 0x039A #GREEK CAPITAL LETTER KAPPA +0x83A9 0x039B #GREEK CAPITAL LETTER LAMDA +0x83AA 0x039C #GREEK CAPITAL LETTER MU +0x83AB 0x039D #GREEK CAPITAL LETTER NU +0x83AC 0x039E #GREEK CAPITAL LETTER XI +0x83AD 0x039F #GREEK CAPITAL LETTER OMICRON +0x83AE 0x03A0 #GREEK CAPITAL LETTER PI +0x83AF 0x03A1 #GREEK CAPITAL LETTER RHO +0x83B0 0x03A3 #GREEK CAPITAL LETTER SIGMA +0x83B1 0x03A4 #GREEK CAPITAL LETTER TAU +0x83B2 0x03A5 #GREEK CAPITAL LETTER UPSILON +0x83B3 0x03A6 #GREEK CAPITAL LETTER PHI +0x83B4 0x03A7 #GREEK CAPITAL LETTER CHI +0x83B5 0x03A8 #GREEK CAPITAL LETTER PSI +0x83B6 0x03A9 #GREEK CAPITAL LETTER OMEGA +0x83BF 0x03B1 #GREEK SMALL LETTER ALPHA +0x83C0 0x03B2 #GREEK SMALL LETTER BETA +0x83C1 0x03B3 #GREEK SMALL LETTER GAMMA +0x83C2 0x03B4 #GREEK SMALL LETTER DELTA +0x83C3 0x03B5 #GREEK SMALL LETTER EPSILON +0x83C4 0x03B6 #GREEK SMALL LETTER ZETA +0x83C5 0x03B7 #GREEK SMALL LETTER ETA +0x83C6 0x03B8 #GREEK SMALL LETTER THETA +0x83C7 0x03B9 #GREEK SMALL LETTER IOTA +0x83C8 0x03BA #GREEK SMALL LETTER KAPPA +0x83C9 0x03BB #GREEK SMALL LETTER LAMDA +0x83CA 0x03BC #GREEK SMALL LETTER MU +0x83CB 0x03BD #GREEK SMALL LETTER NU +0x83CC 0x03BE #GREEK SMALL LETTER XI +0x83CD 0x03BF #GREEK SMALL LETTER OMICRON +0x83CE 0x03C0 #GREEK SMALL LETTER PI +0x83CF 0x03C1 #GREEK SMALL LETTER RHO +0x83D0 0x03C3 #GREEK SMALL LETTER SIGMA +0x83D1 0x03C4 #GREEK SMALL LETTER TAU +0x83D2 0x03C5 #GREEK SMALL LETTER UPSILON +0x83D3 0x03C6 #GREEK SMALL LETTER PHI +0x83D4 0x03C7 #GREEK SMALL LETTER CHI +0x83D5 0x03C8 #GREEK SMALL LETTER PSI +0x83D6 0x03C9 #GREEK SMALL LETTER OMEGA +0x8440 0x0410 #CYRILLIC CAPITAL LETTER A +0x8441 0x0411 #CYRILLIC CAPITAL LETTER BE +0x8442 0x0412 #CYRILLIC CAPITAL LETTER VE +0x8443 0x0413 #CYRILLIC CAPITAL LETTER GHE +0x8444 0x0414 #CYRILLIC CAPITAL LETTER DE +0x8445 0x0415 #CYRILLIC CAPITAL LETTER IE +0x8446 0x0401 #CYRILLIC CAPITAL LETTER IO +0x8447 0x0416 #CYRILLIC CAPITAL LETTER ZHE +0x8448 0x0417 #CYRILLIC CAPITAL LETTER ZE +0x8449 0x0418 #CYRILLIC CAPITAL LETTER I +0x844A 0x0419 #CYRILLIC CAPITAL LETTER SHORT I +0x844B 0x041A #CYRILLIC CAPITAL LETTER KA +0x844C 0x041B #CYRILLIC CAPITAL LETTER EL +0x844D 0x041C #CYRILLIC CAPITAL LETTER EM +0x844E 0x041D #CYRILLIC CAPITAL LETTER EN +0x844F 0x041E #CYRILLIC CAPITAL LETTER O +0x8450 0x041F #CYRILLIC CAPITAL LETTER PE +0x8451 0x0420 #CYRILLIC CAPITAL LETTER ER +0x8452 0x0421 #CYRILLIC CAPITAL LETTER ES +0x8453 0x0422 #CYRILLIC CAPITAL LETTER TE +0x8454 0x0423 #CYRILLIC CAPITAL LETTER U +0x8455 0x0424 #CYRILLIC CAPITAL LETTER EF +0x8456 0x0425 #CYRILLIC CAPITAL LETTER HA +0x8457 0x0426 #CYRILLIC CAPITAL LETTER TSE +0x8458 0x0427 #CYRILLIC CAPITAL LETTER CHE +0x8459 0x0428 #CYRILLIC CAPITAL LETTER SHA +0x845A 0x0429 #CYRILLIC CAPITAL LETTER SHCHA +0x845B 0x042A #CYRILLIC CAPITAL LETTER HARD SIGN +0x845C 0x042B #CYRILLIC CAPITAL LETTER YERU +0x845D 0x042C #CYRILLIC CAPITAL LETTER SOFT SIGN +0x845E 0x042D #CYRILLIC CAPITAL LETTER E +0x845F 0x042E #CYRILLIC CAPITAL LETTER YU +0x8460 0x042F #CYRILLIC CAPITAL LETTER YA +0x8470 0x0430 #CYRILLIC SMALL LETTER A +0x8471 0x0431 #CYRILLIC SMALL LETTER BE +0x8472 0x0432 #CYRILLIC SMALL LETTER VE +0x8473 0x0433 #CYRILLIC SMALL LETTER GHE +0x8474 0x0434 #CYRILLIC SMALL LETTER DE +0x8475 0x0435 #CYRILLIC SMALL LETTER IE +0x8476 0x0451 #CYRILLIC SMALL LETTER IO +0x8477 0x0436 #CYRILLIC SMALL LETTER ZHE +0x8478 0x0437 #CYRILLIC SMALL LETTER ZE +0x8479 0x0438 #CYRILLIC SMALL LETTER I +0x847A 0x0439 #CYRILLIC SMALL LETTER SHORT I +0x847B 0x043A #CYRILLIC SMALL LETTER KA +0x847C 0x043B #CYRILLIC SMALL LETTER EL +0x847D 0x043C #CYRILLIC SMALL LETTER EM +0x847E 0x043D #CYRILLIC SMALL LETTER EN +0x8480 0x043E #CYRILLIC SMALL LETTER O +0x8481 0x043F #CYRILLIC SMALL LETTER PE +0x8482 0x0440 #CYRILLIC SMALL LETTER ER +0x8483 0x0441 #CYRILLIC SMALL LETTER ES +0x8484 0x0442 #CYRILLIC SMALL LETTER TE +0x8485 0x0443 #CYRILLIC SMALL LETTER U +0x8486 0x0444 #CYRILLIC SMALL LETTER EF +0x8487 0x0445 #CYRILLIC SMALL LETTER HA +0x8488 0x0446 #CYRILLIC SMALL LETTER TSE +0x8489 0x0447 #CYRILLIC SMALL LETTER CHE +0x848A 0x0448 #CYRILLIC SMALL LETTER SHA +0x848B 0x0449 #CYRILLIC SMALL LETTER SHCHA +0x848C 0x044A #CYRILLIC SMALL LETTER HARD SIGN +0x848D 0x044B #CYRILLIC SMALL LETTER YERU +0x848E 0x044C #CYRILLIC SMALL LETTER SOFT SIGN +0x848F 0x044D #CYRILLIC SMALL LETTER E +0x8490 0x044E #CYRILLIC SMALL LETTER YU +0x8491 0x044F #CYRILLIC SMALL LETTER YA +0x849F 0x2500 #BOX DRAWINGS LIGHT HORIZONTAL +0x84A0 0x2502 #BOX DRAWINGS LIGHT VERTICAL +0x84A1 0x250C #BOX DRAWINGS LIGHT DOWN AND RIGHT +0x84A2 0x2510 #BOX DRAWINGS LIGHT DOWN AND LEFT +0x84A3 0x2518 #BOX DRAWINGS LIGHT UP AND LEFT +0x84A4 0x2514 #BOX DRAWINGS LIGHT UP AND RIGHT +0x84A5 0x251C #BOX DRAWINGS LIGHT VERTICAL AND RIGHT +0x84A6 0x252C #BOX DRAWINGS LIGHT DOWN AND HORIZONTAL +0x84A7 0x2524 #BOX DRAWINGS LIGHT VERTICAL AND LEFT +0x84A8 0x2534 #BOX DRAWINGS LIGHT UP AND HORIZONTAL +0x84A9 0x253C #BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL +0x84AA 0x2501 #BOX DRAWINGS HEAVY HORIZONTAL +0x84AB 0x2503 #BOX DRAWINGS HEAVY VERTICAL +0x84AC 0x250F #BOX DRAWINGS HEAVY DOWN AND RIGHT +0x84AD 0x2513 #BOX DRAWINGS HEAVY DOWN AND LEFT +0x84AE 0x251B #BOX DRAWINGS HEAVY UP AND LEFT +0x84AF 0x2517 #BOX DRAWINGS HEAVY UP AND RIGHT +0x84B0 0x2523 #BOX DRAWINGS HEAVY VERTICAL AND RIGHT +0x84B1 0x2533 #BOX DRAWINGS HEAVY DOWN AND HORIZONTAL +0x84B2 0x252B #BOX DRAWINGS HEAVY VERTICAL AND LEFT +0x84B3 0x253B #BOX DRAWINGS HEAVY UP AND HORIZONTAL +0x84B4 0x254B #BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL +0x84B5 0x2520 #BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT +0x84B6 0x252F #BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY +0x84B7 0x2528 #BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT +0x84B8 0x2537 #BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY +0x84B9 0x253F #BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY +0x84BA 0x251D #BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY +0x84BB 0x2530 #BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT +0x84BC 0x2525 #BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY +0x84BD 0x2538 #BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT +0x84BE 0x2542 #BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT +0x8740 0x2460 #CIRCLED DIGIT ONE +0x8741 0x2461 #CIRCLED DIGIT TWO +0x8742 0x2462 #CIRCLED DIGIT THREE +0x8743 0x2463 #CIRCLED DIGIT FOUR +0x8744 0x2464 #CIRCLED DIGIT FIVE +0x8745 0x2465 #CIRCLED DIGIT SIX +0x8746 0x2466 #CIRCLED DIGIT SEVEN +0x8747 0x2467 #CIRCLED DIGIT EIGHT +0x8748 0x2468 #CIRCLED DIGIT NINE +0x8749 0x2469 #CIRCLED NUMBER TEN +0x874A 0x246A #CIRCLED NUMBER ELEVEN +0x874B 0x246B #CIRCLED NUMBER TWELVE +0x874C 0x246C #CIRCLED NUMBER THIRTEEN +0x874D 0x246D #CIRCLED NUMBER FOURTEEN +0x874E 0x246E #CIRCLED NUMBER FIFTEEN +0x874F 0x246F #CIRCLED NUMBER SIXTEEN +0x8750 0x2470 #CIRCLED NUMBER SEVENTEEN +0x8751 0x2471 #CIRCLED NUMBER EIGHTEEN +0x8752 0x2472 #CIRCLED NUMBER NINETEEN +0x8753 0x2473 #CIRCLED NUMBER TWENTY +0x8754 0x2160 #ROMAN NUMERAL ONE +0x8755 0x2161 #ROMAN NUMERAL TWO +0x8756 0x2162 #ROMAN NUMERAL THREE +0x8757 0x2163 #ROMAN NUMERAL FOUR +0x8758 0x2164 #ROMAN NUMERAL FIVE +0x8759 0x2165 #ROMAN NUMERAL SIX +0x875A 0x2166 #ROMAN NUMERAL SEVEN +0x875B 0x2167 #ROMAN NUMERAL EIGHT +0x875C 0x2168 #ROMAN NUMERAL NINE +0x875D 0x2169 #ROMAN NUMERAL TEN +0x875F 0x3349 #SQUARE MIRI +0x8760 0x3314 #SQUARE KIRO +0x8761 0x3322 #SQUARE SENTI +0x8762 0x334D #SQUARE MEETORU +0x8763 0x3318 #SQUARE GURAMU +0x8764 0x3327 #SQUARE TON +0x8765 0x3303 #SQUARE AARU +0x8766 0x3336 #SQUARE HEKUTAARU +0x8767 0x3351 #SQUARE RITTORU +0x8768 0x3357 #SQUARE WATTO +0x8769 0x330D #SQUARE KARORII +0x876A 0x3326 #SQUARE DORU +0x876B 0x3323 #SQUARE SENTO +0x876C 0x332B #SQUARE PAASENTO +0x876D 0x334A #SQUARE MIRIBAARU +0x876E 0x333B #SQUARE PEEZI +0x876F 0x339C #SQUARE MM +0x8770 0x339D #SQUARE CM +0x8771 0x339E #SQUARE KM +0x8772 0x338E #SQUARE MG +0x8773 0x338F #SQUARE KG +0x8774 0x33C4 #SQUARE CC +0x8775 0x33A1 #SQUARE M SQUARED +0x877E 0x337B #SQUARE ERA NAME HEISEI +0x8780 0x301D #REVERSED DOUBLE PRIME QUOTATION MARK +0x8781 0x301F #LOW DOUBLE PRIME QUOTATION MARK +0x8782 0x2116 #NUMERO SIGN +0x8783 0x33CD #SQUARE KK +0x8784 0x2121 #TELEPHONE SIGN +0x8785 0x32A4 #CIRCLED IDEOGRAPH HIGH +0x8786 0x32A5 #CIRCLED IDEOGRAPH CENTRE +0x8787 0x32A6 #CIRCLED IDEOGRAPH LOW +0x8788 0x32A7 #CIRCLED IDEOGRAPH LEFT +0x8789 0x32A8 #CIRCLED IDEOGRAPH RIGHT +0x878A 0x3231 #PARENTHESIZED IDEOGRAPH STOCK +0x878B 0x3232 #PARENTHESIZED IDEOGRAPH HAVE +0x878C 0x3239 #PARENTHESIZED IDEOGRAPH REPRESENT +0x878D 0x337E #SQUARE ERA NAME MEIZI +0x878E 0x337D #SQUARE ERA NAME TAISYOU +0x878F 0x337C #SQUARE ERA NAME SYOUWA +0x8790 0x2252 #APPROXIMATELY EQUAL TO OR THE IMAGE OF +0x8791 0x2261 #IDENTICAL TO +0x8792 0x222B #INTEGRAL +0x8793 0x222E #CONTOUR INTEGRAL +0x8794 0x2211 #N-ARY SUMMATION +0x8795 0x221A #SQUARE ROOT +0x8796 0x22A5 #UP TACK +0x8797 0x2220 #ANGLE +0x8798 0x221F #RIGHT ANGLE +0x8799 0x22BF #RIGHT TRIANGLE +0x879A 0x2235 #BECAUSE +0x879B 0x2229 #INTERSECTION +0x879C 0x222A #UNION +0x889F 0x4E9C #CJK UNIFIED IDEOGRAPH +0x88A0 0x5516 #CJK UNIFIED IDEOGRAPH +0x88A1 0x5A03 #CJK UNIFIED IDEOGRAPH +0x88A2 0x963F #CJK UNIFIED IDEOGRAPH +0x88A3 0x54C0 #CJK UNIFIED IDEOGRAPH +0x88A4 0x611B #CJK UNIFIED IDEOGRAPH +0x88A5 0x6328 #CJK UNIFIED IDEOGRAPH +0x88A6 0x59F6 #CJK UNIFIED IDEOGRAPH +0x88A7 0x9022 #CJK UNIFIED IDEOGRAPH +0x88A8 0x8475 #CJK UNIFIED IDEOGRAPH +0x88A9 0x831C #CJK UNIFIED IDEOGRAPH +0x88AA 0x7A50 #CJK UNIFIED IDEOGRAPH +0x88AB 0x60AA #CJK UNIFIED IDEOGRAPH +0x88AC 0x63E1 #CJK UNIFIED IDEOGRAPH +0x88AD 0x6E25 #CJK UNIFIED IDEOGRAPH +0x88AE 0x65ED #CJK UNIFIED IDEOGRAPH +0x88AF 0x8466 #CJK UNIFIED IDEOGRAPH +0x88B0 0x82A6 #CJK UNIFIED IDEOGRAPH +0x88B1 0x9BF5 #CJK UNIFIED IDEOGRAPH +0x88B2 0x6893 #CJK UNIFIED IDEOGRAPH +0x88B3 0x5727 #CJK UNIFIED IDEOGRAPH +0x88B4 0x65A1 #CJK UNIFIED IDEOGRAPH +0x88B5 0x6271 #CJK UNIFIED IDEOGRAPH +0x88B6 0x5B9B #CJK UNIFIED IDEOGRAPH +0x88B7 0x59D0 #CJK UNIFIED IDEOGRAPH +0x88B8 0x867B #CJK UNIFIED IDEOGRAPH +0x88B9 0x98F4 #CJK UNIFIED IDEOGRAPH +0x88BA 0x7D62 #CJK UNIFIED IDEOGRAPH +0x88BB 0x7DBE #CJK UNIFIED IDEOGRAPH +0x88BC 0x9B8E #CJK UNIFIED IDEOGRAPH +0x88BD 0x6216 #CJK UNIFIED IDEOGRAPH +0x88BE 0x7C9F #CJK UNIFIED IDEOGRAPH +0x88BF 0x88B7 #CJK UNIFIED IDEOGRAPH +0x88C0 0x5B89 #CJK UNIFIED IDEOGRAPH +0x88C1 0x5EB5 #CJK UNIFIED IDEOGRAPH +0x88C2 0x6309 #CJK UNIFIED IDEOGRAPH +0x88C3 0x6697 #CJK UNIFIED IDEOGRAPH +0x88C4 0x6848 #CJK UNIFIED IDEOGRAPH +0x88C5 0x95C7 #CJK UNIFIED IDEOGRAPH +0x88C6 0x978D #CJK UNIFIED IDEOGRAPH +0x88C7 0x674F #CJK UNIFIED IDEOGRAPH +0x88C8 0x4EE5 #CJK UNIFIED IDEOGRAPH +0x88C9 0x4F0A #CJK UNIFIED IDEOGRAPH +0x88CA 0x4F4D #CJK UNIFIED IDEOGRAPH +0x88CB 0x4F9D #CJK UNIFIED IDEOGRAPH +0x88CC 0x5049 #CJK UNIFIED IDEOGRAPH +0x88CD 0x56F2 #CJK UNIFIED IDEOGRAPH +0x88CE 0x5937 #CJK UNIFIED IDEOGRAPH +0x88CF 0x59D4 #CJK UNIFIED IDEOGRAPH +0x88D0 0x5A01 #CJK UNIFIED IDEOGRAPH +0x88D1 0x5C09 #CJK UNIFIED IDEOGRAPH +0x88D2 0x60DF #CJK UNIFIED IDEOGRAPH +0x88D3 0x610F #CJK UNIFIED IDEOGRAPH +0x88D4 0x6170 #CJK UNIFIED IDEOGRAPH +0x88D5 0x6613 #CJK UNIFIED IDEOGRAPH +0x88D6 0x6905 #CJK UNIFIED IDEOGRAPH +0x88D7 0x70BA #CJK UNIFIED IDEOGRAPH +0x88D8 0x754F #CJK UNIFIED IDEOGRAPH +0x88D9 0x7570 #CJK UNIFIED IDEOGRAPH +0x88DA 0x79FB #CJK UNIFIED IDEOGRAPH +0x88DB 0x7DAD #CJK UNIFIED IDEOGRAPH +0x88DC 0x7DEF #CJK UNIFIED IDEOGRAPH +0x88DD 0x80C3 #CJK UNIFIED IDEOGRAPH +0x88DE 0x840E #CJK UNIFIED IDEOGRAPH +0x88DF 0x8863 #CJK UNIFIED IDEOGRAPH +0x88E0 0x8B02 #CJK UNIFIED IDEOGRAPH +0x88E1 0x9055 #CJK UNIFIED IDEOGRAPH +0x88E2 0x907A #CJK UNIFIED IDEOGRAPH +0x88E3 0x533B #CJK UNIFIED IDEOGRAPH +0x88E4 0x4E95 #CJK UNIFIED IDEOGRAPH +0x88E5 0x4EA5 #CJK UNIFIED IDEOGRAPH +0x88E6 0x57DF #CJK UNIFIED IDEOGRAPH +0x88E7 0x80B2 #CJK UNIFIED IDEOGRAPH +0x88E8 0x90C1 #CJK UNIFIED IDEOGRAPH +0x88E9 0x78EF #CJK UNIFIED IDEOGRAPH +0x88EA 0x4E00 #CJK UNIFIED IDEOGRAPH +0x88EB 0x58F1 #CJK UNIFIED IDEOGRAPH +0x88EC 0x6EA2 #CJK UNIFIED IDEOGRAPH +0x88ED 0x9038 #CJK UNIFIED IDEOGRAPH +0x88EE 0x7A32 #CJK UNIFIED IDEOGRAPH +0x88EF 0x8328 #CJK UNIFIED IDEOGRAPH +0x88F0 0x828B #CJK UNIFIED IDEOGRAPH +0x88F1 0x9C2F #CJK UNIFIED IDEOGRAPH +0x88F2 0x5141 #CJK UNIFIED IDEOGRAPH +0x88F3 0x5370 #CJK UNIFIED IDEOGRAPH +0x88F4 0x54BD #CJK UNIFIED IDEOGRAPH +0x88F5 0x54E1 #CJK UNIFIED IDEOGRAPH +0x88F6 0x56E0 #CJK UNIFIED IDEOGRAPH +0x88F7 0x59FB #CJK UNIFIED IDEOGRAPH +0x88F8 0x5F15 #CJK UNIFIED IDEOGRAPH +0x88F9 0x98F2 #CJK UNIFIED IDEOGRAPH +0x88FA 0x6DEB #CJK UNIFIED IDEOGRAPH +0x88FB 0x80E4 #CJK UNIFIED IDEOGRAPH +0x88FC 0x852D #CJK UNIFIED IDEOGRAPH +0x8940 0x9662 #CJK UNIFIED IDEOGRAPH +0x8941 0x9670 #CJK UNIFIED IDEOGRAPH +0x8942 0x96A0 #CJK UNIFIED IDEOGRAPH +0x8943 0x97FB #CJK UNIFIED IDEOGRAPH +0x8944 0x540B #CJK UNIFIED IDEOGRAPH +0x8945 0x53F3 #CJK UNIFIED IDEOGRAPH +0x8946 0x5B87 #CJK UNIFIED IDEOGRAPH +0x8947 0x70CF #CJK UNIFIED IDEOGRAPH +0x8948 0x7FBD #CJK UNIFIED IDEOGRAPH +0x8949 0x8FC2 #CJK UNIFIED IDEOGRAPH +0x894A 0x96E8 #CJK UNIFIED IDEOGRAPH +0x894B 0x536F #CJK UNIFIED IDEOGRAPH +0x894C 0x9D5C #CJK UNIFIED IDEOGRAPH +0x894D 0x7ABA #CJK UNIFIED IDEOGRAPH +0x894E 0x4E11 #CJK UNIFIED IDEOGRAPH +0x894F 0x7893 #CJK UNIFIED IDEOGRAPH +0x8950 0x81FC #CJK UNIFIED IDEOGRAPH +0x8951 0x6E26 #CJK UNIFIED IDEOGRAPH +0x8952 0x5618 #CJK UNIFIED IDEOGRAPH +0x8953 0x5504 #CJK UNIFIED IDEOGRAPH +0x8954 0x6B1D #CJK UNIFIED IDEOGRAPH +0x8955 0x851A #CJK UNIFIED IDEOGRAPH +0x8956 0x9C3B #CJK UNIFIED IDEOGRAPH +0x8957 0x59E5 #CJK UNIFIED IDEOGRAPH +0x8958 0x53A9 #CJK UNIFIED IDEOGRAPH +0x8959 0x6D66 #CJK UNIFIED IDEOGRAPH +0x895A 0x74DC #CJK UNIFIED IDEOGRAPH +0x895B 0x958F #CJK UNIFIED IDEOGRAPH +0x895C 0x5642 #CJK UNIFIED IDEOGRAPH +0x895D 0x4E91 #CJK UNIFIED IDEOGRAPH +0x895E 0x904B #CJK UNIFIED IDEOGRAPH +0x895F 0x96F2 #CJK UNIFIED IDEOGRAPH +0x8960 0x834F #CJK UNIFIED IDEOGRAPH +0x8961 0x990C #CJK UNIFIED IDEOGRAPH +0x8962 0x53E1 #CJK UNIFIED IDEOGRAPH +0x8963 0x55B6 #CJK UNIFIED IDEOGRAPH +0x8964 0x5B30 #CJK UNIFIED IDEOGRAPH +0x8965 0x5F71 #CJK UNIFIED IDEOGRAPH +0x8966 0x6620 #CJK UNIFIED IDEOGRAPH +0x8967 0x66F3 #CJK UNIFIED IDEOGRAPH +0x8968 0x6804 #CJK UNIFIED IDEOGRAPH +0x8969 0x6C38 #CJK UNIFIED IDEOGRAPH +0x896A 0x6CF3 #CJK UNIFIED IDEOGRAPH +0x896B 0x6D29 #CJK UNIFIED IDEOGRAPH +0x896C 0x745B #CJK UNIFIED IDEOGRAPH +0x896D 0x76C8 #CJK UNIFIED IDEOGRAPH +0x896E 0x7A4E #CJK UNIFIED IDEOGRAPH +0x896F 0x9834 #CJK UNIFIED IDEOGRAPH +0x8970 0x82F1 #CJK UNIFIED IDEOGRAPH +0x8971 0x885B #CJK UNIFIED IDEOGRAPH +0x8972 0x8A60 #CJK UNIFIED IDEOGRAPH +0x8973 0x92ED #CJK UNIFIED IDEOGRAPH +0x8974 0x6DB2 #CJK UNIFIED IDEOGRAPH +0x8975 0x75AB #CJK UNIFIED IDEOGRAPH +0x8976 0x76CA #CJK UNIFIED IDEOGRAPH +0x8977 0x99C5 #CJK UNIFIED IDEOGRAPH +0x8978 0x60A6 #CJK UNIFIED IDEOGRAPH +0x8979 0x8B01 #CJK UNIFIED IDEOGRAPH +0x897A 0x8D8A #CJK UNIFIED IDEOGRAPH +0x897B 0x95B2 #CJK UNIFIED IDEOGRAPH +0x897C 0x698E #CJK UNIFIED IDEOGRAPH +0x897D 0x53AD #CJK UNIFIED IDEOGRAPH +0x897E 0x5186 #CJK UNIFIED IDEOGRAPH +0x8980 0x5712 #CJK UNIFIED IDEOGRAPH +0x8981 0x5830 #CJK UNIFIED IDEOGRAPH +0x8982 0x5944 #CJK UNIFIED IDEOGRAPH +0x8983 0x5BB4 #CJK UNIFIED IDEOGRAPH +0x8984 0x5EF6 #CJK UNIFIED IDEOGRAPH +0x8985 0x6028 #CJK UNIFIED IDEOGRAPH +0x8986 0x63A9 #CJK UNIFIED IDEOGRAPH +0x8987 0x63F4 #CJK UNIFIED IDEOGRAPH +0x8988 0x6CBF #CJK UNIFIED IDEOGRAPH +0x8989 0x6F14 #CJK UNIFIED IDEOGRAPH +0x898A 0x708E #CJK UNIFIED IDEOGRAPH +0x898B 0x7114 #CJK UNIFIED IDEOGRAPH +0x898C 0x7159 #CJK UNIFIED IDEOGRAPH +0x898D 0x71D5 #CJK UNIFIED IDEOGRAPH +0x898E 0x733F #CJK UNIFIED IDEOGRAPH +0x898F 0x7E01 #CJK UNIFIED IDEOGRAPH +0x8990 0x8276 #CJK UNIFIED IDEOGRAPH +0x8991 0x82D1 #CJK UNIFIED IDEOGRAPH +0x8992 0x8597 #CJK UNIFIED IDEOGRAPH +0x8993 0x9060 #CJK UNIFIED IDEOGRAPH +0x8994 0x925B #CJK UNIFIED IDEOGRAPH +0x8995 0x9D1B #CJK UNIFIED IDEOGRAPH +0x8996 0x5869 #CJK UNIFIED IDEOGRAPH +0x8997 0x65BC #CJK UNIFIED IDEOGRAPH +0x8998 0x6C5A #CJK UNIFIED IDEOGRAPH +0x8999 0x7525 #CJK UNIFIED IDEOGRAPH +0x899A 0x51F9 #CJK UNIFIED IDEOGRAPH +0x899B 0x592E #CJK UNIFIED IDEOGRAPH +0x899C 0x5965 #CJK UNIFIED IDEOGRAPH +0x899D 0x5F80 #CJK UNIFIED IDEOGRAPH +0x899E 0x5FDC #CJK UNIFIED IDEOGRAPH +0x899F 0x62BC #CJK UNIFIED IDEOGRAPH +0x89A0 0x65FA #CJK UNIFIED IDEOGRAPH +0x89A1 0x6A2A #CJK UNIFIED IDEOGRAPH +0x89A2 0x6B27 #CJK UNIFIED IDEOGRAPH +0x89A3 0x6BB4 #CJK UNIFIED IDEOGRAPH +0x89A4 0x738B #CJK UNIFIED IDEOGRAPH +0x89A5 0x7FC1 #CJK UNIFIED IDEOGRAPH +0x89A6 0x8956 #CJK UNIFIED IDEOGRAPH +0x89A7 0x9D2C #CJK UNIFIED IDEOGRAPH +0x89A8 0x9D0E #CJK UNIFIED IDEOGRAPH +0x89A9 0x9EC4 #CJK UNIFIED IDEOGRAPH +0x89AA 0x5CA1 #CJK UNIFIED IDEOGRAPH +0x89AB 0x6C96 #CJK UNIFIED IDEOGRAPH +0x89AC 0x837B #CJK UNIFIED IDEOGRAPH +0x89AD 0x5104 #CJK UNIFIED IDEOGRAPH +0x89AE 0x5C4B #CJK UNIFIED IDEOGRAPH +0x89AF 0x61B6 #CJK UNIFIED IDEOGRAPH +0x89B0 0x81C6 #CJK UNIFIED IDEOGRAPH +0x89B1 0x6876 #CJK UNIFIED IDEOGRAPH +0x89B2 0x7261 #CJK UNIFIED IDEOGRAPH +0x89B3 0x4E59 #CJK UNIFIED IDEOGRAPH +0x89B4 0x4FFA #CJK UNIFIED IDEOGRAPH +0x89B5 0x5378 #CJK UNIFIED IDEOGRAPH +0x89B6 0x6069 #CJK UNIFIED IDEOGRAPH +0x89B7 0x6E29 #CJK UNIFIED IDEOGRAPH +0x89B8 0x7A4F #CJK UNIFIED IDEOGRAPH +0x89B9 0x97F3 #CJK UNIFIED IDEOGRAPH +0x89BA 0x4E0B #CJK UNIFIED IDEOGRAPH +0x89BB 0x5316 #CJK UNIFIED IDEOGRAPH +0x89BC 0x4EEE #CJK UNIFIED IDEOGRAPH +0x89BD 0x4F55 #CJK UNIFIED IDEOGRAPH +0x89BE 0x4F3D #CJK UNIFIED IDEOGRAPH +0x89BF 0x4FA1 #CJK UNIFIED IDEOGRAPH +0x89C0 0x4F73 #CJK UNIFIED IDEOGRAPH +0x89C1 0x52A0 #CJK UNIFIED IDEOGRAPH +0x89C2 0x53EF #CJK UNIFIED IDEOGRAPH +0x89C3 0x5609 #CJK UNIFIED IDEOGRAPH +0x89C4 0x590F #CJK UNIFIED IDEOGRAPH +0x89C5 0x5AC1 #CJK UNIFIED IDEOGRAPH +0x89C6 0x5BB6 #CJK UNIFIED IDEOGRAPH +0x89C7 0x5BE1 #CJK UNIFIED IDEOGRAPH +0x89C8 0x79D1 #CJK UNIFIED IDEOGRAPH +0x89C9 0x6687 #CJK UNIFIED IDEOGRAPH +0x89CA 0x679C #CJK UNIFIED IDEOGRAPH +0x89CB 0x67B6 #CJK UNIFIED IDEOGRAPH +0x89CC 0x6B4C #CJK UNIFIED IDEOGRAPH +0x89CD 0x6CB3 #CJK UNIFIED IDEOGRAPH +0x89CE 0x706B #CJK UNIFIED IDEOGRAPH +0x89CF 0x73C2 #CJK UNIFIED IDEOGRAPH +0x89D0 0x798D #CJK UNIFIED IDEOGRAPH +0x89D1 0x79BE #CJK UNIFIED IDEOGRAPH +0x89D2 0x7A3C #CJK UNIFIED IDEOGRAPH +0x89D3 0x7B87 #CJK UNIFIED IDEOGRAPH +0x89D4 0x82B1 #CJK UNIFIED IDEOGRAPH +0x89D5 0x82DB #CJK UNIFIED IDEOGRAPH +0x89D6 0x8304 #CJK UNIFIED IDEOGRAPH +0x89D7 0x8377 #CJK UNIFIED IDEOGRAPH +0x89D8 0x83EF #CJK UNIFIED IDEOGRAPH +0x89D9 0x83D3 #CJK UNIFIED IDEOGRAPH +0x89DA 0x8766 #CJK UNIFIED IDEOGRAPH +0x89DB 0x8AB2 #CJK UNIFIED IDEOGRAPH +0x89DC 0x5629 #CJK UNIFIED IDEOGRAPH +0x89DD 0x8CA8 #CJK UNIFIED IDEOGRAPH +0x89DE 0x8FE6 #CJK UNIFIED IDEOGRAPH +0x89DF 0x904E #CJK UNIFIED IDEOGRAPH +0x89E0 0x971E #CJK UNIFIED IDEOGRAPH +0x89E1 0x868A #CJK UNIFIED IDEOGRAPH +0x89E2 0x4FC4 #CJK UNIFIED IDEOGRAPH +0x89E3 0x5CE8 #CJK UNIFIED IDEOGRAPH +0x89E4 0x6211 #CJK UNIFIED IDEOGRAPH +0x89E5 0x7259 #CJK UNIFIED IDEOGRAPH +0x89E6 0x753B #CJK UNIFIED IDEOGRAPH +0x89E7 0x81E5 #CJK UNIFIED IDEOGRAPH +0x89E8 0x82BD #CJK UNIFIED IDEOGRAPH +0x89E9 0x86FE #CJK UNIFIED IDEOGRAPH +0x89EA 0x8CC0 #CJK UNIFIED IDEOGRAPH +0x89EB 0x96C5 #CJK UNIFIED IDEOGRAPH +0x89EC 0x9913 #CJK UNIFIED IDEOGRAPH +0x89ED 0x99D5 #CJK UNIFIED IDEOGRAPH +0x89EE 0x4ECB #CJK UNIFIED IDEOGRAPH +0x89EF 0x4F1A #CJK UNIFIED IDEOGRAPH +0x89F0 0x89E3 #CJK UNIFIED IDEOGRAPH +0x89F1 0x56DE #CJK UNIFIED IDEOGRAPH +0x89F2 0x584A #CJK UNIFIED IDEOGRAPH +0x89F3 0x58CA #CJK UNIFIED IDEOGRAPH +0x89F4 0x5EFB #CJK UNIFIED IDEOGRAPH +0x89F5 0x5FEB #CJK UNIFIED IDEOGRAPH +0x89F6 0x602A #CJK UNIFIED IDEOGRAPH +0x89F7 0x6094 #CJK UNIFIED IDEOGRAPH +0x89F8 0x6062 #CJK UNIFIED IDEOGRAPH +0x89F9 0x61D0 #CJK UNIFIED IDEOGRAPH +0x89FA 0x6212 #CJK UNIFIED IDEOGRAPH +0x89FB 0x62D0 #CJK UNIFIED IDEOGRAPH +0x89FC 0x6539 #CJK UNIFIED IDEOGRAPH +0x8A40 0x9B41 #CJK UNIFIED IDEOGRAPH +0x8A41 0x6666 #CJK UNIFIED IDEOGRAPH +0x8A42 0x68B0 #CJK UNIFIED IDEOGRAPH +0x8A43 0x6D77 #CJK UNIFIED IDEOGRAPH +0x8A44 0x7070 #CJK UNIFIED IDEOGRAPH +0x8A45 0x754C #CJK UNIFIED IDEOGRAPH +0x8A46 0x7686 #CJK UNIFIED IDEOGRAPH +0x8A47 0x7D75 #CJK UNIFIED IDEOGRAPH +0x8A48 0x82A5 #CJK UNIFIED IDEOGRAPH +0x8A49 0x87F9 #CJK UNIFIED IDEOGRAPH +0x8A4A 0x958B #CJK UNIFIED IDEOGRAPH +0x8A4B 0x968E #CJK UNIFIED IDEOGRAPH +0x8A4C 0x8C9D #CJK UNIFIED IDEOGRAPH +0x8A4D 0x51F1 #CJK UNIFIED IDEOGRAPH +0x8A4E 0x52BE #CJK UNIFIED IDEOGRAPH +0x8A4F 0x5916 #CJK UNIFIED IDEOGRAPH +0x8A50 0x54B3 #CJK UNIFIED IDEOGRAPH +0x8A51 0x5BB3 #CJK UNIFIED IDEOGRAPH +0x8A52 0x5D16 #CJK UNIFIED IDEOGRAPH +0x8A53 0x6168 #CJK UNIFIED IDEOGRAPH +0x8A54 0x6982 #CJK UNIFIED IDEOGRAPH +0x8A55 0x6DAF #CJK UNIFIED IDEOGRAPH +0x8A56 0x788D #CJK UNIFIED IDEOGRAPH +0x8A57 0x84CB #CJK UNIFIED IDEOGRAPH +0x8A58 0x8857 #CJK UNIFIED IDEOGRAPH +0x8A59 0x8A72 #CJK UNIFIED IDEOGRAPH +0x8A5A 0x93A7 #CJK UNIFIED IDEOGRAPH +0x8A5B 0x9AB8 #CJK UNIFIED IDEOGRAPH +0x8A5C 0x6D6C #CJK UNIFIED IDEOGRAPH +0x8A5D 0x99A8 #CJK UNIFIED IDEOGRAPH +0x8A5E 0x86D9 #CJK UNIFIED IDEOGRAPH +0x8A5F 0x57A3 #CJK UNIFIED IDEOGRAPH +0x8A60 0x67FF #CJK UNIFIED IDEOGRAPH +0x8A61 0x86CE #CJK UNIFIED IDEOGRAPH +0x8A62 0x920E #CJK UNIFIED IDEOGRAPH +0x8A63 0x5283 #CJK UNIFIED IDEOGRAPH +0x8A64 0x5687 #CJK UNIFIED IDEOGRAPH +0x8A65 0x5404 #CJK UNIFIED IDEOGRAPH +0x8A66 0x5ED3 #CJK UNIFIED IDEOGRAPH +0x8A67 0x62E1 #CJK UNIFIED IDEOGRAPH +0x8A68 0x64B9 #CJK UNIFIED IDEOGRAPH +0x8A69 0x683C #CJK UNIFIED IDEOGRAPH +0x8A6A 0x6838 #CJK UNIFIED IDEOGRAPH +0x8A6B 0x6BBB #CJK UNIFIED IDEOGRAPH +0x8A6C 0x7372 #CJK UNIFIED IDEOGRAPH +0x8A6D 0x78BA #CJK UNIFIED IDEOGRAPH +0x8A6E 0x7A6B #CJK UNIFIED IDEOGRAPH +0x8A6F 0x899A #CJK UNIFIED IDEOGRAPH +0x8A70 0x89D2 #CJK UNIFIED IDEOGRAPH +0x8A71 0x8D6B #CJK UNIFIED IDEOGRAPH +0x8A72 0x8F03 #CJK UNIFIED IDEOGRAPH +0x8A73 0x90ED #CJK UNIFIED IDEOGRAPH +0x8A74 0x95A3 #CJK UNIFIED IDEOGRAPH +0x8A75 0x9694 #CJK UNIFIED IDEOGRAPH +0x8A76 0x9769 #CJK UNIFIED IDEOGRAPH +0x8A77 0x5B66 #CJK UNIFIED IDEOGRAPH +0x8A78 0x5CB3 #CJK UNIFIED IDEOGRAPH +0x8A79 0x697D #CJK UNIFIED IDEOGRAPH +0x8A7A 0x984D #CJK UNIFIED IDEOGRAPH +0x8A7B 0x984E #CJK UNIFIED IDEOGRAPH +0x8A7C 0x639B #CJK UNIFIED IDEOGRAPH +0x8A7D 0x7B20 #CJK UNIFIED IDEOGRAPH +0x8A7E 0x6A2B #CJK UNIFIED IDEOGRAPH +0x8A80 0x6A7F #CJK UNIFIED IDEOGRAPH +0x8A81 0x68B6 #CJK UNIFIED IDEOGRAPH +0x8A82 0x9C0D #CJK UNIFIED IDEOGRAPH +0x8A83 0x6F5F #CJK UNIFIED IDEOGRAPH +0x8A84 0x5272 #CJK UNIFIED IDEOGRAPH +0x8A85 0x559D #CJK UNIFIED IDEOGRAPH +0x8A86 0x6070 #CJK UNIFIED IDEOGRAPH +0x8A87 0x62EC #CJK UNIFIED IDEOGRAPH +0x8A88 0x6D3B #CJK UNIFIED IDEOGRAPH +0x8A89 0x6E07 #CJK UNIFIED IDEOGRAPH +0x8A8A 0x6ED1 #CJK UNIFIED IDEOGRAPH +0x8A8B 0x845B #CJK UNIFIED IDEOGRAPH +0x8A8C 0x8910 #CJK UNIFIED IDEOGRAPH +0x8A8D 0x8F44 #CJK UNIFIED IDEOGRAPH +0x8A8E 0x4E14 #CJK UNIFIED IDEOGRAPH +0x8A8F 0x9C39 #CJK UNIFIED IDEOGRAPH +0x8A90 0x53F6 #CJK UNIFIED IDEOGRAPH +0x8A91 0x691B #CJK UNIFIED IDEOGRAPH +0x8A92 0x6A3A #CJK UNIFIED IDEOGRAPH +0x8A93 0x9784 #CJK UNIFIED IDEOGRAPH +0x8A94 0x682A #CJK UNIFIED IDEOGRAPH +0x8A95 0x515C #CJK UNIFIED IDEOGRAPH +0x8A96 0x7AC3 #CJK UNIFIED IDEOGRAPH +0x8A97 0x84B2 #CJK UNIFIED IDEOGRAPH +0x8A98 0x91DC #CJK UNIFIED IDEOGRAPH +0x8A99 0x938C #CJK UNIFIED IDEOGRAPH +0x8A9A 0x565B #CJK UNIFIED IDEOGRAPH +0x8A9B 0x9D28 #CJK UNIFIED IDEOGRAPH +0x8A9C 0x6822 #CJK UNIFIED IDEOGRAPH +0x8A9D 0x8305 #CJK UNIFIED IDEOGRAPH +0x8A9E 0x8431 #CJK UNIFIED IDEOGRAPH +0x8A9F 0x7CA5 #CJK UNIFIED IDEOGRAPH +0x8AA0 0x5208 #CJK UNIFIED IDEOGRAPH +0x8AA1 0x82C5 #CJK UNIFIED IDEOGRAPH +0x8AA2 0x74E6 #CJK UNIFIED IDEOGRAPH +0x8AA3 0x4E7E #CJK UNIFIED IDEOGRAPH +0x8AA4 0x4F83 #CJK UNIFIED IDEOGRAPH +0x8AA5 0x51A0 #CJK UNIFIED IDEOGRAPH +0x8AA6 0x5BD2 #CJK UNIFIED IDEOGRAPH +0x8AA7 0x520A #CJK UNIFIED IDEOGRAPH +0x8AA8 0x52D8 #CJK UNIFIED IDEOGRAPH +0x8AA9 0x52E7 #CJK UNIFIED IDEOGRAPH +0x8AAA 0x5DFB #CJK UNIFIED IDEOGRAPH +0x8AAB 0x559A #CJK UNIFIED IDEOGRAPH +0x8AAC 0x582A #CJK UNIFIED IDEOGRAPH +0x8AAD 0x59E6 #CJK UNIFIED IDEOGRAPH +0x8AAE 0x5B8C #CJK UNIFIED IDEOGRAPH +0x8AAF 0x5B98 #CJK UNIFIED IDEOGRAPH +0x8AB0 0x5BDB #CJK UNIFIED IDEOGRAPH +0x8AB1 0x5E72 #CJK UNIFIED IDEOGRAPH +0x8AB2 0x5E79 #CJK UNIFIED IDEOGRAPH +0x8AB3 0x60A3 #CJK UNIFIED IDEOGRAPH +0x8AB4 0x611F #CJK UNIFIED IDEOGRAPH +0x8AB5 0x6163 #CJK UNIFIED IDEOGRAPH +0x8AB6 0x61BE #CJK UNIFIED IDEOGRAPH +0x8AB7 0x63DB #CJK UNIFIED IDEOGRAPH +0x8AB8 0x6562 #CJK UNIFIED IDEOGRAPH +0x8AB9 0x67D1 #CJK UNIFIED IDEOGRAPH +0x8ABA 0x6853 #CJK UNIFIED IDEOGRAPH +0x8ABB 0x68FA #CJK UNIFIED IDEOGRAPH +0x8ABC 0x6B3E #CJK UNIFIED IDEOGRAPH +0x8ABD 0x6B53 #CJK UNIFIED IDEOGRAPH +0x8ABE 0x6C57 #CJK UNIFIED IDEOGRAPH +0x8ABF 0x6F22 #CJK UNIFIED IDEOGRAPH +0x8AC0 0x6F97 #CJK UNIFIED IDEOGRAPH +0x8AC1 0x6F45 #CJK UNIFIED IDEOGRAPH +0x8AC2 0x74B0 #CJK UNIFIED IDEOGRAPH +0x8AC3 0x7518 #CJK UNIFIED IDEOGRAPH +0x8AC4 0x76E3 #CJK UNIFIED IDEOGRAPH +0x8AC5 0x770B #CJK UNIFIED IDEOGRAPH +0x8AC6 0x7AFF #CJK UNIFIED IDEOGRAPH +0x8AC7 0x7BA1 #CJK UNIFIED IDEOGRAPH +0x8AC8 0x7C21 #CJK UNIFIED IDEOGRAPH +0x8AC9 0x7DE9 #CJK UNIFIED IDEOGRAPH +0x8ACA 0x7F36 #CJK UNIFIED IDEOGRAPH +0x8ACB 0x7FF0 #CJK UNIFIED IDEOGRAPH +0x8ACC 0x809D #CJK UNIFIED IDEOGRAPH +0x8ACD 0x8266 #CJK UNIFIED IDEOGRAPH +0x8ACE 0x839E #CJK UNIFIED IDEOGRAPH +0x8ACF 0x89B3 #CJK UNIFIED IDEOGRAPH +0x8AD0 0x8ACC #CJK UNIFIED IDEOGRAPH +0x8AD1 0x8CAB #CJK UNIFIED IDEOGRAPH +0x8AD2 0x9084 #CJK UNIFIED IDEOGRAPH +0x8AD3 0x9451 #CJK UNIFIED IDEOGRAPH +0x8AD4 0x9593 #CJK UNIFIED IDEOGRAPH +0x8AD5 0x9591 #CJK UNIFIED IDEOGRAPH +0x8AD6 0x95A2 #CJK UNIFIED IDEOGRAPH +0x8AD7 0x9665 #CJK UNIFIED IDEOGRAPH +0x8AD8 0x97D3 #CJK UNIFIED IDEOGRAPH +0x8AD9 0x9928 #CJK UNIFIED IDEOGRAPH +0x8ADA 0x8218 #CJK UNIFIED IDEOGRAPH +0x8ADB 0x4E38 #CJK UNIFIED IDEOGRAPH +0x8ADC 0x542B #CJK UNIFIED IDEOGRAPH +0x8ADD 0x5CB8 #CJK UNIFIED IDEOGRAPH +0x8ADE 0x5DCC #CJK UNIFIED IDEOGRAPH +0x8ADF 0x73A9 #CJK UNIFIED IDEOGRAPH +0x8AE0 0x764C #CJK UNIFIED IDEOGRAPH +0x8AE1 0x773C #CJK UNIFIED IDEOGRAPH +0x8AE2 0x5CA9 #CJK UNIFIED IDEOGRAPH +0x8AE3 0x7FEB #CJK UNIFIED IDEOGRAPH +0x8AE4 0x8D0B #CJK UNIFIED IDEOGRAPH +0x8AE5 0x96C1 #CJK UNIFIED IDEOGRAPH +0x8AE6 0x9811 #CJK UNIFIED IDEOGRAPH +0x8AE7 0x9854 #CJK UNIFIED IDEOGRAPH +0x8AE8 0x9858 #CJK UNIFIED IDEOGRAPH +0x8AE9 0x4F01 #CJK UNIFIED IDEOGRAPH +0x8AEA 0x4F0E #CJK UNIFIED IDEOGRAPH +0x8AEB 0x5371 #CJK UNIFIED IDEOGRAPH +0x8AEC 0x559C #CJK UNIFIED IDEOGRAPH +0x8AED 0x5668 #CJK UNIFIED IDEOGRAPH +0x8AEE 0x57FA #CJK UNIFIED IDEOGRAPH +0x8AEF 0x5947 #CJK UNIFIED IDEOGRAPH +0x8AF0 0x5B09 #CJK UNIFIED IDEOGRAPH +0x8AF1 0x5BC4 #CJK UNIFIED IDEOGRAPH +0x8AF2 0x5C90 #CJK UNIFIED IDEOGRAPH +0x8AF3 0x5E0C #CJK UNIFIED IDEOGRAPH +0x8AF4 0x5E7E #CJK UNIFIED IDEOGRAPH +0x8AF5 0x5FCC #CJK UNIFIED IDEOGRAPH +0x8AF6 0x63EE #CJK UNIFIED IDEOGRAPH +0x8AF7 0x673A #CJK UNIFIED IDEOGRAPH +0x8AF8 0x65D7 #CJK UNIFIED IDEOGRAPH +0x8AF9 0x65E2 #CJK UNIFIED IDEOGRAPH +0x8AFA 0x671F #CJK UNIFIED IDEOGRAPH +0x8AFB 0x68CB #CJK UNIFIED IDEOGRAPH +0x8AFC 0x68C4 #CJK UNIFIED IDEOGRAPH +0x8B40 0x6A5F #CJK UNIFIED IDEOGRAPH +0x8B41 0x5E30 #CJK UNIFIED IDEOGRAPH +0x8B42 0x6BC5 #CJK UNIFIED IDEOGRAPH +0x8B43 0x6C17 #CJK UNIFIED IDEOGRAPH +0x8B44 0x6C7D #CJK UNIFIED IDEOGRAPH +0x8B45 0x757F #CJK UNIFIED IDEOGRAPH +0x8B46 0x7948 #CJK UNIFIED IDEOGRAPH +0x8B47 0x5B63 #CJK UNIFIED IDEOGRAPH +0x8B48 0x7A00 #CJK UNIFIED IDEOGRAPH +0x8B49 0x7D00 #CJK UNIFIED IDEOGRAPH +0x8B4A 0x5FBD #CJK UNIFIED IDEOGRAPH +0x8B4B 0x898F #CJK UNIFIED IDEOGRAPH +0x8B4C 0x8A18 #CJK UNIFIED IDEOGRAPH +0x8B4D 0x8CB4 #CJK UNIFIED IDEOGRAPH +0x8B4E 0x8D77 #CJK UNIFIED IDEOGRAPH +0x8B4F 0x8ECC #CJK UNIFIED IDEOGRAPH +0x8B50 0x8F1D #CJK UNIFIED IDEOGRAPH +0x8B51 0x98E2 #CJK UNIFIED IDEOGRAPH +0x8B52 0x9A0E #CJK UNIFIED IDEOGRAPH +0x8B53 0x9B3C #CJK UNIFIED IDEOGRAPH +0x8B54 0x4E80 #CJK UNIFIED IDEOGRAPH +0x8B55 0x507D #CJK UNIFIED IDEOGRAPH +0x8B56 0x5100 #CJK UNIFIED IDEOGRAPH +0x8B57 0x5993 #CJK UNIFIED IDEOGRAPH +0x8B58 0x5B9C #CJK UNIFIED IDEOGRAPH +0x8B59 0x622F #CJK UNIFIED IDEOGRAPH +0x8B5A 0x6280 #CJK UNIFIED IDEOGRAPH +0x8B5B 0x64EC #CJK UNIFIED IDEOGRAPH +0x8B5C 0x6B3A #CJK UNIFIED IDEOGRAPH +0x8B5D 0x72A0 #CJK UNIFIED IDEOGRAPH +0x8B5E 0x7591 #CJK UNIFIED IDEOGRAPH +0x8B5F 0x7947 #CJK UNIFIED IDEOGRAPH +0x8B60 0x7FA9 #CJK UNIFIED IDEOGRAPH +0x8B61 0x87FB #CJK UNIFIED IDEOGRAPH +0x8B62 0x8ABC #CJK UNIFIED IDEOGRAPH +0x8B63 0x8B70 #CJK UNIFIED IDEOGRAPH +0x8B64 0x63AC #CJK UNIFIED IDEOGRAPH +0x8B65 0x83CA #CJK UNIFIED IDEOGRAPH +0x8B66 0x97A0 #CJK UNIFIED IDEOGRAPH +0x8B67 0x5409 #CJK UNIFIED IDEOGRAPH +0x8B68 0x5403 #CJK UNIFIED IDEOGRAPH +0x8B69 0x55AB #CJK UNIFIED IDEOGRAPH +0x8B6A 0x6854 #CJK UNIFIED IDEOGRAPH +0x8B6B 0x6A58 #CJK UNIFIED IDEOGRAPH +0x8B6C 0x8A70 #CJK UNIFIED IDEOGRAPH +0x8B6D 0x7827 #CJK UNIFIED IDEOGRAPH +0x8B6E 0x6775 #CJK UNIFIED IDEOGRAPH +0x8B6F 0x9ECD #CJK UNIFIED IDEOGRAPH +0x8B70 0x5374 #CJK UNIFIED IDEOGRAPH +0x8B71 0x5BA2 #CJK UNIFIED IDEOGRAPH +0x8B72 0x811A #CJK UNIFIED IDEOGRAPH +0x8B73 0x8650 #CJK UNIFIED IDEOGRAPH +0x8B74 0x9006 #CJK UNIFIED IDEOGRAPH +0x8B75 0x4E18 #CJK UNIFIED IDEOGRAPH +0x8B76 0x4E45 #CJK UNIFIED IDEOGRAPH +0x8B77 0x4EC7 #CJK UNIFIED IDEOGRAPH +0x8B78 0x4F11 #CJK UNIFIED IDEOGRAPH +0x8B79 0x53CA #CJK UNIFIED IDEOGRAPH +0x8B7A 0x5438 #CJK UNIFIED IDEOGRAPH +0x8B7B 0x5BAE #CJK UNIFIED IDEOGRAPH +0x8B7C 0x5F13 #CJK UNIFIED IDEOGRAPH +0x8B7D 0x6025 #CJK UNIFIED IDEOGRAPH +0x8B7E 0x6551 #CJK UNIFIED IDEOGRAPH +0x8B80 0x673D #CJK UNIFIED IDEOGRAPH +0x8B81 0x6C42 #CJK UNIFIED IDEOGRAPH +0x8B82 0x6C72 #CJK UNIFIED IDEOGRAPH +0x8B83 0x6CE3 #CJK UNIFIED IDEOGRAPH +0x8B84 0x7078 #CJK UNIFIED IDEOGRAPH +0x8B85 0x7403 #CJK UNIFIED IDEOGRAPH +0x8B86 0x7A76 #CJK UNIFIED IDEOGRAPH +0x8B87 0x7AAE #CJK UNIFIED IDEOGRAPH +0x8B88 0x7B08 #CJK UNIFIED IDEOGRAPH +0x8B89 0x7D1A #CJK UNIFIED IDEOGRAPH +0x8B8A 0x7CFE #CJK UNIFIED IDEOGRAPH +0x8B8B 0x7D66 #CJK UNIFIED IDEOGRAPH +0x8B8C 0x65E7 #CJK UNIFIED IDEOGRAPH +0x8B8D 0x725B #CJK UNIFIED IDEOGRAPH +0x8B8E 0x53BB #CJK UNIFIED IDEOGRAPH +0x8B8F 0x5C45 #CJK UNIFIED IDEOGRAPH +0x8B90 0x5DE8 #CJK UNIFIED IDEOGRAPH +0x8B91 0x62D2 #CJK UNIFIED IDEOGRAPH +0x8B92 0x62E0 #CJK UNIFIED IDEOGRAPH +0x8B93 0x6319 #CJK UNIFIED IDEOGRAPH +0x8B94 0x6E20 #CJK UNIFIED IDEOGRAPH +0x8B95 0x865A #CJK UNIFIED IDEOGRAPH +0x8B96 0x8A31 #CJK UNIFIED IDEOGRAPH +0x8B97 0x8DDD #CJK UNIFIED IDEOGRAPH +0x8B98 0x92F8 #CJK UNIFIED IDEOGRAPH +0x8B99 0x6F01 #CJK UNIFIED IDEOGRAPH +0x8B9A 0x79A6 #CJK UNIFIED IDEOGRAPH +0x8B9B 0x9B5A #CJK UNIFIED IDEOGRAPH +0x8B9C 0x4EA8 #CJK UNIFIED IDEOGRAPH +0x8B9D 0x4EAB #CJK UNIFIED IDEOGRAPH +0x8B9E 0x4EAC #CJK UNIFIED IDEOGRAPH +0x8B9F 0x4F9B #CJK UNIFIED IDEOGRAPH +0x8BA0 0x4FA0 #CJK UNIFIED IDEOGRAPH +0x8BA1 0x50D1 #CJK UNIFIED IDEOGRAPH +0x8BA2 0x5147 #CJK UNIFIED IDEOGRAPH +0x8BA3 0x7AF6 #CJK UNIFIED IDEOGRAPH +0x8BA4 0x5171 #CJK UNIFIED IDEOGRAPH +0x8BA5 0x51F6 #CJK UNIFIED IDEOGRAPH +0x8BA6 0x5354 #CJK UNIFIED IDEOGRAPH +0x8BA7 0x5321 #CJK UNIFIED IDEOGRAPH +0x8BA8 0x537F #CJK UNIFIED IDEOGRAPH +0x8BA9 0x53EB #CJK UNIFIED IDEOGRAPH +0x8BAA 0x55AC #CJK UNIFIED IDEOGRAPH +0x8BAB 0x5883 #CJK UNIFIED IDEOGRAPH +0x8BAC 0x5CE1 #CJK UNIFIED IDEOGRAPH +0x8BAD 0x5F37 #CJK UNIFIED IDEOGRAPH +0x8BAE 0x5F4A #CJK UNIFIED IDEOGRAPH +0x8BAF 0x602F #CJK UNIFIED IDEOGRAPH +0x8BB0 0x6050 #CJK UNIFIED IDEOGRAPH +0x8BB1 0x606D #CJK UNIFIED IDEOGRAPH +0x8BB2 0x631F #CJK UNIFIED IDEOGRAPH +0x8BB3 0x6559 #CJK UNIFIED IDEOGRAPH +0x8BB4 0x6A4B #CJK UNIFIED IDEOGRAPH +0x8BB5 0x6CC1 #CJK UNIFIED IDEOGRAPH +0x8BB6 0x72C2 #CJK UNIFIED IDEOGRAPH +0x8BB7 0x72ED #CJK UNIFIED IDEOGRAPH +0x8BB8 0x77EF #CJK UNIFIED IDEOGRAPH +0x8BB9 0x80F8 #CJK UNIFIED IDEOGRAPH +0x8BBA 0x8105 #CJK UNIFIED IDEOGRAPH +0x8BBB 0x8208 #CJK UNIFIED IDEOGRAPH +0x8BBC 0x854E #CJK UNIFIED IDEOGRAPH +0x8BBD 0x90F7 #CJK UNIFIED IDEOGRAPH +0x8BBE 0x93E1 #CJK UNIFIED IDEOGRAPH +0x8BBF 0x97FF #CJK UNIFIED IDEOGRAPH +0x8BC0 0x9957 #CJK UNIFIED IDEOGRAPH +0x8BC1 0x9A5A #CJK UNIFIED IDEOGRAPH +0x8BC2 0x4EF0 #CJK UNIFIED IDEOGRAPH +0x8BC3 0x51DD #CJK UNIFIED IDEOGRAPH +0x8BC4 0x5C2D #CJK UNIFIED IDEOGRAPH +0x8BC5 0x6681 #CJK UNIFIED IDEOGRAPH +0x8BC6 0x696D #CJK UNIFIED IDEOGRAPH +0x8BC7 0x5C40 #CJK UNIFIED IDEOGRAPH +0x8BC8 0x66F2 #CJK UNIFIED IDEOGRAPH +0x8BC9 0x6975 #CJK UNIFIED IDEOGRAPH +0x8BCA 0x7389 #CJK UNIFIED IDEOGRAPH +0x8BCB 0x6850 #CJK UNIFIED IDEOGRAPH +0x8BCC 0x7C81 #CJK UNIFIED IDEOGRAPH +0x8BCD 0x50C5 #CJK UNIFIED IDEOGRAPH +0x8BCE 0x52E4 #CJK UNIFIED IDEOGRAPH +0x8BCF 0x5747 #CJK UNIFIED IDEOGRAPH +0x8BD0 0x5DFE #CJK UNIFIED IDEOGRAPH +0x8BD1 0x9326 #CJK UNIFIED IDEOGRAPH +0x8BD2 0x65A4 #CJK UNIFIED IDEOGRAPH +0x8BD3 0x6B23 #CJK UNIFIED IDEOGRAPH +0x8BD4 0x6B3D #CJK UNIFIED IDEOGRAPH +0x8BD5 0x7434 #CJK UNIFIED IDEOGRAPH +0x8BD6 0x7981 #CJK UNIFIED IDEOGRAPH +0x8BD7 0x79BD #CJK UNIFIED IDEOGRAPH +0x8BD8 0x7B4B #CJK UNIFIED IDEOGRAPH +0x8BD9 0x7DCA #CJK UNIFIED IDEOGRAPH +0x8BDA 0x82B9 #CJK UNIFIED IDEOGRAPH +0x8BDB 0x83CC #CJK UNIFIED IDEOGRAPH +0x8BDC 0x887F #CJK UNIFIED IDEOGRAPH +0x8BDD 0x895F #CJK UNIFIED IDEOGRAPH +0x8BDE 0x8B39 #CJK UNIFIED IDEOGRAPH +0x8BDF 0x8FD1 #CJK UNIFIED IDEOGRAPH +0x8BE0 0x91D1 #CJK UNIFIED IDEOGRAPH +0x8BE1 0x541F #CJK UNIFIED IDEOGRAPH +0x8BE2 0x9280 #CJK UNIFIED IDEOGRAPH +0x8BE3 0x4E5D #CJK UNIFIED IDEOGRAPH +0x8BE4 0x5036 #CJK UNIFIED IDEOGRAPH +0x8BE5 0x53E5 #CJK UNIFIED IDEOGRAPH +0x8BE6 0x533A #CJK UNIFIED IDEOGRAPH +0x8BE7 0x72D7 #CJK UNIFIED IDEOGRAPH +0x8BE8 0x7396 #CJK UNIFIED IDEOGRAPH +0x8BE9 0x77E9 #CJK UNIFIED IDEOGRAPH +0x8BEA 0x82E6 #CJK UNIFIED IDEOGRAPH +0x8BEB 0x8EAF #CJK UNIFIED IDEOGRAPH +0x8BEC 0x99C6 #CJK UNIFIED IDEOGRAPH +0x8BED 0x99C8 #CJK UNIFIED IDEOGRAPH +0x8BEE 0x99D2 #CJK UNIFIED IDEOGRAPH +0x8BEF 0x5177 #CJK UNIFIED IDEOGRAPH +0x8BF0 0x611A #CJK UNIFIED IDEOGRAPH +0x8BF1 0x865E #CJK UNIFIED IDEOGRAPH +0x8BF2 0x55B0 #CJK UNIFIED IDEOGRAPH +0x8BF3 0x7A7A #CJK UNIFIED IDEOGRAPH +0x8BF4 0x5076 #CJK UNIFIED IDEOGRAPH +0x8BF5 0x5BD3 #CJK UNIFIED IDEOGRAPH +0x8BF6 0x9047 #CJK UNIFIED IDEOGRAPH +0x8BF7 0x9685 #CJK UNIFIED IDEOGRAPH +0x8BF8 0x4E32 #CJK UNIFIED IDEOGRAPH +0x8BF9 0x6ADB #CJK UNIFIED IDEOGRAPH +0x8BFA 0x91E7 #CJK UNIFIED IDEOGRAPH +0x8BFB 0x5C51 #CJK UNIFIED IDEOGRAPH +0x8BFC 0x5C48 #CJK UNIFIED IDEOGRAPH +0x8C40 0x6398 #CJK UNIFIED IDEOGRAPH +0x8C41 0x7A9F #CJK UNIFIED IDEOGRAPH +0x8C42 0x6C93 #CJK UNIFIED IDEOGRAPH +0x8C43 0x9774 #CJK UNIFIED IDEOGRAPH +0x8C44 0x8F61 #CJK UNIFIED IDEOGRAPH +0x8C45 0x7AAA #CJK UNIFIED IDEOGRAPH +0x8C46 0x718A #CJK UNIFIED IDEOGRAPH +0x8C47 0x9688 #CJK UNIFIED IDEOGRAPH +0x8C48 0x7C82 #CJK UNIFIED IDEOGRAPH +0x8C49 0x6817 #CJK UNIFIED IDEOGRAPH +0x8C4A 0x7E70 #CJK UNIFIED IDEOGRAPH +0x8C4B 0x6851 #CJK UNIFIED IDEOGRAPH +0x8C4C 0x936C #CJK UNIFIED IDEOGRAPH +0x8C4D 0x52F2 #CJK UNIFIED IDEOGRAPH +0x8C4E 0x541B #CJK UNIFIED IDEOGRAPH +0x8C4F 0x85AB #CJK UNIFIED IDEOGRAPH +0x8C50 0x8A13 #CJK UNIFIED IDEOGRAPH +0x8C51 0x7FA4 #CJK UNIFIED IDEOGRAPH +0x8C52 0x8ECD #CJK UNIFIED IDEOGRAPH +0x8C53 0x90E1 #CJK UNIFIED IDEOGRAPH +0x8C54 0x5366 #CJK UNIFIED IDEOGRAPH +0x8C55 0x8888 #CJK UNIFIED IDEOGRAPH +0x8C56 0x7941 #CJK UNIFIED IDEOGRAPH +0x8C57 0x4FC2 #CJK UNIFIED IDEOGRAPH +0x8C58 0x50BE #CJK UNIFIED IDEOGRAPH +0x8C59 0x5211 #CJK UNIFIED IDEOGRAPH +0x8C5A 0x5144 #CJK UNIFIED IDEOGRAPH +0x8C5B 0x5553 #CJK UNIFIED IDEOGRAPH +0x8C5C 0x572D #CJK UNIFIED IDEOGRAPH +0x8C5D 0x73EA #CJK UNIFIED IDEOGRAPH +0x8C5E 0x578B #CJK UNIFIED IDEOGRAPH +0x8C5F 0x5951 #CJK UNIFIED IDEOGRAPH +0x8C60 0x5F62 #CJK UNIFIED IDEOGRAPH +0x8C61 0x5F84 #CJK UNIFIED IDEOGRAPH +0x8C62 0x6075 #CJK UNIFIED IDEOGRAPH +0x8C63 0x6176 #CJK UNIFIED IDEOGRAPH +0x8C64 0x6167 #CJK UNIFIED IDEOGRAPH +0x8C65 0x61A9 #CJK UNIFIED IDEOGRAPH +0x8C66 0x63B2 #CJK UNIFIED IDEOGRAPH +0x8C67 0x643A #CJK UNIFIED IDEOGRAPH +0x8C68 0x656C #CJK UNIFIED IDEOGRAPH +0x8C69 0x666F #CJK UNIFIED IDEOGRAPH +0x8C6A 0x6842 #CJK UNIFIED IDEOGRAPH +0x8C6B 0x6E13 #CJK UNIFIED IDEOGRAPH +0x8C6C 0x7566 #CJK UNIFIED IDEOGRAPH +0x8C6D 0x7A3D #CJK UNIFIED IDEOGRAPH +0x8C6E 0x7CFB #CJK UNIFIED IDEOGRAPH +0x8C6F 0x7D4C #CJK UNIFIED IDEOGRAPH +0x8C70 0x7D99 #CJK UNIFIED IDEOGRAPH +0x8C71 0x7E4B #CJK UNIFIED IDEOGRAPH +0x8C72 0x7F6B #CJK UNIFIED IDEOGRAPH +0x8C73 0x830E #CJK UNIFIED IDEOGRAPH +0x8C74 0x834A #CJK UNIFIED IDEOGRAPH +0x8C75 0x86CD #CJK UNIFIED IDEOGRAPH +0x8C76 0x8A08 #CJK UNIFIED IDEOGRAPH +0x8C77 0x8A63 #CJK UNIFIED IDEOGRAPH +0x8C78 0x8B66 #CJK UNIFIED IDEOGRAPH +0x8C79 0x8EFD #CJK UNIFIED IDEOGRAPH +0x8C7A 0x981A #CJK UNIFIED IDEOGRAPH +0x8C7B 0x9D8F #CJK UNIFIED IDEOGRAPH +0x8C7C 0x82B8 #CJK UNIFIED IDEOGRAPH +0x8C7D 0x8FCE #CJK UNIFIED IDEOGRAPH +0x8C7E 0x9BE8 #CJK UNIFIED IDEOGRAPH +0x8C80 0x5287 #CJK UNIFIED IDEOGRAPH +0x8C81 0x621F #CJK UNIFIED IDEOGRAPH +0x8C82 0x6483 #CJK UNIFIED IDEOGRAPH +0x8C83 0x6FC0 #CJK UNIFIED IDEOGRAPH +0x8C84 0x9699 #CJK UNIFIED IDEOGRAPH +0x8C85 0x6841 #CJK UNIFIED IDEOGRAPH +0x8C86 0x5091 #CJK UNIFIED IDEOGRAPH +0x8C87 0x6B20 #CJK UNIFIED IDEOGRAPH +0x8C88 0x6C7A #CJK UNIFIED IDEOGRAPH +0x8C89 0x6F54 #CJK UNIFIED IDEOGRAPH +0x8C8A 0x7A74 #CJK UNIFIED IDEOGRAPH +0x8C8B 0x7D50 #CJK UNIFIED IDEOGRAPH +0x8C8C 0x8840 #CJK UNIFIED IDEOGRAPH +0x8C8D 0x8A23 #CJK UNIFIED IDEOGRAPH +0x8C8E 0x6708 #CJK UNIFIED IDEOGRAPH +0x8C8F 0x4EF6 #CJK UNIFIED IDEOGRAPH +0x8C90 0x5039 #CJK UNIFIED IDEOGRAPH +0x8C91 0x5026 #CJK UNIFIED IDEOGRAPH +0x8C92 0x5065 #CJK UNIFIED IDEOGRAPH +0x8C93 0x517C #CJK UNIFIED IDEOGRAPH +0x8C94 0x5238 #CJK UNIFIED IDEOGRAPH +0x8C95 0x5263 #CJK UNIFIED IDEOGRAPH +0x8C96 0x55A7 #CJK UNIFIED IDEOGRAPH +0x8C97 0x570F #CJK UNIFIED IDEOGRAPH +0x8C98 0x5805 #CJK UNIFIED IDEOGRAPH +0x8C99 0x5ACC #CJK UNIFIED IDEOGRAPH +0x8C9A 0x5EFA #CJK UNIFIED IDEOGRAPH +0x8C9B 0x61B2 #CJK UNIFIED IDEOGRAPH +0x8C9C 0x61F8 #CJK UNIFIED IDEOGRAPH +0x8C9D 0x62F3 #CJK UNIFIED IDEOGRAPH +0x8C9E 0x6372 #CJK UNIFIED IDEOGRAPH +0x8C9F 0x691C #CJK UNIFIED IDEOGRAPH +0x8CA0 0x6A29 #CJK UNIFIED IDEOGRAPH +0x8CA1 0x727D #CJK UNIFIED IDEOGRAPH +0x8CA2 0x72AC #CJK UNIFIED IDEOGRAPH +0x8CA3 0x732E #CJK UNIFIED IDEOGRAPH +0x8CA4 0x7814 #CJK UNIFIED IDEOGRAPH +0x8CA5 0x786F #CJK UNIFIED IDEOGRAPH +0x8CA6 0x7D79 #CJK UNIFIED IDEOGRAPH +0x8CA7 0x770C #CJK UNIFIED IDEOGRAPH +0x8CA8 0x80A9 #CJK UNIFIED IDEOGRAPH +0x8CA9 0x898B #CJK UNIFIED IDEOGRAPH +0x8CAA 0x8B19 #CJK UNIFIED IDEOGRAPH +0x8CAB 0x8CE2 #CJK UNIFIED IDEOGRAPH +0x8CAC 0x8ED2 #CJK UNIFIED IDEOGRAPH +0x8CAD 0x9063 #CJK UNIFIED IDEOGRAPH +0x8CAE 0x9375 #CJK UNIFIED IDEOGRAPH +0x8CAF 0x967A #CJK UNIFIED IDEOGRAPH +0x8CB0 0x9855 #CJK UNIFIED IDEOGRAPH +0x8CB1 0x9A13 #CJK UNIFIED IDEOGRAPH +0x8CB2 0x9E78 #CJK UNIFIED IDEOGRAPH +0x8CB3 0x5143 #CJK UNIFIED IDEOGRAPH +0x8CB4 0x539F #CJK UNIFIED IDEOGRAPH +0x8CB5 0x53B3 #CJK UNIFIED IDEOGRAPH +0x8CB6 0x5E7B #CJK UNIFIED IDEOGRAPH +0x8CB7 0x5F26 #CJK UNIFIED IDEOGRAPH +0x8CB8 0x6E1B #CJK UNIFIED IDEOGRAPH +0x8CB9 0x6E90 #CJK UNIFIED IDEOGRAPH +0x8CBA 0x7384 #CJK UNIFIED IDEOGRAPH +0x8CBB 0x73FE #CJK UNIFIED IDEOGRAPH +0x8CBC 0x7D43 #CJK UNIFIED IDEOGRAPH +0x8CBD 0x8237 #CJK UNIFIED IDEOGRAPH +0x8CBE 0x8A00 #CJK UNIFIED IDEOGRAPH +0x8CBF 0x8AFA #CJK UNIFIED IDEOGRAPH +0x8CC0 0x9650 #CJK UNIFIED IDEOGRAPH +0x8CC1 0x4E4E #CJK UNIFIED IDEOGRAPH +0x8CC2 0x500B #CJK UNIFIED IDEOGRAPH +0x8CC3 0x53E4 #CJK UNIFIED IDEOGRAPH +0x8CC4 0x547C #CJK UNIFIED IDEOGRAPH +0x8CC5 0x56FA #CJK UNIFIED IDEOGRAPH +0x8CC6 0x59D1 #CJK UNIFIED IDEOGRAPH +0x8CC7 0x5B64 #CJK UNIFIED IDEOGRAPH +0x8CC8 0x5DF1 #CJK UNIFIED IDEOGRAPH +0x8CC9 0x5EAB #CJK UNIFIED IDEOGRAPH +0x8CCA 0x5F27 #CJK UNIFIED IDEOGRAPH +0x8CCB 0x6238 #CJK UNIFIED IDEOGRAPH +0x8CCC 0x6545 #CJK UNIFIED IDEOGRAPH +0x8CCD 0x67AF #CJK UNIFIED IDEOGRAPH +0x8CCE 0x6E56 #CJK UNIFIED IDEOGRAPH +0x8CCF 0x72D0 #CJK UNIFIED IDEOGRAPH +0x8CD0 0x7CCA #CJK UNIFIED IDEOGRAPH +0x8CD1 0x88B4 #CJK UNIFIED IDEOGRAPH +0x8CD2 0x80A1 #CJK UNIFIED IDEOGRAPH +0x8CD3 0x80E1 #CJK UNIFIED IDEOGRAPH +0x8CD4 0x83F0 #CJK UNIFIED IDEOGRAPH +0x8CD5 0x864E #CJK UNIFIED IDEOGRAPH +0x8CD6 0x8A87 #CJK UNIFIED IDEOGRAPH +0x8CD7 0x8DE8 #CJK UNIFIED IDEOGRAPH +0x8CD8 0x9237 #CJK UNIFIED IDEOGRAPH +0x8CD9 0x96C7 #CJK UNIFIED IDEOGRAPH +0x8CDA 0x9867 #CJK UNIFIED IDEOGRAPH +0x8CDB 0x9F13 #CJK UNIFIED IDEOGRAPH +0x8CDC 0x4E94 #CJK UNIFIED IDEOGRAPH +0x8CDD 0x4E92 #CJK UNIFIED IDEOGRAPH +0x8CDE 0x4F0D #CJK UNIFIED IDEOGRAPH +0x8CDF 0x5348 #CJK UNIFIED IDEOGRAPH +0x8CE0 0x5449 #CJK UNIFIED IDEOGRAPH +0x8CE1 0x543E #CJK UNIFIED IDEOGRAPH +0x8CE2 0x5A2F #CJK UNIFIED IDEOGRAPH +0x8CE3 0x5F8C #CJK UNIFIED IDEOGRAPH +0x8CE4 0x5FA1 #CJK UNIFIED IDEOGRAPH +0x8CE5 0x609F #CJK UNIFIED IDEOGRAPH +0x8CE6 0x68A7 #CJK UNIFIED IDEOGRAPH +0x8CE7 0x6A8E #CJK UNIFIED IDEOGRAPH +0x8CE8 0x745A #CJK UNIFIED IDEOGRAPH +0x8CE9 0x7881 #CJK UNIFIED IDEOGRAPH +0x8CEA 0x8A9E #CJK UNIFIED IDEOGRAPH +0x8CEB 0x8AA4 #CJK UNIFIED IDEOGRAPH +0x8CEC 0x8B77 #CJK UNIFIED IDEOGRAPH +0x8CED 0x9190 #CJK UNIFIED IDEOGRAPH +0x8CEE 0x4E5E #CJK UNIFIED IDEOGRAPH +0x8CEF 0x9BC9 #CJK UNIFIED IDEOGRAPH +0x8CF0 0x4EA4 #CJK UNIFIED IDEOGRAPH +0x8CF1 0x4F7C #CJK UNIFIED IDEOGRAPH +0x8CF2 0x4FAF #CJK UNIFIED IDEOGRAPH +0x8CF3 0x5019 #CJK UNIFIED IDEOGRAPH +0x8CF4 0x5016 #CJK UNIFIED IDEOGRAPH +0x8CF5 0x5149 #CJK UNIFIED IDEOGRAPH +0x8CF6 0x516C #CJK UNIFIED IDEOGRAPH +0x8CF7 0x529F #CJK UNIFIED IDEOGRAPH +0x8CF8 0x52B9 #CJK UNIFIED IDEOGRAPH +0x8CF9 0x52FE #CJK UNIFIED IDEOGRAPH +0x8CFA 0x539A #CJK UNIFIED IDEOGRAPH +0x8CFB 0x53E3 #CJK UNIFIED IDEOGRAPH +0x8CFC 0x5411 #CJK UNIFIED IDEOGRAPH +0x8D40 0x540E #CJK UNIFIED IDEOGRAPH +0x8D41 0x5589 #CJK UNIFIED IDEOGRAPH +0x8D42 0x5751 #CJK UNIFIED IDEOGRAPH +0x8D43 0x57A2 #CJK UNIFIED IDEOGRAPH +0x8D44 0x597D #CJK UNIFIED IDEOGRAPH +0x8D45 0x5B54 #CJK UNIFIED IDEOGRAPH +0x8D46 0x5B5D #CJK UNIFIED IDEOGRAPH +0x8D47 0x5B8F #CJK UNIFIED IDEOGRAPH +0x8D48 0x5DE5 #CJK UNIFIED IDEOGRAPH +0x8D49 0x5DE7 #CJK UNIFIED IDEOGRAPH +0x8D4A 0x5DF7 #CJK UNIFIED IDEOGRAPH +0x8D4B 0x5E78 #CJK UNIFIED IDEOGRAPH +0x8D4C 0x5E83 #CJK UNIFIED IDEOGRAPH +0x8D4D 0x5E9A #CJK UNIFIED IDEOGRAPH +0x8D4E 0x5EB7 #CJK UNIFIED IDEOGRAPH +0x8D4F 0x5F18 #CJK UNIFIED IDEOGRAPH +0x8D50 0x6052 #CJK UNIFIED IDEOGRAPH +0x8D51 0x614C #CJK UNIFIED IDEOGRAPH +0x8D52 0x6297 #CJK UNIFIED IDEOGRAPH +0x8D53 0x62D8 #CJK UNIFIED IDEOGRAPH +0x8D54 0x63A7 #CJK UNIFIED IDEOGRAPH +0x8D55 0x653B #CJK UNIFIED IDEOGRAPH +0x8D56 0x6602 #CJK UNIFIED IDEOGRAPH +0x8D57 0x6643 #CJK UNIFIED IDEOGRAPH +0x8D58 0x66F4 #CJK UNIFIED IDEOGRAPH +0x8D59 0x676D #CJK UNIFIED IDEOGRAPH +0x8D5A 0x6821 #CJK UNIFIED IDEOGRAPH +0x8D5B 0x6897 #CJK UNIFIED IDEOGRAPH +0x8D5C 0x69CB #CJK UNIFIED IDEOGRAPH +0x8D5D 0x6C5F #CJK UNIFIED IDEOGRAPH +0x8D5E 0x6D2A #CJK UNIFIED IDEOGRAPH +0x8D5F 0x6D69 #CJK UNIFIED IDEOGRAPH +0x8D60 0x6E2F #CJK UNIFIED IDEOGRAPH +0x8D61 0x6E9D #CJK UNIFIED IDEOGRAPH +0x8D62 0x7532 #CJK UNIFIED IDEOGRAPH +0x8D63 0x7687 #CJK UNIFIED IDEOGRAPH +0x8D64 0x786C #CJK UNIFIED IDEOGRAPH +0x8D65 0x7A3F #CJK UNIFIED IDEOGRAPH +0x8D66 0x7CE0 #CJK UNIFIED IDEOGRAPH +0x8D67 0x7D05 #CJK UNIFIED IDEOGRAPH +0x8D68 0x7D18 #CJK UNIFIED IDEOGRAPH +0x8D69 0x7D5E #CJK UNIFIED IDEOGRAPH +0x8D6A 0x7DB1 #CJK UNIFIED IDEOGRAPH +0x8D6B 0x8015 #CJK UNIFIED IDEOGRAPH +0x8D6C 0x8003 #CJK UNIFIED IDEOGRAPH +0x8D6D 0x80AF #CJK UNIFIED IDEOGRAPH +0x8D6E 0x80B1 #CJK UNIFIED IDEOGRAPH +0x8D6F 0x8154 #CJK UNIFIED IDEOGRAPH +0x8D70 0x818F #CJK UNIFIED IDEOGRAPH +0x8D71 0x822A #CJK UNIFIED IDEOGRAPH +0x8D72 0x8352 #CJK UNIFIED IDEOGRAPH +0x8D73 0x884C #CJK UNIFIED IDEOGRAPH +0x8D74 0x8861 #CJK UNIFIED IDEOGRAPH +0x8D75 0x8B1B #CJK UNIFIED IDEOGRAPH +0x8D76 0x8CA2 #CJK UNIFIED IDEOGRAPH +0x8D77 0x8CFC #CJK UNIFIED IDEOGRAPH +0x8D78 0x90CA #CJK UNIFIED IDEOGRAPH +0x8D79 0x9175 #CJK UNIFIED IDEOGRAPH +0x8D7A 0x9271 #CJK UNIFIED IDEOGRAPH +0x8D7B 0x783F #CJK UNIFIED IDEOGRAPH +0x8D7C 0x92FC #CJK UNIFIED IDEOGRAPH +0x8D7D 0x95A4 #CJK UNIFIED IDEOGRAPH +0x8D7E 0x964D #CJK UNIFIED IDEOGRAPH +0x8D80 0x9805 #CJK UNIFIED IDEOGRAPH +0x8D81 0x9999 #CJK UNIFIED IDEOGRAPH +0x8D82 0x9AD8 #CJK UNIFIED IDEOGRAPH +0x8D83 0x9D3B #CJK UNIFIED IDEOGRAPH +0x8D84 0x525B #CJK UNIFIED IDEOGRAPH +0x8D85 0x52AB #CJK UNIFIED IDEOGRAPH +0x8D86 0x53F7 #CJK UNIFIED IDEOGRAPH +0x8D87 0x5408 #CJK UNIFIED IDEOGRAPH +0x8D88 0x58D5 #CJK UNIFIED IDEOGRAPH +0x8D89 0x62F7 #CJK UNIFIED IDEOGRAPH +0x8D8A 0x6FE0 #CJK UNIFIED IDEOGRAPH +0x8D8B 0x8C6A #CJK UNIFIED IDEOGRAPH +0x8D8C 0x8F5F #CJK UNIFIED IDEOGRAPH +0x8D8D 0x9EB9 #CJK UNIFIED IDEOGRAPH +0x8D8E 0x514B #CJK UNIFIED IDEOGRAPH +0x8D8F 0x523B #CJK UNIFIED IDEOGRAPH +0x8D90 0x544A #CJK UNIFIED IDEOGRAPH +0x8D91 0x56FD #CJK UNIFIED IDEOGRAPH +0x8D92 0x7A40 #CJK UNIFIED IDEOGRAPH +0x8D93 0x9177 #CJK UNIFIED IDEOGRAPH +0x8D94 0x9D60 #CJK UNIFIED IDEOGRAPH +0x8D95 0x9ED2 #CJK UNIFIED IDEOGRAPH +0x8D96 0x7344 #CJK UNIFIED IDEOGRAPH +0x8D97 0x6F09 #CJK UNIFIED IDEOGRAPH +0x8D98 0x8170 #CJK UNIFIED IDEOGRAPH +0x8D99 0x7511 #CJK UNIFIED IDEOGRAPH +0x8D9A 0x5FFD #CJK UNIFIED IDEOGRAPH +0x8D9B 0x60DA #CJK UNIFIED IDEOGRAPH +0x8D9C 0x9AA8 #CJK UNIFIED IDEOGRAPH +0x8D9D 0x72DB #CJK UNIFIED IDEOGRAPH +0x8D9E 0x8FBC #CJK UNIFIED IDEOGRAPH +0x8D9F 0x6B64 #CJK UNIFIED IDEOGRAPH +0x8DA0 0x9803 #CJK UNIFIED IDEOGRAPH +0x8DA1 0x4ECA #CJK UNIFIED IDEOGRAPH +0x8DA2 0x56F0 #CJK UNIFIED IDEOGRAPH +0x8DA3 0x5764 #CJK UNIFIED IDEOGRAPH +0x8DA4 0x58BE #CJK UNIFIED IDEOGRAPH +0x8DA5 0x5A5A #CJK UNIFIED IDEOGRAPH +0x8DA6 0x6068 #CJK UNIFIED IDEOGRAPH +0x8DA7 0x61C7 #CJK UNIFIED IDEOGRAPH +0x8DA8 0x660F #CJK UNIFIED IDEOGRAPH +0x8DA9 0x6606 #CJK UNIFIED IDEOGRAPH +0x8DAA 0x6839 #CJK UNIFIED IDEOGRAPH +0x8DAB 0x68B1 #CJK UNIFIED IDEOGRAPH +0x8DAC 0x6DF7 #CJK UNIFIED IDEOGRAPH +0x8DAD 0x75D5 #CJK UNIFIED IDEOGRAPH +0x8DAE 0x7D3A #CJK UNIFIED IDEOGRAPH +0x8DAF 0x826E #CJK UNIFIED IDEOGRAPH +0x8DB0 0x9B42 #CJK UNIFIED IDEOGRAPH +0x8DB1 0x4E9B #CJK UNIFIED IDEOGRAPH +0x8DB2 0x4F50 #CJK UNIFIED IDEOGRAPH +0x8DB3 0x53C9 #CJK UNIFIED IDEOGRAPH +0x8DB4 0x5506 #CJK UNIFIED IDEOGRAPH +0x8DB5 0x5D6F #CJK UNIFIED IDEOGRAPH +0x8DB6 0x5DE6 #CJK UNIFIED IDEOGRAPH +0x8DB7 0x5DEE #CJK UNIFIED IDEOGRAPH +0x8DB8 0x67FB #CJK UNIFIED IDEOGRAPH +0x8DB9 0x6C99 #CJK UNIFIED IDEOGRAPH +0x8DBA 0x7473 #CJK UNIFIED IDEOGRAPH +0x8DBB 0x7802 #CJK UNIFIED IDEOGRAPH +0x8DBC 0x8A50 #CJK UNIFIED IDEOGRAPH +0x8DBD 0x9396 #CJK UNIFIED IDEOGRAPH +0x8DBE 0x88DF #CJK UNIFIED IDEOGRAPH +0x8DBF 0x5750 #CJK UNIFIED IDEOGRAPH +0x8DC0 0x5EA7 #CJK UNIFIED IDEOGRAPH +0x8DC1 0x632B #CJK UNIFIED IDEOGRAPH +0x8DC2 0x50B5 #CJK UNIFIED IDEOGRAPH +0x8DC3 0x50AC #CJK UNIFIED IDEOGRAPH +0x8DC4 0x518D #CJK UNIFIED IDEOGRAPH +0x8DC5 0x6700 #CJK UNIFIED IDEOGRAPH +0x8DC6 0x54C9 #CJK UNIFIED IDEOGRAPH +0x8DC7 0x585E #CJK UNIFIED IDEOGRAPH +0x8DC8 0x59BB #CJK UNIFIED IDEOGRAPH +0x8DC9 0x5BB0 #CJK UNIFIED IDEOGRAPH +0x8DCA 0x5F69 #CJK UNIFIED IDEOGRAPH +0x8DCB 0x624D #CJK UNIFIED IDEOGRAPH +0x8DCC 0x63A1 #CJK UNIFIED IDEOGRAPH +0x8DCD 0x683D #CJK UNIFIED IDEOGRAPH +0x8DCE 0x6B73 #CJK UNIFIED IDEOGRAPH +0x8DCF 0x6E08 #CJK UNIFIED IDEOGRAPH +0x8DD0 0x707D #CJK UNIFIED IDEOGRAPH +0x8DD1 0x91C7 #CJK UNIFIED IDEOGRAPH +0x8DD2 0x7280 #CJK UNIFIED IDEOGRAPH +0x8DD3 0x7815 #CJK UNIFIED IDEOGRAPH +0x8DD4 0x7826 #CJK UNIFIED IDEOGRAPH +0x8DD5 0x796D #CJK UNIFIED IDEOGRAPH +0x8DD6 0x658E #CJK UNIFIED IDEOGRAPH +0x8DD7 0x7D30 #CJK UNIFIED IDEOGRAPH +0x8DD8 0x83DC #CJK UNIFIED IDEOGRAPH +0x8DD9 0x88C1 #CJK UNIFIED IDEOGRAPH +0x8DDA 0x8F09 #CJK UNIFIED IDEOGRAPH +0x8DDB 0x969B #CJK UNIFIED IDEOGRAPH +0x8DDC 0x5264 #CJK UNIFIED IDEOGRAPH +0x8DDD 0x5728 #CJK UNIFIED IDEOGRAPH +0x8DDE 0x6750 #CJK UNIFIED IDEOGRAPH +0x8DDF 0x7F6A #CJK UNIFIED IDEOGRAPH +0x8DE0 0x8CA1 #CJK UNIFIED IDEOGRAPH +0x8DE1 0x51B4 #CJK UNIFIED IDEOGRAPH +0x8DE2 0x5742 #CJK UNIFIED IDEOGRAPH +0x8DE3 0x962A #CJK UNIFIED IDEOGRAPH +0x8DE4 0x583A #CJK UNIFIED IDEOGRAPH +0x8DE5 0x698A #CJK UNIFIED IDEOGRAPH +0x8DE6 0x80B4 #CJK UNIFIED IDEOGRAPH +0x8DE7 0x54B2 #CJK UNIFIED IDEOGRAPH +0x8DE8 0x5D0E #CJK UNIFIED IDEOGRAPH +0x8DE9 0x57FC #CJK UNIFIED IDEOGRAPH +0x8DEA 0x7895 #CJK UNIFIED IDEOGRAPH +0x8DEB 0x9DFA #CJK UNIFIED IDEOGRAPH +0x8DEC 0x4F5C #CJK UNIFIED IDEOGRAPH +0x8DED 0x524A #CJK UNIFIED IDEOGRAPH +0x8DEE 0x548B #CJK UNIFIED IDEOGRAPH +0x8DEF 0x643E #CJK UNIFIED IDEOGRAPH +0x8DF0 0x6628 #CJK UNIFIED IDEOGRAPH +0x8DF1 0x6714 #CJK UNIFIED IDEOGRAPH +0x8DF2 0x67F5 #CJK UNIFIED IDEOGRAPH +0x8DF3 0x7A84 #CJK UNIFIED IDEOGRAPH +0x8DF4 0x7B56 #CJK UNIFIED IDEOGRAPH +0x8DF5 0x7D22 #CJK UNIFIED IDEOGRAPH +0x8DF6 0x932F #CJK UNIFIED IDEOGRAPH +0x8DF7 0x685C #CJK UNIFIED IDEOGRAPH +0x8DF8 0x9BAD #CJK UNIFIED IDEOGRAPH +0x8DF9 0x7B39 #CJK UNIFIED IDEOGRAPH +0x8DFA 0x5319 #CJK UNIFIED IDEOGRAPH +0x8DFB 0x518A #CJK UNIFIED IDEOGRAPH +0x8DFC 0x5237 #CJK UNIFIED IDEOGRAPH +0x8E40 0x5BDF #CJK UNIFIED IDEOGRAPH +0x8E41 0x62F6 #CJK UNIFIED IDEOGRAPH +0x8E42 0x64AE #CJK UNIFIED IDEOGRAPH +0x8E43 0x64E6 #CJK UNIFIED IDEOGRAPH +0x8E44 0x672D #CJK UNIFIED IDEOGRAPH +0x8E45 0x6BBA #CJK UNIFIED IDEOGRAPH +0x8E46 0x85A9 #CJK UNIFIED IDEOGRAPH +0x8E47 0x96D1 #CJK UNIFIED IDEOGRAPH +0x8E48 0x7690 #CJK UNIFIED IDEOGRAPH +0x8E49 0x9BD6 #CJK UNIFIED IDEOGRAPH +0x8E4A 0x634C #CJK UNIFIED IDEOGRAPH +0x8E4B 0x9306 #CJK UNIFIED IDEOGRAPH +0x8E4C 0x9BAB #CJK UNIFIED IDEOGRAPH +0x8E4D 0x76BF #CJK UNIFIED IDEOGRAPH +0x8E4E 0x6652 #CJK UNIFIED IDEOGRAPH +0x8E4F 0x4E09 #CJK UNIFIED IDEOGRAPH +0x8E50 0x5098 #CJK UNIFIED IDEOGRAPH +0x8E51 0x53C2 #CJK UNIFIED IDEOGRAPH +0x8E52 0x5C71 #CJK UNIFIED IDEOGRAPH +0x8E53 0x60E8 #CJK UNIFIED IDEOGRAPH +0x8E54 0x6492 #CJK UNIFIED IDEOGRAPH +0x8E55 0x6563 #CJK UNIFIED IDEOGRAPH +0x8E56 0x685F #CJK UNIFIED IDEOGRAPH +0x8E57 0x71E6 #CJK UNIFIED IDEOGRAPH +0x8E58 0x73CA #CJK UNIFIED IDEOGRAPH +0x8E59 0x7523 #CJK UNIFIED IDEOGRAPH +0x8E5A 0x7B97 #CJK UNIFIED IDEOGRAPH +0x8E5B 0x7E82 #CJK UNIFIED IDEOGRAPH +0x8E5C 0x8695 #CJK UNIFIED IDEOGRAPH +0x8E5D 0x8B83 #CJK UNIFIED IDEOGRAPH +0x8E5E 0x8CDB #CJK UNIFIED IDEOGRAPH +0x8E5F 0x9178 #CJK UNIFIED IDEOGRAPH +0x8E60 0x9910 #CJK UNIFIED IDEOGRAPH +0x8E61 0x65AC #CJK UNIFIED IDEOGRAPH +0x8E62 0x66AB #CJK UNIFIED IDEOGRAPH +0x8E63 0x6B8B #CJK UNIFIED IDEOGRAPH +0x8E64 0x4ED5 #CJK UNIFIED IDEOGRAPH +0x8E65 0x4ED4 #CJK UNIFIED IDEOGRAPH +0x8E66 0x4F3A #CJK UNIFIED IDEOGRAPH +0x8E67 0x4F7F #CJK UNIFIED IDEOGRAPH +0x8E68 0x523A #CJK UNIFIED IDEOGRAPH +0x8E69 0x53F8 #CJK UNIFIED IDEOGRAPH +0x8E6A 0x53F2 #CJK UNIFIED IDEOGRAPH +0x8E6B 0x55E3 #CJK UNIFIED IDEOGRAPH +0x8E6C 0x56DB #CJK UNIFIED IDEOGRAPH +0x8E6D 0x58EB #CJK UNIFIED IDEOGRAPH +0x8E6E 0x59CB #CJK UNIFIED IDEOGRAPH +0x8E6F 0x59C9 #CJK UNIFIED IDEOGRAPH +0x8E70 0x59FF #CJK UNIFIED IDEOGRAPH +0x8E71 0x5B50 #CJK UNIFIED IDEOGRAPH +0x8E72 0x5C4D #CJK UNIFIED IDEOGRAPH +0x8E73 0x5E02 #CJK UNIFIED IDEOGRAPH +0x8E74 0x5E2B #CJK UNIFIED IDEOGRAPH +0x8E75 0x5FD7 #CJK UNIFIED IDEOGRAPH +0x8E76 0x601D #CJK UNIFIED IDEOGRAPH +0x8E77 0x6307 #CJK UNIFIED IDEOGRAPH +0x8E78 0x652F #CJK UNIFIED IDEOGRAPH +0x8E79 0x5B5C #CJK UNIFIED IDEOGRAPH +0x8E7A 0x65AF #CJK UNIFIED IDEOGRAPH +0x8E7B 0x65BD #CJK UNIFIED IDEOGRAPH +0x8E7C 0x65E8 #CJK UNIFIED IDEOGRAPH +0x8E7D 0x679D #CJK UNIFIED IDEOGRAPH +0x8E7E 0x6B62 #CJK UNIFIED IDEOGRAPH +0x8E80 0x6B7B #CJK UNIFIED IDEOGRAPH +0x8E81 0x6C0F #CJK UNIFIED IDEOGRAPH +0x8E82 0x7345 #CJK UNIFIED IDEOGRAPH +0x8E83 0x7949 #CJK UNIFIED IDEOGRAPH +0x8E84 0x79C1 #CJK UNIFIED IDEOGRAPH +0x8E85 0x7CF8 #CJK UNIFIED IDEOGRAPH +0x8E86 0x7D19 #CJK UNIFIED IDEOGRAPH +0x8E87 0x7D2B #CJK UNIFIED IDEOGRAPH +0x8E88 0x80A2 #CJK UNIFIED IDEOGRAPH +0x8E89 0x8102 #CJK UNIFIED IDEOGRAPH +0x8E8A 0x81F3 #CJK UNIFIED IDEOGRAPH +0x8E8B 0x8996 #CJK UNIFIED IDEOGRAPH +0x8E8C 0x8A5E #CJK UNIFIED IDEOGRAPH +0x8E8D 0x8A69 #CJK UNIFIED IDEOGRAPH +0x8E8E 0x8A66 #CJK UNIFIED IDEOGRAPH +0x8E8F 0x8A8C #CJK UNIFIED IDEOGRAPH +0x8E90 0x8AEE #CJK UNIFIED IDEOGRAPH +0x8E91 0x8CC7 #CJK UNIFIED IDEOGRAPH +0x8E92 0x8CDC #CJK UNIFIED IDEOGRAPH +0x8E93 0x96CC #CJK UNIFIED IDEOGRAPH +0x8E94 0x98FC #CJK UNIFIED IDEOGRAPH +0x8E95 0x6B6F #CJK UNIFIED IDEOGRAPH +0x8E96 0x4E8B #CJK UNIFIED IDEOGRAPH +0x8E97 0x4F3C #CJK UNIFIED IDEOGRAPH +0x8E98 0x4F8D #CJK UNIFIED IDEOGRAPH +0x8E99 0x5150 #CJK UNIFIED IDEOGRAPH +0x8E9A 0x5B57 #CJK UNIFIED IDEOGRAPH +0x8E9B 0x5BFA #CJK UNIFIED IDEOGRAPH +0x8E9C 0x6148 #CJK UNIFIED IDEOGRAPH +0x8E9D 0x6301 #CJK UNIFIED IDEOGRAPH +0x8E9E 0x6642 #CJK UNIFIED IDEOGRAPH +0x8E9F 0x6B21 #CJK UNIFIED IDEOGRAPH +0x8EA0 0x6ECB #CJK UNIFIED IDEOGRAPH +0x8EA1 0x6CBB #CJK UNIFIED IDEOGRAPH +0x8EA2 0x723E #CJK UNIFIED IDEOGRAPH +0x8EA3 0x74BD #CJK UNIFIED IDEOGRAPH +0x8EA4 0x75D4 #CJK UNIFIED IDEOGRAPH +0x8EA5 0x78C1 #CJK UNIFIED IDEOGRAPH +0x8EA6 0x793A #CJK UNIFIED IDEOGRAPH +0x8EA7 0x800C #CJK UNIFIED IDEOGRAPH +0x8EA8 0x8033 #CJK UNIFIED IDEOGRAPH +0x8EA9 0x81EA #CJK UNIFIED IDEOGRAPH +0x8EAA 0x8494 #CJK UNIFIED IDEOGRAPH +0x8EAB 0x8F9E #CJK UNIFIED IDEOGRAPH +0x8EAC 0x6C50 #CJK UNIFIED IDEOGRAPH +0x8EAD 0x9E7F #CJK UNIFIED IDEOGRAPH +0x8EAE 0x5F0F #CJK UNIFIED IDEOGRAPH +0x8EAF 0x8B58 #CJK UNIFIED IDEOGRAPH +0x8EB0 0x9D2B #CJK UNIFIED IDEOGRAPH +0x8EB1 0x7AFA #CJK UNIFIED IDEOGRAPH +0x8EB2 0x8EF8 #CJK UNIFIED IDEOGRAPH +0x8EB3 0x5B8D #CJK UNIFIED IDEOGRAPH +0x8EB4 0x96EB #CJK UNIFIED IDEOGRAPH +0x8EB5 0x4E03 #CJK UNIFIED IDEOGRAPH +0x8EB6 0x53F1 #CJK UNIFIED IDEOGRAPH +0x8EB7 0x57F7 #CJK UNIFIED IDEOGRAPH +0x8EB8 0x5931 #CJK UNIFIED IDEOGRAPH +0x8EB9 0x5AC9 #CJK UNIFIED IDEOGRAPH +0x8EBA 0x5BA4 #CJK UNIFIED IDEOGRAPH +0x8EBB 0x6089 #CJK UNIFIED IDEOGRAPH +0x8EBC 0x6E7F #CJK UNIFIED IDEOGRAPH +0x8EBD 0x6F06 #CJK UNIFIED IDEOGRAPH +0x8EBE 0x75BE #CJK UNIFIED IDEOGRAPH +0x8EBF 0x8CEA #CJK UNIFIED IDEOGRAPH +0x8EC0 0x5B9F #CJK UNIFIED IDEOGRAPH +0x8EC1 0x8500 #CJK UNIFIED IDEOGRAPH +0x8EC2 0x7BE0 #CJK UNIFIED IDEOGRAPH +0x8EC3 0x5072 #CJK UNIFIED IDEOGRAPH +0x8EC4 0x67F4 #CJK UNIFIED IDEOGRAPH +0x8EC5 0x829D #CJK UNIFIED IDEOGRAPH +0x8EC6 0x5C61 #CJK UNIFIED IDEOGRAPH +0x8EC7 0x854A #CJK UNIFIED IDEOGRAPH +0x8EC8 0x7E1E #CJK UNIFIED IDEOGRAPH +0x8EC9 0x820E #CJK UNIFIED IDEOGRAPH +0x8ECA 0x5199 #CJK UNIFIED IDEOGRAPH +0x8ECB 0x5C04 #CJK UNIFIED IDEOGRAPH +0x8ECC 0x6368 #CJK UNIFIED IDEOGRAPH +0x8ECD 0x8D66 #CJK UNIFIED IDEOGRAPH +0x8ECE 0x659C #CJK UNIFIED IDEOGRAPH +0x8ECF 0x716E #CJK UNIFIED IDEOGRAPH +0x8ED0 0x793E #CJK UNIFIED IDEOGRAPH +0x8ED1 0x7D17 #CJK UNIFIED IDEOGRAPH +0x8ED2 0x8005 #CJK UNIFIED IDEOGRAPH +0x8ED3 0x8B1D #CJK UNIFIED IDEOGRAPH +0x8ED4 0x8ECA #CJK UNIFIED IDEOGRAPH +0x8ED5 0x906E #CJK UNIFIED IDEOGRAPH +0x8ED6 0x86C7 #CJK UNIFIED IDEOGRAPH +0x8ED7 0x90AA #CJK UNIFIED IDEOGRAPH +0x8ED8 0x501F #CJK UNIFIED IDEOGRAPH +0x8ED9 0x52FA #CJK UNIFIED IDEOGRAPH +0x8EDA 0x5C3A #CJK UNIFIED IDEOGRAPH +0x8EDB 0x6753 #CJK UNIFIED IDEOGRAPH +0x8EDC 0x707C #CJK UNIFIED IDEOGRAPH +0x8EDD 0x7235 #CJK UNIFIED IDEOGRAPH +0x8EDE 0x914C #CJK UNIFIED IDEOGRAPH +0x8EDF 0x91C8 #CJK UNIFIED IDEOGRAPH +0x8EE0 0x932B #CJK UNIFIED IDEOGRAPH +0x8EE1 0x82E5 #CJK UNIFIED IDEOGRAPH +0x8EE2 0x5BC2 #CJK UNIFIED IDEOGRAPH +0x8EE3 0x5F31 #CJK UNIFIED IDEOGRAPH +0x8EE4 0x60F9 #CJK UNIFIED IDEOGRAPH +0x8EE5 0x4E3B #CJK UNIFIED IDEOGRAPH +0x8EE6 0x53D6 #CJK UNIFIED IDEOGRAPH +0x8EE7 0x5B88 #CJK UNIFIED IDEOGRAPH +0x8EE8 0x624B #CJK UNIFIED IDEOGRAPH +0x8EE9 0x6731 #CJK UNIFIED IDEOGRAPH +0x8EEA 0x6B8A #CJK UNIFIED IDEOGRAPH +0x8EEB 0x72E9 #CJK UNIFIED IDEOGRAPH +0x8EEC 0x73E0 #CJK UNIFIED IDEOGRAPH +0x8EED 0x7A2E #CJK UNIFIED IDEOGRAPH +0x8EEE 0x816B #CJK UNIFIED IDEOGRAPH +0x8EEF 0x8DA3 #CJK UNIFIED IDEOGRAPH +0x8EF0 0x9152 #CJK UNIFIED IDEOGRAPH +0x8EF1 0x9996 #CJK UNIFIED IDEOGRAPH +0x8EF2 0x5112 #CJK UNIFIED IDEOGRAPH +0x8EF3 0x53D7 #CJK UNIFIED IDEOGRAPH +0x8EF4 0x546A #CJK UNIFIED IDEOGRAPH +0x8EF5 0x5BFF #CJK UNIFIED IDEOGRAPH +0x8EF6 0x6388 #CJK UNIFIED IDEOGRAPH +0x8EF7 0x6A39 #CJK UNIFIED IDEOGRAPH +0x8EF8 0x7DAC #CJK UNIFIED IDEOGRAPH +0x8EF9 0x9700 #CJK UNIFIED IDEOGRAPH +0x8EFA 0x56DA #CJK UNIFIED IDEOGRAPH +0x8EFB 0x53CE #CJK UNIFIED IDEOGRAPH +0x8EFC 0x5468 #CJK UNIFIED IDEOGRAPH +0x8F40 0x5B97 #CJK UNIFIED IDEOGRAPH +0x8F41 0x5C31 #CJK UNIFIED IDEOGRAPH +0x8F42 0x5DDE #CJK UNIFIED IDEOGRAPH +0x8F43 0x4FEE #CJK UNIFIED IDEOGRAPH +0x8F44 0x6101 #CJK UNIFIED IDEOGRAPH +0x8F45 0x62FE #CJK UNIFIED IDEOGRAPH +0x8F46 0x6D32 #CJK UNIFIED IDEOGRAPH +0x8F47 0x79C0 #CJK UNIFIED IDEOGRAPH +0x8F48 0x79CB #CJK UNIFIED IDEOGRAPH +0x8F49 0x7D42 #CJK UNIFIED IDEOGRAPH +0x8F4A 0x7E4D #CJK UNIFIED IDEOGRAPH +0x8F4B 0x7FD2 #CJK UNIFIED IDEOGRAPH +0x8F4C 0x81ED #CJK UNIFIED IDEOGRAPH +0x8F4D 0x821F #CJK UNIFIED IDEOGRAPH +0x8F4E 0x8490 #CJK UNIFIED IDEOGRAPH +0x8F4F 0x8846 #CJK UNIFIED IDEOGRAPH +0x8F50 0x8972 #CJK UNIFIED IDEOGRAPH +0x8F51 0x8B90 #CJK UNIFIED IDEOGRAPH +0x8F52 0x8E74 #CJK UNIFIED IDEOGRAPH +0x8F53 0x8F2F #CJK UNIFIED IDEOGRAPH +0x8F54 0x9031 #CJK UNIFIED IDEOGRAPH +0x8F55 0x914B #CJK UNIFIED IDEOGRAPH +0x8F56 0x916C #CJK UNIFIED IDEOGRAPH +0x8F57 0x96C6 #CJK UNIFIED IDEOGRAPH +0x8F58 0x919C #CJK UNIFIED IDEOGRAPH +0x8F59 0x4EC0 #CJK UNIFIED IDEOGRAPH +0x8F5A 0x4F4F #CJK UNIFIED IDEOGRAPH +0x8F5B 0x5145 #CJK UNIFIED IDEOGRAPH +0x8F5C 0x5341 #CJK UNIFIED IDEOGRAPH +0x8F5D 0x5F93 #CJK UNIFIED IDEOGRAPH +0x8F5E 0x620E #CJK UNIFIED IDEOGRAPH +0x8F5F 0x67D4 #CJK UNIFIED IDEOGRAPH +0x8F60 0x6C41 #CJK UNIFIED IDEOGRAPH +0x8F61 0x6E0B #CJK UNIFIED IDEOGRAPH +0x8F62 0x7363 #CJK UNIFIED IDEOGRAPH +0x8F63 0x7E26 #CJK UNIFIED IDEOGRAPH +0x8F64 0x91CD #CJK UNIFIED IDEOGRAPH +0x8F65 0x9283 #CJK UNIFIED IDEOGRAPH +0x8F66 0x53D4 #CJK UNIFIED IDEOGRAPH +0x8F67 0x5919 #CJK UNIFIED IDEOGRAPH +0x8F68 0x5BBF #CJK UNIFIED IDEOGRAPH +0x8F69 0x6DD1 #CJK UNIFIED IDEOGRAPH +0x8F6A 0x795D #CJK UNIFIED IDEOGRAPH +0x8F6B 0x7E2E #CJK UNIFIED IDEOGRAPH +0x8F6C 0x7C9B #CJK UNIFIED IDEOGRAPH +0x8F6D 0x587E #CJK UNIFIED IDEOGRAPH +0x8F6E 0x719F #CJK UNIFIED IDEOGRAPH +0x8F6F 0x51FA #CJK UNIFIED IDEOGRAPH +0x8F70 0x8853 #CJK UNIFIED IDEOGRAPH +0x8F71 0x8FF0 #CJK UNIFIED IDEOGRAPH +0x8F72 0x4FCA #CJK UNIFIED IDEOGRAPH +0x8F73 0x5CFB #CJK UNIFIED IDEOGRAPH +0x8F74 0x6625 #CJK UNIFIED IDEOGRAPH +0x8F75 0x77AC #CJK UNIFIED IDEOGRAPH +0x8F76 0x7AE3 #CJK UNIFIED IDEOGRAPH +0x8F77 0x821C #CJK UNIFIED IDEOGRAPH +0x8F78 0x99FF #CJK UNIFIED IDEOGRAPH +0x8F79 0x51C6 #CJK UNIFIED IDEOGRAPH +0x8F7A 0x5FAA #CJK UNIFIED IDEOGRAPH +0x8F7B 0x65EC #CJK UNIFIED IDEOGRAPH +0x8F7C 0x696F #CJK UNIFIED IDEOGRAPH +0x8F7D 0x6B89 #CJK UNIFIED IDEOGRAPH +0x8F7E 0x6DF3 #CJK UNIFIED IDEOGRAPH +0x8F80 0x6E96 #CJK UNIFIED IDEOGRAPH +0x8F81 0x6F64 #CJK UNIFIED IDEOGRAPH +0x8F82 0x76FE #CJK UNIFIED IDEOGRAPH +0x8F83 0x7D14 #CJK UNIFIED IDEOGRAPH +0x8F84 0x5DE1 #CJK UNIFIED IDEOGRAPH +0x8F85 0x9075 #CJK UNIFIED IDEOGRAPH +0x8F86 0x9187 #CJK UNIFIED IDEOGRAPH +0x8F87 0x9806 #CJK UNIFIED IDEOGRAPH +0x8F88 0x51E6 #CJK UNIFIED IDEOGRAPH +0x8F89 0x521D #CJK UNIFIED IDEOGRAPH +0x8F8A 0x6240 #CJK UNIFIED IDEOGRAPH +0x8F8B 0x6691 #CJK UNIFIED IDEOGRAPH +0x8F8C 0x66D9 #CJK UNIFIED IDEOGRAPH +0x8F8D 0x6E1A #CJK UNIFIED IDEOGRAPH +0x8F8E 0x5EB6 #CJK UNIFIED IDEOGRAPH +0x8F8F 0x7DD2 #CJK UNIFIED IDEOGRAPH +0x8F90 0x7F72 #CJK UNIFIED IDEOGRAPH +0x8F91 0x66F8 #CJK UNIFIED IDEOGRAPH +0x8F92 0x85AF #CJK UNIFIED IDEOGRAPH +0x8F93 0x85F7 #CJK UNIFIED IDEOGRAPH +0x8F94 0x8AF8 #CJK UNIFIED IDEOGRAPH +0x8F95 0x52A9 #CJK UNIFIED IDEOGRAPH +0x8F96 0x53D9 #CJK UNIFIED IDEOGRAPH +0x8F97 0x5973 #CJK UNIFIED IDEOGRAPH +0x8F98 0x5E8F #CJK UNIFIED IDEOGRAPH +0x8F99 0x5F90 #CJK UNIFIED IDEOGRAPH +0x8F9A 0x6055 #CJK UNIFIED IDEOGRAPH +0x8F9B 0x92E4 #CJK UNIFIED IDEOGRAPH +0x8F9C 0x9664 #CJK UNIFIED IDEOGRAPH +0x8F9D 0x50B7 #CJK UNIFIED IDEOGRAPH +0x8F9E 0x511F #CJK UNIFIED IDEOGRAPH +0x8F9F 0x52DD #CJK UNIFIED IDEOGRAPH +0x8FA0 0x5320 #CJK UNIFIED IDEOGRAPH +0x8FA1 0x5347 #CJK UNIFIED IDEOGRAPH +0x8FA2 0x53EC #CJK UNIFIED IDEOGRAPH +0x8FA3 0x54E8 #CJK UNIFIED IDEOGRAPH +0x8FA4 0x5546 #CJK UNIFIED IDEOGRAPH +0x8FA5 0x5531 #CJK UNIFIED IDEOGRAPH +0x8FA6 0x5617 #CJK UNIFIED IDEOGRAPH +0x8FA7 0x5968 #CJK UNIFIED IDEOGRAPH +0x8FA8 0x59BE #CJK UNIFIED IDEOGRAPH +0x8FA9 0x5A3C #CJK UNIFIED IDEOGRAPH +0x8FAA 0x5BB5 #CJK UNIFIED IDEOGRAPH +0x8FAB 0x5C06 #CJK UNIFIED IDEOGRAPH +0x8FAC 0x5C0F #CJK UNIFIED IDEOGRAPH +0x8FAD 0x5C11 #CJK UNIFIED IDEOGRAPH +0x8FAE 0x5C1A #CJK UNIFIED IDEOGRAPH +0x8FAF 0x5E84 #CJK UNIFIED IDEOGRAPH +0x8FB0 0x5E8A #CJK UNIFIED IDEOGRAPH +0x8FB1 0x5EE0 #CJK UNIFIED IDEOGRAPH +0x8FB2 0x5F70 #CJK UNIFIED IDEOGRAPH +0x8FB3 0x627F #CJK UNIFIED IDEOGRAPH +0x8FB4 0x6284 #CJK UNIFIED IDEOGRAPH +0x8FB5 0x62DB #CJK UNIFIED IDEOGRAPH +0x8FB6 0x638C #CJK UNIFIED IDEOGRAPH +0x8FB7 0x6377 #CJK UNIFIED IDEOGRAPH +0x8FB8 0x6607 #CJK UNIFIED IDEOGRAPH +0x8FB9 0x660C #CJK UNIFIED IDEOGRAPH +0x8FBA 0x662D #CJK UNIFIED IDEOGRAPH +0x8FBB 0x6676 #CJK UNIFIED IDEOGRAPH +0x8FBC 0x677E #CJK UNIFIED IDEOGRAPH +0x8FBD 0x68A2 #CJK UNIFIED IDEOGRAPH +0x8FBE 0x6A1F #CJK UNIFIED IDEOGRAPH +0x8FBF 0x6A35 #CJK UNIFIED IDEOGRAPH +0x8FC0 0x6CBC #CJK UNIFIED IDEOGRAPH +0x8FC1 0x6D88 #CJK UNIFIED IDEOGRAPH +0x8FC2 0x6E09 #CJK UNIFIED IDEOGRAPH +0x8FC3 0x6E58 #CJK UNIFIED IDEOGRAPH +0x8FC4 0x713C #CJK UNIFIED IDEOGRAPH +0x8FC5 0x7126 #CJK UNIFIED IDEOGRAPH +0x8FC6 0x7167 #CJK UNIFIED IDEOGRAPH +0x8FC7 0x75C7 #CJK UNIFIED IDEOGRAPH +0x8FC8 0x7701 #CJK UNIFIED IDEOGRAPH +0x8FC9 0x785D #CJK UNIFIED IDEOGRAPH +0x8FCA 0x7901 #CJK UNIFIED IDEOGRAPH +0x8FCB 0x7965 #CJK UNIFIED IDEOGRAPH +0x8FCC 0x79F0 #CJK UNIFIED IDEOGRAPH +0x8FCD 0x7AE0 #CJK UNIFIED IDEOGRAPH +0x8FCE 0x7B11 #CJK UNIFIED IDEOGRAPH +0x8FCF 0x7CA7 #CJK UNIFIED IDEOGRAPH +0x8FD0 0x7D39 #CJK UNIFIED IDEOGRAPH +0x8FD1 0x8096 #CJK UNIFIED IDEOGRAPH +0x8FD2 0x83D6 #CJK UNIFIED IDEOGRAPH +0x8FD3 0x848B #CJK UNIFIED IDEOGRAPH +0x8FD4 0x8549 #CJK UNIFIED IDEOGRAPH +0x8FD5 0x885D #CJK UNIFIED IDEOGRAPH +0x8FD6 0x88F3 #CJK UNIFIED IDEOGRAPH +0x8FD7 0x8A1F #CJK UNIFIED IDEOGRAPH +0x8FD8 0x8A3C #CJK UNIFIED IDEOGRAPH +0x8FD9 0x8A54 #CJK UNIFIED IDEOGRAPH +0x8FDA 0x8A73 #CJK UNIFIED IDEOGRAPH +0x8FDB 0x8C61 #CJK UNIFIED IDEOGRAPH +0x8FDC 0x8CDE #CJK UNIFIED IDEOGRAPH +0x8FDD 0x91A4 #CJK UNIFIED IDEOGRAPH +0x8FDE 0x9266 #CJK UNIFIED IDEOGRAPH +0x8FDF 0x937E #CJK UNIFIED IDEOGRAPH +0x8FE0 0x9418 #CJK UNIFIED IDEOGRAPH +0x8FE1 0x969C #CJK UNIFIED IDEOGRAPH +0x8FE2 0x9798 #CJK UNIFIED IDEOGRAPH +0x8FE3 0x4E0A #CJK UNIFIED IDEOGRAPH +0x8FE4 0x4E08 #CJK UNIFIED IDEOGRAPH +0x8FE5 0x4E1E #CJK UNIFIED IDEOGRAPH +0x8FE6 0x4E57 #CJK UNIFIED IDEOGRAPH +0x8FE7 0x5197 #CJK UNIFIED IDEOGRAPH +0x8FE8 0x5270 #CJK UNIFIED IDEOGRAPH +0x8FE9 0x57CE #CJK UNIFIED IDEOGRAPH +0x8FEA 0x5834 #CJK UNIFIED IDEOGRAPH +0x8FEB 0x58CC #CJK UNIFIED IDEOGRAPH +0x8FEC 0x5B22 #CJK UNIFIED IDEOGRAPH +0x8FED 0x5E38 #CJK UNIFIED IDEOGRAPH +0x8FEE 0x60C5 #CJK UNIFIED IDEOGRAPH +0x8FEF 0x64FE #CJK UNIFIED IDEOGRAPH +0x8FF0 0x6761 #CJK UNIFIED IDEOGRAPH +0x8FF1 0x6756 #CJK UNIFIED IDEOGRAPH +0x8FF2 0x6D44 #CJK UNIFIED IDEOGRAPH +0x8FF3 0x72B6 #CJK UNIFIED IDEOGRAPH +0x8FF4 0x7573 #CJK UNIFIED IDEOGRAPH +0x8FF5 0x7A63 #CJK UNIFIED IDEOGRAPH +0x8FF6 0x84B8 #CJK UNIFIED IDEOGRAPH +0x8FF7 0x8B72 #CJK UNIFIED IDEOGRAPH +0x8FF8 0x91B8 #CJK UNIFIED IDEOGRAPH +0x8FF9 0x9320 #CJK UNIFIED IDEOGRAPH +0x8FFA 0x5631 #CJK UNIFIED IDEOGRAPH +0x8FFB 0x57F4 #CJK UNIFIED IDEOGRAPH +0x8FFC 0x98FE #CJK UNIFIED IDEOGRAPH +0x9040 0x62ED #CJK UNIFIED IDEOGRAPH +0x9041 0x690D #CJK UNIFIED IDEOGRAPH +0x9042 0x6B96 #CJK UNIFIED IDEOGRAPH +0x9043 0x71ED #CJK UNIFIED IDEOGRAPH +0x9044 0x7E54 #CJK UNIFIED IDEOGRAPH +0x9045 0x8077 #CJK UNIFIED IDEOGRAPH +0x9046 0x8272 #CJK UNIFIED IDEOGRAPH +0x9047 0x89E6 #CJK UNIFIED IDEOGRAPH +0x9048 0x98DF #CJK UNIFIED IDEOGRAPH +0x9049 0x8755 #CJK UNIFIED IDEOGRAPH +0x904A 0x8FB1 #CJK UNIFIED IDEOGRAPH +0x904B 0x5C3B #CJK UNIFIED IDEOGRAPH +0x904C 0x4F38 #CJK UNIFIED IDEOGRAPH +0x904D 0x4FE1 #CJK UNIFIED IDEOGRAPH +0x904E 0x4FB5 #CJK UNIFIED IDEOGRAPH +0x904F 0x5507 #CJK UNIFIED IDEOGRAPH +0x9050 0x5A20 #CJK UNIFIED IDEOGRAPH +0x9051 0x5BDD #CJK UNIFIED IDEOGRAPH +0x9052 0x5BE9 #CJK UNIFIED IDEOGRAPH +0x9053 0x5FC3 #CJK UNIFIED IDEOGRAPH +0x9054 0x614E #CJK UNIFIED IDEOGRAPH +0x9055 0x632F #CJK UNIFIED IDEOGRAPH +0x9056 0x65B0 #CJK UNIFIED IDEOGRAPH +0x9057 0x664B #CJK UNIFIED IDEOGRAPH +0x9058 0x68EE #CJK UNIFIED IDEOGRAPH +0x9059 0x699B #CJK UNIFIED IDEOGRAPH +0x905A 0x6D78 #CJK UNIFIED IDEOGRAPH +0x905B 0x6DF1 #CJK UNIFIED IDEOGRAPH +0x905C 0x7533 #CJK UNIFIED IDEOGRAPH +0x905D 0x75B9 #CJK UNIFIED IDEOGRAPH +0x905E 0x771F #CJK UNIFIED IDEOGRAPH +0x905F 0x795E #CJK UNIFIED IDEOGRAPH +0x9060 0x79E6 #CJK UNIFIED IDEOGRAPH +0x9061 0x7D33 #CJK UNIFIED IDEOGRAPH +0x9062 0x81E3 #CJK UNIFIED IDEOGRAPH +0x9063 0x82AF #CJK UNIFIED IDEOGRAPH +0x9064 0x85AA #CJK UNIFIED IDEOGRAPH +0x9065 0x89AA #CJK UNIFIED IDEOGRAPH +0x9066 0x8A3A #CJK UNIFIED IDEOGRAPH +0x9067 0x8EAB #CJK UNIFIED IDEOGRAPH +0x9068 0x8F9B #CJK UNIFIED IDEOGRAPH +0x9069 0x9032 #CJK UNIFIED IDEOGRAPH +0x906A 0x91DD #CJK UNIFIED IDEOGRAPH +0x906B 0x9707 #CJK UNIFIED IDEOGRAPH +0x906C 0x4EBA #CJK UNIFIED IDEOGRAPH +0x906D 0x4EC1 #CJK UNIFIED IDEOGRAPH +0x906E 0x5203 #CJK UNIFIED IDEOGRAPH +0x906F 0x5875 #CJK UNIFIED IDEOGRAPH +0x9070 0x58EC #CJK UNIFIED IDEOGRAPH +0x9071 0x5C0B #CJK UNIFIED IDEOGRAPH +0x9072 0x751A #CJK UNIFIED IDEOGRAPH +0x9073 0x5C3D #CJK UNIFIED IDEOGRAPH +0x9074 0x814E #CJK UNIFIED IDEOGRAPH +0x9075 0x8A0A #CJK UNIFIED IDEOGRAPH +0x9076 0x8FC5 #CJK UNIFIED IDEOGRAPH +0x9077 0x9663 #CJK UNIFIED IDEOGRAPH +0x9078 0x976D #CJK UNIFIED IDEOGRAPH +0x9079 0x7B25 #CJK UNIFIED IDEOGRAPH +0x907A 0x8ACF #CJK UNIFIED IDEOGRAPH +0x907B 0x9808 #CJK UNIFIED IDEOGRAPH +0x907C 0x9162 #CJK UNIFIED IDEOGRAPH +0x907D 0x56F3 #CJK UNIFIED IDEOGRAPH +0x907E 0x53A8 #CJK UNIFIED IDEOGRAPH +0x9080 0x9017 #CJK UNIFIED IDEOGRAPH +0x9081 0x5439 #CJK UNIFIED IDEOGRAPH +0x9082 0x5782 #CJK UNIFIED IDEOGRAPH +0x9083 0x5E25 #CJK UNIFIED IDEOGRAPH +0x9084 0x63A8 #CJK UNIFIED IDEOGRAPH +0x9085 0x6C34 #CJK UNIFIED IDEOGRAPH +0x9086 0x708A #CJK UNIFIED IDEOGRAPH +0x9087 0x7761 #CJK UNIFIED IDEOGRAPH +0x9088 0x7C8B #CJK UNIFIED IDEOGRAPH +0x9089 0x7FE0 #CJK UNIFIED IDEOGRAPH +0x908A 0x8870 #CJK UNIFIED IDEOGRAPH +0x908B 0x9042 #CJK UNIFIED IDEOGRAPH +0x908C 0x9154 #CJK UNIFIED IDEOGRAPH +0x908D 0x9310 #CJK UNIFIED IDEOGRAPH +0x908E 0x9318 #CJK UNIFIED IDEOGRAPH +0x908F 0x968F #CJK UNIFIED IDEOGRAPH +0x9090 0x745E #CJK UNIFIED IDEOGRAPH +0x9091 0x9AC4 #CJK UNIFIED IDEOGRAPH +0x9092 0x5D07 #CJK UNIFIED IDEOGRAPH +0x9093 0x5D69 #CJK UNIFIED IDEOGRAPH +0x9094 0x6570 #CJK UNIFIED IDEOGRAPH +0x9095 0x67A2 #CJK UNIFIED IDEOGRAPH +0x9096 0x8DA8 #CJK UNIFIED IDEOGRAPH +0x9097 0x96DB #CJK UNIFIED IDEOGRAPH +0x9098 0x636E #CJK UNIFIED IDEOGRAPH +0x9099 0x6749 #CJK UNIFIED IDEOGRAPH +0x909A 0x6919 #CJK UNIFIED IDEOGRAPH +0x909B 0x83C5 #CJK UNIFIED IDEOGRAPH +0x909C 0x9817 #CJK UNIFIED IDEOGRAPH +0x909D 0x96C0 #CJK UNIFIED IDEOGRAPH +0x909E 0x88FE #CJK UNIFIED IDEOGRAPH +0x909F 0x6F84 #CJK UNIFIED IDEOGRAPH +0x90A0 0x647A #CJK UNIFIED IDEOGRAPH +0x90A1 0x5BF8 #CJK UNIFIED IDEOGRAPH +0x90A2 0x4E16 #CJK UNIFIED IDEOGRAPH +0x90A3 0x702C #CJK UNIFIED IDEOGRAPH +0x90A4 0x755D #CJK UNIFIED IDEOGRAPH +0x90A5 0x662F #CJK UNIFIED IDEOGRAPH +0x90A6 0x51C4 #CJK UNIFIED IDEOGRAPH +0x90A7 0x5236 #CJK UNIFIED IDEOGRAPH +0x90A8 0x52E2 #CJK UNIFIED IDEOGRAPH +0x90A9 0x59D3 #CJK UNIFIED IDEOGRAPH +0x90AA 0x5F81 #CJK UNIFIED IDEOGRAPH +0x90AB 0x6027 #CJK UNIFIED IDEOGRAPH +0x90AC 0x6210 #CJK UNIFIED IDEOGRAPH +0x90AD 0x653F #CJK UNIFIED IDEOGRAPH +0x90AE 0x6574 #CJK UNIFIED IDEOGRAPH +0x90AF 0x661F #CJK UNIFIED IDEOGRAPH +0x90B0 0x6674 #CJK UNIFIED IDEOGRAPH +0x90B1 0x68F2 #CJK UNIFIED IDEOGRAPH +0x90B2 0x6816 #CJK UNIFIED IDEOGRAPH +0x90B3 0x6B63 #CJK UNIFIED IDEOGRAPH +0x90B4 0x6E05 #CJK UNIFIED IDEOGRAPH +0x90B5 0x7272 #CJK UNIFIED IDEOGRAPH +0x90B6 0x751F #CJK UNIFIED IDEOGRAPH +0x90B7 0x76DB #CJK UNIFIED IDEOGRAPH +0x90B8 0x7CBE #CJK UNIFIED IDEOGRAPH +0x90B9 0x8056 #CJK UNIFIED IDEOGRAPH +0x90BA 0x58F0 #CJK UNIFIED IDEOGRAPH +0x90BB 0x88FD #CJK UNIFIED IDEOGRAPH +0x90BC 0x897F #CJK UNIFIED IDEOGRAPH +0x90BD 0x8AA0 #CJK UNIFIED IDEOGRAPH +0x90BE 0x8A93 #CJK UNIFIED IDEOGRAPH +0x90BF 0x8ACB #CJK UNIFIED IDEOGRAPH +0x90C0 0x901D #CJK UNIFIED IDEOGRAPH +0x90C1 0x9192 #CJK UNIFIED IDEOGRAPH +0x90C2 0x9752 #CJK UNIFIED IDEOGRAPH +0x90C3 0x9759 #CJK UNIFIED IDEOGRAPH +0x90C4 0x6589 #CJK UNIFIED IDEOGRAPH +0x90C5 0x7A0E #CJK UNIFIED IDEOGRAPH +0x90C6 0x8106 #CJK UNIFIED IDEOGRAPH +0x90C7 0x96BB #CJK UNIFIED IDEOGRAPH +0x90C8 0x5E2D #CJK UNIFIED IDEOGRAPH +0x90C9 0x60DC #CJK UNIFIED IDEOGRAPH +0x90CA 0x621A #CJK UNIFIED IDEOGRAPH +0x90CB 0x65A5 #CJK UNIFIED IDEOGRAPH +0x90CC 0x6614 #CJK UNIFIED IDEOGRAPH +0x90CD 0x6790 #CJK UNIFIED IDEOGRAPH +0x90CE 0x77F3 #CJK UNIFIED IDEOGRAPH +0x90CF 0x7A4D #CJK UNIFIED IDEOGRAPH +0x90D0 0x7C4D #CJK UNIFIED IDEOGRAPH +0x90D1 0x7E3E #CJK UNIFIED IDEOGRAPH +0x90D2 0x810A #CJK UNIFIED IDEOGRAPH +0x90D3 0x8CAC #CJK UNIFIED IDEOGRAPH +0x90D4 0x8D64 #CJK UNIFIED IDEOGRAPH +0x90D5 0x8DE1 #CJK UNIFIED IDEOGRAPH +0x90D6 0x8E5F #CJK UNIFIED IDEOGRAPH +0x90D7 0x78A9 #CJK UNIFIED IDEOGRAPH +0x90D8 0x5207 #CJK UNIFIED IDEOGRAPH +0x90D9 0x62D9 #CJK UNIFIED IDEOGRAPH +0x90DA 0x63A5 #CJK UNIFIED IDEOGRAPH +0x90DB 0x6442 #CJK UNIFIED IDEOGRAPH +0x90DC 0x6298 #CJK UNIFIED IDEOGRAPH +0x90DD 0x8A2D #CJK UNIFIED IDEOGRAPH +0x90DE 0x7A83 #CJK UNIFIED IDEOGRAPH +0x90DF 0x7BC0 #CJK UNIFIED IDEOGRAPH +0x90E0 0x8AAC #CJK UNIFIED IDEOGRAPH +0x90E1 0x96EA #CJK UNIFIED IDEOGRAPH +0x90E2 0x7D76 #CJK UNIFIED IDEOGRAPH +0x90E3 0x820C #CJK UNIFIED IDEOGRAPH +0x90E4 0x8749 #CJK UNIFIED IDEOGRAPH +0x90E5 0x4ED9 #CJK UNIFIED IDEOGRAPH +0x90E6 0x5148 #CJK UNIFIED IDEOGRAPH +0x90E7 0x5343 #CJK UNIFIED IDEOGRAPH +0x90E8 0x5360 #CJK UNIFIED IDEOGRAPH +0x90E9 0x5BA3 #CJK UNIFIED IDEOGRAPH +0x90EA 0x5C02 #CJK UNIFIED IDEOGRAPH +0x90EB 0x5C16 #CJK UNIFIED IDEOGRAPH +0x90EC 0x5DDD #CJK UNIFIED IDEOGRAPH +0x90ED 0x6226 #CJK UNIFIED IDEOGRAPH +0x90EE 0x6247 #CJK UNIFIED IDEOGRAPH +0x90EF 0x64B0 #CJK UNIFIED IDEOGRAPH +0x90F0 0x6813 #CJK UNIFIED IDEOGRAPH +0x90F1 0x6834 #CJK UNIFIED IDEOGRAPH +0x90F2 0x6CC9 #CJK UNIFIED IDEOGRAPH +0x90F3 0x6D45 #CJK UNIFIED IDEOGRAPH +0x90F4 0x6D17 #CJK UNIFIED IDEOGRAPH +0x90F5 0x67D3 #CJK UNIFIED IDEOGRAPH +0x90F6 0x6F5C #CJK UNIFIED IDEOGRAPH +0x90F7 0x714E #CJK UNIFIED IDEOGRAPH +0x90F8 0x717D #CJK UNIFIED IDEOGRAPH +0x90F9 0x65CB #CJK UNIFIED IDEOGRAPH +0x90FA 0x7A7F #CJK UNIFIED IDEOGRAPH +0x90FB 0x7BAD #CJK UNIFIED IDEOGRAPH +0x90FC 0x7DDA #CJK UNIFIED IDEOGRAPH +0x9140 0x7E4A #CJK UNIFIED IDEOGRAPH +0x9141 0x7FA8 #CJK UNIFIED IDEOGRAPH +0x9142 0x817A #CJK UNIFIED IDEOGRAPH +0x9143 0x821B #CJK UNIFIED IDEOGRAPH +0x9144 0x8239 #CJK UNIFIED IDEOGRAPH +0x9145 0x85A6 #CJK UNIFIED IDEOGRAPH +0x9146 0x8A6E #CJK UNIFIED IDEOGRAPH +0x9147 0x8CCE #CJK UNIFIED IDEOGRAPH +0x9148 0x8DF5 #CJK UNIFIED IDEOGRAPH +0x9149 0x9078 #CJK UNIFIED IDEOGRAPH +0x914A 0x9077 #CJK UNIFIED IDEOGRAPH +0x914B 0x92AD #CJK UNIFIED IDEOGRAPH +0x914C 0x9291 #CJK UNIFIED IDEOGRAPH +0x914D 0x9583 #CJK UNIFIED IDEOGRAPH +0x914E 0x9BAE #CJK UNIFIED IDEOGRAPH +0x914F 0x524D #CJK UNIFIED IDEOGRAPH +0x9150 0x5584 #CJK UNIFIED IDEOGRAPH +0x9151 0x6F38 #CJK UNIFIED IDEOGRAPH +0x9152 0x7136 #CJK UNIFIED IDEOGRAPH +0x9153 0x5168 #CJK UNIFIED IDEOGRAPH +0x9154 0x7985 #CJK UNIFIED IDEOGRAPH +0x9155 0x7E55 #CJK UNIFIED IDEOGRAPH +0x9156 0x81B3 #CJK UNIFIED IDEOGRAPH +0x9157 0x7CCE #CJK UNIFIED IDEOGRAPH +0x9158 0x564C #CJK UNIFIED IDEOGRAPH +0x9159 0x5851 #CJK UNIFIED IDEOGRAPH +0x915A 0x5CA8 #CJK UNIFIED IDEOGRAPH +0x915B 0x63AA #CJK UNIFIED IDEOGRAPH +0x915C 0x66FE #CJK UNIFIED IDEOGRAPH +0x915D 0x66FD #CJK UNIFIED IDEOGRAPH +0x915E 0x695A #CJK UNIFIED IDEOGRAPH +0x915F 0x72D9 #CJK UNIFIED IDEOGRAPH +0x9160 0x758F #CJK UNIFIED IDEOGRAPH +0x9161 0x758E #CJK UNIFIED IDEOGRAPH +0x9162 0x790E #CJK UNIFIED IDEOGRAPH +0x9163 0x7956 #CJK UNIFIED IDEOGRAPH +0x9164 0x79DF #CJK UNIFIED IDEOGRAPH +0x9165 0x7C97 #CJK UNIFIED IDEOGRAPH +0x9166 0x7D20 #CJK UNIFIED IDEOGRAPH +0x9167 0x7D44 #CJK UNIFIED IDEOGRAPH +0x9168 0x8607 #CJK UNIFIED IDEOGRAPH +0x9169 0x8A34 #CJK UNIFIED IDEOGRAPH +0x916A 0x963B #CJK UNIFIED IDEOGRAPH +0x916B 0x9061 #CJK UNIFIED IDEOGRAPH +0x916C 0x9F20 #CJK UNIFIED IDEOGRAPH +0x916D 0x50E7 #CJK UNIFIED IDEOGRAPH +0x916E 0x5275 #CJK UNIFIED IDEOGRAPH +0x916F 0x53CC #CJK UNIFIED IDEOGRAPH +0x9170 0x53E2 #CJK UNIFIED IDEOGRAPH +0x9171 0x5009 #CJK UNIFIED IDEOGRAPH +0x9172 0x55AA #CJK UNIFIED IDEOGRAPH +0x9173 0x58EE #CJK UNIFIED IDEOGRAPH +0x9174 0x594F #CJK UNIFIED IDEOGRAPH +0x9175 0x723D #CJK UNIFIED IDEOGRAPH +0x9176 0x5B8B #CJK UNIFIED IDEOGRAPH +0x9177 0x5C64 #CJK UNIFIED IDEOGRAPH +0x9178 0x531D #CJK UNIFIED IDEOGRAPH +0x9179 0x60E3 #CJK UNIFIED IDEOGRAPH +0x917A 0x60F3 #CJK UNIFIED IDEOGRAPH +0x917B 0x635C #CJK UNIFIED IDEOGRAPH +0x917C 0x6383 #CJK UNIFIED IDEOGRAPH +0x917D 0x633F #CJK UNIFIED IDEOGRAPH +0x917E 0x63BB #CJK UNIFIED IDEOGRAPH +0x9180 0x64CD #CJK UNIFIED IDEOGRAPH +0x9181 0x65E9 #CJK UNIFIED IDEOGRAPH +0x9182 0x66F9 #CJK UNIFIED IDEOGRAPH +0x9183 0x5DE3 #CJK UNIFIED IDEOGRAPH +0x9184 0x69CD #CJK UNIFIED IDEOGRAPH +0x9185 0x69FD #CJK UNIFIED IDEOGRAPH +0x9186 0x6F15 #CJK UNIFIED IDEOGRAPH +0x9187 0x71E5 #CJK UNIFIED IDEOGRAPH +0x9188 0x4E89 #CJK UNIFIED IDEOGRAPH +0x9189 0x75E9 #CJK UNIFIED IDEOGRAPH +0x918A 0x76F8 #CJK UNIFIED IDEOGRAPH +0x918B 0x7A93 #CJK UNIFIED IDEOGRAPH +0x918C 0x7CDF #CJK UNIFIED IDEOGRAPH +0x918D 0x7DCF #CJK UNIFIED IDEOGRAPH +0x918E 0x7D9C #CJK UNIFIED IDEOGRAPH +0x918F 0x8061 #CJK UNIFIED IDEOGRAPH +0x9190 0x8349 #CJK UNIFIED IDEOGRAPH +0x9191 0x8358 #CJK UNIFIED IDEOGRAPH +0x9192 0x846C #CJK UNIFIED IDEOGRAPH +0x9193 0x84BC #CJK UNIFIED IDEOGRAPH +0x9194 0x85FB #CJK UNIFIED IDEOGRAPH +0x9195 0x88C5 #CJK UNIFIED IDEOGRAPH +0x9196 0x8D70 #CJK UNIFIED IDEOGRAPH +0x9197 0x9001 #CJK UNIFIED IDEOGRAPH +0x9198 0x906D #CJK UNIFIED IDEOGRAPH +0x9199 0x9397 #CJK UNIFIED IDEOGRAPH +0x919A 0x971C #CJK UNIFIED IDEOGRAPH +0x919B 0x9A12 #CJK UNIFIED IDEOGRAPH +0x919C 0x50CF #CJK UNIFIED IDEOGRAPH +0x919D 0x5897 #CJK UNIFIED IDEOGRAPH +0x919E 0x618E #CJK UNIFIED IDEOGRAPH +0x919F 0x81D3 #CJK UNIFIED IDEOGRAPH +0x91A0 0x8535 #CJK UNIFIED IDEOGRAPH +0x91A1 0x8D08 #CJK UNIFIED IDEOGRAPH +0x91A2 0x9020 #CJK UNIFIED IDEOGRAPH +0x91A3 0x4FC3 #CJK UNIFIED IDEOGRAPH +0x91A4 0x5074 #CJK UNIFIED IDEOGRAPH +0x91A5 0x5247 #CJK UNIFIED IDEOGRAPH +0x91A6 0x5373 #CJK UNIFIED IDEOGRAPH +0x91A7 0x606F #CJK UNIFIED IDEOGRAPH +0x91A8 0x6349 #CJK UNIFIED IDEOGRAPH +0x91A9 0x675F #CJK UNIFIED IDEOGRAPH +0x91AA 0x6E2C #CJK UNIFIED IDEOGRAPH +0x91AB 0x8DB3 #CJK UNIFIED IDEOGRAPH +0x91AC 0x901F #CJK UNIFIED IDEOGRAPH +0x91AD 0x4FD7 #CJK UNIFIED IDEOGRAPH +0x91AE 0x5C5E #CJK UNIFIED IDEOGRAPH +0x91AF 0x8CCA #CJK UNIFIED IDEOGRAPH +0x91B0 0x65CF #CJK UNIFIED IDEOGRAPH +0x91B1 0x7D9A #CJK UNIFIED IDEOGRAPH +0x91B2 0x5352 #CJK UNIFIED IDEOGRAPH +0x91B3 0x8896 #CJK UNIFIED IDEOGRAPH +0x91B4 0x5176 #CJK UNIFIED IDEOGRAPH +0x91B5 0x63C3 #CJK UNIFIED IDEOGRAPH +0x91B6 0x5B58 #CJK UNIFIED IDEOGRAPH +0x91B7 0x5B6B #CJK UNIFIED IDEOGRAPH +0x91B8 0x5C0A #CJK UNIFIED IDEOGRAPH +0x91B9 0x640D #CJK UNIFIED IDEOGRAPH +0x91BA 0x6751 #CJK UNIFIED IDEOGRAPH +0x91BB 0x905C #CJK UNIFIED IDEOGRAPH +0x91BC 0x4ED6 #CJK UNIFIED IDEOGRAPH +0x91BD 0x591A #CJK UNIFIED IDEOGRAPH +0x91BE 0x592A #CJK UNIFIED IDEOGRAPH +0x91BF 0x6C70 #CJK UNIFIED IDEOGRAPH +0x91C0 0x8A51 #CJK UNIFIED IDEOGRAPH +0x91C1 0x553E #CJK UNIFIED IDEOGRAPH +0x91C2 0x5815 #CJK UNIFIED IDEOGRAPH +0x91C3 0x59A5 #CJK UNIFIED IDEOGRAPH +0x91C4 0x60F0 #CJK UNIFIED IDEOGRAPH +0x91C5 0x6253 #CJK UNIFIED IDEOGRAPH +0x91C6 0x67C1 #CJK UNIFIED IDEOGRAPH +0x91C7 0x8235 #CJK UNIFIED IDEOGRAPH +0x91C8 0x6955 #CJK UNIFIED IDEOGRAPH +0x91C9 0x9640 #CJK UNIFIED IDEOGRAPH +0x91CA 0x99C4 #CJK UNIFIED IDEOGRAPH +0x91CB 0x9A28 #CJK UNIFIED IDEOGRAPH +0x91CC 0x4F53 #CJK UNIFIED IDEOGRAPH +0x91CD 0x5806 #CJK UNIFIED IDEOGRAPH +0x91CE 0x5BFE #CJK UNIFIED IDEOGRAPH +0x91CF 0x8010 #CJK UNIFIED IDEOGRAPH +0x91D0 0x5CB1 #CJK UNIFIED IDEOGRAPH +0x91D1 0x5E2F #CJK UNIFIED IDEOGRAPH +0x91D2 0x5F85 #CJK UNIFIED IDEOGRAPH +0x91D3 0x6020 #CJK UNIFIED IDEOGRAPH +0x91D4 0x614B #CJK UNIFIED IDEOGRAPH +0x91D5 0x6234 #CJK UNIFIED IDEOGRAPH +0x91D6 0x66FF #CJK UNIFIED IDEOGRAPH +0x91D7 0x6CF0 #CJK UNIFIED IDEOGRAPH +0x91D8 0x6EDE #CJK UNIFIED IDEOGRAPH +0x91D9 0x80CE #CJK UNIFIED IDEOGRAPH +0x91DA 0x817F #CJK UNIFIED IDEOGRAPH +0x91DB 0x82D4 #CJK UNIFIED IDEOGRAPH +0x91DC 0x888B #CJK UNIFIED IDEOGRAPH +0x91DD 0x8CB8 #CJK UNIFIED IDEOGRAPH +0x91DE 0x9000 #CJK UNIFIED IDEOGRAPH +0x91DF 0x902E #CJK UNIFIED IDEOGRAPH +0x91E0 0x968A #CJK UNIFIED IDEOGRAPH +0x91E1 0x9EDB #CJK UNIFIED IDEOGRAPH +0x91E2 0x9BDB #CJK UNIFIED IDEOGRAPH +0x91E3 0x4EE3 #CJK UNIFIED IDEOGRAPH +0x91E4 0x53F0 #CJK UNIFIED IDEOGRAPH +0x91E5 0x5927 #CJK UNIFIED IDEOGRAPH +0x91E6 0x7B2C #CJK UNIFIED IDEOGRAPH +0x91E7 0x918D #CJK UNIFIED IDEOGRAPH +0x91E8 0x984C #CJK UNIFIED IDEOGRAPH +0x91E9 0x9DF9 #CJK UNIFIED IDEOGRAPH +0x91EA 0x6EDD #CJK UNIFIED IDEOGRAPH +0x91EB 0x7027 #CJK UNIFIED IDEOGRAPH +0x91EC 0x5353 #CJK UNIFIED IDEOGRAPH +0x91ED 0x5544 #CJK UNIFIED IDEOGRAPH +0x91EE 0x5B85 #CJK UNIFIED IDEOGRAPH +0x91EF 0x6258 #CJK UNIFIED IDEOGRAPH +0x91F0 0x629E #CJK UNIFIED IDEOGRAPH +0x91F1 0x62D3 #CJK UNIFIED IDEOGRAPH +0x91F2 0x6CA2 #CJK UNIFIED IDEOGRAPH +0x91F3 0x6FEF #CJK UNIFIED IDEOGRAPH +0x91F4 0x7422 #CJK UNIFIED IDEOGRAPH +0x91F5 0x8A17 #CJK UNIFIED IDEOGRAPH +0x91F6 0x9438 #CJK UNIFIED IDEOGRAPH +0x91F7 0x6FC1 #CJK UNIFIED IDEOGRAPH +0x91F8 0x8AFE #CJK UNIFIED IDEOGRAPH +0x91F9 0x8338 #CJK UNIFIED IDEOGRAPH +0x91FA 0x51E7 #CJK UNIFIED IDEOGRAPH +0x91FB 0x86F8 #CJK UNIFIED IDEOGRAPH +0x91FC 0x53EA #CJK UNIFIED IDEOGRAPH +0x9240 0x53E9 #CJK UNIFIED IDEOGRAPH +0x9241 0x4F46 #CJK UNIFIED IDEOGRAPH +0x9242 0x9054 #CJK UNIFIED IDEOGRAPH +0x9243 0x8FB0 #CJK UNIFIED IDEOGRAPH +0x9244 0x596A #CJK UNIFIED IDEOGRAPH +0x9245 0x8131 #CJK UNIFIED IDEOGRAPH +0x9246 0x5DFD #CJK UNIFIED IDEOGRAPH +0x9247 0x7AEA #CJK UNIFIED IDEOGRAPH +0x9248 0x8FBF #CJK UNIFIED IDEOGRAPH +0x9249 0x68DA #CJK UNIFIED IDEOGRAPH +0x924A 0x8C37 #CJK UNIFIED IDEOGRAPH +0x924B 0x72F8 #CJK UNIFIED IDEOGRAPH +0x924C 0x9C48 #CJK UNIFIED IDEOGRAPH +0x924D 0x6A3D #CJK UNIFIED IDEOGRAPH +0x924E 0x8AB0 #CJK UNIFIED IDEOGRAPH +0x924F 0x4E39 #CJK UNIFIED IDEOGRAPH +0x9250 0x5358 #CJK UNIFIED IDEOGRAPH +0x9251 0x5606 #CJK UNIFIED IDEOGRAPH +0x9252 0x5766 #CJK UNIFIED IDEOGRAPH +0x9253 0x62C5 #CJK UNIFIED IDEOGRAPH +0x9254 0x63A2 #CJK UNIFIED IDEOGRAPH +0x9255 0x65E6 #CJK UNIFIED IDEOGRAPH +0x9256 0x6B4E #CJK UNIFIED IDEOGRAPH +0x9257 0x6DE1 #CJK UNIFIED IDEOGRAPH +0x9258 0x6E5B #CJK UNIFIED IDEOGRAPH +0x9259 0x70AD #CJK UNIFIED IDEOGRAPH +0x925A 0x77ED #CJK UNIFIED IDEOGRAPH +0x925B 0x7AEF #CJK UNIFIED IDEOGRAPH +0x925C 0x7BAA #CJK UNIFIED IDEOGRAPH +0x925D 0x7DBB #CJK UNIFIED IDEOGRAPH +0x925E 0x803D #CJK UNIFIED IDEOGRAPH +0x925F 0x80C6 #CJK UNIFIED IDEOGRAPH +0x9260 0x86CB #CJK UNIFIED IDEOGRAPH +0x9261 0x8A95 #CJK UNIFIED IDEOGRAPH +0x9262 0x935B #CJK UNIFIED IDEOGRAPH +0x9263 0x56E3 #CJK UNIFIED IDEOGRAPH +0x9264 0x58C7 #CJK UNIFIED IDEOGRAPH +0x9265 0x5F3E #CJK UNIFIED IDEOGRAPH +0x9266 0x65AD #CJK UNIFIED IDEOGRAPH +0x9267 0x6696 #CJK UNIFIED IDEOGRAPH +0x9268 0x6A80 #CJK UNIFIED IDEOGRAPH +0x9269 0x6BB5 #CJK UNIFIED IDEOGRAPH +0x926A 0x7537 #CJK UNIFIED IDEOGRAPH +0x926B 0x8AC7 #CJK UNIFIED IDEOGRAPH +0x926C 0x5024 #CJK UNIFIED IDEOGRAPH +0x926D 0x77E5 #CJK UNIFIED IDEOGRAPH +0x926E 0x5730 #CJK UNIFIED IDEOGRAPH +0x926F 0x5F1B #CJK UNIFIED IDEOGRAPH +0x9270 0x6065 #CJK UNIFIED IDEOGRAPH +0x9271 0x667A #CJK UNIFIED IDEOGRAPH +0x9272 0x6C60 #CJK UNIFIED IDEOGRAPH +0x9273 0x75F4 #CJK UNIFIED IDEOGRAPH +0x9274 0x7A1A #CJK UNIFIED IDEOGRAPH +0x9275 0x7F6E #CJK UNIFIED IDEOGRAPH +0x9276 0x81F4 #CJK UNIFIED IDEOGRAPH +0x9277 0x8718 #CJK UNIFIED IDEOGRAPH +0x9278 0x9045 #CJK UNIFIED IDEOGRAPH +0x9279 0x99B3 #CJK UNIFIED IDEOGRAPH +0x927A 0x7BC9 #CJK UNIFIED IDEOGRAPH +0x927B 0x755C #CJK UNIFIED IDEOGRAPH +0x927C 0x7AF9 #CJK UNIFIED IDEOGRAPH +0x927D 0x7B51 #CJK UNIFIED IDEOGRAPH +0x927E 0x84C4 #CJK UNIFIED IDEOGRAPH +0x9280 0x9010 #CJK UNIFIED IDEOGRAPH +0x9281 0x79E9 #CJK UNIFIED IDEOGRAPH +0x9282 0x7A92 #CJK UNIFIED IDEOGRAPH +0x9283 0x8336 #CJK UNIFIED IDEOGRAPH +0x9284 0x5AE1 #CJK UNIFIED IDEOGRAPH +0x9285 0x7740 #CJK UNIFIED IDEOGRAPH +0x9286 0x4E2D #CJK UNIFIED IDEOGRAPH +0x9287 0x4EF2 #CJK UNIFIED IDEOGRAPH +0x9288 0x5B99 #CJK UNIFIED IDEOGRAPH +0x9289 0x5FE0 #CJK UNIFIED IDEOGRAPH +0x928A 0x62BD #CJK UNIFIED IDEOGRAPH +0x928B 0x663C #CJK UNIFIED IDEOGRAPH +0x928C 0x67F1 #CJK UNIFIED IDEOGRAPH +0x928D 0x6CE8 #CJK UNIFIED IDEOGRAPH +0x928E 0x866B #CJK UNIFIED IDEOGRAPH +0x928F 0x8877 #CJK UNIFIED IDEOGRAPH +0x9290 0x8A3B #CJK UNIFIED IDEOGRAPH +0x9291 0x914E #CJK UNIFIED IDEOGRAPH +0x9292 0x92F3 #CJK UNIFIED IDEOGRAPH +0x9293 0x99D0 #CJK UNIFIED IDEOGRAPH +0x9294 0x6A17 #CJK UNIFIED IDEOGRAPH +0x9295 0x7026 #CJK UNIFIED IDEOGRAPH +0x9296 0x732A #CJK UNIFIED IDEOGRAPH +0x9297 0x82E7 #CJK UNIFIED IDEOGRAPH +0x9298 0x8457 #CJK UNIFIED IDEOGRAPH +0x9299 0x8CAF #CJK UNIFIED IDEOGRAPH +0x929A 0x4E01 #CJK UNIFIED IDEOGRAPH +0x929B 0x5146 #CJK UNIFIED IDEOGRAPH +0x929C 0x51CB #CJK UNIFIED IDEOGRAPH +0x929D 0x558B #CJK UNIFIED IDEOGRAPH +0x929E 0x5BF5 #CJK UNIFIED IDEOGRAPH +0x929F 0x5E16 #CJK UNIFIED IDEOGRAPH +0x92A0 0x5E33 #CJK UNIFIED IDEOGRAPH +0x92A1 0x5E81 #CJK UNIFIED IDEOGRAPH +0x92A2 0x5F14 #CJK UNIFIED IDEOGRAPH +0x92A3 0x5F35 #CJK UNIFIED IDEOGRAPH +0x92A4 0x5F6B #CJK UNIFIED IDEOGRAPH +0x92A5 0x5FB4 #CJK UNIFIED IDEOGRAPH +0x92A6 0x61F2 #CJK UNIFIED IDEOGRAPH +0x92A7 0x6311 #CJK UNIFIED IDEOGRAPH +0x92A8 0x66A2 #CJK UNIFIED IDEOGRAPH +0x92A9 0x671D #CJK UNIFIED IDEOGRAPH +0x92AA 0x6F6E #CJK UNIFIED IDEOGRAPH +0x92AB 0x7252 #CJK UNIFIED IDEOGRAPH +0x92AC 0x753A #CJK UNIFIED IDEOGRAPH +0x92AD 0x773A #CJK UNIFIED IDEOGRAPH +0x92AE 0x8074 #CJK UNIFIED IDEOGRAPH +0x92AF 0x8139 #CJK UNIFIED IDEOGRAPH +0x92B0 0x8178 #CJK UNIFIED IDEOGRAPH +0x92B1 0x8776 #CJK UNIFIED IDEOGRAPH +0x92B2 0x8ABF #CJK UNIFIED IDEOGRAPH +0x92B3 0x8ADC #CJK UNIFIED IDEOGRAPH +0x92B4 0x8D85 #CJK UNIFIED IDEOGRAPH +0x92B5 0x8DF3 #CJK UNIFIED IDEOGRAPH +0x92B6 0x929A #CJK UNIFIED IDEOGRAPH +0x92B7 0x9577 #CJK UNIFIED IDEOGRAPH +0x92B8 0x9802 #CJK UNIFIED IDEOGRAPH +0x92B9 0x9CE5 #CJK UNIFIED IDEOGRAPH +0x92BA 0x52C5 #CJK UNIFIED IDEOGRAPH +0x92BB 0x6357 #CJK UNIFIED IDEOGRAPH +0x92BC 0x76F4 #CJK UNIFIED IDEOGRAPH +0x92BD 0x6715 #CJK UNIFIED IDEOGRAPH +0x92BE 0x6C88 #CJK UNIFIED IDEOGRAPH +0x92BF 0x73CD #CJK UNIFIED IDEOGRAPH +0x92C0 0x8CC3 #CJK UNIFIED IDEOGRAPH +0x92C1 0x93AE #CJK UNIFIED IDEOGRAPH +0x92C2 0x9673 #CJK UNIFIED IDEOGRAPH +0x92C3 0x6D25 #CJK UNIFIED IDEOGRAPH +0x92C4 0x589C #CJK UNIFIED IDEOGRAPH +0x92C5 0x690E #CJK UNIFIED IDEOGRAPH +0x92C6 0x69CC #CJK UNIFIED IDEOGRAPH +0x92C7 0x8FFD #CJK UNIFIED IDEOGRAPH +0x92C8 0x939A #CJK UNIFIED IDEOGRAPH +0x92C9 0x75DB #CJK UNIFIED IDEOGRAPH +0x92CA 0x901A #CJK UNIFIED IDEOGRAPH +0x92CB 0x585A #CJK UNIFIED IDEOGRAPH +0x92CC 0x6802 #CJK UNIFIED IDEOGRAPH +0x92CD 0x63B4 #CJK UNIFIED IDEOGRAPH +0x92CE 0x69FB #CJK UNIFIED IDEOGRAPH +0x92CF 0x4F43 #CJK UNIFIED IDEOGRAPH +0x92D0 0x6F2C #CJK UNIFIED IDEOGRAPH +0x92D1 0x67D8 #CJK UNIFIED IDEOGRAPH +0x92D2 0x8FBB #CJK UNIFIED IDEOGRAPH +0x92D3 0x8526 #CJK UNIFIED IDEOGRAPH +0x92D4 0x7DB4 #CJK UNIFIED IDEOGRAPH +0x92D5 0x9354 #CJK UNIFIED IDEOGRAPH +0x92D6 0x693F #CJK UNIFIED IDEOGRAPH +0x92D7 0x6F70 #CJK UNIFIED IDEOGRAPH +0x92D8 0x576A #CJK UNIFIED IDEOGRAPH +0x92D9 0x58F7 #CJK UNIFIED IDEOGRAPH +0x92DA 0x5B2C #CJK UNIFIED IDEOGRAPH +0x92DB 0x7D2C #CJK UNIFIED IDEOGRAPH +0x92DC 0x722A #CJK UNIFIED IDEOGRAPH +0x92DD 0x540A #CJK UNIFIED IDEOGRAPH +0x92DE 0x91E3 #CJK UNIFIED IDEOGRAPH +0x92DF 0x9DB4 #CJK UNIFIED IDEOGRAPH +0x92E0 0x4EAD #CJK UNIFIED IDEOGRAPH +0x92E1 0x4F4E #CJK UNIFIED IDEOGRAPH +0x92E2 0x505C #CJK UNIFIED IDEOGRAPH +0x92E3 0x5075 #CJK UNIFIED IDEOGRAPH +0x92E4 0x5243 #CJK UNIFIED IDEOGRAPH +0x92E5 0x8C9E #CJK UNIFIED IDEOGRAPH +0x92E6 0x5448 #CJK UNIFIED IDEOGRAPH +0x92E7 0x5824 #CJK UNIFIED IDEOGRAPH +0x92E8 0x5B9A #CJK UNIFIED IDEOGRAPH +0x92E9 0x5E1D #CJK UNIFIED IDEOGRAPH +0x92EA 0x5E95 #CJK UNIFIED IDEOGRAPH +0x92EB 0x5EAD #CJK UNIFIED IDEOGRAPH +0x92EC 0x5EF7 #CJK UNIFIED IDEOGRAPH +0x92ED 0x5F1F #CJK UNIFIED IDEOGRAPH +0x92EE 0x608C #CJK UNIFIED IDEOGRAPH +0x92EF 0x62B5 #CJK UNIFIED IDEOGRAPH +0x92F0 0x633A #CJK UNIFIED IDEOGRAPH +0x92F1 0x63D0 #CJK UNIFIED IDEOGRAPH +0x92F2 0x68AF #CJK UNIFIED IDEOGRAPH +0x92F3 0x6C40 #CJK UNIFIED IDEOGRAPH +0x92F4 0x7887 #CJK UNIFIED IDEOGRAPH +0x92F5 0x798E #CJK UNIFIED IDEOGRAPH +0x92F6 0x7A0B #CJK UNIFIED IDEOGRAPH +0x92F7 0x7DE0 #CJK UNIFIED IDEOGRAPH +0x92F8 0x8247 #CJK UNIFIED IDEOGRAPH +0x92F9 0x8A02 #CJK UNIFIED IDEOGRAPH +0x92FA 0x8AE6 #CJK UNIFIED IDEOGRAPH +0x92FB 0x8E44 #CJK UNIFIED IDEOGRAPH +0x92FC 0x9013 #CJK UNIFIED IDEOGRAPH +0x9340 0x90B8 #CJK UNIFIED IDEOGRAPH +0x9341 0x912D #CJK UNIFIED IDEOGRAPH +0x9342 0x91D8 #CJK UNIFIED IDEOGRAPH +0x9343 0x9F0E #CJK UNIFIED IDEOGRAPH +0x9344 0x6CE5 #CJK UNIFIED IDEOGRAPH +0x9345 0x6458 #CJK UNIFIED IDEOGRAPH +0x9346 0x64E2 #CJK UNIFIED IDEOGRAPH +0x9347 0x6575 #CJK UNIFIED IDEOGRAPH +0x9348 0x6EF4 #CJK UNIFIED IDEOGRAPH +0x9349 0x7684 #CJK UNIFIED IDEOGRAPH +0x934A 0x7B1B #CJK UNIFIED IDEOGRAPH +0x934B 0x9069 #CJK UNIFIED IDEOGRAPH +0x934C 0x93D1 #CJK UNIFIED IDEOGRAPH +0x934D 0x6EBA #CJK UNIFIED IDEOGRAPH +0x934E 0x54F2 #CJK UNIFIED IDEOGRAPH +0x934F 0x5FB9 #CJK UNIFIED IDEOGRAPH +0x9350 0x64A4 #CJK UNIFIED IDEOGRAPH +0x9351 0x8F4D #CJK UNIFIED IDEOGRAPH +0x9352 0x8FED #CJK UNIFIED IDEOGRAPH +0x9353 0x9244 #CJK UNIFIED IDEOGRAPH +0x9354 0x5178 #CJK UNIFIED IDEOGRAPH +0x9355 0x586B #CJK UNIFIED IDEOGRAPH +0x9356 0x5929 #CJK UNIFIED IDEOGRAPH +0x9357 0x5C55 #CJK UNIFIED IDEOGRAPH +0x9358 0x5E97 #CJK UNIFIED IDEOGRAPH +0x9359 0x6DFB #CJK UNIFIED IDEOGRAPH +0x935A 0x7E8F #CJK UNIFIED IDEOGRAPH +0x935B 0x751C #CJK UNIFIED IDEOGRAPH +0x935C 0x8CBC #CJK UNIFIED IDEOGRAPH +0x935D 0x8EE2 #CJK UNIFIED IDEOGRAPH +0x935E 0x985B #CJK UNIFIED IDEOGRAPH +0x935F 0x70B9 #CJK UNIFIED IDEOGRAPH +0x9360 0x4F1D #CJK UNIFIED IDEOGRAPH +0x9361 0x6BBF #CJK UNIFIED IDEOGRAPH +0x9362 0x6FB1 #CJK UNIFIED IDEOGRAPH +0x9363 0x7530 #CJK UNIFIED IDEOGRAPH +0x9364 0x96FB #CJK UNIFIED IDEOGRAPH +0x9365 0x514E #CJK UNIFIED IDEOGRAPH +0x9366 0x5410 #CJK UNIFIED IDEOGRAPH +0x9367 0x5835 #CJK UNIFIED IDEOGRAPH +0x9368 0x5857 #CJK UNIFIED IDEOGRAPH +0x9369 0x59AC #CJK UNIFIED IDEOGRAPH +0x936A 0x5C60 #CJK UNIFIED IDEOGRAPH +0x936B 0x5F92 #CJK UNIFIED IDEOGRAPH +0x936C 0x6597 #CJK UNIFIED IDEOGRAPH +0x936D 0x675C #CJK UNIFIED IDEOGRAPH +0x936E 0x6E21 #CJK UNIFIED IDEOGRAPH +0x936F 0x767B #CJK UNIFIED IDEOGRAPH +0x9370 0x83DF #CJK UNIFIED IDEOGRAPH +0x9371 0x8CED #CJK UNIFIED IDEOGRAPH +0x9372 0x9014 #CJK UNIFIED IDEOGRAPH +0x9373 0x90FD #CJK UNIFIED IDEOGRAPH +0x9374 0x934D #CJK UNIFIED IDEOGRAPH +0x9375 0x7825 #CJK UNIFIED IDEOGRAPH +0x9376 0x783A #CJK UNIFIED IDEOGRAPH +0x9377 0x52AA #CJK UNIFIED IDEOGRAPH +0x9378 0x5EA6 #CJK UNIFIED IDEOGRAPH +0x9379 0x571F #CJK UNIFIED IDEOGRAPH +0x937A 0x5974 #CJK UNIFIED IDEOGRAPH +0x937B 0x6012 #CJK UNIFIED IDEOGRAPH +0x937C 0x5012 #CJK UNIFIED IDEOGRAPH +0x937D 0x515A #CJK UNIFIED IDEOGRAPH +0x937E 0x51AC #CJK UNIFIED IDEOGRAPH +0x9380 0x51CD #CJK UNIFIED IDEOGRAPH +0x9381 0x5200 #CJK UNIFIED IDEOGRAPH +0x9382 0x5510 #CJK UNIFIED IDEOGRAPH +0x9383 0x5854 #CJK UNIFIED IDEOGRAPH +0x9384 0x5858 #CJK UNIFIED IDEOGRAPH +0x9385 0x5957 #CJK UNIFIED IDEOGRAPH +0x9386 0x5B95 #CJK UNIFIED IDEOGRAPH +0x9387 0x5CF6 #CJK UNIFIED IDEOGRAPH +0x9388 0x5D8B #CJK UNIFIED IDEOGRAPH +0x9389 0x60BC #CJK UNIFIED IDEOGRAPH +0x938A 0x6295 #CJK UNIFIED IDEOGRAPH +0x938B 0x642D #CJK UNIFIED IDEOGRAPH +0x938C 0x6771 #CJK UNIFIED IDEOGRAPH +0x938D 0x6843 #CJK UNIFIED IDEOGRAPH +0x938E 0x68BC #CJK UNIFIED IDEOGRAPH +0x938F 0x68DF #CJK UNIFIED IDEOGRAPH +0x9390 0x76D7 #CJK UNIFIED IDEOGRAPH +0x9391 0x6DD8 #CJK UNIFIED IDEOGRAPH +0x9392 0x6E6F #CJK UNIFIED IDEOGRAPH +0x9393 0x6D9B #CJK UNIFIED IDEOGRAPH +0x9394 0x706F #CJK UNIFIED IDEOGRAPH +0x9395 0x71C8 #CJK UNIFIED IDEOGRAPH +0x9396 0x5F53 #CJK UNIFIED IDEOGRAPH +0x9397 0x75D8 #CJK UNIFIED IDEOGRAPH +0x9398 0x7977 #CJK UNIFIED IDEOGRAPH +0x9399 0x7B49 #CJK UNIFIED IDEOGRAPH +0x939A 0x7B54 #CJK UNIFIED IDEOGRAPH +0x939B 0x7B52 #CJK UNIFIED IDEOGRAPH +0x939C 0x7CD6 #CJK UNIFIED IDEOGRAPH +0x939D 0x7D71 #CJK UNIFIED IDEOGRAPH +0x939E 0x5230 #CJK UNIFIED IDEOGRAPH +0x939F 0x8463 #CJK UNIFIED IDEOGRAPH +0x93A0 0x8569 #CJK UNIFIED IDEOGRAPH +0x93A1 0x85E4 #CJK UNIFIED IDEOGRAPH +0x93A2 0x8A0E #CJK UNIFIED IDEOGRAPH +0x93A3 0x8B04 #CJK UNIFIED IDEOGRAPH +0x93A4 0x8C46 #CJK UNIFIED IDEOGRAPH +0x93A5 0x8E0F #CJK UNIFIED IDEOGRAPH +0x93A6 0x9003 #CJK UNIFIED IDEOGRAPH +0x93A7 0x900F #CJK UNIFIED IDEOGRAPH +0x93A8 0x9419 #CJK UNIFIED IDEOGRAPH +0x93A9 0x9676 #CJK UNIFIED IDEOGRAPH +0x93AA 0x982D #CJK UNIFIED IDEOGRAPH +0x93AB 0x9A30 #CJK UNIFIED IDEOGRAPH +0x93AC 0x95D8 #CJK UNIFIED IDEOGRAPH +0x93AD 0x50CD #CJK UNIFIED IDEOGRAPH +0x93AE 0x52D5 #CJK UNIFIED IDEOGRAPH +0x93AF 0x540C #CJK UNIFIED IDEOGRAPH +0x93B0 0x5802 #CJK UNIFIED IDEOGRAPH +0x93B1 0x5C0E #CJK UNIFIED IDEOGRAPH +0x93B2 0x61A7 #CJK UNIFIED IDEOGRAPH +0x93B3 0x649E #CJK UNIFIED IDEOGRAPH +0x93B4 0x6D1E #CJK UNIFIED IDEOGRAPH +0x93B5 0x77B3 #CJK UNIFIED IDEOGRAPH +0x93B6 0x7AE5 #CJK UNIFIED IDEOGRAPH +0x93B7 0x80F4 #CJK UNIFIED IDEOGRAPH +0x93B8 0x8404 #CJK UNIFIED IDEOGRAPH +0x93B9 0x9053 #CJK UNIFIED IDEOGRAPH +0x93BA 0x9285 #CJK UNIFIED IDEOGRAPH +0x93BB 0x5CE0 #CJK UNIFIED IDEOGRAPH +0x93BC 0x9D07 #CJK UNIFIED IDEOGRAPH +0x93BD 0x533F #CJK UNIFIED IDEOGRAPH +0x93BE 0x5F97 #CJK UNIFIED IDEOGRAPH +0x93BF 0x5FB3 #CJK UNIFIED IDEOGRAPH +0x93C0 0x6D9C #CJK UNIFIED IDEOGRAPH +0x93C1 0x7279 #CJK UNIFIED IDEOGRAPH +0x93C2 0x7763 #CJK UNIFIED IDEOGRAPH +0x93C3 0x79BF #CJK UNIFIED IDEOGRAPH +0x93C4 0x7BE4 #CJK UNIFIED IDEOGRAPH +0x93C5 0x6BD2 #CJK UNIFIED IDEOGRAPH +0x93C6 0x72EC #CJK UNIFIED IDEOGRAPH +0x93C7 0x8AAD #CJK UNIFIED IDEOGRAPH +0x93C8 0x6803 #CJK UNIFIED IDEOGRAPH +0x93C9 0x6A61 #CJK UNIFIED IDEOGRAPH +0x93CA 0x51F8 #CJK UNIFIED IDEOGRAPH +0x93CB 0x7A81 #CJK UNIFIED IDEOGRAPH +0x93CC 0x6934 #CJK UNIFIED IDEOGRAPH +0x93CD 0x5C4A #CJK UNIFIED IDEOGRAPH +0x93CE 0x9CF6 #CJK UNIFIED IDEOGRAPH +0x93CF 0x82EB #CJK UNIFIED IDEOGRAPH +0x93D0 0x5BC5 #CJK UNIFIED IDEOGRAPH +0x93D1 0x9149 #CJK UNIFIED IDEOGRAPH +0x93D2 0x701E #CJK UNIFIED IDEOGRAPH +0x93D3 0x5678 #CJK UNIFIED IDEOGRAPH +0x93D4 0x5C6F #CJK UNIFIED IDEOGRAPH +0x93D5 0x60C7 #CJK UNIFIED IDEOGRAPH +0x93D6 0x6566 #CJK UNIFIED IDEOGRAPH +0x93D7 0x6C8C #CJK UNIFIED IDEOGRAPH +0x93D8 0x8C5A #CJK UNIFIED IDEOGRAPH +0x93D9 0x9041 #CJK UNIFIED IDEOGRAPH +0x93DA 0x9813 #CJK UNIFIED IDEOGRAPH +0x93DB 0x5451 #CJK UNIFIED IDEOGRAPH +0x93DC 0x66C7 #CJK UNIFIED IDEOGRAPH +0x93DD 0x920D #CJK UNIFIED IDEOGRAPH +0x93DE 0x5948 #CJK UNIFIED IDEOGRAPH +0x93DF 0x90A3 #CJK UNIFIED IDEOGRAPH +0x93E0 0x5185 #CJK UNIFIED IDEOGRAPH +0x93E1 0x4E4D #CJK UNIFIED IDEOGRAPH +0x93E2 0x51EA #CJK UNIFIED IDEOGRAPH +0x93E3 0x8599 #CJK UNIFIED IDEOGRAPH +0x93E4 0x8B0E #CJK UNIFIED IDEOGRAPH +0x93E5 0x7058 #CJK UNIFIED IDEOGRAPH +0x93E6 0x637A #CJK UNIFIED IDEOGRAPH +0x93E7 0x934B #CJK UNIFIED IDEOGRAPH +0x93E8 0x6962 #CJK UNIFIED IDEOGRAPH +0x93E9 0x99B4 #CJK UNIFIED IDEOGRAPH +0x93EA 0x7E04 #CJK UNIFIED IDEOGRAPH +0x93EB 0x7577 #CJK UNIFIED IDEOGRAPH +0x93EC 0x5357 #CJK UNIFIED IDEOGRAPH +0x93ED 0x6960 #CJK UNIFIED IDEOGRAPH +0x93EE 0x8EDF #CJK UNIFIED IDEOGRAPH +0x93EF 0x96E3 #CJK UNIFIED IDEOGRAPH +0x93F0 0x6C5D #CJK UNIFIED IDEOGRAPH +0x93F1 0x4E8C #CJK UNIFIED IDEOGRAPH +0x93F2 0x5C3C #CJK UNIFIED IDEOGRAPH +0x93F3 0x5F10 #CJK UNIFIED IDEOGRAPH +0x93F4 0x8FE9 #CJK UNIFIED IDEOGRAPH +0x93F5 0x5302 #CJK UNIFIED IDEOGRAPH +0x93F6 0x8CD1 #CJK UNIFIED IDEOGRAPH +0x93F7 0x8089 #CJK UNIFIED IDEOGRAPH +0x93F8 0x8679 #CJK UNIFIED IDEOGRAPH +0x93F9 0x5EFF #CJK UNIFIED IDEOGRAPH +0x93FA 0x65E5 #CJK UNIFIED IDEOGRAPH +0x93FB 0x4E73 #CJK UNIFIED IDEOGRAPH +0x93FC 0x5165 #CJK UNIFIED IDEOGRAPH +0x9440 0x5982 #CJK UNIFIED IDEOGRAPH +0x9441 0x5C3F #CJK UNIFIED IDEOGRAPH +0x9442 0x97EE #CJK UNIFIED IDEOGRAPH +0x9443 0x4EFB #CJK UNIFIED IDEOGRAPH +0x9444 0x598A #CJK UNIFIED IDEOGRAPH +0x9445 0x5FCD #CJK UNIFIED IDEOGRAPH +0x9446 0x8A8D #CJK UNIFIED IDEOGRAPH +0x9447 0x6FE1 #CJK UNIFIED IDEOGRAPH +0x9448 0x79B0 #CJK UNIFIED IDEOGRAPH +0x9449 0x7962 #CJK UNIFIED IDEOGRAPH +0x944A 0x5BE7 #CJK UNIFIED IDEOGRAPH +0x944B 0x8471 #CJK UNIFIED IDEOGRAPH +0x944C 0x732B #CJK UNIFIED IDEOGRAPH +0x944D 0x71B1 #CJK UNIFIED IDEOGRAPH +0x944E 0x5E74 #CJK UNIFIED IDEOGRAPH +0x944F 0x5FF5 #CJK UNIFIED IDEOGRAPH +0x9450 0x637B #CJK UNIFIED IDEOGRAPH +0x9451 0x649A #CJK UNIFIED IDEOGRAPH +0x9452 0x71C3 #CJK UNIFIED IDEOGRAPH +0x9453 0x7C98 #CJK UNIFIED IDEOGRAPH +0x9454 0x4E43 #CJK UNIFIED IDEOGRAPH +0x9455 0x5EFC #CJK UNIFIED IDEOGRAPH +0x9456 0x4E4B #CJK UNIFIED IDEOGRAPH +0x9457 0x57DC #CJK UNIFIED IDEOGRAPH +0x9458 0x56A2 #CJK UNIFIED IDEOGRAPH +0x9459 0x60A9 #CJK UNIFIED IDEOGRAPH +0x945A 0x6FC3 #CJK UNIFIED IDEOGRAPH +0x945B 0x7D0D #CJK UNIFIED IDEOGRAPH +0x945C 0x80FD #CJK UNIFIED IDEOGRAPH +0x945D 0x8133 #CJK UNIFIED IDEOGRAPH +0x945E 0x81BF #CJK UNIFIED IDEOGRAPH +0x945F 0x8FB2 #CJK UNIFIED IDEOGRAPH +0x9460 0x8997 #CJK UNIFIED IDEOGRAPH +0x9461 0x86A4 #CJK UNIFIED IDEOGRAPH +0x9462 0x5DF4 #CJK UNIFIED IDEOGRAPH +0x9463 0x628A #CJK UNIFIED IDEOGRAPH +0x9464 0x64AD #CJK UNIFIED IDEOGRAPH +0x9465 0x8987 #CJK UNIFIED IDEOGRAPH +0x9466 0x6777 #CJK UNIFIED IDEOGRAPH +0x9467 0x6CE2 #CJK UNIFIED IDEOGRAPH +0x9468 0x6D3E #CJK UNIFIED IDEOGRAPH +0x9469 0x7436 #CJK UNIFIED IDEOGRAPH +0x946A 0x7834 #CJK UNIFIED IDEOGRAPH +0x946B 0x5A46 #CJK UNIFIED IDEOGRAPH +0x946C 0x7F75 #CJK UNIFIED IDEOGRAPH +0x946D 0x82AD #CJK UNIFIED IDEOGRAPH +0x946E 0x99AC #CJK UNIFIED IDEOGRAPH +0x946F 0x4FF3 #CJK UNIFIED IDEOGRAPH +0x9470 0x5EC3 #CJK UNIFIED IDEOGRAPH +0x9471 0x62DD #CJK UNIFIED IDEOGRAPH +0x9472 0x6392 #CJK UNIFIED IDEOGRAPH +0x9473 0x6557 #CJK UNIFIED IDEOGRAPH +0x9474 0x676F #CJK UNIFIED IDEOGRAPH +0x9475 0x76C3 #CJK UNIFIED IDEOGRAPH +0x9476 0x724C #CJK UNIFIED IDEOGRAPH +0x9477 0x80CC #CJK UNIFIED IDEOGRAPH +0x9478 0x80BA #CJK UNIFIED IDEOGRAPH +0x9479 0x8F29 #CJK UNIFIED IDEOGRAPH +0x947A 0x914D #CJK UNIFIED IDEOGRAPH +0x947B 0x500D #CJK UNIFIED IDEOGRAPH +0x947C 0x57F9 #CJK UNIFIED IDEOGRAPH +0x947D 0x5A92 #CJK UNIFIED IDEOGRAPH +0x947E 0x6885 #CJK UNIFIED IDEOGRAPH +0x9480 0x6973 #CJK UNIFIED IDEOGRAPH +0x9481 0x7164 #CJK UNIFIED IDEOGRAPH +0x9482 0x72FD #CJK UNIFIED IDEOGRAPH +0x9483 0x8CB7 #CJK UNIFIED IDEOGRAPH +0x9484 0x58F2 #CJK UNIFIED IDEOGRAPH +0x9485 0x8CE0 #CJK UNIFIED IDEOGRAPH +0x9486 0x966A #CJK UNIFIED IDEOGRAPH +0x9487 0x9019 #CJK UNIFIED IDEOGRAPH +0x9488 0x877F #CJK UNIFIED IDEOGRAPH +0x9489 0x79E4 #CJK UNIFIED IDEOGRAPH +0x948A 0x77E7 #CJK UNIFIED IDEOGRAPH +0x948B 0x8429 #CJK UNIFIED IDEOGRAPH +0x948C 0x4F2F #CJK UNIFIED IDEOGRAPH +0x948D 0x5265 #CJK UNIFIED IDEOGRAPH +0x948E 0x535A #CJK UNIFIED IDEOGRAPH +0x948F 0x62CD #CJK UNIFIED IDEOGRAPH +0x9490 0x67CF #CJK UNIFIED IDEOGRAPH +0x9491 0x6CCA #CJK UNIFIED IDEOGRAPH +0x9492 0x767D #CJK UNIFIED IDEOGRAPH +0x9493 0x7B94 #CJK UNIFIED IDEOGRAPH +0x9494 0x7C95 #CJK UNIFIED IDEOGRAPH +0x9495 0x8236 #CJK UNIFIED IDEOGRAPH +0x9496 0x8584 #CJK UNIFIED IDEOGRAPH +0x9497 0x8FEB #CJK UNIFIED IDEOGRAPH +0x9498 0x66DD #CJK UNIFIED IDEOGRAPH +0x9499 0x6F20 #CJK UNIFIED IDEOGRAPH +0x949A 0x7206 #CJK UNIFIED IDEOGRAPH +0x949B 0x7E1B #CJK UNIFIED IDEOGRAPH +0x949C 0x83AB #CJK UNIFIED IDEOGRAPH +0x949D 0x99C1 #CJK UNIFIED IDEOGRAPH +0x949E 0x9EA6 #CJK UNIFIED IDEOGRAPH +0x949F 0x51FD #CJK UNIFIED IDEOGRAPH +0x94A0 0x7BB1 #CJK UNIFIED IDEOGRAPH +0x94A1 0x7872 #CJK UNIFIED IDEOGRAPH +0x94A2 0x7BB8 #CJK UNIFIED IDEOGRAPH +0x94A3 0x8087 #CJK UNIFIED IDEOGRAPH +0x94A4 0x7B48 #CJK UNIFIED IDEOGRAPH +0x94A5 0x6AE8 #CJK UNIFIED IDEOGRAPH +0x94A6 0x5E61 #CJK UNIFIED IDEOGRAPH +0x94A7 0x808C #CJK UNIFIED IDEOGRAPH +0x94A8 0x7551 #CJK UNIFIED IDEOGRAPH +0x94A9 0x7560 #CJK UNIFIED IDEOGRAPH +0x94AA 0x516B #CJK UNIFIED IDEOGRAPH +0x94AB 0x9262 #CJK UNIFIED IDEOGRAPH +0x94AC 0x6E8C #CJK UNIFIED IDEOGRAPH +0x94AD 0x767A #CJK UNIFIED IDEOGRAPH +0x94AE 0x9197 #CJK UNIFIED IDEOGRAPH +0x94AF 0x9AEA #CJK UNIFIED IDEOGRAPH +0x94B0 0x4F10 #CJK UNIFIED IDEOGRAPH +0x94B1 0x7F70 #CJK UNIFIED IDEOGRAPH +0x94B2 0x629C #CJK UNIFIED IDEOGRAPH +0x94B3 0x7B4F #CJK UNIFIED IDEOGRAPH +0x94B4 0x95A5 #CJK UNIFIED IDEOGRAPH +0x94B5 0x9CE9 #CJK UNIFIED IDEOGRAPH +0x94B6 0x567A #CJK UNIFIED IDEOGRAPH +0x94B7 0x5859 #CJK UNIFIED IDEOGRAPH +0x94B8 0x86E4 #CJK UNIFIED IDEOGRAPH +0x94B9 0x96BC #CJK UNIFIED IDEOGRAPH +0x94BA 0x4F34 #CJK UNIFIED IDEOGRAPH +0x94BB 0x5224 #CJK UNIFIED IDEOGRAPH +0x94BC 0x534A #CJK UNIFIED IDEOGRAPH +0x94BD 0x53CD #CJK UNIFIED IDEOGRAPH +0x94BE 0x53DB #CJK UNIFIED IDEOGRAPH +0x94BF 0x5E06 #CJK UNIFIED IDEOGRAPH +0x94C0 0x642C #CJK UNIFIED IDEOGRAPH +0x94C1 0x6591 #CJK UNIFIED IDEOGRAPH +0x94C2 0x677F #CJK UNIFIED IDEOGRAPH +0x94C3 0x6C3E #CJK UNIFIED IDEOGRAPH +0x94C4 0x6C4E #CJK UNIFIED IDEOGRAPH +0x94C5 0x7248 #CJK UNIFIED IDEOGRAPH +0x94C6 0x72AF #CJK UNIFIED IDEOGRAPH +0x94C7 0x73ED #CJK UNIFIED IDEOGRAPH +0x94C8 0x7554 #CJK UNIFIED IDEOGRAPH +0x94C9 0x7E41 #CJK UNIFIED IDEOGRAPH +0x94CA 0x822C #CJK UNIFIED IDEOGRAPH +0x94CB 0x85E9 #CJK UNIFIED IDEOGRAPH +0x94CC 0x8CA9 #CJK UNIFIED IDEOGRAPH +0x94CD 0x7BC4 #CJK UNIFIED IDEOGRAPH +0x94CE 0x91C6 #CJK UNIFIED IDEOGRAPH +0x94CF 0x7169 #CJK UNIFIED IDEOGRAPH +0x94D0 0x9812 #CJK UNIFIED IDEOGRAPH +0x94D1 0x98EF #CJK UNIFIED IDEOGRAPH +0x94D2 0x633D #CJK UNIFIED IDEOGRAPH +0x94D3 0x6669 #CJK UNIFIED IDEOGRAPH +0x94D4 0x756A #CJK UNIFIED IDEOGRAPH +0x94D5 0x76E4 #CJK UNIFIED IDEOGRAPH +0x94D6 0x78D0 #CJK UNIFIED IDEOGRAPH +0x94D7 0x8543 #CJK UNIFIED IDEOGRAPH +0x94D8 0x86EE #CJK UNIFIED IDEOGRAPH +0x94D9 0x532A #CJK UNIFIED IDEOGRAPH +0x94DA 0x5351 #CJK UNIFIED IDEOGRAPH +0x94DB 0x5426 #CJK UNIFIED IDEOGRAPH +0x94DC 0x5983 #CJK UNIFIED IDEOGRAPH +0x94DD 0x5E87 #CJK UNIFIED IDEOGRAPH +0x94DE 0x5F7C #CJK UNIFIED IDEOGRAPH +0x94DF 0x60B2 #CJK UNIFIED IDEOGRAPH +0x94E0 0x6249 #CJK UNIFIED IDEOGRAPH +0x94E1 0x6279 #CJK UNIFIED IDEOGRAPH +0x94E2 0x62AB #CJK UNIFIED IDEOGRAPH +0x94E3 0x6590 #CJK UNIFIED IDEOGRAPH +0x94E4 0x6BD4 #CJK UNIFIED IDEOGRAPH +0x94E5 0x6CCC #CJK UNIFIED IDEOGRAPH +0x94E6 0x75B2 #CJK UNIFIED IDEOGRAPH +0x94E7 0x76AE #CJK UNIFIED IDEOGRAPH +0x94E8 0x7891 #CJK UNIFIED IDEOGRAPH +0x94E9 0x79D8 #CJK UNIFIED IDEOGRAPH +0x94EA 0x7DCB #CJK UNIFIED IDEOGRAPH +0x94EB 0x7F77 #CJK UNIFIED IDEOGRAPH +0x94EC 0x80A5 #CJK UNIFIED IDEOGRAPH +0x94ED 0x88AB #CJK UNIFIED IDEOGRAPH +0x94EE 0x8AB9 #CJK UNIFIED IDEOGRAPH +0x94EF 0x8CBB #CJK UNIFIED IDEOGRAPH +0x94F0 0x907F #CJK UNIFIED IDEOGRAPH +0x94F1 0x975E #CJK UNIFIED IDEOGRAPH +0x94F2 0x98DB #CJK UNIFIED IDEOGRAPH +0x94F3 0x6A0B #CJK UNIFIED IDEOGRAPH +0x94F4 0x7C38 #CJK UNIFIED IDEOGRAPH +0x94F5 0x5099 #CJK UNIFIED IDEOGRAPH +0x94F6 0x5C3E #CJK UNIFIED IDEOGRAPH +0x94F7 0x5FAE #CJK UNIFIED IDEOGRAPH +0x94F8 0x6787 #CJK UNIFIED IDEOGRAPH +0x94F9 0x6BD8 #CJK UNIFIED IDEOGRAPH +0x94FA 0x7435 #CJK UNIFIED IDEOGRAPH +0x94FB 0x7709 #CJK UNIFIED IDEOGRAPH +0x94FC 0x7F8E #CJK UNIFIED IDEOGRAPH +0x9540 0x9F3B #CJK UNIFIED IDEOGRAPH +0x9541 0x67CA #CJK UNIFIED IDEOGRAPH +0x9542 0x7A17 #CJK UNIFIED IDEOGRAPH +0x9543 0x5339 #CJK UNIFIED IDEOGRAPH +0x9544 0x758B #CJK UNIFIED IDEOGRAPH +0x9545 0x9AED #CJK UNIFIED IDEOGRAPH +0x9546 0x5F66 #CJK UNIFIED IDEOGRAPH +0x9547 0x819D #CJK UNIFIED IDEOGRAPH +0x9548 0x83F1 #CJK UNIFIED IDEOGRAPH +0x9549 0x8098 #CJK UNIFIED IDEOGRAPH +0x954A 0x5F3C #CJK UNIFIED IDEOGRAPH +0x954B 0x5FC5 #CJK UNIFIED IDEOGRAPH +0x954C 0x7562 #CJK UNIFIED IDEOGRAPH +0x954D 0x7B46 #CJK UNIFIED IDEOGRAPH +0x954E 0x903C #CJK UNIFIED IDEOGRAPH +0x954F 0x6867 #CJK UNIFIED IDEOGRAPH +0x9550 0x59EB #CJK UNIFIED IDEOGRAPH +0x9551 0x5A9B #CJK UNIFIED IDEOGRAPH +0x9552 0x7D10 #CJK UNIFIED IDEOGRAPH +0x9553 0x767E #CJK UNIFIED IDEOGRAPH +0x9554 0x8B2C #CJK UNIFIED IDEOGRAPH +0x9555 0x4FF5 #CJK UNIFIED IDEOGRAPH +0x9556 0x5F6A #CJK UNIFIED IDEOGRAPH +0x9557 0x6A19 #CJK UNIFIED IDEOGRAPH +0x9558 0x6C37 #CJK UNIFIED IDEOGRAPH +0x9559 0x6F02 #CJK UNIFIED IDEOGRAPH +0x955A 0x74E2 #CJK UNIFIED IDEOGRAPH +0x955B 0x7968 #CJK UNIFIED IDEOGRAPH +0x955C 0x8868 #CJK UNIFIED IDEOGRAPH +0x955D 0x8A55 #CJK UNIFIED IDEOGRAPH +0x955E 0x8C79 #CJK UNIFIED IDEOGRAPH +0x955F 0x5EDF #CJK UNIFIED IDEOGRAPH +0x9560 0x63CF #CJK UNIFIED IDEOGRAPH +0x9561 0x75C5 #CJK UNIFIED IDEOGRAPH +0x9562 0x79D2 #CJK UNIFIED IDEOGRAPH +0x9563 0x82D7 #CJK UNIFIED IDEOGRAPH +0x9564 0x9328 #CJK UNIFIED IDEOGRAPH +0x9565 0x92F2 #CJK UNIFIED IDEOGRAPH +0x9566 0x849C #CJK UNIFIED IDEOGRAPH +0x9567 0x86ED #CJK UNIFIED IDEOGRAPH +0x9568 0x9C2D #CJK UNIFIED IDEOGRAPH +0x9569 0x54C1 #CJK UNIFIED IDEOGRAPH +0x956A 0x5F6C #CJK UNIFIED IDEOGRAPH +0x956B 0x658C #CJK UNIFIED IDEOGRAPH +0x956C 0x6D5C #CJK UNIFIED IDEOGRAPH +0x956D 0x7015 #CJK UNIFIED IDEOGRAPH +0x956E 0x8CA7 #CJK UNIFIED IDEOGRAPH +0x956F 0x8CD3 #CJK UNIFIED IDEOGRAPH +0x9570 0x983B #CJK UNIFIED IDEOGRAPH +0x9571 0x654F #CJK UNIFIED IDEOGRAPH +0x9572 0x74F6 #CJK UNIFIED IDEOGRAPH +0x9573 0x4E0D #CJK UNIFIED IDEOGRAPH +0x9574 0x4ED8 #CJK UNIFIED IDEOGRAPH +0x9575 0x57E0 #CJK UNIFIED IDEOGRAPH +0x9576 0x592B #CJK UNIFIED IDEOGRAPH +0x9577 0x5A66 #CJK UNIFIED IDEOGRAPH +0x9578 0x5BCC #CJK UNIFIED IDEOGRAPH +0x9579 0x51A8 #CJK UNIFIED IDEOGRAPH +0x957A 0x5E03 #CJK UNIFIED IDEOGRAPH +0x957B 0x5E9C #CJK UNIFIED IDEOGRAPH +0x957C 0x6016 #CJK UNIFIED IDEOGRAPH +0x957D 0x6276 #CJK UNIFIED IDEOGRAPH +0x957E 0x6577 #CJK UNIFIED IDEOGRAPH +0x9580 0x65A7 #CJK UNIFIED IDEOGRAPH +0x9581 0x666E #CJK UNIFIED IDEOGRAPH +0x9582 0x6D6E #CJK UNIFIED IDEOGRAPH +0x9583 0x7236 #CJK UNIFIED IDEOGRAPH +0x9584 0x7B26 #CJK UNIFIED IDEOGRAPH +0x9585 0x8150 #CJK UNIFIED IDEOGRAPH +0x9586 0x819A #CJK UNIFIED IDEOGRAPH +0x9587 0x8299 #CJK UNIFIED IDEOGRAPH +0x9588 0x8B5C #CJK UNIFIED IDEOGRAPH +0x9589 0x8CA0 #CJK UNIFIED IDEOGRAPH +0x958A 0x8CE6 #CJK UNIFIED IDEOGRAPH +0x958B 0x8D74 #CJK UNIFIED IDEOGRAPH +0x958C 0x961C #CJK UNIFIED IDEOGRAPH +0x958D 0x9644 #CJK UNIFIED IDEOGRAPH +0x958E 0x4FAE #CJK UNIFIED IDEOGRAPH +0x958F 0x64AB #CJK UNIFIED IDEOGRAPH +0x9590 0x6B66 #CJK UNIFIED IDEOGRAPH +0x9591 0x821E #CJK UNIFIED IDEOGRAPH +0x9592 0x8461 #CJK UNIFIED IDEOGRAPH +0x9593 0x856A #CJK UNIFIED IDEOGRAPH +0x9594 0x90E8 #CJK UNIFIED IDEOGRAPH +0x9595 0x5C01 #CJK UNIFIED IDEOGRAPH +0x9596 0x6953 #CJK UNIFIED IDEOGRAPH +0x9597 0x98A8 #CJK UNIFIED IDEOGRAPH +0x9598 0x847A #CJK UNIFIED IDEOGRAPH +0x9599 0x8557 #CJK UNIFIED IDEOGRAPH +0x959A 0x4F0F #CJK UNIFIED IDEOGRAPH +0x959B 0x526F #CJK UNIFIED IDEOGRAPH +0x959C 0x5FA9 #CJK UNIFIED IDEOGRAPH +0x959D 0x5E45 #CJK UNIFIED IDEOGRAPH +0x959E 0x670D #CJK UNIFIED IDEOGRAPH +0x959F 0x798F #CJK UNIFIED IDEOGRAPH +0x95A0 0x8179 #CJK UNIFIED IDEOGRAPH +0x95A1 0x8907 #CJK UNIFIED IDEOGRAPH +0x95A2 0x8986 #CJK UNIFIED IDEOGRAPH +0x95A3 0x6DF5 #CJK UNIFIED IDEOGRAPH +0x95A4 0x5F17 #CJK UNIFIED IDEOGRAPH +0x95A5 0x6255 #CJK UNIFIED IDEOGRAPH +0x95A6 0x6CB8 #CJK UNIFIED IDEOGRAPH +0x95A7 0x4ECF #CJK UNIFIED IDEOGRAPH +0x95A8 0x7269 #CJK UNIFIED IDEOGRAPH +0x95A9 0x9B92 #CJK UNIFIED IDEOGRAPH +0x95AA 0x5206 #CJK UNIFIED IDEOGRAPH +0x95AB 0x543B #CJK UNIFIED IDEOGRAPH +0x95AC 0x5674 #CJK UNIFIED IDEOGRAPH +0x95AD 0x58B3 #CJK UNIFIED IDEOGRAPH +0x95AE 0x61A4 #CJK UNIFIED IDEOGRAPH +0x95AF 0x626E #CJK UNIFIED IDEOGRAPH +0x95B0 0x711A #CJK UNIFIED IDEOGRAPH +0x95B1 0x596E #CJK UNIFIED IDEOGRAPH +0x95B2 0x7C89 #CJK UNIFIED IDEOGRAPH +0x95B3 0x7CDE #CJK UNIFIED IDEOGRAPH +0x95B4 0x7D1B #CJK UNIFIED IDEOGRAPH +0x95B5 0x96F0 #CJK UNIFIED IDEOGRAPH +0x95B6 0x6587 #CJK UNIFIED IDEOGRAPH +0x95B7 0x805E #CJK UNIFIED IDEOGRAPH +0x95B8 0x4E19 #CJK UNIFIED IDEOGRAPH +0x95B9 0x4F75 #CJK UNIFIED IDEOGRAPH +0x95BA 0x5175 #CJK UNIFIED IDEOGRAPH +0x95BB 0x5840 #CJK UNIFIED IDEOGRAPH +0x95BC 0x5E63 #CJK UNIFIED IDEOGRAPH +0x95BD 0x5E73 #CJK UNIFIED IDEOGRAPH +0x95BE 0x5F0A #CJK UNIFIED IDEOGRAPH +0x95BF 0x67C4 #CJK UNIFIED IDEOGRAPH +0x95C0 0x4E26 #CJK UNIFIED IDEOGRAPH +0x95C1 0x853D #CJK UNIFIED IDEOGRAPH +0x95C2 0x9589 #CJK UNIFIED IDEOGRAPH +0x95C3 0x965B #CJK UNIFIED IDEOGRAPH +0x95C4 0x7C73 #CJK UNIFIED IDEOGRAPH +0x95C5 0x9801 #CJK UNIFIED IDEOGRAPH +0x95C6 0x50FB #CJK UNIFIED IDEOGRAPH +0x95C7 0x58C1 #CJK UNIFIED IDEOGRAPH +0x95C8 0x7656 #CJK UNIFIED IDEOGRAPH +0x95C9 0x78A7 #CJK UNIFIED IDEOGRAPH +0x95CA 0x5225 #CJK UNIFIED IDEOGRAPH +0x95CB 0x77A5 #CJK UNIFIED IDEOGRAPH +0x95CC 0x8511 #CJK UNIFIED IDEOGRAPH +0x95CD 0x7B86 #CJK UNIFIED IDEOGRAPH +0x95CE 0x504F #CJK UNIFIED IDEOGRAPH +0x95CF 0x5909 #CJK UNIFIED IDEOGRAPH +0x95D0 0x7247 #CJK UNIFIED IDEOGRAPH +0x95D1 0x7BC7 #CJK UNIFIED IDEOGRAPH +0x95D2 0x7DE8 #CJK UNIFIED IDEOGRAPH +0x95D3 0x8FBA #CJK UNIFIED IDEOGRAPH +0x95D4 0x8FD4 #CJK UNIFIED IDEOGRAPH +0x95D5 0x904D #CJK UNIFIED IDEOGRAPH +0x95D6 0x4FBF #CJK UNIFIED IDEOGRAPH +0x95D7 0x52C9 #CJK UNIFIED IDEOGRAPH +0x95D8 0x5A29 #CJK UNIFIED IDEOGRAPH +0x95D9 0x5F01 #CJK UNIFIED IDEOGRAPH +0x95DA 0x97AD #CJK UNIFIED IDEOGRAPH +0x95DB 0x4FDD #CJK UNIFIED IDEOGRAPH +0x95DC 0x8217 #CJK UNIFIED IDEOGRAPH +0x95DD 0x92EA #CJK UNIFIED IDEOGRAPH +0x95DE 0x5703 #CJK UNIFIED IDEOGRAPH +0x95DF 0x6355 #CJK UNIFIED IDEOGRAPH +0x95E0 0x6B69 #CJK UNIFIED IDEOGRAPH +0x95E1 0x752B #CJK UNIFIED IDEOGRAPH +0x95E2 0x88DC #CJK UNIFIED IDEOGRAPH +0x95E3 0x8F14 #CJK UNIFIED IDEOGRAPH +0x95E4 0x7A42 #CJK UNIFIED IDEOGRAPH +0x95E5 0x52DF #CJK UNIFIED IDEOGRAPH +0x95E6 0x5893 #CJK UNIFIED IDEOGRAPH +0x95E7 0x6155 #CJK UNIFIED IDEOGRAPH +0x95E8 0x620A #CJK UNIFIED IDEOGRAPH +0x95E9 0x66AE #CJK UNIFIED IDEOGRAPH +0x95EA 0x6BCD #CJK UNIFIED IDEOGRAPH +0x95EB 0x7C3F #CJK UNIFIED IDEOGRAPH +0x95EC 0x83E9 #CJK UNIFIED IDEOGRAPH +0x95ED 0x5023 #CJK UNIFIED IDEOGRAPH +0x95EE 0x4FF8 #CJK UNIFIED IDEOGRAPH +0x95EF 0x5305 #CJK UNIFIED IDEOGRAPH +0x95F0 0x5446 #CJK UNIFIED IDEOGRAPH +0x95F1 0x5831 #CJK UNIFIED IDEOGRAPH +0x95F2 0x5949 #CJK UNIFIED IDEOGRAPH +0x95F3 0x5B9D #CJK UNIFIED IDEOGRAPH +0x95F4 0x5CF0 #CJK UNIFIED IDEOGRAPH +0x95F5 0x5CEF #CJK UNIFIED IDEOGRAPH +0x95F6 0x5D29 #CJK UNIFIED IDEOGRAPH +0x95F7 0x5E96 #CJK UNIFIED IDEOGRAPH +0x95F8 0x62B1 #CJK UNIFIED IDEOGRAPH +0x95F9 0x6367 #CJK UNIFIED IDEOGRAPH +0x95FA 0x653E #CJK UNIFIED IDEOGRAPH +0x95FB 0x65B9 #CJK UNIFIED IDEOGRAPH +0x95FC 0x670B #CJK UNIFIED IDEOGRAPH +0x9640 0x6CD5 #CJK UNIFIED IDEOGRAPH +0x9641 0x6CE1 #CJK UNIFIED IDEOGRAPH +0x9642 0x70F9 #CJK UNIFIED IDEOGRAPH +0x9643 0x7832 #CJK UNIFIED IDEOGRAPH +0x9644 0x7E2B #CJK UNIFIED IDEOGRAPH +0x9645 0x80DE #CJK UNIFIED IDEOGRAPH +0x9646 0x82B3 #CJK UNIFIED IDEOGRAPH +0x9647 0x840C #CJK UNIFIED IDEOGRAPH +0x9648 0x84EC #CJK UNIFIED IDEOGRAPH +0x9649 0x8702 #CJK UNIFIED IDEOGRAPH +0x964A 0x8912 #CJK UNIFIED IDEOGRAPH +0x964B 0x8A2A #CJK UNIFIED IDEOGRAPH +0x964C 0x8C4A #CJK UNIFIED IDEOGRAPH +0x964D 0x90A6 #CJK UNIFIED IDEOGRAPH +0x964E 0x92D2 #CJK UNIFIED IDEOGRAPH +0x964F 0x98FD #CJK UNIFIED IDEOGRAPH +0x9650 0x9CF3 #CJK UNIFIED IDEOGRAPH +0x9651 0x9D6C #CJK UNIFIED IDEOGRAPH +0x9652 0x4E4F #CJK UNIFIED IDEOGRAPH +0x9653 0x4EA1 #CJK UNIFIED IDEOGRAPH +0x9654 0x508D #CJK UNIFIED IDEOGRAPH +0x9655 0x5256 #CJK UNIFIED IDEOGRAPH +0x9656 0x574A #CJK UNIFIED IDEOGRAPH +0x9657 0x59A8 #CJK UNIFIED IDEOGRAPH +0x9658 0x5E3D #CJK UNIFIED IDEOGRAPH +0x9659 0x5FD8 #CJK UNIFIED IDEOGRAPH +0x965A 0x5FD9 #CJK UNIFIED IDEOGRAPH +0x965B 0x623F #CJK UNIFIED IDEOGRAPH +0x965C 0x66B4 #CJK UNIFIED IDEOGRAPH +0x965D 0x671B #CJK UNIFIED IDEOGRAPH +0x965E 0x67D0 #CJK UNIFIED IDEOGRAPH +0x965F 0x68D2 #CJK UNIFIED IDEOGRAPH +0x9660 0x5192 #CJK UNIFIED IDEOGRAPH +0x9661 0x7D21 #CJK UNIFIED IDEOGRAPH +0x9662 0x80AA #CJK UNIFIED IDEOGRAPH +0x9663 0x81A8 #CJK UNIFIED IDEOGRAPH +0x9664 0x8B00 #CJK UNIFIED IDEOGRAPH +0x9665 0x8C8C #CJK UNIFIED IDEOGRAPH +0x9666 0x8CBF #CJK UNIFIED IDEOGRAPH +0x9667 0x927E #CJK UNIFIED IDEOGRAPH +0x9668 0x9632 #CJK UNIFIED IDEOGRAPH +0x9669 0x5420 #CJK UNIFIED IDEOGRAPH +0x966A 0x982C #CJK UNIFIED IDEOGRAPH +0x966B 0x5317 #CJK UNIFIED IDEOGRAPH +0x966C 0x50D5 #CJK UNIFIED IDEOGRAPH +0x966D 0x535C #CJK UNIFIED IDEOGRAPH +0x966E 0x58A8 #CJK UNIFIED IDEOGRAPH +0x966F 0x64B2 #CJK UNIFIED IDEOGRAPH +0x9670 0x6734 #CJK UNIFIED IDEOGRAPH +0x9671 0x7267 #CJK UNIFIED IDEOGRAPH +0x9672 0x7766 #CJK UNIFIED IDEOGRAPH +0x9673 0x7A46 #CJK UNIFIED IDEOGRAPH +0x9674 0x91E6 #CJK UNIFIED IDEOGRAPH +0x9675 0x52C3 #CJK UNIFIED IDEOGRAPH +0x9676 0x6CA1 #CJK UNIFIED IDEOGRAPH +0x9677 0x6B86 #CJK UNIFIED IDEOGRAPH +0x9678 0x5800 #CJK UNIFIED IDEOGRAPH +0x9679 0x5E4C #CJK UNIFIED IDEOGRAPH +0x967A 0x5954 #CJK UNIFIED IDEOGRAPH +0x967B 0x672C #CJK UNIFIED IDEOGRAPH +0x967C 0x7FFB #CJK UNIFIED IDEOGRAPH +0x967D 0x51E1 #CJK UNIFIED IDEOGRAPH +0x967E 0x76C6 #CJK UNIFIED IDEOGRAPH +0x9680 0x6469 #CJK UNIFIED IDEOGRAPH +0x9681 0x78E8 #CJK UNIFIED IDEOGRAPH +0x9682 0x9B54 #CJK UNIFIED IDEOGRAPH +0x9683 0x9EBB #CJK UNIFIED IDEOGRAPH +0x9684 0x57CB #CJK UNIFIED IDEOGRAPH +0x9685 0x59B9 #CJK UNIFIED IDEOGRAPH +0x9686 0x6627 #CJK UNIFIED IDEOGRAPH +0x9687 0x679A #CJK UNIFIED IDEOGRAPH +0x9688 0x6BCE #CJK UNIFIED IDEOGRAPH +0x9689 0x54E9 #CJK UNIFIED IDEOGRAPH +0x968A 0x69D9 #CJK UNIFIED IDEOGRAPH +0x968B 0x5E55 #CJK UNIFIED IDEOGRAPH +0x968C 0x819C #CJK UNIFIED IDEOGRAPH +0x968D 0x6795 #CJK UNIFIED IDEOGRAPH +0x968E 0x9BAA #CJK UNIFIED IDEOGRAPH +0x968F 0x67FE #CJK UNIFIED IDEOGRAPH +0x9690 0x9C52 #CJK UNIFIED IDEOGRAPH +0x9691 0x685D #CJK UNIFIED IDEOGRAPH +0x9692 0x4EA6 #CJK UNIFIED IDEOGRAPH +0x9693 0x4FE3 #CJK UNIFIED IDEOGRAPH +0x9694 0x53C8 #CJK UNIFIED IDEOGRAPH +0x9695 0x62B9 #CJK UNIFIED IDEOGRAPH +0x9696 0x672B #CJK UNIFIED IDEOGRAPH +0x9697 0x6CAB #CJK UNIFIED IDEOGRAPH +0x9698 0x8FC4 #CJK UNIFIED IDEOGRAPH +0x9699 0x4FAD #CJK UNIFIED IDEOGRAPH +0x969A 0x7E6D #CJK UNIFIED IDEOGRAPH +0x969B 0x9EBF #CJK UNIFIED IDEOGRAPH +0x969C 0x4E07 #CJK UNIFIED IDEOGRAPH +0x969D 0x6162 #CJK UNIFIED IDEOGRAPH +0x969E 0x6E80 #CJK UNIFIED IDEOGRAPH +0x969F 0x6F2B #CJK UNIFIED IDEOGRAPH +0x96A0 0x8513 #CJK UNIFIED IDEOGRAPH +0x96A1 0x5473 #CJK UNIFIED IDEOGRAPH +0x96A2 0x672A #CJK UNIFIED IDEOGRAPH +0x96A3 0x9B45 #CJK UNIFIED IDEOGRAPH +0x96A4 0x5DF3 #CJK UNIFIED IDEOGRAPH +0x96A5 0x7B95 #CJK UNIFIED IDEOGRAPH +0x96A6 0x5CAC #CJK UNIFIED IDEOGRAPH +0x96A7 0x5BC6 #CJK UNIFIED IDEOGRAPH +0x96A8 0x871C #CJK UNIFIED IDEOGRAPH +0x96A9 0x6E4A #CJK UNIFIED IDEOGRAPH +0x96AA 0x84D1 #CJK UNIFIED IDEOGRAPH +0x96AB 0x7A14 #CJK UNIFIED IDEOGRAPH +0x96AC 0x8108 #CJK UNIFIED IDEOGRAPH +0x96AD 0x5999 #CJK UNIFIED IDEOGRAPH +0x96AE 0x7C8D #CJK UNIFIED IDEOGRAPH +0x96AF 0x6C11 #CJK UNIFIED IDEOGRAPH +0x96B0 0x7720 #CJK UNIFIED IDEOGRAPH +0x96B1 0x52D9 #CJK UNIFIED IDEOGRAPH +0x96B2 0x5922 #CJK UNIFIED IDEOGRAPH +0x96B3 0x7121 #CJK UNIFIED IDEOGRAPH +0x96B4 0x725F #CJK UNIFIED IDEOGRAPH +0x96B5 0x77DB #CJK UNIFIED IDEOGRAPH +0x96B6 0x9727 #CJK UNIFIED IDEOGRAPH +0x96B7 0x9D61 #CJK UNIFIED IDEOGRAPH +0x96B8 0x690B #CJK UNIFIED IDEOGRAPH +0x96B9 0x5A7F #CJK UNIFIED IDEOGRAPH +0x96BA 0x5A18 #CJK UNIFIED IDEOGRAPH +0x96BB 0x51A5 #CJK UNIFIED IDEOGRAPH +0x96BC 0x540D #CJK UNIFIED IDEOGRAPH +0x96BD 0x547D #CJK UNIFIED IDEOGRAPH +0x96BE 0x660E #CJK UNIFIED IDEOGRAPH +0x96BF 0x76DF #CJK UNIFIED IDEOGRAPH +0x96C0 0x8FF7 #CJK UNIFIED IDEOGRAPH +0x96C1 0x9298 #CJK UNIFIED IDEOGRAPH +0x96C2 0x9CF4 #CJK UNIFIED IDEOGRAPH +0x96C3 0x59EA #CJK UNIFIED IDEOGRAPH +0x96C4 0x725D #CJK UNIFIED IDEOGRAPH +0x96C5 0x6EC5 #CJK UNIFIED IDEOGRAPH +0x96C6 0x514D #CJK UNIFIED IDEOGRAPH +0x96C7 0x68C9 #CJK UNIFIED IDEOGRAPH +0x96C8 0x7DBF #CJK UNIFIED IDEOGRAPH +0x96C9 0x7DEC #CJK UNIFIED IDEOGRAPH +0x96CA 0x9762 #CJK UNIFIED IDEOGRAPH +0x96CB 0x9EBA #CJK UNIFIED IDEOGRAPH +0x96CC 0x6478 #CJK UNIFIED IDEOGRAPH +0x96CD 0x6A21 #CJK UNIFIED IDEOGRAPH +0x96CE 0x8302 #CJK UNIFIED IDEOGRAPH +0x96CF 0x5984 #CJK UNIFIED IDEOGRAPH +0x96D0 0x5B5F #CJK UNIFIED IDEOGRAPH +0x96D1 0x6BDB #CJK UNIFIED IDEOGRAPH +0x96D2 0x731B #CJK UNIFIED IDEOGRAPH +0x96D3 0x76F2 #CJK UNIFIED IDEOGRAPH +0x96D4 0x7DB2 #CJK UNIFIED IDEOGRAPH +0x96D5 0x8017 #CJK UNIFIED IDEOGRAPH +0x96D6 0x8499 #CJK UNIFIED IDEOGRAPH +0x96D7 0x5132 #CJK UNIFIED IDEOGRAPH +0x96D8 0x6728 #CJK UNIFIED IDEOGRAPH +0x96D9 0x9ED9 #CJK UNIFIED IDEOGRAPH +0x96DA 0x76EE #CJK UNIFIED IDEOGRAPH +0x96DB 0x6762 #CJK UNIFIED IDEOGRAPH +0x96DC 0x52FF #CJK UNIFIED IDEOGRAPH +0x96DD 0x9905 #CJK UNIFIED IDEOGRAPH +0x96DE 0x5C24 #CJK UNIFIED IDEOGRAPH +0x96DF 0x623B #CJK UNIFIED IDEOGRAPH +0x96E0 0x7C7E #CJK UNIFIED IDEOGRAPH +0x96E1 0x8CB0 #CJK UNIFIED IDEOGRAPH +0x96E2 0x554F #CJK UNIFIED IDEOGRAPH +0x96E3 0x60B6 #CJK UNIFIED IDEOGRAPH +0x96E4 0x7D0B #CJK UNIFIED IDEOGRAPH +0x96E5 0x9580 #CJK UNIFIED IDEOGRAPH +0x96E6 0x5301 #CJK UNIFIED IDEOGRAPH +0x96E7 0x4E5F #CJK UNIFIED IDEOGRAPH +0x96E8 0x51B6 #CJK UNIFIED IDEOGRAPH +0x96E9 0x591C #CJK UNIFIED IDEOGRAPH +0x96EA 0x723A #CJK UNIFIED IDEOGRAPH +0x96EB 0x8036 #CJK UNIFIED IDEOGRAPH +0x96EC 0x91CE #CJK UNIFIED IDEOGRAPH +0x96ED 0x5F25 #CJK UNIFIED IDEOGRAPH +0x96EE 0x77E2 #CJK UNIFIED IDEOGRAPH +0x96EF 0x5384 #CJK UNIFIED IDEOGRAPH +0x96F0 0x5F79 #CJK UNIFIED IDEOGRAPH +0x96F1 0x7D04 #CJK UNIFIED IDEOGRAPH +0x96F2 0x85AC #CJK UNIFIED IDEOGRAPH +0x96F3 0x8A33 #CJK UNIFIED IDEOGRAPH +0x96F4 0x8E8D #CJK UNIFIED IDEOGRAPH +0x96F5 0x9756 #CJK UNIFIED IDEOGRAPH +0x96F6 0x67F3 #CJK UNIFIED IDEOGRAPH +0x96F7 0x85AE #CJK UNIFIED IDEOGRAPH +0x96F8 0x9453 #CJK UNIFIED IDEOGRAPH +0x96F9 0x6109 #CJK UNIFIED IDEOGRAPH +0x96FA 0x6108 #CJK UNIFIED IDEOGRAPH +0x96FB 0x6CB9 #CJK UNIFIED IDEOGRAPH +0x96FC 0x7652 #CJK UNIFIED IDEOGRAPH +0x9740 0x8AED #CJK UNIFIED IDEOGRAPH +0x9741 0x8F38 #CJK UNIFIED IDEOGRAPH +0x9742 0x552F #CJK UNIFIED IDEOGRAPH +0x9743 0x4F51 #CJK UNIFIED IDEOGRAPH +0x9744 0x512A #CJK UNIFIED IDEOGRAPH +0x9745 0x52C7 #CJK UNIFIED IDEOGRAPH +0x9746 0x53CB #CJK UNIFIED IDEOGRAPH +0x9747 0x5BA5 #CJK UNIFIED IDEOGRAPH +0x9748 0x5E7D #CJK UNIFIED IDEOGRAPH +0x9749 0x60A0 #CJK UNIFIED IDEOGRAPH +0x974A 0x6182 #CJK UNIFIED IDEOGRAPH +0x974B 0x63D6 #CJK UNIFIED IDEOGRAPH +0x974C 0x6709 #CJK UNIFIED IDEOGRAPH +0x974D 0x67DA #CJK UNIFIED IDEOGRAPH +0x974E 0x6E67 #CJK UNIFIED IDEOGRAPH +0x974F 0x6D8C #CJK UNIFIED IDEOGRAPH +0x9750 0x7336 #CJK UNIFIED IDEOGRAPH +0x9751 0x7337 #CJK UNIFIED IDEOGRAPH +0x9752 0x7531 #CJK UNIFIED IDEOGRAPH +0x9753 0x7950 #CJK UNIFIED IDEOGRAPH +0x9754 0x88D5 #CJK UNIFIED IDEOGRAPH +0x9755 0x8A98 #CJK UNIFIED IDEOGRAPH +0x9756 0x904A #CJK UNIFIED IDEOGRAPH +0x9757 0x9091 #CJK UNIFIED IDEOGRAPH +0x9758 0x90F5 #CJK UNIFIED IDEOGRAPH +0x9759 0x96C4 #CJK UNIFIED IDEOGRAPH +0x975A 0x878D #CJK UNIFIED IDEOGRAPH +0x975B 0x5915 #CJK UNIFIED IDEOGRAPH +0x975C 0x4E88 #CJK UNIFIED IDEOGRAPH +0x975D 0x4F59 #CJK UNIFIED IDEOGRAPH +0x975E 0x4E0E #CJK UNIFIED IDEOGRAPH +0x975F 0x8A89 #CJK UNIFIED IDEOGRAPH +0x9760 0x8F3F #CJK UNIFIED IDEOGRAPH +0x9761 0x9810 #CJK UNIFIED IDEOGRAPH +0x9762 0x50AD #CJK UNIFIED IDEOGRAPH +0x9763 0x5E7C #CJK UNIFIED IDEOGRAPH +0x9764 0x5996 #CJK UNIFIED IDEOGRAPH +0x9765 0x5BB9 #CJK UNIFIED IDEOGRAPH +0x9766 0x5EB8 #CJK UNIFIED IDEOGRAPH +0x9767 0x63DA #CJK UNIFIED IDEOGRAPH +0x9768 0x63FA #CJK UNIFIED IDEOGRAPH +0x9769 0x64C1 #CJK UNIFIED IDEOGRAPH +0x976A 0x66DC #CJK UNIFIED IDEOGRAPH +0x976B 0x694A #CJK UNIFIED IDEOGRAPH +0x976C 0x69D8 #CJK UNIFIED IDEOGRAPH +0x976D 0x6D0B #CJK UNIFIED IDEOGRAPH +0x976E 0x6EB6 #CJK UNIFIED IDEOGRAPH +0x976F 0x7194 #CJK UNIFIED IDEOGRAPH +0x9770 0x7528 #CJK UNIFIED IDEOGRAPH +0x9771 0x7AAF #CJK UNIFIED IDEOGRAPH +0x9772 0x7F8A #CJK UNIFIED IDEOGRAPH +0x9773 0x8000 #CJK UNIFIED IDEOGRAPH +0x9774 0x8449 #CJK UNIFIED IDEOGRAPH +0x9775 0x84C9 #CJK UNIFIED IDEOGRAPH +0x9776 0x8981 #CJK UNIFIED IDEOGRAPH +0x9777 0x8B21 #CJK UNIFIED IDEOGRAPH +0x9778 0x8E0A #CJK UNIFIED IDEOGRAPH +0x9779 0x9065 #CJK UNIFIED IDEOGRAPH +0x977A 0x967D #CJK UNIFIED IDEOGRAPH +0x977B 0x990A #CJK UNIFIED IDEOGRAPH +0x977C 0x617E #CJK UNIFIED IDEOGRAPH +0x977D 0x6291 #CJK UNIFIED IDEOGRAPH +0x977E 0x6B32 #CJK UNIFIED IDEOGRAPH +0x9780 0x6C83 #CJK UNIFIED IDEOGRAPH +0x9781 0x6D74 #CJK UNIFIED IDEOGRAPH +0x9782 0x7FCC #CJK UNIFIED IDEOGRAPH +0x9783 0x7FFC #CJK UNIFIED IDEOGRAPH +0x9784 0x6DC0 #CJK UNIFIED IDEOGRAPH +0x9785 0x7F85 #CJK UNIFIED IDEOGRAPH +0x9786 0x87BA #CJK UNIFIED IDEOGRAPH +0x9787 0x88F8 #CJK UNIFIED IDEOGRAPH +0x9788 0x6765 #CJK UNIFIED IDEOGRAPH +0x9789 0x83B1 #CJK UNIFIED IDEOGRAPH +0x978A 0x983C #CJK UNIFIED IDEOGRAPH +0x978B 0x96F7 #CJK UNIFIED IDEOGRAPH +0x978C 0x6D1B #CJK UNIFIED IDEOGRAPH +0x978D 0x7D61 #CJK UNIFIED IDEOGRAPH +0x978E 0x843D #CJK UNIFIED IDEOGRAPH +0x978F 0x916A #CJK UNIFIED IDEOGRAPH +0x9790 0x4E71 #CJK UNIFIED IDEOGRAPH +0x9791 0x5375 #CJK UNIFIED IDEOGRAPH +0x9792 0x5D50 #CJK UNIFIED IDEOGRAPH +0x9793 0x6B04 #CJK UNIFIED IDEOGRAPH +0x9794 0x6FEB #CJK UNIFIED IDEOGRAPH +0x9795 0x85CD #CJK UNIFIED IDEOGRAPH +0x9796 0x862D #CJK UNIFIED IDEOGRAPH +0x9797 0x89A7 #CJK UNIFIED IDEOGRAPH +0x9798 0x5229 #CJK UNIFIED IDEOGRAPH +0x9799 0x540F #CJK UNIFIED IDEOGRAPH +0x979A 0x5C65 #CJK UNIFIED IDEOGRAPH +0x979B 0x674E #CJK UNIFIED IDEOGRAPH +0x979C 0x68A8 #CJK UNIFIED IDEOGRAPH +0x979D 0x7406 #CJK UNIFIED IDEOGRAPH +0x979E 0x7483 #CJK UNIFIED IDEOGRAPH +0x979F 0x75E2 #CJK UNIFIED IDEOGRAPH +0x97A0 0x88CF #CJK UNIFIED IDEOGRAPH +0x97A1 0x88E1 #CJK UNIFIED IDEOGRAPH +0x97A2 0x91CC #CJK UNIFIED IDEOGRAPH +0x97A3 0x96E2 #CJK UNIFIED IDEOGRAPH +0x97A4 0x9678 #CJK UNIFIED IDEOGRAPH +0x97A5 0x5F8B #CJK UNIFIED IDEOGRAPH +0x97A6 0x7387 #CJK UNIFIED IDEOGRAPH +0x97A7 0x7ACB #CJK UNIFIED IDEOGRAPH +0x97A8 0x844E #CJK UNIFIED IDEOGRAPH +0x97A9 0x63A0 #CJK UNIFIED IDEOGRAPH +0x97AA 0x7565 #CJK UNIFIED IDEOGRAPH +0x97AB 0x5289 #CJK UNIFIED IDEOGRAPH +0x97AC 0x6D41 #CJK UNIFIED IDEOGRAPH +0x97AD 0x6E9C #CJK UNIFIED IDEOGRAPH +0x97AE 0x7409 #CJK UNIFIED IDEOGRAPH +0x97AF 0x7559 #CJK UNIFIED IDEOGRAPH +0x97B0 0x786B #CJK UNIFIED IDEOGRAPH +0x97B1 0x7C92 #CJK UNIFIED IDEOGRAPH +0x97B2 0x9686 #CJK UNIFIED IDEOGRAPH +0x97B3 0x7ADC #CJK UNIFIED IDEOGRAPH +0x97B4 0x9F8D #CJK UNIFIED IDEOGRAPH +0x97B5 0x4FB6 #CJK UNIFIED IDEOGRAPH +0x97B6 0x616E #CJK UNIFIED IDEOGRAPH +0x97B7 0x65C5 #CJK UNIFIED IDEOGRAPH +0x97B8 0x865C #CJK UNIFIED IDEOGRAPH +0x97B9 0x4E86 #CJK UNIFIED IDEOGRAPH +0x97BA 0x4EAE #CJK UNIFIED IDEOGRAPH +0x97BB 0x50DA #CJK UNIFIED IDEOGRAPH +0x97BC 0x4E21 #CJK UNIFIED IDEOGRAPH +0x97BD 0x51CC #CJK UNIFIED IDEOGRAPH +0x97BE 0x5BEE #CJK UNIFIED IDEOGRAPH +0x97BF 0x6599 #CJK UNIFIED IDEOGRAPH +0x97C0 0x6881 #CJK UNIFIED IDEOGRAPH +0x97C1 0x6DBC #CJK UNIFIED IDEOGRAPH +0x97C2 0x731F #CJK UNIFIED IDEOGRAPH +0x97C3 0x7642 #CJK UNIFIED IDEOGRAPH +0x97C4 0x77AD #CJK UNIFIED IDEOGRAPH +0x97C5 0x7A1C #CJK UNIFIED IDEOGRAPH +0x97C6 0x7CE7 #CJK UNIFIED IDEOGRAPH +0x97C7 0x826F #CJK UNIFIED IDEOGRAPH +0x97C8 0x8AD2 #CJK UNIFIED IDEOGRAPH +0x97C9 0x907C #CJK UNIFIED IDEOGRAPH +0x97CA 0x91CF #CJK UNIFIED IDEOGRAPH +0x97CB 0x9675 #CJK UNIFIED IDEOGRAPH +0x97CC 0x9818 #CJK UNIFIED IDEOGRAPH +0x97CD 0x529B #CJK UNIFIED IDEOGRAPH +0x97CE 0x7DD1 #CJK UNIFIED IDEOGRAPH +0x97CF 0x502B #CJK UNIFIED IDEOGRAPH +0x97D0 0x5398 #CJK UNIFIED IDEOGRAPH +0x97D1 0x6797 #CJK UNIFIED IDEOGRAPH +0x97D2 0x6DCB #CJK UNIFIED IDEOGRAPH +0x97D3 0x71D0 #CJK UNIFIED IDEOGRAPH +0x97D4 0x7433 #CJK UNIFIED IDEOGRAPH +0x97D5 0x81E8 #CJK UNIFIED IDEOGRAPH +0x97D6 0x8F2A #CJK UNIFIED IDEOGRAPH +0x97D7 0x96A3 #CJK UNIFIED IDEOGRAPH +0x97D8 0x9C57 #CJK UNIFIED IDEOGRAPH +0x97D9 0x9E9F #CJK UNIFIED IDEOGRAPH +0x97DA 0x7460 #CJK UNIFIED IDEOGRAPH +0x97DB 0x5841 #CJK UNIFIED IDEOGRAPH +0x97DC 0x6D99 #CJK UNIFIED IDEOGRAPH +0x97DD 0x7D2F #CJK UNIFIED IDEOGRAPH +0x97DE 0x985E #CJK UNIFIED IDEOGRAPH +0x97DF 0x4EE4 #CJK UNIFIED IDEOGRAPH +0x97E0 0x4F36 #CJK UNIFIED IDEOGRAPH +0x97E1 0x4F8B #CJK UNIFIED IDEOGRAPH +0x97E2 0x51B7 #CJK UNIFIED IDEOGRAPH +0x97E3 0x52B1 #CJK UNIFIED IDEOGRAPH +0x97E4 0x5DBA #CJK UNIFIED IDEOGRAPH +0x97E5 0x601C #CJK UNIFIED IDEOGRAPH +0x97E6 0x73B2 #CJK UNIFIED IDEOGRAPH +0x97E7 0x793C #CJK UNIFIED IDEOGRAPH +0x97E8 0x82D3 #CJK UNIFIED IDEOGRAPH +0x97E9 0x9234 #CJK UNIFIED IDEOGRAPH +0x97EA 0x96B7 #CJK UNIFIED IDEOGRAPH +0x97EB 0x96F6 #CJK UNIFIED IDEOGRAPH +0x97EC 0x970A #CJK UNIFIED IDEOGRAPH +0x97ED 0x9E97 #CJK UNIFIED IDEOGRAPH +0x97EE 0x9F62 #CJK UNIFIED IDEOGRAPH +0x97EF 0x66A6 #CJK UNIFIED IDEOGRAPH +0x97F0 0x6B74 #CJK UNIFIED IDEOGRAPH +0x97F1 0x5217 #CJK UNIFIED IDEOGRAPH +0x97F2 0x52A3 #CJK UNIFIED IDEOGRAPH +0x97F3 0x70C8 #CJK UNIFIED IDEOGRAPH +0x97F4 0x88C2 #CJK UNIFIED IDEOGRAPH +0x97F5 0x5EC9 #CJK UNIFIED IDEOGRAPH +0x97F6 0x604B #CJK UNIFIED IDEOGRAPH +0x97F7 0x6190 #CJK UNIFIED IDEOGRAPH +0x97F8 0x6F23 #CJK UNIFIED IDEOGRAPH +0x97F9 0x7149 #CJK UNIFIED IDEOGRAPH +0x97FA 0x7C3E #CJK UNIFIED IDEOGRAPH +0x97FB 0x7DF4 #CJK UNIFIED IDEOGRAPH +0x97FC 0x806F #CJK UNIFIED IDEOGRAPH +0x9840 0x84EE #CJK UNIFIED IDEOGRAPH +0x9841 0x9023 #CJK UNIFIED IDEOGRAPH +0x9842 0x932C #CJK UNIFIED IDEOGRAPH +0x9843 0x5442 #CJK UNIFIED IDEOGRAPH +0x9844 0x9B6F #CJK UNIFIED IDEOGRAPH +0x9845 0x6AD3 #CJK UNIFIED IDEOGRAPH +0x9846 0x7089 #CJK UNIFIED IDEOGRAPH +0x9847 0x8CC2 #CJK UNIFIED IDEOGRAPH +0x9848 0x8DEF #CJK UNIFIED IDEOGRAPH +0x9849 0x9732 #CJK UNIFIED IDEOGRAPH +0x984A 0x52B4 #CJK UNIFIED IDEOGRAPH +0x984B 0x5A41 #CJK UNIFIED IDEOGRAPH +0x984C 0x5ECA #CJK UNIFIED IDEOGRAPH +0x984D 0x5F04 #CJK UNIFIED IDEOGRAPH +0x984E 0x6717 #CJK UNIFIED IDEOGRAPH +0x984F 0x697C #CJK UNIFIED IDEOGRAPH +0x9850 0x6994 #CJK UNIFIED IDEOGRAPH +0x9851 0x6D6A #CJK UNIFIED IDEOGRAPH +0x9852 0x6F0F #CJK UNIFIED IDEOGRAPH +0x9853 0x7262 #CJK UNIFIED IDEOGRAPH +0x9854 0x72FC #CJK UNIFIED IDEOGRAPH +0x9855 0x7BED #CJK UNIFIED IDEOGRAPH +0x9856 0x8001 #CJK UNIFIED IDEOGRAPH +0x9857 0x807E #CJK UNIFIED IDEOGRAPH +0x9858 0x874B #CJK UNIFIED IDEOGRAPH +0x9859 0x90CE #CJK UNIFIED IDEOGRAPH +0x985A 0x516D #CJK UNIFIED IDEOGRAPH +0x985B 0x9E93 #CJK UNIFIED IDEOGRAPH +0x985C 0x7984 #CJK UNIFIED IDEOGRAPH +0x985D 0x808B #CJK UNIFIED IDEOGRAPH +0x985E 0x9332 #CJK UNIFIED IDEOGRAPH +0x985F 0x8AD6 #CJK UNIFIED IDEOGRAPH +0x9860 0x502D #CJK UNIFIED IDEOGRAPH +0x9861 0x548C #CJK UNIFIED IDEOGRAPH +0x9862 0x8A71 #CJK UNIFIED IDEOGRAPH +0x9863 0x6B6A #CJK UNIFIED IDEOGRAPH +0x9864 0x8CC4 #CJK UNIFIED IDEOGRAPH +0x9865 0x8107 #CJK UNIFIED IDEOGRAPH +0x9866 0x60D1 #CJK UNIFIED IDEOGRAPH +0x9867 0x67A0 #CJK UNIFIED IDEOGRAPH +0x9868 0x9DF2 #CJK UNIFIED IDEOGRAPH +0x9869 0x4E99 #CJK UNIFIED IDEOGRAPH +0x986A 0x4E98 #CJK UNIFIED IDEOGRAPH +0x986B 0x9C10 #CJK UNIFIED IDEOGRAPH +0x986C 0x8A6B #CJK UNIFIED IDEOGRAPH +0x986D 0x85C1 #CJK UNIFIED IDEOGRAPH +0x986E 0x8568 #CJK UNIFIED IDEOGRAPH +0x986F 0x6900 #CJK UNIFIED IDEOGRAPH +0x9870 0x6E7E #CJK UNIFIED IDEOGRAPH +0x9871 0x7897 #CJK UNIFIED IDEOGRAPH +0x9872 0x8155 #CJK UNIFIED IDEOGRAPH +0x989F 0x5F0C #CJK UNIFIED IDEOGRAPH +0x98A0 0x4E10 #CJK UNIFIED IDEOGRAPH +0x98A1 0x4E15 #CJK UNIFIED IDEOGRAPH +0x98A2 0x4E2A #CJK UNIFIED IDEOGRAPH +0x98A3 0x4E31 #CJK UNIFIED IDEOGRAPH +0x98A4 0x4E36 #CJK UNIFIED IDEOGRAPH +0x98A5 0x4E3C #CJK UNIFIED IDEOGRAPH +0x98A6 0x4E3F #CJK UNIFIED IDEOGRAPH +0x98A7 0x4E42 #CJK UNIFIED IDEOGRAPH +0x98A8 0x4E56 #CJK UNIFIED IDEOGRAPH +0x98A9 0x4E58 #CJK UNIFIED IDEOGRAPH +0x98AA 0x4E82 #CJK UNIFIED IDEOGRAPH +0x98AB 0x4E85 #CJK UNIFIED IDEOGRAPH +0x98AC 0x8C6B #CJK UNIFIED IDEOGRAPH +0x98AD 0x4E8A #CJK UNIFIED IDEOGRAPH +0x98AE 0x8212 #CJK UNIFIED IDEOGRAPH +0x98AF 0x5F0D #CJK UNIFIED IDEOGRAPH +0x98B0 0x4E8E #CJK UNIFIED IDEOGRAPH +0x98B1 0x4E9E #CJK UNIFIED IDEOGRAPH +0x98B2 0x4E9F #CJK UNIFIED IDEOGRAPH +0x98B3 0x4EA0 #CJK UNIFIED IDEOGRAPH +0x98B4 0x4EA2 #CJK UNIFIED IDEOGRAPH +0x98B5 0x4EB0 #CJK UNIFIED IDEOGRAPH +0x98B6 0x4EB3 #CJK UNIFIED IDEOGRAPH +0x98B7 0x4EB6 #CJK UNIFIED IDEOGRAPH +0x98B8 0x4ECE #CJK UNIFIED IDEOGRAPH +0x98B9 0x4ECD #CJK UNIFIED IDEOGRAPH +0x98BA 0x4EC4 #CJK UNIFIED IDEOGRAPH +0x98BB 0x4EC6 #CJK UNIFIED IDEOGRAPH +0x98BC 0x4EC2 #CJK UNIFIED IDEOGRAPH +0x98BD 0x4ED7 #CJK UNIFIED IDEOGRAPH +0x98BE 0x4EDE #CJK UNIFIED IDEOGRAPH +0x98BF 0x4EED #CJK UNIFIED IDEOGRAPH +0x98C0 0x4EDF #CJK UNIFIED IDEOGRAPH +0x98C1 0x4EF7 #CJK UNIFIED IDEOGRAPH +0x98C2 0x4F09 #CJK UNIFIED IDEOGRAPH +0x98C3 0x4F5A #CJK UNIFIED IDEOGRAPH +0x98C4 0x4F30 #CJK UNIFIED IDEOGRAPH +0x98C5 0x4F5B #CJK UNIFIED IDEOGRAPH +0x98C6 0x4F5D #CJK UNIFIED IDEOGRAPH +0x98C7 0x4F57 #CJK UNIFIED IDEOGRAPH +0x98C8 0x4F47 #CJK UNIFIED IDEOGRAPH +0x98C9 0x4F76 #CJK UNIFIED IDEOGRAPH +0x98CA 0x4F88 #CJK UNIFIED IDEOGRAPH +0x98CB 0x4F8F #CJK UNIFIED IDEOGRAPH +0x98CC 0x4F98 #CJK UNIFIED IDEOGRAPH +0x98CD 0x4F7B #CJK UNIFIED IDEOGRAPH +0x98CE 0x4F69 #CJK UNIFIED IDEOGRAPH +0x98CF 0x4F70 #CJK UNIFIED IDEOGRAPH +0x98D0 0x4F91 #CJK UNIFIED IDEOGRAPH +0x98D1 0x4F6F #CJK UNIFIED IDEOGRAPH +0x98D2 0x4F86 #CJK UNIFIED IDEOGRAPH +0x98D3 0x4F96 #CJK UNIFIED IDEOGRAPH +0x98D4 0x5118 #CJK UNIFIED IDEOGRAPH +0x98D5 0x4FD4 #CJK UNIFIED IDEOGRAPH +0x98D6 0x4FDF #CJK UNIFIED IDEOGRAPH +0x98D7 0x4FCE #CJK UNIFIED IDEOGRAPH +0x98D8 0x4FD8 #CJK UNIFIED IDEOGRAPH +0x98D9 0x4FDB #CJK UNIFIED IDEOGRAPH +0x98DA 0x4FD1 #CJK UNIFIED IDEOGRAPH +0x98DB 0x4FDA #CJK UNIFIED IDEOGRAPH +0x98DC 0x4FD0 #CJK UNIFIED IDEOGRAPH +0x98DD 0x4FE4 #CJK UNIFIED IDEOGRAPH +0x98DE 0x4FE5 #CJK UNIFIED IDEOGRAPH +0x98DF 0x501A #CJK UNIFIED IDEOGRAPH +0x98E0 0x5028 #CJK UNIFIED IDEOGRAPH +0x98E1 0x5014 #CJK UNIFIED IDEOGRAPH +0x98E2 0x502A #CJK UNIFIED IDEOGRAPH +0x98E3 0x5025 #CJK UNIFIED IDEOGRAPH +0x98E4 0x5005 #CJK UNIFIED IDEOGRAPH +0x98E5 0x4F1C #CJK UNIFIED IDEOGRAPH +0x98E6 0x4FF6 #CJK UNIFIED IDEOGRAPH +0x98E7 0x5021 #CJK UNIFIED IDEOGRAPH +0x98E8 0x5029 #CJK UNIFIED IDEOGRAPH +0x98E9 0x502C #CJK UNIFIED IDEOGRAPH +0x98EA 0x4FFE #CJK UNIFIED IDEOGRAPH +0x98EB 0x4FEF #CJK UNIFIED IDEOGRAPH +0x98EC 0x5011 #CJK UNIFIED IDEOGRAPH +0x98ED 0x5006 #CJK UNIFIED IDEOGRAPH +0x98EE 0x5043 #CJK UNIFIED IDEOGRAPH +0x98EF 0x5047 #CJK UNIFIED IDEOGRAPH +0x98F0 0x6703 #CJK UNIFIED IDEOGRAPH +0x98F1 0x5055 #CJK UNIFIED IDEOGRAPH +0x98F2 0x5050 #CJK UNIFIED IDEOGRAPH +0x98F3 0x5048 #CJK UNIFIED IDEOGRAPH +0x98F4 0x505A #CJK UNIFIED IDEOGRAPH +0x98F5 0x5056 #CJK UNIFIED IDEOGRAPH +0x98F6 0x506C #CJK UNIFIED IDEOGRAPH +0x98F7 0x5078 #CJK UNIFIED IDEOGRAPH +0x98F8 0x5080 #CJK UNIFIED IDEOGRAPH +0x98F9 0x509A #CJK UNIFIED IDEOGRAPH +0x98FA 0x5085 #CJK UNIFIED IDEOGRAPH +0x98FB 0x50B4 #CJK UNIFIED IDEOGRAPH +0x98FC 0x50B2 #CJK UNIFIED IDEOGRAPH +0x9940 0x50C9 #CJK UNIFIED IDEOGRAPH +0x9941 0x50CA #CJK UNIFIED IDEOGRAPH +0x9942 0x50B3 #CJK UNIFIED IDEOGRAPH +0x9943 0x50C2 #CJK UNIFIED IDEOGRAPH +0x9944 0x50D6 #CJK UNIFIED IDEOGRAPH +0x9945 0x50DE #CJK UNIFIED IDEOGRAPH +0x9946 0x50E5 #CJK UNIFIED IDEOGRAPH +0x9947 0x50ED #CJK UNIFIED IDEOGRAPH +0x9948 0x50E3 #CJK UNIFIED IDEOGRAPH +0x9949 0x50EE #CJK UNIFIED IDEOGRAPH +0x994A 0x50F9 #CJK UNIFIED IDEOGRAPH +0x994B 0x50F5 #CJK UNIFIED IDEOGRAPH +0x994C 0x5109 #CJK UNIFIED IDEOGRAPH +0x994D 0x5101 #CJK UNIFIED IDEOGRAPH +0x994E 0x5102 #CJK UNIFIED IDEOGRAPH +0x994F 0x5116 #CJK UNIFIED IDEOGRAPH +0x9950 0x5115 #CJK UNIFIED IDEOGRAPH +0x9951 0x5114 #CJK UNIFIED IDEOGRAPH +0x9952 0x511A #CJK UNIFIED IDEOGRAPH +0x9953 0x5121 #CJK UNIFIED IDEOGRAPH +0x9954 0x513A #CJK UNIFIED IDEOGRAPH +0x9955 0x5137 #CJK UNIFIED IDEOGRAPH +0x9956 0x513C #CJK UNIFIED IDEOGRAPH +0x9957 0x513B #CJK UNIFIED IDEOGRAPH +0x9958 0x513F #CJK UNIFIED IDEOGRAPH +0x9959 0x5140 #CJK UNIFIED IDEOGRAPH +0x995A 0x5152 #CJK UNIFIED IDEOGRAPH +0x995B 0x514C #CJK UNIFIED IDEOGRAPH +0x995C 0x5154 #CJK UNIFIED IDEOGRAPH +0x995D 0x5162 #CJK UNIFIED IDEOGRAPH +0x995E 0x7AF8 #CJK UNIFIED IDEOGRAPH +0x995F 0x5169 #CJK UNIFIED IDEOGRAPH +0x9960 0x516A #CJK UNIFIED IDEOGRAPH +0x9961 0x516E #CJK UNIFIED IDEOGRAPH +0x9962 0x5180 #CJK UNIFIED IDEOGRAPH +0x9963 0x5182 #CJK UNIFIED IDEOGRAPH +0x9964 0x56D8 #CJK UNIFIED IDEOGRAPH +0x9965 0x518C #CJK UNIFIED IDEOGRAPH +0x9966 0x5189 #CJK UNIFIED IDEOGRAPH +0x9967 0x518F #CJK UNIFIED IDEOGRAPH +0x9968 0x5191 #CJK UNIFIED IDEOGRAPH +0x9969 0x5193 #CJK UNIFIED IDEOGRAPH +0x996A 0x5195 #CJK UNIFIED IDEOGRAPH +0x996B 0x5196 #CJK UNIFIED IDEOGRAPH +0x996C 0x51A4 #CJK UNIFIED IDEOGRAPH +0x996D 0x51A6 #CJK UNIFIED IDEOGRAPH +0x996E 0x51A2 #CJK UNIFIED IDEOGRAPH +0x996F 0x51A9 #CJK UNIFIED IDEOGRAPH +0x9970 0x51AA #CJK UNIFIED IDEOGRAPH +0x9971 0x51AB #CJK UNIFIED IDEOGRAPH +0x9972 0x51B3 #CJK UNIFIED IDEOGRAPH +0x9973 0x51B1 #CJK UNIFIED IDEOGRAPH +0x9974 0x51B2 #CJK UNIFIED IDEOGRAPH +0x9975 0x51B0 #CJK UNIFIED IDEOGRAPH +0x9976 0x51B5 #CJK UNIFIED IDEOGRAPH +0x9977 0x51BD #CJK UNIFIED IDEOGRAPH +0x9978 0x51C5 #CJK UNIFIED IDEOGRAPH +0x9979 0x51C9 #CJK UNIFIED IDEOGRAPH +0x997A 0x51DB #CJK UNIFIED IDEOGRAPH +0x997B 0x51E0 #CJK UNIFIED IDEOGRAPH +0x997C 0x8655 #CJK UNIFIED IDEOGRAPH +0x997D 0x51E9 #CJK UNIFIED IDEOGRAPH +0x997E 0x51ED #CJK UNIFIED IDEOGRAPH +0x9980 0x51F0 #CJK UNIFIED IDEOGRAPH +0x9981 0x51F5 #CJK UNIFIED IDEOGRAPH +0x9982 0x51FE #CJK UNIFIED IDEOGRAPH +0x9983 0x5204 #CJK UNIFIED IDEOGRAPH +0x9984 0x520B #CJK UNIFIED IDEOGRAPH +0x9985 0x5214 #CJK UNIFIED IDEOGRAPH +0x9986 0x520E #CJK UNIFIED IDEOGRAPH +0x9987 0x5227 #CJK UNIFIED IDEOGRAPH +0x9988 0x522A #CJK UNIFIED IDEOGRAPH +0x9989 0x522E #CJK UNIFIED IDEOGRAPH +0x998A 0x5233 #CJK UNIFIED IDEOGRAPH +0x998B 0x5239 #CJK UNIFIED IDEOGRAPH +0x998C 0x524F #CJK UNIFIED IDEOGRAPH +0x998D 0x5244 #CJK UNIFIED IDEOGRAPH +0x998E 0x524B #CJK UNIFIED IDEOGRAPH +0x998F 0x524C #CJK UNIFIED IDEOGRAPH +0x9990 0x525E #CJK UNIFIED IDEOGRAPH +0x9991 0x5254 #CJK UNIFIED IDEOGRAPH +0x9992 0x526A #CJK UNIFIED IDEOGRAPH +0x9993 0x5274 #CJK UNIFIED IDEOGRAPH +0x9994 0x5269 #CJK UNIFIED IDEOGRAPH +0x9995 0x5273 #CJK UNIFIED IDEOGRAPH +0x9996 0x527F #CJK UNIFIED IDEOGRAPH +0x9997 0x527D #CJK UNIFIED IDEOGRAPH +0x9998 0x528D #CJK UNIFIED IDEOGRAPH +0x9999 0x5294 #CJK UNIFIED IDEOGRAPH +0x999A 0x5292 #CJK UNIFIED IDEOGRAPH +0x999B 0x5271 #CJK UNIFIED IDEOGRAPH +0x999C 0x5288 #CJK UNIFIED IDEOGRAPH +0x999D 0x5291 #CJK UNIFIED IDEOGRAPH +0x999E 0x8FA8 #CJK UNIFIED IDEOGRAPH +0x999F 0x8FA7 #CJK UNIFIED IDEOGRAPH +0x99A0 0x52AC #CJK UNIFIED IDEOGRAPH +0x99A1 0x52AD #CJK UNIFIED IDEOGRAPH +0x99A2 0x52BC #CJK UNIFIED IDEOGRAPH +0x99A3 0x52B5 #CJK UNIFIED IDEOGRAPH +0x99A4 0x52C1 #CJK UNIFIED IDEOGRAPH +0x99A5 0x52CD #CJK UNIFIED IDEOGRAPH +0x99A6 0x52D7 #CJK UNIFIED IDEOGRAPH +0x99A7 0x52DE #CJK UNIFIED IDEOGRAPH +0x99A8 0x52E3 #CJK UNIFIED IDEOGRAPH +0x99A9 0x52E6 #CJK UNIFIED IDEOGRAPH +0x99AA 0x98ED #CJK UNIFIED IDEOGRAPH +0x99AB 0x52E0 #CJK UNIFIED IDEOGRAPH +0x99AC 0x52F3 #CJK UNIFIED IDEOGRAPH +0x99AD 0x52F5 #CJK UNIFIED IDEOGRAPH +0x99AE 0x52F8 #CJK UNIFIED IDEOGRAPH +0x99AF 0x52F9 #CJK UNIFIED IDEOGRAPH +0x99B0 0x5306 #CJK UNIFIED IDEOGRAPH +0x99B1 0x5308 #CJK UNIFIED IDEOGRAPH +0x99B2 0x7538 #CJK UNIFIED IDEOGRAPH +0x99B3 0x530D #CJK UNIFIED IDEOGRAPH +0x99B4 0x5310 #CJK UNIFIED IDEOGRAPH +0x99B5 0x530F #CJK UNIFIED IDEOGRAPH +0x99B6 0x5315 #CJK UNIFIED IDEOGRAPH +0x99B7 0x531A #CJK UNIFIED IDEOGRAPH +0x99B8 0x5323 #CJK UNIFIED IDEOGRAPH +0x99B9 0x532F #CJK UNIFIED IDEOGRAPH +0x99BA 0x5331 #CJK UNIFIED IDEOGRAPH +0x99BB 0x5333 #CJK UNIFIED IDEOGRAPH +0x99BC 0x5338 #CJK UNIFIED IDEOGRAPH +0x99BD 0x5340 #CJK UNIFIED IDEOGRAPH +0x99BE 0x5346 #CJK UNIFIED IDEOGRAPH +0x99BF 0x5345 #CJK UNIFIED IDEOGRAPH +0x99C0 0x4E17 #CJK UNIFIED IDEOGRAPH +0x99C1 0x5349 #CJK UNIFIED IDEOGRAPH +0x99C2 0x534D #CJK UNIFIED IDEOGRAPH +0x99C3 0x51D6 #CJK UNIFIED IDEOGRAPH +0x99C4 0x535E #CJK UNIFIED IDEOGRAPH +0x99C5 0x5369 #CJK UNIFIED IDEOGRAPH +0x99C6 0x536E #CJK UNIFIED IDEOGRAPH +0x99C7 0x5918 #CJK UNIFIED IDEOGRAPH +0x99C8 0x537B #CJK UNIFIED IDEOGRAPH +0x99C9 0x5377 #CJK UNIFIED IDEOGRAPH +0x99CA 0x5382 #CJK UNIFIED IDEOGRAPH +0x99CB 0x5396 #CJK UNIFIED IDEOGRAPH +0x99CC 0x53A0 #CJK UNIFIED IDEOGRAPH +0x99CD 0x53A6 #CJK UNIFIED IDEOGRAPH +0x99CE 0x53A5 #CJK UNIFIED IDEOGRAPH +0x99CF 0x53AE #CJK UNIFIED IDEOGRAPH +0x99D0 0x53B0 #CJK UNIFIED IDEOGRAPH +0x99D1 0x53B6 #CJK UNIFIED IDEOGRAPH +0x99D2 0x53C3 #CJK UNIFIED IDEOGRAPH +0x99D3 0x7C12 #CJK UNIFIED IDEOGRAPH +0x99D4 0x96D9 #CJK UNIFIED IDEOGRAPH +0x99D5 0x53DF #CJK UNIFIED IDEOGRAPH +0x99D6 0x66FC #CJK UNIFIED IDEOGRAPH +0x99D7 0x71EE #CJK UNIFIED IDEOGRAPH +0x99D8 0x53EE #CJK UNIFIED IDEOGRAPH +0x99D9 0x53E8 #CJK UNIFIED IDEOGRAPH +0x99DA 0x53ED #CJK UNIFIED IDEOGRAPH +0x99DB 0x53FA #CJK UNIFIED IDEOGRAPH +0x99DC 0x5401 #CJK UNIFIED IDEOGRAPH +0x99DD 0x543D #CJK UNIFIED IDEOGRAPH +0x99DE 0x5440 #CJK UNIFIED IDEOGRAPH +0x99DF 0x542C #CJK UNIFIED IDEOGRAPH +0x99E0 0x542D #CJK UNIFIED IDEOGRAPH +0x99E1 0x543C #CJK UNIFIED IDEOGRAPH +0x99E2 0x542E #CJK UNIFIED IDEOGRAPH +0x99E3 0x5436 #CJK UNIFIED IDEOGRAPH +0x99E4 0x5429 #CJK UNIFIED IDEOGRAPH +0x99E5 0x541D #CJK UNIFIED IDEOGRAPH +0x99E6 0x544E #CJK UNIFIED IDEOGRAPH +0x99E7 0x548F #CJK UNIFIED IDEOGRAPH +0x99E8 0x5475 #CJK UNIFIED IDEOGRAPH +0x99E9 0x548E #CJK UNIFIED IDEOGRAPH +0x99EA 0x545F #CJK UNIFIED IDEOGRAPH +0x99EB 0x5471 #CJK UNIFIED IDEOGRAPH +0x99EC 0x5477 #CJK UNIFIED IDEOGRAPH +0x99ED 0x5470 #CJK UNIFIED IDEOGRAPH +0x99EE 0x5492 #CJK UNIFIED IDEOGRAPH +0x99EF 0x547B #CJK UNIFIED IDEOGRAPH +0x99F0 0x5480 #CJK UNIFIED IDEOGRAPH +0x99F1 0x5476 #CJK UNIFIED IDEOGRAPH +0x99F2 0x5484 #CJK UNIFIED IDEOGRAPH +0x99F3 0x5490 #CJK UNIFIED IDEOGRAPH +0x99F4 0x5486 #CJK UNIFIED IDEOGRAPH +0x99F5 0x54C7 #CJK UNIFIED IDEOGRAPH +0x99F6 0x54A2 #CJK UNIFIED IDEOGRAPH +0x99F7 0x54B8 #CJK UNIFIED IDEOGRAPH +0x99F8 0x54A5 #CJK UNIFIED IDEOGRAPH +0x99F9 0x54AC #CJK UNIFIED IDEOGRAPH +0x99FA 0x54C4 #CJK UNIFIED IDEOGRAPH +0x99FB 0x54C8 #CJK UNIFIED IDEOGRAPH +0x99FC 0x54A8 #CJK UNIFIED IDEOGRAPH +0x9A40 0x54AB #CJK UNIFIED IDEOGRAPH +0x9A41 0x54C2 #CJK UNIFIED IDEOGRAPH +0x9A42 0x54A4 #CJK UNIFIED IDEOGRAPH +0x9A43 0x54BE #CJK UNIFIED IDEOGRAPH +0x9A44 0x54BC #CJK UNIFIED IDEOGRAPH +0x9A45 0x54D8 #CJK UNIFIED IDEOGRAPH +0x9A46 0x54E5 #CJK UNIFIED IDEOGRAPH +0x9A47 0x54E6 #CJK UNIFIED IDEOGRAPH +0x9A48 0x550F #CJK UNIFIED IDEOGRAPH +0x9A49 0x5514 #CJK UNIFIED IDEOGRAPH +0x9A4A 0x54FD #CJK UNIFIED IDEOGRAPH +0x9A4B 0x54EE #CJK UNIFIED IDEOGRAPH +0x9A4C 0x54ED #CJK UNIFIED IDEOGRAPH +0x9A4D 0x54FA #CJK UNIFIED IDEOGRAPH +0x9A4E 0x54E2 #CJK UNIFIED IDEOGRAPH +0x9A4F 0x5539 #CJK UNIFIED IDEOGRAPH +0x9A50 0x5540 #CJK UNIFIED IDEOGRAPH +0x9A51 0x5563 #CJK UNIFIED IDEOGRAPH +0x9A52 0x554C #CJK UNIFIED IDEOGRAPH +0x9A53 0x552E #CJK UNIFIED IDEOGRAPH +0x9A54 0x555C #CJK UNIFIED IDEOGRAPH +0x9A55 0x5545 #CJK UNIFIED IDEOGRAPH +0x9A56 0x5556 #CJK UNIFIED IDEOGRAPH +0x9A57 0x5557 #CJK UNIFIED IDEOGRAPH +0x9A58 0x5538 #CJK UNIFIED IDEOGRAPH +0x9A59 0x5533 #CJK UNIFIED IDEOGRAPH +0x9A5A 0x555D #CJK UNIFIED IDEOGRAPH +0x9A5B 0x5599 #CJK UNIFIED IDEOGRAPH +0x9A5C 0x5580 #CJK UNIFIED IDEOGRAPH +0x9A5D 0x54AF #CJK UNIFIED IDEOGRAPH +0x9A5E 0x558A #CJK UNIFIED IDEOGRAPH +0x9A5F 0x559F #CJK UNIFIED IDEOGRAPH +0x9A60 0x557B #CJK UNIFIED IDEOGRAPH +0x9A61 0x557E #CJK UNIFIED IDEOGRAPH +0x9A62 0x5598 #CJK UNIFIED IDEOGRAPH +0x9A63 0x559E #CJK UNIFIED IDEOGRAPH +0x9A64 0x55AE #CJK UNIFIED IDEOGRAPH +0x9A65 0x557C #CJK UNIFIED IDEOGRAPH +0x9A66 0x5583 #CJK UNIFIED IDEOGRAPH +0x9A67 0x55A9 #CJK UNIFIED IDEOGRAPH +0x9A68 0x5587 #CJK UNIFIED IDEOGRAPH +0x9A69 0x55A8 #CJK UNIFIED IDEOGRAPH +0x9A6A 0x55DA #CJK UNIFIED IDEOGRAPH +0x9A6B 0x55C5 #CJK UNIFIED IDEOGRAPH +0x9A6C 0x55DF #CJK UNIFIED IDEOGRAPH +0x9A6D 0x55C4 #CJK UNIFIED IDEOGRAPH +0x9A6E 0x55DC #CJK UNIFIED IDEOGRAPH +0x9A6F 0x55E4 #CJK UNIFIED IDEOGRAPH +0x9A70 0x55D4 #CJK UNIFIED IDEOGRAPH +0x9A71 0x5614 #CJK UNIFIED IDEOGRAPH +0x9A72 0x55F7 #CJK UNIFIED IDEOGRAPH +0x9A73 0x5616 #CJK UNIFIED IDEOGRAPH +0x9A74 0x55FE #CJK UNIFIED IDEOGRAPH +0x9A75 0x55FD #CJK UNIFIED IDEOGRAPH +0x9A76 0x561B #CJK UNIFIED IDEOGRAPH +0x9A77 0x55F9 #CJK UNIFIED IDEOGRAPH +0x9A78 0x564E #CJK UNIFIED IDEOGRAPH +0x9A79 0x5650 #CJK UNIFIED IDEOGRAPH +0x9A7A 0x71DF #CJK UNIFIED IDEOGRAPH +0x9A7B 0x5634 #CJK UNIFIED IDEOGRAPH +0x9A7C 0x5636 #CJK UNIFIED IDEOGRAPH +0x9A7D 0x5632 #CJK UNIFIED IDEOGRAPH +0x9A7E 0x5638 #CJK UNIFIED IDEOGRAPH +0x9A80 0x566B #CJK UNIFIED IDEOGRAPH +0x9A81 0x5664 #CJK UNIFIED IDEOGRAPH +0x9A82 0x562F #CJK UNIFIED IDEOGRAPH +0x9A83 0x566C #CJK UNIFIED IDEOGRAPH +0x9A84 0x566A #CJK UNIFIED IDEOGRAPH +0x9A85 0x5686 #CJK UNIFIED IDEOGRAPH +0x9A86 0x5680 #CJK UNIFIED IDEOGRAPH +0x9A87 0x568A #CJK UNIFIED IDEOGRAPH +0x9A88 0x56A0 #CJK UNIFIED IDEOGRAPH +0x9A89 0x5694 #CJK UNIFIED IDEOGRAPH +0x9A8A 0x568F #CJK UNIFIED IDEOGRAPH +0x9A8B 0x56A5 #CJK UNIFIED IDEOGRAPH +0x9A8C 0x56AE #CJK UNIFIED IDEOGRAPH +0x9A8D 0x56B6 #CJK UNIFIED IDEOGRAPH +0x9A8E 0x56B4 #CJK UNIFIED IDEOGRAPH +0x9A8F 0x56C2 #CJK UNIFIED IDEOGRAPH +0x9A90 0x56BC #CJK UNIFIED IDEOGRAPH +0x9A91 0x56C1 #CJK UNIFIED IDEOGRAPH +0x9A92 0x56C3 #CJK UNIFIED IDEOGRAPH +0x9A93 0x56C0 #CJK UNIFIED IDEOGRAPH +0x9A94 0x56C8 #CJK UNIFIED IDEOGRAPH +0x9A95 0x56CE #CJK UNIFIED IDEOGRAPH +0x9A96 0x56D1 #CJK UNIFIED IDEOGRAPH +0x9A97 0x56D3 #CJK UNIFIED IDEOGRAPH +0x9A98 0x56D7 #CJK UNIFIED IDEOGRAPH +0x9A99 0x56EE #CJK UNIFIED IDEOGRAPH +0x9A9A 0x56F9 #CJK UNIFIED IDEOGRAPH +0x9A9B 0x5700 #CJK UNIFIED IDEOGRAPH +0x9A9C 0x56FF #CJK UNIFIED IDEOGRAPH +0x9A9D 0x5704 #CJK UNIFIED IDEOGRAPH +0x9A9E 0x5709 #CJK UNIFIED IDEOGRAPH +0x9A9F 0x5708 #CJK UNIFIED IDEOGRAPH +0x9AA0 0x570B #CJK UNIFIED IDEOGRAPH +0x9AA1 0x570D #CJK UNIFIED IDEOGRAPH +0x9AA2 0x5713 #CJK UNIFIED IDEOGRAPH +0x9AA3 0x5718 #CJK UNIFIED IDEOGRAPH +0x9AA4 0x5716 #CJK UNIFIED IDEOGRAPH +0x9AA5 0x55C7 #CJK UNIFIED IDEOGRAPH +0x9AA6 0x571C #CJK UNIFIED IDEOGRAPH +0x9AA7 0x5726 #CJK UNIFIED IDEOGRAPH +0x9AA8 0x5737 #CJK UNIFIED IDEOGRAPH +0x9AA9 0x5738 #CJK UNIFIED IDEOGRAPH +0x9AAA 0x574E #CJK UNIFIED IDEOGRAPH +0x9AAB 0x573B #CJK UNIFIED IDEOGRAPH +0x9AAC 0x5740 #CJK UNIFIED IDEOGRAPH +0x9AAD 0x574F #CJK UNIFIED IDEOGRAPH +0x9AAE 0x5769 #CJK UNIFIED IDEOGRAPH +0x9AAF 0x57C0 #CJK UNIFIED IDEOGRAPH +0x9AB0 0x5788 #CJK UNIFIED IDEOGRAPH +0x9AB1 0x5761 #CJK UNIFIED IDEOGRAPH +0x9AB2 0x577F #CJK UNIFIED IDEOGRAPH +0x9AB3 0x5789 #CJK UNIFIED IDEOGRAPH +0x9AB4 0x5793 #CJK UNIFIED IDEOGRAPH +0x9AB5 0x57A0 #CJK UNIFIED IDEOGRAPH +0x9AB6 0x57B3 #CJK UNIFIED IDEOGRAPH +0x9AB7 0x57A4 #CJK UNIFIED IDEOGRAPH +0x9AB8 0x57AA #CJK UNIFIED IDEOGRAPH +0x9AB9 0x57B0 #CJK UNIFIED IDEOGRAPH +0x9ABA 0x57C3 #CJK UNIFIED IDEOGRAPH +0x9ABB 0x57C6 #CJK UNIFIED IDEOGRAPH +0x9ABC 0x57D4 #CJK UNIFIED IDEOGRAPH +0x9ABD 0x57D2 #CJK UNIFIED IDEOGRAPH +0x9ABE 0x57D3 #CJK UNIFIED IDEOGRAPH +0x9ABF 0x580A #CJK UNIFIED IDEOGRAPH +0x9AC0 0x57D6 #CJK UNIFIED IDEOGRAPH +0x9AC1 0x57E3 #CJK UNIFIED IDEOGRAPH +0x9AC2 0x580B #CJK UNIFIED IDEOGRAPH +0x9AC3 0x5819 #CJK UNIFIED IDEOGRAPH +0x9AC4 0x581D #CJK UNIFIED IDEOGRAPH +0x9AC5 0x5872 #CJK UNIFIED IDEOGRAPH +0x9AC6 0x5821 #CJK UNIFIED IDEOGRAPH +0x9AC7 0x5862 #CJK UNIFIED IDEOGRAPH +0x9AC8 0x584B #CJK UNIFIED IDEOGRAPH +0x9AC9 0x5870 #CJK UNIFIED IDEOGRAPH +0x9ACA 0x6BC0 #CJK UNIFIED IDEOGRAPH +0x9ACB 0x5852 #CJK UNIFIED IDEOGRAPH +0x9ACC 0x583D #CJK UNIFIED IDEOGRAPH +0x9ACD 0x5879 #CJK UNIFIED IDEOGRAPH +0x9ACE 0x5885 #CJK UNIFIED IDEOGRAPH +0x9ACF 0x58B9 #CJK UNIFIED IDEOGRAPH +0x9AD0 0x589F #CJK UNIFIED IDEOGRAPH +0x9AD1 0x58AB #CJK UNIFIED IDEOGRAPH +0x9AD2 0x58BA #CJK UNIFIED IDEOGRAPH +0x9AD3 0x58DE #CJK UNIFIED IDEOGRAPH +0x9AD4 0x58BB #CJK UNIFIED IDEOGRAPH +0x9AD5 0x58B8 #CJK UNIFIED IDEOGRAPH +0x9AD6 0x58AE #CJK UNIFIED IDEOGRAPH +0x9AD7 0x58C5 #CJK UNIFIED IDEOGRAPH +0x9AD8 0x58D3 #CJK UNIFIED IDEOGRAPH +0x9AD9 0x58D1 #CJK UNIFIED IDEOGRAPH +0x9ADA 0x58D7 #CJK UNIFIED IDEOGRAPH +0x9ADB 0x58D9 #CJK UNIFIED IDEOGRAPH +0x9ADC 0x58D8 #CJK UNIFIED IDEOGRAPH +0x9ADD 0x58E5 #CJK UNIFIED IDEOGRAPH +0x9ADE 0x58DC #CJK UNIFIED IDEOGRAPH +0x9ADF 0x58E4 #CJK UNIFIED IDEOGRAPH +0x9AE0 0x58DF #CJK UNIFIED IDEOGRAPH +0x9AE1 0x58EF #CJK UNIFIED IDEOGRAPH +0x9AE2 0x58FA #CJK UNIFIED IDEOGRAPH +0x9AE3 0x58F9 #CJK UNIFIED IDEOGRAPH +0x9AE4 0x58FB #CJK UNIFIED IDEOGRAPH +0x9AE5 0x58FC #CJK UNIFIED IDEOGRAPH +0x9AE6 0x58FD #CJK UNIFIED IDEOGRAPH +0x9AE7 0x5902 #CJK UNIFIED IDEOGRAPH +0x9AE8 0x590A #CJK UNIFIED IDEOGRAPH +0x9AE9 0x5910 #CJK UNIFIED IDEOGRAPH +0x9AEA 0x591B #CJK UNIFIED IDEOGRAPH +0x9AEB 0x68A6 #CJK UNIFIED IDEOGRAPH +0x9AEC 0x5925 #CJK UNIFIED IDEOGRAPH +0x9AED 0x592C #CJK UNIFIED IDEOGRAPH +0x9AEE 0x592D #CJK UNIFIED IDEOGRAPH +0x9AEF 0x5932 #CJK UNIFIED IDEOGRAPH +0x9AF0 0x5938 #CJK UNIFIED IDEOGRAPH +0x9AF1 0x593E #CJK UNIFIED IDEOGRAPH +0x9AF2 0x7AD2 #CJK UNIFIED IDEOGRAPH +0x9AF3 0x5955 #CJK UNIFIED IDEOGRAPH +0x9AF4 0x5950 #CJK UNIFIED IDEOGRAPH +0x9AF5 0x594E #CJK UNIFIED IDEOGRAPH +0x9AF6 0x595A #CJK UNIFIED IDEOGRAPH +0x9AF7 0x5958 #CJK UNIFIED IDEOGRAPH +0x9AF8 0x5962 #CJK UNIFIED IDEOGRAPH +0x9AF9 0x5960 #CJK UNIFIED IDEOGRAPH +0x9AFA 0x5967 #CJK UNIFIED IDEOGRAPH +0x9AFB 0x596C #CJK UNIFIED IDEOGRAPH +0x9AFC 0x5969 #CJK UNIFIED IDEOGRAPH +0x9B40 0x5978 #CJK UNIFIED IDEOGRAPH +0x9B41 0x5981 #CJK UNIFIED IDEOGRAPH +0x9B42 0x599D #CJK UNIFIED IDEOGRAPH +0x9B43 0x4F5E #CJK UNIFIED IDEOGRAPH +0x9B44 0x4FAB #CJK UNIFIED IDEOGRAPH +0x9B45 0x59A3 #CJK UNIFIED IDEOGRAPH +0x9B46 0x59B2 #CJK UNIFIED IDEOGRAPH +0x9B47 0x59C6 #CJK UNIFIED IDEOGRAPH +0x9B48 0x59E8 #CJK UNIFIED IDEOGRAPH +0x9B49 0x59DC #CJK UNIFIED IDEOGRAPH +0x9B4A 0x598D #CJK UNIFIED IDEOGRAPH +0x9B4B 0x59D9 #CJK UNIFIED IDEOGRAPH +0x9B4C 0x59DA #CJK UNIFIED IDEOGRAPH +0x9B4D 0x5A25 #CJK UNIFIED IDEOGRAPH +0x9B4E 0x5A1F #CJK UNIFIED IDEOGRAPH +0x9B4F 0x5A11 #CJK UNIFIED IDEOGRAPH +0x9B50 0x5A1C #CJK UNIFIED IDEOGRAPH +0x9B51 0x5A09 #CJK UNIFIED IDEOGRAPH +0x9B52 0x5A1A #CJK UNIFIED IDEOGRAPH +0x9B53 0x5A40 #CJK UNIFIED IDEOGRAPH +0x9B54 0x5A6C #CJK UNIFIED IDEOGRAPH +0x9B55 0x5A49 #CJK UNIFIED IDEOGRAPH +0x9B56 0x5A35 #CJK UNIFIED IDEOGRAPH +0x9B57 0x5A36 #CJK UNIFIED IDEOGRAPH +0x9B58 0x5A62 #CJK UNIFIED IDEOGRAPH +0x9B59 0x5A6A #CJK UNIFIED IDEOGRAPH +0x9B5A 0x5A9A #CJK UNIFIED IDEOGRAPH +0x9B5B 0x5ABC #CJK UNIFIED IDEOGRAPH +0x9B5C 0x5ABE #CJK UNIFIED IDEOGRAPH +0x9B5D 0x5ACB #CJK UNIFIED IDEOGRAPH +0x9B5E 0x5AC2 #CJK UNIFIED IDEOGRAPH +0x9B5F 0x5ABD #CJK UNIFIED IDEOGRAPH +0x9B60 0x5AE3 #CJK UNIFIED IDEOGRAPH +0x9B61 0x5AD7 #CJK UNIFIED IDEOGRAPH +0x9B62 0x5AE6 #CJK UNIFIED IDEOGRAPH +0x9B63 0x5AE9 #CJK UNIFIED IDEOGRAPH +0x9B64 0x5AD6 #CJK UNIFIED IDEOGRAPH +0x9B65 0x5AFA #CJK UNIFIED IDEOGRAPH +0x9B66 0x5AFB #CJK UNIFIED IDEOGRAPH +0x9B67 0x5B0C #CJK UNIFIED IDEOGRAPH +0x9B68 0x5B0B #CJK UNIFIED IDEOGRAPH +0x9B69 0x5B16 #CJK UNIFIED IDEOGRAPH +0x9B6A 0x5B32 #CJK UNIFIED IDEOGRAPH +0x9B6B 0x5AD0 #CJK UNIFIED IDEOGRAPH +0x9B6C 0x5B2A #CJK UNIFIED IDEOGRAPH +0x9B6D 0x5B36 #CJK UNIFIED IDEOGRAPH +0x9B6E 0x5B3E #CJK UNIFIED IDEOGRAPH +0x9B6F 0x5B43 #CJK UNIFIED IDEOGRAPH +0x9B70 0x5B45 #CJK UNIFIED IDEOGRAPH +0x9B71 0x5B40 #CJK UNIFIED IDEOGRAPH +0x9B72 0x5B51 #CJK UNIFIED IDEOGRAPH +0x9B73 0x5B55 #CJK UNIFIED IDEOGRAPH +0x9B74 0x5B5A #CJK UNIFIED IDEOGRAPH +0x9B75 0x5B5B #CJK UNIFIED IDEOGRAPH +0x9B76 0x5B65 #CJK UNIFIED IDEOGRAPH +0x9B77 0x5B69 #CJK UNIFIED IDEOGRAPH +0x9B78 0x5B70 #CJK UNIFIED IDEOGRAPH +0x9B79 0x5B73 #CJK UNIFIED IDEOGRAPH +0x9B7A 0x5B75 #CJK UNIFIED IDEOGRAPH +0x9B7B 0x5B78 #CJK UNIFIED IDEOGRAPH +0x9B7C 0x6588 #CJK UNIFIED IDEOGRAPH +0x9B7D 0x5B7A #CJK UNIFIED IDEOGRAPH +0x9B7E 0x5B80 #CJK UNIFIED IDEOGRAPH +0x9B80 0x5B83 #CJK UNIFIED IDEOGRAPH +0x9B81 0x5BA6 #CJK UNIFIED IDEOGRAPH +0x9B82 0x5BB8 #CJK UNIFIED IDEOGRAPH +0x9B83 0x5BC3 #CJK UNIFIED IDEOGRAPH +0x9B84 0x5BC7 #CJK UNIFIED IDEOGRAPH +0x9B85 0x5BC9 #CJK UNIFIED IDEOGRAPH +0x9B86 0x5BD4 #CJK UNIFIED IDEOGRAPH +0x9B87 0x5BD0 #CJK UNIFIED IDEOGRAPH +0x9B88 0x5BE4 #CJK UNIFIED IDEOGRAPH +0x9B89 0x5BE6 #CJK UNIFIED IDEOGRAPH +0x9B8A 0x5BE2 #CJK UNIFIED IDEOGRAPH +0x9B8B 0x5BDE #CJK UNIFIED IDEOGRAPH +0x9B8C 0x5BE5 #CJK UNIFIED IDEOGRAPH +0x9B8D 0x5BEB #CJK UNIFIED IDEOGRAPH +0x9B8E 0x5BF0 #CJK UNIFIED IDEOGRAPH +0x9B8F 0x5BF6 #CJK UNIFIED IDEOGRAPH +0x9B90 0x5BF3 #CJK UNIFIED IDEOGRAPH +0x9B91 0x5C05 #CJK UNIFIED IDEOGRAPH +0x9B92 0x5C07 #CJK UNIFIED IDEOGRAPH +0x9B93 0x5C08 #CJK UNIFIED IDEOGRAPH +0x9B94 0x5C0D #CJK UNIFIED IDEOGRAPH +0x9B95 0x5C13 #CJK UNIFIED IDEOGRAPH +0x9B96 0x5C20 #CJK UNIFIED IDEOGRAPH +0x9B97 0x5C22 #CJK UNIFIED IDEOGRAPH +0x9B98 0x5C28 #CJK UNIFIED IDEOGRAPH +0x9B99 0x5C38 #CJK UNIFIED IDEOGRAPH +0x9B9A 0x5C39 #CJK UNIFIED IDEOGRAPH +0x9B9B 0x5C41 #CJK UNIFIED IDEOGRAPH +0x9B9C 0x5C46 #CJK UNIFIED IDEOGRAPH +0x9B9D 0x5C4E #CJK UNIFIED IDEOGRAPH +0x9B9E 0x5C53 #CJK UNIFIED IDEOGRAPH +0x9B9F 0x5C50 #CJK UNIFIED IDEOGRAPH +0x9BA0 0x5C4F #CJK UNIFIED IDEOGRAPH +0x9BA1 0x5B71 #CJK UNIFIED IDEOGRAPH +0x9BA2 0x5C6C #CJK UNIFIED IDEOGRAPH +0x9BA3 0x5C6E #CJK UNIFIED IDEOGRAPH +0x9BA4 0x4E62 #CJK UNIFIED IDEOGRAPH +0x9BA5 0x5C76 #CJK UNIFIED IDEOGRAPH +0x9BA6 0x5C79 #CJK UNIFIED IDEOGRAPH +0x9BA7 0x5C8C #CJK UNIFIED IDEOGRAPH +0x9BA8 0x5C91 #CJK UNIFIED IDEOGRAPH +0x9BA9 0x5C94 #CJK UNIFIED IDEOGRAPH +0x9BAA 0x599B #CJK UNIFIED IDEOGRAPH +0x9BAB 0x5CAB #CJK UNIFIED IDEOGRAPH +0x9BAC 0x5CBB #CJK UNIFIED IDEOGRAPH +0x9BAD 0x5CB6 #CJK UNIFIED IDEOGRAPH +0x9BAE 0x5CBC #CJK UNIFIED IDEOGRAPH +0x9BAF 0x5CB7 #CJK UNIFIED IDEOGRAPH +0x9BB0 0x5CC5 #CJK UNIFIED IDEOGRAPH +0x9BB1 0x5CBE #CJK UNIFIED IDEOGRAPH +0x9BB2 0x5CC7 #CJK UNIFIED IDEOGRAPH +0x9BB3 0x5CD9 #CJK UNIFIED IDEOGRAPH +0x9BB4 0x5CE9 #CJK UNIFIED IDEOGRAPH +0x9BB5 0x5CFD #CJK UNIFIED IDEOGRAPH +0x9BB6 0x5CFA #CJK UNIFIED IDEOGRAPH +0x9BB7 0x5CED #CJK UNIFIED IDEOGRAPH +0x9BB8 0x5D8C #CJK UNIFIED IDEOGRAPH +0x9BB9 0x5CEA #CJK UNIFIED IDEOGRAPH +0x9BBA 0x5D0B #CJK UNIFIED IDEOGRAPH +0x9BBB 0x5D15 #CJK UNIFIED IDEOGRAPH +0x9BBC 0x5D17 #CJK UNIFIED IDEOGRAPH +0x9BBD 0x5D5C #CJK UNIFIED IDEOGRAPH +0x9BBE 0x5D1F #CJK UNIFIED IDEOGRAPH +0x9BBF 0x5D1B #CJK UNIFIED IDEOGRAPH +0x9BC0 0x5D11 #CJK UNIFIED IDEOGRAPH +0x9BC1 0x5D14 #CJK UNIFIED IDEOGRAPH +0x9BC2 0x5D22 #CJK UNIFIED IDEOGRAPH +0x9BC3 0x5D1A #CJK UNIFIED IDEOGRAPH +0x9BC4 0x5D19 #CJK UNIFIED IDEOGRAPH +0x9BC5 0x5D18 #CJK UNIFIED IDEOGRAPH +0x9BC6 0x5D4C #CJK UNIFIED IDEOGRAPH +0x9BC7 0x5D52 #CJK UNIFIED IDEOGRAPH +0x9BC8 0x5D4E #CJK UNIFIED IDEOGRAPH +0x9BC9 0x5D4B #CJK UNIFIED IDEOGRAPH +0x9BCA 0x5D6C #CJK UNIFIED IDEOGRAPH +0x9BCB 0x5D73 #CJK UNIFIED IDEOGRAPH +0x9BCC 0x5D76 #CJK UNIFIED IDEOGRAPH +0x9BCD 0x5D87 #CJK UNIFIED IDEOGRAPH +0x9BCE 0x5D84 #CJK UNIFIED IDEOGRAPH +0x9BCF 0x5D82 #CJK UNIFIED IDEOGRAPH +0x9BD0 0x5DA2 #CJK UNIFIED IDEOGRAPH +0x9BD1 0x5D9D #CJK UNIFIED IDEOGRAPH +0x9BD2 0x5DAC #CJK UNIFIED IDEOGRAPH +0x9BD3 0x5DAE #CJK UNIFIED IDEOGRAPH +0x9BD4 0x5DBD #CJK UNIFIED IDEOGRAPH +0x9BD5 0x5D90 #CJK UNIFIED IDEOGRAPH +0x9BD6 0x5DB7 #CJK UNIFIED IDEOGRAPH +0x9BD7 0x5DBC #CJK UNIFIED IDEOGRAPH +0x9BD8 0x5DC9 #CJK UNIFIED IDEOGRAPH +0x9BD9 0x5DCD #CJK UNIFIED IDEOGRAPH +0x9BDA 0x5DD3 #CJK UNIFIED IDEOGRAPH +0x9BDB 0x5DD2 #CJK UNIFIED IDEOGRAPH +0x9BDC 0x5DD6 #CJK UNIFIED IDEOGRAPH +0x9BDD 0x5DDB #CJK UNIFIED IDEOGRAPH +0x9BDE 0x5DEB #CJK UNIFIED IDEOGRAPH +0x9BDF 0x5DF2 #CJK UNIFIED IDEOGRAPH +0x9BE0 0x5DF5 #CJK UNIFIED IDEOGRAPH +0x9BE1 0x5E0B #CJK UNIFIED IDEOGRAPH +0x9BE2 0x5E1A #CJK UNIFIED IDEOGRAPH +0x9BE3 0x5E19 #CJK UNIFIED IDEOGRAPH +0x9BE4 0x5E11 #CJK UNIFIED IDEOGRAPH +0x9BE5 0x5E1B #CJK UNIFIED IDEOGRAPH +0x9BE6 0x5E36 #CJK UNIFIED IDEOGRAPH +0x9BE7 0x5E37 #CJK UNIFIED IDEOGRAPH +0x9BE8 0x5E44 #CJK UNIFIED IDEOGRAPH +0x9BE9 0x5E43 #CJK UNIFIED IDEOGRAPH +0x9BEA 0x5E40 #CJK UNIFIED IDEOGRAPH +0x9BEB 0x5E4E #CJK UNIFIED IDEOGRAPH +0x9BEC 0x5E57 #CJK UNIFIED IDEOGRAPH +0x9BED 0x5E54 #CJK UNIFIED IDEOGRAPH +0x9BEE 0x5E5F #CJK UNIFIED IDEOGRAPH +0x9BEF 0x5E62 #CJK UNIFIED IDEOGRAPH +0x9BF0 0x5E64 #CJK UNIFIED IDEOGRAPH +0x9BF1 0x5E47 #CJK UNIFIED IDEOGRAPH +0x9BF2 0x5E75 #CJK UNIFIED IDEOGRAPH +0x9BF3 0x5E76 #CJK UNIFIED IDEOGRAPH +0x9BF4 0x5E7A #CJK UNIFIED IDEOGRAPH +0x9BF5 0x9EBC #CJK UNIFIED IDEOGRAPH +0x9BF6 0x5E7F #CJK UNIFIED IDEOGRAPH +0x9BF7 0x5EA0 #CJK UNIFIED IDEOGRAPH +0x9BF8 0x5EC1 #CJK UNIFIED IDEOGRAPH +0x9BF9 0x5EC2 #CJK UNIFIED IDEOGRAPH +0x9BFA 0x5EC8 #CJK UNIFIED IDEOGRAPH +0x9BFB 0x5ED0 #CJK UNIFIED IDEOGRAPH +0x9BFC 0x5ECF #CJK UNIFIED IDEOGRAPH +0x9C40 0x5ED6 #CJK UNIFIED IDEOGRAPH +0x9C41 0x5EE3 #CJK UNIFIED IDEOGRAPH +0x9C42 0x5EDD #CJK UNIFIED IDEOGRAPH +0x9C43 0x5EDA #CJK UNIFIED IDEOGRAPH +0x9C44 0x5EDB #CJK UNIFIED IDEOGRAPH +0x9C45 0x5EE2 #CJK UNIFIED IDEOGRAPH +0x9C46 0x5EE1 #CJK UNIFIED IDEOGRAPH +0x9C47 0x5EE8 #CJK UNIFIED IDEOGRAPH +0x9C48 0x5EE9 #CJK UNIFIED IDEOGRAPH +0x9C49 0x5EEC #CJK UNIFIED IDEOGRAPH +0x9C4A 0x5EF1 #CJK UNIFIED IDEOGRAPH +0x9C4B 0x5EF3 #CJK UNIFIED IDEOGRAPH +0x9C4C 0x5EF0 #CJK UNIFIED IDEOGRAPH +0x9C4D 0x5EF4 #CJK UNIFIED IDEOGRAPH +0x9C4E 0x5EF8 #CJK UNIFIED IDEOGRAPH +0x9C4F 0x5EFE #CJK UNIFIED IDEOGRAPH +0x9C50 0x5F03 #CJK UNIFIED IDEOGRAPH +0x9C51 0x5F09 #CJK UNIFIED IDEOGRAPH +0x9C52 0x5F5D #CJK UNIFIED IDEOGRAPH +0x9C53 0x5F5C #CJK UNIFIED IDEOGRAPH +0x9C54 0x5F0B #CJK UNIFIED IDEOGRAPH +0x9C55 0x5F11 #CJK UNIFIED IDEOGRAPH +0x9C56 0x5F16 #CJK UNIFIED IDEOGRAPH +0x9C57 0x5F29 #CJK UNIFIED IDEOGRAPH +0x9C58 0x5F2D #CJK UNIFIED IDEOGRAPH +0x9C59 0x5F38 #CJK UNIFIED IDEOGRAPH +0x9C5A 0x5F41 #CJK UNIFIED IDEOGRAPH +0x9C5B 0x5F48 #CJK UNIFIED IDEOGRAPH +0x9C5C 0x5F4C #CJK UNIFIED IDEOGRAPH +0x9C5D 0x5F4E #CJK UNIFIED IDEOGRAPH +0x9C5E 0x5F2F #CJK UNIFIED IDEOGRAPH +0x9C5F 0x5F51 #CJK UNIFIED IDEOGRAPH +0x9C60 0x5F56 #CJK UNIFIED IDEOGRAPH +0x9C61 0x5F57 #CJK UNIFIED IDEOGRAPH +0x9C62 0x5F59 #CJK UNIFIED IDEOGRAPH +0x9C63 0x5F61 #CJK UNIFIED IDEOGRAPH +0x9C64 0x5F6D #CJK UNIFIED IDEOGRAPH +0x9C65 0x5F73 #CJK UNIFIED IDEOGRAPH +0x9C66 0x5F77 #CJK UNIFIED IDEOGRAPH +0x9C67 0x5F83 #CJK UNIFIED IDEOGRAPH +0x9C68 0x5F82 #CJK UNIFIED IDEOGRAPH +0x9C69 0x5F7F #CJK UNIFIED IDEOGRAPH +0x9C6A 0x5F8A #CJK UNIFIED IDEOGRAPH +0x9C6B 0x5F88 #CJK UNIFIED IDEOGRAPH +0x9C6C 0x5F91 #CJK UNIFIED IDEOGRAPH +0x9C6D 0x5F87 #CJK UNIFIED IDEOGRAPH +0x9C6E 0x5F9E #CJK UNIFIED IDEOGRAPH +0x9C6F 0x5F99 #CJK UNIFIED IDEOGRAPH +0x9C70 0x5F98 #CJK UNIFIED IDEOGRAPH +0x9C71 0x5FA0 #CJK UNIFIED IDEOGRAPH +0x9C72 0x5FA8 #CJK UNIFIED IDEOGRAPH +0x9C73 0x5FAD #CJK UNIFIED IDEOGRAPH +0x9C74 0x5FBC #CJK UNIFIED IDEOGRAPH +0x9C75 0x5FD6 #CJK UNIFIED IDEOGRAPH +0x9C76 0x5FFB #CJK UNIFIED IDEOGRAPH +0x9C77 0x5FE4 #CJK UNIFIED IDEOGRAPH +0x9C78 0x5FF8 #CJK UNIFIED IDEOGRAPH +0x9C79 0x5FF1 #CJK UNIFIED IDEOGRAPH +0x9C7A 0x5FDD #CJK UNIFIED IDEOGRAPH +0x9C7B 0x60B3 #CJK UNIFIED IDEOGRAPH +0x9C7C 0x5FFF #CJK UNIFIED IDEOGRAPH +0x9C7D 0x6021 #CJK UNIFIED IDEOGRAPH +0x9C7E 0x6060 #CJK UNIFIED IDEOGRAPH +0x9C80 0x6019 #CJK UNIFIED IDEOGRAPH +0x9C81 0x6010 #CJK UNIFIED IDEOGRAPH +0x9C82 0x6029 #CJK UNIFIED IDEOGRAPH +0x9C83 0x600E #CJK UNIFIED IDEOGRAPH +0x9C84 0x6031 #CJK UNIFIED IDEOGRAPH +0x9C85 0x601B #CJK UNIFIED IDEOGRAPH +0x9C86 0x6015 #CJK UNIFIED IDEOGRAPH +0x9C87 0x602B #CJK UNIFIED IDEOGRAPH +0x9C88 0x6026 #CJK UNIFIED IDEOGRAPH +0x9C89 0x600F #CJK UNIFIED IDEOGRAPH +0x9C8A 0x603A #CJK UNIFIED IDEOGRAPH +0x9C8B 0x605A #CJK UNIFIED IDEOGRAPH +0x9C8C 0x6041 #CJK UNIFIED IDEOGRAPH +0x9C8D 0x606A #CJK UNIFIED IDEOGRAPH +0x9C8E 0x6077 #CJK UNIFIED IDEOGRAPH +0x9C8F 0x605F #CJK UNIFIED IDEOGRAPH +0x9C90 0x604A #CJK UNIFIED IDEOGRAPH +0x9C91 0x6046 #CJK UNIFIED IDEOGRAPH +0x9C92 0x604D #CJK UNIFIED IDEOGRAPH +0x9C93 0x6063 #CJK UNIFIED IDEOGRAPH +0x9C94 0x6043 #CJK UNIFIED IDEOGRAPH +0x9C95 0x6064 #CJK UNIFIED IDEOGRAPH +0x9C96 0x6042 #CJK UNIFIED IDEOGRAPH +0x9C97 0x606C #CJK UNIFIED IDEOGRAPH +0x9C98 0x606B #CJK UNIFIED IDEOGRAPH +0x9C99 0x6059 #CJK UNIFIED IDEOGRAPH +0x9C9A 0x6081 #CJK UNIFIED IDEOGRAPH +0x9C9B 0x608D #CJK UNIFIED IDEOGRAPH +0x9C9C 0x60E7 #CJK UNIFIED IDEOGRAPH +0x9C9D 0x6083 #CJK UNIFIED IDEOGRAPH +0x9C9E 0x609A #CJK UNIFIED IDEOGRAPH +0x9C9F 0x6084 #CJK UNIFIED IDEOGRAPH +0x9CA0 0x609B #CJK UNIFIED IDEOGRAPH +0x9CA1 0x6096 #CJK UNIFIED IDEOGRAPH +0x9CA2 0x6097 #CJK UNIFIED IDEOGRAPH +0x9CA3 0x6092 #CJK UNIFIED IDEOGRAPH +0x9CA4 0x60A7 #CJK UNIFIED IDEOGRAPH +0x9CA5 0x608B #CJK UNIFIED IDEOGRAPH +0x9CA6 0x60E1 #CJK UNIFIED IDEOGRAPH +0x9CA7 0x60B8 #CJK UNIFIED IDEOGRAPH +0x9CA8 0x60E0 #CJK UNIFIED IDEOGRAPH +0x9CA9 0x60D3 #CJK UNIFIED IDEOGRAPH +0x9CAA 0x60B4 #CJK UNIFIED IDEOGRAPH +0x9CAB 0x5FF0 #CJK UNIFIED IDEOGRAPH +0x9CAC 0x60BD #CJK UNIFIED IDEOGRAPH +0x9CAD 0x60C6 #CJK UNIFIED IDEOGRAPH +0x9CAE 0x60B5 #CJK UNIFIED IDEOGRAPH +0x9CAF 0x60D8 #CJK UNIFIED IDEOGRAPH +0x9CB0 0x614D #CJK UNIFIED IDEOGRAPH +0x9CB1 0x6115 #CJK UNIFIED IDEOGRAPH +0x9CB2 0x6106 #CJK UNIFIED IDEOGRAPH +0x9CB3 0x60F6 #CJK UNIFIED IDEOGRAPH +0x9CB4 0x60F7 #CJK UNIFIED IDEOGRAPH +0x9CB5 0x6100 #CJK UNIFIED IDEOGRAPH +0x9CB6 0x60F4 #CJK UNIFIED IDEOGRAPH +0x9CB7 0x60FA #CJK UNIFIED IDEOGRAPH +0x9CB8 0x6103 #CJK UNIFIED IDEOGRAPH +0x9CB9 0x6121 #CJK UNIFIED IDEOGRAPH +0x9CBA 0x60FB #CJK UNIFIED IDEOGRAPH +0x9CBB 0x60F1 #CJK UNIFIED IDEOGRAPH +0x9CBC 0x610D #CJK UNIFIED IDEOGRAPH +0x9CBD 0x610E #CJK UNIFIED IDEOGRAPH +0x9CBE 0x6147 #CJK UNIFIED IDEOGRAPH +0x9CBF 0x613E #CJK UNIFIED IDEOGRAPH +0x9CC0 0x6128 #CJK UNIFIED IDEOGRAPH +0x9CC1 0x6127 #CJK UNIFIED IDEOGRAPH +0x9CC2 0x614A #CJK UNIFIED IDEOGRAPH +0x9CC3 0x613F #CJK UNIFIED IDEOGRAPH +0x9CC4 0x613C #CJK UNIFIED IDEOGRAPH +0x9CC5 0x612C #CJK UNIFIED IDEOGRAPH +0x9CC6 0x6134 #CJK UNIFIED IDEOGRAPH +0x9CC7 0x613D #CJK UNIFIED IDEOGRAPH +0x9CC8 0x6142 #CJK UNIFIED IDEOGRAPH +0x9CC9 0x6144 #CJK UNIFIED IDEOGRAPH +0x9CCA 0x6173 #CJK UNIFIED IDEOGRAPH +0x9CCB 0x6177 #CJK UNIFIED IDEOGRAPH +0x9CCC 0x6158 #CJK UNIFIED IDEOGRAPH +0x9CCD 0x6159 #CJK UNIFIED IDEOGRAPH +0x9CCE 0x615A #CJK UNIFIED IDEOGRAPH +0x9CCF 0x616B #CJK UNIFIED IDEOGRAPH +0x9CD0 0x6174 #CJK UNIFIED IDEOGRAPH +0x9CD1 0x616F #CJK UNIFIED IDEOGRAPH +0x9CD2 0x6165 #CJK UNIFIED IDEOGRAPH +0x9CD3 0x6171 #CJK UNIFIED IDEOGRAPH +0x9CD4 0x615F #CJK UNIFIED IDEOGRAPH +0x9CD5 0x615D #CJK UNIFIED IDEOGRAPH +0x9CD6 0x6153 #CJK UNIFIED IDEOGRAPH +0x9CD7 0x6175 #CJK UNIFIED IDEOGRAPH +0x9CD8 0x6199 #CJK UNIFIED IDEOGRAPH +0x9CD9 0x6196 #CJK UNIFIED IDEOGRAPH +0x9CDA 0x6187 #CJK UNIFIED IDEOGRAPH +0x9CDB 0x61AC #CJK UNIFIED IDEOGRAPH +0x9CDC 0x6194 #CJK UNIFIED IDEOGRAPH +0x9CDD 0x619A #CJK UNIFIED IDEOGRAPH +0x9CDE 0x618A #CJK UNIFIED IDEOGRAPH +0x9CDF 0x6191 #CJK UNIFIED IDEOGRAPH +0x9CE0 0x61AB #CJK UNIFIED IDEOGRAPH +0x9CE1 0x61AE #CJK UNIFIED IDEOGRAPH +0x9CE2 0x61CC #CJK UNIFIED IDEOGRAPH +0x9CE3 0x61CA #CJK UNIFIED IDEOGRAPH +0x9CE4 0x61C9 #CJK UNIFIED IDEOGRAPH +0x9CE5 0x61F7 #CJK UNIFIED IDEOGRAPH +0x9CE6 0x61C8 #CJK UNIFIED IDEOGRAPH +0x9CE7 0x61C3 #CJK UNIFIED IDEOGRAPH +0x9CE8 0x61C6 #CJK UNIFIED IDEOGRAPH +0x9CE9 0x61BA #CJK UNIFIED IDEOGRAPH +0x9CEA 0x61CB #CJK UNIFIED IDEOGRAPH +0x9CEB 0x7F79 #CJK UNIFIED IDEOGRAPH +0x9CEC 0x61CD #CJK UNIFIED IDEOGRAPH +0x9CED 0x61E6 #CJK UNIFIED IDEOGRAPH +0x9CEE 0x61E3 #CJK UNIFIED IDEOGRAPH +0x9CEF 0x61F6 #CJK UNIFIED IDEOGRAPH +0x9CF0 0x61FA #CJK UNIFIED IDEOGRAPH +0x9CF1 0x61F4 #CJK UNIFIED IDEOGRAPH +0x9CF2 0x61FF #CJK UNIFIED IDEOGRAPH +0x9CF3 0x61FD #CJK UNIFIED IDEOGRAPH +0x9CF4 0x61FC #CJK UNIFIED IDEOGRAPH +0x9CF5 0x61FE #CJK UNIFIED IDEOGRAPH +0x9CF6 0x6200 #CJK UNIFIED IDEOGRAPH +0x9CF7 0x6208 #CJK UNIFIED IDEOGRAPH +0x9CF8 0x6209 #CJK UNIFIED IDEOGRAPH +0x9CF9 0x620D #CJK UNIFIED IDEOGRAPH +0x9CFA 0x620C #CJK UNIFIED IDEOGRAPH +0x9CFB 0x6214 #CJK UNIFIED IDEOGRAPH +0x9CFC 0x621B #CJK UNIFIED IDEOGRAPH +0x9D40 0x621E #CJK UNIFIED IDEOGRAPH +0x9D41 0x6221 #CJK UNIFIED IDEOGRAPH +0x9D42 0x622A #CJK UNIFIED IDEOGRAPH +0x9D43 0x622E #CJK UNIFIED IDEOGRAPH +0x9D44 0x6230 #CJK UNIFIED IDEOGRAPH +0x9D45 0x6232 #CJK UNIFIED IDEOGRAPH +0x9D46 0x6233 #CJK UNIFIED IDEOGRAPH +0x9D47 0x6241 #CJK UNIFIED IDEOGRAPH +0x9D48 0x624E #CJK UNIFIED IDEOGRAPH +0x9D49 0x625E #CJK UNIFIED IDEOGRAPH +0x9D4A 0x6263 #CJK UNIFIED IDEOGRAPH +0x9D4B 0x625B #CJK UNIFIED IDEOGRAPH +0x9D4C 0x6260 #CJK UNIFIED IDEOGRAPH +0x9D4D 0x6268 #CJK UNIFIED IDEOGRAPH +0x9D4E 0x627C #CJK UNIFIED IDEOGRAPH +0x9D4F 0x6282 #CJK UNIFIED IDEOGRAPH +0x9D50 0x6289 #CJK UNIFIED IDEOGRAPH +0x9D51 0x627E #CJK UNIFIED IDEOGRAPH +0x9D52 0x6292 #CJK UNIFIED IDEOGRAPH +0x9D53 0x6293 #CJK UNIFIED IDEOGRAPH +0x9D54 0x6296 #CJK UNIFIED IDEOGRAPH +0x9D55 0x62D4 #CJK UNIFIED IDEOGRAPH +0x9D56 0x6283 #CJK UNIFIED IDEOGRAPH +0x9D57 0x6294 #CJK UNIFIED IDEOGRAPH +0x9D58 0x62D7 #CJK UNIFIED IDEOGRAPH +0x9D59 0x62D1 #CJK UNIFIED IDEOGRAPH +0x9D5A 0x62BB #CJK UNIFIED IDEOGRAPH +0x9D5B 0x62CF #CJK UNIFIED IDEOGRAPH +0x9D5C 0x62FF #CJK UNIFIED IDEOGRAPH +0x9D5D 0x62C6 #CJK UNIFIED IDEOGRAPH +0x9D5E 0x64D4 #CJK UNIFIED IDEOGRAPH +0x9D5F 0x62C8 #CJK UNIFIED IDEOGRAPH +0x9D60 0x62DC #CJK UNIFIED IDEOGRAPH +0x9D61 0x62CC #CJK UNIFIED IDEOGRAPH +0x9D62 0x62CA #CJK UNIFIED IDEOGRAPH +0x9D63 0x62C2 #CJK UNIFIED IDEOGRAPH +0x9D64 0x62C7 #CJK UNIFIED IDEOGRAPH +0x9D65 0x629B #CJK UNIFIED IDEOGRAPH +0x9D66 0x62C9 #CJK UNIFIED IDEOGRAPH +0x9D67 0x630C #CJK UNIFIED IDEOGRAPH +0x9D68 0x62EE #CJK UNIFIED IDEOGRAPH +0x9D69 0x62F1 #CJK UNIFIED IDEOGRAPH +0x9D6A 0x6327 #CJK UNIFIED IDEOGRAPH +0x9D6B 0x6302 #CJK UNIFIED IDEOGRAPH +0x9D6C 0x6308 #CJK UNIFIED IDEOGRAPH +0x9D6D 0x62EF #CJK UNIFIED IDEOGRAPH +0x9D6E 0x62F5 #CJK UNIFIED IDEOGRAPH +0x9D6F 0x6350 #CJK UNIFIED IDEOGRAPH +0x9D70 0x633E #CJK UNIFIED IDEOGRAPH +0x9D71 0x634D #CJK UNIFIED IDEOGRAPH +0x9D72 0x641C #CJK UNIFIED IDEOGRAPH +0x9D73 0x634F #CJK UNIFIED IDEOGRAPH +0x9D74 0x6396 #CJK UNIFIED IDEOGRAPH +0x9D75 0x638E #CJK UNIFIED IDEOGRAPH +0x9D76 0x6380 #CJK UNIFIED IDEOGRAPH +0x9D77 0x63AB #CJK UNIFIED IDEOGRAPH +0x9D78 0x6376 #CJK UNIFIED IDEOGRAPH +0x9D79 0x63A3 #CJK UNIFIED IDEOGRAPH +0x9D7A 0x638F #CJK UNIFIED IDEOGRAPH +0x9D7B 0x6389 #CJK UNIFIED IDEOGRAPH +0x9D7C 0x639F #CJK UNIFIED IDEOGRAPH +0x9D7D 0x63B5 #CJK UNIFIED IDEOGRAPH +0x9D7E 0x636B #CJK UNIFIED IDEOGRAPH +0x9D80 0x6369 #CJK UNIFIED IDEOGRAPH +0x9D81 0x63BE #CJK UNIFIED IDEOGRAPH +0x9D82 0x63E9 #CJK UNIFIED IDEOGRAPH +0x9D83 0x63C0 #CJK UNIFIED IDEOGRAPH +0x9D84 0x63C6 #CJK UNIFIED IDEOGRAPH +0x9D85 0x63E3 #CJK UNIFIED IDEOGRAPH +0x9D86 0x63C9 #CJK UNIFIED IDEOGRAPH +0x9D87 0x63D2 #CJK UNIFIED IDEOGRAPH +0x9D88 0x63F6 #CJK UNIFIED IDEOGRAPH +0x9D89 0x63C4 #CJK UNIFIED IDEOGRAPH +0x9D8A 0x6416 #CJK UNIFIED IDEOGRAPH +0x9D8B 0x6434 #CJK UNIFIED IDEOGRAPH +0x9D8C 0x6406 #CJK UNIFIED IDEOGRAPH +0x9D8D 0x6413 #CJK UNIFIED IDEOGRAPH +0x9D8E 0x6426 #CJK UNIFIED IDEOGRAPH +0x9D8F 0x6436 #CJK UNIFIED IDEOGRAPH +0x9D90 0x651D #CJK UNIFIED IDEOGRAPH +0x9D91 0x6417 #CJK UNIFIED IDEOGRAPH +0x9D92 0x6428 #CJK UNIFIED IDEOGRAPH +0x9D93 0x640F #CJK UNIFIED IDEOGRAPH +0x9D94 0x6467 #CJK UNIFIED IDEOGRAPH +0x9D95 0x646F #CJK UNIFIED IDEOGRAPH +0x9D96 0x6476 #CJK UNIFIED IDEOGRAPH +0x9D97 0x644E #CJK UNIFIED IDEOGRAPH +0x9D98 0x652A #CJK UNIFIED IDEOGRAPH +0x9D99 0x6495 #CJK UNIFIED IDEOGRAPH +0x9D9A 0x6493 #CJK UNIFIED IDEOGRAPH +0x9D9B 0x64A5 #CJK UNIFIED IDEOGRAPH +0x9D9C 0x64A9 #CJK UNIFIED IDEOGRAPH +0x9D9D 0x6488 #CJK UNIFIED IDEOGRAPH +0x9D9E 0x64BC #CJK UNIFIED IDEOGRAPH +0x9D9F 0x64DA #CJK UNIFIED IDEOGRAPH +0x9DA0 0x64D2 #CJK UNIFIED IDEOGRAPH +0x9DA1 0x64C5 #CJK UNIFIED IDEOGRAPH +0x9DA2 0x64C7 #CJK UNIFIED IDEOGRAPH +0x9DA3 0x64BB #CJK UNIFIED IDEOGRAPH +0x9DA4 0x64D8 #CJK UNIFIED IDEOGRAPH +0x9DA5 0x64C2 #CJK UNIFIED IDEOGRAPH +0x9DA6 0x64F1 #CJK UNIFIED IDEOGRAPH +0x9DA7 0x64E7 #CJK UNIFIED IDEOGRAPH +0x9DA8 0x8209 #CJK UNIFIED IDEOGRAPH +0x9DA9 0x64E0 #CJK UNIFIED IDEOGRAPH +0x9DAA 0x64E1 #CJK UNIFIED IDEOGRAPH +0x9DAB 0x62AC #CJK UNIFIED IDEOGRAPH +0x9DAC 0x64E3 #CJK UNIFIED IDEOGRAPH +0x9DAD 0x64EF #CJK UNIFIED IDEOGRAPH +0x9DAE 0x652C #CJK UNIFIED IDEOGRAPH +0x9DAF 0x64F6 #CJK UNIFIED IDEOGRAPH +0x9DB0 0x64F4 #CJK UNIFIED IDEOGRAPH +0x9DB1 0x64F2 #CJK UNIFIED IDEOGRAPH +0x9DB2 0x64FA #CJK UNIFIED IDEOGRAPH +0x9DB3 0x6500 #CJK UNIFIED IDEOGRAPH +0x9DB4 0x64FD #CJK UNIFIED IDEOGRAPH +0x9DB5 0x6518 #CJK UNIFIED IDEOGRAPH +0x9DB6 0x651C #CJK UNIFIED IDEOGRAPH +0x9DB7 0x6505 #CJK UNIFIED IDEOGRAPH +0x9DB8 0x6524 #CJK UNIFIED IDEOGRAPH +0x9DB9 0x6523 #CJK UNIFIED IDEOGRAPH +0x9DBA 0x652B #CJK UNIFIED IDEOGRAPH +0x9DBB 0x6534 #CJK UNIFIED IDEOGRAPH +0x9DBC 0x6535 #CJK UNIFIED IDEOGRAPH +0x9DBD 0x6537 #CJK UNIFIED IDEOGRAPH +0x9DBE 0x6536 #CJK UNIFIED IDEOGRAPH +0x9DBF 0x6538 #CJK UNIFIED IDEOGRAPH +0x9DC0 0x754B #CJK UNIFIED IDEOGRAPH +0x9DC1 0x6548 #CJK UNIFIED IDEOGRAPH +0x9DC2 0x6556 #CJK UNIFIED IDEOGRAPH +0x9DC3 0x6555 #CJK UNIFIED IDEOGRAPH +0x9DC4 0x654D #CJK UNIFIED IDEOGRAPH +0x9DC5 0x6558 #CJK UNIFIED IDEOGRAPH +0x9DC6 0x655E #CJK UNIFIED IDEOGRAPH +0x9DC7 0x655D #CJK UNIFIED IDEOGRAPH +0x9DC8 0x6572 #CJK UNIFIED IDEOGRAPH +0x9DC9 0x6578 #CJK UNIFIED IDEOGRAPH +0x9DCA 0x6582 #CJK UNIFIED IDEOGRAPH +0x9DCB 0x6583 #CJK UNIFIED IDEOGRAPH +0x9DCC 0x8B8A #CJK UNIFIED IDEOGRAPH +0x9DCD 0x659B #CJK UNIFIED IDEOGRAPH +0x9DCE 0x659F #CJK UNIFIED IDEOGRAPH +0x9DCF 0x65AB #CJK UNIFIED IDEOGRAPH +0x9DD0 0x65B7 #CJK UNIFIED IDEOGRAPH +0x9DD1 0x65C3 #CJK UNIFIED IDEOGRAPH +0x9DD2 0x65C6 #CJK UNIFIED IDEOGRAPH +0x9DD3 0x65C1 #CJK UNIFIED IDEOGRAPH +0x9DD4 0x65C4 #CJK UNIFIED IDEOGRAPH +0x9DD5 0x65CC #CJK UNIFIED IDEOGRAPH +0x9DD6 0x65D2 #CJK UNIFIED IDEOGRAPH +0x9DD7 0x65DB #CJK UNIFIED IDEOGRAPH +0x9DD8 0x65D9 #CJK UNIFIED IDEOGRAPH +0x9DD9 0x65E0 #CJK UNIFIED IDEOGRAPH +0x9DDA 0x65E1 #CJK UNIFIED IDEOGRAPH +0x9DDB 0x65F1 #CJK UNIFIED IDEOGRAPH +0x9DDC 0x6772 #CJK UNIFIED IDEOGRAPH +0x9DDD 0x660A #CJK UNIFIED IDEOGRAPH +0x9DDE 0x6603 #CJK UNIFIED IDEOGRAPH +0x9DDF 0x65FB #CJK UNIFIED IDEOGRAPH +0x9DE0 0x6773 #CJK UNIFIED IDEOGRAPH +0x9DE1 0x6635 #CJK UNIFIED IDEOGRAPH +0x9DE2 0x6636 #CJK UNIFIED IDEOGRAPH +0x9DE3 0x6634 #CJK UNIFIED IDEOGRAPH +0x9DE4 0x661C #CJK UNIFIED IDEOGRAPH +0x9DE5 0x664F #CJK UNIFIED IDEOGRAPH +0x9DE6 0x6644 #CJK UNIFIED IDEOGRAPH +0x9DE7 0x6649 #CJK UNIFIED IDEOGRAPH +0x9DE8 0x6641 #CJK UNIFIED IDEOGRAPH +0x9DE9 0x665E #CJK UNIFIED IDEOGRAPH +0x9DEA 0x665D #CJK UNIFIED IDEOGRAPH +0x9DEB 0x6664 #CJK UNIFIED IDEOGRAPH +0x9DEC 0x6667 #CJK UNIFIED IDEOGRAPH +0x9DED 0x6668 #CJK UNIFIED IDEOGRAPH +0x9DEE 0x665F #CJK UNIFIED IDEOGRAPH +0x9DEF 0x6662 #CJK UNIFIED IDEOGRAPH +0x9DF0 0x6670 #CJK UNIFIED IDEOGRAPH +0x9DF1 0x6683 #CJK UNIFIED IDEOGRAPH +0x9DF2 0x6688 #CJK UNIFIED IDEOGRAPH +0x9DF3 0x668E #CJK UNIFIED IDEOGRAPH +0x9DF4 0x6689 #CJK UNIFIED IDEOGRAPH +0x9DF5 0x6684 #CJK UNIFIED IDEOGRAPH +0x9DF6 0x6698 #CJK UNIFIED IDEOGRAPH +0x9DF7 0x669D #CJK UNIFIED IDEOGRAPH +0x9DF8 0x66C1 #CJK UNIFIED IDEOGRAPH +0x9DF9 0x66B9 #CJK UNIFIED IDEOGRAPH +0x9DFA 0x66C9 #CJK UNIFIED IDEOGRAPH +0x9DFB 0x66BE #CJK UNIFIED IDEOGRAPH +0x9DFC 0x66BC #CJK UNIFIED IDEOGRAPH +0x9E40 0x66C4 #CJK UNIFIED IDEOGRAPH +0x9E41 0x66B8 #CJK UNIFIED IDEOGRAPH +0x9E42 0x66D6 #CJK UNIFIED IDEOGRAPH +0x9E43 0x66DA #CJK UNIFIED IDEOGRAPH +0x9E44 0x66E0 #CJK UNIFIED IDEOGRAPH +0x9E45 0x663F #CJK UNIFIED IDEOGRAPH +0x9E46 0x66E6 #CJK UNIFIED IDEOGRAPH +0x9E47 0x66E9 #CJK UNIFIED IDEOGRAPH +0x9E48 0x66F0 #CJK UNIFIED IDEOGRAPH +0x9E49 0x66F5 #CJK UNIFIED IDEOGRAPH +0x9E4A 0x66F7 #CJK UNIFIED IDEOGRAPH +0x9E4B 0x670F #CJK UNIFIED IDEOGRAPH +0x9E4C 0x6716 #CJK UNIFIED IDEOGRAPH +0x9E4D 0x671E #CJK UNIFIED IDEOGRAPH +0x9E4E 0x6726 #CJK UNIFIED IDEOGRAPH +0x9E4F 0x6727 #CJK UNIFIED IDEOGRAPH +0x9E50 0x9738 #CJK UNIFIED IDEOGRAPH +0x9E51 0x672E #CJK UNIFIED IDEOGRAPH +0x9E52 0x673F #CJK UNIFIED IDEOGRAPH +0x9E53 0x6736 #CJK UNIFIED IDEOGRAPH +0x9E54 0x6741 #CJK UNIFIED IDEOGRAPH +0x9E55 0x6738 #CJK UNIFIED IDEOGRAPH +0x9E56 0x6737 #CJK UNIFIED IDEOGRAPH +0x9E57 0x6746 #CJK UNIFIED IDEOGRAPH +0x9E58 0x675E #CJK UNIFIED IDEOGRAPH +0x9E59 0x6760 #CJK UNIFIED IDEOGRAPH +0x9E5A 0x6759 #CJK UNIFIED IDEOGRAPH +0x9E5B 0x6763 #CJK UNIFIED IDEOGRAPH +0x9E5C 0x6764 #CJK UNIFIED IDEOGRAPH +0x9E5D 0x6789 #CJK UNIFIED IDEOGRAPH +0x9E5E 0x6770 #CJK UNIFIED IDEOGRAPH +0x9E5F 0x67A9 #CJK UNIFIED IDEOGRAPH +0x9E60 0x677C #CJK UNIFIED IDEOGRAPH +0x9E61 0x676A #CJK UNIFIED IDEOGRAPH +0x9E62 0x678C #CJK UNIFIED IDEOGRAPH +0x9E63 0x678B #CJK UNIFIED IDEOGRAPH +0x9E64 0x67A6 #CJK UNIFIED IDEOGRAPH +0x9E65 0x67A1 #CJK UNIFIED IDEOGRAPH +0x9E66 0x6785 #CJK UNIFIED IDEOGRAPH +0x9E67 0x67B7 #CJK UNIFIED IDEOGRAPH +0x9E68 0x67EF #CJK UNIFIED IDEOGRAPH +0x9E69 0x67B4 #CJK UNIFIED IDEOGRAPH +0x9E6A 0x67EC #CJK UNIFIED IDEOGRAPH +0x9E6B 0x67B3 #CJK UNIFIED IDEOGRAPH +0x9E6C 0x67E9 #CJK UNIFIED IDEOGRAPH +0x9E6D 0x67B8 #CJK UNIFIED IDEOGRAPH +0x9E6E 0x67E4 #CJK UNIFIED IDEOGRAPH +0x9E6F 0x67DE #CJK UNIFIED IDEOGRAPH +0x9E70 0x67DD #CJK UNIFIED IDEOGRAPH +0x9E71 0x67E2 #CJK UNIFIED IDEOGRAPH +0x9E72 0x67EE #CJK UNIFIED IDEOGRAPH +0x9E73 0x67B9 #CJK UNIFIED IDEOGRAPH +0x9E74 0x67CE #CJK UNIFIED IDEOGRAPH +0x9E75 0x67C6 #CJK UNIFIED IDEOGRAPH +0x9E76 0x67E7 #CJK UNIFIED IDEOGRAPH +0x9E77 0x6A9C #CJK UNIFIED IDEOGRAPH +0x9E78 0x681E #CJK UNIFIED IDEOGRAPH +0x9E79 0x6846 #CJK UNIFIED IDEOGRAPH +0x9E7A 0x6829 #CJK UNIFIED IDEOGRAPH +0x9E7B 0x6840 #CJK UNIFIED IDEOGRAPH +0x9E7C 0x684D #CJK UNIFIED IDEOGRAPH +0x9E7D 0x6832 #CJK UNIFIED IDEOGRAPH +0x9E7E 0x684E #CJK UNIFIED IDEOGRAPH +0x9E80 0x68B3 #CJK UNIFIED IDEOGRAPH +0x9E81 0x682B #CJK UNIFIED IDEOGRAPH +0x9E82 0x6859 #CJK UNIFIED IDEOGRAPH +0x9E83 0x6863 #CJK UNIFIED IDEOGRAPH +0x9E84 0x6877 #CJK UNIFIED IDEOGRAPH +0x9E85 0x687F #CJK UNIFIED IDEOGRAPH +0x9E86 0x689F #CJK UNIFIED IDEOGRAPH +0x9E87 0x688F #CJK UNIFIED IDEOGRAPH +0x9E88 0x68AD #CJK UNIFIED IDEOGRAPH +0x9E89 0x6894 #CJK UNIFIED IDEOGRAPH +0x9E8A 0x689D #CJK UNIFIED IDEOGRAPH +0x9E8B 0x689B #CJK UNIFIED IDEOGRAPH +0x9E8C 0x6883 #CJK UNIFIED IDEOGRAPH +0x9E8D 0x6AAE #CJK UNIFIED IDEOGRAPH +0x9E8E 0x68B9 #CJK UNIFIED IDEOGRAPH +0x9E8F 0x6874 #CJK UNIFIED IDEOGRAPH +0x9E90 0x68B5 #CJK UNIFIED IDEOGRAPH +0x9E91 0x68A0 #CJK UNIFIED IDEOGRAPH +0x9E92 0x68BA #CJK UNIFIED IDEOGRAPH +0x9E93 0x690F #CJK UNIFIED IDEOGRAPH +0x9E94 0x688D #CJK UNIFIED IDEOGRAPH +0x9E95 0x687E #CJK UNIFIED IDEOGRAPH +0x9E96 0x6901 #CJK UNIFIED IDEOGRAPH +0x9E97 0x68CA #CJK UNIFIED IDEOGRAPH +0x9E98 0x6908 #CJK UNIFIED IDEOGRAPH +0x9E99 0x68D8 #CJK UNIFIED IDEOGRAPH +0x9E9A 0x6922 #CJK UNIFIED IDEOGRAPH +0x9E9B 0x6926 #CJK UNIFIED IDEOGRAPH +0x9E9C 0x68E1 #CJK UNIFIED IDEOGRAPH +0x9E9D 0x690C #CJK UNIFIED IDEOGRAPH +0x9E9E 0x68CD #CJK UNIFIED IDEOGRAPH +0x9E9F 0x68D4 #CJK UNIFIED IDEOGRAPH +0x9EA0 0x68E7 #CJK UNIFIED IDEOGRAPH +0x9EA1 0x68D5 #CJK UNIFIED IDEOGRAPH +0x9EA2 0x6936 #CJK UNIFIED IDEOGRAPH +0x9EA3 0x6912 #CJK UNIFIED IDEOGRAPH +0x9EA4 0x6904 #CJK UNIFIED IDEOGRAPH +0x9EA5 0x68D7 #CJK UNIFIED IDEOGRAPH +0x9EA6 0x68E3 #CJK UNIFIED IDEOGRAPH +0x9EA7 0x6925 #CJK UNIFIED IDEOGRAPH +0x9EA8 0x68F9 #CJK UNIFIED IDEOGRAPH +0x9EA9 0x68E0 #CJK UNIFIED IDEOGRAPH +0x9EAA 0x68EF #CJK UNIFIED IDEOGRAPH +0x9EAB 0x6928 #CJK UNIFIED IDEOGRAPH +0x9EAC 0x692A #CJK UNIFIED IDEOGRAPH +0x9EAD 0x691A #CJK UNIFIED IDEOGRAPH +0x9EAE 0x6923 #CJK UNIFIED IDEOGRAPH +0x9EAF 0x6921 #CJK UNIFIED IDEOGRAPH +0x9EB0 0x68C6 #CJK UNIFIED IDEOGRAPH +0x9EB1 0x6979 #CJK UNIFIED IDEOGRAPH +0x9EB2 0x6977 #CJK UNIFIED IDEOGRAPH +0x9EB3 0x695C #CJK UNIFIED IDEOGRAPH +0x9EB4 0x6978 #CJK UNIFIED IDEOGRAPH +0x9EB5 0x696B #CJK UNIFIED IDEOGRAPH +0x9EB6 0x6954 #CJK UNIFIED IDEOGRAPH +0x9EB7 0x697E #CJK UNIFIED IDEOGRAPH +0x9EB8 0x696E #CJK UNIFIED IDEOGRAPH +0x9EB9 0x6939 #CJK UNIFIED IDEOGRAPH +0x9EBA 0x6974 #CJK UNIFIED IDEOGRAPH +0x9EBB 0x693D #CJK UNIFIED IDEOGRAPH +0x9EBC 0x6959 #CJK UNIFIED IDEOGRAPH +0x9EBD 0x6930 #CJK UNIFIED IDEOGRAPH +0x9EBE 0x6961 #CJK UNIFIED IDEOGRAPH +0x9EBF 0x695E #CJK UNIFIED IDEOGRAPH +0x9EC0 0x695D #CJK UNIFIED IDEOGRAPH +0x9EC1 0x6981 #CJK UNIFIED IDEOGRAPH +0x9EC2 0x696A #CJK UNIFIED IDEOGRAPH +0x9EC3 0x69B2 #CJK UNIFIED IDEOGRAPH +0x9EC4 0x69AE #CJK UNIFIED IDEOGRAPH +0x9EC5 0x69D0 #CJK UNIFIED IDEOGRAPH +0x9EC6 0x69BF #CJK UNIFIED IDEOGRAPH +0x9EC7 0x69C1 #CJK UNIFIED IDEOGRAPH +0x9EC8 0x69D3 #CJK UNIFIED IDEOGRAPH +0x9EC9 0x69BE #CJK UNIFIED IDEOGRAPH +0x9ECA 0x69CE #CJK UNIFIED IDEOGRAPH +0x9ECB 0x5BE8 #CJK UNIFIED IDEOGRAPH +0x9ECC 0x69CA #CJK UNIFIED IDEOGRAPH +0x9ECD 0x69DD #CJK UNIFIED IDEOGRAPH +0x9ECE 0x69BB #CJK UNIFIED IDEOGRAPH +0x9ECF 0x69C3 #CJK UNIFIED IDEOGRAPH +0x9ED0 0x69A7 #CJK UNIFIED IDEOGRAPH +0x9ED1 0x6A2E #CJK UNIFIED IDEOGRAPH +0x9ED2 0x6991 #CJK UNIFIED IDEOGRAPH +0x9ED3 0x69A0 #CJK UNIFIED IDEOGRAPH +0x9ED4 0x699C #CJK UNIFIED IDEOGRAPH +0x9ED5 0x6995 #CJK UNIFIED IDEOGRAPH +0x9ED6 0x69B4 #CJK UNIFIED IDEOGRAPH +0x9ED7 0x69DE #CJK UNIFIED IDEOGRAPH +0x9ED8 0x69E8 #CJK UNIFIED IDEOGRAPH +0x9ED9 0x6A02 #CJK UNIFIED IDEOGRAPH +0x9EDA 0x6A1B #CJK UNIFIED IDEOGRAPH +0x9EDB 0x69FF #CJK UNIFIED IDEOGRAPH +0x9EDC 0x6B0A #CJK UNIFIED IDEOGRAPH +0x9EDD 0x69F9 #CJK UNIFIED IDEOGRAPH +0x9EDE 0x69F2 #CJK UNIFIED IDEOGRAPH +0x9EDF 0x69E7 #CJK UNIFIED IDEOGRAPH +0x9EE0 0x6A05 #CJK UNIFIED IDEOGRAPH +0x9EE1 0x69B1 #CJK UNIFIED IDEOGRAPH +0x9EE2 0x6A1E #CJK UNIFIED IDEOGRAPH +0x9EE3 0x69ED #CJK UNIFIED IDEOGRAPH +0x9EE4 0x6A14 #CJK UNIFIED IDEOGRAPH +0x9EE5 0x69EB #CJK UNIFIED IDEOGRAPH +0x9EE6 0x6A0A #CJK UNIFIED IDEOGRAPH +0x9EE7 0x6A12 #CJK UNIFIED IDEOGRAPH +0x9EE8 0x6AC1 #CJK UNIFIED IDEOGRAPH +0x9EE9 0x6A23 #CJK UNIFIED IDEOGRAPH +0x9EEA 0x6A13 #CJK UNIFIED IDEOGRAPH +0x9EEB 0x6A44 #CJK UNIFIED IDEOGRAPH +0x9EEC 0x6A0C #CJK UNIFIED IDEOGRAPH +0x9EED 0x6A72 #CJK UNIFIED IDEOGRAPH +0x9EEE 0x6A36 #CJK UNIFIED IDEOGRAPH +0x9EEF 0x6A78 #CJK UNIFIED IDEOGRAPH +0x9EF0 0x6A47 #CJK UNIFIED IDEOGRAPH +0x9EF1 0x6A62 #CJK UNIFIED IDEOGRAPH +0x9EF2 0x6A59 #CJK UNIFIED IDEOGRAPH +0x9EF3 0x6A66 #CJK UNIFIED IDEOGRAPH +0x9EF4 0x6A48 #CJK UNIFIED IDEOGRAPH +0x9EF5 0x6A38 #CJK UNIFIED IDEOGRAPH +0x9EF6 0x6A22 #CJK UNIFIED IDEOGRAPH +0x9EF7 0x6A90 #CJK UNIFIED IDEOGRAPH +0x9EF8 0x6A8D #CJK UNIFIED IDEOGRAPH +0x9EF9 0x6AA0 #CJK UNIFIED IDEOGRAPH +0x9EFA 0x6A84 #CJK UNIFIED IDEOGRAPH +0x9EFB 0x6AA2 #CJK UNIFIED IDEOGRAPH +0x9EFC 0x6AA3 #CJK UNIFIED IDEOGRAPH +0x9F40 0x6A97 #CJK UNIFIED IDEOGRAPH +0x9F41 0x8617 #CJK UNIFIED IDEOGRAPH +0x9F42 0x6ABB #CJK UNIFIED IDEOGRAPH +0x9F43 0x6AC3 #CJK UNIFIED IDEOGRAPH +0x9F44 0x6AC2 #CJK UNIFIED IDEOGRAPH +0x9F45 0x6AB8 #CJK UNIFIED IDEOGRAPH +0x9F46 0x6AB3 #CJK UNIFIED IDEOGRAPH +0x9F47 0x6AAC #CJK UNIFIED IDEOGRAPH +0x9F48 0x6ADE #CJK UNIFIED IDEOGRAPH +0x9F49 0x6AD1 #CJK UNIFIED IDEOGRAPH +0x9F4A 0x6ADF #CJK UNIFIED IDEOGRAPH +0x9F4B 0x6AAA #CJK UNIFIED IDEOGRAPH +0x9F4C 0x6ADA #CJK UNIFIED IDEOGRAPH +0x9F4D 0x6AEA #CJK UNIFIED IDEOGRAPH +0x9F4E 0x6AFB #CJK UNIFIED IDEOGRAPH +0x9F4F 0x6B05 #CJK UNIFIED IDEOGRAPH +0x9F50 0x8616 #CJK UNIFIED IDEOGRAPH +0x9F51 0x6AFA #CJK UNIFIED IDEOGRAPH +0x9F52 0x6B12 #CJK UNIFIED IDEOGRAPH +0x9F53 0x6B16 #CJK UNIFIED IDEOGRAPH +0x9F54 0x9B31 #CJK UNIFIED IDEOGRAPH +0x9F55 0x6B1F #CJK UNIFIED IDEOGRAPH +0x9F56 0x6B38 #CJK UNIFIED IDEOGRAPH +0x9F57 0x6B37 #CJK UNIFIED IDEOGRAPH +0x9F58 0x76DC #CJK UNIFIED IDEOGRAPH +0x9F59 0x6B39 #CJK UNIFIED IDEOGRAPH +0x9F5A 0x98EE #CJK UNIFIED IDEOGRAPH +0x9F5B 0x6B47 #CJK UNIFIED IDEOGRAPH +0x9F5C 0x6B43 #CJK UNIFIED IDEOGRAPH +0x9F5D 0x6B49 #CJK UNIFIED IDEOGRAPH +0x9F5E 0x6B50 #CJK UNIFIED IDEOGRAPH +0x9F5F 0x6B59 #CJK UNIFIED IDEOGRAPH +0x9F60 0x6B54 #CJK UNIFIED IDEOGRAPH +0x9F61 0x6B5B #CJK UNIFIED IDEOGRAPH +0x9F62 0x6B5F #CJK UNIFIED IDEOGRAPH +0x9F63 0x6B61 #CJK UNIFIED IDEOGRAPH +0x9F64 0x6B78 #CJK UNIFIED IDEOGRAPH +0x9F65 0x6B79 #CJK UNIFIED IDEOGRAPH +0x9F66 0x6B7F #CJK UNIFIED IDEOGRAPH +0x9F67 0x6B80 #CJK UNIFIED IDEOGRAPH +0x9F68 0x6B84 #CJK UNIFIED IDEOGRAPH +0x9F69 0x6B83 #CJK UNIFIED IDEOGRAPH +0x9F6A 0x6B8D #CJK UNIFIED IDEOGRAPH +0x9F6B 0x6B98 #CJK UNIFIED IDEOGRAPH +0x9F6C 0x6B95 #CJK UNIFIED IDEOGRAPH +0x9F6D 0x6B9E #CJK UNIFIED IDEOGRAPH +0x9F6E 0x6BA4 #CJK UNIFIED IDEOGRAPH +0x9F6F 0x6BAA #CJK UNIFIED IDEOGRAPH +0x9F70 0x6BAB #CJK UNIFIED IDEOGRAPH +0x9F71 0x6BAF #CJK UNIFIED IDEOGRAPH +0x9F72 0x6BB2 #CJK UNIFIED IDEOGRAPH +0x9F73 0x6BB1 #CJK UNIFIED IDEOGRAPH +0x9F74 0x6BB3 #CJK UNIFIED IDEOGRAPH +0x9F75 0x6BB7 #CJK UNIFIED IDEOGRAPH +0x9F76 0x6BBC #CJK UNIFIED IDEOGRAPH +0x9F77 0x6BC6 #CJK UNIFIED IDEOGRAPH +0x9F78 0x6BCB #CJK UNIFIED IDEOGRAPH +0x9F79 0x6BD3 #CJK UNIFIED IDEOGRAPH +0x9F7A 0x6BDF #CJK UNIFIED IDEOGRAPH +0x9F7B 0x6BEC #CJK UNIFIED IDEOGRAPH +0x9F7C 0x6BEB #CJK UNIFIED IDEOGRAPH +0x9F7D 0x6BF3 #CJK UNIFIED IDEOGRAPH +0x9F7E 0x6BEF #CJK UNIFIED IDEOGRAPH +0x9F80 0x9EBE #CJK UNIFIED IDEOGRAPH +0x9F81 0x6C08 #CJK UNIFIED IDEOGRAPH +0x9F82 0x6C13 #CJK UNIFIED IDEOGRAPH +0x9F83 0x6C14 #CJK UNIFIED IDEOGRAPH +0x9F84 0x6C1B #CJK UNIFIED IDEOGRAPH +0x9F85 0x6C24 #CJK UNIFIED IDEOGRAPH +0x9F86 0x6C23 #CJK UNIFIED IDEOGRAPH +0x9F87 0x6C5E #CJK UNIFIED IDEOGRAPH +0x9F88 0x6C55 #CJK UNIFIED IDEOGRAPH +0x9F89 0x6C62 #CJK UNIFIED IDEOGRAPH +0x9F8A 0x6C6A #CJK UNIFIED IDEOGRAPH +0x9F8B 0x6C82 #CJK UNIFIED IDEOGRAPH +0x9F8C 0x6C8D #CJK UNIFIED IDEOGRAPH +0x9F8D 0x6C9A #CJK UNIFIED IDEOGRAPH +0x9F8E 0x6C81 #CJK UNIFIED IDEOGRAPH +0x9F8F 0x6C9B #CJK UNIFIED IDEOGRAPH +0x9F90 0x6C7E #CJK UNIFIED IDEOGRAPH +0x9F91 0x6C68 #CJK UNIFIED IDEOGRAPH +0x9F92 0x6C73 #CJK UNIFIED IDEOGRAPH +0x9F93 0x6C92 #CJK UNIFIED IDEOGRAPH +0x9F94 0x6C90 #CJK UNIFIED IDEOGRAPH +0x9F95 0x6CC4 #CJK UNIFIED IDEOGRAPH +0x9F96 0x6CF1 #CJK UNIFIED IDEOGRAPH +0x9F97 0x6CD3 #CJK UNIFIED IDEOGRAPH +0x9F98 0x6CBD #CJK UNIFIED IDEOGRAPH +0x9F99 0x6CD7 #CJK UNIFIED IDEOGRAPH +0x9F9A 0x6CC5 #CJK UNIFIED IDEOGRAPH +0x9F9B 0x6CDD #CJK UNIFIED IDEOGRAPH +0x9F9C 0x6CAE #CJK UNIFIED IDEOGRAPH +0x9F9D 0x6CB1 #CJK UNIFIED IDEOGRAPH +0x9F9E 0x6CBE #CJK UNIFIED IDEOGRAPH +0x9F9F 0x6CBA #CJK UNIFIED IDEOGRAPH +0x9FA0 0x6CDB #CJK UNIFIED IDEOGRAPH +0x9FA1 0x6CEF #CJK UNIFIED IDEOGRAPH +0x9FA2 0x6CD9 #CJK UNIFIED IDEOGRAPH +0x9FA3 0x6CEA #CJK UNIFIED IDEOGRAPH +0x9FA4 0x6D1F #CJK UNIFIED IDEOGRAPH +0x9FA5 0x884D #CJK UNIFIED IDEOGRAPH +0x9FA6 0x6D36 #CJK UNIFIED IDEOGRAPH +0x9FA7 0x6D2B #CJK UNIFIED IDEOGRAPH +0x9FA8 0x6D3D #CJK UNIFIED IDEOGRAPH +0x9FA9 0x6D38 #CJK UNIFIED IDEOGRAPH +0x9FAA 0x6D19 #CJK UNIFIED IDEOGRAPH +0x9FAB 0x6D35 #CJK UNIFIED IDEOGRAPH +0x9FAC 0x6D33 #CJK UNIFIED IDEOGRAPH +0x9FAD 0x6D12 #CJK UNIFIED IDEOGRAPH +0x9FAE 0x6D0C #CJK UNIFIED IDEOGRAPH +0x9FAF 0x6D63 #CJK UNIFIED IDEOGRAPH +0x9FB0 0x6D93 #CJK UNIFIED IDEOGRAPH +0x9FB1 0x6D64 #CJK UNIFIED IDEOGRAPH +0x9FB2 0x6D5A #CJK UNIFIED IDEOGRAPH +0x9FB3 0x6D79 #CJK UNIFIED IDEOGRAPH +0x9FB4 0x6D59 #CJK UNIFIED IDEOGRAPH +0x9FB5 0x6D8E #CJK UNIFIED IDEOGRAPH +0x9FB6 0x6D95 #CJK UNIFIED IDEOGRAPH +0x9FB7 0x6FE4 #CJK UNIFIED IDEOGRAPH +0x9FB8 0x6D85 #CJK UNIFIED IDEOGRAPH +0x9FB9 0x6DF9 #CJK UNIFIED IDEOGRAPH +0x9FBA 0x6E15 #CJK UNIFIED IDEOGRAPH +0x9FBB 0x6E0A #CJK UNIFIED IDEOGRAPH +0x9FBC 0x6DB5 #CJK UNIFIED IDEOGRAPH +0x9FBD 0x6DC7 #CJK UNIFIED IDEOGRAPH +0x9FBE 0x6DE6 #CJK UNIFIED IDEOGRAPH +0x9FBF 0x6DB8 #CJK UNIFIED IDEOGRAPH +0x9FC0 0x6DC6 #CJK UNIFIED IDEOGRAPH +0x9FC1 0x6DEC #CJK UNIFIED IDEOGRAPH +0x9FC2 0x6DDE #CJK UNIFIED IDEOGRAPH +0x9FC3 0x6DCC #CJK UNIFIED IDEOGRAPH +0x9FC4 0x6DE8 #CJK UNIFIED IDEOGRAPH +0x9FC5 0x6DD2 #CJK UNIFIED IDEOGRAPH +0x9FC6 0x6DC5 #CJK UNIFIED IDEOGRAPH +0x9FC7 0x6DFA #CJK UNIFIED IDEOGRAPH +0x9FC8 0x6DD9 #CJK UNIFIED IDEOGRAPH +0x9FC9 0x6DE4 #CJK UNIFIED IDEOGRAPH +0x9FCA 0x6DD5 #CJK UNIFIED IDEOGRAPH +0x9FCB 0x6DEA #CJK UNIFIED IDEOGRAPH +0x9FCC 0x6DEE #CJK UNIFIED IDEOGRAPH +0x9FCD 0x6E2D #CJK UNIFIED IDEOGRAPH +0x9FCE 0x6E6E #CJK UNIFIED IDEOGRAPH +0x9FCF 0x6E2E #CJK UNIFIED IDEOGRAPH +0x9FD0 0x6E19 #CJK UNIFIED IDEOGRAPH +0x9FD1 0x6E72 #CJK UNIFIED IDEOGRAPH +0x9FD2 0x6E5F #CJK UNIFIED IDEOGRAPH +0x9FD3 0x6E3E #CJK UNIFIED IDEOGRAPH +0x9FD4 0x6E23 #CJK UNIFIED IDEOGRAPH +0x9FD5 0x6E6B #CJK UNIFIED IDEOGRAPH +0x9FD6 0x6E2B #CJK UNIFIED IDEOGRAPH +0x9FD7 0x6E76 #CJK UNIFIED IDEOGRAPH +0x9FD8 0x6E4D #CJK UNIFIED IDEOGRAPH +0x9FD9 0x6E1F #CJK UNIFIED IDEOGRAPH +0x9FDA 0x6E43 #CJK UNIFIED IDEOGRAPH +0x9FDB 0x6E3A #CJK UNIFIED IDEOGRAPH +0x9FDC 0x6E4E #CJK UNIFIED IDEOGRAPH +0x9FDD 0x6E24 #CJK UNIFIED IDEOGRAPH +0x9FDE 0x6EFF #CJK UNIFIED IDEOGRAPH +0x9FDF 0x6E1D #CJK UNIFIED IDEOGRAPH +0x9FE0 0x6E38 #CJK UNIFIED IDEOGRAPH +0x9FE1 0x6E82 #CJK UNIFIED IDEOGRAPH +0x9FE2 0x6EAA #CJK UNIFIED IDEOGRAPH +0x9FE3 0x6E98 #CJK UNIFIED IDEOGRAPH +0x9FE4 0x6EC9 #CJK UNIFIED IDEOGRAPH +0x9FE5 0x6EB7 #CJK UNIFIED IDEOGRAPH +0x9FE6 0x6ED3 #CJK UNIFIED IDEOGRAPH +0x9FE7 0x6EBD #CJK UNIFIED IDEOGRAPH +0x9FE8 0x6EAF #CJK UNIFIED IDEOGRAPH +0x9FE9 0x6EC4 #CJK UNIFIED IDEOGRAPH +0x9FEA 0x6EB2 #CJK UNIFIED IDEOGRAPH +0x9FEB 0x6ED4 #CJK UNIFIED IDEOGRAPH +0x9FEC 0x6ED5 #CJK UNIFIED IDEOGRAPH +0x9FED 0x6E8F #CJK UNIFIED IDEOGRAPH +0x9FEE 0x6EA5 #CJK UNIFIED IDEOGRAPH +0x9FEF 0x6EC2 #CJK UNIFIED IDEOGRAPH +0x9FF0 0x6E9F #CJK UNIFIED IDEOGRAPH +0x9FF1 0x6F41 #CJK UNIFIED IDEOGRAPH +0x9FF2 0x6F11 #CJK UNIFIED IDEOGRAPH +0x9FF3 0x704C #CJK UNIFIED IDEOGRAPH +0x9FF4 0x6EEC #CJK UNIFIED IDEOGRAPH +0x9FF5 0x6EF8 #CJK UNIFIED IDEOGRAPH +0x9FF6 0x6EFE #CJK UNIFIED IDEOGRAPH +0x9FF7 0x6F3F #CJK UNIFIED IDEOGRAPH +0x9FF8 0x6EF2 #CJK UNIFIED IDEOGRAPH +0x9FF9 0x6F31 #CJK UNIFIED IDEOGRAPH +0x9FFA 0x6EEF #CJK UNIFIED IDEOGRAPH +0x9FFB 0x6F32 #CJK UNIFIED IDEOGRAPH +0x9FFC 0x6ECC #CJK UNIFIED IDEOGRAPH +0xE040 0x6F3E #CJK UNIFIED IDEOGRAPH +0xE041 0x6F13 #CJK UNIFIED IDEOGRAPH +0xE042 0x6EF7 #CJK UNIFIED IDEOGRAPH +0xE043 0x6F86 #CJK UNIFIED IDEOGRAPH +0xE044 0x6F7A #CJK UNIFIED IDEOGRAPH +0xE045 0x6F78 #CJK UNIFIED IDEOGRAPH +0xE046 0x6F81 #CJK UNIFIED IDEOGRAPH +0xE047 0x6F80 #CJK UNIFIED IDEOGRAPH +0xE048 0x6F6F #CJK UNIFIED IDEOGRAPH +0xE049 0x6F5B #CJK UNIFIED IDEOGRAPH +0xE04A 0x6FF3 #CJK UNIFIED IDEOGRAPH +0xE04B 0x6F6D #CJK UNIFIED IDEOGRAPH +0xE04C 0x6F82 #CJK UNIFIED IDEOGRAPH +0xE04D 0x6F7C #CJK UNIFIED IDEOGRAPH +0xE04E 0x6F58 #CJK UNIFIED IDEOGRAPH +0xE04F 0x6F8E #CJK UNIFIED IDEOGRAPH +0xE050 0x6F91 #CJK UNIFIED IDEOGRAPH +0xE051 0x6FC2 #CJK UNIFIED IDEOGRAPH +0xE052 0x6F66 #CJK UNIFIED IDEOGRAPH +0xE053 0x6FB3 #CJK UNIFIED IDEOGRAPH +0xE054 0x6FA3 #CJK UNIFIED IDEOGRAPH +0xE055 0x6FA1 #CJK UNIFIED IDEOGRAPH +0xE056 0x6FA4 #CJK UNIFIED IDEOGRAPH +0xE057 0x6FB9 #CJK UNIFIED IDEOGRAPH +0xE058 0x6FC6 #CJK UNIFIED IDEOGRAPH +0xE059 0x6FAA #CJK UNIFIED IDEOGRAPH +0xE05A 0x6FDF #CJK UNIFIED IDEOGRAPH +0xE05B 0x6FD5 #CJK UNIFIED IDEOGRAPH +0xE05C 0x6FEC #CJK UNIFIED IDEOGRAPH +0xE05D 0x6FD4 #CJK UNIFIED IDEOGRAPH +0xE05E 0x6FD8 #CJK UNIFIED IDEOGRAPH +0xE05F 0x6FF1 #CJK UNIFIED IDEOGRAPH +0xE060 0x6FEE #CJK UNIFIED IDEOGRAPH +0xE061 0x6FDB #CJK UNIFIED IDEOGRAPH +0xE062 0x7009 #CJK UNIFIED IDEOGRAPH +0xE063 0x700B #CJK UNIFIED IDEOGRAPH +0xE064 0x6FFA #CJK UNIFIED IDEOGRAPH +0xE065 0x7011 #CJK UNIFIED IDEOGRAPH +0xE066 0x7001 #CJK UNIFIED IDEOGRAPH +0xE067 0x700F #CJK UNIFIED IDEOGRAPH +0xE068 0x6FFE #CJK UNIFIED IDEOGRAPH +0xE069 0x701B #CJK UNIFIED IDEOGRAPH +0xE06A 0x701A #CJK UNIFIED IDEOGRAPH +0xE06B 0x6F74 #CJK UNIFIED IDEOGRAPH +0xE06C 0x701D #CJK UNIFIED IDEOGRAPH +0xE06D 0x7018 #CJK UNIFIED IDEOGRAPH +0xE06E 0x701F #CJK UNIFIED IDEOGRAPH +0xE06F 0x7030 #CJK UNIFIED IDEOGRAPH +0xE070 0x703E #CJK UNIFIED IDEOGRAPH +0xE071 0x7032 #CJK UNIFIED IDEOGRAPH +0xE072 0x7051 #CJK UNIFIED IDEOGRAPH +0xE073 0x7063 #CJK UNIFIED IDEOGRAPH +0xE074 0x7099 #CJK UNIFIED IDEOGRAPH +0xE075 0x7092 #CJK UNIFIED IDEOGRAPH +0xE076 0x70AF #CJK UNIFIED IDEOGRAPH +0xE077 0x70F1 #CJK UNIFIED IDEOGRAPH +0xE078 0x70AC #CJK UNIFIED IDEOGRAPH +0xE079 0x70B8 #CJK UNIFIED IDEOGRAPH +0xE07A 0x70B3 #CJK UNIFIED IDEOGRAPH +0xE07B 0x70AE #CJK UNIFIED IDEOGRAPH +0xE07C 0x70DF #CJK UNIFIED IDEOGRAPH +0xE07D 0x70CB #CJK UNIFIED IDEOGRAPH +0xE07E 0x70DD #CJK UNIFIED IDEOGRAPH +0xE080 0x70D9 #CJK UNIFIED IDEOGRAPH +0xE081 0x7109 #CJK UNIFIED IDEOGRAPH +0xE082 0x70FD #CJK UNIFIED IDEOGRAPH +0xE083 0x711C #CJK UNIFIED IDEOGRAPH +0xE084 0x7119 #CJK UNIFIED IDEOGRAPH +0xE085 0x7165 #CJK UNIFIED IDEOGRAPH +0xE086 0x7155 #CJK UNIFIED IDEOGRAPH +0xE087 0x7188 #CJK UNIFIED IDEOGRAPH +0xE088 0x7166 #CJK UNIFIED IDEOGRAPH +0xE089 0x7162 #CJK UNIFIED IDEOGRAPH +0xE08A 0x714C #CJK UNIFIED IDEOGRAPH +0xE08B 0x7156 #CJK UNIFIED IDEOGRAPH +0xE08C 0x716C #CJK UNIFIED IDEOGRAPH +0xE08D 0x718F #CJK UNIFIED IDEOGRAPH +0xE08E 0x71FB #CJK UNIFIED IDEOGRAPH +0xE08F 0x7184 #CJK UNIFIED IDEOGRAPH +0xE090 0x7195 #CJK UNIFIED IDEOGRAPH +0xE091 0x71A8 #CJK UNIFIED IDEOGRAPH +0xE092 0x71AC #CJK UNIFIED IDEOGRAPH +0xE093 0x71D7 #CJK UNIFIED IDEOGRAPH +0xE094 0x71B9 #CJK UNIFIED IDEOGRAPH +0xE095 0x71BE #CJK UNIFIED IDEOGRAPH +0xE096 0x71D2 #CJK UNIFIED IDEOGRAPH +0xE097 0x71C9 #CJK UNIFIED IDEOGRAPH +0xE098 0x71D4 #CJK UNIFIED IDEOGRAPH +0xE099 0x71CE #CJK UNIFIED IDEOGRAPH +0xE09A 0x71E0 #CJK UNIFIED IDEOGRAPH +0xE09B 0x71EC #CJK UNIFIED IDEOGRAPH +0xE09C 0x71E7 #CJK UNIFIED IDEOGRAPH +0xE09D 0x71F5 #CJK UNIFIED IDEOGRAPH +0xE09E 0x71FC #CJK UNIFIED IDEOGRAPH +0xE09F 0x71F9 #CJK UNIFIED IDEOGRAPH +0xE0A0 0x71FF #CJK UNIFIED IDEOGRAPH +0xE0A1 0x720D #CJK UNIFIED IDEOGRAPH +0xE0A2 0x7210 #CJK UNIFIED IDEOGRAPH +0xE0A3 0x721B #CJK UNIFIED IDEOGRAPH +0xE0A4 0x7228 #CJK UNIFIED IDEOGRAPH +0xE0A5 0x722D #CJK UNIFIED IDEOGRAPH +0xE0A6 0x722C #CJK UNIFIED IDEOGRAPH +0xE0A7 0x7230 #CJK UNIFIED IDEOGRAPH +0xE0A8 0x7232 #CJK UNIFIED IDEOGRAPH +0xE0A9 0x723B #CJK UNIFIED IDEOGRAPH +0xE0AA 0x723C #CJK UNIFIED IDEOGRAPH +0xE0AB 0x723F #CJK UNIFIED IDEOGRAPH +0xE0AC 0x7240 #CJK UNIFIED IDEOGRAPH +0xE0AD 0x7246 #CJK UNIFIED IDEOGRAPH +0xE0AE 0x724B #CJK UNIFIED IDEOGRAPH +0xE0AF 0x7258 #CJK UNIFIED IDEOGRAPH +0xE0B0 0x7274 #CJK UNIFIED IDEOGRAPH +0xE0B1 0x727E #CJK UNIFIED IDEOGRAPH +0xE0B2 0x7282 #CJK UNIFIED IDEOGRAPH +0xE0B3 0x7281 #CJK UNIFIED IDEOGRAPH +0xE0B4 0x7287 #CJK UNIFIED IDEOGRAPH +0xE0B5 0x7292 #CJK UNIFIED IDEOGRAPH +0xE0B6 0x7296 #CJK UNIFIED IDEOGRAPH +0xE0B7 0x72A2 #CJK UNIFIED IDEOGRAPH +0xE0B8 0x72A7 #CJK UNIFIED IDEOGRAPH +0xE0B9 0x72B9 #CJK UNIFIED IDEOGRAPH +0xE0BA 0x72B2 #CJK UNIFIED IDEOGRAPH +0xE0BB 0x72C3 #CJK UNIFIED IDEOGRAPH +0xE0BC 0x72C6 #CJK UNIFIED IDEOGRAPH +0xE0BD 0x72C4 #CJK UNIFIED IDEOGRAPH +0xE0BE 0x72CE #CJK UNIFIED IDEOGRAPH +0xE0BF 0x72D2 #CJK UNIFIED IDEOGRAPH +0xE0C0 0x72E2 #CJK UNIFIED IDEOGRAPH +0xE0C1 0x72E0 #CJK UNIFIED IDEOGRAPH +0xE0C2 0x72E1 #CJK UNIFIED IDEOGRAPH +0xE0C3 0x72F9 #CJK UNIFIED IDEOGRAPH +0xE0C4 0x72F7 #CJK UNIFIED IDEOGRAPH +0xE0C5 0x500F #CJK UNIFIED IDEOGRAPH +0xE0C6 0x7317 #CJK UNIFIED IDEOGRAPH +0xE0C7 0x730A #CJK UNIFIED IDEOGRAPH +0xE0C8 0x731C #CJK UNIFIED IDEOGRAPH +0xE0C9 0x7316 #CJK UNIFIED IDEOGRAPH +0xE0CA 0x731D #CJK UNIFIED IDEOGRAPH +0xE0CB 0x7334 #CJK UNIFIED IDEOGRAPH +0xE0CC 0x732F #CJK UNIFIED IDEOGRAPH +0xE0CD 0x7329 #CJK UNIFIED IDEOGRAPH +0xE0CE 0x7325 #CJK UNIFIED IDEOGRAPH +0xE0CF 0x733E #CJK UNIFIED IDEOGRAPH +0xE0D0 0x734E #CJK UNIFIED IDEOGRAPH +0xE0D1 0x734F #CJK UNIFIED IDEOGRAPH +0xE0D2 0x9ED8 #CJK UNIFIED IDEOGRAPH +0xE0D3 0x7357 #CJK UNIFIED IDEOGRAPH +0xE0D4 0x736A #CJK UNIFIED IDEOGRAPH +0xE0D5 0x7368 #CJK UNIFIED IDEOGRAPH +0xE0D6 0x7370 #CJK UNIFIED IDEOGRAPH +0xE0D7 0x7378 #CJK UNIFIED IDEOGRAPH +0xE0D8 0x7375 #CJK UNIFIED IDEOGRAPH +0xE0D9 0x737B #CJK UNIFIED IDEOGRAPH +0xE0DA 0x737A #CJK UNIFIED IDEOGRAPH +0xE0DB 0x73C8 #CJK UNIFIED IDEOGRAPH +0xE0DC 0x73B3 #CJK UNIFIED IDEOGRAPH +0xE0DD 0x73CE #CJK UNIFIED IDEOGRAPH +0xE0DE 0x73BB #CJK UNIFIED IDEOGRAPH +0xE0DF 0x73C0 #CJK UNIFIED IDEOGRAPH +0xE0E0 0x73E5 #CJK UNIFIED IDEOGRAPH +0xE0E1 0x73EE #CJK UNIFIED IDEOGRAPH +0xE0E2 0x73DE #CJK UNIFIED IDEOGRAPH +0xE0E3 0x74A2 #CJK UNIFIED IDEOGRAPH +0xE0E4 0x7405 #CJK UNIFIED IDEOGRAPH +0xE0E5 0x746F #CJK UNIFIED IDEOGRAPH +0xE0E6 0x7425 #CJK UNIFIED IDEOGRAPH +0xE0E7 0x73F8 #CJK UNIFIED IDEOGRAPH +0xE0E8 0x7432 #CJK UNIFIED IDEOGRAPH +0xE0E9 0x743A #CJK UNIFIED IDEOGRAPH +0xE0EA 0x7455 #CJK UNIFIED IDEOGRAPH +0xE0EB 0x743F #CJK UNIFIED IDEOGRAPH +0xE0EC 0x745F #CJK UNIFIED IDEOGRAPH +0xE0ED 0x7459 #CJK UNIFIED IDEOGRAPH +0xE0EE 0x7441 #CJK UNIFIED IDEOGRAPH +0xE0EF 0x745C #CJK UNIFIED IDEOGRAPH +0xE0F0 0x7469 #CJK UNIFIED IDEOGRAPH +0xE0F1 0x7470 #CJK UNIFIED IDEOGRAPH +0xE0F2 0x7463 #CJK UNIFIED IDEOGRAPH +0xE0F3 0x746A #CJK UNIFIED IDEOGRAPH +0xE0F4 0x7476 #CJK UNIFIED IDEOGRAPH +0xE0F5 0x747E #CJK UNIFIED IDEOGRAPH +0xE0F6 0x748B #CJK UNIFIED IDEOGRAPH +0xE0F7 0x749E #CJK UNIFIED IDEOGRAPH +0xE0F8 0x74A7 #CJK UNIFIED IDEOGRAPH +0xE0F9 0x74CA #CJK UNIFIED IDEOGRAPH +0xE0FA 0x74CF #CJK UNIFIED IDEOGRAPH +0xE0FB 0x74D4 #CJK UNIFIED IDEOGRAPH +0xE0FC 0x73F1 #CJK UNIFIED IDEOGRAPH +0xE140 0x74E0 #CJK UNIFIED IDEOGRAPH +0xE141 0x74E3 #CJK UNIFIED IDEOGRAPH +0xE142 0x74E7 #CJK UNIFIED IDEOGRAPH +0xE143 0x74E9 #CJK UNIFIED IDEOGRAPH +0xE144 0x74EE #CJK UNIFIED IDEOGRAPH +0xE145 0x74F2 #CJK UNIFIED IDEOGRAPH +0xE146 0x74F0 #CJK UNIFIED IDEOGRAPH +0xE147 0x74F1 #CJK UNIFIED IDEOGRAPH +0xE148 0x74F8 #CJK UNIFIED IDEOGRAPH +0xE149 0x74F7 #CJK UNIFIED IDEOGRAPH +0xE14A 0x7504 #CJK UNIFIED IDEOGRAPH +0xE14B 0x7503 #CJK UNIFIED IDEOGRAPH +0xE14C 0x7505 #CJK UNIFIED IDEOGRAPH +0xE14D 0x750C #CJK UNIFIED IDEOGRAPH +0xE14E 0x750E #CJK UNIFIED IDEOGRAPH +0xE14F 0x750D #CJK UNIFIED IDEOGRAPH +0xE150 0x7515 #CJK UNIFIED IDEOGRAPH +0xE151 0x7513 #CJK UNIFIED IDEOGRAPH +0xE152 0x751E #CJK UNIFIED IDEOGRAPH +0xE153 0x7526 #CJK UNIFIED IDEOGRAPH +0xE154 0x752C #CJK UNIFIED IDEOGRAPH +0xE155 0x753C #CJK UNIFIED IDEOGRAPH +0xE156 0x7544 #CJK UNIFIED IDEOGRAPH +0xE157 0x754D #CJK UNIFIED IDEOGRAPH +0xE158 0x754A #CJK UNIFIED IDEOGRAPH +0xE159 0x7549 #CJK UNIFIED IDEOGRAPH +0xE15A 0x755B #CJK UNIFIED IDEOGRAPH +0xE15B 0x7546 #CJK UNIFIED IDEOGRAPH +0xE15C 0x755A #CJK UNIFIED IDEOGRAPH +0xE15D 0x7569 #CJK UNIFIED IDEOGRAPH +0xE15E 0x7564 #CJK UNIFIED IDEOGRAPH +0xE15F 0x7567 #CJK UNIFIED IDEOGRAPH +0xE160 0x756B #CJK UNIFIED IDEOGRAPH +0xE161 0x756D #CJK UNIFIED IDEOGRAPH +0xE162 0x7578 #CJK UNIFIED IDEOGRAPH +0xE163 0x7576 #CJK UNIFIED IDEOGRAPH +0xE164 0x7586 #CJK UNIFIED IDEOGRAPH +0xE165 0x7587 #CJK UNIFIED IDEOGRAPH +0xE166 0x7574 #CJK UNIFIED IDEOGRAPH +0xE167 0x758A #CJK UNIFIED IDEOGRAPH +0xE168 0x7589 #CJK UNIFIED IDEOGRAPH +0xE169 0x7582 #CJK UNIFIED IDEOGRAPH +0xE16A 0x7594 #CJK UNIFIED IDEOGRAPH +0xE16B 0x759A #CJK UNIFIED IDEOGRAPH +0xE16C 0x759D #CJK UNIFIED IDEOGRAPH +0xE16D 0x75A5 #CJK UNIFIED IDEOGRAPH +0xE16E 0x75A3 #CJK UNIFIED IDEOGRAPH +0xE16F 0x75C2 #CJK UNIFIED IDEOGRAPH +0xE170 0x75B3 #CJK UNIFIED IDEOGRAPH +0xE171 0x75C3 #CJK UNIFIED IDEOGRAPH +0xE172 0x75B5 #CJK UNIFIED IDEOGRAPH +0xE173 0x75BD #CJK UNIFIED IDEOGRAPH +0xE174 0x75B8 #CJK UNIFIED IDEOGRAPH +0xE175 0x75BC #CJK UNIFIED IDEOGRAPH +0xE176 0x75B1 #CJK UNIFIED IDEOGRAPH +0xE177 0x75CD #CJK UNIFIED IDEOGRAPH +0xE178 0x75CA #CJK UNIFIED IDEOGRAPH +0xE179 0x75D2 #CJK UNIFIED IDEOGRAPH +0xE17A 0x75D9 #CJK UNIFIED IDEOGRAPH +0xE17B 0x75E3 #CJK UNIFIED IDEOGRAPH +0xE17C 0x75DE #CJK UNIFIED IDEOGRAPH +0xE17D 0x75FE #CJK UNIFIED IDEOGRAPH +0xE17E 0x75FF #CJK UNIFIED IDEOGRAPH +0xE180 0x75FC #CJK UNIFIED IDEOGRAPH +0xE181 0x7601 #CJK UNIFIED IDEOGRAPH +0xE182 0x75F0 #CJK UNIFIED IDEOGRAPH +0xE183 0x75FA #CJK UNIFIED IDEOGRAPH +0xE184 0x75F2 #CJK UNIFIED IDEOGRAPH +0xE185 0x75F3 #CJK UNIFIED IDEOGRAPH +0xE186 0x760B #CJK UNIFIED IDEOGRAPH +0xE187 0x760D #CJK UNIFIED IDEOGRAPH +0xE188 0x7609 #CJK UNIFIED IDEOGRAPH +0xE189 0x761F #CJK UNIFIED IDEOGRAPH +0xE18A 0x7627 #CJK UNIFIED IDEOGRAPH +0xE18B 0x7620 #CJK UNIFIED IDEOGRAPH +0xE18C 0x7621 #CJK UNIFIED IDEOGRAPH +0xE18D 0x7622 #CJK UNIFIED IDEOGRAPH +0xE18E 0x7624 #CJK UNIFIED IDEOGRAPH +0xE18F 0x7634 #CJK UNIFIED IDEOGRAPH +0xE190 0x7630 #CJK UNIFIED IDEOGRAPH +0xE191 0x763B #CJK UNIFIED IDEOGRAPH +0xE192 0x7647 #CJK UNIFIED IDEOGRAPH +0xE193 0x7648 #CJK UNIFIED IDEOGRAPH +0xE194 0x7646 #CJK UNIFIED IDEOGRAPH +0xE195 0x765C #CJK UNIFIED IDEOGRAPH +0xE196 0x7658 #CJK UNIFIED IDEOGRAPH +0xE197 0x7661 #CJK UNIFIED IDEOGRAPH +0xE198 0x7662 #CJK UNIFIED IDEOGRAPH +0xE199 0x7668 #CJK UNIFIED IDEOGRAPH +0xE19A 0x7669 #CJK UNIFIED IDEOGRAPH +0xE19B 0x766A #CJK UNIFIED IDEOGRAPH +0xE19C 0x7667 #CJK UNIFIED IDEOGRAPH +0xE19D 0x766C #CJK UNIFIED IDEOGRAPH +0xE19E 0x7670 #CJK UNIFIED IDEOGRAPH +0xE19F 0x7672 #CJK UNIFIED IDEOGRAPH +0xE1A0 0x7676 #CJK UNIFIED IDEOGRAPH +0xE1A1 0x7678 #CJK UNIFIED IDEOGRAPH +0xE1A2 0x767C #CJK UNIFIED IDEOGRAPH +0xE1A3 0x7680 #CJK UNIFIED IDEOGRAPH +0xE1A4 0x7683 #CJK UNIFIED IDEOGRAPH +0xE1A5 0x7688 #CJK UNIFIED IDEOGRAPH +0xE1A6 0x768B #CJK UNIFIED IDEOGRAPH +0xE1A7 0x768E #CJK UNIFIED IDEOGRAPH +0xE1A8 0x7696 #CJK UNIFIED IDEOGRAPH +0xE1A9 0x7693 #CJK UNIFIED IDEOGRAPH +0xE1AA 0x7699 #CJK UNIFIED IDEOGRAPH +0xE1AB 0x769A #CJK UNIFIED IDEOGRAPH +0xE1AC 0x76B0 #CJK UNIFIED IDEOGRAPH +0xE1AD 0x76B4 #CJK UNIFIED IDEOGRAPH +0xE1AE 0x76B8 #CJK UNIFIED IDEOGRAPH +0xE1AF 0x76B9 #CJK UNIFIED IDEOGRAPH +0xE1B0 0x76BA #CJK UNIFIED IDEOGRAPH +0xE1B1 0x76C2 #CJK UNIFIED IDEOGRAPH +0xE1B2 0x76CD #CJK UNIFIED IDEOGRAPH +0xE1B3 0x76D6 #CJK UNIFIED IDEOGRAPH +0xE1B4 0x76D2 #CJK UNIFIED IDEOGRAPH +0xE1B5 0x76DE #CJK UNIFIED IDEOGRAPH +0xE1B6 0x76E1 #CJK UNIFIED IDEOGRAPH +0xE1B7 0x76E5 #CJK UNIFIED IDEOGRAPH +0xE1B8 0x76E7 #CJK UNIFIED IDEOGRAPH +0xE1B9 0x76EA #CJK UNIFIED IDEOGRAPH +0xE1BA 0x862F #CJK UNIFIED IDEOGRAPH +0xE1BB 0x76FB #CJK UNIFIED IDEOGRAPH +0xE1BC 0x7708 #CJK UNIFIED IDEOGRAPH +0xE1BD 0x7707 #CJK UNIFIED IDEOGRAPH +0xE1BE 0x7704 #CJK UNIFIED IDEOGRAPH +0xE1BF 0x7729 #CJK UNIFIED IDEOGRAPH +0xE1C0 0x7724 #CJK UNIFIED IDEOGRAPH +0xE1C1 0x771E #CJK UNIFIED IDEOGRAPH +0xE1C2 0x7725 #CJK UNIFIED IDEOGRAPH +0xE1C3 0x7726 #CJK UNIFIED IDEOGRAPH +0xE1C4 0x771B #CJK UNIFIED IDEOGRAPH +0xE1C5 0x7737 #CJK UNIFIED IDEOGRAPH +0xE1C6 0x7738 #CJK UNIFIED IDEOGRAPH +0xE1C7 0x7747 #CJK UNIFIED IDEOGRAPH +0xE1C8 0x775A #CJK UNIFIED IDEOGRAPH +0xE1C9 0x7768 #CJK UNIFIED IDEOGRAPH +0xE1CA 0x776B #CJK UNIFIED IDEOGRAPH +0xE1CB 0x775B #CJK UNIFIED IDEOGRAPH +0xE1CC 0x7765 #CJK UNIFIED IDEOGRAPH +0xE1CD 0x777F #CJK UNIFIED IDEOGRAPH +0xE1CE 0x777E #CJK UNIFIED IDEOGRAPH +0xE1CF 0x7779 #CJK UNIFIED IDEOGRAPH +0xE1D0 0x778E #CJK UNIFIED IDEOGRAPH +0xE1D1 0x778B #CJK UNIFIED IDEOGRAPH +0xE1D2 0x7791 #CJK UNIFIED IDEOGRAPH +0xE1D3 0x77A0 #CJK UNIFIED IDEOGRAPH +0xE1D4 0x779E #CJK UNIFIED IDEOGRAPH +0xE1D5 0x77B0 #CJK UNIFIED IDEOGRAPH +0xE1D6 0x77B6 #CJK UNIFIED IDEOGRAPH +0xE1D7 0x77B9 #CJK UNIFIED IDEOGRAPH +0xE1D8 0x77BF #CJK UNIFIED IDEOGRAPH +0xE1D9 0x77BC #CJK UNIFIED IDEOGRAPH +0xE1DA 0x77BD #CJK UNIFIED IDEOGRAPH +0xE1DB 0x77BB #CJK UNIFIED IDEOGRAPH +0xE1DC 0x77C7 #CJK UNIFIED IDEOGRAPH +0xE1DD 0x77CD #CJK UNIFIED IDEOGRAPH +0xE1DE 0x77D7 #CJK UNIFIED IDEOGRAPH +0xE1DF 0x77DA #CJK UNIFIED IDEOGRAPH +0xE1E0 0x77DC #CJK UNIFIED IDEOGRAPH +0xE1E1 0x77E3 #CJK UNIFIED IDEOGRAPH +0xE1E2 0x77EE #CJK UNIFIED IDEOGRAPH +0xE1E3 0x77FC #CJK UNIFIED IDEOGRAPH +0xE1E4 0x780C #CJK UNIFIED IDEOGRAPH +0xE1E5 0x7812 #CJK UNIFIED IDEOGRAPH +0xE1E6 0x7926 #CJK UNIFIED IDEOGRAPH +0xE1E7 0x7820 #CJK UNIFIED IDEOGRAPH +0xE1E8 0x792A #CJK UNIFIED IDEOGRAPH +0xE1E9 0x7845 #CJK UNIFIED IDEOGRAPH +0xE1EA 0x788E #CJK UNIFIED IDEOGRAPH +0xE1EB 0x7874 #CJK UNIFIED IDEOGRAPH +0xE1EC 0x7886 #CJK UNIFIED IDEOGRAPH +0xE1ED 0x787C #CJK UNIFIED IDEOGRAPH +0xE1EE 0x789A #CJK UNIFIED IDEOGRAPH +0xE1EF 0x788C #CJK UNIFIED IDEOGRAPH +0xE1F0 0x78A3 #CJK UNIFIED IDEOGRAPH +0xE1F1 0x78B5 #CJK UNIFIED IDEOGRAPH +0xE1F2 0x78AA #CJK UNIFIED IDEOGRAPH +0xE1F3 0x78AF #CJK UNIFIED IDEOGRAPH +0xE1F4 0x78D1 #CJK UNIFIED IDEOGRAPH +0xE1F5 0x78C6 #CJK UNIFIED IDEOGRAPH +0xE1F6 0x78CB #CJK UNIFIED IDEOGRAPH +0xE1F7 0x78D4 #CJK UNIFIED IDEOGRAPH +0xE1F8 0x78BE #CJK UNIFIED IDEOGRAPH +0xE1F9 0x78BC #CJK UNIFIED IDEOGRAPH +0xE1FA 0x78C5 #CJK UNIFIED IDEOGRAPH +0xE1FB 0x78CA #CJK UNIFIED IDEOGRAPH +0xE1FC 0x78EC #CJK UNIFIED IDEOGRAPH +0xE240 0x78E7 #CJK UNIFIED IDEOGRAPH +0xE241 0x78DA #CJK UNIFIED IDEOGRAPH +0xE242 0x78FD #CJK UNIFIED IDEOGRAPH +0xE243 0x78F4 #CJK UNIFIED IDEOGRAPH +0xE244 0x7907 #CJK UNIFIED IDEOGRAPH +0xE245 0x7912 #CJK UNIFIED IDEOGRAPH +0xE246 0x7911 #CJK UNIFIED IDEOGRAPH +0xE247 0x7919 #CJK UNIFIED IDEOGRAPH +0xE248 0x792C #CJK UNIFIED IDEOGRAPH +0xE249 0x792B #CJK UNIFIED IDEOGRAPH +0xE24A 0x7940 #CJK UNIFIED IDEOGRAPH +0xE24B 0x7960 #CJK UNIFIED IDEOGRAPH +0xE24C 0x7957 #CJK UNIFIED IDEOGRAPH +0xE24D 0x795F #CJK UNIFIED IDEOGRAPH +0xE24E 0x795A #CJK UNIFIED IDEOGRAPH +0xE24F 0x7955 #CJK UNIFIED IDEOGRAPH +0xE250 0x7953 #CJK UNIFIED IDEOGRAPH +0xE251 0x797A #CJK UNIFIED IDEOGRAPH +0xE252 0x797F #CJK UNIFIED IDEOGRAPH +0xE253 0x798A #CJK UNIFIED IDEOGRAPH +0xE254 0x799D #CJK UNIFIED IDEOGRAPH +0xE255 0x79A7 #CJK UNIFIED IDEOGRAPH +0xE256 0x9F4B #CJK UNIFIED IDEOGRAPH +0xE257 0x79AA #CJK UNIFIED IDEOGRAPH +0xE258 0x79AE #CJK UNIFIED IDEOGRAPH +0xE259 0x79B3 #CJK UNIFIED IDEOGRAPH +0xE25A 0x79B9 #CJK UNIFIED IDEOGRAPH +0xE25B 0x79BA #CJK UNIFIED IDEOGRAPH +0xE25C 0x79C9 #CJK UNIFIED IDEOGRAPH +0xE25D 0x79D5 #CJK UNIFIED IDEOGRAPH +0xE25E 0x79E7 #CJK UNIFIED IDEOGRAPH +0xE25F 0x79EC #CJK UNIFIED IDEOGRAPH +0xE260 0x79E1 #CJK UNIFIED IDEOGRAPH +0xE261 0x79E3 #CJK UNIFIED IDEOGRAPH +0xE262 0x7A08 #CJK UNIFIED IDEOGRAPH +0xE263 0x7A0D #CJK UNIFIED IDEOGRAPH +0xE264 0x7A18 #CJK UNIFIED IDEOGRAPH +0xE265 0x7A19 #CJK UNIFIED IDEOGRAPH +0xE266 0x7A20 #CJK UNIFIED IDEOGRAPH +0xE267 0x7A1F #CJK UNIFIED IDEOGRAPH +0xE268 0x7980 #CJK UNIFIED IDEOGRAPH +0xE269 0x7A31 #CJK UNIFIED IDEOGRAPH +0xE26A 0x7A3B #CJK UNIFIED IDEOGRAPH +0xE26B 0x7A3E #CJK UNIFIED IDEOGRAPH +0xE26C 0x7A37 #CJK UNIFIED IDEOGRAPH +0xE26D 0x7A43 #CJK UNIFIED IDEOGRAPH +0xE26E 0x7A57 #CJK UNIFIED IDEOGRAPH +0xE26F 0x7A49 #CJK UNIFIED IDEOGRAPH +0xE270 0x7A61 #CJK UNIFIED IDEOGRAPH +0xE271 0x7A62 #CJK UNIFIED IDEOGRAPH +0xE272 0x7A69 #CJK UNIFIED IDEOGRAPH +0xE273 0x9F9D #CJK UNIFIED IDEOGRAPH +0xE274 0x7A70 #CJK UNIFIED IDEOGRAPH +0xE275 0x7A79 #CJK UNIFIED IDEOGRAPH +0xE276 0x7A7D #CJK UNIFIED IDEOGRAPH +0xE277 0x7A88 #CJK UNIFIED IDEOGRAPH +0xE278 0x7A97 #CJK UNIFIED IDEOGRAPH +0xE279 0x7A95 #CJK UNIFIED IDEOGRAPH +0xE27A 0x7A98 #CJK UNIFIED IDEOGRAPH +0xE27B 0x7A96 #CJK UNIFIED IDEOGRAPH +0xE27C 0x7AA9 #CJK UNIFIED IDEOGRAPH +0xE27D 0x7AC8 #CJK UNIFIED IDEOGRAPH +0xE27E 0x7AB0 #CJK UNIFIED IDEOGRAPH +0xE280 0x7AB6 #CJK UNIFIED IDEOGRAPH +0xE281 0x7AC5 #CJK UNIFIED IDEOGRAPH +0xE282 0x7AC4 #CJK UNIFIED IDEOGRAPH +0xE283 0x7ABF #CJK UNIFIED IDEOGRAPH +0xE284 0x9083 #CJK UNIFIED IDEOGRAPH +0xE285 0x7AC7 #CJK UNIFIED IDEOGRAPH +0xE286 0x7ACA #CJK UNIFIED IDEOGRAPH +0xE287 0x7ACD #CJK UNIFIED IDEOGRAPH +0xE288 0x7ACF #CJK UNIFIED IDEOGRAPH +0xE289 0x7AD5 #CJK UNIFIED IDEOGRAPH +0xE28A 0x7AD3 #CJK UNIFIED IDEOGRAPH +0xE28B 0x7AD9 #CJK UNIFIED IDEOGRAPH +0xE28C 0x7ADA #CJK UNIFIED IDEOGRAPH +0xE28D 0x7ADD #CJK UNIFIED IDEOGRAPH +0xE28E 0x7AE1 #CJK UNIFIED IDEOGRAPH +0xE28F 0x7AE2 #CJK UNIFIED IDEOGRAPH +0xE290 0x7AE6 #CJK UNIFIED IDEOGRAPH +0xE291 0x7AED #CJK UNIFIED IDEOGRAPH +0xE292 0x7AF0 #CJK UNIFIED IDEOGRAPH +0xE293 0x7B02 #CJK UNIFIED IDEOGRAPH +0xE294 0x7B0F #CJK UNIFIED IDEOGRAPH +0xE295 0x7B0A #CJK UNIFIED IDEOGRAPH +0xE296 0x7B06 #CJK UNIFIED IDEOGRAPH +0xE297 0x7B33 #CJK UNIFIED IDEOGRAPH +0xE298 0x7B18 #CJK UNIFIED IDEOGRAPH +0xE299 0x7B19 #CJK UNIFIED IDEOGRAPH +0xE29A 0x7B1E #CJK UNIFIED IDEOGRAPH +0xE29B 0x7B35 #CJK UNIFIED IDEOGRAPH +0xE29C 0x7B28 #CJK UNIFIED IDEOGRAPH +0xE29D 0x7B36 #CJK UNIFIED IDEOGRAPH +0xE29E 0x7B50 #CJK UNIFIED IDEOGRAPH +0xE29F 0x7B7A #CJK UNIFIED IDEOGRAPH +0xE2A0 0x7B04 #CJK UNIFIED IDEOGRAPH +0xE2A1 0x7B4D #CJK UNIFIED IDEOGRAPH +0xE2A2 0x7B0B #CJK UNIFIED IDEOGRAPH +0xE2A3 0x7B4C #CJK UNIFIED IDEOGRAPH +0xE2A4 0x7B45 #CJK UNIFIED IDEOGRAPH +0xE2A5 0x7B75 #CJK UNIFIED IDEOGRAPH +0xE2A6 0x7B65 #CJK UNIFIED IDEOGRAPH +0xE2A7 0x7B74 #CJK UNIFIED IDEOGRAPH +0xE2A8 0x7B67 #CJK UNIFIED IDEOGRAPH +0xE2A9 0x7B70 #CJK UNIFIED IDEOGRAPH +0xE2AA 0x7B71 #CJK UNIFIED IDEOGRAPH +0xE2AB 0x7B6C #CJK UNIFIED IDEOGRAPH +0xE2AC 0x7B6E #CJK UNIFIED IDEOGRAPH +0xE2AD 0x7B9D #CJK UNIFIED IDEOGRAPH +0xE2AE 0x7B98 #CJK UNIFIED IDEOGRAPH +0xE2AF 0x7B9F #CJK UNIFIED IDEOGRAPH +0xE2B0 0x7B8D #CJK UNIFIED IDEOGRAPH +0xE2B1 0x7B9C #CJK UNIFIED IDEOGRAPH +0xE2B2 0x7B9A #CJK UNIFIED IDEOGRAPH +0xE2B3 0x7B8B #CJK UNIFIED IDEOGRAPH +0xE2B4 0x7B92 #CJK UNIFIED IDEOGRAPH +0xE2B5 0x7B8F #CJK UNIFIED IDEOGRAPH +0xE2B6 0x7B5D #CJK UNIFIED IDEOGRAPH +0xE2B7 0x7B99 #CJK UNIFIED IDEOGRAPH +0xE2B8 0x7BCB #CJK UNIFIED IDEOGRAPH +0xE2B9 0x7BC1 #CJK UNIFIED IDEOGRAPH +0xE2BA 0x7BCC #CJK UNIFIED IDEOGRAPH +0xE2BB 0x7BCF #CJK UNIFIED IDEOGRAPH +0xE2BC 0x7BB4 #CJK UNIFIED IDEOGRAPH +0xE2BD 0x7BC6 #CJK UNIFIED IDEOGRAPH +0xE2BE 0x7BDD #CJK UNIFIED IDEOGRAPH +0xE2BF 0x7BE9 #CJK UNIFIED IDEOGRAPH +0xE2C0 0x7C11 #CJK UNIFIED IDEOGRAPH +0xE2C1 0x7C14 #CJK UNIFIED IDEOGRAPH +0xE2C2 0x7BE6 #CJK UNIFIED IDEOGRAPH +0xE2C3 0x7BE5 #CJK UNIFIED IDEOGRAPH +0xE2C4 0x7C60 #CJK UNIFIED IDEOGRAPH +0xE2C5 0x7C00 #CJK UNIFIED IDEOGRAPH +0xE2C6 0x7C07 #CJK UNIFIED IDEOGRAPH +0xE2C7 0x7C13 #CJK UNIFIED IDEOGRAPH +0xE2C8 0x7BF3 #CJK UNIFIED IDEOGRAPH +0xE2C9 0x7BF7 #CJK UNIFIED IDEOGRAPH +0xE2CA 0x7C17 #CJK UNIFIED IDEOGRAPH +0xE2CB 0x7C0D #CJK UNIFIED IDEOGRAPH +0xE2CC 0x7BF6 #CJK UNIFIED IDEOGRAPH +0xE2CD 0x7C23 #CJK UNIFIED IDEOGRAPH +0xE2CE 0x7C27 #CJK UNIFIED IDEOGRAPH +0xE2CF 0x7C2A #CJK UNIFIED IDEOGRAPH +0xE2D0 0x7C1F #CJK UNIFIED IDEOGRAPH +0xE2D1 0x7C37 #CJK UNIFIED IDEOGRAPH +0xE2D2 0x7C2B #CJK UNIFIED IDEOGRAPH +0xE2D3 0x7C3D #CJK UNIFIED IDEOGRAPH +0xE2D4 0x7C4C #CJK UNIFIED IDEOGRAPH +0xE2D5 0x7C43 #CJK UNIFIED IDEOGRAPH +0xE2D6 0x7C54 #CJK UNIFIED IDEOGRAPH +0xE2D7 0x7C4F #CJK UNIFIED IDEOGRAPH +0xE2D8 0x7C40 #CJK UNIFIED IDEOGRAPH +0xE2D9 0x7C50 #CJK UNIFIED IDEOGRAPH +0xE2DA 0x7C58 #CJK UNIFIED IDEOGRAPH +0xE2DB 0x7C5F #CJK UNIFIED IDEOGRAPH +0xE2DC 0x7C64 #CJK UNIFIED IDEOGRAPH +0xE2DD 0x7C56 #CJK UNIFIED IDEOGRAPH +0xE2DE 0x7C65 #CJK UNIFIED IDEOGRAPH +0xE2DF 0x7C6C #CJK UNIFIED IDEOGRAPH +0xE2E0 0x7C75 #CJK UNIFIED IDEOGRAPH +0xE2E1 0x7C83 #CJK UNIFIED IDEOGRAPH +0xE2E2 0x7C90 #CJK UNIFIED IDEOGRAPH +0xE2E3 0x7CA4 #CJK UNIFIED IDEOGRAPH +0xE2E4 0x7CAD #CJK UNIFIED IDEOGRAPH +0xE2E5 0x7CA2 #CJK UNIFIED IDEOGRAPH +0xE2E6 0x7CAB #CJK UNIFIED IDEOGRAPH +0xE2E7 0x7CA1 #CJK UNIFIED IDEOGRAPH +0xE2E8 0x7CA8 #CJK UNIFIED IDEOGRAPH +0xE2E9 0x7CB3 #CJK UNIFIED IDEOGRAPH +0xE2EA 0x7CB2 #CJK UNIFIED IDEOGRAPH +0xE2EB 0x7CB1 #CJK UNIFIED IDEOGRAPH +0xE2EC 0x7CAE #CJK UNIFIED IDEOGRAPH +0xE2ED 0x7CB9 #CJK UNIFIED IDEOGRAPH +0xE2EE 0x7CBD #CJK UNIFIED IDEOGRAPH +0xE2EF 0x7CC0 #CJK UNIFIED IDEOGRAPH +0xE2F0 0x7CC5 #CJK UNIFIED IDEOGRAPH +0xE2F1 0x7CC2 #CJK UNIFIED IDEOGRAPH +0xE2F2 0x7CD8 #CJK UNIFIED IDEOGRAPH +0xE2F3 0x7CD2 #CJK UNIFIED IDEOGRAPH +0xE2F4 0x7CDC #CJK UNIFIED IDEOGRAPH +0xE2F5 0x7CE2 #CJK UNIFIED IDEOGRAPH +0xE2F6 0x9B3B #CJK UNIFIED IDEOGRAPH +0xE2F7 0x7CEF #CJK UNIFIED IDEOGRAPH +0xE2F8 0x7CF2 #CJK UNIFIED IDEOGRAPH +0xE2F9 0x7CF4 #CJK UNIFIED IDEOGRAPH +0xE2FA 0x7CF6 #CJK UNIFIED IDEOGRAPH +0xE2FB 0x7CFA #CJK UNIFIED IDEOGRAPH +0xE2FC 0x7D06 #CJK UNIFIED IDEOGRAPH +0xE340 0x7D02 #CJK UNIFIED IDEOGRAPH +0xE341 0x7D1C #CJK UNIFIED IDEOGRAPH +0xE342 0x7D15 #CJK UNIFIED IDEOGRAPH +0xE343 0x7D0A #CJK UNIFIED IDEOGRAPH +0xE344 0x7D45 #CJK UNIFIED IDEOGRAPH +0xE345 0x7D4B #CJK UNIFIED IDEOGRAPH +0xE346 0x7D2E #CJK UNIFIED IDEOGRAPH +0xE347 0x7D32 #CJK UNIFIED IDEOGRAPH +0xE348 0x7D3F #CJK UNIFIED IDEOGRAPH +0xE349 0x7D35 #CJK UNIFIED IDEOGRAPH +0xE34A 0x7D46 #CJK UNIFIED IDEOGRAPH +0xE34B 0x7D73 #CJK UNIFIED IDEOGRAPH +0xE34C 0x7D56 #CJK UNIFIED IDEOGRAPH +0xE34D 0x7D4E #CJK UNIFIED IDEOGRAPH +0xE34E 0x7D72 #CJK UNIFIED IDEOGRAPH +0xE34F 0x7D68 #CJK UNIFIED IDEOGRAPH +0xE350 0x7D6E #CJK UNIFIED IDEOGRAPH +0xE351 0x7D4F #CJK UNIFIED IDEOGRAPH +0xE352 0x7D63 #CJK UNIFIED IDEOGRAPH +0xE353 0x7D93 #CJK UNIFIED IDEOGRAPH +0xE354 0x7D89 #CJK UNIFIED IDEOGRAPH +0xE355 0x7D5B #CJK UNIFIED IDEOGRAPH +0xE356 0x7D8F #CJK UNIFIED IDEOGRAPH +0xE357 0x7D7D #CJK UNIFIED IDEOGRAPH +0xE358 0x7D9B #CJK UNIFIED IDEOGRAPH +0xE359 0x7DBA #CJK UNIFIED IDEOGRAPH +0xE35A 0x7DAE #CJK UNIFIED IDEOGRAPH +0xE35B 0x7DA3 #CJK UNIFIED IDEOGRAPH +0xE35C 0x7DB5 #CJK UNIFIED IDEOGRAPH +0xE35D 0x7DC7 #CJK UNIFIED IDEOGRAPH +0xE35E 0x7DBD #CJK UNIFIED IDEOGRAPH +0xE35F 0x7DAB #CJK UNIFIED IDEOGRAPH +0xE360 0x7E3D #CJK UNIFIED IDEOGRAPH +0xE361 0x7DA2 #CJK UNIFIED IDEOGRAPH +0xE362 0x7DAF #CJK UNIFIED IDEOGRAPH +0xE363 0x7DDC #CJK UNIFIED IDEOGRAPH +0xE364 0x7DB8 #CJK UNIFIED IDEOGRAPH +0xE365 0x7D9F #CJK UNIFIED IDEOGRAPH +0xE366 0x7DB0 #CJK UNIFIED IDEOGRAPH +0xE367 0x7DD8 #CJK UNIFIED IDEOGRAPH +0xE368 0x7DDD #CJK UNIFIED IDEOGRAPH +0xE369 0x7DE4 #CJK UNIFIED IDEOGRAPH +0xE36A 0x7DDE #CJK UNIFIED IDEOGRAPH +0xE36B 0x7DFB #CJK UNIFIED IDEOGRAPH +0xE36C 0x7DF2 #CJK UNIFIED IDEOGRAPH +0xE36D 0x7DE1 #CJK UNIFIED IDEOGRAPH +0xE36E 0x7E05 #CJK UNIFIED IDEOGRAPH +0xE36F 0x7E0A #CJK UNIFIED IDEOGRAPH +0xE370 0x7E23 #CJK UNIFIED IDEOGRAPH +0xE371 0x7E21 #CJK UNIFIED IDEOGRAPH +0xE372 0x7E12 #CJK UNIFIED IDEOGRAPH +0xE373 0x7E31 #CJK UNIFIED IDEOGRAPH +0xE374 0x7E1F #CJK UNIFIED IDEOGRAPH +0xE375 0x7E09 #CJK UNIFIED IDEOGRAPH +0xE376 0x7E0B #CJK UNIFIED IDEOGRAPH +0xE377 0x7E22 #CJK UNIFIED IDEOGRAPH +0xE378 0x7E46 #CJK UNIFIED IDEOGRAPH +0xE379 0x7E66 #CJK UNIFIED IDEOGRAPH +0xE37A 0x7E3B #CJK UNIFIED IDEOGRAPH +0xE37B 0x7E35 #CJK UNIFIED IDEOGRAPH +0xE37C 0x7E39 #CJK UNIFIED IDEOGRAPH +0xE37D 0x7E43 #CJK UNIFIED IDEOGRAPH +0xE37E 0x7E37 #CJK UNIFIED IDEOGRAPH +0xE380 0x7E32 #CJK UNIFIED IDEOGRAPH +0xE381 0x7E3A #CJK UNIFIED IDEOGRAPH +0xE382 0x7E67 #CJK UNIFIED IDEOGRAPH +0xE383 0x7E5D #CJK UNIFIED IDEOGRAPH +0xE384 0x7E56 #CJK UNIFIED IDEOGRAPH +0xE385 0x7E5E #CJK UNIFIED IDEOGRAPH +0xE386 0x7E59 #CJK UNIFIED IDEOGRAPH +0xE387 0x7E5A #CJK UNIFIED IDEOGRAPH +0xE388 0x7E79 #CJK UNIFIED IDEOGRAPH +0xE389 0x7E6A #CJK UNIFIED IDEOGRAPH +0xE38A 0x7E69 #CJK UNIFIED IDEOGRAPH +0xE38B 0x7E7C #CJK UNIFIED IDEOGRAPH +0xE38C 0x7E7B #CJK UNIFIED IDEOGRAPH +0xE38D 0x7E83 #CJK UNIFIED IDEOGRAPH +0xE38E 0x7DD5 #CJK UNIFIED IDEOGRAPH +0xE38F 0x7E7D #CJK UNIFIED IDEOGRAPH +0xE390 0x8FAE #CJK UNIFIED IDEOGRAPH +0xE391 0x7E7F #CJK UNIFIED IDEOGRAPH +0xE392 0x7E88 #CJK UNIFIED IDEOGRAPH +0xE393 0x7E89 #CJK UNIFIED IDEOGRAPH +0xE394 0x7E8C #CJK UNIFIED IDEOGRAPH +0xE395 0x7E92 #CJK UNIFIED IDEOGRAPH +0xE396 0x7E90 #CJK UNIFIED IDEOGRAPH +0xE397 0x7E93 #CJK UNIFIED IDEOGRAPH +0xE398 0x7E94 #CJK UNIFIED IDEOGRAPH +0xE399 0x7E96 #CJK UNIFIED IDEOGRAPH +0xE39A 0x7E8E #CJK UNIFIED IDEOGRAPH +0xE39B 0x7E9B #CJK UNIFIED IDEOGRAPH +0xE39C 0x7E9C #CJK UNIFIED IDEOGRAPH +0xE39D 0x7F38 #CJK UNIFIED IDEOGRAPH +0xE39E 0x7F3A #CJK UNIFIED IDEOGRAPH +0xE39F 0x7F45 #CJK UNIFIED IDEOGRAPH +0xE3A0 0x7F4C #CJK UNIFIED IDEOGRAPH +0xE3A1 0x7F4D #CJK UNIFIED IDEOGRAPH +0xE3A2 0x7F4E #CJK UNIFIED IDEOGRAPH +0xE3A3 0x7F50 #CJK UNIFIED IDEOGRAPH +0xE3A4 0x7F51 #CJK UNIFIED IDEOGRAPH +0xE3A5 0x7F55 #CJK UNIFIED IDEOGRAPH +0xE3A6 0x7F54 #CJK UNIFIED IDEOGRAPH +0xE3A7 0x7F58 #CJK UNIFIED IDEOGRAPH +0xE3A8 0x7F5F #CJK UNIFIED IDEOGRAPH +0xE3A9 0x7F60 #CJK UNIFIED IDEOGRAPH +0xE3AA 0x7F68 #CJK UNIFIED IDEOGRAPH +0xE3AB 0x7F69 #CJK UNIFIED IDEOGRAPH +0xE3AC 0x7F67 #CJK UNIFIED IDEOGRAPH +0xE3AD 0x7F78 #CJK UNIFIED IDEOGRAPH +0xE3AE 0x7F82 #CJK UNIFIED IDEOGRAPH +0xE3AF 0x7F86 #CJK UNIFIED IDEOGRAPH +0xE3B0 0x7F83 #CJK UNIFIED IDEOGRAPH +0xE3B1 0x7F88 #CJK UNIFIED IDEOGRAPH +0xE3B2 0x7F87 #CJK UNIFIED IDEOGRAPH +0xE3B3 0x7F8C #CJK UNIFIED IDEOGRAPH +0xE3B4 0x7F94 #CJK UNIFIED IDEOGRAPH +0xE3B5 0x7F9E #CJK UNIFIED IDEOGRAPH +0xE3B6 0x7F9D #CJK UNIFIED IDEOGRAPH +0xE3B7 0x7F9A #CJK UNIFIED IDEOGRAPH +0xE3B8 0x7FA3 #CJK UNIFIED IDEOGRAPH +0xE3B9 0x7FAF #CJK UNIFIED IDEOGRAPH +0xE3BA 0x7FB2 #CJK UNIFIED IDEOGRAPH +0xE3BB 0x7FB9 #CJK UNIFIED IDEOGRAPH +0xE3BC 0x7FAE #CJK UNIFIED IDEOGRAPH +0xE3BD 0x7FB6 #CJK UNIFIED IDEOGRAPH +0xE3BE 0x7FB8 #CJK UNIFIED IDEOGRAPH +0xE3BF 0x8B71 #CJK UNIFIED IDEOGRAPH +0xE3C0 0x7FC5 #CJK UNIFIED IDEOGRAPH +0xE3C1 0x7FC6 #CJK UNIFIED IDEOGRAPH +0xE3C2 0x7FCA #CJK UNIFIED IDEOGRAPH +0xE3C3 0x7FD5 #CJK UNIFIED IDEOGRAPH +0xE3C4 0x7FD4 #CJK UNIFIED IDEOGRAPH +0xE3C5 0x7FE1 #CJK UNIFIED IDEOGRAPH +0xE3C6 0x7FE6 #CJK UNIFIED IDEOGRAPH +0xE3C7 0x7FE9 #CJK UNIFIED IDEOGRAPH +0xE3C8 0x7FF3 #CJK UNIFIED IDEOGRAPH +0xE3C9 0x7FF9 #CJK UNIFIED IDEOGRAPH +0xE3CA 0x98DC #CJK UNIFIED IDEOGRAPH +0xE3CB 0x8006 #CJK UNIFIED IDEOGRAPH +0xE3CC 0x8004 #CJK UNIFIED IDEOGRAPH +0xE3CD 0x800B #CJK UNIFIED IDEOGRAPH +0xE3CE 0x8012 #CJK UNIFIED IDEOGRAPH +0xE3CF 0x8018 #CJK UNIFIED IDEOGRAPH +0xE3D0 0x8019 #CJK UNIFIED IDEOGRAPH +0xE3D1 0x801C #CJK UNIFIED IDEOGRAPH +0xE3D2 0x8021 #CJK UNIFIED IDEOGRAPH +0xE3D3 0x8028 #CJK UNIFIED IDEOGRAPH +0xE3D4 0x803F #CJK UNIFIED IDEOGRAPH +0xE3D5 0x803B #CJK UNIFIED IDEOGRAPH +0xE3D6 0x804A #CJK UNIFIED IDEOGRAPH +0xE3D7 0x8046 #CJK UNIFIED IDEOGRAPH +0xE3D8 0x8052 #CJK UNIFIED IDEOGRAPH +0xE3D9 0x8058 #CJK UNIFIED IDEOGRAPH +0xE3DA 0x805A #CJK UNIFIED IDEOGRAPH +0xE3DB 0x805F #CJK UNIFIED IDEOGRAPH +0xE3DC 0x8062 #CJK UNIFIED IDEOGRAPH +0xE3DD 0x8068 #CJK UNIFIED IDEOGRAPH +0xE3DE 0x8073 #CJK UNIFIED IDEOGRAPH +0xE3DF 0x8072 #CJK UNIFIED IDEOGRAPH +0xE3E0 0x8070 #CJK UNIFIED IDEOGRAPH +0xE3E1 0x8076 #CJK UNIFIED IDEOGRAPH +0xE3E2 0x8079 #CJK UNIFIED IDEOGRAPH +0xE3E3 0x807D #CJK UNIFIED IDEOGRAPH +0xE3E4 0x807F #CJK UNIFIED IDEOGRAPH +0xE3E5 0x8084 #CJK UNIFIED IDEOGRAPH +0xE3E6 0x8086 #CJK UNIFIED IDEOGRAPH +0xE3E7 0x8085 #CJK UNIFIED IDEOGRAPH +0xE3E8 0x809B #CJK UNIFIED IDEOGRAPH +0xE3E9 0x8093 #CJK UNIFIED IDEOGRAPH +0xE3EA 0x809A #CJK UNIFIED IDEOGRAPH +0xE3EB 0x80AD #CJK UNIFIED IDEOGRAPH +0xE3EC 0x5190 #CJK UNIFIED IDEOGRAPH +0xE3ED 0x80AC #CJK UNIFIED IDEOGRAPH +0xE3EE 0x80DB #CJK UNIFIED IDEOGRAPH +0xE3EF 0x80E5 #CJK UNIFIED IDEOGRAPH +0xE3F0 0x80D9 #CJK UNIFIED IDEOGRAPH +0xE3F1 0x80DD #CJK UNIFIED IDEOGRAPH +0xE3F2 0x80C4 #CJK UNIFIED IDEOGRAPH +0xE3F3 0x80DA #CJK UNIFIED IDEOGRAPH +0xE3F4 0x80D6 #CJK UNIFIED IDEOGRAPH +0xE3F5 0x8109 #CJK UNIFIED IDEOGRAPH +0xE3F6 0x80EF #CJK UNIFIED IDEOGRAPH +0xE3F7 0x80F1 #CJK UNIFIED IDEOGRAPH +0xE3F8 0x811B #CJK UNIFIED IDEOGRAPH +0xE3F9 0x8129 #CJK UNIFIED IDEOGRAPH +0xE3FA 0x8123 #CJK UNIFIED IDEOGRAPH +0xE3FB 0x812F #CJK UNIFIED IDEOGRAPH +0xE3FC 0x814B #CJK UNIFIED IDEOGRAPH +0xE440 0x968B #CJK UNIFIED IDEOGRAPH +0xE441 0x8146 #CJK UNIFIED IDEOGRAPH +0xE442 0x813E #CJK UNIFIED IDEOGRAPH +0xE443 0x8153 #CJK UNIFIED IDEOGRAPH +0xE444 0x8151 #CJK UNIFIED IDEOGRAPH +0xE445 0x80FC #CJK UNIFIED IDEOGRAPH +0xE446 0x8171 #CJK UNIFIED IDEOGRAPH +0xE447 0x816E #CJK UNIFIED IDEOGRAPH +0xE448 0x8165 #CJK UNIFIED IDEOGRAPH +0xE449 0x8166 #CJK UNIFIED IDEOGRAPH +0xE44A 0x8174 #CJK UNIFIED IDEOGRAPH +0xE44B 0x8183 #CJK UNIFIED IDEOGRAPH +0xE44C 0x8188 #CJK UNIFIED IDEOGRAPH +0xE44D 0x818A #CJK UNIFIED IDEOGRAPH +0xE44E 0x8180 #CJK UNIFIED IDEOGRAPH +0xE44F 0x8182 #CJK UNIFIED IDEOGRAPH +0xE450 0x81A0 #CJK UNIFIED IDEOGRAPH +0xE451 0x8195 #CJK UNIFIED IDEOGRAPH +0xE452 0x81A4 #CJK UNIFIED IDEOGRAPH +0xE453 0x81A3 #CJK UNIFIED IDEOGRAPH +0xE454 0x815F #CJK UNIFIED IDEOGRAPH +0xE455 0x8193 #CJK UNIFIED IDEOGRAPH +0xE456 0x81A9 #CJK UNIFIED IDEOGRAPH +0xE457 0x81B0 #CJK UNIFIED IDEOGRAPH +0xE458 0x81B5 #CJK UNIFIED IDEOGRAPH +0xE459 0x81BE #CJK UNIFIED IDEOGRAPH +0xE45A 0x81B8 #CJK UNIFIED IDEOGRAPH +0xE45B 0x81BD #CJK UNIFIED IDEOGRAPH +0xE45C 0x81C0 #CJK UNIFIED IDEOGRAPH +0xE45D 0x81C2 #CJK UNIFIED IDEOGRAPH +0xE45E 0x81BA #CJK UNIFIED IDEOGRAPH +0xE45F 0x81C9 #CJK UNIFIED IDEOGRAPH +0xE460 0x81CD #CJK UNIFIED IDEOGRAPH +0xE461 0x81D1 #CJK UNIFIED IDEOGRAPH +0xE462 0x81D9 #CJK UNIFIED IDEOGRAPH +0xE463 0x81D8 #CJK UNIFIED IDEOGRAPH +0xE464 0x81C8 #CJK UNIFIED IDEOGRAPH +0xE465 0x81DA #CJK UNIFIED IDEOGRAPH +0xE466 0x81DF #CJK UNIFIED IDEOGRAPH +0xE467 0x81E0 #CJK UNIFIED IDEOGRAPH +0xE468 0x81E7 #CJK UNIFIED IDEOGRAPH +0xE469 0x81FA #CJK UNIFIED IDEOGRAPH +0xE46A 0x81FB #CJK UNIFIED IDEOGRAPH +0xE46B 0x81FE #CJK UNIFIED IDEOGRAPH +0xE46C 0x8201 #CJK UNIFIED IDEOGRAPH +0xE46D 0x8202 #CJK UNIFIED IDEOGRAPH +0xE46E 0x8205 #CJK UNIFIED IDEOGRAPH +0xE46F 0x8207 #CJK UNIFIED IDEOGRAPH +0xE470 0x820A #CJK UNIFIED IDEOGRAPH +0xE471 0x820D #CJK UNIFIED IDEOGRAPH +0xE472 0x8210 #CJK UNIFIED IDEOGRAPH +0xE473 0x8216 #CJK UNIFIED IDEOGRAPH +0xE474 0x8229 #CJK UNIFIED IDEOGRAPH +0xE475 0x822B #CJK UNIFIED IDEOGRAPH +0xE476 0x8238 #CJK UNIFIED IDEOGRAPH +0xE477 0x8233 #CJK UNIFIED IDEOGRAPH +0xE478 0x8240 #CJK UNIFIED IDEOGRAPH +0xE479 0x8259 #CJK UNIFIED IDEOGRAPH +0xE47A 0x8258 #CJK UNIFIED IDEOGRAPH +0xE47B 0x825D #CJK UNIFIED IDEOGRAPH +0xE47C 0x825A #CJK UNIFIED IDEOGRAPH +0xE47D 0x825F #CJK UNIFIED IDEOGRAPH +0xE47E 0x8264 #CJK UNIFIED IDEOGRAPH +0xE480 0x8262 #CJK UNIFIED IDEOGRAPH +0xE481 0x8268 #CJK UNIFIED IDEOGRAPH +0xE482 0x826A #CJK UNIFIED IDEOGRAPH +0xE483 0x826B #CJK UNIFIED IDEOGRAPH +0xE484 0x822E #CJK UNIFIED IDEOGRAPH +0xE485 0x8271 #CJK UNIFIED IDEOGRAPH +0xE486 0x8277 #CJK UNIFIED IDEOGRAPH +0xE487 0x8278 #CJK UNIFIED IDEOGRAPH +0xE488 0x827E #CJK UNIFIED IDEOGRAPH +0xE489 0x828D #CJK UNIFIED IDEOGRAPH +0xE48A 0x8292 #CJK UNIFIED IDEOGRAPH +0xE48B 0x82AB #CJK UNIFIED IDEOGRAPH +0xE48C 0x829F #CJK UNIFIED IDEOGRAPH +0xE48D 0x82BB #CJK UNIFIED IDEOGRAPH +0xE48E 0x82AC #CJK UNIFIED IDEOGRAPH +0xE48F 0x82E1 #CJK UNIFIED IDEOGRAPH +0xE490 0x82E3 #CJK UNIFIED IDEOGRAPH +0xE491 0x82DF #CJK UNIFIED IDEOGRAPH +0xE492 0x82D2 #CJK UNIFIED IDEOGRAPH +0xE493 0x82F4 #CJK UNIFIED IDEOGRAPH +0xE494 0x82F3 #CJK UNIFIED IDEOGRAPH +0xE495 0x82FA #CJK UNIFIED IDEOGRAPH +0xE496 0x8393 #CJK UNIFIED IDEOGRAPH +0xE497 0x8303 #CJK UNIFIED IDEOGRAPH +0xE498 0x82FB #CJK UNIFIED IDEOGRAPH +0xE499 0x82F9 #CJK UNIFIED IDEOGRAPH +0xE49A 0x82DE #CJK UNIFIED IDEOGRAPH +0xE49B 0x8306 #CJK UNIFIED IDEOGRAPH +0xE49C 0x82DC #CJK UNIFIED IDEOGRAPH +0xE49D 0x8309 #CJK UNIFIED IDEOGRAPH +0xE49E 0x82D9 #CJK UNIFIED IDEOGRAPH +0xE49F 0x8335 #CJK UNIFIED IDEOGRAPH +0xE4A0 0x8334 #CJK UNIFIED IDEOGRAPH +0xE4A1 0x8316 #CJK UNIFIED IDEOGRAPH +0xE4A2 0x8332 #CJK UNIFIED IDEOGRAPH +0xE4A3 0x8331 #CJK UNIFIED IDEOGRAPH +0xE4A4 0x8340 #CJK UNIFIED IDEOGRAPH +0xE4A5 0x8339 #CJK UNIFIED IDEOGRAPH +0xE4A6 0x8350 #CJK UNIFIED IDEOGRAPH +0xE4A7 0x8345 #CJK UNIFIED IDEOGRAPH +0xE4A8 0x832F #CJK UNIFIED IDEOGRAPH +0xE4A9 0x832B #CJK UNIFIED IDEOGRAPH +0xE4AA 0x8317 #CJK UNIFIED IDEOGRAPH +0xE4AB 0x8318 #CJK UNIFIED IDEOGRAPH +0xE4AC 0x8385 #CJK UNIFIED IDEOGRAPH +0xE4AD 0x839A #CJK UNIFIED IDEOGRAPH +0xE4AE 0x83AA #CJK UNIFIED IDEOGRAPH +0xE4AF 0x839F #CJK UNIFIED IDEOGRAPH +0xE4B0 0x83A2 #CJK UNIFIED IDEOGRAPH +0xE4B1 0x8396 #CJK UNIFIED IDEOGRAPH +0xE4B2 0x8323 #CJK UNIFIED IDEOGRAPH +0xE4B3 0x838E #CJK UNIFIED IDEOGRAPH +0xE4B4 0x8387 #CJK UNIFIED IDEOGRAPH +0xE4B5 0x838A #CJK UNIFIED IDEOGRAPH +0xE4B6 0x837C #CJK UNIFIED IDEOGRAPH +0xE4B7 0x83B5 #CJK UNIFIED IDEOGRAPH +0xE4B8 0x8373 #CJK UNIFIED IDEOGRAPH +0xE4B9 0x8375 #CJK UNIFIED IDEOGRAPH +0xE4BA 0x83A0 #CJK UNIFIED IDEOGRAPH +0xE4BB 0x8389 #CJK UNIFIED IDEOGRAPH +0xE4BC 0x83A8 #CJK UNIFIED IDEOGRAPH +0xE4BD 0x83F4 #CJK UNIFIED IDEOGRAPH +0xE4BE 0x8413 #CJK UNIFIED IDEOGRAPH +0xE4BF 0x83EB #CJK UNIFIED IDEOGRAPH +0xE4C0 0x83CE #CJK UNIFIED IDEOGRAPH +0xE4C1 0x83FD #CJK UNIFIED IDEOGRAPH +0xE4C2 0x8403 #CJK UNIFIED IDEOGRAPH +0xE4C3 0x83D8 #CJK UNIFIED IDEOGRAPH +0xE4C4 0x840B #CJK UNIFIED IDEOGRAPH +0xE4C5 0x83C1 #CJK UNIFIED IDEOGRAPH +0xE4C6 0x83F7 #CJK UNIFIED IDEOGRAPH +0xE4C7 0x8407 #CJK UNIFIED IDEOGRAPH +0xE4C8 0x83E0 #CJK UNIFIED IDEOGRAPH +0xE4C9 0x83F2 #CJK UNIFIED IDEOGRAPH +0xE4CA 0x840D #CJK UNIFIED IDEOGRAPH +0xE4CB 0x8422 #CJK UNIFIED IDEOGRAPH +0xE4CC 0x8420 #CJK UNIFIED IDEOGRAPH +0xE4CD 0x83BD #CJK UNIFIED IDEOGRAPH +0xE4CE 0x8438 #CJK UNIFIED IDEOGRAPH +0xE4CF 0x8506 #CJK UNIFIED IDEOGRAPH +0xE4D0 0x83FB #CJK UNIFIED IDEOGRAPH +0xE4D1 0x846D #CJK UNIFIED IDEOGRAPH +0xE4D2 0x842A #CJK UNIFIED IDEOGRAPH +0xE4D3 0x843C #CJK UNIFIED IDEOGRAPH +0xE4D4 0x855A #CJK UNIFIED IDEOGRAPH +0xE4D5 0x8484 #CJK UNIFIED IDEOGRAPH +0xE4D6 0x8477 #CJK UNIFIED IDEOGRAPH +0xE4D7 0x846B #CJK UNIFIED IDEOGRAPH +0xE4D8 0x84AD #CJK UNIFIED IDEOGRAPH +0xE4D9 0x846E #CJK UNIFIED IDEOGRAPH +0xE4DA 0x8482 #CJK UNIFIED IDEOGRAPH +0xE4DB 0x8469 #CJK UNIFIED IDEOGRAPH +0xE4DC 0x8446 #CJK UNIFIED IDEOGRAPH +0xE4DD 0x842C #CJK UNIFIED IDEOGRAPH +0xE4DE 0x846F #CJK UNIFIED IDEOGRAPH +0xE4DF 0x8479 #CJK UNIFIED IDEOGRAPH +0xE4E0 0x8435 #CJK UNIFIED IDEOGRAPH +0xE4E1 0x84CA #CJK UNIFIED IDEOGRAPH +0xE4E2 0x8462 #CJK UNIFIED IDEOGRAPH +0xE4E3 0x84B9 #CJK UNIFIED IDEOGRAPH +0xE4E4 0x84BF #CJK UNIFIED IDEOGRAPH +0xE4E5 0x849F #CJK UNIFIED IDEOGRAPH +0xE4E6 0x84D9 #CJK UNIFIED IDEOGRAPH +0xE4E7 0x84CD #CJK UNIFIED IDEOGRAPH +0xE4E8 0x84BB #CJK UNIFIED IDEOGRAPH +0xE4E9 0x84DA #CJK UNIFIED IDEOGRAPH +0xE4EA 0x84D0 #CJK UNIFIED IDEOGRAPH +0xE4EB 0x84C1 #CJK UNIFIED IDEOGRAPH +0xE4EC 0x84C6 #CJK UNIFIED IDEOGRAPH +0xE4ED 0x84D6 #CJK UNIFIED IDEOGRAPH +0xE4EE 0x84A1 #CJK UNIFIED IDEOGRAPH +0xE4EF 0x8521 #CJK UNIFIED IDEOGRAPH +0xE4F0 0x84FF #CJK UNIFIED IDEOGRAPH +0xE4F1 0x84F4 #CJK UNIFIED IDEOGRAPH +0xE4F2 0x8517 #CJK UNIFIED IDEOGRAPH +0xE4F3 0x8518 #CJK UNIFIED IDEOGRAPH +0xE4F4 0x852C #CJK UNIFIED IDEOGRAPH +0xE4F5 0x851F #CJK UNIFIED IDEOGRAPH +0xE4F6 0x8515 #CJK UNIFIED IDEOGRAPH +0xE4F7 0x8514 #CJK UNIFIED IDEOGRAPH +0xE4F8 0x84FC #CJK UNIFIED IDEOGRAPH +0xE4F9 0x8540 #CJK UNIFIED IDEOGRAPH +0xE4FA 0x8563 #CJK UNIFIED IDEOGRAPH +0xE4FB 0x8558 #CJK UNIFIED IDEOGRAPH +0xE4FC 0x8548 #CJK UNIFIED IDEOGRAPH +0xE540 0x8541 #CJK UNIFIED IDEOGRAPH +0xE541 0x8602 #CJK UNIFIED IDEOGRAPH +0xE542 0x854B #CJK UNIFIED IDEOGRAPH +0xE543 0x8555 #CJK UNIFIED IDEOGRAPH +0xE544 0x8580 #CJK UNIFIED IDEOGRAPH +0xE545 0x85A4 #CJK UNIFIED IDEOGRAPH +0xE546 0x8588 #CJK UNIFIED IDEOGRAPH +0xE547 0x8591 #CJK UNIFIED IDEOGRAPH +0xE548 0x858A #CJK UNIFIED IDEOGRAPH +0xE549 0x85A8 #CJK UNIFIED IDEOGRAPH +0xE54A 0x856D #CJK UNIFIED IDEOGRAPH +0xE54B 0x8594 #CJK UNIFIED IDEOGRAPH +0xE54C 0x859B #CJK UNIFIED IDEOGRAPH +0xE54D 0x85EA #CJK UNIFIED IDEOGRAPH +0xE54E 0x8587 #CJK UNIFIED IDEOGRAPH +0xE54F 0x859C #CJK UNIFIED IDEOGRAPH +0xE550 0x8577 #CJK UNIFIED IDEOGRAPH +0xE551 0x857E #CJK UNIFIED IDEOGRAPH +0xE552 0x8590 #CJK UNIFIED IDEOGRAPH +0xE553 0x85C9 #CJK UNIFIED IDEOGRAPH +0xE554 0x85BA #CJK UNIFIED IDEOGRAPH +0xE555 0x85CF #CJK UNIFIED IDEOGRAPH +0xE556 0x85B9 #CJK UNIFIED IDEOGRAPH +0xE557 0x85D0 #CJK UNIFIED IDEOGRAPH +0xE558 0x85D5 #CJK UNIFIED IDEOGRAPH +0xE559 0x85DD #CJK UNIFIED IDEOGRAPH +0xE55A 0x85E5 #CJK UNIFIED IDEOGRAPH +0xE55B 0x85DC #CJK UNIFIED IDEOGRAPH +0xE55C 0x85F9 #CJK UNIFIED IDEOGRAPH +0xE55D 0x860A #CJK UNIFIED IDEOGRAPH +0xE55E 0x8613 #CJK UNIFIED IDEOGRAPH +0xE55F 0x860B #CJK UNIFIED IDEOGRAPH +0xE560 0x85FE #CJK UNIFIED IDEOGRAPH +0xE561 0x85FA #CJK UNIFIED IDEOGRAPH +0xE562 0x8606 #CJK UNIFIED IDEOGRAPH +0xE563 0x8622 #CJK UNIFIED IDEOGRAPH +0xE564 0x861A #CJK UNIFIED IDEOGRAPH +0xE565 0x8630 #CJK UNIFIED IDEOGRAPH +0xE566 0x863F #CJK UNIFIED IDEOGRAPH +0xE567 0x864D #CJK UNIFIED IDEOGRAPH +0xE568 0x4E55 #CJK UNIFIED IDEOGRAPH +0xE569 0x8654 #CJK UNIFIED IDEOGRAPH +0xE56A 0x865F #CJK UNIFIED IDEOGRAPH +0xE56B 0x8667 #CJK UNIFIED IDEOGRAPH +0xE56C 0x8671 #CJK UNIFIED IDEOGRAPH +0xE56D 0x8693 #CJK UNIFIED IDEOGRAPH +0xE56E 0x86A3 #CJK UNIFIED IDEOGRAPH +0xE56F 0x86A9 #CJK UNIFIED IDEOGRAPH +0xE570 0x86AA #CJK UNIFIED IDEOGRAPH +0xE571 0x868B #CJK UNIFIED IDEOGRAPH +0xE572 0x868C #CJK UNIFIED IDEOGRAPH +0xE573 0x86B6 #CJK UNIFIED IDEOGRAPH +0xE574 0x86AF #CJK UNIFIED IDEOGRAPH +0xE575 0x86C4 #CJK UNIFIED IDEOGRAPH +0xE576 0x86C6 #CJK UNIFIED IDEOGRAPH +0xE577 0x86B0 #CJK UNIFIED IDEOGRAPH +0xE578 0x86C9 #CJK UNIFIED IDEOGRAPH +0xE579 0x8823 #CJK UNIFIED IDEOGRAPH +0xE57A 0x86AB #CJK UNIFIED IDEOGRAPH +0xE57B 0x86D4 #CJK UNIFIED IDEOGRAPH +0xE57C 0x86DE #CJK UNIFIED IDEOGRAPH +0xE57D 0x86E9 #CJK UNIFIED IDEOGRAPH +0xE57E 0x86EC #CJK UNIFIED IDEOGRAPH +0xE580 0x86DF #CJK UNIFIED IDEOGRAPH +0xE581 0x86DB #CJK UNIFIED IDEOGRAPH +0xE582 0x86EF #CJK UNIFIED IDEOGRAPH +0xE583 0x8712 #CJK UNIFIED IDEOGRAPH +0xE584 0x8706 #CJK UNIFIED IDEOGRAPH +0xE585 0x8708 #CJK UNIFIED IDEOGRAPH +0xE586 0x8700 #CJK UNIFIED IDEOGRAPH +0xE587 0x8703 #CJK UNIFIED IDEOGRAPH +0xE588 0x86FB #CJK UNIFIED IDEOGRAPH +0xE589 0x8711 #CJK UNIFIED IDEOGRAPH +0xE58A 0x8709 #CJK UNIFIED IDEOGRAPH +0xE58B 0x870D #CJK UNIFIED IDEOGRAPH +0xE58C 0x86F9 #CJK UNIFIED IDEOGRAPH +0xE58D 0x870A #CJK UNIFIED IDEOGRAPH +0xE58E 0x8734 #CJK UNIFIED IDEOGRAPH +0xE58F 0x873F #CJK UNIFIED IDEOGRAPH +0xE590 0x8737 #CJK UNIFIED IDEOGRAPH +0xE591 0x873B #CJK UNIFIED IDEOGRAPH +0xE592 0x8725 #CJK UNIFIED IDEOGRAPH +0xE593 0x8729 #CJK UNIFIED IDEOGRAPH +0xE594 0x871A #CJK UNIFIED IDEOGRAPH +0xE595 0x8760 #CJK UNIFIED IDEOGRAPH +0xE596 0x875F #CJK UNIFIED IDEOGRAPH +0xE597 0x8778 #CJK UNIFIED IDEOGRAPH +0xE598 0x874C #CJK UNIFIED IDEOGRAPH +0xE599 0x874E #CJK UNIFIED IDEOGRAPH +0xE59A 0x8774 #CJK UNIFIED IDEOGRAPH +0xE59B 0x8757 #CJK UNIFIED IDEOGRAPH +0xE59C 0x8768 #CJK UNIFIED IDEOGRAPH +0xE59D 0x876E #CJK UNIFIED IDEOGRAPH +0xE59E 0x8759 #CJK UNIFIED IDEOGRAPH +0xE59F 0x8753 #CJK UNIFIED IDEOGRAPH +0xE5A0 0x8763 #CJK UNIFIED IDEOGRAPH +0xE5A1 0x876A #CJK UNIFIED IDEOGRAPH +0xE5A2 0x8805 #CJK UNIFIED IDEOGRAPH +0xE5A3 0x87A2 #CJK UNIFIED IDEOGRAPH +0xE5A4 0x879F #CJK UNIFIED IDEOGRAPH +0xE5A5 0x8782 #CJK UNIFIED IDEOGRAPH +0xE5A6 0x87AF #CJK UNIFIED IDEOGRAPH +0xE5A7 0x87CB #CJK UNIFIED IDEOGRAPH +0xE5A8 0x87BD #CJK UNIFIED IDEOGRAPH +0xE5A9 0x87C0 #CJK UNIFIED IDEOGRAPH +0xE5AA 0x87D0 #CJK UNIFIED IDEOGRAPH +0xE5AB 0x96D6 #CJK UNIFIED IDEOGRAPH +0xE5AC 0x87AB #CJK UNIFIED IDEOGRAPH +0xE5AD 0x87C4 #CJK UNIFIED IDEOGRAPH +0xE5AE 0x87B3 #CJK UNIFIED IDEOGRAPH +0xE5AF 0x87C7 #CJK UNIFIED IDEOGRAPH +0xE5B0 0x87C6 #CJK UNIFIED IDEOGRAPH +0xE5B1 0x87BB #CJK UNIFIED IDEOGRAPH +0xE5B2 0x87EF #CJK UNIFIED IDEOGRAPH +0xE5B3 0x87F2 #CJK UNIFIED IDEOGRAPH +0xE5B4 0x87E0 #CJK UNIFIED IDEOGRAPH +0xE5B5 0x880F #CJK UNIFIED IDEOGRAPH +0xE5B6 0x880D #CJK UNIFIED IDEOGRAPH +0xE5B7 0x87FE #CJK UNIFIED IDEOGRAPH +0xE5B8 0x87F6 #CJK UNIFIED IDEOGRAPH +0xE5B9 0x87F7 #CJK UNIFIED IDEOGRAPH +0xE5BA 0x880E #CJK UNIFIED IDEOGRAPH +0xE5BB 0x87D2 #CJK UNIFIED IDEOGRAPH +0xE5BC 0x8811 #CJK UNIFIED IDEOGRAPH +0xE5BD 0x8816 #CJK UNIFIED IDEOGRAPH +0xE5BE 0x8815 #CJK UNIFIED IDEOGRAPH +0xE5BF 0x8822 #CJK UNIFIED IDEOGRAPH +0xE5C0 0x8821 #CJK UNIFIED IDEOGRAPH +0xE5C1 0x8831 #CJK UNIFIED IDEOGRAPH +0xE5C2 0x8836 #CJK UNIFIED IDEOGRAPH +0xE5C3 0x8839 #CJK UNIFIED IDEOGRAPH +0xE5C4 0x8827 #CJK UNIFIED IDEOGRAPH +0xE5C5 0x883B #CJK UNIFIED IDEOGRAPH +0xE5C6 0x8844 #CJK UNIFIED IDEOGRAPH +0xE5C7 0x8842 #CJK UNIFIED IDEOGRAPH +0xE5C8 0x8852 #CJK UNIFIED IDEOGRAPH +0xE5C9 0x8859 #CJK UNIFIED IDEOGRAPH +0xE5CA 0x885E #CJK UNIFIED IDEOGRAPH +0xE5CB 0x8862 #CJK UNIFIED IDEOGRAPH +0xE5CC 0x886B #CJK UNIFIED IDEOGRAPH +0xE5CD 0x8881 #CJK UNIFIED IDEOGRAPH +0xE5CE 0x887E #CJK UNIFIED IDEOGRAPH +0xE5CF 0x889E #CJK UNIFIED IDEOGRAPH +0xE5D0 0x8875 #CJK UNIFIED IDEOGRAPH +0xE5D1 0x887D #CJK UNIFIED IDEOGRAPH +0xE5D2 0x88B5 #CJK UNIFIED IDEOGRAPH +0xE5D3 0x8872 #CJK UNIFIED IDEOGRAPH +0xE5D4 0x8882 #CJK UNIFIED IDEOGRAPH +0xE5D5 0x8897 #CJK UNIFIED IDEOGRAPH +0xE5D6 0x8892 #CJK UNIFIED IDEOGRAPH +0xE5D7 0x88AE #CJK UNIFIED IDEOGRAPH +0xE5D8 0x8899 #CJK UNIFIED IDEOGRAPH +0xE5D9 0x88A2 #CJK UNIFIED IDEOGRAPH +0xE5DA 0x888D #CJK UNIFIED IDEOGRAPH +0xE5DB 0x88A4 #CJK UNIFIED IDEOGRAPH +0xE5DC 0x88B0 #CJK UNIFIED IDEOGRAPH +0xE5DD 0x88BF #CJK UNIFIED IDEOGRAPH +0xE5DE 0x88B1 #CJK UNIFIED IDEOGRAPH +0xE5DF 0x88C3 #CJK UNIFIED IDEOGRAPH +0xE5E0 0x88C4 #CJK UNIFIED IDEOGRAPH +0xE5E1 0x88D4 #CJK UNIFIED IDEOGRAPH +0xE5E2 0x88D8 #CJK UNIFIED IDEOGRAPH +0xE5E3 0x88D9 #CJK UNIFIED IDEOGRAPH +0xE5E4 0x88DD #CJK UNIFIED IDEOGRAPH +0xE5E5 0x88F9 #CJK UNIFIED IDEOGRAPH +0xE5E6 0x8902 #CJK UNIFIED IDEOGRAPH +0xE5E7 0x88FC #CJK UNIFIED IDEOGRAPH +0xE5E8 0x88F4 #CJK UNIFIED IDEOGRAPH +0xE5E9 0x88E8 #CJK UNIFIED IDEOGRAPH +0xE5EA 0x88F2 #CJK UNIFIED IDEOGRAPH +0xE5EB 0x8904 #CJK UNIFIED IDEOGRAPH +0xE5EC 0x890C #CJK UNIFIED IDEOGRAPH +0xE5ED 0x890A #CJK UNIFIED IDEOGRAPH +0xE5EE 0x8913 #CJK UNIFIED IDEOGRAPH +0xE5EF 0x8943 #CJK UNIFIED IDEOGRAPH +0xE5F0 0x891E #CJK UNIFIED IDEOGRAPH +0xE5F1 0x8925 #CJK UNIFIED IDEOGRAPH +0xE5F2 0x892A #CJK UNIFIED IDEOGRAPH +0xE5F3 0x892B #CJK UNIFIED IDEOGRAPH +0xE5F4 0x8941 #CJK UNIFIED IDEOGRAPH +0xE5F5 0x8944 #CJK UNIFIED IDEOGRAPH +0xE5F6 0x893B #CJK UNIFIED IDEOGRAPH +0xE5F7 0x8936 #CJK UNIFIED IDEOGRAPH +0xE5F8 0x8938 #CJK UNIFIED IDEOGRAPH +0xE5F9 0x894C #CJK UNIFIED IDEOGRAPH +0xE5FA 0x891D #CJK UNIFIED IDEOGRAPH +0xE5FB 0x8960 #CJK UNIFIED IDEOGRAPH +0xE5FC 0x895E #CJK UNIFIED IDEOGRAPH +0xE640 0x8966 #CJK UNIFIED IDEOGRAPH +0xE641 0x8964 #CJK UNIFIED IDEOGRAPH +0xE642 0x896D #CJK UNIFIED IDEOGRAPH +0xE643 0x896A #CJK UNIFIED IDEOGRAPH +0xE644 0x896F #CJK UNIFIED IDEOGRAPH +0xE645 0x8974 #CJK UNIFIED IDEOGRAPH +0xE646 0x8977 #CJK UNIFIED IDEOGRAPH +0xE647 0x897E #CJK UNIFIED IDEOGRAPH +0xE648 0x8983 #CJK UNIFIED IDEOGRAPH +0xE649 0x8988 #CJK UNIFIED IDEOGRAPH +0xE64A 0x898A #CJK UNIFIED IDEOGRAPH +0xE64B 0x8993 #CJK UNIFIED IDEOGRAPH +0xE64C 0x8998 #CJK UNIFIED IDEOGRAPH +0xE64D 0x89A1 #CJK UNIFIED IDEOGRAPH +0xE64E 0x89A9 #CJK UNIFIED IDEOGRAPH +0xE64F 0x89A6 #CJK UNIFIED IDEOGRAPH +0xE650 0x89AC #CJK UNIFIED IDEOGRAPH +0xE651 0x89AF #CJK UNIFIED IDEOGRAPH +0xE652 0x89B2 #CJK UNIFIED IDEOGRAPH +0xE653 0x89BA #CJK UNIFIED IDEOGRAPH +0xE654 0x89BD #CJK UNIFIED IDEOGRAPH +0xE655 0x89BF #CJK UNIFIED IDEOGRAPH +0xE656 0x89C0 #CJK UNIFIED IDEOGRAPH +0xE657 0x89DA #CJK UNIFIED IDEOGRAPH +0xE658 0x89DC #CJK UNIFIED IDEOGRAPH +0xE659 0x89DD #CJK UNIFIED IDEOGRAPH +0xE65A 0x89E7 #CJK UNIFIED IDEOGRAPH +0xE65B 0x89F4 #CJK UNIFIED IDEOGRAPH +0xE65C 0x89F8 #CJK UNIFIED IDEOGRAPH +0xE65D 0x8A03 #CJK UNIFIED IDEOGRAPH +0xE65E 0x8A16 #CJK UNIFIED IDEOGRAPH +0xE65F 0x8A10 #CJK UNIFIED IDEOGRAPH +0xE660 0x8A0C #CJK UNIFIED IDEOGRAPH +0xE661 0x8A1B #CJK UNIFIED IDEOGRAPH +0xE662 0x8A1D #CJK UNIFIED IDEOGRAPH +0xE663 0x8A25 #CJK UNIFIED IDEOGRAPH +0xE664 0x8A36 #CJK UNIFIED IDEOGRAPH +0xE665 0x8A41 #CJK UNIFIED IDEOGRAPH +0xE666 0x8A5B #CJK UNIFIED IDEOGRAPH +0xE667 0x8A52 #CJK UNIFIED IDEOGRAPH +0xE668 0x8A46 #CJK UNIFIED IDEOGRAPH +0xE669 0x8A48 #CJK UNIFIED IDEOGRAPH +0xE66A 0x8A7C #CJK UNIFIED IDEOGRAPH +0xE66B 0x8A6D #CJK UNIFIED IDEOGRAPH +0xE66C 0x8A6C #CJK UNIFIED IDEOGRAPH +0xE66D 0x8A62 #CJK UNIFIED IDEOGRAPH +0xE66E 0x8A85 #CJK UNIFIED IDEOGRAPH +0xE66F 0x8A82 #CJK UNIFIED IDEOGRAPH +0xE670 0x8A84 #CJK UNIFIED IDEOGRAPH +0xE671 0x8AA8 #CJK UNIFIED IDEOGRAPH +0xE672 0x8AA1 #CJK UNIFIED IDEOGRAPH +0xE673 0x8A91 #CJK UNIFIED IDEOGRAPH +0xE674 0x8AA5 #CJK UNIFIED IDEOGRAPH +0xE675 0x8AA6 #CJK UNIFIED IDEOGRAPH +0xE676 0x8A9A #CJK UNIFIED IDEOGRAPH +0xE677 0x8AA3 #CJK UNIFIED IDEOGRAPH +0xE678 0x8AC4 #CJK UNIFIED IDEOGRAPH +0xE679 0x8ACD #CJK UNIFIED IDEOGRAPH +0xE67A 0x8AC2 #CJK UNIFIED IDEOGRAPH +0xE67B 0x8ADA #CJK UNIFIED IDEOGRAPH +0xE67C 0x8AEB #CJK UNIFIED IDEOGRAPH +0xE67D 0x8AF3 #CJK UNIFIED IDEOGRAPH +0xE67E 0x8AE7 #CJK UNIFIED IDEOGRAPH +0xE680 0x8AE4 #CJK UNIFIED IDEOGRAPH +0xE681 0x8AF1 #CJK UNIFIED IDEOGRAPH +0xE682 0x8B14 #CJK UNIFIED IDEOGRAPH +0xE683 0x8AE0 #CJK UNIFIED IDEOGRAPH +0xE684 0x8AE2 #CJK UNIFIED IDEOGRAPH +0xE685 0x8AF7 #CJK UNIFIED IDEOGRAPH +0xE686 0x8ADE #CJK UNIFIED IDEOGRAPH +0xE687 0x8ADB #CJK UNIFIED IDEOGRAPH +0xE688 0x8B0C #CJK UNIFIED IDEOGRAPH +0xE689 0x8B07 #CJK UNIFIED IDEOGRAPH +0xE68A 0x8B1A #CJK UNIFIED IDEOGRAPH +0xE68B 0x8AE1 #CJK UNIFIED IDEOGRAPH +0xE68C 0x8B16 #CJK UNIFIED IDEOGRAPH +0xE68D 0x8B10 #CJK UNIFIED IDEOGRAPH +0xE68E 0x8B17 #CJK UNIFIED IDEOGRAPH +0xE68F 0x8B20 #CJK UNIFIED IDEOGRAPH +0xE690 0x8B33 #CJK UNIFIED IDEOGRAPH +0xE691 0x97AB #CJK UNIFIED IDEOGRAPH +0xE692 0x8B26 #CJK UNIFIED IDEOGRAPH +0xE693 0x8B2B #CJK UNIFIED IDEOGRAPH +0xE694 0x8B3E #CJK UNIFIED IDEOGRAPH +0xE695 0x8B28 #CJK UNIFIED IDEOGRAPH +0xE696 0x8B41 #CJK UNIFIED IDEOGRAPH +0xE697 0x8B4C #CJK UNIFIED IDEOGRAPH +0xE698 0x8B4F #CJK UNIFIED IDEOGRAPH +0xE699 0x8B4E #CJK UNIFIED IDEOGRAPH +0xE69A 0x8B49 #CJK UNIFIED IDEOGRAPH +0xE69B 0x8B56 #CJK UNIFIED IDEOGRAPH +0xE69C 0x8B5B #CJK UNIFIED IDEOGRAPH +0xE69D 0x8B5A #CJK UNIFIED IDEOGRAPH +0xE69E 0x8B6B #CJK UNIFIED IDEOGRAPH +0xE69F 0x8B5F #CJK UNIFIED IDEOGRAPH +0xE6A0 0x8B6C #CJK UNIFIED IDEOGRAPH +0xE6A1 0x8B6F #CJK UNIFIED IDEOGRAPH +0xE6A2 0x8B74 #CJK UNIFIED IDEOGRAPH +0xE6A3 0x8B7D #CJK UNIFIED IDEOGRAPH +0xE6A4 0x8B80 #CJK UNIFIED IDEOGRAPH +0xE6A5 0x8B8C #CJK UNIFIED IDEOGRAPH +0xE6A6 0x8B8E #CJK UNIFIED IDEOGRAPH +0xE6A7 0x8B92 #CJK UNIFIED IDEOGRAPH +0xE6A8 0x8B93 #CJK UNIFIED IDEOGRAPH +0xE6A9 0x8B96 #CJK UNIFIED IDEOGRAPH +0xE6AA 0x8B99 #CJK UNIFIED IDEOGRAPH +0xE6AB 0x8B9A #CJK UNIFIED IDEOGRAPH +0xE6AC 0x8C3A #CJK UNIFIED IDEOGRAPH +0xE6AD 0x8C41 #CJK UNIFIED IDEOGRAPH +0xE6AE 0x8C3F #CJK UNIFIED IDEOGRAPH +0xE6AF 0x8C48 #CJK UNIFIED IDEOGRAPH +0xE6B0 0x8C4C #CJK UNIFIED IDEOGRAPH +0xE6B1 0x8C4E #CJK UNIFIED IDEOGRAPH +0xE6B2 0x8C50 #CJK UNIFIED IDEOGRAPH +0xE6B3 0x8C55 #CJK UNIFIED IDEOGRAPH +0xE6B4 0x8C62 #CJK UNIFIED IDEOGRAPH +0xE6B5 0x8C6C #CJK UNIFIED IDEOGRAPH +0xE6B6 0x8C78 #CJK UNIFIED IDEOGRAPH +0xE6B7 0x8C7A #CJK UNIFIED IDEOGRAPH +0xE6B8 0x8C82 #CJK UNIFIED IDEOGRAPH +0xE6B9 0x8C89 #CJK UNIFIED IDEOGRAPH +0xE6BA 0x8C85 #CJK UNIFIED IDEOGRAPH +0xE6BB 0x8C8A #CJK UNIFIED IDEOGRAPH +0xE6BC 0x8C8D #CJK UNIFIED IDEOGRAPH +0xE6BD 0x8C8E #CJK UNIFIED IDEOGRAPH +0xE6BE 0x8C94 #CJK UNIFIED IDEOGRAPH +0xE6BF 0x8C7C #CJK UNIFIED IDEOGRAPH +0xE6C0 0x8C98 #CJK UNIFIED IDEOGRAPH +0xE6C1 0x621D #CJK UNIFIED IDEOGRAPH +0xE6C2 0x8CAD #CJK UNIFIED IDEOGRAPH +0xE6C3 0x8CAA #CJK UNIFIED IDEOGRAPH +0xE6C4 0x8CBD #CJK UNIFIED IDEOGRAPH +0xE6C5 0x8CB2 #CJK UNIFIED IDEOGRAPH +0xE6C6 0x8CB3 #CJK UNIFIED IDEOGRAPH +0xE6C7 0x8CAE #CJK UNIFIED IDEOGRAPH +0xE6C8 0x8CB6 #CJK UNIFIED IDEOGRAPH +0xE6C9 0x8CC8 #CJK UNIFIED IDEOGRAPH +0xE6CA 0x8CC1 #CJK UNIFIED IDEOGRAPH +0xE6CB 0x8CE4 #CJK UNIFIED IDEOGRAPH +0xE6CC 0x8CE3 #CJK UNIFIED IDEOGRAPH +0xE6CD 0x8CDA #CJK UNIFIED IDEOGRAPH +0xE6CE 0x8CFD #CJK UNIFIED IDEOGRAPH +0xE6CF 0x8CFA #CJK UNIFIED IDEOGRAPH +0xE6D0 0x8CFB #CJK UNIFIED IDEOGRAPH +0xE6D1 0x8D04 #CJK UNIFIED IDEOGRAPH +0xE6D2 0x8D05 #CJK UNIFIED IDEOGRAPH +0xE6D3 0x8D0A #CJK UNIFIED IDEOGRAPH +0xE6D4 0x8D07 #CJK UNIFIED IDEOGRAPH +0xE6D5 0x8D0F #CJK UNIFIED IDEOGRAPH +0xE6D6 0x8D0D #CJK UNIFIED IDEOGRAPH +0xE6D7 0x8D10 #CJK UNIFIED IDEOGRAPH +0xE6D8 0x9F4E #CJK UNIFIED IDEOGRAPH +0xE6D9 0x8D13 #CJK UNIFIED IDEOGRAPH +0xE6DA 0x8CCD #CJK UNIFIED IDEOGRAPH +0xE6DB 0x8D14 #CJK UNIFIED IDEOGRAPH +0xE6DC 0x8D16 #CJK UNIFIED IDEOGRAPH +0xE6DD 0x8D67 #CJK UNIFIED IDEOGRAPH +0xE6DE 0x8D6D #CJK UNIFIED IDEOGRAPH +0xE6DF 0x8D71 #CJK UNIFIED IDEOGRAPH +0xE6E0 0x8D73 #CJK UNIFIED IDEOGRAPH +0xE6E1 0x8D81 #CJK UNIFIED IDEOGRAPH +0xE6E2 0x8D99 #CJK UNIFIED IDEOGRAPH +0xE6E3 0x8DC2 #CJK UNIFIED IDEOGRAPH +0xE6E4 0x8DBE #CJK UNIFIED IDEOGRAPH +0xE6E5 0x8DBA #CJK UNIFIED IDEOGRAPH +0xE6E6 0x8DCF #CJK UNIFIED IDEOGRAPH +0xE6E7 0x8DDA #CJK UNIFIED IDEOGRAPH +0xE6E8 0x8DD6 #CJK UNIFIED IDEOGRAPH +0xE6E9 0x8DCC #CJK UNIFIED IDEOGRAPH +0xE6EA 0x8DDB #CJK UNIFIED IDEOGRAPH +0xE6EB 0x8DCB #CJK UNIFIED IDEOGRAPH +0xE6EC 0x8DEA #CJK UNIFIED IDEOGRAPH +0xE6ED 0x8DEB #CJK UNIFIED IDEOGRAPH +0xE6EE 0x8DDF #CJK UNIFIED IDEOGRAPH +0xE6EF 0x8DE3 #CJK UNIFIED IDEOGRAPH +0xE6F0 0x8DFC #CJK UNIFIED IDEOGRAPH +0xE6F1 0x8E08 #CJK UNIFIED IDEOGRAPH +0xE6F2 0x8E09 #CJK UNIFIED IDEOGRAPH +0xE6F3 0x8DFF #CJK UNIFIED IDEOGRAPH +0xE6F4 0x8E1D #CJK UNIFIED IDEOGRAPH +0xE6F5 0x8E1E #CJK UNIFIED IDEOGRAPH +0xE6F6 0x8E10 #CJK UNIFIED IDEOGRAPH +0xE6F7 0x8E1F #CJK UNIFIED IDEOGRAPH +0xE6F8 0x8E42 #CJK UNIFIED IDEOGRAPH +0xE6F9 0x8E35 #CJK UNIFIED IDEOGRAPH +0xE6FA 0x8E30 #CJK UNIFIED IDEOGRAPH +0xE6FB 0x8E34 #CJK UNIFIED IDEOGRAPH +0xE6FC 0x8E4A #CJK UNIFIED IDEOGRAPH +0xE740 0x8E47 #CJK UNIFIED IDEOGRAPH +0xE741 0x8E49 #CJK UNIFIED IDEOGRAPH +0xE742 0x8E4C #CJK UNIFIED IDEOGRAPH +0xE743 0x8E50 #CJK UNIFIED IDEOGRAPH +0xE744 0x8E48 #CJK UNIFIED IDEOGRAPH +0xE745 0x8E59 #CJK UNIFIED IDEOGRAPH +0xE746 0x8E64 #CJK UNIFIED IDEOGRAPH +0xE747 0x8E60 #CJK UNIFIED IDEOGRAPH +0xE748 0x8E2A #CJK UNIFIED IDEOGRAPH +0xE749 0x8E63 #CJK UNIFIED IDEOGRAPH +0xE74A 0x8E55 #CJK UNIFIED IDEOGRAPH +0xE74B 0x8E76 #CJK UNIFIED IDEOGRAPH +0xE74C 0x8E72 #CJK UNIFIED IDEOGRAPH +0xE74D 0x8E7C #CJK UNIFIED IDEOGRAPH +0xE74E 0x8E81 #CJK UNIFIED IDEOGRAPH +0xE74F 0x8E87 #CJK UNIFIED IDEOGRAPH +0xE750 0x8E85 #CJK UNIFIED IDEOGRAPH +0xE751 0x8E84 #CJK UNIFIED IDEOGRAPH +0xE752 0x8E8B #CJK UNIFIED IDEOGRAPH +0xE753 0x8E8A #CJK UNIFIED IDEOGRAPH +0xE754 0x8E93 #CJK UNIFIED IDEOGRAPH +0xE755 0x8E91 #CJK UNIFIED IDEOGRAPH +0xE756 0x8E94 #CJK UNIFIED IDEOGRAPH +0xE757 0x8E99 #CJK UNIFIED IDEOGRAPH +0xE758 0x8EAA #CJK UNIFIED IDEOGRAPH +0xE759 0x8EA1 #CJK UNIFIED IDEOGRAPH +0xE75A 0x8EAC #CJK UNIFIED IDEOGRAPH +0xE75B 0x8EB0 #CJK UNIFIED IDEOGRAPH +0xE75C 0x8EC6 #CJK UNIFIED IDEOGRAPH +0xE75D 0x8EB1 #CJK UNIFIED IDEOGRAPH +0xE75E 0x8EBE #CJK UNIFIED IDEOGRAPH +0xE75F 0x8EC5 #CJK UNIFIED IDEOGRAPH +0xE760 0x8EC8 #CJK UNIFIED IDEOGRAPH +0xE761 0x8ECB #CJK UNIFIED IDEOGRAPH +0xE762 0x8EDB #CJK UNIFIED IDEOGRAPH +0xE763 0x8EE3 #CJK UNIFIED IDEOGRAPH +0xE764 0x8EFC #CJK UNIFIED IDEOGRAPH +0xE765 0x8EFB #CJK UNIFIED IDEOGRAPH +0xE766 0x8EEB #CJK UNIFIED IDEOGRAPH +0xE767 0x8EFE #CJK UNIFIED IDEOGRAPH +0xE768 0x8F0A #CJK UNIFIED IDEOGRAPH +0xE769 0x8F05 #CJK UNIFIED IDEOGRAPH +0xE76A 0x8F15 #CJK UNIFIED IDEOGRAPH +0xE76B 0x8F12 #CJK UNIFIED IDEOGRAPH +0xE76C 0x8F19 #CJK UNIFIED IDEOGRAPH +0xE76D 0x8F13 #CJK UNIFIED IDEOGRAPH +0xE76E 0x8F1C #CJK UNIFIED IDEOGRAPH +0xE76F 0x8F1F #CJK UNIFIED IDEOGRAPH +0xE770 0x8F1B #CJK UNIFIED IDEOGRAPH +0xE771 0x8F0C #CJK UNIFIED IDEOGRAPH +0xE772 0x8F26 #CJK UNIFIED IDEOGRAPH +0xE773 0x8F33 #CJK UNIFIED IDEOGRAPH +0xE774 0x8F3B #CJK UNIFIED IDEOGRAPH +0xE775 0x8F39 #CJK UNIFIED IDEOGRAPH +0xE776 0x8F45 #CJK UNIFIED IDEOGRAPH +0xE777 0x8F42 #CJK UNIFIED IDEOGRAPH +0xE778 0x8F3E #CJK UNIFIED IDEOGRAPH +0xE779 0x8F4C #CJK UNIFIED IDEOGRAPH +0xE77A 0x8F49 #CJK UNIFIED IDEOGRAPH +0xE77B 0x8F46 #CJK UNIFIED IDEOGRAPH +0xE77C 0x8F4E #CJK UNIFIED IDEOGRAPH +0xE77D 0x8F57 #CJK UNIFIED IDEOGRAPH +0xE77E 0x8F5C #CJK UNIFIED IDEOGRAPH +0xE780 0x8F62 #CJK UNIFIED IDEOGRAPH +0xE781 0x8F63 #CJK UNIFIED IDEOGRAPH +0xE782 0x8F64 #CJK UNIFIED IDEOGRAPH +0xE783 0x8F9C #CJK UNIFIED IDEOGRAPH +0xE784 0x8F9F #CJK UNIFIED IDEOGRAPH +0xE785 0x8FA3 #CJK UNIFIED IDEOGRAPH +0xE786 0x8FAD #CJK UNIFIED IDEOGRAPH +0xE787 0x8FAF #CJK UNIFIED IDEOGRAPH +0xE788 0x8FB7 #CJK UNIFIED IDEOGRAPH +0xE789 0x8FDA #CJK UNIFIED IDEOGRAPH +0xE78A 0x8FE5 #CJK UNIFIED IDEOGRAPH +0xE78B 0x8FE2 #CJK UNIFIED IDEOGRAPH +0xE78C 0x8FEA #CJK UNIFIED IDEOGRAPH +0xE78D 0x8FEF #CJK UNIFIED IDEOGRAPH +0xE78E 0x9087 #CJK UNIFIED IDEOGRAPH +0xE78F 0x8FF4 #CJK UNIFIED IDEOGRAPH +0xE790 0x9005 #CJK UNIFIED IDEOGRAPH +0xE791 0x8FF9 #CJK UNIFIED IDEOGRAPH +0xE792 0x8FFA #CJK UNIFIED IDEOGRAPH +0xE793 0x9011 #CJK UNIFIED IDEOGRAPH +0xE794 0x9015 #CJK UNIFIED IDEOGRAPH +0xE795 0x9021 #CJK UNIFIED IDEOGRAPH +0xE796 0x900D #CJK UNIFIED IDEOGRAPH +0xE797 0x901E #CJK UNIFIED IDEOGRAPH +0xE798 0x9016 #CJK UNIFIED IDEOGRAPH +0xE799 0x900B #CJK UNIFIED IDEOGRAPH +0xE79A 0x9027 #CJK UNIFIED IDEOGRAPH +0xE79B 0x9036 #CJK UNIFIED IDEOGRAPH +0xE79C 0x9035 #CJK UNIFIED IDEOGRAPH +0xE79D 0x9039 #CJK UNIFIED IDEOGRAPH +0xE79E 0x8FF8 #CJK UNIFIED IDEOGRAPH +0xE79F 0x904F #CJK UNIFIED IDEOGRAPH +0xE7A0 0x9050 #CJK UNIFIED IDEOGRAPH +0xE7A1 0x9051 #CJK UNIFIED IDEOGRAPH +0xE7A2 0x9052 #CJK UNIFIED IDEOGRAPH +0xE7A3 0x900E #CJK UNIFIED IDEOGRAPH +0xE7A4 0x9049 #CJK UNIFIED IDEOGRAPH +0xE7A5 0x903E #CJK UNIFIED IDEOGRAPH +0xE7A6 0x9056 #CJK UNIFIED IDEOGRAPH +0xE7A7 0x9058 #CJK UNIFIED IDEOGRAPH +0xE7A8 0x905E #CJK UNIFIED IDEOGRAPH +0xE7A9 0x9068 #CJK UNIFIED IDEOGRAPH +0xE7AA 0x906F #CJK UNIFIED IDEOGRAPH +0xE7AB 0x9076 #CJK UNIFIED IDEOGRAPH +0xE7AC 0x96A8 #CJK UNIFIED IDEOGRAPH +0xE7AD 0x9072 #CJK UNIFIED IDEOGRAPH +0xE7AE 0x9082 #CJK UNIFIED IDEOGRAPH +0xE7AF 0x907D #CJK UNIFIED IDEOGRAPH +0xE7B0 0x9081 #CJK UNIFIED IDEOGRAPH +0xE7B1 0x9080 #CJK UNIFIED IDEOGRAPH +0xE7B2 0x908A #CJK UNIFIED IDEOGRAPH +0xE7B3 0x9089 #CJK UNIFIED IDEOGRAPH +0xE7B4 0x908F #CJK UNIFIED IDEOGRAPH +0xE7B5 0x90A8 #CJK UNIFIED IDEOGRAPH +0xE7B6 0x90AF #CJK UNIFIED IDEOGRAPH +0xE7B7 0x90B1 #CJK UNIFIED IDEOGRAPH +0xE7B8 0x90B5 #CJK UNIFIED IDEOGRAPH +0xE7B9 0x90E2 #CJK UNIFIED IDEOGRAPH +0xE7BA 0x90E4 #CJK UNIFIED IDEOGRAPH +0xE7BB 0x6248 #CJK UNIFIED IDEOGRAPH +0xE7BC 0x90DB #CJK UNIFIED IDEOGRAPH +0xE7BD 0x9102 #CJK UNIFIED IDEOGRAPH +0xE7BE 0x9112 #CJK UNIFIED IDEOGRAPH +0xE7BF 0x9119 #CJK UNIFIED IDEOGRAPH +0xE7C0 0x9132 #CJK UNIFIED IDEOGRAPH +0xE7C1 0x9130 #CJK UNIFIED IDEOGRAPH +0xE7C2 0x914A #CJK UNIFIED IDEOGRAPH +0xE7C3 0x9156 #CJK UNIFIED IDEOGRAPH +0xE7C4 0x9158 #CJK UNIFIED IDEOGRAPH +0xE7C5 0x9163 #CJK UNIFIED IDEOGRAPH +0xE7C6 0x9165 #CJK UNIFIED IDEOGRAPH +0xE7C7 0x9169 #CJK UNIFIED IDEOGRAPH +0xE7C8 0x9173 #CJK UNIFIED IDEOGRAPH +0xE7C9 0x9172 #CJK UNIFIED IDEOGRAPH +0xE7CA 0x918B #CJK UNIFIED IDEOGRAPH +0xE7CB 0x9189 #CJK UNIFIED IDEOGRAPH +0xE7CC 0x9182 #CJK UNIFIED IDEOGRAPH +0xE7CD 0x91A2 #CJK UNIFIED IDEOGRAPH +0xE7CE 0x91AB #CJK UNIFIED IDEOGRAPH +0xE7CF 0x91AF #CJK UNIFIED IDEOGRAPH +0xE7D0 0x91AA #CJK UNIFIED IDEOGRAPH +0xE7D1 0x91B5 #CJK UNIFIED IDEOGRAPH +0xE7D2 0x91B4 #CJK UNIFIED IDEOGRAPH +0xE7D3 0x91BA #CJK UNIFIED IDEOGRAPH +0xE7D4 0x91C0 #CJK UNIFIED IDEOGRAPH +0xE7D5 0x91C1 #CJK UNIFIED IDEOGRAPH +0xE7D6 0x91C9 #CJK UNIFIED IDEOGRAPH +0xE7D7 0x91CB #CJK UNIFIED IDEOGRAPH +0xE7D8 0x91D0 #CJK UNIFIED IDEOGRAPH +0xE7D9 0x91D6 #CJK UNIFIED IDEOGRAPH +0xE7DA 0x91DF #CJK UNIFIED IDEOGRAPH +0xE7DB 0x91E1 #CJK UNIFIED IDEOGRAPH +0xE7DC 0x91DB #CJK UNIFIED IDEOGRAPH +0xE7DD 0x91FC #CJK UNIFIED IDEOGRAPH +0xE7DE 0x91F5 #CJK UNIFIED IDEOGRAPH +0xE7DF 0x91F6 #CJK UNIFIED IDEOGRAPH +0xE7E0 0x921E #CJK UNIFIED IDEOGRAPH +0xE7E1 0x91FF #CJK UNIFIED IDEOGRAPH +0xE7E2 0x9214 #CJK UNIFIED IDEOGRAPH +0xE7E3 0x922C #CJK UNIFIED IDEOGRAPH +0xE7E4 0x9215 #CJK UNIFIED IDEOGRAPH +0xE7E5 0x9211 #CJK UNIFIED IDEOGRAPH +0xE7E6 0x925E #CJK UNIFIED IDEOGRAPH +0xE7E7 0x9257 #CJK UNIFIED IDEOGRAPH +0xE7E8 0x9245 #CJK UNIFIED IDEOGRAPH +0xE7E9 0x9249 #CJK UNIFIED IDEOGRAPH +0xE7EA 0x9264 #CJK UNIFIED IDEOGRAPH +0xE7EB 0x9248 #CJK UNIFIED IDEOGRAPH +0xE7EC 0x9295 #CJK UNIFIED IDEOGRAPH +0xE7ED 0x923F #CJK UNIFIED IDEOGRAPH +0xE7EE 0x924B #CJK UNIFIED IDEOGRAPH +0xE7EF 0x9250 #CJK UNIFIED IDEOGRAPH +0xE7F0 0x929C #CJK UNIFIED IDEOGRAPH +0xE7F1 0x9296 #CJK UNIFIED IDEOGRAPH +0xE7F2 0x9293 #CJK UNIFIED IDEOGRAPH +0xE7F3 0x929B #CJK UNIFIED IDEOGRAPH +0xE7F4 0x925A #CJK UNIFIED IDEOGRAPH +0xE7F5 0x92CF #CJK UNIFIED IDEOGRAPH +0xE7F6 0x92B9 #CJK UNIFIED IDEOGRAPH +0xE7F7 0x92B7 #CJK UNIFIED IDEOGRAPH +0xE7F8 0x92E9 #CJK UNIFIED IDEOGRAPH +0xE7F9 0x930F #CJK UNIFIED IDEOGRAPH +0xE7FA 0x92FA #CJK UNIFIED IDEOGRAPH +0xE7FB 0x9344 #CJK UNIFIED IDEOGRAPH +0xE7FC 0x932E #CJK UNIFIED IDEOGRAPH +0xE840 0x9319 #CJK UNIFIED IDEOGRAPH +0xE841 0x9322 #CJK UNIFIED IDEOGRAPH +0xE842 0x931A #CJK UNIFIED IDEOGRAPH +0xE843 0x9323 #CJK UNIFIED IDEOGRAPH +0xE844 0x933A #CJK UNIFIED IDEOGRAPH +0xE845 0x9335 #CJK UNIFIED IDEOGRAPH +0xE846 0x933B #CJK UNIFIED IDEOGRAPH +0xE847 0x935C #CJK UNIFIED IDEOGRAPH +0xE848 0x9360 #CJK UNIFIED IDEOGRAPH +0xE849 0x937C #CJK UNIFIED IDEOGRAPH +0xE84A 0x936E #CJK UNIFIED IDEOGRAPH +0xE84B 0x9356 #CJK UNIFIED IDEOGRAPH +0xE84C 0x93B0 #CJK UNIFIED IDEOGRAPH +0xE84D 0x93AC #CJK UNIFIED IDEOGRAPH +0xE84E 0x93AD #CJK UNIFIED IDEOGRAPH +0xE84F 0x9394 #CJK UNIFIED IDEOGRAPH +0xE850 0x93B9 #CJK UNIFIED IDEOGRAPH +0xE851 0x93D6 #CJK UNIFIED IDEOGRAPH +0xE852 0x93D7 #CJK UNIFIED IDEOGRAPH +0xE853 0x93E8 #CJK UNIFIED IDEOGRAPH +0xE854 0x93E5 #CJK UNIFIED IDEOGRAPH +0xE855 0x93D8 #CJK UNIFIED IDEOGRAPH +0xE856 0x93C3 #CJK UNIFIED IDEOGRAPH +0xE857 0x93DD #CJK UNIFIED IDEOGRAPH +0xE858 0x93D0 #CJK UNIFIED IDEOGRAPH +0xE859 0x93C8 #CJK UNIFIED IDEOGRAPH +0xE85A 0x93E4 #CJK UNIFIED IDEOGRAPH +0xE85B 0x941A #CJK UNIFIED IDEOGRAPH +0xE85C 0x9414 #CJK UNIFIED IDEOGRAPH +0xE85D 0x9413 #CJK UNIFIED IDEOGRAPH +0xE85E 0x9403 #CJK UNIFIED IDEOGRAPH +0xE85F 0x9407 #CJK UNIFIED IDEOGRAPH +0xE860 0x9410 #CJK UNIFIED IDEOGRAPH +0xE861 0x9436 #CJK UNIFIED IDEOGRAPH +0xE862 0x942B #CJK UNIFIED IDEOGRAPH +0xE863 0x9435 #CJK UNIFIED IDEOGRAPH +0xE864 0x9421 #CJK UNIFIED IDEOGRAPH +0xE865 0x943A #CJK UNIFIED IDEOGRAPH +0xE866 0x9441 #CJK UNIFIED IDEOGRAPH +0xE867 0x9452 #CJK UNIFIED IDEOGRAPH +0xE868 0x9444 #CJK UNIFIED IDEOGRAPH +0xE869 0x945B #CJK UNIFIED IDEOGRAPH +0xE86A 0x9460 #CJK UNIFIED IDEOGRAPH +0xE86B 0x9462 #CJK UNIFIED IDEOGRAPH +0xE86C 0x945E #CJK UNIFIED IDEOGRAPH +0xE86D 0x946A #CJK UNIFIED IDEOGRAPH +0xE86E 0x9229 #CJK UNIFIED IDEOGRAPH +0xE86F 0x9470 #CJK UNIFIED IDEOGRAPH +0xE870 0x9475 #CJK UNIFIED IDEOGRAPH +0xE871 0x9477 #CJK UNIFIED IDEOGRAPH +0xE872 0x947D #CJK UNIFIED IDEOGRAPH +0xE873 0x945A #CJK UNIFIED IDEOGRAPH +0xE874 0x947C #CJK UNIFIED IDEOGRAPH +0xE875 0x947E #CJK UNIFIED IDEOGRAPH +0xE876 0x9481 #CJK UNIFIED IDEOGRAPH +0xE877 0x947F #CJK UNIFIED IDEOGRAPH +0xE878 0x9582 #CJK UNIFIED IDEOGRAPH +0xE879 0x9587 #CJK UNIFIED IDEOGRAPH +0xE87A 0x958A #CJK UNIFIED IDEOGRAPH +0xE87B 0x9594 #CJK UNIFIED IDEOGRAPH +0xE87C 0x9596 #CJK UNIFIED IDEOGRAPH +0xE87D 0x9598 #CJK UNIFIED IDEOGRAPH +0xE87E 0x9599 #CJK UNIFIED IDEOGRAPH +0xE880 0x95A0 #CJK UNIFIED IDEOGRAPH +0xE881 0x95A8 #CJK UNIFIED IDEOGRAPH +0xE882 0x95A7 #CJK UNIFIED IDEOGRAPH +0xE883 0x95AD #CJK UNIFIED IDEOGRAPH +0xE884 0x95BC #CJK UNIFIED IDEOGRAPH +0xE885 0x95BB #CJK UNIFIED IDEOGRAPH +0xE886 0x95B9 #CJK UNIFIED IDEOGRAPH +0xE887 0x95BE #CJK UNIFIED IDEOGRAPH +0xE888 0x95CA #CJK UNIFIED IDEOGRAPH +0xE889 0x6FF6 #CJK UNIFIED IDEOGRAPH +0xE88A 0x95C3 #CJK UNIFIED IDEOGRAPH +0xE88B 0x95CD #CJK UNIFIED IDEOGRAPH +0xE88C 0x95CC #CJK UNIFIED IDEOGRAPH +0xE88D 0x95D5 #CJK UNIFIED IDEOGRAPH +0xE88E 0x95D4 #CJK UNIFIED IDEOGRAPH +0xE88F 0x95D6 #CJK UNIFIED IDEOGRAPH +0xE890 0x95DC #CJK UNIFIED IDEOGRAPH +0xE891 0x95E1 #CJK UNIFIED IDEOGRAPH +0xE892 0x95E5 #CJK UNIFIED IDEOGRAPH +0xE893 0x95E2 #CJK UNIFIED IDEOGRAPH +0xE894 0x9621 #CJK UNIFIED IDEOGRAPH +0xE895 0x9628 #CJK UNIFIED IDEOGRAPH +0xE896 0x962E #CJK UNIFIED IDEOGRAPH +0xE897 0x962F #CJK UNIFIED IDEOGRAPH +0xE898 0x9642 #CJK UNIFIED IDEOGRAPH +0xE899 0x964C #CJK UNIFIED IDEOGRAPH +0xE89A 0x964F #CJK UNIFIED IDEOGRAPH +0xE89B 0x964B #CJK UNIFIED IDEOGRAPH +0xE89C 0x9677 #CJK UNIFIED IDEOGRAPH +0xE89D 0x965C #CJK UNIFIED IDEOGRAPH +0xE89E 0x965E #CJK UNIFIED IDEOGRAPH +0xE89F 0x965D #CJK UNIFIED IDEOGRAPH +0xE8A0 0x965F #CJK UNIFIED IDEOGRAPH +0xE8A1 0x9666 #CJK UNIFIED IDEOGRAPH +0xE8A2 0x9672 #CJK UNIFIED IDEOGRAPH +0xE8A3 0x966C #CJK UNIFIED IDEOGRAPH +0xE8A4 0x968D #CJK UNIFIED IDEOGRAPH +0xE8A5 0x9698 #CJK UNIFIED IDEOGRAPH +0xE8A6 0x9695 #CJK UNIFIED IDEOGRAPH +0xE8A7 0x9697 #CJK UNIFIED IDEOGRAPH +0xE8A8 0x96AA #CJK UNIFIED IDEOGRAPH +0xE8A9 0x96A7 #CJK UNIFIED IDEOGRAPH +0xE8AA 0x96B1 #CJK UNIFIED IDEOGRAPH +0xE8AB 0x96B2 #CJK UNIFIED IDEOGRAPH +0xE8AC 0x96B0 #CJK UNIFIED IDEOGRAPH +0xE8AD 0x96B4 #CJK UNIFIED IDEOGRAPH +0xE8AE 0x96B6 #CJK UNIFIED IDEOGRAPH +0xE8AF 0x96B8 #CJK UNIFIED IDEOGRAPH +0xE8B0 0x96B9 #CJK UNIFIED IDEOGRAPH +0xE8B1 0x96CE #CJK UNIFIED IDEOGRAPH +0xE8B2 0x96CB #CJK UNIFIED IDEOGRAPH +0xE8B3 0x96C9 #CJK UNIFIED IDEOGRAPH +0xE8B4 0x96CD #CJK UNIFIED IDEOGRAPH +0xE8B5 0x894D #CJK UNIFIED IDEOGRAPH +0xE8B6 0x96DC #CJK UNIFIED IDEOGRAPH +0xE8B7 0x970D #CJK UNIFIED IDEOGRAPH +0xE8B8 0x96D5 #CJK UNIFIED IDEOGRAPH +0xE8B9 0x96F9 #CJK UNIFIED IDEOGRAPH +0xE8BA 0x9704 #CJK UNIFIED IDEOGRAPH +0xE8BB 0x9706 #CJK UNIFIED IDEOGRAPH +0xE8BC 0x9708 #CJK UNIFIED IDEOGRAPH +0xE8BD 0x9713 #CJK UNIFIED IDEOGRAPH +0xE8BE 0x970E #CJK UNIFIED IDEOGRAPH +0xE8BF 0x9711 #CJK UNIFIED IDEOGRAPH +0xE8C0 0x970F #CJK UNIFIED IDEOGRAPH +0xE8C1 0x9716 #CJK UNIFIED IDEOGRAPH +0xE8C2 0x9719 #CJK UNIFIED IDEOGRAPH +0xE8C3 0x9724 #CJK UNIFIED IDEOGRAPH +0xE8C4 0x972A #CJK UNIFIED IDEOGRAPH +0xE8C5 0x9730 #CJK UNIFIED IDEOGRAPH +0xE8C6 0x9739 #CJK UNIFIED IDEOGRAPH +0xE8C7 0x973D #CJK UNIFIED IDEOGRAPH +0xE8C8 0x973E #CJK UNIFIED IDEOGRAPH +0xE8C9 0x9744 #CJK UNIFIED IDEOGRAPH +0xE8CA 0x9746 #CJK UNIFIED IDEOGRAPH +0xE8CB 0x9748 #CJK UNIFIED IDEOGRAPH +0xE8CC 0x9742 #CJK UNIFIED IDEOGRAPH +0xE8CD 0x9749 #CJK UNIFIED IDEOGRAPH +0xE8CE 0x975C #CJK UNIFIED IDEOGRAPH +0xE8CF 0x9760 #CJK UNIFIED IDEOGRAPH +0xE8D0 0x9764 #CJK UNIFIED IDEOGRAPH +0xE8D1 0x9766 #CJK UNIFIED IDEOGRAPH +0xE8D2 0x9768 #CJK UNIFIED IDEOGRAPH +0xE8D3 0x52D2 #CJK UNIFIED IDEOGRAPH +0xE8D4 0x976B #CJK UNIFIED IDEOGRAPH +0xE8D5 0x9771 #CJK UNIFIED IDEOGRAPH +0xE8D6 0x9779 #CJK UNIFIED IDEOGRAPH +0xE8D7 0x9785 #CJK UNIFIED IDEOGRAPH +0xE8D8 0x977C #CJK UNIFIED IDEOGRAPH +0xE8D9 0x9781 #CJK UNIFIED IDEOGRAPH +0xE8DA 0x977A #CJK UNIFIED IDEOGRAPH +0xE8DB 0x9786 #CJK UNIFIED IDEOGRAPH +0xE8DC 0x978B #CJK UNIFIED IDEOGRAPH +0xE8DD 0x978F #CJK UNIFIED IDEOGRAPH +0xE8DE 0x9790 #CJK UNIFIED IDEOGRAPH +0xE8DF 0x979C #CJK UNIFIED IDEOGRAPH +0xE8E0 0x97A8 #CJK UNIFIED IDEOGRAPH +0xE8E1 0x97A6 #CJK UNIFIED IDEOGRAPH +0xE8E2 0x97A3 #CJK UNIFIED IDEOGRAPH +0xE8E3 0x97B3 #CJK UNIFIED IDEOGRAPH +0xE8E4 0x97B4 #CJK UNIFIED IDEOGRAPH +0xE8E5 0x97C3 #CJK UNIFIED IDEOGRAPH +0xE8E6 0x97C6 #CJK UNIFIED IDEOGRAPH +0xE8E7 0x97C8 #CJK UNIFIED IDEOGRAPH +0xE8E8 0x97CB #CJK UNIFIED IDEOGRAPH +0xE8E9 0x97DC #CJK UNIFIED IDEOGRAPH +0xE8EA 0x97ED #CJK UNIFIED IDEOGRAPH +0xE8EB 0x9F4F #CJK UNIFIED IDEOGRAPH +0xE8EC 0x97F2 #CJK UNIFIED IDEOGRAPH +0xE8ED 0x7ADF #CJK UNIFIED IDEOGRAPH +0xE8EE 0x97F6 #CJK UNIFIED IDEOGRAPH +0xE8EF 0x97F5 #CJK UNIFIED IDEOGRAPH +0xE8F0 0x980F #CJK UNIFIED IDEOGRAPH +0xE8F1 0x980C #CJK UNIFIED IDEOGRAPH +0xE8F2 0x9838 #CJK UNIFIED IDEOGRAPH +0xE8F3 0x9824 #CJK UNIFIED IDEOGRAPH +0xE8F4 0x9821 #CJK UNIFIED IDEOGRAPH +0xE8F5 0x9837 #CJK UNIFIED IDEOGRAPH +0xE8F6 0x983D #CJK UNIFIED IDEOGRAPH +0xE8F7 0x9846 #CJK UNIFIED IDEOGRAPH +0xE8F8 0x984F #CJK UNIFIED IDEOGRAPH +0xE8F9 0x984B #CJK UNIFIED IDEOGRAPH +0xE8FA 0x986B #CJK UNIFIED IDEOGRAPH +0xE8FB 0x986F #CJK UNIFIED IDEOGRAPH +0xE8FC 0x9870 #CJK UNIFIED IDEOGRAPH +0xE940 0x9871 #CJK UNIFIED IDEOGRAPH +0xE941 0x9874 #CJK UNIFIED IDEOGRAPH +0xE942 0x9873 #CJK UNIFIED IDEOGRAPH +0xE943 0x98AA #CJK UNIFIED IDEOGRAPH +0xE944 0x98AF #CJK UNIFIED IDEOGRAPH +0xE945 0x98B1 #CJK UNIFIED IDEOGRAPH +0xE946 0x98B6 #CJK UNIFIED IDEOGRAPH +0xE947 0x98C4 #CJK UNIFIED IDEOGRAPH +0xE948 0x98C3 #CJK UNIFIED IDEOGRAPH +0xE949 0x98C6 #CJK UNIFIED IDEOGRAPH +0xE94A 0x98E9 #CJK UNIFIED IDEOGRAPH +0xE94B 0x98EB #CJK UNIFIED IDEOGRAPH +0xE94C 0x9903 #CJK UNIFIED IDEOGRAPH +0xE94D 0x9909 #CJK UNIFIED IDEOGRAPH +0xE94E 0x9912 #CJK UNIFIED IDEOGRAPH +0xE94F 0x9914 #CJK UNIFIED IDEOGRAPH +0xE950 0x9918 #CJK UNIFIED IDEOGRAPH +0xE951 0x9921 #CJK UNIFIED IDEOGRAPH +0xE952 0x991D #CJK UNIFIED IDEOGRAPH +0xE953 0x991E #CJK UNIFIED IDEOGRAPH +0xE954 0x9924 #CJK UNIFIED IDEOGRAPH +0xE955 0x9920 #CJK UNIFIED IDEOGRAPH +0xE956 0x992C #CJK UNIFIED IDEOGRAPH +0xE957 0x992E #CJK UNIFIED IDEOGRAPH +0xE958 0x993D #CJK UNIFIED IDEOGRAPH +0xE959 0x993E #CJK UNIFIED IDEOGRAPH +0xE95A 0x9942 #CJK UNIFIED IDEOGRAPH +0xE95B 0x9949 #CJK UNIFIED IDEOGRAPH +0xE95C 0x9945 #CJK UNIFIED IDEOGRAPH +0xE95D 0x9950 #CJK UNIFIED IDEOGRAPH +0xE95E 0x994B #CJK UNIFIED IDEOGRAPH +0xE95F 0x9951 #CJK UNIFIED IDEOGRAPH +0xE960 0x9952 #CJK UNIFIED IDEOGRAPH +0xE961 0x994C #CJK UNIFIED IDEOGRAPH +0xE962 0x9955 #CJK UNIFIED IDEOGRAPH +0xE963 0x9997 #CJK UNIFIED IDEOGRAPH +0xE964 0x9998 #CJK UNIFIED IDEOGRAPH +0xE965 0x99A5 #CJK UNIFIED IDEOGRAPH +0xE966 0x99AD #CJK UNIFIED IDEOGRAPH +0xE967 0x99AE #CJK UNIFIED IDEOGRAPH +0xE968 0x99BC #CJK UNIFIED IDEOGRAPH +0xE969 0x99DF #CJK UNIFIED IDEOGRAPH +0xE96A 0x99DB #CJK UNIFIED IDEOGRAPH +0xE96B 0x99DD #CJK UNIFIED IDEOGRAPH +0xE96C 0x99D8 #CJK UNIFIED IDEOGRAPH +0xE96D 0x99D1 #CJK UNIFIED IDEOGRAPH +0xE96E 0x99ED #CJK UNIFIED IDEOGRAPH +0xE96F 0x99EE #CJK UNIFIED IDEOGRAPH +0xE970 0x99F1 #CJK UNIFIED IDEOGRAPH +0xE971 0x99F2 #CJK UNIFIED IDEOGRAPH +0xE972 0x99FB #CJK UNIFIED IDEOGRAPH +0xE973 0x99F8 #CJK UNIFIED IDEOGRAPH +0xE974 0x9A01 #CJK UNIFIED IDEOGRAPH +0xE975 0x9A0F #CJK UNIFIED IDEOGRAPH +0xE976 0x9A05 #CJK UNIFIED IDEOGRAPH +0xE977 0x99E2 #CJK UNIFIED IDEOGRAPH +0xE978 0x9A19 #CJK UNIFIED IDEOGRAPH +0xE979 0x9A2B #CJK UNIFIED IDEOGRAPH +0xE97A 0x9A37 #CJK UNIFIED IDEOGRAPH +0xE97B 0x9A45 #CJK UNIFIED IDEOGRAPH +0xE97C 0x9A42 #CJK UNIFIED IDEOGRAPH +0xE97D 0x9A40 #CJK UNIFIED IDEOGRAPH +0xE97E 0x9A43 #CJK UNIFIED IDEOGRAPH +0xE980 0x9A3E #CJK UNIFIED IDEOGRAPH +0xE981 0x9A55 #CJK UNIFIED IDEOGRAPH +0xE982 0x9A4D #CJK UNIFIED IDEOGRAPH +0xE983 0x9A5B #CJK UNIFIED IDEOGRAPH +0xE984 0x9A57 #CJK UNIFIED IDEOGRAPH +0xE985 0x9A5F #CJK UNIFIED IDEOGRAPH +0xE986 0x9A62 #CJK UNIFIED IDEOGRAPH +0xE987 0x9A65 #CJK UNIFIED IDEOGRAPH +0xE988 0x9A64 #CJK UNIFIED IDEOGRAPH +0xE989 0x9A69 #CJK UNIFIED IDEOGRAPH +0xE98A 0x9A6B #CJK UNIFIED IDEOGRAPH +0xE98B 0x9A6A #CJK UNIFIED IDEOGRAPH +0xE98C 0x9AAD #CJK UNIFIED IDEOGRAPH +0xE98D 0x9AB0 #CJK UNIFIED IDEOGRAPH +0xE98E 0x9ABC #CJK UNIFIED IDEOGRAPH +0xE98F 0x9AC0 #CJK UNIFIED IDEOGRAPH +0xE990 0x9ACF #CJK UNIFIED IDEOGRAPH +0xE991 0x9AD1 #CJK UNIFIED IDEOGRAPH +0xE992 0x9AD3 #CJK UNIFIED IDEOGRAPH +0xE993 0x9AD4 #CJK UNIFIED IDEOGRAPH +0xE994 0x9ADE #CJK UNIFIED IDEOGRAPH +0xE995 0x9ADF #CJK UNIFIED IDEOGRAPH +0xE996 0x9AE2 #CJK UNIFIED IDEOGRAPH +0xE997 0x9AE3 #CJK UNIFIED IDEOGRAPH +0xE998 0x9AE6 #CJK UNIFIED IDEOGRAPH +0xE999 0x9AEF #CJK UNIFIED IDEOGRAPH +0xE99A 0x9AEB #CJK UNIFIED IDEOGRAPH +0xE99B 0x9AEE #CJK UNIFIED IDEOGRAPH +0xE99C 0x9AF4 #CJK UNIFIED IDEOGRAPH +0xE99D 0x9AF1 #CJK UNIFIED IDEOGRAPH +0xE99E 0x9AF7 #CJK UNIFIED IDEOGRAPH +0xE99F 0x9AFB #CJK UNIFIED IDEOGRAPH +0xE9A0 0x9B06 #CJK UNIFIED IDEOGRAPH +0xE9A1 0x9B18 #CJK UNIFIED IDEOGRAPH +0xE9A2 0x9B1A #CJK UNIFIED IDEOGRAPH +0xE9A3 0x9B1F #CJK UNIFIED IDEOGRAPH +0xE9A4 0x9B22 #CJK UNIFIED IDEOGRAPH +0xE9A5 0x9B23 #CJK UNIFIED IDEOGRAPH +0xE9A6 0x9B25 #CJK UNIFIED IDEOGRAPH +0xE9A7 0x9B27 #CJK UNIFIED IDEOGRAPH +0xE9A8 0x9B28 #CJK UNIFIED IDEOGRAPH +0xE9A9 0x9B29 #CJK UNIFIED IDEOGRAPH +0xE9AA 0x9B2A #CJK UNIFIED IDEOGRAPH +0xE9AB 0x9B2E #CJK UNIFIED IDEOGRAPH +0xE9AC 0x9B2F #CJK UNIFIED IDEOGRAPH +0xE9AD 0x9B32 #CJK UNIFIED IDEOGRAPH +0xE9AE 0x9B44 #CJK UNIFIED IDEOGRAPH +0xE9AF 0x9B43 #CJK UNIFIED IDEOGRAPH +0xE9B0 0x9B4F #CJK UNIFIED IDEOGRAPH +0xE9B1 0x9B4D #CJK UNIFIED IDEOGRAPH +0xE9B2 0x9B4E #CJK UNIFIED IDEOGRAPH +0xE9B3 0x9B51 #CJK UNIFIED IDEOGRAPH +0xE9B4 0x9B58 #CJK UNIFIED IDEOGRAPH +0xE9B5 0x9B74 #CJK UNIFIED IDEOGRAPH +0xE9B6 0x9B93 #CJK UNIFIED IDEOGRAPH +0xE9B7 0x9B83 #CJK UNIFIED IDEOGRAPH +0xE9B8 0x9B91 #CJK UNIFIED IDEOGRAPH +0xE9B9 0x9B96 #CJK UNIFIED IDEOGRAPH +0xE9BA 0x9B97 #CJK UNIFIED IDEOGRAPH +0xE9BB 0x9B9F #CJK UNIFIED IDEOGRAPH +0xE9BC 0x9BA0 #CJK UNIFIED IDEOGRAPH +0xE9BD 0x9BA8 #CJK UNIFIED IDEOGRAPH +0xE9BE 0x9BB4 #CJK UNIFIED IDEOGRAPH +0xE9BF 0x9BC0 #CJK UNIFIED IDEOGRAPH +0xE9C0 0x9BCA #CJK UNIFIED IDEOGRAPH +0xE9C1 0x9BB9 #CJK UNIFIED IDEOGRAPH +0xE9C2 0x9BC6 #CJK UNIFIED IDEOGRAPH +0xE9C3 0x9BCF #CJK UNIFIED IDEOGRAPH +0xE9C4 0x9BD1 #CJK UNIFIED IDEOGRAPH +0xE9C5 0x9BD2 #CJK UNIFIED IDEOGRAPH +0xE9C6 0x9BE3 #CJK UNIFIED IDEOGRAPH +0xE9C7 0x9BE2 #CJK UNIFIED IDEOGRAPH +0xE9C8 0x9BE4 #CJK UNIFIED IDEOGRAPH +0xE9C9 0x9BD4 #CJK UNIFIED IDEOGRAPH +0xE9CA 0x9BE1 #CJK UNIFIED IDEOGRAPH +0xE9CB 0x9C3A #CJK UNIFIED IDEOGRAPH +0xE9CC 0x9BF2 #CJK UNIFIED IDEOGRAPH +0xE9CD 0x9BF1 #CJK UNIFIED IDEOGRAPH +0xE9CE 0x9BF0 #CJK UNIFIED IDEOGRAPH +0xE9CF 0x9C15 #CJK UNIFIED IDEOGRAPH +0xE9D0 0x9C14 #CJK UNIFIED IDEOGRAPH +0xE9D1 0x9C09 #CJK UNIFIED IDEOGRAPH +0xE9D2 0x9C13 #CJK UNIFIED IDEOGRAPH +0xE9D3 0x9C0C #CJK UNIFIED IDEOGRAPH +0xE9D4 0x9C06 #CJK UNIFIED IDEOGRAPH +0xE9D5 0x9C08 #CJK UNIFIED IDEOGRAPH +0xE9D6 0x9C12 #CJK UNIFIED IDEOGRAPH +0xE9D7 0x9C0A #CJK UNIFIED IDEOGRAPH +0xE9D8 0x9C04 #CJK UNIFIED IDEOGRAPH +0xE9D9 0x9C2E #CJK UNIFIED IDEOGRAPH +0xE9DA 0x9C1B #CJK UNIFIED IDEOGRAPH +0xE9DB 0x9C25 #CJK UNIFIED IDEOGRAPH +0xE9DC 0x9C24 #CJK UNIFIED IDEOGRAPH +0xE9DD 0x9C21 #CJK UNIFIED IDEOGRAPH +0xE9DE 0x9C30 #CJK UNIFIED IDEOGRAPH +0xE9DF 0x9C47 #CJK UNIFIED IDEOGRAPH +0xE9E0 0x9C32 #CJK UNIFIED IDEOGRAPH +0xE9E1 0x9C46 #CJK UNIFIED IDEOGRAPH +0xE9E2 0x9C3E #CJK UNIFIED IDEOGRAPH +0xE9E3 0x9C5A #CJK UNIFIED IDEOGRAPH +0xE9E4 0x9C60 #CJK UNIFIED IDEOGRAPH +0xE9E5 0x9C67 #CJK UNIFIED IDEOGRAPH +0xE9E6 0x9C76 #CJK UNIFIED IDEOGRAPH +0xE9E7 0x9C78 #CJK UNIFIED IDEOGRAPH +0xE9E8 0x9CE7 #CJK UNIFIED IDEOGRAPH +0xE9E9 0x9CEC #CJK UNIFIED IDEOGRAPH +0xE9EA 0x9CF0 #CJK UNIFIED IDEOGRAPH +0xE9EB 0x9D09 #CJK UNIFIED IDEOGRAPH +0xE9EC 0x9D08 #CJK UNIFIED IDEOGRAPH +0xE9ED 0x9CEB #CJK UNIFIED IDEOGRAPH +0xE9EE 0x9D03 #CJK UNIFIED IDEOGRAPH +0xE9EF 0x9D06 #CJK UNIFIED IDEOGRAPH +0xE9F0 0x9D2A #CJK UNIFIED IDEOGRAPH +0xE9F1 0x9D26 #CJK UNIFIED IDEOGRAPH +0xE9F2 0x9DAF #CJK UNIFIED IDEOGRAPH +0xE9F3 0x9D23 #CJK UNIFIED IDEOGRAPH +0xE9F4 0x9D1F #CJK UNIFIED IDEOGRAPH +0xE9F5 0x9D44 #CJK UNIFIED IDEOGRAPH +0xE9F6 0x9D15 #CJK UNIFIED IDEOGRAPH +0xE9F7 0x9D12 #CJK UNIFIED IDEOGRAPH +0xE9F8 0x9D41 #CJK UNIFIED IDEOGRAPH +0xE9F9 0x9D3F #CJK UNIFIED IDEOGRAPH +0xE9FA 0x9D3E #CJK UNIFIED IDEOGRAPH +0xE9FB 0x9D46 #CJK UNIFIED IDEOGRAPH +0xE9FC 0x9D48 #CJK UNIFIED IDEOGRAPH +0xEA40 0x9D5D #CJK UNIFIED IDEOGRAPH +0xEA41 0x9D5E #CJK UNIFIED IDEOGRAPH +0xEA42 0x9D64 #CJK UNIFIED IDEOGRAPH +0xEA43 0x9D51 #CJK UNIFIED IDEOGRAPH +0xEA44 0x9D50 #CJK UNIFIED IDEOGRAPH +0xEA45 0x9D59 #CJK UNIFIED IDEOGRAPH +0xEA46 0x9D72 #CJK UNIFIED IDEOGRAPH +0xEA47 0x9D89 #CJK UNIFIED IDEOGRAPH +0xEA48 0x9D87 #CJK UNIFIED IDEOGRAPH +0xEA49 0x9DAB #CJK UNIFIED IDEOGRAPH +0xEA4A 0x9D6F #CJK UNIFIED IDEOGRAPH +0xEA4B 0x9D7A #CJK UNIFIED IDEOGRAPH +0xEA4C 0x9D9A #CJK UNIFIED IDEOGRAPH +0xEA4D 0x9DA4 #CJK UNIFIED IDEOGRAPH +0xEA4E 0x9DA9 #CJK UNIFIED IDEOGRAPH +0xEA4F 0x9DB2 #CJK UNIFIED IDEOGRAPH +0xEA50 0x9DC4 #CJK UNIFIED IDEOGRAPH +0xEA51 0x9DC1 #CJK UNIFIED IDEOGRAPH +0xEA52 0x9DBB #CJK UNIFIED IDEOGRAPH +0xEA53 0x9DB8 #CJK UNIFIED IDEOGRAPH +0xEA54 0x9DBA #CJK UNIFIED IDEOGRAPH +0xEA55 0x9DC6 #CJK UNIFIED IDEOGRAPH +0xEA56 0x9DCF #CJK UNIFIED IDEOGRAPH +0xEA57 0x9DC2 #CJK UNIFIED IDEOGRAPH +0xEA58 0x9DD9 #CJK UNIFIED IDEOGRAPH +0xEA59 0x9DD3 #CJK UNIFIED IDEOGRAPH +0xEA5A 0x9DF8 #CJK UNIFIED IDEOGRAPH +0xEA5B 0x9DE6 #CJK UNIFIED IDEOGRAPH +0xEA5C 0x9DED #CJK UNIFIED IDEOGRAPH +0xEA5D 0x9DEF #CJK UNIFIED IDEOGRAPH +0xEA5E 0x9DFD #CJK UNIFIED IDEOGRAPH +0xEA5F 0x9E1A #CJK UNIFIED IDEOGRAPH +0xEA60 0x9E1B #CJK UNIFIED IDEOGRAPH +0xEA61 0x9E1E #CJK UNIFIED IDEOGRAPH +0xEA62 0x9E75 #CJK UNIFIED IDEOGRAPH +0xEA63 0x9E79 #CJK UNIFIED IDEOGRAPH +0xEA64 0x9E7D #CJK UNIFIED IDEOGRAPH +0xEA65 0x9E81 #CJK UNIFIED IDEOGRAPH +0xEA66 0x9E88 #CJK UNIFIED IDEOGRAPH +0xEA67 0x9E8B #CJK UNIFIED IDEOGRAPH +0xEA68 0x9E8C #CJK UNIFIED IDEOGRAPH +0xEA69 0x9E92 #CJK UNIFIED IDEOGRAPH +0xEA6A 0x9E95 #CJK UNIFIED IDEOGRAPH +0xEA6B 0x9E91 #CJK UNIFIED IDEOGRAPH +0xEA6C 0x9E9D #CJK UNIFIED IDEOGRAPH +0xEA6D 0x9EA5 #CJK UNIFIED IDEOGRAPH +0xEA6E 0x9EA9 #CJK UNIFIED IDEOGRAPH +0xEA6F 0x9EB8 #CJK UNIFIED IDEOGRAPH +0xEA70 0x9EAA #CJK UNIFIED IDEOGRAPH +0xEA71 0x9EAD #CJK UNIFIED IDEOGRAPH +0xEA72 0x9761 #CJK UNIFIED IDEOGRAPH +0xEA73 0x9ECC #CJK UNIFIED IDEOGRAPH +0xEA74 0x9ECE #CJK UNIFIED IDEOGRAPH +0xEA75 0x9ECF #CJK UNIFIED IDEOGRAPH +0xEA76 0x9ED0 #CJK UNIFIED IDEOGRAPH +0xEA77 0x9ED4 #CJK UNIFIED IDEOGRAPH +0xEA78 0x9EDC #CJK UNIFIED IDEOGRAPH +0xEA79 0x9EDE #CJK UNIFIED IDEOGRAPH +0xEA7A 0x9EDD #CJK UNIFIED IDEOGRAPH +0xEA7B 0x9EE0 #CJK UNIFIED IDEOGRAPH +0xEA7C 0x9EE5 #CJK UNIFIED IDEOGRAPH +0xEA7D 0x9EE8 #CJK UNIFIED IDEOGRAPH +0xEA7E 0x9EEF #CJK UNIFIED IDEOGRAPH +0xEA80 0x9EF4 #CJK UNIFIED IDEOGRAPH +0xEA81 0x9EF6 #CJK UNIFIED IDEOGRAPH +0xEA82 0x9EF7 #CJK UNIFIED IDEOGRAPH +0xEA83 0x9EF9 #CJK UNIFIED IDEOGRAPH +0xEA84 0x9EFB #CJK UNIFIED IDEOGRAPH +0xEA85 0x9EFC #CJK UNIFIED IDEOGRAPH +0xEA86 0x9EFD #CJK UNIFIED IDEOGRAPH +0xEA87 0x9F07 #CJK UNIFIED IDEOGRAPH +0xEA88 0x9F08 #CJK UNIFIED IDEOGRAPH +0xEA89 0x76B7 #CJK UNIFIED IDEOGRAPH +0xEA8A 0x9F15 #CJK UNIFIED IDEOGRAPH +0xEA8B 0x9F21 #CJK UNIFIED IDEOGRAPH +0xEA8C 0x9F2C #CJK UNIFIED IDEOGRAPH +0xEA8D 0x9F3E #CJK UNIFIED IDEOGRAPH +0xEA8E 0x9F4A #CJK UNIFIED IDEOGRAPH +0xEA8F 0x9F52 #CJK UNIFIED IDEOGRAPH +0xEA90 0x9F54 #CJK UNIFIED IDEOGRAPH +0xEA91 0x9F63 #CJK UNIFIED IDEOGRAPH +0xEA92 0x9F5F #CJK UNIFIED IDEOGRAPH +0xEA93 0x9F60 #CJK UNIFIED IDEOGRAPH +0xEA94 0x9F61 #CJK UNIFIED IDEOGRAPH +0xEA95 0x9F66 #CJK UNIFIED IDEOGRAPH +0xEA96 0x9F67 #CJK UNIFIED IDEOGRAPH +0xEA97 0x9F6C #CJK UNIFIED IDEOGRAPH +0xEA98 0x9F6A #CJK UNIFIED IDEOGRAPH +0xEA99 0x9F77 #CJK UNIFIED IDEOGRAPH +0xEA9A 0x9F72 #CJK UNIFIED IDEOGRAPH +0xEA9B 0x9F76 #CJK UNIFIED IDEOGRAPH +0xEA9C 0x9F95 #CJK UNIFIED IDEOGRAPH +0xEA9D 0x9F9C #CJK UNIFIED IDEOGRAPH +0xEA9E 0x9FA0 #CJK UNIFIED IDEOGRAPH +0xEA9F 0x582F #CJK UNIFIED IDEOGRAPH +0xEAA0 0x69C7 #CJK UNIFIED IDEOGRAPH +0xEAA1 0x9059 #CJK UNIFIED IDEOGRAPH +0xEAA2 0x7464 #CJK UNIFIED IDEOGRAPH +0xEAA3 0x51DC #CJK UNIFIED IDEOGRAPH +0xEAA4 0x7199 #CJK UNIFIED IDEOGRAPH +0xED40 0x7E8A #CJK UNIFIED IDEOGRAPH +0xED41 0x891C #CJK UNIFIED IDEOGRAPH +0xED42 0x9348 #CJK UNIFIED IDEOGRAPH +0xED43 0x9288 #CJK UNIFIED IDEOGRAPH +0xED44 0x84DC #CJK UNIFIED IDEOGRAPH +0xED45 0x4FC9 #CJK UNIFIED IDEOGRAPH +0xED46 0x70BB #CJK UNIFIED IDEOGRAPH +0xED47 0x6631 #CJK UNIFIED IDEOGRAPH +0xED48 0x68C8 #CJK UNIFIED IDEOGRAPH +0xED49 0x92F9 #CJK UNIFIED IDEOGRAPH +0xED4A 0x66FB #CJK UNIFIED IDEOGRAPH +0xED4B 0x5F45 #CJK UNIFIED IDEOGRAPH +0xED4C 0x4E28 #CJK UNIFIED IDEOGRAPH +0xED4D 0x4EE1 #CJK UNIFIED IDEOGRAPH +0xED4E 0x4EFC #CJK UNIFIED IDEOGRAPH +0xED4F 0x4F00 #CJK UNIFIED IDEOGRAPH +0xED50 0x4F03 #CJK UNIFIED IDEOGRAPH +0xED51 0x4F39 #CJK UNIFIED IDEOGRAPH +0xED52 0x4F56 #CJK UNIFIED IDEOGRAPH +0xED53 0x4F92 #CJK UNIFIED IDEOGRAPH +0xED54 0x4F8A #CJK UNIFIED IDEOGRAPH +0xED55 0x4F9A #CJK UNIFIED IDEOGRAPH +0xED56 0x4F94 #CJK UNIFIED IDEOGRAPH +0xED57 0x4FCD #CJK UNIFIED IDEOGRAPH +0xED58 0x5040 #CJK UNIFIED IDEOGRAPH +0xED59 0x5022 #CJK UNIFIED IDEOGRAPH +0xED5A 0x4FFF #CJK UNIFIED IDEOGRAPH +0xED5B 0x501E #CJK UNIFIED IDEOGRAPH +0xED5C 0x5046 #CJK UNIFIED IDEOGRAPH +0xED5D 0x5070 #CJK UNIFIED IDEOGRAPH +0xED5E 0x5042 #CJK UNIFIED IDEOGRAPH +0xED5F 0x5094 #CJK UNIFIED IDEOGRAPH +0xED60 0x50F4 #CJK UNIFIED IDEOGRAPH +0xED61 0x50D8 #CJK UNIFIED IDEOGRAPH +0xED62 0x514A #CJK UNIFIED IDEOGRAPH +0xED63 0x5164 #CJK UNIFIED IDEOGRAPH +0xED64 0x519D #CJK UNIFIED IDEOGRAPH +0xED65 0x51BE #CJK UNIFIED IDEOGRAPH +0xED66 0x51EC #CJK UNIFIED IDEOGRAPH +0xED67 0x5215 #CJK UNIFIED IDEOGRAPH +0xED68 0x529C #CJK UNIFIED IDEOGRAPH +0xED69 0x52A6 #CJK UNIFIED IDEOGRAPH +0xED6A 0x52C0 #CJK UNIFIED IDEOGRAPH +0xED6B 0x52DB #CJK UNIFIED IDEOGRAPH +0xED6C 0x5300 #CJK UNIFIED IDEOGRAPH +0xED6D 0x5307 #CJK UNIFIED IDEOGRAPH +0xED6E 0x5324 #CJK UNIFIED IDEOGRAPH +0xED6F 0x5372 #CJK UNIFIED IDEOGRAPH +0xED70 0x5393 #CJK UNIFIED IDEOGRAPH +0xED71 0x53B2 #CJK UNIFIED IDEOGRAPH +0xED72 0x53DD #CJK UNIFIED IDEOGRAPH +0xED73 0xFA0E #CJK COMPATIBILITY IDEOGRAPH +0xED74 0x549C #CJK UNIFIED IDEOGRAPH +0xED75 0x548A #CJK UNIFIED IDEOGRAPH +0xED76 0x54A9 #CJK UNIFIED IDEOGRAPH +0xED77 0x54FF #CJK UNIFIED IDEOGRAPH +0xED78 0x5586 #CJK UNIFIED IDEOGRAPH +0xED79 0x5759 #CJK UNIFIED IDEOGRAPH +0xED7A 0x5765 #CJK UNIFIED IDEOGRAPH +0xED7B 0x57AC #CJK UNIFIED IDEOGRAPH +0xED7C 0x57C8 #CJK UNIFIED IDEOGRAPH +0xED7D 0x57C7 #CJK UNIFIED IDEOGRAPH +0xED7E 0xFA0F #CJK COMPATIBILITY IDEOGRAPH +0xED80 0xFA10 #CJK COMPATIBILITY IDEOGRAPH +0xED81 0x589E #CJK UNIFIED IDEOGRAPH +0xED82 0x58B2 #CJK UNIFIED IDEOGRAPH +0xED83 0x590B #CJK UNIFIED IDEOGRAPH +0xED84 0x5953 #CJK UNIFIED IDEOGRAPH +0xED85 0x595B #CJK UNIFIED IDEOGRAPH +0xED86 0x595D #CJK UNIFIED IDEOGRAPH +0xED87 0x5963 #CJK UNIFIED IDEOGRAPH +0xED88 0x59A4 #CJK UNIFIED IDEOGRAPH +0xED89 0x59BA #CJK UNIFIED IDEOGRAPH +0xED8A 0x5B56 #CJK UNIFIED IDEOGRAPH +0xED8B 0x5BC0 #CJK UNIFIED IDEOGRAPH +0xED8C 0x752F #CJK UNIFIED IDEOGRAPH +0xED8D 0x5BD8 #CJK UNIFIED IDEOGRAPH +0xED8E 0x5BEC #CJK UNIFIED IDEOGRAPH +0xED8F 0x5C1E #CJK UNIFIED IDEOGRAPH +0xED90 0x5CA6 #CJK UNIFIED IDEOGRAPH +0xED91 0x5CBA #CJK UNIFIED IDEOGRAPH +0xED92 0x5CF5 #CJK UNIFIED IDEOGRAPH +0xED93 0x5D27 #CJK UNIFIED IDEOGRAPH +0xED94 0x5D53 #CJK UNIFIED IDEOGRAPH +0xED95 0xFA11 #CJK COMPATIBILITY IDEOGRAPH +0xED96 0x5D42 #CJK UNIFIED IDEOGRAPH +0xED97 0x5D6D #CJK UNIFIED IDEOGRAPH +0xED98 0x5DB8 #CJK UNIFIED IDEOGRAPH +0xED99 0x5DB9 #CJK UNIFIED IDEOGRAPH +0xED9A 0x5DD0 #CJK UNIFIED IDEOGRAPH +0xED9B 0x5F21 #CJK UNIFIED IDEOGRAPH +0xED9C 0x5F34 #CJK UNIFIED IDEOGRAPH +0xED9D 0x5F67 #CJK UNIFIED IDEOGRAPH +0xED9E 0x5FB7 #CJK UNIFIED IDEOGRAPH +0xED9F 0x5FDE #CJK UNIFIED IDEOGRAPH +0xEDA0 0x605D #CJK UNIFIED IDEOGRAPH +0xEDA1 0x6085 #CJK UNIFIED IDEOGRAPH +0xEDA2 0x608A #CJK UNIFIED IDEOGRAPH +0xEDA3 0x60DE #CJK UNIFIED IDEOGRAPH +0xEDA4 0x60D5 #CJK UNIFIED IDEOGRAPH +0xEDA5 0x6120 #CJK UNIFIED IDEOGRAPH +0xEDA6 0x60F2 #CJK UNIFIED IDEOGRAPH +0xEDA7 0x6111 #CJK UNIFIED IDEOGRAPH +0xEDA8 0x6137 #CJK UNIFIED IDEOGRAPH +0xEDA9 0x6130 #CJK UNIFIED IDEOGRAPH +0xEDAA 0x6198 #CJK UNIFIED IDEOGRAPH +0xEDAB 0x6213 #CJK UNIFIED IDEOGRAPH +0xEDAC 0x62A6 #CJK UNIFIED IDEOGRAPH +0xEDAD 0x63F5 #CJK UNIFIED IDEOGRAPH +0xEDAE 0x6460 #CJK UNIFIED IDEOGRAPH +0xEDAF 0x649D #CJK UNIFIED IDEOGRAPH +0xEDB0 0x64CE #CJK UNIFIED IDEOGRAPH +0xEDB1 0x654E #CJK UNIFIED IDEOGRAPH +0xEDB2 0x6600 #CJK UNIFIED IDEOGRAPH +0xEDB3 0x6615 #CJK UNIFIED IDEOGRAPH +0xEDB4 0x663B #CJK UNIFIED IDEOGRAPH +0xEDB5 0x6609 #CJK UNIFIED IDEOGRAPH +0xEDB6 0x662E #CJK UNIFIED IDEOGRAPH +0xEDB7 0x661E #CJK UNIFIED IDEOGRAPH +0xEDB8 0x6624 #CJK UNIFIED IDEOGRAPH +0xEDB9 0x6665 #CJK UNIFIED IDEOGRAPH +0xEDBA 0x6657 #CJK UNIFIED IDEOGRAPH +0xEDBB 0x6659 #CJK UNIFIED IDEOGRAPH +0xEDBC 0xFA12 #CJK COMPATIBILITY IDEOGRAPH +0xEDBD 0x6673 #CJK UNIFIED IDEOGRAPH +0xEDBE 0x6699 #CJK UNIFIED IDEOGRAPH +0xEDBF 0x66A0 #CJK UNIFIED IDEOGRAPH +0xEDC0 0x66B2 #CJK UNIFIED IDEOGRAPH +0xEDC1 0x66BF #CJK UNIFIED IDEOGRAPH +0xEDC2 0x66FA #CJK UNIFIED IDEOGRAPH +0xEDC3 0x670E #CJK UNIFIED IDEOGRAPH +0xEDC4 0xF929 #CJK COMPATIBILITY IDEOGRAPH +0xEDC5 0x6766 #CJK UNIFIED IDEOGRAPH +0xEDC6 0x67BB #CJK UNIFIED IDEOGRAPH +0xEDC7 0x6852 #CJK UNIFIED IDEOGRAPH +0xEDC8 0x67C0 #CJK UNIFIED IDEOGRAPH +0xEDC9 0x6801 #CJK UNIFIED IDEOGRAPH +0xEDCA 0x6844 #CJK UNIFIED IDEOGRAPH +0xEDCB 0x68CF #CJK UNIFIED IDEOGRAPH +0xEDCC 0xFA13 #CJK COMPATIBILITY IDEOGRAPH +0xEDCD 0x6968 #CJK UNIFIED IDEOGRAPH +0xEDCE 0xFA14 #CJK COMPATIBILITY IDEOGRAPH +0xEDCF 0x6998 #CJK UNIFIED IDEOGRAPH +0xEDD0 0x69E2 #CJK UNIFIED IDEOGRAPH +0xEDD1 0x6A30 #CJK UNIFIED IDEOGRAPH +0xEDD2 0x6A6B #CJK UNIFIED IDEOGRAPH +0xEDD3 0x6A46 #CJK UNIFIED IDEOGRAPH +0xEDD4 0x6A73 #CJK UNIFIED IDEOGRAPH +0xEDD5 0x6A7E #CJK UNIFIED IDEOGRAPH +0xEDD6 0x6AE2 #CJK UNIFIED IDEOGRAPH +0xEDD7 0x6AE4 #CJK UNIFIED IDEOGRAPH +0xEDD8 0x6BD6 #CJK UNIFIED IDEOGRAPH +0xEDD9 0x6C3F #CJK UNIFIED IDEOGRAPH +0xEDDA 0x6C5C #CJK UNIFIED IDEOGRAPH +0xEDDB 0x6C86 #CJK UNIFIED IDEOGRAPH +0xEDDC 0x6C6F #CJK UNIFIED IDEOGRAPH +0xEDDD 0x6CDA #CJK UNIFIED IDEOGRAPH +0xEDDE 0x6D04 #CJK UNIFIED IDEOGRAPH +0xEDDF 0x6D87 #CJK UNIFIED IDEOGRAPH +0xEDE0 0x6D6F #CJK UNIFIED IDEOGRAPH +0xEDE1 0x6D96 #CJK UNIFIED IDEOGRAPH +0xEDE2 0x6DAC #CJK UNIFIED IDEOGRAPH +0xEDE3 0x6DCF #CJK UNIFIED IDEOGRAPH +0xEDE4 0x6DF8 #CJK UNIFIED IDEOGRAPH +0xEDE5 0x6DF2 #CJK UNIFIED IDEOGRAPH +0xEDE6 0x6DFC #CJK UNIFIED IDEOGRAPH +0xEDE7 0x6E39 #CJK UNIFIED IDEOGRAPH +0xEDE8 0x6E5C #CJK UNIFIED IDEOGRAPH +0xEDE9 0x6E27 #CJK UNIFIED IDEOGRAPH +0xEDEA 0x6E3C #CJK UNIFIED IDEOGRAPH +0xEDEB 0x6EBF #CJK UNIFIED IDEOGRAPH +0xEDEC 0x6F88 #CJK UNIFIED IDEOGRAPH +0xEDED 0x6FB5 #CJK UNIFIED IDEOGRAPH +0xEDEE 0x6FF5 #CJK UNIFIED IDEOGRAPH +0xEDEF 0x7005 #CJK UNIFIED IDEOGRAPH +0xEDF0 0x7007 #CJK UNIFIED IDEOGRAPH +0xEDF1 0x7028 #CJK UNIFIED IDEOGRAPH +0xEDF2 0x7085 #CJK UNIFIED IDEOGRAPH +0xEDF3 0x70AB #CJK UNIFIED IDEOGRAPH +0xEDF4 0x710F #CJK UNIFIED IDEOGRAPH +0xEDF5 0x7104 #CJK UNIFIED IDEOGRAPH +0xEDF6 0x715C #CJK UNIFIED IDEOGRAPH +0xEDF7 0x7146 #CJK UNIFIED IDEOGRAPH +0xEDF8 0x7147 #CJK UNIFIED IDEOGRAPH +0xEDF9 0xFA15 #CJK COMPATIBILITY IDEOGRAPH +0xEDFA 0x71C1 #CJK UNIFIED IDEOGRAPH +0xEDFB 0x71FE #CJK UNIFIED IDEOGRAPH +0xEDFC 0x72B1 #CJK UNIFIED IDEOGRAPH +0xEE40 0x72BE #CJK UNIFIED IDEOGRAPH +0xEE41 0x7324 #CJK UNIFIED IDEOGRAPH +0xEE42 0xFA16 #CJK COMPATIBILITY IDEOGRAPH +0xEE43 0x7377 #CJK UNIFIED IDEOGRAPH +0xEE44 0x73BD #CJK UNIFIED IDEOGRAPH +0xEE45 0x73C9 #CJK UNIFIED IDEOGRAPH +0xEE46 0x73D6 #CJK UNIFIED IDEOGRAPH +0xEE47 0x73E3 #CJK UNIFIED IDEOGRAPH +0xEE48 0x73D2 #CJK UNIFIED IDEOGRAPH +0xEE49 0x7407 #CJK UNIFIED IDEOGRAPH +0xEE4A 0x73F5 #CJK UNIFIED IDEOGRAPH +0xEE4B 0x7426 #CJK UNIFIED IDEOGRAPH +0xEE4C 0x742A #CJK UNIFIED IDEOGRAPH +0xEE4D 0x7429 #CJK UNIFIED IDEOGRAPH +0xEE4E 0x742E #CJK UNIFIED IDEOGRAPH +0xEE4F 0x7462 #CJK UNIFIED IDEOGRAPH +0xEE50 0x7489 #CJK UNIFIED IDEOGRAPH +0xEE51 0x749F #CJK UNIFIED IDEOGRAPH +0xEE52 0x7501 #CJK UNIFIED IDEOGRAPH +0xEE53 0x756F #CJK UNIFIED IDEOGRAPH +0xEE54 0x7682 #CJK UNIFIED IDEOGRAPH +0xEE55 0x769C #CJK UNIFIED IDEOGRAPH +0xEE56 0x769E #CJK UNIFIED IDEOGRAPH +0xEE57 0x769B #CJK UNIFIED IDEOGRAPH +0xEE58 0x76A6 #CJK UNIFIED IDEOGRAPH +0xEE59 0xFA17 #CJK COMPATIBILITY IDEOGRAPH +0xEE5A 0x7746 #CJK UNIFIED IDEOGRAPH +0xEE5B 0x52AF #CJK UNIFIED IDEOGRAPH +0xEE5C 0x7821 #CJK UNIFIED IDEOGRAPH +0xEE5D 0x784E #CJK UNIFIED IDEOGRAPH +0xEE5E 0x7864 #CJK UNIFIED IDEOGRAPH +0xEE5F 0x787A #CJK UNIFIED IDEOGRAPH +0xEE60 0x7930 #CJK UNIFIED IDEOGRAPH +0xEE61 0xFA18 #CJK COMPATIBILITY IDEOGRAPH +0xEE62 0xFA19 #CJK COMPATIBILITY IDEOGRAPH +0xEE63 0xFA1A #CJK COMPATIBILITY IDEOGRAPH +0xEE64 0x7994 #CJK UNIFIED IDEOGRAPH +0xEE65 0xFA1B #CJK COMPATIBILITY IDEOGRAPH +0xEE66 0x799B #CJK UNIFIED IDEOGRAPH +0xEE67 0x7AD1 #CJK UNIFIED IDEOGRAPH +0xEE68 0x7AE7 #CJK UNIFIED IDEOGRAPH +0xEE69 0xFA1C #CJK COMPATIBILITY IDEOGRAPH +0xEE6A 0x7AEB #CJK UNIFIED IDEOGRAPH +0xEE6B 0x7B9E #CJK UNIFIED IDEOGRAPH +0xEE6C 0xFA1D #CJK COMPATIBILITY IDEOGRAPH +0xEE6D 0x7D48 #CJK UNIFIED IDEOGRAPH +0xEE6E 0x7D5C #CJK UNIFIED IDEOGRAPH +0xEE6F 0x7DB7 #CJK UNIFIED IDEOGRAPH +0xEE70 0x7DA0 #CJK UNIFIED IDEOGRAPH +0xEE71 0x7DD6 #CJK UNIFIED IDEOGRAPH +0xEE72 0x7E52 #CJK UNIFIED IDEOGRAPH +0xEE73 0x7F47 #CJK UNIFIED IDEOGRAPH +0xEE74 0x7FA1 #CJK UNIFIED IDEOGRAPH +0xEE75 0xFA1E #CJK COMPATIBILITY IDEOGRAPH +0xEE76 0x8301 #CJK UNIFIED IDEOGRAPH +0xEE77 0x8362 #CJK UNIFIED IDEOGRAPH +0xEE78 0x837F #CJK UNIFIED IDEOGRAPH +0xEE79 0x83C7 #CJK UNIFIED IDEOGRAPH +0xEE7A 0x83F6 #CJK UNIFIED IDEOGRAPH +0xEE7B 0x8448 #CJK UNIFIED IDEOGRAPH +0xEE7C 0x84B4 #CJK UNIFIED IDEOGRAPH +0xEE7D 0x8553 #CJK UNIFIED IDEOGRAPH +0xEE7E 0x8559 #CJK UNIFIED IDEOGRAPH +0xEE80 0x856B #CJK UNIFIED IDEOGRAPH +0xEE81 0xFA1F #CJK COMPATIBILITY IDEOGRAPH +0xEE82 0x85B0 #CJK UNIFIED IDEOGRAPH +0xEE83 0xFA20 #CJK COMPATIBILITY IDEOGRAPH +0xEE84 0xFA21 #CJK COMPATIBILITY IDEOGRAPH +0xEE85 0x8807 #CJK UNIFIED IDEOGRAPH +0xEE86 0x88F5 #CJK UNIFIED IDEOGRAPH +0xEE87 0x8A12 #CJK UNIFIED IDEOGRAPH +0xEE88 0x8A37 #CJK UNIFIED IDEOGRAPH +0xEE89 0x8A79 #CJK UNIFIED IDEOGRAPH +0xEE8A 0x8AA7 #CJK UNIFIED IDEOGRAPH +0xEE8B 0x8ABE #CJK UNIFIED IDEOGRAPH +0xEE8C 0x8ADF #CJK UNIFIED IDEOGRAPH +0xEE8D 0xFA22 #CJK COMPATIBILITY IDEOGRAPH +0xEE8E 0x8AF6 #CJK UNIFIED IDEOGRAPH +0xEE8F 0x8B53 #CJK UNIFIED IDEOGRAPH +0xEE90 0x8B7F #CJK UNIFIED IDEOGRAPH +0xEE91 0x8CF0 #CJK UNIFIED IDEOGRAPH +0xEE92 0x8CF4 #CJK UNIFIED IDEOGRAPH +0xEE93 0x8D12 #CJK UNIFIED IDEOGRAPH +0xEE94 0x8D76 #CJK UNIFIED IDEOGRAPH +0xEE95 0xFA23 #CJK COMPATIBILITY IDEOGRAPH +0xEE96 0x8ECF #CJK UNIFIED IDEOGRAPH +0xEE97 0xFA24 #CJK COMPATIBILITY IDEOGRAPH +0xEE98 0xFA25 #CJK COMPATIBILITY IDEOGRAPH +0xEE99 0x9067 #CJK UNIFIED IDEOGRAPH +0xEE9A 0x90DE #CJK UNIFIED IDEOGRAPH +0xEE9B 0xFA26 #CJK COMPATIBILITY IDEOGRAPH +0xEE9C 0x9115 #CJK UNIFIED IDEOGRAPH +0xEE9D 0x9127 #CJK UNIFIED IDEOGRAPH +0xEE9E 0x91DA #CJK UNIFIED IDEOGRAPH +0xEE9F 0x91D7 #CJK UNIFIED IDEOGRAPH +0xEEA0 0x91DE #CJK UNIFIED IDEOGRAPH +0xEEA1 0x91ED #CJK UNIFIED IDEOGRAPH +0xEEA2 0x91EE #CJK UNIFIED IDEOGRAPH +0xEEA3 0x91E4 #CJK UNIFIED IDEOGRAPH +0xEEA4 0x91E5 #CJK UNIFIED IDEOGRAPH +0xEEA5 0x9206 #CJK UNIFIED IDEOGRAPH +0xEEA6 0x9210 #CJK UNIFIED IDEOGRAPH +0xEEA7 0x920A #CJK UNIFIED IDEOGRAPH +0xEEA8 0x923A #CJK UNIFIED IDEOGRAPH +0xEEA9 0x9240 #CJK UNIFIED IDEOGRAPH +0xEEAA 0x923C #CJK UNIFIED IDEOGRAPH +0xEEAB 0x924E #CJK UNIFIED IDEOGRAPH +0xEEAC 0x9259 #CJK UNIFIED IDEOGRAPH +0xEEAD 0x9251 #CJK UNIFIED IDEOGRAPH +0xEEAE 0x9239 #CJK UNIFIED IDEOGRAPH +0xEEAF 0x9267 #CJK UNIFIED IDEOGRAPH +0xEEB0 0x92A7 #CJK UNIFIED IDEOGRAPH +0xEEB1 0x9277 #CJK UNIFIED IDEOGRAPH +0xEEB2 0x9278 #CJK UNIFIED IDEOGRAPH +0xEEB3 0x92E7 #CJK UNIFIED IDEOGRAPH +0xEEB4 0x92D7 #CJK UNIFIED IDEOGRAPH +0xEEB5 0x92D9 #CJK UNIFIED IDEOGRAPH +0xEEB6 0x92D0 #CJK UNIFIED IDEOGRAPH +0xEEB7 0xFA27 #CJK COMPATIBILITY IDEOGRAPH +0xEEB8 0x92D5 #CJK UNIFIED IDEOGRAPH +0xEEB9 0x92E0 #CJK UNIFIED IDEOGRAPH +0xEEBA 0x92D3 #CJK UNIFIED IDEOGRAPH +0xEEBB 0x9325 #CJK UNIFIED IDEOGRAPH +0xEEBC 0x9321 #CJK UNIFIED IDEOGRAPH +0xEEBD 0x92FB #CJK UNIFIED IDEOGRAPH +0xEEBE 0xFA28 #CJK COMPATIBILITY IDEOGRAPH +0xEEBF 0x931E #CJK UNIFIED IDEOGRAPH +0xEEC0 0x92FF #CJK UNIFIED IDEOGRAPH +0xEEC1 0x931D #CJK UNIFIED IDEOGRAPH +0xEEC2 0x9302 #CJK UNIFIED IDEOGRAPH +0xEEC3 0x9370 #CJK UNIFIED IDEOGRAPH +0xEEC4 0x9357 #CJK UNIFIED IDEOGRAPH +0xEEC5 0x93A4 #CJK UNIFIED IDEOGRAPH +0xEEC6 0x93C6 #CJK UNIFIED IDEOGRAPH +0xEEC7 0x93DE #CJK UNIFIED IDEOGRAPH +0xEEC8 0x93F8 #CJK UNIFIED IDEOGRAPH +0xEEC9 0x9431 #CJK UNIFIED IDEOGRAPH +0xEECA 0x9445 #CJK UNIFIED IDEOGRAPH +0xEECB 0x9448 #CJK UNIFIED IDEOGRAPH +0xEECC 0x9592 #CJK UNIFIED IDEOGRAPH +0xEECD 0xF9DC #CJK COMPATIBILITY IDEOGRAPH +0xEECE 0xFA29 #CJK COMPATIBILITY IDEOGRAPH +0xEECF 0x969D #CJK UNIFIED IDEOGRAPH +0xEED0 0x96AF #CJK UNIFIED IDEOGRAPH +0xEED1 0x9733 #CJK UNIFIED IDEOGRAPH +0xEED2 0x973B #CJK UNIFIED IDEOGRAPH +0xEED3 0x9743 #CJK UNIFIED IDEOGRAPH +0xEED4 0x974D #CJK UNIFIED IDEOGRAPH +0xEED5 0x974F #CJK UNIFIED IDEOGRAPH +0xEED6 0x9751 #CJK UNIFIED IDEOGRAPH +0xEED7 0x9755 #CJK UNIFIED IDEOGRAPH +0xEED8 0x9857 #CJK UNIFIED IDEOGRAPH +0xEED9 0x9865 #CJK UNIFIED IDEOGRAPH +0xEEDA 0xFA2A #CJK COMPATIBILITY IDEOGRAPH +0xEEDB 0xFA2B #CJK COMPATIBILITY IDEOGRAPH +0xEEDC 0x9927 #CJK UNIFIED IDEOGRAPH +0xEEDD 0xFA2C #CJK COMPATIBILITY IDEOGRAPH +0xEEDE 0x999E #CJK UNIFIED IDEOGRAPH +0xEEDF 0x9A4E #CJK UNIFIED IDEOGRAPH +0xEEE0 0x9AD9 #CJK UNIFIED IDEOGRAPH +0xEEE1 0x9ADC #CJK UNIFIED IDEOGRAPH +0xEEE2 0x9B75 #CJK UNIFIED IDEOGRAPH +0xEEE3 0x9B72 #CJK UNIFIED IDEOGRAPH +0xEEE4 0x9B8F #CJK UNIFIED IDEOGRAPH +0xEEE5 0x9BB1 #CJK UNIFIED IDEOGRAPH +0xEEE6 0x9BBB #CJK UNIFIED IDEOGRAPH +0xEEE7 0x9C00 #CJK UNIFIED IDEOGRAPH +0xEEE8 0x9D70 #CJK UNIFIED IDEOGRAPH +0xEEE9 0x9D6B #CJK UNIFIED IDEOGRAPH +0xEEEA 0xFA2D #CJK COMPATIBILITY IDEOGRAPH +0xEEEB 0x9E19 #CJK UNIFIED IDEOGRAPH +0xEEEC 0x9ED1 #CJK UNIFIED IDEOGRAPH +0xEEEF 0x2170 #SMALL ROMAN NUMERAL ONE +0xEEF0 0x2171 #SMALL ROMAN NUMERAL TWO +0xEEF1 0x2172 #SMALL ROMAN NUMERAL THREE +0xEEF2 0x2173 #SMALL ROMAN NUMERAL FOUR +0xEEF3 0x2174 #SMALL ROMAN NUMERAL FIVE +0xEEF4 0x2175 #SMALL ROMAN NUMERAL SIX +0xEEF5 0x2176 #SMALL ROMAN NUMERAL SEVEN +0xEEF6 0x2177 #SMALL ROMAN NUMERAL EIGHT +0xEEF7 0x2178 #SMALL ROMAN NUMERAL NINE +0xEEF8 0x2179 #SMALL ROMAN NUMERAL TEN +0xEEF9 0xFFE2 #FULLWIDTH NOT SIGN +0xEEFA 0xFFE4 #FULLWIDTH BROKEN BAR +0xEEFB 0xFF07 #FULLWIDTH APOSTROPHE +0xEEFC 0xFF02 #FULLWIDTH QUOTATION MARK +0xFA40 0x2170 #SMALL ROMAN NUMERAL ONE +0xFA41 0x2171 #SMALL ROMAN NUMERAL TWO +0xFA42 0x2172 #SMALL ROMAN NUMERAL THREE +0xFA43 0x2173 #SMALL ROMAN NUMERAL FOUR +0xFA44 0x2174 #SMALL ROMAN NUMERAL FIVE +0xFA45 0x2175 #SMALL ROMAN NUMERAL SIX +0xFA46 0x2176 #SMALL ROMAN NUMERAL SEVEN +0xFA47 0x2177 #SMALL ROMAN NUMERAL EIGHT +0xFA48 0x2178 #SMALL ROMAN NUMERAL NINE +0xFA49 0x2179 #SMALL ROMAN NUMERAL TEN +0xFA4A 0x2160 #ROMAN NUMERAL ONE +0xFA4B 0x2161 #ROMAN NUMERAL TWO +0xFA4C 0x2162 #ROMAN NUMERAL THREE +0xFA4D 0x2163 #ROMAN NUMERAL FOUR +0xFA4E 0x2164 #ROMAN NUMERAL FIVE +0xFA4F 0x2165 #ROMAN NUMERAL SIX +0xFA50 0x2166 #ROMAN NUMERAL SEVEN +0xFA51 0x2167 #ROMAN NUMERAL EIGHT +0xFA52 0x2168 #ROMAN NUMERAL NINE +0xFA53 0x2169 #ROMAN NUMERAL TEN +0xFA54 0xFFE2 #FULLWIDTH NOT SIGN +0xFA55 0xFFE4 #FULLWIDTH BROKEN BAR +0xFA56 0xFF07 #FULLWIDTH APOSTROPHE +0xFA57 0xFF02 #FULLWIDTH QUOTATION MARK +0xFA58 0x3231 #PARENTHESIZED IDEOGRAPH STOCK +0xFA59 0x2116 #NUMERO SIGN +0xFA5A 0x2121 #TELEPHONE SIGN +0xFA5B 0x2235 #BECAUSE +0xFA5C 0x7E8A #CJK UNIFIED IDEOGRAPH +0xFA5D 0x891C #CJK UNIFIED IDEOGRAPH +0xFA5E 0x9348 #CJK UNIFIED IDEOGRAPH +0xFA5F 0x9288 #CJK UNIFIED IDEOGRAPH +0xFA60 0x84DC #CJK UNIFIED IDEOGRAPH +0xFA61 0x4FC9 #CJK UNIFIED IDEOGRAPH +0xFA62 0x70BB #CJK UNIFIED IDEOGRAPH +0xFA63 0x6631 #CJK UNIFIED IDEOGRAPH +0xFA64 0x68C8 #CJK UNIFIED IDEOGRAPH +0xFA65 0x92F9 #CJK UNIFIED IDEOGRAPH +0xFA66 0x66FB #CJK UNIFIED IDEOGRAPH +0xFA67 0x5F45 #CJK UNIFIED IDEOGRAPH +0xFA68 0x4E28 #CJK UNIFIED IDEOGRAPH +0xFA69 0x4EE1 #CJK UNIFIED IDEOGRAPH +0xFA6A 0x4EFC #CJK UNIFIED IDEOGRAPH +0xFA6B 0x4F00 #CJK UNIFIED IDEOGRAPH +0xFA6C 0x4F03 #CJK UNIFIED IDEOGRAPH +0xFA6D 0x4F39 #CJK UNIFIED IDEOGRAPH +0xFA6E 0x4F56 #CJK UNIFIED IDEOGRAPH +0xFA6F 0x4F92 #CJK UNIFIED IDEOGRAPH +0xFA70 0x4F8A #CJK UNIFIED IDEOGRAPH +0xFA71 0x4F9A #CJK UNIFIED IDEOGRAPH +0xFA72 0x4F94 #CJK UNIFIED IDEOGRAPH +0xFA73 0x4FCD #CJK UNIFIED IDEOGRAPH +0xFA74 0x5040 #CJK UNIFIED IDEOGRAPH +0xFA75 0x5022 #CJK UNIFIED IDEOGRAPH +0xFA76 0x4FFF #CJK UNIFIED IDEOGRAPH +0xFA77 0x501E #CJK UNIFIED IDEOGRAPH +0xFA78 0x5046 #CJK UNIFIED IDEOGRAPH +0xFA79 0x5070 #CJK UNIFIED IDEOGRAPH +0xFA7A 0x5042 #CJK UNIFIED IDEOGRAPH +0xFA7B 0x5094 #CJK UNIFIED IDEOGRAPH +0xFA7C 0x50F4 #CJK UNIFIED IDEOGRAPH +0xFA7D 0x50D8 #CJK UNIFIED IDEOGRAPH +0xFA7E 0x514A #CJK UNIFIED IDEOGRAPH +0xFA80 0x5164 #CJK UNIFIED IDEOGRAPH +0xFA81 0x519D #CJK UNIFIED IDEOGRAPH +0xFA82 0x51BE #CJK UNIFIED IDEOGRAPH +0xFA83 0x51EC #CJK UNIFIED IDEOGRAPH +0xFA84 0x5215 #CJK UNIFIED IDEOGRAPH +0xFA85 0x529C #CJK UNIFIED IDEOGRAPH +0xFA86 0x52A6 #CJK UNIFIED IDEOGRAPH +0xFA87 0x52C0 #CJK UNIFIED IDEOGRAPH +0xFA88 0x52DB #CJK UNIFIED IDEOGRAPH +0xFA89 0x5300 #CJK UNIFIED IDEOGRAPH +0xFA8A 0x5307 #CJK UNIFIED IDEOGRAPH +0xFA8B 0x5324 #CJK UNIFIED IDEOGRAPH +0xFA8C 0x5372 #CJK UNIFIED IDEOGRAPH +0xFA8D 0x5393 #CJK UNIFIED IDEOGRAPH +0xFA8E 0x53B2 #CJK UNIFIED IDEOGRAPH +0xFA8F 0x53DD #CJK UNIFIED IDEOGRAPH +0xFA90 0xFA0E #CJK COMPATIBILITY IDEOGRAPH +0xFA91 0x549C #CJK UNIFIED IDEOGRAPH +0xFA92 0x548A #CJK UNIFIED IDEOGRAPH +0xFA93 0x54A9 #CJK UNIFIED IDEOGRAPH +0xFA94 0x54FF #CJK UNIFIED IDEOGRAPH +0xFA95 0x5586 #CJK UNIFIED IDEOGRAPH +0xFA96 0x5759 #CJK UNIFIED IDEOGRAPH +0xFA97 0x5765 #CJK UNIFIED IDEOGRAPH +0xFA98 0x57AC #CJK UNIFIED IDEOGRAPH +0xFA99 0x57C8 #CJK UNIFIED IDEOGRAPH +0xFA9A 0x57C7 #CJK UNIFIED IDEOGRAPH +0xFA9B 0xFA0F #CJK COMPATIBILITY IDEOGRAPH +0xFA9C 0xFA10 #CJK COMPATIBILITY IDEOGRAPH +0xFA9D 0x589E #CJK UNIFIED IDEOGRAPH +0xFA9E 0x58B2 #CJK UNIFIED IDEOGRAPH +0xFA9F 0x590B #CJK UNIFIED IDEOGRAPH +0xFAA0 0x5953 #CJK UNIFIED IDEOGRAPH +0xFAA1 0x595B #CJK UNIFIED IDEOGRAPH +0xFAA2 0x595D #CJK UNIFIED IDEOGRAPH +0xFAA3 0x5963 #CJK UNIFIED IDEOGRAPH +0xFAA4 0x59A4 #CJK UNIFIED IDEOGRAPH +0xFAA5 0x59BA #CJK UNIFIED IDEOGRAPH +0xFAA6 0x5B56 #CJK UNIFIED IDEOGRAPH +0xFAA7 0x5BC0 #CJK UNIFIED IDEOGRAPH +0xFAA8 0x752F #CJK UNIFIED IDEOGRAPH +0xFAA9 0x5BD8 #CJK UNIFIED IDEOGRAPH +0xFAAA 0x5BEC #CJK UNIFIED IDEOGRAPH +0xFAAB 0x5C1E #CJK UNIFIED IDEOGRAPH +0xFAAC 0x5CA6 #CJK UNIFIED IDEOGRAPH +0xFAAD 0x5CBA #CJK UNIFIED IDEOGRAPH +0xFAAE 0x5CF5 #CJK UNIFIED IDEOGRAPH +0xFAAF 0x5D27 #CJK UNIFIED IDEOGRAPH +0xFAB0 0x5D53 #CJK UNIFIED IDEOGRAPH +0xFAB1 0xFA11 #CJK COMPATIBILITY IDEOGRAPH +0xFAB2 0x5D42 #CJK UNIFIED IDEOGRAPH +0xFAB3 0x5D6D #CJK UNIFIED IDEOGRAPH +0xFAB4 0x5DB8 #CJK UNIFIED IDEOGRAPH +0xFAB5 0x5DB9 #CJK UNIFIED IDEOGRAPH +0xFAB6 0x5DD0 #CJK UNIFIED IDEOGRAPH +0xFAB7 0x5F21 #CJK UNIFIED IDEOGRAPH +0xFAB8 0x5F34 #CJK UNIFIED IDEOGRAPH +0xFAB9 0x5F67 #CJK UNIFIED IDEOGRAPH +0xFABA 0x5FB7 #CJK UNIFIED IDEOGRAPH +0xFABB 0x5FDE #CJK UNIFIED IDEOGRAPH +0xFABC 0x605D #CJK UNIFIED IDEOGRAPH +0xFABD 0x6085 #CJK UNIFIED IDEOGRAPH +0xFABE 0x608A #CJK UNIFIED IDEOGRAPH +0xFABF 0x60DE #CJK UNIFIED IDEOGRAPH +0xFAC0 0x60D5 #CJK UNIFIED IDEOGRAPH +0xFAC1 0x6120 #CJK UNIFIED IDEOGRAPH +0xFAC2 0x60F2 #CJK UNIFIED IDEOGRAPH +0xFAC3 0x6111 #CJK UNIFIED IDEOGRAPH +0xFAC4 0x6137 #CJK UNIFIED IDEOGRAPH +0xFAC5 0x6130 #CJK UNIFIED IDEOGRAPH +0xFAC6 0x6198 #CJK UNIFIED IDEOGRAPH +0xFAC7 0x6213 #CJK UNIFIED IDEOGRAPH +0xFAC8 0x62A6 #CJK UNIFIED IDEOGRAPH +0xFAC9 0x63F5 #CJK UNIFIED IDEOGRAPH +0xFACA 0x6460 #CJK UNIFIED IDEOGRAPH +0xFACB 0x649D #CJK UNIFIED IDEOGRAPH +0xFACC 0x64CE #CJK UNIFIED IDEOGRAPH +0xFACD 0x654E #CJK UNIFIED IDEOGRAPH +0xFACE 0x6600 #CJK UNIFIED IDEOGRAPH +0xFACF 0x6615 #CJK UNIFIED IDEOGRAPH +0xFAD0 0x663B #CJK UNIFIED IDEOGRAPH +0xFAD1 0x6609 #CJK UNIFIED IDEOGRAPH +0xFAD2 0x662E #CJK UNIFIED IDEOGRAPH +0xFAD3 0x661E #CJK UNIFIED IDEOGRAPH +0xFAD4 0x6624 #CJK UNIFIED IDEOGRAPH +0xFAD5 0x6665 #CJK UNIFIED IDEOGRAPH +0xFAD6 0x6657 #CJK UNIFIED IDEOGRAPH +0xFAD7 0x6659 #CJK UNIFIED IDEOGRAPH +0xFAD8 0xFA12 #CJK COMPATIBILITY IDEOGRAPH +0xFAD9 0x6673 #CJK UNIFIED IDEOGRAPH +0xFADA 0x6699 #CJK UNIFIED IDEOGRAPH +0xFADB 0x66A0 #CJK UNIFIED IDEOGRAPH +0xFADC 0x66B2 #CJK UNIFIED IDEOGRAPH +0xFADD 0x66BF #CJK UNIFIED IDEOGRAPH +0xFADE 0x66FA #CJK UNIFIED IDEOGRAPH +0xFADF 0x670E #CJK UNIFIED IDEOGRAPH +0xFAE0 0xF929 #CJK COMPATIBILITY IDEOGRAPH +0xFAE1 0x6766 #CJK UNIFIED IDEOGRAPH +0xFAE2 0x67BB #CJK UNIFIED IDEOGRAPH +0xFAE3 0x6852 #CJK UNIFIED IDEOGRAPH +0xFAE4 0x67C0 #CJK UNIFIED IDEOGRAPH +0xFAE5 0x6801 #CJK UNIFIED IDEOGRAPH +0xFAE6 0x6844 #CJK UNIFIED IDEOGRAPH +0xFAE7 0x68CF #CJK UNIFIED IDEOGRAPH +0xFAE8 0xFA13 #CJK COMPATIBILITY IDEOGRAPH +0xFAE9 0x6968 #CJK UNIFIED IDEOGRAPH +0xFAEA 0xFA14 #CJK COMPATIBILITY IDEOGRAPH +0xFAEB 0x6998 #CJK UNIFIED IDEOGRAPH +0xFAEC 0x69E2 #CJK UNIFIED IDEOGRAPH +0xFAED 0x6A30 #CJK UNIFIED IDEOGRAPH +0xFAEE 0x6A6B #CJK UNIFIED IDEOGRAPH +0xFAEF 0x6A46 #CJK UNIFIED IDEOGRAPH +0xFAF0 0x6A73 #CJK UNIFIED IDEOGRAPH +0xFAF1 0x6A7E #CJK UNIFIED IDEOGRAPH +0xFAF2 0x6AE2 #CJK UNIFIED IDEOGRAPH +0xFAF3 0x6AE4 #CJK UNIFIED IDEOGRAPH +0xFAF4 0x6BD6 #CJK UNIFIED IDEOGRAPH +0xFAF5 0x6C3F #CJK UNIFIED IDEOGRAPH +0xFAF6 0x6C5C #CJK UNIFIED IDEOGRAPH +0xFAF7 0x6C86 #CJK UNIFIED IDEOGRAPH +0xFAF8 0x6C6F #CJK UNIFIED IDEOGRAPH +0xFAF9 0x6CDA #CJK UNIFIED IDEOGRAPH +0xFAFA 0x6D04 #CJK UNIFIED IDEOGRAPH +0xFAFB 0x6D87 #CJK UNIFIED IDEOGRAPH +0xFAFC 0x6D6F #CJK UNIFIED IDEOGRAPH +0xFB40 0x6D96 #CJK UNIFIED IDEOGRAPH +0xFB41 0x6DAC #CJK UNIFIED IDEOGRAPH +0xFB42 0x6DCF #CJK UNIFIED IDEOGRAPH +0xFB43 0x6DF8 #CJK UNIFIED IDEOGRAPH +0xFB44 0x6DF2 #CJK UNIFIED IDEOGRAPH +0xFB45 0x6DFC #CJK UNIFIED IDEOGRAPH +0xFB46 0x6E39 #CJK UNIFIED IDEOGRAPH +0xFB47 0x6E5C #CJK UNIFIED IDEOGRAPH +0xFB48 0x6E27 #CJK UNIFIED IDEOGRAPH +0xFB49 0x6E3C #CJK UNIFIED IDEOGRAPH +0xFB4A 0x6EBF #CJK UNIFIED IDEOGRAPH +0xFB4B 0x6F88 #CJK UNIFIED IDEOGRAPH +0xFB4C 0x6FB5 #CJK UNIFIED IDEOGRAPH +0xFB4D 0x6FF5 #CJK UNIFIED IDEOGRAPH +0xFB4E 0x7005 #CJK UNIFIED IDEOGRAPH +0xFB4F 0x7007 #CJK UNIFIED IDEOGRAPH +0xFB50 0x7028 #CJK UNIFIED IDEOGRAPH +0xFB51 0x7085 #CJK UNIFIED IDEOGRAPH +0xFB52 0x70AB #CJK UNIFIED IDEOGRAPH +0xFB53 0x710F #CJK UNIFIED IDEOGRAPH +0xFB54 0x7104 #CJK UNIFIED IDEOGRAPH +0xFB55 0x715C #CJK UNIFIED IDEOGRAPH +0xFB56 0x7146 #CJK UNIFIED IDEOGRAPH +0xFB57 0x7147 #CJK UNIFIED IDEOGRAPH +0xFB58 0xFA15 #CJK COMPATIBILITY IDEOGRAPH +0xFB59 0x71C1 #CJK UNIFIED IDEOGRAPH +0xFB5A 0x71FE #CJK UNIFIED IDEOGRAPH +0xFB5B 0x72B1 #CJK UNIFIED IDEOGRAPH +0xFB5C 0x72BE #CJK UNIFIED IDEOGRAPH +0xFB5D 0x7324 #CJK UNIFIED IDEOGRAPH +0xFB5E 0xFA16 #CJK COMPATIBILITY IDEOGRAPH +0xFB5F 0x7377 #CJK UNIFIED IDEOGRAPH +0xFB60 0x73BD #CJK UNIFIED IDEOGRAPH +0xFB61 0x73C9 #CJK UNIFIED IDEOGRAPH +0xFB62 0x73D6 #CJK UNIFIED IDEOGRAPH +0xFB63 0x73E3 #CJK UNIFIED IDEOGRAPH +0xFB64 0x73D2 #CJK UNIFIED IDEOGRAPH +0xFB65 0x7407 #CJK UNIFIED IDEOGRAPH +0xFB66 0x73F5 #CJK UNIFIED IDEOGRAPH +0xFB67 0x7426 #CJK UNIFIED IDEOGRAPH +0xFB68 0x742A #CJK UNIFIED IDEOGRAPH +0xFB69 0x7429 #CJK UNIFIED IDEOGRAPH +0xFB6A 0x742E #CJK UNIFIED IDEOGRAPH +0xFB6B 0x7462 #CJK UNIFIED IDEOGRAPH +0xFB6C 0x7489 #CJK UNIFIED IDEOGRAPH +0xFB6D 0x749F #CJK UNIFIED IDEOGRAPH +0xFB6E 0x7501 #CJK UNIFIED IDEOGRAPH +0xFB6F 0x756F #CJK UNIFIED IDEOGRAPH +0xFB70 0x7682 #CJK UNIFIED IDEOGRAPH +0xFB71 0x769C #CJK UNIFIED IDEOGRAPH +0xFB72 0x769E #CJK UNIFIED IDEOGRAPH +0xFB73 0x769B #CJK UNIFIED IDEOGRAPH +0xFB74 0x76A6 #CJK UNIFIED IDEOGRAPH +0xFB75 0xFA17 #CJK COMPATIBILITY IDEOGRAPH +0xFB76 0x7746 #CJK UNIFIED IDEOGRAPH +0xFB77 0x52AF #CJK UNIFIED IDEOGRAPH +0xFB78 0x7821 #CJK UNIFIED IDEOGRAPH +0xFB79 0x784E #CJK UNIFIED IDEOGRAPH +0xFB7A 0x7864 #CJK UNIFIED IDEOGRAPH +0xFB7B 0x787A #CJK UNIFIED IDEOGRAPH +0xFB7C 0x7930 #CJK UNIFIED IDEOGRAPH +0xFB7D 0xFA18 #CJK COMPATIBILITY IDEOGRAPH +0xFB7E 0xFA19 #CJK COMPATIBILITY IDEOGRAPH +0xFB80 0xFA1A #CJK COMPATIBILITY IDEOGRAPH +0xFB81 0x7994 #CJK UNIFIED IDEOGRAPH +0xFB82 0xFA1B #CJK COMPATIBILITY IDEOGRAPH +0xFB83 0x799B #CJK UNIFIED IDEOGRAPH +0xFB84 0x7AD1 #CJK UNIFIED IDEOGRAPH +0xFB85 0x7AE7 #CJK UNIFIED IDEOGRAPH +0xFB86 0xFA1C #CJK COMPATIBILITY IDEOGRAPH +0xFB87 0x7AEB #CJK UNIFIED IDEOGRAPH +0xFB88 0x7B9E #CJK UNIFIED IDEOGRAPH +0xFB89 0xFA1D #CJK COMPATIBILITY IDEOGRAPH +0xFB8A 0x7D48 #CJK UNIFIED IDEOGRAPH +0xFB8B 0x7D5C #CJK UNIFIED IDEOGRAPH +0xFB8C 0x7DB7 #CJK UNIFIED IDEOGRAPH +0xFB8D 0x7DA0 #CJK UNIFIED IDEOGRAPH +0xFB8E 0x7DD6 #CJK UNIFIED IDEOGRAPH +0xFB8F 0x7E52 #CJK UNIFIED IDEOGRAPH +0xFB90 0x7F47 #CJK UNIFIED IDEOGRAPH +0xFB91 0x7FA1 #CJK UNIFIED IDEOGRAPH +0xFB92 0xFA1E #CJK COMPATIBILITY IDEOGRAPH +0xFB93 0x8301 #CJK UNIFIED IDEOGRAPH +0xFB94 0x8362 #CJK UNIFIED IDEOGRAPH +0xFB95 0x837F #CJK UNIFIED IDEOGRAPH +0xFB96 0x83C7 #CJK UNIFIED IDEOGRAPH +0xFB97 0x83F6 #CJK UNIFIED IDEOGRAPH +0xFB98 0x8448 #CJK UNIFIED IDEOGRAPH +0xFB99 0x84B4 #CJK UNIFIED IDEOGRAPH +0xFB9A 0x8553 #CJK UNIFIED IDEOGRAPH +0xFB9B 0x8559 #CJK UNIFIED IDEOGRAPH +0xFB9C 0x856B #CJK UNIFIED IDEOGRAPH +0xFB9D 0xFA1F #CJK COMPATIBILITY IDEOGRAPH +0xFB9E 0x85B0 #CJK UNIFIED IDEOGRAPH +0xFB9F 0xFA20 #CJK COMPATIBILITY IDEOGRAPH +0xFBA0 0xFA21 #CJK COMPATIBILITY IDEOGRAPH +0xFBA1 0x8807 #CJK UNIFIED IDEOGRAPH +0xFBA2 0x88F5 #CJK UNIFIED IDEOGRAPH +0xFBA3 0x8A12 #CJK UNIFIED IDEOGRAPH +0xFBA4 0x8A37 #CJK UNIFIED IDEOGRAPH +0xFBA5 0x8A79 #CJK UNIFIED IDEOGRAPH +0xFBA6 0x8AA7 #CJK UNIFIED IDEOGRAPH +0xFBA7 0x8ABE #CJK UNIFIED IDEOGRAPH +0xFBA8 0x8ADF #CJK UNIFIED IDEOGRAPH +0xFBA9 0xFA22 #CJK COMPATIBILITY IDEOGRAPH +0xFBAA 0x8AF6 #CJK UNIFIED IDEOGRAPH +0xFBAB 0x8B53 #CJK UNIFIED IDEOGRAPH +0xFBAC 0x8B7F #CJK UNIFIED IDEOGRAPH +0xFBAD 0x8CF0 #CJK UNIFIED IDEOGRAPH +0xFBAE 0x8CF4 #CJK UNIFIED IDEOGRAPH +0xFBAF 0x8D12 #CJK UNIFIED IDEOGRAPH +0xFBB0 0x8D76 #CJK UNIFIED IDEOGRAPH +0xFBB1 0xFA23 #CJK COMPATIBILITY IDEOGRAPH +0xFBB2 0x8ECF #CJK UNIFIED IDEOGRAPH +0xFBB3 0xFA24 #CJK COMPATIBILITY IDEOGRAPH +0xFBB4 0xFA25 #CJK COMPATIBILITY IDEOGRAPH +0xFBB5 0x9067 #CJK UNIFIED IDEOGRAPH +0xFBB6 0x90DE #CJK UNIFIED IDEOGRAPH +0xFBB7 0xFA26 #CJK COMPATIBILITY IDEOGRAPH +0xFBB8 0x9115 #CJK UNIFIED IDEOGRAPH +0xFBB9 0x9127 #CJK UNIFIED IDEOGRAPH +0xFBBA 0x91DA #CJK UNIFIED IDEOGRAPH +0xFBBB 0x91D7 #CJK UNIFIED IDEOGRAPH +0xFBBC 0x91DE #CJK UNIFIED IDEOGRAPH +0xFBBD 0x91ED #CJK UNIFIED IDEOGRAPH +0xFBBE 0x91EE #CJK UNIFIED IDEOGRAPH +0xFBBF 0x91E4 #CJK UNIFIED IDEOGRAPH +0xFBC0 0x91E5 #CJK UNIFIED IDEOGRAPH +0xFBC1 0x9206 #CJK UNIFIED IDEOGRAPH +0xFBC2 0x9210 #CJK UNIFIED IDEOGRAPH +0xFBC3 0x920A #CJK UNIFIED IDEOGRAPH +0xFBC4 0x923A #CJK UNIFIED IDEOGRAPH +0xFBC5 0x9240 #CJK UNIFIED IDEOGRAPH +0xFBC6 0x923C #CJK UNIFIED IDEOGRAPH +0xFBC7 0x924E #CJK UNIFIED IDEOGRAPH +0xFBC8 0x9259 #CJK UNIFIED IDEOGRAPH +0xFBC9 0x9251 #CJK UNIFIED IDEOGRAPH +0xFBCA 0x9239 #CJK UNIFIED IDEOGRAPH +0xFBCB 0x9267 #CJK UNIFIED IDEOGRAPH +0xFBCC 0x92A7 #CJK UNIFIED IDEOGRAPH +0xFBCD 0x9277 #CJK UNIFIED IDEOGRAPH +0xFBCE 0x9278 #CJK UNIFIED IDEOGRAPH +0xFBCF 0x92E7 #CJK UNIFIED IDEOGRAPH +0xFBD0 0x92D7 #CJK UNIFIED IDEOGRAPH +0xFBD1 0x92D9 #CJK UNIFIED IDEOGRAPH +0xFBD2 0x92D0 #CJK UNIFIED IDEOGRAPH +0xFBD3 0xFA27 #CJK COMPATIBILITY IDEOGRAPH +0xFBD4 0x92D5 #CJK UNIFIED IDEOGRAPH +0xFBD5 0x92E0 #CJK UNIFIED IDEOGRAPH +0xFBD6 0x92D3 #CJK UNIFIED IDEOGRAPH +0xFBD7 0x9325 #CJK UNIFIED IDEOGRAPH +0xFBD8 0x9321 #CJK UNIFIED IDEOGRAPH +0xFBD9 0x92FB #CJK UNIFIED IDEOGRAPH +0xFBDA 0xFA28 #CJK COMPATIBILITY IDEOGRAPH +0xFBDB 0x931E #CJK UNIFIED IDEOGRAPH +0xFBDC 0x92FF #CJK UNIFIED IDEOGRAPH +0xFBDD 0x931D #CJK UNIFIED IDEOGRAPH +0xFBDE 0x9302 #CJK UNIFIED IDEOGRAPH +0xFBDF 0x9370 #CJK UNIFIED IDEOGRAPH +0xFBE0 0x9357 #CJK UNIFIED IDEOGRAPH +0xFBE1 0x93A4 #CJK UNIFIED IDEOGRAPH +0xFBE2 0x93C6 #CJK UNIFIED IDEOGRAPH +0xFBE3 0x93DE #CJK UNIFIED IDEOGRAPH +0xFBE4 0x93F8 #CJK UNIFIED IDEOGRAPH +0xFBE5 0x9431 #CJK UNIFIED IDEOGRAPH +0xFBE6 0x9445 #CJK UNIFIED IDEOGRAPH +0xFBE7 0x9448 #CJK UNIFIED IDEOGRAPH +0xFBE8 0x9592 #CJK UNIFIED IDEOGRAPH +0xFBE9 0xF9DC #CJK COMPATIBILITY IDEOGRAPH +0xFBEA 0xFA29 #CJK COMPATIBILITY IDEOGRAPH +0xFBEB 0x969D #CJK UNIFIED IDEOGRAPH +0xFBEC 0x96AF #CJK UNIFIED IDEOGRAPH +0xFBED 0x9733 #CJK UNIFIED IDEOGRAPH +0xFBEE 0x973B #CJK UNIFIED IDEOGRAPH +0xFBEF 0x9743 #CJK UNIFIED IDEOGRAPH +0xFBF0 0x974D #CJK UNIFIED IDEOGRAPH +0xFBF1 0x974F #CJK UNIFIED IDEOGRAPH +0xFBF2 0x9751 #CJK UNIFIED IDEOGRAPH +0xFBF3 0x9755 #CJK UNIFIED IDEOGRAPH +0xFBF4 0x9857 #CJK UNIFIED IDEOGRAPH +0xFBF5 0x9865 #CJK UNIFIED IDEOGRAPH +0xFBF6 0xFA2A #CJK COMPATIBILITY IDEOGRAPH +0xFBF7 0xFA2B #CJK COMPATIBILITY IDEOGRAPH +0xFBF8 0x9927 #CJK UNIFIED IDEOGRAPH +0xFBF9 0xFA2C #CJK COMPATIBILITY IDEOGRAPH +0xFBFA 0x999E #CJK UNIFIED IDEOGRAPH +0xFBFB 0x9A4E #CJK UNIFIED IDEOGRAPH +0xFBFC 0x9AD9 #CJK UNIFIED IDEOGRAPH +0xFC40 0x9ADC #CJK UNIFIED IDEOGRAPH +0xFC41 0x9B75 #CJK UNIFIED IDEOGRAPH +0xFC42 0x9B72 #CJK UNIFIED IDEOGRAPH +0xFC43 0x9B8F #CJK UNIFIED IDEOGRAPH +0xFC44 0x9BB1 #CJK UNIFIED IDEOGRAPH +0xFC45 0x9BBB #CJK UNIFIED IDEOGRAPH +0xFC46 0x9C00 #CJK UNIFIED IDEOGRAPH +0xFC47 0x9D70 #CJK UNIFIED IDEOGRAPH +0xFC48 0x9D6B #CJK UNIFIED IDEOGRAPH +0xFC49 0xFA2D #CJK COMPATIBILITY IDEOGRAPH +0xFC4A 0x9E19 #CJK UNIFIED IDEOGRAPH +0xFC4B 0x9ED1 #CJK UNIFIED IDEOGRAPH diff --git a/ext/mbstring/tests/data/EmojiSources.txt b/ext/mbstring/tests/data/EmojiSources.txt new file mode 100644 index 0000000000000..b2a526160c128 --- /dev/null +++ b/ext/mbstring/tests/data/EmojiSources.txt @@ -0,0 +1,763 @@ +# EmojiSources-13.0.0.txt +# Date: 2019-09-09, 19:40:00 GMT [MS, KW] +# © 2019 Unicode®, Inc. +# For terms of use, see http://www.unicode.org/terms_of_use.html +# +# Unicode Character Database +# For documentation, see http://www.unicode.org/reports/tr44/ +# +# This file provides historical mappings between Unicode code points and sequences on one hand +# and Shift-JIS codes for cell phone carrier symbols on the other hand. +# Each mapping is symmetric ("round trip"), for equivalent Unicode and carrier +# symbols or sequences. This file does not include best-fit ("fallback") +# mappings to similar but not equivalent symbols in either mapping direction. +# +# Created for Unicode 6.0 by Markus Scherer. +# Updated for subsequent versions by Ken Whistler (no changes to mappings). +# +# Format: Semicolon-delimited file with a fixed number of fields. +# Note that the format, including the number of fields, may change in the future. +# +# Fields: +# 0: Unicode code point or sequence +# 1: DoCoMo Shift-JIS code +# 2: KDDI Shift-JIS code +# 3: SoftBank Shift-JIS code +# +# Each field 1..3 contains a code if and only if the vendor character set +# has a symbol which is equivalent to the Unicode character or sequence. + +# ================================================ + +# Keycap sequences for telephone keypad. +# The following 11 mappings are historical. The combining character sequences +# in these mappings do not include variation selectors for emoji presentation. +# Thus they do not match the named character sequences with keycaps listed in +# NamedSequences.txt. +# For modern data used in emoji support, see http://www.unicode.org/Public/emoji/latest/ + +0023 20E3;F985;F489;F7B0 +0030 20E3;F990;F7C9;F7C5 +0031 20E3;F987;F6FB;F7BC +0032 20E3;F988;F6FC;F7BD +0033 20E3;F989;F740;F7BE +0034 20E3;F98A;F741;F7BF +0035 20E3;F98B;F742;F7C0 +0036 20E3;F98C;F743;F7C1 +0037 20E3;F98D;F744;F7C2 +0038 20E3;F98E;F745;F7C3 +0039 20E3;F98F;F746;F7C4 + +00A9;F9D6;F774;F7EE +00AE;F9DB;F775;F7EF +2002;;F7AA; +2003;;F7A9; +2005;;F7AB; +203C;F9A9;F3F1; +2049;F9A8;F3F0; +2122;F9D7;F76A;FBD7 +2139;;F74F; +2194;F9E1;F47E; +2195;F9E2;F480; +2196;F8F8;F768;F7D7 +2197;F8D9;F771;F7D6 +2198;F8F7;F769;F7D8 +2199;F949;F772;F7D9 +21A9;F97E;F779; +21AA;;F778; +231A;F9C4;F797; +231B;;F798; +23E9;;F74C;F7DC +23EA;;F74B;F7DD +23EB;;F761; +23EC;;F760; +23F0;F95E;F7B1; +23F3;F9C1;F654; +24C2;F8BD;; +25AA;;F74E; +25AB;;F74D; +25B6;;F74A;F7DA +25C0;;F749;F7DB +25FB;;F754; +25FC;;F755; +25FD;;F750; +25FE;;F751; +2600;F89F;F660;F98B +2601;F8A0;F665;F98A +260E;F8E8;F7B3;F949 +2611;;F7D9; +2614;F8A1;F664;F98C +2615;F8D1;F7B4;F986 +261D;;F6CF;F94F +263A;;F6D4;FB54 +2648;F8A7;F667;F7DF +2649;F8A8;F668;F7E0 +264A;F8A9;F669;F7E1 +264B;F8AA;F66A;F7E2 +264C;F8AB;F66B;F7E3 +264D;F8AC;F66C;F7E4 +264E;F8AD;F66D;F7E5 +264F;F8AE;F66E;F7E6 +2650;F8AF;F66F;F7E7 +2651;F8B0;F670;F7E8 +2652;F8B1;F671;F7E9 +2653;F8B2;F672;F7EA +2660;F8EF;F7BE;F7AE +2663;F8F1;F7C0;F7AF +2665;F8EE;F378;F7AC +2666;F8F0;F7BF;F7AD +2668;F99C;F695;F763 +267B;F9DA;F47D; +267F;F8FC;F657;F7AA +2693;;F682; +26A0;F9DC;F659;F7F2 +26A1;F8A3;F65F;F77D +26AA;;F756; +26AB;;F757; +26BD;F8B7;F68F;F958 +26BE;F8B4;F693;F956 +26C4;F8A2;F65D;F989 +26C5;;F666; +26CE;;F673;F7EB +26D4;;F65C; +26EA;;F7EB;F977 +26F2;;F342;F761 +26F3;F8B5;F7B6;F954 +26F5;F947;F68D;F95C +26FA;;F343;F762 +26FD;F8CC;F78E;F97A +2702;F8D6;F6EF;F9B3 +2705;;F77A; +2708;F8C3;F68C;F95D +2709;F977;F6FA; +270A;F8F4;F488;F950 +270B;F8F6;F7C4;F952 +270C;F8F5;F7C3;F951 +270F;F9BE;F679; +2712;F952;F7DA; +2714;;F773; +2716;;F76B; +2728;F99F;F37E;F9CE +2733;;F75A;F7A6 +2734;;F651;F7A5 +2744;;F662; +2747;;F644; +274C;;F76C;F9D3 +274E;;F76D; +2753;;F65B;F960 +2754;;;F9D6 +2755;;;F9D7 +2757;F9A7;F65A;F961 +2764;F991;F7B2;F962 +2795;;F758; +2796;;F759; +2797;;F770; +27A1;;F76E;F7D4 +27B0;F9AF;F3F2; +2934;F99A;F3EE; +2935;F9A5;F3EF; +2B05;;F76F;F7D5 +2B06;;F75B;F7D2 +2B07;;F75C;F7D3 +2B1B;;F765; +2B1C;;F764; +2B50;;F663;F9CF +2B55;;F381;F9D2 +3030;F9AE;; +303D;;;F76C +3297;;F36C;F9AD +3299;F9D9;F6CA;F9B5 +1F004;;F344;F76D +1F0CF;;F473; +1F170;;F3E7;FBD2 +1F171;;F3E8;FBD3 +1F17E;;F3E9;FBD5 +1F17F;F8CD;F67E;F790 +1F18E;;F3EA;FBD4 +1F191;F980;F7C8; +1F192;;F358;F7B4 +1F193;F97B;F795; +1F194;F97C;F35B;F7C9 +1F195;F982;F7E5;F7B2 +1F196;F9D4;; +1F197;F9B0;F7CA;F7ED +1F198;;F6C1; +1F199;;F6E8;F7B3 +1F19A;;F345;F76E +1F1E8 1F1F3;;F3D2;FBB3 +1F1E9 1F1EA;;F3CF;FBAE +1F1EA 1F1F8;;F348;FBB1 +1F1EB 1F1F7;;F3CE;FBAD +1F1EC 1F1E7;;F3D1;FBB0 +1F1EE 1F1F9;;F3D0;FBAF +1F1EF 1F1F5;;F6A5;FBAB +1F1F0 1F1F7;;F3D3;FBB4 +1F1F7 1F1FA;;F349;FBB2 +1F1FA 1F1F8;;F790;FBAC +1F201;;;F7A3 +1F202;;F35A;F7C8 +1F21A;;;F7B6 +1F22F;;F35E;F7CC +1F232;F9DD;; +1F233;F9DE;F35D;F7CB +1F234;F9DF;; +1F235;F9E0;F35C;F7CA +1F236;;;F7B5 +1F237;;;F7B7 +1F238;;;F7B8 +1F239;;F359;F7C7 +1F23A;;F35F;F7CD +1F250;;F6D0;F7C6 +1F251;;F7D8; +1F300;F8A4;F641;FB84 +1F301;F8A5;F7B5; +1F302;F8A6;F3BC;FB7C +1F303;F957;F3C5;FB8C +1F304;;;F98E +1F305;;F3C8;FB8A +1F306;;F34D;F787 +1F307;;;FB8B +1F308;;F3C6;FB8D +1F309;;F698; +1F30A;F9E4;F481;FB7E +1F30B;;F457; +1F30C;;F463; +1F30F;;F7D0; +1F311;F940;F7C5; +1F313;F942;F7C7; +1F314;F941;F7C6; +1F315;F944;; +1F319;F943;F65E;F98D +1F31B;;F661; +1F31F;;;F9D5 +1F320;;F640; +1F330;;F3F9; +1F331;F9EB;F482; +1F334;;F6BB;F9A7 +1F335;;F369;F9A8 +1F337;F9E8;F6BD;F9A4 +1F338;F9ED;F6A3;F970 +1F339;;F7EA;F972 +1F33A;;F367;F9A3 +1F33B;;F6BC;F9A5 +1F33C;;F44D; +1F33D;;F3F7; +1F33E;;;FB85 +1F33F;;F487; +1F340;F9E6;F6EC;F750 +1F341;F9EC;F6A7;F758 +1F342;;F340;F759 +1F343;;;FB88 +1F344;;F3F8; +1F345;;F38F;F9E9 +1F346;;F390;F9EA +1F347;;F3F5; +1F348;;F3F3; +1F349;;F6A6;F9E8 +1F34A;;F38E;F9E6 +1F34C;F9E9;F3F6; +1F34D;;F3F4; +1F34E;F9EA;F38D;F9E5 +1F34F;;F45E; +1F351;;F3FA; +1F352;F9E7;F6AB; +1F353;;F6AD;F9E7 +1F354;F8D4;F6AF;F760 +1F355;;F3FC; +1F356;;F69D; +1F357;;F440; +1F358;;F387;F9DD +1F359;F9EE;F6AE;F9E2 +1F35A;;F388;F9DE +1F35B;;F38A;F9E1 +1F35C;F9F1;F7D1;F9E0 +1F35D;;F389;F9DF +1F35E;F9F2;F383;F9D9 +1F35F;;F385;F9DB +1F360;;F3FB; +1F361;;F386;F9DC +1F362;;F38B;F9E3 +1F363;;F38C;F9E4 +1F364;;F474; +1F365;;F6C6; +1F366;;F384;F9DA +1F367;;F3BE;FB80 +1F368;;F44E; +1F369;;F44F; +1F36A;;F450; +1F36B;;F451; +1F36C;;F452; +1F36D;;F453; +1F36E;;F45A; +1F36F;;F45D; +1F370;F9EF;F6A9;F987 +1F371;;F391;F9EC +1F372;;F392;F9ED +1F373;;F6AA;F788 +1F374;F8D0;F685;F984 +1F375;F9C3;F382;F9D8 +1F376;F9F0;F36A;F9AB +1F377;F9FB;F69A; +1F378;F8D2;F69B;F985 +1F379;;F442; +1F37A;F8D3;F69C;F988 +1F37B;;F36B;F9AC +1F380;F8E5;F7BC;F9B4 +1F381;F8E6;F6A8;F752 +1F382;F8E7;F7BD;F9EB +1F383;;F3C2;FB86 +1F384;F948;F6A2;F973 +1F385;;F3C4;FB89 +1F386;;F7FC;F757 +1F387;;F3BF;FB81 +1F388;;F36E;F9B0 +1F389;;F36F;F9B2 +1F38A;;F647; +1F38B;;F441; +1F38C;;F34C;F784 +1F38D;;F3B7;FB76 +1F38E;;F3B8;FB78 +1F38F;;F3BB;FB7B +1F390;;F3C1;FB83 +1F391;;F3C3;FB87 +1F392;;F3BA;FB7A +1F393;;F3B9;FB79 +1F3A0;F8DA;; +1F3A1;;F645;F764 +1F3A2;;F3B6;FB73 +1F3A3;;F446; +1F3A4;F8D7;F6DC;F97C +1F3A5;F8D8;F6F0;F97D +1F3A6;;;FBA7 +1F3A7;F8DB;F6E1;F9AA +1F3A8;F8DC;F7B9;FBA2 +1F3A9;F8DD;F3C9;FBA3 +1F3AA;F8DE;F7BB; +1F3AB;F8DF;F676;F765 +1F3AC;F950;F697;F9C4 +1F3AD;;F7BA; +1F3AE;F8EC;F69F; +1F3AF;;F69E;F770 +1F3B0;;F646;F773 +1F3B1;;F3B1;FB6C +1F3B2;;F6A1; +1F3B3;;F447; +1F3B4;;F472; +1F3B5;F99B;F7EE;F97E +1F3B6;F9A4;F6DE;F9C6 +1F3B7;;;F981 +1F3B8;;F6DF;F982 +1F3B9;;F444; +1F3BA;;F3B0;F983 +1F3BB;;F6E0; +1F3BC;;F3A0; +1F3BD;F8B3;; +1F3BE;F8B6;F690;F955 +1F3BF;F8B8;F380;F953 +1F3C0;F8B9;F7B7;FB6A +1F3C1;F8BA;F692;F772 +1F3C2;F9B7;F691; +1F3C3;F9D8;F643;F755 +1F3C4;;F445;F957 +1F3C6;;F346;F771 +1F3C8;;F694;FB6B +1F3CA;;F3B2;FB6D +1F3E0;F8C4;F684;F976 +1F3E1;;F7E0; +1F3E2;F8C5;F686;F978 +1F3E3;F8C6;F351;F794 +1F3E5;F8C7;F352;F796 +1F3E6;F8C8;F683;F78E +1F3E7;F8C9;F67B;F795 +1F3E8;F8CA;F354;F799 +1F3E9;;F3C7;FBA1 +1F3EA;F8CB;F67C;F797 +1F3EB;F9E3;F353;F798 +1F3EC;;F3CA;FBA4 +1F3ED;;F3CD;FBA8 +1F3EE;;F696; +1F3EF;;F3CB;FBA5 +1F3F0;;F3CC;FBA6 +1F40C;F9F3;F483; +1F40D;;F3E3;FBCD +1F40E;;;F774 +1F411;;;FBC9 +1F412;;;FBC8 +1F414;;F3E4;FBCE +1F417;;F3E5;FBCF +1F418;;F3E0;FBC6 +1F419;;F7F7;F74A +1F41A;;F3C0;FB82 +1F41B;;F3DF;FBC5 +1F41C;;F6B6; +1F41D;;F45B; +1F41E;;F45C; +1F41F;F9F6;;F959 +1F420;;F3DE;FBC2 +1F421;;F6AC; +1F422;;F347; +1F423;;F34E; +1F424;F9F4;F6B9;FBC3 +1F425;;F47A; +1F426;;;FBC1 +1F427;F9F5;F6B5;F996 +1F428;;F3E1;FBC7 +1F429;;F6B8; +1F42B;;F3E6;FBD0 +1F42C;;F3DC;FBC0 +1F42D;;F7F2;F994 +1F42E;;F3E2;FBCB +1F42F;;F7F0;F991 +1F430;;F6B0;FBCC +1F431;F946;F6B4;F990 +1F432;;F443; +1F433;;F648;F995 +1F434;F9F9;F6B1;F95A +1F435;;F6B2;F749 +1F436;F945;F6BA;F993 +1F437;F9FA;F6B7;F74B +1F438;;F6B3;FBD1 +1F439;;;FBC4 +1F43A;;;FBCA +1F43B;;F7F1;F992 +1F43C;;F44A; +1F43D;;F44C; +1F43E;;F6C7; +1F440;F8F2;F7C1;FB59 +1F442;F8F3;F7C2;FB5B +1F443;;F3A4;FB5A +1F444;;F3A5;FB5C +1F445;;F44B; +1F446;;F360;F7CE +1F447;;F361;F7CF +1F448;;F6D8;F7D0 +1F449;;F6D9;F7D1 +1F44A;F9A2;F6CC;F94D +1F44B;;F3AA;FB5E +1F44C;;F3A8;FB60 +1F44D;F9CC;F6D2;F94E +1F44E;;F3A9;FB61 +1F44F;;F3A7;FB5F +1F450;;;FB62 +1F451;F9BF;F7F9;F74E +1F452;;F371;F9B8 +1F453;F8FB;F6D7; +1F454;;F366;F9A2 +1F455;F9B3;F7E6;F946 +1F456;F9B6;F47B; +1F457;;F46F;F9B9 +1F458;;F376;F9C1 +1F459;;F377;F9C2 +1F45A;;F6E6; +1F45B;F9B4;F6DD; +1F45C;F8E3;F674;F9C3 +1F45D;F951;; +1F45E;;F7E7; +1F45F;F8FA;F3EC;F947 +1F460;F8D5;F6F3;F77E +1F461;;;F9BA +1F462;;F372;F9BB +1F463;F8F9;F3EB;FBD6 +1F464;F955;; +1F466;;;F941 +1F467;;;F942 +1F468;;F6D5;F944 +1F469;;F6D3;F945 +1F46A;;F6DA; +1F46B;;;FB68 +1F46E;;F350;F793 +1F46F;;F3AF;FB69 +1F470;;F3BD; +1F471;;F3D4;FBB5 +1F472;;F3D5;FBB6 +1F473;;F3D6;FBB7 +1F474;;F3D7;FBB8 +1F475;;F3D8;FBB9 +1F476;;F3D9;FBBA +1F477;;F3DA;FBBB +1F478;;F3DB;FBBC +1F479;;F448; +1F47A;;F449; +1F47B;;F6A4;F75B +1F47C;;F7EF;F98F +1F47D;;F6E7;F74C +1F47E;;F6C5;F76B +1F47F;;F6C8;F75A +1F480;;F6D1;F75C +1F481;;;F7F3 +1F482;;;FBBE +1F483;;F3DD;FBBF +1F484;F9B5;F6E2;F9BC +1F485;;F373;F9BD +1F486;;F6E4;F9BE +1F487;;F374;F9BF +1F488;;F375;F9C0 +1F489;;F6E9;F77B +1F48A;;F36D;F9AF +1F48B;F99E;F6C4;F943 +1F48C;F9BC;F47C; +1F48D;F9C0;F6ED;F974 +1F48E;;;F975 +1F48F;;F7FA;F751 +1F490;;F368;F9A6 +1F491;;F3AE;FB65 +1F492;;;FB7D +1F493;F992;F479;F9C7 +1F494;F993;F64F;F963 +1F495;F994;F650; +1F496;;F379; +1F497;;;F9C8 +1F498;;F6C3;F9C9 +1F499;;F37A;F9CA +1F49A;;F37B;F9CB +1F49B;;F37C;F9CC +1F49C;;F37D;F9CD +1F49D;;F458;FB77 +1F49E;;F7CC; +1F49F;;;F7A4 +1F4A0;F99D;; +1F4A1;F9A0;F64E;F74F +1F4A2;F9A1;F6BE;F9D4 +1F4A3;F9A3;F652;F9B1 +1F4A4;F9A6;F64D;F77C +1F4A5;F9AA;F7CD; +1F4A6;F9AB;F7CE;F9D1 +1F4A7;F9AC;F6BF; +1F4A8;F9AD;F6CD;F9D0 +1F4A9;;F6CE;F99B +1F4AA;;F6C2;F78D +1F4AB;;F460; +1F4AC;;F6D6; +1F4AE;;F6C9; +1F4AF;;F6CB; +1F4B0;F9BA;F6A0;F76F +1F4B1;;;F78A +1F4B2;;F796; +1F4B3;;F799; +1F4B4;F97A;F79A; +1F4B5;;F7A2; +1F4B8;;F45F; +1F4B9;;F34F;F78B +1F4BA;F956;;F75F +1F4BB;F9BB;F7E8;F94C +1F4BC;;F341;F75E +1F4BD;;F79F;F9B6 +1F4BE;;F77E; +1F4BF;F8ED;F6E5;F766 +1F4C0;;;F767 +1F4C1;;F7AC; +1F4C2;;F7AD; +1F4C3;;F77D; +1F4C4;;F786; +1F4C5;;F780; +1F4C6;;F787; +1F4C7;;F789; +1F4C8;;F792; +1F4C9;;F793; +1F4CA;;F791; +1F4CB;;F781; +1F4CC;;F78A; +1F4CD;;F77C; +1F4CE;F9D5;F678; +1F4CF;;F78D; +1F4D0;;F67A; +1F4D1;;F7E2; +1F4D2;;F78B; +1F4D3;;F788; +1F4D4;;F675; +1F4D5;;F785; +1F4D6;F8E4;F677;F789 +1F4D7;;F782; +1F4D8;;F783; +1F4D9;;F784; +1F4DA;;F78C; +1F4DB;;F6F6; +1F4DC;;F77B; +1F4DD;F8EA;F365;F9A1 +1F4DE;;F6F7; +1F4DF;F8BB;F7B8; +1F4E0;F974;F6F9;F94B +1F4E1;;F681;F78C +1F4E2;;;F783 +1F4E3;;;F9B7 +1F4E4;;F7AF; +1F4E5;;F7B0; +1F4E6;;F6F8; +1F4E7;;F475; +1F4E8;;F7AE; +1F4E9;F973;F466;F743 +1F4EA;;F6F4; +1F4EB;;F7E1;F741 +1F4EE;;;F742 +1F4F0;;F7A8; +1F4F1;F8E9;F7A5;F94A +1F4F2;F972;F7DF;F744 +1F4F3;;F363;F7F0 +1F4F4;;F364;F7F1 +1F4F6;;F357;F7AB +1F4F7;F8E2;F6EE;F948 +1F4F9;;F79B; +1F4FA;F8EB;F6DB;F76A +1F4FB;;F7E9;F768 +1F4FC;;F79D;F769 +1F503;;F7E4; +1F50A;;F6EA;F782 +1F50B;;F7A1; +1F50C;;F7A6; +1F50D;F981;F6F1;F754 +1F50E;;F7DC; +1F50F;;F7E3; +1F510;;F7D3; +1F511;F97D;F6F2;F980 +1F512;;F6F5;F785 +1F513;;;F786 +1F514;F9B8;F6EB;F9C5 +1F516;;F7DE; +1F517;;F7A7; +1F518;;F7DB; +1F519;;F7DD; +1F51A;F95D;; +1F51B;F95C;; +1F51C;F95B;; +1F51D;;;F7EC +1F51E;;F356;F7A7 +1F51F;;F747; +1F520;;F7D4; +1F521;;F7D5; +1F522;;F7D6; +1F523;;F7D7; +1F524;;F459; +1F525;;F653;F75D +1F526;;F7A0; +1F527;F9BD;F7A4; +1F528;;F7FB;F756 +1F529;;F79E; +1F52A;;F79C; +1F52B;;F6E3;F753 +1F52E;;F362; +1F52F;;;F7DE +1F530;;F658;F7A9 +1F531;;;F971 +1F532;;;F7BA +1F533;;;F7BB +1F534;;F766;F7B9 +1F535;;F767; +1F536;;F762; +1F537;;F763; +1F538;;F752; +1F539;;F753; +1F53A;;F776; +1F53B;;F777; +1F53C;;F75F; +1F53D;;F75E; +1F550;;;F964 +1F551;;;F965 +1F552;;;F966 +1F553;;;F967 +1F554;;;F968 +1F555;;;F969 +1F556;;;F96A +1F557;;;F96B +1F558;;;F96C +1F559;;;F96D +1F55A;;;F96E +1F55B;;;F96F +1F5FB;F9E5;F7ED;F97B +1F5FC;;F699;FBA9 +1F5FD;;;FBBD +1F5FE;;F78F; +1F5FF;;F470; +1F601;F9F8;F485;FB44 +1F602;;F468;FB52 +1F603;F995;F649;F998 +1F604;;;FB55 +1F605;F9C7;; +1F606;F9CF;; +1F609;F9CE;F7F3;FB45 +1F60A;;F3A1;F997 +1F60B;F9F7;; +1F60C;F9C6;F399;FB4A +1F60D;F9CB;F7F4;F746 +1F60F;F9D1;F393;FB42 +1F612;F9CA;F39D;FB4E +1F613;F9C8;F7F6;F748 +1F614;F9C5;F394;FB43 +1F616;F998;F397;FB47 +1F618;;F3A3;FB58 +1F61A;;F3A2;FB57 +1F61C;F9CD;F6C0;F745 +1F61D;;;FB49 +1F61E;F997;;F999 +1F620;F996;F64A;F99A +1F621;F9C9;F461;FB56 +1F622;F9D3;F46D;FB53 +1F623;F9D0;F396;FB46 +1F624;;F395; +1F625;;;FB41 +1F628;;F39A;FB4B +1F629;;F46B; +1F62A;;F398;FB48 +1F62B;;F64C; +1F62D;F9D2;F64B;FB51 +1F630;;F39F;FB4F +1F631;F9FC;F7F5;F747 +1F632;;F39E;FB50 +1F633;;F39C;FB4D +1F635;F999;F7CB; +1F637;;F39B;FB4C +1F638;;F484; +1F639;;F467; +1F63A;;F465; +1F63B;;F469; +1F63C;;F46E; +1F63D;;F464; +1F63E;;F462; +1F63F;;F46C; +1F640;;F46A; +1F645;;F3AB;FB63 +1F646;;F3AC;FB64 +1F647;;F3AD;FB66 +1F648;;F454; +1F649;;F456; +1F64A;;F455; +1F64B;;F48A; +1F64C;;F48B;FB67 +1F64D;;F48C; +1F64E;;F48D; +1F64F;;F3A6;FB5D +1F680;;F7F8;F74D +1F683;F8BC;F68E;F95E +1F684;F8BE;;FB75 +1F685;;F689;F95F +1F687;;F7EC;FB74 +1F689;;F471;F979 +1F68C;F8C1;F688;F79A +1F68F;;F680;F791 +1F691;;F3B4;FB71 +1F692;;F3B3;FB70 +1F693;;F3B5;FB72 +1F695;;;F79B +1F697;F8BF;F68A;F95B +1F699;F8C0;;FB6E +1F69A;;F68B;FB6F +1F6A2;F8C2;F355;F7A2 +1F6A4;;;F775 +1F6A5;F8CE;F642;F78F +1F6A7;;F34A;F777 +1F6A8;;F477; +1F6A9;F983;F3ED; +1F6AA;F9B9;; +1F6AB;;F75D; +1F6AC;F8E0;F655;F9AE +1F6AD;F8E1;F656;F7A8 +1F6B2;F9C2;F687;F776 +1F6B6;;F476;F7A1 +1F6B9;;;F778 +1F6BA;;;F779 +1F6BB;F8CF;F67D;F792 +1F6BC;;;F77A +1F6BD;;;F781 +1F6BE;;;F9A9 +1F6C0;;F34B;F780 + +# EOF diff --git a/ext/mbstring/tests/encoding_tests.inc b/ext/mbstring/tests/encoding_tests.inc index e95bc8fd09aa9..2993640c19d00 100644 --- a/ext/mbstring/tests/encoding_tests.inc +++ b/ext/mbstring/tests/encoding_tests.inc @@ -158,7 +158,7 @@ function findInvalidChars($valid, &$invalid, &$truncated, $startBytes = array()) $prefixes[substr($char, 0, $len)] = true; } - $varLength = function($prefix) use($valid, &$invalid, &$truncated) { + $varLength = function($prefix) use($valid, $prefixes, &$invalid, &$truncated, &$varLength) { for ($byte = 0; $byte < 256; $byte++) { $str = $prefix . chr($byte); if (!isset($valid[$str])) { @@ -172,7 +172,7 @@ function findInvalidChars($valid, &$invalid, &$truncated, $startBytes = array()) } }; - $fixedLength = function($prefix, $remaining) use($valid, &$invalid, &$truncated, &$fixedLength) { + $fixedLength = function($prefix, $remaining) use($valid, $prefixes, &$invalid, &$truncated, &$fixedLength) { if ($remaining == 0) { if (!isset($valid[$prefix])) $invalid[$prefix] = true; diff --git a/ext/mbstring/tests/eucjp_encoding.phpt b/ext/mbstring/tests/eucjp_encoding.phpt index dc321d3baeb25..3a90431e4a043 100644 --- a/ext/mbstring/tests/eucjp_encoding.phpt +++ b/ext/mbstring/tests/eucjp_encoding.phpt @@ -43,6 +43,9 @@ $fromUnicode["\x00\x00\x00\x7E"] = "\x7E"; /* Likewise with 0x005C */ $fromUnicode["\x00\x00\x00\x5C"] = "\x5C"; +/* U+203E is OVERLINE; convert to FULLWIDTH MACRON */ +$fromUnicode["\x00\x00\x20\x3E"] = "\xA1\xB1"; + findInvalidChars($validChars, $invalidChars, $truncated, array_fill_keys(range(0xA1, 0xFE), 2) + array(0x8E => 2, 0x8F => 3)); /* In the JIS X 0212 character set, kuten code 0x2237 (EUC-JP 0x8FA2B7) diff --git a/ext/mbstring/tests/pictogram1.phpt b/ext/mbstring/tests/pictogram1.phpt index 2c9609939adbc..7f82768a305ac 100644 --- a/ext/mbstring/tests/pictogram1.phpt +++ b/ext/mbstring/tests/pictogram1.phpt @@ -68,6 +68,7 @@ var_dump(bin2hex(mb_convert_encoding("\x00\x00\x00\x23\x00\x00\x20\xe3", "UTF-8- var_dump(bin2hex(mb_convert_encoding("\x00\x00\x00\x23\x00\x00\x20\xe3", "UTF-8-Mobile#KDDI", "UCS-4BE"))); var_dump(bin2hex(mb_convert_encoding("\x00\x00\x00\x23\x00\x00\x20\xe3", "UTF-8-Mobile#SOFTBANK", "UCS-4BE"))); +/* Chinese flag emoji */ var_dump(bin2hex(mb_convert_encoding("\x00\x01\xf1\xe8\x00\x01\xf1\xf3", "UTF-8-Mobile#DOCOMO", "UCS-4BE"))); var_dump(bin2hex(mb_convert_encoding("\x00\x01\xf1\xe8\x00\x01\xf1\xf3", "UTF-8-Mobile#KDDI", "UCS-4BE"))); var_dump(bin2hex(mb_convert_encoding("\x00\x01\xf1\xe8\x00\x01\xf1\xf3", "UTF-8-Mobile#SOFTBANK", "UCS-4BE"))); diff --git a/ext/mbstring/tests/sjis2004_encoding.phpt b/ext/mbstring/tests/sjis2004_encoding.phpt index cf9ef7a91a79a..3b4299e753bf6 100644 --- a/ext/mbstring/tests/sjis2004_encoding.phpt +++ b/ext/mbstring/tests/sjis2004_encoding.phpt @@ -36,8 +36,13 @@ while ($line = fgets($fp, 256)) { } } } -$fromUnicode["\x00\x7E"] = "\x7E"; /* Not reversible; SJIS 0x7E -> U+203E */ -$fromUnicode["\x00\x5C"] = "\x5C"; /* Not reversible; SJIS 0x5C -> U+00A5 */ + +/* U+007E is TILDE, Shift-JIS 0x8160 is WAVE DASH */ +$fromUnicode["\x00\x7E"] = "\x81\x60"; + +/* U+005C is backslash, Shift-JIS 0x815F is REVERSE SOLIDUS + * (ie. a fancy way to say "backslash") */ +$fromUnicode["\x00\x5C"] = "\x81\x5F"; testAllValidChars($validChars, 'SJIS-2004', 'UTF-32BE'); echo "SJIS-2004 verification and conversion works for all valid characters\n"; diff --git a/ext/mbstring/tests/sjis_encoding.phpt b/ext/mbstring/tests/sjis_encoding.phpt index a75ce85a4f81f..d7d7d264573d4 100644 --- a/ext/mbstring/tests/sjis_encoding.phpt +++ b/ext/mbstring/tests/sjis_encoding.phpt @@ -19,12 +19,13 @@ for ($i = 0; $i < 0x20; $i++) { $fromUnicode["\x00" . chr($i)] = chr($i); } +/* U+007E is TILDE; convert to Shift-JIS 0x8160 (WAVE DASH) */ +$fromUnicode["\x00\x7E"] = "\x81\x60"; /* DEL character */ $validChars["\x7F"] = "\x00\x7F"; $fromUnicode["\x00\x7F"] = "\x7F"; -/* Although Shift-JIS uses 0x7E for an overline, we will map Unicode 0x7E - * (tilde) to Shift-JIS 0x7E (as iconv does) */ -$fromUnicode["\x00\x7E"] = "\x7E"; +/* U+00AF is MACRON; Shift-JIS 0x7E is overline */ +$fromUnicode["\x00\xAF"] = "\x7E"; /* Use fullwidth reverse solidus, not (halfwidth) backslash (0x5C) */ $validChars["\x81\x5F"] = "\xFF\x3C"; $fromUnicode["\xFF\x3C"] = "\x81\x5F"; diff --git a/ext/mbstring/tests/sjis_mobile_encodings.phpt b/ext/mbstring/tests/sjis_mobile_encodings.phpt new file mode 100644 index 0000000000000..49b5e9c093971 --- /dev/null +++ b/ext/mbstring/tests/sjis_mobile_encodings.phpt @@ -0,0 +1,295 @@ +--TEST-- +Exhaustive test of Shift-JIS DoCoMo, KDDI, SoftBank encoding verification and conversion +--SKIPIF-- + +--FILE-- += 4) { + if (sscanf($fields[0], "%x %x", $cp1, $cp2) == 2) { + $utf32 = pack('N', $cp1) . pack('N', $cp2); + } else { + $utf32 = pack('N', hexdec($fields[0])); + unset($invalidCodepoints[$utf32]); + } + + if ($fields[1]) + $docomo[pack('n', hexdec($fields[1]))] = $utf32; + if ($fields[2]) + $kddi[pack('n', hexdec($fields[2]))] = $utf32; + if ($fields[3]) { + $bytes = pack('n', hexdec($fields[3])); + $sbEmoji[$bytes] = $utf32; + unset($nonInvertibleSoftbank[$bytes]); + } + } +} + +/* Other, vendor-specific emoji which do not appear in EmojiSources.txt + * Most of these don't exist in Unicode and have been mapped to 'private + * area' codepoints */ +$docomo["\xF9\x4A"] = "\x00\x0F\xEE\x16"; // PIAS PI +$docomo["\xF9\x4B"] = "\x00\x0F\xEE\x17"; // PIAS A +$docomo["\xF9\x4C"] = "\x00\x0F\xEE\x18"; // INVERSE TICKET +$docomo["\xF9\x4D"] = "\x00\x0F\xEE\x19"; // KATAKANA ABBREVIATION FOR TICKET ("chi ke") +$docomo["\xF9\x4E"] = "\x00\x0F\xEE\x1A"; // RESERVE BY PHONE +$docomo["\xF9\x4F"] = "\x00\x0F\xEE\x1B"; // P CODE +$docomo["\xF9\x53"] = "\x00\x0F\xEE\x1C"; // MOVIES 2 +$docomo["\xF9\x54"] = "\x00\x0F\xEE\x1D"; // PIAS PI INVERSE +$docomo["\xF9\x58"] = "\x00\x0F\xEE\x1E"; // PIAS PI CIRCLE +$docomo["\xF9\x59"] = "\x00\x0F\xEE\x1F"; // PIAS PI SQUARE +$docomo["\xF9\x5A"] = "\x00\x0F\xEE\x20"; // CHECK +$docomo["\xF9\x5F"] = "\x00\x0F\xEE\x21"; // F +$docomo["\xF9\x60"] = "\x00\x0F\xEE\x22"; // D +$docomo["\xF9\x61"] = "\x00\x0F\xEE\x23"; // S +$docomo["\xF9\x62"] = "\x00\x0F\xEE\x24"; // C +$docomo["\xF9\x63"] = "\x00\x0F\xEE\x25"; // R +$docomo["\xF9\x64"] = "\x00\x00\x25\xEA"; // SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK +$nonInvertibleDocomo["\xF9\x64"] = "\x00\x00\x25\xEA"; +$docomo["\xF9\x65"] = "\x00\x00\x25\xA0"; // BLACK SQUARE +$nonInvertibleDocomo["\xF9\x65"] = "\x00\x00\x25\xA0"; +$docomo["\xF9\x66"] = "\x00\x00\x25\xBF"; // DOWNWARD TRIANGLE +$nonInvertibleDocomo["\xF9\x66"] = "\x00\x00\x25\xBF"; +/* TODO: test that FEE28 converts to F966, for backwards compatibility */ +$docomo["\xF9\x67"] = "\x00\x0F\xEE\x29"; // QUADRUPLE DAGGER +$docomo["\xF9\x68"] = "\x00\x0F\xEE\x2A"; // TRIPLE DAGGER +$docomo["\xF9\x69"] = "\x00\x0F\xEE\x2B"; // DOUBLE DAGGER +$docomo["\xF9\x6A"] = "\x00\x00\x20\x20"; // DAGGER +$nonInvertibleDocomo["\xF9\x6A"] = "\x00\x00\x20\x20"; +/* TODO: test that FEE2C converts to F96A, for backwards compatibility */ +$docomo["\xF9\x6B"] = "\x00\x0F\xEE\x2D"; // I (meaning "inexpensive") +$docomo["\xF9\x6C"] = "\x00\x0F\xEE\x2E"; // M (meaning "moderate") +$docomo["\xF9\x6D"] = "\x00\x0F\xEE\x2F"; // E (meaning "expensive") +$docomo["\xF9\x6E"] = "\x00\x0F\xEE\x30"; // VE (meaning "very expensive") +$docomo["\xF9\x6F"] = "\x00\x0F\xEE\x31"; // SPHERE +$docomo["\xF9\x70"] = "\x00\x0F\xEE\x32"; // CREDIT CARDS NOT ACCEPTED +$docomo["\xF9\x71"] = "\x00\x0F\xEE\x33"; // CHECKBOX +$docomo["\xF9\x75"] = "\x00\x0F\xEE\x10"; // I-MODE +$docomo["\xF9\x76"] = "\x00\x0F\xEE\x11"; // I-MODE WITH FRAME +$docomo["\xF9\x78"] = "\x00\x0F\xEE\x12"; // PROVIDED BY DOCOMO +$docomo["\xF9\x79"] = "\x00\x0F\xEE\x13"; // DOCOMO POINT +$docomo["\xF9\x84"] = "\x00\x00\x27\xBF"; // FREE DIAL; mapped to DOUBLE CURLY LOOP +unset($invalidCodepoints["\x00\x00\x27\xBF"]); +$docomo["\xF9\x86"] = "\x00\x0F\xE8\x2D"; // MOBILE Q +$docomo["\xF9\xB1"] = "\x00\x0F\xEE\x14"; // I-APPLI +$docomo["\xF9\xB2"] = "\x00\x0F\xEE\x15"; // I-APPLI WITH BORDER + +$kddi["\xF7\x94"] = "\x00\x0F\xEE\x40"; // EZ WEB +$kddi["\xF7\xCF"] = "\x00\x0F\xEE\x41"; // EZ PLUS +$kddi["\xF3\x70"] = "\x00\x0F\xEE\x42"; // EZ NAVIGATION +$kddi["\xF4\x78"] = "\x00\x0F\xEE\x43"; // EZ MOVIE +$kddi["\xF4\x86"] = "\x00\x0F\xEE\x44"; // CMAIL +$kddi["\xF4\x8E"] = "\x00\x0F\xEE\x45"; // JAVA (TM) +$kddi["\xF4\x8F"] = "\x00\x0F\xEE\x46"; // BREW +$kddi["\xF4\x90"] = "\x00\x0F\xEE\x47"; // EZ RING MUSIC +$kddi["\xF4\x91"] = "\x00\x0F\xEE\x48"; // EZ NAVI +$kddi["\xF4\x92"] = "\x00\x0F\xEE\x49"; // WIN +$kddi["\xF4\x93"] = "\x00\x0F\xEE\x4A"; // PREMIUM SIGN +$kddi["\xF7\x48"] = "\x00\x0F\xE8\x2D"; // MOBILE Q +$kddi["\xF7\xA3"] = "\x00\x0F\xE8\x3C"; // PDC ("personal digital cellular") +$kddi["\xF7\xD2"] = "\x00\x0F\xEB\x89"; // OPENWAVE + +$sbEmoji["\xF7\xB1"] = "\x00\x00\x27\xBF"; // FREE DIAL; mapped to DOUBLE CURLY +$sbEmoji["\xF7\xF4"] = "\x00\x0F\xEE\x77"; // J-PHONE SHOP +$sbEmoji["\xF7\xF5"] = "\x00\x0F\xEE\x78"; // SKY WEB +$sbEmoji["\xF7\xF6"] = "\x00\x0F\xEE\x79"; // SKY WALKER +$sbEmoji["\xF7\xF7"] = "\x00\x0F\xEE\x7A"; // SKY MELODY +$sbEmoji["\xF7\xF8"] = "\x00\x0F\xEE\x7B"; // J-PHONE 1 +$sbEmoji["\xF7\xF9"] = "\x00\x0F\xEE\x7C"; // J-PHONE 2 +$sbEmoji["\xF7\xFA"] = "\x00\x0F\xEE\x7D"; // J-PHONE 3 + +/* SoftBank-specific 'JSky1', 'JSky2', 'VODAFONE1', 'VODAFONE2', etc. emoji, + * which are not supported by Unicode */ +for ($i = 0xFBD8; $i <= 0xFBDE; $i++) { + $bytes = pack('n', $i); + $sbEmoji[$bytes] = pack('N', 0xFEE70 + $i - 0xFBD8); + unset($nonInvertibleSoftbank[$bytes]); +} +/* SoftBank-specific emoji for Shibuya department store */ +$sbEmoji["\xFB\xAA"] = "\x00\x0F\xE4\xC5"; +unset($nonInvertibleSoftbank["\xFB\xAA"]); + +$softbank = array_merge($softbank, $sbEmoji); + +/* For Softbank, we support an alternative representation for emoji which + * uses sequences starting with ESC. Apparently this was used in older + * versions of Softbank's phones. + * ESC could be followed by 6 different ASCII characters, each of which + * represented a different ku code */ +$escCodeToKu = array('G' => 0x91, 'E' => 0x8D, 'F' => 0x8E, 'O' => 0x92, 'P' => 0x95, 'Q' => 0x96); +$escCodeMaxTen = array('G' => 0x7A, 'E' => 0x7A, 'F' => 0x7A, 'O' => 0x6D, 'P' => 0x6C, 'Q' => 0x5E); + +function shiftJISEncode($ku, $ten) { + $ku -= 0x21; + $ten -= 0x21; + $hiBits = $ku >> 1; + $loBit = $ku % 2; + if ($hiBits < 31) { + $sjis = chr($hiBits + 0x81); + } else { + $sjis = chr($hiBits - 31 + 0xE0); + } + if ($loBit == 0) { + if ($ten < 63) + return $sjis . chr($ten + 0x40); + else + return $sjis . chr($ten - 63 + 0x80); + } else { + return $sjis . chr($ten + 0x9F); + } +} + +foreach ($escCodeToKu as $char => $ku) { + for ($ten = 0x21; $ten <= $escCodeMaxTen[$char]; $ten++) { + $sjis = shiftJISEncode($ku, $ten); + if (isset($sbEmoji[$sjis])) { + $bytes = "\x1B\$" . $char . chr($ten); + $unicode = $softbank[$sjis]; + $nonInvertibleSoftbank[$bytes] = $softbank[$bytes] = $unicode; + } + } +} + +/* A bare ESC is not valid for Softbank, since it is used for escape sequences + * which represent emoji */ +unset($softbank["\x1B"]); + +function testSJISVariant($validChars, $nonInvertible, $encoding) { + global $fromUnicode, $invalidCodepoints, $escCodeToKu; + + $lenTable = array_fill_keys(range(0xE0, 0xFC), 2) + array_fill_keys(range(0x81, 0x9F), 2); + findInvalidChars($validChars, $invalidChars, $truncated, $lenTable); + + foreach ($escCodeToKu as $char => $unused) { + unset($invalidChars["\x1B\$" . $char . "\x0F"]); + unset($truncated["\x1B\$" . $char]); + } + + $escapes = []; + foreach ($nonInvertible as $bytes => $unicode) { + unset($validChars[$bytes]); + if (substr($bytes, 0, 1) === "\x1B") + array_push($escapes, $bytes); + } + /* 0xF is used to terminate a run of emoji encoded using ESC sequence + * We couldn't do this earlier or `findInvalidChars` wouldn't have worked + * as desired */ + foreach ($escapes as $bytes) { + $nonInvertible[$bytes . "\x0F"] = $nonInvertible[$bytes]; + unset($nonInvertible[$bytes]); + } + + testAllValidChars($validChars, $encoding, 'UTF-32BE'); + testAllValidChars($nonInvertible, $encoding, 'UTF-32BE', false); + echo "$encoding verification and conversion works on all valid characters\n"; + + testAllInvalidChars($invalidChars, $validChars, $encoding, 'UTF-32BE', "\x00\x00\x00%"); + testTruncatedChars($truncated, $encoding, 'UTF-32BE', "\x00\x00\x00%"); + echo "$encoding verification and conversion works on all invalid characters\n"; + + convertAllInvalidChars($invalidCodepoints, $fromUnicode, 'UTF-32BE', $encoding, '%'); + echo "Unicode -> $encoding conversion works on all invalid codepoints\n"; +} + +testSJISVariant($docomo, $nonInvertibleDocomo, 'SJIS-Mobile#DOCOMO'); +testSJISVariant($kddi, $nonInvertible, 'SJIS-Mobile#KDDI'); +testSJISVariant($softbank, $nonInvertibleSoftbank, 'SJIS-Mobile#SOFTBANK'); + +?> +--EXPECT-- +SJIS-Mobile#DOCOMO verification and conversion works on all valid characters +SJIS-Mobile#DOCOMO verification and conversion works on all invalid characters +Unicode -> SJIS-Mobile#DOCOMO conversion works on all invalid codepoints +SJIS-Mobile#KDDI verification and conversion works on all valid characters +SJIS-Mobile#KDDI verification and conversion works on all invalid characters +Unicode -> SJIS-Mobile#KDDI conversion works on all invalid codepoints +SJIS-Mobile#SOFTBANK verification and conversion works on all valid characters +SJIS-Mobile#SOFTBANK verification and conversion works on all invalid characters +Unicode -> SJIS-Mobile#SOFTBANK conversion works on all invalid codepoints diff --git a/ext/mbstring/tests/sjismac_encoding.phpt b/ext/mbstring/tests/sjismac_encoding.phpt index 2dedfa7970572..5803f0dc022c8 100644 --- a/ext/mbstring/tests/sjismac_encoding.phpt +++ b/ext/mbstring/tests/sjismac_encoding.phpt @@ -62,6 +62,14 @@ $fromUnicode["\x00\x7F"] = "\x7F"; * and U+2015 */ $fromUnicode["\x20\x15"] = "\x81\x5C"; +/* Convert U+203E (OVERLINE) to 0x8150 (FULLWIDTH MACRON) */ +$fromUnicode["\x20\x3E"] = "\x81\x50"; +/* And also U+00AF (MACRON) */ +$fromUnicode["\x00\xAF"] = "\x81\x50"; + +/* Convert U+FF5E (FULLWIDTH TILDE) to 0x8160 (WAVE DASH) */ +$fromUnicode["\xFF\x5E"] = "\x81\x60"; + testAllValidChars($validChars, 'SJIS-mac', 'UTF-32BE'); echo "MacJapanese verification and conversion works on all valid characters\n"; diff --git a/ext/mysqli/config.m4 b/ext/mysqli/config.m4 index b57ce197a946c..764b6db5d35a7 100644 --- a/ext/mysqli/config.m4 +++ b/ext/mysqli/config.m4 @@ -47,34 +47,18 @@ if test "$PHP_MYSQLI" = "yes" || test "$PHP_MYSQLI" = "mysqlnd"; then elif test "$PHP_MYSQLI" != "no"; then MYSQL_CONFIG=$PHP_MYSQLI - MYSQL_LIB_NAME='mysqlclient' - MYSQL_LIB_CFG='--libs' - if test -x "$MYSQL_CONFIG" && $MYSQL_CONFIG $MYSQL_LIB_CFG > /dev/null 2>&1; then + if test -x "$MYSQL_CONFIG" && $MYSQL_CONFIG --libs > /dev/null 2>&1; then MYSQLI_INCLINE=`$MYSQL_CONFIG --cflags | $SED -e "s/'//g"` - MYSQLI_LIBLINE=`$MYSQL_CONFIG $MYSQL_LIB_CFG | $SED -e "s/'//g"` + MYSQLI_LIBLINE=`$MYSQL_CONFIG --libs | $SED -e "s/'//g"` else AC_MSG_RESULT([mysql_config not found]) AC_MSG_ERROR([Please reinstall the mysql distribution]) fi - dnl - dnl Check the library - dnl - PHP_CHECK_LIBRARY($MYSQL_LIB_NAME, mysql_set_server_option, - [ - PHP_EVAL_INCLINE($MYSQLI_INCLINE) - PHP_EVAL_LIBLINE($MYSQLI_LIBLINE, MYSQLI_SHARED_LIBADD) - AC_DEFINE(HAVE_MYSQLILIB, 1, [ ]) - PHP_CHECK_LIBRARY($MYSQL_LIB_NAME, mysql_set_character_set, - [ ],[ - AC_MSG_ERROR([MySQLI doesn't support versions < 4.1.13 (for MySQL 4.1.x) and < 5.0.7 for (MySQL 5.0.x) anymore. Please update your libraries.]) - ],[$MYSQLI_LIBLINE]) - ],[ - AC_MSG_ERROR([wrong mysql library version or lib not found. Check config.log for more information.]) - ],[ - $MYSQLI_LIBLINE - ]) + PHP_EVAL_INCLINE($MYSQLI_INCLINE) + PHP_EVAL_LIBLINE($MYSQLI_LIBLINE, MYSQLI_SHARED_LIBADD) + AC_DEFINE(HAVE_MYSQLILIB, 1, [ ]) fi dnl Build extension diff --git a/ext/mysqli/mysqli.c b/ext/mysqli/mysqli.c index 55557da48898d..50c5038f1575d 100644 --- a/ext/mysqli/mysqli.c +++ b/ext/mysqli/mysqli.c @@ -656,7 +656,7 @@ PHP_MINIT_FUNCTION(mysqli) REGISTER_LONG_CONSTANT("MYSQLI_OPT_NET_CMD_BUFFER_SIZE", MYSQLND_OPT_NET_CMD_BUFFER_SIZE, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("MYSQLI_OPT_NET_READ_BUFFER_SIZE", MYSQLND_OPT_NET_READ_BUFFER_SIZE, CONST_CS | CONST_PERSISTENT); #endif -#ifdef MYSQLND_STRING_TO_INT_CONVERSION +#ifdef MYSQLI_USE_MYSQLND REGISTER_LONG_CONSTANT("MYSQLI_OPT_INT_AND_FLOAT_NATIVE", MYSQLND_OPT_INT_AND_FLOAT_NATIVE, CONST_CS | CONST_PERSISTENT); #endif #if MYSQL_VERSION_ID < 80000 || MYSQL_VERSION_ID >= 100000 || defined(MYSQLI_USE_MYSQLND) @@ -988,28 +988,32 @@ PHP_METHOD(mysqli_stmt, __construct) if (zend_parse_parameters(ZEND_NUM_ARGS(), "O|s!", &mysql_link, mysqli_link_class_entry, &statement, &statement_len) == FAILURE) { RETURN_THROWS(); } - MYSQLI_FETCH_RESOURCE_CONN(mysql, mysql_link, MYSQLI_STATUS_VALID); stmt = (MY_STMT *) ecalloc(1, sizeof(MY_STMT)); - stmt->stmt = mysql_stmt_init(mysql->mysql); - if (stmt->stmt && statement) { - mysql_stmt_prepare(stmt->stmt, (char *)statement, statement_len); - } - if (!stmt->stmt) { + if (!(stmt->stmt = mysql_stmt_init(mysql->mysql))) { efree(stmt); RETURN_FALSE; } + #ifndef MYSQLI_USE_MYSQLND ZVAL_COPY(&stmt->link_handle, mysql_link); #endif mysqli_resource = (MYSQLI_RESOURCE *)ecalloc (1, sizeof(MYSQLI_RESOURCE)); mysqli_resource->ptr = (void *)stmt; - mysqli_resource->status = (ZEND_NUM_ARGS() == 1) ? MYSQLI_STATUS_INITIALIZED : MYSQLI_STATUS_VALID; + mysqli_resource->status = MYSQLI_STATUS_INITIALIZED; MYSQLI_REGISTER_RESOURCE_EX(mysqli_resource, getThis()); + + if (statement) { + if(mysql_stmt_prepare(stmt->stmt, statement, statement_len)) { + MYSQLI_REPORT_STMT_ERROR(stmt->stmt); + RETURN_FALSE; + } + mysqli_resource->status = MYSQLI_STATUS_VALID; + } } PHP_METHOD(mysqli_result, __construct) @@ -1126,7 +1130,7 @@ void php_mysqli_fetch_into_hash_aux(zval *return_value, MYSQL_RES * result, zend } } #else - mysqlnd_fetch_into(result, ((fetchtype & MYSQLI_NUM)? MYSQLND_FETCH_NUM:0) | ((fetchtype & MYSQLI_ASSOC)? MYSQLND_FETCH_ASSOC:0), return_value, MYSQLND_MYSQLI); + mysqlnd_fetch_into(result, ((fetchtype & MYSQLI_NUM)? MYSQLND_FETCH_NUM:0) | ((fetchtype & MYSQLI_ASSOC)? MYSQLND_FETCH_ASSOC:0), return_value); #endif } /* }}} */ diff --git a/ext/mysqli/mysqli_api.c b/ext/mysqli/mysqli_api.c index d1e0634dc7a9a..0fc7017960256 100644 --- a/ext/mysqli/mysqli_api.c +++ b/ext/mysqli/mysqli_api.c @@ -1116,7 +1116,7 @@ static void php_add_field_properties(zval *value, const MYSQL_FIELD *field) */ add_property_string(value, "catalog", "def"); - add_property_long(value, "max_length", field->max_length); + add_property_long(value, "max_length", 0); add_property_long(value, "length", field->length); add_property_long(value, "charsetnr", field->charsetnr); add_property_long(value, "flags", field->flags); @@ -1459,7 +1459,7 @@ void php_mysqli_init(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_method) We create always persistent, as if the user want to connect to p:somehost, we can't convert the handle then */ - if (!(mysql->mysql = mysqlnd_init(MYSQLND_CLIENT_KNOWS_RSET_COPY_DATA, TRUE))) + if (!(mysql->mysql = mysqlnd_init(MYSQLND_CLIENT_NO_FLAG, TRUE))) #endif { efree(mysql); @@ -1638,9 +1638,7 @@ static int mysqli_options_get_option_zval_type(int option) #ifdef MYSQLI_USE_MYSQLND case MYSQLND_OPT_NET_CMD_BUFFER_SIZE: case MYSQLND_OPT_NET_READ_BUFFER_SIZE: -#ifdef MYSQLND_STRING_TO_INT_CONVERSION case MYSQLND_OPT_INT_AND_FLOAT_NATIVE: -#endif #endif /* MYSQLI_USE_MYSQLND */ case MYSQL_OPT_CONNECT_TIMEOUT: #ifdef MYSQL_REPORT_DATA_TRUNCATION @@ -2529,11 +2527,7 @@ PHP_FUNCTION(mysqli_store_result) RETURN_THROWS(); } MYSQLI_FETCH_RESOURCE_CONN(mysql, mysql_link, MYSQLI_STATUS_VALID); -#ifdef MYSQLI_USE_MYSQLND - result = flags & MYSQLI_STORE_RESULT_COPY_DATA? mysqlnd_store_result_ofs(mysql->mysql) : mysqlnd_store_result(mysql->mysql); -#else result = mysql_store_result(mysql->mysql); -#endif if (!result) { MYSQLI_REPORT_MYSQL_ERROR(mysql->mysql); RETURN_FALSE; diff --git a/ext/mysqli/mysqli_nonapi.c b/ext/mysqli/mysqli_nonapi.c index 364638c44a077..6ea09b1fc2d79 100644 --- a/ext/mysqli/mysqli_nonapi.c +++ b/ext/mysqli/mysqli_nonapi.c @@ -245,7 +245,7 @@ void mysqli_common_connect(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_real_conne #ifndef MYSQLI_USE_MYSQLND if (!(mysql->mysql = mysql_init(NULL))) { #else - if (!(mysql->mysql = mysqlnd_init(MYSQLND_CLIENT_KNOWS_RSET_COPY_DATA, persistent))) { + if (!(mysql->mysql = mysqlnd_init(MYSQLND_CLIENT_NO_FLAG, persistent))) { #endif goto err; } @@ -307,7 +307,7 @@ void mysqli_common_connect(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_real_conne } } if (mysqlnd_connect(mysql->mysql, hostname, username, passwd, passwd_len, dbname, dbname_len, - port, socket, flags, MYSQLND_CLIENT_KNOWS_RSET_COPY_DATA) == NULL) + port, socket, flags, MYSQLND_CLIENT_NO_FLAG) == NULL) #endif { /* Save error messages - for mysqli_connect_error() & mysqli_connect_errno() */ @@ -689,12 +689,7 @@ PHP_FUNCTION(mysqli_query) switch (resultmode & ~MYSQLI_ASYNC) { #endif case MYSQLI_STORE_RESULT: -#ifdef MYSQLI_USE_MYSQLND - if (resultmode & MYSQLI_STORE_RESULT_COPY_DATA) { - result = mysqlnd_store_result_ofs(mysql->mysql); - } else -#endif - result = mysql_store_result(mysql->mysql); + result = mysql_store_result(mysql->mysql); break; case MYSQLI_USE_RESULT: result = mysql_use_result(mysql->mysql); diff --git a/ext/mysqli/mysqli_warning.c b/ext/mysqli/mysqli_warning.c index 7b1552e5ace47..30af6cb960d1b 100644 --- a/ext/mysqli/mysqli_warning.c +++ b/ext/mysqli/mysqli_warning.c @@ -125,13 +125,13 @@ MYSQLI_WARNING * php_get_warnings(MYSQLND_CONN_DATA * mysql) return NULL; } - result = mysql->m->use_result(mysql, 0); + result = mysql->m->use_result(mysql); for (;;) { zval *entry; int errno; - mysqlnd_fetch_into(result, MYSQLND_FETCH_NUM, &row, MYSQLND_MYSQLI); + mysqlnd_fetch_into(result, MYSQLND_FETCH_NUM, &row); if (Z_TYPE(row) != IS_ARRAY) { zval_ptr_dtor(&row); break; diff --git a/ext/mysqli/tests/061.phpt b/ext/mysqli/tests/061.phpt deleted file mode 100644 index 76a40c704e2bd..0000000000000 --- a/ext/mysqli/tests/061.phpt +++ /dev/null @@ -1,80 +0,0 @@ ---TEST-- -local infile handler ---SKIPIF-- -errno, $link->error)); - -mysqli_close($link); -?> ---INI-- -mysqli.allow_local_infile=1 ---FILE-- - ---CLEAN-- - ---EXPECT-- -foo-bar -string-string -rab-oof -string-string -done! diff --git a/ext/mysqli/tests/063.phpt b/ext/mysqli/tests/063.phpt index 26bfe48ee54b2..b76b2c99855af 100644 --- a/ext/mysqli/tests/063.phpt +++ b/ext/mysqli/tests/063.phpt @@ -16,9 +16,18 @@ require_once('skipifconnectfailure.inc'); $stmt->bind_result($foo); $stmt->fetch(); $stmt->close(); - $mysql->close(); - var_dump($foo); + + mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); + try { + // an exception should be thrown from prepare (i.e. constructor) not from execute + $stmt = new mysqli_stmt($mysql, "SELECT invalid FROM DUAL"); + } catch(mysqli_sql_exception $e) { + echo $e->getMessage()."\n"; + } + + $mysql->close(); ?> --EXPECT-- string(3) "foo" +Unknown column 'invalid' in 'field list' diff --git a/ext/mysqli/tests/bug67983.phpt b/ext/mysqli/tests/bug67983.phpt new file mode 100644 index 0000000000000..a72501c076819 --- /dev/null +++ b/ext/mysqli/tests/bug67983.phpt @@ -0,0 +1,35 @@ +--TEST-- +Bug #67983: mysqlnd with MYSQLI_OPT_INT_AND_FLOAT_NATIVE fails to interpret bit columns +--SKIPIF-- + +--FILE-- + +--EXPECT-- +int(0) +int(1) +int(42) diff --git a/ext/mysqli/tests/connect.inc b/ext/mysqli/tests/connect.inc index 6bf393a2de665..604ecc97ea344 100644 --- a/ext/mysqli/tests/connect.inc +++ b/ext/mysqli/tests/connect.inc @@ -13,7 +13,7 @@ $user = getenv("MYSQL_TEST_USER") ?: "root"; $passwd = getenv("MYSQL_TEST_PASSWD") ?: ""; $db = getenv("MYSQL_TEST_DB") ?: "test"; - $engine = getenv("MYSQL_TEST_ENGINE") ?: "MyISAM"; + $engine = getenv("MYSQL_TEST_ENGINE") ?: "InnoDB"; $socket = getenv("MYSQL_TEST_SOCKET") ?: null; $skip_on_connect_failure = getenv("MYSQL_TEST_SKIP_CONNECT_FAILURE") ?: true; $connect_flags = (int)getenv("MYSQL_TEST_CONNECT_FLAGS") ?: 0; diff --git a/ext/mysqli/tests/mysqli_character_set_name.phpt b/ext/mysqli/tests/mysqli_character_set_name.phpt index 5728b726a507c..79d472d334390 100644 --- a/ext/mysqli/tests/mysqli_character_set_name.phpt +++ b/ext/mysqli/tests/mysqli_character_set_name.phpt @@ -1,5 +1,5 @@ --TEST-- -mysqli_chararcter_set_name(), mysql_client_encoding() [alias] +mysqli_character_set_name(), mysql_client_encoding() [alias] --SKIPIF-- --FILE-- ---FILE-- - ---CLEAN-- - ---EXPECTF-- -Warning: mysqli_disable_reads_from_master(): mysqli object is already closed in %s on line %d -done! diff --git a/ext/mysqli/tests/mysqli_enable_reads_from_master.phpt b/ext/mysqli/tests/mysqli_enable_reads_from_master.phpt deleted file mode 100644 index 9c74b9592c21c..0000000000000 --- a/ext/mysqli/tests/mysqli_enable_reads_from_master.phpt +++ /dev/null @@ -1,46 +0,0 @@ ---TEST-- -mysqli_enable_reads_from_master() ---SKIPIF-- - ---FILE-- -getMessage() . "\n"; - } - - if (NULL !== ($tmp = mysqli_enable_reads_from_master($link))) - printf("[005] Expecting NULL, got %s/%s\n", gettype($tmp), $tmp); - - print "done!"; -?> ---EXPECT-- -mysqli object is already closed -done! diff --git a/ext/mysqli/tests/mysqli_expire_password.phpt b/ext/mysqli/tests/mysqli_expire_password.phpt index b11856d60dfca..12508494af0ac 100644 --- a/ext/mysqli/tests/mysqli_expire_password.phpt +++ b/ext/mysqli/tests/mysqli_expire_password.phpt @@ -1,5 +1,5 @@ --TEST-- -MySQL 5.6 EXPIRE PASSWORD protocol change +MySQL 5.6 / MariaDB 10.4.3 EXPIRE PASSWORD protocol change --SKIPIF-- server_version < 50610) die(sprintf("SKIP Needs MySQL 5.6.10 or newer, found MySQL %s\n", $link->server_info)); +if ($link->server_version >= 100000) { + if ($link->server_version < 100403) + die(sprintf("SKIP Needs MariaDB 10.4.3 or newer, found MariaDB %s\n", $link->server_info)); + $result = $link->query("select @@disconnect_on_expired_password"); + if (!$result) + die("SKIP Failed to query MariaDB @@disconnect_on_expired_password value"); + $row = mysqli_fetch_row($result); + if ($row[0] == 0) + die("SKIP Cannot run in MariaDB @@disconnect_on_expired_password=OFF state"); + +} + if (!$IS_MYSQLND && (mysqli_get_client_version() < 50610)) { die(sprintf("SKIP Needs libmysql 5.6.10 or newer, found %s\n", mysqli_get_client_version())); } @@ -20,15 +32,15 @@ if (!$IS_MYSQLND && (mysqli_get_client_version() < 50610)) { mysqli_query($link, 'DROP USER expiretest'); mysqli_query($link, 'DROP USER expiretest@localhost'); -if (!mysqli_query($link, 'CREATE USER expiretest@"%"') || - !mysqli_query($link, 'CREATE USER expiretest@"localhost"')) { +if (!mysqli_query($link, 'CREATE USER expiretest IDENTIFIED BY \'expiredpassword\'') || + !mysqli_query($link, 'CREATE USER expiretest@localhost IDENTIFIED BY \'expiredpassword\'')) { printf("skip Cannot create second DB user [%d] %s", mysqli_errno($link), mysqli_error($link)); mysqli_close($link); die("skip CREATE USER failed"); } -if (!mysqli_query($link, 'ALTER USER expiretest@"%" PASSWORD EXPIRE') || - !mysqli_query($link, 'ALTER USER expiretest@"localhost" PASSWORD EXPIRE')) { +if (!mysqli_query($link, 'ALTER USER expiretest PASSWORD EXPIRE') || + !mysqli_query($link, 'ALTER USER expiretest@localhost PASSWORD EXPIRE')) { printf("skip Cannot modify second DB user [%d] %s", mysqli_errno($link), mysqli_error($link)); mysqli_close($link); die("skip ALTER USER failed"); @@ -53,17 +65,18 @@ if (!mysqli_query($link, sprintf("GRANT SELECT ON TABLE %s.test TO expiretest@'% require_once('table.inc'); /* default */ - if (!$link = my_mysqli_connect($host, 'expiretest', "", $db, $port, $socket)) { + if (!$link = my_mysqli_connect($host, 'expiretest', 'expiredpassword', $db, $port, $socket)) { printf("[001] Cannot connect [%d] %s\n", mysqli_connect_errno(), mysqli_connect_error()); } else { $link->query("SELECT id FROM test WHERE id = 1"); printf("[002] Connect should fail, [%d] %s\n", $link->errno, $link->error); } + /* explicitly requesting default */ $link = mysqli_init(); $link->options(MYSQLI_OPT_CAN_HANDLE_EXPIRED_PASSWORDS, 0); - if (!my_mysqli_real_connect($link, $host, 'expiretest', "", $db, $port, $socket)) { + if (!my_mysqli_real_connect($link, $host, 'expiretest', 'expiredpassword', $db, $port, $socket)) { printf("[003] Cannot connect [%d] %s\n", mysqli_connect_errno(), mysqli_connect_error()); } else { @@ -74,7 +87,7 @@ if (!mysqli_query($link, sprintf("GRANT SELECT ON TABLE %s.test TO expiretest@'% /* allow connect */ $link = mysqli_init(); $link->options(MYSQLI_OPT_CAN_HANDLE_EXPIRED_PASSWORDS, 1); - if (!my_mysqli_real_connect($link, $host, 'expiretest', "", $db, $port, $socket)) { + if (!my_mysqli_real_connect($link, $host, 'expiretest', 'expiredpassword', $db, $port, $socket)) { printf("[005] Cannot connect [%d] %s\n", mysqli_connect_errno(), mysqli_connect_error()); } else { @@ -86,7 +99,7 @@ if (!mysqli_query($link, sprintf("GRANT SELECT ON TABLE %s.test TO expiretest@'% /* allow connect, fix pw */ $link = mysqli_init(); $link->options(MYSQLI_OPT_CAN_HANDLE_EXPIRED_PASSWORDS, 1); - if (!my_mysqli_real_connect($link, $host, 'expiretest', "", $db, $port, $socket)) { + if (!my_mysqli_real_connect($link, $host, 'expiretest', 'expiredpassword', $db, $port, $socket)) { printf("[007] Cannot connect [%d] %s\n", mysqli_connect_errno(), mysqli_connect_error()); } else { @@ -122,11 +135,11 @@ if (!mysqli_query($link, sprintf("GRANT SELECT ON TABLE %s.test TO expiretest@'% mysqli_query($link, 'DROP USER expiretest@localhost'); ?> --EXPECTF-- -Warning: mysqli%sconnect(): (HY000/1862): %s in %s on line %d -[001] Cannot connect [1862] %s +Warning: mysqli%sconnect(): (HY000/%d): %s in %s on line %d +[001] Cannot connect [%d] %s -Warning: mysqli%sconnect(): (HY000/1862): %s in %s on line %d -[003] Cannot connect [1862] %s +Warning: mysqli%sconnect(): (HY000/%d): %s in %s on line %d +[003] Cannot connect [%d] %s [006] Connect allowed, query fail, [1820] %s [008] Connect allowed, pw set, [0%A array(1) { diff --git a/ext/mysqli/tests/mysqli_fetch_field.phpt b/ext/mysqli/tests/mysqli_fetch_field.phpt index 2018d75755051..48d30453a0a37 100644 --- a/ext/mysqli/tests/mysqli_fetch_field.phpt +++ b/ext/mysqli/tests/mysqli_fetch_field.phpt @@ -35,10 +35,6 @@ require_once('skipifconnectfailure.inc'); printf("[004] Expecting charset %s/%d got %d\n", $charsetInfo->charset, $charsetInfo->number, $tmp->charsetnr); } - if ($tmp->length != $charsetInfo->max_length) { - printf("[005] Expecting length %d got %d\n", - $charsetInfo->max_length, $tmp->max_length); - } if ($tmp->db != $db) { printf("011] Expecting database '%s' got '%s'\n", $db, $tmp->db); @@ -97,7 +93,7 @@ object(stdClass)#%d (13) { ["catalog"]=> string(%d) "%s" ["max_length"]=> - int(1) + int(0) ["length"]=> int(11) ["charsetnr"]=> @@ -159,7 +155,7 @@ object(stdClass)#%d (13) { ["catalog"]=> string(%d) "%s" ["max_length"]=> - int(1) + int(0) ["length"]=> int(11) ["charsetnr"]=> diff --git a/ext/mysqli/tests/mysqli_fetch_field_oo.phpt b/ext/mysqli/tests/mysqli_fetch_field_oo.phpt index d655e05a9c1da..ed0ce107cfffb 100644 --- a/ext/mysqli/tests/mysqli_fetch_field_oo.phpt +++ b/ext/mysqli/tests/mysqli_fetch_field_oo.phpt @@ -42,10 +42,6 @@ require_once('skipifconnectfailure.inc'); printf("[005] Expecting charset %s/%d got %d\n", $charsetInfo->charset, $charsetInfo->number, $tmp->charsetnr); } - if ($tmp->length != $charsetInfo->max_length) { - printf("[006] Expecting length %d got %d\n", - $charsetInfo->max_length, $tmp->max_length); - } if ($tmp->db != $db) { printf("[007] Expecting database '%s' got '%s'\n", $db, $tmp->db); @@ -86,7 +82,7 @@ object(stdClass)#%d (13) { ["catalog"]=> string(%d) "%s" ["max_length"]=> - int(1) + int(0) ["length"]=> int(11) ["charsetnr"]=> diff --git a/ext/mysqli/tests/mysqli_fetch_fields.phpt b/ext/mysqli/tests/mysqli_fetch_fields.phpt index 7cfad35f87389..ae1d12847a217 100644 --- a/ext/mysqli/tests/mysqli_fetch_fields.phpt +++ b/ext/mysqli/tests/mysqli_fetch_fields.phpt @@ -35,11 +35,6 @@ require_once('skipifconnectfailure.inc'); $charsetInfo->charset, $charsetInfo->number, $field->charsetnr); } - if ($field->length != $charsetInfo->max_length) { - printf("[005] Expecting length %d got %d\n", - $charsetInfo->max_length, - $field->max_length); - } break; } } @@ -76,7 +71,7 @@ object(stdClass)#%d (13) { ["catalog"]=> string(%d) "%s" ["max_length"]=> - int(1) + int(0) ["length"]=> int(11) ["charsetnr"]=> @@ -104,7 +99,7 @@ object(stdClass)#%d (13) { ["catalog"]=> string(%d) "%s" ["max_length"]=> - int(1) + int(0) ["length"]=> int(%d) ["charsetnr"]=> diff --git a/ext/mysqli/tests/mysqli_send_query.phpt b/ext/mysqli/tests/mysqli_send_query.phpt deleted file mode 100644 index 0289e7733e5cc..0000000000000 --- a/ext/mysqli/tests/mysqli_send_query.phpt +++ /dev/null @@ -1,51 +0,0 @@ ---TEST-- -mysqli_send_query() ---SKIPIF-- - ---FILE-- -getMessage() . "\n"; - } - print "done!"; -?> ---EXPECT-- -mysqli object is already closed -done! diff --git a/ext/mysqli/tests/mysqli_stmt_attr_set.phpt b/ext/mysqli/tests/mysqli_stmt_attr_set.phpt index 0edbc578e8f61..634faa01c399e 100644 --- a/ext/mysqli/tests/mysqli_stmt_attr_set.phpt +++ b/ext/mysqli/tests/mysqli_stmt_attr_set.phpt @@ -61,7 +61,7 @@ require_once("connect.inc"); $res->close(); $stmt->close(); - // expecting max_length to _be_ set + // MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH is no longer supported, expect no change in behavior. $stmt = mysqli_stmt_init($link); $stmt->prepare("SELECT label FROM test"); var_dump($stmt->attr_set(MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH, 1)); @@ -75,8 +75,8 @@ require_once("connect.inc"); $max_lengths = array(); foreach ($fields as $k => $meta) { $max_lengths[$meta->name] = $meta->max_length; - if ($meta->max_length === 0) - printf("[008] max_length should be set (!= 0), got %s for field %s\n", $meta->max_length, $meta->name); + if ($meta->max_length !== 0) + printf("[008] max_length should be not set (= 0), got %s for field %s\n", $meta->max_length, $meta->name); } $res->close(); $stmt->close(); diff --git a/ext/mysqli/tests/mysqli_stmt_get_result_metadata_fetch_field.phpt b/ext/mysqli/tests/mysqli_stmt_get_result_metadata_fetch_field.phpt index 0c9f0dfe23e7a..b33611eb32927 100644 --- a/ext/mysqli/tests/mysqli_stmt_get_result_metadata_fetch_field.phpt +++ b/ext/mysqli/tests/mysqli_stmt_get_result_metadata_fetch_field.phpt @@ -175,6 +175,6 @@ object(stdClass)#%d (13) { ["type"]=> int(253) ["decimals"]=> - int(31) + int(3%d) } done! diff --git a/ext/mysqlnd/mysqlnd.h b/ext/mysqlnd/mysqlnd.h index dc9b1e9732658..582d8f152b832 100644 --- a/ext/mysqlnd/mysqlnd.h +++ b/ext/mysqlnd/mysqlnd.h @@ -24,7 +24,6 @@ #define MYSQLND_PLUGIN_API_VERSION 2 -#define MYSQLND_STRING_TO_INT_CONVERSION /* This force mysqlnd to do a single (or more depending on amount of data) non-blocking read() calls before sending a command to the server. Useful @@ -99,10 +98,9 @@ PHPAPI MYSQLND * mysqlnd_connection_connect(MYSQLND * conn, PHPAPI void mysqlnd_debug(const char *mode); /* Query */ -#define mysqlnd_fetch_into(result, flags, ret_val, ext) (result)->m.fetch_into((result), (flags), (ret_val), (ext) ZEND_FILE_LINE_CC) +#define mysqlnd_fetch_into(result, flags, ret_val) (result)->m.fetch_into((result), (flags), (ret_val) ZEND_FILE_LINE_CC) #define mysqlnd_fetch_row_c(result) (result)->m.fetch_row_c((result)) #define mysqlnd_fetch_all(result, flags, return_value) (result)->m.fetch_all((result), (flags), (return_value) ZEND_FILE_LINE_CC) -#define mysqlnd_result_fetch_field_data(res,offset,ret) (res)->m.fetch_field_data((res), (offset), (ret)) #define mysqlnd_get_connection_stats(conn, values) ((conn)->data)->m->get_statistics((conn)->data, (values) ZEND_FILE_LINE_CC) #define mysqlnd_get_client_stats(values) _mysqlnd_get_client_stats(mysqlnd_global_stats, (values) ZEND_FILE_LINE_CC) @@ -114,9 +112,8 @@ PHPAPI void mysqlnd_debug(const char *mode); PHPAPI enum_func_status mysqlnd_poll(MYSQLND **r_array, MYSQLND **e_array, MYSQLND ***dont_poll, long sec, long usec, int * desc_num); -#define mysqlnd_use_result(conn) ((conn)->data)->m->use_result((conn)->data, 0) -#define mysqlnd_store_result(conn) ((conn)->data)->m->store_result((conn)->data, MYSQLND_STORE_NO_COPY) -#define mysqlnd_store_result_ofs(conn) ((conn)->data)->m->store_result((conn)->data, MYSQLND_STORE_COPY) +#define mysqlnd_use_result(conn) ((conn)->data)->m->use_result((conn)->data) +#define mysqlnd_store_result(conn) ((conn)->data)->m->store_result((conn)->data) #define mysqlnd_next_result(conn) ((conn)->data)->m->next_result((conn)->data) #define mysqlnd_more_results(conn) ((conn)->data)->m->more_results((conn)->data) #define mysqlnd_free_result(r,e_or_i) ((MYSQLND_RES*)r)->m.free_result(((MYSQLND_RES*)(r)), (e_or_i)) @@ -309,14 +306,10 @@ ZEND_BEGIN_MODULE_GLOBALS(mysqlnd) zend_long log_mask; zend_long net_read_timeout; zend_long mempool_default_size; - zend_long debug_emalloc_fail_threshold; - zend_long debug_ecalloc_fail_threshold; - zend_long debug_erealloc_fail_threshold; zend_long debug_malloc_fail_threshold; zend_long debug_calloc_fail_threshold; zend_long debug_realloc_fail_threshold; char * sha256_server_public_key; - zend_bool fetch_data_copy; zend_bool collect_statistics; zend_bool collect_memory_statistics; ZEND_END_MODULE_GLOBALS(mysqlnd) diff --git a/ext/mysqlnd/mysqlnd_alloc.c b/ext/mysqlnd/mysqlnd_alloc.c index 5beb3707cbcb7..6c8845248e832 100644 --- a/ext/mysqlnd/mysqlnd_alloc.c +++ b/ext/mysqlnd/mysqlnd_alloc.c @@ -78,29 +78,12 @@ static void * _mysqlnd_emalloc(size_t size MYSQLND_MEM_D) { void *ret; zend_bool collect_memory_statistics = MYSQLND_G(collect_memory_statistics); -#if PHP_DEBUG - zend_long * threshold = &MYSQLND_G(debug_emalloc_fail_threshold); - TRACE_ALLOC_ENTER(mysqlnd_emalloc_name); - - { - char * fn = strrchr(__zend_filename, PHP_DIR_SEPARATOR); - TRACE_ALLOC_INF_FMT("file=%-15s line=%4d", fn? fn + 1:__zend_filename, __zend_lineno); - } - - if (*threshold == 0) { - ret = NULL; - } else { - ret = emalloc_rel(REAL_SIZE(size)); - --*threshold; - } -#else TRACE_ALLOC_ENTER(mysqlnd_emalloc_name); ret = emalloc_rel(REAL_SIZE(size)); -#endif TRACE_ALLOC_INF_FMT("size=%lu ptr=%p", size, ret); - if (ret && collect_memory_statistics) { + if (collect_memory_statistics) { *(size_t *) ret = size; MYSQLND_INC_GLOBAL_STATISTIC_W_VALUE2(STAT_MEM_EMALLOC_COUNT, 1, STAT_MEM_EMALLOC_AMOUNT, size); } @@ -114,29 +97,12 @@ static void * _mysqlnd_pemalloc(size_t size, zend_bool persistent MYSQLND_MEM_D) { void *ret; zend_bool collect_memory_statistics = MYSQLND_G(collect_memory_statistics); -#if PHP_DEBUG - zend_long * threshold = persistent? &MYSQLND_G(debug_malloc_fail_threshold):&MYSQLND_G(debug_emalloc_fail_threshold); - TRACE_ALLOC_ENTER(mysqlnd_pemalloc_name); - - { - char * fn = strrchr(__zend_filename, PHP_DIR_SEPARATOR); - TRACE_ALLOC_INF_FMT("file=%-15s line=%4d", fn? fn + 1:__zend_filename, __zend_lineno); - } - - if (*threshold == 0) { - ret = NULL; - } else { - ret = pemalloc_rel(REAL_SIZE(size), persistent); - --*threshold; - } -#else TRACE_ALLOC_ENTER(mysqlnd_pemalloc_name); ret = pemalloc_rel(REAL_SIZE(size), persistent); -#endif TRACE_ALLOC_INF_FMT("size=%lu ptr=%p persistent=%u", size, ret, persistent); - if (ret && collect_memory_statistics) { + if (collect_memory_statistics) { enum mysqlnd_collected_stats s1 = persistent? STAT_MEM_MALLOC_COUNT:STAT_MEM_EMALLOC_COUNT; enum mysqlnd_collected_stats s2 = persistent? STAT_MEM_MALLOC_AMOUNT:STAT_MEM_EMALLOC_AMOUNT; *(size_t *) ret = size; @@ -153,31 +119,13 @@ static void * _mysqlnd_ecalloc(unsigned int nmemb, size_t size MYSQLND_MEM_D) { void *ret; zend_bool collect_memory_statistics = MYSQLND_G(collect_memory_statistics); -#if PHP_DEBUG - zend_long * threshold = &MYSQLND_G(debug_ecalloc_fail_threshold); - TRACE_ALLOC_ENTER(mysqlnd_ecalloc_name); - - { - char * fn = strrchr(__zend_filename, PHP_DIR_SEPARATOR); - TRACE_ALLOC_INF_FMT("file=%-15s line=%4d", fn? fn + 1:__zend_filename, __zend_lineno); - } - TRACE_ALLOC_INF_FMT("before: %lu", zend_memory_usage(FALSE)); - - if (*threshold == 0) { - ret = NULL; - } else { - ret = ecalloc_rel(nmemb, REAL_SIZE(size)); - --*threshold; - } -#else TRACE_ALLOC_ENTER(mysqlnd_ecalloc_name); TRACE_ALLOC_INF_FMT("before: %lu", zend_memory_usage(FALSE)); ret = ecalloc_rel(nmemb, REAL_SIZE(size)); -#endif TRACE_ALLOC_INF_FMT("after : %lu", zend_memory_usage(FALSE)); TRACE_ALLOC_INF_FMT("size=%lu ptr=%p", size, ret); - if (ret && collect_memory_statistics) { + if (collect_memory_statistics) { *(size_t *) ret = size; MYSQLND_INC_GLOBAL_STATISTIC_W_VALUE2(STAT_MEM_ECALLOC_COUNT, 1, STAT_MEM_ECALLOC_AMOUNT, size); } @@ -191,28 +139,12 @@ static void * _mysqlnd_pecalloc(unsigned int nmemb, size_t size, zend_bool persi { void *ret; zend_bool collect_memory_statistics = MYSQLND_G(collect_memory_statistics); -#if PHP_DEBUG - zend_long * threshold = persistent? &MYSQLND_G(debug_calloc_fail_threshold):&MYSQLND_G(debug_ecalloc_fail_threshold); - TRACE_ALLOC_ENTER(mysqlnd_pecalloc_name); - { - char * fn = strrchr(__zend_filename, PHP_DIR_SEPARATOR); - TRACE_ALLOC_INF_FMT("file=%-15s line=%4d", fn? fn + 1:__zend_filename, __zend_lineno); - } - - if (*threshold == 0) { - ret = NULL; - } else { - ret = pecalloc_rel(nmemb, REAL_SIZE(size), persistent); - --*threshold; - } -#else TRACE_ALLOC_ENTER(mysqlnd_pecalloc_name); ret = pecalloc_rel(nmemb, REAL_SIZE(size), persistent); -#endif TRACE_ALLOC_INF_FMT("size=%lu ptr=%p", size, ret); - if (ret && collect_memory_statistics) { + if (collect_memory_statistics) { enum mysqlnd_collected_stats s1 = persistent? STAT_MEM_CALLOC_COUNT:STAT_MEM_ECALLOC_COUNT; enum mysqlnd_collected_stats s2 = persistent? STAT_MEM_CALLOC_AMOUNT:STAT_MEM_ECALLOC_AMOUNT; *(size_t *) ret = size; @@ -230,30 +162,12 @@ static void * _mysqlnd_erealloc(void *ptr, size_t new_size MYSQLND_MEM_D) void *ret; zend_bool collect_memory_statistics = MYSQLND_G(collect_memory_statistics); size_t old_size = collect_memory_statistics && ptr? *(size_t *) (((char*)ptr) - sizeof(size_t)) : 0; -#if PHP_DEBUG - zend_long * threshold = &MYSQLND_G(debug_erealloc_fail_threshold); - TRACE_ALLOC_ENTER(mysqlnd_erealloc_name); - - { - char * fn = strrchr(__zend_filename, PHP_DIR_SEPARATOR); - TRACE_ALLOC_INF_FMT("file=%-15s line=%4d", fn? fn + 1:__zend_filename, __zend_lineno); - } - TRACE_ALLOC_INF_FMT("ptr=%p old_size=%lu, new_size=%lu", ptr, old_size, new_size); - - if (*threshold == 0) { - ret = NULL; - } else { - ret = erealloc_rel(REAL_PTR(ptr), REAL_SIZE(new_size)); - --*threshold; - } -#else TRACE_ALLOC_ENTER(mysqlnd_erealloc_name); TRACE_ALLOC_INF_FMT("ptr=%p old_size=%lu, new_size=%lu", ptr, old_size, new_size); ret = erealloc_rel(REAL_PTR(ptr), REAL_SIZE(new_size)); -#endif TRACE_ALLOC_INF_FMT("new_ptr=%p", (char*)ret); - if (ret && collect_memory_statistics) { + if (collect_memory_statistics) { *(size_t *) ret = new_size; MYSQLND_INC_GLOBAL_STATISTIC_W_VALUE2(STAT_MEM_EREALLOC_COUNT, 1, STAT_MEM_EREALLOC_AMOUNT, new_size); } @@ -268,31 +182,13 @@ static void * _mysqlnd_perealloc(void *ptr, size_t new_size, zend_bool persisten void *ret; zend_bool collect_memory_statistics = MYSQLND_G(collect_memory_statistics); size_t old_size = collect_memory_statistics && ptr? *(size_t *) (((char*)ptr) - sizeof(size_t)) : 0; -#if PHP_DEBUG - zend_long * threshold = persistent? &MYSQLND_G(debug_realloc_fail_threshold):&MYSQLND_G(debug_erealloc_fail_threshold); - TRACE_ALLOC_ENTER(mysqlnd_perealloc_name); - - { - char * fn = strrchr(__zend_filename, PHP_DIR_SEPARATOR); - TRACE_ALLOC_INF_FMT("file=%-15s line=%4d", fn? fn + 1:__zend_filename, __zend_lineno); - } - TRACE_ALLOC_INF_FMT("ptr=%p old_size=%lu new_size=%lu persistent=%u", ptr, old_size, new_size, persistent); - - if (*threshold == 0) { - ret = NULL; - } else { - ret = perealloc_rel(REAL_PTR(ptr), REAL_SIZE(new_size), persistent); - --*threshold; - } -#else TRACE_ALLOC_ENTER(mysqlnd_perealloc_name); TRACE_ALLOC_INF_FMT("ptr=%p old_size=%lu new_size=%lu persistent=%u", ptr, old_size, new_size, persistent); ret = perealloc_rel(REAL_PTR(ptr), REAL_SIZE(new_size), persistent); -#endif TRACE_ALLOC_INF_FMT("new_ptr=%p", (char*)ret); - if (ret && collect_memory_statistics) { + if (collect_memory_statistics) { enum mysqlnd_collected_stats s1 = persistent? STAT_MEM_REALLOC_COUNT:STAT_MEM_EREALLOC_COUNT; enum mysqlnd_collected_stats s2 = persistent? STAT_MEM_REALLOC_AMOUNT:STAT_MEM_EREALLOC_AMOUNT; *(size_t *) ret = new_size; diff --git a/ext/mysqlnd/mysqlnd_auth.c b/ext/mysqlnd/mysqlnd_auth.c index 81700ca86b2bd..e3a21dfae6abd 100644 --- a/ext/mysqlnd/mysqlnd_auth.c +++ b/ext/mysqlnd/mysqlnd_auth.c @@ -103,10 +103,6 @@ mysqlnd_run_authentication( } conn->authentication_plugin_data.l = plugin_data_len; conn->authentication_plugin_data.s = mnd_pemalloc(conn->authentication_plugin_data.l, conn->persistent); - if (!conn->authentication_plugin_data.s) { - SET_OOM_ERROR(conn->error_info); - goto end; - } memcpy(conn->authentication_plugin_data.s, plugin_data, plugin_data_len); DBG_INF_FMT("salt(%d)=[%.*s]", plugin_data_len, plugin_data_len, plugin_data); diff --git a/ext/mysqlnd/mysqlnd_commands.c b/ext/mysqlnd/mysqlnd_commands.c index 953c3a2fcd836..57ac24b8c5eb1 100644 --- a/ext/mysqlnd/mysqlnd_commands.c +++ b/ext/mysqlnd/mysqlnd_commands.c @@ -112,11 +112,6 @@ MYSQLND_METHOD(mysqlnd_command, init_db)(MYSQLND_CONN_DATA * const conn, const M } conn->connect_or_select_db.s = mnd_pestrndup(db.s, db.l, conn->persistent); conn->connect_or_select_db.l = db.l; - if (!conn->connect_or_select_db.s) { - /* OOM */ - SET_OOM_ERROR(conn->error_info); - ret = FAIL; - } } DBG_RETURN(ret); diff --git a/ext/mysqlnd/mysqlnd_connection.c b/ext/mysqlnd/mysqlnd_connection.c index 35cc3f55fc0ac..4d25488ee6c2b 100644 --- a/ext/mysqlnd/mysqlnd_connection.c +++ b/ext/mysqlnd/mysqlnd_connection.c @@ -146,7 +146,7 @@ MYSQLND_CLASS_METHODS_END; /* {{{ mysqlnd_error_info_init */ -PHPAPI enum_func_status +PHPAPI void mysqlnd_error_info_init(MYSQLND_ERROR_INFO * const info, const zend_bool persistent) { DBG_ENTER("mysqlnd_error_info_init"); @@ -155,7 +155,7 @@ mysqlnd_error_info_init(MYSQLND_ERROR_INFO * const info, const zend_bool persist zend_llist_init(&info->error_list, sizeof(MYSQLND_ERROR_LIST_ELEMENT), (llist_dtor_func_t) mysqlnd_error_list_pdtor, persistent); info->persistent = persistent; - DBG_RETURN(PASS); + DBG_VOID_RETURN; } /* }}} */ @@ -454,12 +454,14 @@ MYSQLND_METHOD(mysqlnd_conn_data, execute_init_commands)(MYSQLND_CONN_DATA * con ret = FAIL; break; } - if (conn->last_query_type == QUERY_SELECT) { - MYSQLND_RES * result = conn->m->use_result(conn, 0); - if (result) { - result->m.free_result(result, TRUE); + do { + if (conn->last_query_type == QUERY_SELECT) { + MYSQLND_RES * result = conn->m->use_result(conn); + if (result) { + result->m.free_result(result, TRUE); + } } - } + } while (conn->m->next_result(conn) != FAIL); } } } @@ -707,17 +709,8 @@ MYSQLND_METHOD(mysqlnd_conn_data, connect)(MYSQLND_CONN_DATA * conn, conn->connect_or_select_db.l = database.l; conn->connect_or_select_db.s = mnd_pestrndup(database.s, conn->connect_or_select_db.l, conn->persistent); - if (!conn->username.s || !conn->password.s|| !conn->connect_or_select_db.s) { - SET_OOM_ERROR(conn->error_info); - goto err; /* OOM */ - } - if (!unix_socket && !named_pipe) { conn->hostname.s = mnd_pestrndup(hostname.s, hostname.l, conn->persistent); - if (!conn->hostname.s) { - SET_OOM_ERROR(conn->error_info); - goto err; /* OOM */ - } conn->hostname.l = hostname.l; { char *p; @@ -728,10 +721,6 @@ MYSQLND_METHOD(mysqlnd_conn_data, connect)(MYSQLND_CONN_DATA * conn, } conn->host_info = mnd_pestrdup(p, conn->persistent); mnd_sprintf_free(p); - if (!conn->host_info) { - SET_OOM_ERROR(conn->error_info); - goto err; /* OOM */ - } } } else { conn->unix_socket.s = mnd_pestrdup(socket_or_pipe.s, conn->persistent); @@ -744,12 +733,8 @@ MYSQLND_METHOD(mysqlnd_conn_data, connect)(MYSQLND_CONN_DATA * conn, SET_OOM_ERROR(conn->error_info); goto err; /* OOM */ } - conn->host_info = mnd_pestrdup(p, conn->persistent); + conn->host_info = mnd_pestrdup(p, conn->persistent); mnd_sprintf_free(p); - if (!conn->host_info) { - SET_OOM_ERROR(conn->error_info); - goto err; /* OOM */ - } } else { php_error_docref(NULL, E_WARNING, "Impossible. Should be either socket or a pipe. Report a bug!"); } @@ -943,7 +928,7 @@ MYSQLND_METHOD(mysqlnd_conn_data, list_method)(MYSQLND_CONN_DATA * conn, const c } if (PASS == conn->m->query(conn, show_query, show_query_len)) { - result = conn->m->store_result(conn, MYSQLND_STORE_NO_COPY); + result = conn->m->store_result(conn); } if (show_query != query) { mnd_sprintf_free(show_query); @@ -1651,11 +1636,9 @@ MYSQLND_METHOD(mysqlnd_conn_data, set_client_option)(MYSQLND_CONN_DATA * const c case MYSQL_SERVER_PUBLIC_KEY: ret = conn->protocol_frame_codec->data->m.set_client_option(conn->protocol_frame_codec, option, value); break; -#ifdef MYSQLND_STRING_TO_INT_CONVERSION case MYSQLND_OPT_INT_AND_FLOAT_NATIVE: conn->options->int_and_float_native = *(unsigned int*) value; break; -#endif case MYSQL_OPT_LOCAL_INFILE: if (value && (*(unsigned int*) value) ? 1 : 0) { conn->options->flags |= CLIENT_LOCAL_FILES; @@ -1670,14 +1653,8 @@ MYSQLND_METHOD(mysqlnd_conn_data, set_client_option)(MYSQLND_CONN_DATA * const c /* when num_commands is 0, then realloc will be effectively a malloc call, internally */ /* Don't assign to conn->options->init_commands because in case of OOM we will lose the pointer and leak */ new_init_commands = mnd_perealloc(conn->options->init_commands, sizeof(char *) * (conn->options->num_commands + 1), conn->persistent); - if (!new_init_commands) { - goto oom; - } conn->options->init_commands = new_init_commands; new_command = mnd_pestrdup(value, conn->persistent); - if (!new_command) { - goto oom; - } conn->options->init_commands[conn->options->num_commands] = new_command; ++conn->options->num_commands; break; @@ -1700,9 +1677,6 @@ MYSQLND_METHOD(mysqlnd_conn_data, set_client_option)(MYSQLND_CONN_DATA * const c } new_charset_name = mnd_pestrdup(value, conn->persistent); - if (!new_charset_name) { - goto oom; - } if (conn->options->charset_name) { mnd_pefree(conn->options->charset_name, conn->persistent); } @@ -1738,9 +1712,6 @@ MYSQLND_METHOD(mysqlnd_conn_data, set_client_option)(MYSQLND_CONN_DATA * const c case MYSQLND_OPT_AUTH_PROTOCOL: { char * new_auth_protocol = value? mnd_pestrdup(value, conn->persistent) : NULL; - if (value && !new_auth_protocol) { - goto oom; - } if (conn->options->auth_protocol) { mnd_pefree(conn->options->auth_protocol, conn->persistent); } @@ -1779,9 +1750,6 @@ MYSQLND_METHOD(mysqlnd_conn_data, set_client_option)(MYSQLND_CONN_DATA * const c } conn->m->local_tx_end(conn, this_func, ret); DBG_RETURN(ret); -oom: - SET_OOM_ERROR(conn->error_info); - conn->m->local_tx_end(conn, this_func, FAIL); end: DBG_RETURN(FAIL); } @@ -1809,9 +1777,6 @@ MYSQLND_METHOD(mysqlnd_conn_data, set_client_option_2d)(MYSQLND_CONN_DATA * cons if (!conn->options->connect_attr) { DBG_INF("Initializing connect_attr hash"); conn->options->connect_attr = mnd_pemalloc(sizeof(HashTable), conn->persistent); - if (!conn->options->connect_attr) { - goto oom; - } zend_hash_init(conn->options->connect_attr, 0, NULL, conn->persistent ? ZVAL_INTERNAL_PTR_DTOR : ZVAL_PTR_DTOR, conn->persistent); } DBG_INF_FMT("Adding [%s][%s]", key, value); @@ -1837,9 +1802,6 @@ MYSQLND_METHOD(mysqlnd_conn_data, set_client_option_2d)(MYSQLND_CONN_DATA * cons } conn->m->local_tx_end(conn, this_func, ret); DBG_RETURN(ret); -oom: - SET_OOM_ERROR(conn->error_info); - conn->m->local_tx_end(conn, this_func, FAIL); end: DBG_RETURN(FAIL); } @@ -1848,7 +1810,7 @@ MYSQLND_METHOD(mysqlnd_conn_data, set_client_option_2d)(MYSQLND_CONN_DATA * cons /* {{{ mysqlnd_conn_data::use_result */ static MYSQLND_RES * -MYSQLND_METHOD(mysqlnd_conn_data, use_result)(MYSQLND_CONN_DATA * const conn, const unsigned int flags) +MYSQLND_METHOD(mysqlnd_conn_data, use_result)(MYSQLND_CONN_DATA * const conn) { const size_t this_func = STRUCT_OFFSET(MYSQLND_CLASS_METHODS_TYPE(mysqlnd_conn_data), use_result); MYSQLND_RES * result = NULL; @@ -1890,7 +1852,7 @@ MYSQLND_METHOD(mysqlnd_conn_data, use_result)(MYSQLND_CONN_DATA * const conn, co /* {{{ mysqlnd_conn_data::store_result */ static MYSQLND_RES * -MYSQLND_METHOD(mysqlnd_conn_data, store_result)(MYSQLND_CONN_DATA * const conn, const unsigned int flags) +MYSQLND_METHOD(mysqlnd_conn_data, store_result)(MYSQLND_CONN_DATA * const conn) { const size_t this_func = STRUCT_OFFSET(MYSQLND_CLASS_METHODS_TYPE(mysqlnd_conn_data), store_result); MYSQLND_RES * result = NULL; @@ -1900,7 +1862,6 @@ MYSQLND_METHOD(mysqlnd_conn_data, store_result)(MYSQLND_CONN_DATA * const conn, if (PASS == conn->m->local_tx_start(conn, this_func)) { do { - unsigned int f = flags; if (!conn->current_result) { break; } @@ -1913,25 +1874,7 @@ MYSQLND_METHOD(mysqlnd_conn_data, store_result)(MYSQLND_CONN_DATA * const conn, } MYSQLND_INC_CONN_STATISTIC(conn->stats, STAT_BUFFERED_SETS); - - /* overwrite */ - if ((conn->m->get_client_api_capabilities(conn) & MYSQLND_CLIENT_KNOWS_RSET_COPY_DATA)) { - if (MYSQLND_G(fetch_data_copy)) { - f &= ~MYSQLND_STORE_NO_COPY; - f |= MYSQLND_STORE_COPY; - } - } else { - /* if for some reason PDO borks something */ - if (!(f & (MYSQLND_STORE_NO_COPY | MYSQLND_STORE_COPY))) { - f |= MYSQLND_STORE_COPY; - } - } - if (!(f & (MYSQLND_STORE_NO_COPY | MYSQLND_STORE_COPY))) { - SET_CLIENT_ERROR(conn->error_info, CR_UNKNOWN_ERROR, UNKNOWN_SQLSTATE, "Unknown fetch mode"); - DBG_ERR("Unknown fetch mode"); - break; - } - result = conn->current_result->m.store_result(conn->current_result, conn, f); + result = conn->current_result->m.store_result(conn->current_result, conn, NULL); if (!result) { conn->current_result->m.free_result(conn->current_result, TRUE); } diff --git a/ext/mysqlnd/mysqlnd_connection.h b/ext/mysqlnd/mysqlnd_connection.h index 795ec3c5ea392..412913e6a74a0 100644 --- a/ext/mysqlnd/mysqlnd_connection.h +++ b/ext/mysqlnd/mysqlnd_connection.h @@ -65,7 +65,7 @@ void mysqlnd_upsert_status_init(MYSQLND_UPSERT_STATUS * const upsert_status); } -PHPAPI enum_func_status mysqlnd_error_info_init(MYSQLND_ERROR_INFO * const info, const zend_bool persistent); +PHPAPI void mysqlnd_error_info_init(MYSQLND_ERROR_INFO * const info, const zend_bool persistent); PHPAPI void mysqlnd_error_info_free_contents(MYSQLND_ERROR_INFO * const info); #define GET_CONNECTION_STATE(state_struct) (state_struct)->m->get((state_struct)) diff --git a/ext/mysqlnd/mysqlnd_driver.c b/ext/mysqlnd/mysqlnd_driver.c index 4762d4e720dde..d5e2dc7cd610c 100644 --- a/ext/mysqlnd/mysqlnd_driver.c +++ b/ext/mysqlnd/mysqlnd_driver.c @@ -116,10 +116,7 @@ MYSQLND_METHOD(mysqlnd_object_factory, get_connection)(MYSQLND_CLASS_METHODS_TYP new_object->m = mysqlnd_conn_get_methods(); data = new_object->data; - if (FAIL == mysqlnd_error_info_init(&data->error_info_impl, persistent)) { - new_object->m->dtor(new_object); - DBG_RETURN(NULL); - } + mysqlnd_error_info_init(&data->error_info_impl, persistent); data->error_info = &data->error_info_impl; data->options = &(data->options_impl); @@ -191,50 +188,29 @@ MYSQLND_METHOD(mysqlnd_object_factory, get_prepared_statement)(MYSQLND_CONN_DATA MYSQLND_STMT_DATA * stmt = NULL; DBG_ENTER("mysqlnd_object_factory::get_prepared_statement"); - do { - if (!ret) { - break; - } - ret->m = mysqlnd_stmt_get_methods(); + ret->m = mysqlnd_stmt_get_methods(); - stmt = ret->data = mnd_ecalloc(1, sizeof(MYSQLND_STMT_DATA)); - DBG_INF_FMT("stmt=%p", stmt); - if (!stmt) { - break; - } + stmt = ret->data = mnd_ecalloc(1, sizeof(MYSQLND_STMT_DATA)); + DBG_INF_FMT("stmt=%p", stmt); - if (FAIL == mysqlnd_error_info_init(&stmt->error_info_impl, 0)) { - break; - } - stmt->error_info = &stmt->error_info_impl; - - mysqlnd_upsert_status_init(&stmt->upsert_status_impl); - stmt->upsert_status = &(stmt->upsert_status_impl); - stmt->state = MYSQLND_STMT_INITTED; - stmt->execute_cmd_buffer.length = 4096; - stmt->execute_cmd_buffer.buffer = mnd_emalloc(stmt->execute_cmd_buffer.length); - if (!stmt->execute_cmd_buffer.buffer) { - break; - } - - stmt->prefetch_rows = MYSQLND_DEFAULT_PREFETCH_ROWS; + mysqlnd_error_info_init(&stmt->error_info_impl, 0); + stmt->error_info = &stmt->error_info_impl; - /* - Mark that we reference the connection, thus it won't be - be destructed till there is open statements. The last statement - or normal query result will close it then. - */ - stmt->conn = conn->m->get_reference(conn); + mysqlnd_upsert_status_init(&stmt->upsert_status_impl); + stmt->upsert_status = &(stmt->upsert_status_impl); + stmt->state = MYSQLND_STMT_INITTED; + stmt->execute_cmd_buffer.length = 4096; + stmt->execute_cmd_buffer.buffer = mnd_emalloc(stmt->execute_cmd_buffer.length); + stmt->prefetch_rows = MYSQLND_DEFAULT_PREFETCH_ROWS; - DBG_RETURN(ret); - } while (0); + /* + Mark that we reference the connection, thus it won't be + be destructed till there is open statements. The last statement + or normal query result will close it then. + */ + stmt->conn = conn->m->get_reference(conn); - SET_OOM_ERROR(conn->error_info); - if (ret) { - ret->m->dtor(ret, TRUE); - ret = NULL; - } - DBG_RETURN(NULL); + DBG_RETURN(ret); } /* }}} */ diff --git a/ext/mysqlnd/mysqlnd_enum_n_def.h b/ext/mysqlnd/mysqlnd_enum_n_def.h index 955eccac0e851..6d6cefbb46624 100644 --- a/ext/mysqlnd/mysqlnd_enum_n_def.h +++ b/ext/mysqlnd/mysqlnd_enum_n_def.h @@ -148,12 +148,6 @@ #define TRANS_COR_RELEASE 4 #define TRANS_COR_NO_RELEASE 8 -typedef enum mysqlnd_extension -{ - MYSQLND_MYSQL = 0, - MYSQLND_MYSQLI -} enum_mysqlnd_extension; - enum { MYSQLND_FETCH_ASSOC = 1, @@ -254,9 +248,7 @@ typedef enum mysqlnd_client_option MYSQL_OPT_TLS_VERSION, MYSQL_OPT_SSL_MODE, MYSQLND_DEPRECATED_ENUM1 = 200, -#ifdef MYSQLND_STRING_TO_INT_CONVERSION MYSQLND_OPT_INT_AND_FLOAT_NATIVE = 201, -#endif MYSQLND_OPT_NET_CMD_BUFFER_SIZE = 202, MYSQLND_OPT_NET_READ_BUFFER_SIZE = 203, MYSQLND_OPT_SSL_KEY = 204, @@ -694,18 +686,6 @@ enum php_mysqlnd_server_command #define MYSQLND_REFRESH_BACKUP_LOG 0x200000L -#define MYSQLND_STORE_PS 1 -#define MYSQLND_STORE_NO_COPY 2 -#define MYSQLND_STORE_COPY 4 - -enum mysqlnd_buffered_type -{ - MYSQLND_BUFFERED_TYPE_ZVAL = 1, - MYSQLND_BUFFERED_TYPE_C -}; - - #define MYSQLND_CLIENT_NO_FLAG 0 -#define MYSQLND_CLIENT_KNOWS_RSET_COPY_DATA 1 #endif /* MYSQLND_ENUM_N_DEF_H */ diff --git a/ext/mysqlnd/mysqlnd_ext_plugin.c b/ext/mysqlnd/mysqlnd_ext_plugin.c index 58a4ee767ecc6..cf28b81ea585c 100644 --- a/ext/mysqlnd/mysqlnd_ext_plugin.c +++ b/ext/mysqlnd/mysqlnd_ext_plugin.c @@ -83,30 +83,16 @@ mysqlnd_plugin__get_plugin_result_unbuffered_data(const MYSQLND_RES_UNBUFFERED * } /* }}} */ - -/* {{{ _mysqlnd_plugin__get_plugin_result_buffered_data */ -static void ** -mysqlnd_plugin__get_plugin_result_buffered_data_zval(const MYSQLND_RES_BUFFERED_ZVAL * result, const unsigned int plugin_id) -{ - DBG_ENTER("_mysqlnd_plugin__get_plugin_result_data"); - DBG_INF_FMT("plugin_id=%u", plugin_id); - if (!result || plugin_id >= mysqlnd_plugin_count()) { - return NULL; - } - DBG_RETURN((void *)((char *)result + sizeof(MYSQLND_RES_BUFFERED_ZVAL) + plugin_id * sizeof(void *))); -} -/* }}} */ - /* {{{ mysqlnd_plugin__get_plugin_result_buffered_data */ static void ** -mysqlnd_plugin__get_plugin_result_buffered_data_c(const MYSQLND_RES_BUFFERED_C * result, const unsigned int plugin_id) +mysqlnd_plugin__get_plugin_result_buffered_data(const MYSQLND_RES_BUFFERED * result, const unsigned int plugin_id) { DBG_ENTER("mysqlnd_plugin__get_plugin_result_data"); DBG_INF_FMT("plugin_id=%u", plugin_id); if (!result || plugin_id >= mysqlnd_plugin_count()) { return NULL; } - DBG_RETURN((void *)((char *)result + sizeof(MYSQLND_RES_BUFFERED_C) + plugin_id * sizeof(void *))); + DBG_RETURN((void *)((char *)result + sizeof(MYSQLND_RES_BUFFERED) + plugin_id * sizeof(void *))); } /* }}} */ @@ -172,8 +158,7 @@ struct st_mysqlnd_plugin__plugin_area_getters mysqlnd_plugin_area_getters = mysqlnd_plugin__get_plugin_connection_data_data, mysqlnd_plugin__get_plugin_result_data, mysqlnd_plugin__get_plugin_result_unbuffered_data, - mysqlnd_plugin__get_plugin_result_buffered_data_zval, - mysqlnd_plugin__get_plugin_result_buffered_data_c, + mysqlnd_plugin__get_plugin_result_buffered_data, mysqlnd_plugin__get_plugin_stmt_data, mysqlnd_plugin__get_plugin_protocol_data, mysqlnd_plugin__get_plugin_pfc_data, diff --git a/ext/mysqlnd/mysqlnd_ext_plugin.h b/ext/mysqlnd/mysqlnd_ext_plugin.h index 713eb1f44f3b5..027fda976aa25 100644 --- a/ext/mysqlnd/mysqlnd_ext_plugin.h +++ b/ext/mysqlnd/mysqlnd_ext_plugin.h @@ -25,8 +25,7 @@ struct st_mysqlnd_plugin__plugin_area_getters void ** (*get_connection_data_area)(const MYSQLND_CONN_DATA * conn, const unsigned int plugin_id); void ** (*get_result_area)(const MYSQLND_RES * result, const unsigned int plugin_id); void ** (*get_unbuffered_area)(const MYSQLND_RES_UNBUFFERED * result, const unsigned int plugin_id); - void ** (*get_result_buffered_area)(const MYSQLND_RES_BUFFERED_ZVAL * result, const unsigned int plugin_id); - void ** (*get_result_buffered_aread_c)(const MYSQLND_RES_BUFFERED_C * result, const unsigned int plugin_id); + void ** (*get_result_buffered_aread)(const MYSQLND_RES_BUFFERED * result, const unsigned int plugin_id); void ** (*get_stmt_area)(const MYSQLND_STMT * stmt, const unsigned int plugin_id); void ** (*get_protocol_decoder_area)(const MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * factory, const unsigned int plugin_id); void ** (*get_pfc_area)(const MYSQLND_PFC * pfc, const unsigned int plugin_id); @@ -39,8 +38,7 @@ PHPAPI extern struct st_mysqlnd_plugin__plugin_area_getters mysqlnd_plugin_area_ #define mysqlnd_plugin_get_plugin_connection_data_data(c, p_id) mysqlnd_plugin_area_getters.get_connection_data_area((c), (p_id)) #define mysqlnd_plugin_get_plugin_result_data(res, p_id) mysqlnd_plugin_area_getters.get_result_area((res), (p_id)) #define mysqlnd_plugin_get_plugin_result_unbuffered_data(res, p_id) mysqlnd_plugin_area_getters.get_unbuffered_area((res), (p_id)) -#define mysqlnd_plugin_get_plugin_result_buffered_data_zval(res, p_id) mysqlnd_plugin_area_getters.get_result_buffered_area((res), (p_id)) -#define mysqlnd_plugin_get_plugin_result_buffered_data_c(res, p_id) mysqlnd_plugin_area_getters.get_result_buffered_aread_c((res), (p_id)) +#define mysqlnd_plugin_get_plugin_result_buffered_data_c(res, p_id) mysqlnd_plugin_area_getters.get_result_buffered_aread((res), (p_id)) #define mysqlnd_plugin_get_plugin_stmt_data(stmt, p_id) mysqlnd_plugin_area_getters.get_stmt_area((stmt), (p_id)) #define mysqlnd_plugin_get_plugin_protocol_data(proto, p_id) mysqlnd_plugin_area_getters.get_protocol_decoder_area((proto), (p_id)) #define mysqlnd_plugin_get_plugin_pfc_data(pfc, p_id) mysqlnd_plugin_area_getters.get_pfc_area((pfc), (p_id)) diff --git a/ext/mysqlnd/mysqlnd_libmysql_compat.h b/ext/mysqlnd/mysqlnd_libmysql_compat.h index df4b96eec32f5..092659e9dd19a 100644 --- a/ext/mysqlnd/mysqlnd_libmysql_compat.h +++ b/ext/mysqlnd/mysqlnd_libmysql_compat.h @@ -80,7 +80,7 @@ #define mysql_stmt_param_count(s) mysqlnd_stmt_param_count((s)) #define mysql_stmt_num_rows(s) mysqlnd_stmt_num_rows((s)) #define mysql_stmt_insert_id(s) mysqlnd_stmt_insert_id((s)) -#define mysql_stmt_close(s) mysqlnd_stmt_close((s)) +#define mysql_stmt_close(s) mysqlnd_stmt_close((s), 0) #define mysql_stmt_bind_param(s,b) mysqlnd_stmt_bind_param((s), (b)) #define mysql_stmt_bind_result(s,b) mysqlnd_stmt_bind_result((s), (b)) #define mysql_stmt_errno(s) mysqlnd_stmt_errno((s)) diff --git a/ext/mysqlnd/mysqlnd_ps.c b/ext/mysqlnd/mysqlnd_ps.c index 55da87fdf0b60..7811f51832054 100644 --- a/ext/mysqlnd/mysqlnd_ps.c +++ b/ext/mysqlnd/mysqlnd_ps.c @@ -36,7 +36,6 @@ enum_func_status mysqlnd_stmt_execute_generate_request(MYSQLND_STMT * const s, z enum_func_status mysqlnd_stmt_execute_batch_generate_request(MYSQLND_STMT * const s, zend_uchar ** request, size_t *request_len, zend_bool * free_buffer); static void mysqlnd_stmt_separate_result_bind(MYSQLND_STMT * const stmt); -static void mysqlnd_stmt_separate_one_result_bind(MYSQLND_STMT * const stmt, const unsigned int param_no); /* {{{ mysqlnd_stmt::store_result */ static MYSQLND_RES * @@ -80,7 +79,7 @@ MYSQLND_METHOD(mysqlnd_stmt, store_result)(MYSQLND_STMT * const s) result->type = MYSQLND_RES_PS_BUF; /* result->m.row_decoder = php_mysqlnd_rowp_read_binary_protocol; */ - result->stored_data = (MYSQLND_RES_BUFFERED *) mysqlnd_result_buffered_zval_init(result, result->field_count, TRUE); + result->stored_data = mysqlnd_result_buffered_init(result, result->field_count, stmt); if (!result->stored_data) { SET_OOM_ERROR(conn->error_info); DBG_RETURN(NULL); @@ -88,30 +87,8 @@ MYSQLND_METHOD(mysqlnd_stmt, store_result)(MYSQLND_STMT * const s) ret = result->m.store_result_fetch_data(conn, result, result->meta, &result->stored_data->row_buffers, TRUE); - result->stored_data->m.fetch_row = mysqlnd_stmt_fetch_row_buffered; - if (PASS == ret) { - if (result->stored_data->type == MYSQLND_BUFFERED_TYPE_ZVAL) { - MYSQLND_RES_BUFFERED_ZVAL * set = (MYSQLND_RES_BUFFERED_ZVAL *) result->stored_data; - if (result->stored_data->row_count) { - /* don't try to allocate more than possible - mnd_XXalloc expects size_t, and it can have narrower range than uint64_t */ - if (result->stored_data->row_count * result->meta->field_count * sizeof(zval *) > SIZE_MAX) { - SET_OOM_ERROR(conn->error_info); - DBG_RETURN(NULL); - } - /* if pecalloc is used valgrind barks gcc version 4.3.1 20080507 (prerelease) [gcc-4_3-branch revision 135036] (SUSE Linux) */ - set->data = mnd_emalloc((size_t)(result->stored_data->row_count * result->meta->field_count * sizeof(zval))); - if (!set->data) { - SET_OOM_ERROR(conn->error_info); - DBG_RETURN(NULL); - } - memset(set->data, 0, (size_t)(result->stored_data->row_count * result->meta->field_count * sizeof(zval))); - } - /* Position at the first row */ - set->data_cursor = set->data; - } else if (result->stored_data->type == MYSQLND_BUFFERED_TYPE_C) { - /*TODO*/ - } + result->stored_data->current_row = 0; /* libmysql API docs say it should be so for SELECT statements */ UPSERT_STATUS_SET_AFFECTED_ROWS(stmt->upsert_status, stmt->result->stored_data->row_count); @@ -184,7 +161,7 @@ MYSQLND_METHOD(mysqlnd_stmt, get_result)(MYSQLND_STMT * const s) break; } - if (result->m.store_result(result, conn, MYSQLND_STORE_PS | MYSQLND_STORE_NO_COPY)) { + if (result->m.store_result(result, conn, stmt)) { UPSERT_STATUS_SET_AFFECTED_ROWS(stmt->upsert_status, result->stored_data->row_count); stmt->state = MYSQLND_STMT_PREPARED; result->type = MYSQLND_RES_PS_BUF; @@ -542,13 +519,28 @@ mysqlnd_stmt_execute_parse_response(MYSQLND_STMT * const s, enum_mysqlnd_parse_e stmt->result->conn = conn->m->get_reference(conn); } - /* Update stmt->field_count as SHOW sets it to 0 at prepare */ - stmt->field_count = stmt->result->field_count = conn->field_count; - if (stmt->result->stored_data) { - stmt->result->stored_data->lengths = NULL; - } else if (stmt->result->unbuf) { - stmt->result->unbuf->lengths = NULL; + /* If the field count changed, update the result_bind structure. Ideally result_bind + * would only ever be created after execute, in which case the size cannot change anymore, + * but at least in mysqli this does not seem enforceable. */ + if (stmt->result_bind && conn->field_count != stmt->field_count) { + if (conn->field_count < stmt->field_count) { + /* Number of columns decreased, free bindings. */ + for (unsigned i = conn->field_count; i < stmt->field_count; i++) { + zval_ptr_dtor(&stmt->result_bind[i].zv); + } + } + stmt->result_bind = + mnd_erealloc(stmt->result_bind, conn->field_count * sizeof(MYSQLND_RESULT_BIND)); + if (conn->field_count > stmt->field_count) { + /* Number of columns increase, initialize new ones. */ + for (unsigned i = stmt->field_count; i < conn->field_count; i++) { + ZVAL_UNDEF(&stmt->result_bind[i].zv); + stmt->result_bind[i].bound = false; + } + } } + + stmt->field_count = stmt->result->field_count = conn->field_count; if (stmt->field_count) { stmt->state = MYSQLND_STMT_WAITING_USE_OR_STORE; /* @@ -712,218 +704,6 @@ MYSQLND_METHOD(mysqlnd_stmt, send_execute)(MYSQLND_STMT * const s, const enum_my /* }}} */ -/* {{{ mysqlnd_stmt_fetch_row_buffered */ -enum_func_status -mysqlnd_stmt_fetch_row_buffered(MYSQLND_RES * result, void * param, const unsigned int flags, zend_bool * fetched_anything) -{ - MYSQLND_STMT * s = (MYSQLND_STMT *) param; - MYSQLND_STMT_DATA * stmt = s? s->data : NULL; - const MYSQLND_RES_METADATA * const meta = result->meta; - unsigned int field_count = meta->field_count; - - DBG_ENTER("mysqlnd_stmt_fetch_row_buffered"); - *fetched_anything = FALSE; - DBG_INF_FMT("stmt=%lu", stmt != NULL ? stmt->stmt_id : 0L); - - /* If we haven't read everything */ - if (result->stored_data->type == MYSQLND_BUFFERED_TYPE_ZVAL) { - MYSQLND_RES_BUFFERED_ZVAL * set = (MYSQLND_RES_BUFFERED_ZVAL *) result->stored_data; - if (set->data_cursor && - (set->data_cursor - set->data) < (result->stored_data->row_count * field_count)) - { - /* The user could have skipped binding - don't crash*/ - if (stmt->result_bind) { - unsigned int i; - zval *current_row = set->data_cursor; - - if (Z_ISUNDEF(current_row[0])) { - uint64_t row_num = (set->data_cursor - set->data) / field_count; - enum_func_status rc = result->stored_data->m.row_decoder(&result->stored_data->row_buffers[row_num], - current_row, - meta->field_count, - meta->fields, - result->conn->options->int_and_float_native, - result->conn->stats); - if (PASS != rc) { - DBG_RETURN(FAIL); - } - result->stored_data->initialized_rows++; - if (stmt->update_max_length) { - for (i = 0; i < result->field_count; i++) { - /* - NULL fields are 0 length, 0 is not more than 0 - String of zero size, definitely can't be the next max_length. - Thus for NULL and zero-length we are quite efficient. - */ - if (Z_TYPE(current_row[i]) == IS_STRING) { - zend_ulong len = Z_STRLEN(current_row[i]); - if (meta->fields[i].max_length < len) { - meta->fields[i].max_length = len; - } - } - } - } - } - - for (i = 0; i < result->field_count; i++) { - /* copy the type */ - zval *resultzv = &stmt->result_bind[i].zv; - if (stmt->result_bind[i].bound == TRUE) { - DBG_INF_FMT("i=%u type=%u", i, Z_TYPE(current_row[i])); - ZEND_TRY_ASSIGN_COPY_EX(resultzv, ¤t_row[i], 0); - } - } - } - set->data_cursor += field_count; - *fetched_anything = TRUE; - /* buffered result sets don't have a connection */ - MYSQLND_INC_GLOBAL_STATISTIC(STAT_ROWS_FETCHED_FROM_CLIENT_PS_BUF); - DBG_INF("row fetched"); - } else { - set->data_cursor = NULL; - DBG_INF("no more data"); - } - } else if (result->stored_data->type == MYSQLND_BUFFERED_TYPE_C) { - /*TODO*/ - } - DBG_INF("PASS"); - DBG_RETURN(PASS); -} -/* }}} */ - - -/* {{{ mysqlnd_stmt_fetch_row_unbuffered */ -enum_func_status -mysqlnd_stmt_fetch_row_unbuffered(MYSQLND_RES * result, void * param, const unsigned int flags, zend_bool * fetched_anything) -{ - enum_func_status ret; - MYSQLND_STMT * s = (MYSQLND_STMT *) param; - MYSQLND_STMT_DATA * stmt = s? s->data : NULL; - MYSQLND_PACKET_ROW * row_packet; - MYSQLND_CONN_DATA * conn = result->conn; - const MYSQLND_RES_METADATA * const meta = result->meta; - void *checkpoint; - - DBG_ENTER("mysqlnd_stmt_fetch_row_unbuffered"); - - *fetched_anything = FALSE; - - if (result->unbuf->eof_reached) { - /* No more rows obviously */ - DBG_INF("EOF already reached"); - DBG_RETURN(PASS); - } - if (GET_CONNECTION_STATE(&conn->state) != CONN_FETCHING_DATA) { - SET_CLIENT_ERROR(conn->error_info, CR_COMMANDS_OUT_OF_SYNC, UNKNOWN_SQLSTATE, mysqlnd_out_of_sync); - DBG_ERR("command out of sync"); - DBG_RETURN(FAIL); - } - if (!(row_packet = result->unbuf->row_packet)) { - DBG_RETURN(FAIL); - } - - /* Let the row packet fill our buffer and skip additional malloc + memcpy */ - row_packet->skip_extraction = stmt && stmt->result_bind? FALSE:TRUE; - - checkpoint = result->memory_pool->checkpoint; - mysqlnd_mempool_save_state(result->memory_pool); - - /* - If we skip rows (stmt == NULL || stmt->result_bind == NULL) we have to - result->unbuf->m.free_last_data() before it. The function returns always true. - */ - if (PASS == (ret = PACKET_READ(conn, row_packet)) && !row_packet->eof) { - unsigned int i, field_count = result->field_count; - - if (!row_packet->skip_extraction) { - result->unbuf->m.free_last_data(result->unbuf, conn->stats); - - result->unbuf->last_row_data = row_packet->fields; - result->unbuf->last_row_buffer = row_packet->row_buffer; - row_packet->fields = NULL; - row_packet->row_buffer.ptr = NULL; - - if (PASS != result->unbuf->m.row_decoder(&result->unbuf->last_row_buffer, - result->unbuf->last_row_data, - row_packet->field_count, - row_packet->fields_metadata, - conn->options->int_and_float_native, - conn->stats)) - { - mysqlnd_mempool_restore_state(result->memory_pool); - result->memory_pool->checkpoint = checkpoint; - DBG_RETURN(FAIL); - } - - for (i = 0; i < field_count; i++) { - zval *resultzv = &stmt->result_bind[i].zv; - if (stmt->result_bind[i].bound == TRUE) { - zval *data = &result->unbuf->last_row_data[i]; - - if (Z_TYPE_P(data) == IS_STRING && (meta->fields[i].max_length < (zend_ulong) Z_STRLEN_P(data))){ - meta->fields[i].max_length = Z_STRLEN_P(data); - } - - ZEND_TRY_ASSIGN_VALUE_EX(resultzv, data, 0); - /* copied data, thus also the ownership. Thus null data */ - ZVAL_NULL(data); - } - } - MYSQLND_INC_CONN_STATISTIC(conn->stats, STAT_ROWS_FETCHED_FROM_CLIENT_PS_UNBUF); - } else { - DBG_INF("skipping extraction"); - /* - Data has been allocated and usually result->unbuf->m.free_last_data() - frees it but we can't call this function as it will cause problems with - the bound variables. Thus we need to do part of what it does or Zend will - report leaks. - */ - row_packet->result_set_memory_pool->free_chunk( - row_packet->result_set_memory_pool, row_packet->row_buffer.ptr); - row_packet->row_buffer.ptr = NULL; - } - - result->unbuf->row_count++; - *fetched_anything = TRUE; - } else if (ret == FAIL) { - if (row_packet->error_info.error_no) { - COPY_CLIENT_ERROR(conn->error_info, row_packet->error_info); - if (stmt) { - COPY_CLIENT_ERROR(stmt->error_info, row_packet->error_info); - } - } - if (GET_CONNECTION_STATE(&conn->state) != CONN_QUIT_SENT) { - SET_CONNECTION_STATE(&conn->state, CONN_READY); - } - result->unbuf->eof_reached = TRUE; /* so next time we won't get an error */ - } else if (row_packet->eof) { - DBG_INF("EOF"); - /* Mark the connection as usable again */ - result->unbuf->eof_reached = TRUE; - UPSERT_STATUS_RESET(conn->upsert_status); - UPSERT_STATUS_SET_WARNINGS(conn->upsert_status, row_packet->warning_count); - UPSERT_STATUS_SET_SERVER_STATUS(conn->upsert_status, row_packet->server_status); - - /* - result->row_packet will be cleaned when - destroying the result object - */ - if (UPSERT_STATUS_GET_SERVER_STATUS(conn->upsert_status) & SERVER_MORE_RESULTS_EXISTS) { - SET_CONNECTION_STATE(&conn->state, CONN_NEXT_RESULT_PENDING); - } else { - SET_CONNECTION_STATE(&conn->state, CONN_READY); - } - } - - mysqlnd_mempool_restore_state(result->memory_pool); - result->memory_pool->checkpoint = checkpoint; - - DBG_INF_FMT("ret=%s fetched_anything=%u", ret == PASS? "PASS":"FAIL", *fetched_anything); - DBG_RETURN(ret); -} -/* }}} */ - - /* {{{ mysqlnd_stmt::use_result */ static MYSQLND_RES * MYSQLND_METHOD(mysqlnd_stmt, use_result)(MYSQLND_STMT * s) @@ -953,9 +733,10 @@ MYSQLND_METHOD(mysqlnd_stmt, use_result)(MYSQLND_STMT * s) MYSQLND_INC_CONN_STATISTIC(conn->stats, STAT_PS_UNBUFFERED_SETS); result = stmt->result; - result->m.use_result(stmt->result, TRUE); - result->unbuf->m.fetch_row = stmt->cursor_exists? mysqlnd_fetch_stmt_row_cursor: - mysqlnd_stmt_fetch_row_unbuffered; + result->m.use_result(stmt->result, stmt); + if (stmt->cursor_exists) { + result->unbuf->m.fetch_row = mysqlnd_fetch_stmt_row_cursor; + } stmt->state = MYSQLND_STMT_USE_OR_STORE_CALLED; DBG_INF_FMT("%p", result); @@ -966,12 +747,11 @@ MYSQLND_METHOD(mysqlnd_stmt, use_result)(MYSQLND_STMT * s) /* {{{ mysqlnd_fetch_row_cursor */ enum_func_status -mysqlnd_fetch_stmt_row_cursor(MYSQLND_RES * result, void * param, const unsigned int flags, zend_bool * fetched_anything) +mysqlnd_fetch_stmt_row_cursor(MYSQLND_RES * result, zval **row_ptr, const unsigned int flags, zend_bool * fetched_anything) { enum_func_status ret; - MYSQLND_STMT * s = (MYSQLND_STMT *) param; - MYSQLND_STMT_DATA * stmt = s? s->data : NULL; - MYSQLND_CONN_DATA * conn = stmt? stmt->conn : NULL; + MYSQLND_STMT_DATA * stmt = result->unbuf->stmt; + MYSQLND_CONN_DATA * conn = stmt->conn; zend_uchar buf[MYSQLND_STMT_ID_LENGTH /* statement id */ + 4 /* number of rows to fetch */]; MYSQLND_PACKET_ROW * row_packet; @@ -1010,23 +790,15 @@ mysqlnd_fetch_stmt_row_cursor(MYSQLND_RES * result, void * param, const unsigned } - row_packet->skip_extraction = stmt->result_bind? FALSE:TRUE; - UPSERT_STATUS_RESET(stmt->upsert_status); if (PASS == (ret = PACKET_READ(conn, row_packet)) && !row_packet->eof) { - const MYSQLND_RES_METADATA * const meta = result->meta; - unsigned int i, field_count = result->field_count; - - if (!row_packet->skip_extraction) { - result->unbuf->m.free_last_data(result->unbuf, conn->stats); - - result->unbuf->last_row_data = row_packet->fields; + if (row_ptr) { result->unbuf->last_row_buffer = row_packet->row_buffer; - row_packet->fields = NULL; row_packet->row_buffer.ptr = NULL; + *row_ptr = result->row_data; if (PASS != result->unbuf->m.row_decoder(&result->unbuf->last_row_buffer, - result->unbuf->last_row_data, + result->row_data, row_packet->field_count, row_packet->fields_metadata, conn->options->int_and_float_native, @@ -1034,37 +806,8 @@ mysqlnd_fetch_stmt_row_cursor(MYSQLND_RES * result, void * param, const unsigned { DBG_RETURN(FAIL); } - - /* If no result bind, do nothing. We consumed the data */ - for (i = 0; i < field_count; i++) { - zval *resultzv = &stmt->result_bind[i].zv; - if (stmt->result_bind[i].bound == TRUE) { - zval *data = &result->unbuf->last_row_data[i]; - - DBG_INF_FMT("i=%u bound_var=%p type=%u refc=%u", i, &stmt->result_bind[i].zv, - Z_TYPE_P(data), Z_REFCOUNTED(stmt->result_bind[i].zv)? - Z_REFCOUNT(stmt->result_bind[i].zv) : 0); - - if (Z_TYPE_P(data) == IS_STRING && - (meta->fields[i].max_length < (zend_ulong) Z_STRLEN_P(data))) { - meta->fields[i].max_length = Z_STRLEN_P(data); - } - - ZEND_TRY_ASSIGN_VALUE_EX(resultzv, data, 0); - /* copied data, thus also the ownership. Thus null data */ - ZVAL_NULL(data); - } - } } else { DBG_INF("skipping extraction"); - /* - Data has been allocated and usually result->unbuf->m.free_last_data() - frees it but we can't call this function as it will cause problems with - the bound variables. Thus we need to do part of what it does or Zend will - report leaks. - */ - row_packet->result_set_memory_pool->free_chunk( - row_packet->result_set_memory_pool, row_packet->row_buffer.ptr); row_packet->row_buffer.ptr = NULL; } /* We asked for one row, the next one should be EOF, eat it */ @@ -1099,6 +842,7 @@ mysqlnd_fetch_stmt_row_cursor(MYSQLND_RES * result, void * param, const unsigned row_packet->server_status, row_packet->warning_count, result->unbuf->eof_reached); DBG_RETURN(ret); + return FAIL; } /* }}} */ @@ -1130,7 +874,24 @@ MYSQLND_METHOD(mysqlnd_stmt, fetch)(MYSQLND_STMT * const s, zend_bool * const fe SET_EMPTY_ERROR(stmt->error_info); SET_EMPTY_ERROR(conn->error_info); - ret = stmt->result->m.fetch_row(stmt->result, (void*)s, 0, fetched_anything); + if (stmt->result_bind) { + zval *row_data; + ret = stmt->result->m.fetch_row(stmt->result, &row_data, 0, fetched_anything); + if (ret == PASS && *fetched_anything) { + unsigned field_count = stmt->result->field_count; + for (unsigned i = 0; i < field_count; i++) { + zval *resultzv = &stmt->result_bind[i].zv; + if (stmt->result_bind[i].bound == TRUE) { + DBG_INF_FMT("i=%u type=%u", i, Z_TYPE(row_data[i])); + ZEND_TRY_ASSIGN_VALUE_EX(resultzv, &row_data[i], 0); + } else { + zval_ptr_dtor_nogc(&row_data[i]); + } + } + } + } else { + ret = stmt->result->m.fetch_row(stmt->result, NULL, 0, fetched_anything); + } DBG_RETURN(ret); } /* }}} */ @@ -1577,22 +1338,13 @@ MYSQLND_METHOD(mysqlnd_stmt, bind_one_result)(MYSQLND_STMT * const s, unsigned i SET_EMPTY_ERROR(conn->error_info); if (stmt->field_count) { - mysqlnd_stmt_separate_one_result_bind(s, param_no); - /* Guaranteed is that stmt->result_bind is NULL */ if (!stmt->result_bind) { stmt->result_bind = mnd_ecalloc(stmt->field_count, sizeof(MYSQLND_RESULT_BIND)); - } else { - stmt->result_bind = mnd_erealloc(stmt->result_bind, stmt->field_count * sizeof(MYSQLND_RESULT_BIND)); } - if (!stmt->result_bind) { - DBG_RETURN(FAIL); + if (stmt->result_bind[param_no].bound) { + zval_ptr_dtor(&stmt->result_bind[param_no].zv); } ZVAL_NULL(&stmt->result_bind[param_no].zv); - /* - Don't update is_ref !!! it's not our job - Otherwise either 009.phpt or mysqli_stmt_bind_result.phpt - will fail. - */ stmt->result_bind[param_no].bound = TRUE; } DBG_INF("PASS"); @@ -1743,13 +1495,6 @@ MYSQLND_METHOD(mysqlnd_stmt, result_metadata)(MYSQLND_STMT * const s) DBG_RETURN(NULL); } - if (stmt->update_max_length && stmt->result->stored_data) { - /* stored result, we have to update the max_length before we clone the meta data :( */ - stmt->result->stored_data->m.initialize_result_set_rest(stmt->result->stored_data, - stmt->result->meta, - conn->stats, - conn->options->int_and_float_native); - } /* TODO: This implementation is kind of a hack, find a better way to do it. In different functions I have put @@ -1762,7 +1507,7 @@ MYSQLND_METHOD(mysqlnd_stmt, result_metadata)(MYSQLND_STMT * const s) break; } result_meta->type = MYSQLND_RES_NORMAL; - result_meta->unbuf = mysqlnd_result_unbuffered_init(result_meta, stmt->field_count, TRUE); + result_meta->unbuf = mysqlnd_result_unbuffered_init(result_meta, stmt->field_count, stmt); if (!result_meta->unbuf) { break; } @@ -1921,10 +1666,6 @@ MYSQLND_METHOD(mysqlnd_stmt, free_result)(MYSQLND_STMT * const s) stmt->state = MYSQLND_STMT_PREPARED; } - if (GET_CONNECTION_STATE(&conn->state) != CONN_QUIT_SENT) { - SET_CONNECTION_STATE(&conn->state, CONN_READY); - } - DBG_RETURN(PASS); } /* }}} */ @@ -1968,37 +1709,6 @@ mysqlnd_stmt_separate_result_bind(MYSQLND_STMT * const s) /* }}} */ -/* {{{ mysqlnd_stmt_separate_one_result_bind */ -static void -mysqlnd_stmt_separate_one_result_bind(MYSQLND_STMT * const s, const unsigned int param_no) -{ - MYSQLND_STMT_DATA * stmt = s? s->data : NULL; - DBG_ENTER("mysqlnd_stmt_separate_one_result_bind"); - if (!stmt) { - DBG_VOID_RETURN; - } - DBG_INF_FMT("stmt=%lu result_bind=%p field_count=%u param_no=%u", stmt->stmt_id, stmt->result_bind, stmt->field_count, param_no); - - if (!stmt->result_bind) { - DBG_VOID_RETURN; - } - - /* - Because only the bound variables can point to our internal buffers, then - separate or free only them. Free is possible because the user could have - lost reference. - */ - /* Let's try with no cache */ - if (stmt->result_bind[param_no].bound == TRUE) { - DBG_INF_FMT("%u has refcount=%u", param_no, Z_REFCOUNTED(stmt->result_bind[param_no].zv)? Z_REFCOUNT(stmt->result_bind[param_no].zv) : 0); - zval_ptr_dtor(&stmt->result_bind[param_no].zv); - } - - DBG_VOID_RETURN; -} -/* }}} */ - - /* {{{ mysqlnd_stmt::free_stmt_result */ static void MYSQLND_METHOD(mysqlnd_stmt, free_stmt_result)(MYSQLND_STMT * const s) @@ -2016,7 +1726,7 @@ MYSQLND_METHOD(mysqlnd_stmt, free_stmt_result)(MYSQLND_STMT * const s) mysqlnd_stmt_separate_result_bind(s); /* Not every statement has a result set attached */ if (stmt->result) { - stmt->result->m.free_result_internal(stmt->result); + stmt->result->m.free_result(stmt->result, /* implicit */ TRUE); stmt->result = NULL; } zend_llist_clean(&stmt->error_info->error_list); diff --git a/ext/mysqlnd/mysqlnd_ps.h b/ext/mysqlnd/mysqlnd_ps.h index 0d4f7f80688b6..9e10fbab77bec 100644 --- a/ext/mysqlnd/mysqlnd_ps.h +++ b/ext/mysqlnd/mysqlnd_ps.h @@ -32,8 +32,8 @@ struct st_mysqlnd_perm_bind { extern struct st_mysqlnd_perm_bind mysqlnd_ps_fetch_functions[MYSQL_TYPE_LAST + 1]; -enum_func_status mysqlnd_stmt_fetch_row_buffered(MYSQLND_RES * result, void * param, const unsigned int flags, zend_bool * fetched_anything); -enum_func_status mysqlnd_fetch_stmt_row_cursor(MYSQLND_RES * result, void * param, const unsigned int flags, zend_bool * fetched_anything); +enum_func_status mysqlnd_stmt_fetch_row_buffered(MYSQLND_RES * result, zval **row_data, const unsigned int flags, zend_bool * fetched_anything); +enum_func_status mysqlnd_fetch_stmt_row_cursor(MYSQLND_RES * result, zval **row_data, const unsigned int flags, zend_bool * fetched_anything); void _mysqlnd_init_ps_subsystem();/* This one is private, mysqlnd_library_init() will call it */ void _mysqlnd_init_ps_fetch_subsystem(); diff --git a/ext/mysqlnd/mysqlnd_result.c b/ext/mysqlnd/mysqlnd_result.c index 28761aeb0a286..620f20599803a 100644 --- a/ext/mysqlnd/mysqlnd_result.c +++ b/ext/mysqlnd/mysqlnd_result.c @@ -27,159 +27,11 @@ #include "mysqlnd_debug.h" #include "mysqlnd_ext_plugin.h" -/* {{{ mysqlnd_result_buffered_zval::initialize_result_set_rest */ -static enum_func_status -MYSQLND_METHOD(mysqlnd_result_buffered_zval, initialize_result_set_rest)(MYSQLND_RES_BUFFERED * const result, - MYSQLND_RES_METADATA * const meta, - MYSQLND_STATS * stats, - zend_bool int_and_float_native) -{ - enum_func_status ret = PASS; - const unsigned int field_count = meta->field_count; - const uint64_t row_count = result->row_count; - - zval *data_begin = ((MYSQLND_RES_BUFFERED_ZVAL *) result)->data; - zval *data_cursor = data_begin; - - DBG_ENTER("mysqlnd_result_buffered_zval::initialize_result_set_rest"); - - if (!data_cursor || row_count == result->initialized_rows) { - DBG_RETURN(ret); - } - while ((data_cursor - data_begin) < (int)(row_count * field_count)) { - if (Z_ISUNDEF(data_cursor[0])) { - unsigned int i; - const size_t current_row_num = (data_cursor - data_begin) / field_count; - enum_func_status rc = result->m.row_decoder(&result->row_buffers[current_row_num], - data_cursor, - field_count, - meta->fields, - int_and_float_native, - stats); - if (rc != PASS) { - ret = FAIL; - break; - } - ++result->initialized_rows; - for (i = 0; i < field_count; ++i) { - /* - NULL fields are 0 length, 0 is not more than 0 - String of zero size, definitely can't be the next max_length. - Thus for NULL and zero-length we are quite efficient. - */ - if (Z_TYPE(data_cursor[i]) == IS_STRING) { - const size_t len = Z_STRLEN(data_cursor[i]); - if (meta->fields[i].max_length < len) { - meta->fields[i].max_length = len; - } - } - } - } - data_cursor += field_count; - } - DBG_RETURN(ret); -} -/* }}} */ - - -/* {{{ mysqlnd_result_buffered_c::initialize_result_set_rest */ -static enum_func_status -MYSQLND_METHOD(mysqlnd_result_buffered_c, initialize_result_set_rest)(MYSQLND_RES_BUFFERED * const result, - MYSQLND_RES_METADATA * const meta, - MYSQLND_STATS * stats, - const zend_bool int_and_float_native) -{ - unsigned int row, field; - enum_func_status ret = PASS; - const unsigned int field_count = meta->field_count; - const uint64_t row_count = result->row_count; - enum_func_status rc; - DBG_ENTER("mysqlnd_result_buffered_c::initialize_result_set_rest"); - - if (result->initialized_rows < row_count) { - zend_uchar * initialized = ((MYSQLND_RES_BUFFERED_C *) result)->initialized; - zval * current_row = mnd_emalloc(field_count * sizeof(zval)); - - if (!current_row) { - DBG_RETURN(FAIL); - } - - for (row = 0; row < result->row_count; row++) { - /* (row / 8) & the_bit_for_row*/ - if (ZEND_BIT_TEST(initialized, row)) { - continue; - } - - rc = result->m.row_decoder(&result->row_buffers[row], current_row, field_count, meta->fields, int_and_float_native, stats); - - if (rc != PASS) { - ret = FAIL; - break; - } - result->initialized_rows++; - initialized[row >> 3] |= (1 << (row & 7)); - for (field = 0; field < field_count; field++) { - /* - NULL fields are 0 length, 0 is not more than 0 - String of zero size, definitely can't be the next max_length. - Thus for NULL and zero-length we are quite efficient. - */ - if (Z_TYPE(current_row[field]) == IS_STRING) { - const size_t len = Z_STRLEN(current_row[field]); - if (meta->fields[field].max_length < len) { - meta->fields[field].max_length = len; - } - } - zval_ptr_dtor_nogc(¤t_row[field]); - } - } - mnd_efree(current_row); - } - DBG_RETURN(ret); -} -/* }}} */ - - -/* {{{ mysqlnd_result_unbuffered::free_last_data */ -static void -MYSQLND_METHOD(mysqlnd_result_unbuffered, free_last_data)(MYSQLND_RES_UNBUFFERED * unbuf, MYSQLND_STATS * const global_stats) -{ - DBG_ENTER("mysqlnd_res::unbuffered_free_last_data"); - - if (!unbuf) { - DBG_VOID_RETURN; - } - - DBG_INF_FMT("field_count=%u", unbuf->field_count); - if (unbuf->last_row_data) { - unsigned int i; - for (i = 0; i < unbuf->field_count; i++) { - zval_ptr_dtor_nogc(&(unbuf->last_row_data[i])); - } - - /* Free last row's zvals */ - mnd_efree(unbuf->last_row_data); - unbuf->last_row_data = NULL; - } - if (unbuf->last_row_buffer.ptr) { - DBG_INF("Freeing last row buffer"); - /* Nothing points to this buffer now, free it */ - unbuf->result_set_memory_pool->free_chunk( - unbuf->result_set_memory_pool, unbuf->last_row_buffer.ptr); - unbuf->last_row_buffer.ptr = NULL; - } - - DBG_VOID_RETURN; -} -/* }}} */ - - /* {{{ mysqlnd_result_unbuffered::free_result */ static void MYSQLND_METHOD(mysqlnd_result_unbuffered, free_result)(MYSQLND_RES_UNBUFFERED * const result, MYSQLND_STATS * const global_stats) { DBG_ENTER("mysqlnd_result_unbuffered, free_result"); - result->m.free_last_data(result, global_stats); /* must be free before because references the memory pool */ if (result->row_packet) { @@ -192,49 +44,15 @@ MYSQLND_METHOD(mysqlnd_result_unbuffered, free_result)(MYSQLND_RES_UNBUFFERED * } /* }}} */ - -/* {{{ mysqlnd_result_buffered_zval::free_result */ -static void -MYSQLND_METHOD(mysqlnd_result_buffered_zval, free_result)(MYSQLND_RES_BUFFERED_ZVAL * const set) +static void mysqlnd_result_free_prev_data(MYSQLND_RES *result) { - zval * data = set->data; - - DBG_ENTER("mysqlnd_result_buffered_zval::free_result"); - - set->data = NULL; /* prevent double free if following loop is interrupted */ - if (data) { - const unsigned int field_count = set->field_count; - int64_t row; - - for (row = set->row_count - 1; row >= 0; row--) { - zval *current_row = data + row * field_count; - int64_t col; - - if (current_row != NULL) { - for (col = field_count - 1; col >= 0; --col) { - zval_ptr_dtor_nogc(&(current_row[col])); - } - } + if (result->free_row_data) { + for (unsigned i = 0; i < result->field_count; ++i) { + zval_ptr_dtor_nogc(&result->row_data[i]); } - mnd_efree(data); + result->free_row_data = 0; } - set->data_cursor = NULL; - DBG_VOID_RETURN; } -/* }}} */ - - -/* {{{ mysqlnd_result_buffered_c::free_result */ -static void -MYSQLND_METHOD(mysqlnd_result_buffered_c, free_result)(MYSQLND_RES_BUFFERED_C * const set) -{ - DBG_ENTER("mysqlnd_result_buffered_c::free_result"); - mnd_efree(set->initialized); - set->initialized = NULL; - DBG_VOID_RETURN; -} -/* }}} */ - /* {{{ mysqlnd_result_buffered::free_result */ static void @@ -246,12 +64,6 @@ MYSQLND_METHOD(mysqlnd_result_buffered, free_result)(MYSQLND_RES_BUFFERED * cons mysqlnd_error_info_free_contents(&set->error_info); - if (set->type == MYSQLND_BUFFERED_TYPE_ZVAL) { - MYSQLND_METHOD(mysqlnd_result_buffered_zval, free_result)((MYSQLND_RES_BUFFERED_ZVAL *) set); - } if (set->type == MYSQLND_BUFFERED_TYPE_C) { - MYSQLND_METHOD(mysqlnd_result_buffered_c, free_result)((MYSQLND_RES_BUFFERED_C *) set); - } - if (set->row_buffers) { mnd_efree(set->row_buffers); set->row_buffers = NULL; @@ -269,6 +81,8 @@ MYSQLND_METHOD(mysqlnd_res, free_result_buffers)(MYSQLND_RES * result) DBG_ENTER("mysqlnd_res::free_result_buffers"); DBG_INF_FMT("%s", result->unbuf? "unbuffered":(result->stored_data? "buffered":"unknown")); + mysqlnd_result_free_prev_data(result); + if (result->meta) { ZEND_ASSERT(zend_arena_contains(result->memory_pool->arena, result->meta)); result->meta->m->free_metadata(result->meta); @@ -311,20 +125,6 @@ void MYSQLND_METHOD(mysqlnd_res, free_result_contents_internal)(MYSQLND_RES * re /* }}} */ -/* {{{ mysqlnd_res::free_result_internal */ -static -void MYSQLND_METHOD(mysqlnd_res, free_result_internal)(MYSQLND_RES * result) -{ - DBG_ENTER("mysqlnd_res::free_result_internal"); - - result->m.skip_result(result); - result->m.free_result_contents(result); - - DBG_VOID_RETURN; -} -/* }}} */ - - /* {{{ mysqlnd_res::read_result_metadata */ static enum_func_status MYSQLND_METHOD(mysqlnd_res, read_result_metadata)(MYSQLND_RES * result, MYSQLND_CONN_DATA * conn) @@ -343,10 +143,6 @@ MYSQLND_METHOD(mysqlnd_res, read_result_metadata)(MYSQLND_RES * result, MYSQLND_ } result->meta = result->m.result_meta_init(result, result->field_count); - if (!result->meta) { - SET_OOM_ERROR(conn->error_info); - DBG_RETURN(FAIL); - } /* 1. Read all fields metadata */ @@ -568,44 +364,11 @@ mysqlnd_query_read_result_set_header(MYSQLND_CONN_DATA * conn, MYSQLND_STMT * s) completeness. */ static const size_t * -MYSQLND_METHOD(mysqlnd_result_buffered_zval, fetch_lengths)(const MYSQLND_RES_BUFFERED * const result) +MYSQLND_METHOD(mysqlnd_result_buffered, fetch_lengths)(const MYSQLND_RES_BUFFERED * const result) { - const MYSQLND_RES_BUFFERED_ZVAL * const set = (const MYSQLND_RES_BUFFERED_ZVAL *) result; - /* - If: - - unbuffered result - - first row has not been read - - last_row has been read - */ - DBG_ENTER("mysqlnd_result_buffered_zval::fetch_lengths"); + DBG_ENTER("mysqlnd_result_buffered::fetch_lengths"); - if (set->data_cursor == NULL || - set->data_cursor == set->data || - ((set->data_cursor - set->data) > (result->row_count * result->field_count) )) - { - DBG_INF("EOF"); - DBG_RETURN(NULL);/* No rows or no more rows */ - } - DBG_INF("non NULL"); - DBG_RETURN(result->lengths); -} -/* }}} */ - - -/* {{{ mysqlnd_result_buffered_c::fetch_lengths */ -/* - Do lazy initialization for buffered results. As PHP strings have - length inside, this function makes not much sense in the context - of PHP, to be called as separate function. But let's have it for - completeness. -*/ -static const size_t * -MYSQLND_METHOD(mysqlnd_result_buffered_c, fetch_lengths)(const MYSQLND_RES_BUFFERED * const result) -{ - const MYSQLND_RES_BUFFERED_C * const set = (const MYSQLND_RES_BUFFERED_C *) result; - DBG_ENTER("mysqlnd_result_buffered_c::fetch_lengths"); - - if (set->current_row > set->row_count || set->current_row == 0) { + if (result->current_row > result->row_count || result->current_row == 0) { DBG_INF("EOF"); DBG_RETURN(NULL); /* No more rows, or no fetched row */ } @@ -620,7 +383,7 @@ static const size_t * MYSQLND_METHOD(mysqlnd_result_unbuffered, fetch_lengths)(const MYSQLND_RES_UNBUFFERED * const result) { /* simulate output of libmysql */ - return (result->last_row_data || result->eof_reached)? result->lengths : NULL; + return (result->last_row_buffer.ptr || result->eof_reached)? result->lengths : NULL; } /* }}} */ @@ -642,153 +405,21 @@ MYSQLND_METHOD(mysqlnd_res, fetch_lengths)(const MYSQLND_RES * const result) /* }}} */ -/* {{{ mysqlnd_result_unbuffered::fetch_row_c */ -static enum_func_status -MYSQLND_METHOD(mysqlnd_result_unbuffered, fetch_row_c)(MYSQLND_RES * result, void * param, unsigned int flags, zend_bool * fetched_anything) -{ - enum_func_status ret; - MYSQLND_ROW_C *row = (MYSQLND_ROW_C *) param; - MYSQLND_PACKET_ROW *row_packet = result->unbuf->row_packet; - MYSQLND_RES_METADATA * const meta = result->meta; - MYSQLND_CONN_DATA * const conn = result->conn; - void *checkpoint; - - DBG_ENTER("mysqlnd_result_unbuffered::fetch_row_c"); - - *fetched_anything = FALSE; - if (result->unbuf->eof_reached) { - /* No more rows obviously */ - DBG_RETURN(PASS); - } - if (!conn || GET_CONNECTION_STATE(&conn->state) != CONN_FETCHING_DATA) { - SET_CLIENT_ERROR(conn->error_info, CR_COMMANDS_OUT_OF_SYNC, UNKNOWN_SQLSTATE, mysqlnd_out_of_sync); - DBG_RETURN(FAIL); - } - if (!row_packet) { - /* Not fully initialized object that is being cleaned up */ - DBG_RETURN(FAIL); - } - /* Let the row packet fill our buffer and skip additional mnd_malloc + memcpy */ - row_packet->skip_extraction = FALSE; - - checkpoint = result->memory_pool->checkpoint; - mysqlnd_mempool_save_state(result->memory_pool); - - /* - If we skip rows (row == NULL) we have to - result->m.unbuffered_free_last_data() before it. The function returns always true. - */ - if (PASS == (ret = PACKET_READ(conn, row_packet)) && !row_packet->eof) { - result->unbuf->m.free_last_data(result->unbuf, conn->stats); - - result->unbuf->last_row_data = row_packet->fields; - result->unbuf->last_row_buffer = row_packet->row_buffer; - row_packet->fields = NULL; - row_packet->row_buffer.ptr = NULL; - - MYSQLND_INC_CONN_STATISTIC(conn->stats, STAT_ROWS_FETCHED_FROM_CLIENT_NORMAL_UNBUF); - - if (!row_packet->skip_extraction) { - unsigned int i, field_count = meta->field_count; - - enum_func_status rc = result->unbuf->m.row_decoder(&result->unbuf->last_row_buffer, - result->unbuf->last_row_data, - field_count, - row_packet->fields_metadata, - conn->options->int_and_float_native, - conn->stats); - if (PASS != rc) { - mysqlnd_mempool_restore_state(result->memory_pool); - result->memory_pool->checkpoint = checkpoint; - DBG_RETURN(FAIL); - } - { - *row = mnd_malloc(field_count * sizeof(char *)); - if (*row) { - MYSQLND_FIELD * field = meta->fields; - size_t * lengths = result->unbuf->lengths; - - for (i = 0; i < field_count; i++, field++) { - zval * data = &result->unbuf->last_row_data[i]; - const size_t len = (Z_TYPE_P(data) == IS_STRING)? Z_STRLEN_P(data) : 0; - -/* BEGIN difference between normal normal fetch and _c */ - if (Z_TYPE_P(data) != IS_NULL) { - convert_to_string(data); - (*row)[i] = Z_STRVAL_P(data); - } else { - (*row)[i] = NULL; - } -/* END difference between normal normal fetch and _c */ - - if (lengths) { - lengths[i] = len; - } - - if (field->max_length < len) { - field->max_length = len; - } - } - } else { - SET_OOM_ERROR(conn->error_info); - } - } - } - result->unbuf->row_count++; - *fetched_anything = TRUE; - } else if (ret == FAIL) { - if (row_packet->error_info.error_no) { - COPY_CLIENT_ERROR(conn->error_info, row_packet->error_info); - DBG_ERR_FMT("errorno=%u error=%s", row_packet->error_info.error_no, row_packet->error_info.error); - } - if (GET_CONNECTION_STATE(&conn->state) != CONN_QUIT_SENT) { - SET_CONNECTION_STATE(&conn->state, CONN_READY); - } - result->unbuf->eof_reached = TRUE; /* so next time we won't get an error */ - } else if (row_packet->eof) { - /* Mark the connection as usable again */ - DBG_INF_FMT("warnings=%u server_status=%u", row_packet->warning_count, row_packet->server_status); - result->unbuf->eof_reached = TRUE; - - UPSERT_STATUS_RESET(conn->upsert_status); - UPSERT_STATUS_SET_WARNINGS(conn->upsert_status, row_packet->warning_count); - UPSERT_STATUS_SET_SERVER_STATUS(conn->upsert_status, row_packet->server_status); - /* - result->row_packet will be cleaned when - destroying the result object - */ - if (UPSERT_STATUS_GET_SERVER_STATUS(conn->upsert_status) & SERVER_MORE_RESULTS_EXISTS) { - SET_CONNECTION_STATE(&conn->state, CONN_NEXT_RESULT_PENDING); - } else { - SET_CONNECTION_STATE(&conn->state, CONN_READY); - } - result->unbuf->m.free_last_data(result->unbuf, conn->stats); - } - - mysqlnd_mempool_restore_state(result->memory_pool); - result->memory_pool->checkpoint = checkpoint; - - DBG_INF_FMT("ret=%s fetched=%u", ret == PASS? "PASS":"FAIL", *fetched_anything); - DBG_RETURN(PASS); -} -/* }}} */ - - /* {{{ mysqlnd_result_unbuffered::fetch_row */ static enum_func_status -MYSQLND_METHOD(mysqlnd_result_unbuffered, fetch_row)(MYSQLND_RES * result, void * param, const unsigned int flags, zend_bool * fetched_anything) +MYSQLND_METHOD(mysqlnd_result_unbuffered, fetch_row)(MYSQLND_RES * result, zval **row_ptr, const unsigned int flags, zend_bool * fetched_anything) { - enum_func_status ret; - zval *row = (zval *) param; + enum_func_status ret; MYSQLND_PACKET_ROW *row_packet = result->unbuf->row_packet; const MYSQLND_RES_METADATA * const meta = result->meta; + MYSQLND_RES_UNBUFFERED *set = result->unbuf; MYSQLND_CONN_DATA * const conn = result->conn; void *checkpoint; DBG_ENTER("mysqlnd_result_unbuffered::fetch_row"); *fetched_anything = FALSE; - if (result->unbuf->eof_reached) { + if (set->eof_reached) { /* No more rows obviously */ DBG_RETURN(PASS); } @@ -800,95 +431,57 @@ MYSQLND_METHOD(mysqlnd_result_unbuffered, fetch_row)(MYSQLND_RES * result, void /* Not fully initialized object that is being cleaned up */ DBG_RETURN(FAIL); } - /* Let the row packet fill our buffer and skip additional mnd_malloc + memcpy */ - row_packet->skip_extraction = row? FALSE:TRUE; checkpoint = result->memory_pool->checkpoint; mysqlnd_mempool_save_state(result->memory_pool); - /* - If we skip rows (row == NULL) we have to - result->m.unbuffered_free_last_data() before it. The function returns always true. - */ if (PASS == (ret = PACKET_READ(conn, row_packet)) && !row_packet->eof) { - result->unbuf->m.free_last_data(result->unbuf, conn->stats); - - result->unbuf->last_row_data = row_packet->fields; - result->unbuf->last_row_buffer = row_packet->row_buffer; - row_packet->fields = NULL; + set->last_row_buffer = row_packet->row_buffer; row_packet->row_buffer.ptr = NULL; - MYSQLND_INC_CONN_STATISTIC(conn->stats, STAT_ROWS_FETCHED_FROM_CLIENT_NORMAL_UNBUF); + MYSQLND_INC_CONN_STATISTIC(conn->stats, set->stmt + ? STAT_ROWS_FETCHED_FROM_CLIENT_PS_UNBUF + : STAT_ROWS_FETCHED_FROM_CLIENT_NORMAL_UNBUF); - if (!row_packet->skip_extraction) { - unsigned int i, field_count = meta->field_count; + if (row_ptr) { + unsigned int field_count = meta->field_count; - enum_func_status rc = result->unbuf->m.row_decoder(&result->unbuf->last_row_buffer, - result->unbuf->last_row_data, - field_count, - row_packet->fields_metadata, - conn->options->int_and_float_native, - conn->stats); + *row_ptr = result->row_data; + enum_func_status rc = set->m.row_decoder( + &set->last_row_buffer, result->row_data, field_count, + row_packet->fields_metadata, conn->options->int_and_float_native, conn->stats); if (PASS != rc) { mysqlnd_mempool_restore_state(result->memory_pool); result->memory_pool->checkpoint = checkpoint; DBG_RETURN(FAIL); } - { - HashTable * row_ht = Z_ARRVAL_P(row); - MYSQLND_FIELD * field = meta->fields; - size_t * lengths = result->unbuf->lengths; - - for (i = 0; i < field_count; i++, field++) { - zval * data = &result->unbuf->last_row_data[i]; - const size_t len = (Z_TYPE_P(data) == IS_STRING)? Z_STRLEN_P(data) : 0; - - if (flags & MYSQLND_FETCH_NUM) { - if (zend_hash_index_add(row_ht, i, data) != NULL) { - Z_TRY_ADDREF_P(data); - } - } - if (flags & MYSQLND_FETCH_ASSOC) { - /* zend_hash_quick_update needs length + trailing zero */ - /* QQ: Error handling ? */ - /* - zend_hash_quick_update does not check, as add_assoc_zval_ex do, whether - the index is a numeric and convert it to it. This however means constant - hashing of the column name, which is not needed as it can be precomputed. - */ - Z_TRY_ADDREF_P(data); - if (meta->fields[i].is_numeric == FALSE) { - zend_hash_update(row_ht, meta->fields[i].sname, data); - } else { - zend_hash_index_update(row_ht, meta->fields[i].num_key, data); - } - } - - if (lengths) { - lengths[i] = len; - } - if (field->max_length < len) { - field->max_length = len; - } + size_t *lengths = set->lengths; + if (lengths) { + for (unsigned i = 0; i < field_count; i++) { + zval *data = &result->row_data[i]; + lengths[i] = Z_TYPE_P(data) == IS_STRING ? Z_STRLEN_P(data) : 0; } } } - result->unbuf->row_count++; + set->row_count++; *fetched_anything = TRUE; } else if (ret == FAIL) { if (row_packet->error_info.error_no) { COPY_CLIENT_ERROR(conn->error_info, row_packet->error_info); + if (set->stmt) { + COPY_CLIENT_ERROR(set->stmt->error_info, row_packet->error_info); + } DBG_ERR_FMT("errorno=%u error=%s", row_packet->error_info.error_no, row_packet->error_info.error); } if (GET_CONNECTION_STATE(&conn->state) != CONN_QUIT_SENT) { SET_CONNECTION_STATE(&conn->state, CONN_READY); } - result->unbuf->eof_reached = TRUE; /* so next time we won't get an error */ + set->eof_reached = TRUE; /* so next time we won't get an error */ } else if (row_packet->eof) { /* Mark the connection as usable again */ DBG_INF_FMT("warnings=%u server_status=%u", row_packet->warning_count, row_packet->server_status); - result->unbuf->eof_reached = TRUE; + set->eof_reached = TRUE; UPSERT_STATUS_RESET(conn->upsert_status); UPSERT_STATUS_SET_WARNINGS(conn->upsert_status, row_packet->warning_count); @@ -902,7 +495,6 @@ MYSQLND_METHOD(mysqlnd_result_unbuffered, fetch_row)(MYSQLND_RES * result, void } else { SET_CONNECTION_STATE(&conn->state, CONN_READY); } - result->unbuf->m.free_last_data(result->unbuf, conn->stats); } mysqlnd_mempool_restore_state(result->memory_pool); @@ -916,23 +508,20 @@ MYSQLND_METHOD(mysqlnd_result_unbuffered, fetch_row)(MYSQLND_RES * result, void /* {{{ mysqlnd_res::use_result */ static MYSQLND_RES * -MYSQLND_METHOD(mysqlnd_res, use_result)(MYSQLND_RES * const result, const zend_bool ps) +MYSQLND_METHOD(mysqlnd_res, use_result)(MYSQLND_RES * const result, MYSQLND_STMT_DATA *stmt) { MYSQLND_CONN_DATA * const conn = result->conn; DBG_ENTER("mysqlnd_res::use_result"); SET_EMPTY_ERROR(conn->error_info); - if (ps == FALSE) { - result->type = MYSQLND_RES_NORMAL; + if (!stmt) { + result->type = MYSQLND_RES_NORMAL; } else { - result->type = MYSQLND_RES_PS_UNBUF; + result->type = MYSQLND_RES_PS_UNBUF; } - result->unbuf = mysqlnd_result_unbuffered_init(result, result->field_count, ps); - if (!result->unbuf) { - goto oom; - } + result->unbuf = mysqlnd_result_unbuffered_init(result, result->field_count, stmt); /* Will be freed in the mysqlnd_internal_free_result_contents() called @@ -946,315 +535,79 @@ MYSQLND_METHOD(mysqlnd_res, use_result)(MYSQLND_RES * const result, const zend_b conn->payload_decoder_factory->m.init_row_packet(row_packet); row_packet->result_set_memory_pool = result->unbuf->result_set_memory_pool; row_packet->field_count = result->field_count; - row_packet->binary_protocol = ps; + row_packet->binary_protocol = stmt != NULL; row_packet->fields_metadata = result->meta->fields; result->unbuf->row_packet = row_packet; } DBG_RETURN(result); -oom: - SET_OOM_ERROR(conn->error_info); - DBG_RETURN(NULL); } /* }}} */ -/* {{{ mysqlnd_result_buffered::fetch_row_c */ +/* {{{ mysqlnd_result_buffered::fetch_row */ static enum_func_status -MYSQLND_METHOD(mysqlnd_result_buffered, fetch_row_c)(MYSQLND_RES * result, void * param, unsigned int flags, zend_bool * const fetched_anything) +MYSQLND_METHOD(mysqlnd_result_buffered, fetch_row)(MYSQLND_RES * result, zval **row_ptr, const unsigned int flags, zend_bool * fetched_anything) { - enum_func_status ret = FAIL; - MYSQLND_ROW_C * row = (MYSQLND_ROW_C *) param; - const MYSQLND_RES_METADATA * const meta = result->meta; - const unsigned int field_count = meta->field_count; - MYSQLND_CONN_DATA * const conn = result->conn; - DBG_ENTER("mysqlnd_result_buffered::fetch_row_c"); - - if (result->stored_data->type == MYSQLND_BUFFERED_TYPE_ZVAL) { - MYSQLND_RES_BUFFERED_ZVAL * set = (MYSQLND_RES_BUFFERED_ZVAL *) result->stored_data; - - /* If we haven't read everything */ - if (set->data_cursor && - (set->data_cursor - set->data) < (result->stored_data->row_count * field_count)) - { - zval *current_row = set->data_cursor; - unsigned int i; - - if (Z_ISUNDEF(current_row[0])) { - uint64_t row_num = (set->data_cursor - set->data) / field_count; - enum_func_status rc = set->m.row_decoder(&set->row_buffers[row_num], - current_row, - field_count, - meta->fields, - conn->options->int_and_float_native, - conn->stats); - if (rc != PASS) { - DBG_RETURN(FAIL); - } - ++set->initialized_rows; - for (i = 0; i < field_count; ++i) { - /* - NULL fields are 0 length, 0 is not more than 0 - String of zero size, definitely can't be the next max_length. - Thus for NULL and zero-length we are quite efficient. - */ - if (Z_TYPE(current_row[i]) == IS_STRING) { - const size_t len = Z_STRLEN(current_row[i]); - if (meta->fields[i].max_length < len) { - meta->fields[i].max_length = len; - } - } - } - } - -/* BEGIN difference between normal normal fetch and _c */ - /* there is no conn handle in this function thus we can't set OOM in error_info */ - *row = mnd_malloc(field_count * sizeof(char *)); - if (*row) { - for (i = 0; i < field_count; ++i) { - zval * data = ¤t_row[i]; - - set->lengths[i] = (Z_TYPE_P(data) == IS_STRING)? Z_STRLEN_P(data) : 0; - - if (Z_TYPE_P(data) != IS_NULL) { - convert_to_string(data); - (*row)[i] = Z_STRVAL_P(data); - } else { - (*row)[i] = NULL; - } - } - set->data_cursor += field_count; - MYSQLND_INC_GLOBAL_STATISTIC(STAT_ROWS_FETCHED_FROM_CLIENT_NORMAL_BUF); - } else { - SET_OOM_ERROR(conn->error_info); - } -/* END difference between normal normal fetch and _c */ - - *fetched_anything = *row? TRUE:FALSE; - ret = *row? PASS:FAIL; - } else { - set->data_cursor = NULL; - DBG_INF("EOF reached"); - *fetched_anything = FALSE; - ret = PASS; - } - } else if (result->stored_data->type == MYSQLND_BUFFERED_TYPE_C) { - /* - We don't support _C with pdo because it uses the data in a different way - just references it. - We will either leak or give nirvana pointers - */ - *fetched_anything = FALSE; - DBG_RETURN(FAIL); - } - DBG_INF_FMT("ret=PASS fetched=%u", *fetched_anything); - DBG_RETURN(ret); -} -/* }}} */ - - -/* {{{ mysqlnd_result_buffered_zval::fetch_row */ -static enum_func_status -MYSQLND_METHOD(mysqlnd_result_buffered_zval, fetch_row)(MYSQLND_RES * result, void * param, const unsigned int flags, zend_bool * const fetched_anything) -{ - enum_func_status ret = FAIL; - zval * row = (zval *) param; - const MYSQLND_RES_METADATA * const meta = result->meta; - const unsigned int field_count = meta->field_count; - MYSQLND_RES_BUFFERED_ZVAL * set = (MYSQLND_RES_BUFFERED_ZVAL *) result->stored_data; - MYSQLND_CONN_DATA * const conn = result->conn; + MYSQLND_RES_BUFFERED *set = result->stored_data; - DBG_ENTER("mysqlnd_result_buffered_zval::fetch_row"); + DBG_ENTER("mysqlnd_result_buffered::fetch_row"); /* If we haven't read everything */ - if (set->data_cursor && (set->data_cursor - set->data) < (set->row_count * field_count)) { - unsigned int i; - zval *current_row = set->data_cursor; - - if (Z_ISUNDEF(current_row[0])) { - const size_t row_num = (set->data_cursor - set->data) / field_count; - enum_func_status rc = set->m.row_decoder(&set->row_buffers[row_num], - current_row, - field_count, - meta->fields, - conn->options->int_and_float_native, - conn->stats); + if (set->current_row < set->row_count) { + if (row_ptr) { + const MYSQLND_RES_METADATA * const meta = result->meta; + const unsigned int field_count = meta->field_count; + MYSQLND_CONN_DATA * const conn = result->conn; + enum_func_status rc; + zval *current_row = result->row_data; + *row_ptr = result->row_data; + rc = result->stored_data->m.row_decoder(&set->row_buffers[set->current_row], + current_row, + field_count, + meta->fields, + conn->options->int_and_float_native, + conn->stats); if (rc != PASS) { DBG_RETURN(FAIL); } - ++set->initialized_rows; - for (i = 0; i < field_count; ++i) { - /* - NULL fields are 0 length, 0 is not more than 0 - String of zero size, definitely can't be the next max_length. - Thus for NULL and zero-length we are quite efficient. - */ - if (Z_TYPE(current_row[i]) == IS_STRING) { - const size_t len = Z_STRLEN(current_row[i]); - if (meta->fields[i].max_length < len) { - meta->fields[i].max_length = len; - } - } - } - } - for (i = 0; i < field_count; ++i) { - zval * data = ¤t_row[i]; - - set->lengths[i] = (Z_TYPE_P(data) == IS_STRING)? Z_STRLEN_P(data) : 0; - - if (flags & MYSQLND_FETCH_NUM) { - if (zend_hash_index_add(Z_ARRVAL_P(row), i, data) != NULL) { - Z_TRY_ADDREF_P(data); - } - } - if (flags & MYSQLND_FETCH_ASSOC) { - /* zend_hash_quick_update needs length + trailing zero */ - /* QQ: Error handling ? */ - /* - zend_hash_quick_update does not check, as add_assoc_zval_ex do, whether - the index is a numeric and convert it to it. This however means constant - hashing of the column name, which is not needed as it can be precomputed. - */ - Z_TRY_ADDREF_P(data); - if (meta->fields[i].is_numeric == FALSE) { - zend_hash_update(Z_ARRVAL_P(row), meta->fields[i].sname, data); - } else { - zend_hash_index_update(Z_ARRVAL_P(row), meta->fields[i].num_key, data); + if (set->lengths) { + for (unsigned i = 0; i < field_count; ++i) { + zval *data = ¤t_row[i]; + set->lengths[i] = Z_TYPE_P(data) == IS_STRING ? Z_STRLEN_P(data) : 0; } } } - set->data_cursor += field_count; - MYSQLND_INC_GLOBAL_STATISTIC(STAT_ROWS_FETCHED_FROM_CLIENT_NORMAL_BUF); - *fetched_anything = TRUE; - ret = PASS; - } else { - set->data_cursor = NULL; - DBG_INF("EOF reached"); - *fetched_anything = FALSE; - ret = PASS; - } - DBG_INF_FMT("ret=PASS fetched=%u", *fetched_anything); - DBG_RETURN(ret); -} -/* }}} */ - -/* {{{ mysqlnd_result_buffered_c::fetch_row */ -static enum_func_status -MYSQLND_METHOD(mysqlnd_result_buffered_c, fetch_row)(MYSQLND_RES * result, void * param, const unsigned int flags, zend_bool * fetched_anything) -{ - enum_func_status ret = FAIL; - zval * row = (zval *) param; - const MYSQLND_RES_METADATA * const meta = result->meta; - const unsigned int field_count = meta->field_count; - MYSQLND_CONN_DATA * const conn = result->conn; - - MYSQLND_RES_BUFFERED_C * set = (MYSQLND_RES_BUFFERED_C *) result->stored_data; - - DBG_ENTER("mysqlnd_result_buffered_c::fetch_row"); - - /* If we haven't read everything */ - if (set->current_row < set->row_count) { - enum_func_status rc; - zval * current_row; - unsigned int i; - - current_row = mnd_emalloc(field_count * sizeof(zval)); - if (!current_row) { - SET_OOM_ERROR(conn->error_info); - DBG_RETURN(FAIL); - } - - rc = result->stored_data->m.row_decoder(&result->stored_data->row_buffers[set->current_row], - current_row, - field_count, - meta->fields, - conn->options->int_and_float_native, - conn->stats); - if (rc != PASS) { - DBG_RETURN(FAIL); - } - if (!ZEND_BIT_TEST(set->initialized, set->current_row)) { - set->initialized[set->current_row >> 3] |= (1 << (set->current_row & 7)); /* mark initialized */ - - ++set->initialized_rows; - - for (i = 0; i < field_count; ++i) { - /* - NULL fields are 0 length, 0 is not more than 0 - String of zero size, definitely can't be the next max_length. - Thus for NULL and zero-length we are quite efficient. - */ - if (Z_TYPE(current_row[i]) == IS_STRING) { - const size_t len = Z_STRLEN(current_row[i]); - if (meta->fields[i].max_length < len) { - meta->fields[i].max_length = len; - } - } - } - } - - for (i = 0; i < field_count; ++i) { - zval * data = ¤t_row[i]; - - set->lengths[i] = (Z_TYPE_P(data) == IS_STRING)? Z_STRLEN_P(data) : 0; - - if (flags & MYSQLND_FETCH_NUM) { - if (zend_hash_index_add(Z_ARRVAL_P(row), i, data)) { - Z_TRY_ADDREF_P(data); - } - } - if (flags & MYSQLND_FETCH_ASSOC) { - /* zend_hash_quick_update needs length + trailing zero */ - /* QQ: Error handling ? */ - /* - zend_hash_quick_update does not check, as add_assoc_zval_ex do, whether - the index is a numeric and convert it to it. This however means constant - hashing of the column name, which is not needed as it can be precomputed. - */ - Z_TRY_ADDREF_P(data); - if (meta->fields[i].is_numeric == FALSE) { - zend_hash_update(Z_ARRVAL_P(row), meta->fields[i].sname, data); - } else { - zend_hash_index_update(Z_ARRVAL_P(row), meta->fields[i].num_key, data); - } - } - /* - This will usually not destroy anything but decref. - However, if neither NUM nor ASSOC is set we will free memory cleanly and won't leak. - It also simplifies the handling of Z_ADDREF_P because we don't need to check if only - either NUM or ASSOC is set but not both. - */ - zval_ptr_dtor_nogc(data); - } - mnd_efree(current_row); ++set->current_row; - MYSQLND_INC_GLOBAL_STATISTIC(STAT_ROWS_FETCHED_FROM_CLIENT_NORMAL_BUF); + MYSQLND_INC_GLOBAL_STATISTIC(set->stmt + ? STAT_ROWS_FETCHED_FROM_CLIENT_PS_BUF : STAT_ROWS_FETCHED_FROM_CLIENT_NORMAL_BUF); *fetched_anything = TRUE; - ret = PASS; } else { if (set->current_row == set->row_count) { set->current_row = set->row_count + 1; } DBG_INF_FMT("EOF reached. current_row=%llu", (unsigned long long) set->current_row); *fetched_anything = FALSE; - ret = PASS; } DBG_INF_FMT("ret=PASS fetched=%u", *fetched_anything); - DBG_RETURN(ret); + DBG_RETURN(PASS); } /* }}} */ /* {{{ mysqlnd_res::fetch_row */ static enum_func_status -MYSQLND_METHOD(mysqlnd_res, fetch_row)(MYSQLND_RES * result, void * param, const unsigned int flags, zend_bool *fetched_anything) +MYSQLND_METHOD(mysqlnd_res, fetch_row)(MYSQLND_RES *result, zval **row_ptr, const unsigned int flags, zend_bool *fetched_anything) { - const mysqlnd_fetch_row_func f = result->stored_data? result->stored_data->m.fetch_row:(result->unbuf? result->unbuf->m.fetch_row:NULL); + const mysqlnd_fetch_row_func f = + result->stored_data ? result->stored_data->m.fetch_row : + result->unbuf ? result->unbuf->m.fetch_row : NULL; if (f) { - return f(result, param, flags, fetched_anything); + return f(result, row_ptr, flags, fetched_anything); } *fetched_anything = FALSE; return PASS; @@ -1291,8 +644,6 @@ MYSQLND_METHOD(mysqlnd_res, store_result_fetch_data)(MYSQLND_CONN_DATA * const c row_packet.binary_protocol = binary_protocol; row_packet.fields_metadata = meta->fields; - row_packet.skip_extraction = TRUE; /* let php_mysqlnd_rowp_read() not allocate row_packet.fields, we will do it */ - while (FAIL != (ret = PACKET_READ(conn, &row_packet)) && !row_packet.eof) { if (!free_rows) { MYSQLND_ROW_BUFFER * new_row_buffers; @@ -1321,11 +672,6 @@ MYSQLND_METHOD(mysqlnd_res, store_result_fetch_data)(MYSQLND_CONN_DATA * const c } else { new_row_buffers = mnd_emalloc((size_t)(total_allocated_rows * sizeof(MYSQLND_ROW_BUFFER))); } - if (!new_row_buffers) { - SET_OOM_ERROR(conn->error_info); - ret = FAIL; - goto free_end; - } *row_buffers = new_row_buffers; } free_rows--; @@ -1334,15 +680,7 @@ MYSQLND_METHOD(mysqlnd_res, store_result_fetch_data)(MYSQLND_CONN_DATA * const c set->row_count++; /* So row_packet's destructor function won't efree() it */ - row_packet.fields = NULL; row_packet.row_buffer.ptr = NULL; - - /* - No need to FREE_ALLOCA as we can reuse the - 'lengths' and 'fields' arrays. For lengths its absolutely safe. - 'fields' is reused because the ownership of the strings has been - transferred above. - */ } /* Overflow ? */ MYSQLND_INC_CONN_STATISTIC_W_VALUE(conn->stats, @@ -1357,6 +695,13 @@ MYSQLND_METHOD(mysqlnd_res, store_result_fetch_data)(MYSQLND_CONN_DATA * const c UPSERT_STATUS_SET_SERVER_STATUS(conn->upsert_status, row_packet.server_status); } + if (ret == FAIL) { + /* Error packets do not contain server status information. However, we know that after + * an error there will be no further result sets. */ + UPSERT_STATUS_SET_SERVER_STATUS(conn->upsert_status, + UPSERT_STATUS_GET_SERVER_STATUS(conn->upsert_status) & ~SERVER_MORE_RESULTS_EXISTS); + } + /* save some memory */ if (free_rows) { /* don't try to allocate more than possible - mnd_XXalloc expects size_t, and it can have narrower range than uint64_t */ @@ -1398,7 +743,7 @@ MYSQLND_METHOD(mysqlnd_res, store_result_fetch_data)(MYSQLND_CONN_DATA * const c static MYSQLND_RES * MYSQLND_METHOD(mysqlnd_res, store_result)(MYSQLND_RES * result, MYSQLND_CONN_DATA * const conn, - const unsigned int flags) + MYSQLND_STMT_DATA *stmt) { enum_func_status ret; MYSQLND_ROW_BUFFER **row_buffers = NULL; @@ -1406,28 +751,16 @@ MYSQLND_METHOD(mysqlnd_res, store_result)(MYSQLND_RES * result, DBG_ENTER("mysqlnd_res::store_result"); /* We need the conn because we are doing lazy zval initialization in buffered_fetch_row */ - /* In case of error the reference will be released in free_result_internal() called indirectly by our caller */ + /* In case of error the reference will be released in free_result() called indirectly by our caller */ result->conn = conn->m->get_reference(conn); result->type = MYSQLND_RES_NORMAL; SET_CONNECTION_STATE(&conn->state, CONN_FETCHING_DATA); - if (flags & MYSQLND_STORE_NO_COPY) { - result->stored_data = (MYSQLND_RES_BUFFERED *) mysqlnd_result_buffered_zval_init(result, result->field_count, flags & MYSQLND_STORE_PS); - if (!result->stored_data) { - SET_OOM_ERROR(conn->error_info); - DBG_RETURN(NULL); - } - row_buffers = &result->stored_data->row_buffers; - } else if (flags & MYSQLND_STORE_COPY) { - result->stored_data = (MYSQLND_RES_BUFFERED *) mysqlnd_result_buffered_c_init(result, result->field_count, flags & MYSQLND_STORE_PS); - if (!result->stored_data) { - SET_OOM_ERROR(conn->error_info); - DBG_RETURN(NULL); - } - row_buffers = &result->stored_data->row_buffers; - } - ret = result->m.store_result_fetch_data(conn, result, result->meta, row_buffers, flags & MYSQLND_STORE_PS); + result->stored_data = (MYSQLND_RES_BUFFERED *) mysqlnd_result_buffered_init(result, result->field_count, stmt); + row_buffers = &result->stored_data->row_buffers; + + ret = result->m.store_result_fetch_data(conn, result, result->meta, row_buffers, stmt != NULL); if (FAIL == ret) { if (result->stored_data) { @@ -1437,31 +770,7 @@ MYSQLND_METHOD(mysqlnd_res, store_result)(MYSQLND_RES * result, } DBG_RETURN(NULL); } else { - if (flags & MYSQLND_STORE_NO_COPY) { - const MYSQLND_RES_METADATA * const meta = result->meta; - MYSQLND_RES_BUFFERED_ZVAL * set = (MYSQLND_RES_BUFFERED_ZVAL *) result->stored_data; - - if (set->row_count) { - /* don't try to allocate more than possible - mnd_XXalloc expects size_t, and it can have narrower range than uint64_t */ - if (set->row_count * meta->field_count * sizeof(zval *) > SIZE_MAX) { - SET_OOM_ERROR(conn->error_info); - DBG_RETURN(NULL); - } - /* if pecalloc is used valgrind barks gcc version 4.3.1 20080507 (prerelease) [gcc-4_3-branch revision 135036] (SUSE Linux) */ - set->data = mnd_emalloc((size_t)(set->row_count * meta->field_count * sizeof(zval))); - if (!set->data) { - SET_OOM_ERROR(conn->error_info); - DBG_RETURN(NULL); - } - memset(set->data, 0, (size_t)(set->row_count * meta->field_count * sizeof(zval))); - } - /* Position at the first row */ - set->data_cursor = set->data; - } else if (flags & MYSQLND_STORE_COPY) { - MYSQLND_RES_BUFFERED_C * set = (MYSQLND_RES_BUFFERED_C *) result->stored_data; - set->current_row = 0; - set->initialized = mnd_ecalloc((unsigned int) ((set->row_count / 8) + 1), sizeof(zend_uchar)); /* +1 for safety */ - } + result->stored_data->current_row = 0; } /* libmysql's documentation says it should be so for SELECT statements */ @@ -1493,7 +802,9 @@ MYSQLND_METHOD(mysqlnd_res, skip_result)(MYSQLND_RES * const result) STAT_FLUSHED_PS_SETS); while ((PASS == result->m.fetch_row(result, NULL, 0, &fetched_anything)) && fetched_anything == TRUE) { - /* do nothing */; + MYSQLND_INC_CONN_STATISTIC(conn->stats, + result->type == MYSQLND_RES_NORMAL + ? STAT_ROWS_SKIPPED_NORMAL : STAT_ROWS_SKIPPED_PS); } } DBG_RETURN(PASS); @@ -1511,7 +822,8 @@ MYSQLND_METHOD(mysqlnd_res, free_result)(MYSQLND_RES * result, const zend_bool i implicit == TRUE? STAT_FREE_RESULT_IMPLICIT: STAT_FREE_RESULT_EXPLICIT); - result->m.free_result_internal(result); + result->m.skip_result(result); + result->m.free_result_contents(result); DBG_RETURN(PASS); } /* }}} */ @@ -1529,36 +841,17 @@ MYSQLND_METHOD(mysqlnd_res, data_seek)(MYSQLND_RES * const result, const uint64_ /* }}} */ -/* {{{ mysqlnd_result_buffered_zval::data_seek */ -static enum_func_status -MYSQLND_METHOD(mysqlnd_result_buffered_zval, data_seek)(MYSQLND_RES_BUFFERED * const result, const uint64_t row) -{ - MYSQLND_RES_BUFFERED_ZVAL * set = (MYSQLND_RES_BUFFERED_ZVAL *) result; - DBG_ENTER("mysqlnd_result_buffered_zval::data_seek"); - - /* libmysql just moves to the end, it does traversing of a linked list */ - if (row >= set->row_count) { - set->data_cursor = NULL; - } else { - set->data_cursor = set->data + row * result->field_count; - } - DBG_RETURN(PASS); -} -/* }}} */ - - -/* {{{ mysqlnd_result_buffered_c::data_seek */ +/* {{{ mysqlnd_result_buffered::data_seek */ static enum_func_status -MYSQLND_METHOD(mysqlnd_result_buffered_c, data_seek)(MYSQLND_RES_BUFFERED * const result, const uint64_t row) +MYSQLND_METHOD(mysqlnd_result_buffered, data_seek)(MYSQLND_RES_BUFFERED * const result, const uint64_t row) { - MYSQLND_RES_BUFFERED_C * set = (MYSQLND_RES_BUFFERED_C *) result; - DBG_ENTER("mysqlnd_result_buffered_c::data_seek"); + DBG_ENTER("mysqlnd_result_buffered::data_seek"); /* libmysql just moves to the end, it does traversing of a linked list */ - if (row >= set->row_count) { - set->current_row = set->row_count; + if (row >= result->row_count) { + result->current_row = result->row_count; } else { - set->current_row = row; + result->current_row = row; } DBG_RETURN(PASS); } @@ -1611,28 +904,6 @@ MYSQLND_METHOD(mysqlnd_res, fetch_field)(MYSQLND_RES * const result) DBG_ENTER("mysqlnd_res::fetch_field"); do { if (result->meta) { - /* - We optimize the result set, so we don't convert all the data from raw buffer format to - zval arrays during store. In the case someone doesn't read all the lines this will - save time. However, when a metadata call is done, we need to calculate max_length. - We don't have control whether max_length will be used, unfortunately. Otherwise we - could have been able to skip that step. - Well, if the mysqli API switches from returning stdClass to class like mysqli_field_metadata, - then we can have max_length as dynamic property, which will be calculated during runtime and - not during mysqli_fetch_field() time. - */ - if (result->stored_data && (result->stored_data->initialized_rows < result->stored_data->row_count)) { - const MYSQLND_CONN_DATA * const conn = result->conn; - DBG_INF_FMT("We have decode the whole result set to be able to satisfy this meta request"); - /* we have to initialize the rest to get the updated max length */ - if (PASS != result->stored_data->m.initialize_result_set_rest(result->stored_data, - result->meta, - conn->stats, - conn->options->int_and_float_native)) - { - break; - } - } DBG_RETURN(result->meta->m->fetch_field(result->meta)); } } while (0); @@ -1648,28 +919,6 @@ MYSQLND_METHOD(mysqlnd_res, fetch_field_direct)(MYSQLND_RES * const result, cons DBG_ENTER("mysqlnd_res::fetch_field_direct"); do { if (result->meta) { - /* - We optimize the result set, so we don't convert all the data from raw buffer format to - zval arrays during store. In the case someone doesn't read all the lines this will - save time. However, when a metadata call is done, we need to calculate max_length. - We don't have control whether max_length will be used, unfortunately. Otherwise we - could have been able to skip that step. - Well, if the mysqli API switches from returning stdClass to class like mysqli_field_metadata, - then we can have max_length as dynamic property, which will be calculated during runtime and - not during mysqli_fetch_field_direct() time. - */ - if (result->stored_data && (result->stored_data->initialized_rows < result->stored_data->row_count)) { - const MYSQLND_CONN_DATA * const conn = result->conn; - DBG_INF_FMT("We have decode the whole result set to be able to satisfy this meta request"); - /* we have to initialized the rest to get the updated max length */ - if (PASS != result->stored_data->m.initialize_result_set_rest(result->stored_data, - result->meta, - conn->stats, - conn->options->int_and_float_native)) - { - break; - } - } DBG_RETURN(result->meta->m->fetch_field_direct(result->meta, fieldnr)); } } while (0); @@ -1686,17 +935,6 @@ MYSQLND_METHOD(mysqlnd_res, fetch_fields)(MYSQLND_RES * const result) DBG_ENTER("mysqlnd_res::fetch_fields"); do { if (result->meta) { - if (result->stored_data && (result->stored_data->initialized_rows < result->stored_data->row_count)) { - const MYSQLND_CONN_DATA * const conn = result->conn; - /* we have to initialize the rest to get the updated max length */ - if (PASS != result->stored_data->m.initialize_result_set_rest(result->stored_data, - result->meta, - conn->stats, - conn->options->int_and_float_native)) - { - break; - } - } DBG_RETURN(result->meta->m->fetch_fields(result->meta)); } } while (0); @@ -1726,43 +964,56 @@ MYSQLND_METHOD(mysqlnd_res, field_tell)(const MYSQLND_RES * const result) /* {{{ mysqlnd_res::fetch_into */ static void MYSQLND_METHOD(mysqlnd_res, fetch_into)(MYSQLND_RES * result, const unsigned int flags, - zval *return_value, - enum_mysqlnd_extension extension ZEND_FILE_LINE_DC) + zval *return_value ZEND_FILE_LINE_DC) { zend_bool fetched_anything; - unsigned int array_size; + zval *row_data; DBG_ENTER("mysqlnd_res::fetch_into"); + if (FAIL == result->m.fetch_row(result, &row_data, flags, &fetched_anything)) { + php_error_docref(NULL, E_WARNING, "Error while reading a row"); + RETVAL_FALSE; + DBG_VOID_RETURN; + } else if (fetched_anything == FALSE) { + RETVAL_NULL(); + DBG_VOID_RETURN; + } - /* - Hint Zend how many elements we will have in the hash. Thus it won't - extend and rehash the hash constantly. - */ - array_size = result->field_count; + const MYSQLND_RES_METADATA * const meta = result->meta; + unsigned int array_size = meta->field_count; if ((flags & (MYSQLND_FETCH_NUM|MYSQLND_FETCH_ASSOC)) == (MYSQLND_FETCH_NUM|MYSQLND_FETCH_ASSOC)) { array_size *= 2; } array_init_size(return_value, array_size); - if (FAIL == result->m.fetch_row(result, (void *)return_value, flags, &fetched_anything)) { - php_error_docref(NULL, E_WARNING, "Error while reading a row"); - zend_array_destroy(Z_ARR_P(return_value)); - RETVAL_FALSE; - } else if (fetched_anything == FALSE) { - zend_array_destroy(Z_ARR_P(return_value)); - switch (extension) { - case MYSQLND_MYSQLI: - RETVAL_NULL(); - break; - case MYSQLND_MYSQL: - RETVAL_FALSE; - break; - default:exit(0); + + HashTable *row_ht = Z_ARRVAL_P(return_value); + MYSQLND_FIELD *field = meta->fields; + for (unsigned i = 0; i < meta->field_count; i++, field++) { + zval *data = &row_data[i]; + + if (flags & MYSQLND_FETCH_NUM) { + if (zend_hash_index_add(row_ht, i, data) != NULL) { + Z_TRY_ADDREF_P(data); + } } + if (flags & MYSQLND_FETCH_ASSOC) { + /* zend_hash_quick_update needs length + trailing zero */ + /* QQ: Error handling ? */ + /* + zend_hash_quick_update does not check, as add_assoc_zval_ex do, whether + the index is a numeric and convert it to it. This however means constant + hashing of the column name, which is not needed as it can be precomputed. + */ + Z_TRY_ADDREF_P(data); + if (meta->fields[i].is_numeric == FALSE) { + zend_hash_update(row_ht, meta->fields[i].sname, data); + } else { + zend_hash_index_update(row_ht, meta->fields[i].num_key, data); + } + } + + zval_ptr_dtor_nogc(data); } - /* - return_value is IS_NULL for no more data and an array for data. Thus it's ok - to return here. - */ DBG_VOID_RETURN; } /* }}} */ @@ -1773,16 +1024,26 @@ static MYSQLND_ROW_C MYSQLND_METHOD(mysqlnd_res, fetch_row_c)(MYSQLND_RES * result) { zend_bool fetched_anything; + zval *row_data; MYSQLND_ROW_C ret = NULL; DBG_ENTER("mysqlnd_res::fetch_row_c"); - if (result->stored_data && result->stored_data->m.fetch_row == MYSQLND_METHOD(mysqlnd_result_buffered_zval, fetch_row)) { - MYSQLND_METHOD(mysqlnd_result_buffered, fetch_row_c)(result, (void *) &ret, 0, &fetched_anything); - } else if (result->unbuf && result->unbuf->m.fetch_row == MYSQLND_METHOD(mysqlnd_result_unbuffered, fetch_row)) { - MYSQLND_METHOD(mysqlnd_result_unbuffered, fetch_row_c)(result, (void *) &ret, 0, &fetched_anything); - } else { - ret = NULL; - php_error_docref(NULL, E_ERROR, "result->m.fetch_row has invalid value. Report to the developers"); + mysqlnd_result_free_prev_data(result); + if (result->m.fetch_row(result, &row_data, 0, &fetched_anything) == PASS && fetched_anything) { + unsigned field_count = result->field_count; + MYSQLND_FIELD *field = result->meta->fields; + + ret = mnd_emalloc(field_count * sizeof(char *)); + for (unsigned i = 0; i < field_count; i++, field++) { + zval *data = &row_data[i]; + if (Z_TYPE_P(data) != IS_NULL) { + convert_to_string(data); + ret[i] = Z_STRVAL_P(data); + } else { + ret[i] = NULL; + } + } + result->free_row_data = 1; } DBG_RETURN(ret); } @@ -1812,7 +1073,7 @@ MYSQLND_METHOD(mysqlnd_res, fetch_all)(MYSQLND_RES * result, const unsigned int array_init_size(return_value, set? (unsigned int) set->row_count : 4); do { - mysqlnd_fetch_into(result, flags, &row, MYSQLND_MYSQLI); + mysqlnd_fetch_into(result, flags, &row); if (Z_TYPE(row) != IS_ARRAY) { zval_ptr_dtor_nogc(&row); break; @@ -1825,42 +1086,6 @@ MYSQLND_METHOD(mysqlnd_res, fetch_all)(MYSQLND_RES * result, const unsigned int /* }}} */ -/* {{{ mysqlnd_res::fetch_field_data */ -static void -MYSQLND_METHOD(mysqlnd_res, fetch_field_data)(MYSQLND_RES * result, const unsigned int offset, zval *return_value) -{ - zval row; - zval *entry; - unsigned int i = 0; - - DBG_ENTER("mysqlnd_res::fetch_field_data"); - DBG_INF_FMT("offset=%u", offset); - /* - Hint Zend how many elements we will have in the hash. Thus it won't - extend and rehash the hash constantly. - */ - mysqlnd_fetch_into(result, MYSQLND_FETCH_NUM, &row, MYSQLND_MYSQL); - if (Z_TYPE(row) != IS_ARRAY) { - zval_ptr_dtor_nogc(&row); - RETVAL_NULL(); - DBG_VOID_RETURN; - } - - zend_hash_internal_pointer_reset(Z_ARRVAL(row)); - while (i++ < offset) { - zend_hash_move_forward(Z_ARRVAL(row)); - } - - entry = zend_hash_get_current_data(Z_ARRVAL(row)); - - ZVAL_COPY(return_value, entry); - zval_ptr_dtor_nogc(&row); - - DBG_VOID_RETURN; -} -/* }}} */ - - MYSQLND_CLASS_METHODS_START(mysqlnd_res) MYSQLND_METHOD(mysqlnd_res, fetch_row), MYSQLND_METHOD(mysqlnd_res, use_result), @@ -1868,7 +1093,6 @@ MYSQLND_CLASS_METHODS_START(mysqlnd_res) MYSQLND_METHOD(mysqlnd_res, fetch_into), MYSQLND_METHOD(mysqlnd_res, fetch_row_c), MYSQLND_METHOD(mysqlnd_res, fetch_all), - MYSQLND_METHOD(mysqlnd_res, fetch_field_data), MYSQLND_METHOD(mysqlnd_res, num_rows), MYSQLND_METHOD(mysqlnd_res, num_fields), MYSQLND_METHOD(mysqlnd_res, skip_result), @@ -1883,7 +1107,6 @@ MYSQLND_CLASS_METHODS_START(mysqlnd_res) MYSQLND_METHOD(mysqlnd_res, store_result_fetch_data), MYSQLND_METHOD(mysqlnd_res, free_result_buffers), MYSQLND_METHOD(mysqlnd_res, free_result), - MYSQLND_METHOD(mysqlnd_res, free_result_internal), MYSQLND_METHOD(mysqlnd_res, free_result_contents_internal), mysqlnd_result_meta_init, NULL, /* unused1 */ @@ -1899,18 +1122,16 @@ MYSQLND_CLASS_METHODS_START(mysqlnd_result_unbuffered) NULL, /* row_decoder */ MYSQLND_METHOD(mysqlnd_result_unbuffered, num_rows), MYSQLND_METHOD(mysqlnd_result_unbuffered, fetch_lengths), - MYSQLND_METHOD(mysqlnd_result_unbuffered, free_last_data), MYSQLND_METHOD(mysqlnd_result_unbuffered, free_result) MYSQLND_CLASS_METHODS_END; MYSQLND_CLASS_METHODS_START(mysqlnd_result_buffered) - NULL, /* fetch_row */ + MYSQLND_METHOD(mysqlnd_result_buffered, fetch_row), NULL, /* row_decoder */ MYSQLND_METHOD(mysqlnd_result_buffered, num_rows), - NULL, /* fetch_lengths */ - NULL, /* data_seek */ - NULL, /* initialize_result_set_rest */ + MYSQLND_METHOD(mysqlnd_result_buffered, fetch_lengths), + MYSQLND_METHOD(mysqlnd_result_buffered, data_seek), MYSQLND_METHOD(mysqlnd_result_buffered, free_result) MYSQLND_CLASS_METHODS_END; @@ -1933,6 +1154,9 @@ mysqlnd_result_init(const unsigned int field_count) ret = pool->get_chunk(pool, alloc_size); memset(ret, 0, alloc_size); + ret->row_data = pool->get_chunk(pool, field_count * sizeof(zval)); + ret->free_row_data = 0; + ret->memory_pool = pool; ret->field_count = field_count; ret->m = *mysqlnd_result_get_methods(); @@ -1946,7 +1170,7 @@ mysqlnd_result_init(const unsigned int field_count) /* {{{ mysqlnd_result_unbuffered_init */ PHPAPI MYSQLND_RES_UNBUFFERED * -mysqlnd_result_unbuffered_init(MYSQLND_RES *result, const unsigned int field_count, const zend_bool ps) +mysqlnd_result_unbuffered_init(MYSQLND_RES *result, const unsigned int field_count, MYSQLND_STMT_DATA *stmt) { const size_t alloc_size = sizeof(MYSQLND_RES_UNBUFFERED) + mysqlnd_plugin_count() * sizeof(void *); MYSQLND_MEMORY_POOL * pool = result->memory_pool; @@ -1957,104 +1181,58 @@ mysqlnd_result_unbuffered_init(MYSQLND_RES *result, const unsigned int field_cou ret = pool->get_chunk(pool, alloc_size); memset(ret, 0, alloc_size); - ret->lengths = pool->get_chunk(pool, field_count * sizeof(size_t)); - memset(ret->lengths, 0, field_count * sizeof(size_t)); - ret->result_set_memory_pool = pool; - ret->field_count= field_count; - ret->ps = ps; + ret->field_count = field_count; + ret->stmt = stmt; ret->m = *mysqlnd_result_unbuffered_get_methods(); - if (ps) { + if (stmt) { + ret->m.row_decoder = php_mysqlnd_rowp_read_binary_protocol; ret->m.fetch_lengths = NULL; /* makes no sense */ - ret->m.row_decoder = php_mysqlnd_rowp_read_binary_protocol; + ret->lengths = NULL; } else { - ret->m.row_decoder = php_mysqlnd_rowp_read_text_protocol_zval; - } - - DBG_RETURN(ret); -} -/* }}} */ - - -/* {{{ mysqlnd_result_buffered_zval_init */ -PHPAPI MYSQLND_RES_BUFFERED_ZVAL * -mysqlnd_result_buffered_zval_init(MYSQLND_RES * result, const unsigned int field_count, const zend_bool ps) -{ - const size_t alloc_size = sizeof(MYSQLND_RES_BUFFERED_ZVAL) + mysqlnd_plugin_count() * sizeof(void *); - MYSQLND_MEMORY_POOL * pool = result->memory_pool; - MYSQLND_RES_BUFFERED_ZVAL * ret; - - DBG_ENTER("mysqlnd_result_buffered_zval_init"); - - ret = pool->get_chunk(pool, alloc_size); - memset(ret, 0, alloc_size); + ret->m.row_decoder = php_mysqlnd_rowp_read_text_protocol; - if (FAIL == mysqlnd_error_info_init(&ret->error_info, 0)) { - DBG_RETURN(NULL); + ret->lengths = pool->get_chunk(pool, field_count * sizeof(size_t)); + memset(ret->lengths, 0, field_count * sizeof(size_t)); } - ret->lengths = pool->get_chunk(pool, field_count * sizeof(size_t)); - memset(ret->lengths, 0, field_count * sizeof(size_t)); - - ret->result_set_memory_pool = pool; - ret->field_count= field_count; - ret->ps = ps; - ret->m = *mysqlnd_result_buffered_get_methods(); - ret->type = MYSQLND_BUFFERED_TYPE_ZVAL; - - if (ps) { - ret->m.fetch_lengths = NULL; /* makes no sense */ - ret->m.row_decoder = php_mysqlnd_rowp_read_binary_protocol; - } else { - ret->m.row_decoder = php_mysqlnd_rowp_read_text_protocol_zval; - } - ret->m.fetch_row = MYSQLND_METHOD(mysqlnd_result_buffered_zval, fetch_row); - ret->m.fetch_lengths = MYSQLND_METHOD(mysqlnd_result_buffered_zval, fetch_lengths); - ret->m.data_seek = MYSQLND_METHOD(mysqlnd_result_buffered_zval, data_seek); - ret->m.initialize_result_set_rest = MYSQLND_METHOD(mysqlnd_result_buffered_zval, initialize_result_set_rest); DBG_RETURN(ret); } /* }}} */ -/* {{{ mysqlnd_result_buffered_c_init */ -PHPAPI MYSQLND_RES_BUFFERED_C * -mysqlnd_result_buffered_c_init(MYSQLND_RES * result, const unsigned int field_count, const zend_bool ps) +/* {{{ mysqlnd_result_buffered_init */ +PHPAPI MYSQLND_RES_BUFFERED * +mysqlnd_result_buffered_init(MYSQLND_RES * result, const unsigned int field_count, MYSQLND_STMT_DATA *stmt) { - const size_t alloc_size = sizeof(MYSQLND_RES_BUFFERED_C) + mysqlnd_plugin_count() * sizeof(void *); + const size_t alloc_size = sizeof(MYSQLND_RES_BUFFERED) + mysqlnd_plugin_count() * sizeof(void *); MYSQLND_MEMORY_POOL * pool = result->memory_pool; - MYSQLND_RES_BUFFERED_C * ret; + MYSQLND_RES_BUFFERED * ret; - DBG_ENTER("mysqlnd_result_buffered_c_init"); + DBG_ENTER("mysqlnd_result_buffered_init"); ret = pool->get_chunk(pool, alloc_size); memset(ret, 0, alloc_size); - if (FAIL == mysqlnd_error_info_init(&ret->error_info, 0)) { - DBG_RETURN(NULL); - } - - ret->lengths = pool->get_chunk(pool, field_count * sizeof(size_t)); - memset(ret->lengths, 0, field_count * sizeof(size_t)); + mysqlnd_error_info_init(&ret->error_info, /* persistent */ 0); ret->result_set_memory_pool = pool; ret->field_count= field_count; - ret->ps = ps; + ret->stmt = stmt; ret->m = *mysqlnd_result_buffered_get_methods(); - ret->type = MYSQLND_BUFFERED_TYPE_C; - if (ps) { + if (stmt) { + ret->m.row_decoder = php_mysqlnd_rowp_read_binary_protocol; ret->m.fetch_lengths = NULL; /* makes no sense */ - ret->m.row_decoder = php_mysqlnd_rowp_read_binary_protocol; + ret->lengths = NULL; } else { - ret->m.row_decoder = php_mysqlnd_rowp_read_text_protocol_c; + ret->m.row_decoder = php_mysqlnd_rowp_read_text_protocol; + + ret->lengths = pool->get_chunk(pool, field_count * sizeof(size_t)); + memset(ret->lengths, 0, field_count * sizeof(size_t)); } - ret->m.fetch_row = MYSQLND_METHOD(mysqlnd_result_buffered_c, fetch_row); - ret->m.fetch_lengths = MYSQLND_METHOD(mysqlnd_result_buffered_c, fetch_lengths); - ret->m.data_seek = MYSQLND_METHOD(mysqlnd_result_buffered_c, data_seek); - ret->m.initialize_result_set_rest = MYSQLND_METHOD(mysqlnd_result_buffered_c, initialize_result_set_rest); DBG_RETURN(ret); } diff --git a/ext/mysqlnd/mysqlnd_result.h b/ext/mysqlnd/mysqlnd_result.h index 14f894ccba407..9dde8a5fade42 100644 --- a/ext/mysqlnd/mysqlnd_result.h +++ b/ext/mysqlnd/mysqlnd_result.h @@ -19,9 +19,8 @@ #define MYSQLND_RESULT_H PHPAPI MYSQLND_RES * mysqlnd_result_init(const unsigned int field_count); -PHPAPI MYSQLND_RES_UNBUFFERED * mysqlnd_result_unbuffered_init(MYSQLND_RES * result, const unsigned int field_count, const zend_bool ps); -PHPAPI MYSQLND_RES_BUFFERED_ZVAL * mysqlnd_result_buffered_zval_init(MYSQLND_RES * result, const unsigned int field_count, const zend_bool ps); -PHPAPI MYSQLND_RES_BUFFERED_C * mysqlnd_result_buffered_c_init(MYSQLND_RES * result, const unsigned int field_count, const zend_bool ps); +PHPAPI MYSQLND_RES_UNBUFFERED * mysqlnd_result_unbuffered_init(MYSQLND_RES * result, const unsigned int field_count, MYSQLND_STMT_DATA *stmt); +PHPAPI MYSQLND_RES_BUFFERED * mysqlnd_result_buffered_init(MYSQLND_RES * result, const unsigned int field_count, MYSQLND_STMT_DATA *stmt); enum_func_status mysqlnd_query_read_result_set_header(MYSQLND_CONN_DATA * conn, MYSQLND_STMT * stmt); diff --git a/ext/mysqlnd/mysqlnd_result_meta.c b/ext/mysqlnd/mysqlnd_result_meta.c index 1cbc438b44cc1..9af4b0e1527f7 100644 --- a/ext/mysqlnd/mysqlnd_result_meta.c +++ b/ext/mysqlnd/mysqlnd_result_meta.c @@ -215,9 +215,8 @@ MYSQLND_METHOD(mysqlnd_res_meta, fetch_field)(MYSQLND_RES_METADATA * const meta) DBG_INF("no more fields"); DBG_RETURN(NULL); } - DBG_INF_FMT("name=%s max_length=%u", - meta->fields[meta->current_field].name? meta->fields[meta->current_field].name:"", - meta->fields[meta->current_field].max_length); + DBG_INF_FMT("name=%s", + meta->fields[meta->current_field].name? meta->fields[meta->current_field].name:""); DBG_RETURN(&meta->fields[meta->current_field++]); } /* }}} */ @@ -229,9 +228,8 @@ MYSQLND_METHOD(mysqlnd_res_meta, fetch_field_direct)(const MYSQLND_RES_METADATA { DBG_ENTER("mysqlnd_res_meta::fetch_field_direct"); DBG_INF_FMT("fieldnr=%u", fieldnr); - DBG_INF_FMT("name=%s max_length=%u", - meta->fields[meta->current_field].name? meta->fields[meta->current_field].name:"", - meta->fields[meta->current_field].max_length); + DBG_INF_FMT("name=%s", + meta->fields[meta->current_field].name? meta->fields[meta->current_field].name:""); DBG_RETURN(&meta->fields[fieldnr]); } /* }}} */ @@ -289,20 +287,17 @@ mysqlnd_result_meta_init(MYSQLND_RES *result, unsigned int field_count) MYSQLND_RES_METADATA *ret; DBG_ENTER("mysqlnd_result_meta_init"); - do { - ret = result->memory_pool->get_chunk(result->memory_pool, alloc_size); - memset(ret, 0, alloc_size); - ret->m = & mysqlnd_mysqlnd_res_meta_methods; - - ret->field_count = field_count; - /* +1 is to have empty marker at the end */ - alloc_size = (field_count + 1) * sizeof(MYSQLND_FIELD); - ret->fields = result->memory_pool->get_chunk(result->memory_pool, alloc_size); - memset(ret->fields, 0, alloc_size); - DBG_INF_FMT("meta=%p", ret); - DBG_RETURN(ret); - } while (0); - DBG_RETURN(NULL); + ret = result->memory_pool->get_chunk(result->memory_pool, alloc_size); + memset(ret, 0, alloc_size); + ret->m = & mysqlnd_mysqlnd_res_meta_methods; + + ret->field_count = field_count; + /* +1 is to have empty marker at the end */ + alloc_size = (field_count + 1) * sizeof(MYSQLND_FIELD); + ret->fields = result->memory_pool->get_chunk(result->memory_pool, alloc_size); + memset(ret->fields, 0, alloc_size); + DBG_INF_FMT("meta=%p", ret); + DBG_RETURN(ret); } /* }}} */ diff --git a/ext/mysqlnd/mysqlnd_structs.h b/ext/mysqlnd/mysqlnd_structs.h index ee3dba0e87c51..47c8e491ec08d 100644 --- a/ext/mysqlnd/mysqlnd_structs.h +++ b/ext/mysqlnd/mysqlnd_structs.h @@ -89,7 +89,6 @@ typedef struct st_mysqlnd_field const char *catalog; /* Catalog for table */ char *def; /* Default value */ zend_ulong length; /* Width of column (create length) */ - zend_ulong max_length; /* Max width for selected set */ unsigned int name_length; unsigned int org_name_length; unsigned int table_length; @@ -231,9 +230,7 @@ typedef struct st_mysqlnd_session_options /* maximum allowed packet size for communication */ unsigned int max_allowed_packet; -#ifdef MYSQLND_STRING_TO_INT_CONVERSION zend_bool int_and_float_native; -#endif } MYSQLND_SESSION_OPTIONS; @@ -282,9 +279,7 @@ typedef struct st_mysqlnd_param_bind MYSQLND_PARAM_BIND; typedef struct st_mysqlnd_result_bind MYSQLND_RESULT_BIND; typedef struct st_mysqlnd_result_metadata MYSQLND_RES_METADATA; -typedef struct st_mysqlnd_buffered_result_parent MYSQLND_RES_BUFFERED; -typedef struct st_mysqlnd_buffered_result_zval MYSQLND_RES_BUFFERED_ZVAL; -typedef struct st_mysqlnd_buffered_result_c MYSQLND_RES_BUFFERED_C; +typedef struct st_mysqlnd_buffered_result MYSQLND_RES_BUFFERED; typedef struct st_mysqlnd_unbuffered_result MYSQLND_RES_UNBUFFERED; typedef struct st_mysqlnd_debug MYSQLND_DEBUG; @@ -292,7 +287,7 @@ typedef struct st_mysqlnd_debug MYSQLND_DEBUG; typedef MYSQLND_RES* (*mysqlnd_stmt_use_or_store_func)(MYSQLND_STMT * const); typedef enum_func_status (*mysqlnd_fetch_row_func)(MYSQLND_RES *result, - void * param, + zval **row, const unsigned int flags, zend_bool * fetched_anything ); @@ -444,8 +439,8 @@ typedef enum_func_status (*func_mysqlnd_conn_data__set_charset)(MYSQLND_CONN_DAT typedef enum_func_status (*func_mysqlnd_conn_data__query)(MYSQLND_CONN_DATA * conn, const char * const query, const size_t query_len); typedef enum_func_status (*func_mysqlnd_conn_data__send_query)(MYSQLND_CONN_DATA * conn, const char * const query, const size_t query_len, enum_mysqlnd_send_query_type type, zval *read_cb, zval *err_cb); typedef enum_func_status (*func_mysqlnd_conn_data__reap_query)(MYSQLND_CONN_DATA * conn, enum_mysqlnd_reap_result_type type); -typedef MYSQLND_RES * (*func_mysqlnd_conn_data__use_result)(MYSQLND_CONN_DATA * const conn, const unsigned int flags); -typedef MYSQLND_RES * (*func_mysqlnd_conn_data__store_result)(MYSQLND_CONN_DATA * const conn, const unsigned int flags); +typedef MYSQLND_RES * (*func_mysqlnd_conn_data__use_result)(MYSQLND_CONN_DATA * const conn); +typedef MYSQLND_RES * (*func_mysqlnd_conn_data__store_result)(MYSQLND_CONN_DATA * const conn); typedef enum_func_status (*func_mysqlnd_conn_data__next_result)(MYSQLND_CONN_DATA * const conn); typedef zend_bool (*func_mysqlnd_conn_data__more_results)(const MYSQLND_CONN_DATA * const conn); @@ -641,12 +636,11 @@ typedef enum_func_status (*func_mysqlnd_res__row_decoder)(MYSQLND_ROW_BUFFER * r const zend_bool as_int_or_float, MYSQLND_STATS * const stats); -typedef MYSQLND_RES * (*func_mysqlnd_res__use_result)(MYSQLND_RES * const result, const zend_bool ps_protocol); -typedef MYSQLND_RES * (*func_mysqlnd_res__store_result)(MYSQLND_RES * result, MYSQLND_CONN_DATA * const conn, const unsigned int flags); -typedef void (*func_mysqlnd_res__fetch_into)(MYSQLND_RES *result, const unsigned int flags, zval *return_value, enum_mysqlnd_extension ext ZEND_FILE_LINE_DC); +typedef MYSQLND_RES * (*func_mysqlnd_res__use_result)(MYSQLND_RES * const result, MYSQLND_STMT_DATA *stmt); +typedef MYSQLND_RES * (*func_mysqlnd_res__store_result)(MYSQLND_RES * result, MYSQLND_CONN_DATA * const conn, MYSQLND_STMT_DATA *stmt); +typedef void (*func_mysqlnd_res__fetch_into)(MYSQLND_RES *result, const unsigned int flags, zval *return_value ZEND_FILE_LINE_DC); typedef MYSQLND_ROW_C (*func_mysqlnd_res__fetch_row_c)(MYSQLND_RES *result); typedef void (*func_mysqlnd_res__fetch_all)(MYSQLND_RES *result, const unsigned int flags, zval *return_value ZEND_FILE_LINE_DC); -typedef void (*func_mysqlnd_res__fetch_field_data)(MYSQLND_RES *result, const unsigned int offset, zval *return_value); typedef uint64_t (*func_mysqlnd_res__num_rows)(const MYSQLND_RES * const result); typedef unsigned int (*func_mysqlnd_res__num_fields)(const MYSQLND_RES * const result); typedef enum_func_status (*func_mysqlnd_res__skip_result)(MYSQLND_RES * const result); @@ -663,10 +657,8 @@ typedef enum_func_status (*func_mysqlnd_res__store_result_fetch_data)(MYSQLND_CO typedef void (*func_mysqlnd_res__free_result_buffers)(MYSQLND_RES * result); /* private */ typedef enum_func_status (*func_mysqlnd_res__free_result)(MYSQLND_RES * result, const zend_bool implicit); -typedef void (*func_mysqlnd_res__free_result_internal)(MYSQLND_RES *result); typedef void (*func_mysqlnd_res__free_result_contents)(MYSQLND_RES *result); typedef void (*func_mysqlnd_res__free_buffered_data)(MYSQLND_RES *result); -typedef void (*func_mysqlnd_res__unbuffered_free_last_data)(MYSQLND_RES *result); typedef MYSQLND_RES_METADATA * (*func_mysqlnd_res__result_meta_init)(MYSQLND_RES *result, unsigned int field_count); @@ -680,7 +672,6 @@ MYSQLND_CLASS_METHODS_TYPE(mysqlnd_res) func_mysqlnd_res__fetch_into fetch_into; func_mysqlnd_res__fetch_row_c fetch_row_c; func_mysqlnd_res__fetch_all fetch_all; - func_mysqlnd_res__fetch_field_data fetch_field_data; func_mysqlnd_res__num_rows num_rows; func_mysqlnd_res__num_fields num_fields; func_mysqlnd_res__skip_result skip_result; @@ -695,7 +686,6 @@ MYSQLND_CLASS_METHODS_TYPE(mysqlnd_res) func_mysqlnd_res__store_result_fetch_data store_result_fetch_data; func_mysqlnd_res__free_result_buffers free_result_buffers; func_mysqlnd_res__free_result free_result; - func_mysqlnd_res__free_result_internal free_result_internal; func_mysqlnd_res__free_result_contents free_result_contents; func_mysqlnd_res__result_meta_init result_meta_init; @@ -710,7 +700,6 @@ MYSQLND_CLASS_METHODS_TYPE(mysqlnd_res) typedef uint64_t (*func_mysqlnd_result_unbuffered__num_rows)(const MYSQLND_RES_UNBUFFERED * const result); typedef const size_t * (*func_mysqlnd_result_unbuffered__fetch_lengths)(const MYSQLND_RES_UNBUFFERED * const result); -typedef void (*func_mysqlnd_result_unbuffered__free_last_data)(MYSQLND_RES_UNBUFFERED * result, MYSQLND_STATS * const global_stats); typedef void (*func_mysqlnd_result_unbuffered__free_result)(MYSQLND_RES_UNBUFFERED * const result, MYSQLND_STATS * const global_stats); MYSQLND_CLASS_METHODS_TYPE(mysqlnd_result_unbuffered) @@ -719,13 +708,10 @@ MYSQLND_CLASS_METHODS_TYPE(mysqlnd_result_unbuffered) func_mysqlnd_res__row_decoder row_decoder; func_mysqlnd_result_unbuffered__num_rows num_rows; func_mysqlnd_result_unbuffered__fetch_lengths fetch_lengths; - func_mysqlnd_result_unbuffered__free_last_data free_last_data; func_mysqlnd_result_unbuffered__free_result free_result; }; typedef uint64_t (*func_mysqlnd_result_buffered__num_rows)(const MYSQLND_RES_BUFFERED * const result); -typedef enum_func_status (*func_mysqlnd_result_buffered__initialize_result_set_rest)(MYSQLND_RES_BUFFERED * const result, MYSQLND_RES_METADATA * const meta, - MYSQLND_STATS * stats, const zend_bool int_and_float_native); typedef const size_t * (*func_mysqlnd_result_buffered__fetch_lengths)(const MYSQLND_RES_BUFFERED * const result); typedef enum_func_status (*func_mysqlnd_result_buffered__data_seek)(MYSQLND_RES_BUFFERED * const result, const uint64_t row); typedef void (*func_mysqlnd_result_buffered__free_result)(MYSQLND_RES_BUFFERED * const result); @@ -737,7 +723,6 @@ MYSQLND_CLASS_METHODS_TYPE(mysqlnd_result_buffered) func_mysqlnd_result_buffered__num_rows num_rows; func_mysqlnd_result_buffered__fetch_lengths fetch_lengths; func_mysqlnd_result_buffered__data_seek data_seek; - func_mysqlnd_result_buffered__initialize_result_set_rest initialize_result_set_rest; func_mysqlnd_result_buffered__free_result free_result; }; @@ -1188,50 +1173,30 @@ struct st_mysqlnd_result_metadata }; -#define def_mysqlnd_buffered_result_parent \ - MYSQLND_ROW_BUFFER *row_buffers; \ - uint64_t row_count; \ - uint64_t initialized_rows; \ - \ - /* Column lengths of current row - both buffered and unbuffered. For buffered results it duplicates the data found in **data */ \ - size_t *lengths; \ - \ - MYSQLND_MEMORY_POOL *result_set_memory_pool; \ - \ - unsigned int references; \ - \ - MYSQLND_ERROR_INFO error_info; \ - \ - unsigned int field_count; \ - zend_bool ps; \ - MYSQLND_CLASS_METHODS_TYPE(mysqlnd_result_buffered) m; \ - enum mysqlnd_buffered_type type; \ - void * unused1; \ - void * unused2; \ - void * unused3 - - -struct st_mysqlnd_buffered_result_parent +struct st_mysqlnd_buffered_result { - def_mysqlnd_buffered_result_parent; -}; + MYSQLND_CLASS_METHODS_TYPE(mysqlnd_result_buffered) m; + MYSQLND_ROW_BUFFER *row_buffers; + uint64_t row_count; -struct st_mysqlnd_buffered_result_zval -{ - def_mysqlnd_buffered_result_parent; + /* Column lengths of current row - both buffered and unbuffered. For buffered results it duplicates the data found in **data */ + size_t *lengths; - zval *data; - zval *data_cursor; -}; + MYSQLND_MEMORY_POOL *result_set_memory_pool; + unsigned int references; -struct st_mysqlnd_buffered_result_c -{ - def_mysqlnd_buffered_result_parent; + MYSQLND_ERROR_INFO error_info; + + unsigned int field_count; + MYSQLND_STMT_DATA *stmt; - zend_uchar *initialized; /* every row is a single bit */ uint64_t current_row; + + void * unused1; + void * unused2; + void * unused3; }; @@ -1241,7 +1206,6 @@ struct st_mysqlnd_unbuffered_result uint64_t row_count; /* For unbuffered (both normal and PS) */ - zval *last_row_data; MYSQLND_ROW_BUFFER last_row_buffer; /* @@ -1258,7 +1222,7 @@ struct st_mysqlnd_unbuffered_result zend_bool eof_reached; - zend_bool ps; + MYSQLND_STMT_DATA *stmt; }; @@ -1268,6 +1232,9 @@ struct st_mysqlnd_res enum_mysqlnd_res_type type; unsigned int field_count; + zval *row_data; + bool free_row_data; + /* For metadata functions */ MYSQLND_RES_METADATA *meta; diff --git a/ext/mysqlnd/mysqlnd_vio.c b/ext/mysqlnd/mysqlnd_vio.c index bc59cbeed845e..e33761f278251 100644 --- a/ext/mysqlnd/mysqlnd_vio.c +++ b/ext/mysqlnd/mysqlnd_vio.c @@ -263,6 +263,7 @@ MYSQLND_METHOD(mysqlnd_vio, post_connect_set_opt)(MYSQLND_VIO * const vio, const } net_stream->chunk_size = vio->data->options.net_read_buffer_size; + net_stream->flags |= PHP_STREAM_FLAG_SUPPRESS_ERRORS; } DBG_VOID_RETURN; diff --git a/ext/mysqlnd/mysqlnd_wireprotocol.c b/ext/mysqlnd/mysqlnd_wireprotocol.c index e11d42d8bd6f8..0d601e5b98263 100644 --- a/ext/mysqlnd/mysqlnd_wireprotocol.c +++ b/ext/mysqlnd/mysqlnd_wireprotocol.c @@ -971,7 +971,6 @@ size_t php_mysqlnd_cmd_write(MYSQLND_CONN_DATA * conn, void * _packet) MYSQLND_VIO * vio = conn->vio; MYSQLND_STATS * stats = conn->stats; MYSQLND_CONNECTION_STATE * connection_state = &conn->state; - const unsigned int error_reporting = EG(error_reporting); size_t sent = 0; DBG_ENTER("php_mysqlnd_cmd_write"); @@ -981,10 +980,6 @@ size_t php_mysqlnd_cmd_write(MYSQLND_CONN_DATA * conn, void * _packet) */ pfc->data->m.reset(pfc, stats, error_info); - if (error_reporting) { - EG(error_reporting) = 0; - } - MYSQLND_INC_CONN_STATISTIC(stats, STAT_PACKETS_SENT_CMD); #ifdef MYSQLND_DO_WIRE_CHECK_BEFORE_COMMAND @@ -1017,10 +1012,6 @@ size_t php_mysqlnd_cmd_write(MYSQLND_CONN_DATA * conn, void * _packet) } } end: - if (error_reporting) { - /* restore error reporting */ - EG(error_reporting) = error_reporting; - } if (!sent) { SET_CONNECTION_STATE(connection_state, CONN_QUIT_SENT); } @@ -1083,14 +1074,9 @@ php_mysqlnd_rset_header_read(MYSQLND_CONN_DATA * conn, void * _packet) */ len = packet->header.size - 1; packet->info_or_local_file.s = mnd_emalloc(len + 1); - if (packet->info_or_local_file.s) { - memcpy(packet->info_or_local_file.s, p, len); - packet->info_or_local_file.s[len] = '\0'; - packet->info_or_local_file.l = len; - } else { - SET_OOM_ERROR(error_info); - ret = FAIL; - } + memcpy(packet->info_or_local_file.s, p, len); + packet->info_or_local_file.s[len] = '\0'; + packet->info_or_local_file.l = len; break; case 0x00: DBG_INF("UPSERT"); @@ -1110,14 +1096,9 @@ php_mysqlnd_rset_header_read(MYSQLND_CONN_DATA * conn, void * _packet) /* Check for additional textual data */ if (packet->header.size > (size_t) (p - buf) && (len = php_mysqlnd_net_field_length(&p))) { packet->info_or_local_file.s = mnd_emalloc(len + 1); - if (packet->info_or_local_file.s) { - memcpy(packet->info_or_local_file.s, p, len); - packet->info_or_local_file.s[len] = '\0'; - packet->info_or_local_file.l = len; - } else { - SET_OOM_ERROR(error_info); - ret = FAIL; - } + memcpy(packet->info_or_local_file.s, p, len); + packet->info_or_local_file.s[len] = '\0'; + packet->info_or_local_file.l = len; } DBG_INF_FMT("affected_rows=%llu last_insert_id=%llu server_status=%u warning_count=%u", packet->affected_rows, packet->last_insert_id, @@ -1388,7 +1369,7 @@ php_mysqlnd_read_row_ex(MYSQLND_PFC * pfc, */ /* - We're allocating an extra byte, as php_mysqlnd_rowp_read_text_protocol_aux + We're allocating an extra byte, as php_mysqlnd_rowp_read_text_protocol needs to be able to append a terminating \0 for atoi/atof. */ prealloc_more_bytes = 1; @@ -1544,7 +1525,7 @@ php_mysqlnd_rowp_read_binary_protocol(MYSQLND_ROW_BUFFER * row_buffer, zval * fi /* {{{ php_mysqlnd_rowp_read_text_protocol */ enum_func_status -php_mysqlnd_rowp_read_text_protocol_aux(MYSQLND_ROW_BUFFER * row_buffer, zval * fields, +php_mysqlnd_rowp_read_text_protocol(MYSQLND_ROW_BUFFER * row_buffer, zval * fields, unsigned int field_count, const MYSQLND_FIELD * fields_metadata, zend_bool as_int_or_float, MYSQLND_STATS * stats) { @@ -1554,7 +1535,7 @@ php_mysqlnd_rowp_read_text_protocol_aux(MYSQLND_ROW_BUFFER * row_buffer, zval * const size_t data_size = row_buffer->size; const zend_uchar * const packet_end = (zend_uchar*) p + data_size; - DBG_ENTER("php_mysqlnd_rowp_read_text_protocol_aux"); + DBG_ENTER("php_mysqlnd_rowp_read_text_protocol"); if (!fields) { DBG_RETURN(FAIL); @@ -1574,10 +1555,8 @@ php_mysqlnd_rowp_read_text_protocol_aux(MYSQLND_ROW_BUFFER * row_buffer, zval * " bytes after end of packet", (p + len) - packet_end - 1); DBG_RETURN(FAIL); } else { -#ifdef MYSQLND_STRING_TO_INT_CONVERSION struct st_mysqlnd_perm_bind perm_bind = mysqlnd_ps_fetch_functions[fields_metadata[i].type]; -#endif if (MYSQLND_G(collect_statistics)) { enum_mysqlnd_collected_stats statistic; switch (fields_metadata[i].type) { @@ -1613,8 +1592,26 @@ php_mysqlnd_rowp_read_text_protocol_aux(MYSQLND_ROW_BUFFER * row_buffer, zval * } MYSQLND_INC_CONN_STATISTIC_W_VALUE2(stats, statistic, 1, STAT_BYTES_RECEIVED_PURE_DATA_TEXT, len); } -#ifdef MYSQLND_STRING_TO_INT_CONVERSION - if (as_int_or_float && perm_bind.php_type == IS_LONG) { + if (fields_metadata[i].type == MYSQL_TYPE_BIT) { + /* + BIT fields are specially handled. As they come as bit mask, they have + to be converted to human-readable representation. + */ + ps_fetch_from_1_to_8_bytes(current_field, &(fields_metadata[i]), 0, (const zend_uchar **) &p, len); + /* + We have advanced in ps_fetch_from_1_to_8_bytes. We should go back because + later in this function there will be an advancement. + */ + p -= len; + if (Z_TYPE_P(current_field) == IS_LONG && !as_int_or_float) { + /* we are using the text protocol, so convert to string */ + char tmp[22]; + const size_t tmp_len = sprintf((char *)&tmp, ZEND_ULONG_FMT, Z_LVAL_P(current_field)); + ZVAL_STRINGL(current_field, tmp, tmp_len); + } else if (Z_TYPE_P(current_field) == IS_STRING) { + /* nothing to do here, as we want a string and ps_fetch_from_1_to_8_bytes() has given us one */ + } + } else if (as_int_or_float && perm_bind.php_type == IS_LONG) { zend_uchar save = *(p + len); /* We have to make it ASCIIZ temporarily */ *(p + len) = '\0'; @@ -1658,27 +1655,6 @@ php_mysqlnd_rowp_read_text_protocol_aux(MYSQLND_ROW_BUFFER * row_buffer, zval * *(p + len) = '\0'; ZVAL_DOUBLE(current_field, atof((char *) p)); *(p + len) = save; - } else -#endif /* MYSQLND_STRING_TO_INT_CONVERSION */ - if (fields_metadata[i].type == MYSQL_TYPE_BIT) { - /* - BIT fields are specially handled. As they come as bit mask, they have - to be converted to human-readable representation. - */ - ps_fetch_from_1_to_8_bytes(current_field, &(fields_metadata[i]), 0, (const zend_uchar **) &p, len); - /* - We have advanced in ps_fetch_from_1_to_8_bytes. We should go back because - later in this function there will be an advancement. - */ - p -= len; - if (Z_TYPE_P(current_field) == IS_LONG && !as_int_or_float) { - /* we are using the text protocol, so convert to string */ - char tmp[22]; - const size_t tmp_len = sprintf((char *)&tmp, ZEND_ULONG_FMT, Z_LVAL_P(current_field)); - ZVAL_STRINGL(current_field, tmp, tmp_len); - } else if (Z_TYPE_P(current_field) == IS_STRING) { - /* nothing to do here, as we want a string and ps_fetch_from_1_to_8_bytes() has given us one */ - } } else { ZVAL_STRINGL_FAST(current_field, (char *)p, len); } @@ -1691,39 +1667,7 @@ php_mysqlnd_rowp_read_text_protocol_aux(MYSQLND_ROW_BUFFER * row_buffer, zval * /* }}} */ -/* {{{ php_mysqlnd_rowp_read_text_protocol_zval */ -enum_func_status -php_mysqlnd_rowp_read_text_protocol_zval(MYSQLND_ROW_BUFFER * row_buffer, zval * fields, - const unsigned int field_count, const MYSQLND_FIELD * fields_metadata, - const zend_bool as_int_or_float, MYSQLND_STATS * stats) -{ - enum_func_status ret; - DBG_ENTER("php_mysqlnd_rowp_read_text_protocol_zval"); - ret = php_mysqlnd_rowp_read_text_protocol_aux(row_buffer, fields, field_count, fields_metadata, as_int_or_float, stats); - DBG_RETURN(ret); -} -/* }}} */ - - -/* {{{ php_mysqlnd_rowp_read_text_protocol_c */ -enum_func_status -php_mysqlnd_rowp_read_text_protocol_c(MYSQLND_ROW_BUFFER * row_buffer, zval * fields, - const unsigned int field_count, const MYSQLND_FIELD * const fields_metadata, - const zend_bool as_int_or_float, MYSQLND_STATS * const stats) -{ - enum_func_status ret; - DBG_ENTER("php_mysqlnd_rowp_read_text_protocol_c"); - ret = php_mysqlnd_rowp_read_text_protocol_aux(row_buffer, fields, field_count, fields_metadata, as_int_or_float, stats); - DBG_RETURN(ret); -} -/* }}} */ - - /* {{{ php_mysqlnd_rowp_read */ -/* - if normal statements => packet->fields is created by this function, - if PS => packet->fields is passed from outside -*/ static enum_func_status php_mysqlnd_rowp_read(MYSQLND_CONN_DATA * conn, void * _packet) { @@ -1784,33 +1728,10 @@ php_mysqlnd_rowp_read(MYSQLND_CONN_DATA * conn, void * _packet) DBG_INF_FMT("server_status=%u warning_count=%u", packet->server_status, packet->warning_count); } } else { + packet->eof = FALSE; MYSQLND_INC_CONN_STATISTIC(stats, packet->binary_protocol? STAT_ROWS_FETCHED_FROM_SERVER_PS: STAT_ROWS_FETCHED_FROM_SERVER_NORMAL); - - packet->eof = FALSE; - /* packet->field_count is set by the user of the packet */ - - if (!packet->skip_extraction) { - if (!packet->fields) { - DBG_INF("Allocating packet->fields"); - /* - old-API will probably set packet->fields to NULL every time, though for - unbuffered sets it makes not much sense as the zvals in this buffer matter, - not the buffer. Constantly allocating and deallocating brings nothing. - - For PS - if stmt_store() is performed, thus we don't have a cursor, it will - behave just like old-API buffered. Cursors will behave like a bit different, - but mostly like old-API unbuffered and thus will populate this array with - value. - */ - packet->fields = mnd_ecalloc(packet->field_count, sizeof(zval)); - } - } else { - MYSQLND_INC_CONN_STATISTIC(stats, - packet->binary_protocol? STAT_ROWS_SKIPPED_PS: - STAT_ROWS_SKIPPED_NORMAL); - } } end: @@ -1831,13 +1752,6 @@ php_mysqlnd_rowp_free_mem(void * _packet) p->result_set_memory_pool->free_chunk(p->result_set_memory_pool, p->row_buffer.ptr); p->row_buffer.ptr = NULL; } - /* - Don't free packet->fields : - - normal queries -> store_result() | fetch_row_unbuffered() will transfer - the ownership and NULL it. - - PS will pass in it the bound variables, we have to use them! and of course - not free the array. As it is passed to us, we should not clean it ourselves. - */ DBG_VOID_RETURN; } /* }}} */ diff --git a/ext/mysqlnd/mysqlnd_wireprotocol.h b/ext/mysqlnd/mysqlnd_wireprotocol.h index e917736bb5bbf..7cbfe0afd6999 100644 --- a/ext/mysqlnd/mysqlnd_wireprotocol.h +++ b/ext/mysqlnd/mysqlnd_wireprotocol.h @@ -206,7 +206,6 @@ typedef struct st_mysqlnd_packet_res_field { /* Row packet */ typedef struct st_mysqlnd_packet_row { MYSQLND_PACKET_HEADER header; - zval *fields; uint32_t field_count; zend_bool eof; /* @@ -219,7 +218,6 @@ typedef struct st_mysqlnd_packet_row { MYSQLND_ROW_BUFFER row_buffer; MYSQLND_MEMORY_POOL * result_set_memory_pool; - zend_bool skip_extraction; zend_bool binary_protocol; MYSQLND_FIELD *fields_metadata; @@ -310,11 +308,7 @@ enum_func_status php_mysqlnd_rowp_read_binary_protocol(MYSQLND_ROW_BUFFER * row_ zend_bool as_int_or_float, MYSQLND_STATS * stats); -enum_func_status php_mysqlnd_rowp_read_text_protocol_zval(MYSQLND_ROW_BUFFER * row_buffer, zval * fields, - unsigned int field_count, const MYSQLND_FIELD * fields_metadata, - zend_bool as_int_or_float, MYSQLND_STATS * stats); - -enum_func_status php_mysqlnd_rowp_read_text_protocol_c(MYSQLND_ROW_BUFFER * row_buffer, zval * fields, +enum_func_status php_mysqlnd_rowp_read_text_protocol(MYSQLND_ROW_BUFFER * row_buffer, zval * fields, unsigned int field_count, const MYSQLND_FIELD * fields_metadata, zend_bool as_int_or_float, MYSQLND_STATS * stats); diff --git a/ext/mysqlnd/php_mysqlnd.c b/ext/mysqlnd/php_mysqlnd.c index 337b9fef7a00b..0152abfdf9db3 100644 --- a/ext/mysqlnd/php_mysqlnd.c +++ b/ext/mysqlnd/php_mysqlnd.c @@ -149,14 +149,10 @@ static PHP_GINIT_FUNCTION(mysqlnd) mysqlnd_globals->net_read_timeout = 31536000; mysqlnd_globals->log_mask = 0; mysqlnd_globals->mempool_default_size = 16000; - mysqlnd_globals->debug_emalloc_fail_threshold = -1; - mysqlnd_globals->debug_ecalloc_fail_threshold = -1; - mysqlnd_globals->debug_erealloc_fail_threshold = -1; mysqlnd_globals->debug_malloc_fail_threshold = -1; mysqlnd_globals->debug_calloc_fail_threshold = -1; mysqlnd_globals->debug_realloc_fail_threshold = -1; mysqlnd_globals->sha256_server_public_key = NULL; - mysqlnd_globals->fetch_data_copy = FALSE; } /* }}} */ @@ -189,11 +185,7 @@ PHP_INI_BEGIN() STD_PHP_INI_ENTRY("mysqlnd.log_mask", "0", PHP_INI_ALL, OnUpdateLong, log_mask, zend_mysqlnd_globals, mysqlnd_globals) STD_PHP_INI_ENTRY("mysqlnd.mempool_default_size","16000", PHP_INI_ALL, OnUpdateLong, mempool_default_size, zend_mysqlnd_globals, mysqlnd_globals) STD_PHP_INI_ENTRY("mysqlnd.sha256_server_public_key",NULL, PHP_INI_PERDIR, OnUpdateString, sha256_server_public_key, zend_mysqlnd_globals, mysqlnd_globals) - STD_PHP_INI_BOOLEAN("mysqlnd.fetch_data_copy", "0", PHP_INI_ALL, OnUpdateBool, fetch_data_copy, zend_mysqlnd_globals, mysqlnd_globals) #if PHP_DEBUG - STD_PHP_INI_ENTRY("mysqlnd.debug_emalloc_fail_threshold","-1", PHP_INI_SYSTEM, OnUpdateLong, debug_emalloc_fail_threshold, zend_mysqlnd_globals, mysqlnd_globals) - STD_PHP_INI_ENTRY("mysqlnd.debug_ecalloc_fail_threshold","-1", PHP_INI_SYSTEM, OnUpdateLong, debug_ecalloc_fail_threshold, zend_mysqlnd_globals, mysqlnd_globals) - STD_PHP_INI_ENTRY("mysqlnd.debug_erealloc_fail_threshold","-1", PHP_INI_SYSTEM, OnUpdateLong, debug_erealloc_fail_threshold, zend_mysqlnd_globals, mysqlnd_globals) STD_PHP_INI_ENTRY("mysqlnd.debug_malloc_fail_threshold","-1", PHP_INI_SYSTEM, OnUpdateLong, debug_malloc_fail_threshold, zend_mysqlnd_globals, mysqlnd_globals) STD_PHP_INI_ENTRY("mysqlnd.debug_calloc_fail_threshold","-1", PHP_INI_SYSTEM, OnUpdateLong, debug_calloc_fail_threshold, zend_mysqlnd_globals, mysqlnd_globals) diff --git a/ext/oci8/README.md b/ext/oci8/README.md index a47be7ccd9ac1..eb2149e21dd95 100644 --- a/ext/oci8/README.md +++ b/ext/oci8/README.md @@ -4,20 +4,22 @@ Use the OCI8 extension to access Oracle Database. Documentation is at https://www.php.net/oci8 -Use `pecl install oci8` to install for PHP 7. +Use `pecl install oci8` to install for PHP 8. + +Use `pecl install oci8-2.2.0` to install for PHP 7. Use `pecl install oci8-2.0.12` to install for PHP 5.2 - PHP 5.6. Use `pecl install oci8-1.4.10` to install for PHP 4.3.9 - PHP 5.1. -The OCI8 extension needs to be linked with Oracle 18, 12, 11, or 10.2 client -libraries. These libraries are found in your database installation, or in the -free Oracle Instant Client from -https://www.oracle.com/technetwork/database/database-technologies/instant-client/overview/index.html +The OCI8 extension can be linked with Oracle client libraries from Oracle +Database 10.2 or later. These libraries are found in your database +installation, or in the free Oracle Instant Client from +https://www.oracle.com/database/technologies/instant-client.html Install the 'Basic' or 'Basic Light' Instant Client package. If building from source, then also install the SDK package. -Oracle's standard cross-version interoperability applies. For example, PHP OCI8 -linked with Instant Client 11.2 can connect to Oracle Database 9.2 onward. See +Oracle's standard cross-version connectivity applies. For example, PHP OCI8 +linked with Instant Client 19c can connect to Oracle Database 11.2 onward. See Oracle's note "Oracle Client / Server Interoperability Support" (ID 207303.1) for details. diff --git a/ext/oci8/config.w32 b/ext/oci8/config.w32 index 6ac80aa9865a6..5f0da8f33d2d8 100644 --- a/ext/oci8/config.w32 +++ b/ext/oci8/config.w32 @@ -21,6 +21,27 @@ if (PHP_OCI8_11G != "no" && PHP_OCI8_12C != "no") { } } +if (PHP_OCI8 != "no" && PHP_OCI8_19 != "no") { + if (!PHP_OCI8_SHARED && !PHP_OCI8_19_SHARED) { + WARNING("oci8 and oci8-19 provide the same extension and cannot both be built statically"); + PHP_OCI8 = "no" + } +} + +if (PHP_OCI8_11G != "no" && PHP_OCI8_19 != "no") { + if (!PHP_OCI8_11G_SHARED && !PHP_OCI8_19_SHARED) { + WARNING("oci8-11g and oci8-19 provide the same extension and cannot both be built statically"); + PHP_OCI8_11G = "no" + } +} + +if (PHP_OCI8_12C != "no" && PHP_OCI8_19 != "no") { + if (!PHP_OCI8_12C_SHARED && !PHP_OCI8_19_SHARED) { + WARNING("oci8-12c and oci8-19 provide the same extension and cannot both be built statically"); + PHP_OCI8_12C = "no" + } +} + ARG_WITH("oci8", "OCI8 support", "no"); if (PHP_OCI8 != "no") { @@ -124,3 +145,37 @@ if (PHP_OCI8_12C != "no") { PHP_OCI8_12C = "no" } } + +ARG_WITH("oci8-19", "OCI8 support using Oracle Database 19 Instant Client", "no"); + +if (PHP_OCI8_19 != "no") { + + oci8_19_dirs = new Array( + PHP_OCI8_19 + ); + + oci8_19_lib_paths = ""; + oci8_19_inc_paths = ""; + + // find the Oracle install + for (i = 0; i < oci8_19_dirs.length; i++) { + oci8_19_lib_paths += oci8_19_dirs[i] + "\\lib;"; + oci8_19_lib_paths += oci8_19_dirs[i] + "\\lib\\msvc;"; + oci8_19_inc_paths += oci8_19_dirs[i] + "\\include;"; + } + + oci8_19_inc_paths += PHP_PHP_BUILD + "\\include\\instantclient_12;" + oci8_19_lib_paths += PHP_PHP_BUILD + "\\lib\\instantclient_12;"; + + if (CHECK_HEADER_ADD_INCLUDE("oci.h", "CFLAGS_OCI8_19", oci8_19_inc_paths) && + CHECK_LIB("oci.lib", "oci8_19", oci8_19_lib_paths)) + { + EXTENSION('oci8_19', 'oci8.c oci8_lob.c oci8_statement.c oci8_collection.c oci8_interface.c oci8_failover.c', null, null, null, "ext\\oci8_19") + + AC_DEFINE('HAVE_OCI8', 1); + AC_DEFINE('HAVE_OCI_INSTANT_CLIENT', 1); + } else { + WARNING("oci8-19 not enabled: Oracle Database client libraries or Oracle Database 19 Instant Client not found"); + PHP_OCI8_19 = "no" + } +} diff --git a/ext/oci8/oci8.c b/ext/oci8/oci8.c index 48b6c5c936c74..ad9b23a9c40ac 100644 --- a/ext/oci8/oci8.c +++ b/ext/oci8/oci8.c @@ -120,7 +120,7 @@ static sword php_oci_ping_init(php_oci_connection *connection, OCIError *errh); /* }}} */ /* {{{ dynamically loadable module stuff */ -#if defined(COMPILE_DL_OCI8) || defined(COMPILE_DL_OCI8_11G) || defined(COMPILE_DL_OCI8_12C) +#if defined(COMPILE_DL_OCI8) || defined(COMPILE_DL_OCI8_11G) || defined(COMPILE_DL_OCI8_12C) || defined(COMPILE_DL_OCI8_19) ZEND_GET_MODULE(oci8) #endif /* COMPILE_DL */ /* }}} */ diff --git a/ext/oci8/package.xml b/ext/oci8/package.xml index eb6007dca9feb..4dca8f31bf308 100644 --- a/ext/oci8/package.xml +++ b/ext/oci8/package.xml @@ -53,7 +53,7 @@ Oracle's standard cross-version connectivity applies. For example, PHP OCI8 lin no - 2020-07-15 + 2020-11-26 diff --git a/ext/oci8/php_oci8.h b/ext/oci8/php_oci8.h index c1ebf7b86e0c1..e3e294ef4fc62 100644 --- a/ext/oci8/php_oci8.h +++ b/ext/oci8/php_oci8.h @@ -47,6 +47,7 @@ extern zend_module_entry oci8_module_entry; #define phpext_oci8_ptr &oci8_module_entry #define phpext_oci8_11g_ptr &oci8_module_entry #define phpext_oci8_12c_ptr &oci8_module_entry +#define phpext_oci8_19_ptr &oci8_module_entry PHP_MINIT_FUNCTION(oci); diff --git a/ext/oci8/tests/conn_attr_4.phpt b/ext/oci8/tests/conn_attr_4.phpt index b2d3267ecedec..e4e457194d2c9 100644 --- a/ext/oci8/tests/conn_attr_4.phpt +++ b/ext/oci8/tests/conn_attr_4.phpt @@ -90,13 +90,13 @@ echo "Done\n"; **Test Negative cases************ Invalid Connection resource 1 -string(89) "oci_set_action(): Argument #1 ($connection) must be of type resource, null given" +string(%d) "oci_set_action(): Argument #1 ($connection) must be of type resource, null given" Invalid Connection resource 2 -string(96) "oci_set_client_info(): Argument #1 ($connection) must be of type resource, string given" +string(%d) "oci_set_client_info(): Argument #1 ($connection) must be of type resource, string given" Invalid Action value -string(78) "oci_set_action(): Argument #2 ($action) must be of type string, resource given" +string(%d) "oci_set_action(): Argument #2 ($action) must be of type string, resource given" Set Values multiple times bool(true) diff --git a/ext/opcache/Optimizer/dfa_pass.c b/ext/opcache/Optimizer/dfa_pass.c index 765b023f07ee9..0ac6c563d08e6 100644 --- a/ext/opcache/Optimizer/dfa_pass.c +++ b/ext/opcache/Optimizer/dfa_pass.c @@ -474,16 +474,16 @@ int zend_dfa_optimize_calls(zend_op_array *op_array, zend_ssa *ssa) int var = ssa_op->result_def; int use = ssa->vars[var].use_chain; - if (ssa->vars[var].phi_use_chain == NULL) { - if (ssa->ops[use].op1_use == var - && ssa->ops[use].op1_use_chain == -1) { - call_info->caller_call_opline->result_type = IS_TMP_VAR; - op_array->opcodes[use].op1_type = IS_TMP_VAR; - } else if (ssa->ops[use].op2_use == var - && ssa->ops[use].op2_use_chain == -1) { - call_info->caller_call_opline->result_type = IS_TMP_VAR; - op_array->opcodes[use].op2_type = IS_TMP_VAR; - } + /* If the result is used only in a JMPZ/JMPNZ, replace result type with + * IS_TMP_VAR, which will enable use of smart branches. Don't do this + * in other cases, as not all opcodes support both VAR and TMP. */ + if (ssa->vars[var].phi_use_chain == NULL + && ssa->ops[use].op1_use == var + && ssa->ops[use].op1_use_chain == -1 + && (op_array->opcodes[use].opcode == ZEND_JMPZ + || op_array->opcodes[use].opcode == ZEND_JMPNZ)) { + call_info->caller_call_opline->result_type = IS_TMP_VAR; + op_array->opcodes[use].op1_type = IS_TMP_VAR; } } } @@ -985,6 +985,77 @@ static int zend_dfa_optimize_jmps(zend_op_array *op_array, zend_ssa *ssa) return removed_ops; } +static int zend_dfa_try_to_replace_result(zend_op_array *op_array, zend_ssa *ssa, int def, int cv_var) +{ + int result_var = ssa->ops[def].result_def; + int cv = EX_NUM_TO_VAR(ssa->vars[cv_var].var); + + if (result_var >= 0 + && !(ssa->var_info[cv_var].type & MAY_BE_REF) + && ssa->vars[cv_var].alias == NO_ALIAS + && ssa->vars[result_var].phi_use_chain == NULL + && ssa->vars[result_var].sym_use_chain == NULL) { + int use = ssa->vars[result_var].use_chain; + + if (use >= 0 + && zend_ssa_next_use(ssa->ops, result_var, use) < 0 + && op_array->opcodes[use].opcode != ZEND_FREE + && op_array->opcodes[use].opcode != ZEND_SEND_VAL + && op_array->opcodes[use].opcode != ZEND_SEND_VAL_EX + && op_array->opcodes[use].opcode != ZEND_VERIFY_RETURN_TYPE) { + if (use > def) { + int i = use; + const zend_op *opline = &op_array->opcodes[use]; + + while (i > def) { + if ((opline->op1_type == IS_CV && opline->op1.var == cv) + || (opline->op2_type == IS_CV && opline->op2.var == cv) + || (opline->result_type == IS_CV && opline->result.var == cv)) { + return 0; + } + opline--; + i--; + } + + /* Update opcodes and reconstruct SSA */ + ssa->vars[result_var].definition = -1; + ssa->vars[result_var].use_chain = -1; + ssa->ops[def].result_def = -1; + + op_array->opcodes[def].result_type = IS_UNUSED; + op_array->opcodes[def].result.var = 0; + + if (ssa->ops[use].op1_use == result_var) { + ssa->ops[use].op1_use = cv_var; + ssa->ops[use].op1_use_chain = ssa->vars[cv_var].use_chain; + ssa->vars[cv_var].use_chain = use; + + op_array->opcodes[use].op1_type = IS_CV; + op_array->opcodes[use].op1.var = cv; + } else if (ssa->ops[use].op2_use == result_var) { + ssa->ops[use].op2_use = cv_var; + ssa->ops[use].op2_use_chain = ssa->vars[cv_var].use_chain; + ssa->vars[cv_var].use_chain = use; + + op_array->opcodes[use].op2_type = IS_CV; + op_array->opcodes[use].op2.var = cv; + } else if (ssa->ops[use].result_use == result_var) { + ssa->ops[use].result_use = cv_var; + ssa->ops[use].res_use_chain = ssa->vars[cv_var].use_chain; + ssa->vars[cv_var].use_chain = use; + + op_array->opcodes[use].result_type = IS_CV; + op_array->opcodes[use].result.var = cv; + } + + return 1; + } + } + } + + return 0; +} + void zend_dfa_optimize_op_array(zend_op_array *op_array, zend_optimizer_ctx *ctx, zend_ssa *ssa, zend_call_info **call_map) { if (ctx->debug_level & ZEND_DUMP_BEFORE_DFA_PASS) { @@ -1303,6 +1374,44 @@ void zend_dfa_optimize_op_array(zend_op_array *op_array, zend_optimizer_ctx *ctx continue; } + if (ssa->ops[op_1].op1_def == v + && RETURN_VALUE_USED(opline)) { + if (opline->opcode == ZEND_ASSIGN + || opline->opcode == ZEND_ASSIGN_OP + || opline->opcode == ZEND_PRE_INC + || opline->opcode == ZEND_PRE_DEC) { + zend_dfa_try_to_replace_result(op_array, ssa, op_1, v); + } else if (opline->opcode == ZEND_POST_INC) { + int result_var = ssa->ops[op_1].result_def; + + if (result_var >= 0 + && (ssa->var_info[result_var].type & ((MAY_BE_ANY|MAY_BE_REF|MAY_BE_UNDEF) - (MAY_BE_LONG|MAY_BE_DOUBLE))) == 0) { + int use = ssa->vars[result_var].use_chain; + + if (op_array->opcodes[use].opcode == ZEND_IS_SMALLER + && ssa->ops[use].op1_use == result_var + && zend_dfa_try_to_replace_result(op_array, ssa, op_1, v)) { + opline->opcode = ZEND_PRE_INC; + op_array->opcodes[use].opcode = ZEND_IS_SMALLER_OR_EQUAL; + } + } + } else if (opline->opcode == ZEND_POST_DEC) { + int result_var = ssa->ops[op_1].result_def; + + if (result_var >= 0 + && (ssa->var_info[result_var].type & ((MAY_BE_ANY|MAY_BE_REF|MAY_BE_UNDEF) - (MAY_BE_LONG|MAY_BE_DOUBLE))) == 0) { + int use = ssa->vars[result_var].use_chain; + + if (op_array->opcodes[use].opcode == ZEND_IS_SMALLER + && ssa->ops[use].op2_use == result_var + && zend_dfa_try_to_replace_result(op_array, ssa, op_1, v)) { + opline->opcode = ZEND_PRE_DEC; + op_array->opcodes[use].opcode = ZEND_IS_SMALLER_OR_EQUAL; + } + } + } + } + if (opline->opcode == ZEND_ASSIGN && ssa->ops[op_1].op1_def == v && !RETURN_VALUE_USED(opline) @@ -1312,7 +1421,6 @@ void zend_dfa_optimize_op_array(zend_op_array *op_array, zend_optimizer_ctx *ctx if (orig_var >= 0 && !(ssa->var_info[orig_var].type & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF)) ) { - int src_var = ssa->ops[op_1].op2_use; if ((opline->op2_type & (IS_TMP_VAR|IS_VAR)) diff --git a/ext/opcache/Optimizer/sccp.c b/ext/opcache/Optimizer/sccp.c index d0dffc275da3e..b1979b68a8ab1 100644 --- a/ext/opcache/Optimizer/sccp.c +++ b/ext/opcache/Optimizer/sccp.c @@ -26,6 +26,7 @@ #include "Optimizer/scdf.h" #include "Optimizer/zend_dump.h" #include "ext/standard/php_string.h" +#include "zend_exceptions.h" /* This implements sparse conditional constant propagation (SCCP) based on the SCDF framework. The * used value lattice is defined as follows: @@ -780,259 +781,189 @@ static inline int ct_eval_array_key_exists(zval *result, zval *op1, zval *op2) { return SUCCESS; } -/* The functions chosen here are simple to implement and either likely to affect a branch, - * or just happened to be commonly used with constant operands in WP (need to test other - * applications as well, of course). */ -static inline int ct_eval_func_call( - zval *result, zend_string *name, uint32_t num_args, zval **args) { - uint32_t i; - zend_execute_data *execute_data, *prev_execute_data; - zend_function *func; - bool overflow; - - if (num_args == 0) { - if (zend_string_equals_literal(name, "php_sapi_name") - || zend_string_equals_literal(name, "imagetypes") - || zend_string_equals_literal(name, "phpversion")) { - /* pass */ - } else { - return FAILURE; - } - } else if (num_args == 1) { - if (zend_string_equals_literal(name, "chr")) { - zend_long c; - if (Z_TYPE_P(args[0]) != IS_LONG) { - return FAILURE; - } - - c = Z_LVAL_P(args[0]) & 0xff; - ZVAL_CHAR(result, c); - return SUCCESS; - } else if (zend_string_equals_literal(name, "count")) { - if (Z_TYPE_P(args[0]) != IS_ARRAY) { - return FAILURE; - } - - ZVAL_LONG(result, zend_hash_num_elements(Z_ARRVAL_P(args[0]))); - return SUCCESS; - } else if (zend_string_equals_literal(name, "ini_get")) { - zend_ini_entry *ini_entry; - - if (Z_TYPE_P(args[0]) != IS_STRING) { - return FAILURE; - } - - ini_entry = zend_hash_find_ptr(EG(ini_directives), Z_STR_P(args[0])); - if (!ini_entry) { - ZVAL_FALSE(result); - } else if (ini_entry->modifiable != ZEND_INI_SYSTEM) { - return FAILURE; - } else if (ini_entry->value) { - ZVAL_STR_COPY(result, ini_entry->value); - } else { - ZVAL_EMPTY_STRING(result); - } - return SUCCESS; - } else if (zend_string_equals_literal(name, "trim") - || zend_string_equals_literal(name, "rtrim") - || zend_string_equals_literal(name, "ltrim") - || zend_string_equals_literal(name, "str_split") - || zend_string_equals_literal(name, "preg_quote") - || zend_string_equals_literal(name, "base64_encode") - || zend_string_equals_literal(name, "base64_decode") - || zend_string_equals_literal(name, "urlencode") - || zend_string_equals_literal(name, "urldecode") - || zend_string_equals_literal(name, "rawurlencode") - || zend_string_equals_literal(name, "rawurldecode") - || zend_string_equals_literal(name, "php_uname")) { - if (Z_TYPE_P(args[0]) != IS_STRING) { - return FAILURE; - } - /* pass */ - } else if (zend_string_equals_literal(name, "array_keys") - || zend_string_equals_literal(name, "array_values")) { - if (Z_TYPE_P(args[0]) != IS_ARRAY) { - return FAILURE; - } - /* pass */ - } else if (zend_string_equals_literal(name, "array_flip")) { +static zend_bool can_ct_eval_func_call(zend_string *name, uint32_t num_args, zval **args) { + /* Functions that can be evaluated independently of what the arguments are. + * It's okay if these functions throw on invalid arguments, but they should not warn. */ + if (false + || zend_string_equals_literal(name, "array_diff") + || zend_string_equals_literal(name, "array_diff_assoc") + || zend_string_equals_literal(name, "array_diff_key") + || zend_string_equals_literal(name, "array_key_exists") + || zend_string_equals_literal(name, "array_keys") + || zend_string_equals_literal(name, "array_merge") + || zend_string_equals_literal(name, "array_merge_recursive") + || zend_string_equals_literal(name, "array_replace") + || zend_string_equals_literal(name, "array_replace_recursive") + || zend_string_equals_literal(name, "array_values") + || zend_string_equals_literal(name, "base64_decode") + || zend_string_equals_literal(name, "base64_encode") + || zend_string_equals_literal(name, "imagetypes") + || zend_string_equals_literal(name, "in_array") + || zend_string_equals_literal(name, "ltrim") + || zend_string_equals_literal(name, "php_sapi_name") + || zend_string_equals_literal(name, "php_uname") + || zend_string_equals_literal(name, "phpversion") + || zend_string_equals_literal(name, "pow") + || zend_string_equals_literal(name, "preg_quote") + || zend_string_equals_literal(name, "rawurldecode") + || zend_string_equals_literal(name, "rawurlencode") + || zend_string_equals_literal(name, "rtrim") + || zend_string_equals_literal(name, "serialize") + || zend_string_equals_literal(name, "str_contains") + || zend_string_equals_literal(name, "str_ends_with") + || zend_string_equals_literal(name, "str_split") + || zend_string_equals_literal(name, "str_starts_with") + || zend_string_equals_literal(name, "strpos") + || zend_string_equals_literal(name, "substr") + || zend_string_equals_literal(name, "trim") + || zend_string_equals_literal(name, "urldecode") + || zend_string_equals_literal(name, "urlencode") + || zend_string_equals_literal(name, "version_compare") + ) { + return true; + } + + /* For the following functions we need to check arguments to prevent warnings during + * evaluation. */ + if (num_args == 1) { + if (zend_string_equals_literal(name, "array_flip")) { zval *entry; if (Z_TYPE_P(args[0]) != IS_ARRAY) { - return FAILURE; + return false; } ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(args[0]), entry) { + /* Throws warning for non int/string values. */ if (Z_TYPE_P(entry) != IS_LONG && Z_TYPE_P(entry) != IS_STRING) { - return FAILURE; + return false; } } ZEND_HASH_FOREACH_END(); - /* pass */ - } else if (zend_string_equals_literal(name, "implode")) { + return true; + } + if (zend_string_equals_literal(name, "implode")) { zval *entry; if (Z_TYPE_P(args[0]) != IS_ARRAY) { - return FAILURE; + return false; } ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(args[0]), entry) { + /* May throw warning during conversion to string. */ if (Z_TYPE_P(entry) > IS_STRING) { - return FAILURE; + return false; } } ZEND_HASH_FOREACH_END(); - /* pass */ - } else if (zend_string_equals_literal(name, "serialize")) { - /* pass */ - } else { - return FAILURE; + return true; } - } else if (num_args == 2) { - if (zend_string_equals_literal(name, "in_array")) { - if (Z_TYPE_P(args[1]) != IS_ARRAY) { - return FAILURE; - } - /* pass */ - } else if (zend_string_equals_literal(name, "str_split")) { - if (Z_TYPE_P(args[0]) != IS_STRING - || Z_TYPE_P(args[1]) != IS_LONG - || Z_LVAL_P(args[1]) <= 0) { - return FAILURE; - } - /* pass */ - } else if (zend_string_equals_literal(name, "array_key_exists")) { - if (Z_TYPE_P(args[1]) != IS_ARRAY - || (Z_TYPE_P(args[0]) != IS_LONG - && Z_TYPE_P(args[0]) != IS_STRING - && Z_TYPE_P(args[0]) != IS_NULL)) { - return FAILURE; - } - /* pass */ - } else if (zend_string_equals_literal(name, "trim") - || zend_string_equals_literal(name, "rtrim") - || zend_string_equals_literal(name, "ltrim") - || zend_string_equals_literal(name, "preg_quote")) { - if (Z_TYPE_P(args[0]) != IS_STRING - || Z_TYPE_P(args[1]) != IS_STRING) { - return FAILURE; - } - /* pass */ - } else if (zend_string_equals_literal(name, "str_repeat")) { - if (Z_TYPE_P(args[0]) != IS_STRING - || Z_TYPE_P(args[1]) != IS_LONG - || zend_safe_address(Z_STRLEN_P(args[0]), Z_LVAL_P(args[1]), 0, &overflow) > 64 * 1024 - || overflow) { - return FAILURE; - } - /* pass */ - } else if (zend_string_equals_literal(name, "array_merge") - || zend_string_equals_literal(name, "array_replace") - || zend_string_equals_literal(name, "array_merge_recursive") - || zend_string_equals_literal(name, "array_replace_recursive") - || zend_string_equals_literal(name, "array_diff") - || zend_string_equals_literal(name, "array_diff_assoc") - || zend_string_equals_literal(name, "array_diff_key")) { - for (i = 0; i < num_args; i++) { - if (Z_TYPE_P(args[i]) != IS_ARRAY) { - return FAILURE; - } - } - /* pass */ + return false; + } + + if (num_args == 2) { + if (zend_string_equals_literal(name, "str_repeat")) { + /* Avoid creating overly large strings at compile-time. */ + bool overflow; + return Z_TYPE_P(args[0]) == IS_STRING + && Z_TYPE_P(args[1]) == IS_LONG + && zend_safe_address(Z_STRLEN_P(args[0]), Z_LVAL_P(args[1]), 0, &overflow) < 64 * 1024 + && !overflow; } else if (zend_string_equals_literal(name, "implode")) { zval *entry; if ((Z_TYPE_P(args[0]) != IS_STRING || Z_TYPE_P(args[1]) != IS_ARRAY) && (Z_TYPE_P(args[0]) != IS_ARRAY || Z_TYPE_P(args[1]) != IS_STRING)) { - return FAILURE; + return false; } + /* May throw warning during conversion to string. */ if (Z_TYPE_P(args[0]) == IS_ARRAY) { ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(args[0]), entry) { if (Z_TYPE_P(entry) > IS_STRING) { - return FAILURE; + return false; } } ZEND_HASH_FOREACH_END(); } else { ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(args[1]), entry) { if (Z_TYPE_P(entry) > IS_STRING) { - return FAILURE; + return false; } } ZEND_HASH_FOREACH_END(); } - /* pass */ - } else if (zend_string_equals_literal(name, "strpos") - || zend_string_equals_literal(name, "str_contains") - || zend_string_equals_literal(name, "str_starts_with") - || zend_string_equals_literal(name, "str_ends_with") - || zend_string_equals_literal(name, "version_compare")) { - if (Z_TYPE_P(args[0]) != IS_STRING - || Z_TYPE_P(args[1]) != IS_STRING) { - return FAILURE; - } - /* pass */ - } else if (zend_string_equals_literal(name, "substr")) { - if (Z_TYPE_P(args[0]) != IS_STRING - || Z_TYPE_P(args[1]) != IS_LONG) { - return FAILURE; - } - /* pass */ - } else if (zend_string_equals_literal(name, "pow")) { - if ((Z_TYPE_P(args[0]) != IS_LONG && Z_TYPE_P(args[0]) != IS_DOUBLE) - || (Z_TYPE_P(args[1]) != IS_LONG && Z_TYPE_P(args[1]) != IS_DOUBLE)) { - return FAILURE; - } - /* pass */ - } else { - return FAILURE; + return true; } - } else if (num_args == 3) { - if (zend_string_equals_literal(name, "in_array")) { - if (Z_TYPE_P(args[1]) != IS_ARRAY - || (Z_TYPE_P(args[2]) != IS_FALSE - && Z_TYPE_P(args[2]) != IS_TRUE)) { + return false; + } + + return false; +} + +/* The functions chosen here are simple to implement and either likely to affect a branch, + * or just happened to be commonly used with constant operands in WP (need to test other + * applications as well, of course). */ +static inline int ct_eval_func_call( + zend_op_array *op_array, zval *result, zend_string *name, uint32_t num_args, zval **args) { + uint32_t i; + zend_function *func = zend_hash_find_ptr(CG(function_table), name); + if (!func || func->type != ZEND_INTERNAL_FUNCTION) { + return FAILURE; + } + + if (num_args == 1) { + /* Handle a few functions for which we manually implement evaluation here. */ + if (zend_string_equals_literal(name, "chr")) { + zend_long c; + if (Z_TYPE_P(args[0]) != IS_LONG) { return FAILURE; } - /* pass */ - } else if (zend_string_equals_literal(name, "array_merge") - || zend_string_equals_literal(name, "array_replace") - || zend_string_equals_literal(name, "array_merge_recursive") - || zend_string_equals_literal(name, "array_replace_recursive") - || zend_string_equals_literal(name, "array_diff") - || zend_string_equals_literal(name, "array_diff_assoc") - || zend_string_equals_literal(name, "array_diff_key")) { - for (i = 0; i < num_args; i++) { - if (Z_TYPE_P(args[i]) != IS_ARRAY) { - return FAILURE; - } + + c = Z_LVAL_P(args[0]) & 0xff; + ZVAL_CHAR(result, c); + return SUCCESS; + } else if (zend_string_equals_literal(name, "count")) { + if (Z_TYPE_P(args[0]) != IS_ARRAY) { + return FAILURE; } - /* pass */ - } else if (zend_string_equals_literal(name, "version_compare")) { - if (Z_TYPE_P(args[0]) != IS_STRING - || Z_TYPE_P(args[1]) != IS_STRING - || Z_TYPE_P(args[2]) != IS_STRING) { + + ZVAL_LONG(result, zend_hash_num_elements(Z_ARRVAL_P(args[0]))); + return SUCCESS; + } else if (zend_string_equals_literal(name, "ini_get")) { + zend_ini_entry *ini_entry; + + if (Z_TYPE_P(args[0]) != IS_STRING) { return FAILURE; } - /* pass */ - } else if (zend_string_equals_literal(name, "substr")) { - if (Z_TYPE_P(args[0]) != IS_STRING - || Z_TYPE_P(args[1]) != IS_LONG - || Z_TYPE_P(args[2]) != IS_LONG) { + + ini_entry = zend_hash_find_ptr(EG(ini_directives), Z_STR_P(args[0])); + if (!ini_entry) { + ZVAL_FALSE(result); + } else if (ini_entry->modifiable != ZEND_INI_SYSTEM) { return FAILURE; + } else if (ini_entry->value) { + ZVAL_STR_COPY(result, ini_entry->value); + } else { + ZVAL_EMPTY_STRING(result); } - /* pass */ - } else { - return FAILURE; + return SUCCESS; } - } else { - return FAILURE; } - func = zend_hash_find_ptr(CG(function_table), name); - if (!func || func->type != ZEND_INTERNAL_FUNCTION) { + if (!can_ct_eval_func_call(name, num_args, args)) { return FAILURE; } + zend_execute_data *prev_execute_data = EG(current_execute_data); + zend_execute_data *execute_data, dummy_frame; + zend_op dummy_opline; + + /* Add a dummy frame to get the correct strict_types behavior. */ + memset(&dummy_frame, 0, sizeof(zend_execute_data)); + memset(&dummy_opline, 0, sizeof(zend_op)); + dummy_frame.func = (zend_function *) op_array; + dummy_frame.opline = &dummy_opline; + dummy_opline.opcode = ZEND_DO_FCALL; + execute_data = safe_emalloc(num_args, sizeof(zval), ZEND_CALL_FRAME_SLOT * sizeof(zval)); memset(execute_data, 0, sizeof(zend_execute_data)); - prev_execute_data = EG(current_execute_data); + execute_data->prev_execute_data = &dummy_frame; EG(current_execute_data) = execute_data; EX(func) = func; @@ -1040,13 +971,22 @@ static inline int ct_eval_func_call( for (i = 0; i < num_args; i++) { ZVAL_COPY(EX_VAR_NUM(i), args[i]); } + ZVAL_NULL(result); func->internal_function.handler(execute_data, result); for (i = 0; i < num_args; i++) { zval_ptr_dtor_nogc(EX_VAR_NUM(i)); } + + int retval = SUCCESS; + if (EG(exception)) { + zval_ptr_dtor(result); + zend_clear_exception(); + retval = FAILURE; + } + efree(execute_data); EG(current_execute_data) = prev_execute_data; - return SUCCESS; + return retval; } #define SET_RESULT(op, zv) do { \ @@ -1901,7 +1841,7 @@ static void sccp_visit_instr(scdf_ctx *scdf, zend_op *opline, zend_ssa_op *ssa_o break; } - if (ct_eval_func_call(&zv, Z_STR_P(name), call->num_args, args) == SUCCESS) { + if (ct_eval_func_call(scdf->op_array, &zv, Z_STR_P(name), call->num_args, args) == SUCCESS) { SET_RESULT(result, &zv); zval_ptr_dtor_nogc(&zv); break; diff --git a/ext/opcache/Optimizer/zend_dump.c b/ext/opcache/Optimizer/zend_dump.c index f6d9bd519a505..cb835574d8855 100644 --- a/ext/opcache/Optimizer/zend_dump.c +++ b/ext/opcache/Optimizer/zend_dump.c @@ -154,11 +154,15 @@ static void zend_dump_range(const zend_ssa_range *r) fprintf(stderr, " RANGE["); if (r->underflow) { fprintf(stderr, "--.."); + } else if (r->min == ZEND_LONG_MIN) { + fprintf(stderr, "MIN.."); } else { fprintf(stderr, ZEND_LONG_FMT "..", r->min); } if (r->overflow) { fprintf(stderr, "++]"); + } else if (r->max == ZEND_LONG_MAX) { + fprintf(stderr, "MAX]"); } else { fprintf(stderr, ZEND_LONG_FMT "]", r->max); } @@ -315,11 +319,6 @@ static void zend_dump_type_info(uint32_t info, zend_class_entry *ce, int is_inst fprintf(stderr, "resource"); } } -//TODO: this is useful only for JIT??? - if (info & MAY_BE_IN_REG) { - if (first) first = 0; else fprintf(stderr, ", "); - fprintf(stderr, "reg"); - } fprintf(stderr, "]"); } diff --git a/ext/opcache/Optimizer/zend_inference.c b/ext/opcache/Optimizer/zend_inference.c index 9bb11096d891e..0dd905e8f3de4 100644 --- a/ext/opcache/Optimizer/zend_inference.c +++ b/ext/opcache/Optimizer/zend_inference.c @@ -548,6 +548,19 @@ static inline zend_bool shift_left_overflows(zend_long n, zend_long s) { } } +/* If b does not divide a exactly, return the two adjacent values between which the real result + * lies. */ +static void float_div(zend_long a, zend_long b, zend_long *r1, zend_long *r2) { + *r1 = *r2 = a / b; + if (a % b != 0) { + if (*r2 < 0) { + (*r2)--; + } else { + (*r2)++; + } + } +} + static int zend_inference_calc_binary_op_range( const zend_op_array *op_array, zend_ssa *ssa, zend_op *opline, zend_ssa_op *ssa_op, zend_uchar opcode, zend_ssa_range *tmp) { @@ -644,32 +657,36 @@ static int zend_inference_calc_binary_op_range( op1_max = OP1_MAX_RANGE(); op2_max = OP2_MAX_RANGE(); if (op2_min <= 0 && op2_max >= 0) { + /* If op2 crosses zero, then floating point values close to zero might be + * possible, which will result in arbitrarily large results. As such, we can't + * do anything useful in that case. */ break; } if (op1_min == ZEND_LONG_MIN && op2_max == -1) { /* Avoid ill-defined division, which may trigger SIGFPE. */ break; } - t1 = op1_min / op2_min; - t2 = op1_min / op2_max; - t3 = op1_max / op2_min; - t4 = op1_max / op2_max; - // FIXME: more careful overflow checks? + + zend_long t1_, t2_, t3_, t4_; + float_div(op1_min, op2_min, &t1, &t1_); + float_div(op1_min, op2_max, &t2, &t2_); + float_div(op1_max, op2_min, &t3, &t3_); + float_div(op1_max, op2_max, &t4, &t4_); + + /* The only case in which division can "overflow" either a division by an absolute + * value smaller than one, or LONG_MIN / -1 in particular. Both cases have already + * been excluded above. */ if (OP1_RANGE_UNDERFLOW() || OP2_RANGE_UNDERFLOW() || OP1_RANGE_OVERFLOW() || - OP2_RANGE_OVERFLOW() || - t1 != (zend_long)((double)op1_min / (double)op2_min) || - t2 != (zend_long)((double)op1_min / (double)op2_max) || - t3 != (zend_long)((double)op1_max / (double)op2_min) || - t4 != (zend_long)((double)op1_max / (double)op2_max)) { + OP2_RANGE_OVERFLOW()) { tmp->underflow = 1; tmp->overflow = 1; tmp->min = ZEND_LONG_MIN; tmp->max = ZEND_LONG_MAX; } else { - tmp->min = MIN(MIN(t1, t2), MIN(t3, t4)); - tmp->max = MAX(MAX(t1, t2), MAX(t3, t4)); + tmp->min = MIN(MIN(MIN(t1, t2), MIN(t3, t4)), MIN(MIN(t1_, t2_), MIN(t3_, t4_))); + tmp->max = MAX(MAX(MAX(t1, t2), MAX(t3, t4)), MAX(MAX(t1_, t2_), MAX(t3_, t4_))); } return 1; } @@ -1949,6 +1966,9 @@ uint32_t zend_array_element_type(uint32_t t1, zend_uchar op_type, int write, int } else { tmp |= MAY_BE_ANY | MAY_BE_REF | MAY_BE_RC1 | MAY_BE_RCN | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF; } + if (write) { + tmp |= MAY_BE_INDIRECT; + } } if (t1 & MAY_BE_ARRAY) { if (insert) { diff --git a/ext/opcache/Optimizer/zend_inference.h b/ext/opcache/Optimizer/zend_inference.h index 6b1021a4cce88..212679df5e451 100644 --- a/ext/opcache/Optimizer/zend_inference.h +++ b/ext/opcache/Optimizer/zend_inference.h @@ -29,7 +29,7 @@ #define MAY_BE_PACKED_GUARD (1<<27) /* needs packed array guard */ #define MAY_BE_CLASS_GUARD (1<<27) /* needs class guard */ #define MAY_BE_GUARD (1<<28) /* needs type guard */ -#define MAY_BE_IN_REG (1<<29) /* value allocated in CPU register */ +//#define MAY_BE_IN_REG (1<<29) /* deprecated and not used */ //TODO: remome MAY_BE_RC1, MAY_BE_RCN??? #define MAY_BE_RC1 (1<<30) /* may be non-reference with refcount == 1 */ diff --git a/ext/opcache/Optimizer/zend_optimizer.c b/ext/opcache/Optimizer/zend_optimizer.c index b0efcc902602d..c80992ed8dae0 100644 --- a/ext/opcache/Optimizer/zend_optimizer.c +++ b/ext/opcache/Optimizer/zend_optimizer.c @@ -1350,11 +1350,21 @@ static void zend_adjust_fcall_stack_size_graph(zend_op_array *op_array) static zend_bool needs_live_range(zend_op_array *op_array, zend_op *def_opline) { zend_func_info *func_info = ZEND_FUNC_INFO(op_array); zend_ssa_op *ssa_op = &func_info->ssa.ops[def_opline - op_array->opcodes]; - if (ssa_op->result_def >= 0) { - uint32_t type = func_info->ssa.var_info[ssa_op->result_def].type; - return (type & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF)) != 0; + int ssa_var = ssa_op->result_def; + if (ssa_var < 0) { + /* Be conservative. */ + return 1; } - return 1; + + /* If the variable is used by a PHI, this may be the assignment of the final branch of a + * ternary/etc structure. While this is where the live range starts, the value from the other + * branch may also be used. As such, use the type of the PHI node for the following check. */ + if (func_info->ssa.vars[ssa_var].phi_use_chain) { + ssa_var = func_info->ssa.vars[ssa_var].phi_use_chain->ssa_var; + } + + uint32_t type = func_info->ssa.var_info[ssa_var].type; + return (type & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF)) != 0; } void zend_foreach_op_array(zend_script *script, zend_op_array_func_t func, void *context) diff --git a/ext/opcache/ZendAccelerator.c b/ext/opcache/ZendAccelerator.c index c8ee9b9da690c..891863df615b3 100644 --- a/ext/opcache/ZendAccelerator.c +++ b/ext/opcache/ZendAccelerator.c @@ -2970,7 +2970,8 @@ static zend_result accel_post_startup(void) size_t jit_size = 0; zend_bool reattached = 0; - if (JIT_G(enabled) && JIT_G(buffer_size)) { + if (JIT_G(enabled) && JIT_G(buffer_size) + && zend_jit_check_support() == SUCCESS) { size_t page_size; # ifdef _WIN32 @@ -3057,6 +3058,10 @@ static zend_result accel_post_startup(void) zend_accel_error_noreturn(ACCEL_LOG_FATAL, "opcache.file_cache_only is set without a proper setting of opcache.file_cache"); return SUCCESS; } else { +#ifdef HAVE_JIT + JIT_G(enabled) = 0; + JIT_G(on) = 0; +#endif accel_shared_globals = calloc(1, sizeof(zend_accel_shared_globals)); /* Init auto-global strings */ diff --git a/ext/opcache/config.m4 b/ext/opcache/config.m4 index 054cd28c02475..93d72fb73d19b 100644 --- a/ext/opcache/config.m4 +++ b/ext/opcache/config.m4 @@ -66,7 +66,7 @@ if test "$PHP_OPCACHE" != "no"; then esac fi - if test "$enable_zts" = "yes"; then + if test "$PHP_THREAD_SAFETY" = "yes"; then DASM_FLAGS="$DASM_FLAGS -D ZTS=1" fi diff --git a/ext/opcache/jit/zend_jit.c b/ext/opcache/jit/zend_jit.c index eea6b5c7ba972..eb80d5240bce6 100644 --- a/ext/opcache/jit/zend_jit.c +++ b/ext/opcache/jit/zend_jit.c @@ -16,6 +16,8 @@ +----------------------------------------------------------------------+ */ +#include "main/php.h" +#include "main/SAPI.h" #include "php_version.h" #include #include "zend_shared_alloc.h" @@ -448,7 +450,7 @@ static void *dasm_link_and_encode(dasm_State **dasm_state, name, (op_array && op_array->filename) ? ZSTR_VAL(op_array->filename) : NULL, op_array, - &ssa->cfg, + ssa ? &ssa->cfg : NULL, entry, size); } @@ -3261,7 +3263,7 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op } goto done; case ZEND_FETCH_CONSTANT: - if (!zend_jit_fetch_constant(&dasm_state, opline)) { + if (!zend_jit_fetch_constant(&dasm_state, opline, op_array, ssa, ssa_op)) { goto jit_failure; } goto done; @@ -3296,7 +3298,7 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op } if (!zend_jit_init_method_call(&dasm_state, opline, b, op_array, ssa, ssa_op, call_level, op1_info, op1_addr, ce, ce_is_instanceof, 0, NULL, - NULL, 1)) { + NULL, 1, 0)) { goto jit_failure; } goto done; @@ -4079,8 +4081,6 @@ static int zend_jit_parse_config_num(zend_long jit) ZEND_EXT_API int zend_jit_config(zend_string *jit, int stage) { - zend_ulong num; - if (stage != ZEND_INI_STAGE_STARTUP && !JIT_G(enabled)) { if (stage == ZEND_INI_STAGE_RUNTIME) { zend_error(E_WARNING, "Cannot change opcache.jit setting at run-time (JIT is disabled)"); @@ -4118,8 +4118,10 @@ ZEND_EXT_API int zend_jit_config(zend_string *jit, int stage) JIT_G(trigger) = ZEND_JIT_ON_SCRIPT_LOAD; JIT_G(opt_flags) = ZEND_JIT_REG_ALLOC_GLOBAL | ZEND_JIT_CPU_AVX; return SUCCESS; - } else if (ZEND_HANDLE_NUMERIC(jit, num)) { - if (zend_jit_parse_config_num((zend_long)num) != SUCCESS) { + } else { + char *end; + zend_long num = ZEND_STRTOL(ZSTR_VAL(jit), &end, 10); + if (end != ZSTR_VAL(jit) + ZSTR_LEN(jit) || zend_jit_parse_config_num(num) != SUCCESS) { goto failure; } JIT_G(enabled) = 1; @@ -4127,7 +4129,7 @@ ZEND_EXT_API int zend_jit_config(zend_string *jit, int stage) } failure: - zend_error(E_WARNING, "Invalid \"opcache.jit\" setting. Should be \"disable\", \"on\", \"off\" or 4-digit number"); + zend_error(E_WARNING, "Invalid \"opcache.jit\" setting. Should be \"disable\", \"on\", \"off\", \"tracing\", \"function\" or 4-digit number"); JIT_G(enabled) = 0; JIT_G(on) = 0; return FAILURE; @@ -4164,17 +4166,44 @@ ZEND_EXT_API void zend_jit_init(void) #endif } -ZEND_EXT_API int zend_jit_startup(void *buf, size_t size, zend_bool reattached) +ZEND_EXT_API int zend_jit_check_support(void) { - int ret; + int i; zend_jit_vm_kind = zend_vm_kind(); if (zend_jit_vm_kind != ZEND_VM_KIND_CALL && zend_jit_vm_kind != ZEND_VM_KIND_HYBRID) { - // TODO: error reporting and cleanup ??? + zend_error(E_WARNING, "JIT is compatible only with CALL and HYBRID VM. JIT disabled."); + JIT_G(enabled) = 0; + JIT_G(on) = 0; + return FAILURE; + } + + if (zend_execute_ex != execute_ex) { + if (strcmp(sapi_module.name, "phpdbg") != 0) { + zend_error(E_WARNING, "JIT is incompatible with third party extensions that override zend_execute_ex(). JIT disabled."); + } + JIT_G(enabled) = 0; + JIT_G(on) = 0; return FAILURE; } + for (i = 0; i <= 256; i++) { + if (zend_get_user_opcode_handler(i) != NULL) { + zend_error(E_WARNING, "JIT is incompatible with third party extensions that setup user opcode handlers. JIT disabled."); + JIT_G(enabled) = 0; + JIT_G(on) = 0; + return FAILURE; + } + } + + return SUCCESS; +} + +ZEND_EXT_API int zend_jit_startup(void *buf, size_t size, zend_bool reattached) +{ + int ret; + zend_jit_halt_op = zend_get_halt_op(); if (zend_jit_setup() != SUCCESS) { diff --git a/ext/opcache/jit/zend_jit.h b/ext/opcache/jit/zend_jit.h index ed0dc29a6c82b..fffac1edc2a9f 100644 --- a/ext/opcache/jit/zend_jit.h +++ b/ext/opcache/jit/zend_jit.h @@ -136,6 +136,7 @@ ZEND_EXT_API void zend_jit_protect(void); ZEND_EXT_API void zend_jit_init(void); ZEND_EXT_API int zend_jit_config(zend_string *jit_options, int stage); ZEND_EXT_API int zend_jit_debug_config(zend_long old_val, zend_long new_val, int stage); +ZEND_EXT_API int zend_jit_check_support(void); ZEND_EXT_API int zend_jit_startup(void *jit_buffer, size_t size, zend_bool reattached); ZEND_EXT_API void zend_jit_shutdown(void); ZEND_EXT_API void zend_jit_activate(void); diff --git a/ext/opcache/jit/zend_jit_disasm_x86.c b/ext/opcache/jit/zend_jit_disasm_x86.c index afd830e89f1aa..977e85e1cb6f2 100644 --- a/ext/opcache/jit/zend_jit_disasm_x86.c +++ b/ext/opcache/jit/zend_jit_disasm_x86.c @@ -491,9 +491,10 @@ static int zend_jit_disasm_init(void) REGISTER_HELPER(zend_jit_pre_dec_obj_helper); REGISTER_HELPER(zend_jit_post_inc_obj_helper); REGISTER_HELPER(zend_jit_post_dec_obj_helper); -#if (PHP_VERSION_ID <= 80000) && (SIZEOF_SIZE_T == 4) +#if (PHP_VERSION_ID <= 80100) && (SIZEOF_SIZE_T == 4) REGISTER_HELPER(zval_jit_update_constant_ex); #endif + REGISTER_HELPER(zend_jit_free_trampoline_helper); #undef REGISTER_HELPER #ifndef _WIN32 diff --git a/ext/opcache/jit/zend_jit_helpers.c b/ext/opcache/jit/zend_jit_helpers.c index 5d5a30541b7c0..9fd4bddf1568e 100644 --- a/ext/opcache/jit/zend_jit_helpers.c +++ b/ext/opcache/jit/zend_jit_helpers.c @@ -2639,7 +2639,7 @@ static void ZEND_FASTCALL zend_jit_post_dec_obj_helper(zend_object *zobj, zend_s } } -#if (PHP_VERSION_ID <= 80000) && (SIZEOF_SIZE_T == 4) +#if (PHP_VERSION_ID <= 80100) && (SIZEOF_SIZE_T == 4) static zend_result ZEND_FASTCALL zval_jit_update_constant_ex(zval *p, zend_class_entry *scope) { if (Z_TYPE_P(p) == IS_CONSTANT_AST) { @@ -2666,4 +2666,11 @@ static zend_result ZEND_FASTCALL zval_jit_update_constant_ex(zval *p, zend_class } return SUCCESS; } -#endif \ No newline at end of file +#endif + +static void ZEND_FASTCALL zend_jit_free_trampoline_helper(zend_function *func) +{ + ZEND_ASSERT(func->common.fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE); + zend_string_release_ex(func->common.function_name, 0); + zend_free_trampoline(func); +} diff --git a/ext/opcache/jit/zend_jit_internal.h b/ext/opcache/jit/zend_jit_internal.h index 22a5aa4100b25..917fa10f2e044 100644 --- a/ext/opcache/jit/zend_jit_internal.h +++ b/ext/opcache/jit/zend_jit_internal.h @@ -130,8 +130,8 @@ ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_jit_loop_counter_helper(ZEND_OPCODE_H void ZEND_FASTCALL zend_jit_copy_extra_args_helper(EXECUTE_DATA_D); zend_bool ZEND_FASTCALL zend_jit_deprecated_helper(OPLINE_D); -int ZEND_FASTCALL zend_jit_get_constant(const zval *key, uint32_t flags); -int ZEND_FASTCALL zend_jit_check_constant(const zval *key); +zend_constant* ZEND_FASTCALL zend_jit_get_constant(const zval *key, uint32_t flags); +zend_constant* ZEND_FASTCALL zend_jit_check_constant(const zval *key); /* Tracer */ #define zend_jit_opline_hash(opline) \ @@ -211,7 +211,8 @@ typedef enum _zend_jit_trace_stop { #define ZEND_JIT_EXIT_FREE_OP1 (1<<5) #define ZEND_JIT_EXIT_FREE_OP2 (1<<6) #define ZEND_JIT_EXIT_PACKED_GUARD (1<<7) -#define ZEND_JIT_EXIT_DYNAMIC_CALL (1<<8) /* exit because of polymorphic INTI_DYNAMIC_CALL call */ +#define ZEND_JIT_EXIT_CLOSURE_CALL (1<<8) /* exit because of polymorphic INIT_DYNAMIC_CALL call */ +#define ZEND_JIT_EXIT_METHOD_CALL (1<<9) /* exit because of polymorphic INIT_METHOD_CALL call */ typedef union _zend_op_trace_info { zend_op dummy; /* the size of this structure must be the same as zend_op */ diff --git a/ext/opcache/jit/zend_jit_trace.c b/ext/opcache/jit/zend_jit_trace.c index e15dde5354e18..ad4ce03a048e4 100644 --- a/ext/opcache/jit/zend_jit_trace.c +++ b/ext/opcache/jit/zend_jit_trace.c @@ -745,6 +745,7 @@ static int zend_jit_trace_copy_ssa_var_info(const zend_op_array *op_array, const info = ssa->var_info + op->result_use; } else { assert(0); + return 0; } tssa->vars[ssa_var].no_val = no_val; tssa->vars[ssa_var].alias = alias; @@ -780,6 +781,7 @@ static int zend_jit_trace_copy_ssa_var_range(const zend_op_array *op_array, cons info = ssa->var_info + op->result_def; } else { assert(0); + return 0; } tssa->vars[ssa_var].no_val = no_val; @@ -819,6 +821,7 @@ static int zend_jit_trace_restrict_ssa_var_info(const zend_op_array *op_array, c info = ssa->var_info + op->result_def; } else { assert(0); + return 0; } tssa->var_info[ssa_var].type &= info->type; if (info->ce) { @@ -1940,6 +1943,16 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin if (ssa_ops[idx].result_def >= 0) { zend_jit_trace_copy_ssa_var_range(op_array, ssa, ssa_opcodes, tssa, ssa_ops[idx].result_def); } + } else { + if (ssa_ops[idx].op1_def >= 0) { + ssa_vars[ssa_ops[idx].op1_def].alias = zend_jit_var_may_alias(op_array, ssa, EX_VAR_TO_NUM(opline->op1.var)); + } + if (ssa_ops[idx].op2_def >= 0) { + ssa_vars[ssa_ops[idx].op2_def].alias = zend_jit_var_may_alias(op_array, ssa, EX_VAR_TO_NUM(opline->op2.var)); + } + if (ssa_ops[idx].result_def >= 0) { + ssa_vars[ssa_ops[idx].result_def].alias = zend_jit_var_may_alias(op_array, ssa, EX_VAR_TO_NUM(opline->result.var)); + } } if (opline->opcode == ZEND_RECV_INIT && !(op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS)) { @@ -2001,19 +2014,22 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin if (ssa->var_info && zend_jit_trace_copy_ssa_var_info(op_array, ssa, ssa_opcodes, tssa, v)) { /* pass */ - } else if (op_array->arg_info) { - zend_arg_info *arg_info = &op_array->arg_info[i]; - zend_class_entry *ce; - uint32_t tmp = zend_fetch_arg_info_type(script, arg_info, &ce); + } else { + ssa_vars[v].alias = zend_jit_var_may_alias(op_array, ssa, i); + if (op_array->arg_info) { + zend_arg_info *arg_info = &op_array->arg_info[i]; + zend_class_entry *ce; + uint32_t tmp = zend_fetch_arg_info_type(script, arg_info, &ce); - if (ZEND_ARG_SEND_MODE(arg_info)) { - tmp |= MAY_BE_REF; + if (ZEND_ARG_SEND_MODE(arg_info)) { + tmp |= MAY_BE_REF; + } + ssa_var_info[v].type = tmp; + ssa_var_info[v].ce = ce; + ssa_var_info[v].is_instanceof = 1; + } else { + ssa_var_info[v].type = MAY_BE_RC1 | MAY_BE_RCN | MAY_BE_REF | MAY_BE_ANY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF; } - ssa_var_info[v].type = tmp; - ssa_var_info[v].ce = ce; - ssa_var_info[v].is_instanceof = 1; - } else { - ssa_var_info[v].type = MAY_BE_RC1 | MAY_BE_RCN | MAY_BE_REF | MAY_BE_ANY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF; } } else { if (ssa->vars) { @@ -3155,7 +3171,8 @@ static int zend_jit_trace_deoptimization(dasm_State **Dst, int parent_vars_count, zend_ssa *ssa, zend_jit_trace_stack *stack, - zend_lifetime_interval **ra) + zend_lifetime_interval **ra, + zend_bool polymorphic_side_trace) { int i; zend_bool has_constants = 0; @@ -3229,7 +3246,12 @@ static int zend_jit_trace_deoptimization(dasm_State **Dst, if (reg < ZREG_NUM) { /* pass */ } else if (reg == ZREG_THIS) { - if (!zend_jit_load_this(Dst, EX_NUM_TO_VAR(i))) { + if (polymorphic_side_trace) { + ssa->var_info[i].delayed_fetch_this = 1; + if (stack) { + SET_STACK_REG(stack, i, ZREG_THIS); + } + } else if (!zend_jit_load_this(Dst, EX_NUM_TO_VAR(i))) { return 0; } } else { @@ -3273,6 +3295,12 @@ static int zend_jit_trace_deoptimization(dasm_State **Dst, } } + if ((flags & ZEND_JIT_EXIT_METHOD_CALL) && !polymorphic_side_trace) { + if (!zend_jit_free_trampoline(Dst)) { + return 0; + } + } + return 1; } @@ -3428,6 +3456,9 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par zend_bool ce_is_instanceof; zend_bool delayed_fetch_this = 0; zend_bool avoid_refcounting = 0; + zend_bool polymorphic_side_trace = + parent_trace && + (zend_jit_traces[parent_trace].exit_info[exit_num].flags & ZEND_JIT_EXIT_METHOD_CALL); uint32_t i; zend_jit_trace_stack_frame *frame, *top, *call; zend_jit_trace_stack *stack; @@ -3435,6 +3466,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par const zend_op *opline, *orig_opline; const zend_ssa_op *ssa_op, *orig_ssa_op; int used_stack; + uint32_t frame_flags = 0; JIT_G(current_trace) = trace_buffer; @@ -3590,7 +3622,8 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par if (!zend_jit_trace_deoptimization(&dasm_state, zend_jit_traces[parent_trace].exit_info[exit_num].flags, zend_jit_traces[parent_trace].exit_info[exit_num].opline, - parent_stack, parent_vars_count, ssa, stack, ra)) { + parent_stack, parent_vars_count, ssa, stack, ra, + polymorphic_side_trace)) { goto jit_failure; } } @@ -3629,7 +3662,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par zend_jit_label(&dasm_state, 0); /* start of of trace loop */ - if (ra && trace_buffer->stop == ZEND_JIT_TRACE_STOP_LOOP) { + if (ra) { zend_ssa_phi *phi = ssa->blocks[1].phis; while (phi) { @@ -3723,6 +3756,8 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par p++; } + frame_flags = 0; + switch (opline->opcode) { case ZEND_INIT_FCALL: case ZEND_INIT_FCALL_BY_NAME: @@ -4099,8 +4134,8 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par goto jit_failure; } if (opline->op1_type == IS_CV - && ssa->vars[ssa_op->op1_use].alias == NO_ALIAS) { - ssa->var_info[ssa_op->op1_use].guarded_reference = 1; + && ssa->vars[ssa_op->op1_def].alias == NO_ALIAS) { + ssa->var_info[ssa_op->op1_def].guarded_reference = 1; } } else { CHECK_OP1_TRACE_TYPE(); @@ -4161,8 +4196,8 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par goto jit_failure; } if (opline->op1_type == IS_CV - && ssa->vars[ssa_op->op1_use].alias == NO_ALIAS) { - ssa->var_info[ssa_op->op1_use].guarded_reference = 1; + && ssa->vars[ssa_op->op1_def].alias == NO_ALIAS) { + ssa->var_info[ssa_op->op1_def].guarded_reference = 1; } } else { CHECK_OP1_TRACE_TYPE(); @@ -4233,8 +4268,8 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par goto jit_failure; } if (opline->op1_type == IS_CV - && ssa->vars[ssa_op->op1_use].alias == NO_ALIAS) { - ssa->var_info[ssa_op->op1_use].guarded_reference = 1; + && ssa->vars[ssa_op->op1_def].alias == NO_ALIAS) { + ssa->var_info[ssa_op->op1_def].guarded_reference = 1; } } else { CHECK_OP1_TRACE_TYPE(); @@ -4299,8 +4334,8 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par goto jit_failure; } if (opline->op1_type == IS_CV - && ssa->vars[ssa_op->op1_use].alias == NO_ALIAS) { - ssa->var_info[ssa_op->op1_use].guarded_reference = 1; + && ssa->vars[ssa_op->op1_def].alias == NO_ALIAS) { + ssa->var_info[ssa_op->op1_def].guarded_reference = 1; } } else { CHECK_OP1_TRACE_TYPE(); @@ -4323,6 +4358,11 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par zend_may_throw(opline, ssa_op, op_array, ssa))) { goto jit_failure; } + if ((opline+1)->op1_type == IS_CV + && (ssa_op+1)->op1_def >= 0 + && ssa->vars[(ssa_op+1)->op1_def].alias == NO_ALIAS) { + ssa->var_info[(ssa_op+1)->op1_def].guarded_reference = ssa->var_info[(ssa_op+1)->op1_use].guarded_reference; + } goto done; case ZEND_ASSIGN_DIM: op1_info = OP1_INFO(); @@ -4346,8 +4386,8 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par goto jit_failure; } if (opline->op1_type == IS_CV - && ssa->vars[ssa_op->op1_use].alias == NO_ALIAS) { - ssa->var_info[ssa_op->op1_use].guarded_reference = 1; + && ssa->vars[ssa_op->op1_def].alias == NO_ALIAS) { + ssa->var_info[ssa_op->op1_def].guarded_reference = 1; } } else { CHECK_OP1_TRACE_TYPE(); @@ -4361,6 +4401,11 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par zend_may_throw_ex(opline, ssa_op, op_array, ssa, op1_info, op2_info))) { goto jit_failure; } + if ((opline+1)->op1_type == IS_CV + && (ssa_op+1)->op1_def >= 0 + && ssa->vars[(ssa_op+1)->op1_def].alias == NO_ALIAS) { + ssa->var_info[(ssa_op+1)->op1_def].guarded_reference = ssa->var_info[(ssa_op+1)->op1_use].guarded_reference; + } goto done; case ZEND_ASSIGN: if (opline->op1_type != IS_CV) { @@ -4387,8 +4432,8 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par goto jit_failure; } if (opline->op1_type == IS_CV - && ssa->vars[ssa_op->op1_use].alias == NO_ALIAS) { - ssa->var_info[ssa_op->op1_use].guarded_reference = 1; + && ssa->vars[ssa_op->op1_def].alias == NO_ALIAS) { + ssa->var_info[ssa_op->op1_def].guarded_reference = 1; } if (!zend_jit_assign_to_typed_ref(&dasm_state, opline, opline->op2_type, op2_addr, 1)) { goto jit_failure; @@ -4453,6 +4498,11 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par zend_may_throw_ex(opline, ssa_op, op_array, ssa, op1_info, op2_info))) { goto jit_failure; } + if (opline->op2_type == IS_CV + && ssa_op->op2_def >= 0 + && ssa->vars[ssa_op->op2_def].alias == NO_ALIAS) { + ssa->var_info[ssa_op->op2_def].guarded_reference = ssa->var_info[ssa_op->op2_use].guarded_reference; + } goto done; case ZEND_CAST: if (opline->extended_value != op1_type) { @@ -4483,10 +4533,16 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par res_use_info, res_info, RES_REG_ADDR())) { goto jit_failure; } + if (opline->op1_type == IS_CV + && ssa_op->op1_def >= 0 + && ssa->vars[ssa_op->op1_def].alias == NO_ALIAS) { + ssa->var_info[ssa_op->op1_def].guarded_reference = ssa->var_info[ssa_op->op1_use].guarded_reference; + } goto done; case ZEND_INIT_FCALL: case ZEND_INIT_FCALL_BY_NAME: case ZEND_INIT_NS_FCALL_BY_NAME: + frame_flags = TRACE_FRAME_MASK_NESTED; if (!zend_jit_init_fcall(&dasm_state, opline, op_array_ssa->cfg.map ? op_array_ssa->cfg.map[opline - op_array->opcodes] : -1, op_array, ssa, ssa_op, frame->call_level, p + 1, used_stack < 0)) { goto jit_failure; } @@ -4530,6 +4586,10 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par op1_info, 0)) { goto jit_failure; } + if (opline->op1_type == IS_CV + && ssa->vars[ssa_op->op1_def].alias == NO_ALIAS) { + ssa->var_info[ssa_op->op1_def].guarded_reference = 1; + } goto done; case ZEND_SEND_VAR: case ZEND_SEND_VAR_EX: @@ -4559,6 +4619,11 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par op1_info, op1_addr, op1_def_addr)) { goto jit_failure; } + if (opline->op1_type == IS_CV + && ssa_op->op1_def >= 0 + && ssa->vars[ssa_op->op1_def].alias == NO_ALIAS) { + ssa->var_info[ssa_op->op1_def].guarded_reference = ssa->var_info[ssa_op->op1_use].guarded_reference; + } if (frame->call && frame->call->func && frame->call->func->type == ZEND_USER_FUNCTION) { @@ -5060,8 +5125,8 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par goto jit_failure; } if (opline->op1_type == IS_CV - && ssa->vars[ssa_op->op1_use].alias == NO_ALIAS) { - ssa->var_info[ssa_op->op1_use].guarded_reference = 1; + && ssa->vars[ssa_op->op1_def].alias == NO_ALIAS) { + ssa->var_info[ssa_op->op1_def].guarded_reference = 1; } } else { CHECK_OP1_TRACE_TYPE(); @@ -5215,7 +5280,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par } if (opline->op1_type == IS_CV && ssa->vars[ssa_op->op1_use].alias == NO_ALIAS) { - ssa->var_info[ssa_op->op1_use].guarded_reference = 1; + ssa->var_info[ssa_op->op1_def >= 0 ? ssa_op->op1_def : ssa_op->op1_use].guarded_reference = 1; } } else { CHECK_OP1_TRACE_TYPE(); @@ -5253,6 +5318,9 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par } else { op1_info = OP1_INFO(); } + if (ssa->vars[ssa_op->op1_def].alias == NO_ALIAS) { + ssa->var_info[ssa_op->op1_def].guarded_reference = 1; + } if (!zend_jit_bind_global(&dasm_state, opline, op1_info)) { goto jit_failure; } @@ -5332,7 +5400,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par goto done; case ZEND_FETCH_THIS: delayed_fetch_this = 0; - if (ssa_op->result_def >= 0) { + if (ssa_op->result_def >= 0 && opline->result_type != IS_CV) { if (zend_jit_may_delay_fetch_this(ssa, ssa_opcodes, ssa_op->result_def)) { ssa->var_info[ssa_op->result_def].delayed_fetch_this = 1; delayed_fetch_this = 1; @@ -5416,7 +5484,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par } goto done; case ZEND_FETCH_CONSTANT: - if (!zend_jit_fetch_constant(&dasm_state, opline)) { + if (!zend_jit_fetch_constant(&dasm_state, opline, op_array, ssa, ssa_op)) { goto jit_failure; } goto done; @@ -5436,7 +5504,10 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par } else { op1_info = OP1_INFO(); op1_addr = OP1_REG_ADDR(); - if (orig_op1_type != IS_UNKNOWN + if (polymorphic_side_trace) { + op1_info = MAY_BE_OBJECT; + op1_addr = 0; + } else if (orig_op1_type != IS_UNKNOWN && (orig_op1_type & IS_TRACE_REFERENCE)) { if (!zend_jit_fetch_reference(&dasm_state, opline, orig_op1_type, &op1_info, &op1_addr, !ssa->var_info[ssa_op->op1_use].guarded_reference, 1)) { @@ -5462,11 +5533,12 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par delayed_fetch_this = ssa->var_info[ssa_op->op1_use].delayed_fetch_this; } } + frame_flags = TRACE_FRAME_MASK_NESTED; if (!zend_jit_init_method_call(&dasm_state, opline, op_array_ssa->cfg.map ? op_array_ssa->cfg.map[opline - op_array->opcodes] : -1, op_array, ssa, ssa_op, frame->call_level, op1_info, op1_addr, ce, ce_is_instanceof, delayed_fetch_this, op1_ce, - p + 1, used_stack < 0)) { + p + 1, used_stack < 0, polymorphic_side_trace)) { goto jit_failure; } goto done; @@ -5476,6 +5548,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par } op2_info = OP2_INFO(); CHECK_OP2_TRACE_TYPE(); + frame_flags = TRACE_FRAME_MASK_NESTED; if (!zend_jit_init_closure_call(&dasm_state, opline, op_array_ssa->cfg.map ? op_array_ssa->cfg.map[opline - op_array->opcodes] : -1, op_array, ssa, ssa_op, frame->call_level, p + 1, used_stack < 0)) { goto jit_failure; } @@ -5536,6 +5609,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par } done: + polymorphic_side_trace = 0; switch (opline->opcode) { case ZEND_DO_FCALL: case ZEND_DO_ICALL: @@ -5648,8 +5722,23 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par if (type != IS_UNKNOWN) { ssa->var_info[ssa_op->op1_def].type &= ~MAY_BE_GUARD; if (ra && ra[ssa_op->op1_def]) { - SET_STACK_REG_EX(stack, EX_VAR_TO_NUM(opline->op1.var), ra[ssa_op->op1_def]->reg, - ra[ssa_op->op1_def]->flags & ZREG_STORE); + uint8_t flags = ra[ssa_op->op1_def]->flags & ZREG_STORE; + + if (ssa_op->op1_use >= 0) { + if (opline->opcode == ZEND_SEND_VAR + || opline->opcode == ZEND_CAST + || opline->opcode == ZEND_QM_ASSIGN + || opline->opcode == ZEND_JMP_SET + || opline->opcode == ZEND_COALESCE + || opline->opcode == ZEND_JMP_NULL + || opline->opcode == ZEND_FE_RESET_R) { + if (!ra[ssa_op->op1_use] + || ra[ssa_op->op1_use]->reg != ra[ssa_op->op1_def]->reg) { + flags |= ZREG_LOAD; + } + } + } + SET_STACK_REG_EX(stack, EX_VAR_TO_NUM(opline->op1.var), ra[ssa_op->op1_def]->reg, flags); } } if (type == IS_LONG @@ -5676,8 +5765,17 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par if (type != IS_UNKNOWN) { ssa->var_info[ssa_op->op2_def].type &= ~MAY_BE_GUARD; if (ra && ra[ssa_op->op2_def]) { - SET_STACK_REG_EX(stack, EX_VAR_TO_NUM(opline->op2.var), ra[ssa_op->op2_def]->reg, - ra[ssa_op->op2_def]->flags & ZREG_STORE); + uint8_t flags = ra[ssa_op->op2_def]->flags & ZREG_STORE; + + if (ssa_op->op2_use >= 0) { + if (opline->opcode == ZEND_ASSIGN) { + if (!ra[ssa_op->op2_use] + || ra[ssa_op->op2_use]->reg != ra[ssa_op->op2_def]->reg) { + flags |= ZREG_LOAD; + } + } + } + SET_STACK_REG_EX(stack, EX_VAR_TO_NUM(opline->op2.var), ra[ssa_op->op2_def]->reg, flags); } } if (type == IS_LONG @@ -5916,7 +6014,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par } call = top; - TRACE_FRAME_INIT(call, p->func, TRACE_FRAME_MASK_NESTED, num_args); + TRACE_FRAME_INIT(call, p->func, frame_flags, num_args); call->prev = frame->call; if (!(p->info & ZEND_JIT_TRACE_FAKE_INIT_CALL)) { TRACE_FRAME_SET_LAST_SEND_BY_VAL(call); @@ -6070,7 +6168,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par } else if (p->stop == ZEND_JIT_TRACE_STOP_LINK || p->stop == ZEND_JIT_TRACE_STOP_INTERPRETER) { if (!zend_jit_trace_deoptimization(&dasm_state, 0, NULL, - stack, op_array->last_var + op_array->T, NULL, NULL, NULL)) { + stack, op_array->last_var + op_array->T, NULL, NULL, NULL, 0)) { goto jit_failure; } if (p->stop == ZEND_JIT_TRACE_STOP_LINK) { @@ -6234,7 +6332,7 @@ static const void *zend_jit_trace_exit_to_vm(uint32_t trace_num, uint32_t exit_n if (!zend_jit_trace_deoptimization(&dasm_state, zend_jit_traces[trace_num].exit_info[exit_num].flags, zend_jit_traces[trace_num].exit_info[exit_num].opline, - stack, stack_size, NULL, NULL, NULL)) { + stack, stack_size, NULL, NULL, NULL, 0)) { goto jit_failure; } @@ -6640,7 +6738,7 @@ static void zend_jit_dump_exit_info(zend_jit_trace_info *t) if (t->exit_info[i].flags & ZEND_JIT_EXIT_RESTORE_CALL) { fprintf(stderr, "/CALL"); } - if (t->exit_info[i].flags & (ZEND_JIT_EXIT_POLYMORPHISM|ZEND_JIT_EXIT_DYNAMIC_CALL)) { + if (t->exit_info[i].flags & (ZEND_JIT_EXIT_POLYMORPHISM|ZEND_JIT_EXIT_METHOD_CALL|ZEND_JIT_EXIT_CLOSURE_CALL)) { fprintf(stderr, "/POLY"); } if (t->exit_info[i].flags & ZEND_JIT_EXIT_FREE_OP1) { @@ -7043,12 +7141,12 @@ int ZEND_FASTCALL zend_jit_trace_hot_side(zend_execute_data *execute_data, uint3 } if (JIT_G(max_polymorphic_calls) > 0) { - if ((zend_jit_traces[parent_num].exit_info[exit_num].flags & ZEND_JIT_EXIT_DYNAMIC_CALL) + if ((zend_jit_traces[parent_num].exit_info[exit_num].flags & (ZEND_JIT_EXIT_METHOD_CALL|ZEND_JIT_EXIT_CLOSURE_CALL)) || ((zend_jit_traces[parent_num].exit_info[exit_num].flags & ZEND_JIT_EXIT_POLYMORPHISM) && EX(call))) { if (zend_jit_traces[parent_num].polymorphism >= JIT_G(max_polymorphic_calls) - 1) { is_megamorphic = zend_jit_traces[parent_num].exit_info[exit_num].flags & - (ZEND_JIT_EXIT_DYNAMIC_CALL | ZEND_JIT_EXIT_POLYMORPHISM); + (ZEND_JIT_EXIT_METHOD_CALL | ZEND_JIT_EXIT_CLOSURE_CALL | ZEND_JIT_EXIT_POLYMORPHISM); } else if (!zend_jit_traces[parent_num].polymorphism) { polymorphism = 1; } else if (exit_num == 0) { @@ -7249,6 +7347,16 @@ int ZEND_FASTCALL zend_jit_trace_exit(uint32_t exit_num, zend_jit_registers_buf return 1; } } + if (t->exit_info[exit_num].flags & ZEND_JIT_EXIT_METHOD_CALL) { + zend_function *func = (zend_function*)regs->r[0]; + + if (UNEXPECTED(func->common.fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE)) { + zend_string_release_ex(func->common.function_name, 0); + zend_free_trampoline(func); + EX(opline) = opline; + return 1; + } + } /* Set VM opline to continue interpretation */ EX(opline) = opline; diff --git a/ext/opcache/jit/zend_jit_vm_helpers.c b/ext/opcache/jit/zend_jit_vm_helpers.c index 6573200430543..d919b59c9e875 100644 --- a/ext/opcache/jit/zend_jit_vm_helpers.c +++ b/ext/opcache/jit/zend_jit_vm_helpers.c @@ -239,7 +239,7 @@ ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_jit_loop_counter_helper(ZEND_OPCODE_H } } -static zend_always_inline int _zend_quick_get_constant( +static zend_always_inline zend_constant* _zend_quick_get_constant( const zval *key, uint32_t flags, int check_defined_only) { #ifndef HAVE_GCC_GLOBAL_REGS @@ -267,30 +267,29 @@ static zend_always_inline int _zend_quick_get_constant( ZVAL_UNDEF(EX_VAR(opline->result.var)); } CACHE_PTR(opline->extended_value, ENCODE_SPECIAL_CACHE_NUM(zend_hash_num_elements(EG(zend_constants)))); - return FAILURE; + return NULL; } if (!check_defined_only) { - ZVAL_COPY_OR_DUP(EX_VAR(opline->result.var), &c->value); if (ZEND_CONSTANT_FLAGS(c) & CONST_DEPRECATED) { zend_error(E_DEPRECATED, "Constant %s is deprecated", ZSTR_VAL(c->name)); if (EG(exception)) { - return FAILURE; + return NULL; } - return SUCCESS; + return c; } } CACHE_PTR(opline->extended_value, c); - return SUCCESS; + return c; } -int ZEND_FASTCALL zend_jit_get_constant(const zval *key, uint32_t flags) +zend_constant* ZEND_FASTCALL zend_jit_get_constant(const zval *key, uint32_t flags) { return _zend_quick_get_constant(key, flags, 0); } -int ZEND_FASTCALL zend_jit_check_constant(const zval *key) +zend_constant* ZEND_FASTCALL zend_jit_check_constant(const zval *key) { return _zend_quick_get_constant(key, 0, 1); } @@ -928,7 +927,8 @@ zend_jit_trace_stop ZEND_FASTCALL zend_jit_trace_execute(zend_execute_data *ex, if (JIT_G(max_polymorphic_calls) == 0 && zend_jit_may_be_polymorphic_call(opline - 1)) { func = NULL; - } else if (is_megamorphic == ZEND_JIT_EXIT_DYNAMIC_CALL + } else if ((is_megamorphic == ZEND_JIT_EXIT_METHOD_CALL + || is_megamorphic == ZEND_JIT_EXIT_CLOSURE_CALL) && trace_buffer[1].opline == opline - 1) { func = NULL; } diff --git a/ext/opcache/jit/zend_jit_x86.dasc b/ext/opcache/jit/zend_jit_x86.dasc index 7306ee2a3cb56..404e402ec7e66 100644 --- a/ext/opcache/jit/zend_jit_x86.dasc +++ b/ext/opcache/jit/zend_jit_x86.dasc @@ -165,15 +165,30 @@ static void* dasm_labels[zend_lb_MAX]; |.section code, cold_code, jmp_table -#define IS_32BIT(addr) (((uintptr_t)(addr)) <= 0xffffffff) +#define IS_32BIT(addr) (((uintptr_t)(addr)) <= 0x7fffffff) #define IS_SIGNED_32BIT(val) ((((intptr_t)(val)) <= 0x7fffffff) && (((intptr_t)(val)) >= (-2147483647 - 1))) #define BP_JIT_IS 6 + +#define CAN_USE_AVX() (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX) + +|.macro ADD_HYBRID_SPAD +||#ifndef ZEND_VM_HYBRID_JIT_RED_ZONE_SIZE +| add r4, HYBRID_SPAD +||#endif +|.endmacro + +|.macro SUB_HYBRID_SPAD +||#ifndef ZEND_VM_HYBRID_JIT_RED_ZONE_SIZE +| sub r4, HYBRID_SPAD +||#endif +|.endmacro + |.macro LOAD_ADDR, reg, addr | .if X64 -|| if (IS_32BIT(addr)) { +|| if (IS_SIGNED_32BIT(addr)) { | mov reg, ((ptrdiff_t)addr) // 0x48 0xc7 0xc0 || } else { | mov64 reg, ((ptrdiff_t)addr) // 0x48 0xb8 @@ -234,7 +249,7 @@ static void* dasm_labels[zend_lb_MAX]; |.macro ADDR_OP1, addr_ins, addr, tmp_reg | .if X64 -|| if (IS_32BIT(addr)) { +|| if (IS_SIGNED_32BIT(addr)) { | addr_ins ((ptrdiff_t)addr) || } else { | mov64 tmp_reg, ((ptrdiff_t)addr) @@ -247,7 +262,7 @@ static void* dasm_labels[zend_lb_MAX]; |.macro ADDR_OP2_2, addr_ins, op1, addr, tmp_reg | .if X64 -|| if (IS_32BIT(addr)) { +|| if (IS_SIGNED_32BIT(addr)) { | addr_ins op1, ((ptrdiff_t)addr) || } else { | mov64 tmp_reg, ((ptrdiff_t)addr) @@ -274,7 +289,7 @@ static void* dasm_labels[zend_lb_MAX]; |.macro MEM_OP1, mem_ins, prefix, addr, tmp_reg | .if X64 -|| if (IS_32BIT(addr)) { +|| if (IS_SIGNED_32BIT(addr)) { | mem_ins prefix [addr] || } else { | mov64 tmp_reg, ((ptrdiff_t)addr) @@ -287,7 +302,7 @@ static void* dasm_labels[zend_lb_MAX]; |.macro MEM_OP2_1, mem_ins, prefix, addr, op2, tmp_reg | .if X64 -|| if (IS_32BIT(addr)) { +|| if (IS_SIGNED_32BIT(addr)) { | mem_ins prefix [addr], op2 || } else { | mov64 tmp_reg, ((ptrdiff_t)addr) @@ -300,7 +315,7 @@ static void* dasm_labels[zend_lb_MAX]; |.macro MEM_OP2_2, mem_ins, op1, prefix, addr, tmp_reg | .if X64 -|| if (IS_32BIT(addr)) { +|| if (IS_SIGNED_32BIT(addr)) { | mem_ins op1, prefix [addr] || } else { | mov64 tmp_reg, ((ptrdiff_t)addr) @@ -331,7 +346,7 @@ static void* dasm_labels[zend_lb_MAX]; |.macro MEM_OP3_3, mem_ins, op1, op2, prefix, addr, tmp_reg | .if X64 -|| if (IS_32BIT(addr)) { +|| if (IS_SIGNED_32BIT(addr)) { | mem_ins op1, op2, prefix [addr] || } else { | mov64 tmp_reg, ((ptrdiff_t)addr) @@ -544,16 +559,16 @@ static void* dasm_labels[zend_lb_MAX]; |.endmacro |.macro SSE_AVX_INS, sse_ins, avx_ins, op1, op2 -|| if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX) { +|| if (CAN_USE_AVX()) { | avx_ins op1, op2 || } else { | sse_ins op1, op2 || } |.endmacro -|.macro SSE_OP, sse_ins, reg, addr +|.macro SSE_OP, sse_ins, reg, addr, tmp_reg || if (Z_MODE(addr) == IS_CONST_ZVAL) { -| MEM_OP2_2 sse_ins, xmm(reg-ZREG_XMM0), qword, Z_ZV(addr), r0 +| MEM_OP2_2 sse_ins, xmm(reg-ZREG_XMM0), qword, Z_ZV(addr), tmp_reg || } else if (Z_MODE(addr) == IS_MEM_ZVAL) { | sse_ins xmm(reg-ZREG_XMM0), qword [Ra(Z_REG(addr))+Z_OFFSET(addr)] || } else if (Z_MODE(addr) == IS_REG) { @@ -566,7 +581,7 @@ static void* dasm_labels[zend_lb_MAX]; |.macro SSE_AVX_OP, sse_ins, avx_ins, reg, addr || if (Z_MODE(addr) == IS_CONST_ZVAL) { | .if X64 -|| if (IS_32BIT(Z_ZV(addr))) { +|| if (IS_SIGNED_32BIT(Z_ZV(addr))) { | SSE_AVX_INS sse_ins, avx_ins, xmm(reg-ZREG_XMM0), qword [Z_ZV(addr)] || } else { | LOAD_ADDR r0, Z_ZV(addr) @@ -584,9 +599,9 @@ static void* dasm_labels[zend_lb_MAX]; || } |.endmacro -|.macro SSE_GET_LONG, reg, lval +|.macro SSE_GET_LONG, reg, lval, tmp_reg || if (lval == 0) { -|| if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX) { +|| if (CAN_USE_AVX()) { | vxorps xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0) || } else { | xorps xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0) @@ -594,28 +609,28 @@ static void* dasm_labels[zend_lb_MAX]; || } else { |.if X64 || if (!IS_SIGNED_32BIT(lval)) { -| mov64 r0, lval +| mov64 Ra(tmp_reg), lval || } else { -| mov r0, lval +| mov Ra(tmp_reg), lval || } |.else -| mov r0, lval +| mov Ra(tmp_reg), lval |.endif -|| if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX) { +|| if (CAN_USE_AVX()) { | vxorps xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0) -| vcvtsi2sd, xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0), r0 +| vcvtsi2sd, xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0), Ra(tmp_reg) || } else { | xorps xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0) -| cvtsi2sd, xmm(reg-ZREG_XMM0), r0 +| cvtsi2sd, xmm(reg-ZREG_XMM0), Ra(tmp_reg) || } || } |.endmacro -|.macro SSE_GET_ZVAL_LVAL, reg, addr +|.macro SSE_GET_ZVAL_LVAL, reg, addr, tmp_reg || if (Z_MODE(addr) == IS_CONST_ZVAL) { -| SSE_GET_LONG reg, Z_LVAL_P(Z_ZV(addr)) +| SSE_GET_LONG reg, Z_LVAL_P(Z_ZV(addr)), tmp_reg || } else if (Z_MODE(addr) == IS_MEM_ZVAL) { -|| if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX) { +|| if (CAN_USE_AVX()) { | vxorps xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0) | vcvtsi2sd xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0), aword [Ra(Z_REG(addr))+Z_OFFSET(addr)] || } else { @@ -623,7 +638,7 @@ static void* dasm_labels[zend_lb_MAX]; | cvtsi2sd xmm(reg-ZREG_XMM0), aword [Ra(Z_REG(addr))+Z_OFFSET(addr)] || } || } else if (Z_MODE(addr) == IS_REG) { -|| if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX) { +|| if (CAN_USE_AVX()) { | vxorps xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0) | vcvtsi2sd xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0), Ra(Z_REG(addr)) || } else { @@ -639,7 +654,7 @@ static void* dasm_labels[zend_lb_MAX]; || if (Z_MODE(addr) != IS_REG || reg != Z_REG(addr)) { || if (Z_MODE(addr) == IS_CONST_ZVAL) { | .if X64 -|| if (IS_32BIT(Z_ZV(addr))) { +|| if (IS_SIGNED_32BIT(Z_ZV(addr))) { | SSE_AVX_INS movsd, vmovsd, xmm(reg-ZREG_XMM0), qword [Z_ZV(addr)] || } else { | LOAD_ADDR r0, Z_ZV(addr) @@ -658,19 +673,19 @@ static void* dasm_labels[zend_lb_MAX]; || } |.endmacro -|.macro SSE_MATH, opcode, reg, addr +|.macro SSE_MATH, opcode, reg, addr, tmp_reg || switch (opcode) { || case ZEND_ADD: -| SSE_OP addsd, reg, addr +| SSE_OP addsd, reg, addr, tmp_reg || break; || case ZEND_SUB: -| SSE_OP subsd, reg, addr +| SSE_OP subsd, reg, addr, tmp_reg || break; || case ZEND_MUL: -| SSE_OP mulsd, reg, addr +| SSE_OP mulsd, reg, addr, tmp_reg || break; || case ZEND_DIV: -| SSE_OP divsd, reg, addr +| SSE_OP divsd, reg, addr, tmp_reg || break; || } |.endmacro @@ -703,9 +718,9 @@ static void* dasm_labels[zend_lb_MAX]; || } |.endmacro -|.macro AVX_OP, avx_ins, reg, op1_reg, addr +|.macro AVX_OP, avx_ins, reg, op1_reg, addr, tmp_reg || if (Z_MODE(addr) == IS_CONST_ZVAL) { -| MEM_OP3_3 avx_ins, xmm(reg-ZREG_XMM0), xmm(op1_reg-ZREG_XMM0), qword, Z_ZV(addr), r0 +| MEM_OP3_3 avx_ins, xmm(reg-ZREG_XMM0), xmm(op1_reg-ZREG_XMM0), qword, Z_ZV(addr), tmp_reg || } else if (Z_MODE(addr) == IS_MEM_ZVAL) { | avx_ins xmm(reg-ZREG_XMM0), xmm(op1_reg-ZREG_XMM0), qword [Ra(Z_REG(addr))+Z_OFFSET(addr)] || } else if (Z_MODE(addr) == IS_REG) { @@ -715,19 +730,19 @@ static void* dasm_labels[zend_lb_MAX]; || } |.endmacro -|.macro AVX_MATH, opcode, reg, op1_reg, addr +|.macro AVX_MATH, opcode, reg, op1_reg, addr, tmp_reg || switch (opcode) { || case ZEND_ADD: -| AVX_OP vaddsd, reg, op1_reg, addr +| AVX_OP vaddsd, reg, op1_reg, addr, tmp_reg || break; || case ZEND_SUB: -| AVX_OP vsubsd, reg, op1_reg, addr +| AVX_OP vsubsd, reg, op1_reg, addr, tmp_reg || break; || case ZEND_MUL: -| AVX_OP vmulsd, reg, op1_reg, addr +| AVX_OP vmulsd, reg, op1_reg, addr, tmp_reg || break; || case ZEND_DIV: -| AVX_OP vdivsd, reg, op1_reg, addr +| AVX_OP vdivsd, reg, op1_reg, addr, tmp_reg || break; || } |.endmacro @@ -903,13 +918,13 @@ static void* dasm_labels[zend_lb_MAX]; || if (Z_TYPE_P(zv) == IS_DOUBLE) { || zend_reg dst_reg = (Z_MODE(dst_addr) == IS_REG) ? Z_REG(dst_addr) : ZREG_XMM0; || if (Z_DVAL_P(zv) == 0.0 && !is_signed(Z_DVAL_P(zv))) { -|| if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX) { +|| if (CAN_USE_AVX()) { | vxorps xmm(dst_reg-ZREG_XMM0), xmm(dst_reg-ZREG_XMM0), xmm(dst_reg-ZREG_XMM0) || } else { | xorps xmm(dst_reg-ZREG_XMM0), xmm(dst_reg-ZREG_XMM0) || } | .if X64 -|| } else if (!IS_32BIT(zv)) { +|| } else if (!IS_SIGNED_32BIT(zv)) { | mov64 Ra(tmp_reg), ((uintptr_t)zv) | SSE_AVX_INS movsd, vmovsd, xmm(dst_reg-ZREG_XMM0), qword [Ra(tmp_reg)] | .endif @@ -919,7 +934,7 @@ static void* dasm_labels[zend_lb_MAX]; | SSE_SET_ZVAL_DVAL dst_addr, dst_reg || } else if (Z_TYPE_P(zv) == IS_LONG && dst_def_info == MAY_BE_DOUBLE) { || zend_reg dst_reg = (Z_MODE(dst_addr) == IS_REG) ? Z_REG(dst_addr) : ZREG_XMM0; -| SSE_GET_LONG dst_reg, Z_LVAL_P(zv) +| SSE_GET_LONG dst_reg, Z_LVAL_P(zv), ZREG_R0 | SSE_SET_ZVAL_DVAL dst_addr, dst_reg || } else if (Z_LVAL_P(zv) == 0 && Z_MODE(dst_addr) == IS_REG) { | xor Ra(Z_REG(dst_addr)), Ra(Z_REG(dst_addr)) @@ -957,13 +972,13 @@ static void* dasm_labels[zend_lb_MAX]; || zend_reg dst_reg = (Z_MODE(dst_addr) == IS_REG) ? || Z_REG(dst_addr) : ((Z_MODE(res_addr) == IS_REG) ? Z_MODE(res_addr) : ZREG_XMM0); || if (Z_DVAL_P(zv) == 0.0 && !is_signed(Z_DVAL_P(zv))) { -|| if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX) { +|| if (CAN_USE_AVX()) { | vxorps xmm(dst_reg-ZREG_XMM0), xmm(dst_reg-ZREG_XMM0), xmm(dst_reg-ZREG_XMM0) || } else { | xorps xmm(dst_reg-ZREG_XMM0), xmm(dst_reg-ZREG_XMM0) || } | .if X64 -|| } else if (!IS_32BIT(zv)) { +|| } else if (!IS_SIGNED_32BIT(zv)) { | mov64 Ra(tmp_reg), ((uintptr_t)zv) | SSE_AVX_INS movsd, vmovsd, xmm(dst_reg-ZREG_XMM0), qword [Ra(tmp_reg)] | .endif @@ -974,13 +989,13 @@ static void* dasm_labels[zend_lb_MAX]; | SSE_SET_ZVAL_DVAL res_addr, ZREG_XMM0 || } else if (Z_TYPE_P(zv) == IS_LONG && dst_def_info == MAY_BE_DOUBLE) { || if (Z_MODE(dst_addr) == IS_REG) { -| SSE_GET_LONG Z_REG(dst_addr), Z_LVAL_P(zv) +| SSE_GET_LONG Z_REG(dst_addr), Z_LVAL_P(zv), ZREG_R0 | SSE_SET_ZVAL_DVAL res_addr, Z_REG(dst_addr) || } else if (Z_MODE(res_addr) == IS_REG) { -| SSE_GET_LONG Z_REG(res_addr), Z_LVAL_P(zv) +| SSE_GET_LONG Z_REG(res_addr), Z_LVAL_P(zv), ZREG_R0 | SSE_SET_ZVAL_DVAL dst_addr, Z_REG(res_addr) || } else { -| SSE_GET_LONG ZREG_XMM0, Z_LVAL_P(zv) +| SSE_GET_LONG ZREG_XMM0, Z_LVAL_P(zv), ZREG_R0 | SSE_SET_ZVAL_DVAL dst_addr, ZREG_XMM0 | SSE_SET_ZVAL_DVAL res_addr, ZREG_XMM0 || } @@ -1750,7 +1765,7 @@ static int zend_jit_interrupt_handler_stub(dasm_State **Dst) } | //ZEND_VM_CONTINUE() if (zend_jit_vm_kind == ZEND_VM_KIND_HYBRID) { - | add r4, HYBRID_SPAD + | ADD_HYBRID_SPAD | JMP_IP } else if (GCC_GLOBAL_REGS) { | add r4, SPAD // stack alignment @@ -1772,7 +1787,7 @@ static int zend_jit_exception_handler_stub(dasm_State **Dst) if (zend_jit_vm_kind == ZEND_VM_KIND_HYBRID) { const void *handler = zend_get_opcode_handler_func(EG(exception_op)); - | add r4, HYBRID_SPAD + | ADD_HYBRID_SPAD | EXT_CALL handler, r0 | JMP_IP } else { @@ -1825,11 +1840,11 @@ static int zend_jit_leave_function_stub(dasm_State **Dst) | test FCARG1d, ZEND_CALL_TOP | jnz >1 | EXT_CALL zend_jit_leave_nested_func_helper, r0 - | add r4, HYBRID_SPAD // stack alignment + | ADD_HYBRID_SPAD | JMP_IP |1: | EXT_CALL zend_jit_leave_top_func_helper, r0 - | add r4, HYBRID_SPAD // stack alignment + | ADD_HYBRID_SPAD | JMP_IP } else { if (GCC_GLOBAL_REGS) { @@ -2411,7 +2426,7 @@ static int zend_jit_trace_halt_stub(dasm_State **Dst) { |->trace_halt: if (zend_jit_vm_kind == ZEND_VM_KIND_HYBRID) { - | add r4, HYBRID_SPAD + | ADD_HYBRID_SPAD | EXT_JMP zend_jit_halt_op->handler, r0 } else if (GCC_GLOBAL_REGS) { | add r4, SPAD // stack alignment @@ -2503,7 +2518,7 @@ static int zend_jit_trace_exit_stub(dasm_State **Dst) | LOAD_IP if (zend_jit_vm_kind == ZEND_VM_KIND_HYBRID) { - | add r4, HYBRID_SPAD + | ADD_HYBRID_SPAD | JMP_IP } else if (GCC_GLOBAL_REGS) { | add r4, SPAD // stack alignment @@ -2529,7 +2544,7 @@ static int zend_jit_trace_exit_stub(dasm_State **Dst) | jne ->interrupt_handler if (zend_jit_vm_kind == ZEND_VM_KIND_HYBRID) { - | add r4, HYBRID_SPAD + | ADD_HYBRID_SPAD | mov r0, EX->func | mov r0, aword [r0 + offsetof(zend_op_array, reserved[zend_func_info_rid])] | mov r0, aword [r0 + offsetof(zend_jit_op_array_trace_extension, offset)] @@ -2564,7 +2579,7 @@ static int zend_jit_trace_escape_stub(dasm_State **Dst) |->trace_escape: | if (zend_jit_vm_kind == ZEND_VM_KIND_HYBRID) { - | add r4, HYBRID_SPAD + | ADD_HYBRID_SPAD | JMP_IP } else if (GCC_GLOBAL_REGS) { | add r4, SPAD // stack alignment @@ -2606,7 +2621,7 @@ static int zend_jit_context_threaded_call_stub(dasm_State **Dst) |->context_threaded_call: | pop r0 if (zend_jit_vm_kind == ZEND_VM_KIND_HYBRID) { - | add r4, HYBRID_SPAD + | ADD_HYBRID_SPAD | jmp aword [IP] } else if (GCC_GLOBAL_REGS) { | add r4, SPAD // stack alignment @@ -2847,12 +2862,12 @@ extern char *_tls_end; static int zend_jit_setup(void) { - if (!zend_cpu_supports(ZEND_CPU_FEATURE_SSE2)) { + if (!zend_cpu_supports_sse2()) { zend_error(E_CORE_ERROR, "CPU doesn't support SSE2"); return FAILURE; } allowed_opt_flags = 0; - if (zend_cpu_supports(ZEND_CPU_FEATURE_AVX)) { + if (zend_cpu_supports_avx()) { allowed_opt_flags |= ZEND_JIT_CPU_AVX; } @@ -2988,7 +3003,7 @@ static int zend_jit_align_func(dasm_State **Dst) static int zend_jit_prologue(dasm_State **Dst) { if (zend_jit_vm_kind == ZEND_VM_KIND_HYBRID) { - | sub r4, HYBRID_SPAD + | SUB_HYBRID_SPAD } else if (GCC_GLOBAL_REGS) { | sub r4, SPAD // stack alignment } else { @@ -3115,7 +3130,7 @@ static int zend_jit_trace_begin(dasm_State **Dst, uint32_t trace_num, zend_jit_t #if ZTS if (1) { #else - if ((sizeof(void*) == 8 && !IS_32BIT(&EG(jit_trace_num)))) { + if ((sizeof(void*) == 8 && !IS_SIGNED_32BIT(&EG(jit_trace_num)))) { #endif /* assignment to EG(jit_trace_num) shouldn't clober CPU register used by deoptimizer */ if (parent) { @@ -3137,6 +3152,10 @@ static int zend_jit_trace_begin(dasm_State **Dst, uint32_t trace_num, zend_jit_t } } + if (parent && parent->exit_info[exit_num].flags & ZEND_JIT_EXIT_METHOD_CALL) { + ZEND_REGSET_EXCL(regset, ZREG_R0); + } + current_trace_num = trace_num; | // EG(jit_trace_num) = trace_num; @@ -3338,10 +3357,13 @@ static int zend_jit_trace_link_to_root(dasm_State **Dst, zend_jit_trace_info *t, /* Skip prologue. */ // TODO: don't hardcode this ??? if (zend_jit_vm_kind == ZEND_VM_KIND_HYBRID) { +#ifdef ZEND_VM_HYBRID_JIT_RED_ZONE_SIZE + prologue_size = 0; +#elif defined(__x86_64__) || defined(_M_X64) // sub r4, HYBRID_SPAD -#if defined(__x86_64__) || defined(_M_X64) prologue_size = 4; #else + // sub r4, HYBRID_SPAD prologue_size = 3; #endif } else if (GCC_GLOBAL_REGS) { @@ -3381,7 +3403,7 @@ static int zend_jit_trace_return(dasm_State **Dst, zend_bool original_handler) | jmp ->trace_escape #else if (zend_jit_vm_kind == ZEND_VM_KIND_HYBRID) { - | add r4, HYBRID_SPAD + | ADD_HYBRID_SPAD if (!original_handler) { | JMP_IP } else { @@ -3467,7 +3489,9 @@ static int zend_jit_trace_handler(dasm_State **Dst, const zend_op_array *op_arra | mov FCARG1a, FP } | EXT_CALL handler, r0 - if (may_throw) { + if (may_throw + && opline->opcode != ZEND_RETURN + && opline->opcode != ZEND_RETURN_BY_REF) { | MEM_OP2_1_ZTS cmp, aword, executor_globals, exception, 0, r1 | jne ->exception_handler } @@ -3489,14 +3513,16 @@ static int zend_jit_trace_handler(dasm_State **Dst, const zend_op_array *op_arra } if (zend_jit_trace_may_exit(op_array, opline)) { - // TODO: try to avoid this check ??? if (opline->opcode == ZEND_RETURN || opline->opcode == ZEND_RETURN_BY_REF || opline->opcode == ZEND_GENERATOR_CREATE) { if (zend_jit_vm_kind == ZEND_VM_KIND_HYBRID) { +#if 0 + /* this check should be handled by the following OPLINE guard or jmp [IP] */ | cmp IP, zend_jit_halt_op | je ->trace_halt +#endif } else if (GCC_GLOBAL_REGS) { | test IP, IP | je ->trace_halt @@ -3646,13 +3672,13 @@ static int zend_jit_tail_handler(dasm_State **Dst, const zend_op *opline) /* Use inlined HYBRID VM handler */ const void *handler = opline->handler; - | add r4, HYBRID_SPAD + | ADD_HYBRID_SPAD | EXT_JMP handler, r0 } else { const void *handler = zend_get_opcode_handler_func(opline); | EXT_CALL handler, r0 - | add r4, HYBRID_SPAD + | ADD_HYBRID_SPAD | JMP_IP } } else { @@ -3926,6 +3952,17 @@ static int zend_jit_store_const(dasm_State **Dst, int var, zend_reg reg) return 1; } +static int zend_jit_free_trampoline(dasm_State **Dst) +{ + | /// if (UNEXPECTED(func->common.fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE)) + | test dword [r0 + offsetof(zend_function, common.fn_flags)], ZEND_ACC_CALL_VIA_TRAMPOLINE + | jz >1 + | mov FCARG1a, r0 + | EXT_CALL zend_jit_free_trampoline_helper, r0 + |1: + return 1; +} + static int zend_jit_inc_dec(dasm_State **Dst, const zend_op *opline, uint32_t op1_info, zend_jit_addr op1_addr, uint32_t op1_def_info, zend_jit_addr op1_def_addr, uint32_t res_use_info, uint32_t res_info, zend_jit_addr res_addr, int may_overflow, int may_throw) { if (op1_info & ((MAY_BE_UNDEF|MAY_BE_ANY)-MAY_BE_LONG)) { @@ -4113,13 +4150,13 @@ static int zend_jit_inc_dec(dasm_State **Dst, const zend_op *opline, uint32_t op } | SSE_GET_ZVAL_DVAL tmp_reg, op1_addr if (opline->opcode == ZEND_PRE_INC || opline->opcode == ZEND_POST_INC) { - if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX) { + if (CAN_USE_AVX()) { | vaddsd xmm(tmp_reg-ZREG_XMM0), xmm(tmp_reg-ZREG_XMM0), qword [->one] } else { | addsd xmm(tmp_reg-ZREG_XMM0), qword [->one] } } else { - if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX) { + if (CAN_USE_AVX()) { | vsubsd xmm(tmp_reg-ZREG_XMM0), xmm(tmp_reg-ZREG_XMM0), qword [->one] } else { | subsd xmm(tmp_reg-ZREG_XMM0), qword [->one] @@ -4147,6 +4184,22 @@ static int zend_jit_inc_dec(dasm_State **Dst, const zend_op *opline, uint32_t op return 1; } +static int zend_jit_opline_uses_reg(const zend_op *opline, int8_t reg) +{ + if ((opline+1)->opcode == ZEND_OP_DATA + && ((opline+1)->op1_type & (IS_VAR|IS_TMP_VAR|IS_CV)) + && JIT_G(current_frame)->stack[EX_VAR_TO_NUM((opline+1)->op1.var)].reg == reg) { + return 1; + } + return + ((opline->result_type & (IS_VAR|IS_TMP_VAR|IS_CV)) && + JIT_G(current_frame)->stack[EX_VAR_TO_NUM(opline->result.var)].reg == reg) || + ((opline->op1_type & (IS_VAR|IS_TMP_VAR|IS_CV)) && + JIT_G(current_frame)->stack[EX_VAR_TO_NUM(opline->op1.var)].reg == reg) || + ((opline->op2_type & (IS_VAR|IS_TMP_VAR|IS_CV)) && + JIT_G(current_frame)->stack[EX_VAR_TO_NUM(opline->op2.var)].reg == reg); +} + static int zend_jit_math_long_long(dasm_State **Dst, const zend_op *opline, zend_uchar opcode, @@ -4159,9 +4212,16 @@ static int zend_jit_math_long_long(dasm_State **Dst, { zend_bool same_ops = zend_jit_same_addr(op1_addr, op2_addr); zend_reg result_reg; + zend_reg tmp_reg = ZREG_R0; if (Z_MODE(res_addr) == IS_REG && (res_info & MAY_BE_LONG)) { - result_reg = Z_REG(res_addr); + if (may_overflow && (res_info & MAY_BE_GUARD) + && JIT_G(current_frame) + && zend_jit_opline_uses_reg(opline, Z_REG(res_addr))) { + result_reg = ZREG_R0; + } else { + result_reg = Z_REG(res_addr); + } } else if (Z_MODE(op1_addr) == IS_REG && Z_LAST_USE(op1_addr)) { result_reg = Z_REG(op1_addr); } else if (Z_REG(res_addr) != ZREG_R0) { @@ -4169,6 +4229,7 @@ static int zend_jit_math_long_long(dasm_State **Dst, } else { /* ASSIGN_DIM_OP */ result_reg = ZREG_FCARG1a; + tmp_reg = ZREG_FCARG1a; } if (opcode == ZEND_MUL && @@ -4232,6 +4293,9 @@ static int zend_jit_math_long_long(dasm_State **Dst, const void *exit_addr = zend_jit_trace_get_exit_addr(exit_point); if ((res_info & MAY_BE_ANY) == MAY_BE_LONG) { | jo &exit_addr + if (Z_MODE(res_addr) == IS_REG && result_reg != Z_REG(res_addr)) { + | mov Ra(Z_REG(res_addr)), Ra(result_reg) + } } else if ((res_info & MAY_BE_ANY) == MAY_BE_DOUBLE) { | jno &exit_addr } else { @@ -4288,9 +4352,9 @@ static int zend_jit_math_long_long(dasm_State **Dst, } } - | SSE_GET_ZVAL_LVAL tmp_reg1, op1_addr - | SSE_GET_ZVAL_LVAL tmp_reg2, op2_addr - if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX) { + | SSE_GET_ZVAL_LVAL tmp_reg1, op1_addr, tmp_reg + | SSE_GET_ZVAL_LVAL tmp_reg2, op2_addr, tmp_reg + if (CAN_USE_AVX()) { | AVX_MATH_REG opcode, tmp_reg1, tmp_reg1, tmp_reg2 } else { | SSE_MATH_REG opcode, tmp_reg1, tmp_reg2 @@ -4321,12 +4385,30 @@ static int zend_jit_math_long_double(dasm_State **Dst, { zend_reg result_reg = (Z_MODE(res_addr) == IS_REG) ? Z_REG(res_addr) : ZREG_XMM0; + zend_reg tmp_reg; - | SSE_GET_ZVAL_LVAL result_reg, op1_addr - if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX) { - | AVX_MATH opcode, result_reg, result_reg, op2_addr + if (Z_MODE(res_addr) == IS_MEM_ZVAL && Z_REG(res_addr) == ZREG_R0) { + /* ASSIGN_DIM_OP */ + tmp_reg = ZREG_R1; } else { - | SSE_MATH opcode, result_reg, op2_addr + tmp_reg = ZREG_R0; + } + + | SSE_GET_ZVAL_LVAL result_reg, op1_addr, tmp_reg + + if (Z_MODE(res_addr) == IS_MEM_ZVAL && Z_REG(res_addr) == ZREG_R0) { + /* ASSIGN_DIM_OP */ + if (CAN_USE_AVX()) { + | AVX_MATH opcode, result_reg, result_reg, op2_addr, r1 + } else { + | SSE_MATH opcode, result_reg, op2_addr, r1 + } + } else { + if (CAN_USE_AVX()) { + | AVX_MATH opcode, result_reg, result_reg, op2_addr, r0 + } else { + | SSE_MATH opcode, result_reg, op2_addr, r0 + } } | SSE_SET_ZVAL_DVAL res_addr, result_reg @@ -4346,7 +4428,7 @@ static int zend_jit_math_double_long(dasm_State **Dst, zend_jit_addr res_addr, uint32_t res_use_info) { - zend_reg result_reg; + zend_reg result_reg, tmp_reg; if (zend_is_commutative(opcode) && (Z_MODE(res_addr) != IS_REG || Z_MODE(op1_addr) != IS_REG || Z_REG(res_addr) != Z_REG(op1_addr))) { @@ -4355,11 +4437,26 @@ static int zend_jit_math_double_long(dasm_State **Dst, } else { result_reg = ZREG_XMM0; } - | SSE_GET_ZVAL_LVAL result_reg, op2_addr - if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX) { - | AVX_MATH opcode, result_reg, result_reg, op1_addr + if (Z_MODE(res_addr) == IS_MEM_ZVAL && Z_REG(res_addr) == ZREG_R0) { + /* ASSIGN_DIM_OP */ + tmp_reg = ZREG_R1; } else { - | SSE_MATH opcode, result_reg, op1_addr + tmp_reg = ZREG_R0; + } + | SSE_GET_ZVAL_LVAL result_reg, op2_addr, tmp_reg + if (Z_MODE(res_addr) == IS_MEM_ZVAL && Z_REG(res_addr) == ZREG_R0) { + /* ASSIGN_DIM_OP */ + if (CAN_USE_AVX()) { + | AVX_MATH opcode, result_reg, result_reg, op1_addr, r1 + } else { + | SSE_MATH opcode, result_reg, op1_addr, r1 + } + } else { + if (CAN_USE_AVX()) { + | AVX_MATH opcode, result_reg, result_reg, op1_addr, r0 + } else { + | SSE_MATH opcode, result_reg, op1_addr, r0 + } } } else { zend_reg tmp_reg; @@ -4374,7 +4471,7 @@ static int zend_jit_math_double_long(dasm_State **Dst, result_reg = ZREG_XMM0; tmp_reg = ZREG_XMM1; } - if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX) { + if (CAN_USE_AVX()) { zend_reg op1_reg; if (Z_MODE(op1_addr) == IS_REG) { @@ -4388,7 +4485,7 @@ static int zend_jit_math_double_long(dasm_State **Dst, && Z_LVAL_P(Z_ZV(op2_addr)) == 0) { /* +/- 0 */ } else { - | SSE_GET_ZVAL_LVAL tmp_reg, op2_addr + | SSE_GET_ZVAL_LVAL tmp_reg, op2_addr, ZREG_R0 | AVX_MATH_REG opcode, result_reg, op1_reg, tmp_reg } } else { @@ -4398,7 +4495,7 @@ static int zend_jit_math_double_long(dasm_State **Dst, && Z_LVAL_P(Z_ZV(op2_addr)) == 0) { /* +/- 0 */ } else { - | SSE_GET_ZVAL_LVAL tmp_reg, op2_addr + | SSE_GET_ZVAL_LVAL tmp_reg, op2_addr, ZREG_R0 | SSE_MATH_REG opcode, result_reg, tmp_reg } } @@ -4436,7 +4533,7 @@ static int zend_jit_math_double_double(dasm_State **Dst, result_reg = ZREG_XMM0; } - if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX) { + if (CAN_USE_AVX()) { zend_reg op1_reg; zend_jit_addr val_addr; @@ -4454,8 +4551,11 @@ static int zend_jit_math_double_double(dasm_State **Dst, if ((opcode == ZEND_MUL) && Z_MODE(val_addr) == IS_CONST_ZVAL && Z_DVAL_P(Z_ZV(val_addr)) == 2.0) { | AVX_MATH_REG ZEND_ADD, result_reg, op1_reg, op1_reg + } else if (Z_MODE(res_addr) == IS_MEM_ZVAL && Z_REG(res_addr) == ZREG_R0) { + /* ASSIGN_DIM_OP */ + | AVX_MATH opcode, result_reg, op1_reg, val_addr, r1 } else { - | AVX_MATH opcode, result_reg, op1_reg, val_addr + | AVX_MATH opcode, result_reg, op1_reg, val_addr, r0 } } else { zend_jit_addr val_addr; @@ -4472,8 +4572,11 @@ static int zend_jit_math_double_double(dasm_State **Dst, } else if ((opcode == ZEND_MUL) && Z_MODE(val_addr) == IS_CONST_ZVAL && Z_DVAL_P(Z_ZV(val_addr)) == 2.0) { | SSE_MATH_REG ZEND_ADD, result_reg, result_reg + } else if (Z_MODE(res_addr) == IS_MEM_ZVAL && Z_REG(res_addr) == ZREG_R0) { + /* ASSIGN_DIM_OP */ + | SSE_MATH opcode, result_reg, val_addr, r1 } else { - | SSE_MATH opcode, result_reg, val_addr + | SSE_MATH opcode, result_reg, val_addr, r0 } } | SSE_SET_ZVAL_DVAL res_addr, result_reg @@ -5950,7 +6053,7 @@ static int zend_jit_assign_to_variable(dasm_State **Dst, zval *zv = Z_ZV(val_addr); if (Z_TYPE_P(zv) == IS_DOUBLE) { - if (Z_DVAL_P(zv) == 0 || IS_32BIT(zv)) { + if (Z_DVAL_P(zv) == 0 || IS_SIGNED_32BIT(zv)) { keep_gc = 1; } } else if (IS_SIGNED_32BIT(Z_LVAL_P(zv))) { @@ -7271,7 +7374,7 @@ static int zend_jit_cmp_long_double(dasm_State **Dst, const zend_op *opline, zen { zend_reg tmp_reg = ZREG_XMM0; - | SSE_GET_ZVAL_LVAL tmp_reg, op1_addr + | SSE_GET_ZVAL_LVAL tmp_reg, op1_addr, ZREG_R0 | SSE_AVX_OP ucomisd, vucomisd, tmp_reg, op2_addr return zend_jit_cmp_double_common(Dst, opline, res_addr, 0, smart_branch_opcode, target_label, target_label2, exit_addr); @@ -7281,7 +7384,7 @@ static int zend_jit_cmp_double_long(dasm_State **Dst, const zend_op *opline, zen { zend_reg tmp_reg = ZREG_XMM0; - | SSE_GET_ZVAL_LVAL tmp_reg, op2_addr + | SSE_GET_ZVAL_LVAL tmp_reg, op2_addr, ZREG_R0 | SSE_AVX_OP ucomisd, vucomisd, tmp_reg, op1_addr return zend_jit_cmp_double_common(Dst, opline, res_addr, /* swap */ 1, smart_branch_opcode, target_label, target_label2, exit_addr); @@ -8359,7 +8462,7 @@ static int zend_jit_bool_jmpznz(dasm_State **Dst, const zend_op *opline, uint32_ } if ((op1_info & MAY_BE_ANY) == MAY_BE_DOUBLE) { - if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX) { + if (CAN_USE_AVX()) { | vxorps xmm0, xmm0, xmm0 } else { | xorps xmm0, xmm0 @@ -9027,8 +9130,8 @@ static int zend_jit_init_fcall_guard(dasm_State **Dst, uint32_t level, const zen | mov r1, aword EX:r1->func | .if X64 || if (!IS_SIGNED_32BIT(opcodes)) { - | mov64 r0, ((ptrdiff_t)opcodes) - | cmp aword [r1 + offsetof(zend_op_array, opcodes)], r0 + | mov64 r2, ((ptrdiff_t)opcodes) + | cmp aword [r1 + offsetof(zend_op_array, opcodes)], r2 || } else { | cmp aword [r1 + offsetof(zend_op_array, opcodes)], opcodes || } @@ -9039,8 +9142,8 @@ static int zend_jit_init_fcall_guard(dasm_State **Dst, uint32_t level, const zen } else { | .if X64 || if (!IS_SIGNED_32BIT(func)) { - | mov64 r0, ((ptrdiff_t)func) - | cmp aword EX:r1->func, r0 + | mov64 r2, ((ptrdiff_t)func) + | cmp aword EX:r1->func, r2 || } else { | cmp aword EX:r1->func, func || } @@ -9216,7 +9319,8 @@ static int zend_jit_init_method_call(dasm_State **Dst, zend_bool use_this, zend_class_entry *trace_ce, zend_jit_trace_rec *trace, - zend_bool stack_check) + zend_bool stack_check, + zend_bool polymorphic_side_trace) { zend_func_info *info = ZEND_FUNC_INFO(op_array); zend_call_info *call_info = NULL; @@ -9228,114 +9332,118 @@ static int zend_jit_init_method_call(dasm_State **Dst, function_name = RT_CONSTANT(opline, opline->op2); - if (opline->op1_type == IS_UNUSED || use_this) { - zend_jit_addr this_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, offsetof(zend_execute_data, This)); + if (info) { + call_info = info->callee_info; + while (call_info && call_info->caller_init_opline != opline) { + call_info = call_info->next_callee; + } + if (call_info && call_info->callee_func) { + func = call_info->callee_func; + } + } - | GET_ZVAL_PTR FCARG1a, this_addr + if (polymorphic_side_trace) { + /* function is passed in r0 from parent_trace */ } else { - if (op1_info & MAY_BE_REF) { - if (opline->op1_type == IS_CV) { - if (Z_REG(op1_addr) != ZREG_FCARG1a || Z_OFFSET(op1_addr) != 0) { + if (opline->op1_type == IS_UNUSED || use_this) { + zend_jit_addr this_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, offsetof(zend_execute_data, This)); + + | GET_ZVAL_PTR FCARG1a, this_addr + } else { + if (op1_info & MAY_BE_REF) { + if (opline->op1_type == IS_CV) { + if (Z_REG(op1_addr) != ZREG_FCARG1a || Z_OFFSET(op1_addr) != 0) { + | LOAD_ZVAL_ADDR FCARG1a, op1_addr + } + | ZVAL_DEREF FCARG1a, op1_info + op1_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1a, 0); + } else { + /* Hack: Convert reference to regular value to simplify JIT code */ + ZEND_ASSERT(Z_REG(op1_addr) == ZREG_FP); + | IF_NOT_ZVAL_TYPE op1_addr, IS_REFERENCE, >1 | LOAD_ZVAL_ADDR FCARG1a, op1_addr + | EXT_CALL zend_jit_unref_helper, r0 + |1: } - | ZVAL_DEREF FCARG1a, op1_info - op1_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1a, 0); - } else { - /* Hack: Convert reference to regular value to simplify JIT code */ - ZEND_ASSERT(Z_REG(op1_addr) == ZREG_FP); - | IF_NOT_ZVAL_TYPE op1_addr, IS_REFERENCE, >1 - | LOAD_ZVAL_ADDR FCARG1a, op1_addr - | EXT_CALL zend_jit_unref_helper, r0 - |1: } - } - if (op1_info & ((MAY_BE_UNDEF|MAY_BE_ANY)- MAY_BE_OBJECT)) { - if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE) { - int32_t exit_point = zend_jit_trace_get_exit_point(opline, ZEND_JIT_EXIT_TO_VM); - const void *exit_addr = zend_jit_trace_get_exit_addr(exit_point); + if (op1_info & ((MAY_BE_UNDEF|MAY_BE_ANY)- MAY_BE_OBJECT)) { + if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE) { + int32_t exit_point = zend_jit_trace_get_exit_point(opline, ZEND_JIT_EXIT_TO_VM); + const void *exit_addr = zend_jit_trace_get_exit_addr(exit_point); - if (!exit_addr) { - return 0; - } - | IF_NOT_ZVAL_TYPE op1_addr, IS_OBJECT, &exit_addr - } else { - | IF_NOT_ZVAL_TYPE op1_addr, IS_OBJECT, >1 - |.cold_code - |1: - if (Z_REG(op1_addr) != ZREG_FCARG1a || Z_OFFSET(op1_addr) != 0) { - | LOAD_ZVAL_ADDR FCARG1a, op1_addr - } - | SET_EX_OPLINE opline, r0 - if ((opline->op1_type & (IS_VAR|IS_TMP_VAR)) && !use_this) { - | EXT_CALL zend_jit_invalid_method_call_tmp, r0 + if (!exit_addr) { + return 0; + } + | IF_NOT_ZVAL_TYPE op1_addr, IS_OBJECT, &exit_addr } else { - | EXT_CALL zend_jit_invalid_method_call, r0 + | IF_NOT_ZVAL_TYPE op1_addr, IS_OBJECT, >1 + |.cold_code + |1: + if (Z_REG(op1_addr) != ZREG_FCARG1a || Z_OFFSET(op1_addr) != 0) { + | LOAD_ZVAL_ADDR FCARG1a, op1_addr + } + | SET_EX_OPLINE opline, r0 + if ((opline->op1_type & (IS_VAR|IS_TMP_VAR)) && !use_this) { + | EXT_CALL zend_jit_invalid_method_call_tmp, r0 + } else { + | EXT_CALL zend_jit_invalid_method_call, r0 + } + | jmp ->exception_handler + |.code } - | jmp ->exception_handler - |.code } + | GET_ZVAL_PTR FCARG1a, op1_addr } - | GET_ZVAL_PTR FCARG1a, op1_addr - } - if (delayed_call_chain) { - if (!zend_jit_save_call_chain(Dst, delayed_call_level)) { - return 0; + if (delayed_call_chain) { + if (!zend_jit_save_call_chain(Dst, delayed_call_level)) { + return 0; + } } - } - if (info) { - call_info = info->callee_info; - while (call_info && call_info->caller_init_opline != opline) { - call_info = call_info->next_callee; - } - if (call_info && call_info->callee_func) { - func = call_info->callee_func; - } - } + | mov aword T1, FCARG1a // save - | mov aword T1, FCARG1a // save + if (func) { + | // fbc = CACHED_PTR(opline->result.num + sizeof(void*)); + | mov r0, EX->run_time_cache + | mov r0, aword [r0 + opline->result.num + sizeof(void*)] + | test r0, r0 + | jz >1 + } else { + | // if (CACHED_PTR(opline->result.num) == obj->ce)) { + | mov r0, EX->run_time_cache + | mov r2, aword [r0 + opline->result.num] + | cmp r2, [FCARG1a + offsetof(zend_object, ce)] + | jnz >1 + | // fbc = CACHED_PTR(opline->result.num + sizeof(void*)); + | mov r0, aword [r0 + opline->result.num + sizeof(void*)] + } - if (func) { - | // fbc = CACHED_PTR(opline->result.num + sizeof(void*)); - | mov r0, EX->run_time_cache - | mov r0, aword [r0 + opline->result.num + sizeof(void*)] + |.cold_code + |1: + | LOAD_ADDR FCARG2a, function_name + |.if X64 + | lea CARG3, aword T1 + |.else + | lea r0, aword T1 + | sub r4, 12 + | push r0 + |.endif + | SET_EX_OPLINE opline, r0 + if ((opline->op1_type & (IS_VAR|IS_TMP_VAR)) && !use_this) { + | EXT_CALL zend_jit_find_method_tmp_helper, r0 + } else { + | EXT_CALL zend_jit_find_method_helper, r0 + } + |.if not(X64) + | add r4, 12 + |.endif | test r0, r0 - | jz >1 - } else { - | // if (CACHED_PTR(opline->result.num) == obj->ce)) { - | mov r0, EX->run_time_cache - | mov r2, aword [r0 + opline->result.num] - | cmp r2, [FCARG1a + offsetof(zend_object, ce)] - | jnz >1 - | // fbc = CACHED_PTR(opline->result.num + sizeof(void*)); - | mov r0, aword [r0 + opline->result.num + sizeof(void*)] - } - - |.cold_code - |1: - | LOAD_ADDR FCARG2a, function_name - |.if X64 - | lea CARG3, aword T1 - |.else - | lea r0, aword T1 - | sub r4, 12 - | push r0 - |.endif - | SET_EX_OPLINE opline, r0 - if ((opline->op1_type & (IS_VAR|IS_TMP_VAR)) && !use_this) { - | EXT_CALL zend_jit_find_method_tmp_helper, r0 - } else { - | EXT_CALL zend_jit_find_method_helper, r0 + | jnz >2 + | jmp ->exception_handler + |.code + |2: } - |.if not(X64) - | add r4, 12 - |.endif - | test r0, r0 - | jnz >2 - | jmp ->exception_handler - |.code - |2: if (!func && trace @@ -9348,7 +9456,7 @@ static int zend_jit_init_method_call(dasm_State **Dst, int32_t exit_point; const void *exit_addr; - exit_point = zend_jit_trace_get_exit_point(opline, ZEND_JIT_EXIT_DYNAMIC_CALL); + exit_point = zend_jit_trace_get_exit_point(opline, ZEND_JIT_EXIT_METHOD_CALL); exit_addr = zend_jit_trace_get_exit_addr(exit_point); if (!exit_addr) { return 0; @@ -9500,7 +9608,7 @@ static int zend_jit_init_closure_call(dasm_State **Dst, func = (zend_function*)trace->func; opcodes = func->op_array.opcodes; - exit_point = zend_jit_trace_get_exit_point(opline, ZEND_JIT_EXIT_DYNAMIC_CALL); + exit_point = zend_jit_trace_get_exit_point(opline, ZEND_JIT_EXIT_CLOSURE_CALL); exit_addr = zend_jit_trace_get_exit_addr(exit_point); if (!exit_addr) { return 0; @@ -9972,7 +10080,7 @@ static int zend_jit_do_fcall(dasm_State **Dst, const zend_op *opline, const zend } #else if (zend_jit_vm_kind == ZEND_VM_KIND_HYBRID) { - | add r4, HYBRID_SPAD + | ADD_HYBRID_SPAD | JMP_IP } else if (GCC_GLOBAL_REGS) { | add r4, SPAD // stack alignment @@ -10092,7 +10200,10 @@ static int zend_jit_do_fcall(dasm_State **Dst, const zend_op *opline, const zend if (JIT_G(trigger) != ZEND_JIT_ON_HOT_TRACE || !JIT_G(current_frame) || !JIT_G(current_frame)->call || - !TRACE_FRAME_IS_NESTED(JIT_G(current_frame)->call)) { + !TRACE_FRAME_IS_NESTED(JIT_G(current_frame)->call) || + prev_opline->opcode == ZEND_SEND_UNPACK || + prev_opline->opcode == ZEND_SEND_ARRAY || + prev_opline->opcode == ZEND_CHECK_UNDEF_ARGS) { | // zend_vm_stack_free_call_frame(call); | test byte [RX + offsetof(zend_execute_data, This.u1.type_info) + 2], (ZEND_CALL_ALLOCATED >> 16) @@ -10703,16 +10814,16 @@ static int zend_jit_defined(dasm_State **Dst, const zend_op *opline, zend_uchar | test r0, r0 if (exit_addr) { if (smart_branch_opcode == ZEND_JMPNZ) { - | jnz >3 - } else { | jz >3 + } else { + | jnz >3 } | jmp &exit_addr } else if (smart_branch_opcode) { if (undefined_label != (uint32_t)-1) { - | jnz =>undefined_label + | jz =>undefined_label } else { - | jnz >3 + | jz >3 } if (defined_label != (uint32_t)-1) { | jmp =>defined_label @@ -10721,7 +10832,7 @@ static int zend_jit_defined(dasm_State **Dst, const zend_op *opline, zend_uchar } } else { res_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->result.var); - | jz >1 + | jnz >1 |2: | SET_ZVAL_TYPE_INFO res_addr, IS_FALSE | jmp >3 @@ -11208,7 +11319,11 @@ static int zend_jit_leave_func(dasm_State **Dst, trace_info->flags |= ZEND_JIT_TRACE_LOOP; | CMP_IP next_opline | je =>0 // LOOP +#ifdef ZEND_VM_HYBRID_JIT_RED_ZONE_SIZE + | JMP_IP +#else | jmp ->trace_escape +#endif } else { | CMP_IP next_opline | jne ->trace_escape @@ -11238,7 +11353,7 @@ static int zend_jit_leave_func(dasm_State **Dst, } if (zend_jit_vm_kind == ZEND_VM_KIND_HYBRID) { - | add r4, HYBRID_SPAD + | ADD_HYBRID_SPAD #ifdef CONTEXT_THREADED_JIT | push aword [IP] | ret @@ -12012,6 +12127,13 @@ static int zend_jit_fetch_dim(dasm_State **Dst, } } +#ifdef ZEND_JIT_USE_RC_INFERENCE + if ((opline->op2_type & (IS_TMP_VAR|IS_VAR)) && (op1_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_ARRAY|MAY_BE_OBJECT))) { + /* ASSIGN_DIM may increase refcount of the key */ + op2_info |= MAY_BE_RCN; + } +#endif + |8: | FREE_OP opline->op2_type, opline->op2, op2_info, 0, opline @@ -12438,7 +12560,7 @@ static int zend_jit_recv_init(dasm_State **Dst, const zend_op *opline, const zen | .if X64 | EXT_CALL zval_update_constant_ex, r0 | .else - ||#if (PHP_VERSION_ID <= 80000) + ||#if (PHP_VERSION_ID < 80100) && (SIZEOF_SIZE_T == 4) | EXT_CALL zval_jit_update_constant_ex, r0 ||#else | EXT_CALL zval_update_constant_ex, r0 @@ -14116,10 +14238,10 @@ static int zend_jit_load_this(dasm_State **Dst, uint32_t var) { zend_jit_addr var_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, var); - | mov r0, aword EX->This.value.ptr - | SET_ZVAL_PTR var_addr, r0 + | mov FCARG1a, aword EX->This.value.ptr + | SET_ZVAL_PTR var_addr, FCARG1a | SET_ZVAL_TYPE_INFO var_addr, IS_OBJECT_EX - | GC_ADDREF r0 + | GC_ADDREF FCARG1a return 1; } @@ -14824,26 +14946,66 @@ static int zend_jit_fe_fetch(dasm_State **Dst, const zend_op *opline, uint32_t o return 1; } -static int zend_jit_fetch_constant(dasm_State **Dst, const zend_op *opline) +static int zend_jit_fetch_constant(dasm_State **Dst, + const zend_op *opline, + const zend_op_array *op_array, + zend_ssa *ssa, + const zend_ssa_op *ssa_op) { zval *zv = RT_CONSTANT(opline, opline->op2) + 1; zend_jit_addr res_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->result.var); - zend_jit_addr const_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1a, 0); + zend_jit_addr const_addr = ZEND_ADDR_MEM_ZVAL(ZREG_R0, 0); + uint32_t res_info = RES_INFO(); | // c = CACHED_PTR(opline->extended_value); | mov FCARG1a, EX->run_time_cache - | mov FCARG1a, aword [FCARG1a + opline->extended_value] + | mov r0, aword [FCARG1a + opline->extended_value] | // if (c != NULL) - | test FCARG1a, FCARG1a + | test r0, r0 | jz >9 | // if (!IS_SPECIAL_CACHE_VAL(c)) - | test FCARG1a, CACHE_SPECIAL + | test r0, CACHE_SPECIAL | jnz >9 - | // ZVAL_COPY_OR_DUP(EX_VAR(opline->result.var), &c->value); (no dup) - | ZVAL_COPY_VALUE res_addr, MAY_BE_ANY, const_addr, MAY_BE_ANY, ZREG_R0, ZREG_FCARG2a - | TRY_ADDREF MAY_BE_ANY, ah, FCARG2a |8: + if ((res_info & MAY_BE_GUARD) && JIT_G(current_frame)) { + zend_jit_trace_stack *stack = JIT_G(current_frame)->stack; + uint32_t old_info = STACK_INFO(stack, EX_VAR_TO_NUM(opline->result.var)); + int32_t exit_point; + const void *exit_addr = NULL; + + SET_STACK_TYPE(stack, EX_VAR_TO_NUM(opline->result.var), IS_UNKNOWN, 1); + SET_STACK_REG(stack, EX_VAR_TO_NUM(opline->result.var), ZREG_ZVAL_COPY_R0); + exit_point = zend_jit_trace_get_exit_point(opline+1, 0); + SET_STACK_INFO(stack, EX_VAR_TO_NUM(opline->result.var), old_info); + exit_addr = zend_jit_trace_get_exit_addr(exit_point); + if (!exit_addr) { + return 0; + } + res_info &= ~MAY_BE_GUARD; + ssa->var_info[ssa_op->result_def].type &= ~MAY_BE_GUARD; + + zend_uchar type = concrete_type(res_info); + + if (type < IS_STRING) { + | IF_NOT_ZVAL_TYPE const_addr, type, &exit_addr + } else { + | GET_ZVAL_TYPE_INFO edx, const_addr + | IF_NOT_TYPE dl, type, &exit_addr + } + | ZVAL_COPY_VALUE_V res_addr, -1, const_addr, res_info, ZREG_R0, ZREG_R1 + if (type < IS_STRING) { + | SET_ZVAL_TYPE_INFO res_addr, type + } else { + | SET_ZVAL_TYPE_INFO res_addr, edx + | TRY_ADDREF res_info, dh, r1 + } + } else { + | // ZVAL_COPY_OR_DUP(EX_VAR(opline->result.var), &c->value); (no dup) + | ZVAL_COPY_VALUE res_addr, MAY_BE_ANY, const_addr, MAY_BE_ANY, ZREG_R0, ZREG_R1 + | TRY_ADDREF MAY_BE_ANY, ah, r1 + } + |.cold_code |9: | // SAVE_OPLINE(); @@ -14854,7 +15016,7 @@ static int zend_jit_fetch_constant(dasm_State **Dst, const zend_op *opline) | EXT_CALL zend_jit_get_constant, r0 | // ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); | test r0, r0 - | jz <8 + | jnz <8 | jmp ->exception_handler |.code @@ -15209,7 +15371,7 @@ static zend_bool zend_needs_extra_reg_for_const(const zend_op *opline, zend_ucha |.if X64 || if (op_type == IS_CONST) { || zval *zv = RT_CONSTANT(opline, op); -|| if (Z_TYPE_P(zv) == IS_DOUBLE && Z_DVAL_P(zv) != 0 && !IS_32BIT(zv)) { +|| if (Z_TYPE_P(zv) == IS_DOUBLE && Z_DVAL_P(zv) != 0 && !IS_SIGNED_32BIT(zv)) { || return 1; || } else if (Z_TYPE_P(zv) == IS_LONG && !IS_SIGNED_32BIT(Z_LVAL_P(zv))) { || return 1; @@ -15554,7 +15716,7 @@ static zend_regset zend_jit_get_scratch_regset(const zend_op *opline, const zend #if ZTS ZEND_REGSET_INCL(regset, ZREG_R0); #else - if ((sizeof(void*) == 8 && !IS_32BIT(&EG(vm_interrupt)))) { + if ((sizeof(void*) == 8 && !IS_SIGNED_32BIT(&EG(vm_interrupt)))) { ZEND_REGSET_INCL(regset, ZREG_R0); } #endif @@ -15567,7 +15729,7 @@ static zend_regset zend_jit_get_scratch_regset(const zend_op *opline, const zend #if ZTS ZEND_REGSET_INCL(regset, ZREG_R0); #else - if ((sizeof(void*) == 8 && !IS_32BIT(&EG(vm_interrupt)))) { + if ((sizeof(void*) == 8 && !IS_SIGNED_32BIT(&EG(vm_interrupt)))) { ZEND_REGSET_INCL(regset, ZREG_R0); } #endif diff --git a/ext/opcache/shared_alloc_win32.c b/ext/opcache/shared_alloc_win32.c index 06df5270d4b7b..780fd78f897ba 100644 --- a/ext/opcache/shared_alloc_win32.c +++ b/ext/opcache/shared_alloc_win32.c @@ -142,7 +142,7 @@ static int zend_shared_alloc_reattach(size_t requested_size, char **error_in) } pre_size = ZEND_ALIGNED_SIZE(sizeof(zend_smm_shared_globals)) + ZEND_ALIGNED_SIZE(sizeof(zend_shared_segment)) + ZEND_ALIGNED_SIZE(sizeof(void *)) + ZEND_ALIGNED_SIZE(sizeof(int)); - /* Map only part of SHM to have access opcache shared globals */ + /* Map only part of SHM to have access to opcache shared globals */ mapping_base = MapViewOfFileEx(memfile, FILE_MAP_ALL_ACCESS, 0, 0, pre_size + ZEND_ALIGNED_SIZE(sizeof(zend_accel_shared_globals)), NULL); if (mapping_base == NULL) { err = GetLastError(); @@ -210,7 +210,7 @@ static int create_segments(size_t requested_size, zend_shared_segment ***shared_ zend_shared_alloc_lock_win32(); /* Mapping retries: When Apache2 restarts, the parent process startup routine - can be called before the child process is killed. In this case, the map will fail + can be called before the child process is killed. In this case, the mapping will fail and we have to sleep some time (until the child releases the mapping object) and retry.*/ do { memfile = OpenFileMapping(FILE_MAP_READ|FILE_MAP_WRITE|FILE_MAP_EXECUTE, 0, create_name_with_username(ACCEL_FILEMAP_NAME)); @@ -267,15 +267,15 @@ static int create_segments(size_t requested_size, zend_shared_segment ***shared_ return ALLOC_FAILURE; } - /* Starting from windows Vista, heap randomization occurs which might cause our mapping base to - be taken (fail to map). So under Vista, we try to map into a hard coded predefined addresses + /* Starting from Windows Vista, heap randomization occurs which might cause our mapping base to + be taken (fail to map). So we try to map into one of the hard coded predefined addresses in high memory. */ if (!ZCG(accel_directives).mmap_base || !*ZCG(accel_directives).mmap_base) { wanted_mapping_base = vista_mapping_base_set; } else { char *s = ZCG(accel_directives).mmap_base; - /* skip leading 0x, %p assumes hexdeciaml format anyway */ + /* skip leading 0x, %p assumes hexdecimal format anyway */ if (*s == '0' && *(s + 1) == 'x') { s += 2; } diff --git a/ext/opcache/tests/jit/bug80426.phpt b/ext/opcache/tests/jit/bug80426.phpt new file mode 100644 index 0000000000000..19364e8a6cc8e --- /dev/null +++ b/ext/opcache/tests/jit/bug80426.phpt @@ -0,0 +1,28 @@ +--TEST-- +Bug #80426: Crash when using JIT and an extension replacing zend_execute_ex with custom +--INI-- +opcache.enable=1 +opcache.enable_cli=1 +opcache.jit_buffer_size=1M +zend_test.replace_zend_execute_ex=1 +--SKIPIF-- + + + +--FILE-- + +===DONE=== +--EXPECT-- +Warning: JIT is incompatible with third party extensions that override zend_execute_ex(). JIT disabled. in Unknown on line 0 +===DONE=== diff --git a/ext/opcache/tests/jit/bug80447.phpt b/ext/opcache/tests/jit/bug80447.phpt new file mode 100644 index 0000000000000..b09ff5c698a91 --- /dev/null +++ b/ext/opcache/tests/jit/bug80447.phpt @@ -0,0 +1,34 @@ +--TEST-- +Bug #80447 (Strange out of memory error when running with JIT) +--INI-- +opcache.enable=1 +opcache.enable_cli=1 +opcache.file_update_protection=0 +opcache.jit_buffer_size=1M +opcache.protect_memory=1 +--SKIPIF-- + +--FILE-- + +--FILE-- +===DONE=== +--EXPECT-- +===DONE=== diff --git a/ext/opcache/tests/jit/trampoline_001.phpt b/ext/opcache/tests/jit/trampoline_001.phpt new file mode 100644 index 0000000000000..95041257a7ba4 --- /dev/null +++ b/ext/opcache/tests/jit/trampoline_001.phpt @@ -0,0 +1,34 @@ +--TEST-- +JIT Trampoline 001: trampoline cleanup +--INI-- +opcache.enable=1 +opcache.enable_cli=1 +opcache.file_update_protection=0 +opcache.jit_buffer_size=1M +opcache.jit=tracing +--SKIPIF-- + +--FILE-- +foo(); +} +echo "\n"; +?> +--EXPECT-- +BBBCCC diff --git a/ext/opcache/tests/jit/trampoline_002.phpt b/ext/opcache/tests/jit/trampoline_002.phpt new file mode 100644 index 0000000000000..10e02e864e29b --- /dev/null +++ b/ext/opcache/tests/jit/trampoline_002.phpt @@ -0,0 +1,40 @@ +--TEST-- +JIT Trampoline 002: trampoline cleanup +--INI-- +opcache.enable=1 +opcache.enable_cli=1 +opcache.file_update_protection=0 +opcache.jit_buffer_size=1M +opcache.jit=tracing +--SKIPIF-- + +--FILE-- +foo(); +} +echo "\n"; +?> +--EXPECT-- +BBBCCCDDDCCC diff --git a/ext/opcache/tests/opt/sccp_exception.phpt b/ext/opcache/tests/opt/sccp_exception.phpt new file mode 100644 index 0000000000000..685dfe1340e3e --- /dev/null +++ b/ext/opcache/tests/opt/sccp_exception.phpt @@ -0,0 +1,12 @@ +--TEST-- +Exception thrown during SCCP evaluation +--FILE-- + +--EXPECTF-- +Fatal error: Uncaught ValueError: version_compare(): Argument #3 ($operator) must be a valid comparison operator in %s:%d +Stack trace: +#0 %s(%d): version_compare('1.2', '2.1', '??') +#1 {main} + thrown in %s on line %d diff --git a/ext/opcache/tests/opt/sccp_exception2.inc b/ext/opcache/tests/opt/sccp_exception2.inc new file mode 100644 index 0000000000000..896d89dde2cae --- /dev/null +++ b/ext/opcache/tests/opt/sccp_exception2.inc @@ -0,0 +1,2 @@ + +--EXPECTF-- +Fatal error: Uncaught ValueError: version_compare(): Argument #3 ($operator) must be a valid comparison operator in %s:%d +Stack trace: +#0 %s(%d): version_compare('1.2', '2.1', '??') +#1 %s(%d): require('%s') +#2 {main} + thrown in %s on line %d diff --git a/ext/opcache/tests/opt/sccp_exception3.phpt b/ext/opcache/tests/opt/sccp_exception3.phpt new file mode 100644 index 0000000000000..e72a19d805378 --- /dev/null +++ b/ext/opcache/tests/opt/sccp_exception3.phpt @@ -0,0 +1,15 @@ +--TEST-- +Exception thrown during SCCP evaluation, strict types variation +--FILE-- + +--EXPECTF-- +Fatal error: Uncaught TypeError: str_contains(): Argument #2 ($needle) must be of type string, int given in %s:%d +Stack trace: +#0 %s(%d): str_contains('123', 1) +#1 {main} + thrown in %s on line %d diff --git a/ext/opcache/tests/opt/sccp_in_array.phpt b/ext/opcache/tests/opt/sccp_in_array.phpt new file mode 100644 index 0000000000000..e7716b8ad8e91 --- /dev/null +++ b/ext/opcache/tests/opt/sccp_in_array.phpt @@ -0,0 +1,14 @@ +--TEST-- +Don't replace IN_ARRAY result type if the using opcode doesn't support it +--FILE-- + +--EXPECT-- +bool(true) diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c index 113d0c2ec4aa8..effc659b68fd0 100644 --- a/ext/openssl/openssl.c +++ b/ext/openssl/openssl.c @@ -6886,7 +6886,9 @@ static void php_openssl_load_cipher_mode(struct php_openssl_cipher_mode *mode, c int cipher_mode = EVP_CIPHER_mode(cipher_type); memset(mode, 0, sizeof(struct php_openssl_cipher_mode)); switch (cipher_mode) { -#if PHP_OPENSSL_API_VERSION >= 0x10100 +#ifdef EVP_CIPH_OCB_MODE + /* Since OpenSSL 1.1, all AEAD ciphers use a common framework. We check for + * EVP_CIPH_OCB_MODE, because LibreSSL does not support it. */ case EVP_CIPH_GCM_MODE: case EVP_CIPH_OCB_MODE: case EVP_CIPH_CCM_MODE: diff --git a/ext/openssl/tests/bug62890.phpt b/ext/openssl/tests/bug62890.phpt index b400b0e5ef741..2d38571b65a06 100644 --- a/ext/openssl/tests/bug62890.phpt +++ b/ext/openssl/tests/bug62890.phpt @@ -9,7 +9,8 @@ if (getenv('SKIP_ONLINE_TESTS')) die('skip online test'); default_socket_timeout=-1 --FILE-- ['verify_peer' => false]]); +var_dump((bool) file_get_contents('https://www.php.net', false, $clientCtx)); ?> --EXPECT-- bool(true) diff --git a/ext/pdo/pdo_dbh.c b/ext/pdo/pdo_dbh.c index 00d20778e98d9..08bb61fc0ff57 100644 --- a/ext/pdo/pdo_dbh.c +++ b/ext/pdo/pdo_dbh.c @@ -155,7 +155,8 @@ PDO_API void pdo_handle_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt) /* {{{ */ if (dbh->methods->fetch_err(dbh, stmt, &info)) { zval *item; - if ((item = zend_hash_index_find(Z_ARRVAL(info), 1)) != NULL) { + if ((item = zend_hash_index_find(Z_ARRVAL(info), 1)) != NULL + && Z_TYPE_P(item) == IS_LONG) { native_code = Z_LVAL_P(item); } @@ -165,8 +166,10 @@ PDO_API void pdo_handle_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt) /* {{{ */ } } - if (supp) { + if (native_code && supp) { message = strpprintf(0, "SQLSTATE[%s]: %s: " ZEND_LONG_FMT " %s", *pdo_err, msg, native_code, supp); + } else if (supp) { + message = strpprintf(0, "SQLSTATE[%s]: %s: %s", *pdo_err, msg, supp); } else { message = strpprintf(0, "SQLSTATE[%s]: %s", *pdo_err, msg); } @@ -449,10 +452,9 @@ static void pdo_stmt_construct(zend_execute_data *execute_data, pdo_stmt_t *stmt zval query_string; zend_string *key; - ZVAL_STRINGL(&query_string, stmt->query_string, stmt->query_stringlen); + ZVAL_STR(&query_string, stmt->query_string); key = zend_string_init("queryString", sizeof("queryString") - 1, 0); zend_std_write_property(Z_OBJ_P(object), key, &query_string, NULL); - zval_ptr_dtor(&query_string); zend_string_release_ex(key, 0); if (dbstmt_ce->constructor) { @@ -487,22 +489,21 @@ static void pdo_stmt_construct(zend_execute_data *execute_data, pdo_stmt_t *stmt PHP_METHOD(PDO, prepare) { pdo_stmt_t *stmt; - char *statement; - size_t statement_len; + zend_string *statement; zval *options = NULL, *value, *item, ctor_args; zend_class_entry *dbstmt_ce, *pce; pdo_dbh_object_t *dbh_obj = Z_PDO_OBJECT_P(ZEND_THIS); pdo_dbh_t *dbh = dbh_obj->inner; ZEND_PARSE_PARAMETERS_START(1, 2) - Z_PARAM_STRING(statement, statement_len) + Z_PARAM_STR(statement) Z_PARAM_OPTIONAL Z_PARAM_ARRAY(options) ZEND_PARSE_PARAMETERS_END(); PDO_CONSTRUCT_CHECK; - if (statement_len == 0) { + if (ZSTR_LEN(statement) == 0) { zend_argument_value_error(1, "cannot be empty"); RETURN_THROWS(); } @@ -554,8 +555,7 @@ PHP_METHOD(PDO, prepare) stmt = Z_PDO_STMT_P(return_value); /* unconditionally keep this for later reference */ - stmt->query_string = estrndup(statement, statement_len); - stmt->query_stringlen = statement_len; + stmt->query_string = zend_string_copy(statement); stmt->default_fetch_type = dbh->default_fetch_type; stmt->dbh = dbh; /* give it a reference to me */ @@ -563,7 +563,7 @@ PHP_METHOD(PDO, prepare) /* we haven't created a lazy object yet */ ZVAL_UNDEF(&stmt->lazy_object_ref); - if (dbh->methods->preparer(dbh, statement, statement_len, stmt, options)) { + if (dbh->methods->preparer(dbh, statement, stmt, options)) { pdo_stmt_construct(execute_data, stmt, return_value, dbstmt_ce, &ctor_args); return; } @@ -1048,8 +1048,7 @@ PHP_METHOD(PDO, errorInfo) PHP_METHOD(PDO, query) { pdo_stmt_t *stmt; - char *statement; - size_t statement_len; + zend_string *statement; zend_long fetch_mode; zend_bool fetch_mode_is_null = 1; zval *args = NULL; @@ -1057,14 +1056,14 @@ PHP_METHOD(PDO, query) pdo_dbh_object_t *dbh_obj = Z_PDO_OBJECT_P(ZEND_THIS); pdo_dbh_t *dbh = dbh_obj->inner; - if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS(), "s|l!*", &statement, &statement_len, + if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS(), "S|l!*", &statement, &fetch_mode, &fetch_mode_is_null, &args, &num_args)) { RETURN_THROWS(); } PDO_CONSTRUCT_CHECK; - if (statement_len == 0) { + if (ZSTR_LEN(statement) == 0) { zend_argument_value_error(1, "cannot be empty"); RETURN_THROWS(); } @@ -1077,19 +1076,16 @@ PHP_METHOD(PDO, query) stmt = Z_PDO_STMT_P(return_value); /* unconditionally keep this for later reference */ - stmt->query_string = estrndup(statement, statement_len); - stmt->query_stringlen = statement_len; - + stmt->query_string = zend_string_copy(statement); + stmt->active_query_string = zend_string_copy(stmt->query_string); stmt->default_fetch_type = dbh->default_fetch_type; - stmt->active_query_string = stmt->query_string; - stmt->active_query_stringlen = statement_len; stmt->dbh = dbh; /* give it a reference to me */ ZVAL_OBJ_COPY(&stmt->database_object_handle, &dbh_obj->std); /* we haven't created a lazy object yet */ ZVAL_UNDEF(&stmt->lazy_object_ref); - if (dbh->methods->preparer(dbh, statement, statement_len, stmt, NULL)) { + if (dbh->methods->preparer(dbh, statement, stmt, NULL)) { PDO_STMT_CLEAR_ERR(); if (fetch_mode_is_null || pdo_stmt_setup_fetch_mode(stmt, fetch_mode, 2, args, num_args)) { /* now execute the statement */ diff --git a/ext/pdo/pdo_sql_parser.re b/ext/pdo/pdo_sql_parser.re index ee0ce7168d384..29e99bfd9bd2f 100644 --- a/ext/pdo/pdo_sql_parser.re +++ b/ext/pdo/pdo_sql_parser.re @@ -81,11 +81,9 @@ static void free_param_name(zval *el) { efree(Z_PTR_P(el)); } -PDO_API int pdo_parse_params(pdo_stmt_t *stmt, const char *inquery, size_t inquery_len, - char **outquery, size_t *outquery_len) +PDO_API int pdo_parse_params(pdo_stmt_t *stmt, zend_string *inquery, zend_string **outquery) { Scanner s; - const char *ptr; char *newbuffer; ptrdiff_t t; uint32_t bindno = 0; @@ -96,9 +94,8 @@ PDO_API int pdo_parse_params(pdo_stmt_t *stmt, const char *inquery, size_t inque int query_type = PDO_PLACEHOLDER_NONE; struct placeholder *placeholders = NULL, *placetail = NULL, *plc = NULL; - ptr = *outquery; - s.cur = inquery; - s.end = inquery + inquery_len + 1; + s.cur = ZSTR_VAL(inquery); + s.end = s.cur + ZSTR_LEN(inquery) + 1; /* phase 1: look for args */ while((t = scan(&s)) != PDO_PARSER_EOI) { @@ -110,7 +107,7 @@ PDO_API int pdo_parse_params(pdo_stmt_t *stmt, const char *inquery, size_t inque if (t == PDO_PARSER_BIND) { ptrdiff_t len = s.cur - s.tok; - if ((inquery < (s.cur - len)) && isalnum(*(s.cur - len - 1))) { + if ((ZSTR_VAL(inquery) < (s.cur - len)) && isalnum(*(s.cur - len - 1))) { continue; } query_type |= PDO_PLACEHOLDER_NAMED; @@ -143,11 +140,6 @@ PDO_API int pdo_parse_params(pdo_stmt_t *stmt, const char *inquery, size_t inque } } - if (!placeholders) { - /* nothing to do; good! */ - return 0; - } - /* did the query make sense to me? */ if (query_type == (PDO_PLACEHOLDER_NAMED|PDO_PLACEHOLDER_POSITIONAL)) { /* they mixed both types; punt */ @@ -156,10 +148,35 @@ PDO_API int pdo_parse_params(pdo_stmt_t *stmt, const char *inquery, size_t inque goto clean_up; } + params = stmt->bound_params; + if (stmt->supports_placeholders == PDO_PLACEHOLDER_NONE && params && bindno != zend_hash_num_elements(params)) { + /* extra bit of validation for instances when same params are bound more than once */ + if (query_type != PDO_PLACEHOLDER_POSITIONAL && bindno > zend_hash_num_elements(params)) { + int ok = 1; + for (plc = placeholders; plc; plc = plc->next) { + if ((param = zend_hash_str_find_ptr(params, plc->pos, plc->len)) == NULL) { + ok = 0; + break; + } + } + if (ok) { + goto safe; + } + } + pdo_raise_impl_error(stmt->dbh, stmt, "HY093", "number of bound variables does not match number of tokens"); + ret = -1; + goto clean_up; + } + + if (!placeholders) { + /* nothing to do; good! */ + return 0; + } + if (stmt->supports_placeholders == query_type && !stmt->named_rewrite_template) { /* query matches native syntax */ if (escapes) { - newbuffer_len = inquery_len; + newbuffer_len = ZSTR_LEN(inquery); goto rewrite; } @@ -176,32 +193,12 @@ PDO_API int pdo_parse_params(pdo_stmt_t *stmt, const char *inquery, size_t inque query_type = PDO_PLACEHOLDER_POSITIONAL; } - params = stmt->bound_params; - - if (bindno && stmt->supports_placeholders == PDO_PLACEHOLDER_NONE && params && bindno != zend_hash_num_elements(params)) { - /* extra bit of validation for instances when same params are bound more than once */ - if (query_type != PDO_PLACEHOLDER_POSITIONAL && bindno > zend_hash_num_elements(params)) { - int ok = 1; - for (plc = placeholders; plc; plc = plc->next) { - if ((param = zend_hash_str_find_ptr(params, plc->pos, plc->len)) == NULL) { - ok = 0; - break; - } - } - if (ok) { - goto safe; - } - } - pdo_raise_impl_error(stmt->dbh, stmt, "HY093", "number of bound variables does not match number of tokens"); - ret = -1; - goto clean_up; - } safe: /* what are we going to do ? */ if (stmt->supports_placeholders == PDO_PLACEHOLDER_NONE) { /* query generation */ - newbuffer_len = inquery_len; + newbuffer_len = ZSTR_LEN(inquery); /* let's quote all the values */ for (plc = placeholders; plc && params; plc = plc->next) { @@ -328,12 +325,12 @@ safe: rewrite: /* allocate output buffer */ - newbuffer = emalloc(newbuffer_len + 1); - *outquery = newbuffer; + *outquery = zend_string_alloc(newbuffer_len, 0); + newbuffer = ZSTR_VAL(*outquery); /* and build the query */ + const char *ptr = ZSTR_VAL(inquery); plc = placeholders; - ptr = inquery; do { t = plc->pos - ptr; @@ -353,13 +350,13 @@ rewrite: plc = plc->next; } while (plc); - t = (inquery + inquery_len) - ptr; + t = ZSTR_VAL(inquery) + ZSTR_LEN(inquery) - ptr; if (t) { memcpy(newbuffer, ptr, t); newbuffer += t; } *newbuffer = '\0'; - *outquery_len = newbuffer - *outquery; + ZSTR_LEN(*outquery) = newbuffer - ZSTR_VAL(*outquery); ret = 1; goto clean_up; @@ -370,7 +367,7 @@ rewrite: const char *tmpl = stmt->named_rewrite_template ? stmt->named_rewrite_template : ":pdo%d"; int bind_no = 1; - newbuffer_len = inquery_len; + newbuffer_len = ZSTR_LEN(inquery); if (stmt->bound_param_map == NULL) { ALLOC_HASHTABLE(stmt->bound_param_map); @@ -416,7 +413,7 @@ rewrite: } else { /* rewrite :name to ? */ - newbuffer_len = inquery_len; + newbuffer_len = ZSTR_LEN(inquery); if (stmt->bound_param_map == NULL) { ALLOC_HASHTABLE(stmt->bound_param_map); diff --git a/ext/pdo/pdo_stmt.c b/ext/pdo/pdo_stmt.c index f8ff90ba9b425..bab869eaf848a 100644 --- a/ext/pdo/pdo_stmt.c +++ b/ext/pdo/pdo_stmt.c @@ -138,23 +138,22 @@ int pdo_stmt_describe_columns(pdo_stmt_t *stmt) /* {{{ */ /* if we are applying case conversions on column names, do so now */ if (stmt->dbh->native_case != stmt->dbh->desired_case && stmt->dbh->desired_case != PDO_CASE_NATURAL) { - char *s = ZSTR_VAL(stmt->columns[col].name); - + zend_string *orig_name = stmt->columns[col].name; switch (stmt->dbh->desired_case) { - case PDO_CASE_UPPER: - while (*s != '\0') { - *s = toupper(*s); - s++; - } - break; case PDO_CASE_LOWER: + stmt->columns[col].name = zend_string_tolower(orig_name); + zend_string_release(orig_name); + break; + case PDO_CASE_UPPER: { + stmt->columns[col].name = zend_string_separate(orig_name, 0); + char *s = ZSTR_VAL(stmt->columns[col].name); while (*s != '\0') { - *s = tolower(*s); + *s = toupper(*s); s++; } break; - default: - ; + } + EMPTY_SWITCH_DEFAULT_CASE() } } @@ -173,6 +172,45 @@ int pdo_stmt_describe_columns(pdo_stmt_t *stmt) /* {{{ */ } /* }}} */ +static void pdo_stmt_reset_columns(pdo_stmt_t *stmt) { + if (stmt->columns) { + int i; + struct pdo_column_data *cols = stmt->columns; + + for (i = 0; i < stmt->column_count; i++) { + if (cols[i].name) { + zend_string_release_ex(cols[i].name, 0); + } + } + efree(stmt->columns); + } + stmt->columns = NULL; + stmt->column_count = 0; +} + +/** + * Change the column count on the statement. If it differs from the previous one, + * discard existing columns information. + */ +PDO_API void php_pdo_stmt_set_column_count(pdo_stmt_t *stmt, int new_count) +{ + /* Columns not yet "described". */ + if (!stmt->columns) { + stmt->column_count = new_count; + return; + } + + /* The column count has not changed: No need to reload columns description. + * Note: Do not handle attribute name change, without column count change. */ + if (new_count == stmt->column_count) { + return; + } + + /* Free previous columns to force reload description. */ + pdo_stmt_reset_columns(stmt); + stmt->column_count = new_count; +} + static void get_lazy_object(pdo_stmt_t *stmt, zval *return_value) /* {{{ */ { if (Z_ISUNDEF(stmt->lazy_object_ref)) { @@ -302,8 +340,8 @@ static bool really_register_bound_param(struct pdo_bound_param_data *param, pdo_ * a reference to param, as it resides in transient storage only * at this time. */ if (stmt->methods->param_hook) { - if (!stmt->methods->param_hook(stmt, param, PDO_PARAM_EVT_NORMALIZE - )) { + if (!stmt->methods->param_hook(stmt, param, PDO_PARAM_EVT_NORMALIZE)) { + PDO_HANDLE_STMT_ERR(); if (param->name) { zend_string_release_ex(param->name, 0); param->name = NULL; @@ -328,8 +366,8 @@ static bool really_register_bound_param(struct pdo_bound_param_data *param, pdo_ /* tell the driver we just created a parameter */ if (stmt->methods->param_hook) { - if (!stmt->methods->param_hook(stmt, pparam, PDO_PARAM_EVT_ALLOC - )) { + if (!stmt->methods->param_hook(stmt, pparam, PDO_PARAM_EVT_ALLOC)) { + PDO_HANDLE_STMT_ERR(); /* undo storage allocation; the hash will free the parameter * name if required */ if (pparam->name) { @@ -404,22 +442,19 @@ PHP_METHOD(PDOStatement, execute) */ /* string is leftover from previous calls so PDOStatement::debugDumpParams() can access */ - if (stmt->active_query_string && stmt->active_query_string != stmt->query_string) { - efree(stmt->active_query_string); + if (stmt->active_query_string) { + zend_string_release(stmt->active_query_string); + stmt->active_query_string = NULL; } - stmt->active_query_string = NULL; - ret = pdo_parse_params(stmt, stmt->query_string, stmt->query_stringlen, - &stmt->active_query_string, &stmt->active_query_stringlen); + ret = pdo_parse_params(stmt, stmt->query_string, &stmt->active_query_string); if (ret == 0) { /* no changes were made */ - stmt->active_query_string = stmt->query_string; - stmt->active_query_stringlen = stmt->query_stringlen; + stmt->active_query_string = zend_string_copy(stmt->query_string); ret = 1; } else if (ret == -1) { /* something broke */ - PDO_HANDLE_STMT_ERR(); RETURN_FALSE; } } else if (!dispatch_param_event(stmt, PDO_PARAM_EVT_EXEC_PRE)) { @@ -440,6 +475,7 @@ PHP_METHOD(PDOStatement, execute) } if (ret && !dispatch_param_event(stmt, PDO_PARAM_EVT_EXEC_POST)) { + PDO_HANDLE_STMT_ERR(); RETURN_FALSE; } @@ -483,6 +519,12 @@ static inline void fetch_value(pdo_stmt_t *stmt, zval *dest, int colno, int *typ case PDO_PARAM_ZVAL: if (value && value_len == sizeof(zval)) { ZVAL_COPY_VALUE(dest, (zval *)value); + + if (Z_TYPE_P(dest) == IS_STRING && Z_STRLEN_P(dest) == 0 + && stmt->dbh->oracle_nulls == PDO_NULL_EMPTY_STRING) { + zval_ptr_dtor_str(dest); + ZVAL_NULL(dest); + } } else { ZVAL_NULL(dest); } @@ -1910,20 +1952,7 @@ PHP_METHOD(PDOStatement, setFetchMode) static bool pdo_stmt_do_next_rowset(pdo_stmt_t *stmt) { - /* un-describe */ - if (stmt->columns) { - int i; - struct pdo_column_data *cols = stmt->columns; - - for (i = 0; i < stmt->column_count; i++) { - if (cols[i].name) { - zend_string_release_ex(cols[i].name, 0); - } - } - efree(stmt->columns); - stmt->columns = NULL; - stmt->column_count = 0; - } + pdo_stmt_reset_columns(stmt); if (!stmt->methods->next_rowset(stmt)) { /* Set the executed flag to 0 to reallocate columns on next execute */ @@ -2009,16 +2038,16 @@ PHP_METHOD(PDOStatement, debugDumpParams) } /* break into multiple operations so query string won't be truncated at FORMAT_CONV_MAX_PRECISION */ - php_stream_printf(out, "SQL: [%zd] ", stmt->query_stringlen); - php_stream_write(out, stmt->query_string, stmt->query_stringlen); + php_stream_printf(out, "SQL: [%zd] ", ZSTR_LEN(stmt->query_string)); + php_stream_write(out, ZSTR_VAL(stmt->query_string), ZSTR_LEN(stmt->query_string)); php_stream_write(out, "\n", 1); /* show parsed SQL if emulated prepares enabled */ /* pointers will be equal if PDO::query() was invoked */ if (stmt->active_query_string != NULL && stmt->active_query_string != stmt->query_string) { /* break into multiple operations so query string won't be truncated at FORMAT_CONV_MAX_PRECISION */ - php_stream_printf(out, "Sent SQL: [%zd] ", stmt->active_query_stringlen); - php_stream_write(out, stmt->active_query_string, stmt->active_query_stringlen); + php_stream_printf(out, "Sent SQL: [%zd] ", ZSTR_LEN(stmt->active_query_string)); + php_stream_write(out, ZSTR_VAL(stmt->active_query_string), ZSTR_LEN(stmt->active_query_string)); php_stream_write(out, "\n", 1); } @@ -2149,26 +2178,14 @@ PDO_API void php_pdo_free_statement(pdo_stmt_t *stmt) if (stmt->methods && stmt->methods->dtor) { stmt->methods->dtor(stmt); } - if (stmt->active_query_string && stmt->active_query_string != stmt->query_string) { - efree(stmt->active_query_string); + if (stmt->active_query_string) { + zend_string_release(stmt->active_query_string); } if (stmt->query_string) { - efree(stmt->query_string); + zend_string_release(stmt->query_string); } - if (stmt->columns) { - int i; - struct pdo_column_data *cols = stmt->columns; - - for (i = 0; i < stmt->column_count; i++) { - if (cols[i].name) { - zend_string_release_ex(cols[i].name, 0); - cols[i].name = NULL; - } - } - efree(stmt->columns); - stmt->columns = NULL; - } + pdo_stmt_reset_columns(stmt); if (!Z_ISUNDEF(stmt->fetch.into) && stmt->default_fetch_type == PDO_FETCH_INTO) { zval_ptr_dtor(&stmt->fetch.into); diff --git a/ext/pdo/pdo_stmt.stub.php b/ext/pdo/pdo_stmt.stub.php index 06d6a557e73ff..ab3ab6a42fe95 100644 --- a/ext/pdo/pdo_stmt.stub.php +++ b/ext/pdo/pdo_stmt.stub.php @@ -40,7 +40,7 @@ public function fetchAll(int $mode = PDO::FETCH_BOTH, mixed ...$args) {} /** @return mixed */ public function fetchColumn(int $column = 0) {} - /** @return mixed */ + /** @return object|false */ public function fetchObject(?string $class = "stdClass", ?array $ctorArgs = null) {} /** @return mixed */ diff --git a/ext/pdo/pdo_stmt_arginfo.h b/ext/pdo/pdo_stmt_arginfo.h index 9e7eea4c3b02a..25858477ebe9d 100644 --- a/ext/pdo/pdo_stmt_arginfo.h +++ b/ext/pdo/pdo_stmt_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 574055f1dbb6a1bee10e4476642a759e53ca2802 */ + * Stub hash: 9d890849a08b43cb35e2cd8468aeaabfc0a7f218 */ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_PDOStatement_bindColumn, 0, 0, 2) ZEND_ARG_TYPE_MASK(0, column, MAY_BE_STRING|MAY_BE_LONG, NULL) diff --git a/ext/pdo/php_pdo_driver.h b/ext/pdo/php_pdo_driver.h index 974eb0bad0209..da53c1a3b90f3 100644 --- a/ext/pdo/php_pdo_driver.h +++ b/ext/pdo/php_pdo_driver.h @@ -247,7 +247,7 @@ typedef struct { typedef int (*pdo_dbh_close_func)(pdo_dbh_t *dbh); /* prepare a statement and stash driver specific portion into stmt */ -typedef int (*pdo_dbh_prepare_func)(pdo_dbh_t *dbh, const char *sql, size_t sql_len, pdo_stmt_t *stmt, zval *driver_options); +typedef int (*pdo_dbh_prepare_func)(pdo_dbh_t *dbh, zend_string *sql, pdo_stmt_t *stmt, zval *driver_options); /* execute a statement (that does not return a result set) */ typedef zend_long (*pdo_dbh_do_func)(pdo_dbh_t *dbh, const char *sql, size_t sql_len); @@ -604,12 +604,10 @@ struct _pdo_stmt_t { zend_long row_count; /* used to hold the statement's current query */ - char *query_string; - size_t query_stringlen; + zend_string *query_string; /* the copy of the query with expanded binds ONLY for emulated-prepare drivers */ - char *active_query_string; - size_t active_query_stringlen; + zend_string *active_query_string; /* the cursor specific error code. */ pdo_error_type error_code; @@ -685,8 +683,7 @@ PDO_API int php_pdo_parse_data_source(const char *data_source, PDO_API zend_class_entry *php_pdo_get_dbh_ce(void); PDO_API zend_class_entry *php_pdo_get_exception(void); -PDO_API int pdo_parse_params(pdo_stmt_t *stmt, const char *inquery, size_t inquery_len, - char **outquery, size_t *outquery_len); +PDO_API int pdo_parse_params(pdo_stmt_t *stmt, zend_string *inquery, zend_string **outquery); PDO_API void pdo_raise_impl_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt, const char *sqlstate, const char *supp); @@ -695,7 +692,7 @@ PDO_API void php_pdo_dbh_addref(pdo_dbh_t *dbh); PDO_API void php_pdo_dbh_delref(pdo_dbh_t *dbh); PDO_API void php_pdo_free_statement(pdo_stmt_t *stmt); - +PDO_API void php_pdo_stmt_set_column_count(pdo_stmt_t *stmt, int new_count); PDO_API void pdo_throw_exception(unsigned int driver_errcode, char *driver_errmsg, pdo_error_type *pdo_error); #endif /* PHP_PDO_DRIVER_H */ diff --git a/ext/pdo/tests/bug_43130.phpt b/ext/pdo/tests/bug_43130.phpt index bf65bf0513f81..4615038e3f73d 100644 --- a/ext/pdo/tests/bug_43130.phpt +++ b/ext/pdo/tests/bug_43130.phpt @@ -36,6 +36,4 @@ var_dump($stmt->fetch(PDO::FETCH_COLUMN)); ?> --EXPECTF-- Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: parameter was not defined in %s on line %d - -Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number in %s on line %d bool(false) diff --git a/ext/pdo/tests/bug_69356.phpt b/ext/pdo/tests/bug_69356.phpt index 2bd3b309731f2..44a3440670f78 100644 --- a/ext/pdo/tests/bug_69356.phpt +++ b/ext/pdo/tests/bug_69356.phpt @@ -27,8 +27,8 @@ $stmt = $db->query(" "); var_dump($stmt->debugDumpParams()); ?> ---EXPECT-- -SQL: [834] +--EXPECTF-- +SQL: [%d] SELECT ' Dumps the information contained by a prepared statement directly on the output. It will provide the SQL query in use, the number of parameters used (Params), the list of parameters, with their name, type (paramtype) as an integer, their key name or position, and the position in the query (if this is supported by the PDO driver, otherwise, it will be -1). This is a debug function, which dump directly the data on the normal output. diff --git a/ext/pdo/tests/bug_72368.phpt b/ext/pdo/tests/bug_72368.phpt new file mode 100644 index 0000000000000..db8d4993a8229 --- /dev/null +++ b/ext/pdo/tests/bug_72368.phpt @@ -0,0 +1,43 @@ +--TEST-- +PDO Common: Bug #72368 (PdoStatement->execute() fails but does not throw an exception) +--SKIPIF-- + +--FILE-- +setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + +$params = [":bar" => 1]; +$sql = "SELECT 1"; + +$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); +try { + $stmt = $db->prepare($sql); + var_dump($stmt->execute($params)); +} catch (PDOException $e) { + var_dump('ERR'); +} + + +$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, true); +try { + $stmt = $db->prepare($sql); + var_dump($stmt->execute($params)); +} catch (PDOException $e) { + var_dump('ERR'); +} + +?> +===DONE=== +--EXPECT-- +string(3) "ERR" +string(3) "ERR" +===DONE=== diff --git a/ext/pdo/tests/pdo_022.phpt b/ext/pdo/tests/pdo_022.phpt index bf3b40b4a8eb4..4b64d5c92ef27 100644 --- a/ext/pdo/tests/pdo_022.phpt +++ b/ext/pdo/tests/pdo_022.phpt @@ -26,7 +26,6 @@ require_once getenv('REDIR_TEST_DIR') . 'pdo_test.inc'; $db = PDOTest::factory(); $db->exec('CREATE TABLE test(id INT NOT NULL PRIMARY KEY, val VARCHAR(10), val2 VARCHAR(16))'); -$db->exec('insert2', "INSERT INTO test VALUES(:first, :second, :third)"); $data = array( array('10', 'Abc', 'zxy'), @@ -37,7 +36,6 @@ $data = array( array('60', 'Pqr', 'kji'), ); - // Insert using question mark placeholders $stmt = $db->prepare("INSERT INTO test VALUES(?, ?, ?)"); foreach ($data as $row) { diff --git a/ext/pdo_dblib/config.m4 b/ext/pdo_dblib/config.m4 index b6cbc01a5a34a..4160cd9596f9b 100644 --- a/ext/pdo_dblib/config.m4 +++ b/ext/pdo_dblib/config.m4 @@ -10,23 +10,13 @@ if test "$PHP_PDO_DBLIB" != "no"; then fi if test "$PHP_PDO_DBLIB" = "yes"; then - - for i in /usr/local /usr; do - if test -f $i/include/sybdb.h; then - PDO_FREETDS_INSTALLATION_DIR=$i - PDO_FREETDS_INCLUDE_DIR=$i/include - break - elif test -f $i/include/freetds/sybdb.h; then - PDO_FREETDS_INSTALLATION_DIR=$i - PDO_FREETDS_INCLUDE_DIR=$i/include/freetds - break; - fi - done - - if test -z "$PDO_FREETDS_INSTALLATION_DIR"; then - AC_MSG_ERROR(Cannot find FreeTDS in known installation directories) - fi - + dnl FreeTDS must be on the default system include/library path. + dnl Only perform a sanity check that this is really the case. + PHP_CHECK_LIBRARY(sybdb, dbsqlexec, + [],[ + AC_MSG_ERROR([Cannot find FreeTDS in known installation directories]) + ]) + PHP_ADD_LIBRARY(sybdb,,GMP_SHARED_LIBADD) elif test "$PHP_PDO_DBLIB" != "no"; then if test -f $PHP_PDO_DBLIB/include/sybdb.h; then @@ -38,18 +28,18 @@ if test "$PHP_PDO_DBLIB" != "no"; then else AC_MSG_ERROR(Directory $PHP_PDO_DBLIB is not a FreeTDS installation directory) fi - fi - if test "x$PHP_LIBDIR" = "x" ; then - PHP_LIBDIR=lib - fi + if test "x$PHP_LIBDIR" = "x" ; then + PHP_LIBDIR=lib + fi - if test ! -r "$PDO_FREETDS_INSTALLATION_DIR/$PHP_LIBDIR/libsybdb.a" && test ! -r "$PDO_FREETDS_INSTALLATION_DIR/$PHP_LIBDIR/libsybdb.so"; then - AC_MSG_ERROR(Could not find $PDO_FREETDS_INSTALLATION_DIR/$PHP_LIBDIR/libsybdb.[a|so]) - fi + if test ! -r "$PDO_FREETDS_INSTALLATION_DIR/$PHP_LIBDIR/libsybdb.a" && test ! -r "$PDO_FREETDS_INSTALLATION_DIR/$PHP_LIBDIR/libsybdb.so"; then + AC_MSG_ERROR(Could not find $PDO_FREETDS_INSTALLATION_DIR/$PHP_LIBDIR/libsybdb.[a|so]) + fi - PHP_ADD_INCLUDE($PDO_FREETDS_INCLUDE_DIR) - PHP_ADD_LIBRARY_WITH_PATH(sybdb, $PDO_FREETDS_INSTALLATION_DIR/$PHP_LIBDIR, PDO_DBLIB_SHARED_LIBADD) + PHP_ADD_INCLUDE($PDO_FREETDS_INCLUDE_DIR) + PHP_ADD_LIBRARY_WITH_PATH(sybdb, $PDO_FREETDS_INSTALLATION_DIR/$PHP_LIBDIR, PDO_DBLIB_SHARED_LIBADD) + fi PHP_CHECK_PDO_INCLUDES diff --git a/ext/pdo_dblib/dblib_driver.c b/ext/pdo_dblib/dblib_driver.c index e581642037d3e..085b6990d25f1 100644 --- a/ext/pdo_dblib/dblib_driver.c +++ b/ext/pdo_dblib/dblib_driver.c @@ -59,7 +59,7 @@ static int dblib_fetch_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt, zval *info) } spprintf(&message, 0, "%s [%d] (severity %d) [%s]", - msg, einfo->dberr, einfo->severity, stmt ? stmt->active_query_string : ""); + msg, einfo->dberr, einfo->severity, stmt ? ZSTR_VAL(stmt->active_query_string) : ""); add_next_index_long(info, einfo->dberr); add_next_index_string(info, message); @@ -94,7 +94,7 @@ static int dblib_handle_closer(pdo_dbh_t *dbh) return 0; } -static int dblib_handle_preparer(pdo_dbh_t *dbh, const char *sql, size_t sql_len, pdo_stmt_t *stmt, zval *driver_options) +static int dblib_handle_preparer(pdo_dbh_t *dbh, zend_string *sql, pdo_stmt_t *stmt, zval *driver_options) { pdo_dblib_db_handle *H = (pdo_dblib_db_handle *)dbh->driver_data; pdo_dblib_stmt *S = ecalloc(1, sizeof(*S)); diff --git a/ext/pdo_dblib/dblib_stmt.c b/ext/pdo_dblib/dblib_stmt.c index 94526a4c6ea6c..0dca4c79cf7bd 100644 --- a/ext/pdo_dblib/dblib_stmt.c +++ b/ext/pdo_dblib/dblib_stmt.c @@ -177,7 +177,7 @@ static int pdo_dblib_stmt_execute(pdo_stmt_t *stmt) pdo_dblib_stmt_cursor_closer(stmt); - if (FAIL == dbcmd(H->link, stmt->active_query_string)) { + if (FAIL == dbcmd(H->link, ZSTR_VAL(stmt->active_query_string))) { return 0; } diff --git a/ext/pdo_dblib/pdo_dblib.c b/ext/pdo_dblib/pdo_dblib.c index ddce55dc361a6..12378fb0db248 100644 --- a/ext/pdo_dblib/pdo_dblib.c +++ b/ext/pdo_dblib/pdo_dblib.c @@ -121,7 +121,7 @@ int pdo_dblib_error_handler(DBPROCESS *dbproc, int severity, int dberr, } int pdo_dblib_msg_handler(DBPROCESS *dbproc, DBINT msgno, int msgstate, - int severity, char *msgtext, char *srvname, char *procname, DBUSMALLINT line) + int severity, char *msgtext, char *srvname, char *procname, int line) { pdo_dblib_err *einfo; diff --git a/ext/pdo_dblib/php_pdo_dblib_int.h b/ext/pdo_dblib/php_pdo_dblib_int.h index ecd65f577c66a..0a5c7898fcf32 100644 --- a/ext/pdo_dblib/php_pdo_dblib_int.h +++ b/ext/pdo_dblib/php_pdo_dblib_int.h @@ -98,7 +98,7 @@ int pdo_dblib_error_handler(DBPROCESS *dbproc, int severity, int dberr, int oserr, char *dberrstr, char *oserrstr); int pdo_dblib_msg_handler(DBPROCESS *dbproc, DBINT msgno, int msgstate, - int severity, char *msgtext, char *srvname, char *procname, DBUSMALLINT line); + int severity, char *msgtext, char *srvname, char *procname, int line); extern const pdo_driver_t pdo_dblib_driver; extern const struct pdo_stmt_methods dblib_stmt_methods; diff --git a/ext/pdo_firebird/firebird_driver.c b/ext/pdo_firebird/firebird_driver.c index c299907f0fea1..171dbef6e0a92 100644 --- a/ext/pdo_firebird/firebird_driver.c +++ b/ext/pdo_firebird/firebird_driver.c @@ -136,7 +136,7 @@ static const char classes_array[] = { /* 092 \ */ 0, /* 093 ] */ 0, /* 094 ^ */ 0, - /* 095 _ */ 65, /* CHR_IDENT | CHR_INTRODUCER */ + /* 095 _ */ 68, /* CHR_IDENT | CHR_INTRODUCER */ /* 096 ` */ 0, /* 097 a */ 37, /* CHR_LETTER | CHR_IDENT | CHR_HEX */ /* 098 b */ 37, /* CHR_LETTER | CHR_IDENT | CHR_HEX */ @@ -171,10 +171,11 @@ static const char classes_array[] = { /* 127 */ 0 }; -inline char classes(char idx) +static inline char classes(char idx) { - if (idx > 127) return 0; - return classes_array[idx]; + unsigned char uidx = (unsigned char) idx; + if (uidx > 127) return 0; + return classes_array[uidx]; } typedef enum { @@ -503,7 +504,7 @@ static int firebird_handle_closer(pdo_dbh_t *dbh) /* {{{ */ /* }}} */ /* called by PDO to prepare an SQL query */ -static int firebird_handle_preparer(pdo_dbh_t *dbh, const char *sql, size_t sql_len, /* {{{ */ +static int firebird_handle_preparer(pdo_dbh_t *dbh, zend_string *sql, /* {{{ */ pdo_stmt_t *stmt, zval *driver_options) { pdo_firebird_db_handle *H = (pdo_firebird_db_handle *)dbh->driver_data; @@ -523,7 +524,7 @@ static int firebird_handle_preparer(pdo_dbh_t *dbh, const char *sql, size_t sql_ zend_hash_init(np, 8, NULL, NULL, 0); /* allocate and prepare statement */ - if (!firebird_alloc_prepare_stmt(dbh, sql, sql_len, &num_sqlda, &s, np)) { + if (!firebird_alloc_prepare_stmt(dbh, ZSTR_VAL(sql), ZSTR_LEN(sql), &num_sqlda, &s, np)) { break; } @@ -1085,7 +1086,7 @@ static int pdo_firebird_handle_factory(pdo_dbh_t *dbh, zval *driver_options) /* char errmsg[512]; const ISC_STATUS *s = H->isc_status; fb_interpret(errmsg, sizeof(errmsg),&s); - zend_throw_exception_ex(php_pdo_get_exception(), H->isc_status[1], "SQLSTATE[%s] [%d] %s", + zend_throw_exception_ex(php_pdo_get_exception(), H->isc_status[1], "SQLSTATE[%s] [%ld] %s", "HY000", H->isc_status[1], errmsg); } diff --git a/ext/pdo_firebird/php_pdo_firebird_int.h b/ext/pdo_firebird/php_pdo_firebird_int.h index 094767fa355d3..70a895b4b9f83 100644 --- a/ext/pdo_firebird/php_pdo_firebird_int.h +++ b/ext/pdo_firebird/php_pdo_firebird_int.h @@ -34,12 +34,11 @@ #define SHORT_MAX (1 << (8*sizeof(short)-1)) #if SIZEOF_ZEND_LONG == 8 && !defined(PHP_WIN32) -# define LL_MASK "l" # define LL_LIT(lit) lit ## L #else -# define LL_MASK "ll" # define LL_LIT(lit) lit ## LL #endif +#define LL_MASK "ll" /* Firebird API has a couple of missing const decls in its API */ #define const_cast(s) ((char*)(s)) diff --git a/ext/pdo_firebird/tests/bug_80521.phpt b/ext/pdo_firebird/tests/bug_80521.phpt new file mode 100644 index 0000000000000..dc5916d546919 --- /dev/null +++ b/ext/pdo_firebird/tests/bug_80521.phpt @@ -0,0 +1,21 @@ +--TEST-- +Bug #80521 (Parameters with underscores no longer recognized) +--SKIPIF-- + +--FILE-- +exec("CREATE TABLE bug80521 (foo INTEGER)"); +var_dump($dbh->prepare("SELECT foo FROM bug80521 WHERE foo = :foo_bar")); +?> +--EXPECTF-- +object(PDOStatement)#%d (1) { + ["queryString"]=> + string(45) "SELECT foo FROM bug80521 WHERE foo = :foo_bar" +} +--CLEAN-- +exec("DROP TABLE bug80521"); +?> diff --git a/ext/pdo_mysql/config.m4 b/ext/pdo_mysql/config.m4 index d8b94877235f4..7f09aabefa73a 100644 --- a/ext/pdo_mysql/config.m4 +++ b/ext/pdo_mysql/config.m4 @@ -58,7 +58,6 @@ if test "$PHP_PDO_MYSQL" != "no"; then if test "x$SED" = "x"; then AC_PATH_PROG(SED, sed) fi - PDO_MYSQL_LIBNAME=mysqlclient PDO_MYSQL_LIBS=`$PDO_MYSQL_CONFIG --libs | $SED -e "s/'//g"` PDO_MYSQL_INCLUDE=`$PDO_MYSQL_CONFIG --cflags | $SED -e "s/'//g"` elif test -n "$PDO_MYSQL_DIR"; then @@ -89,34 +88,8 @@ if test "$PHP_PDO_MYSQL" != "no"; then AC_MSG_ERROR([Unable to find your mysql installation]) fi - PHP_CHECK_LIBRARY($PDO_MYSQL_LIBNAME, mysql_commit, - [ - PHP_EVAL_INCLINE($PDO_MYSQL_INCLUDE) - PHP_EVAL_LIBLINE($PDO_MYSQL_LIBS, PDO_MYSQL_SHARED_LIBADD) - ],[ - if test "$PHP_ZLIB_DIR" != "no"; then - PHP_ADD_LIBRARY_WITH_PATH(z, $PHP_ZLIB_DIR, PDO_MYSQL_SHARED_LIBADD) - PHP_CHECK_LIBRARY($PDO_MYSQL_LIBNAME, mysql_commit, [], [ - AC_MSG_ERROR([PDO_MYSQL configure failed, MySQL 4.1 needed. Please check config.log for more information.]) - ], [ - -L$PHP_ZLIB_DIR/$PHP_LIBDIR -L$PDO_MYSQL_LIB_DIR - ]) - PDO_MYSQL_LIBS="$PDO_MYSQL_LIBS -L$PHP_ZLIB_DIR/$PHP_LIBDIR -lz" - else - PHP_ADD_LIBRARY(z,, PDO_MYSQL_SHARED_LIBADD) - PHP_CHECK_LIBRARY($PDO_MYSQL_LIBNAME, mysql_query, [], [ - AC_MSG_ERROR([Try adding --with-zlib-dir=. Please check config.log for more information.]) - ], [ - -L$PDO_MYSQL_LIB_DIR - ]) - PDO_MYSQL_LIBS="$PDO_MYSQL_LIBS -lz" - fi - - PHP_EVAL_INCLINE($PDO_MYSQL_INCLUDE) - PHP_EVAL_LIBLINE($PDO_MYSQL_LIBS, PDO_MYSQL_SHARED_LIBADD) - ],[ - $PDO_MYSQL_LIBS - ]) + PHP_EVAL_INCLINE($PDO_MYSQL_INCLUDE) + PHP_EVAL_LIBLINE($PDO_MYSQL_LIBS, PDO_MYSQL_SHARED_LIBADD) fi PHP_CHECK_PDO_INCLUDES diff --git a/ext/pdo_mysql/mysql_driver.c b/ext/pdo_mysql/mysql_driver.c index a83b12b8725a0..04d0f52cbb786 100644 --- a/ext/pdo_mysql/mysql_driver.c +++ b/ext/pdo_mysql/mysql_driver.c @@ -73,12 +73,20 @@ int _pdo_mysql_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt, const char *file, int lin if (einfo->errcode) { if (einfo->errcode == 2014) { - einfo->errmsg = pestrdup( - "Cannot execute queries while other unbuffered queries are active. " - "Consider using PDOStatement::fetchAll(). Alternatively, if your code " - "is only ever going to run against mysql, you may enable query " - "buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute.", - dbh->is_persistent); + if (mysql_more_results(H->server)) { + einfo->errmsg = pestrdup( + "Cannot execute queries while there are pending result sets. " + "Consider unsetting the previous PDOStatement or calling " + "PDOStatement::closeCursor()", + dbh->is_persistent); + } else { + einfo->errmsg = pestrdup( + "Cannot execute queries while other unbuffered queries are active. " + "Consider using PDOStatement::fetchAll(). Alternatively, if your code " + "is only ever going to run against mysql, you may enable query " + "buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute.", + dbh->is_persistent); + } } else if (einfo->errcode == 2057) { einfo->errmsg = pestrdup( "A stored procedure returning result sets of different size was called. " @@ -154,18 +162,17 @@ static int mysql_handle_closer(pdo_dbh_t *dbh) /* }}} */ /* {{{ mysql_handle_preparer */ -static int mysql_handle_preparer(pdo_dbh_t *dbh, const char *sql, size_t sql_len, pdo_stmt_t *stmt, zval *driver_options) +static int mysql_handle_preparer(pdo_dbh_t *dbh, zend_string *sql, pdo_stmt_t *stmt, zval *driver_options) { pdo_mysql_db_handle *H = (pdo_mysql_db_handle *)dbh->driver_data; pdo_mysql_stmt *S = ecalloc(1, sizeof(pdo_mysql_stmt)); - char *nsql = NULL; - size_t nsql_len = 0; + zend_string *nsql = NULL; int ret; int server_version; PDO_DBG_ENTER("mysql_handle_preparer"); PDO_DBG_INF_FMT("dbh=%p", dbh); - PDO_DBG_INF_FMT("sql=%.*s", (int)sql_len, sql); + PDO_DBG_INF_FMT("sql=%.*s", ZSTR_LEN(sql), ZSTR_VAL(sql)); S->H = H; stmt->driver_data = S; @@ -180,12 +187,11 @@ static int mysql_handle_preparer(pdo_dbh_t *dbh, const char *sql, size_t sql_len goto fallback; } stmt->supports_placeholders = PDO_PLACEHOLDER_POSITIONAL; - ret = pdo_parse_params(stmt, (char*)sql, sql_len, &nsql, &nsql_len); + ret = pdo_parse_params(stmt, sql, &nsql); if (ret == 1) { /* query was rewritten */ sql = nsql; - sql_len = nsql_len; } else if (ret == -1) { /* failed to parse */ strcpy(dbh->error_code, stmt->error_code); @@ -195,34 +201,32 @@ static int mysql_handle_preparer(pdo_dbh_t *dbh, const char *sql, size_t sql_len if (!(S->stmt = mysql_stmt_init(H->server))) { pdo_mysql_error(dbh); if (nsql) { - efree(nsql); + zend_string_release(nsql); } PDO_DBG_RETURN(0); } - if (mysql_stmt_prepare(S->stmt, sql, sql_len)) { + if (mysql_stmt_prepare(S->stmt, ZSTR_VAL(sql), ZSTR_LEN(sql))) { + if (nsql) { + zend_string_release(nsql); + } /* TODO: might need to pull statement specific info here? */ /* if the query isn't supported by the protocol, fallback to emulation */ if (mysql_errno(H->server) == 1295) { - if (nsql) { - efree(nsql); - } + mysql_stmt_close(S->stmt); + S->stmt = NULL; goto fallback; } pdo_mysql_error(dbh); - if (nsql) { - efree(nsql); - } PDO_DBG_RETURN(0); } if (nsql) { - efree(nsql); + zend_string_release(nsql); } S->num_params = mysql_stmt_param_count(S->stmt); if (S->num_params) { - S->params_given = 0; #ifdef PDO_USE_MYSQLND S->params = NULL; #else @@ -267,7 +271,8 @@ static zend_long mysql_handle_doer(pdo_dbh_t *dbh, const char *sql, size_t sql_l MYSQL_RES* result; while (mysql_more_results(H->server)) { if (mysql_next_result(H->server)) { - PDO_DBG_RETURN(1); + pdo_mysql_error(dbh); + PDO_DBG_RETURN(-1); } result = mysql_store_result(H->server); if (result) { @@ -500,13 +505,11 @@ static int pdo_mysql_get_attribute(pdo_dbh_t *dbh, zend_long attr, zval *return_ case PDO_MYSQL_ATTR_MAX_BUFFER_SIZE: ZVAL_LONG(return_value, H->max_buffer_size); break; -#else +#endif + case PDO_MYSQL_ATTR_LOCAL_INFILE: - ZVAL_BOOL( - return_value, - (H->server->data->options->flags & CLIENT_LOCAL_FILES) == CLIENT_LOCAL_FILES); + ZVAL_BOOL(return_value, H->local_infile); break; -#endif default: PDO_DBG_RETURN(0); @@ -702,18 +705,15 @@ static int pdo_mysql_handle_factory(pdo_dbh_t *dbh, zval *driver_options) goto cleanup; } -#if defined(MYSQL_OPT_LOCAL_INFILE) || defined(PDO_USE_MYSQLND) - unsigned int local_infile = (unsigned int) pdo_attr_lval(driver_options, PDO_MYSQL_ATTR_LOCAL_INFILE, 0); -# ifndef PDO_USE_MYSQLND - if (PG(open_basedir) && PG(open_basedir)[0] != '\0') { - local_infile = 0; - } -# endif - if (mysql_options(H->server, MYSQL_OPT_LOCAL_INFILE, (const char *)&local_infile)) { - pdo_mysql_error(dbh); - goto cleanup; - } + if (pdo_attr_lval(driver_options, PDO_MYSQL_ATTR_LOCAL_INFILE, 0)) { + H->local_infile = 1; +#ifndef PDO_USE_MYSQLND + if (PG(open_basedir) && PG(open_basedir)[0] != '\0') { + H->local_infile = 0; + } #endif + } + #ifdef MYSQL_OPT_RECONNECT /* since 5.0.3, the default for this option is 0 if not specified. * we want the old behaviour @@ -817,15 +817,13 @@ static int pdo_mysql_handle_factory(pdo_dbh_t *dbh, zval *driver_options) } } #endif - } else { -#if defined(MYSQL_OPT_LOCAL_INFILE) || defined(PDO_USE_MYSQLND) - // in case there are no driver options disable 'local infile' explicitly - unsigned int local_infile = 0; - if (mysql_options(H->server, MYSQL_OPT_LOCAL_INFILE, (const char *)&local_infile)) { - pdo_mysql_error(dbh); - goto cleanup; - } -#endif + } + + /* Always explicitly set the LOCAL_INFILE option. */ + unsigned int local_infile = H->local_infile; + if (mysql_options(H->server, MYSQL_OPT_LOCAL_INFILE, (const char *)&local_infile)) { + pdo_mysql_error(dbh); + goto cleanup; } if (vars[0].optval && mysql_options(H->server, MYSQL_SET_CHARSET_NAME, vars[0].optval)) { diff --git a/ext/pdo_mysql/mysql_statement.c b/ext/pdo_mysql/mysql_statement.c index 00a2583cdf7e6..5e0f03fbbac40 100644 --- a/ext/pdo_mysql/mysql_statement.c +++ b/ext/pdo_mysql/mysql_statement.c @@ -30,15 +30,34 @@ #ifdef PDO_USE_MYSQLND # define pdo_mysql_stmt_execute_prepared(stmt) pdo_mysql_stmt_execute_prepared_mysqlnd(stmt) -# define pdo_free_bound_result(res) zval_ptr_dtor(res.zv) -# define pdo_mysql_stmt_close(stmt) mysqlnd_stmt_close(stmt, 0) #else # define pdo_mysql_stmt_execute_prepared(stmt) pdo_mysql_stmt_execute_prepared_libmysql(stmt) -# define pdo_free_bound_result(res) efree(res.buffer) -# define pdo_mysql_stmt_close(stmt) mysql_stmt_close(stmt) #endif +static void pdo_mysql_free_result(pdo_mysql_stmt *S) +{ + if (S->result) { +#ifndef PDO_USE_MYSQLND + if (S->bound_result) { + /* We can't use stmt->column_count here, because it gets reset before the + * next_rowset handler is called. */ + unsigned column_count = mysql_num_fields(S->result); + for (unsigned i = 0; i < column_count; i++) { + efree(S->bound_result[i].buffer); + } + + efree(S->bound_result); + efree(S->out_null); + efree(S->out_length); + S->bound_result = NULL; + } +#endif + + mysql_free_result(S->result); + S->result = NULL; + } +} static int pdo_mysql_stmt_dtor(pdo_stmt_t *stmt) /* {{{ */ { @@ -46,17 +65,14 @@ static int pdo_mysql_stmt_dtor(pdo_stmt_t *stmt) /* {{{ */ PDO_DBG_ENTER("pdo_mysql_stmt_dtor"); PDO_DBG_INF_FMT("stmt=%p", S->stmt); - if (S->result) { - /* free the resource */ - mysql_free_result(S->result); - S->result = NULL; - } + + pdo_mysql_free_result(S); if (S->einfo.errmsg) { pefree(S->einfo.errmsg, stmt->dbh->is_persistent); S->einfo.errmsg = NULL; } if (S->stmt) { - pdo_mysql_stmt_close(S->stmt); + mysql_stmt_close(S->stmt); S->stmt = NULL; } @@ -70,21 +86,9 @@ static int pdo_mysql_stmt_dtor(pdo_stmt_t *stmt) /* {{{ */ if (S->in_length) { efree(S->in_length); } - - if (S->bound_result) - { - int i; - for (i = 0; i < stmt->column_count; i++) { - pdo_free_bound_result(S->bound_result[i]); - } - - efree(S->bound_result); - efree(S->out_null); - efree(S->out_length); - } #endif - if (!Z_ISUNDEF(stmt->database_object_handle) + if (!S->done && !Z_ISUNDEF(stmt->database_object_handle) && IS_OBJ_VALID(EG(objects_store).object_buckets[Z_OBJ_HANDLE(stmt->database_object_handle)]) && (!(OBJ_FLAGS(Z_OBJ(stmt->database_object_handle)) & IS_OBJ_FREE_CALLED))) { while (mysql_more_results(S->H->server)) { @@ -102,7 +106,7 @@ static int pdo_mysql_stmt_dtor(pdo_stmt_t *stmt) /* {{{ */ #ifdef PDO_USE_MYSQLND if (!S->stmt && S->current_data) { - mnd_free(S->current_data); + mnd_efree(S->current_data); } #endif /* PDO_USE_MYSQLND */ @@ -113,9 +117,8 @@ static int pdo_mysql_stmt_dtor(pdo_stmt_t *stmt) /* {{{ */ static void pdo_mysql_stmt_set_row_count(pdo_stmt_t *stmt) /* {{{ */ { - zend_long row_count; pdo_mysql_stmt *S = stmt->driver_data; - row_count = (zend_long) mysql_stmt_affected_rows(S->stmt); + zend_long row_count = (zend_long) mysql_stmt_affected_rows(S->stmt); if (row_count != (zend_long)-1) { stmt->row_count = row_count; } @@ -144,7 +147,7 @@ static int pdo_mysql_fill_stmt_from_result(pdo_stmt_t *stmt) /* {{{ */ } stmt->row_count = (zend_long) mysql_num_rows(S->result); - stmt->column_count = (int) mysql_num_fields(S->result); + php_pdo_stmt_set_column_count(stmt, (int) mysql_num_fields(S->result)); S->fields = mysql_fetch_fields(S->result); } else { /* this was a DML or DDL query (INSERT, UPDATE, DELETE, ... */ @@ -155,116 +158,129 @@ static int pdo_mysql_fill_stmt_from_result(pdo_stmt_t *stmt) /* {{{ */ } /* }}} */ -#ifndef PDO_USE_MYSQLND -static int pdo_mysql_stmt_execute_prepared_libmysql(pdo_stmt_t *stmt) /* {{{ */ -{ +static bool pdo_mysql_stmt_after_execute_prepared(pdo_stmt_t *stmt) { pdo_mysql_stmt *S = stmt->driver_data; pdo_mysql_db_handle *H = S->H; - PDO_DBG_ENTER("pdo_mysql_stmt_execute_prepared_libmysql"); +#ifdef PDO_USE_MYSQLND + /* For SHOW/DESCRIBE and others the column/field count is not available before execute. */ + php_pdo_stmt_set_column_count(stmt, mysql_stmt_field_count(S->stmt)); + for (int i = 0; i < stmt->column_count; i++) { + mysqlnd_stmt_bind_one_result(S->stmt, i); + } - /* (re)bind the parameters */ - if (mysql_stmt_bind_param(S->stmt, S->params) || mysql_stmt_execute(S->stmt)) { - if (S->params) { - memset(S->params, 0, S->num_params * sizeof(MYSQL_BIND)); - } - pdo_mysql_error_stmt(stmt); - if (mysql_stmt_errno(S->stmt) == 2057) { - /* CR_NEW_STMT_METADATA makes the statement unusable */ - S->stmt = NULL; + S->result = mysqlnd_stmt_result_metadata(S->stmt); + if (S->result) { + S->fields = mysql_fetch_fields(S->result); + /* If buffered, pre-fetch all the data */ + if (H->buffered) { + if (mysql_stmt_store_result(S->stmt)) { + pdo_mysql_error_stmt(stmt); + return false; + } } - PDO_DBG_RETURN(0); } +#else + /* figure out the result set format, if any */ + S->result = mysql_stmt_result_metadata(S->stmt); + if (S->result) { + int calc_max_length = H->buffered && S->max_length == 1; + S->fields = mysql_fetch_fields(S->result); - if (!S->result) { - int i; - - /* figure out the result set format, if any */ - S->result = mysql_stmt_result_metadata(S->stmt); - if (S->result) { - int calc_max_length = H->buffered && S->max_length == 1; - S->fields = mysql_fetch_fields(S->result); - if (S->bound_result) { - int i; - for (i = 0; i < stmt->column_count; i++) { - efree(S->bound_result[i].buffer); - } - efree(S->bound_result); - efree(S->out_null); - efree(S->out_length); + php_pdo_stmt_set_column_count(stmt, (int)mysql_num_fields(S->result)); + S->bound_result = ecalloc(stmt->column_count, sizeof(MYSQL_BIND)); + S->out_null = ecalloc(stmt->column_count, sizeof(my_bool)); + S->out_length = ecalloc(stmt->column_count, sizeof(zend_ulong)); + + /* summon memory to hold the row */ + for (int i = 0; i < stmt->column_count; i++) { + if (calc_max_length && S->fields[i].type == FIELD_TYPE_BLOB) { + my_bool on = 1; + mysql_stmt_attr_set(S->stmt, STMT_ATTR_UPDATE_MAX_LENGTH, &on); + calc_max_length = 0; + } + switch (S->fields[i].type) { + case FIELD_TYPE_INT24: + S->bound_result[i].buffer_length = MAX_MEDIUMINT_WIDTH + 1; + break; + case FIELD_TYPE_LONG: + S->bound_result[i].buffer_length = MAX_INT_WIDTH + 1; + break; + case FIELD_TYPE_LONGLONG: + S->bound_result[i].buffer_length = MAX_BIGINT_WIDTH + 1; + break; + case FIELD_TYPE_TINY: + S->bound_result[i].buffer_length = MAX_TINYINT_WIDTH + 1; + break; + case FIELD_TYPE_SHORT: + S->bound_result[i].buffer_length = MAX_SMALLINT_WIDTH + 1; + break; + default: + S->bound_result[i].buffer_length = + S->fields[i].max_length? S->fields[i].max_length: + S->fields[i].length; + /* work-around for longtext and alike */ + if (S->bound_result[i].buffer_length > H->max_buffer_size) { + S->bound_result[i].buffer_length = H->max_buffer_size; + } } - stmt->column_count = (int)mysql_num_fields(S->result); - S->bound_result = ecalloc(stmt->column_count, sizeof(MYSQL_BIND)); - S->out_null = ecalloc(stmt->column_count, sizeof(my_bool)); - S->out_length = ecalloc(stmt->column_count, sizeof(zend_ulong)); - - /* summon memory to hold the row */ - for (i = 0; i < stmt->column_count; i++) { - if (calc_max_length && S->fields[i].type == FIELD_TYPE_BLOB) { - my_bool on = 1; - mysql_stmt_attr_set(S->stmt, STMT_ATTR_UPDATE_MAX_LENGTH, &on); - calc_max_length = 0; - } - switch (S->fields[i].type) { - case FIELD_TYPE_INT24: - S->bound_result[i].buffer_length = MAX_MEDIUMINT_WIDTH + 1; - break; - case FIELD_TYPE_LONG: - S->bound_result[i].buffer_length = MAX_INT_WIDTH + 1; - break; - case FIELD_TYPE_LONGLONG: - S->bound_result[i].buffer_length = MAX_BIGINT_WIDTH + 1; - break; - case FIELD_TYPE_TINY: - S->bound_result[i].buffer_length = MAX_TINYINT_WIDTH + 1; - break; - case FIELD_TYPE_SHORT: - S->bound_result[i].buffer_length = MAX_SMALLINT_WIDTH + 1; - break; - default: - S->bound_result[i].buffer_length = - S->fields[i].max_length? S->fields[i].max_length: - S->fields[i].length; - /* work-around for longtext and alike */ - if (S->bound_result[i].buffer_length > H->max_buffer_size) { - S->bound_result[i].buffer_length = H->max_buffer_size; - } - } + /* there are cases where the length reported by mysql is too short. + * eg: when describing a table that contains an enum column. Since + * we have no way of knowing the true length either, we'll bump up + * our buffer size to a reasonable size, just in case */ + if (S->fields[i].max_length == 0 && S->bound_result[i].buffer_length < 128 && MYSQL_TYPE_VAR_STRING) { + S->bound_result[i].buffer_length = 128; + } - /* there are cases where the length reported by mysql is too short. - * eg: when describing a table that contains an enum column. Since - * we have no way of knowing the true length either, we'll bump up - * our buffer size to a reasonable size, just in case */ - if (S->fields[i].max_length == 0 && S->bound_result[i].buffer_length < 128 && MYSQL_TYPE_VAR_STRING) { - S->bound_result[i].buffer_length = 128; - } + S->out_length[i] = 0; - S->out_length[i] = 0; + S->bound_result[i].buffer = emalloc(S->bound_result[i].buffer_length); + S->bound_result[i].is_null = &S->out_null[i]; + S->bound_result[i].length = &S->out_length[i]; + S->bound_result[i].buffer_type = MYSQL_TYPE_STRING; + } - S->bound_result[i].buffer = emalloc(S->bound_result[i].buffer_length); - S->bound_result[i].is_null = &S->out_null[i]; - S->bound_result[i].length = &S->out_length[i]; - S->bound_result[i].buffer_type = MYSQL_TYPE_STRING; - } + if (mysql_stmt_bind_result(S->stmt, S->bound_result)) { + pdo_mysql_error_stmt(stmt); + PDO_DBG_RETURN(0); + } - if (mysql_stmt_bind_result(S->stmt, S->bound_result)) { + /* if buffered, pre-fetch all the data */ + if (H->buffered) { + if (mysql_stmt_store_result(S->stmt)) { pdo_mysql_error_stmt(stmt); PDO_DBG_RETURN(0); } - - /* if buffered, pre-fetch all the data */ - if (H->buffered) { - if (mysql_stmt_store_result(S->stmt)) { - pdo_mysql_error_stmt(stmt); - PDO_DBG_RETURN(0); - } - } } } +#endif pdo_mysql_stmt_set_row_count(stmt); - PDO_DBG_RETURN(1); + return true; +} + +#ifndef PDO_USE_MYSQLND +static int pdo_mysql_stmt_execute_prepared_libmysql(pdo_stmt_t *stmt) /* {{{ */ +{ + pdo_mysql_stmt *S = stmt->driver_data; + + PDO_DBG_ENTER("pdo_mysql_stmt_execute_prepared_libmysql"); + + /* (re)bind the parameters */ + if (mysql_stmt_bind_param(S->stmt, S->params) || mysql_stmt_execute(S->stmt)) { + if (S->params) { + memset(S->params, 0, S->num_params * sizeof(MYSQL_BIND)); + } + pdo_mysql_error_stmt(stmt); + if (mysql_stmt_errno(S->stmt) == 2057) { + /* CR_NEW_STMT_METADATA makes the statement unusable */ + S->stmt = NULL; + } + PDO_DBG_RETURN(0); + } + + PDO_DBG_RETURN(pdo_mysql_stmt_after_execute_prepared(stmt)); } /* }}} */ #endif @@ -273,8 +289,6 @@ static int pdo_mysql_stmt_execute_prepared_libmysql(pdo_stmt_t *stmt) /* {{{ */ static int pdo_mysql_stmt_execute_prepared_mysqlnd(pdo_stmt_t *stmt) /* {{{ */ { pdo_mysql_stmt *S = stmt->driver_data; - pdo_mysql_db_handle *H = S->H; - int i; PDO_DBG_ENTER("pdo_mysql_stmt_execute_prepared_mysqlnd"); @@ -283,32 +297,7 @@ static int pdo_mysql_stmt_execute_prepared_mysqlnd(pdo_stmt_t *stmt) /* {{{ */ PDO_DBG_RETURN(0); } - if (S->result) { - /* TODO: add a test to check if we really have zvals here... */ - mysql_free_result(S->result); - S->result = NULL; - } - - /* for SHOW/DESCRIBE and others the column/field count is not available before execute */ - stmt->column_count = mysql_stmt_field_count(S->stmt); - for (i = 0; i < stmt->column_count; i++) { - mysqlnd_stmt_bind_one_result(S->stmt, i); - } - - S->result = mysqlnd_stmt_result_metadata(S->stmt); - if (S->result) { - S->fields = mysql_fetch_fields(S->result); - /* if buffered, pre-fetch all the data */ - if (H->buffered) { - if (mysql_stmt_store_result(S->stmt)) { - pdo_mysql_error_stmt(stmt); - PDO_DBG_RETURN(0); - } - } - } - - pdo_mysql_stmt_set_row_count(stmt); - PDO_DBG_RETURN(1); + PDO_DBG_RETURN(pdo_mysql_stmt_after_execute_prepared(stmt)); } /* }}} */ #endif @@ -320,17 +309,15 @@ static int pdo_mysql_stmt_execute(pdo_stmt_t *stmt) /* {{{ */ PDO_DBG_ENTER("pdo_mysql_stmt_execute"); PDO_DBG_INF_FMT("stmt=%p", S->stmt); + /* ensure that we free any previous unfetched results */ + pdo_mysql_free_result(S); + S->done = 0; + if (S->stmt) { PDO_DBG_RETURN(pdo_mysql_stmt_execute_prepared(stmt)); } - /* ensure that we free any previous unfetched results */ - if (S->result) { - mysql_free_result(S->result); - S->result = NULL; - } - - if (mysql_real_query(H->server, stmt->active_query_string, stmt->active_query_stringlen) != 0) { + if (mysql_real_query(H->server, ZSTR_VAL(stmt->active_query_string), ZSTR_LEN(stmt->active_query_string)) != 0) { pdo_mysql_error_stmt(stmt); PDO_DBG_RETURN(0); } @@ -343,99 +330,28 @@ static int pdo_mysql_stmt_next_rowset(pdo_stmt_t *stmt) /* {{{ */ { pdo_mysql_stmt *S = (pdo_mysql_stmt*)stmt->driver_data; pdo_mysql_db_handle *H = S->H; -#ifdef PDO_USE_MYSQLND - zend_long row_count; -#endif PDO_DBG_ENTER("pdo_mysql_stmt_next_rowset"); PDO_DBG_INF_FMT("stmt=%p", S->stmt); -#ifdef PDO_USE_MYSQLND - if (!H->emulate_prepare) { - if (!mysqlnd_stmt_more_results(S->stmt)) { - PDO_DBG_RETURN(0); - } - if (mysqlnd_stmt_next_result(S->stmt)) { - PDO_DBG_RETURN(0); - } - - if (!mysqlnd_stmt_more_results(S->stmt)) { - /* - MySQL gives us n + 1 result sets for - CALL proc() and n result sets returned by the proc itself. - Result set n + 1 is about the procedure call itself. - As the PDO emulation does not return it, we skip it as well - */ - PDO_DBG_RETURN(0); - } - - /* TODO - this code is stolen from execute() - see above */ - if (S->result) { - mysql_free_result(S->result); - S->result = NULL; - } - { - /* for SHOW/DESCRIBE and others the column/field count is not available before execute */ - int i; - - stmt->column_count = mysql_stmt_field_count(S->stmt); - for (i = 0; i < stmt->column_count; i++) { - mysqlnd_stmt_bind_one_result(S->stmt, i); - } - } - - S->result = mysqlnd_stmt_result_metadata(S->stmt); - if (S->result) { - S->fields = mysql_fetch_fields(S->result); - - /* if buffered, pre-fetch all the data */ - if (H->buffered) { - if (mysql_stmt_store_result(S->stmt)) { - pdo_mysql_error_stmt(stmt); - PDO_DBG_RETURN(0); - } - } - } - row_count = (zend_long) mysql_stmt_affected_rows(S->stmt); - if (row_count != (zend_long)-1) { - stmt->row_count = row_count; - } - PDO_DBG_RETURN(1); - } -#endif + /* ensure that we free any previous unfetched results */ + pdo_mysql_free_result(S); -/* ensure that we free any previous unfetched results */ -#ifndef PDO_USE_MYSQLND if (S->stmt) { - if (S->result) { - stmt->column_count = (int)mysql_num_fields(S->result); - } mysql_stmt_free_result(S->stmt); - } -#endif - if (S->result) { - mysql_free_result(S->result); - S->result = NULL; - } - - if (!mysql_more_results(H->server)) { - /* No more results */ - PDO_DBG_RETURN(0); - } -#ifdef PDO_USE_MYSQLND - if (mysql_next_result(H->server) == FAIL) { - pdo_mysql_error_stmt(stmt); - PDO_DBG_RETURN(0); - } else { - PDO_DBG_RETURN(pdo_mysql_fill_stmt_from_result(stmt)); - } -#else - if (mysql_next_result(H->server) > 0) { - pdo_mysql_error_stmt(stmt); - PDO_DBG_RETURN(0); + if (mysql_stmt_next_result(S->stmt)) { + pdo_mysql_error_stmt(stmt); + S->done = 1; + PDO_DBG_RETURN(0); + } + PDO_DBG_RETURN(pdo_mysql_stmt_after_execute_prepared(stmt)); } else { + if (mysql_next_result(H->server)) { + pdo_mysql_error_stmt(stmt); + S->done = 1; + PDO_DBG_RETURN(0); + } PDO_DBG_RETURN(pdo_mysql_fill_stmt_from_result(stmt)); } -#endif } /* }}} */ @@ -471,7 +387,6 @@ static int pdo_mysql_stmt_param_hook(pdo_stmt_t *stmt, struct pdo_bound_param_da strcpy(stmt->error_code, "HY093"); PDO_DBG_RETURN(0); } - S->params_given++; #ifndef PDO_USE_MYSQLND b = &S->params[param->paramno]; @@ -483,7 +398,7 @@ static int pdo_mysql_stmt_param_hook(pdo_stmt_t *stmt, struct pdo_bound_param_da PDO_DBG_RETURN(1); case PDO_PARAM_EVT_EXEC_PRE: - if (S->params_given < (unsigned int) S->num_params) { + if (zend_hash_num_elements(stmt->bound_params) < (unsigned int) S->num_params) { /* too few parameter bound */ PDO_DBG_ERR("too few parameters bound"); strcpy(stmt->error_code, "HY093"); @@ -619,6 +534,11 @@ static int pdo_mysql_stmt_param_hook(pdo_stmt_t *stmt, struct pdo_bound_param_da static int pdo_mysql_stmt_fetch(pdo_stmt_t *stmt, enum pdo_fetch_orientation ori, zend_long offset) /* {{{ */ { pdo_mysql_stmt *S = (pdo_mysql_stmt*)stmt->driver_data; + + if (!S->result) { + PDO_DBG_RETURN(0); + } + #ifdef PDO_USE_MYSQLND zend_bool fetched_anything; @@ -632,6 +552,10 @@ static int pdo_mysql_stmt_fetch(pdo_stmt_t *stmt, enum pdo_fetch_orientation ori PDO_DBG_RETURN(1); } + + if (!S->stmt && S->current_data) { + mnd_efree(S->current_data); + } #else int ret; @@ -655,16 +579,6 @@ static int pdo_mysql_stmt_fetch(pdo_stmt_t *stmt, enum pdo_fetch_orientation ori } #endif /* PDO_USE_MYSQLND */ - if (!S->result) { - strcpy(stmt->error_code, "HY000"); - PDO_DBG_RETURN(0); - } -#ifdef PDO_USE_MYSQLND - if (!S->stmt && S->current_data) { - mnd_free(S->current_data); - } -#endif /* PDO_USE_MYSQLND */ - if ((S->current_data = mysql_fetch_row(S->result)) == NULL) { if (!S->H->buffered && mysql_errno(S->H->server)) { pdo_mysql_error_stmt(stmt); @@ -705,7 +619,11 @@ static int pdo_mysql_stmt_describe(pdo_stmt_t *stmt, int colno) /* {{{ */ if (S->H->fetch_table_names) { cols[i].name = strpprintf(0, "%s.%s", S->fields[i].table, S->fields[i].name); } else { +#ifdef PDO_USE_MYSQLND + cols[i].name = zend_string_copy(S->fields[i].sname); +#else cols[i].name = zend_string_init(S->fields[i].name, S->fields[i].name_length, 0); +#endif } cols[i].precision = S->fields[i].decimals; @@ -901,20 +819,18 @@ static int pdo_mysql_stmt_cursor_closer(pdo_stmt_t *stmt) /* {{{ */ PDO_DBG_ENTER("pdo_mysql_stmt_cursor_closer"); PDO_DBG_INF_FMT("stmt=%p", S->stmt); - if (S->result) { - mysql_free_result(S->result); - S->result = NULL; - } + + S->done = 1; + pdo_mysql_free_result(S); if (S->stmt) { - int retval; - retval = mysql_stmt_free_result(S->stmt); - PDO_DBG_RETURN(retval ? 0 : 1); + mysql_stmt_free_result(S->stmt); } while (mysql_more_results(S->H->server)) { MYSQL_RES *res; if (mysql_next_result(S->H->server) != 0) { - break; + pdo_mysql_error_stmt(stmt); + PDO_DBG_RETURN(0); } res = mysql_store_result(S->H->server); if (res) { diff --git a/ext/pdo_mysql/php_pdo_mysql_int.h b/ext/pdo_mysql/php_pdo_mysql_int.h index cfe1d68e495de..553437829e9b2 100644 --- a/ext/pdo_mysql/php_pdo_mysql_int.h +++ b/ext/pdo_mysql/php_pdo_mysql_int.h @@ -104,6 +104,7 @@ typedef struct { unsigned buffered:1; unsigned emulate_prepare:1; unsigned fetch_table_names:1; + unsigned local_infile:1; #ifndef PDO_USE_MYSQLND zend_ulong max_buffer_size; #endif @@ -140,8 +141,10 @@ typedef struct { PDO_MYSQL_PARAM_BIND *bound_result; my_bool *out_null; zend_ulong *out_length; - unsigned int params_given; unsigned max_length:1; + /* Whether all result sets have been fully consumed. + * If this flag is not set, they need to be consumed during destruction. */ + unsigned done:1; } pdo_mysql_stmt; extern const pdo_driver_t pdo_mysql_driver; diff --git a/ext/pdo_mysql/tests/bug41125.phpt b/ext/pdo_mysql/tests/bug41125.phpt index 63ff7df2f33a3..cc5edba6fa8d5 100644 --- a/ext/pdo_mysql/tests/bug41125.phpt +++ b/ext/pdo_mysql/tests/bug41125.phpt @@ -83,10 +83,12 @@ foreach ($queries as $k => $query) { } ?> ---EXPECT-- +--EXPECTF-- 1 00000 - - ------------------------------------------------------- + +Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in %s on line %d [1] Query: [[SELECT 1 FROM DUAL WHERE 1 = '?\'\'']] 00000 - - @@ -123,18 +125,24 @@ O'\0 1 00000 - - -------- + +Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in %s on line %d [5] Query: [[SELECT 'a', 'b\'' FROM DUAL WHERE '''' LIKE '\'' AND 1]] -a - b' + 00000 - - -------- + +Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in %s on line %d [6] Query: [[SELECT 'a''', '\'b\'' FROM DUAL WHERE '''' LIKE '\'' AND 1]] -a' - 'b' + 00000 - - -------- [7] Query: [[SELECT UPPER(:id) FROM DUAL WHERE '1']] 1 00000 - - -------- + +Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in %s on line %d [8] Query: [[SELECT 1 FROM DUAL WHERE '\'']] 00000 - - @@ -147,13 +155,16 @@ a' - 'b' 00000 - - -------- + +Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in %s on line %d [11] Query: [[SELECT 1 FROM DUAL WHERE '\'' = '''']] -1 + 00000 - - -------- + +Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in %s on line %d [12] Query: [[SELECT '\n' '1 FROM DUAL WHERE '''' and :id']] -1 FROM DUAL WHERE '' and :id 00000 - - -------- [13] Query: [[SELECT 1 'FROM DUAL WHERE :id AND '''' = '''' OR 1 = 1 AND ':id]] diff --git a/ext/pdo_mysql/tests/bug63185.phpt b/ext/pdo_mysql/tests/bug63185.phpt new file mode 100644 index 0000000000000..4bf6d7e4db657 --- /dev/null +++ b/ext/pdo_mysql/tests/bug63185.phpt @@ -0,0 +1,67 @@ +--TEST-- +Bug #63185: nextRowset() ignores MySQL errors with native prepared statements +--SKIPIF-- + +--FILE-- +setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + +$pdo->exec('DROP PROCEDURE IF EXISTS test_procedure_error_at_second'); +$pdo->exec('CREATE PROCEDURE test_procedure_error_at_second () + BEGIN + SELECT "x" as foo; + SELECT * FROM no_such_table; + END'); + +$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, true); +$st = $pdo->query('CALL test_procedure_error_at_second()'); +var_dump($st->fetchAll()); +try { + var_dump($st->nextRowset()); +} catch (PDOException $e) { + echo $e->getMessage(), "\n"; +} +unset($st); + +$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); +$st = $pdo->query('CALL test_procedure_error_at_second()'); +var_dump($st->fetchAll()); +try { + var_dump($st->nextRowset()); +} catch (PDOException $e) { + echo $e->getMessage(), "\n"; +} +var_dump($st->fetchAll()); + +?> +--EXPECTF-- +array(1) { + [0]=> + array(2) { + ["foo"]=> + string(1) "x" + [0]=> + string(1) "x" + } +} +SQLSTATE[42S02]: Base table or view not found: 1146 Table '%s.no_such_table' doesn't exist +array(1) { + [0]=> + array(2) { + ["foo"]=> + string(1) "x" + [0]=> + string(1) "x" + } +} +SQLSTATE[42S02]: Base table or view not found: 1146 Table '%s.no_such_table' doesn't exist +array(0) { +} diff --git a/ext/pdo_mysql/tests/bug66878.phpt b/ext/pdo_mysql/tests/bug66878.phpt new file mode 100644 index 0000000000000..f7501762ba2cd --- /dev/null +++ b/ext/pdo_mysql/tests/bug66878.phpt @@ -0,0 +1,36 @@ +--TEST-- +Bug #66878: Multiple rowsets not returned unless PDO statement object is unset() +--SKIPIF-- + +--FILE-- +query($sql); +var_dump($stmt->nextRowset()); +var_dump($stmt->nextRowset()); +var_dump($stmt->nextRowset()); +$stmt->closeCursor(); + +$stmt = $pdo->query($sql); +var_dump($stmt->nextRowset()); +var_dump($stmt->nextRowset()); +var_dump($stmt->nextRowset()); +$stmt->closeCursor(); + +?> +--EXPECT-- +bool(true) +bool(true) +bool(false) +bool(true) +bool(true) +bool(false) diff --git a/ext/pdo_mysql/tests/bug67004.phpt b/ext/pdo_mysql/tests/bug67004.phpt new file mode 100644 index 0000000000000..98b0a08d0c4f4 --- /dev/null +++ b/ext/pdo_mysql/tests/bug67004.phpt @@ -0,0 +1,34 @@ +--TEST-- +Bug #67004: Executing PDOStatement::fetch() more than once prevents releasing resultset +--SKIPIF-- + +--FILE-- +setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); +$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); +$dbh->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true); +$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); +$stmt = $dbh->prepare("SELECT ?"); + +$stmt->execute(["foo"]); +var_dump($stmt->fetchColumn(0)); + +$stmt->execute(["bar"]); +var_dump($stmt->fetchColumn(0)); + +$stmt = $dbh->prepare("SELECT ?"); +$stmt->execute(["baz"]); +var_dump($stmt->fetchColumn(0)); + +?> +--EXPECT-- +string(3) "foo" +string(3) "bar" +string(3) "baz" diff --git a/ext/pdo_mysql/tests/bug70066.phpt b/ext/pdo_mysql/tests/bug70066.phpt new file mode 100644 index 0000000000000..54660fb3f6121 --- /dev/null +++ b/ext/pdo_mysql/tests/bug70066.phpt @@ -0,0 +1,27 @@ +--TEST-- +Bug #70066: Unexpected "Cannot execute queries while other unbuffered queries" +--SKIPIF-- + +--FILE-- +setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); +$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, 0); + +$db = $pdo->query('SELECT DATABASE()')->fetchColumn(0); +// USE is not supported in the prepared statement protocol, +// so this will fall back to emulation. +$pdo->query('USE ' . $db); + +?> +===DONE=== +--EXPECT-- +===DONE=== diff --git a/ext/pdo_mysql/tests/bug71145.phpt b/ext/pdo_mysql/tests/bug71145.phpt new file mode 100644 index 0000000000000..b3f887d7c4d89 --- /dev/null +++ b/ext/pdo_mysql/tests/bug71145.phpt @@ -0,0 +1,25 @@ +--TEST-- +Bug #71145: Multiple statements in init command triggers unbuffered query error +--SKIPIF-- + +--FILE-- + PDO::ERRMODE_EXCEPTION, + PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci; SET SESSION sql_mode=traditional', +); +putenv('PDOTEST_ATTR=' . serialize($attr)); + +$pdo = MySQLPDOTest::factory(); +var_dump($pdo->query('SELECT 42')->fetchColumn(0)); + +?> +--EXPECT-- +string(2) "42" diff --git a/ext/pdo_mysql/tests/bug76815.phpt b/ext/pdo_mysql/tests/bug76815.phpt new file mode 100644 index 0000000000000..b5c8577b07c04 --- /dev/null +++ b/ext/pdo_mysql/tests/bug76815.phpt @@ -0,0 +1,33 @@ +--TEST-- +Bug #76815: PDOStatement cannot be GCed/closeCursor-ed when a PROCEDURE resultset SIGNAL +--SKIPIF-- + +--FILE-- +setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + +$pdo->query('DROP FUNCTION IF EXISTS tst'); +$pdo->query('DROP PROCEDURE IF EXISTS tst2'); +$pdo->query('CREATE FUNCTION tst() RETURNS VARCHAR(5) DETERMINISTIC BEGIN RETURN \'x12345\'; END'); +$pdo->query('CREATE PROCEDURE tst2() BEGIN SELECT tst(); END'); + +$st = $pdo->prepare('CALL tst2()'); +try { + $st->execute(); +} catch (PDOException $ex) { + echo $ex->getMessage(), "\n"; +} +unset($st); +echo "Ok.\n"; + +?> +--EXPECT-- +SQLSTATE[22001]: String data, right truncated: 1406 Data too long for column 'tst()' at row 1 +Ok. diff --git a/ext/pdo_mysql/tests/bug78152.phpt b/ext/pdo_mysql/tests/bug78152.phpt new file mode 100644 index 0000000000000..8fc4fc7986d19 --- /dev/null +++ b/ext/pdo_mysql/tests/bug78152.phpt @@ -0,0 +1,33 @@ +--TEST-- +Bug #78152: PDO::exec() - Bad error handling with multiple commands +--SKIPIF-- + +--FILE-- +exec("INSERT INTO test(id, label) VALUES (41, 'x'); INSERT INTO test_bad(id, label) VALUES (42, 'y')")); +$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); +try { + var_dump($db->exec("INSERT INTO test(id, label) VALUES (42, 'x'); INSERT INTO test_bad(id, label) VALUES (43, 'y')")); +} catch (PDOException $e) { + echo $e->getMessage(), "\n"; +} + +?> +--CLEAN-- + +--EXPECTF-- +Warning: PDO::exec(): SQLSTATE[42S02]: Base table or view not found: 1146 Table '%s.test_bad' doesn't exist in %s on line %d +bool(false) +SQLSTATE[42S02]: Base table or view not found: 1146 Table '%s.test_bad' doesn't exist diff --git a/ext/pdo_mysql/tests/bug79132.phpt b/ext/pdo_mysql/tests/bug79132.phpt new file mode 100644 index 0000000000000..6535dbdee9f6b --- /dev/null +++ b/ext/pdo_mysql/tests/bug79132.phpt @@ -0,0 +1,66 @@ +--TEST-- +Bug #79132: PDO re-uses parameter values from earlier calls to execute() +--SKIPIF-- + +--FILE-- +setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + +$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, true); +test($pdo); +echo "\n"; +$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); +test($pdo); + +function test($pdo) { + $stmt = $pdo->prepare('select ? a, ? b'); + + $set = [ + ['a', 'b'], + ['x'], /* second parameter is missing */ + [1 => 'y'], /* first parameter is missing */ + ]; + + foreach ($set as $params) { + try { + var_dump($stmt->execute($params), $stmt->fetchAll(PDO::FETCH_ASSOC)); + } catch (PDOException $error) { + echo $error->getMessage() . "\n"; + } + } +} + +?> +--EXPECT-- +bool(true) +array(1) { + [0]=> + array(2) { + ["a"]=> + string(1) "a" + ["b"]=> + string(1) "b" + } +} +SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens +SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens + +bool(true) +array(1) { + [0]=> + array(2) { + ["a"]=> + string(1) "a" + ["b"]=> + string(1) "b" + } +} +SQLSTATE[HY093]: Invalid parameter number +SQLSTATE[HY093]: Invalid parameter number diff --git a/ext/pdo_mysql/tests/bug79872.phpt b/ext/pdo_mysql/tests/bug79872.phpt new file mode 100644 index 0000000000000..0d1ecaf2d313d --- /dev/null +++ b/ext/pdo_mysql/tests/bug79872.phpt @@ -0,0 +1,26 @@ +--TEST-- +Bug #79872: Can't execute query with pending result sets +--SKIPIF-- + +--FILE-- +setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + +$stmt = $db->prepare('SET @foo = 1; SET @bar = 2;'); +$stmt->execute(); +try { + var_dump($db->query('SELECT @foo')->fetchAll()); +} catch (PDOException $e) { + echo $e->getMessage(), "\n"; +} + +?> +--EXPECT-- +SQLSTATE[HY000]: General error: 2014 Cannot execute queries while there are pending result sets. Consider unsetting the previous PDOStatement or calling PDOStatement::closeCursor() diff --git a/ext/pdo_mysql/tests/bug80458.phpt b/ext/pdo_mysql/tests/bug80458.phpt new file mode 100644 index 0000000000000..86e171d302d27 --- /dev/null +++ b/ext/pdo_mysql/tests/bug80458.phpt @@ -0,0 +1,186 @@ +--TEST-- +Bug #80458 PDOStatement::fetchAll() throws for upsert queries +--SKIPIF-- + +--FILE-- +setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); +$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); + +$db->query('DROP TABLE IF EXISTS test'); +$db->query('CREATE TABLE test (first int) ENGINE = InnoDB'); +$res = $db->query('INSERT INTO test(first) VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(13),(14),(15),(16)'); +var_dump($res->fetchAll()); + +$stmt = $db->prepare('DELETE FROM test WHERE first=1'); +$stmt->execute(); +var_dump($stmt->fetchAll()); + +$res = $db->query('DELETE FROM test WHERE first=2'); +var_dump($res->fetchAll()); + +$stmt2 = $db->prepare('DELETE FROM test WHERE first=3'); +$stmt2->execute(); +foreach($stmt2 as $row){ + // expect nothing +} + +$stmt3 = $db->prepare('DELETE FROM test WHERE first=4'); +$stmt3->execute(); +var_dump($stmt3->fetch(PDO::FETCH_ASSOC)); + +$stmt = $db->prepare('SELECT first FROM test WHERE first=5'); +$stmt->execute(); +var_dump($stmt->fetchAll()); + +$db->exec('DROP PROCEDURE IF EXISTS nores'); +$db->exec('CREATE PROCEDURE nores() BEGIN DELETE FROM test WHERE first=6; END;'); +$stmt4 = $db->prepare('CALL nores()'); +$stmt4->execute(); +var_dump($stmt4->fetchAll()); +$db->exec('DROP PROCEDURE IF EXISTS nores'); + +$db->exec('DROP PROCEDURE IF EXISTS ret'); +$db->exec('CREATE PROCEDURE ret() BEGIN SELECT first FROM test WHERE first=7; END;'); +$stmt5 = $db->prepare('CALL ret()'); +$stmt5->execute(); +var_dump($stmt5->fetchAll()); +$stmt5->nextRowset(); // needed to fetch the empty result set of CALL +var_dump($stmt5->fetchAll()); +$db->exec('DROP PROCEDURE IF EXISTS ret'); + +/* With emulated prepares */ +print("Emulated prepares\n"); +$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, true); + +$stmt = $db->prepare('DELETE FROM test WHERE first=8'); +$stmt->execute(); +var_dump($stmt->fetchAll()); + +$res = $db->query('DELETE FROM test WHERE first=9'); +var_dump($res->fetchAll()); + +$stmt2 = $db->prepare('DELETE FROM test WHERE first=10'); +$stmt2->execute(); +foreach($stmt2 as $row){ + // expect nothing +} + +$stmt3 = $db->prepare('DELETE FROM test WHERE first=11'); +$stmt3->execute(); +var_dump($stmt3->fetch(PDO::FETCH_ASSOC)); + +$stmt = $db->prepare('SELECT first FROM test WHERE first=12'); +$stmt->execute(); +var_dump($stmt->fetchAll()); + +$db->exec('DROP PROCEDURE IF EXISTS nores'); +$db->exec('CREATE PROCEDURE nores() BEGIN DELETE FROM test WHERE first=13; END;'); +$stmt4 = $db->prepare('CALL nores()'); +$stmt4->execute(); +var_dump($stmt4->fetchAll()); +$db->exec('DROP PROCEDURE IF EXISTS nores'); + +$db->exec('DROP PROCEDURE IF EXISTS ret'); +$db->exec('CREATE PROCEDURE ret() BEGIN SELECT first FROM test WHERE first=14; END;'); +$stmt5 = $db->prepare('CALL ret()'); +$stmt5->execute(); +var_dump($stmt5->fetchAll()); +$stmt5->nextRowset(); // needed to fetch the empty result set of CALL +var_dump($stmt5->fetchAll()); +$db->exec('DROP PROCEDURE IF EXISTS ret'); + +$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); +$db->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false); + +$stmt = $db->prepare('DELETE FROM test WHERE first=15'); +$stmt->execute(); +var_dump($stmt->fetchAll()); + +$stmt = $db->prepare('SELECT first FROM test WHERE first=16'); +$stmt->execute(); +var_dump($stmt->fetchAll()); + +?> +--CLEAN-- + +--EXPECT-- +array(0) { +} +array(0) { +} +array(0) { +} +bool(false) +array(1) { + [0]=> + array(2) { + ["first"]=> + int(5) + [0]=> + int(5) + } +} +array(0) { +} +array(1) { + [0]=> + array(2) { + ["first"]=> + int(7) + [0]=> + int(7) + } +} +array(0) { +} +Emulated prepares +array(0) { +} +array(0) { +} +bool(false) +array(1) { + [0]=> + array(2) { + ["first"]=> + string(2) "12" + [0]=> + string(2) "12" + } +} +array(0) { +} +array(1) { + [0]=> + array(2) { + ["first"]=> + string(2) "14" + [0]=> + string(2) "14" + } +} +array(0) { +} +array(0) { +} +array(1) { + [0]=> + array(2) { + ["first"]=> + int(16) + [0]=> + int(16) + } +} diff --git a/ext/pdo_mysql/tests/bug_39858.phpt b/ext/pdo_mysql/tests/bug_39858.phpt index e33415eb675a9..d421d31a38ab1 100644 --- a/ext/pdo_mysql/tests/bug_39858.phpt +++ b/ext/pdo_mysql/tests/bug_39858.phpt @@ -18,8 +18,6 @@ if ($version < 50000) die(sprintf("skip Need MySQL Server 5.0.0+, found %d.%02d.%02d (%d)\n", $matches[1], $matches[2], $matches[3], $version)); ?> ---XFAIL-- -nextRowset() problem with stored proc & emulation mode & mysqlnd --FILE-- array(1) { @@ -86,6 +86,8 @@ array(1) { string(1) "4" } } +array(0) { +} Native Prepared Statements... array(1) { [0]=> @@ -94,6 +96,8 @@ array(1) { string(1) "4" } } +array(0) { +} array(1) { [0]=> array(1) { @@ -101,4 +105,6 @@ array(1) { string(1) "4" } } +array(0) { +} done! diff --git a/ext/pdo_mysql/tests/bug_41125.phpt b/ext/pdo_mysql/tests/bug_41125.phpt index e7db01c8e3218..d96778d75468b 100644 --- a/ext/pdo_mysql/tests/bug_41125.phpt +++ b/ext/pdo_mysql/tests/bug_41125.phpt @@ -13,7 +13,6 @@ if (!preg_match('/^(\d+)\.(\d+)\.(\d+)/ismU', $row['_version'], $matches)) die(sprintf("skip Cannot determine MySQL Server version\n")); $version = $matches[1] * 10000 + $matches[2] * 100 + $matches[3]; -die("skip $version"); if ($version < 40100) die(sprintf("skip Need MySQL Server 5.0.0+, found %d.%02d.%02d (%d)\n", $matches[1], $matches[2], $matches[3], $version)); @@ -27,10 +26,6 @@ $db->exec("DROP TABLE IF EXISTS test"); // And now allow the evil to do his work $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, 1); $sql = "CREATE TABLE IF NOT EXISTS test(id INT); INSERT INTO test(id) VALUES (1); SELECT * FROM test; INSERT INTO test(id) VALUES (2); SELECT * FROM test;"; -// NOTE: This will fail, it is OK to fail - you must not mix DML/DDL and SELECT -// The PDO API does not support multiple queries properly! -// Read http://blog.ulf-wendel.de/?p=192 -// Compare MySQL C-API documentation $stmt = $db->query($sql); do { var_dump($stmt->fetchAll()); @@ -44,8 +39,36 @@ require __DIR__ . '/mysql_pdo_test.inc'; $db = MySQLPDOTest::factory(); $db->exec("DROP TABLE IF EXISTS test"); ?> ---EXPECTF-- -Warning: PDOStatement::fetchAll(): SQLSTATE[HY000]: General error in %s on line %d +--EXPECT-- array(0) { } +array(0) { +} +array(1) { + [0]=> + array(2) { + ["id"]=> + string(1) "1" + [0]=> + string(1) "1" + } +} +array(0) { +} +array(2) { + [0]=> + array(2) { + ["id"]=> + string(1) "1" + [0]=> + string(1) "1" + } + [1]=> + array(2) { + ["id"]=> + string(1) "2" + [0]=> + string(1) "2" + } +} done! diff --git a/ext/pdo_mysql/tests/bug_41997.phpt b/ext/pdo_mysql/tests/bug_41997.phpt index 7ce2e810d43ee..769080f86a228 100644 --- a/ext/pdo_mysql/tests/bug_41997.phpt +++ b/ext/pdo_mysql/tests/bug_41997.phpt @@ -1,7 +1,5 @@ --TEST-- PDO MySQL Bug #41997 (stored procedure call returning single rowset blocks future queries) ---XFAIL-- -nextRowset() problem with stored proc & emulation mode & mysqlnd --SKIPIF-- string(5) "00000" diff --git a/ext/pdo_mysql/tests/bug_pecl_7976.phpt b/ext/pdo_mysql/tests/bug_pecl_7976.phpt index 13d4d1b519263..af34f02331cdd 100644 --- a/ext/pdo_mysql/tests/bug_pecl_7976.phpt +++ b/ext/pdo_mysql/tests/bug_pecl_7976.phpt @@ -56,8 +56,6 @@ require __DIR__ . '/mysql_pdo_test.inc'; $db = MySQLPDOTest::factory(); $db->exec('DROP PROCEDURE IF EXISTS p'); ?> ---XFAIL-- -Works with mysqlnd. It is not supported by libmysql. For libmysql is good enough to see no crash. --EXPECT-- Emulated... array(1) { diff --git a/ext/pdo_mysql/tests/change_column_count.phpt b/ext/pdo_mysql/tests/change_column_count.phpt new file mode 100644 index 0000000000000..5bb521d300c24 --- /dev/null +++ b/ext/pdo_mysql/tests/change_column_count.phpt @@ -0,0 +1,60 @@ +--TEST-- +Change column count after statement has been prepared +--SKIPIF-- + +--FILE-- +setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); + +$db->exec('DROP TABLE IF EXISTS test'); +$db->exec('CREATE TABLE test (id INTEGER PRIMARY KEY NOT NULL, name VARCHAR(255) NOT NULL)'); + +$stmt = $db->prepare('INSERT INTO test (id, name) VALUES(:id, :name)'); +$stmt->execute([ + 'id' => 10, + 'name' => 'test', +]); + +$stmt = $db->prepare('SELECT * FROM test WHERE id = :id'); +$stmt->execute(['id' => 10]); +var_dump($stmt->fetchAll(\PDO::FETCH_ASSOC)); + +$db->exec('ALTER TABLE test ADD new_col VARCHAR(255)'); +$stmt->execute(['id' => 10]); +var_dump($stmt->fetchAll(\PDO::FETCH_ASSOC)); + +?> +--CLEAN-- + +--EXPECT-- +array(1) { + [0]=> + array(2) { + ["id"]=> + string(2) "10" + ["name"]=> + string(4) "test" + } +} +array(1) { + [0]=> + array(3) { + ["id"]=> + string(2) "10" + ["name"]=> + string(4) "test" + ["new_col"]=> + NULL + } +} diff --git a/ext/pdo_mysql/tests/config.inc b/ext/pdo_mysql/tests/config.inc index d0a67ccd16675..8bcc1ee65968f 100644 --- a/ext/pdo_mysql/tests/config.inc +++ b/ext/pdo_mysql/tests/config.inc @@ -20,7 +20,7 @@ foreach ($config['ENV'] as $k => $v) { } /* MySQL specific settings */ -define('PDO_MYSQL_TEST_ENGINE', (false !== getenv('PDO_MYSQL_TEST_ENGINE')) ? getenv('PDO_MYSQL_TEST_ENGINE') : 'MyISAM'); +define('PDO_MYSQL_TEST_ENGINE', (false !== getenv('PDO_MYSQL_TEST_ENGINE')) ? getenv('PDO_MYSQL_TEST_ENGINE') : 'InnoDB'); define('PDO_MYSQL_TEST_HOST', (false !== getenv('PDO_MYSQL_TEST_HOST')) ? getenv('PDO_MYSQL_TEST_HOST') : 'localhost'); define('PDO_MYSQL_TEST_PORT', (false !== getenv('PDO_MYSQL_TEST_PORT')) ? getenv('PDO_MYSQL_TEST_PORT') : NULL); define('PDO_MYSQL_TEST_DB', (false !== getenv('PDO_MYSQL_TEST_DB')) ? getenv('PDO_MYSQL_TEST_DB') : 'test'); diff --git a/ext/pdo_mysql/tests/pdo_mysql___construct_options_libmysql.phpt b/ext/pdo_mysql/tests/pdo_mysql___construct_options_libmysql.phpt index 1838336050a36..c186689932fbf 100644 --- a/ext/pdo_mysql/tests/pdo_mysql___construct_options_libmysql.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql___construct_options_libmysql.phpt @@ -27,57 +27,52 @@ if (MySQLPDOTest::isPDOMySQLnd()) $tmp, gettype($tmp), $option_desc); } catch (PDOException $e) { - printf("[%03d] %s\n", $offset, $e->getMessage()); + echo "Failed to getAttribute() for $option_desc\n"; } - } - try { - - $dsn = MySQLPDOTest::getDSN(); - $user = PDO_MYSQL_TEST_USER; - $pass = PDO_MYSQL_TEST_PASS; + $dsn = MySQLPDOTest::getDSN(); + $user = PDO_MYSQL_TEST_USER; + $pass = PDO_MYSQL_TEST_PASS; - $valid_options = array(); - $valid_options[PDO::MYSQL_ATTR_MAX_BUFFER_SIZE] = 'PDO::MYSQL_ATTR_MAX_BUFFER_SIZE'; - $valid_options[PDO::MYSQL_ATTR_INIT_COMMAND] = 'PDO::MYSQL_ATTR_INIT_COMMAND'; - $valid_options[PDO::MYSQL_ATTR_READ_DEFAULT_FILE] = 'PDO::MYSQL_ATTR_READ_DEFAULT_FILE'; - $valid_options[PDO::MYSQL_ATTR_READ_DEFAULT_GROUP] = 'PDO::MYSQL_ATTR_READ_DEFAULT_GROUP'; + $valid_options = array(); + $valid_options[PDO::MYSQL_ATTR_MAX_BUFFER_SIZE] = 'PDO::MYSQL_ATTR_MAX_BUFFER_SIZE'; + $valid_options[PDO::MYSQL_ATTR_INIT_COMMAND] = 'PDO::MYSQL_ATTR_INIT_COMMAND'; + $valid_options[PDO::MYSQL_ATTR_READ_DEFAULT_FILE] = 'PDO::MYSQL_ATTR_READ_DEFAULT_FILE'; + $valid_options[PDO::MYSQL_ATTR_READ_DEFAULT_GROUP] = 'PDO::MYSQL_ATTR_READ_DEFAULT_GROUP'; - $defaults[PDO::MYSQL_ATTR_MAX_BUFFER_SIZE] = 1048576; - /* TODO getAttribute() does not handle it */ - $defaults[PDO::MYSQL_ATTR_INIT_COMMAND] = ''; - $defaults[PDO::MYSQL_ATTR_READ_DEFAULT_FILE] = false; - $defaults[PDO::MYSQL_ATTR_READ_DEFAULT_GROUP] = false; + $defaults[PDO::MYSQL_ATTR_MAX_BUFFER_SIZE] = 1048576; + /* TODO getAttribute() does not handle it */ + $defaults[PDO::MYSQL_ATTR_INIT_COMMAND] = ''; + $defaults[PDO::MYSQL_ATTR_READ_DEFAULT_FILE] = false; + $defaults[PDO::MYSQL_ATTR_READ_DEFAULT_GROUP] = false; - $db = new PDO($dsn, $user, $pass); - foreach ($valid_options as $option => $name) { - /* TODO getAttribute() is pretty poor in supporting the options, suppress errors */ - $tmp = @$db->getAttribute($option); + $db = new PDO($dsn, $user, $pass); + foreach ($valid_options as $option => $name) { + try { + $tmp = $db->getAttribute($option); if ($tmp !== $defaults[$option]) printf("[001] Expecting default value for '%s' of '%s'/%s, getAttribute() reports setting '%s'/%s\n", $name, $defaults[$option], gettype($defaults[$option]), $tmp, gettype($tmp)); + } catch (PDOException $e) { + echo "Failed to getAttribute() for $name\n"; } + } - set_option_and_check(26, PDO::MYSQL_ATTR_READ_DEFAULT_FILE, true, 'PDO::MYSQL_ATTR_READ_DEFAULT_FILE'); - set_option_and_check(27, PDO::MYSQL_ATTR_READ_DEFAULT_FILE, false, 'PDO::MYSQL_ATTR_READ_DEFAULT_FILE'); - - set_option_and_check(30, PDO::MYSQL_ATTR_MAX_BUFFER_SIZE, -1, 'PDO::MYSQL_ATTR_MAX_BUFFER_SIZE', true); - set_option_and_check(31, PDO::MYSQL_ATTR_MAX_BUFFER_SIZE, PHP_INT_MAX, 'PDO::MYSQL_ATTR_MAX_BUFFER_SIZE'); - set_option_and_check(32, PDO::MYSQL_ATTR_MAX_BUFFER_SIZE, 1, 'PDO::MYSQL_ATTR_MAX_BUFFER_SIZE'); - + set_option_and_check(26, PDO::MYSQL_ATTR_READ_DEFAULT_FILE, true, 'PDO::MYSQL_ATTR_READ_DEFAULT_FILE'); + set_option_and_check(27, PDO::MYSQL_ATTR_READ_DEFAULT_FILE, false, 'PDO::MYSQL_ATTR_READ_DEFAULT_FILE'); - } catch (PDOException $e) { - printf("[001] %s, [%s] %s\n", - $e->getMessage(), - (is_object($db)) ? $db->errorCode() : 'n/a', - (is_object($db)) ? implode(' ', $db->errorInfo()) : 'n/a'); - } + set_option_and_check(30, PDO::MYSQL_ATTR_MAX_BUFFER_SIZE, -1, 'PDO::MYSQL_ATTR_MAX_BUFFER_SIZE', true); + set_option_and_check(31, PDO::MYSQL_ATTR_MAX_BUFFER_SIZE, PHP_INT_MAX, 'PDO::MYSQL_ATTR_MAX_BUFFER_SIZE'); + set_option_and_check(32, PDO::MYSQL_ATTR_MAX_BUFFER_SIZE, 1, 'PDO::MYSQL_ATTR_MAX_BUFFER_SIZE'); - print "done!"; + print "done!\n"; ?> --EXPECT-- -[001] Expecting default value for 'PDO::MYSQL_ATTR_INIT_COMMAND' of ''/string, getAttribute() reports setting ''/boolean -[026] Expecting '1'/boolean got ''/boolean' for options 'PDO::MYSQL_ATTR_READ_DEFAULT_FILE' +Failed to getAttribute() for PDO::MYSQL_ATTR_INIT_COMMAND +Failed to getAttribute() for PDO::MYSQL_ATTR_READ_DEFAULT_FILE +Failed to getAttribute() for PDO::MYSQL_ATTR_READ_DEFAULT_GROUP +Failed to getAttribute() for PDO::MYSQL_ATTR_READ_DEFAULT_FILE +Failed to getAttribute() for PDO::MYSQL_ATTR_READ_DEFAULT_FILE done! diff --git a/ext/pdo_mysql/tests/pdo_mysql_attr_oracle_nulls.phpt b/ext/pdo_mysql/tests/pdo_mysql_attr_oracle_nulls.phpt index 6d922a037def8..d7f54bfdee940 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_attr_oracle_nulls.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_attr_oracle_nulls.phpt @@ -40,7 +40,7 @@ MySQLPDOTest::skip(); $db->setAttribute(PDO::ATTR_ORACLE_NULLS, 1); $stmt = $db->query('SELECT VERSION() as _version'); $row = $stmt->fetch(PDO::FETCH_ASSOC); - if ((int)substr($row['_version'], 0, 1) >= 5) + if ((int)strtok($row['_version'], '.') >= 5) $have_procedures = true; else $have_procedures = false; @@ -53,31 +53,13 @@ MySQLPDOTest::skip(); // requires MySQL 5+ $stmt = $db->prepare('CALL p()'); $stmt->execute(); - $expected = array( - array( - "z" => NULL, - "a" => NULL, - "b" => " ", - "c" => NULL, - "d" => " d", - "e" => " e", - ), - ); do { - $tmp = $stmt->fetchAll(PDO::FETCH_ASSOC); - if ($tmp != $expected) { - printf("[004] Expecting %s got %s\n", - var_export($expected, true), var_export($tmp, true)); - } + var_dump($stmt->fetchAll(PDO::FETCH_ASSOC)); } while ($stmt->nextRowset()); $stmt->execute(); do { - $tmp = $stmt->fetchAll(PDO::FETCH_ASSOC); - if ($tmp != $expected) { - printf("[005] Expecting %s got %s\n", - var_export($expected, true), var_export($tmp, true)); - } + var_dump($stmt->fetchAll(PDO::FETCH_ASSOC)); } while ($stmt->nextRowset()); } @@ -124,4 +106,42 @@ array(1) { string(3) "%se" } } +array(1) { + [0]=> + array(6) { + ["z"]=> + NULL + ["a"]=> + NULL + ["b"]=> + string(1) " " + ["c"]=> + NULL + ["d"]=> + string(2) " d" + ["e"]=> + string(2) " e" + } +} +array(0) { +} +array(1) { + [0]=> + array(6) { + ["z"]=> + NULL + ["a"]=> + NULL + ["b"]=> + string(1) " " + ["c"]=> + NULL + ["d"]=> + string(2) " d" + ["e"]=> + string(2) " e" + } +} +array(0) { +} done! diff --git a/ext/pdo_mysql/tests/pdo_mysql_closecursor_error.phpt b/ext/pdo_mysql/tests/pdo_mysql_closecursor_error.phpt new file mode 100644 index 0000000000000..1f9421fe8af1e --- /dev/null +++ b/ext/pdo_mysql/tests/pdo_mysql_closecursor_error.phpt @@ -0,0 +1,30 @@ +--TEST-- +Error during closeCursor() of multi query +--SKIPIF-- + +--FILE-- +query('SELECT 1; SELECT x FROM does_not_exist'); +var_dump($stmt->fetchAll()); +var_dump($stmt->closeCursor()); +?> +--EXPECTF-- +array(1) { + [0]=> + array(2) { + [1]=> + string(1) "1" + [0]=> + string(1) "1" + } +} + +Warning: PDOStatement::closeCursor(): SQLSTATE[42S02]: Base table or view not found: 1146 Table '%s.does_not_exist' doesn't exist in %s on line %d +bool(false) diff --git a/ext/pdo_mysql/tests/pdo_mysql_exec_load_data.phpt b/ext/pdo_mysql/tests/pdo_mysql_exec_load_data.phpt index b3069eaf008f3..7a0d6e36a26c5 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_exec_load_data.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_exec_load_data.phpt @@ -64,50 +64,43 @@ if (($row = $stmt->fetch(PDO::FETCH_ASSOC)) && ($row['value'] != '')) { MySQLPDOTest::createTestTable($db, MySQLPDOTest::detect_transactional_mysql_engine($db)); /* affected rows related */ - try { - exec_and_count(2, $db, 'DROP TABLE IF EXISTS test', 0); - exec_and_count(3, $db, sprintf('CREATE TABLE test(id INT NOT NULL PRIMARY KEY, col1 CHAR(10)) ENGINE=%s', PDO_MYSQL_TEST_ENGINE), 0); + exec_and_count(2, $db, 'DROP TABLE IF EXISTS test', 0); + exec_and_count(3, $db, sprintf('CREATE TABLE test(id INT NOT NULL PRIMARY KEY, col1 CHAR(10)) ENGINE=%s', PDO_MYSQL_TEST_ENGINE), 0); - $stmt = $db->query("SHOW VARIABLES LIKE 'secure_file_priv'"); - if (($row = $stmt->fetch(PDO::FETCH_ASSOC)) && ($row['value'] != '')) { - $filename = $row['value'] . DIRECTORY_SEPARATOR . "pdo_mysql_exec_load_data.csv"; - } else { - $filename = MySQLPDOTest::getTempDir() . DIRECTORY_SEPARATOR . "pdo_mysql_exec_load_data.csv"; - } + $stmt = $db->query("SHOW VARIABLES LIKE 'secure_file_priv'"); + if (($row = $stmt->fetch(PDO::FETCH_ASSOC)) && ($row['value'] != '')) { + $filename = $row['value'] . DIRECTORY_SEPARATOR . "pdo_mysql_exec_load_data.csv"; + } else { + $filename = MySQLPDOTest::getTempDir() . DIRECTORY_SEPARATOR . "pdo_mysql_exec_load_data.csv"; + } - $fp = fopen($filename, "w"); - fwrite($fp, "1;foo\n"); - fwrite($fp, "2;bar"); - fclose($fp); - - $sql = sprintf("LOAD DATA LOCAL INFILE %s INTO TABLE test FIELDS TERMINATED BY ';' LINES TERMINATED BY '\n'", $db->quote($filename)); - - if (exec_and_count(4, $db, $sql, 2)) { - - $stmt = $db->query('SELECT id, col1 FROM test ORDER BY id ASC'); - $expected = array(array("id" => 1, "col1" => "foo"), array("id" => 2, "col1" => "bar")); - $ret = $stmt->fetchAll(PDO::FETCH_ASSOC); - foreach ($expected as $offset => $exp) { - foreach ($exp as $key => $value) { - if ($ret[$offset][$key] != $value) { - printf("Results seem wrong, check manually\n"); - var_dump($ret); - var_dump($expected); - break 2; - } + $fp = fopen($filename, "w"); + fwrite($fp, "1;foo\n"); + fwrite($fp, "2;bar"); + fclose($fp); + + $sql = sprintf("LOAD DATA LOCAL INFILE %s INTO TABLE test FIELDS TERMINATED BY ';' LINES TERMINATED BY '\n'", $db->quote($filename)); + + if (exec_and_count(4, $db, $sql, 2)) { + + $stmt = $db->query('SELECT id, col1 FROM test ORDER BY id ASC'); + $expected = array(array("id" => 1, "col1" => "foo"), array("id" => 2, "col1" => "bar")); + $ret = $stmt->fetchAll(PDO::FETCH_ASSOC); + foreach ($expected as $offset => $exp) { + foreach ($exp as $key => $value) { + if ($ret[$offset][$key] != $value) { + printf("Results seem wrong, check manually\n"); + var_dump($ret); + var_dump($expected); + break 2; } } } - - unlink($filename); - - } catch (PDOException $e) { - printf("[001] %s, [%s] %s\n", - $e->getMessage(), - $db->errorCode(), implode(' ', $db->errorInfo())); } + unlink($filename); + print "done!"; ?> --CLEAN-- diff --git a/ext/pdo_mysql/tests/pdo_mysql_local_infile_default_off.phpt b/ext/pdo_mysql/tests/pdo_mysql_local_infile_default_off.phpt index 4c9f60ea1190d..810adce7e7b7f 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_local_infile_default_off.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_local_infile_default_off.phpt @@ -5,8 +5,6 @@ ensure default for local infile is off require_once(__DIR__ . DIRECTORY_SEPARATOR . 'skipif.inc'); require_once(__DIR__ . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc'); MySQLPDOTest::skip(); -if (!MYSQLPDOTest::isPDOMySQLnd()) - die("skip mysqlnd only test"); ?> --FILE-- --FILE-- --FILE-- @@ -173,6 +172,8 @@ array(3) { string(1) "a" } } +array(0) { +} bool(false) Warning: PDO::query(): SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your %s server version for the right syntax to use near 'INSERT INTO test (id, label) VALUES (99, 'x')' at line 1 in %s on line %d @@ -219,6 +220,8 @@ array(3) { string(1) "a" } } +array(0) { +} bool(false) array(3) { [0]=> @@ -260,6 +263,8 @@ array(3) { string(1) "a" } } +array(0) { +} bool(false) string(5) "00000" done! diff --git a/ext/pdo_mysql/tests/pdo_mysql_prepare_emulated.phpt b/ext/pdo_mysql/tests/pdo_mysql_prepare_emulated.phpt index 6afd57420f9f4..b23d697efa89e 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_prepare_emulated.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_prepare_emulated.phpt @@ -326,11 +326,8 @@ require __DIR__ . '/mysql_pdo_test.inc'; $db = MySQLPDOTest::factory(); $db->exec('DROP TABLE IF EXISTS test'); ?> ---XFAIL-- -PDO's PS parser has some problems with invalid SQL and crashes from time to time -(check with valgrind...) ---EXPECT-- -PDO::prepare(): Argument #1 ($statement) cannot be empty +--EXPECTF-- +PDO::prepare(): Argument #1 ($query) cannot be empty array(1) { ["one"]=> string(1) "1" @@ -342,12 +339,9 @@ array(1) { string(12) ":placeholder" } } -array(1) { - [0]=> - array(1) { - ["label"]=> - string(12) ":placeholder" - } + +Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in %s on line %d +array(0) { } array(2) { [0]=> @@ -384,12 +378,9 @@ array(1) { string(1) "?" } } -array(1) { - [0]=> - array(1) { - ["label"]=> - string(1) "?" - } + +Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in %s on line %d +array(0) { } array(2) { [0]=> diff --git a/ext/pdo_mysql/tests/pdo_mysql_prepare_emulated_anonymous.phpt b/ext/pdo_mysql/tests/pdo_mysql_prepare_emulated_anonymous.phpt index abd2615ce89f8..b652a08ea29be 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_prepare_emulated_anonymous.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_prepare_emulated_anonymous.phpt @@ -64,17 +64,18 @@ require __DIR__ . '/mysql_pdo_test.inc'; $db = MySQLPDOTest::factory(); $db->exec('DROP TABLE IF EXISTS test'); ?> ---EXPECT-- -array(1) { - [0]=> - array(2) { - ["id"]=> - string(1) "1" - ["label"]=> - string(1) "?" - } +--EXPECTF-- +Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in %s on line %d +[003] Execute has failed, 'HY093' array ( + 0 => 'HY093', + 1 => NULL, + 2 => NULL, +) +array(0) { } now the same with native PS + +Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number in %s on line %d [005] Execute has failed, 'HY093' array ( 0 => 'HY093', 1 => NULL, diff --git a/ext/pdo_mysql/tests/pdo_mysql_prepare_emulated_placeholder_everywhere.phpt b/ext/pdo_mysql/tests/pdo_mysql_prepare_emulated_placeholder_everywhere.phpt index e47b03b999af5..abd809539b72a 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_prepare_emulated_placeholder_everywhere.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_prepare_emulated_placeholder_everywhere.phpt @@ -72,8 +72,6 @@ array(0) { now the same with emulated PS Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in %s on line %d - -Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number in %s on line 33 [005] Execute has failed, 'HY093' array ( 0 => 'HY093', 1 => NULL, diff --git a/ext/pdo_mysql/tests/pdo_mysql_prepare_load_data.phpt b/ext/pdo_mysql/tests/pdo_mysql_prepare_load_data.phpt deleted file mode 100644 index 62214541d71fc..0000000000000 --- a/ext/pdo_mysql/tests/pdo_mysql_prepare_load_data.phpt +++ /dev/null @@ -1,129 +0,0 @@ ---TEST-- -MySQL PDO->prepare() and 1295 (ER_UNSUPPORTED_PS) ---SKIPIF-- -query('SELECT USER() as _user'); -$row = $stmt->fetch(PDO::FETCH_ASSOC); -$tmp = explode('@', $row['_user']); -if (count($tmp) < 2) - die("skip Cannot detect if test is run against local or remote database server"); -if (($tmp[1] !== 'localhost') && ($tmp[1] !== '127.0.0.1')) - die("skip Test cannot be run against remote database server"); - -$stmt = $db->query("SHOW VARIABLES LIKE 'secure_file_priv'"); -if (($row = $stmt->fetch(PDO::FETCH_ASSOC)) && ($row['value'] != '')) { - if (!is_writable($row['value'])) - die("skip secure_file_priv directory not writable: {$row['value']}"); - - $filename = $row['value'] . DIRECTORY_SEPARATOR . "pdo_mysql_exec_load_data.csv"; - - if (file_exists($filename) && !is_writable($filename)) - die("skip {$filename} not writable"); -} - -?> ---FILE-- -exec($sql); - if ($ret !== $exp) { - printf("[%03d] Expecting '%s'/%s got '%s'/%s when running '%s', [%s] %s\n", - $offset, $exp, gettype($exp), $ret, gettype($ret), $sql, - $db->errorCode(), implode(' ', $db->errorInfo())); - return false; - } - - } catch (PDOException $e) { - - if (42000 == $db->errorCode()) { - // Error: 1148 SQLSTATE: 42000 (ER_NOT_ALLOWED_COMMAND) - // Load data infile not allowed - return false; - } - - printf("[%03d] '%s' has failed, [%s] %s\n", - $offset, $sql, $db->errorCode(), implode(' ', $db->errorInfo())); - return false; - } - - return true; - } - - require_once(__DIR__ . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc'); - $db = MySQLPDOTest::factory(); - // Run with native PS. - // The test is about checking the fallback to emulation - $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, 0); - MySQLPDOTest::createTestTable($db, MySQLPDOTest::detect_transactional_mysql_engine($db)); - - /* affected rows related */ - try { - - exec_and_count(2, $db, 'DROP TABLE IF EXISTS test', 0); - exec_and_count(3, $db, sprintf('CREATE TABLE test(id INT NOT NULL PRIMARY KEY, col1 CHAR(10)) ENGINE=%s', PDO_MYSQL_TEST_ENGINE), 0); - - $stmt = $db->query("SHOW VARIABLES LIKE 'secure_file_priv'"); - if (($row = $stmt->fetch(PDO::FETCH_ASSOC)) && ($row['value'] != '')) { - $filename = $row['value'] . DIRECTORY_SEPARATOR . "pdo_mysql_exec_load_data.csv"; - } else { - $filename = MySQLPDOTest::getTempDir() . DIRECTORY_SEPARATOR . "pdo_mysql_exec_load_data.csv"; - } - - $fp = fopen($filename, "w"); - fwrite($fp, "1;foo\n"); - fwrite($fp, "2;bar"); - fclose($fp); - - // This should fail, the PS protocol should not support it. - // mysqlnd will give 2014 as a follow-up of the fallback logic - // libmysql will give a little more precise 2030 error code - // However, you get an error and the big question is what happens to the line - $stmt = $db->prepare(sprintf("LOAD DATA INFILE %s INTO TABLE test FIELDS TERMINATED BY ';' LINES TERMINATED BY '\n'", $db->quote($filename))); - if (!$stmt->execute()) { - printf("[004] [%d] %s\n", $stmt->errorCode(), var_export($stmt->errorInfo(), true)); - } - - // Check the line - $stmt = $db->query("SELECT 1 as 'one'"); - if ($stmt->errorCode() != '0000') { - printf("[005] [%d] %s\n", $stmt->errorCode(), var_export($stmt->errorInfo(), true)); - } else { - $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); - if (!isset($rows[0]['one']) || $rows[0]['one'] != 1) - printf("[006] [%d] %s\n", $stmt->errorCode(), var_export($stmt->errorInfo(), true)); - } - - unlink($filename); - - } catch (PDOException $e) { - printf("[001] %s, [%s] %s (%s)\n", - $e->getMessage(), - $db->errorCode(), - implode(' ', $db->errorInfo()), - (isset($stmt)) ? implode(' ', $stmt->errorInfo()) : 'N/A'); - } - - print "done!"; -?> ---CLEAN-- - ---EXPECTF-- -Warning: PDOStatement::execute(): SQLSTATE[HY000]: General error: %s in %s on line %d -[004] [0] array ( - 0 => 'HY000', - 1 => %d, - 2 => %s, -) -done! diff --git a/ext/pdo_mysql/tests/pdo_mysql_prepare_native_named_placeholder.phpt b/ext/pdo_mysql/tests/pdo_mysql_prepare_native_named_placeholder.phpt index 6b553375d630b..35658d5529469 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_prepare_native_named_placeholder.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_prepare_native_named_placeholder.phpt @@ -72,7 +72,8 @@ require __DIR__ . '/mysql_pdo_test.inc'; $db = MySQLPDOTest::factory(); $db->exec('DROP TABLE IF EXISTS test'); ?> ---EXPECT-- +--EXPECTF-- +Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number in %s on line %d [003] Execute has failed, 'HY093' array ( 0 => 'HY093', 1 => NULL, @@ -80,13 +81,13 @@ $db->exec('DROP TABLE IF EXISTS test'); ) array(0) { } -array(1) { - [0]=> - array(2) { - ["id"]=> - string(3) "101" - ["label"]=> - string(12) ":placeholder" - } + +Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in %s on line %d +[005] Execute has failed, 'HY093' array ( + 0 => 'HY093', + 1 => NULL, + 2 => NULL, +) +array(0) { } done! diff --git a/ext/pdo_mysql/tests/pdo_mysql_stmt_nextrowset.phpt b/ext/pdo_mysql/tests/pdo_mysql_stmt_nextrowset.phpt index eac4b9e4d80af..b528f865abc2a 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_stmt_nextrowset.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_stmt_nextrowset.phpt @@ -1,7 +1,5 @@ --TEST-- MySQL PDOStatement->nextRowSet() ---XFAIL-- -nextRowset() problem with stored proc & emulation mode & mysqlnd --SKIPIF-- nextRowSet()); var_dump($stmt->nextRowSet()); + echo "Skip fetchAll(): "; + unset($stmt); + $stmt = $db->query('CALL p()'); + var_dump($stmt->nextRowSet()); + $stmt->closeCursor(); } try { @@ -159,7 +162,10 @@ array(3) { string(1) "a" } } +array(0) { +} bool(false) +Skip fetchAll(): bool(true) array(1) { [0]=> array(1) { @@ -208,7 +214,10 @@ array(3) { string(1) "a" } } +array(0) { +} bool(false) +Skip fetchAll(): bool(true) Native PS... array(1) { [0]=> @@ -258,7 +267,10 @@ array(3) { string(1) "a" } } +array(0) { +} bool(false) +Skip fetchAll(): bool(true) array(1) { [0]=> array(1) { @@ -307,5 +319,8 @@ array(3) { string(1) "a" } } +array(0) { +} bool(false) +Skip fetchAll(): bool(true) done! diff --git a/ext/pdo_mysql/tests/pdo_mysql_stmt_variable_columncount.phpt b/ext/pdo_mysql/tests/pdo_mysql_stmt_variable_columncount.phpt index 1c492dfc061cc..110710dd118c6 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_stmt_variable_columncount.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_stmt_variable_columncount.phpt @@ -1,7 +1,5 @@ --TEST-- MySQL Prepared Statements and different column counts ---XFAIL-- -nextRowset() problem with stored proc & emulation mode & mysqlnd --SKIPIF-- fetch(PDO::FETCH_ASSOC); - } while ($stmt->nextRowSet()); + $row = $stmt->fetch(PDO::FETCH_ASSOC); + $stmt->nextRowSet(); if (!isset($row['one']) || ($row['one'] != 1)) { printf("[%03d + 1] Expecting array('one' => 1), got %s\n", $offset, var_export($row, true)); diff --git a/ext/pdo_oci/oci_driver.c b/ext/pdo_oci/oci_driver.c index 2c65fc973ba32..18faa538b9eff 100644 --- a/ext/pdo_oci/oci_driver.c +++ b/ext/pdo_oci/oci_driver.c @@ -238,13 +238,12 @@ static int oci_handle_closer(pdo_dbh_t *dbh) /* {{{ */ } /* }}} */ -static int oci_handle_preparer(pdo_dbh_t *dbh, const char *sql, size_t sql_len, pdo_stmt_t *stmt, zval *driver_options) /* {{{ */ +static int oci_handle_preparer(pdo_dbh_t *dbh, zend_string *sql, pdo_stmt_t *stmt, zval *driver_options) /* {{{ */ { pdo_oci_db_handle *H = (pdo_oci_db_handle *)dbh->driver_data; pdo_oci_stmt *S = ecalloc(1, sizeof(*S)); ub4 prefetch; - char *nsql = NULL; - size_t nsql_len = 0; + zend_string *nsql = NULL; int ret; #ifdef HAVE_OCISTMTFETCH2 @@ -257,12 +256,11 @@ static int oci_handle_preparer(pdo_dbh_t *dbh, const char *sql, size_t sql_len, S->H = H; stmt->supports_placeholders = PDO_PLACEHOLDER_NAMED; - ret = pdo_parse_params(stmt, (char*)sql, sql_len, &nsql, &nsql_len); + ret = pdo_parse_params(stmt, sql, &nsql); if (ret == 1) { /* query was re-written */ sql = nsql; - sql_len = nsql_len; } else if (ret == -1) { /* couldn't grok it */ strcpy(dbh->error_code, stmt->error_code); @@ -276,10 +274,10 @@ static int oci_handle_preparer(pdo_dbh_t *dbh, const char *sql, size_t sql_len, /* and our own private error handle */ OCIHandleAlloc(H->env, (dvoid*)&S->err, OCI_HTYPE_ERROR, 0, NULL); - if (sql_len) { - H->last_err = OCIStmtPrepare(S->stmt, H->err, (text*)sql, (ub4) sql_len, OCI_NTV_SYNTAX, OCI_DEFAULT); + if (ZSTR_LEN(sql) != 0) { + H->last_err = OCIStmtPrepare(S->stmt, H->err, (text*) ZSTR_VAL(sql), (ub4) ZSTR_LEN(sql), OCI_NTV_SYNTAX, OCI_DEFAULT); if (nsql) { - efree(nsql); + zend_string_release(nsql); nsql = NULL; } if (H->last_err) { @@ -304,7 +302,7 @@ static int oci_handle_preparer(pdo_dbh_t *dbh, const char *sql, size_t sql_len, stmt->driver_data = S; stmt->methods = &oci_stmt_methods; if (nsql) { - efree(nsql); + zend_string_release(nsql); nsql = NULL; } diff --git a/ext/pdo_odbc/odbc_driver.c b/ext/pdo_odbc/odbc_driver.c index 81e4915da56f1..123d86e2cf3ff 100644 --- a/ext/pdo_odbc/odbc_driver.c +++ b/ext/pdo_odbc/odbc_driver.c @@ -41,7 +41,7 @@ static int pdo_odbc_fetch_error_func(pdo_dbh_t *dbh, pdo_stmt_t *stmt, zval *inf message = strpprintf(0, "%s (%s[%ld] at %s:%d)", einfo->last_err_msg, - einfo->what, einfo->last_error, + einfo->what, (long) einfo->last_error, einfo->file, einfo->line); add_next_index_long(info, einfo->last_error); @@ -85,8 +85,8 @@ void pdo_odbc_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt, PDO_ODBC_HSTMT statement, eh = H->env; } - rc = SQLGetDiagRec(htype, eh, recno++, einfo->last_state, &einfo->last_error, - einfo->last_err_msg, sizeof(einfo->last_err_msg)-1, &errmsgsize); + rc = SQLGetDiagRec(htype, eh, recno++, (SQLCHAR *) einfo->last_state, &einfo->last_error, + (SQLCHAR *) einfo->last_err_msg, sizeof(einfo->last_err_msg)-1, &errmsgsize); if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) { errmsgsize = 0; @@ -110,8 +110,8 @@ void pdo_odbc_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt, PDO_ODBC_HSTMT statement, * diagnostic records (which can be generated by PRINT statements * in the query, for instance). */ while (rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO) { - char discard_state[6]; - char discard_buf[1024]; + SQLCHAR discard_state[6]; + SQLCHAR discard_buf[1024]; SQLINTEGER code; rc = SQLGetDiagRec(htype, eh, recno++, discard_state, &code, discard_buf, sizeof(discard_buf)-1, &errmsgsize); @@ -138,15 +138,14 @@ static int odbc_handle_closer(pdo_dbh_t *dbh) return 0; } -static int odbc_handle_preparer(pdo_dbh_t *dbh, const char *sql, size_t sql_len, pdo_stmt_t *stmt, zval *driver_options) +static int odbc_handle_preparer(pdo_dbh_t *dbh, zend_string *sql, pdo_stmt_t *stmt, zval *driver_options) { RETCODE rc; pdo_odbc_db_handle *H = (pdo_odbc_db_handle *)dbh->driver_data; pdo_odbc_stmt *S = ecalloc(1, sizeof(*S)); enum pdo_cursor_type cursor_type = PDO_CURSOR_FWDONLY; int ret; - char *nsql = NULL; - size_t nsql_len = 0; + zend_string *nsql = NULL; S->H = H; S->assume_utf8 = H->assume_utf8; @@ -154,7 +153,7 @@ static int odbc_handle_preparer(pdo_dbh_t *dbh, const char *sql, size_t sql_len, /* before we prepare, we need to peek at the query; if it uses named parameters, * we want PDO to rewrite them for us */ stmt->supports_placeholders = PDO_PLACEHOLDER_POSITIONAL; - ret = pdo_parse_params(stmt, (char*)sql, sql_len, &nsql, &nsql_len); + ret = pdo_parse_params(stmt, sql, &nsql); if (ret == 1) { /* query was re-written */ @@ -171,7 +170,7 @@ static int odbc_handle_preparer(pdo_dbh_t *dbh, const char *sql, size_t sql_len, if (rc == SQL_INVALID_HANDLE || rc == SQL_ERROR) { efree(S); if (nsql) { - efree(nsql); + zend_string_release(nsql); } pdo_odbc_drv_error("SQLAllocStmt"); return 0; @@ -186,15 +185,15 @@ static int odbc_handle_preparer(pdo_dbh_t *dbh, const char *sql, size_t sql_len, pdo_odbc_stmt_error("SQLSetStmtAttr: SQL_ATTR_CURSOR_SCROLLABLE"); SQLFreeHandle(SQL_HANDLE_STMT, S->stmt); if (nsql) { - efree(nsql); + zend_string_release(nsql); } return 0; } } - rc = SQLPrepare(S->stmt, (char*)sql, SQL_NTS); + rc = SQLPrepare(S->stmt, (SQLCHAR *) ZSTR_VAL(sql), SQL_NTS); if (nsql) { - efree(nsql); + zend_string_release(nsql); } stmt->methods = &odbc_stmt_methods; @@ -230,7 +229,7 @@ static zend_long odbc_handle_doer(pdo_dbh_t *dbh, const char *sql, size_t sql_le return -1; } - rc = SQLExecDirect(stmt, (char *)sql, sql_len); + rc = SQLExecDirect(stmt, (SQLCHAR *) sql, sql_len); if (rc == SQL_NO_DATA) { /* If SQLExecDirect executes a searched update or delete statement that @@ -442,7 +441,7 @@ static int pdo_odbc_handle_factory(pdo_dbh_t *dbh, zval *driver_options) /* {{{ } if (strchr(dbh->data_source, ';')) { - char dsnbuf[1024]; + SQLCHAR dsnbuf[1024]; SQLSMALLINT dsnbuflen; use_direct = 1; @@ -456,11 +455,11 @@ static int pdo_odbc_handle_factory(pdo_dbh_t *dbh, zval *driver_options) /* {{{ dbh->data_source = dsn; } - rc = SQLDriverConnect(H->dbc, NULL, (char*)dbh->data_source, strlen(dbh->data_source), + rc = SQLDriverConnect(H->dbc, NULL, (SQLCHAR *) dbh->data_source, strlen(dbh->data_source), dsnbuf, sizeof(dsnbuf)-1, &dsnbuflen, SQL_DRIVER_NOPROMPT); } if (!use_direct) { - rc = SQLConnect(H->dbc, (char*)dbh->data_source, SQL_NTS, dbh->username, SQL_NTS, dbh->password, SQL_NTS); + rc = SQLConnect(H->dbc, (SQLCHAR *) dbh->data_source, SQL_NTS, (SQLCHAR *) dbh->username, SQL_NTS, (SQLCHAR *) dbh->password, SQL_NTS); } if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) { diff --git a/ext/pdo_odbc/odbc_stmt.c b/ext/pdo_odbc/odbc_stmt.c index 6fd14a6f689c4..fdc427d5b00d4 100644 --- a/ext/pdo_odbc/odbc_stmt.c +++ b/ext/pdo_odbc/odbc_stmt.c @@ -567,7 +567,7 @@ static int odbc_stmt_describe(pdo_stmt_t *stmt, int colno) SQLULEN colsize; SQLLEN displaysize = 0; - rc = SQLDescribeCol(S->stmt, colno+1, S->cols[colno].colname, + rc = SQLDescribeCol(S->stmt, colno+1, (SQLCHAR *) S->cols[colno].colname, sizeof(S->cols[colno].colname)-1, &colnamelen, &S->cols[colno].coltype, &colsize, NULL, NULL); @@ -777,7 +777,7 @@ static int odbc_stmt_set_param(pdo_stmt_t *stmt, zend_long attr, zval *val) switch (attr) { case PDO_ATTR_CURSOR_NAME: convert_to_string(val); - rc = SQLSetCursorName(S->stmt, Z_STRVAL_P(val), Z_STRLEN_P(val)); + rc = SQLSetCursorName(S->stmt, (SQLCHAR *) Z_STRVAL_P(val), Z_STRLEN_P(val)); if (rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO) { return 1; @@ -806,7 +806,7 @@ static int odbc_stmt_get_attr(pdo_stmt_t *stmt, zend_long attr, zval *val) { char buf[256]; SQLSMALLINT len = 0; - rc = SQLGetCursorName(S->stmt, buf, sizeof(buf), &len); + rc = SQLGetCursorName(S->stmt, (SQLCHAR *) buf, sizeof(buf), &len); if (rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO) { ZVAL_STRINGL(val, buf, len); diff --git a/ext/pdo_odbc/tests/max_columns.phpt b/ext/pdo_odbc/tests/max_columns.phpt index 027ba2c4daae3..71748263201e9 100644 --- a/ext/pdo_odbc/tests/max_columns.phpt +++ b/ext/pdo_odbc/tests/max_columns.phpt @@ -3,6 +3,8 @@ PDO ODBC varying character with max/no length --SKIPIF-- --FILE-- errcode) { add_next_index_long(info, einfo->errcode); + } else { + add_next_index_null(info); + } + if (einfo->errmsg) { add_next_index_string(info, einfo->errmsg); } @@ -218,14 +222,13 @@ static int pgsql_handle_closer(pdo_dbh_t *dbh) /* {{{ */ } /* }}} */ -static int pgsql_handle_preparer(pdo_dbh_t *dbh, const char *sql, size_t sql_len, pdo_stmt_t *stmt, zval *driver_options) +static int pgsql_handle_preparer(pdo_dbh_t *dbh, zend_string *sql, pdo_stmt_t *stmt, zval *driver_options) { pdo_pgsql_db_handle *H = (pdo_pgsql_db_handle *)dbh->driver_data; pdo_pgsql_stmt *S = ecalloc(1, sizeof(pdo_pgsql_stmt)); int scrollable; int ret; - char *nsql = NULL; - size_t nsql_len = 0; + zend_string *nsql = NULL; int emulate = 0; int execute_only = 0; @@ -265,7 +268,7 @@ static int pgsql_handle_preparer(pdo_dbh_t *dbh, const char *sql, size_t sql_len stmt->named_rewrite_template = "$%d"; } - ret = pdo_parse_params(stmt, (char*)sql, sql_len, &nsql, &nsql_len); + ret = pdo_parse_params(stmt, sql, &nsql); if (ret == -1) { /* couldn't grok it */ @@ -275,7 +278,7 @@ static int pgsql_handle_preparer(pdo_dbh_t *dbh, const char *sql, size_t sql_len /* query was re-written */ S->query = nsql; } else { - S->query = estrdup(sql); + S->query = zend_string_copy(sql); } if (!emulate && !execute_only) { diff --git a/ext/pdo_pgsql/pgsql_statement.c b/ext/pdo_pgsql/pgsql_statement.c index 88031622a4384..89513fe9ccafa 100644 --- a/ext/pdo_pgsql/pgsql_statement.c +++ b/ext/pdo_pgsql/pgsql_statement.c @@ -100,7 +100,7 @@ static int pgsql_stmt_dtor(pdo_stmt_t *stmt) S->param_types = NULL; } if (S->query) { - efree(S->query); + zend_string_release(S->query); S->query = NULL; } @@ -151,7 +151,7 @@ static int pgsql_stmt_execute(pdo_stmt_t *stmt) efree(q); } - spprintf(&q, 0, "DECLARE %s SCROLL CURSOR WITH HOLD FOR %s", S->cursor_name, stmt->active_query_string); + spprintf(&q, 0, "DECLARE %s SCROLL CURSOR WITH HOLD FOR %s", S->cursor_name, ZSTR_VAL(stmt->active_query_string)); S->result = PQexec(H->server, q); efree(q); @@ -177,7 +177,7 @@ static int pgsql_stmt_execute(pdo_stmt_t *stmt) stmt_retry: /* we deferred the prepare until now, because we didn't * know anything about the parameter types; now we do */ - S->result = PQprepare(H->server, S->stmt_name, S->query, + S->result = PQprepare(H->server, S->stmt_name, ZSTR_VAL(S->query), stmt->bound_params ? zend_hash_num_elements(stmt->bound_params) : 0, S->param_types); status = PQresultStatus(S->result); @@ -222,7 +222,7 @@ static int pgsql_stmt_execute(pdo_stmt_t *stmt) 0); } else if (stmt->supports_placeholders == PDO_PLACEHOLDER_NAMED) { /* execute query with parameters */ - S->result = PQexecParams(H->server, S->query, + S->result = PQexecParams(H->server, ZSTR_VAL(S->query), stmt->bound_params ? zend_hash_num_elements(stmt->bound_params) : 0, S->param_types, (const char**)S->param_values, @@ -231,7 +231,7 @@ static int pgsql_stmt_execute(pdo_stmt_t *stmt) 0); } else { /* execute plain query (with embedded parameters) */ - S->result = PQexec(H->server, stmt->active_query_string); + S->result = PQexec(H->server, ZSTR_VAL(stmt->active_query_string)); } status = PQresultStatus(S->result); @@ -282,7 +282,7 @@ static int pgsql_stmt_param_hook(pdo_stmt_t *stmt, struct pdo_bound_param_data * ZEND_ATOL(param->paramno, namevar + 1); param->paramno--; } else { - pdo_raise_impl_error(stmt->dbh, stmt, "HY093", ZSTR_VAL(param->name)); + pdo_pgsql_error_stmt_msg(stmt, 0, "HY093", ZSTR_VAL(param->name)); return 0; } } @@ -294,7 +294,7 @@ static int pgsql_stmt_param_hook(pdo_stmt_t *stmt, struct pdo_bound_param_data * return 1; } if (!zend_hash_index_exists(stmt->bound_param_map, param->paramno)) { - pdo_raise_impl_error(stmt->dbh, stmt, "HY093", "parameter was not defined"); + pdo_pgsql_error_stmt_msg(stmt, 0, "HY093", "parameter was not defined"); return 0; } case PDO_PARAM_EVT_EXEC_POST: diff --git a/ext/pdo_pgsql/php_pdo_pgsql_int.h b/ext/pdo_pgsql/php_pdo_pgsql_int.h index 07dfa8ce27611..b00004cca7efe 100644 --- a/ext/pdo_pgsql/php_pdo_pgsql_int.h +++ b/ext/pdo_pgsql/php_pdo_pgsql_int.h @@ -60,7 +60,7 @@ typedef struct { pdo_pgsql_column *cols; char *cursor_name; char *stmt_name; - char *query; + zend_string *query; char **param_values; int *param_lengths; int *param_formats; @@ -79,7 +79,8 @@ extern int _pdo_pgsql_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt, int errcode, const #define pdo_pgsql_error(d,e,z) _pdo_pgsql_error(d, NULL, e, z, NULL, __FILE__, __LINE__) #define pdo_pgsql_error_msg(d,e,m) _pdo_pgsql_error(d, NULL, e, NULL, m, __FILE__, __LINE__) #define pdo_pgsql_error_stmt(s,e,z) _pdo_pgsql_error(s->dbh, s, e, z, NULL, __FILE__, __LINE__) -#define pdo_pgsql_error_stmt_msg(s,e,m) _pdo_pgsql_error(s->dbh, s, e, NULL, m, __FILE__, __LINE__) +#define pdo_pgsql_error_stmt_msg(stmt, e, sqlstate, msg) \ + _pdo_pgsql_error(stmt->dbh, stmt, e, sqlstate, msg, __FILE__, __LINE__) extern const struct pdo_stmt_methods pgsql_stmt_methods; diff --git a/ext/pdo_pgsql/tests/bug36727.phpt b/ext/pdo_pgsql/tests/bug36727.phpt index e6b5ab7f283dd..79102ef8bb35a 100644 --- a/ext/pdo_pgsql/tests/bug36727.phpt +++ b/ext/pdo_pgsql/tests/bug36727.phpt @@ -19,6 +19,6 @@ var_dump($stmt->bindValue(':test', 1, PDO::PARAM_INT)); echo "Done\n"; ?> --EXPECTF-- -Warning: PDOStatement::bindValue(): SQLSTATE[HY093]: Invalid parameter number: :test in %sbug36727.php on line %d +Warning: PDOStatement::bindValue(): SQLSTATE[HY093]: Invalid parameter number: :test in %s on line %d bool(false) Done diff --git a/ext/pdo_pgsql/tests/bug70313.phpt b/ext/pdo_pgsql/tests/bug70313.phpt index 07c7f68ab3274..e6f9e4593ef45 100644 --- a/ext/pdo_pgsql/tests/bug70313.phpt +++ b/ext/pdo_pgsql/tests/bug70313.phpt @@ -19,7 +19,7 @@ try { $stmt->execute([1]); } catch (PDOException $e) { - var_dump($e->getCode()); + echo $e->getMessage(), "\n"; } $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, true); @@ -28,10 +28,10 @@ try { $stmt->execute([1]); } catch (PDOException $e) { - var_dump($e->getCode()); + echo $e->getMessage(), "\n"; } ?> ---EXPECT-- -string(5) "42601" -string(5) "42601" +--EXPECTF-- +SQLSTATE[42601]: Syntax error: %A +SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens diff --git a/ext/pdo_pgsql/tests/bug71573.phpt b/ext/pdo_pgsql/tests/bug71573.phpt index 66562344ef347..e8d13ca84e8db 100644 --- a/ext/pdo_pgsql/tests/bug71573.phpt +++ b/ext/pdo_pgsql/tests/bug71573.phpt @@ -18,4 +18,4 @@ $statement->execute([ 'test', 'test', 'test' ]); ?> --EXPECTF-- -Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: parameter was not defined in %sbug71573.php on line %d +Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: parameter was not defined in %s on line %d diff --git a/ext/pdo_sqlite/sqlite_driver.c b/ext/pdo_sqlite/sqlite_driver.c index a8a96c7a131f6..fcf82c62bf132 100644 --- a/ext/pdo_sqlite/sqlite_driver.c +++ b/ext/pdo_sqlite/sqlite_driver.c @@ -175,7 +175,7 @@ static int sqlite_handle_closer(pdo_dbh_t *dbh) /* {{{ */ } /* }}} */ -static int sqlite_handle_preparer(pdo_dbh_t *dbh, const char *sql, size_t sql_len, pdo_stmt_t *stmt, zval *driver_options) +static int sqlite_handle_preparer(pdo_dbh_t *dbh, zend_string *sql, pdo_stmt_t *stmt, zval *driver_options) { pdo_sqlite_db_handle *H = (pdo_sqlite_db_handle *)dbh->driver_data; pdo_sqlite_stmt *S = ecalloc(1, sizeof(pdo_sqlite_stmt)); @@ -193,7 +193,7 @@ static int sqlite_handle_preparer(pdo_dbh_t *dbh, const char *sql, size_t sql_le return 0; } - i = sqlite3_prepare_v2(H->db, sql, sql_len, &S->stmt, &tail); + i = sqlite3_prepare_v2(H->db, ZSTR_VAL(sql), ZSTR_LEN(sql), &S->stmt, &tail); if (i == SQLITE_OK) { return 1; } diff --git a/ext/pdo_sqlite/sqlite_statement.c b/ext/pdo_sqlite/sqlite_statement.c index 64a90e0edea35..3769b1e049613 100644 --- a/ext/pdo_sqlite/sqlite_statement.c +++ b/ext/pdo_sqlite/sqlite_statement.c @@ -39,46 +39,6 @@ static int pdo_sqlite_stmt_dtor(pdo_stmt_t *stmt) return 1; } -/** - * Change the column count on the statement. - * - * Since PHP 7.2 sqlite3_prepare_v2 is used which auto recompile prepared statement on schema change. - * Instead of raise an error on schema change, the result set will change, and the statement's columns must be updated. - * - * See bug #78192 - */ -static void pdo_sqlite_stmt_set_column_count(pdo_stmt_t *stmt, int new_count) -{ - /* Columns not yet "described" */ - if (!stmt->columns) { - stmt->column_count = new_count; - - return; - } - - /* - * The column count has not changed : no need to reload columns description - * Note: Do not handle attribute name change, without column count change - */ - if (new_count == stmt->column_count) { - return; - } - - /* Free previous columns to force reload description */ - int i; - - for (i = 0; i < stmt->column_count; i++) { - if (stmt->columns[i].name) { - zend_string_release(stmt->columns[i].name); - stmt->columns[i].name = NULL; - } - } - - efree(stmt->columns); - stmt->columns = NULL; - stmt->column_count = new_count; -} - static int pdo_sqlite_stmt_execute(pdo_stmt_t *stmt) { pdo_sqlite_stmt *S = (pdo_sqlite_stmt*)stmt->driver_data; @@ -91,11 +51,11 @@ static int pdo_sqlite_stmt_execute(pdo_stmt_t *stmt) switch (sqlite3_step(S->stmt)) { case SQLITE_ROW: S->pre_fetched = 1; - pdo_sqlite_stmt_set_column_count(stmt, sqlite3_data_count(S->stmt)); + php_pdo_stmt_set_column_count(stmt, sqlite3_data_count(S->stmt)); return 1; case SQLITE_DONE: - pdo_sqlite_stmt_set_column_count(stmt, sqlite3_column_count(S->stmt)); + php_pdo_stmt_set_column_count(stmt, sqlite3_column_count(S->stmt)); stmt->row_count = sqlite3_changes(S->H->db); sqlite3_reset(S->stmt); S->done = 1; diff --git a/ext/phar/phar/pharcommand.inc b/ext/phar/phar/pharcommand.inc index 1fb41dbb6a75a..4cf84ee551d52 100644 --- a/ext/phar/phar/pharcommand.inc +++ b/ext/phar/phar/pharcommand.inc @@ -259,7 +259,7 @@ class PharCommand extends CLICommand self::error($msg); } } - $arg = $found; + return null; } return self::cli_arg_typ_file($arg); } diff --git a/ext/phar/tar.c b/ext/phar/tar.c index fb9cacfc73c4b..bae1a4bf7b51b 100644 --- a/ext/phar/tar.c +++ b/ext/phar/tar.c @@ -268,6 +268,15 @@ int phar_parse_tarfile(php_stream* fp, char *fname, size_t fname_len, char *alia memset(hdr->checksum, ' ', sizeof(hdr->checksum)); sum2 = phar_tar_checksum(buf, old?sizeof(old_tar_header):sizeof(tar_header)); + if (old && sum2 != sum1) { + uint32_t sum3 = phar_tar_checksum(buf, sizeof(tar_header)); + if (sum3 == sum1) { + /* apparently a broken tar which is in ustar format w/o setting the ustar marker */ + sum2 = sum3; + old = 0; + } + } + size = entry.uncompressed_filesize = entry.compressed_filesize = phar_tar_number(hdr->size, sizeof(hdr->size)); diff --git a/ext/phar/tests/bug73809.phpt b/ext/phar/tests/bug73809.phpt new file mode 100644 index 0000000000000..5356db8aaa071 --- /dev/null +++ b/ext/phar/tests/bug73809.phpt @@ -0,0 +1,30 @@ +--TEST-- +Bug #73809 (Phar Zip parse crash - mmap fail) +--SKIPIF-- + +--FILE-- +open(__DIR__ . '/73809.zip', ZipArchive::CREATE); +$zip->addFromString('73809.txt', 'yada yada'); +$zip->addFromString('.phar/signature.bin', str_repeat('*', 64 * 1024 + 1)); +$zip->setCompressionName('.phar/signature.bin', ZipArchive::CM_STORE); +var_dump($zip->close()); + +try { + $phar = new PharData(__DIR__ . '/73809.zip'); +} catch (Exception $ex) { + echo $ex->getMessage(), PHP_EOL; +} +?> +--CLEAN-- + +--EXPECTF-- +bool(true) +phar error: signatures larger than 64 KiB are not supported in zip-based phar "%s" diff --git a/ext/phar/tests/bug75102.phpt b/ext/phar/tests/bug75102.phpt new file mode 100644 index 0000000000000..9ed133c09d30b --- /dev/null +++ b/ext/phar/tests/bug75102.phpt @@ -0,0 +1,13 @@ +--TEST-- +Bug #75102 (`PharData` says invalid checksum for valid tar) +--SKIPIF-- + +--FILE-- +getPathName())); +?> +--EXPECT-- +string(9) "yada yada" diff --git a/ext/phar/tests/bug75102.tar b/ext/phar/tests/bug75102.tar new file mode 100644 index 0000000000000..532cc3299bdce Binary files /dev/null and b/ext/phar/tests/bug75102.tar differ diff --git a/ext/phar/tests/bug77322.phpt b/ext/phar/tests/bug77322.phpt new file mode 100644 index 0000000000000..b9e5ce4dba434 --- /dev/null +++ b/ext/phar/tests/bug77322.phpt @@ -0,0 +1,24 @@ +--TEST-- +Bug #77322 (PharData::addEmptyDir('/') Possible integer overflow) +--SKIPIF-- + +--FILE-- +addEmptyDir('/'); +var_dump($zip->count()); + +$tar = new PharData(__DIR__ . '/bug77322.tar'); +$tar->addEmptyDir('/'); +var_dump($tar->count()); +?> +--EXPECT-- +int(1) +int(1) +--CLEAN-- + diff --git a/ext/phar/util.c b/ext/phar/util.c index 6c084d84584da..b45251d14a71c 100644 --- a/ext/phar/util.c +++ b/ext/phar/util.c @@ -567,7 +567,7 @@ phar_entry_data *phar_get_or_create_entry_data(char *fname, size_t fname_len, ch } else { etemp.flags = etemp.old_flags = PHAR_ENT_PERM_DEF_FILE; } - if (is_dir) { + if (is_dir && path_len) { etemp.filename_len--; /* strip trailing / */ path_len--; } diff --git a/ext/phar/zip.c b/ext/phar/zip.c index 52a387bdbcb30..1d7c5b2217fd0 100644 --- a/ext/phar/zip.c +++ b/ext/phar/zip.c @@ -401,8 +401,13 @@ int phar_parse_zipfile(php_stream *fp, char *fname, size_t fname_len, char *alia char *sig; size_t sig_len; - php_stream_tell(fp); pefree(entry.filename, entry.is_persistent); + + if (entry.uncompressed_filesize > 0x10000) { + PHAR_ZIP_FAIL("signatures larger than 64 KiB are not supported"); + } + + php_stream_tell(fp); sigfile = php_stream_fopen_tmpfile(); if (!sigfile) { PHAR_ZIP_FAIL("couldn't open temporary file"); diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index 7adcfc506a996..dfa084caa5853 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -1432,6 +1432,10 @@ static void reflection_class_constant_factory(zend_string *name_str, zend_class_ static int get_parameter_default(zval *result, parameter_reference *param) { if (param->fptr->type == ZEND_INTERNAL_FUNCTION) { + if (param->fptr->common.fn_flags & ZEND_ACC_USER_ARG_INFO) { + /* We don't have a way to determine the default value for this case right now. */ + return FAILURE; + } return zend_get_default_from_internal_arg_info( result, (zend_internal_arg_info *) param->arg_info); } else { @@ -2302,10 +2306,10 @@ ZEND_METHOD(ReflectionParameter, __construct) /* nothing to do. don't set is_closure since is the invoke handler, not the closure itself */ } else if ((fptr = zend_hash_find_ptr(&ce->function_table, lcname)) == NULL) { + zend_throw_exception_ex(reflection_exception_ptr, 0, + "Method %s::%s() does not exist", ZSTR_VAL(ce->name), ZSTR_VAL(name)); zend_string_release(name); zend_string_release(lcname); - zend_throw_exception_ex(reflection_exception_ptr, 0, - "Method %s::%s() does not exist", ZSTR_VAL(ce->name), Z_STRVAL_P(method)); RETURN_THROWS(); } zend_string_release(name); @@ -2717,7 +2721,8 @@ ZEND_METHOD(ReflectionParameter, isDefaultValueAvailable) GET_REFLECTION_OBJECT_PTR(param); if (param->fptr->type == ZEND_INTERNAL_FUNCTION) { - RETURN_BOOL(((zend_internal_arg_info*) (param->arg_info))->default_value); + RETURN_BOOL(!(param->fptr->common.fn_flags & ZEND_ACC_USER_ARG_INFO) + && ((zend_internal_arg_info*) (param->arg_info))->default_value); } else { zval *default_value = get_default_from_recv((zend_op_array *)param->fptr, param->offset); RETURN_BOOL(default_value != NULL); @@ -5493,6 +5498,10 @@ ZEND_METHOD(ReflectionProperty, getAttributes) GET_REFLECTION_OBJECT_PTR(ref); + if (ref->prop == NULL) { + RETURN_EMPTY_ARRAY(); + } + reflect_attributes(INTERNAL_FUNCTION_PARAM_PASSTHRU, ref->prop->attributes, 0, ref->prop->ce, ZEND_ATTRIBUTE_TARGET_PROPERTY, ref->prop->ce->type == ZEND_USER_CLASS ? ref->prop->ce->info.user.filename : NULL); diff --git a/ext/reflection/tests/ReflectionParameter_ctor_cast.phpt b/ext/reflection/tests/ReflectionParameter_ctor_cast.phpt new file mode 100644 index 0000000000000..10f45647e6cb9 --- /dev/null +++ b/ext/reflection/tests/ReflectionParameter_ctor_cast.phpt @@ -0,0 +1,18 @@ +--TEST-- +Test method name string cast in ReflectionParameter ctor +--FILE-- +getMessage(), "\n"; +} + +?> +--EXPECT-- +Method A::method() does not exist diff --git a/ext/reflection/tests/bug80370.phpt b/ext/reflection/tests/bug80370.phpt new file mode 100644 index 0000000000000..41d01c2e7e38b --- /dev/null +++ b/ext/reflection/tests/bug80370.phpt @@ -0,0 +1,17 @@ +--TEST-- +Bug #80370: Segfault on ReflectionProperty::getAttributes of dynamic property +--FILE-- +bar = 42; + +$reflectionObject = new ReflectionObject($foobar); +$reflectionProperty = $reflectionObject->getProperty('bar'); +var_dump($reflectionProperty->getAttributes()); +--EXPECT-- +array(0) { +} diff --git a/ext/reflection/tests/default_value_internal_userland_arginfo.phpt b/ext/reflection/tests/default_value_internal_userland_arginfo.phpt index d2b0589cd1997..b55a9463791b0 100644 --- a/ext/reflection/tests/default_value_internal_userland_arginfo.phpt +++ b/ext/reflection/tests/default_value_internal_userland_arginfo.phpt @@ -6,6 +6,14 @@ $closure = function ($b = 0) {}; $ro = new ReflectionObject($closure); $rm = $ro->getMethod('__invoke'); echo $rm, "\n"; + +$rp = $rm->getParameters()[0]; +var_dump($rp->isDefaultValueAvailable()); +try { + var_dump($rp->getDefaultValue()); +} catch (ReflectionException $e) { + echo $e->getMessage(), "\n"; +} ?> --EXPECT-- Method [ public method __invoke ] { @@ -14,3 +22,6 @@ Method [ public method __invoke ] { Parameter #0 [ $b = ] } } + +bool(false) +Internal error: Failed to retrieve the default value diff --git a/ext/session/config.m4 b/ext/session/config.m4 index 7abc8813b72ae..da31bbde86cc9 100644 --- a/ext/session/config.m4 +++ b/ext/session/config.m4 @@ -31,7 +31,7 @@ if test "$PHP_MM" != "no"; then AC_MSG_ERROR(cannot find mm library) fi - if test "$enable_zts" = "yes"; then + if test "$PHP_THREAD_SAFETY" = "yes"; then dnl The mm library is not thread-safe, and mod_mm.c refuses to compile. AC_MSG_ERROR(--with-mm cannot be combined with --enable-zts) fi diff --git a/ext/sockets/sendrecvmsg.c b/ext/sockets/sendrecvmsg.c index f7b0b8bf51e64..e5dbc52fb1e5b 100644 --- a/ext/sockets/sendrecvmsg.c +++ b/ext/sockets/sendrecvmsg.c @@ -295,8 +295,9 @@ PHP_FUNCTION(socket_cmsg_space) } if (entry->var_el_size > 0) { - size_t rem_size = ZEND_LONG_MAX - entry->size; - size_t n_max = rem_size / entry->var_el_size; + /* Leading underscore to avoid symbol collision on AIX. */ + size_t _rem_size = ZEND_LONG_MAX - entry->size; + size_t n_max = _rem_size / entry->var_el_size; size_t size = entry->size + n * entry->var_el_size; size_t total_size = CMSG_SPACE(size); if (n > n_max /* zend_long overflow */ diff --git a/ext/sockets/tests/mcast_ipv4_recv.phpt b/ext/sockets/tests/mcast_ipv4_recv.phpt index fded01e2e8fa9..35a5ec7c5aec4 100644 --- a/ext/sockets/tests/mcast_ipv4_recv.phpt +++ b/ext/sockets/tests/mcast_ipv4_recv.phpt @@ -7,7 +7,7 @@ if (!extension_loaded('sockets')) { } if (getenv('SKIP_ONLINE_TESTS')) die('skip online test'); $s = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); -$br = socket_bind($s, '0.0.0.0', 3000); +$br = socket_bind($s, '0.0.0.0', 0); $so = @socket_set_option($s, IPPROTO_IP, MCAST_JOIN_GROUP, array( "group" => '224.0.0.23', "interface" => 'lo', @@ -39,7 +39,8 @@ var_dump($br); echo "creating receive socket\n"; $s = socket_create($domain, SOCK_DGRAM, SOL_UDP); var_dump($s); -$br = socket_bind($s, '0.0.0.0', 3000); +$br = socket_bind($s, '0.0.0.0', 0); +socket_getsockname($s, $unused, $port); var_dump($br); $so = socket_set_option($s, $level, MCAST_JOIN_GROUP, array( @@ -48,7 +49,7 @@ $so = socket_set_option($s, $level, MCAST_JOIN_GROUP, array( )); var_dump($so); -$r = socket_sendto($sends1, $m = "initial packet", strlen($m), 0, $mcastaddr, 3000); +$r = socket_sendto($sends1, $m = "initial packet", strlen($m), 0, $mcastaddr, $port); var_dump($r); $i = 0; @@ -64,9 +65,9 @@ if ($i == 1) { "interface" => $interface, )); var_dump($so); - $r = socket_sendto($sends1, $m = "ignored mcast packet", strlen($m), 0, $mcastaddr, 3000); + $r = socket_sendto($sends1, $m = "ignored mcast packet", strlen($m), 0, $mcastaddr, $port); var_dump($r); - $r = socket_sendto($sends1, $m = "unicast packet", strlen($m), 0, "127.0.0.1", 3000); + $r = socket_sendto($sends1, $m = "unicast packet", strlen($m), 0, "127.0.0.1", $port); var_dump($r); } if ($i == 2) { @@ -76,9 +77,9 @@ if ($i == 2) { "interface" => $interface, )); var_dump($so); - $r = socket_sendto($sends2, $m = "ignored mcast packet (different interface)", strlen($m), 0, $mcastaddr, 3000); + $r = socket_sendto($sends2, $m = "ignored mcast packet (different interface)", strlen($m), 0, $mcastaddr, $port); var_dump($r); - $r = socket_sendto($sends1, $m = "mcast packet", strlen($m), 0, $mcastaddr, 3000); + $r = socket_sendto($sends1, $m = "mcast packet", strlen($m), 0, $mcastaddr, $port); var_dump($r); } if ($i == 3) { @@ -89,9 +90,9 @@ if ($i == 3) { "source" => $sblock, )); var_dump($so); - $r = socket_sendto($sends1, $m = "ignored packet (blocked source)", strlen($m), 0, $mcastaddr, 3000); + $r = socket_sendto($sends1, $m = "ignored packet (blocked source)", strlen($m), 0, $mcastaddr, $port); var_dump($r); - $r = socket_sendto($sends1, $m = "unicast packet", strlen($m), 0, "127.0.0.1", 3000); + $r = socket_sendto($sends1, $m = "unicast packet", strlen($m), 0, "127.0.0.1", $port); var_dump($r); } if ($i == 4) { @@ -102,7 +103,7 @@ if ($i == 4) { "source" => $sblock, )); var_dump($so); - $r = socket_sendto($sends1, $m = "mcast packet from 127.0.0.1", strlen($m), 0, $mcastaddr, 3000); + $r = socket_sendto($sends1, $m = "mcast packet from 127.0.0.1", strlen($m), 0, $mcastaddr, $port); var_dump($r); } if ($i == 5) { @@ -112,9 +113,9 @@ if ($i == 5) { "interface" => $interface, )); var_dump($so); - $r = socket_sendto($sends1, $m = "ignored mcast packet", strlen($m), 0, $mcastaddr, 3000); + $r = socket_sendto($sends1, $m = "ignored mcast packet", strlen($m), 0, $mcastaddr, $port); var_dump($r); - $r = socket_sendto($sends1, $m = "unicast packet", strlen($m), 0, "127.0.0.1", 3000); + $r = socket_sendto($sends1, $m = "unicast packet", strlen($m), 0, "127.0.0.1", $port); var_dump($r); } if ($i == 6) { @@ -125,7 +126,7 @@ if ($i == 6) { "source" => $sblock, )); var_dump($so); - $r = socket_sendto($sends1, $m = "mcast packet from 127.0.0.1", strlen($m), 0, $mcastaddr, 3000); + $r = socket_sendto($sends1, $m = "mcast packet from 127.0.0.1", strlen($m), 0, $mcastaddr, $port); var_dump($r); } if ($i == 7) { @@ -136,9 +137,9 @@ if ($i == 7) { "source" => $sblock, )); var_dump($so); - $r = socket_sendto($sends1, $m = "ignored mcast packet", strlen($m), 0, $mcastaddr, 3000); + $r = socket_sendto($sends1, $m = "ignored mcast packet", strlen($m), 0, $mcastaddr, $port); var_dump($r); - $r = socket_sendto($sends1, $m = "unicast packet", strlen($m), 0, "127.0.0.1", 3000); + $r = socket_sendto($sends1, $m = "unicast packet", strlen($m), 0, "127.0.0.1", $port); var_dump($r); } if ($i == 8) { diff --git a/ext/sockets/tests/mcast_ipv6_recv.phpt b/ext/sockets/tests/mcast_ipv6_recv.phpt index 127e9d17cfa42..f487480270f15 100644 --- a/ext/sockets/tests/mcast_ipv6_recv.phpt +++ b/ext/sockets/tests/mcast_ipv6_recv.phpt @@ -12,7 +12,8 @@ $s = socket_create(AF_INET6, SOCK_DGRAM, SOL_UDP); if ($s === false) { die("skip unable to create socket"); } -$br = socket_bind($s, '::', 3000); +$br = socket_bind($s, '::', 0); +socket_getsockname($s, $unused, $port); /* On Linux, there is no route ff00::/8 by default on lo, which makes it * troublesome to send multicast traffic from lo, which we must since * we're dealing with interface-local traffic... */ @@ -23,7 +24,7 @@ $so = @socket_set_option($s, IPPROTO_IPV6, MCAST_JOIN_GROUP, array( if ($so === false) { die('skip unable to join multicast group on any interface.'); } -$r = socket_sendto($s, $m = "testing packet", strlen($m), 0, 'ff01::114', 3000); +$r = socket_sendto($s, $m = "testing packet", strlen($m), 0, 'ff01::114', $port); if ($r === false) { die('skip unable to send multicast packet.'); } @@ -59,8 +60,9 @@ var_dump($sends1); echo "creating receive socket\n"; $s = socket_create($domain, SOCK_DGRAM, SOL_UDP) or die("err"); var_dump($s); -$br = socket_bind($s, '::0', 3000) or die("err"); +$br = socket_bind($s, '::0', 0) or die("err"); var_dump($br); +socket_getsockname($s, $unused, $port); $so = socket_set_option($s, $level, MCAST_JOIN_GROUP, array( "group" => $mcastaddr, @@ -68,14 +70,14 @@ $so = socket_set_option($s, $level, MCAST_JOIN_GROUP, array( )) or die("err"); var_dump($so); -$r = socket_sendto($sends1, $m = "testing packet", strlen($m), 0, $mcastaddr, 3000); +$r = socket_sendto($sends1, $m = "testing packet", strlen($m), 0, $mcastaddr, $port); var_dump($r); checktimeout($s, 500); $r = socket_recvfrom($s, $str, 2000, 0, $from, $fromPort); var_dump($r, $str, $from); $sblock = $from; -$r = socket_sendto($sends1, $m = "initial packet", strlen($m), 0, $mcastaddr, 3000); +$r = socket_sendto($sends1, $m = "initial packet", strlen($m), 0, $mcastaddr, $port); var_dump($r); $i = 0; @@ -91,9 +93,9 @@ if ($i == 1) { "interface" => $interface, )); var_dump($so); - $r = socket_sendto($sends1, $m = "ignored mcast packet", strlen($m), 0, $mcastaddr, 3000); + $r = socket_sendto($sends1, $m = "ignored mcast packet", strlen($m), 0, $mcastaddr, $port); var_dump($r); - $r = socket_sendto($sends1, $m = "unicast packet", strlen($m), 0, "::1", 3000); + $r = socket_sendto($sends1, $m = "unicast packet", strlen($m), 0, "::1", $port); var_dump($r); } if ($i == 2) { @@ -103,7 +105,7 @@ if ($i == 2) { "interface" => $interface, )); var_dump($so); - $r = socket_sendto($sends1, $m = "mcast packet", strlen($m), 0, $mcastaddr, 3000); + $r = socket_sendto($sends1, $m = "mcast packet", strlen($m), 0, $mcastaddr, $port); var_dump($r); } if ($i == 3) { @@ -114,9 +116,9 @@ if ($i == 3) { "source" => $sblock, )); var_dump($so); - $r = socket_sendto($sends1, $m = "ignored packet (blocked source)", strlen($m), 0, $mcastaddr, 3000); + $r = socket_sendto($sends1, $m = "ignored packet (blocked source)", strlen($m), 0, $mcastaddr, $port); var_dump($r); - $r = socket_sendto($sends1, $m = "unicast packet", strlen($m), 0, "::1", 3000); + $r = socket_sendto($sends1, $m = "unicast packet", strlen($m), 0, "::1", $port); var_dump($r); } if ($i == 4) { @@ -127,7 +129,7 @@ if ($i == 4) { "source" => $sblock, )); var_dump($so); - $r = socket_sendto($sends1, $m = "mcast packet", strlen($m), 0, $mcastaddr, 3000); + $r = socket_sendto($sends1, $m = "mcast packet", strlen($m), 0, $mcastaddr, $port); var_dump($r); } if ($i == 5) { @@ -137,9 +139,9 @@ if ($i == 5) { "interface" => $interface, )); var_dump($so); - $r = socket_sendto($sends1, $m = "ignored mcast packet", strlen($m), 0, $mcastaddr, 3000); + $r = socket_sendto($sends1, $m = "ignored mcast packet", strlen($m), 0, $mcastaddr, $port); var_dump($r); - $r = socket_sendto($sends1, $m = "unicast packet", strlen($m), 0, "::1", 3000); + $r = socket_sendto($sends1, $m = "unicast packet", strlen($m), 0, "::1", $port); var_dump($r); } if ($i == 6) { @@ -150,7 +152,7 @@ if ($i == 6) { "source" => $sblock, )); var_dump($so); - $r = socket_sendto($sends1, $m = "mcast packet from desired source", strlen($m), 0, $mcastaddr, 3000); + $r = socket_sendto($sends1, $m = "mcast packet from desired source", strlen($m), 0, $mcastaddr, $port); var_dump($r); } if ($i == 7) { @@ -161,9 +163,9 @@ if ($i == 7) { "source" => $sblock, )); var_dump($so); - $r = socket_sendto($sends1, $m = "ignored mcast packet", strlen($m), 0, $mcastaddr, 3000); + $r = socket_sendto($sends1, $m = "ignored mcast packet", strlen($m), 0, $mcastaddr, $port); var_dump($r); - $r = socket_sendto($sends1, $m = "unicast packet", strlen($m), 0, "::1", 3000); + $r = socket_sendto($sends1, $m = "unicast packet", strlen($m), 0, "::1", $port); var_dump($r); } if ($i == 8) { diff --git a/ext/sockets/tests/socket_clear_error-win32.phpt b/ext/sockets/tests/socket_clear_error-win32.phpt index c875cfd2e80fa..901510c4f6808 100644 --- a/ext/sockets/tests/socket_clear_error-win32.phpt +++ b/ext/sockets/tests/socket_clear_error-win32.phpt @@ -26,7 +26,6 @@ unset($socket); unset($socketConn); ?> --EXPECTF-- -Warning: socket_connect(): unable to connect [%d]: No connection could be made because the target machine actively refused it. - in %s on line %d +Warning: socket_connect(): unable to connect [%d]: No connection could be made because the target machine actively refused it in %s on line %d int(%d) int(%d) diff --git a/ext/sockets/tests/socket_export_stream-4-win.phpt b/ext/sockets/tests/socket_export_stream-4-win.phpt index fddd459a7df8a..4a35394699e54 100644 --- a/ext/sockets/tests/socket_export_stream-4-win.phpt +++ b/ext/sockets/tests/socket_export_stream-4-win.phpt @@ -94,12 +94,10 @@ close stream stream_set_blocking TypeError: stream_set_blocking(): supplied resource is not a valid stream resource socket_set_block -Warning: socket_set_block(): unable to set blocking mode [%d]: An operation was attempted on something that is not a socket. - in %s on line %d +Warning: socket_set_block(): unable to set blocking mode [%d]: An operation was attempted on something that is not a socket in %s on line %d socket_get_option -Warning: socket_get_option(): Unable to retrieve socket option [%d]: An operation was attempted on something that is not a socket. - in %s on line %d +Warning: socket_get_option(): Unable to retrieve socket option [%d]: An operation was attempted on something that is not a socket in %s on line %d diff --git a/ext/sockets/tests/socket_import_stream-4-win.phpt b/ext/sockets/tests/socket_import_stream-4-win.phpt index 94af0ab5c1b9f..3b0386246e1e9 100644 --- a/ext/sockets/tests/socket_import_stream-4-win.phpt +++ b/ext/sockets/tests/socket_import_stream-4-win.phpt @@ -89,12 +89,10 @@ close stream stream_set_blocking TypeError: stream_set_blocking(): supplied resource is not a valid stream resource socket_set_block -Warning: socket_set_block(): unable to set blocking mode [10038]: %s - in %ssocket_import_stream-4-win.php on line %d +Warning: socket_set_block(): unable to set blocking mode [10038]: %s in %ssocket_import_stream-4-win.php on line %d socket_get_option -Warning: socket_get_option(): Unable to retrieve socket option [10038]: %s - in %ssocket_import_stream-4-win.php on line %d +Warning: socket_get_option(): Unable to retrieve socket option [10038]: %s in %ssocket_import_stream-4-win.php on line %d diff --git a/ext/sockets/tests/socket_sentto_recvfrom_ipv6_udp-win32.phpt b/ext/sockets/tests/socket_sentto_recvfrom_ipv6_udp-win32.phpt index 9a686539daa16..813cb94b11815 100644 --- a/ext/sockets/tests/socket_sentto_recvfrom_ipv6_udp-win32.phpt +++ b/ext/sockets/tests/socket_sentto_recvfrom_ipv6_udp-win32.phpt @@ -46,8 +46,7 @@ require 'ipv6_skipif.inc'; socket_close($socket); ?> --EXPECTF-- -Warning: socket_recvfrom(): unable to recvfrom [10022]: %s - in %s on line %d +Warning: socket_recvfrom(): unable to recvfrom [10022]: %s in %s on line %d Received Ping! from remote address ::1 and remote port 1223 --CREDITS-- Falko Menge diff --git a/ext/sockets/tests/socket_shutdown-win32.phpt b/ext/sockets/tests/socket_shutdown-win32.phpt index cc16c3a215871..cc11b6176dc77 100644 --- a/ext/sockets/tests/socket_shutdown-win32.phpt +++ b/ext/sockets/tests/socket_shutdown-win32.phpt @@ -50,10 +50,8 @@ bool(true) bool(true) bool(true) -Warning: socket_shutdown(): Unable to shutdown socket [%d]: A request to send or receive data was disallowed because the socket is not connected and (when sending on a datagram socket using a sendto call) no address was supplied. - in %s on line %d +Warning: socket_shutdown(): Unable to shutdown socket [%d]: A request to send or receive data was disallowed because the socket is not connected and (when sending on a datagram socket using a sendto call) no address was supplied in %s on line %d bool(false) -Warning: socket_shutdown(): Unable to shutdown socket [%d]: An invalid argument was supplied. - in %s on line %d +Warning: socket_shutdown(): Unable to shutdown socket [%d]: An invalid argument was supplied in %s on line %d bool(false) diff --git a/ext/sockets/tests/wsaprotocol_info_0.phpt b/ext/sockets/tests/wsaprotocol_info_0.phpt index 2d189d55bcd77..a932c516461f9 100644 --- a/ext/sockets/tests/wsaprotocol_info_0.phpt +++ b/ext/sockets/tests/wsaprotocol_info_0.phpt @@ -57,7 +57,6 @@ object(Socket)#%d (0) { object(Socket)#%d (0) { } -Warning: socket_wsaprotocol_info_export(): Unable to export WSA protocol info [0x00002726]: %s - in %s on line %d +Warning: socket_wsaprotocol_info_export(): Unable to export WSA protocol info [0x00002726]: %s in %s on line %d Warning: socket_wsaprotocol_info_import(): Unable to open file mapping [0x00000002] in %s on line %d diff --git a/ext/spl/php_spl.c b/ext/spl/php_spl.c index 09c876b45f7b4..8afdb833e78cc 100644 --- a/ext/spl/php_spl.c +++ b/ext/spl/php_spl.c @@ -604,17 +604,15 @@ PHP_FUNCTION(spl_autoload_functions) if (SPL_G(autoload_functions)) { ZEND_HASH_FOREACH_PTR(SPL_G(autoload_functions), alfi) { if (alfi->closure) { - zval obj_zv; - ZVAL_OBJ_COPY(&obj_zv, alfi->closure); - add_next_index_zval(return_value, &obj_zv); + GC_ADDREF(alfi->closure); + add_next_index_object(return_value, alfi->closure); } else if (alfi->func_ptr->common.scope) { zval tmp; array_init(&tmp); if (alfi->obj) { - zval obj_zv; - ZVAL_OBJ_COPY(&obj_zv, alfi->obj); - add_next_index_zval(&tmp, &obj_zv); + GC_ADDREF(alfi->obj); + add_next_index_object(&tmp, alfi->obj); } else { add_next_index_str(&tmp, zend_string_copy(alfi->ce->name)); } diff --git a/ext/spl/spl_directory.c b/ext/spl/spl_directory.c index 3d0dae243502b..7d9ea9cc2bfaa 100644 --- a/ext/spl/spl_directory.c +++ b/ext/spl/spl_directory.c @@ -2727,7 +2727,7 @@ PHP_METHOD(SplFileObject, ftruncate) PHP_METHOD(SplFileObject, seek) { spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS); - zend_long line_pos; + zend_long line_pos, i; if (zend_parse_parameters(ZEND_NUM_ARGS(), "l", &line_pos) == FAILURE) { RETURN_THROWS(); @@ -2742,11 +2742,15 @@ PHP_METHOD(SplFileObject, seek) spl_filesystem_file_rewind(ZEND_THIS, intern); - while(intern->u.file.current_line_num < line_pos) { + for (i = 0; i < line_pos; i++) { if (spl_filesystem_file_read_line(ZEND_THIS, intern, 1) == FAILURE) { - break; + return; } } + if (line_pos > 0) { + intern->u.file.current_line_num++; + spl_filesystem_file_free_line(intern); + } } /* }}} */ /* {{{ PHP_MINIT_FUNCTION(spl_directory) */ diff --git a/ext/spl/tests/SplFileObject_key_error001.phpt b/ext/spl/tests/SplFileObject_key_error001.phpt index b0834f00290ae..0c21d0b905e95 100644 --- a/ext/spl/tests/SplFileObject_key_error001.phpt +++ b/ext/spl/tests/SplFileObject_key_error001.phpt @@ -12,11 +12,11 @@ Erwin Poeze //line 5 $s = new SplFileObject(__FILE__); -$s->seek(12); +$s->seek(13); $s->next(); var_dump($s->key()); var_dump($s->valid()); ?> --EXPECT-- -int(13) +int(14) bool(false) diff --git a/ext/spl/tests/SplFileObject_next_variation002.phpt b/ext/spl/tests/SplFileObject_next_variation002.phpt index d48ff8c22371c..e4903dce0cd23 100644 --- a/ext/spl/tests/SplFileObject_next_variation002.phpt +++ b/ext/spl/tests/SplFileObject_next_variation002.phpt @@ -26,5 +26,5 @@ echo $s->current(); --EXPECT-- //line 3 //line 4 -//line 3 //line 4 +//line 5 diff --git a/ext/spl/tests/bug46569.csv b/ext/spl/tests/bug46569.csv new file mode 100644 index 0000000000000..f456a03b78515 --- /dev/null +++ b/ext/spl/tests/bug46569.csv @@ -0,0 +1,5 @@ +first,line +second,line +third,line +fourth,line +fifth,line diff --git a/ext/spl/tests/bug46569.phpt b/ext/spl/tests/bug46569.phpt new file mode 100644 index 0000000000000..0c1ab6ce1427e --- /dev/null +++ b/ext/spl/tests/bug46569.phpt @@ -0,0 +1,14 @@ +--TEST-- +Bug #46569 (SplFileObject: fgetcsv after seek returns wrong line) +--FILE-- +seek(1); +print_r($file->fgetcsv()); +?> +--EXPECT-- +Array +( + [0] => second + [1] => line +) diff --git a/ext/spl/tests/bug62004.phpt b/ext/spl/tests/bug62004.phpt new file mode 100644 index 0000000000000..4a06738594a3b --- /dev/null +++ b/ext/spl/tests/bug62004.phpt @@ -0,0 +1,17 @@ +--TEST-- +Bug #62004 (SplFileObject: fgets after seek returns wrong line) +--FILE-- +setFlags(SplFileObject::SKIP_EMPTY); +$f->seek(0); +echo $f->fgets(); +$f->seek(1); +echo $f->fgets(); +$f->seek(2); +echo $f->fgets(); +?> +--EXPECT-- +Line 1 +Line 2 +Line 3 diff --git a/ext/spl/tests/bug62004.txt b/ext/spl/tests/bug62004.txt new file mode 100644 index 0000000000000..e5791419fa06d --- /dev/null +++ b/ext/spl/tests/bug62004.txt @@ -0,0 +1,4 @@ +Line 1 +Line 2 +Line 3 +Line 4 diff --git a/ext/spl/tests/fileobject_getcurrentline_basic.phpt b/ext/spl/tests/fileobject_getcurrentline_basic.phpt index 607fce6640a3d..47f6e28dd8b40 100644 --- a/ext/spl/tests/fileobject_getcurrentline_basic.phpt +++ b/ext/spl/tests/fileobject_getcurrentline_basic.phpt @@ -15,5 +15,5 @@ echo $s->getCurrentLine(); echo $s->getCurrentLine(); ?> --EXPECT-- +//line 2 //line 3 -//line 4 diff --git a/ext/standard/array.c b/ext/standard/array.c index 3a50e771007c1..c809e5b570371 100644 --- a/ext/standard/array.c +++ b/ext/standard/array.c @@ -1526,11 +1526,10 @@ static inline void php_search_array(INTERNAL_FUNCTION_PARAMETERS, int behavior) RETURN_TRUE; } else { if (str_idx) { - RETVAL_STR_COPY(str_idx); + RETURN_STR_COPY(str_idx); } else { - RETVAL_LONG(num_idx); + RETURN_LONG(num_idx); } - return; } } } ZEND_HASH_FOREACH_END(); @@ -1542,11 +1541,10 @@ static inline void php_search_array(INTERNAL_FUNCTION_PARAMETERS, int behavior) RETURN_TRUE; } else { if (str_idx) { - RETVAL_STR_COPY(str_idx); + RETURN_STR_COPY(str_idx); } else { - RETVAL_LONG(num_idx); + RETURN_LONG(num_idx); } - return; } } } ZEND_HASH_FOREACH_END(); @@ -1559,11 +1557,10 @@ static inline void php_search_array(INTERNAL_FUNCTION_PARAMETERS, int behavior) RETURN_TRUE; } else { if (str_idx) { - RETVAL_STR_COPY(str_idx); + RETURN_STR_COPY(str_idx); } else { - RETVAL_LONG(num_idx); + RETURN_LONG(num_idx); } - return; } } } ZEND_HASH_FOREACH_END(); @@ -1574,11 +1571,10 @@ static inline void php_search_array(INTERNAL_FUNCTION_PARAMETERS, int behavior) RETURN_TRUE; } else { if (str_idx) { - RETVAL_STR_COPY(str_idx); + RETURN_STR_COPY(str_idx); } else { - RETVAL_LONG(num_idx); + RETURN_LONG(num_idx); } - return; } } } ZEND_HASH_FOREACH_END(); @@ -1589,11 +1585,10 @@ static inline void php_search_array(INTERNAL_FUNCTION_PARAMETERS, int behavior) RETURN_TRUE; } else { if (str_idx) { - RETVAL_STR_COPY(str_idx); + RETURN_STR_COPY(str_idx); } else { - RETVAL_LONG(num_idx); + RETURN_LONG(num_idx); } - return; } } } ZEND_HASH_FOREACH_END(); @@ -2735,7 +2730,7 @@ PHP_FUNCTION(range) high = (unsigned char)Z_STRVAL_P(zhigh)[0]; if (low > high) { /* Negative Steps */ - if (lstep <= 0) { + if (low - high < lstep || lstep <= 0) { err = 1; goto err; } @@ -2752,7 +2747,7 @@ PHP_FUNCTION(range) } } ZEND_HASH_FILL_END(); } else if (high > low) { /* Positive Steps */ - if (lstep <= 0) { + if (high - low < lstep || lstep <= 0) { err = 1; goto err; } diff --git a/ext/standard/config.m4 b/ext/standard/config.m4 index 301540db58d24..d04add96298e9 100644 --- a/ext/standard/config.m4 +++ b/ext/standard/config.m4 @@ -390,34 +390,13 @@ dnl Check for argon2 dnl PHP_ARG_WITH([password-argon2], [for Argon2 support], - [AS_HELP_STRING([[--with-password-argon2[=DIR]]], - [Include Argon2 support in password_*. DIR is the Argon2 shared library - path])]) + [AS_HELP_STRING([[--with-password-argon2]], + [Include Argon2 support in password_*])]) if test "$PHP_PASSWORD_ARGON2" != "no"; then - AC_MSG_CHECKING([for Argon2 library]) - for i in $PHP_PASSWORD_ARGON2 /usr /usr/local ; do - if test -r $i/include/argon2.h; then - ARGON2_DIR=$i; - AC_MSG_RESULT(found in $i) - break - fi - done - - if test -z "$ARGON2_DIR"; then - AC_MSG_RESULT([not found]) - AC_MSG_ERROR([Please ensure the argon2 header and library are installed]) - fi - - PHP_ADD_LIBRARY_WITH_PATH(argon2, $ARGON2_DIR/$PHP_LIBDIR) - PHP_ADD_INCLUDE($ARGON2_DIR/include) - - AC_CHECK_LIB(argon2, argon2id_hash_raw, [ - LIBS="$LIBS -largon2" - AC_DEFINE(HAVE_ARGON2LIB, 1, [ Define to 1 if you have the header file ]) - ], [ - AC_MSG_ERROR([Problem with libargon2.(a|so). Please verify that Argon2 header and libraries >= 20161029 are installed]) - ]) + PKG_CHECK_MODULES([ARGON2], [libargon2]) + PHP_EVAL_INCLINE($ARGON2_CFLAGS) + PHP_EVAL_LIBLINE($ARGON2_LIBS) fi dnl diff --git a/ext/standard/crc32_x86.c b/ext/standard/crc32_x86.c index 296eadeb9490b..eec023264002f 100644 --- a/ext/standard/crc32_x86.c +++ b/ext/standard/crc32_x86.c @@ -339,7 +339,7 @@ size_t crc32_x86_simd_update(X86_CRC32_TYPE type, uint32_t *crc, const unsigned /* {{{ PHP_MINIT_FUNCTION */ PHP_MINIT_FUNCTION(crc32_x86_intrin) { - if (zend_cpu_supports(ZEND_CPU_FEATURE_SSE42) && zend_cpu_supports(ZEND_CPU_FEATURE_PCLMULQDQ)) { + if (zend_cpu_supports_sse42() && zend_cpu_supports_pclmul()) { crc32_x86_simd_ptr = crc32_sse42_pclmul_update; } return SUCCESS; diff --git a/ext/standard/filestat.c b/ext/standard/filestat.c index 61546c3da6368..303e919c19ddc 100644 --- a/ext/standard/filestat.c +++ b/ext/standard/filestat.c @@ -728,7 +728,10 @@ PHPAPI void php_stat(const char *filename, size_t filename_length, int type, zva const char *local; php_stream_wrapper *wrapper; - if (!filename_length) { + if (!filename_length || CHECK_NULL_PATH(filename, filename_length)) { + if (filename_length && !IS_EXISTS_CHECK(type)) { + php_error_docref(NULL, E_WARNING, "Filename contains null byte"); + } RETURN_FALSE; } @@ -937,7 +940,7 @@ ZEND_NAMED_FUNCTION(name) { \ size_t filename_len; \ \ ZEND_PARSE_PARAMETERS_START(1, 1) \ - Z_PARAM_PATH(filename, filename_len) \ + Z_PARAM_STRING(filename, filename_len) \ ZEND_PARSE_PARAMETERS_END(); \ \ php_stat(filename, filename_len, funcnum, return_value); \ diff --git a/ext/standard/formatted_print.c b/ext/standard/formatted_print.c index 9bb4a5cb0652a..ab205feb6fa32 100644 --- a/ext/standard/formatted_print.c +++ b/ext/standard/formatted_print.c @@ -770,7 +770,7 @@ PHP_FUNCTION(sprintf) result = php_formatted_print(format, format_len, args, argc, 1); if (result == NULL) { - return; + RETURN_THROWS(); } RETVAL_STR(result); } @@ -796,7 +796,7 @@ PHP_FUNCTION(vsprintf) result = php_formatted_print(format, format_len, args, argc, -1); efree(args); if (result == NULL) { - return; + RETURN_THROWS(); } RETVAL_STR(result); } @@ -819,7 +819,7 @@ PHP_FUNCTION(printf) result = php_formatted_print(format, format_len, args, argc, 1); if (result == NULL) { - return; + RETURN_THROWS(); } rlen = PHPWRITE(ZSTR_VAL(result), ZSTR_LEN(result)); zend_string_efree(result); @@ -848,7 +848,7 @@ PHP_FUNCTION(vprintf) result = php_formatted_print(format, format_len, args, argc, -1); efree(args); if (result == NULL) { - return; + RETURN_THROWS(); } rlen = PHPWRITE(ZSTR_VAL(result), ZSTR_LEN(result)); zend_string_efree(result); @@ -876,7 +876,7 @@ PHP_FUNCTION(fprintf) result = php_formatted_print(format, format_len, args, argc, 2); if (result == NULL) { - return; + RETURN_THROWS(); } php_stream_write(stream, ZSTR_VAL(result), ZSTR_LEN(result)); @@ -910,7 +910,7 @@ PHP_FUNCTION(vfprintf) result = php_formatted_print(format, format_len, args, argc, -1); efree(args); if (result == NULL) { - return; + RETURN_THROWS(); } php_stream_write(stream, ZSTR_VAL(result), ZSTR_LEN(result)); diff --git a/ext/standard/iptc.c b/ext/standard/iptc.c index 6e9df19c30065..b4890238f8694 100644 --- a/ext/standard/iptc.c +++ b/ext/standard/iptc.c @@ -203,7 +203,9 @@ PHP_FUNCTION(iptcembed) } if (spool < 2) { - zend_fstat(fileno(fp), &sb); + if (zend_fstat(fileno(fp), &sb) != 0) { + RETURN_FALSE; + } spoolbuf = zend_string_safe_alloc(1, iptcdata_len + sizeof(psheader) + 1024 + 1, sb.st_size, 0); poi = (unsigned char*)ZSTR_VAL(spoolbuf); diff --git a/ext/standard/md5.c b/ext/standard/md5.c index ec07ae2ed35ad..83d43c497694e 100644 --- a/ext/standard/md5.c +++ b/ext/standard/md5.c @@ -290,7 +290,7 @@ static const void *body(PHP_MD5_CTX *ctx, const void *data, size_t size) return ptr; } -PHPAPI void PHP_MD5Init(PHP_MD5_CTX *ctx) +PHPAPI void PHP_MD5InitArgs(PHP_MD5_CTX *ctx, ZEND_ATTRIBUTE_UNUSED HashTable *args) { ctx->a = 0x67452301; ctx->b = 0xefcdab89; diff --git a/ext/standard/md5.h b/ext/standard/md5.h index ac60d7fca4cda..09bcff1cf1e72 100644 --- a/ext/standard/md5.h +++ b/ext/standard/md5.h @@ -42,7 +42,8 @@ typedef struct { } PHP_MD5_CTX; #define PHP_MD5_SPEC "llllllb64l16." -PHPAPI void PHP_MD5Init(PHP_MD5_CTX *ctx); +#define PHP_MD5Init(ctx) PHP_MD5InitArgs(ctx, NULL) +PHPAPI void PHP_MD5InitArgs(PHP_MD5_CTX *context, ZEND_ATTRIBUTE_UNUSED HashTable *args); PHPAPI void PHP_MD5Update(PHP_MD5_CTX *ctx, const void *data, size_t size); PHPAPI void PHP_MD5Final(unsigned char *result, PHP_MD5_CTX *ctx); diff --git a/ext/standard/sha1.c b/ext/standard/sha1.c index 58bd91385c2c7..f5668b9283c8a 100644 --- a/ext/standard/sha1.c +++ b/ext/standard/sha1.c @@ -152,7 +152,7 @@ static const unsigned char PADDING[64] = /* {{{ PHP_SHA1Init * SHA1 initialization. Begins an SHA1 operation, writing a new context. */ -PHPAPI void PHP_SHA1Init(PHP_SHA1_CTX * context) +PHPAPI void PHP_SHA1InitArgs(PHP_SHA1_CTX * context, ZEND_ATTRIBUTE_UNUSED HashTable *args) { context->count[0] = context->count[1] = 0; /* Load magic initialization constants. diff --git a/ext/standard/sha1.h b/ext/standard/sha1.h index ef98ecc29cc89..3ae3ec219ed2d 100644 --- a/ext/standard/sha1.h +++ b/ext/standard/sha1.h @@ -27,7 +27,8 @@ typedef struct { } PHP_SHA1_CTX; #define PHP_SHA1_SPEC "l5l2b64." -PHPAPI void PHP_SHA1Init(PHP_SHA1_CTX *); +#define PHP_SHA1Init(ctx) PHP_SHA1InitArgs(ctx, NULL) +PHPAPI void PHP_SHA1InitArgs(PHP_SHA1_CTX *, ZEND_ATTRIBUTE_UNUSED HashTable *); PHPAPI void PHP_SHA1Update(PHP_SHA1_CTX *, const unsigned char *, size_t); PHPAPI void PHP_SHA1Final(unsigned char[20], PHP_SHA1_CTX *); PHPAPI void make_sha1_digest(char *sha1str, const unsigned char *digest); diff --git a/ext/standard/streamsfuncs.c b/ext/standard/streamsfuncs.c index 1600b99794335..9ca2def099ed3 100644 --- a/ext/standard/streamsfuncs.c +++ b/ext/standard/streamsfuncs.c @@ -431,7 +431,7 @@ PHP_FUNCTION(stream_get_contents) if (maxlen_is_null) { maxlen = (ssize_t) PHP_STREAM_COPY_ALL; - } else if (maxlen < 0 && maxlen != PHP_STREAM_COPY_ALL) { + } else if (maxlen < 0 && maxlen != (ssize_t)PHP_STREAM_COPY_ALL) { zend_argument_value_error(2, "must be greater than or equal to -1"); RETURN_THROWS(); } diff --git a/ext/standard/string.c b/ext/standard/string.c index addc2361245b5..8d0754347a0ac 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -3615,7 +3615,7 @@ PHPAPI void php_stripslashes(zend_string *str) { /* {{{ PHP_MINIT_FUNCTION */ PHP_MINIT_FUNCTION(string_intrin) { - if (zend_cpu_supports(ZEND_CPU_FEATURE_SSE42)) { + if (zend_cpu_supports_sse42()) { php_addslashes_ptr = php_addslashes_sse42; php_stripslashes_ptr = php_stripslashes_sse42; } else { diff --git a/ext/standard/tests/array/range_errors.phpt b/ext/standard/tests/array/range_errors.phpt index dd8b69a82a663..7bc552ee978f9 100644 --- a/ext/standard/tests/array/range_errors.phpt +++ b/ext/standard/tests/array/range_errors.phpt @@ -47,6 +47,20 @@ try { echo $e->getMessage(), "\n"; } +echo "\n\n-- Testing ( (low < high) && (high-low < step) ) for characters --\n"; +try { + var_dump(range('a', 'z', 100)); +} catch (\ValueError $e) { + echo $e->getMessage(), "\n"; +} + +echo "\n\n-- Testing ( (low > high) && (low-high < step) ) for characters --\n"; +try { + var_dump(range('z', 'a', 100)); +} catch (\ValueError $e) { + echo $e->getMessage(), "\n"; +} + echo "\n-- Testing other conditions --\n"; try { var_dump( range(-1, -2, 2) ); @@ -97,6 +111,14 @@ range(): Argument #3 ($step) must not exceed the specified range -- Testing ( (low > high) && (low-high < step) ) -- range(): Argument #3 ($step) must not exceed the specified range + +-- Testing ( (low < high) && (high-low < step) ) for characters -- +range(): Argument #3 ($step) must not exceed the specified range + + +-- Testing ( (low > high) && (low-high < step) ) for characters -- +range(): Argument #3 ($step) must not exceed the specified range + -- Testing other conditions -- range(): Argument #3 ($step) must not exceed the specified range range(): Argument #3 ($step) must be of type int|float, string given diff --git a/ext/standard/tests/file/bug39863.phpt b/ext/standard/tests/file/bug39863.phpt index c69cb6d0a65c2..88c569473a76e 100644 --- a/ext/standard/tests/file/bug39863.phpt +++ b/ext/standard/tests/file/bug39863.phpt @@ -6,12 +6,7 @@ Andrew van der Stock, vanderaj @ owasp.org getMessage(), "\n"; -} +var_dump(file_exists($filename)); ?> --EXPECT-- -file_exists(): Argument #1 ($filename) must not contain any null bytes +bool(false) diff --git a/ext/standard/tests/file/disk_free_space_error-win32.phpt b/ext/standard/tests/file/disk_free_space_error-win32.phpt index 64723f5bf70b8..2591f5037188c 100644 --- a/ext/standard/tests/file/disk_free_space_error-win32.phpt +++ b/ext/standard/tests/file/disk_free_space_error-win32.phpt @@ -30,20 +30,16 @@ unlink($file_path."/disk_free_space.tmp"); --EXPECTF-- *** Testing error conditions *** -Warning: disk_free_space(): The system cannot find the path specified. - in %s on line %d +Warning: disk_free_space(): The system cannot find the path specified in %s on line %d bool(false) -Warning: diskfreespace(): The system cannot find the path specified. - in %s on line %d +Warning: diskfreespace(): The system cannot find the path specified in %s on line %d bool(false) -Warning: disk_free_space(): The directory name is invalid. - in %s on line %d +Warning: disk_free_space(): The directory name is invalid in %s on line %d bool(false) -Warning: diskfreespace(): The directory name is invalid. - in %s on line %d +Warning: diskfreespace(): The directory name is invalid in %s on line %d bool(false) -- Done -- diff --git a/ext/standard/tests/file/disk_total_space_error-win32.phpt b/ext/standard/tests/file/disk_total_space_error-win32.phpt index 7621fe1523e73..9e323387de94b 100644 --- a/ext/standard/tests/file/disk_total_space_error-win32.phpt +++ b/ext/standard/tests/file/disk_total_space_error-win32.phpt @@ -29,12 +29,10 @@ unlink($file_path."/disk_total_space.tmp"); --EXPECTF-- *** Testing error conditions *** -Warning: disk_total_space(): The system cannot find the path specified. - in %s on line %d +Warning: disk_total_space(): The system cannot find the path specified in %s on line %d bool(false) -Warning: disk_total_space(): The directory name is invalid. - in %s on line %d +Warning: disk_total_space(): The directory name is invalid in %s on line %d bool(false) --- Done --- diff --git a/ext/standard/tests/file/filegroup_variation3.phpt b/ext/standard/tests/file/filegroup_variation3.phpt index d18da058555ec..e844be0772125 100644 --- a/ext/standard/tests/file/filegroup_variation3.phpt +++ b/ext/standard/tests/file/filegroup_variation3.phpt @@ -75,8 +75,12 @@ bool(false) Warning: filegroup(): stat failed for %s/filegroup_variation3/filegroup*.tmp in %s on line %d bool(false) - Iteration 7 - -filegroup(): Argument #1 ($filename) must not contain any null bytes + +Warning: filegroup(): Filename contains null byte in %s on line %d +bool(false) - Iteration 8 - -filegroup(): Argument #1 ($filename) must not contain any null bytes + +Warning: filegroup(): Filename contains null byte in %s on line %d +bool(false) *** Done *** diff --git a/ext/standard/tests/file/fileinode_variation3.phpt b/ext/standard/tests/file/fileinode_variation3.phpt index 1158308687a15..92357a3619e83 100644 --- a/ext/standard/tests/file/fileinode_variation3.phpt +++ b/ext/standard/tests/file/fileinode_variation3.phpt @@ -74,8 +74,12 @@ bool(false) Warning: fileinode(): stat failed for %s/fileinode_variation3/fileinode*.tmp in %s on line %d bool(false) - Iteration 7 - -fileinode(): Argument #1 ($filename) must not contain any null bytes + +Warning: fileinode(): Filename contains null byte in %s on line %d +bool(false) - Iteration 8 - -fileinode(): Argument #1 ($filename) must not contain any null bytes + +Warning: fileinode(): Filename contains null byte in %s on line %d +bool(false) *** Done *** diff --git a/ext/standard/tests/file/fileowner_variation3.phpt b/ext/standard/tests/file/fileowner_variation3.phpt index a61b0ab0a3417..63ba6936aaa8d 100644 --- a/ext/standard/tests/file/fileowner_variation3.phpt +++ b/ext/standard/tests/file/fileowner_variation3.phpt @@ -75,8 +75,12 @@ bool(false) Warning: fileowner(): stat failed for %s/fileowner_variation3/fileowner*.tmp in %s on line %d bool(false) - Iteration 7 - -fileowner(): Argument #1 ($filename) must not contain any null bytes + +Warning: fileowner(): Filename contains null byte in %s on line %d +bool(false) - Iteration 8 - -fileowner(): Argument #1 ($filename) must not contain any null bytes + +Warning: fileowner(): Filename contains null byte in %s on line %d +bool(false) *** Done *** diff --git a/ext/standard/tests/file/fileperms_variation3.phpt b/ext/standard/tests/file/fileperms_variation3.phpt index ada750bbab497..5e981e9b86320 100644 --- a/ext/standard/tests/file/fileperms_variation3.phpt +++ b/ext/standard/tests/file/fileperms_variation3.phpt @@ -74,8 +74,12 @@ bool(false) Warning: fileperms(): stat failed for %s/fileperms_variation3/fileperms*.tmp in %s on line %d bool(false) - Iteration 7 - -fileperms(): Argument #1 ($filename) must not contain any null bytes + +Warning: fileperms(): Filename contains null byte in %s on line %d +bool(false) - Iteration 8 - -fileperms(): Argument #1 ($filename) must not contain any null bytes + +Warning: fileperms(): Filename contains null byte in %s on line %d +bool(false) *** Done *** diff --git a/ext/standard/tests/file/is_dir_variation4.phpt b/ext/standard/tests/file/is_dir_variation4.phpt index 8a1563992f23c..d6e64efe211cd 100644 --- a/ext/standard/tests/file/is_dir_variation4.phpt +++ b/ext/standard/tests/file/is_dir_variation4.phpt @@ -76,9 +76,9 @@ bool(true) bool(false) -- Iteration 9 -- -is_dir(): Argument #1 ($filename) must not contain any null bytes +bool(false) -- Iteration 10 -- -is_dir(): Argument #1 ($filename) must not contain any null bytes +bool(false) *** Done *** diff --git a/ext/standard/tests/file/is_executable_variation1.phpt b/ext/standard/tests/file/is_executable_variation1.phpt index de08c1d9170c5..a85b9a2ef0283 100644 --- a/ext/standard/tests/file/is_executable_variation1.phpt +++ b/ext/standard/tests/file/is_executable_variation1.phpt @@ -76,9 +76,9 @@ bool(false) -- Iteration 5 -- bool(false) -- Iteration 6 -- -is_executable(): Argument #1 ($filename) must not contain any null bytes +bool(false) -- Iteration 7 -- -is_executable(): Argument #1 ($filename) must not contain any null bytes +bool(false) -- Iteration 8 -- bool(false) -- Iteration 9 -- diff --git a/ext/standard/tests/file/is_file_variation4.phpt b/ext/standard/tests/file/is_file_variation4.phpt index f6921d1d87262..1afc34dd03bea 100644 --- a/ext/standard/tests/file/is_file_variation4.phpt +++ b/ext/standard/tests/file/is_file_variation4.phpt @@ -66,8 +66,8 @@ bool(false) - Iteration 6 - bool(false) - Iteration 7 - -is_file(): Argument #1 ($filename) must not contain any null bytes +bool(false) - Iteration 8 - -is_file(): Argument #1 ($filename) must not contain any null bytes +bool(false) *** Done *** diff --git a/ext/standard/tests/file/is_readable_variation1.phpt b/ext/standard/tests/file/is_readable_variation1.phpt index d46e5fa5ca850..9c25213f8abb2 100644 --- a/ext/standard/tests/file/is_readable_variation1.phpt +++ b/ext/standard/tests/file/is_readable_variation1.phpt @@ -77,11 +77,11 @@ bool(false) -- Iteration 6 -- bool(false) -- Iteration 7 -- -is_readable(): Argument #1 ($filename) must not contain any null bytes +bool(false) -- Iteration 8 -- -is_readable(): Argument #1 ($filename) must not contain any null bytes +bool(false) -- Iteration 9 -- -is_readable(): Argument #1 ($filename) must not contain any null bytes +bool(false) -- Iteration 10 -- bool(true) -- Iteration 11 -- diff --git a/ext/standard/tests/file/is_writable_variation1.phpt b/ext/standard/tests/file/is_writable_variation1.phpt index 9361ec947c194..80695d6d45a25 100644 --- a/ext/standard/tests/file/is_writable_variation1.phpt +++ b/ext/standard/tests/file/is_writable_variation1.phpt @@ -87,14 +87,14 @@ bool(false) bool(false) bool(false) -- Iteration 7 -- -is_writable(): Argument #1 ($filename) must not contain any null bytes -is_writeable(): Argument #1 ($filename) must not contain any null bytes +bool(false) +bool(false) -- Iteration 8 -- -is_writable(): Argument #1 ($filename) must not contain any null bytes -is_writeable(): Argument #1 ($filename) must not contain any null bytes +bool(false) +bool(false) -- Iteration 9 -- -is_writable(): Argument #1 ($filename) must not contain any null bytes -is_writeable(): Argument #1 ($filename) must not contain any null bytes +bool(false) +bool(false) -- Iteration 10 -- bool(true) bool(true) diff --git a/ext/standard/tests/file/rename_variation-win32.phpt b/ext/standard/tests/file/rename_variation-win32.phpt index 76f337fe1f2f8..f90a9a9cd1be9 100644 --- a/ext/standard/tests/file/rename_variation-win32.phpt +++ b/ext/standard/tests/file/rename_variation-win32.phpt @@ -65,7 +65,7 @@ bool(false) bool(true) -- Iteration 2 -- -Warning: rename(%s/rename_variation/rename_variation.tmp/,%s/rename_variation2.tmp): The filename, directory name, or volume label syntax is incorrect. (code: 123) in %s on line %d +Warning: rename(%s/rename_variation/rename_variation.tmp/,%s/rename_variation2.tmp): The filename, directory name, or volume label syntax is incorrect (code: 123) in %s on line %d bool(false) bool(false) bool(false) diff --git a/ext/standard/tests/file/rename_variation11-win32.phpt b/ext/standard/tests/file/rename_variation11-win32.phpt index 39d60272bd449..e4c55fb6ce5c0 100644 --- a/ext/standard/tests/file/rename_variation11-win32.phpt +++ b/ext/standard/tests/file/rename_variation11-win32.phpt @@ -86,12 +86,12 @@ bool(true) -- Iteration 5 -- -Warning: rename(%s\renameVar11\renameVar11Sub\..\\\renameVar11Sub\\..\\..\renameVar11Sub\renameMe.tmp,%s\renameVar11\renameVar11Sub\..\\\renameVar11Sub\\..\\..\renameVar11Sub\IwasRenamed.tmp): The system cannot find the path specified. (code: 3) in %s on line %d +Warning: rename(%s\renameVar11\renameVar11Sub\..\\\renameVar11Sub\\..\\..\renameVar11Sub\renameMe.tmp,%s\renameVar11\renameVar11Sub\..\\\renameVar11Sub\\..\\..\renameVar11Sub\IwasRenamed.tmp): The system cannot find the path specified (code: 3) in %s on line %d bool(false) -- Iteration 6 -- -Warning: rename(%s\renameVar11\renameVar11Sub\BADDIR\renameMe.tmp,%s\renameVar11\renameVar11Sub\BADDIR\IwasRenamed.tmp): The system cannot find the path specified. (code: 3) in %s on line %d +Warning: rename(%s\renameVar11\renameVar11Sub\BADDIR\renameMe.tmp,%s\renameVar11\renameVar11Sub\BADDIR\IwasRenamed.tmp): The system cannot find the path specified (code: 3) in %s on line %d bool(false) -- Iteration 7 -- @@ -112,7 +112,7 @@ bool(true) -- Iteration 11 -- -Warning: rename(BADDIR\renameMe.tmp,BADDIR\IwasRenamed.tmp): The system cannot find the path specified. (code: 3) in %s on line %d +Warning: rename(BADDIR\renameMe.tmp,BADDIR\IwasRenamed.tmp): The system cannot find the path specified (code: 3) in %s on line %d bool(false) -- Iteration 12 -- diff --git a/ext/standard/tests/file/rename_variation12-win32.phpt b/ext/standard/tests/file/rename_variation12-win32.phpt index 781ea7726eeb1..7ecaed35d7dc7 100644 --- a/ext/standard/tests/file/rename_variation12-win32.phpt +++ b/ext/standard/tests/file/rename_variation12-win32.phpt @@ -83,12 +83,12 @@ bool(true) -- Iteration 5 -- -Warning: rename(%s/renameVar11/renameVar11Sub/..///renameVar11Sub//..//../renameVar11Sub/renameMe.tmp,%s/renameVar11/renameVar11Sub/..///renameVar11Sub//..//../renameVar11Sub/IwasRenamed.tmp): The system cannot find the path specified. (code: 3) in %s on line %d +Warning: rename(%s/renameVar11/renameVar11Sub/..///renameVar11Sub//..//../renameVar11Sub/renameMe.tmp,%s/renameVar11/renameVar11Sub/..///renameVar11Sub//..//../renameVar11Sub/IwasRenamed.tmp): The system cannot find the path specified (code: 3) in %s on line %d bool(false) -- Iteration 6 -- -Warning: rename(%s/renameVar11/renameVar11Sub/BADDIR/renameMe.tmp,%s/renameVar11/renameVar11Sub/BADDIR/IwasRenamed.tmp): The system cannot find the path specified. (code: 3) in %s on line %d +Warning: rename(%s/renameVar11/renameVar11Sub/BADDIR/renameMe.tmp,%s/renameVar11/renameVar11Sub/BADDIR/IwasRenamed.tmp): The system cannot find the path specified (code: 3) in %s on line %d bool(false) -- Iteration 7 -- @@ -109,7 +109,7 @@ bool(true) -- Iteration 11 -- -Warning: rename(BADDIR/renameMe.tmp,BADDIR/IwasRenamed.tmp): The system cannot find the path specified. (code: 3) in %s on line %d +Warning: rename(BADDIR/renameMe.tmp,BADDIR/IwasRenamed.tmp): The system cannot find the path specified (code: 3) in %s on line %d bool(false) *** Done *** diff --git a/ext/standard/tests/file/rename_variation13-win32.phpt b/ext/standard/tests/file/rename_variation13-win32.phpt index 4821fa795136a..65dbdfb8d671d 100644 --- a/ext/standard/tests/file/rename_variation13-win32.phpt +++ b/ext/standard/tests/file/rename_variation13-win32.phpt @@ -66,52 +66,52 @@ rmdir($file_path); -- 0 testing '-1' integer -- bool(true) -Warning: rename(-1,%safile.tmp): The system cannot find the file specified. (code: 2) in %srename_variation13-win32.php on line %d +Warning: rename(-1,%safile.tmp): The system cannot find the file specified (code: 2) in %srename_variation13-win32.php on line %d bool(false) -- 1 testing '1' boolean -- bool(true) -Warning: rename(1,%safile.tmp): The system cannot find the file specified. (code: 2) in %srename_variation13-win32.php on line %d +Warning: rename(1,%safile.tmp): The system cannot find the file specified (code: 2) in %srename_variation13-win32.php on line %d bool(false) -- 2 testing '' boolean -- -Warning: rename(%safile.tmp,): %r(Invalid argument|(The parameter is incorrect|The system cannot find the path specified)\. \(code: \d+\))%r in %srename_variation13-win32.php on line %d +Warning: rename(%safile.tmp,): %r(Invalid argument|(The parameter is incorrect|The system cannot find the path specified) \(code: \d+\))%r in %srename_variation13-win32.php on line %d bool(false) -Warning: rename(,%safile.tmp): %r(Invalid argument|(The parameter is incorrect|The system cannot find the path specified)\. \(code: \d+\))%r in %srename_variation13-win32.php on line %d +Warning: rename(,%safile.tmp): %r(Invalid argument|(The parameter is incorrect|The system cannot find the path specified) \(code: \d+\))%r in %srename_variation13-win32.php on line %d bool(false) -- 3 testing '' NULL -- -Warning: rename(%safile.tmp,): %r(Invalid argument|(The parameter is incorrect|The system cannot find the path specified)\. \(code: \d+\))%r in %srename_variation13-win32.php on line %d +Warning: rename(%safile.tmp,): %r(Invalid argument|(The parameter is incorrect|The system cannot find the path specified) \(code: \d+\))%r in %srename_variation13-win32.php on line %d bool(false) -Warning: rename(,%safile.tmp): %r(Invalid argument|(The parameter is incorrect|The system cannot find the path specified)\. \(code: \d+\))%r in %srename_variation13-win32.php on line %d +Warning: rename(,%safile.tmp): %r(Invalid argument|(The parameter is incorrect|The system cannot find the path specified) \(code: \d+\))%r in %srename_variation13-win32.php on line %d bool(false) -- 4 testing '' string -- -Warning: rename(%safile.tmp,): %r(Invalid argument|(The parameter is incorrect|The system cannot find the path specified)\. \(code: \d+\))%r in %srename_variation13-win32.php on line %d +Warning: rename(%safile.tmp,): %r(Invalid argument|(The parameter is incorrect|The system cannot find the path specified) \(code: \d+\))%r in %srename_variation13-win32.php on line %d bool(false) -Warning: rename(,%safile.tmp): %r(Invalid argument|(The parameter is incorrect|The system cannot find the path specified)\. \(code: \d+\))%r in %srename_variation13-win32.php on line %d +Warning: rename(,%safile.tmp): %r(Invalid argument|(The parameter is incorrect|The system cannot find the path specified) \(code: \d+\))%r in %srename_variation13-win32.php on line %d bool(false) -- 5 testing ' ' string -- -Warning: rename(%s): The filename, directory name, or volume label syntax is incorrect. (code: 123) in %srename_variation13-win32.php on line %d +Warning: rename(%s): The filename, directory name, or volume label syntax is incorrect (code: 123) in %srename_variation13-win32.php on line %d bool(false) -Warning: rename(%s): The filename, directory name, or volume label syntax is incorrect. (code: 123) in %srename_variation13-win32.php on line %d +Warning: rename(%s): The filename, directory name, or volume label syntax is incorrect (code: 123) in %srename_variation13-win32.php on line %d bool(false) -- 6 testing '/no/such/file/dir' string -- -Warning: rename(%safile.tmp,/no/such/file/dir): The system cannot find the path specified. (code: 3) in %srename_variation13-win32.php on line %d +Warning: rename(%safile.tmp,/no/such/file/dir): The system cannot find the path specified (code: 3) in %srename_variation13-win32.php on line %d bool(false) -Warning: rename(/no/such/file/dir,%safile.tmp): The system cannot find the path specified. (code: 3) in %srename_variation13-win32.php on line %d +Warning: rename(/no/such/file/dir,%safile.tmp): The system cannot find the path specified (code: 3) in %srename_variation13-win32.php on line %d bool(false) -- 7 testing 'php/php' string -- -Warning: rename(%safile.tmp,php/php): The system cannot find the path specified. (code: 3) in %srename_variation13-win32.php on line %d +Warning: rename(%safile.tmp,php/php): The system cannot find the path specified (code: 3) in %srename_variation13-win32.php on line %d bool(false) -Warning: rename(php/php,%safile.tmp): The system cannot find the path specified. (code: 3) in %srename_variation13-win32.php on line %d +Warning: rename(php/php,%safile.tmp): The system cannot find the path specified (code: 3) in %srename_variation13-win32.php on line %d bool(false) diff --git a/ext/standard/tests/file/rename_variation3-win32.phpt b/ext/standard/tests/file/rename_variation3-win32.phpt index cd36b3665e642..b8ed7fc0d1193 100644 --- a/ext/standard/tests/file/rename_variation3-win32.phpt +++ b/ext/standard/tests/file/rename_variation3-win32.phpt @@ -67,7 +67,7 @@ bool(true) -- Renaming existing file to existing directory name -- -Warning: rename(%s/rename_variation3.tmp,%s/rename_variation3_dir): Access is denied. (code: 5) in %s on line %d +Warning: rename(%s/rename_variation3.tmp,%s/rename_variation3_dir): Access is denied (code: 5) in %s on line %d bool(false) bool(true) bool(true) diff --git a/ext/standard/tests/file/rename_variation8-win32.phpt b/ext/standard/tests/file/rename_variation8-win32.phpt index 5e4bd685761ed..c880cc60eeb90 100644 --- a/ext/standard/tests/file/rename_variation8-win32.phpt +++ b/ext/standard/tests/file/rename_variation8-win32.phpt @@ -46,7 +46,7 @@ rmdir(__DIR__."/rename_basic_dir1"); --EXPECTF-- *** Testing rename() on non-existing file *** -Warning: rename(%s/non_existent_file.tmp,%s/rename_variation8_new.tmp): The system cannot find the file specified. (code: 2) in %s on line %d +Warning: rename(%s/non_existent_file.tmp,%s/rename_variation8_new.tmp): The system cannot find the file specified (code: 2) in %s on line %d bool(false) bool(false) bool(false) @@ -58,7 +58,7 @@ bool(true) *** Testing rename() on non-existing directory *** -Warning: rename(%s/non_existent_dir,%s/rename_basic_dir2): The system cannot find the file specified. (code: 2) in %s on line %d +Warning: rename(%s/non_existent_dir,%s/rename_basic_dir2): The system cannot find the file specified (code: 2) in %s on line %d bool(false) bool(false) bool(false) diff --git a/ext/standard/tests/filters/php_user_filter_onCreate_failure.phpt b/ext/standard/tests/filters/php_user_filter_onCreate_failure.phpt new file mode 100644 index 0000000000000..5b0c1d5d9c60b --- /dev/null +++ b/ext/standard/tests/filters/php_user_filter_onCreate_failure.phpt @@ -0,0 +1,24 @@ +--TEST-- +php_user_filter onCreate() returns false +--FILE-- + +--EXPECTF-- +Warning: stream_filter_append(): Unable to create or locate filter "my_filter" in %s on line %d +bool(false) +string(4) "Test" diff --git a/ext/standard/tests/mail/bug72964.phpt b/ext/standard/tests/mail/bug72964.phpt new file mode 100644 index 0000000000000..44048771d6d2c --- /dev/null +++ b/ext/standard/tests/mail/bug72964.phpt @@ -0,0 +1,73 @@ +--TEST-- +Bug #72964 (White space not unfolded for CC/Bcc headers) +--SKIPIF-- + +--INI-- +SMTP=localhost +smtp_port=25 +--FILE-- + 0) { + // sleep for a while to allow msg to be delivered + sleep(1); + + $num_messages = imap_check($imap_stream)->Nmsgs; + for ($i = $num_messages; $i > 0; $i--) { + $info = imap_headerinfo($imap_stream, $i); + if ($info->subject === $subject) { + imap_delete($imap_stream, $i); + $found = true; + break; + } + } + $repeat_count--; + } + + imap_close($imap_stream, CL_EXPUNGE); + return $found; +} + +$to = "{$users[2]}@$domain"; +$subject = bin2hex(random_bytes(16)); +$message = 'hello'; +$headers = "From: webmaster@example.com\r\n" + . "Cc: {$users[0]}@$domain,\r\n\t{$users[1]}@$domain\r\n" + . "Bcc: {$users[2]}@$domain,\r\n {$users[3]}@$domain\r\n"; + +$res = mail($to, $subject, $message, $headers); +if ($res !== true) { + die("TEST FAILED : Unable to send test email\n"); +} else { + echo "Message sent OK\n"; +} + +foreach ($users as $user) { + if (!find_and_delete_message("$user@$domain", $subject)) { + echo "TEST FAILED: email not delivered\n"; + } else { + echo "TEST PASSED: Message sent and deleted OK\n"; + } +} +?> +--EXPECT-- +Message sent OK +TEST PASSED: Message sent and deleted OK +TEST PASSED: Message sent and deleted OK +TEST PASSED: Message sent and deleted OK +TEST PASSED: Message sent and deleted OK diff --git a/ext/standard/tests/network/bug41347.phpt b/ext/standard/tests/network/bug41347.phpt deleted file mode 100644 index 626561976b845..0000000000000 --- a/ext/standard/tests/network/bug41347.phpt +++ /dev/null @@ -1,12 +0,0 @@ ---TEST-- -dns_check_record() segfault with empty host ---FILE-- -getMessage() . "\n"; -} -?> ---EXPECT-- -dns_check_record(): Argument #1 ($hostname) cannot be empty diff --git a/ext/standard/tests/serialize/bug80411.phpt b/ext/standard/tests/serialize/bug80411.phpt new file mode 100644 index 0000000000000..fe611f2629cb4 --- /dev/null +++ b/ext/standard/tests/serialize/bug80411.phpt @@ -0,0 +1,31 @@ +--TEST-- +Bug #80411: References to null-serialized object break serialize() +--FILE-- + +--EXPECT-- +a:4:{i:0;N;i:1;N;i:2;s:6:"endcap";i:3;R:4;} +array ( + 0 => NULL, + 1 => NULL, + 2 => 'endcap', + 3 => 'endcap', +) diff --git a/ext/standard/tests/serialize/overwrite_untyped_ref.phpt b/ext/standard/tests/serialize/overwrite_untyped_ref.phpt new file mode 100644 index 0000000000000..d6f3b78bfbfd4 --- /dev/null +++ b/ext/standard/tests/serialize/overwrite_untyped_ref.phpt @@ -0,0 +1,17 @@ +--TEST-- +Overwrite reference in untyped property +--FILE-- + +--EXPECT-- +object(Test)#1 (1) { + ["prop"]=> + int(0) +} diff --git a/ext/standard/tests/serialize/typed_property_ref_assignment_failure.phpt b/ext/standard/tests/serialize/typed_property_ref_assignment_failure.phpt new file mode 100644 index 0000000000000..7ee35e8b69182 --- /dev/null +++ b/ext/standard/tests/serialize/typed_property_ref_assignment_failure.phpt @@ -0,0 +1,29 @@ +--TEST-- +Failure to assign ref to typed property +--FILE-- +getMessage(), "\n"; +} + +$s = <<<'STR' +O:4:"Test":1:{s:4:"prop";a:1:{i:0;R:2; +STR; +var_dump(unserialize($s)); + +?> +--EXPECTF-- +Cannot assign stdClass to property Test::$prop of type int + +Notice: unserialize(): Error at offset 38 of 38 bytes in %s on line %d +bool(false) diff --git a/ext/standard/tests/serialize/typed_property_ref_overwrite.phpt b/ext/standard/tests/serialize/typed_property_ref_overwrite.phpt new file mode 100644 index 0000000000000..148c66b76c741 --- /dev/null +++ b/ext/standard/tests/serialize/typed_property_ref_overwrite.phpt @@ -0,0 +1,19 @@ +--TEST-- +Overwriting a typed property reference +--FILE-- + +--EXPECT-- +object(Test)#1 (1) { + ["prop"]=> + NULL +} diff --git a/ext/standard/tests/serialize/typed_property_ref_overwrite2.phpt b/ext/standard/tests/serialize/typed_property_ref_overwrite2.phpt new file mode 100644 index 0000000000000..a408bf319601e --- /dev/null +++ b/ext/standard/tests/serialize/typed_property_ref_overwrite2.phpt @@ -0,0 +1,22 @@ +--TEST-- +Overwriting a typed property that is not yet a reference +--FILE-- + +--EXPECT-- +object(Test)#1 (1) { + ["prop"]=> + &object(Test)#2 (1) { + ["prop"]=> + *RECURSION* + } +} diff --git a/ext/standard/tests/serialize/typed_property_refs.phpt b/ext/standard/tests/serialize/typed_property_refs.phpt index 3c8096a3928e8..9c71d460c2cc4 100644 --- a/ext/standard/tests/serialize/typed_property_refs.phpt +++ b/ext/standard/tests/serialize/typed_property_refs.phpt @@ -13,6 +13,11 @@ class B { public int $b; } +class E { + public $a; + public int $b; +} + class C { public int $a; public string $b; @@ -25,6 +30,7 @@ class D { var_dump(unserialize('O:1:"A":2:{s:1:"a";i:1;s:1:"b";R:2;}')); var_dump(unserialize('O:1:"B":2:{s:1:"a";i:1;s:1:"b";R:2;}')); +var_dump(unserialize('O:1:"E":2:{s:1:"a";i:1;s:1:"b";R:2;}')); try { var_dump(unserialize('O:1:"A":2:{s:1:"a";N;s:1:"b";R:2;}')); @@ -66,6 +72,12 @@ object(B)#1 (2) { ["b"]=> &int(1) } +object(E)#1 (2) { + ["a"]=> + &int(1) + ["b"]=> + &int(1) +} Cannot assign null to property A::$a of type int Cannot assign null to property B::$b of type int Cannot assign int to property C::$b of type string diff --git a/ext/standard/tests/streams/bug49936_win32.phpt b/ext/standard/tests/streams/bug49936_win32.phpt index 0f0ef4feb1db5..6984d61b36aef 100644 --- a/ext/standard/tests/streams/bug49936_win32.phpt +++ b/ext/standard/tests/streams/bug49936_win32.phpt @@ -17,14 +17,12 @@ var_dump(opendir($dir)); ?> --EXPECTF-- -Warning: opendir(): connect() failed: %s - in %s on line %d +Warning: opendir(): connect() failed: %s in %s on line %d Warning: opendir(ftp://...@localhost/): Failed to open directory: operation failed in %s on line %d bool(false) -Warning: opendir(): connect() failed: %s - in %s on line %d +Warning: opendir(): connect() failed: %s in %s on line %d Warning: opendir(ftp://...@localhost/): Failed to open directory: operation failed in %s on line %d bool(false) diff --git a/ext/standard/tests/streams/bug77069.phpt b/ext/standard/tests/streams/bug77069.phpt new file mode 100644 index 0000000000000..ec78ac25c52cd --- /dev/null +++ b/ext/standard/tests/streams/bug77069.phpt @@ -0,0 +1,57 @@ +--TEST-- +Bug #77069 (stream filter loses final block of data) +--FILE-- +data .= $bucket_in->data; + $consumed += $bucket_in->datalen; + + // Process whole lines. + while (preg_match('/(.*?)[\r\n]+(.*)/s', $this->data, $match) === 1) { + list(, $data, $this->data) = $match; + // Send this record output. + $data = strrev($data) . PHP_EOL; + $bucket_out = stream_bucket_new($this->stream, $data); + $return = PSFS_PASS_ON; + stream_bucket_append($out, $bucket_out); + } + } + + // Process the final line. + if ($closing && $this->data !== '') { + $data = strrev($this->data) . PHP_EOL; + $bucket_out = stream_bucket_new($this->stream, $data); + $return = PSFS_PASS_ON; + stream_bucket_append($out, $bucket_out); + } + + return $return; + } +} + +stream_filter_register('my-filter', 'MyFilter'); + +$input = "Line one\nLine two\nLine three"; + +$stream = fopen('data://text/plain,' . $input, 'r'); +stream_filter_append($stream, 'my-filter'); + +$output = ''; +while (!feof($stream)) { + $output .= fread($stream, 16); +} +fclose($stream); + +echo $output; +?> +--EXPECT-- +eno eniL +owt eniL +eerht eniL diff --git a/ext/standard/tests/streams/bug77080.phpt b/ext/standard/tests/streams/bug77080.phpt new file mode 100644 index 0000000000000..feb20656d63c8 --- /dev/null +++ b/ext/standard/tests/streams/bug77080.phpt @@ -0,0 +1,16 @@ +--TEST-- +Bug #77080 (Deflate not working) +--SKIPIF-- + +--FILE-- + +--EXPECT-- +bool(true) diff --git a/ext/standard/tests/streams/bug79984.phpt b/ext/standard/tests/streams/bug79984.phpt new file mode 100644 index 0000000000000..7126458ffff87 --- /dev/null +++ b/ext/standard/tests/streams/bug79984.phpt @@ -0,0 +1,57 @@ +--TEST-- +Bug #79984 (Stream filter is not called with closing arg) +--FILE-- +data = strtoupper($bucket->data); + $consumed += $bucket->datalen; + stream_bucket_append($out, $bucket); + } + echo 'filtered ' . ($consumed ? $consumed : 0) . ' bytes'; + if ($closing) { + echo ' and closing.'; + } else { + echo '.'; + } + if (feof($this->stream)) { + echo ' Stream has reached end-of-file.'; + } + echo PHP_EOL; + return PSFS_PASS_ON; + } +} + +stream_filter_register('f', 'F'); + +$str = str_repeat('a', 8320); + +$f2 = fopen('php://temp', 'r+b'); +fwrite($f2, $str); +fseek($f2, 0, SEEK_SET); +stream_filter_append($f2, 'f', STREAM_FILTER_READ); +var_dump(strlen(stream_get_contents($f2))); +fclose($f2); + +?> +--EXPECT-- +filter onCreate +filtered 8192 bytes. +filtered 128 bytes and closing. +int(8320) +filter onClose diff --git a/ext/standard/tests/versioning/version_compare_op_abbrev.phpt b/ext/standard/tests/versioning/version_compare_op_abbrev.phpt new file mode 100644 index 0000000000000..241c1559feb33 --- /dev/null +++ b/ext/standard/tests/versioning/version_compare_op_abbrev.phpt @@ -0,0 +1,21 @@ +--TEST-- +version_compare() no longer supports operator abbreviations +--FILE-- + +--EXPECT-- +'' failed +'l' failed +'g' failed +'e' failed +'!' failed +'n' failed diff --git a/ext/standard/user_filters.c b/ext/standard/user_filters.c index b62e8a2d7cde9..758f79ff11266 100644 --- a/ext/standard/user_filters.c +++ b/ext/standard/user_filters.c @@ -342,6 +342,8 @@ static php_stream_filter *user_filter_factory_create(const char *filtername, &retval, 0, NULL); + zval_ptr_dtor(&func_name); + if (Z_TYPE(retval) != IS_UNDEF) { if (Z_TYPE(retval) == IS_FALSE) { /* User reported filter creation error "return false;" */ @@ -359,7 +361,6 @@ static php_stream_filter *user_filter_factory_create(const char *filtername, } zval_ptr_dtor(&retval); } - zval_ptr_dtor(&func_name); /* set the filter property, this will be used during cleanup */ ZVAL_RES(&zfilter, zend_register_resource(filter, le_userfilters)); diff --git a/ext/standard/var.c b/ext/standard/var.c index 25889e6f93ac1..fef62dd482349 100644 --- a/ext/standard/var.c +++ b/ext/standard/var.c @@ -658,7 +658,7 @@ static inline zend_long php_add_var_hash(php_serialize_data_t data, zval *var) / if (zv) { /* References are only counted once, undo the data->n increment above */ - if (is_ref) { + if (is_ref && Z_LVAL_P(zv) != -1) { data->n -= 1; } diff --git a/ext/standard/var_unserializer.re b/ext/standard/var_unserializer.re index 6680e00645a4d..1b191a03678a7 100644 --- a/ext/standard/var_unserializer.re +++ b/ext/standard/var_unserializer.re @@ -556,21 +556,22 @@ string_key: /* This is a property with a declaration */ old_data = Z_INDIRECT_P(old_data); info = zend_get_typed_property_info_for_slot(obj, old_data); + if (info) { + if (Z_ISREF_P(old_data)) { + /* If the value is overwritten, remove old type source from ref. */ + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(old_data), info); + } + + if ((*var_hash)->ref_props) { + /* Remove old entry from ref_props table, if it exists. */ + zend_hash_index_del( + (*var_hash)->ref_props, (zend_uintptr_t) old_data); + } + } var_push_dtor(var_hash, old_data); Z_TRY_DELREF_P(old_data); ZVAL_COPY_VALUE(old_data, &d); data = old_data; - - if (UNEXPECTED(info)) { - /* Remember to which property this slot belongs, so we can add a - * type source if it is turned into a reference lateron. */ - if (!(*var_hash)->ref_props) { - (*var_hash)->ref_props = emalloc(sizeof(HashTable)); - zend_hash_init((*var_hash)->ref_props, 8, NULL, NULL, 0); - } - zend_hash_index_update_ptr( - (*var_hash)->ref_props, (zend_uintptr_t) data, info); - } } else { var_push_dtor(var_hash, old_data); data = zend_hash_update_ind(ht, Z_STR(key), &d); @@ -589,6 +590,11 @@ string_key: } if (!php_var_unserialize_internal(data, p, max, var_hash, 0)) { + if (info && Z_ISREF_P(data)) { + /* Add type source even if we failed to unserialize. + * The data is still stored in the property. */ + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(data), info); + } zval_ptr_dtor(&key); goto failure; } @@ -600,8 +606,18 @@ string_key: zval_ptr_dtor_nogc(&key); goto failure; } + if (Z_ISREF_P(data)) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(data), info); + } else { + /* Remember to which property this slot belongs, so we can add a + * type source if it is turned into a reference lateron. */ + if (!(*var_hash)->ref_props) { + (*var_hash)->ref_props = emalloc(sizeof(HashTable)); + zend_hash_init((*var_hash)->ref_props, 8, NULL, NULL, 0); + } + zend_hash_index_update_ptr( + (*var_hash)->ref_props, (zend_uintptr_t) data, info); } } diff --git a/ext/standard/versioning.c b/ext/standard/versioning.c index dbdae6ecf7532..f4f20c9850a0d 100644 --- a/ext/standard/versioning.c +++ b/ext/standard/versioning.c @@ -203,37 +203,38 @@ php_version_compare(const char *orig_ver1, const char *orig_ver2) PHP_FUNCTION(version_compare) { - char *v1, *v2, *op = NULL; - size_t v1_len, v2_len, op_len = 0; + char *v1, *v2; + zend_string *op = NULL; + size_t v1_len, v2_len; int compare; ZEND_PARSE_PARAMETERS_START(2, 3) Z_PARAM_STRING(v1, v1_len) Z_PARAM_STRING(v2, v2_len) Z_PARAM_OPTIONAL - Z_PARAM_STRING_OR_NULL(op, op_len) + Z_PARAM_STR_OR_NULL(op) ZEND_PARSE_PARAMETERS_END(); compare = php_version_compare(v1, v2); if (!op) { RETURN_LONG(compare); } - if (!strncmp(op, "<", op_len) || !strncmp(op, "lt", op_len)) { + if (zend_string_equals_literal(op, "<") || zend_string_equals_literal(op, "lt")) { RETURN_BOOL(compare == -1); } - if (!strncmp(op, "<=", op_len) || !strncmp(op, "le", op_len)) { + if (zend_string_equals_literal(op, "<=") || zend_string_equals_literal(op, "le")) { RETURN_BOOL(compare != 1); } - if (!strncmp(op, ">", op_len) || !strncmp(op, "gt", op_len)) { + if (zend_string_equals_literal(op, ">") || zend_string_equals_literal(op, "gt")) { RETURN_BOOL(compare == 1); } - if (!strncmp(op, ">=", op_len) || !strncmp(op, "ge", op_len)) { + if (zend_string_equals_literal(op, ">=") || zend_string_equals_literal(op, "ge")) { RETURN_BOOL(compare != -1); } - if (!strncmp(op, "==", op_len) || !strncmp(op, "=", op_len) || !strncmp(op, "eq", op_len)) { + if (zend_string_equals_literal(op, "==") || zend_string_equals_literal(op, "=") || zend_string_equals_literal(op, "eq")) { RETURN_BOOL(compare == 0); } - if (!strncmp(op, "!=", op_len) || !strncmp(op, "<>", op_len) || !strncmp(op, "ne", op_len)) { + if (zend_string_equals_literal(op, "!=") || zend_string_equals_literal(op, "<>") || zend_string_equals_literal(op, "ne")) { RETURN_BOOL(compare != 0); } diff --git a/ext/tidy/tests/bug77594.phpt b/ext/tidy/tests/bug77594.phpt new file mode 100644 index 0000000000000..0d84a035f795f --- /dev/null +++ b/ext/tidy/tests/bug77594.phpt @@ -0,0 +1,15 @@ +--TEST-- +Bug #77594 (ob_tidyhandler is never reset) +--DESCRIPTION-- +Test is useful only with --repeat 2 (or more) +--SKIPIF-- + +--FILE-- + +--EXPECT-- +bool(true) diff --git a/ext/tidy/tidy.c b/ext/tidy/tidy.c index 8d87bb980c19f..5b53f65578330 100644 --- a/ext/tidy/tidy.c +++ b/ext/tidy/tidy.c @@ -228,6 +228,7 @@ static int php_tidy_output_handler(void **nothing, php_output_context *output_co static PHP_MINIT_FUNCTION(tidy); static PHP_MSHUTDOWN_FUNCTION(tidy); static PHP_RINIT_FUNCTION(tidy); +static PHP_RSHUTDOWN_FUNCTION(tidy); static PHP_MINFO_FUNCTION(tidy); ZEND_DECLARE_MODULE_GLOBALS(tidy) @@ -249,7 +250,7 @@ zend_module_entry tidy_module_entry = { PHP_MINIT(tidy), PHP_MSHUTDOWN(tidy), PHP_RINIT(tidy), - NULL, + PHP_RSHUTDOWN(tidy), PHP_MINFO(tidy), PHP_TIDY_VERSION, PHP_MODULE_GLOBALS(tidy), @@ -769,9 +770,7 @@ static void php_tidy_create_node(INTERNAL_FUNCTION_PARAMETERS, tidy_base_nodetyp node = tidyGetBody(obj->ptdoc->doc); break; - default: - RETURN_NULL(); - break; + EMPTY_SWITCH_DEFAULT_CASE() } if (!node) { @@ -863,6 +862,13 @@ static PHP_RINIT_FUNCTION(tidy) return SUCCESS; } +static PHP_RSHUTDOWN_FUNCTION(tidy) +{ + TG(clean_output) = INI_ORIG_BOOL("tidy.clean_output"); + + return SUCCESS; +} + static PHP_MSHUTDOWN_FUNCTION(tidy) { UNREGISTER_INI_ENTRIES(); diff --git a/ext/tidy/tidy.stub.php b/ext/tidy/tidy.stub.php index 8b55c6b148dea..4030fa954d72a 100644 --- a/ext/tidy/tidy.stub.php +++ b/ext/tidy/tidy.stub.php @@ -75,13 +75,13 @@ public function parseFile(string $filename, array|string|null $config = null, ?s public function parseString(string $string, array|string|null $config = null, ?string $encoding = null) {} /** - * @return bool + * @return string|false * @alias tidy_repair_string */ public static function repairString(string $string, array|string|null $config = null, ?string $encoding = null) {} /** - * @return bool + * @return string|false * @alias tidy_repair_file */ public static function repairFile(string $filename, array|string|null $config = null, ?string $encoding = null, bool $useIncludePath = false) {} diff --git a/ext/tidy/tidy_arginfo.h b/ext/tidy/tidy_arginfo.h index fc56a7f5cfc9c..45f824865bc59 100644 --- a/ext/tidy/tidy_arginfo.h +++ b/ext/tidy/tidy_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 4042c33d3ea3f5fb87cfb696488f6280b6ec7e7f */ + * Stub hash: c4bbc901ca156da7cf0cbcc3c4019c7d3886959f */ ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_tidy_parse_string, 0, 1, tidy, MAY_BE_FALSE) ZEND_ARG_TYPE_INFO(0, string, IS_STRING, 0) diff --git a/ext/tokenizer/tests/bug80462.phpt b/ext/tokenizer/tests/bug80462.phpt new file mode 100644 index 0000000000000..068cea0833efc --- /dev/null +++ b/ext/tokenizer/tests/bug80462.phpt @@ -0,0 +1,22 @@ +--TEST-- +Bug #80462: Nullsafe operator tokenize with TOKEN_PARSE flag fails +--FILE-- +b();', TOKEN_PARSE) as $token) { + echo $token->getTokenName(), "\n"; +} + +?> +--EXPECT-- +T_OPEN_TAG +T_VARIABLE +T_WHITESPACE += +T_WHITESPACE +T_VARIABLE +T_NULLSAFE_OBJECT_OPERATOR +T_STRING +( +) +; diff --git a/ext/xml/tests/bug78563.phpt b/ext/xml/tests/bug78563.phpt index 3203bbddc6e03..a69b7b539a4b5 100644 --- a/ext/xml/tests/bug78563.phpt +++ b/ext/xml/tests/bug78563.phpt @@ -11,7 +11,7 @@ clone $parser; ?> ===DONE=== --EXPECTF-- -Fatal error: Uncaught Error: Trying to clone an uncloneable object of class XmlParser in %s:%d +Fatal error: Uncaught Error: Trying to clone an uncloneable object of class XMLParser in %s:%d Stack trace: #0 {main} thrown in %s on line %d diff --git a/ext/xml/tests/bug78563_final.phpt b/ext/xml/tests/bug78563_final.phpt index 23fac0d9bf4e6..e8a819f85b941 100644 --- a/ext/xml/tests/bug78563_final.phpt +++ b/ext/xml/tests/bug78563_final.phpt @@ -12,4 +12,4 @@ class Dummy extends Xmlparser { ?> ===DONE=== --EXPECTF-- -Fatal error: Class Dummy may not inherit from final class (XmlParser) in %s on line %d +Fatal error: Class Dummy may not inherit from final class (XMLParser) in %s on line %d diff --git a/ext/xml/tests/bug78563_serialize.phpt b/ext/xml/tests/bug78563_serialize.phpt index d480446d24912..05171dc79e57f 100644 --- a/ext/xml/tests/bug78563_serialize.phpt +++ b/ext/xml/tests/bug78563_serialize.phpt @@ -11,8 +11,8 @@ serialize($parser); ?> ===DONE=== --EXPECTF-- -Fatal error: Uncaught Exception: Serialization of 'XmlParser' is not allowed in %s:%d +Fatal error: Uncaught Exception: Serialization of 'XMLParser' is not allowed in %s:%d Stack trace: -#0 %s(%d): serialize(Object(XmlParser)) +#0 %s(%d): serialize(Object(XMLParser)) #1 {main} thrown in %s on line %d diff --git a/ext/xml/xml.c b/ext/xml/xml.c index 92e6745bccd22..306454573907d 100644 --- a/ext/xml/xml.c +++ b/ext/xml/xml.c @@ -254,7 +254,7 @@ static void php_xml_free_wrapper(void *ptr) PHP_MINIT_FUNCTION(xml) { zend_class_entry ce; - INIT_CLASS_ENTRY(ce, "XmlParser", class_XmlParser_methods); + INIT_CLASS_ENTRY(ce, "XMLParser", class_XMLParser_methods); xml_parser_ce = zend_register_internal_class(&ce); xml_parser_ce->create_object = xml_parser_create_object; xml_parser_ce->ce_flags |= ZEND_ACC_FINAL | ZEND_ACC_NO_DYNAMIC_PROPERTIES; @@ -423,7 +423,7 @@ static HashTable *xml_parser_get_gc(zend_object *object, zval **table, int *n) } static zend_function *xml_parser_get_constructor(zend_object *object) { - zend_throw_error(NULL, "Cannot directly construct XmlParser, use xml_parser_create() or xml_parser_create_ns() instead"); + zend_throw_error(NULL, "Cannot directly construct XMLParser, use xml_parser_create() or xml_parser_create_ns() instead"); return NULL; } diff --git a/ext/xml/xml.stub.php b/ext/xml/xml.stub.php index 22e49fa6fed61..6dc10d58b5b0e 100644 --- a/ext/xml/xml.stub.php +++ b/ext/xml/xml.stub.php @@ -2,67 +2,67 @@ /** @generate-function-entries */ -function xml_parser_create(?string $encoding = null): XmlParser {} +function xml_parser_create(?string $encoding = null): XMLParser {} -function xml_parser_create_ns(?string $encoding = null, string $separator = ":"): XmlParser {} +function xml_parser_create_ns(?string $encoding = null, string $separator = ":"): XMLParser {} -function xml_set_object(XmlParser $parser, object $object): bool {} +function xml_set_object(XMLParser $parser, object $object): bool {} /** * @param callable $start_handler * @param callable $end_handler */ -function xml_set_element_handler(XmlParser $parser, $start_handler, $end_handler): bool {} +function xml_set_element_handler(XMLParser $parser, $start_handler, $end_handler): bool {} /** @param callable $handler */ -function xml_set_character_data_handler(XmlParser $parser, $handler): bool {} +function xml_set_character_data_handler(XMLParser $parser, $handler): bool {} /** @param callable $handler */ -function xml_set_processing_instruction_handler(XmlParser $parser, $handler): bool {} +function xml_set_processing_instruction_handler(XMLParser $parser, $handler): bool {} /** @param callable $handler */ -function xml_set_default_handler(XmlParser $parser, $handler): bool {} +function xml_set_default_handler(XMLParser $parser, $handler): bool {} /** @param callable $handler */ -function xml_set_unparsed_entity_decl_handler(XmlParser $parser, $handler): bool {} +function xml_set_unparsed_entity_decl_handler(XMLParser $parser, $handler): bool {} /** @param callable $handler */ -function xml_set_notation_decl_handler(XmlParser $parser, $handler): bool {} +function xml_set_notation_decl_handler(XMLParser $parser, $handler): bool {} /** @param callable $handler */ -function xml_set_external_entity_ref_handler(XmlParser $parser, $handler): bool {} +function xml_set_external_entity_ref_handler(XMLParser $parser, $handler): bool {} /** @param callable $handler */ -function xml_set_start_namespace_decl_handler(XmlParser $parser, $handler): bool {} +function xml_set_start_namespace_decl_handler(XMLParser $parser, $handler): bool {} /** @param callable $handler */ -function xml_set_end_namespace_decl_handler(XmlParser $parser, $handler): bool {} +function xml_set_end_namespace_decl_handler(XMLParser $parser, $handler): bool {} -function xml_parse(XmlParser $parser, string $data, bool $is_final = false): int {} +function xml_parse(XMLParser $parser, string $data, bool $is_final = false): int {} /** * @param array $values * @param array $index */ -function xml_parse_into_struct(XmlParser $parser, string $data, &$values, &$index = null): int {} +function xml_parse_into_struct(XMLParser $parser, string $data, &$values, &$index = null): int {} -function xml_get_error_code(XmlParser $parser): int {} +function xml_get_error_code(XMLParser $parser): int {} function xml_error_string(int $error_code): ?string {} -function xml_get_current_line_number(XmlParser $parser): int {} +function xml_get_current_line_number(XMLParser $parser): int {} -function xml_get_current_column_number(XmlParser $parser): int {} +function xml_get_current_column_number(XMLParser $parser): int {} -function xml_get_current_byte_index(XmlParser $parser): int {} +function xml_get_current_byte_index(XMLParser $parser): int {} -function xml_parser_free(XmlParser $parser): bool {} +function xml_parser_free(XMLParser $parser): bool {} /** @param string|int $value */ -function xml_parser_set_option(XmlParser $parser, int $option, $value): bool {} +function xml_parser_set_option(XMLParser $parser, int $option, $value): bool {} -function xml_parser_get_option(XmlParser $parser, int $option): string|int {} +function xml_parser_get_option(XMLParser $parser, int $option): string|int {} -final class XmlParser +final class XMLParser { } diff --git a/ext/xml/xml_arginfo.h b/ext/xml/xml_arginfo.h index 227d4fdefa0b4..26187dad3dd57 100644 --- a/ext/xml/xml_arginfo.h +++ b/ext/xml/xml_arginfo.h @@ -1,28 +1,28 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 7014b171486b2a597f659369a707a592c26b3b2f */ + * Stub hash: d42215062c41775bae538cd310bc60e63fa06a8e */ -ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_xml_parser_create, 0, 0, XmlParser, 0) +ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_xml_parser_create, 0, 0, XMLParser, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, encoding, IS_STRING, 1, "null") ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_xml_parser_create_ns, 0, 0, XmlParser, 0) +ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_xml_parser_create_ns, 0, 0, XMLParser, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, encoding, IS_STRING, 1, "null") ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, separator, IS_STRING, 0, "\":\"") ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_xml_set_object, 0, 2, _IS_BOOL, 0) - ZEND_ARG_OBJ_INFO(0, parser, XmlParser, 0) + ZEND_ARG_OBJ_INFO(0, parser, XMLParser, 0) ZEND_ARG_TYPE_INFO(0, object, IS_OBJECT, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_xml_set_element_handler, 0, 3, _IS_BOOL, 0) - ZEND_ARG_OBJ_INFO(0, parser, XmlParser, 0) + ZEND_ARG_OBJ_INFO(0, parser, XMLParser, 0) ZEND_ARG_INFO(0, start_handler) ZEND_ARG_INFO(0, end_handler) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_xml_set_character_data_handler, 0, 2, _IS_BOOL, 0) - ZEND_ARG_OBJ_INFO(0, parser, XmlParser, 0) + ZEND_ARG_OBJ_INFO(0, parser, XMLParser, 0) ZEND_ARG_INFO(0, handler) ZEND_END_ARG_INFO() @@ -41,20 +41,20 @@ ZEND_END_ARG_INFO() #define arginfo_xml_set_end_namespace_decl_handler arginfo_xml_set_character_data_handler ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_xml_parse, 0, 2, IS_LONG, 0) - ZEND_ARG_OBJ_INFO(0, parser, XmlParser, 0) + ZEND_ARG_OBJ_INFO(0, parser, XMLParser, 0) ZEND_ARG_TYPE_INFO(0, data, IS_STRING, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, is_final, _IS_BOOL, 0, "false") ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_xml_parse_into_struct, 0, 3, IS_LONG, 0) - ZEND_ARG_OBJ_INFO(0, parser, XmlParser, 0) + ZEND_ARG_OBJ_INFO(0, parser, XMLParser, 0) ZEND_ARG_TYPE_INFO(0, data, IS_STRING, 0) ZEND_ARG_INFO(1, values) ZEND_ARG_INFO_WITH_DEFAULT_VALUE(1, index, "null") ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_xml_get_error_code, 0, 1, IS_LONG, 0) - ZEND_ARG_OBJ_INFO(0, parser, XmlParser, 0) + ZEND_ARG_OBJ_INFO(0, parser, XMLParser, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_xml_error_string, 0, 1, IS_STRING, 1) @@ -68,17 +68,17 @@ ZEND_END_ARG_INFO() #define arginfo_xml_get_current_byte_index arginfo_xml_get_error_code ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_xml_parser_free, 0, 1, _IS_BOOL, 0) - ZEND_ARG_OBJ_INFO(0, parser, XmlParser, 0) + ZEND_ARG_OBJ_INFO(0, parser, XMLParser, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_xml_parser_set_option, 0, 3, _IS_BOOL, 0) - ZEND_ARG_OBJ_INFO(0, parser, XmlParser, 0) + ZEND_ARG_OBJ_INFO(0, parser, XMLParser, 0) ZEND_ARG_TYPE_INFO(0, option, IS_LONG, 0) ZEND_ARG_INFO(0, value) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_xml_parser_get_option, 0, 2, MAY_BE_STRING|MAY_BE_LONG) - ZEND_ARG_OBJ_INFO(0, parser, XmlParser, 0) + ZEND_ARG_OBJ_INFO(0, parser, XMLParser, 0) ZEND_ARG_TYPE_INFO(0, option, IS_LONG, 0) ZEND_END_ARG_INFO() @@ -134,6 +134,6 @@ static const zend_function_entry ext_functions[] = { }; -static const zend_function_entry class_XmlParser_methods[] = { +static const zend_function_entry class_XMLParser_methods[] = { ZEND_FE_END }; diff --git a/ext/zend_test/test.c b/ext/zend_test/test.c index ef6d45b84986b..c44fdb481f354 100644 --- a/ext/zend_test/test.c +++ b/ext/zend_test/test.c @@ -39,6 +39,7 @@ ZEND_BEGIN_MODULE_GLOBALS(zend_test) int observer_show_init_backtrace; int observer_show_opcode; int observer_nesting_depth; + int replace_zend_execute_ex; ZEND_END_MODULE_GLOBALS(zend_test) ZEND_DECLARE_MODULE_GLOBALS(zend_test) @@ -332,10 +333,17 @@ PHP_INI_BEGIN() STD_PHP_INI_BOOLEAN("zend_test.observer.show_return_value", "0", PHP_INI_SYSTEM, OnUpdateBool, observer_show_return_value, zend_zend_test_globals, zend_test_globals) STD_PHP_INI_BOOLEAN("zend_test.observer.show_init_backtrace", "0", PHP_INI_SYSTEM, OnUpdateBool, observer_show_init_backtrace, zend_zend_test_globals, zend_test_globals) STD_PHP_INI_BOOLEAN("zend_test.observer.show_opcode", "0", PHP_INI_SYSTEM, OnUpdateBool, observer_show_opcode, zend_zend_test_globals, zend_test_globals) + STD_PHP_INI_BOOLEAN("zend_test.replace_zend_execute_ex", "0", PHP_INI_SYSTEM, OnUpdateBool, replace_zend_execute_ex, zend_zend_test_globals, zend_test_globals) PHP_INI_END() static zend_observer_fcall_handlers observer_fcall_init(zend_execute_data *execute_data); +void (*old_zend_execute_ex)(zend_execute_data *execute_data); +static void custom_zend_execute_ex(zend_execute_data *execute_data) +{ + old_zend_execute_ex(execute_data); +} + PHP_MINIT_FUNCTION(zend_test) { zend_class_entry class_entry; @@ -431,6 +439,11 @@ PHP_MINIT_FUNCTION(zend_test) (void)ini_entries; } + if (ZT_G(replace_zend_execute_ex)) { + old_zend_execute_ex = zend_execute_ex; + zend_execute_ex = custom_zend_execute_ex; + } + return SUCCESS; } @@ -480,7 +493,14 @@ static void get_retval_info(zval *retval, smart_str *buf) if (retval == NULL) { smart_str_appendl(buf, "NULL", 4); } else if (ZT_G(observer_show_return_value)) { - php_var_export_ex(retval, 2 * ZT_G(observer_nesting_depth) + 3, buf); + if (Z_TYPE_P(retval) == IS_OBJECT) { + smart_str_appendl(buf, "object(", 7); + smart_str_append(buf, Z_OBJCE_P(retval)->name); + smart_str_appendl(buf, ")#", 2); + smart_str_append_long(buf, Z_OBJ_HANDLE_P(retval)); + } else { + php_var_export_ex(retval, 2 * ZT_G(observer_nesting_depth) + 3, buf); + } } else if (ZT_G(observer_show_return_type)) { smart_str_appends(buf, zend_zval_type_name(retval)); } diff --git a/ext/zend_test/tests/observer_error_01.phpt b/ext/zend_test/tests/observer_error_01.phpt new file mode 100644 index 0000000000000..5ea619f32414c --- /dev/null +++ b/ext/zend_test/tests/observer_error_01.phpt @@ -0,0 +1,29 @@ +--TEST-- +Observer: End handlers fire after a fatal error +--SKIPIF-- + +--INI-- +zend_test.observer.enabled=1 +zend_test.observer.observe_all=1 +zend_test.observer.show_return_value=1 +memory_limit=1M +--FILE-- + +--EXPECTF-- + + + + + +Fatal error: Allowed memory size of 2097152 bytes exhausted%s(tried to allocate %d bytes) in %s on line %d + + diff --git a/ext/zend_test/tests/observer_error_02.phpt b/ext/zend_test/tests/observer_error_02.phpt new file mode 100644 index 0000000000000..959544e9b8e9a --- /dev/null +++ b/ext/zend_test/tests/observer_error_02.phpt @@ -0,0 +1,28 @@ +--TEST-- +Observer: End handlers fire after a userland fatal error +--SKIPIF-- + +--INI-- +zend_test.observer.enabled=1 +zend_test.observer.observe_all=1 +zend_test.observer.show_return_value=1 +--FILE-- + +--EXPECTF-- + + + + + +Fatal error: Foo error in %s on line %d + + diff --git a/ext/zend_test/tests/observer_error_03.phpt b/ext/zend_test/tests/observer_error_03.phpt new file mode 100644 index 0000000000000..3d8150a440754 --- /dev/null +++ b/ext/zend_test/tests/observer_error_03.phpt @@ -0,0 +1,39 @@ +--TEST-- +Observer: non-fatal errors do not fire end handlers prematurely +--SKIPIF-- + +--INI-- +zend_test.observer.enabled=1 +zend_test.observer.observe_all=1 +zend_test.observer.show_return_value=1 +--FILE-- + +--EXPECTF-- + + + +
+ + + +Warning: Undefined variable $this_does_not_exit in %s on line %d + +After error. + +Done. + diff --git a/ext/zend_test/tests/observer_error_04.phpt b/ext/zend_test/tests/observer_error_04.phpt new file mode 100644 index 0000000000000..ca2532a06ba9d --- /dev/null +++ b/ext/zend_test/tests/observer_error_04.phpt @@ -0,0 +1,46 @@ +--TEST-- +Observer: fatal errors caught with zend_try will not fire end handlers prematurely +--SKIPIF-- + + +--INI-- +zend_test.observer.enabled=1 +zend_test.observer.observe_all=1 +zend_test.observer.show_return_value=1 +--FILE-- +getMessage() . PHP_EOL; +} + +echo 'Done.' . PHP_EOL; +?> +--EXPECTF-- + + + +
+ + + + + + +SOAP-ERROR: Parsing WSDL: Couldn't load from 'foo' : failed to load external entity "foo" + +Done. + diff --git a/ext/zend_test/tests/observer_retval_01.phpt b/ext/zend_test/tests/observer_retval_01.phpt new file mode 100644 index 0000000000000..d58cac807d268 --- /dev/null +++ b/ext/zend_test/tests/observer_retval_01.phpt @@ -0,0 +1,29 @@ +--TEST-- +Observer: Retvals are observable that are: IS_CONST +--SKIPIF-- + +--INI-- +zend_test.observer.enabled=1 +zend_test.observer.observe_all=1 +zend_test.observer.show_return_value=1 +--FILE-- + +--EXPECTF-- + + + + + + + +Done + diff --git a/ext/zend_test/tests/observer_retval_02.phpt b/ext/zend_test/tests/observer_retval_02.phpt new file mode 100644 index 0000000000000..6b2e3548a2aac --- /dev/null +++ b/ext/zend_test/tests/observer_retval_02.phpt @@ -0,0 +1,32 @@ +--TEST-- +Observer: Unused retvals from generators are still observable +--SKIPIF-- + +--INI-- +zend_test.observer.enabled=1 +zend_test.observer.observe_all=1 +zend_test.observer.show_return_value=1 +--FILE-- +current(); +$gen->next(); +$gen->current(); + +echo 'Done' . PHP_EOL; +?> +--EXPECTF-- + + + + + + + +Done + diff --git a/ext/zend_test/tests/observer_retval_03.phpt b/ext/zend_test/tests/observer_retval_03.phpt new file mode 100644 index 0000000000000..a21ed97c25363 --- /dev/null +++ b/ext/zend_test/tests/observer_retval_03.phpt @@ -0,0 +1,32 @@ +--TEST-- +Observer: Retvals are observable that are: refcounted, IS_CV +--SKIPIF-- + +--INI-- +zend_test.observer.enabled=1 +zend_test.observer.observe_all=1 +zend_test.observer.show_return_value=1 +--FILE-- + +--EXPECTF-- + + + + + + + +Done + diff --git a/ext/zend_test/tests/observer_retval_04.phpt b/ext/zend_test/tests/observer_retval_04.phpt new file mode 100644 index 0000000000000..883dd85498fb4 --- /dev/null +++ b/ext/zend_test/tests/observer_retval_04.phpt @@ -0,0 +1,52 @@ +--TEST-- +Observer: Retvals are observable that are: refcounted, IS_VAR +--SKIPIF-- + +--INI-- +zend_test.observer.enabled=1 +zend_test.observer.observe_all=1 +zend_test.observer.show_return_value=1 +--FILE-- + +--EXPECTF-- + + + + + + + + + + + + + + + + + +Done + diff --git a/ext/zend_test/tests/observer_retval_05.phpt b/ext/zend_test/tests/observer_retval_05.phpt new file mode 100644 index 0000000000000..45fe981f29abe --- /dev/null +++ b/ext/zend_test/tests/observer_retval_05.phpt @@ -0,0 +1,33 @@ +--TEST-- +Observer: Retvals are observable that are: IS_CV, IS_UNDEF +--SKIPIF-- + +--INI-- +zend_test.observer.enabled=1 +zend_test.observer.observe_all=1 +zend_test.observer.show_return_value=1 +--FILE-- + +--EXPECTF-- + + + + + +Warning: Undefined variable $i_do_not_exist in %s on line %d + + + +Warning: Undefined variable $i_do_not_exist in %s on line %d + +Done + diff --git a/ext/zend_test/tests/observer_retval_06.phpt b/ext/zend_test/tests/observer_retval_06.phpt new file mode 100644 index 0000000000000..f5d2988725f60 --- /dev/null +++ b/ext/zend_test/tests/observer_retval_06.phpt @@ -0,0 +1,30 @@ +--TEST-- +Observer: Retvals are observable that are: IS_CV +--SKIPIF-- + +--INI-- +zend_test.observer.enabled=1 +zend_test.observer.observe_all=1 +zend_test.observer.show_return_value=1 +--FILE-- + +--EXPECTF-- + + + + + + + +Done + diff --git a/ext/zend_test/tests/observer_retval_07.phpt b/ext/zend_test/tests/observer_retval_07.phpt new file mode 100644 index 0000000000000..abd518b0e423c --- /dev/null +++ b/ext/zend_test/tests/observer_retval_07.phpt @@ -0,0 +1,39 @@ +--TEST-- +Observer: Retvals are observable that are: IS_REFERENCE, IS_VAR +--SKIPIF-- + +--INI-- +zend_test.observer.enabled=1 +zend_test.observer.observe_all=1 +zend_test.observer.show_return_value=1 +--FILE-- + +--EXPECTF-- + + + + + + + + + + + + +Done + diff --git a/ext/zend_test/tests/observer_retval_by_ref_01.phpt b/ext/zend_test/tests/observer_retval_by_ref_01.phpt new file mode 100644 index 0000000000000..4e96ab010bd78 --- /dev/null +++ b/ext/zend_test/tests/observer_retval_by_ref_01.phpt @@ -0,0 +1,30 @@ +--TEST-- +Observer: Retvals by reference are observable that are: IS_CV +--SKIPIF-- + +--INI-- +zend_test.observer.enabled=1 +zend_test.observer.observe_all=1 +zend_test.observer.show_return_value=1 +--FILE-- + +--EXPECTF-- + + + + + + + +Done + diff --git a/ext/zend_test/tests/observer_retval_by_ref_02.phpt b/ext/zend_test/tests/observer_retval_by_ref_02.phpt new file mode 100644 index 0000000000000..b056a80ce7d12 --- /dev/null +++ b/ext/zend_test/tests/observer_retval_by_ref_02.phpt @@ -0,0 +1,34 @@ +--TEST-- +Observer: Retvals by reference are observable that are: IS_TMP_VAR +--SKIPIF-- + +--INI-- +zend_test.observer.enabled=1 +zend_test.observer.observe_all=1 +zend_test.observer.show_return_value=1 +--FILE-- + +--EXPECTF-- + + + + + +Notice: Only variable references should be returned by reference in %s on line %d + + + +Notice: Only variable references should be returned by reference in %s on line %d + +Done + diff --git a/ext/zend_test/tests/observer_retval_by_ref_03.phpt b/ext/zend_test/tests/observer_retval_by_ref_03.phpt new file mode 100644 index 0000000000000..50fe23add1ff9 --- /dev/null +++ b/ext/zend_test/tests/observer_retval_by_ref_03.phpt @@ -0,0 +1,42 @@ +--TEST-- +Observer: Retvals by reference are observable that are: IS_VAR, ZEND_RETURNS_FUNCTION +--SKIPIF-- + +--INI-- +zend_test.observer.enabled=1 +zend_test.observer.observe_all=1 +zend_test.observer.show_return_value=1 +--FILE-- + +--EXPECTF-- + + + + + + + + +Notice: Only variable references should be returned by reference in %s on line %d + + + + + +Notice: Only variable references should be returned by reference in %s on line %d + +Done + diff --git a/ext/zend_test/tests/observer_shutdown_01.phpt b/ext/zend_test/tests/observer_shutdown_01.phpt new file mode 100644 index 0000000000000..16ea9cef0e227 --- /dev/null +++ b/ext/zend_test/tests/observer_shutdown_01.phpt @@ -0,0 +1,44 @@ +--TEST-- +Observer: Function calls from a shutdown handler are observable +--SKIPIF-- + +--INI-- +zend_test.observer.enabled=1 +zend_test.observer.observe_all=1 +zend_test.observer.show_return_value=1 +--FILE-- + +--EXPECTF-- + + + + + +Done: 42 + + +<{closure}> + + + + + + + +Shutdown: 42 + diff --git a/ext/zend_test/tests/observer_shutdown_02.phpt b/ext/zend_test/tests/observer_shutdown_02.phpt new file mode 100644 index 0000000000000..ad6c906585656 --- /dev/null +++ b/ext/zend_test/tests/observer_shutdown_02.phpt @@ -0,0 +1,50 @@ +--TEST-- +Observer: Function calls from a __destruct during shutdown are observable +--SKIPIF-- + +--INI-- +zend_test.observer.enabled=1 +zend_test.observer.observe_all=1 +zend_test.observer.show_return_value=1 +--FILE-- + +--EXPECTF-- + + + + + +Done: 42 + + + + + + + + + + +Shutdown: 42 + diff --git a/ext/zip/php_zip.h b/ext/zip/php_zip.h index 67fd87d6dae0b..d069d2dbbc290 100644 --- a/ext/zip/php_zip.h +++ b/ext/zip/php_zip.h @@ -31,7 +31,7 @@ extern zend_module_entry zip_module_entry; #define ZIP_OVERWRITE ZIP_TRUNCATE #endif -#define PHP_ZIP_VERSION "1.19.1" +#define PHP_ZIP_VERSION "1.19.2" #define ZIP_OPENBASEDIR_CHECKPATH(filename) php_check_open_basedir(filename) diff --git a/ext/zlib/tests/bug48725.phpt b/ext/zlib/tests/bug48725.phpt new file mode 100644 index 0000000000000..0d04887a2db92 --- /dev/null +++ b/ext/zlib/tests/bug48725.phpt @@ -0,0 +1,24 @@ +--TEST-- +Bug #48725 (Support for flushing in zlib stream) +--SKIPIF-- + +--FILE-- + +--EXPECT-- +string(138) "ecc7c901c0100000b09594bac641d97f840e22f9253c31bdb9d4d6c75cdf3ec1ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddaffc0f0000ffff" +int(69) diff --git a/ext/zlib/tests/bug48725_2.phpt b/ext/zlib/tests/bug48725_2.phpt new file mode 100644 index 0000000000000..168afd8d3dc54 --- /dev/null +++ b/ext/zlib/tests/bug48725_2.phpt @@ -0,0 +1,15 @@ +--TEST-- +Bug #48725 (Support for flushing in zlib stream) +--SKIPIF-- + +--FILE-- + +--EXPECT-- +72cbcf57484a2c02e22a00000000ffff0300 diff --git a/ext/zlib/zlib_filter.c b/ext/zlib/zlib_filter.c index cffa65f488df2..cdd981afde217 100644 --- a/ext/zlib/zlib_filter.c +++ b/ext/zlib/zlib_filter.c @@ -27,7 +27,7 @@ typedef struct _php_zlib_filter_data { unsigned char *outbuf; size_t outbuf_len; int persistent; - zend_bool finished; + zend_bool finished; /* for zlib.deflate: signals that no flush is pending */ } php_zlib_filter_data; /* }}} */ @@ -88,7 +88,7 @@ static php_stream_filter_status_t php_zlib_inflate_filter( inflateEnd(&(data->strm)); data->finished = '\1'; exit_status = PSFS_PASS_ON; - } else if (status != Z_OK) { + } else if (status != Z_OK && status != Z_BUF_ERROR) { /* Something bad happened */ php_error_docref(NULL, E_NOTICE, "zlib: %s", zError(status)); php_stream_bucket_delref(bucket); @@ -195,6 +195,8 @@ static php_stream_filter_status_t php_zlib_deflate_filter( bucket = php_stream_bucket_make_writeable(bucket); while (bin < (unsigned int) bucket->buflen) { + int flush_mode; + desired = bucket->buflen - bin; if (desired > data->inbuf_len) { desired = data->inbuf_len; @@ -202,7 +204,9 @@ static php_stream_filter_status_t php_zlib_deflate_filter( memcpy(data->strm.next_in, bucket->buf + bin, desired); data->strm.avail_in = desired; - status = deflate(&(data->strm), flags & PSFS_FLAG_FLUSH_CLOSE ? Z_FULL_FLUSH : (flags & PSFS_FLAG_FLUSH_INC ? Z_SYNC_FLUSH : Z_NO_FLUSH)); + flush_mode = flags & PSFS_FLAG_FLUSH_CLOSE ? Z_FULL_FLUSH : (flags & PSFS_FLAG_FLUSH_INC ? Z_SYNC_FLUSH : Z_NO_FLUSH); + data->finished = flush_mode != Z_NO_FLUSH; + status = deflate(&(data->strm), flush_mode); if (status != Z_OK) { /* Something bad happened */ php_stream_bucket_delref(bucket); @@ -229,11 +233,12 @@ static php_stream_filter_status_t php_zlib_deflate_filter( php_stream_bucket_delref(bucket); } - if (flags & PSFS_FLAG_FLUSH_CLOSE) { + if (flags & PSFS_FLAG_FLUSH_CLOSE || ((flags & PSFS_FLAG_FLUSH_INC) && !data->finished)) { /* Spit it out! */ status = Z_OK; while (status == Z_OK) { - status = deflate(&(data->strm), Z_FINISH); + status = deflate(&(data->strm), (flags & PSFS_FLAG_FLUSH_CLOSE ? Z_FINISH : Z_SYNC_FLUSH)); + data->finished = 1; if (data->strm.avail_out < data->outbuf_len) { size_t bucketlen = data->outbuf_len - data->strm.avail_out; @@ -394,6 +399,7 @@ static php_stream_filter *php_zlib_filter_create(const char *filtername, zval *f } } status = deflateInit2(&(data->strm), level, Z_DEFLATED, windowBits, memLevel, 0); + data->finished = 1; fops = &php_zlib_deflate_ops; } else { status = Z_DATA_ERROR; diff --git a/main/main.c b/main/main.c index 8a860505f98c6..8ab7c55067227 100644 --- a/main/main.c +++ b/main/main.c @@ -1110,13 +1110,6 @@ PHPAPI ZEND_COLD void php_error_docref2(const char *docref, const char *param1, #ifdef PHP_WIN32 PHPAPI ZEND_COLD void php_win32_docref2_from_error(DWORD error, const char *param1, const char *param2) { char *buf = php_win32_error_to_msg(error); - size_t buf_len; - - buf_len = strlen(buf); - if (buf_len >= 2) { - buf[buf_len - 1] = '\0'; - buf[buf_len - 2] = '\0'; - } php_error_docref2(NULL, param1, param2, E_WARNING, "%s (code: %lu)", buf, error); php_win32_error_msg_free(buf); } @@ -1747,6 +1740,11 @@ void php_request_shutdown(void *dummy) php_deactivate_ticks(); + /* 0. Call any open observer end handlers that are still open after a zend_bailout */ + if (ZEND_OBSERVER_ENABLED) { + zend_observer_fcall_end_all(); + } + /* 1. Call all possible shutdown functions registered with register_shutdown_function() */ if (PG(modules_activated)) { php_call_shutdown_functions(); diff --git a/main/php_streams.h b/main/php_streams.h index 1bd66686071da..60be0a79eb49b 100644 --- a/main/php_streams.h +++ b/main/php_streams.h @@ -181,6 +181,10 @@ struct _php_stream_wrapper { #define PHP_STREAM_FLAG_NO_FCLOSE 0x80 +/* Suppress generation of PHP warnings on stream read/write errors. + * Currently for internal use only. */ +#define PHP_STREAM_FLAG_SUPPRESS_ERRORS 0x100 + #define PHP_STREAM_FLAG_WAS_WRITTEN 0x80000000 struct _php_stream { diff --git a/main/streams/plain_wrapper.c b/main/streams/plain_wrapper.c index 0373cc4c94753..a63c225a0da55 100644 --- a/main/streams/plain_wrapper.c +++ b/main/streams/plain_wrapper.c @@ -358,7 +358,9 @@ static ssize_t php_stdiop_write(php_stream *stream, const char *buf, size_t coun /* TODO: Should this be treated as a proper error or not? */ return bytes_written; } - php_error_docref(NULL, E_NOTICE, "Write of %zu bytes failed with errno=%d %s", count, errno, strerror(errno)); + if (!(stream->flags & PHP_STREAM_FLAG_SUPPRESS_ERRORS)) { + php_error_docref(NULL, E_NOTICE, "Write of %zu bytes failed with errno=%d %s", count, errno, strerror(errno)); + } } return bytes_written; } else { @@ -426,7 +428,9 @@ static ssize_t php_stdiop_read(php_stream *stream, char *buf, size_t count) } else if (errno == EINTR) { /* TODO: Should this be treated as a proper error or not? */ } else { - php_error_docref(NULL, E_NOTICE, "Read of %zu bytes failed with errno=%d %s", count, errno, strerror(errno)); + if (!(stream->flags & PHP_STREAM_FLAG_SUPPRESS_ERRORS)) { + php_error_docref(NULL, E_NOTICE, "Read of %zu bytes failed with errno=%d %s", count, errno, strerror(errno)); + } /* TODO: Remove this special-case? */ if (errno != EBADF) { diff --git a/main/streams/streams.c b/main/streams/streams.c index 1262c874f7e88..0524bd28a2a6e 100644 --- a/main/streams/streams.c +++ b/main/streams/streams.c @@ -565,7 +565,7 @@ PHPAPI int _php_stream_fill_read_buffer(php_stream *stream, size_t size) /* after this call, bucket is owned by the brigade */ php_stream_bucket_append(brig_inp, bucket); - flags = PSFS_FLAG_NORMAL; + flags = stream->eof ? PSFS_FLAG_FLUSH_CLOSE : PSFS_FLAG_NORMAL; } else { flags = stream->eof ? PSFS_FLAG_FLUSH_CLOSE : PSFS_FLAG_FLUSH_INC; } diff --git a/main/streams/xp_socket.c b/main/streams/xp_socket.c index cd67fcb8ca340..34dc4f20374ff 100644 --- a/main/streams/xp_socket.c +++ b/main/streams/xp_socket.c @@ -104,10 +104,13 @@ static ssize_t php_sockop_write(php_stream *stream, const char *buf, size_t coun } } - estr = php_socket_strerror(err, NULL, 0); - php_error_docref(NULL, E_NOTICE, "Send of " ZEND_LONG_FMT " bytes failed with errno=%d %s", + if (!(stream->flags & PHP_STREAM_FLAG_SUPPRESS_ERRORS)) { + estr = php_socket_strerror(err, NULL, 0); + php_error_docref(NULL, E_NOTICE, + "Send of " ZEND_LONG_FMT " bytes failed with errno=%d %s", (zend_long)count, err, estr); - efree(estr); + efree(estr); + } } if (didwrite > 0) { diff --git a/php.ini-development b/php.ini-development index 65532be9e230e..2061266e4c885 100644 --- a/php.ini-development +++ b/php.ini-development @@ -17,7 +17,7 @@ ; 6. The directory from the --with-config-file-path compile time option, or the ; Windows directory (usually C:\windows) ; See the PHP docs for more specific information. -; http://php.net/configuration.file +; https://php.net/configuration.file ; The syntax of the file is extremely simple. Whitespace and lines ; beginning with a semicolon are silently ignored (as you probably guessed). @@ -31,7 +31,7 @@ ; special sections cannot be overridden by user-defined INI files or ; at runtime. Currently, [PATH=] and [HOST=] sections only work under ; CGI/FastCGI. -; http://php.net/ini.sections +; https://php.net/ini.sections ; Directives are specified using the following syntax: ; directive = value @@ -181,7 +181,7 @@ ;;;;;;;;;;;;;;;;;;;; ; Enable the PHP scripting language engine under Apache. -; http://php.net/engine +; https://php.net/engine engine = On ; This directive determines whether or not PHP will recognize code between @@ -194,11 +194,11 @@ engine = On ; Default Value: On ; Development Value: Off ; Production Value: Off -; http://php.net/short-open-tag +; https://php.net/short-open-tag short_open_tag = Off ; The number of significant digits displayed in floating point numbers. -; http://php.net/precision +; https://php.net/precision precision = 14 ; Output buffering is a mechanism for controlling how much output data @@ -222,7 +222,7 @@ precision = 14 ; Default Value: Off ; Development Value: 4096 ; Production Value: 4096 -; http://php.net/output-buffering +; https://php.net/output-buffering output_buffering = 4096 ; You can redirect all of the output of your scripts to a function. For @@ -237,7 +237,7 @@ output_buffering = 4096 ; and you cannot use both "ob_gzhandler" and "zlib.output_compression". ; Note: output_handler must be empty if this is set 'On' !!!! ; Instead you must use zlib.output_handler. -; http://php.net/output-handler +; https://php.net/output-handler ;output_handler = ; URL rewriter function rewrites URL on the fly by using @@ -266,16 +266,16 @@ output_buffering = 4096 ; performance, enable output_buffering in addition. ; Note: You need to use zlib.output_handler instead of the standard ; output_handler, or otherwise the output will be corrupted. -; http://php.net/zlib.output-compression +; https://php.net/zlib.output-compression zlib.output_compression = Off -; http://php.net/zlib.output-compression-level +; https://php.net/zlib.output-compression-level ;zlib.output_compression_level = -1 ; You cannot specify additional output handlers if zlib.output_compression ; is activated here. This setting does the same as output_handler but in ; a different order. -; http://php.net/zlib.output-handler +; https://php.net/zlib.output-handler ;zlib.output_handler = ; Implicit flush tells PHP to tell the output layer to flush itself @@ -283,7 +283,7 @@ zlib.output_compression = Off ; PHP function flush() after each and every call to print() or echo() and each ; and every HTML block. Turning this option on has serious performance ; implications and is generally recommended for debugging purposes only. -; http://php.net/implicit-flush +; https://php.net/implicit-flush ; Note: This directive is hardcoded to On for the CLI SAPI implicit_flush = Off @@ -314,22 +314,22 @@ serialize_precision = -1 ; and below. This directive makes most sense if used in a per-directory ; or per-virtualhost web server configuration file. ; Note: disables the realpath cache -; http://php.net/open-basedir +; https://php.net/open-basedir ;open_basedir = ; This directive allows you to disable certain functions. ; It receives a comma-delimited list of function names. -; http://php.net/disable-functions +; https://php.net/disable-functions disable_functions = ; This directive allows you to disable certain classes. ; It receives a comma-delimited list of class names. -; http://php.net/disable-classes +; https://php.net/disable-classes disable_classes = ; Colors for Syntax Highlighting mode. Anything that's acceptable in ; would work. -; http://php.net/syntax-highlighting +; https://php.net/syntax-highlighting ;highlight.string = #DD0000 ;highlight.comment = #FF9900 ;highlight.keyword = #007700 @@ -340,24 +340,24 @@ disable_classes = ; the request. Consider enabling it if executing long requests, which may end up ; being interrupted by the user or a browser timing out. PHP's default behavior ; is to disable this feature. -; http://php.net/ignore-user-abort +; https://php.net/ignore-user-abort ;ignore_user_abort = On ; Determines the size of the realpath cache to be used by PHP. This value should ; be increased on systems where PHP opens many files to reflect the quantity of ; the file operations performed. ; Note: if open_basedir is set, the cache is disabled -; http://php.net/realpath-cache-size +; https://php.net/realpath-cache-size ;realpath_cache_size = 4096k ; Duration of time, in seconds for which to cache realpath information for a given ; file or directory. For systems with rarely changing files, consider increasing this ; value. -; http://php.net/realpath-cache-ttl +; https://php.net/realpath-cache-ttl ;realpath_cache_ttl = 120 ; Enables or disables the circular reference collector. -; http://php.net/zend.enable-gc +; https://php.net/zend.enable-gc zend.enable_gc = On ; If enabled, scripts may be written in encodings that are incompatible with @@ -394,7 +394,7 @@ zend.exception_string_param_max_len = 15 ; (e.g. by adding its signature to the Web server header). It is no security ; threat in any way, but it makes it possible to determine whether you use PHP ; on your server or not. -; http://php.net/expose-php +; https://php.net/expose-php expose_php = On ;;;;;;;;;;;;;;;;;;; @@ -402,7 +402,7 @@ expose_php = On ;;;;;;;;;;;;;;;;;;; ; Maximum execution time of each script, in seconds -; http://php.net/max-execution-time +; https://php.net/max-execution-time ; Note: This directive is hardcoded to 0 for the CLI SAPI max_execution_time = 30 @@ -413,18 +413,18 @@ max_execution_time = 30 ; Default Value: -1 (Unlimited) ; Development Value: 60 (60 seconds) ; Production Value: 60 (60 seconds) -; http://php.net/max-input-time +; https://php.net/max-input-time max_input_time = 60 ; Maximum input variable nesting level -; http://php.net/max-input-nesting-level +; https://php.net/max-input-nesting-level ;max_input_nesting_level = 64 ; How many GET/POST/COOKIE input variables may be accepted ;max_input_vars = 1000 ; Maximum amount of memory a script may consume -; http://php.net/memory-limit +; https://php.net/memory-limit memory_limit = 128M ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -480,7 +480,7 @@ memory_limit = 128M ; Default Value: E_ALL ; Development Value: E_ALL ; Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT -; http://php.net/error-reporting +; https://php.net/error-reporting error_reporting = E_ALL ; This directive controls whether or not and where PHP will output errors, @@ -497,7 +497,7 @@ error_reporting = E_ALL ; Default Value: On ; Development Value: On ; Production Value: Off -; http://php.net/display-errors +; https://php.net/display-errors display_errors = On ; The display of errors which occur during PHP's startup sequence are handled @@ -506,7 +506,7 @@ display_errors = On ; Default Value: On ; Development Value: On ; Production Value: Off -; http://php.net/display-startup-errors +; https://php.net/display-startup-errors display_startup_errors = On ; Besides displaying errors, PHP can also log errors to locations such as a @@ -516,36 +516,36 @@ display_startup_errors = On ; Default Value: Off ; Development Value: On ; Production Value: On -; http://php.net/log-errors +; https://php.net/log-errors log_errors = On ; Set maximum length of log_errors. In error_log information about the source is ; added. The default is 1024 and 0 allows to not apply any maximum length at all. -; http://php.net/log-errors-max-len +; https://php.net/log-errors-max-len log_errors_max_len = 1024 ; Do not log repeated messages. Repeated errors must occur in same file on same ; line unless ignore_repeated_source is set true. -; http://php.net/ignore-repeated-errors +; https://php.net/ignore-repeated-errors ignore_repeated_errors = Off ; Ignore source of message when ignoring repeated messages. When this setting ; is On you will not log errors with repeated messages from different files or ; source lines. -; http://php.net/ignore-repeated-source +; https://php.net/ignore-repeated-source ignore_repeated_source = Off ; If this parameter is set to Off, then memory leaks will not be shown (on ; stdout or in the log). This is only effective in a debug compile, and if ; error reporting includes E_WARNING in the allowed list -; http://php.net/report-memleaks +; https://php.net/report-memleaks report_memleaks = On ; This setting is off by default. ;report_zend_debug = 0 ; Turn off normal error reporting and emit XML-RPC error XML -; http://php.net/xmlrpc-errors +; https://php.net/xmlrpc-errors ;xmlrpc_errors = 0 ; An XML-RPC faultCode @@ -555,40 +555,40 @@ report_memleaks = On ; error message as HTML for easier reading. This directive controls whether ; the error message is formatted as HTML or not. ; Note: This directive is hardcoded to Off for the CLI SAPI -; http://php.net/html-errors +; https://php.net/html-errors ;html_errors = On ; If html_errors is set to On *and* docref_root is not empty, then PHP ; produces clickable error messages that direct to a page describing the error ; or function causing the error in detail. -; You can download a copy of the PHP manual from http://php.net/docs +; You can download a copy of the PHP manual from https://php.net/docs ; and change docref_root to the base URL of your local copy including the ; leading '/'. You must also specify the file extension being used including ; the dot. PHP's default behavior is to leave these settings empty, in which ; case no links to documentation are generated. ; Note: Never use this feature for production boxes. -; http://php.net/docref-root +; https://php.net/docref-root ; Examples ;docref_root = "/phpmanual/" -; http://php.net/docref-ext +; https://php.net/docref-ext ;docref_ext = .html ; String to output before an error message. PHP's default behavior is to leave ; this setting blank. -; http://php.net/error-prepend-string +; https://php.net/error-prepend-string ; Example: ;error_prepend_string = "" ; String to output after an error message. PHP's default behavior is to leave ; this setting blank. -; http://php.net/error-append-string +; https://php.net/error-append-string ; Example: ;error_append_string = "" ; Log errors to specified file. PHP's default behavior is to leave this value ; empty. -; http://php.net/error-log +; https://php.net/error-log ; Example: ;error_log = php_errors.log ; Log errors to syslog (Event Log on Windows). @@ -611,7 +611,7 @@ report_memleaks = On ; no-ctrl (all characters except control characters) ; all (all characters) ; raw (like "all", but messages are not split at newlines) -; http://php.net/syslog.filter +; https://php.net/syslog.filter ;syslog.filter = ascii ;windows.show_crt_warning @@ -625,14 +625,14 @@ report_memleaks = On ; The separator used in PHP generated URLs to separate arguments. ; PHP's default setting is "&". -; http://php.net/arg-separator.output +; https://php.net/arg-separator.output ; Example: ;arg_separator.output = "&" ; List of separator(s) used by PHP to parse input URLs into variables. ; PHP's default setting is "&". ; NOTE: Every character in this directive is considered as separator! -; http://php.net/arg-separator.input +; https://php.net/arg-separator.input ; Example: ;arg_separator.input = ";&" @@ -646,7 +646,7 @@ report_memleaks = On ; Default Value: "EGPCS" ; Development Value: "GPCS" ; Production Value: "GPCS"; -; http://php.net/variables-order +; https://php.net/variables-order variables_order = "GPCS" ; This directive determines which super global data (G,P & C) should be @@ -659,7 +659,7 @@ variables_order = "GPCS" ; Default Value: None ; Development Value: "GP" ; Production Value: "GP" -; http://php.net/request-order +; https://php.net/request-order request_order = "GP" ; This directive determines whether PHP registers $argv & $argc each time it @@ -674,7 +674,7 @@ request_order = "GP" ; Default Value: On ; Development Value: Off ; Production Value: Off -; http://php.net/register-argc-argv +; https://php.net/register-argc-argv register_argc_argv = Off ; When enabled, the ENV, REQUEST and SERVER variables are created when they're @@ -682,7 +682,7 @@ register_argc_argv = Off ; variables are not used within a script, having this directive on will result ; in a performance gain. The PHP directive register_argc_argv must be disabled ; for this directive to have any effect. -; http://php.net/auto-globals-jit +; https://php.net/auto-globals-jit auto_globals_jit = On ; Whether PHP will read the POST data. @@ -691,48 +691,48 @@ auto_globals_jit = On ; and $_FILES to always be empty; the only way you will be able to read the ; POST data will be through the php://input stream wrapper. This can be useful ; to proxy requests or to process the POST data in a memory efficient fashion. -; http://php.net/enable-post-data-reading +; https://php.net/enable-post-data-reading ;enable_post_data_reading = Off ; Maximum size of POST data that PHP will accept. ; Its value may be 0 to disable the limit. It is ignored if POST data reading ; is disabled through enable_post_data_reading. -; http://php.net/post-max-size +; https://php.net/post-max-size post_max_size = 8M ; Automatically add files before PHP document. -; http://php.net/auto-prepend-file +; https://php.net/auto-prepend-file auto_prepend_file = ; Automatically add files after PHP document. -; http://php.net/auto-append-file +; https://php.net/auto-append-file auto_append_file = ; By default, PHP will output a media type using the Content-Type header. To ; disable this, simply set it to be empty. ; ; PHP's built-in default media type is set to text/html. -; http://php.net/default-mimetype +; https://php.net/default-mimetype default_mimetype = "text/html" ; PHP's default character set is set to UTF-8. -; http://php.net/default-charset +; https://php.net/default-charset default_charset = "UTF-8" ; PHP internal character encoding is set to empty. ; If empty, default_charset is used. -; http://php.net/internal-encoding +; https://php.net/internal-encoding ;internal_encoding = ; PHP input character encoding is set to empty. ; If empty, default_charset is used. -; http://php.net/input-encoding +; https://php.net/input-encoding ;input_encoding = ; PHP output character encoding is set to empty. ; If empty, default_charset is used. ; See also output_buffer. -; http://php.net/output-encoding +; https://php.net/output-encoding ;output_encoding = ;;;;;;;;;;;;;;;;;;;;;;;;; @@ -746,23 +746,23 @@ default_charset = "UTF-8" ;include_path = ".;c:\php\includes" ; ; PHP's default setting for include_path is ".;/path/to/php/pear" -; http://php.net/include-path +; https://php.net/include-path ; The root of the PHP pages, used only if nonempty. ; if PHP was not compiled with FORCE_REDIRECT, you SHOULD set doc_root ; if you are running php as a CGI under any web server (other than IIS) ; see documentation for security issues. The alternate is to use the ; cgi.force_redirect configuration below -; http://php.net/doc-root +; https://php.net/doc-root doc_root = ; The directory under which PHP opens the script using /~username used only ; if nonempty. -; http://php.net/user-dir +; https://php.net/user-dir user_dir = ; Directory in which the loadable extensions (modules) reside. -; http://php.net/extension-dir +; https://php.net/extension-dir ;extension_dir = "./" ; On windows: ;extension_dir = "ext" @@ -774,14 +774,14 @@ user_dir = ; Whether or not to enable the dl() function. The dl() function does NOT work ; properly in multithreaded servers, such as IIS or Zeus, and is automatically ; disabled on them. -; http://php.net/enable-dl +; https://php.net/enable-dl enable_dl = Off ; cgi.force_redirect is necessary to provide security running PHP as a CGI under ; most web servers. Left undefined, PHP turns this on by default. You can ; turn it off here AT YOUR OWN RISK ; **You CAN safely turn this off for IIS, in fact, you MUST.** -; http://php.net/cgi.force-redirect +; https://php.net/cgi.force-redirect ;cgi.force_redirect = 1 ; if cgi.nph is enabled it will force cgi to always sent Status: 200 with @@ -792,7 +792,7 @@ enable_dl = Off ; (iPlanet) web servers, you MAY need to set an environment variable name that PHP ; will look for to know it is OK to continue execution. Setting this variable MAY ; cause security issues, KNOW WHAT YOU ARE DOING FIRST. -; http://php.net/cgi.redirect-status-env +; https://php.net/cgi.redirect-status-env ;cgi.redirect_status_env = ; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI. PHP's @@ -801,7 +801,7 @@ enable_dl = Off ; this to 1 will cause PHP CGI to fix its paths to conform to the spec. A setting ; of zero causes PHP to behave as before. Default is 1. You should fix your scripts ; to use SCRIPT_FILENAME rather than PATH_TRANSLATED. -; http://php.net/cgi.fix-pathinfo +; https://php.net/cgi.fix-pathinfo ;cgi.fix_pathinfo=1 ; if cgi.discard_path is enabled, the PHP CGI binary can safely be placed outside @@ -813,7 +813,7 @@ enable_dl = Off ; security context that the request runs under. mod_fastcgi under Apache ; does not currently support this feature (03/17/2002) ; Set to 1 if running under IIS. Default is zero. -; http://php.net/fastcgi.impersonate +; https://php.net/fastcgi.impersonate ;fastcgi.impersonate = 1 ; Disable logging through FastCGI connection. PHP's default behavior is to enable @@ -825,14 +825,14 @@ enable_dl = Off ; is supported by Apache. When this option is set to 1, PHP will send ; RFC2616 compliant header. ; Default is zero. -; http://php.net/cgi.rfc2616-headers +; https://php.net/cgi.rfc2616-headers ;cgi.rfc2616_headers = 0 ; cgi.check_shebang_line controls whether CGI PHP checks for line starting with #! ; (shebang) at the top of the running script. This line might be needed if the ; script support running both as stand-alone script and via PHP CGI<. PHP in CGI ; mode skips this line and ignores its content if this directive is turned on. -; http://php.net/cgi.check-shebang-line +; https://php.net/cgi.check-shebang-line ;cgi.check_shebang_line=1 ;;;;;;;;;;;;;;;; @@ -840,16 +840,16 @@ enable_dl = Off ;;;;;;;;;;;;;;;; ; Whether to allow HTTP file uploads. -; http://php.net/file-uploads +; https://php.net/file-uploads file_uploads = On ; Temporary directory for HTTP uploaded files (will use system default if not ; specified). -; http://php.net/upload-tmp-dir +; https://php.net/upload-tmp-dir ;upload_tmp_dir = ; Maximum allowed size for uploaded files. -; http://php.net/upload-max-filesize +; https://php.net/upload-max-filesize upload_max_filesize = 2M ; Maximum number of files that can be uploaded via a single request @@ -860,24 +860,24 @@ max_file_uploads = 20 ;;;;;;;;;;;;;;;;;; ; Whether to allow the treatment of URLs (like http:// or ftp://) as files. -; http://php.net/allow-url-fopen +; https://php.net/allow-url-fopen allow_url_fopen = On -; Whether to allow include/require to open URLs (like http:// or ftp://) as files. -; http://php.net/allow-url-include +; Whether to allow include/require to open URLs (like https:// or ftp://) as files. +; https://php.net/allow-url-include allow_url_include = Off ; Define the anonymous ftp password (your email address). PHP's default setting ; for this is empty. -; http://php.net/from +; https://php.net/from ;from="john@doe.com" ; Define the User-Agent string. PHP's default setting for this is empty. -; http://php.net/user-agent +; https://php.net/user-agent ;user_agent="PHP" ; Default timeout for socket based streams (seconds) -; http://php.net/default-socket-timeout +; https://php.net/default-socket-timeout default_socket_timeout = 60 ; If your scripts have to deal with files from Macintosh systems, @@ -885,7 +885,7 @@ default_socket_timeout = 60 ; unix or win32 systems, setting this flag will cause PHP to ; automatically detect the EOL character in those files so that ; fgets() and file() will work regardless of the source of the file. -; http://php.net/auto-detect-line-endings +; https://php.net/auto-detect-line-endings ;auto_detect_line_endings = Off ;;;;;;;;;;;;;;;;;;;;;; @@ -932,6 +932,7 @@ default_socket_timeout = 60 ;extension=exif ; Must be after mbstring as it depends on it ;extension=mysqli ;extension=oci8_12c ; Use with Oracle Database 12c Instant Client +;extension=oci8_19 ; Use with Oracle Database 19 Instant Client ;extension=odbc ;extension=openssl ;extension=pdo_firebird @@ -944,7 +945,7 @@ default_socket_timeout = 60 ;extension=shmop ; The MIBS data available in the PHP distribution must be installed. -; See http://www.php.net/manual/en/snmp.installation.php +; See https://www.php.net/manual/en/snmp.installation.php ;extension=snmp ;extension=soap @@ -966,26 +967,26 @@ cli_server.color = On [Date] ; Defines the default timezone used by the date functions -; http://php.net/date.timezone +; https://php.net/date.timezone ;date.timezone = -; http://php.net/date.default-latitude +; https://php.net/date.default-latitude ;date.default_latitude = 31.7667 -; http://php.net/date.default-longitude +; https://php.net/date.default-longitude ;date.default_longitude = 35.2333 -; http://php.net/date.sunrise-zenith +; https://php.net/date.sunrise-zenith ;date.sunrise_zenith = 90.833333 -; http://php.net/date.sunset-zenith +; https://php.net/date.sunset-zenith ;date.sunset_zenith = 90.833333 [filter] -; http://php.net/filter.default +; https://php.net/filter.default ;filter.default = unsafe_raw -; http://php.net/filter.default-flags +; https://php.net/filter.default-flags ;filter.default_flags = [iconv] @@ -1023,7 +1024,7 @@ cli_server.color = On [sqlite3] ; Directory pointing to SQLite3 extensions -; http://php.net/sqlite3.extension-dir +; https://php.net/sqlite3.extension-dir ;sqlite3.extension_dir = ; SQLite defensive mode flag (only available from SQLite 3.26+) @@ -1037,14 +1038,14 @@ cli_server.color = On [Pcre] ; PCRE library backtracking limit. -; http://php.net/pcre.backtrack-limit +; https://php.net/pcre.backtrack-limit ;pcre.backtrack_limit=100000 ; PCRE library recursion limit. ; Please note that if you set this value to a high number you may consume all ; the available process stack and eventually crash PHP (due to reaching the ; stack size limit imposed by the Operating System). -; http://php.net/pcre.recursion-limit +; https://php.net/pcre.recursion-limit ;pcre.recursion_limit=100000 ; Enables or disables JIT compilation of patterns. This requires the PCRE @@ -1053,7 +1054,7 @@ cli_server.color = On [Pdo] ; Whether to pool ODBC connections. Can be one of "strict", "relaxed" or "off" -; http://php.net/pdo-odbc.connection-pooling +; https://php.net/pdo-odbc.connection-pooling ;pdo_odbc.connection_pooling=strict [Pdo_mysql] @@ -1062,27 +1063,27 @@ cli_server.color = On pdo_mysql.default_socket= [Phar] -; http://php.net/phar.readonly +; https://php.net/phar.readonly ;phar.readonly = On -; http://php.net/phar.require-hash +; https://php.net/phar.require-hash ;phar.require_hash = On ;phar.cache_list = [mail function] ; For Win32 only. -; http://php.net/smtp +; https://php.net/smtp SMTP = localhost -; http://php.net/smtp-port +; https://php.net/smtp-port smtp_port = 25 ; For Win32 only. -; http://php.net/sendmail-from +; https://php.net/sendmail-from ;sendmail_from = me@example.com ; For Unix only. You may supply arguments as well (default: "sendmail -t -i"). -; http://php.net/sendmail-path +; https://php.net/sendmail-path ;sendmail_path = ; Force the addition of the specified parameters to be passed as extra parameters @@ -1100,13 +1101,13 @@ mail.add_x_header = Off ;mail.log = syslog [ODBC] -; http://php.net/odbc.default-db +; https://php.net/odbc.default-db ;odbc.default_db = Not yet implemented -; http://php.net/odbc.default-user +; https://php.net/odbc.default-user ;odbc.default_user = Not yet implemented -; http://php.net/odbc.default-pw +; https://php.net/odbc.default-pw ;odbc.default_pw = Not yet implemented ; Controls the ODBC cursor model. @@ -1114,68 +1115,68 @@ mail.add_x_header = Off ;odbc.default_cursortype ; Allow or prevent persistent links. -; http://php.net/odbc.allow-persistent +; https://php.net/odbc.allow-persistent odbc.allow_persistent = On ; Check that a connection is still valid before reuse. -; http://php.net/odbc.check-persistent +; https://php.net/odbc.check-persistent odbc.check_persistent = On ; Maximum number of persistent links. -1 means no limit. -; http://php.net/odbc.max-persistent +; https://php.net/odbc.max-persistent odbc.max_persistent = -1 ; Maximum number of links (persistent + non-persistent). -1 means no limit. -; http://php.net/odbc.max-links +; https://php.net/odbc.max-links odbc.max_links = -1 ; Handling of LONG fields. Returns number of bytes to variables. 0 means ; passthru. -; http://php.net/odbc.defaultlrl +; https://php.net/odbc.defaultlrl odbc.defaultlrl = 4096 ; Handling of binary data. 0 means passthru, 1 return as is, 2 convert to char. ; See the documentation on odbc_binmode and odbc_longreadlen for an explanation ; of odbc.defaultlrl and odbc.defaultbinmode -; http://php.net/odbc.defaultbinmode +; https://php.net/odbc.defaultbinmode odbc.defaultbinmode = 1 [MySQLi] ; Maximum number of persistent links. -1 means no limit. -; http://php.net/mysqli.max-persistent +; https://php.net/mysqli.max-persistent mysqli.max_persistent = -1 ; Allow accessing, from PHP's perspective, local files with LOAD DATA statements -; http://php.net/mysqli.allow_local_infile +; https://php.net/mysqli.allow_local_infile ;mysqli.allow_local_infile = On ; Allow or prevent persistent links. -; http://php.net/mysqli.allow-persistent +; https://php.net/mysqli.allow-persistent mysqli.allow_persistent = On ; Maximum number of links. -1 means no limit. -; http://php.net/mysqli.max-links +; https://php.net/mysqli.max-links mysqli.max_links = -1 ; Default port number for mysqli_connect(). If unset, mysqli_connect() will use ; the $MYSQL_TCP_PORT or the mysql-tcp entry in /etc/services or the ; compile-time value defined MYSQL_PORT (in that order). Win32 will only look ; at MYSQL_PORT. -; http://php.net/mysqli.default-port +; https://php.net/mysqli.default-port mysqli.default_port = 3306 ; Default socket name for local MySQL connects. If empty, uses the built-in ; MySQL defaults. -; http://php.net/mysqli.default-socket +; https://php.net/mysqli.default-socket mysqli.default_socket = ; Default host for mysqli_connect() (doesn't apply in safe mode). -; http://php.net/mysqli.default-host +; https://php.net/mysqli.default-host mysqli.default_host = ; Default user for mysqli_connect() (doesn't apply in safe mode). -; http://php.net/mysqli.default-user +; https://php.net/mysqli.default-user mysqli.default_user = ; Default password for mysqli_connect() (doesn't apply in safe mode). @@ -1183,7 +1184,7 @@ mysqli.default_user = ; *Any* user with PHP access can run 'echo get_cfg_var("mysqli.default_pw") ; and reveal this password! And of course, any users with read access to this ; file will be able to reveal the password as well. -; http://php.net/mysqli.default-pw +; https://php.net/mysqli.default-pw mysqli.default_pw = ; Allow or prevent reconnect @@ -1200,7 +1201,7 @@ mysqlnd.collect_memory_statistics = On ; Records communication from all extensions using mysqlnd to the specified log ; file. -; http://php.net/mysqlnd.debug +; https://php.net/mysqlnd.debug ;mysqlnd.debug = ; Defines which queries will be logged. @@ -1227,25 +1228,25 @@ mysqlnd.collect_memory_statistics = On ; Connection: Enables privileged connections using external ; credentials (OCI_SYSOPER, OCI_SYSDBA) -; http://php.net/oci8.privileged-connect +; https://php.net/oci8.privileged-connect ;oci8.privileged_connect = Off ; Connection: The maximum number of persistent OCI8 connections per ; process. Using -1 means no limit. -; http://php.net/oci8.max-persistent +; https://php.net/oci8.max-persistent ;oci8.max_persistent = -1 ; Connection: The maximum number of seconds a process is allowed to ; maintain an idle persistent connection. Using -1 means idle ; persistent connections will be maintained forever. -; http://php.net/oci8.persistent-timeout +; https://php.net/oci8.persistent-timeout ;oci8.persistent_timeout = -1 ; Connection: The number of seconds that must pass before issuing a ; ping during oci_pconnect() to check the connection validity. When ; set to 0, each oci_pconnect() will cause a ping. Using -1 disables ; pings completely. -; http://php.net/oci8.ping-interval +; https://php.net/oci8.ping-interval ;oci8.ping_interval = 60 ; Connection: Set this to a user chosen connection class to be used @@ -1263,59 +1264,59 @@ mysqlnd.collect_memory_statistics = On ; Tuning: This option enables statement caching, and specifies how ; many statements to cache. Using 0 disables statement caching. -; http://php.net/oci8.statement-cache-size +; https://php.net/oci8.statement-cache-size ;oci8.statement_cache_size = 20 ; Tuning: Enables statement prefetching and sets the default number of ; rows that will be fetched automatically after statement execution. -; http://php.net/oci8.default-prefetch +; https://php.net/oci8.default-prefetch ;oci8.default_prefetch = 100 ; Compatibility. Using On means oci_close() will not close ; oci_connect() and oci_new_connect() connections. -; http://php.net/oci8.old-oci-close-semantics +; https://php.net/oci8.old-oci-close-semantics ;oci8.old_oci_close_semantics = Off [PostgreSQL] ; Allow or prevent persistent links. -; http://php.net/pgsql.allow-persistent +; https://php.net/pgsql.allow-persistent pgsql.allow_persistent = On ; Detect broken persistent links always with pg_pconnect(). ; Auto reset feature requires a little overheads. -; http://php.net/pgsql.auto-reset-persistent +; https://php.net/pgsql.auto-reset-persistent pgsql.auto_reset_persistent = Off ; Maximum number of persistent links. -1 means no limit. -; http://php.net/pgsql.max-persistent +; https://php.net/pgsql.max-persistent pgsql.max_persistent = -1 ; Maximum number of links (persistent+non persistent). -1 means no limit. -; http://php.net/pgsql.max-links +; https://php.net/pgsql.max-links pgsql.max_links = -1 ; Ignore PostgreSQL backends Notice message or not. ; Notice message logging require a little overheads. -; http://php.net/pgsql.ignore-notice +; https://php.net/pgsql.ignore-notice pgsql.ignore_notice = 0 ; Log PostgreSQL backends Notice message or not. ; Unless pgsql.ignore_notice=0, module cannot log notice message. -; http://php.net/pgsql.log-notice +; https://php.net/pgsql.log-notice pgsql.log_notice = 0 [bcmath] ; Number of decimal digits for all bcmath functions. -; http://php.net/bcmath.scale +; https://php.net/bcmath.scale bcmath.scale = 0 [browscap] -; http://php.net/browscap +; https://php.net/browscap ;browscap = extra/browscap.ini [Session] ; Handler used to store/retrieve data. -; http://php.net/session.save-handler +; https://php.net/session.save-handler session.save_handler = files ; Argument passed to save_handler. In the case of files, this is the path @@ -1344,7 +1345,7 @@ session.save_handler = files ; ; where MODE is the octal representation of the mode. Note that this ; does not overwrite the process's umask. -; http://php.net/session.save-path +; https://php.net/session.save-path ;session.save_path = "/tmp" ; Whether to use strict session mode. @@ -1357,42 +1358,42 @@ session.save_handler = files session.use_strict_mode = 0 ; Whether to use cookies. -; http://php.net/session.use-cookies +; https://php.net/session.use-cookies session.use_cookies = 1 -; http://php.net/session.cookie-secure +; https://php.net/session.cookie-secure ;session.cookie_secure = ; This option forces PHP to fetch and use a cookie for storing and maintaining ; the session id. We encourage this operation as it's very helpful in combating ; session hijacking when not specifying and managing your own session id. It is ; not the be-all and end-all of session hijacking defense, but it's a good start. -; http://php.net/session.use-only-cookies +; https://php.net/session.use-only-cookies session.use_only_cookies = 1 ; Name of the session (used as cookie name). -; http://php.net/session.name +; https://php.net/session.name session.name = PHPSESSID ; Initialize session on request startup. -; http://php.net/session.auto-start +; https://php.net/session.auto-start session.auto_start = 0 ; Lifetime in seconds of cookie or, if 0, until browser is restarted. -; http://php.net/session.cookie-lifetime +; https://php.net/session.cookie-lifetime session.cookie_lifetime = 0 ; The path for which the cookie is valid. -; http://php.net/session.cookie-path +; https://php.net/session.cookie-path session.cookie_path = / ; The domain for which the cookie is valid. -; http://php.net/session.cookie-domain +; https://php.net/session.cookie-domain session.cookie_domain = ; Whether or not to add the httpOnly flag to the cookie, which makes it ; inaccessible to browser scripting languages such as JavaScript. -; http://php.net/session.cookie-httponly +; https://php.net/session.cookie-httponly session.cookie_httponly = ; Add SameSite attribute to cookie to help mitigate Cross-Site Request Forgery (CSRF/XSRF) @@ -1402,7 +1403,7 @@ session.cookie_httponly = session.cookie_samesite = ; Handler used to serialize data. php is the standard serializer of PHP. -; http://php.net/session.serialize-handler +; https://php.net/session.serialize-handler session.serialize_handler = php ; Defines the probability that the 'garbage collection' process is started on every @@ -1411,7 +1412,7 @@ session.serialize_handler = php ; Default Value: 1 ; Development Value: 1 ; Production Value: 1 -; http://php.net/session.gc-probability +; https://php.net/session.gc-probability session.gc_probability = 1 ; Defines the probability that the 'garbage collection' process is started on every @@ -1421,12 +1422,12 @@ session.gc_probability = 1 ; Default Value: 100 ; Development Value: 1000 ; Production Value: 1000 -; http://php.net/session.gc-divisor +; https://php.net/session.gc-divisor session.gc_divisor = 1000 ; After this number of seconds, stored data will be seen as 'garbage' and ; cleaned up by the garbage collection process. -; http://php.net/session.gc-maxlifetime +; https://php.net/session.gc-maxlifetime session.gc_maxlifetime = 1440 ; NOTE: If you are using the subdirectory option for storing session files @@ -1440,16 +1441,16 @@ session.gc_maxlifetime = 1440 ; Check HTTP Referer to invalidate externally stored URLs containing ids. ; HTTP_REFERER has to contain this substring for the session to be ; considered as valid. -; http://php.net/session.referer-check +; https://php.net/session.referer-check session.referer_check = ; Set to {nocache,private,public,} to determine HTTP caching aspects ; or leave this empty to avoid sending anti-caching headers. -; http://php.net/session.cache-limiter +; https://php.net/session.cache-limiter session.cache_limiter = nocache ; Document expires after n minutes. -; http://php.net/session.cache-expire +; https://php.net/session.cache-expire session.cache_expire = 180 ; trans sid support is disabled by default. @@ -1461,13 +1462,13 @@ session.cache_expire = 180 ; in publicly accessible computer. ; - User may access your site with the same session ID ; always using URL stored in browser's history or bookmarks. -; http://php.net/session.use-trans-sid +; https://php.net/session.use-trans-sid session.use_trans_sid = 0 ; Set session ID character length. This value could be between 22 to 256. ; Shorter length than default is supported only for compatibility reason. ; Users should use 32 or more chars. -; http://php.net/session.sid-length +; https://php.net/session.sid-length ; Default Value: 32 ; Development Value: 26 ; Production Value: 26 @@ -1482,7 +1483,7 @@ session.sid_length = 26 ; Default Value: "a=href,area=href,frame=src,form=" ; Development Value: "a=href,area=href,frame=src,form=" ; Production Value: "a=href,area=href,frame=src,form=" -; http://php.net/url-rewriter.tags +; https://php.net/url-rewriter.tags session.trans_sid_tags = "a=href,area=href,frame=src,form=" ; URL rewriter does not rewrite absolute URLs by default. @@ -1507,14 +1508,14 @@ session.trans_sid_tags = "a=href,area=href,frame=src,form=" ; Default Value: 4 ; Development Value: 5 ; Production Value: 5 -; http://php.net/session.hash-bits-per-character +; https://php.net/session.hash-bits-per-character session.sid_bits_per_character = 5 ; Enable upload progress tracking in $_SESSION ; Default Value: On ; Development Value: On ; Production Value: On -; http://php.net/session.upload-progress.enabled +; https://php.net/session.upload-progress.enabled ;session.upload_progress.enabled = On ; Cleanup the progress information as soon as all POST data has been read @@ -1522,14 +1523,14 @@ session.sid_bits_per_character = 5 ; Default Value: On ; Development Value: On ; Production Value: On -; http://php.net/session.upload-progress.cleanup +; https://php.net/session.upload-progress.cleanup ;session.upload_progress.cleanup = On ; A prefix used for the upload progress key in $_SESSION ; Default Value: "upload_progress_" ; Development Value: "upload_progress_" ; Production Value: "upload_progress_" -; http://php.net/session.upload-progress.prefix +; https://php.net/session.upload-progress.prefix ;session.upload_progress.prefix = "upload_progress_" ; The index name (concatenated with the prefix) in $_SESSION @@ -1537,7 +1538,7 @@ session.sid_bits_per_character = 5 ; Default Value: "PHP_SESSION_UPLOAD_PROGRESS" ; Development Value: "PHP_SESSION_UPLOAD_PROGRESS" ; Production Value: "PHP_SESSION_UPLOAD_PROGRESS" -; http://php.net/session.upload-progress.name +; https://php.net/session.upload-progress.name ;session.upload_progress.name = "PHP_SESSION_UPLOAD_PROGRESS" ; How frequently the upload progress should be updated. @@ -1545,18 +1546,18 @@ session.sid_bits_per_character = 5 ; Default Value: "1%" ; Development Value: "1%" ; Production Value: "1%" -; http://php.net/session.upload-progress.freq +; https://php.net/session.upload-progress.freq ;session.upload_progress.freq = "1%" ; The minimum delay between updates, in seconds ; Default Value: 1 ; Development Value: 1 ; Production Value: 1 -; http://php.net/session.upload-progress.min-freq +; https://php.net/session.upload-progress.min-freq ;session.upload_progress.min_freq = "1" ; Only write session data when session data is changed. Enabled by default. -; http://php.net/session.lazy-write +; https://php.net/session.lazy-write ;session.lazy_write = On [Assertion] @@ -1568,48 +1569,48 @@ session.sid_bits_per_character = 5 ; Default Value: 1 ; Development Value: 1 ; Production Value: -1 -; http://php.net/zend.assertions +; https://php.net/zend.assertions zend.assertions = 1 ; Assert(expr); active by default. -; http://php.net/assert.active +; https://php.net/assert.active ;assert.active = On ; Throw an AssertionError on failed assertions -; http://php.net/assert.exception +; https://php.net/assert.exception ;assert.exception = On ; Issue a PHP warning for each failed assertion. (Overridden by assert.exception if active) -; http://php.net/assert.warning +; https://php.net/assert.warning ;assert.warning = On ; Don't bail out by default. -; http://php.net/assert.bail +; https://php.net/assert.bail ;assert.bail = Off ; User-function to be called if an assertion fails. -; http://php.net/assert.callback +; https://php.net/assert.callback ;assert.callback = 0 [COM] ; path to a file containing GUIDs, IIDs or filenames of files with TypeLibs -; http://php.net/com.typelib-file +; https://php.net/com.typelib-file ;com.typelib_file = ; allow Distributed-COM calls -; http://php.net/com.allow-dcom +; https://php.net/com.allow-dcom ;com.allow_dcom = true ; autoregister constants of a component's typlib on com_load() -; http://php.net/com.autoregister-typelib +; https://php.net/com.autoregister-typelib ;com.autoregister_typelib = true ; register constants casesensitive -; http://php.net/com.autoregister-casesensitive +; https://php.net/com.autoregister-casesensitive ;com.autoregister_casesensitive = false ; show warnings on duplicate constant registrations -; http://php.net/com.autoregister-verbose +; https://php.net/com.autoregister-verbose ;com.autoregister_verbose = true ; The default character set code-page to use when passing strings to and from COM objects. @@ -1623,7 +1624,7 @@ zend.assertions = 1 [mbstring] ; language for internal character representation. ; This affects mb_send_mail() and mbstring.detect_order. -; http://php.net/mbstring.language +; https://php.net/mbstring.language ;mbstring.language = Japanese ; Use of this INI entry is deprecated, use global internal_encoding instead. @@ -1637,8 +1638,8 @@ zend.assertions = 1 ; http input encoding. ; mbstring.encoding_translation = On is needed to use this setting. ; If empty, default_charset or input_encoding or mbstring.input is used. -; The precedence is: default_charset < input_encoding < mbsting.http_input -; http://php.net/mbstring.http-input +; The precedence is: default_charset < input_encoding < mbstring.http_input +; https://php.net/mbstring.http-input ;mbstring.http_input = ; Use of this INI entry is deprecated, use global output_encoding instead. @@ -1648,7 +1649,7 @@ zend.assertions = 1 ; The precedence is: default_charset < output_encoding < mbstring.http_output ; To use an output encoding conversion, mbstring's output handler must be set ; otherwise output encoding conversion cannot be performed. -; http://php.net/mbstring.http-output +; https://php.net/mbstring.http-output ;mbstring.http_output = ; enable automatic encoding translation according to @@ -1656,17 +1657,17 @@ zend.assertions = 1 ; converted to internal encoding by setting this to On. ; Note: Do _not_ use automatic encoding translation for ; portable libs/applications. -; http://php.net/mbstring.encoding-translation +; https://php.net/mbstring.encoding-translation ;mbstring.encoding_translation = Off ; automatic encoding detection order. ; "auto" detect order is changed according to mbstring.language -; http://php.net/mbstring.detect-order +; https://php.net/mbstring.detect-order ;mbstring.detect_order = auto ; substitute_character used when character cannot be converted ; one from another -; http://php.net/mbstring.substitute-character +; https://php.net/mbstring.substitute-character ;mbstring.substitute_character = none ; Enable strict encoding detection. @@ -1689,7 +1690,7 @@ zend.assertions = 1 ; Tell the jpeg decode to ignore warnings and try to create ; a gd image. The warning will then be displayed as notices ; disabled by default -; http://php.net/gd.jpeg-ignore-warning +; https://php.net/gd.jpeg-ignore-warning ;gd.jpeg_ignore_warning = 1 [exif] @@ -1698,47 +1699,47 @@ zend.assertions = 1 ; given by corresponding encode setting. When empty mbstring.internal_encoding ; is used. For the decode settings you can distinguish between motorola and ; intel byte order. A decode setting cannot be empty. -; http://php.net/exif.encode-unicode +; https://php.net/exif.encode-unicode ;exif.encode_unicode = ISO-8859-15 -; http://php.net/exif.decode-unicode-motorola +; https://php.net/exif.decode-unicode-motorola ;exif.decode_unicode_motorola = UCS-2BE -; http://php.net/exif.decode-unicode-intel +; https://php.net/exif.decode-unicode-intel ;exif.decode_unicode_intel = UCS-2LE -; http://php.net/exif.encode-jis +; https://php.net/exif.encode-jis ;exif.encode_jis = -; http://php.net/exif.decode-jis-motorola +; https://php.net/exif.decode-jis-motorola ;exif.decode_jis_motorola = JIS -; http://php.net/exif.decode-jis-intel +; https://php.net/exif.decode-jis-intel ;exif.decode_jis_intel = JIS [Tidy] ; The path to a default tidy configuration file to use when using tidy -; http://php.net/tidy.default-config +; https://php.net/tidy.default-config ;tidy.default_config = /usr/local/lib/php/default.tcfg ; Should tidy clean and repair output automatically? ; WARNING: Do not use this option if you are generating non-html content ; such as dynamic images -; http://php.net/tidy.clean-output +; https://php.net/tidy.clean-output tidy.clean_output = Off [soap] ; Enables or disables WSDL caching feature. -; http://php.net/soap.wsdl-cache-enabled +; https://php.net/soap.wsdl-cache-enabled soap.wsdl_cache_enabled=1 ; Sets the directory name where SOAP extension will put cache files. -; http://php.net/soap.wsdl-cache-dir +; https://php.net/soap.wsdl-cache-dir soap.wsdl_cache_dir="/tmp" ; (time to live) Sets the number of second while cached file will be used ; instead of original one. -; http://php.net/soap.wsdl-cache-ttl +; https://php.net/soap.wsdl-cache-ttl soap.wsdl_cache_ttl=86400 ; Sets the size of the cache limit. (Max. number of WSDL files to cache) @@ -1893,12 +1894,12 @@ ldap.max_links = -1 ; Specifies a PHP script that is going to be compiled and executed at server ; start-up. -; http://php.net/opcache.preload +; https://php.net/opcache.preload ;opcache.preload= ; Preloading code as root is not allowed for security reasons. This directive ; facilitates to let the preloading to be run as another user. -; http://php.net/opcache.preload_user +; https://php.net/opcache.preload_user ;opcache.preload_user= ; Prevents caching files that are less than this number of seconds old. It diff --git a/php.ini-production b/php.ini-production index 472a87eab0c5f..708591bb797a7 100644 --- a/php.ini-production +++ b/php.ini-production @@ -17,7 +17,7 @@ ; 6. The directory from the --with-config-file-path compile time option, or the ; Windows directory (usually C:\windows) ; See the PHP docs for more specific information. -; http://php.net/configuration.file +; https://php.net/configuration.file ; The syntax of the file is extremely simple. Whitespace and lines ; beginning with a semicolon are silently ignored (as you probably guessed). @@ -31,7 +31,7 @@ ; special sections cannot be overridden by user-defined INI files or ; at runtime. Currently, [PATH=] and [HOST=] sections only work under ; CGI/FastCGI. -; http://php.net/ini.sections +; https://php.net/ini.sections ; Directives are specified using the following syntax: ; directive = value @@ -181,7 +181,7 @@ ;;;;;;;;;;;;;;;;;;;; ; Enable the PHP scripting language engine under Apache. -; http://php.net/engine +; https://php.net/engine engine = On ; This directive determines whether or not PHP will recognize code between @@ -194,11 +194,11 @@ engine = On ; Default Value: On ; Development Value: Off ; Production Value: Off -; http://php.net/short-open-tag +; https://php.net/short-open-tag short_open_tag = Off ; The number of significant digits displayed in floating point numbers. -; http://php.net/precision +; https://php.net/precision precision = 14 ; Output buffering is a mechanism for controlling how much output data @@ -222,7 +222,7 @@ precision = 14 ; Default Value: Off ; Development Value: 4096 ; Production Value: 4096 -; http://php.net/output-buffering +; https://php.net/output-buffering output_buffering = 4096 ; You can redirect all of the output of your scripts to a function. For @@ -237,7 +237,7 @@ output_buffering = 4096 ; and you cannot use both "ob_gzhandler" and "zlib.output_compression". ; Note: output_handler must be empty if this is set 'On' !!!! ; Instead you must use zlib.output_handler. -; http://php.net/output-handler +; https://php.net/output-handler ;output_handler = ; URL rewriter function rewrites URL on the fly by using @@ -266,16 +266,16 @@ output_buffering = 4096 ; performance, enable output_buffering in addition. ; Note: You need to use zlib.output_handler instead of the standard ; output_handler, or otherwise the output will be corrupted. -; http://php.net/zlib.output-compression +; https://php.net/zlib.output-compression zlib.output_compression = Off -; http://php.net/zlib.output-compression-level +; https://php.net/zlib.output-compression-level ;zlib.output_compression_level = -1 ; You cannot specify additional output handlers if zlib.output_compression ; is activated here. This setting does the same as output_handler but in ; a different order. -; http://php.net/zlib.output-handler +; https://php.net/zlib.output-handler ;zlib.output_handler = ; Implicit flush tells PHP to tell the output layer to flush itself @@ -283,7 +283,7 @@ zlib.output_compression = Off ; PHP function flush() after each and every call to print() or echo() and each ; and every HTML block. Turning this option on has serious performance ; implications and is generally recommended for debugging purposes only. -; http://php.net/implicit-flush +; https://php.net/implicit-flush ; Note: This directive is hardcoded to On for the CLI SAPI implicit_flush = Off @@ -314,22 +314,22 @@ serialize_precision = -1 ; and below. This directive makes most sense if used in a per-directory ; or per-virtualhost web server configuration file. ; Note: disables the realpath cache -; http://php.net/open-basedir +; https://php.net/open-basedir ;open_basedir = ; This directive allows you to disable certain functions. ; It receives a comma-delimited list of function names. -; http://php.net/disable-functions +; https://php.net/disable-functions disable_functions = ; This directive allows you to disable certain classes. ; It receives a comma-delimited list of class names. -; http://php.net/disable-classes +; https://php.net/disable-classes disable_classes = ; Colors for Syntax Highlighting mode. Anything that's acceptable in ; would work. -; http://php.net/syntax-highlighting +; https://php.net/syntax-highlighting ;highlight.string = #DD0000 ;highlight.comment = #FF9900 ;highlight.keyword = #007700 @@ -340,24 +340,24 @@ disable_classes = ; the request. Consider enabling it if executing long requests, which may end up ; being interrupted by the user or a browser timing out. PHP's default behavior ; is to disable this feature. -; http://php.net/ignore-user-abort +; https://php.net/ignore-user-abort ;ignore_user_abort = On ; Determines the size of the realpath cache to be used by PHP. This value should ; be increased on systems where PHP opens many files to reflect the quantity of ; the file operations performed. ; Note: if open_basedir is set, the cache is disabled -; http://php.net/realpath-cache-size +; https://php.net/realpath-cache-size ;realpath_cache_size = 4096k ; Duration of time, in seconds for which to cache realpath information for a given ; file or directory. For systems with rarely changing files, consider increasing this ; value. -; http://php.net/realpath-cache-ttl +; https://php.net/realpath-cache-ttl ;realpath_cache_ttl = 120 ; Enables or disables the circular reference collector. -; http://php.net/zend.enable-gc +; https://php.net/zend.enable-gc zend.enable_gc = On ; If enabled, scripts may be written in encodings that are incompatible with @@ -396,7 +396,7 @@ zend.exception_string_param_max_len = 0 ; (e.g. by adding its signature to the Web server header). It is no security ; threat in any way, but it makes it possible to determine whether you use PHP ; on your server or not. -; http://php.net/expose-php +; https://php.net/expose-php expose_php = On ;;;;;;;;;;;;;;;;;;; @@ -404,7 +404,7 @@ expose_php = On ;;;;;;;;;;;;;;;;;;; ; Maximum execution time of each script, in seconds -; http://php.net/max-execution-time +; https://php.net/max-execution-time ; Note: This directive is hardcoded to 0 for the CLI SAPI max_execution_time = 30 @@ -415,18 +415,18 @@ max_execution_time = 30 ; Default Value: -1 (Unlimited) ; Development Value: 60 (60 seconds) ; Production Value: 60 (60 seconds) -; http://php.net/max-input-time +; https://php.net/max-input-time max_input_time = 60 ; Maximum input variable nesting level -; http://php.net/max-input-nesting-level +; https://php.net/max-input-nesting-level ;max_input_nesting_level = 64 ; How many GET/POST/COOKIE input variables may be accepted ;max_input_vars = 1000 ; Maximum amount of memory a script may consume -; http://php.net/memory-limit +; https://php.net/memory-limit memory_limit = 128M ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -482,7 +482,7 @@ memory_limit = 128M ; Default Value: E_ALL ; Development Value: E_ALL ; Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT -; http://php.net/error-reporting +; https://php.net/error-reporting error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT ; This directive controls whether or not and where PHP will output errors, @@ -499,7 +499,7 @@ error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT ; Default Value: On ; Development Value: On ; Production Value: Off -; http://php.net/display-errors +; https://php.net/display-errors display_errors = Off ; The display of errors which occur during PHP's startup sequence are handled @@ -508,7 +508,7 @@ display_errors = Off ; Default Value: On ; Development Value: On ; Production Value: Off -; http://php.net/display-startup-errors +; https://php.net/display-startup-errors display_startup_errors = Off ; Besides displaying errors, PHP can also log errors to locations such as a @@ -518,36 +518,36 @@ display_startup_errors = Off ; Default Value: Off ; Development Value: On ; Production Value: On -; http://php.net/log-errors +; https://php.net/log-errors log_errors = On ; Set maximum length of log_errors. In error_log information about the source is ; added. The default is 1024 and 0 allows to not apply any maximum length at all. -; http://php.net/log-errors-max-len +; https://php.net/log-errors-max-len log_errors_max_len = 1024 ; Do not log repeated messages. Repeated errors must occur in same file on same ; line unless ignore_repeated_source is set true. -; http://php.net/ignore-repeated-errors +; https://php.net/ignore-repeated-errors ignore_repeated_errors = Off ; Ignore source of message when ignoring repeated messages. When this setting ; is On you will not log errors with repeated messages from different files or ; source lines. -; http://php.net/ignore-repeated-source +; https://php.net/ignore-repeated-source ignore_repeated_source = Off ; If this parameter is set to Off, then memory leaks will not be shown (on ; stdout or in the log). This is only effective in a debug compile, and if ; error reporting includes E_WARNING in the allowed list -; http://php.net/report-memleaks +; https://php.net/report-memleaks report_memleaks = On ; This setting is off by default. ;report_zend_debug = 0 ; Turn off normal error reporting and emit XML-RPC error XML -; http://php.net/xmlrpc-errors +; https://php.net/xmlrpc-errors ;xmlrpc_errors = 0 ; An XML-RPC faultCode @@ -557,40 +557,40 @@ report_memleaks = On ; error message as HTML for easier reading. This directive controls whether ; the error message is formatted as HTML or not. ; Note: This directive is hardcoded to Off for the CLI SAPI -; http://php.net/html-errors +; https://php.net/html-errors ;html_errors = On ; If html_errors is set to On *and* docref_root is not empty, then PHP ; produces clickable error messages that direct to a page describing the error ; or function causing the error in detail. -; You can download a copy of the PHP manual from http://php.net/docs +; You can download a copy of the PHP manual from https://php.net/docs ; and change docref_root to the base URL of your local copy including the ; leading '/'. You must also specify the file extension being used including ; the dot. PHP's default behavior is to leave these settings empty, in which ; case no links to documentation are generated. ; Note: Never use this feature for production boxes. -; http://php.net/docref-root +; https://php.net/docref-root ; Examples ;docref_root = "/phpmanual/" -; http://php.net/docref-ext +; https://php.net/docref-ext ;docref_ext = .html ; String to output before an error message. PHP's default behavior is to leave ; this setting blank. -; http://php.net/error-prepend-string +; https://php.net/error-prepend-string ; Example: ;error_prepend_string = "" ; String to output after an error message. PHP's default behavior is to leave ; this setting blank. -; http://php.net/error-append-string +; https://php.net/error-append-string ; Example: ;error_append_string = "" ; Log errors to specified file. PHP's default behavior is to leave this value ; empty. -; http://php.net/error-log +; https://php.net/error-log ; Example: ;error_log = php_errors.log ; Log errors to syslog (Event Log on Windows). @@ -613,7 +613,7 @@ report_memleaks = On ; no-ctrl (all characters except control characters) ; all (all characters) ; raw (like "all", but messages are not split at newlines) -; http://php.net/syslog.filter +; https://php.net/syslog.filter ;syslog.filter = ascii ;windows.show_crt_warning @@ -627,14 +627,14 @@ report_memleaks = On ; The separator used in PHP generated URLs to separate arguments. ; PHP's default setting is "&". -; http://php.net/arg-separator.output +; https://php.net/arg-separator.output ; Example: ;arg_separator.output = "&" ; List of separator(s) used by PHP to parse input URLs into variables. ; PHP's default setting is "&". ; NOTE: Every character in this directive is considered as separator! -; http://php.net/arg-separator.input +; https://php.net/arg-separator.input ; Example: ;arg_separator.input = ";&" @@ -648,7 +648,7 @@ report_memleaks = On ; Default Value: "EGPCS" ; Development Value: "GPCS" ; Production Value: "GPCS"; -; http://php.net/variables-order +; https://php.net/variables-order variables_order = "GPCS" ; This directive determines which super global data (G,P & C) should be @@ -661,7 +661,7 @@ variables_order = "GPCS" ; Default Value: None ; Development Value: "GP" ; Production Value: "GP" -; http://php.net/request-order +; https://php.net/request-order request_order = "GP" ; This directive determines whether PHP registers $argv & $argc each time it @@ -676,7 +676,7 @@ request_order = "GP" ; Default Value: On ; Development Value: Off ; Production Value: Off -; http://php.net/register-argc-argv +; https://php.net/register-argc-argv register_argc_argv = Off ; When enabled, the ENV, REQUEST and SERVER variables are created when they're @@ -684,7 +684,7 @@ register_argc_argv = Off ; variables are not used within a script, having this directive on will result ; in a performance gain. The PHP directive register_argc_argv must be disabled ; for this directive to have any effect. -; http://php.net/auto-globals-jit +; https://php.net/auto-globals-jit auto_globals_jit = On ; Whether PHP will read the POST data. @@ -693,48 +693,48 @@ auto_globals_jit = On ; and $_FILES to always be empty; the only way you will be able to read the ; POST data will be through the php://input stream wrapper. This can be useful ; to proxy requests or to process the POST data in a memory efficient fashion. -; http://php.net/enable-post-data-reading +; https://php.net/enable-post-data-reading ;enable_post_data_reading = Off ; Maximum size of POST data that PHP will accept. ; Its value may be 0 to disable the limit. It is ignored if POST data reading ; is disabled through enable_post_data_reading. -; http://php.net/post-max-size +; https://php.net/post-max-size post_max_size = 8M ; Automatically add files before PHP document. -; http://php.net/auto-prepend-file +; https://php.net/auto-prepend-file auto_prepend_file = ; Automatically add files after PHP document. -; http://php.net/auto-append-file +; https://php.net/auto-append-file auto_append_file = ; By default, PHP will output a media type using the Content-Type header. To ; disable this, simply set it to be empty. ; ; PHP's built-in default media type is set to text/html. -; http://php.net/default-mimetype +; https://php.net/default-mimetype default_mimetype = "text/html" ; PHP's default character set is set to UTF-8. -; http://php.net/default-charset +; https://php.net/default-charset default_charset = "UTF-8" ; PHP internal character encoding is set to empty. ; If empty, default_charset is used. -; http://php.net/internal-encoding +; https://php.net/internal-encoding ;internal_encoding = ; PHP input character encoding is set to empty. ; If empty, default_charset is used. -; http://php.net/input-encoding +; https://php.net/input-encoding ;input_encoding = ; PHP output character encoding is set to empty. ; If empty, default_charset is used. ; See also output_buffer. -; http://php.net/output-encoding +; https://php.net/output-encoding ;output_encoding = ;;;;;;;;;;;;;;;;;;;;;;;;; @@ -748,23 +748,23 @@ default_charset = "UTF-8" ;include_path = ".;c:\php\includes" ; ; PHP's default setting for include_path is ".;/path/to/php/pear" -; http://php.net/include-path +; https://php.net/include-path ; The root of the PHP pages, used only if nonempty. ; if PHP was not compiled with FORCE_REDIRECT, you SHOULD set doc_root ; if you are running php as a CGI under any web server (other than IIS) ; see documentation for security issues. The alternate is to use the ; cgi.force_redirect configuration below -; http://php.net/doc-root +; https://php.net/doc-root doc_root = ; The directory under which PHP opens the script using /~username used only ; if nonempty. -; http://php.net/user-dir +; https://php.net/user-dir user_dir = ; Directory in which the loadable extensions (modules) reside. -; http://php.net/extension-dir +; https://php.net/extension-dir ;extension_dir = "./" ; On windows: ;extension_dir = "ext" @@ -776,14 +776,14 @@ user_dir = ; Whether or not to enable the dl() function. The dl() function does NOT work ; properly in multithreaded servers, such as IIS or Zeus, and is automatically ; disabled on them. -; http://php.net/enable-dl +; https://php.net/enable-dl enable_dl = Off ; cgi.force_redirect is necessary to provide security running PHP as a CGI under ; most web servers. Left undefined, PHP turns this on by default. You can ; turn it off here AT YOUR OWN RISK ; **You CAN safely turn this off for IIS, in fact, you MUST.** -; http://php.net/cgi.force-redirect +; https://php.net/cgi.force-redirect ;cgi.force_redirect = 1 ; if cgi.nph is enabled it will force cgi to always sent Status: 200 with @@ -794,7 +794,7 @@ enable_dl = Off ; (iPlanet) web servers, you MAY need to set an environment variable name that PHP ; will look for to know it is OK to continue execution. Setting this variable MAY ; cause security issues, KNOW WHAT YOU ARE DOING FIRST. -; http://php.net/cgi.redirect-status-env +; https://php.net/cgi.redirect-status-env ;cgi.redirect_status_env = ; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI. PHP's @@ -803,7 +803,7 @@ enable_dl = Off ; this to 1 will cause PHP CGI to fix its paths to conform to the spec. A setting ; of zero causes PHP to behave as before. Default is 1. You should fix your scripts ; to use SCRIPT_FILENAME rather than PATH_TRANSLATED. -; http://php.net/cgi.fix-pathinfo +; https://php.net/cgi.fix-pathinfo ;cgi.fix_pathinfo=1 ; if cgi.discard_path is enabled, the PHP CGI binary can safely be placed outside @@ -815,7 +815,7 @@ enable_dl = Off ; security context that the request runs under. mod_fastcgi under Apache ; does not currently support this feature (03/17/2002) ; Set to 1 if running under IIS. Default is zero. -; http://php.net/fastcgi.impersonate +; https://php.net/fastcgi.impersonate ;fastcgi.impersonate = 1 ; Disable logging through FastCGI connection. PHP's default behavior is to enable @@ -827,14 +827,14 @@ enable_dl = Off ; is supported by Apache. When this option is set to 1, PHP will send ; RFC2616 compliant header. ; Default is zero. -; http://php.net/cgi.rfc2616-headers +; https://php.net/cgi.rfc2616-headers ;cgi.rfc2616_headers = 0 ; cgi.check_shebang_line controls whether CGI PHP checks for line starting with #! ; (shebang) at the top of the running script. This line might be needed if the ; script support running both as stand-alone script and via PHP CGI<. PHP in CGI ; mode skips this line and ignores its content if this directive is turned on. -; http://php.net/cgi.check-shebang-line +; https://php.net/cgi.check-shebang-line ;cgi.check_shebang_line=1 ;;;;;;;;;;;;;;;; @@ -842,16 +842,16 @@ enable_dl = Off ;;;;;;;;;;;;;;;; ; Whether to allow HTTP file uploads. -; http://php.net/file-uploads +; https://php.net/file-uploads file_uploads = On ; Temporary directory for HTTP uploaded files (will use system default if not ; specified). -; http://php.net/upload-tmp-dir +; https://php.net/upload-tmp-dir ;upload_tmp_dir = ; Maximum allowed size for uploaded files. -; http://php.net/upload-max-filesize +; https://php.net/upload-max-filesize upload_max_filesize = 2M ; Maximum number of files that can be uploaded via a single request @@ -862,24 +862,24 @@ max_file_uploads = 20 ;;;;;;;;;;;;;;;;;; ; Whether to allow the treatment of URLs (like http:// or ftp://) as files. -; http://php.net/allow-url-fopen +; https://php.net/allow-url-fopen allow_url_fopen = On -; Whether to allow include/require to open URLs (like http:// or ftp://) as files. -; http://php.net/allow-url-include +; Whether to allow include/require to open URLs (like https:// or ftp://) as files. +; https://php.net/allow-url-include allow_url_include = Off ; Define the anonymous ftp password (your email address). PHP's default setting ; for this is empty. -; http://php.net/from +; https://php.net/from ;from="john@doe.com" ; Define the User-Agent string. PHP's default setting for this is empty. -; http://php.net/user-agent +; https://php.net/user-agent ;user_agent="PHP" ; Default timeout for socket based streams (seconds) -; http://php.net/default-socket-timeout +; https://php.net/default-socket-timeout default_socket_timeout = 60 ; If your scripts have to deal with files from Macintosh systems, @@ -887,7 +887,7 @@ default_socket_timeout = 60 ; unix or win32 systems, setting this flag will cause PHP to ; automatically detect the EOL character in those files so that ; fgets() and file() will work regardless of the source of the file. -; http://php.net/auto-detect-line-endings +; https://php.net/auto-detect-line-endings ;auto_detect_line_endings = Off ;;;;;;;;;;;;;;;;;;;;;; @@ -934,6 +934,7 @@ default_socket_timeout = 60 ;extension=exif ; Must be after mbstring as it depends on it ;extension=mysqli ;extension=oci8_12c ; Use with Oracle Database 12c Instant Client +;extension=oci8_19 ; Use with Oracle Database 19 Instant Client ;extension=odbc ;extension=openssl ;extension=pdo_firebird @@ -946,7 +947,7 @@ default_socket_timeout = 60 ;extension=shmop ; The MIBS data available in the PHP distribution must be installed. -; See http://www.php.net/manual/en/snmp.installation.php +; See https://www.php.net/manual/en/snmp.installation.php ;extension=snmp ;extension=soap @@ -968,26 +969,26 @@ cli_server.color = On [Date] ; Defines the default timezone used by the date functions -; http://php.net/date.timezone +; https://php.net/date.timezone ;date.timezone = -; http://php.net/date.default-latitude +; https://php.net/date.default-latitude ;date.default_latitude = 31.7667 -; http://php.net/date.default-longitude +; https://php.net/date.default-longitude ;date.default_longitude = 35.2333 -; http://php.net/date.sunrise-zenith +; https://php.net/date.sunrise-zenith ;date.sunrise_zenith = 90.833333 -; http://php.net/date.sunset-zenith +; https://php.net/date.sunset-zenith ;date.sunset_zenith = 90.833333 [filter] -; http://php.net/filter.default +; https://php.net/filter.default ;filter.default = unsafe_raw -; http://php.net/filter.default-flags +; https://php.net/filter.default-flags ;filter.default_flags = [iconv] @@ -1025,7 +1026,7 @@ cli_server.color = On [sqlite3] ; Directory pointing to SQLite3 extensions -; http://php.net/sqlite3.extension-dir +; https://php.net/sqlite3.extension-dir ;sqlite3.extension_dir = ; SQLite defensive mode flag (only available from SQLite 3.26+) @@ -1039,14 +1040,14 @@ cli_server.color = On [Pcre] ; PCRE library backtracking limit. -; http://php.net/pcre.backtrack-limit +; https://php.net/pcre.backtrack-limit ;pcre.backtrack_limit=100000 ; PCRE library recursion limit. ; Please note that if you set this value to a high number you may consume all ; the available process stack and eventually crash PHP (due to reaching the ; stack size limit imposed by the Operating System). -; http://php.net/pcre.recursion-limit +; https://php.net/pcre.recursion-limit ;pcre.recursion_limit=100000 ; Enables or disables JIT compilation of patterns. This requires the PCRE @@ -1055,7 +1056,7 @@ cli_server.color = On [Pdo] ; Whether to pool ODBC connections. Can be one of "strict", "relaxed" or "off" -; http://php.net/pdo-odbc.connection-pooling +; https://php.net/pdo-odbc.connection-pooling ;pdo_odbc.connection_pooling=strict [Pdo_mysql] @@ -1064,27 +1065,27 @@ cli_server.color = On pdo_mysql.default_socket= [Phar] -; http://php.net/phar.readonly +; https://php.net/phar.readonly ;phar.readonly = On -; http://php.net/phar.require-hash +; https://php.net/phar.require-hash ;phar.require_hash = On ;phar.cache_list = [mail function] ; For Win32 only. -; http://php.net/smtp +; https://php.net/smtp SMTP = localhost -; http://php.net/smtp-port +; https://php.net/smtp-port smtp_port = 25 ; For Win32 only. -; http://php.net/sendmail-from +; https://php.net/sendmail-from ;sendmail_from = me@example.com ; For Unix only. You may supply arguments as well (default: "sendmail -t -i"). -; http://php.net/sendmail-path +; https://php.net/sendmail-path ;sendmail_path = ; Force the addition of the specified parameters to be passed as extra parameters @@ -1102,13 +1103,13 @@ mail.add_x_header = Off ;mail.log = syslog [ODBC] -; http://php.net/odbc.default-db +; https://php.net/odbc.default-db ;odbc.default_db = Not yet implemented -; http://php.net/odbc.default-user +; https://php.net/odbc.default-user ;odbc.default_user = Not yet implemented -; http://php.net/odbc.default-pw +; https://php.net/odbc.default-pw ;odbc.default_pw = Not yet implemented ; Controls the ODBC cursor model. @@ -1116,68 +1117,68 @@ mail.add_x_header = Off ;odbc.default_cursortype ; Allow or prevent persistent links. -; http://php.net/odbc.allow-persistent +; https://php.net/odbc.allow-persistent odbc.allow_persistent = On ; Check that a connection is still valid before reuse. -; http://php.net/odbc.check-persistent +; https://php.net/odbc.check-persistent odbc.check_persistent = On ; Maximum number of persistent links. -1 means no limit. -; http://php.net/odbc.max-persistent +; https://php.net/odbc.max-persistent odbc.max_persistent = -1 ; Maximum number of links (persistent + non-persistent). -1 means no limit. -; http://php.net/odbc.max-links +; https://php.net/odbc.max-links odbc.max_links = -1 ; Handling of LONG fields. Returns number of bytes to variables. 0 means ; passthru. -; http://php.net/odbc.defaultlrl +; https://php.net/odbc.defaultlrl odbc.defaultlrl = 4096 ; Handling of binary data. 0 means passthru, 1 return as is, 2 convert to char. ; See the documentation on odbc_binmode and odbc_longreadlen for an explanation ; of odbc.defaultlrl and odbc.defaultbinmode -; http://php.net/odbc.defaultbinmode +; https://php.net/odbc.defaultbinmode odbc.defaultbinmode = 1 [MySQLi] ; Maximum number of persistent links. -1 means no limit. -; http://php.net/mysqli.max-persistent +; https://php.net/mysqli.max-persistent mysqli.max_persistent = -1 ; Allow accessing, from PHP's perspective, local files with LOAD DATA statements -; http://php.net/mysqli.allow_local_infile +; https://php.net/mysqli.allow_local_infile ;mysqli.allow_local_infile = On ; Allow or prevent persistent links. -; http://php.net/mysqli.allow-persistent +; https://php.net/mysqli.allow-persistent mysqli.allow_persistent = On ; Maximum number of links. -1 means no limit. -; http://php.net/mysqli.max-links +; https://php.net/mysqli.max-links mysqli.max_links = -1 ; Default port number for mysqli_connect(). If unset, mysqli_connect() will use ; the $MYSQL_TCP_PORT or the mysql-tcp entry in /etc/services or the ; compile-time value defined MYSQL_PORT (in that order). Win32 will only look ; at MYSQL_PORT. -; http://php.net/mysqli.default-port +; https://php.net/mysqli.default-port mysqli.default_port = 3306 ; Default socket name for local MySQL connects. If empty, uses the built-in ; MySQL defaults. -; http://php.net/mysqli.default-socket +; https://php.net/mysqli.default-socket mysqli.default_socket = ; Default host for mysqli_connect() (doesn't apply in safe mode). -; http://php.net/mysqli.default-host +; https://php.net/mysqli.default-host mysqli.default_host = ; Default user for mysqli_connect() (doesn't apply in safe mode). -; http://php.net/mysqli.default-user +; https://php.net/mysqli.default-user mysqli.default_user = ; Default password for mysqli_connect() (doesn't apply in safe mode). @@ -1185,7 +1186,7 @@ mysqli.default_user = ; *Any* user with PHP access can run 'echo get_cfg_var("mysqli.default_pw") ; and reveal this password! And of course, any users with read access to this ; file will be able to reveal the password as well. -; http://php.net/mysqli.default-pw +; https://php.net/mysqli.default-pw mysqli.default_pw = ; Allow or prevent reconnect @@ -1202,7 +1203,7 @@ mysqlnd.collect_memory_statistics = Off ; Records communication from all extensions using mysqlnd to the specified log ; file. -; http://php.net/mysqlnd.debug +; https://php.net/mysqlnd.debug ;mysqlnd.debug = ; Defines which queries will be logged. @@ -1229,25 +1230,25 @@ mysqlnd.collect_memory_statistics = Off ; Connection: Enables privileged connections using external ; credentials (OCI_SYSOPER, OCI_SYSDBA) -; http://php.net/oci8.privileged-connect +; https://php.net/oci8.privileged-connect ;oci8.privileged_connect = Off ; Connection: The maximum number of persistent OCI8 connections per ; process. Using -1 means no limit. -; http://php.net/oci8.max-persistent +; https://php.net/oci8.max-persistent ;oci8.max_persistent = -1 ; Connection: The maximum number of seconds a process is allowed to ; maintain an idle persistent connection. Using -1 means idle ; persistent connections will be maintained forever. -; http://php.net/oci8.persistent-timeout +; https://php.net/oci8.persistent-timeout ;oci8.persistent_timeout = -1 ; Connection: The number of seconds that must pass before issuing a ; ping during oci_pconnect() to check the connection validity. When ; set to 0, each oci_pconnect() will cause a ping. Using -1 disables ; pings completely. -; http://php.net/oci8.ping-interval +; https://php.net/oci8.ping-interval ;oci8.ping_interval = 60 ; Connection: Set this to a user chosen connection class to be used @@ -1265,59 +1266,59 @@ mysqlnd.collect_memory_statistics = Off ; Tuning: This option enables statement caching, and specifies how ; many statements to cache. Using 0 disables statement caching. -; http://php.net/oci8.statement-cache-size +; https://php.net/oci8.statement-cache-size ;oci8.statement_cache_size = 20 ; Tuning: Enables statement prefetching and sets the default number of ; rows that will be fetched automatically after statement execution. -; http://php.net/oci8.default-prefetch +; https://php.net/oci8.default-prefetch ;oci8.default_prefetch = 100 ; Compatibility. Using On means oci_close() will not close ; oci_connect() and oci_new_connect() connections. -; http://php.net/oci8.old-oci-close-semantics +; https://php.net/oci8.old-oci-close-semantics ;oci8.old_oci_close_semantics = Off [PostgreSQL] ; Allow or prevent persistent links. -; http://php.net/pgsql.allow-persistent +; https://php.net/pgsql.allow-persistent pgsql.allow_persistent = On ; Detect broken persistent links always with pg_pconnect(). ; Auto reset feature requires a little overheads. -; http://php.net/pgsql.auto-reset-persistent +; https://php.net/pgsql.auto-reset-persistent pgsql.auto_reset_persistent = Off ; Maximum number of persistent links. -1 means no limit. -; http://php.net/pgsql.max-persistent +; https://php.net/pgsql.max-persistent pgsql.max_persistent = -1 ; Maximum number of links (persistent+non persistent). -1 means no limit. -; http://php.net/pgsql.max-links +; https://php.net/pgsql.max-links pgsql.max_links = -1 ; Ignore PostgreSQL backends Notice message or not. ; Notice message logging require a little overheads. -; http://php.net/pgsql.ignore-notice +; https://php.net/pgsql.ignore-notice pgsql.ignore_notice = 0 ; Log PostgreSQL backends Notice message or not. ; Unless pgsql.ignore_notice=0, module cannot log notice message. -; http://php.net/pgsql.log-notice +; https://php.net/pgsql.log-notice pgsql.log_notice = 0 [bcmath] ; Number of decimal digits for all bcmath functions. -; http://php.net/bcmath.scale +; https://php.net/bcmath.scale bcmath.scale = 0 [browscap] -; http://php.net/browscap +; https://php.net/browscap ;browscap = extra/browscap.ini [Session] ; Handler used to store/retrieve data. -; http://php.net/session.save-handler +; https://php.net/session.save-handler session.save_handler = files ; Argument passed to save_handler. In the case of files, this is the path @@ -1346,7 +1347,7 @@ session.save_handler = files ; ; where MODE is the octal representation of the mode. Note that this ; does not overwrite the process's umask. -; http://php.net/session.save-path +; https://php.net/session.save-path ;session.save_path = "/tmp" ; Whether to use strict session mode. @@ -1359,42 +1360,42 @@ session.save_handler = files session.use_strict_mode = 0 ; Whether to use cookies. -; http://php.net/session.use-cookies +; https://php.net/session.use-cookies session.use_cookies = 1 -; http://php.net/session.cookie-secure +; https://php.net/session.cookie-secure ;session.cookie_secure = ; This option forces PHP to fetch and use a cookie for storing and maintaining ; the session id. We encourage this operation as it's very helpful in combating ; session hijacking when not specifying and managing your own session id. It is ; not the be-all and end-all of session hijacking defense, but it's a good start. -; http://php.net/session.use-only-cookies +; https://php.net/session.use-only-cookies session.use_only_cookies = 1 ; Name of the session (used as cookie name). -; http://php.net/session.name +; https://php.net/session.name session.name = PHPSESSID ; Initialize session on request startup. -; http://php.net/session.auto-start +; https://php.net/session.auto-start session.auto_start = 0 ; Lifetime in seconds of cookie or, if 0, until browser is restarted. -; http://php.net/session.cookie-lifetime +; https://php.net/session.cookie-lifetime session.cookie_lifetime = 0 ; The path for which the cookie is valid. -; http://php.net/session.cookie-path +; https://php.net/session.cookie-path session.cookie_path = / ; The domain for which the cookie is valid. -; http://php.net/session.cookie-domain +; https://php.net/session.cookie-domain session.cookie_domain = ; Whether or not to add the httpOnly flag to the cookie, which makes it ; inaccessible to browser scripting languages such as JavaScript. -; http://php.net/session.cookie-httponly +; https://php.net/session.cookie-httponly session.cookie_httponly = ; Add SameSite attribute to cookie to help mitigate Cross-Site Request Forgery (CSRF/XSRF) @@ -1404,7 +1405,7 @@ session.cookie_httponly = session.cookie_samesite = ; Handler used to serialize data. php is the standard serializer of PHP. -; http://php.net/session.serialize-handler +; https://php.net/session.serialize-handler session.serialize_handler = php ; Defines the probability that the 'garbage collection' process is started on every @@ -1413,7 +1414,7 @@ session.serialize_handler = php ; Default Value: 1 ; Development Value: 1 ; Production Value: 1 -; http://php.net/session.gc-probability +; https://php.net/session.gc-probability session.gc_probability = 1 ; Defines the probability that the 'garbage collection' process is started on every @@ -1423,12 +1424,12 @@ session.gc_probability = 1 ; Default Value: 100 ; Development Value: 1000 ; Production Value: 1000 -; http://php.net/session.gc-divisor +; https://php.net/session.gc-divisor session.gc_divisor = 1000 ; After this number of seconds, stored data will be seen as 'garbage' and ; cleaned up by the garbage collection process. -; http://php.net/session.gc-maxlifetime +; https://php.net/session.gc-maxlifetime session.gc_maxlifetime = 1440 ; NOTE: If you are using the subdirectory option for storing session files @@ -1442,16 +1443,16 @@ session.gc_maxlifetime = 1440 ; Check HTTP Referer to invalidate externally stored URLs containing ids. ; HTTP_REFERER has to contain this substring for the session to be ; considered as valid. -; http://php.net/session.referer-check +; https://php.net/session.referer-check session.referer_check = ; Set to {nocache,private,public,} to determine HTTP caching aspects ; or leave this empty to avoid sending anti-caching headers. -; http://php.net/session.cache-limiter +; https://php.net/session.cache-limiter session.cache_limiter = nocache ; Document expires after n minutes. -; http://php.net/session.cache-expire +; https://php.net/session.cache-expire session.cache_expire = 180 ; trans sid support is disabled by default. @@ -1463,13 +1464,13 @@ session.cache_expire = 180 ; in publicly accessible computer. ; - User may access your site with the same session ID ; always using URL stored in browser's history or bookmarks. -; http://php.net/session.use-trans-sid +; https://php.net/session.use-trans-sid session.use_trans_sid = 0 ; Set session ID character length. This value could be between 22 to 256. ; Shorter length than default is supported only for compatibility reason. ; Users should use 32 or more chars. -; http://php.net/session.sid-length +; https://php.net/session.sid-length ; Default Value: 32 ; Development Value: 26 ; Production Value: 26 @@ -1484,7 +1485,7 @@ session.sid_length = 26 ; Default Value: "a=href,area=href,frame=src,form=" ; Development Value: "a=href,area=href,frame=src,form=" ; Production Value: "a=href,area=href,frame=src,form=" -; http://php.net/url-rewriter.tags +; https://php.net/url-rewriter.tags session.trans_sid_tags = "a=href,area=href,frame=src,form=" ; URL rewriter does not rewrite absolute URLs by default. @@ -1509,14 +1510,14 @@ session.trans_sid_tags = "a=href,area=href,frame=src,form=" ; Default Value: 4 ; Development Value: 5 ; Production Value: 5 -; http://php.net/session.hash-bits-per-character +; https://php.net/session.hash-bits-per-character session.sid_bits_per_character = 5 ; Enable upload progress tracking in $_SESSION ; Default Value: On ; Development Value: On ; Production Value: On -; http://php.net/session.upload-progress.enabled +; https://php.net/session.upload-progress.enabled ;session.upload_progress.enabled = On ; Cleanup the progress information as soon as all POST data has been read @@ -1524,14 +1525,14 @@ session.sid_bits_per_character = 5 ; Default Value: On ; Development Value: On ; Production Value: On -; http://php.net/session.upload-progress.cleanup +; https://php.net/session.upload-progress.cleanup ;session.upload_progress.cleanup = On ; A prefix used for the upload progress key in $_SESSION ; Default Value: "upload_progress_" ; Development Value: "upload_progress_" ; Production Value: "upload_progress_" -; http://php.net/session.upload-progress.prefix +; https://php.net/session.upload-progress.prefix ;session.upload_progress.prefix = "upload_progress_" ; The index name (concatenated with the prefix) in $_SESSION @@ -1539,7 +1540,7 @@ session.sid_bits_per_character = 5 ; Default Value: "PHP_SESSION_UPLOAD_PROGRESS" ; Development Value: "PHP_SESSION_UPLOAD_PROGRESS" ; Production Value: "PHP_SESSION_UPLOAD_PROGRESS" -; http://php.net/session.upload-progress.name +; https://php.net/session.upload-progress.name ;session.upload_progress.name = "PHP_SESSION_UPLOAD_PROGRESS" ; How frequently the upload progress should be updated. @@ -1547,18 +1548,18 @@ session.sid_bits_per_character = 5 ; Default Value: "1%" ; Development Value: "1%" ; Production Value: "1%" -; http://php.net/session.upload-progress.freq +; https://php.net/session.upload-progress.freq ;session.upload_progress.freq = "1%" ; The minimum delay between updates, in seconds ; Default Value: 1 ; Development Value: 1 ; Production Value: 1 -; http://php.net/session.upload-progress.min-freq +; https://php.net/session.upload-progress.min-freq ;session.upload_progress.min_freq = "1" ; Only write session data when session data is changed. Enabled by default. -; http://php.net/session.lazy-write +; https://php.net/session.lazy-write ;session.lazy_write = On [Assertion] @@ -1570,48 +1571,48 @@ session.sid_bits_per_character = 5 ; Default Value: 1 ; Development Value: 1 ; Production Value: -1 -; http://php.net/zend.assertions +; https://php.net/zend.assertions zend.assertions = -1 ; Assert(expr); active by default. -; http://php.net/assert.active +; https://php.net/assert.active ;assert.active = On ; Throw an AssertionError on failed assertions -; http://php.net/assert.exception +; https://php.net/assert.exception ;assert.exception = On ; Issue a PHP warning for each failed assertion. (Overridden by assert.exception if active) -; http://php.net/assert.warning +; https://php.net/assert.warning ;assert.warning = On ; Don't bail out by default. -; http://php.net/assert.bail +; https://php.net/assert.bail ;assert.bail = Off ; User-function to be called if an assertion fails. -; http://php.net/assert.callback +; https://php.net/assert.callback ;assert.callback = 0 [COM] ; path to a file containing GUIDs, IIDs or filenames of files with TypeLibs -; http://php.net/com.typelib-file +; https://php.net/com.typelib-file ;com.typelib_file = ; allow Distributed-COM calls -; http://php.net/com.allow-dcom +; https://php.net/com.allow-dcom ;com.allow_dcom = true ; autoregister constants of a component's typlib on com_load() -; http://php.net/com.autoregister-typelib +; https://php.net/com.autoregister-typelib ;com.autoregister_typelib = true ; register constants casesensitive -; http://php.net/com.autoregister-casesensitive +; https://php.net/com.autoregister-casesensitive ;com.autoregister_casesensitive = false ; show warnings on duplicate constant registrations -; http://php.net/com.autoregister-verbose +; https://php.net/com.autoregister-verbose ;com.autoregister_verbose = true ; The default character set code-page to use when passing strings to and from COM objects. @@ -1625,7 +1626,7 @@ zend.assertions = -1 [mbstring] ; language for internal character representation. ; This affects mb_send_mail() and mbstring.detect_order. -; http://php.net/mbstring.language +; https://php.net/mbstring.language ;mbstring.language = Japanese ; Use of this INI entry is deprecated, use global internal_encoding instead. @@ -1639,8 +1640,8 @@ zend.assertions = -1 ; http input encoding. ; mbstring.encoding_translation = On is needed to use this setting. ; If empty, default_charset or input_encoding or mbstring.input is used. -; The precedence is: default_charset < input_encoding < mbsting.http_input -; http://php.net/mbstring.http-input +; The precedence is: default_charset < input_encoding < mbstring.http_input +; https://php.net/mbstring.http-input ;mbstring.http_input = ; Use of this INI entry is deprecated, use global output_encoding instead. @@ -1650,7 +1651,7 @@ zend.assertions = -1 ; The precedence is: default_charset < output_encoding < mbstring.http_output ; To use an output encoding conversion, mbstring's output handler must be set ; otherwise output encoding conversion cannot be performed. -; http://php.net/mbstring.http-output +; https://php.net/mbstring.http-output ;mbstring.http_output = ; enable automatic encoding translation according to @@ -1658,17 +1659,17 @@ zend.assertions = -1 ; converted to internal encoding by setting this to On. ; Note: Do _not_ use automatic encoding translation for ; portable libs/applications. -; http://php.net/mbstring.encoding-translation +; https://php.net/mbstring.encoding-translation ;mbstring.encoding_translation = Off ; automatic encoding detection order. ; "auto" detect order is changed according to mbstring.language -; http://php.net/mbstring.detect-order +; https://php.net/mbstring.detect-order ;mbstring.detect_order = auto ; substitute_character used when character cannot be converted ; one from another -; http://php.net/mbstring.substitute-character +; https://php.net/mbstring.substitute-character ;mbstring.substitute_character = none ; Enable strict encoding detection. @@ -1691,7 +1692,7 @@ zend.assertions = -1 ; Tell the jpeg decode to ignore warnings and try to create ; a gd image. The warning will then be displayed as notices ; disabled by default -; http://php.net/gd.jpeg-ignore-warning +; https://php.net/gd.jpeg-ignore-warning ;gd.jpeg_ignore_warning = 1 [exif] @@ -1700,47 +1701,47 @@ zend.assertions = -1 ; given by corresponding encode setting. When empty mbstring.internal_encoding ; is used. For the decode settings you can distinguish between motorola and ; intel byte order. A decode setting cannot be empty. -; http://php.net/exif.encode-unicode +; https://php.net/exif.encode-unicode ;exif.encode_unicode = ISO-8859-15 -; http://php.net/exif.decode-unicode-motorola +; https://php.net/exif.decode-unicode-motorola ;exif.decode_unicode_motorola = UCS-2BE -; http://php.net/exif.decode-unicode-intel +; https://php.net/exif.decode-unicode-intel ;exif.decode_unicode_intel = UCS-2LE -; http://php.net/exif.encode-jis +; https://php.net/exif.encode-jis ;exif.encode_jis = -; http://php.net/exif.decode-jis-motorola +; https://php.net/exif.decode-jis-motorola ;exif.decode_jis_motorola = JIS -; http://php.net/exif.decode-jis-intel +; https://php.net/exif.decode-jis-intel ;exif.decode_jis_intel = JIS [Tidy] ; The path to a default tidy configuration file to use when using tidy -; http://php.net/tidy.default-config +; https://php.net/tidy.default-config ;tidy.default_config = /usr/local/lib/php/default.tcfg ; Should tidy clean and repair output automatically? ; WARNING: Do not use this option if you are generating non-html content ; such as dynamic images -; http://php.net/tidy.clean-output +; https://php.net/tidy.clean-output tidy.clean_output = Off [soap] ; Enables or disables WSDL caching feature. -; http://php.net/soap.wsdl-cache-enabled +; https://php.net/soap.wsdl-cache-enabled soap.wsdl_cache_enabled=1 ; Sets the directory name where SOAP extension will put cache files. -; http://php.net/soap.wsdl-cache-dir +; https://php.net/soap.wsdl-cache-dir soap.wsdl_cache_dir="/tmp" ; (time to live) Sets the number of second while cached file will be used ; instead of original one. -; http://php.net/soap.wsdl-cache-ttl +; https://php.net/soap.wsdl-cache-ttl soap.wsdl_cache_ttl=86400 ; Sets the size of the cache limit. (Max. number of WSDL files to cache) @@ -1895,12 +1896,12 @@ ldap.max_links = -1 ; Specifies a PHP script that is going to be compiled and executed at server ; start-up. -; http://php.net/opcache.preload +; https://php.net/opcache.preload ;opcache.preload= ; Preloading code as root is not allowed for security reasons. This directive ; facilitates to let the preloading to be run as another user. -; http://php.net/opcache.preload_user +; https://php.net/opcache.preload_user ;opcache.preload_user= ; Prevents caching files that are less than this number of seconds old. It diff --git a/run-tests.php b/run-tests.php index 4beafa90b287e..3c1bf561494d0 100755 --- a/run-tests.php +++ b/run-tests.php @@ -121,6 +121,10 @@ function show_usage(): void --color --no-color Do/Don't colorize the result type in the test result. + --repeat [n] + Run the tests multiple times in the same process and check the + output of the last execution (CLI SAPI only). + HELP; } @@ -230,65 +234,6 @@ function main(): void $php_cgi = null; $phpdbg = null; - if (getenv('TEST_PHP_EXECUTABLE')) { - $php = getenv('TEST_PHP_EXECUTABLE'); - - if ($php == 'auto') { - $php = TEST_PHP_SRCDIR . '/sapi/cli/php'; - putenv("TEST_PHP_EXECUTABLE=$php"); - - if (!getenv('TEST_PHP_CGI_EXECUTABLE')) { - $php_cgi = TEST_PHP_SRCDIR . '/sapi/cgi/php-cgi'; - - if (file_exists($php_cgi)) { - putenv("TEST_PHP_CGI_EXECUTABLE=$php_cgi"); - } else { - $php_cgi = null; - } - } - } - $environment['TEST_PHP_EXECUTABLE'] = $php; - } - - if (getenv('TEST_PHP_CGI_EXECUTABLE')) { - $php_cgi = getenv('TEST_PHP_CGI_EXECUTABLE'); - - if ($php_cgi == 'auto') { - $php_cgi = TEST_PHP_SRCDIR . '/sapi/cgi/php-cgi'; - putenv("TEST_PHP_CGI_EXECUTABLE=$php_cgi"); - } - - $environment['TEST_PHP_CGI_EXECUTABLE'] = $php_cgi; - } - - if (!getenv('TEST_PHPDBG_EXECUTABLE')) { - if (IS_WINDOWS && file_exists(dirname($php) . "/phpdbg.exe")) { - $phpdbg = realpath(dirname($php) . "/phpdbg.exe"); - } elseif (file_exists(dirname($php) . "/../../sapi/phpdbg/phpdbg")) { - $phpdbg = realpath(dirname($php) . "/../../sapi/phpdbg/phpdbg"); - } elseif (file_exists("./sapi/phpdbg/phpdbg")) { - $phpdbg = realpath("./sapi/phpdbg/phpdbg"); - } elseif (file_exists(dirname($php) . "/phpdbg")) { - $phpdbg = realpath(dirname($php) . "/phpdbg"); - } else { - $phpdbg = null; - } - if ($phpdbg) { - putenv("TEST_PHPDBG_EXECUTABLE=$phpdbg"); - } - } - - if (getenv('TEST_PHPDBG_EXECUTABLE')) { - $phpdbg = getenv('TEST_PHPDBG_EXECUTABLE'); - - if ($phpdbg == 'auto') { - $phpdbg = TEST_PHP_SRCDIR . '/sapi/phpdbg/phpdbg'; - putenv("TEST_PHPDBG_EXECUTABLE=$phpdbg"); - } - - $environment['TEST_PHPDBG_EXECUTABLE'] = $phpdbg; - } - if (getenv('TEST_PHP_LOG_FORMAT')) { $log_format = strtoupper(getenv('TEST_PHP_LOG_FORMAT')); } else { @@ -688,14 +633,35 @@ function main(): void return; } - // Default to PHP_BINARY as executable - if (!isset($environment['TEST_PHP_EXECUTABLE'])) { + if (!$php) { + $php = getenv('TEST_PHP_EXECUTABLE'); + } + if (!$php) { $php = PHP_BINARY; - putenv("TEST_PHP_EXECUTABLE=$php"); - $environment['TEST_PHP_EXECUTABLE'] = $php; } - if (strlen($conf_passed)) { + if (!$php_cgi) { + $php_cgi = getenv('TEST_PHP_CGI_EXECUTABLE'); + } + if (!$php_cgi) { + $php_cgi = get_binary($php, 'php-cgi', 'sapi/cgi/php-cgi'); + } + + if (!$phpdbg) { + $phpdbg = getenv('TEST_PHPDBG_EXECUTABLE'); + } + if (!$phpdbg) { + $phpdbg = get_binary($php, 'phpdbg', 'sapi/phpdbg/phpdbg'); + } + + putenv("TEST_PHP_EXECUTABLE=$php"); + $environment['TEST_PHP_EXECUTABLE'] = $php; + putenv("TEST_PHP_CGI_EXECUTABLE=$php_cgi"); + $environment['TEST_PHP_CGI_EXECUTABLE'] = $php_cgi; + putenv("TEST_PHPDBG_EXECUTABLE=$phpdbg"); + $environment['TEST_PHPDBG_EXECUTABLE'] = $phpdbg; + + if ($conf_passed !== null) { if (IS_WINDOWS) { $pass_options .= " -c " . escapeshellarg($conf_passed); } else { @@ -1054,6 +1020,21 @@ function save_or_mail_results(): void } } +function get_binary(string $php, string $sapi, string $sapi_path): ?string +{ + $dir = dirname($php); + if (IS_WINDOWS && file_exists("$dir/$sapi.exe")) { + return realpath("$dir/$sapi.exe"); + } + if (file_exists("$dir/../../$sapi_path")) { + return realpath("$dir/../../$sapi_path"); + } + if (file_exists("$dir/$sapi")) { + return realpath("$dir/$sapi"); + } + return null; +} + function find_files(string $dir, bool $is_ext_dir = false, bool $ignore = false): void { global $test_files, $exts_to_test, $ignored_by_ext, $exts_skipped; @@ -2003,25 +1984,14 @@ function run_test(string $php, $file, array $env): string /* For GET/POST/PUT tests, check if cgi sapi is available and if it is, use it. */ if (array_key_exists('CGI', $section_text) || !empty($section_text['GET']) || !empty($section_text['POST']) || !empty($section_text['GZIP_POST']) || !empty($section_text['DEFLATE_POST']) || !empty($section_text['POST_RAW']) || !empty($section_text['PUT']) || !empty($section_text['COOKIE']) || !empty($section_text['EXPECTHEADERS'])) { - if (isset($php_cgi)) { - $php = $php_cgi . ' -C '; - } elseif (IS_WINDOWS && file_exists(dirname($php) . "/php-cgi.exe")) { - $php = realpath(dirname($php) . "/php-cgi.exe") . ' -C '; - } else { - if (file_exists(dirname($php) . "/../../sapi/cgi/php-cgi")) { - $php = realpath(dirname($php) . "/../../sapi/cgi/php-cgi") . ' -C '; - } elseif (file_exists("./sapi/cgi/php-cgi")) { - $php = realpath("./sapi/cgi/php-cgi") . ' -C '; - } elseif (file_exists(dirname($php) . "/php-cgi")) { - $php = realpath(dirname($php) . "/php-cgi") . ' -C '; - } else { - return skip_test($tested, $tested_file, $shortname, 'CGI not available'); - } + if (!$php_cgi) { + return skip_test($tested, $tested_file, $shortname, 'CGI not available'); } + $php = $php_cgi . ' -C '; + $uses_cgi = true; if ($num_repeats > 1) { return skip_test($tested, $tested_file, $shortname, 'CGI does not support --repeat'); } - $uses_cgi = true; } /* For phpdbg tests, check if phpdbg sapi is available and if it is, use it. */ @@ -2829,7 +2799,8 @@ function run_test(string $php, $file, array $env): string } // write .sh - $sh_script = << +--FILE-- +start(); +$tester->expectLogStartNotices(); +$tester + ->request('', ['SCRIPT_FILENAME' => null]) + ->expectHeader('Status', '404 Not Found') + ->expectError('Primary script unknown'); +$tester->terminate(); +$tester->close(); + +?> +Done +--EXPECT-- +Done +--CLEAN-- + diff --git a/sapi/fpm/tests/response.inc b/sapi/fpm/tests/response.inc index d6ee6c7afbdec..b531feacdca7e 100644 --- a/sapi/fpm/tests/response.inc +++ b/sapi/fpm/tests/response.inc @@ -98,6 +98,34 @@ class Response return $this->expectBody(''); } + /** + * @param string $name + * @param string $value + * @return Response + */ + public function expectHeader($name, $value) + { + $this->checkHeader($name, $value); + + return $this; + } + + /** + * @param string $errorMessage + * @return Response + */ + public function expectError($errorMessage) + { + $errorData = $this->getErrorData(); + if ($errorData !== $errorMessage) { + $this->error( + "The expected error message '$errorMessage' is not equal to returned error '$errorData'" + ); + } + + return $this; + } + /** * @param string $contentType * @return string|null diff --git a/sapi/fpm/tests/tester.inc b/sapi/fpm/tests/tester.inc index da5719b0648b2..5c57652d8843f 100644 --- a/sapi/fpm/tests/tester.inc +++ b/sapi/fpm/tests/tester.inc @@ -564,6 +564,10 @@ class Tester ], $headers ); + $params = array_filter($params, function($value) { + return !is_null($value); + }); + try { $this->response = new Response( $this->getClient($address, $connKeepAlive)->request_data($params, false) diff --git a/sapi/fuzzer/corpus/unserialize/oss_fuzz_27628 b/sapi/fuzzer/corpus/unserialize/oss_fuzz_27628 new file mode 100644 index 0000000000000..e22d1c88887e4 --- /dev/null +++ b/sapi/fuzzer/corpus/unserialize/oss_fuzz_27628 @@ -0,0 +1 @@ +O:1:"ÿ":4 S:8:" ";O:5:"ErRor":4 S:8:"previous";O:1:"ÿ":1 s:1:" ";R:3;} \ No newline at end of file diff --git a/sapi/fuzzer/corpus/unserialize/oss_fuzz_27876 b/sapi/fuzzer/corpus/unserialize/oss_fuzz_27876 new file mode 100644 index 0000000000000..98c5a5b19c2bb --- /dev/null +++ b/sapi/fuzzer/corpus/unserialize/oss_fuzz_27876 @@ -0,0 +1 @@ +a:2:{i:7;O:5:"ErRor":5 S:8:"previous";a:5:{i:7;R:3; \ No newline at end of file diff --git a/sapi/fuzzer/corpus/unserialize/oss_fuzz_27978 b/sapi/fuzzer/corpus/unserialize/oss_fuzz_27978 new file mode 100644 index 0000000000000..22b45ddf87708 --- /dev/null +++ b/sapi/fuzzer/corpus/unserialize/oss_fuzz_27978 @@ -0,0 +1 @@ +O:1:"ÿ":4 S:8:" ";O:5:"ErRor":3 S:8:"previous";R:2;S:8:"previous"; \ No newline at end of file diff --git a/sapi/phpdbg/phpdbg_lexer.l b/sapi/phpdbg/phpdbg_lexer.l index 422cda4f2c076..e57702ba0b167 100644 --- a/sapi/phpdbg/phpdbg_lexer.l +++ b/sapi/phpdbg/phpdbg_lexer.l @@ -33,7 +33,7 @@ void phpdbg_init_lexer (phpdbg_param_t *stack, char *input) { YYSETCONDITION(INITIAL); - LEX(text) = YYCURSOR = (unsigned char *) input; + LEX(text) = YYCURSOR = YYMARKER = (unsigned char *) input; LEX(len) = strlen(input); } @@ -165,6 +165,10 @@ INPUT ("\\"[#"']|["]("\\\\"|"\\"["]|[^\n\000"])+["]|[']("\\"[']|"\\\\"|[^\ return T_ID; } +* { + return T_UNEXPECTED; +} + {INPUT} { phpdbg_init_param(yylval, STR_PARAM); yylval->str = estrdup(yytext); diff --git a/sapi/phpdbg/phpdbg_parser.y b/sapi/phpdbg/phpdbg_parser.y index f776586810994..2953b3bcce67d 100644 --- a/sapi/phpdbg/phpdbg_parser.y +++ b/sapi/phpdbg/phpdbg_parser.y @@ -39,6 +39,7 @@ ZEND_EXTERN_MODULE_GLOBALS(phpdbg) %define api.value.type {phpdbg_param_t} %define parse.error verbose +%token END 0 "end of command" %token T_EVAL "eval" %token T_RUN "run" %token T_SHELL "shell" @@ -63,11 +64,15 @@ ZEND_EXTERN_MODULE_GLOBALS(phpdbg) %% /* Rules */ input - : command { $$ = $1; } - | input T_SEPARATOR command { phpdbg_stack_separate($1.top); $$ = $3; } + : non_empty_input { $$ = $1; } | %empty ; +non_empty_input + : command { $$ = $1; } + | non_empty_input T_SEPARATOR command { phpdbg_stack_separate($1.top); $$ = $3; } + ; + command : parameters { $$.top = PHPDBG_G(parser_stack)->top; } | full_expression { phpdbg_stack_push(PHPDBG_G(parser_stack), &$1); $$.top = PHPDBG_G(parser_stack)->top; } diff --git a/sapi/phpdbg/phpdbg_prompt.c b/sapi/phpdbg/phpdbg_prompt.c index 39ef7d8768263..58a54a5a55432 100644 --- a/sapi/phpdbg/phpdbg_prompt.c +++ b/sapi/phpdbg/phpdbg_prompt.c @@ -1227,7 +1227,7 @@ static void add_zendext_info(zend_extension *ext) /* {{{ */ { /* }}} */ #ifdef HAVE_LIBDL -PHPDBG_API const char *phpdbg_load_module_or_extension(char **path, char **name) /* {{{ */ { +PHPDBG_API const char *phpdbg_load_module_or_extension(char **path, const char **name) /* {{{ */ { DL_HANDLE handle; char *extension_dir; @@ -1325,7 +1325,7 @@ PHPDBG_API const char *phpdbg_load_module_or_extension(char **path, char **name) } module_entry = get_module(); - *name = (char *) module_entry->name; + *name = module_entry->name; if (strcmp(ZEND_EXTENSION_BUILD_ID, module_entry->build_id)) { phpdbg_error("dl", "type=\"wrongbuild\" module=\"%s\" buildneeded=\"%s\" buildinstalled=\"%s\"", "%s was built with configuration %s, whereas running engine is %s", module_entry->name, module_entry->build_id, ZEND_EXTENSION_BUILD_ID); @@ -1371,8 +1371,8 @@ PHPDBG_API const char *phpdbg_load_module_or_extension(char **path, char **name) PHPDBG_COMMAND(dl) /* {{{ */ { - const char *type; - char *name, *path; + const char *type, *name; + char *path; if (!param || param->type == EMPTY_PARAM) { phpdbg_notice("dl", "extensiontype=\"Zend extension\"", "Zend extensions"); @@ -1388,7 +1388,6 @@ PHPDBG_COMMAND(dl) /* {{{ */ phpdbg_activate_err_buf(1); if ((type = phpdbg_load_module_or_extension(&path, &name)) == NULL) { phpdbg_error("dl", "path=\"%s\" %b", "Could not load %s, not found or invalid zend extension / module: %b", path); - efree(name); } else { phpdbg_notice("dl", "extensiontype=\"%s\" name=\"%s\" path=\"%s\"", "Successfully loaded the %s %s at path %s", type, name, path); } diff --git a/sapi/phpdbg/tests/breakpoints_001.phpt b/sapi/phpdbg/tests/breakpoints_001.phpt index 4a13593d2531c..28f11760c815a 100644 --- a/sapi/phpdbg/tests/breakpoints_001.phpt +++ b/sapi/phpdbg/tests/breakpoints_001.phpt @@ -1,11 +1,5 @@ --TEST-- Fundamental breakpoints functionality ---SKIPIF-- - --PHPDBG-- b 3 r diff --git a/sapi/phpdbg/tests/breakpoints_002.phpt b/sapi/phpdbg/tests/breakpoints_002.phpt index fe56256dd79ad..93351321a875c 100644 --- a/sapi/phpdbg/tests/breakpoints_002.phpt +++ b/sapi/phpdbg/tests/breakpoints_002.phpt @@ -1,11 +1,5 @@ --TEST-- Preserve breakpoints on restart ---SKIPIF-- - --PHPDBG-- b breakpoints_002.php:4 r diff --git a/sapi/phpdbg/tests/breakpoints_003.phpt b/sapi/phpdbg/tests/breakpoints_003.phpt index 0db228f384f80..9a1f7cccc5bfd 100644 --- a/sapi/phpdbg/tests/breakpoints_003.phpt +++ b/sapi/phpdbg/tests/breakpoints_003.phpt @@ -1,11 +1,5 @@ --TEST-- Test deleting breakpoints ---SKIPIF-- - --PHPDBG-- b 4 b del 0 diff --git a/sapi/phpdbg/tests/breakpoints_004.phpt b/sapi/phpdbg/tests/breakpoints_004.phpt index 8141bf225201c..917e908efb4ad 100644 --- a/sapi/phpdbg/tests/breakpoints_004.phpt +++ b/sapi/phpdbg/tests/breakpoints_004.phpt @@ -1,11 +1,5 @@ --TEST-- Test opcode breakpoints ---SKIPIF-- - --PHPDBG-- b ZEND_ECHO r diff --git a/sapi/phpdbg/tests/bug73927.phpt b/sapi/phpdbg/tests/bug73927.phpt index 9f1cc684fada8..bb54f4e176172 100644 --- a/sapi/phpdbg/tests/bug73927.phpt +++ b/sapi/phpdbg/tests/bug73927.phpt @@ -5,9 +5,6 @@ Bug #73927 (phpdbg fails with windows error prompt at "watch array") if (getenv('SKIP_ASAN')) { die("skip intentionally causes segfaults"); } -if (PHP_OS_FAMILY === 'Windows' && ini_get('opcache.jit') && ini_get('opcache.jit_buffer_size')) { - die('xfail breakpoint/watchpoint issues with JIT on Windows'); -} ?> --PHPDBG-- b 19 diff --git a/sapi/phpdbg/tests/bug76813.phpt b/sapi/phpdbg/tests/bug76813.phpt new file mode 100644 index 0000000000000..67a51d73164a3 --- /dev/null +++ b/sapi/phpdbg/tests/bug76813.phpt @@ -0,0 +1,10 @@ +--TEST-- +Bug #76813 (Access_violation_near_NULL_on_source_operand) +--PHPDBG-- +"#!==)===\377\377\276\242=" +#!==)===\377\377\276\242= +--EXPECT-- +prompt> [Parse Error: syntax error, unexpected input, expecting end of command] +prompt> [Parse Error: syntax error, unexpected # (pound sign), expecting end of command] +prompt> [Parse Error: syntax error, unexpected # (pound sign), expecting end of command] +prompt> diff --git a/sapi/phpdbg/tests/exceptions_003.phpt b/sapi/phpdbg/tests/exceptions_003.phpt index d0f00b4ceb64b..ee68490df1afa 100644 --- a/sapi/phpdbg/tests/exceptions_003.phpt +++ b/sapi/phpdbg/tests/exceptions_003.phpt @@ -1,11 +1,5 @@ --TEST-- Test breaks on HANDLE_EXCEPTION ---SKIPIF-- - --PHPDBG-- b 5 r diff --git a/sapi/phpdbg/tests/finish_leave_001.phpt b/sapi/phpdbg/tests/finish_leave_001.phpt index 0597b3de0c915..cac771fd2f963 100644 --- a/sapi/phpdbg/tests/finish_leave_001.phpt +++ b/sapi/phpdbg/tests/finish_leave_001.phpt @@ -1,11 +1,5 @@ --TEST-- test finish and leave commands ---SKIPIF-- - --INI-- opcache.optimization_level=0 --PHPDBG-- diff --git a/sapi/phpdbg/tests/info_002.phpt b/sapi/phpdbg/tests/info_002.phpt index e16737dcc2cf4..8b1aa0930c9ae 100644 --- a/sapi/phpdbg/tests/info_002.phpt +++ b/sapi/phpdbg/tests/info_002.phpt @@ -1,11 +1,5 @@ --TEST-- info constants test ---SKIPIF-- - --PHPDBG-- b 10 r diff --git a/sapi/phpdbg/tests/next_001.phpt b/sapi/phpdbg/tests/next_001.phpt index 88f9ebd0184f3..afc5133d253a8 100644 --- a/sapi/phpdbg/tests/next_001.phpt +++ b/sapi/phpdbg/tests/next_001.phpt @@ -1,11 +1,5 @@ --TEST-- Test next command on function boundaries ---SKIPIF-- - --PHPDBG-- b 4 r diff --git a/sapi/phpdbg/tests/phpdbg_break_next.phpt b/sapi/phpdbg/tests/phpdbg_break_next.phpt index b129b6780ad6f..37ee2e8282e97 100644 --- a/sapi/phpdbg/tests/phpdbg_break_next.phpt +++ b/sapi/phpdbg/tests/phpdbg_break_next.phpt @@ -1,11 +1,5 @@ --TEST-- Test phpdbg_break_next() function ---SKIPIF-- - --PHPDBG-- r c diff --git a/sapi/phpdbg/tests/phpdbg_get_executable_stream_wrapper.phpt b/sapi/phpdbg/tests/phpdbg_get_executable_stream_wrapper.phpt index 21ac6a4919600..ab6236a7fce0f 100644 --- a/sapi/phpdbg/tests/phpdbg_get_executable_stream_wrapper.phpt +++ b/sapi/phpdbg/tests/phpdbg_get_executable_stream_wrapper.phpt @@ -1,11 +1,5 @@ --TEST-- Getting executable lines from custom wrappers ---SKIPIF-- - --PHPDBG-- r q diff --git a/sapi/phpdbg/tests/run_002.phpt b/sapi/phpdbg/tests/run_002.phpt index cffe42f27d537..02f6889d6da27 100644 --- a/sapi/phpdbg/tests/run_002.phpt +++ b/sapi/phpdbg/tests/run_002.phpt @@ -1,11 +1,5 @@ --TEST-- Stdin and escaped args being passed to run command ---SKIPIF-- - --CLEAN-- --PHPDBG-- r c diff --git a/sapi/phpdbg/tests/watch_001.phpt b/sapi/phpdbg/tests/watch_001.phpt index 2927496dece0b..90ede3f9524ff 100644 --- a/sapi/phpdbg/tests/watch_001.phpt +++ b/sapi/phpdbg/tests/watch_001.phpt @@ -5,9 +5,6 @@ Test simple recursive watchpoint if (PHP_INT_SIZE == 4) { die("xfail There may be flaws in the implementation of watchpoints that cause failures"); } -if (PHP_OS_FAMILY === 'Windows' && ini_get('opcache.jit') && ini_get('opcache.jit_buffer_size')) { - die('xfail breakpoint/watchpoint issues with JIT on Windows'); -} if (getenv('SKIP_ASAN')) { die("skip intentionally causes segfaults"); } diff --git a/sapi/phpdbg/tests/watch_002.phpt b/sapi/phpdbg/tests/watch_002.phpt index b2b860959044c..ba2cad1abee60 100644 --- a/sapi/phpdbg/tests/watch_002.phpt +++ b/sapi/phpdbg/tests/watch_002.phpt @@ -5,9 +5,6 @@ Test simple array watchpoint with replace if (PHP_INT_SIZE == 4) { die("xfail There may be flaws in the implementation of watchpoints that cause failures"); } -if (PHP_OS_FAMILY === 'Windows' && ini_get('opcache.jit') && ini_get('opcache.jit_buffer_size')) { - die('xfail breakpoint/watchpoint issues with JIT on Windows'); -} if (getenv('SKIP_ASAN')) { die("skip intentionally causes segfaults"); } diff --git a/sapi/phpdbg/tests/watch_003.phpt b/sapi/phpdbg/tests/watch_003.phpt index dd75f3321f12d..ab6dc317a87b4 100644 --- a/sapi/phpdbg/tests/watch_003.phpt +++ b/sapi/phpdbg/tests/watch_003.phpt @@ -5,9 +5,6 @@ Test simple watchpoint with replace if (PHP_INT_SIZE == 4) { die("xfail There may be flaws in the implementation of watchpoints that cause failures"); } -if (PHP_OS_FAMILY === 'Windows' && ini_get('opcache.jit') && ini_get('opcache.jit_buffer_size')) { - die('xfail breakpoint/watchpoint issues with JIT on Windows'); -} if (getenv('SKIP_ASAN')) { die("skip intentionally causes segfaults"); } diff --git a/sapi/phpdbg/tests/watch_004.phpt b/sapi/phpdbg/tests/watch_004.phpt index b04bea20b0bdb..42e3fd3b2686c 100644 --- a/sapi/phpdbg/tests/watch_004.phpt +++ b/sapi/phpdbg/tests/watch_004.phpt @@ -5,9 +5,6 @@ Test detection of inline string manipulations on zval watch if (PHP_INT_SIZE == 4) { die("xfail There may be flaws in the implementation of watchpoints that cause failures"); } -if (PHP_OS_FAMILY === 'Windows' && ini_get('opcache.jit') && ini_get('opcache.jit_buffer_size')) { - die('xfail breakpoint/watchpoint issues with JIT on Windows'); -} if (getenv('SKIP_ASAN')) { die("skip intentionally causes segfaults"); } diff --git a/sapi/phpdbg/tests/watch_005.phpt b/sapi/phpdbg/tests/watch_005.phpt index 73b1e628a1e7b..aacc158f61740 100644 --- a/sapi/phpdbg/tests/watch_005.phpt +++ b/sapi/phpdbg/tests/watch_005.phpt @@ -5,9 +5,6 @@ Test proper watch comparisons when having multiple levels of indirection from a if (PHP_INT_SIZE == 4) { die("xfail There may be flaws in the implementation of watchpoints that cause failures"); } -if (PHP_OS_FAMILY === 'Windows' && ini_get('opcache.jit') && ini_get('opcache.jit_buffer_size')) { - die('xfail breakpoint/watchpoint issues with JIT on Windows'); -} if (getenv('SKIP_ASAN')) { die("skip intentionally causes segfaults"); } diff --git a/sapi/phpdbg/tests/watch_006.phpt b/sapi/phpdbg/tests/watch_006.phpt index 8fb2fc3e58974..5b5ca9ee57c0e 100644 --- a/sapi/phpdbg/tests/watch_006.phpt +++ b/sapi/phpdbg/tests/watch_006.phpt @@ -5,9 +5,6 @@ Test multiple watch elements pointing to the same watchpoint if (PHP_INT_SIZE == 4) { die("xfail There may be flaws in the implementation of watchpoints that cause failures"); } -if (PHP_OS_FAMILY === 'Windows' && ini_get('opcache.jit') && ini_get('opcache.jit_buffer_size')) { - die('xfail breakpoint/watchpoint issues with JIT on Windows'); -} if (getenv('SKIP_ASAN')) { die("skip intentionally causes segfaults"); } diff --git a/scripts/dev/tidy.php b/scripts/dev/tidy.php index 7ec9f7902d662..c7f6591e2f0d1 100644 --- a/scripts/dev/tidy.php +++ b/scripts/dev/tidy.php @@ -4,9 +4,18 @@ throw new Exception($msg); }); -$rootDir = __DIR__ . '/../..'; +if ($argc > 1) { + $dir = $argv[1]; +} else { + $dir = __DIR__ . '/../..'; +} +if (!is_dir($dir)) { + echo "Directory $dir does not exist.\n"; + exit(1); +} + $it = new RecursiveIteratorIterator( - new RecursiveDirectoryIterator($rootDir), + new RecursiveDirectoryIterator($dir), RecursiveIteratorIterator::LEAVES_ONLY ); @@ -117,9 +126,9 @@ function transformTestCode(string $code, callable $transformer): string { } return preg_replace_callback( - '/(--(?:FILE|SKIPIF|CLEAN)--)(.+?)(--[A-Z_]+--)/s', + '/(--(?:FILE|SKIPIF|CLEAN)--)(.+?)(?=--[A-Z_]+--)/s', function(array $matches) use($transformer) { - return $matches[1] . $transformer($matches[2]) . $matches[3]; + return $matches[1] . $transformer($matches[2]); }, $code ); diff --git a/win32/build/confutils.js b/win32/build/confutils.js index d080140d03bed..31314ffd95db2 100644 --- a/win32/build/confutils.js +++ b/win32/build/confutils.js @@ -92,12 +92,14 @@ if (typeof(CWD) == "undefined") { CWD = FSO.GetParentFolderName(FSO.GetParentFolderName(FSO.GetAbsolutePathName("main\\php_version.h"))); } -/* defaults; we pick up the precise versions from configure.ac */ -var PHP_VERSION = 8; -var PHP_MINOR_VERSION = 1; -var PHP_RELEASE_VERSION = 0; -var PHP_EXTRA_VERSION = ""; -var PHP_VERSION_STRING = "8.1.0"; +if (!MODE_PHPIZE) { + /* defaults; we pick up the precise versions from configure.ac */ + var PHP_VERSION = 8; + var PHP_MINOR_VERSION = 1; + var PHP_RELEASE_VERSION = 0; + var PHP_EXTRA_VERSION = ""; + var PHP_VERSION_STRING = "8.1.0"; +} /* Get version numbers and DEFINE as a string */ function get_version_numbers() @@ -1542,7 +1544,6 @@ function EXTENSION(extname, file_list, shared, cflags, dllname, obj_dir) var _tmp = FSO.CreateTextFile(PHP_DIR + "/include/main/config.pickle.h", true); _tmp.Close(); } - cflags = "/FI main/config.pickle.h " + cflags; } ADD_FLAG("CFLAGS_" + EXT, cflags); @@ -2207,7 +2208,7 @@ function generate_config_pickle_h() var ln = outfile.ReadLine(); for (var i in keys) { - var reg = new RegExp("#define[\s ]+" + keys[i] + "[\s ]*.*", "g"); + var reg = new RegExp("#define[\s ]+" + keys[i] + "[\s ]*.*|#undef[\s ]+" + keys[i], "g"); if (ln.match(reg)) { found = true; @@ -2233,6 +2234,7 @@ function generate_config_pickle_h() continue; }*/ + lines.push("#undef " + keys[i]); lines.push("#define " + keys[i] + " " + item[0]); } @@ -2309,6 +2311,11 @@ function generate_config_h() outfile.WriteLine("#define " + keys[i] + " " + pieces); } + outfile.WriteBlankLines(1); + outfile.WriteLine("#if __has_include(\"main/config.pickle.h\")"); + outfile.WriteLine("#include \"main/config.pickle.h\""); + outfile.WriteLine("#endif"); + outfile.Close(); } @@ -2334,6 +2341,8 @@ function generate_phpize() MF.WriteLine("var PHP_VERSION=" + PHP_VERSION); MF.WriteLine("var PHP_MINOR_VERSION=" + PHP_MINOR_VERSION); MF.WriteLine("var PHP_RELEASE_VERSION=" + PHP_RELEASE_VERSION); + MF.WriteLine("var PHP_EXTRA_VERSION=\"" + PHP_EXTRA_VERSION + "\""); + MF.WriteLine("var PHP_VERSION_STRING=\"" + PHP_VERSION_STRING + "\""); MF.WriteBlankLines(1); MF.WriteLine("/* Generated extensions list with mode (static/shared) */"); diff --git a/win32/build/phpize.js.in b/win32/build/phpize.js.in index d12820403e976..40308f5fc7bc0 100644 --- a/win32/build/phpize.js.in +++ b/win32/build/phpize.js.in @@ -215,6 +215,12 @@ C.WriteLine("var PHP_ANALYZER = 'disabled';"); C.WriteLine("var PHP_PGO = 'no';"); C.WriteLine("var PHP_PGI = 'no';"); +C.WriteLine("var PHP_VERSION=" + PHP_VERSION); +C.WriteLine("var PHP_MINOR_VERSION=" + PHP_MINOR_VERSION); +C.WriteLine("var PHP_RELEASE_VERSION=" + PHP_RELEASE_VERSION); +C.WriteLine("var PHP_EXTRA_VERSION=\"" + PHP_EXTRA_VERSION + "\""); +C.WriteLine("var PHP_VERSION_STRING=\"" + PHP_VERSION_STRING + "\""); + C.Write(file_get_contents(PHP_DIR + "//script//ext_deps.js")); if (FSO.FileExists(PHP_DIR + "/script/ext_pickle.js")) { C.Write(file_get_contents(PHP_DIR + "//script//ext_pickle.js")); diff --git a/win32/sendmail.c b/win32/sendmail.c index 3d73ef9b5b3e5..059bc946ee7e2 100644 --- a/win32/sendmail.c +++ b/win32/sendmail.c @@ -459,6 +459,16 @@ static int SendText(char *RPath, const char *Subject, const char *mailTo, char * if (NULL == (pos2 = strstr(pos1, "\r\n"))) { tempMailTo = estrndup(pos1, strlen(pos1)); } else { + char *pos3; + while (pos2[2] == ' ' || pos2[2] == '\t') { + pos3 = strstr(pos2 + 2, "\r\n"); + if (pos3 != NULL) { + pos2 = pos3; + } else { + pos2 += strlen(pos2); + break; + } + } tempMailTo = estrndup(pos1, pos2 - pos1); } @@ -517,7 +527,22 @@ static int SendText(char *RPath, const char *Subject, const char *mailTo, char * header we know it was the last thing. */ pos2 = pos1; } else { + char *pos3 = NULL; + while (pos2[2] == ' ' || pos2[2] == '\t') { + pos3 = strstr(pos2 + 2, "\r\n"); + if (pos3 != NULL) { + pos2 = pos3; + } else { + pos2 += strlen(pos2); + break; + } + } tempMailTo = estrndup(pos1, pos2 - pos1); + if (pos3 == NULL) { + /* Later, when we remove the Bcc: out of the + header we know it was the last thing. */ + pos2 = pos1; + } } token = strtok(tempMailTo, ","); diff --git a/win32/winutil.c b/win32/winutil.c index 530dc4f0f6c23..a14416a6ce33e 100644 --- a/win32/winutil.c +++ b/win32/winutil.c @@ -24,7 +24,7 @@ PHP_WINUTIL_API char *php_win32_error_to_msg(HRESULT error) {/*{{{*/ - wchar_t *bufw = NULL; + wchar_t *bufw = NULL, *pw; char *buf; DWORD ret = FormatMessageW( @@ -36,6 +36,10 @@ PHP_WINUTIL_API char *php_win32_error_to_msg(HRESULT error) return ""; } + /* strip trailing line breaks and periods */ + for (pw = bufw + wcslen(bufw) - 1; pw >= bufw && (*pw == L'\r' || *pw == L'\n' || *pw == L'.'); pw--); + pw[1] = L'\0'; + buf = php_win32_cp_conv_w_to_any(bufw, ret, PHP_WIN32_CP_IGNORE_LEN_P); LocalFree(bufw);