From webhook-mailer at python.org Sun May 1 00:02:56 2022 From: webhook-mailer at python.org (miss-islington) Date: Sun, 01 May 2022 04:02:56 -0000 Subject: [Python-checkins] gh-91611: Use example.com for documentation, not mydomain.com (GH-91613) Message-ID: https://github.com/python/cpython/commit/cef3a994c7c966511563edc45292ec8f69770268 commit: cef3a994c7c966511563edc45292ec8f69770268 branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-04-30T21:02:51-07:00 summary: gh-91611: Use example.com for documentation, not mydomain.com (GH-91613) example.com is reserved by the IANA as special-use domain name for documentation purposes. The domain names are used widely in books, tutorials, sample network configurations, and generally as examples for the use of domain name. On the other hand, mydomain.com is real Domain Name Registration service. (cherry picked from commit ea392467829d6e93f824bde8eb87bdb31d9e4c62) Co-authored-by: Motoki Naruse files: M Doc/library/secrets.rst M Doc/library/ssl.rst diff --git a/Doc/library/secrets.rst b/Doc/library/secrets.rst index afa8e2d385fa4..c22da727b55c9 100644 --- a/Doc/library/secrets.rst +++ b/Doc/library/secrets.rst @@ -193,7 +193,7 @@ suitable for password recovery applications: .. testcode:: import secrets - url = 'https://mydomain.com/reset=' + secrets.token_urlsafe() + url = 'https://example.com/reset=' + secrets.token_urlsafe() diff --git a/Doc/library/ssl.rst b/Doc/library/ssl.rst index f5446808cbdeb..af9bf798da3b4 100644 --- a/Doc/library/ssl.rst +++ b/Doc/library/ssl.rst @@ -2345,7 +2345,7 @@ waiting for clients to connect:: context.load_cert_chain(certfile="mycertfile", keyfile="mykeyfile") bindsocket = socket.socket() - bindsocket.bind(('myaddr.mydomain.com', 10023)) + bindsocket.bind(('myaddr.example.com', 10023)) bindsocket.listen(5) When a client connects, you'll call :meth:`accept` on the socket to get the From webhook-mailer at python.org Sun May 1 00:03:15 2022 From: webhook-mailer at python.org (miss-islington) Date: Sun, 01 May 2022 04:03:15 -0000 Subject: [Python-checkins] gh-91611: Use example.com for documentation, not mydomain.com (GH-91613) Message-ID: https://github.com/python/cpython/commit/31e35bef22e6cf21526b1099c650e97a0a5c6652 commit: 31e35bef22e6cf21526b1099c650e97a0a5c6652 branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-04-30T21:03:11-07:00 summary: gh-91611: Use example.com for documentation, not mydomain.com (GH-91613) example.com is reserved by the IANA as special-use domain name for documentation purposes. The domain names are used widely in books, tutorials, sample network configurations, and generally as examples for the use of domain name. On the other hand, mydomain.com is real Domain Name Registration service. (cherry picked from commit ea392467829d6e93f824bde8eb87bdb31d9e4c62) Co-authored-by: Motoki Naruse files: M Doc/library/secrets.rst M Doc/library/ssl.rst diff --git a/Doc/library/secrets.rst b/Doc/library/secrets.rst index afa8e2d385fa4..c22da727b55c9 100644 --- a/Doc/library/secrets.rst +++ b/Doc/library/secrets.rst @@ -193,7 +193,7 @@ suitable for password recovery applications: .. testcode:: import secrets - url = 'https://mydomain.com/reset=' + secrets.token_urlsafe() + url = 'https://example.com/reset=' + secrets.token_urlsafe() diff --git a/Doc/library/ssl.rst b/Doc/library/ssl.rst index d21d6122e0a80..19d983bcfe28d 100644 --- a/Doc/library/ssl.rst +++ b/Doc/library/ssl.rst @@ -2357,7 +2357,7 @@ waiting for clients to connect:: context.load_cert_chain(certfile="mycertfile", keyfile="mykeyfile") bindsocket = socket.socket() - bindsocket.bind(('myaddr.mydomain.com', 10023)) + bindsocket.bind(('myaddr.example.com', 10023)) bindsocket.listen(5) When a client connects, you'll call :meth:`accept` on the socket to get the From webhook-mailer at python.org Sun May 1 00:05:24 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Sun, 01 May 2022 04:05:24 -0000 Subject: [Python-checkins] gh-81488: Add recursive wording for issubclass docs (#92087) Message-ID: https://github.com/python/cpython/commit/1066ecb97042b8e89de554e6f9dc2e3d634208c0 commit: 1066ecb97042b8e89de554e6f9dc2e3d634208c0 branch: main author: slateny <46876382+slateny at users.noreply.github.com> committer: JelleZijlstra date: 2022-04-30T22:05:20-06:00 summary: gh-81488: Add recursive wording for issubclass docs (#92087) files: M Doc/library/functions.rst diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst index 394281462ded5..cb86296897082 100644 --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -917,7 +917,8 @@ are always available. They are listed here in alphabetical order. Return ``True`` if *class* is a subclass (direct, indirect, or :term:`virtual `) of *classinfo*. A class is considered a subclass of itself. *classinfo* may be a tuple of class - objects or a :ref:`types-union`, in which case return ``True`` if *class* is a + objects (or recursively, other such tuples) + or a :ref:`types-union`, in which case return ``True`` if *class* is a subclass of any entry in *classinfo*. In any other case, a :exc:`TypeError` exception is raised. From webhook-mailer at python.org Sun May 1 00:21:59 2022 From: webhook-mailer at python.org (miss-islington) Date: Sun, 01 May 2022 04:21:59 -0000 Subject: [Python-checkins] gh-81488: Add recursive wording for issubclass docs (GH-92087) Message-ID: https://github.com/python/cpython/commit/a48d31f204642c8b38e55dd78c4839bb7ae5dce9 commit: a48d31f204642c8b38e55dd78c4839bb7ae5dce9 branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-04-30T21:21:51-07:00 summary: gh-81488: Add recursive wording for issubclass docs (GH-92087) (cherry picked from commit 1066ecb97042b8e89de554e6f9dc2e3d634208c0) Co-authored-by: slateny <46876382+slateny at users.noreply.github.com> files: M Doc/library/functions.rst diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst index 42fbf4e6f969c..ff81558da14cf 100644 --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -913,7 +913,8 @@ are always available. They are listed here in alphabetical order. Return ``True`` if *class* is a subclass (direct, indirect, or :term:`virtual `) of *classinfo*. A class is considered a subclass of itself. *classinfo* may be a tuple of class - objects or a :ref:`types-union`, in which case return ``True`` if *class* is a + objects (or recursively, other such tuples) + or a :ref:`types-union`, in which case return ``True`` if *class* is a subclass of any entry in *classinfo*. In any other case, a :exc:`TypeError` exception is raised. From webhook-mailer at python.org Sun May 1 00:40:37 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Sun, 01 May 2022 04:40:37 -0000 Subject: [Python-checkins] typing docs: Add example for async functions (#20386) Message-ID: https://github.com/python/cpython/commit/9588f880a286a8cc5597188f6ab44108c8f18761 commit: 9588f880a286a8cc5597188f6ab44108c8f18761 branch: main author: Sam Bull committer: JelleZijlstra date: 2022-04-30T22:40:27-06:00 summary: typing docs: Add example for async functions (#20386) Fixes python/typing#424 files: M Doc/library/typing.rst diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index 426cbf12b8c92..868ea1b81be42 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -221,6 +221,10 @@ For example:: on_error: Callable[[int, Exception], None]) -> None: # Body + async def on_update(value: str) -> None: + # Body + callback: Callable[[str], Awaitable[None]] = on_update + It is possible to declare the return type of a callable without specifying the call signature by substituting a literal ellipsis for the list of arguments in the type hint: ``Callable[..., ReturnType]``. From webhook-mailer at python.org Sun May 1 00:56:02 2022 From: webhook-mailer at python.org (miss-islington) Date: Sun, 01 May 2022 04:56:02 -0000 Subject: [Python-checkins] typing docs: Add example for async functions (GH-20386) Message-ID: https://github.com/python/cpython/commit/e7de54321952ebb58cc414f2160c9ad4f6510af2 commit: e7de54321952ebb58cc414f2160c9ad4f6510af2 branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-04-30T21:55:58-07:00 summary: typing docs: Add example for async functions (GH-20386) Fixes python/typingGH-424 (cherry picked from commit 9588f880a286a8cc5597188f6ab44108c8f18761) Co-authored-by: Sam Bull files: M Doc/library/typing.rst diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index 36d637f366509..6a160af895c06 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -211,6 +211,10 @@ For example:: on_error: Callable[[int, Exception], None]) -> None: # Body + async def on_update(value: str) -> None: + # Body + callback: Callable[[str], Awaitable[None]] = on_update + It is possible to declare the return type of a callable without specifying the call signature by substituting a literal ellipsis for the list of arguments in the type hint: ``Callable[..., ReturnType]``. From webhook-mailer at python.org Sun May 1 00:59:30 2022 From: webhook-mailer at python.org (miss-islington) Date: Sun, 01 May 2022 04:59:30 -0000 Subject: [Python-checkins] typing docs: Add example for async functions (GH-20386) Message-ID: https://github.com/python/cpython/commit/fcbff77b26c44b8ee58c2ef2c3b25b3ffe7c20e9 commit: fcbff77b26c44b8ee58c2ef2c3b25b3ffe7c20e9 branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-04-30T21:59:26-07:00 summary: typing docs: Add example for async functions (GH-20386) Fixes python/typingGH-424 (cherry picked from commit 9588f880a286a8cc5597188f6ab44108c8f18761) Co-authored-by: Sam Bull files: M Doc/library/typing.rst diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index 202f5b5e8fec4..c0af2ed7c429a 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -194,6 +194,10 @@ For example:: on_error: Callable[[int, Exception], None]) -> None: # Body + async def on_update(value: str) -> None: + # Body + callback: Callable[[str], Awaitable[None]] = on_update + It is possible to declare the return type of a callable without specifying the call signature by substituting a literal ellipsis for the list of arguments in the type hint: ``Callable[..., ReturnType]``. From webhook-mailer at python.org Sun May 1 02:04:54 2022 From: webhook-mailer at python.org (miss-islington) Date: Sun, 01 May 2022 06:04:54 -0000 Subject: [Python-checkins] bpo-39716: Raise on conflicting subparser names. (GH-18605) Message-ID: https://github.com/python/cpython/commit/ad5e8520f3e117f45481513014548a39879d30d2 commit: ad5e8520f3e117f45481513014548a39879d30d2 branch: main author: Antony Lee committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-04-30T23:04:50-07:00 summary: bpo-39716: Raise on conflicting subparser names. (GH-18605) Raise an ArgumentError when the same subparser name is added twice to an ArgumentParser. This is consistent with the (default) behavior when the same option string is added twice to an ArgumentParser. (Support for `conflict_handler="resolve"` could be considered as a followup feature, although real use cases seem even rarer than "resolve"ing option-strings.) Automerge-Triggered-By: GH:rhettinger files: A Misc/NEWS.d/next/Library/2020-02-22-12-02-11.bpo-39716.z2WhDQ.rst M Lib/argparse.py M Lib/test/test_argparse.py diff --git a/Lib/argparse.py b/Lib/argparse.py index 668e1d416231f..c47aeffc2c3f6 100644 --- a/Lib/argparse.py +++ b/Lib/argparse.py @@ -1171,6 +1171,13 @@ def add_parser(self, name, **kwargs): aliases = kwargs.pop('aliases', ()) + if name in self._name_parser_map: + raise ArgumentError(self, _('conflicting subparser: %s') % name) + for alias in aliases: + if alias in self._name_parser_map: + raise ArgumentError( + self, _('conflicting subparser alias: %s') % alias) + # create a pseudo-action to hold the choice help if 'help' in kwargs: help = kwargs.pop('help') diff --git a/Lib/test/test_argparse.py b/Lib/test/test_argparse.py index 5777cb50f7e53..794b9df3796df 100644 --- a/Lib/test/test_argparse.py +++ b/Lib/test/test_argparse.py @@ -4804,6 +4804,19 @@ def test_resolve_error(self): --spam NEW_SPAM ''')) + def test_subparser_conflict(self): + parser = argparse.ArgumentParser() + sp = parser.add_subparsers() + sp.add_parser('fullname', aliases=['alias']) + self.assertRaises(argparse.ArgumentError, + sp.add_parser, 'fullname') + self.assertRaises(argparse.ArgumentError, + sp.add_parser, 'alias') + self.assertRaises(argparse.ArgumentError, + sp.add_parser, 'other', aliases=['fullname']) + self.assertRaises(argparse.ArgumentError, + sp.add_parser, 'other', aliases=['alias']) + # ============================= # Help and Version option tests diff --git a/Misc/NEWS.d/next/Library/2020-02-22-12-02-11.bpo-39716.z2WhDQ.rst b/Misc/NEWS.d/next/Library/2020-02-22-12-02-11.bpo-39716.z2WhDQ.rst new file mode 100644 index 0000000000000..f122811e6bfe3 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-02-22-12-02-11.bpo-39716.z2WhDQ.rst @@ -0,0 +1,3 @@ +Raise an ArgumentError when the same subparser name is added twice to an +`argparse.ArgumentParser`. This is consistent with the (default) behavior +when the same option string is added twice to an ArgumentParser. From webhook-mailer at python.org Sun May 1 06:02:00 2022 From: webhook-mailer at python.org (serhiy-storchaka) Date: Sun, 01 May 2022 10:02:00 -0000 Subject: [Python-checkins] [3.9] gh-92049: Forbid pickling constants re._constants.SUCCESS etc (GH-92070) (GH-92073) (GH-92102) Message-ID: https://github.com/python/cpython/commit/54f06aeb74909f6c3b0727e73987639732428751 commit: 54f06aeb74909f6c3b0727e73987639732428751 branch: 3.9 author: Serhiy Storchaka committer: serhiy-storchaka date: 2022-05-01T13:01:56+03:00 summary: [3.9] gh-92049: Forbid pickling constants re._constants.SUCCESS etc (GH-92070) (GH-92073) (GH-92102) Previously, pickling did not fail, but the result could not be unpickled. (cherry picked from commit 6d0d547033e295f91f05030322acfbb0e280fc1f) (cherry picked from commit e8ff3c92f69b475aa20ba7c08efccbc329f9b42e) files: A Misc/NEWS.d/next/Library/2022-04-30-10-53-10.gh-issue-92049.5SEKoh.rst M Lib/sre_constants.py diff --git a/Lib/sre_constants.py b/Lib/sre_constants.py index 8e613cb3fa5dc..db3ca51e8306a 100644 --- a/Lib/sre_constants.py +++ b/Lib/sre_constants.py @@ -62,6 +62,8 @@ def __new__(cls, value, name): def __repr__(self): return self.name + __reduce__ = None + MAXREPEAT = _NamedIntConstant(MAXREPEAT, 'MAXREPEAT') def _makecodes(names): diff --git a/Misc/NEWS.d/next/Library/2022-04-30-10-53-10.gh-issue-92049.5SEKoh.rst b/Misc/NEWS.d/next/Library/2022-04-30-10-53-10.gh-issue-92049.5SEKoh.rst new file mode 100644 index 0000000000000..cad4621c65096 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-04-30-10-53-10.gh-issue-92049.5SEKoh.rst @@ -0,0 +1,2 @@ +Forbid pickling constants ``re._constants.SUCCESS`` etc. Previously, +pickling did not fail, but the result could not be unpickled. From webhook-mailer at python.org Sun May 1 16:38:15 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Sun, 01 May 2022 20:38:15 -0000 Subject: [Python-checkins] build(deps): bump actions/cache from 3.0.1 to 3.0.2 (#92111) Message-ID: https://github.com/python/cpython/commit/eefe6911f4f497e8b73e0690f9b3f47904fdb02a commit: eefe6911f4f497e8b73e0690f9b3f47904fdb02a branch: main author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> committer: JelleZijlstra date: 2022-05-01T14:37:52-06:00 summary: build(deps): bump actions/cache from 3.0.1 to 3.0.2 (#92111) Bumps [actions/cache](https://github.com/actions/cache) from 3.0.1 to 3.0.2. - [Release notes](https://github.com/actions/cache/releases) - [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md) - [Commits](https://github.com/actions/cache/compare/v3.0.1...v3.0.2) --- updated-dependencies: - dependency-name: actions/cache dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> files: M .github/workflows/build.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8956c2cfc4e70..1f48d6257e760 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -185,7 +185,7 @@ jobs: echo "LD_LIBRARY_PATH=${GITHUB_WORKSPACE}/multissl/openssl/${OPENSSL_VER}/lib" >> $GITHUB_ENV - name: 'Restore OpenSSL build' id: cache-openssl - uses: actions/cache at v3.0.1 + uses: actions/cache at v3.0.2 with: path: ./multissl/openssl/${{ env.OPENSSL_VER }} key: ${{ runner.os }}-multissl-openssl-${{ env.OPENSSL_VER }} @@ -248,7 +248,7 @@ jobs: echo "LD_LIBRARY_PATH=${GITHUB_WORKSPACE}/multissl/openssl/${OPENSSL_VER}/lib" >> $GITHUB_ENV - name: 'Restore OpenSSL build' id: cache-openssl - uses: actions/cache at v3.0.1 + uses: actions/cache at v3.0.2 with: path: ./multissl/openssl/${{ env.OPENSSL_VER }} key: ${{ runner.os }}-multissl-openssl-${{ env.OPENSSL_VER }} @@ -292,7 +292,7 @@ jobs: echo "LD_LIBRARY_PATH=${GITHUB_WORKSPACE}/multissl/openssl/${OPENSSL_VER}/lib" >> $GITHUB_ENV - name: 'Restore OpenSSL build' id: cache-openssl - uses: actions/cache at v3.0.1 + uses: actions/cache at v3.0.2 with: path: ./multissl/openssl/${{ env.OPENSSL_VER }} key: ${{ runner.os }}-multissl-openssl-${{ env.OPENSSL_VER }} From webhook-mailer at python.org Sun May 1 16:40:03 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Sun, 01 May 2022 20:40:03 -0000 Subject: [Python-checkins] build(deps): bump actions/setup-node from 2 to 3 (#92110) Message-ID: https://github.com/python/cpython/commit/0d4fdb665e167d7641f2fb45a83376ba7ba2e4d6 commit: 0d4fdb665e167d7641f2fb45a83376ba7ba2e4d6 branch: main author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> committer: JelleZijlstra date: 2022-05-01T14:39:53-06:00 summary: build(deps): bump actions/setup-node from 2 to 3 (#92110) Bumps [actions/setup-node](https://github.com/actions/setup-node) from 2 to 3. - [Release notes](https://github.com/actions/setup-node/releases) - [Commits](https://github.com/actions/setup-node/compare/v2...v3) --- updated-dependencies: - dependency-name: actions/setup-node dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> files: M .github/workflows/new-bugs-announce-notifier.yml diff --git a/.github/workflows/new-bugs-announce-notifier.yml b/.github/workflows/new-bugs-announce-notifier.yml index a18946306f839..ad434917491c0 100644 --- a/.github/workflows/new-bugs-announce-notifier.yml +++ b/.github/workflows/new-bugs-announce-notifier.yml @@ -9,7 +9,7 @@ jobs: notify-new-bugs-announce: runs-on: ubuntu-latest steps: - - uses: actions/setup-node at v2 + - uses: actions/setup-node at v3 with: node-version: 14 - run: npm install mailgun.js form-data From webhook-mailer at python.org Sun May 1 16:52:53 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Sun, 01 May 2022 20:52:53 -0000 Subject: [Python-checkins] build(deps): bump actions/github-script from 5 to 6 (#92109) Message-ID: https://github.com/python/cpython/commit/51f69461a50908b05e29333c7917189b1dc6c96c commit: 51f69461a50908b05e29333c7917189b1dc6c96c branch: main author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> committer: JelleZijlstra date: 2022-05-01T14:52:21-06:00 summary: build(deps): bump actions/github-script from 5 to 6 (#92109) Bumps [actions/github-script](https://github.com/actions/github-script) from 5 to 6. - [Release notes](https://github.com/actions/github-script/releases) - [Commits](https://github.com/actions/github-script/compare/v5...v6) --- updated-dependencies: - dependency-name: actions/github-script dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> files: M .github/workflows/new-bugs-announce-notifier.yml diff --git a/.github/workflows/new-bugs-announce-notifier.yml b/.github/workflows/new-bugs-announce-notifier.yml index ad434917491c0..8cd834419f00b 100644 --- a/.github/workflows/new-bugs-announce-notifier.yml +++ b/.github/workflows/new-bugs-announce-notifier.yml @@ -14,7 +14,7 @@ jobs: node-version: 14 - run: npm install mailgun.js form-data - name: Send notification - uses: actions/github-script at v5 + uses: actions/github-script at v6 env: MAILGUN_API_KEY: ${{ secrets.PSF_MAILGUN_KEY }} with: From webhook-mailer at python.org Sun May 1 16:53:25 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Sun, 01 May 2022 20:53:25 -0000 Subject: [Python-checkins] build(deps): bump actions/stale from 4 to 5 (#92108) Message-ID: https://github.com/python/cpython/commit/34129f7c42b31d12d8ed692cd3f82c8d36c6c644 commit: 34129f7c42b31d12d8ed692cd3f82c8d36c6c644 branch: main author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> committer: JelleZijlstra date: 2022-05-01T14:53:15-06:00 summary: build(deps): bump actions/stale from 4 to 5 (#92108) Bumps [actions/stale](https://github.com/actions/stale) from 4 to 5. - [Release notes](https://github.com/actions/stale/releases) - [Changelog](https://github.com/actions/stale/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/stale/compare/v4...v5) --- updated-dependencies: - dependency-name: actions/stale dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> files: M .github/workflows/stale.yml diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index 72a7a0ba9c83c..a8fecbf216b95 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -15,7 +15,7 @@ jobs: steps: - name: "Check PRs" - uses: actions/stale at v4 + uses: actions/stale at v5 with: repo-token: ${{ secrets.GITHUB_TOKEN }} stale-pr-message: 'This PR is stale because it has been open for 30 days with no activity.' From webhook-mailer at python.org Sun May 1 19:09:55 2022 From: webhook-mailer at python.org (gpshead) Date: Sun, 01 May 2022 23:09:55 -0000 Subject: [Python-checkins] [3.10] gh-91401: Conservative backport of `subprocess._USE_VFORK` (#91932) Message-ID: https://github.com/python/cpython/commit/ea1eba03e7e8401d5acf8b30b56b41faa209e8c6 commit: ea1eba03e7e8401d5acf8b30b56b41faa209e8c6 branch: 3.10 author: Gregory P. Smith committer: gpshead date: 2022-05-01T16:09:50-07:00 summary: [3.10] gh-91401: Conservative backport of `subprocess._USE_VFORK` (#91932) This does not alter the `_posixsubprocess.fork_exec()` private API to avoid issues for anyone relying on that (bad idea) or for anyone who's `subprocess.py` and `_posixsubprocess.so` upgrades may not become visible to existing Python 3.10 processes at the same time. Backports the concept of cd5726fe674eaff442510eeb6c75628858be9e9f. Provides a fail-safe way to disable vfork for #91401. I didn't backport the documentation as I don't actually expect this to be used and `.. versionadded: 3.10.5` always looks weird in docs. It's being done more to have a fail-safe in place for people just in case. files: A Misc/NEWS.d/next/Library/2022-04-26-00-10-06.gh-issue-91401.mddRC8.rst M Lib/subprocess.py M Lib/test/test_subprocess.py M Modules/_posixsubprocess.c diff --git a/Lib/subprocess.py b/Lib/subprocess.py index ccb46a6337b3d..a414321b9d197 100644 --- a/Lib/subprocess.py +++ b/Lib/subprocess.py @@ -691,7 +691,10 @@ def _use_posix_spawn(): return False +# These are primarily fail-safe knobs for negatives. A True value does not +# guarantee the given libc/syscall API will be used. _USE_POSIX_SPAWN = _use_posix_spawn() +_USE_VFORK = True class Popen: diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py index 7bb049296912b..b91791a02a2e5 100644 --- a/Lib/test/test_subprocess.py +++ b/Lib/test/test_subprocess.py @@ -1702,6 +1702,28 @@ def test_run_with_shell_timeout_and_capture_output(self): msg="TimeoutExpired was delayed! Bad traceback:\n```\n" f"{stacks}```") + @unittest.skipIf(not sysconfig.get_config_var("HAVE_VFORK"), + "vfork() not enabled by configure.") + def test__use_vfork(self): + # Attempts code coverage within _posixsubprocess.c on the code that + # probes the subprocess module for the existence and value of this + # attribute in 3.10.5. + self.assertTrue(subprocess._USE_VFORK) # The default value regardless. + with mock.patch.object(subprocess, "_USE_VFORK", False): + self.assertEqual(self.run_python("pass").returncode, 0, + msg="False _USE_VFORK failed") + + class RaisingBool: + def __bool__(self): + raise RuntimeError("force PyObject_IsTrue to return -1") + + with mock.patch.object(subprocess, "_USE_VFORK", RaisingBool()): + self.assertEqual(self.run_python("pass").returncode, 0, + msg="odd bool()-error _USE_VFORK failed") + del subprocess._USE_VFORK + self.assertEqual(self.run_python("pass").returncode, 0, + msg="lack of a _USE_VFORK attribute failed") + def _get_test_grp_name(): for name_group in ('staff', 'nogroup', 'grp', 'nobody', 'nfsnobody'): diff --git a/Misc/NEWS.d/next/Library/2022-04-26-00-10-06.gh-issue-91401.mddRC8.rst b/Misc/NEWS.d/next/Library/2022-04-26-00-10-06.gh-issue-91401.mddRC8.rst new file mode 100644 index 0000000000000..964a54f8935c2 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-04-26-00-10-06.gh-issue-91401.mddRC8.rst @@ -0,0 +1,5 @@ +Provide a fail-safe way to disable :mod:`subprocess` use of ``vfork()`` via +a private ``subprocess._USE_VFORK`` attribute. While there is currently no +known need for this, if you find a need please only set it to ``False``. +File a CPython issue as to why you needed it and link to that from a +comment in your code. This attribute is documented as a footnote in 3.11. diff --git a/Modules/_posixsubprocess.c b/Modules/_posixsubprocess.c index 18a81c6ed8b35..b852ad71d7225 100644 --- a/Modules/_posixsubprocess.c +++ b/Modules/_posixsubprocess.c @@ -936,8 +936,31 @@ subprocess_fork_exec(PyObject *module, PyObject *args) #ifdef VFORK_USABLE /* Use vfork() only if it's safe. See the comment above child_exec(). */ sigset_t old_sigs; - if (preexec_fn == Py_None && - !call_setuid && !call_setgid && !call_setgroups) { + int allow_vfork; + if (preexec_fn == Py_None) { + allow_vfork = 1; /* 3.10.0 behavior */ + PyObject *subprocess_module = PyImport_ImportModule("subprocess"); + if (subprocess_module != NULL) { + PyObject *allow_vfork_obj = PyObject_GetAttrString( + subprocess_module, "_USE_VFORK"); + Py_DECREF(subprocess_module); + if (allow_vfork_obj != NULL) { + allow_vfork = PyObject_IsTrue(allow_vfork_obj); + Py_DECREF(allow_vfork_obj); + if (allow_vfork < 0) { + PyErr_Clear(); /* Bad _USE_VFORK attribute. */ + allow_vfork = 1; /* 3.10.0 behavior */ + } + } else { + PyErr_Clear(); /* No _USE_VFORK attribute. */ + } + } else { + PyErr_Clear(); /* no subprocess module? suspicious; don't care. */ + } + } else { + allow_vfork = 0; + } + if (allow_vfork && !call_setuid && !call_setgid && !call_setgroups) { /* Block all signals to ensure that no signal handlers are run in the * child process while it shares memory with us. Note that signals * used internally by C libraries won't be blocked by From webhook-mailer at python.org Sun May 1 19:46:22 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Sun, 01 May 2022 23:46:22 -0000 Subject: [Python-checkins] [3.10] build(deps): bump actions/stale from 4 to 5 (GH-92108) (#92127) Message-ID: https://github.com/python/cpython/commit/1fd3ab7c28451f7346c7e911e265ad74f6086d19 commit: 1fd3ab7c28451f7346c7e911e265ad74f6086d19 branch: 3.10 author: Jelle Zijlstra committer: JelleZijlstra date: 2022-05-01T17:46:06-06:00 summary: [3.10] build(deps): bump actions/stale from 4 to 5 (GH-92108) (#92127) Bumps [actions/stale](https://github.com/actions/stale) from 4 to 5. - [Release notes](https://github.com/actions/stale/releases) - [Changelog](https://github.com/actions/stale/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/stale/compare/v4...v5) --- updated-dependencies: - dependency-name: actions/stale dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>. (cherry picked from commit 34129f7c42b31d12d8ed692cd3f82c8d36c6c644) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> files: M .github/workflows/stale.yml diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index 26806fad814f1..4a08ef0d8dac5 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -13,7 +13,8 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/stale at v3 + - name: "Check PRs" + uses: actions/stale at v5 with: repo-token: ${{ secrets.GITHUB_TOKEN }} stale-pr-message: 'This PR is stale because it has been open for 30 days with no activity.' From webhook-mailer at python.org Sun May 1 19:46:22 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Sun, 01 May 2022 23:46:22 -0000 Subject: [Python-checkins] [3.9] build(deps): bump actions/cache from 3.0.1 to 3.0.2 (GH-92111) (#92125) Message-ID: https://github.com/python/cpython/commit/07c1cfd3a75d79358f5ddb130d0738c2b237545e commit: 07c1cfd3a75d79358f5ddb130d0738c2b237545e branch: 3.9 author: Jelle Zijlstra committer: JelleZijlstra date: 2022-05-01T17:46:15-06:00 summary: [3.9] build(deps): bump actions/cache from 3.0.1 to 3.0.2 (GH-92111) (#92125) Bumps [actions/cache](https://github.com/actions/cache) from 3.0.1 to 3.0.2. - [Release notes](https://github.com/actions/cache/releases) - [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md) - [Commits](https://github.com/actions/cache/compare/v3.0.1...v3.0.2) --- updated-dependencies: - dependency-name: actions/cache dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>. (cherry picked from commit eefe6911f4f497e8b73e0690f9b3f47904fdb02a) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> files: M .github/workflows/build.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 7a3f7b35a612c..b2792efc0dae9 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -178,7 +178,7 @@ jobs: echo "LD_LIBRARY_PATH=${GITHUB_WORKSPACE}/multissl/openssl/${OPENSSL_VER}/lib" >> $GITHUB_ENV - name: 'Restore OpenSSL build' id: cache-openssl - uses: actions/cache at v3.0.1 + uses: actions/cache at v3.0.2 with: path: ./multissl/openssl/${{ env.OPENSSL_VER }} key: ${{ runner.os }}-multissl-openssl-${{ env.OPENSSL_VER }} @@ -224,7 +224,7 @@ jobs: echo "LD_LIBRARY_PATH=${GITHUB_WORKSPACE}/multissl/openssl/${OPENSSL_VER}/lib" >> $GITHUB_ENV - name: 'Restore OpenSSL build' id: cache-openssl - uses: actions/cache at v3.0.1 + uses: actions/cache at v3.0.2 with: path: ./multissl/openssl/${{ env.OPENSSL_VER }} key: ${{ runner.os }}-multissl-openssl-${{ env.OPENSSL_VER }} From webhook-mailer at python.org Sun May 1 21:25:19 2022 From: webhook-mailer at python.org (rhettinger) Date: Mon, 02 May 2022 01:25:19 -0000 Subject: [Python-checkins] gh-91998: 'WebAssemby' to 'WebAssembly' (#92040) Message-ID: https://github.com/python/cpython/commit/ed711290a0d6f40e16acc569dd86cfc4611dbcd3 commit: ed711290a0d6f40e16acc569dd86cfc4611dbcd3 branch: main author: vainaijr <43755000+vainaijr at users.noreply.github.com> committer: rhettinger date: 2022-05-01T20:24:41-05:00 summary: gh-91998: 'WebAssemby' to 'WebAssembly' (#92040) files: M Doc/using/configure.rst diff --git a/Doc/using/configure.rst b/Doc/using/configure.rst index 2321d24663f68..4bf9b84e6b90f 100644 --- a/Doc/using/configure.rst +++ b/Doc/using/configure.rst @@ -143,8 +143,8 @@ General Options .. versionadded:: 3.11 -WebAssemby Options ------------------- +WebAssembly Options +------------------- .. cmdoption:: --with-emscripten-target=[browser|node] From webhook-mailer at python.org Mon May 2 01:29:58 2022 From: webhook-mailer at python.org (serhiy-storchaka) Date: Mon, 02 May 2022 05:29:58 -0000 Subject: [Python-checkins] gh-92114: Improve error message for types with __class_getitem__ = None (GH-92115) Message-ID: https://github.com/python/cpython/commit/4d10f703d79b72a9c7f88862c0b4a9abbfb04ee2 commit: 4d10f703d79b72a9c7f88862c0b4a9abbfb04ee2 branch: main author: Serhiy Storchaka committer: serhiy-storchaka date: 2022-05-02T08:29:49+03:00 summary: gh-92114: Improve error message for types with __class_getitem__ = None (GH-92115) files: A Misc/NEWS.d/next/Core and Builtins/2022-05-01-16-40-07.gh-issue-92114.5xTlLt.rst M Lib/test/test_genericclass.py M Objects/abstract.c diff --git a/Lib/test/test_genericclass.py b/Lib/test/test_genericclass.py index 27420d4f2bad5..d8bb37f69e18a 100644 --- a/Lib/test/test_genericclass.py +++ b/Lib/test/test_genericclass.py @@ -220,6 +220,7 @@ def __class_getitem__(cls): return None with self.assertRaises(TypeError): C_too_few[int] + class C_too_many: def __class_getitem__(cls, one, two): return None @@ -232,16 +233,23 @@ def __class_getitem__(cls, item): return None with self.assertRaises(TypeError): C()[int] + class E: ... e = E() e.__class_getitem__ = lambda cls, item: 'This will not work' with self.assertRaises(TypeError): e[int] + class C_not_callable: __class_getitem__ = "Surprise!" with self.assertRaises(TypeError): C_not_callable[int] + class C_is_none(tuple): + __class_getitem__ = None + with self.assertRaisesRegex(TypeError, "C_is_none"): + C_is_none[int] + def test_class_getitem_metaclass(self): class Meta(type): def __class_getitem__(cls, item): diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-01-16-40-07.gh-issue-92114.5xTlLt.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-01-16-40-07.gh-issue-92114.5xTlLt.rst new file mode 100644 index 0000000000000..a999245953022 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-05-01-16-40-07.gh-issue-92114.5xTlLt.rst @@ -0,0 +1,2 @@ +Improve error message when subscript a type with ``__class_getitem__`` set +to ``None``. diff --git a/Objects/abstract.c b/Objects/abstract.c index cfb0edcab0e5d..9034737235681 100644 --- a/Objects/abstract.c +++ b/Objects/abstract.c @@ -185,11 +185,12 @@ PyObject_GetItem(PyObject *o, PyObject *key) if (_PyObject_LookupAttr(o, &_Py_ID(__class_getitem__), &meth) < 0) { return NULL; } - if (meth) { + if (meth && meth != Py_None) { result = PyObject_CallOneArg(meth, key); Py_DECREF(meth); return result; } + Py_XDECREF(meth); PyErr_Format(PyExc_TypeError, "type '%.200s' is not subscriptable", ((PyTypeObject *)o)->tp_name); return NULL; From webhook-mailer at python.org Mon May 2 04:23:46 2022 From: webhook-mailer at python.org (methane) Date: Mon, 02 May 2022 08:23:46 -0000 Subject: [Python-checkins] gh-90822: Make `PY_SSIZE_T_MAX` and `PY_SSIZE_T_MIN` constant expression (GH-92071) Message-ID: https://github.com/python/cpython/commit/d414f7ece8169097a32cd228bb32da0418833db4 commit: d414f7ece8169097a32cd228bb32da0418833db4 branch: main author: Ganesh Kathiresan committer: methane date: 2022-05-02T17:23:28+09:00 summary: gh-90822: Make `PY_SSIZE_T_MAX` and `PY_SSIZE_T_MIN` constant expression (GH-92071) files: M Include/pyport.h M PC/pyconfig.h diff --git a/Include/pyport.h b/Include/pyport.h index 5102f7487d21c..923897305fc6b 100644 --- a/Include/pyport.h +++ b/Include/pyport.h @@ -114,17 +114,23 @@ typedef intptr_t Py_intptr_t; /* Py_ssize_t is a signed integral type such that sizeof(Py_ssize_t) == * sizeof(size_t). C99 doesn't define such a thing directly (size_t is an * unsigned integral type). See PEP 353 for details. + * PY_SSIZE_T_MAX is the largest positive value of type Py_ssize_t. */ #ifdef HAVE_PY_SSIZE_T #elif HAVE_SSIZE_T typedef ssize_t Py_ssize_t; +# define PY_SSIZE_T_MAX SSIZE_MAX #elif SIZEOF_VOID_P == SIZEOF_SIZE_T typedef Py_intptr_t Py_ssize_t; +# define PY_SSIZE_T_MAX INTPTR_MAX #else # error "Python needs a typedef for Py_ssize_t in pyport.h." #endif +/* Smallest negative value of type Py_ssize_t. */ +#define PY_SSIZE_T_MIN (-PY_SSIZE_T_MAX-1) + /* Py_hash_t is the same size as a pointer. */ #define SIZEOF_PY_HASH_T SIZEOF_SIZE_T typedef Py_ssize_t Py_hash_t; @@ -138,11 +144,6 @@ typedef Py_ssize_t Py_ssize_clean_t; /* Largest possible value of size_t. */ #define PY_SIZE_MAX SIZE_MAX -/* Largest positive value of type Py_ssize_t. */ -#define PY_SSIZE_T_MAX ((Py_ssize_t)(((size_t)-1)>>1)) -/* Smallest negative value of type Py_ssize_t. */ -#define PY_SSIZE_T_MIN (-PY_SSIZE_T_MAX-1) - /* Macro kept for backward compatibility: use "z" in new code. * * PY_FORMAT_SIZE_T is a platform-specific modifier for use in a printf diff --git a/PC/pyconfig.h b/PC/pyconfig.h index e8649be568420..5a96a4ebe51ee 100644 --- a/PC/pyconfig.h +++ b/PC/pyconfig.h @@ -162,8 +162,10 @@ WIN32 is still required for the locale module. /* Define like size_t, omitting the "unsigned" */ #ifdef MS_WIN64 typedef __int64 Py_ssize_t; +# define PY_SSIZE_T_MAX LLONG_MAX #else typedef _W64 int Py_ssize_t; +# define PY_SSIZE_T_MAX INT_MAX #endif #define HAVE_PY_SSIZE_T 1 From webhook-mailer at python.org Mon May 2 04:25:10 2022 From: webhook-mailer at python.org (methane) Date: Mon, 02 May 2022 08:25:10 -0000 Subject: [Python-checkins] gh-85679: Recommend `encoding="utf-8"` in tutorial (GH-91778) Message-ID: https://github.com/python/cpython/commit/614420df9796c8a4f01e24052fc0128b4c20c5bf commit: 614420df9796c8a4f01e24052fc0128b4c20c5bf branch: main author: Inada Naoki committer: methane date: 2022-05-02T17:25:05+09:00 summary: gh-85679: Recommend `encoding="utf-8"` in tutorial (GH-91778) files: M Doc/tutorial/inputoutput.rst diff --git a/Doc/tutorial/inputoutput.rst b/Doc/tutorial/inputoutput.rst index 7f83c4d4612eb..b50063654e262 100644 --- a/Doc/tutorial/inputoutput.rst +++ b/Doc/tutorial/inputoutput.rst @@ -279,11 +279,12 @@ Reading and Writing Files object: file :func:`open` returns a :term:`file object`, and is most commonly used with -two arguments: ``open(filename, mode)``. +two positional arguments and one keyword argument: +``open(filename, mode, encoding=None)`` :: - >>> f = open('workfile', 'w') + >>> f = open('workfile', 'w', encoding="utf-8") .. XXX str(f) is @@ -300,11 +301,14 @@ writing. The *mode* argument is optional; ``'r'`` will be assumed if it's omitted. Normally, files are opened in :dfn:`text mode`, that means, you read and write -strings from and to the file, which are encoded in a specific encoding. If -encoding is not specified, the default is platform dependent (see -:func:`open`). ``'b'`` appended to the mode opens the file in -:dfn:`binary mode`: now the data is read and written in the form of bytes -objects. This mode should be used for all files that don't contain text. +strings from and to the file, which are encoded in a specific *encoding*. +If *encoding* is not specified, the default is platform dependent +(see :func:`open`). +Because UTF-8 is the modern de-facto standard, ``encoding="utf-8"`` is +recommended unless you know that you need to use a different encoding. +Appending a ``'b'`` to the mode opens the file in :dfn:`binary mode`. +Binary mode data is read and written as :class:`bytes` objects. +You can not specify *encoding* when opening file in binary mode. In text mode, the default when reading is to convert platform-specific line endings (``\n`` on Unix, ``\r\n`` on Windows) to just ``\n``. When writing in @@ -320,7 +324,7 @@ after its suite finishes, even if an exception is raised at some point. Using :keyword:`!with` is also much shorter than writing equivalent :keyword:`try`\ -\ :keyword:`finally` blocks:: - >>> with open('workfile') as f: + >>> with open('workfile', encoding="utf-8") as f: ... read_data = f.read() >>> # We can check that the file has been automatically closed. @@ -490,11 +494,15 @@ simply serializes the object to a :term:`text file`. So if ``f`` is a json.dump(x, f) -To decode the object again, if ``f`` is a :term:`text file` object which has -been opened for reading:: +To decode the object again, if ``f`` is a :term:`binary file` or +:term:`text file` object which has been opened for reading:: x = json.load(f) +.. note:: + JSON files must be encoded in UTF-8. Use ``encoding="utf-8"`` when opening + JSON file as a :term:`text file` for both of reading and writing. + This simple serialization technique can handle lists and dictionaries, but serializing arbitrary class instances in JSON requires a bit of extra effort. The reference for the :mod:`json` module contains an explanation of this. From webhook-mailer at python.org Mon May 2 04:45:19 2022 From: webhook-mailer at python.org (miss-islington) Date: Mon, 02 May 2022 08:45:19 -0000 Subject: [Python-checkins] gh-85679: Recommend `encoding="utf-8"` in tutorial (GH-91778) Message-ID: https://github.com/python/cpython/commit/a7d3de7fe650d393d63039cb0ed7c1320d050345 commit: a7d3de7fe650d393d63039cb0ed7c1320d050345 branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-02T01:45:10-07:00 summary: gh-85679: Recommend `encoding="utf-8"` in tutorial (GH-91778) (cherry picked from commit 614420df9796c8a4f01e24052fc0128b4c20c5bf) Co-authored-by: Inada Naoki files: M Doc/tutorial/inputoutput.rst diff --git a/Doc/tutorial/inputoutput.rst b/Doc/tutorial/inputoutput.rst index 7f83c4d4612eb..b50063654e262 100644 --- a/Doc/tutorial/inputoutput.rst +++ b/Doc/tutorial/inputoutput.rst @@ -279,11 +279,12 @@ Reading and Writing Files object: file :func:`open` returns a :term:`file object`, and is most commonly used with -two arguments: ``open(filename, mode)``. +two positional arguments and one keyword argument: +``open(filename, mode, encoding=None)`` :: - >>> f = open('workfile', 'w') + >>> f = open('workfile', 'w', encoding="utf-8") .. XXX str(f) is @@ -300,11 +301,14 @@ writing. The *mode* argument is optional; ``'r'`` will be assumed if it's omitted. Normally, files are opened in :dfn:`text mode`, that means, you read and write -strings from and to the file, which are encoded in a specific encoding. If -encoding is not specified, the default is platform dependent (see -:func:`open`). ``'b'`` appended to the mode opens the file in -:dfn:`binary mode`: now the data is read and written in the form of bytes -objects. This mode should be used for all files that don't contain text. +strings from and to the file, which are encoded in a specific *encoding*. +If *encoding* is not specified, the default is platform dependent +(see :func:`open`). +Because UTF-8 is the modern de-facto standard, ``encoding="utf-8"`` is +recommended unless you know that you need to use a different encoding. +Appending a ``'b'`` to the mode opens the file in :dfn:`binary mode`. +Binary mode data is read and written as :class:`bytes` objects. +You can not specify *encoding* when opening file in binary mode. In text mode, the default when reading is to convert platform-specific line endings (``\n`` on Unix, ``\r\n`` on Windows) to just ``\n``. When writing in @@ -320,7 +324,7 @@ after its suite finishes, even if an exception is raised at some point. Using :keyword:`!with` is also much shorter than writing equivalent :keyword:`try`\ -\ :keyword:`finally` blocks:: - >>> with open('workfile') as f: + >>> with open('workfile', encoding="utf-8") as f: ... read_data = f.read() >>> # We can check that the file has been automatically closed. @@ -490,11 +494,15 @@ simply serializes the object to a :term:`text file`. So if ``f`` is a json.dump(x, f) -To decode the object again, if ``f`` is a :term:`text file` object which has -been opened for reading:: +To decode the object again, if ``f`` is a :term:`binary file` or +:term:`text file` object which has been opened for reading:: x = json.load(f) +.. note:: + JSON files must be encoded in UTF-8. Use ``encoding="utf-8"`` when opening + JSON file as a :term:`text file` for both of reading and writing. + This simple serialization technique can handle lists and dictionaries, but serializing arbitrary class instances in JSON requires a bit of extra effort. The reference for the :mod:`json` module contains an explanation of this. From webhook-mailer at python.org Mon May 2 04:45:50 2022 From: webhook-mailer at python.org (miss-islington) Date: Mon, 02 May 2022 08:45:50 -0000 Subject: [Python-checkins] gh-85679: Recommend `encoding="utf-8"` in tutorial (GH-91778) Message-ID: https://github.com/python/cpython/commit/d05ee916c142d9c9172cc20292285d02d4aaef3c commit: d05ee916c142d9c9172cc20292285d02d4aaef3c branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-02T01:45:45-07:00 summary: gh-85679: Recommend `encoding="utf-8"` in tutorial (GH-91778) (cherry picked from commit 614420df9796c8a4f01e24052fc0128b4c20c5bf) Co-authored-by: Inada Naoki files: M Doc/tutorial/inputoutput.rst diff --git a/Doc/tutorial/inputoutput.rst b/Doc/tutorial/inputoutput.rst index 7f83c4d4612eb..b50063654e262 100644 --- a/Doc/tutorial/inputoutput.rst +++ b/Doc/tutorial/inputoutput.rst @@ -279,11 +279,12 @@ Reading and Writing Files object: file :func:`open` returns a :term:`file object`, and is most commonly used with -two arguments: ``open(filename, mode)``. +two positional arguments and one keyword argument: +``open(filename, mode, encoding=None)`` :: - >>> f = open('workfile', 'w') + >>> f = open('workfile', 'w', encoding="utf-8") .. XXX str(f) is @@ -300,11 +301,14 @@ writing. The *mode* argument is optional; ``'r'`` will be assumed if it's omitted. Normally, files are opened in :dfn:`text mode`, that means, you read and write -strings from and to the file, which are encoded in a specific encoding. If -encoding is not specified, the default is platform dependent (see -:func:`open`). ``'b'`` appended to the mode opens the file in -:dfn:`binary mode`: now the data is read and written in the form of bytes -objects. This mode should be used for all files that don't contain text. +strings from and to the file, which are encoded in a specific *encoding*. +If *encoding* is not specified, the default is platform dependent +(see :func:`open`). +Because UTF-8 is the modern de-facto standard, ``encoding="utf-8"`` is +recommended unless you know that you need to use a different encoding. +Appending a ``'b'`` to the mode opens the file in :dfn:`binary mode`. +Binary mode data is read and written as :class:`bytes` objects. +You can not specify *encoding* when opening file in binary mode. In text mode, the default when reading is to convert platform-specific line endings (``\n`` on Unix, ``\r\n`` on Windows) to just ``\n``. When writing in @@ -320,7 +324,7 @@ after its suite finishes, even if an exception is raised at some point. Using :keyword:`!with` is also much shorter than writing equivalent :keyword:`try`\ -\ :keyword:`finally` blocks:: - >>> with open('workfile') as f: + >>> with open('workfile', encoding="utf-8") as f: ... read_data = f.read() >>> # We can check that the file has been automatically closed. @@ -490,11 +494,15 @@ simply serializes the object to a :term:`text file`. So if ``f`` is a json.dump(x, f) -To decode the object again, if ``f`` is a :term:`text file` object which has -been opened for reading:: +To decode the object again, if ``f`` is a :term:`binary file` or +:term:`text file` object which has been opened for reading:: x = json.load(f) +.. note:: + JSON files must be encoded in UTF-8. Use ``encoding="utf-8"`` when opening + JSON file as a :term:`text file` for both of reading and writing. + This simple serialization technique can handle lists and dictionaries, but serializing arbitrary class instances in JSON requires a bit of extra effort. The reference for the :mod:`json` module contains an explanation of this. From webhook-mailer at python.org Mon May 2 05:37:57 2022 From: webhook-mailer at python.org (serhiy-storchaka) Date: Mon, 02 May 2022 09:37:57 -0000 Subject: [Python-checkins] bpo-36819: Fix crashes in built-in encoders with weird error handlers (GH-28593) Message-ID: https://github.com/python/cpython/commit/18b07d773e09a2719e69aeaa925d5abb7ba0c068 commit: 18b07d773e09a2719e69aeaa925d5abb7ba0c068 branch: main author: Serhiy Storchaka committer: serhiy-storchaka date: 2022-05-02T12:37:48+03:00 summary: bpo-36819: Fix crashes in built-in encoders with weird error handlers (GH-28593) If the error handler returns position less or equal than the starting position of non-encodable characters, most of built-in encoders didn't properly re-size the output buffer. This led to out-of-bounds writes, and segfaults. files: A Misc/NEWS.d/next/Core and Builtins/2021-09-28-10-58-30.bpo-36819.cyV50C.rst M Lib/test/test_codeccallbacks.py M Objects/stringlib/codecs.h M Objects/unicodeobject.c diff --git a/Lib/test/test_codeccallbacks.py b/Lib/test/test_codeccallbacks.py index 243f002c4ecad..4991330489d13 100644 --- a/Lib/test/test_codeccallbacks.py +++ b/Lib/test/test_codeccallbacks.py @@ -1,5 +1,6 @@ import codecs import html.entities +import itertools import sys import unicodedata import unittest @@ -22,6 +23,18 @@ def handle(self, exc): self.pos = len(exc.object) return ("", oldpos) +class RepeatedPosReturn: + def __init__(self, repl=""): + self.repl = repl + self.pos = 0 + self.count = 0 + + def handle(self, exc): + if self.count > 0: + self.count -= 1 + return (self.repl, self.pos) + return (self.repl, exc.end) + # A UnicodeEncodeError object with a bad start attribute class BadStartUnicodeEncodeError(UnicodeEncodeError): def __init__(self): @@ -783,20 +796,104 @@ def test_lookup(self): codecs.lookup_error("namereplace") ) - def test_unencodablereplacement(self): + def test_encode_nonascii_replacement(self): + def handle(exc): + if isinstance(exc, UnicodeEncodeError): + return (repl, exc.end) + raise TypeError("don't know how to handle %r" % exc) + codecs.register_error("test.replacing", handle) + + for enc, input, repl in ( + ("ascii", "[?]", "abc"), + ("iso-8859-1", "[?]", "??"), + ("iso-8859-15", "[?]", "??"), + ): + res = input.encode(enc, "test.replacing") + self.assertEqual(res, ("[" + repl + "]").encode(enc)) + + for enc, input, repl in ( + ("utf-8", "[\udc80]", "\U0001f40d"), + ("utf-16", "[\udc80]", "\U0001f40d"), + ("utf-32", "[\udc80]", "\U0001f40d"), + ): + with self.subTest(encoding=enc): + with self.assertRaises(UnicodeEncodeError) as cm: + input.encode(enc, "test.replacing") + exc = cm.exception + self.assertEqual(exc.start, 1) + self.assertEqual(exc.end, 2) + self.assertEqual(exc.object, input) + + def test_encode_unencodable_replacement(self): def unencrepl(exc): if isinstance(exc, UnicodeEncodeError): - return ("\u4242", exc.end) + return (repl, exc.end) else: raise TypeError("don't know how to handle %r" % exc) codecs.register_error("test.unencreplhandler", unencrepl) - for enc in ("ascii", "iso-8859-1", "iso-8859-15"): - self.assertRaises( - UnicodeEncodeError, - "\u4242".encode, - enc, - "test.unencreplhandler" - ) + + for enc, input, repl in ( + ("ascii", "[?]", "?"), + ("iso-8859-1", "[?]", "?"), + ("iso-8859-15", "[?]", "?"), + ("utf-8", "[\udc80]", "\udcff"), + ("utf-16", "[\udc80]", "\udcff"), + ("utf-32", "[\udc80]", "\udcff"), + ): + with self.subTest(encoding=enc): + with self.assertRaises(UnicodeEncodeError) as cm: + input.encode(enc, "test.unencreplhandler") + exc = cm.exception + self.assertEqual(exc.start, 1) + self.assertEqual(exc.end, 2) + self.assertEqual(exc.object, input) + + def test_encode_bytes_replacement(self): + def handle(exc): + if isinstance(exc, UnicodeEncodeError): + return (repl, exc.end) + raise TypeError("don't know how to handle %r" % exc) + codecs.register_error("test.replacing", handle) + + # It works even if the bytes sequence is not decodable. + for enc, input, repl in ( + ("ascii", "[?]", b"\xbd\xbe"), + ("iso-8859-1", "[?]", b"\xbd\xbe"), + ("iso-8859-15", "[?]", b"\xbd\xbe"), + ("utf-8", "[\udc80]", b"\xbd\xbe"), + ("utf-16le", "[\udc80]", b"\xbd\xbe"), + ("utf-16be", "[\udc80]", b"\xbd\xbe"), + ("utf-32le", "[\udc80]", b"\xbc\xbd\xbe\xbf"), + ("utf-32be", "[\udc80]", b"\xbc\xbd\xbe\xbf"), + ): + with self.subTest(encoding=enc): + res = input.encode(enc, "test.replacing") + self.assertEqual(res, "[".encode(enc) + repl + "]".encode(enc)) + + def test_encode_odd_bytes_replacement(self): + def handle(exc): + if isinstance(exc, UnicodeEncodeError): + return (repl, exc.end) + raise TypeError("don't know how to handle %r" % exc) + codecs.register_error("test.replacing", handle) + + input = "[\udc80]" + # Tests in which the replacement bytestring contains not whole number + # of code units. + for enc, repl in ( + *itertools.product(("utf-16le", "utf-16be"), + [b"a", b"abc"]), + *itertools.product(("utf-32le", "utf-32be"), + [b"a", b"ab", b"abc", b"abcde"]), + ): + with self.subTest(encoding=enc, repl=repl): + with self.assertRaises(UnicodeEncodeError) as cm: + input.encode(enc, "test.replacing") + exc = cm.exception + self.assertEqual(exc.start, 1) + self.assertEqual(exc.end, 2) + self.assertEqual(exc.object, input) + self.assertEqual(exc.reason, "surrogates not allowed") def test_badregistercall(self): # enhance coverage of: @@ -940,6 +1037,68 @@ def __getitem__(self, key): self.assertRaises(ValueError, codecs.charmap_encode, "\xff", err, D()) self.assertRaises(TypeError, codecs.charmap_encode, "\xff", err, {0xff: 300}) + def test_decodehelper_bug36819(self): + handler = RepeatedPosReturn("x") + codecs.register_error("test.bug36819", handler.handle) + + testcases = [ + ("ascii", b"\xff"), + ("utf-8", b"\xff"), + ("utf-16be", b'\xdc\x80'), + ("utf-32be", b'\x00\x00\xdc\x80'), + ("iso-8859-6", b"\xff"), + ] + for enc, bad in testcases: + input = "abcd".encode(enc) + bad + with self.subTest(encoding=enc): + handler.count = 50 + decoded = input.decode(enc, "test.bug36819") + self.assertEqual(decoded, 'abcdx' * 51) + + def test_encodehelper_bug36819(self): + handler = RepeatedPosReturn() + codecs.register_error("test.bug36819", handler.handle) + + input = "abcd\udc80" + encodings = ["ascii", "latin1", "utf-8", "utf-16", "utf-32"] # built-in + encodings += ["iso-8859-15"] # charmap codec + if sys.platform == 'win32': + encodings = ["mbcs", "oem"] # code page codecs + + handler.repl = "\udcff" + for enc in encodings: + with self.subTest(encoding=enc): + handler.count = 50 + with self.assertRaises(UnicodeEncodeError) as cm: + input.encode(enc, "test.bug36819") + exc = cm.exception + self.assertEqual(exc.start, 4) + self.assertEqual(exc.end, 5) + self.assertEqual(exc.object, input) + if sys.platform == "win32": + handler.count = 50 + with self.assertRaises(UnicodeEncodeError) as cm: + codecs.code_page_encode(437, input, "test.bug36819") + exc = cm.exception + self.assertEqual(exc.start, 4) + self.assertEqual(exc.end, 5) + self.assertEqual(exc.object, input) + + handler.repl = "x" + for enc in encodings: + with self.subTest(encoding=enc): + # The interpreter should segfault after a handful of attempts. + # 50 was chosen to try to ensure a segfault without a fix, + # but not OOM a machine with one. + handler.count = 50 + encoded = input.encode(enc, "test.bug36819") + self.assertEqual(encoded.decode(enc), "abcdx" * 51) + if sys.platform == "win32": + handler.count = 50 + encoded = codecs.code_page_encode(437, input, "test.bug36819") + self.assertEqual(encoded[0].decode(), "abcdx" * 51) + self.assertEqual(encoded[1], len(input)) + def test_translatehelper(self): # enhance coverage of: # Objects/unicodeobject.c::unicode_encode_call_errorhandler() diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-09-28-10-58-30.bpo-36819.cyV50C.rst b/Misc/NEWS.d/next/Core and Builtins/2021-09-28-10-58-30.bpo-36819.cyV50C.rst new file mode 100644 index 0000000000000..32bb55a90e6c4 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2021-09-28-10-58-30.bpo-36819.cyV50C.rst @@ -0,0 +1,2 @@ +Fix crashes in built-in encoders with error handlers that return position +less or equal than the starting position of non-encodable characters. diff --git a/Objects/stringlib/codecs.h b/Objects/stringlib/codecs.h index b17cda18f54b3..958cc86147815 100644 --- a/Objects/stringlib/codecs.h +++ b/Objects/stringlib/codecs.h @@ -387,8 +387,19 @@ STRINGLIB(utf8_encoder)(_PyBytesWriter *writer, if (!rep) goto error; - /* subtract preallocated bytes */ - writer->min_size -= max_char_size * (newpos - startpos); + if (newpos < startpos) { + writer->overallocate = 1; + p = _PyBytesWriter_Prepare(writer, p, + max_char_size * (startpos - newpos)); + if (p == NULL) + goto error; + } + else { + /* subtract preallocated bytes */ + writer->min_size -= max_char_size * (newpos - startpos); + /* Only overallocate the buffer if it's not the last write */ + writer->overallocate = (newpos < size); + } if (PyBytes_Check(rep)) { p = _PyBytesWriter_WriteBytes(writer, p, diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 493307556529b..36a52966c6820 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -5868,7 +5868,7 @@ _PyUnicode_EncodeUTF32(PyObject *str, pos = 0; while (pos < len) { - Py_ssize_t repsize, moreunits; + Py_ssize_t newpos, repsize, moreunits; if (kind == PyUnicode_2BYTE_KIND) { pos += ucs2lib_utf32_encode((const Py_UCS2 *)data + pos, len - pos, @@ -5885,7 +5885,7 @@ _PyUnicode_EncodeUTF32(PyObject *str, rep = unicode_encode_call_errorhandler( errors, &errorHandler, encoding, "surrogates not allowed", - str, &exc, pos, pos + 1, &pos); + str, &exc, pos, pos + 1, &newpos); if (!rep) goto error; @@ -5893,7 +5893,7 @@ _PyUnicode_EncodeUTF32(PyObject *str, repsize = PyBytes_GET_SIZE(rep); if (repsize & 3) { raise_encode_exception(&exc, encoding, - str, pos - 1, pos, + str, pos, pos + 1, "surrogates not allowed"); goto error; } @@ -5906,28 +5906,30 @@ _PyUnicode_EncodeUTF32(PyObject *str, moreunits = repsize = PyUnicode_GET_LENGTH(rep); if (!PyUnicode_IS_ASCII(rep)) { raise_encode_exception(&exc, encoding, - str, pos - 1, pos, + str, pos, pos + 1, "surrogates not allowed"); goto error; } } + moreunits += pos - newpos; + pos = newpos; /* four bytes are reserved for each surrogate */ - if (moreunits > 1) { + if (moreunits > 0) { Py_ssize_t outpos = out - (uint32_t*) PyBytes_AS_STRING(v); if (moreunits >= (PY_SSIZE_T_MAX - PyBytes_GET_SIZE(v)) / 4) { /* integer overflow */ PyErr_NoMemory(); goto error; } - if (_PyBytes_Resize(&v, PyBytes_GET_SIZE(v) + 4 * (moreunits - 1)) < 0) + if (_PyBytes_Resize(&v, PyBytes_GET_SIZE(v) + 4 * moreunits) < 0) goto error; out = (uint32_t*) PyBytes_AS_STRING(v) + outpos; } if (PyBytes_Check(rep)) { memcpy(out, PyBytes_AS_STRING(rep), repsize); - out += moreunits; + out += repsize / 4; } else /* rep is unicode */ { assert(PyUnicode_KIND(rep) == PyUnicode_1BYTE_KIND); ucs1lib_utf32_encode(PyUnicode_1BYTE_DATA(rep), repsize, @@ -6205,7 +6207,7 @@ _PyUnicode_EncodeUTF16(PyObject *str, pos = 0; while (pos < len) { - Py_ssize_t repsize, moreunits; + Py_ssize_t newpos, repsize, moreunits; if (kind == PyUnicode_2BYTE_KIND) { pos += ucs2lib_utf16_encode((const Py_UCS2 *)data + pos, len - pos, @@ -6222,7 +6224,7 @@ _PyUnicode_EncodeUTF16(PyObject *str, rep = unicode_encode_call_errorhandler( errors, &errorHandler, encoding, "surrogates not allowed", - str, &exc, pos, pos + 1, &pos); + str, &exc, pos, pos + 1, &newpos); if (!rep) goto error; @@ -6230,7 +6232,7 @@ _PyUnicode_EncodeUTF16(PyObject *str, repsize = PyBytes_GET_SIZE(rep); if (repsize & 1) { raise_encode_exception(&exc, encoding, - str, pos - 1, pos, + str, pos, pos + 1, "surrogates not allowed"); goto error; } @@ -6243,28 +6245,30 @@ _PyUnicode_EncodeUTF16(PyObject *str, moreunits = repsize = PyUnicode_GET_LENGTH(rep); if (!PyUnicode_IS_ASCII(rep)) { raise_encode_exception(&exc, encoding, - str, pos - 1, pos, + str, pos, pos + 1, "surrogates not allowed"); goto error; } } + moreunits += pos - newpos; + pos = newpos; /* two bytes are reserved for each surrogate */ - if (moreunits > 1) { + if (moreunits > 0) { Py_ssize_t outpos = out - (unsigned short*) PyBytes_AS_STRING(v); if (moreunits >= (PY_SSIZE_T_MAX - PyBytes_GET_SIZE(v)) / 2) { /* integer overflow */ PyErr_NoMemory(); goto error; } - if (_PyBytes_Resize(&v, PyBytes_GET_SIZE(v) + 2 * (moreunits - 1)) < 0) + if (_PyBytes_Resize(&v, PyBytes_GET_SIZE(v) + 2 * moreunits) < 0) goto error; out = (unsigned short*) PyBytes_AS_STRING(v) + outpos; } if (PyBytes_Check(rep)) { memcpy(out, PyBytes_AS_STRING(rep), repsize); - out += moreunits; + out += repsize / 2; } else /* rep is unicode */ { assert(PyUnicode_KIND(rep) == PyUnicode_1BYTE_KIND); ucs1lib_utf16_encode(PyUnicode_1BYTE_DATA(rep), repsize, @@ -7167,8 +7171,19 @@ unicode_encode_ucs1(PyObject *unicode, if (rep == NULL) goto onError; - /* subtract preallocated bytes */ - writer.min_size -= newpos - collstart; + if (newpos < collstart) { + writer.overallocate = 1; + str = _PyBytesWriter_Prepare(&writer, str, + collstart - newpos); + if (str == NULL) + goto onError; + } + else { + /* subtract preallocated bytes */ + writer.min_size -= newpos - collstart; + /* Only overallocate the buffer if it's not the last write */ + writer.overallocate = (newpos < size); + } if (PyBytes_Check(rep)) { /* Directly copy bytes result to output. */ @@ -7944,13 +7959,14 @@ encode_code_page_errors(UINT code_page, PyObject **outbytes, pos, pos + 1, &newpos); if (rep == NULL) goto error; - pos = newpos; + Py_ssize_t morebytes = pos - newpos; if (PyBytes_Check(rep)) { outsize = PyBytes_GET_SIZE(rep); - if (outsize != 1) { + morebytes += outsize; + if (morebytes > 0) { Py_ssize_t offset = out - PyBytes_AS_STRING(*outbytes); - newoutsize = PyBytes_GET_SIZE(*outbytes) + (outsize - 1); + newoutsize = PyBytes_GET_SIZE(*outbytes) + morebytes; if (_PyBytes_Resize(outbytes, newoutsize) < 0) { Py_DECREF(rep); goto error; @@ -7971,9 +7987,10 @@ encode_code_page_errors(UINT code_page, PyObject **outbytes, } outsize = PyUnicode_GET_LENGTH(rep); - if (outsize != 1) { + morebytes += outsize; + if (morebytes > 0) { Py_ssize_t offset = out - PyBytes_AS_STRING(*outbytes); - newoutsize = PyBytes_GET_SIZE(*outbytes) + (outsize - 1); + newoutsize = PyBytes_GET_SIZE(*outbytes) + morebytes; if (_PyBytes_Resize(outbytes, newoutsize) < 0) { Py_DECREF(rep); goto error; @@ -7996,6 +8013,7 @@ encode_code_page_errors(UINT code_page, PyObject **outbytes, out++; } } + pos = newpos; Py_DECREF(rep); } /* write a NUL byte */ From webhook-mailer at python.org Mon May 2 05:59:03 2022 From: webhook-mailer at python.org (miss-islington) Date: Mon, 02 May 2022 09:59:03 -0000 Subject: [Python-checkins] bpo-36819: Fix crashes in built-in encoders with weird error handlers (GH-28593) Message-ID: https://github.com/python/cpython/commit/d985c8e2e0d38e6905cc27124008eb926254247b commit: d985c8e2e0d38e6905cc27124008eb926254247b branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-02T02:58:41-07:00 summary: bpo-36819: Fix crashes in built-in encoders with weird error handlers (GH-28593) If the error handler returns position less or equal than the starting position of non-encodable characters, most of built-in encoders didn't properly re-size the output buffer. This led to out-of-bounds writes, and segfaults. (cherry picked from commit 18b07d773e09a2719e69aeaa925d5abb7ba0c068) Co-authored-by: Serhiy Storchaka files: A Misc/NEWS.d/next/Core and Builtins/2021-09-28-10-58-30.bpo-36819.cyV50C.rst M Lib/test/test_codeccallbacks.py M Objects/stringlib/codecs.h M Objects/unicodeobject.c diff --git a/Lib/test/test_codeccallbacks.py b/Lib/test/test_codeccallbacks.py index 243f002c4ecad..4991330489d13 100644 --- a/Lib/test/test_codeccallbacks.py +++ b/Lib/test/test_codeccallbacks.py @@ -1,5 +1,6 @@ import codecs import html.entities +import itertools import sys import unicodedata import unittest @@ -22,6 +23,18 @@ def handle(self, exc): self.pos = len(exc.object) return ("", oldpos) +class RepeatedPosReturn: + def __init__(self, repl=""): + self.repl = repl + self.pos = 0 + self.count = 0 + + def handle(self, exc): + if self.count > 0: + self.count -= 1 + return (self.repl, self.pos) + return (self.repl, exc.end) + # A UnicodeEncodeError object with a bad start attribute class BadStartUnicodeEncodeError(UnicodeEncodeError): def __init__(self): @@ -783,20 +796,104 @@ def test_lookup(self): codecs.lookup_error("namereplace") ) - def test_unencodablereplacement(self): + def test_encode_nonascii_replacement(self): + def handle(exc): + if isinstance(exc, UnicodeEncodeError): + return (repl, exc.end) + raise TypeError("don't know how to handle %r" % exc) + codecs.register_error("test.replacing", handle) + + for enc, input, repl in ( + ("ascii", "[?]", "abc"), + ("iso-8859-1", "[?]", "??"), + ("iso-8859-15", "[?]", "??"), + ): + res = input.encode(enc, "test.replacing") + self.assertEqual(res, ("[" + repl + "]").encode(enc)) + + for enc, input, repl in ( + ("utf-8", "[\udc80]", "\U0001f40d"), + ("utf-16", "[\udc80]", "\U0001f40d"), + ("utf-32", "[\udc80]", "\U0001f40d"), + ): + with self.subTest(encoding=enc): + with self.assertRaises(UnicodeEncodeError) as cm: + input.encode(enc, "test.replacing") + exc = cm.exception + self.assertEqual(exc.start, 1) + self.assertEqual(exc.end, 2) + self.assertEqual(exc.object, input) + + def test_encode_unencodable_replacement(self): def unencrepl(exc): if isinstance(exc, UnicodeEncodeError): - return ("\u4242", exc.end) + return (repl, exc.end) else: raise TypeError("don't know how to handle %r" % exc) codecs.register_error("test.unencreplhandler", unencrepl) - for enc in ("ascii", "iso-8859-1", "iso-8859-15"): - self.assertRaises( - UnicodeEncodeError, - "\u4242".encode, - enc, - "test.unencreplhandler" - ) + + for enc, input, repl in ( + ("ascii", "[?]", "?"), + ("iso-8859-1", "[?]", "?"), + ("iso-8859-15", "[?]", "?"), + ("utf-8", "[\udc80]", "\udcff"), + ("utf-16", "[\udc80]", "\udcff"), + ("utf-32", "[\udc80]", "\udcff"), + ): + with self.subTest(encoding=enc): + with self.assertRaises(UnicodeEncodeError) as cm: + input.encode(enc, "test.unencreplhandler") + exc = cm.exception + self.assertEqual(exc.start, 1) + self.assertEqual(exc.end, 2) + self.assertEqual(exc.object, input) + + def test_encode_bytes_replacement(self): + def handle(exc): + if isinstance(exc, UnicodeEncodeError): + return (repl, exc.end) + raise TypeError("don't know how to handle %r" % exc) + codecs.register_error("test.replacing", handle) + + # It works even if the bytes sequence is not decodable. + for enc, input, repl in ( + ("ascii", "[?]", b"\xbd\xbe"), + ("iso-8859-1", "[?]", b"\xbd\xbe"), + ("iso-8859-15", "[?]", b"\xbd\xbe"), + ("utf-8", "[\udc80]", b"\xbd\xbe"), + ("utf-16le", "[\udc80]", b"\xbd\xbe"), + ("utf-16be", "[\udc80]", b"\xbd\xbe"), + ("utf-32le", "[\udc80]", b"\xbc\xbd\xbe\xbf"), + ("utf-32be", "[\udc80]", b"\xbc\xbd\xbe\xbf"), + ): + with self.subTest(encoding=enc): + res = input.encode(enc, "test.replacing") + self.assertEqual(res, "[".encode(enc) + repl + "]".encode(enc)) + + def test_encode_odd_bytes_replacement(self): + def handle(exc): + if isinstance(exc, UnicodeEncodeError): + return (repl, exc.end) + raise TypeError("don't know how to handle %r" % exc) + codecs.register_error("test.replacing", handle) + + input = "[\udc80]" + # Tests in which the replacement bytestring contains not whole number + # of code units. + for enc, repl in ( + *itertools.product(("utf-16le", "utf-16be"), + [b"a", b"abc"]), + *itertools.product(("utf-32le", "utf-32be"), + [b"a", b"ab", b"abc", b"abcde"]), + ): + with self.subTest(encoding=enc, repl=repl): + with self.assertRaises(UnicodeEncodeError) as cm: + input.encode(enc, "test.replacing") + exc = cm.exception + self.assertEqual(exc.start, 1) + self.assertEqual(exc.end, 2) + self.assertEqual(exc.object, input) + self.assertEqual(exc.reason, "surrogates not allowed") def test_badregistercall(self): # enhance coverage of: @@ -940,6 +1037,68 @@ def __getitem__(self, key): self.assertRaises(ValueError, codecs.charmap_encode, "\xff", err, D()) self.assertRaises(TypeError, codecs.charmap_encode, "\xff", err, {0xff: 300}) + def test_decodehelper_bug36819(self): + handler = RepeatedPosReturn("x") + codecs.register_error("test.bug36819", handler.handle) + + testcases = [ + ("ascii", b"\xff"), + ("utf-8", b"\xff"), + ("utf-16be", b'\xdc\x80'), + ("utf-32be", b'\x00\x00\xdc\x80'), + ("iso-8859-6", b"\xff"), + ] + for enc, bad in testcases: + input = "abcd".encode(enc) + bad + with self.subTest(encoding=enc): + handler.count = 50 + decoded = input.decode(enc, "test.bug36819") + self.assertEqual(decoded, 'abcdx' * 51) + + def test_encodehelper_bug36819(self): + handler = RepeatedPosReturn() + codecs.register_error("test.bug36819", handler.handle) + + input = "abcd\udc80" + encodings = ["ascii", "latin1", "utf-8", "utf-16", "utf-32"] # built-in + encodings += ["iso-8859-15"] # charmap codec + if sys.platform == 'win32': + encodings = ["mbcs", "oem"] # code page codecs + + handler.repl = "\udcff" + for enc in encodings: + with self.subTest(encoding=enc): + handler.count = 50 + with self.assertRaises(UnicodeEncodeError) as cm: + input.encode(enc, "test.bug36819") + exc = cm.exception + self.assertEqual(exc.start, 4) + self.assertEqual(exc.end, 5) + self.assertEqual(exc.object, input) + if sys.platform == "win32": + handler.count = 50 + with self.assertRaises(UnicodeEncodeError) as cm: + codecs.code_page_encode(437, input, "test.bug36819") + exc = cm.exception + self.assertEqual(exc.start, 4) + self.assertEqual(exc.end, 5) + self.assertEqual(exc.object, input) + + handler.repl = "x" + for enc in encodings: + with self.subTest(encoding=enc): + # The interpreter should segfault after a handful of attempts. + # 50 was chosen to try to ensure a segfault without a fix, + # but not OOM a machine with one. + handler.count = 50 + encoded = input.encode(enc, "test.bug36819") + self.assertEqual(encoded.decode(enc), "abcdx" * 51) + if sys.platform == "win32": + handler.count = 50 + encoded = codecs.code_page_encode(437, input, "test.bug36819") + self.assertEqual(encoded[0].decode(), "abcdx" * 51) + self.assertEqual(encoded[1], len(input)) + def test_translatehelper(self): # enhance coverage of: # Objects/unicodeobject.c::unicode_encode_call_errorhandler() diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-09-28-10-58-30.bpo-36819.cyV50C.rst b/Misc/NEWS.d/next/Core and Builtins/2021-09-28-10-58-30.bpo-36819.cyV50C.rst new file mode 100644 index 0000000000000..32bb55a90e6c4 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2021-09-28-10-58-30.bpo-36819.cyV50C.rst @@ -0,0 +1,2 @@ +Fix crashes in built-in encoders with error handlers that return position +less or equal than the starting position of non-encodable characters. diff --git a/Objects/stringlib/codecs.h b/Objects/stringlib/codecs.h index b17cda18f54b3..958cc86147815 100644 --- a/Objects/stringlib/codecs.h +++ b/Objects/stringlib/codecs.h @@ -387,8 +387,19 @@ STRINGLIB(utf8_encoder)(_PyBytesWriter *writer, if (!rep) goto error; - /* subtract preallocated bytes */ - writer->min_size -= max_char_size * (newpos - startpos); + if (newpos < startpos) { + writer->overallocate = 1; + p = _PyBytesWriter_Prepare(writer, p, + max_char_size * (startpos - newpos)); + if (p == NULL) + goto error; + } + else { + /* subtract preallocated bytes */ + writer->min_size -= max_char_size * (newpos - startpos); + /* Only overallocate the buffer if it's not the last write */ + writer->overallocate = (newpos < size); + } if (PyBytes_Check(rep)) { p = _PyBytesWriter_WriteBytes(writer, p, diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 5ddde5054428a..b7ec1f28d7e86 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -5959,7 +5959,7 @@ _PyUnicode_EncodeUTF32(PyObject *str, pos = 0; while (pos < len) { - Py_ssize_t repsize, moreunits; + Py_ssize_t newpos, repsize, moreunits; if (kind == PyUnicode_2BYTE_KIND) { pos += ucs2lib_utf32_encode((const Py_UCS2 *)data + pos, len - pos, @@ -5976,7 +5976,7 @@ _PyUnicode_EncodeUTF32(PyObject *str, rep = unicode_encode_call_errorhandler( errors, &errorHandler, encoding, "surrogates not allowed", - str, &exc, pos, pos + 1, &pos); + str, &exc, pos, pos + 1, &newpos); if (!rep) goto error; @@ -5984,7 +5984,7 @@ _PyUnicode_EncodeUTF32(PyObject *str, repsize = PyBytes_GET_SIZE(rep); if (repsize & 3) { raise_encode_exception(&exc, encoding, - str, pos - 1, pos, + str, pos, pos + 1, "surrogates not allowed"); goto error; } @@ -5997,28 +5997,30 @@ _PyUnicode_EncodeUTF32(PyObject *str, moreunits = repsize = PyUnicode_GET_LENGTH(rep); if (!PyUnicode_IS_ASCII(rep)) { raise_encode_exception(&exc, encoding, - str, pos - 1, pos, + str, pos, pos + 1, "surrogates not allowed"); goto error; } } + moreunits += pos - newpos; + pos = newpos; /* four bytes are reserved for each surrogate */ - if (moreunits > 1) { + if (moreunits > 0) { Py_ssize_t outpos = out - (uint32_t*) PyBytes_AS_STRING(v); if (moreunits >= (PY_SSIZE_T_MAX - PyBytes_GET_SIZE(v)) / 4) { /* integer overflow */ PyErr_NoMemory(); goto error; } - if (_PyBytes_Resize(&v, PyBytes_GET_SIZE(v) + 4 * (moreunits - 1)) < 0) + if (_PyBytes_Resize(&v, PyBytes_GET_SIZE(v) + 4 * moreunits) < 0) goto error; out = (uint32_t*) PyBytes_AS_STRING(v) + outpos; } if (PyBytes_Check(rep)) { memcpy(out, PyBytes_AS_STRING(rep), repsize); - out += moreunits; + out += repsize / 4; } else /* rep is unicode */ { assert(PyUnicode_KIND(rep) == PyUnicode_1BYTE_KIND); ucs1lib_utf32_encode(PyUnicode_1BYTE_DATA(rep), repsize, @@ -6311,7 +6313,7 @@ _PyUnicode_EncodeUTF16(PyObject *str, pos = 0; while (pos < len) { - Py_ssize_t repsize, moreunits; + Py_ssize_t newpos, repsize, moreunits; if (kind == PyUnicode_2BYTE_KIND) { pos += ucs2lib_utf16_encode((const Py_UCS2 *)data + pos, len - pos, @@ -6328,7 +6330,7 @@ _PyUnicode_EncodeUTF16(PyObject *str, rep = unicode_encode_call_errorhandler( errors, &errorHandler, encoding, "surrogates not allowed", - str, &exc, pos, pos + 1, &pos); + str, &exc, pos, pos + 1, &newpos); if (!rep) goto error; @@ -6336,7 +6338,7 @@ _PyUnicode_EncodeUTF16(PyObject *str, repsize = PyBytes_GET_SIZE(rep); if (repsize & 1) { raise_encode_exception(&exc, encoding, - str, pos - 1, pos, + str, pos, pos + 1, "surrogates not allowed"); goto error; } @@ -6349,28 +6351,30 @@ _PyUnicode_EncodeUTF16(PyObject *str, moreunits = repsize = PyUnicode_GET_LENGTH(rep); if (!PyUnicode_IS_ASCII(rep)) { raise_encode_exception(&exc, encoding, - str, pos - 1, pos, + str, pos, pos + 1, "surrogates not allowed"); goto error; } } + moreunits += pos - newpos; + pos = newpos; /* two bytes are reserved for each surrogate */ - if (moreunits > 1) { + if (moreunits > 0) { Py_ssize_t outpos = out - (unsigned short*) PyBytes_AS_STRING(v); if (moreunits >= (PY_SSIZE_T_MAX - PyBytes_GET_SIZE(v)) / 2) { /* integer overflow */ PyErr_NoMemory(); goto error; } - if (_PyBytes_Resize(&v, PyBytes_GET_SIZE(v) + 2 * (moreunits - 1)) < 0) + if (_PyBytes_Resize(&v, PyBytes_GET_SIZE(v) + 2 * moreunits) < 0) goto error; out = (unsigned short*) PyBytes_AS_STRING(v) + outpos; } if (PyBytes_Check(rep)) { memcpy(out, PyBytes_AS_STRING(rep), repsize); - out += moreunits; + out += repsize / 2; } else /* rep is unicode */ { assert(PyUnicode_KIND(rep) == PyUnicode_1BYTE_KIND); ucs1lib_utf16_encode(PyUnicode_1BYTE_DATA(rep), repsize, @@ -7297,8 +7301,19 @@ unicode_encode_ucs1(PyObject *unicode, if (rep == NULL) goto onError; - /* subtract preallocated bytes */ - writer.min_size -= newpos - collstart; + if (newpos < collstart) { + writer.overallocate = 1; + str = _PyBytesWriter_Prepare(&writer, str, + collstart - newpos); + if (str == NULL) + goto onError; + } + else { + /* subtract preallocated bytes */ + writer.min_size -= newpos - collstart; + /* Only overallocate the buffer if it's not the last write */ + writer.overallocate = (newpos < size); + } if (PyBytes_Check(rep)) { /* Directly copy bytes result to output. */ @@ -8104,13 +8119,14 @@ encode_code_page_errors(UINT code_page, PyObject **outbytes, pos, pos + 1, &newpos); if (rep == NULL) goto error; - pos = newpos; + Py_ssize_t morebytes = pos - newpos; if (PyBytes_Check(rep)) { outsize = PyBytes_GET_SIZE(rep); - if (outsize != 1) { + morebytes += outsize; + if (morebytes > 0) { Py_ssize_t offset = out - PyBytes_AS_STRING(*outbytes); - newoutsize = PyBytes_GET_SIZE(*outbytes) + (outsize - 1); + newoutsize = PyBytes_GET_SIZE(*outbytes) + morebytes; if (_PyBytes_Resize(outbytes, newoutsize) < 0) { Py_DECREF(rep); goto error; @@ -8131,9 +8147,10 @@ encode_code_page_errors(UINT code_page, PyObject **outbytes, } outsize = PyUnicode_GET_LENGTH(rep); - if (outsize != 1) { + morebytes += outsize; + if (morebytes > 0) { Py_ssize_t offset = out - PyBytes_AS_STRING(*outbytes); - newoutsize = PyBytes_GET_SIZE(*outbytes) + (outsize - 1); + newoutsize = PyBytes_GET_SIZE(*outbytes) + morebytes; if (_PyBytes_Resize(outbytes, newoutsize) < 0) { Py_DECREF(rep); goto error; @@ -8156,6 +8173,7 @@ encode_code_page_errors(UINT code_page, PyObject **outbytes, out++; } } + pos = newpos; Py_DECREF(rep); } /* write a NUL byte */ From webhook-mailer at python.org Mon May 2 05:59:44 2022 From: webhook-mailer at python.org (miss-islington) Date: Mon, 02 May 2022 09:59:44 -0000 Subject: [Python-checkins] bpo-36819: Fix crashes in built-in encoders with weird error handlers (GH-28593) Message-ID: https://github.com/python/cpython/commit/206f416bd07ca3bc9c8bafd124c943d4d0293039 commit: 206f416bd07ca3bc9c8bafd124c943d4d0293039 branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-02T02:59:40-07:00 summary: bpo-36819: Fix crashes in built-in encoders with weird error handlers (GH-28593) If the error handler returns position less or equal than the starting position of non-encodable characters, most of built-in encoders didn't properly re-size the output buffer. This led to out-of-bounds writes, and segfaults. (cherry picked from commit 18b07d773e09a2719e69aeaa925d5abb7ba0c068) Co-authored-by: Serhiy Storchaka files: A Misc/NEWS.d/next/Core and Builtins/2021-09-28-10-58-30.bpo-36819.cyV50C.rst M Lib/test/test_codeccallbacks.py M Objects/stringlib/codecs.h M Objects/unicodeobject.c diff --git a/Lib/test/test_codeccallbacks.py b/Lib/test/test_codeccallbacks.py index 243f002c4ecad..4991330489d13 100644 --- a/Lib/test/test_codeccallbacks.py +++ b/Lib/test/test_codeccallbacks.py @@ -1,5 +1,6 @@ import codecs import html.entities +import itertools import sys import unicodedata import unittest @@ -22,6 +23,18 @@ def handle(self, exc): self.pos = len(exc.object) return ("", oldpos) +class RepeatedPosReturn: + def __init__(self, repl=""): + self.repl = repl + self.pos = 0 + self.count = 0 + + def handle(self, exc): + if self.count > 0: + self.count -= 1 + return (self.repl, self.pos) + return (self.repl, exc.end) + # A UnicodeEncodeError object with a bad start attribute class BadStartUnicodeEncodeError(UnicodeEncodeError): def __init__(self): @@ -783,20 +796,104 @@ def test_lookup(self): codecs.lookup_error("namereplace") ) - def test_unencodablereplacement(self): + def test_encode_nonascii_replacement(self): + def handle(exc): + if isinstance(exc, UnicodeEncodeError): + return (repl, exc.end) + raise TypeError("don't know how to handle %r" % exc) + codecs.register_error("test.replacing", handle) + + for enc, input, repl in ( + ("ascii", "[?]", "abc"), + ("iso-8859-1", "[?]", "??"), + ("iso-8859-15", "[?]", "??"), + ): + res = input.encode(enc, "test.replacing") + self.assertEqual(res, ("[" + repl + "]").encode(enc)) + + for enc, input, repl in ( + ("utf-8", "[\udc80]", "\U0001f40d"), + ("utf-16", "[\udc80]", "\U0001f40d"), + ("utf-32", "[\udc80]", "\U0001f40d"), + ): + with self.subTest(encoding=enc): + with self.assertRaises(UnicodeEncodeError) as cm: + input.encode(enc, "test.replacing") + exc = cm.exception + self.assertEqual(exc.start, 1) + self.assertEqual(exc.end, 2) + self.assertEqual(exc.object, input) + + def test_encode_unencodable_replacement(self): def unencrepl(exc): if isinstance(exc, UnicodeEncodeError): - return ("\u4242", exc.end) + return (repl, exc.end) else: raise TypeError("don't know how to handle %r" % exc) codecs.register_error("test.unencreplhandler", unencrepl) - for enc in ("ascii", "iso-8859-1", "iso-8859-15"): - self.assertRaises( - UnicodeEncodeError, - "\u4242".encode, - enc, - "test.unencreplhandler" - ) + + for enc, input, repl in ( + ("ascii", "[?]", "?"), + ("iso-8859-1", "[?]", "?"), + ("iso-8859-15", "[?]", "?"), + ("utf-8", "[\udc80]", "\udcff"), + ("utf-16", "[\udc80]", "\udcff"), + ("utf-32", "[\udc80]", "\udcff"), + ): + with self.subTest(encoding=enc): + with self.assertRaises(UnicodeEncodeError) as cm: + input.encode(enc, "test.unencreplhandler") + exc = cm.exception + self.assertEqual(exc.start, 1) + self.assertEqual(exc.end, 2) + self.assertEqual(exc.object, input) + + def test_encode_bytes_replacement(self): + def handle(exc): + if isinstance(exc, UnicodeEncodeError): + return (repl, exc.end) + raise TypeError("don't know how to handle %r" % exc) + codecs.register_error("test.replacing", handle) + + # It works even if the bytes sequence is not decodable. + for enc, input, repl in ( + ("ascii", "[?]", b"\xbd\xbe"), + ("iso-8859-1", "[?]", b"\xbd\xbe"), + ("iso-8859-15", "[?]", b"\xbd\xbe"), + ("utf-8", "[\udc80]", b"\xbd\xbe"), + ("utf-16le", "[\udc80]", b"\xbd\xbe"), + ("utf-16be", "[\udc80]", b"\xbd\xbe"), + ("utf-32le", "[\udc80]", b"\xbc\xbd\xbe\xbf"), + ("utf-32be", "[\udc80]", b"\xbc\xbd\xbe\xbf"), + ): + with self.subTest(encoding=enc): + res = input.encode(enc, "test.replacing") + self.assertEqual(res, "[".encode(enc) + repl + "]".encode(enc)) + + def test_encode_odd_bytes_replacement(self): + def handle(exc): + if isinstance(exc, UnicodeEncodeError): + return (repl, exc.end) + raise TypeError("don't know how to handle %r" % exc) + codecs.register_error("test.replacing", handle) + + input = "[\udc80]" + # Tests in which the replacement bytestring contains not whole number + # of code units. + for enc, repl in ( + *itertools.product(("utf-16le", "utf-16be"), + [b"a", b"abc"]), + *itertools.product(("utf-32le", "utf-32be"), + [b"a", b"ab", b"abc", b"abcde"]), + ): + with self.subTest(encoding=enc, repl=repl): + with self.assertRaises(UnicodeEncodeError) as cm: + input.encode(enc, "test.replacing") + exc = cm.exception + self.assertEqual(exc.start, 1) + self.assertEqual(exc.end, 2) + self.assertEqual(exc.object, input) + self.assertEqual(exc.reason, "surrogates not allowed") def test_badregistercall(self): # enhance coverage of: @@ -940,6 +1037,68 @@ def __getitem__(self, key): self.assertRaises(ValueError, codecs.charmap_encode, "\xff", err, D()) self.assertRaises(TypeError, codecs.charmap_encode, "\xff", err, {0xff: 300}) + def test_decodehelper_bug36819(self): + handler = RepeatedPosReturn("x") + codecs.register_error("test.bug36819", handler.handle) + + testcases = [ + ("ascii", b"\xff"), + ("utf-8", b"\xff"), + ("utf-16be", b'\xdc\x80'), + ("utf-32be", b'\x00\x00\xdc\x80'), + ("iso-8859-6", b"\xff"), + ] + for enc, bad in testcases: + input = "abcd".encode(enc) + bad + with self.subTest(encoding=enc): + handler.count = 50 + decoded = input.decode(enc, "test.bug36819") + self.assertEqual(decoded, 'abcdx' * 51) + + def test_encodehelper_bug36819(self): + handler = RepeatedPosReturn() + codecs.register_error("test.bug36819", handler.handle) + + input = "abcd\udc80" + encodings = ["ascii", "latin1", "utf-8", "utf-16", "utf-32"] # built-in + encodings += ["iso-8859-15"] # charmap codec + if sys.platform == 'win32': + encodings = ["mbcs", "oem"] # code page codecs + + handler.repl = "\udcff" + for enc in encodings: + with self.subTest(encoding=enc): + handler.count = 50 + with self.assertRaises(UnicodeEncodeError) as cm: + input.encode(enc, "test.bug36819") + exc = cm.exception + self.assertEqual(exc.start, 4) + self.assertEqual(exc.end, 5) + self.assertEqual(exc.object, input) + if sys.platform == "win32": + handler.count = 50 + with self.assertRaises(UnicodeEncodeError) as cm: + codecs.code_page_encode(437, input, "test.bug36819") + exc = cm.exception + self.assertEqual(exc.start, 4) + self.assertEqual(exc.end, 5) + self.assertEqual(exc.object, input) + + handler.repl = "x" + for enc in encodings: + with self.subTest(encoding=enc): + # The interpreter should segfault after a handful of attempts. + # 50 was chosen to try to ensure a segfault without a fix, + # but not OOM a machine with one. + handler.count = 50 + encoded = input.encode(enc, "test.bug36819") + self.assertEqual(encoded.decode(enc), "abcdx" * 51) + if sys.platform == "win32": + handler.count = 50 + encoded = codecs.code_page_encode(437, input, "test.bug36819") + self.assertEqual(encoded[0].decode(), "abcdx" * 51) + self.assertEqual(encoded[1], len(input)) + def test_translatehelper(self): # enhance coverage of: # Objects/unicodeobject.c::unicode_encode_call_errorhandler() diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-09-28-10-58-30.bpo-36819.cyV50C.rst b/Misc/NEWS.d/next/Core and Builtins/2021-09-28-10-58-30.bpo-36819.cyV50C.rst new file mode 100644 index 0000000000000..32bb55a90e6c4 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2021-09-28-10-58-30.bpo-36819.cyV50C.rst @@ -0,0 +1,2 @@ +Fix crashes in built-in encoders with error handlers that return position +less or equal than the starting position of non-encodable characters. diff --git a/Objects/stringlib/codecs.h b/Objects/stringlib/codecs.h index 9b2a29ba3b8c2..c8da7d57cdcc1 100644 --- a/Objects/stringlib/codecs.h +++ b/Objects/stringlib/codecs.h @@ -388,8 +388,19 @@ STRINGLIB(utf8_encoder)(_PyBytesWriter *writer, if (!rep) goto error; - /* subtract preallocated bytes */ - writer->min_size -= max_char_size * (newpos - startpos); + if (newpos < startpos) { + writer->overallocate = 1; + p = _PyBytesWriter_Prepare(writer, p, + max_char_size * (startpos - newpos)); + if (p == NULL) + goto error; + } + else { + /* subtract preallocated bytes */ + writer->min_size -= max_char_size * (newpos - startpos); + /* Only overallocate the buffer if it's not the last write */ + writer->overallocate = (newpos < size); + } if (PyBytes_Check(rep)) { p = _PyBytesWriter_WriteBytes(writer, p, diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 369f91342e3ac..e5e9ba20301c0 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -5805,7 +5805,7 @@ _PyUnicode_EncodeUTF32(PyObject *str, pos = 0; while (pos < len) { - Py_ssize_t repsize, moreunits; + Py_ssize_t newpos, repsize, moreunits; if (kind == PyUnicode_2BYTE_KIND) { pos += ucs2lib_utf32_encode((const Py_UCS2 *)data + pos, len - pos, @@ -5822,7 +5822,7 @@ _PyUnicode_EncodeUTF32(PyObject *str, rep = unicode_encode_call_errorhandler( errors, &errorHandler, encoding, "surrogates not allowed", - str, &exc, pos, pos + 1, &pos); + str, &exc, pos, pos + 1, &newpos); if (!rep) goto error; @@ -5830,7 +5830,7 @@ _PyUnicode_EncodeUTF32(PyObject *str, repsize = PyBytes_GET_SIZE(rep); if (repsize & 3) { raise_encode_exception(&exc, encoding, - str, pos - 1, pos, + str, pos, pos + 1, "surrogates not allowed"); goto error; } @@ -5843,28 +5843,30 @@ _PyUnicode_EncodeUTF32(PyObject *str, moreunits = repsize = PyUnicode_GET_LENGTH(rep); if (!PyUnicode_IS_ASCII(rep)) { raise_encode_exception(&exc, encoding, - str, pos - 1, pos, + str, pos, pos + 1, "surrogates not allowed"); goto error; } } + moreunits += pos - newpos; + pos = newpos; /* four bytes are reserved for each surrogate */ - if (moreunits > 1) { + if (moreunits > 0) { Py_ssize_t outpos = out - (uint32_t*) PyBytes_AS_STRING(v); if (moreunits >= (PY_SSIZE_T_MAX - PyBytes_GET_SIZE(v)) / 4) { /* integer overflow */ PyErr_NoMemory(); goto error; } - if (_PyBytes_Resize(&v, PyBytes_GET_SIZE(v) + 4 * (moreunits - 1)) < 0) + if (_PyBytes_Resize(&v, PyBytes_GET_SIZE(v) + 4 * moreunits) < 0) goto error; out = (uint32_t*) PyBytes_AS_STRING(v) + outpos; } if (PyBytes_Check(rep)) { memcpy(out, PyBytes_AS_STRING(rep), repsize); - out += moreunits; + out += repsize / 4; } else /* rep is unicode */ { assert(PyUnicode_KIND(rep) == PyUnicode_1BYTE_KIND); ucs1lib_utf32_encode(PyUnicode_1BYTE_DATA(rep), repsize, @@ -6157,7 +6159,7 @@ _PyUnicode_EncodeUTF16(PyObject *str, pos = 0; while (pos < len) { - Py_ssize_t repsize, moreunits; + Py_ssize_t newpos, repsize, moreunits; if (kind == PyUnicode_2BYTE_KIND) { pos += ucs2lib_utf16_encode((const Py_UCS2 *)data + pos, len - pos, @@ -6174,7 +6176,7 @@ _PyUnicode_EncodeUTF16(PyObject *str, rep = unicode_encode_call_errorhandler( errors, &errorHandler, encoding, "surrogates not allowed", - str, &exc, pos, pos + 1, &pos); + str, &exc, pos, pos + 1, &newpos); if (!rep) goto error; @@ -6182,7 +6184,7 @@ _PyUnicode_EncodeUTF16(PyObject *str, repsize = PyBytes_GET_SIZE(rep); if (repsize & 1) { raise_encode_exception(&exc, encoding, - str, pos - 1, pos, + str, pos, pos + 1, "surrogates not allowed"); goto error; } @@ -6195,28 +6197,30 @@ _PyUnicode_EncodeUTF16(PyObject *str, moreunits = repsize = PyUnicode_GET_LENGTH(rep); if (!PyUnicode_IS_ASCII(rep)) { raise_encode_exception(&exc, encoding, - str, pos - 1, pos, + str, pos, pos + 1, "surrogates not allowed"); goto error; } } + moreunits += pos - newpos; + pos = newpos; /* two bytes are reserved for each surrogate */ - if (moreunits > 1) { + if (moreunits > 0) { Py_ssize_t outpos = out - (unsigned short*) PyBytes_AS_STRING(v); if (moreunits >= (PY_SSIZE_T_MAX - PyBytes_GET_SIZE(v)) / 2) { /* integer overflow */ PyErr_NoMemory(); goto error; } - if (_PyBytes_Resize(&v, PyBytes_GET_SIZE(v) + 2 * (moreunits - 1)) < 0) + if (_PyBytes_Resize(&v, PyBytes_GET_SIZE(v) + 2 * moreunits) < 0) goto error; out = (unsigned short*) PyBytes_AS_STRING(v) + outpos; } if (PyBytes_Check(rep)) { memcpy(out, PyBytes_AS_STRING(rep), repsize); - out += moreunits; + out += repsize / 2; } else /* rep is unicode */ { assert(PyUnicode_KIND(rep) == PyUnicode_1BYTE_KIND); ucs1lib_utf16_encode(PyUnicode_1BYTE_DATA(rep), repsize, @@ -7143,8 +7147,19 @@ unicode_encode_ucs1(PyObject *unicode, if (rep == NULL) goto onError; - /* subtract preallocated bytes */ - writer.min_size -= newpos - collstart; + if (newpos < collstart) { + writer.overallocate = 1; + str = _PyBytesWriter_Prepare(&writer, str, + collstart - newpos); + if (str == NULL) + goto onError; + } + else { + /* subtract preallocated bytes */ + writer.min_size -= newpos - collstart; + /* Only overallocate the buffer if it's not the last write */ + writer.overallocate = (newpos < size); + } if (PyBytes_Check(rep)) { /* Directly copy bytes result to output. */ @@ -7933,13 +7948,14 @@ encode_code_page_errors(UINT code_page, PyObject **outbytes, pos, pos + 1, &newpos); if (rep == NULL) goto error; - pos = newpos; + Py_ssize_t morebytes = pos - newpos; if (PyBytes_Check(rep)) { outsize = PyBytes_GET_SIZE(rep); - if (outsize != 1) { + morebytes += outsize; + if (morebytes > 0) { Py_ssize_t offset = out - PyBytes_AS_STRING(*outbytes); - newoutsize = PyBytes_GET_SIZE(*outbytes) + (outsize - 1); + newoutsize = PyBytes_GET_SIZE(*outbytes) + morebytes; if (_PyBytes_Resize(outbytes, newoutsize) < 0) { Py_DECREF(rep); goto error; @@ -7960,9 +7976,10 @@ encode_code_page_errors(UINT code_page, PyObject **outbytes, } outsize = PyUnicode_GET_LENGTH(rep); - if (outsize != 1) { + morebytes += outsize; + if (morebytes > 0) { Py_ssize_t offset = out - PyBytes_AS_STRING(*outbytes); - newoutsize = PyBytes_GET_SIZE(*outbytes) + (outsize - 1); + newoutsize = PyBytes_GET_SIZE(*outbytes) + morebytes; if (_PyBytes_Resize(outbytes, newoutsize) < 0) { Py_DECREF(rep); goto error; @@ -7985,6 +8002,7 @@ encode_code_page_errors(UINT code_page, PyObject **outbytes, out++; } } + pos = newpos; Py_DECREF(rep); } /* write a NUL byte */ From webhook-mailer at python.org Mon May 2 08:09:26 2022 From: webhook-mailer at python.org (vstinner) Date: Mon, 02 May 2022 12:09:26 -0000 Subject: [Python-checkins] gh-91321: Add _testcppext C++ extension (#32175) Message-ID: https://github.com/python/cpython/commit/79886e7b62f4879a4cb17526a9a809bd0f5ed5e3 commit: 79886e7b62f4879a4cb17526a9a809bd0f5ed5e3 branch: main author: Victor Stinner committer: vstinner date: 2022-05-02T14:09:22+02:00 summary: gh-91321: Add _testcppext C++ extension (#32175) Build a basic C++ test extension to check that the Python C API is compatible with C++ and does not emit C++ compiler warnings. * Add Modules/_testcppext.cpp: C++ extension * Add Lib/test/test_cppext.py: test building the C++ extension. files: A Lib/test/_testcppext.cpp A Lib/test/test_cppext.py diff --git a/Lib/test/_testcppext.cpp b/Lib/test/_testcppext.cpp new file mode 100644 index 00000000000000..14cd1ddad17572 --- /dev/null +++ b/Lib/test/_testcppext.cpp @@ -0,0 +1,62 @@ +// gh-91321: Very basic C++ test extension to check that the Python C API is +// compatible with C++ and does not emit C++ compiler warnings. + +#include "Python.h" + +PyDoc_STRVAR(_testcppext_add_doc, +"add(x, y)\n" +"\n" +"Return the sum of two integers: x + y."); + +static PyObject * +_testcppext_add(PyObject *Py_UNUSED(module), PyObject *args) +{ + long i, j; + if (!PyArg_ParseTuple(args, "ll:foo", &i, &j)) { + return nullptr; + } + long res = i + j; + return PyLong_FromLong(res); +} + + +static PyMethodDef _testcppext_methods[] = { + {"add", _testcppext_add, METH_VARARGS, _testcppext_add_doc}, + {nullptr, nullptr, 0, nullptr} /* sentinel */ +}; + + +static int +_testcppext_exec(PyObject *module) +{ + if (PyModule_AddIntMacro(module, __cplusplus) < 0) { + return -1; + } + return 0; +} + +static PyModuleDef_Slot _testcppext_slots[] = { + {Py_mod_exec, reinterpret_cast(_testcppext_exec)}, + {0, NULL} +}; + + +PyDoc_STRVAR(_testcppext_doc, "C++ test extension."); + +static struct PyModuleDef _testcppext_module = { + PyModuleDef_HEAD_INIT, // m_base + "_testcppext", // m_name + _testcppext_doc, // m_doc + 0, // m_size + _testcppext_methods, // m_methods + _testcppext_slots, // m_slots + NULL, // m_traverse + NULL, // m_clear + nullptr, // m_free +}; + +PyMODINIT_FUNC +PyInit__testcppext(void) +{ + return PyModuleDef_Init(&_testcppext_module); +} diff --git a/Lib/test/test_cppext.py b/Lib/test/test_cppext.py new file mode 100644 index 00000000000000..c1d02bc54b3890 --- /dev/null +++ b/Lib/test/test_cppext.py @@ -0,0 +1,79 @@ +# gh-91321: Build a basic C++ test extension to check that the Python C API is +# compatible with C++ and does not emit C++ compiler warnings. +import os +import sys +import unittest +import warnings +from test import support +from test.support import os_helper + +with warnings.catch_warnings(): + warnings.simplefilter('ignore', DeprecationWarning) + from distutils.core import setup, Extension + import distutils.sysconfig + + +MS_WINDOWS = (sys.platform == 'win32') + + +SOURCE = support.findfile('_testcppext.cpp') +if not MS_WINDOWS: + # C++ compiler flags for GCC and clang + CPPFLAGS = [ + # Python currently targets C++11 + '-std=c++11', + # gh-91321: The purpose of _testcppext extension is to check that building + # a C++ extension using the Python C API does not emit C++ compiler + # warnings + '-Werror', + ] +else: + # Don't pass any compiler flag to MSVC + CPPFLAGS = [] + + +class TestCPPExt(unittest.TestCase): + def build(self): + cpp_ext = Extension( + '_testcppext', + sources=[SOURCE], + language='c++', + extra_compile_args=CPPFLAGS) + + try: + try: + with (support.captured_stdout() as stdout, + support.swap_attr(sys, 'argv', ['setup.py', 'build_ext'])): + setup(name="_testcppext", ext_modules=[cpp_ext]) + return + except: + # Show output on error + print() + print(stdout.getvalue()) + raise + except SystemExit: + self.fail("Build failed") + + # With MSVC, the linker fails with: cannot open file 'python311.lib' + # https://github.com/python/cpython/pull/32175#issuecomment-1111175897 + @unittest.skipIf(MS_WINDOWS, 'test fails on Windows') + def test_build(self): + # save/restore os.environ + def restore_env(old_env): + os.environ.clear() + os.environ.update(old_env) + self.addCleanup(restore_env, dict(os.environ)) + + def restore_sysconfig_vars(old_config_vars): + distutils.sysconfig._config_vars.clear() + distutils.sysconfig._config_vars.update(old_config_vars) + self.addCleanup(restore_sysconfig_vars, + dict(distutils.sysconfig._config_vars)) + + # Build in a temporary directory + with os_helper.temp_cwd(): + self.build() + + +if __name__ == "__main__": + unittest.main() From webhook-mailer at python.org Mon May 2 09:29:34 2022 From: webhook-mailer at python.org (vstinner) Date: Mon, 02 May 2022 13:29:34 -0000 Subject: [Python-checkins] gh-88097: doc: fix link to Py_Version (#92141) Message-ID: https://github.com/python/cpython/commit/6811bdef63d4f3af6ff901d324556cf8954575a7 commit: 6811bdef63d4f3af6ff901d324556cf8954575a7 branch: main author: Victor Stinner committer: vstinner date: 2022-05-02T15:29:22+02:00 summary: gh-88097: doc: fix link to Py_Version (#92141) files: M Doc/c-api/init.rst diff --git a/Doc/c-api/init.rst b/Doc/c-api/init.rst index 9d38fb47d10d6..d9a7d8e44e196 100644 --- a/Doc/c-api/init.rst +++ b/Doc/c-api/init.rst @@ -553,7 +553,7 @@ Process-wide parameters period. The returned string points into static storage; the caller should not modify its value. The value is available to Python code as :data:`sys.version`. - See also the :data:`Py_Version` constant. + See also the :c:var:`Py_Version` constant. .. c:function:: const char* Py_GetPlatform() From webhook-mailer at python.org Mon May 2 10:14:51 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Mon, 02 May 2022 14:14:51 -0000 Subject: [Python-checkins] gh-89301: Fix regression with bound values in traced SQLite statements (#92053) Message-ID: https://github.com/python/cpython/commit/721aa96540bb96700f8c4bab0b4095b43491dca1 commit: 721aa96540bb96700f8c4bab0b4095b43491dca1 branch: main author: Erlend Egeberg Aasland committer: JelleZijlstra date: 2022-05-02T08:14:35-06:00 summary: gh-89301: Fix regression with bound values in traced SQLite statements (#92053) files: A Misc/NEWS.d/next/Library/2021-09-08-16-21-03.bpo-45138.yghUrK.rst M Lib/test/test_sqlite3/test_hooks.py M Modules/_sqlite/connection.c diff --git a/Lib/test/test_sqlite3/test_hooks.py b/Lib/test/test_sqlite3/test_hooks.py index d4790cfe77b7b..21042b9bf106f 100644 --- a/Lib/test/test_sqlite3/test_hooks.py +++ b/Lib/test/test_sqlite3/test_hooks.py @@ -20,12 +20,16 @@ # misrepresented as being the original software. # 3. This notice may not be removed or altered from any source distribution. -import unittest +import contextlib import sqlite3 as sqlite +import unittest from test.support.os_helper import TESTFN, unlink + +from test.test_sqlite3.test_dbapi import memory_database, cx_limit from test.test_sqlite3.test_userfunctions import with_tracebacks + class CollationTests(unittest.TestCase): def test_create_collation_not_string(self): con = sqlite.connect(":memory:") @@ -224,6 +228,16 @@ def bad_progress(): class TraceCallbackTests(unittest.TestCase): + @contextlib.contextmanager + def check_stmt_trace(self, cx, expected): + try: + traced = [] + cx.set_trace_callback(lambda stmt: traced.append(stmt)) + yield + finally: + self.assertEqual(traced, expected) + cx.set_trace_callback(None) + def test_trace_callback_used(self): """ Test that the trace callback is invoked once it is set. @@ -289,6 +303,52 @@ def trace(statement): con2.close() self.assertEqual(traced_statements, queries) + def test_trace_expanded_sql(self): + expected = [ + "create table t(t)", + "BEGIN ", + "insert into t values(0)", + "insert into t values(1)", + "insert into t values(2)", + "COMMIT", + ] + with memory_database() as cx, self.check_stmt_trace(cx, expected): + with cx: + cx.execute("create table t(t)") + cx.executemany("insert into t values(?)", ((v,) for v in range(3))) + + @with_tracebacks( + sqlite.DataError, + regex="Expanded SQL string exceeds the maximum string length" + ) + def test_trace_too_much_expanded_sql(self): + # If the expanded string is too large, we'll fall back to the + # unexpanded SQL statement (for SQLite 3.14.0 and newer). + # The resulting string length is limited by the runtime limit + # SQLITE_LIMIT_LENGTH. + template = "select 1 as a where a=" + category = sqlite.SQLITE_LIMIT_LENGTH + with memory_database() as cx, cx_limit(cx, category=category) as lim: + ok_param = "a" + bad_param = "a" * lim + + unexpanded_query = template + "?" + expected = [unexpanded_query] + if sqlite.sqlite_version_info < (3, 14, 0): + expected = [] + with self.check_stmt_trace(cx, expected): + cx.execute(unexpanded_query, (bad_param,)) + + expanded_query = f"{template}'{ok_param}'" + with self.check_stmt_trace(cx, [expanded_query]): + cx.execute(unexpanded_query, (ok_param,)) + + @with_tracebacks(ZeroDivisionError, regex="division by zero") + def test_trace_bad_handler(self): + with memory_database() as cx: + cx.set_trace_callback(lambda stmt: 5/0) + cx.execute("select 1") + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/Library/2021-09-08-16-21-03.bpo-45138.yghUrK.rst b/Misc/NEWS.d/next/Library/2021-09-08-16-21-03.bpo-45138.yghUrK.rst new file mode 100644 index 0000000000000..906ed4c4db43c --- /dev/null +++ b/Misc/NEWS.d/next/Library/2021-09-08-16-21-03.bpo-45138.yghUrK.rst @@ -0,0 +1,3 @@ +Fix a regression in the :mod:`sqlite3` trace callback where bound parameters +were not expanded in the passed statement string. The regression was introduced +in Python 3.10 by :issue:`40318`. Patch by Erlend E. Aasland. diff --git a/Modules/_sqlite/connection.c b/Modules/_sqlite/connection.c index 0028cf72f997a..fe244c8b22771 100644 --- a/Modules/_sqlite/connection.c +++ b/Modules/_sqlite/connection.c @@ -1332,11 +1332,10 @@ progress_callback(void *ctx) * to ensure future compatibility. */ static int -trace_callback(unsigned int type, void *ctx, void *prepared_statement, - void *statement_string) +trace_callback(unsigned int type, void *ctx, void *stmt, void *sql) #else static void -trace_callback(void *ctx, const char *statement_string) +trace_callback(void *ctx, const char *sql) #endif { #ifdef HAVE_TRACE_V2 @@ -1347,24 +1346,51 @@ trace_callback(void *ctx, const char *statement_string) PyGILState_STATE gilstate = PyGILState_Ensure(); - PyObject *py_statement = NULL; - PyObject *ret = NULL; - py_statement = PyUnicode_DecodeUTF8(statement_string, - strlen(statement_string), "replace"); assert(ctx != NULL); + pysqlite_state *state = ((callback_context *)ctx)->state; + assert(state != NULL); + + PyObject *py_statement = NULL; +#ifdef HAVE_TRACE_V2 + const char *expanded_sql = sqlite3_expanded_sql((sqlite3_stmt *)stmt); + if (expanded_sql == NULL) { + sqlite3 *db = sqlite3_db_handle((sqlite3_stmt *)stmt); + if (sqlite3_errcode(db) == SQLITE_NOMEM) { + (void)PyErr_NoMemory(); + goto exit; + } + + PyErr_SetString(state->DataError, + "Expanded SQL string exceeds the maximum string length"); + print_or_clear_traceback((callback_context *)ctx); + + // Fall back to unexpanded sql + py_statement = PyUnicode_FromString((const char *)sql); + } + else { + py_statement = PyUnicode_FromString(expanded_sql); + sqlite3_free((void *)expanded_sql); + } +#else + if (sql == NULL) { + PyErr_SetString(state->DataError, + "Expanded SQL string exceeds the maximum string length"); + print_or_clear_traceback((callback_context *)ctx); + goto exit; + } + py_statement = PyUnicode_FromString(sql); +#endif if (py_statement) { PyObject *callable = ((callback_context *)ctx)->callable; - ret = PyObject_CallOneArg(callable, py_statement); + PyObject *ret = PyObject_CallOneArg(callable, py_statement); Py_DECREF(py_statement); + Py_XDECREF(ret); } - - if (ret) { - Py_DECREF(ret); - } - else { - print_or_clear_traceback(ctx); + if (PyErr_Occurred()) { + print_or_clear_traceback((callback_context *)ctx); } +exit: PyGILState_Release(gilstate); #ifdef HAVE_TRACE_V2 return 0; From webhook-mailer at python.org Mon May 2 10:31:59 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Mon, 02 May 2022 14:31:59 -0000 Subject: [Python-checkins] gh-84714: Add behavior if dst file exists (#91867) Message-ID: https://github.com/python/cpython/commit/9166ace805d915c8a918cd89fff0e58b65e3327c commit: 9166ace805d915c8a918cd89fff0e58b65e3327c branch: main author: slateny <46876382+slateny at users.noreply.github.com> committer: JelleZijlstra date: 2022-05-02T08:31:55-06:00 summary: gh-84714: Add behavior if dst file exists (#91867) files: M Doc/library/shutil.rst diff --git a/Doc/library/shutil.rst b/Doc/library/shutil.rst index 75ffb79d535c8..cb72ff6f3914b 100644 --- a/Doc/library/shutil.rst +++ b/Doc/library/shutil.rst @@ -160,7 +160,8 @@ Directory and files operations Copies the file *src* to the file or directory *dst*. *src* and *dst* should be :term:`path-like objects ` or strings. If *dst* specifies a directory, the file will be copied into *dst* using the - base filename from *src*. Returns the path to the newly created file. + base filename from *src*. If *dst* specifies a file that already exists, + it will be replaced. Returns the path to the newly created file. If *follow_symlinks* is false, and *src* is a symbolic link, *dst* will be created as a symbolic link. If *follow_symlinks* From webhook-mailer at python.org Mon May 2 10:36:50 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Mon, 02 May 2022 14:36:50 -0000 Subject: [Python-checkins] [3.9] gh-81488: Add recursive wording for issubclass docs (GH-92087) (#92131) Message-ID: https://github.com/python/cpython/commit/28cd98f352dcb9728c272d842070602edc69c0a7 commit: 28cd98f352dcb9728c272d842070602edc69c0a7 branch: 3.9 author: slateny <46876382+slateny at users.noreply.github.com> committer: JelleZijlstra date: 2022-05-02T08:36:19-06:00 summary: [3.9] gh-81488: Add recursive wording for issubclass docs (GH-92087) (#92131) (cherry picked from commit 1066ecb97042b8e89de554e6f9dc2e3d634208c0) Co-authored-by: slateny <46876382+slateny at users.noreply.github.com> files: M Doc/library/functions.rst diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst index 937e00bf994e6..13d7d6e5b0aa3 100644 --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -862,7 +862,8 @@ are always available. They are listed here in alphabetical order. Return ``True`` if *class* is a subclass (direct, indirect or :term:`virtual `) of *classinfo*. A class is considered a subclass of itself. *classinfo* may be a tuple of class - objects, in which case return ``True`` if *class* is a subclass of any entry + objects (or recursively, other such tuples), + in which case return ``True`` if *class* is a subclass of any entry in *classinfo*. In any other case, a :exc:`TypeError` exception is raised. From webhook-mailer at python.org Mon May 2 10:43:51 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Mon, 02 May 2022 14:43:51 -0000 Subject: [Python-checkins] gh-85133: os docs: Add that getenv uses os.environ (#91874) Message-ID: https://github.com/python/cpython/commit/b25352a5c039d95e019dd8ca111f6f77c43ca1f7 commit: b25352a5c039d95e019dd8ca111f6f77c43ca1f7 branch: main author: slateny <46876382+slateny at users.noreply.github.com> committer: JelleZijlstra date: 2022-05-02T08:43:32-06:00 summary: gh-85133: os docs: Add that getenv uses os.environ (#91874) Co-authored-by: Jelle Zijlstra files: M Doc/library/os.rst diff --git a/Doc/library/os.rst b/Doc/library/os.rst index d42259b2548f6..aa50673445884 100644 --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -177,8 +177,8 @@ process and user. This mapping is captured the first time the :mod:`os` module is imported, typically during Python startup as part of processing :file:`site.py`. Changes - to the environment made after this time are not reflected in ``os.environ``, - except for changes made by modifying ``os.environ`` directly. + to the environment made after this time are not reflected in :data:`os.environ`, + except for changes made by modifying :data:`os.environ` directly. This mapping may be used to modify the environment as well as query the environment. :func:`putenv` will be called automatically when the mapping @@ -190,8 +190,8 @@ process and user. .. note:: - Calling :func:`putenv` directly does not change ``os.environ``, so it's better - to modify ``os.environ``. + Calling :func:`putenv` directly does not change :data:`os.environ`, so it's better + to modify :data:`os.environ`. .. note:: @@ -201,7 +201,7 @@ process and user. You can delete items in this mapping to unset environment variables. :func:`unsetenv` will be called automatically when an item is deleted from - ``os.environ``, and when one of the :meth:`pop` or :meth:`clear` methods is + :data:`os.environ`, and when one of the :meth:`pop` or :meth:`clear` methods is called. .. versionchanged:: 3.9 @@ -292,7 +292,10 @@ process and user. .. function:: getenv(key, default=None) Return the value of the environment variable *key* if it exists, or - *default* if it doesn't. *key*, *default* and the result are str. + *default* if it doesn't. *key*, *default* and the result are str. Note that + since :func:`getenv` uses :data:`os.environ`, the mapping of :func:`getenv` is + similarly also captured on import, and the function may not reflect + future environment changes. On Unix, keys and values are decoded with :func:`sys.getfilesystemencoding` and ``'surrogateescape'`` error handler. Use :func:`os.getenvb` if you @@ -304,7 +307,11 @@ process and user. .. function:: getenvb(key, default=None) Return the value of the environment variable *key* if it exists, or - *default* if it doesn't. *key*, *default* and the result are bytes. + *default* if it doesn't. *key*, *default* and the result are bytes. Note that + since :func:`getenvb` uses :data:`os.environb`, the mapping of :func:`getenvb` is + similarly also captured on import, and the function may not reflect + future environment changes. + :func:`getenvb` is only available if :data:`supports_bytes_environ` is ``True``. @@ -511,10 +518,11 @@ process and user. changes to the environment affect subprocesses started with :func:`os.system`, :func:`popen` or :func:`fork` and :func:`execv`. - Assignments to items in ``os.environ`` are automatically translated into + Assignments to items in :data:`os.environ` are automatically translated into corresponding calls to :func:`putenv`; however, calls to :func:`putenv` - don't update ``os.environ``, so it is actually preferable to assign to items - of ``os.environ``. + don't update :data:`os.environ`, so it is actually preferable to assign to items + of :data:`os.environ`. This also applies to :func:`getenv` and :func:`getenvb`, which + respectively use :data:`os.environ` and :data:`os.environb` in their implementations. .. note:: @@ -713,10 +721,10 @@ process and user. environment affect subprocesses started with :func:`os.system`, :func:`popen` or :func:`fork` and :func:`execv`. - Deletion of items in ``os.environ`` is automatically translated into a + Deletion of items in :data:`os.environ` is automatically translated into a corresponding call to :func:`unsetenv`; however, calls to :func:`unsetenv` - don't update ``os.environ``, so it is actually preferable to delete items of - ``os.environ``. + don't update :data:`os.environ`, so it is actually preferable to delete items of + :data:`os.environ`. .. audit-event:: os.unsetenv key os.unsetenv From webhook-mailer at python.org Mon May 2 10:51:16 2022 From: webhook-mailer at python.org (miss-islington) Date: Mon, 02 May 2022 14:51:16 -0000 Subject: [Python-checkins] gh-84714: Add behavior if dst file exists (GH-91867) Message-ID: https://github.com/python/cpython/commit/bba721d0fa7832fd9dbdde44ba39f19755513303 commit: bba721d0fa7832fd9dbdde44ba39f19755513303 branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-02T07:51:07-07:00 summary: gh-84714: Add behavior if dst file exists (GH-91867) (cherry picked from commit 9166ace805d915c8a918cd89fff0e58b65e3327c) Co-authored-by: slateny <46876382+slateny at users.noreply.github.com> files: M Doc/library/shutil.rst diff --git a/Doc/library/shutil.rst b/Doc/library/shutil.rst index 8ce0e80ec8120..403df45b3966a 100644 --- a/Doc/library/shutil.rst +++ b/Doc/library/shutil.rst @@ -160,7 +160,8 @@ Directory and files operations Copies the file *src* to the file or directory *dst*. *src* and *dst* should be :term:`path-like objects ` or strings. If *dst* specifies a directory, the file will be copied into *dst* using the - base filename from *src*. Returns the path to the newly created file. + base filename from *src*. If *dst* specifies a file that already exists, + it will be replaced. Returns the path to the newly created file. If *follow_symlinks* is false, and *src* is a symbolic link, *dst* will be created as a symbolic link. If *follow_symlinks* From webhook-mailer at python.org Mon May 2 10:54:16 2022 From: webhook-mailer at python.org (miss-islington) Date: Mon, 02 May 2022 14:54:16 -0000 Subject: [Python-checkins] gh-84714: Add behavior if dst file exists (GH-91867) Message-ID: https://github.com/python/cpython/commit/cafcb2cdcadc54a358905449549347f6e8c84f21 commit: cafcb2cdcadc54a358905449549347f6e8c84f21 branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-02T07:54:12-07:00 summary: gh-84714: Add behavior if dst file exists (GH-91867) (cherry picked from commit 9166ace805d915c8a918cd89fff0e58b65e3327c) Co-authored-by: slateny <46876382+slateny at users.noreply.github.com> files: M Doc/library/shutil.rst diff --git a/Doc/library/shutil.rst b/Doc/library/shutil.rst index 8ce0e80ec8120..403df45b3966a 100644 --- a/Doc/library/shutil.rst +++ b/Doc/library/shutil.rst @@ -160,7 +160,8 @@ Directory and files operations Copies the file *src* to the file or directory *dst*. *src* and *dst* should be :term:`path-like objects ` or strings. If *dst* specifies a directory, the file will be copied into *dst* using the - base filename from *src*. Returns the path to the newly created file. + base filename from *src*. If *dst* specifies a file that already exists, + it will be replaced. Returns the path to the newly created file. If *follow_symlinks* is false, and *src* is a symbolic link, *dst* will be created as a symbolic link. If *follow_symlinks* From webhook-mailer at python.org Mon May 2 10:58:13 2022 From: webhook-mailer at python.org (miss-islington) Date: Mon, 02 May 2022 14:58:13 -0000 Subject: [Python-checkins] gh-85133: os docs: Add that getenv uses os.environ (GH-91874) Message-ID: https://github.com/python/cpython/commit/9ce39cc9f218da782949f6957b900fb8a8aa7a75 commit: 9ce39cc9f218da782949f6957b900fb8a8aa7a75 branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-02T07:58:09-07:00 summary: gh-85133: os docs: Add that getenv uses os.environ (GH-91874) Co-authored-by: Jelle Zijlstra (cherry picked from commit b25352a5c039d95e019dd8ca111f6f77c43ca1f7) Co-authored-by: slateny <46876382+slateny at users.noreply.github.com> files: M Doc/library/os.rst diff --git a/Doc/library/os.rst b/Doc/library/os.rst index b81574b7eaa46..1eaf369ff659a 100644 --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -177,8 +177,8 @@ process and user. This mapping is captured the first time the :mod:`os` module is imported, typically during Python startup as part of processing :file:`site.py`. Changes - to the environment made after this time are not reflected in ``os.environ``, - except for changes made by modifying ``os.environ`` directly. + to the environment made after this time are not reflected in :data:`os.environ`, + except for changes made by modifying :data:`os.environ` directly. This mapping may be used to modify the environment as well as query the environment. :func:`putenv` will be called automatically when the mapping @@ -190,8 +190,8 @@ process and user. .. note:: - Calling :func:`putenv` directly does not change ``os.environ``, so it's better - to modify ``os.environ``. + Calling :func:`putenv` directly does not change :data:`os.environ`, so it's better + to modify :data:`os.environ`. .. note:: @@ -201,7 +201,7 @@ process and user. You can delete items in this mapping to unset environment variables. :func:`unsetenv` will be called automatically when an item is deleted from - ``os.environ``, and when one of the :meth:`pop` or :meth:`clear` methods is + :data:`os.environ`, and when one of the :meth:`pop` or :meth:`clear` methods is called. .. versionchanged:: 3.9 @@ -292,7 +292,10 @@ process and user. .. function:: getenv(key, default=None) Return the value of the environment variable *key* if it exists, or - *default* if it doesn't. *key*, *default* and the result are str. + *default* if it doesn't. *key*, *default* and the result are str. Note that + since :func:`getenv` uses :data:`os.environ`, the mapping of :func:`getenv` is + similarly also captured on import, and the function may not reflect + future environment changes. On Unix, keys and values are decoded with :func:`sys.getfilesystemencoding` and ``'surrogateescape'`` error handler. Use :func:`os.getenvb` if you @@ -304,7 +307,11 @@ process and user. .. function:: getenvb(key, default=None) Return the value of the environment variable *key* if it exists, or - *default* if it doesn't. *key*, *default* and the result are bytes. + *default* if it doesn't. *key*, *default* and the result are bytes. Note that + since :func:`getenvb` uses :data:`os.environb`, the mapping of :func:`getenvb` is + similarly also captured on import, and the function may not reflect + future environment changes. + :func:`getenvb` is only available if :data:`supports_bytes_environ` is ``True``. @@ -510,10 +517,11 @@ process and user. changes to the environment affect subprocesses started with :func:`os.system`, :func:`popen` or :func:`fork` and :func:`execv`. - Assignments to items in ``os.environ`` are automatically translated into + Assignments to items in :data:`os.environ` are automatically translated into corresponding calls to :func:`putenv`; however, calls to :func:`putenv` - don't update ``os.environ``, so it is actually preferable to assign to items - of ``os.environ``. + don't update :data:`os.environ`, so it is actually preferable to assign to items + of :data:`os.environ`. This also applies to :func:`getenv` and :func:`getenvb`, which + respectively use :data:`os.environ` and :data:`os.environb` in their implementations. .. note:: @@ -712,10 +720,10 @@ process and user. environment affect subprocesses started with :func:`os.system`, :func:`popen` or :func:`fork` and :func:`execv`. - Deletion of items in ``os.environ`` is automatically translated into a + Deletion of items in :data:`os.environ` is automatically translated into a corresponding call to :func:`unsetenv`; however, calls to :func:`unsetenv` - don't update ``os.environ``, so it is actually preferable to delete items of - ``os.environ``. + don't update :data:`os.environ`, so it is actually preferable to delete items of + :data:`os.environ`. .. audit-event:: os.unsetenv key os.unsetenv From webhook-mailer at python.org Mon May 2 11:01:12 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Mon, 02 May 2022 15:01:12 -0000 Subject: [Python-checkins] Fix typo in Programming FAQ (#92083) Message-ID: https://github.com/python/cpython/commit/2a7efa324274a54fe0e5480cae1438d8294b9ec3 commit: 2a7efa324274a54fe0e5480cae1438d8294b9ec3 branch: main author: Matt Harding committer: JelleZijlstra date: 2022-05-02T09:01:03-06:00 summary: Fix typo in Programming FAQ (#92083) I believe the word "with" was missing here. files: M Doc/faq/programming.rst diff --git a/Doc/faq/programming.rst b/Doc/faq/programming.rst index da011ccb29edb..f87eaff9531fc 100644 --- a/Doc/faq/programming.rst +++ b/Doc/faq/programming.rst @@ -78,7 +78,7 @@ set of modules required by a program and bind these modules together with a Python binary to produce a single executable. One is to use the freeze tool, which is included in the Python source tree as -``Tools/freeze``. It converts Python byte code to C arrays; a C compiler you can +``Tools/freeze``. It converts Python byte code to C arrays; with a C compiler you can embed all your modules into a new program, which is then linked with the standard Python modules. From webhook-mailer at python.org Mon May 2 11:01:56 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Mon, 02 May 2022 15:01:56 -0000 Subject: [Python-checkins] asyncio.subprocess: Fix a typo in doc (#92030) Message-ID: https://github.com/python/cpython/commit/bb857a96ef368ba9de1da2db12b1a1f1870606ac commit: bb857a96ef368ba9de1da2db12b1a1f1870606ac branch: main author: Harsh <65716674+Harsh-br0 at users.noreply.github.com> committer: JelleZijlstra date: 2022-05-02T09:01:52-06:00 summary: asyncio.subprocess: Fix a typo in doc (#92030) Remove a confusion for read method in asyncio-subprocess doc for stderr StreamReader instance files: M Doc/library/asyncio-subprocess.rst diff --git a/Doc/library/asyncio-subprocess.rst b/Doc/library/asyncio-subprocess.rst index 748b704032554..e5000532a895d 100644 --- a/Doc/library/asyncio-subprocess.rst +++ b/Doc/library/asyncio-subprocess.rst @@ -275,7 +275,7 @@ their completion. Use the :meth:`communicate` method rather than :attr:`process.stdin.write() `, :attr:`await process.stdout.read() ` or - :attr:`await process.stderr.read `. + :attr:`await process.stderr.read() `. This avoids deadlocks due to streams pausing reading or writing and blocking the child process. From webhook-mailer at python.org Mon May 2 11:02:58 2022 From: webhook-mailer at python.org (zooba) Date: Mon, 02 May 2022 15:02:58 -0000 Subject: [Python-checkins] bpo-46907: Update Windows installer to SQLite 3.38.3. (GH-91995) Message-ID: https://github.com/python/cpython/commit/e6040604b3e12a2897274ed6c715c45eea524cb5 commit: e6040604b3e12a2897274ed6c715c45eea524cb5 branch: main author: Mariusz Felisiak committer: zooba date: 2022-05-02T16:02:54+01:00 summary: bpo-46907: Update Windows installer to SQLite 3.38.3. (GH-91995) files: A Misc/NEWS.d/next/Windows/2022-04-27-19-36-56.bpo-46907.lfurlP.rst M PCbuild/get_externals.bat M PCbuild/python.props M PCbuild/readme.txt M PCbuild/sqlite3.vcxproj diff --git a/Misc/NEWS.d/next/Windows/2022-04-27-19-36-56.bpo-46907.lfurlP.rst b/Misc/NEWS.d/next/Windows/2022-04-27-19-36-56.bpo-46907.lfurlP.rst new file mode 100644 index 0000000000000..88ea9f931188e --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2022-04-27-19-36-56.bpo-46907.lfurlP.rst @@ -0,0 +1 @@ +Update Windows installer to use SQLite 3.38.3. diff --git a/PCbuild/get_externals.bat b/PCbuild/get_externals.bat index 35646edb2e9e8..4241baadec4bd 100644 --- a/PCbuild/get_externals.bat +++ b/PCbuild/get_externals.bat @@ -54,7 +54,7 @@ set libraries= set libraries=%libraries% bzip2-1.0.8 if NOT "%IncludeLibffiSrc%"=="false" set libraries=%libraries% libffi-3.4.2 if NOT "%IncludeSSLSrc%"=="false" set libraries=%libraries% openssl-1.1.1n -set libraries=%libraries% sqlite-3.38.2.0 +set libraries=%libraries% sqlite-3.38.3.0 if NOT "%IncludeTkinterSrc%"=="false" set libraries=%libraries% tcl-core-8.6.12.1 if NOT "%IncludeTkinterSrc%"=="false" set libraries=%libraries% tk-8.6.12.1 if NOT "%IncludeTkinterSrc%"=="false" set libraries=%libraries% tix-8.4.3.6 diff --git a/PCbuild/python.props b/PCbuild/python.props index baa6526378a75..e50fdc0aa61f3 100644 --- a/PCbuild/python.props +++ b/PCbuild/python.props @@ -61,7 +61,7 @@ $(EXTERNALS_DIR) $([System.IO.Path]::GetFullPath(`$(PySourcePath)externals`)) $(ExternalsDir)\ - $(ExternalsDir)sqlite-3.38.2.0\ + $(ExternalsDir)sqlite-3.38.3.0\ $(ExternalsDir)bzip2-1.0.8\ $(ExternalsDir)xz-5.2.5\ $(ExternalsDir)libffi-3.4.2\ diff --git a/PCbuild/readme.txt b/PCbuild/readme.txt index 4c99b867c52bd..da8947c938b51 100644 --- a/PCbuild/readme.txt +++ b/PCbuild/readme.txt @@ -189,7 +189,7 @@ _ssl again when building. _sqlite3 - Wraps SQLite 3.38.2, which is itself built by sqlite3.vcxproj + Wraps SQLite 3.38.3, which is itself built by sqlite3.vcxproj Homepage: http://www.sqlite.org/ _tkinter diff --git a/PCbuild/sqlite3.vcxproj b/PCbuild/sqlite3.vcxproj index 310795c4e4d20..c502d51833b91 100644 --- a/PCbuild/sqlite3.vcxproj +++ b/PCbuild/sqlite3.vcxproj @@ -98,7 +98,7 @@ $(sqlite3Dir);%(AdditionalIncludeDirectories) - SQLITE_ENABLE_MATH_FUNCTIONS;SQLITE_ENABLE_JSON1;SQLITE_ENABLE_FTS4;SQLITE_ENABLE_FTS5;SQLITE_ENABLE_RTREE;SQLITE_OMIT_AUTOINIT;SQLITE_API=__declspec(dllexport);%(PreprocessorDefinitions) + SQLITE_ENABLE_MATH_FUNCTIONS;SQLITE_ENABLE_FTS4;SQLITE_ENABLE_FTS5;SQLITE_ENABLE_RTREE;SQLITE_OMIT_AUTOINIT;SQLITE_API=__declspec(dllexport);%(PreprocessorDefinitions) Level1 From webhook-mailer at python.org Mon May 2 11:05:34 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Mon, 02 May 2022 15:05:34 -0000 Subject: [Python-checkins] concurrent.futures: Fix typo in docstring (#92121) Message-ID: https://github.com/python/cpython/commit/b11243e85e020ed2f524bdd83c339faf11ef03d4 commit: b11243e85e020ed2f524bdd83c339faf11ef03d4 branch: main author: Yiannis Hadjicharalambous committer: JelleZijlstra date: 2022-05-02T09:05:26-06:00 summary: concurrent.futures: Fix typo in docstring (#92121) files: M Lib/concurrent/futures/_base.py diff --git a/Lib/concurrent/futures/_base.py b/Lib/concurrent/futures/_base.py index 706a4f2c09d1f..d7e7e41967cc2 100644 --- a/Lib/concurrent/futures/_base.py +++ b/Lib/concurrent/futures/_base.py @@ -379,7 +379,7 @@ def running(self): return self._state == RUNNING def done(self): - """Return True of the future was cancelled or finished executing.""" + """Return True if the future was cancelled or finished executing.""" with self._condition: return self._state in [CANCELLED, CANCELLED_AND_NOTIFIED, FINISHED] From webhook-mailer at python.org Mon May 2 11:07:06 2022 From: webhook-mailer at python.org (vstinner) Date: Mon, 02 May 2022 15:07:06 -0000 Subject: [Python-checkins] gh-92135: Fix _Py_reinterpret_cast() for const (#92138) Message-ID: https://github.com/python/cpython/commit/031397063e9c22711abfbf90f2617c8785cfc42c commit: 031397063e9c22711abfbf90f2617c8785cfc42c branch: main author: Victor Stinner committer: vstinner date: 2022-05-02T17:07:00+02:00 summary: gh-92135: Fix _Py_reinterpret_cast() for const (#92138) Fix C++ compiler warnings on cast macros, like _PyObject_CAST(), when casting a constant expression to a non constant type: use const_cast<> in C++. * In C++, Py_SAFE_DOWNCAST() now uses static_cast<> rather than reinterpret_cast<>. * Add tests to the _testcppext C++ extension. * test_cppext no longer captures stdout in verbose mode. files: M Include/methodobject.h M Include/objimpl.h M Include/pyport.h M Lib/test/_testcppext.cpp M Lib/test/test_cppext.py diff --git a/Include/methodobject.h b/Include/methodobject.h index 2046ab948de05..f4be3858f2f8a 100644 --- a/Include/methodobject.h +++ b/Include/methodobject.h @@ -43,8 +43,7 @@ typedef PyObject *(*PyCMethod)(PyObject *, PyTypeObject *, PyObject *const *, // it triggers an undefined behavior when Python calls it with 2 parameters // (bpo-33012). #define _PyCFunction_CAST(func) \ - _Py_reinterpret_cast(PyCFunction, \ - _Py_reinterpret_cast(void(*)(void), (func))) + _Py_reinterpret_cast(PyCFunction, _Py_reinterpret_cast(void(*)(void), (func))) PyAPI_FUNC(PyCFunction) PyCFunction_GetFunction(PyObject *); PyAPI_FUNC(PyObject *) PyCFunction_GetSelf(PyObject *); diff --git a/Include/objimpl.h b/Include/objimpl.h index 94e03045f882a..c8e57c9755749 100644 --- a/Include/objimpl.h +++ b/Include/objimpl.h @@ -182,9 +182,9 @@ PyAPI_FUNC(void) PyObject_GC_UnTrack(void *); PyAPI_FUNC(void) PyObject_GC_Del(void *); #define PyObject_GC_New(type, typeobj) \ - _Py_reinterpret_cast(type*, _PyObject_GC_New(typeobj)) + _Py_reinterpret_cast(type*, _PyObject_GC_New(typeobj)) #define PyObject_GC_NewVar(type, typeobj, n) \ - _Py_reinterpret_cast(type*, _PyObject_GC_NewVar((typeobj), (n))) + _Py_reinterpret_cast(type*, _PyObject_GC_NewVar((typeobj), (n))) PyAPI_FUNC(int) PyObject_GC_IsTracked(PyObject *); PyAPI_FUNC(int) PyObject_GC_IsFinalized(PyObject *); diff --git a/Include/pyport.h b/Include/pyport.h index 923897305fc6b..3f5ce672bdafe 100644 --- a/Include/pyport.h +++ b/Include/pyport.h @@ -14,10 +14,20 @@ #endif -// Macro to use C++ static_cast<> and reinterpret_cast<> in the Python C API +// Macro to use C++ static_cast<>, reinterpret_cast<> and const_cast<> +// in the Python C API. +// +// In C++, _Py_reinterpret_cast(type, expr) converts a constant expression to a +// non constant type using const_cast. For example, +// _Py_reinterpret_cast(PyObject*, op) can convert a "const PyObject*" to +// "PyObject*". +// +// The type argument must not be constant. For example, in C++, +// _Py_reinterpret_cast(const PyObject*, expr) fails with a compiler error. #ifdef __cplusplus # define _Py_static_cast(type, expr) static_cast(expr) -# define _Py_reinterpret_cast(type, expr) reinterpret_cast(expr) +# define _Py_reinterpret_cast(type, expr) \ + const_cast(reinterpret_cast(expr)) #else # define _Py_static_cast(type, expr) ((type)(expr)) # define _Py_reinterpret_cast(type, expr) ((type)(expr)) @@ -307,10 +317,10 @@ extern "C" { */ #ifdef Py_DEBUG # define Py_SAFE_DOWNCAST(VALUE, WIDE, NARROW) \ - (assert((WIDE)(NARROW)(VALUE) == (VALUE)), (NARROW)(VALUE)) + (assert(_Py_static_cast(WIDE, _Py_static_cast(NARROW, (VALUE))) == (VALUE)), \ + _Py_static_cast(NARROW, (VALUE))) #else -# define Py_SAFE_DOWNCAST(VALUE, WIDE, NARROW) \ - _Py_reinterpret_cast(NARROW, (VALUE)) +# define Py_SAFE_DOWNCAST(VALUE, WIDE, NARROW) _Py_static_cast(NARROW, (VALUE)) #endif diff --git a/Lib/test/_testcppext.cpp b/Lib/test/_testcppext.cpp index 14cd1ddad1757..257843bfc7726 100644 --- a/Lib/test/_testcppext.cpp +++ b/Lib/test/_testcppext.cpp @@ -1,6 +1,9 @@ // gh-91321: Very basic C++ test extension to check that the Python C API is // compatible with C++ and does not emit C++ compiler warnings. +// Always enable assertions +#undef NDEBUG + #include "Python.h" PyDoc_STRVAR(_testcppext_add_doc, @@ -20,8 +23,36 @@ _testcppext_add(PyObject *Py_UNUSED(module), PyObject *args) } +static PyObject * +test_api_casts(PyObject *Py_UNUSED(module), PyObject *Py_UNUSED(args)) +{ + PyObject *obj = Py_BuildValue("(ii)", 1, 2); + if (obj == nullptr) { + return nullptr; + } + + // gh-92138: For backward compatibility, functions of Python C API accepts + // "const PyObject*". Check that using it does not emit C++ compiler + // warnings. + const PyObject *const_obj = obj; + Py_INCREF(const_obj); + Py_DECREF(const_obj); + PyTypeObject *type = Py_TYPE(const_obj); + assert(Py_REFCNT(const_obj) >= 1); + + assert(type == &PyTuple_Type); + assert(PyTuple_GET_SIZE(const_obj) == 2); + PyObject *one = PyTuple_GET_ITEM(const_obj, 0); + assert(PyLong_AsLong(one) == 1); + + Py_DECREF(obj); + Py_RETURN_NONE; +} + + static PyMethodDef _testcppext_methods[] = { {"add", _testcppext_add, METH_VARARGS, _testcppext_add_doc}, + {"test_api_casts", test_api_casts, METH_NOARGS, NULL}, {nullptr, nullptr, 0, nullptr} /* sentinel */ }; diff --git a/Lib/test/test_cppext.py b/Lib/test/test_cppext.py index c1d02bc54b389..99f6062d79d47 100644 --- a/Lib/test/test_cppext.py +++ b/Lib/test/test_cppext.py @@ -1,5 +1,6 @@ # gh-91321: Build a basic C++ test extension to check that the Python C API is # compatible with C++ and does not emit C++ compiler warnings. +import contextlib import os import sys import unittest @@ -39,17 +40,24 @@ def build(self): sources=[SOURCE], language='c++', extra_compile_args=CPPFLAGS) + capture_stdout = (not support.verbose) try: try: - with (support.captured_stdout() as stdout, - support.swap_attr(sys, 'argv', ['setup.py', 'build_ext'])): + if capture_stdout: + stdout = support.captured_stdout() + else: + print() + stdout = contextlib.nullcontext() + with (stdout, + support.swap_attr(sys, 'argv', ['setup.py', 'build_ext', '--verbose'])): setup(name="_testcppext", ext_modules=[cpp_ext]) return except: - # Show output on error - print() - print(stdout.getvalue()) + if capture_stdout: + # Show output on error + print() + print(stdout.getvalue()) raise except SystemExit: self.fail("Build failed") From webhook-mailer at python.org Mon May 2 11:08:48 2022 From: webhook-mailer at python.org (miss-islington) Date: Mon, 02 May 2022 15:08:48 -0000 Subject: [Python-checkins] gh-85133: os docs: Add that getenv uses os.environ (GH-91874) Message-ID: https://github.com/python/cpython/commit/5a0f3ae22f8e56fe2e149a73329bd4bcc8987eda commit: 5a0f3ae22f8e56fe2e149a73329bd4bcc8987eda branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-02T08:08:40-07:00 summary: gh-85133: os docs: Add that getenv uses os.environ (GH-91874) Co-authored-by: Jelle Zijlstra (cherry picked from commit b25352a5c039d95e019dd8ca111f6f77c43ca1f7) Co-authored-by: slateny <46876382+slateny at users.noreply.github.com> files: M Doc/library/os.rst diff --git a/Doc/library/os.rst b/Doc/library/os.rst index f8985a1f3ab9d..35a7e1e96d346 100644 --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -109,8 +109,8 @@ process and user. This mapping is captured the first time the :mod:`os` module is imported, typically during Python startup as part of processing :file:`site.py`. Changes - to the environment made after this time are not reflected in ``os.environ``, - except for changes made by modifying ``os.environ`` directly. + to the environment made after this time are not reflected in :data:`os.environ`, + except for changes made by modifying :data:`os.environ` directly. This mapping may be used to modify the environment as well as query the environment. :func:`putenv` will be called automatically when the mapping @@ -122,8 +122,8 @@ process and user. .. note:: - Calling :func:`putenv` directly does not change ``os.environ``, so it's better - to modify ``os.environ``. + Calling :func:`putenv` directly does not change :data:`os.environ`, so it's better + to modify :data:`os.environ`. .. note:: @@ -133,7 +133,7 @@ process and user. You can delete items in this mapping to unset environment variables. :func:`unsetenv` will be called automatically when an item is deleted from - ``os.environ``, and when one of the :meth:`pop` or :meth:`clear` methods is + :data:`os.environ`, and when one of the :meth:`pop` or :meth:`clear` methods is called. .. versionchanged:: 3.9 @@ -224,7 +224,10 @@ process and user. .. function:: getenv(key, default=None) Return the value of the environment variable *key* if it exists, or - *default* if it doesn't. *key*, *default* and the result are str. + *default* if it doesn't. *key*, *default* and the result are str. Note that + since :func:`getenv` uses :data:`os.environ`, the mapping of :func:`getenv` is + similarly also captured on import, and the function may not reflect + future environment changes. On Unix, keys and values are decoded with :func:`sys.getfilesystemencoding` and ``'surrogateescape'`` error handler. Use :func:`os.getenvb` if you @@ -236,7 +239,11 @@ process and user. .. function:: getenvb(key, default=None) Return the value of the environment variable *key* if it exists, or - *default* if it doesn't. *key*, *default* and the result are bytes. + *default* if it doesn't. *key*, *default* and the result are bytes. Note that + since :func:`getenvb` uses :data:`os.environb`, the mapping of :func:`getenvb` is + similarly also captured on import, and the function may not reflect + future environment changes. + :func:`getenvb` is only available if :data:`supports_bytes_environ` is ``True``. @@ -443,10 +450,11 @@ process and user. changes to the environment affect subprocesses started with :func:`os.system`, :func:`popen` or :func:`fork` and :func:`execv`. - Assignments to items in ``os.environ`` are automatically translated into + Assignments to items in :data:`os.environ` are automatically translated into corresponding calls to :func:`putenv`; however, calls to :func:`putenv` - don't update ``os.environ``, so it is actually preferable to assign to items - of ``os.environ``. + don't update :data:`os.environ`, so it is actually preferable to assign to items + of :data:`os.environ`. This also applies to :func:`getenv` and :func:`getenvb`, which + respectively use :data:`os.environ` and :data:`os.environb` in their implementations. .. note:: @@ -645,10 +653,10 @@ process and user. environment affect subprocesses started with :func:`os.system`, :func:`popen` or :func:`fork` and :func:`execv`. - Deletion of items in ``os.environ`` is automatically translated into a + Deletion of items in :data:`os.environ` is automatically translated into a corresponding call to :func:`unsetenv`; however, calls to :func:`unsetenv` - don't update ``os.environ``, so it is actually preferable to delete items of - ``os.environ``. + don't update :data:`os.environ`, so it is actually preferable to delete items of + :data:`os.environ`. .. audit-event:: os.unsetenv key os.unsetenv From webhook-mailer at python.org Mon May 2 11:10:08 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Mon, 02 May 2022 15:10:08 -0000 Subject: [Python-checkins] gh-92128: Add `__class_getitem__` to `logging.LoggerAdapter` and `logging.StreamHandler` (#92129) Message-ID: https://github.com/python/cpython/commit/ab616d323dbc473f8d5563b596e882ed3ccdf77b commit: ab616d323dbc473f8d5563b596e882ed3ccdf77b branch: main author: Alex Waygood committer: JelleZijlstra date: 2022-05-02T09:10:02-06:00 summary: gh-92128: Add `__class_getitem__` to `logging.LoggerAdapter` and `logging.StreamHandler` (#92129) Closes #92128 files: A Misc/NEWS.d/next/Library/2022-05-01-21-45-41.gh-issue-92128.Di7VbE.rst M Lib/logging/__init__.py M Lib/test/test_genericalias.py diff --git a/Lib/logging/__init__.py b/Lib/logging/__init__.py index d6315b047334e..432fefcb5b314 100644 --- a/Lib/logging/__init__.py +++ b/Lib/logging/__init__.py @@ -25,6 +25,7 @@ import sys, os, time, io, re, traceback, warnings, weakref, collections.abc +from types import GenericAlias from string import Template from string import Formatter as StrFormatter @@ -1145,6 +1146,8 @@ def __repr__(self): name += ' ' return '<%s %s(%s)>' % (self.__class__.__name__, name, level) + __class_getitem__ = classmethod(GenericAlias) + class FileHandler(StreamHandler): """ @@ -1939,6 +1942,8 @@ def __repr__(self): level = getLevelName(logger.getEffectiveLevel()) return '<%s %s (%s)>' % (self.__class__.__name__, logger.name, level) + __class_getitem__ = classmethod(GenericAlias) + root = RootLogger(WARNING) Logger.root = root Logger.manager = Manager(Logger.root) diff --git a/Lib/test/test_genericalias.py b/Lib/test/test_genericalias.py index bf96ba065fbb0..635ac0f7a85d7 100644 --- a/Lib/test/test_genericalias.py +++ b/Lib/test/test_genericalias.py @@ -14,6 +14,7 @@ from dataclasses import Field from functools import partial, partialmethod, cached_property from graphlib import TopologicalSorter +from logging import LoggerAdapter, StreamHandler from mailbox import Mailbox, _PartialFile try: import ctypes @@ -113,6 +114,7 @@ class BaseTest(unittest.TestCase): MappingProxyType, AsyncGeneratorType, DirEntry, chain, + LoggerAdapter, StreamHandler, TemporaryDirectory, SpooledTemporaryFile, Queue, SimpleQueue, _AssertRaisesContext, diff --git a/Misc/NEWS.d/next/Library/2022-05-01-21-45-41.gh-issue-92128.Di7VbE.rst b/Misc/NEWS.d/next/Library/2022-05-01-21-45-41.gh-issue-92128.Di7VbE.rst new file mode 100644 index 0000000000000..e4d62d221d8a0 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-05-01-21-45-41.gh-issue-92128.Di7VbE.rst @@ -0,0 +1,3 @@ +Add :meth:`~object.__class_getitem__` to :class:`logging.LoggerAdapter` and +:class:`logging.StreamHandler`, allowing them to be parameterized at runtime. +Patch by Alex Waygood. From webhook-mailer at python.org Mon May 2 11:11:14 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Mon, 02 May 2022 15:11:14 -0000 Subject: [Python-checkins] gh-88546: glob.glob docs: Make new paragraph for emphasis and reordered sentence (#91614) Message-ID: https://github.com/python/cpython/commit/b9ab6cea0819bd498063f0934cb5bb0bb5a6a2d4 commit: b9ab6cea0819bd498063f0934cb5bb0bb5a6a2d4 branch: main author: slateny <46876382+slateny at users.noreply.github.com> committer: JelleZijlstra date: 2022-05-02T09:11:05-06:00 summary: gh-88546: glob.glob docs: Make new paragraph for emphasis and reordered sentence (#91614) files: M Doc/library/glob.rst diff --git a/Doc/library/glob.rst b/Doc/library/glob.rst index 54621d1d12bb5..01ad67732cf2e 100644 --- a/Doc/library/glob.rst +++ b/Doc/library/glob.rst @@ -23,8 +23,11 @@ according to the rules used by the Unix shell, although results are returned in arbitrary order. No tilde expansion is done, but ``*``, ``?``, and character ranges expressed with ``[]`` will be correctly matched. This is done by using the :func:`os.scandir` and :func:`fnmatch.fnmatch` functions in concert, and -not by actually invoking a subshell. Note that unlike :func:`fnmatch.fnmatch`, -:mod:`glob` treats filenames beginning with a dot (``.``) as special cases. +not by actually invoking a subshell. + +Note that files beginning with a dot (``.``) can only be matched by +patterns that also start with a dot, +unlike :func:`fnmatch.fnmatch` or :func:`pathlib.Path.glob`. (For tilde and shell variable expansion, use :func:`os.path.expanduser` and :func:`os.path.expandvars`.) From webhook-mailer at python.org Mon May 2 11:18:10 2022 From: webhook-mailer at python.org (miss-islington) Date: Mon, 02 May 2022 15:18:10 -0000 Subject: [Python-checkins] asyncio.subprocess: Fix a typo in doc (GH-92030) Message-ID: https://github.com/python/cpython/commit/9941640041ef528dc6565ae7b2d1d26efdf8d19e commit: 9941640041ef528dc6565ae7b2d1d26efdf8d19e branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-02T08:18:01-07:00 summary: asyncio.subprocess: Fix a typo in doc (GH-92030) Remove a confusion for read method in asyncio-subprocess doc for stderr StreamReader instance (cherry picked from commit bb857a96ef368ba9de1da2db12b1a1f1870606ac) Co-authored-by: Harsh <65716674+Harsh-br0 at users.noreply.github.com> files: M Doc/library/asyncio-subprocess.rst diff --git a/Doc/library/asyncio-subprocess.rst b/Doc/library/asyncio-subprocess.rst index 748b704032554..e5000532a895d 100644 --- a/Doc/library/asyncio-subprocess.rst +++ b/Doc/library/asyncio-subprocess.rst @@ -275,7 +275,7 @@ their completion. Use the :meth:`communicate` method rather than :attr:`process.stdin.write() `, :attr:`await process.stdout.read() ` or - :attr:`await process.stderr.read `. + :attr:`await process.stderr.read() `. This avoids deadlocks due to streams pausing reading or writing and blocking the child process. From webhook-mailer at python.org Mon May 2 11:20:17 2022 From: webhook-mailer at python.org (miss-islington) Date: Mon, 02 May 2022 15:20:17 -0000 Subject: [Python-checkins] Fix typo in Programming FAQ (GH-92083) Message-ID: https://github.com/python/cpython/commit/090a0f6ffbde8f9e4d7bb57b29da140c6d4c8db3 commit: 090a0f6ffbde8f9e4d7bb57b29da140c6d4c8db3 branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-02T08:20:09-07:00 summary: Fix typo in Programming FAQ (GH-92083) I believe the word "with" was missing here. (cherry picked from commit 2a7efa324274a54fe0e5480cae1438d8294b9ec3) Co-authored-by: Matt Harding files: M Doc/faq/programming.rst diff --git a/Doc/faq/programming.rst b/Doc/faq/programming.rst index 3cf041e1a4230..c2656382aad78 100644 --- a/Doc/faq/programming.rst +++ b/Doc/faq/programming.rst @@ -78,7 +78,7 @@ set of modules required by a program and bind these modules together with a Python binary to produce a single executable. One is to use the freeze tool, which is included in the Python source tree as -``Tools/freeze``. It converts Python byte code to C arrays; a C compiler you can +``Tools/freeze``. It converts Python byte code to C arrays; with a C compiler you can embed all your modules into a new program, which is then linked with the standard Python modules. From webhook-mailer at python.org Mon May 2 11:20:29 2022 From: webhook-mailer at python.org (miss-islington) Date: Mon, 02 May 2022 15:20:29 -0000 Subject: [Python-checkins] asyncio.subprocess: Fix a typo in doc (GH-92030) Message-ID: https://github.com/python/cpython/commit/0c011cc6c2a7629b8120ec26d7776713c096e69c commit: 0c011cc6c2a7629b8120ec26d7776713c096e69c branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-02T08:20:25-07:00 summary: asyncio.subprocess: Fix a typo in doc (GH-92030) Remove a confusion for read method in asyncio-subprocess doc for stderr StreamReader instance (cherry picked from commit bb857a96ef368ba9de1da2db12b1a1f1870606ac) Co-authored-by: Harsh <65716674+Harsh-br0 at users.noreply.github.com> files: M Doc/library/asyncio-subprocess.rst diff --git a/Doc/library/asyncio-subprocess.rst b/Doc/library/asyncio-subprocess.rst index 6ba24249f28d8..fbe68f78a2f9b 100644 --- a/Doc/library/asyncio-subprocess.rst +++ b/Doc/library/asyncio-subprocess.rst @@ -278,7 +278,7 @@ their completion. Use the :meth:`communicate` method rather than :attr:`process.stdin.write() `, :attr:`await process.stdout.read() ` or - :attr:`await process.stderr.read `. + :attr:`await process.stderr.read() `. This avoids deadlocks due to streams pausing reading or writing and blocking the child process. From webhook-mailer at python.org Mon May 2 11:34:01 2022 From: webhook-mailer at python.org (miss-islington) Date: Mon, 02 May 2022 15:34:01 -0000 Subject: [Python-checkins] gh-88546: glob.glob docs: Make new paragraph for emphasis and reordered sentence (GH-91614) Message-ID: https://github.com/python/cpython/commit/9b7cdfdf357fa819fd47f0ebe1c0e2010a5d4e31 commit: 9b7cdfdf357fa819fd47f0ebe1c0e2010a5d4e31 branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-02T08:33:39-07:00 summary: gh-88546: glob.glob docs: Make new paragraph for emphasis and reordered sentence (GH-91614) (cherry picked from commit b9ab6cea0819bd498063f0934cb5bb0bb5a6a2d4) Co-authored-by: slateny <46876382+slateny at users.noreply.github.com> files: M Doc/library/glob.rst diff --git a/Doc/library/glob.rst b/Doc/library/glob.rst index 3c468ebf73769..ced84c7fd8d11 100644 --- a/Doc/library/glob.rst +++ b/Doc/library/glob.rst @@ -23,8 +23,11 @@ according to the rules used by the Unix shell, although results are returned in arbitrary order. No tilde expansion is done, but ``*``, ``?``, and character ranges expressed with ``[]`` will be correctly matched. This is done by using the :func:`os.scandir` and :func:`fnmatch.fnmatch` functions in concert, and -not by actually invoking a subshell. Note that unlike :func:`fnmatch.fnmatch`, -:mod:`glob` treats filenames beginning with a dot (``.``) as special cases. +not by actually invoking a subshell. + +Note that files beginning with a dot (``.``) can only be matched by +patterns that also start with a dot, +unlike :func:`fnmatch.fnmatch` or :func:`pathlib.Path.glob`. (For tilde and shell variable expansion, use :func:`os.path.expanduser` and :func:`os.path.expandvars`.) From webhook-mailer at python.org Mon May 2 11:35:49 2022 From: webhook-mailer at python.org (miss-islington) Date: Mon, 02 May 2022 15:35:49 -0000 Subject: [Python-checkins] gh-88546: glob.glob docs: Make new paragraph for emphasis and reordered sentence (GH-91614) Message-ID: https://github.com/python/cpython/commit/446cc037304e55e94c2e7492533f7b396c9c0e35 commit: 446cc037304e55e94c2e7492533f7b396c9c0e35 branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-02T08:35:37-07:00 summary: gh-88546: glob.glob docs: Make new paragraph for emphasis and reordered sentence (GH-91614) (cherry picked from commit b9ab6cea0819bd498063f0934cb5bb0bb5a6a2d4) Co-authored-by: slateny <46876382+slateny at users.noreply.github.com> files: M Doc/library/glob.rst diff --git a/Doc/library/glob.rst b/Doc/library/glob.rst index 215f60d328c76..4a290473d8924 100644 --- a/Doc/library/glob.rst +++ b/Doc/library/glob.rst @@ -23,8 +23,11 @@ according to the rules used by the Unix shell, although results are returned in arbitrary order. No tilde expansion is done, but ``*``, ``?``, and character ranges expressed with ``[]`` will be correctly matched. This is done by using the :func:`os.scandir` and :func:`fnmatch.fnmatch` functions in concert, and -not by actually invoking a subshell. Note that unlike :func:`fnmatch.fnmatch`, -:mod:`glob` treats filenames beginning with a dot (``.``) as special cases. +not by actually invoking a subshell. + +Note that files beginning with a dot (``.``) can only be matched by +patterns that also start with a dot, +unlike :func:`fnmatch.fnmatch` or :func:`pathlib.Path.glob`. (For tilde and shell variable expansion, use :func:`os.path.expanduser` and :func:`os.path.expandvars`.) From webhook-mailer at python.org Mon May 2 11:51:26 2022 From: webhook-mailer at python.org (iritkatriel) Date: Mon, 02 May 2022 15:51:26 -0000 Subject: [Python-checkins] gh-91276: revert the increase of dis output width (GH-92126) Message-ID: https://github.com/python/cpython/commit/84b986ba10d704394aa36955b00e6106ca25e8ba commit: 84b986ba10d704394aa36955b00e6106ca25e8ba branch: main author: Irit Katriel <1055913+iritkatriel at users.noreply.github.com> committer: iritkatriel <1055913+iritkatriel at users.noreply.github.com> date: 2022-05-02T16:51:17+01:00 summary: gh-91276: revert the increase of dis output width (GH-92126) files: M Lib/dis.py M Lib/test/test_dis.py diff --git a/Lib/dis.py b/Lib/dis.py index 205e9d8d193f3..c0e5367afb55a 100644 --- a/Lib/dis.py +++ b/Lib/dis.py @@ -264,7 +264,7 @@ def show_code(co, *, file=None): _ExceptionTableEntry = collections.namedtuple("_ExceptionTableEntry", "start end target depth lasti") -_OPNAME_WIDTH = max(map(len, opmap)) +_OPNAME_WIDTH = 20 _OPARG_WIDTH = 5 class Instruction(_Instruction): diff --git a/Lib/test/test_dis.py b/Lib/test/test_dis.py index 0bd589d5cfb6f..b8d1c542bae90 100644 --- a/Lib/test/test_dis.py +++ b/Lib/test/test_dis.py @@ -41,48 +41,48 @@ def cm(cls, x): cls.x = x == 1 dis_c_instance_method = """\ -%3d RESUME 0 - -%3d LOAD_FAST 1 (x) - LOAD_CONST 1 (1) - COMPARE_OP 2 (==) - LOAD_FAST 0 (self) - STORE_ATTR 0 (x) - LOAD_CONST 0 (None) +%3d RESUME 0 + +%3d LOAD_FAST 1 (x) + LOAD_CONST 1 (1) + COMPARE_OP 2 (==) + LOAD_FAST 0 (self) + STORE_ATTR 0 (x) + LOAD_CONST 0 (None) RETURN_VALUE """ % (_C.__init__.__code__.co_firstlineno, _C.__init__.__code__.co_firstlineno + 1,) dis_c_instance_method_bytes = """\ - RESUME 0 - LOAD_FAST 1 - LOAD_CONST 1 - COMPARE_OP 2 (==) - LOAD_FAST 0 - STORE_ATTR 0 - LOAD_CONST 0 + RESUME 0 + LOAD_FAST 1 + LOAD_CONST 1 + COMPARE_OP 2 (==) + LOAD_FAST 0 + STORE_ATTR 0 + LOAD_CONST 0 RETURN_VALUE """ dis_c_class_method = """\ -%3d RESUME 0 - -%3d LOAD_FAST 1 (x) - LOAD_CONST 1 (1) - COMPARE_OP 2 (==) - LOAD_FAST 0 (cls) - STORE_ATTR 0 (x) - LOAD_CONST 0 (None) +%3d RESUME 0 + +%3d LOAD_FAST 1 (x) + LOAD_CONST 1 (1) + COMPARE_OP 2 (==) + LOAD_FAST 0 (cls) + STORE_ATTR 0 (x) + LOAD_CONST 0 (None) RETURN_VALUE """ % (_C.cm.__code__.co_firstlineno, _C.cm.__code__.co_firstlineno + 2,) dis_c_static_method = """\ -%3d RESUME 0 +%3d RESUME 0 -%3d LOAD_FAST 0 (x) - LOAD_CONST 1 (1) - COMPARE_OP 2 (==) - STORE_FAST 0 (x) - LOAD_CONST 0 (None) +%3d LOAD_FAST 0 (x) + LOAD_CONST 1 (1) + COMPARE_OP 2 (==) + STORE_FAST 0 (x) + LOAD_CONST 0 (None) RETURN_VALUE """ % (_C.sm.__code__.co_firstlineno, _C.sm.__code__.co_firstlineno + 2,) @@ -103,15 +103,15 @@ def _f(a): return 1 dis_f = """\ -%3d RESUME 0 +%3d RESUME 0 -%3d LOAD_GLOBAL 1 (NULL + print) - LOAD_FAST 0 (a) - PRECALL 1 - CALL 1 +%3d LOAD_GLOBAL 1 (NULL + print) + LOAD_FAST 0 (a) + PRECALL 1 + CALL 1 POP_TOP -%3d LOAD_CONST 1 (1) +%3d LOAD_CONST 1 (1) RETURN_VALUE """ % (_f.__code__.co_firstlineno, _f.__code__.co_firstlineno + 1, @@ -119,13 +119,13 @@ def _f(a): dis_f_co_code = """\ - RESUME 0 - LOAD_GLOBAL 1 - LOAD_FAST 0 - PRECALL 1 - CALL 1 + RESUME 0 + LOAD_GLOBAL 1 + LOAD_FAST 0 + PRECALL 1 + CALL 1 POP_TOP - LOAD_CONST 1 + LOAD_CONST 1 RETURN_VALUE """ @@ -136,22 +136,22 @@ def bug708901(): pass dis_bug708901 = """\ -%3d RESUME 0 +%3d RESUME 0 -%3d LOAD_GLOBAL 1 (NULL + range) - LOAD_CONST 1 (1) +%3d LOAD_GLOBAL 1 (NULL + range) + LOAD_CONST 1 (1) -%3d LOAD_CONST 2 (10) +%3d LOAD_CONST 2 (10) -%3d PRECALL 2 - CALL 2 +%3d PRECALL 2 + CALL 2 GET_ITER - >> FOR_ITER 2 (to 40) - STORE_FAST 0 (res) + >> FOR_ITER 2 (to 40) + STORE_FAST 0 (res) -%3d JUMP_BACKWARD 3 (to 34) +%3d JUMP_BACKWARD 3 (to 34) -%3d >> LOAD_CONST 0 (None) +%3d >> LOAD_CONST 0 (None) RETURN_VALUE """ % (bug708901.__code__.co_firstlineno, bug708901.__code__.co_firstlineno + 1, @@ -167,22 +167,22 @@ def bug1333982(x=[]): pass dis_bug1333982 = """\ -%3d RESUME 0 +%3d RESUME 0 %3d LOAD_ASSERTION_ERROR - LOAD_CONST 2 ( at 0x..., file "%s", line %d>) - MAKE_FUNCTION 0 - LOAD_FAST 0 (x) + LOAD_CONST 2 ( at 0x..., file "%s", line %d>) + MAKE_FUNCTION 0 + LOAD_FAST 0 (x) GET_ITER - PRECALL 0 - CALL 0 + PRECALL 0 + CALL 0 -%3d LOAD_CONST 3 (1) +%3d LOAD_CONST 3 (1) -%3d BINARY_OP 0 (+) - PRECALL 0 - CALL 0 - RAISE_VARARGS 1 +%3d BINARY_OP 0 (+) + PRECALL 0 + CALL 0 + RAISE_VARARGS 1 """ % (bug1333982.__code__.co_firstlineno, bug1333982.__code__.co_firstlineno + 1, __file__, @@ -200,8 +200,8 @@ def bug42562(): dis_bug42562 = """\ - RESUME 0 - LOAD_CONST 0 (None) + RESUME 0 + LOAD_CONST 0 (None) RETURN_VALUE """ @@ -215,10 +215,10 @@ def bug42562(): ]) dis_bug_45757 = """\ - EXTENDED_ARG 1 + EXTENDED_ARG 1 NOP - EXTENDED_ARG 1 - LOAD_CONST 297 + EXTENDED_ARG 1 + LOAD_CONST 297 RETURN_VALUE """ @@ -232,39 +232,39 @@ def bug42562(): dis_bug46724 = """\ - >> EXTENDED_ARG 255 - EXTENDED_ARG 65535 - EXTENDED_ARG 16777215 - JUMP_FORWARD -4 (to 0) + >> EXTENDED_ARG 255 + EXTENDED_ARG 65535 + EXTENDED_ARG 16777215 + JUMP_FORWARD -4 (to 0) """ _BIG_LINENO_FORMAT = """\ - 1 RESUME 0 + 1 RESUME 0 -%3d LOAD_GLOBAL 0 (spam) +%3d LOAD_GLOBAL 0 (spam) POP_TOP - LOAD_CONST 0 (None) + LOAD_CONST 0 (None) RETURN_VALUE """ _BIG_LINENO_FORMAT2 = """\ - 1 RESUME 0 + 1 RESUME 0 -%4d LOAD_GLOBAL 0 (spam) +%4d LOAD_GLOBAL 0 (spam) POP_TOP - LOAD_CONST 0 (None) + LOAD_CONST 0 (None) RETURN_VALUE """ dis_module_expected_results = """\ Disassembly of f: - 4 RESUME 0 - LOAD_CONST 0 (None) + 4 RESUME 0 + LOAD_CONST 0 (None) RETURN_VALUE Disassembly of g: - 5 RESUME 0 - LOAD_CONST 0 (None) + 5 RESUME 0 + LOAD_CONST 0 (None) RETURN_VALUE """ @@ -272,24 +272,24 @@ def bug42562(): expr_str = "x + 1" dis_expr_str = """\ - RESUME 0 + RESUME 0 - 1 LOAD_NAME 0 (x) - LOAD_CONST 0 (1) - BINARY_OP 0 (+) + 1 LOAD_NAME 0 (x) + LOAD_CONST 0 (1) + BINARY_OP 0 (+) RETURN_VALUE """ simple_stmt_str = "x = x + 1" dis_simple_stmt_str = """\ - RESUME 0 + RESUME 0 - 1 LOAD_NAME 0 (x) - LOAD_CONST 0 (1) - BINARY_OP 0 (+) - STORE_NAME 0 (x) - LOAD_CONST 1 (None) + 1 LOAD_NAME 0 (x) + LOAD_CONST 0 (1) + BINARY_OP 0 (+) + STORE_NAME 0 (x) + LOAD_CONST 1 (None) RETURN_VALUE """ @@ -302,36 +302,36 @@ def bug42562(): # leading newline is for a reason (tests lineno) dis_annot_stmt_str = """\ - RESUME 0 + RESUME 0 2 SETUP_ANNOTATIONS - LOAD_CONST 0 (1) - STORE_NAME 0 (x) - LOAD_NAME 1 (int) - LOAD_NAME 2 (__annotations__) - LOAD_CONST 1 ('x') + LOAD_CONST 0 (1) + STORE_NAME 0 (x) + LOAD_NAME 1 (int) + LOAD_NAME 2 (__annotations__) + LOAD_CONST 1 ('x') STORE_SUBSCR 3 PUSH_NULL - LOAD_NAME 3 (fun) - LOAD_CONST 0 (1) - PRECALL 1 - CALL 1 - LOAD_NAME 2 (__annotations__) - LOAD_CONST 2 ('y') + LOAD_NAME 3 (fun) + LOAD_CONST 0 (1) + PRECALL 1 + CALL 1 + LOAD_NAME 2 (__annotations__) + LOAD_CONST 2 ('y') STORE_SUBSCR - 4 LOAD_CONST 0 (1) - LOAD_NAME 4 (lst) + 4 LOAD_CONST 0 (1) + LOAD_NAME 4 (lst) PUSH_NULL - LOAD_NAME 3 (fun) - LOAD_CONST 3 (0) - PRECALL 1 - CALL 1 + LOAD_NAME 3 (fun) + LOAD_CONST 3 (0) + PRECALL 1 + CALL 1 STORE_SUBSCR - LOAD_NAME 1 (int) + LOAD_NAME 1 (int) POP_TOP - LOAD_CONST 4 (None) + LOAD_CONST 4 (None) RETURN_VALUE """ @@ -342,59 +342,59 @@ def bug42562(): # Trailing newline has been deliberately omitted dis_compound_stmt_str = """\ - RESUME 0 + RESUME 0 - 1 LOAD_CONST 0 (0) - STORE_NAME 0 (x) + 1 LOAD_CONST 0 (0) + STORE_NAME 0 (x) 2 NOP - 3 >> LOAD_NAME 0 (x) - LOAD_CONST 1 (1) - BINARY_OP 13 (+=) - STORE_NAME 0 (x) + 3 >> LOAD_NAME 0 (x) + LOAD_CONST 1 (1) + BINARY_OP 13 (+=) + STORE_NAME 0 (x) - 2 JUMP_BACKWARD 6 (to 8) + 2 JUMP_BACKWARD 6 (to 8) """ dis_traceback = """\ -%3d RESUME 0 +%3d RESUME 0 %3d NOP -%3d LOAD_CONST 1 (1) - LOAD_CONST 2 (0) - --> BINARY_OP 11 (/) +%3d LOAD_CONST 1 (1) + LOAD_CONST 2 (0) + --> BINARY_OP 11 (/) POP_TOP -%3d LOAD_FAST 1 (tb) +%3d LOAD_FAST 1 (tb) RETURN_VALUE >> PUSH_EXC_INFO -%3d LOAD_GLOBAL 0 (Exception) +%3d LOAD_GLOBAL 0 (Exception) CHECK_EXC_MATCH - POP_JUMP_FORWARD_IF_FALSE 18 (to 72) - STORE_FAST 0 (e) + POP_JUMP_FORWARD_IF_FALSE 18 (to 72) + STORE_FAST 0 (e) -%3d LOAD_FAST 0 (e) - LOAD_ATTR 1 (__traceback__) - STORE_FAST 1 (tb) +%3d LOAD_FAST 0 (e) + LOAD_ATTR 1 (__traceback__) + STORE_FAST 1 (tb) POP_EXCEPT - LOAD_CONST 0 (None) - STORE_FAST 0 (e) - DELETE_FAST 0 (e) + LOAD_CONST 0 (None) + STORE_FAST 0 (e) + DELETE_FAST 0 (e) -%3d LOAD_FAST 1 (tb) +%3d LOAD_FAST 1 (tb) RETURN_VALUE - >> LOAD_CONST 0 (None) - STORE_FAST 0 (e) - DELETE_FAST 0 (e) - RERAISE 1 + >> LOAD_CONST 0 (None) + STORE_FAST 0 (e) + DELETE_FAST 0 (e) + RERAISE 1 -%3d >> RERAISE 0 - >> COPY 3 +%3d >> RERAISE 0 + >> COPY 3 POP_EXCEPT - RERAISE 1 + RERAISE 1 ExceptionTable: """ % (TRACEBACK_CODE.co_firstlineno, TRACEBACK_CODE.co_firstlineno + 1, @@ -409,22 +409,22 @@ def _fstring(a, b, c, d): return f'{a} {b:4} {c!r} {d!r:4}' dis_fstring = """\ -%3d RESUME 0 - -%3d LOAD_FAST 0 (a) - FORMAT_VALUE 0 - LOAD_CONST 1 (' ') - LOAD_FAST 1 (b) - LOAD_CONST 2 ('4') - FORMAT_VALUE 4 (with format) - LOAD_CONST 1 (' ') - LOAD_FAST 2 (c) - FORMAT_VALUE 2 (repr) - LOAD_CONST 1 (' ') - LOAD_FAST 3 (d) - LOAD_CONST 2 ('4') - FORMAT_VALUE 6 (repr, with format) - BUILD_STRING 7 +%3d RESUME 0 + +%3d LOAD_FAST 0 (a) + FORMAT_VALUE 0 + LOAD_CONST 1 (' ') + LOAD_FAST 1 (b) + LOAD_CONST 2 ('4') + FORMAT_VALUE 4 (with format) + LOAD_CONST 1 (' ') + LOAD_FAST 2 (c) + FORMAT_VALUE 2 (repr) + LOAD_CONST 1 (' ') + LOAD_FAST 3 (d) + LOAD_CONST 2 ('4') + FORMAT_VALUE 6 (repr, with format) + BUILD_STRING 7 RETURN_VALUE """ % (_fstring.__code__.co_firstlineno, _fstring.__code__.co_firstlineno + 1) @@ -441,28 +441,28 @@ def _tryfinallyconst(b): b() dis_tryfinally = """\ -%3d RESUME 0 +%3d RESUME 0 %3d NOP -%3d LOAD_FAST 0 (a) +%3d LOAD_FAST 0 (a) %3d PUSH_NULL - LOAD_FAST 1 (b) - PRECALL 0 - CALL 0 + LOAD_FAST 1 (b) + PRECALL 0 + CALL 0 POP_TOP RETURN_VALUE >> PUSH_EXC_INFO PUSH_NULL - LOAD_FAST 1 (b) - PRECALL 0 - CALL 0 + LOAD_FAST 1 (b) + PRECALL 0 + CALL 0 POP_TOP - RERAISE 0 - >> COPY 3 + RERAISE 0 + >> COPY 3 POP_EXCEPT - RERAISE 1 + RERAISE 1 ExceptionTable: """ % (_tryfinally.__code__.co_firstlineno, _tryfinally.__code__.co_firstlineno + 1, @@ -471,29 +471,29 @@ def _tryfinallyconst(b): ) dis_tryfinallyconst = """\ -%3d RESUME 0 +%3d RESUME 0 %3d NOP %3d NOP %3d PUSH_NULL - LOAD_FAST 0 (b) - PRECALL 0 - CALL 0 + LOAD_FAST 0 (b) + PRECALL 0 + CALL 0 POP_TOP - LOAD_CONST 1 (1) + LOAD_CONST 1 (1) RETURN_VALUE PUSH_EXC_INFO PUSH_NULL - LOAD_FAST 0 (b) - PRECALL 0 - CALL 0 + LOAD_FAST 0 (b) + PRECALL 0 + CALL 0 POP_TOP - RERAISE 0 - >> COPY 3 + RERAISE 0 + >> COPY 3 POP_EXCEPT - RERAISE 1 + RERAISE 1 ExceptionTable: """ % (_tryfinallyconst.__code__.co_firstlineno, _tryfinallyconst.__code__.co_firstlineno + 1, @@ -518,17 +518,17 @@ def foo(x): return foo dis_nested_0 = """\ - MAKE_CELL 0 (y) + MAKE_CELL 0 (y) -%3d RESUME 0 +%3d RESUME 0 -%3d LOAD_CLOSURE 0 (y) - BUILD_TUPLE 1 - LOAD_CONST 1 () - MAKE_FUNCTION 8 (closure) - STORE_FAST 1 (foo) +%3d LOAD_CLOSURE 0 (y) + BUILD_TUPLE 1 + LOAD_CONST 1 () + MAKE_FUNCTION 8 (closure) + STORE_FAST 1 (foo) -%3d LOAD_FAST 1 (foo) +%3d LOAD_FAST 1 (foo) RETURN_VALUE """ % (_h.__code__.co_firstlineno, _h.__code__.co_firstlineno + 1, @@ -539,19 +539,19 @@ def foo(x): dis_nested_1 = """%s Disassembly of : - COPY_FREE_VARS 1 - MAKE_CELL 0 (x) + COPY_FREE_VARS 1 + MAKE_CELL 0 (x) -%3d RESUME 0 +%3d RESUME 0 -%3d LOAD_CLOSURE 0 (x) - BUILD_TUPLE 1 - LOAD_CONST 1 ( at 0x..., file "%s", line %d>) - MAKE_FUNCTION 8 (closure) - LOAD_DEREF 1 (y) +%3d LOAD_CLOSURE 0 (x) + BUILD_TUPLE 1 + LOAD_CONST 1 ( at 0x..., file "%s", line %d>) + MAKE_FUNCTION 8 (closure) + LOAD_DEREF 1 (y) GET_ITER - PRECALL 0 - CALL 0 + PRECALL 0 + CALL 0 RETURN_VALUE """ % (dis_nested_0, __file__, @@ -564,18 +564,18 @@ def foo(x): dis_nested_2 = """%s Disassembly of at 0x..., file "%s", line %d>: - COPY_FREE_VARS 1 - -%3d RESUME 0 - BUILD_LIST 0 - LOAD_FAST 0 (.0) - >> FOR_ITER 7 (to 24) - STORE_FAST 1 (z) - LOAD_DEREF 2 (x) - LOAD_FAST 1 (z) - BINARY_OP 0 (+) - LIST_APPEND 2 - JUMP_BACKWARD 8 (to 8) + COPY_FREE_VARS 1 + +%3d RESUME 0 + BUILD_LIST 0 + LOAD_FAST 0 (.0) + >> FOR_ITER 7 (to 24) + STORE_FAST 1 (z) + LOAD_DEREF 2 (x) + LOAD_FAST 1 (z) + BINARY_OP 0 (+) + LIST_APPEND 2 + JUMP_BACKWARD 8 (to 8) >> RETURN_VALUE """ % (dis_nested_1, __file__, @@ -588,16 +588,16 @@ def load_test(x, y=0): return a, b dis_load_test_quickened_code = """\ -%3d 0 RESUME_QUICK 0 +%3d 0 RESUME_QUICK 0 -%3d 2 LOAD_FAST__LOAD_FAST 0 (x) - 4 LOAD_FAST 1 (y) - 6 STORE_FAST__STORE_FAST 3 (b) - 8 STORE_FAST__LOAD_FAST 2 (a) +%3d 2 LOAD_FAST__LOAD_FAST 0 (x) + 4 LOAD_FAST 1 (y) + 6 STORE_FAST__STORE_FAST 3 (b) + 8 STORE_FAST__LOAD_FAST 2 (a) -%3d 10 LOAD_FAST__LOAD_FAST 2 (a) - 12 LOAD_FAST 3 (b) - 14 BUILD_TUPLE 2 +%3d 10 LOAD_FAST__LOAD_FAST 2 (a) + 12 LOAD_FAST 3 (b) + 14 BUILD_TUPLE 2 16 RETURN_VALUE """ % (load_test.__code__.co_firstlineno, load_test.__code__.co_firstlineno + 1, @@ -608,25 +608,25 @@ def loop_test(): load_test(i) dis_loop_test_quickened_code = """\ -%3d 0 RESUME_QUICK 0 +%3d 0 RESUME_QUICK 0 -%3d 2 BUILD_LIST 0 - 4 LOAD_CONST 1 ((1, 2, 3)) - 6 LIST_EXTEND 1 - 8 LOAD_CONST 2 (3) - 10 BINARY_OP_ADAPTIVE 5 (*) +%3d 2 BUILD_LIST 0 + 4 LOAD_CONST 1 ((1, 2, 3)) + 6 LIST_EXTEND 1 + 8 LOAD_CONST 2 (3) + 10 BINARY_OP_ADAPTIVE 5 (*) 14 GET_ITER - 16 FOR_ITER 17 (to 52) - 18 STORE_FAST 0 (i) + 16 FOR_ITER 17 (to 52) + 18 STORE_FAST 0 (i) -%3d 20 LOAD_GLOBAL_MODULE 1 (NULL + load_test) - 32 LOAD_FAST 0 (i) - 34 PRECALL_PYFUNC 1 - 38 CALL_PY_WITH_DEFAULTS 1 +%3d 20 LOAD_GLOBAL_MODULE 1 (NULL + load_test) + 32 LOAD_FAST 0 (i) + 34 PRECALL_PYFUNC 1 + 38 CALL_PY_WITH_DEFAULTS 1 48 POP_TOP - 50 JUMP_BACKWARD_QUICK 18 (to 16) + 50 JUMP_BACKWARD_QUICK 18 (to 16) -%3d >> 52 LOAD_CONST 0 (None) +%3d >> 52 LOAD_CONST 0 (None) 54 RETURN_VALUE """ % (loop_test.__code__.co_firstlineno, loop_test.__code__.co_firstlineno + 1, @@ -734,7 +734,19 @@ def test_boundaries(self): self.assertEqual(dis.opmap["STORE_NAME"], dis.HAVE_ARGUMENT) def test_widths(self): + long_opcodes = set(['POP_JUMP_FORWARD_IF_FALSE', + 'POP_JUMP_FORWARD_IF_TRUE', + 'POP_JUMP_FORWARD_IF_NOT_NONE', + 'POP_JUMP_FORWARD_IF_NONE', + 'POP_JUMP_BACKWARD_IF_FALSE', + 'POP_JUMP_BACKWARD_IF_TRUE', + 'POP_JUMP_BACKWARD_IF_NOT_NONE', + 'POP_JUMP_BACKWARD_IF_NONE', + 'JUMP_BACKWARD_NO_INTERRUPT', + ]) for opcode, opname in enumerate(dis.opname): + if opname in long_opcodes: + continue with self.subTest(opname=opname): width = dis._OPNAME_WIDTH if opcode < dis.HAVE_ARGUMENT: @@ -800,19 +812,19 @@ def func(count): def expected(count, w): s = ['''\ - 1 %*d RESUME 0 + 1 %*d RESUME 0 ''' % (w, 0)] s += ['''\ - %*d LOAD_FAST 0 (x) - %*d LOAD_CONST 1 (1) - %*d BINARY_OP 0 (+) - %*d STORE_FAST 0 (x) + %*d LOAD_FAST 0 (x) + %*d LOAD_CONST 1 (1) + %*d BINARY_OP 0 (+) + %*d STORE_FAST 0 (x) ''' % (w, 10*i + 2, w, 10*i + 4, w, 10*i + 6, w, 10*i + 10) for i in range(count)] s += ['''\ - 3 %*d LOAD_FAST 0 (x) + 3 %*d LOAD_FAST 0 (x) %*d RETURN_VALUE ''' % (w, 10*count + 2, w, 10*count + 4)] s[1] = ' 2' + s[1][3:] @@ -926,28 +938,28 @@ def test_super_instructions(self): @cpython_only def test_binary_specialize(self): binary_op_quicken = """\ - 0 RESUME_QUICK 0 + 0 RESUME_QUICK 0 - 1 2 LOAD_NAME 0 (a) - 4 LOAD_NAME 1 (b) + 1 2 LOAD_NAME 0 (a) + 4 LOAD_NAME 1 (b) 6 %s 10 RETURN_VALUE """ co_int = compile('a + b', "", "eval") self.code_quicken(lambda: exec(co_int, {}, {'a': 1, 'b': 2})) got = self.get_disassembly(co_int, adaptive=True) - self.do_disassembly_compare(got, binary_op_quicken % "BINARY_OP_ADD_INT 0 (+)", True) + self.do_disassembly_compare(got, binary_op_quicken % "BINARY_OP_ADD_INT 0 (+)", True) co_unicode = compile('a + b', "", "eval") self.code_quicken(lambda: exec(co_unicode, {}, {'a': 'a', 'b': 'b'})) got = self.get_disassembly(co_unicode, adaptive=True) - self.do_disassembly_compare(got, binary_op_quicken % "BINARY_OP_ADD_UNICODE 0 (+)", True) + self.do_disassembly_compare(got, binary_op_quicken % "BINARY_OP_ADD_UNICODE 0 (+)", True) binary_subscr_quicken = """\ - 0 RESUME_QUICK 0 + 0 RESUME_QUICK 0 - 1 2 LOAD_NAME 0 (a) - 4 LOAD_CONST 0 (0) + 1 2 LOAD_NAME 0 (a) + 4 LOAD_CONST 0 (0) 6 %s 16 RETURN_VALUE """ @@ -964,10 +976,10 @@ def test_binary_specialize(self): @cpython_only def test_load_attr_specialize(self): load_attr_quicken = """\ - 0 RESUME_QUICK 0 + 0 RESUME_QUICK 0 - 1 2 LOAD_CONST 0 ('a') - 4 LOAD_ATTR_SLOT 0 (__class__) + 1 2 LOAD_CONST 0 ('a') + 4 LOAD_ATTR_SLOT 0 (__class__) 14 RETURN_VALUE """ co = compile("'a'.__class__", "", "eval") @@ -978,13 +990,13 @@ def test_load_attr_specialize(self): @cpython_only def test_call_specialize(self): call_quicken = """\ - 0 RESUME_QUICK 0 + 0 RESUME_QUICK 0 1 2 PUSH_NULL - 4 LOAD_NAME 0 (str) - 6 LOAD_CONST 0 (1) - 8 PRECALL_NO_KW_STR_1 1 - 12 CALL_ADAPTIVE 1 + 4 LOAD_NAME 0 (str) + 6 LOAD_CONST 0 (1) + 8 PRECALL_NO_KW_STR_1 1 + 12 CALL_ADAPTIVE 1 22 RETURN_VALUE """ co = compile("str(1)", "", "eval") From webhook-mailer at python.org Mon May 2 12:06:47 2022 From: webhook-mailer at python.org (miss-islington) Date: Mon, 02 May 2022 16:06:47 -0000 Subject: [Python-checkins] concurrent.futures: Fix typo in docstring (GH-92121) Message-ID: https://github.com/python/cpython/commit/ac508276dc8c9e1ac0731ec7fce3aae3a378ffd1 commit: ac508276dc8c9e1ac0731ec7fce3aae3a378ffd1 branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-02T09:06:43-07:00 summary: concurrent.futures: Fix typo in docstring (GH-92121) (cherry picked from commit b11243e85e020ed2f524bdd83c339faf11ef03d4) Co-authored-by: Yiannis Hadjicharalambous files: M Lib/concurrent/futures/_base.py diff --git a/Lib/concurrent/futures/_base.py b/Lib/concurrent/futures/_base.py index 5c00f2edbe548..cf119ac6437aa 100644 --- a/Lib/concurrent/futures/_base.py +++ b/Lib/concurrent/futures/_base.py @@ -381,7 +381,7 @@ def running(self): return self._state == RUNNING def done(self): - """Return True of the future was cancelled or finished executing.""" + """Return True if the future was cancelled or finished executing.""" with self._condition: return self._state in [CANCELLED, CANCELLED_AND_NOTIFIED, FINISHED] From webhook-mailer at python.org Mon May 2 12:07:08 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Mon, 02 May 2022 16:07:08 -0000 Subject: [Python-checkins] [3.10] build(deps): bump actions/cache from 3.0.1 to 3.0.2 (GH-92111) (#92124) Message-ID: https://github.com/python/cpython/commit/67120224473f12e62a16a6985b9864b5cc3d0aa4 commit: 67120224473f12e62a16a6985b9864b5cc3d0aa4 branch: 3.10 author: Jelle Zijlstra committer: JelleZijlstra date: 2022-05-02T10:07:03-06:00 summary: [3.10] build(deps): bump actions/cache from 3.0.1 to 3.0.2 (GH-92111) (#92124) Bumps [actions/cache](https://github.com/actions/cache) from 3.0.1 to 3.0.2. - [Release notes](https://github.com/actions/cache/releases) - [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md) - [Commits](https://github.com/actions/cache/compare/v3.0.1...v3.0.2) --- updated-dependencies: - dependency-name: actions/cache dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>. (cherry picked from commit eefe6911f4f497e8b73e0690f9b3f47904fdb02a) files: M .github/workflows/build.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index adbe2fe1d248c..61cbef982a9ef 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -196,7 +196,7 @@ jobs: echo "LD_LIBRARY_PATH=${GITHUB_WORKSPACE}/multissl/openssl/${OPENSSL_VER}/lib" >> $GITHUB_ENV - name: 'Restore OpenSSL build' id: cache-openssl - uses: actions/cache at v3.0.1 + uses: actions/cache at v3.0.2 with: path: ./multissl/openssl/${{ env.OPENSSL_VER }} key: ${{ runner.os }}-multissl-openssl-${{ env.OPENSSL_VER }} @@ -244,7 +244,7 @@ jobs: echo "LD_LIBRARY_PATH=${GITHUB_WORKSPACE}/multissl/openssl/${OPENSSL_VER}/lib" >> $GITHUB_ENV - name: 'Restore OpenSSL build' id: cache-openssl - uses: actions/cache at v3.0.1 + uses: actions/cache at v3.0.2 with: path: ./multissl/openssl/${{ env.OPENSSL_VER }} key: ${{ runner.os }}-multissl-openssl-${{ env.OPENSSL_VER }} From webhook-mailer at python.org Mon May 2 12:20:44 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Mon, 02 May 2022 16:20:44 -0000 Subject: [Python-checkins] gh-92082: contextlib docs: Change aclosing from a class to a function for consistency (#92155) Message-ID: https://github.com/python/cpython/commit/958f21c5cdb3bbbd16fec87164785cff3dacce96 commit: 958f21c5cdb3bbbd16fec87164785cff3dacce96 branch: main author: Thaddeus1499 <104600742+Thaddeus1499 at users.noreply.github.com> committer: JelleZijlstra date: 2022-05-02T10:20:30-06:00 summary: gh-92082: contextlib docs: Change aclosing from a class to a function for consistency (#92155) Signed-off-by: prwatson files: M Doc/library/contextlib.rst diff --git a/Doc/library/contextlib.rst b/Doc/library/contextlib.rst index 38134c1f14319..84c4ca098c601 100644 --- a/Doc/library/contextlib.rst +++ b/Doc/library/contextlib.rst @@ -181,7 +181,7 @@ Functions and classes provided: ``page.close()`` will be called when the :keyword:`with` block is exited. -.. class:: aclosing(thing) +.. function:: aclosing(thing) Return an async context manager that calls the ``aclose()`` method of *thing* upon completion of the block. This is basically equivalent to:: From webhook-mailer at python.org Mon May 2 12:21:18 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Mon, 02 May 2022 16:21:18 -0000 Subject: [Python-checkins] [3.10] gh-89301: Fix regression with bound values in traced SQLite statements (#92147) Message-ID: https://github.com/python/cpython/commit/178d79ae67848e129958172e8a9ca4838f8503b9 commit: 178d79ae67848e129958172e8a9ca4838f8503b9 branch: 3.10 author: Erlend Egeberg Aasland committer: JelleZijlstra date: 2022-05-02T10:21:13-06:00 summary: [3.10] gh-89301: Fix regression with bound values in traced SQLite statements (#92147) (cherry picked from commit 721aa96540bb96700f8c4bab0b4095b43491dca1) files: A Misc/NEWS.d/next/Library/2021-09-08-16-21-03.bpo-45138.yghUrK.rst M Lib/sqlite3/test/hooks.py M Modules/_sqlite/connection.c diff --git a/Lib/sqlite3/test/hooks.py b/Lib/sqlite3/test/hooks.py index 8c60bdcf5d70a..97121eea1be5f 100644 --- a/Lib/sqlite3/test/hooks.py +++ b/Lib/sqlite3/test/hooks.py @@ -20,6 +20,7 @@ # misrepresented as being the original software. # 3. This notice may not be removed or altered from any source distribution. +import contextlib import unittest import sqlite3 as sqlite @@ -200,6 +201,16 @@ def progress(): self.assertEqual(action, 0, "progress handler was not cleared") class TraceCallbackTests(unittest.TestCase): + @contextlib.contextmanager + def check_stmt_trace(self, cx, expected): + try: + traced = [] + cx.set_trace_callback(lambda stmt: traced.append(stmt)) + yield + finally: + self.assertEqual(traced, expected) + cx.set_trace_callback(None) + def test_trace_callback_used(self): """ Test that the trace callback is invoked once it is set. @@ -261,6 +272,21 @@ def trace(statement): cur.execute(queries[1]) self.assertEqual(traced_statements, queries) + def test_trace_expanded_sql(self): + expected = [ + "create table t(t)", + "BEGIN ", + "insert into t values(0)", + "insert into t values(1)", + "insert into t values(2)", + "COMMIT", + ] + cx = sqlite.connect(":memory:") + with self.check_stmt_trace(cx, expected): + with cx: + cx.execute("create table t(t)") + cx.executemany("insert into t values(?)", ((v,) for v in range(3))) + def suite(): tests = [ diff --git a/Misc/NEWS.d/next/Library/2021-09-08-16-21-03.bpo-45138.yghUrK.rst b/Misc/NEWS.d/next/Library/2021-09-08-16-21-03.bpo-45138.yghUrK.rst new file mode 100644 index 0000000000000..906ed4c4db43c --- /dev/null +++ b/Misc/NEWS.d/next/Library/2021-09-08-16-21-03.bpo-45138.yghUrK.rst @@ -0,0 +1,3 @@ +Fix a regression in the :mod:`sqlite3` trace callback where bound parameters +were not expanded in the passed statement string. The regression was introduced +in Python 3.10 by :issue:`40318`. Patch by Erlend E. Aasland. diff --git a/Modules/_sqlite/connection.c b/Modules/_sqlite/connection.c index c9c10b41398e2..68c5aee79ab15 100644 --- a/Modules/_sqlite/connection.c +++ b/Modules/_sqlite/connection.c @@ -1050,33 +1050,65 @@ static int _progress_handler(void* user_arg) * may change in future releases. Callback implementations should return zero * to ensure future compatibility. */ -static int _trace_callback(unsigned int type, void* user_arg, void* prepared_statement, void* statement_string) +static int +_trace_callback(unsigned int type, void *callable, void *stmt, void *sql) #else -static void _trace_callback(void* user_arg, const char* statement_string) +static void +_trace_callback(void *callable, const char *sql) #endif { - PyObject *py_statement = NULL; - PyObject *ret = NULL; - - PyGILState_STATE gilstate; - #ifdef HAVE_TRACE_V2 if (type != SQLITE_TRACE_STMT) { return 0; } #endif - gilstate = PyGILState_Ensure(); - py_statement = PyUnicode_DecodeUTF8(statement_string, - strlen(statement_string), "replace"); + PyGILState_STATE gilstate = PyGILState_Ensure(); + + PyObject *py_statement = NULL; +#ifdef HAVE_TRACE_V2 + const char *expanded_sql = sqlite3_expanded_sql((sqlite3_stmt *)stmt); + if (expanded_sql == NULL) { + sqlite3 *db = sqlite3_db_handle((sqlite3_stmt *)stmt); + if (sqlite3_errcode(db) == SQLITE_NOMEM) { + (void)PyErr_NoMemory(); + goto exit; + } + + PyErr_SetString(pysqlite_DataError, + "Expanded SQL string exceeds the maximum string length"); + if (_pysqlite_enable_callback_tracebacks) { + PyErr_Print(); + } else { + PyErr_Clear(); + } + + // Fall back to unexpanded sql + py_statement = PyUnicode_FromString((const char *)sql); + } + else { + py_statement = PyUnicode_FromString(expanded_sql); + sqlite3_free((void *)expanded_sql); + } +#else + if (sql == NULL) { + PyErr_SetString(pysqlite_DataError, + "Expanded SQL string exceeds the maximum string length"); + if (_pysqlite_enable_callback_tracebacks) { + PyErr_Print(); + } else { + PyErr_Clear(); + } + goto exit; + } + py_statement = PyUnicode_FromString(sql); +#endif if (py_statement) { - ret = PyObject_CallOneArg((PyObject*)user_arg, py_statement); + PyObject *ret = PyObject_CallOneArg((PyObject *)callable, py_statement); Py_DECREF(py_statement); + Py_XDECREF(ret); } - - if (ret) { - Py_DECREF(ret); - } else { + if (PyErr_Occurred()) { if (_pysqlite_enable_callback_tracebacks) { PyErr_Print(); } else { @@ -1084,6 +1116,7 @@ static void _trace_callback(void* user_arg, const char* statement_string) } } +exit: PyGILState_Release(gilstate); #ifdef HAVE_TRACE_V2 return 0; From webhook-mailer at python.org Mon May 2 12:26:02 2022 From: webhook-mailer at python.org (miss-islington) Date: Mon, 02 May 2022 16:26:02 -0000 Subject: [Python-checkins] concurrent.futures: Fix typo in docstring (GH-92121) Message-ID: https://github.com/python/cpython/commit/1a7867fc0c3913828157e23623381baa7625b626 commit: 1a7867fc0c3913828157e23623381baa7625b626 branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-02T09:25:45-07:00 summary: concurrent.futures: Fix typo in docstring (GH-92121) (cherry picked from commit b11243e85e020ed2f524bdd83c339faf11ef03d4) Co-authored-by: Yiannis Hadjicharalambous files: M Lib/concurrent/futures/_base.py diff --git a/Lib/concurrent/futures/_base.py b/Lib/concurrent/futures/_base.py index 5c00f2edbe548..cf119ac6437aa 100644 --- a/Lib/concurrent/futures/_base.py +++ b/Lib/concurrent/futures/_base.py @@ -381,7 +381,7 @@ def running(self): return self._state == RUNNING def done(self): - """Return True of the future was cancelled or finished executing.""" + """Return True if the future was cancelled or finished executing.""" with self._condition: return self._state in [CANCELLED, CANCELLED_AND_NOTIFIED, FINISHED] From webhook-mailer at python.org Mon May 2 12:36:49 2022 From: webhook-mailer at python.org (ericvsmith) Date: Mon, 02 May 2022 16:36:49 -0000 Subject: [Python-checkins] Add weakref_slot to dataclass decorator, to allow instances with slots to be weakref-able. (#92160) Message-ID: https://github.com/python/cpython/commit/5f9c0f5ddf441dedeb085b0d9f9c9488ca6bd44d commit: 5f9c0f5ddf441dedeb085b0d9f9c9488ca6bd44d branch: main author: Eric V. Smith committer: ericvsmith date: 2022-05-02T10:36:39-06:00 summary: Add weakref_slot to dataclass decorator, to allow instances with slots to be weakref-able. (#92160) files: A Misc/NEWS.d/next/Library/2022-05-02-09-09-47.gh-issue-91215.l1p7CJ.rst M Doc/library/dataclasses.rst M Lib/dataclasses.py M Lib/test/test_dataclasses.py diff --git a/Doc/library/dataclasses.rst b/Doc/library/dataclasses.rst index 08568da19d71a..ec50696ea89d4 100644 --- a/Doc/library/dataclasses.rst +++ b/Doc/library/dataclasses.rst @@ -46,7 +46,7 @@ directly specified in the ``InventoryItem`` definition shown above. Module contents --------------- -.. decorator:: dataclass(*, init=True, repr=True, eq=True, order=False, unsafe_hash=False, frozen=False, match_args=True, kw_only=False, slots=False) +.. decorator:: dataclass(*, init=True, repr=True, eq=True, order=False, unsafe_hash=False, frozen=False, match_args=True, kw_only=False, slots=False, weakref_slot=False) This function is a :term:`decorator` that is used to add generated :term:`special method`\s to classes, as described below. @@ -79,7 +79,7 @@ Module contents class C: ... - @dataclass(init=True, repr=True, eq=True, order=False, unsafe_hash=False, frozen=False, match_args=True, kw_only=False, slots=False) + @dataclass(init=True, repr=True, eq=True, order=False, unsafe_hash=False, frozen=False, match_args=True, kw_only=False, slots=False, weakref_slot=False) class C: ... @@ -198,6 +198,13 @@ Module contents base class ``__slots__`` may be any iterable, but *not* an iterator. + - ``weakref_slot``: If true (the default is ``False``), add a slot + named "__weakref__", which is required to make an instance + weakref-able. It is an error to specify ``weakref_slot=True`` + without also specifying ``slots=True``. + + .. versionadded:: 3.11 + ``field``\s may optionally specify a default value, using normal Python syntax:: @@ -381,7 +388,7 @@ Module contents :func:`astuple` raises :exc:`TypeError` if ``obj`` is not a dataclass instance. -.. function:: make_dataclass(cls_name, fields, *, bases=(), namespace=None, init=True, repr=True, eq=True, order=False, unsafe_hash=False, frozen=False, match_args=True, kw_only=False, slots=False) +.. function:: make_dataclass(cls_name, fields, *, bases=(), namespace=None, init=True, repr=True, eq=True, order=False, unsafe_hash=False, frozen=False, match_args=True, kw_only=False, slots=False, weakref_slot=False) Creates a new dataclass with name ``cls_name``, fields as defined in ``fields``, base classes as given in ``bases``, and initialized @@ -390,8 +397,8 @@ Module contents or ``(name, type, Field)``. If just ``name`` is supplied, ``typing.Any`` is used for ``type``. The values of ``init``, ``repr``, ``eq``, ``order``, ``unsafe_hash``, ``frozen``, - ``match_args``, ``kw_only``, and ``slots`` have the same meaning as - they do in :func:`dataclass`. + ``match_args``, ``kw_only``, ``slots``, and ``weakref_slot`` have + the same meaning as they do in :func:`dataclass`. This function is not strictly required, because any Python mechanism for creating a new class with ``__annotations__`` can diff --git a/Lib/dataclasses.py b/Lib/dataclasses.py index 1acb7128f1a0c..4645ebfa71e71 100644 --- a/Lib/dataclasses.py +++ b/Lib/dataclasses.py @@ -883,7 +883,7 @@ def _hash_exception(cls, fields, globals): def _process_class(cls, init, repr, eq, order, unsafe_hash, frozen, - match_args, kw_only, slots): + match_args, kw_only, slots, weakref_slot): # Now that dicts retain insertion order, there's no reason to use # an ordered dict. I am leveraging that ordering here, because # derived class fields overwrite base class fields, but the order @@ -1101,8 +1101,11 @@ def _process_class(cls, init, repr, eq, order, unsafe_hash, frozen, _set_new_attribute(cls, '__match_args__', tuple(f.name for f in std_init_fields)) + # It's an error to specify weakref_slot if slots is False. + if weakref_slot and not slots: + raise TypeError('weakref_slot is True but slots is False') if slots: - cls = _add_slots(cls, frozen) + cls = _add_slots(cls, frozen, weakref_slot) abc.update_abstractmethods(cls) @@ -1137,7 +1140,7 @@ def _get_slots(cls): raise TypeError(f"Slots of '{cls.__name__}' cannot be determined") -def _add_slots(cls, is_frozen): +def _add_slots(cls, is_frozen, weakref_slot): # Need to create a new class, since we can't set __slots__ # after a class has been created. @@ -1152,9 +1155,14 @@ def _add_slots(cls, is_frozen): inherited_slots = set( itertools.chain.from_iterable(map(_get_slots, cls.__mro__[1:-1])) ) + # The slots for our class. Remove slots from our base classes. Add + # '__weakref__' if weakref_slot was given. cls_dict["__slots__"] = tuple( - itertools.filterfalse(inherited_slots.__contains__, field_names) + itertools.chain( + itertools.filterfalse(inherited_slots.__contains__, field_names), + ("__weakref__",) if weakref_slot else ()) ) + for field_name in field_names: # Remove our attributes, if present. They'll still be # available in _MARKER. @@ -1179,7 +1187,7 @@ def _add_slots(cls, is_frozen): def dataclass(cls=None, /, *, init=True, repr=True, eq=True, order=False, unsafe_hash=False, frozen=False, match_args=True, - kw_only=False, slots=False): + kw_only=False, slots=False, weakref_slot=False): """Returns the same class as was passed in, with dunder methods added based on the fields defined in the class. @@ -1197,7 +1205,8 @@ def dataclass(cls=None, /, *, init=True, repr=True, eq=True, order=False, def wrap(cls): return _process_class(cls, init, repr, eq, order, unsafe_hash, - frozen, match_args, kw_only, slots) + frozen, match_args, kw_only, slots, + weakref_slot) # See if we're being called as @dataclass or @dataclass(). if cls is None: @@ -1356,7 +1365,8 @@ def _astuple_inner(obj, tuple_factory): def make_dataclass(cls_name, fields, *, bases=(), namespace=None, init=True, repr=True, eq=True, order=False, unsafe_hash=False, - frozen=False, match_args=True, kw_only=False, slots=False): + frozen=False, match_args=True, kw_only=False, slots=False, + weakref_slot=False): """Return a new dynamically created dataclass. The dataclass name will be 'cls_name'. 'fields' is an iterable @@ -1423,7 +1433,8 @@ def exec_body_callback(ns): # Apply the normal decorator. return dataclass(cls, init=init, repr=repr, eq=eq, order=order, unsafe_hash=unsafe_hash, frozen=frozen, - match_args=match_args, kw_only=kw_only, slots=slots) + match_args=match_args, kw_only=kw_only, slots=slots, + weakref_slot=weakref_slot) def replace(obj, /, **changes): diff --git a/Lib/test/test_dataclasses.py b/Lib/test/test_dataclasses.py index 847bcd46a6926..6a36da104ac89 100644 --- a/Lib/test/test_dataclasses.py +++ b/Lib/test/test_dataclasses.py @@ -9,6 +9,7 @@ import inspect import builtins import types +import weakref import unittest from unittest.mock import Mock from typing import ClassVar, Any, List, Union, Tuple, Dict, Generic, TypeVar, Optional, Protocol @@ -3038,6 +3039,77 @@ class A: self.assertEqual(obj.a, 'a') self.assertEqual(obj.b, 'b') + def test_slots_no_weakref(self): + @dataclass(slots=True) + class A: + # No weakref. + pass + + self.assertNotIn("__weakref__", A.__slots__) + a = A() + with self.assertRaisesRegex(TypeError, + "cannot create weak reference"): + weakref.ref(a) + + def test_slots_weakref(self): + @dataclass(slots=True, weakref_slot=True) + class A: + a: int + + self.assertIn("__weakref__", A.__slots__) + a = A(1) + weakref.ref(a) + + def test_slots_weakref_base_str(self): + class Base: + __slots__ = '__weakref__' + + @dataclass(slots=True) + class A(Base): + a: int + + # __weakref__ is in the base class, not A. But an A is still weakref-able. + self.assertIn("__weakref__", Base.__slots__) + self.assertNotIn("__weakref__", A.__slots__) + a = A(1) + weakref.ref(a) + + def test_slots_weakref_base_tuple(self): + # Same as test_slots_weakref_base, but use a tuple instead of a string + # in the base class. + class Base: + __slots__ = ('__weakref__',) + + @dataclass(slots=True) + class A(Base): + a: int + + # __weakref__ is in the base class, not A. But an A is still + # weakref-able. + self.assertIn("__weakref__", Base.__slots__) + self.assertNotIn("__weakref__", A.__slots__) + a = A(1) + weakref.ref(a) + + def test_weakref_slot_without_slot(self): + with self.assertRaisesRegex(TypeError, + "weakref_slot is True but slots is False"): + @dataclass(weakref_slot=True) + class A: + a: int + + def test_weakref_slot_make_dataclass(self): + A = make_dataclass('A', [('a', int),], slots=True, weakref_slot=True) + self.assertIn("__weakref__", A.__slots__) + a = A(1) + weakref.ref(a) + + # And make sure if raises if slots=True is not given. + with self.assertRaisesRegex(TypeError, + "weakref_slot is True but slots is False"): + B = make_dataclass('B', [('a', int),], weakref_slot=True) + + class TestDescriptors(unittest.TestCase): def test_set_name(self): # See bpo-33141. diff --git a/Misc/NEWS.d/next/Library/2022-05-02-09-09-47.gh-issue-91215.l1p7CJ.rst b/Misc/NEWS.d/next/Library/2022-05-02-09-09-47.gh-issue-91215.l1p7CJ.rst new file mode 100644 index 0000000000000..3a9897cb79642 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-05-02-09-09-47.gh-issue-91215.l1p7CJ.rst @@ -0,0 +1,3 @@ +For @dataclass, add weakref_slot. Default is False. If True, and if +slots=True, add a slot named "__weakref__", which will allow instances to be +weakref'd. Contributed by Eric V. Smith From webhook-mailer at python.org Mon May 2 12:37:20 2022 From: webhook-mailer at python.org (miss-islington) Date: Mon, 02 May 2022 16:37:20 -0000 Subject: [Python-checkins] gh-92082: contextlib docs: Change aclosing from a class to a function for consistency (GH-92155) Message-ID: https://github.com/python/cpython/commit/0e9927b6b008ff7537600cec4f91169a006d0c9d commit: 0e9927b6b008ff7537600cec4f91169a006d0c9d branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-02T09:37:10-07:00 summary: gh-92082: contextlib docs: Change aclosing from a class to a function for consistency (GH-92155) Signed-off-by: prwatson (cherry picked from commit 958f21c5cdb3bbbd16fec87164785cff3dacce96) Co-authored-by: Thaddeus1499 <104600742+Thaddeus1499 at users.noreply.github.com> files: M Doc/library/contextlib.rst diff --git a/Doc/library/contextlib.rst b/Doc/library/contextlib.rst index 0fe3206540e80..7c0b831407968 100644 --- a/Doc/library/contextlib.rst +++ b/Doc/library/contextlib.rst @@ -181,7 +181,7 @@ Functions and classes provided: ``page.close()`` will be called when the :keyword:`with` block is exited. -.. class:: aclosing(thing) +.. function:: aclosing(thing) Return an async context manager that calls the ``aclose()`` method of *thing* upon completion of the block. This is basically equivalent to:: From webhook-mailer at python.org Mon May 2 12:57:40 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Mon, 02 May 2022 16:57:40 -0000 Subject: [Python-checkins] Fix typo in turtle deprecation warning and use warnings._deprecated (#91862) Message-ID: https://github.com/python/cpython/commit/341689cb85c4ee4f58dc9f0f96ecc94ded8fd9d4 commit: 341689cb85c4ee4f58dc9f0f96ecc94ded8fd9d4 branch: main author: Hugo van Kemenade committer: JelleZijlstra date: 2022-05-02T10:57:00-06:00 summary: Fix typo in turtle deprecation warning and use warnings._deprecated (#91862) files: M Lib/turtle.py diff --git a/Lib/turtle.py b/Lib/turtle.py index d5e715efec96a..a8876e76bce40 100644 --- a/Lib/turtle.py +++ b/Lib/turtle.py @@ -2863,10 +2863,10 @@ def settiltangle(self, angle): >>> turtle.stamp() >>> turtle.fd(50) """ - warnings.warn("turtle.RawTurtle.settiltangle() is deprecated since " - "Python 3.1 and scheduled for removal in Python 3.13." - "Use tiltangle() instead.", - DeprecationWarning) + warnings._deprecated("turtle.RawTurtle.settiltangle()", + "{name!r} is deprecated since Python 3.1 and scheduled " + "for removal in Python {remove}. Use tiltangle() instead.", + remove=(3, 13)) self.tiltangle(angle) def tiltangle(self, angle=None): From webhook-mailer at python.org Mon May 2 13:09:46 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Mon, 02 May 2022 17:09:46 -0000 Subject: [Python-checkins] suggestions.c: Improve efficiency of levenshtein_distance method (#91835) Message-ID: https://github.com/python/cpython/commit/feb45d0ae98f3030b2b07089bc0eb066b69f5625 commit: feb45d0ae98f3030b2b07089bc0eb066b69f5625 branch: main author: Pieter Eendebak committer: JelleZijlstra date: 2022-05-02T11:09:35-06:00 summary: suggestions.c: Improve efficiency of levenshtein_distance method (#91835) files: M Python/suggestions.c diff --git a/Python/suggestions.c b/Python/suggestions.c index d9e69fa7e0db2..b84acaaed6b1f 100644 --- a/Python/suggestions.c +++ b/Python/suggestions.c @@ -78,9 +78,11 @@ levenshtein_distance(const char *a, size_t a_size, // Instead of producing the whole traditional len(a)-by-len(b) // matrix, we can update just one row in place. // Initialize the buffer row + size_t tmp = MOVE_COST; for (size_t i = 0; i < a_size; i++) { // cost from b[:0] to a[:i+1] - buffer[i] = (i + 1) * MOVE_COST; + buffer[i] = tmp; + tmp += MOVE_COST; } size_t result = 0; From webhook-mailer at python.org Mon May 2 13:15:13 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Mon, 02 May 2022 17:15:13 -0000 Subject: [Python-checkins] gh-91783: Document security considerations for shutil.unpack_archive (#91844) Message-ID: https://github.com/python/cpython/commit/4b297a9ffd4a1d420c1a8016f4ed2c7f1d298469 commit: 4b297a9ffd4a1d420c1a8016f4ed2c7f1d298469 branch: main author: Sam Ezeh committer: JelleZijlstra date: 2022-05-02T11:15:04-06:00 summary: gh-91783: Document security considerations for shutil.unpack_archive (#91844) files: A Misc/NEWS.d/next/Documentation/2022-04-23-00-22-54.gh-issue-91783.N09dRR.rst M Doc/library/shutil.rst diff --git a/Doc/library/shutil.rst b/Doc/library/shutil.rst index cb72ff6f3914b..9a25b0d008bf5 100644 --- a/Doc/library/shutil.rst +++ b/Doc/library/shutil.rst @@ -636,10 +636,16 @@ provided. They rely on the :mod:`zipfile` and :mod:`tarfile` modules. .. audit-event:: shutil.unpack_archive filename,extract_dir,format shutil.unpack_archive + .. warning:: + + Never extract archives from untrusted sources without prior inspection. + It is possible that files are created outside of the path specified in + the *extract_dir* argument, e.g. members that have absolute filenames + starting with "/" or filenames with two dots "..". + .. versionchanged:: 3.7 Accepts a :term:`path-like object` for *filename* and *extract_dir*. - .. function:: register_unpack_format(name, extensions, function[, extra_args[, description]]) Registers an unpack format. *name* is the name of the format and diff --git a/Misc/NEWS.d/next/Documentation/2022-04-23-00-22-54.gh-issue-91783.N09dRR.rst b/Misc/NEWS.d/next/Documentation/2022-04-23-00-22-54.gh-issue-91783.N09dRR.rst new file mode 100644 index 0000000000000..4d6be37402079 --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2022-04-23-00-22-54.gh-issue-91783.N09dRR.rst @@ -0,0 +1,2 @@ +Document security issues concerning the use of the function +:meth:`shutil.unpack_archive` From webhook-mailer at python.org Mon May 2 13:19:16 2022 From: webhook-mailer at python.org (markshannon) Date: Mon, 02 May 2022 17:19:16 -0000 Subject: [Python-checkins] gh-90213: Speed up right shifts of negative integers (GH-30277) Message-ID: https://github.com/python/cpython/commit/0ed91a26fed8cd78b04b814ef2b402f000b0538c commit: 0ed91a26fed8cd78b04b814ef2b402f000b0538c branch: main author: Mark Dickinson committer: markshannon date: 2022-05-02T11:19:03-06:00 summary: gh-90213: Speed up right shifts of negative integers (GH-30277) files: A Misc/NEWS.d/next/Core and Builtins/2022-04-12-09-40-57.gh-issue-46055.IPb1HA.rst M Lib/test/test_long.py M Objects/longobject.c diff --git a/Lib/test/test_long.py b/Lib/test/test_long.py index 2de4526ff33fd..d092e0176c261 100644 --- a/Lib/test/test_long.py +++ b/Lib/test/test_long.py @@ -985,6 +985,10 @@ def test_medium_rshift(self): self.assertEqual((-1122) >> 9, -3) self.assertEqual(2**128 >> 9, 2**119) self.assertEqual(-2**128 >> 9, -2**119) + # Exercise corner case of the current algorithm, where the result of + # shifting a two-limb int by the limb size still has two limbs. + self.assertEqual((1 - BASE*BASE) >> SHIFT, -BASE) + self.assertEqual((BASE - 1 - BASE*BASE) >> SHIFT, -BASE) def test_big_rshift(self): self.assertEqual(42 >> 32, 0) diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-04-12-09-40-57.gh-issue-46055.IPb1HA.rst b/Misc/NEWS.d/next/Core and Builtins/2022-04-12-09-40-57.gh-issue-46055.IPb1HA.rst new file mode 100644 index 0000000000000..ed7e4113fd2e6 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-04-12-09-40-57.gh-issue-46055.IPb1HA.rst @@ -0,0 +1,2 @@ +Speed up right shift of negative integers, by removing unnecessary creation +of temporaries. Original patch by Xinhang Xu, reworked by Mark Dickinson. diff --git a/Objects/longobject.c b/Objects/longobject.c index e805dac1209e7..78360a58facc6 100644 --- a/Objects/longobject.c +++ b/Objects/longobject.c @@ -4688,13 +4688,23 @@ divmod_shift(PyObject *shiftby, Py_ssize_t *wordshift, digit *remshift) return 0; } +/* Inner function for both long_rshift and _PyLong_Rshift, shifting an + integer right by PyLong_SHIFT*wordshift + remshift bits. + wordshift should be nonnegative. */ + static PyObject * long_rshift1(PyLongObject *a, Py_ssize_t wordshift, digit remshift) { PyLongObject *z = NULL; - Py_ssize_t newsize, hishift, i, j; + Py_ssize_t newsize, hishift, size_a; twodigits accum; + int a_negative; + + /* Total number of bits shifted must be nonnegative. */ + assert(wordshift >= 0); + assert(remshift < PyLong_SHIFT); + /* Fast path for small a. */ if (IS_MEDIUM_VALUE(a)) { stwodigits m, x; digit shift; @@ -4704,37 +4714,67 @@ long_rshift1(PyLongObject *a, Py_ssize_t wordshift, digit remshift) return _PyLong_FromSTwoDigits(x); } - if (Py_SIZE(a) < 0) { - /* Right shifting negative numbers is harder */ - PyLongObject *a1, *a2; - a1 = (PyLongObject *) long_invert(a); - if (a1 == NULL) - return NULL; - a2 = (PyLongObject *) long_rshift1(a1, wordshift, remshift); - Py_DECREF(a1); - if (a2 == NULL) - return NULL; - z = (PyLongObject *) long_invert(a2); - Py_DECREF(a2); + a_negative = Py_SIZE(a) < 0; + size_a = Py_ABS(Py_SIZE(a)); + + if (a_negative) { + /* For negative 'a', adjust so that 0 < remshift <= PyLong_SHIFT, + while keeping PyLong_SHIFT*wordshift + remshift the same. This + ensures that 'newsize' is computed correctly below. */ + if (remshift == 0) { + if (wordshift == 0) { + /* Can only happen if the original shift was 0. */ + return long_long((PyObject *)a); + } + remshift = PyLong_SHIFT; + --wordshift; + } } - else { - newsize = Py_SIZE(a) - wordshift; - if (newsize <= 0) - return PyLong_FromLong(0); - hishift = PyLong_SHIFT - remshift; - z = _PyLong_New(newsize); - if (z == NULL) - return NULL; - j = wordshift; - accum = a->ob_digit[j++] >> remshift; - for (i = 0; j < Py_SIZE(a); i++, j++) { - accum |= (twodigits)a->ob_digit[j] << hishift; - z->ob_digit[i] = (digit)(accum & PyLong_MASK); - accum >>= PyLong_SHIFT; + + assert(wordshift >= 0); + newsize = size_a - wordshift; + if (newsize <= 0) { + /* Shifting all the bits of 'a' out gives either -1 or 0. */ + return PyLong_FromLong(-a_negative); + } + z = _PyLong_New(newsize); + if (z == NULL) { + return NULL; + } + hishift = PyLong_SHIFT - remshift; + + accum = a->ob_digit[wordshift]; + if (a_negative) { + /* + For a positive integer a and nonnegative shift, we have: + + (-a) >> shift == -((a + 2**shift - 1) >> shift). + + In the addition `a + (2**shift - 1)`, the low `wordshift` digits of + `2**shift - 1` all have value `PyLong_MASK`, so we get a carry out + from the bottom `wordshift` digits when at least one of the least + significant `wordshift` digits of `a` is nonzero. Digit `wordshift` + of `2**shift - 1` has value `PyLong_MASK >> hishift`. + */ + Py_SET_SIZE(z, -newsize); + + digit sticky = 0; + for (Py_ssize_t j = 0; j < wordshift; j++) { + sticky |= a->ob_digit[j]; } - z->ob_digit[i] = (digit)accum; - z = maybe_small_long(long_normalize(z)); + accum += (PyLong_MASK >> hishift) + (digit)(sticky != 0); } + + accum >>= remshift; + for (Py_ssize_t i = 0, j = wordshift + 1; j < size_a; i++, j++) { + accum += (twodigits)a->ob_digit[j] << hishift; + z->ob_digit[i] = (digit)(accum & PyLong_MASK); + accum >>= PyLong_SHIFT; + } + assert(accum <= PyLong_MASK); + z->ob_digit[newsize - 1] = (digit)accum; + + z = maybe_small_long(long_normalize(z)); return (PyObject *)z; } From webhook-mailer at python.org Mon May 2 13:22:44 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Mon, 02 May 2022 17:22:44 -0000 Subject: [Python-checkins] gh-90765: configparser test: Catch deprecation warning (#91480) Message-ID: https://github.com/python/cpython/commit/56f98440148e4257aa5b27150ce2269c98cea0ea commit: 56f98440148e4257aa5b27150ce2269c98cea0ea branch: main author: Hugo van Kemenade committer: JelleZijlstra date: 2022-05-02T11:22:26-06:00 summary: gh-90765: configparser test: Catch deprecation warning (#91480) files: M Lib/test/test_configparser.py diff --git a/Lib/test/test_configparser.py b/Lib/test/test_configparser.py index efd98ffb67a54..59c4b275cb46d 100644 --- a/Lib/test/test_configparser.py +++ b/Lib/test/test_configparser.py @@ -1028,7 +1028,9 @@ class CustomConfigParser(configparser.ConfigParser): class ConfigParserTestCaseLegacyInterpolation(ConfigParserTestCase): config_class = configparser.ConfigParser - interpolation = configparser.LegacyInterpolation() + with warnings.catch_warnings(): + warnings.simplefilter("ignore", DeprecationWarning) + interpolation = configparser.LegacyInterpolation() def test_set_malformatted_interpolation(self): cf = self.fromstring("[sect]\n" From webhook-mailer at python.org Mon May 2 13:24:59 2022 From: webhook-mailer at python.org (miss-islington) Date: Mon, 02 May 2022 17:24:59 -0000 Subject: [Python-checkins] [3.10] Fix typo in Programming FAQ (GH-92083) (GH-92148) Message-ID: https://github.com/python/cpython/commit/864058ba86d93eee9b6ed10b93bd8839a6131e44 commit: 864058ba86d93eee9b6ed10b93bd8839a6131e44 branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-02T10:24:49-07:00 summary: [3.10] Fix typo in Programming FAQ (GH-92083) (GH-92148) I believe the word "with" was missing here. (cherry picked from commit 2a7efa324274a54fe0e5480cae1438d8294b9ec3) Co-authored-by: Matt Harding files: M Doc/faq/programming.rst diff --git a/Doc/faq/programming.rst b/Doc/faq/programming.rst index a1adf851bdded..a1701bd4184bb 100644 --- a/Doc/faq/programming.rst +++ b/Doc/faq/programming.rst @@ -78,7 +78,7 @@ set of modules required by a program and bind these modules together with a Python binary to produce a single executable. One is to use the freeze tool, which is included in the Python source tree as -``Tools/freeze``. It converts Python byte code to C arrays; a C compiler you can +``Tools/freeze``. It converts Python byte code to C arrays; with a C compiler you can embed all your modules into a new program, which is then linked with the standard Python modules. From webhook-mailer at python.org Mon May 2 13:35:07 2022 From: webhook-mailer at python.org (miss-islington) Date: Mon, 02 May 2022 17:35:07 -0000 Subject: [Python-checkins] gh-91783: Document security considerations for shutil.unpack_archive (GH-91844) Message-ID: https://github.com/python/cpython/commit/bab4d0bb1695ec8e4d89efe14c843c5080d46735 commit: bab4d0bb1695ec8e4d89efe14c843c5080d46735 branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-02T10:34:59-07:00 summary: gh-91783: Document security considerations for shutil.unpack_archive (GH-91844) (cherry picked from commit 4b297a9ffd4a1d420c1a8016f4ed2c7f1d298469) Co-authored-by: Sam Ezeh files: A Misc/NEWS.d/next/Documentation/2022-04-23-00-22-54.gh-issue-91783.N09dRR.rst M Doc/library/shutil.rst diff --git a/Doc/library/shutil.rst b/Doc/library/shutil.rst index 403df45b3966a..193c01006171e 100644 --- a/Doc/library/shutil.rst +++ b/Doc/library/shutil.rst @@ -630,10 +630,16 @@ provided. They rely on the :mod:`zipfile` and :mod:`tarfile` modules. .. audit-event:: shutil.unpack_archive filename,extract_dir,format shutil.unpack_archive + .. warning:: + + Never extract archives from untrusted sources without prior inspection. + It is possible that files are created outside of the path specified in + the *extract_dir* argument, e.g. members that have absolute filenames + starting with "/" or filenames with two dots "..". + .. versionchanged:: 3.7 Accepts a :term:`path-like object` for *filename* and *extract_dir*. - .. function:: register_unpack_format(name, extensions, function[, extra_args[, description]]) Registers an unpack format. *name* is the name of the format and diff --git a/Misc/NEWS.d/next/Documentation/2022-04-23-00-22-54.gh-issue-91783.N09dRR.rst b/Misc/NEWS.d/next/Documentation/2022-04-23-00-22-54.gh-issue-91783.N09dRR.rst new file mode 100644 index 0000000000000..4d6be37402079 --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2022-04-23-00-22-54.gh-issue-91783.N09dRR.rst @@ -0,0 +1,2 @@ +Document security issues concerning the use of the function +:meth:`shutil.unpack_archive` From webhook-mailer at python.org Mon May 2 13:36:09 2022 From: webhook-mailer at python.org (miss-islington) Date: Mon, 02 May 2022 17:36:09 -0000 Subject: [Python-checkins] gh-91783: Document security considerations for shutil.unpack_archive (GH-91844) Message-ID: https://github.com/python/cpython/commit/d113674b3e20ee35ca8890650f7c0b3912f14fef commit: d113674b3e20ee35ca8890650f7c0b3912f14fef branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-02T10:36:05-07:00 summary: gh-91783: Document security considerations for shutil.unpack_archive (GH-91844) (cherry picked from commit 4b297a9ffd4a1d420c1a8016f4ed2c7f1d298469) Co-authored-by: Sam Ezeh files: A Misc/NEWS.d/next/Documentation/2022-04-23-00-22-54.gh-issue-91783.N09dRR.rst M Doc/library/shutil.rst diff --git a/Doc/library/shutil.rst b/Doc/library/shutil.rst index 403df45b3966a..193c01006171e 100644 --- a/Doc/library/shutil.rst +++ b/Doc/library/shutil.rst @@ -630,10 +630,16 @@ provided. They rely on the :mod:`zipfile` and :mod:`tarfile` modules. .. audit-event:: shutil.unpack_archive filename,extract_dir,format shutil.unpack_archive + .. warning:: + + Never extract archives from untrusted sources without prior inspection. + It is possible that files are created outside of the path specified in + the *extract_dir* argument, e.g. members that have absolute filenames + starting with "/" or filenames with two dots "..". + .. versionchanged:: 3.7 Accepts a :term:`path-like object` for *filename* and *extract_dir*. - .. function:: register_unpack_format(name, extensions, function[, extra_args[, description]]) Registers an unpack format. *name* is the name of the format and diff --git a/Misc/NEWS.d/next/Documentation/2022-04-23-00-22-54.gh-issue-91783.N09dRR.rst b/Misc/NEWS.d/next/Documentation/2022-04-23-00-22-54.gh-issue-91783.N09dRR.rst new file mode 100644 index 0000000000000..4d6be37402079 --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2022-04-23-00-22-54.gh-issue-91783.N09dRR.rst @@ -0,0 +1,2 @@ +Document security issues concerning the use of the function +:meth:`shutil.unpack_archive` From webhook-mailer at python.org Mon May 2 14:21:56 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Mon, 02 May 2022 18:21:56 -0000 Subject: [Python-checkins] [3.10] bpo-43504: Remove effbot urls (GH-26308) (#92161) Message-ID: https://github.com/python/cpython/commit/c8ab1633fce42e84734179d267a1cd01e3fef323 commit: c8ab1633fce42e84734179d267a1cd01e3fef323 branch: 3.10 author: Thaddeus1499 <104600742+Thaddeus1499 at users.noreply.github.com> committer: JelleZijlstra date: 2022-05-02T12:21:51-06:00 summary: [3.10] bpo-43504: Remove effbot urls (GH-26308) (#92161) * [3.10] Remove effbot urls (GH-26308). (cherry picked from commit e9f66aedf44ccc3be27975cfb070a44ce6a6bd13) Co-authored-by: E-Paine <63801254+E-Paine at users.noreply.github.com> files: M Doc/about.rst M Doc/faq/library.rst M Doc/howto/curses.rst M Doc/library/xml.etree.elementtree.rst M Doc/library/xmlrpc.client.rst M Lib/xml/etree/ElementPath.py M Objects/stringlib/fastsearch.h diff --git a/Doc/about.rst b/Doc/about.rst index 3ea311fa629dd..f0b908487b2d0 100644 --- a/Doc/about.rst +++ b/Doc/about.rst @@ -23,9 +23,8 @@ Many thanks go to: and writer of much of the content; * the `Docutils `_ project for creating reStructuredText and the Docutils suite; -* Fredrik Lundh for his `Alternative Python Reference - `_ project from which Sphinx got many good - ideas. +* Fredrik Lundh for his Alternative Python Reference project from which Sphinx + got many good ideas. Contributors to the Python Documentation diff --git a/Doc/faq/library.rst b/Doc/faq/library.rst index faca834e96545..b9e541c150dc4 100644 --- a/Doc/faq/library.rst +++ b/Doc/faq/library.rst @@ -106,9 +106,6 @@ support, pads, and mouse support. This means the module isn't compatible with operating systems that only have BSD curses, but there don't seem to be any currently maintained OSes that fall into this category. -For Windows: use `the consolelib module -`_. - Is there an equivalent to C's onexit() in Python? ------------------------------------------------- diff --git a/Doc/howto/curses.rst b/Doc/howto/curses.rst index cc4b4785b1229..c0149ffff3771 100644 --- a/Doc/howto/curses.rst +++ b/Doc/howto/curses.rst @@ -55,11 +55,7 @@ everything, though. The Windows version of Python doesn't include the :mod:`curses` module. A ported version called `UniCurses -`_ is available. You could -also try `the Console module `_ -written by Fredrik Lundh, which doesn't -use the same API as curses but provides cursor-addressable text output -and full support for mouse and keyboard input. +`_ is available. The Python curses module diff --git a/Doc/library/xml.etree.elementtree.rst b/Doc/library/xml.etree.elementtree.rst index 87f4ee347d604..e3932bc9e659f 100644 --- a/Doc/library/xml.etree.elementtree.rst +++ b/Doc/library/xml.etree.elementtree.rst @@ -363,13 +363,6 @@ These two approaches both output:: |--> Commander Clement -Additional resources -^^^^^^^^^^^^^^^^^^^^ - -See http://effbot.org/zone/element-index.htm for tutorials and links to other -docs. - - .. _elementtree-xpath: XPath support diff --git a/Doc/library/xmlrpc.client.rst b/Doc/library/xmlrpc.client.rst index 51279b35fd71b..8d9db53ef1f0d 100644 --- a/Doc/library/xmlrpc.client.rst +++ b/Doc/library/xmlrpc.client.rst @@ -169,12 +169,6 @@ between conformable Python objects and XML on the wire. `XML-RPC Specification `_ The official specification. - `Unofficial XML-RPC Errata `_ - Fredrik Lundh's "unofficial errata, intended to clarify certain - details in the XML-RPC specification, as well as hint at - 'best practices' to use when designing your own XML-RPC - implementations." - .. _serverproxy-objects: ServerProxy Objects diff --git a/Lib/xml/etree/ElementPath.py b/Lib/xml/etree/ElementPath.py index a1170b572feea..cd3c354d0813e 100644 --- a/Lib/xml/etree/ElementPath.py +++ b/Lib/xml/etree/ElementPath.py @@ -226,7 +226,6 @@ def select(context, result): def prepare_predicate(next, token): # FIXME: replace with real parser!!! refs: - # http://effbot.org/zone/simple-iterator-parser.htm # http://javascript.crockford.com/tdop/tdop.html signature = [] predicate = [] diff --git a/Objects/stringlib/fastsearch.h b/Objects/stringlib/fastsearch.h index 6574720b609f4..7b8be5d649215 100644 --- a/Objects/stringlib/fastsearch.h +++ b/Objects/stringlib/fastsearch.h @@ -4,7 +4,8 @@ /* fast search/count implementation, based on a mix between boyer- moore and horspool, with a few more bells and whistles on the top. - for some more background, see: http://effbot.org/zone/stringlib.htm */ + for some more background, see: + https://web.archive.org/web/20201107074620/http://effbot.org/zone/stringlib.htm */ /* note: fastsearch may access s[n], which isn't a problem when using Python's ordinary string types, but may cause problems if you're From webhook-mailer at python.org Mon May 2 14:22:09 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Mon, 02 May 2022 18:22:09 -0000 Subject: [Python-checkins] [3.9] Remove effbot urls (GH-26308). (#92162) Message-ID: https://github.com/python/cpython/commit/e48da7264765041d8df71c21e3664b93d2b98f32 commit: e48da7264765041d8df71c21e3664b93d2b98f32 branch: 3.9 author: Thaddeus1499 <104600742+Thaddeus1499 at users.noreply.github.com> committer: JelleZijlstra date: 2022-05-02T12:22:05-06:00 summary: [3.9] Remove effbot urls (GH-26308). (#92162) (cherry picked from commit e9f66aedf44ccc3be27975cfb070a44ce6a6bd13) Co-authored-by: E-Paine <63801254+E-Paine at users.noreply.github.com> files: M Doc/about.rst M Doc/faq/library.rst M Doc/howto/curses.rst M Doc/library/xml.etree.elementtree.rst M Doc/library/xmlrpc.client.rst M Lib/xml/etree/ElementPath.py M Objects/stringlib/fastsearch.h diff --git a/Doc/about.rst b/Doc/about.rst index 3ea311fa629dd..f0b908487b2d0 100644 --- a/Doc/about.rst +++ b/Doc/about.rst @@ -23,9 +23,8 @@ Many thanks go to: and writer of much of the content; * the `Docutils `_ project for creating reStructuredText and the Docutils suite; -* Fredrik Lundh for his `Alternative Python Reference - `_ project from which Sphinx got many good - ideas. +* Fredrik Lundh for his Alternative Python Reference project from which Sphinx + got many good ideas. Contributors to the Python Documentation diff --git a/Doc/faq/library.rst b/Doc/faq/library.rst index 7703d48a2137a..96525ddca32d6 100644 --- a/Doc/faq/library.rst +++ b/Doc/faq/library.rst @@ -106,9 +106,6 @@ support, pads, and mouse support. This means the module isn't compatible with operating systems that only have BSD curses, but there don't seem to be any currently maintained OSes that fall into this category. -For Windows: use `the consolelib module -`_. - Is there an equivalent to C's onexit() in Python? ------------------------------------------------- diff --git a/Doc/howto/curses.rst b/Doc/howto/curses.rst index cc4b4785b1229..c0149ffff3771 100644 --- a/Doc/howto/curses.rst +++ b/Doc/howto/curses.rst @@ -55,11 +55,7 @@ everything, though. The Windows version of Python doesn't include the :mod:`curses` module. A ported version called `UniCurses -`_ is available. You could -also try `the Console module `_ -written by Fredrik Lundh, which doesn't -use the same API as curses but provides cursor-addressable text output -and full support for mouse and keyboard input. +`_ is available. The Python curses module diff --git a/Doc/library/xml.etree.elementtree.rst b/Doc/library/xml.etree.elementtree.rst index f4bccf6609810..92248e751632b 100644 --- a/Doc/library/xml.etree.elementtree.rst +++ b/Doc/library/xml.etree.elementtree.rst @@ -363,13 +363,6 @@ These two approaches both output:: |--> Commander Clement -Additional resources -^^^^^^^^^^^^^^^^^^^^ - -See http://effbot.org/zone/element-index.htm for tutorials and links to other -docs. - - .. _elementtree-xpath: XPath support diff --git a/Doc/library/xmlrpc.client.rst b/Doc/library/xmlrpc.client.rst index 32403819531aa..30c5a710e0ed8 100644 --- a/Doc/library/xmlrpc.client.rst +++ b/Doc/library/xmlrpc.client.rst @@ -169,12 +169,6 @@ between conformable Python objects and XML on the wire. `XML-RPC Specification `_ The official specification. - `Unofficial XML-RPC Errata `_ - Fredrik Lundh's "unofficial errata, intended to clarify certain - details in the XML-RPC specification, as well as hint at - 'best practices' to use when designing your own XML-RPC - implementations." - .. _serverproxy-objects: ServerProxy Objects diff --git a/Lib/xml/etree/ElementPath.py b/Lib/xml/etree/ElementPath.py index 880ea7bd99116..493c026dbabec 100644 --- a/Lib/xml/etree/ElementPath.py +++ b/Lib/xml/etree/ElementPath.py @@ -225,7 +225,6 @@ def select(context, result): def prepare_predicate(next, token): # FIXME: replace with real parser!!! refs: - # http://effbot.org/zone/simple-iterator-parser.htm # http://javascript.crockford.com/tdop/tdop.html signature = [] predicate = [] diff --git a/Objects/stringlib/fastsearch.h b/Objects/stringlib/fastsearch.h index 56a4467d35381..84b415a94906b 100644 --- a/Objects/stringlib/fastsearch.h +++ b/Objects/stringlib/fastsearch.h @@ -4,7 +4,8 @@ /* fast search/count implementation, based on a mix between boyer- moore and horspool, with a few more bells and whistles on the top. - for some more background, see: http://effbot.org/zone/stringlib.htm */ + for some more background, see: + https://web.archive.org/web/20201107074620/http://effbot.org/zone/stringlib.htm */ /* note: fastsearch may access s[n], which isn't a problem when using Python's ordinary string types, but may cause problems if you're From webhook-mailer at python.org Mon May 2 15:22:04 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Mon, 02 May 2022 19:22:04 -0000 Subject: [Python-checkins] gh-87390: Add __unpacked__ attribute to types.GenericAlias (#92059) Message-ID: https://github.com/python/cpython/commit/ff88f7e007deb7a9f7539938dcf6f4adbfebf442 commit: ff88f7e007deb7a9f7539938dcf6f4adbfebf442 branch: main author: Jelle Zijlstra committer: JelleZijlstra date: 2022-05-02T13:21:59-06:00 summary: gh-87390: Add __unpacked__ attribute to types.GenericAlias (#92059) files: A Misc/NEWS.d/next/Library/2022-04-29-16-41-08.gh-issue-87390.3LNNCv.rst M Doc/library/stdtypes.rst M Lib/test/test_genericalias.py M Objects/genericaliasobject.c diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index 764d83a6800d1..44447400c29bc 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -5055,6 +5055,15 @@ All parameterized generics implement special read-only attributes. have correct ``__parameters__`` after substitution because :class:`typing.ParamSpec` is intended primarily for static type checking. + +.. attribute:: genericalias.__unpacked__ + + A boolean that is true if the alias has been unpacked using the + ``*`` operator (see :data:`~typing.TypeVarTuple`). + + .. versionadded:: 3.11 + + .. seealso:: :pep:`484` - Type Hints diff --git a/Lib/test/test_genericalias.py b/Lib/test/test_genericalias.py index 635ac0f7a85d7..2d2adc11e1594 100644 --- a/Lib/test/test_genericalias.py +++ b/Lib/test/test_genericalias.py @@ -418,6 +418,12 @@ def __deepcopy__(self, memo): self.assertEqual(copied.__args__, alias.__args__) self.assertEqual(copied.__parameters__, alias.__parameters__) + def test_unpack(self): + alias = tuple[str, ...] + self.assertIs(alias.__unpacked__, False) + unpacked = (*alias,)[0] + self.assertIs(unpacked.__unpacked__, True) + def test_union(self): a = typing.Union[list[int], list[str]] self.assertEqual(a.__args__, (list[int], list[str])) diff --git a/Misc/NEWS.d/next/Library/2022-04-29-16-41-08.gh-issue-87390.3LNNCv.rst b/Misc/NEWS.d/next/Library/2022-04-29-16-41-08.gh-issue-87390.3LNNCv.rst new file mode 100644 index 0000000000000..c368c1eb3be18 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-04-29-16-41-08.gh-issue-87390.3LNNCv.rst @@ -0,0 +1,2 @@ +Add an ``__unpacked__`` attribute to :class:`types.GenericAlias`. Patch by +Jelle Zijlstra. diff --git a/Objects/genericaliasobject.c b/Objects/genericaliasobject.c index 7b689912dffc1..c6ed1611bd29e 100644 --- a/Objects/genericaliasobject.c +++ b/Objects/genericaliasobject.c @@ -516,6 +516,7 @@ ga_vectorcall(PyObject *self, PyObject *const *args, static const char* const attr_exceptions[] = { "__origin__", "__args__", + "__unpacked__", "__parameters__", "__mro_entries__", "__reduce_ex__", // needed so we don't look up object.__reduce_ex__ @@ -657,6 +658,7 @@ static PyMethodDef ga_methods[] = { static PyMemberDef ga_members[] = { {"__origin__", T_OBJECT, offsetof(gaobject, origin), READONLY}, {"__args__", T_OBJECT, offsetof(gaobject, args), READONLY}, + {"__unpacked__", T_BOOL, offsetof(gaobject, starred), READONLY}, {0} }; From webhook-mailer at python.org Mon May 2 15:43:57 2022 From: webhook-mailer at python.org (benjaminp) Date: Mon, 02 May 2022 19:43:57 -0000 Subject: [Python-checkins] Fix duplicate word. (GH-92182) Message-ID: https://github.com/python/cpython/commit/dd57fe1dd7675c53e69af33b511786127ae8d25c commit: dd57fe1dd7675c53e69af33b511786127ae8d25c branch: main author: Benjamin Peterson committer: benjaminp date: 2022-05-02T13:43:52-06:00 summary: Fix duplicate word. (GH-92182) files: M Doc/library/asyncio-runner.rst diff --git a/Doc/library/asyncio-runner.rst b/Doc/library/asyncio-runner.rst index a526b459f7474..d0df1db892f9e 100644 --- a/Doc/library/asyncio-runner.rst +++ b/Doc/library/asyncio-runner.rst @@ -139,7 +139,7 @@ To mitigate this issue, :mod:`asyncio` handles :const:`signal.SIGINT` as follows execution. 3. When :const:`signal.SIGINT` is raised by :kbd:`Ctrl-C`, the custom signal handler cancels the main task by calling :meth:`asyncio.Task.cancel` which raises - :exc:`asyncio.CancelledError` inside the the main task. This causes the Python stack + :exc:`asyncio.CancelledError` inside the main task. This causes the Python stack to unwind, ``try/except`` and ``try/finally`` blocks can be used for resource cleanup. After the main task is cancelled, :meth:`asyncio.Runner.run` raises :exc:`KeyboardInterrupt`. From webhook-mailer at python.org Mon May 2 16:08:31 2022 From: webhook-mailer at python.org (markshannon) Date: Mon, 02 May 2022 20:08:31 -0000 Subject: [Python-checkins] Fix the closure argument to PyEval_EvalCodeEx. (GH-92175) Message-ID: https://github.com/python/cpython/commit/c96da83a8ed020c026c3f080e0b646f553524c85 commit: c96da83a8ed020c026c3f080e0b646f553524c85 branch: main author: larryhastings committer: markshannon date: 2022-05-02T14:08:22-06:00 summary: Fix the closure argument to PyEval_EvalCodeEx. (GH-92175) files: A Misc/NEWS.d/next/C API/2022-05-02-12-39-33.gh-issue-92173.len2Is.rst M Objects/funcobject.c diff --git a/Misc/NEWS.d/next/C API/2022-05-02-12-39-33.gh-issue-92173.len2Is.rst b/Misc/NEWS.d/next/C API/2022-05-02-12-39-33.gh-issue-92173.len2Is.rst new file mode 100644 index 0000000000000..c8f9b58bd6393 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2022-05-02-12-39-33.gh-issue-92173.len2Is.rst @@ -0,0 +1 @@ +Fix the ``closure`` argument to :c:func:`PyEval_EvalCodeEx`. diff --git a/Objects/funcobject.c b/Objects/funcobject.c index 1e0cfb7efb479..32b4155c03e6a 100644 --- a/Objects/funcobject.c +++ b/Objects/funcobject.c @@ -29,7 +29,8 @@ _PyFunction_FromConstructor(PyFrameConstructor *constr) op->func_code = constr->fc_code; op->func_defaults = NULL; op->func_kwdefaults = NULL; - op->func_closure = NULL; + Py_XINCREF(constr->fc_closure); + op->func_closure = constr->fc_closure; Py_INCREF(Py_None); op->func_doc = Py_None; op->func_dict = NULL; From webhook-mailer at python.org Mon May 2 16:24:43 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Mon, 02 May 2022 20:24:43 -0000 Subject: [Python-checkins] bpo-46787: Fix `ProcessPoolExecutor exception` memory leak (GH-31408) (#31408) Message-ID: https://github.com/python/cpython/commit/9c204b148fad9742ed19b3bce173073cdec79819 commit: 9c204b148fad9742ed19b3bce173073cdec79819 branch: main author: themylogin committer: JelleZijlstra date: 2022-05-02T14:24:39-06:00 summary: bpo-46787: Fix `ProcessPoolExecutor exception` memory leak (GH-31408) (#31408) Do not store `ProcessPoolExecutor` work item exception traceback that prevents exception frame locals from being garbage collected. files: A Misc/NEWS.d/next/Library/2022-02-18-20-09-29.bpo-46787.juwWc0.rst M Lib/concurrent/futures/process.py diff --git a/Lib/concurrent/futures/process.py b/Lib/concurrent/futures/process.py index 695f7733305ed..0d49379c9bf7c 100644 --- a/Lib/concurrent/futures/process.py +++ b/Lib/concurrent/futures/process.py @@ -125,6 +125,9 @@ class _ExceptionWithTraceback: def __init__(self, exc, tb): tb = ''.join(format_exception(type(exc), exc, tb)) self.exc = exc + # Traceback object needs to be garbage-collected as its frames + # contain references to all the objects in the exception scope + self.exc.__traceback__ = None self.tb = '\n"""\n%s"""' % tb def __reduce__(self): return _rebuild_exc, (self.exc, self.tb) diff --git a/Misc/NEWS.d/next/Library/2022-02-18-20-09-29.bpo-46787.juwWc0.rst b/Misc/NEWS.d/next/Library/2022-02-18-20-09-29.bpo-46787.juwWc0.rst new file mode 100644 index 0000000000000..cf167ff48115b --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-02-18-20-09-29.bpo-46787.juwWc0.rst @@ -0,0 +1 @@ +Fix :class:`concurrent.futures.ProcessPoolExecutor` exception memory leak From webhook-mailer at python.org Mon May 2 16:26:45 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Mon, 02 May 2022 20:26:45 -0000 Subject: [Python-checkins] importlib docs: Update importlib.abc hierarchy (#31113) Message-ID: https://github.com/python/cpython/commit/5f45a9d3c3de97a4eafedb60ecea224a78bae52c commit: 5f45a9d3c3de97a4eafedb60ecea224a78bae52c branch: main author: David Gilbertson committer: JelleZijlstra date: 2022-05-02T14:26:35-06:00 summary: importlib docs: Update importlib.abc hierarchy (#31113) Fixed some inconsistencies in the text about relationships files: M Doc/library/importlib.rst diff --git a/Doc/library/importlib.rst b/Doc/library/importlib.rst index 783653831b507..0241fb30b6efb 100644 --- a/Doc/library/importlib.rst +++ b/Doc/library/importlib.rst @@ -248,8 +248,8 @@ ABC hierarchy:: object +-- Finder (deprecated) - | +-- MetaPathFinder - | +-- PathEntryFinder + +-- MetaPathFinder + +-- PathEntryFinder +-- Loader +-- ResourceLoader --------+ +-- InspectLoader | @@ -282,8 +282,7 @@ ABC hierarchy:: .. class:: MetaPathFinder - An abstract base class representing a :term:`meta path finder`. For - compatibility, this is a subclass of :class:`Finder`. + An abstract base class representing a :term:`meta path finder`. .. versionadded:: 3.3 From webhook-mailer at python.org Mon May 2 16:49:10 2022 From: webhook-mailer at python.org (miss-islington) Date: Mon, 02 May 2022 20:49:10 -0000 Subject: [Python-checkins] importlib docs: Update importlib.abc hierarchy (GH-31113) Message-ID: https://github.com/python/cpython/commit/d851f37b886a91400642c4c845c56d585ab94ec0 commit: d851f37b886a91400642c4c845c56d585ab94ec0 branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-02T13:48:59-07:00 summary: importlib docs: Update importlib.abc hierarchy (GH-31113) Fixed some inconsistencies in the text about relationships (cherry picked from commit 5f45a9d3c3de97a4eafedb60ecea224a78bae52c) Co-authored-by: David Gilbertson files: M Doc/library/importlib.rst diff --git a/Doc/library/importlib.rst b/Doc/library/importlib.rst index 3576941efa46d..c9fb63b75a471 100644 --- a/Doc/library/importlib.rst +++ b/Doc/library/importlib.rst @@ -230,8 +230,8 @@ ABC hierarchy:: object +-- Finder (deprecated) - | +-- MetaPathFinder - | +-- PathEntryFinder + +-- MetaPathFinder + +-- PathEntryFinder +-- Loader +-- ResourceLoader --------+ +-- InspectLoader | @@ -264,8 +264,7 @@ ABC hierarchy:: .. class:: MetaPathFinder - An abstract base class representing a :term:`meta path finder`. For - compatibility, this is a subclass of :class:`Finder`. + An abstract base class representing a :term:`meta path finder`. .. versionadded:: 3.3 From webhook-mailer at python.org Mon May 2 18:26:06 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Mon, 02 May 2022 22:26:06 -0000 Subject: [Python-checkins] bpo-46547: remove leaking vars into `pydoc.Helper` namespace (#30957) Message-ID: https://github.com/python/cpython/commit/cb6c6648bea57046d5ceff9382f19ebae024b918 commit: cb6c6648bea57046d5ceff9382f19ebae024b918 branch: main author: Nikita Sobolev committer: JelleZijlstra date: 2022-05-02T16:25:52-06:00 summary: bpo-46547: remove leaking vars into `pydoc.Helper` namespace (#30957) Fixes #90705 files: A Misc/NEWS.d/next/Library/2022-01-27-14-41-55.bpo-46547.JMyYz9.rst M Lib/pydoc.py diff --git a/Lib/pydoc.py b/Lib/pydoc.py index 12c2bb450e4f5..297ff967a2ce9 100755 --- a/Lib/pydoc.py +++ b/Lib/pydoc.py @@ -1891,6 +1891,7 @@ class Helper: if topic not in topics: topics = topics + ' ' + topic symbols[symbol] = topics + del topic, symbols_, symbol, topics topics = { 'TYPES': ('types', 'STRINGS UNICODE NUMBERS SEQUENCES MAPPINGS ' diff --git a/Misc/NEWS.d/next/Library/2022-01-27-14-41-55.bpo-46547.JMyYz9.rst b/Misc/NEWS.d/next/Library/2022-01-27-14-41-55.bpo-46547.JMyYz9.rst new file mode 100644 index 0000000000000..83065a7a06030 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-01-27-14-41-55.bpo-46547.JMyYz9.rst @@ -0,0 +1 @@ +Remove variables leaking into ``pydoc.Helper`` class namespace. From webhook-mailer at python.org Mon May 2 18:26:52 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Mon, 02 May 2022 22:26:52 -0000 Subject: [Python-checkins] bpo-6686: Replace String with Bytes in xml.sax.handler documentation (#30612) Message-ID: https://github.com/python/cpython/commit/32e4f450af3fbcc5c7e186f83ff74e2efe164136 commit: 32e4f450af3fbcc5c7e186f83ff74e2efe164136 branch: main author: Yassir Karroum committer: JelleZijlstra date: 2022-05-02T16:26:42-06:00 summary: bpo-6686: Replace String with Bytes in xml.sax.handler documentation (#30612) files: M Doc/library/xml.sax.handler.rst diff --git a/Doc/library/xml.sax.handler.rst b/Doc/library/xml.sax.handler.rst index 59d0d1b3b0117..719ce5ab1bcf6 100644 --- a/Doc/library/xml.sax.handler.rst +++ b/Doc/library/xml.sax.handler.rst @@ -147,7 +147,7 @@ for the feature and property names. .. data:: property_xml_string | value: ``"http://xml.org/sax/properties/xml-string"`` - | data type: String + | data type: Bytes | description: The literal string of characters that was the source for the current event. | access: read-only From webhook-mailer at python.org Mon May 2 18:29:05 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Mon, 02 May 2022 22:29:05 -0000 Subject: [Python-checkins] bpo-46285: Add command-line option -p/--protocol to module http.server (#30999) Message-ID: https://github.com/python/cpython/commit/2d30adee72317e569d24739243cdd6f7631fa68f commit: 2d30adee72317e569d24739243cdd6f7631fa68f branch: main author: G?ry Ogam committer: JelleZijlstra date: 2022-05-02T16:28:45-06:00 summary: bpo-46285: Add command-line option -p/--protocol to module http.server (#30999) Co-authored-by: ?ric Co-authored-by: Jelle Zijlstra files: A Misc/NEWS.d/next/Library/2022-01-29-00-23-00.bpo-46285.pt84qm.rst M Doc/library/http.server.rst M Lib/http/server.py diff --git a/Doc/library/http.server.rst b/Doc/library/http.server.rst index 0de02834401aa..9d5e5e3a75b19 100644 --- a/Doc/library/http.server.rst +++ b/Doc/library/http.server.rst @@ -157,7 +157,9 @@ provides three different variants: .. attribute:: protocol_version - This specifies the HTTP protocol version used in responses. If set to + Specifies the HTTP version to which the server is conformant. It is sent + in responses to let the client know the server's communication + capabilities for future requests. If set to ``'HTTP/1.1'``, the server will permit HTTP persistent connections; however, your server *must* then include an accurate ``Content-Length`` header (using :meth:`send_header`) in all of its responses to clients. @@ -193,7 +195,7 @@ provides three different variants: .. method:: handle_expect_100() - When a HTTP/1.1 compliant server receives an ``Expect: 100-continue`` + When an HTTP/1.1 conformant server receives an ``Expect: 100-continue`` request header it responds back with a ``100 Continue`` followed by ``200 OK`` headers. This method can be overridden to raise an error if the server does not @@ -444,6 +446,15 @@ the following command uses a specific directory:: .. versionadded:: 3.7 ``--directory`` argument was introduced. +By default, the server is conformant to HTTP/1.0. The option ``-p/--protocol`` +specifies the HTTP version to which the server is conformant. For example, the +following command runs an HTTP/1.1 conformant server:: + + python -m http.server --protocol HTTP/1.1 + +.. versionadded:: 3.11 + ``--protocol`` argument was introduced. + .. class:: CGIHTTPRequestHandler(request, client_address, server) This class is used to serve either files or output of CGI scripts from the diff --git a/Lib/http/server.py b/Lib/http/server.py index a6100d4829751..d115dfc162bb1 100644 --- a/Lib/http/server.py +++ b/Lib/http/server.py @@ -1256,15 +1256,19 @@ def test(HandlerClass=BaseHTTPRequestHandler, parser = argparse.ArgumentParser() parser.add_argument('--cgi', action='store_true', help='run as CGI server') - parser.add_argument('--bind', '-b', metavar='ADDRESS', - help='specify alternate bind address ' + parser.add_argument('-b', '--bind', metavar='ADDRESS', + help='bind to this address ' '(default: all interfaces)') - parser.add_argument('--directory', '-d', default=os.getcwd(), - help='specify alternate directory ' + parser.add_argument('-d', '--directory', default=os.getcwd(), + help='serve this directory ' '(default: current directory)') - parser.add_argument('port', action='store', default=8000, type=int, - nargs='?', - help='specify alternate port (default: 8000)') + parser.add_argument('-p', '--protocol', metavar='VERSION', + default='HTTP/1.0', + help='conform to this HTTP version ' + '(default: %(default)s)') + parser.add_argument('port', default=8000, type=int, nargs='?', + help='bind to this port ' + '(default: %(default)s)') args = parser.parse_args() if args.cgi: handler_class = CGIHTTPRequestHandler @@ -1290,4 +1294,5 @@ def finish_request(self, request, client_address): ServerClass=DualStackServer, port=args.port, bind=args.bind, + protocol=args.protocol, ) diff --git a/Misc/NEWS.d/next/Library/2022-01-29-00-23-00.bpo-46285.pt84qm.rst b/Misc/NEWS.d/next/Library/2022-01-29-00-23-00.bpo-46285.pt84qm.rst new file mode 100644 index 0000000000000..83c4990e475d3 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-01-29-00-23-00.bpo-46285.pt84qm.rst @@ -0,0 +1,4 @@ +Add command-line option ``-p``/``--protocol`` to module :mod:`http.server` +which specifies the HTTP version to which the server is conformant (HTTP/1.1 +conformant servers can now be run from the command-line interface of module +:mod:`http.server`). Patch by G?ry Ogam. From webhook-mailer at python.org Mon May 2 18:29:13 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Mon, 02 May 2022 22:29:13 -0000 Subject: [Python-checkins] Delete outdated comment in logging module (#31117) Message-ID: https://github.com/python/cpython/commit/5e9323a54724079796688425dd32f2683f81b56f commit: 5e9323a54724079796688425dd32f2683f81b56f branch: main author: Thomas Miedema committer: JelleZijlstra date: 2022-05-02T16:29:03-06:00 summary: Delete outdated comment in logging module (#31117) The root logger is now accessible via its name, see https://github.com/python/cpython/pull/15077 Co-authored-by: Jelle Zijlstra files: M Lib/logging/__init__.py diff --git a/Lib/logging/__init__.py b/Lib/logging/__init__.py index 432fefcb5b314..79e4b7d09bfa4 100644 --- a/Lib/logging/__init__.py +++ b/Lib/logging/__init__.py @@ -1777,8 +1777,6 @@ def __repr__(self): return '<%s %s (%s)>' % (self.__class__.__name__, self.name, level) def __reduce__(self): - # In general, only the root logger will not be accessible via its name. - # However, the root logger's class has its own __reduce__ method. if getLogger(self.name) is not self: import pickle raise pickle.PicklingError('logger cannot be pickled') From webhook-mailer at python.org Mon May 2 18:32:54 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Mon, 02 May 2022 22:32:54 -0000 Subject: [Python-checkins] bpo-46586: Fix more erroneous doc links to builtins (#31429) Message-ID: https://github.com/python/cpython/commit/cc6ae4f4835f9e76a34f24cd1f666c1cc0fecfa3 commit: cc6ae4f4835f9e76a34f24cd1f666c1cc0fecfa3 branch: main author: Meer Suri <46469858+meersuri at users.noreply.github.com> committer: JelleZijlstra date: 2022-05-02T16:32:44-06:00 summary: bpo-46586: Fix more erroneous doc links to builtins (#31429) Co-authored-by: Jelle Zijlstra Co-authored-by: ?ric files: M Doc/library/fileinput.rst M Doc/library/urllib.request.rst M Doc/library/zipfile.rst diff --git a/Doc/library/fileinput.rst b/Doc/library/fileinput.rst index 2a2c1b3c2b921..4bc868759f202 100644 --- a/Doc/library/fileinput.rst +++ b/Doc/library/fileinput.rst @@ -224,5 +224,5 @@ The two following opening hooks are provided by this module: Added the optional *errors* parameter. .. deprecated:: 3.10 - This function is deprecated since :func:`input` and :class:`FileInput` + This function is deprecated since :func:`fileinput.input` and :class:`FileInput` now have *encoding* and *errors* parameters. diff --git a/Doc/library/urllib.request.rst b/Doc/library/urllib.request.rst index 3823981b37c40..491ef022a1fad 100644 --- a/Doc/library/urllib.request.rst +++ b/Doc/library/urllib.request.rst @@ -739,7 +739,7 @@ The following attribute and methods should only be used by classes derived from This method, if implemented, will be called by the parent :class:`OpenerDirector`. It should return a file-like object as described in - the return value of the :meth:`open` of :class:`OpenerDirector`, or ``None``. + the return value of the :meth:`~OpenerDirector.open` method of :class:`OpenerDirector`, or ``None``. It should raise :exc:`~urllib.error.URLError`, unless a truly exceptional thing happens (for example, :exc:`MemoryError` should not be mapped to :exc:`URLError`). diff --git a/Doc/library/zipfile.rst b/Doc/library/zipfile.rst index d6a1fce49c545..19e128ce02f54 100644 --- a/Doc/library/zipfile.rst +++ b/Doc/library/zipfile.rst @@ -311,7 +311,7 @@ ZipFile Objects compressed text files in :term:`universal newlines` mode. .. versionchanged:: 3.6 - :meth:`open` can now be used to write files into the archive with the + :meth:`ZipFile.open` can now be used to write files into the archive with the ``mode='w'`` option. .. versionchanged:: 3.6 From webhook-mailer at python.org Mon May 2 18:36:46 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Mon, 02 May 2022 22:36:46 -0000 Subject: [Python-checkins] gh-92032: Add soft keywords to rlcompleter (#92029) Message-ID: https://github.com/python/cpython/commit/4bed9c47bd6c581c4c8ab59ab7acf0e57510d1f7 commit: 4bed9c47bd6c581c4c8ab59ab7acf0e57510d1f7 branch: main author: kbeldan committer: JelleZijlstra date: 2022-05-02T16:36:29-06:00 summary: gh-92032: Add soft keywords to rlcompleter (#92029) Let the interpreter autocomplete soft-keywords, ATM the PEP-634 'match' / 'case' / '_' (wildcard pattern). Co-authored-by: Jelle Zijlstra Co-authored-by: Alex Waygood files: A Misc/NEWS.d/next/Core and Builtins/2022-04-28-20-19-49.gh-issue-92032.ef-UfM.rst M Lib/rlcompleter.py M Lib/test/test_rlcompleter.py diff --git a/Lib/rlcompleter.py b/Lib/rlcompleter.py index 98b7930b32fab..4ede6dcce3fea 100644 --- a/Lib/rlcompleter.py +++ b/Lib/rlcompleter.py @@ -117,14 +117,14 @@ def global_matches(self, text): matches = [] seen = {"__builtins__"} n = len(text) - for word in keyword.kwlist: + for word in keyword.kwlist + keyword.softkwlist: if word[:n] == text: seen.add(word) if word in {'finally', 'try'}: word = word + ':' elif word not in {'False', 'None', 'True', 'break', 'continue', 'pass', - 'else'}: + 'else', '_'}: word = word + ' ' matches.append(word) for nspace in [self.namespace, builtins.__dict__]: diff --git a/Lib/test/test_rlcompleter.py b/Lib/test/test_rlcompleter.py index 1f7a6ed3f639e..6b5fc9a0247f4 100644 --- a/Lib/test/test_rlcompleter.py +++ b/Lib/test/test_rlcompleter.py @@ -138,6 +138,9 @@ def test_complete(self): self.assertEqual(completer.complete('el', 0), 'elif ') self.assertEqual(completer.complete('el', 1), 'else') self.assertEqual(completer.complete('tr', 0), 'try:') + self.assertEqual(completer.complete('_', 0), '_') + self.assertEqual(completer.complete('match', 0), 'match ') + self.assertEqual(completer.complete('case', 0), 'case ') def test_duplicate_globals(self): namespace = { diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-04-28-20-19-49.gh-issue-92032.ef-UfM.rst b/Misc/NEWS.d/next/Core and Builtins/2022-04-28-20-19-49.gh-issue-92032.ef-UfM.rst new file mode 100644 index 0000000000000..f6f0db2c50cbc --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-04-28-20-19-49.gh-issue-92032.ef-UfM.rst @@ -0,0 +1,2 @@ +The interpreter can now autocomplete soft keywords, as of now +``match``, ``case``, and ``_`` (wildcard pattern) from :pep:`634`. From webhook-mailer at python.org Mon May 2 18:38:49 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Mon, 02 May 2022 22:38:49 -0000 Subject: [Python-checkins] gh-92106: Add test that subscription works on arbitrary TypedDicts (#92176) Message-ID: https://github.com/python/cpython/commit/81fb3548be5a18bf40a6f4505a02cc7fb72c9c34 commit: 81fb3548be5a18bf40a6f4505a02cc7fb72c9c34 branch: main author: Serhiy Storchaka committer: JelleZijlstra date: 2022-05-02T16:38:39-06:00 summary: gh-92106: Add test that subscription works on arbitrary TypedDicts (#92176) files: M Lib/test/test_typing.py diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index 88be2850acb1c..cb7ca3610b06a 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -6024,6 +6024,19 @@ def test_get_type_hints(self): {'a': typing.Optional[int], 'b': int} ) + def test_non_generic_subscript(self): + # For backward compatibility, subscription works + # on arbitrary TypedDict types. + class TD(TypedDict): + a: T + A = TD[int] + self.assertEqual(A.__origin__, TD) + self.assertEqual(A.__parameters__, ()) + self.assertEqual(A.__args__, (int,)) + a = A(a = 1) + self.assertIs(type(a), dict) + self.assertEqual(a, {'a': 1}) + class RequiredTests(BaseTestCase): From webhook-mailer at python.org Mon May 2 18:41:27 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Mon, 02 May 2022 22:41:27 -0000 Subject: [Python-checkins] bpo-43923: Add support for generic typing.NamedTuple (#92027) Message-ID: https://github.com/python/cpython/commit/b04e02c57f82d6e1ae52ee6f070eb893d019f4fd commit: b04e02c57f82d6e1ae52ee6f070eb893d019f4fd branch: main author: Serhiy Storchaka committer: JelleZijlstra date: 2022-05-02T16:41:23-06:00 summary: bpo-43923: Add support for generic typing.NamedTuple (#92027) files: A Misc/NEWS.d/next/Library/2022-04-28-18-45-58.gh-issue-88089.hu9kRk.rst M Doc/library/typing.rst M Doc/whatsnew/3.11.rst M Lib/test/test_typing.py M Lib/typing.py diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index 868ea1b81be42..05ac05767f32e 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -1615,6 +1615,12 @@ These are not used in annotations. They are building blocks for declaring types. def __repr__(self) -> str: return f'' + ``NamedTuple`` subclasses can be generic:: + + class Group(NamedTuple, Generic[T]): + key: T + group: list[T] + Backward-compatible usage:: Employee = NamedTuple('Employee', [('name', str), ('id', int)]) @@ -1633,6 +1639,9 @@ These are not used in annotations. They are building blocks for declaring types. Removed the ``_field_types`` attribute in favor of the more standard ``__annotations__`` attribute which has the same information. + .. versionchanged:: 3.11 + Added support for generic namedtuples. + .. class:: NewType(name, tp) A helper class to indicate a distinct type to a typechecker, diff --git a/Doc/whatsnew/3.11.rst b/Doc/whatsnew/3.11.rst index 0a8ba1e8843e0..80ce46261f159 100644 --- a/Doc/whatsnew/3.11.rst +++ b/Doc/whatsnew/3.11.rst @@ -715,6 +715,10 @@ For major changes, see :ref:`new-feat-related-type-hints-311`. to clear all registered overloads of a function. (Contributed by Jelle Zijlstra in :gh:`89263`.) +* :class:`~typing.NamedTuple` subclasses can be generic. + (Contributed by Serhiy Storchaka in :issue:`43923`.) + + unicodedata ----------- diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index cb7ca3610b06a..c074e7a780020 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -5678,6 +5678,45 @@ class A: with self.assertRaises(TypeError): class X(NamedTuple, A): x: int + with self.assertRaises(TypeError): + class X(NamedTuple, tuple): + x: int + with self.assertRaises(TypeError): + class X(NamedTuple, NamedTuple): + x: int + class A(NamedTuple): + x: int + with self.assertRaises(TypeError): + class X(NamedTuple, A): + y: str + + def test_generic(self): + class X(NamedTuple, Generic[T]): + x: T + self.assertEqual(X.__bases__, (tuple, Generic)) + self.assertEqual(X.__orig_bases__, (NamedTuple, Generic[T])) + self.assertEqual(X.__mro__, (X, tuple, Generic, object)) + + class Y(Generic[T], NamedTuple): + x: T + self.assertEqual(Y.__bases__, (Generic, tuple)) + self.assertEqual(Y.__orig_bases__, (Generic[T], NamedTuple)) + self.assertEqual(Y.__mro__, (Y, Generic, tuple, object)) + + for G in X, Y: + with self.subTest(type=G): + self.assertEqual(G.__parameters__, (T,)) + A = G[int] + self.assertIs(A.__origin__, G) + self.assertEqual(A.__args__, (int,)) + self.assertEqual(A.__parameters__, ()) + + a = A(3) + self.assertIs(type(a), G) + self.assertEqual(a.x, 3) + + with self.assertRaises(TypeError): + G[int, str] def test_namedtuple_keyword_usage(self): LocalEmployee = NamedTuple("LocalEmployee", name=str, age=int) diff --git a/Lib/typing.py b/Lib/typing.py index 35deb32220eb8..29a3f43881b16 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -2764,7 +2764,12 @@ def _make_nmtuple(name, types, module, defaults = ()): class NamedTupleMeta(type): def __new__(cls, typename, bases, ns): - assert bases[0] is _NamedTuple + assert _NamedTuple in bases + for base in bases: + if base is not _NamedTuple and base is not Generic: + raise TypeError( + 'can only inherit from a NamedTuple type and Generic') + bases = tuple(tuple if base is _NamedTuple else base for base in bases) types = ns.get('__annotations__', {}) default_names = [] for field_name in types: @@ -2778,12 +2783,18 @@ def __new__(cls, typename, bases, ns): nm_tpl = _make_nmtuple(typename, types.items(), defaults=[ns[n] for n in default_names], module=ns['__module__']) + nm_tpl.__bases__ = bases + if Generic in bases: + class_getitem = Generic.__class_getitem__.__func__ + nm_tpl.__class_getitem__ = classmethod(class_getitem) # update from user namespace without overriding special namedtuple attributes for key in ns: if key in _prohibited: raise AttributeError("Cannot overwrite NamedTuple attribute " + key) elif key not in _special and key not in nm_tpl._fields: setattr(nm_tpl, key, ns[key]) + if Generic in bases: + nm_tpl.__init_subclass__() return nm_tpl @@ -2821,9 +2832,7 @@ class Employee(NamedTuple): _NamedTuple = type.__new__(NamedTupleMeta, 'NamedTuple', (), {}) def _namedtuple_mro_entries(bases): - if len(bases) > 1: - raise TypeError("Multiple inheritance with NamedTuple is not supported") - assert bases[0] is NamedTuple + assert NamedTuple in bases return (_NamedTuple,) NamedTuple.__mro_entries__ = _namedtuple_mro_entries diff --git a/Misc/NEWS.d/next/Library/2022-04-28-18-45-58.gh-issue-88089.hu9kRk.rst b/Misc/NEWS.d/next/Library/2022-04-28-18-45-58.gh-issue-88089.hu9kRk.rst new file mode 100644 index 0000000000000..2665a472db627 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-04-28-18-45-58.gh-issue-88089.hu9kRk.rst @@ -0,0 +1 @@ +Add support for generic :class:`typing.NamedTuple`. From webhook-mailer at python.org Mon May 2 18:44:11 2022 From: webhook-mailer at python.org (miss-islington) Date: Mon, 02 May 2022 22:44:11 -0000 Subject: [Python-checkins] bpo-6686: Replace String with Bytes in xml.sax.handler documentation (GH-30612) Message-ID: https://github.com/python/cpython/commit/f44e629a57dae2b29bf22449c915619503894b3b commit: f44e629a57dae2b29bf22449c915619503894b3b branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-02T15:44:07-07:00 summary: bpo-6686: Replace String with Bytes in xml.sax.handler documentation (GH-30612) (cherry picked from commit 32e4f450af3fbcc5c7e186f83ff74e2efe164136) Co-authored-by: Yassir Karroum files: M Doc/library/xml.sax.handler.rst diff --git a/Doc/library/xml.sax.handler.rst b/Doc/library/xml.sax.handler.rst index 59d0d1b3b0117..719ce5ab1bcf6 100644 --- a/Doc/library/xml.sax.handler.rst +++ b/Doc/library/xml.sax.handler.rst @@ -147,7 +147,7 @@ for the feature and property names. .. data:: property_xml_string | value: ``"http://xml.org/sax/properties/xml-string"`` - | data type: String + | data type: Bytes | description: The literal string of characters that was the source for the current event. | access: read-only From webhook-mailer at python.org Mon May 2 18:45:27 2022 From: webhook-mailer at python.org (miss-islington) Date: Mon, 02 May 2022 22:45:27 -0000 Subject: [Python-checkins] bpo-46787: Fix `ProcessPoolExecutor exception` memory leak (GH-31408) (GH-31408) Message-ID: https://github.com/python/cpython/commit/c467812bc0174c12546f7bfdd4f6e445b87590c0 commit: c467812bc0174c12546f7bfdd4f6e445b87590c0 branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-02T15:45:22-07:00 summary: bpo-46787: Fix `ProcessPoolExecutor exception` memory leak (GH-31408) (GH-31408) Do not store `ProcessPoolExecutor` work item exception traceback that prevents exception frame locals from being garbage collected. (cherry picked from commit 9c204b148fad9742ed19b3bce173073cdec79819) Co-authored-by: themylogin files: A Misc/NEWS.d/next/Library/2022-02-18-20-09-29.bpo-46787.juwWc0.rst M Lib/concurrent/futures/process.py diff --git a/Lib/concurrent/futures/process.py b/Lib/concurrent/futures/process.py index 6ee2ce626e456..c03187de85a91 100644 --- a/Lib/concurrent/futures/process.py +++ b/Lib/concurrent/futures/process.py @@ -126,6 +126,9 @@ def __init__(self, exc, tb): tb = traceback.format_exception(type(exc), exc, tb) tb = ''.join(tb) self.exc = exc + # Traceback object needs to be garbage-collected as its frames + # contain references to all the objects in the exception scope + self.exc.__traceback__ = None self.tb = '\n"""\n%s"""' % tb def __reduce__(self): return _rebuild_exc, (self.exc, self.tb) diff --git a/Misc/NEWS.d/next/Library/2022-02-18-20-09-29.bpo-46787.juwWc0.rst b/Misc/NEWS.d/next/Library/2022-02-18-20-09-29.bpo-46787.juwWc0.rst new file mode 100644 index 0000000000000..cf167ff48115b --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-02-18-20-09-29.bpo-46787.juwWc0.rst @@ -0,0 +1 @@ +Fix :class:`concurrent.futures.ProcessPoolExecutor` exception memory leak From webhook-mailer at python.org Mon May 2 18:45:59 2022 From: webhook-mailer at python.org (miss-islington) Date: Mon, 02 May 2022 22:45:59 -0000 Subject: [Python-checkins] bpo-6686: Replace String with Bytes in xml.sax.handler documentation (GH-30612) Message-ID: https://github.com/python/cpython/commit/3fe4e4602ddc84569ea44384812667c0657c9bdb commit: 3fe4e4602ddc84569ea44384812667c0657c9bdb branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-02T15:45:55-07:00 summary: bpo-6686: Replace String with Bytes in xml.sax.handler documentation (GH-30612) (cherry picked from commit 32e4f450af3fbcc5c7e186f83ff74e2efe164136) Co-authored-by: Yassir Karroum files: M Doc/library/xml.sax.handler.rst diff --git a/Doc/library/xml.sax.handler.rst b/Doc/library/xml.sax.handler.rst index ae0877ca90db0..c7831ce3d7636 100644 --- a/Doc/library/xml.sax.handler.rst +++ b/Doc/library/xml.sax.handler.rst @@ -141,7 +141,7 @@ for the feature and property names. .. data:: property_xml_string | value: ``"http://xml.org/sax/properties/xml-string"`` - | data type: String + | data type: Bytes | description: The literal string of characters that was the source for the current event. | access: read-only From webhook-mailer at python.org Mon May 2 18:51:31 2022 From: webhook-mailer at python.org (miss-islington) Date: Mon, 02 May 2022 22:51:31 -0000 Subject: [Python-checkins] bpo-46787: Fix `ProcessPoolExecutor exception` memory leak (GH-31408) (GH-31408) Message-ID: https://github.com/python/cpython/commit/51b885a38a6cbf1d11d3c49e0d2c6532944fcd4d commit: 51b885a38a6cbf1d11d3c49e0d2c6532944fcd4d branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-02T15:51:20-07:00 summary: bpo-46787: Fix `ProcessPoolExecutor exception` memory leak (GH-31408) (GH-31408) Do not store `ProcessPoolExecutor` work item exception traceback that prevents exception frame locals from being garbage collected. (cherry picked from commit 9c204b148fad9742ed19b3bce173073cdec79819) Co-authored-by: themylogin files: A Misc/NEWS.d/next/Library/2022-02-18-20-09-29.bpo-46787.juwWc0.rst M Lib/concurrent/futures/process.py diff --git a/Lib/concurrent/futures/process.py b/Lib/concurrent/futures/process.py index a29e5247ab85c..e574299eb033b 100644 --- a/Lib/concurrent/futures/process.py +++ b/Lib/concurrent/futures/process.py @@ -126,6 +126,9 @@ def __init__(self, exc, tb): tb = traceback.format_exception(type(exc), exc, tb) tb = ''.join(tb) self.exc = exc + # Traceback object needs to be garbage-collected as its frames + # contain references to all the objects in the exception scope + self.exc.__traceback__ = None self.tb = '\n"""\n%s"""' % tb def __reduce__(self): return _rebuild_exc, (self.exc, self.tb) diff --git a/Misc/NEWS.d/next/Library/2022-02-18-20-09-29.bpo-46787.juwWc0.rst b/Misc/NEWS.d/next/Library/2022-02-18-20-09-29.bpo-46787.juwWc0.rst new file mode 100644 index 0000000000000..cf167ff48115b --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-02-18-20-09-29.bpo-46787.juwWc0.rst @@ -0,0 +1 @@ +Fix :class:`concurrent.futures.ProcessPoolExecutor` exception memory leak From webhook-mailer at python.org Mon May 2 18:51:37 2022 From: webhook-mailer at python.org (miss-islington) Date: Mon, 02 May 2022 22:51:37 -0000 Subject: [Python-checkins] bpo-46586: Fix more erroneous doc links to builtins (GH-31429) Message-ID: https://github.com/python/cpython/commit/5f40cb85c22212365caf599665614473ac077143 commit: 5f40cb85c22212365caf599665614473ac077143 branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-02T15:51:33-07:00 summary: bpo-46586: Fix more erroneous doc links to builtins (GH-31429) Co-authored-by: Jelle Zijlstra Co-authored-by: ?ric (cherry picked from commit cc6ae4f4835f9e76a34f24cd1f666c1cc0fecfa3) Co-authored-by: Meer Suri <46469858+meersuri at users.noreply.github.com> files: M Doc/library/fileinput.rst M Doc/library/urllib.request.rst M Doc/library/zipfile.rst diff --git a/Doc/library/fileinput.rst b/Doc/library/fileinput.rst index 19cf7c67754f6..2df895a69c43d 100644 --- a/Doc/library/fileinput.rst +++ b/Doc/library/fileinput.rst @@ -227,5 +227,5 @@ The two following opening hooks are provided by this module: Added the optional *errors* parameter. .. deprecated:: 3.10 - This function is deprecated since :func:`input` and :class:`FileInput` + This function is deprecated since :func:`fileinput.input` and :class:`FileInput` now have *encoding* and *errors* parameters. diff --git a/Doc/library/urllib.request.rst b/Doc/library/urllib.request.rst index 39d1a277aa6c7..63248b3d94f21 100644 --- a/Doc/library/urllib.request.rst +++ b/Doc/library/urllib.request.rst @@ -739,7 +739,7 @@ The following attribute and methods should only be used by classes derived from This method, if implemented, will be called by the parent :class:`OpenerDirector`. It should return a file-like object as described in - the return value of the :meth:`open` of :class:`OpenerDirector`, or ``None``. + the return value of the :meth:`~OpenerDirector.open` method of :class:`OpenerDirector`, or ``None``. It should raise :exc:`~urllib.error.URLError`, unless a truly exceptional thing happens (for example, :exc:`MemoryError` should not be mapped to :exc:`URLError`). diff --git a/Doc/library/zipfile.rst b/Doc/library/zipfile.rst index 43520b697c9d2..f6288709fec1a 100644 --- a/Doc/library/zipfile.rst +++ b/Doc/library/zipfile.rst @@ -289,7 +289,7 @@ ZipFile Objects compressed text files in :term:`universal newlines` mode. .. versionchanged:: 3.6 - :meth:`open` can now be used to write files into the archive with the + :meth:`ZipFile.open` can now be used to write files into the archive with the ``mode='w'`` option. .. versionchanged:: 3.6 From webhook-mailer at python.org Mon May 2 18:51:38 2022 From: webhook-mailer at python.org (brettcannon) Date: Mon, 02 May 2022 22:51:38 -0000 Subject: [Python-checkins] gh-84461: Add ability for multiprocessed libregrtest to use a different Python executable (GH-91930) Message-ID: https://github.com/python/cpython/commit/aff8c4f4884fe5ffb2059c2ac9485ded3bba3f3c commit: aff8c4f4884fe5ffb2059c2ac9485ded3bba3f3c branch: main author: Ethan Smith committer: brettcannon date: 2022-05-02T15:51:34-07:00 summary: gh-84461: Add ability for multiprocessed libregrtest to use a different Python executable (GH-91930) files: A Misc/NEWS.d/next/Tests/2022-05-02-20-15-54.gh-issue-84461.DhxllI.rst M Lib/test/libregrtest/cmdline.py M Lib/test/libregrtest/runtest_mp.py diff --git a/Lib/test/libregrtest/cmdline.py b/Lib/test/libregrtest/cmdline.py index 11fa0f940bb71..1ac63af734c41 100644 --- a/Lib/test/libregrtest/cmdline.py +++ b/Lib/test/libregrtest/cmdline.py @@ -206,6 +206,8 @@ def _create_parser(): group.add_argument('-S', '--start', metavar='START', help='the name of the test at which to start.' + more_details) + group.add_argument('-p', '--python', metavar='PYTHON', + help='Command to run Python test subprocesses with.') group = parser.add_argument_group('Verbosity') group.add_argument('-v', '--verbose', action='count', @@ -370,6 +372,8 @@ def _parse_args(args, **kwargs): parser.error("-s and -f don't go together!") if ns.use_mp is not None and ns.trace: parser.error("-T and -j don't go together!") + if ns.python is not None and ns.use_mp is None: + parser.error("-p requires -j!") if ns.failfast and not (ns.verbose or ns.verbose3): parser.error("-G/--failfast needs either -v or -W") if ns.pgo and (ns.verbose or ns.verbose2 or ns.verbose3): diff --git a/Lib/test/libregrtest/runtest_mp.py b/Lib/test/libregrtest/runtest_mp.py index 75444e48080ce..39fab5566a089 100644 --- a/Lib/test/libregrtest/runtest_mp.py +++ b/Lib/test/libregrtest/runtest_mp.py @@ -2,6 +2,7 @@ import json import os import queue +import shlex import signal import subprocess import sys @@ -55,8 +56,12 @@ def run_test_in_subprocess(testname: str, ns: Namespace) -> subprocess.Popen: ns_dict = vars(ns) worker_args = (ns_dict, testname) worker_args = json.dumps(worker_args) - - cmd = [sys.executable, *support.args_from_interpreter_flags(), + if ns.python is not None: + # The "executable" may be two or more parts, e.g. "node python.js" + executable = shlex.split(ns.python) + else: + executable = [sys.executable] + cmd = [*executable, *support.args_from_interpreter_flags(), '-u', # Unbuffered stdout and stderr '-m', 'test.regrtest', '--worker-args', worker_args] diff --git a/Misc/NEWS.d/next/Tests/2022-05-02-20-15-54.gh-issue-84461.DhxllI.rst b/Misc/NEWS.d/next/Tests/2022-05-02-20-15-54.gh-issue-84461.DhxllI.rst new file mode 100644 index 0000000000000..4daae71060346 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2022-05-02-20-15-54.gh-issue-84461.DhxllI.rst @@ -0,0 +1 @@ +When multiprocessing is enabled, libregrtest can now use a Python executable other than :code:`sys.executable` via the ``--python`` flag. From webhook-mailer at python.org Mon May 2 19:08:33 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Mon, 02 May 2022 23:08:33 -0000 Subject: [Python-checkins] gh-91621: Fix typing.get_type_hints for collections.abc.Callable (#91656) Message-ID: https://github.com/python/cpython/commit/ebb8b512e959ca1a0a506ac0f0faf461b1b2ff85 commit: ebb8b512e959ca1a0a506ac0f0faf461b1b2ff85 branch: main author: Shantanu <12621235+hauntsaninja at users.noreply.github.com> committer: JelleZijlstra date: 2022-05-02T17:08:28-06:00 summary: gh-91621: Fix typing.get_type_hints for collections.abc.Callable (#91656) This mirrors logic in typing.get_args. The trickiness comes from how we flatten args in collections.abc.Callable, see https://bugs.python.org/issue42195 files: A Misc/NEWS.d/next/Library/2022-04-18-18-55-21.gh-issue-91621.ACNlda.rst M Lib/test/test_typing.py M Lib/typing.py diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index c074e7a780020..08f7d0211eafb 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -4876,6 +4876,17 @@ def test_get_type_hints_typeddict(self): 'a': Annotated[Required[int], "a", "b", "c"] }) + def test_get_type_hints_collections_abc_callable(self): + # https://github.com/python/cpython/issues/91621 + P = ParamSpec('P') + def f(x: collections.abc.Callable[[int], int]): ... + def g(x: collections.abc.Callable[..., int]): ... + def h(x: collections.abc.Callable[P, int]): ... + + self.assertEqual(get_type_hints(f), {'x': collections.abc.Callable[[int], int]}) + self.assertEqual(get_type_hints(g), {'x': collections.abc.Callable[..., int]}) + self.assertEqual(get_type_hints(h), {'x': collections.abc.Callable[P, int]}) + class GetUtilitiesTestCase(TestCase): def test_get_origin(self): diff --git a/Lib/typing.py b/Lib/typing.py index 29a3f43881b16..84f0fd1a8a946 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -203,6 +203,24 @@ def _is_param_expr(arg): (tuple, list, ParamSpec, _ConcatenateGenericAlias)) +def _should_unflatten_callable_args(typ, args): + """Internal helper for munging collections.abc.Callable's __args__. + + The canonical representation for a Callable's __args__ flattens the + argument types, see https://bugs.python.org/issue42195. For example: + + collections.abc.Callable[[int, int], str].__args__ == (int, int, str) + collections.abc.Callable[ParamSpec, str].__args__ == (ParamSpec, str) + + As a result, if we need to reconstruct the Callable from its __args__, + we need to unflatten it. + """ + return ( + typ.__origin__ is collections.abc.Callable + and not (len(args) == 2 and _is_param_expr(args[0])) + ) + + def _type_repr(obj): """Return the repr() of an object, special-casing types (internal helper). @@ -351,7 +369,10 @@ def _eval_type(t, globalns, localns, recursive_guard=frozenset()): ForwardRef(arg) if isinstance(arg, str) else arg for arg in t.__args__ ) - t = t.__origin__[args] + if _should_unflatten_callable_args(t, args): + t = t.__origin__[(args[:-1], args[-1])] + else: + t = t.__origin__[args] ev_args = tuple(_eval_type(a, globalns, localns, recursive_guard) for a in t.__args__) if ev_args == t.__args__: return t @@ -2361,8 +2382,7 @@ def get_args(tp): return (tp.__origin__,) + tp.__metadata__ if isinstance(tp, (_GenericAlias, GenericAlias)): res = tp.__args__ - if (tp.__origin__ is collections.abc.Callable - and not (len(res) == 2 and _is_param_expr(res[0]))): + if _should_unflatten_callable_args(tp, res): res = (list(res[:-1]), res[-1]) return res if isinstance(tp, types.UnionType): diff --git a/Misc/NEWS.d/next/Library/2022-04-18-18-55-21.gh-issue-91621.ACNlda.rst b/Misc/NEWS.d/next/Library/2022-04-18-18-55-21.gh-issue-91621.ACNlda.rst new file mode 100644 index 0000000000000..b9e68d225a25b --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-04-18-18-55-21.gh-issue-91621.ACNlda.rst @@ -0,0 +1 @@ +Fix :func:`typing.get_type_hints` for :class:`collections.abc.Callable`. Patch by Shantanu Jain. From webhook-mailer at python.org Mon May 2 19:19:18 2022 From: webhook-mailer at python.org (zooba) Date: Mon, 02 May 2022 23:19:18 -0000 Subject: [Python-checkins] bpo-46785: Fix race condition between os.stat() and unlink on Windows (GH-31858) Message-ID: https://github.com/python/cpython/commit/39e6b8ae6a5b49bb23746fdcc354d148ff2d98e3 commit: 39e6b8ae6a5b49bb23746fdcc354d148ff2d98e3 branch: main author: Itai Steinherz committer: zooba date: 2022-05-03T00:19:13+01:00 summary: bpo-46785: Fix race condition between os.stat() and unlink on Windows (GH-31858) files: A Misc/NEWS.d/next/Windows/2022-03-13-20-35-41.bpo-46785.Pnknyl.rst M Lib/test/test_os.py M Misc/ACKS M Modules/posixmodule.c diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py index 5f73af81d4560..36ad587760d70 100644 --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -24,6 +24,7 @@ import sys import sysconfig import tempfile +import textwrap import time import types import unittest @@ -2883,6 +2884,49 @@ def test_getfinalpathname_handles(self): self.assertEqual(0, handle_delta) + @support.requires_subprocess() + def test_stat_unlink_race(self): + # bpo-46785: the implementation of os.stat() falls back to reading + # the parent directory if CreateFileW() fails with a permission + # error. If reading the parent directory fails because the file or + # directory are subsequently unlinked, or because the volume or + # share are no longer available, then the original permission error + # should not be restored. + filename = os_helper.TESTFN + self.addCleanup(os_helper.unlink, filename) + deadline = time.time() + 5 + command = textwrap.dedent("""\ + import os + import sys + import time + + filename = sys.argv[1] + deadline = float(sys.argv[2]) + + while time.time() < deadline: + try: + with open(filename, "w") as f: + pass + except OSError: + pass + try: + os.remove(filename) + except OSError: + pass + """) + + with subprocess.Popen([sys.executable, '-c', command, filename, str(deadline)]) as proc: + while time.time() < deadline: + try: + os.stat(filename) + except FileNotFoundError as e: + assert e.winerror == 2 # ERROR_FILE_NOT_FOUND + try: + proc.wait(1) + except subprocess.TimeoutExpired: + proc.terminate() + + @os_helper.skip_unless_symlink class NonLocalSymlinkTests(unittest.TestCase): diff --git a/Misc/ACKS b/Misc/ACKS index 5e66a2e757adf..30b698f90e83b 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1705,6 +1705,7 @@ Anthony Starks David Steele Oliver Steele Greg Stein +Itai Steinherz Marek Stepniowski Baruch Sterin Chris Stern diff --git a/Misc/NEWS.d/next/Windows/2022-03-13-20-35-41.bpo-46785.Pnknyl.rst b/Misc/NEWS.d/next/Windows/2022-03-13-20-35-41.bpo-46785.Pnknyl.rst new file mode 100644 index 0000000000000..0a87abd77c8ff --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2022-03-13-20-35-41.bpo-46785.Pnknyl.rst @@ -0,0 +1 @@ +Fix race condition between :func:`os.stat` and unlinking a file on Windows, by using errors codes returned by ``FindFirstFileW()`` when appropriate in ``win32_xstat_impl``. diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index a2ea5079969e9..a7f57804687cd 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -1890,7 +1890,17 @@ win32_xstat_impl(const wchar_t *path, struct _Py_stat_struct *result, /* Try reading the parent directory. */ if (!attributes_from_dir(path, &fileInfo, &tagInfo.ReparseTag)) { /* Cannot read the parent directory. */ - SetLastError(error); + switch (GetLastError()) { + case ERROR_FILE_NOT_FOUND: /* File cannot be found */ + case ERROR_PATH_NOT_FOUND: /* File parent directory cannot be found */ + case ERROR_NOT_READY: /* Drive exists but unavailable */ + case ERROR_BAD_NET_NAME: /* Remote drive unavailable */ + break; + /* Restore the error from CreateFileW(). */ + default: + SetLastError(error); + } + return -1; } if (fileInfo.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) { From webhook-mailer at python.org Mon May 2 20:39:28 2022 From: webhook-mailer at python.org (miss-islington) Date: Tue, 03 May 2022 00:39:28 -0000 Subject: [Python-checkins] gh-92106: Add test that subscription works on arbitrary TypedDicts (GH-92176) Message-ID: https://github.com/python/cpython/commit/adc06cd2d727d580cfeda1fc29b419ecce379687 commit: adc06cd2d727d580cfeda1fc29b419ecce379687 branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-02T17:39:07-07:00 summary: gh-92106: Add test that subscription works on arbitrary TypedDicts (GH-92176) (cherry picked from commit 81fb3548be5a18bf40a6f4505a02cc7fb72c9c34) Co-authored-by: Serhiy Storchaka files: M Lib/test/test_typing.py diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index 779e1758d51d8..111a207dd10b3 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -4485,6 +4485,19 @@ def test_get_type_hints(self): {'a': typing.Optional[int], 'b': int} ) + def test_non_generic_subscript(self): + # For backward compatibility, subscription works + # on arbitrary TypedDict types. + class TD(TypedDict): + a: T + A = TD[int] + self.assertEqual(A.__origin__, TD) + self.assertEqual(A.__parameters__, ()) + self.assertEqual(A.__args__, (int,)) + a = A(a = 1) + self.assertIs(type(a), dict) + self.assertEqual(a, {'a': 1}) + class IOTests(BaseTestCase): From webhook-mailer at python.org Mon May 2 21:06:13 2022 From: webhook-mailer at python.org (miss-islington) Date: Tue, 03 May 2022 01:06:13 -0000 Subject: [Python-checkins] gh-92106: Add test that subscription works on arbitrary TypedDicts (GH-92176) Message-ID: https://github.com/python/cpython/commit/7e55730e3f0a0c8c1b73037011e4b00dd7bd7f69 commit: 7e55730e3f0a0c8c1b73037011e4b00dd7bd7f69 branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-02T18:05:49-07:00 summary: gh-92106: Add test that subscription works on arbitrary TypedDicts (GH-92176) (cherry picked from commit 81fb3548be5a18bf40a6f4505a02cc7fb72c9c34) Co-authored-by: Serhiy Storchaka files: M Lib/test/test_typing.py diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index 08eddb095d561..3fec59a879141 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -4076,6 +4076,19 @@ def test_get_type_hints(self): {'a': typing.Optional[int], 'b': int} ) + def test_non_generic_subscript(self): + # For backward compatibility, subscription works + # on arbitrary TypedDict types. + class TD(TypedDict): + a: T + A = TD[int] + self.assertEqual(A.__origin__, TD) + self.assertEqual(A.__parameters__, ()) + self.assertEqual(A.__args__, (int,)) + a = A(a = 1) + self.assertIs(type(a), dict) + self.assertEqual(a, {'a': 1}) + class IOTests(BaseTestCase): From webhook-mailer at python.org Mon May 2 23:45:34 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Tue, 03 May 2022 03:45:34 -0000 Subject: [Python-checkins] gh-92206: Move pysqlite_step() to Modules/_sqlite/cursor.c (#92207) Message-ID: https://github.com/python/cpython/commit/e846fe3fc189ff54413382611ee36e41c2f0776b commit: e846fe3fc189ff54413382611ee36e41c2f0776b branch: main author: Erlend Egeberg Aasland committer: JelleZijlstra date: 2022-05-02T21:45:04-06:00 summary: gh-92206: Move pysqlite_step() to Modules/_sqlite/cursor.c (#92207) files: M Modules/_sqlite/cursor.c M Modules/_sqlite/util.c M Modules/_sqlite/util.h diff --git a/Modules/_sqlite/cursor.c b/Modules/_sqlite/cursor.c index e48a95867298b..861704f95cc83 100644 --- a/Modules/_sqlite/cursor.c +++ b/Modules/_sqlite/cursor.c @@ -454,6 +454,18 @@ get_statement_from_cache(pysqlite_Cursor *self, PyObject *operation) return PyObject_Vectorcall(cache, args + 1, nargsf, NULL); } +static inline int +stmt_step(sqlite3_stmt *statement) +{ + int rc; + + Py_BEGIN_ALLOW_THREADS + rc = sqlite3_step(statement); + Py_END_ALLOW_THREADS + + return rc; +} + PyObject * _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject* operation, PyObject* second_argument) { @@ -570,7 +582,7 @@ _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject* operation goto error; } - rc = pysqlite_step(self->statement->st); + rc = stmt_step(self->statement->st); if (rc != SQLITE_DONE && rc != SQLITE_ROW) { if (PyErr_Occurred()) { /* there was an error that occurred in a user-defined callback */ @@ -799,7 +811,7 @@ pysqlite_cursor_iternext(pysqlite_Cursor *self) if (row == NULL) { return NULL; } - int rc = pysqlite_step(stmt); + int rc = stmt_step(stmt); if (rc == SQLITE_DONE) { (void)pysqlite_statement_reset(self->statement); } diff --git a/Modules/_sqlite/util.c b/Modules/_sqlite/util.c index 113b581bfac73..37b2dd6cb29f4 100644 --- a/Modules/_sqlite/util.c +++ b/Modules/_sqlite/util.c @@ -24,18 +24,6 @@ #include "module.h" #include "connection.h" -int -pysqlite_step(sqlite3_stmt *statement) -{ - int rc; - - Py_BEGIN_ALLOW_THREADS - rc = sqlite3_step(statement); - Py_END_ALLOW_THREADS - - return rc; -} - // Returns non-NULL if a new exception should be raised static PyObject * get_exception_class(pysqlite_state *state, int errorcode) diff --git a/Modules/_sqlite/util.h b/Modules/_sqlite/util.h index 5eee3fac6f114..a22bcd82d2a05 100644 --- a/Modules/_sqlite/util.h +++ b/Modules/_sqlite/util.h @@ -29,8 +29,6 @@ #include "sqlite3.h" #include "connection.h" -int pysqlite_step(sqlite3_stmt *statement); - /** * Checks the SQLite error code and sets the appropriate DB-API exception. * Returns the error code (0 means no error occurred). From webhook-mailer at python.org Tue May 3 01:11:10 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Tue, 03 May 2022 05:11:10 -0000 Subject: [Python-checkins] bpo-46267: Test compresslevel in gzip.compress (#30416) Message-ID: https://github.com/python/cpython/commit/a73fc73ff7586b09d68a330760d06862f5bafb9b commit: a73fc73ff7586b09d68a330760d06862f5bafb9b branch: main author: Ruben Vorderman committer: JelleZijlstra date: 2022-05-02T23:11:06-06:00 summary: bpo-46267: Test compresslevel in gzip.compress (#30416) Fixes #90425 files: M Lib/test/test_gzip.py diff --git a/Lib/test/test_gzip.py b/Lib/test/test_gzip.py index 497e66cd553b7..6de413e5056ef 100644 --- a/Lib/test/test_gzip.py +++ b/Lib/test/test_gzip.py @@ -552,6 +552,15 @@ def test_compress_mtime(self): f.read(1) # to set mtime attribute self.assertEqual(f.mtime, mtime) + def test_compress_correct_level(self): + # gzip.compress calls with mtime == 0 take a different code path. + for mtime in (0, 42): + with self.subTest(mtime=mtime): + nocompress = gzip.compress(data1, compresslevel=0, mtime=mtime) + yescompress = gzip.compress(data1, compresslevel=1, mtime=mtime) + self.assertIn(data1, nocompress) + self.assertNotIn(data1, yescompress) + def test_decompress(self): for data in (data1, data2): buf = io.BytesIO() From webhook-mailer at python.org Tue May 3 02:49:17 2022 From: webhook-mailer at python.org (Fidget-Spinner) Date: Tue, 03 May 2022 06:49:17 -0000 Subject: [Python-checkins] Fix doc warnings in What's New in 3.11 (GH-92215) Message-ID: https://github.com/python/cpython/commit/c1767fce521f5d4f175082d0747cfa48542aea3a commit: c1767fce521f5d4f175082d0747cfa48542aea3a branch: main author: Ken Jin committer: Fidget-Spinner date: 2022-05-03T14:49:06+08:00 summary: Fix doc warnings in What's New in 3.11 (GH-92215) files: M Doc/whatsnew/3.11.rst diff --git a/Doc/whatsnew/3.11.rst b/Doc/whatsnew/3.11.rst index 80ce46261f159..607f2e749bb5a 100644 --- a/Doc/whatsnew/3.11.rst +++ b/Doc/whatsnew/3.11.rst @@ -1396,7 +1396,7 @@ C API Changes fields of the result from the exception instance (the ``value`` field). (Contributed by Irit Katriel in :issue:`45711`.) -* :c:struct:`_frozen` has a new ``is_package`` field to indicate whether +* :c:type:`_frozen` has a new ``is_package`` field to indicate whether or not the frozen module is a package. Previously, a negative value in the ``size`` field was the indicator. Now only non-negative values be used for ``size``. From webhook-mailer at python.org Tue May 3 03:18:06 2022 From: webhook-mailer at python.org (serhiy-storchaka) Date: Tue, 03 May 2022 07:18:06 -0000 Subject: [Python-checkins] gh-92169: Use warnings_helper.import_deprecated() to import deprecated modules uniformly in tests (GH-92170) Message-ID: https://github.com/python/cpython/commit/9b027d4cea57e98c76f5176cc3188dc81603356c commit: 9b027d4cea57e98c76f5176cc3188dc81603356c branch: main author: Hugo van Kemenade committer: serhiy-storchaka date: 2022-05-03T10:17:54+03:00 summary: gh-92169: Use warnings_helper.import_deprecated() to import deprecated modules uniformly in tests (GH-92170) files: A Misc/NEWS.d/next/Tests/2022-05-02-20-57-04.gh-issue-92169.Xi4NGV.rst M Lib/test/test_asynchat.py M Lib/test/test_asyncore.py M Lib/test/test_ftplib.py M Lib/test/test_imp.py M Lib/test/test_logging.py M Lib/test/test_poplib.py M Lib/test/test_smtpd.py M Lib/test/test_smtplib.py M Lib/test/test_ssl.py diff --git a/Lib/test/test_asynchat.py b/Lib/test/test_asynchat.py index d28d67732e788..9d08bd02968fd 100644 --- a/Lib/test/test_asynchat.py +++ b/Lib/test/test_asynchat.py @@ -3,6 +3,7 @@ from test import support from test.support import socket_helper from test.support import threading_helper +from test.support import warnings_helper import errno import socket @@ -12,11 +13,9 @@ import unittest import unittest.mock -import warnings -with warnings.catch_warnings(): - warnings.simplefilter('ignore', DeprecationWarning) - import asynchat - import asyncore + +asynchat = warnings_helper.import_deprecated('asynchat') +asyncore = warnings_helper.import_deprecated('asyncore') support.requires_working_socket(module=True) diff --git a/Lib/test/test_asyncore.py b/Lib/test/test_asyncore.py index e3f31bd06d0c3..98ccd3a9304de 100644 --- a/Lib/test/test_asyncore.py +++ b/Lib/test/test_asyncore.py @@ -20,10 +20,7 @@ support.requires_working_socket(module=True) -import warnings -with warnings.catch_warnings(): - warnings.simplefilter('ignore', DeprecationWarning) - import asyncore +asyncore = warnings_helper.import_deprecated('asyncore') HAS_UNIX_SOCKETS = hasattr(socket, 'AF_UNIX') diff --git a/Lib/test/test_ftplib.py b/Lib/test/test_ftplib.py index 2794fccfe7c72..082a90d46baed 100644 --- a/Lib/test/test_ftplib.py +++ b/Lib/test/test_ftplib.py @@ -23,11 +23,10 @@ from test.support import warnings_helper from test.support.socket_helper import HOST, HOSTv6 -import warnings -with warnings.catch_warnings(): - warnings.simplefilter('ignore', DeprecationWarning) - import asyncore - import asynchat + +asynchat = warnings_helper.import_deprecated('asynchat') +asyncore = warnings_helper.import_deprecated('asyncore') + support.requires_working_socket(module=True) diff --git a/Lib/test/test_imp.py b/Lib/test/test_imp.py index 35e9a2a186552..d44dc6b49f293 100644 --- a/Lib/test/test_imp.py +++ b/Lib/test/test_imp.py @@ -8,11 +8,10 @@ from test.support import import_helper from test.support import os_helper from test.support import script_helper +from test.support import warnings_helper import unittest import warnings -with warnings.catch_warnings(): - warnings.simplefilter('ignore', DeprecationWarning) - import imp +imp = warnings_helper.import_deprecated('imp') import _imp diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py index 7555f05d1d0cf..5d4ddedd059fc 100644 --- a/Lib/test/test_logging.py +++ b/Lib/test/test_logging.py @@ -60,10 +60,10 @@ from socketserver import (ThreadingUDPServer, DatagramRequestHandler, ThreadingTCPServer, StreamRequestHandler) -with warnings.catch_warnings(): - warnings.simplefilter('ignore', DeprecationWarning) - import asyncore - import smtpd + +asyncore = warnings_helper.import_deprecated('asyncore') +smtpd = warnings_helper.import_deprecated('smtpd') + try: import win32evtlog, win32evtlogutil, pywintypes diff --git a/Lib/test/test_poplib.py b/Lib/test/test_poplib.py index 57ccc541b81fe..5ad9202433dcf 100644 --- a/Lib/test/test_poplib.py +++ b/Lib/test/test_poplib.py @@ -15,12 +15,12 @@ from test.support import hashlib_helper from test.support import socket_helper from test.support import threading_helper +from test.support import warnings_helper + + +asynchat = warnings_helper.import_deprecated('asynchat') +asyncore = warnings_helper.import_deprecated('asyncore') -import warnings -with warnings.catch_warnings(): - warnings.simplefilter('ignore', DeprecationWarning) - import asynchat - import asyncore test_support.requires_working_socket(module=True) diff --git a/Lib/test/test_smtpd.py b/Lib/test/test_smtpd.py index d2e150d535ff6..57eb98ebc1d1e 100644 --- a/Lib/test/test_smtpd.py +++ b/Lib/test/test_smtpd.py @@ -6,11 +6,9 @@ import socket import io -import warnings -with warnings.catch_warnings(): - warnings.simplefilter('ignore', DeprecationWarning) - import smtpd - import asyncore + +smtpd = warnings_helper.import_deprecated('smtpd') +asyncore = warnings_helper.import_deprecated('asyncore') class DummyServer(smtpd.SMTPServer): diff --git a/Lib/test/test_smtplib.py b/Lib/test/test_smtplib.py index e798645a5ca66..a4074c02f1926 100644 --- a/Lib/test/test_smtplib.py +++ b/Lib/test/test_smtplib.py @@ -21,13 +21,13 @@ from test.support import hashlib_helper from test.support import socket_helper from test.support import threading_helper +from test.support import warnings_helper from unittest.mock import Mock -import warnings -with warnings.catch_warnings(): - warnings.simplefilter('ignore', DeprecationWarning) - import asyncore - import smtpd + +asyncore = warnings_helper.import_deprecated('asyncore') +smtpd = warnings_helper.import_deprecated('smtpd') + support.requires_working_socket(module=True) diff --git a/Lib/test/test_ssl.py b/Lib/test/test_ssl.py index 543d34a546933..0eb8d18b3561e 100644 --- a/Lib/test/test_ssl.py +++ b/Lib/test/test_ssl.py @@ -12,7 +12,6 @@ import socket import select import time -import datetime import enum import gc import os @@ -30,10 +29,9 @@ except ImportError: ctypes = None -import warnings -with warnings.catch_warnings(): - warnings.simplefilter('ignore', DeprecationWarning) - import asyncore + +asyncore = warnings_helper.import_deprecated('asyncore') + ssl = import_helper.import_module("ssl") import _ssl diff --git a/Misc/NEWS.d/next/Tests/2022-05-02-20-57-04.gh-issue-92169.Xi4NGV.rst b/Misc/NEWS.d/next/Tests/2022-05-02-20-57-04.gh-issue-92169.Xi4NGV.rst new file mode 100644 index 0000000000000..3809ed4f5a1a1 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2022-05-02-20-57-04.gh-issue-92169.Xi4NGV.rst @@ -0,0 +1,2 @@ +Use ``warnings_helper.import_deprecated()`` to import deprecated modules +uniformly in tests. Patch by Hugo van Kemenade. From webhook-mailer at python.org Tue May 3 04:41:56 2022 From: webhook-mailer at python.org (rhettinger) Date: Tue, 03 May 2022 08:41:56 -0000 Subject: [Python-checkins] The stdev calculation is more accurate computing its own mean (#92220) Message-ID: https://github.com/python/cpython/commit/ec8d3adb99f1ad93786fed5c1def5119b6ec73c0 commit: ec8d3adb99f1ad93786fed5c1def5119b6ec73c0 branch: main author: Raymond Hettinger committer: rhettinger date: 2022-05-03T03:41:46-05:00 summary: The stdev calculation is more accurate computing its own mean (#92220) files: M Lib/statistics.py diff --git a/Lib/statistics.py b/Lib/statistics.py index f3bc9a1f34639..6e6d62c4a0e26 100644 --- a/Lib/statistics.py +++ b/Lib/statistics.py @@ -1173,8 +1173,7 @@ def from_samples(cls, data): "Make a normal distribution instance from sample data." if not isinstance(data, (list, tuple)): data = list(data) - xbar = fmean(data) - return cls(xbar, stdev(data, xbar)) + return cls(mean(data), stdev(data)) def samples(self, n, *, seed=None): "Generate *n* samples for a given mean and standard deviation." From webhook-mailer at python.org Tue May 3 04:53:57 2022 From: webhook-mailer at python.org (serhiy-storchaka) Date: Tue, 03 May 2022 08:53:57 -0000 Subject: [Python-checkins] [3.10] gh-91583: AC: Fix regression for functions with defining_class (GH-91739) (GH-92079) Message-ID: https://github.com/python/cpython/commit/62ddbbcfafc98aaa4d0345bba56f7d6cd346c83f commit: 62ddbbcfafc98aaa4d0345bba56f7d6cd346c83f branch: 3.10 author: Serhiy Storchaka committer: serhiy-storchaka date: 2022-05-03T11:53:46+03:00 summary: [3.10] gh-91583: AC: Fix regression for functions with defining_class (GH-91739) (GH-92079) Argument Clinic now generates the same efficient code as before adding the defining_class parameter. (cherry picked from commit a055dac0b45031878a8196a8735522de018491e3) files: A Misc/NEWS.d/next/Tools-Demos/2022-04-20-14-26-14.gh-issue-91583.200qI0.rst M Modules/clinic/_curses_panel.c.h M Modules/clinic/_dbmmodule.c.h M Modules/clinic/_gdbmmodule.c.h M Modules/clinic/_lsprof.c.h M Modules/clinic/_queuemodule.c.h M Modules/clinic/_sre.c.h M Modules/clinic/_testmultiphase.c.h M Modules/clinic/arraymodule.c.h M Modules/clinic/md5module.c.h M Modules/clinic/posixmodule.c.h M Modules/clinic/pyexpat.c.h M Modules/clinic/sha1module.c.h M Modules/clinic/sha256module.c.h M Modules/clinic/sha512module.c.h M Modules/clinic/zlibmodule.c.h M Tools/clinic/clinic.py diff --git a/Misc/NEWS.d/next/Tools-Demos/2022-04-20-14-26-14.gh-issue-91583.200qI0.rst b/Misc/NEWS.d/next/Tools-Demos/2022-04-20-14-26-14.gh-issue-91583.200qI0.rst new file mode 100644 index 0000000000000..bdfa71100f95a --- /dev/null +++ b/Misc/NEWS.d/next/Tools-Demos/2022-04-20-14-26-14.gh-issue-91583.200qI0.rst @@ -0,0 +1,2 @@ +Fix regression in the code generated by Argument Clinic for functions with +the ``defining_class`` parameter. diff --git a/Modules/clinic/_curses_panel.c.h b/Modules/clinic/_curses_panel.c.h index 45898070b1f54..e4642b58332de 100644 --- a/Modules/clinic/_curses_panel.c.h +++ b/Modules/clinic/_curses_panel.c.h @@ -17,18 +17,11 @@ _curses_panel_panel_bottom_impl(PyCursesPanelObject *self, PyTypeObject *cls); static PyObject * _curses_panel_panel_bottom(PyCursesPanelObject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { - PyObject *return_value = NULL; - static const char * const _keywords[] = { NULL}; - static _PyArg_Parser _parser = {":bottom", _keywords, 0}; - - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser - )) { - goto exit; + if (nargs) { + PyErr_SetString(PyExc_TypeError, "bottom() takes no arguments"); + return NULL; } - return_value = _curses_panel_panel_bottom_impl(self, cls); - -exit: - return return_value; + return _curses_panel_panel_bottom_impl(self, cls); } PyDoc_STRVAR(_curses_panel_panel_hide__doc__, @@ -48,18 +41,11 @@ _curses_panel_panel_hide_impl(PyCursesPanelObject *self, PyTypeObject *cls); static PyObject * _curses_panel_panel_hide(PyCursesPanelObject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { - PyObject *return_value = NULL; - static const char * const _keywords[] = { NULL}; - static _PyArg_Parser _parser = {":hide", _keywords, 0}; - - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser - )) { - goto exit; + if (nargs) { + PyErr_SetString(PyExc_TypeError, "hide() takes no arguments"); + return NULL; } - return_value = _curses_panel_panel_hide_impl(self, cls); - -exit: - return return_value; + return _curses_panel_panel_hide_impl(self, cls); } PyDoc_STRVAR(_curses_panel_panel_show__doc__, @@ -77,18 +63,11 @@ _curses_panel_panel_show_impl(PyCursesPanelObject *self, PyTypeObject *cls); static PyObject * _curses_panel_panel_show(PyCursesPanelObject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { - PyObject *return_value = NULL; - static const char * const _keywords[] = { NULL}; - static _PyArg_Parser _parser = {":show", _keywords, 0}; - - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser - )) { - goto exit; + if (nargs) { + PyErr_SetString(PyExc_TypeError, "show() takes no arguments"); + return NULL; } - return_value = _curses_panel_panel_show_impl(self, cls); - -exit: - return return_value; + return _curses_panel_panel_show_impl(self, cls); } PyDoc_STRVAR(_curses_panel_panel_top__doc__, @@ -106,18 +85,11 @@ _curses_panel_panel_top_impl(PyCursesPanelObject *self, PyTypeObject *cls); static PyObject * _curses_panel_panel_top(PyCursesPanelObject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { - PyObject *return_value = NULL; - static const char * const _keywords[] = { NULL}; - static _PyArg_Parser _parser = {":top", _keywords, 0}; - - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser - )) { - goto exit; + if (nargs) { + PyErr_SetString(PyExc_TypeError, "top() takes no arguments"); + return NULL; } - return_value = _curses_panel_panel_top_impl(self, cls); - -exit: - return return_value; + return _curses_panel_panel_top_impl(self, cls); } PyDoc_STRVAR(_curses_panel_panel_above__doc__, @@ -192,12 +164,21 @@ _curses_panel_panel_move(PyCursesPanelObject *self, PyTypeObject *cls, PyObject { PyObject *return_value = NULL; static const char * const _keywords[] = {"", "", NULL}; - static _PyArg_Parser _parser = {"ii:move", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "move", 0}; + PyObject *argsbuf[2]; int y; int x; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &y, &x)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, argsbuf); + if (!args) { + goto exit; + } + y = _PyLong_AsInt(args[0]); + if (y == -1 && PyErr_Occurred()) { + goto exit; + } + x = _PyLong_AsInt(args[1]); + if (x == -1 && PyErr_Occurred()) { goto exit; } return_value = _curses_panel_panel_move_impl(self, cls, y, x); @@ -243,13 +224,19 @@ _curses_panel_panel_replace(PyCursesPanelObject *self, PyTypeObject *cls, PyObje { PyObject *return_value = NULL; static const char * const _keywords[] = {"", NULL}; - static _PyArg_Parser _parser = {"O!:replace", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "replace", 0}; + PyObject *argsbuf[1]; PyCursesWindowObject *win; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &PyCursesWindow_Type, &win)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { + goto exit; + } + if (!PyObject_TypeCheck(args[0], &PyCursesWindow_Type)) { + _PyArg_BadArgument("replace", "argument 1", (&PyCursesWindow_Type)->tp_name, args[0]); goto exit; } + win = (PyCursesWindowObject *)args[0]; return_value = _curses_panel_panel_replace_impl(self, cls, win); exit: @@ -274,13 +261,15 @@ _curses_panel_panel_set_userptr(PyCursesPanelObject *self, PyTypeObject *cls, Py { PyObject *return_value = NULL; static const char * const _keywords[] = {"", NULL}; - static _PyArg_Parser _parser = {"O:set_userptr", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "set_userptr", 0}; + PyObject *argsbuf[1]; PyObject *obj; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &obj)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { goto exit; } + obj = args[0]; return_value = _curses_panel_panel_set_userptr_impl(self, cls, obj); exit: @@ -303,18 +292,11 @@ _curses_panel_panel_userptr_impl(PyCursesPanelObject *self, static PyObject * _curses_panel_panel_userptr(PyCursesPanelObject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { - PyObject *return_value = NULL; - static const char * const _keywords[] = { NULL}; - static _PyArg_Parser _parser = {":userptr", _keywords, 0}; - - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser - )) { - goto exit; + if (nargs) { + PyErr_SetString(PyExc_TypeError, "userptr() takes no arguments"); + return NULL; } - return_value = _curses_panel_panel_userptr_impl(self, cls); - -exit: - return return_value; + return _curses_panel_panel_userptr_impl(self, cls); } PyDoc_STRVAR(_curses_panel_bottom_panel__doc__, @@ -401,4 +383,4 @@ _curses_panel_update_panels(PyObject *module, PyObject *Py_UNUSED(ignored)) { return _curses_panel_update_panels_impl(module); } -/*[clinic end generated code: output=3081ef24e5560cb0 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=c552457e8067bb0a input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_dbmmodule.c.h b/Modules/clinic/_dbmmodule.c.h index af288c2586a10..beb26f612026b 100644 --- a/Modules/clinic/_dbmmodule.c.h +++ b/Modules/clinic/_dbmmodule.c.h @@ -35,18 +35,11 @@ _dbm_dbm_keys_impl(dbmobject *self, PyTypeObject *cls); static PyObject * _dbm_dbm_keys(dbmobject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { - PyObject *return_value = NULL; - static const char * const _keywords[] = { NULL}; - static _PyArg_Parser _parser = {":keys", _keywords, 0}; - - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser - )) { - goto exit; + if (nargs) { + PyErr_SetString(PyExc_TypeError, "keys() takes no arguments"); + return NULL; } - return_value = _dbm_dbm_keys_impl(self, cls); - -exit: - return return_value; + return _dbm_dbm_keys_impl(self, cls); } PyDoc_STRVAR(_dbm_dbm_get__doc__, @@ -187,4 +180,4 @@ dbmopen(PyObject *module, PyObject *const *args, Py_ssize_t nargs) exit: return return_value; } -/*[clinic end generated code: output=6947b1115df66f7c input=a9049054013a1b77]*/ +/*[clinic end generated code: output=a4599b89ce338b08 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_gdbmmodule.c.h b/Modules/clinic/_gdbmmodule.c.h index ea4ee7df001c1..630cb499ae14f 100644 --- a/Modules/clinic/_gdbmmodule.c.h +++ b/Modules/clinic/_gdbmmodule.c.h @@ -104,18 +104,11 @@ _gdbm_gdbm_keys_impl(gdbmobject *self, PyTypeObject *cls); static PyObject * _gdbm_gdbm_keys(gdbmobject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { - PyObject *return_value = NULL; - static const char * const _keywords[] = { NULL}; - static _PyArg_Parser _parser = {":keys", _keywords, 0}; - - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser - )) { - goto exit; + if (nargs) { + PyErr_SetString(PyExc_TypeError, "keys() takes no arguments"); + return NULL; } - return_value = _gdbm_gdbm_keys_impl(self, cls); - -exit: - return return_value; + return _gdbm_gdbm_keys_impl(self, cls); } PyDoc_STRVAR(_gdbm_gdbm_firstkey__doc__, @@ -137,18 +130,11 @@ _gdbm_gdbm_firstkey_impl(gdbmobject *self, PyTypeObject *cls); static PyObject * _gdbm_gdbm_firstkey(gdbmobject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { - PyObject *return_value = NULL; - static const char * const _keywords[] = { NULL}; - static _PyArg_Parser _parser = {":firstkey", _keywords, 0}; - - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser - )) { - goto exit; + if (nargs) { + PyErr_SetString(PyExc_TypeError, "firstkey() takes no arguments"); + return NULL; } - return_value = _gdbm_gdbm_firstkey_impl(self, cls); - -exit: - return return_value; + return _gdbm_gdbm_firstkey_impl(self, cls); } PyDoc_STRVAR(_gdbm_gdbm_nextkey__doc__, @@ -212,18 +198,11 @@ _gdbm_gdbm_reorganize_impl(gdbmobject *self, PyTypeObject *cls); static PyObject * _gdbm_gdbm_reorganize(gdbmobject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { - PyObject *return_value = NULL; - static const char * const _keywords[] = { NULL}; - static _PyArg_Parser _parser = {":reorganize", _keywords, 0}; - - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser - )) { - goto exit; + if (nargs) { + PyErr_SetString(PyExc_TypeError, "reorganize() takes no arguments"); + return NULL; } - return_value = _gdbm_gdbm_reorganize_impl(self, cls); - -exit: - return return_value; + return _gdbm_gdbm_reorganize_impl(self, cls); } PyDoc_STRVAR(_gdbm_gdbm_sync__doc__, @@ -244,18 +223,11 @@ _gdbm_gdbm_sync_impl(gdbmobject *self, PyTypeObject *cls); static PyObject * _gdbm_gdbm_sync(gdbmobject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { - PyObject *return_value = NULL; - static const char * const _keywords[] = { NULL}; - static _PyArg_Parser _parser = {":sync", _keywords, 0}; - - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser - )) { - goto exit; + if (nargs) { + PyErr_SetString(PyExc_TypeError, "sync() takes no arguments"); + return NULL; } - return_value = _gdbm_gdbm_sync_impl(self, cls); - -exit: - return return_value; + return _gdbm_gdbm_sync_impl(self, cls); } PyDoc_STRVAR(dbmopen__doc__, @@ -340,4 +312,4 @@ dbmopen(PyObject *module, PyObject *const *args, Py_ssize_t nargs) exit: return return_value; } -/*[clinic end generated code: output=3b88446433e43d96 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=125f5bc685304744 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_lsprof.c.h b/Modules/clinic/_lsprof.c.h index 5d9c209eab856..b0adb746974ab 100644 --- a/Modules/clinic/_lsprof.c.h +++ b/Modules/clinic/_lsprof.c.h @@ -39,17 +39,10 @@ _lsprof_Profiler_getstats_impl(ProfilerObject *self, PyTypeObject *cls); static PyObject * _lsprof_Profiler_getstats(ProfilerObject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { - PyObject *return_value = NULL; - static const char * const _keywords[] = { NULL}; - static _PyArg_Parser _parser = {":getstats", _keywords, 0}; - - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser - )) { - goto exit; + if (nargs) { + PyErr_SetString(PyExc_TypeError, "getstats() takes no arguments"); + return NULL; } - return_value = _lsprof_Profiler_getstats_impl(self, cls); - -exit: - return return_value; + return _lsprof_Profiler_getstats_impl(self, cls); } -/*[clinic end generated code: output=b4727cfebecdd22d input=a9049054013a1b77]*/ +/*[clinic end generated code: output=57c7b6b0b8666429 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_queuemodule.c.h b/Modules/clinic/_queuemodule.c.h index 8741f7d9aff88..29e4c60cfa755 100644 --- a/Modules/clinic/_queuemodule.c.h +++ b/Modules/clinic/_queuemodule.c.h @@ -144,14 +144,30 @@ _queue_SimpleQueue_get(simplequeueobject *self, PyTypeObject *cls, PyObject *con { PyObject *return_value = NULL; static const char * const _keywords[] = {"block", "timeout", NULL}; - static _PyArg_Parser _parser = {"|pO:get", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "get", 0}; + PyObject *argsbuf[2]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; int block = 1; PyObject *timeout = Py_None; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &block, &timeout)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 2, 0, argsbuf); + if (!args) { goto exit; } + if (!noptargs) { + goto skip_optional_pos; + } + if (args[0]) { + block = PyObject_IsTrue(args[0]); + if (block < 0) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_pos; + } + } + timeout = args[1]; +skip_optional_pos: return_value = _queue_SimpleQueue_get_impl(self, cls, block, timeout); exit: @@ -177,18 +193,11 @@ _queue_SimpleQueue_get_nowait_impl(simplequeueobject *self, static PyObject * _queue_SimpleQueue_get_nowait(simplequeueobject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { - PyObject *return_value = NULL; - static const char * const _keywords[] = { NULL}; - static _PyArg_Parser _parser = {":get_nowait", _keywords, 0}; - - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser - )) { - goto exit; + if (nargs) { + PyErr_SetString(PyExc_TypeError, "get_nowait() takes no arguments"); + return NULL; } - return_value = _queue_SimpleQueue_get_nowait_impl(self, cls); - -exit: - return return_value; + return _queue_SimpleQueue_get_nowait_impl(self, cls); } PyDoc_STRVAR(_queue_SimpleQueue_empty__doc__, @@ -246,4 +255,4 @@ _queue_SimpleQueue_qsize(simplequeueobject *self, PyObject *Py_UNUSED(ignored)) exit: return return_value; } -/*[clinic end generated code: output=ce56b46fac150909 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=a9d567e8a64e6170 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_sre.c.h b/Modules/clinic/_sre.c.h index 72d772c289ae8..d60827db24b06 100644 --- a/Modules/clinic/_sre.c.h +++ b/Modules/clinic/_sre.c.h @@ -176,15 +176,51 @@ _sre_SRE_Pattern_match(PatternObject *self, PyTypeObject *cls, PyObject *const * { PyObject *return_value = NULL; static const char * const _keywords[] = {"string", "pos", "endpos", NULL}; - static _PyArg_Parser _parser = {"O|nn:match", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "match", 0}; + PyObject *argsbuf[3]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; PyObject *string; Py_ssize_t pos = 0; Py_ssize_t endpos = PY_SSIZE_T_MAX; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &string, &pos, &endpos)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 3, 0, argsbuf); + if (!args) { goto exit; } + string = args[0]; + if (!noptargs) { + goto skip_optional_pos; + } + if (args[1]) { + { + Py_ssize_t ival = -1; + PyObject *iobj = _PyNumber_Index(args[1]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + pos = ival; + } + if (!--noptargs) { + goto skip_optional_pos; + } + } + { + Py_ssize_t ival = -1; + PyObject *iobj = _PyNumber_Index(args[2]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + endpos = ival; + } +skip_optional_pos: return_value = _sre_SRE_Pattern_match_impl(self, cls, string, pos, endpos); exit: @@ -210,15 +246,51 @@ _sre_SRE_Pattern_fullmatch(PatternObject *self, PyTypeObject *cls, PyObject *con { PyObject *return_value = NULL; static const char * const _keywords[] = {"string", "pos", "endpos", NULL}; - static _PyArg_Parser _parser = {"O|nn:fullmatch", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "fullmatch", 0}; + PyObject *argsbuf[3]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; PyObject *string; Py_ssize_t pos = 0; Py_ssize_t endpos = PY_SSIZE_T_MAX; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &string, &pos, &endpos)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 3, 0, argsbuf); + if (!args) { goto exit; } + string = args[0]; + if (!noptargs) { + goto skip_optional_pos; + } + if (args[1]) { + { + Py_ssize_t ival = -1; + PyObject *iobj = _PyNumber_Index(args[1]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + pos = ival; + } + if (!--noptargs) { + goto skip_optional_pos; + } + } + { + Py_ssize_t ival = -1; + PyObject *iobj = _PyNumber_Index(args[2]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + endpos = ival; + } +skip_optional_pos: return_value = _sre_SRE_Pattern_fullmatch_impl(self, cls, string, pos, endpos); exit: @@ -246,15 +318,51 @@ _sre_SRE_Pattern_search(PatternObject *self, PyTypeObject *cls, PyObject *const { PyObject *return_value = NULL; static const char * const _keywords[] = {"string", "pos", "endpos", NULL}; - static _PyArg_Parser _parser = {"O|nn:search", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "search", 0}; + PyObject *argsbuf[3]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; PyObject *string; Py_ssize_t pos = 0; Py_ssize_t endpos = PY_SSIZE_T_MAX; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &string, &pos, &endpos)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 3, 0, argsbuf); + if (!args) { goto exit; } + string = args[0]; + if (!noptargs) { + goto skip_optional_pos; + } + if (args[1]) { + { + Py_ssize_t ival = -1; + PyObject *iobj = _PyNumber_Index(args[1]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + pos = ival; + } + if (!--noptargs) { + goto skip_optional_pos; + } + } + { + Py_ssize_t ival = -1; + PyObject *iobj = _PyNumber_Index(args[2]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + endpos = ival; + } +skip_optional_pos: return_value = _sre_SRE_Pattern_search_impl(self, cls, string, pos, endpos); exit: @@ -351,15 +459,51 @@ _sre_SRE_Pattern_finditer(PatternObject *self, PyTypeObject *cls, PyObject *cons { PyObject *return_value = NULL; static const char * const _keywords[] = {"string", "pos", "endpos", NULL}; - static _PyArg_Parser _parser = {"O|nn:finditer", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "finditer", 0}; + PyObject *argsbuf[3]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; PyObject *string; Py_ssize_t pos = 0; Py_ssize_t endpos = PY_SSIZE_T_MAX; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &string, &pos, &endpos)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 3, 0, argsbuf); + if (!args) { goto exit; } + string = args[0]; + if (!noptargs) { + goto skip_optional_pos; + } + if (args[1]) { + { + Py_ssize_t ival = -1; + PyObject *iobj = _PyNumber_Index(args[1]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + pos = ival; + } + if (!--noptargs) { + goto skip_optional_pos; + } + } + { + Py_ssize_t ival = -1; + PyObject *iobj = _PyNumber_Index(args[2]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + endpos = ival; + } +skip_optional_pos: return_value = _sre_SRE_Pattern_finditer_impl(self, cls, string, pos, endpos); exit: @@ -384,15 +528,51 @@ _sre_SRE_Pattern_scanner(PatternObject *self, PyTypeObject *cls, PyObject *const { PyObject *return_value = NULL; static const char * const _keywords[] = {"string", "pos", "endpos", NULL}; - static _PyArg_Parser _parser = {"O|nn:scanner", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "scanner", 0}; + PyObject *argsbuf[3]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; PyObject *string; Py_ssize_t pos = 0; Py_ssize_t endpos = PY_SSIZE_T_MAX; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &string, &pos, &endpos)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 3, 0, argsbuf); + if (!args) { goto exit; } + string = args[0]; + if (!noptargs) { + goto skip_optional_pos; + } + if (args[1]) { + { + Py_ssize_t ival = -1; + PyObject *iobj = _PyNumber_Index(args[1]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + pos = ival; + } + if (!--noptargs) { + goto skip_optional_pos; + } + } + { + Py_ssize_t ival = -1; + PyObject *iobj = _PyNumber_Index(args[2]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + endpos = ival; + } +skip_optional_pos: return_value = _sre_SRE_Pattern_scanner_impl(self, cls, string, pos, endpos); exit: @@ -468,15 +648,35 @@ _sre_SRE_Pattern_sub(PatternObject *self, PyTypeObject *cls, PyObject *const *ar { PyObject *return_value = NULL; static const char * const _keywords[] = {"repl", "string", "count", NULL}; - static _PyArg_Parser _parser = {"OO|n:sub", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "sub", 0}; + PyObject *argsbuf[3]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 2; PyObject *repl; PyObject *string; Py_ssize_t count = 0; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &repl, &string, &count)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 3, 0, argsbuf); + if (!args) { goto exit; } + repl = args[0]; + string = args[1]; + if (!noptargs) { + goto skip_optional_pos; + } + { + Py_ssize_t ival = -1; + PyObject *iobj = _PyNumber_Index(args[2]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + count = ival; + } +skip_optional_pos: return_value = _sre_SRE_Pattern_sub_impl(self, cls, repl, string, count); exit: @@ -502,15 +702,35 @@ _sre_SRE_Pattern_subn(PatternObject *self, PyTypeObject *cls, PyObject *const *a { PyObject *return_value = NULL; static const char * const _keywords[] = {"repl", "string", "count", NULL}; - static _PyArg_Parser _parser = {"OO|n:subn", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "subn", 0}; + PyObject *argsbuf[3]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 2; PyObject *repl; PyObject *string; Py_ssize_t count = 0; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &repl, &string, &count)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 3, 0, argsbuf); + if (!args) { goto exit; } + repl = args[0]; + string = args[1]; + if (!noptargs) { + goto skip_optional_pos; + } + { + Py_ssize_t ival = -1; + PyObject *iobj = _PyNumber_Index(args[2]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + count = ival; + } +skip_optional_pos: return_value = _sre_SRE_Pattern_subn_impl(self, cls, repl, string, count); exit: @@ -869,18 +1089,11 @@ _sre_SRE_Scanner_match_impl(ScannerObject *self, PyTypeObject *cls); static PyObject * _sre_SRE_Scanner_match(ScannerObject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { - PyObject *return_value = NULL; - static const char * const _keywords[] = { NULL}; - static _PyArg_Parser _parser = {":match", _keywords, 0}; - - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser - )) { - goto exit; + if (nargs) { + PyErr_SetString(PyExc_TypeError, "match() takes no arguments"); + return NULL; } - return_value = _sre_SRE_Scanner_match_impl(self, cls); - -exit: - return return_value; + return _sre_SRE_Scanner_match_impl(self, cls); } PyDoc_STRVAR(_sre_SRE_Scanner_search__doc__, @@ -897,17 +1110,10 @@ _sre_SRE_Scanner_search_impl(ScannerObject *self, PyTypeObject *cls); static PyObject * _sre_SRE_Scanner_search(ScannerObject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { - PyObject *return_value = NULL; - static const char * const _keywords[] = { NULL}; - static _PyArg_Parser _parser = {":search", _keywords, 0}; - - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser - )) { - goto exit; + if (nargs) { + PyErr_SetString(PyExc_TypeError, "search() takes no arguments"); + return NULL; } - return_value = _sre_SRE_Scanner_search_impl(self, cls); - -exit: - return return_value; + return _sre_SRE_Scanner_search_impl(self, cls); } -/*[clinic end generated code: output=518f7bb775c1184f input=a9049054013a1b77]*/ +/*[clinic end generated code: output=ead5eb818b7771f8 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_testmultiphase.c.h b/Modules/clinic/_testmultiphase.c.h index 17c28d54ce575..26212d86dd0f8 100644 --- a/Modules/clinic/_testmultiphase.c.h +++ b/Modules/clinic/_testmultiphase.c.h @@ -21,18 +21,11 @@ _testmultiphase_StateAccessType_get_defining_module_impl(StateAccessTypeObject * static PyObject * _testmultiphase_StateAccessType_get_defining_module(StateAccessTypeObject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { - PyObject *return_value = NULL; - static const char * const _keywords[] = { NULL}; - static _PyArg_Parser _parser = {":get_defining_module", _keywords, 0}; - - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser - )) { - goto exit; + if (nargs) { + PyErr_SetString(PyExc_TypeError, "get_defining_module() takes no arguments"); + return NULL; } - return_value = _testmultiphase_StateAccessType_get_defining_module_impl(self, cls); - -exit: - return return_value; + return _testmultiphase_StateAccessType_get_defining_module_impl(self, cls); } PyDoc_STRVAR(_testmultiphase_StateAccessType_getmodulebydef_bad_def__doc__, @@ -51,18 +44,11 @@ _testmultiphase_StateAccessType_getmodulebydef_bad_def_impl(StateAccessTypeObjec static PyObject * _testmultiphase_StateAccessType_getmodulebydef_bad_def(StateAccessTypeObject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { - PyObject *return_value = NULL; - static const char * const _keywords[] = { NULL}; - static _PyArg_Parser _parser = {":getmodulebydef_bad_def", _keywords, 0}; - - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser - )) { - goto exit; + if (nargs) { + PyErr_SetString(PyExc_TypeError, "getmodulebydef_bad_def() takes no arguments"); + return NULL; } - return_value = _testmultiphase_StateAccessType_getmodulebydef_bad_def_impl(self, cls); - -exit: - return return_value; + return _testmultiphase_StateAccessType_getmodulebydef_bad_def_impl(self, cls); } PyDoc_STRVAR(_testmultiphase_StateAccessType_increment_count_clinic__doc__, @@ -88,14 +74,37 @@ _testmultiphase_StateAccessType_increment_count_clinic(StateAccessTypeObject *se { PyObject *return_value = NULL; static const char * const _keywords[] = {"n", "twice", NULL}; - static _PyArg_Parser _parser = {"|i$p:increment_count_clinic", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "increment_count_clinic", 0}; + PyObject *argsbuf[2]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; int n = 1; int twice = 0; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &n, &twice)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); + if (!args) { goto exit; } + if (!noptargs) { + goto skip_optional_pos; + } + if (args[0]) { + n = _PyLong_AsInt(args[0]); + if (n == -1 && PyErr_Occurred()) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_pos; + } + } +skip_optional_pos: + if (!noptargs) { + goto skip_optional_kwonly; + } + twice = PyObject_IsTrue(args[1]); + if (twice < 0) { + goto exit; + } +skip_optional_kwonly: return_value = _testmultiphase_StateAccessType_increment_count_clinic_impl(self, cls, n, twice); exit: @@ -118,17 +127,10 @@ _testmultiphase_StateAccessType_get_count_impl(StateAccessTypeObject *self, static PyObject * _testmultiphase_StateAccessType_get_count(StateAccessTypeObject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { - PyObject *return_value = NULL; - static const char * const _keywords[] = { NULL}; - static _PyArg_Parser _parser = {":get_count", _keywords, 0}; - - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser - )) { - goto exit; + if (nargs) { + PyErr_SetString(PyExc_TypeError, "get_count() takes no arguments"); + return NULL; } - return_value = _testmultiphase_StateAccessType_get_count_impl(self, cls); - -exit: - return return_value; + return _testmultiphase_StateAccessType_get_count_impl(self, cls); } -/*[clinic end generated code: output=eb1b8c2ee6290be3 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=ec5029d1275cbf94 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/arraymodule.c.h b/Modules/clinic/arraymodule.c.h index c46cc738de91b..ce98e411f0fe4 100644 --- a/Modules/clinic/arraymodule.c.h +++ b/Modules/clinic/arraymodule.c.h @@ -155,13 +155,15 @@ array_array_extend(arrayobject *self, PyTypeObject *cls, PyObject *const *args, { PyObject *return_value = NULL; static const char * const _keywords[] = {"", NULL}; - static _PyArg_Parser _parser = {"O:extend", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "extend", 0}; + PyObject *argsbuf[1]; PyObject *bb; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &bb)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { goto exit; } + bb = args[0]; return_value = array_array_extend_impl(self, cls, bb); exit: @@ -572,4 +574,4 @@ PyDoc_STRVAR(array_arrayiterator___setstate____doc__, #define ARRAY_ARRAYITERATOR___SETSTATE___METHODDEF \ {"__setstate__", (PyCFunction)array_arrayiterator___setstate__, METH_O, array_arrayiterator___setstate____doc__}, -/*[clinic end generated code: output=f130a994f98f1227 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=eb727e087d64f017 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/md5module.c.h b/Modules/clinic/md5module.c.h index 4762f2800d4b8..0ff09b0050a56 100644 --- a/Modules/clinic/md5module.c.h +++ b/Modules/clinic/md5module.c.h @@ -17,18 +17,11 @@ MD5Type_copy_impl(MD5object *self, PyTypeObject *cls); static PyObject * MD5Type_copy(MD5object *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { - PyObject *return_value = NULL; - static const char * const _keywords[] = { NULL}; - static _PyArg_Parser _parser = {":copy", _keywords, 0}; - - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser - )) { - goto exit; + if (nargs) { + PyErr_SetString(PyExc_TypeError, "copy() takes no arguments"); + return NULL; } - return_value = MD5Type_copy_impl(self, cls); - -exit: - return return_value; + return MD5Type_copy_impl(self, cls); } PyDoc_STRVAR(MD5Type_digest__doc__, @@ -126,4 +119,4 @@ _md5_md5(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kw exit: return return_value; } -/*[clinic end generated code: output=53ff7f22dbaaea36 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=3061297a669c645c input=a9049054013a1b77]*/ diff --git a/Modules/clinic/posixmodule.c.h b/Modules/clinic/posixmodule.c.h index 7921c222b9009..742acb8e6c07e 100644 --- a/Modules/clinic/posixmodule.c.h +++ b/Modules/clinic/posixmodule.c.h @@ -8254,12 +8254,10 @@ static PyObject * os_DirEntry_is_symlink(DirEntry *self, PyTypeObject *defining_class, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; - static const char * const _keywords[] = { NULL}; - static _PyArg_Parser _parser = {":is_symlink", _keywords, 0}; int _return_value; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser - )) { + if (nargs) { + PyErr_SetString(PyExc_TypeError, "is_symlink() takes no arguments"); goto exit; } _return_value = os_DirEntry_is_symlink_impl(self, defining_class); @@ -8290,13 +8288,23 @@ os_DirEntry_stat(DirEntry *self, PyTypeObject *defining_class, PyObject *const * { PyObject *return_value = NULL; static const char * const _keywords[] = {"follow_symlinks", NULL}; - static _PyArg_Parser _parser = {"|$p:stat", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "stat", 0}; + PyObject *argsbuf[1]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; int follow_symlinks = 1; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &follow_symlinks)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 0, 0, argsbuf); + if (!args) { goto exit; } + if (!noptargs) { + goto skip_optional_kwonly; + } + follow_symlinks = PyObject_IsTrue(args[0]); + if (follow_symlinks < 0) { + goto exit; + } +skip_optional_kwonly: return_value = os_DirEntry_stat_impl(self, defining_class, follow_symlinks); exit: @@ -8321,14 +8329,24 @@ os_DirEntry_is_dir(DirEntry *self, PyTypeObject *defining_class, PyObject *const { PyObject *return_value = NULL; static const char * const _keywords[] = {"follow_symlinks", NULL}; - static _PyArg_Parser _parser = {"|$p:is_dir", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "is_dir", 0}; + PyObject *argsbuf[1]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; int follow_symlinks = 1; int _return_value; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &follow_symlinks)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 0, 0, argsbuf); + if (!args) { goto exit; } + if (!noptargs) { + goto skip_optional_kwonly; + } + follow_symlinks = PyObject_IsTrue(args[0]); + if (follow_symlinks < 0) { + goto exit; + } +skip_optional_kwonly: _return_value = os_DirEntry_is_dir_impl(self, defining_class, follow_symlinks); if ((_return_value == -1) && PyErr_Occurred()) { goto exit; @@ -8357,14 +8375,24 @@ os_DirEntry_is_file(DirEntry *self, PyTypeObject *defining_class, PyObject *cons { PyObject *return_value = NULL; static const char * const _keywords[] = {"follow_symlinks", NULL}; - static _PyArg_Parser _parser = {"|$p:is_file", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "is_file", 0}; + PyObject *argsbuf[1]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; int follow_symlinks = 1; int _return_value; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &follow_symlinks)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 0, 0, argsbuf); + if (!args) { goto exit; } + if (!noptargs) { + goto skip_optional_kwonly; + } + follow_symlinks = PyObject_IsTrue(args[0]); + if (follow_symlinks < 0) { + goto exit; + } +skip_optional_kwonly: _return_value = os_DirEntry_is_file_impl(self, defining_class, follow_symlinks); if ((_return_value == -1) && PyErr_Occurred()) { goto exit; @@ -9263,4 +9291,4 @@ os_waitstatus_to_exitcode(PyObject *module, PyObject *const *args, Py_ssize_t na #ifndef OS_WAITSTATUS_TO_EXITCODE_METHODDEF #define OS_WAITSTATUS_TO_EXITCODE_METHODDEF #endif /* !defined(OS_WAITSTATUS_TO_EXITCODE_METHODDEF) */ -/*[clinic end generated code: output=65a85d7d3f2c487e input=a9049054013a1b77]*/ +/*[clinic end generated code: output=debefcf43738ec66 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/pyexpat.c.h b/Modules/clinic/pyexpat.c.h index 7c56d6a8b2591..bee2ee66950a5 100644 --- a/Modules/clinic/pyexpat.c.h +++ b/Modules/clinic/pyexpat.c.h @@ -22,14 +22,24 @@ pyexpat_xmlparser_Parse(xmlparseobject *self, PyTypeObject *cls, PyObject *const { PyObject *return_value = NULL; static const char * const _keywords[] = {"", "", NULL}; - static _PyArg_Parser _parser = {"O|i:Parse", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "Parse", 0}; + PyObject *argsbuf[2]; PyObject *data; int isfinal = 0; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &data, &isfinal)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 2, 0, argsbuf); + if (!args) { + goto exit; + } + data = args[0]; + if (nargs < 2) { + goto skip_optional_posonly; + } + isfinal = _PyLong_AsInt(args[1]); + if (isfinal == -1 && PyErr_Occurred()) { goto exit; } +skip_optional_posonly: return_value = pyexpat_xmlparser_Parse_impl(self, cls, data, isfinal); exit: @@ -54,13 +64,15 @@ pyexpat_xmlparser_ParseFile(xmlparseobject *self, PyTypeObject *cls, PyObject *c { PyObject *return_value = NULL; static const char * const _keywords[] = {"", NULL}; - static _PyArg_Parser _parser = {"O:ParseFile", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "ParseFile", 0}; + PyObject *argsbuf[1]; PyObject *file; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &file)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { goto exit; } + file = args[0]; return_value = pyexpat_xmlparser_ParseFile_impl(self, cls, file); exit: @@ -164,14 +176,50 @@ pyexpat_xmlparser_ExternalEntityParserCreate(xmlparseobject *self, PyTypeObject { PyObject *return_value = NULL; static const char * const _keywords[] = {"", "", NULL}; - static _PyArg_Parser _parser = {"z|s:ExternalEntityParserCreate", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "ExternalEntityParserCreate", 0}; + PyObject *argsbuf[2]; const char *context; const char *encoding = NULL; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &context, &encoding)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 2, 0, argsbuf); + if (!args) { + goto exit; + } + if (args[0] == Py_None) { + context = NULL; + } + else if (PyUnicode_Check(args[0])) { + Py_ssize_t context_length; + context = PyUnicode_AsUTF8AndSize(args[0], &context_length); + if (context == NULL) { + goto exit; + } + if (strlen(context) != (size_t)context_length) { + PyErr_SetString(PyExc_ValueError, "embedded null character"); + goto exit; + } + } + else { + _PyArg_BadArgument("ExternalEntityParserCreate", "argument 1", "str or None", args[0]); + goto exit; + } + if (nargs < 2) { + goto skip_optional_posonly; + } + if (!PyUnicode_Check(args[1])) { + _PyArg_BadArgument("ExternalEntityParserCreate", "argument 2", "str", args[1]); goto exit; } + Py_ssize_t encoding_length; + encoding = PyUnicode_AsUTF8AndSize(args[1], &encoding_length); + if (encoding == NULL) { + goto exit; + } + if (strlen(encoding) != (size_t)encoding_length) { + PyErr_SetString(PyExc_ValueError, "embedded null character"); + goto exit; + } +skip_optional_posonly: return_value = pyexpat_xmlparser_ExternalEntityParserCreate_impl(self, cls, context, encoding); exit: @@ -235,13 +283,22 @@ pyexpat_xmlparser_UseForeignDTD(xmlparseobject *self, PyTypeObject *cls, PyObjec { PyObject *return_value = NULL; static const char * const _keywords[] = {"", NULL}; - static _PyArg_Parser _parser = {"|p:UseForeignDTD", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "UseForeignDTD", 0}; + PyObject *argsbuf[1]; int flag = 1; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &flag)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); + if (!args) { + goto exit; + } + if (nargs < 1) { + goto skip_optional_posonly; + } + flag = PyObject_IsTrue(args[0]); + if (flag < 0) { goto exit; } +skip_optional_posonly: return_value = pyexpat_xmlparser_UseForeignDTD_impl(self, cls, flag); exit: @@ -368,4 +425,4 @@ pyexpat_ErrorString(PyObject *module, PyObject *arg) #ifndef PYEXPAT_XMLPARSER_USEFOREIGNDTD_METHODDEF #define PYEXPAT_XMLPARSER_USEFOREIGNDTD_METHODDEF #endif /* !defined(PYEXPAT_XMLPARSER_USEFOREIGNDTD_METHODDEF) */ -/*[clinic end generated code: output=612b9d6a17a679a7 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=5d60049d385d5d56 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/sha1module.c.h b/Modules/clinic/sha1module.c.h index 3a3ab58c1233c..d9a2e150f6d41 100644 --- a/Modules/clinic/sha1module.c.h +++ b/Modules/clinic/sha1module.c.h @@ -17,18 +17,11 @@ SHA1Type_copy_impl(SHA1object *self, PyTypeObject *cls); static PyObject * SHA1Type_copy(SHA1object *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { - PyObject *return_value = NULL; - static const char * const _keywords[] = { NULL}; - static _PyArg_Parser _parser = {":copy", _keywords, 0}; - - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser - )) { - goto exit; + if (nargs) { + PyErr_SetString(PyExc_TypeError, "copy() takes no arguments"); + return NULL; } - return_value = SHA1Type_copy_impl(self, cls); - -exit: - return return_value; + return SHA1Type_copy_impl(self, cls); } PyDoc_STRVAR(SHA1Type_digest__doc__, @@ -126,4 +119,4 @@ _sha1_sha1(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject * exit: return return_value; } -/*[clinic end generated code: output=abf1ab2545cea5a2 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=93ced3c8f8fa4f21 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/sha256module.c.h b/Modules/clinic/sha256module.c.h index 89205c4f14f4e..619fab1a6fe2f 100644 --- a/Modules/clinic/sha256module.c.h +++ b/Modules/clinic/sha256module.c.h @@ -17,18 +17,11 @@ SHA256Type_copy_impl(SHAobject *self, PyTypeObject *cls); static PyObject * SHA256Type_copy(SHAobject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { - PyObject *return_value = NULL; - static const char * const _keywords[] = { NULL}; - static _PyArg_Parser _parser = {":copy", _keywords, 0}; - - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser - )) { - goto exit; + if (nargs) { + PyErr_SetString(PyExc_TypeError, "copy() takes no arguments"); + return NULL; } - return_value = SHA256Type_copy_impl(self, cls); - -exit: - return return_value; + return SHA256Type_copy_impl(self, cls); } PyDoc_STRVAR(SHA256Type_digest__doc__, @@ -177,4 +170,4 @@ _sha256_sha224(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObje exit: return return_value; } -/*[clinic end generated code: output=b7283f75c9d08f30 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=4f9fe3ca546b0c58 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/sha512module.c.h b/Modules/clinic/sha512module.c.h index f1192d74f9a1a..fada35eff2261 100644 --- a/Modules/clinic/sha512module.c.h +++ b/Modules/clinic/sha512module.c.h @@ -17,18 +17,11 @@ SHA512Type_copy_impl(SHAobject *self, PyTypeObject *cls); static PyObject * SHA512Type_copy(SHAobject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { - PyObject *return_value = NULL; - static const char * const _keywords[] = { NULL}; - static _PyArg_Parser _parser = {":copy", _keywords, 0}; - - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser - )) { - goto exit; + if (nargs) { + PyErr_SetString(PyExc_TypeError, "copy() takes no arguments"); + return NULL; } - return_value = SHA512Type_copy_impl(self, cls); - -exit: - return return_value; + return SHA512Type_copy_impl(self, cls); } PyDoc_STRVAR(SHA512Type_digest__doc__, @@ -177,4 +170,4 @@ _sha512_sha384(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObje exit: return return_value; } -/*[clinic end generated code: output=9ff9f11937fabf35 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=26d2fe27b9673ac2 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/zlibmodule.c.h b/Modules/clinic/zlibmodule.c.h index 14e955db64e72..4394839859063 100644 --- a/Modules/clinic/zlibmodule.c.h +++ b/Modules/clinic/zlibmodule.c.h @@ -340,11 +340,19 @@ zlib_Compress_compress(compobject *self, PyTypeObject *cls, PyObject *const *arg { PyObject *return_value = NULL; static const char * const _keywords[] = {"", NULL}; - static _PyArg_Parser _parser = {"y*:compress", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "compress", 0}; + PyObject *argsbuf[1]; Py_buffer data = {NULL, NULL}; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &data)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { + goto exit; + } + if (PyObject_GetBuffer(args[0], &data, PyBUF_SIMPLE) != 0) { + goto exit; + } + if (!PyBuffer_IsContiguous(&data, 'C')) { + _PyArg_BadArgument("compress", "argument 1", "contiguous buffer", args[0]); goto exit; } return_value = zlib_Compress_compress_impl(self, cls, &data); @@ -387,14 +395,39 @@ zlib_Decompress_decompress(compobject *self, PyTypeObject *cls, PyObject *const { PyObject *return_value = NULL; static const char * const _keywords[] = {"", "max_length", NULL}; - static _PyArg_Parser _parser = {"y*|n:decompress", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "decompress", 0}; + PyObject *argsbuf[2]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; Py_buffer data = {NULL, NULL}; Py_ssize_t max_length = 0; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &data, &max_length)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 2, 0, argsbuf); + if (!args) { + goto exit; + } + if (PyObject_GetBuffer(args[0], &data, PyBUF_SIMPLE) != 0) { goto exit; } + if (!PyBuffer_IsContiguous(&data, 'C')) { + _PyArg_BadArgument("decompress", "argument 1", "contiguous buffer", args[0]); + goto exit; + } + if (!noptargs) { + goto skip_optional_pos; + } + { + Py_ssize_t ival = -1; + PyObject *iobj = _PyNumber_Index(args[1]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + max_length = ival; + } +skip_optional_pos: return_value = zlib_Decompress_decompress_impl(self, cls, &data, max_length); exit: @@ -429,13 +462,22 @@ zlib_Compress_flush(compobject *self, PyTypeObject *cls, PyObject *const *args, { PyObject *return_value = NULL; static const char * const _keywords[] = {"", NULL}; - static _PyArg_Parser _parser = {"|i:flush", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "flush", 0}; + PyObject *argsbuf[1]; int mode = Z_FINISH; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &mode)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); + if (!args) { + goto exit; + } + if (nargs < 1) { + goto skip_optional_posonly; + } + mode = _PyLong_AsInt(args[0]); + if (mode == -1 && PyErr_Occurred()) { goto exit; } +skip_optional_posonly: return_value = zlib_Compress_flush_impl(self, cls, mode); exit: @@ -459,18 +501,11 @@ zlib_Compress_copy_impl(compobject *self, PyTypeObject *cls); static PyObject * zlib_Compress_copy(compobject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { - PyObject *return_value = NULL; - static const char * const _keywords[] = { NULL}; - static _PyArg_Parser _parser = {":copy", _keywords, 0}; - - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser - )) { - goto exit; + if (nargs) { + PyErr_SetString(PyExc_TypeError, "copy() takes no arguments"); + return NULL; } - return_value = zlib_Compress_copy_impl(self, cls); - -exit: - return return_value; + return zlib_Compress_copy_impl(self, cls); } #endif /* defined(HAVE_ZLIB_COPY) */ @@ -491,18 +526,11 @@ zlib_Compress___copy___impl(compobject *self, PyTypeObject *cls); static PyObject * zlib_Compress___copy__(compobject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { - PyObject *return_value = NULL; - static const char * const _keywords[] = { NULL}; - static _PyArg_Parser _parser = {":__copy__", _keywords, 0}; - - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser - )) { - goto exit; + if (nargs) { + PyErr_SetString(PyExc_TypeError, "__copy__() takes no arguments"); + return NULL; } - return_value = zlib_Compress___copy___impl(self, cls); - -exit: - return return_value; + return zlib_Compress___copy___impl(self, cls); } #endif /* defined(HAVE_ZLIB_COPY) */ @@ -526,13 +554,15 @@ zlib_Compress___deepcopy__(compobject *self, PyTypeObject *cls, PyObject *const { PyObject *return_value = NULL; static const char * const _keywords[] = {"", NULL}; - static _PyArg_Parser _parser = {"O:__deepcopy__", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "__deepcopy__", 0}; + PyObject *argsbuf[1]; PyObject *memo; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &memo)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { goto exit; } + memo = args[0]; return_value = zlib_Compress___deepcopy___impl(self, cls, memo); exit: @@ -558,18 +588,11 @@ zlib_Decompress_copy_impl(compobject *self, PyTypeObject *cls); static PyObject * zlib_Decompress_copy(compobject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { - PyObject *return_value = NULL; - static const char * const _keywords[] = { NULL}; - static _PyArg_Parser _parser = {":copy", _keywords, 0}; - - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser - )) { - goto exit; + if (nargs) { + PyErr_SetString(PyExc_TypeError, "copy() takes no arguments"); + return NULL; } - return_value = zlib_Decompress_copy_impl(self, cls); - -exit: - return return_value; + return zlib_Decompress_copy_impl(self, cls); } #endif /* defined(HAVE_ZLIB_COPY) */ @@ -590,18 +613,11 @@ zlib_Decompress___copy___impl(compobject *self, PyTypeObject *cls); static PyObject * zlib_Decompress___copy__(compobject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { - PyObject *return_value = NULL; - static const char * const _keywords[] = { NULL}; - static _PyArg_Parser _parser = {":__copy__", _keywords, 0}; - - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser - )) { - goto exit; + if (nargs) { + PyErr_SetString(PyExc_TypeError, "__copy__() takes no arguments"); + return NULL; } - return_value = zlib_Decompress___copy___impl(self, cls); - -exit: - return return_value; + return zlib_Decompress___copy___impl(self, cls); } #endif /* defined(HAVE_ZLIB_COPY) */ @@ -625,13 +641,15 @@ zlib_Decompress___deepcopy__(compobject *self, PyTypeObject *cls, PyObject *cons { PyObject *return_value = NULL; static const char * const _keywords[] = {"", NULL}; - static _PyArg_Parser _parser = {"O:__deepcopy__", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "__deepcopy__", 0}; + PyObject *argsbuf[1]; PyObject *memo; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &memo)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { goto exit; } + memo = args[0]; return_value = zlib_Decompress___deepcopy___impl(self, cls, memo); exit: @@ -661,13 +679,30 @@ zlib_Decompress_flush(compobject *self, PyTypeObject *cls, PyObject *const *args { PyObject *return_value = NULL; static const char * const _keywords[] = {"", NULL}; - static _PyArg_Parser _parser = {"|n:flush", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "flush", 0}; + PyObject *argsbuf[1]; Py_ssize_t length = DEF_BUF_SIZE; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &length)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); + if (!args) { goto exit; } + if (nargs < 1) { + goto skip_optional_posonly; + } + { + Py_ssize_t ival = -1; + PyObject *iobj = _PyNumber_Index(args[0]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + length = ival; + } +skip_optional_posonly: return_value = zlib_Decompress_flush_impl(self, cls, length); exit: @@ -803,4 +838,4 @@ zlib_crc32(PyObject *module, PyObject *const *args, Py_ssize_t nargs) #ifndef ZLIB_DECOMPRESS___DEEPCOPY___METHODDEF #define ZLIB_DECOMPRESS___DEEPCOPY___METHODDEF #endif /* !defined(ZLIB_DECOMPRESS___DEEPCOPY___METHODDEF) */ -/*[clinic end generated code: output=6736bae59fab268b input=a9049054013a1b77]*/ +/*[clinic end generated code: output=1bda0d996fb51269 input=a9049054013a1b77]*/ diff --git a/Tools/clinic/clinic.py b/Tools/clinic/clinic.py index 969008ade9790..b442c494d31d4 100755 --- a/Tools/clinic/clinic.py +++ b/Tools/clinic/clinic.py @@ -636,6 +636,10 @@ def output_templates(self, f): assert parameters assert isinstance(parameters[0].converter, self_converter) del parameters[0] + requires_defining_class = False + if parameters and isinstance(parameters[0].converter, defining_class_converter): + requires_defining_class = True + del parameters[0] converters = [p.converter for p in parameters] has_option_groups = parameters and (parameters[0].group or parameters[-1].group) @@ -657,10 +661,6 @@ def output_templates(self, f): if not p.is_optional(): min_pos = i - requires_defining_class = any( - isinstance(p.converter, defining_class_converter) - for p in parameters) - meth_o = (len(parameters) == 1 and parameters[0].is_positional_only() and not converters[0].is_optional() and @@ -763,24 +763,40 @@ def parser_body(prototype, *fields, declarations=''): return linear_format(output(), parser_declarations=declarations) if not parameters: - # no parameters, METH_NOARGS + if not requires_defining_class: + # no parameters, METH_NOARGS + flags = "METH_NOARGS" - flags = "METH_NOARGS" + parser_prototype = normalize_snippet(""" + static PyObject * + {c_basename}({self_type}{self_name}, PyObject *Py_UNUSED(ignored)) + """) + parser_code = [] - parser_prototype = normalize_snippet(""" - static PyObject * - {c_basename}({self_type}{self_name}, PyObject *Py_UNUSED(ignored)) - """) - parser_definition = parser_prototype + else: + assert not new_or_init - if default_return_converter: - parser_definition = parser_prototype + '\n' + normalize_snippet(""" - {{ - return {c_basename}_impl({impl_arguments}); + flags = "METH_METHOD|METH_FASTCALL|METH_KEYWORDS" + + parser_prototype = parser_prototype_def_class + return_error = ('return NULL;' if default_return_converter + else 'goto exit;') + parser_code = [normalize_snippet(""" + if (nargs) {{ + PyErr_SetString(PyExc_TypeError, "{name}() takes no arguments"); + %s }} - """) + """ % return_error, indent=4)] + + if default_return_converter: + parser_definition = '\n'.join([ + parser_prototype, + '{{', + *parser_code, + ' return {c_basename}_impl({impl_arguments});', + '}}']) else: - parser_definition = parser_body(parser_prototype) + parser_definition = parser_body(parser_prototype, *parser_code) elif meth_o: flags = "METH_O" @@ -939,6 +955,9 @@ def parser_body(prototype, *fields, declarations=''): add_label = None for i, p in enumerate(parameters): + if isinstance(p.converter, defining_class_converter): + raise ValueError("defining_class should be the first " + "parameter (after self)") displayname = p.get_displayname(i+1) parsearg = p.converter.parse_arg(argname_fmt % i, displayname) if parsearg is None: From webhook-mailer at python.org Tue May 3 04:54:18 2022 From: webhook-mailer at python.org (serhiy-storchaka) Date: Tue, 03 May 2022 08:54:18 -0000 Subject: [Python-checkins] [3.9] gh-91583: AC: Fix regression for functions with defining_class (GH-91739) (GH-92080) Message-ID: https://github.com/python/cpython/commit/1b1c79c566b8aa527f551cb4d41d3fab09b781a5 commit: 1b1c79c566b8aa527f551cb4d41d3fab09b781a5 branch: 3.9 author: Serhiy Storchaka committer: serhiy-storchaka date: 2022-05-03T11:54:06+03:00 summary: [3.9] gh-91583: AC: Fix regression for functions with defining_class (GH-91739) (GH-92080) Argument Clinic now generates the same efficient code as before adding the defining_class parameter. (cherry picked from commit a055dac0b45031878a8196a8735522de018491e3) files: A Misc/NEWS.d/next/Tools-Demos/2022-04-20-14-26-14.gh-issue-91583.200qI0.rst M Modules/clinic/_testmultiphase.c.h M Modules/clinic/posixmodule.c.h M Tools/clinic/clinic.py diff --git a/Misc/NEWS.d/next/Tools-Demos/2022-04-20-14-26-14.gh-issue-91583.200qI0.rst b/Misc/NEWS.d/next/Tools-Demos/2022-04-20-14-26-14.gh-issue-91583.200qI0.rst new file mode 100644 index 0000000000000..bdfa71100f95a --- /dev/null +++ b/Misc/NEWS.d/next/Tools-Demos/2022-04-20-14-26-14.gh-issue-91583.200qI0.rst @@ -0,0 +1,2 @@ +Fix regression in the code generated by Argument Clinic for functions with +the ``defining_class`` parameter. diff --git a/Modules/clinic/_testmultiphase.c.h b/Modules/clinic/_testmultiphase.c.h index 0d38c230f7186..23180d0aa1373 100644 --- a/Modules/clinic/_testmultiphase.c.h +++ b/Modules/clinic/_testmultiphase.c.h @@ -18,18 +18,11 @@ _testmultiphase_StateAccessType_get_defining_module_impl(StateAccessTypeObject * static PyObject * _testmultiphase_StateAccessType_get_defining_module(StateAccessTypeObject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { - PyObject *return_value = NULL; - static const char * const _keywords[] = { NULL}; - static _PyArg_Parser _parser = {":get_defining_module", _keywords, 0}; - - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser - )) { - goto exit; + if (nargs) { + PyErr_SetString(PyExc_TypeError, "get_defining_module() takes no arguments"); + return NULL; } - return_value = _testmultiphase_StateAccessType_get_defining_module_impl(self, cls); - -exit: - return return_value; + return _testmultiphase_StateAccessType_get_defining_module_impl(self, cls); } PyDoc_STRVAR(_testmultiphase_StateAccessType_increment_count_clinic__doc__, @@ -55,14 +48,42 @@ _testmultiphase_StateAccessType_increment_count_clinic(StateAccessTypeObject *se { PyObject *return_value = NULL; static const char * const _keywords[] = {"n", "twice", NULL}; - static _PyArg_Parser _parser = {"|i$p:increment_count_clinic", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "increment_count_clinic", 0}; + PyObject *argsbuf[2]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; int n = 1; int twice = 0; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &n, &twice)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); + if (!args) { goto exit; } + if (!noptargs) { + goto skip_optional_pos; + } + if (args[0]) { + if (PyFloat_Check(args[0])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + n = _PyLong_AsInt(args[0]); + if (n == -1 && PyErr_Occurred()) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_pos; + } + } +skip_optional_pos: + if (!noptargs) { + goto skip_optional_kwonly; + } + twice = PyObject_IsTrue(args[1]); + if (twice < 0) { + goto exit; + } +skip_optional_kwonly: return_value = _testmultiphase_StateAccessType_increment_count_clinic_impl(self, cls, n, twice); exit: @@ -85,17 +106,10 @@ _testmultiphase_StateAccessType_get_count_impl(StateAccessTypeObject *self, static PyObject * _testmultiphase_StateAccessType_get_count(StateAccessTypeObject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { - PyObject *return_value = NULL; - static const char * const _keywords[] = { NULL}; - static _PyArg_Parser _parser = {":get_count", _keywords, 0}; - - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser - )) { - goto exit; + if (nargs) { + PyErr_SetString(PyExc_TypeError, "get_count() takes no arguments"); + return NULL; } - return_value = _testmultiphase_StateAccessType_get_count_impl(self, cls); - -exit: - return return_value; + return _testmultiphase_StateAccessType_get_count_impl(self, cls); } -/*[clinic end generated code: output=39eea487e94e7f5d input=a9049054013a1b77]*/ +/*[clinic end generated code: output=60d68e2336064f96 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/posixmodule.c.h b/Modules/clinic/posixmodule.c.h index 28798ab99c1a0..f5df5c3b907ba 100644 --- a/Modules/clinic/posixmodule.c.h +++ b/Modules/clinic/posixmodule.c.h @@ -8438,12 +8438,10 @@ static PyObject * os_DirEntry_is_symlink(DirEntry *self, PyTypeObject *defining_class, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; - static const char * const _keywords[] = { NULL}; - static _PyArg_Parser _parser = {":is_symlink", _keywords, 0}; int _return_value; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser - )) { + if (nargs) { + PyErr_SetString(PyExc_TypeError, "is_symlink() takes no arguments"); goto exit; } _return_value = os_DirEntry_is_symlink_impl(self, defining_class); @@ -8474,13 +8472,23 @@ os_DirEntry_stat(DirEntry *self, PyTypeObject *defining_class, PyObject *const * { PyObject *return_value = NULL; static const char * const _keywords[] = {"follow_symlinks", NULL}; - static _PyArg_Parser _parser = {"|$p:stat", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "stat", 0}; + PyObject *argsbuf[1]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; int follow_symlinks = 1; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &follow_symlinks)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 0, 0, argsbuf); + if (!args) { goto exit; } + if (!noptargs) { + goto skip_optional_kwonly; + } + follow_symlinks = PyObject_IsTrue(args[0]); + if (follow_symlinks < 0) { + goto exit; + } +skip_optional_kwonly: return_value = os_DirEntry_stat_impl(self, defining_class, follow_symlinks); exit: @@ -8505,14 +8513,24 @@ os_DirEntry_is_dir(DirEntry *self, PyTypeObject *defining_class, PyObject *const { PyObject *return_value = NULL; static const char * const _keywords[] = {"follow_symlinks", NULL}; - static _PyArg_Parser _parser = {"|$p:is_dir", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "is_dir", 0}; + PyObject *argsbuf[1]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; int follow_symlinks = 1; int _return_value; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &follow_symlinks)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 0, 0, argsbuf); + if (!args) { goto exit; } + if (!noptargs) { + goto skip_optional_kwonly; + } + follow_symlinks = PyObject_IsTrue(args[0]); + if (follow_symlinks < 0) { + goto exit; + } +skip_optional_kwonly: _return_value = os_DirEntry_is_dir_impl(self, defining_class, follow_symlinks); if ((_return_value == -1) && PyErr_Occurred()) { goto exit; @@ -8541,14 +8559,24 @@ os_DirEntry_is_file(DirEntry *self, PyTypeObject *defining_class, PyObject *cons { PyObject *return_value = NULL; static const char * const _keywords[] = {"follow_symlinks", NULL}; - static _PyArg_Parser _parser = {"|$p:is_file", _keywords, 0}; + static _PyArg_Parser _parser = {NULL, _keywords, "is_file", 0}; + PyObject *argsbuf[1]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; int follow_symlinks = 1; int _return_value; - if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, - &follow_symlinks)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 0, 0, argsbuf); + if (!args) { goto exit; } + if (!noptargs) { + goto skip_optional_kwonly; + } + follow_symlinks = PyObject_IsTrue(args[0]); + if (follow_symlinks < 0) { + goto exit; + } +skip_optional_kwonly: _return_value = os_DirEntry_is_file_impl(self, defining_class, follow_symlinks); if ((_return_value == -1) && PyErr_Occurred()) { goto exit; @@ -9441,4 +9469,4 @@ os_waitstatus_to_exitcode(PyObject *module, PyObject *const *args, Py_ssize_t na #ifndef OS_WAITSTATUS_TO_EXITCODE_METHODDEF #define OS_WAITSTATUS_TO_EXITCODE_METHODDEF #endif /* !defined(OS_WAITSTATUS_TO_EXITCODE_METHODDEF) */ -/*[clinic end generated code: output=c7c8796918b09139 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=08879489d9e259a1 input=a9049054013a1b77]*/ diff --git a/Tools/clinic/clinic.py b/Tools/clinic/clinic.py index 61d30b01c0998..655e386512a58 100755 --- a/Tools/clinic/clinic.py +++ b/Tools/clinic/clinic.py @@ -636,6 +636,10 @@ def output_templates(self, f): assert parameters assert isinstance(parameters[0].converter, self_converter) del parameters[0] + requires_defining_class = False + if parameters and isinstance(parameters[0].converter, defining_class_converter): + requires_defining_class = True + del parameters[0] converters = [p.converter for p in parameters] has_option_groups = parameters and (parameters[0].group or parameters[-1].group) @@ -657,10 +661,6 @@ def output_templates(self, f): if not p.is_optional(): min_pos = i - requires_defining_class = any( - isinstance(p.converter, defining_class_converter) - for p in parameters) - meth_o = (len(parameters) == 1 and parameters[0].is_positional_only() and not converters[0].is_optional() and @@ -763,24 +763,40 @@ def parser_body(prototype, *fields, declarations=''): return linear_format(output(), parser_declarations=declarations) if not parameters: - # no parameters, METH_NOARGS + if not requires_defining_class: + # no parameters, METH_NOARGS + flags = "METH_NOARGS" - flags = "METH_NOARGS" + parser_prototype = normalize_snippet(""" + static PyObject * + {c_basename}({self_type}{self_name}, PyObject *Py_UNUSED(ignored)) + """) + parser_code = [] - parser_prototype = normalize_snippet(""" - static PyObject * - {c_basename}({self_type}{self_name}, PyObject *Py_UNUSED(ignored)) - """) - parser_definition = parser_prototype + else: + assert not new_or_init - if default_return_converter: - parser_definition = parser_prototype + '\n' + normalize_snippet(""" - {{ - return {c_basename}_impl({impl_arguments}); + flags = "METH_METHOD|METH_FASTCALL|METH_KEYWORDS" + + parser_prototype = parser_prototype_def_class + return_error = ('return NULL;' if default_return_converter + else 'goto exit;') + parser_code = [normalize_snippet(""" + if (nargs) {{ + PyErr_SetString(PyExc_TypeError, "{name}() takes no arguments"); + %s }} - """) + """ % return_error, indent=4)] + + if default_return_converter: + parser_definition = '\n'.join([ + parser_prototype, + '{{', + *parser_code, + ' return {c_basename}_impl({impl_arguments});', + '}}']) else: - parser_definition = parser_body(parser_prototype) + parser_definition = parser_body(parser_prototype, *parser_code) elif meth_o: flags = "METH_O" @@ -939,6 +955,9 @@ def parser_body(prototype, *fields, declarations=''): add_label = None for i, p in enumerate(parameters): + if isinstance(p.converter, defining_class_converter): + raise ValueError("defining_class should be the first " + "parameter (after self)") displayname = p.get_displayname(i+1) parsearg = p.converter.parse_arg(argname_fmt % i, displayname) if parsearg is None: From webhook-mailer at python.org Tue May 3 08:09:08 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Tue, 03 May 2022 12:09:08 -0000 Subject: [Python-checkins] [3.9] bpo-46586: Fix more erroneous doc links to builtins (GH-31429) (#92199) Message-ID: https://github.com/python/cpython/commit/92d2615d00ce8035cc9e64c1fb87dabf1d7071de commit: 92d2615d00ce8035cc9e64c1fb87dabf1d7071de branch: 3.9 author: Jelle Zijlstra committer: JelleZijlstra date: 2022-05-03T06:08:55-06:00 summary: [3.9] bpo-46586: Fix more erroneous doc links to builtins (GH-31429) (#92199) Co-authored-by: Jelle Zijlstra Co-authored-by: ?ric . (cherry picked from commit cc6ae4f4835f9e76a34f24cd1f666c1cc0fecfa3) Co-authored-by: Meer Suri <46469858+meersuri at users.noreply.github.com> files: M Doc/library/urllib.request.rst M Doc/library/zipfile.rst diff --git a/Doc/library/urllib.request.rst b/Doc/library/urllib.request.rst index 6f6523d8afe9fa..ae9abe7d48ac85 100644 --- a/Doc/library/urllib.request.rst +++ b/Doc/library/urllib.request.rst @@ -734,7 +734,7 @@ The following attribute and methods should only be used by classes derived from This method, if implemented, will be called by the parent :class:`OpenerDirector`. It should return a file-like object as described in - the return value of the :meth:`open` of :class:`OpenerDirector`, or ``None``. + the return value of the :meth:`~OpenerDirector.open` method of :class:`OpenerDirector`, or ``None``. It should raise :exc:`~urllib.error.URLError`, unless a truly exceptional thing happens (for example, :exc:`MemoryError` should not be mapped to :exc:`URLError`). diff --git a/Doc/library/zipfile.rst b/Doc/library/zipfile.rst index 3d1e8d8c468dcf..de508cadccc6fe 100644 --- a/Doc/library/zipfile.rst +++ b/Doc/library/zipfile.rst @@ -289,7 +289,7 @@ ZipFile Objects compressed text files in :term:`universal newlines` mode. .. versionchanged:: 3.6 - :meth:`open` can now be used to write files into the archive with the + :meth:`ZipFile.open` can now be used to write files into the archive with the ``mode='w'`` option. .. versionchanged:: 3.6 From webhook-mailer at python.org Tue May 3 08:13:06 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Tue, 03 May 2022 12:13:06 -0000 Subject: [Python-checkins] bpo-46415: Use f-string for ValueError in ipaddress.ip_{address, network, interface} helper functions (#30642) Message-ID: https://github.com/python/cpython/commit/52dc9c3066bcdc67a7a45d41cf158ecb1434d5f3 commit: 52dc9c3066bcdc67a7a45d41cf158ecb1434d5f3 branch: main author: Thomas Cellerier committer: JelleZijlstra date: 2022-05-03T06:12:58-06:00 summary: bpo-46415: Use f-string for ValueError in ipaddress.ip_{address,network,interface} helper functions (#30642) `IPv*Network` and `IPv*Interface` constructors accept a 2-tuple of (address description, netmask) as the address parameter. When the tuple-based address is used errors are not propagated correctly through the `ipaddress.ip_*` helper because of the %-formatting now expecting several arguments: In [7]: ipaddress.ip_network(("192.168.100.0", "fooo")) ... TypeError: not all arguments converted during string formatting Compared to: In [8]: ipaddress.IPv4Network(("192.168.100.0", "foo")) ... NetmaskValueError: 'foo' is not a valid netmask Use an f-string to make sure the error is always properly formatted. Co-authored-by: Jelle Zijlstra files: A Misc/NEWS.d/next/Library/2022-01-17-16-53-30.bpo-46415.6wSYg-.rst M Lib/ipaddress.py M Lib/test/test_ipaddress.py diff --git a/Lib/ipaddress.py b/Lib/ipaddress.py index e601f6f476e4d..3f15601e700d6 100644 --- a/Lib/ipaddress.py +++ b/Lib/ipaddress.py @@ -51,8 +51,7 @@ def ip_address(address): except (AddressValueError, NetmaskValueError): pass - raise ValueError('%r does not appear to be an IPv4 or IPv6 address' % - address) + raise ValueError(f'{address!r} does not appear to be an IPv4 or IPv6 address') def ip_network(address, strict=True): @@ -81,8 +80,7 @@ def ip_network(address, strict=True): except (AddressValueError, NetmaskValueError): pass - raise ValueError('%r does not appear to be an IPv4 or IPv6 network' % - address) + raise ValueError(f'{address!r} does not appear to be an IPv4 or IPv6 network') def ip_interface(address): @@ -116,8 +114,7 @@ def ip_interface(address): except (AddressValueError, NetmaskValueError): pass - raise ValueError('%r does not appear to be an IPv4 or IPv6 interface' % - address) + raise ValueError(f'{address!r} does not appear to be an IPv4 or IPv6 interface') def v4_int_to_packed(address): @@ -160,7 +157,7 @@ def _split_optional_netmask(address): """Helper to split the netmask and raise AddressValueError if needed""" addr = str(address).split('/') if len(addr) > 2: - raise AddressValueError("Only one '/' permitted in %r" % address) + raise AddressValueError(f"Only one '/' permitted in {address!r}") return addr @@ -1304,7 +1301,7 @@ def __init__(self, address): # which converts into a formatted IP string. addr_str = str(address) if '/' in addr_str: - raise AddressValueError("Unexpected '/' in %r" % address) + raise AddressValueError(f"Unexpected '/' in {address!r}") self._ip = self._ip_int_from_string(addr_str) @property @@ -1913,7 +1910,7 @@ def __init__(self, address): # which converts into a formatted IP string. addr_str = str(address) if '/' in addr_str: - raise AddressValueError("Unexpected '/' in %r" % address) + raise AddressValueError(f"Unexpected '/' in {address!r}") addr_str, self._scope_id = self._split_scope_id(addr_str) self._ip = self._ip_int_from_string(addr_str) diff --git a/Lib/test/test_ipaddress.py b/Lib/test/test_ipaddress.py index b0605f0be04bb..e5162e86cb5dc 100644 --- a/Lib/test/test_ipaddress.py +++ b/Lib/test/test_ipaddress.py @@ -1132,6 +1132,14 @@ def testIPv4Tuple(self): self.assertEqual(ipaddress.IPv4Interface((3221225985, 24)), ipaddress.IPv4Interface('192.0.2.1/24')) + # Invalid netmask + with self.assertRaises(ValueError): + ipaddress.IPv4Network(('192.0.2.1', '255.255.255.255.0')) + + # Invalid netmask using factory + with self.assertRaises(ValueError): + ipaddress.ip_network(('192.0.2.1', '255.255.255.255.0')) + # issue #16531: constructing IPv6Network from an (address, mask) tuple def testIPv6Tuple(self): # /128 @@ -1191,6 +1199,14 @@ def testIPv6Tuple(self): ipaddress.IPv6Network((ip_scoped, 96)) # strict=False and host bits set + # Invalid netmask + with self.assertRaises(ValueError): + ipaddress.IPv6Network(('2001:db8::1', '255.255.255.0')) + + # Invalid netmask using factory + with self.assertRaises(ValueError): + ipaddress.ip_network(('2001:db8::1', '255.255.255.0')) + # issue57 def testAddressIntMath(self): self.assertEqual(ipaddress.IPv4Address('1.1.1.1') + 255, diff --git a/Misc/NEWS.d/next/Library/2022-01-17-16-53-30.bpo-46415.6wSYg-.rst b/Misc/NEWS.d/next/Library/2022-01-17-16-53-30.bpo-46415.6wSYg-.rst new file mode 100644 index 0000000000000..016d6656041f9 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-01-17-16-53-30.bpo-46415.6wSYg-.rst @@ -0,0 +1,2 @@ +Fix ipaddress.ip_{address,interface,network} raising TypeError instead of +ValueError if given invalid tuple as address parameter. From webhook-mailer at python.org Tue May 3 08:18:31 2022 From: webhook-mailer at python.org (methane) Date: Tue, 03 May 2022 12:18:31 -0000 Subject: [Python-checkins] gh-70363: Implement `io.IOBase` interface for `SpooledTemporaryFile` (GH-29560) Message-ID: https://github.com/python/cpython/commit/78e70be3318bc2ca57dac188061ed35017a0867c commit: 78e70be3318bc2ca57dac188061ed35017a0867c branch: main author: Carey Metcalfe committer: methane date: 2022-05-03T21:18:18+09:00 summary: gh-70363: Implement `io.IOBase` interface for `SpooledTemporaryFile` (GH-29560) Since the underlying file-like objects (either `io.BytesIO`, or a true file object) all implement the `io.IOBase` interface, the `SpooledTemporaryFile` should as well. Additionally, since the underlying file object will either be an instance of an `io.BufferedIOBase` (for binary mode) or an `io.TextIOBase` (for text mode), methods for these classes were also implemented. In every case, the required methods and properties are simply delegated to the underlying file object. Co-authored-by: Gary Fernie Co-authored-by: Inada Naoki files: A Misc/NEWS.d/next/Library/2021-11-14-01-35-04.bpo-26175.LNlOfI.rst M Doc/library/tempfile.rst M Lib/tempfile.py M Lib/test/test_tempfile.py M Misc/ACKS diff --git a/Doc/library/tempfile.rst b/Doc/library/tempfile.rst index c97d119fb8b5e..8fe38b5e81c08 100644 --- a/Doc/library/tempfile.rst +++ b/Doc/library/tempfile.rst @@ -123,6 +123,11 @@ The module defines the following user-callable items: .. versionchanged:: 3.8 Added *errors* parameter. + .. versionchanged:: 3.11 + Fully implements the :class:`io.BufferedIOBase` and + :class:`io.TextIOBase` abstract base classes (depending on whether binary + or text *mode* was specified). + .. class:: TemporaryDirectory(suffix=None, prefix=None, dir=None, ignore_cleanup_errors=False) diff --git a/Lib/tempfile.py b/Lib/tempfile.py index 531cbf32f1283..eb870c998c251 100644 --- a/Lib/tempfile.py +++ b/Lib/tempfile.py @@ -639,7 +639,7 @@ def TemporaryFile(mode='w+b', buffering=-1, encoding=None, _os.close(fd) raise -class SpooledTemporaryFile: +class SpooledTemporaryFile(_io.IOBase): """Temporary file wrapper, specialized to switch from BytesIO or StringIO to a real file when it exceeds a certain size or when a fileno is needed. @@ -704,6 +704,16 @@ def __exit__(self, exc, value, tb): def __iter__(self): return self._file.__iter__() + def __del__(self): + if not self.closed: + _warnings.warn( + "Unclosed file {!r}".format(self), + ResourceWarning, + stacklevel=2, + source=self + ) + self.close() + def close(self): self._file.close() @@ -747,15 +757,30 @@ def name(self): def newlines(self): return self._file.newlines + def readable(self): + return self._file.readable() + def read(self, *args): return self._file.read(*args) + def read1(self, *args): + return self._file.read1(*args) + + def readinto(self, b): + return self._file.readinto(b) + + def readinto1(self, b): + return self._file.readinto1(b) + def readline(self, *args): return self._file.readline(*args) def readlines(self, *args): return self._file.readlines(*args) + def seekable(self): + return self._file.seekable() + def seek(self, *args): return self._file.seek(*args) @@ -764,11 +789,14 @@ def tell(self): def truncate(self, size=None): if size is None: - self._file.truncate() + return self._file.truncate() else: if size > self._max_size: self.rollover() - self._file.truncate(size) + return self._file.truncate(size) + + def writable(self): + return self._file.writable() def write(self, s): file = self._file @@ -782,6 +810,9 @@ def writelines(self, iterable): self._check(file) return rv + def detach(self): + return self._file.detach() + class TemporaryDirectory: """Create and return a temporary directory. This has the same diff --git a/Lib/test/test_tempfile.py b/Lib/test/test_tempfile.py index a6847189dca46..07a54028ec697 100644 --- a/Lib/test/test_tempfile.py +++ b/Lib/test/test_tempfile.py @@ -1061,6 +1061,30 @@ def test_basic(self): f = self.do_create(max_size=100, pre="a", suf=".txt") self.assertFalse(f._rolled) + def test_is_iobase(self): + # SpooledTemporaryFile should implement io.IOBase + self.assertIsInstance(self.do_create(), io.IOBase) + + def test_iobase_interface(self): + # SpooledTemporaryFile should implement the io.IOBase interface. + # Ensure it has all the required methods and properties. + iobase_attrs = { + # From IOBase + 'fileno', 'seek', 'truncate', 'close', 'closed', '__enter__', + '__exit__', 'flush', 'isatty', '__iter__', '__next__', 'readable', + 'readline', 'readlines', 'seekable', 'tell', 'writable', + 'writelines', + # From BufferedIOBase (binary mode) and TextIOBase (text mode) + 'detach', 'read', 'read1', 'write', 'readinto', 'readinto1', + 'encoding', 'errors', 'newlines', + } + spooledtempfile_attrs = set(dir(tempfile.SpooledTemporaryFile)) + missing_attrs = iobase_attrs - spooledtempfile_attrs + self.assertFalse( + missing_attrs, + 'SpooledTemporaryFile missing attributes from IOBase/BufferedIOBase/TextIOBase' + ) + def test_del_on_close(self): # A SpooledTemporaryFile is deleted when closed dir = tempfile.mkdtemp() @@ -1076,6 +1100,30 @@ def test_del_on_close(self): finally: os.rmdir(dir) + def test_del_unrolled_file(self): + # The unrolled SpooledTemporaryFile should raise a ResourceWarning + # when deleted since the file was not explicitly closed. + f = self.do_create(max_size=10) + f.write(b'foo') + self.assertEqual(f.name, None) # Unrolled so no filename/fd + with self.assertWarns(ResourceWarning): + f.__del__() + + def test_del_rolled_file(self): + # The rolled file should be deleted when the SpooledTemporaryFile + # object is deleted. This should raise a ResourceWarning since the file + # was not explicitly closed. + f = self.do_create(max_size=2) + f.write(b'foo') + name = f.name # This is a fd on posix+cygwin, a filename everywhere else + self.assertTrue(os.path.exists(name)) + with self.assertWarns(ResourceWarning): + f.__del__() + self.assertFalse( + os.path.exists(name), + "Rolled SpooledTemporaryFile (name=%s) exists after delete" % name + ) + def test_rewrite_small(self): # A SpooledTemporaryFile can be written to multiple within the max_size f = self.do_create(max_size=30) diff --git a/Misc/ACKS b/Misc/ACKS index 30b698f90e83b..1efc6a07c6cad 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1172,6 +1172,7 @@ Dimitri Merejkowsky Brian Merrell Bruce Merry Alexis M?taireau +Carey Metcalfe Luke Mewburn Carl Meyer Kyle Meyer diff --git a/Misc/NEWS.d/next/Library/2021-11-14-01-35-04.bpo-26175.LNlOfI.rst b/Misc/NEWS.d/next/Library/2021-11-14-01-35-04.bpo-26175.LNlOfI.rst new file mode 100644 index 0000000000000..89072b3c04f39 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2021-11-14-01-35-04.bpo-26175.LNlOfI.rst @@ -0,0 +1,4 @@ +Fully implement the :class:`io.BufferedIOBase` or :class:`io.TextIOBase` +interface for :class:`tempfile.SpooledTemporaryFile` objects. This lets them +work correctly with higher-level layers (like compression modules). Patch by +Carey Metcalfe. From webhook-mailer at python.org Tue May 3 08:33:27 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Tue, 03 May 2022 12:33:27 -0000 Subject: [Python-checkins] Dependabot: only bump actions for major versions (#92186) Message-ID: https://github.com/python/cpython/commit/628d6e8270339062c591825ea467ab00bb560f6f commit: 628d6e8270339062c591825ea467ab00bb560f6f branch: main author: Hugo van Kemenade committer: JelleZijlstra date: 2022-05-03T06:33:03-06:00 summary: Dependabot: only bump actions for major versions (#92186) files: M .github/dependabot.yml M .github/workflows/build.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml index e90677b9f775a..555e246e402bf 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -7,3 +7,8 @@ updates: labels: - "skip issue" - "skip news" + ignore: + - dependency-name: "*" + update-types: + - "version-update:semver-minor" + - "version-update:semver-patch" diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1f48d6257e760..b489335903772 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -185,7 +185,7 @@ jobs: echo "LD_LIBRARY_PATH=${GITHUB_WORKSPACE}/multissl/openssl/${OPENSSL_VER}/lib" >> $GITHUB_ENV - name: 'Restore OpenSSL build' id: cache-openssl - uses: actions/cache at v3.0.2 + uses: actions/cache at v3 with: path: ./multissl/openssl/${{ env.OPENSSL_VER }} key: ${{ runner.os }}-multissl-openssl-${{ env.OPENSSL_VER }} @@ -248,7 +248,7 @@ jobs: echo "LD_LIBRARY_PATH=${GITHUB_WORKSPACE}/multissl/openssl/${OPENSSL_VER}/lib" >> $GITHUB_ENV - name: 'Restore OpenSSL build' id: cache-openssl - uses: actions/cache at v3.0.2 + uses: actions/cache at v3 with: path: ./multissl/openssl/${{ env.OPENSSL_VER }} key: ${{ runner.os }}-multissl-openssl-${{ env.OPENSSL_VER }} @@ -292,7 +292,7 @@ jobs: echo "LD_LIBRARY_PATH=${GITHUB_WORKSPACE}/multissl/openssl/${OPENSSL_VER}/lib" >> $GITHUB_ENV - name: 'Restore OpenSSL build' id: cache-openssl - uses: actions/cache at v3.0.2 + uses: actions/cache at v3 with: path: ./multissl/openssl/${{ env.OPENSSL_VER }} key: ${{ runner.os }}-multissl-openssl-${{ env.OPENSSL_VER }} From webhook-mailer at python.org Tue May 3 08:33:28 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Tue, 03 May 2022 12:33:28 -0000 Subject: [Python-checkins] gh-92206: Improve scoping of sqlite3 register cursor helper (#92212) Message-ID: https://github.com/python/cpython/commit/1d4a9a45b7ac8c1c5fecc363c988be59500f1ed7 commit: 1d4a9a45b7ac8c1c5fecc363c988be59500f1ed7 branch: main author: Erlend Egeberg Aasland committer: JelleZijlstra date: 2022-05-03T06:33:24-06:00 summary: gh-92206: Improve scoping of sqlite3 register cursor helper (#92212) files: M Modules/_sqlite/connection.c M Modules/_sqlite/connection.h M Modules/_sqlite/cursor.c diff --git a/Modules/_sqlite/connection.c b/Modules/_sqlite/connection.c index fe244c8b22771..75d29704695c6 100644 --- a/Modules/_sqlite/connection.c +++ b/Modules/_sqlite/connection.c @@ -371,32 +371,6 @@ connection_dealloc(pysqlite_Connection *self) Py_DECREF(tp); } -/* - * Registers a cursor with the connection. - * - * 0 => error; 1 => ok - */ -int pysqlite_connection_register_cursor(pysqlite_Connection* connection, PyObject* cursor) -{ - PyObject* weakref; - - weakref = PyWeakref_NewRef((PyObject*)cursor, NULL); - if (!weakref) { - goto error; - } - - if (PyList_Append(connection->cursors, weakref) != 0) { - Py_CLEAR(weakref); - goto error; - } - - Py_DECREF(weakref); - - return 1; -error: - return 0; -} - /*[clinic input] _sqlite3.Connection.cursor as pysqlite_connection_cursor diff --git a/Modules/_sqlite/connection.h b/Modules/_sqlite/connection.h index 2b946ff3c7369..629fe3d3a95a1 100644 --- a/Modules/_sqlite/connection.h +++ b/Modules/_sqlite/connection.h @@ -99,7 +99,6 @@ typedef struct PyObject* NotSupportedError; } pysqlite_Connection; -int pysqlite_connection_register_cursor(pysqlite_Connection* connection, PyObject* cursor); int pysqlite_check_thread(pysqlite_Connection* self); int pysqlite_check_connection(pysqlite_Connection* con); diff --git a/Modules/_sqlite/cursor.c b/Modules/_sqlite/cursor.c index 861704f95cc83..84f481792ddd3 100644 --- a/Modules/_sqlite/cursor.c +++ b/Modules/_sqlite/cursor.c @@ -35,6 +35,28 @@ class _sqlite3.Cursor "pysqlite_Cursor *" "clinic_state()->CursorType" [clinic start generated code]*/ /*[clinic end generated code: output=da39a3ee5e6b4b0d input=3c5b8115c5cf30f1]*/ +/* + * Registers a cursor with the connection. + * + * 0 => error; 1 => ok + */ +static int +register_cursor(pysqlite_Connection *connection, PyObject *cursor) +{ + PyObject *weakref = PyWeakref_NewRef((PyObject *)cursor, NULL); + if (weakref == NULL) { + return 0; + } + + if (PyList_Append(connection->cursors, weakref) < 0) { + Py_CLEAR(weakref); + return 0; + } + + Py_DECREF(weakref); + return 1; +} + /*[clinic input] _sqlite3.Cursor.__init__ as pysqlite_cursor_init @@ -70,7 +92,7 @@ pysqlite_cursor_init_impl(pysqlite_Cursor *self, return -1; } - if (!pysqlite_connection_register_cursor(connection, (PyObject*)self)) { + if (!register_cursor(connection, (PyObject *)self)) { return -1; } From webhook-mailer at python.org Tue May 3 08:34:55 2022 From: webhook-mailer at python.org (miss-islington) Date: Tue, 03 May 2022 12:34:55 -0000 Subject: [Python-checkins] bpo-46415: Use f-string for ValueError in ipaddress.ip_{address, network, interface} helper functions (GH-30642) Message-ID: https://github.com/python/cpython/commit/020f5c47d8137802d0f058ab2ed2dcb939a2eb8f commit: 020f5c47d8137802d0f058ab2ed2dcb939a2eb8f branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-03T05:34:50-07:00 summary: bpo-46415: Use f-string for ValueError in ipaddress.ip_{address,network,interface} helper functions (GH-30642) `IPv*Network` and `IPv*Interface` constructors accept a 2-tuple of (address description, netmask) as the address parameter. When the tuple-based address is used errors are not propagated correctly through the `ipaddress.ip_*` helper because of the %-formatting now expecting several arguments: In [7]: ipaddress.ip_network(("192.168.100.0", "fooo")) ... TypeError: not all arguments converted during string formatting Compared to: In [8]: ipaddress.IPv4Network(("192.168.100.0", "foo")) ... NetmaskValueError: 'foo' is not a valid netmask Use an f-string to make sure the error is always properly formatted. Co-authored-by: Jelle Zijlstra (cherry picked from commit 52dc9c3066bcdc67a7a45d41cf158ecb1434d5f3) Co-authored-by: Thomas Cellerier files: A Misc/NEWS.d/next/Library/2022-01-17-16-53-30.bpo-46415.6wSYg-.rst M Lib/ipaddress.py M Lib/test/test_ipaddress.py diff --git a/Lib/ipaddress.py b/Lib/ipaddress.py index 6cb92ed552006..25f373a06a2b6 100644 --- a/Lib/ipaddress.py +++ b/Lib/ipaddress.py @@ -50,8 +50,7 @@ def ip_address(address): except (AddressValueError, NetmaskValueError): pass - raise ValueError('%r does not appear to be an IPv4 or IPv6 address' % - address) + raise ValueError(f'{address!r} does not appear to be an IPv4 or IPv6 address') def ip_network(address, strict=True): @@ -80,8 +79,7 @@ def ip_network(address, strict=True): except (AddressValueError, NetmaskValueError): pass - raise ValueError('%r does not appear to be an IPv4 or IPv6 network' % - address) + raise ValueError(f'{address!r} does not appear to be an IPv4 or IPv6 network') def ip_interface(address): @@ -115,8 +113,7 @@ def ip_interface(address): except (AddressValueError, NetmaskValueError): pass - raise ValueError('%r does not appear to be an IPv4 or IPv6 interface' % - address) + raise ValueError(f'{address!r} does not appear to be an IPv4 or IPv6 interface') def v4_int_to_packed(address): @@ -159,7 +156,7 @@ def _split_optional_netmask(address): """Helper to split the netmask and raise AddressValueError if needed""" addr = str(address).split('/') if len(addr) > 2: - raise AddressValueError("Only one '/' permitted in %r" % address) + raise AddressValueError(f"Only one '/' permitted in {address!r}") return addr @@ -1303,7 +1300,7 @@ def __init__(self, address): # which converts into a formatted IP string. addr_str = str(address) if '/' in addr_str: - raise AddressValueError("Unexpected '/' in %r" % address) + raise AddressValueError(f"Unexpected '/' in {address!r}") self._ip = self._ip_int_from_string(addr_str) @property @@ -1912,7 +1909,7 @@ def __init__(self, address): # which converts into a formatted IP string. addr_str = str(address) if '/' in addr_str: - raise AddressValueError("Unexpected '/' in %r" % address) + raise AddressValueError(f"Unexpected '/' in {address!r}") addr_str, self._scope_id = self._split_scope_id(addr_str) self._ip = self._ip_int_from_string(addr_str) diff --git a/Lib/test/test_ipaddress.py b/Lib/test/test_ipaddress.py index cdd9880c3c17f..224412749340f 100644 --- a/Lib/test/test_ipaddress.py +++ b/Lib/test/test_ipaddress.py @@ -1133,6 +1133,14 @@ def testIPv4Tuple(self): self.assertEqual(ipaddress.IPv4Interface((3221225985, 24)), ipaddress.IPv4Interface('192.0.2.1/24')) + # Invalid netmask + with self.assertRaises(ValueError): + ipaddress.IPv4Network(('192.0.2.1', '255.255.255.255.0')) + + # Invalid netmask using factory + with self.assertRaises(ValueError): + ipaddress.ip_network(('192.0.2.1', '255.255.255.255.0')) + # issue #16531: constructing IPv6Network from an (address, mask) tuple def testIPv6Tuple(self): # /128 @@ -1192,6 +1200,14 @@ def testIPv6Tuple(self): ipaddress.IPv6Network((ip_scoped, 96)) # strict=False and host bits set + # Invalid netmask + with self.assertRaises(ValueError): + ipaddress.IPv6Network(('2001:db8::1', '255.255.255.0')) + + # Invalid netmask using factory + with self.assertRaises(ValueError): + ipaddress.ip_network(('2001:db8::1', '255.255.255.0')) + # issue57 def testAddressIntMath(self): self.assertEqual(ipaddress.IPv4Address('1.1.1.1') + 255, diff --git a/Misc/NEWS.d/next/Library/2022-01-17-16-53-30.bpo-46415.6wSYg-.rst b/Misc/NEWS.d/next/Library/2022-01-17-16-53-30.bpo-46415.6wSYg-.rst new file mode 100644 index 0000000000000..016d6656041f9 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-01-17-16-53-30.bpo-46415.6wSYg-.rst @@ -0,0 +1,2 @@ +Fix ipaddress.ip_{address,interface,network} raising TypeError instead of +ValueError if given invalid tuple as address parameter. From webhook-mailer at python.org Tue May 3 08:37:21 2022 From: webhook-mailer at python.org (miss-islington) Date: Tue, 03 May 2022 12:37:21 -0000 Subject: [Python-checkins] bpo-46415: Use f-string for ValueError in ipaddress.ip_{address, network, interface} helper functions (GH-30642) Message-ID: https://github.com/python/cpython/commit/5f709bdb86261fdba3ea8e5fd529f8af9fca4f42 commit: 5f709bdb86261fdba3ea8e5fd529f8af9fca4f42 branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-03T05:37:17-07:00 summary: bpo-46415: Use f-string for ValueError in ipaddress.ip_{address,network,interface} helper functions (GH-30642) `IPv*Network` and `IPv*Interface` constructors accept a 2-tuple of (address description, netmask) as the address parameter. When the tuple-based address is used errors are not propagated correctly through the `ipaddress.ip_*` helper because of the %-formatting now expecting several arguments: In [7]: ipaddress.ip_network(("192.168.100.0", "fooo")) ... TypeError: not all arguments converted during string formatting Compared to: In [8]: ipaddress.IPv4Network(("192.168.100.0", "foo")) ... NetmaskValueError: 'foo' is not a valid netmask Use an f-string to make sure the error is always properly formatted. Co-authored-by: Jelle Zijlstra (cherry picked from commit 52dc9c3066bcdc67a7a45d41cf158ecb1434d5f3) Co-authored-by: Thomas Cellerier files: A Misc/NEWS.d/next/Library/2022-01-17-16-53-30.bpo-46415.6wSYg-.rst M Lib/ipaddress.py M Lib/test/test_ipaddress.py diff --git a/Lib/ipaddress.py b/Lib/ipaddress.py index 4a6496a5da3ef..756f1bc38c97f 100644 --- a/Lib/ipaddress.py +++ b/Lib/ipaddress.py @@ -51,8 +51,7 @@ def ip_address(address): except (AddressValueError, NetmaskValueError): pass - raise ValueError('%r does not appear to be an IPv4 or IPv6 address' % - address) + raise ValueError(f'{address!r} does not appear to be an IPv4 or IPv6 address') def ip_network(address, strict=True): @@ -81,8 +80,7 @@ def ip_network(address, strict=True): except (AddressValueError, NetmaskValueError): pass - raise ValueError('%r does not appear to be an IPv4 or IPv6 network' % - address) + raise ValueError(f'{address!r} does not appear to be an IPv4 or IPv6 network') def ip_interface(address): @@ -116,8 +114,7 @@ def ip_interface(address): except (AddressValueError, NetmaskValueError): pass - raise ValueError('%r does not appear to be an IPv4 or IPv6 interface' % - address) + raise ValueError(f'{address!r} does not appear to be an IPv4 or IPv6 interface') def v4_int_to_packed(address): @@ -160,7 +157,7 @@ def _split_optional_netmask(address): """Helper to split the netmask and raise AddressValueError if needed""" addr = str(address).split('/') if len(addr) > 2: - raise AddressValueError("Only one '/' permitted in %r" % address) + raise AddressValueError(f"Only one '/' permitted in {address!r}") return addr @@ -1304,7 +1301,7 @@ def __init__(self, address): # which converts into a formatted IP string. addr_str = str(address) if '/' in addr_str: - raise AddressValueError("Unexpected '/' in %r" % address) + raise AddressValueError(f"Unexpected '/' in {address!r}") self._ip = self._ip_int_from_string(addr_str) @property @@ -1913,7 +1910,7 @@ def __init__(self, address): # which converts into a formatted IP string. addr_str = str(address) if '/' in addr_str: - raise AddressValueError("Unexpected '/' in %r" % address) + raise AddressValueError(f"Unexpected '/' in {address!r}") addr_str, self._scope_id = self._split_scope_id(addr_str) self._ip = self._ip_int_from_string(addr_str) diff --git a/Lib/test/test_ipaddress.py b/Lib/test/test_ipaddress.py index ff77bdb1bbc58..b2bb609ea8b4b 100644 --- a/Lib/test/test_ipaddress.py +++ b/Lib/test/test_ipaddress.py @@ -1133,6 +1133,14 @@ def testIPv4Tuple(self): self.assertEqual(ipaddress.IPv4Interface((3221225985, 24)), ipaddress.IPv4Interface('192.0.2.1/24')) + # Invalid netmask + with self.assertRaises(ValueError): + ipaddress.IPv4Network(('192.0.2.1', '255.255.255.255.0')) + + # Invalid netmask using factory + with self.assertRaises(ValueError): + ipaddress.ip_network(('192.0.2.1', '255.255.255.255.0')) + # issue #16531: constructing IPv6Network from an (address, mask) tuple def testIPv6Tuple(self): # /128 @@ -1192,6 +1200,14 @@ def testIPv6Tuple(self): ipaddress.IPv6Network((ip_scoped, 96)) # strict=False and host bits set + # Invalid netmask + with self.assertRaises(ValueError): + ipaddress.IPv6Network(('2001:db8::1', '255.255.255.0')) + + # Invalid netmask using factory + with self.assertRaises(ValueError): + ipaddress.ip_network(('2001:db8::1', '255.255.255.0')) + # issue57 def testAddressIntMath(self): self.assertEqual(ipaddress.IPv4Address('1.1.1.1') + 255, diff --git a/Misc/NEWS.d/next/Library/2022-01-17-16-53-30.bpo-46415.6wSYg-.rst b/Misc/NEWS.d/next/Library/2022-01-17-16-53-30.bpo-46415.6wSYg-.rst new file mode 100644 index 0000000000000..016d6656041f9 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-01-17-16-53-30.bpo-46415.6wSYg-.rst @@ -0,0 +1,2 @@ +Fix ipaddress.ip_{address,interface,network} raising TypeError instead of +ValueError if given invalid tuple as address parameter. From webhook-mailer at python.org Tue May 3 09:13:48 2022 From: webhook-mailer at python.org (Fidget-Spinner) Date: Tue, 03 May 2022 13:13:48 -0000 Subject: [Python-checkins] gh-92154: Expose PyCode_GetCode in the C API (GH-92168) Message-ID: https://github.com/python/cpython/commit/6c7249f2655749a06b4674a17537f844bd54d217 commit: 6c7249f2655749a06b4674a17537f844bd54d217 branch: main author: Ken Jin committer: Fidget-Spinner date: 2022-05-03T21:13:13+08:00 summary: gh-92154: Expose PyCode_GetCode in the C API (GH-92168) files: A Misc/NEWS.d/next/C API/2022-05-03-20-08-35.gh-issue-92154.IqMcAJ.rst M Doc/c-api/code.rst M Doc/whatsnew/3.11.rst M Include/cpython/code.h M Modules/_testcapimodule.c M Objects/codeobject.c diff --git a/Doc/c-api/code.rst b/Doc/c-api/code.rst index 407d8b481be4a..7915b81b46377 100644 --- a/Doc/c-api/code.rst +++ b/Doc/c-api/code.rst @@ -76,3 +76,17 @@ bound into a function. information is not available for any particular element. Returns ``1`` if the function succeeds and 0 otherwise. + +.. c:function:: PyObject* PyCode_GetCode(PyCodeObject *co) + + Equivalent to the Python code ``getattr(co, 'co_code')``. + Returns a strong reference to a :c:type:`PyBytesObject` representing the + bytecode in a code object. On error, ``NULL`` is returned and an exception + is raised. + + This ``PyBytesObject`` may be created on-demand by the interpreter and does + not necessarily represent the bytecode actually executed by CPython. The + primary use case for this function is debuggers and profilers. + + .. versionadded:: 3.11 + diff --git a/Doc/whatsnew/3.11.rst b/Doc/whatsnew/3.11.rst index 607f2e749bb5a..c19f158f57a31 100644 --- a/Doc/whatsnew/3.11.rst +++ b/Doc/whatsnew/3.11.rst @@ -1412,6 +1412,11 @@ C API Changes To get a custom code object: create a code object using the compiler, then get a modified version with the ``replace`` method. +* :c:type:`PyCodeObject` no longer has a ``co_code`` field. Instead, + use ``PyObject_GetAttrString(code_object, "co_code")`` or + :c:func:`PyCode_GetCode` to get the underlying bytes object. + (Contributed by Brandt Bucher in :issue:`46841` and Ken Jin in :gh:`92154`.) + New Features ------------ diff --git a/Include/cpython/code.h b/Include/cpython/code.h index be3b10bba724b..ba7324b48d867 100644 --- a/Include/cpython/code.h +++ b/Include/cpython/code.h @@ -202,6 +202,9 @@ PyAPI_FUNC(int) _PyCode_GetExtra(PyObject *code, Py_ssize_t index, PyAPI_FUNC(int) _PyCode_SetExtra(PyObject *code, Py_ssize_t index, void *extra); +/* Equivalent to getattr(code, 'co_code') in Python. + Returns a strong reference to a bytes object. */ +PyAPI_FUNC(PyObject *) PyCode_GetCode(PyCodeObject *code); typedef enum _PyCodeLocationInfoKind { /* short forms are 0 to 9 */ diff --git a/Misc/NEWS.d/next/C API/2022-05-03-20-08-35.gh-issue-92154.IqMcAJ.rst b/Misc/NEWS.d/next/C API/2022-05-03-20-08-35.gh-issue-92154.IqMcAJ.rst new file mode 100644 index 0000000000000..7713954fe72e9 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2022-05-03-20-08-35.gh-issue-92154.IqMcAJ.rst @@ -0,0 +1,2 @@ +Added the :c:func:`PyCode_GetCode` function. This function does the +equivalent of the Python code ``getattr(code_object, 'co_code')``. diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index 9073f33e226bd..26d8d38f2f795 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -5931,6 +5931,29 @@ get_feature_macros(PyObject *self, PyObject *Py_UNUSED(args)) return result; } +static PyObject * +test_code_api(PyObject *self, PyObject *Py_UNUSED(args)) +{ + PyCodeObject *co = PyCode_NewEmpty("_testcapi", "dummy", 1); + if (co == NULL) { + return NULL; + } + PyObject *co_code = PyCode_GetCode(co); + if (co_code == NULL) { + Py_DECREF(co); + return NULL; + } + assert(PyBytes_CheckExact(co_code)); + if (PyObject_Length(co_code) == 0) { + PyErr_SetString(PyExc_ValueError, "empty co_code"); + Py_DECREF(co); + Py_DECREF(co_code); + return NULL; + } + Py_DECREF(co); + Py_DECREF(co_code); + Py_RETURN_NONE; +} static PyObject *negative_dictoffset(PyObject *, PyObject *); static PyObject *test_buildvalue_issue38913(PyObject *, PyObject *); @@ -6227,6 +6250,7 @@ static PyMethodDef TestMethods[] = { {"frame_getbuiltins", frame_getbuiltins, METH_O, NULL}, {"frame_getlasti", frame_getlasti, METH_O, NULL}, {"get_feature_macros", get_feature_macros, METH_NOARGS, NULL}, + {"test_code_api", test_code_api, METH_NOARGS, NULL}, {NULL, NULL} /* sentinel */ }; diff --git a/Objects/codeobject.c b/Objects/codeobject.c index e3e4ca159a632..9f922dabeac63 100644 --- a/Objects/codeobject.c +++ b/Objects/codeobject.c @@ -1370,6 +1370,11 @@ _PyCode_GetCode(PyCodeObject *co) return code; } +PyObject * +PyCode_GetCode(PyCodeObject *co) +{ + return _PyCode_GetCode(co); +} /****************** * PyCode_Type From webhook-mailer at python.org Tue May 3 09:21:50 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Tue, 03 May 2022 13:21:50 -0000 Subject: [Python-checkins] bpo-44863: Allow generic typing.TypedDict (#27663) Message-ID: https://github.com/python/cpython/commit/f6f36cc26978e3036a6c5c068fca5b8135f27ef3 commit: f6f36cc26978e3036a6c5c068fca5b8135f27ef3 branch: main author: Samodya Abey <379594+sransara at users.noreply.github.com> committer: JelleZijlstra date: 2022-05-03T07:21:42-06:00 summary: bpo-44863: Allow generic typing.TypedDict (#27663) Co-authored-by: Ken Jin <28750310+Fidget-Spinner at users.noreply.github.com> Co-authored-by: Yurii Karabas <1998uriyyo at gmail.com> Co-authored-by: Jelle Zijlstra Co-authored-by: Serhiy Storchaka files: A Misc/NEWS.d/next/Library/2021-09-03-07-56-48.bpo-44863.udgz95.rst M Doc/library/typing.rst M Doc/whatsnew/3.11.rst M Lib/test/_typed_dict_helper.py M Lib/test/test_typing.py M Lib/typing.py diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index 05ac05767f32e..c9fc944fdeb56 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -1738,7 +1738,7 @@ These are not used in annotations. They are building blocks for declaring types. z: int A ``TypedDict`` cannot inherit from a non-TypedDict class, - notably including :class:`Generic`. For example:: + except for :class:`Generic`. For example:: class X(TypedDict): x: int @@ -1755,6 +1755,12 @@ These are not used in annotations. They are building blocks for declaring types. T = TypeVar('T') class XT(X, Generic[T]): pass # raises TypeError + A ``TypedDict`` can be generic:: + + class Group(TypedDict, Generic[T]): + key: T + group: list[T] + A ``TypedDict`` can be introspected via annotations dicts (see :ref:`annotations-howto` for more information on annotations best practices), :attr:`__total__`, :attr:`__required_keys__`, and :attr:`__optional_keys__`. @@ -1802,6 +1808,9 @@ These are not used in annotations. They are building blocks for declaring types. .. versionadded:: 3.8 + .. versionchanged:: 3.11 + Added support for generic ``TypedDict``\ s. + Generic concrete collections ---------------------------- diff --git a/Doc/whatsnew/3.11.rst b/Doc/whatsnew/3.11.rst index c19f158f57a31..2f32b56423de7 100644 --- a/Doc/whatsnew/3.11.rst +++ b/Doc/whatsnew/3.11.rst @@ -715,7 +715,10 @@ For major changes, see :ref:`new-feat-related-type-hints-311`. to clear all registered overloads of a function. (Contributed by Jelle Zijlstra in :gh:`89263`.) -* :class:`~typing.NamedTuple` subclasses can be generic. +* :data:`typing.TypedDict` subclasses can now be generic. (Contributed by + Samodya Abey in :gh:`89026`.) + +* :class:`~typing.NamedTuple` subclasses can now be generic. (Contributed by Serhiy Storchaka in :issue:`43923`.) diff --git a/Lib/test/_typed_dict_helper.py b/Lib/test/_typed_dict_helper.py index 3328330c995b3..9df0ede7d40ee 100644 --- a/Lib/test/_typed_dict_helper.py +++ b/Lib/test/_typed_dict_helper.py @@ -13,12 +13,18 @@ class Bar(_typed_dict_helper.Foo, total=False): from __future__ import annotations -from typing import Annotated, Optional, Required, TypedDict +from typing import Annotated, Generic, Optional, Required, TypedDict, TypeVar + OptionalIntType = Optional[int] class Foo(TypedDict): a: OptionalIntType +T = TypeVar("T") + +class FooGeneric(TypedDict, Generic[T]): + a: Optional[T] + class VeryAnnotated(TypedDict, total=False): a: Annotated[Annotated[Annotated[Required[int], "a"], "b"], "c"] diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index 08f7d0211eafb..55e18c08537df 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -4530,9 +4530,16 @@ class Point2D(TypedDict): x: int y: int +class Point2DGeneric(Generic[T], TypedDict): + a: T + b: T + class Bar(_typed_dict_helper.Foo, total=False): b: int +class BarGeneric(_typed_dict_helper.FooGeneric[T], total=False): + b: int + class LabelPoint2D(Point2D, Label): ... class Options(TypedDict, total=False): @@ -5890,6 +5897,17 @@ def test_pickle(self): EmpDnew = pickle.loads(ZZ) self.assertEqual(EmpDnew({'name': 'jane', 'id': 37}), jane) + def test_pickle_generic(self): + point = Point2DGeneric(a=5.0, b=3.0) + for proto in range(pickle.HIGHEST_PROTOCOL + 1): + z = pickle.dumps(point, proto) + point2 = pickle.loads(z) + self.assertEqual(point2, point) + self.assertEqual(point2, {'a': 5.0, 'b': 3.0}) + ZZ = pickle.dumps(Point2DGeneric, proto) + Point2DGenericNew = pickle.loads(ZZ) + self.assertEqual(Point2DGenericNew({'a': 5.0, 'b': 3.0}), point) + def test_optional(self): EmpD = TypedDict('EmpD', {'name': str, 'id': int}) @@ -6074,6 +6092,124 @@ def test_get_type_hints(self): {'a': typing.Optional[int], 'b': int} ) + def test_get_type_hints_generic(self): + self.assertEqual( + get_type_hints(BarGeneric), + {'a': typing.Optional[T], 'b': int} + ) + + class FooBarGeneric(BarGeneric[int]): + c: str + + self.assertEqual( + get_type_hints(FooBarGeneric), + {'a': typing.Optional[T], 'b': int, 'c': str} + ) + + def test_generic_inheritance(self): + class A(TypedDict, Generic[T]): + a: T + + self.assertEqual(A.__bases__, (Generic, dict)) + self.assertEqual(A.__orig_bases__, (TypedDict, Generic[T])) + self.assertEqual(A.__mro__, (A, Generic, dict, object)) + self.assertEqual(A.__parameters__, (T,)) + self.assertEqual(A[str].__parameters__, ()) + self.assertEqual(A[str].__args__, (str,)) + + class A2(Generic[T], TypedDict): + a: T + + self.assertEqual(A2.__bases__, (Generic, dict)) + self.assertEqual(A2.__orig_bases__, (Generic[T], TypedDict)) + self.assertEqual(A2.__mro__, (A2, Generic, dict, object)) + self.assertEqual(A2.__parameters__, (T,)) + self.assertEqual(A2[str].__parameters__, ()) + self.assertEqual(A2[str].__args__, (str,)) + + class B(A[KT], total=False): + b: KT + + self.assertEqual(B.__bases__, (Generic, dict)) + self.assertEqual(B.__orig_bases__, (A[KT],)) + self.assertEqual(B.__mro__, (B, Generic, dict, object)) + self.assertEqual(B.__parameters__, (KT,)) + self.assertEqual(B.__total__, False) + self.assertEqual(B.__optional_keys__, frozenset(['b'])) + self.assertEqual(B.__required_keys__, frozenset(['a'])) + + self.assertEqual(B[str].__parameters__, ()) + self.assertEqual(B[str].__args__, (str,)) + self.assertEqual(B[str].__origin__, B) + + class C(B[int]): + c: int + + self.assertEqual(C.__bases__, (Generic, dict)) + self.assertEqual(C.__orig_bases__, (B[int],)) + self.assertEqual(C.__mro__, (C, Generic, dict, object)) + self.assertEqual(C.__parameters__, ()) + self.assertEqual(C.__total__, True) + self.assertEqual(C.__optional_keys__, frozenset(['b'])) + self.assertEqual(C.__required_keys__, frozenset(['a', 'c'])) + assert C.__annotations__ == { + 'a': T, + 'b': KT, + 'c': int, + } + with self.assertRaises(TypeError): + C[str] + + + class Point3D(Point2DGeneric[T], Generic[T, KT]): + c: KT + + self.assertEqual(Point3D.__bases__, (Generic, dict)) + self.assertEqual(Point3D.__orig_bases__, (Point2DGeneric[T], Generic[T, KT])) + self.assertEqual(Point3D.__mro__, (Point3D, Generic, dict, object)) + self.assertEqual(Point3D.__parameters__, (T, KT)) + self.assertEqual(Point3D.__total__, True) + self.assertEqual(Point3D.__optional_keys__, frozenset()) + self.assertEqual(Point3D.__required_keys__, frozenset(['a', 'b', 'c'])) + assert Point3D.__annotations__ == { + 'a': T, + 'b': T, + 'c': KT, + } + self.assertEqual(Point3D[int, str].__origin__, Point3D) + + with self.assertRaises(TypeError): + Point3D[int] + + with self.assertRaises(TypeError): + class Point3D(Point2DGeneric[T], Generic[KT]): + c: KT + + def test_implicit_any_inheritance(self): + class A(TypedDict, Generic[T]): + a: T + + class B(A[KT], total=False): + b: KT + + class WithImplicitAny(B): + c: int + + self.assertEqual(WithImplicitAny.__bases__, (Generic, dict,)) + self.assertEqual(WithImplicitAny.__mro__, (WithImplicitAny, Generic, dict, object)) + # Consistent with GenericTests.test_implicit_any + self.assertEqual(WithImplicitAny.__parameters__, ()) + self.assertEqual(WithImplicitAny.__total__, True) + self.assertEqual(WithImplicitAny.__optional_keys__, frozenset(['b'])) + self.assertEqual(WithImplicitAny.__required_keys__, frozenset(['a', 'c'])) + assert WithImplicitAny.__annotations__ == { + 'a': T, + 'b': KT, + 'c': int, + } + with self.assertRaises(TypeError): + WithImplicitAny[str] + def test_non_generic_subscript(self): # For backward compatibility, subscription works # on arbitrary TypedDict types. diff --git a/Lib/typing.py b/Lib/typing.py index 84f0fd1a8a946..bdc14e39033dc 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -1796,7 +1796,9 @@ def __init_subclass__(cls, *args, **kwargs): if '__orig_bases__' in cls.__dict__: error = Generic in cls.__orig_bases__ else: - error = Generic in cls.__bases__ and cls.__name__ != 'Protocol' + error = (Generic in cls.__bases__ and + cls.__name__ != 'Protocol' and + type(cls) != _TypedDictMeta) if error: raise TypeError("Cannot inherit from plain Generic") if '__orig_bases__' in cls.__dict__: @@ -2868,14 +2870,19 @@ def __new__(cls, name, bases, ns, total=True): Subclasses and instances of TypedDict return actual dictionaries. """ for base in bases: - if type(base) is not _TypedDictMeta: + if type(base) is not _TypedDictMeta and base is not Generic: raise TypeError('cannot inherit from both a TypedDict type ' 'and a non-TypedDict base class') - tp_dict = type.__new__(_TypedDictMeta, name, (dict,), ns) + + if any(issubclass(b, Generic) for b in bases): + generic_base = (Generic,) + else: + generic_base = () + + tp_dict = type.__new__(_TypedDictMeta, name, (*generic_base, dict), ns) annotations = {} own_annotations = ns.get('__annotations__', {}) - own_annotation_keys = set(own_annotations.keys()) msg = "TypedDict('Name', {f0: t0, f1: t1, ...}); each t must be a type" own_annotations = { n: _type_check(tp, msg, module=tp_dict.__module__) diff --git a/Misc/NEWS.d/next/Library/2021-09-03-07-56-48.bpo-44863.udgz95.rst b/Misc/NEWS.d/next/Library/2021-09-03-07-56-48.bpo-44863.udgz95.rst new file mode 100644 index 0000000000000..130856587fd91 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2021-09-03-07-56-48.bpo-44863.udgz95.rst @@ -0,0 +1,4 @@ +Allow :class:`~typing.TypedDict` subclasses to also include +:class:`~typing.Generic` as a base class in class based syntax. Thereby allowing +the user to define a generic ``TypedDict``, just like a user-defined generic but +with ``TypedDict`` semantics. From webhook-mailer at python.org Tue May 3 10:37:40 2022 From: webhook-mailer at python.org (vstinner) Date: Tue, 03 May 2022 14:37:40 -0000 Subject: [Python-checkins] gh-92135: Rename _Py_reinterpret_cast() to _Py_CAST() (#92230) Message-ID: https://github.com/python/cpython/commit/fbd5539a54a1cf79dd9623a24d42d363bf084897 commit: fbd5539a54a1cf79dd9623a24d42d363bf084897 branch: main author: Victor Stinner committer: vstinner date: 2022-05-03T16:37:06+02:00 summary: gh-92135: Rename _Py_reinterpret_cast() to _Py_CAST() (#92230) Rename also _Py_static_cast() to _Py_STATIC_CAST(). files: M Include/cpython/abstract.h M Include/cpython/listobject.h M Include/cpython/methodobject.h M Include/cpython/tupleobject.h M Include/cpython/unicodeobject.h M Include/methodobject.h M Include/object.h M Include/objimpl.h M Include/pyport.h diff --git a/Include/cpython/abstract.h b/Include/cpython/abstract.h index 42f766da99116..77e2cfa02ed07 100644 --- a/Include/cpython/abstract.h +++ b/Include/cpython/abstract.h @@ -51,7 +51,7 @@ PyAPI_FUNC(PyObject *) _PyObject_MakeTpCall( PyObject *keywords); #define PY_VECTORCALL_ARGUMENTS_OFFSET \ - (_Py_static_cast(size_t, 1) << (8 * sizeof(size_t) - 1)) + (_Py_STATIC_CAST(size_t, 1) << (8 * sizeof(size_t) - 1)) static inline Py_ssize_t PyVectorcall_NARGS(size_t n) diff --git a/Include/cpython/listobject.h b/Include/cpython/listobject.h index 298bfcbf1438e..ebbea5ebf1ebc 100644 --- a/Include/cpython/listobject.h +++ b/Include/cpython/listobject.h @@ -26,7 +26,7 @@ PyAPI_FUNC(void) _PyList_DebugMallocStats(FILE *out); /* Cast argument to PyListObject* type. */ #define _PyList_CAST(op) \ - (assert(PyList_Check(op)), _Py_reinterpret_cast(PyListObject*, (op))) + (assert(PyList_Check(op)), _Py_CAST(PyListObject*, (op))) // Macros and static inline functions, trading safety for speed diff --git a/Include/cpython/methodobject.h b/Include/cpython/methodobject.h index 68cecfe05ba1e..bbb67ec762036 100644 --- a/Include/cpython/methodobject.h +++ b/Include/cpython/methodobject.h @@ -9,10 +9,10 @@ PyAPI_DATA(PyTypeObject) PyCMethod_Type; #define _PyCFunctionObject_CAST(func) \ (assert(PyCFunction_Check(func)), \ - _Py_reinterpret_cast(PyCFunctionObject*, (func))) + _Py_CAST(PyCFunctionObject*, (func))) #define _PyCMethodObject_CAST(func) \ (assert(PyCMethod_Check(func)), \ - _Py_reinterpret_cast(PyCMethodObject*, (func))) + _Py_CAST(PyCMethodObject*, (func))) /* Macros for direct access to these values. Type checks are *not* done, so use with care. */ diff --git a/Include/cpython/tupleobject.h b/Include/cpython/tupleobject.h index 8089e2409ce60..d5b810e5f4277 100644 --- a/Include/cpython/tupleobject.h +++ b/Include/cpython/tupleobject.h @@ -15,7 +15,7 @@ PyAPI_FUNC(void) _PyTuple_MaybeUntrack(PyObject *); /* Cast argument to PyTupleObject* type. */ #define _PyTuple_CAST(op) \ - (assert(PyTuple_Check(op)), _Py_reinterpret_cast(PyTupleObject*, (op))) + (assert(PyTuple_Check(op)), _Py_CAST(PyTupleObject*, (op))) // Macros and static inline functions, trading safety for speed diff --git a/Include/cpython/unicodeobject.h b/Include/cpython/unicodeobject.h index 0397f12a8260b..47194ac7829fd 100644 --- a/Include/cpython/unicodeobject.h +++ b/Include/cpython/unicodeobject.h @@ -237,13 +237,13 @@ PyAPI_FUNC(int) _PyUnicode_CheckConsistency( #define _PyASCIIObject_CAST(op) \ (assert(PyUnicode_Check(op)), \ - _Py_reinterpret_cast(PyASCIIObject*, (op))) + _Py_CAST(PyASCIIObject*, (op))) #define _PyCompactUnicodeObject_CAST(op) \ (assert(PyUnicode_Check(op)), \ - _Py_reinterpret_cast(PyCompactUnicodeObject*, (op))) + _Py_CAST(PyCompactUnicodeObject*, (op))) #define _PyUnicodeObject_CAST(op) \ (assert(PyUnicode_Check(op)), \ - _Py_reinterpret_cast(PyUnicodeObject*, (op))) + _Py_CAST(PyUnicodeObject*, (op))) /* --- Flexible String Representation Helper Macros (PEP 393) -------------- */ diff --git a/Include/methodobject.h b/Include/methodobject.h index f4be3858f2f8a..c971d78a640a6 100644 --- a/Include/methodobject.h +++ b/Include/methodobject.h @@ -43,7 +43,7 @@ typedef PyObject *(*PyCMethod)(PyObject *, PyTypeObject *, PyObject *const *, // it triggers an undefined behavior when Python calls it with 2 parameters // (bpo-33012). #define _PyCFunction_CAST(func) \ - _Py_reinterpret_cast(PyCFunction, _Py_reinterpret_cast(void(*)(void), (func))) + _Py_CAST(PyCFunction, _Py_CAST(void(*)(void), (func))) PyAPI_FUNC(PyCFunction) PyCFunction_GetFunction(PyObject *); PyAPI_FUNC(PyObject *) PyCFunction_GetSelf(PyObject *); diff --git a/Include/object.h b/Include/object.h index c51f12b65624d..f93ecce13b409 100644 --- a/Include/object.h +++ b/Include/object.h @@ -104,7 +104,7 @@ struct _object { }; /* Cast argument to PyObject* type. */ -#define _PyObject_CAST(op) _Py_reinterpret_cast(PyObject*, (op)) +#define _PyObject_CAST(op) _Py_CAST(PyObject*, (op)) typedef struct { PyObject ob_base; @@ -112,7 +112,7 @@ typedef struct { } PyVarObject; /* Cast argument to PyVarObject* type. */ -#define _PyVarObject_CAST(op) _Py_reinterpret_cast(PyVarObject*, (op)) +#define _PyVarObject_CAST(op) _Py_CAST(PyVarObject*, (op)) // Test if the 'x' object is the 'y' object, the same as "x is y" in Python. @@ -781,7 +781,7 @@ static inline int PyType_Check(PyObject *op) { #endif #define _PyType_CAST(op) \ - (assert(PyType_Check(op)), _Py_reinterpret_cast(PyTypeObject*, (op))) + (assert(PyType_Check(op)), _Py_CAST(PyTypeObject*, (op))) static inline int PyType_CheckExact(PyObject *op) { return Py_IS_TYPE(op, &PyType_Type); diff --git a/Include/objimpl.h b/Include/objimpl.h index c8e57c9755749..4fa670e71ab46 100644 --- a/Include/objimpl.h +++ b/Include/objimpl.h @@ -182,9 +182,9 @@ PyAPI_FUNC(void) PyObject_GC_UnTrack(void *); PyAPI_FUNC(void) PyObject_GC_Del(void *); #define PyObject_GC_New(type, typeobj) \ - _Py_reinterpret_cast(type*, _PyObject_GC_New(typeobj)) + _Py_CAST(type*, _PyObject_GC_New(typeobj)) #define PyObject_GC_NewVar(type, typeobj, n) \ - _Py_reinterpret_cast(type*, _PyObject_GC_NewVar((typeobj), (n))) + _Py_CAST(type*, _PyObject_GC_NewVar((typeobj), (n))) PyAPI_FUNC(int) PyObject_GC_IsTracked(PyObject *); PyAPI_FUNC(int) PyObject_GC_IsFinalized(PyObject *); diff --git a/Include/pyport.h b/Include/pyport.h index 3f5ce672bdafe..f6270be0ce5c0 100644 --- a/Include/pyport.h +++ b/Include/pyport.h @@ -17,20 +17,20 @@ // Macro to use C++ static_cast<>, reinterpret_cast<> and const_cast<> // in the Python C API. // -// In C++, _Py_reinterpret_cast(type, expr) converts a constant expression to a +// In C++, _Py_CAST(type, expr) converts a constant expression to a // non constant type using const_cast. For example, -// _Py_reinterpret_cast(PyObject*, op) can convert a "const PyObject*" to +// _Py_CAST(PyObject*, op) can convert a "const PyObject*" to // "PyObject*". // // The type argument must not be constant. For example, in C++, -// _Py_reinterpret_cast(const PyObject*, expr) fails with a compiler error. +// _Py_CAST(const PyObject*, expr) fails with a compiler error. #ifdef __cplusplus -# define _Py_static_cast(type, expr) static_cast(expr) -# define _Py_reinterpret_cast(type, expr) \ +# define _Py_STATIC_CAST(type, expr) static_cast(expr) +# define _Py_CAST(type, expr) \ const_cast(reinterpret_cast(expr)) #else -# define _Py_static_cast(type, expr) ((type)(expr)) -# define _Py_reinterpret_cast(type, expr) ((type)(expr)) +# define _Py_STATIC_CAST(type, expr) ((type)(expr)) +# define _Py_CAST(type, expr) ((type)(expr)) #endif @@ -317,10 +317,10 @@ extern "C" { */ #ifdef Py_DEBUG # define Py_SAFE_DOWNCAST(VALUE, WIDE, NARROW) \ - (assert(_Py_static_cast(WIDE, _Py_static_cast(NARROW, (VALUE))) == (VALUE)), \ - _Py_static_cast(NARROW, (VALUE))) + (assert(_Py_STATIC_CAST(WIDE, _Py_STATIC_CAST(NARROW, (VALUE))) == (VALUE)), \ + _Py_STATIC_CAST(NARROW, (VALUE))) #else -# define Py_SAFE_DOWNCAST(VALUE, WIDE, NARROW) _Py_static_cast(NARROW, (VALUE)) +# define Py_SAFE_DOWNCAST(VALUE, WIDE, NARROW) _Py_STATIC_CAST(NARROW, (VALUE)) #endif From webhook-mailer at python.org Tue May 3 10:40:45 2022 From: webhook-mailer at python.org (Fidget-Spinner) Date: Tue, 03 May 2022 14:40:45 -0000 Subject: [Python-checkins] Link to GitHub instead of BPO for CPython bug tracker (GH-92221) Message-ID: https://github.com/python/cpython/commit/9dc4aae8e92cef0590b1130bd5d1c07c1b932b73 commit: 9dc4aae8e92cef0590b1130bd5d1c07c1b932b73 branch: main author: slateny <46876382+slateny at users.noreply.github.com> committer: Fidget-Spinner date: 2022-05-03T22:40:36+08:00 summary: Link to GitHub instead of BPO for CPython bug tracker (GH-92221) files: M Doc/README.rst M Doc/faq/general.rst diff --git a/Doc/README.rst b/Doc/README.rst index c0ac7c4d3d762..4326086e9e352 100644 --- a/Doc/README.rst +++ b/Doc/README.rst @@ -130,7 +130,7 @@ Contributing ============ Bugs in the content should be reported to the -`Python bug tracker `_. +`Python bug tracker `_. Bugs in the toolset should be reported to the tools themselves. diff --git a/Doc/faq/general.rst b/Doc/faq/general.rst index 99534c2ebf6e1..bc4130aaa45c8 100644 --- a/Doc/faq/general.rst +++ b/Doc/faq/general.rst @@ -230,14 +230,8 @@ You can also access the development version of Python through Git. See How do I submit bug reports and patches for Python? --------------------------------------------------- -To report a bug or submit a patch, please use the Roundup installation at -https://bugs.python.org/. - -You must have a Roundup account to report bugs; this makes it possible for us to -contact you if we have follow-up questions. It will also enable Roundup to send -you updates as we act on your bug. If you had previously used SourceForge to -report bugs to Python, you can obtain your Roundup password through Roundup's -`password reset procedure `_. +To report a bug or submit a patch, use the issue tracker at +https://github.com/python/cpython/issues. For more information on how Python is developed, consult `the Python Developer's Guide `_. From webhook-mailer at python.org Tue May 3 10:41:50 2022 From: webhook-mailer at python.org (corona10) Date: Tue, 03 May 2022 14:41:50 -0000 Subject: [Python-checkins] GH-91355: micro-optimize Connection.send_bytes() method (gh-32247) Message-ID: https://github.com/python/cpython/commit/1699128c4891da3bbe23553d709261d88855b93f commit: 1699128c4891da3bbe23553d709261d88855b93f branch: main author: Ma Lin committer: corona10 date: 2022-05-03T23:41:45+09:00 summary: GH-91355: micro-optimize Connection.send_bytes() method (gh-32247) files: M Lib/multiprocessing/connection.py diff --git a/Lib/multiprocessing/connection.py b/Lib/multiprocessing/connection.py index 1cca66d5661e3..65303d29f51f8 100644 --- a/Lib/multiprocessing/connection.py +++ b/Lib/multiprocessing/connection.py @@ -188,10 +188,9 @@ def send_bytes(self, buf, offset=0, size=None): self._check_closed() self._check_writable() m = memoryview(buf) - # HACK for byte-indexing of non-bytewise buffers (e.g. array.array) if m.itemsize > 1: - m = memoryview(bytes(m)) - n = len(m) + m = m.cast('B') + n = m.nbytes if offset < 0: raise ValueError("offset is negative") if n < offset: From webhook-mailer at python.org Tue May 3 10:54:00 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Tue, 03 May 2022 14:54:00 -0000 Subject: [Python-checkins] gh-90887: posix module: Add more flags for fcopy_file (#31300) Message-ID: https://github.com/python/cpython/commit/04dc4b06a3afc79a658cacca87ee1d93a34653bd commit: 04dc4b06a3afc79a658cacca87ee1d93a34653bd branch: main author: David CARLIER committer: JelleZijlstra date: 2022-05-03T08:53:51-06:00 summary: gh-90887: posix module: Add more flags for fcopy_file (#31300) Closes #90887 Co-authored-by: Jelle Zijlstra files: A Misc/NEWS.d/next/Library/2022-05-02-18-19-46.gh-issue-90887.zQsmfp.rst M Modules/posixmodule.c diff --git a/Misc/NEWS.d/next/Library/2022-05-02-18-19-46.gh-issue-90887.zQsmfp.rst b/Misc/NEWS.d/next/Library/2022-05-02-18-19-46.gh-issue-90887.zQsmfp.rst new file mode 100644 index 0000000000000..089f395105646 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-05-02-18-19-46.gh-issue-90887.zQsmfp.rst @@ -0,0 +1 @@ +Adding ``COPYFILE_STAT``, ``COPYFILE_ACL`` and ``COPYFILE_XATTR`` constants for :func:`os.fcopyfile` available in macOs. diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index a7f57804687cd..c55275c6c5511 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -15458,6 +15458,9 @@ all_ins(PyObject *m) #if defined(__APPLE__) if (PyModule_AddIntConstant(m, "_COPYFILE_DATA", COPYFILE_DATA)) return -1; + if (PyModule_AddIntConstant(m, "_COPYFILE_STAT", COPYFILE_STAT)) return -1; + if (PyModule_AddIntConstant(m, "_COPYFILE_ACL", COPYFILE_ACL)) return -1; + if (PyModule_AddIntConstant(m, "_COPYFILE_XATTR", COPYFILE_XATTR)) return -1; #endif #ifdef MS_WINDOWS From webhook-mailer at python.org Tue May 3 10:59:21 2022 From: webhook-mailer at python.org (markshannon) Date: Tue, 03 May 2022 14:59:21 -0000 Subject: [Python-checkins] gh-92031: Deoptimize Static Code at Finalization (GH-92039) Message-ID: https://github.com/python/cpython/commit/b156578bd63a94fe3d80a4c6a8dbc067feba5d06 commit: b156578bd63a94fe3d80a4c6a8dbc067feba5d06 branch: main author: Dennis Sweeney <36520290+sweeneyde at users.noreply.github.com> committer: markshannon date: 2022-05-03T08:59:12-06:00 summary: gh-92031: Deoptimize Static Code at Finalization (GH-92039) files: A Misc/NEWS.d/next/Core and Builtins/2022-04-29-02-50-41.gh-issue-92031.2PpaIN.rst M Include/internal/pycore_opcode.h M Lib/test/test_embed.py M Objects/codeobject.c M Tools/scripts/generate_opcode_h.py diff --git a/Include/internal/pycore_opcode.h b/Include/internal/pycore_opcode.h index eadcba1add0ae..09f6501467133 100644 --- a/Include/internal/pycore_opcode.h +++ b/Include/internal/pycore_opcode.h @@ -16,6 +16,8 @@ extern const uint8_t _PyOpcode_Caches[256]; extern const uint8_t _PyOpcode_Deopt[256]; +extern const uint8_t _PyOpcode_Original[256]; + #ifdef NEED_OPCODE_TABLES static const uint32_t _PyOpcode_RelativeJump[8] = { 0U, @@ -235,6 +237,190 @@ const uint8_t _PyOpcode_Deopt[256] = { [WITH_EXCEPT_START] = WITH_EXCEPT_START, [YIELD_VALUE] = YIELD_VALUE, }; + +const uint8_t _PyOpcode_Original[256] = { + [ASYNC_GEN_WRAP] = ASYNC_GEN_WRAP, + [BEFORE_ASYNC_WITH] = BEFORE_ASYNC_WITH, + [BEFORE_WITH] = BEFORE_WITH, + [BINARY_OP] = BINARY_OP, + [BINARY_OP_ADAPTIVE] = BINARY_OP, + [BINARY_OP_ADD_FLOAT] = BINARY_OP, + [BINARY_OP_ADD_INT] = BINARY_OP, + [BINARY_OP_ADD_UNICODE] = BINARY_OP, + [BINARY_OP_INPLACE_ADD_UNICODE] = BINARY_OP, + [BINARY_OP_MULTIPLY_FLOAT] = BINARY_OP, + [BINARY_OP_MULTIPLY_INT] = BINARY_OP, + [BINARY_OP_SUBTRACT_FLOAT] = BINARY_OP, + [BINARY_OP_SUBTRACT_INT] = BINARY_OP, + [BINARY_SUBSCR] = BINARY_SUBSCR, + [BINARY_SUBSCR_ADAPTIVE] = BINARY_SUBSCR, + [BINARY_SUBSCR_DICT] = BINARY_SUBSCR, + [BINARY_SUBSCR_GETITEM] = BINARY_SUBSCR, + [BINARY_SUBSCR_LIST_INT] = BINARY_SUBSCR, + [BINARY_SUBSCR_TUPLE_INT] = BINARY_SUBSCR, + [BUILD_CONST_KEY_MAP] = BUILD_CONST_KEY_MAP, + [BUILD_LIST] = BUILD_LIST, + [BUILD_MAP] = BUILD_MAP, + [BUILD_SET] = BUILD_SET, + [BUILD_SLICE] = BUILD_SLICE, + [BUILD_STRING] = BUILD_STRING, + [BUILD_TUPLE] = BUILD_TUPLE, + [CACHE] = CACHE, + [CALL] = CALL, + [CALL_ADAPTIVE] = CALL, + [CALL_FUNCTION_EX] = CALL_FUNCTION_EX, + [CALL_PY_EXACT_ARGS] = CALL, + [CALL_PY_WITH_DEFAULTS] = CALL, + [CHECK_EG_MATCH] = CHECK_EG_MATCH, + [CHECK_EXC_MATCH] = CHECK_EXC_MATCH, + [COMPARE_OP] = COMPARE_OP, + [COMPARE_OP_ADAPTIVE] = COMPARE_OP, + [COMPARE_OP_FLOAT_JUMP] = COMPARE_OP, + [COMPARE_OP_INT_JUMP] = COMPARE_OP, + [COMPARE_OP_STR_JUMP] = COMPARE_OP, + [CONTAINS_OP] = CONTAINS_OP, + [COPY] = COPY, + [COPY_FREE_VARS] = COPY_FREE_VARS, + [DELETE_ATTR] = DELETE_ATTR, + [DELETE_DEREF] = DELETE_DEREF, + [DELETE_FAST] = DELETE_FAST, + [DELETE_GLOBAL] = DELETE_GLOBAL, + [DELETE_NAME] = DELETE_NAME, + [DELETE_SUBSCR] = DELETE_SUBSCR, + [DICT_MERGE] = DICT_MERGE, + [DICT_UPDATE] = DICT_UPDATE, + [END_ASYNC_FOR] = END_ASYNC_FOR, + [EXTENDED_ARG] = EXTENDED_ARG_QUICK, + [EXTENDED_ARG_QUICK] = EXTENDED_ARG_QUICK, + [FORMAT_VALUE] = FORMAT_VALUE, + [FOR_ITER] = FOR_ITER, + [GET_AITER] = GET_AITER, + [GET_ANEXT] = GET_ANEXT, + [GET_AWAITABLE] = GET_AWAITABLE, + [GET_ITER] = GET_ITER, + [GET_LEN] = GET_LEN, + [GET_YIELD_FROM_ITER] = GET_YIELD_FROM_ITER, + [IMPORT_FROM] = IMPORT_FROM, + [IMPORT_NAME] = IMPORT_NAME, + [IMPORT_STAR] = IMPORT_STAR, + [IS_OP] = IS_OP, + [JUMP_BACKWARD] = JUMP_BACKWARD, + [JUMP_BACKWARD_NO_INTERRUPT] = JUMP_BACKWARD_NO_INTERRUPT, + [JUMP_BACKWARD_QUICK] = JUMP_BACKWARD, + [JUMP_FORWARD] = JUMP_FORWARD, + [JUMP_IF_FALSE_OR_POP] = JUMP_IF_FALSE_OR_POP, + [JUMP_IF_TRUE_OR_POP] = JUMP_IF_TRUE_OR_POP, + [KW_NAMES] = KW_NAMES, + [LIST_APPEND] = LIST_APPEND, + [LIST_EXTEND] = LIST_EXTEND, + [LIST_TO_TUPLE] = LIST_TO_TUPLE, + [LOAD_ASSERTION_ERROR] = LOAD_ASSERTION_ERROR, + [LOAD_ATTR] = LOAD_ATTR, + [LOAD_ATTR_ADAPTIVE] = LOAD_ATTR, + [LOAD_ATTR_INSTANCE_VALUE] = LOAD_ATTR, + [LOAD_ATTR_MODULE] = LOAD_ATTR, + [LOAD_ATTR_SLOT] = LOAD_ATTR, + [LOAD_ATTR_WITH_HINT] = LOAD_ATTR, + [LOAD_BUILD_CLASS] = LOAD_BUILD_CLASS, + [LOAD_CLASSDEREF] = LOAD_CLASSDEREF, + [LOAD_CLOSURE] = LOAD_CLOSURE, + [LOAD_CONST] = LOAD_CONST, + [LOAD_CONST__LOAD_FAST] = LOAD_CONST, + [LOAD_DEREF] = LOAD_DEREF, + [LOAD_FAST] = LOAD_FAST, + [LOAD_FAST__LOAD_CONST] = LOAD_FAST, + [LOAD_FAST__LOAD_FAST] = LOAD_FAST, + [LOAD_GLOBAL] = LOAD_GLOBAL, + [LOAD_GLOBAL_ADAPTIVE] = LOAD_GLOBAL, + [LOAD_GLOBAL_BUILTIN] = LOAD_GLOBAL, + [LOAD_GLOBAL_MODULE] = LOAD_GLOBAL, + [LOAD_METHOD] = LOAD_METHOD, + [LOAD_METHOD_ADAPTIVE] = LOAD_METHOD, + [LOAD_METHOD_CLASS] = LOAD_METHOD, + [LOAD_METHOD_MODULE] = LOAD_METHOD, + [LOAD_METHOD_NO_DICT] = LOAD_METHOD, + [LOAD_METHOD_WITH_DICT] = LOAD_METHOD, + [LOAD_METHOD_WITH_VALUES] = LOAD_METHOD, + [LOAD_NAME] = LOAD_NAME, + [MAKE_CELL] = MAKE_CELL, + [MAKE_FUNCTION] = MAKE_FUNCTION, + [MAP_ADD] = MAP_ADD, + [MATCH_CLASS] = MATCH_CLASS, + [MATCH_KEYS] = MATCH_KEYS, + [MATCH_MAPPING] = MATCH_MAPPING, + [MATCH_SEQUENCE] = MATCH_SEQUENCE, + [NOP] = NOP, + [POP_EXCEPT] = POP_EXCEPT, + [POP_JUMP_BACKWARD_IF_FALSE] = POP_JUMP_BACKWARD_IF_FALSE, + [POP_JUMP_BACKWARD_IF_NONE] = POP_JUMP_BACKWARD_IF_NONE, + [POP_JUMP_BACKWARD_IF_NOT_NONE] = POP_JUMP_BACKWARD_IF_NOT_NONE, + [POP_JUMP_BACKWARD_IF_TRUE] = POP_JUMP_BACKWARD_IF_TRUE, + [POP_JUMP_FORWARD_IF_FALSE] = POP_JUMP_FORWARD_IF_FALSE, + [POP_JUMP_FORWARD_IF_NONE] = POP_JUMP_FORWARD_IF_NONE, + [POP_JUMP_FORWARD_IF_NOT_NONE] = POP_JUMP_FORWARD_IF_NOT_NONE, + [POP_JUMP_FORWARD_IF_TRUE] = POP_JUMP_FORWARD_IF_TRUE, + [POP_TOP] = POP_TOP, + [PRECALL] = PRECALL, + [PRECALL_ADAPTIVE] = PRECALL, + [PRECALL_BOUND_METHOD] = PRECALL, + [PRECALL_BUILTIN_CLASS] = PRECALL, + [PRECALL_BUILTIN_FAST_WITH_KEYWORDS] = PRECALL, + [PRECALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS] = PRECALL, + [PRECALL_NO_KW_BUILTIN_FAST] = PRECALL, + [PRECALL_NO_KW_BUILTIN_O] = PRECALL, + [PRECALL_NO_KW_ISINSTANCE] = PRECALL, + [PRECALL_NO_KW_LEN] = PRECALL, + [PRECALL_NO_KW_LIST_APPEND] = PRECALL, + [PRECALL_NO_KW_METHOD_DESCRIPTOR_FAST] = PRECALL, + [PRECALL_NO_KW_METHOD_DESCRIPTOR_NOARGS] = PRECALL, + [PRECALL_NO_KW_METHOD_DESCRIPTOR_O] = PRECALL, + [PRECALL_NO_KW_STR_1] = PRECALL, + [PRECALL_NO_KW_TUPLE_1] = PRECALL, + [PRECALL_NO_KW_TYPE_1] = PRECALL, + [PRECALL_PYFUNC] = PRECALL, + [PREP_RERAISE_STAR] = PREP_RERAISE_STAR, + [PRINT_EXPR] = PRINT_EXPR, + [PUSH_EXC_INFO] = PUSH_EXC_INFO, + [PUSH_NULL] = PUSH_NULL, + [RAISE_VARARGS] = RAISE_VARARGS, + [RERAISE] = RERAISE, + [RESUME] = RESUME, + [RESUME_QUICK] = RESUME, + [RETURN_GENERATOR] = RETURN_GENERATOR, + [RETURN_VALUE] = RETURN_VALUE, + [SEND] = SEND, + [SETUP_ANNOTATIONS] = SETUP_ANNOTATIONS, + [SET_ADD] = SET_ADD, + [SET_UPDATE] = SET_UPDATE, + [STORE_ATTR] = STORE_ATTR, + [STORE_ATTR_ADAPTIVE] = STORE_ATTR, + [STORE_ATTR_INSTANCE_VALUE] = STORE_ATTR, + [STORE_ATTR_SLOT] = STORE_ATTR, + [STORE_ATTR_WITH_HINT] = STORE_ATTR, + [STORE_DEREF] = STORE_DEREF, + [STORE_FAST] = STORE_FAST, + [STORE_FAST__LOAD_FAST] = STORE_FAST, + [STORE_FAST__STORE_FAST] = STORE_FAST, + [STORE_GLOBAL] = STORE_GLOBAL, + [STORE_NAME] = STORE_NAME, + [STORE_SUBSCR] = STORE_SUBSCR, + [STORE_SUBSCR_ADAPTIVE] = STORE_SUBSCR, + [STORE_SUBSCR_DICT] = STORE_SUBSCR, + [STORE_SUBSCR_LIST_INT] = STORE_SUBSCR, + [SWAP] = SWAP, + [UNARY_INVERT] = UNARY_INVERT, + [UNARY_NEGATIVE] = UNARY_NEGATIVE, + [UNARY_NOT] = UNARY_NOT, + [UNARY_POSITIVE] = UNARY_POSITIVE, + [UNPACK_EX] = UNPACK_EX, + [UNPACK_SEQUENCE] = UNPACK_SEQUENCE, + [UNPACK_SEQUENCE_ADAPTIVE] = UNPACK_SEQUENCE, + [UNPACK_SEQUENCE_LIST] = UNPACK_SEQUENCE, + [UNPACK_SEQUENCE_TUPLE] = UNPACK_SEQUENCE, + [UNPACK_SEQUENCE_TWO_TUPLE] = UNPACK_SEQUENCE, + [WITH_EXCEPT_START] = WITH_EXCEPT_START, + [YIELD_VALUE] = YIELD_VALUE, +}; #endif // NEED_OPCODE_TABLES #ifdef Py_DEBUG diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index 16d1c7dea6b4f..9bb4bd7e8feb7 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -343,6 +343,20 @@ def test_finalize_structseq(self): out, err = self.run_embedded_interpreter("test_repeated_init_exec", code) self.assertEqual(out, 'Tests passed\n' * INIT_LOOPS) + @support.skip_if_pgo_task + def test_quickened_static_code_gets_unquickened_at_Py_FINALIZE(self): + # https://github.com/python/cpython/issues/92031 + code = """if 1: + from importlib._bootstrap import _handle_fromlist + import dis + for name in dis.opmap: + # quicken this frozen code object. + _handle_fromlist(dis, [name], lambda *args: None) + """ + run = self.run_embedded_interpreter + for i in range(50): + out, err = run("test_repeated_init_exec", code, timeout=60) + def test_ucnhash_capi_reset(self): # bpo-47182: unicodeobject.c:ucnhash_capi was not reset on shutdown. code = "print('\\N{digit nine}')" diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-04-29-02-50-41.gh-issue-92031.2PpaIN.rst b/Misc/NEWS.d/next/Core and Builtins/2022-04-29-02-50-41.gh-issue-92031.2PpaIN.rst new file mode 100644 index 0000000000000..6bdefb8afb116 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-04-29-02-50-41.gh-issue-92031.2PpaIN.rst @@ -0,0 +1 @@ +Deoptimize statically-allocated code objects during ``Py_FINALIZE()`` so that future ``_PyCode_Quicken`` calls always start with unquickened code. diff --git a/Objects/codeobject.c b/Objects/codeobject.c index 9f922dabeac63..c2b29be1fe869 100644 --- a/Objects/codeobject.c +++ b/Objects/codeobject.c @@ -1350,23 +1350,29 @@ _PyCode_GetFreevars(PyCodeObject *co) return get_localsplus_names(co, CO_FAST_FREE, co->co_nfreevars); } -PyObject * -_PyCode_GetCode(PyCodeObject *co) +static void +deopt_code(_Py_CODEUNIT *instructions, Py_ssize_t len) { - PyObject *code = PyBytes_FromStringAndSize(NULL, _PyCode_NBYTES(co)); - if (code == NULL) { - return NULL; - } - _Py_CODEUNIT *instructions = (_Py_CODEUNIT *)PyBytes_AS_STRING(code); - for (int i = 0; i < Py_SIZE(co); i++) { - _Py_CODEUNIT instruction = _PyCode_CODE(co)[i]; - int opcode = _PyOpcode_Deopt[_Py_OPCODE(instruction)]; + for (int i = 0; i < len; i++) { + _Py_CODEUNIT instruction = instructions[i]; + int opcode = _PyOpcode_Original[_Py_OPCODE(instruction)]; int caches = _PyOpcode_Caches[opcode]; instructions[i] = _Py_MAKECODEUNIT(opcode, _Py_OPARG(instruction)); while (caches--) { instructions[++i] = _Py_MAKECODEUNIT(CACHE, 0); } } +} + +PyObject * +_PyCode_GetCode(PyCodeObject *co) +{ + PyObject *code = PyBytes_FromStringAndSize((const char *)_PyCode_CODE(co), + _PyCode_NBYTES(co)); + if (code == NULL) { + return NULL; + } + deopt_code((_Py_CODEUNIT *)PyBytes_AS_STRING(code), Py_SIZE(co)); return code; } @@ -2076,6 +2082,7 @@ _PyStaticCode_Dealloc(PyCodeObject *co) if (co->co_warmup == 0) { _Py_QuickenedCount--; } + deopt_code(_PyCode_CODE(co), Py_SIZE(co)); co->co_warmup = QUICKENING_INITIAL_WARMUP_VALUE; PyMem_Free(co->co_extra); co->co_extra = NULL; diff --git a/Tools/scripts/generate_opcode_h.py b/Tools/scripts/generate_opcode_h.py index 6a04297879f2c..e1f4f01ae1de0 100644 --- a/Tools/scripts/generate_opcode_h.py +++ b/Tools/scripts/generate_opcode_h.py @@ -117,6 +117,7 @@ def main(opcode_py, outfile='Include/opcode.h', internaloutfile='Include/interna iobj.write("\nextern const uint8_t _PyOpcode_Caches[256];\n") iobj.write("\nextern const uint8_t _PyOpcode_Deopt[256];\n") + iobj.write("\nextern const uint8_t _PyOpcode_Original[256];\n") iobj.write("\n#ifdef NEED_OPCODE_TABLES\n") write_int_array_from_ops("_PyOpcode_RelativeJump", opcode['hasjrel'], iobj) write_int_array_from_ops("_PyOpcode_Jump", opcode['hasjrel'] + opcode['hasjabs'], iobj) @@ -137,6 +138,12 @@ def main(opcode_py, outfile='Include/opcode.h', internaloutfile='Include/interna for opt, deopt in sorted(deoptcodes.items()): iobj.write(f" [{opt}] = {deopt},\n") iobj.write("};\n") + iobj.write("\nconst uint8_t _PyOpcode_Original[256] = {\n") + for opt, deopt in sorted(deoptcodes.items()): + if opt.startswith("EXTENDED_ARG"): + deopt = "EXTENDED_ARG_QUICK" + iobj.write(f" [{opt}] = {deopt},\n") + iobj.write("};\n") iobj.write("#endif // NEED_OPCODE_TABLES\n") fobj.write("\n") From webhook-mailer at python.org Tue May 3 11:56:41 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Tue, 03 May 2022 15:56:41 -0000 Subject: [Python-checkins] bpo-46604: fix function name in ssl module docstring (#31064) Message-ID: https://github.com/python/cpython/commit/feca9bbd1f6489f2b6d2783bfc22fdb96e45b69f commit: feca9bbd1f6489f2b6d2783bfc22fdb96e45b69f branch: main author: Kossi GLOKPOR <83467320+glk0 at users.noreply.github.com> committer: JelleZijlstra date: 2022-05-03T09:56:24-06:00 summary: bpo-46604: fix function name in ssl module docstring (#31064) The function fetch_server_certificate is replaced by get_server_certificate in the module. I reflected the change in the module docstrings. Co-authored-by: Jelle Zijlstra files: M Lib/ssl.py diff --git a/Lib/ssl.py b/Lib/ssl.py index dafb70a67864c..ebac1d60d52de 100644 --- a/Lib/ssl.py +++ b/Lib/ssl.py @@ -18,9 +18,10 @@ seconds past the Epoch (the time values returned from time.time()) - fetch_server_certificate (HOST, PORT) -- fetch the certificate provided - by the server running on HOST at port PORT. No - validation of the certificate is performed. + get_server_certificate (addr, ssl_version, ca_certs, timeout) -- Retrieve the + certificate from the server at the specified + address and return it as a PEM-encoded string + Integer constants: From webhook-mailer at python.org Tue May 3 12:24:43 2022 From: webhook-mailer at python.org (miss-islington) Date: Tue, 03 May 2022 16:24:43 -0000 Subject: [Python-checkins] bpo-46604: fix function name in ssl module docstring (GH-31064) Message-ID: https://github.com/python/cpython/commit/58f2d2d10aed5edbde85403c17ad2a54eb37db54 commit: 58f2d2d10aed5edbde85403c17ad2a54eb37db54 branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-03T09:24:39-07:00 summary: bpo-46604: fix function name in ssl module docstring (GH-31064) The function fetch_server_certificate is replaced by get_server_certificate in the module. I reflected the change in the module docstrings. Co-authored-by: Jelle Zijlstra (cherry picked from commit feca9bbd1f6489f2b6d2783bfc22fdb96e45b69f) Co-authored-by: Kossi GLOKPOR <83467320+glk0 at users.noreply.github.com> files: M Lib/ssl.py diff --git a/Lib/ssl.py b/Lib/ssl.py index 181065d2e53ba..b09d684ed0fc6 100644 --- a/Lib/ssl.py +++ b/Lib/ssl.py @@ -18,9 +18,10 @@ seconds past the Epoch (the time values returned from time.time()) - fetch_server_certificate (HOST, PORT) -- fetch the certificate provided - by the server running on HOST at port PORT. No - validation of the certificate is performed. + get_server_certificate (addr, ssl_version, ca_certs, timeout) -- Retrieve the + certificate from the server at the specified + address and return it as a PEM-encoded string + Integer constants: From webhook-mailer at python.org Tue May 3 12:27:48 2022 From: webhook-mailer at python.org (ambv) Date: Tue, 03 May 2022 16:27:48 -0000 Subject: [Python-checkins] gh-89452: Prefer gdbm-compat over ndbm (#92208) Message-ID: https://github.com/python/cpython/commit/6c25bf07e86b6d8d5e50488835f70539f382d7e0 commit: 6c25bf07e86b6d8d5e50488835f70539f382d7e0 branch: main author: ?ukasz Langa committer: ambv date: 2022-05-03T18:27:38+02:00 summary: gh-89452: Prefer gdbm-compat over ndbm (#92208) This makes macOS gdbm provided by Homebrew not segfault through correct selection of the linked library (-lgdbm_compat) *AND* the correct ndbm-style header (gdbm-ndbm.h instead of the invalid ndbm.h). files: A Misc/NEWS.d/next/Build/2022-05-03-03-36-47.gh-issue-89452.NIY0fF.rst M Modules/_dbmmodule.c M configure M configure.ac M setup.py diff --git a/Misc/NEWS.d/next/Build/2022-05-03-03-36-47.gh-issue-89452.NIY0fF.rst b/Misc/NEWS.d/next/Build/2022-05-03-03-36-47.gh-issue-89452.NIY0fF.rst new file mode 100644 index 0000000000000..dd4954d1d6ac2 --- /dev/null +++ b/Misc/NEWS.d/next/Build/2022-05-03-03-36-47.gh-issue-89452.NIY0fF.rst @@ -0,0 +1,2 @@ +gdbm-compat is now preferred over ndbm if both are available on the system. +This allows avoiding the problematic ndbm.h on macOS. diff --git a/Modules/_dbmmodule.c b/Modules/_dbmmodule.c index de8b2304ed8f1..5913b034790e9 100644 --- a/Modules/_dbmmodule.c +++ b/Modules/_dbmmodule.c @@ -12,10 +12,7 @@ /* Some Linux systems install gdbm/ndbm.h, but not ndbm.h. This supports * whichever configure was able to locate. */ -#if defined(USE_NDBM) - #include - static const char which_dbm[] = "GNU gdbm"; /* EMX port of GDBM */ -#elif defined(USE_GDBM_COMPAT) +#if defined(USE_GDBM_COMPAT) #ifdef HAVE_GDBM_NDBM_H #include #elif HAVE_GDBM_DASH_NDBM_H @@ -24,6 +21,9 @@ #error "No gdbm/ndbm.h or gdbm-ndbm.h available" #endif static const char which_dbm[] = "GNU gdbm"; +#elif defined(USE_NDBM) + #include + static const char which_dbm[] = "GNU gdbm"; #elif defined(USE_BERKDB) #ifndef DB_DBM_HSEARCH #define DB_DBM_HSEARCH 1 diff --git a/configure b/configure index 2c47a1e85c145..0f5c2c80f6067 100755 --- a/configure +++ b/configure @@ -13726,7 +13726,7 @@ $as_echo_n "checking for --with-dbmliborder... " >&6; } if test "${with_dbmliborder+set}" = set; then : withval=$with_dbmliborder; else - with_dbmliborder=ndbm:gdbm:bdb + with_dbmliborder=gdbm:ndbm:bdb fi @@ -13749,7 +13749,7 @@ done IFS=$as_save_IFS if test "x$with_dbmliborder" = xerror; then : - as_fn_error $? "proper usage is --with-dbmliborder=db1:db2:... (ndbm:gdbm:bdb)" "$LINENO" 5 + as_fn_error $? "proper usage is --with-dbmliborder=db1:db2:... (gdbm:ndbm:bdb)" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_dbmliborder" >&5 diff --git a/configure.ac b/configure.ac index 62da321a98af1..8c0711d8a9a15 100644 --- a/configure.ac +++ b/configure.ac @@ -3850,7 +3850,7 @@ AC_CHECK_HEADERS([db.h], [ AC_MSG_CHECKING(for --with-dbmliborder) AC_ARG_WITH(dbmliborder, AS_HELP_STRING([--with-dbmliborder=db1:db2:...], [override order to check db backends for dbm; a valid value is a colon separated string with the backend names `ndbm', `gdbm' and `bdb'.]), -[], [with_dbmliborder=ndbm:gdbm:bdb]) +[], [with_dbmliborder=gdbm:ndbm:bdb]) have_gdbm_dbmliborder=no as_save_IFS=$IFS @@ -3865,7 +3865,7 @@ for db in $with_dbmliborder; do done IFS=$as_save_IFS AS_VAR_IF([with_dbmliborder], [error], [ - AC_MSG_ERROR([proper usage is --with-dbmliborder=db1:db2:... (ndbm:gdbm:bdb)]) + AC_MSG_ERROR([proper usage is --with-dbmliborder=db1:db2:... (gdbm:ndbm:bdb)]) ]) AC_MSG_RESULT($with_dbmliborder) diff --git a/setup.py b/setup.py index 60a45cf260f6b..f45cd6de33749 100644 --- a/setup.py +++ b/setup.py @@ -1207,7 +1207,7 @@ def detect_dbm_gdbm(self): if dbm_args: dbm_order = [arg.split('=')[-1] for arg in dbm_args][-1].split(":") else: - dbm_order = "ndbm:gdbm:bdb".split(":") + dbm_order = "gdbm:ndbm:bdb".split(":") dbmext = None for cand in dbm_order: if cand == "ndbm": From webhook-mailer at python.org Tue May 3 12:33:55 2022 From: webhook-mailer at python.org (miss-islington) Date: Tue, 03 May 2022 16:33:55 -0000 Subject: [Python-checkins] bpo-46604: fix function name in ssl module docstring (GH-31064) Message-ID: https://github.com/python/cpython/commit/a23e4722fd51c5829dc747cea2d6cc2cbd17d1a1 commit: a23e4722fd51c5829dc747cea2d6cc2cbd17d1a1 branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-03T09:33:35-07:00 summary: bpo-46604: fix function name in ssl module docstring (GH-31064) The function fetch_server_certificate is replaced by get_server_certificate in the module. I reflected the change in the module docstrings. Co-authored-by: Jelle Zijlstra (cherry picked from commit feca9bbd1f6489f2b6d2783bfc22fdb96e45b69f) Co-authored-by: Kossi GLOKPOR <83467320+glk0 at users.noreply.github.com> files: M Lib/ssl.py diff --git a/Lib/ssl.py b/Lib/ssl.py index 30f4e5934febf..0e3606b835c6a 100644 --- a/Lib/ssl.py +++ b/Lib/ssl.py @@ -18,9 +18,10 @@ seconds past the Epoch (the time values returned from time.time()) - fetch_server_certificate (HOST, PORT) -- fetch the certificate provided - by the server running on HOST at port PORT. No - validation of the certificate is performed. + get_server_certificate (addr, ssl_version, ca_certs, timeout) -- Retrieve the + certificate from the server at the specified + address and return it as a PEM-encoded string + Integer constants: From webhook-mailer at python.org Tue May 3 12:38:51 2022 From: webhook-mailer at python.org (ambv) Date: Tue, 03 May 2022 16:38:51 -0000 Subject: [Python-checkins] gh-88753: Make BooleanOptionalAction's addition of default to help more similar to other actions (#27808) Message-ID: https://github.com/python/cpython/commit/20490d5018cff4c604b37142323c531f8512b9aa commit: 20490d5018cff4c604b37142323c531f8512b9aa branch: main author: Toshio Kuratomi committer: ambv date: 2022-05-03T18:38:18+02:00 summary: gh-88753: Make BooleanOptionalAction's addition of default to help more similar to other actions (#27808) Help for other actions omit the default value if default is SUPPRESS or already contains the special format string '%(default)'. Add those special cases to BooleanOptionalAction's help formatting too. Fixes https://bugs.python.org/issue44587 so that default=SUPPRESS is not emitted. Fixes https://bugs.python.org/issue38956 as this code will detect whether '%(default)s' has already been specified in the help string. Signed-off-by: Micky Yun Chan (michiboo): Co-authored-by: Micky Yun Chan files: A Misc/NEWS.d/next/Library/2021-08-17-21-41-39.bpo-44587.57OKSz.rst M Lib/argparse.py M Lib/test/test_argparse.py diff --git a/Lib/argparse.py b/Lib/argparse.py index c47aeffc2c3f6..8d1a00ad2207e 100644 --- a/Lib/argparse.py +++ b/Lib/argparse.py @@ -153,6 +153,7 @@ def _copy_items(items): # Formatting Help # =============== + class HelpFormatter(object): """Formatter for generating usage messages and argument help strings. @@ -695,8 +696,19 @@ class ArgumentDefaultsHelpFormatter(HelpFormatter): """ def _get_help_string(self, action): + """ + Add the default value to the option help message. + + ArgumentDefaultsHelpFormatter and BooleanOptionalAction when it isn't + already present. This code will do that, detecting cornercases to + prevent duplicates or cases where it wouldn't make sense to the end + user. + """ help = action.help - if '%(default)' not in action.help: + if help is None: + help = '' + + if '%(default)' not in help: if action.default is not SUPPRESS: defaulting_nargs = [OPTIONAL, ZERO_OR_MORE] if action.option_strings or action.nargs in defaulting_nargs: @@ -704,6 +716,7 @@ def _get_help_string(self, action): return help + class MetavarTypeHelpFormatter(HelpFormatter): """Help message formatter which uses the argument 'type' as the default metavar value (instead of the argument 'dest') @@ -719,7 +732,6 @@ def _get_default_metavar_for_positional(self, action): return action.type.__name__ - # ===================== # Options and Arguments # ===================== @@ -882,9 +894,6 @@ def __init__(self, option_string = '--no-' + option_string[2:] _option_strings.append(option_string) - if help is not None and default is not None and default is not SUPPRESS: - help += " (default: %(default)s)" - super().__init__( option_strings=_option_strings, dest=dest, @@ -896,6 +905,7 @@ def __init__(self, help=help, metavar=metavar) + def __call__(self, parser, namespace, values, option_string=None): if option_string in self.option_strings: setattr(namespace, self.dest, not option_string.startswith('--no-')) diff --git a/Lib/test/test_argparse.py b/Lib/test/test_argparse.py index 794b9df3796df..8509deb93f1e2 100644 --- a/Lib/test/test_argparse.py +++ b/Lib/test/test_argparse.py @@ -3348,6 +3348,7 @@ def _get_parser(self, tester): def _test(self, tester, parser_text): expected_text = getattr(tester, self.func_suffix) expected_text = textwrap.dedent(expected_text) + tester.maxDiff = None tester.assertEqual(expected_text, parser_text) def test_format(self, tester): @@ -3743,7 +3744,7 @@ class TestHelpUsage(HelpTestCase): -w W [W ...] w -x [X ...] x --foo, --no-foo Whether to foo - --bar, --no-bar Whether to bar (default: True) + --bar, --no-bar Whether to bar -f, --foobar, --no-foobar, --barfoo, --no-barfoo --bazz, --no-bazz Bazz! @@ -4423,6 +4424,8 @@ class TestHelpArgumentDefaults(HelpTestCase): Sig('--bar', action='store_true', help='bar help'), Sig('--taz', action=argparse.BooleanOptionalAction, help='Whether to taz it', default=True), + Sig('--corge', action=argparse.BooleanOptionalAction, + help='Whether to corge it', default=argparse.SUPPRESS), Sig('--quux', help="Set the quux", default=42), Sig('spam', help='spam help'), Sig('badger', nargs='?', default='wooden', help='badger help'), @@ -4432,8 +4435,8 @@ class TestHelpArgumentDefaults(HelpTestCase): [Sig('--baz', type=int, default=42, help='baz help')]), ] usage = '''\ - usage: PROG [-h] [--foo FOO] [--bar] [--taz | --no-taz] [--quux QUUX] - [--baz BAZ] + usage: PROG [-h] [--foo FOO] [--bar] [--taz | --no-taz] [--corge | --no-corge] + [--quux QUUX] [--baz BAZ] spam [badger] ''' help = usage + '''\ @@ -4441,20 +4444,21 @@ class TestHelpArgumentDefaults(HelpTestCase): description positional arguments: - spam spam help - badger badger help (default: wooden) + spam spam help + badger badger help (default: wooden) options: - -h, --help show this help message and exit - --foo FOO foo help - oh and by the way, None - --bar bar help (default: False) - --taz, --no-taz Whether to taz it (default: True) - --quux QUUX Set the quux (default: 42) + -h, --help show this help message and exit + --foo FOO foo help - oh and by the way, None + --bar bar help (default: False) + --taz, --no-taz Whether to taz it (default: True) + --corge, --no-corge Whether to corge it + --quux QUUX Set the quux (default: 42) title: description - --baz BAZ baz help (default: 42) + --baz BAZ baz help (default: 42) ''' version = '' diff --git a/Misc/NEWS.d/next/Library/2021-08-17-21-41-39.bpo-44587.57OKSz.rst b/Misc/NEWS.d/next/Library/2021-08-17-21-41-39.bpo-44587.57OKSz.rst new file mode 100644 index 0000000000000..ce9b3a04bc62f --- /dev/null +++ b/Misc/NEWS.d/next/Library/2021-08-17-21-41-39.bpo-44587.57OKSz.rst @@ -0,0 +1,2 @@ +Fix BooleanOptionalAction to not automatically add a default string. If a +default string is desired, use a formatter to add it. From webhook-mailer at python.org Tue May 3 13:20:02 2022 From: webhook-mailer at python.org (gvanrossum) Date: Tue, 03 May 2022 17:20:02 -0000 Subject: [Python-checkins] GH-91752: Skip test_freeze_simple_script when zlib is not available (#91758) Message-ID: https://github.com/python/cpython/commit/77e7a04cd235f1bcd6fc69bcb15e2683c365d637 commit: 77e7a04cd235f1bcd6fc69bcb15e2683c365d637 branch: main author: Abhigyan Bose committer: gvanrossum date: 2022-05-03T10:19:54-07:00 summary: GH-91752: Skip test_freeze_simple_script when zlib is not available (#91758) Fixes GH-91752. files: A Misc/NEWS.d/next/Tests/2022-04-22-19-00-00.gh-issue-91752.Ji27dd.rst M Lib/test/test_tools/test_freeze.py diff --git a/Lib/test/test_tools/test_freeze.py b/Lib/test/test_tools/test_freeze.py index cca3c47f5ac05..2ba36ca208f96 100644 --- a/Lib/test/test_tools/test_freeze.py +++ b/Lib/test/test_tools/test_freeze.py @@ -12,7 +12,7 @@ with imports_under_tool('freeze', 'test'): import freeze as helper - + at support.requires_zlib() @unittest.skipIf(sys.platform.startswith('win'), 'not supported on Windows') @support.skip_if_buildbot('not all buildbots have enough space') class TestFreeze(unittest.TestCase): diff --git a/Misc/NEWS.d/next/Tests/2022-04-22-19-00-00.gh-issue-91752.Ji27dd.rst b/Misc/NEWS.d/next/Tests/2022-04-22-19-00-00.gh-issue-91752.Ji27dd.rst new file mode 100644 index 0000000000000..c02c1f491cc3e --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2022-04-22-19-00-00.gh-issue-91752.Ji27dd.rst @@ -0,0 +1 @@ +Added @requires_zlib to test.test_tools.test_freeze.TestFreeze. From webhook-mailer at python.org Tue May 3 13:21:29 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Tue, 03 May 2022 17:21:29 -0000 Subject: [Python-checkins] bpo-29890: Test IPv*Interface construction with tuple argument (#30862) Message-ID: https://github.com/python/cpython/commit/b295a92c50b128e494f47c28f12b8e9eac2927ea commit: b295a92c50b128e494f47c28f12b8e9eac2927ea branch: main author: Humbled Drugman committer: JelleZijlstra date: 2022-05-03T11:21:24-06:00 summary: bpo-29890: Test IPv*Interface construction with tuple argument (#30862) Co-authored-by: Jelle Zijlstra files: A Misc/NEWS.d/next/Tests/2022-01-24-21-31-09.bpo-29890.zEG-ra.rst M Lib/test/test_ipaddress.py diff --git a/Lib/test/test_ipaddress.py b/Lib/test/test_ipaddress.py index e5162e86cb5dc..c9ae7dab387ce 100644 --- a/Lib/test/test_ipaddress.py +++ b/Lib/test/test_ipaddress.py @@ -579,6 +579,10 @@ def assertBadAddress(addr, details): assertBadAddress("1.2.3.256", re.escape("256 (> 255)")) def test_valid_netmask(self): + self.assertEqual(str(self.factory(('192.0.2.0', 24))), '192.0.2.0/24') + self.assertEqual(str(self.factory(('192.0.2.0', '24'))), '192.0.2.0/24') + self.assertEqual(str(self.factory(('192.0.2.0', '255.255.255.0'))), + '192.0.2.0/24') self.assertEqual(str(self.factory('192.0.2.0/255.255.255.0')), '192.0.2.0/24') for i in range(0, 33): @@ -739,6 +743,10 @@ def assertBadAddress(addr, details): def test_valid_netmask(self): # We only support CIDR for IPv6, because expanded netmasks are not # standard notation. + self.assertEqual(str(self.factory(('2001:db8::', 32))), + '2001:db8::/32') + self.assertEqual(str(self.factory(('2001:db8::', '32'))), + '2001:db8::/32') self.assertEqual(str(self.factory('2001:db8::/32')), '2001:db8::/32') for i in range(0, 129): # Generate and re-parse the CIDR format (trivial). diff --git a/Misc/NEWS.d/next/Tests/2022-01-24-21-31-09.bpo-29890.zEG-ra.rst b/Misc/NEWS.d/next/Tests/2022-01-24-21-31-09.bpo-29890.zEG-ra.rst new file mode 100644 index 0000000000000..38a06a2f9b6be --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2022-01-24-21-31-09.bpo-29890.zEG-ra.rst @@ -0,0 +1,2 @@ +Add tests for :class:`ipaddress.IPv4Interface` and :class:`ipaddress.IPv6Interface` construction with tuple arguments. +Original patch and tests by louisom. From webhook-mailer at python.org Tue May 3 13:33:26 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Tue, 03 May 2022 17:33:26 -0000 Subject: [Python-checkins] bpo-46696: Add socket.SO_INCOMING_CPU constant (#31237) Message-ID: https://github.com/python/cpython/commit/d5dfcd4489e25c1b6e985fb6b8a700c8a49c68df commit: d5dfcd4489e25c1b6e985fb6b8a700c8a49c68df branch: main author: David CARLIER committer: JelleZijlstra date: 2022-05-03T11:33:11-06:00 summary: bpo-46696: Add socket.SO_INCOMING_CPU constant (#31237) Co-authored-by: Jelle Zijlstra files: A Misc/NEWS.d/next/Library/2022-02-09-21-40-02.bpo-46696.nPXRno.rst M Doc/library/socket.rst M Modules/socketmodule.c diff --git a/Doc/library/socket.rst b/Doc/library/socket.rst index 3b1912cff88a4..ee1aee5278b3b 100755 --- a/Doc/library/socket.rst +++ b/Doc/library/socket.rst @@ -575,6 +575,15 @@ Constants .. availability:: FreeBSD. +.. data:: SO_INCOMING_CPU + + Constant to optimize CPU locality, to be used in conjunction with + :data:`SO_REUSEPORT`. + + .. versionadded:: 3.11 + + .. availability:: Linux >= 3.9 + Functions ^^^^^^^^^ diff --git a/Misc/NEWS.d/next/Library/2022-02-09-21-40-02.bpo-46696.nPXRno.rst b/Misc/NEWS.d/next/Library/2022-02-09-21-40-02.bpo-46696.nPXRno.rst new file mode 100644 index 0000000000000..04c41887afd6e --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-02-09-21-40-02.bpo-46696.nPXRno.rst @@ -0,0 +1 @@ +Add ``SO_INCOMING_CPU`` constant to :mod:`socket`. diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index 9ecabaf973074..c650b25c09509 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -7505,6 +7505,9 @@ PyInit__socket(void) #ifdef SO_EXCLUSIVEADDRUSE PyModule_AddIntMacro(m, SO_EXCLUSIVEADDRUSE); #endif +#ifdef SO_INCOMING_CPU + PyModule_AddIntMacro(m, SO_INCOMING_CPU); +#endif #ifdef SO_KEEPALIVE PyModule_AddIntMacro(m, SO_KEEPALIVE); From webhook-mailer at python.org Tue May 3 13:48:37 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Tue, 03 May 2022 17:48:37 -0000 Subject: [Python-checkins] gh-92206: Improve scoping of sqlite3 reset statement helper (#92241) Message-ID: https://github.com/python/cpython/commit/415944379f9dae46e391315c9ccb17e45f9917da commit: 415944379f9dae46e391315c9ccb17e45f9917da branch: main author: Erlend Egeberg Aasland committer: JelleZijlstra date: 2022-05-03T11:48:24-06:00 summary: gh-92206: Improve scoping of sqlite3 reset statement helper (#92241) files: M Modules/_sqlite/cursor.c M Modules/_sqlite/statement.c M Modules/_sqlite/statement.h diff --git a/Modules/_sqlite/cursor.c b/Modules/_sqlite/cursor.c index 84f481792ddd3..0e903ade5bdfb 100644 --- a/Modules/_sqlite/cursor.c +++ b/Modules/_sqlite/cursor.c @@ -101,6 +101,24 @@ pysqlite_cursor_init_impl(pysqlite_Cursor *self, return 0; } +static inline int +stmt_reset(pysqlite_Statement *self) +{ + int rc = SQLITE_OK; + + if (self->in_use && self->st) { + Py_BEGIN_ALLOW_THREADS + rc = sqlite3_reset(self->st); + Py_END_ALLOW_THREADS + + if (rc == SQLITE_OK) { + self->in_use = 0; + } + } + + return rc; +} + static int cursor_traverse(pysqlite_Cursor *self, visitproc visit, void *arg) { @@ -124,7 +142,7 @@ cursor_clear(pysqlite_Cursor *self) Py_CLEAR(self->row_factory); if (self->statement) { /* Reset the statement if the user has not closed the cursor */ - pysqlite_statement_reset(self->statement); + stmt_reset(self->statement); Py_CLEAR(self->statement); } @@ -544,7 +562,7 @@ _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject* operation if (self->statement != NULL) { /* There is an active statement */ - pysqlite_statement_reset(self->statement); + stmt_reset(self->statement); } /* reset description and rowcount */ @@ -553,7 +571,7 @@ _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject* operation self->rowcount = 0L; if (self->statement) { - (void)pysqlite_statement_reset(self->statement); + (void)stmt_reset(self->statement); } PyObject *stmt = get_statement_from_cache(self, operation); @@ -577,7 +595,7 @@ _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject* operation } } - pysqlite_statement_reset(self->statement); + stmt_reset(self->statement); pysqlite_statement_mark_dirty(self->statement); /* We start a transaction implicitly before a DML statement. @@ -614,7 +632,7 @@ _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject* operation PyErr_Clear(); } } - (void)pysqlite_statement_reset(self->statement); + (void)stmt_reset(self->statement); _pysqlite_seterror(state, self->connection->db); goto error; } @@ -663,12 +681,12 @@ _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject* operation } if (rc == SQLITE_DONE && !multiple) { - pysqlite_statement_reset(self->statement); + stmt_reset(self->statement); Py_CLEAR(self->statement); } if (multiple) { - pysqlite_statement_reset(self->statement); + stmt_reset(self->statement); } Py_XDECREF(parameters); } @@ -824,7 +842,7 @@ pysqlite_cursor_iternext(pysqlite_Cursor *self) sqlite3_stmt *stmt = self->statement->st; assert(stmt != NULL); if (sqlite3_data_count(stmt) == 0) { - (void)pysqlite_statement_reset(self->statement); + (void)stmt_reset(self->statement); Py_CLEAR(self->statement); return NULL; } @@ -835,7 +853,7 @@ pysqlite_cursor_iternext(pysqlite_Cursor *self) } int rc = stmt_step(stmt); if (rc == SQLITE_DONE) { - (void)pysqlite_statement_reset(self->statement); + (void)stmt_reset(self->statement); } else if (rc != SQLITE_ROW) { (void)_pysqlite_seterror(self->connection->state, @@ -1005,7 +1023,7 @@ pysqlite_cursor_close_impl(pysqlite_Cursor *self) } if (self->statement) { - (void)pysqlite_statement_reset(self->statement); + (void)stmt_reset(self->statement); Py_CLEAR(self->statement); } diff --git a/Modules/_sqlite/statement.c b/Modules/_sqlite/statement.c index baa1b71a8daa4..2f2f4b2d85089 100644 --- a/Modules/_sqlite/statement.c +++ b/Modules/_sqlite/statement.c @@ -366,25 +366,6 @@ pysqlite_statement_bind_parameters(pysqlite_state *state, } } -int pysqlite_statement_reset(pysqlite_Statement* self) -{ - int rc; - - rc = SQLITE_OK; - - if (self->in_use && self->st) { - Py_BEGIN_ALLOW_THREADS - rc = sqlite3_reset(self->st); - Py_END_ALLOW_THREADS - - if (rc == SQLITE_OK) { - self->in_use = 0; - } - } - - return rc; -} - void pysqlite_statement_mark_dirty(pysqlite_Statement* self) { self->in_use = 1; diff --git a/Modules/_sqlite/statement.h b/Modules/_sqlite/statement.h index b901c43c479ae..5b55e2fbcb8f9 100644 --- a/Modules/_sqlite/statement.h +++ b/Modules/_sqlite/statement.h @@ -44,7 +44,6 @@ void pysqlite_statement_bind_parameters(pysqlite_state *state, pysqlite_Statement *self, PyObject *parameters); -int pysqlite_statement_reset(pysqlite_Statement* self); void pysqlite_statement_mark_dirty(pysqlite_Statement* self); int pysqlite_statement_setup_types(PyObject *module); From webhook-mailer at python.org Tue May 3 14:15:07 2022 From: webhook-mailer at python.org (vstinner) Date: Tue, 03 May 2022 18:15:07 -0000 Subject: [Python-checkins] gh-89653: PEP 670: Convert PyBytes macros to functions (#91990) Message-ID: https://github.com/python/cpython/commit/2eca5dad0a783153318e91e3e25f16a38a632bfd commit: 2eca5dad0a783153318e91e3e25f16a38a632bfd branch: main author: Victor Stinner committer: vstinner date: 2022-05-03T20:14:58+02:00 summary: gh-89653: PEP 670: Convert PyBytes macros to functions (#91990) Convert the following macros to static inline functions: * PyByteArray_AS_STRING() * PyByteArray_GET_SIZE() * PyBytes_AS_STRING() * PyBytes_GET_SIZE() Limited C API version 3.11 no longer casts arguments. Add _PyBytes_CAST() and _PyByteArray_CAST() macros. files: M Doc/c-api/bytearray.rst M Doc/c-api/bytes.rst M Include/cpython/bytearrayobject.h M Include/cpython/bytesobject.h diff --git a/Doc/c-api/bytearray.rst b/Doc/c-api/bytearray.rst index 85a7d1373c2a8..4bf3cfe100cd0 100644 --- a/Doc/c-api/bytearray.rst +++ b/Doc/c-api/bytearray.rst @@ -77,9 +77,9 @@ These macros trade safety for speed and they don't check pointers. .. c:function:: char* PyByteArray_AS_STRING(PyObject *bytearray) - Macro version of :c:func:`PyByteArray_AsString`. + Similar to :c:func:`PyByteArray_AsString`, but without error checking. .. c:function:: Py_ssize_t PyByteArray_GET_SIZE(PyObject *bytearray) - Macro version of :c:func:`PyByteArray_Size`. + Similar to :c:func:`PyByteArray_Size`, but without error checking. diff --git a/Doc/c-api/bytes.rst b/Doc/c-api/bytes.rst index 32c7b80dc7ac6..d47f0422e6100 100644 --- a/Doc/c-api/bytes.rst +++ b/Doc/c-api/bytes.rst @@ -134,7 +134,7 @@ called with a non-bytes parameter. .. c:function:: Py_ssize_t PyBytes_GET_SIZE(PyObject *o) - Macro form of :c:func:`PyBytes_Size` but without error checking. + Similar to :c:func:`PyBytes_Size`, but without error checking. .. c:function:: char* PyBytes_AsString(PyObject *o) @@ -151,7 +151,7 @@ called with a non-bytes parameter. .. c:function:: char* PyBytes_AS_STRING(PyObject *string) - Macro form of :c:func:`PyBytes_AsString` but without error checking. + Similar to :c:func:`PyBytes_AsString`, but without error checking. .. c:function:: int PyBytes_AsStringAndSize(PyObject *obj, char **buffer, Py_ssize_t *length) diff --git a/Include/cpython/bytearrayobject.h b/Include/cpython/bytearrayobject.h index 569b0cd036986..5114169c28091 100644 --- a/Include/cpython/bytearrayobject.h +++ b/Include/cpython/bytearrayobject.h @@ -11,10 +11,28 @@ typedef struct { Py_ssize_t ob_exports; /* How many buffer exports */ } PyByteArrayObject; -/* Macros, trading safety for speed */ -#define PyByteArray_AS_STRING(self) \ - (assert(PyByteArray_Check(self)), \ - Py_SIZE(self) ? ((PyByteArrayObject *)(self))->ob_start : _PyByteArray_empty_string) -#define PyByteArray_GET_SIZE(self) (assert(PyByteArray_Check(self)), Py_SIZE(self)) - PyAPI_DATA(char) _PyByteArray_empty_string[]; + +/* Macros and static inline functions, trading safety for speed */ +#define _PyByteArray_CAST(op) \ + (assert(PyByteArray_Check(op)), _Py_CAST(PyByteArrayObject*, op)) + +static inline char* PyByteArray_AS_STRING(PyObject *op) +{ + PyByteArrayObject *self = _PyByteArray_CAST(op); + if (Py_SIZE(self)) { + return self->ob_start; + } + return _PyByteArray_empty_string; +} +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000 +# define PyByteArray_AS_STRING(self) PyByteArray_AS_STRING(_PyObject_CAST(self)) +#endif + +static inline Py_ssize_t PyByteArray_GET_SIZE(PyObject *op) { + PyByteArrayObject *self = _PyByteArray_CAST(op); + return Py_SIZE(self); +} +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000 +# define PyByteArray_GET_SIZE(self) PyByteArray_GET_SIZE(_PyObject_CAST(self)) +#endif diff --git a/Include/cpython/bytesobject.h b/Include/cpython/bytesobject.h index 2c6d631f0b21e..53343661f0ec4 100644 --- a/Include/cpython/bytesobject.h +++ b/Include/cpython/bytesobject.h @@ -28,10 +28,25 @@ PyAPI_FUNC(PyObject*) _PyBytes_FromHex( PyAPI_FUNC(PyObject *) _PyBytes_DecodeEscape(const char *, Py_ssize_t, const char *, const char **); -/* Macro, trading safety for speed */ -#define PyBytes_AS_STRING(op) (assert(PyBytes_Check(op)), \ - (((PyBytesObject *)(op))->ob_sval)) -#define PyBytes_GET_SIZE(op) (assert(PyBytes_Check(op)),Py_SIZE(op)) +/* Macros and static inline functions, trading safety for speed */ +#define _PyBytes_CAST(op) \ + (assert(PyBytes_Check(op)), _Py_CAST(PyBytesObject*, op)) + +static inline char* PyBytes_AS_STRING(PyObject *op) +{ + return _PyBytes_CAST(op)->ob_sval; +} +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000 +# define PyBytes_AS_STRING(op) PyBytes_AS_STRING(_PyObject_CAST(op)) +#endif + +static inline Py_ssize_t PyBytes_GET_SIZE(PyObject *op) { + PyBytesObject *self = _PyBytes_CAST(op); + return Py_SIZE(self); +} +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000 +# define PyBytes_GET_SIZE(self) PyBytes_GET_SIZE(_PyObject_CAST(self)) +#endif /* _PyBytes_Join(sep, x) is like sep.join(x). sep must be PyBytesObject*, x must be an iterable object. */ From webhook-mailer at python.org Tue May 3 14:18:20 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Tue, 03 May 2022 18:18:20 -0000 Subject: [Python-checkins] gh-89289: Harden sqlite3.Connection init (#92214) Message-ID: https://github.com/python/cpython/commit/c278474df97de310535425c207136bf26c663e0b commit: c278474df97de310535425c207136bf26c663e0b branch: main author: Erlend Egeberg Aasland committer: JelleZijlstra date: 2022-05-03T12:18:11-06:00 summary: gh-89289: Harden sqlite3.Connection init (#92214) - Make sure SQLite resources are freed if database open fails - Remove unneeded branches if init is aborted files: M Modules/_sqlite/connection.c diff --git a/Modules/_sqlite/connection.c b/Modules/_sqlite/connection.c index 75d29704695c6..793bc0b6aef0d 100644 --- a/Modules/_sqlite/connection.c +++ b/Modules/_sqlite/connection.c @@ -226,27 +226,27 @@ pysqlite_connection_init_impl(pysqlite_Connection *self, pysqlite_state *state = pysqlite_get_state_by_type(Py_TYPE(self)); if (rc != SQLITE_OK) { _pysqlite_seterror(state, db); - return -1; + goto error; } // Create LRU statement cache; returns a new reference. PyObject *statement_cache = new_statement_cache(self, state, cache_size); if (statement_cache == NULL) { - return -1; + goto error; } /* Create lists of weak references to cursors and blobs */ PyObject *cursors = PyList_New(0); if (cursors == NULL) { - Py_XDECREF(statement_cache); - return -1; + Py_DECREF(statement_cache); + goto error; } PyObject *blobs = PyList_New(0); if (blobs == NULL) { - Py_XDECREF(statement_cache); - Py_XDECREF(cursors); - return -1; + Py_DECREF(statement_cache); + Py_DECREF(cursors); + goto error; } // Init connection state members. @@ -279,11 +279,18 @@ pysqlite_connection_init_impl(pysqlite_Connection *self, self->NotSupportedError = state->NotSupportedError; if (PySys_Audit("sqlite3.connect/handle", "O", self) < 0) { - return -1; + return -1; // Don't goto error; at this point, dealloc will clean up. } self->initialized = 1; return 0; + +error: + // There are no statements or other SQLite objects attached to the + // database, so sqlite3_close() should always return SQLITE_OK. + rc = sqlite3_close(db); + assert(rc == SQLITE_OK), rc; + return -1; } #define VISIT_CALLBACK_CONTEXT(ctx) \ From webhook-mailer at python.org Tue May 3 14:18:41 2022 From: webhook-mailer at python.org (miss-islington) Date: Tue, 03 May 2022 18:18:41 -0000 Subject: [Python-checkins] bpo-29890: Test IPv*Interface construction with tuple argument (GH-30862) Message-ID: https://github.com/python/cpython/commit/30681d6655f1d25fd8ca10df0e2088a17733742c commit: 30681d6655f1d25fd8ca10df0e2088a17733742c branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-03T11:18:31-07:00 summary: bpo-29890: Test IPv*Interface construction with tuple argument (GH-30862) Co-authored-by: Jelle Zijlstra (cherry picked from commit b295a92c50b128e494f47c28f12b8e9eac2927ea) Co-authored-by: Humbled Drugman files: A Misc/NEWS.d/next/Tests/2022-01-24-21-31-09.bpo-29890.zEG-ra.rst M Lib/test/test_ipaddress.py diff --git a/Lib/test/test_ipaddress.py b/Lib/test/test_ipaddress.py index b2bb609ea8b4b..f012af052322d 100644 --- a/Lib/test/test_ipaddress.py +++ b/Lib/test/test_ipaddress.py @@ -580,6 +580,10 @@ def assertBadAddress(addr, details): assertBadAddress("1.2.3.256", re.escape("256 (> 255)")) def test_valid_netmask(self): + self.assertEqual(str(self.factory(('192.0.2.0', 24))), '192.0.2.0/24') + self.assertEqual(str(self.factory(('192.0.2.0', '24'))), '192.0.2.0/24') + self.assertEqual(str(self.factory(('192.0.2.0', '255.255.255.0'))), + '192.0.2.0/24') self.assertEqual(str(self.factory('192.0.2.0/255.255.255.0')), '192.0.2.0/24') for i in range(0, 33): @@ -740,6 +744,10 @@ def assertBadAddress(addr, details): def test_valid_netmask(self): # We only support CIDR for IPv6, because expanded netmasks are not # standard notation. + self.assertEqual(str(self.factory(('2001:db8::', 32))), + '2001:db8::/32') + self.assertEqual(str(self.factory(('2001:db8::', '32'))), + '2001:db8::/32') self.assertEqual(str(self.factory('2001:db8::/32')), '2001:db8::/32') for i in range(0, 129): # Generate and re-parse the CIDR format (trivial). diff --git a/Misc/NEWS.d/next/Tests/2022-01-24-21-31-09.bpo-29890.zEG-ra.rst b/Misc/NEWS.d/next/Tests/2022-01-24-21-31-09.bpo-29890.zEG-ra.rst new file mode 100644 index 0000000000000..38a06a2f9b6be --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2022-01-24-21-31-09.bpo-29890.zEG-ra.rst @@ -0,0 +1,2 @@ +Add tests for :class:`ipaddress.IPv4Interface` and :class:`ipaddress.IPv6Interface` construction with tuple arguments. +Original patch and tests by louisom. From webhook-mailer at python.org Tue May 3 14:18:46 2022 From: webhook-mailer at python.org (miss-islington) Date: Tue, 03 May 2022 18:18:46 -0000 Subject: [Python-checkins] bpo-29890: Test IPv*Interface construction with tuple argument (GH-30862) Message-ID: https://github.com/python/cpython/commit/4ede78104522dfd27d31d3a1b6dfaa673398e612 commit: 4ede78104522dfd27d31d3a1b6dfaa673398e612 branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-03T11:18:42-07:00 summary: bpo-29890: Test IPv*Interface construction with tuple argument (GH-30862) Co-authored-by: Jelle Zijlstra (cherry picked from commit b295a92c50b128e494f47c28f12b8e9eac2927ea) Co-authored-by: Humbled Drugman files: A Misc/NEWS.d/next/Tests/2022-01-24-21-31-09.bpo-29890.zEG-ra.rst M Lib/test/test_ipaddress.py diff --git a/Lib/test/test_ipaddress.py b/Lib/test/test_ipaddress.py index 224412749340f..90897f6bedb86 100644 --- a/Lib/test/test_ipaddress.py +++ b/Lib/test/test_ipaddress.py @@ -580,6 +580,10 @@ def assertBadAddress(addr, details): assertBadAddress("1.2.3.256", re.escape("256 (> 255)")) def test_valid_netmask(self): + self.assertEqual(str(self.factory(('192.0.2.0', 24))), '192.0.2.0/24') + self.assertEqual(str(self.factory(('192.0.2.0', '24'))), '192.0.2.0/24') + self.assertEqual(str(self.factory(('192.0.2.0', '255.255.255.0'))), + '192.0.2.0/24') self.assertEqual(str(self.factory('192.0.2.0/255.255.255.0')), '192.0.2.0/24') for i in range(0, 33): @@ -740,6 +744,10 @@ def assertBadAddress(addr, details): def test_valid_netmask(self): # We only support CIDR for IPv6, because expanded netmasks are not # standard notation. + self.assertEqual(str(self.factory(('2001:db8::', 32))), + '2001:db8::/32') + self.assertEqual(str(self.factory(('2001:db8::', '32'))), + '2001:db8::/32') self.assertEqual(str(self.factory('2001:db8::/32')), '2001:db8::/32') for i in range(0, 129): # Generate and re-parse the CIDR format (trivial). diff --git a/Misc/NEWS.d/next/Tests/2022-01-24-21-31-09.bpo-29890.zEG-ra.rst b/Misc/NEWS.d/next/Tests/2022-01-24-21-31-09.bpo-29890.zEG-ra.rst new file mode 100644 index 0000000000000..38a06a2f9b6be --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2022-01-24-21-31-09.bpo-29890.zEG-ra.rst @@ -0,0 +1,2 @@ +Add tests for :class:`ipaddress.IPv4Interface` and :class:`ipaddress.IPv6Interface` construction with tuple arguments. +Original patch and tests by louisom. From webhook-mailer at python.org Tue May 3 14:25:53 2022 From: webhook-mailer at python.org (vstinner) Date: Tue, 03 May 2022 18:25:53 -0000 Subject: [Python-checkins] gh-91320: Argument Clinic uses _PyCFunction_CAST() (#32210) Message-ID: https://github.com/python/cpython/commit/b270b82f1137ff25ee263eafd31503d760f3403d commit: b270b82f1137ff25ee263eafd31503d760f3403d branch: main author: Victor Stinner committer: vstinner date: 2022-05-03T20:25:41+02:00 summary: gh-91320: Argument Clinic uses _PyCFunction_CAST() (#32210) Replace "(PyCFunction)(void(*)(void))func" cast with _PyCFunction_CAST(func). files: M Lib/test/clinic.test M Modules/_io/clinic/_iomodule.c.h M Modules/_io/clinic/bufferedio.c.h M Modules/_io/clinic/bytesio.c.h M Modules/_io/clinic/fileio.c.h M Modules/_io/clinic/iobase.c.h M Modules/_io/clinic/stringio.c.h M Modules/_io/clinic/textio.c.h M Modules/_io/clinic/winconsoleio.c.h M Modules/_multiprocessing/clinic/multiprocessing.c.h M Modules/_multiprocessing/clinic/posixshmem.c.h M Modules/_multiprocessing/clinic/semaphore.c.h M Modules/_sqlite/clinic/blob.c.h M Modules/_sqlite/clinic/connection.c.h M Modules/_sqlite/clinic/cursor.c.h M Modules/_sqlite/clinic/module.c.h M Modules/_sre/clinic/sre.c.h M Modules/_ssl/clinic/cert.c.h M Modules/cjkcodecs/clinic/multibytecodec.c.h M Modules/clinic/_abc.c.h M Modules/clinic/_asynciomodule.c.h M Modules/clinic/_bisectmodule.c.h M Modules/clinic/_bz2module.c.h M Modules/clinic/_codecsmodule.c.h M Modules/clinic/_collectionsmodule.c.h M Modules/clinic/_cryptmodule.c.h M Modules/clinic/_csv.c.h M Modules/clinic/_curses_panel.c.h M Modules/clinic/_cursesmodule.c.h M Modules/clinic/_datetimemodule.c.h M Modules/clinic/_dbmmodule.c.h M Modules/clinic/_elementtree.c.h M Modules/clinic/_gdbmmodule.c.h M Modules/clinic/_hashopenssl.c.h M Modules/clinic/_heapqmodule.c.h M Modules/clinic/_localemodule.c.h M Modules/clinic/_lsprof.c.h M Modules/clinic/_lzmamodule.c.h M Modules/clinic/_opcode.c.h M Modules/clinic/_operator.c.h M Modules/clinic/_pickle.c.h M Modules/clinic/_queuemodule.c.h M Modules/clinic/_randommodule.c.h M Modules/clinic/_ssl.c.h M Modules/clinic/_statisticsmodule.c.h M Modules/clinic/_struct.c.h M Modules/clinic/_testmultiphase.c.h M Modules/clinic/_tkinter.c.h M Modules/clinic/_tracemalloc.c.h M Modules/clinic/_weakref.c.h M Modules/clinic/_winapi.c.h M Modules/clinic/arraymodule.c.h M Modules/clinic/audioop.c.h M Modules/clinic/binascii.c.h M Modules/clinic/cmathmodule.c.h M Modules/clinic/fcntlmodule.c.h M Modules/clinic/gcmodule.c.h M Modules/clinic/grpmodule.c.h M Modules/clinic/itertoolsmodule.c.h M Modules/clinic/mathmodule.c.h M Modules/clinic/md5module.c.h M Modules/clinic/overlapped.c.h M Modules/clinic/posixmodule.c.h M Modules/clinic/pyexpat.c.h M Modules/clinic/readline.c.h M Modules/clinic/resource.c.h M Modules/clinic/selectmodule.c.h M Modules/clinic/sha1module.c.h M Modules/clinic/sha256module.c.h M Modules/clinic/sha512module.c.h M Modules/clinic/signalmodule.c.h M Modules/clinic/symtablemodule.c.h M Modules/clinic/termios.c.h M Modules/clinic/unicodedata.c.h M Modules/clinic/zlibmodule.c.h M Objects/clinic/bytearrayobject.c.h M Objects/clinic/bytesobject.c.h M Objects/clinic/codeobject.c.h M Objects/clinic/dictobject.c.h M Objects/clinic/floatobject.c.h M Objects/clinic/listobject.c.h M Objects/clinic/longobject.c.h M Objects/clinic/memoryobject.c.h M Objects/clinic/odictobject.c.h M Objects/clinic/tupleobject.c.h M Objects/clinic/unicodeobject.c.h M Objects/stringlib/clinic/transmogrify.h.h M PC/clinic/_msi.c.h M PC/clinic/_testconsole.c.h M PC/clinic/msvcrtmodule.c.h M PC/clinic/winreg.c.h M PC/clinic/winsound.c.h M Python/clinic/_warnings.c.h M Python/clinic/bltinmodule.c.h M Python/clinic/context.c.h M Python/clinic/import.c.h M Python/clinic/marshal.c.h M Python/clinic/sysmodule.c.h M Tools/clinic/clinic.py diff --git a/Lib/test/clinic.test b/Lib/test/clinic.test index d2934b3f211ac..9ef3610ba10c0 100644 --- a/Lib/test/clinic.test +++ b/Lib/test/clinic.test @@ -21,7 +21,7 @@ PyDoc_STRVAR(test_object_converter__doc__, "\n"); #define TEST_OBJECT_CONVERTER_METHODDEF \ - {"test_object_converter", (PyCFunction)(void(*)(void))test_object_converter, METH_FASTCALL, test_object_converter__doc__}, + {"test_object_converter", _PyCFunction_CAST(test_object_converter), METH_FASTCALL, test_object_converter__doc__}, static PyObject * test_object_converter_impl(PyObject *module, PyObject *a, PyObject *b, @@ -58,7 +58,7 @@ exit: static PyObject * test_object_converter_impl(PyObject *module, PyObject *a, PyObject *b, PyObject *c, PyUnicode_Object *d) -/*[clinic end generated code: output=a78312d933df9ea1 input=005e6a8a711a869b]*/ +/*[clinic end generated code: output=886f4f9b598726b6 input=005e6a8a711a869b]*/ /*[clinic input] @@ -97,7 +97,7 @@ PyDoc_STRVAR(test_objects_converter__doc__, "\n"); #define TEST_OBJECTS_CONVERTER_METHODDEF \ - {"test_objects_converter", (PyCFunction)(void(*)(void))test_objects_converter, METH_FASTCALL, test_objects_converter__doc__}, + {"test_objects_converter", _PyCFunction_CAST(test_objects_converter), METH_FASTCALL, test_objects_converter__doc__}, static PyObject * test_objects_converter_impl(PyObject *module, PyObject *a, PyObject *b); @@ -126,7 +126,7 @@ exit: static PyObject * test_objects_converter_impl(PyObject *module, PyObject *a, PyObject *b) -/*[clinic end generated code: output=0e461f38d3b2bd08 input=4cbb3d9edd2a36f3]*/ +/*[clinic end generated code: output=fc26328b79d46bb7 input=4cbb3d9edd2a36f3]*/ /*[clinic input] @@ -153,7 +153,7 @@ PyDoc_STRVAR(test_object_converter_subclass_of__doc__, "\n"); #define TEST_OBJECT_CONVERTER_SUBCLASS_OF_METHODDEF \ - {"test_object_converter_subclass_of", (PyCFunction)(void(*)(void))test_object_converter_subclass_of, METH_FASTCALL, test_object_converter_subclass_of__doc__}, + {"test_object_converter_subclass_of", _PyCFunction_CAST(test_object_converter_subclass_of), METH_FASTCALL, test_object_converter_subclass_of__doc__}, static PyObject * test_object_converter_subclass_of_impl(PyObject *module, PyObject *a, @@ -240,7 +240,7 @@ test_object_converter_subclass_of_impl(PyObject *module, PyObject *a, PyObject *b, PyObject *c, PyObject *d, PyObject *e, PyObject *f, PyObject *g, PyObject *h, PyObject *i, PyObject *j) -/*[clinic end generated code: output=dcf7772bf0c876dd input=31b06b772d5f983e]*/ +/*[clinic end generated code: output=e4b07c9a54479a40 input=31b06b772d5f983e]*/ /*[clinic input] @@ -385,7 +385,7 @@ PyDoc_STRVAR(test_bool_converter__doc__, "\n"); #define TEST_BOOL_CONVERTER_METHODDEF \ - {"test_bool_converter", (PyCFunction)(void(*)(void))test_bool_converter, METH_FASTCALL, test_bool_converter__doc__}, + {"test_bool_converter", _PyCFunction_CAST(test_bool_converter), METH_FASTCALL, test_bool_converter__doc__}, static PyObject * test_bool_converter_impl(PyObject *module, int a, int b, int c); @@ -431,7 +431,7 @@ exit: static PyObject * test_bool_converter_impl(PyObject *module, int a, int b, int c) -/*[clinic end generated code: output=b5ec6409d942e0f9 input=939854fa9f248c60]*/ +/*[clinic end generated code: output=27f0e653a70b9be3 input=939854fa9f248c60]*/ /*[clinic input] @@ -463,7 +463,7 @@ PyDoc_STRVAR(test_char_converter__doc__, "\n"); #define TEST_CHAR_CONVERTER_METHODDEF \ - {"test_char_converter", (PyCFunction)(void(*)(void))test_char_converter, METH_FASTCALL, test_char_converter__doc__}, + {"test_char_converter", _PyCFunction_CAST(test_char_converter), METH_FASTCALL, test_char_converter__doc__}, static PyObject * test_char_converter_impl(PyObject *module, char a, char b, char c, char d, @@ -685,7 +685,7 @@ static PyObject * test_char_converter_impl(PyObject *module, char a, char b, char c, char d, char e, char f, char g, char h, char i, char j, char k, char l, char m, char n) -/*[clinic end generated code: output=9d3aaf5d6857ec9e input=e42330417a44feac]*/ +/*[clinic end generated code: output=98589f02422fe6b1 input=e42330417a44feac]*/ /*[clinic input] @@ -704,7 +704,7 @@ PyDoc_STRVAR(test_unsigned_char_converter__doc__, "\n"); #define TEST_UNSIGNED_CHAR_CONVERTER_METHODDEF \ - {"test_unsigned_char_converter", (PyCFunction)(void(*)(void))test_unsigned_char_converter, METH_FASTCALL, test_unsigned_char_converter__doc__}, + {"test_unsigned_char_converter", _PyCFunction_CAST(test_unsigned_char_converter), METH_FASTCALL, test_unsigned_char_converter__doc__}, static PyObject * test_unsigned_char_converter_impl(PyObject *module, unsigned char a, @@ -787,7 +787,7 @@ exit: static PyObject * test_unsigned_char_converter_impl(PyObject *module, unsigned char a, unsigned char b, unsigned char c) -/*[clinic end generated code: output=c0a6ab3144481466 input=021414060993e289]*/ +/*[clinic end generated code: output=45920dbedc22eb55 input=021414060993e289]*/ /*[clinic input] @@ -804,7 +804,7 @@ PyDoc_STRVAR(test_short_converter__doc__, "\n"); #define TEST_SHORT_CONVERTER_METHODDEF \ - {"test_short_converter", (PyCFunction)(void(*)(void))test_short_converter, METH_FASTCALL, test_short_converter__doc__}, + {"test_short_converter", _PyCFunction_CAST(test_short_converter), METH_FASTCALL, test_short_converter__doc__}, static PyObject * test_short_converter_impl(PyObject *module, short a); @@ -849,7 +849,7 @@ exit: static PyObject * test_short_converter_impl(PyObject *module, short a) -/*[clinic end generated code: output=3ccda4bd08b6e4b4 input=6a8a7a509a498ff4]*/ +/*[clinic end generated code: output=a580945bd6963d45 input=6a8a7a509a498ff4]*/ /*[clinic input] @@ -868,7 +868,7 @@ PyDoc_STRVAR(test_unsigned_short_converter__doc__, "\n"); #define TEST_UNSIGNED_SHORT_CONVERTER_METHODDEF \ - {"test_unsigned_short_converter", (PyCFunction)(void(*)(void))test_unsigned_short_converter, METH_FASTCALL, test_unsigned_short_converter__doc__}, + {"test_unsigned_short_converter", _PyCFunction_CAST(test_unsigned_short_converter), METH_FASTCALL, test_unsigned_short_converter__doc__}, static PyObject * test_unsigned_short_converter_impl(PyObject *module, unsigned short a, @@ -914,7 +914,7 @@ exit: static PyObject * test_unsigned_short_converter_impl(PyObject *module, unsigned short a, unsigned short b, unsigned short c) -/*[clinic end generated code: output=576b5ce48424f351 input=cdfd8eff3d9176b4]*/ +/*[clinic end generated code: output=e6e990df729114fc input=cdfd8eff3d9176b4]*/ /*[clinic input] @@ -934,7 +934,7 @@ PyDoc_STRVAR(test_int_converter__doc__, "\n"); #define TEST_INT_CONVERTER_METHODDEF \ - {"test_int_converter", (PyCFunction)(void(*)(void))test_int_converter, METH_FASTCALL, test_int_converter__doc__}, + {"test_int_converter", _PyCFunction_CAST(test_int_converter), METH_FASTCALL, test_int_converter__doc__}, static PyObject * test_int_converter_impl(PyObject *module, int a, int b, int c, myenum d); @@ -996,7 +996,7 @@ exit: static PyObject * test_int_converter_impl(PyObject *module, int a, int b, int c, myenum d) -/*[clinic end generated code: output=8a1a7b02ebe9eeac input=d20541fc1ca0553e]*/ +/*[clinic end generated code: output=800993036e078c07 input=d20541fc1ca0553e]*/ /*[clinic input] @@ -1015,7 +1015,7 @@ PyDoc_STRVAR(test_unsigned_int_converter__doc__, "\n"); #define TEST_UNSIGNED_INT_CONVERTER_METHODDEF \ - {"test_unsigned_int_converter", (PyCFunction)(void(*)(void))test_unsigned_int_converter, METH_FASTCALL, test_unsigned_int_converter__doc__}, + {"test_unsigned_int_converter", _PyCFunction_CAST(test_unsigned_int_converter), METH_FASTCALL, test_unsigned_int_converter__doc__}, static PyObject * test_unsigned_int_converter_impl(PyObject *module, unsigned int a, @@ -1061,7 +1061,7 @@ exit: static PyObject * test_unsigned_int_converter_impl(PyObject *module, unsigned int a, unsigned int b, unsigned int c) -/*[clinic end generated code: output=4f53904bfa1a0250 input=5533534828b62fc0]*/ +/*[clinic end generated code: output=f9cdbe410ccc98a3 input=5533534828b62fc0]*/ /*[clinic input] @@ -1078,7 +1078,7 @@ PyDoc_STRVAR(test_long_converter__doc__, "\n"); #define TEST_LONG_CONVERTER_METHODDEF \ - {"test_long_converter", (PyCFunction)(void(*)(void))test_long_converter, METH_FASTCALL, test_long_converter__doc__}, + {"test_long_converter", _PyCFunction_CAST(test_long_converter), METH_FASTCALL, test_long_converter__doc__}, static PyObject * test_long_converter_impl(PyObject *module, long a); @@ -1108,7 +1108,7 @@ exit: static PyObject * test_long_converter_impl(PyObject *module, long a) -/*[clinic end generated code: output=e5e7883fddcf4218 input=d2179e3c9cdcde89]*/ +/*[clinic end generated code: output=02b3a83495c1d236 input=d2179e3c9cdcde89]*/ /*[clinic input] @@ -1127,7 +1127,7 @@ PyDoc_STRVAR(test_unsigned_long_converter__doc__, "\n"); #define TEST_UNSIGNED_LONG_CONVERTER_METHODDEF \ - {"test_unsigned_long_converter", (PyCFunction)(void(*)(void))test_unsigned_long_converter, METH_FASTCALL, test_unsigned_long_converter__doc__}, + {"test_unsigned_long_converter", _PyCFunction_CAST(test_unsigned_long_converter), METH_FASTCALL, test_unsigned_long_converter__doc__}, static PyObject * test_unsigned_long_converter_impl(PyObject *module, unsigned long a, @@ -1174,7 +1174,7 @@ exit: static PyObject * test_unsigned_long_converter_impl(PyObject *module, unsigned long a, unsigned long b, unsigned long c) -/*[clinic end generated code: output=87c6b29fa217026e input=f450d94cae1ef73b]*/ +/*[clinic end generated code: output=540bb0ba2894e1fe input=f450d94cae1ef73b]*/ /*[clinic input] @@ -1191,7 +1191,7 @@ PyDoc_STRVAR(test_long_long_converter__doc__, "\n"); #define TEST_LONG_LONG_CONVERTER_METHODDEF \ - {"test_long_long_converter", (PyCFunction)(void(*)(void))test_long_long_converter, METH_FASTCALL, test_long_long_converter__doc__}, + {"test_long_long_converter", _PyCFunction_CAST(test_long_long_converter), METH_FASTCALL, test_long_long_converter__doc__}, static PyObject * test_long_long_converter_impl(PyObject *module, long long a); @@ -1221,7 +1221,7 @@ exit: static PyObject * test_long_long_converter_impl(PyObject *module, long long a) -/*[clinic end generated code: output=0488ac9e8c1d77bb input=d5fc81577ff4dd02]*/ +/*[clinic end generated code: output=f9d4ed79ad2db857 input=d5fc81577ff4dd02]*/ /*[clinic input] @@ -1240,7 +1240,7 @@ PyDoc_STRVAR(test_unsigned_long_long_converter__doc__, "\n"); #define TEST_UNSIGNED_LONG_LONG_CONVERTER_METHODDEF \ - {"test_unsigned_long_long_converter", (PyCFunction)(void(*)(void))test_unsigned_long_long_converter, METH_FASTCALL, test_unsigned_long_long_converter__doc__}, + {"test_unsigned_long_long_converter", _PyCFunction_CAST(test_unsigned_long_long_converter), METH_FASTCALL, test_unsigned_long_long_converter__doc__}, static PyObject * test_unsigned_long_long_converter_impl(PyObject *module, @@ -1291,7 +1291,7 @@ test_unsigned_long_long_converter_impl(PyObject *module, unsigned long long a, unsigned long long b, unsigned long long c) -/*[clinic end generated code: output=aad2c7b43db2f190 input=a15115dc41866ff4]*/ +/*[clinic end generated code: output=3d69994f618b46bb input=a15115dc41866ff4]*/ /*[clinic input] @@ -1310,7 +1310,7 @@ PyDoc_STRVAR(test_Py_ssize_t_converter__doc__, "\n"); #define TEST_PY_SSIZE_T_CONVERTER_METHODDEF \ - {"test_Py_ssize_t_converter", (PyCFunction)(void(*)(void))test_Py_ssize_t_converter, METH_FASTCALL, test_Py_ssize_t_converter__doc__}, + {"test_Py_ssize_t_converter", _PyCFunction_CAST(test_Py_ssize_t_converter), METH_FASTCALL, test_Py_ssize_t_converter__doc__}, static PyObject * test_Py_ssize_t_converter_impl(PyObject *module, Py_ssize_t a, Py_ssize_t b, @@ -1373,7 +1373,7 @@ exit: static PyObject * test_Py_ssize_t_converter_impl(PyObject *module, Py_ssize_t a, Py_ssize_t b, Py_ssize_t c) -/*[clinic end generated code: output=3bf73f9fdfeab468 input=3855f184bb3f299d]*/ +/*[clinic end generated code: output=48214bc3d01f4dd7 input=3855f184bb3f299d]*/ /*[clinic input] @@ -1392,7 +1392,7 @@ PyDoc_STRVAR(test_slice_index_converter__doc__, "\n"); #define TEST_SLICE_INDEX_CONVERTER_METHODDEF \ - {"test_slice_index_converter", (PyCFunction)(void(*)(void))test_slice_index_converter, METH_FASTCALL, test_slice_index_converter__doc__}, + {"test_slice_index_converter", _PyCFunction_CAST(test_slice_index_converter), METH_FASTCALL, test_slice_index_converter__doc__}, static PyObject * test_slice_index_converter_impl(PyObject *module, Py_ssize_t a, Py_ssize_t b, @@ -1437,7 +1437,7 @@ exit: static PyObject * test_slice_index_converter_impl(PyObject *module, Py_ssize_t a, Py_ssize_t b, Py_ssize_t c) -/*[clinic end generated code: output=2148703cd3c6e941 input=edeadb0ee126f531]*/ +/*[clinic end generated code: output=67506ed999361212 input=edeadb0ee126f531]*/ /*[clinic input] @@ -1454,7 +1454,7 @@ PyDoc_STRVAR(test_size_t_converter__doc__, "\n"); #define TEST_SIZE_T_CONVERTER_METHODDEF \ - {"test_size_t_converter", (PyCFunction)(void(*)(void))test_size_t_converter, METH_FASTCALL, test_size_t_converter__doc__}, + {"test_size_t_converter", _PyCFunction_CAST(test_size_t_converter), METH_FASTCALL, test_size_t_converter__doc__}, static PyObject * test_size_t_converter_impl(PyObject *module, size_t a); @@ -1483,7 +1483,7 @@ exit: static PyObject * test_size_t_converter_impl(PyObject *module, size_t a) -/*[clinic end generated code: output=8a91a9ca8a92dabb input=52e93a0fed0f1fb3]*/ +/*[clinic end generated code: output=1653ecb5cbf775aa input=52e93a0fed0f1fb3]*/ /*[clinic input] @@ -1500,7 +1500,7 @@ PyDoc_STRVAR(test_float_converter__doc__, "\n"); #define TEST_FLOAT_CONVERTER_METHODDEF \ - {"test_float_converter", (PyCFunction)(void(*)(void))test_float_converter, METH_FASTCALL, test_float_converter__doc__}, + {"test_float_converter", _PyCFunction_CAST(test_float_converter), METH_FASTCALL, test_float_converter__doc__}, static PyObject * test_float_converter_impl(PyObject *module, float a); @@ -1536,7 +1536,7 @@ exit: static PyObject * test_float_converter_impl(PyObject *module, float a) -/*[clinic end generated code: output=6b9c7443d2601cea input=259c0d98eca35034]*/ +/*[clinic end generated code: output=36ad006990a8a91e input=259c0d98eca35034]*/ /*[clinic input] @@ -1553,7 +1553,7 @@ PyDoc_STRVAR(test_double_converter__doc__, "\n"); #define TEST_DOUBLE_CONVERTER_METHODDEF \ - {"test_double_converter", (PyCFunction)(void(*)(void))test_double_converter, METH_FASTCALL, test_double_converter__doc__}, + {"test_double_converter", _PyCFunction_CAST(test_double_converter), METH_FASTCALL, test_double_converter__doc__}, static PyObject * test_double_converter_impl(PyObject *module, double a); @@ -1589,7 +1589,7 @@ exit: static PyObject * test_double_converter_impl(PyObject *module, double a) -/*[clinic end generated code: output=5b7b9a0f0791b2cc input=c6a9945706a41c27]*/ +/*[clinic end generated code: output=7435925592bac795 input=c6a9945706a41c27]*/ /*[clinic input] @@ -1654,7 +1654,7 @@ PyDoc_STRVAR(test_str_converter__doc__, "\n"); #define TEST_STR_CONVERTER_METHODDEF \ - {"test_str_converter", (PyCFunction)(void(*)(void))test_str_converter, METH_FASTCALL, test_str_converter__doc__}, + {"test_str_converter", _PyCFunction_CAST(test_str_converter), METH_FASTCALL, test_str_converter__doc__}, static PyObject * test_str_converter_impl(PyObject *module, const char *a, const char *b, @@ -1695,7 +1695,7 @@ test_str_converter_impl(PyObject *module, const char *a, const char *b, const char *f, Py_ssize_t f_length, const char *g, Py_ssize_t g_length, const char *h, Py_ssize_t h_length) -/*[clinic end generated code: output=5def009caa2fd1ac input=8afe9da8185cd38c]*/ +/*[clinic end generated code: output=82cb06d5237ef062 input=8afe9da8185cd38c]*/ /*[clinic input] @@ -1716,7 +1716,7 @@ PyDoc_STRVAR(test_str_converter_encoding__doc__, "\n"); #define TEST_STR_CONVERTER_ENCODING_METHODDEF \ - {"test_str_converter_encoding", (PyCFunction)(void(*)(void))test_str_converter_encoding, METH_FASTCALL, test_str_converter_encoding__doc__}, + {"test_str_converter_encoding", _PyCFunction_CAST(test_str_converter_encoding), METH_FASTCALL, test_str_converter_encoding__doc__}, static PyObject * test_str_converter_encoding_impl(PyObject *module, char *a, char *b, char *c, @@ -1770,7 +1770,7 @@ static PyObject * test_str_converter_encoding_impl(PyObject *module, char *a, char *b, char *c, char *d, Py_ssize_t d_length, char *e, Py_ssize_t e_length) -/*[clinic end generated code: output=5cae635c092334cb input=eb4c38e1f898f402]*/ +/*[clinic end generated code: output=8acb886a3843f3bc input=eb4c38e1f898f402]*/ /*[clinic input] @@ -1791,7 +1791,7 @@ PyDoc_STRVAR(test_Py_UNICODE_converter__doc__, "\n"); #define TEST_PY_UNICODE_CONVERTER_METHODDEF \ - {"test_Py_UNICODE_converter", (PyCFunction)(void(*)(void))test_Py_UNICODE_converter, METH_FASTCALL, test_Py_UNICODE_converter__doc__}, + {"test_Py_UNICODE_converter", _PyCFunction_CAST(test_Py_UNICODE_converter), METH_FASTCALL, test_Py_UNICODE_converter__doc__}, static PyObject * test_Py_UNICODE_converter_impl(PyObject *module, const Py_UNICODE *a, @@ -1839,7 +1839,7 @@ test_Py_UNICODE_converter_impl(PyObject *module, const Py_UNICODE *a, const Py_UNICODE *b, const Py_UNICODE *c, const Py_UNICODE *d, Py_ssize_t d_length, const Py_UNICODE *e, Py_ssize_t e_length) -/*[clinic end generated code: output=65d6607da302afd0 input=064a3b68ad7f04b0]*/ +/*[clinic end generated code: output=45e92604de227552 input=064a3b68ad7f04b0]*/ /*[clinic input] @@ -1860,7 +1860,7 @@ PyDoc_STRVAR(test_Py_buffer_converter__doc__, "\n"); #define TEST_PY_BUFFER_CONVERTER_METHODDEF \ - {"test_Py_buffer_converter", (PyCFunction)(void(*)(void))test_Py_buffer_converter, METH_FASTCALL, test_Py_buffer_converter__doc__}, + {"test_Py_buffer_converter", _PyCFunction_CAST(test_Py_buffer_converter), METH_FASTCALL, test_Py_buffer_converter__doc__}, static PyObject * test_Py_buffer_converter_impl(PyObject *module, Py_buffer *a, Py_buffer *b, @@ -1910,7 +1910,7 @@ exit: static PyObject * test_Py_buffer_converter_impl(PyObject *module, Py_buffer *a, Py_buffer *b, Py_buffer *c, Py_buffer *d, Py_buffer *e) -/*[clinic end generated code: output=5760c82faa2ed61f input=6a9da0f56f9525fd]*/ +/*[clinic end generated code: output=a153b71b4f45f952 input=6a9da0f56f9525fd]*/ /*[clinic input] @@ -1927,7 +1927,7 @@ PyDoc_STRVAR(test_keywords__doc__, "\n"); #define TEST_KEYWORDS_METHODDEF \ - {"test_keywords", (PyCFunction)(void(*)(void))test_keywords, METH_FASTCALL|METH_KEYWORDS, test_keywords__doc__}, + {"test_keywords", _PyCFunction_CAST(test_keywords), METH_FASTCALL|METH_KEYWORDS, test_keywords__doc__}, static PyObject * test_keywords_impl(PyObject *module, PyObject *a, PyObject *b); @@ -1956,7 +1956,7 @@ exit: static PyObject * test_keywords_impl(PyObject *module, PyObject *a, PyObject *b) -/*[clinic end generated code: output=4be6cf045ea8242e input=0d3484844749c05b]*/ +/*[clinic end generated code: output=c03a52cfca192d3b input=0d3484844749c05b]*/ /*[clinic input] @@ -1974,7 +1974,7 @@ PyDoc_STRVAR(test_keywords_kwonly__doc__, "\n"); #define TEST_KEYWORDS_KWONLY_METHODDEF \ - {"test_keywords_kwonly", (PyCFunction)(void(*)(void))test_keywords_kwonly, METH_FASTCALL|METH_KEYWORDS, test_keywords_kwonly__doc__}, + {"test_keywords_kwonly", _PyCFunction_CAST(test_keywords_kwonly), METH_FASTCALL|METH_KEYWORDS, test_keywords_kwonly__doc__}, static PyObject * test_keywords_kwonly_impl(PyObject *module, PyObject *a, PyObject *b); @@ -2003,7 +2003,7 @@ exit: static PyObject * test_keywords_kwonly_impl(PyObject *module, PyObject *a, PyObject *b) -/*[clinic end generated code: output=d63c4977a7a80713 input=384adc78bfa0bff7]*/ +/*[clinic end generated code: output=4704adcb6c7df928 input=384adc78bfa0bff7]*/ /*[clinic input] @@ -2021,7 +2021,7 @@ PyDoc_STRVAR(test_keywords_opt__doc__, "\n"); #define TEST_KEYWORDS_OPT_METHODDEF \ - {"test_keywords_opt", (PyCFunction)(void(*)(void))test_keywords_opt, METH_FASTCALL|METH_KEYWORDS, test_keywords_opt__doc__}, + {"test_keywords_opt", _PyCFunction_CAST(test_keywords_opt), METH_FASTCALL|METH_KEYWORDS, test_keywords_opt__doc__}, static PyObject * test_keywords_opt_impl(PyObject *module, PyObject *a, PyObject *b, @@ -2064,7 +2064,7 @@ exit: static PyObject * test_keywords_opt_impl(PyObject *module, PyObject *a, PyObject *b, PyObject *c) -/*[clinic end generated code: output=e5e50d114d8fc10a input=eda7964f784f4607]*/ +/*[clinic end generated code: output=de3ee1039da35fa1 input=eda7964f784f4607]*/ /*[clinic input] @@ -2084,7 +2084,7 @@ PyDoc_STRVAR(test_keywords_opt_kwonly__doc__, "\n"); #define TEST_KEYWORDS_OPT_KWONLY_METHODDEF \ - {"test_keywords_opt_kwonly", (PyCFunction)(void(*)(void))test_keywords_opt_kwonly, METH_FASTCALL|METH_KEYWORDS, test_keywords_opt_kwonly__doc__}, + {"test_keywords_opt_kwonly", _PyCFunction_CAST(test_keywords_opt_kwonly), METH_FASTCALL|METH_KEYWORDS, test_keywords_opt_kwonly__doc__}, static PyObject * test_keywords_opt_kwonly_impl(PyObject *module, PyObject *a, PyObject *b, @@ -2138,7 +2138,7 @@ exit: static PyObject * test_keywords_opt_kwonly_impl(PyObject *module, PyObject *a, PyObject *b, PyObject *c, PyObject *d) -/*[clinic end generated code: output=3f065cb8309b9317 input=209387a4815e5082]*/ +/*[clinic end generated code: output=996394678586854e input=209387a4815e5082]*/ /*[clinic input] @@ -2157,7 +2157,7 @@ PyDoc_STRVAR(test_keywords_kwonly_opt__doc__, "\n"); #define TEST_KEYWORDS_KWONLY_OPT_METHODDEF \ - {"test_keywords_kwonly_opt", (PyCFunction)(void(*)(void))test_keywords_kwonly_opt, METH_FASTCALL|METH_KEYWORDS, test_keywords_kwonly_opt__doc__}, + {"test_keywords_kwonly_opt", _PyCFunction_CAST(test_keywords_kwonly_opt), METH_FASTCALL|METH_KEYWORDS, test_keywords_kwonly_opt__doc__}, static PyObject * test_keywords_kwonly_opt_impl(PyObject *module, PyObject *a, PyObject *b, @@ -2200,7 +2200,7 @@ exit: static PyObject * test_keywords_kwonly_opt_impl(PyObject *module, PyObject *a, PyObject *b, PyObject *c) -/*[clinic end generated code: output=94edba5484e1681e input=18393cc64fa000f4]*/ +/*[clinic end generated code: output=4ea9947a903a2f24 input=18393cc64fa000f4]*/ /*[clinic input] @@ -2218,7 +2218,7 @@ PyDoc_STRVAR(test_posonly_keywords__doc__, "\n"); #define TEST_POSONLY_KEYWORDS_METHODDEF \ - {"test_posonly_keywords", (PyCFunction)(void(*)(void))test_posonly_keywords, METH_FASTCALL|METH_KEYWORDS, test_posonly_keywords__doc__}, + {"test_posonly_keywords", _PyCFunction_CAST(test_posonly_keywords), METH_FASTCALL|METH_KEYWORDS, test_posonly_keywords__doc__}, static PyObject * test_posonly_keywords_impl(PyObject *module, PyObject *a, PyObject *b); @@ -2247,7 +2247,7 @@ exit: static PyObject * test_posonly_keywords_impl(PyObject *module, PyObject *a, PyObject *b) -/*[clinic end generated code: output=eca1507f0182ffb0 input=1767b0ebdf06060e]*/ +/*[clinic end generated code: output=478aad346a188a80 input=1767b0ebdf06060e]*/ /*[clinic input] @@ -2266,7 +2266,7 @@ PyDoc_STRVAR(test_posonly_kwonly__doc__, "\n"); #define TEST_POSONLY_KWONLY_METHODDEF \ - {"test_posonly_kwonly", (PyCFunction)(void(*)(void))test_posonly_kwonly, METH_FASTCALL|METH_KEYWORDS, test_posonly_kwonly__doc__}, + {"test_posonly_kwonly", _PyCFunction_CAST(test_posonly_kwonly), METH_FASTCALL|METH_KEYWORDS, test_posonly_kwonly__doc__}, static PyObject * test_posonly_kwonly_impl(PyObject *module, PyObject *a, PyObject *c); @@ -2295,7 +2295,7 @@ exit: static PyObject * test_posonly_kwonly_impl(PyObject *module, PyObject *a, PyObject *c) -/*[clinic end generated code: output=3e14655646b66e9a input=9042f2818f664839]*/ +/*[clinic end generated code: output=d747975a0b28e9c2 input=9042f2818f664839]*/ /*[clinic input] @@ -2315,7 +2315,7 @@ PyDoc_STRVAR(test_posonly_keywords_kwonly__doc__, "\n"); #define TEST_POSONLY_KEYWORDS_KWONLY_METHODDEF \ - {"test_posonly_keywords_kwonly", (PyCFunction)(void(*)(void))test_posonly_keywords_kwonly, METH_FASTCALL|METH_KEYWORDS, test_posonly_keywords_kwonly__doc__}, + {"test_posonly_keywords_kwonly", _PyCFunction_CAST(test_posonly_keywords_kwonly), METH_FASTCALL|METH_KEYWORDS, test_posonly_keywords_kwonly__doc__}, static PyObject * test_posonly_keywords_kwonly_impl(PyObject *module, PyObject *a, PyObject *b, @@ -2348,7 +2348,7 @@ exit: static PyObject * test_posonly_keywords_kwonly_impl(PyObject *module, PyObject *a, PyObject *b, PyObject *c) -/*[clinic end generated code: output=de57172fc97a626e input=29546ebdca492fea]*/ +/*[clinic end generated code: output=5b99f692f8ddaa4a input=29546ebdca492fea]*/ /*[clinic input] @@ -2368,7 +2368,7 @@ PyDoc_STRVAR(test_posonly_keywords_opt__doc__, "\n"); #define TEST_POSONLY_KEYWORDS_OPT_METHODDEF \ - {"test_posonly_keywords_opt", (PyCFunction)(void(*)(void))test_posonly_keywords_opt, METH_FASTCALL|METH_KEYWORDS, test_posonly_keywords_opt__doc__}, + {"test_posonly_keywords_opt", _PyCFunction_CAST(test_posonly_keywords_opt), METH_FASTCALL|METH_KEYWORDS, test_posonly_keywords_opt__doc__}, static PyObject * test_posonly_keywords_opt_impl(PyObject *module, PyObject *a, PyObject *b, @@ -2413,7 +2413,7 @@ exit: static PyObject * test_posonly_keywords_opt_impl(PyObject *module, PyObject *a, PyObject *b, PyObject *c, PyObject *d) -/*[clinic end generated code: output=8bc6b44a25d4b716 input=cdf5a9625e554e9b]*/ +/*[clinic end generated code: output=fd5dfbac5727aebb input=cdf5a9625e554e9b]*/ /*[clinic input] @@ -2432,7 +2432,7 @@ PyDoc_STRVAR(test_posonly_keywords_opt2__doc__, "\n"); #define TEST_POSONLY_KEYWORDS_OPT2_METHODDEF \ - {"test_posonly_keywords_opt2", (PyCFunction)(void(*)(void))test_posonly_keywords_opt2, METH_FASTCALL|METH_KEYWORDS, test_posonly_keywords_opt2__doc__}, + {"test_posonly_keywords_opt2", _PyCFunction_CAST(test_posonly_keywords_opt2), METH_FASTCALL|METH_KEYWORDS, test_posonly_keywords_opt2__doc__}, static PyObject * test_posonly_keywords_opt2_impl(PyObject *module, PyObject *a, PyObject *b, @@ -2475,7 +2475,7 @@ exit: static PyObject * test_posonly_keywords_opt2_impl(PyObject *module, PyObject *a, PyObject *b, PyObject *c) -/*[clinic end generated code: output=a870c45a6510ba91 input=1581299d21d16f14]*/ +/*[clinic end generated code: output=777f58ac70775420 input=1581299d21d16f14]*/ /*[clinic input] @@ -2495,7 +2495,7 @@ PyDoc_STRVAR(test_posonly_opt_keywords_opt__doc__, "\n"); #define TEST_POSONLY_OPT_KEYWORDS_OPT_METHODDEF \ - {"test_posonly_opt_keywords_opt", (PyCFunction)(void(*)(void))test_posonly_opt_keywords_opt, METH_FASTCALL|METH_KEYWORDS, test_posonly_opt_keywords_opt__doc__}, + {"test_posonly_opt_keywords_opt", _PyCFunction_CAST(test_posonly_opt_keywords_opt), METH_FASTCALL|METH_KEYWORDS, test_posonly_opt_keywords_opt__doc__}, static PyObject * test_posonly_opt_keywords_opt_impl(PyObject *module, PyObject *a, @@ -2545,7 +2545,7 @@ exit: static PyObject * test_posonly_opt_keywords_opt_impl(PyObject *module, PyObject *a, PyObject *b, PyObject *c, PyObject *d) -/*[clinic end generated code: output=9ae3d52e071d3b7f input=408798ec3d42949f]*/ +/*[clinic end generated code: output=2c18b8edff78ed22 input=408798ec3d42949f]*/ /*[clinic input] @@ -2566,7 +2566,7 @@ PyDoc_STRVAR(test_posonly_kwonly_opt__doc__, "\n"); #define TEST_POSONLY_KWONLY_OPT_METHODDEF \ - {"test_posonly_kwonly_opt", (PyCFunction)(void(*)(void))test_posonly_kwonly_opt, METH_FASTCALL|METH_KEYWORDS, test_posonly_kwonly_opt__doc__}, + {"test_posonly_kwonly_opt", _PyCFunction_CAST(test_posonly_kwonly_opt), METH_FASTCALL|METH_KEYWORDS, test_posonly_kwonly_opt__doc__}, static PyObject * test_posonly_kwonly_opt_impl(PyObject *module, PyObject *a, PyObject *b, @@ -2611,7 +2611,7 @@ exit: static PyObject * test_posonly_kwonly_opt_impl(PyObject *module, PyObject *a, PyObject *b, PyObject *c, PyObject *d) -/*[clinic end generated code: output=fb001f586ba68549 input=8d8e5643bbbc2309]*/ +/*[clinic end generated code: output=8db9ab5602e1efaf input=8d8e5643bbbc2309]*/ /*[clinic input] @@ -2631,7 +2631,7 @@ PyDoc_STRVAR(test_posonly_kwonly_opt2__doc__, "\n"); #define TEST_POSONLY_KWONLY_OPT2_METHODDEF \ - {"test_posonly_kwonly_opt2", (PyCFunction)(void(*)(void))test_posonly_kwonly_opt2, METH_FASTCALL|METH_KEYWORDS, test_posonly_kwonly_opt2__doc__}, + {"test_posonly_kwonly_opt2", _PyCFunction_CAST(test_posonly_kwonly_opt2), METH_FASTCALL|METH_KEYWORDS, test_posonly_kwonly_opt2__doc__}, static PyObject * test_posonly_kwonly_opt2_impl(PyObject *module, PyObject *a, PyObject *b, @@ -2674,7 +2674,7 @@ exit: static PyObject * test_posonly_kwonly_opt2_impl(PyObject *module, PyObject *a, PyObject *b, PyObject *c) -/*[clinic end generated code: output=51aae7cac77b458a input=f7e5eed94f75fff0]*/ +/*[clinic end generated code: output=6cfe546265d85d2c input=f7e5eed94f75fff0]*/ /*[clinic input] @@ -2695,7 +2695,7 @@ PyDoc_STRVAR(test_posonly_opt_kwonly_opt__doc__, "\n"); #define TEST_POSONLY_OPT_KWONLY_OPT_METHODDEF \ - {"test_posonly_opt_kwonly_opt", (PyCFunction)(void(*)(void))test_posonly_opt_kwonly_opt, METH_FASTCALL|METH_KEYWORDS, test_posonly_opt_kwonly_opt__doc__}, + {"test_posonly_opt_kwonly_opt", _PyCFunction_CAST(test_posonly_opt_kwonly_opt), METH_FASTCALL|METH_KEYWORDS, test_posonly_opt_kwonly_opt__doc__}, static PyObject * test_posonly_opt_kwonly_opt_impl(PyObject *module, PyObject *a, PyObject *b, @@ -2745,7 +2745,7 @@ exit: static PyObject * test_posonly_opt_kwonly_opt_impl(PyObject *module, PyObject *a, PyObject *b, PyObject *c, PyObject *d) -/*[clinic end generated code: output=68844c45143d1668 input=1e557dc979d120fd]*/ +/*[clinic end generated code: output=8b5e21a30cad22b7 input=1e557dc979d120fd]*/ /*[clinic input] @@ -2767,7 +2767,7 @@ PyDoc_STRVAR(test_posonly_keywords_kwonly_opt__doc__, "\n"); #define TEST_POSONLY_KEYWORDS_KWONLY_OPT_METHODDEF \ - {"test_posonly_keywords_kwonly_opt", (PyCFunction)(void(*)(void))test_posonly_keywords_kwonly_opt, METH_FASTCALL|METH_KEYWORDS, test_posonly_keywords_kwonly_opt__doc__}, + {"test_posonly_keywords_kwonly_opt", _PyCFunction_CAST(test_posonly_keywords_kwonly_opt), METH_FASTCALL|METH_KEYWORDS, test_posonly_keywords_kwonly_opt__doc__}, static PyObject * test_posonly_keywords_kwonly_opt_impl(PyObject *module, PyObject *a, @@ -2816,7 +2816,7 @@ static PyObject * test_posonly_keywords_kwonly_opt_impl(PyObject *module, PyObject *a, PyObject *b, PyObject *c, PyObject *d, PyObject *e) -/*[clinic end generated code: output=996ff645551897ac input=c3884a4f956fdc89]*/ +/*[clinic end generated code: output=950b9ace38b8b4a7 input=c3884a4f956fdc89]*/ /*[clinic input] @@ -2837,7 +2837,7 @@ PyDoc_STRVAR(test_posonly_keywords_kwonly_opt2__doc__, "\n"); #define TEST_POSONLY_KEYWORDS_KWONLY_OPT2_METHODDEF \ - {"test_posonly_keywords_kwonly_opt2", (PyCFunction)(void(*)(void))test_posonly_keywords_kwonly_opt2, METH_FASTCALL|METH_KEYWORDS, test_posonly_keywords_kwonly_opt2__doc__}, + {"test_posonly_keywords_kwonly_opt2", _PyCFunction_CAST(test_posonly_keywords_kwonly_opt2), METH_FASTCALL|METH_KEYWORDS, test_posonly_keywords_kwonly_opt2__doc__}, static PyObject * test_posonly_keywords_kwonly_opt2_impl(PyObject *module, PyObject *a, @@ -2882,7 +2882,7 @@ exit: static PyObject * test_posonly_keywords_kwonly_opt2_impl(PyObject *module, PyObject *a, PyObject *b, PyObject *c, PyObject *d) -/*[clinic end generated code: output=e5a3e992fd4b28b3 input=68d01d7c0f6dafb0]*/ +/*[clinic end generated code: output=fb6951a21b517317 input=68d01d7c0f6dafb0]*/ /*[clinic input] @@ -2905,7 +2905,7 @@ PyDoc_STRVAR(test_posonly_keywords_opt_kwonly_opt__doc__, "\n"); #define TEST_POSONLY_KEYWORDS_OPT_KWONLY_OPT_METHODDEF \ - {"test_posonly_keywords_opt_kwonly_opt", (PyCFunction)(void(*)(void))test_posonly_keywords_opt_kwonly_opt, METH_FASTCALL|METH_KEYWORDS, test_posonly_keywords_opt_kwonly_opt__doc__}, + {"test_posonly_keywords_opt_kwonly_opt", _PyCFunction_CAST(test_posonly_keywords_opt_kwonly_opt), METH_FASTCALL|METH_KEYWORDS, test_posonly_keywords_opt_kwonly_opt__doc__}, static PyObject * test_posonly_keywords_opt_kwonly_opt_impl(PyObject *module, PyObject *a, @@ -2963,7 +2963,7 @@ static PyObject * test_posonly_keywords_opt_kwonly_opt_impl(PyObject *module, PyObject *a, PyObject *b, PyObject *c, PyObject *d, PyObject *e) -/*[clinic end generated code: output=ff9fb6c3d2cbbaa4 input=d0883d45876f186c]*/ +/*[clinic end generated code: output=4db10815a99a857e input=d0883d45876f186c]*/ /*[clinic input] @@ -2986,7 +2986,7 @@ PyDoc_STRVAR(test_posonly_keywords_opt2_kwonly_opt__doc__, "\n"); #define TEST_POSONLY_KEYWORDS_OPT2_KWONLY_OPT_METHODDEF \ - {"test_posonly_keywords_opt2_kwonly_opt", (PyCFunction)(void(*)(void))test_posonly_keywords_opt2_kwonly_opt, METH_FASTCALL|METH_KEYWORDS, test_posonly_keywords_opt2_kwonly_opt__doc__}, + {"test_posonly_keywords_opt2_kwonly_opt", _PyCFunction_CAST(test_posonly_keywords_opt2_kwonly_opt), METH_FASTCALL|METH_KEYWORDS, test_posonly_keywords_opt2_kwonly_opt__doc__}, static PyObject * test_posonly_keywords_opt2_kwonly_opt_impl(PyObject *module, PyObject *a, @@ -3049,7 +3049,7 @@ static PyObject * test_posonly_keywords_opt2_kwonly_opt_impl(PyObject *module, PyObject *a, PyObject *b, PyObject *c, PyObject *d, PyObject *e) -/*[clinic end generated code: output=c809d7a84a2205e1 input=c95e2e1ec93035ad]*/ +/*[clinic end generated code: output=0416689b23ebf66e input=c95e2e1ec93035ad]*/ /*[clinic input] @@ -3073,7 +3073,7 @@ PyDoc_STRVAR(test_posonly_opt_keywords_opt_kwonly_opt__doc__, "\n"); #define TEST_POSONLY_OPT_KEYWORDS_OPT_KWONLY_OPT_METHODDEF \ - {"test_posonly_opt_keywords_opt_kwonly_opt", (PyCFunction)(void(*)(void))test_posonly_opt_keywords_opt_kwonly_opt, METH_FASTCALL|METH_KEYWORDS, test_posonly_opt_keywords_opt_kwonly_opt__doc__}, + {"test_posonly_opt_keywords_opt_kwonly_opt", _PyCFunction_CAST(test_posonly_opt_keywords_opt_kwonly_opt), METH_FASTCALL|METH_KEYWORDS, test_posonly_opt_keywords_opt_kwonly_opt__doc__}, static PyObject * test_posonly_opt_keywords_opt_kwonly_opt_impl(PyObject *module, PyObject *a, @@ -3145,7 +3145,7 @@ test_posonly_opt_keywords_opt_kwonly_opt_impl(PyObject *module, PyObject *a, PyObject *b, PyObject *c, PyObject *d, PyObject *e, PyObject *f) -/*[clinic end generated code: output=719e4f6c224402d4 input=9914857713c5bbf8]*/ +/*[clinic end generated code: output=8892a137a8c8f46f input=9914857713c5bbf8]*/ /*[clinic input] test_keyword_only_parameter @@ -3162,7 +3162,7 @@ PyDoc_STRVAR(test_keyword_only_parameter__doc__, "\n"); #define TEST_KEYWORD_ONLY_PARAMETER_METHODDEF \ - {"test_keyword_only_parameter", (PyCFunction)(void(*)(void))test_keyword_only_parameter, METH_FASTCALL|METH_KEYWORDS, test_keyword_only_parameter__doc__}, + {"test_keyword_only_parameter", _PyCFunction_CAST(test_keyword_only_parameter), METH_FASTCALL|METH_KEYWORDS, test_keyword_only_parameter__doc__}, static PyObject * test_keyword_only_parameter_impl(PyObject *module, PyBytesObject *co_lnotab); @@ -3198,7 +3198,7 @@ exit: static PyObject * test_keyword_only_parameter_impl(PyObject *module, PyBytesObject *co_lnotab) -/*[clinic end generated code: output=f25914b402039493 input=303df5046c7e37a3]*/ +/*[clinic end generated code: output=332b5f4b444c5d55 input=303df5046c7e37a3]*/ /*[clinic input] @@ -3321,7 +3321,7 @@ PyDoc_STRVAR(test_vararg_and_posonly__doc__, "\n"); #define TEST_VARARG_AND_POSONLY_METHODDEF \ - {"test_vararg_and_posonly", (PyCFunction)(void(*)(void))test_vararg_and_posonly, METH_FASTCALL, test_vararg_and_posonly__doc__}, + {"test_vararg_and_posonly", _PyCFunction_CAST(test_vararg_and_posonly), METH_FASTCALL, test_vararg_and_posonly__doc__}, static PyObject * test_vararg_and_posonly_impl(PyObject *module, PyObject *a, PyObject *args); @@ -3350,7 +3350,7 @@ exit: static PyObject * test_vararg_and_posonly_impl(PyObject *module, PyObject *a, PyObject *args) -/*[clinic end generated code: output=ada613d2d87c9341 input=08dc2bf7afbf1613]*/ +/*[clinic end generated code: output=548bca3a127c22c1 input=08dc2bf7afbf1613]*/ /*[clinic input] test_vararg @@ -3367,7 +3367,7 @@ PyDoc_STRVAR(test_vararg__doc__, "\n"); #define TEST_VARARG_METHODDEF \ - {"test_vararg", (PyCFunction)(void(*)(void))test_vararg, METH_FASTCALL|METH_KEYWORDS, test_vararg__doc__}, + {"test_vararg", _PyCFunction_CAST(test_vararg), METH_FASTCALL|METH_KEYWORDS, test_vararg__doc__}, static PyObject * test_vararg_impl(PyObject *module, PyObject *a, PyObject *args); @@ -3398,7 +3398,7 @@ exit: static PyObject * test_vararg_impl(PyObject *module, PyObject *a, PyObject *args) -/*[clinic end generated code: output=f721025731c3bfe8 input=81d33815ad1bae6e]*/ +/*[clinic end generated code: output=a2baf8c1fade41d2 input=81d33815ad1bae6e]*/ /*[clinic input] test_vararg_with_default @@ -3416,7 +3416,7 @@ PyDoc_STRVAR(test_vararg_with_default__doc__, "\n"); #define TEST_VARARG_WITH_DEFAULT_METHODDEF \ - {"test_vararg_with_default", (PyCFunction)(void(*)(void))test_vararg_with_default, METH_FASTCALL|METH_KEYWORDS, test_vararg_with_default__doc__}, + {"test_vararg_with_default", _PyCFunction_CAST(test_vararg_with_default), METH_FASTCALL|METH_KEYWORDS, test_vararg_with_default__doc__}, static PyObject * test_vararg_with_default_impl(PyObject *module, PyObject *a, PyObject *args, @@ -3458,7 +3458,7 @@ exit: static PyObject * test_vararg_with_default_impl(PyObject *module, PyObject *a, PyObject *args, int b) -/*[clinic end generated code: output=63b34d3241c52fda input=6e110b54acd9b22d]*/ +/*[clinic end generated code: output=3821d282c29f8616 input=6e110b54acd9b22d]*/ /*[clinic input] test_vararg_with_only_defaults @@ -3476,7 +3476,7 @@ PyDoc_STRVAR(test_vararg_with_only_defaults__doc__, "\n"); #define TEST_VARARG_WITH_ONLY_DEFAULTS_METHODDEF \ - {"test_vararg_with_only_defaults", (PyCFunction)(void(*)(void))test_vararg_with_only_defaults, METH_FASTCALL|METH_KEYWORDS, test_vararg_with_only_defaults__doc__}, + {"test_vararg_with_only_defaults", _PyCFunction_CAST(test_vararg_with_only_defaults), METH_FASTCALL|METH_KEYWORDS, test_vararg_with_only_defaults__doc__}, static PyObject * test_vararg_with_only_defaults_impl(PyObject *module, PyObject *args, int b, @@ -3523,4 +3523,4 @@ exit: static PyObject * test_vararg_with_only_defaults_impl(PyObject *module, PyObject *args, int b, PyObject *c) -/*[clinic end generated code: output=dc29ce6ebc2ec10c input=fa56a709a035666e]*/ +/*[clinic end generated code: output=7e393689e6ce61a3 input=fa56a709a035666e]*/ diff --git a/Modules/_io/clinic/_iomodule.c.h b/Modules/_io/clinic/_iomodule.c.h index 1fdbe6835c717..0249dd184b1d3 100644 --- a/Modules/_io/clinic/_iomodule.c.h +++ b/Modules/_io/clinic/_iomodule.c.h @@ -122,7 +122,7 @@ PyDoc_STRVAR(_io_open__doc__, "opened in a binary mode."); #define _IO_OPEN_METHODDEF \ - {"open", (PyCFunction)(void(*)(void))_io_open, METH_FASTCALL|METH_KEYWORDS, _io_open__doc__}, + {"open", _PyCFunction_CAST(_io_open), METH_FASTCALL|METH_KEYWORDS, _io_open__doc__}, static PyObject * _io_open_impl(PyObject *module, PyObject *file, const char *mode, @@ -284,7 +284,7 @@ PyDoc_STRVAR(_io_text_encoding__doc__, "However, please consider using encoding=\"utf-8\" for new APIs."); #define _IO_TEXT_ENCODING_METHODDEF \ - {"text_encoding", (PyCFunction)(void(*)(void))_io_text_encoding, METH_FASTCALL, _io_text_encoding__doc__}, + {"text_encoding", _PyCFunction_CAST(_io_text_encoding), METH_FASTCALL, _io_text_encoding__doc__}, static PyObject * _io_text_encoding_impl(PyObject *module, PyObject *encoding, int stacklevel); @@ -324,7 +324,7 @@ PyDoc_STRVAR(_io_open_code__doc__, "with calling open(path, \'rb\')."); #define _IO_OPEN_CODE_METHODDEF \ - {"open_code", (PyCFunction)(void(*)(void))_io_open_code, METH_FASTCALL|METH_KEYWORDS, _io_open_code__doc__}, + {"open_code", _PyCFunction_CAST(_io_open_code), METH_FASTCALL|METH_KEYWORDS, _io_open_code__doc__}, static PyObject * _io_open_code_impl(PyObject *module, PyObject *path); @@ -355,4 +355,4 @@ _io_open_code(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObjec exit: return return_value; } -/*[clinic end generated code: output=e562f29e3c2533a6 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=c4d7e4ef878985f8 input=a9049054013a1b77]*/ diff --git a/Modules/_io/clinic/bufferedio.c.h b/Modules/_io/clinic/bufferedio.c.h index 2fd02329dc3e7..3700451232c16 100644 --- a/Modules/_io/clinic/bufferedio.c.h +++ b/Modules/_io/clinic/bufferedio.c.h @@ -103,7 +103,7 @@ PyDoc_STRVAR(_io__Buffered_peek__doc__, "\n"); #define _IO__BUFFERED_PEEK_METHODDEF \ - {"peek", (PyCFunction)(void(*)(void))_io__Buffered_peek, METH_FASTCALL, _io__Buffered_peek__doc__}, + {"peek", _PyCFunction_CAST(_io__Buffered_peek), METH_FASTCALL, _io__Buffered_peek__doc__}, static PyObject * _io__Buffered_peek_impl(buffered *self, Py_ssize_t size); @@ -145,7 +145,7 @@ PyDoc_STRVAR(_io__Buffered_read__doc__, "\n"); #define _IO__BUFFERED_READ_METHODDEF \ - {"read", (PyCFunction)(void(*)(void))_io__Buffered_read, METH_FASTCALL, _io__Buffered_read__doc__}, + {"read", _PyCFunction_CAST(_io__Buffered_read), METH_FASTCALL, _io__Buffered_read__doc__}, static PyObject * _io__Buffered_read_impl(buffered *self, Py_ssize_t n); @@ -178,7 +178,7 @@ PyDoc_STRVAR(_io__Buffered_read1__doc__, "\n"); #define _IO__BUFFERED_READ1_METHODDEF \ - {"read1", (PyCFunction)(void(*)(void))_io__Buffered_read1, METH_FASTCALL, _io__Buffered_read1__doc__}, + {"read1", _PyCFunction_CAST(_io__Buffered_read1), METH_FASTCALL, _io__Buffered_read1__doc__}, static PyObject * _io__Buffered_read1_impl(buffered *self, Py_ssize_t n); @@ -294,7 +294,7 @@ PyDoc_STRVAR(_io__Buffered_readline__doc__, "\n"); #define _IO__BUFFERED_READLINE_METHODDEF \ - {"readline", (PyCFunction)(void(*)(void))_io__Buffered_readline, METH_FASTCALL, _io__Buffered_readline__doc__}, + {"readline", _PyCFunction_CAST(_io__Buffered_readline), METH_FASTCALL, _io__Buffered_readline__doc__}, static PyObject * _io__Buffered_readline_impl(buffered *self, Py_ssize_t size); @@ -327,7 +327,7 @@ PyDoc_STRVAR(_io__Buffered_seek__doc__, "\n"); #define _IO__BUFFERED_SEEK_METHODDEF \ - {"seek", (PyCFunction)(void(*)(void))_io__Buffered_seek, METH_FASTCALL, _io__Buffered_seek__doc__}, + {"seek", _PyCFunction_CAST(_io__Buffered_seek), METH_FASTCALL, _io__Buffered_seek__doc__}, static PyObject * _io__Buffered_seek_impl(buffered *self, PyObject *targetobj, int whence); @@ -363,7 +363,7 @@ PyDoc_STRVAR(_io__Buffered_truncate__doc__, "\n"); #define _IO__BUFFERED_TRUNCATE_METHODDEF \ - {"truncate", (PyCFunction)(void(*)(void))_io__Buffered_truncate, METH_FASTCALL, _io__Buffered_truncate__doc__}, + {"truncate", _PyCFunction_CAST(_io__Buffered_truncate), METH_FASTCALL, _io__Buffered_truncate__doc__}, static PyObject * _io__Buffered_truncate_impl(buffered *self, PyObject *pos); @@ -638,4 +638,4 @@ _io_BufferedRandom___init__(PyObject *self, PyObject *args, PyObject *kwargs) exit: return return_value; } -/*[clinic end generated code: output=79138a088729b5ee input=a9049054013a1b77]*/ +/*[clinic end generated code: output=820461c6b0e29e48 input=a9049054013a1b77]*/ diff --git a/Modules/_io/clinic/bytesio.c.h b/Modules/_io/clinic/bytesio.c.h index 5ea80ae01c14e..049d3473110f7 100644 --- a/Modules/_io/clinic/bytesio.c.h +++ b/Modules/_io/clinic/bytesio.c.h @@ -158,7 +158,7 @@ PyDoc_STRVAR(_io_BytesIO_read__doc__, "Return an empty bytes object at EOF."); #define _IO_BYTESIO_READ_METHODDEF \ - {"read", (PyCFunction)(void(*)(void))_io_BytesIO_read, METH_FASTCALL, _io_BytesIO_read__doc__}, + {"read", _PyCFunction_CAST(_io_BytesIO_read), METH_FASTCALL, _io_BytesIO_read__doc__}, static PyObject * _io_BytesIO_read_impl(bytesio *self, Py_ssize_t size); @@ -195,7 +195,7 @@ PyDoc_STRVAR(_io_BytesIO_read1__doc__, "Return an empty bytes object at EOF."); #define _IO_BYTESIO_READ1_METHODDEF \ - {"read1", (PyCFunction)(void(*)(void))_io_BytesIO_read1, METH_FASTCALL, _io_BytesIO_read1__doc__}, + {"read1", _PyCFunction_CAST(_io_BytesIO_read1), METH_FASTCALL, _io_BytesIO_read1__doc__}, static PyObject * _io_BytesIO_read1_impl(bytesio *self, Py_ssize_t size); @@ -233,7 +233,7 @@ PyDoc_STRVAR(_io_BytesIO_readline__doc__, "Return an empty bytes object at EOF."); #define _IO_BYTESIO_READLINE_METHODDEF \ - {"readline", (PyCFunction)(void(*)(void))_io_BytesIO_readline, METH_FASTCALL, _io_BytesIO_readline__doc__}, + {"readline", _PyCFunction_CAST(_io_BytesIO_readline), METH_FASTCALL, _io_BytesIO_readline__doc__}, static PyObject * _io_BytesIO_readline_impl(bytesio *self, Py_ssize_t size); @@ -271,7 +271,7 @@ PyDoc_STRVAR(_io_BytesIO_readlines__doc__, "total number of bytes in the lines returned."); #define _IO_BYTESIO_READLINES_METHODDEF \ - {"readlines", (PyCFunction)(void(*)(void))_io_BytesIO_readlines, METH_FASTCALL, _io_BytesIO_readlines__doc__}, + {"readlines", _PyCFunction_CAST(_io_BytesIO_readlines), METH_FASTCALL, _io_BytesIO_readlines__doc__}, static PyObject * _io_BytesIO_readlines_impl(bytesio *self, PyObject *arg); @@ -347,7 +347,7 @@ PyDoc_STRVAR(_io_BytesIO_truncate__doc__, "The current file position is unchanged. Returns the new size."); #define _IO_BYTESIO_TRUNCATE_METHODDEF \ - {"truncate", (PyCFunction)(void(*)(void))_io_BytesIO_truncate, METH_FASTCALL, _io_BytesIO_truncate__doc__}, + {"truncate", _PyCFunction_CAST(_io_BytesIO_truncate), METH_FASTCALL, _io_BytesIO_truncate__doc__}, static PyObject * _io_BytesIO_truncate_impl(bytesio *self, Py_ssize_t size); @@ -387,7 +387,7 @@ PyDoc_STRVAR(_io_BytesIO_seek__doc__, "Returns the new absolute position."); #define _IO_BYTESIO_SEEK_METHODDEF \ - {"seek", (PyCFunction)(void(*)(void))_io_BytesIO_seek, METH_FASTCALL, _io_BytesIO_seek__doc__}, + {"seek", _PyCFunction_CAST(_io_BytesIO_seek), METH_FASTCALL, _io_BytesIO_seek__doc__}, static PyObject * _io_BytesIO_seek_impl(bytesio *self, Py_ssize_t pos, int whence); @@ -505,4 +505,4 @@ _io_BytesIO___init__(PyObject *self, PyObject *args, PyObject *kwargs) exit: return return_value; } -/*[clinic end generated code: output=49a32140eb8c5555 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=93d9700a6cf395b8 input=a9049054013a1b77]*/ diff --git a/Modules/_io/clinic/fileio.c.h b/Modules/_io/clinic/fileio.c.h index 9b237c156d373..bb0b36c8502ab 100644 --- a/Modules/_io/clinic/fileio.c.h +++ b/Modules/_io/clinic/fileio.c.h @@ -245,7 +245,7 @@ PyDoc_STRVAR(_io_FileIO_read__doc__, "Return an empty bytes object at EOF."); #define _IO_FILEIO_READ_METHODDEF \ - {"read", (PyCFunction)(void(*)(void))_io_FileIO_read, METH_FASTCALL, _io_FileIO_read__doc__}, + {"read", _PyCFunction_CAST(_io_FileIO_read), METH_FASTCALL, _io_FileIO_read__doc__}, static PyObject * _io_FileIO_read_impl(fileio *self, Py_ssize_t size); @@ -327,7 +327,7 @@ PyDoc_STRVAR(_io_FileIO_seek__doc__, "Note that not all file objects are seekable."); #define _IO_FILEIO_SEEK_METHODDEF \ - {"seek", (PyCFunction)(void(*)(void))_io_FileIO_seek, METH_FASTCALL, _io_FileIO_seek__doc__}, + {"seek", _PyCFunction_CAST(_io_FileIO_seek), METH_FASTCALL, _io_FileIO_seek__doc__}, static PyObject * _io_FileIO_seek_impl(fileio *self, PyObject *pos, int whence); @@ -389,7 +389,7 @@ PyDoc_STRVAR(_io_FileIO_truncate__doc__, "The current file position is changed to the value of size."); #define _IO_FILEIO_TRUNCATE_METHODDEF \ - {"truncate", (PyCFunction)(void(*)(void))_io_FileIO_truncate, METH_FASTCALL, _io_FileIO_truncate__doc__}, + {"truncate", _PyCFunction_CAST(_io_FileIO_truncate), METH_FASTCALL, _io_FileIO_truncate__doc__}, static PyObject * _io_FileIO_truncate_impl(fileio *self, PyObject *posobj); @@ -437,4 +437,4 @@ _io_FileIO_isatty(fileio *self, PyObject *Py_UNUSED(ignored)) #ifndef _IO_FILEIO_TRUNCATE_METHODDEF #define _IO_FILEIO_TRUNCATE_METHODDEF #endif /* !defined(_IO_FILEIO_TRUNCATE_METHODDEF) */ -/*[clinic end generated code: output=3479912ec0f7e029 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=fdcf0f9277d44415 input=a9049054013a1b77]*/ diff --git a/Modules/_io/clinic/iobase.c.h b/Modules/_io/clinic/iobase.c.h index 4fd6e18c4efd2..ed3fdc9bb122d 100644 --- a/Modules/_io/clinic/iobase.c.h +++ b/Modules/_io/clinic/iobase.c.h @@ -174,7 +174,7 @@ PyDoc_STRVAR(_io__IOBase_readline__doc__, "terminator(s) recognized."); #define _IO__IOBASE_READLINE_METHODDEF \ - {"readline", (PyCFunction)(void(*)(void))_io__IOBase_readline, METH_FASTCALL, _io__IOBase_readline__doc__}, + {"readline", _PyCFunction_CAST(_io__IOBase_readline), METH_FASTCALL, _io__IOBase_readline__doc__}, static PyObject * _io__IOBase_readline_impl(PyObject *self, Py_ssize_t limit); @@ -212,7 +212,7 @@ PyDoc_STRVAR(_io__IOBase_readlines__doc__, "lines so far exceeds hint."); #define _IO__IOBASE_READLINES_METHODDEF \ - {"readlines", (PyCFunction)(void(*)(void))_io__IOBase_readlines, METH_FASTCALL, _io__IOBase_readlines__doc__}, + {"readlines", _PyCFunction_CAST(_io__IOBase_readlines), METH_FASTCALL, _io__IOBase_readlines__doc__}, static PyObject * _io__IOBase_readlines_impl(PyObject *self, Py_ssize_t hint); @@ -257,7 +257,7 @@ PyDoc_STRVAR(_io__RawIOBase_read__doc__, "\n"); #define _IO__RAWIOBASE_READ_METHODDEF \ - {"read", (PyCFunction)(void(*)(void))_io__RawIOBase_read, METH_FASTCALL, _io__RawIOBase_read__doc__}, + {"read", _PyCFunction_CAST(_io__RawIOBase_read), METH_FASTCALL, _io__RawIOBase_read__doc__}, static PyObject * _io__RawIOBase_read_impl(PyObject *self, Py_ssize_t n); @@ -310,4 +310,4 @@ _io__RawIOBase_readall(PyObject *self, PyObject *Py_UNUSED(ignored)) { return _io__RawIOBase_readall_impl(self); } -/*[clinic end generated code: output=83c1361a7a51ca84 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=0362e134da2d8641 input=a9049054013a1b77]*/ diff --git a/Modules/_io/clinic/stringio.c.h b/Modules/_io/clinic/stringio.c.h index 147ef668a0b09..6758ee05f9104 100644 --- a/Modules/_io/clinic/stringio.c.h +++ b/Modules/_io/clinic/stringio.c.h @@ -48,7 +48,7 @@ PyDoc_STRVAR(_io_StringIO_read__doc__, "is reached. Return an empty string at EOF."); #define _IO_STRINGIO_READ_METHODDEF \ - {"read", (PyCFunction)(void(*)(void))_io_StringIO_read, METH_FASTCALL, _io_StringIO_read__doc__}, + {"read", _PyCFunction_CAST(_io_StringIO_read), METH_FASTCALL, _io_StringIO_read__doc__}, static PyObject * _io_StringIO_read_impl(stringio *self, Py_ssize_t size); @@ -84,7 +84,7 @@ PyDoc_STRVAR(_io_StringIO_readline__doc__, "Returns an empty string if EOF is hit immediately."); #define _IO_STRINGIO_READLINE_METHODDEF \ - {"readline", (PyCFunction)(void(*)(void))_io_StringIO_readline, METH_FASTCALL, _io_StringIO_readline__doc__}, + {"readline", _PyCFunction_CAST(_io_StringIO_readline), METH_FASTCALL, _io_StringIO_readline__doc__}, static PyObject * _io_StringIO_readline_impl(stringio *self, Py_ssize_t size); @@ -122,7 +122,7 @@ PyDoc_STRVAR(_io_StringIO_truncate__doc__, "Returns the new absolute position."); #define _IO_STRINGIO_TRUNCATE_METHODDEF \ - {"truncate", (PyCFunction)(void(*)(void))_io_StringIO_truncate, METH_FASTCALL, _io_StringIO_truncate__doc__}, + {"truncate", _PyCFunction_CAST(_io_StringIO_truncate), METH_FASTCALL, _io_StringIO_truncate__doc__}, static PyObject * _io_StringIO_truncate_impl(stringio *self, Py_ssize_t size); @@ -162,7 +162,7 @@ PyDoc_STRVAR(_io_StringIO_seek__doc__, "Returns the new absolute position."); #define _IO_STRINGIO_SEEK_METHODDEF \ - {"seek", (PyCFunction)(void(*)(void))_io_StringIO_seek, METH_FASTCALL, _io_StringIO_seek__doc__}, + {"seek", _PyCFunction_CAST(_io_StringIO_seek), METH_FASTCALL, _io_StringIO_seek__doc__}, static PyObject * _io_StringIO_seek_impl(stringio *self, Py_ssize_t pos, int whence); @@ -338,4 +338,4 @@ _io_StringIO_seekable(stringio *self, PyObject *Py_UNUSED(ignored)) { return _io_StringIO_seekable_impl(self); } -/*[clinic end generated code: output=eea93dcab10d0a97 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=3207dc548c305ad8 input=a9049054013a1b77]*/ diff --git a/Modules/_io/clinic/textio.c.h b/Modules/_io/clinic/textio.c.h index 7e81eb370fab4..907785b2beaf9 100644 --- a/Modules/_io/clinic/textio.c.h +++ b/Modules/_io/clinic/textio.c.h @@ -60,7 +60,7 @@ PyDoc_STRVAR(_io_IncrementalNewlineDecoder_decode__doc__, "\n"); #define _IO_INCREMENTALNEWLINEDECODER_DECODE_METHODDEF \ - {"decode", (PyCFunction)(void(*)(void))_io_IncrementalNewlineDecoder_decode, METH_FASTCALL|METH_KEYWORDS, _io_IncrementalNewlineDecoder_decode__doc__}, + {"decode", _PyCFunction_CAST(_io_IncrementalNewlineDecoder_decode), METH_FASTCALL|METH_KEYWORDS, _io_IncrementalNewlineDecoder_decode__doc__}, static PyObject * _io_IncrementalNewlineDecoder_decode_impl(nldecoder_object *self, @@ -285,7 +285,7 @@ PyDoc_STRVAR(_io_TextIOWrapper_reconfigure__doc__, "This also does an implicit stream flush."); #define _IO_TEXTIOWRAPPER_RECONFIGURE_METHODDEF \ - {"reconfigure", (PyCFunction)(void(*)(void))_io_TextIOWrapper_reconfigure, METH_FASTCALL|METH_KEYWORDS, _io_TextIOWrapper_reconfigure__doc__}, + {"reconfigure", _PyCFunction_CAST(_io_TextIOWrapper_reconfigure), METH_FASTCALL|METH_KEYWORDS, _io_TextIOWrapper_reconfigure__doc__}, static PyObject * _io_TextIOWrapper_reconfigure_impl(textio *self, PyObject *encoding, @@ -400,7 +400,7 @@ PyDoc_STRVAR(_io_TextIOWrapper_read__doc__, "\n"); #define _IO_TEXTIOWRAPPER_READ_METHODDEF \ - {"read", (PyCFunction)(void(*)(void))_io_TextIOWrapper_read, METH_FASTCALL, _io_TextIOWrapper_read__doc__}, + {"read", _PyCFunction_CAST(_io_TextIOWrapper_read), METH_FASTCALL, _io_TextIOWrapper_read__doc__}, static PyObject * _io_TextIOWrapper_read_impl(textio *self, Py_ssize_t n); @@ -433,7 +433,7 @@ PyDoc_STRVAR(_io_TextIOWrapper_readline__doc__, "\n"); #define _IO_TEXTIOWRAPPER_READLINE_METHODDEF \ - {"readline", (PyCFunction)(void(*)(void))_io_TextIOWrapper_readline, METH_FASTCALL, _io_TextIOWrapper_readline__doc__}, + {"readline", _PyCFunction_CAST(_io_TextIOWrapper_readline), METH_FASTCALL, _io_TextIOWrapper_readline__doc__}, static PyObject * _io_TextIOWrapper_readline_impl(textio *self, Py_ssize_t size); @@ -475,7 +475,7 @@ PyDoc_STRVAR(_io_TextIOWrapper_seek__doc__, "\n"); #define _IO_TEXTIOWRAPPER_SEEK_METHODDEF \ - {"seek", (PyCFunction)(void(*)(void))_io_TextIOWrapper_seek, METH_FASTCALL, _io_TextIOWrapper_seek__doc__}, + {"seek", _PyCFunction_CAST(_io_TextIOWrapper_seek), METH_FASTCALL, _io_TextIOWrapper_seek__doc__}, static PyObject * _io_TextIOWrapper_seek_impl(textio *self, PyObject *cookieObj, int whence); @@ -528,7 +528,7 @@ PyDoc_STRVAR(_io_TextIOWrapper_truncate__doc__, "\n"); #define _IO_TEXTIOWRAPPER_TRUNCATE_METHODDEF \ - {"truncate", (PyCFunction)(void(*)(void))_io_TextIOWrapper_truncate, METH_FASTCALL, _io_TextIOWrapper_truncate__doc__}, + {"truncate", _PyCFunction_CAST(_io_TextIOWrapper_truncate), METH_FASTCALL, _io_TextIOWrapper_truncate__doc__}, static PyObject * _io_TextIOWrapper_truncate_impl(textio *self, PyObject *pos); @@ -671,4 +671,4 @@ _io_TextIOWrapper_close(textio *self, PyObject *Py_UNUSED(ignored)) { return _io_TextIOWrapper_close_impl(self); } -/*[clinic end generated code: output=e88abad34e31c0cb input=a9049054013a1b77]*/ +/*[clinic end generated code: output=bb78b568b24759d6 input=a9049054013a1b77]*/ diff --git a/Modules/_io/clinic/winconsoleio.c.h b/Modules/_io/clinic/winconsoleio.c.h index 84e73dcaf70d4..75102a3d37156 100644 --- a/Modules/_io/clinic/winconsoleio.c.h +++ b/Modules/_io/clinic/winconsoleio.c.h @@ -249,7 +249,7 @@ PyDoc_STRVAR(_io__WindowsConsoleIO_read__doc__, "Return an empty bytes object at EOF."); #define _IO__WINDOWSCONSOLEIO_READ_METHODDEF \ - {"read", (PyCFunction)(void(*)(void))_io__WindowsConsoleIO_read, METH_FASTCALL, _io__WindowsConsoleIO_read__doc__}, + {"read", _PyCFunction_CAST(_io__WindowsConsoleIO_read), METH_FASTCALL, _io__WindowsConsoleIO_read__doc__}, static PyObject * _io__WindowsConsoleIO_read_impl(winconsoleio *self, Py_ssize_t size); @@ -378,4 +378,4 @@ _io__WindowsConsoleIO_isatty(winconsoleio *self, PyObject *Py_UNUSED(ignored)) #ifndef _IO__WINDOWSCONSOLEIO_ISATTY_METHODDEF #define _IO__WINDOWSCONSOLEIO_ISATTY_METHODDEF #endif /* !defined(_IO__WINDOWSCONSOLEIO_ISATTY_METHODDEF) */ -/*[clinic end generated code: output=48080572ffee22f5 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=2d8648fab31ec60e input=a9049054013a1b77]*/ diff --git a/Modules/_multiprocessing/clinic/multiprocessing.c.h b/Modules/_multiprocessing/clinic/multiprocessing.c.h index 7096442bd0b52..e9953215aca7d 100644 --- a/Modules/_multiprocessing/clinic/multiprocessing.c.h +++ b/Modules/_multiprocessing/clinic/multiprocessing.c.h @@ -40,7 +40,7 @@ PyDoc_STRVAR(_multiprocessing_recv__doc__, "\n"); #define _MULTIPROCESSING_RECV_METHODDEF \ - {"recv", (PyCFunction)(void(*)(void))_multiprocessing_recv, METH_FASTCALL, _multiprocessing_recv__doc__}, + {"recv", _PyCFunction_CAST(_multiprocessing_recv), METH_FASTCALL, _multiprocessing_recv__doc__}, static PyObject * _multiprocessing_recv_impl(PyObject *module, HANDLE handle, int size); @@ -72,7 +72,7 @@ PyDoc_STRVAR(_multiprocessing_send__doc__, "\n"); #define _MULTIPROCESSING_SEND_METHODDEF \ - {"send", (PyCFunction)(void(*)(void))_multiprocessing_send, METH_FASTCALL, _multiprocessing_send__doc__}, + {"send", _PyCFunction_CAST(_multiprocessing_send), METH_FASTCALL, _multiprocessing_send__doc__}, static PyObject * _multiprocessing_send_impl(PyObject *module, HANDLE handle, Py_buffer *buf); @@ -148,4 +148,4 @@ _multiprocessing_sem_unlink(PyObject *module, PyObject *arg) #ifndef _MULTIPROCESSING_SEND_METHODDEF #define _MULTIPROCESSING_SEND_METHODDEF #endif /* !defined(_MULTIPROCESSING_SEND_METHODDEF) */ -/*[clinic end generated code: output=418191c446cd5751 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=d3bbf69de578db7b input=a9049054013a1b77]*/ diff --git a/Modules/_multiprocessing/clinic/posixshmem.c.h b/Modules/_multiprocessing/clinic/posixshmem.c.h index 3424b10a569f8..be21f836b955a 100644 --- a/Modules/_multiprocessing/clinic/posixshmem.c.h +++ b/Modules/_multiprocessing/clinic/posixshmem.c.h @@ -11,7 +11,7 @@ PyDoc_STRVAR(_posixshmem_shm_open__doc__, "Open a shared memory object. Returns a file descriptor (integer)."); #define _POSIXSHMEM_SHM_OPEN_METHODDEF \ - {"shm_open", (PyCFunction)(void(*)(void))_posixshmem_shm_open, METH_FASTCALL|METH_KEYWORDS, _posixshmem_shm_open__doc__}, + {"shm_open", _PyCFunction_CAST(_posixshmem_shm_open), METH_FASTCALL|METH_KEYWORDS, _posixshmem_shm_open__doc__}, static int _posixshmem_shm_open_impl(PyObject *module, PyObject *path, int flags, @@ -79,7 +79,7 @@ PyDoc_STRVAR(_posixshmem_shm_unlink__doc__, "region."); #define _POSIXSHMEM_SHM_UNLINK_METHODDEF \ - {"shm_unlink", (PyCFunction)(void(*)(void))_posixshmem_shm_unlink, METH_FASTCALL|METH_KEYWORDS, _posixshmem_shm_unlink__doc__}, + {"shm_unlink", _PyCFunction_CAST(_posixshmem_shm_unlink), METH_FASTCALL|METH_KEYWORDS, _posixshmem_shm_unlink__doc__}, static PyObject * _posixshmem_shm_unlink_impl(PyObject *module, PyObject *path); @@ -120,4 +120,4 @@ _posixshmem_shm_unlink(PyObject *module, PyObject *const *args, Py_ssize_t nargs #ifndef _POSIXSHMEM_SHM_UNLINK_METHODDEF #define _POSIXSHMEM_SHM_UNLINK_METHODDEF #endif /* !defined(_POSIXSHMEM_SHM_UNLINK_METHODDEF) */ -/*[clinic end generated code: output=bca8e78d0f43ef1a input=a9049054013a1b77]*/ +/*[clinic end generated code: output=a6db931a47d36e1b input=a9049054013a1b77]*/ diff --git a/Modules/_multiprocessing/clinic/semaphore.c.h b/Modules/_multiprocessing/clinic/semaphore.c.h index 018447ad137ba..adb47476c0187 100644 --- a/Modules/_multiprocessing/clinic/semaphore.c.h +++ b/Modules/_multiprocessing/clinic/semaphore.c.h @@ -11,7 +11,7 @@ PyDoc_STRVAR(_multiprocessing_SemLock_acquire__doc__, "Acquire the semaphore/lock."); #define _MULTIPROCESSING_SEMLOCK_ACQUIRE_METHODDEF \ - {"acquire", (PyCFunction)(void(*)(void))_multiprocessing_SemLock_acquire, METH_FASTCALL|METH_KEYWORDS, _multiprocessing_SemLock_acquire__doc__}, + {"acquire", _PyCFunction_CAST(_multiprocessing_SemLock_acquire), METH_FASTCALL|METH_KEYWORDS, _multiprocessing_SemLock_acquire__doc__}, static PyObject * _multiprocessing_SemLock_acquire_impl(SemLockObject *self, int blocking, @@ -85,7 +85,7 @@ PyDoc_STRVAR(_multiprocessing_SemLock_acquire__doc__, "Acquire the semaphore/lock."); #define _MULTIPROCESSING_SEMLOCK_ACQUIRE_METHODDEF \ - {"acquire", (PyCFunction)(void(*)(void))_multiprocessing_SemLock_acquire, METH_FASTCALL|METH_KEYWORDS, _multiprocessing_SemLock_acquire__doc__}, + {"acquire", _PyCFunction_CAST(_multiprocessing_SemLock_acquire), METH_FASTCALL|METH_KEYWORDS, _multiprocessing_SemLock_acquire__doc__}, static PyObject * _multiprocessing_SemLock_acquire_impl(SemLockObject *self, int blocking, @@ -220,7 +220,7 @@ PyDoc_STRVAR(_multiprocessing_SemLock__rebuild__doc__, "\n"); #define _MULTIPROCESSING_SEMLOCK__REBUILD_METHODDEF \ - {"_rebuild", (PyCFunction)(void(*)(void))_multiprocessing_SemLock__rebuild, METH_FASTCALL|METH_CLASS, _multiprocessing_SemLock__rebuild__doc__}, + {"_rebuild", _PyCFunction_CAST(_multiprocessing_SemLock__rebuild), METH_FASTCALL|METH_CLASS, _multiprocessing_SemLock__rebuild__doc__}, static PyObject * _multiprocessing_SemLock__rebuild_impl(PyTypeObject *type, SEM_HANDLE handle, @@ -389,7 +389,7 @@ PyDoc_STRVAR(_multiprocessing_SemLock___exit____doc__, "Exit the semaphore/lock."); #define _MULTIPROCESSING_SEMLOCK___EXIT___METHODDEF \ - {"__exit__", (PyCFunction)(void(*)(void))_multiprocessing_SemLock___exit__, METH_FASTCALL, _multiprocessing_SemLock___exit____doc__}, + {"__exit__", _PyCFunction_CAST(_multiprocessing_SemLock___exit__), METH_FASTCALL, _multiprocessing_SemLock___exit____doc__}, static PyObject * _multiprocessing_SemLock___exit___impl(SemLockObject *self, @@ -467,4 +467,4 @@ _multiprocessing_SemLock___exit__(SemLockObject *self, PyObject *const *args, Py #ifndef _MULTIPROCESSING_SEMLOCK___EXIT___METHODDEF #define _MULTIPROCESSING_SEMLOCK___EXIT___METHODDEF #endif /* !defined(_MULTIPROCESSING_SEMLOCK___EXIT___METHODDEF) */ -/*[clinic end generated code: output=fde05a081b5bdba4 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=64ba32544811c9e6 input=a9049054013a1b77]*/ diff --git a/Modules/_sqlite/clinic/blob.c.h b/Modules/_sqlite/clinic/blob.c.h index 237877a9b37f1..b467c99e2eb5f 100644 --- a/Modules/_sqlite/clinic/blob.c.h +++ b/Modules/_sqlite/clinic/blob.c.h @@ -34,7 +34,7 @@ PyDoc_STRVAR(blob_read__doc__, "end of the blob."); #define BLOB_READ_METHODDEF \ - {"read", (PyCFunction)(void(*)(void))blob_read, METH_FASTCALL, blob_read__doc__}, + {"read", _PyCFunction_CAST(blob_read), METH_FASTCALL, blob_read__doc__}, static PyObject * blob_read_impl(pysqlite_Blob *self, int length); @@ -112,7 +112,7 @@ PyDoc_STRVAR(blob_seek__doc__, "and os.SEEK_END (seek relative to the blob\'s end)."); #define BLOB_SEEK_METHODDEF \ - {"seek", (PyCFunction)(void(*)(void))blob_seek, METH_FASTCALL, blob_seek__doc__}, + {"seek", _PyCFunction_CAST(blob_seek), METH_FASTCALL, blob_seek__doc__}, static PyObject * blob_seek_impl(pysqlite_Blob *self, int offset, int origin); @@ -188,7 +188,7 @@ PyDoc_STRVAR(blob_exit__doc__, "Blob context manager exit."); #define BLOB_EXIT_METHODDEF \ - {"__exit__", (PyCFunction)(void(*)(void))blob_exit, METH_FASTCALL, blob_exit__doc__}, + {"__exit__", _PyCFunction_CAST(blob_exit), METH_FASTCALL, blob_exit__doc__}, static PyObject * blob_exit_impl(pysqlite_Blob *self, PyObject *type, PyObject *val, @@ -213,4 +213,4 @@ blob_exit(pysqlite_Blob *self, PyObject *const *args, Py_ssize_t nargs) exit: return return_value; } -/*[clinic end generated code: output=ca2400862c18dadb input=a9049054013a1b77]*/ +/*[clinic end generated code: output=382cbf0977bb158a input=a9049054013a1b77]*/ diff --git a/Modules/_sqlite/clinic/connection.c.h b/Modules/_sqlite/clinic/connection.c.h index b012c4d4bbfa3..1e27c5e0afb12 100644 --- a/Modules/_sqlite/clinic/connection.c.h +++ b/Modules/_sqlite/clinic/connection.c.h @@ -115,7 +115,7 @@ PyDoc_STRVAR(pysqlite_connection_cursor__doc__, "Return a cursor for the connection."); #define PYSQLITE_CONNECTION_CURSOR_METHODDEF \ - {"cursor", (PyCFunction)(void(*)(void))pysqlite_connection_cursor, METH_FASTCALL|METH_KEYWORDS, pysqlite_connection_cursor__doc__}, + {"cursor", _PyCFunction_CAST(pysqlite_connection_cursor), METH_FASTCALL|METH_KEYWORDS, pysqlite_connection_cursor__doc__}, static PyObject * pysqlite_connection_cursor_impl(pysqlite_Connection *self, PyObject *factory); @@ -163,7 +163,7 @@ PyDoc_STRVAR(blobopen__doc__, " Database name."); #define BLOBOPEN_METHODDEF \ - {"blobopen", (PyCFunction)(void(*)(void))blobopen, METH_FASTCALL|METH_KEYWORDS, blobopen__doc__}, + {"blobopen", _PyCFunction_CAST(blobopen), METH_FASTCALL|METH_KEYWORDS, blobopen__doc__}, static PyObject * blobopen_impl(pysqlite_Connection *self, const char *table, const char *col, @@ -310,7 +310,7 @@ PyDoc_STRVAR(pysqlite_connection_create_function__doc__, "Creates a new function."); #define PYSQLITE_CONNECTION_CREATE_FUNCTION_METHODDEF \ - {"create_function", (PyCFunction)(void(*)(void))pysqlite_connection_create_function, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, pysqlite_connection_create_function__doc__}, + {"create_function", _PyCFunction_CAST(pysqlite_connection_create_function), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, pysqlite_connection_create_function__doc__}, static PyObject * pysqlite_connection_create_function_impl(pysqlite_Connection *self, @@ -385,7 +385,7 @@ PyDoc_STRVAR(create_window_function__doc__, " Set to None to clear the window function."); #define CREATE_WINDOW_FUNCTION_METHODDEF \ - {"create_window_function", (PyCFunction)(void(*)(void))create_window_function, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, create_window_function__doc__}, + {"create_window_function", _PyCFunction_CAST(create_window_function), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, create_window_function__doc__}, static PyObject * create_window_function_impl(pysqlite_Connection *self, PyTypeObject *cls, @@ -440,7 +440,7 @@ PyDoc_STRVAR(pysqlite_connection_create_aggregate__doc__, "Creates a new aggregate."); #define PYSQLITE_CONNECTION_CREATE_AGGREGATE_METHODDEF \ - {"create_aggregate", (PyCFunction)(void(*)(void))pysqlite_connection_create_aggregate, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, pysqlite_connection_create_aggregate__doc__}, + {"create_aggregate", _PyCFunction_CAST(pysqlite_connection_create_aggregate), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, pysqlite_connection_create_aggregate__doc__}, static PyObject * pysqlite_connection_create_aggregate_impl(pysqlite_Connection *self, @@ -494,7 +494,7 @@ PyDoc_STRVAR(pysqlite_connection_set_authorizer__doc__, "Sets authorizer callback."); #define PYSQLITE_CONNECTION_SET_AUTHORIZER_METHODDEF \ - {"set_authorizer", (PyCFunction)(void(*)(void))pysqlite_connection_set_authorizer, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, pysqlite_connection_set_authorizer__doc__}, + {"set_authorizer", _PyCFunction_CAST(pysqlite_connection_set_authorizer), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, pysqlite_connection_set_authorizer__doc__}, static PyObject * pysqlite_connection_set_authorizer_impl(pysqlite_Connection *self, @@ -528,7 +528,7 @@ PyDoc_STRVAR(pysqlite_connection_set_progress_handler__doc__, "Sets progress handler callback."); #define PYSQLITE_CONNECTION_SET_PROGRESS_HANDLER_METHODDEF \ - {"set_progress_handler", (PyCFunction)(void(*)(void))pysqlite_connection_set_progress_handler, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, pysqlite_connection_set_progress_handler__doc__}, + {"set_progress_handler", _PyCFunction_CAST(pysqlite_connection_set_progress_handler), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, pysqlite_connection_set_progress_handler__doc__}, static PyObject * pysqlite_connection_set_progress_handler_impl(pysqlite_Connection *self, @@ -567,7 +567,7 @@ PyDoc_STRVAR(pysqlite_connection_set_trace_callback__doc__, "Sets a trace callback called for each SQL statement (passed as unicode)."); #define PYSQLITE_CONNECTION_SET_TRACE_CALLBACK_METHODDEF \ - {"set_trace_callback", (PyCFunction)(void(*)(void))pysqlite_connection_set_trace_callback, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, pysqlite_connection_set_trace_callback__doc__}, + {"set_trace_callback", _PyCFunction_CAST(pysqlite_connection_set_trace_callback), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, pysqlite_connection_set_trace_callback__doc__}, static PyObject * pysqlite_connection_set_trace_callback_impl(pysqlite_Connection *self, @@ -676,7 +676,7 @@ PyDoc_STRVAR(pysqlite_connection_execute__doc__, "Executes an SQL statement."); #define PYSQLITE_CONNECTION_EXECUTE_METHODDEF \ - {"execute", (PyCFunction)(void(*)(void))pysqlite_connection_execute, METH_FASTCALL, pysqlite_connection_execute__doc__}, + {"execute", _PyCFunction_CAST(pysqlite_connection_execute), METH_FASTCALL, pysqlite_connection_execute__doc__}, static PyObject * pysqlite_connection_execute_impl(pysqlite_Connection *self, PyObject *sql, @@ -718,7 +718,7 @@ PyDoc_STRVAR(pysqlite_connection_executemany__doc__, "Repeatedly executes an SQL statement."); #define PYSQLITE_CONNECTION_EXECUTEMANY_METHODDEF \ - {"executemany", (PyCFunction)(void(*)(void))pysqlite_connection_executemany, METH_FASTCALL, pysqlite_connection_executemany__doc__}, + {"executemany", _PyCFunction_CAST(pysqlite_connection_executemany), METH_FASTCALL, pysqlite_connection_executemany__doc__}, static PyObject * pysqlite_connection_executemany_impl(pysqlite_Connection *self, @@ -802,7 +802,7 @@ PyDoc_STRVAR(pysqlite_connection_backup__doc__, "Makes a backup of the database."); #define PYSQLITE_CONNECTION_BACKUP_METHODDEF \ - {"backup", (PyCFunction)(void(*)(void))pysqlite_connection_backup, METH_FASTCALL|METH_KEYWORDS, pysqlite_connection_backup__doc__}, + {"backup", _PyCFunction_CAST(pysqlite_connection_backup), METH_FASTCALL|METH_KEYWORDS, pysqlite_connection_backup__doc__}, static PyObject * pysqlite_connection_backup_impl(pysqlite_Connection *self, @@ -893,7 +893,7 @@ PyDoc_STRVAR(pysqlite_connection_create_collation__doc__, "Creates a collation function."); #define PYSQLITE_CONNECTION_CREATE_COLLATION_METHODDEF \ - {"create_collation", (PyCFunction)(void(*)(void))pysqlite_connection_create_collation, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, pysqlite_connection_create_collation__doc__}, + {"create_collation", _PyCFunction_CAST(pysqlite_connection_create_collation), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, pysqlite_connection_create_collation__doc__}, static PyObject * pysqlite_connection_create_collation_impl(pysqlite_Connection *self, @@ -952,7 +952,7 @@ PyDoc_STRVAR(serialize__doc__, "were backed up to disk."); #define SERIALIZE_METHODDEF \ - {"serialize", (PyCFunction)(void(*)(void))serialize, METH_FASTCALL|METH_KEYWORDS, serialize__doc__}, + {"serialize", _PyCFunction_CAST(serialize), METH_FASTCALL|METH_KEYWORDS, serialize__doc__}, static PyObject * serialize_impl(pysqlite_Connection *self, const char *name); @@ -1017,7 +1017,7 @@ PyDoc_STRVAR(deserialize__doc__, "currently in a read transaction or is involved in a backup operation."); #define DESERIALIZE_METHODDEF \ - {"deserialize", (PyCFunction)(void(*)(void))deserialize, METH_FASTCALL|METH_KEYWORDS, deserialize__doc__}, + {"deserialize", _PyCFunction_CAST(deserialize), METH_FASTCALL|METH_KEYWORDS, deserialize__doc__}, static PyObject * deserialize_impl(pysqlite_Connection *self, Py_buffer *data, @@ -1114,7 +1114,7 @@ PyDoc_STRVAR(pysqlite_connection_exit__doc__, "If there was any exception, a rollback takes place; otherwise we commit."); #define PYSQLITE_CONNECTION_EXIT_METHODDEF \ - {"__exit__", (PyCFunction)(void(*)(void))pysqlite_connection_exit, METH_FASTCALL, pysqlite_connection_exit__doc__}, + {"__exit__", _PyCFunction_CAST(pysqlite_connection_exit), METH_FASTCALL, pysqlite_connection_exit__doc__}, static PyObject * pysqlite_connection_exit_impl(pysqlite_Connection *self, PyObject *exc_type, @@ -1157,7 +1157,7 @@ PyDoc_STRVAR(setlimit__doc__, "the prior value of the limit is returned."); #define SETLIMIT_METHODDEF \ - {"setlimit", (PyCFunction)(void(*)(void))setlimit, METH_FASTCALL, setlimit__doc__}, + {"setlimit", _PyCFunction_CAST(setlimit), METH_FASTCALL, setlimit__doc__}, static PyObject * setlimit_impl(pysqlite_Connection *self, int category, int limit); @@ -1236,4 +1236,4 @@ getlimit(pysqlite_Connection *self, PyObject *arg) #ifndef DESERIALIZE_METHODDEF #define DESERIALIZE_METHODDEF #endif /* !defined(DESERIALIZE_METHODDEF) */ -/*[clinic end generated code: output=6c9432a9fe0a4f5e input=a9049054013a1b77]*/ +/*[clinic end generated code: output=d21767843c480a10 input=a9049054013a1b77]*/ diff --git a/Modules/_sqlite/clinic/cursor.c.h b/Modules/_sqlite/clinic/cursor.c.h index 561d17f45b8e7..b29c333074888 100644 --- a/Modules/_sqlite/clinic/cursor.c.h +++ b/Modules/_sqlite/clinic/cursor.c.h @@ -38,7 +38,7 @@ PyDoc_STRVAR(pysqlite_cursor_execute__doc__, "Executes an SQL statement."); #define PYSQLITE_CURSOR_EXECUTE_METHODDEF \ - {"execute", (PyCFunction)(void(*)(void))pysqlite_cursor_execute, METH_FASTCALL, pysqlite_cursor_execute__doc__}, + {"execute", _PyCFunction_CAST(pysqlite_cursor_execute), METH_FASTCALL, pysqlite_cursor_execute__doc__}, static PyObject * pysqlite_cursor_execute_impl(pysqlite_Cursor *self, PyObject *sql, @@ -80,7 +80,7 @@ PyDoc_STRVAR(pysqlite_cursor_executemany__doc__, "Repeatedly executes an SQL statement."); #define PYSQLITE_CURSOR_EXECUTEMANY_METHODDEF \ - {"executemany", (PyCFunction)(void(*)(void))pysqlite_cursor_executemany, METH_FASTCALL, pysqlite_cursor_executemany__doc__}, + {"executemany", _PyCFunction_CAST(pysqlite_cursor_executemany), METH_FASTCALL, pysqlite_cursor_executemany__doc__}, static PyObject * pysqlite_cursor_executemany_impl(pysqlite_Cursor *self, PyObject *sql, @@ -177,7 +177,7 @@ PyDoc_STRVAR(pysqlite_cursor_fetchmany__doc__, " The default value is set by the Cursor.arraysize attribute."); #define PYSQLITE_CURSOR_FETCHMANY_METHODDEF \ - {"fetchmany", (PyCFunction)(void(*)(void))pysqlite_cursor_fetchmany, METH_FASTCALL|METH_KEYWORDS, pysqlite_cursor_fetchmany__doc__}, + {"fetchmany", _PyCFunction_CAST(pysqlite_cursor_fetchmany), METH_FASTCALL|METH_KEYWORDS, pysqlite_cursor_fetchmany__doc__}, static PyObject * pysqlite_cursor_fetchmany_impl(pysqlite_Cursor *self, int maxrows); @@ -244,7 +244,7 @@ PyDoc_STRVAR(pysqlite_cursor_setoutputsize__doc__, "Required by DB-API. Does nothing in sqlite3."); #define PYSQLITE_CURSOR_SETOUTPUTSIZE_METHODDEF \ - {"setoutputsize", (PyCFunction)(void(*)(void))pysqlite_cursor_setoutputsize, METH_FASTCALL, pysqlite_cursor_setoutputsize__doc__}, + {"setoutputsize", _PyCFunction_CAST(pysqlite_cursor_setoutputsize), METH_FASTCALL, pysqlite_cursor_setoutputsize__doc__}, static PyObject * pysqlite_cursor_setoutputsize_impl(pysqlite_Cursor *self, PyObject *size, @@ -289,4 +289,4 @@ pysqlite_cursor_close(pysqlite_Cursor *self, PyObject *Py_UNUSED(ignored)) { return pysqlite_cursor_close_impl(self); } -/*[clinic end generated code: output=bde165664155b2bf input=a9049054013a1b77]*/ +/*[clinic end generated code: output=2b9c6a3ca8a8caff input=a9049054013a1b77]*/ diff --git a/Modules/_sqlite/clinic/module.c.h b/Modules/_sqlite/clinic/module.c.h index f3e0e054a3d2f..8f7008adef2b1 100644 --- a/Modules/_sqlite/clinic/module.c.h +++ b/Modules/_sqlite/clinic/module.c.h @@ -14,7 +14,7 @@ PyDoc_STRVAR(pysqlite_connect__doc__, "in RAM instead of on disk."); #define PYSQLITE_CONNECT_METHODDEF \ - {"connect", (PyCFunction)(void(*)(void))pysqlite_connect, METH_FASTCALL|METH_KEYWORDS, pysqlite_connect__doc__}, + {"connect", _PyCFunction_CAST(pysqlite_connect), METH_FASTCALL|METH_KEYWORDS, pysqlite_connect__doc__}, static PyObject * pysqlite_connect_impl(PyObject *module, PyObject *database, double timeout, @@ -121,7 +121,7 @@ PyDoc_STRVAR(pysqlite_complete_statement__doc__, "Checks if a string contains a complete SQL statement."); #define PYSQLITE_COMPLETE_STATEMENT_METHODDEF \ - {"complete_statement", (PyCFunction)(void(*)(void))pysqlite_complete_statement, METH_FASTCALL|METH_KEYWORDS, pysqlite_complete_statement__doc__}, + {"complete_statement", _PyCFunction_CAST(pysqlite_complete_statement), METH_FASTCALL|METH_KEYWORDS, pysqlite_complete_statement__doc__}, static PyObject * pysqlite_complete_statement_impl(PyObject *module, const char *statement); @@ -170,7 +170,7 @@ PyDoc_STRVAR(pysqlite_enable_shared_cache__doc__, "the cache=shared query parameter."); #define PYSQLITE_ENABLE_SHARED_CACHE_METHODDEF \ - {"enable_shared_cache", (PyCFunction)(void(*)(void))pysqlite_enable_shared_cache, METH_FASTCALL|METH_KEYWORDS, pysqlite_enable_shared_cache__doc__}, + {"enable_shared_cache", _PyCFunction_CAST(pysqlite_enable_shared_cache), METH_FASTCALL|METH_KEYWORDS, pysqlite_enable_shared_cache__doc__}, static PyObject * pysqlite_enable_shared_cache_impl(PyObject *module, int do_enable); @@ -205,7 +205,7 @@ PyDoc_STRVAR(pysqlite_register_adapter__doc__, "Registers an adapter with sqlite3\'s adapter registry."); #define PYSQLITE_REGISTER_ADAPTER_METHODDEF \ - {"register_adapter", (PyCFunction)(void(*)(void))pysqlite_register_adapter, METH_FASTCALL, pysqlite_register_adapter__doc__}, + {"register_adapter", _PyCFunction_CAST(pysqlite_register_adapter), METH_FASTCALL, pysqlite_register_adapter__doc__}, static PyObject * pysqlite_register_adapter_impl(PyObject *module, PyTypeObject *type, @@ -236,7 +236,7 @@ PyDoc_STRVAR(pysqlite_register_converter__doc__, "Registers a converter with sqlite3."); #define PYSQLITE_REGISTER_CONVERTER_METHODDEF \ - {"register_converter", (PyCFunction)(void(*)(void))pysqlite_register_converter, METH_FASTCALL, pysqlite_register_converter__doc__}, + {"register_converter", _PyCFunction_CAST(pysqlite_register_converter), METH_FASTCALL, pysqlite_register_converter__doc__}, static PyObject * pysqlite_register_converter_impl(PyObject *module, PyObject *orig_name, @@ -302,7 +302,7 @@ PyDoc_STRVAR(pysqlite_adapt__doc__, "Adapt given object to given protocol."); #define PYSQLITE_ADAPT_METHODDEF \ - {"adapt", (PyCFunction)(void(*)(void))pysqlite_adapt, METH_FASTCALL, pysqlite_adapt__doc__}, + {"adapt", _PyCFunction_CAST(pysqlite_adapt), METH_FASTCALL, pysqlite_adapt__doc__}, static PyObject * pysqlite_adapt_impl(PyObject *module, PyObject *obj, PyObject *proto, @@ -334,4 +334,4 @@ pysqlite_adapt(PyObject *module, PyObject *const *args, Py_ssize_t nargs) exit: return return_value; } -/*[clinic end generated code: output=2cf05d1b089c7be4 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=d846459943008a9c input=a9049054013a1b77]*/ diff --git a/Modules/_sre/clinic/sre.c.h b/Modules/_sre/clinic/sre.c.h index c1b247ef7e9dd..e243c756e1f97 100644 --- a/Modules/_sre/clinic/sre.c.h +++ b/Modules/_sre/clinic/sre.c.h @@ -164,7 +164,7 @@ PyDoc_STRVAR(_sre_SRE_Pattern_match__doc__, "Matches zero or more characters at the beginning of the string."); #define _SRE_SRE_PATTERN_MATCH_METHODDEF \ - {"match", (PyCFunction)(void(*)(void))_sre_SRE_Pattern_match, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _sre_SRE_Pattern_match__doc__}, + {"match", _PyCFunction_CAST(_sre_SRE_Pattern_match), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _sre_SRE_Pattern_match__doc__}, static PyObject * _sre_SRE_Pattern_match_impl(PatternObject *self, PyTypeObject *cls, @@ -234,7 +234,7 @@ PyDoc_STRVAR(_sre_SRE_Pattern_fullmatch__doc__, "Matches against all of the string."); #define _SRE_SRE_PATTERN_FULLMATCH_METHODDEF \ - {"fullmatch", (PyCFunction)(void(*)(void))_sre_SRE_Pattern_fullmatch, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _sre_SRE_Pattern_fullmatch__doc__}, + {"fullmatch", _PyCFunction_CAST(_sre_SRE_Pattern_fullmatch), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _sre_SRE_Pattern_fullmatch__doc__}, static PyObject * _sre_SRE_Pattern_fullmatch_impl(PatternObject *self, PyTypeObject *cls, @@ -306,7 +306,7 @@ PyDoc_STRVAR(_sre_SRE_Pattern_search__doc__, "Return None if no position in the string matches."); #define _SRE_SRE_PATTERN_SEARCH_METHODDEF \ - {"search", (PyCFunction)(void(*)(void))_sre_SRE_Pattern_search, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _sre_SRE_Pattern_search__doc__}, + {"search", _PyCFunction_CAST(_sre_SRE_Pattern_search), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _sre_SRE_Pattern_search__doc__}, static PyObject * _sre_SRE_Pattern_search_impl(PatternObject *self, PyTypeObject *cls, @@ -376,7 +376,7 @@ PyDoc_STRVAR(_sre_SRE_Pattern_findall__doc__, "Return a list of all non-overlapping matches of pattern in string."); #define _SRE_SRE_PATTERN_FINDALL_METHODDEF \ - {"findall", (PyCFunction)(void(*)(void))_sre_SRE_Pattern_findall, METH_FASTCALL|METH_KEYWORDS, _sre_SRE_Pattern_findall__doc__}, + {"findall", _PyCFunction_CAST(_sre_SRE_Pattern_findall), METH_FASTCALL|METH_KEYWORDS, _sre_SRE_Pattern_findall__doc__}, static PyObject * _sre_SRE_Pattern_findall_impl(PatternObject *self, PyObject *string, @@ -447,7 +447,7 @@ PyDoc_STRVAR(_sre_SRE_Pattern_finditer__doc__, "For each match, the iterator returns a match object."); #define _SRE_SRE_PATTERN_FINDITER_METHODDEF \ - {"finditer", (PyCFunction)(void(*)(void))_sre_SRE_Pattern_finditer, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _sre_SRE_Pattern_finditer__doc__}, + {"finditer", _PyCFunction_CAST(_sre_SRE_Pattern_finditer), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _sre_SRE_Pattern_finditer__doc__}, static PyObject * _sre_SRE_Pattern_finditer_impl(PatternObject *self, PyTypeObject *cls, @@ -516,7 +516,7 @@ PyDoc_STRVAR(_sre_SRE_Pattern_scanner__doc__, "\n"); #define _SRE_SRE_PATTERN_SCANNER_METHODDEF \ - {"scanner", (PyCFunction)(void(*)(void))_sre_SRE_Pattern_scanner, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _sre_SRE_Pattern_scanner__doc__}, + {"scanner", _PyCFunction_CAST(_sre_SRE_Pattern_scanner), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _sre_SRE_Pattern_scanner__doc__}, static PyObject * _sre_SRE_Pattern_scanner_impl(PatternObject *self, PyTypeObject *cls, @@ -586,7 +586,7 @@ PyDoc_STRVAR(_sre_SRE_Pattern_split__doc__, "Split string by the occurrences of pattern."); #define _SRE_SRE_PATTERN_SPLIT_METHODDEF \ - {"split", (PyCFunction)(void(*)(void))_sre_SRE_Pattern_split, METH_FASTCALL|METH_KEYWORDS, _sre_SRE_Pattern_split__doc__}, + {"split", _PyCFunction_CAST(_sre_SRE_Pattern_split), METH_FASTCALL|METH_KEYWORDS, _sre_SRE_Pattern_split__doc__}, static PyObject * _sre_SRE_Pattern_split_impl(PatternObject *self, PyObject *string, @@ -637,7 +637,7 @@ PyDoc_STRVAR(_sre_SRE_Pattern_sub__doc__, "Return the string obtained by replacing the leftmost non-overlapping occurrences of pattern in string by the replacement repl."); #define _SRE_SRE_PATTERN_SUB_METHODDEF \ - {"sub", (PyCFunction)(void(*)(void))_sre_SRE_Pattern_sub, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _sre_SRE_Pattern_sub__doc__}, + {"sub", _PyCFunction_CAST(_sre_SRE_Pattern_sub), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _sre_SRE_Pattern_sub__doc__}, static PyObject * _sre_SRE_Pattern_sub_impl(PatternObject *self, PyTypeObject *cls, @@ -690,7 +690,7 @@ PyDoc_STRVAR(_sre_SRE_Pattern_subn__doc__, "Return the tuple (new_string, number_of_subs_made) found by replacing the leftmost non-overlapping occurrences of pattern with the replacement repl."); #define _SRE_SRE_PATTERN_SUBN_METHODDEF \ - {"subn", (PyCFunction)(void(*)(void))_sre_SRE_Pattern_subn, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _sre_SRE_Pattern_subn__doc__}, + {"subn", _PyCFunction_CAST(_sre_SRE_Pattern_subn), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _sre_SRE_Pattern_subn__doc__}, static PyObject * _sre_SRE_Pattern_subn_impl(PatternObject *self, PyTypeObject *cls, @@ -769,7 +769,7 @@ PyDoc_STRVAR(_sre_compile__doc__, "\n"); #define _SRE_COMPILE_METHODDEF \ - {"compile", (PyCFunction)(void(*)(void))_sre_compile, METH_FASTCALL|METH_KEYWORDS, _sre_compile__doc__}, + {"compile", _PyCFunction_CAST(_sre_compile), METH_FASTCALL|METH_KEYWORDS, _sre_compile__doc__}, static PyObject * _sre_compile_impl(PyObject *module, PyObject *pattern, int flags, @@ -852,7 +852,7 @@ PyDoc_STRVAR(_sre_SRE_Match_expand__doc__, "Return the string obtained by doing backslash substitution on the string template, as done by the sub() method."); #define _SRE_SRE_MATCH_EXPAND_METHODDEF \ - {"expand", (PyCFunction)(void(*)(void))_sre_SRE_Match_expand, METH_FASTCALL|METH_KEYWORDS, _sre_SRE_Match_expand__doc__}, + {"expand", _PyCFunction_CAST(_sre_SRE_Match_expand), METH_FASTCALL|METH_KEYWORDS, _sre_SRE_Match_expand__doc__}, static PyObject * _sre_SRE_Match_expand_impl(MatchObject *self, PyObject *template); @@ -887,7 +887,7 @@ PyDoc_STRVAR(_sre_SRE_Match_groups__doc__, " Is used for groups that did not participate in the match."); #define _SRE_SRE_MATCH_GROUPS_METHODDEF \ - {"groups", (PyCFunction)(void(*)(void))_sre_SRE_Match_groups, METH_FASTCALL|METH_KEYWORDS, _sre_SRE_Match_groups__doc__}, + {"groups", _PyCFunction_CAST(_sre_SRE_Match_groups), METH_FASTCALL|METH_KEYWORDS, _sre_SRE_Match_groups__doc__}, static PyObject * _sre_SRE_Match_groups_impl(MatchObject *self, PyObject *default_value); @@ -927,7 +927,7 @@ PyDoc_STRVAR(_sre_SRE_Match_groupdict__doc__, " Is used for groups that did not participate in the match."); #define _SRE_SRE_MATCH_GROUPDICT_METHODDEF \ - {"groupdict", (PyCFunction)(void(*)(void))_sre_SRE_Match_groupdict, METH_FASTCALL|METH_KEYWORDS, _sre_SRE_Match_groupdict__doc__}, + {"groupdict", _PyCFunction_CAST(_sre_SRE_Match_groupdict), METH_FASTCALL|METH_KEYWORDS, _sre_SRE_Match_groupdict__doc__}, static PyObject * _sre_SRE_Match_groupdict_impl(MatchObject *self, PyObject *default_value); @@ -964,7 +964,7 @@ PyDoc_STRVAR(_sre_SRE_Match_start__doc__, "Return index of the start of the substring matched by group."); #define _SRE_SRE_MATCH_START_METHODDEF \ - {"start", (PyCFunction)(void(*)(void))_sre_SRE_Match_start, METH_FASTCALL, _sre_SRE_Match_start__doc__}, + {"start", _PyCFunction_CAST(_sre_SRE_Match_start), METH_FASTCALL, _sre_SRE_Match_start__doc__}, static Py_ssize_t _sre_SRE_Match_start_impl(MatchObject *self, PyObject *group); @@ -1001,7 +1001,7 @@ PyDoc_STRVAR(_sre_SRE_Match_end__doc__, "Return index of the end of the substring matched by group."); #define _SRE_SRE_MATCH_END_METHODDEF \ - {"end", (PyCFunction)(void(*)(void))_sre_SRE_Match_end, METH_FASTCALL, _sre_SRE_Match_end__doc__}, + {"end", _PyCFunction_CAST(_sre_SRE_Match_end), METH_FASTCALL, _sre_SRE_Match_end__doc__}, static Py_ssize_t _sre_SRE_Match_end_impl(MatchObject *self, PyObject *group); @@ -1038,7 +1038,7 @@ PyDoc_STRVAR(_sre_SRE_Match_span__doc__, "For match object m, return the 2-tuple (m.start(group), m.end(group))."); #define _SRE_SRE_MATCH_SPAN_METHODDEF \ - {"span", (PyCFunction)(void(*)(void))_sre_SRE_Match_span, METH_FASTCALL, _sre_SRE_Match_span__doc__}, + {"span", _PyCFunction_CAST(_sre_SRE_Match_span), METH_FASTCALL, _sre_SRE_Match_span__doc__}, static PyObject * _sre_SRE_Match_span_impl(MatchObject *self, PyObject *group); @@ -1094,7 +1094,7 @@ PyDoc_STRVAR(_sre_SRE_Scanner_match__doc__, "\n"); #define _SRE_SRE_SCANNER_MATCH_METHODDEF \ - {"match", (PyCFunction)(void(*)(void))_sre_SRE_Scanner_match, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _sre_SRE_Scanner_match__doc__}, + {"match", _PyCFunction_CAST(_sre_SRE_Scanner_match), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _sre_SRE_Scanner_match__doc__}, static PyObject * _sre_SRE_Scanner_match_impl(ScannerObject *self, PyTypeObject *cls); @@ -1115,7 +1115,7 @@ PyDoc_STRVAR(_sre_SRE_Scanner_search__doc__, "\n"); #define _SRE_SRE_SCANNER_SEARCH_METHODDEF \ - {"search", (PyCFunction)(void(*)(void))_sre_SRE_Scanner_search, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _sre_SRE_Scanner_search__doc__}, + {"search", _PyCFunction_CAST(_sre_SRE_Scanner_search), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _sre_SRE_Scanner_search__doc__}, static PyObject * _sre_SRE_Scanner_search_impl(ScannerObject *self, PyTypeObject *cls); @@ -1129,4 +1129,4 @@ _sre_SRE_Scanner_search(ScannerObject *self, PyTypeObject *cls, PyObject *const } return _sre_SRE_Scanner_search_impl(self, cls); } -/*[clinic end generated code: output=8d8200b2177cd667 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=97e7ce058366760b input=a9049054013a1b77]*/ diff --git a/Modules/_ssl/clinic/cert.c.h b/Modules/_ssl/clinic/cert.c.h index c4377128b36e2..53cedabc3f7b4 100644 --- a/Modules/_ssl/clinic/cert.c.h +++ b/Modules/_ssl/clinic/cert.c.h @@ -8,7 +8,7 @@ PyDoc_STRVAR(_ssl_Certificate_public_bytes__doc__, "\n"); #define _SSL_CERTIFICATE_PUBLIC_BYTES_METHODDEF \ - {"public_bytes", (PyCFunction)(void(*)(void))_ssl_Certificate_public_bytes, METH_FASTCALL|METH_KEYWORDS, _ssl_Certificate_public_bytes__doc__}, + {"public_bytes", _PyCFunction_CAST(_ssl_Certificate_public_bytes), METH_FASTCALL|METH_KEYWORDS, _ssl_Certificate_public_bytes__doc__}, static PyObject * _ssl_Certificate_public_bytes_impl(PySSLCertificate *self, int format); @@ -57,4 +57,4 @@ _ssl_Certificate_get_info(PySSLCertificate *self, PyObject *Py_UNUSED(ignored)) { return _ssl_Certificate_get_info_impl(self); } -/*[clinic end generated code: output=569d161749ead2da input=a9049054013a1b77]*/ +/*[clinic end generated code: output=18885c4d167d5244 input=a9049054013a1b77]*/ diff --git a/Modules/cjkcodecs/clinic/multibytecodec.c.h b/Modules/cjkcodecs/clinic/multibytecodec.c.h index 60515245490f7..8f850aa8195ca 100644 --- a/Modules/cjkcodecs/clinic/multibytecodec.c.h +++ b/Modules/cjkcodecs/clinic/multibytecodec.c.h @@ -14,7 +14,7 @@ PyDoc_STRVAR(_multibytecodec_MultibyteCodec_encode__doc__, "registered with codecs.register_error that can handle UnicodeEncodeErrors."); #define _MULTIBYTECODEC_MULTIBYTECODEC_ENCODE_METHODDEF \ - {"encode", (PyCFunction)(void(*)(void))_multibytecodec_MultibyteCodec_encode, METH_FASTCALL|METH_KEYWORDS, _multibytecodec_MultibyteCodec_encode__doc__}, + {"encode", _PyCFunction_CAST(_multibytecodec_MultibyteCodec_encode), METH_FASTCALL|METH_KEYWORDS, _multibytecodec_MultibyteCodec_encode__doc__}, static PyObject * _multibytecodec_MultibyteCodec_encode_impl(MultibyteCodecObject *self, @@ -77,7 +77,7 @@ PyDoc_STRVAR(_multibytecodec_MultibyteCodec_decode__doc__, "codecs.register_error that is able to handle UnicodeDecodeErrors.\""); #define _MULTIBYTECODEC_MULTIBYTECODEC_DECODE_METHODDEF \ - {"decode", (PyCFunction)(void(*)(void))_multibytecodec_MultibyteCodec_decode, METH_FASTCALL|METH_KEYWORDS, _multibytecodec_MultibyteCodec_decode__doc__}, + {"decode", _PyCFunction_CAST(_multibytecodec_MultibyteCodec_decode), METH_FASTCALL|METH_KEYWORDS, _multibytecodec_MultibyteCodec_decode__doc__}, static PyObject * _multibytecodec_MultibyteCodec_decode_impl(MultibyteCodecObject *self, @@ -145,7 +145,7 @@ PyDoc_STRVAR(_multibytecodec_MultibyteIncrementalEncoder_encode__doc__, "\n"); #define _MULTIBYTECODEC_MULTIBYTEINCREMENTALENCODER_ENCODE_METHODDEF \ - {"encode", (PyCFunction)(void(*)(void))_multibytecodec_MultibyteIncrementalEncoder_encode, METH_FASTCALL|METH_KEYWORDS, _multibytecodec_MultibyteIncrementalEncoder_encode__doc__}, + {"encode", _PyCFunction_CAST(_multibytecodec_MultibyteIncrementalEncoder_encode), METH_FASTCALL|METH_KEYWORDS, _multibytecodec_MultibyteIncrementalEncoder_encode__doc__}, static PyObject * _multibytecodec_MultibyteIncrementalEncoder_encode_impl(MultibyteIncrementalEncoderObject *self, @@ -251,7 +251,7 @@ PyDoc_STRVAR(_multibytecodec_MultibyteIncrementalDecoder_decode__doc__, "\n"); #define _MULTIBYTECODEC_MULTIBYTEINCREMENTALDECODER_DECODE_METHODDEF \ - {"decode", (PyCFunction)(void(*)(void))_multibytecodec_MultibyteIncrementalDecoder_decode, METH_FASTCALL|METH_KEYWORDS, _multibytecodec_MultibyteIncrementalDecoder_decode__doc__}, + {"decode", _PyCFunction_CAST(_multibytecodec_MultibyteIncrementalDecoder_decode), METH_FASTCALL|METH_KEYWORDS, _multibytecodec_MultibyteIncrementalDecoder_decode__doc__}, static PyObject * _multibytecodec_MultibyteIncrementalDecoder_decode_impl(MultibyteIncrementalDecoderObject *self, @@ -368,7 +368,7 @@ PyDoc_STRVAR(_multibytecodec_MultibyteStreamReader_read__doc__, "\n"); #define _MULTIBYTECODEC_MULTIBYTESTREAMREADER_READ_METHODDEF \ - {"read", (PyCFunction)(void(*)(void))_multibytecodec_MultibyteStreamReader_read, METH_FASTCALL, _multibytecodec_MultibyteStreamReader_read__doc__}, + {"read", _PyCFunction_CAST(_multibytecodec_MultibyteStreamReader_read), METH_FASTCALL, _multibytecodec_MultibyteStreamReader_read__doc__}, static PyObject * _multibytecodec_MultibyteStreamReader_read_impl(MultibyteStreamReaderObject *self, @@ -400,7 +400,7 @@ PyDoc_STRVAR(_multibytecodec_MultibyteStreamReader_readline__doc__, "\n"); #define _MULTIBYTECODEC_MULTIBYTESTREAMREADER_READLINE_METHODDEF \ - {"readline", (PyCFunction)(void(*)(void))_multibytecodec_MultibyteStreamReader_readline, METH_FASTCALL, _multibytecodec_MultibyteStreamReader_readline__doc__}, + {"readline", _PyCFunction_CAST(_multibytecodec_MultibyteStreamReader_readline), METH_FASTCALL, _multibytecodec_MultibyteStreamReader_readline__doc__}, static PyObject * _multibytecodec_MultibyteStreamReader_readline_impl(MultibyteStreamReaderObject *self, @@ -432,7 +432,7 @@ PyDoc_STRVAR(_multibytecodec_MultibyteStreamReader_readlines__doc__, "\n"); #define _MULTIBYTECODEC_MULTIBYTESTREAMREADER_READLINES_METHODDEF \ - {"readlines", (PyCFunction)(void(*)(void))_multibytecodec_MultibyteStreamReader_readlines, METH_FASTCALL, _multibytecodec_MultibyteStreamReader_readlines__doc__}, + {"readlines", _PyCFunction_CAST(_multibytecodec_MultibyteStreamReader_readlines), METH_FASTCALL, _multibytecodec_MultibyteStreamReader_readlines__doc__}, static PyObject * _multibytecodec_MultibyteStreamReader_readlines_impl(MultibyteStreamReaderObject *self, @@ -481,7 +481,7 @@ PyDoc_STRVAR(_multibytecodec_MultibyteStreamWriter_write__doc__, "\n"); #define _MULTIBYTECODEC_MULTIBYTESTREAMWRITER_WRITE_METHODDEF \ - {"write", (PyCFunction)(void(*)(void))_multibytecodec_MultibyteStreamWriter_write, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _multibytecodec_MultibyteStreamWriter_write__doc__}, + {"write", _PyCFunction_CAST(_multibytecodec_MultibyteStreamWriter_write), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _multibytecodec_MultibyteStreamWriter_write__doc__}, static PyObject * _multibytecodec_MultibyteStreamWriter_write_impl(MultibyteStreamWriterObject *self, @@ -514,7 +514,7 @@ PyDoc_STRVAR(_multibytecodec_MultibyteStreamWriter_writelines__doc__, "\n"); #define _MULTIBYTECODEC_MULTIBYTESTREAMWRITER_WRITELINES_METHODDEF \ - {"writelines", (PyCFunction)(void(*)(void))_multibytecodec_MultibyteStreamWriter_writelines, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _multibytecodec_MultibyteStreamWriter_writelines__doc__}, + {"writelines", _PyCFunction_CAST(_multibytecodec_MultibyteStreamWriter_writelines), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _multibytecodec_MultibyteStreamWriter_writelines__doc__}, static PyObject * _multibytecodec_MultibyteStreamWriter_writelines_impl(MultibyteStreamWriterObject *self, @@ -547,7 +547,7 @@ PyDoc_STRVAR(_multibytecodec_MultibyteStreamWriter_reset__doc__, "\n"); #define _MULTIBYTECODEC_MULTIBYTESTREAMWRITER_RESET_METHODDEF \ - {"reset", (PyCFunction)(void(*)(void))_multibytecodec_MultibyteStreamWriter_reset, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _multibytecodec_MultibyteStreamWriter_reset__doc__}, + {"reset", _PyCFunction_CAST(_multibytecodec_MultibyteStreamWriter_reset), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _multibytecodec_MultibyteStreamWriter_reset__doc__}, static PyObject * _multibytecodec_MultibyteStreamWriter_reset_impl(MultibyteStreamWriterObject *self, @@ -570,4 +570,4 @@ PyDoc_STRVAR(_multibytecodec___create_codec__doc__, #define _MULTIBYTECODEC___CREATE_CODEC_METHODDEF \ {"__create_codec", (PyCFunction)_multibytecodec___create_codec, METH_O, _multibytecodec___create_codec__doc__}, -/*[clinic end generated code: output=0ee00c9f6883afe9 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=9e4e3da5ca3c8288 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_abc.c.h b/Modules/clinic/_abc.c.h index 62c6552ba645d..8d3832e1b83d2 100644 --- a/Modules/clinic/_abc.c.h +++ b/Modules/clinic/_abc.c.h @@ -53,7 +53,7 @@ PyDoc_STRVAR(_abc__abc_register__doc__, "Internal ABC helper for subclasss registration. Should be never used outside abc module."); #define _ABC__ABC_REGISTER_METHODDEF \ - {"_abc_register", (PyCFunction)(void(*)(void))_abc__abc_register, METH_FASTCALL, _abc__abc_register__doc__}, + {"_abc_register", _PyCFunction_CAST(_abc__abc_register), METH_FASTCALL, _abc__abc_register__doc__}, static PyObject * _abc__abc_register_impl(PyObject *module, PyObject *self, PyObject *subclass); @@ -83,7 +83,7 @@ PyDoc_STRVAR(_abc__abc_instancecheck__doc__, "Internal ABC helper for instance checks. Should be never used outside abc module."); #define _ABC__ABC_INSTANCECHECK_METHODDEF \ - {"_abc_instancecheck", (PyCFunction)(void(*)(void))_abc__abc_instancecheck, METH_FASTCALL, _abc__abc_instancecheck__doc__}, + {"_abc_instancecheck", _PyCFunction_CAST(_abc__abc_instancecheck), METH_FASTCALL, _abc__abc_instancecheck__doc__}, static PyObject * _abc__abc_instancecheck_impl(PyObject *module, PyObject *self, @@ -114,7 +114,7 @@ PyDoc_STRVAR(_abc__abc_subclasscheck__doc__, "Internal ABC helper for subclasss checks. Should be never used outside abc module."); #define _ABC__ABC_SUBCLASSCHECK_METHODDEF \ - {"_abc_subclasscheck", (PyCFunction)(void(*)(void))_abc__abc_subclasscheck, METH_FASTCALL, _abc__abc_subclasscheck__doc__}, + {"_abc_subclasscheck", _PyCFunction_CAST(_abc__abc_subclasscheck), METH_FASTCALL, _abc__abc_subclasscheck__doc__}, static PyObject * _abc__abc_subclasscheck_impl(PyObject *module, PyObject *self, @@ -159,4 +159,4 @@ _abc_get_cache_token(PyObject *module, PyObject *Py_UNUSED(ignored)) { return _abc_get_cache_token_impl(module); } -/*[clinic end generated code: output=2544b4b5ae50a089 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=babb3ce445fa9b21 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_asynciomodule.c.h b/Modules/clinic/_asynciomodule.c.h index 163b0f95691b3..7cc27b8289598 100644 --- a/Modules/clinic/_asynciomodule.c.h +++ b/Modules/clinic/_asynciomodule.c.h @@ -129,7 +129,7 @@ PyDoc_STRVAR(_asyncio_Future_add_done_callback__doc__, "scheduled with call_soon."); #define _ASYNCIO_FUTURE_ADD_DONE_CALLBACK_METHODDEF \ - {"add_done_callback", (PyCFunction)(void(*)(void))_asyncio_Future_add_done_callback, METH_FASTCALL|METH_KEYWORDS, _asyncio_Future_add_done_callback__doc__}, + {"add_done_callback", _PyCFunction_CAST(_asyncio_Future_add_done_callback), METH_FASTCALL|METH_KEYWORDS, _asyncio_Future_add_done_callback__doc__}, static PyObject * _asyncio_Future_add_done_callback_impl(FutureObj *self, PyObject *fn, @@ -184,7 +184,7 @@ PyDoc_STRVAR(_asyncio_Future_cancel__doc__, "return True."); #define _ASYNCIO_FUTURE_CANCEL_METHODDEF \ - {"cancel", (PyCFunction)(void(*)(void))_asyncio_Future_cancel, METH_FASTCALL|METH_KEYWORDS, _asyncio_Future_cancel__doc__}, + {"cancel", _PyCFunction_CAST(_asyncio_Future_cancel), METH_FASTCALL|METH_KEYWORDS, _asyncio_Future_cancel__doc__}, static PyObject * _asyncio_Future_cancel_impl(FutureObj *self, PyObject *msg); @@ -392,7 +392,7 @@ PyDoc_STRVAR(_asyncio_Task_cancel__doc__, "This also increases the task\'s count of cancellation requests."); #define _ASYNCIO_TASK_CANCEL_METHODDEF \ - {"cancel", (PyCFunction)(void(*)(void))_asyncio_Task_cancel, METH_FASTCALL|METH_KEYWORDS, _asyncio_Task_cancel__doc__}, + {"cancel", _PyCFunction_CAST(_asyncio_Task_cancel), METH_FASTCALL|METH_KEYWORDS, _asyncio_Task_cancel__doc__}, static PyObject * _asyncio_Task_cancel_impl(TaskObj *self, PyObject *msg); @@ -473,7 +473,7 @@ PyDoc_STRVAR(_asyncio_Task__check_future__doc__, "Return False if task and future loops are not compatible."); #define _ASYNCIO_TASK__CHECK_FUTURE_METHODDEF \ - {"_check_future", (PyCFunction)(void(*)(void))_asyncio_Task__check_future, METH_FASTCALL|METH_KEYWORDS, _asyncio_Task__check_future__doc__}, + {"_check_future", _PyCFunction_CAST(_asyncio_Task__check_future), METH_FASTCALL|METH_KEYWORDS, _asyncio_Task__check_future__doc__}, static int _asyncio_Task__check_future_impl(TaskObj *self, PyObject *future); @@ -528,7 +528,7 @@ PyDoc_STRVAR(_asyncio_Task_get_stack__doc__, "returned for a suspended coroutine."); #define _ASYNCIO_TASK_GET_STACK_METHODDEF \ - {"get_stack", (PyCFunction)(void(*)(void))_asyncio_Task_get_stack, METH_FASTCALL|METH_KEYWORDS, _asyncio_Task_get_stack__doc__}, + {"get_stack", _PyCFunction_CAST(_asyncio_Task_get_stack), METH_FASTCALL|METH_KEYWORDS, _asyncio_Task_get_stack__doc__}, static PyObject * _asyncio_Task_get_stack_impl(TaskObj *self, PyObject *limit); @@ -571,7 +571,7 @@ PyDoc_STRVAR(_asyncio_Task_print_stack__doc__, "to sys.stderr."); #define _ASYNCIO_TASK_PRINT_STACK_METHODDEF \ - {"print_stack", (PyCFunction)(void(*)(void))_asyncio_Task_print_stack, METH_FASTCALL|METH_KEYWORDS, _asyncio_Task_print_stack__doc__}, + {"print_stack", _PyCFunction_CAST(_asyncio_Task_print_stack), METH_FASTCALL|METH_KEYWORDS, _asyncio_Task_print_stack__doc__}, static PyObject * _asyncio_Task_print_stack_impl(TaskObj *self, PyObject *limit, @@ -731,7 +731,7 @@ PyDoc_STRVAR(_asyncio__get_event_loop__doc__, "\n"); #define _ASYNCIO__GET_EVENT_LOOP_METHODDEF \ - {"_get_event_loop", (PyCFunction)(void(*)(void))_asyncio__get_event_loop, METH_FASTCALL|METH_KEYWORDS, _asyncio__get_event_loop__doc__}, + {"_get_event_loop", _PyCFunction_CAST(_asyncio__get_event_loop), METH_FASTCALL|METH_KEYWORDS, _asyncio__get_event_loop__doc__}, static PyObject * _asyncio__get_event_loop_impl(PyObject *module, int stacklevel); @@ -793,7 +793,7 @@ PyDoc_STRVAR(_asyncio__register_task__doc__, "Returns None."); #define _ASYNCIO__REGISTER_TASK_METHODDEF \ - {"_register_task", (PyCFunction)(void(*)(void))_asyncio__register_task, METH_FASTCALL|METH_KEYWORDS, _asyncio__register_task__doc__}, + {"_register_task", _PyCFunction_CAST(_asyncio__register_task), METH_FASTCALL|METH_KEYWORDS, _asyncio__register_task__doc__}, static PyObject * _asyncio__register_task_impl(PyObject *module, PyObject *task); @@ -827,7 +827,7 @@ PyDoc_STRVAR(_asyncio__unregister_task__doc__, "Returns None."); #define _ASYNCIO__UNREGISTER_TASK_METHODDEF \ - {"_unregister_task", (PyCFunction)(void(*)(void))_asyncio__unregister_task, METH_FASTCALL|METH_KEYWORDS, _asyncio__unregister_task__doc__}, + {"_unregister_task", _PyCFunction_CAST(_asyncio__unregister_task), METH_FASTCALL|METH_KEYWORDS, _asyncio__unregister_task__doc__}, static PyObject * _asyncio__unregister_task_impl(PyObject *module, PyObject *task); @@ -863,7 +863,7 @@ PyDoc_STRVAR(_asyncio__enter_task__doc__, "Returns None."); #define _ASYNCIO__ENTER_TASK_METHODDEF \ - {"_enter_task", (PyCFunction)(void(*)(void))_asyncio__enter_task, METH_FASTCALL|METH_KEYWORDS, _asyncio__enter_task__doc__}, + {"_enter_task", _PyCFunction_CAST(_asyncio__enter_task), METH_FASTCALL|METH_KEYWORDS, _asyncio__enter_task__doc__}, static PyObject * _asyncio__enter_task_impl(PyObject *module, PyObject *loop, PyObject *task); @@ -901,7 +901,7 @@ PyDoc_STRVAR(_asyncio__leave_task__doc__, "Returns None."); #define _ASYNCIO__LEAVE_TASK_METHODDEF \ - {"_leave_task", (PyCFunction)(void(*)(void))_asyncio__leave_task, METH_FASTCALL|METH_KEYWORDS, _asyncio__leave_task__doc__}, + {"_leave_task", _PyCFunction_CAST(_asyncio__leave_task), METH_FASTCALL|METH_KEYWORDS, _asyncio__leave_task__doc__}, static PyObject * _asyncio__leave_task_impl(PyObject *module, PyObject *loop, PyObject *task); @@ -927,4 +927,4 @@ _asyncio__leave_task(PyObject *module, PyObject *const *args, Py_ssize_t nargs, exit: return return_value; } -/*[clinic end generated code: output=fdb7129263a8712e input=a9049054013a1b77]*/ +/*[clinic end generated code: output=eccf150c9c30efd5 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_bisectmodule.c.h b/Modules/clinic/_bisectmodule.c.h index f118f4bbf8628..2f0a3575cc5ce 100644 --- a/Modules/clinic/_bisectmodule.c.h +++ b/Modules/clinic/_bisectmodule.c.h @@ -16,7 +16,7 @@ PyDoc_STRVAR(_bisect_bisect_right__doc__, "slice of a to be searched."); #define _BISECT_BISECT_RIGHT_METHODDEF \ - {"bisect_right", (PyCFunction)(void(*)(void))_bisect_bisect_right, METH_FASTCALL|METH_KEYWORDS, _bisect_bisect_right__doc__}, + {"bisect_right", _PyCFunction_CAST(_bisect_bisect_right), METH_FASTCALL|METH_KEYWORDS, _bisect_bisect_right__doc__}, static Py_ssize_t _bisect_bisect_right_impl(PyObject *module, PyObject *a, PyObject *x, @@ -99,7 +99,7 @@ PyDoc_STRVAR(_bisect_insort_right__doc__, "slice of a to be searched."); #define _BISECT_INSORT_RIGHT_METHODDEF \ - {"insort_right", (PyCFunction)(void(*)(void))_bisect_insort_right, METH_FASTCALL|METH_KEYWORDS, _bisect_insort_right__doc__}, + {"insort_right", _PyCFunction_CAST(_bisect_insort_right), METH_FASTCALL|METH_KEYWORDS, _bisect_insort_right__doc__}, static PyObject * _bisect_insort_right_impl(PyObject *module, PyObject *a, PyObject *x, @@ -179,7 +179,7 @@ PyDoc_STRVAR(_bisect_bisect_left__doc__, "slice of a to be searched."); #define _BISECT_BISECT_LEFT_METHODDEF \ - {"bisect_left", (PyCFunction)(void(*)(void))_bisect_bisect_left, METH_FASTCALL|METH_KEYWORDS, _bisect_bisect_left__doc__}, + {"bisect_left", _PyCFunction_CAST(_bisect_bisect_left), METH_FASTCALL|METH_KEYWORDS, _bisect_bisect_left__doc__}, static Py_ssize_t _bisect_bisect_left_impl(PyObject *module, PyObject *a, PyObject *x, @@ -262,7 +262,7 @@ PyDoc_STRVAR(_bisect_insort_left__doc__, "slice of a to be searched."); #define _BISECT_INSORT_LEFT_METHODDEF \ - {"insort_left", (PyCFunction)(void(*)(void))_bisect_insort_left, METH_FASTCALL|METH_KEYWORDS, _bisect_insort_left__doc__}, + {"insort_left", _PyCFunction_CAST(_bisect_insort_left), METH_FASTCALL|METH_KEYWORDS, _bisect_insort_left__doc__}, static PyObject * _bisect_insort_left_impl(PyObject *module, PyObject *a, PyObject *x, @@ -327,4 +327,4 @@ _bisect_insort_left(PyObject *module, PyObject *const *args, Py_ssize_t nargs, P exit: return return_value; } -/*[clinic end generated code: output=aeb97db6db79bf96 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=ee8c32ff8d3d1fac input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_bz2module.c.h b/Modules/clinic/_bz2module.c.h index 71ad0b135718a..3ed72f8bceb17 100644 --- a/Modules/clinic/_bz2module.c.h +++ b/Modules/clinic/_bz2module.c.h @@ -85,7 +85,7 @@ PyDoc_STRVAR(_bz2_BZ2Decompressor_decompress__doc__, "the unused_data attribute."); #define _BZ2_BZ2DECOMPRESSOR_DECOMPRESS_METHODDEF \ - {"decompress", (PyCFunction)(void(*)(void))_bz2_BZ2Decompressor_decompress, METH_FASTCALL|METH_KEYWORDS, _bz2_BZ2Decompressor_decompress__doc__}, + {"decompress", _PyCFunction_CAST(_bz2_BZ2Decompressor_decompress), METH_FASTCALL|METH_KEYWORDS, _bz2_BZ2Decompressor_decompress__doc__}, static PyObject * _bz2_BZ2Decompressor_decompress_impl(BZ2Decompressor *self, Py_buffer *data, @@ -139,4 +139,4 @@ _bz2_BZ2Decompressor_decompress(BZ2Decompressor *self, PyObject *const *args, Py return return_value; } -/*[clinic end generated code: output=ed10705d7a9fd598 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=a1175204a414fe2a input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_codecsmodule.c.h b/Modules/clinic/_codecsmodule.c.h index 855ac77a7f73f..29e9d5ea86aa2 100644 --- a/Modules/clinic/_codecsmodule.c.h +++ b/Modules/clinic/_codecsmodule.c.h @@ -76,7 +76,7 @@ PyDoc_STRVAR(_codecs_encode__doc__, "codecs.register_error that can handle ValueErrors."); #define _CODECS_ENCODE_METHODDEF \ - {"encode", (PyCFunction)(void(*)(void))_codecs_encode, METH_FASTCALL|METH_KEYWORDS, _codecs_encode__doc__}, + {"encode", _PyCFunction_CAST(_codecs_encode), METH_FASTCALL|METH_KEYWORDS, _codecs_encode__doc__}, static PyObject * _codecs_encode_impl(PyObject *module, PyObject *obj, const char *encoding, @@ -153,7 +153,7 @@ PyDoc_STRVAR(_codecs_decode__doc__, "codecs.register_error that can handle ValueErrors."); #define _CODECS_DECODE_METHODDEF \ - {"decode", (PyCFunction)(void(*)(void))_codecs_decode, METH_FASTCALL|METH_KEYWORDS, _codecs_decode__doc__}, + {"decode", _PyCFunction_CAST(_codecs_decode), METH_FASTCALL|METH_KEYWORDS, _codecs_decode__doc__}, static PyObject * _codecs_decode_impl(PyObject *module, PyObject *obj, const char *encoding, @@ -223,7 +223,7 @@ PyDoc_STRVAR(_codecs_escape_decode__doc__, "\n"); #define _CODECS_ESCAPE_DECODE_METHODDEF \ - {"escape_decode", (PyCFunction)(void(*)(void))_codecs_escape_decode, METH_FASTCALL, _codecs_escape_decode__doc__}, + {"escape_decode", _PyCFunction_CAST(_codecs_escape_decode), METH_FASTCALL, _codecs_escape_decode__doc__}, static PyObject * _codecs_escape_decode_impl(PyObject *module, Py_buffer *data, @@ -295,7 +295,7 @@ PyDoc_STRVAR(_codecs_escape_encode__doc__, "\n"); #define _CODECS_ESCAPE_ENCODE_METHODDEF \ - {"escape_encode", (PyCFunction)(void(*)(void))_codecs_escape_encode, METH_FASTCALL, _codecs_escape_encode__doc__}, + {"escape_encode", _PyCFunction_CAST(_codecs_escape_encode), METH_FASTCALL, _codecs_escape_encode__doc__}, static PyObject * _codecs_escape_encode_impl(PyObject *module, PyObject *data, @@ -350,7 +350,7 @@ PyDoc_STRVAR(_codecs_utf_7_decode__doc__, "\n"); #define _CODECS_UTF_7_DECODE_METHODDEF \ - {"utf_7_decode", (PyCFunction)(void(*)(void))_codecs_utf_7_decode, METH_FASTCALL, _codecs_utf_7_decode__doc__}, + {"utf_7_decode", _PyCFunction_CAST(_codecs_utf_7_decode), METH_FASTCALL, _codecs_utf_7_decode__doc__}, static PyObject * _codecs_utf_7_decode_impl(PyObject *module, Py_buffer *data, @@ -420,7 +420,7 @@ PyDoc_STRVAR(_codecs_utf_8_decode__doc__, "\n"); #define _CODECS_UTF_8_DECODE_METHODDEF \ - {"utf_8_decode", (PyCFunction)(void(*)(void))_codecs_utf_8_decode, METH_FASTCALL, _codecs_utf_8_decode__doc__}, + {"utf_8_decode", _PyCFunction_CAST(_codecs_utf_8_decode), METH_FASTCALL, _codecs_utf_8_decode__doc__}, static PyObject * _codecs_utf_8_decode_impl(PyObject *module, Py_buffer *data, @@ -490,7 +490,7 @@ PyDoc_STRVAR(_codecs_utf_16_decode__doc__, "\n"); #define _CODECS_UTF_16_DECODE_METHODDEF \ - {"utf_16_decode", (PyCFunction)(void(*)(void))_codecs_utf_16_decode, METH_FASTCALL, _codecs_utf_16_decode__doc__}, + {"utf_16_decode", _PyCFunction_CAST(_codecs_utf_16_decode), METH_FASTCALL, _codecs_utf_16_decode__doc__}, static PyObject * _codecs_utf_16_decode_impl(PyObject *module, Py_buffer *data, @@ -560,7 +560,7 @@ PyDoc_STRVAR(_codecs_utf_16_le_decode__doc__, "\n"); #define _CODECS_UTF_16_LE_DECODE_METHODDEF \ - {"utf_16_le_decode", (PyCFunction)(void(*)(void))_codecs_utf_16_le_decode, METH_FASTCALL, _codecs_utf_16_le_decode__doc__}, + {"utf_16_le_decode", _PyCFunction_CAST(_codecs_utf_16_le_decode), METH_FASTCALL, _codecs_utf_16_le_decode__doc__}, static PyObject * _codecs_utf_16_le_decode_impl(PyObject *module, Py_buffer *data, @@ -630,7 +630,7 @@ PyDoc_STRVAR(_codecs_utf_16_be_decode__doc__, "\n"); #define _CODECS_UTF_16_BE_DECODE_METHODDEF \ - {"utf_16_be_decode", (PyCFunction)(void(*)(void))_codecs_utf_16_be_decode, METH_FASTCALL, _codecs_utf_16_be_decode__doc__}, + {"utf_16_be_decode", _PyCFunction_CAST(_codecs_utf_16_be_decode), METH_FASTCALL, _codecs_utf_16_be_decode__doc__}, static PyObject * _codecs_utf_16_be_decode_impl(PyObject *module, Py_buffer *data, @@ -701,7 +701,7 @@ PyDoc_STRVAR(_codecs_utf_16_ex_decode__doc__, "\n"); #define _CODECS_UTF_16_EX_DECODE_METHODDEF \ - {"utf_16_ex_decode", (PyCFunction)(void(*)(void))_codecs_utf_16_ex_decode, METH_FASTCALL, _codecs_utf_16_ex_decode__doc__}, + {"utf_16_ex_decode", _PyCFunction_CAST(_codecs_utf_16_ex_decode), METH_FASTCALL, _codecs_utf_16_ex_decode__doc__}, static PyObject * _codecs_utf_16_ex_decode_impl(PyObject *module, Py_buffer *data, @@ -779,7 +779,7 @@ PyDoc_STRVAR(_codecs_utf_32_decode__doc__, "\n"); #define _CODECS_UTF_32_DECODE_METHODDEF \ - {"utf_32_decode", (PyCFunction)(void(*)(void))_codecs_utf_32_decode, METH_FASTCALL, _codecs_utf_32_decode__doc__}, + {"utf_32_decode", _PyCFunction_CAST(_codecs_utf_32_decode), METH_FASTCALL, _codecs_utf_32_decode__doc__}, static PyObject * _codecs_utf_32_decode_impl(PyObject *module, Py_buffer *data, @@ -849,7 +849,7 @@ PyDoc_STRVAR(_codecs_utf_32_le_decode__doc__, "\n"); #define _CODECS_UTF_32_LE_DECODE_METHODDEF \ - {"utf_32_le_decode", (PyCFunction)(void(*)(void))_codecs_utf_32_le_decode, METH_FASTCALL, _codecs_utf_32_le_decode__doc__}, + {"utf_32_le_decode", _PyCFunction_CAST(_codecs_utf_32_le_decode), METH_FASTCALL, _codecs_utf_32_le_decode__doc__}, static PyObject * _codecs_utf_32_le_decode_impl(PyObject *module, Py_buffer *data, @@ -919,7 +919,7 @@ PyDoc_STRVAR(_codecs_utf_32_be_decode__doc__, "\n"); #define _CODECS_UTF_32_BE_DECODE_METHODDEF \ - {"utf_32_be_decode", (PyCFunction)(void(*)(void))_codecs_utf_32_be_decode, METH_FASTCALL, _codecs_utf_32_be_decode__doc__}, + {"utf_32_be_decode", _PyCFunction_CAST(_codecs_utf_32_be_decode), METH_FASTCALL, _codecs_utf_32_be_decode__doc__}, static PyObject * _codecs_utf_32_be_decode_impl(PyObject *module, Py_buffer *data, @@ -990,7 +990,7 @@ PyDoc_STRVAR(_codecs_utf_32_ex_decode__doc__, "\n"); #define _CODECS_UTF_32_EX_DECODE_METHODDEF \ - {"utf_32_ex_decode", (PyCFunction)(void(*)(void))_codecs_utf_32_ex_decode, METH_FASTCALL, _codecs_utf_32_ex_decode__doc__}, + {"utf_32_ex_decode", _PyCFunction_CAST(_codecs_utf_32_ex_decode), METH_FASTCALL, _codecs_utf_32_ex_decode__doc__}, static PyObject * _codecs_utf_32_ex_decode_impl(PyObject *module, Py_buffer *data, @@ -1068,7 +1068,7 @@ PyDoc_STRVAR(_codecs_unicode_escape_decode__doc__, "\n"); #define _CODECS_UNICODE_ESCAPE_DECODE_METHODDEF \ - {"unicode_escape_decode", (PyCFunction)(void(*)(void))_codecs_unicode_escape_decode, METH_FASTCALL, _codecs_unicode_escape_decode__doc__}, + {"unicode_escape_decode", _PyCFunction_CAST(_codecs_unicode_escape_decode), METH_FASTCALL, _codecs_unicode_escape_decode__doc__}, static PyObject * _codecs_unicode_escape_decode_impl(PyObject *module, Py_buffer *data, @@ -1148,7 +1148,7 @@ PyDoc_STRVAR(_codecs_raw_unicode_escape_decode__doc__, "\n"); #define _CODECS_RAW_UNICODE_ESCAPE_DECODE_METHODDEF \ - {"raw_unicode_escape_decode", (PyCFunction)(void(*)(void))_codecs_raw_unicode_escape_decode, METH_FASTCALL, _codecs_raw_unicode_escape_decode__doc__}, + {"raw_unicode_escape_decode", _PyCFunction_CAST(_codecs_raw_unicode_escape_decode), METH_FASTCALL, _codecs_raw_unicode_escape_decode__doc__}, static PyObject * _codecs_raw_unicode_escape_decode_impl(PyObject *module, Py_buffer *data, @@ -1228,7 +1228,7 @@ PyDoc_STRVAR(_codecs_latin_1_decode__doc__, "\n"); #define _CODECS_LATIN_1_DECODE_METHODDEF \ - {"latin_1_decode", (PyCFunction)(void(*)(void))_codecs_latin_1_decode, METH_FASTCALL, _codecs_latin_1_decode__doc__}, + {"latin_1_decode", _PyCFunction_CAST(_codecs_latin_1_decode), METH_FASTCALL, _codecs_latin_1_decode__doc__}, static PyObject * _codecs_latin_1_decode_impl(PyObject *module, Py_buffer *data, @@ -1290,7 +1290,7 @@ PyDoc_STRVAR(_codecs_ascii_decode__doc__, "\n"); #define _CODECS_ASCII_DECODE_METHODDEF \ - {"ascii_decode", (PyCFunction)(void(*)(void))_codecs_ascii_decode, METH_FASTCALL, _codecs_ascii_decode__doc__}, + {"ascii_decode", _PyCFunction_CAST(_codecs_ascii_decode), METH_FASTCALL, _codecs_ascii_decode__doc__}, static PyObject * _codecs_ascii_decode_impl(PyObject *module, Py_buffer *data, @@ -1352,7 +1352,7 @@ PyDoc_STRVAR(_codecs_charmap_decode__doc__, "\n"); #define _CODECS_CHARMAP_DECODE_METHODDEF \ - {"charmap_decode", (PyCFunction)(void(*)(void))_codecs_charmap_decode, METH_FASTCALL, _codecs_charmap_decode__doc__}, + {"charmap_decode", _PyCFunction_CAST(_codecs_charmap_decode), METH_FASTCALL, _codecs_charmap_decode__doc__}, static PyObject * _codecs_charmap_decode_impl(PyObject *module, Py_buffer *data, @@ -1421,7 +1421,7 @@ PyDoc_STRVAR(_codecs_mbcs_decode__doc__, "\n"); #define _CODECS_MBCS_DECODE_METHODDEF \ - {"mbcs_decode", (PyCFunction)(void(*)(void))_codecs_mbcs_decode, METH_FASTCALL, _codecs_mbcs_decode__doc__}, + {"mbcs_decode", _PyCFunction_CAST(_codecs_mbcs_decode), METH_FASTCALL, _codecs_mbcs_decode__doc__}, static PyObject * _codecs_mbcs_decode_impl(PyObject *module, Py_buffer *data, @@ -1495,7 +1495,7 @@ PyDoc_STRVAR(_codecs_oem_decode__doc__, "\n"); #define _CODECS_OEM_DECODE_METHODDEF \ - {"oem_decode", (PyCFunction)(void(*)(void))_codecs_oem_decode, METH_FASTCALL, _codecs_oem_decode__doc__}, + {"oem_decode", _PyCFunction_CAST(_codecs_oem_decode), METH_FASTCALL, _codecs_oem_decode__doc__}, static PyObject * _codecs_oem_decode_impl(PyObject *module, Py_buffer *data, @@ -1569,7 +1569,7 @@ PyDoc_STRVAR(_codecs_code_page_decode__doc__, "\n"); #define _CODECS_CODE_PAGE_DECODE_METHODDEF \ - {"code_page_decode", (PyCFunction)(void(*)(void))_codecs_code_page_decode, METH_FASTCALL, _codecs_code_page_decode__doc__}, + {"code_page_decode", _PyCFunction_CAST(_codecs_code_page_decode), METH_FASTCALL, _codecs_code_page_decode__doc__}, static PyObject * _codecs_code_page_decode_impl(PyObject *module, int codepage, @@ -1646,7 +1646,7 @@ PyDoc_STRVAR(_codecs_readbuffer_encode__doc__, "\n"); #define _CODECS_READBUFFER_ENCODE_METHODDEF \ - {"readbuffer_encode", (PyCFunction)(void(*)(void))_codecs_readbuffer_encode, METH_FASTCALL, _codecs_readbuffer_encode__doc__}, + {"readbuffer_encode", _PyCFunction_CAST(_codecs_readbuffer_encode), METH_FASTCALL, _codecs_readbuffer_encode__doc__}, static PyObject * _codecs_readbuffer_encode_impl(PyObject *module, Py_buffer *data, @@ -1718,7 +1718,7 @@ PyDoc_STRVAR(_codecs_utf_7_encode__doc__, "\n"); #define _CODECS_UTF_7_ENCODE_METHODDEF \ - {"utf_7_encode", (PyCFunction)(void(*)(void))_codecs_utf_7_encode, METH_FASTCALL, _codecs_utf_7_encode__doc__}, + {"utf_7_encode", _PyCFunction_CAST(_codecs_utf_7_encode), METH_FASTCALL, _codecs_utf_7_encode__doc__}, static PyObject * _codecs_utf_7_encode_impl(PyObject *module, PyObject *str, @@ -1776,7 +1776,7 @@ PyDoc_STRVAR(_codecs_utf_8_encode__doc__, "\n"); #define _CODECS_UTF_8_ENCODE_METHODDEF \ - {"utf_8_encode", (PyCFunction)(void(*)(void))_codecs_utf_8_encode, METH_FASTCALL, _codecs_utf_8_encode__doc__}, + {"utf_8_encode", _PyCFunction_CAST(_codecs_utf_8_encode), METH_FASTCALL, _codecs_utf_8_encode__doc__}, static PyObject * _codecs_utf_8_encode_impl(PyObject *module, PyObject *str, @@ -1834,7 +1834,7 @@ PyDoc_STRVAR(_codecs_utf_16_encode__doc__, "\n"); #define _CODECS_UTF_16_ENCODE_METHODDEF \ - {"utf_16_encode", (PyCFunction)(void(*)(void))_codecs_utf_16_encode, METH_FASTCALL, _codecs_utf_16_encode__doc__}, + {"utf_16_encode", _PyCFunction_CAST(_codecs_utf_16_encode), METH_FASTCALL, _codecs_utf_16_encode__doc__}, static PyObject * _codecs_utf_16_encode_impl(PyObject *module, PyObject *str, @@ -1900,7 +1900,7 @@ PyDoc_STRVAR(_codecs_utf_16_le_encode__doc__, "\n"); #define _CODECS_UTF_16_LE_ENCODE_METHODDEF \ - {"utf_16_le_encode", (PyCFunction)(void(*)(void))_codecs_utf_16_le_encode, METH_FASTCALL, _codecs_utf_16_le_encode__doc__}, + {"utf_16_le_encode", _PyCFunction_CAST(_codecs_utf_16_le_encode), METH_FASTCALL, _codecs_utf_16_le_encode__doc__}, static PyObject * _codecs_utf_16_le_encode_impl(PyObject *module, PyObject *str, @@ -1958,7 +1958,7 @@ PyDoc_STRVAR(_codecs_utf_16_be_encode__doc__, "\n"); #define _CODECS_UTF_16_BE_ENCODE_METHODDEF \ - {"utf_16_be_encode", (PyCFunction)(void(*)(void))_codecs_utf_16_be_encode, METH_FASTCALL, _codecs_utf_16_be_encode__doc__}, + {"utf_16_be_encode", _PyCFunction_CAST(_codecs_utf_16_be_encode), METH_FASTCALL, _codecs_utf_16_be_encode__doc__}, static PyObject * _codecs_utf_16_be_encode_impl(PyObject *module, PyObject *str, @@ -2016,7 +2016,7 @@ PyDoc_STRVAR(_codecs_utf_32_encode__doc__, "\n"); #define _CODECS_UTF_32_ENCODE_METHODDEF \ - {"utf_32_encode", (PyCFunction)(void(*)(void))_codecs_utf_32_encode, METH_FASTCALL, _codecs_utf_32_encode__doc__}, + {"utf_32_encode", _PyCFunction_CAST(_codecs_utf_32_encode), METH_FASTCALL, _codecs_utf_32_encode__doc__}, static PyObject * _codecs_utf_32_encode_impl(PyObject *module, PyObject *str, @@ -2082,7 +2082,7 @@ PyDoc_STRVAR(_codecs_utf_32_le_encode__doc__, "\n"); #define _CODECS_UTF_32_LE_ENCODE_METHODDEF \ - {"utf_32_le_encode", (PyCFunction)(void(*)(void))_codecs_utf_32_le_encode, METH_FASTCALL, _codecs_utf_32_le_encode__doc__}, + {"utf_32_le_encode", _PyCFunction_CAST(_codecs_utf_32_le_encode), METH_FASTCALL, _codecs_utf_32_le_encode__doc__}, static PyObject * _codecs_utf_32_le_encode_impl(PyObject *module, PyObject *str, @@ -2140,7 +2140,7 @@ PyDoc_STRVAR(_codecs_utf_32_be_encode__doc__, "\n"); #define _CODECS_UTF_32_BE_ENCODE_METHODDEF \ - {"utf_32_be_encode", (PyCFunction)(void(*)(void))_codecs_utf_32_be_encode, METH_FASTCALL, _codecs_utf_32_be_encode__doc__}, + {"utf_32_be_encode", _PyCFunction_CAST(_codecs_utf_32_be_encode), METH_FASTCALL, _codecs_utf_32_be_encode__doc__}, static PyObject * _codecs_utf_32_be_encode_impl(PyObject *module, PyObject *str, @@ -2198,7 +2198,7 @@ PyDoc_STRVAR(_codecs_unicode_escape_encode__doc__, "\n"); #define _CODECS_UNICODE_ESCAPE_ENCODE_METHODDEF \ - {"unicode_escape_encode", (PyCFunction)(void(*)(void))_codecs_unicode_escape_encode, METH_FASTCALL, _codecs_unicode_escape_encode__doc__}, + {"unicode_escape_encode", _PyCFunction_CAST(_codecs_unicode_escape_encode), METH_FASTCALL, _codecs_unicode_escape_encode__doc__}, static PyObject * _codecs_unicode_escape_encode_impl(PyObject *module, PyObject *str, @@ -2256,7 +2256,7 @@ PyDoc_STRVAR(_codecs_raw_unicode_escape_encode__doc__, "\n"); #define _CODECS_RAW_UNICODE_ESCAPE_ENCODE_METHODDEF \ - {"raw_unicode_escape_encode", (PyCFunction)(void(*)(void))_codecs_raw_unicode_escape_encode, METH_FASTCALL, _codecs_raw_unicode_escape_encode__doc__}, + {"raw_unicode_escape_encode", _PyCFunction_CAST(_codecs_raw_unicode_escape_encode), METH_FASTCALL, _codecs_raw_unicode_escape_encode__doc__}, static PyObject * _codecs_raw_unicode_escape_encode_impl(PyObject *module, PyObject *str, @@ -2314,7 +2314,7 @@ PyDoc_STRVAR(_codecs_latin_1_encode__doc__, "\n"); #define _CODECS_LATIN_1_ENCODE_METHODDEF \ - {"latin_1_encode", (PyCFunction)(void(*)(void))_codecs_latin_1_encode, METH_FASTCALL, _codecs_latin_1_encode__doc__}, + {"latin_1_encode", _PyCFunction_CAST(_codecs_latin_1_encode), METH_FASTCALL, _codecs_latin_1_encode__doc__}, static PyObject * _codecs_latin_1_encode_impl(PyObject *module, PyObject *str, @@ -2372,7 +2372,7 @@ PyDoc_STRVAR(_codecs_ascii_encode__doc__, "\n"); #define _CODECS_ASCII_ENCODE_METHODDEF \ - {"ascii_encode", (PyCFunction)(void(*)(void))_codecs_ascii_encode, METH_FASTCALL, _codecs_ascii_encode__doc__}, + {"ascii_encode", _PyCFunction_CAST(_codecs_ascii_encode), METH_FASTCALL, _codecs_ascii_encode__doc__}, static PyObject * _codecs_ascii_encode_impl(PyObject *module, PyObject *str, @@ -2430,7 +2430,7 @@ PyDoc_STRVAR(_codecs_charmap_encode__doc__, "\n"); #define _CODECS_CHARMAP_ENCODE_METHODDEF \ - {"charmap_encode", (PyCFunction)(void(*)(void))_codecs_charmap_encode, METH_FASTCALL, _codecs_charmap_encode__doc__}, + {"charmap_encode", _PyCFunction_CAST(_codecs_charmap_encode), METH_FASTCALL, _codecs_charmap_encode__doc__}, static PyObject * _codecs_charmap_encode_impl(PyObject *module, PyObject *str, @@ -2526,7 +2526,7 @@ PyDoc_STRVAR(_codecs_mbcs_encode__doc__, "\n"); #define _CODECS_MBCS_ENCODE_METHODDEF \ - {"mbcs_encode", (PyCFunction)(void(*)(void))_codecs_mbcs_encode, METH_FASTCALL, _codecs_mbcs_encode__doc__}, + {"mbcs_encode", _PyCFunction_CAST(_codecs_mbcs_encode), METH_FASTCALL, _codecs_mbcs_encode__doc__}, static PyObject * _codecs_mbcs_encode_impl(PyObject *module, PyObject *str, const char *errors); @@ -2587,7 +2587,7 @@ PyDoc_STRVAR(_codecs_oem_encode__doc__, "\n"); #define _CODECS_OEM_ENCODE_METHODDEF \ - {"oem_encode", (PyCFunction)(void(*)(void))_codecs_oem_encode, METH_FASTCALL, _codecs_oem_encode__doc__}, + {"oem_encode", _PyCFunction_CAST(_codecs_oem_encode), METH_FASTCALL, _codecs_oem_encode__doc__}, static PyObject * _codecs_oem_encode_impl(PyObject *module, PyObject *str, const char *errors); @@ -2648,7 +2648,7 @@ PyDoc_STRVAR(_codecs_code_page_encode__doc__, "\n"); #define _CODECS_CODE_PAGE_ENCODE_METHODDEF \ - {"code_page_encode", (PyCFunction)(void(*)(void))_codecs_code_page_encode, METH_FASTCALL, _codecs_code_page_encode__doc__}, + {"code_page_encode", _PyCFunction_CAST(_codecs_code_page_encode), METH_FASTCALL, _codecs_code_page_encode__doc__}, static PyObject * _codecs_code_page_encode_impl(PyObject *module, int code_page, PyObject *str, @@ -2718,7 +2718,7 @@ PyDoc_STRVAR(_codecs_register_error__doc__, "error and must return a (replacement, new position) tuple."); #define _CODECS_REGISTER_ERROR_METHODDEF \ - {"register_error", (PyCFunction)(void(*)(void))_codecs_register_error, METH_FASTCALL, _codecs_register_error__doc__}, + {"register_error", _PyCFunction_CAST(_codecs_register_error), METH_FASTCALL, _codecs_register_error__doc__}, static PyObject * _codecs_register_error_impl(PyObject *module, const char *errors, @@ -2817,4 +2817,4 @@ _codecs_lookup_error(PyObject *module, PyObject *arg) #ifndef _CODECS_CODE_PAGE_ENCODE_METHODDEF #define _CODECS_CODE_PAGE_ENCODE_METHODDEF #endif /* !defined(_CODECS_CODE_PAGE_ENCODE_METHODDEF) */ -/*[clinic end generated code: output=814dae36b6f885cb input=a9049054013a1b77]*/ +/*[clinic end generated code: output=92250568c3a6f0a0 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_collectionsmodule.c.h b/Modules/clinic/_collectionsmodule.c.h index 2875b3cd26628..e53acd6afb446 100644 --- a/Modules/clinic/_collectionsmodule.c.h +++ b/Modules/clinic/_collectionsmodule.c.h @@ -9,7 +9,7 @@ PyDoc_STRVAR(_collections__count_elements__doc__, "Count elements in the iterable, updating the mapping"); #define _COLLECTIONS__COUNT_ELEMENTS_METHODDEF \ - {"_count_elements", (PyCFunction)(void(*)(void))_collections__count_elements, METH_FASTCALL, _collections__count_elements__doc__}, + {"_count_elements", _PyCFunction_CAST(_collections__count_elements), METH_FASTCALL, _collections__count_elements__doc__}, static PyObject * _collections__count_elements_impl(PyObject *module, PyObject *mapping, @@ -69,4 +69,4 @@ tuplegetter_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) exit: return return_value; } -/*[clinic end generated code: output=3dfa12a35e655844 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=36b0948c4676c831 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_cryptmodule.c.h b/Modules/clinic/_cryptmodule.c.h index ea91d7c130b8c..401d04623e43c 100644 --- a/Modules/clinic/_cryptmodule.c.h +++ b/Modules/clinic/_cryptmodule.c.h @@ -14,7 +14,7 @@ PyDoc_STRVAR(crypt_crypt__doc__, "results for a given *word*."); #define CRYPT_CRYPT_METHODDEF \ - {"crypt", (PyCFunction)(void(*)(void))crypt_crypt, METH_FASTCALL, crypt_crypt__doc__}, + {"crypt", _PyCFunction_CAST(crypt_crypt), METH_FASTCALL, crypt_crypt__doc__}, static PyObject * crypt_crypt_impl(PyObject *module, const char *word, const char *salt); @@ -60,4 +60,4 @@ crypt_crypt(PyObject *module, PyObject *const *args, Py_ssize_t nargs) exit: return return_value; } -/*[clinic end generated code: output=549de0d43b030126 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=6f61ab29e361f9d0 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_csv.c.h b/Modules/clinic/_csv.c.h index 41c0cdde7482a..ae5dec74a173e 100644 --- a/Modules/clinic/_csv.c.h +++ b/Modules/clinic/_csv.c.h @@ -31,7 +31,7 @@ PyDoc_STRVAR(_csv_unregister_dialect__doc__, " csv.unregister_dialect(name)"); #define _CSV_UNREGISTER_DIALECT_METHODDEF \ - {"unregister_dialect", (PyCFunction)(void(*)(void))_csv_unregister_dialect, METH_FASTCALL|METH_KEYWORDS, _csv_unregister_dialect__doc__}, + {"unregister_dialect", _PyCFunction_CAST(_csv_unregister_dialect), METH_FASTCALL|METH_KEYWORDS, _csv_unregister_dialect__doc__}, static PyObject * _csv_unregister_dialect_impl(PyObject *module, PyObject *name); @@ -65,7 +65,7 @@ PyDoc_STRVAR(_csv_get_dialect__doc__, " dialect = csv.get_dialect(name)"); #define _CSV_GET_DIALECT_METHODDEF \ - {"get_dialect", (PyCFunction)(void(*)(void))_csv_get_dialect, METH_FASTCALL|METH_KEYWORDS, _csv_get_dialect__doc__}, + {"get_dialect", _PyCFunction_CAST(_csv_get_dialect), METH_FASTCALL|METH_KEYWORDS, _csv_get_dialect__doc__}, static PyObject * _csv_get_dialect_impl(PyObject *module, PyObject *name); @@ -102,7 +102,7 @@ PyDoc_STRVAR(_csv_field_size_limit__doc__, "the old limit is returned"); #define _CSV_FIELD_SIZE_LIMIT_METHODDEF \ - {"field_size_limit", (PyCFunction)(void(*)(void))_csv_field_size_limit, METH_FASTCALL|METH_KEYWORDS, _csv_field_size_limit__doc__}, + {"field_size_limit", _PyCFunction_CAST(_csv_field_size_limit), METH_FASTCALL|METH_KEYWORDS, _csv_field_size_limit__doc__}, static PyObject * _csv_field_size_limit_impl(PyObject *module, PyObject *new_limit); @@ -131,4 +131,4 @@ _csv_field_size_limit(PyObject *module, PyObject *const *args, Py_ssize_t nargs, exit: return return_value; } -/*[clinic end generated code: output=d51f3c42e9b88802 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=6235abc491b02188 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_curses_panel.c.h b/Modules/clinic/_curses_panel.c.h index e4642b58332de..31101c1011ccd 100644 --- a/Modules/clinic/_curses_panel.c.h +++ b/Modules/clinic/_curses_panel.c.h @@ -9,7 +9,7 @@ PyDoc_STRVAR(_curses_panel_panel_bottom__doc__, "Push the panel to the bottom of the stack."); #define _CURSES_PANEL_PANEL_BOTTOM_METHODDEF \ - {"bottom", (PyCFunction)(void(*)(void))_curses_panel_panel_bottom, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _curses_panel_panel_bottom__doc__}, + {"bottom", _PyCFunction_CAST(_curses_panel_panel_bottom), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _curses_panel_panel_bottom__doc__}, static PyObject * _curses_panel_panel_bottom_impl(PyCursesPanelObject *self, PyTypeObject *cls); @@ -33,7 +33,7 @@ PyDoc_STRVAR(_curses_panel_panel_hide__doc__, "This does not delete the object, it just makes the window on screen invisible."); #define _CURSES_PANEL_PANEL_HIDE_METHODDEF \ - {"hide", (PyCFunction)(void(*)(void))_curses_panel_panel_hide, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _curses_panel_panel_hide__doc__}, + {"hide", _PyCFunction_CAST(_curses_panel_panel_hide), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _curses_panel_panel_hide__doc__}, static PyObject * _curses_panel_panel_hide_impl(PyCursesPanelObject *self, PyTypeObject *cls); @@ -55,7 +55,7 @@ PyDoc_STRVAR(_curses_panel_panel_show__doc__, "Display the panel (which might have been hidden)."); #define _CURSES_PANEL_PANEL_SHOW_METHODDEF \ - {"show", (PyCFunction)(void(*)(void))_curses_panel_panel_show, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _curses_panel_panel_show__doc__}, + {"show", _PyCFunction_CAST(_curses_panel_panel_show), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _curses_panel_panel_show__doc__}, static PyObject * _curses_panel_panel_show_impl(PyCursesPanelObject *self, PyTypeObject *cls); @@ -77,7 +77,7 @@ PyDoc_STRVAR(_curses_panel_panel_top__doc__, "Push panel to the top of the stack."); #define _CURSES_PANEL_PANEL_TOP_METHODDEF \ - {"top", (PyCFunction)(void(*)(void))_curses_panel_panel_top, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _curses_panel_panel_top__doc__}, + {"top", _PyCFunction_CAST(_curses_panel_panel_top), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _curses_panel_panel_top__doc__}, static PyObject * _curses_panel_panel_top_impl(PyCursesPanelObject *self, PyTypeObject *cls); @@ -153,7 +153,7 @@ PyDoc_STRVAR(_curses_panel_panel_move__doc__, "Move the panel to the screen coordinates (y, x)."); #define _CURSES_PANEL_PANEL_MOVE_METHODDEF \ - {"move", (PyCFunction)(void(*)(void))_curses_panel_panel_move, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _curses_panel_panel_move__doc__}, + {"move", _PyCFunction_CAST(_curses_panel_panel_move), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _curses_panel_panel_move__doc__}, static PyObject * _curses_panel_panel_move_impl(PyCursesPanelObject *self, PyTypeObject *cls, @@ -212,7 +212,7 @@ PyDoc_STRVAR(_curses_panel_panel_replace__doc__, "Change the window associated with the panel to the window win."); #define _CURSES_PANEL_PANEL_REPLACE_METHODDEF \ - {"replace", (PyCFunction)(void(*)(void))_curses_panel_panel_replace, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _curses_panel_panel_replace__doc__}, + {"replace", _PyCFunction_CAST(_curses_panel_panel_replace), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _curses_panel_panel_replace__doc__}, static PyObject * _curses_panel_panel_replace_impl(PyCursesPanelObject *self, @@ -250,7 +250,7 @@ PyDoc_STRVAR(_curses_panel_panel_set_userptr__doc__, "Set the panel\'s user pointer to obj."); #define _CURSES_PANEL_PANEL_SET_USERPTR_METHODDEF \ - {"set_userptr", (PyCFunction)(void(*)(void))_curses_panel_panel_set_userptr, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _curses_panel_panel_set_userptr__doc__}, + {"set_userptr", _PyCFunction_CAST(_curses_panel_panel_set_userptr), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _curses_panel_panel_set_userptr__doc__}, static PyObject * _curses_panel_panel_set_userptr_impl(PyCursesPanelObject *self, @@ -283,7 +283,7 @@ PyDoc_STRVAR(_curses_panel_panel_userptr__doc__, "Return the user pointer for the panel."); #define _CURSES_PANEL_PANEL_USERPTR_METHODDEF \ - {"userptr", (PyCFunction)(void(*)(void))_curses_panel_panel_userptr, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _curses_panel_panel_userptr__doc__}, + {"userptr", _PyCFunction_CAST(_curses_panel_panel_userptr), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _curses_panel_panel_userptr__doc__}, static PyObject * _curses_panel_panel_userptr_impl(PyCursesPanelObject *self, @@ -383,4 +383,4 @@ _curses_panel_update_panels(PyObject *module, PyObject *Py_UNUSED(ignored)) { return _curses_panel_update_panels_impl(module); } -/*[clinic end generated code: output=c552457e8067bb0a input=a9049054013a1b77]*/ +/*[clinic end generated code: output=c471aed62bc31e79 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_cursesmodule.c.h b/Modules/clinic/_cursesmodule.c.h index 9c9611685b78e..c7d1eca6559b6 100644 --- a/Modules/clinic/_cursesmodule.c.h +++ b/Modules/clinic/_cursesmodule.c.h @@ -233,7 +233,7 @@ PyDoc_STRVAR(_curses_window_bkgd__doc__, " Background attributes."); #define _CURSES_WINDOW_BKGD_METHODDEF \ - {"bkgd", (PyCFunction)(void(*)(void))_curses_window_bkgd, METH_FASTCALL, _curses_window_bkgd__doc__}, + {"bkgd", _PyCFunction_CAST(_curses_window_bkgd), METH_FASTCALL, _curses_window_bkgd__doc__}, static PyObject * _curses_window_bkgd_impl(PyCursesWindowObject *self, PyObject *ch, long attr); @@ -359,7 +359,7 @@ PyDoc_STRVAR(_curses_window_bkgdset__doc__, " Background attributes."); #define _CURSES_WINDOW_BKGDSET_METHODDEF \ - {"bkgdset", (PyCFunction)(void(*)(void))_curses_window_bkgdset, METH_FASTCALL, _curses_window_bkgdset__doc__}, + {"bkgdset", _PyCFunction_CAST(_curses_window_bkgdset), METH_FASTCALL, _curses_window_bkgdset__doc__}, static PyObject * _curses_window_bkgdset_impl(PyCursesWindowObject *self, PyObject *ch, @@ -422,7 +422,7 @@ PyDoc_STRVAR(_curses_window_border__doc__, "used for that parameter."); #define _CURSES_WINDOW_BORDER_METHODDEF \ - {"border", (PyCFunction)(void(*)(void))_curses_window_border, METH_FASTCALL, _curses_window_border__doc__}, + {"border", _PyCFunction_CAST(_curses_window_border), METH_FASTCALL, _curses_window_border__doc__}, static PyObject * _curses_window_border_impl(PyCursesWindowObject *self, PyObject *ls, @@ -642,7 +642,7 @@ PyDoc_STRVAR(_curses_window_echochar__doc__, " Attributes for the character."); #define _CURSES_WINDOW_ECHOCHAR_METHODDEF \ - {"echochar", (PyCFunction)(void(*)(void))_curses_window_echochar, METH_FASTCALL, _curses_window_echochar__doc__}, + {"echochar", _PyCFunction_CAST(_curses_window_echochar), METH_FASTCALL, _curses_window_echochar__doc__}, static PyObject * _curses_window_echochar_impl(PyCursesWindowObject *self, PyObject *ch, @@ -687,7 +687,7 @@ PyDoc_STRVAR(_curses_window_enclose__doc__, " X-coordinate."); #define _CURSES_WINDOW_ENCLOSE_METHODDEF \ - {"enclose", (PyCFunction)(void(*)(void))_curses_window_enclose, METH_FASTCALL, _curses_window_enclose__doc__}, + {"enclose", _PyCFunction_CAST(_curses_window_enclose), METH_FASTCALL, _curses_window_enclose__doc__}, static PyObject * _curses_window_enclose_impl(PyCursesWindowObject *self, int y, int x); @@ -1487,7 +1487,7 @@ PyDoc_STRVAR(_curses_window_redrawln__doc__, "They should be completely redrawn on the next refresh() call."); #define _CURSES_WINDOW_REDRAWLN_METHODDEF \ - {"redrawln", (PyCFunction)(void(*)(void))_curses_window_redrawln, METH_FASTCALL, _curses_window_redrawln__doc__}, + {"redrawln", _PyCFunction_CAST(_curses_window_redrawln), METH_FASTCALL, _curses_window_redrawln__doc__}, static PyObject * _curses_window_redrawln_impl(PyCursesWindowObject *self, int beg, int num); @@ -1585,7 +1585,7 @@ PyDoc_STRVAR(_curses_window_setscrreg__doc__, "All scrolling actions will take place in this region."); #define _CURSES_WINDOW_SETSCRREG_METHODDEF \ - {"setscrreg", (PyCFunction)(void(*)(void))_curses_window_setscrreg, METH_FASTCALL, _curses_window_setscrreg__doc__}, + {"setscrreg", _PyCFunction_CAST(_curses_window_setscrreg), METH_FASTCALL, _curses_window_setscrreg__doc__}, static PyObject * _curses_window_setscrreg_impl(PyCursesWindowObject *self, int top, @@ -1918,7 +1918,7 @@ PyDoc_STRVAR(_curses_cbreak__doc__, "Calling first raw() then cbreak() leaves the terminal in cbreak mode."); #define _CURSES_CBREAK_METHODDEF \ - {"cbreak", (PyCFunction)(void(*)(void))_curses_cbreak, METH_FASTCALL, _curses_cbreak__doc__}, + {"cbreak", _PyCFunction_CAST(_curses_cbreak), METH_FASTCALL, _curses_cbreak__doc__}, static PyObject * _curses_cbreak_impl(PyObject *module, int flag); @@ -2154,7 +2154,7 @@ PyDoc_STRVAR(_curses_echo__doc__, "In echo mode, each character input is echoed to the screen as it is entered."); #define _CURSES_ECHO_METHODDEF \ - {"echo", (PyCFunction)(void(*)(void))_curses_echo, METH_FASTCALL, _curses_echo__doc__}, + {"echo", _PyCFunction_CAST(_curses_echo), METH_FASTCALL, _curses_echo__doc__}, static PyObject * _curses_echo_impl(PyObject *module, int flag); @@ -2319,7 +2319,7 @@ PyDoc_STRVAR(_curses_ungetmouse__doc__, "The following getmouse() will return the given state data."); #define _CURSES_UNGETMOUSE_METHODDEF \ - {"ungetmouse", (PyCFunction)(void(*)(void))_curses_ungetmouse, METH_FASTCALL, _curses_ungetmouse__doc__}, + {"ungetmouse", _PyCFunction_CAST(_curses_ungetmouse), METH_FASTCALL, _curses_ungetmouse__doc__}, static PyObject * _curses_ungetmouse_impl(PyObject *module, short id, int x, int y, int z, @@ -2551,7 +2551,7 @@ PyDoc_STRVAR(_curses_init_color__doc__, "most terminals; it is active only if can_change_color() returns true."); #define _CURSES_INIT_COLOR_METHODDEF \ - {"init_color", (PyCFunction)(void(*)(void))_curses_init_color, METH_FASTCALL, _curses_init_color__doc__}, + {"init_color", _PyCFunction_CAST(_curses_init_color), METH_FASTCALL, _curses_init_color__doc__}, static PyObject * _curses_init_color_impl(PyObject *module, int color_number, short r, short g, @@ -2604,7 +2604,7 @@ PyDoc_STRVAR(_curses_init_pair__doc__, "all occurrences of that color-pair are changed to the new definition."); #define _CURSES_INIT_PAIR_METHODDEF \ - {"init_pair", (PyCFunction)(void(*)(void))_curses_init_pair, METH_FASTCALL, _curses_init_pair__doc__}, + {"init_pair", _PyCFunction_CAST(_curses_init_pair), METH_FASTCALL, _curses_init_pair__doc__}, static PyObject * _curses_init_pair_impl(PyObject *module, int pair_number, int fg, int bg); @@ -2669,7 +2669,7 @@ PyDoc_STRVAR(_curses_setupterm__doc__, " If not supplied, the file descriptor for sys.stdout will be used."); #define _CURSES_SETUPTERM_METHODDEF \ - {"setupterm", (PyCFunction)(void(*)(void))_curses_setupterm, METH_FASTCALL|METH_KEYWORDS, _curses_setupterm__doc__}, + {"setupterm", _PyCFunction_CAST(_curses_setupterm), METH_FASTCALL|METH_KEYWORDS, _curses_setupterm__doc__}, static PyObject * _curses_setupterm_impl(PyObject *module, const char *term, int fd); @@ -2913,7 +2913,7 @@ PyDoc_STRVAR(_curses_is_term_resized__doc__, " Width."); #define _CURSES_IS_TERM_RESIZED_METHODDEF \ - {"is_term_resized", (PyCFunction)(void(*)(void))_curses_is_term_resized, METH_FASTCALL, _curses_is_term_resized__doc__}, + {"is_term_resized", _PyCFunction_CAST(_curses_is_term_resized), METH_FASTCALL, _curses_is_term_resized__doc__}, static PyObject * _curses_is_term_resized_impl(PyObject *module, int nlines, int ncols); @@ -3165,7 +3165,7 @@ PyDoc_STRVAR(_curses_newpad__doc__, " Width."); #define _CURSES_NEWPAD_METHODDEF \ - {"newpad", (PyCFunction)(void(*)(void))_curses_newpad, METH_FASTCALL, _curses_newpad__doc__}, + {"newpad", _PyCFunction_CAST(_curses_newpad), METH_FASTCALL, _curses_newpad__doc__}, static PyObject * _curses_newpad_impl(PyObject *module, int nlines, int ncols); @@ -3262,7 +3262,7 @@ PyDoc_STRVAR(_curses_nl__doc__, "newline into return and line-feed on output. Newline mode is initially on."); #define _CURSES_NL_METHODDEF \ - {"nl", (PyCFunction)(void(*)(void))_curses_nl, METH_FASTCALL, _curses_nl__doc__}, + {"nl", _PyCFunction_CAST(_curses_nl), METH_FASTCALL, _curses_nl__doc__}, static PyObject * _curses_nl_impl(PyObject *module, int flag); @@ -3494,7 +3494,7 @@ PyDoc_STRVAR(_curses_qiflush__doc__, "will be flushed when the INTR, QUIT and SUSP characters are read."); #define _CURSES_QIFLUSH_METHODDEF \ - {"qiflush", (PyCFunction)(void(*)(void))_curses_qiflush, METH_FASTCALL, _curses_qiflush__doc__}, + {"qiflush", _PyCFunction_CAST(_curses_qiflush), METH_FASTCALL, _curses_qiflush__doc__}, static PyObject * _curses_qiflush_impl(PyObject *module, int flag); @@ -3557,7 +3557,7 @@ PyDoc_STRVAR(_curses_raw__doc__, "curses input functions one by one."); #define _CURSES_RAW_METHODDEF \ - {"raw", (PyCFunction)(void(*)(void))_curses_raw, METH_FASTCALL, _curses_raw__doc__}, + {"raw", _PyCFunction_CAST(_curses_raw), METH_FASTCALL, _curses_raw__doc__}, static PyObject * _curses_raw_impl(PyObject *module, int flag); @@ -3656,7 +3656,7 @@ PyDoc_STRVAR(_curses_resizeterm__doc__, "window dimensions (in particular the SIGWINCH handler)."); #define _CURSES_RESIZETERM_METHODDEF \ - {"resizeterm", (PyCFunction)(void(*)(void))_curses_resizeterm, METH_FASTCALL, _curses_resizeterm__doc__}, + {"resizeterm", _PyCFunction_CAST(_curses_resizeterm), METH_FASTCALL, _curses_resizeterm__doc__}, static PyObject * _curses_resizeterm_impl(PyObject *module, int nlines, int ncols); @@ -3707,7 +3707,7 @@ PyDoc_STRVAR(_curses_resize_term__doc__, "without additional interaction with the application."); #define _CURSES_RESIZE_TERM_METHODDEF \ - {"resize_term", (PyCFunction)(void(*)(void))_curses_resize_term, METH_FASTCALL, _curses_resize_term__doc__}, + {"resize_term", _PyCFunction_CAST(_curses_resize_term), METH_FASTCALL, _curses_resize_term__doc__}, static PyObject * _curses_resize_term_impl(PyObject *module, int nlines, int ncols); @@ -3772,7 +3772,7 @@ PyDoc_STRVAR(_curses_setsyx__doc__, "If y and x are both -1, then leaveok is set."); #define _CURSES_SETSYX_METHODDEF \ - {"setsyx", (PyCFunction)(void(*)(void))_curses_setsyx, METH_FASTCALL, _curses_setsyx__doc__}, + {"setsyx", _PyCFunction_CAST(_curses_setsyx), METH_FASTCALL, _curses_setsyx__doc__}, static PyObject * _curses_setsyx_impl(PyObject *module, int y, int x); @@ -4004,7 +4004,7 @@ PyDoc_STRVAR(_curses_tparm__doc__, " Parameterized byte string obtained from the terminfo database."); #define _CURSES_TPARM_METHODDEF \ - {"tparm", (PyCFunction)(void(*)(void))_curses_tparm, METH_FASTCALL, _curses_tparm__doc__}, + {"tparm", _PyCFunction_CAST(_curses_tparm), METH_FASTCALL, _curses_tparm__doc__}, static PyObject * _curses_tparm_impl(PyObject *module, const char *str, int i1, int i2, int i3, @@ -4284,4 +4284,4 @@ _curses_has_extended_color_support(PyObject *module, PyObject *Py_UNUSED(ignored #ifndef _CURSES_USE_DEFAULT_COLORS_METHODDEF #define _CURSES_USE_DEFAULT_COLORS_METHODDEF #endif /* !defined(_CURSES_USE_DEFAULT_COLORS_METHODDEF) */ -/*[clinic end generated code: output=9efc9943a3ac3741 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=1e2a8a160a0fe811 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_datetimemodule.c.h b/Modules/clinic/_datetimemodule.c.h index 7bd7c1986dc7b..31d2f75f7a86a 100644 --- a/Modules/clinic/_datetimemodule.c.h +++ b/Modules/clinic/_datetimemodule.c.h @@ -65,7 +65,7 @@ PyDoc_STRVAR(datetime_datetime_now__doc__, "If no tz is specified, uses local timezone."); #define DATETIME_DATETIME_NOW_METHODDEF \ - {"now", (PyCFunction)(void(*)(void))datetime_datetime_now, METH_FASTCALL|METH_KEYWORDS|METH_CLASS, datetime_datetime_now__doc__}, + {"now", _PyCFunction_CAST(datetime_datetime_now), METH_FASTCALL|METH_KEYWORDS|METH_CLASS, datetime_datetime_now__doc__}, static PyObject * datetime_datetime_now_impl(PyTypeObject *type, PyObject *tz); @@ -94,4 +94,4 @@ datetime_datetime_now(PyTypeObject *type, PyObject *const *args, Py_ssize_t narg exit: return return_value; } -/*[clinic end generated code: output=f61310936e3d8091 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=1a3da7479e443e17 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_dbmmodule.c.h b/Modules/clinic/_dbmmodule.c.h index a8b41607221f6..8157716a94081 100644 --- a/Modules/clinic/_dbmmodule.c.h +++ b/Modules/clinic/_dbmmodule.c.h @@ -27,7 +27,7 @@ PyDoc_STRVAR(_dbm_dbm_keys__doc__, "Return a list of all keys in the database."); #define _DBM_DBM_KEYS_METHODDEF \ - {"keys", (PyCFunction)(void(*)(void))_dbm_dbm_keys, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _dbm_dbm_keys__doc__}, + {"keys", _PyCFunction_CAST(_dbm_dbm_keys), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _dbm_dbm_keys__doc__}, static PyObject * _dbm_dbm_keys_impl(dbmobject *self, PyTypeObject *cls); @@ -49,7 +49,7 @@ PyDoc_STRVAR(_dbm_dbm_get__doc__, "Return the value for key if present, otherwise default."); #define _DBM_DBM_GET_METHODDEF \ - {"get", (PyCFunction)(void(*)(void))_dbm_dbm_get, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _dbm_dbm_get__doc__}, + {"get", _PyCFunction_CAST(_dbm_dbm_get), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _dbm_dbm_get__doc__}, static PyObject * _dbm_dbm_get_impl(dbmobject *self, PyTypeObject *cls, const char *key, @@ -84,7 +84,7 @@ PyDoc_STRVAR(_dbm_dbm_setdefault__doc__, "If key is not in the database, it is inserted with default as the value."); #define _DBM_DBM_SETDEFAULT_METHODDEF \ - {"setdefault", (PyCFunction)(void(*)(void))_dbm_dbm_setdefault, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _dbm_dbm_setdefault__doc__}, + {"setdefault", _PyCFunction_CAST(_dbm_dbm_setdefault), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _dbm_dbm_setdefault__doc__}, static PyObject * _dbm_dbm_setdefault_impl(dbmobject *self, PyTypeObject *cls, const char *key, @@ -125,7 +125,7 @@ PyDoc_STRVAR(dbmopen__doc__, " (e.g. os.O_RDWR)."); #define DBMOPEN_METHODDEF \ - {"open", (PyCFunction)(void(*)(void))dbmopen, METH_FASTCALL, dbmopen__doc__}, + {"open", _PyCFunction_CAST(dbmopen), METH_FASTCALL, dbmopen__doc__}, static PyObject * dbmopen_impl(PyObject *module, PyObject *filename, const char *flags, @@ -172,4 +172,4 @@ dbmopen(PyObject *module, PyObject *const *args, Py_ssize_t nargs) exit: return return_value; } -/*[clinic end generated code: output=492be70729515fe3 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=5798278a05032d0e input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_elementtree.c.h b/Modules/clinic/_elementtree.c.h index 5ed5a6cadd9d5..047203eefa357 100644 --- a/Modules/clinic/_elementtree.c.h +++ b/Modules/clinic/_elementtree.c.h @@ -158,7 +158,7 @@ PyDoc_STRVAR(_elementtree_Element_find__doc__, "\n"); #define _ELEMENTTREE_ELEMENT_FIND_METHODDEF \ - {"find", (PyCFunction)(void(*)(void))_elementtree_Element_find, METH_FASTCALL|METH_KEYWORDS, _elementtree_Element_find__doc__}, + {"find", _PyCFunction_CAST(_elementtree_Element_find), METH_FASTCALL|METH_KEYWORDS, _elementtree_Element_find__doc__}, static PyObject * _elementtree_Element_find_impl(ElementObject *self, PyObject *path, @@ -197,7 +197,7 @@ PyDoc_STRVAR(_elementtree_Element_findtext__doc__, "\n"); #define _ELEMENTTREE_ELEMENT_FINDTEXT_METHODDEF \ - {"findtext", (PyCFunction)(void(*)(void))_elementtree_Element_findtext, METH_FASTCALL|METH_KEYWORDS, _elementtree_Element_findtext__doc__}, + {"findtext", _PyCFunction_CAST(_elementtree_Element_findtext), METH_FASTCALL|METH_KEYWORDS, _elementtree_Element_findtext__doc__}, static PyObject * _elementtree_Element_findtext_impl(ElementObject *self, PyObject *path, @@ -244,7 +244,7 @@ PyDoc_STRVAR(_elementtree_Element_findall__doc__, "\n"); #define _ELEMENTTREE_ELEMENT_FINDALL_METHODDEF \ - {"findall", (PyCFunction)(void(*)(void))_elementtree_Element_findall, METH_FASTCALL|METH_KEYWORDS, _elementtree_Element_findall__doc__}, + {"findall", _PyCFunction_CAST(_elementtree_Element_findall), METH_FASTCALL|METH_KEYWORDS, _elementtree_Element_findall__doc__}, static PyObject * _elementtree_Element_findall_impl(ElementObject *self, PyObject *path, @@ -283,7 +283,7 @@ PyDoc_STRVAR(_elementtree_Element_iterfind__doc__, "\n"); #define _ELEMENTTREE_ELEMENT_ITERFIND_METHODDEF \ - {"iterfind", (PyCFunction)(void(*)(void))_elementtree_Element_iterfind, METH_FASTCALL|METH_KEYWORDS, _elementtree_Element_iterfind__doc__}, + {"iterfind", _PyCFunction_CAST(_elementtree_Element_iterfind), METH_FASTCALL|METH_KEYWORDS, _elementtree_Element_iterfind__doc__}, static PyObject * _elementtree_Element_iterfind_impl(ElementObject *self, PyObject *path, @@ -322,7 +322,7 @@ PyDoc_STRVAR(_elementtree_Element_get__doc__, "\n"); #define _ELEMENTTREE_ELEMENT_GET_METHODDEF \ - {"get", (PyCFunction)(void(*)(void))_elementtree_Element_get, METH_FASTCALL|METH_KEYWORDS, _elementtree_Element_get__doc__}, + {"get", _PyCFunction_CAST(_elementtree_Element_get), METH_FASTCALL|METH_KEYWORDS, _elementtree_Element_get__doc__}, static PyObject * _elementtree_Element_get_impl(ElementObject *self, PyObject *key, @@ -361,7 +361,7 @@ PyDoc_STRVAR(_elementtree_Element_iter__doc__, "\n"); #define _ELEMENTTREE_ELEMENT_ITER_METHODDEF \ - {"iter", (PyCFunction)(void(*)(void))_elementtree_Element_iter, METH_FASTCALL|METH_KEYWORDS, _elementtree_Element_iter__doc__}, + {"iter", _PyCFunction_CAST(_elementtree_Element_iter), METH_FASTCALL|METH_KEYWORDS, _elementtree_Element_iter__doc__}, static PyObject * _elementtree_Element_iter_impl(ElementObject *self, PyObject *tag); @@ -414,7 +414,7 @@ PyDoc_STRVAR(_elementtree_Element_insert__doc__, "\n"); #define _ELEMENTTREE_ELEMENT_INSERT_METHODDEF \ - {"insert", (PyCFunction)(void(*)(void))_elementtree_Element_insert, METH_FASTCALL, _elementtree_Element_insert__doc__}, + {"insert", _PyCFunction_CAST(_elementtree_Element_insert), METH_FASTCALL, _elementtree_Element_insert__doc__}, static PyObject * _elementtree_Element_insert_impl(ElementObject *self, Py_ssize_t index, @@ -493,7 +493,7 @@ PyDoc_STRVAR(_elementtree_Element_makeelement__doc__, "\n"); #define _ELEMENTTREE_ELEMENT_MAKEELEMENT_METHODDEF \ - {"makeelement", (PyCFunction)(void(*)(void))_elementtree_Element_makeelement, METH_FASTCALL, _elementtree_Element_makeelement__doc__}, + {"makeelement", _PyCFunction_CAST(_elementtree_Element_makeelement), METH_FASTCALL, _elementtree_Element_makeelement__doc__}, static PyObject * _elementtree_Element_makeelement_impl(ElementObject *self, PyObject *tag, @@ -555,7 +555,7 @@ PyDoc_STRVAR(_elementtree_Element_set__doc__, "\n"); #define _ELEMENTTREE_ELEMENT_SET_METHODDEF \ - {"set", (PyCFunction)(void(*)(void))_elementtree_Element_set, METH_FASTCALL, _elementtree_Element_set__doc__}, + {"set", _PyCFunction_CAST(_elementtree_Element_set), METH_FASTCALL, _elementtree_Element_set__doc__}, static PyObject * _elementtree_Element_set_impl(ElementObject *self, PyObject *key, @@ -660,7 +660,7 @@ PyDoc_STRVAR(_elementtree__set_factories__doc__, "For internal use only."); #define _ELEMENTTREE__SET_FACTORIES_METHODDEF \ - {"_set_factories", (PyCFunction)(void(*)(void))_elementtree__set_factories, METH_FASTCALL, _elementtree__set_factories__doc__}, + {"_set_factories", _PyCFunction_CAST(_elementtree__set_factories), METH_FASTCALL, _elementtree__set_factories__doc__}, static PyObject * _elementtree__set_factories_impl(PyObject *module, PyObject *comment_factory, @@ -714,7 +714,7 @@ PyDoc_STRVAR(_elementtree_TreeBuilder_pi__doc__, "\n"); #define _ELEMENTTREE_TREEBUILDER_PI_METHODDEF \ - {"pi", (PyCFunction)(void(*)(void))_elementtree_TreeBuilder_pi, METH_FASTCALL, _elementtree_TreeBuilder_pi__doc__}, + {"pi", _PyCFunction_CAST(_elementtree_TreeBuilder_pi), METH_FASTCALL, _elementtree_TreeBuilder_pi__doc__}, static PyObject * _elementtree_TreeBuilder_pi_impl(TreeBuilderObject *self, PyObject *target, @@ -765,7 +765,7 @@ PyDoc_STRVAR(_elementtree_TreeBuilder_start__doc__, "\n"); #define _ELEMENTTREE_TREEBUILDER_START_METHODDEF \ - {"start", (PyCFunction)(void(*)(void))_elementtree_TreeBuilder_start, METH_FASTCALL, _elementtree_TreeBuilder_start__doc__}, + {"start", _PyCFunction_CAST(_elementtree_TreeBuilder_start), METH_FASTCALL, _elementtree_TreeBuilder_start__doc__}, static PyObject * _elementtree_TreeBuilder_start_impl(TreeBuilderObject *self, PyObject *tag, @@ -887,7 +887,7 @@ PyDoc_STRVAR(_elementtree_XMLParser__setevents__doc__, "\n"); #define _ELEMENTTREE_XMLPARSER__SETEVENTS_METHODDEF \ - {"_setevents", (PyCFunction)(void(*)(void))_elementtree_XMLParser__setevents, METH_FASTCALL, _elementtree_XMLParser__setevents__doc__}, + {"_setevents", _PyCFunction_CAST(_elementtree_XMLParser__setevents), METH_FASTCALL, _elementtree_XMLParser__setevents__doc__}, static PyObject * _elementtree_XMLParser__setevents_impl(XMLParserObject *self, @@ -915,4 +915,4 @@ _elementtree_XMLParser__setevents(XMLParserObject *self, PyObject *const *args, exit: return return_value; } -/*[clinic end generated code: output=992733cfc7390590 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=3fd6fa2ce1aeca76 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_gdbmmodule.c.h b/Modules/clinic/_gdbmmodule.c.h index ced48b99ed325..e4cb1e9477f3a 100644 --- a/Modules/clinic/_gdbmmodule.c.h +++ b/Modules/clinic/_gdbmmodule.c.h @@ -9,7 +9,7 @@ PyDoc_STRVAR(_gdbm_gdbm_get__doc__, "Get the value for key, or default if not present."); #define _GDBM_GDBM_GET_METHODDEF \ - {"get", (PyCFunction)(void(*)(void))_gdbm_gdbm_get, METH_FASTCALL, _gdbm_gdbm_get__doc__}, + {"get", _PyCFunction_CAST(_gdbm_gdbm_get), METH_FASTCALL, _gdbm_gdbm_get__doc__}, static PyObject * _gdbm_gdbm_get_impl(gdbmobject *self, PyObject *key, PyObject *default_value); @@ -43,7 +43,7 @@ PyDoc_STRVAR(_gdbm_gdbm_setdefault__doc__, "Get value for key, or set it to default and return default if not present."); #define _GDBM_GDBM_SETDEFAULT_METHODDEF \ - {"setdefault", (PyCFunction)(void(*)(void))_gdbm_gdbm_setdefault, METH_FASTCALL, _gdbm_gdbm_setdefault__doc__}, + {"setdefault", _PyCFunction_CAST(_gdbm_gdbm_setdefault), METH_FASTCALL, _gdbm_gdbm_setdefault__doc__}, static PyObject * _gdbm_gdbm_setdefault_impl(gdbmobject *self, PyObject *key, @@ -96,7 +96,7 @@ PyDoc_STRVAR(_gdbm_gdbm_keys__doc__, "Get a list of all keys in the database."); #define _GDBM_GDBM_KEYS_METHODDEF \ - {"keys", (PyCFunction)(void(*)(void))_gdbm_gdbm_keys, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _gdbm_gdbm_keys__doc__}, + {"keys", _PyCFunction_CAST(_gdbm_gdbm_keys), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _gdbm_gdbm_keys__doc__}, static PyObject * _gdbm_gdbm_keys_impl(gdbmobject *self, PyTypeObject *cls); @@ -122,7 +122,7 @@ PyDoc_STRVAR(_gdbm_gdbm_firstkey__doc__, "hash values, and won\'t be sorted by the key values."); #define _GDBM_GDBM_FIRSTKEY_METHODDEF \ - {"firstkey", (PyCFunction)(void(*)(void))_gdbm_gdbm_firstkey, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _gdbm_gdbm_firstkey__doc__}, + {"firstkey", _PyCFunction_CAST(_gdbm_gdbm_firstkey), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _gdbm_gdbm_firstkey__doc__}, static PyObject * _gdbm_gdbm_firstkey_impl(gdbmobject *self, PyTypeObject *cls); @@ -152,7 +152,7 @@ PyDoc_STRVAR(_gdbm_gdbm_nextkey__doc__, " k = db.nextkey(k)"); #define _GDBM_GDBM_NEXTKEY_METHODDEF \ - {"nextkey", (PyCFunction)(void(*)(void))_gdbm_gdbm_nextkey, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _gdbm_gdbm_nextkey__doc__}, + {"nextkey", _PyCFunction_CAST(_gdbm_gdbm_nextkey), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _gdbm_gdbm_nextkey__doc__}, static PyObject * _gdbm_gdbm_nextkey_impl(gdbmobject *self, PyTypeObject *cls, const char *key, @@ -190,7 +190,7 @@ PyDoc_STRVAR(_gdbm_gdbm_reorganize__doc__, "kept and reused as new (key,value) pairs are added."); #define _GDBM_GDBM_REORGANIZE_METHODDEF \ - {"reorganize", (PyCFunction)(void(*)(void))_gdbm_gdbm_reorganize, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _gdbm_gdbm_reorganize__doc__}, + {"reorganize", _PyCFunction_CAST(_gdbm_gdbm_reorganize), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _gdbm_gdbm_reorganize__doc__}, static PyObject * _gdbm_gdbm_reorganize_impl(gdbmobject *self, PyTypeObject *cls); @@ -215,7 +215,7 @@ PyDoc_STRVAR(_gdbm_gdbm_sync__doc__, "any unwritten data to be written to the disk."); #define _GDBM_GDBM_SYNC_METHODDEF \ - {"sync", (PyCFunction)(void(*)(void))_gdbm_gdbm_sync, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _gdbm_gdbm_sync__doc__}, + {"sync", _PyCFunction_CAST(_gdbm_gdbm_sync), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _gdbm_gdbm_sync__doc__}, static PyObject * _gdbm_gdbm_sync_impl(gdbmobject *self, PyTypeObject *cls); @@ -258,7 +258,7 @@ PyDoc_STRVAR(dbmopen__doc__, "when the database has to be created. It defaults to octal 0o666."); #define DBMOPEN_METHODDEF \ - {"open", (PyCFunction)(void(*)(void))dbmopen, METH_FASTCALL, dbmopen__doc__}, + {"open", _PyCFunction_CAST(dbmopen), METH_FASTCALL, dbmopen__doc__}, static PyObject * dbmopen_impl(PyObject *module, PyObject *filename, const char *flags, @@ -305,4 +305,4 @@ dbmopen(PyObject *module, PyObject *const *args, Py_ssize_t nargs) exit: return return_value; } -/*[clinic end generated code: output=fe7a0812eb560b23 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=617117d16956ac4d input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_hashopenssl.c.h b/Modules/clinic/_hashopenssl.c.h index de01489e6a3b0..5d84f4ac4e554 100644 --- a/Modules/clinic/_hashopenssl.c.h +++ b/Modules/clinic/_hashopenssl.c.h @@ -74,7 +74,7 @@ PyDoc_STRVAR(EVPXOF_digest__doc__, "Return the digest value as a bytes object."); #define EVPXOF_DIGEST_METHODDEF \ - {"digest", (PyCFunction)(void(*)(void))EVPXOF_digest, METH_FASTCALL|METH_KEYWORDS, EVPXOF_digest__doc__}, + {"digest", _PyCFunction_CAST(EVPXOF_digest), METH_FASTCALL|METH_KEYWORDS, EVPXOF_digest__doc__}, static PyObject * EVPXOF_digest_impl(EVPobject *self, Py_ssize_t length); @@ -121,7 +121,7 @@ PyDoc_STRVAR(EVPXOF_hexdigest__doc__, "Return the digest value as a string of hexadecimal digits."); #define EVPXOF_HEXDIGEST_METHODDEF \ - {"hexdigest", (PyCFunction)(void(*)(void))EVPXOF_hexdigest, METH_FASTCALL|METH_KEYWORDS, EVPXOF_hexdigest__doc__}, + {"hexdigest", _PyCFunction_CAST(EVPXOF_hexdigest), METH_FASTCALL|METH_KEYWORDS, EVPXOF_hexdigest__doc__}, static PyObject * EVPXOF_hexdigest_impl(EVPobject *self, Py_ssize_t length); @@ -171,7 +171,7 @@ PyDoc_STRVAR(EVP_new__doc__, "The MD5 and SHA1 algorithms are always supported."); #define EVP_NEW_METHODDEF \ - {"new", (PyCFunction)(void(*)(void))EVP_new, METH_FASTCALL|METH_KEYWORDS, EVP_new__doc__}, + {"new", _PyCFunction_CAST(EVP_new), METH_FASTCALL|METH_KEYWORDS, EVP_new__doc__}, static PyObject * EVP_new_impl(PyObject *module, PyObject *name_obj, PyObject *data_obj, @@ -225,7 +225,7 @@ PyDoc_STRVAR(_hashlib_openssl_md5__doc__, "Returns a md5 hash object; optionally initialized with a string"); #define _HASHLIB_OPENSSL_MD5_METHODDEF \ - {"openssl_md5", (PyCFunction)(void(*)(void))_hashlib_openssl_md5, METH_FASTCALL|METH_KEYWORDS, _hashlib_openssl_md5__doc__}, + {"openssl_md5", _PyCFunction_CAST(_hashlib_openssl_md5), METH_FASTCALL|METH_KEYWORDS, _hashlib_openssl_md5__doc__}, static PyObject * _hashlib_openssl_md5_impl(PyObject *module, PyObject *data_obj, @@ -277,7 +277,7 @@ PyDoc_STRVAR(_hashlib_openssl_sha1__doc__, "Returns a sha1 hash object; optionally initialized with a string"); #define _HASHLIB_OPENSSL_SHA1_METHODDEF \ - {"openssl_sha1", (PyCFunction)(void(*)(void))_hashlib_openssl_sha1, METH_FASTCALL|METH_KEYWORDS, _hashlib_openssl_sha1__doc__}, + {"openssl_sha1", _PyCFunction_CAST(_hashlib_openssl_sha1), METH_FASTCALL|METH_KEYWORDS, _hashlib_openssl_sha1__doc__}, static PyObject * _hashlib_openssl_sha1_impl(PyObject *module, PyObject *data_obj, @@ -329,7 +329,7 @@ PyDoc_STRVAR(_hashlib_openssl_sha224__doc__, "Returns a sha224 hash object; optionally initialized with a string"); #define _HASHLIB_OPENSSL_SHA224_METHODDEF \ - {"openssl_sha224", (PyCFunction)(void(*)(void))_hashlib_openssl_sha224, METH_FASTCALL|METH_KEYWORDS, _hashlib_openssl_sha224__doc__}, + {"openssl_sha224", _PyCFunction_CAST(_hashlib_openssl_sha224), METH_FASTCALL|METH_KEYWORDS, _hashlib_openssl_sha224__doc__}, static PyObject * _hashlib_openssl_sha224_impl(PyObject *module, PyObject *data_obj, @@ -381,7 +381,7 @@ PyDoc_STRVAR(_hashlib_openssl_sha256__doc__, "Returns a sha256 hash object; optionally initialized with a string"); #define _HASHLIB_OPENSSL_SHA256_METHODDEF \ - {"openssl_sha256", (PyCFunction)(void(*)(void))_hashlib_openssl_sha256, METH_FASTCALL|METH_KEYWORDS, _hashlib_openssl_sha256__doc__}, + {"openssl_sha256", _PyCFunction_CAST(_hashlib_openssl_sha256), METH_FASTCALL|METH_KEYWORDS, _hashlib_openssl_sha256__doc__}, static PyObject * _hashlib_openssl_sha256_impl(PyObject *module, PyObject *data_obj, @@ -433,7 +433,7 @@ PyDoc_STRVAR(_hashlib_openssl_sha384__doc__, "Returns a sha384 hash object; optionally initialized with a string"); #define _HASHLIB_OPENSSL_SHA384_METHODDEF \ - {"openssl_sha384", (PyCFunction)(void(*)(void))_hashlib_openssl_sha384, METH_FASTCALL|METH_KEYWORDS, _hashlib_openssl_sha384__doc__}, + {"openssl_sha384", _PyCFunction_CAST(_hashlib_openssl_sha384), METH_FASTCALL|METH_KEYWORDS, _hashlib_openssl_sha384__doc__}, static PyObject * _hashlib_openssl_sha384_impl(PyObject *module, PyObject *data_obj, @@ -485,7 +485,7 @@ PyDoc_STRVAR(_hashlib_openssl_sha512__doc__, "Returns a sha512 hash object; optionally initialized with a string"); #define _HASHLIB_OPENSSL_SHA512_METHODDEF \ - {"openssl_sha512", (PyCFunction)(void(*)(void))_hashlib_openssl_sha512, METH_FASTCALL|METH_KEYWORDS, _hashlib_openssl_sha512__doc__}, + {"openssl_sha512", _PyCFunction_CAST(_hashlib_openssl_sha512), METH_FASTCALL|METH_KEYWORDS, _hashlib_openssl_sha512__doc__}, static PyObject * _hashlib_openssl_sha512_impl(PyObject *module, PyObject *data_obj, @@ -539,7 +539,7 @@ PyDoc_STRVAR(_hashlib_openssl_sha3_224__doc__, "Returns a sha3-224 hash object; optionally initialized with a string"); #define _HASHLIB_OPENSSL_SHA3_224_METHODDEF \ - {"openssl_sha3_224", (PyCFunction)(void(*)(void))_hashlib_openssl_sha3_224, METH_FASTCALL|METH_KEYWORDS, _hashlib_openssl_sha3_224__doc__}, + {"openssl_sha3_224", _PyCFunction_CAST(_hashlib_openssl_sha3_224), METH_FASTCALL|METH_KEYWORDS, _hashlib_openssl_sha3_224__doc__}, static PyObject * _hashlib_openssl_sha3_224_impl(PyObject *module, PyObject *data_obj, @@ -595,7 +595,7 @@ PyDoc_STRVAR(_hashlib_openssl_sha3_256__doc__, "Returns a sha3-256 hash object; optionally initialized with a string"); #define _HASHLIB_OPENSSL_SHA3_256_METHODDEF \ - {"openssl_sha3_256", (PyCFunction)(void(*)(void))_hashlib_openssl_sha3_256, METH_FASTCALL|METH_KEYWORDS, _hashlib_openssl_sha3_256__doc__}, + {"openssl_sha3_256", _PyCFunction_CAST(_hashlib_openssl_sha3_256), METH_FASTCALL|METH_KEYWORDS, _hashlib_openssl_sha3_256__doc__}, static PyObject * _hashlib_openssl_sha3_256_impl(PyObject *module, PyObject *data_obj, @@ -651,7 +651,7 @@ PyDoc_STRVAR(_hashlib_openssl_sha3_384__doc__, "Returns a sha3-384 hash object; optionally initialized with a string"); #define _HASHLIB_OPENSSL_SHA3_384_METHODDEF \ - {"openssl_sha3_384", (PyCFunction)(void(*)(void))_hashlib_openssl_sha3_384, METH_FASTCALL|METH_KEYWORDS, _hashlib_openssl_sha3_384__doc__}, + {"openssl_sha3_384", _PyCFunction_CAST(_hashlib_openssl_sha3_384), METH_FASTCALL|METH_KEYWORDS, _hashlib_openssl_sha3_384__doc__}, static PyObject * _hashlib_openssl_sha3_384_impl(PyObject *module, PyObject *data_obj, @@ -707,7 +707,7 @@ PyDoc_STRVAR(_hashlib_openssl_sha3_512__doc__, "Returns a sha3-512 hash object; optionally initialized with a string"); #define _HASHLIB_OPENSSL_SHA3_512_METHODDEF \ - {"openssl_sha3_512", (PyCFunction)(void(*)(void))_hashlib_openssl_sha3_512, METH_FASTCALL|METH_KEYWORDS, _hashlib_openssl_sha3_512__doc__}, + {"openssl_sha3_512", _PyCFunction_CAST(_hashlib_openssl_sha3_512), METH_FASTCALL|METH_KEYWORDS, _hashlib_openssl_sha3_512__doc__}, static PyObject * _hashlib_openssl_sha3_512_impl(PyObject *module, PyObject *data_obj, @@ -763,7 +763,7 @@ PyDoc_STRVAR(_hashlib_openssl_shake_128__doc__, "Returns a shake-128 variable hash object; optionally initialized with a string"); #define _HASHLIB_OPENSSL_SHAKE_128_METHODDEF \ - {"openssl_shake_128", (PyCFunction)(void(*)(void))_hashlib_openssl_shake_128, METH_FASTCALL|METH_KEYWORDS, _hashlib_openssl_shake_128__doc__}, + {"openssl_shake_128", _PyCFunction_CAST(_hashlib_openssl_shake_128), METH_FASTCALL|METH_KEYWORDS, _hashlib_openssl_shake_128__doc__}, static PyObject * _hashlib_openssl_shake_128_impl(PyObject *module, PyObject *data_obj, @@ -819,7 +819,7 @@ PyDoc_STRVAR(_hashlib_openssl_shake_256__doc__, "Returns a shake-256 variable hash object; optionally initialized with a string"); #define _HASHLIB_OPENSSL_SHAKE_256_METHODDEF \ - {"openssl_shake_256", (PyCFunction)(void(*)(void))_hashlib_openssl_shake_256, METH_FASTCALL|METH_KEYWORDS, _hashlib_openssl_shake_256__doc__}, + {"openssl_shake_256", _PyCFunction_CAST(_hashlib_openssl_shake_256), METH_FASTCALL|METH_KEYWORDS, _hashlib_openssl_shake_256__doc__}, static PyObject * _hashlib_openssl_shake_256_impl(PyObject *module, PyObject *data_obj, @@ -874,7 +874,7 @@ PyDoc_STRVAR(pbkdf2_hmac__doc__, "Password based key derivation function 2 (PKCS #5 v2.0) with HMAC as pseudorandom function."); #define PBKDF2_HMAC_METHODDEF \ - {"pbkdf2_hmac", (PyCFunction)(void(*)(void))pbkdf2_hmac, METH_FASTCALL|METH_KEYWORDS, pbkdf2_hmac__doc__}, + {"pbkdf2_hmac", _PyCFunction_CAST(pbkdf2_hmac), METH_FASTCALL|METH_KEYWORDS, pbkdf2_hmac__doc__}, static PyObject * pbkdf2_hmac_impl(PyObject *module, const char *hash_name, @@ -960,7 +960,7 @@ PyDoc_STRVAR(_hashlib_scrypt__doc__, "scrypt password-based key derivation function."); #define _HASHLIB_SCRYPT_METHODDEF \ - {"scrypt", (PyCFunction)(void(*)(void))_hashlib_scrypt, METH_FASTCALL|METH_KEYWORDS, _hashlib_scrypt__doc__}, + {"scrypt", _PyCFunction_CAST(_hashlib_scrypt), METH_FASTCALL|METH_KEYWORDS, _hashlib_scrypt__doc__}, static PyObject * _hashlib_scrypt_impl(PyObject *module, Py_buffer *password, Py_buffer *salt, @@ -1077,7 +1077,7 @@ PyDoc_STRVAR(_hashlib_hmac_singleshot__doc__, "Single-shot HMAC."); #define _HASHLIB_HMAC_SINGLESHOT_METHODDEF \ - {"hmac_digest", (PyCFunction)(void(*)(void))_hashlib_hmac_singleshot, METH_FASTCALL|METH_KEYWORDS, _hashlib_hmac_singleshot__doc__}, + {"hmac_digest", _PyCFunction_CAST(_hashlib_hmac_singleshot), METH_FASTCALL|METH_KEYWORDS, _hashlib_hmac_singleshot__doc__}, static PyObject * _hashlib_hmac_singleshot_impl(PyObject *module, Py_buffer *key, @@ -1135,7 +1135,7 @@ PyDoc_STRVAR(_hashlib_hmac_new__doc__, "Return a new hmac object."); #define _HASHLIB_HMAC_NEW_METHODDEF \ - {"hmac_new", (PyCFunction)(void(*)(void))_hashlib_hmac_new, METH_FASTCALL|METH_KEYWORDS, _hashlib_hmac_new__doc__}, + {"hmac_new", _PyCFunction_CAST(_hashlib_hmac_new), METH_FASTCALL|METH_KEYWORDS, _hashlib_hmac_new__doc__}, static PyObject * _hashlib_hmac_new_impl(PyObject *module, Py_buffer *key, PyObject *msg_obj, @@ -1211,7 +1211,7 @@ PyDoc_STRVAR(_hashlib_HMAC_update__doc__, "Update the HMAC object with msg."); #define _HASHLIB_HMAC_UPDATE_METHODDEF \ - {"update", (PyCFunction)(void(*)(void))_hashlib_HMAC_update, METH_FASTCALL|METH_KEYWORDS, _hashlib_HMAC_update__doc__}, + {"update", _PyCFunction_CAST(_hashlib_HMAC_update), METH_FASTCALL|METH_KEYWORDS, _hashlib_HMAC_update__doc__}, static PyObject * _hashlib_HMAC_update_impl(HMACobject *self, PyObject *msg); @@ -1327,7 +1327,7 @@ PyDoc_STRVAR(_hashlib_compare_digest__doc__, "types and lengths of a and b--but not their values."); #define _HASHLIB_COMPARE_DIGEST_METHODDEF \ - {"compare_digest", (PyCFunction)(void(*)(void))_hashlib_compare_digest, METH_FASTCALL, _hashlib_compare_digest__doc__}, + {"compare_digest", _PyCFunction_CAST(_hashlib_compare_digest), METH_FASTCALL, _hashlib_compare_digest__doc__}, static PyObject * _hashlib_compare_digest_impl(PyObject *module, PyObject *a, PyObject *b); @@ -1385,4 +1385,4 @@ _hashlib_compare_digest(PyObject *module, PyObject *const *args, Py_ssize_t narg #ifndef _HASHLIB_SCRYPT_METHODDEF #define _HASHLIB_SCRYPT_METHODDEF #endif /* !defined(_HASHLIB_SCRYPT_METHODDEF) */ -/*[clinic end generated code: output=162369cb9d43f1cc input=a9049054013a1b77]*/ +/*[clinic end generated code: output=69f2374071bff707 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_heapqmodule.c.h b/Modules/clinic/_heapqmodule.c.h index a894315a766c2..8d73b5b48d6a0 100644 --- a/Modules/clinic/_heapqmodule.c.h +++ b/Modules/clinic/_heapqmodule.c.h @@ -9,7 +9,7 @@ PyDoc_STRVAR(_heapq_heappush__doc__, "Push item onto heap, maintaining the heap invariant."); #define _HEAPQ_HEAPPUSH_METHODDEF \ - {"heappush", (PyCFunction)(void(*)(void))_heapq_heappush, METH_FASTCALL, _heapq_heappush__doc__}, + {"heappush", _PyCFunction_CAST(_heapq_heappush), METH_FASTCALL, _heapq_heappush__doc__}, static PyObject * _heapq_heappush_impl(PyObject *module, PyObject *heap, PyObject *item); @@ -80,7 +80,7 @@ PyDoc_STRVAR(_heapq_heapreplace__doc__, " item = heapreplace(heap, item)"); #define _HEAPQ_HEAPREPLACE_METHODDEF \ - {"heapreplace", (PyCFunction)(void(*)(void))_heapq_heapreplace, METH_FASTCALL, _heapq_heapreplace__doc__}, + {"heapreplace", _PyCFunction_CAST(_heapq_heapreplace), METH_FASTCALL, _heapq_heapreplace__doc__}, static PyObject * _heapq_heapreplace_impl(PyObject *module, PyObject *heap, PyObject *item); @@ -117,7 +117,7 @@ PyDoc_STRVAR(_heapq_heappushpop__doc__, "a separate call to heappop()."); #define _HEAPQ_HEAPPUSHPOP_METHODDEF \ - {"heappushpop", (PyCFunction)(void(*)(void))_heapq_heappushpop, METH_FASTCALL, _heapq_heappushpop__doc__}, + {"heappushpop", _PyCFunction_CAST(_heapq_heappushpop), METH_FASTCALL, _heapq_heappushpop__doc__}, static PyObject * _heapq_heappushpop_impl(PyObject *module, PyObject *heap, PyObject *item); @@ -209,7 +209,7 @@ PyDoc_STRVAR(_heapq__heapreplace_max__doc__, "Maxheap variant of heapreplace."); #define _HEAPQ__HEAPREPLACE_MAX_METHODDEF \ - {"_heapreplace_max", (PyCFunction)(void(*)(void))_heapq__heapreplace_max, METH_FASTCALL, _heapq__heapreplace_max__doc__}, + {"_heapreplace_max", _PyCFunction_CAST(_heapq__heapreplace_max), METH_FASTCALL, _heapq__heapreplace_max__doc__}, static PyObject * _heapq__heapreplace_max_impl(PyObject *module, PyObject *heap, @@ -265,4 +265,4 @@ _heapq__heapify_max(PyObject *module, PyObject *arg) exit: return return_value; } -/*[clinic end generated code: output=9975cf51762878d5 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=9a22715a8bf0c91d input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_localemodule.c.h b/Modules/clinic/_localemodule.c.h index 2958127e430de..0694263573947 100644 --- a/Modules/clinic/_localemodule.c.h +++ b/Modules/clinic/_localemodule.c.h @@ -9,7 +9,7 @@ PyDoc_STRVAR(_locale_setlocale__doc__, "Activates/queries locale processing."); #define _LOCALE_SETLOCALE_METHODDEF \ - {"setlocale", (PyCFunction)(void(*)(void))_locale_setlocale, METH_FASTCALL, _locale_setlocale__doc__}, + {"setlocale", _PyCFunction_CAST(_locale_setlocale), METH_FASTCALL, _locale_setlocale__doc__}, static PyObject * _locale_setlocale_impl(PyObject *module, int category, const char *locale); @@ -83,7 +83,7 @@ PyDoc_STRVAR(_locale_strcoll__doc__, "Compares two strings according to the locale."); #define _LOCALE_STRCOLL_METHODDEF \ - {"strcoll", (PyCFunction)(void(*)(void))_locale_strcoll, METH_FASTCALL, _locale_strcoll__doc__}, + {"strcoll", _PyCFunction_CAST(_locale_strcoll), METH_FASTCALL, _locale_strcoll__doc__}, static PyObject * _locale_strcoll_impl(PyObject *module, PyObject *os1, PyObject *os2); @@ -265,7 +265,7 @@ PyDoc_STRVAR(_locale_dgettext__doc__, "Return translation of msg in domain."); #define _LOCALE_DGETTEXT_METHODDEF \ - {"dgettext", (PyCFunction)(void(*)(void))_locale_dgettext, METH_FASTCALL, _locale_dgettext__doc__}, + {"dgettext", _PyCFunction_CAST(_locale_dgettext), METH_FASTCALL, _locale_dgettext__doc__}, static PyObject * _locale_dgettext_impl(PyObject *module, const char *domain, const char *in); @@ -328,7 +328,7 @@ PyDoc_STRVAR(_locale_dcgettext__doc__, "Return translation of msg in domain and category."); #define _LOCALE_DCGETTEXT_METHODDEF \ - {"dcgettext", (PyCFunction)(void(*)(void))_locale_dcgettext, METH_FASTCALL, _locale_dcgettext__doc__}, + {"dcgettext", _PyCFunction_CAST(_locale_dcgettext), METH_FASTCALL, _locale_dcgettext__doc__}, static PyObject * _locale_dcgettext_impl(PyObject *module, const char *domain, @@ -443,7 +443,7 @@ PyDoc_STRVAR(_locale_bindtextdomain__doc__, "Bind the C library\'s domain to dir."); #define _LOCALE_BINDTEXTDOMAIN_METHODDEF \ - {"bindtextdomain", (PyCFunction)(void(*)(void))_locale_bindtextdomain, METH_FASTCALL, _locale_bindtextdomain__doc__}, + {"bindtextdomain", _PyCFunction_CAST(_locale_bindtextdomain), METH_FASTCALL, _locale_bindtextdomain__doc__}, static PyObject * _locale_bindtextdomain_impl(PyObject *module, const char *domain, @@ -490,7 +490,7 @@ PyDoc_STRVAR(_locale_bind_textdomain_codeset__doc__, "Bind the C library\'s domain to codeset."); #define _LOCALE_BIND_TEXTDOMAIN_CODESET_METHODDEF \ - {"bind_textdomain_codeset", (PyCFunction)(void(*)(void))_locale_bind_textdomain_codeset, METH_FASTCALL, _locale_bind_textdomain_codeset__doc__}, + {"bind_textdomain_codeset", _PyCFunction_CAST(_locale_bind_textdomain_codeset), METH_FASTCALL, _locale_bind_textdomain_codeset__doc__}, static PyObject * _locale_bind_textdomain_codeset_impl(PyObject *module, const char *domain, @@ -602,4 +602,4 @@ _locale_getencoding(PyObject *module, PyObject *Py_UNUSED(ignored)) #ifndef _LOCALE_BIND_TEXTDOMAIN_CODESET_METHODDEF #define _LOCALE_BIND_TEXTDOMAIN_CODESET_METHODDEF #endif /* !defined(_LOCALE_BIND_TEXTDOMAIN_CODESET_METHODDEF) */ -/*[clinic end generated code: output=ea71e9b94bdaa47d input=a9049054013a1b77]*/ +/*[clinic end generated code: output=cfde12e987960245 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_lsprof.c.h b/Modules/clinic/_lsprof.c.h index b0adb746974ab..dfc003eb54774 100644 --- a/Modules/clinic/_lsprof.c.h +++ b/Modules/clinic/_lsprof.c.h @@ -31,7 +31,7 @@ PyDoc_STRVAR(_lsprof_Profiler_getstats__doc__, " inlinetime inline time (not in further subcalls)"); #define _LSPROF_PROFILER_GETSTATS_METHODDEF \ - {"getstats", (PyCFunction)(void(*)(void))_lsprof_Profiler_getstats, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _lsprof_Profiler_getstats__doc__}, + {"getstats", _PyCFunction_CAST(_lsprof_Profiler_getstats), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _lsprof_Profiler_getstats__doc__}, static PyObject * _lsprof_Profiler_getstats_impl(ProfilerObject *self, PyTypeObject *cls); @@ -45,4 +45,4 @@ _lsprof_Profiler_getstats(ProfilerObject *self, PyTypeObject *cls, PyObject *con } return _lsprof_Profiler_getstats_impl(self, cls); } -/*[clinic end generated code: output=57c7b6b0b8666429 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=0615a53cce828f06 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_lzmamodule.c.h b/Modules/clinic/_lzmamodule.c.h index 526031ade3b96..d98af74b4aaca 100644 --- a/Modules/clinic/_lzmamodule.c.h +++ b/Modules/clinic/_lzmamodule.c.h @@ -85,7 +85,7 @@ PyDoc_STRVAR(_lzma_LZMADecompressor_decompress__doc__, "the unused_data attribute."); #define _LZMA_LZMADECOMPRESSOR_DECOMPRESS_METHODDEF \ - {"decompress", (PyCFunction)(void(*)(void))_lzma_LZMADecompressor_decompress, METH_FASTCALL|METH_KEYWORDS, _lzma_LZMADecompressor_decompress__doc__}, + {"decompress", _PyCFunction_CAST(_lzma_LZMADecompressor_decompress), METH_FASTCALL|METH_KEYWORDS, _lzma_LZMADecompressor_decompress__doc__}, static PyObject * _lzma_LZMADecompressor_decompress_impl(Decompressor *self, Py_buffer *data, @@ -250,7 +250,7 @@ PyDoc_STRVAR(_lzma__decode_filter_properties__doc__, "The result does not include the filter ID itself, only the options."); #define _LZMA__DECODE_FILTER_PROPERTIES_METHODDEF \ - {"_decode_filter_properties", (PyCFunction)(void(*)(void))_lzma__decode_filter_properties, METH_FASTCALL, _lzma__decode_filter_properties__doc__}, + {"_decode_filter_properties", _PyCFunction_CAST(_lzma__decode_filter_properties), METH_FASTCALL, _lzma__decode_filter_properties__doc__}, static PyObject * _lzma__decode_filter_properties_impl(PyObject *module, lzma_vli filter_id, @@ -286,4 +286,4 @@ _lzma__decode_filter_properties(PyObject *module, PyObject *const *args, Py_ssiz return return_value; } -/*[clinic end generated code: output=867b9e334053b679 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=bce20bac13b0f252 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_opcode.c.h b/Modules/clinic/_opcode.c.h index 6ef303bb05e7c..d7e96a95c084f 100644 --- a/Modules/clinic/_opcode.c.h +++ b/Modules/clinic/_opcode.c.h @@ -9,7 +9,7 @@ PyDoc_STRVAR(_opcode_stack_effect__doc__, "Compute the stack effect of the opcode."); #define _OPCODE_STACK_EFFECT_METHODDEF \ - {"stack_effect", (PyCFunction)(void(*)(void))_opcode_stack_effect, METH_FASTCALL|METH_KEYWORDS, _opcode_stack_effect__doc__}, + {"stack_effect", _PyCFunction_CAST(_opcode_stack_effect), METH_FASTCALL|METH_KEYWORDS, _opcode_stack_effect__doc__}, static int _opcode_stack_effect_impl(PyObject *module, int opcode, PyObject *oparg, @@ -74,4 +74,4 @@ _opcode_get_specialization_stats(PyObject *module, PyObject *Py_UNUSED(ignored)) { return _opcode_get_specialization_stats_impl(module); } -/*[clinic end generated code: output=1699b4b1488b49c1 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=b904260bf022f953 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_operator.c.h b/Modules/clinic/_operator.c.h index bda2eba6d12a2..3b5be7bf2c07a 100644 --- a/Modules/clinic/_operator.c.h +++ b/Modules/clinic/_operator.c.h @@ -37,7 +37,7 @@ PyDoc_STRVAR(_operator_add__doc__, "Same as a + b."); #define _OPERATOR_ADD_METHODDEF \ - {"add", (PyCFunction)(void(*)(void))_operator_add, METH_FASTCALL, _operator_add__doc__}, + {"add", _PyCFunction_CAST(_operator_add), METH_FASTCALL, _operator_add__doc__}, static PyObject * _operator_add_impl(PyObject *module, PyObject *a, PyObject *b); @@ -67,7 +67,7 @@ PyDoc_STRVAR(_operator_sub__doc__, "Same as a - b."); #define _OPERATOR_SUB_METHODDEF \ - {"sub", (PyCFunction)(void(*)(void))_operator_sub, METH_FASTCALL, _operator_sub__doc__}, + {"sub", _PyCFunction_CAST(_operator_sub), METH_FASTCALL, _operator_sub__doc__}, static PyObject * _operator_sub_impl(PyObject *module, PyObject *a, PyObject *b); @@ -97,7 +97,7 @@ PyDoc_STRVAR(_operator_mul__doc__, "Same as a * b."); #define _OPERATOR_MUL_METHODDEF \ - {"mul", (PyCFunction)(void(*)(void))_operator_mul, METH_FASTCALL, _operator_mul__doc__}, + {"mul", _PyCFunction_CAST(_operator_mul), METH_FASTCALL, _operator_mul__doc__}, static PyObject * _operator_mul_impl(PyObject *module, PyObject *a, PyObject *b); @@ -127,7 +127,7 @@ PyDoc_STRVAR(_operator_matmul__doc__, "Same as a @ b."); #define _OPERATOR_MATMUL_METHODDEF \ - {"matmul", (PyCFunction)(void(*)(void))_operator_matmul, METH_FASTCALL, _operator_matmul__doc__}, + {"matmul", _PyCFunction_CAST(_operator_matmul), METH_FASTCALL, _operator_matmul__doc__}, static PyObject * _operator_matmul_impl(PyObject *module, PyObject *a, PyObject *b); @@ -157,7 +157,7 @@ PyDoc_STRVAR(_operator_floordiv__doc__, "Same as a // b."); #define _OPERATOR_FLOORDIV_METHODDEF \ - {"floordiv", (PyCFunction)(void(*)(void))_operator_floordiv, METH_FASTCALL, _operator_floordiv__doc__}, + {"floordiv", _PyCFunction_CAST(_operator_floordiv), METH_FASTCALL, _operator_floordiv__doc__}, static PyObject * _operator_floordiv_impl(PyObject *module, PyObject *a, PyObject *b); @@ -187,7 +187,7 @@ PyDoc_STRVAR(_operator_truediv__doc__, "Same as a / b."); #define _OPERATOR_TRUEDIV_METHODDEF \ - {"truediv", (PyCFunction)(void(*)(void))_operator_truediv, METH_FASTCALL, _operator_truediv__doc__}, + {"truediv", _PyCFunction_CAST(_operator_truediv), METH_FASTCALL, _operator_truediv__doc__}, static PyObject * _operator_truediv_impl(PyObject *module, PyObject *a, PyObject *b); @@ -217,7 +217,7 @@ PyDoc_STRVAR(_operator_mod__doc__, "Same as a % b."); #define _OPERATOR_MOD_METHODDEF \ - {"mod", (PyCFunction)(void(*)(void))_operator_mod, METH_FASTCALL, _operator_mod__doc__}, + {"mod", _PyCFunction_CAST(_operator_mod), METH_FASTCALL, _operator_mod__doc__}, static PyObject * _operator_mod_impl(PyObject *module, PyObject *a, PyObject *b); @@ -292,7 +292,7 @@ PyDoc_STRVAR(_operator_lshift__doc__, "Same as a << b."); #define _OPERATOR_LSHIFT_METHODDEF \ - {"lshift", (PyCFunction)(void(*)(void))_operator_lshift, METH_FASTCALL, _operator_lshift__doc__}, + {"lshift", _PyCFunction_CAST(_operator_lshift), METH_FASTCALL, _operator_lshift__doc__}, static PyObject * _operator_lshift_impl(PyObject *module, PyObject *a, PyObject *b); @@ -322,7 +322,7 @@ PyDoc_STRVAR(_operator_rshift__doc__, "Same as a >> b."); #define _OPERATOR_RSHIFT_METHODDEF \ - {"rshift", (PyCFunction)(void(*)(void))_operator_rshift, METH_FASTCALL, _operator_rshift__doc__}, + {"rshift", _PyCFunction_CAST(_operator_rshift), METH_FASTCALL, _operator_rshift__doc__}, static PyObject * _operator_rshift_impl(PyObject *module, PyObject *a, PyObject *b); @@ -380,7 +380,7 @@ PyDoc_STRVAR(_operator_and___doc__, "Same as a & b."); #define _OPERATOR_AND__METHODDEF \ - {"and_", (PyCFunction)(void(*)(void))_operator_and_, METH_FASTCALL, _operator_and___doc__}, + {"and_", _PyCFunction_CAST(_operator_and_), METH_FASTCALL, _operator_and___doc__}, static PyObject * _operator_and__impl(PyObject *module, PyObject *a, PyObject *b); @@ -410,7 +410,7 @@ PyDoc_STRVAR(_operator_xor__doc__, "Same as a ^ b."); #define _OPERATOR_XOR_METHODDEF \ - {"xor", (PyCFunction)(void(*)(void))_operator_xor, METH_FASTCALL, _operator_xor__doc__}, + {"xor", _PyCFunction_CAST(_operator_xor), METH_FASTCALL, _operator_xor__doc__}, static PyObject * _operator_xor_impl(PyObject *module, PyObject *a, PyObject *b); @@ -440,7 +440,7 @@ PyDoc_STRVAR(_operator_or___doc__, "Same as a | b."); #define _OPERATOR_OR__METHODDEF \ - {"or_", (PyCFunction)(void(*)(void))_operator_or_, METH_FASTCALL, _operator_or___doc__}, + {"or_", _PyCFunction_CAST(_operator_or_), METH_FASTCALL, _operator_or___doc__}, static PyObject * _operator_or__impl(PyObject *module, PyObject *a, PyObject *b); @@ -470,7 +470,7 @@ PyDoc_STRVAR(_operator_iadd__doc__, "Same as a += b."); #define _OPERATOR_IADD_METHODDEF \ - {"iadd", (PyCFunction)(void(*)(void))_operator_iadd, METH_FASTCALL, _operator_iadd__doc__}, + {"iadd", _PyCFunction_CAST(_operator_iadd), METH_FASTCALL, _operator_iadd__doc__}, static PyObject * _operator_iadd_impl(PyObject *module, PyObject *a, PyObject *b); @@ -500,7 +500,7 @@ PyDoc_STRVAR(_operator_isub__doc__, "Same as a -= b."); #define _OPERATOR_ISUB_METHODDEF \ - {"isub", (PyCFunction)(void(*)(void))_operator_isub, METH_FASTCALL, _operator_isub__doc__}, + {"isub", _PyCFunction_CAST(_operator_isub), METH_FASTCALL, _operator_isub__doc__}, static PyObject * _operator_isub_impl(PyObject *module, PyObject *a, PyObject *b); @@ -530,7 +530,7 @@ PyDoc_STRVAR(_operator_imul__doc__, "Same as a *= b."); #define _OPERATOR_IMUL_METHODDEF \ - {"imul", (PyCFunction)(void(*)(void))_operator_imul, METH_FASTCALL, _operator_imul__doc__}, + {"imul", _PyCFunction_CAST(_operator_imul), METH_FASTCALL, _operator_imul__doc__}, static PyObject * _operator_imul_impl(PyObject *module, PyObject *a, PyObject *b); @@ -560,7 +560,7 @@ PyDoc_STRVAR(_operator_imatmul__doc__, "Same as a @= b."); #define _OPERATOR_IMATMUL_METHODDEF \ - {"imatmul", (PyCFunction)(void(*)(void))_operator_imatmul, METH_FASTCALL, _operator_imatmul__doc__}, + {"imatmul", _PyCFunction_CAST(_operator_imatmul), METH_FASTCALL, _operator_imatmul__doc__}, static PyObject * _operator_imatmul_impl(PyObject *module, PyObject *a, PyObject *b); @@ -590,7 +590,7 @@ PyDoc_STRVAR(_operator_ifloordiv__doc__, "Same as a //= b."); #define _OPERATOR_IFLOORDIV_METHODDEF \ - {"ifloordiv", (PyCFunction)(void(*)(void))_operator_ifloordiv, METH_FASTCALL, _operator_ifloordiv__doc__}, + {"ifloordiv", _PyCFunction_CAST(_operator_ifloordiv), METH_FASTCALL, _operator_ifloordiv__doc__}, static PyObject * _operator_ifloordiv_impl(PyObject *module, PyObject *a, PyObject *b); @@ -620,7 +620,7 @@ PyDoc_STRVAR(_operator_itruediv__doc__, "Same as a /= b."); #define _OPERATOR_ITRUEDIV_METHODDEF \ - {"itruediv", (PyCFunction)(void(*)(void))_operator_itruediv, METH_FASTCALL, _operator_itruediv__doc__}, + {"itruediv", _PyCFunction_CAST(_operator_itruediv), METH_FASTCALL, _operator_itruediv__doc__}, static PyObject * _operator_itruediv_impl(PyObject *module, PyObject *a, PyObject *b); @@ -650,7 +650,7 @@ PyDoc_STRVAR(_operator_imod__doc__, "Same as a %= b."); #define _OPERATOR_IMOD_METHODDEF \ - {"imod", (PyCFunction)(void(*)(void))_operator_imod, METH_FASTCALL, _operator_imod__doc__}, + {"imod", _PyCFunction_CAST(_operator_imod), METH_FASTCALL, _operator_imod__doc__}, static PyObject * _operator_imod_impl(PyObject *module, PyObject *a, PyObject *b); @@ -680,7 +680,7 @@ PyDoc_STRVAR(_operator_ilshift__doc__, "Same as a <<= b."); #define _OPERATOR_ILSHIFT_METHODDEF \ - {"ilshift", (PyCFunction)(void(*)(void))_operator_ilshift, METH_FASTCALL, _operator_ilshift__doc__}, + {"ilshift", _PyCFunction_CAST(_operator_ilshift), METH_FASTCALL, _operator_ilshift__doc__}, static PyObject * _operator_ilshift_impl(PyObject *module, PyObject *a, PyObject *b); @@ -710,7 +710,7 @@ PyDoc_STRVAR(_operator_irshift__doc__, "Same as a >>= b."); #define _OPERATOR_IRSHIFT_METHODDEF \ - {"irshift", (PyCFunction)(void(*)(void))_operator_irshift, METH_FASTCALL, _operator_irshift__doc__}, + {"irshift", _PyCFunction_CAST(_operator_irshift), METH_FASTCALL, _operator_irshift__doc__}, static PyObject * _operator_irshift_impl(PyObject *module, PyObject *a, PyObject *b); @@ -740,7 +740,7 @@ PyDoc_STRVAR(_operator_iand__doc__, "Same as a &= b."); #define _OPERATOR_IAND_METHODDEF \ - {"iand", (PyCFunction)(void(*)(void))_operator_iand, METH_FASTCALL, _operator_iand__doc__}, + {"iand", _PyCFunction_CAST(_operator_iand), METH_FASTCALL, _operator_iand__doc__}, static PyObject * _operator_iand_impl(PyObject *module, PyObject *a, PyObject *b); @@ -770,7 +770,7 @@ PyDoc_STRVAR(_operator_ixor__doc__, "Same as a ^= b."); #define _OPERATOR_IXOR_METHODDEF \ - {"ixor", (PyCFunction)(void(*)(void))_operator_ixor, METH_FASTCALL, _operator_ixor__doc__}, + {"ixor", _PyCFunction_CAST(_operator_ixor), METH_FASTCALL, _operator_ixor__doc__}, static PyObject * _operator_ixor_impl(PyObject *module, PyObject *a, PyObject *b); @@ -800,7 +800,7 @@ PyDoc_STRVAR(_operator_ior__doc__, "Same as a |= b."); #define _OPERATOR_IOR_METHODDEF \ - {"ior", (PyCFunction)(void(*)(void))_operator_ior, METH_FASTCALL, _operator_ior__doc__}, + {"ior", _PyCFunction_CAST(_operator_ior), METH_FASTCALL, _operator_ior__doc__}, static PyObject * _operator_ior_impl(PyObject *module, PyObject *a, PyObject *b); @@ -830,7 +830,7 @@ PyDoc_STRVAR(_operator_concat__doc__, "Same as a + b, for a and b sequences."); #define _OPERATOR_CONCAT_METHODDEF \ - {"concat", (PyCFunction)(void(*)(void))_operator_concat, METH_FASTCALL, _operator_concat__doc__}, + {"concat", _PyCFunction_CAST(_operator_concat), METH_FASTCALL, _operator_concat__doc__}, static PyObject * _operator_concat_impl(PyObject *module, PyObject *a, PyObject *b); @@ -860,7 +860,7 @@ PyDoc_STRVAR(_operator_iconcat__doc__, "Same as a += b, for a and b sequences."); #define _OPERATOR_ICONCAT_METHODDEF \ - {"iconcat", (PyCFunction)(void(*)(void))_operator_iconcat, METH_FASTCALL, _operator_iconcat__doc__}, + {"iconcat", _PyCFunction_CAST(_operator_iconcat), METH_FASTCALL, _operator_iconcat__doc__}, static PyObject * _operator_iconcat_impl(PyObject *module, PyObject *a, PyObject *b); @@ -890,7 +890,7 @@ PyDoc_STRVAR(_operator_contains__doc__, "Same as b in a (note reversed operands)."); #define _OPERATOR_CONTAINS_METHODDEF \ - {"contains", (PyCFunction)(void(*)(void))_operator_contains, METH_FASTCALL, _operator_contains__doc__}, + {"contains", _PyCFunction_CAST(_operator_contains), METH_FASTCALL, _operator_contains__doc__}, static int _operator_contains_impl(PyObject *module, PyObject *a, PyObject *b); @@ -925,7 +925,7 @@ PyDoc_STRVAR(_operator_indexOf__doc__, "Return the first index of b in a."); #define _OPERATOR_INDEXOF_METHODDEF \ - {"indexOf", (PyCFunction)(void(*)(void))_operator_indexOf, METH_FASTCALL, _operator_indexOf__doc__}, + {"indexOf", _PyCFunction_CAST(_operator_indexOf), METH_FASTCALL, _operator_indexOf__doc__}, static Py_ssize_t _operator_indexOf_impl(PyObject *module, PyObject *a, PyObject *b); @@ -960,7 +960,7 @@ PyDoc_STRVAR(_operator_countOf__doc__, "Return the number of items in a which are, or which equal, b."); #define _OPERATOR_COUNTOF_METHODDEF \ - {"countOf", (PyCFunction)(void(*)(void))_operator_countOf, METH_FASTCALL, _operator_countOf__doc__}, + {"countOf", _PyCFunction_CAST(_operator_countOf), METH_FASTCALL, _operator_countOf__doc__}, static Py_ssize_t _operator_countOf_impl(PyObject *module, PyObject *a, PyObject *b); @@ -995,7 +995,7 @@ PyDoc_STRVAR(_operator_getitem__doc__, "Same as a[b]."); #define _OPERATOR_GETITEM_METHODDEF \ - {"getitem", (PyCFunction)(void(*)(void))_operator_getitem, METH_FASTCALL, _operator_getitem__doc__}, + {"getitem", _PyCFunction_CAST(_operator_getitem), METH_FASTCALL, _operator_getitem__doc__}, static PyObject * _operator_getitem_impl(PyObject *module, PyObject *a, PyObject *b); @@ -1025,7 +1025,7 @@ PyDoc_STRVAR(_operator_setitem__doc__, "Same as a[b] = c."); #define _OPERATOR_SETITEM_METHODDEF \ - {"setitem", (PyCFunction)(void(*)(void))_operator_setitem, METH_FASTCALL, _operator_setitem__doc__}, + {"setitem", _PyCFunction_CAST(_operator_setitem), METH_FASTCALL, _operator_setitem__doc__}, static PyObject * _operator_setitem_impl(PyObject *module, PyObject *a, PyObject *b, @@ -1058,7 +1058,7 @@ PyDoc_STRVAR(_operator_delitem__doc__, "Same as del a[b]."); #define _OPERATOR_DELITEM_METHODDEF \ - {"delitem", (PyCFunction)(void(*)(void))_operator_delitem, METH_FASTCALL, _operator_delitem__doc__}, + {"delitem", _PyCFunction_CAST(_operator_delitem), METH_FASTCALL, _operator_delitem__doc__}, static PyObject * _operator_delitem_impl(PyObject *module, PyObject *a, PyObject *b); @@ -1088,7 +1088,7 @@ PyDoc_STRVAR(_operator_eq__doc__, "Same as a == b."); #define _OPERATOR_EQ_METHODDEF \ - {"eq", (PyCFunction)(void(*)(void))_operator_eq, METH_FASTCALL, _operator_eq__doc__}, + {"eq", _PyCFunction_CAST(_operator_eq), METH_FASTCALL, _operator_eq__doc__}, static PyObject * _operator_eq_impl(PyObject *module, PyObject *a, PyObject *b); @@ -1118,7 +1118,7 @@ PyDoc_STRVAR(_operator_ne__doc__, "Same as a != b."); #define _OPERATOR_NE_METHODDEF \ - {"ne", (PyCFunction)(void(*)(void))_operator_ne, METH_FASTCALL, _operator_ne__doc__}, + {"ne", _PyCFunction_CAST(_operator_ne), METH_FASTCALL, _operator_ne__doc__}, static PyObject * _operator_ne_impl(PyObject *module, PyObject *a, PyObject *b); @@ -1148,7 +1148,7 @@ PyDoc_STRVAR(_operator_lt__doc__, "Same as a < b."); #define _OPERATOR_LT_METHODDEF \ - {"lt", (PyCFunction)(void(*)(void))_operator_lt, METH_FASTCALL, _operator_lt__doc__}, + {"lt", _PyCFunction_CAST(_operator_lt), METH_FASTCALL, _operator_lt__doc__}, static PyObject * _operator_lt_impl(PyObject *module, PyObject *a, PyObject *b); @@ -1178,7 +1178,7 @@ PyDoc_STRVAR(_operator_le__doc__, "Same as a <= b."); #define _OPERATOR_LE_METHODDEF \ - {"le", (PyCFunction)(void(*)(void))_operator_le, METH_FASTCALL, _operator_le__doc__}, + {"le", _PyCFunction_CAST(_operator_le), METH_FASTCALL, _operator_le__doc__}, static PyObject * _operator_le_impl(PyObject *module, PyObject *a, PyObject *b); @@ -1208,7 +1208,7 @@ PyDoc_STRVAR(_operator_gt__doc__, "Same as a > b."); #define _OPERATOR_GT_METHODDEF \ - {"gt", (PyCFunction)(void(*)(void))_operator_gt, METH_FASTCALL, _operator_gt__doc__}, + {"gt", _PyCFunction_CAST(_operator_gt), METH_FASTCALL, _operator_gt__doc__}, static PyObject * _operator_gt_impl(PyObject *module, PyObject *a, PyObject *b); @@ -1238,7 +1238,7 @@ PyDoc_STRVAR(_operator_ge__doc__, "Same as a >= b."); #define _OPERATOR_GE_METHODDEF \ - {"ge", (PyCFunction)(void(*)(void))_operator_ge, METH_FASTCALL, _operator_ge__doc__}, + {"ge", _PyCFunction_CAST(_operator_ge), METH_FASTCALL, _operator_ge__doc__}, static PyObject * _operator_ge_impl(PyObject *module, PyObject *a, PyObject *b); @@ -1268,7 +1268,7 @@ PyDoc_STRVAR(_operator_pow__doc__, "Same as a ** b."); #define _OPERATOR_POW_METHODDEF \ - {"pow", (PyCFunction)(void(*)(void))_operator_pow, METH_FASTCALL, _operator_pow__doc__}, + {"pow", _PyCFunction_CAST(_operator_pow), METH_FASTCALL, _operator_pow__doc__}, static PyObject * _operator_pow_impl(PyObject *module, PyObject *a, PyObject *b); @@ -1298,7 +1298,7 @@ PyDoc_STRVAR(_operator_ipow__doc__, "Same as a **= b."); #define _OPERATOR_IPOW_METHODDEF \ - {"ipow", (PyCFunction)(void(*)(void))_operator_ipow, METH_FASTCALL, _operator_ipow__doc__}, + {"ipow", _PyCFunction_CAST(_operator_ipow), METH_FASTCALL, _operator_ipow__doc__}, static PyObject * _operator_ipow_impl(PyObject *module, PyObject *a, PyObject *b); @@ -1337,7 +1337,7 @@ PyDoc_STRVAR(_operator_is___doc__, "Same as a is b."); #define _OPERATOR_IS__METHODDEF \ - {"is_", (PyCFunction)(void(*)(void))_operator_is_, METH_FASTCALL, _operator_is___doc__}, + {"is_", _PyCFunction_CAST(_operator_is_), METH_FASTCALL, _operator_is___doc__}, static PyObject * _operator_is__impl(PyObject *module, PyObject *a, PyObject *b); @@ -1367,7 +1367,7 @@ PyDoc_STRVAR(_operator_is_not__doc__, "Same as a is not b."); #define _OPERATOR_IS_NOT_METHODDEF \ - {"is_not", (PyCFunction)(void(*)(void))_operator_is_not, METH_FASTCALL, _operator_is_not__doc__}, + {"is_not", _PyCFunction_CAST(_operator_is_not), METH_FASTCALL, _operator_is_not__doc__}, static PyObject * _operator_is_not_impl(PyObject *module, PyObject *a, PyObject *b); @@ -1403,7 +1403,7 @@ PyDoc_STRVAR(_operator_length_hint__doc__, "The result will be an integer >= 0."); #define _OPERATOR_LENGTH_HINT_METHODDEF \ - {"length_hint", (PyCFunction)(void(*)(void))_operator_length_hint, METH_FASTCALL, _operator_length_hint__doc__}, + {"length_hint", _PyCFunction_CAST(_operator_length_hint), METH_FASTCALL, _operator_length_hint__doc__}, static Py_ssize_t _operator_length_hint_impl(PyObject *module, PyObject *obj, @@ -1464,7 +1464,7 @@ PyDoc_STRVAR(_operator__compare_digest__doc__, "types and lengths of a and b--but not their values."); #define _OPERATOR__COMPARE_DIGEST_METHODDEF \ - {"_compare_digest", (PyCFunction)(void(*)(void))_operator__compare_digest, METH_FASTCALL, _operator__compare_digest__doc__}, + {"_compare_digest", _PyCFunction_CAST(_operator__compare_digest), METH_FASTCALL, _operator__compare_digest__doc__}, static PyObject * _operator__compare_digest_impl(PyObject *module, PyObject *a, PyObject *b); @@ -1486,4 +1486,4 @@ _operator__compare_digest(PyObject *module, PyObject *const *args, Py_ssize_t na exit: return return_value; } -/*[clinic end generated code: output=16749e11fda51785 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=44164c4fbd67e5c5 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_pickle.c.h b/Modules/clinic/_pickle.c.h index 136524b6a7134..5dc62fe190176 100644 --- a/Modules/clinic/_pickle.c.h +++ b/Modules/clinic/_pickle.c.h @@ -238,7 +238,7 @@ PyDoc_STRVAR(_pickle_Unpickler_find_class__doc__, "needed. Both arguments passed are str objects."); #define _PICKLE_UNPICKLER_FIND_CLASS_METHODDEF \ - {"find_class", (PyCFunction)(void(*)(void))_pickle_Unpickler_find_class, METH_FASTCALL, _pickle_Unpickler_find_class__doc__}, + {"find_class", _PyCFunction_CAST(_pickle_Unpickler_find_class), METH_FASTCALL, _pickle_Unpickler_find_class__doc__}, static PyObject * _pickle_Unpickler_find_class_impl(UnpicklerObject *self, @@ -486,7 +486,7 @@ PyDoc_STRVAR(_pickle_dump__doc__, "*buffer_callback* is not None and *protocol* is None or smaller than 5."); #define _PICKLE_DUMP_METHODDEF \ - {"dump", (PyCFunction)(void(*)(void))_pickle_dump, METH_FASTCALL|METH_KEYWORDS, _pickle_dump__doc__}, + {"dump", _PyCFunction_CAST(_pickle_dump), METH_FASTCALL|METH_KEYWORDS, _pickle_dump__doc__}, static PyObject * _pickle_dump_impl(PyObject *module, PyObject *obj, PyObject *file, @@ -568,7 +568,7 @@ PyDoc_STRVAR(_pickle_dumps__doc__, "*buffer_callback* is not None and *protocol* is None or smaller than 5."); #define _PICKLE_DUMPS_METHODDEF \ - {"dumps", (PyCFunction)(void(*)(void))_pickle_dumps, METH_FASTCALL|METH_KEYWORDS, _pickle_dumps__doc__}, + {"dumps", _PyCFunction_CAST(_pickle_dumps), METH_FASTCALL|METH_KEYWORDS, _pickle_dumps__doc__}, static PyObject * _pickle_dumps_impl(PyObject *module, PyObject *obj, PyObject *protocol, @@ -652,7 +652,7 @@ PyDoc_STRVAR(_pickle_load__doc__, "string instances as bytes objects."); #define _PICKLE_LOAD_METHODDEF \ - {"load", (PyCFunction)(void(*)(void))_pickle_load, METH_FASTCALL|METH_KEYWORDS, _pickle_load__doc__}, + {"load", _PyCFunction_CAST(_pickle_load), METH_FASTCALL|METH_KEYWORDS, _pickle_load__doc__}, static PyObject * _pickle_load_impl(PyObject *module, PyObject *file, int fix_imports, @@ -755,7 +755,7 @@ PyDoc_STRVAR(_pickle_loads__doc__, "string instances as bytes objects."); #define _PICKLE_LOADS_METHODDEF \ - {"loads", (PyCFunction)(void(*)(void))_pickle_loads, METH_FASTCALL|METH_KEYWORDS, _pickle_loads__doc__}, + {"loads", _PyCFunction_CAST(_pickle_loads), METH_FASTCALL|METH_KEYWORDS, _pickle_loads__doc__}, static PyObject * _pickle_loads_impl(PyObject *module, PyObject *data, int fix_imports, @@ -836,4 +836,4 @@ _pickle_loads(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObjec exit: return return_value; } -/*[clinic end generated code: output=324aad69644beda2 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=1bb1ead3c828e108 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_queuemodule.c.h b/Modules/clinic/_queuemodule.c.h index 056a8ef52e00f..b0b00f8199b54 100644 --- a/Modules/clinic/_queuemodule.c.h +++ b/Modules/clinic/_queuemodule.c.h @@ -42,7 +42,7 @@ PyDoc_STRVAR(_queue_SimpleQueue_put__doc__, "never blocks. They are provided for compatibility with the Queue class."); #define _QUEUE_SIMPLEQUEUE_PUT_METHODDEF \ - {"put", (PyCFunction)(void(*)(void))_queue_SimpleQueue_put, METH_FASTCALL|METH_KEYWORDS, _queue_SimpleQueue_put__doc__}, + {"put", _PyCFunction_CAST(_queue_SimpleQueue_put), METH_FASTCALL|METH_KEYWORDS, _queue_SimpleQueue_put__doc__}, static PyObject * _queue_SimpleQueue_put_impl(simplequeueobject *self, PyObject *item, @@ -95,7 +95,7 @@ PyDoc_STRVAR(_queue_SimpleQueue_put_nowait__doc__, "for compatibility with the Queue class."); #define _QUEUE_SIMPLEQUEUE_PUT_NOWAIT_METHODDEF \ - {"put_nowait", (PyCFunction)(void(*)(void))_queue_SimpleQueue_put_nowait, METH_FASTCALL|METH_KEYWORDS, _queue_SimpleQueue_put_nowait__doc__}, + {"put_nowait", _PyCFunction_CAST(_queue_SimpleQueue_put_nowait), METH_FASTCALL|METH_KEYWORDS, _queue_SimpleQueue_put_nowait__doc__}, static PyObject * _queue_SimpleQueue_put_nowait_impl(simplequeueobject *self, PyObject *item); @@ -135,7 +135,7 @@ PyDoc_STRVAR(_queue_SimpleQueue_get__doc__, "in that case)."); #define _QUEUE_SIMPLEQUEUE_GET_METHODDEF \ - {"get", (PyCFunction)(void(*)(void))_queue_SimpleQueue_get, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _queue_SimpleQueue_get__doc__}, + {"get", _PyCFunction_CAST(_queue_SimpleQueue_get), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _queue_SimpleQueue_get__doc__}, static PyObject * _queue_SimpleQueue_get_impl(simplequeueobject *self, PyTypeObject *cls, @@ -186,7 +186,7 @@ PyDoc_STRVAR(_queue_SimpleQueue_get_nowait__doc__, "raise the Empty exception."); #define _QUEUE_SIMPLEQUEUE_GET_NOWAIT_METHODDEF \ - {"get_nowait", (PyCFunction)(void(*)(void))_queue_SimpleQueue_get_nowait, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _queue_SimpleQueue_get_nowait__doc__}, + {"get_nowait", _PyCFunction_CAST(_queue_SimpleQueue_get_nowait), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _queue_SimpleQueue_get_nowait__doc__}, static PyObject * _queue_SimpleQueue_get_nowait_impl(simplequeueobject *self, @@ -257,4 +257,4 @@ _queue_SimpleQueue_qsize(simplequeueobject *self, PyObject *Py_UNUSED(ignored)) exit: return return_value; } -/*[clinic end generated code: output=36301c405a858f39 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=88ec8033aeb7241c input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_randommodule.c.h b/Modules/clinic/_randommodule.c.h index b3cd435b6f204..503c1f93ed814 100644 --- a/Modules/clinic/_randommodule.c.h +++ b/Modules/clinic/_randommodule.c.h @@ -30,7 +30,7 @@ PyDoc_STRVAR(_random_Random_seed__doc__, "of the current time and the process identifier."); #define _RANDOM_RANDOM_SEED_METHODDEF \ - {"seed", (PyCFunction)(void(*)(void))_random_Random_seed, METH_FASTCALL, _random_Random_seed__doc__}, + {"seed", _PyCFunction_CAST(_random_Random_seed), METH_FASTCALL, _random_Random_seed__doc__}, static PyObject * _random_Random_seed_impl(RandomObject *self, PyObject *n); @@ -109,4 +109,4 @@ _random_Random_getrandbits(RandomObject *self, PyObject *arg) exit: return return_value; } -/*[clinic end generated code: output=cc8a23b2757dc6ba input=a9049054013a1b77]*/ +/*[clinic end generated code: output=d144826cde89e605 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_ssl.c.h b/Modules/clinic/_ssl.c.h index 67eaf3f9609fa..67b125f3d7616 100644 --- a/Modules/clinic/_ssl.c.h +++ b/Modules/clinic/_ssl.c.h @@ -60,7 +60,7 @@ PyDoc_STRVAR(_ssl__SSLSocket_getpeercert__doc__, "return the certificate even if it wasn\'t validated."); #define _SSL__SSLSOCKET_GETPEERCERT_METHODDEF \ - {"getpeercert", (PyCFunction)(void(*)(void))_ssl__SSLSocket_getpeercert, METH_FASTCALL, _ssl__SSLSocket_getpeercert__doc__}, + {"getpeercert", _PyCFunction_CAST(_ssl__SSLSocket_getpeercert), METH_FASTCALL, _ssl__SSLSocket_getpeercert__doc__}, static PyObject * _ssl__SSLSocket_getpeercert_impl(PySSLSocket *self, int binary_mode); @@ -338,7 +338,7 @@ PyDoc_STRVAR(_ssl__SSLSocket_get_channel_binding__doc__, "Only \'tls-unique\' channel binding data from RFC 5929 is supported."); #define _SSL__SSLSOCKET_GET_CHANNEL_BINDING_METHODDEF \ - {"get_channel_binding", (PyCFunction)(void(*)(void))_ssl__SSLSocket_get_channel_binding, METH_FASTCALL|METH_KEYWORDS, _ssl__SSLSocket_get_channel_binding__doc__}, + {"get_channel_binding", _PyCFunction_CAST(_ssl__SSLSocket_get_channel_binding), METH_FASTCALL|METH_KEYWORDS, _ssl__SSLSocket_get_channel_binding__doc__}, static PyObject * _ssl__SSLSocket_get_channel_binding_impl(PySSLSocket *self, @@ -521,7 +521,7 @@ PyDoc_STRVAR(_ssl__SSLContext_load_cert_chain__doc__, "\n"); #define _SSL__SSLCONTEXT_LOAD_CERT_CHAIN_METHODDEF \ - {"load_cert_chain", (PyCFunction)(void(*)(void))_ssl__SSLContext_load_cert_chain, METH_FASTCALL|METH_KEYWORDS, _ssl__SSLContext_load_cert_chain__doc__}, + {"load_cert_chain", _PyCFunction_CAST(_ssl__SSLContext_load_cert_chain), METH_FASTCALL|METH_KEYWORDS, _ssl__SSLContext_load_cert_chain__doc__}, static PyObject * _ssl__SSLContext_load_cert_chain_impl(PySSLContext *self, PyObject *certfile, @@ -567,7 +567,7 @@ PyDoc_STRVAR(_ssl__SSLContext_load_verify_locations__doc__, "\n"); #define _SSL__SSLCONTEXT_LOAD_VERIFY_LOCATIONS_METHODDEF \ - {"load_verify_locations", (PyCFunction)(void(*)(void))_ssl__SSLContext_load_verify_locations, METH_FASTCALL|METH_KEYWORDS, _ssl__SSLContext_load_verify_locations__doc__}, + {"load_verify_locations", _PyCFunction_CAST(_ssl__SSLContext_load_verify_locations), METH_FASTCALL|METH_KEYWORDS, _ssl__SSLContext_load_verify_locations__doc__}, static PyObject * _ssl__SSLContext_load_verify_locations_impl(PySSLContext *self, @@ -629,7 +629,7 @@ PyDoc_STRVAR(_ssl__SSLContext__wrap_socket__doc__, "\n"); #define _SSL__SSLCONTEXT__WRAP_SOCKET_METHODDEF \ - {"_wrap_socket", (PyCFunction)(void(*)(void))_ssl__SSLContext__wrap_socket, METH_FASTCALL|METH_KEYWORDS, _ssl__SSLContext__wrap_socket__doc__}, + {"_wrap_socket", _PyCFunction_CAST(_ssl__SSLContext__wrap_socket), METH_FASTCALL|METH_KEYWORDS, _ssl__SSLContext__wrap_socket__doc__}, static PyObject * _ssl__SSLContext__wrap_socket_impl(PySSLContext *self, PyObject *sock, @@ -697,7 +697,7 @@ PyDoc_STRVAR(_ssl__SSLContext__wrap_bio__doc__, "\n"); #define _SSL__SSLCONTEXT__WRAP_BIO_METHODDEF \ - {"_wrap_bio", (PyCFunction)(void(*)(void))_ssl__SSLContext__wrap_bio, METH_FASTCALL|METH_KEYWORDS, _ssl__SSLContext__wrap_bio__doc__}, + {"_wrap_bio", _PyCFunction_CAST(_ssl__SSLContext__wrap_bio), METH_FASTCALL|METH_KEYWORDS, _ssl__SSLContext__wrap_bio__doc__}, static PyObject * _ssl__SSLContext__wrap_bio_impl(PySSLContext *self, PySSLMemoryBIO *incoming, @@ -844,7 +844,7 @@ PyDoc_STRVAR(_ssl__SSLContext_get_ca_certs__doc__, "been used at least once."); #define _SSL__SSLCONTEXT_GET_CA_CERTS_METHODDEF \ - {"get_ca_certs", (PyCFunction)(void(*)(void))_ssl__SSLContext_get_ca_certs, METH_FASTCALL|METH_KEYWORDS, _ssl__SSLContext_get_ca_certs__doc__}, + {"get_ca_certs", _PyCFunction_CAST(_ssl__SSLContext_get_ca_certs), METH_FASTCALL|METH_KEYWORDS, _ssl__SSLContext_get_ca_certs__doc__}, static PyObject * _ssl__SSLContext_get_ca_certs_impl(PySSLContext *self, int binary_form); @@ -913,7 +913,7 @@ PyDoc_STRVAR(_ssl_MemoryBIO_read__doc__, "distinguish between the two."); #define _SSL_MEMORYBIO_READ_METHODDEF \ - {"read", (PyCFunction)(void(*)(void))_ssl_MemoryBIO_read, METH_FASTCALL, _ssl_MemoryBIO_read__doc__}, + {"read", _PyCFunction_CAST(_ssl_MemoryBIO_read), METH_FASTCALL, _ssl_MemoryBIO_read__doc__}, static PyObject * _ssl_MemoryBIO_read_impl(PySSLMemoryBIO *self, int len); @@ -1009,7 +1009,7 @@ PyDoc_STRVAR(_ssl_RAND_add__doc__, "string. See RFC 4086."); #define _SSL_RAND_ADD_METHODDEF \ - {"RAND_add", (PyCFunction)(void(*)(void))_ssl_RAND_add, METH_FASTCALL, _ssl_RAND_add__doc__}, + {"RAND_add", _PyCFunction_CAST(_ssl_RAND_add), METH_FASTCALL, _ssl_RAND_add__doc__}, static PyObject * _ssl_RAND_add_impl(PyObject *module, Py_buffer *view, double entropy); @@ -1172,7 +1172,7 @@ PyDoc_STRVAR(_ssl_txt2obj__doc__, "long name are also matched."); #define _SSL_TXT2OBJ_METHODDEF \ - {"txt2obj", (PyCFunction)(void(*)(void))_ssl_txt2obj, METH_FASTCALL|METH_KEYWORDS, _ssl_txt2obj__doc__}, + {"txt2obj", _PyCFunction_CAST(_ssl_txt2obj), METH_FASTCALL|METH_KEYWORDS, _ssl_txt2obj__doc__}, static PyObject * _ssl_txt2obj_impl(PyObject *module, const char *txt, int name); @@ -1262,7 +1262,7 @@ PyDoc_STRVAR(_ssl_enum_certificates__doc__, "a set of OIDs or the boolean True."); #define _SSL_ENUM_CERTIFICATES_METHODDEF \ - {"enum_certificates", (PyCFunction)(void(*)(void))_ssl_enum_certificates, METH_FASTCALL|METH_KEYWORDS, _ssl_enum_certificates__doc__}, + {"enum_certificates", _PyCFunction_CAST(_ssl_enum_certificates), METH_FASTCALL|METH_KEYWORDS, _ssl_enum_certificates__doc__}, static PyObject * _ssl_enum_certificates_impl(PyObject *module, const char *store_name); @@ -1315,7 +1315,7 @@ PyDoc_STRVAR(_ssl_enum_crls__doc__, "X509_ASN_ENCODING or PKCS_7_ASN_ENCODING."); #define _SSL_ENUM_CRLS_METHODDEF \ - {"enum_crls", (PyCFunction)(void(*)(void))_ssl_enum_crls, METH_FASTCALL|METH_KEYWORDS, _ssl_enum_crls__doc__}, + {"enum_crls", _PyCFunction_CAST(_ssl_enum_crls), METH_FASTCALL|METH_KEYWORDS, _ssl_enum_crls__doc__}, static PyObject * _ssl_enum_crls_impl(PyObject *module, const char *store_name); @@ -1361,4 +1361,4 @@ _ssl_enum_crls(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObje #ifndef _SSL_ENUM_CRLS_METHODDEF #define _SSL_ENUM_CRLS_METHODDEF #endif /* !defined(_SSL_ENUM_CRLS_METHODDEF) */ -/*[clinic end generated code: output=cd2a53c26eda295e input=a9049054013a1b77]*/ +/*[clinic end generated code: output=2a488dd0cbc777df input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_statisticsmodule.c.h b/Modules/clinic/_statisticsmodule.c.h index 5ff01efddcde8..03543e41af7f5 100644 --- a/Modules/clinic/_statisticsmodule.c.h +++ b/Modules/clinic/_statisticsmodule.c.h @@ -8,7 +8,7 @@ PyDoc_STRVAR(_statistics__normal_dist_inv_cdf__doc__, "\n"); #define _STATISTICS__NORMAL_DIST_INV_CDF_METHODDEF \ - {"_normal_dist_inv_cdf", (PyCFunction)(void(*)(void))_statistics__normal_dist_inv_cdf, METH_FASTCALL, _statistics__normal_dist_inv_cdf__doc__}, + {"_normal_dist_inv_cdf", _PyCFunction_CAST(_statistics__normal_dist_inv_cdf), METH_FASTCALL, _statistics__normal_dist_inv_cdf__doc__}, static double _statistics__normal_dist_inv_cdf_impl(PyObject *module, double p, double mu, @@ -65,4 +65,4 @@ _statistics__normal_dist_inv_cdf(PyObject *module, PyObject *const *args, Py_ssi exit: return return_value; } -/*[clinic end generated code: output=c5826928a238326c input=a9049054013a1b77]*/ +/*[clinic end generated code: output=b807a8243e7801e6 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_struct.c.h b/Modules/clinic/_struct.c.h index b0c1eb4587ae2..39b8ccb5ca49b 100644 --- a/Modules/clinic/_struct.c.h +++ b/Modules/clinic/_struct.c.h @@ -93,7 +93,7 @@ PyDoc_STRVAR(Struct_unpack_from__doc__, "See help(struct) for more on format strings."); #define STRUCT_UNPACK_FROM_METHODDEF \ - {"unpack_from", (PyCFunction)(void(*)(void))Struct_unpack_from, METH_FASTCALL|METH_KEYWORDS, Struct_unpack_from__doc__}, + {"unpack_from", _PyCFunction_CAST(Struct_unpack_from), METH_FASTCALL|METH_KEYWORDS, Struct_unpack_from__doc__}, static PyObject * Struct_unpack_from_impl(PyStructObject *self, Py_buffer *buffer, @@ -226,7 +226,7 @@ PyDoc_STRVAR(unpack__doc__, "See help(struct) for more on format strings."); #define UNPACK_METHODDEF \ - {"unpack", (PyCFunction)(void(*)(void))unpack, METH_FASTCALL, unpack__doc__}, + {"unpack", _PyCFunction_CAST(unpack), METH_FASTCALL, unpack__doc__}, static PyObject * unpack_impl(PyObject *module, PyStructObject *s_object, Py_buffer *buffer); @@ -275,7 +275,7 @@ PyDoc_STRVAR(unpack_from__doc__, "See help(struct) for more on format strings."); #define UNPACK_FROM_METHODDEF \ - {"unpack_from", (PyCFunction)(void(*)(void))unpack_from, METH_FASTCALL|METH_KEYWORDS, unpack_from__doc__}, + {"unpack_from", _PyCFunction_CAST(unpack_from), METH_FASTCALL|METH_KEYWORDS, unpack_from__doc__}, static PyObject * unpack_from_impl(PyObject *module, PyStructObject *s_object, @@ -348,7 +348,7 @@ PyDoc_STRVAR(iter_unpack__doc__, "Requires that the bytes length be a multiple of the format struct size."); #define ITER_UNPACK_METHODDEF \ - {"iter_unpack", (PyCFunction)(void(*)(void))iter_unpack, METH_FASTCALL, iter_unpack__doc__}, + {"iter_unpack", _PyCFunction_CAST(iter_unpack), METH_FASTCALL, iter_unpack__doc__}, static PyObject * iter_unpack_impl(PyObject *module, PyStructObject *s_object, @@ -376,4 +376,4 @@ iter_unpack(PyObject *module, PyObject *const *args, Py_ssize_t nargs) return return_value; } -/*[clinic end generated code: output=a3d3cd900091cb1c input=a9049054013a1b77]*/ +/*[clinic end generated code: output=2065c9b007be631c input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_testmultiphase.c.h b/Modules/clinic/_testmultiphase.c.h index 753670934bf81..eabaea635d50d 100644 --- a/Modules/clinic/_testmultiphase.c.h +++ b/Modules/clinic/_testmultiphase.c.h @@ -12,7 +12,7 @@ PyDoc_STRVAR(_testmultiphase_StateAccessType_get_defining_module__doc__, "module."); #define _TESTMULTIPHASE_STATEACCESSTYPE_GET_DEFINING_MODULE_METHODDEF \ - {"get_defining_module", (PyCFunction)(void(*)(void))_testmultiphase_StateAccessType_get_defining_module, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _testmultiphase_StateAccessType_get_defining_module__doc__}, + {"get_defining_module", _PyCFunction_CAST(_testmultiphase_StateAccessType_get_defining_module), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _testmultiphase_StateAccessType_get_defining_module__doc__}, static PyObject * _testmultiphase_StateAccessType_get_defining_module_impl(StateAccessTypeObject *self, @@ -35,7 +35,7 @@ PyDoc_STRVAR(_testmultiphase_StateAccessType_getmodulebydef_bad_def__doc__, "Test that result of PyType_GetModuleByDef with a bad def is NULL."); #define _TESTMULTIPHASE_STATEACCESSTYPE_GETMODULEBYDEF_BAD_DEF_METHODDEF \ - {"getmodulebydef_bad_def", (PyCFunction)(void(*)(void))_testmultiphase_StateAccessType_getmodulebydef_bad_def, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _testmultiphase_StateAccessType_getmodulebydef_bad_def__doc__}, + {"getmodulebydef_bad_def", _PyCFunction_CAST(_testmultiphase_StateAccessType_getmodulebydef_bad_def), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _testmultiphase_StateAccessType_getmodulebydef_bad_def__doc__}, static PyObject * _testmultiphase_StateAccessType_getmodulebydef_bad_def_impl(StateAccessTypeObject *self, @@ -62,7 +62,7 @@ PyDoc_STRVAR(_testmultiphase_StateAccessType_increment_count_clinic__doc__, "This tests Argument Clinic support for defining_class."); #define _TESTMULTIPHASE_STATEACCESSTYPE_INCREMENT_COUNT_CLINIC_METHODDEF \ - {"increment_count_clinic", (PyCFunction)(void(*)(void))_testmultiphase_StateAccessType_increment_count_clinic, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _testmultiphase_StateAccessType_increment_count_clinic__doc__}, + {"increment_count_clinic", _PyCFunction_CAST(_testmultiphase_StateAccessType_increment_count_clinic), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _testmultiphase_StateAccessType_increment_count_clinic__doc__}, static PyObject * _testmultiphase_StateAccessType_increment_count_clinic_impl(StateAccessTypeObject *self, @@ -118,7 +118,7 @@ PyDoc_STRVAR(_testmultiphase_StateAccessType_get_count__doc__, "Return the value of the module-state counter."); #define _TESTMULTIPHASE_STATEACCESSTYPE_GET_COUNT_METHODDEF \ - {"get_count", (PyCFunction)(void(*)(void))_testmultiphase_StateAccessType_get_count, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _testmultiphase_StateAccessType_get_count__doc__}, + {"get_count", _PyCFunction_CAST(_testmultiphase_StateAccessType_get_count), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _testmultiphase_StateAccessType_get_count__doc__}, static PyObject * _testmultiphase_StateAccessType_get_count_impl(StateAccessTypeObject *self, @@ -133,4 +133,4 @@ _testmultiphase_StateAccessType_get_count(StateAccessTypeObject *self, PyTypeObj } return _testmultiphase_StateAccessType_get_count_impl(self, cls); } -/*[clinic end generated code: output=b41a400ef84f50af input=a9049054013a1b77]*/ +/*[clinic end generated code: output=48739d81c3834078 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_tkinter.c.h b/Modules/clinic/_tkinter.c.h index ea45858d73f21..9103565ead702 100644 --- a/Modules/clinic/_tkinter.c.h +++ b/Modules/clinic/_tkinter.c.h @@ -328,7 +328,7 @@ PyDoc_STRVAR(_tkinter_tkapp_createcommand__doc__, "\n"); #define _TKINTER_TKAPP_CREATECOMMAND_METHODDEF \ - {"createcommand", (PyCFunction)(void(*)(void))_tkinter_tkapp_createcommand, METH_FASTCALL, _tkinter_tkapp_createcommand__doc__}, + {"createcommand", _PyCFunction_CAST(_tkinter_tkapp_createcommand), METH_FASTCALL, _tkinter_tkapp_createcommand__doc__}, static PyObject * _tkinter_tkapp_createcommand_impl(TkappObject *self, const char *name, @@ -408,7 +408,7 @@ PyDoc_STRVAR(_tkinter_tkapp_createfilehandler__doc__, "\n"); #define _TKINTER_TKAPP_CREATEFILEHANDLER_METHODDEF \ - {"createfilehandler", (PyCFunction)(void(*)(void))_tkinter_tkapp_createfilehandler, METH_FASTCALL, _tkinter_tkapp_createfilehandler__doc__}, + {"createfilehandler", _PyCFunction_CAST(_tkinter_tkapp_createfilehandler), METH_FASTCALL, _tkinter_tkapp_createfilehandler__doc__}, static PyObject * _tkinter_tkapp_createfilehandler_impl(TkappObject *self, PyObject *file, @@ -474,7 +474,7 @@ PyDoc_STRVAR(_tkinter_tkapp_createtimerhandler__doc__, "\n"); #define _TKINTER_TKAPP_CREATETIMERHANDLER_METHODDEF \ - {"createtimerhandler", (PyCFunction)(void(*)(void))_tkinter_tkapp_createtimerhandler, METH_FASTCALL, _tkinter_tkapp_createtimerhandler__doc__}, + {"createtimerhandler", _PyCFunction_CAST(_tkinter_tkapp_createtimerhandler), METH_FASTCALL, _tkinter_tkapp_createtimerhandler__doc__}, static PyObject * _tkinter_tkapp_createtimerhandler_impl(TkappObject *self, int milliseconds, @@ -507,7 +507,7 @@ PyDoc_STRVAR(_tkinter_tkapp_mainloop__doc__, "\n"); #define _TKINTER_TKAPP_MAINLOOP_METHODDEF \ - {"mainloop", (PyCFunction)(void(*)(void))_tkinter_tkapp_mainloop, METH_FASTCALL, _tkinter_tkapp_mainloop__doc__}, + {"mainloop", _PyCFunction_CAST(_tkinter_tkapp_mainloop), METH_FASTCALL, _tkinter_tkapp_mainloop__doc__}, static PyObject * _tkinter_tkapp_mainloop_impl(TkappObject *self, int threshold); @@ -541,7 +541,7 @@ PyDoc_STRVAR(_tkinter_tkapp_dooneevent__doc__, "\n"); #define _TKINTER_TKAPP_DOONEEVENT_METHODDEF \ - {"dooneevent", (PyCFunction)(void(*)(void))_tkinter_tkapp_dooneevent, METH_FASTCALL, _tkinter_tkapp_dooneevent__doc__}, + {"dooneevent", _PyCFunction_CAST(_tkinter_tkapp_dooneevent), METH_FASTCALL, _tkinter_tkapp_dooneevent__doc__}, static PyObject * _tkinter_tkapp_dooneevent_impl(TkappObject *self, int flags); @@ -661,7 +661,7 @@ PyDoc_STRVAR(_tkinter_create__doc__, " if not None, then pass -use to wish"); #define _TKINTER_CREATE_METHODDEF \ - {"create", (PyCFunction)(void(*)(void))_tkinter_create, METH_FASTCALL, _tkinter_create__doc__}, + {"create", _PyCFunction_CAST(_tkinter_create), METH_FASTCALL, _tkinter_create__doc__}, static PyObject * _tkinter_create_impl(PyObject *module, const char *screenName, @@ -859,4 +859,4 @@ _tkinter_getbusywaitinterval(PyObject *module, PyObject *Py_UNUSED(ignored)) #ifndef _TKINTER_TKAPP_DELETEFILEHANDLER_METHODDEF #define _TKINTER_TKAPP_DELETEFILEHANDLER_METHODDEF #endif /* !defined(_TKINTER_TKAPP_DELETEFILEHANDLER_METHODDEF) */ -/*[clinic end generated code: output=b6d2dcb488c13aa7 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=b0667ac928eb0c28 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_tracemalloc.c.h b/Modules/clinic/_tracemalloc.c.h index 20afd76f06f11..20c4d5d81b9e9 100644 --- a/Modules/clinic/_tracemalloc.c.h +++ b/Modules/clinic/_tracemalloc.c.h @@ -84,7 +84,7 @@ PyDoc_STRVAR(_tracemalloc_start__doc__, "trace to nframe."); #define _TRACEMALLOC_START_METHODDEF \ - {"start", (PyCFunction)(void(*)(void))_tracemalloc_start, METH_FASTCALL, _tracemalloc_start__doc__}, + {"start", _PyCFunction_CAST(_tracemalloc_start), METH_FASTCALL, _tracemalloc_start__doc__}, static PyObject * _tracemalloc_start_impl(PyObject *module, int nframe); @@ -212,4 +212,4 @@ _tracemalloc_reset_peak(PyObject *module, PyObject *Py_UNUSED(ignored)) { return _tracemalloc_reset_peak_impl(module); } -/*[clinic end generated code: output=bafca0a19b0b0823 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=2ae4fe05f1a340c9 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_weakref.c.h b/Modules/clinic/_weakref.c.h index 02f0168937cde..541cba75e6813 100644 --- a/Modules/clinic/_weakref.c.h +++ b/Modules/clinic/_weakref.c.h @@ -37,7 +37,7 @@ PyDoc_STRVAR(_weakref__remove_dead_weakref__doc__, "Atomically remove key from dict if it points to a dead weakref."); #define _WEAKREF__REMOVE_DEAD_WEAKREF_METHODDEF \ - {"_remove_dead_weakref", (PyCFunction)(void(*)(void))_weakref__remove_dead_weakref, METH_FASTCALL, _weakref__remove_dead_weakref__doc__}, + {"_remove_dead_weakref", _PyCFunction_CAST(_weakref__remove_dead_weakref), METH_FASTCALL, _weakref__remove_dead_weakref__doc__}, static PyObject * _weakref__remove_dead_weakref_impl(PyObject *module, PyObject *dct, @@ -84,7 +84,7 @@ PyDoc_STRVAR(_weakref_proxy__doc__, "proxy when \'object\' is about to be finalized."); #define _WEAKREF_PROXY_METHODDEF \ - {"proxy", (PyCFunction)(void(*)(void))_weakref_proxy, METH_FASTCALL, _weakref_proxy__doc__}, + {"proxy", _PyCFunction_CAST(_weakref_proxy), METH_FASTCALL, _weakref_proxy__doc__}, static PyObject * _weakref_proxy_impl(PyObject *module, PyObject *object, PyObject *callback); @@ -110,4 +110,4 @@ _weakref_proxy(PyObject *module, PyObject *const *args, Py_ssize_t nargs) exit: return return_value; } -/*[clinic end generated code: output=5a10a1fa43722399 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=f4be6b8177fbceb8 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_winapi.c.h b/Modules/clinic/_winapi.c.h index 5bda156d7aa80..9c83d0ba2c545 100644 --- a/Modules/clinic/_winapi.c.h +++ b/Modules/clinic/_winapi.c.h @@ -96,7 +96,7 @@ PyDoc_STRVAR(_winapi_ConnectNamedPipe__doc__, "\n"); #define _WINAPI_CONNECTNAMEDPIPE_METHODDEF \ - {"ConnectNamedPipe", (PyCFunction)(void(*)(void))_winapi_ConnectNamedPipe, METH_FASTCALL|METH_KEYWORDS, _winapi_ConnectNamedPipe__doc__}, + {"ConnectNamedPipe", _PyCFunction_CAST(_winapi_ConnectNamedPipe), METH_FASTCALL|METH_KEYWORDS, _winapi_ConnectNamedPipe__doc__}, static PyObject * _winapi_ConnectNamedPipe_impl(PyObject *module, HANDLE handle, @@ -129,7 +129,7 @@ PyDoc_STRVAR(_winapi_CreateFile__doc__, "\n"); #define _WINAPI_CREATEFILE_METHODDEF \ - {"CreateFile", (PyCFunction)(void(*)(void))_winapi_CreateFile, METH_FASTCALL, _winapi_CreateFile__doc__}, + {"CreateFile", _PyCFunction_CAST(_winapi_CreateFile), METH_FASTCALL, _winapi_CreateFile__doc__}, static HANDLE _winapi_CreateFile_impl(PyObject *module, LPCTSTR file_name, @@ -175,7 +175,7 @@ PyDoc_STRVAR(_winapi_CreateFileMapping__doc__, "\n"); #define _WINAPI_CREATEFILEMAPPING_METHODDEF \ - {"CreateFileMapping", (PyCFunction)(void(*)(void))_winapi_CreateFileMapping, METH_FASTCALL, _winapi_CreateFileMapping__doc__}, + {"CreateFileMapping", _PyCFunction_CAST(_winapi_CreateFileMapping), METH_FASTCALL, _winapi_CreateFileMapping__doc__}, static HANDLE _winapi_CreateFileMapping_impl(PyObject *module, HANDLE file_handle, @@ -223,7 +223,7 @@ PyDoc_STRVAR(_winapi_CreateJunction__doc__, "\n"); #define _WINAPI_CREATEJUNCTION_METHODDEF \ - {"CreateJunction", (PyCFunction)(void(*)(void))_winapi_CreateJunction, METH_FASTCALL, _winapi_CreateJunction__doc__}, + {"CreateJunction", _PyCFunction_CAST(_winapi_CreateJunction), METH_FASTCALL, _winapi_CreateJunction__doc__}, static PyObject * _winapi_CreateJunction_impl(PyObject *module, LPCWSTR src_path, @@ -286,7 +286,7 @@ PyDoc_STRVAR(_winapi_CreateNamedPipe__doc__, "\n"); #define _WINAPI_CREATENAMEDPIPE_METHODDEF \ - {"CreateNamedPipe", (PyCFunction)(void(*)(void))_winapi_CreateNamedPipe, METH_FASTCALL, _winapi_CreateNamedPipe__doc__}, + {"CreateNamedPipe", _PyCFunction_CAST(_winapi_CreateNamedPipe), METH_FASTCALL, _winapi_CreateNamedPipe__doc__}, static HANDLE _winapi_CreateNamedPipe_impl(PyObject *module, LPCTSTR name, DWORD open_mode, @@ -338,7 +338,7 @@ PyDoc_STRVAR(_winapi_CreatePipe__doc__, "Returns a 2-tuple of handles, to the read and write ends of the pipe."); #define _WINAPI_CREATEPIPE_METHODDEF \ - {"CreatePipe", (PyCFunction)(void(*)(void))_winapi_CreatePipe, METH_FASTCALL, _winapi_CreatePipe__doc__}, + {"CreatePipe", _PyCFunction_CAST(_winapi_CreatePipe), METH_FASTCALL, _winapi_CreatePipe__doc__}, static PyObject * _winapi_CreatePipe_impl(PyObject *module, PyObject *pipe_attrs, DWORD size); @@ -379,7 +379,7 @@ PyDoc_STRVAR(_winapi_CreateProcess__doc__, "process ID, and thread ID."); #define _WINAPI_CREATEPROCESS_METHODDEF \ - {"CreateProcess", (PyCFunction)(void(*)(void))_winapi_CreateProcess, METH_FASTCALL, _winapi_CreateProcess__doc__}, + {"CreateProcess", _PyCFunction_CAST(_winapi_CreateProcess), METH_FASTCALL, _winapi_CreateProcess__doc__}, static PyObject * _winapi_CreateProcess_impl(PyObject *module, @@ -436,7 +436,7 @@ PyDoc_STRVAR(_winapi_DuplicateHandle__doc__, "through both handles."); #define _WINAPI_DUPLICATEHANDLE_METHODDEF \ - {"DuplicateHandle", (PyCFunction)(void(*)(void))_winapi_DuplicateHandle, METH_FASTCALL, _winapi_DuplicateHandle__doc__}, + {"DuplicateHandle", _PyCFunction_CAST(_winapi_DuplicateHandle), METH_FASTCALL, _winapi_DuplicateHandle__doc__}, static HANDLE _winapi_DuplicateHandle_impl(PyObject *module, HANDLE source_process_handle, @@ -699,7 +699,7 @@ PyDoc_STRVAR(_winapi_MapViewOfFile__doc__, "\n"); #define _WINAPI_MAPVIEWOFFILE_METHODDEF \ - {"MapViewOfFile", (PyCFunction)(void(*)(void))_winapi_MapViewOfFile, METH_FASTCALL, _winapi_MapViewOfFile__doc__}, + {"MapViewOfFile", _PyCFunction_CAST(_winapi_MapViewOfFile), METH_FASTCALL, _winapi_MapViewOfFile__doc__}, static LPVOID _winapi_MapViewOfFile_impl(PyObject *module, HANDLE file_map, @@ -737,7 +737,7 @@ PyDoc_STRVAR(_winapi_OpenFileMapping__doc__, "\n"); #define _WINAPI_OPENFILEMAPPING_METHODDEF \ - {"OpenFileMapping", (PyCFunction)(void(*)(void))_winapi_OpenFileMapping, METH_FASTCALL, _winapi_OpenFileMapping__doc__}, + {"OpenFileMapping", _PyCFunction_CAST(_winapi_OpenFileMapping), METH_FASTCALL, _winapi_OpenFileMapping__doc__}, static HANDLE _winapi_OpenFileMapping_impl(PyObject *module, DWORD desired_access, @@ -780,7 +780,7 @@ PyDoc_STRVAR(_winapi_OpenProcess__doc__, "\n"); #define _WINAPI_OPENPROCESS_METHODDEF \ - {"OpenProcess", (PyCFunction)(void(*)(void))_winapi_OpenProcess, METH_FASTCALL, _winapi_OpenProcess__doc__}, + {"OpenProcess", _PyCFunction_CAST(_winapi_OpenProcess), METH_FASTCALL, _winapi_OpenProcess__doc__}, static HANDLE _winapi_OpenProcess_impl(PyObject *module, DWORD desired_access, @@ -818,7 +818,7 @@ PyDoc_STRVAR(_winapi_PeekNamedPipe__doc__, "\n"); #define _WINAPI_PEEKNAMEDPIPE_METHODDEF \ - {"PeekNamedPipe", (PyCFunction)(void(*)(void))_winapi_PeekNamedPipe, METH_FASTCALL, _winapi_PeekNamedPipe__doc__}, + {"PeekNamedPipe", _PyCFunction_CAST(_winapi_PeekNamedPipe), METH_FASTCALL, _winapi_PeekNamedPipe__doc__}, static PyObject * _winapi_PeekNamedPipe_impl(PyObject *module, HANDLE handle, int size); @@ -846,7 +846,7 @@ PyDoc_STRVAR(_winapi_ReadFile__doc__, "\n"); #define _WINAPI_READFILE_METHODDEF \ - {"ReadFile", (PyCFunction)(void(*)(void))_winapi_ReadFile, METH_FASTCALL|METH_KEYWORDS, _winapi_ReadFile__doc__}, + {"ReadFile", _PyCFunction_CAST(_winapi_ReadFile), METH_FASTCALL|METH_KEYWORDS, _winapi_ReadFile__doc__}, static PyObject * _winapi_ReadFile_impl(PyObject *module, HANDLE handle, DWORD size, @@ -879,7 +879,7 @@ PyDoc_STRVAR(_winapi_SetNamedPipeHandleState__doc__, "\n"); #define _WINAPI_SETNAMEDPIPEHANDLESTATE_METHODDEF \ - {"SetNamedPipeHandleState", (PyCFunction)(void(*)(void))_winapi_SetNamedPipeHandleState, METH_FASTCALL, _winapi_SetNamedPipeHandleState__doc__}, + {"SetNamedPipeHandleState", _PyCFunction_CAST(_winapi_SetNamedPipeHandleState), METH_FASTCALL, _winapi_SetNamedPipeHandleState__doc__}, static PyObject * _winapi_SetNamedPipeHandleState_impl(PyObject *module, HANDLE named_pipe, @@ -913,7 +913,7 @@ PyDoc_STRVAR(_winapi_TerminateProcess__doc__, "Terminate the specified process and all of its threads."); #define _WINAPI_TERMINATEPROCESS_METHODDEF \ - {"TerminateProcess", (PyCFunction)(void(*)(void))_winapi_TerminateProcess, METH_FASTCALL, _winapi_TerminateProcess__doc__}, + {"TerminateProcess", _PyCFunction_CAST(_winapi_TerminateProcess), METH_FASTCALL, _winapi_TerminateProcess__doc__}, static PyObject * _winapi_TerminateProcess_impl(PyObject *module, HANDLE handle, @@ -973,7 +973,7 @@ PyDoc_STRVAR(_winapi_WaitNamedPipe__doc__, "\n"); #define _WINAPI_WAITNAMEDPIPE_METHODDEF \ - {"WaitNamedPipe", (PyCFunction)(void(*)(void))_winapi_WaitNamedPipe, METH_FASTCALL, _winapi_WaitNamedPipe__doc__}, + {"WaitNamedPipe", _PyCFunction_CAST(_winapi_WaitNamedPipe), METH_FASTCALL, _winapi_WaitNamedPipe__doc__}, static PyObject * _winapi_WaitNamedPipe_impl(PyObject *module, LPCTSTR name, DWORD timeout); @@ -1002,7 +1002,7 @@ PyDoc_STRVAR(_winapi_WaitForMultipleObjects__doc__, "\n"); #define _WINAPI_WAITFORMULTIPLEOBJECTS_METHODDEF \ - {"WaitForMultipleObjects", (PyCFunction)(void(*)(void))_winapi_WaitForMultipleObjects, METH_FASTCALL, _winapi_WaitForMultipleObjects__doc__}, + {"WaitForMultipleObjects", _PyCFunction_CAST(_winapi_WaitForMultipleObjects), METH_FASTCALL, _winapi_WaitForMultipleObjects__doc__}, static PyObject * _winapi_WaitForMultipleObjects_impl(PyObject *module, PyObject *handle_seq, @@ -1037,7 +1037,7 @@ PyDoc_STRVAR(_winapi_WaitForSingleObject__doc__, "in milliseconds."); #define _WINAPI_WAITFORSINGLEOBJECT_METHODDEF \ - {"WaitForSingleObject", (PyCFunction)(void(*)(void))_winapi_WaitForSingleObject, METH_FASTCALL, _winapi_WaitForSingleObject__doc__}, + {"WaitForSingleObject", _PyCFunction_CAST(_winapi_WaitForSingleObject), METH_FASTCALL, _winapi_WaitForSingleObject__doc__}, static long _winapi_WaitForSingleObject_impl(PyObject *module, HANDLE handle, @@ -1071,7 +1071,7 @@ PyDoc_STRVAR(_winapi_WriteFile__doc__, "\n"); #define _WINAPI_WRITEFILE_METHODDEF \ - {"WriteFile", (PyCFunction)(void(*)(void))_winapi_WriteFile, METH_FASTCALL|METH_KEYWORDS, _winapi_WriteFile__doc__}, + {"WriteFile", _PyCFunction_CAST(_winapi_WriteFile), METH_FASTCALL|METH_KEYWORDS, _winapi_WriteFile__doc__}, static PyObject * _winapi_WriteFile_impl(PyObject *module, HANDLE handle, PyObject *buffer, @@ -1121,7 +1121,7 @@ PyDoc_STRVAR(_winapi_GetFileType__doc__, "\n"); #define _WINAPI_GETFILETYPE_METHODDEF \ - {"GetFileType", (PyCFunction)(void(*)(void))_winapi_GetFileType, METH_FASTCALL|METH_KEYWORDS, _winapi_GetFileType__doc__}, + {"GetFileType", _PyCFunction_CAST(_winapi_GetFileType), METH_FASTCALL|METH_KEYWORDS, _winapi_GetFileType__doc__}, static DWORD _winapi_GetFileType_impl(PyObject *module, HANDLE handle); @@ -1159,7 +1159,7 @@ PyDoc_STRVAR(_winapi__mimetypes_read_windows_registry__doc__, "MimeTypes.add_type."); #define _WINAPI__MIMETYPES_READ_WINDOWS_REGISTRY_METHODDEF \ - {"_mimetypes_read_windows_registry", (PyCFunction)(void(*)(void))_winapi__mimetypes_read_windows_registry, METH_FASTCALL|METH_KEYWORDS, _winapi__mimetypes_read_windows_registry__doc__}, + {"_mimetypes_read_windows_registry", _PyCFunction_CAST(_winapi__mimetypes_read_windows_registry), METH_FASTCALL|METH_KEYWORDS, _winapi__mimetypes_read_windows_registry__doc__}, static PyObject * _winapi__mimetypes_read_windows_registry_impl(PyObject *module, @@ -1184,4 +1184,4 @@ _winapi__mimetypes_read_windows_registry(PyObject *module, PyObject *const *args exit: return return_value; } -/*[clinic end generated code: output=ac3623be6e42017c input=a9049054013a1b77]*/ +/*[clinic end generated code: output=a4ede01aede352a4 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/arraymodule.c.h b/Modules/clinic/arraymodule.c.h index 030c6e7e1a487..6358ba2f81fa3 100644 --- a/Modules/clinic/arraymodule.c.h +++ b/Modules/clinic/arraymodule.c.h @@ -47,7 +47,7 @@ PyDoc_STRVAR(array_array_index__doc__, "Raise ValueError if the value is not present."); #define ARRAY_ARRAY_INDEX_METHODDEF \ - {"index", (PyCFunction)(void(*)(void))array_array_index, METH_FASTCALL, array_array_index__doc__}, + {"index", _PyCFunction_CAST(array_array_index), METH_FASTCALL, array_array_index__doc__}, static PyObject * array_array_index_impl(arrayobject *self, PyObject *v, Py_ssize_t start, @@ -102,7 +102,7 @@ PyDoc_STRVAR(array_array_pop__doc__, "i defaults to -1."); #define ARRAY_ARRAY_POP_METHODDEF \ - {"pop", (PyCFunction)(void(*)(void))array_array_pop, METH_FASTCALL, array_array_pop__doc__}, + {"pop", _PyCFunction_CAST(array_array_pop), METH_FASTCALL, array_array_pop__doc__}, static PyObject * array_array_pop_impl(arrayobject *self, Py_ssize_t i); @@ -145,7 +145,7 @@ PyDoc_STRVAR(array_array_extend__doc__, "Append items to the end of the array."); #define ARRAY_ARRAY_EXTEND_METHODDEF \ - {"extend", (PyCFunction)(void(*)(void))array_array_extend, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, array_array_extend__doc__}, + {"extend", _PyCFunction_CAST(array_array_extend), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, array_array_extend__doc__}, static PyObject * array_array_extend_impl(arrayobject *self, PyTypeObject *cls, PyObject *bb); @@ -177,7 +177,7 @@ PyDoc_STRVAR(array_array_insert__doc__, "Insert a new item v into the array before position i."); #define ARRAY_ARRAY_INSERT_METHODDEF \ - {"insert", (PyCFunction)(void(*)(void))array_array_insert, METH_FASTCALL, array_array_insert__doc__}, + {"insert", _PyCFunction_CAST(array_array_insert), METH_FASTCALL, array_array_insert__doc__}, static PyObject * array_array_insert_impl(arrayobject *self, Py_ssize_t i, PyObject *v); @@ -287,7 +287,7 @@ PyDoc_STRVAR(array_array_fromfile__doc__, "Read n objects from the file object f and append them to the end of the array."); #define ARRAY_ARRAY_FROMFILE_METHODDEF \ - {"fromfile", (PyCFunction)(void(*)(void))array_array_fromfile, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, array_array_fromfile__doc__}, + {"fromfile", _PyCFunction_CAST(array_array_fromfile), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, array_array_fromfile__doc__}, static PyObject * array_array_fromfile_impl(arrayobject *self, PyTypeObject *cls, PyObject *f, @@ -333,7 +333,7 @@ PyDoc_STRVAR(array_array_tofile__doc__, "Write all items (as machine values) to the file object f."); #define ARRAY_ARRAY_TOFILE_METHODDEF \ - {"tofile", (PyCFunction)(void(*)(void))array_array_tofile, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, array_array_tofile__doc__}, + {"tofile", _PyCFunction_CAST(array_array_tofile), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, array_array_tofile__doc__}, static PyObject * array_array_tofile_impl(arrayobject *self, PyTypeObject *cls, PyObject *f); @@ -523,7 +523,7 @@ PyDoc_STRVAR(array__array_reconstructor__doc__, "Internal. Used for pickling support."); #define ARRAY__ARRAY_RECONSTRUCTOR_METHODDEF \ - {"_array_reconstructor", (PyCFunction)(void(*)(void))array__array_reconstructor, METH_FASTCALL, array__array_reconstructor__doc__}, + {"_array_reconstructor", _PyCFunction_CAST(array__array_reconstructor), METH_FASTCALL, array__array_reconstructor__doc__}, static PyObject * array__array_reconstructor_impl(PyObject *module, PyTypeObject *arraytype, @@ -574,7 +574,7 @@ PyDoc_STRVAR(array_array___reduce_ex____doc__, "Return state information for pickling."); #define ARRAY_ARRAY___REDUCE_EX___METHODDEF \ - {"__reduce_ex__", (PyCFunction)(void(*)(void))array_array___reduce_ex__, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, array_array___reduce_ex____doc__}, + {"__reduce_ex__", _PyCFunction_CAST(array_array___reduce_ex__), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, array_array___reduce_ex____doc__}, static PyObject * array_array___reduce_ex___impl(arrayobject *self, PyTypeObject *cls, @@ -607,7 +607,7 @@ PyDoc_STRVAR(array_arrayiterator___reduce____doc__, "Return state information for pickling."); #define ARRAY_ARRAYITERATOR___REDUCE___METHODDEF \ - {"__reduce__", (PyCFunction)(void(*)(void))array_arrayiterator___reduce__, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, array_arrayiterator___reduce____doc__}, + {"__reduce__", _PyCFunction_CAST(array_arrayiterator___reduce__), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, array_arrayiterator___reduce____doc__}, static PyObject * array_arrayiterator___reduce___impl(arrayiterobject *self, PyTypeObject *cls); @@ -630,4 +630,4 @@ PyDoc_STRVAR(array_arrayiterator___setstate____doc__, #define ARRAY_ARRAYITERATOR___SETSTATE___METHODDEF \ {"__setstate__", (PyCFunction)array_arrayiterator___setstate__, METH_O, array_arrayiterator___setstate____doc__}, -/*[clinic end generated code: output=7f48d1691fa27442 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=85a5fec90d9615b9 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/audioop.c.h b/Modules/clinic/audioop.c.h index da12bd17b5a60..43103855fa1a2 100644 --- a/Modules/clinic/audioop.c.h +++ b/Modules/clinic/audioop.c.h @@ -9,7 +9,7 @@ PyDoc_STRVAR(audioop_getsample__doc__, "Return the value of sample index from the fragment."); #define AUDIOOP_GETSAMPLE_METHODDEF \ - {"getsample", (PyCFunction)(void(*)(void))audioop_getsample, METH_FASTCALL, audioop_getsample__doc__}, + {"getsample", _PyCFunction_CAST(audioop_getsample), METH_FASTCALL, audioop_getsample__doc__}, static PyObject * audioop_getsample_impl(PyObject *module, Py_buffer *fragment, int width, @@ -67,7 +67,7 @@ PyDoc_STRVAR(audioop_max__doc__, "Return the maximum of the absolute value of all samples in a fragment."); #define AUDIOOP_MAX_METHODDEF \ - {"max", (PyCFunction)(void(*)(void))audioop_max, METH_FASTCALL, audioop_max__doc__}, + {"max", _PyCFunction_CAST(audioop_max), METH_FASTCALL, audioop_max__doc__}, static PyObject * audioop_max_impl(PyObject *module, Py_buffer *fragment, int width); @@ -111,7 +111,7 @@ PyDoc_STRVAR(audioop_minmax__doc__, "Return the minimum and maximum values of all samples in the sound fragment."); #define AUDIOOP_MINMAX_METHODDEF \ - {"minmax", (PyCFunction)(void(*)(void))audioop_minmax, METH_FASTCALL, audioop_minmax__doc__}, + {"minmax", _PyCFunction_CAST(audioop_minmax), METH_FASTCALL, audioop_minmax__doc__}, static PyObject * audioop_minmax_impl(PyObject *module, Py_buffer *fragment, int width); @@ -155,7 +155,7 @@ PyDoc_STRVAR(audioop_avg__doc__, "Return the average over all samples in the fragment."); #define AUDIOOP_AVG_METHODDEF \ - {"avg", (PyCFunction)(void(*)(void))audioop_avg, METH_FASTCALL, audioop_avg__doc__}, + {"avg", _PyCFunction_CAST(audioop_avg), METH_FASTCALL, audioop_avg__doc__}, static PyObject * audioop_avg_impl(PyObject *module, Py_buffer *fragment, int width); @@ -199,7 +199,7 @@ PyDoc_STRVAR(audioop_rms__doc__, "Return the root-mean-square of the fragment, i.e. sqrt(sum(S_i^2)/n)."); #define AUDIOOP_RMS_METHODDEF \ - {"rms", (PyCFunction)(void(*)(void))audioop_rms, METH_FASTCALL, audioop_rms__doc__}, + {"rms", _PyCFunction_CAST(audioop_rms), METH_FASTCALL, audioop_rms__doc__}, static PyObject * audioop_rms_impl(PyObject *module, Py_buffer *fragment, int width); @@ -243,7 +243,7 @@ PyDoc_STRVAR(audioop_findfit__doc__, "Try to match reference as well as possible to a portion of fragment."); #define AUDIOOP_FINDFIT_METHODDEF \ - {"findfit", (PyCFunction)(void(*)(void))audioop_findfit, METH_FASTCALL, audioop_findfit__doc__}, + {"findfit", _PyCFunction_CAST(audioop_findfit), METH_FASTCALL, audioop_findfit__doc__}, static PyObject * audioop_findfit_impl(PyObject *module, Py_buffer *fragment, @@ -295,7 +295,7 @@ PyDoc_STRVAR(audioop_findfactor__doc__, "Return a factor F such that rms(add(fragment, mul(reference, -F))) is minimal."); #define AUDIOOP_FINDFACTOR_METHODDEF \ - {"findfactor", (PyCFunction)(void(*)(void))audioop_findfactor, METH_FASTCALL, audioop_findfactor__doc__}, + {"findfactor", _PyCFunction_CAST(audioop_findfactor), METH_FASTCALL, audioop_findfactor__doc__}, static PyObject * audioop_findfactor_impl(PyObject *module, Py_buffer *fragment, @@ -347,7 +347,7 @@ PyDoc_STRVAR(audioop_findmax__doc__, "Search fragment for a slice of specified number of samples with maximum energy."); #define AUDIOOP_FINDMAX_METHODDEF \ - {"findmax", (PyCFunction)(void(*)(void))audioop_findmax, METH_FASTCALL, audioop_findmax__doc__}, + {"findmax", _PyCFunction_CAST(audioop_findmax), METH_FASTCALL, audioop_findmax__doc__}, static PyObject * audioop_findmax_impl(PyObject *module, Py_buffer *fragment, @@ -400,7 +400,7 @@ PyDoc_STRVAR(audioop_avgpp__doc__, "Return the average peak-peak value over all samples in the fragment."); #define AUDIOOP_AVGPP_METHODDEF \ - {"avgpp", (PyCFunction)(void(*)(void))audioop_avgpp, METH_FASTCALL, audioop_avgpp__doc__}, + {"avgpp", _PyCFunction_CAST(audioop_avgpp), METH_FASTCALL, audioop_avgpp__doc__}, static PyObject * audioop_avgpp_impl(PyObject *module, Py_buffer *fragment, int width); @@ -444,7 +444,7 @@ PyDoc_STRVAR(audioop_maxpp__doc__, "Return the maximum peak-peak value in the sound fragment."); #define AUDIOOP_MAXPP_METHODDEF \ - {"maxpp", (PyCFunction)(void(*)(void))audioop_maxpp, METH_FASTCALL, audioop_maxpp__doc__}, + {"maxpp", _PyCFunction_CAST(audioop_maxpp), METH_FASTCALL, audioop_maxpp__doc__}, static PyObject * audioop_maxpp_impl(PyObject *module, Py_buffer *fragment, int width); @@ -488,7 +488,7 @@ PyDoc_STRVAR(audioop_cross__doc__, "Return the number of zero crossings in the fragment passed as an argument."); #define AUDIOOP_CROSS_METHODDEF \ - {"cross", (PyCFunction)(void(*)(void))audioop_cross, METH_FASTCALL, audioop_cross__doc__}, + {"cross", _PyCFunction_CAST(audioop_cross), METH_FASTCALL, audioop_cross__doc__}, static PyObject * audioop_cross_impl(PyObject *module, Py_buffer *fragment, int width); @@ -532,7 +532,7 @@ PyDoc_STRVAR(audioop_mul__doc__, "Return a fragment that has all samples in the original fragment multiplied by the floating-point value factor."); #define AUDIOOP_MUL_METHODDEF \ - {"mul", (PyCFunction)(void(*)(void))audioop_mul, METH_FASTCALL, audioop_mul__doc__}, + {"mul", _PyCFunction_CAST(audioop_mul), METH_FASTCALL, audioop_mul__doc__}, static PyObject * audioop_mul_impl(PyObject *module, Py_buffer *fragment, int width, @@ -588,7 +588,7 @@ PyDoc_STRVAR(audioop_tomono__doc__, "Convert a stereo fragment to a mono fragment."); #define AUDIOOP_TOMONO_METHODDEF \ - {"tomono", (PyCFunction)(void(*)(void))audioop_tomono, METH_FASTCALL, audioop_tomono__doc__}, + {"tomono", _PyCFunction_CAST(audioop_tomono), METH_FASTCALL, audioop_tomono__doc__}, static PyObject * audioop_tomono_impl(PyObject *module, Py_buffer *fragment, int width, @@ -655,7 +655,7 @@ PyDoc_STRVAR(audioop_tostereo__doc__, "Generate a stereo fragment from a mono fragment."); #define AUDIOOP_TOSTEREO_METHODDEF \ - {"tostereo", (PyCFunction)(void(*)(void))audioop_tostereo, METH_FASTCALL, audioop_tostereo__doc__}, + {"tostereo", _PyCFunction_CAST(audioop_tostereo), METH_FASTCALL, audioop_tostereo__doc__}, static PyObject * audioop_tostereo_impl(PyObject *module, Py_buffer *fragment, int width, @@ -722,7 +722,7 @@ PyDoc_STRVAR(audioop_add__doc__, "Return a fragment which is the addition of the two samples passed as parameters."); #define AUDIOOP_ADD_METHODDEF \ - {"add", (PyCFunction)(void(*)(void))audioop_add, METH_FASTCALL, audioop_add__doc__}, + {"add", _PyCFunction_CAST(audioop_add), METH_FASTCALL, audioop_add__doc__}, static PyObject * audioop_add_impl(PyObject *module, Py_buffer *fragment1, @@ -779,7 +779,7 @@ PyDoc_STRVAR(audioop_bias__doc__, "Return a fragment that is the original fragment with a bias added to each sample."); #define AUDIOOP_BIAS_METHODDEF \ - {"bias", (PyCFunction)(void(*)(void))audioop_bias, METH_FASTCALL, audioop_bias__doc__}, + {"bias", _PyCFunction_CAST(audioop_bias), METH_FASTCALL, audioop_bias__doc__}, static PyObject * audioop_bias_impl(PyObject *module, Py_buffer *fragment, int width, int bias); @@ -828,7 +828,7 @@ PyDoc_STRVAR(audioop_reverse__doc__, "Reverse the samples in a fragment and returns the modified fragment."); #define AUDIOOP_REVERSE_METHODDEF \ - {"reverse", (PyCFunction)(void(*)(void))audioop_reverse, METH_FASTCALL, audioop_reverse__doc__}, + {"reverse", _PyCFunction_CAST(audioop_reverse), METH_FASTCALL, audioop_reverse__doc__}, static PyObject * audioop_reverse_impl(PyObject *module, Py_buffer *fragment, int width); @@ -872,7 +872,7 @@ PyDoc_STRVAR(audioop_byteswap__doc__, "Convert big-endian samples to little-endian and vice versa."); #define AUDIOOP_BYTESWAP_METHODDEF \ - {"byteswap", (PyCFunction)(void(*)(void))audioop_byteswap, METH_FASTCALL, audioop_byteswap__doc__}, + {"byteswap", _PyCFunction_CAST(audioop_byteswap), METH_FASTCALL, audioop_byteswap__doc__}, static PyObject * audioop_byteswap_impl(PyObject *module, Py_buffer *fragment, int width); @@ -916,7 +916,7 @@ PyDoc_STRVAR(audioop_lin2lin__doc__, "Convert samples between 1-, 2-, 3- and 4-byte formats."); #define AUDIOOP_LIN2LIN_METHODDEF \ - {"lin2lin", (PyCFunction)(void(*)(void))audioop_lin2lin, METH_FASTCALL, audioop_lin2lin__doc__}, + {"lin2lin", _PyCFunction_CAST(audioop_lin2lin), METH_FASTCALL, audioop_lin2lin__doc__}, static PyObject * audioop_lin2lin_impl(PyObject *module, Py_buffer *fragment, int width, @@ -967,7 +967,7 @@ PyDoc_STRVAR(audioop_ratecv__doc__, "Convert the frame rate of the input fragment."); #define AUDIOOP_RATECV_METHODDEF \ - {"ratecv", (PyCFunction)(void(*)(void))audioop_ratecv, METH_FASTCALL, audioop_ratecv__doc__}, + {"ratecv", _PyCFunction_CAST(audioop_ratecv), METH_FASTCALL, audioop_ratecv__doc__}, static PyObject * audioop_ratecv_impl(PyObject *module, Py_buffer *fragment, int width, @@ -1047,7 +1047,7 @@ PyDoc_STRVAR(audioop_lin2ulaw__doc__, "Convert samples in the audio fragment to u-LAW encoding."); #define AUDIOOP_LIN2ULAW_METHODDEF \ - {"lin2ulaw", (PyCFunction)(void(*)(void))audioop_lin2ulaw, METH_FASTCALL, audioop_lin2ulaw__doc__}, + {"lin2ulaw", _PyCFunction_CAST(audioop_lin2ulaw), METH_FASTCALL, audioop_lin2ulaw__doc__}, static PyObject * audioop_lin2ulaw_impl(PyObject *module, Py_buffer *fragment, int width); @@ -1091,7 +1091,7 @@ PyDoc_STRVAR(audioop_ulaw2lin__doc__, "Convert sound fragments in u-LAW encoding to linearly encoded sound fragments."); #define AUDIOOP_ULAW2LIN_METHODDEF \ - {"ulaw2lin", (PyCFunction)(void(*)(void))audioop_ulaw2lin, METH_FASTCALL, audioop_ulaw2lin__doc__}, + {"ulaw2lin", _PyCFunction_CAST(audioop_ulaw2lin), METH_FASTCALL, audioop_ulaw2lin__doc__}, static PyObject * audioop_ulaw2lin_impl(PyObject *module, Py_buffer *fragment, int width); @@ -1135,7 +1135,7 @@ PyDoc_STRVAR(audioop_lin2alaw__doc__, "Convert samples in the audio fragment to a-LAW encoding."); #define AUDIOOP_LIN2ALAW_METHODDEF \ - {"lin2alaw", (PyCFunction)(void(*)(void))audioop_lin2alaw, METH_FASTCALL, audioop_lin2alaw__doc__}, + {"lin2alaw", _PyCFunction_CAST(audioop_lin2alaw), METH_FASTCALL, audioop_lin2alaw__doc__}, static PyObject * audioop_lin2alaw_impl(PyObject *module, Py_buffer *fragment, int width); @@ -1179,7 +1179,7 @@ PyDoc_STRVAR(audioop_alaw2lin__doc__, "Convert sound fragments in a-LAW encoding to linearly encoded sound fragments."); #define AUDIOOP_ALAW2LIN_METHODDEF \ - {"alaw2lin", (PyCFunction)(void(*)(void))audioop_alaw2lin, METH_FASTCALL, audioop_alaw2lin__doc__}, + {"alaw2lin", _PyCFunction_CAST(audioop_alaw2lin), METH_FASTCALL, audioop_alaw2lin__doc__}, static PyObject * audioop_alaw2lin_impl(PyObject *module, Py_buffer *fragment, int width); @@ -1223,7 +1223,7 @@ PyDoc_STRVAR(audioop_lin2adpcm__doc__, "Convert samples to 4 bit Intel/DVI ADPCM encoding."); #define AUDIOOP_LIN2ADPCM_METHODDEF \ - {"lin2adpcm", (PyCFunction)(void(*)(void))audioop_lin2adpcm, METH_FASTCALL, audioop_lin2adpcm__doc__}, + {"lin2adpcm", _PyCFunction_CAST(audioop_lin2adpcm), METH_FASTCALL, audioop_lin2adpcm__doc__}, static PyObject * audioop_lin2adpcm_impl(PyObject *module, Py_buffer *fragment, int width, @@ -1270,7 +1270,7 @@ PyDoc_STRVAR(audioop_adpcm2lin__doc__, "Decode an Intel/DVI ADPCM coded fragment to a linear fragment."); #define AUDIOOP_ADPCM2LIN_METHODDEF \ - {"adpcm2lin", (PyCFunction)(void(*)(void))audioop_adpcm2lin, METH_FASTCALL, audioop_adpcm2lin__doc__}, + {"adpcm2lin", _PyCFunction_CAST(audioop_adpcm2lin), METH_FASTCALL, audioop_adpcm2lin__doc__}, static PyObject * audioop_adpcm2lin_impl(PyObject *module, Py_buffer *fragment, int width, @@ -1309,4 +1309,4 @@ audioop_adpcm2lin(PyObject *module, PyObject *const *args, Py_ssize_t nargs) return return_value; } -/*[clinic end generated code: output=840f8c315ebd4946 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=a581c3893ef8ad75 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/binascii.c.h b/Modules/clinic/binascii.c.h index a0ca6d60ce969..2c766eddee8dc 100644 --- a/Modules/clinic/binascii.c.h +++ b/Modules/clinic/binascii.c.h @@ -40,7 +40,7 @@ PyDoc_STRVAR(binascii_b2a_uu__doc__, "Uuencode line of data."); #define BINASCII_B2A_UU_METHODDEF \ - {"b2a_uu", (PyCFunction)(void(*)(void))binascii_b2a_uu, METH_FASTCALL|METH_KEYWORDS, binascii_b2a_uu__doc__}, + {"b2a_uu", _PyCFunction_CAST(binascii_b2a_uu), METH_FASTCALL|METH_KEYWORDS, binascii_b2a_uu__doc__}, static PyObject * binascii_b2a_uu_impl(PyObject *module, Py_buffer *data, int backtick); @@ -97,7 +97,7 @@ PyDoc_STRVAR(binascii_a2b_base64__doc__, " The same applies to excess data after padding (= / ==)."); #define BINASCII_A2B_BASE64_METHODDEF \ - {"a2b_base64", (PyCFunction)(void(*)(void))binascii_a2b_base64, METH_FASTCALL|METH_KEYWORDS, binascii_a2b_base64__doc__}, + {"a2b_base64", _PyCFunction_CAST(binascii_a2b_base64), METH_FASTCALL|METH_KEYWORDS, binascii_a2b_base64__doc__}, static PyObject * binascii_a2b_base64_impl(PyObject *module, Py_buffer *data, int strict_mode); @@ -145,7 +145,7 @@ PyDoc_STRVAR(binascii_b2a_base64__doc__, "Base64-code line of data."); #define BINASCII_B2A_BASE64_METHODDEF \ - {"b2a_base64", (PyCFunction)(void(*)(void))binascii_b2a_base64, METH_FASTCALL|METH_KEYWORDS, binascii_b2a_base64__doc__}, + {"b2a_base64", _PyCFunction_CAST(binascii_b2a_base64), METH_FASTCALL|METH_KEYWORDS, binascii_b2a_base64__doc__}, static PyObject * binascii_b2a_base64_impl(PyObject *module, Py_buffer *data, int newline); @@ -198,7 +198,7 @@ PyDoc_STRVAR(binascii_crc_hqx__doc__, "Compute CRC-CCITT incrementally."); #define BINASCII_CRC_HQX_METHODDEF \ - {"crc_hqx", (PyCFunction)(void(*)(void))binascii_crc_hqx, METH_FASTCALL, binascii_crc_hqx__doc__}, + {"crc_hqx", _PyCFunction_CAST(binascii_crc_hqx), METH_FASTCALL, binascii_crc_hqx__doc__}, static PyObject * binascii_crc_hqx_impl(PyObject *module, Py_buffer *data, unsigned int crc); @@ -242,7 +242,7 @@ PyDoc_STRVAR(binascii_crc32__doc__, "Compute CRC-32 incrementally."); #define BINASCII_CRC32_METHODDEF \ - {"crc32", (PyCFunction)(void(*)(void))binascii_crc32, METH_FASTCALL, binascii_crc32__doc__}, + {"crc32", _PyCFunction_CAST(binascii_crc32), METH_FASTCALL, binascii_crc32__doc__}, static unsigned int binascii_crc32_impl(PyObject *module, Py_buffer *data, unsigned int crc); @@ -312,7 +312,7 @@ PyDoc_STRVAR(binascii_b2a_hex__doc__, "b\'b9_01ef\'"); #define BINASCII_B2A_HEX_METHODDEF \ - {"b2a_hex", (PyCFunction)(void(*)(void))binascii_b2a_hex, METH_FASTCALL|METH_KEYWORDS, binascii_b2a_hex__doc__}, + {"b2a_hex", _PyCFunction_CAST(binascii_b2a_hex), METH_FASTCALL|METH_KEYWORDS, binascii_b2a_hex__doc__}, static PyObject * binascii_b2a_hex_impl(PyObject *module, Py_buffer *data, PyObject *sep, @@ -382,7 +382,7 @@ PyDoc_STRVAR(binascii_hexlify__doc__, "available as \"b2a_hex()\"."); #define BINASCII_HEXLIFY_METHODDEF \ - {"hexlify", (PyCFunction)(void(*)(void))binascii_hexlify, METH_FASTCALL|METH_KEYWORDS, binascii_hexlify__doc__}, + {"hexlify", _PyCFunction_CAST(binascii_hexlify), METH_FASTCALL|METH_KEYWORDS, binascii_hexlify__doc__}, static PyObject * binascii_hexlify_impl(PyObject *module, Py_buffer *data, PyObject *sep, @@ -510,7 +510,7 @@ PyDoc_STRVAR(binascii_a2b_qp__doc__, "Decode a string of qp-encoded data."); #define BINASCII_A2B_QP_METHODDEF \ - {"a2b_qp", (PyCFunction)(void(*)(void))binascii_a2b_qp, METH_FASTCALL|METH_KEYWORDS, binascii_a2b_qp__doc__}, + {"a2b_qp", _PyCFunction_CAST(binascii_a2b_qp), METH_FASTCALL|METH_KEYWORDS, binascii_a2b_qp__doc__}, static PyObject * binascii_a2b_qp_impl(PyObject *module, Py_buffer *data, int header); @@ -562,7 +562,7 @@ PyDoc_STRVAR(binascii_b2a_qp__doc__, "are both encoded. When quotetabs is set, space and tabs are encoded."); #define BINASCII_B2A_QP_METHODDEF \ - {"b2a_qp", (PyCFunction)(void(*)(void))binascii_b2a_qp, METH_FASTCALL|METH_KEYWORDS, binascii_b2a_qp__doc__}, + {"b2a_qp", _PyCFunction_CAST(binascii_b2a_qp), METH_FASTCALL|METH_KEYWORDS, binascii_b2a_qp__doc__}, static PyObject * binascii_b2a_qp_impl(PyObject *module, Py_buffer *data, int quotetabs, @@ -628,4 +628,4 @@ binascii_b2a_qp(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObj return return_value; } -/*[clinic end generated code: output=4162d08536697182 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=ba9ed7b810b8762d input=a9049054013a1b77]*/ diff --git a/Modules/clinic/cmathmodule.c.h b/Modules/clinic/cmathmodule.c.h index 4b6653aa21942..ab556922c029f 100644 --- a/Modules/clinic/cmathmodule.c.h +++ b/Modules/clinic/cmathmodule.c.h @@ -641,7 +641,7 @@ PyDoc_STRVAR(cmath_log__doc__, "If the base not specified, returns the natural logarithm (base e) of z."); #define CMATH_LOG_METHODDEF \ - {"log", (PyCFunction)(void(*)(void))cmath_log, METH_FASTCALL, cmath_log__doc__}, + {"log", _PyCFunction_CAST(cmath_log), METH_FASTCALL, cmath_log__doc__}, static PyObject * cmath_log_impl(PyObject *module, Py_complex x, PyObject *y_obj); @@ -736,7 +736,7 @@ PyDoc_STRVAR(cmath_rect__doc__, "Convert from polar coordinates to rectangular coordinates."); #define CMATH_RECT_METHODDEF \ - {"rect", (PyCFunction)(void(*)(void))cmath_rect, METH_FASTCALL, cmath_rect__doc__}, + {"rect", _PyCFunction_CAST(cmath_rect), METH_FASTCALL, cmath_rect__doc__}, static PyObject * cmath_rect_impl(PyObject *module, double r, double phi); @@ -883,7 +883,7 @@ PyDoc_STRVAR(cmath_isclose__doc__, "not close to anything, even itself. inf and -inf are only close to themselves."); #define CMATH_ISCLOSE_METHODDEF \ - {"isclose", (PyCFunction)(void(*)(void))cmath_isclose, METH_FASTCALL|METH_KEYWORDS, cmath_isclose__doc__}, + {"isclose", _PyCFunction_CAST(cmath_isclose), METH_FASTCALL|METH_KEYWORDS, cmath_isclose__doc__}, static int cmath_isclose_impl(PyObject *module, Py_complex a, Py_complex b, @@ -953,4 +953,4 @@ cmath_isclose(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObjec exit: return return_value; } -/*[clinic end generated code: output=353347db2e808e0d input=a9049054013a1b77]*/ +/*[clinic end generated code: output=b8e445fcd2a3da65 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/fcntlmodule.c.h b/Modules/clinic/fcntlmodule.c.h index adf527fd44311..c41f088ff1528 100644 --- a/Modules/clinic/fcntlmodule.c.h +++ b/Modules/clinic/fcntlmodule.c.h @@ -19,7 +19,7 @@ PyDoc_STRVAR(fcntl_fcntl__doc__, "corresponding to the return value of the fcntl call in the C code."); #define FCNTL_FCNTL_METHODDEF \ - {"fcntl", (PyCFunction)(void(*)(void))fcntl_fcntl, METH_FASTCALL, fcntl_fcntl__doc__}, + {"fcntl", _PyCFunction_CAST(fcntl_fcntl), METH_FASTCALL, fcntl_fcntl__doc__}, static PyObject * fcntl_fcntl_impl(PyObject *module, int fd, int code, PyObject *arg); @@ -87,7 +87,7 @@ PyDoc_STRVAR(fcntl_ioctl__doc__, "code."); #define FCNTL_IOCTL_METHODDEF \ - {"ioctl", (PyCFunction)(void(*)(void))fcntl_ioctl, METH_FASTCALL, fcntl_ioctl__doc__}, + {"ioctl", _PyCFunction_CAST(fcntl_ioctl), METH_FASTCALL, fcntl_ioctl__doc__}, static PyObject * fcntl_ioctl_impl(PyObject *module, int fd, unsigned int code, @@ -140,7 +140,7 @@ PyDoc_STRVAR(fcntl_flock__doc__, "function is emulated using fcntl())."); #define FCNTL_FLOCK_METHODDEF \ - {"flock", (PyCFunction)(void(*)(void))fcntl_flock, METH_FASTCALL, fcntl_flock__doc__}, + {"flock", _PyCFunction_CAST(fcntl_flock), METH_FASTCALL, fcntl_flock__doc__}, static PyObject * fcntl_flock_impl(PyObject *module, int fd, int code); @@ -196,7 +196,7 @@ PyDoc_STRVAR(fcntl_lockf__doc__, " 2 - relative to the end of the file (SEEK_END)"); #define FCNTL_LOCKF_METHODDEF \ - {"lockf", (PyCFunction)(void(*)(void))fcntl_lockf, METH_FASTCALL, fcntl_lockf__doc__}, + {"lockf", _PyCFunction_CAST(fcntl_lockf), METH_FASTCALL, fcntl_lockf__doc__}, static PyObject * fcntl_lockf_impl(PyObject *module, int fd, int code, PyObject *lenobj, @@ -243,4 +243,4 @@ fcntl_lockf(PyObject *module, PyObject *const *args, Py_ssize_t nargs) exit: return return_value; } -/*[clinic end generated code: output=8ea34bd0f7cf25ec input=a9049054013a1b77]*/ +/*[clinic end generated code: output=b8cb14ab35de4c6a input=a9049054013a1b77]*/ diff --git a/Modules/clinic/gcmodule.c.h b/Modules/clinic/gcmodule.c.h index 30efc7e0c2cd7..5391b8be42db9 100644 --- a/Modules/clinic/gcmodule.c.h +++ b/Modules/clinic/gcmodule.c.h @@ -79,7 +79,7 @@ PyDoc_STRVAR(gc_collect__doc__, "The number of unreachable objects is returned."); #define GC_COLLECT_METHODDEF \ - {"collect", (PyCFunction)(void(*)(void))gc_collect, METH_FASTCALL|METH_KEYWORDS, gc_collect__doc__}, + {"collect", _PyCFunction_CAST(gc_collect), METH_FASTCALL|METH_KEYWORDS, gc_collect__doc__}, static Py_ssize_t gc_collect_impl(PyObject *module, int generation); @@ -233,7 +233,7 @@ PyDoc_STRVAR(gc_get_objects__doc__, "that are in that generation."); #define GC_GET_OBJECTS_METHODDEF \ - {"get_objects", (PyCFunction)(void(*)(void))gc_get_objects, METH_FASTCALL|METH_KEYWORDS, gc_get_objects__doc__}, + {"get_objects", _PyCFunction_CAST(gc_get_objects), METH_FASTCALL|METH_KEYWORDS, gc_get_objects__doc__}, static PyObject * gc_get_objects_impl(PyObject *module, Py_ssize_t generation); @@ -372,4 +372,4 @@ gc_get_freeze_count(PyObject *module, PyObject *Py_UNUSED(ignored)) exit: return return_value; } -/*[clinic end generated code: output=61e15f3a549f3ab5 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=71f7136d6e3f2323 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/grpmodule.c.h b/Modules/clinic/grpmodule.c.h index 2e2690ad8d3f1..3dd35e7e6ba07 100644 --- a/Modules/clinic/grpmodule.c.h +++ b/Modules/clinic/grpmodule.c.h @@ -11,7 +11,7 @@ PyDoc_STRVAR(grp_getgrgid__doc__, "If id is not valid, raise KeyError."); #define GRP_GETGRGID_METHODDEF \ - {"getgrgid", (PyCFunction)(void(*)(void))grp_getgrgid, METH_FASTCALL|METH_KEYWORDS, grp_getgrgid__doc__}, + {"getgrgid", _PyCFunction_CAST(grp_getgrgid), METH_FASTCALL|METH_KEYWORDS, grp_getgrgid__doc__}, static PyObject * grp_getgrgid_impl(PyObject *module, PyObject *id); @@ -45,7 +45,7 @@ PyDoc_STRVAR(grp_getgrnam__doc__, "If name is not valid, raise KeyError."); #define GRP_GETGRNAM_METHODDEF \ - {"getgrnam", (PyCFunction)(void(*)(void))grp_getgrnam, METH_FASTCALL|METH_KEYWORDS, grp_getgrnam__doc__}, + {"getgrnam", _PyCFunction_CAST(grp_getgrnam), METH_FASTCALL|METH_KEYWORDS, grp_getgrnam__doc__}, static PyObject * grp_getgrnam_impl(PyObject *module, PyObject *name); @@ -97,4 +97,4 @@ grp_getgrall(PyObject *module, PyObject *Py_UNUSED(ignored)) { return grp_getgrall_impl(module); } -/*[clinic end generated code: output=9b3f26779e4e1a52 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=ba680465f71ed779 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/itertoolsmodule.c.h b/Modules/clinic/itertoolsmodule.c.h index 6a6998082484c..81608ccc089be 100644 --- a/Modules/clinic/itertoolsmodule.c.h +++ b/Modules/clinic/itertoolsmodule.c.h @@ -186,7 +186,7 @@ PyDoc_STRVAR(itertools_tee__doc__, "Returns a tuple of n independent iterators."); #define ITERTOOLS_TEE_METHODDEF \ - {"tee", (PyCFunction)(void(*)(void))itertools_tee, METH_FASTCALL, itertools_tee__doc__}, + {"tee", _PyCFunction_CAST(itertools_tee), METH_FASTCALL, itertools_tee__doc__}, static PyObject * itertools_tee_impl(PyObject *module, PyObject *iterable, Py_ssize_t n); @@ -667,4 +667,4 @@ itertools_count(PyTypeObject *type, PyObject *args, PyObject *kwargs) exit: return return_value; } -/*[clinic end generated code: output=5cb14d4a3fe8aeec input=a9049054013a1b77]*/ +/*[clinic end generated code: output=659251a811ff89ed input=a9049054013a1b77]*/ diff --git a/Modules/clinic/mathmodule.c.h b/Modules/clinic/mathmodule.c.h index 4ea0bb82b8e2c..efabbf9714237 100644 --- a/Modules/clinic/mathmodule.c.h +++ b/Modules/clinic/mathmodule.c.h @@ -112,7 +112,7 @@ PyDoc_STRVAR(math_ldexp__doc__, "This is essentially the inverse of frexp()."); #define MATH_LDEXP_METHODDEF \ - {"ldexp", (PyCFunction)(void(*)(void))math_ldexp, METH_FASTCALL, math_ldexp__doc__}, + {"ldexp", _PyCFunction_CAST(math_ldexp), METH_FASTCALL, math_ldexp__doc__}, static PyObject * math_ldexp_impl(PyObject *module, double x, PyObject *i); @@ -250,7 +250,7 @@ PyDoc_STRVAR(math_fmod__doc__, "x % y may differ."); #define MATH_FMOD_METHODDEF \ - {"fmod", (PyCFunction)(void(*)(void))math_fmod, METH_FASTCALL, math_fmod__doc__}, + {"fmod", _PyCFunction_CAST(math_fmod), METH_FASTCALL, math_fmod__doc__}, static PyObject * math_fmod_impl(PyObject *module, double x, double y); @@ -304,7 +304,7 @@ PyDoc_STRVAR(math_dist__doc__, " sqrt(sum((px - qx) ** 2.0 for px, qx in zip(p, q)))"); #define MATH_DIST_METHODDEF \ - {"dist", (PyCFunction)(void(*)(void))math_dist, METH_FASTCALL, math_dist__doc__}, + {"dist", _PyCFunction_CAST(math_dist), METH_FASTCALL, math_dist__doc__}, static PyObject * math_dist_impl(PyObject *module, PyObject *p, PyObject *q); @@ -334,7 +334,7 @@ PyDoc_STRVAR(math_pow__doc__, "Return x**y (x to the power of y)."); #define MATH_POW_METHODDEF \ - {"pow", (PyCFunction)(void(*)(void))math_pow, METH_FASTCALL, math_pow__doc__}, + {"pow", _PyCFunction_CAST(math_pow), METH_FASTCALL, math_pow__doc__}, static PyObject * math_pow_impl(PyObject *module, double x, double y); @@ -568,7 +568,7 @@ PyDoc_STRVAR(math_isclose__doc__, "only close to themselves."); #define MATH_ISCLOSE_METHODDEF \ - {"isclose", (PyCFunction)(void(*)(void))math_isclose, METH_FASTCALL|METH_KEYWORDS, math_isclose__doc__}, + {"isclose", _PyCFunction_CAST(math_isclose), METH_FASTCALL|METH_KEYWORDS, math_isclose__doc__}, static int math_isclose_impl(PyObject *module, double a, double b, double rel_tol, @@ -664,7 +664,7 @@ PyDoc_STRVAR(math_prod__doc__, "non-numeric types."); #define MATH_PROD_METHODDEF \ - {"prod", (PyCFunction)(void(*)(void))math_prod, METH_FASTCALL|METH_KEYWORDS, math_prod__doc__}, + {"prod", _PyCFunction_CAST(math_prod), METH_FASTCALL|METH_KEYWORDS, math_prod__doc__}, static PyObject * math_prod_impl(PyObject *module, PyObject *iterable, PyObject *start); @@ -712,7 +712,7 @@ PyDoc_STRVAR(math_perm__doc__, "Raises ValueError if either of the arguments are negative."); #define MATH_PERM_METHODDEF \ - {"perm", (PyCFunction)(void(*)(void))math_perm, METH_FASTCALL, math_perm__doc__}, + {"perm", _PyCFunction_CAST(math_perm), METH_FASTCALL, math_perm__doc__}, static PyObject * math_perm_impl(PyObject *module, PyObject *n, PyObject *k); @@ -756,7 +756,7 @@ PyDoc_STRVAR(math_comb__doc__, "Raises ValueError if either of the arguments are negative."); #define MATH_COMB_METHODDEF \ - {"comb", (PyCFunction)(void(*)(void))math_comb, METH_FASTCALL, math_comb__doc__}, + {"comb", _PyCFunction_CAST(math_comb), METH_FASTCALL, math_comb__doc__}, static PyObject * math_comb_impl(PyObject *module, PyObject *n, PyObject *k); @@ -786,7 +786,7 @@ PyDoc_STRVAR(math_nextafter__doc__, "Return the next floating-point value after x towards y."); #define MATH_NEXTAFTER_METHODDEF \ - {"nextafter", (PyCFunction)(void(*)(void))math_nextafter, METH_FASTCALL, math_nextafter__doc__}, + {"nextafter", _PyCFunction_CAST(math_nextafter), METH_FASTCALL, math_nextafter__doc__}, static PyObject * math_nextafter_impl(PyObject *module, double x, double y); @@ -865,4 +865,4 @@ math_ulp(PyObject *module, PyObject *arg) exit: return return_value; } -/*[clinic end generated code: output=6381e7d982ff3711 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=965f99dabaa72165 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/md5module.c.h b/Modules/clinic/md5module.c.h index 0ff09b0050a56..999406ba13518 100644 --- a/Modules/clinic/md5module.c.h +++ b/Modules/clinic/md5module.c.h @@ -9,7 +9,7 @@ PyDoc_STRVAR(MD5Type_copy__doc__, "Return a copy of the hash object."); #define MD5TYPE_COPY_METHODDEF \ - {"copy", (PyCFunction)(void(*)(void))MD5Type_copy, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, MD5Type_copy__doc__}, + {"copy", _PyCFunction_CAST(MD5Type_copy), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, MD5Type_copy__doc__}, static PyObject * MD5Type_copy_impl(MD5object *self, PyTypeObject *cls); @@ -76,7 +76,7 @@ PyDoc_STRVAR(_md5_md5__doc__, "Return a new MD5 hash object; optionally initialized with a string."); #define _MD5_MD5_METHODDEF \ - {"md5", (PyCFunction)(void(*)(void))_md5_md5, METH_FASTCALL|METH_KEYWORDS, _md5_md5__doc__}, + {"md5", _PyCFunction_CAST(_md5_md5), METH_FASTCALL|METH_KEYWORDS, _md5_md5__doc__}, static PyObject * _md5_md5_impl(PyObject *module, PyObject *string, int usedforsecurity); @@ -119,4 +119,4 @@ _md5_md5(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kw exit: return return_value; } -/*[clinic end generated code: output=3061297a669c645c input=a9049054013a1b77]*/ +/*[clinic end generated code: output=e5dac1237beb2788 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/overlapped.c.h b/Modules/clinic/overlapped.c.h index 7e81fc8f97104..2861338317497 100644 --- a/Modules/clinic/overlapped.c.h +++ b/Modules/clinic/overlapped.c.h @@ -9,7 +9,7 @@ PyDoc_STRVAR(_overlapped_CreateIoCompletionPort__doc__, "Create a completion port or register a handle with a port."); #define _OVERLAPPED_CREATEIOCOMPLETIONPORT_METHODDEF \ - {"CreateIoCompletionPort", (PyCFunction)(void(*)(void))_overlapped_CreateIoCompletionPort, METH_FASTCALL, _overlapped_CreateIoCompletionPort__doc__}, + {"CreateIoCompletionPort", _PyCFunction_CAST(_overlapped_CreateIoCompletionPort), METH_FASTCALL, _overlapped_CreateIoCompletionPort__doc__}, static PyObject * _overlapped_CreateIoCompletionPort_impl(PyObject *module, HANDLE FileHandle, @@ -45,7 +45,7 @@ PyDoc_STRVAR(_overlapped_GetQueuedCompletionStatus__doc__, "Wait for up to msecs milliseconds."); #define _OVERLAPPED_GETQUEUEDCOMPLETIONSTATUS_METHODDEF \ - {"GetQueuedCompletionStatus", (PyCFunction)(void(*)(void))_overlapped_GetQueuedCompletionStatus, METH_FASTCALL, _overlapped_GetQueuedCompletionStatus__doc__}, + {"GetQueuedCompletionStatus", _PyCFunction_CAST(_overlapped_GetQueuedCompletionStatus), METH_FASTCALL, _overlapped_GetQueuedCompletionStatus__doc__}, static PyObject * _overlapped_GetQueuedCompletionStatus_impl(PyObject *module, @@ -76,7 +76,7 @@ PyDoc_STRVAR(_overlapped_PostQueuedCompletionStatus__doc__, "Post a message to completion port."); #define _OVERLAPPED_POSTQUEUEDCOMPLETIONSTATUS_METHODDEF \ - {"PostQueuedCompletionStatus", (PyCFunction)(void(*)(void))_overlapped_PostQueuedCompletionStatus, METH_FASTCALL, _overlapped_PostQueuedCompletionStatus__doc__}, + {"PostQueuedCompletionStatus", _PyCFunction_CAST(_overlapped_PostQueuedCompletionStatus), METH_FASTCALL, _overlapped_PostQueuedCompletionStatus__doc__}, static PyObject * _overlapped_PostQueuedCompletionStatus_impl(PyObject *module, @@ -112,7 +112,7 @@ PyDoc_STRVAR(_overlapped_RegisterWaitWithQueue__doc__, "Register wait for Object; when complete CompletionPort is notified."); #define _OVERLAPPED_REGISTERWAITWITHQUEUE_METHODDEF \ - {"RegisterWaitWithQueue", (PyCFunction)(void(*)(void))_overlapped_RegisterWaitWithQueue, METH_FASTCALL, _overlapped_RegisterWaitWithQueue__doc__}, + {"RegisterWaitWithQueue", _PyCFunction_CAST(_overlapped_RegisterWaitWithQueue), METH_FASTCALL, _overlapped_RegisterWaitWithQueue__doc__}, static PyObject * _overlapped_RegisterWaitWithQueue_impl(PyObject *module, HANDLE Object, @@ -173,7 +173,7 @@ PyDoc_STRVAR(_overlapped_UnregisterWaitEx__doc__, "Unregister wait handle."); #define _OVERLAPPED_UNREGISTERWAITEX_METHODDEF \ - {"UnregisterWaitEx", (PyCFunction)(void(*)(void))_overlapped_UnregisterWaitEx, METH_FASTCALL, _overlapped_UnregisterWaitEx__doc__}, + {"UnregisterWaitEx", _PyCFunction_CAST(_overlapped_UnregisterWaitEx), METH_FASTCALL, _overlapped_UnregisterWaitEx__doc__}, static PyObject * _overlapped_UnregisterWaitEx_impl(PyObject *module, HANDLE WaitHandle, @@ -206,7 +206,7 @@ PyDoc_STRVAR(_overlapped_CreateEvent__doc__, "EventAttributes must be None."); #define _OVERLAPPED_CREATEEVENT_METHODDEF \ - {"CreateEvent", (PyCFunction)(void(*)(void))_overlapped_CreateEvent, METH_FASTCALL, _overlapped_CreateEvent__doc__}, + {"CreateEvent", _PyCFunction_CAST(_overlapped_CreateEvent), METH_FASTCALL, _overlapped_CreateEvent__doc__}, static PyObject * _overlapped_CreateEvent_impl(PyObject *module, PyObject *EventAttributes, @@ -300,7 +300,7 @@ PyDoc_STRVAR(_overlapped_BindLocal__doc__, "family should be AF_INET or AF_INET6."); #define _OVERLAPPED_BINDLOCAL_METHODDEF \ - {"BindLocal", (PyCFunction)(void(*)(void))_overlapped_BindLocal, METH_FASTCALL, _overlapped_BindLocal__doc__}, + {"BindLocal", _PyCFunction_CAST(_overlapped_BindLocal), METH_FASTCALL, _overlapped_BindLocal__doc__}, static PyObject * _overlapped_BindLocal_impl(PyObject *module, HANDLE Socket, int Family); @@ -404,7 +404,7 @@ PyDoc_STRVAR(_overlapped_Overlapped_getresult__doc__, "is false and the operation is still pending then an error is raised."); #define _OVERLAPPED_OVERLAPPED_GETRESULT_METHODDEF \ - {"getresult", (PyCFunction)(void(*)(void))_overlapped_Overlapped_getresult, METH_FASTCALL, _overlapped_Overlapped_getresult__doc__}, + {"getresult", _PyCFunction_CAST(_overlapped_Overlapped_getresult), METH_FASTCALL, _overlapped_Overlapped_getresult__doc__}, static PyObject * _overlapped_Overlapped_getresult_impl(OverlappedObject *self, BOOL wait); @@ -432,7 +432,7 @@ PyDoc_STRVAR(_overlapped_Overlapped_ReadFile__doc__, "Start overlapped read."); #define _OVERLAPPED_OVERLAPPED_READFILE_METHODDEF \ - {"ReadFile", (PyCFunction)(void(*)(void))_overlapped_Overlapped_ReadFile, METH_FASTCALL, _overlapped_Overlapped_ReadFile__doc__}, + {"ReadFile", _PyCFunction_CAST(_overlapped_Overlapped_ReadFile), METH_FASTCALL, _overlapped_Overlapped_ReadFile__doc__}, static PyObject * _overlapped_Overlapped_ReadFile_impl(OverlappedObject *self, HANDLE handle, @@ -462,7 +462,7 @@ PyDoc_STRVAR(_overlapped_Overlapped_ReadFileInto__doc__, "Start overlapped receive."); #define _OVERLAPPED_OVERLAPPED_READFILEINTO_METHODDEF \ - {"ReadFileInto", (PyCFunction)(void(*)(void))_overlapped_Overlapped_ReadFileInto, METH_FASTCALL, _overlapped_Overlapped_ReadFileInto__doc__}, + {"ReadFileInto", _PyCFunction_CAST(_overlapped_Overlapped_ReadFileInto), METH_FASTCALL, _overlapped_Overlapped_ReadFileInto__doc__}, static PyObject * _overlapped_Overlapped_ReadFileInto_impl(OverlappedObject *self, @@ -497,7 +497,7 @@ PyDoc_STRVAR(_overlapped_Overlapped_WSARecv__doc__, "Start overlapped receive."); #define _OVERLAPPED_OVERLAPPED_WSARECV_METHODDEF \ - {"WSARecv", (PyCFunction)(void(*)(void))_overlapped_Overlapped_WSARecv, METH_FASTCALL, _overlapped_Overlapped_WSARecv__doc__}, + {"WSARecv", _PyCFunction_CAST(_overlapped_Overlapped_WSARecv), METH_FASTCALL, _overlapped_Overlapped_WSARecv__doc__}, static PyObject * _overlapped_Overlapped_WSARecv_impl(OverlappedObject *self, HANDLE handle, @@ -528,7 +528,7 @@ PyDoc_STRVAR(_overlapped_Overlapped_WSARecvInto__doc__, "Start overlapped receive."); #define _OVERLAPPED_OVERLAPPED_WSARECVINTO_METHODDEF \ - {"WSARecvInto", (PyCFunction)(void(*)(void))_overlapped_Overlapped_WSARecvInto, METH_FASTCALL, _overlapped_Overlapped_WSARecvInto__doc__}, + {"WSARecvInto", _PyCFunction_CAST(_overlapped_Overlapped_WSARecvInto), METH_FASTCALL, _overlapped_Overlapped_WSARecvInto__doc__}, static PyObject * _overlapped_Overlapped_WSARecvInto_impl(OverlappedObject *self, @@ -565,7 +565,7 @@ PyDoc_STRVAR(_overlapped_Overlapped_WriteFile__doc__, "Start overlapped write."); #define _OVERLAPPED_OVERLAPPED_WRITEFILE_METHODDEF \ - {"WriteFile", (PyCFunction)(void(*)(void))_overlapped_Overlapped_WriteFile, METH_FASTCALL, _overlapped_Overlapped_WriteFile__doc__}, + {"WriteFile", _PyCFunction_CAST(_overlapped_Overlapped_WriteFile), METH_FASTCALL, _overlapped_Overlapped_WriteFile__doc__}, static PyObject * _overlapped_Overlapped_WriteFile_impl(OverlappedObject *self, HANDLE handle, @@ -600,7 +600,7 @@ PyDoc_STRVAR(_overlapped_Overlapped_WSASend__doc__, "Start overlapped send."); #define _OVERLAPPED_OVERLAPPED_WSASEND_METHODDEF \ - {"WSASend", (PyCFunction)(void(*)(void))_overlapped_Overlapped_WSASend, METH_FASTCALL, _overlapped_Overlapped_WSASend__doc__}, + {"WSASend", _PyCFunction_CAST(_overlapped_Overlapped_WSASend), METH_FASTCALL, _overlapped_Overlapped_WSASend__doc__}, static PyObject * _overlapped_Overlapped_WSASend_impl(OverlappedObject *self, HANDLE handle, @@ -636,7 +636,7 @@ PyDoc_STRVAR(_overlapped_Overlapped_AcceptEx__doc__, "Start overlapped wait for client to connect."); #define _OVERLAPPED_OVERLAPPED_ACCEPTEX_METHODDEF \ - {"AcceptEx", (PyCFunction)(void(*)(void))_overlapped_Overlapped_AcceptEx, METH_FASTCALL, _overlapped_Overlapped_AcceptEx__doc__}, + {"AcceptEx", _PyCFunction_CAST(_overlapped_Overlapped_AcceptEx), METH_FASTCALL, _overlapped_Overlapped_AcceptEx__doc__}, static PyObject * _overlapped_Overlapped_AcceptEx_impl(OverlappedObject *self, @@ -669,7 +669,7 @@ PyDoc_STRVAR(_overlapped_Overlapped_ConnectEx__doc__, "client_handle should be unbound."); #define _OVERLAPPED_OVERLAPPED_CONNECTEX_METHODDEF \ - {"ConnectEx", (PyCFunction)(void(*)(void))_overlapped_Overlapped_ConnectEx, METH_FASTCALL, _overlapped_Overlapped_ConnectEx__doc__}, + {"ConnectEx", _PyCFunction_CAST(_overlapped_Overlapped_ConnectEx), METH_FASTCALL, _overlapped_Overlapped_ConnectEx__doc__}, static PyObject * _overlapped_Overlapped_ConnectEx_impl(OverlappedObject *self, @@ -699,7 +699,7 @@ PyDoc_STRVAR(_overlapped_Overlapped_DisconnectEx__doc__, "\n"); #define _OVERLAPPED_OVERLAPPED_DISCONNECTEX_METHODDEF \ - {"DisconnectEx", (PyCFunction)(void(*)(void))_overlapped_Overlapped_DisconnectEx, METH_FASTCALL, _overlapped_Overlapped_DisconnectEx__doc__}, + {"DisconnectEx", _PyCFunction_CAST(_overlapped_Overlapped_DisconnectEx), METH_FASTCALL, _overlapped_Overlapped_DisconnectEx__doc__}, static PyObject * _overlapped_Overlapped_DisconnectEx_impl(OverlappedObject *self, @@ -730,7 +730,7 @@ PyDoc_STRVAR(_overlapped_Overlapped_TransmitFile__doc__, "Transmit file data over a connected socket."); #define _OVERLAPPED_OVERLAPPED_TRANSMITFILE_METHODDEF \ - {"TransmitFile", (PyCFunction)(void(*)(void))_overlapped_Overlapped_TransmitFile, METH_FASTCALL, _overlapped_Overlapped_TransmitFile__doc__}, + {"TransmitFile", _PyCFunction_CAST(_overlapped_Overlapped_TransmitFile), METH_FASTCALL, _overlapped_Overlapped_TransmitFile__doc__}, static PyObject * _overlapped_Overlapped_TransmitFile_impl(OverlappedObject *self, @@ -838,7 +838,7 @@ PyDoc_STRVAR(_overlapped_WSAConnect__doc__, "Bind a remote address to a connectionless (UDP) socket."); #define _OVERLAPPED_WSACONNECT_METHODDEF \ - {"WSAConnect", (PyCFunction)(void(*)(void))_overlapped_WSAConnect, METH_FASTCALL, _overlapped_WSAConnect__doc__}, + {"WSAConnect", _PyCFunction_CAST(_overlapped_WSAConnect), METH_FASTCALL, _overlapped_WSAConnect__doc__}, static PyObject * _overlapped_WSAConnect_impl(PyObject *module, HANDLE ConnectSocket, @@ -868,7 +868,7 @@ PyDoc_STRVAR(_overlapped_Overlapped_WSASendTo__doc__, "Start overlapped sendto over a connectionless (UDP) socket."); #define _OVERLAPPED_OVERLAPPED_WSASENDTO_METHODDEF \ - {"WSASendTo", (PyCFunction)(void(*)(void))_overlapped_Overlapped_WSASendTo, METH_FASTCALL, _overlapped_Overlapped_WSASendTo__doc__}, + {"WSASendTo", _PyCFunction_CAST(_overlapped_Overlapped_WSASendTo), METH_FASTCALL, _overlapped_Overlapped_WSASendTo__doc__}, static PyObject * _overlapped_Overlapped_WSASendTo_impl(OverlappedObject *self, HANDLE handle, @@ -906,7 +906,7 @@ PyDoc_STRVAR(_overlapped_Overlapped_WSARecvFrom__doc__, "Start overlapped receive."); #define _OVERLAPPED_OVERLAPPED_WSARECVFROM_METHODDEF \ - {"WSARecvFrom", (PyCFunction)(void(*)(void))_overlapped_Overlapped_WSARecvFrom, METH_FASTCALL, _overlapped_Overlapped_WSARecvFrom__doc__}, + {"WSARecvFrom", _PyCFunction_CAST(_overlapped_Overlapped_WSARecvFrom), METH_FASTCALL, _overlapped_Overlapped_WSARecvFrom__doc__}, static PyObject * _overlapped_Overlapped_WSARecvFrom_impl(OverlappedObject *self, @@ -938,7 +938,7 @@ PyDoc_STRVAR(_overlapped_Overlapped_WSARecvFromInto__doc__, "Start overlapped receive."); #define _OVERLAPPED_OVERLAPPED_WSARECVFROMINTO_METHODDEF \ - {"WSARecvFromInto", (PyCFunction)(void(*)(void))_overlapped_Overlapped_WSARecvFromInto, METH_FASTCALL, _overlapped_Overlapped_WSARecvFromInto__doc__}, + {"WSARecvFromInto", _PyCFunction_CAST(_overlapped_Overlapped_WSARecvFromInto), METH_FASTCALL, _overlapped_Overlapped_WSARecvFromInto__doc__}, static PyObject * _overlapped_Overlapped_WSARecvFromInto_impl(OverlappedObject *self, @@ -968,4 +968,4 @@ _overlapped_Overlapped_WSARecvFromInto(OverlappedObject *self, PyObject *const * return return_value; } -/*[clinic end generated code: output=d19a061ea7398d23 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=b0f15f5c09f1147e input=a9049054013a1b77]*/ diff --git a/Modules/clinic/posixmodule.c.h b/Modules/clinic/posixmodule.c.h index 352dadc9b5627..fdcd5bdd4dc17 100644 --- a/Modules/clinic/posixmodule.c.h +++ b/Modules/clinic/posixmodule.c.h @@ -28,7 +28,7 @@ PyDoc_STRVAR(os_stat__doc__, " an open file descriptor."); #define OS_STAT_METHODDEF \ - {"stat", (PyCFunction)(void(*)(void))os_stat, METH_FASTCALL|METH_KEYWORDS, os_stat__doc__}, + {"stat", _PyCFunction_CAST(os_stat), METH_FASTCALL|METH_KEYWORDS, os_stat__doc__}, static PyObject * os_stat_impl(PyObject *module, path_t *path, int dir_fd, int follow_symlinks); @@ -87,7 +87,7 @@ PyDoc_STRVAR(os_lstat__doc__, "Equivalent to stat(path, follow_symlinks=False)."); #define OS_LSTAT_METHODDEF \ - {"lstat", (PyCFunction)(void(*)(void))os_lstat, METH_FASTCALL|METH_KEYWORDS, os_lstat__doc__}, + {"lstat", _PyCFunction_CAST(os_lstat), METH_FASTCALL|METH_KEYWORDS, os_lstat__doc__}, static PyObject * os_lstat_impl(PyObject *module, path_t *path, int dir_fd); @@ -159,7 +159,7 @@ PyDoc_STRVAR(os_access__doc__, " has the specified access to the path."); #define OS_ACCESS_METHODDEF \ - {"access", (PyCFunction)(void(*)(void))os_access, METH_FASTCALL|METH_KEYWORDS, os_access__doc__}, + {"access", _PyCFunction_CAST(os_access), METH_FASTCALL|METH_KEYWORDS, os_access__doc__}, static int os_access_impl(PyObject *module, path_t *path, int mode, int dir_fd, @@ -297,7 +297,7 @@ PyDoc_STRVAR(os_chdir__doc__, " If this functionality is unavailable, using it raises an exception."); #define OS_CHDIR_METHODDEF \ - {"chdir", (PyCFunction)(void(*)(void))os_chdir, METH_FASTCALL|METH_KEYWORDS, os_chdir__doc__}, + {"chdir", _PyCFunction_CAST(os_chdir), METH_FASTCALL|METH_KEYWORDS, os_chdir__doc__}, static PyObject * os_chdir_impl(PyObject *module, path_t *path); @@ -339,7 +339,7 @@ PyDoc_STRVAR(os_fchdir__doc__, "Equivalent to os.chdir(fd)."); #define OS_FCHDIR_METHODDEF \ - {"fchdir", (PyCFunction)(void(*)(void))os_fchdir, METH_FASTCALL|METH_KEYWORDS, os_fchdir__doc__}, + {"fchdir", _PyCFunction_CAST(os_fchdir), METH_FASTCALL|METH_KEYWORDS, os_fchdir__doc__}, static PyObject * os_fchdir_impl(PyObject *module, int fd); @@ -395,7 +395,7 @@ PyDoc_STRVAR(os_chmod__doc__, " If they are unavailable, using them will raise a NotImplementedError."); #define OS_CHMOD_METHODDEF \ - {"chmod", (PyCFunction)(void(*)(void))os_chmod, METH_FASTCALL|METH_KEYWORDS, os_chmod__doc__}, + {"chmod", _PyCFunction_CAST(os_chmod), METH_FASTCALL|METH_KEYWORDS, os_chmod__doc__}, static PyObject * os_chmod_impl(PyObject *module, path_t *path, int mode, int dir_fd, @@ -461,7 +461,7 @@ PyDoc_STRVAR(os_fchmod__doc__, "Equivalent to os.chmod(fd, mode)."); #define OS_FCHMOD_METHODDEF \ - {"fchmod", (PyCFunction)(void(*)(void))os_fchmod, METH_FASTCALL|METH_KEYWORDS, os_fchmod__doc__}, + {"fchmod", _PyCFunction_CAST(os_fchmod), METH_FASTCALL|METH_KEYWORDS, os_fchmod__doc__}, static PyObject * os_fchmod_impl(PyObject *module, int fd, int mode); @@ -508,7 +508,7 @@ PyDoc_STRVAR(os_lchmod__doc__, "Equivalent to chmod(path, mode, follow_symlinks=False).\""); #define OS_LCHMOD_METHODDEF \ - {"lchmod", (PyCFunction)(void(*)(void))os_lchmod, METH_FASTCALL|METH_KEYWORDS, os_lchmod__doc__}, + {"lchmod", _PyCFunction_CAST(os_lchmod), METH_FASTCALL|METH_KEYWORDS, os_lchmod__doc__}, static PyObject * os_lchmod_impl(PyObject *module, path_t *path, int mode); @@ -560,7 +560,7 @@ PyDoc_STRVAR(os_chflags__doc__, "unavailable, using it will raise a NotImplementedError."); #define OS_CHFLAGS_METHODDEF \ - {"chflags", (PyCFunction)(void(*)(void))os_chflags, METH_FASTCALL|METH_KEYWORDS, os_chflags__doc__}, + {"chflags", _PyCFunction_CAST(os_chflags), METH_FASTCALL|METH_KEYWORDS, os_chflags__doc__}, static PyObject * os_chflags_impl(PyObject *module, path_t *path, unsigned long flags, @@ -621,7 +621,7 @@ PyDoc_STRVAR(os_lchflags__doc__, "Equivalent to chflags(path, flags, follow_symlinks=False)."); #define OS_LCHFLAGS_METHODDEF \ - {"lchflags", (PyCFunction)(void(*)(void))os_lchflags, METH_FASTCALL|METH_KEYWORDS, os_lchflags__doc__}, + {"lchflags", _PyCFunction_CAST(os_lchflags), METH_FASTCALL|METH_KEYWORDS, os_lchflags__doc__}, static PyObject * os_lchflags_impl(PyObject *module, path_t *path, unsigned long flags); @@ -668,7 +668,7 @@ PyDoc_STRVAR(os_chroot__doc__, "Change root directory to path."); #define OS_CHROOT_METHODDEF \ - {"chroot", (PyCFunction)(void(*)(void))os_chroot, METH_FASTCALL|METH_KEYWORDS, os_chroot__doc__}, + {"chroot", _PyCFunction_CAST(os_chroot), METH_FASTCALL|METH_KEYWORDS, os_chroot__doc__}, static PyObject * os_chroot_impl(PyObject *module, path_t *path); @@ -709,7 +709,7 @@ PyDoc_STRVAR(os_fsync__doc__, "Force write of fd to disk."); #define OS_FSYNC_METHODDEF \ - {"fsync", (PyCFunction)(void(*)(void))os_fsync, METH_FASTCALL|METH_KEYWORDS, os_fsync__doc__}, + {"fsync", _PyCFunction_CAST(os_fsync), METH_FASTCALL|METH_KEYWORDS, os_fsync__doc__}, static PyObject * os_fsync_impl(PyObject *module, int fd); @@ -769,7 +769,7 @@ PyDoc_STRVAR(os_fdatasync__doc__, "Force write of fd to disk without forcing update of metadata."); #define OS_FDATASYNC_METHODDEF \ - {"fdatasync", (PyCFunction)(void(*)(void))os_fdatasync, METH_FASTCALL|METH_KEYWORDS, os_fdatasync__doc__}, + {"fdatasync", _PyCFunction_CAST(os_fdatasync), METH_FASTCALL|METH_KEYWORDS, os_fdatasync__doc__}, static PyObject * os_fdatasync_impl(PyObject *module, int fd); @@ -831,7 +831,7 @@ PyDoc_STRVAR(os_chown__doc__, " If they are unavailable, using them will raise a NotImplementedError."); #define OS_CHOWN_METHODDEF \ - {"chown", (PyCFunction)(void(*)(void))os_chown, METH_FASTCALL|METH_KEYWORDS, os_chown__doc__}, + {"chown", _PyCFunction_CAST(os_chown), METH_FASTCALL|METH_KEYWORDS, os_chown__doc__}, static PyObject * os_chown_impl(PyObject *module, path_t *path, uid_t uid, gid_t gid, @@ -902,7 +902,7 @@ PyDoc_STRVAR(os_fchown__doc__, "Equivalent to os.chown(fd, uid, gid)."); #define OS_FCHOWN_METHODDEF \ - {"fchown", (PyCFunction)(void(*)(void))os_fchown, METH_FASTCALL|METH_KEYWORDS, os_fchown__doc__}, + {"fchown", _PyCFunction_CAST(os_fchown), METH_FASTCALL|METH_KEYWORDS, os_fchown__doc__}, static PyObject * os_fchown_impl(PyObject *module, int fd, uid_t uid, gid_t gid); @@ -952,7 +952,7 @@ PyDoc_STRVAR(os_lchown__doc__, "Equivalent to os.chown(path, uid, gid, follow_symlinks=False)."); #define OS_LCHOWN_METHODDEF \ - {"lchown", (PyCFunction)(void(*)(void))os_lchown, METH_FASTCALL|METH_KEYWORDS, os_lchown__doc__}, + {"lchown", _PyCFunction_CAST(os_lchown), METH_FASTCALL|METH_KEYWORDS, os_lchown__doc__}, static PyObject * os_lchown_impl(PyObject *module, path_t *path, uid_t uid, gid_t gid); @@ -1048,7 +1048,7 @@ PyDoc_STRVAR(os_link__doc__, " NotImplementedError."); #define OS_LINK_METHODDEF \ - {"link", (PyCFunction)(void(*)(void))os_link, METH_FASTCALL|METH_KEYWORDS, os_link__doc__}, + {"link", _PyCFunction_CAST(os_link), METH_FASTCALL|METH_KEYWORDS, os_link__doc__}, static PyObject * os_link_impl(PyObject *module, path_t *src, path_t *dst, int src_dir_fd, @@ -1133,7 +1133,7 @@ PyDoc_STRVAR(os_listdir__doc__, "entries \'.\' and \'..\' even if they are present in the directory."); #define OS_LISTDIR_METHODDEF \ - {"listdir", (PyCFunction)(void(*)(void))os_listdir, METH_FASTCALL|METH_KEYWORDS, os_listdir__doc__}, + {"listdir", _PyCFunction_CAST(os_listdir), METH_FASTCALL|METH_KEYWORDS, os_listdir__doc__}, static PyObject * os_listdir_impl(PyObject *module, path_t *path); @@ -1244,7 +1244,7 @@ PyDoc_STRVAR(os__getvolumepathname__doc__, "A helper function for ismount on Win32."); #define OS__GETVOLUMEPATHNAME_METHODDEF \ - {"_getvolumepathname", (PyCFunction)(void(*)(void))os__getvolumepathname, METH_FASTCALL|METH_KEYWORDS, os__getvolumepathname__doc__}, + {"_getvolumepathname", _PyCFunction_CAST(os__getvolumepathname), METH_FASTCALL|METH_KEYWORDS, os__getvolumepathname__doc__}, static PyObject * os__getvolumepathname_impl(PyObject *module, path_t *path); @@ -1285,7 +1285,7 @@ PyDoc_STRVAR(os__path_splitroot__doc__, "Removes everything after the root on Win32."); #define OS__PATH_SPLITROOT_METHODDEF \ - {"_path_splitroot", (PyCFunction)(void(*)(void))os__path_splitroot, METH_FASTCALL|METH_KEYWORDS, os__path_splitroot__doc__}, + {"_path_splitroot", _PyCFunction_CAST(os__path_splitroot), METH_FASTCALL|METH_KEYWORDS, os__path_splitroot__doc__}, static PyObject * os__path_splitroot_impl(PyObject *module, path_t *path); @@ -1324,7 +1324,7 @@ PyDoc_STRVAR(os__path_normpath__doc__, "Basic path normalization."); #define OS__PATH_NORMPATH_METHODDEF \ - {"_path_normpath", (PyCFunction)(void(*)(void))os__path_normpath, METH_FASTCALL|METH_KEYWORDS, os__path_normpath__doc__}, + {"_path_normpath", _PyCFunction_CAST(os__path_normpath), METH_FASTCALL|METH_KEYWORDS, os__path_normpath__doc__}, static PyObject * os__path_normpath_impl(PyObject *module, PyObject *path); @@ -1363,7 +1363,7 @@ PyDoc_STRVAR(os_mkdir__doc__, "The mode argument is ignored on Windows."); #define OS_MKDIR_METHODDEF \ - {"mkdir", (PyCFunction)(void(*)(void))os_mkdir, METH_FASTCALL|METH_KEYWORDS, os_mkdir__doc__}, + {"mkdir", _PyCFunction_CAST(os_mkdir), METH_FASTCALL|METH_KEYWORDS, os_mkdir__doc__}, static PyObject * os_mkdir_impl(PyObject *module, path_t *path, int mode, int dir_fd); @@ -1457,7 +1457,7 @@ PyDoc_STRVAR(os_getpriority__doc__, "Return program scheduling priority."); #define OS_GETPRIORITY_METHODDEF \ - {"getpriority", (PyCFunction)(void(*)(void))os_getpriority, METH_FASTCALL|METH_KEYWORDS, os_getpriority__doc__}, + {"getpriority", _PyCFunction_CAST(os_getpriority), METH_FASTCALL|METH_KEYWORDS, os_getpriority__doc__}, static PyObject * os_getpriority_impl(PyObject *module, int which, int who); @@ -1501,7 +1501,7 @@ PyDoc_STRVAR(os_setpriority__doc__, "Set program scheduling priority."); #define OS_SETPRIORITY_METHODDEF \ - {"setpriority", (PyCFunction)(void(*)(void))os_setpriority, METH_FASTCALL|METH_KEYWORDS, os_setpriority__doc__}, + {"setpriority", _PyCFunction_CAST(os_setpriority), METH_FASTCALL|METH_KEYWORDS, os_setpriority__doc__}, static PyObject * os_setpriority_impl(PyObject *module, int which, int who, int priority); @@ -1554,7 +1554,7 @@ PyDoc_STRVAR(os_rename__doc__, " If they are unavailable, using them will raise a NotImplementedError."); #define OS_RENAME_METHODDEF \ - {"rename", (PyCFunction)(void(*)(void))os_rename, METH_FASTCALL|METH_KEYWORDS, os_rename__doc__}, + {"rename", _PyCFunction_CAST(os_rename), METH_FASTCALL|METH_KEYWORDS, os_rename__doc__}, static PyObject * os_rename_impl(PyObject *module, path_t *src, path_t *dst, int src_dir_fd, @@ -1622,7 +1622,7 @@ PyDoc_STRVAR(os_replace__doc__, " If they are unavailable, using them will raise a NotImplementedError."); #define OS_REPLACE_METHODDEF \ - {"replace", (PyCFunction)(void(*)(void))os_replace, METH_FASTCALL|METH_KEYWORDS, os_replace__doc__}, + {"replace", _PyCFunction_CAST(os_replace), METH_FASTCALL|METH_KEYWORDS, os_replace__doc__}, static PyObject * os_replace_impl(PyObject *module, path_t *src, path_t *dst, int src_dir_fd, @@ -1689,7 +1689,7 @@ PyDoc_STRVAR(os_rmdir__doc__, " If it is unavailable, using it will raise a NotImplementedError."); #define OS_RMDIR_METHODDEF \ - {"rmdir", (PyCFunction)(void(*)(void))os_rmdir, METH_FASTCALL|METH_KEYWORDS, os_rmdir__doc__}, + {"rmdir", _PyCFunction_CAST(os_rmdir), METH_FASTCALL|METH_KEYWORDS, os_rmdir__doc__}, static PyObject * os_rmdir_impl(PyObject *module, path_t *path, int dir_fd); @@ -1737,7 +1737,7 @@ PyDoc_STRVAR(os_system__doc__, "Execute the command in a subshell."); #define OS_SYSTEM_METHODDEF \ - {"system", (PyCFunction)(void(*)(void))os_system, METH_FASTCALL|METH_KEYWORDS, os_system__doc__}, + {"system", _PyCFunction_CAST(os_system), METH_FASTCALL|METH_KEYWORDS, os_system__doc__}, static long os_system_impl(PyObject *module, const Py_UNICODE *command); @@ -1794,7 +1794,7 @@ PyDoc_STRVAR(os_system__doc__, "Execute the command in a subshell."); #define OS_SYSTEM_METHODDEF \ - {"system", (PyCFunction)(void(*)(void))os_system, METH_FASTCALL|METH_KEYWORDS, os_system__doc__}, + {"system", _PyCFunction_CAST(os_system), METH_FASTCALL|METH_KEYWORDS, os_system__doc__}, static long os_system_impl(PyObject *module, PyObject *command); @@ -1875,7 +1875,7 @@ PyDoc_STRVAR(os_unlink__doc__, " If it is unavailable, using it will raise a NotImplementedError."); #define OS_UNLINK_METHODDEF \ - {"unlink", (PyCFunction)(void(*)(void))os_unlink, METH_FASTCALL|METH_KEYWORDS, os_unlink__doc__}, + {"unlink", _PyCFunction_CAST(os_unlink), METH_FASTCALL|METH_KEYWORDS, os_unlink__doc__}, static PyObject * os_unlink_impl(PyObject *module, path_t *path, int dir_fd); @@ -1926,7 +1926,7 @@ PyDoc_STRVAR(os_remove__doc__, " If it is unavailable, using it will raise a NotImplementedError."); #define OS_REMOVE_METHODDEF \ - {"remove", (PyCFunction)(void(*)(void))os_remove, METH_FASTCALL|METH_KEYWORDS, os_remove__doc__}, + {"remove", _PyCFunction_CAST(os_remove), METH_FASTCALL|METH_KEYWORDS, os_remove__doc__}, static PyObject * os_remove_impl(PyObject *module, path_t *path, int dir_fd); @@ -2020,7 +2020,7 @@ PyDoc_STRVAR(os_utime__doc__, " If they are unavailable, using them will raise a NotImplementedError."); #define OS_UTIME_METHODDEF \ - {"utime", (PyCFunction)(void(*)(void))os_utime, METH_FASTCALL|METH_KEYWORDS, os_utime__doc__}, + {"utime", _PyCFunction_CAST(os_utime), METH_FASTCALL|METH_KEYWORDS, os_utime__doc__}, static PyObject * os_utime_impl(PyObject *module, path_t *path, PyObject *times, PyObject *ns, @@ -2095,7 +2095,7 @@ PyDoc_STRVAR(os__exit__doc__, "Exit to the system with specified status, without normal exit processing."); #define OS__EXIT_METHODDEF \ - {"_exit", (PyCFunction)(void(*)(void))os__exit, METH_FASTCALL|METH_KEYWORDS, os__exit__doc__}, + {"_exit", _PyCFunction_CAST(os__exit), METH_FASTCALL|METH_KEYWORDS, os__exit__doc__}, static PyObject * os__exit_impl(PyObject *module, int status); @@ -2137,7 +2137,7 @@ PyDoc_STRVAR(os_execv__doc__, " Tuple or list of strings."); #define OS_EXECV_METHODDEF \ - {"execv", (PyCFunction)(void(*)(void))os_execv, METH_FASTCALL, os_execv__doc__}, + {"execv", _PyCFunction_CAST(os_execv), METH_FASTCALL, os_execv__doc__}, static PyObject * os_execv_impl(PyObject *module, path_t *path, PyObject *argv); @@ -2183,7 +2183,7 @@ PyDoc_STRVAR(os_execve__doc__, " Dictionary of strings mapping to strings."); #define OS_EXECVE_METHODDEF \ - {"execve", (PyCFunction)(void(*)(void))os_execve, METH_FASTCALL|METH_KEYWORDS, os_execve__doc__}, + {"execve", _PyCFunction_CAST(os_execve), METH_FASTCALL|METH_KEYWORDS, os_execve__doc__}, static PyObject * os_execve_impl(PyObject *module, path_t *path, PyObject *argv, PyObject *env); @@ -2251,7 +2251,7 @@ PyDoc_STRVAR(os_posix_spawn__doc__, " A tuple with the scheduler policy (optional) and parameters."); #define OS_POSIX_SPAWN_METHODDEF \ - {"posix_spawn", (PyCFunction)(void(*)(void))os_posix_spawn, METH_FASTCALL|METH_KEYWORDS, os_posix_spawn__doc__}, + {"posix_spawn", _PyCFunction_CAST(os_posix_spawn), METH_FASTCALL|METH_KEYWORDS, os_posix_spawn__doc__}, static PyObject * os_posix_spawn_impl(PyObject *module, path_t *path, PyObject *argv, @@ -2378,7 +2378,7 @@ PyDoc_STRVAR(os_posix_spawnp__doc__, " A tuple with the scheduler policy (optional) and parameters."); #define OS_POSIX_SPAWNP_METHODDEF \ - {"posix_spawnp", (PyCFunction)(void(*)(void))os_posix_spawnp, METH_FASTCALL|METH_KEYWORDS, os_posix_spawnp__doc__}, + {"posix_spawnp", _PyCFunction_CAST(os_posix_spawnp), METH_FASTCALL|METH_KEYWORDS, os_posix_spawnp__doc__}, static PyObject * os_posix_spawnp_impl(PyObject *module, path_t *path, PyObject *argv, @@ -2489,7 +2489,7 @@ PyDoc_STRVAR(os_spawnv__doc__, " Tuple or list of strings."); #define OS_SPAWNV_METHODDEF \ - {"spawnv", (PyCFunction)(void(*)(void))os_spawnv, METH_FASTCALL, os_spawnv__doc__}, + {"spawnv", _PyCFunction_CAST(os_spawnv), METH_FASTCALL, os_spawnv__doc__}, static PyObject * os_spawnv_impl(PyObject *module, int mode, path_t *path, PyObject *argv); @@ -2542,7 +2542,7 @@ PyDoc_STRVAR(os_spawnve__doc__, " Dictionary of strings mapping to strings."); #define OS_SPAWNVE_METHODDEF \ - {"spawnve", (PyCFunction)(void(*)(void))os_spawnve, METH_FASTCALL, os_spawnve__doc__}, + {"spawnve", _PyCFunction_CAST(os_spawnve), METH_FASTCALL, os_spawnve__doc__}, static PyObject * os_spawnve_impl(PyObject *module, int mode, path_t *path, PyObject *argv, @@ -2601,7 +2601,7 @@ PyDoc_STRVAR(os_register_at_fork__doc__, "\'after_in_child\' and \'after_in_parent\' callbacks are called in order."); #define OS_REGISTER_AT_FORK_METHODDEF \ - {"register_at_fork", (PyCFunction)(void(*)(void))os_register_at_fork, METH_FASTCALL|METH_KEYWORDS, os_register_at_fork__doc__}, + {"register_at_fork", _PyCFunction_CAST(os_register_at_fork), METH_FASTCALL|METH_KEYWORDS, os_register_at_fork__doc__}, static PyObject * os_register_at_fork_impl(PyObject *module, PyObject *before, @@ -2705,7 +2705,7 @@ PyDoc_STRVAR(os_sched_get_priority_max__doc__, "Get the maximum scheduling priority for policy."); #define OS_SCHED_GET_PRIORITY_MAX_METHODDEF \ - {"sched_get_priority_max", (PyCFunction)(void(*)(void))os_sched_get_priority_max, METH_FASTCALL|METH_KEYWORDS, os_sched_get_priority_max__doc__}, + {"sched_get_priority_max", _PyCFunction_CAST(os_sched_get_priority_max), METH_FASTCALL|METH_KEYWORDS, os_sched_get_priority_max__doc__}, static PyObject * os_sched_get_priority_max_impl(PyObject *module, int policy); @@ -2744,7 +2744,7 @@ PyDoc_STRVAR(os_sched_get_priority_min__doc__, "Get the minimum scheduling priority for policy."); #define OS_SCHED_GET_PRIORITY_MIN_METHODDEF \ - {"sched_get_priority_min", (PyCFunction)(void(*)(void))os_sched_get_priority_min, METH_FASTCALL|METH_KEYWORDS, os_sched_get_priority_min__doc__}, + {"sched_get_priority_min", _PyCFunction_CAST(os_sched_get_priority_min), METH_FASTCALL|METH_KEYWORDS, os_sched_get_priority_min__doc__}, static PyObject * os_sched_get_priority_min_impl(PyObject *module, int policy); @@ -2857,7 +2857,7 @@ PyDoc_STRVAR(os_sched_setscheduler__doc__, "param is an instance of sched_param."); #define OS_SCHED_SETSCHEDULER_METHODDEF \ - {"sched_setscheduler", (PyCFunction)(void(*)(void))os_sched_setscheduler, METH_FASTCALL, os_sched_setscheduler__doc__}, + {"sched_setscheduler", _PyCFunction_CAST(os_sched_setscheduler), METH_FASTCALL, os_sched_setscheduler__doc__}, static PyObject * os_sched_setscheduler_impl(PyObject *module, pid_t pid, int policy, @@ -2929,7 +2929,7 @@ PyDoc_STRVAR(os_sched_setparam__doc__, "param should be an instance of sched_param."); #define OS_SCHED_SETPARAM_METHODDEF \ - {"sched_setparam", (PyCFunction)(void(*)(void))os_sched_setparam, METH_FASTCALL, os_sched_setparam__doc__}, + {"sched_setparam", _PyCFunction_CAST(os_sched_setparam), METH_FASTCALL, os_sched_setparam__doc__}, static PyObject * os_sched_setparam_impl(PyObject *module, pid_t pid, PyObject *param_obj); @@ -3024,7 +3024,7 @@ PyDoc_STRVAR(os_sched_setaffinity__doc__, "mask should be an iterable of integers identifying CPUs."); #define OS_SCHED_SETAFFINITY_METHODDEF \ - {"sched_setaffinity", (PyCFunction)(void(*)(void))os_sched_setaffinity, METH_FASTCALL, os_sched_setaffinity__doc__}, + {"sched_setaffinity", _PyCFunction_CAST(os_sched_setaffinity), METH_FASTCALL, os_sched_setaffinity__doc__}, static PyObject * os_sched_setaffinity_impl(PyObject *module, pid_t pid, PyObject *mask); @@ -3235,7 +3235,7 @@ PyDoc_STRVAR(os_getgrouplist__doc__, " base group id of the user"); #define OS_GETGROUPLIST_METHODDEF \ - {"getgrouplist", (PyCFunction)(void(*)(void))os_getgrouplist, METH_FASTCALL, os_getgrouplist__doc__}, + {"getgrouplist", _PyCFunction_CAST(os_getgrouplist), METH_FASTCALL, os_getgrouplist__doc__}, static PyObject * os_getgrouplist_impl(PyObject *module, const char *user, int basegid); @@ -3289,7 +3289,7 @@ PyDoc_STRVAR(os_getgrouplist__doc__, " base group id of the user"); #define OS_GETGROUPLIST_METHODDEF \ - {"getgrouplist", (PyCFunction)(void(*)(void))os_getgrouplist, METH_FASTCALL, os_getgrouplist__doc__}, + {"getgrouplist", _PyCFunction_CAST(os_getgrouplist), METH_FASTCALL, os_getgrouplist__doc__}, static PyObject * os_getgrouplist_impl(PyObject *module, const char *user, gid_t basegid); @@ -3363,7 +3363,7 @@ PyDoc_STRVAR(os_initgroups__doc__, "group id."); #define OS_INITGROUPS_METHODDEF \ - {"initgroups", (PyCFunction)(void(*)(void))os_initgroups, METH_FASTCALL, os_initgroups__doc__}, + {"initgroups", _PyCFunction_CAST(os_initgroups), METH_FASTCALL, os_initgroups__doc__}, static PyObject * os_initgroups_impl(PyObject *module, PyObject *oname, int gid); @@ -3409,7 +3409,7 @@ PyDoc_STRVAR(os_initgroups__doc__, "group id."); #define OS_INITGROUPS_METHODDEF \ - {"initgroups", (PyCFunction)(void(*)(void))os_initgroups, METH_FASTCALL, os_initgroups__doc__}, + {"initgroups", _PyCFunction_CAST(os_initgroups), METH_FASTCALL, os_initgroups__doc__}, static PyObject * os_initgroups_impl(PyObject *module, PyObject *oname, gid_t gid); @@ -3450,7 +3450,7 @@ PyDoc_STRVAR(os_getpgid__doc__, "Call the system call getpgid(), and return the result."); #define OS_GETPGID_METHODDEF \ - {"getpgid", (PyCFunction)(void(*)(void))os_getpgid, METH_FASTCALL|METH_KEYWORDS, os_getpgid__doc__}, + {"getpgid", _PyCFunction_CAST(os_getpgid), METH_FASTCALL|METH_KEYWORDS, os_getpgid__doc__}, static PyObject * os_getpgid_impl(PyObject *module, pid_t pid); @@ -3597,7 +3597,7 @@ PyDoc_STRVAR(os_kill__doc__, "Kill a process with a signal."); #define OS_KILL_METHODDEF \ - {"kill", (PyCFunction)(void(*)(void))os_kill, METH_FASTCALL, os_kill__doc__}, + {"kill", _PyCFunction_CAST(os_kill), METH_FASTCALL, os_kill__doc__}, static PyObject * os_kill_impl(PyObject *module, pid_t pid, Py_ssize_t signal); @@ -3630,7 +3630,7 @@ PyDoc_STRVAR(os_killpg__doc__, "Kill a process group with a signal."); #define OS_KILLPG_METHODDEF \ - {"killpg", (PyCFunction)(void(*)(void))os_killpg, METH_FASTCALL, os_killpg__doc__}, + {"killpg", _PyCFunction_CAST(os_killpg), METH_FASTCALL, os_killpg__doc__}, static PyObject * os_killpg_impl(PyObject *module, pid_t pgid, int signal); @@ -3788,7 +3788,7 @@ PyDoc_STRVAR(os_setreuid__doc__, "Set the current process\'s real and effective user ids."); #define OS_SETREUID_METHODDEF \ - {"setreuid", (PyCFunction)(void(*)(void))os_setreuid, METH_FASTCALL, os_setreuid__doc__}, + {"setreuid", _PyCFunction_CAST(os_setreuid), METH_FASTCALL, os_setreuid__doc__}, static PyObject * os_setreuid_impl(PyObject *module, uid_t ruid, uid_t euid); @@ -3826,7 +3826,7 @@ PyDoc_STRVAR(os_setregid__doc__, "Set the current process\'s real and effective group ids."); #define OS_SETREGID_METHODDEF \ - {"setregid", (PyCFunction)(void(*)(void))os_setregid, METH_FASTCALL, os_setregid__doc__}, + {"setregid", _PyCFunction_CAST(os_setregid), METH_FASTCALL, os_setregid__doc__}, static PyObject * os_setregid_impl(PyObject *module, gid_t rgid, gid_t egid); @@ -3911,7 +3911,7 @@ PyDoc_STRVAR(os_wait3__doc__, " (pid, status, rusage)"); #define OS_WAIT3_METHODDEF \ - {"wait3", (PyCFunction)(void(*)(void))os_wait3, METH_FASTCALL|METH_KEYWORDS, os_wait3__doc__}, + {"wait3", _PyCFunction_CAST(os_wait3), METH_FASTCALL|METH_KEYWORDS, os_wait3__doc__}, static PyObject * os_wait3_impl(PyObject *module, int options); @@ -3953,7 +3953,7 @@ PyDoc_STRVAR(os_wait4__doc__, " (pid, status, rusage)"); #define OS_WAIT4_METHODDEF \ - {"wait4", (PyCFunction)(void(*)(void))os_wait4, METH_FASTCALL|METH_KEYWORDS, os_wait4__doc__}, + {"wait4", _PyCFunction_CAST(os_wait4), METH_FASTCALL|METH_KEYWORDS, os_wait4__doc__}, static PyObject * os_wait4_impl(PyObject *module, pid_t pid, int options); @@ -3999,7 +3999,7 @@ PyDoc_STRVAR(os_waitid__doc__, "no children in a waitable state."); #define OS_WAITID_METHODDEF \ - {"waitid", (PyCFunction)(void(*)(void))os_waitid, METH_FASTCALL, os_waitid__doc__}, + {"waitid", _PyCFunction_CAST(os_waitid), METH_FASTCALL, os_waitid__doc__}, static PyObject * os_waitid_impl(PyObject *module, idtype_t idtype, id_t id, int options); @@ -4038,7 +4038,7 @@ PyDoc_STRVAR(os_waitpid__doc__, "The options argument is ignored on Windows."); #define OS_WAITPID_METHODDEF \ - {"waitpid", (PyCFunction)(void(*)(void))os_waitpid, METH_FASTCALL, os_waitpid__doc__}, + {"waitpid", _PyCFunction_CAST(os_waitpid), METH_FASTCALL, os_waitpid__doc__}, static PyObject * os_waitpid_impl(PyObject *module, pid_t pid, int options); @@ -4076,7 +4076,7 @@ PyDoc_STRVAR(os_waitpid__doc__, "The options argument is ignored on Windows."); #define OS_WAITPID_METHODDEF \ - {"waitpid", (PyCFunction)(void(*)(void))os_waitpid, METH_FASTCALL, os_waitpid__doc__}, + {"waitpid", _PyCFunction_CAST(os_waitpid), METH_FASTCALL, os_waitpid__doc__}, static PyObject * os_waitpid_impl(PyObject *module, intptr_t pid, int options); @@ -4137,7 +4137,7 @@ PyDoc_STRVAR(os_pidfd_open__doc__, "signals."); #define OS_PIDFD_OPEN_METHODDEF \ - {"pidfd_open", (PyCFunction)(void(*)(void))os_pidfd_open, METH_FASTCALL|METH_KEYWORDS, os_pidfd_open__doc__}, + {"pidfd_open", _PyCFunction_CAST(os_pidfd_open), METH_FASTCALL|METH_KEYWORDS, os_pidfd_open__doc__}, static PyObject * os_pidfd_open_impl(PyObject *module, pid_t pid, unsigned int flags); @@ -4178,7 +4178,7 @@ PyDoc_STRVAR(os_readlink__doc__, "using it will raise a NotImplementedError."); #define OS_READLINK_METHODDEF \ - {"readlink", (PyCFunction)(void(*)(void))os_readlink, METH_FASTCALL|METH_KEYWORDS, os_readlink__doc__}, + {"readlink", _PyCFunction_CAST(os_readlink), METH_FASTCALL|METH_KEYWORDS, os_readlink__doc__}, static PyObject * os_readlink_impl(PyObject *module, path_t *path, int dir_fd); @@ -4238,7 +4238,7 @@ PyDoc_STRVAR(os_symlink__doc__, " If it is unavailable, using it will raise a NotImplementedError."); #define OS_SYMLINK_METHODDEF \ - {"symlink", (PyCFunction)(void(*)(void))os_symlink, METH_FASTCALL|METH_KEYWORDS, os_symlink__doc__}, + {"symlink", _PyCFunction_CAST(os_symlink), METH_FASTCALL|METH_KEYWORDS, os_symlink__doc__}, static PyObject * os_symlink_impl(PyObject *module, path_t *src, path_t *dst, @@ -4388,7 +4388,7 @@ PyDoc_STRVAR(os_setpgid__doc__, "Call the system call setpgid(pid, pgrp)."); #define OS_SETPGID_METHODDEF \ - {"setpgid", (PyCFunction)(void(*)(void))os_setpgid, METH_FASTCALL, os_setpgid__doc__}, + {"setpgid", _PyCFunction_CAST(os_setpgid), METH_FASTCALL, os_setpgid__doc__}, static PyObject * os_setpgid_impl(PyObject *module, pid_t pid, pid_t pgrp); @@ -4453,7 +4453,7 @@ PyDoc_STRVAR(os_tcsetpgrp__doc__, "Set the process group associated with the terminal specified by fd."); #define OS_TCSETPGRP_METHODDEF \ - {"tcsetpgrp", (PyCFunction)(void(*)(void))os_tcsetpgrp, METH_FASTCALL, os_tcsetpgrp__doc__}, + {"tcsetpgrp", _PyCFunction_CAST(os_tcsetpgrp), METH_FASTCALL, os_tcsetpgrp__doc__}, static PyObject * os_tcsetpgrp_impl(PyObject *module, int fd, pid_t pgid); @@ -4489,7 +4489,7 @@ PyDoc_STRVAR(os_open__doc__, " If it is unavailable, using it will raise a NotImplementedError."); #define OS_OPEN_METHODDEF \ - {"open", (PyCFunction)(void(*)(void))os_open, METH_FASTCALL|METH_KEYWORDS, os_open__doc__}, + {"open", _PyCFunction_CAST(os_open), METH_FASTCALL|METH_KEYWORDS, os_open__doc__}, static int os_open_impl(PyObject *module, path_t *path, int flags, int mode, int dir_fd); @@ -4559,7 +4559,7 @@ PyDoc_STRVAR(os_close__doc__, "Close a file descriptor."); #define OS_CLOSE_METHODDEF \ - {"close", (PyCFunction)(void(*)(void))os_close, METH_FASTCALL|METH_KEYWORDS, os_close__doc__}, + {"close", _PyCFunction_CAST(os_close), METH_FASTCALL|METH_KEYWORDS, os_close__doc__}, static PyObject * os_close_impl(PyObject *module, int fd); @@ -4594,7 +4594,7 @@ PyDoc_STRVAR(os_closerange__doc__, "Closes all file descriptors in [fd_low, fd_high), ignoring errors."); #define OS_CLOSERANGE_METHODDEF \ - {"closerange", (PyCFunction)(void(*)(void))os_closerange, METH_FASTCALL, os_closerange__doc__}, + {"closerange", _PyCFunction_CAST(os_closerange), METH_FASTCALL, os_closerange__doc__}, static PyObject * os_closerange_impl(PyObject *module, int fd_low, int fd_high); @@ -4663,7 +4663,7 @@ PyDoc_STRVAR(os_dup2__doc__, "Duplicate file descriptor."); #define OS_DUP2_METHODDEF \ - {"dup2", (PyCFunction)(void(*)(void))os_dup2, METH_FASTCALL|METH_KEYWORDS, os_dup2__doc__}, + {"dup2", _PyCFunction_CAST(os_dup2), METH_FASTCALL|METH_KEYWORDS, os_dup2__doc__}, static int os_dup2_impl(PyObject *module, int fd, int fd2, int inheritable); @@ -4727,7 +4727,7 @@ PyDoc_STRVAR(os_lockf__doc__, " The number of bytes to lock, starting at the current position."); #define OS_LOCKF_METHODDEF \ - {"lockf", (PyCFunction)(void(*)(void))os_lockf, METH_FASTCALL, os_lockf__doc__}, + {"lockf", _PyCFunction_CAST(os_lockf), METH_FASTCALL, os_lockf__doc__}, static PyObject * os_lockf_impl(PyObject *module, int fd, int command, Py_off_t length); @@ -4772,7 +4772,7 @@ PyDoc_STRVAR(os_lseek__doc__, "relative to the beginning of the file."); #define OS_LSEEK_METHODDEF \ - {"lseek", (PyCFunction)(void(*)(void))os_lseek, METH_FASTCALL, os_lseek__doc__}, + {"lseek", _PyCFunction_CAST(os_lseek), METH_FASTCALL, os_lseek__doc__}, static Py_off_t os_lseek_impl(PyObject *module, int fd, Py_off_t position, int how); @@ -4817,7 +4817,7 @@ PyDoc_STRVAR(os_read__doc__, "Read from a file descriptor. Returns a bytes object."); #define OS_READ_METHODDEF \ - {"read", (PyCFunction)(void(*)(void))os_read, METH_FASTCALL, os_read__doc__}, + {"read", _PyCFunction_CAST(os_read), METH_FASTCALL, os_read__doc__}, static PyObject * os_read_impl(PyObject *module, int fd, Py_ssize_t length); @@ -4871,7 +4871,7 @@ PyDoc_STRVAR(os_readv__doc__, "which may be less than the total capacity of all the buffers."); #define OS_READV_METHODDEF \ - {"readv", (PyCFunction)(void(*)(void))os_readv, METH_FASTCALL, os_readv__doc__}, + {"readv", _PyCFunction_CAST(os_readv), METH_FASTCALL, os_readv__doc__}, static Py_ssize_t os_readv_impl(PyObject *module, int fd, PyObject *buffers); @@ -4916,7 +4916,7 @@ PyDoc_STRVAR(os_pread__doc__, "the beginning of the file. The file offset remains unchanged."); #define OS_PREAD_METHODDEF \ - {"pread", (PyCFunction)(void(*)(void))os_pread, METH_FASTCALL, os_pread__doc__}, + {"pread", _PyCFunction_CAST(os_pread), METH_FASTCALL, os_pread__doc__}, static PyObject * os_pread_impl(PyObject *module, int fd, Py_ssize_t length, Py_off_t offset); @@ -4982,7 +4982,7 @@ PyDoc_STRVAR(os_preadv__doc__, "Using non-zero flags requires Linux 4.6 or newer."); #define OS_PREADV_METHODDEF \ - {"preadv", (PyCFunction)(void(*)(void))os_preadv, METH_FASTCALL, os_preadv__doc__}, + {"preadv", _PyCFunction_CAST(os_preadv), METH_FASTCALL, os_preadv__doc__}, static Py_ssize_t os_preadv_impl(PyObject *module, int fd, PyObject *buffers, Py_off_t offset, @@ -5036,7 +5036,7 @@ PyDoc_STRVAR(os_write__doc__, "Write a bytes object to a file descriptor."); #define OS_WRITE_METHODDEF \ - {"write", (PyCFunction)(void(*)(void))os_write, METH_FASTCALL, os_write__doc__}, + {"write", _PyCFunction_CAST(os_write), METH_FASTCALL, os_write__doc__}, static Py_ssize_t os_write_impl(PyObject *module, int fd, Py_buffer *data); @@ -5088,7 +5088,7 @@ PyDoc_STRVAR(os_sendfile__doc__, "Copy count bytes from file descriptor in_fd to file descriptor out_fd."); #define OS_SENDFILE_METHODDEF \ - {"sendfile", (PyCFunction)(void(*)(void))os_sendfile, METH_FASTCALL|METH_KEYWORDS, os_sendfile__doc__}, + {"sendfile", _PyCFunction_CAST(os_sendfile), METH_FASTCALL|METH_KEYWORDS, os_sendfile__doc__}, static PyObject * os_sendfile_impl(PyObject *module, int out_fd, int in_fd, Py_off_t offset, @@ -5167,7 +5167,7 @@ PyDoc_STRVAR(os_sendfile__doc__, "Copy count bytes from file descriptor in_fd to file descriptor out_fd."); #define OS_SENDFILE_METHODDEF \ - {"sendfile", (PyCFunction)(void(*)(void))os_sendfile, METH_FASTCALL|METH_KEYWORDS, os_sendfile__doc__}, + {"sendfile", _PyCFunction_CAST(os_sendfile), METH_FASTCALL|METH_KEYWORDS, os_sendfile__doc__}, static PyObject * os_sendfile_impl(PyObject *module, int out_fd, int in_fd, Py_off_t offset, @@ -5254,7 +5254,7 @@ PyDoc_STRVAR(os_sendfile__doc__, "Copy count bytes from file descriptor in_fd to file descriptor out_fd."); #define OS_SENDFILE_METHODDEF \ - {"sendfile", (PyCFunction)(void(*)(void))os_sendfile, METH_FASTCALL|METH_KEYWORDS, os_sendfile__doc__}, + {"sendfile", _PyCFunction_CAST(os_sendfile), METH_FASTCALL|METH_KEYWORDS, os_sendfile__doc__}, static PyObject * os_sendfile_impl(PyObject *module, int out_fd, int in_fd, PyObject *offobj, @@ -5314,7 +5314,7 @@ PyDoc_STRVAR(os__fcopyfile__doc__, "Efficiently copy content or metadata of 2 regular file descriptors (macOS)."); #define OS__FCOPYFILE_METHODDEF \ - {"_fcopyfile", (PyCFunction)(void(*)(void))os__fcopyfile, METH_FASTCALL, os__fcopyfile__doc__}, + {"_fcopyfile", _PyCFunction_CAST(os__fcopyfile), METH_FASTCALL, os__fcopyfile__doc__}, static PyObject * os__fcopyfile_impl(PyObject *module, int in_fd, int out_fd, int flags); @@ -5360,7 +5360,7 @@ PyDoc_STRVAR(os_fstat__doc__, "Equivalent to os.stat(fd)."); #define OS_FSTAT_METHODDEF \ - {"fstat", (PyCFunction)(void(*)(void))os_fstat, METH_FASTCALL|METH_KEYWORDS, os_fstat__doc__}, + {"fstat", _PyCFunction_CAST(os_fstat), METH_FASTCALL|METH_KEYWORDS, os_fstat__doc__}, static PyObject * os_fstat_impl(PyObject *module, int fd); @@ -5499,7 +5499,7 @@ PyDoc_STRVAR(os_writev__doc__, "buffers must be a sequence of bytes-like objects."); #define OS_WRITEV_METHODDEF \ - {"writev", (PyCFunction)(void(*)(void))os_writev, METH_FASTCALL, os_writev__doc__}, + {"writev", _PyCFunction_CAST(os_writev), METH_FASTCALL, os_writev__doc__}, static Py_ssize_t os_writev_impl(PyObject *module, int fd, PyObject *buffers); @@ -5545,7 +5545,7 @@ PyDoc_STRVAR(os_pwrite__doc__, "current file offset."); #define OS_PWRITE_METHODDEF \ - {"pwrite", (PyCFunction)(void(*)(void))os_pwrite, METH_FASTCALL, os_pwrite__doc__}, + {"pwrite", _PyCFunction_CAST(os_pwrite), METH_FASTCALL, os_pwrite__doc__}, static Py_ssize_t os_pwrite_impl(PyObject *module, int fd, Py_buffer *buffer, Py_off_t offset); @@ -5617,7 +5617,7 @@ PyDoc_STRVAR(os_pwritev__doc__, "Using non-zero flags requires Linux 4.7 or newer."); #define OS_PWRITEV_METHODDEF \ - {"pwritev", (PyCFunction)(void(*)(void))os_pwritev, METH_FASTCALL, os_pwritev__doc__}, + {"pwritev", _PyCFunction_CAST(os_pwritev), METH_FASTCALL, os_pwritev__doc__}, static Py_ssize_t os_pwritev_impl(PyObject *module, int fd, PyObject *buffers, Py_off_t offset, @@ -5688,7 +5688,7 @@ PyDoc_STRVAR(os_copy_file_range__doc__, "respectively for offset_dst."); #define OS_COPY_FILE_RANGE_METHODDEF \ - {"copy_file_range", (PyCFunction)(void(*)(void))os_copy_file_range, METH_FASTCALL|METH_KEYWORDS, os_copy_file_range__doc__}, + {"copy_file_range", _PyCFunction_CAST(os_copy_file_range), METH_FASTCALL|METH_KEYWORDS, os_copy_file_range__doc__}, static PyObject * os_copy_file_range_impl(PyObject *module, int src, int dst, Py_ssize_t count, @@ -5778,7 +5778,7 @@ PyDoc_STRVAR(os_splice__doc__, "descriptor that refers to a pipe must be None."); #define OS_SPLICE_METHODDEF \ - {"splice", (PyCFunction)(void(*)(void))os_splice, METH_FASTCALL|METH_KEYWORDS, os_splice__doc__}, + {"splice", _PyCFunction_CAST(os_splice), METH_FASTCALL|METH_KEYWORDS, os_splice__doc__}, static PyObject * os_splice_impl(PyObject *module, int src, int dst, Py_ssize_t count, @@ -5865,7 +5865,7 @@ PyDoc_STRVAR(os_mkfifo__doc__, " If it is unavailable, using it will raise a NotImplementedError."); #define OS_MKFIFO_METHODDEF \ - {"mkfifo", (PyCFunction)(void(*)(void))os_mkfifo, METH_FASTCALL|METH_KEYWORDS, os_mkfifo__doc__}, + {"mkfifo", _PyCFunction_CAST(os_mkfifo), METH_FASTCALL|METH_KEYWORDS, os_mkfifo__doc__}, static PyObject * os_mkfifo_impl(PyObject *module, path_t *path, int mode, int dir_fd); @@ -5941,7 +5941,7 @@ PyDoc_STRVAR(os_mknod__doc__, " If it is unavailable, using it will raise a NotImplementedError."); #define OS_MKNOD_METHODDEF \ - {"mknod", (PyCFunction)(void(*)(void))os_mknod, METH_FASTCALL|METH_KEYWORDS, os_mknod__doc__}, + {"mknod", _PyCFunction_CAST(os_mknod), METH_FASTCALL|METH_KEYWORDS, os_mknod__doc__}, static PyObject * os_mknod_impl(PyObject *module, path_t *path, int mode, dev_t device, @@ -6087,7 +6087,7 @@ PyDoc_STRVAR(os_makedev__doc__, "Composes a raw device number from the major and minor device numbers."); #define OS_MAKEDEV_METHODDEF \ - {"makedev", (PyCFunction)(void(*)(void))os_makedev, METH_FASTCALL, os_makedev__doc__}, + {"makedev", _PyCFunction_CAST(os_makedev), METH_FASTCALL, os_makedev__doc__}, static dev_t os_makedev_impl(PyObject *module, int major, int minor); @@ -6132,7 +6132,7 @@ PyDoc_STRVAR(os_ftruncate__doc__, "Truncate a file, specified by file descriptor, to a specific length."); #define OS_FTRUNCATE_METHODDEF \ - {"ftruncate", (PyCFunction)(void(*)(void))os_ftruncate, METH_FASTCALL, os_ftruncate__doc__}, + {"ftruncate", _PyCFunction_CAST(os_ftruncate), METH_FASTCALL, os_ftruncate__doc__}, static PyObject * os_ftruncate_impl(PyObject *module, int fd, Py_off_t length); @@ -6174,7 +6174,7 @@ PyDoc_STRVAR(os_truncate__doc__, " If this functionality is unavailable, using it raises an exception."); #define OS_TRUNCATE_METHODDEF \ - {"truncate", (PyCFunction)(void(*)(void))os_truncate, METH_FASTCALL|METH_KEYWORDS, os_truncate__doc__}, + {"truncate", _PyCFunction_CAST(os_truncate), METH_FASTCALL|METH_KEYWORDS, os_truncate__doc__}, static PyObject * os_truncate_impl(PyObject *module, path_t *path, Py_off_t length); @@ -6222,7 +6222,7 @@ PyDoc_STRVAR(os_posix_fallocate__doc__, "starting at offset bytes from the beginning and continuing for length bytes."); #define OS_POSIX_FALLOCATE_METHODDEF \ - {"posix_fallocate", (PyCFunction)(void(*)(void))os_posix_fallocate, METH_FASTCALL, os_posix_fallocate__doc__}, + {"posix_fallocate", _PyCFunction_CAST(os_posix_fallocate), METH_FASTCALL, os_posix_fallocate__doc__}, static PyObject * os_posix_fallocate_impl(PyObject *module, int fd, Py_off_t offset, @@ -6274,7 +6274,7 @@ PyDoc_STRVAR(os_posix_fadvise__doc__, "POSIX_FADV_DONTNEED."); #define OS_POSIX_FADVISE_METHODDEF \ - {"posix_fadvise", (PyCFunction)(void(*)(void))os_posix_fadvise, METH_FASTCALL, os_posix_fadvise__doc__}, + {"posix_fadvise", _PyCFunction_CAST(os_posix_fadvise), METH_FASTCALL, os_posix_fadvise__doc__}, static PyObject * os_posix_fadvise_impl(PyObject *module, int fd, Py_off_t offset, @@ -6323,7 +6323,7 @@ PyDoc_STRVAR(os_putenv__doc__, "Change or add an environment variable."); #define OS_PUTENV_METHODDEF \ - {"putenv", (PyCFunction)(void(*)(void))os_putenv, METH_FASTCALL, os_putenv__doc__}, + {"putenv", _PyCFunction_CAST(os_putenv), METH_FASTCALL, os_putenv__doc__}, static PyObject * os_putenv_impl(PyObject *module, PyObject *name, PyObject *value); @@ -6371,7 +6371,7 @@ PyDoc_STRVAR(os_putenv__doc__, "Change or add an environment variable."); #define OS_PUTENV_METHODDEF \ - {"putenv", (PyCFunction)(void(*)(void))os_putenv, METH_FASTCALL, os_putenv__doc__}, + {"putenv", _PyCFunction_CAST(os_putenv), METH_FASTCALL, os_putenv__doc__}, static PyObject * os_putenv_impl(PyObject *module, PyObject *name, PyObject *value); @@ -6552,7 +6552,7 @@ PyDoc_STRVAR(os_WIFCONTINUED__doc__, "job control stop."); #define OS_WIFCONTINUED_METHODDEF \ - {"WIFCONTINUED", (PyCFunction)(void(*)(void))os_WIFCONTINUED, METH_FASTCALL|METH_KEYWORDS, os_WIFCONTINUED__doc__}, + {"WIFCONTINUED", _PyCFunction_CAST(os_WIFCONTINUED), METH_FASTCALL|METH_KEYWORDS, os_WIFCONTINUED__doc__}, static int os_WIFCONTINUED_impl(PyObject *module, int status); @@ -6596,7 +6596,7 @@ PyDoc_STRVAR(os_WIFSTOPPED__doc__, "Return True if the process returning status was stopped."); #define OS_WIFSTOPPED_METHODDEF \ - {"WIFSTOPPED", (PyCFunction)(void(*)(void))os_WIFSTOPPED, METH_FASTCALL|METH_KEYWORDS, os_WIFSTOPPED__doc__}, + {"WIFSTOPPED", _PyCFunction_CAST(os_WIFSTOPPED), METH_FASTCALL|METH_KEYWORDS, os_WIFSTOPPED__doc__}, static int os_WIFSTOPPED_impl(PyObject *module, int status); @@ -6640,7 +6640,7 @@ PyDoc_STRVAR(os_WIFSIGNALED__doc__, "Return True if the process returning status was terminated by a signal."); #define OS_WIFSIGNALED_METHODDEF \ - {"WIFSIGNALED", (PyCFunction)(void(*)(void))os_WIFSIGNALED, METH_FASTCALL|METH_KEYWORDS, os_WIFSIGNALED__doc__}, + {"WIFSIGNALED", _PyCFunction_CAST(os_WIFSIGNALED), METH_FASTCALL|METH_KEYWORDS, os_WIFSIGNALED__doc__}, static int os_WIFSIGNALED_impl(PyObject *module, int status); @@ -6684,7 +6684,7 @@ PyDoc_STRVAR(os_WIFEXITED__doc__, "Return True if the process returning status exited via the exit() system call."); #define OS_WIFEXITED_METHODDEF \ - {"WIFEXITED", (PyCFunction)(void(*)(void))os_WIFEXITED, METH_FASTCALL|METH_KEYWORDS, os_WIFEXITED__doc__}, + {"WIFEXITED", _PyCFunction_CAST(os_WIFEXITED), METH_FASTCALL|METH_KEYWORDS, os_WIFEXITED__doc__}, static int os_WIFEXITED_impl(PyObject *module, int status); @@ -6728,7 +6728,7 @@ PyDoc_STRVAR(os_WEXITSTATUS__doc__, "Return the process return code from status."); #define OS_WEXITSTATUS_METHODDEF \ - {"WEXITSTATUS", (PyCFunction)(void(*)(void))os_WEXITSTATUS, METH_FASTCALL|METH_KEYWORDS, os_WEXITSTATUS__doc__}, + {"WEXITSTATUS", _PyCFunction_CAST(os_WEXITSTATUS), METH_FASTCALL|METH_KEYWORDS, os_WEXITSTATUS__doc__}, static int os_WEXITSTATUS_impl(PyObject *module, int status); @@ -6772,7 +6772,7 @@ PyDoc_STRVAR(os_WTERMSIG__doc__, "Return the signal that terminated the process that provided the status value."); #define OS_WTERMSIG_METHODDEF \ - {"WTERMSIG", (PyCFunction)(void(*)(void))os_WTERMSIG, METH_FASTCALL|METH_KEYWORDS, os_WTERMSIG__doc__}, + {"WTERMSIG", _PyCFunction_CAST(os_WTERMSIG), METH_FASTCALL|METH_KEYWORDS, os_WTERMSIG__doc__}, static int os_WTERMSIG_impl(PyObject *module, int status); @@ -6816,7 +6816,7 @@ PyDoc_STRVAR(os_WSTOPSIG__doc__, "Return the signal that stopped the process that provided the status value."); #define OS_WSTOPSIG_METHODDEF \ - {"WSTOPSIG", (PyCFunction)(void(*)(void))os_WSTOPSIG, METH_FASTCALL|METH_KEYWORDS, os_WSTOPSIG__doc__}, + {"WSTOPSIG", _PyCFunction_CAST(os_WSTOPSIG), METH_FASTCALL|METH_KEYWORDS, os_WSTOPSIG__doc__}, static int os_WSTOPSIG_impl(PyObject *module, int status); @@ -6898,7 +6898,7 @@ PyDoc_STRVAR(os_statvfs__doc__, " If this functionality is unavailable, using it raises an exception."); #define OS_STATVFS_METHODDEF \ - {"statvfs", (PyCFunction)(void(*)(void))os_statvfs, METH_FASTCALL|METH_KEYWORDS, os_statvfs__doc__}, + {"statvfs", _PyCFunction_CAST(os_statvfs), METH_FASTCALL|METH_KEYWORDS, os_statvfs__doc__}, static PyObject * os_statvfs_impl(PyObject *module, path_t *path); @@ -6939,7 +6939,7 @@ PyDoc_STRVAR(os__getdiskusage__doc__, "Return disk usage statistics about the given path as a (total, free) tuple."); #define OS__GETDISKUSAGE_METHODDEF \ - {"_getdiskusage", (PyCFunction)(void(*)(void))os__getdiskusage, METH_FASTCALL|METH_KEYWORDS, os__getdiskusage__doc__}, + {"_getdiskusage", _PyCFunction_CAST(os__getdiskusage), METH_FASTCALL|METH_KEYWORDS, os__getdiskusage__doc__}, static PyObject * os__getdiskusage_impl(PyObject *module, path_t *path); @@ -6982,7 +6982,7 @@ PyDoc_STRVAR(os_fpathconf__doc__, "If there is no limit, return -1."); #define OS_FPATHCONF_METHODDEF \ - {"fpathconf", (PyCFunction)(void(*)(void))os_fpathconf, METH_FASTCALL, os_fpathconf__doc__}, + {"fpathconf", _PyCFunction_CAST(os_fpathconf), METH_FASTCALL, os_fpathconf__doc__}, static long os_fpathconf_impl(PyObject *module, int fd, int name); @@ -7029,7 +7029,7 @@ PyDoc_STRVAR(os_pathconf__doc__, " If this functionality is unavailable, using it raises an exception."); #define OS_PATHCONF_METHODDEF \ - {"pathconf", (PyCFunction)(void(*)(void))os_pathconf, METH_FASTCALL|METH_KEYWORDS, os_pathconf__doc__}, + {"pathconf", _PyCFunction_CAST(os_pathconf), METH_FASTCALL|METH_KEYWORDS, os_pathconf__doc__}, static long os_pathconf_impl(PyObject *module, path_t *path, int name); @@ -7193,7 +7193,7 @@ PyDoc_STRVAR(os_startfile__doc__, "the underlying Win32 ShellExecute function doesn\'t work if it is."); #define OS_STARTFILE_METHODDEF \ - {"startfile", (PyCFunction)(void(*)(void))os_startfile, METH_FASTCALL|METH_KEYWORDS, os_startfile__doc__}, + {"startfile", _PyCFunction_CAST(os_startfile), METH_FASTCALL|METH_KEYWORDS, os_startfile__doc__}, static PyObject * os_startfile_impl(PyObject *module, path_t *filepath, @@ -7328,7 +7328,7 @@ PyDoc_STRVAR(os_device_encoding__doc__, "If the device is not a terminal, return None."); #define OS_DEVICE_ENCODING_METHODDEF \ - {"device_encoding", (PyCFunction)(void(*)(void))os_device_encoding, METH_FASTCALL|METH_KEYWORDS, os_device_encoding__doc__}, + {"device_encoding", _PyCFunction_CAST(os_device_encoding), METH_FASTCALL|METH_KEYWORDS, os_device_encoding__doc__}, static PyObject * os_device_encoding_impl(PyObject *module, int fd); @@ -7365,7 +7365,7 @@ PyDoc_STRVAR(os_setresuid__doc__, "Set the current process\'s real, effective, and saved user ids."); #define OS_SETRESUID_METHODDEF \ - {"setresuid", (PyCFunction)(void(*)(void))os_setresuid, METH_FASTCALL, os_setresuid__doc__}, + {"setresuid", _PyCFunction_CAST(os_setresuid), METH_FASTCALL, os_setresuid__doc__}, static PyObject * os_setresuid_impl(PyObject *module, uid_t ruid, uid_t euid, uid_t suid); @@ -7407,7 +7407,7 @@ PyDoc_STRVAR(os_setresgid__doc__, "Set the current process\'s real, effective, and saved group ids."); #define OS_SETRESGID_METHODDEF \ - {"setresgid", (PyCFunction)(void(*)(void))os_setresgid, METH_FASTCALL, os_setresgid__doc__}, + {"setresgid", _PyCFunction_CAST(os_setresgid), METH_FASTCALL, os_setresgid__doc__}, static PyObject * os_setresgid_impl(PyObject *module, gid_t rgid, gid_t egid, gid_t sgid); @@ -7498,7 +7498,7 @@ PyDoc_STRVAR(os_getxattr__doc__, " the link points to."); #define OS_GETXATTR_METHODDEF \ - {"getxattr", (PyCFunction)(void(*)(void))os_getxattr, METH_FASTCALL|METH_KEYWORDS, os_getxattr__doc__}, + {"getxattr", _PyCFunction_CAST(os_getxattr), METH_FASTCALL|METH_KEYWORDS, os_getxattr__doc__}, static PyObject * os_getxattr_impl(PyObject *module, path_t *path, path_t *attribute, @@ -7562,7 +7562,7 @@ PyDoc_STRVAR(os_setxattr__doc__, " the link points to."); #define OS_SETXATTR_METHODDEF \ - {"setxattr", (PyCFunction)(void(*)(void))os_setxattr, METH_FASTCALL|METH_KEYWORDS, os_setxattr__doc__}, + {"setxattr", _PyCFunction_CAST(os_setxattr), METH_FASTCALL|METH_KEYWORDS, os_setxattr__doc__}, static PyObject * os_setxattr_impl(PyObject *module, path_t *path, path_t *attribute, @@ -7651,7 +7651,7 @@ PyDoc_STRVAR(os_removexattr__doc__, " the link points to."); #define OS_REMOVEXATTR_METHODDEF \ - {"removexattr", (PyCFunction)(void(*)(void))os_removexattr, METH_FASTCALL|METH_KEYWORDS, os_removexattr__doc__}, + {"removexattr", _PyCFunction_CAST(os_removexattr), METH_FASTCALL|METH_KEYWORDS, os_removexattr__doc__}, static PyObject * os_removexattr_impl(PyObject *module, path_t *path, path_t *attribute, @@ -7715,7 +7715,7 @@ PyDoc_STRVAR(os_listxattr__doc__, " the link points to."); #define OS_LISTXATTR_METHODDEF \ - {"listxattr", (PyCFunction)(void(*)(void))os_listxattr, METH_FASTCALL|METH_KEYWORDS, os_listxattr__doc__}, + {"listxattr", _PyCFunction_CAST(os_listxattr), METH_FASTCALL|METH_KEYWORDS, os_listxattr__doc__}, static PyObject * os_listxattr_impl(PyObject *module, path_t *path, int follow_symlinks); @@ -7810,7 +7810,7 @@ PyDoc_STRVAR(os_memfd_create__doc__, "\n"); #define OS_MEMFD_CREATE_METHODDEF \ - {"memfd_create", (PyCFunction)(void(*)(void))os_memfd_create, METH_FASTCALL|METH_KEYWORDS, os_memfd_create__doc__}, + {"memfd_create", _PyCFunction_CAST(os_memfd_create), METH_FASTCALL|METH_KEYWORDS, os_memfd_create__doc__}, static PyObject * os_memfd_create_impl(PyObject *module, PyObject *name, unsigned int flags); @@ -7861,7 +7861,7 @@ PyDoc_STRVAR(os_eventfd__doc__, "Creates and returns an event notification file descriptor."); #define OS_EVENTFD_METHODDEF \ - {"eventfd", (PyCFunction)(void(*)(void))os_eventfd, METH_FASTCALL|METH_KEYWORDS, os_eventfd__doc__}, + {"eventfd", _PyCFunction_CAST(os_eventfd), METH_FASTCALL|METH_KEYWORDS, os_eventfd__doc__}, static PyObject * os_eventfd_impl(PyObject *module, unsigned int initval, int flags); @@ -7909,7 +7909,7 @@ PyDoc_STRVAR(os_eventfd_read__doc__, "Read eventfd value"); #define OS_EVENTFD_READ_METHODDEF \ - {"eventfd_read", (PyCFunction)(void(*)(void))os_eventfd_read, METH_FASTCALL|METH_KEYWORDS, os_eventfd_read__doc__}, + {"eventfd_read", _PyCFunction_CAST(os_eventfd_read), METH_FASTCALL|METH_KEYWORDS, os_eventfd_read__doc__}, static PyObject * os_eventfd_read_impl(PyObject *module, int fd); @@ -7947,7 +7947,7 @@ PyDoc_STRVAR(os_eventfd_write__doc__, "Write eventfd value."); #define OS_EVENTFD_WRITE_METHODDEF \ - {"eventfd_write", (PyCFunction)(void(*)(void))os_eventfd_write, METH_FASTCALL|METH_KEYWORDS, os_eventfd_write__doc__}, + {"eventfd_write", _PyCFunction_CAST(os_eventfd_write), METH_FASTCALL|METH_KEYWORDS, os_eventfd_write__doc__}, static PyObject * os_eventfd_write_impl(PyObject *module, int fd, unsigned long long value); @@ -8001,7 +8001,7 @@ PyDoc_STRVAR(os_get_terminal_size__doc__, "normally be used, os.get_terminal_size is the low-level implementation."); #define OS_GET_TERMINAL_SIZE_METHODDEF \ - {"get_terminal_size", (PyCFunction)(void(*)(void))os_get_terminal_size, METH_FASTCALL, os_get_terminal_size__doc__}, + {"get_terminal_size", _PyCFunction_CAST(os_get_terminal_size), METH_FASTCALL, os_get_terminal_size__doc__}, static PyObject * os_get_terminal_size_impl(PyObject *module, int fd); @@ -8093,7 +8093,7 @@ PyDoc_STRVAR(os_set_inheritable__doc__, "Set the inheritable flag of the specified file descriptor."); #define OS_SET_INHERITABLE_METHODDEF \ - {"set_inheritable", (PyCFunction)(void(*)(void))os_set_inheritable, METH_FASTCALL, os_set_inheritable__doc__}, + {"set_inheritable", _PyCFunction_CAST(os_set_inheritable), METH_FASTCALL, os_set_inheritable__doc__}, static PyObject * os_set_inheritable_impl(PyObject *module, int fd, int inheritable); @@ -8167,7 +8167,7 @@ PyDoc_STRVAR(os_set_handle_inheritable__doc__, "Set the inheritable flag of the specified handle."); #define OS_SET_HANDLE_INHERITABLE_METHODDEF \ - {"set_handle_inheritable", (PyCFunction)(void(*)(void))os_set_handle_inheritable, METH_FASTCALL, os_set_handle_inheritable__doc__}, + {"set_handle_inheritable", _PyCFunction_CAST(os_set_handle_inheritable), METH_FASTCALL, os_set_handle_inheritable__doc__}, static PyObject * os_set_handle_inheritable_impl(PyObject *module, intptr_t handle, @@ -8243,7 +8243,7 @@ PyDoc_STRVAR(os_set_blocking__doc__, "clear the O_NONBLOCK flag otherwise."); #define OS_SET_BLOCKING_METHODDEF \ - {"set_blocking", (PyCFunction)(void(*)(void))os_set_blocking, METH_FASTCALL, os_set_blocking__doc__}, + {"set_blocking", _PyCFunction_CAST(os_set_blocking), METH_FASTCALL, os_set_blocking__doc__}, static PyObject * os_set_blocking_impl(PyObject *module, int fd, int blocking); @@ -8281,7 +8281,7 @@ PyDoc_STRVAR(os_DirEntry_is_symlink__doc__, "Return True if the entry is a symbolic link; cached per entry."); #define OS_DIRENTRY_IS_SYMLINK_METHODDEF \ - {"is_symlink", (PyCFunction)(void(*)(void))os_DirEntry_is_symlink, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, os_DirEntry_is_symlink__doc__}, + {"is_symlink", _PyCFunction_CAST(os_DirEntry_is_symlink), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, os_DirEntry_is_symlink__doc__}, static int os_DirEntry_is_symlink_impl(DirEntry *self, PyTypeObject *defining_class); @@ -8313,7 +8313,7 @@ PyDoc_STRVAR(os_DirEntry_stat__doc__, "Return stat_result object for the entry; cached per entry."); #define OS_DIRENTRY_STAT_METHODDEF \ - {"stat", (PyCFunction)(void(*)(void))os_DirEntry_stat, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, os_DirEntry_stat__doc__}, + {"stat", _PyCFunction_CAST(os_DirEntry_stat), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, os_DirEntry_stat__doc__}, static PyObject * os_DirEntry_stat_impl(DirEntry *self, PyTypeObject *defining_class, @@ -8354,7 +8354,7 @@ PyDoc_STRVAR(os_DirEntry_is_dir__doc__, "Return True if the entry is a directory; cached per entry."); #define OS_DIRENTRY_IS_DIR_METHODDEF \ - {"is_dir", (PyCFunction)(void(*)(void))os_DirEntry_is_dir, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, os_DirEntry_is_dir__doc__}, + {"is_dir", _PyCFunction_CAST(os_DirEntry_is_dir), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, os_DirEntry_is_dir__doc__}, static int os_DirEntry_is_dir_impl(DirEntry *self, PyTypeObject *defining_class, @@ -8400,7 +8400,7 @@ PyDoc_STRVAR(os_DirEntry_is_file__doc__, "Return True if the entry is a file; cached per entry."); #define OS_DIRENTRY_IS_FILE_METHODDEF \ - {"is_file", (PyCFunction)(void(*)(void))os_DirEntry_is_file, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, os_DirEntry_is_file__doc__}, + {"is_file", _PyCFunction_CAST(os_DirEntry_is_file), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, os_DirEntry_is_file__doc__}, static int os_DirEntry_is_file_impl(DirEntry *self, PyTypeObject *defining_class, @@ -8488,7 +8488,7 @@ PyDoc_STRVAR(os_scandir__doc__, "If path is None, uses the path=\'.\'."); #define OS_SCANDIR_METHODDEF \ - {"scandir", (PyCFunction)(void(*)(void))os_scandir, METH_FASTCALL|METH_KEYWORDS, os_scandir__doc__}, + {"scandir", _PyCFunction_CAST(os_scandir), METH_FASTCALL|METH_KEYWORDS, os_scandir__doc__}, static PyObject * os_scandir_impl(PyObject *module, path_t *path); @@ -8534,7 +8534,7 @@ PyDoc_STRVAR(os_fspath__doc__, "types raise a TypeError."); #define OS_FSPATH_METHODDEF \ - {"fspath", (PyCFunction)(void(*)(void))os_fspath, METH_FASTCALL|METH_KEYWORDS, os_fspath__doc__}, + {"fspath", _PyCFunction_CAST(os_fspath), METH_FASTCALL|METH_KEYWORDS, os_fspath__doc__}, static PyObject * os_fspath_impl(PyObject *module, PyObject *path); @@ -8568,7 +8568,7 @@ PyDoc_STRVAR(os_getrandom__doc__, "Obtain a series of random bytes."); #define OS_GETRANDOM_METHODDEF \ - {"getrandom", (PyCFunction)(void(*)(void))os_getrandom, METH_FASTCALL|METH_KEYWORDS, os_getrandom__doc__}, + {"getrandom", _PyCFunction_CAST(os_getrandom), METH_FASTCALL|METH_KEYWORDS, os_getrandom__doc__}, static PyObject * os_getrandom_impl(PyObject *module, Py_ssize_t size, int flags); @@ -8632,7 +8632,7 @@ PyDoc_STRVAR(os__add_dll_directory__doc__, "to remove this directory from the search path."); #define OS__ADD_DLL_DIRECTORY_METHODDEF \ - {"_add_dll_directory", (PyCFunction)(void(*)(void))os__add_dll_directory, METH_FASTCALL|METH_KEYWORDS, os__add_dll_directory__doc__}, + {"_add_dll_directory", _PyCFunction_CAST(os__add_dll_directory), METH_FASTCALL|METH_KEYWORDS, os__add_dll_directory__doc__}, static PyObject * os__add_dll_directory_impl(PyObject *module, path_t *path); @@ -8677,7 +8677,7 @@ PyDoc_STRVAR(os__remove_dll_directory__doc__, "yourself."); #define OS__REMOVE_DLL_DIRECTORY_METHODDEF \ - {"_remove_dll_directory", (PyCFunction)(void(*)(void))os__remove_dll_directory, METH_FASTCALL|METH_KEYWORDS, os__remove_dll_directory__doc__}, + {"_remove_dll_directory", _PyCFunction_CAST(os__remove_dll_directory), METH_FASTCALL|METH_KEYWORDS, os__remove_dll_directory__doc__}, static PyObject * os__remove_dll_directory_impl(PyObject *module, PyObject *cookie); @@ -8725,7 +8725,7 @@ PyDoc_STRVAR(os_waitstatus_to_exitcode__doc__, "This function must not be called if WIFSTOPPED(status) is true."); #define OS_WAITSTATUS_TO_EXITCODE_METHODDEF \ - {"waitstatus_to_exitcode", (PyCFunction)(void(*)(void))os_waitstatus_to_exitcode, METH_FASTCALL|METH_KEYWORDS, os_waitstatus_to_exitcode__doc__}, + {"waitstatus_to_exitcode", _PyCFunction_CAST(os_waitstatus_to_exitcode), METH_FASTCALL|METH_KEYWORDS, os_waitstatus_to_exitcode__doc__}, static PyObject * os_waitstatus_to_exitcode_impl(PyObject *module, PyObject *status_obj); @@ -9331,4 +9331,4 @@ os_waitstatus_to_exitcode(PyObject *module, PyObject *const *args, Py_ssize_t na #ifndef OS_WAITSTATUS_TO_EXITCODE_METHODDEF #define OS_WAITSTATUS_TO_EXITCODE_METHODDEF #endif /* !defined(OS_WAITSTATUS_TO_EXITCODE_METHODDEF) */ -/*[clinic end generated code: output=c8c5b148b96068b4 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=3b5a56add047ee1d input=a9049054013a1b77]*/ diff --git a/Modules/clinic/pyexpat.c.h b/Modules/clinic/pyexpat.c.h index bee2ee66950a5..b2648320aad78 100644 --- a/Modules/clinic/pyexpat.c.h +++ b/Modules/clinic/pyexpat.c.h @@ -11,7 +11,7 @@ PyDoc_STRVAR(pyexpat_xmlparser_Parse__doc__, "`isfinal\' should be true at end of input."); #define PYEXPAT_XMLPARSER_PARSE_METHODDEF \ - {"Parse", (PyCFunction)(void(*)(void))pyexpat_xmlparser_Parse, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, pyexpat_xmlparser_Parse__doc__}, + {"Parse", _PyCFunction_CAST(pyexpat_xmlparser_Parse), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, pyexpat_xmlparser_Parse__doc__}, static PyObject * pyexpat_xmlparser_Parse_impl(xmlparseobject *self, PyTypeObject *cls, @@ -53,7 +53,7 @@ PyDoc_STRVAR(pyexpat_xmlparser_ParseFile__doc__, "Parse XML data from file-like object."); #define PYEXPAT_XMLPARSER_PARSEFILE_METHODDEF \ - {"ParseFile", (PyCFunction)(void(*)(void))pyexpat_xmlparser_ParseFile, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, pyexpat_xmlparser_ParseFile__doc__}, + {"ParseFile", _PyCFunction_CAST(pyexpat_xmlparser_ParseFile), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, pyexpat_xmlparser_ParseFile__doc__}, static PyObject * pyexpat_xmlparser_ParseFile_impl(xmlparseobject *self, PyTypeObject *cls, @@ -163,7 +163,7 @@ PyDoc_STRVAR(pyexpat_xmlparser_ExternalEntityParserCreate__doc__, "Create a parser for parsing an external entity based on the information passed to the ExternalEntityRefHandler."); #define PYEXPAT_XMLPARSER_EXTERNALENTITYPARSERCREATE_METHODDEF \ - {"ExternalEntityParserCreate", (PyCFunction)(void(*)(void))pyexpat_xmlparser_ExternalEntityParserCreate, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, pyexpat_xmlparser_ExternalEntityParserCreate__doc__}, + {"ExternalEntityParserCreate", _PyCFunction_CAST(pyexpat_xmlparser_ExternalEntityParserCreate), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, pyexpat_xmlparser_ExternalEntityParserCreate__doc__}, static PyObject * pyexpat_xmlparser_ExternalEntityParserCreate_impl(xmlparseobject *self, @@ -272,7 +272,7 @@ PyDoc_STRVAR(pyexpat_xmlparser_UseForeignDTD__doc__, "information to the parser. \'flag\' defaults to True if not provided."); #define PYEXPAT_XMLPARSER_USEFOREIGNDTD_METHODDEF \ - {"UseForeignDTD", (PyCFunction)(void(*)(void))pyexpat_xmlparser_UseForeignDTD, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, pyexpat_xmlparser_UseForeignDTD__doc__}, + {"UseForeignDTD", _PyCFunction_CAST(pyexpat_xmlparser_UseForeignDTD), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, pyexpat_xmlparser_UseForeignDTD__doc__}, static PyObject * pyexpat_xmlparser_UseForeignDTD_impl(xmlparseobject *self, PyTypeObject *cls, @@ -315,7 +315,7 @@ PyDoc_STRVAR(pyexpat_ParserCreate__doc__, "Return a new XML parser object."); #define PYEXPAT_PARSERCREATE_METHODDEF \ - {"ParserCreate", (PyCFunction)(void(*)(void))pyexpat_ParserCreate, METH_FASTCALL|METH_KEYWORDS, pyexpat_ParserCreate__doc__}, + {"ParserCreate", _PyCFunction_CAST(pyexpat_ParserCreate), METH_FASTCALL|METH_KEYWORDS, pyexpat_ParserCreate__doc__}, static PyObject * pyexpat_ParserCreate_impl(PyObject *module, const char *encoding, @@ -425,4 +425,4 @@ pyexpat_ErrorString(PyObject *module, PyObject *arg) #ifndef PYEXPAT_XMLPARSER_USEFOREIGNDTD_METHODDEF #define PYEXPAT_XMLPARSER_USEFOREIGNDTD_METHODDEF #endif /* !defined(PYEXPAT_XMLPARSER_USEFOREIGNDTD_METHODDEF) */ -/*[clinic end generated code: output=5d60049d385d5d56 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=3e333b89da3aa58c input=a9049054013a1b77]*/ diff --git a/Modules/clinic/readline.c.h b/Modules/clinic/readline.c.h index d1ee8089f73f0..c64a84ed81ddf 100644 --- a/Modules/clinic/readline.c.h +++ b/Modules/clinic/readline.c.h @@ -20,7 +20,7 @@ PyDoc_STRVAR(readline_read_init_file__doc__, "The default filename is the last filename used."); #define READLINE_READ_INIT_FILE_METHODDEF \ - {"read_init_file", (PyCFunction)(void(*)(void))readline_read_init_file, METH_FASTCALL, readline_read_init_file__doc__}, + {"read_init_file", _PyCFunction_CAST(readline_read_init_file), METH_FASTCALL, readline_read_init_file__doc__}, static PyObject * readline_read_init_file_impl(PyObject *module, PyObject *filename_obj); @@ -54,7 +54,7 @@ PyDoc_STRVAR(readline_read_history_file__doc__, "The default filename is ~/.history."); #define READLINE_READ_HISTORY_FILE_METHODDEF \ - {"read_history_file", (PyCFunction)(void(*)(void))readline_read_history_file, METH_FASTCALL, readline_read_history_file__doc__}, + {"read_history_file", _PyCFunction_CAST(readline_read_history_file), METH_FASTCALL, readline_read_history_file__doc__}, static PyObject * readline_read_history_file_impl(PyObject *module, PyObject *filename_obj); @@ -88,7 +88,7 @@ PyDoc_STRVAR(readline_write_history_file__doc__, "The default filename is ~/.history."); #define READLINE_WRITE_HISTORY_FILE_METHODDEF \ - {"write_history_file", (PyCFunction)(void(*)(void))readline_write_history_file, METH_FASTCALL, readline_write_history_file__doc__}, + {"write_history_file", _PyCFunction_CAST(readline_write_history_file), METH_FASTCALL, readline_write_history_file__doc__}, static PyObject * readline_write_history_file_impl(PyObject *module, PyObject *filename_obj); @@ -124,7 +124,7 @@ PyDoc_STRVAR(readline_append_history_file__doc__, "The default filename is ~/.history."); #define READLINE_APPEND_HISTORY_FILE_METHODDEF \ - {"append_history_file", (PyCFunction)(void(*)(void))readline_append_history_file, METH_FASTCALL, readline_append_history_file__doc__}, + {"append_history_file", _PyCFunction_CAST(readline_append_history_file), METH_FASTCALL, readline_append_history_file__doc__}, static PyObject * readline_append_history_file_impl(PyObject *module, int nelements, @@ -216,7 +216,7 @@ PyDoc_STRVAR(readline_set_completion_display_matches_hook__doc__, "once each time matches need to be displayed."); #define READLINE_SET_COMPLETION_DISPLAY_MATCHES_HOOK_METHODDEF \ - {"set_completion_display_matches_hook", (PyCFunction)(void(*)(void))readline_set_completion_display_matches_hook, METH_FASTCALL, readline_set_completion_display_matches_hook__doc__}, + {"set_completion_display_matches_hook", _PyCFunction_CAST(readline_set_completion_display_matches_hook), METH_FASTCALL, readline_set_completion_display_matches_hook__doc__}, static PyObject * readline_set_completion_display_matches_hook_impl(PyObject *module, @@ -252,7 +252,7 @@ PyDoc_STRVAR(readline_set_startup_hook__doc__, "before readline prints the first prompt."); #define READLINE_SET_STARTUP_HOOK_METHODDEF \ - {"set_startup_hook", (PyCFunction)(void(*)(void))readline_set_startup_hook, METH_FASTCALL, readline_set_startup_hook__doc__}, + {"set_startup_hook", _PyCFunction_CAST(readline_set_startup_hook), METH_FASTCALL, readline_set_startup_hook__doc__}, static PyObject * readline_set_startup_hook_impl(PyObject *module, PyObject *function); @@ -290,7 +290,7 @@ PyDoc_STRVAR(readline_set_pre_input_hook__doc__, "characters."); #define READLINE_SET_PRE_INPUT_HOOK_METHODDEF \ - {"set_pre_input_hook", (PyCFunction)(void(*)(void))readline_set_pre_input_hook, METH_FASTCALL, readline_set_pre_input_hook__doc__}, + {"set_pre_input_hook", _PyCFunction_CAST(readline_set_pre_input_hook), METH_FASTCALL, readline_set_pre_input_hook__doc__}, static PyObject * readline_set_pre_input_hook_impl(PyObject *module, PyObject *function); @@ -417,7 +417,7 @@ PyDoc_STRVAR(readline_replace_history_item__doc__, "pos is zero-based."); #define READLINE_REPLACE_HISTORY_ITEM_METHODDEF \ - {"replace_history_item", (PyCFunction)(void(*)(void))readline_replace_history_item, METH_FASTCALL, readline_replace_history_item__doc__}, + {"replace_history_item", _PyCFunction_CAST(readline_replace_history_item), METH_FASTCALL, readline_replace_history_item__doc__}, static PyObject * readline_replace_history_item_impl(PyObject *module, int entry_number, @@ -518,7 +518,7 @@ PyDoc_STRVAR(readline_set_completer__doc__, "It should return the next possible completion starting with \'text\'."); #define READLINE_SET_COMPLETER_METHODDEF \ - {"set_completer", (PyCFunction)(void(*)(void))readline_set_completer, METH_FASTCALL, readline_set_completer__doc__}, + {"set_completer", _PyCFunction_CAST(readline_set_completer), METH_FASTCALL, readline_set_completer__doc__}, static PyObject * readline_set_completer_impl(PyObject *module, PyObject *function); @@ -685,4 +685,4 @@ readline_redisplay(PyObject *module, PyObject *Py_UNUSED(ignored)) #ifndef READLINE_CLEAR_HISTORY_METHODDEF #define READLINE_CLEAR_HISTORY_METHODDEF #endif /* !defined(READLINE_CLEAR_HISTORY_METHODDEF) */ -/*[clinic end generated code: output=f7d390113b27989f input=a9049054013a1b77]*/ +/*[clinic end generated code: output=1fd4c04c2e7ba475 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/resource.c.h b/Modules/clinic/resource.c.h index f31f7e8265e79..c591823ed7170 100644 --- a/Modules/clinic/resource.c.h +++ b/Modules/clinic/resource.c.h @@ -66,7 +66,7 @@ PyDoc_STRVAR(resource_setrlimit__doc__, "\n"); #define RESOURCE_SETRLIMIT_METHODDEF \ - {"setrlimit", (PyCFunction)(void(*)(void))resource_setrlimit, METH_FASTCALL, resource_setrlimit__doc__}, + {"setrlimit", _PyCFunction_CAST(resource_setrlimit), METH_FASTCALL, resource_setrlimit__doc__}, static PyObject * resource_setrlimit_impl(PyObject *module, int resource, PyObject *limits); @@ -171,4 +171,4 @@ resource_getpagesize(PyObject *module, PyObject *Py_UNUSED(ignored)) #ifndef RESOURCE_PRLIMIT_METHODDEF #define RESOURCE_PRLIMIT_METHODDEF #endif /* !defined(RESOURCE_PRLIMIT_METHODDEF) */ -/*[clinic end generated code: output=9ce1886c129eb2f3 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=7c57d4f3688d3f07 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/selectmodule.c.h b/Modules/clinic/selectmodule.c.h index ca06dae32964f..daa75427319a1 100644 --- a/Modules/clinic/selectmodule.c.h +++ b/Modules/clinic/selectmodule.c.h @@ -30,7 +30,7 @@ PyDoc_STRVAR(select_select__doc__, "descriptors can be used."); #define SELECT_SELECT_METHODDEF \ - {"select", (PyCFunction)(void(*)(void))select_select, METH_FASTCALL, select_select__doc__}, + {"select", _PyCFunction_CAST(select_select), METH_FASTCALL, select_select__doc__}, static PyObject * select_select_impl(PyObject *module, PyObject *rlist, PyObject *wlist, @@ -77,7 +77,7 @@ PyDoc_STRVAR(select_poll_register__doc__, " an optional bitmask describing the type of events to check for"); #define SELECT_POLL_REGISTER_METHODDEF \ - {"register", (PyCFunction)(void(*)(void))select_poll_register, METH_FASTCALL, select_poll_register__doc__}, + {"register", _PyCFunction_CAST(select_poll_register), METH_FASTCALL, select_poll_register__doc__}, static PyObject * select_poll_register_impl(pollObject *self, int fd, unsigned short eventmask); @@ -125,7 +125,7 @@ PyDoc_STRVAR(select_poll_modify__doc__, " a bitmask describing the type of events to check for"); #define SELECT_POLL_MODIFY_METHODDEF \ - {"modify", (PyCFunction)(void(*)(void))select_poll_modify, METH_FASTCALL, select_poll_modify__doc__}, + {"modify", _PyCFunction_CAST(select_poll_modify), METH_FASTCALL, select_poll_modify__doc__}, static PyObject * select_poll_modify_impl(pollObject *self, int fd, unsigned short eventmask); @@ -201,7 +201,7 @@ PyDoc_STRVAR(select_poll_poll__doc__, "report, as a list of (fd, event) 2-tuples."); #define SELECT_POLL_POLL_METHODDEF \ - {"poll", (PyCFunction)(void(*)(void))select_poll_poll, METH_FASTCALL, select_poll_poll__doc__}, + {"poll", _PyCFunction_CAST(select_poll_poll), METH_FASTCALL, select_poll_poll__doc__}, static PyObject * select_poll_poll_impl(pollObject *self, PyObject *timeout_obj); @@ -244,7 +244,7 @@ PyDoc_STRVAR(select_devpoll_register__doc__, " an optional bitmask describing the type of events to check for"); #define SELECT_DEVPOLL_REGISTER_METHODDEF \ - {"register", (PyCFunction)(void(*)(void))select_devpoll_register, METH_FASTCALL, select_devpoll_register__doc__}, + {"register", _PyCFunction_CAST(select_devpoll_register), METH_FASTCALL, select_devpoll_register__doc__}, static PyObject * select_devpoll_register_impl(devpollObject *self, int fd, @@ -294,7 +294,7 @@ PyDoc_STRVAR(select_devpoll_modify__doc__, " an optional bitmask describing the type of events to check for"); #define SELECT_DEVPOLL_MODIFY_METHODDEF \ - {"modify", (PyCFunction)(void(*)(void))select_devpoll_modify, METH_FASTCALL, select_devpoll_modify__doc__}, + {"modify", _PyCFunction_CAST(select_devpoll_modify), METH_FASTCALL, select_devpoll_modify__doc__}, static PyObject * select_devpoll_modify_impl(devpollObject *self, int fd, @@ -375,7 +375,7 @@ PyDoc_STRVAR(select_devpoll_poll__doc__, "report, as a list of (fd, event) 2-tuples."); #define SELECT_DEVPOLL_POLL_METHODDEF \ - {"poll", (PyCFunction)(void(*)(void))select_devpoll_poll, METH_FASTCALL, select_devpoll_poll__doc__}, + {"poll", _PyCFunction_CAST(select_devpoll_poll), METH_FASTCALL, select_devpoll_poll__doc__}, static PyObject * select_devpoll_poll_impl(devpollObject *self, PyObject *timeout_obj); @@ -655,7 +655,7 @@ PyDoc_STRVAR(select_epoll_register__doc__, "The epoll interface supports all file descriptors that support poll."); #define SELECT_EPOLL_REGISTER_METHODDEF \ - {"register", (PyCFunction)(void(*)(void))select_epoll_register, METH_FASTCALL|METH_KEYWORDS, select_epoll_register__doc__}, + {"register", _PyCFunction_CAST(select_epoll_register), METH_FASTCALL|METH_KEYWORDS, select_epoll_register__doc__}, static PyObject * select_epoll_register_impl(pyEpoll_Object *self, int fd, @@ -709,7 +709,7 @@ PyDoc_STRVAR(select_epoll_modify__doc__, " a bit set composed of the various EPOLL constants"); #define SELECT_EPOLL_MODIFY_METHODDEF \ - {"modify", (PyCFunction)(void(*)(void))select_epoll_modify, METH_FASTCALL|METH_KEYWORDS, select_epoll_modify__doc__}, + {"modify", _PyCFunction_CAST(select_epoll_modify), METH_FASTCALL|METH_KEYWORDS, select_epoll_modify__doc__}, static PyObject * select_epoll_modify_impl(pyEpoll_Object *self, int fd, @@ -756,7 +756,7 @@ PyDoc_STRVAR(select_epoll_unregister__doc__, " the target file descriptor of the operation"); #define SELECT_EPOLL_UNREGISTER_METHODDEF \ - {"unregister", (PyCFunction)(void(*)(void))select_epoll_unregister, METH_FASTCALL|METH_KEYWORDS, select_epoll_unregister__doc__}, + {"unregister", _PyCFunction_CAST(select_epoll_unregister), METH_FASTCALL|METH_KEYWORDS, select_epoll_unregister__doc__}, static PyObject * select_epoll_unregister_impl(pyEpoll_Object *self, int fd); @@ -803,7 +803,7 @@ PyDoc_STRVAR(select_epoll_poll__doc__, "as a list of (fd, events) 2-tuples."); #define SELECT_EPOLL_POLL_METHODDEF \ - {"poll", (PyCFunction)(void(*)(void))select_epoll_poll, METH_FASTCALL|METH_KEYWORDS, select_epoll_poll__doc__}, + {"poll", _PyCFunction_CAST(select_epoll_poll), METH_FASTCALL|METH_KEYWORDS, select_epoll_poll__doc__}, static PyObject * select_epoll_poll_impl(pyEpoll_Object *self, PyObject *timeout_obj, @@ -875,7 +875,7 @@ PyDoc_STRVAR(select_epoll___exit____doc__, "\n"); #define SELECT_EPOLL___EXIT___METHODDEF \ - {"__exit__", (PyCFunction)(void(*)(void))select_epoll___exit__, METH_FASTCALL, select_epoll___exit____doc__}, + {"__exit__", _PyCFunction_CAST(select_epoll___exit__), METH_FASTCALL, select_epoll___exit____doc__}, static PyObject * select_epoll___exit___impl(pyEpoll_Object *self, PyObject *exc_type, @@ -1055,7 +1055,7 @@ PyDoc_STRVAR(select_kqueue_control__doc__, " This accepts floats for smaller timeouts, too."); #define SELECT_KQUEUE_CONTROL_METHODDEF \ - {"control", (PyCFunction)(void(*)(void))select_kqueue_control, METH_FASTCALL, select_kqueue_control__doc__}, + {"control", _PyCFunction_CAST(select_kqueue_control), METH_FASTCALL, select_kqueue_control__doc__}, static PyObject * select_kqueue_control_impl(kqueue_queue_Object *self, PyObject *changelist, @@ -1189,4 +1189,4 @@ select_kqueue_control(kqueue_queue_Object *self, PyObject *const *args, Py_ssize #ifndef SELECT_KQUEUE_CONTROL_METHODDEF #define SELECT_KQUEUE_CONTROL_METHODDEF #endif /* !defined(SELECT_KQUEUE_CONTROL_METHODDEF) */ -/*[clinic end generated code: output=09ff9484c1b092fb input=a9049054013a1b77]*/ +/*[clinic end generated code: output=e77cc5c8a6c77860 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/sha1module.c.h b/Modules/clinic/sha1module.c.h index d9a2e150f6d41..e2338e4a1280a 100644 --- a/Modules/clinic/sha1module.c.h +++ b/Modules/clinic/sha1module.c.h @@ -9,7 +9,7 @@ PyDoc_STRVAR(SHA1Type_copy__doc__, "Return a copy of the hash object."); #define SHA1TYPE_COPY_METHODDEF \ - {"copy", (PyCFunction)(void(*)(void))SHA1Type_copy, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, SHA1Type_copy__doc__}, + {"copy", _PyCFunction_CAST(SHA1Type_copy), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, SHA1Type_copy__doc__}, static PyObject * SHA1Type_copy_impl(SHA1object *self, PyTypeObject *cls); @@ -76,7 +76,7 @@ PyDoc_STRVAR(_sha1_sha1__doc__, "Return a new SHA1 hash object; optionally initialized with a string."); #define _SHA1_SHA1_METHODDEF \ - {"sha1", (PyCFunction)(void(*)(void))_sha1_sha1, METH_FASTCALL|METH_KEYWORDS, _sha1_sha1__doc__}, + {"sha1", _PyCFunction_CAST(_sha1_sha1), METH_FASTCALL|METH_KEYWORDS, _sha1_sha1__doc__}, static PyObject * _sha1_sha1_impl(PyObject *module, PyObject *string, int usedforsecurity); @@ -119,4 +119,4 @@ _sha1_sha1(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject * exit: return return_value; } -/*[clinic end generated code: output=93ced3c8f8fa4f21 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=322d77ba0a4282fc input=a9049054013a1b77]*/ diff --git a/Modules/clinic/sha256module.c.h b/Modules/clinic/sha256module.c.h index 619fab1a6fe2f..b94c1c548a394 100644 --- a/Modules/clinic/sha256module.c.h +++ b/Modules/clinic/sha256module.c.h @@ -9,7 +9,7 @@ PyDoc_STRVAR(SHA256Type_copy__doc__, "Return a copy of the hash object."); #define SHA256TYPE_COPY_METHODDEF \ - {"copy", (PyCFunction)(void(*)(void))SHA256Type_copy, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, SHA256Type_copy__doc__}, + {"copy", _PyCFunction_CAST(SHA256Type_copy), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, SHA256Type_copy__doc__}, static PyObject * SHA256Type_copy_impl(SHAobject *self, PyTypeObject *cls); @@ -76,7 +76,7 @@ PyDoc_STRVAR(_sha256_sha256__doc__, "Return a new SHA-256 hash object; optionally initialized with a string."); #define _SHA256_SHA256_METHODDEF \ - {"sha256", (PyCFunction)(void(*)(void))_sha256_sha256, METH_FASTCALL|METH_KEYWORDS, _sha256_sha256__doc__}, + {"sha256", _PyCFunction_CAST(_sha256_sha256), METH_FASTCALL|METH_KEYWORDS, _sha256_sha256__doc__}, static PyObject * _sha256_sha256_impl(PyObject *module, PyObject *string, int usedforsecurity); @@ -127,7 +127,7 @@ PyDoc_STRVAR(_sha256_sha224__doc__, "Return a new SHA-224 hash object; optionally initialized with a string."); #define _SHA256_SHA224_METHODDEF \ - {"sha224", (PyCFunction)(void(*)(void))_sha256_sha224, METH_FASTCALL|METH_KEYWORDS, _sha256_sha224__doc__}, + {"sha224", _PyCFunction_CAST(_sha256_sha224), METH_FASTCALL|METH_KEYWORDS, _sha256_sha224__doc__}, static PyObject * _sha256_sha224_impl(PyObject *module, PyObject *string, int usedforsecurity); @@ -170,4 +170,4 @@ _sha256_sha224(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObje exit: return return_value; } -/*[clinic end generated code: output=4f9fe3ca546b0c58 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=58b48051890d3fde input=a9049054013a1b77]*/ diff --git a/Modules/clinic/sha512module.c.h b/Modules/clinic/sha512module.c.h index fada35eff2261..b7227480c342a 100644 --- a/Modules/clinic/sha512module.c.h +++ b/Modules/clinic/sha512module.c.h @@ -9,7 +9,7 @@ PyDoc_STRVAR(SHA512Type_copy__doc__, "Return a copy of the hash object."); #define SHA512TYPE_COPY_METHODDEF \ - {"copy", (PyCFunction)(void(*)(void))SHA512Type_copy, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, SHA512Type_copy__doc__}, + {"copy", _PyCFunction_CAST(SHA512Type_copy), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, SHA512Type_copy__doc__}, static PyObject * SHA512Type_copy_impl(SHAobject *self, PyTypeObject *cls); @@ -76,7 +76,7 @@ PyDoc_STRVAR(_sha512_sha512__doc__, "Return a new SHA-512 hash object; optionally initialized with a string."); #define _SHA512_SHA512_METHODDEF \ - {"sha512", (PyCFunction)(void(*)(void))_sha512_sha512, METH_FASTCALL|METH_KEYWORDS, _sha512_sha512__doc__}, + {"sha512", _PyCFunction_CAST(_sha512_sha512), METH_FASTCALL|METH_KEYWORDS, _sha512_sha512__doc__}, static PyObject * _sha512_sha512_impl(PyObject *module, PyObject *string, int usedforsecurity); @@ -127,7 +127,7 @@ PyDoc_STRVAR(_sha512_sha384__doc__, "Return a new SHA-384 hash object; optionally initialized with a string."); #define _SHA512_SHA384_METHODDEF \ - {"sha384", (PyCFunction)(void(*)(void))_sha512_sha384, METH_FASTCALL|METH_KEYWORDS, _sha512_sha384__doc__}, + {"sha384", _PyCFunction_CAST(_sha512_sha384), METH_FASTCALL|METH_KEYWORDS, _sha512_sha384__doc__}, static PyObject * _sha512_sha384_impl(PyObject *module, PyObject *string, int usedforsecurity); @@ -170,4 +170,4 @@ _sha512_sha384(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObje exit: return return_value; } -/*[clinic end generated code: output=26d2fe27b9673ac2 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=60a0a1a28c07f391 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/signalmodule.c.h b/Modules/clinic/signalmodule.c.h index 4c27314a80c86..9e4a8eb0b998a 100644 --- a/Modules/clinic/signalmodule.c.h +++ b/Modules/clinic/signalmodule.c.h @@ -11,7 +11,7 @@ PyDoc_STRVAR(signal_default_int_handler__doc__, "It raises KeyboardInterrupt."); #define SIGNAL_DEFAULT_INT_HANDLER_METHODDEF \ - {"default_int_handler", (PyCFunction)(void(*)(void))signal_default_int_handler, METH_FASTCALL, signal_default_int_handler__doc__}, + {"default_int_handler", _PyCFunction_CAST(signal_default_int_handler), METH_FASTCALL, signal_default_int_handler__doc__}, static PyObject * signal_default_int_handler_impl(PyObject *module, int signalnum, @@ -139,7 +139,7 @@ PyDoc_STRVAR(signal_signal__doc__, "the first is the signal number, the second is the interrupted stack frame."); #define SIGNAL_SIGNAL_METHODDEF \ - {"signal", (PyCFunction)(void(*)(void))signal_signal, METH_FASTCALL, signal_signal__doc__}, + {"signal", _PyCFunction_CAST(signal_signal), METH_FASTCALL, signal_signal__doc__}, static PyObject * signal_signal_impl(PyObject *module, int signalnum, PyObject *handler); @@ -242,7 +242,7 @@ PyDoc_STRVAR(signal_siginterrupt__doc__, "signal sig, else system calls will be interrupted."); #define SIGNAL_SIGINTERRUPT_METHODDEF \ - {"siginterrupt", (PyCFunction)(void(*)(void))signal_siginterrupt, METH_FASTCALL, signal_siginterrupt__doc__}, + {"siginterrupt", _PyCFunction_CAST(signal_siginterrupt), METH_FASTCALL, signal_siginterrupt__doc__}, static PyObject * signal_siginterrupt_impl(PyObject *module, int signalnum, int flag); @@ -287,7 +287,7 @@ PyDoc_STRVAR(signal_setitimer__doc__, "Returns old values as a tuple: (delay, interval)."); #define SIGNAL_SETITIMER_METHODDEF \ - {"setitimer", (PyCFunction)(void(*)(void))signal_setitimer, METH_FASTCALL, signal_setitimer__doc__}, + {"setitimer", _PyCFunction_CAST(signal_setitimer), METH_FASTCALL, signal_setitimer__doc__}, static PyObject * signal_setitimer_impl(PyObject *module, int which, PyObject *seconds, @@ -363,7 +363,7 @@ PyDoc_STRVAR(signal_pthread_sigmask__doc__, "Fetch and/or change the signal mask of the calling thread."); #define SIGNAL_PTHREAD_SIGMASK_METHODDEF \ - {"pthread_sigmask", (PyCFunction)(void(*)(void))signal_pthread_sigmask, METH_FASTCALL, signal_pthread_sigmask__doc__}, + {"pthread_sigmask", _PyCFunction_CAST(signal_pthread_sigmask), METH_FASTCALL, signal_pthread_sigmask__doc__}, static PyObject * signal_pthread_sigmask_impl(PyObject *module, int how, sigset_t mask); @@ -522,7 +522,7 @@ PyDoc_STRVAR(signal_sigtimedwait__doc__, "The timeout is specified in seconds, with floating point numbers allowed."); #define SIGNAL_SIGTIMEDWAIT_METHODDEF \ - {"sigtimedwait", (PyCFunction)(void(*)(void))signal_sigtimedwait, METH_FASTCALL, signal_sigtimedwait__doc__}, + {"sigtimedwait", _PyCFunction_CAST(signal_sigtimedwait), METH_FASTCALL, signal_sigtimedwait__doc__}, static PyObject * signal_sigtimedwait_impl(PyObject *module, sigset_t sigset, @@ -559,7 +559,7 @@ PyDoc_STRVAR(signal_pthread_kill__doc__, "Send a signal to a thread."); #define SIGNAL_PTHREAD_KILL_METHODDEF \ - {"pthread_kill", (PyCFunction)(void(*)(void))signal_pthread_kill, METH_FASTCALL, signal_pthread_kill__doc__}, + {"pthread_kill", _PyCFunction_CAST(signal_pthread_kill), METH_FASTCALL, signal_pthread_kill__doc__}, static PyObject * signal_pthread_kill_impl(PyObject *module, unsigned long thread_id, @@ -601,7 +601,7 @@ PyDoc_STRVAR(signal_pidfd_send_signal__doc__, "Send a signal to a process referred to by a pid file descriptor."); #define SIGNAL_PIDFD_SEND_SIGNAL_METHODDEF \ - {"pidfd_send_signal", (PyCFunction)(void(*)(void))signal_pidfd_send_signal, METH_FASTCALL, signal_pidfd_send_signal__doc__}, + {"pidfd_send_signal", _PyCFunction_CAST(signal_pidfd_send_signal), METH_FASTCALL, signal_pidfd_send_signal__doc__}, static PyObject * signal_pidfd_send_signal_impl(PyObject *module, int pidfd, int signalnum, @@ -698,4 +698,4 @@ signal_pidfd_send_signal(PyObject *module, PyObject *const *args, Py_ssize_t nar #ifndef SIGNAL_PIDFD_SEND_SIGNAL_METHODDEF #define SIGNAL_PIDFD_SEND_SIGNAL_METHODDEF #endif /* !defined(SIGNAL_PIDFD_SEND_SIGNAL_METHODDEF) */ -/*[clinic end generated code: output=c353e686367bc384 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=6ca1b70310eecdba input=a9049054013a1b77]*/ diff --git a/Modules/clinic/symtablemodule.c.h b/Modules/clinic/symtablemodule.c.h index 4a17f130ac97b..2cd08f8178200 100644 --- a/Modules/clinic/symtablemodule.c.h +++ b/Modules/clinic/symtablemodule.c.h @@ -9,7 +9,7 @@ PyDoc_STRVAR(_symtable_symtable__doc__, "Return symbol and scope dictionaries used internally by compiler."); #define _SYMTABLE_SYMTABLE_METHODDEF \ - {"symtable", (PyCFunction)(void(*)(void))_symtable_symtable, METH_FASTCALL, _symtable_symtable__doc__}, + {"symtable", _PyCFunction_CAST(_symtable_symtable), METH_FASTCALL, _symtable_symtable__doc__}, static PyObject * _symtable_symtable_impl(PyObject *module, PyObject *source, @@ -48,4 +48,4 @@ _symtable_symtable(PyObject *module, PyObject *const *args, Py_ssize_t nargs) exit: return return_value; } -/*[clinic end generated code: output=a12f75cdbdf4e52a input=a9049054013a1b77]*/ +/*[clinic end generated code: output=3f7ccf535d750238 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/termios.c.h b/Modules/clinic/termios.c.h index b4d179abbe490..29858fe8d05ea 100644 --- a/Modules/clinic/termios.c.h +++ b/Modules/clinic/termios.c.h @@ -50,7 +50,7 @@ PyDoc_STRVAR(termios_tcsetattr__doc__, "queued output and discarding all queued input."); #define TERMIOS_TCSETATTR_METHODDEF \ - {"tcsetattr", (PyCFunction)(void(*)(void))termios_tcsetattr, METH_FASTCALL, termios_tcsetattr__doc__}, + {"tcsetattr", _PyCFunction_CAST(termios_tcsetattr), METH_FASTCALL, termios_tcsetattr__doc__}, static PyObject * termios_tcsetattr_impl(PyObject *module, int fd, int when, PyObject *term); @@ -90,7 +90,7 @@ PyDoc_STRVAR(termios_tcsendbreak__doc__, "has a system dependent meaning."); #define TERMIOS_TCSENDBREAK_METHODDEF \ - {"tcsendbreak", (PyCFunction)(void(*)(void))termios_tcsendbreak, METH_FASTCALL, termios_tcsendbreak__doc__}, + {"tcsendbreak", _PyCFunction_CAST(termios_tcsendbreak), METH_FASTCALL, termios_tcsendbreak__doc__}, static PyObject * termios_tcsendbreak_impl(PyObject *module, int fd, int duration); @@ -156,7 +156,7 @@ PyDoc_STRVAR(termios_tcflush__doc__, "both queues."); #define TERMIOS_TCFLUSH_METHODDEF \ - {"tcflush", (PyCFunction)(void(*)(void))termios_tcflush, METH_FASTCALL, termios_tcflush__doc__}, + {"tcflush", _PyCFunction_CAST(termios_tcflush), METH_FASTCALL, termios_tcflush__doc__}, static PyObject * termios_tcflush_impl(PyObject *module, int fd, int queue); @@ -195,7 +195,7 @@ PyDoc_STRVAR(termios_tcflow__doc__, "or termios.TCION to restart input."); #define TERMIOS_TCFLOW_METHODDEF \ - {"tcflow", (PyCFunction)(void(*)(void))termios_tcflow, METH_FASTCALL, termios_tcflow__doc__}, + {"tcflow", _PyCFunction_CAST(termios_tcflow), METH_FASTCALL, termios_tcflow__doc__}, static PyObject * termios_tcflow_impl(PyObject *module, int fd, int action); @@ -262,7 +262,7 @@ PyDoc_STRVAR(termios_tcsetwinsize__doc__, "is a two-item tuple (ws_row, ws_col) like the one returned by tcgetwinsize()."); #define TERMIOS_TCSETWINSIZE_METHODDEF \ - {"tcsetwinsize", (PyCFunction)(void(*)(void))termios_tcsetwinsize, METH_FASTCALL, termios_tcsetwinsize__doc__}, + {"tcsetwinsize", _PyCFunction_CAST(termios_tcsetwinsize), METH_FASTCALL, termios_tcsetwinsize__doc__}, static PyObject * termios_tcsetwinsize_impl(PyObject *module, int fd, PyObject *winsz); @@ -286,4 +286,4 @@ termios_tcsetwinsize(PyObject *module, PyObject *const *args, Py_ssize_t nargs) exit: return return_value; } -/*[clinic end generated code: output=db808d31296f6643 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=ef9ab888876fac17 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/unicodedata.c.h b/Modules/clinic/unicodedata.c.h index 17f2e009701f1..835a776fe172f 100644 --- a/Modules/clinic/unicodedata.c.h +++ b/Modules/clinic/unicodedata.c.h @@ -13,7 +13,7 @@ PyDoc_STRVAR(unicodedata_UCD_decimal__doc__, "ValueError is raised."); #define UNICODEDATA_UCD_DECIMAL_METHODDEF \ - {"decimal", (PyCFunction)(void(*)(void))unicodedata_UCD_decimal, METH_FASTCALL, unicodedata_UCD_decimal__doc__}, + {"decimal", _PyCFunction_CAST(unicodedata_UCD_decimal), METH_FASTCALL, unicodedata_UCD_decimal__doc__}, static PyObject * unicodedata_UCD_decimal_impl(PyObject *self, int chr, @@ -63,7 +63,7 @@ PyDoc_STRVAR(unicodedata_UCD_digit__doc__, "ValueError is raised."); #define UNICODEDATA_UCD_DIGIT_METHODDEF \ - {"digit", (PyCFunction)(void(*)(void))unicodedata_UCD_digit, METH_FASTCALL, unicodedata_UCD_digit__doc__}, + {"digit", _PyCFunction_CAST(unicodedata_UCD_digit), METH_FASTCALL, unicodedata_UCD_digit__doc__}, static PyObject * unicodedata_UCD_digit_impl(PyObject *self, int chr, PyObject *default_value); @@ -112,7 +112,7 @@ PyDoc_STRVAR(unicodedata_UCD_numeric__doc__, "ValueError is raised."); #define UNICODEDATA_UCD_NUMERIC_METHODDEF \ - {"numeric", (PyCFunction)(void(*)(void))unicodedata_UCD_numeric, METH_FASTCALL, unicodedata_UCD_numeric__doc__}, + {"numeric", _PyCFunction_CAST(unicodedata_UCD_numeric), METH_FASTCALL, unicodedata_UCD_numeric__doc__}, static PyObject * unicodedata_UCD_numeric_impl(PyObject *self, int chr, @@ -395,7 +395,7 @@ PyDoc_STRVAR(unicodedata_UCD_is_normalized__doc__, "Valid values for form are \'NFC\', \'NFKC\', \'NFD\', and \'NFKD\'."); #define UNICODEDATA_UCD_IS_NORMALIZED_METHODDEF \ - {"is_normalized", (PyCFunction)(void(*)(void))unicodedata_UCD_is_normalized, METH_FASTCALL, unicodedata_UCD_is_normalized__doc__}, + {"is_normalized", _PyCFunction_CAST(unicodedata_UCD_is_normalized), METH_FASTCALL, unicodedata_UCD_is_normalized__doc__}, static PyObject * unicodedata_UCD_is_normalized_impl(PyObject *self, PyObject *form, @@ -442,7 +442,7 @@ PyDoc_STRVAR(unicodedata_UCD_normalize__doc__, "Valid values for form are \'NFC\', \'NFKC\', \'NFD\', and \'NFKD\'."); #define UNICODEDATA_UCD_NORMALIZE_METHODDEF \ - {"normalize", (PyCFunction)(void(*)(void))unicodedata_UCD_normalize, METH_FASTCALL, unicodedata_UCD_normalize__doc__}, + {"normalize", _PyCFunction_CAST(unicodedata_UCD_normalize), METH_FASTCALL, unicodedata_UCD_normalize__doc__}, static PyObject * unicodedata_UCD_normalize_impl(PyObject *self, PyObject *form, @@ -490,7 +490,7 @@ PyDoc_STRVAR(unicodedata_UCD_name__doc__, "ValueError is raised."); #define UNICODEDATA_UCD_NAME_METHODDEF \ - {"name", (PyCFunction)(void(*)(void))unicodedata_UCD_name, METH_FASTCALL, unicodedata_UCD_name__doc__}, + {"name", _PyCFunction_CAST(unicodedata_UCD_name), METH_FASTCALL, unicodedata_UCD_name__doc__}, static PyObject * unicodedata_UCD_name_impl(PyObject *self, int chr, PyObject *default_value); @@ -559,4 +559,4 @@ unicodedata_UCD_lookup(PyObject *self, PyObject *arg) exit: return return_value; } -/*[clinic end generated code: output=a3c0eb84eda47b2d input=a9049054013a1b77]*/ +/*[clinic end generated code: output=78d7a7ae57014502 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/zlibmodule.c.h b/Modules/clinic/zlibmodule.c.h index deadf872d0cf7..ad6a7d470c5e5 100644 --- a/Modules/clinic/zlibmodule.c.h +++ b/Modules/clinic/zlibmodule.c.h @@ -16,7 +16,7 @@ PyDoc_STRVAR(zlib_compress__doc__, " The window buffer size and container format."); #define ZLIB_COMPRESS_METHODDEF \ - {"compress", (PyCFunction)(void(*)(void))zlib_compress, METH_FASTCALL|METH_KEYWORDS, zlib_compress__doc__}, + {"compress", _PyCFunction_CAST(zlib_compress), METH_FASTCALL|METH_KEYWORDS, zlib_compress__doc__}, static PyObject * zlib_compress_impl(PyObject *module, Py_buffer *data, int level, int wbits); @@ -86,7 +86,7 @@ PyDoc_STRVAR(zlib_decompress__doc__, " The initial output buffer size."); #define ZLIB_DECOMPRESS_METHODDEF \ - {"decompress", (PyCFunction)(void(*)(void))zlib_decompress, METH_FASTCALL|METH_KEYWORDS, zlib_decompress__doc__}, + {"decompress", _PyCFunction_CAST(zlib_decompress), METH_FASTCALL|METH_KEYWORDS, zlib_decompress__doc__}, static PyObject * zlib_decompress_impl(PyObject *module, Py_buffer *data, int wbits, @@ -182,7 +182,7 @@ PyDoc_STRVAR(zlib_compressobj__doc__, " containing subsequences that are likely to occur in the input data."); #define ZLIB_COMPRESSOBJ_METHODDEF \ - {"compressobj", (PyCFunction)(void(*)(void))zlib_compressobj, METH_FASTCALL|METH_KEYWORDS, zlib_compressobj__doc__}, + {"compressobj", _PyCFunction_CAST(zlib_compressobj), METH_FASTCALL|METH_KEYWORDS, zlib_compressobj__doc__}, static PyObject * zlib_compressobj_impl(PyObject *module, int level, int method, int wbits, @@ -287,7 +287,7 @@ PyDoc_STRVAR(zlib_decompressobj__doc__, " dictionary as used by the compressor that produced the input data."); #define ZLIB_DECOMPRESSOBJ_METHODDEF \ - {"decompressobj", (PyCFunction)(void(*)(void))zlib_decompressobj, METH_FASTCALL|METH_KEYWORDS, zlib_decompressobj__doc__}, + {"decompressobj", _PyCFunction_CAST(zlib_decompressobj), METH_FASTCALL|METH_KEYWORDS, zlib_decompressobj__doc__}, static PyObject * zlib_decompressobj_impl(PyObject *module, int wbits, PyObject *zdict); @@ -341,7 +341,7 @@ PyDoc_STRVAR(zlib_Compress_compress__doc__, "Call the flush() method to clear these buffers."); #define ZLIB_COMPRESS_COMPRESS_METHODDEF \ - {"compress", (PyCFunction)(void(*)(void))zlib_Compress_compress, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, zlib_Compress_compress__doc__}, + {"compress", _PyCFunction_CAST(zlib_Compress_compress), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, zlib_Compress_compress__doc__}, static PyObject * zlib_Compress_compress_impl(compobject *self, PyTypeObject *cls, @@ -396,7 +396,7 @@ PyDoc_STRVAR(zlib_Decompress_decompress__doc__, "Call the flush() method to clear these buffers."); #define ZLIB_DECOMPRESS_DECOMPRESS_METHODDEF \ - {"decompress", (PyCFunction)(void(*)(void))zlib_Decompress_decompress, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, zlib_Decompress_decompress__doc__}, + {"decompress", _PyCFunction_CAST(zlib_Decompress_decompress), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, zlib_Decompress_decompress__doc__}, static PyObject * zlib_Decompress_decompress_impl(compobject *self, PyTypeObject *cls, @@ -464,7 +464,7 @@ PyDoc_STRVAR(zlib_Compress_flush__doc__, " can still be compressed."); #define ZLIB_COMPRESS_FLUSH_METHODDEF \ - {"flush", (PyCFunction)(void(*)(void))zlib_Compress_flush, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, zlib_Compress_flush__doc__}, + {"flush", _PyCFunction_CAST(zlib_Compress_flush), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, zlib_Compress_flush__doc__}, static PyObject * zlib_Compress_flush_impl(compobject *self, PyTypeObject *cls, int mode); @@ -505,7 +505,7 @@ PyDoc_STRVAR(zlib_Compress_copy__doc__, "Return a copy of the compression object."); #define ZLIB_COMPRESS_COPY_METHODDEF \ - {"copy", (PyCFunction)(void(*)(void))zlib_Compress_copy, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, zlib_Compress_copy__doc__}, + {"copy", _PyCFunction_CAST(zlib_Compress_copy), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, zlib_Compress_copy__doc__}, static PyObject * zlib_Compress_copy_impl(compobject *self, PyTypeObject *cls); @@ -530,7 +530,7 @@ PyDoc_STRVAR(zlib_Compress___copy____doc__, "\n"); #define ZLIB_COMPRESS___COPY___METHODDEF \ - {"__copy__", (PyCFunction)(void(*)(void))zlib_Compress___copy__, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, zlib_Compress___copy____doc__}, + {"__copy__", _PyCFunction_CAST(zlib_Compress___copy__), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, zlib_Compress___copy____doc__}, static PyObject * zlib_Compress___copy___impl(compobject *self, PyTypeObject *cls); @@ -555,7 +555,7 @@ PyDoc_STRVAR(zlib_Compress___deepcopy____doc__, "\n"); #define ZLIB_COMPRESS___DEEPCOPY___METHODDEF \ - {"__deepcopy__", (PyCFunction)(void(*)(void))zlib_Compress___deepcopy__, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, zlib_Compress___deepcopy____doc__}, + {"__deepcopy__", _PyCFunction_CAST(zlib_Compress___deepcopy__), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, zlib_Compress___deepcopy____doc__}, static PyObject * zlib_Compress___deepcopy___impl(compobject *self, PyTypeObject *cls, @@ -592,7 +592,7 @@ PyDoc_STRVAR(zlib_Decompress_copy__doc__, "Return a copy of the decompression object."); #define ZLIB_DECOMPRESS_COPY_METHODDEF \ - {"copy", (PyCFunction)(void(*)(void))zlib_Decompress_copy, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, zlib_Decompress_copy__doc__}, + {"copy", _PyCFunction_CAST(zlib_Decompress_copy), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, zlib_Decompress_copy__doc__}, static PyObject * zlib_Decompress_copy_impl(compobject *self, PyTypeObject *cls); @@ -617,7 +617,7 @@ PyDoc_STRVAR(zlib_Decompress___copy____doc__, "\n"); #define ZLIB_DECOMPRESS___COPY___METHODDEF \ - {"__copy__", (PyCFunction)(void(*)(void))zlib_Decompress___copy__, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, zlib_Decompress___copy____doc__}, + {"__copy__", _PyCFunction_CAST(zlib_Decompress___copy__), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, zlib_Decompress___copy____doc__}, static PyObject * zlib_Decompress___copy___impl(compobject *self, PyTypeObject *cls); @@ -642,7 +642,7 @@ PyDoc_STRVAR(zlib_Decompress___deepcopy____doc__, "\n"); #define ZLIB_DECOMPRESS___DEEPCOPY___METHODDEF \ - {"__deepcopy__", (PyCFunction)(void(*)(void))zlib_Decompress___deepcopy__, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, zlib_Decompress___deepcopy____doc__}, + {"__deepcopy__", _PyCFunction_CAST(zlib_Decompress___deepcopy__), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, zlib_Decompress___deepcopy____doc__}, static PyObject * zlib_Decompress___deepcopy___impl(compobject *self, PyTypeObject *cls, @@ -680,7 +680,7 @@ PyDoc_STRVAR(zlib_Decompress_flush__doc__, " the initial size of the output buffer."); #define ZLIB_DECOMPRESS_FLUSH_METHODDEF \ - {"flush", (PyCFunction)(void(*)(void))zlib_Decompress_flush, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, zlib_Decompress_flush__doc__}, + {"flush", _PyCFunction_CAST(zlib_Decompress_flush), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, zlib_Decompress_flush__doc__}, static PyObject * zlib_Decompress_flush_impl(compobject *self, PyTypeObject *cls, @@ -733,7 +733,7 @@ PyDoc_STRVAR(zlib_adler32__doc__, "The returned checksum is an integer."); #define ZLIB_ADLER32_METHODDEF \ - {"adler32", (PyCFunction)(void(*)(void))zlib_adler32, METH_FASTCALL, zlib_adler32__doc__}, + {"adler32", _PyCFunction_CAST(zlib_adler32), METH_FASTCALL, zlib_adler32__doc__}, static PyObject * zlib_adler32_impl(PyObject *module, Py_buffer *data, unsigned int value); @@ -786,7 +786,7 @@ PyDoc_STRVAR(zlib_crc32__doc__, "The returned checksum is an integer."); #define ZLIB_CRC32_METHODDEF \ - {"crc32", (PyCFunction)(void(*)(void))zlib_crc32, METH_FASTCALL, zlib_crc32__doc__}, + {"crc32", _PyCFunction_CAST(zlib_crc32), METH_FASTCALL, zlib_crc32__doc__}, static unsigned int zlib_crc32_impl(PyObject *module, Py_buffer *data, unsigned int value); @@ -855,4 +855,4 @@ zlib_crc32(PyObject *module, PyObject *const *args, Py_ssize_t nargs) #ifndef ZLIB_DECOMPRESS___DEEPCOPY___METHODDEF #define ZLIB_DECOMPRESS___DEEPCOPY___METHODDEF #endif /* !defined(ZLIB_DECOMPRESS___DEEPCOPY___METHODDEF) */ -/*[clinic end generated code: output=bb1e27d8b2198a86 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=757804b3ad33454f input=a9049054013a1b77]*/ diff --git a/Objects/clinic/bytearrayobject.c.h b/Objects/clinic/bytearrayobject.c.h index 1e3f197561523..0b5c01a83dbe1 100644 --- a/Objects/clinic/bytearrayobject.c.h +++ b/Objects/clinic/bytearrayobject.c.h @@ -200,7 +200,7 @@ PyDoc_STRVAR(bytearray_translate__doc__, "The remaining characters are mapped through the given translation table."); #define BYTEARRAY_TRANSLATE_METHODDEF \ - {"translate", (PyCFunction)(void(*)(void))bytearray_translate, METH_FASTCALL|METH_KEYWORDS, bytearray_translate__doc__}, + {"translate", _PyCFunction_CAST(bytearray_translate), METH_FASTCALL|METH_KEYWORDS, bytearray_translate__doc__}, static PyObject * bytearray_translate_impl(PyByteArrayObject *self, PyObject *table, @@ -245,7 +245,7 @@ PyDoc_STRVAR(bytearray_maketrans__doc__, "The bytes objects frm and to must be of the same length."); #define BYTEARRAY_MAKETRANS_METHODDEF \ - {"maketrans", (PyCFunction)(void(*)(void))bytearray_maketrans, METH_FASTCALL|METH_STATIC, bytearray_maketrans__doc__}, + {"maketrans", _PyCFunction_CAST(bytearray_maketrans), METH_FASTCALL|METH_STATIC, bytearray_maketrans__doc__}, static PyObject * bytearray_maketrans_impl(Py_buffer *frm, Py_buffer *to); @@ -303,7 +303,7 @@ PyDoc_STRVAR(bytearray_replace__doc__, "replaced."); #define BYTEARRAY_REPLACE_METHODDEF \ - {"replace", (PyCFunction)(void(*)(void))bytearray_replace, METH_FASTCALL, bytearray_replace__doc__}, + {"replace", _PyCFunction_CAST(bytearray_replace), METH_FASTCALL, bytearray_replace__doc__}, static PyObject * bytearray_replace_impl(PyByteArrayObject *self, Py_buffer *old, @@ -380,7 +380,7 @@ PyDoc_STRVAR(bytearray_split__doc__, " -1 (the default value) means no limit."); #define BYTEARRAY_SPLIT_METHODDEF \ - {"split", (PyCFunction)(void(*)(void))bytearray_split, METH_FASTCALL|METH_KEYWORDS, bytearray_split__doc__}, + {"split", _PyCFunction_CAST(bytearray_split), METH_FASTCALL|METH_KEYWORDS, bytearray_split__doc__}, static PyObject * bytearray_split_impl(PyByteArrayObject *self, PyObject *sep, @@ -479,7 +479,7 @@ PyDoc_STRVAR(bytearray_rsplit__doc__, "Splitting is done starting at the end of the bytearray and working to the front."); #define BYTEARRAY_RSPLIT_METHODDEF \ - {"rsplit", (PyCFunction)(void(*)(void))bytearray_rsplit, METH_FASTCALL|METH_KEYWORDS, bytearray_rsplit__doc__}, + {"rsplit", _PyCFunction_CAST(bytearray_rsplit), METH_FASTCALL|METH_KEYWORDS, bytearray_rsplit__doc__}, static PyObject * bytearray_rsplit_impl(PyByteArrayObject *self, PyObject *sep, @@ -558,7 +558,7 @@ PyDoc_STRVAR(bytearray_insert__doc__, " The item to be inserted."); #define BYTEARRAY_INSERT_METHODDEF \ - {"insert", (PyCFunction)(void(*)(void))bytearray_insert, METH_FASTCALL, bytearray_insert__doc__}, + {"insert", _PyCFunction_CAST(bytearray_insert), METH_FASTCALL, bytearray_insert__doc__}, static PyObject * bytearray_insert_impl(PyByteArrayObject *self, Py_ssize_t index, int item); @@ -649,7 +649,7 @@ PyDoc_STRVAR(bytearray_pop__doc__, "If no index argument is given, will pop the last item."); #define BYTEARRAY_POP_METHODDEF \ - {"pop", (PyCFunction)(void(*)(void))bytearray_pop, METH_FASTCALL, bytearray_pop__doc__}, + {"pop", _PyCFunction_CAST(bytearray_pop), METH_FASTCALL, bytearray_pop__doc__}, static PyObject * bytearray_pop_impl(PyByteArrayObject *self, Py_ssize_t index); @@ -724,7 +724,7 @@ PyDoc_STRVAR(bytearray_strip__doc__, "If the argument is omitted or None, strip leading and trailing ASCII whitespace."); #define BYTEARRAY_STRIP_METHODDEF \ - {"strip", (PyCFunction)(void(*)(void))bytearray_strip, METH_FASTCALL, bytearray_strip__doc__}, + {"strip", _PyCFunction_CAST(bytearray_strip), METH_FASTCALL, bytearray_strip__doc__}, static PyObject * bytearray_strip_impl(PyByteArrayObject *self, PyObject *bytes); @@ -758,7 +758,7 @@ PyDoc_STRVAR(bytearray_lstrip__doc__, "If the argument is omitted or None, strip leading ASCII whitespace."); #define BYTEARRAY_LSTRIP_METHODDEF \ - {"lstrip", (PyCFunction)(void(*)(void))bytearray_lstrip, METH_FASTCALL, bytearray_lstrip__doc__}, + {"lstrip", _PyCFunction_CAST(bytearray_lstrip), METH_FASTCALL, bytearray_lstrip__doc__}, static PyObject * bytearray_lstrip_impl(PyByteArrayObject *self, PyObject *bytes); @@ -792,7 +792,7 @@ PyDoc_STRVAR(bytearray_rstrip__doc__, "If the argument is omitted or None, strip trailing ASCII whitespace."); #define BYTEARRAY_RSTRIP_METHODDEF \ - {"rstrip", (PyCFunction)(void(*)(void))bytearray_rstrip, METH_FASTCALL, bytearray_rstrip__doc__}, + {"rstrip", _PyCFunction_CAST(bytearray_rstrip), METH_FASTCALL, bytearray_rstrip__doc__}, static PyObject * bytearray_rstrip_impl(PyByteArrayObject *self, PyObject *bytes); @@ -833,7 +833,7 @@ PyDoc_STRVAR(bytearray_decode__doc__, " can handle UnicodeDecodeErrors."); #define BYTEARRAY_DECODE_METHODDEF \ - {"decode", (PyCFunction)(void(*)(void))bytearray_decode, METH_FASTCALL|METH_KEYWORDS, bytearray_decode__doc__}, + {"decode", _PyCFunction_CAST(bytearray_decode), METH_FASTCALL|METH_KEYWORDS, bytearray_decode__doc__}, static PyObject * bytearray_decode_impl(PyByteArrayObject *self, const char *encoding, @@ -918,7 +918,7 @@ PyDoc_STRVAR(bytearray_splitlines__doc__, "true."); #define BYTEARRAY_SPLITLINES_METHODDEF \ - {"splitlines", (PyCFunction)(void(*)(void))bytearray_splitlines, METH_FASTCALL|METH_KEYWORDS, bytearray_splitlines__doc__}, + {"splitlines", _PyCFunction_CAST(bytearray_splitlines), METH_FASTCALL|METH_KEYWORDS, bytearray_splitlines__doc__}, static PyObject * bytearray_splitlines_impl(PyByteArrayObject *self, int keepends); @@ -1010,7 +1010,7 @@ PyDoc_STRVAR(bytearray_hex__doc__, "\'b901:ef\'"); #define BYTEARRAY_HEX_METHODDEF \ - {"hex", (PyCFunction)(void(*)(void))bytearray_hex, METH_FASTCALL|METH_KEYWORDS, bytearray_hex__doc__}, + {"hex", _PyCFunction_CAST(bytearray_hex), METH_FASTCALL|METH_KEYWORDS, bytearray_hex__doc__}, static PyObject * bytearray_hex_impl(PyByteArrayObject *self, PyObject *sep, int bytes_per_sep); @@ -1075,7 +1075,7 @@ PyDoc_STRVAR(bytearray_reduce_ex__doc__, "Return state information for pickling."); #define BYTEARRAY_REDUCE_EX_METHODDEF \ - {"__reduce_ex__", (PyCFunction)(void(*)(void))bytearray_reduce_ex, METH_FASTCALL, bytearray_reduce_ex__doc__}, + {"__reduce_ex__", _PyCFunction_CAST(bytearray_reduce_ex), METH_FASTCALL, bytearray_reduce_ex__doc__}, static PyObject * bytearray_reduce_ex_impl(PyByteArrayObject *self, int proto); @@ -1120,4 +1120,4 @@ bytearray_sizeof(PyByteArrayObject *self, PyObject *Py_UNUSED(ignored)) { return bytearray_sizeof_impl(self); } -/*[clinic end generated code: output=a82659f581e55629 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=033e9eb5f2bb0139 input=a9049054013a1b77]*/ diff --git a/Objects/clinic/bytesobject.c.h b/Objects/clinic/bytesobject.c.h index 103a364281321..7e85720341751 100644 --- a/Objects/clinic/bytesobject.c.h +++ b/Objects/clinic/bytesobject.c.h @@ -35,7 +35,7 @@ PyDoc_STRVAR(bytes_split__doc__, " -1 (the default value) means no limit."); #define BYTES_SPLIT_METHODDEF \ - {"split", (PyCFunction)(void(*)(void))bytes_split, METH_FASTCALL|METH_KEYWORDS, bytes_split__doc__}, + {"split", _PyCFunction_CAST(bytes_split), METH_FASTCALL|METH_KEYWORDS, bytes_split__doc__}, static PyObject * bytes_split_impl(PyBytesObject *self, PyObject *sep, Py_ssize_t maxsplit); @@ -186,7 +186,7 @@ PyDoc_STRVAR(bytes_rsplit__doc__, "Splitting is done starting at the end of the bytes and working to the front."); #define BYTES_RSPLIT_METHODDEF \ - {"rsplit", (PyCFunction)(void(*)(void))bytes_rsplit, METH_FASTCALL|METH_KEYWORDS, bytes_rsplit__doc__}, + {"rsplit", _PyCFunction_CAST(bytes_rsplit), METH_FASTCALL|METH_KEYWORDS, bytes_rsplit__doc__}, static PyObject * bytes_rsplit_impl(PyBytesObject *self, PyObject *sep, Py_ssize_t maxsplit); @@ -258,7 +258,7 @@ PyDoc_STRVAR(bytes_strip__doc__, "If the argument is omitted or None, strip leading and trailing ASCII whitespace."); #define BYTES_STRIP_METHODDEF \ - {"strip", (PyCFunction)(void(*)(void))bytes_strip, METH_FASTCALL, bytes_strip__doc__}, + {"strip", _PyCFunction_CAST(bytes_strip), METH_FASTCALL, bytes_strip__doc__}, static PyObject * bytes_strip_impl(PyBytesObject *self, PyObject *bytes); @@ -292,7 +292,7 @@ PyDoc_STRVAR(bytes_lstrip__doc__, "If the argument is omitted or None, strip leading ASCII whitespace."); #define BYTES_LSTRIP_METHODDEF \ - {"lstrip", (PyCFunction)(void(*)(void))bytes_lstrip, METH_FASTCALL, bytes_lstrip__doc__}, + {"lstrip", _PyCFunction_CAST(bytes_lstrip), METH_FASTCALL, bytes_lstrip__doc__}, static PyObject * bytes_lstrip_impl(PyBytesObject *self, PyObject *bytes); @@ -326,7 +326,7 @@ PyDoc_STRVAR(bytes_rstrip__doc__, "If the argument is omitted or None, strip trailing ASCII whitespace."); #define BYTES_RSTRIP_METHODDEF \ - {"rstrip", (PyCFunction)(void(*)(void))bytes_rstrip, METH_FASTCALL, bytes_rstrip__doc__}, + {"rstrip", _PyCFunction_CAST(bytes_rstrip), METH_FASTCALL, bytes_rstrip__doc__}, static PyObject * bytes_rstrip_impl(PyBytesObject *self, PyObject *bytes); @@ -364,7 +364,7 @@ PyDoc_STRVAR(bytes_translate__doc__, "The remaining characters are mapped through the given translation table."); #define BYTES_TRANSLATE_METHODDEF \ - {"translate", (PyCFunction)(void(*)(void))bytes_translate, METH_FASTCALL|METH_KEYWORDS, bytes_translate__doc__}, + {"translate", _PyCFunction_CAST(bytes_translate), METH_FASTCALL|METH_KEYWORDS, bytes_translate__doc__}, static PyObject * bytes_translate_impl(PyBytesObject *self, PyObject *table, @@ -409,7 +409,7 @@ PyDoc_STRVAR(bytes_maketrans__doc__, "The bytes objects frm and to must be of the same length."); #define BYTES_MAKETRANS_METHODDEF \ - {"maketrans", (PyCFunction)(void(*)(void))bytes_maketrans, METH_FASTCALL|METH_STATIC, bytes_maketrans__doc__}, + {"maketrans", _PyCFunction_CAST(bytes_maketrans), METH_FASTCALL|METH_STATIC, bytes_maketrans__doc__}, static PyObject * bytes_maketrans_impl(Py_buffer *frm, Py_buffer *to); @@ -467,7 +467,7 @@ PyDoc_STRVAR(bytes_replace__doc__, "replaced."); #define BYTES_REPLACE_METHODDEF \ - {"replace", (PyCFunction)(void(*)(void))bytes_replace, METH_FASTCALL, bytes_replace__doc__}, + {"replace", _PyCFunction_CAST(bytes_replace), METH_FASTCALL, bytes_replace__doc__}, static PyObject * bytes_replace_impl(PyBytesObject *self, Py_buffer *old, Py_buffer *new, @@ -624,7 +624,7 @@ PyDoc_STRVAR(bytes_decode__doc__, " can handle UnicodeDecodeErrors."); #define BYTES_DECODE_METHODDEF \ - {"decode", (PyCFunction)(void(*)(void))bytes_decode, METH_FASTCALL|METH_KEYWORDS, bytes_decode__doc__}, + {"decode", _PyCFunction_CAST(bytes_decode), METH_FASTCALL|METH_KEYWORDS, bytes_decode__doc__}, static PyObject * bytes_decode_impl(PyBytesObject *self, const char *encoding, @@ -696,7 +696,7 @@ PyDoc_STRVAR(bytes_splitlines__doc__, "true."); #define BYTES_SPLITLINES_METHODDEF \ - {"splitlines", (PyCFunction)(void(*)(void))bytes_splitlines, METH_FASTCALL|METH_KEYWORDS, bytes_splitlines__doc__}, + {"splitlines", _PyCFunction_CAST(bytes_splitlines), METH_FASTCALL|METH_KEYWORDS, bytes_splitlines__doc__}, static PyObject * bytes_splitlines_impl(PyBytesObject *self, int keepends); @@ -788,7 +788,7 @@ PyDoc_STRVAR(bytes_hex__doc__, "\'b901:ef\'"); #define BYTES_HEX_METHODDEF \ - {"hex", (PyCFunction)(void(*)(void))bytes_hex, METH_FASTCALL|METH_KEYWORDS, bytes_hex__doc__}, + {"hex", _PyCFunction_CAST(bytes_hex), METH_FASTCALL|METH_KEYWORDS, bytes_hex__doc__}, static PyObject * bytes_hex_impl(PyBytesObject *self, PyObject *sep, int bytes_per_sep); @@ -896,4 +896,4 @@ bytes_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) exit: return return_value; } -/*[clinic end generated code: output=d706344859f40122 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=5727702e63a0a8b7 input=a9049054013a1b77]*/ diff --git a/Objects/clinic/codeobject.c.h b/Objects/clinic/codeobject.c.h index 41c5c2e1170f8..df82524a86afe 100644 --- a/Objects/clinic/codeobject.c.h +++ b/Objects/clinic/codeobject.c.h @@ -168,7 +168,7 @@ PyDoc_STRVAR(code_replace__doc__, "Return a copy of the code object with new values for the specified fields."); #define CODE_REPLACE_METHODDEF \ - {"replace", (PyCFunction)(void(*)(void))code_replace, METH_FASTCALL|METH_KEYWORDS, code_replace__doc__}, + {"replace", _PyCFunction_CAST(code_replace), METH_FASTCALL|METH_KEYWORDS, code_replace__doc__}, static PyObject * code_replace_impl(PyCodeObject *self, int co_argcount, @@ -409,7 +409,7 @@ PyDoc_STRVAR(code__varname_from_oparg__doc__, "WARNING: this method is for internal use only and may change or go away."); #define CODE__VARNAME_FROM_OPARG_METHODDEF \ - {"_varname_from_oparg", (PyCFunction)(void(*)(void))code__varname_from_oparg, METH_FASTCALL|METH_KEYWORDS, code__varname_from_oparg__doc__}, + {"_varname_from_oparg", _PyCFunction_CAST(code__varname_from_oparg), METH_FASTCALL|METH_KEYWORDS, code__varname_from_oparg__doc__}, static PyObject * code__varname_from_oparg_impl(PyCodeObject *self, int oparg); @@ -436,4 +436,4 @@ code__varname_from_oparg(PyCodeObject *self, PyObject *const *args, Py_ssize_t n exit: return return_value; } -/*[clinic end generated code: output=ebfeec29d2cff674 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=9c521b6c79f90ff7 input=a9049054013a1b77]*/ diff --git a/Objects/clinic/dictobject.c.h b/Objects/clinic/dictobject.c.h index beb3f360f8634..eda86c31fcc57 100644 --- a/Objects/clinic/dictobject.c.h +++ b/Objects/clinic/dictobject.c.h @@ -9,7 +9,7 @@ PyDoc_STRVAR(dict_fromkeys__doc__, "Create a new dictionary with keys from iterable and values set to value."); #define DICT_FROMKEYS_METHODDEF \ - {"fromkeys", (PyCFunction)(void(*)(void))dict_fromkeys, METH_FASTCALL|METH_CLASS, dict_fromkeys__doc__}, + {"fromkeys", _PyCFunction_CAST(dict_fromkeys), METH_FASTCALL|METH_CLASS, dict_fromkeys__doc__}, static PyObject * dict_fromkeys_impl(PyTypeObject *type, PyObject *iterable, PyObject *value); @@ -52,7 +52,7 @@ PyDoc_STRVAR(dict_get__doc__, "Return the value for key if key is in the dictionary, else default."); #define DICT_GET_METHODDEF \ - {"get", (PyCFunction)(void(*)(void))dict_get, METH_FASTCALL, dict_get__doc__}, + {"get", _PyCFunction_CAST(dict_get), METH_FASTCALL, dict_get__doc__}, static PyObject * dict_get_impl(PyDictObject *self, PyObject *key, PyObject *default_value); @@ -88,7 +88,7 @@ PyDoc_STRVAR(dict_setdefault__doc__, "Return the value for key if key is in the dictionary, else default."); #define DICT_SETDEFAULT_METHODDEF \ - {"setdefault", (PyCFunction)(void(*)(void))dict_setdefault, METH_FASTCALL, dict_setdefault__doc__}, + {"setdefault", _PyCFunction_CAST(dict_setdefault), METH_FASTCALL, dict_setdefault__doc__}, static PyObject * dict_setdefault_impl(PyDictObject *self, PyObject *key, @@ -126,7 +126,7 @@ PyDoc_STRVAR(dict_pop__doc__, "raise a KeyError."); #define DICT_POP_METHODDEF \ - {"pop", (PyCFunction)(void(*)(void))dict_pop, METH_FASTCALL, dict_pop__doc__}, + {"pop", _PyCFunction_CAST(dict_pop), METH_FASTCALL, dict_pop__doc__}, static PyObject * dict_pop_impl(PyDictObject *self, PyObject *key, PyObject *default_value); @@ -191,4 +191,4 @@ dict___reversed__(PyDictObject *self, PyObject *Py_UNUSED(ignored)) { return dict___reversed___impl(self); } -/*[clinic end generated code: output=7b77c16e43d6735a input=a9049054013a1b77]*/ +/*[clinic end generated code: output=582766ac0154c8bf input=a9049054013a1b77]*/ diff --git a/Objects/clinic/floatobject.c.h b/Objects/clinic/floatobject.c.h index f53018c08e045..bf0748f3b3d12 100644 --- a/Objects/clinic/floatobject.c.h +++ b/Objects/clinic/floatobject.c.h @@ -83,7 +83,7 @@ PyDoc_STRVAR(float___round____doc__, "When an argument is passed, work like built-in round(x, ndigits)."); #define FLOAT___ROUND___METHODDEF \ - {"__round__", (PyCFunction)(void(*)(void))float___round__, METH_FASTCALL, float___round____doc__}, + {"__round__", _PyCFunction_CAST(float___round__), METH_FASTCALL, float___round____doc__}, static PyObject * float___round___impl(PyObject *self, PyObject *o_ndigits); @@ -321,4 +321,4 @@ float___format__(PyObject *self, PyObject *arg) exit: return return_value; } -/*[clinic end generated code: output=604cb27bf751ea16 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=a6e6467624a92a43 input=a9049054013a1b77]*/ diff --git a/Objects/clinic/listobject.c.h b/Objects/clinic/listobject.c.h index 75ed9f9df8599..2499383cc26c5 100644 --- a/Objects/clinic/listobject.c.h +++ b/Objects/clinic/listobject.c.h @@ -9,7 +9,7 @@ PyDoc_STRVAR(list_insert__doc__, "Insert object before index."); #define LIST_INSERT_METHODDEF \ - {"insert", (PyCFunction)(void(*)(void))list_insert, METH_FASTCALL, list_insert__doc__}, + {"insert", _PyCFunction_CAST(list_insert), METH_FASTCALL, list_insert__doc__}, static PyObject * list_insert_impl(PyListObject *self, Py_ssize_t index, PyObject *object); @@ -106,7 +106,7 @@ PyDoc_STRVAR(list_pop__doc__, "Raises IndexError if list is empty or index is out of range."); #define LIST_POP_METHODDEF \ - {"pop", (PyCFunction)(void(*)(void))list_pop, METH_FASTCALL, list_pop__doc__}, + {"pop", _PyCFunction_CAST(list_pop), METH_FASTCALL, list_pop__doc__}, static PyObject * list_pop_impl(PyListObject *self, Py_ssize_t index); @@ -157,7 +157,7 @@ PyDoc_STRVAR(list_sort__doc__, "The reverse flag can be set to sort in descending order."); #define LIST_SORT_METHODDEF \ - {"sort", (PyCFunction)(void(*)(void))list_sort, METH_FASTCALL|METH_KEYWORDS, list_sort__doc__}, + {"sort", _PyCFunction_CAST(list_sort), METH_FASTCALL|METH_KEYWORDS, list_sort__doc__}, static PyObject * list_sort_impl(PyListObject *self, PyObject *keyfunc, int reverse); @@ -224,7 +224,7 @@ PyDoc_STRVAR(list_index__doc__, "Raises ValueError if the value is not present."); #define LIST_INDEX_METHODDEF \ - {"index", (PyCFunction)(void(*)(void))list_index, METH_FASTCALL, list_index__doc__}, + {"index", _PyCFunction_CAST(list_index), METH_FASTCALL, list_index__doc__}, static PyObject * list_index_impl(PyListObject *self, PyObject *value, Py_ssize_t start, @@ -353,4 +353,4 @@ list___reversed__(PyListObject *self, PyObject *Py_UNUSED(ignored)) { return list___reversed___impl(self); } -/*[clinic end generated code: output=acb2f87736311930 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=eab97a76b1568a03 input=a9049054013a1b77]*/ diff --git a/Objects/clinic/longobject.c.h b/Objects/clinic/longobject.c.h index d50c4af8096fa..59b79636bee10 100644 --- a/Objects/clinic/longobject.c.h +++ b/Objects/clinic/longobject.c.h @@ -96,7 +96,7 @@ PyDoc_STRVAR(int___round____doc__, "Rounding with an ndigits argument also returns an integer."); #define INT___ROUND___METHODDEF \ - {"__round__", (PyCFunction)(void(*)(void))int___round__, METH_FASTCALL, int___round____doc__}, + {"__round__", _PyCFunction_CAST(int___round__), METH_FASTCALL, int___round____doc__}, static PyObject * int___round___impl(PyObject *self, PyObject *o_ndigits); @@ -247,7 +247,7 @@ PyDoc_STRVAR(int_to_bytes__doc__, " is raised."); #define INT_TO_BYTES_METHODDEF \ - {"to_bytes", (PyCFunction)(void(*)(void))int_to_bytes, METH_FASTCALL|METH_KEYWORDS, int_to_bytes__doc__}, + {"to_bytes", _PyCFunction_CAST(int_to_bytes), METH_FASTCALL|METH_KEYWORDS, int_to_bytes__doc__}, static PyObject * int_to_bytes_impl(PyObject *self, Py_ssize_t length, PyObject *byteorder, @@ -338,7 +338,7 @@ PyDoc_STRVAR(int_from_bytes__doc__, " Indicates whether two\'s complement is used to represent the integer."); #define INT_FROM_BYTES_METHODDEF \ - {"from_bytes", (PyCFunction)(void(*)(void))int_from_bytes, METH_FASTCALL|METH_KEYWORDS|METH_CLASS, int_from_bytes__doc__}, + {"from_bytes", _PyCFunction_CAST(int_from_bytes), METH_FASTCALL|METH_KEYWORDS|METH_CLASS, int_from_bytes__doc__}, static PyObject * int_from_bytes_impl(PyTypeObject *type, PyObject *bytes_obj, @@ -391,4 +391,4 @@ int_from_bytes(PyTypeObject *type, PyObject *const *args, Py_ssize_t nargs, PyOb exit: return return_value; } -/*[clinic end generated code: output=16a375d93769b227 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=899e57c41861a8e9 input=a9049054013a1b77]*/ diff --git a/Objects/clinic/memoryobject.c.h b/Objects/clinic/memoryobject.c.h index 4a682f69d6573..73ef8d143b50b 100644 --- a/Objects/clinic/memoryobject.c.h +++ b/Objects/clinic/memoryobject.c.h @@ -58,7 +58,7 @@ PyDoc_STRVAR(memoryview_cast__doc__, "Cast a memoryview to a new format or shape."); #define MEMORYVIEW_CAST_METHODDEF \ - {"cast", (PyCFunction)(void(*)(void))memoryview_cast, METH_FASTCALL|METH_KEYWORDS, memoryview_cast__doc__}, + {"cast", _PyCFunction_CAST(memoryview_cast), METH_FASTCALL|METH_KEYWORDS, memoryview_cast__doc__}, static PyObject * memoryview_cast_impl(PyMemoryViewObject *self, PyObject *format, @@ -147,7 +147,7 @@ PyDoc_STRVAR(memoryview_tobytes__doc__, "to C first. order=None is the same as order=\'C\'."); #define MEMORYVIEW_TOBYTES_METHODDEF \ - {"tobytes", (PyCFunction)(void(*)(void))memoryview_tobytes, METH_FASTCALL|METH_KEYWORDS, memoryview_tobytes__doc__}, + {"tobytes", _PyCFunction_CAST(memoryview_tobytes), METH_FASTCALL|METH_KEYWORDS, memoryview_tobytes__doc__}, static PyObject * memoryview_tobytes_impl(PyMemoryViewObject *self, const char *order); @@ -218,7 +218,7 @@ PyDoc_STRVAR(memoryview_hex__doc__, "\'b901:ef\'"); #define MEMORYVIEW_HEX_METHODDEF \ - {"hex", (PyCFunction)(void(*)(void))memoryview_hex, METH_FASTCALL|METH_KEYWORDS, memoryview_hex__doc__}, + {"hex", _PyCFunction_CAST(memoryview_hex), METH_FASTCALL|METH_KEYWORDS, memoryview_hex__doc__}, static PyObject * memoryview_hex_impl(PyMemoryViewObject *self, PyObject *sep, @@ -258,4 +258,4 @@ memoryview_hex(PyMemoryViewObject *self, PyObject *const *args, Py_ssize_t nargs exit: return return_value; } -/*[clinic end generated code: output=1b879bb934d18c66 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=48be570b5e6038e3 input=a9049054013a1b77]*/ diff --git a/Objects/clinic/odictobject.c.h b/Objects/clinic/odictobject.c.h index a3ab9ea507f44..5bb9952caa273 100644 --- a/Objects/clinic/odictobject.c.h +++ b/Objects/clinic/odictobject.c.h @@ -9,7 +9,7 @@ PyDoc_STRVAR(OrderedDict_fromkeys__doc__, "Create a new ordered dictionary with keys from iterable and values set to value."); #define ORDEREDDICT_FROMKEYS_METHODDEF \ - {"fromkeys", (PyCFunction)(void(*)(void))OrderedDict_fromkeys, METH_FASTCALL|METH_KEYWORDS|METH_CLASS, OrderedDict_fromkeys__doc__}, + {"fromkeys", _PyCFunction_CAST(OrderedDict_fromkeys), METH_FASTCALL|METH_KEYWORDS|METH_CLASS, OrderedDict_fromkeys__doc__}, static PyObject * OrderedDict_fromkeys_impl(PyTypeObject *type, PyObject *seq, PyObject *value); @@ -50,7 +50,7 @@ PyDoc_STRVAR(OrderedDict_setdefault__doc__, "Return the value for key if key is in the dictionary, else default."); #define ORDEREDDICT_SETDEFAULT_METHODDEF \ - {"setdefault", (PyCFunction)(void(*)(void))OrderedDict_setdefault, METH_FASTCALL|METH_KEYWORDS, OrderedDict_setdefault__doc__}, + {"setdefault", _PyCFunction_CAST(OrderedDict_setdefault), METH_FASTCALL|METH_KEYWORDS, OrderedDict_setdefault__doc__}, static PyObject * OrderedDict_setdefault_impl(PyODictObject *self, PyObject *key, @@ -93,7 +93,7 @@ PyDoc_STRVAR(OrderedDict_pop__doc__, "raise a KeyError."); #define ORDEREDDICT_POP_METHODDEF \ - {"pop", (PyCFunction)(void(*)(void))OrderedDict_pop, METH_FASTCALL|METH_KEYWORDS, OrderedDict_pop__doc__}, + {"pop", _PyCFunction_CAST(OrderedDict_pop), METH_FASTCALL|METH_KEYWORDS, OrderedDict_pop__doc__}, static PyObject * OrderedDict_pop_impl(PyODictObject *self, PyObject *key, @@ -135,7 +135,7 @@ PyDoc_STRVAR(OrderedDict_popitem__doc__, "Pairs are returned in LIFO order if last is true or FIFO order if false."); #define ORDEREDDICT_POPITEM_METHODDEF \ - {"popitem", (PyCFunction)(void(*)(void))OrderedDict_popitem, METH_FASTCALL|METH_KEYWORDS, OrderedDict_popitem__doc__}, + {"popitem", _PyCFunction_CAST(OrderedDict_popitem), METH_FASTCALL|METH_KEYWORDS, OrderedDict_popitem__doc__}, static PyObject * OrderedDict_popitem_impl(PyODictObject *self, int last); @@ -177,7 +177,7 @@ PyDoc_STRVAR(OrderedDict_move_to_end__doc__, "Raise KeyError if the element does not exist."); #define ORDEREDDICT_MOVE_TO_END_METHODDEF \ - {"move_to_end", (PyCFunction)(void(*)(void))OrderedDict_move_to_end, METH_FASTCALL|METH_KEYWORDS, OrderedDict_move_to_end__doc__}, + {"move_to_end", _PyCFunction_CAST(OrderedDict_move_to_end), METH_FASTCALL|METH_KEYWORDS, OrderedDict_move_to_end__doc__}, static PyObject * OrderedDict_move_to_end_impl(PyODictObject *self, PyObject *key, int last); @@ -211,4 +211,4 @@ OrderedDict_move_to_end(PyODictObject *self, PyObject *const *args, Py_ssize_t n exit: return return_value; } -/*[clinic end generated code: output=e0afaad5b4bb47fe input=a9049054013a1b77]*/ +/*[clinic end generated code: output=4182a5dab66963d0 input=a9049054013a1b77]*/ diff --git a/Objects/clinic/tupleobject.c.h b/Objects/clinic/tupleobject.c.h index f65e5fa14ebd7..224fc0c374f01 100644 --- a/Objects/clinic/tupleobject.c.h +++ b/Objects/clinic/tupleobject.c.h @@ -11,7 +11,7 @@ PyDoc_STRVAR(tuple_index__doc__, "Raises ValueError if the value is not present."); #define TUPLE_INDEX_METHODDEF \ - {"index", (PyCFunction)(void(*)(void))tuple_index, METH_FASTCALL, tuple_index__doc__}, + {"index", _PyCFunction_CAST(tuple_index), METH_FASTCALL, tuple_index__doc__}, static PyObject * tuple_index_impl(PyTupleObject *self, PyObject *value, Py_ssize_t start, @@ -112,4 +112,4 @@ tuple___getnewargs__(PyTupleObject *self, PyObject *Py_UNUSED(ignored)) { return tuple___getnewargs___impl(self); } -/*[clinic end generated code: output=72cc0bc4f7358116 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=044496dc917f8a97 input=a9049054013a1b77]*/ diff --git a/Objects/clinic/unicodeobject.c.h b/Objects/clinic/unicodeobject.c.h index b9892403a2036..07877693c26e3 100644 --- a/Objects/clinic/unicodeobject.c.h +++ b/Objects/clinic/unicodeobject.c.h @@ -89,7 +89,7 @@ PyDoc_STRVAR(unicode_center__doc__, "Padding is done using the specified fill character (default is a space)."); #define UNICODE_CENTER_METHODDEF \ - {"center", (PyCFunction)(void(*)(void))unicode_center, METH_FASTCALL, unicode_center__doc__}, + {"center", _PyCFunction_CAST(unicode_center), METH_FASTCALL, unicode_center__doc__}, static PyObject * unicode_center_impl(PyObject *self, Py_ssize_t width, Py_UCS4 fillchar); @@ -145,7 +145,7 @@ PyDoc_STRVAR(unicode_encode__doc__, " codecs.register_error that can handle UnicodeEncodeErrors."); #define UNICODE_ENCODE_METHODDEF \ - {"encode", (PyCFunction)(void(*)(void))unicode_encode, METH_FASTCALL|METH_KEYWORDS, unicode_encode__doc__}, + {"encode", _PyCFunction_CAST(unicode_encode), METH_FASTCALL|METH_KEYWORDS, unicode_encode__doc__}, static PyObject * unicode_encode_impl(PyObject *self, const char *encoding, const char *errors); @@ -215,7 +215,7 @@ PyDoc_STRVAR(unicode_expandtabs__doc__, "If tabsize is not given, a tab size of 8 characters is assumed."); #define UNICODE_EXPANDTABS_METHODDEF \ - {"expandtabs", (PyCFunction)(void(*)(void))unicode_expandtabs, METH_FASTCALL|METH_KEYWORDS, unicode_expandtabs__doc__}, + {"expandtabs", _PyCFunction_CAST(unicode_expandtabs), METH_FASTCALL|METH_KEYWORDS, unicode_expandtabs__doc__}, static PyObject * unicode_expandtabs_impl(PyObject *self, int tabsize); @@ -523,7 +523,7 @@ PyDoc_STRVAR(unicode_ljust__doc__, "Padding is done using the specified fill character (default is a space)."); #define UNICODE_LJUST_METHODDEF \ - {"ljust", (PyCFunction)(void(*)(void))unicode_ljust, METH_FASTCALL, unicode_ljust__doc__}, + {"ljust", _PyCFunction_CAST(unicode_ljust), METH_FASTCALL, unicode_ljust__doc__}, static PyObject * unicode_ljust_impl(PyObject *self, Py_ssize_t width, Py_UCS4 fillchar); @@ -590,7 +590,7 @@ PyDoc_STRVAR(unicode_strip__doc__, "If chars is given and not None, remove characters in chars instead."); #define UNICODE_STRIP_METHODDEF \ - {"strip", (PyCFunction)(void(*)(void))unicode_strip, METH_FASTCALL, unicode_strip__doc__}, + {"strip", _PyCFunction_CAST(unicode_strip), METH_FASTCALL, unicode_strip__doc__}, static PyObject * unicode_strip_impl(PyObject *self, PyObject *chars); @@ -624,7 +624,7 @@ PyDoc_STRVAR(unicode_lstrip__doc__, "If chars is given and not None, remove characters in chars instead."); #define UNICODE_LSTRIP_METHODDEF \ - {"lstrip", (PyCFunction)(void(*)(void))unicode_lstrip, METH_FASTCALL, unicode_lstrip__doc__}, + {"lstrip", _PyCFunction_CAST(unicode_lstrip), METH_FASTCALL, unicode_lstrip__doc__}, static PyObject * unicode_lstrip_impl(PyObject *self, PyObject *chars); @@ -658,7 +658,7 @@ PyDoc_STRVAR(unicode_rstrip__doc__, "If chars is given and not None, remove characters in chars instead."); #define UNICODE_RSTRIP_METHODDEF \ - {"rstrip", (PyCFunction)(void(*)(void))unicode_rstrip, METH_FASTCALL, unicode_rstrip__doc__}, + {"rstrip", _PyCFunction_CAST(unicode_rstrip), METH_FASTCALL, unicode_rstrip__doc__}, static PyObject * unicode_rstrip_impl(PyObject *self, PyObject *chars); @@ -697,7 +697,7 @@ PyDoc_STRVAR(unicode_replace__doc__, "replaced."); #define UNICODE_REPLACE_METHODDEF \ - {"replace", (PyCFunction)(void(*)(void))unicode_replace, METH_FASTCALL, unicode_replace__doc__}, + {"replace", _PyCFunction_CAST(unicode_replace), METH_FASTCALL, unicode_replace__doc__}, static PyObject * unicode_replace_impl(PyObject *self, PyObject *old, PyObject *new, @@ -832,7 +832,7 @@ PyDoc_STRVAR(unicode_rjust__doc__, "Padding is done using the specified fill character (default is a space)."); #define UNICODE_RJUST_METHODDEF \ - {"rjust", (PyCFunction)(void(*)(void))unicode_rjust, METH_FASTCALL, unicode_rjust__doc__}, + {"rjust", _PyCFunction_CAST(unicode_rjust), METH_FASTCALL, unicode_rjust__doc__}, static PyObject * unicode_rjust_impl(PyObject *self, Py_ssize_t width, Py_UCS4 fillchar); @@ -893,7 +893,7 @@ PyDoc_STRVAR(unicode_split__doc__, "the regular expression module."); #define UNICODE_SPLIT_METHODDEF \ - {"split", (PyCFunction)(void(*)(void))unicode_split, METH_FASTCALL|METH_KEYWORDS, unicode_split__doc__}, + {"split", _PyCFunction_CAST(unicode_split), METH_FASTCALL|METH_KEYWORDS, unicode_split__doc__}, static PyObject * unicode_split_impl(PyObject *self, PyObject *sep, Py_ssize_t maxsplit); @@ -992,7 +992,7 @@ PyDoc_STRVAR(unicode_rsplit__doc__, "Splitting starts at the end of the string and works to the front."); #define UNICODE_RSPLIT_METHODDEF \ - {"rsplit", (PyCFunction)(void(*)(void))unicode_rsplit, METH_FASTCALL|METH_KEYWORDS, unicode_rsplit__doc__}, + {"rsplit", _PyCFunction_CAST(unicode_rsplit), METH_FASTCALL|METH_KEYWORDS, unicode_rsplit__doc__}, static PyObject * unicode_rsplit_impl(PyObject *self, PyObject *sep, Py_ssize_t maxsplit); @@ -1050,7 +1050,7 @@ PyDoc_STRVAR(unicode_splitlines__doc__, "true."); #define UNICODE_SPLITLINES_METHODDEF \ - {"splitlines", (PyCFunction)(void(*)(void))unicode_splitlines, METH_FASTCALL|METH_KEYWORDS, unicode_splitlines__doc__}, + {"splitlines", _PyCFunction_CAST(unicode_splitlines), METH_FASTCALL|METH_KEYWORDS, unicode_splitlines__doc__}, static PyObject * unicode_splitlines_impl(PyObject *self, int keepends); @@ -1116,7 +1116,7 @@ PyDoc_STRVAR(unicode_maketrans__doc__, "must be a string, whose characters will be mapped to None in the result."); #define UNICODE_MAKETRANS_METHODDEF \ - {"maketrans", (PyCFunction)(void(*)(void))unicode_maketrans, METH_FASTCALL|METH_STATIC, unicode_maketrans__doc__}, + {"maketrans", _PyCFunction_CAST(unicode_maketrans), METH_FASTCALL|METH_STATIC, unicode_maketrans__doc__}, static PyObject * unicode_maketrans_impl(PyObject *x, PyObject *y, PyObject *z); @@ -1353,4 +1353,4 @@ unicode_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) exit: return return_value; } -/*[clinic end generated code: output=e8566b060f558f72 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=b5dd7cefead9a8e7 input=a9049054013a1b77]*/ diff --git a/Objects/stringlib/clinic/transmogrify.h.h b/Objects/stringlib/clinic/transmogrify.h.h index a5135a0cba0f2..b88517bd3649a 100644 --- a/Objects/stringlib/clinic/transmogrify.h.h +++ b/Objects/stringlib/clinic/transmogrify.h.h @@ -11,7 +11,7 @@ PyDoc_STRVAR(stringlib_expandtabs__doc__, "If tabsize is not given, a tab size of 8 characters is assumed."); #define STRINGLIB_EXPANDTABS_METHODDEF \ - {"expandtabs", (PyCFunction)(void(*)(void))stringlib_expandtabs, METH_FASTCALL|METH_KEYWORDS, stringlib_expandtabs__doc__}, + {"expandtabs", _PyCFunction_CAST(stringlib_expandtabs), METH_FASTCALL|METH_KEYWORDS, stringlib_expandtabs__doc__}, static PyObject * stringlib_expandtabs_impl(PyObject *self, int tabsize); @@ -53,7 +53,7 @@ PyDoc_STRVAR(stringlib_ljust__doc__, "Padding is done using the specified fill character."); #define STRINGLIB_LJUST_METHODDEF \ - {"ljust", (PyCFunction)(void(*)(void))stringlib_ljust, METH_FASTCALL, stringlib_ljust__doc__}, + {"ljust", _PyCFunction_CAST(stringlib_ljust), METH_FASTCALL, stringlib_ljust__doc__}, static PyObject * stringlib_ljust_impl(PyObject *self, Py_ssize_t width, char fillchar); @@ -109,7 +109,7 @@ PyDoc_STRVAR(stringlib_rjust__doc__, "Padding is done using the specified fill character."); #define STRINGLIB_RJUST_METHODDEF \ - {"rjust", (PyCFunction)(void(*)(void))stringlib_rjust, METH_FASTCALL, stringlib_rjust__doc__}, + {"rjust", _PyCFunction_CAST(stringlib_rjust), METH_FASTCALL, stringlib_rjust__doc__}, static PyObject * stringlib_rjust_impl(PyObject *self, Py_ssize_t width, char fillchar); @@ -165,7 +165,7 @@ PyDoc_STRVAR(stringlib_center__doc__, "Padding is done using the specified fill character."); #define STRINGLIB_CENTER_METHODDEF \ - {"center", (PyCFunction)(void(*)(void))stringlib_center, METH_FASTCALL, stringlib_center__doc__}, + {"center", _PyCFunction_CAST(stringlib_center), METH_FASTCALL, stringlib_center__doc__}, static PyObject * stringlib_center_impl(PyObject *self, Py_ssize_t width, char fillchar); @@ -249,4 +249,4 @@ stringlib_zfill(PyObject *self, PyObject *arg) exit: return return_value; } -/*[clinic end generated code: output=2d9abc7b1cffeca6 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=46d058103bffedf7 input=a9049054013a1b77]*/ diff --git a/PC/clinic/_msi.c.h b/PC/clinic/_msi.c.h index 85c4d226ee408..fd21142158312 100644 --- a/PC/clinic/_msi.c.h +++ b/PC/clinic/_msi.c.h @@ -33,7 +33,7 @@ PyDoc_STRVAR(_msi_FCICreate__doc__, " and the name of the file inside the CAB file"); #define _MSI_FCICREATE_METHODDEF \ - {"FCICreate", (PyCFunction)(void(*)(void))_msi_FCICreate, METH_FASTCALL, _msi_FCICreate__doc__}, + {"FCICreate", _PyCFunction_CAST(_msi_FCICreate), METH_FASTCALL, _msi_FCICreate__doc__}, static PyObject * _msi_FCICreate_impl(PyObject *module, const char *cabname, PyObject *files); @@ -185,7 +185,7 @@ PyDoc_STRVAR(_msi_Record_SetString__doc__, "Set field to a string value."); #define _MSI_RECORD_SETSTRING_METHODDEF \ - {"SetString", (PyCFunction)(void(*)(void))_msi_Record_SetString, METH_FASTCALL, _msi_Record_SetString__doc__}, + {"SetString", _PyCFunction_CAST(_msi_Record_SetString), METH_FASTCALL, _msi_Record_SetString__doc__}, static PyObject * _msi_Record_SetString_impl(msiobj *self, int field, const Py_UNICODE *value); @@ -234,7 +234,7 @@ PyDoc_STRVAR(_msi_Record_SetStream__doc__, "Set field to the contents of the file named value."); #define _MSI_RECORD_SETSTREAM_METHODDEF \ - {"SetStream", (PyCFunction)(void(*)(void))_msi_Record_SetStream, METH_FASTCALL, _msi_Record_SetStream__doc__}, + {"SetStream", _PyCFunction_CAST(_msi_Record_SetStream), METH_FASTCALL, _msi_Record_SetStream__doc__}, static PyObject * _msi_Record_SetStream_impl(msiobj *self, int field, const Py_UNICODE *value); @@ -283,7 +283,7 @@ PyDoc_STRVAR(_msi_Record_SetInteger__doc__, "Set field to an integer value."); #define _MSI_RECORD_SETINTEGER_METHODDEF \ - {"SetInteger", (PyCFunction)(void(*)(void))_msi_Record_SetInteger, METH_FASTCALL, _msi_Record_SetInteger__doc__}, + {"SetInteger", _PyCFunction_CAST(_msi_Record_SetInteger), METH_FASTCALL, _msi_Record_SetInteger__doc__}, static PyObject * _msi_Record_SetInteger_impl(msiobj *self, int field, int value); @@ -373,7 +373,7 @@ PyDoc_STRVAR(_msi_SummaryInformation_SetProperty__doc__, " the new value of the property (integer or string)"); #define _MSI_SUMMARYINFORMATION_SETPROPERTY_METHODDEF \ - {"SetProperty", (PyCFunction)(void(*)(void))_msi_SummaryInformation_SetProperty, METH_FASTCALL, _msi_SummaryInformation_SetProperty__doc__}, + {"SetProperty", _PyCFunction_CAST(_msi_SummaryInformation_SetProperty), METH_FASTCALL, _msi_SummaryInformation_SetProperty__doc__}, static PyObject * _msi_SummaryInformation_SetProperty_impl(msiobj *self, int field, @@ -492,7 +492,7 @@ PyDoc_STRVAR(_msi_View_Modify__doc__, " a record describing the new data"); #define _MSI_VIEW_MODIFY_METHODDEF \ - {"Modify", (PyCFunction)(void(*)(void))_msi_View_Modify, METH_FASTCALL, _msi_View_Modify__doc__}, + {"Modify", _PyCFunction_CAST(_msi_View_Modify), METH_FASTCALL, _msi_View_Modify__doc__}, static PyObject * _msi_View_Modify_impl(msiobj *self, int kind, PyObject *data); @@ -641,7 +641,7 @@ PyDoc_STRVAR(_msi_OpenDatabase__doc__, " the persistence mode"); #define _MSI_OPENDATABASE_METHODDEF \ - {"OpenDatabase", (PyCFunction)(void(*)(void))_msi_OpenDatabase, METH_FASTCALL, _msi_OpenDatabase__doc__}, + {"OpenDatabase", _PyCFunction_CAST(_msi_OpenDatabase), METH_FASTCALL, _msi_OpenDatabase__doc__}, static PyObject * _msi_OpenDatabase_impl(PyObject *module, const Py_UNICODE *path, int persist); @@ -713,4 +713,4 @@ _msi_CreateRecord(PyObject *module, PyObject *arg) exit: return return_value; } -/*[clinic end generated code: output=49debf733ee5cab2 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=d7eb07e6bfcdc13f input=a9049054013a1b77]*/ diff --git a/PC/clinic/_testconsole.c.h b/PC/clinic/_testconsole.c.h index cf5e4ee09063a..b2fd515e77a12 100644 --- a/PC/clinic/_testconsole.c.h +++ b/PC/clinic/_testconsole.c.h @@ -11,7 +11,7 @@ PyDoc_STRVAR(_testconsole_write_input__doc__, "Writes UTF-16-LE encoded bytes to the console as if typed by a user."); #define _TESTCONSOLE_WRITE_INPUT_METHODDEF \ - {"write_input", (PyCFunction)(void(*)(void))_testconsole_write_input, METH_FASTCALL|METH_KEYWORDS, _testconsole_write_input__doc__}, + {"write_input", _PyCFunction_CAST(_testconsole_write_input), METH_FASTCALL|METH_KEYWORDS, _testconsole_write_input__doc__}, static PyObject * _testconsole_write_input_impl(PyObject *module, PyObject *file, @@ -54,7 +54,7 @@ PyDoc_STRVAR(_testconsole_read_output__doc__, "Reads a str from the console as written to stdout."); #define _TESTCONSOLE_READ_OUTPUT_METHODDEF \ - {"read_output", (PyCFunction)(void(*)(void))_testconsole_read_output, METH_FASTCALL|METH_KEYWORDS, _testconsole_read_output__doc__}, + {"read_output", _PyCFunction_CAST(_testconsole_read_output), METH_FASTCALL|METH_KEYWORDS, _testconsole_read_output__doc__}, static PyObject * _testconsole_read_output_impl(PyObject *module, PyObject *file); @@ -88,4 +88,4 @@ _testconsole_read_output(PyObject *module, PyObject *const *args, Py_ssize_t nar #ifndef _TESTCONSOLE_READ_OUTPUT_METHODDEF #define _TESTCONSOLE_READ_OUTPUT_METHODDEF #endif /* !defined(_TESTCONSOLE_READ_OUTPUT_METHODDEF) */ -/*[clinic end generated code: output=dd8b093a91b62753 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=6e9f8b0766eb5a0e input=a9049054013a1b77]*/ diff --git a/PC/clinic/msvcrtmodule.c.h b/PC/clinic/msvcrtmodule.c.h index 1ac82cb965b64..ea95897590fe4 100644 --- a/PC/clinic/msvcrtmodule.c.h +++ b/PC/clinic/msvcrtmodule.c.h @@ -37,7 +37,7 @@ PyDoc_STRVAR(msvcrt_locking__doc__, "individually."); #define MSVCRT_LOCKING_METHODDEF \ - {"locking", (PyCFunction)(void(*)(void))msvcrt_locking, METH_FASTCALL, msvcrt_locking__doc__}, + {"locking", _PyCFunction_CAST(msvcrt_locking), METH_FASTCALL, msvcrt_locking__doc__}, static PyObject * msvcrt_locking_impl(PyObject *module, int fd, int mode, long nbytes); @@ -83,7 +83,7 @@ PyDoc_STRVAR(msvcrt_setmode__doc__, "Return value is the previous mode."); #define MSVCRT_SETMODE_METHODDEF \ - {"setmode", (PyCFunction)(void(*)(void))msvcrt_setmode, METH_FASTCALL, msvcrt_setmode__doc__}, + {"setmode", _PyCFunction_CAST(msvcrt_setmode), METH_FASTCALL, msvcrt_setmode__doc__}, static long msvcrt_setmode_impl(PyObject *module, int fd, int flags); @@ -128,7 +128,7 @@ PyDoc_STRVAR(msvcrt_open_osfhandle__doc__, "to os.fdopen() to create a file object."); #define MSVCRT_OPEN_OSFHANDLE_METHODDEF \ - {"open_osfhandle", (PyCFunction)(void(*)(void))msvcrt_open_osfhandle, METH_FASTCALL, msvcrt_open_osfhandle__doc__}, + {"open_osfhandle", _PyCFunction_CAST(msvcrt_open_osfhandle), METH_FASTCALL, msvcrt_open_osfhandle__doc__}, static long msvcrt_open_osfhandle_impl(PyObject *module, void *handle, int flags); @@ -475,7 +475,7 @@ PyDoc_STRVAR(msvcrt_CrtSetReportFile__doc__, "Only available on Debug builds."); #define MSVCRT_CRTSETREPORTFILE_METHODDEF \ - {"CrtSetReportFile", (PyCFunction)(void(*)(void))msvcrt_CrtSetReportFile, METH_FASTCALL, msvcrt_CrtSetReportFile__doc__}, + {"CrtSetReportFile", _PyCFunction_CAST(msvcrt_CrtSetReportFile), METH_FASTCALL, msvcrt_CrtSetReportFile__doc__}, static void * msvcrt_CrtSetReportFile_impl(PyObject *module, int type, void *file); @@ -515,7 +515,7 @@ PyDoc_STRVAR(msvcrt_CrtSetReportMode__doc__, "Only available on Debug builds."); #define MSVCRT_CRTSETREPORTMODE_METHODDEF \ - {"CrtSetReportMode", (PyCFunction)(void(*)(void))msvcrt_CrtSetReportMode, METH_FASTCALL, msvcrt_CrtSetReportMode__doc__}, + {"CrtSetReportMode", _PyCFunction_CAST(msvcrt_CrtSetReportMode), METH_FASTCALL, msvcrt_CrtSetReportMode__doc__}, static long msvcrt_CrtSetReportMode_impl(PyObject *module, int type, int mode); @@ -647,4 +647,4 @@ msvcrt_SetErrorMode(PyObject *module, PyObject *arg) #ifndef MSVCRT_SET_ERROR_MODE_METHODDEF #define MSVCRT_SET_ERROR_MODE_METHODDEF #endif /* !defined(MSVCRT_SET_ERROR_MODE_METHODDEF) */ -/*[clinic end generated code: output=20dfbc768edce7c0 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=b543933cad520f2b input=a9049054013a1b77]*/ diff --git a/PC/clinic/winreg.c.h b/PC/clinic/winreg.c.h index 183301f061866..8bcb290ecd3b5 100644 --- a/PC/clinic/winreg.c.h +++ b/PC/clinic/winreg.c.h @@ -77,7 +77,7 @@ PyDoc_STRVAR(winreg_HKEYType___exit____doc__, "\n"); #define WINREG_HKEYTYPE___EXIT___METHODDEF \ - {"__exit__", (PyCFunction)(void(*)(void))winreg_HKEYType___exit__, METH_FASTCALL|METH_KEYWORDS, winreg_HKEYType___exit____doc__}, + {"__exit__", _PyCFunction_CAST(winreg_HKEYType___exit__), METH_FASTCALL|METH_KEYWORDS, winreg_HKEYType___exit____doc__}, static PyObject * winreg_HKEYType___exit___impl(PyHKEYObject *self, PyObject *exc_type, @@ -138,7 +138,7 @@ PyDoc_STRVAR(winreg_ConnectRegistry__doc__, "If the function fails, an OSError exception is raised."); #define WINREG_CONNECTREGISTRY_METHODDEF \ - {"ConnectRegistry", (PyCFunction)(void(*)(void))winreg_ConnectRegistry, METH_FASTCALL, winreg_ConnectRegistry__doc__}, + {"ConnectRegistry", _PyCFunction_CAST(winreg_ConnectRegistry), METH_FASTCALL, winreg_ConnectRegistry__doc__}, static HKEY winreg_ConnectRegistry_impl(PyObject *module, @@ -210,7 +210,7 @@ PyDoc_STRVAR(winreg_CreateKey__doc__, "If the function fails, an OSError exception is raised."); #define WINREG_CREATEKEY_METHODDEF \ - {"CreateKey", (PyCFunction)(void(*)(void))winreg_CreateKey, METH_FASTCALL, winreg_CreateKey__doc__}, + {"CreateKey", _PyCFunction_CAST(winreg_CreateKey), METH_FASTCALL, winreg_CreateKey__doc__}, static HKEY winreg_CreateKey_impl(PyObject *module, HKEY key, const Py_UNICODE *sub_key); @@ -287,7 +287,7 @@ PyDoc_STRVAR(winreg_CreateKeyEx__doc__, "If the function fails, an OSError exception is raised."); #define WINREG_CREATEKEYEX_METHODDEF \ - {"CreateKeyEx", (PyCFunction)(void(*)(void))winreg_CreateKeyEx, METH_FASTCALL|METH_KEYWORDS, winreg_CreateKeyEx__doc__}, + {"CreateKeyEx", _PyCFunction_CAST(winreg_CreateKeyEx), METH_FASTCALL|METH_KEYWORDS, winreg_CreateKeyEx__doc__}, static HKEY winreg_CreateKeyEx_impl(PyObject *module, HKEY key, @@ -344,7 +344,7 @@ PyDoc_STRVAR(winreg_DeleteKey__doc__, "is removed. If the function fails, an OSError exception is raised."); #define WINREG_DELETEKEY_METHODDEF \ - {"DeleteKey", (PyCFunction)(void(*)(void))winreg_DeleteKey, METH_FASTCALL, winreg_DeleteKey__doc__}, + {"DeleteKey", _PyCFunction_CAST(winreg_DeleteKey), METH_FASTCALL, winreg_DeleteKey__doc__}, static PyObject * winreg_DeleteKey_impl(PyObject *module, HKEY key, const Py_UNICODE *sub_key); @@ -411,7 +411,7 @@ PyDoc_STRVAR(winreg_DeleteKeyEx__doc__, "On unsupported Windows versions, NotImplementedError is raised."); #define WINREG_DELETEKEYEX_METHODDEF \ - {"DeleteKeyEx", (PyCFunction)(void(*)(void))winreg_DeleteKeyEx, METH_FASTCALL|METH_KEYWORDS, winreg_DeleteKeyEx__doc__}, + {"DeleteKeyEx", _PyCFunction_CAST(winreg_DeleteKeyEx), METH_FASTCALL|METH_KEYWORDS, winreg_DeleteKeyEx__doc__}, static PyObject * winreg_DeleteKeyEx_impl(PyObject *module, HKEY key, @@ -456,7 +456,7 @@ PyDoc_STRVAR(winreg_DeleteValue__doc__, " A string that identifies the value to remove."); #define WINREG_DELETEVALUE_METHODDEF \ - {"DeleteValue", (PyCFunction)(void(*)(void))winreg_DeleteValue, METH_FASTCALL, winreg_DeleteValue__doc__}, + {"DeleteValue", _PyCFunction_CAST(winreg_DeleteValue), METH_FASTCALL, winreg_DeleteValue__doc__}, static PyObject * winreg_DeleteValue_impl(PyObject *module, HKEY key, const Py_UNICODE *value); @@ -518,7 +518,7 @@ PyDoc_STRVAR(winreg_EnumKey__doc__, "raised, indicating no more values are available."); #define WINREG_ENUMKEY_METHODDEF \ - {"EnumKey", (PyCFunction)(void(*)(void))winreg_EnumKey, METH_FASTCALL, winreg_EnumKey__doc__}, + {"EnumKey", _PyCFunction_CAST(winreg_EnumKey), METH_FASTCALL, winreg_EnumKey__doc__}, static PyObject * winreg_EnumKey_impl(PyObject *module, HKEY key, int index); @@ -571,7 +571,7 @@ PyDoc_STRVAR(winreg_EnumValue__doc__, " An integer that identifies the type of the value data."); #define WINREG_ENUMVALUE_METHODDEF \ - {"EnumValue", (PyCFunction)(void(*)(void))winreg_EnumValue, METH_FASTCALL, winreg_EnumValue__doc__}, + {"EnumValue", _PyCFunction_CAST(winreg_EnumValue), METH_FASTCALL, winreg_EnumValue__doc__}, static PyObject * winreg_EnumValue_impl(PyObject *module, HKEY key, int index); @@ -710,7 +710,7 @@ PyDoc_STRVAR(winreg_LoadKey__doc__, "tree."); #define WINREG_LOADKEY_METHODDEF \ - {"LoadKey", (PyCFunction)(void(*)(void))winreg_LoadKey, METH_FASTCALL, winreg_LoadKey__doc__}, + {"LoadKey", _PyCFunction_CAST(winreg_LoadKey), METH_FASTCALL, winreg_LoadKey__doc__}, static PyObject * winreg_LoadKey_impl(PyObject *module, HKEY key, const Py_UNICODE *sub_key, @@ -789,7 +789,7 @@ PyDoc_STRVAR(winreg_OpenKey__doc__, "If the function fails, an OSError exception is raised."); #define WINREG_OPENKEY_METHODDEF \ - {"OpenKey", (PyCFunction)(void(*)(void))winreg_OpenKey, METH_FASTCALL|METH_KEYWORDS, winreg_OpenKey__doc__}, + {"OpenKey", _PyCFunction_CAST(winreg_OpenKey), METH_FASTCALL|METH_KEYWORDS, winreg_OpenKey__doc__}, static HKEY winreg_OpenKey_impl(PyObject *module, HKEY key, const Py_UNICODE *sub_key, @@ -846,7 +846,7 @@ PyDoc_STRVAR(winreg_OpenKeyEx__doc__, "If the function fails, an OSError exception is raised."); #define WINREG_OPENKEYEX_METHODDEF \ - {"OpenKeyEx", (PyCFunction)(void(*)(void))winreg_OpenKeyEx, METH_FASTCALL|METH_KEYWORDS, winreg_OpenKeyEx__doc__}, + {"OpenKeyEx", _PyCFunction_CAST(winreg_OpenKeyEx), METH_FASTCALL|METH_KEYWORDS, winreg_OpenKeyEx__doc__}, static HKEY winreg_OpenKeyEx_impl(PyObject *module, HKEY key, const Py_UNICODE *sub_key, @@ -940,7 +940,7 @@ PyDoc_STRVAR(winreg_QueryValue__doc__, "completeness."); #define WINREG_QUERYVALUE_METHODDEF \ - {"QueryValue", (PyCFunction)(void(*)(void))winreg_QueryValue, METH_FASTCALL, winreg_QueryValue__doc__}, + {"QueryValue", _PyCFunction_CAST(winreg_QueryValue), METH_FASTCALL, winreg_QueryValue__doc__}, static PyObject * winreg_QueryValue_impl(PyObject *module, HKEY key, const Py_UNICODE *sub_key); @@ -1003,7 +1003,7 @@ PyDoc_STRVAR(winreg_QueryValueEx__doc__, "The return value is a tuple of the value and the type_id."); #define WINREG_QUERYVALUEEX_METHODDEF \ - {"QueryValueEx", (PyCFunction)(void(*)(void))winreg_QueryValueEx, METH_FASTCALL, winreg_QueryValueEx__doc__}, + {"QueryValueEx", _PyCFunction_CAST(winreg_QueryValueEx), METH_FASTCALL, winreg_QueryValueEx__doc__}, static PyObject * winreg_QueryValueEx_impl(PyObject *module, HKEY key, const Py_UNICODE *name); @@ -1071,7 +1071,7 @@ PyDoc_STRVAR(winreg_SaveKey__doc__, "to the API."); #define WINREG_SAVEKEY_METHODDEF \ - {"SaveKey", (PyCFunction)(void(*)(void))winreg_SaveKey, METH_FASTCALL, winreg_SaveKey__doc__}, + {"SaveKey", _PyCFunction_CAST(winreg_SaveKey), METH_FASTCALL, winreg_SaveKey__doc__}, static PyObject * winreg_SaveKey_impl(PyObject *module, HKEY key, const Py_UNICODE *file_name); @@ -1139,7 +1139,7 @@ PyDoc_STRVAR(winreg_SetValue__doc__, "KEY_SET_VALUE access."); #define WINREG_SETVALUE_METHODDEF \ - {"SetValue", (PyCFunction)(void(*)(void))winreg_SetValue, METH_FASTCALL, winreg_SetValue__doc__}, + {"SetValue", _PyCFunction_CAST(winreg_SetValue), METH_FASTCALL, winreg_SetValue__doc__}, static PyObject * winreg_SetValue_impl(PyObject *module, HKEY key, const Py_UNICODE *sub_key, @@ -1213,7 +1213,7 @@ PyDoc_STRVAR(winreg_SetValueEx__doc__, "the configuration registry to help the registry perform efficiently."); #define WINREG_SETVALUEEX_METHODDEF \ - {"SetValueEx", (PyCFunction)(void(*)(void))winreg_SetValueEx, METH_FASTCALL, winreg_SetValueEx__doc__}, + {"SetValueEx", _PyCFunction_CAST(winreg_SetValueEx), METH_FASTCALL, winreg_SetValueEx__doc__}, static PyObject * winreg_SetValueEx_impl(PyObject *module, HKEY key, @@ -1346,4 +1346,4 @@ winreg_QueryReflectionKey(PyObject *module, PyObject *arg) exit: return return_value; } -/*[clinic end generated code: output=497a2e804821d5c9 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=c3454803528f6e97 input=a9049054013a1b77]*/ diff --git a/PC/clinic/winsound.c.h b/PC/clinic/winsound.c.h index c5458990baa7f..9f99b8e400261 100644 --- a/PC/clinic/winsound.c.h +++ b/PC/clinic/winsound.c.h @@ -14,7 +14,7 @@ PyDoc_STRVAR(winsound_PlaySound__doc__, " Flag values, ored together. See module documentation."); #define WINSOUND_PLAYSOUND_METHODDEF \ - {"PlaySound", (PyCFunction)(void(*)(void))winsound_PlaySound, METH_FASTCALL|METH_KEYWORDS, winsound_PlaySound__doc__}, + {"PlaySound", _PyCFunction_CAST(winsound_PlaySound), METH_FASTCALL|METH_KEYWORDS, winsound_PlaySound__doc__}, static PyObject * winsound_PlaySound_impl(PyObject *module, PyObject *sound, int flags); @@ -57,7 +57,7 @@ PyDoc_STRVAR(winsound_Beep__doc__, " How long the sound should play, in milliseconds."); #define WINSOUND_BEEP_METHODDEF \ - {"Beep", (PyCFunction)(void(*)(void))winsound_Beep, METH_FASTCALL|METH_KEYWORDS, winsound_Beep__doc__}, + {"Beep", _PyCFunction_CAST(winsound_Beep), METH_FASTCALL|METH_KEYWORDS, winsound_Beep__doc__}, static PyObject * winsound_Beep_impl(PyObject *module, int frequency, int duration); @@ -99,7 +99,7 @@ PyDoc_STRVAR(winsound_MessageBeep__doc__, "x defaults to MB_OK."); #define WINSOUND_MESSAGEBEEP_METHODDEF \ - {"MessageBeep", (PyCFunction)(void(*)(void))winsound_MessageBeep, METH_FASTCALL|METH_KEYWORDS, winsound_MessageBeep__doc__}, + {"MessageBeep", _PyCFunction_CAST(winsound_MessageBeep), METH_FASTCALL|METH_KEYWORDS, winsound_MessageBeep__doc__}, static PyObject * winsound_MessageBeep_impl(PyObject *module, int type); @@ -131,4 +131,4 @@ winsound_MessageBeep(PyObject *module, PyObject *const *args, Py_ssize_t nargs, exit: return return_value; } -/*[clinic end generated code: output=16b3c1a96861cd3a input=a9049054013a1b77]*/ +/*[clinic end generated code: output=b7e53fab4f26aeaf input=a9049054013a1b77]*/ diff --git a/Python/clinic/_warnings.c.h b/Python/clinic/_warnings.c.h index ad6b9a8e2428c..aa85c2a0d4d92 100644 --- a/Python/clinic/_warnings.c.h +++ b/Python/clinic/_warnings.c.h @@ -9,7 +9,7 @@ PyDoc_STRVAR(warnings_warn__doc__, "Issue a warning, or maybe ignore it or raise an exception."); #define WARNINGS_WARN_METHODDEF \ - {"warn", (PyCFunction)(void(*)(void))warnings_warn, METH_FASTCALL|METH_KEYWORDS, warnings_warn__doc__}, + {"warn", _PyCFunction_CAST(warnings_warn), METH_FASTCALL|METH_KEYWORDS, warnings_warn__doc__}, static PyObject * warnings_warn_impl(PyObject *module, PyObject *message, PyObject *category, @@ -66,4 +66,4 @@ warnings_warn(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObjec exit: return return_value; } -/*[clinic end generated code: output=eb9997fa998fdbad input=a9049054013a1b77]*/ +/*[clinic end generated code: output=0435c68611fa2fe9 input=a9049054013a1b77]*/ diff --git a/Python/clinic/bltinmodule.c.h b/Python/clinic/bltinmodule.c.h index 4053f5a341e1f..f69b0069ec0f5 100644 --- a/Python/clinic/bltinmodule.c.h +++ b/Python/clinic/bltinmodule.c.h @@ -24,7 +24,7 @@ PyDoc_STRVAR(builtin___import____doc__, "is the number of parent directories to search relative to the current module."); #define BUILTIN___IMPORT___METHODDEF \ - {"__import__", (PyCFunction)(void(*)(void))builtin___import__, METH_FASTCALL|METH_KEYWORDS, builtin___import____doc__}, + {"__import__", _PyCFunction_CAST(builtin___import__), METH_FASTCALL|METH_KEYWORDS, builtin___import____doc__}, static PyObject * builtin___import___impl(PyObject *module, PyObject *name, PyObject *globals, @@ -161,7 +161,7 @@ PyDoc_STRVAR(builtin_format__doc__, "details."); #define BUILTIN_FORMAT_METHODDEF \ - {"format", (PyCFunction)(void(*)(void))builtin_format, METH_FASTCALL, builtin_format__doc__}, + {"format", _PyCFunction_CAST(builtin_format), METH_FASTCALL, builtin_format__doc__}, static PyObject * builtin_format_impl(PyObject *module, PyObject *value, PyObject *format_spec); @@ -242,7 +242,7 @@ PyDoc_STRVAR(builtin_compile__doc__, "in addition to any features explicitly specified."); #define BUILTIN_COMPILE_METHODDEF \ - {"compile", (PyCFunction)(void(*)(void))builtin_compile, METH_FASTCALL|METH_KEYWORDS, builtin_compile__doc__}, + {"compile", _PyCFunction_CAST(builtin_compile), METH_FASTCALL|METH_KEYWORDS, builtin_compile__doc__}, static PyObject * builtin_compile_impl(PyObject *module, PyObject *source, PyObject *filename, @@ -338,7 +338,7 @@ PyDoc_STRVAR(builtin_divmod__doc__, "Return the tuple (x//y, x%y). Invariant: div*y + mod == x."); #define BUILTIN_DIVMOD_METHODDEF \ - {"divmod", (PyCFunction)(void(*)(void))builtin_divmod, METH_FASTCALL, builtin_divmod__doc__}, + {"divmod", _PyCFunction_CAST(builtin_divmod), METH_FASTCALL, builtin_divmod__doc__}, static PyObject * builtin_divmod_impl(PyObject *module, PyObject *x, PyObject *y); @@ -374,7 +374,7 @@ PyDoc_STRVAR(builtin_eval__doc__, "If only globals is given, locals defaults to it."); #define BUILTIN_EVAL_METHODDEF \ - {"eval", (PyCFunction)(void(*)(void))builtin_eval, METH_FASTCALL, builtin_eval__doc__}, + {"eval", _PyCFunction_CAST(builtin_eval), METH_FASTCALL, builtin_eval__doc__}, static PyObject * builtin_eval_impl(PyObject *module, PyObject *source, PyObject *globals, @@ -420,7 +420,7 @@ PyDoc_STRVAR(builtin_exec__doc__, "If only globals is given, locals defaults to it."); #define BUILTIN_EXEC_METHODDEF \ - {"exec", (PyCFunction)(void(*)(void))builtin_exec, METH_FASTCALL, builtin_exec__doc__}, + {"exec", _PyCFunction_CAST(builtin_exec), METH_FASTCALL, builtin_exec__doc__}, static PyObject * builtin_exec_impl(PyObject *module, PyObject *source, PyObject *globals, @@ -483,7 +483,7 @@ PyDoc_STRVAR(builtin_hasattr__doc__, "This is done by calling getattr(obj, name) and catching AttributeError."); #define BUILTIN_HASATTR_METHODDEF \ - {"hasattr", (PyCFunction)(void(*)(void))builtin_hasattr, METH_FASTCALL, builtin_hasattr__doc__}, + {"hasattr", _PyCFunction_CAST(builtin_hasattr), METH_FASTCALL, builtin_hasattr__doc__}, static PyObject * builtin_hasattr_impl(PyObject *module, PyObject *obj, PyObject *name); @@ -527,7 +527,7 @@ PyDoc_STRVAR(builtin_setattr__doc__, "setattr(x, \'y\', v) is equivalent to ``x.y = v\'\'"); #define BUILTIN_SETATTR_METHODDEF \ - {"setattr", (PyCFunction)(void(*)(void))builtin_setattr, METH_FASTCALL, builtin_setattr__doc__}, + {"setattr", _PyCFunction_CAST(builtin_setattr), METH_FASTCALL, builtin_setattr__doc__}, static PyObject * builtin_setattr_impl(PyObject *module, PyObject *obj, PyObject *name, @@ -562,7 +562,7 @@ PyDoc_STRVAR(builtin_delattr__doc__, "delattr(x, \'y\') is equivalent to ``del x.y\'\'"); #define BUILTIN_DELATTR_METHODDEF \ - {"delattr", (PyCFunction)(void(*)(void))builtin_delattr, METH_FASTCALL, builtin_delattr__doc__}, + {"delattr", _PyCFunction_CAST(builtin_delattr), METH_FASTCALL, builtin_delattr__doc__}, static PyObject * builtin_delattr_impl(PyObject *module, PyObject *obj, PyObject *name); @@ -628,7 +628,7 @@ PyDoc_STRVAR(builtin_anext__doc__, "iterator is exhausted, it is returned instead of raising StopAsyncIteration."); #define BUILTIN_ANEXT_METHODDEF \ - {"anext", (PyCFunction)(void(*)(void))builtin_anext, METH_FASTCALL, builtin_anext__doc__}, + {"anext", _PyCFunction_CAST(builtin_anext), METH_FASTCALL, builtin_anext__doc__}, static PyObject * builtin_anext_impl(PyObject *module, PyObject *aiterator, @@ -718,7 +718,7 @@ PyDoc_STRVAR(builtin_pow__doc__, "invoked using the three argument form."); #define BUILTIN_POW_METHODDEF \ - {"pow", (PyCFunction)(void(*)(void))builtin_pow, METH_FASTCALL|METH_KEYWORDS, builtin_pow__doc__}, + {"pow", _PyCFunction_CAST(builtin_pow), METH_FASTCALL|METH_KEYWORDS, builtin_pow__doc__}, static PyObject * builtin_pow_impl(PyObject *module, PyObject *base, PyObject *exp, @@ -769,7 +769,7 @@ PyDoc_STRVAR(builtin_print__doc__, " whether to forcibly flush the stream."); #define BUILTIN_PRINT_METHODDEF \ - {"print", (PyCFunction)(void(*)(void))builtin_print, METH_FASTCALL|METH_KEYWORDS, builtin_print__doc__}, + {"print", _PyCFunction_CAST(builtin_print), METH_FASTCALL|METH_KEYWORDS, builtin_print__doc__}, static PyObject * builtin_print_impl(PyObject *module, PyObject *args, PyObject *sep, @@ -840,7 +840,7 @@ PyDoc_STRVAR(builtin_input__doc__, "On *nix systems, readline is used if available."); #define BUILTIN_INPUT_METHODDEF \ - {"input", (PyCFunction)(void(*)(void))builtin_input, METH_FASTCALL, builtin_input__doc__}, + {"input", _PyCFunction_CAST(builtin_input), METH_FASTCALL, builtin_input__doc__}, static PyObject * builtin_input_impl(PyObject *module, PyObject *prompt); @@ -886,7 +886,7 @@ PyDoc_STRVAR(builtin_round__doc__, "the return value has the same type as the number. ndigits may be negative."); #define BUILTIN_ROUND_METHODDEF \ - {"round", (PyCFunction)(void(*)(void))builtin_round, METH_FASTCALL|METH_KEYWORDS, builtin_round__doc__}, + {"round", _PyCFunction_CAST(builtin_round), METH_FASTCALL|METH_KEYWORDS, builtin_round__doc__}, static PyObject * builtin_round_impl(PyObject *module, PyObject *number, PyObject *ndigits); @@ -929,7 +929,7 @@ PyDoc_STRVAR(builtin_sum__doc__, "reject non-numeric types."); #define BUILTIN_SUM_METHODDEF \ - {"sum", (PyCFunction)(void(*)(void))builtin_sum, METH_FASTCALL|METH_KEYWORDS, builtin_sum__doc__}, + {"sum", _PyCFunction_CAST(builtin_sum), METH_FASTCALL|METH_KEYWORDS, builtin_sum__doc__}, static PyObject * builtin_sum_impl(PyObject *module, PyObject *iterable, PyObject *start); @@ -972,7 +972,7 @@ PyDoc_STRVAR(builtin_isinstance__doc__, "or ...`` etc."); #define BUILTIN_ISINSTANCE_METHODDEF \ - {"isinstance", (PyCFunction)(void(*)(void))builtin_isinstance, METH_FASTCALL, builtin_isinstance__doc__}, + {"isinstance", _PyCFunction_CAST(builtin_isinstance), METH_FASTCALL, builtin_isinstance__doc__}, static PyObject * builtin_isinstance_impl(PyObject *module, PyObject *obj, @@ -1007,7 +1007,7 @@ PyDoc_STRVAR(builtin_issubclass__doc__, "or ...``."); #define BUILTIN_ISSUBCLASS_METHODDEF \ - {"issubclass", (PyCFunction)(void(*)(void))builtin_issubclass, METH_FASTCALL, builtin_issubclass__doc__}, + {"issubclass", _PyCFunction_CAST(builtin_issubclass), METH_FASTCALL, builtin_issubclass__doc__}, static PyObject * builtin_issubclass_impl(PyObject *module, PyObject *cls, @@ -1030,4 +1030,4 @@ builtin_issubclass(PyObject *module, PyObject *const *args, Py_ssize_t nargs) exit: return return_value; } -/*[clinic end generated code: output=d341fa7525f30070 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=6a2b78ef82bc5155 input=a9049054013a1b77]*/ diff --git a/Python/clinic/context.c.h b/Python/clinic/context.c.h index 2ac8bf7c0b8ca..292d3f7f4ff49 100644 --- a/Python/clinic/context.c.h +++ b/Python/clinic/context.c.h @@ -12,7 +12,7 @@ PyDoc_STRVAR(_contextvars_Context_get__doc__, "return None."); #define _CONTEXTVARS_CONTEXT_GET_METHODDEF \ - {"get", (PyCFunction)(void(*)(void))_contextvars_Context_get, METH_FASTCALL, _contextvars_Context_get__doc__}, + {"get", _PyCFunction_CAST(_contextvars_Context_get), METH_FASTCALL, _contextvars_Context_get__doc__}, static PyObject * _contextvars_Context_get_impl(PyContext *self, PyObject *key, @@ -127,7 +127,7 @@ PyDoc_STRVAR(_contextvars_ContextVar_get__doc__, " * raise a LookupError."); #define _CONTEXTVARS_CONTEXTVAR_GET_METHODDEF \ - {"get", (PyCFunction)(void(*)(void))_contextvars_ContextVar_get, METH_FASTCALL, _contextvars_ContextVar_get__doc__}, + {"get", _PyCFunction_CAST(_contextvars_ContextVar_get), METH_FASTCALL, _contextvars_ContextVar_get__doc__}, static PyObject * _contextvars_ContextVar_get_impl(PyContextVar *self, PyObject *default_value); @@ -177,4 +177,4 @@ PyDoc_STRVAR(_contextvars_ContextVar_reset__doc__, #define _CONTEXTVARS_CONTEXTVAR_RESET_METHODDEF \ {"reset", (PyCFunction)_contextvars_ContextVar_reset, METH_O, _contextvars_ContextVar_reset__doc__}, -/*[clinic end generated code: output=f2e42f34e358e179 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=2436b16a92452869 input=a9049054013a1b77]*/ diff --git a/Python/clinic/import.c.h b/Python/clinic/import.c.h index 6052316cdd8e3..0451d97a720dd 100644 --- a/Python/clinic/import.c.h +++ b/Python/clinic/import.c.h @@ -75,7 +75,7 @@ PyDoc_STRVAR(_imp__fix_co_filename__doc__, " File path to use."); #define _IMP__FIX_CO_FILENAME_METHODDEF \ - {"_fix_co_filename", (PyCFunction)(void(*)(void))_imp__fix_co_filename, METH_FASTCALL, _imp__fix_co_filename__doc__}, + {"_fix_co_filename", _PyCFunction_CAST(_imp__fix_co_filename), METH_FASTCALL, _imp__fix_co_filename__doc__}, static PyObject * _imp__fix_co_filename_impl(PyObject *module, PyCodeObject *code, @@ -184,7 +184,7 @@ PyDoc_STRVAR(_imp_find_frozen__doc__, " the module\'s current name)"); #define _IMP_FIND_FROZEN_METHODDEF \ - {"find_frozen", (PyCFunction)(void(*)(void))_imp_find_frozen, METH_FASTCALL|METH_KEYWORDS, _imp_find_frozen__doc__}, + {"find_frozen", _PyCFunction_CAST(_imp_find_frozen), METH_FASTCALL|METH_KEYWORDS, _imp_find_frozen__doc__}, static PyObject * _imp_find_frozen_impl(PyObject *module, PyObject *name, int withdata); @@ -233,7 +233,7 @@ PyDoc_STRVAR(_imp_get_frozen_object__doc__, "Create a code object for a frozen module."); #define _IMP_GET_FROZEN_OBJECT_METHODDEF \ - {"get_frozen_object", (PyCFunction)(void(*)(void))_imp_get_frozen_object, METH_FASTCALL, _imp_get_frozen_object__doc__}, + {"get_frozen_object", _PyCFunction_CAST(_imp_get_frozen_object), METH_FASTCALL, _imp_get_frozen_object__doc__}, static PyObject * _imp_get_frozen_object_impl(PyObject *module, PyObject *name, @@ -422,7 +422,7 @@ PyDoc_STRVAR(_imp_create_dynamic__doc__, "Create an extension module."); #define _IMP_CREATE_DYNAMIC_METHODDEF \ - {"create_dynamic", (PyCFunction)(void(*)(void))_imp_create_dynamic, METH_FASTCALL, _imp_create_dynamic__doc__}, + {"create_dynamic", _PyCFunction_CAST(_imp_create_dynamic), METH_FASTCALL, _imp_create_dynamic__doc__}, static PyObject * _imp_create_dynamic_impl(PyObject *module, PyObject *spec, PyObject *file); @@ -517,7 +517,7 @@ PyDoc_STRVAR(_imp_source_hash__doc__, "\n"); #define _IMP_SOURCE_HASH_METHODDEF \ - {"source_hash", (PyCFunction)(void(*)(void))_imp_source_hash, METH_FASTCALL|METH_KEYWORDS, _imp_source_hash__doc__}, + {"source_hash", _PyCFunction_CAST(_imp_source_hash), METH_FASTCALL|METH_KEYWORDS, _imp_source_hash__doc__}, static PyObject * _imp_source_hash_impl(PyObject *module, long key, Py_buffer *source); @@ -565,4 +565,4 @@ _imp_source_hash(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyOb #ifndef _IMP_EXEC_DYNAMIC_METHODDEF #define _IMP_EXEC_DYNAMIC_METHODDEF #endif /* !defined(_IMP_EXEC_DYNAMIC_METHODDEF) */ -/*[clinic end generated code: output=adcf787969a11353 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=8d0f4305b1d0714b input=a9049054013a1b77]*/ diff --git a/Python/clinic/marshal.c.h b/Python/clinic/marshal.c.h index f80d5ef31f29c..36f2afd5241b7 100644 --- a/Python/clinic/marshal.c.h +++ b/Python/clinic/marshal.c.h @@ -20,7 +20,7 @@ PyDoc_STRVAR(marshal_dump__doc__, "to the file. The object will not be properly read back by load()."); #define MARSHAL_DUMP_METHODDEF \ - {"dump", (PyCFunction)(void(*)(void))marshal_dump, METH_FASTCALL, marshal_dump__doc__}, + {"dump", _PyCFunction_CAST(marshal_dump), METH_FASTCALL, marshal_dump__doc__}, static PyObject * marshal_dump_impl(PyObject *module, PyObject *value, PyObject *file, @@ -87,7 +87,7 @@ PyDoc_STRVAR(marshal_dumps__doc__, "unsupported type."); #define MARSHAL_DUMPS_METHODDEF \ - {"dumps", (PyCFunction)(void(*)(void))marshal_dumps, METH_FASTCALL, marshal_dumps__doc__}, + {"dumps", _PyCFunction_CAST(marshal_dumps), METH_FASTCALL, marshal_dumps__doc__}, static PyObject * marshal_dumps_impl(PyObject *module, PyObject *value, int version); @@ -155,4 +155,4 @@ marshal_loads(PyObject *module, PyObject *arg) return return_value; } -/*[clinic end generated code: output=68b78f38bfe0c06d input=a9049054013a1b77]*/ +/*[clinic end generated code: output=b9e838edee43fe87 input=a9049054013a1b77]*/ diff --git a/Python/clinic/sysmodule.c.h b/Python/clinic/sysmodule.c.h index ce5390c8a1e58..6ee3bb2a849aa 100644 --- a/Python/clinic/sysmodule.c.h +++ b/Python/clinic/sysmodule.c.h @@ -9,7 +9,7 @@ PyDoc_STRVAR(sys_addaudithook__doc__, "Adds a new audit hook callback."); #define SYS_ADDAUDITHOOK_METHODDEF \ - {"addaudithook", (PyCFunction)(void(*)(void))sys_addaudithook, METH_FASTCALL|METH_KEYWORDS, sys_addaudithook__doc__}, + {"addaudithook", _PyCFunction_CAST(sys_addaudithook), METH_FASTCALL|METH_KEYWORDS, sys_addaudithook__doc__}, static PyObject * sys_addaudithook_impl(PyObject *module, PyObject *hook); @@ -50,7 +50,7 @@ PyDoc_STRVAR(sys_excepthook__doc__, "Handle an exception by displaying it with a traceback on sys.stderr."); #define SYS_EXCEPTHOOK_METHODDEF \ - {"excepthook", (PyCFunction)(void(*)(void))sys_excepthook, METH_FASTCALL, sys_excepthook__doc__}, + {"excepthook", _PyCFunction_CAST(sys_excepthook), METH_FASTCALL, sys_excepthook__doc__}, static PyObject * sys_excepthook_impl(PyObject *module, PyObject *exctype, PyObject *value, @@ -148,7 +148,7 @@ PyDoc_STRVAR(sys_exit__doc__, "exit status will be one (i.e., failure)."); #define SYS_EXIT_METHODDEF \ - {"exit", (PyCFunction)(void(*)(void))sys_exit, METH_FASTCALL, sys_exit__doc__}, + {"exit", _PyCFunction_CAST(sys_exit), METH_FASTCALL, sys_exit__doc__}, static PyObject * sys_exit_impl(PyObject *module, PyObject *status); @@ -416,7 +416,7 @@ PyDoc_STRVAR(sys_set_coroutine_origin_tracking_depth__doc__, "Set a depth of 0 to disable."); #define SYS_SET_COROUTINE_ORIGIN_TRACKING_DEPTH_METHODDEF \ - {"set_coroutine_origin_tracking_depth", (PyCFunction)(void(*)(void))sys_set_coroutine_origin_tracking_depth, METH_FASTCALL|METH_KEYWORDS, sys_set_coroutine_origin_tracking_depth__doc__}, + {"set_coroutine_origin_tracking_depth", _PyCFunction_CAST(sys_set_coroutine_origin_tracking_depth), METH_FASTCALL|METH_KEYWORDS, sys_set_coroutine_origin_tracking_depth__doc__}, static PyObject * sys_set_coroutine_origin_tracking_depth_impl(PyObject *module, int depth); @@ -802,7 +802,7 @@ PyDoc_STRVAR(sys__getframe__doc__, "only."); #define SYS__GETFRAME_METHODDEF \ - {"_getframe", (PyCFunction)(void(*)(void))sys__getframe, METH_FASTCALL, sys__getframe__doc__}, + {"_getframe", _PyCFunction_CAST(sys__getframe), METH_FASTCALL, sys__getframe__doc__}, static PyObject * sys__getframe_impl(PyObject *module, int depth); @@ -881,7 +881,7 @@ PyDoc_STRVAR(sys_call_tracing__doc__, "some other code."); #define SYS_CALL_TRACING_METHODDEF \ - {"call_tracing", (PyCFunction)(void(*)(void))sys_call_tracing, METH_FASTCALL, sys_call_tracing__doc__}, + {"call_tracing", _PyCFunction_CAST(sys_call_tracing), METH_FASTCALL, sys_call_tracing__doc__}, static PyObject * sys_call_tracing_impl(PyObject *module, PyObject *func, PyObject *funcargs); @@ -1014,4 +1014,4 @@ sys_getandroidapilevel(PyObject *module, PyObject *Py_UNUSED(ignored)) #ifndef SYS_GETANDROIDAPILEVEL_METHODDEF #define SYS_GETANDROIDAPILEVEL_METHODDEF #endif /* !defined(SYS_GETANDROIDAPILEVEL_METHODDEF) */ -/*[clinic end generated code: output=60756bc6f683e0c8 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=98efd34fd9b9b6ab input=a9049054013a1b77]*/ diff --git a/Tools/clinic/clinic.py b/Tools/clinic/clinic.py index f660474da94a0..bf0fe5bed5a76 100755 --- a/Tools/clinic/clinic.py +++ b/Tools/clinic/clinic.py @@ -694,7 +694,7 @@ def output_templates(self, f): methoddef_define = normalize_snippet(""" #define {methoddef_name} \\ - {{"{name}", {methoddef_cast}{c_basename}, {methoddef_flags}, {c_basename}__doc__}}, + {{"{name}", {methoddef_cast}{c_basename}{methoddef_cast_end}, {methoddef_flags}, {c_basename}__doc__}}, """) if new_or_init and not f.docstring: docstring_prototype = docstring_definition = '' @@ -1131,14 +1131,17 @@ def parser_body(prototype, *fields, declarations=''): if flags in ('METH_NOARGS', 'METH_O', 'METH_VARARGS'): methoddef_cast = "(PyCFunction)" + methoddef_cast_end = "" else: - methoddef_cast = "(PyCFunction)(void(*)(void))" + methoddef_cast = "_PyCFunction_CAST(" + methoddef_cast_end = ")" if f.methoddef_flags: flags += '|' + f.methoddef_flags methoddef_define = methoddef_define.replace('{methoddef_flags}', flags) methoddef_define = methoddef_define.replace('{methoddef_cast}', methoddef_cast) + methoddef_define = methoddef_define.replace('{methoddef_cast_end}', methoddef_cast_end) methoddef_ifndef = '' conditional = self.cpp.condition() From webhook-mailer at python.org Tue May 3 14:47:33 2022 From: webhook-mailer at python.org (vstinner) Date: Tue, 03 May 2022 18:47:33 -0000 Subject: [Python-checkins] gh-91320: Fix more old-style cast warnings in C++ (#92247) Message-ID: https://github.com/python/cpython/commit/ff3e9cdf334737aeedbbec2e5a219084d27db9cd commit: ff3e9cdf334737aeedbbec2e5a219084d27db9cd branch: main author: Victor Stinner committer: vstinner date: 2022-05-03T20:47:29+02:00 summary: gh-91320: Fix more old-style cast warnings in C++ (#92247) Use _Py_CAST(), _Py_STATIC_CAST() and _PyASCIIObject_CAST() in static inline functions to fix C++ compiler warnings: "use of old-style cast" (clang -Wold-style-cast). test_cppext now builds the C++ test extension with -Wold-style-cast. files: M Include/cpython/unicodeobject.h M Include/cpython/weakrefobject.h M Lib/test/test_cppext.py diff --git a/Include/cpython/unicodeobject.h b/Include/cpython/unicodeobject.h index 47194ac7829fd..96bfaaf4d2bad 100644 --- a/Include/cpython/unicodeobject.h +++ b/Include/cpython/unicodeobject.h @@ -314,16 +314,15 @@ enum PyUnicode_Kind { /* Return one of the PyUnicode_*_KIND values defined above. */ #define PyUnicode_KIND(op) \ - (assert(PyUnicode_Check(op)), \ - assert(PyUnicode_IS_READY(op)), \ - ((PyASCIIObject *)(op))->state.kind) + (assert(PyUnicode_IS_READY(op)), \ + _PyASCIIObject_CAST(op)->state.kind) /* Return a void pointer to the raw unicode buffer. */ static inline void* _PyUnicode_COMPACT_DATA(PyObject *op) { if (PyUnicode_IS_ASCII(op)) { - return (void*)(_PyASCIIObject_CAST(op) + 1); + return _Py_STATIC_CAST(void*, (_PyASCIIObject_CAST(op) + 1)); } - return (void*)(_PyCompactUnicodeObject_CAST(op) + 1); + return _Py_STATIC_CAST(void*, (_PyCompactUnicodeObject_CAST(op) + 1)); } static inline void* _PyUnicode_NONCOMPACT_DATA(PyObject *op) { @@ -348,9 +347,9 @@ static inline void* PyUnicode_DATA(PyObject *op) { No checks are performed, use PyUnicode_KIND() before to ensure these will work correctly. */ -#define PyUnicode_1BYTE_DATA(op) ((Py_UCS1*)PyUnicode_DATA(op)) -#define PyUnicode_2BYTE_DATA(op) ((Py_UCS2*)PyUnicode_DATA(op)) -#define PyUnicode_4BYTE_DATA(op) ((Py_UCS4*)PyUnicode_DATA(op)) +#define PyUnicode_1BYTE_DATA(op) _Py_STATIC_CAST(Py_UCS1*, PyUnicode_DATA(op)) +#define PyUnicode_2BYTE_DATA(op) _Py_STATIC_CAST(Py_UCS2*, PyUnicode_DATA(op)) +#define PyUnicode_4BYTE_DATA(op) _Py_STATIC_CAST(Py_UCS4*, PyUnicode_DATA(op)) /* Returns the length of the unicode string. The caller has to make sure that the string has it's canonical representation set before calling @@ -373,16 +372,16 @@ static inline void PyUnicode_WRITE(unsigned int kind, void *data, { if (kind == PyUnicode_1BYTE_KIND) { assert(value <= 0xffU); - ((Py_UCS1 *)data)[index] = (Py_UCS1)value; + _Py_STATIC_CAST(Py_UCS1*, data)[index] = _Py_STATIC_CAST(Py_UCS1, value); } else if (kind == PyUnicode_2BYTE_KIND) { assert(value <= 0xffffU); - ((Py_UCS2 *)data)[index] = (Py_UCS2)value; + _Py_STATIC_CAST(Py_UCS2*, data)[index] = _Py_STATIC_CAST(Py_UCS2, value); } else { assert(kind == PyUnicode_4BYTE_KIND); assert(value <= 0x10ffffU); - ((Py_UCS4 *)data)[index] = value; + _Py_STATIC_CAST(Py_UCS4*, data)[index] = value; } } #define PyUnicode_WRITE(kind, data, index, value) \ @@ -394,13 +393,13 @@ static inline Py_UCS4 PyUnicode_READ(unsigned int kind, const void *data, Py_ssize_t index) { if (kind == PyUnicode_1BYTE_KIND) { - return ((const Py_UCS1 *)data)[index]; + return _Py_STATIC_CAST(const Py_UCS1*, data)[index]; } if (kind == PyUnicode_2BYTE_KIND) { - return ((const Py_UCS2 *)data)[index]; + return _Py_STATIC_CAST(const Py_UCS2*, data)[index]; } assert(kind == PyUnicode_4BYTE_KIND); - return ((const Py_UCS4 *)data)[index]; + return _Py_STATIC_CAST(const Py_UCS4*, data)[index]; } #define PyUnicode_READ(kind, data, index) \ PyUnicode_READ((unsigned int)(kind), (const void*)(data), (index)) @@ -693,7 +692,9 @@ static inline const char* PyUnicode_AS_DATA(PyObject *op) { _Py_COMP_DIAG_PUSH _Py_COMP_DIAG_IGNORE_DEPR_DECLS - return (const char *)PyUnicode_AS_UNICODE(op); + Py_UNICODE *data = PyUnicode_AS_UNICODE(op); + // In C++, casting directly PyUnicode* to const char* is not valid + return _Py_STATIC_CAST(const char*, _Py_STATIC_CAST(const void*, data)); _Py_COMP_DIAG_POP } #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000 diff --git a/Include/cpython/weakrefobject.h b/Include/cpython/weakrefobject.h index 1078fffc2e0a5..bec69ba90d6b9 100644 --- a/Include/cpython/weakrefobject.h +++ b/Include/cpython/weakrefobject.h @@ -38,7 +38,7 @@ PyAPI_FUNC(void) _PyWeakref_ClearRef(PyWeakReference *self); static inline PyObject* PyWeakref_GET_OBJECT(PyObject *ref_obj) { assert(PyWeakref_Check(ref_obj)); - PyWeakReference *ref = (PyWeakReference *)ref_obj; + PyWeakReference *ref = _Py_CAST(PyWeakReference*, ref_obj); PyObject *obj = ref->wr_object; // Explanation for the Py_REFCNT() check: when a weakref's target is part // of a long chain of deallocations which triggers the trashcan mechanism, diff --git a/Lib/test/test_cppext.py b/Lib/test/test_cppext.py index 99f6062d79d47..fbb79bb8ac3ed 100644 --- a/Lib/test/test_cppext.py +++ b/Lib/test/test_cppext.py @@ -27,6 +27,8 @@ # a C++ extension using the Python C API does not emit C++ compiler # warnings '-Werror', + # Warn on old-style cast (C cast) like: (PyObject*)op + '-Wold-style-cast', ] else: # Don't pass any compiler flag to MSVC From webhook-mailer at python.org Tue May 3 15:17:55 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Tue, 03 May 2022 19:17:55 -0000 Subject: [Python-checkins] gh-90172: add test for functools.singledispatch on Union types with None type (#92174) Message-ID: https://github.com/python/cpython/commit/f03d3dd9afd5a2df8ffb6db80c0bb45f2d8909f5 commit: f03d3dd9afd5a2df8ffb6db80c0bb45f2d8909f5 branch: main author: Thaddeus1499 <104600742+Thaddeus1499 at users.noreply.github.com> committer: JelleZijlstra date: 2022-05-03T13:17:43-06:00 summary: gh-90172: add test for functools.singledispatch on Union types with None type (#92174) Signed-off-by: prwatson Co-authored-by: Jelle Zijlstra files: M Lib/test/test_functools.py diff --git a/Lib/test/test_functools.py b/Lib/test/test_functools.py index e3c065615778f..382e7dbffddf9 100644 --- a/Lib/test/test_functools.py +++ b/Lib/test/test_functools.py @@ -2792,6 +2792,49 @@ def _(arg: int | float): self.assertEqual(f(1), "types.UnionType") self.assertEqual(f(1.0), "types.UnionType") + def test_union_conflict(self): + @functools.singledispatch + def f(arg): + return "default" + + @f.register + def _(arg: typing.Union[str, bytes]): + return "typing.Union" + + @f.register + def _(arg: int | str): + return "types.UnionType" + + self.assertEqual(f([]), "default") + self.assertEqual(f(""), "types.UnionType") # last one wins + self.assertEqual(f(b""), "typing.Union") + self.assertEqual(f(1), "types.UnionType") + + def test_union_None(self): + @functools.singledispatch + def typing_union(arg): + return "default" + + @typing_union.register + def _(arg: typing.Union[str, None]): + return "typing.Union" + + self.assertEqual(typing_union(1), "default") + self.assertEqual(typing_union(""), "typing.Union") + self.assertEqual(typing_union(None), "typing.Union") + + @functools.singledispatch + def types_union(arg): + return "default" + + @types_union.register + def _(arg: int | None): + return "types.UnionType" + + self.assertEqual(types_union(""), "default") + self.assertEqual(types_union(1), "types.UnionType") + self.assertEqual(types_union(None), "types.UnionType") + def test_register_genericalias(self): @functools.singledispatch def f(arg): From webhook-mailer at python.org Tue May 3 15:18:39 2022 From: webhook-mailer at python.org (ericsnowcurrently) Date: Tue, 03 May 2022 19:18:39 -0000 Subject: [Python-checkins] gh-81057: Get the c-analyzer tool working again. (gh-92246) Message-ID: https://github.com/python/cpython/commit/456cd513e360ccd17e51ae3711ec48976b1be0c0 commit: 456cd513e360ccd17e51ae3711ec48976b1be0c0 branch: main author: Eric Snow committer: ericsnowcurrently date: 2022-05-03T13:18:27-06:00 summary: gh-81057: Get the c-analyzer tool working again. (gh-92246) files: M Tools/c-analyzer/c_parser/info.py M Tools/c-analyzer/c_parser/parser/_compound_decl_body.py M Tools/c-analyzer/c_parser/parser/_regexes.py M Tools/c-analyzer/cpython/_parser.py diff --git a/Tools/c-analyzer/c_parser/info.py b/Tools/c-analyzer/c_parser/info.py index 697b1f26dc215..bbfbff7e62d02 100644 --- a/Tools/c-analyzer/c_parser/info.py +++ b/Tools/c-analyzer/c_parser/info.py @@ -1161,7 +1161,9 @@ def from_data(cls, raw, index): vartype = dict(raw.data) del vartype['storage'] if 'size' in vartype: - size = int(vartype.pop('size')) + size = vartype.pop('size') + if isinstance(size, str) and size.isdigit(): + size = int(size) vartype = VarType(**vartype) return cls(name, vartype, size) diff --git a/Tools/c-analyzer/c_parser/parser/_compound_decl_body.py b/Tools/c-analyzer/c_parser/parser/_compound_decl_body.py index eb5bc67607bb1..67528d2279896 100644 --- a/Tools/c-analyzer/c_parser/parser/_compound_decl_body.py +++ b/Tools/c-analyzer/c_parser/parser/_compound_decl_body.py @@ -99,7 +99,7 @@ def parse_body(source): name = anon_name('struct-field-') if size: # data = (data, size) - data['size'] = int(size) + data['size'] = int(size) if size.isdigit() else size else: # This shouldn't happen (we expect each field to have a name). raise NotImplementedError diff --git a/Tools/c-analyzer/c_parser/parser/_regexes.py b/Tools/c-analyzer/c_parser/parser/_regexes.py index cb85a59aaa16c..b7f22b186f496 100644 --- a/Tools/c-analyzer/c_parser/parser/_regexes.py +++ b/Tools/c-analyzer/c_parser/parser/_regexes.py @@ -176,6 +176,7 @@ def _ind(text, level=1, edges='both'): (?: # {STRICT_IDENTIFIER} ) + # Inside the brackets is actually a "constant expression". (?: \s* \[ (?: \s* [^\]]+ \s* )? [\]] )* # arrays ) | @@ -184,6 +185,7 @@ def _ind(text, level=1, edges='both'): (?: # {STRICT_IDENTIFIER} ) + # Inside the brackets is actually a "constant expression". (?: \s* \[ (?: \s* [^\]]+ \s* )? [\]] )* # arrays \s* [)] ) @@ -194,6 +196,7 @@ def _ind(text, level=1, edges='both'): (?: # {STRICT_IDENTIFIER} ) + # Inside the brackets is actually a "constant expression". (?: \s* \[ (?: \s* [^\]]+ \s* )? [\]] )* # arrays \s* [)] # We allow for a single level of paren nesting in parameters. @@ -322,7 +325,10 @@ def _ind(text, level=1, edges='both'): (?: \s* [:] \s* (?: # + # This is actually a "constant expression". \d+ + | + [^'",}}]+ ) )? \s* @@ -357,6 +363,7 @@ def _ind(text, level=1, edges='both'): (?: \s* = \s* (?: # + # This is actually a "constant expression". {_ind(STRING_LITERAL, 4)} | [^'",}}]+ diff --git a/Tools/c-analyzer/cpython/_parser.py b/Tools/c-analyzer/cpython/_parser.py index 19000096fc9c3..eaad7278ed79e 100644 --- a/Tools/c-analyzer/cpython/_parser.py +++ b/Tools/c-analyzer/cpython/_parser.py @@ -46,6 +46,7 @@ def clean_lines(text): @end=sh@ ''' +# XXX Handle these. EXCLUDED = clean_lines(''' # @begin=conf@ @@ -69,6 +70,7 @@ def clean_lines(text): Python/dynload_dl.c # dl.h Python/dynload_hpux.c # dl.h Python/thread_pthread.h +Python/emscripten_signal.c # only huge constants (safe but parsing is slow) Modules/_blake2/impl/blake2-kat.h @@ -202,6 +204,7 @@ def clean_lines(text): Include/cpython/traceback.h Py_CPYTHON_TRACEBACK_H 1 Include/cpython/tupleobject.h Py_CPYTHON_TUPLEOBJECT_H 1 Include/cpython/unicodeobject.h Py_CPYTHON_UNICODEOBJECT_H 1 +Include/internal/pycore_code.h SIZEOF_VOID_P 8 # implied include of pyport.h Include/**/*.h PyAPI_DATA(RTYPE) extern RTYPE @@ -297,8 +300,8 @@ def clean_lines(text): _abs('Objects/stringlib/unicode_format.h'): (10_000, 400), _abs('Objects/typeobject.c'): (20_000, 200), _abs('Python/compile.c'): (20_000, 500), - _abs('Python/pylifecycle.c'): (200_000, 5000), - _abs('Python/pystate.c'): (200_000, 5000), + _abs('Python/pylifecycle.c'): (500_000, 5000), + _abs('Python/pystate.c'): (500_000, 5000), } From webhook-mailer at python.org Tue May 3 15:38:41 2022 From: webhook-mailer at python.org (vstinner) Date: Tue, 03 May 2022 19:38:41 -0000 Subject: [Python-checkins] gh-91321: Add _Py_NULL macro (#92253) Message-ID: https://github.com/python/cpython/commit/551d02b3e697098236bb3a6e0a855b2ad8dc0424 commit: 551d02b3e697098236bb3a6e0a855b2ad8dc0424 branch: main author: Victor Stinner committer: vstinner date: 2022-05-03T21:38:37+02:00 summary: gh-91321: Add _Py_NULL macro (#92253) Fix C++ compiler warnings: "zero as null pointer constant" (clang -Wzero-as-null-pointer-constant). * Add the _Py_NULL macro used by static inline functions to use nullptr in C++. * Replace NULL with nullptr in _testcppext.cpp. files: M Include/cpython/abstract.h M Include/cpython/unicodeobject.h M Include/object.h M Include/pyport.h M Lib/test/_testcppext.cpp M Lib/test/test_cppext.py diff --git a/Include/cpython/abstract.h b/Include/cpython/abstract.h index 77e2cfa02ed07..161e2cb30fde3 100644 --- a/Include/cpython/abstract.h +++ b/Include/cpython/abstract.h @@ -103,8 +103,8 @@ PyAPI_FUNC(PyObject *) PyObject_VectorcallMethod( static inline PyObject * PyObject_CallMethodNoArgs(PyObject *self, PyObject *name) { - return PyObject_VectorcallMethod(name, &self, - 1 | PY_VECTORCALL_ARGUMENTS_OFFSET, NULL); + size_t nargsf = 1 | PY_VECTORCALL_ARGUMENTS_OFFSET; + return PyObject_VectorcallMethod(name, &self, nargsf, _Py_NULL); } static inline PyObject * @@ -113,8 +113,8 @@ PyObject_CallMethodOneArg(PyObject *self, PyObject *name, PyObject *arg) PyObject *args[2] = {self, arg}; assert(arg != NULL); - return PyObject_VectorcallMethod(name, args, - 2 | PY_VECTORCALL_ARGUMENTS_OFFSET, NULL); + size_t nargsf = 2 | PY_VECTORCALL_ARGUMENTS_OFFSET; + return PyObject_VectorcallMethod(name, args, nargsf, _Py_NULL); } PyAPI_FUNC(PyObject *) _PyObject_CallMethod(PyObject *obj, @@ -144,7 +144,7 @@ _PyObject_VectorcallMethodId( { PyObject *oname = _PyUnicode_FromId(name); /* borrowed */ if (!oname) { - return NULL; + return _Py_NULL; } return PyObject_VectorcallMethod(oname, args, nargsf, kwnames); } @@ -152,8 +152,8 @@ _PyObject_VectorcallMethodId( static inline PyObject * _PyObject_CallMethodIdNoArgs(PyObject *self, _Py_Identifier *name) { - return _PyObject_VectorcallMethodId(name, &self, - 1 | PY_VECTORCALL_ARGUMENTS_OFFSET, NULL); + size_t nargsf = 1 | PY_VECTORCALL_ARGUMENTS_OFFSET; + return _PyObject_VectorcallMethodId(name, &self, nargsf, _Py_NULL); } static inline PyObject * @@ -162,8 +162,8 @@ _PyObject_CallMethodIdOneArg(PyObject *self, _Py_Identifier *name, PyObject *arg PyObject *args[2] = {self, arg}; assert(arg != NULL); - return _PyObject_VectorcallMethodId(name, args, - 2 | PY_VECTORCALL_ARGUMENTS_OFFSET, NULL); + size_t nargsf = 2 | PY_VECTORCALL_ARGUMENTS_OFFSET; + return _PyObject_VectorcallMethodId(name, args, nargsf, _Py_NULL); } PyAPI_FUNC(int) _PyObject_HasLen(PyObject *o); diff --git a/Include/cpython/unicodeobject.h b/Include/cpython/unicodeobject.h index 96bfaaf4d2bad..8e182d0fbf799 100644 --- a/Include/cpython/unicodeobject.h +++ b/Include/cpython/unicodeobject.h @@ -642,9 +642,9 @@ static inline Py_ssize_t PyUnicode_GET_SIZE(PyObject *op) { _Py_COMP_DIAG_PUSH _Py_COMP_DIAG_IGNORE_DEPR_DECLS - if (_PyASCIIObject_CAST(op)->wstr == NULL) { + if (_PyASCIIObject_CAST(op)->wstr == _Py_NULL) { (void)PyUnicode_AsUnicode(op); - assert(_PyASCIIObject_CAST(op)->wstr != NULL); + assert(_PyASCIIObject_CAST(op)->wstr != _Py_NULL); } return PyUnicode_WSTR_LENGTH(op); _Py_COMP_DIAG_POP @@ -674,7 +674,7 @@ Py_DEPRECATED(3.3) static inline Py_UNICODE* PyUnicode_AS_UNICODE(PyObject *op) { wchar_t *wstr = _PyASCIIObject_CAST(op)->wstr; - if (wstr != NULL) { + if (wstr != _Py_NULL) { return wstr; } diff --git a/Include/object.h b/Include/object.h index f93ecce13b409..a0dba697569c4 100644 --- a/Include/object.h +++ b/Include/object.h @@ -587,7 +587,7 @@ static inline void Py_DECREF(PyObject *op) /* Function to use in case the object pointer can be NULL: */ static inline void Py_XINCREF(PyObject *op) { - if (op != NULL) { + if (op != _Py_NULL) { Py_INCREF(op); } } @@ -597,7 +597,7 @@ static inline void Py_XINCREF(PyObject *op) static inline void Py_XDECREF(PyObject *op) { - if (op != NULL) { + if (op != _Py_NULL) { Py_DECREF(op); } } diff --git a/Include/pyport.h b/Include/pyport.h index f6270be0ce5c0..614a2789fb078 100644 --- a/Include/pyport.h +++ b/Include/pyport.h @@ -33,6 +33,14 @@ # define _Py_CAST(type, expr) ((type)(expr)) #endif +// Static inline functions should use _Py_NULL rather than using directly NULL +// to prevent C++ compiler warnings. In C++, _Py_NULL uses nullptr. +#ifdef __cplusplus +# define _Py_NULL nullptr +#else +# define _Py_NULL NULL +#endif + /* Defines to build Python and its standard library: * diff --git a/Lib/test/_testcppext.cpp b/Lib/test/_testcppext.cpp index 257843bfc7726..dc40f0ee9eb1c 100644 --- a/Lib/test/_testcppext.cpp +++ b/Lib/test/_testcppext.cpp @@ -52,7 +52,7 @@ test_api_casts(PyObject *Py_UNUSED(module), PyObject *Py_UNUSED(args)) static PyMethodDef _testcppext_methods[] = { {"add", _testcppext_add, METH_VARARGS, _testcppext_add_doc}, - {"test_api_casts", test_api_casts, METH_NOARGS, NULL}, + {"test_api_casts", test_api_casts, METH_NOARGS, nullptr}, {nullptr, nullptr, 0, nullptr} /* sentinel */ }; @@ -68,7 +68,7 @@ _testcppext_exec(PyObject *module) static PyModuleDef_Slot _testcppext_slots[] = { {Py_mod_exec, reinterpret_cast(_testcppext_exec)}, - {0, NULL} + {0, nullptr} }; @@ -81,8 +81,8 @@ static struct PyModuleDef _testcppext_module = { 0, // m_size _testcppext_methods, // m_methods _testcppext_slots, // m_slots - NULL, // m_traverse - NULL, // m_clear + nullptr, // m_traverse + nullptr, // m_clear nullptr, // m_free }; diff --git a/Lib/test/test_cppext.py b/Lib/test/test_cppext.py index fbb79bb8ac3ed..e056410456630 100644 --- a/Lib/test/test_cppext.py +++ b/Lib/test/test_cppext.py @@ -29,6 +29,8 @@ '-Werror', # Warn on old-style cast (C cast) like: (PyObject*)op '-Wold-style-cast', + # Warn when using NULL rather than _Py_NULL in static inline functions + '-Wzero-as-null-pointer-constant', ] else: # Don't pass any compiler flag to MSVC From webhook-mailer at python.org Tue May 3 15:42:20 2022 From: webhook-mailer at python.org (vstinner) Date: Tue, 03 May 2022 19:42:20 -0000 Subject: [Python-checkins] gh-91320: Use _PyCFunction_CAST() (#92251) Message-ID: https://github.com/python/cpython/commit/804f2529d8e545a8d59eaf260ee032d014e681ba commit: 804f2529d8e545a8d59eaf260ee032d014e681ba branch: main author: Victor Stinner committer: vstinner date: 2022-05-03T21:42:14+02:00 summary: gh-91320: Use _PyCFunction_CAST() (#92251) Replace "(PyCFunction)(void(*)(void))func" cast with _PyCFunction_CAST(func). Change generated by the command: sed -i -e \ 's!(PyCFunction)(void(\*)(void)) *\([A-Za-z0-9_]\+\)!_PyCFunction_CAST(\1)!g' \ $(find -name "*.c") files: M Modules/_asynciomodule.c M Modules/_collectionsmodule.c M Modules/_csv.c M Modules/_datetimemodule.c M Modules/_decimal/_decimal.c M Modules/_elementtree.c M Modules/_functoolsmodule.c M Modules/_lsprof.c M Modules/_operator.c M Modules/_struct.c M Modules/_testbuffer.c M Modules/_testcapimodule.c M Modules/_testmultiphase.c M Modules/_threadmodule.c M Modules/_xxsubinterpretersmodule.c M Modules/atexitmodule.c M Modules/faulthandler.c M Modules/mathmodule.c M Modules/nismodule.c M Modules/signalmodule.c M Modules/socketmodule.c M Modules/syslogmodule.c M Modules/xxlimited.c M Modules/xxsubtype.c M Objects/descrobject.c M Objects/dictobject.c M Objects/genobject.c M Objects/odictobject.c M Objects/typeobject.c M Objects/unicodeobject.c M Tools/peg_generator/peg_extension/peg_extension.c diff --git a/Modules/_asynciomodule.c b/Modules/_asynciomodule.c index d8d3da91cdd8e..5fa722305757d 100644 --- a/Modules/_asynciomodule.c +++ b/Modules/_asynciomodule.c @@ -1724,7 +1724,7 @@ FutureIter_traverse(futureiterobject *it, visitproc visit, void *arg) static PyMethodDef FutureIter_methods[] = { {"send", (PyCFunction)FutureIter_send, METH_O, NULL}, - {"throw", (PyCFunction)(void(*)(void))FutureIter_throw, METH_FASTCALL, NULL}, + {"throw", _PyCFunction_CAST(FutureIter_throw), METH_FASTCALL, NULL}, {"close", (PyCFunction)FutureIter_close, METH_NOARGS, NULL}, {NULL, NULL} /* Sentinel */ }; diff --git a/Modules/_collectionsmodule.c b/Modules/_collectionsmodule.c index 18c762b21754b..741cfbe9dc614 100644 --- a/Modules/_collectionsmodule.c +++ b/Modules/_collectionsmodule.c @@ -1588,9 +1588,9 @@ static PyMethodDef deque_methods[] = { METH_O, extend_doc}, {"extendleft", (PyCFunction)deque_extendleft, METH_O, extendleft_doc}, - {"index", (PyCFunction)(void(*)(void))deque_index, + {"index", _PyCFunction_CAST(deque_index), METH_FASTCALL, index_doc}, - {"insert", (PyCFunction)(void(*)(void))deque_insert, + {"insert", _PyCFunction_CAST(deque_insert), METH_FASTCALL, insert_doc}, {"pop", (PyCFunction)deque_pop, METH_NOARGS, pop_doc}, @@ -1604,7 +1604,7 @@ static PyMethodDef deque_methods[] = { METH_NOARGS, reversed_doc}, {"reverse", (PyCFunction)deque_reverse, METH_NOARGS, reverse_doc}, - {"rotate", (PyCFunction)(void(*)(void))deque_rotate, + {"rotate", _PyCFunction_CAST(deque_rotate), METH_FASTCALL, rotate_doc}, {"__sizeof__", (PyCFunction)deque_sizeof, METH_NOARGS, sizeof_doc}, diff --git a/Modules/_csv.c b/Modules/_csv.c index 4d68df54a0cb0..cbf4c5de51968 100644 --- a/Modules/_csv.c +++ b/Modules/_csv.c @@ -1704,11 +1704,11 @@ PyDoc_STRVAR(csv_register_dialect_doc, " dialect = csv.register_dialect(name[, dialect[, **fmtparams]])"); static struct PyMethodDef csv_methods[] = { - { "reader", (PyCFunction)(void(*)(void))csv_reader, + { "reader", _PyCFunction_CAST(csv_reader), METH_VARARGS | METH_KEYWORDS, csv_reader_doc}, - { "writer", (PyCFunction)(void(*)(void))csv_writer, + { "writer", _PyCFunction_CAST(csv_writer), METH_VARARGS | METH_KEYWORDS, csv_writer_doc}, - { "register_dialect", (PyCFunction)(void(*)(void))csv_register_dialect, + { "register_dialect", _PyCFunction_CAST(csv_register_dialect), METH_VARARGS | METH_KEYWORDS, csv_register_dialect_doc}, _CSV_LIST_DIALECTS_METHODDEF _CSV_UNREGISTER_DIALECT_METHODDEF diff --git a/Modules/_datetimemodule.c b/Modules/_datetimemodule.c index a35c72395ec95..24c2198893a37 100644 --- a/Modules/_datetimemodule.c +++ b/Modules/_datetimemodule.c @@ -3491,7 +3491,7 @@ static PyMethodDef date_methods[] = { METH_CLASS, PyDoc_STR("str -> Construct a date from the output of date.isoformat()")}, - {"fromisocalendar", (PyCFunction)(void(*)(void))date_fromisocalendar, + {"fromisocalendar", _PyCFunction_CAST(date_fromisocalendar), METH_VARARGS | METH_KEYWORDS | METH_CLASS, PyDoc_STR("int, int, int -> Construct a date from the ISO year, week " "number and weekday.\n\n" @@ -3506,7 +3506,7 @@ static PyMethodDef date_methods[] = { {"ctime", (PyCFunction)date_ctime, METH_NOARGS, PyDoc_STR("Return ctime() style string.")}, - {"strftime", (PyCFunction)(void(*)(void))date_strftime, METH_VARARGS | METH_KEYWORDS, + {"strftime", _PyCFunction_CAST(date_strftime), METH_VARARGS | METH_KEYWORDS, PyDoc_STR("format -> strftime() style string.")}, {"__format__", (PyCFunction)date_format, METH_VARARGS, @@ -3534,7 +3534,7 @@ static PyMethodDef date_methods[] = { PyDoc_STR("Return the day of the week represented by the date.\n" "Monday == 0 ... Sunday == 6")}, - {"replace", (PyCFunction)(void(*)(void))date_replace, METH_VARARGS | METH_KEYWORDS, + {"replace", _PyCFunction_CAST(date_replace), METH_VARARGS | METH_KEYWORDS, PyDoc_STR("Return date with new specified fields.")}, {"__reduce__", (PyCFunction)date_reduce, METH_NOARGS, @@ -4644,7 +4644,7 @@ time_reduce(PyDateTime_Time *self, PyObject *arg) static PyMethodDef time_methods[] = { - {"isoformat", (PyCFunction)(void(*)(void))time_isoformat, METH_VARARGS | METH_KEYWORDS, + {"isoformat", _PyCFunction_CAST(time_isoformat), METH_VARARGS | METH_KEYWORDS, PyDoc_STR("Return string in ISO 8601 format, [HH[:MM[:SS[.mmm[uuu]]]]]" "[+HH:MM].\n\n" "The optional argument timespec specifies the number " @@ -4652,7 +4652,7 @@ static PyMethodDef time_methods[] = { "options are 'auto', 'hours', 'minutes',\n'seconds', " "'milliseconds' and 'microseconds'.\n")}, - {"strftime", (PyCFunction)(void(*)(void))time_strftime, METH_VARARGS | METH_KEYWORDS, + {"strftime", _PyCFunction_CAST(time_strftime), METH_VARARGS | METH_KEYWORDS, PyDoc_STR("format -> strftime() style string.")}, {"__format__", (PyCFunction)date_format, METH_VARARGS, @@ -4667,7 +4667,7 @@ static PyMethodDef time_methods[] = { {"dst", (PyCFunction)time_dst, METH_NOARGS, PyDoc_STR("Return self.tzinfo.dst(self).")}, - {"replace", (PyCFunction)(void(*)(void))time_replace, METH_VARARGS | METH_KEYWORDS, + {"replace", _PyCFunction_CAST(time_replace), METH_VARARGS | METH_KEYWORDS, PyDoc_STR("Return time with new specified fields.")}, {"fromisoformat", (PyCFunction)time_fromisoformat, METH_O | METH_CLASS, @@ -6308,7 +6308,7 @@ static PyMethodDef datetime_methods[] = { METH_NOARGS | METH_CLASS, PyDoc_STR("Return a new datetime representing UTC day and time.")}, - {"fromtimestamp", (PyCFunction)(void(*)(void))datetime_fromtimestamp, + {"fromtimestamp", _PyCFunction_CAST(datetime_fromtimestamp), METH_VARARGS | METH_KEYWORDS | METH_CLASS, PyDoc_STR("timestamp[, tz] -> tz's local time from POSIX timestamp.")}, @@ -6321,7 +6321,7 @@ static PyMethodDef datetime_methods[] = { PyDoc_STR("string, format -> new datetime parsed from a string " "(like time.strptime()).")}, - {"combine", (PyCFunction)(void(*)(void))datetime_combine, + {"combine", _PyCFunction_CAST(datetime_combine), METH_VARARGS | METH_KEYWORDS | METH_CLASS, PyDoc_STR("date, time -> datetime with same date and time fields")}, @@ -6352,7 +6352,7 @@ static PyMethodDef datetime_methods[] = { {"utctimetuple", (PyCFunction)datetime_utctimetuple, METH_NOARGS, PyDoc_STR("Return UTC time tuple, compatible with time.localtime().")}, - {"isoformat", (PyCFunction)(void(*)(void))datetime_isoformat, METH_VARARGS | METH_KEYWORDS, + {"isoformat", _PyCFunction_CAST(datetime_isoformat), METH_VARARGS | METH_KEYWORDS, PyDoc_STR("[sep] -> string in ISO 8601 format, " "YYYY-MM-DDT[HH[:MM[:SS[.mmm[uuu]]]]][+HH:MM].\n" "sep is used to separate the year from the time, and " @@ -6371,10 +6371,10 @@ static PyMethodDef datetime_methods[] = { {"dst", (PyCFunction)datetime_dst, METH_NOARGS, PyDoc_STR("Return self.tzinfo.dst(self).")}, - {"replace", (PyCFunction)(void(*)(void))datetime_replace, METH_VARARGS | METH_KEYWORDS, + {"replace", _PyCFunction_CAST(datetime_replace), METH_VARARGS | METH_KEYWORDS, PyDoc_STR("Return datetime with new specified fields.")}, - {"astimezone", (PyCFunction)(void(*)(void))datetime_astimezone, METH_VARARGS | METH_KEYWORDS, + {"astimezone", _PyCFunction_CAST(datetime_astimezone), METH_VARARGS | METH_KEYWORDS, PyDoc_STR("tz -> convert to local time in new timezone tz\n")}, {"__reduce_ex__", (PyCFunction)datetime_reduce_ex, METH_VARARGS, diff --git a/Modules/_decimal/_decimal.c b/Modules/_decimal/_decimal.c index 8c08847328bc0..65885965ff046 100644 --- a/Modules/_decimal/_decimal.c +++ b/Modules/_decimal/_decimal.c @@ -4904,30 +4904,30 @@ static PyNumberMethods dec_number_methods = static PyMethodDef dec_methods [] = { /* Unary arithmetic functions, optional context arg */ - { "exp", (PyCFunction)(void(*)(void))dec_mpd_qexp, METH_VARARGS|METH_KEYWORDS, doc_exp }, - { "ln", (PyCFunction)(void(*)(void))dec_mpd_qln, METH_VARARGS|METH_KEYWORDS, doc_ln }, - { "log10", (PyCFunction)(void(*)(void))dec_mpd_qlog10, METH_VARARGS|METH_KEYWORDS, doc_log10 }, - { "next_minus", (PyCFunction)(void(*)(void))dec_mpd_qnext_minus, METH_VARARGS|METH_KEYWORDS, doc_next_minus }, - { "next_plus", (PyCFunction)(void(*)(void))dec_mpd_qnext_plus, METH_VARARGS|METH_KEYWORDS, doc_next_plus }, - { "normalize", (PyCFunction)(void(*)(void))dec_mpd_qreduce, METH_VARARGS|METH_KEYWORDS, doc_normalize }, - { "to_integral", (PyCFunction)(void(*)(void))PyDec_ToIntegralValue, METH_VARARGS|METH_KEYWORDS, doc_to_integral }, - { "to_integral_exact", (PyCFunction)(void(*)(void))PyDec_ToIntegralExact, METH_VARARGS|METH_KEYWORDS, doc_to_integral_exact }, - { "to_integral_value", (PyCFunction)(void(*)(void))PyDec_ToIntegralValue, METH_VARARGS|METH_KEYWORDS, doc_to_integral_value }, - { "sqrt", (PyCFunction)(void(*)(void))dec_mpd_qsqrt, METH_VARARGS|METH_KEYWORDS, doc_sqrt }, + { "exp", _PyCFunction_CAST(dec_mpd_qexp), METH_VARARGS|METH_KEYWORDS, doc_exp }, + { "ln", _PyCFunction_CAST(dec_mpd_qln), METH_VARARGS|METH_KEYWORDS, doc_ln }, + { "log10", _PyCFunction_CAST(dec_mpd_qlog10), METH_VARARGS|METH_KEYWORDS, doc_log10 }, + { "next_minus", _PyCFunction_CAST(dec_mpd_qnext_minus), METH_VARARGS|METH_KEYWORDS, doc_next_minus }, + { "next_plus", _PyCFunction_CAST(dec_mpd_qnext_plus), METH_VARARGS|METH_KEYWORDS, doc_next_plus }, + { "normalize", _PyCFunction_CAST(dec_mpd_qreduce), METH_VARARGS|METH_KEYWORDS, doc_normalize }, + { "to_integral", _PyCFunction_CAST(PyDec_ToIntegralValue), METH_VARARGS|METH_KEYWORDS, doc_to_integral }, + { "to_integral_exact", _PyCFunction_CAST(PyDec_ToIntegralExact), METH_VARARGS|METH_KEYWORDS, doc_to_integral_exact }, + { "to_integral_value", _PyCFunction_CAST(PyDec_ToIntegralValue), METH_VARARGS|METH_KEYWORDS, doc_to_integral_value }, + { "sqrt", _PyCFunction_CAST(dec_mpd_qsqrt), METH_VARARGS|METH_KEYWORDS, doc_sqrt }, /* Binary arithmetic functions, optional context arg */ - { "compare", (PyCFunction)(void(*)(void))dec_mpd_qcompare, METH_VARARGS|METH_KEYWORDS, doc_compare }, - { "compare_signal", (PyCFunction)(void(*)(void))dec_mpd_qcompare_signal, METH_VARARGS|METH_KEYWORDS, doc_compare_signal }, - { "max", (PyCFunction)(void(*)(void))dec_mpd_qmax, METH_VARARGS|METH_KEYWORDS, doc_max }, - { "max_mag", (PyCFunction)(void(*)(void))dec_mpd_qmax_mag, METH_VARARGS|METH_KEYWORDS, doc_max_mag }, - { "min", (PyCFunction)(void(*)(void))dec_mpd_qmin, METH_VARARGS|METH_KEYWORDS, doc_min }, - { "min_mag", (PyCFunction)(void(*)(void))dec_mpd_qmin_mag, METH_VARARGS|METH_KEYWORDS, doc_min_mag }, - { "next_toward", (PyCFunction)(void(*)(void))dec_mpd_qnext_toward, METH_VARARGS|METH_KEYWORDS, doc_next_toward }, - { "quantize", (PyCFunction)(void(*)(void))dec_mpd_qquantize, METH_VARARGS|METH_KEYWORDS, doc_quantize }, - { "remainder_near", (PyCFunction)(void(*)(void))dec_mpd_qrem_near, METH_VARARGS|METH_KEYWORDS, doc_remainder_near }, + { "compare", _PyCFunction_CAST(dec_mpd_qcompare), METH_VARARGS|METH_KEYWORDS, doc_compare }, + { "compare_signal", _PyCFunction_CAST(dec_mpd_qcompare_signal), METH_VARARGS|METH_KEYWORDS, doc_compare_signal }, + { "max", _PyCFunction_CAST(dec_mpd_qmax), METH_VARARGS|METH_KEYWORDS, doc_max }, + { "max_mag", _PyCFunction_CAST(dec_mpd_qmax_mag), METH_VARARGS|METH_KEYWORDS, doc_max_mag }, + { "min", _PyCFunction_CAST(dec_mpd_qmin), METH_VARARGS|METH_KEYWORDS, doc_min }, + { "min_mag", _PyCFunction_CAST(dec_mpd_qmin_mag), METH_VARARGS|METH_KEYWORDS, doc_min_mag }, + { "next_toward", _PyCFunction_CAST(dec_mpd_qnext_toward), METH_VARARGS|METH_KEYWORDS, doc_next_toward }, + { "quantize", _PyCFunction_CAST(dec_mpd_qquantize), METH_VARARGS|METH_KEYWORDS, doc_quantize }, + { "remainder_near", _PyCFunction_CAST(dec_mpd_qrem_near), METH_VARARGS|METH_KEYWORDS, doc_remainder_near }, /* Ternary arithmetic functions, optional context arg */ - { "fma", (PyCFunction)(void(*)(void))dec_mpd_qfma, METH_VARARGS|METH_KEYWORDS, doc_fma }, + { "fma", _PyCFunction_CAST(dec_mpd_qfma), METH_VARARGS|METH_KEYWORDS, doc_fma }, /* Boolean functions, no context arg */ { "is_canonical", dec_mpd_iscanonical, METH_NOARGS, doc_is_canonical }, @@ -4940,8 +4940,8 @@ static PyMethodDef dec_methods [] = { "is_zero", dec_mpd_iszero, METH_NOARGS, doc_is_zero }, /* Boolean functions, optional context arg */ - { "is_normal", (PyCFunction)(void(*)(void))dec_mpd_isnormal, METH_VARARGS|METH_KEYWORDS, doc_is_normal }, - { "is_subnormal", (PyCFunction)(void(*)(void))dec_mpd_issubnormal, METH_VARARGS|METH_KEYWORDS, doc_is_subnormal }, + { "is_normal", _PyCFunction_CAST(dec_mpd_isnormal), METH_VARARGS|METH_KEYWORDS, doc_is_normal }, + { "is_subnormal", _PyCFunction_CAST(dec_mpd_issubnormal), METH_VARARGS|METH_KEYWORDS, doc_is_subnormal }, /* Unary functions, no context arg */ { "adjusted", dec_mpd_adjexp, METH_NOARGS, doc_adjusted }, @@ -4954,24 +4954,24 @@ static PyMethodDef dec_methods [] = { "copy_negate", dec_mpd_qcopy_negate, METH_NOARGS, doc_copy_negate }, /* Unary functions, optional context arg */ - { "logb", (PyCFunction)(void(*)(void))dec_mpd_qlogb, METH_VARARGS|METH_KEYWORDS, doc_logb }, - { "logical_invert", (PyCFunction)(void(*)(void))dec_mpd_qinvert, METH_VARARGS|METH_KEYWORDS, doc_logical_invert }, - { "number_class", (PyCFunction)(void(*)(void))dec_mpd_class, METH_VARARGS|METH_KEYWORDS, doc_number_class }, - { "to_eng_string", (PyCFunction)(void(*)(void))dec_mpd_to_eng, METH_VARARGS|METH_KEYWORDS, doc_to_eng_string }, + { "logb", _PyCFunction_CAST(dec_mpd_qlogb), METH_VARARGS|METH_KEYWORDS, doc_logb }, + { "logical_invert", _PyCFunction_CAST(dec_mpd_qinvert), METH_VARARGS|METH_KEYWORDS, doc_logical_invert }, + { "number_class", _PyCFunction_CAST(dec_mpd_class), METH_VARARGS|METH_KEYWORDS, doc_number_class }, + { "to_eng_string", _PyCFunction_CAST(dec_mpd_to_eng), METH_VARARGS|METH_KEYWORDS, doc_to_eng_string }, /* Binary functions, optional context arg for conversion errors */ - { "compare_total", (PyCFunction)(void(*)(void))dec_mpd_compare_total, METH_VARARGS|METH_KEYWORDS, doc_compare_total }, - { "compare_total_mag", (PyCFunction)(void(*)(void))dec_mpd_compare_total_mag, METH_VARARGS|METH_KEYWORDS, doc_compare_total_mag }, - { "copy_sign", (PyCFunction)(void(*)(void))dec_mpd_qcopy_sign, METH_VARARGS|METH_KEYWORDS, doc_copy_sign }, - { "same_quantum", (PyCFunction)(void(*)(void))dec_mpd_same_quantum, METH_VARARGS|METH_KEYWORDS, doc_same_quantum }, + { "compare_total", _PyCFunction_CAST(dec_mpd_compare_total), METH_VARARGS|METH_KEYWORDS, doc_compare_total }, + { "compare_total_mag", _PyCFunction_CAST(dec_mpd_compare_total_mag), METH_VARARGS|METH_KEYWORDS, doc_compare_total_mag }, + { "copy_sign", _PyCFunction_CAST(dec_mpd_qcopy_sign), METH_VARARGS|METH_KEYWORDS, doc_copy_sign }, + { "same_quantum", _PyCFunction_CAST(dec_mpd_same_quantum), METH_VARARGS|METH_KEYWORDS, doc_same_quantum }, /* Binary functions, optional context arg */ - { "logical_and", (PyCFunction)(void(*)(void))dec_mpd_qand, METH_VARARGS|METH_KEYWORDS, doc_logical_and }, - { "logical_or", (PyCFunction)(void(*)(void))dec_mpd_qor, METH_VARARGS|METH_KEYWORDS, doc_logical_or }, - { "logical_xor", (PyCFunction)(void(*)(void))dec_mpd_qxor, METH_VARARGS|METH_KEYWORDS, doc_logical_xor }, - { "rotate", (PyCFunction)(void(*)(void))dec_mpd_qrotate, METH_VARARGS|METH_KEYWORDS, doc_rotate }, - { "scaleb", (PyCFunction)(void(*)(void))dec_mpd_qscaleb, METH_VARARGS|METH_KEYWORDS, doc_scaleb }, - { "shift", (PyCFunction)(void(*)(void))dec_mpd_qshift, METH_VARARGS|METH_KEYWORDS, doc_shift }, + { "logical_and", _PyCFunction_CAST(dec_mpd_qand), METH_VARARGS|METH_KEYWORDS, doc_logical_and }, + { "logical_or", _PyCFunction_CAST(dec_mpd_qor), METH_VARARGS|METH_KEYWORDS, doc_logical_or }, + { "logical_xor", _PyCFunction_CAST(dec_mpd_qxor), METH_VARARGS|METH_KEYWORDS, doc_logical_xor }, + { "rotate", _PyCFunction_CAST(dec_mpd_qrotate), METH_VARARGS|METH_KEYWORDS, doc_rotate }, + { "scaleb", _PyCFunction_CAST(dec_mpd_qscaleb), METH_VARARGS|METH_KEYWORDS, doc_scaleb }, + { "shift", _PyCFunction_CAST(dec_mpd_qshift), METH_VARARGS|METH_KEYWORDS, doc_shift }, /* Miscellaneous */ { "from_float", dec_from_float, METH_O|METH_CLASS, doc_from_float }, @@ -5609,7 +5609,7 @@ static PyMethodDef context_methods [] = { "subtract", ctx_mpd_qsub, METH_VARARGS, doc_ctx_subtract }, /* Binary or ternary arithmetic functions */ - { "power", (PyCFunction)(void(*)(void))ctx_mpd_qpow, METH_VARARGS|METH_KEYWORDS, doc_ctx_power }, + { "power", _PyCFunction_CAST(ctx_mpd_qpow), METH_VARARGS|METH_KEYWORDS, doc_ctx_power }, /* Ternary arithmetic functions */ { "fma", ctx_mpd_qfma, METH_VARARGS, doc_ctx_fma }, @@ -5727,7 +5727,7 @@ static PyMethodDef _decimal_methods [] = { { "getcontext", (PyCFunction)PyDec_GetCurrentContext, METH_NOARGS, doc_getcontext}, { "setcontext", (PyCFunction)PyDec_SetCurrentContext, METH_O, doc_setcontext}, - { "localcontext", (PyCFunction)(void(*)(void))ctxmanager_new, METH_VARARGS|METH_KEYWORDS, doc_localcontext}, + { "localcontext", _PyCFunction_CAST(ctxmanager_new), METH_VARARGS|METH_KEYWORDS, doc_localcontext}, #ifdef EXTRA_FUNCTIONALITY { "IEEEContext", (PyCFunction)ieee_context, METH_O, doc_ieee_context}, #endif diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c index 1794124aa45ad..89f877f6e1279 100644 --- a/Modules/_elementtree.c +++ b/Modules/_elementtree.c @@ -4349,7 +4349,7 @@ static PyTypeObject XMLParser_Type = { /* python module interface */ static PyMethodDef _functions[] = { - {"SubElement", (PyCFunction)(void(*)(void)) subelement, METH_VARARGS | METH_KEYWORDS}, + {"SubElement", _PyCFunction_CAST(subelement), METH_VARARGS | METH_KEYWORDS}, _ELEMENTTREE__SET_FACTORIES_METHODDEF {NULL, NULL} }; diff --git a/Modules/_functoolsmodule.c b/Modules/_functoolsmodule.c index 0974fc704ffbd..c6d6ca934e9c4 100644 --- a/Modules/_functoolsmodule.c +++ b/Modules/_functoolsmodule.c @@ -1432,7 +1432,7 @@ PyDoc_STRVAR(_functools_doc, static PyMethodDef _functools_methods[] = { {"reduce", functools_reduce, METH_VARARGS, functools_reduce_doc}, - {"cmp_to_key", (PyCFunction)(void(*)(void))functools_cmp_to_key, + {"cmp_to_key", _PyCFunction_CAST(functools_cmp_to_key), METH_VARARGS | METH_KEYWORDS, functools_cmp_to_key_doc}, {NULL, NULL} /* sentinel */ }; diff --git a/Modules/_lsprof.c b/Modules/_lsprof.c index ff499aacbab37..9ba45e69ef4e2 100644 --- a/Modules/_lsprof.c +++ b/Modules/_lsprof.c @@ -787,7 +787,7 @@ profiler_init(ProfilerObject *pObj, PyObject *args, PyObject *kw) static PyMethodDef profiler_methods[] = { _LSPROF_PROFILER_GETSTATS_METHODDEF - {"enable", (PyCFunction)(void(*)(void))profiler_enable, + {"enable", _PyCFunction_CAST(profiler_enable), METH_VARARGS | METH_KEYWORDS, enable_doc}, {"disable", (PyCFunction)profiler_disable, METH_NOARGS, disable_doc}, diff --git a/Modules/_operator.c b/Modules/_operator.c index fdc3176c8395f..739ae5b229e1e 100644 --- a/Modules/_operator.c +++ b/Modules/_operator.c @@ -893,7 +893,7 @@ PyDoc_STRVAR(_operator_call__doc__, "Same as obj(*args, **kwargs)."); #define _OPERATOR_CALL_METHODDEF \ - {"call", (PyCFunction)(void(*)(void))_operator_call, METH_FASTCALL | METH_KEYWORDS, _operator_call__doc__}, + {"call", _PyCFunction_CAST(_operator_call), METH_FASTCALL | METH_KEYWORDS, _operator_call__doc__}, static PyObject * _operator_call(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) diff --git a/Modules/_struct.c b/Modules/_struct.c index 7cd0ef8d87b36..4daf9529d882c 100644 --- a/Modules/_struct.c +++ b/Modules/_struct.c @@ -2049,8 +2049,8 @@ s_sizeof(PyStructObject *self, void *unused) static struct PyMethodDef s_methods[] = { STRUCT_ITER_UNPACK_METHODDEF - {"pack", (PyCFunction)(void(*)(void))s_pack, METH_FASTCALL, s_pack__doc__}, - {"pack_into", (PyCFunction)(void(*)(void))s_pack_into, METH_FASTCALL, s_pack_into__doc__}, + {"pack", _PyCFunction_CAST(s_pack), METH_FASTCALL, s_pack__doc__}, + {"pack_into", _PyCFunction_CAST(s_pack_into), METH_FASTCALL, s_pack_into__doc__}, STRUCT_UNPACK_METHODDEF STRUCT_UNPACK_FROM_METHODDEF {"__sizeof__", (PyCFunction)s_sizeof, METH_NOARGS, s_sizeof__doc__}, @@ -2298,8 +2298,8 @@ static struct PyMethodDef module_functions[] = { _CLEARCACHE_METHODDEF CALCSIZE_METHODDEF ITER_UNPACK_METHODDEF - {"pack", (PyCFunction)(void(*)(void))pack, METH_FASTCALL, pack_doc}, - {"pack_into", (PyCFunction)(void(*)(void))pack_into, METH_FASTCALL, pack_into_doc}, + {"pack", _PyCFunction_CAST(pack), METH_FASTCALL, pack_doc}, + {"pack_into", _PyCFunction_CAST(pack_into), METH_FASTCALL, pack_into_doc}, UNPACK_METHODDEF UNPACK_FROM_METHODDEF {NULL, NULL} /* sentinel */ diff --git a/Modules/_testbuffer.c b/Modules/_testbuffer.c index 1b4fb09fb8fbc..eea9d217557e2 100644 --- a/Modules/_testbuffer.c +++ b/Modules/_testbuffer.c @@ -2633,7 +2633,7 @@ static PyMethodDef ndarray_methods [] = { { "tolist", ndarray_tolist, METH_NOARGS, NULL }, { "tobytes", ndarray_tobytes, METH_NOARGS, NULL }, - { "push", (PyCFunction)(void(*)(void))ndarray_push, METH_VARARGS|METH_KEYWORDS, NULL }, + { "push", _PyCFunction_CAST(ndarray_push), METH_VARARGS|METH_KEYWORDS, NULL }, { "pop", ndarray_pop, METH_NOARGS, NULL }, { "add_suboffsets", ndarray_add_suboffsets, METH_NOARGS, NULL }, { "memoryview_from_buffer", ndarray_memoryview_from_buffer, METH_NOARGS, NULL }, diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index 26d8d38f2f795..be9ed50e0dbeb 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -6034,15 +6034,15 @@ static PyMethodDef TestMethods[] = { {"test_get_type_name", test_get_type_name, METH_NOARGS}, {"test_get_type_qualname", test_get_type_qualname, METH_NOARGS}, {"test_type_from_ephemeral_spec", test_type_from_ephemeral_spec, METH_NOARGS}, - {"get_kwargs", (PyCFunction)(void(*)(void))get_kwargs, + {"get_kwargs", _PyCFunction_CAST(get_kwargs), METH_VARARGS|METH_KEYWORDS}, {"getargs_tuple", getargs_tuple, METH_VARARGS}, - {"getargs_keywords", (PyCFunction)(void(*)(void))getargs_keywords, + {"getargs_keywords", _PyCFunction_CAST(getargs_keywords), METH_VARARGS|METH_KEYWORDS}, - {"getargs_keyword_only", (PyCFunction)(void(*)(void))getargs_keyword_only, + {"getargs_keyword_only", _PyCFunction_CAST(getargs_keyword_only), METH_VARARGS|METH_KEYWORDS}, {"getargs_positional_only_and_keywords", - (PyCFunction)(void(*)(void))getargs_positional_only_and_keywords, + _PyCFunction_CAST(getargs_positional_only_and_keywords), METH_VARARGS|METH_KEYWORDS}, {"getargs_b", getargs_b, METH_VARARGS}, {"getargs_B", getargs_B, METH_VARARGS}, @@ -6070,7 +6070,7 @@ static PyMethodDef TestMethods[] = { {"getargs_s", getargs_s, METH_VARARGS}, {"getargs_s_star", getargs_s_star, METH_VARARGS}, {"getargs_s_hash", getargs_s_hash, METH_VARARGS}, - {"getargs_s_hash_int", (PyCFunction)(void(*)(void))getargs_s_hash_int, + {"getargs_s_hash_int", _PyCFunction_CAST(getargs_s_hash_int), METH_VARARGS|METH_KEYWORDS}, {"getargs_z", getargs_z, METH_VARARGS}, {"getargs_z_star", getargs_z_star, METH_VARARGS}, @@ -6118,7 +6118,7 @@ static PyMethodDef TestMethods[] = { {"set_exc_info", test_set_exc_info, METH_VARARGS}, {"argparsing", argparsing, METH_VARARGS}, {"code_newempty", code_newempty, METH_VARARGS}, - {"make_exception_with_doc", (PyCFunction)(void(*)(void))make_exception_with_doc, + {"make_exception_with_doc", _PyCFunction_CAST(make_exception_with_doc), METH_VARARGS | METH_KEYWORDS}, {"make_memoryview_from_NULL_pointer", make_memoryview_from_NULL_pointer, METH_NOARGS}, @@ -6219,18 +6219,18 @@ static PyMethodDef TestMethods[] = { {"get_mapping_items", get_mapping_items, METH_O}, {"test_pythread_tss_key_state", test_pythread_tss_key_state, METH_VARARGS}, {"hamt", new_hamt, METH_NOARGS}, - {"bad_get", (PyCFunction)(void(*)(void))bad_get, METH_FASTCALL}, + {"bad_get", _PyCFunction_CAST(bad_get), METH_FASTCALL}, #ifdef Py_REF_DEBUG {"negative_refcount", negative_refcount, METH_NOARGS}, #endif {"write_unraisable_exc", test_write_unraisable_exc, METH_VARARGS}, {"sequence_getitem", sequence_getitem, METH_VARARGS}, {"meth_varargs", meth_varargs, METH_VARARGS}, - {"meth_varargs_keywords", (PyCFunction)(void(*)(void))meth_varargs_keywords, METH_VARARGS|METH_KEYWORDS}, + {"meth_varargs_keywords", _PyCFunction_CAST(meth_varargs_keywords), METH_VARARGS|METH_KEYWORDS}, {"meth_o", meth_o, METH_O}, {"meth_noargs", meth_noargs, METH_NOARGS}, - {"meth_fastcall", (PyCFunction)(void(*)(void))meth_fastcall, METH_FASTCALL}, - {"meth_fastcall_keywords", (PyCFunction)(void(*)(void))meth_fastcall_keywords, METH_FASTCALL|METH_KEYWORDS}, + {"meth_fastcall", _PyCFunction_CAST(meth_fastcall), METH_FASTCALL}, + {"meth_fastcall_keywords", _PyCFunction_CAST(meth_fastcall_keywords), METH_FASTCALL|METH_KEYWORDS}, {"pynumber_tobase", pynumber_tobase, METH_VARARGS}, {"without_gc", without_gc, METH_O}, {"test_set_type_size", test_set_type_size, METH_NOARGS}, @@ -6760,7 +6760,7 @@ generic_alias_mro_entries(PyGenericAliasObject *self, PyObject *bases) } static PyMethodDef generic_alias_methods[] = { - {"__mro_entries__", (PyCFunction)(void(*)(void))generic_alias_mro_entries, METH_O, NULL}, + {"__mro_entries__", _PyCFunction_CAST(generic_alias_mro_entries), METH_O, NULL}, {NULL} /* sentinel */ }; @@ -7383,11 +7383,11 @@ static PyType_Spec HeapCTypeSetattr_spec = { static PyMethodDef meth_instance_methods[] = { {"meth_varargs", meth_varargs, METH_VARARGS}, - {"meth_varargs_keywords", (PyCFunction)(void(*)(void))meth_varargs_keywords, METH_VARARGS|METH_KEYWORDS}, + {"meth_varargs_keywords", _PyCFunction_CAST(meth_varargs_keywords), METH_VARARGS|METH_KEYWORDS}, {"meth_o", meth_o, METH_O}, {"meth_noargs", meth_noargs, METH_NOARGS}, - {"meth_fastcall", (PyCFunction)(void(*)(void))meth_fastcall, METH_FASTCALL}, - {"meth_fastcall_keywords", (PyCFunction)(void(*)(void))meth_fastcall_keywords, METH_FASTCALL|METH_KEYWORDS}, + {"meth_fastcall", _PyCFunction_CAST(meth_fastcall), METH_FASTCALL}, + {"meth_fastcall_keywords", _PyCFunction_CAST(meth_fastcall_keywords), METH_FASTCALL|METH_KEYWORDS}, {NULL, NULL} /* sentinel */ }; @@ -7405,11 +7405,11 @@ static PyTypeObject MethInstance_Type = { static PyMethodDef meth_class_methods[] = { {"meth_varargs", meth_varargs, METH_VARARGS|METH_CLASS}, - {"meth_varargs_keywords", (PyCFunction)(void(*)(void))meth_varargs_keywords, METH_VARARGS|METH_KEYWORDS|METH_CLASS}, + {"meth_varargs_keywords", _PyCFunction_CAST(meth_varargs_keywords), METH_VARARGS|METH_KEYWORDS|METH_CLASS}, {"meth_o", meth_o, METH_O|METH_CLASS}, {"meth_noargs", meth_noargs, METH_NOARGS|METH_CLASS}, - {"meth_fastcall", (PyCFunction)(void(*)(void))meth_fastcall, METH_FASTCALL|METH_CLASS}, - {"meth_fastcall_keywords", (PyCFunction)(void(*)(void))meth_fastcall_keywords, METH_FASTCALL|METH_KEYWORDS|METH_CLASS}, + {"meth_fastcall", _PyCFunction_CAST(meth_fastcall), METH_FASTCALL|METH_CLASS}, + {"meth_fastcall_keywords", _PyCFunction_CAST(meth_fastcall_keywords), METH_FASTCALL|METH_KEYWORDS|METH_CLASS}, {NULL, NULL} /* sentinel */ }; @@ -7427,11 +7427,11 @@ static PyTypeObject MethClass_Type = { static PyMethodDef meth_static_methods[] = { {"meth_varargs", meth_varargs, METH_VARARGS|METH_STATIC}, - {"meth_varargs_keywords", (PyCFunction)(void(*)(void))meth_varargs_keywords, METH_VARARGS|METH_KEYWORDS|METH_STATIC}, + {"meth_varargs_keywords", _PyCFunction_CAST(meth_varargs_keywords), METH_VARARGS|METH_KEYWORDS|METH_STATIC}, {"meth_o", meth_o, METH_O|METH_STATIC}, {"meth_noargs", meth_noargs, METH_NOARGS|METH_STATIC}, - {"meth_fastcall", (PyCFunction)(void(*)(void))meth_fastcall, METH_FASTCALL|METH_STATIC}, - {"meth_fastcall_keywords", (PyCFunction)(void(*)(void))meth_fastcall_keywords, METH_FASTCALL|METH_KEYWORDS|METH_STATIC}, + {"meth_fastcall", _PyCFunction_CAST(meth_fastcall), METH_FASTCALL|METH_STATIC}, + {"meth_fastcall_keywords", _PyCFunction_CAST(meth_fastcall_keywords), METH_FASTCALL|METH_KEYWORDS|METH_STATIC}, {NULL, NULL} /* sentinel */ }; diff --git a/Modules/_testmultiphase.c b/Modules/_testmultiphase.c index 1b4f58eb1c0b4..b8993a29ae95d 100644 --- a/Modules/_testmultiphase.c +++ b/Modules/_testmultiphase.c @@ -274,7 +274,7 @@ static PyMethodDef StateAccessType_methods[] = { _TESTMULTIPHASE_STATEACCESSTYPE_INCREMENT_COUNT_CLINIC_METHODDEF { "increment_count_noclinic", - (PyCFunction)(void(*)(void))_StateAccessType_increment_count_noclinic, + _PyCFunction_CAST(_StateAccessType_increment_count_noclinic), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _StateAccessType_decrement_count__doc__ }, diff --git a/Modules/_threadmodule.c b/Modules/_threadmodule.c index ca74f9d6977e2..ace0282ea6fce 100644 --- a/Modules/_threadmodule.c +++ b/Modules/_threadmodule.c @@ -254,9 +254,9 @@ lock__at_fork_reinit(lockobject *self, PyObject *Py_UNUSED(args)) static PyMethodDef lock_methods[] = { - {"acquire_lock", (PyCFunction)(void(*)(void))lock_PyThread_acquire_lock, + {"acquire_lock", _PyCFunction_CAST(lock_PyThread_acquire_lock), METH_VARARGS | METH_KEYWORDS, acquire_doc}, - {"acquire", (PyCFunction)(void(*)(void))lock_PyThread_acquire_lock, + {"acquire", _PyCFunction_CAST(lock_PyThread_acquire_lock), METH_VARARGS | METH_KEYWORDS, acquire_doc}, {"release_lock", (PyCFunction)lock_PyThread_release_lock, METH_NOARGS, release_doc}, @@ -266,7 +266,7 @@ static PyMethodDef lock_methods[] = { METH_NOARGS, locked_doc}, {"locked", (PyCFunction)lock_locked_lock, METH_NOARGS, locked_doc}, - {"__enter__", (PyCFunction)(void(*)(void))lock_PyThread_acquire_lock, + {"__enter__", _PyCFunction_CAST(lock_PyThread_acquire_lock), METH_VARARGS | METH_KEYWORDS, acquire_doc}, {"__exit__", (PyCFunction)lock_PyThread_release_lock, METH_VARARGS, release_doc}, @@ -548,7 +548,7 @@ rlock__at_fork_reinit(rlockobject *self, PyObject *Py_UNUSED(args)) static PyMethodDef rlock_methods[] = { - {"acquire", (PyCFunction)(void(*)(void))rlock_acquire, + {"acquire", _PyCFunction_CAST(rlock_acquire), METH_VARARGS | METH_KEYWORDS, rlock_acquire_doc}, {"release", (PyCFunction)rlock_release, METH_NOARGS, rlock_release_doc}, @@ -558,7 +558,7 @@ static PyMethodDef rlock_methods[] = { METH_VARARGS, rlock_acquire_restore_doc}, {"_release_save", (PyCFunction)rlock_release_save, METH_NOARGS, rlock_release_save_doc}, - {"__enter__", (PyCFunction)(void(*)(void))rlock_acquire, + {"__enter__", _PyCFunction_CAST(rlock_acquire), METH_VARARGS | METH_KEYWORDS, rlock_acquire_doc}, {"__exit__", (PyCFunction)rlock_release, METH_VARARGS, rlock_release_doc}, diff --git a/Modules/_xxsubinterpretersmodule.c b/Modules/_xxsubinterpretersmodule.c index 0e37ce0aa3fe3..9b1f186c5b6c7 100644 --- a/Modules/_xxsubinterpretersmodule.c +++ b/Modules/_xxsubinterpretersmodule.c @@ -2559,9 +2559,9 @@ channel__channel_id(PyObject *self, PyObject *args, PyObject *kwds) } static PyMethodDef module_functions[] = { - {"create", (PyCFunction)(void(*)(void))interp_create, + {"create", _PyCFunction_CAST(interp_create), METH_VARARGS | METH_KEYWORDS, create_doc}, - {"destroy", (PyCFunction)(void(*)(void))interp_destroy, + {"destroy", _PyCFunction_CAST(interp_destroy), METH_VARARGS | METH_KEYWORDS, destroy_doc}, {"list_all", interp_list_all, METH_NOARGS, list_all_doc}, @@ -2569,31 +2569,31 @@ static PyMethodDef module_functions[] = { METH_NOARGS, get_current_doc}, {"get_main", interp_get_main, METH_NOARGS, get_main_doc}, - {"is_running", (PyCFunction)(void(*)(void))interp_is_running, + {"is_running", _PyCFunction_CAST(interp_is_running), METH_VARARGS | METH_KEYWORDS, is_running_doc}, - {"run_string", (PyCFunction)(void(*)(void))interp_run_string, + {"run_string", _PyCFunction_CAST(interp_run_string), METH_VARARGS | METH_KEYWORDS, run_string_doc}, - {"is_shareable", (PyCFunction)(void(*)(void))object_is_shareable, + {"is_shareable", _PyCFunction_CAST(object_is_shareable), METH_VARARGS | METH_KEYWORDS, is_shareable_doc}, {"channel_create", channel_create, METH_NOARGS, channel_create_doc}, - {"channel_destroy", (PyCFunction)(void(*)(void))channel_destroy, + {"channel_destroy", _PyCFunction_CAST(channel_destroy), METH_VARARGS | METH_KEYWORDS, channel_destroy_doc}, {"channel_list_all", channel_list_all, METH_NOARGS, channel_list_all_doc}, - {"channel_list_interpreters", (PyCFunction)(void(*)(void))channel_list_interpreters, + {"channel_list_interpreters", _PyCFunction_CAST(channel_list_interpreters), METH_VARARGS | METH_KEYWORDS, channel_list_interpreters_doc}, - {"channel_send", (PyCFunction)(void(*)(void))channel_send, + {"channel_send", _PyCFunction_CAST(channel_send), METH_VARARGS | METH_KEYWORDS, channel_send_doc}, - {"channel_recv", (PyCFunction)(void(*)(void))channel_recv, + {"channel_recv", _PyCFunction_CAST(channel_recv), METH_VARARGS | METH_KEYWORDS, channel_recv_doc}, - {"channel_close", (PyCFunction)(void(*)(void))channel_close, + {"channel_close", _PyCFunction_CAST(channel_close), METH_VARARGS | METH_KEYWORDS, channel_close_doc}, - {"channel_release", (PyCFunction)(void(*)(void))channel_release, + {"channel_release", _PyCFunction_CAST(channel_release), METH_VARARGS | METH_KEYWORDS, channel_release_doc}, - {"_channel_id", (PyCFunction)(void(*)(void))channel__channel_id, + {"_channel_id", _PyCFunction_CAST(channel__channel_id), METH_VARARGS | METH_KEYWORDS, NULL}, {NULL, NULL} /* sentinel */ diff --git a/Modules/atexitmodule.c b/Modules/atexitmodule.c index 95c653cf4782a..e806730aa9cf2 100644 --- a/Modules/atexitmodule.c +++ b/Modules/atexitmodule.c @@ -251,7 +251,7 @@ atexit_unregister(PyObject *module, PyObject *func) static PyMethodDef atexit_methods[] = { - {"register", (PyCFunction)(void(*)(void)) atexit_register, METH_VARARGS|METH_KEYWORDS, + {"register", _PyCFunction_CAST(atexit_register), METH_VARARGS|METH_KEYWORDS, atexit_register__doc__}, {"_clear", (PyCFunction) atexit_clear, METH_NOARGS, atexit_clear__doc__}, diff --git a/Modules/faulthandler.c b/Modules/faulthandler.c index 4f709edb479a2..08c40834c45f2 100644 --- a/Modules/faulthandler.c +++ b/Modules/faulthandler.c @@ -1229,7 +1229,7 @@ PyDoc_STRVAR(module_doc, static PyMethodDef module_methods[] = { {"enable", - (PyCFunction)(void(*)(void))faulthandler_py_enable, METH_VARARGS|METH_KEYWORDS, + _PyCFunction_CAST(faulthandler_py_enable), METH_VARARGS|METH_KEYWORDS, PyDoc_STR("enable(file=sys.stderr, all_threads=True): " "enable the fault handler")}, {"disable", faulthandler_disable_py, METH_NOARGS, @@ -1237,12 +1237,12 @@ static PyMethodDef module_methods[] = { {"is_enabled", faulthandler_is_enabled, METH_NOARGS, PyDoc_STR("is_enabled()->bool: check if the handler is enabled")}, {"dump_traceback", - (PyCFunction)(void(*)(void))faulthandler_dump_traceback_py, METH_VARARGS|METH_KEYWORDS, + _PyCFunction_CAST(faulthandler_dump_traceback_py), METH_VARARGS|METH_KEYWORDS, PyDoc_STR("dump_traceback(file=sys.stderr, all_threads=True): " "dump the traceback of the current thread, or of all threads " "if all_threads is True, into file")}, {"dump_traceback_later", - (PyCFunction)(void(*)(void))faulthandler_dump_traceback_later, METH_VARARGS|METH_KEYWORDS, + _PyCFunction_CAST(faulthandler_dump_traceback_later), METH_VARARGS|METH_KEYWORDS, PyDoc_STR("dump_traceback_later(timeout, repeat=False, file=sys.stderrn, exit=False):\n" "dump the traceback of all threads in timeout seconds,\n" "or each timeout seconds if repeat is True. If exit is True, " @@ -1253,13 +1253,13 @@ static PyMethodDef module_methods[] = { "to dump_traceback_later().")}, #ifdef FAULTHANDLER_USER {"register", - (PyCFunction)(void(*)(void))faulthandler_register_py, METH_VARARGS|METH_KEYWORDS, + _PyCFunction_CAST(faulthandler_register_py), METH_VARARGS|METH_KEYWORDS, PyDoc_STR("register(signum, file=sys.stderr, all_threads=True, chain=False): " "register a handler for the signal 'signum': dump the " "traceback of the current thread, or of all threads if " "all_threads is True, into file")}, {"unregister", - (PyCFunction)(void(*)(void))faulthandler_unregister_py, METH_VARARGS|METH_KEYWORDS, + _PyCFunction_CAST(faulthandler_unregister_py), METH_VARARGS|METH_KEYWORDS, PyDoc_STR("unregister(signum): unregister the handler of the signal " "'signum' registered by register()")}, #endif diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c index 8dd763f2720ee..aa93e756c606b 100644 --- a/Modules/mathmodule.c +++ b/Modules/mathmodule.c @@ -3852,11 +3852,11 @@ static PyMethodDef math_methods[] = { {"asin", math_asin, METH_O, math_asin_doc}, {"asinh", math_asinh, METH_O, math_asinh_doc}, {"atan", math_atan, METH_O, math_atan_doc}, - {"atan2", (PyCFunction)(void(*)(void))math_atan2, METH_FASTCALL, math_atan2_doc}, + {"atan2", _PyCFunction_CAST(math_atan2), METH_FASTCALL, math_atan2_doc}, {"atanh", math_atanh, METH_O, math_atanh_doc}, {"cbrt", math_cbrt, METH_O, math_cbrt_doc}, MATH_CEIL_METHODDEF - {"copysign", (PyCFunction)(void(*)(void))math_copysign, METH_FASTCALL, math_copysign_doc}, + {"copysign", _PyCFunction_CAST(math_copysign), METH_FASTCALL, math_copysign_doc}, {"cos", math_cos, METH_O, math_cos_doc}, {"cosh", math_cosh, METH_O, math_cosh_doc}, MATH_DEGREES_METHODDEF @@ -3873,14 +3873,14 @@ static PyMethodDef math_methods[] = { MATH_FREXP_METHODDEF MATH_FSUM_METHODDEF {"gamma", math_gamma, METH_O, math_gamma_doc}, - {"gcd", (PyCFunction)(void(*)(void))math_gcd, METH_FASTCALL, math_gcd_doc}, - {"hypot", (PyCFunction)(void(*)(void))math_hypot, METH_FASTCALL, math_hypot_doc}, + {"gcd", _PyCFunction_CAST(math_gcd), METH_FASTCALL, math_gcd_doc}, + {"hypot", _PyCFunction_CAST(math_hypot), METH_FASTCALL, math_hypot_doc}, MATH_ISCLOSE_METHODDEF MATH_ISFINITE_METHODDEF MATH_ISINF_METHODDEF MATH_ISNAN_METHODDEF MATH_ISQRT_METHODDEF - {"lcm", (PyCFunction)(void(*)(void))math_lcm, METH_FASTCALL, math_lcm_doc}, + {"lcm", _PyCFunction_CAST(math_lcm), METH_FASTCALL, math_lcm_doc}, MATH_LDEXP_METHODDEF {"lgamma", math_lgamma, METH_O, math_lgamma_doc}, MATH_LOG_METHODDEF @@ -3890,7 +3890,7 @@ static PyMethodDef math_methods[] = { MATH_MODF_METHODDEF MATH_POW_METHODDEF MATH_RADIANS_METHODDEF - {"remainder", (PyCFunction)(void(*)(void))math_remainder, METH_FASTCALL, math_remainder_doc}, + {"remainder", _PyCFunction_CAST(math_remainder), METH_FASTCALL, math_remainder_doc}, {"sin", math_sin, METH_O, math_sin_doc}, {"sinh", math_sinh, METH_O, math_sinh_doc}, {"sqrt", math_sqrt, METH_O, math_sqrt_doc}, diff --git a/Modules/nismodule.c b/Modules/nismodule.c index 948f756935db5..39b991162b276 100644 --- a/Modules/nismodule.c +++ b/Modules/nismodule.c @@ -469,13 +469,13 @@ nis_maps (PyObject *module, PyObject *args, PyObject *kwdict) } static PyMethodDef nis_methods[] = { - {"match", (PyCFunction)(void(*)(void))nis_match, + {"match", _PyCFunction_CAST(nis_match), METH_VARARGS | METH_KEYWORDS, match__doc__}, - {"cat", (PyCFunction)(void(*)(void))nis_cat, + {"cat", _PyCFunction_CAST(nis_cat), METH_VARARGS | METH_KEYWORDS, cat__doc__}, - {"maps", (PyCFunction)(void(*)(void))nis_maps, + {"maps", _PyCFunction_CAST(nis_maps), METH_VARARGS | METH_KEYWORDS, maps__doc__}, {"get_default_domain", nis_get_default_domain, diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c index b602338e4f91e..dfb1f923cdccf 100644 --- a/Modules/signalmodule.c +++ b/Modules/signalmodule.c @@ -1381,7 +1381,7 @@ static PyMethodDef signal_methods[] = { SIGNAL_RAISE_SIGNAL_METHODDEF SIGNAL_STRSIGNAL_METHODDEF SIGNAL_GETSIGNAL_METHODDEF - {"set_wakeup_fd", (PyCFunction)(void(*)(void))signal_set_wakeup_fd, METH_VARARGS | METH_KEYWORDS, set_wakeup_fd_doc}, + {"set_wakeup_fd", _PyCFunction_CAST(signal_set_wakeup_fd), METH_VARARGS | METH_KEYWORDS, set_wakeup_fd_doc}, SIGNAL_SIGINTERRUPT_METHODDEF SIGNAL_PAUSE_METHODDEF SIGNAL_PIDFD_SEND_SIGNAL_METHODDEF diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index c650b25c09509..bedb8bb423cee 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -4947,11 +4947,11 @@ static PyMethodDef sock_methods[] = { listen_doc}, {"recv", (PyCFunction)sock_recv, METH_VARARGS, recv_doc}, - {"recv_into", (PyCFunction)(void(*)(void))sock_recv_into, METH_VARARGS | METH_KEYWORDS, + {"recv_into", _PyCFunction_CAST(sock_recv_into), METH_VARARGS | METH_KEYWORDS, recv_into_doc}, {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS, recvfrom_doc}, - {"recvfrom_into", (PyCFunction)(void(*)(void))sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS, + {"recvfrom_into", _PyCFunction_CAST(sock_recvfrom_into), METH_VARARGS | METH_KEYWORDS, recvfrom_into_doc}, {"send", (PyCFunction)sock_send, METH_VARARGS, send_doc}, @@ -4982,7 +4982,7 @@ static PyMethodDef sock_methods[] = { sendmsg_doc}, #endif #ifdef HAVE_SOCKADDR_ALG - {"sendmsg_afalg", (PyCFunction)(void(*)(void))sock_sendmsg_afalg, METH_VARARGS | METH_KEYWORDS, + {"sendmsg_afalg", _PyCFunction_CAST(sock_sendmsg_afalg), METH_VARARGS | METH_KEYWORDS, sendmsg_afalg_doc}, #endif {NULL, NULL} /* sentinel */ @@ -6970,7 +6970,7 @@ static PyMethodDef socket_methods[] = { {"inet_ntop", socket_inet_ntop, METH_VARARGS, inet_ntop_doc}, #endif - {"getaddrinfo", (PyCFunction)(void(*)(void))socket_getaddrinfo, + {"getaddrinfo", _PyCFunction_CAST(socket_getaddrinfo), METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc}, {"getnameinfo", socket_getnameinfo, METH_VARARGS, getnameinfo_doc}, diff --git a/Modules/syslogmodule.c b/Modules/syslogmodule.c index 0f2fea15b3a6f..2655a0c94bbd9 100644 --- a/Modules/syslogmodule.c +++ b/Modules/syslogmodule.c @@ -252,7 +252,7 @@ syslog_log_upto(PyObject *self, PyObject *args) /* List of functions defined in the module */ static PyMethodDef syslog_methods[] = { - {"openlog", (PyCFunction)(void(*)(void)) syslog_openlog, METH_VARARGS | METH_KEYWORDS}, + {"openlog", _PyCFunction_CAST(syslog_openlog), METH_VARARGS | METH_KEYWORDS}, {"closelog", syslog_closelog, METH_NOARGS}, {"syslog", syslog_syslog, METH_VARARGS}, {"setlogmask", syslog_setlogmask, METH_VARARGS}, diff --git a/Modules/xxlimited.c b/Modules/xxlimited.c index c36bf5ce8e1f7..5177ecd6b515d 100644 --- a/Modules/xxlimited.c +++ b/Modules/xxlimited.c @@ -224,7 +224,7 @@ Xxo_demo(XxoObject *self, PyTypeObject *defining_class, } static PyMethodDef Xxo_methods[] = { - {"demo", (PyCFunction)(void(*)(void))Xxo_demo, + {"demo", _PyCFunction_CAST(Xxo_demo), METH_METHOD | METH_FASTCALL | METH_KEYWORDS, PyDoc_STR("demo(o) -> o")}, {NULL, NULL} /* sentinel */ }; diff --git a/Modules/xxsubtype.c b/Modules/xxsubtype.c index 768dac9d1b19b..12306f2fc5247 100644 --- a/Modules/xxsubtype.c +++ b/Modules/xxsubtype.c @@ -70,10 +70,10 @@ static PyMethodDef spamlist_methods[] = { PyDoc_STR("setstate(state)")}, /* These entries differ only in the flags; they are used by the tests in test.test_descr. */ - {"classmeth", (PyCFunction)(void(*)(void))spamlist_specialmeth, + {"classmeth", _PyCFunction_CAST(spamlist_specialmeth), METH_VARARGS | METH_KEYWORDS | METH_CLASS, PyDoc_STR("classmeth(*args, **kw)")}, - {"staticmeth", (PyCFunction)(void(*)(void))spamlist_specialmeth, + {"staticmeth", _PyCFunction_CAST(spamlist_specialmeth), METH_VARARGS | METH_KEYWORDS | METH_STATIC, PyDoc_STR("staticmeth(*args, **kw)")}, {NULL, NULL}, diff --git a/Objects/descrobject.c b/Objects/descrobject.c index 7cbfe8d9c1940..9cc76cfa00d1f 100644 --- a/Objects/descrobject.c +++ b/Objects/descrobject.c @@ -1145,7 +1145,7 @@ mappingproxy_reversed(mappingproxyobject *pp, PyObject *Py_UNUSED(ignored)) to the underlying mapping */ static PyMethodDef mappingproxy_methods[] = { - {"get", (PyCFunction)(void(*)(void))mappingproxy_get, METH_FASTCALL, + {"get", _PyCFunction_CAST(mappingproxy_get), METH_FASTCALL, PyDoc_STR("D.get(k[,d]) -> D[k] if k in D, else d." " d defaults to None.")}, {"keys", (PyCFunction)mappingproxy_keys, METH_NOARGS, diff --git a/Objects/dictobject.c b/Objects/dictobject.c index 88addfda8f239..8a93ae95be1d5 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -3655,9 +3655,9 @@ PyDoc_STRVAR(values__doc__, static PyMethodDef mapp_methods[] = { DICT___CONTAINS___METHODDEF - {"__getitem__", (PyCFunction)(void(*)(void))dict_subscript, METH_O | METH_COEXIST, + {"__getitem__", _PyCFunction_CAST(dict_subscript), METH_O | METH_COEXIST, getitem__doc__}, - {"__sizeof__", (PyCFunction)(void(*)(void))dict_sizeof, METH_NOARGS, + {"__sizeof__", _PyCFunction_CAST(dict_sizeof), METH_NOARGS, sizeof__doc__}, DICT_GET_METHODDEF DICT_SETDEFAULT_METHODDEF @@ -3669,7 +3669,7 @@ static PyMethodDef mapp_methods[] = { items__doc__}, {"values", dictvalues_new, METH_NOARGS, values__doc__}, - {"update", (PyCFunction)(void(*)(void))dict_update, METH_VARARGS | METH_KEYWORDS, + {"update", _PyCFunction_CAST(dict_update), METH_VARARGS | METH_KEYWORDS, update__doc__}, DICT_FROMKEYS_METHODDEF {"clear", (PyCFunction)dict_clear, METH_NOARGS, @@ -4026,9 +4026,9 @@ dictiter_reduce(dictiterobject *di, PyObject *Py_UNUSED(ignored)); PyDoc_STRVAR(reduce_doc, "Return state information for pickling."); static PyMethodDef dictiter_methods[] = { - {"__length_hint__", (PyCFunction)(void(*)(void))dictiter_len, METH_NOARGS, + {"__length_hint__", _PyCFunction_CAST(dictiter_len), METH_NOARGS, length_hint_doc}, - {"__reduce__", (PyCFunction)(void(*)(void))dictiter_reduce, METH_NOARGS, + {"__reduce__", _PyCFunction_CAST(dictiter_reduce), METH_NOARGS, reduce_doc}, {NULL, NULL} /* sentinel */ }; @@ -5079,7 +5079,7 @@ PyDoc_STRVAR(reversed_keys_doc, static PyMethodDef dictkeys_methods[] = { {"isdisjoint", (PyCFunction)dictviews_isdisjoint, METH_O, isdisjoint_doc}, - {"__reversed__", (PyCFunction)(void(*)(void))dictkeys_reversed, METH_NOARGS, + {"__reversed__", _PyCFunction_CAST(dictkeys_reversed), METH_NOARGS, reversed_keys_doc}, {NULL, NULL} /* sentinel */ }; diff --git a/Objects/genobject.c b/Objects/genobject.c index 7920a10c7fb78..0a4b43e43edad 100644 --- a/Objects/genobject.c +++ b/Objects/genobject.c @@ -821,7 +821,7 @@ PyDoc_STRVAR(sizeof__doc__, static PyMethodDef gen_methods[] = { {"send",(PyCFunction)gen_send, METH_O, send_doc}, - {"throw",(PyCFunction)(void(*)(void))gen_throw, METH_FASTCALL, throw_doc}, + {"throw",_PyCFunction_CAST(gen_throw), METH_FASTCALL, throw_doc}, {"close",(PyCFunction)gen_close, METH_NOARGS, close_doc}, {"__sizeof__", (PyCFunction)gen_sizeof, METH_NOARGS, sizeof__doc__}, {NULL, NULL} /* Sentinel */ @@ -1169,7 +1169,7 @@ PyDoc_STRVAR(coro_close_doc, static PyMethodDef coro_methods[] = { {"send",(PyCFunction)gen_send, METH_O, coro_send_doc}, - {"throw",(PyCFunction)(void(*)(void))gen_throw, METH_FASTCALL, coro_throw_doc}, + {"throw",_PyCFunction_CAST(gen_throw), METH_FASTCALL, coro_throw_doc}, {"close",(PyCFunction)gen_close, METH_NOARGS, coro_close_doc}, {"__sizeof__", (PyCFunction)gen_sizeof, METH_NOARGS, sizeof__doc__}, {NULL, NULL} /* Sentinel */ @@ -1276,7 +1276,7 @@ coro_wrapper_traverse(PyCoroWrapper *cw, visitproc visit, void *arg) static PyMethodDef coro_wrapper_methods[] = { {"send",(PyCFunction)coro_wrapper_send, METH_O, coro_send_doc}, - {"throw",(PyCFunction)(void(*)(void))coro_wrapper_throw, + {"throw",_PyCFunction_CAST(coro_wrapper_throw), METH_FASTCALL, coro_throw_doc}, {"close",(PyCFunction)coro_wrapper_close, METH_NOARGS, coro_close_doc}, {NULL, NULL} /* Sentinel */ @@ -1831,7 +1831,7 @@ async_gen_asend_close(PyAsyncGenASend *o, PyObject *args) static PyMethodDef async_gen_asend_methods[] = { {"send", (PyCFunction)async_gen_asend_send, METH_O, send_doc}, - {"throw", (PyCFunction)(void(*)(void))async_gen_asend_throw, METH_FASTCALL, throw_doc}, + {"throw", _PyCFunction_CAST(async_gen_asend_throw), METH_FASTCALL, throw_doc}, {"close", (PyCFunction)async_gen_asend_close, METH_NOARGS, close_doc}, {NULL, NULL} /* Sentinel */ }; @@ -2248,7 +2248,7 @@ async_gen_athrow_close(PyAsyncGenAThrow *o, PyObject *args) static PyMethodDef async_gen_athrow_methods[] = { {"send", (PyCFunction)async_gen_athrow_send, METH_O, send_doc}, - {"throw", (PyCFunction)(void(*)(void))async_gen_athrow_throw, + {"throw", _PyCFunction_CAST(async_gen_athrow_throw), METH_FASTCALL, throw_doc}, {"close", (PyCFunction)async_gen_athrow_close, METH_NOARGS, close_doc}, {NULL, NULL} /* Sentinel */ diff --git a/Objects/odictobject.c b/Objects/odictobject.c index f5b8b3e6cdd76..bd2a7677fe1cf 100644 --- a/Objects/odictobject.c +++ b/Objects/odictobject.c @@ -1317,7 +1317,7 @@ static PyMethodDef odict_methods[] = { odict_values__doc__}, {"items", odictitems_new, METH_NOARGS, odict_items__doc__}, - {"update", (PyCFunction)(void(*)(void))odict_update, METH_VARARGS | METH_KEYWORDS, + {"update", _PyCFunction_CAST(odict_update), METH_VARARGS | METH_KEYWORDS, odict_update__doc__}, {"clear", (PyCFunction)odict_clear, METH_NOARGS, odict_clear__doc__}, diff --git a/Objects/typeobject.c b/Objects/typeobject.c index f529e18134025..4afaf240da1d1 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -4289,7 +4289,7 @@ type___sizeof___impl(PyTypeObject *self) static PyMethodDef type_methods[] = { TYPE_MRO_METHODDEF TYPE___SUBCLASSES___METHODDEF - {"__prepare__", (PyCFunction)(void(*)(void))type_prepare, + {"__prepare__", _PyCFunction_CAST(type_prepare), METH_FASTCALL | METH_KEYWORDS | METH_CLASS, PyDoc_STR("__prepare__() -> dict\n" "used to create the namespace for the class statement")}, @@ -7141,7 +7141,7 @@ tp_new_wrapper(PyObject *self, PyObject *args, PyObject *kwds) } static struct PyMethodDef tp_new_methoddef[] = { - {"__new__", (PyCFunction)(void(*)(void))tp_new_wrapper, METH_VARARGS|METH_KEYWORDS, + {"__new__", _PyCFunction_CAST(tp_new_wrapper), METH_VARARGS|METH_KEYWORDS, PyDoc_STR("__new__($type, *args, **kwargs)\n--\n\n" "Create and return a new object. " "See help(type) for accurate signature.")}, @@ -8390,7 +8390,7 @@ update_one_slot(PyTypeObject *type, slotdef *p) } else if (Py_IS_TYPE(descr, &PyCFunction_Type) && PyCFunction_GET_FUNCTION(descr) == - (PyCFunction)(void(*)(void))tp_new_wrapper && + _PyCFunction_CAST(tp_new_wrapper) && ptr == (void**)&type->tp_new) { /* The __new__ wrapper is not a wrapper descriptor, diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 36a52966c6820..656c7ccc8e865 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -14214,7 +14214,7 @@ static PyMethodDef unicode_methods[] = { UNICODE_ISIDENTIFIER_METHODDEF UNICODE_ISPRINTABLE_METHODDEF UNICODE_ZFILL_METHODDEF - {"format", (PyCFunction)(void(*)(void)) do_string_format, METH_VARARGS | METH_KEYWORDS, format__doc__}, + {"format", _PyCFunction_CAST(do_string_format), METH_VARARGS | METH_KEYWORDS, format__doc__}, {"format_map", (PyCFunction) do_string_format_map, METH_O, format_map__doc__}, UNICODE___FORMAT___METHODDEF UNICODE_MAKETRANS_METHODDEF diff --git a/Tools/peg_generator/peg_extension/peg_extension.c b/Tools/peg_generator/peg_extension/peg_extension.c index bb4c1b0178c91..3ebb7bdd9b38c 100644 --- a/Tools/peg_generator/peg_extension/peg_extension.c +++ b/Tools/peg_generator/peg_extension/peg_extension.c @@ -151,8 +151,8 @@ dump_memo_stats(PyObject *Py_UNUSED(self), PyObject *Py_UNUSED(ignored)) } static PyMethodDef ParseMethods[] = { - {"parse_file", (PyCFunction)(void(*)(void))parse_file, METH_VARARGS|METH_KEYWORDS, "Parse a file."}, - {"parse_string", (PyCFunction)(void(*)(void))parse_string, METH_VARARGS|METH_KEYWORDS, "Parse a string."}, + {"parse_file", _PyCFunction_CAST(parse_file), METH_VARARGS|METH_KEYWORDS, "Parse a file."}, + {"parse_string", _PyCFunction_CAST(parse_string), METH_VARARGS|METH_KEYWORDS, "Parse a string."}, {"clear_memo_stats", clear_memo_stats, METH_NOARGS}, {"dump_memo_stats", dump_memo_stats, METH_NOARGS}, {"get_memo_stats", get_memo_stats, METH_NOARGS}, From webhook-mailer at python.org Tue May 3 16:00:46 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Tue, 03 May 2022 20:00:46 -0000 Subject: [Python-checkins] gh-92206: Improve scoping of sqlite3 bind param functions (#92250) Message-ID: https://github.com/python/cpython/commit/3e6019cee5230456653083dbc6359115f1599867 commit: 3e6019cee5230456653083dbc6359115f1599867 branch: main author: Erlend Egeberg Aasland committer: JelleZijlstra date: 2022-05-03T14:00:39-06:00 summary: gh-92206: Improve scoping of sqlite3 bind param functions (#92250) files: M Modules/_sqlite/cursor.c M Modules/_sqlite/statement.c M Modules/_sqlite/statement.h diff --git a/Modules/_sqlite/cursor.c b/Modules/_sqlite/cursor.c index 0e903ade5bdfb..16bceef2e5024 100644 --- a/Modules/_sqlite/cursor.c +++ b/Modules/_sqlite/cursor.c @@ -22,9 +22,18 @@ */ #include "cursor.h" +#include "microprotocols.h" #include "module.h" #include "util.h" +typedef enum { + TYPE_LONG, + TYPE_FLOAT, + TYPE_UNICODE, + TYPE_BUFFER, + TYPE_UNKNOWN +} parameter_type; + #define clinic_state() (pysqlite_get_state_by_type(Py_TYPE(self))) #include "clinic/cursor.c.h" #undef clinic_state @@ -506,6 +515,245 @@ stmt_step(sqlite3_stmt *statement) return rc; } +static int +bind_param(pysqlite_Statement *self, int pos, PyObject *parameter) +{ + int rc = SQLITE_OK; + const char *string; + Py_ssize_t buflen; + parameter_type paramtype; + + if (parameter == Py_None) { + rc = sqlite3_bind_null(self->st, pos); + goto final; + } + + if (PyLong_CheckExact(parameter)) { + paramtype = TYPE_LONG; + } else if (PyFloat_CheckExact(parameter)) { + paramtype = TYPE_FLOAT; + } else if (PyUnicode_CheckExact(parameter)) { + paramtype = TYPE_UNICODE; + } else if (PyLong_Check(parameter)) { + paramtype = TYPE_LONG; + } else if (PyFloat_Check(parameter)) { + paramtype = TYPE_FLOAT; + } else if (PyUnicode_Check(parameter)) { + paramtype = TYPE_UNICODE; + } else if (PyObject_CheckBuffer(parameter)) { + paramtype = TYPE_BUFFER; + } else { + paramtype = TYPE_UNKNOWN; + } + + switch (paramtype) { + case TYPE_LONG: { + sqlite_int64 value = _pysqlite_long_as_int64(parameter); + if (value == -1 && PyErr_Occurred()) + rc = -1; + else + rc = sqlite3_bind_int64(self->st, pos, value); + break; + } + case TYPE_FLOAT: { + double value = PyFloat_AsDouble(parameter); + if (value == -1 && PyErr_Occurred()) { + rc = -1; + } + else { + rc = sqlite3_bind_double(self->st, pos, value); + } + break; + } + case TYPE_UNICODE: + string = PyUnicode_AsUTF8AndSize(parameter, &buflen); + if (string == NULL) + return -1; + if (buflen > INT_MAX) { + PyErr_SetString(PyExc_OverflowError, + "string longer than INT_MAX bytes"); + return -1; + } + rc = sqlite3_bind_text(self->st, pos, string, (int)buflen, SQLITE_TRANSIENT); + break; + case TYPE_BUFFER: { + Py_buffer view; + if (PyObject_GetBuffer(parameter, &view, PyBUF_SIMPLE) != 0) { + return -1; + } + if (view.len > INT_MAX) { + PyErr_SetString(PyExc_OverflowError, + "BLOB longer than INT_MAX bytes"); + PyBuffer_Release(&view); + return -1; + } + rc = sqlite3_bind_blob(self->st, pos, view.buf, (int)view.len, SQLITE_TRANSIENT); + PyBuffer_Release(&view); + break; + } + case TYPE_UNKNOWN: + rc = -1; + } + +final: + return rc; +} + +/* returns 0 if the object is one of Python's internal ones that don't need to be adapted */ +static inline int +need_adapt(pysqlite_state *state, PyObject *obj) +{ + if (state->BaseTypeAdapted) { + return 1; + } + + if (PyLong_CheckExact(obj) || PyFloat_CheckExact(obj) + || PyUnicode_CheckExact(obj) || PyByteArray_CheckExact(obj)) { + return 0; + } else { + return 1; + } +} + +static void +bind_parameters(pysqlite_state *state, pysqlite_Statement *self, + PyObject *parameters) +{ + PyObject* current_param; + PyObject* adapted; + const char* binding_name; + int i; + int rc; + int num_params_needed; + Py_ssize_t num_params; + + Py_BEGIN_ALLOW_THREADS + num_params_needed = sqlite3_bind_parameter_count(self->st); + Py_END_ALLOW_THREADS + + if (PyTuple_CheckExact(parameters) || PyList_CheckExact(parameters) || (!PyDict_Check(parameters) && PySequence_Check(parameters))) { + /* parameters passed as sequence */ + if (PyTuple_CheckExact(parameters)) { + num_params = PyTuple_GET_SIZE(parameters); + } else if (PyList_CheckExact(parameters)) { + num_params = PyList_GET_SIZE(parameters); + } else { + num_params = PySequence_Size(parameters); + if (num_params == -1) { + return; + } + } + if (num_params != num_params_needed) { + PyErr_Format(state->ProgrammingError, + "Incorrect number of bindings supplied. The current " + "statement uses %d, and there are %zd supplied.", + num_params_needed, num_params); + return; + } + for (i = 0; i < num_params; i++) { + if (PyTuple_CheckExact(parameters)) { + PyObject *item = PyTuple_GET_ITEM(parameters, i); + current_param = Py_NewRef(item); + } else if (PyList_CheckExact(parameters)) { + PyObject *item = PyList_GetItem(parameters, i); + current_param = Py_XNewRef(item); + } else { + current_param = PySequence_GetItem(parameters, i); + } + if (!current_param) { + return; + } + + if (!need_adapt(state, current_param)) { + adapted = current_param; + } else { + PyObject *protocol = (PyObject *)state->PrepareProtocolType; + adapted = pysqlite_microprotocols_adapt(state, current_param, + protocol, + current_param); + Py_DECREF(current_param); + if (!adapted) { + return; + } + } + + rc = bind_param(self, i + 1, adapted); + Py_DECREF(adapted); + + if (rc != SQLITE_OK) { + if (!PyErr_Occurred()) { + PyErr_Format(state->InterfaceError, + "Error binding parameter %d - " + "probably unsupported type.", i); + } + return; + } + } + } else if (PyDict_Check(parameters)) { + /* parameters passed as dictionary */ + for (i = 1; i <= num_params_needed; i++) { + PyObject *binding_name_obj; + Py_BEGIN_ALLOW_THREADS + binding_name = sqlite3_bind_parameter_name(self->st, i); + Py_END_ALLOW_THREADS + if (!binding_name) { + PyErr_Format(state->ProgrammingError, + "Binding %d has no name, but you supplied a " + "dictionary (which has only names).", i); + return; + } + + binding_name++; /* skip first char (the colon) */ + binding_name_obj = PyUnicode_FromString(binding_name); + if (!binding_name_obj) { + return; + } + if (PyDict_CheckExact(parameters)) { + PyObject *item = PyDict_GetItemWithError(parameters, binding_name_obj); + current_param = Py_XNewRef(item); + } else { + current_param = PyObject_GetItem(parameters, binding_name_obj); + } + Py_DECREF(binding_name_obj); + if (!current_param) { + if (!PyErr_Occurred() || PyErr_ExceptionMatches(PyExc_LookupError)) { + PyErr_Format(state->ProgrammingError, + "You did not supply a value for binding " + "parameter :%s.", binding_name); + } + return; + } + + if (!need_adapt(state, current_param)) { + adapted = current_param; + } else { + PyObject *protocol = (PyObject *)state->PrepareProtocolType; + adapted = pysqlite_microprotocols_adapt(state, current_param, + protocol, + current_param); + Py_DECREF(current_param); + if (!adapted) { + return; + } + } + + rc = bind_param(self, i, adapted); + Py_DECREF(adapted); + + if (rc != SQLITE_OK) { + if (!PyErr_Occurred()) { + PyErr_Format(state->InterfaceError, + "Error binding parameter :%s - " + "probably unsupported type.", binding_name); + } + return; + } + } + } else { + PyErr_SetString(PyExc_ValueError, "parameters are of unsupported type"); + } +} + PyObject * _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject* operation, PyObject* second_argument) { @@ -617,7 +865,7 @@ _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject* operation pysqlite_statement_mark_dirty(self->statement); - pysqlite_statement_bind_parameters(state, self->statement, parameters); + bind_parameters(state, self->statement, parameters); if (PyErr_Occurred()) { goto error; } diff --git a/Modules/_sqlite/statement.c b/Modules/_sqlite/statement.c index 2f2f4b2d85089..d0a404f13b200 100644 --- a/Modules/_sqlite/statement.c +++ b/Modules/_sqlite/statement.c @@ -21,11 +21,8 @@ * 3. This notice may not be removed or altered from any source distribution. */ -#include "statement.h" -#include "cursor.h" #include "connection.h" -#include "microprotocols.h" -#include "prepare_protocol.h" +#include "statement.h" #include "util.h" /* prototypes */ @@ -40,14 +37,6 @@ typedef enum { NORMAL } parse_remaining_sql_state; -typedef enum { - TYPE_LONG, - TYPE_FLOAT, - TYPE_UNICODE, - TYPE_BUFFER, - TYPE_UNKNOWN -} parameter_type; - pysqlite_Statement * pysqlite_statement_create(pysqlite_Connection *connection, PyObject *sql) { @@ -127,245 +116,6 @@ pysqlite_statement_create(pysqlite_Connection *connection, PyObject *sql) return NULL; } -int pysqlite_statement_bind_parameter(pysqlite_Statement* self, int pos, PyObject* parameter) -{ - int rc = SQLITE_OK; - const char *string; - Py_ssize_t buflen; - parameter_type paramtype; - - if (parameter == Py_None) { - rc = sqlite3_bind_null(self->st, pos); - goto final; - } - - if (PyLong_CheckExact(parameter)) { - paramtype = TYPE_LONG; - } else if (PyFloat_CheckExact(parameter)) { - paramtype = TYPE_FLOAT; - } else if (PyUnicode_CheckExact(parameter)) { - paramtype = TYPE_UNICODE; - } else if (PyLong_Check(parameter)) { - paramtype = TYPE_LONG; - } else if (PyFloat_Check(parameter)) { - paramtype = TYPE_FLOAT; - } else if (PyUnicode_Check(parameter)) { - paramtype = TYPE_UNICODE; - } else if (PyObject_CheckBuffer(parameter)) { - paramtype = TYPE_BUFFER; - } else { - paramtype = TYPE_UNKNOWN; - } - - switch (paramtype) { - case TYPE_LONG: { - sqlite_int64 value = _pysqlite_long_as_int64(parameter); - if (value == -1 && PyErr_Occurred()) - rc = -1; - else - rc = sqlite3_bind_int64(self->st, pos, value); - break; - } - case TYPE_FLOAT: { - double value = PyFloat_AsDouble(parameter); - if (value == -1 && PyErr_Occurred()) { - rc = -1; - } - else { - rc = sqlite3_bind_double(self->st, pos, value); - } - break; - } - case TYPE_UNICODE: - string = PyUnicode_AsUTF8AndSize(parameter, &buflen); - if (string == NULL) - return -1; - if (buflen > INT_MAX) { - PyErr_SetString(PyExc_OverflowError, - "string longer than INT_MAX bytes"); - return -1; - } - rc = sqlite3_bind_text(self->st, pos, string, (int)buflen, SQLITE_TRANSIENT); - break; - case TYPE_BUFFER: { - Py_buffer view; - if (PyObject_GetBuffer(parameter, &view, PyBUF_SIMPLE) != 0) { - return -1; - } - if (view.len > INT_MAX) { - PyErr_SetString(PyExc_OverflowError, - "BLOB longer than INT_MAX bytes"); - PyBuffer_Release(&view); - return -1; - } - rc = sqlite3_bind_blob(self->st, pos, view.buf, (int)view.len, SQLITE_TRANSIENT); - PyBuffer_Release(&view); - break; - } - case TYPE_UNKNOWN: - rc = -1; - } - -final: - return rc; -} - -/* returns 0 if the object is one of Python's internal ones that don't need to be adapted */ -static int -_need_adapt(pysqlite_state *state, PyObject *obj) -{ - if (state->BaseTypeAdapted) { - return 1; - } - - if (PyLong_CheckExact(obj) || PyFloat_CheckExact(obj) - || PyUnicode_CheckExact(obj) || PyByteArray_CheckExact(obj)) { - return 0; - } else { - return 1; - } -} - -void -pysqlite_statement_bind_parameters(pysqlite_state *state, - pysqlite_Statement *self, - PyObject *parameters) -{ - PyObject* current_param; - PyObject* adapted; - const char* binding_name; - int i; - int rc; - int num_params_needed; - Py_ssize_t num_params; - - Py_BEGIN_ALLOW_THREADS - num_params_needed = sqlite3_bind_parameter_count(self->st); - Py_END_ALLOW_THREADS - - if (PyTuple_CheckExact(parameters) || PyList_CheckExact(parameters) || (!PyDict_Check(parameters) && PySequence_Check(parameters))) { - /* parameters passed as sequence */ - if (PyTuple_CheckExact(parameters)) { - num_params = PyTuple_GET_SIZE(parameters); - } else if (PyList_CheckExact(parameters)) { - num_params = PyList_GET_SIZE(parameters); - } else { - num_params = PySequence_Size(parameters); - if (num_params == -1) { - return; - } - } - if (num_params != num_params_needed) { - PyErr_Format(state->ProgrammingError, - "Incorrect number of bindings supplied. The current " - "statement uses %d, and there are %zd supplied.", - num_params_needed, num_params); - return; - } - for (i = 0; i < num_params; i++) { - if (PyTuple_CheckExact(parameters)) { - PyObject *item = PyTuple_GET_ITEM(parameters, i); - current_param = Py_NewRef(item); - } else if (PyList_CheckExact(parameters)) { - PyObject *item = PyList_GetItem(parameters, i); - current_param = Py_XNewRef(item); - } else { - current_param = PySequence_GetItem(parameters, i); - } - if (!current_param) { - return; - } - - if (!_need_adapt(state, current_param)) { - adapted = current_param; - } else { - PyObject *protocol = (PyObject *)state->PrepareProtocolType; - adapted = pysqlite_microprotocols_adapt(state, current_param, - protocol, - current_param); - Py_DECREF(current_param); - if (!adapted) { - return; - } - } - - rc = pysqlite_statement_bind_parameter(self, i + 1, adapted); - Py_DECREF(adapted); - - if (rc != SQLITE_OK) { - if (!PyErr_Occurred()) { - PyErr_Format(state->InterfaceError, - "Error binding parameter %d - " - "probably unsupported type.", i); - } - return; - } - } - } else if (PyDict_Check(parameters)) { - /* parameters passed as dictionary */ - for (i = 1; i <= num_params_needed; i++) { - PyObject *binding_name_obj; - Py_BEGIN_ALLOW_THREADS - binding_name = sqlite3_bind_parameter_name(self->st, i); - Py_END_ALLOW_THREADS - if (!binding_name) { - PyErr_Format(state->ProgrammingError, - "Binding %d has no name, but you supplied a " - "dictionary (which has only names).", i); - return; - } - - binding_name++; /* skip first char (the colon) */ - binding_name_obj = PyUnicode_FromString(binding_name); - if (!binding_name_obj) { - return; - } - if (PyDict_CheckExact(parameters)) { - PyObject *item = PyDict_GetItemWithError(parameters, binding_name_obj); - current_param = Py_XNewRef(item); - } else { - current_param = PyObject_GetItem(parameters, binding_name_obj); - } - Py_DECREF(binding_name_obj); - if (!current_param) { - if (!PyErr_Occurred() || PyErr_ExceptionMatches(PyExc_LookupError)) { - PyErr_Format(state->ProgrammingError, - "You did not supply a value for binding " - "parameter :%s.", binding_name); - } - return; - } - - if (!_need_adapt(state, current_param)) { - adapted = current_param; - } else { - PyObject *protocol = (PyObject *)state->PrepareProtocolType; - adapted = pysqlite_microprotocols_adapt(state, current_param, - protocol, - current_param); - Py_DECREF(current_param); - if (!adapted) { - return; - } - } - - rc = pysqlite_statement_bind_parameter(self, i, adapted); - Py_DECREF(adapted); - - if (rc != SQLITE_OK) { - if (!PyErr_Occurred()) { - PyErr_Format(state->InterfaceError, - "Error binding parameter :%s - " - "probably unsupported type.", binding_name); - } - return; - } - } - } else { - PyErr_SetString(PyExc_ValueError, "parameters are of unsupported type"); - } -} - void pysqlite_statement_mark_dirty(pysqlite_Statement* self) { self->in_use = 1; diff --git a/Modules/_sqlite/statement.h b/Modules/_sqlite/statement.h index 5b55e2fbcb8f9..88d56779854be 100644 --- a/Modules/_sqlite/statement.h +++ b/Modules/_sqlite/statement.h @@ -39,11 +39,6 @@ typedef struct pysqlite_Statement *pysqlite_statement_create(pysqlite_Connection *connection, PyObject *sql); -int pysqlite_statement_bind_parameter(pysqlite_Statement* self, int pos, PyObject* parameter); -void pysqlite_statement_bind_parameters(pysqlite_state *state, - pysqlite_Statement *self, - PyObject *parameters); - void pysqlite_statement_mark_dirty(pysqlite_Statement* self); int pysqlite_statement_setup_types(PyObject *module); From webhook-mailer at python.org Tue May 3 16:22:13 2022 From: webhook-mailer at python.org (vstinner) Date: Tue, 03 May 2022 20:22:13 -0000 Subject: [Python-checkins] gh-89289: Fix compiler warning in _sqlite/connection.c (#92258) Message-ID: https://github.com/python/cpython/commit/d9ec55319422cf2ba8495b2b7859749d3d742291 commit: d9ec55319422cf2ba8495b2b7859749d3d742291 branch: main author: Erlend Egeberg Aasland committer: vstinner date: 2022-05-03T22:21:56+02:00 summary: gh-89289: Fix compiler warning in _sqlite/connection.c (#92258) files: M Modules/_sqlite/connection.c diff --git a/Modules/_sqlite/connection.c b/Modules/_sqlite/connection.c index 793bc0b6aef0d..333847f0fafb9 100644 --- a/Modules/_sqlite/connection.c +++ b/Modules/_sqlite/connection.c @@ -289,7 +289,7 @@ pysqlite_connection_init_impl(pysqlite_Connection *self, // There are no statements or other SQLite objects attached to the // database, so sqlite3_close() should always return SQLITE_OK. rc = sqlite3_close(db); - assert(rc == SQLITE_OK), rc; + assert(rc == SQLITE_OK); return -1; } From webhook-mailer at python.org Tue May 3 16:40:29 2022 From: webhook-mailer at python.org (vstinner) Date: Tue, 03 May 2022 20:40:29 -0000 Subject: [Python-checkins] gh-91321: Fix PyModuleDef_HEAD_INIT on C++ (#92259) Message-ID: https://github.com/python/cpython/commit/3a35b62ea003182c643516098cc781944d425800 commit: 3a35b62ea003182c643516098cc781944d425800 branch: main author: Victor Stinner committer: vstinner date: 2022-05-03T22:40:20+02:00 summary: gh-91321: Fix PyModuleDef_HEAD_INIT on C++ (#92259) The PyModuleDef_HEAD_INIT macro now uses _Py_NULL to fix C++ compiler warnings when using it in C++. files: M Include/moduleobject.h diff --git a/Include/moduleobject.h b/Include/moduleobject.h index 8b62c45505fb6..75abd2cf2b905 100644 --- a/Include/moduleobject.h +++ b/Include/moduleobject.h @@ -48,11 +48,11 @@ typedef struct PyModuleDef_Base { PyObject* m_copy; } PyModuleDef_Base; -#define PyModuleDef_HEAD_INIT { \ - PyObject_HEAD_INIT(NULL) \ - NULL, /* m_init */ \ - 0, /* m_index */ \ - NULL, /* m_copy */ \ +#define PyModuleDef_HEAD_INIT { \ + PyObject_HEAD_INIT(_Py_NULL) \ + _Py_NULL, /* m_init */ \ + 0, /* m_index */ \ + _Py_NULL, /* m_copy */ \ } #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03050000 From webhook-mailer at python.org Tue May 3 16:52:41 2022 From: webhook-mailer at python.org (miss-islington) Date: Tue, 03 May 2022 20:52:41 -0000 Subject: [Python-checkins] gh-92062: `inspect.Parameter` checks whether `name` is a keyword (GH-92065) Message-ID: https://github.com/python/cpython/commit/65f88a6ef74c9b01017438e88e31570b02f1df9c commit: 65f88a6ef74c9b01017438e88e31570b02f1df9c branch: main author: Zac Hatfield-Dodds committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-03T13:52:30-07:00 summary: gh-92062: `inspect.Parameter` checks whether `name` is a keyword (GH-92065) Fixes #92062. files: A Misc/NEWS.d/next/Library/2022-04-29-18-15-23.gh-issue-92062.X2c_Rj.rst M Lib/inspect.py M Lib/test/test_inspect.py diff --git a/Lib/inspect.py b/Lib/inspect.py index 5bc9c04b22e23..6e744712f014b 100644 --- a/Lib/inspect.py +++ b/Lib/inspect.py @@ -149,6 +149,7 @@ import types import functools import builtins +from keyword import iskeyword from operator import attrgetter from collections import namedtuple, OrderedDict @@ -1645,7 +1646,7 @@ def __new__(cls, filename, lineno, function, code_context, index, *, positions=N instance = super().__new__(cls, filename, lineno, function, code_context, index) instance.positions = positions return instance - + def __repr__(self): return ('Traceback(filename={!r}, lineno={!r}, function={!r}, ' 'code_context={!r}, index={!r}, positions={!r})'.format( @@ -1683,7 +1684,7 @@ def getframeinfo(frame, context=1): frame, *positions = (frame, lineno, *positions[1:]) else: frame, *positions = (frame, *positions) - + lineno = positions[0] if not isframe(frame): @@ -2707,7 +2708,10 @@ def __init__(self, name, kind, *, default=_empty, annotation=_empty): self._kind = _POSITIONAL_ONLY name = 'implicit{}'.format(name[1:]) - if not name.isidentifier(): + # It's possible for C functions to have a positional-only parameter + # where the name is a keyword, so for compatibility we'll allow it. + is_keyword = iskeyword(name) and self._kind is not _POSITIONAL_ONLY + if is_keyword or not name.isidentifier(): raise ValueError('{!r} is not a valid parameter name'.format(name)) self._name = name diff --git a/Lib/test/test_inspect.py b/Lib/test/test_inspect.py index 115e97b77e079..fe0259ab609c7 100644 --- a/Lib/test/test_inspect.py +++ b/Lib/test/test_inspect.py @@ -3604,6 +3604,9 @@ def test_signature_parameter_object(self): with self.assertRaisesRegex(ValueError, 'not a valid parameter name'): inspect.Parameter('1', kind=inspect.Parameter.VAR_KEYWORD) + with self.assertRaisesRegex(ValueError, 'not a valid parameter name'): + inspect.Parameter('from', kind=inspect.Parameter.VAR_KEYWORD) + with self.assertRaisesRegex(TypeError, 'name must be a str'): inspect.Parameter(None, kind=inspect.Parameter.VAR_KEYWORD) diff --git a/Misc/NEWS.d/next/Library/2022-04-29-18-15-23.gh-issue-92062.X2c_Rj.rst b/Misc/NEWS.d/next/Library/2022-04-29-18-15-23.gh-issue-92062.X2c_Rj.rst new file mode 100644 index 0000000000000..1ccb779a6d1d9 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-04-29-18-15-23.gh-issue-92062.X2c_Rj.rst @@ -0,0 +1,2 @@ +:class:`inspect.Parameter` now raises :exc:`ValueError` if ``name`` is +a keyword, in addition to the existing check that it is an identifier. From webhook-mailer at python.org Tue May 3 17:18:01 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Tue, 03 May 2022 21:18:01 -0000 Subject: [Python-checkins] bpo-45639: Add webp and avif image formats to mimetypes (#29259) Message-ID: https://github.com/python/cpython/commit/6dee69577ac22506d3fa59dcc13c9e0cb9ee3e8a commit: 6dee69577ac22506d3fa59dcc13c9e0cb9ee3e8a branch: main author: kixorz committer: JelleZijlstra date: 2022-05-03T15:17:57-06:00 summary: bpo-45639: Add webp and avif image formats to mimetypes (#29259) Co-authored-by: Jelle Zijlstra files: A Misc/NEWS.d/next/Library/2022-02-02-04-51-39.bpo-45639.N8XrGO.rst M Lib/mimetypes.py M Lib/test/test_mimetypes.py diff --git a/Lib/mimetypes.py b/Lib/mimetypes.py index 1aa32467e278a..f6c43b3b92bc5 100644 --- a/Lib/mimetypes.py +++ b/Lib/mimetypes.py @@ -517,6 +517,7 @@ def _default_mime_types(): '.aiff' : 'audio/x-aiff', '.ra' : 'audio/x-pn-realaudio', '.wav' : 'audio/x-wav', + '.avif' : 'image/avif', '.bmp' : 'image/bmp', '.gif' : 'image/gif', '.ief' : 'image/ief', @@ -589,6 +590,7 @@ def _default_mime_types(): '.pict': 'image/pict', '.pct' : 'image/pict', '.pic' : 'image/pict', + '.webp': 'image/webp', '.xul' : 'text/xul', } diff --git a/Lib/test/test_mimetypes.py b/Lib/test/test_mimetypes.py index f2b103693a9b2..d64aee71fc48b 100644 --- a/Lib/test/test_mimetypes.py +++ b/Lib/test/test_mimetypes.py @@ -96,12 +96,14 @@ def test_non_standard_types(self): # First try strict eq(self.db.guess_type('foo.xul', strict=True), (None, None)) eq(self.db.guess_extension('image/jpg', strict=True), None) + eq(self.db.guess_extension('image/webp', strict=True), None) # And then non-strict eq(self.db.guess_type('foo.xul', strict=False), ('text/xul', None)) eq(self.db.guess_type('foo.XUL', strict=False), ('text/xul', None)) eq(self.db.guess_type('foo.invalid', strict=False), (None, None)) eq(self.db.guess_extension('image/jpg', strict=False), '.jpg') eq(self.db.guess_extension('image/JPG', strict=False), '.jpg') + eq(self.db.guess_extension('image/webp', strict=False), '.webp') def test_filename_with_url_delimiters(self): # bpo-38449: URL delimiters cases should be handled also. @@ -180,6 +182,7 @@ def check_extensions(): self.assertEqual(mimetypes.guess_extension('application/x-troff'), '.roff') self.assertEqual(mimetypes.guess_extension('application/xml'), '.xsl') self.assertEqual(mimetypes.guess_extension('audio/mpeg'), '.mp3') + self.assertEqual(mimetypes.guess_extension('image/avif'), '.avif') self.assertEqual(mimetypes.guess_extension('image/jpeg'), '.jpg') self.assertEqual(mimetypes.guess_extension('image/tiff'), '.tiff') self.assertEqual(mimetypes.guess_extension('message/rfc822'), '.eml') diff --git a/Misc/NEWS.d/next/Library/2022-02-02-04-51-39.bpo-45639.N8XrGO.rst b/Misc/NEWS.d/next/Library/2022-02-02-04-51-39.bpo-45639.N8XrGO.rst new file mode 100644 index 0000000000000..332008bf9c472 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-02-02-04-51-39.bpo-45639.N8XrGO.rst @@ -0,0 +1 @@ +``image/avif`` and ``image/webp`` were added to :mod:`mimetypes`. From webhook-mailer at python.org Tue May 3 17:44:56 2022 From: webhook-mailer at python.org (ericsnowcurrently) Date: Tue, 03 May 2022 21:44:56 -0000 Subject: [Python-checkins] gh-81057: Fix indent. (gh-92267) Message-ID: https://github.com/python/cpython/commit/1f631ae3a1c2d57b3cfc6930c5574b81b6354905 commit: 1f631ae3a1c2d57b3cfc6930c5574b81b6354905 branch: main author: Eric Snow committer: ericsnowcurrently date: 2022-05-03T15:44:52-06:00 summary: gh-81057: Fix indent. (gh-92267) files: M Tools/c-analyzer/c_parser/info.py diff --git a/Tools/c-analyzer/c_parser/info.py b/Tools/c-analyzer/c_parser/info.py index bbfbff7e62d02..a1d349dc0b0dd 100644 --- a/Tools/c-analyzer/c_parser/info.py +++ b/Tools/c-analyzer/c_parser/info.py @@ -1515,7 +1515,7 @@ def iter_all(self): def get(self, key, default=None): try: - return self[key] + return self[key] except KeyError: return default From webhook-mailer at python.org Tue May 3 17:49:29 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Tue, 03 May 2022 21:49:29 -0000 Subject: [Python-checkins] Improve the typing docs (#92264) Message-ID: https://github.com/python/cpython/commit/27e366571590e9e98f61dccf69dbeaa88ee66737 commit: 27e366571590e9e98f61dccf69dbeaa88ee66737 branch: main author: Jelle Zijlstra committer: JelleZijlstra date: 2022-05-03T15:49:21-06:00 summary: Improve the typing docs (#92264) Co-authored-by: Alex Waygood files: M Doc/library/typing.rst diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index c9fc944fdeb56..88085594caaff 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -125,7 +125,7 @@ Note that ``None`` as a type hint is a special case and is replaced by NewType ======= -Use the :class:`NewType` helper class to create distinct types:: +Use the :class:`NewType` helper to create distinct types:: from typing import NewType @@ -154,7 +154,7 @@ accidentally creating a ``UserId`` in an invalid way:: Note that these checks are enforced only by the static type checker. At runtime, the statement ``Derived = NewType('Derived', Base)`` will make ``Derived`` a -class that immediately returns whatever parameter you pass it. That means +callable that immediately returns whatever parameter you pass it. That means the expression ``Derived(some_value)`` does not create a new class or introduce much overhead beyond that of a regular function call. @@ -242,7 +242,7 @@ respectively. See :pep:`612` for more information. .. seealso:: - The documentation for :class:`ParamSpec` and :class:`Concatenate` provide + The documentation for :class:`ParamSpec` and :class:`Concatenate` provides examples of usage in ``Callable``. .. _generics: @@ -411,7 +411,7 @@ to this is that a list of types can be used to substitute a :class:`ParamSpec`:: Furthermore, a generic with only one parameter specification variable will accept parameter lists in the forms ``X[[Type1, Type2, ...]]`` and also ``X[Type1, Type2, ...]`` for aesthetic reasons. Internally, the latter is converted -to the former and are thus equivalent:: +to the former, so the following are equivalent:: >>> class X(Generic[P]): ... ... @@ -515,7 +515,7 @@ manner. Use :data:`Any` to indicate that a value is dynamically typed. Nominal vs structural subtyping =============================== -Initially :pep:`484` defined Python static type system as using +Initially :pep:`484` defined the Python static type system as using *nominal subtyping*. This means that a class ``A`` is allowed where a class ``B`` is expected if and only if ``A`` is a subclass of ``B``. @@ -590,10 +590,10 @@ These can be used as types in annotations and do not support ``[]``. * Every type is compatible with :data:`Any`. * :data:`Any` is compatible with every type. - .. versionchanged:: 3.11 - :data:`Any` can now be used as a base class. This can be useful for - avoiding type checker errors with classes that can duck type anywhere or - are highly dynamic. + .. versionchanged:: 3.11 + :data:`Any` can now be used as a base class. This can be useful for + avoiding type checker errors with classes that can duck type anywhere or + are highly dynamic. .. data:: LiteralString @@ -708,9 +708,9 @@ These can be used as types in annotations and do not support ``[]``. Other common use cases include: - - :class:`classmethod`\s that are used as alternative constructors and return instances - of the ``cls`` parameter. - - Annotating an :meth:`object.__enter__` method which returns self. + - :class:`classmethod`\s that are used as alternative constructors and return instances + of the ``cls`` parameter. + - Annotating an :meth:`~object.__enter__` method which returns self. For more information, see :pep:`673`. @@ -880,7 +880,6 @@ These can be used as types in annotations using ``[]``, each having a unique syn def with_lock(f: Callable[Concatenate[Lock, P], R]) -> Callable[P, R]: '''A type-safe decorator which provides a lock.''' - global my_lock def inner(*args: P.args, **kwargs: P.kwargs) -> R: # Provide the lock as the first argument. return f(my_lock, *args, **kwargs) @@ -1036,7 +1035,7 @@ These can be used as types in annotations using ``[]``, each having a unique syn ``no_type_check`` functionality that currently exists in the ``typing`` module which completely disables typechecking annotations on a function or a class, the ``Annotated`` type allows for both static typechecking - of ``T`` (e.g., via mypy or Pyre, which can safely ignore ``x``) + of ``T`` (which can safely ignore ``x``) together with runtime access to ``x`` within a specific application. Ultimately, the responsibility of how to interpret the annotations (if @@ -1140,7 +1139,7 @@ These can be used as types in annotations using ``[]``, each having a unique syn 2. If the return value is ``True``, the type of its argument is the type inside ``TypeGuard``. - For example:: + For example:: def is_str_list(val: list[object]) -> TypeGuard[list[str]]: '''Determines whether all objects in the list are strings''' @@ -1279,7 +1278,7 @@ These are not used in annotations. They are building blocks for creating generic .. class:: TypeVarTuple - Type variable tuple. A specialized form of :class:`Type variable ` + Type variable tuple. A specialized form of :class:`type variable ` that enables *variadic* generics. A normal type variable enables parameterization with a single type. A type @@ -1440,11 +1439,11 @@ These are not used in annotations. They are building blocks for creating generic use a :class:`TypeVar` with bound ``Callable[..., Any]``. However this causes two problems: - 1. The type checker can't type check the ``inner`` function because - ``*args`` and ``**kwargs`` have to be typed :data:`Any`. - 2. :func:`~cast` may be required in the body of the ``add_logging`` - decorator when returning the ``inner`` function, or the static type - checker must be told to ignore the ``return inner``. + 1. The type checker can't type check the ``inner`` function because + ``*args`` and ``**kwargs`` have to be typed :data:`Any`. + 2. :func:`~cast` may be required in the body of the ``add_logging`` + decorator when returning the ``inner`` function, or the static type + checker must be told to ignore the ``return inner``. .. attribute:: args .. attribute:: kwargs @@ -1602,7 +1601,7 @@ These are not used in annotations. They are building blocks for declaring types. The resulting class has an extra attribute ``__annotations__`` giving a dict that maps the field names to the field types. (The field names are in the ``_fields`` attribute and the default values are in the - ``_field_defaults`` attribute both of which are part of the namedtuple + ``_field_defaults`` attribute, both of which are part of the :func:`~collections.namedtuple` API.) ``NamedTuple`` subclasses can also have docstrings and methods:: @@ -1695,7 +1694,7 @@ These are not used in annotations. They are building blocks for declaring types. in 3.13. It may also be unsupported by static type checkers. The functional syntax should also be used when any of the keys are not valid - :ref:`identifiers`, for example because they are keywords or contain hyphens. + :ref:`identifiers `, for example because they are keywords or contain hyphens. Example:: # raises SyntaxError @@ -1737,7 +1736,7 @@ These are not used in annotations. They are building blocks for declaring types. y: int z: int - A ``TypedDict`` cannot inherit from a non-TypedDict class, + A ``TypedDict`` cannot inherit from a non-\ ``TypedDict`` class, except for :class:`Generic`. For example:: class X(TypedDict): @@ -2155,7 +2154,7 @@ Corresponding to other types in :mod:`collections.abc` .. class:: Hashable - An alias to :class:`collections.abc.Hashable` + An alias to :class:`collections.abc.Hashable`. .. class:: Reversible(Iterable[T_co]) @@ -2167,7 +2166,7 @@ Corresponding to other types in :mod:`collections.abc` .. class:: Sized - An alias to :class:`collections.abc.Sized` + An alias to :class:`collections.abc.Sized`. Asynchronous programming """""""""""""""""""""""" @@ -2388,12 +2387,12 @@ Functions and decorators .. seealso:: `Unreachable Code and Exhaustiveness Checking - _` has more + `__ has more information about exhaustiveness checking with static typing. .. versionadded:: 3.11 -.. function:: reveal_type(obj) +.. function:: reveal_type(obj, /) Reveal the inferred static type of an expression. @@ -2465,9 +2464,9 @@ Functions and decorators the documentation for :func:`@overload `, ``get_overloads(process)`` will return a sequence of three function objects for the three defined overloads. If called on a function with no overloads, - ``get_overloads`` returns an empty sequence. + ``get_overloads()`` returns an empty sequence. - ``get_overloads`` can be used for introspecting an overloaded function at + ``get_overloads()`` can be used for introspecting an overloaded function at runtime. .. versionadded:: 3.11 @@ -2493,7 +2492,7 @@ Functions and decorators ... class Sub(Base): def done(self) -> None: # Error reported by type checker - ... + ... @final class Leaf: @@ -2632,8 +2631,8 @@ Introspection helpers .. class:: ForwardRef A class used for internal typing representation of string forward references. - For example, ``list["SomeClass"]`` is implicitly transformed into - ``list[ForwardRef("SomeClass")]``. This class should not be instantiated by + For example, ``List["SomeClass"]`` is implicitly transformed into + ``List[ForwardRef("SomeClass")]``. This class should not be instantiated by a user, but may be used by introspection tools. .. note:: @@ -2667,7 +2666,7 @@ Constant If ``from __future__ import annotations`` is used in Python 3.7 or later, annotations are not evaluated at function definition time. Instead, they are stored as strings in ``__annotations__``. - This makes it unnecessary to use quotes around the annotation. + This makes it unnecessary to use quotes around the annotation (see :pep:`563`). .. versionadded:: 3.5.2 From webhook-mailer at python.org Tue May 3 18:07:17 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Tue, 03 May 2022 22:07:17 -0000 Subject: [Python-checkins] gh-92206: Improve scoping of sqlite3 statement helper (#92260) Message-ID: https://github.com/python/cpython/commit/6b7dcc56072d19d3edbc905d0bb20bd0b4463d19 commit: 6b7dcc56072d19d3edbc905d0bb20bd0b4463d19 branch: main author: Erlend Egeberg Aasland committer: JelleZijlstra date: 2022-05-03T16:07:11-06:00 summary: gh-92206: Improve scoping of sqlite3 statement helper (#92260) files: M Modules/_sqlite/cursor.c M Modules/_sqlite/statement.c M Modules/_sqlite/statement.h diff --git a/Modules/_sqlite/cursor.c b/Modules/_sqlite/cursor.c index 16bceef2e5024..87fed2e46e10e 100644 --- a/Modules/_sqlite/cursor.c +++ b/Modules/_sqlite/cursor.c @@ -754,6 +754,12 @@ bind_parameters(pysqlite_state *state, pysqlite_Statement *self, } } +static inline void +stmt_mark_dirty(pysqlite_Statement *self) +{ + self->in_use = 1; +} + PyObject * _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject* operation, PyObject* second_argument) { @@ -844,7 +850,7 @@ _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject* operation } stmt_reset(self->statement); - pysqlite_statement_mark_dirty(self->statement); + stmt_mark_dirty(self->statement); /* We start a transaction implicitly before a DML statement. SELECT is the only exception. See #9924. */ @@ -863,7 +869,7 @@ _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject* operation break; } - pysqlite_statement_mark_dirty(self->statement); + stmt_mark_dirty(self->statement); bind_parameters(state, self->statement, parameters); if (PyErr_Occurred()) { diff --git a/Modules/_sqlite/statement.c b/Modules/_sqlite/statement.c index d0a404f13b200..f9cb70f0ef146 100644 --- a/Modules/_sqlite/statement.c +++ b/Modules/_sqlite/statement.c @@ -116,11 +116,6 @@ pysqlite_statement_create(pysqlite_Connection *connection, PyObject *sql) return NULL; } -void pysqlite_statement_mark_dirty(pysqlite_Statement* self) -{ - self->in_use = 1; -} - static void stmt_dealloc(pysqlite_Statement *self) { diff --git a/Modules/_sqlite/statement.h b/Modules/_sqlite/statement.h index 88d56779854be..5e61227424baf 100644 --- a/Modules/_sqlite/statement.h +++ b/Modules/_sqlite/statement.h @@ -39,8 +39,6 @@ typedef struct pysqlite_Statement *pysqlite_statement_create(pysqlite_Connection *connection, PyObject *sql); -void pysqlite_statement_mark_dirty(pysqlite_Statement* self); - int pysqlite_statement_setup_types(PyObject *module); #endif From webhook-mailer at python.org Tue May 3 18:08:12 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Tue, 03 May 2022 22:08:12 -0000 Subject: [Python-checkins] gh-87304: Improve comments in language reference for imports (#92164) Message-ID: https://github.com/python/cpython/commit/ee2205b208389611e8a278ac1bc74b34f4994fd2 commit: ee2205b208389611e8a278ac1bc74b34f4994fd2 branch: main author: Robert Yang <35813883+robert861212 at users.noreply.github.com> committer: JelleZijlstra date: 2022-05-03T16:08:05-06:00 summary: gh-87304: Improve comments in language reference for imports (#92164) files: M Doc/reference/simple_stmts.rst diff --git a/Doc/reference/simple_stmts.rst b/Doc/reference/simple_stmts.rst index 5f19a3822ba9f..8311de0457f6a 100644 --- a/Doc/reference/simple_stmts.rst +++ b/Doc/reference/simple_stmts.rst @@ -801,9 +801,9 @@ The :keyword:`from` form uses a slightly more complex process: Examples:: import foo # foo imported and bound locally - import foo.bar.baz # foo.bar.baz imported, foo bound locally - import foo.bar.baz as fbb # foo.bar.baz imported and bound as fbb - from foo.bar import baz # foo.bar.baz imported and bound as baz + import foo.bar.baz # foo, foo.bar, and foo.bar.baz imported, foo bound locally + import foo.bar.baz as fbb # foo, foo.bar, and foo.bar.baz imported, foo.bar.baz bound as fbb + from foo.bar import baz # foo, foo.bar, and foo.bar.baz imported, foo.bar.baz bound as baz from foo import attr # foo imported and foo.attr bound as attr .. index:: single: * (asterisk); import statement From webhook-mailer at python.org Tue May 3 18:14:30 2022 From: webhook-mailer at python.org (miss-islington) Date: Tue, 03 May 2022 22:14:30 -0000 Subject: [Python-checkins] gh-91928: Add `datetime.UTC` alias for `datetime.timezone.utc` (GH-91973) Message-ID: https://github.com/python/cpython/commit/48c6165c28dfb40eafd2fa6de9bebd14fbc7c95c commit: 48c6165c28dfb40eafd2fa6de9bebd14fbc7c95c branch: main author: Kabir Kwatra committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-03T15:14:25-07:00 summary: gh-91928: Add `datetime.UTC` alias for `datetime.timezone.utc` (GH-91973) ### fixes #91928 `UTC` is now module attribute aliased to `datetime.timezone.utc`. You can now do the following: ```python from datetime import UTC ``` files: A Misc/NEWS.d/next/Library/2022-04-26-18-02-44.gh-issue-91928.V0YveU.rst M Doc/library/datetime.rst M Lib/datetime.py M Lib/test/datetimetester.py M Misc/ACKS M Modules/_datetimemodule.c diff --git a/Doc/library/datetime.rst b/Doc/library/datetime.rst index f447b7bc9491e..ca17dc880cfb3 100644 --- a/Doc/library/datetime.rst +++ b/Doc/library/datetime.rst @@ -84,6 +84,12 @@ The :mod:`datetime` module exports the following constants: The largest year number allowed in a :class:`date` or :class:`.datetime` object. :const:`MAXYEAR` is ``9999``. +.. attribute:: UTC + + Alias for the UTC timezone singleton :attr:`datetime.timezone.utc`. + + .. versionadded:: 3.11 + Available Types --------------- diff --git a/Lib/datetime.py b/Lib/datetime.py index 260b1de38877a..7f79aa436eb5e 100644 --- a/Lib/datetime.py +++ b/Lib/datetime.py @@ -5,7 +5,7 @@ """ __all__ = ("date", "datetime", "time", "timedelta", "timezone", "tzinfo", - "MINYEAR", "MAXYEAR") + "MINYEAR", "MAXYEAR", "UTC") import time as _time @@ -2290,7 +2290,8 @@ def _name_from_offset(delta): return f'UTC{sign}{hours:02d}:{minutes:02d}:{seconds:02d}' return f'UTC{sign}{hours:02d}:{minutes:02d}' -timezone.utc = timezone._create(timedelta(0)) +UTC = timezone.utc = timezone._create(timedelta(0)) + # bpo-37642: These attributes are rounded to the nearest minute for backwards # compatibility, even though the constructor will accept a wider range of # values. This may change in the future. diff --git a/Lib/test/datetimetester.py b/Lib/test/datetimetester.py index 335cded3b5fac..d85b5466f7fc2 100644 --- a/Lib/test/datetimetester.py +++ b/Lib/test/datetimetester.py @@ -28,6 +28,7 @@ from datetime import tzinfo from datetime import time from datetime import timezone +from datetime import UTC from datetime import date, datetime import time as _time @@ -66,6 +67,9 @@ def test_constants(self): self.assertEqual(datetime.MINYEAR, 1) self.assertEqual(datetime.MAXYEAR, 9999) + def test_utc_alias(self): + self.assertIs(UTC, timezone.utc) + def test_all(self): """Test that __all__ only points to valid attributes.""" all_attrs = dir(datetime_module) @@ -81,7 +85,7 @@ def test_name_cleanup(self): if not name.startswith('__') and not name.endswith('__')) allowed = set(['MAXYEAR', 'MINYEAR', 'date', 'datetime', 'datetime_CAPI', 'time', 'timedelta', 'timezone', - 'tzinfo', 'sys']) + 'tzinfo', 'UTC', 'sys']) self.assertEqual(names - allowed, set([])) def test_divide_and_round(self): @@ -310,6 +314,7 @@ def test_dst(self): def test_tzname(self): self.assertEqual('UTC', timezone.utc.tzname(None)) + self.assertEqual('UTC', UTC.tzname(None)) self.assertEqual('UTC', timezone(ZERO).tzname(None)) self.assertEqual('UTC-05:00', timezone(-5 * HOUR).tzname(None)) self.assertEqual('UTC+09:30', timezone(9.5 * HOUR).tzname(None)) diff --git a/Misc/ACKS b/Misc/ACKS index 1efc6a07c6cad..ec4de61ff9273 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -987,6 +987,7 @@ Toshio Kuratomi Ilia Kurenkov Vladimir Kushnir Erno Kuusela +Kabir Kwatra Ross Lagerwall Cameron Laird Lo?c Lajeanne diff --git a/Misc/NEWS.d/next/Library/2022-04-26-18-02-44.gh-issue-91928.V0YveU.rst b/Misc/NEWS.d/next/Library/2022-04-26-18-02-44.gh-issue-91928.V0YveU.rst new file mode 100644 index 0000000000000..35838c7e31649 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-04-26-18-02-44.gh-issue-91928.V0YveU.rst @@ -0,0 +1,3 @@ +Add `datetime.UTC` alias for `datetime.timezone.utc`. + +Patch by Kabir Kwatra. diff --git a/Modules/_datetimemodule.c b/Modules/_datetimemodule.c index 24c2198893a37..20cdb1822ab96 100644 --- a/Modules/_datetimemodule.c +++ b/Modules/_datetimemodule.c @@ -6634,6 +6634,10 @@ _datetime_exec(PyObject *module) return -1; } + if (PyModule_AddObjectRef(module, "UTC", PyDateTime_TimeZone_UTC) < 0) { + return -1; + } + /* A 4-year cycle has an extra leap day over what we'd get from * pasting together 4 single years. */ From webhook-mailer at python.org Tue May 3 18:20:21 2022 From: webhook-mailer at python.org (gvanrossum) Date: Tue, 03 May 2022 22:20:21 -0000 Subject: [Python-checkins] GH-91173: disable frozen modules in debug builds (#92023) Message-ID: https://github.com/python/cpython/commit/e8d7661ff25fb698062ab07e37362c2c20471984 commit: e8d7661ff25fb698062ab07e37362c2c20471984 branch: main author: Kumar Aditya <59607654+kumaraditya303 at users.noreply.github.com> committer: gvanrossum date: 2022-05-03T15:20:13-07:00 summary: GH-91173: disable frozen modules in debug builds (#92023) files: A Misc/NEWS.d/next/Core and Builtins/2022-05-02-12-40-18.gh-issue-91173.k_Dr6z.rst M Lib/test/test_embed.py M Python/initconfig.c diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index 9bb4bd7e8feb7..e25541820748b 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -22,7 +22,7 @@ MS_WINDOWS = (os.name == 'nt') MACOS = (sys.platform == 'darwin') - +Py_DEBUG = hasattr(sys, 'gettotalrefcount') PYMEM_ALLOCATOR_NOT_SET = 0 PYMEM_ALLOCATOR_DEBUG = 2 PYMEM_ALLOCATOR_MALLOC = 3 @@ -478,7 +478,7 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): 'pathconfig_warnings': 1, '_init_main': 1, '_isolated_interpreter': 0, - 'use_frozen_modules': 1, + 'use_frozen_modules': not Py_DEBUG, '_is_python_build': IGNORE_CONFIG, } if MS_WINDOWS: @@ -1177,7 +1177,7 @@ def test_init_setpath_config(self): # The current getpath.c doesn't determine the stdlib dir # in this case. 'stdlib_dir': '', - 'use_frozen_modules': 1, + 'use_frozen_modules': not Py_DEBUG, # overridden by PyConfig 'program_name': 'conf_program_name', 'base_executable': 'conf_executable', @@ -1416,12 +1416,12 @@ def test_init_pyvenv_cfg(self): config['base_prefix'] = pyvenv_home config['prefix'] = pyvenv_home config['stdlib_dir'] = os.path.join(pyvenv_home, 'Lib') - config['use_frozen_modules'] = 1 + config['use_frozen_modules'] = not Py_DEBUG else: # cannot reliably assume stdlib_dir here because it # depends too much on our build. But it ought to be found config['stdlib_dir'] = self.IGNORE_CONFIG - config['use_frozen_modules'] = 1 + config['use_frozen_modules'] = not Py_DEBUG env = self.copy_paths_by_env(config) self.check_all_configs("test_init_compat_config", config, diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-02-12-40-18.gh-issue-91173.k_Dr6z.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-02-12-40-18.gh-issue-91173.k_Dr6z.rst new file mode 100644 index 0000000000000..fa7761381b314 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-05-02-12-40-18.gh-issue-91173.k_Dr6z.rst @@ -0,0 +1 @@ +Disable frozen modules in debug builds. Patch by Kumar Aditya. diff --git a/Python/initconfig.c b/Python/initconfig.c index 729f7f393a39b..d928ebe88553a 100644 --- a/Python/initconfig.c +++ b/Python/initconfig.c @@ -732,7 +732,11 @@ _PyConfig_InitCompatConfig(PyConfig *config) #ifdef MS_WINDOWS config->legacy_windows_stdio = -1; #endif - config->use_frozen_modules = -1; +#ifdef Py_DEBUG + config->use_frozen_modules = 0; +#else + config->use_frozen_modules = 1; +#endif config->_is_python_build = 0; config->code_debug_ranges = 1; } @@ -1978,25 +1982,22 @@ config_init_import(PyConfig *config, int compute_path_config) } /* -X frozen_modules=[on|off] */ - if (config->use_frozen_modules < 0) { - const wchar_t *value = config_get_xoption_value(config, L"frozen_modules"); - if (value == NULL) { - config->use_frozen_modules = !config->_is_python_build; - } - else if (wcscmp(value, L"on") == 0) { - config->use_frozen_modules = 1; - } - else if (wcscmp(value, L"off") == 0) { - config->use_frozen_modules = 0; - } - else if (wcslen(value) == 0) { - // "-X frozen_modules" and "-X frozen_modules=" both imply "on". - config->use_frozen_modules = 1; - } - else { - return PyStatus_Error("bad value for option -X frozen_modules " - "(expected \"on\" or \"off\")"); - } + const wchar_t *value = config_get_xoption_value(config, L"frozen_modules"); + if (value == NULL) { + } + else if (wcscmp(value, L"on") == 0) { + config->use_frozen_modules = 1; + } + else if (wcscmp(value, L"off") == 0) { + config->use_frozen_modules = 0; + } + else if (wcslen(value) == 0) { + // "-X frozen_modules" and "-X frozen_modules=" both imply "on". + config->use_frozen_modules = 1; + } + else { + return PyStatus_Error("bad value for option -X frozen_modules " + "(expected \"on\" or \"off\")"); } return _PyStatus_OK(); From webhook-mailer at python.org Tue May 3 18:24:14 2022 From: webhook-mailer at python.org (miss-islington) Date: Tue, 03 May 2022 22:24:14 -0000 Subject: [Python-checkins] gh-87304: Improve comments in language reference for imports (GH-92164) Message-ID: https://github.com/python/cpython/commit/666820cb4bc5e269e3110a9781278bf496dcbced commit: 666820cb4bc5e269e3110a9781278bf496dcbced branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-03T15:24:03-07:00 summary: gh-87304: Improve comments in language reference for imports (GH-92164) (cherry picked from commit ee2205b208389611e8a278ac1bc74b34f4994fd2) Co-authored-by: Robert Yang <35813883+robert861212 at users.noreply.github.com> files: M Doc/reference/simple_stmts.rst diff --git a/Doc/reference/simple_stmts.rst b/Doc/reference/simple_stmts.rst index 8dfc01db263f5..d5f1e045e980c 100644 --- a/Doc/reference/simple_stmts.rst +++ b/Doc/reference/simple_stmts.rst @@ -795,9 +795,9 @@ The :keyword:`from` form uses a slightly more complex process: Examples:: import foo # foo imported and bound locally - import foo.bar.baz # foo.bar.baz imported, foo bound locally - import foo.bar.baz as fbb # foo.bar.baz imported and bound as fbb - from foo.bar import baz # foo.bar.baz imported and bound as baz + import foo.bar.baz # foo, foo.bar, and foo.bar.baz imported, foo bound locally + import foo.bar.baz as fbb # foo, foo.bar, and foo.bar.baz imported, foo.bar.baz bound as fbb + from foo.bar import baz # foo, foo.bar, and foo.bar.baz imported, foo.bar.baz bound as baz from foo import attr # foo imported and foo.attr bound as attr .. index:: single: * (asterisk); import statement From webhook-mailer at python.org Tue May 3 18:28:15 2022 From: webhook-mailer at python.org (miss-islington) Date: Tue, 03 May 2022 22:28:15 -0000 Subject: [Python-checkins] gh-87304: Improve comments in language reference for imports (GH-92164) Message-ID: https://github.com/python/cpython/commit/696d868d1910d39c5d5e82d2eb7f0a42c6964b28 commit: 696d868d1910d39c5d5e82d2eb7f0a42c6964b28 branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-03T15:28:09-07:00 summary: gh-87304: Improve comments in language reference for imports (GH-92164) (cherry picked from commit ee2205b208389611e8a278ac1bc74b34f4994fd2) Co-authored-by: Robert Yang <35813883+robert861212 at users.noreply.github.com> files: M Doc/reference/simple_stmts.rst diff --git a/Doc/reference/simple_stmts.rst b/Doc/reference/simple_stmts.rst index 5f9e8dc1791d5..2c2c2453e492c 100644 --- a/Doc/reference/simple_stmts.rst +++ b/Doc/reference/simple_stmts.rst @@ -795,9 +795,9 @@ The :keyword:`from` form uses a slightly more complex process: Examples:: import foo # foo imported and bound locally - import foo.bar.baz # foo.bar.baz imported, foo bound locally - import foo.bar.baz as fbb # foo.bar.baz imported and bound as fbb - from foo.bar import baz # foo.bar.baz imported and bound as baz + import foo.bar.baz # foo, foo.bar, and foo.bar.baz imported, foo bound locally + import foo.bar.baz as fbb # foo, foo.bar, and foo.bar.baz imported, foo.bar.baz bound as fbb + from foo.bar import baz # foo, foo.bar, and foo.bar.baz imported, foo.bar.baz bound as baz from foo import attr # foo imported and foo.attr bound as attr .. index:: single: * (asterisk); import statement From webhook-mailer at python.org Tue May 3 18:40:28 2022 From: webhook-mailer at python.org (markshannon) Date: Tue, 03 May 2022 22:40:28 -0000 Subject: [Python-checkins] Add more stats for freelist use and allocations. (GH-92211) Message-ID: https://github.com/python/cpython/commit/836b17c9c3ea313e400e58a75f52b63f96e498bb commit: 836b17c9c3ea313e400e58a75f52b63f96e498bb branch: main author: Mark Shannon committer: markshannon date: 2022-05-03T16:40:24-06:00 summary: Add more stats for freelist use and allocations. (GH-92211) files: M Include/internal/pycore_code.h M Objects/dictobject.c M Objects/floatobject.c M Objects/genobject.c M Objects/listobject.c M Objects/obmalloc.c M Objects/tupleobject.c M Python/context.c M Python/specialize.c diff --git a/Include/internal/pycore_code.h b/Include/internal/pycore_code.h index 8a599c4246cfc..e11d1f05129c6 100644 --- a/Include/internal/pycore_code.h +++ b/Include/internal/pycore_code.h @@ -292,7 +292,12 @@ typedef struct _call_stats { typedef struct _object_stats { uint64_t allocations; + uint64_t allocations512; + uint64_t allocations4k; + uint64_t allocations_big; uint64_t frees; + uint64_t to_freelist; + uint64_t from_freelist; uint64_t new_values; uint64_t dict_materialized_on_request; uint64_t dict_materialized_new_key; @@ -313,6 +318,8 @@ extern PyStats _py_stats; #define OPCODE_EXE_INC(opname) _py_stats.opcode_stats[opname].execution_count++ #define CALL_STAT_INC(name) _py_stats.call_stats.name++ #define OBJECT_STAT_INC(name) _py_stats.object_stats.name++ +#define OBJECT_STAT_INC_COND(name, cond) \ + do { if (cond) _py_stats.object_stats.name++; } while (0) extern void _Py_PrintSpecializationStats(int to_file); @@ -325,6 +332,7 @@ PyAPI_FUNC(PyObject*) _Py_GetSpecializationStats(void); #define OPCODE_EXE_INC(opname) ((void)0) #define CALL_STAT_INC(name) ((void)0) #define OBJECT_STAT_INC(name) ((void)0) +#define OBJECT_STAT_INC_COND(name, cond) ((void)0) #endif // !Py_STATS // Cache values are only valid in memory, so use native endianness. diff --git a/Objects/dictobject.c b/Objects/dictobject.c index 8a93ae95be1d5..063fd242e6d58 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -624,6 +624,7 @@ new_keys_object(uint8_t log2_size, bool unicode) #endif if (log2_size == PyDict_LOG_MINSIZE && unicode && state->keys_numfree > 0) { dk = state->keys_free_list[--state->keys_numfree]; + OBJECT_STAT_INC(from_freelist); } else #endif @@ -681,6 +682,7 @@ free_keys_object(PyDictKeysObject *keys) && state->keys_numfree < PyDict_MAXFREELIST && DK_IS_UNICODE(keys)) { state->keys_free_list[state->keys_numfree++] = keys; + OBJECT_STAT_INC(to_freelist); return; } #endif @@ -726,6 +728,7 @@ new_dict(PyDictKeysObject *keys, PyDictValues *values, Py_ssize_t used, int free mp = state->free_list[--state->numfree]; assert (mp != NULL); assert (Py_IS_TYPE(mp, &PyDict_Type)); + OBJECT_STAT_INC(from_freelist); _Py_NewReference((PyObject *)mp); } else @@ -1544,6 +1547,7 @@ dictresize(PyDictObject *mp, uint8_t log2_newsize, int unicode) state->keys_numfree < PyDict_MAXFREELIST) { state->keys_free_list[state->keys_numfree++] = oldkeys; + OBJECT_STAT_INC(to_freelist); } else #endif @@ -2381,6 +2385,7 @@ dict_dealloc(PyDictObject *mp) #endif if (state->numfree < PyDict_MAXFREELIST && Py_IS_TYPE(mp, &PyDict_Type)) { state->free_list[state->numfree++] = mp; + OBJECT_STAT_INC(to_freelist); } else #endif diff --git a/Objects/floatobject.c b/Objects/floatobject.c index a5774b9e30066..86861b7e28dce 100644 --- a/Objects/floatobject.c +++ b/Objects/floatobject.c @@ -141,6 +141,7 @@ PyFloat_FromDouble(double fval) #endif state->free_list = (PyFloatObject *) Py_TYPE(op); state->numfree--; + OBJECT_STAT_INC(from_freelist); } else #endif @@ -256,6 +257,7 @@ _PyFloat_ExactDealloc(PyObject *obj) state->numfree++; Py_SET_TYPE(op, (PyTypeObject *)state->free_list); state->free_list = op; + OBJECT_STAT_INC(to_freelist); #else PyObject_Free(op); #endif diff --git a/Objects/genobject.c b/Objects/genobject.c index 0a4b43e43edad..b9a0c30c411a0 100644 --- a/Objects/genobject.c +++ b/Objects/genobject.c @@ -1942,6 +1942,7 @@ async_gen_wrapped_val_dealloc(_PyAsyncGenWrappedValue *o) if (state->value_numfree < _PyAsyncGen_MAXFREELIST) { assert(_PyAsyncGenWrappedValue_CheckExact(o)); state->value_freelist[state->value_numfree++] = o; + OBJECT_STAT_INC(to_freelist); } else #endif @@ -2018,6 +2019,7 @@ _PyAsyncGenValueWrapperNew(PyObject *val) if (state->value_numfree) { state->value_numfree--; o = state->value_freelist[state->value_numfree]; + OBJECT_STAT_INC(from_freelist); assert(_PyAsyncGenWrappedValue_CheckExact(o)); _Py_NewReference((PyObject*)o); } diff --git a/Objects/listobject.c b/Objects/listobject.c index ccb9b91ba930d..972f99582163b 100644 --- a/Objects/listobject.c +++ b/Objects/listobject.c @@ -158,6 +158,7 @@ PyList_New(Py_ssize_t size) if (PyList_MAXFREELIST && state->numfree) { state->numfree--; op = state->free_list[state->numfree]; + OBJECT_STAT_INC(from_freelist); _Py_NewReference((PyObject *)op); } else @@ -353,6 +354,7 @@ list_dealloc(PyListObject *op) #endif if (state->numfree < PyList_MAXFREELIST && PyList_CheckExact(op)) { state->free_list[state->numfree++] = op; + OBJECT_STAT_INC(to_freelist); } else #endif diff --git a/Objects/obmalloc.c b/Objects/obmalloc.c index 560e1c59a9c58..823855ca6d8e8 100644 --- a/Objects/obmalloc.c +++ b/Objects/obmalloc.c @@ -616,6 +616,10 @@ PyMem_Malloc(size_t size) /* see PyMem_RawMalloc() */ if (size > (size_t)PY_SSIZE_T_MAX) return NULL; + OBJECT_STAT_INC_COND(allocations512, size < 512); + OBJECT_STAT_INC_COND(allocations4k, size >= 512 && size < 4094); + OBJECT_STAT_INC_COND(allocations_big, size >= 4094); + OBJECT_STAT_INC(allocations); return _PyMem.malloc(_PyMem.ctx, size); } @@ -625,6 +629,10 @@ PyMem_Calloc(size_t nelem, size_t elsize) /* see PyMem_RawMalloc() */ if (elsize != 0 && nelem > (size_t)PY_SSIZE_T_MAX / elsize) return NULL; + OBJECT_STAT_INC_COND(allocations512, elsize < 512); + OBJECT_STAT_INC_COND(allocations4k, elsize >= 512 && elsize < 4094); + OBJECT_STAT_INC_COND(allocations_big, elsize >= 4094); + OBJECT_STAT_INC(allocations); return _PyMem.calloc(_PyMem.ctx, nelem, elsize); } @@ -640,6 +648,7 @@ PyMem_Realloc(void *ptr, size_t new_size) void PyMem_Free(void *ptr) { + OBJECT_STAT_INC(frees); _PyMem.free(_PyMem.ctx, ptr); } @@ -696,6 +705,9 @@ PyObject_Malloc(size_t size) /* see PyMem_RawMalloc() */ if (size > (size_t)PY_SSIZE_T_MAX) return NULL; + OBJECT_STAT_INC_COND(allocations512, size < 512); + OBJECT_STAT_INC_COND(allocations4k, size >= 512 && size < 4094); + OBJECT_STAT_INC_COND(allocations_big, size >= 4094); OBJECT_STAT_INC(allocations); return _PyObject.malloc(_PyObject.ctx, size); } @@ -706,6 +718,9 @@ PyObject_Calloc(size_t nelem, size_t elsize) /* see PyMem_RawMalloc() */ if (elsize != 0 && nelem > (size_t)PY_SSIZE_T_MAX / elsize) return NULL; + OBJECT_STAT_INC_COND(allocations512, elsize < 512); + OBJECT_STAT_INC_COND(allocations4k, elsize >= 512 && elsize < 4094); + OBJECT_STAT_INC_COND(allocations_big, elsize >= 4094); OBJECT_STAT_INC(allocations); return _PyObject.calloc(_PyObject.ctx, nelem, elsize); } diff --git a/Objects/tupleobject.c b/Objects/tupleobject.c index f21d4da245965..dfb8597b876e5 100644 --- a/Objects/tupleobject.c +++ b/Objects/tupleobject.c @@ -1195,6 +1195,7 @@ maybe_freelist_pop(Py_ssize_t size) #endif _Py_NewReference((PyObject *)op); /* END inlined _PyObject_InitVar() */ + OBJECT_STAT_INC(from_freelist); return op; } } @@ -1224,6 +1225,7 @@ maybe_freelist_push(PyTupleObject *op) op->ob_item[0] = (PyObject *) STATE.free_list[index]; STATE.free_list[index] = op; STATE.numfree[index]++; + OBJECT_STAT_INC(to_freelist); return 1; } #endif diff --git a/Python/context.c b/Python/context.c index a77cd14544edc..ef9db6a9cd063 100644 --- a/Python/context.c +++ b/Python/context.c @@ -351,6 +351,7 @@ _context_alloc(void) state->numfree--; ctx = state->freelist; state->freelist = (PyContext *)ctx->ctx_weakreflist; + OBJECT_STAT_INC(from_freelist); ctx->ctx_weakreflist = NULL; _Py_NewReference((PyObject *)ctx); } @@ -482,6 +483,7 @@ context_tp_dealloc(PyContext *self) state->numfree++; self->ctx_weakreflist = (PyObject *)state->freelist; state->freelist = self; + OBJECT_STAT_INC(to_freelist); } else #endif diff --git a/Python/specialize.c b/Python/specialize.c index 9449ac117979d..12871ceaf876c 100644 --- a/Python/specialize.c +++ b/Python/specialize.c @@ -183,7 +183,12 @@ print_call_stats(FILE *out, CallStats *stats) static void print_object_stats(FILE *out, ObjectStats *stats) { + fprintf(out, "Object allocations from freelist: %" PRIu64 "\n", stats->from_freelist); + fprintf(out, "Object frees to freelist: %" PRIu64 "\n", stats->to_freelist); fprintf(out, "Object allocations: %" PRIu64 "\n", stats->allocations); + fprintf(out, "Object allocations to 512 bytes: %" PRIu64 "\n", stats->allocations512); + fprintf(out, "Object allocations to 4 kbytes: %" PRIu64 "\n", stats->allocations4k); + fprintf(out, "Object allocations over 4 kbytes: %" PRIu64 "\n", stats->allocations_big); fprintf(out, "Object frees: %" PRIu64 "\n", stats->frees); fprintf(out, "Object new values: %" PRIu64 "\n", stats->new_values); fprintf(out, "Object materialize dict (on request): %" PRIu64 "\n", stats->dict_materialized_on_request); From webhook-mailer at python.org Tue May 3 18:41:43 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Tue, 03 May 2022 22:41:43 -0000 Subject: [Python-checkins] [3.10] Improve the typing docs (GH-92264) (#92270) Message-ID: https://github.com/python/cpython/commit/31d9a88ca8ecf06c410a980e08bb848101d4461a commit: 31d9a88ca8ecf06c410a980e08bb848101d4461a branch: 3.10 author: Jelle Zijlstra committer: JelleZijlstra date: 2022-05-03T16:41:39-06:00 summary: [3.10] Improve the typing docs (GH-92264) (#92270) Co-authored-by: Alex Waygood . (cherry picked from commit 27e366571590e9e98f61dccf69dbeaa88ee66737) Co-authored-by: Jelle Zijlstra files: M Doc/library/typing.rst diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index 6a160af895c06..bcf2b22b1a3c2 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -115,7 +115,7 @@ Note that ``None`` as a type hint is a special case and is replaced by NewType ======= -Use the :class:`NewType` helper class to create distinct types:: +Use the :class:`NewType` helper to create distinct types:: from typing import NewType @@ -144,7 +144,7 @@ accidentally creating a ``UserId`` in an invalid way:: Note that these checks are enforced only by the static type checker. At runtime, the statement ``Derived = NewType('Derived', Base)`` will make ``Derived`` a -class that immediately returns whatever parameter you pass it. That means +callable that immediately returns whatever parameter you pass it. That means the expression ``Derived(some_value)`` does not create a new class or introduce much overhead beyond that of a regular function call. @@ -232,7 +232,7 @@ respectively. See :pep:`612` for more information. .. seealso:: - The documentation for :class:`ParamSpec` and :class:`Concatenate` provide + The documentation for :class:`ParamSpec` and :class:`Concatenate` provides examples of usage in ``Callable``. .. _generics: @@ -401,7 +401,7 @@ to this is that a list of types can be used to substitute a :class:`ParamSpec`:: Furthermore, a generic with only one parameter specification variable will accept parameter lists in the forms ``X[[Type1, Type2, ...]]`` and also ``X[Type1, Type2, ...]`` for aesthetic reasons. Internally, the latter is converted -to the former and are thus equivalent:: +to the former, so the following are equivalent:: >>> class X(Generic[P]): ... ... @@ -505,7 +505,7 @@ manner. Use :data:`Any` to indicate that a value is dynamically typed. Nominal vs structural subtyping =============================== -Initially :pep:`484` defined Python static type system as using +Initially :pep:`484` defined the Python static type system as using *nominal subtyping*. This means that a class ``A`` is allowed where a class ``B`` is expected if and only if ``A`` is a subclass of ``B``. @@ -756,7 +756,6 @@ These can be used as types in annotations using ``[]``, each having a unique syn def with_lock(f: Callable[Concatenate[Lock, P], R]) -> Callable[P, R]: '''A type-safe decorator which provides a lock.''' - global my_lock def inner(*args: P.args, **kwargs: P.kwargs) -> R: # Provide the lock as the first argument. return f(my_lock, *args, **kwargs) @@ -912,7 +911,7 @@ These can be used as types in annotations using ``[]``, each having a unique syn ``no_type_check`` functionality that currently exists in the ``typing`` module which completely disables typechecking annotations on a function or a class, the ``Annotated`` type allows for both static typechecking - of ``T`` (e.g., via mypy or Pyre, which can safely ignore ``x``) + of ``T`` (which can safely ignore ``x``) together with runtime access to ``x`` within a specific application. Ultimately, the responsibility of how to interpret the annotations (if @@ -1016,7 +1015,7 @@ These can be used as types in annotations using ``[]``, each having a unique syn 2. If the return value is ``True``, the type of its argument is the type inside ``TypeGuard``. - For example:: + For example:: def is_str_list(val: List[object]) -> TypeGuard[List[str]]: '''Determines whether all objects in the list are strings''' @@ -1230,11 +1229,11 @@ These are not used in annotations. They are building blocks for creating generic use a :class:`TypeVar` with bound ``Callable[..., Any]``. However this causes two problems: - 1. The type checker can't type check the ``inner`` function because - ``*args`` and ``**kwargs`` have to be typed :data:`Any`. - 2. :func:`~cast` may be required in the body of the ``add_logging`` - decorator when returning the ``inner`` function, or the static type - checker must be told to ignore the ``return inner``. + 1. The type checker can't type check the ``inner`` function because + ``*args`` and ``**kwargs`` have to be typed :data:`Any`. + 2. :func:`~cast` may be required in the body of the ``add_logging`` + decorator when returning the ``inner`` function, or the static type + checker must be told to ignore the ``return inner``. .. attribute:: args .. attribute:: kwargs @@ -1392,7 +1391,7 @@ These are not used in annotations. They are building blocks for declaring types. The resulting class has an extra attribute ``__annotations__`` giving a dict that maps the field names to the field types. (The field names are in the ``_fields`` attribute and the default values are in the - ``_field_defaults`` attribute both of which are part of the namedtuple + ``_field_defaults`` attribute, both of which are part of the :func:`~collections.namedtuple` API.) ``NamedTuple`` subclasses can also have docstrings and methods:: @@ -1467,7 +1466,7 @@ These are not used in annotations. They are building blocks for declaring types. Point2D = TypedDict('Point2D', {'x': int, 'y': int, 'label': str}) The functional syntax should also be used when any of the keys are not valid - :ref:`identifiers`, for example because they are keywords or contain hyphens. + :ref:`identifiers `, for example because they are keywords or contain hyphens. Example:: # raises SyntaxError @@ -1506,7 +1505,7 @@ These are not used in annotations. They are building blocks for declaring types. y: int z: int - A ``TypedDict`` cannot inherit from a non-TypedDict class, + A ``TypedDict`` cannot inherit from a non-\ ``TypedDict`` class, notably including :class:`Generic`. For example:: class X(TypedDict): @@ -1915,7 +1914,7 @@ Corresponding to other types in :mod:`collections.abc` .. class:: Hashable - An alias to :class:`collections.abc.Hashable` + An alias to :class:`collections.abc.Hashable`. .. class:: Reversible(Iterable[T_co]) @@ -1927,7 +1926,7 @@ Corresponding to other types in :mod:`collections.abc` .. class:: Sized - An alias to :class:`collections.abc.Sized` + An alias to :class:`collections.abc.Sized`. Asynchronous programming """""""""""""""""""""""" @@ -2132,7 +2131,7 @@ Functions and decorators ... class Sub(Base): def done(self) -> None: # Error reported by type checker - ... + ... @final class Leaf: @@ -2293,8 +2292,8 @@ Constant If ``from __future__ import annotations`` is used in Python 3.7 or later, annotations are not evaluated at function definition time. - Instead, they are stored as strings in ``__annotations__``, - This makes it unnecessary to use quotes around the annotation. + Instead, they are stored as strings in ``__annotations__``. + This makes it unnecessary to use quotes around the annotation (see :pep:`563`). .. versionadded:: 3.5.2 From webhook-mailer at python.org Tue May 3 18:41:51 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Tue, 03 May 2022 22:41:51 -0000 Subject: [Python-checkins] [3.9] Improve the typing docs (GH-92264) (#92271) Message-ID: https://github.com/python/cpython/commit/187cb95088267d235e5ebce510e1783d7939ee0d commit: 187cb95088267d235e5ebce510e1783d7939ee0d branch: 3.9 author: Jelle Zijlstra committer: JelleZijlstra date: 2022-05-03T16:41:47-06:00 summary: [3.9] Improve the typing docs (GH-92264) (#92271) Co-authored-by: Alex Waygood . (cherry picked from commit 27e366571590e9e98f61dccf69dbeaa88ee66737) Co-authored-by: Jelle Zijlstra files: M Doc/library/typing.rst diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index c0af2ed7c429a..b86c34a6599b4 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -103,7 +103,7 @@ Note that ``None`` as a type hint is a special case and is replaced by NewType ======= -Use the :func:`NewType` helper function to create distinct types:: +Use the :func:`NewType` helper to create distinct types:: from typing import NewType @@ -132,7 +132,7 @@ accidentally creating a ``UserId`` in an invalid way:: Note that these checks are enforced only by the static type checker. At runtime, the statement ``Derived = NewType('Derived', Base)`` will make ``Derived`` a -function that immediately returns whatever parameter you pass it. That means +callable that immediately returns whatever parameter you pass it. That means the expression ``Derived(some_value)`` does not create a new class or introduce any overhead beyond that of a regular function call. @@ -435,7 +435,7 @@ manner. Use :data:`Any` to indicate that a value is dynamically typed. Nominal vs structural subtyping =============================== -Initially :pep:`484` defined Python static type system as using +Initially :pep:`484` defined the Python static type system as using *nominal subtyping*. This means that a class ``A`` is allowed where a class ``B`` is expected if and only if ``A`` is a subclass of ``B``. @@ -753,7 +753,7 @@ These can be used as types in annotations using ``[]``, each having a unique syn ``no_type_check`` functionality that currently exists in the ``typing`` module which completely disables typechecking annotations on a function or a class, the ``Annotated`` type allows for both static typechecking - of ``T`` (e.g., via mypy or Pyre, which can safely ignore ``x``) + of ``T`` (which can safely ignore ``x``) together with runtime access to ``x`` within a specific application. Ultimately, the responsibility of how to interpret the annotations (if @@ -1064,7 +1064,7 @@ These are not used in annotations. They are building blocks for declaring types. The resulting class has an extra attribute ``__annotations__`` giving a dict that maps the field names to the field types. (The field names are in the ``_fields`` attribute and the default values are in the - ``_field_defaults`` attribute both of which are part of the namedtuple + ``_field_defaults`` attribute, both of which are part of the :func:`~collections.namedtuple` API.) ``NamedTuple`` subclasses can also have docstrings and methods:: @@ -1140,7 +1140,7 @@ These are not used in annotations. They are building blocks for declaring types. Point2D = TypedDict('Point2D', x=int, y=int, label=str) The functional syntax should also be used when any of the keys are not valid - :ref:`identifiers`, for example because they are keywords or contain hyphens. + :ref:`identifiers `, for example because they are keywords or contain hyphens. Example:: # raises SyntaxError @@ -1182,7 +1182,7 @@ These are not used in annotations. They are building blocks for declaring types. y: int z: int - A ``TypedDict`` cannot inherit from a non-TypedDict class, + A ``TypedDict`` cannot inherit from a non-\ ``TypedDict`` class, notably including :class:`Generic`. For example:: class X(TypedDict): @@ -1590,7 +1590,7 @@ Corresponding to other types in :mod:`collections.abc` .. class:: Hashable - An alias to :class:`collections.abc.Hashable` + An alias to :class:`collections.abc.Hashable`. .. class:: Reversible(Iterable[T_co]) @@ -1602,7 +1602,7 @@ Corresponding to other types in :mod:`collections.abc` .. class:: Sized - An alias to :class:`collections.abc.Sized` + An alias to :class:`collections.abc.Sized`. Asynchronous programming """""""""""""""""""""""" @@ -1807,7 +1807,7 @@ Functions and decorators ... class Sub(Base): def done(self) -> None: # Error reported by type checker - ... + ... @final class Leaf: @@ -1946,8 +1946,8 @@ Constant If ``from __future__ import annotations`` is used in Python 3.7 or later, annotations are not evaluated at function definition time. - Instead, they are stored as strings in ``__annotations__``, - This makes it unnecessary to use quotes around the annotation. + Instead, they are stored as strings in ``__annotations__``. + This makes it unnecessary to use quotes around the annotation (see :pep:`563`). .. versionadded:: 3.5.2 From webhook-mailer at python.org Tue May 3 19:03:14 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Tue, 03 May 2022 23:03:14 -0000 Subject: [Python-checkins] gh-80254: Disallow recursive usage of cursors in `sqlite3` converters (#29054) Message-ID: https://github.com/python/cpython/commit/f629dcfe835e349433e4c5099381d668e8fe69c8 commit: f629dcfe835e349433e4c5099381d668e8fe69c8 branch: main author: Erlend Egeberg Aasland committer: JelleZijlstra date: 2022-05-03T17:03:06-06:00 summary: gh-80254: Disallow recursive usage of cursors in `sqlite3` converters (#29054) Co-authored-by: Sergey Fedoseev Co-authored-by: Jelle Zijlstra files: A Misc/NEWS.d/next/Library/2019-06-22-11-01-45.bpo-36073.ED8mB9.rst M Lib/test/test_sqlite3/test_regression.py M Modules/_sqlite/cursor.c diff --git a/Lib/test/test_sqlite3/test_regression.py b/Lib/test/test_sqlite3/test_regression.py index aebea59b9e5bb..19bb84bf38a36 100644 --- a/Lib/test/test_sqlite3/test_regression.py +++ b/Lib/test/test_sqlite3/test_regression.py @@ -27,6 +27,7 @@ import functools from test import support +from unittest.mock import patch from test.test_sqlite3.test_dbapi import memory_database, managed_connect, cx_limit @@ -469,5 +470,43 @@ def test_executescript_step_through_select(self): self.assertEqual(steps, values) +class RecursiveUseOfCursors(unittest.TestCase): + # GH-80254: sqlite3 should not segfault for recursive use of cursors. + msg = "Recursive use of cursors not allowed" + + def setUp(self): + self.con = sqlite.connect(":memory:", + detect_types=sqlite.PARSE_COLNAMES) + self.cur = self.con.cursor() + self.cur.execute("create table test(x foo)") + self.cur.executemany("insert into test(x) values (?)", + [("foo",), ("bar",)]) + + def tearDown(self): + self.cur.close() + self.con.close() + + def test_recursive_cursor_init(self): + conv = lambda x: self.cur.__init__(self.con) + with patch.dict(sqlite.converters, {"INIT": conv}): + self.cur.execute(f'select x as "x [INIT]", x from test') + self.assertRaisesRegex(sqlite.ProgrammingError, self.msg, + self.cur.fetchall) + + def test_recursive_cursor_close(self): + conv = lambda x: self.cur.close() + with patch.dict(sqlite.converters, {"CLOSE": conv}): + self.cur.execute(f'select x as "x [CLOSE]", x from test') + self.assertRaisesRegex(sqlite.ProgrammingError, self.msg, + self.cur.fetchall) + + def test_recursive_cursor_iter(self): + conv = lambda x, l=[]: self.cur.fetchone() if l else l.append(None) + with patch.dict(sqlite.converters, {"ITER": conv}): + self.cur.execute(f'select x as "x [ITER]", x from test') + self.assertRaisesRegex(sqlite.ProgrammingError, self.msg, + self.cur.fetchall) + + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/Library/2019-06-22-11-01-45.bpo-36073.ED8mB9.rst b/Misc/NEWS.d/next/Library/2019-06-22-11-01-45.bpo-36073.ED8mB9.rst new file mode 100644 index 0000000000000..6c214d8191601 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-06-22-11-01-45.bpo-36073.ED8mB9.rst @@ -0,0 +1,2 @@ +Raise :exc:`~sqlite3.ProgrammingError` instead of segfaulting on recursive +usage of cursors in :mod:`sqlite3` converters. Patch by Sergey Fedoseev. diff --git a/Modules/_sqlite/cursor.c b/Modules/_sqlite/cursor.c index 87fed2e46e10e..f72bf30024065 100644 --- a/Modules/_sqlite/cursor.c +++ b/Modules/_sqlite/cursor.c @@ -38,6 +38,17 @@ typedef enum { #include "clinic/cursor.c.h" #undef clinic_state +static inline int +check_cursor_locked(pysqlite_Cursor *cur) +{ + if (cur->locked) { + PyErr_SetString(cur->connection->ProgrammingError, + "Recursive use of cursors not allowed."); + return 0; + } + return 1; +} + /*[clinic input] module _sqlite3 class _sqlite3.Cursor "pysqlite_Cursor *" "clinic_state()->CursorType" @@ -79,6 +90,10 @@ pysqlite_cursor_init_impl(pysqlite_Cursor *self, pysqlite_Connection *connection) /*[clinic end generated code: output=ac59dce49a809ca8 input=23d4265b534989fb]*/ { + if (!check_cursor_locked(self)) { + return -1; + } + Py_INCREF(connection); Py_XSETREF(self->connection, connection); Py_CLEAR(self->statement); @@ -456,13 +471,9 @@ static int check_cursor(pysqlite_Cursor* cur) return 0; } - if (cur->locked) { - PyErr_SetString(cur->connection->state->ProgrammingError, - "Recursive use of cursors not allowed."); - return 0; - } - - return pysqlite_check_thread(cur->connection) && pysqlite_check_connection(cur->connection); + return (pysqlite_check_thread(cur->connection) + && pysqlite_check_connection(cur->connection) + && check_cursor_locked(cur)); } static int @@ -1101,7 +1112,9 @@ pysqlite_cursor_iternext(pysqlite_Cursor *self) return NULL; } + self->locked = 1; // GH-80254: Prevent recursive use of cursors. PyObject *row = _pysqlite_fetch_one_row(self); + self->locked = 0; if (row == NULL) { return NULL; } @@ -1265,6 +1278,10 @@ static PyObject * pysqlite_cursor_close_impl(pysqlite_Cursor *self) /*[clinic end generated code: output=b6055e4ec6fe63b6 input=08b36552dbb9a986]*/ { + if (!check_cursor_locked(self)) { + return NULL; + } + if (!self->connection) { PyTypeObject *tp = Py_TYPE(self); pysqlite_state *state = pysqlite_get_state_by_type(tp); From webhook-mailer at python.org Tue May 3 19:50:28 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Tue, 03 May 2022 23:50:28 -0000 Subject: [Python-checkins] bpo-47029: Fix BrokenPipeError in multiprocessing.Queue at garbage collection and explicit close (#31913) Message-ID: https://github.com/python/cpython/commit/dfb1b9da8a4becaeaed3d9cffcaac41bcaf746f4 commit: dfb1b9da8a4becaeaed3d9cffcaac41bcaf746f4 branch: main author: G?ry Ogam committer: JelleZijlstra date: 2022-05-03T17:49:57-06:00 summary: bpo-47029: Fix BrokenPipeError in multiprocessing.Queue at garbage collection and explicit close (#31913) files: A Misc/NEWS.d/next/Library/2022-04-26-19-01-13.bpo-47029.qkT42X.rst M Lib/multiprocessing/queues.py diff --git a/Lib/multiprocessing/queues.py b/Lib/multiprocessing/queues.py index a2901814876d6..f37f114a96887 100644 --- a/Lib/multiprocessing/queues.py +++ b/Lib/multiprocessing/queues.py @@ -139,13 +139,10 @@ def put_nowait(self, obj): def close(self): self._closed = True - try: - self._reader.close() - finally: - close = self._close - if close: - self._close = None - close() + close = self._close + if close: + self._close = None + close() def join_thread(self): debug('Queue.join_thread()') @@ -169,8 +166,9 @@ def _start_thread(self): self._thread = threading.Thread( target=Queue._feed, args=(self._buffer, self._notempty, self._send_bytes, - self._wlock, self._writer.close, self._ignore_epipe, - self._on_queue_feeder_error, self._sem), + self._wlock, self._reader.close, self._writer.close, + self._ignore_epipe, self._on_queue_feeder_error, + self._sem), name='QueueFeederThread' ) self._thread.daemon = True @@ -211,8 +209,8 @@ def _finalize_close(buffer, notempty): notempty.notify() @staticmethod - def _feed(buffer, notempty, send_bytes, writelock, close, ignore_epipe, - onerror, queue_sem): + def _feed(buffer, notempty, send_bytes, writelock, reader_close, + writer_close, ignore_epipe, onerror, queue_sem): debug('starting thread to feed data to pipe') nacquire = notempty.acquire nrelease = notempty.release @@ -238,7 +236,8 @@ def _feed(buffer, notempty, send_bytes, writelock, close, ignore_epipe, obj = bpopleft() if obj is sentinel: debug('feeder thread got sentinel -- exiting') - close() + reader_close() + writer_close() return # serialize the data before acquiring the lock diff --git a/Misc/NEWS.d/next/Library/2022-04-26-19-01-13.bpo-47029.qkT42X.rst b/Misc/NEWS.d/next/Library/2022-04-26-19-01-13.bpo-47029.qkT42X.rst new file mode 100644 index 0000000000000..cc054673338f0 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-04-26-19-01-13.bpo-47029.qkT42X.rst @@ -0,0 +1,4 @@ +Always close the read end of the pipe used by :class:`multiprocessing.Queue` +*after* the last write of buffered data to the write end of the pipe to avoid +:exc:`BrokenPipeError` at garbage collection and at +:meth:`multiprocessing.Queue.close` calls. Patch by G?ry Ogam. From webhook-mailer at python.org Tue May 3 20:16:42 2022 From: webhook-mailer at python.org (miss-islington) Date: Wed, 04 May 2022 00:16:42 -0000 Subject: [Python-checkins] bpo-47029: Fix BrokenPipeError in multiprocessing.Queue at garbage collection and explicit close (GH-31913) Message-ID: https://github.com/python/cpython/commit/28eea73e7c5405ec41dda0cddae2a3ebaac908f5 commit: 28eea73e7c5405ec41dda0cddae2a3ebaac908f5 branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-03T17:16:21-07:00 summary: bpo-47029: Fix BrokenPipeError in multiprocessing.Queue at garbage collection and explicit close (GH-31913) (cherry picked from commit dfb1b9da8a4becaeaed3d9cffcaac41bcaf746f4) Co-authored-by: G?ry Ogam files: A Misc/NEWS.d/next/Library/2022-04-26-19-01-13.bpo-47029.qkT42X.rst M Lib/multiprocessing/queues.py diff --git a/Lib/multiprocessing/queues.py b/Lib/multiprocessing/queues.py index a2901814876d6..f37f114a96887 100644 --- a/Lib/multiprocessing/queues.py +++ b/Lib/multiprocessing/queues.py @@ -139,13 +139,10 @@ def put_nowait(self, obj): def close(self): self._closed = True - try: - self._reader.close() - finally: - close = self._close - if close: - self._close = None - close() + close = self._close + if close: + self._close = None + close() def join_thread(self): debug('Queue.join_thread()') @@ -169,8 +166,9 @@ def _start_thread(self): self._thread = threading.Thread( target=Queue._feed, args=(self._buffer, self._notempty, self._send_bytes, - self._wlock, self._writer.close, self._ignore_epipe, - self._on_queue_feeder_error, self._sem), + self._wlock, self._reader.close, self._writer.close, + self._ignore_epipe, self._on_queue_feeder_error, + self._sem), name='QueueFeederThread' ) self._thread.daemon = True @@ -211,8 +209,8 @@ def _finalize_close(buffer, notempty): notempty.notify() @staticmethod - def _feed(buffer, notempty, send_bytes, writelock, close, ignore_epipe, - onerror, queue_sem): + def _feed(buffer, notempty, send_bytes, writelock, reader_close, + writer_close, ignore_epipe, onerror, queue_sem): debug('starting thread to feed data to pipe') nacquire = notempty.acquire nrelease = notempty.release @@ -238,7 +236,8 @@ def _feed(buffer, notempty, send_bytes, writelock, close, ignore_epipe, obj = bpopleft() if obj is sentinel: debug('feeder thread got sentinel -- exiting') - close() + reader_close() + writer_close() return # serialize the data before acquiring the lock diff --git a/Misc/NEWS.d/next/Library/2022-04-26-19-01-13.bpo-47029.qkT42X.rst b/Misc/NEWS.d/next/Library/2022-04-26-19-01-13.bpo-47029.qkT42X.rst new file mode 100644 index 0000000000000..cc054673338f0 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-04-26-19-01-13.bpo-47029.qkT42X.rst @@ -0,0 +1,4 @@ +Always close the read end of the pipe used by :class:`multiprocessing.Queue` +*after* the last write of buffered data to the write end of the pipe to avoid +:exc:`BrokenPipeError` at garbage collection and at +:meth:`multiprocessing.Queue.close` calls. Patch by G?ry Ogam. From webhook-mailer at python.org Tue May 3 20:18:33 2022 From: webhook-mailer at python.org (miss-islington) Date: Wed, 04 May 2022 00:18:33 -0000 Subject: [Python-checkins] bpo-47029: Fix BrokenPipeError in multiprocessing.Queue at garbage collection and explicit close (GH-31913) Message-ID: https://github.com/python/cpython/commit/524d2750e33b4d9c98a562943863abe7fd1236cd commit: 524d2750e33b4d9c98a562943863abe7fd1236cd branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-03T17:18:20-07:00 summary: bpo-47029: Fix BrokenPipeError in multiprocessing.Queue at garbage collection and explicit close (GH-31913) (cherry picked from commit dfb1b9da8a4becaeaed3d9cffcaac41bcaf746f4) Co-authored-by: G?ry Ogam files: A Misc/NEWS.d/next/Library/2022-04-26-19-01-13.bpo-47029.qkT42X.rst M Lib/multiprocessing/queues.py diff --git a/Lib/multiprocessing/queues.py b/Lib/multiprocessing/queues.py index a2901814876d6..f37f114a96887 100644 --- a/Lib/multiprocessing/queues.py +++ b/Lib/multiprocessing/queues.py @@ -139,13 +139,10 @@ def put_nowait(self, obj): def close(self): self._closed = True - try: - self._reader.close() - finally: - close = self._close - if close: - self._close = None - close() + close = self._close + if close: + self._close = None + close() def join_thread(self): debug('Queue.join_thread()') @@ -169,8 +166,9 @@ def _start_thread(self): self._thread = threading.Thread( target=Queue._feed, args=(self._buffer, self._notempty, self._send_bytes, - self._wlock, self._writer.close, self._ignore_epipe, - self._on_queue_feeder_error, self._sem), + self._wlock, self._reader.close, self._writer.close, + self._ignore_epipe, self._on_queue_feeder_error, + self._sem), name='QueueFeederThread' ) self._thread.daemon = True @@ -211,8 +209,8 @@ def _finalize_close(buffer, notempty): notempty.notify() @staticmethod - def _feed(buffer, notempty, send_bytes, writelock, close, ignore_epipe, - onerror, queue_sem): + def _feed(buffer, notempty, send_bytes, writelock, reader_close, + writer_close, ignore_epipe, onerror, queue_sem): debug('starting thread to feed data to pipe') nacquire = notempty.acquire nrelease = notempty.release @@ -238,7 +236,8 @@ def _feed(buffer, notempty, send_bytes, writelock, close, ignore_epipe, obj = bpopleft() if obj is sentinel: debug('feeder thread got sentinel -- exiting') - close() + reader_close() + writer_close() return # serialize the data before acquiring the lock diff --git a/Misc/NEWS.d/next/Library/2022-04-26-19-01-13.bpo-47029.qkT42X.rst b/Misc/NEWS.d/next/Library/2022-04-26-19-01-13.bpo-47029.qkT42X.rst new file mode 100644 index 0000000000000..cc054673338f0 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-04-26-19-01-13.bpo-47029.qkT42X.rst @@ -0,0 +1,4 @@ +Always close the read end of the pipe used by :class:`multiprocessing.Queue` +*after* the last write of buffered data to the write end of the pipe to avoid +:exc:`BrokenPipeError` at garbage collection and at +:meth:`multiprocessing.Queue.close` calls. Patch by G?ry Ogam. From webhook-mailer at python.org Tue May 3 21:01:21 2022 From: webhook-mailer at python.org (methane) Date: Wed, 04 May 2022 01:01:21 -0000 Subject: [Python-checkins] gh-78214: marshal: Stabilize FLAG_REF usage (GH-8226) Message-ID: https://github.com/python/cpython/commit/6dcfd6c5e3cb46543e82dc3f7234546adf4bb04a commit: 6dcfd6c5e3cb46543e82dc3f7234546adf4bb04a branch: main author: Inada Naoki committer: methane date: 2022-05-04T10:01:15+09:00 summary: gh-78214: marshal: Stabilize FLAG_REF usage (GH-8226) Use FLAG_REF always for interned strings. Refcounts of interned string is very unstable. When compiling same source, refcounts of interned string in the output may be 1 or >1. It makes FLAG_REF usage unstable. To help reproducible build, use FLAG_REF for interned string even if refcnt(obj)==1. files: A Misc/NEWS.d/next/Core and Builtins/2018-07-14-16-58-00.bpo-34093.WaVD-f.rst M Programs/test_frozenmain.h M Python/marshal.c diff --git a/Misc/NEWS.d/next/Core and Builtins/2018-07-14-16-58-00.bpo-34093.WaVD-f.rst b/Misc/NEWS.d/next/Core and Builtins/2018-07-14-16-58-00.bpo-34093.WaVD-f.rst new file mode 100644 index 0000000000000..383daaccded6c --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2018-07-14-16-58-00.bpo-34093.WaVD-f.rst @@ -0,0 +1,2 @@ +``marshal.dumps()`` uses ``FLAG_REF`` for all interned strings. This makes +output more deterministic and helps reproducible build. diff --git a/Programs/test_frozenmain.h b/Programs/test_frozenmain.h index 3034927d7a12b..1c279134e94dc 100644 --- a/Programs/test_frozenmain.h +++ b/Programs/test_frozenmain.h @@ -15,19 +15,19 @@ unsigned char M_test_frozenmain[] = { 0,0,1,0,140,26,100,1,83,0,41,8,233,0,0,0, 0,78,122,18,70,114,111,122,101,110,32,72,101,108,108,111, 32,87,111,114,108,100,122,8,115,121,115,46,97,114,103,118, - 218,6,99,111,110,102,105,103,41,5,90,12,112,114,111,103, + 218,6,99,111,110,102,105,103,41,5,218,12,112,114,111,103, 114,97,109,95,110,97,109,101,218,10,101,120,101,99,117,116, - 97,98,108,101,90,15,117,115,101,95,101,110,118,105,114,111, - 110,109,101,110,116,90,17,99,111,110,102,105,103,117,114,101, - 95,99,95,115,116,100,105,111,90,14,98,117,102,102,101,114, + 97,98,108,101,218,15,117,115,101,95,101,110,118,105,114,111, + 110,109,101,110,116,218,17,99,111,110,102,105,103,117,114,101, + 95,99,95,115,116,100,105,111,218,14,98,117,102,102,101,114, 101,100,95,115,116,100,105,111,122,7,99,111,110,102,105,103, - 32,122,2,58,32,41,7,218,3,115,121,115,90,17,95,116, + 32,122,2,58,32,41,7,218,3,115,121,115,218,17,95,116, 101,115,116,105,110,116,101,114,110,97,108,99,97,112,105,218, - 5,112,114,105,110,116,218,4,97,114,103,118,90,11,103,101, + 5,112,114,105,110,116,218,4,97,114,103,118,218,11,103,101, 116,95,99,111,110,102,105,103,115,114,2,0,0,0,218,3, 107,101,121,169,0,243,0,0,0,0,250,18,116,101,115,116, 95,102,114,111,122,101,110,109,97,105,110,46,112,121,250,8, - 60,109,111,100,117,108,101,62,114,11,0,0,0,1,0,0, + 60,109,111,100,117,108,101,62,114,17,0,0,0,1,0,0, 0,115,152,0,0,0,248,240,6,0,1,11,128,10,128,10, 128,10,216,0,24,208,0,24,208,0,24,208,0,24,224,0, 5,128,5,208,6,26,209,0,27,212,0,27,208,0,27,216, @@ -37,6 +37,6 @@ unsigned char M_test_frozenmain[] = { 7,1,42,240,0,7,1,42,128,67,240,14,0,5,10,128, 69,208,10,40,144,67,208,10,40,208,10,40,152,54,160,35, 156,59,208,10,40,208,10,40,209,4,41,212,4,41,208,4, - 41,208,4,41,240,15,7,1,42,240,0,7,1,42,114,9, + 41,208,4,41,240,15,7,1,42,240,0,7,1,42,114,15, 0,0,0, }; diff --git a/Python/marshal.c b/Python/marshal.c index bbe67e3379fd9..90a4405091800 100644 --- a/Python/marshal.c +++ b/Python/marshal.c @@ -298,9 +298,14 @@ w_ref(PyObject *v, char *flag, WFILE *p) if (p->version < 3 || p->hashtable == NULL) return 0; /* not writing object references */ - /* if it has only one reference, it definitely isn't shared */ - if (Py_REFCNT(v) == 1) + /* If it has only one reference, it definitely isn't shared. + * But we use TYPE_REF always for interned string, to PYC file stable + * as possible. + */ + if (Py_REFCNT(v) == 1 && + !(PyUnicode_CheckExact(v) && PyUnicode_CHECK_INTERNED(v))) { return 0; + } entry = _Py_hashtable_get_entry(p->hashtable, v); if (entry != NULL) { From webhook-mailer at python.org Tue May 3 22:22:30 2022 From: webhook-mailer at python.org (rhettinger) Date: Wed, 04 May 2022 02:22:30 -0000 Subject: [Python-checkins] Compute from_sample() in a single pass over the data (#92284) Message-ID: https://github.com/python/cpython/commit/9badc86fb76b48fdd7e335eef850c7a508af5266 commit: 9badc86fb76b48fdd7e335eef850c7a508af5266 branch: main author: Raymond Hettinger committer: rhettinger date: 2022-05-03T21:22:26-05:00 summary: Compute from_sample() in a single pass over the data (#92284) files: M Lib/statistics.py diff --git a/Lib/statistics.py b/Lib/statistics.py index 6e6d62c4a0e26..5a3de810836de 100644 --- a/Lib/statistics.py +++ b/Lib/statistics.py @@ -206,16 +206,17 @@ def _sum(data): def _ss(data, c=None): - """Return sum of square deviations of sequence data. + """Return the exact mean and sum of square deviations of sequence data. + + Calculations are done in a single pass, allowing the input to be an iterator. + + If given *c* is used the mean; otherwise, it is calculated from the data. + Use the *c* argument with care, as it can lead to garbage results. - If ``c`` is None, the mean is calculated in one pass, and the deviations - from the mean are calculated in a second pass. Otherwise, deviations are - calculated from ``c`` as given. Use the second case with care, as it can - lead to garbage results. """ if c is not None: - T, total, count = _sum((d := x - c) * d for x in data) - return (T, total, count) + T, ssd, count = _sum((d := x - c) * d for x in data) + return (T, ssd, c, count) count = 0 types = set() types_add = types.add @@ -228,20 +229,21 @@ def _ss(data, c=None): sx_partials[d] += n sxx_partials[d] += n * n if not count: - total = Fraction(0) + ssd = c = Fraction(0) elif None in sx_partials: # The sum will be a NAN or INF. We can ignore all the finite # partials, and just look at this special one. - total = sx_partials[None] + ssd = c = sx_partials[None] assert not _isfinite(total) else: sx = sum(Fraction(n, d) for d, n in sx_partials.items()) sxx = sum(Fraction(n, d*d) for d, n in sxx_partials.items()) # This formula has poor numeric properties for floats, # but with fractions it is exact. - total = (count * sxx - sx * sx) / count + ssd = (count * sxx - sx * sx) / count + c = sx / count T = reduce(_coerce, types, int) # or raise TypeError - return (T, total, count) + return (T, ssd, c, count) def _isfinite(x): @@ -854,7 +856,7 @@ def variance(data, xbar=None): Fraction(67, 108) """ - T, ss, n = _ss(data, xbar) + T, ss, c, n = _ss(data, xbar) if n < 2: raise StatisticsError('variance requires at least two data points') return _convert(ss / (n - 1), T) @@ -895,7 +897,7 @@ def pvariance(data, mu=None): Fraction(13, 72) """ - T, ss, n = _ss(data, mu) + T, ss, c, n = _ss(data, mu) if n < 1: raise StatisticsError('pvariance requires at least one data point') return _convert(ss / n, T) @@ -910,7 +912,7 @@ def stdev(data, xbar=None): 1.0810874155219827 """ - T, ss, n = _ss(data, xbar) + T, ss, c, n = _ss(data, xbar) if n < 2: raise StatisticsError('stdev requires at least two data points') mss = ss / (n - 1) @@ -928,7 +930,7 @@ def pstdev(data, mu=None): 0.986893273527251 """ - T, ss, n = _ss(data, mu) + T, ss, c, n = _ss(data, mu) if n < 1: raise StatisticsError('pstdev requires at least one data point') mss = ss / n @@ -937,6 +939,15 @@ def pstdev(data, mu=None): return _float_sqrt_of_frac(mss.numerator, mss.denominator) +def _mean_stdev(data): + """In one pass, compute the mean and sample standard deviation as floats.""" + T, ss, xbar, n = _ss(data) + if n < 2: + raise StatisticsError('stdev requires at least two data points') + mss = ss / (n - 1) + return float(xbar), _float_sqrt_of_frac(mss.numerator, mss.denominator) + + # === Statistics for relations between two inputs === # See https://en.wikipedia.org/wiki/Covariance @@ -1171,9 +1182,7 @@ def __init__(self, mu=0.0, sigma=1.0): @classmethod def from_samples(cls, data): "Make a normal distribution instance from sample data." - if not isinstance(data, (list, tuple)): - data = list(data) - return cls(mean(data), stdev(data)) + return cls(*_mean_stdev(data)) def samples(self, n, *, seed=None): "Generate *n* samples for a given mean and standard deviation." From webhook-mailer at python.org Tue May 3 23:37:04 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Wed, 04 May 2022 03:37:04 -0000 Subject: [Python-checkins] gh-67248: cmd: Sort miscellaneous help topics (#92254) Message-ID: https://github.com/python/cpython/commit/465fdc02a3c41cfe209e280c32a77c48e3a966fa commit: 465fdc02a3c41cfe209e280c32a77c48e3a966fa branch: main author: Sam Denton committer: JelleZijlstra date: 2022-05-03T21:36:52-06:00 summary: gh-67248: cmd: Sort miscellaneous help topics (#92254) Closes #67248 files: A Misc/NEWS.d/next/Library/2022-05-03-19-06-38.gh-issue-67248.DK61Go.rst M Lib/cmd.py M Lib/test/test_cmd.py diff --git a/Lib/cmd.py b/Lib/cmd.py index 859e91096d8f5..88ee7d3ddc469 100644 --- a/Lib/cmd.py +++ b/Lib/cmd.py @@ -310,10 +310,10 @@ def do_help(self, arg): names = self.get_names() cmds_doc = [] cmds_undoc = [] - help = {} + topics = set() for name in names: if name[:5] == 'help_': - help[name[5:]]=1 + topics.add(name[5:]) names.sort() # There can be duplicates if routines overridden prevname = '' @@ -323,16 +323,16 @@ def do_help(self, arg): continue prevname = name cmd=name[3:] - if cmd in help: + if cmd in topics: cmds_doc.append(cmd) - del help[cmd] + topics.remove(cmd) elif getattr(self, name).__doc__: cmds_doc.append(cmd) else: cmds_undoc.append(cmd) self.stdout.write("%s\n"%str(self.doc_leader)) self.print_topics(self.doc_header, cmds_doc, 15,80) - self.print_topics(self.misc_header, list(help.keys()),15,80) + self.print_topics(self.misc_header, sorted(topics),15,80) self.print_topics(self.undoc_header, cmds_undoc, 15,80) def print_topics(self, header, cmds, cmdlen, maxcol): diff --git a/Lib/test/test_cmd.py b/Lib/test/test_cmd.py index 5e8b17c6e871a..319801c71f776 100644 --- a/Lib/test/test_cmd.py +++ b/Lib/test/test_cmd.py @@ -70,7 +70,7 @@ class samplecmdclass(cmd.Cmd): >>> mycmd.complete_help("12") [] >>> sorted(mycmd.complete_help("")) - ['add', 'exit', 'help', 'shell'] + ['add', 'exit', 'help', 'life', 'meaning', 'shell'] Test for the function do_help(): >>> mycmd.do_help("testet") @@ -79,12 +79,20 @@ class samplecmdclass(cmd.Cmd): help text for add >>> mycmd.onecmd("help add") help text for add + >>> mycmd.onecmd("help meaning") # doctest: +NORMALIZE_WHITESPACE + Try and be nice to people, avoid eating fat, read a good book every + now and then, get some walking in, and try to live together in peace + and harmony with people of all creeds and nations. >>> mycmd.do_help("") Documented commands (type help ): ======================================== add help + Miscellaneous help topics: + ========================== + life meaning + Undocumented commands: ====================== exit shell @@ -115,17 +123,22 @@ class samplecmdclass(cmd.Cmd): This test includes the preloop(), postloop(), default(), emptyline(), parseline(), do_help() functions >>> mycmd.use_rawinput=0 - >>> mycmd.cmdqueue=["", "add", "add 4 5", "help", "help add","exit"] - >>> mycmd.cmdloop() + + >>> mycmd.cmdqueue=["add", "add 4 5", "", "help", "help add", "exit"] + >>> mycmd.cmdloop() # doctest: +REPORT_NDIFF Hello from preloop - help text for add *** invalid number of arguments 9 + 9 Documented commands (type help ): ======================================== add help + Miscellaneous help topics: + ========================== + life meaning + Undocumented commands: ====================== exit shell @@ -165,6 +178,17 @@ def help_add(self): print("help text for add") return + def help_meaning(self): + print("Try and be nice to people, avoid eating fat, read a " + "good book every now and then, get some walking in, " + "and try to live together in peace and harmony with " + "people of all creeds and nations.") + return + + def help_life(self): + print("Always look on the bright side of life") + return + def do_exit(self, arg): return True diff --git a/Misc/NEWS.d/next/Library/2022-05-03-19-06-38.gh-issue-67248.DK61Go.rst b/Misc/NEWS.d/next/Library/2022-05-03-19-06-38.gh-issue-67248.DK61Go.rst new file mode 100644 index 0000000000000..8237934ccda00 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-05-03-19-06-38.gh-issue-67248.DK61Go.rst @@ -0,0 +1 @@ +Sort the miscellaneous topics in Cmd.do_help() From webhook-mailer at python.org Tue May 3 23:38:34 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Wed, 04 May 2022 03:38:34 -0000 Subject: [Python-checkins] Fix typo in Sorting howto (#92280) Message-ID: https://github.com/python/cpython/commit/7d7a378c1a351a2074e9e46838718a2dcbef2948 commit: 7d7a378c1a351a2074e9e46838718a2dcbef2948 branch: main author: Carl Meyer committer: JelleZijlstra date: 2022-05-03T21:38:29-06:00 summary: Fix typo in Sorting howto (#92280) The phrase is usually "odds and ends," not "odd and ends." files: M Doc/howto/sorting.rst diff --git a/Doc/howto/sorting.rst b/Doc/howto/sorting.rst index 32b47711f8570..53cbe01e92144 100644 --- a/Doc/howto/sorting.rst +++ b/Doc/howto/sorting.rst @@ -305,8 +305,8 @@ To convert to a key function, just wrap the old comparison function: In Python 3.2, the :func:`functools.cmp_to_key` function was added to the :mod:`functools` module in the standard library. -Odd and Ends -============ +Odds and Ends +============= * For locale aware sorting, use :func:`locale.strxfrm` for a key function or :func:`locale.strcoll` for a comparison function. From webhook-mailer at python.org Wed May 4 00:22:08 2022 From: webhook-mailer at python.org (rhettinger) Date: Wed, 04 May 2022 04:22:08 -0000 Subject: [Python-checkins] Fix renamed "total" variable (#92287) Message-ID: https://github.com/python/cpython/commit/d20bb33f782f5677256d7e1f2462b78113692969 commit: d20bb33f782f5677256d7e1f2462b78113692969 branch: main author: Raymond Hettinger committer: rhettinger date: 2022-05-03T23:22:04-05:00 summary: Fix renamed "total" variable (#92287) * Fix renamed "total" variable * Keep nan/inf handling consistent between versions files: M Lib/statistics.py diff --git a/Lib/statistics.py b/Lib/statistics.py index 5a3de810836de..c0220889ebdc4 100644 --- a/Lib/statistics.py +++ b/Lib/statistics.py @@ -234,7 +234,7 @@ def _ss(data, c=None): # The sum will be a NAN or INF. We can ignore all the finite # partials, and just look at this special one. ssd = c = sx_partials[None] - assert not _isfinite(total) + assert not _isfinite(ssd) else: sx = sum(Fraction(n, d) for d, n in sx_partials.items()) sxx = sum(Fraction(n, d*d) for d, n in sxx_partials.items()) @@ -945,7 +945,11 @@ def _mean_stdev(data): if n < 2: raise StatisticsError('stdev requires at least two data points') mss = ss / (n - 1) - return float(xbar), _float_sqrt_of_frac(mss.numerator, mss.denominator) + try: + return float(xbar), _float_sqrt_of_frac(mss.numerator, mss.denominator) + except AttributeError: + # Handle Nans and Infs gracefully + return float(xbar), float(xbar) / float(ss) # === Statistics for relations between two inputs === From webhook-mailer at python.org Wed May 4 05:59:11 2022 From: webhook-mailer at python.org (vstinner) Date: Wed, 04 May 2022 09:59:11 -0000 Subject: [Python-checkins] gh-92036: Fix gc_fini_untrack() (#92037) Message-ID: https://github.com/python/cpython/commit/14243369b5f80613628a565c224bba7fb3fcacd8 commit: 14243369b5f80613628a565c224bba7fb3fcacd8 branch: main author: Victor Stinner committer: vstinner date: 2022-05-04T11:59:01+02:00 summary: gh-92036: Fix gc_fini_untrack() (#92037) Fix a crash in subinterpreters related to the garbage collector. When a subinterpreter is deleted, untrack all objects tracked by its GC. To prevent a crash in deallocator functions expecting objects to be tracked by the GC, leak a strong reference to these objects on purpose, so they are never deleted and their deallocator functions are not called. files: A Misc/NEWS.d/next/Core and Builtins/2022-04-28-23-37-30.gh-issue-92036.GZJAC9.rst M Modules/gcmodule.c diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-04-28-23-37-30.gh-issue-92036.GZJAC9.rst b/Misc/NEWS.d/next/Core and Builtins/2022-04-28-23-37-30.gh-issue-92036.GZJAC9.rst new file mode 100644 index 0000000000000..78094c5e4fea7 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-04-28-23-37-30.gh-issue-92036.GZJAC9.rst @@ -0,0 +1,5 @@ +Fix a crash in subinterpreters related to the garbage collector. When a +subinterpreter is deleted, untrack all objects tracked by its GC. To prevent a +crash in deallocator functions expecting objects to be tracked by the GC, leak +a strong reference to these objects on purpose, so they are never deleted and +their deallocator functions are not called. Patch by Victor Stinner. diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c index 802c3eadccfb0..45dad8f0824df 100644 --- a/Modules/gcmodule.c +++ b/Modules/gcmodule.c @@ -2165,6 +2165,12 @@ gc_fini_untrack(PyGC_Head *list) for (gc = GC_NEXT(list); gc != list; gc = GC_NEXT(list)) { PyObject *op = FROM_GC(gc); _PyObject_GC_UNTRACK(op); + // gh-92036: If a deallocator function expect the object to be tracked + // by the GC (ex: func_dealloc()), it can crash if called on an object + // which is no longer tracked by the GC. Leak one strong reference on + // purpose so the object is never deleted and its deallocator is not + // called. + Py_INCREF(op); } } From webhook-mailer at python.org Wed May 4 06:24:00 2022 From: webhook-mailer at python.org (miss-islington) Date: Wed, 04 May 2022 10:24:00 -0000 Subject: [Python-checkins] gh-92036: Fix gc_fini_untrack() (GH-92037) Message-ID: https://github.com/python/cpython/commit/178a238f25ab8aff7689d7a09d66dc1583ecd6cb commit: 178a238f25ab8aff7689d7a09d66dc1583ecd6cb branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-04T03:23:29-07:00 summary: gh-92036: Fix gc_fini_untrack() (GH-92037) Fix a crash in subinterpreters related to the garbage collector. When a subinterpreter is deleted, untrack all objects tracked by its GC. To prevent a crash in deallocator functions expecting objects to be tracked by the GC, leak a strong reference to these objects on purpose, so they are never deleted and their deallocator functions are not called. (cherry picked from commit 14243369b5f80613628a565c224bba7fb3fcacd8) Co-authored-by: Victor Stinner files: A Misc/NEWS.d/next/Core and Builtins/2022-04-28-23-37-30.gh-issue-92036.GZJAC9.rst M Modules/gcmodule.c diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-04-28-23-37-30.gh-issue-92036.GZJAC9.rst b/Misc/NEWS.d/next/Core and Builtins/2022-04-28-23-37-30.gh-issue-92036.GZJAC9.rst new file mode 100644 index 0000000000000..78094c5e4fea7 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-04-28-23-37-30.gh-issue-92036.GZJAC9.rst @@ -0,0 +1,5 @@ +Fix a crash in subinterpreters related to the garbage collector. When a +subinterpreter is deleted, untrack all objects tracked by its GC. To prevent a +crash in deallocator functions expecting objects to be tracked by the GC, leak +a strong reference to these objects on purpose, so they are never deleted and +their deallocator functions are not called. Patch by Victor Stinner. diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c index 805a159d53d60..43ae6fa98beb9 100644 --- a/Modules/gcmodule.c +++ b/Modules/gcmodule.c @@ -2170,6 +2170,12 @@ gc_fini_untrack(PyGC_Head *list) for (gc = GC_NEXT(list); gc != list; gc = GC_NEXT(list)) { PyObject *op = FROM_GC(gc); _PyObject_GC_UNTRACK(op); + // gh-92036: If a deallocator function expect the object to be tracked + // by the GC (ex: func_dealloc()), it can crash if called on an object + // which is no longer tracked by the GC. Leak one strong reference on + // purpose so the object is never deleted and its deallocator is not + // called. + Py_INCREF(op); } } From webhook-mailer at python.org Wed May 4 06:25:43 2022 From: webhook-mailer at python.org (miss-islington) Date: Wed, 04 May 2022 10:25:43 -0000 Subject: [Python-checkins] gh-92036: Fix gc_fini_untrack() (GH-92037) Message-ID: https://github.com/python/cpython/commit/f84c51eb7a2c17eaabd77cdf95b5f01b46517206 commit: f84c51eb7a2c17eaabd77cdf95b5f01b46517206 branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-04T03:25:33-07:00 summary: gh-92036: Fix gc_fini_untrack() (GH-92037) Fix a crash in subinterpreters related to the garbage collector. When a subinterpreter is deleted, untrack all objects tracked by its GC. To prevent a crash in deallocator functions expecting objects to be tracked by the GC, leak a strong reference to these objects on purpose, so they are never deleted and their deallocator functions are not called. (cherry picked from commit 14243369b5f80613628a565c224bba7fb3fcacd8) Co-authored-by: Victor Stinner files: A Misc/NEWS.d/next/Core and Builtins/2022-04-28-23-37-30.gh-issue-92036.GZJAC9.rst M Modules/gcmodule.c diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-04-28-23-37-30.gh-issue-92036.GZJAC9.rst b/Misc/NEWS.d/next/Core and Builtins/2022-04-28-23-37-30.gh-issue-92036.GZJAC9.rst new file mode 100644 index 0000000000000..78094c5e4fea7 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-04-28-23-37-30.gh-issue-92036.GZJAC9.rst @@ -0,0 +1,5 @@ +Fix a crash in subinterpreters related to the garbage collector. When a +subinterpreter is deleted, untrack all objects tracked by its GC. To prevent a +crash in deallocator functions expecting objects to be tracked by the GC, leak +a strong reference to these objects on purpose, so they are never deleted and +their deallocator functions are not called. Patch by Victor Stinner. diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c index 3cf1a00b003b3..cb5989e69d21b 100644 --- a/Modules/gcmodule.c +++ b/Modules/gcmodule.c @@ -2157,6 +2157,12 @@ gc_fini_untrack(PyGC_Head *list) for (gc = GC_NEXT(list); gc != list; gc = GC_NEXT(list)) { PyObject *op = FROM_GC(gc); _PyObject_GC_UNTRACK(op); + // gh-92036: If a deallocator function expect the object to be tracked + // by the GC (ex: func_dealloc()), it can crash if called on an object + // which is no longer tracked by the GC. Leak one strong reference on + // purpose so the object is never deleted and its deallocator is not + // called. + Py_INCREF(op); } } From webhook-mailer at python.org Wed May 4 07:31:02 2022 From: webhook-mailer at python.org (vstinner) Date: Wed, 04 May 2022 11:31:02 -0000 Subject: [Python-checkins] Use static inline function Py_EnterRecursiveCall() (#91988) Message-ID: https://github.com/python/cpython/commit/d716a0dfe2d1029111db393afaecdb04cc4093de commit: d716a0dfe2d1029111db393afaecdb04cc4093de branch: main author: Victor Stinner committer: vstinner date: 2022-05-04T13:30:23+02:00 summary: Use static inline function Py_EnterRecursiveCall() (#91988) Currently, calling Py_EnterRecursiveCall() and Py_LeaveRecursiveCall() may use a function call or a static inline function call, depending if the internal pycore_ceval.h header file is included or not. Use a different name for the static inline function to ensure that the static inline function is always used in Python internals for best performance. Similar approach than PyThreadState_GET() (function call) and _PyThreadState_GET() (static inline function). * Rename _Py_EnterRecursiveCall() to _Py_EnterRecursiveCallTstate() * Rename _Py_LeaveRecursiveCall() to _Py_LeaveRecursiveCallTstate() * pycore_ceval.h: Rename Py_EnterRecursiveCall() to _Py_EnterRecursiveCall() and Py_LeaveRecursiveCall() and _Py_LeaveRecursiveCall() files: M Include/internal/pycore_ceval.h M Modules/_ctypes/_ctypes.c M Modules/_json.c M Modules/_pickle.c M Objects/abstract.c M Objects/bytesobject.c M Objects/call.c M Objects/descrobject.c M Objects/exceptions.c M Objects/methodobject.c M Objects/object.c M Parser/asdl_c.py M Python/Python-ast.c M Python/ceval.c M Python/pythonrun.c diff --git a/Include/internal/pycore_ceval.h b/Include/internal/pycore_ceval.h index 45d26a37a34c6..8dd89c6850794 100644 --- a/Include/internal/pycore_ceval.h +++ b/Include/internal/pycore_ceval.h @@ -91,7 +91,7 @@ extern void _PyEval_DeactivateOpCache(void); #ifdef USE_STACKCHECK /* With USE_STACKCHECK macro defined, trigger stack checks in - _Py_CheckRecursiveCall() on every 64th call to Py_EnterRecursiveCall. */ + _Py_CheckRecursiveCall() on every 64th call to _Py_EnterRecursiveCall. */ static inline int _Py_MakeRecCheck(PyThreadState *tstate) { return (tstate->recursion_remaining-- <= 0 || (tstate->recursion_remaining & 63) == 0); @@ -106,29 +106,25 @@ PyAPI_FUNC(int) _Py_CheckRecursiveCall( PyThreadState *tstate, const char *where); -static inline int _Py_EnterRecursiveCall(PyThreadState *tstate, - const char *where) { +static inline int _Py_EnterRecursiveCallTstate(PyThreadState *tstate, + const char *where) { return (_Py_MakeRecCheck(tstate) && _Py_CheckRecursiveCall(tstate, where)); } -static inline int _Py_EnterRecursiveCall_inline(const char *where) { +static inline int _Py_EnterRecursiveCall(const char *where) { PyThreadState *tstate = _PyThreadState_GET(); - return _Py_EnterRecursiveCall(tstate, where); + return _Py_EnterRecursiveCallTstate(tstate, where); } -#define Py_EnterRecursiveCall(where) _Py_EnterRecursiveCall_inline(where) - -static inline void _Py_LeaveRecursiveCall(PyThreadState *tstate) { +static inline void _Py_LeaveRecursiveCallTstate(PyThreadState *tstate) { tstate->recursion_remaining++; } -static inline void _Py_LeaveRecursiveCall_inline(void) { +static inline void _Py_LeaveRecursiveCall(void) { PyThreadState *tstate = _PyThreadState_GET(); - _Py_LeaveRecursiveCall(tstate); + _Py_LeaveRecursiveCallTstate(tstate); } -#define Py_LeaveRecursiveCall() _Py_LeaveRecursiveCall_inline() - extern struct _PyInterpreterFrame* _PyEval_GetFrame(void); extern PyObject* _Py_MakeCoro(PyFunctionObject *func); diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c index 99f3d55ff5fc0..d6fa11d348130 100644 --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -112,6 +112,7 @@ bytes(cdata) #endif #include "pycore_call.h" // _PyObject_CallNoArgs() +#include "pycore_ceval.h" // _Py_EnterRecursiveCall() #include "structmember.h" // PyMemberDef #include @@ -2270,12 +2271,12 @@ PyCSimpleType_from_param(PyObject *type, PyObject *value) return NULL; } if (as_parameter) { - if (Py_EnterRecursiveCall("while processing _as_parameter_")) { + if (_Py_EnterRecursiveCall("while processing _as_parameter_")) { Py_DECREF(as_parameter); return NULL; } value = PyCSimpleType_from_param(type, as_parameter); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); Py_DECREF(as_parameter); return value; } diff --git a/Modules/_json.c b/Modules/_json.c index f7a3e38de9926..9464b9f498ede 100644 --- a/Modules/_json.c +++ b/Modules/_json.c @@ -10,6 +10,7 @@ #define NEEDS_PY_IDENTIFIER #include "Python.h" +#include "pycore_ceval.h" // _Py_EnterRecursiveCall() #include "structmember.h" // PyMemberDef #include "pycore_accu.h" @@ -1059,19 +1060,19 @@ scan_once_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ssize_ return scanstring_unicode(pystr, idx + 1, s->strict, next_idx_ptr); case '{': /* object */ - if (Py_EnterRecursiveCall(" while decoding a JSON object " - "from a unicode string")) + if (_Py_EnterRecursiveCall(" while decoding a JSON object " + "from a unicode string")) return NULL; res = _parse_object_unicode(s, pystr, idx + 1, next_idx_ptr); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); return res; case '[': /* array */ - if (Py_EnterRecursiveCall(" while decoding a JSON array " - "from a unicode string")) + if (_Py_EnterRecursiveCall(" while decoding a JSON array " + "from a unicode string")) return NULL; res = _parse_array_unicode(s, pystr, idx + 1, next_idx_ptr); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); return res; case 'n': /* null */ @@ -1430,17 +1431,17 @@ encoder_listencode_obj(PyEncoderObject *s, _PyAccu *acc, return _steal_accumulate(acc, encoded); } else if (PyList_Check(obj) || PyTuple_Check(obj)) { - if (Py_EnterRecursiveCall(" while encoding a JSON object")) + if (_Py_EnterRecursiveCall(" while encoding a JSON object")) return -1; rv = encoder_listencode_list(s, acc, obj, indent_level); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); return rv; } else if (PyDict_Check(obj)) { - if (Py_EnterRecursiveCall(" while encoding a JSON object")) + if (_Py_EnterRecursiveCall(" while encoding a JSON object")) return -1; rv = encoder_listencode_dict(s, acc, obj, indent_level); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); return rv; } else { @@ -1468,13 +1469,13 @@ encoder_listencode_obj(PyEncoderObject *s, _PyAccu *acc, return -1; } - if (Py_EnterRecursiveCall(" while encoding a JSON object")) { + if (_Py_EnterRecursiveCall(" while encoding a JSON object")) { Py_DECREF(newobj); Py_XDECREF(ident); return -1; } rv = encoder_listencode_obj(s, acc, newobj, indent_level); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); Py_DECREF(newobj); if (rv) { diff --git a/Modules/_pickle.c b/Modules/_pickle.c index 7a8c9ed7243c3..851feadd27df8 100644 --- a/Modules/_pickle.c +++ b/Modules/_pickle.c @@ -9,6 +9,7 @@ #endif #include "Python.h" +#include "pycore_ceval.h" // _Py_EnterRecursiveCall() #include "pycore_moduleobject.h" // _PyModule_GetState() #include "pycore_runtime.h" // _Py_ID() #include "pycore_pystate.h" // _PyThreadState_GET() @@ -3068,21 +3069,21 @@ save_list(PicklerObject *self, PyObject *obj) if (len != 0) { /* Materialize the list elements. */ if (PyList_CheckExact(obj) && self->proto > 0) { - if (Py_EnterRecursiveCall(" while pickling an object")) + if (_Py_EnterRecursiveCall(" while pickling an object")) goto error; status = batch_list_exact(self, obj); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); } else { PyObject *iter = PyObject_GetIter(obj); if (iter == NULL) goto error; - if (Py_EnterRecursiveCall(" while pickling an object")) { + if (_Py_EnterRecursiveCall(" while pickling an object")) { Py_DECREF(iter); goto error; } status = batch_list(self, iter); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); Py_DECREF(iter); } } @@ -3327,10 +3328,10 @@ save_dict(PicklerObject *self, PyObject *obj) if (PyDict_CheckExact(obj) && self->proto > 0) { /* We can take certain shortcuts if we know this is a dict and not a dict subclass. */ - if (Py_EnterRecursiveCall(" while pickling an object")) + if (_Py_EnterRecursiveCall(" while pickling an object")) goto error; status = batch_dict_exact(self, obj); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); } else { items = PyObject_CallMethodNoArgs(obj, &_Py_ID(items)); if (items == NULL) @@ -3339,12 +3340,12 @@ save_dict(PicklerObject *self, PyObject *obj) Py_DECREF(items); if (iter == NULL) goto error; - if (Py_EnterRecursiveCall(" while pickling an object")) { + if (_Py_EnterRecursiveCall(" while pickling an object")) { Py_DECREF(iter); goto error; } status = batch_dict(self, iter); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); Py_DECREF(iter); } } @@ -4300,9 +4301,9 @@ save(PicklerObject *self, PyObject *obj, int pers_save) return save_unicode(self, obj); } - /* We're only calling Py_EnterRecursiveCall here so that atomic + /* We're only calling _Py_EnterRecursiveCall here so that atomic types above are pickled faster. */ - if (Py_EnterRecursiveCall(" while pickling an object")) { + if (_Py_EnterRecursiveCall(" while pickling an object")) { return -1; } @@ -4460,7 +4461,7 @@ save(PicklerObject *self, PyObject *obj, int pers_save) } done: - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); Py_XDECREF(reduce_func); Py_XDECREF(reduce_value); diff --git a/Objects/abstract.c b/Objects/abstract.c index 9034737235681..93987c201b5e2 100644 --- a/Objects/abstract.c +++ b/Objects/abstract.c @@ -3,7 +3,7 @@ #include "Python.h" #include "pycore_abstract.h" // _PyIndex_Check() #include "pycore_call.h" // _PyObject_CallNoArgs() -#include "pycore_ceval.h" // _Py_EnterRecursiveCall() +#include "pycore_ceval.h" // _Py_EnterRecursiveCallTstate() #include "pycore_object.h" // _Py_CheckSlotResult() #include "pycore_pyerrors.h" // _PyErr_Occurred() #include "pycore_pystate.h" // _PyThreadState_GET() @@ -2546,7 +2546,7 @@ abstract_issubclass(PyObject *derived, PyObject *cls) break; } assert(n >= 2); - if (Py_EnterRecursiveCall(" in __issubclass__")) { + if (_Py_EnterRecursiveCall(" in __issubclass__")) { Py_DECREF(bases); return -1; } @@ -2556,7 +2556,7 @@ abstract_issubclass(PyObject *derived, PyObject *cls) break; } } - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); Py_DECREF(bases); return r; } @@ -2633,7 +2633,7 @@ object_recursive_isinstance(PyThreadState *tstate, PyObject *inst, PyObject *cls if (PyTuple_Check(cls)) { /* Not a general sequence -- that opens up the road to recursion and stack overflow. */ - if (_Py_EnterRecursiveCall(tstate, " in __instancecheck__")) { + if (_Py_EnterRecursiveCallTstate(tstate, " in __instancecheck__")) { return -1; } Py_ssize_t n = PyTuple_GET_SIZE(cls); @@ -2646,19 +2646,19 @@ object_recursive_isinstance(PyThreadState *tstate, PyObject *inst, PyObject *cls break; } } - _Py_LeaveRecursiveCall(tstate); + _Py_LeaveRecursiveCallTstate(tstate); return r; } PyObject *checker = _PyObject_LookupSpecial(cls, &_Py_ID(__instancecheck__)); if (checker != NULL) { - if (_Py_EnterRecursiveCall(tstate, " in __instancecheck__")) { + if (_Py_EnterRecursiveCallTstate(tstate, " in __instancecheck__")) { Py_DECREF(checker); return -1; } PyObject *res = PyObject_CallOneArg(checker, inst); - _Py_LeaveRecursiveCall(tstate); + _Py_LeaveRecursiveCallTstate(tstate); Py_DECREF(checker); if (res == NULL) { @@ -2725,7 +2725,7 @@ object_issubclass(PyThreadState *tstate, PyObject *derived, PyObject *cls) if (PyTuple_Check(cls)) { - if (_Py_EnterRecursiveCall(tstate, " in __subclasscheck__")) { + if (_Py_EnterRecursiveCallTstate(tstate, " in __subclasscheck__")) { return -1; } Py_ssize_t n = PyTuple_GET_SIZE(cls); @@ -2737,19 +2737,19 @@ object_issubclass(PyThreadState *tstate, PyObject *derived, PyObject *cls) /* either found it, or got an error */ break; } - _Py_LeaveRecursiveCall(tstate); + _Py_LeaveRecursiveCallTstate(tstate); return r; } checker = _PyObject_LookupSpecial(cls, &_Py_ID(__subclasscheck__)); if (checker != NULL) { int ok = -1; - if (_Py_EnterRecursiveCall(tstate, " in __subclasscheck__")) { + if (_Py_EnterRecursiveCallTstate(tstate, " in __subclasscheck__")) { Py_DECREF(checker); return ok; } PyObject *res = PyObject_CallOneArg(checker, derived); - _Py_LeaveRecursiveCall(tstate); + _Py_LeaveRecursiveCallTstate(tstate); Py_DECREF(checker); if (res != NULL) { ok = PyObject_IsTrue(res); diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c index b5066d0986c7b..b429f7687f7f1 100644 --- a/Objects/bytesobject.c +++ b/Objects/bytesobject.c @@ -3489,7 +3489,7 @@ _PyBytesWriter_Alloc(_PyBytesWriter *writer, Py_ssize_t size) Don't modify the _PyBytesWriter structure (use a shorter small buffer) in debug mode to also be able to detect stack overflow when running tests in debug mode. The _PyBytesWriter is large (more than 512 bytes), - if Py_EnterRecursiveCall() is not used in deep C callback, we may hit a + if _Py_EnterRecursiveCall() is not used in deep C callback, we may hit a stack overflow. */ writer->allocated = Py_MIN(writer->allocated, 10); /* _PyBytesWriter_CheckConsistency() requires the last byte to be 0, diff --git a/Objects/call.c b/Objects/call.c index 448476223adc0..678d16269f216 100644 --- a/Objects/call.c +++ b/Objects/call.c @@ -209,11 +209,11 @@ _PyObject_MakeTpCall(PyThreadState *tstate, PyObject *callable, } PyObject *result = NULL; - if (_Py_EnterRecursiveCall(tstate, " while calling a Python object") == 0) + if (_Py_EnterRecursiveCallTstate(tstate, " while calling a Python object") == 0) { result = _PyCFunctionWithKeywords_TrampolineCall( (PyCFunctionWithKeywords)call, callable, argstuple, kwdict); - _Py_LeaveRecursiveCall(tstate); + _Py_LeaveRecursiveCallTstate(tstate); } Py_DECREF(argstuple); @@ -336,13 +336,13 @@ _PyObject_Call(PyThreadState *tstate, PyObject *callable, return NULL; } - if (_Py_EnterRecursiveCall(tstate, " while calling a Python object")) { + if (_Py_EnterRecursiveCallTstate(tstate, " while calling a Python object")) { return NULL; } result = (*call)(callable, args, kwargs); - _Py_LeaveRecursiveCall(tstate); + _Py_LeaveRecursiveCallTstate(tstate); return _Py_CheckFunctionResult(tstate, callable, result, NULL); } diff --git a/Objects/descrobject.c b/Objects/descrobject.c index 9cc76cfa00d1f..c3c541bf3c321 100644 --- a/Objects/descrobject.c +++ b/Objects/descrobject.c @@ -1,7 +1,7 @@ /* Descriptors -- a new, flexible way to describe attributes */ #include "Python.h" -#include "pycore_ceval.h" // _Py_EnterRecursiveCall() +#include "pycore_ceval.h" // _Py_EnterRecursiveCallTstate() #include "pycore_object.h" // _PyObject_GC_UNTRACK() #include "pycore_pystate.h" // _PyThreadState_GET() #include "pycore_tuple.h" // _PyTuple_ITEMS() @@ -302,7 +302,7 @@ typedef void (*funcptr)(void); static inline funcptr method_enter_call(PyThreadState *tstate, PyObject *func) { - if (_Py_EnterRecursiveCall(tstate, " while calling a Python object")) { + if (_Py_EnterRecursiveCallTstate(tstate, " while calling a Python object")) { return NULL; } return (funcptr)((PyMethodDescrObject *)func)->d_method->ml_meth; @@ -330,7 +330,7 @@ method_vectorcall_VARARGS( PyObject *result = _PyCFunction_TrampolineCall( meth, args[0], argstuple); Py_DECREF(argstuple); - _Py_LeaveRecursiveCall(tstate); + _Py_LeaveRecursiveCallTstate(tstate); return result; } @@ -363,7 +363,7 @@ method_vectorcall_VARARGS_KEYWORDS( } result = _PyCFunctionWithKeywords_TrampolineCall( meth, args[0], argstuple, kwdict); - _Py_LeaveRecursiveCall(tstate); + _Py_LeaveRecursiveCallTstate(tstate); exit: Py_DECREF(argstuple); Py_XDECREF(kwdict); @@ -386,7 +386,7 @@ method_vectorcall_FASTCALL_KEYWORDS_METHOD( PyObject *result = meth(args[0], ((PyMethodDescrObject *)func)->d_common.d_type, args+1, nargs-1, kwnames); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); return result; } @@ -405,7 +405,7 @@ method_vectorcall_FASTCALL( return NULL; } PyObject *result = meth(args[0], args+1, nargs-1); - _Py_LeaveRecursiveCall(tstate); + _Py_LeaveRecursiveCallTstate(tstate); return result; } @@ -424,7 +424,7 @@ method_vectorcall_FASTCALL_KEYWORDS( return NULL; } PyObject *result = meth(args[0], args+1, nargs-1, kwnames); - _Py_LeaveRecursiveCall(tstate); + _Py_LeaveRecursiveCallTstate(tstate); return result; } @@ -451,7 +451,7 @@ method_vectorcall_NOARGS( return NULL; } PyObject *result = _PyCFunction_TrampolineCall(meth, args[0], NULL); - _Py_LeaveRecursiveCall(tstate); + _Py_LeaveRecursiveCallTstate(tstate); return result; } @@ -479,7 +479,7 @@ method_vectorcall_O( return NULL; } PyObject *result = _PyCFunction_TrampolineCall(meth, args[0], args[1]); - _Py_LeaveRecursiveCall(tstate); + _Py_LeaveRecursiveCallTstate(tstate); return result; } diff --git a/Objects/exceptions.c b/Objects/exceptions.c index b26a0e93af484..cf8258b0e244b 100644 --- a/Objects/exceptions.c +++ b/Objects/exceptions.c @@ -7,6 +7,7 @@ #define PY_SSIZE_T_CLEAN #include #include +#include "pycore_ceval.h" // _Py_EnterRecursiveCall #include "pycore_exceptions.h" // struct _Py_exc_state #include "pycore_initconfig.h" #include "pycore_object.h" @@ -1097,7 +1098,7 @@ exceptiongroup_split_recursive(PyObject *exc, for (Py_ssize_t i = 0; i < num_excs; i++) { PyObject *e = PyTuple_GET_ITEM(eg->excs, i); _exceptiongroup_split_result rec_result; - if (Py_EnterRecursiveCall(" in exceptiongroup_split_recursive")) { + if (_Py_EnterRecursiveCall(" in exceptiongroup_split_recursive")) { goto done; } if (exceptiongroup_split_recursive( @@ -1105,10 +1106,10 @@ exceptiongroup_split_recursive(PyObject *exc, construct_rest, &rec_result) < 0) { assert(!rec_result.match); assert(!rec_result.rest); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); goto done; } - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (rec_result.match) { assert(PyList_CheckExact(match_list)); if (PyList_Append(match_list, rec_result.match) < 0) { @@ -1234,11 +1235,11 @@ collect_exception_group_leaves(PyObject *exc, PyObject *leaves) /* recursive calls */ for (Py_ssize_t i = 0; i < num_excs; i++) { PyObject *e = PyTuple_GET_ITEM(eg->excs, i); - if (Py_EnterRecursiveCall(" in collect_exception_group_leaves")) { + if (_Py_EnterRecursiveCall(" in collect_exception_group_leaves")) { return -1; } int res = collect_exception_group_leaves(e, leaves); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res < 0) { return -1; } diff --git a/Objects/methodobject.c b/Objects/methodobject.c index 8bcb1e0fadb8c..953cf4666d33b 100644 --- a/Objects/methodobject.c +++ b/Objects/methodobject.c @@ -2,7 +2,7 @@ /* Method object implementation */ #include "Python.h" -#include "pycore_ceval.h" // _Py_EnterRecursiveCall() +#include "pycore_ceval.h" // _Py_EnterRecursiveCallTstate() #include "pycore_object.h" #include "pycore_pyerrors.h" #include "pycore_pystate.h" // _PyThreadState_GET() @@ -403,7 +403,7 @@ typedef void (*funcptr)(void); static inline funcptr cfunction_enter_call(PyThreadState *tstate, PyObject *func) { - if (_Py_EnterRecursiveCall(tstate, " while calling a Python object")) { + if (_Py_EnterRecursiveCallTstate(tstate, " while calling a Python object")) { return NULL; } return (funcptr)PyCFunction_GET_FUNCTION(func); @@ -425,7 +425,7 @@ cfunction_vectorcall_FASTCALL( return NULL; } PyObject *result = meth(PyCFunction_GET_SELF(func), args, nargs); - _Py_LeaveRecursiveCall(tstate); + _Py_LeaveRecursiveCallTstate(tstate); return result; } @@ -441,7 +441,7 @@ cfunction_vectorcall_FASTCALL_KEYWORDS( return NULL; } PyObject *result = meth(PyCFunction_GET_SELF(func), args, nargs, kwnames); - _Py_LeaveRecursiveCall(tstate); + _Py_LeaveRecursiveCallTstate(tstate); return result; } @@ -457,7 +457,7 @@ cfunction_vectorcall_FASTCALL_KEYWORDS_METHOD( return NULL; } PyObject *result = meth(PyCFunction_GET_SELF(func), cls, args, nargs, kwnames); - _Py_LeaveRecursiveCall(tstate); + _Py_LeaveRecursiveCallTstate(tstate); return result; } @@ -485,7 +485,7 @@ cfunction_vectorcall_NOARGS( } PyObject *result = _PyCFunction_TrampolineCall( meth, PyCFunction_GET_SELF(func), NULL); - _Py_LeaveRecursiveCall(tstate); + _Py_LeaveRecursiveCallTstate(tstate); return result; } @@ -513,7 +513,7 @@ cfunction_vectorcall_O( } PyObject *result = _PyCFunction_TrampolineCall( meth, PyCFunction_GET_SELF(func), args[0]); - _Py_LeaveRecursiveCall(tstate); + _Py_LeaveRecursiveCallTstate(tstate); return result; } diff --git a/Objects/object.c b/Objects/object.c index 1144719c313e2..6f2d9f89562a5 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -3,7 +3,7 @@ #include "Python.h" #include "pycore_call.h" // _PyObject_CallNoArgs() -#include "pycore_ceval.h" // _Py_EnterRecursiveCall() +#include "pycore_ceval.h" // _Py_EnterRecursiveCallTstate() #include "pycore_context.h" // _PyContextTokenMissing_Type #include "pycore_dict.h" // _PyObject_MakeDictFromInstanceAttributes() #include "pycore_floatobject.h" // _PyFloat_DebugMallocStats() @@ -427,12 +427,12 @@ PyObject_Repr(PyObject *v) /* It is possible for a type to have a tp_repr representation that loops infinitely. */ - if (_Py_EnterRecursiveCall(tstate, - " while getting the repr of an object")) { + if (_Py_EnterRecursiveCallTstate(tstate, + " while getting the repr of an object")) { return NULL; } res = (*Py_TYPE(v)->tp_repr)(v); - _Py_LeaveRecursiveCall(tstate); + _Py_LeaveRecursiveCallTstate(tstate); if (res == NULL) { return NULL; @@ -487,11 +487,11 @@ PyObject_Str(PyObject *v) /* It is possible for a type to have a tp_str representation that loops infinitely. */ - if (_Py_EnterRecursiveCall(tstate, " while getting the str of an object")) { + if (_Py_EnterRecursiveCallTstate(tstate, " while getting the str of an object")) { return NULL; } res = (*Py_TYPE(v)->tp_str)(v); - _Py_LeaveRecursiveCall(tstate); + _Py_LeaveRecursiveCallTstate(tstate); if (res == NULL) { return NULL; @@ -724,11 +724,11 @@ PyObject_RichCompare(PyObject *v, PyObject *w, int op) } return NULL; } - if (_Py_EnterRecursiveCall(tstate, " in comparison")) { + if (_Py_EnterRecursiveCallTstate(tstate, " in comparison")) { return NULL; } PyObject *res = do_richcompare(tstate, v, w, op); - _Py_LeaveRecursiveCall(tstate); + _Py_LeaveRecursiveCallTstate(tstate); return res; } diff --git a/Parser/asdl_c.py b/Parser/asdl_c.py index 37925a5783d6d..3bfe320fe3b70 100755 --- a/Parser/asdl_c.py +++ b/Parser/asdl_c.py @@ -490,11 +490,11 @@ def visitProduct(self, prod, name): class Obj2ModVisitor(PickleVisitor): @contextmanager def recursive_call(self, node, level): - self.emit('if (Py_EnterRecursiveCall(" while traversing \'%s\' node")) {' % node, level, reflow=False) + self.emit('if (_Py_EnterRecursiveCall(" while traversing \'%s\' node")) {' % node, level, reflow=False) self.emit('goto failed;', level + 1) self.emit('}', level) yield - self.emit('Py_LeaveRecursiveCall();', level) + self.emit('_Py_LeaveRecursiveCall();', level) def funcHeader(self, name): ctype = get_c_type(name) @@ -1482,9 +1482,10 @@ def generate_module_def(mod, metadata, f, internal_h): print(textwrap.dedent(""" #include "Python.h" #include "pycore_ast.h" - #include "pycore_ast_state.h" // struct ast_state - #include "pycore_interp.h" // _PyInterpreterState.ast - #include "pycore_pystate.h" // _PyInterpreterState_GET() + #include "pycore_ast_state.h" // struct ast_state + #include "pycore_ceval.h" // _Py_EnterRecursiveCall + #include "pycore_interp.h" // _PyInterpreterState.ast + #include "pycore_pystate.h" // _PyInterpreterState_GET() #include "structmember.h" #include diff --git a/Python/Python-ast.c b/Python/Python-ast.c index da79463375a1a..3861eaf978a38 100644 --- a/Python/Python-ast.c +++ b/Python/Python-ast.c @@ -2,9 +2,10 @@ #include "Python.h" #include "pycore_ast.h" -#include "pycore_ast_state.h" // struct ast_state -#include "pycore_interp.h" // _PyInterpreterState.ast -#include "pycore_pystate.h" // _PyInterpreterState_GET() +#include "pycore_ast_state.h" // struct ast_state +#include "pycore_ceval.h" // _Py_EnterRecursiveCall +#include "pycore_interp.h" // _PyInterpreterState.ast +#include "pycore_pystate.h" // _PyInterpreterState_GET() #include "structmember.h" #include @@ -5432,11 +5433,11 @@ obj2ast_mod(struct ast_state *state, PyObject* obj, mod_ty* out, PyArena* arena) stmt_ty val; PyObject *tmp2 = PyList_GET_ITEM(tmp, i); Py_INCREF(tmp2); - if (Py_EnterRecursiveCall(" while traversing 'Module' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'Module' node")) { goto failed; } res = obj2ast_stmt(state, tmp2, &val, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { @@ -5469,11 +5470,11 @@ obj2ast_mod(struct ast_state *state, PyObject* obj, mod_ty* out, PyArena* arena) type_ignore_ty val; PyObject *tmp2 = PyList_GET_ITEM(tmp, i); Py_INCREF(tmp2); - if (Py_EnterRecursiveCall(" while traversing 'Module' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'Module' node")) { goto failed; } res = obj2ast_type_ignore(state, tmp2, &val, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { @@ -5518,11 +5519,11 @@ obj2ast_mod(struct ast_state *state, PyObject* obj, mod_ty* out, PyArena* arena) stmt_ty val; PyObject *tmp2 = PyList_GET_ITEM(tmp, i); Py_INCREF(tmp2); - if (Py_EnterRecursiveCall(" while traversing 'Interactive' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'Interactive' node")) { goto failed; } res = obj2ast_stmt(state, tmp2, &val, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { @@ -5554,11 +5555,11 @@ obj2ast_mod(struct ast_state *state, PyObject* obj, mod_ty* out, PyArena* arena) } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'Expression' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'Expression' node")) { goto failed; } res = obj2ast_expr(state, tmp, &body, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -5597,11 +5598,11 @@ obj2ast_mod(struct ast_state *state, PyObject* obj, mod_ty* out, PyArena* arena) expr_ty val; PyObject *tmp2 = PyList_GET_ITEM(tmp, i); Py_INCREF(tmp2); - if (Py_EnterRecursiveCall(" while traversing 'FunctionType' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'FunctionType' node")) { goto failed; } res = obj2ast_expr(state, tmp2, &val, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { @@ -5621,11 +5622,11 @@ obj2ast_mod(struct ast_state *state, PyObject* obj, mod_ty* out, PyArena* arena) } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'FunctionType' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'FunctionType' node")) { goto failed; } res = obj2ast_expr(state, tmp, &returns, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -5666,11 +5667,11 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'stmt' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'stmt' node")) { goto failed; } res = obj2ast_int(state, tmp, &lineno, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -5683,11 +5684,11 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'stmt' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'stmt' node")) { goto failed; } res = obj2ast_int(state, tmp, &col_offset, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -5700,11 +5701,11 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'stmt' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'stmt' node")) { goto failed; } res = obj2ast_int(state, tmp, &end_lineno, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -5717,11 +5718,11 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'stmt' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'stmt' node")) { goto failed; } res = obj2ast_int(state, tmp, &end_col_offset, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -5747,11 +5748,11 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'FunctionDef' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'FunctionDef' node")) { goto failed; } res = obj2ast_identifier(state, tmp, &name, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -5764,11 +5765,11 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'FunctionDef' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'FunctionDef' node")) { goto failed; } res = obj2ast_arguments(state, tmp, &args, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -5794,11 +5795,11 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* stmt_ty val; PyObject *tmp2 = PyList_GET_ITEM(tmp, i); Py_INCREF(tmp2); - if (Py_EnterRecursiveCall(" while traversing 'FunctionDef' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'FunctionDef' node")) { goto failed; } res = obj2ast_stmt(state, tmp2, &val, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { @@ -5831,11 +5832,11 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* expr_ty val; PyObject *tmp2 = PyList_GET_ITEM(tmp, i); Py_INCREF(tmp2); - if (Py_EnterRecursiveCall(" while traversing 'FunctionDef' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'FunctionDef' node")) { goto failed; } res = obj2ast_expr(state, tmp2, &val, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { @@ -5855,11 +5856,11 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'FunctionDef' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'FunctionDef' node")) { goto failed; } res = obj2ast_expr(state, tmp, &returns, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -5872,11 +5873,11 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'FunctionDef' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'FunctionDef' node")) { goto failed; } res = obj2ast_string(state, tmp, &type_comment, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -5908,11 +5909,11 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'AsyncFunctionDef' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'AsyncFunctionDef' node")) { goto failed; } res = obj2ast_identifier(state, tmp, &name, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -5925,11 +5926,11 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'AsyncFunctionDef' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'AsyncFunctionDef' node")) { goto failed; } res = obj2ast_arguments(state, tmp, &args, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -5955,11 +5956,11 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* stmt_ty val; PyObject *tmp2 = PyList_GET_ITEM(tmp, i); Py_INCREF(tmp2); - if (Py_EnterRecursiveCall(" while traversing 'AsyncFunctionDef' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'AsyncFunctionDef' node")) { goto failed; } res = obj2ast_stmt(state, tmp2, &val, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { @@ -5992,11 +5993,11 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* expr_ty val; PyObject *tmp2 = PyList_GET_ITEM(tmp, i); Py_INCREF(tmp2); - if (Py_EnterRecursiveCall(" while traversing 'AsyncFunctionDef' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'AsyncFunctionDef' node")) { goto failed; } res = obj2ast_expr(state, tmp2, &val, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { @@ -6016,11 +6017,11 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'AsyncFunctionDef' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'AsyncFunctionDef' node")) { goto failed; } res = obj2ast_expr(state, tmp, &returns, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -6033,11 +6034,11 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'AsyncFunctionDef' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'AsyncFunctionDef' node")) { goto failed; } res = obj2ast_string(state, tmp, &type_comment, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -6069,11 +6070,11 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'ClassDef' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'ClassDef' node")) { goto failed; } res = obj2ast_identifier(state, tmp, &name, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -6099,11 +6100,11 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* expr_ty val; PyObject *tmp2 = PyList_GET_ITEM(tmp, i); Py_INCREF(tmp2); - if (Py_EnterRecursiveCall(" while traversing 'ClassDef' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'ClassDef' node")) { goto failed; } res = obj2ast_expr(state, tmp2, &val, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { @@ -6136,11 +6137,11 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* keyword_ty val; PyObject *tmp2 = PyList_GET_ITEM(tmp, i); Py_INCREF(tmp2); - if (Py_EnterRecursiveCall(" while traversing 'ClassDef' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'ClassDef' node")) { goto failed; } res = obj2ast_keyword(state, tmp2, &val, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { @@ -6173,11 +6174,11 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* stmt_ty val; PyObject *tmp2 = PyList_GET_ITEM(tmp, i); Py_INCREF(tmp2); - if (Py_EnterRecursiveCall(" while traversing 'ClassDef' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'ClassDef' node")) { goto failed; } res = obj2ast_stmt(state, tmp2, &val, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { @@ -6210,11 +6211,11 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* expr_ty val; PyObject *tmp2 = PyList_GET_ITEM(tmp, i); Py_INCREF(tmp2); - if (Py_EnterRecursiveCall(" while traversing 'ClassDef' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'ClassDef' node")) { goto failed; } res = obj2ast_expr(state, tmp2, &val, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { @@ -6248,11 +6249,11 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'Return' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'Return' node")) { goto failed; } res = obj2ast_expr(state, tmp, &value, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -6291,11 +6292,11 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* expr_ty val; PyObject *tmp2 = PyList_GET_ITEM(tmp, i); Py_INCREF(tmp2); - if (Py_EnterRecursiveCall(" while traversing 'Delete' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'Delete' node")) { goto failed; } res = obj2ast_expr(state, tmp2, &val, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { @@ -6343,11 +6344,11 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* expr_ty val; PyObject *tmp2 = PyList_GET_ITEM(tmp, i); Py_INCREF(tmp2); - if (Py_EnterRecursiveCall(" while traversing 'Assign' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'Assign' node")) { goto failed; } res = obj2ast_expr(state, tmp2, &val, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { @@ -6367,11 +6368,11 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'Assign' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'Assign' node")) { goto failed; } res = obj2ast_expr(state, tmp, &value, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -6384,11 +6385,11 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'Assign' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'Assign' node")) { goto failed; } res = obj2ast_string(state, tmp, &type_comment, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -6416,11 +6417,11 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'AugAssign' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'AugAssign' node")) { goto failed; } res = obj2ast_expr(state, tmp, &target, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -6433,11 +6434,11 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'AugAssign' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'AugAssign' node")) { goto failed; } res = obj2ast_operator(state, tmp, &op, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -6450,11 +6451,11 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'AugAssign' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'AugAssign' node")) { goto failed; } res = obj2ast_expr(state, tmp, &value, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -6483,11 +6484,11 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'AnnAssign' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'AnnAssign' node")) { goto failed; } res = obj2ast_expr(state, tmp, &target, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -6500,11 +6501,11 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'AnnAssign' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'AnnAssign' node")) { goto failed; } res = obj2ast_expr(state, tmp, &annotation, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -6517,11 +6518,11 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'AnnAssign' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'AnnAssign' node")) { goto failed; } res = obj2ast_expr(state, tmp, &value, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -6534,11 +6535,11 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'AnnAssign' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'AnnAssign' node")) { goto failed; } res = obj2ast_int(state, tmp, &simple, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -6568,11 +6569,11 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'For' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'For' node")) { goto failed; } res = obj2ast_expr(state, tmp, &target, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -6585,11 +6586,11 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'For' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'For' node")) { goto failed; } res = obj2ast_expr(state, tmp, &iter, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -6615,11 +6616,11 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* stmt_ty val; PyObject *tmp2 = PyList_GET_ITEM(tmp, i); Py_INCREF(tmp2); - if (Py_EnterRecursiveCall(" while traversing 'For' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'For' node")) { goto failed; } res = obj2ast_stmt(state, tmp2, &val, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { @@ -6652,11 +6653,11 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* stmt_ty val; PyObject *tmp2 = PyList_GET_ITEM(tmp, i); Py_INCREF(tmp2); - if (Py_EnterRecursiveCall(" while traversing 'For' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'For' node")) { goto failed; } res = obj2ast_stmt(state, tmp2, &val, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { @@ -6676,11 +6677,11 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'For' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'For' node")) { goto failed; } res = obj2ast_string(state, tmp, &type_comment, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -6710,11 +6711,11 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'AsyncFor' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'AsyncFor' node")) { goto failed; } res = obj2ast_expr(state, tmp, &target, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -6727,11 +6728,11 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'AsyncFor' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'AsyncFor' node")) { goto failed; } res = obj2ast_expr(state, tmp, &iter, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -6757,11 +6758,11 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* stmt_ty val; PyObject *tmp2 = PyList_GET_ITEM(tmp, i); Py_INCREF(tmp2); - if (Py_EnterRecursiveCall(" while traversing 'AsyncFor' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'AsyncFor' node")) { goto failed; } res = obj2ast_stmt(state, tmp2, &val, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { @@ -6794,11 +6795,11 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* stmt_ty val; PyObject *tmp2 = PyList_GET_ITEM(tmp, i); Py_INCREF(tmp2); - if (Py_EnterRecursiveCall(" while traversing 'AsyncFor' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'AsyncFor' node")) { goto failed; } res = obj2ast_stmt(state, tmp2, &val, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { @@ -6818,11 +6819,11 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'AsyncFor' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'AsyncFor' node")) { goto failed; } res = obj2ast_string(state, tmp, &type_comment, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -6851,11 +6852,11 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'While' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'While' node")) { goto failed; } res = obj2ast_expr(state, tmp, &test, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -6881,11 +6882,11 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* stmt_ty val; PyObject *tmp2 = PyList_GET_ITEM(tmp, i); Py_INCREF(tmp2); - if (Py_EnterRecursiveCall(" while traversing 'While' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'While' node")) { goto failed; } res = obj2ast_stmt(state, tmp2, &val, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { @@ -6918,11 +6919,11 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* stmt_ty val; PyObject *tmp2 = PyList_GET_ITEM(tmp, i); Py_INCREF(tmp2); - if (Py_EnterRecursiveCall(" while traversing 'While' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'While' node")) { goto failed; } res = obj2ast_stmt(state, tmp2, &val, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { @@ -6957,11 +6958,11 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'If' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'If' node")) { goto failed; } res = obj2ast_expr(state, tmp, &test, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -6987,11 +6988,11 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* stmt_ty val; PyObject *tmp2 = PyList_GET_ITEM(tmp, i); Py_INCREF(tmp2); - if (Py_EnterRecursiveCall(" while traversing 'If' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'If' node")) { goto failed; } res = obj2ast_stmt(state, tmp2, &val, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { @@ -7024,11 +7025,11 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* stmt_ty val; PyObject *tmp2 = PyList_GET_ITEM(tmp, i); Py_INCREF(tmp2); - if (Py_EnterRecursiveCall(" while traversing 'If' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'If' node")) { goto failed; } res = obj2ast_stmt(state, tmp2, &val, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { @@ -7076,11 +7077,11 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* withitem_ty val; PyObject *tmp2 = PyList_GET_ITEM(tmp, i); Py_INCREF(tmp2); - if (Py_EnterRecursiveCall(" while traversing 'With' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'With' node")) { goto failed; } res = obj2ast_withitem(state, tmp2, &val, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { @@ -7113,11 +7114,11 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* stmt_ty val; PyObject *tmp2 = PyList_GET_ITEM(tmp, i); Py_INCREF(tmp2); - if (Py_EnterRecursiveCall(" while traversing 'With' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'With' node")) { goto failed; } res = obj2ast_stmt(state, tmp2, &val, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { @@ -7137,11 +7138,11 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'With' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'With' node")) { goto failed; } res = obj2ast_string(state, tmp, &type_comment, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -7182,11 +7183,11 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* withitem_ty val; PyObject *tmp2 = PyList_GET_ITEM(tmp, i); Py_INCREF(tmp2); - if (Py_EnterRecursiveCall(" while traversing 'AsyncWith' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'AsyncWith' node")) { goto failed; } res = obj2ast_withitem(state, tmp2, &val, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { @@ -7219,11 +7220,11 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* stmt_ty val; PyObject *tmp2 = PyList_GET_ITEM(tmp, i); Py_INCREF(tmp2); - if (Py_EnterRecursiveCall(" while traversing 'AsyncWith' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'AsyncWith' node")) { goto failed; } res = obj2ast_stmt(state, tmp2, &val, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { @@ -7243,11 +7244,11 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'AsyncWith' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'AsyncWith' node")) { goto failed; } res = obj2ast_string(state, tmp, &type_comment, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -7274,11 +7275,11 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'Match' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'Match' node")) { goto failed; } res = obj2ast_expr(state, tmp, &subject, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -7304,11 +7305,11 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* match_case_ty val; PyObject *tmp2 = PyList_GET_ITEM(tmp, i); Py_INCREF(tmp2); - if (Py_EnterRecursiveCall(" while traversing 'Match' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'Match' node")) { goto failed; } res = obj2ast_match_case(state, tmp2, &val, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { @@ -7342,11 +7343,11 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'Raise' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'Raise' node")) { goto failed; } res = obj2ast_expr(state, tmp, &exc, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -7359,11 +7360,11 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'Raise' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'Raise' node")) { goto failed; } res = obj2ast_expr(state, tmp, &cause, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -7405,11 +7406,11 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* stmt_ty val; PyObject *tmp2 = PyList_GET_ITEM(tmp, i); Py_INCREF(tmp2); - if (Py_EnterRecursiveCall(" while traversing 'Try' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'Try' node")) { goto failed; } res = obj2ast_stmt(state, tmp2, &val, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { @@ -7442,11 +7443,11 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* excepthandler_ty val; PyObject *tmp2 = PyList_GET_ITEM(tmp, i); Py_INCREF(tmp2); - if (Py_EnterRecursiveCall(" while traversing 'Try' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'Try' node")) { goto failed; } res = obj2ast_excepthandler(state, tmp2, &val, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { @@ -7479,11 +7480,11 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* stmt_ty val; PyObject *tmp2 = PyList_GET_ITEM(tmp, i); Py_INCREF(tmp2); - if (Py_EnterRecursiveCall(" while traversing 'Try' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'Try' node")) { goto failed; } res = obj2ast_stmt(state, tmp2, &val, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { @@ -7516,11 +7517,11 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* stmt_ty val; PyObject *tmp2 = PyList_GET_ITEM(tmp, i); Py_INCREF(tmp2); - if (Py_EnterRecursiveCall(" while traversing 'Try' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'Try' node")) { goto failed; } res = obj2ast_stmt(state, tmp2, &val, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { @@ -7569,11 +7570,11 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* stmt_ty val; PyObject *tmp2 = PyList_GET_ITEM(tmp, i); Py_INCREF(tmp2); - if (Py_EnterRecursiveCall(" while traversing 'TryStar' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'TryStar' node")) { goto failed; } res = obj2ast_stmt(state, tmp2, &val, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { @@ -7606,11 +7607,11 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* excepthandler_ty val; PyObject *tmp2 = PyList_GET_ITEM(tmp, i); Py_INCREF(tmp2); - if (Py_EnterRecursiveCall(" while traversing 'TryStar' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'TryStar' node")) { goto failed; } res = obj2ast_excepthandler(state, tmp2, &val, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { @@ -7643,11 +7644,11 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* stmt_ty val; PyObject *tmp2 = PyList_GET_ITEM(tmp, i); Py_INCREF(tmp2); - if (Py_EnterRecursiveCall(" while traversing 'TryStar' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'TryStar' node")) { goto failed; } res = obj2ast_stmt(state, tmp2, &val, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { @@ -7680,11 +7681,11 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* stmt_ty val; PyObject *tmp2 = PyList_GET_ITEM(tmp, i); Py_INCREF(tmp2); - if (Py_EnterRecursiveCall(" while traversing 'TryStar' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'TryStar' node")) { goto failed; } res = obj2ast_stmt(state, tmp2, &val, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { @@ -7718,11 +7719,11 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'Assert' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'Assert' node")) { goto failed; } res = obj2ast_expr(state, tmp, &test, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -7735,11 +7736,11 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'Assert' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'Assert' node")) { goto failed; } res = obj2ast_expr(state, tmp, &msg, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -7778,11 +7779,11 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* alias_ty val; PyObject *tmp2 = PyList_GET_ITEM(tmp, i); Py_INCREF(tmp2); - if (Py_EnterRecursiveCall(" while traversing 'Import' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'Import' node")) { goto failed; } res = obj2ast_alias(state, tmp2, &val, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { @@ -7817,11 +7818,11 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'ImportFrom' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'ImportFrom' node")) { goto failed; } res = obj2ast_identifier(state, tmp, &module, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -7847,11 +7848,11 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* alias_ty val; PyObject *tmp2 = PyList_GET_ITEM(tmp, i); Py_INCREF(tmp2); - if (Py_EnterRecursiveCall(" while traversing 'ImportFrom' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'ImportFrom' node")) { goto failed; } res = obj2ast_alias(state, tmp2, &val, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { @@ -7871,11 +7872,11 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'ImportFrom' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'ImportFrom' node")) { goto failed; } res = obj2ast_int(state, tmp, &level, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -7914,11 +7915,11 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* identifier val; PyObject *tmp2 = PyList_GET_ITEM(tmp, i); Py_INCREF(tmp2); - if (Py_EnterRecursiveCall(" while traversing 'Global' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'Global' node")) { goto failed; } res = obj2ast_identifier(state, tmp2, &val, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { @@ -7964,11 +7965,11 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* identifier val; PyObject *tmp2 = PyList_GET_ITEM(tmp, i); Py_INCREF(tmp2); - if (Py_EnterRecursiveCall(" while traversing 'Nonlocal' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'Nonlocal' node")) { goto failed; } res = obj2ast_identifier(state, tmp2, &val, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { @@ -8001,11 +8002,11 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'Expr' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'Expr' node")) { goto failed; } res = obj2ast_expr(state, tmp, &value, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -8083,11 +8084,11 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'expr' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'expr' node")) { goto failed; } res = obj2ast_int(state, tmp, &lineno, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -8100,11 +8101,11 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'expr' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'expr' node")) { goto failed; } res = obj2ast_int(state, tmp, &col_offset, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -8117,11 +8118,11 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'expr' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'expr' node")) { goto failed; } res = obj2ast_int(state, tmp, &end_lineno, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -8134,11 +8135,11 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'expr' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'expr' node")) { goto failed; } res = obj2ast_int(state, tmp, &end_col_offset, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -8160,11 +8161,11 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'BoolOp' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'BoolOp' node")) { goto failed; } res = obj2ast_boolop(state, tmp, &op, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -8190,11 +8191,11 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena* expr_ty val; PyObject *tmp2 = PyList_GET_ITEM(tmp, i); Py_INCREF(tmp2); - if (Py_EnterRecursiveCall(" while traversing 'BoolOp' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'BoolOp' node")) { goto failed; } res = obj2ast_expr(state, tmp2, &val, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { @@ -8228,11 +8229,11 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'NamedExpr' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'NamedExpr' node")) { goto failed; } res = obj2ast_expr(state, tmp, &target, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -8245,11 +8246,11 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'NamedExpr' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'NamedExpr' node")) { goto failed; } res = obj2ast_expr(state, tmp, &value, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -8277,11 +8278,11 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'BinOp' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'BinOp' node")) { goto failed; } res = obj2ast_expr(state, tmp, &left, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -8294,11 +8295,11 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'BinOp' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'BinOp' node")) { goto failed; } res = obj2ast_operator(state, tmp, &op, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -8311,11 +8312,11 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'BinOp' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'BinOp' node")) { goto failed; } res = obj2ast_expr(state, tmp, &right, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -8342,11 +8343,11 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'UnaryOp' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'UnaryOp' node")) { goto failed; } res = obj2ast_unaryop(state, tmp, &op, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -8359,11 +8360,11 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'UnaryOp' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'UnaryOp' node")) { goto failed; } res = obj2ast_expr(state, tmp, &operand, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -8390,11 +8391,11 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'Lambda' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'Lambda' node")) { goto failed; } res = obj2ast_arguments(state, tmp, &args, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -8407,11 +8408,11 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'Lambda' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'Lambda' node")) { goto failed; } res = obj2ast_expr(state, tmp, &body, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -8439,11 +8440,11 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'IfExp' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'IfExp' node")) { goto failed; } res = obj2ast_expr(state, tmp, &test, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -8456,11 +8457,11 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'IfExp' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'IfExp' node")) { goto failed; } res = obj2ast_expr(state, tmp, &body, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -8473,11 +8474,11 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'IfExp' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'IfExp' node")) { goto failed; } res = obj2ast_expr(state, tmp, &orelse, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -8517,11 +8518,11 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena* expr_ty val; PyObject *tmp2 = PyList_GET_ITEM(tmp, i); Py_INCREF(tmp2); - if (Py_EnterRecursiveCall(" while traversing 'Dict' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'Dict' node")) { goto failed; } res = obj2ast_expr(state, tmp2, &val, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { @@ -8554,11 +8555,11 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena* expr_ty val; PyObject *tmp2 = PyList_GET_ITEM(tmp, i); Py_INCREF(tmp2); - if (Py_EnterRecursiveCall(" while traversing 'Dict' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'Dict' node")) { goto failed; } res = obj2ast_expr(state, tmp2, &val, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { @@ -8604,11 +8605,11 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena* expr_ty val; PyObject *tmp2 = PyList_GET_ITEM(tmp, i); Py_INCREF(tmp2); - if (Py_EnterRecursiveCall(" while traversing 'Set' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'Set' node")) { goto failed; } res = obj2ast_expr(state, tmp2, &val, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { @@ -8642,11 +8643,11 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'ListComp' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'ListComp' node")) { goto failed; } res = obj2ast_expr(state, tmp, &elt, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -8672,11 +8673,11 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena* comprehension_ty val; PyObject *tmp2 = PyList_GET_ITEM(tmp, i); Py_INCREF(tmp2); - if (Py_EnterRecursiveCall(" while traversing 'ListComp' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'ListComp' node")) { goto failed; } res = obj2ast_comprehension(state, tmp2, &val, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { @@ -8710,11 +8711,11 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'SetComp' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'SetComp' node")) { goto failed; } res = obj2ast_expr(state, tmp, &elt, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -8740,11 +8741,11 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena* comprehension_ty val; PyObject *tmp2 = PyList_GET_ITEM(tmp, i); Py_INCREF(tmp2); - if (Py_EnterRecursiveCall(" while traversing 'SetComp' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'SetComp' node")) { goto failed; } res = obj2ast_comprehension(state, tmp2, &val, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { @@ -8779,11 +8780,11 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'DictComp' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'DictComp' node")) { goto failed; } res = obj2ast_expr(state, tmp, &key, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -8796,11 +8797,11 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'DictComp' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'DictComp' node")) { goto failed; } res = obj2ast_expr(state, tmp, &value, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -8826,11 +8827,11 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena* comprehension_ty val; PyObject *tmp2 = PyList_GET_ITEM(tmp, i); Py_INCREF(tmp2); - if (Py_EnterRecursiveCall(" while traversing 'DictComp' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'DictComp' node")) { goto failed; } res = obj2ast_comprehension(state, tmp2, &val, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { @@ -8864,11 +8865,11 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'GeneratorExp' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'GeneratorExp' node")) { goto failed; } res = obj2ast_expr(state, tmp, &elt, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -8894,11 +8895,11 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena* comprehension_ty val; PyObject *tmp2 = PyList_GET_ITEM(tmp, i); Py_INCREF(tmp2); - if (Py_EnterRecursiveCall(" while traversing 'GeneratorExp' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'GeneratorExp' node")) { goto failed; } res = obj2ast_comprehension(state, tmp2, &val, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { @@ -8931,11 +8932,11 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'Await' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'Await' node")) { goto failed; } res = obj2ast_expr(state, tmp, &value, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -8961,11 +8962,11 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'Yield' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'Yield' node")) { goto failed; } res = obj2ast_expr(state, tmp, &value, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -8991,11 +8992,11 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'YieldFrom' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'YieldFrom' node")) { goto failed; } res = obj2ast_expr(state, tmp, &value, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -9023,11 +9024,11 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'Compare' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'Compare' node")) { goto failed; } res = obj2ast_expr(state, tmp, &left, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -9053,11 +9054,11 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena* cmpop_ty val; PyObject *tmp2 = PyList_GET_ITEM(tmp, i); Py_INCREF(tmp2); - if (Py_EnterRecursiveCall(" while traversing 'Compare' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'Compare' node")) { goto failed; } res = obj2ast_cmpop(state, tmp2, &val, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { @@ -9090,11 +9091,11 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena* expr_ty val; PyObject *tmp2 = PyList_GET_ITEM(tmp, i); Py_INCREF(tmp2); - if (Py_EnterRecursiveCall(" while traversing 'Compare' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'Compare' node")) { goto failed; } res = obj2ast_expr(state, tmp2, &val, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { @@ -9129,11 +9130,11 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'Call' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'Call' node")) { goto failed; } res = obj2ast_expr(state, tmp, &func, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -9159,11 +9160,11 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena* expr_ty val; PyObject *tmp2 = PyList_GET_ITEM(tmp, i); Py_INCREF(tmp2); - if (Py_EnterRecursiveCall(" while traversing 'Call' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'Call' node")) { goto failed; } res = obj2ast_expr(state, tmp2, &val, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { @@ -9196,11 +9197,11 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena* keyword_ty val; PyObject *tmp2 = PyList_GET_ITEM(tmp, i); Py_INCREF(tmp2); - if (Py_EnterRecursiveCall(" while traversing 'Call' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'Call' node")) { goto failed; } res = obj2ast_keyword(state, tmp2, &val, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { @@ -9235,11 +9236,11 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'FormattedValue' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'FormattedValue' node")) { goto failed; } res = obj2ast_expr(state, tmp, &value, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -9252,11 +9253,11 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'FormattedValue' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'FormattedValue' node")) { goto failed; } res = obj2ast_int(state, tmp, &conversion, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -9269,11 +9270,11 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'FormattedValue' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'FormattedValue' node")) { goto failed; } res = obj2ast_expr(state, tmp, &format_spec, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -9313,11 +9314,11 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena* expr_ty val; PyObject *tmp2 = PyList_GET_ITEM(tmp, i); Py_INCREF(tmp2); - if (Py_EnterRecursiveCall(" while traversing 'JoinedStr' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'JoinedStr' node")) { goto failed; } res = obj2ast_expr(state, tmp2, &val, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { @@ -9351,11 +9352,11 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'Constant' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'Constant' node")) { goto failed; } res = obj2ast_constant(state, tmp, &value, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -9368,11 +9369,11 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'Constant' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'Constant' node")) { goto failed; } res = obj2ast_string(state, tmp, &kind, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -9400,11 +9401,11 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'Attribute' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'Attribute' node")) { goto failed; } res = obj2ast_expr(state, tmp, &value, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -9417,11 +9418,11 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'Attribute' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'Attribute' node")) { goto failed; } res = obj2ast_identifier(state, tmp, &attr, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -9434,11 +9435,11 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'Attribute' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'Attribute' node")) { goto failed; } res = obj2ast_expr_context(state, tmp, &ctx, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -9466,11 +9467,11 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'Subscript' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'Subscript' node")) { goto failed; } res = obj2ast_expr(state, tmp, &value, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -9483,11 +9484,11 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'Subscript' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'Subscript' node")) { goto failed; } res = obj2ast_expr(state, tmp, &slice, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -9500,11 +9501,11 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'Subscript' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'Subscript' node")) { goto failed; } res = obj2ast_expr_context(state, tmp, &ctx, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -9531,11 +9532,11 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'Starred' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'Starred' node")) { goto failed; } res = obj2ast_expr(state, tmp, &value, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -9548,11 +9549,11 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'Starred' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'Starred' node")) { goto failed; } res = obj2ast_expr_context(state, tmp, &ctx, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -9579,11 +9580,11 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'Name' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'Name' node")) { goto failed; } res = obj2ast_identifier(state, tmp, &id, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -9596,11 +9597,11 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'Name' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'Name' node")) { goto failed; } res = obj2ast_expr_context(state, tmp, &ctx, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -9640,11 +9641,11 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena* expr_ty val; PyObject *tmp2 = PyList_GET_ITEM(tmp, i); Py_INCREF(tmp2); - if (Py_EnterRecursiveCall(" while traversing 'List' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'List' node")) { goto failed; } res = obj2ast_expr(state, tmp2, &val, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { @@ -9664,11 +9665,11 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'List' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'List' node")) { goto failed; } res = obj2ast_expr_context(state, tmp, &ctx, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -9708,11 +9709,11 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena* expr_ty val; PyObject *tmp2 = PyList_GET_ITEM(tmp, i); Py_INCREF(tmp2); - if (Py_EnterRecursiveCall(" while traversing 'Tuple' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'Tuple' node")) { goto failed; } res = obj2ast_expr(state, tmp2, &val, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { @@ -9732,11 +9733,11 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'Tuple' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'Tuple' node")) { goto failed; } res = obj2ast_expr_context(state, tmp, &ctx, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -9764,11 +9765,11 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'Slice' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'Slice' node")) { goto failed; } res = obj2ast_expr(state, tmp, &lower, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -9781,11 +9782,11 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'Slice' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'Slice' node")) { goto failed; } res = obj2ast_expr(state, tmp, &upper, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -9798,11 +9799,11 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'Slice' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'Slice' node")) { goto failed; } res = obj2ast_expr(state, tmp, &step, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -10148,11 +10149,11 @@ obj2ast_comprehension(struct ast_state *state, PyObject* obj, comprehension_ty* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'comprehension' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'comprehension' node")) { goto failed; } res = obj2ast_expr(state, tmp, &target, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -10165,11 +10166,11 @@ obj2ast_comprehension(struct ast_state *state, PyObject* obj, comprehension_ty* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'comprehension' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'comprehension' node")) { goto failed; } res = obj2ast_expr(state, tmp, &iter, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -10195,11 +10196,11 @@ obj2ast_comprehension(struct ast_state *state, PyObject* obj, comprehension_ty* expr_ty val; PyObject *tmp2 = PyList_GET_ITEM(tmp, i); Py_INCREF(tmp2); - if (Py_EnterRecursiveCall(" while traversing 'comprehension' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'comprehension' node")) { goto failed; } res = obj2ast_expr(state, tmp2, &val, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { @@ -10219,11 +10220,11 @@ obj2ast_comprehension(struct ast_state *state, PyObject* obj, comprehension_ty* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'comprehension' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'comprehension' node")) { goto failed; } res = obj2ast_int(state, tmp, &is_async, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -10260,11 +10261,11 @@ obj2ast_excepthandler(struct ast_state *state, PyObject* obj, excepthandler_ty* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'excepthandler' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'excepthandler' node")) { goto failed; } res = obj2ast_int(state, tmp, &lineno, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -10277,11 +10278,11 @@ obj2ast_excepthandler(struct ast_state *state, PyObject* obj, excepthandler_ty* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'excepthandler' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'excepthandler' node")) { goto failed; } res = obj2ast_int(state, tmp, &col_offset, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -10294,11 +10295,11 @@ obj2ast_excepthandler(struct ast_state *state, PyObject* obj, excepthandler_ty* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'excepthandler' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'excepthandler' node")) { goto failed; } res = obj2ast_int(state, tmp, &end_lineno, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -10311,11 +10312,11 @@ obj2ast_excepthandler(struct ast_state *state, PyObject* obj, excepthandler_ty* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'excepthandler' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'excepthandler' node")) { goto failed; } res = obj2ast_int(state, tmp, &end_col_offset, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -10338,11 +10339,11 @@ obj2ast_excepthandler(struct ast_state *state, PyObject* obj, excepthandler_ty* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'ExceptHandler' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'ExceptHandler' node")) { goto failed; } res = obj2ast_expr(state, tmp, &type, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -10355,11 +10356,11 @@ obj2ast_excepthandler(struct ast_state *state, PyObject* obj, excepthandler_ty* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'ExceptHandler' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'ExceptHandler' node")) { goto failed; } res = obj2ast_identifier(state, tmp, &name, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -10385,11 +10386,11 @@ obj2ast_excepthandler(struct ast_state *state, PyObject* obj, excepthandler_ty* stmt_ty val; PyObject *tmp2 = PyList_GET_ITEM(tmp, i); Py_INCREF(tmp2); - if (Py_EnterRecursiveCall(" while traversing 'ExceptHandler' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'ExceptHandler' node")) { goto failed; } res = obj2ast_stmt(state, tmp2, &val, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { @@ -10447,11 +10448,11 @@ obj2ast_arguments(struct ast_state *state, PyObject* obj, arguments_ty* out, arg_ty val; PyObject *tmp2 = PyList_GET_ITEM(tmp, i); Py_INCREF(tmp2); - if (Py_EnterRecursiveCall(" while traversing 'arguments' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'arguments' node")) { goto failed; } res = obj2ast_arg(state, tmp2, &val, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { @@ -10484,11 +10485,11 @@ obj2ast_arguments(struct ast_state *state, PyObject* obj, arguments_ty* out, arg_ty val; PyObject *tmp2 = PyList_GET_ITEM(tmp, i); Py_INCREF(tmp2); - if (Py_EnterRecursiveCall(" while traversing 'arguments' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'arguments' node")) { goto failed; } res = obj2ast_arg(state, tmp2, &val, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { @@ -10508,11 +10509,11 @@ obj2ast_arguments(struct ast_state *state, PyObject* obj, arguments_ty* out, } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'arguments' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'arguments' node")) { goto failed; } res = obj2ast_arg(state, tmp, &vararg, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -10538,11 +10539,11 @@ obj2ast_arguments(struct ast_state *state, PyObject* obj, arguments_ty* out, arg_ty val; PyObject *tmp2 = PyList_GET_ITEM(tmp, i); Py_INCREF(tmp2); - if (Py_EnterRecursiveCall(" while traversing 'arguments' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'arguments' node")) { goto failed; } res = obj2ast_arg(state, tmp2, &val, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { @@ -10575,11 +10576,11 @@ obj2ast_arguments(struct ast_state *state, PyObject* obj, arguments_ty* out, expr_ty val; PyObject *tmp2 = PyList_GET_ITEM(tmp, i); Py_INCREF(tmp2); - if (Py_EnterRecursiveCall(" while traversing 'arguments' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'arguments' node")) { goto failed; } res = obj2ast_expr(state, tmp2, &val, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { @@ -10599,11 +10600,11 @@ obj2ast_arguments(struct ast_state *state, PyObject* obj, arguments_ty* out, } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'arguments' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'arguments' node")) { goto failed; } res = obj2ast_arg(state, tmp, &kwarg, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -10629,11 +10630,11 @@ obj2ast_arguments(struct ast_state *state, PyObject* obj, arguments_ty* out, expr_ty val; PyObject *tmp2 = PyList_GET_ITEM(tmp, i); Py_INCREF(tmp2); - if (Py_EnterRecursiveCall(" while traversing 'arguments' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'arguments' node")) { goto failed; } res = obj2ast_expr(state, tmp2, &val, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { @@ -10673,11 +10674,11 @@ obj2ast_arg(struct ast_state *state, PyObject* obj, arg_ty* out, PyArena* arena) } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'arg' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'arg' node")) { goto failed; } res = obj2ast_identifier(state, tmp, &arg, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -10690,11 +10691,11 @@ obj2ast_arg(struct ast_state *state, PyObject* obj, arg_ty* out, PyArena* arena) } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'arg' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'arg' node")) { goto failed; } res = obj2ast_expr(state, tmp, &annotation, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -10707,11 +10708,11 @@ obj2ast_arg(struct ast_state *state, PyObject* obj, arg_ty* out, PyArena* arena) } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'arg' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'arg' node")) { goto failed; } res = obj2ast_string(state, tmp, &type_comment, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -10724,11 +10725,11 @@ obj2ast_arg(struct ast_state *state, PyObject* obj, arg_ty* out, PyArena* arena) } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'arg' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'arg' node")) { goto failed; } res = obj2ast_int(state, tmp, &lineno, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -10741,11 +10742,11 @@ obj2ast_arg(struct ast_state *state, PyObject* obj, arg_ty* out, PyArena* arena) } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'arg' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'arg' node")) { goto failed; } res = obj2ast_int(state, tmp, &col_offset, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -10758,11 +10759,11 @@ obj2ast_arg(struct ast_state *state, PyObject* obj, arg_ty* out, PyArena* arena) } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'arg' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'arg' node")) { goto failed; } res = obj2ast_int(state, tmp, &end_lineno, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -10775,11 +10776,11 @@ obj2ast_arg(struct ast_state *state, PyObject* obj, arg_ty* out, PyArena* arena) } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'arg' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'arg' node")) { goto failed; } res = obj2ast_int(state, tmp, &end_col_offset, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -10812,11 +10813,11 @@ obj2ast_keyword(struct ast_state *state, PyObject* obj, keyword_ty* out, } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'keyword' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'keyword' node")) { goto failed; } res = obj2ast_identifier(state, tmp, &arg, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -10829,11 +10830,11 @@ obj2ast_keyword(struct ast_state *state, PyObject* obj, keyword_ty* out, } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'keyword' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'keyword' node")) { goto failed; } res = obj2ast_expr(state, tmp, &value, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -10846,11 +10847,11 @@ obj2ast_keyword(struct ast_state *state, PyObject* obj, keyword_ty* out, } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'keyword' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'keyword' node")) { goto failed; } res = obj2ast_int(state, tmp, &lineno, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -10863,11 +10864,11 @@ obj2ast_keyword(struct ast_state *state, PyObject* obj, keyword_ty* out, } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'keyword' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'keyword' node")) { goto failed; } res = obj2ast_int(state, tmp, &col_offset, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -10880,11 +10881,11 @@ obj2ast_keyword(struct ast_state *state, PyObject* obj, keyword_ty* out, } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'keyword' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'keyword' node")) { goto failed; } res = obj2ast_int(state, tmp, &end_lineno, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -10897,11 +10898,11 @@ obj2ast_keyword(struct ast_state *state, PyObject* obj, keyword_ty* out, } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'keyword' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'keyword' node")) { goto failed; } res = obj2ast_int(state, tmp, &end_col_offset, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -10934,11 +10935,11 @@ obj2ast_alias(struct ast_state *state, PyObject* obj, alias_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'alias' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'alias' node")) { goto failed; } res = obj2ast_identifier(state, tmp, &name, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -10951,11 +10952,11 @@ obj2ast_alias(struct ast_state *state, PyObject* obj, alias_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'alias' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'alias' node")) { goto failed; } res = obj2ast_identifier(state, tmp, &asname, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -10968,11 +10969,11 @@ obj2ast_alias(struct ast_state *state, PyObject* obj, alias_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'alias' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'alias' node")) { goto failed; } res = obj2ast_int(state, tmp, &lineno, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -10985,11 +10986,11 @@ obj2ast_alias(struct ast_state *state, PyObject* obj, alias_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'alias' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'alias' node")) { goto failed; } res = obj2ast_int(state, tmp, &col_offset, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -11002,11 +11003,11 @@ obj2ast_alias(struct ast_state *state, PyObject* obj, alias_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'alias' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'alias' node")) { goto failed; } res = obj2ast_int(state, tmp, &end_lineno, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -11019,11 +11020,11 @@ obj2ast_alias(struct ast_state *state, PyObject* obj, alias_ty* out, PyArena* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'alias' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'alias' node")) { goto failed; } res = obj2ast_int(state, tmp, &end_col_offset, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -11052,11 +11053,11 @@ obj2ast_withitem(struct ast_state *state, PyObject* obj, withitem_ty* out, } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'withitem' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'withitem' node")) { goto failed; } res = obj2ast_expr(state, tmp, &context_expr, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -11069,11 +11070,11 @@ obj2ast_withitem(struct ast_state *state, PyObject* obj, withitem_ty* out, } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'withitem' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'withitem' node")) { goto failed; } res = obj2ast_expr(state, tmp, &optional_vars, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -11102,11 +11103,11 @@ obj2ast_match_case(struct ast_state *state, PyObject* obj, match_case_ty* out, } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'match_case' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'match_case' node")) { goto failed; } res = obj2ast_pattern(state, tmp, &pattern, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -11119,11 +11120,11 @@ obj2ast_match_case(struct ast_state *state, PyObject* obj, match_case_ty* out, } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'match_case' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'match_case' node")) { goto failed; } res = obj2ast_expr(state, tmp, &guard, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -11149,11 +11150,11 @@ obj2ast_match_case(struct ast_state *state, PyObject* obj, match_case_ty* out, stmt_ty val; PyObject *tmp2 = PyList_GET_ITEM(tmp, i); Py_INCREF(tmp2); - if (Py_EnterRecursiveCall(" while traversing 'match_case' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'match_case' node")) { goto failed; } res = obj2ast_stmt(state, tmp2, &val, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { @@ -11197,11 +11198,11 @@ obj2ast_pattern(struct ast_state *state, PyObject* obj, pattern_ty* out, } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'pattern' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'pattern' node")) { goto failed; } res = obj2ast_int(state, tmp, &lineno, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -11214,11 +11215,11 @@ obj2ast_pattern(struct ast_state *state, PyObject* obj, pattern_ty* out, } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'pattern' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'pattern' node")) { goto failed; } res = obj2ast_int(state, tmp, &col_offset, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -11231,11 +11232,11 @@ obj2ast_pattern(struct ast_state *state, PyObject* obj, pattern_ty* out, } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'pattern' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'pattern' node")) { goto failed; } res = obj2ast_int(state, tmp, &end_lineno, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -11248,11 +11249,11 @@ obj2ast_pattern(struct ast_state *state, PyObject* obj, pattern_ty* out, } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'pattern' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'pattern' node")) { goto failed; } res = obj2ast_int(state, tmp, &end_col_offset, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -11273,11 +11274,11 @@ obj2ast_pattern(struct ast_state *state, PyObject* obj, pattern_ty* out, } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'MatchValue' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'MatchValue' node")) { goto failed; } res = obj2ast_expr(state, tmp, &value, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -11303,11 +11304,11 @@ obj2ast_pattern(struct ast_state *state, PyObject* obj, pattern_ty* out, } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'MatchSingleton' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'MatchSingleton' node")) { goto failed; } res = obj2ast_constant(state, tmp, &value, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -11346,11 +11347,11 @@ obj2ast_pattern(struct ast_state *state, PyObject* obj, pattern_ty* out, pattern_ty val; PyObject *tmp2 = PyList_GET_ITEM(tmp, i); Py_INCREF(tmp2); - if (Py_EnterRecursiveCall(" while traversing 'MatchSequence' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'MatchSequence' node")) { goto failed; } res = obj2ast_pattern(state, tmp2, &val, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { @@ -11398,11 +11399,11 @@ obj2ast_pattern(struct ast_state *state, PyObject* obj, pattern_ty* out, expr_ty val; PyObject *tmp2 = PyList_GET_ITEM(tmp, i); Py_INCREF(tmp2); - if (Py_EnterRecursiveCall(" while traversing 'MatchMapping' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'MatchMapping' node")) { goto failed; } res = obj2ast_expr(state, tmp2, &val, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { @@ -11435,11 +11436,11 @@ obj2ast_pattern(struct ast_state *state, PyObject* obj, pattern_ty* out, pattern_ty val; PyObject *tmp2 = PyList_GET_ITEM(tmp, i); Py_INCREF(tmp2); - if (Py_EnterRecursiveCall(" while traversing 'MatchMapping' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'MatchMapping' node")) { goto failed; } res = obj2ast_pattern(state, tmp2, &val, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { @@ -11459,11 +11460,11 @@ obj2ast_pattern(struct ast_state *state, PyObject* obj, pattern_ty* out, } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'MatchMapping' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'MatchMapping' node")) { goto failed; } res = obj2ast_identifier(state, tmp, &rest, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -11492,11 +11493,11 @@ obj2ast_pattern(struct ast_state *state, PyObject* obj, pattern_ty* out, } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'MatchClass' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'MatchClass' node")) { goto failed; } res = obj2ast_expr(state, tmp, &cls, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -11522,11 +11523,11 @@ obj2ast_pattern(struct ast_state *state, PyObject* obj, pattern_ty* out, pattern_ty val; PyObject *tmp2 = PyList_GET_ITEM(tmp, i); Py_INCREF(tmp2); - if (Py_EnterRecursiveCall(" while traversing 'MatchClass' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'MatchClass' node")) { goto failed; } res = obj2ast_pattern(state, tmp2, &val, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { @@ -11559,11 +11560,11 @@ obj2ast_pattern(struct ast_state *state, PyObject* obj, pattern_ty* out, identifier val; PyObject *tmp2 = PyList_GET_ITEM(tmp, i); Py_INCREF(tmp2); - if (Py_EnterRecursiveCall(" while traversing 'MatchClass' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'MatchClass' node")) { goto failed; } res = obj2ast_identifier(state, tmp2, &val, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { @@ -11596,11 +11597,11 @@ obj2ast_pattern(struct ast_state *state, PyObject* obj, pattern_ty* out, pattern_ty val; PyObject *tmp2 = PyList_GET_ITEM(tmp, i); Py_INCREF(tmp2); - if (Py_EnterRecursiveCall(" while traversing 'MatchClass' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'MatchClass' node")) { goto failed; } res = obj2ast_pattern(state, tmp2, &val, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { @@ -11634,11 +11635,11 @@ obj2ast_pattern(struct ast_state *state, PyObject* obj, pattern_ty* out, } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'MatchStar' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'MatchStar' node")) { goto failed; } res = obj2ast_identifier(state, tmp, &name, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -11665,11 +11666,11 @@ obj2ast_pattern(struct ast_state *state, PyObject* obj, pattern_ty* out, } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'MatchAs' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'MatchAs' node")) { goto failed; } res = obj2ast_pattern(state, tmp, &pattern, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -11682,11 +11683,11 @@ obj2ast_pattern(struct ast_state *state, PyObject* obj, pattern_ty* out, } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'MatchAs' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'MatchAs' node")) { goto failed; } res = obj2ast_identifier(state, tmp, &name, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -11725,11 +11726,11 @@ obj2ast_pattern(struct ast_state *state, PyObject* obj, pattern_ty* out, pattern_ty val; PyObject *tmp2 = PyList_GET_ITEM(tmp, i); Py_INCREF(tmp2); - if (Py_EnterRecursiveCall(" while traversing 'MatchOr' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'MatchOr' node")) { goto failed; } res = obj2ast_pattern(state, tmp2, &val, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { @@ -11783,11 +11784,11 @@ obj2ast_type_ignore(struct ast_state *state, PyObject* obj, type_ignore_ty* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'TypeIgnore' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'TypeIgnore' node")) { goto failed; } res = obj2ast_int(state, tmp, &lineno, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -11800,11 +11801,11 @@ obj2ast_type_ignore(struct ast_state *state, PyObject* obj, type_ignore_ty* } else { int res; - if (Py_EnterRecursiveCall(" while traversing 'TypeIgnore' node")) { + if (_Py_EnterRecursiveCall(" while traversing 'TypeIgnore' node")) { goto failed; } res = obj2ast_string(state, tmp, &tag, arena); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res != 0) goto failed; Py_CLEAR(tmp); } diff --git a/Python/ceval.c b/Python/ceval.c index f3329b5d9d454..6f46c7f043d77 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -880,7 +880,7 @@ Py_SetRecursionLimit(int new_limit) } } -/* The function _Py_EnterRecursiveCall() only calls _Py_CheckRecursiveCall() +/* The function _Py_EnterRecursiveCallTstate() only calls _Py_CheckRecursiveCall() if the recursion_depth reaches recursion_limit. */ int _Py_CheckRecursiveCall(PyThreadState *tstate, const char *where) @@ -1736,7 +1736,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int /* support for generator.throw() */ if (throwflag) { - if (_Py_EnterRecursiveCall(tstate, "")) { + if (_Py_EnterRecursiveCallTstate(tstate, "")) { tstate->recursion_remaining--; goto exit_unwind; } @@ -1776,7 +1776,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int start_frame: - if (_Py_EnterRecursiveCall(tstate, "")) { + if (_Py_EnterRecursiveCallTstate(tstate, "")) { tstate->recursion_remaining--; goto exit_unwind; } @@ -2492,7 +2492,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int _PyFrame_SetStackPointer(frame, stack_pointer); TRACE_FUNCTION_EXIT(); DTRACE_FUNCTION_EXIT(); - _Py_LeaveRecursiveCall(tstate); + _Py_LeaveRecursiveCallTstate(tstate); if (!frame->is_entry) { frame = cframe.current_frame = pop_frame(tstate, frame); _PyFrame_StackPush(frame, retval); @@ -2704,7 +2704,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int _PyFrame_SetStackPointer(frame, stack_pointer); TRACE_FUNCTION_EXIT(); DTRACE_FUNCTION_EXIT(); - _Py_LeaveRecursiveCall(tstate); + _Py_LeaveRecursiveCallTstate(tstate); /* Restore previous cframe and return. */ tstate->cframe = cframe.previous; tstate->cframe->use_tracing = cframe.use_tracing; @@ -5066,12 +5066,12 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int PyCFunction cfunc = PyCFunction_GET_FUNCTION(callable); // This is slower but CPython promises to check all non-vectorcall // function calls. - if (_Py_EnterRecursiveCall(tstate, " while calling a Python object")) { + if (_Py_EnterRecursiveCallTstate(tstate, " while calling a Python object")) { goto error; } PyObject *arg = TOP(); PyObject *res = cfunc(PyCFunction_GET_SELF(callable), arg); - _Py_LeaveRecursiveCall(tstate); + _Py_LeaveRecursiveCallTstate(tstate); assert((res != NULL) ^ (_PyErr_Occurred(tstate) != NULL)); Py_DECREF(arg); @@ -5268,11 +5268,11 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int PyCFunction cfunc = meth->ml_meth; // This is slower but CPython promises to check all non-vectorcall // function calls. - if (_Py_EnterRecursiveCall(tstate, " while calling a Python object")) { + if (_Py_EnterRecursiveCallTstate(tstate, " while calling a Python object")) { goto error; } PyObject *res = cfunc(self, arg); - _Py_LeaveRecursiveCall(tstate); + _Py_LeaveRecursiveCallTstate(tstate); assert((res != NULL) ^ (_PyErr_Occurred(tstate) != NULL)); Py_DECREF(self); Py_DECREF(arg); @@ -5340,11 +5340,11 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int PyCFunction cfunc = meth->ml_meth; // This is slower but CPython promises to check all non-vectorcall // function calls. - if (_Py_EnterRecursiveCall(tstate, " while calling a Python object")) { + if (_Py_EnterRecursiveCallTstate(tstate, " while calling a Python object")) { goto error; } PyObject *res = cfunc(self, NULL); - _Py_LeaveRecursiveCall(tstate); + _Py_LeaveRecursiveCallTstate(tstate); assert((res != NULL) ^ (_PyErr_Occurred(tstate) != NULL)); Py_DECREF(self); STACK_SHRINK(oparg + 1); @@ -5484,7 +5484,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int assert(frame->frame_obj == NULL); gen->gi_frame_state = FRAME_CREATED; gen_frame->owner = FRAME_OWNED_BY_GENERATOR; - _Py_LeaveRecursiveCall(tstate); + _Py_LeaveRecursiveCallTstate(tstate); if (!frame->is_entry) { _PyInterpreterFrame *prev = frame->previous; _PyThreadState_PopFrame(tstate, frame); @@ -5850,7 +5850,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int exit_unwind: assert(_PyErr_Occurred(tstate)); - _Py_LeaveRecursiveCall(tstate); + _Py_LeaveRecursiveCallTstate(tstate); if (frame->is_entry) { /* Restore previous cframe and exit */ tstate->cframe = cframe.previous; @@ -7955,12 +7955,12 @@ maybe_dtrace_line(_PyInterpreterFrame *frame, int Py_EnterRecursiveCall(const char *where) { - return _Py_EnterRecursiveCall_inline(where); + return _Py_EnterRecursiveCall(where); } #undef Py_LeaveRecursiveCall void Py_LeaveRecursiveCall(void) { - _Py_LeaveRecursiveCall_inline(); + _Py_LeaveRecursiveCall(); } diff --git a/Python/pythonrun.c b/Python/pythonrun.c index 769c34ea161e0..f12b9f6e9539a 100644 --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -13,6 +13,7 @@ #include "Python.h" #include "pycore_ast.h" // PyAST_mod2obj +#include "pycore_ceval.h" // _Py_EnterRecursiveCall #include "pycore_compile.h" // _PyAST_Compile() #include "pycore_interp.h" // PyInterpreterState.importlib #include "pycore_object.h" // _PyDebug_PrintTotalRefs() @@ -1268,13 +1269,13 @@ print_chained(struct exception_print_context* ctx, PyObject *value, { PyObject *f = ctx->file; - if (Py_EnterRecursiveCall(" in print_chained") < 0) { + if (_Py_EnterRecursiveCall(" in print_chained") < 0) { return -1; } bool need_close = ctx->need_close; int res = print_exception_recursive(ctx, value); ctx->need_close = need_close; - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res < 0) { return -1; } @@ -1445,11 +1446,11 @@ print_exception_group(struct exception_print_context *ctx, PyObject *value) PyObject *exc = PyTuple_GET_ITEM(excs, i); if (!truncated) { - if (Py_EnterRecursiveCall(" in print_exception_group") != 0) { + if (_Py_EnterRecursiveCall(" in print_exception_group") != 0) { return -1; } int res = print_exception_recursive(ctx, exc); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(); if (res < 0) { return -1; } From webhook-mailer at python.org Wed May 4 09:16:06 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Wed, 04 May 2022 13:16:06 -0000 Subject: [Python-checkins] gh-89022: Improve sqlite3 exceptions related to binding params and API misuse (#91572) Message-ID: https://github.com/python/cpython/commit/090819ec5faea2d0c2cdf6bcfdbbc9df144a8aad commit: 090819ec5faea2d0c2cdf6bcfdbbc9df144a8aad branch: main author: Erlend Egeberg Aasland committer: JelleZijlstra date: 2022-05-04T07:16:01-06:00 summary: gh-89022: Improve sqlite3 exceptions related to binding params and API misuse (#91572) * Map SQLITE_MISUSE to sqlite3.InterfaceError SQLITE_MISUSE implies misuse of the SQLite C API, which, if it happens, is _not_ a user error; it is an sqlite3 extension module error. * Raise better errors when binding parameters fail. Instead of always raising InterfaceError, guessing what went wrong, raise accurate exceptions with more accurate error messages. files: A Misc/NEWS.d/next/Library/2022-04-15-17-06-09.gh-issue-89022.DgdQCa.rst M Lib/test/test_sqlite3/test_dbapi.py M Lib/test/test_sqlite3/test_types.py M Modules/_sqlite/cursor.c M Modules/_sqlite/util.c diff --git a/Lib/test/test_sqlite3/test_dbapi.py b/Lib/test/test_sqlite3/test_dbapi.py index 7e675a91b5d1f..e132fcdfb0e65 100644 --- a/Lib/test/test_sqlite3/test_dbapi.py +++ b/Lib/test/test_sqlite3/test_dbapi.py @@ -743,7 +743,7 @@ def test_execute_arg_string_with_zero_byte(self): self.assertEqual(row[0], "Hu\x00go") def test_execute_non_iterable(self): - with self.assertRaises(ValueError) as cm: + with self.assertRaises(sqlite.ProgrammingError) as cm: self.cu.execute("insert into test(id) values (?)", 42) self.assertEqual(str(cm.exception), 'parameters are of unsupported type') diff --git a/Lib/test/test_sqlite3/test_types.py b/Lib/test/test_sqlite3/test_types.py index 0cfb72c5f0999..177cd10235039 100644 --- a/Lib/test/test_sqlite3/test_types.py +++ b/Lib/test/test_sqlite3/test_types.py @@ -255,9 +255,9 @@ def test_foo(self): def test_error_in_conform(self): val = DeclTypesTests.BadConform(TypeError) - with self.assertRaises(sqlite.InterfaceError): + with self.assertRaises(sqlite.ProgrammingError): self.cur.execute("insert into test(bad) values (?)", (val,)) - with self.assertRaises(sqlite.InterfaceError): + with self.assertRaises(sqlite.ProgrammingError): self.cur.execute("insert into test(bad) values (:val)", {"val": val}) val = DeclTypesTests.BadConform(KeyboardInterrupt) @@ -269,13 +269,13 @@ def test_error_in_conform(self): def test_unsupported_seq(self): class Bar: pass val = Bar() - with self.assertRaises(sqlite.InterfaceError): + with self.assertRaises(sqlite.ProgrammingError): self.cur.execute("insert into test(f) values (?)", (val,)) def test_unsupported_dict(self): class Bar: pass val = Bar() - with self.assertRaises(sqlite.InterfaceError): + with self.assertRaises(sqlite.ProgrammingError): self.cur.execute("insert into test(f) values (:val)", {"val": val}) def test_blob(self): diff --git a/Misc/NEWS.d/next/Library/2022-04-15-17-06-09.gh-issue-89022.DgdQCa.rst b/Misc/NEWS.d/next/Library/2022-04-15-17-06-09.gh-issue-89022.DgdQCa.rst new file mode 100644 index 0000000000000..4392f29b376f4 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-04-15-17-06-09.gh-issue-89022.DgdQCa.rst @@ -0,0 +1,4 @@ +In :mod:`sqlite3`, ``SQLITE_MISUSE`` result codes are now mapped to +:exc:`~sqlite3.InterfaceError` instead of :exc:`~sqlite3.ProgrammingError`. +Also, more accurate exceptions are raised when binding parameters fail. +Patch by Erlend E. Aasland. diff --git a/Modules/_sqlite/cursor.c b/Modules/_sqlite/cursor.c index f72bf30024065..c58def5f0362f 100644 --- a/Modules/_sqlite/cursor.c +++ b/Modules/_sqlite/cursor.c @@ -527,7 +527,8 @@ stmt_step(sqlite3_stmt *statement) } static int -bind_param(pysqlite_Statement *self, int pos, PyObject *parameter) +bind_param(pysqlite_state *state, pysqlite_Statement *self, int pos, + PyObject *parameter) { int rc = SQLITE_OK; const char *string; @@ -603,6 +604,9 @@ bind_param(pysqlite_Statement *self, int pos, PyObject *parameter) break; } case TYPE_UNKNOWN: + PyErr_Format(state->ProgrammingError, + "Error binding parameter %d: type '%s' is not supported", + pos, Py_TYPE(parameter)->tp_name); rc = -1; } @@ -688,15 +692,15 @@ bind_parameters(pysqlite_state *state, pysqlite_Statement *self, } } - rc = bind_param(self, i + 1, adapted); + rc = bind_param(state, self, i + 1, adapted); Py_DECREF(adapted); if (rc != SQLITE_OK) { - if (!PyErr_Occurred()) { - PyErr_Format(state->InterfaceError, - "Error binding parameter %d - " - "probably unsupported type.", i); - } + PyObject *exc, *val, *tb; + PyErr_Fetch(&exc, &val, &tb); + sqlite3 *db = sqlite3_db_handle(self->st); + _pysqlite_seterror(state, db); + _PyErr_ChainExceptions(exc, val, tb); return; } } @@ -748,20 +752,21 @@ bind_parameters(pysqlite_state *state, pysqlite_Statement *self, } } - rc = bind_param(self, i, adapted); + rc = bind_param(state, self, i, adapted); Py_DECREF(adapted); if (rc != SQLITE_OK) { - if (!PyErr_Occurred()) { - PyErr_Format(state->InterfaceError, - "Error binding parameter :%s - " - "probably unsupported type.", binding_name); - } + PyObject *exc, *val, *tb; + PyErr_Fetch(&exc, &val, &tb); + sqlite3 *db = sqlite3_db_handle(self->st); + _pysqlite_seterror(state, db); + _PyErr_ChainExceptions(exc, val, tb); return; } } } else { - PyErr_SetString(PyExc_ValueError, "parameters are of unsupported type"); + PyErr_SetString(state->ProgrammingError, + "parameters are of unsupported type"); } } diff --git a/Modules/_sqlite/util.c b/Modules/_sqlite/util.c index 37b2dd6cb29f4..2b3bbfefa3cf5 100644 --- a/Modules/_sqlite/util.c +++ b/Modules/_sqlite/util.c @@ -59,7 +59,6 @@ get_exception_class(pysqlite_state *state, int errorcode) case SQLITE_MISMATCH: return state->IntegrityError; case SQLITE_MISUSE: - return state->ProgrammingError; case SQLITE_RANGE: return state->InterfaceError; default: From webhook-mailer at python.org Wed May 4 09:38:33 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Wed, 04 May 2022 13:38:33 -0000 Subject: [Python-checkins] gh-92210: Move socket.__init__ to argument clinic (#92237) Message-ID: https://github.com/python/cpython/commit/000a072318f8709dfe5c2f8c63dfa4a57f075674 commit: 000a072318f8709dfe5c2f8c63dfa4a57f075674 branch: main author: Joshua Herman <30265+zitterbewegung at users.noreply.github.com> committer: JelleZijlstra date: 2022-05-04T07:38:01-06:00 summary: gh-92210: Move socket.__init__ to argument clinic (#92237) Co-authored-by: ?ukasz Langa Co-authored-by: Erlend Egeberg Aasland Co-authored-by: Erlend Egeberg Aasland Co-authored-by: Jelle Zijlstra files: A Misc/NEWS.d/next/Library/2022-05-03-17-33-46.gh-issue-92210.csDOQM.rst A Modules/clinic/socketmodule.c.h M Modules/socketmodule.c diff --git a/Misc/NEWS.d/next/Library/2022-05-03-17-33-46.gh-issue-92210.csDOQM.rst b/Misc/NEWS.d/next/Library/2022-05-03-17-33-46.gh-issue-92210.csDOQM.rst new file mode 100644 index 0000000000000..13f8197e69ea8 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-05-03-17-33-46.gh-issue-92210.csDOQM.rst @@ -0,0 +1 @@ +Port ``socket.__init__`` to Argument Clinic. Patch by Cinder. diff --git a/Modules/clinic/socketmodule.c.h b/Modules/clinic/socketmodule.c.h new file mode 100644 index 0000000000000..dab2b6dc45cef --- /dev/null +++ b/Modules/clinic/socketmodule.c.h @@ -0,0 +1,65 @@ +/*[clinic input] +preserve +[clinic start generated code]*/ + +static int +sock_initobj_impl(PySocketSockObject *self, int family, int type, int proto, + PyObject *fdobj); + +static int +sock_initobj(PyObject *self, PyObject *args, PyObject *kwargs) +{ + int return_value = -1; + static const char * const _keywords[] = {"family", "type", "proto", "fileno", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "socket", 0}; + PyObject *argsbuf[4]; + PyObject * const *fastargs; + Py_ssize_t nargs = PyTuple_GET_SIZE(args); + Py_ssize_t noptargs = nargs + (kwargs ? PyDict_GET_SIZE(kwargs) : 0) - 0; + int family = -1; + int type = -1; + int proto = -1; + PyObject *fdobj = NULL; + + fastargs = _PyArg_UnpackKeywords(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser, 0, 4, 0, argsbuf); + if (!fastargs) { + goto exit; + } + if (!noptargs) { + goto skip_optional_pos; + } + if (fastargs[0]) { + family = _PyLong_AsInt(fastargs[0]); + if (family == -1 && PyErr_Occurred()) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (fastargs[1]) { + type = _PyLong_AsInt(fastargs[1]); + if (type == -1 && PyErr_Occurred()) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (fastargs[2]) { + proto = _PyLong_AsInt(fastargs[2]); + if (proto == -1 && PyErr_Occurred()) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_pos; + } + } + fdobj = fastargs[3]; +skip_optional_pos: + return_value = sock_initobj_impl((PySocketSockObject *)self, family, type, proto, fdobj); + +exit: + return return_value; +} +/*[clinic end generated code: output=2433d6ac51bc962a input=a9049054013a1b77]*/ diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index bedb8bb423cee..9aefa443c7c69 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -328,6 +328,12 @@ static FlagRuntimeInfo win_runtime_flags[] = { {14393, "TCP_FASTOPEN"} }; +/*[clinic input] +module _socket +class _socket.socket "PySocketSockObject *" "&sock_type" +[clinic start generated code]*/ +/*[clinic end generated code: output=da39a3ee5e6b4b0d input=7a8313d9b7f51988]*/ + static int remove_unusable_flags(PyObject *m) { @@ -511,6 +517,8 @@ remove_unusable_flags(PyObject *m) #define INADDR_NONE (-1) #endif +#include "clinic/socketmodule.c.h" + /* XXX There's a problem here: *static* functions are not supposed to have a Py prefix (or use CapitalizedWords). Later... */ @@ -1708,7 +1716,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, } addr->sun_family = s->sock_family; memcpy(addr->sun_path, path.buf, path.len); - + retval = 1; unix_out: PyBuffer_Release(&path); @@ -5103,14 +5111,23 @@ static int sock_cloexec_works = -1; #endif /*ARGSUSED*/ + +/*[clinic input] +_socket.socket.__init__ as sock_initobj + family: int = -1 + type: int = -1 + proto: int = -1 + fileno as fdobj: object = NULL +[clinic start generated code]*/ + static int -sock_initobj(PyObject *self, PyObject *args, PyObject *kwds) +sock_initobj_impl(PySocketSockObject *self, int family, int type, int proto, + PyObject *fdobj) +/*[clinic end generated code: output=d114d026b9a9a810 input=04cfc32953f5cc25]*/ { - PySocketSockObject *s = (PySocketSockObject *)self; - PyObject *fdobj = NULL; + SOCKET_T fd = INVALID_SOCKET; - int family = -1, type = -1, proto = -1; - static char *keywords[] = {"family", "type", "proto", "fileno", 0}; + #ifndef MS_WINDOWS #ifdef SOCK_CLOEXEC int *atomic_flag_works = &sock_cloexec_works; @@ -5119,18 +5136,13 @@ sock_initobj(PyObject *self, PyObject *args, PyObject *kwds) #endif #endif - if (!PyArg_ParseTupleAndKeywords(args, kwds, - "|iiiO:socket", keywords, - &family, &type, &proto, &fdobj)) - return -1; - #ifdef MS_WINDOWS /* In this case, we don't use the family, type and proto args */ if (fdobj == NULL || fdobj == Py_None) #endif { if (PySys_Audit("socket.__new__", "Oiii", - s, family, type, proto) < 0) { + self, family, type, proto) < 0) { return -1; } } @@ -5148,7 +5160,7 @@ sock_initobj(PyObject *self, PyObject *args, PyObject *kwds) } memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info)); - if (PySys_Audit("socket.__new__", "Oiii", s, + if (PySys_Audit("socket.__new__", "Oiii", self, info.iAddressFamily, info.iSocketType, info.iProtocol) < 0) { return -1; @@ -5318,7 +5330,7 @@ sock_initobj(PyObject *self, PyObject *args, PyObject *kwds) } #endif } - if (init_sockobject(s, fd, family, type, proto) == -1) { + if (init_sockobject(self, fd, family, type, proto) == -1) { SOCKETCLOSE(fd); return -1; } From webhook-mailer at python.org Wed May 4 10:07:55 2022 From: webhook-mailer at python.org (serhiy-storchaka) Date: Wed, 04 May 2022 14:07:55 -0000 Subject: [Python-checkins] gh-92107: Add tests that subscription works on arbitrary named tuple types (GH-92304) Message-ID: https://github.com/python/cpython/commit/9d20e1af409c22537f096206edd330f16ab8f1f3 commit: 9d20e1af409c22537f096206edd330f16ab8f1f3 branch: main author: Serhiy Storchaka committer: serhiy-storchaka date: 2022-05-04T17:06:50+03:00 summary: gh-92107: Add tests that subscription works on arbitrary named tuple types (GH-92304) files: M Lib/test/test_collections.py M Lib/test/test_typing.py diff --git a/Lib/test/test_collections.py b/Lib/test/test_collections.py index 3a16045c5aa1a..fa1d0e014dee9 100644 --- a/Lib/test/test_collections.py +++ b/Lib/test/test_collections.py @@ -698,6 +698,18 @@ def test_match_args(self): Point = namedtuple('Point', 'x y') self.assertEqual(Point.__match_args__, ('x', 'y')) + def test_non_generic_subscript(self): + # For backward compatibility, subscription works + # on arbitrary named tuple types. + Group = collections.namedtuple('Group', 'key group') + A = Group[int, list[int]] + self.assertEqual(A.__origin__, Group) + self.assertEqual(A.__parameters__, ()) + self.assertEqual(A.__args__, (int, list[int])) + a = A(1, [2]) + self.assertIs(type(a), Group) + self.assertEqual(a, (1, [2])) + ################################################################################ ### Abstract Base Classes diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index 55e18c08537df..8399465f6052d 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -5736,6 +5736,20 @@ class Y(Generic[T], NamedTuple): with self.assertRaises(TypeError): G[int, str] + def test_non_generic_subscript(self): + # For backward compatibility, subscription works + # on arbitrary NamedTuple types. + class Group(NamedTuple): + key: T + group: list[T] + A = Group[int] + self.assertEqual(A.__origin__, Group) + self.assertEqual(A.__parameters__, ()) + self.assertEqual(A.__args__, (int,)) + a = A(1, [2]) + self.assertIs(type(a), Group) + self.assertEqual(a, (1, [2])) + def test_namedtuple_keyword_usage(self): LocalEmployee = NamedTuple("LocalEmployee", name=str, age=int) nick = LocalEmployee('Nick', 25) From webhook-mailer at python.org Wed May 4 11:31:33 2022 From: webhook-mailer at python.org (markshannon) Date: Wed, 04 May 2022 15:31:33 -0000 Subject: [Python-checkins] GH-92239: Make sure that PEP 523 is supported, even when specializing first. (GH-92245) Message-ID: https://github.com/python/cpython/commit/f8a2fab212c4e9ea92a5b667560449904c4cf7af commit: f8a2fab212c4e9ea92a5b667560449904c4cf7af branch: main author: Mark Shannon committer: markshannon date: 2022-05-04T09:31:21-06:00 summary: GH-92239: Make sure that PEP 523 is supported, even when specializing first. (GH-92245) files: A Misc/NEWS.d/next/Core and Builtins/2022-05-03-14-55-40.gh-issue-92245.G17-5i.rst M Lib/test/test_capi.py M Modules/_testinternalcapi.c M Python/ceval.c M Python/specialize.c diff --git a/Lib/test/test_capi.py b/Lib/test/test_capi.py index 1aed9b71c51aa..ab4caefd35fbf 100644 --- a/Lib/test/test_capi.py +++ b/Lib/test/test_capi.py @@ -1142,5 +1142,33 @@ def test_frame_get_generator(self): self.assertIs(gen, _testcapi.frame_getgenerator(frame)) +SUFFICIENT_TO_DEOPT_AND_SPECIALIZE = 100 + +class Test_Pep523API(unittest.TestCase): + + def do_test(self, func): + calls = [] + start = SUFFICIENT_TO_DEOPT_AND_SPECIALIZE + count = start + SUFFICIENT_TO_DEOPT_AND_SPECIALIZE + for i in range(count): + if i == start: + _testinternalcapi.set_eval_frame_record(calls) + func() + _testinternalcapi.set_eval_frame_default() + self.assertEqual(len(calls), SUFFICIENT_TO_DEOPT_AND_SPECIALIZE) + for name in calls: + self.assertEqual(name, func.__name__) + + def test_pep523_with_specialization_simple(self): + def func1(): + pass + self.do_test(func1) + + def test_pep523_with_specialization_with_default(self): + def func2(x=None): + pass + self.do_test(func2) + + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-03-14-55-40.gh-issue-92245.G17-5i.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-03-14-55-40.gh-issue-92245.G17-5i.rst new file mode 100644 index 0000000000000..7b1c5f529a228 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-05-03-14-55-40.gh-issue-92245.G17-5i.rst @@ -0,0 +1,2 @@ +Make sure that PEP 523 is respected in all cases. In 3.11a7, specialization +may have prevented Python-to-Python calls respecting PEP 523. diff --git a/Modules/_testinternalcapi.c b/Modules/_testinternalcapi.c index 5d5b3e6b2fd62..914b20b36f146 100644 --- a/Modules/_testinternalcapi.c +++ b/Modules/_testinternalcapi.c @@ -15,6 +15,7 @@ #include "pycore_atomic_funcs.h" // _Py_atomic_int_get() #include "pycore_bitutils.h" // _Py_bswap32() #include "pycore_fileutils.h" // _Py_normpath +#include "pycore_frame.h" // _PyInterpreterFrame #include "pycore_gc.h" // PyGC_Head #include "pycore_hashtable.h" // _Py_hashtable_new() #include "pycore_initconfig.h" // _Py_GetConfigsAsDict() @@ -22,7 +23,7 @@ #include "pycore_interp.h" // _PyInterpreterState_GetConfigCopy() #include "pycore_pyerrors.h" // _Py_UTF8_Edit_Cost() #include "pycore_pystate.h" // _PyThreadState_GET() -#include "osdefs.h" // MAXPATHLEN +#include "osdefs.h" // MAXPATHLEN static PyObject * @@ -491,6 +492,38 @@ decode_locale_ex(PyObject *self, PyObject *args) return res; } +static PyObject *record_list = NULL; + +static PyObject * +set_eval_frame_default(PyObject *self, PyObject *Py_UNUSED(args)) +{ + _PyInterpreterState_SetEvalFrameFunc(PyInterpreterState_Get(), _PyEval_EvalFrameDefault); + Py_CLEAR(record_list); + Py_RETURN_NONE; +} + +static PyObject * +record_eval(PyThreadState *tstate, struct _PyInterpreterFrame *f, int exc) +{ + PyList_Append(record_list, f->f_func->func_name); + return _PyEval_EvalFrameDefault(tstate, f, exc); +} + + +static PyObject * +set_eval_frame_record(PyObject *self, PyObject *list) +{ + if (!PyList_Check(list)) { + PyErr_SetString(PyExc_TypeError, "argument must be a list"); + return NULL; + } + Py_CLEAR(record_list); + Py_INCREF(list); + record_list = list; + _PyInterpreterState_SetEvalFrameFunc(PyInterpreterState_Get(), record_eval); + Py_RETURN_NONE; +} + static PyMethodDef TestMethods[] = { {"get_configs", get_configs, METH_NOARGS}, @@ -508,6 +541,8 @@ static PyMethodDef TestMethods[] = { {"get_getpath_codeobject", get_getpath_codeobject, METH_NOARGS, NULL}, {"EncodeLocaleEx", encode_locale_ex, METH_VARARGS}, {"DecodeLocaleEx", decode_locale_ex, METH_VARARGS}, + {"set_eval_frame_default", set_eval_frame_default, METH_NOARGS, NULL}, + {"set_eval_frame_record", set_eval_frame_record, METH_O, NULL}, {NULL, NULL} /* sentinel */ }; diff --git a/Python/ceval.c b/Python/ceval.c index 6f46c7f043d77..b2735a1b2d395 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -4890,6 +4890,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int TARGET(CALL_PY_EXACT_ARGS) { assert(call_shape.kwnames == NULL); + DEOPT_IF(tstate->interp->eval_frame, CALL); _PyCallCache *cache = (_PyCallCache *)next_instr; int is_meth = is_method(stack_pointer, oparg); int argcount = oparg + is_meth; @@ -4923,6 +4924,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int TARGET(CALL_PY_WITH_DEFAULTS) { assert(call_shape.kwnames == NULL); + DEOPT_IF(tstate->interp->eval_frame, CALL); _PyCallCache *cache = (_PyCallCache *)next_instr; int is_meth = is_method(stack_pointer, oparg); int argcount = oparg + is_meth; diff --git a/Python/specialize.c b/Python/specialize.c index 12871ceaf876c..fa42993606fd6 100644 --- a/Python/specialize.c +++ b/Python/specialize.c @@ -440,6 +440,7 @@ initial_counter_value(void) { #define SPEC_FAIL_CALL_METHOD_WRAPPER 26 #define SPEC_FAIL_CALL_OPERATOR_WRAPPER 27 #define SPEC_FAIL_CALL_PYFUNCTION 28 +#define SPEC_FAIL_CALL_PEP_523 29 /* COMPARE_OP */ #define SPEC_FAIL_COMPARE_OP_DIFFERENT_TYPES 12 @@ -1471,6 +1472,11 @@ specialize_py_call(PyFunctionObject *func, _Py_CODEUNIT *instr, int nargs, assert(_Py_OPCODE(*instr) == CALL_ADAPTIVE); PyCodeObject *code = (PyCodeObject *)func->func_code; int kind = function_kind(code); + /* Don't specialize if PEP 523 is active */ + if (_PyInterpreterState_GET()->eval_frame) { + SPECIALIZATION_FAIL(CALL, SPEC_FAIL_CALL_PEP_523); + return -1; + } if (kwnames) { SPECIALIZATION_FAIL(CALL, SPEC_FAIL_CALL_KWNAMES); return -1; From webhook-mailer at python.org Wed May 4 14:41:43 2022 From: webhook-mailer at python.org (iritkatriel) Date: Wed, 04 May 2022 18:41:43 -0000 Subject: [Python-checkins] gh-92118: fix traceback of exceptions propagated from inside a contextlib.contextmanager (GH-92202) Message-ID: https://github.com/python/cpython/commit/e61330b44f22b11a71f5bbcc17e309dd80e3e95f commit: e61330b44f22b11a71f5bbcc17e309dd80e3e95f branch: main author: Irit Katriel <1055913+iritkatriel at users.noreply.github.com> committer: iritkatriel <1055913+iritkatriel at users.noreply.github.com> date: 2022-05-04T19:40:47+01:00 summary: gh-92118: fix traceback of exceptions propagated from inside a contextlib.contextmanager (GH-92202) files: A Misc/NEWS.d/next/Library/2022-05-02-23-08-02.gh-issue-92118.9Mm9g4.rst M Lib/contextlib.py M Lib/test/test_contextlib.py diff --git a/Lib/contextlib.py b/Lib/contextlib.py index 4cff9c6a46117..625bb33b12d5f 100644 --- a/Lib/contextlib.py +++ b/Lib/contextlib.py @@ -161,6 +161,7 @@ def __exit__(self, typ, value, traceback): except RuntimeError as exc: # Don't re-raise the passed in exception. (issue27122) if exc is value: + exc.__traceback__ = traceback return False # Avoid suppressing if a StopIteration exception # was passed to throw() and later wrapped into a RuntimeError @@ -172,6 +173,7 @@ def __exit__(self, typ, value, traceback): isinstance(value, StopIteration) and exc.__cause__ is value ): + exc.__traceback__ = traceback return False raise except BaseException as exc: @@ -183,6 +185,7 @@ def __exit__(self, typ, value, traceback): # and the __exit__() protocol. if exc is not value: raise + exc.__traceback__ = traceback return False raise RuntimeError("generator didn't stop after throw()") diff --git a/Lib/test/test_contextlib.py b/Lib/test/test_contextlib.py index e238548be9e2b..bfe81173ddc0b 100644 --- a/Lib/test/test_contextlib.py +++ b/Lib/test/test_contextlib.py @@ -5,6 +5,7 @@ import sys import tempfile import threading +import traceback import unittest from contextlib import * # Tests __all__ from test import support @@ -87,6 +88,32 @@ def woohoo(): raise ZeroDivisionError() self.assertEqual(state, [1, 42, 999]) + def test_contextmanager_traceback(self): + @contextmanager + def f(): + yield + + try: + with f(): + 1/0 + except ZeroDivisionError as e: + frames = traceback.extract_tb(e.__traceback__) + + self.assertEqual(len(frames), 1) + self.assertEqual(frames[0].name, 'test_contextmanager_traceback') + self.assertEqual(frames[0].line, '1/0') + + # Repeat with RuntimeError (which goes through a different code path) + try: + with f(): + raise NotImplementedError(42) + except NotImplementedError as e: + frames = traceback.extract_tb(e.__traceback__) + + self.assertEqual(len(frames), 1) + self.assertEqual(frames[0].name, 'test_contextmanager_traceback') + self.assertEqual(frames[0].line, 'raise NotImplementedError(42)') + def test_contextmanager_no_reraise(self): @contextmanager def whee(): diff --git a/Misc/NEWS.d/next/Library/2022-05-02-23-08-02.gh-issue-92118.9Mm9g4.rst b/Misc/NEWS.d/next/Library/2022-05-02-23-08-02.gh-issue-92118.9Mm9g4.rst new file mode 100644 index 0000000000000..b58ecdf40daf3 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-05-02-23-08-02.gh-issue-92118.9Mm9g4.rst @@ -0,0 +1 @@ +Fix a 3.11 regression in :func:`~contextlib.contextmanager`, which caused it to propagate exceptions with incorrect tracebacks. From webhook-mailer at python.org Wed May 4 20:14:12 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Thu, 05 May 2022 00:14:12 -0000 Subject: [Python-checkins] gh-92223: Remove pre-Python 3.7 alternative in asyncio docs (#92224) Message-ID: https://github.com/python/cpython/commit/d1b2e989be2bc5128d6602e4f370d0ee6f5ac476 commit: d1b2e989be2bc5128d6602e4f370d0ee6f5ac476 branch: main author: Sebastian Rittau committer: JelleZijlstra date: 2022-05-04T17:14:07-07:00 summary: gh-92223: Remove pre-Python 3.7 alternative in asyncio docs (#92224) files: M Doc/library/asyncio-task.rst diff --git a/Doc/library/asyncio-task.rst b/Doc/library/asyncio-task.rst index c104ac5b9a3b8..8e3d49dcf9d71 100644 --- a/Doc/library/asyncio-task.rst +++ b/Doc/library/asyncio-task.rst @@ -20,7 +20,7 @@ Coroutines :term:`Coroutines ` declared with the async/await syntax is the preferred way of writing asyncio applications. For example, the following -snippet of code (requires Python 3.7+) prints "hello", waits 1 second, +snippet of code prints "hello", waits 1 second, and then prints "world":: >>> import asyncio @@ -223,21 +223,6 @@ Creating Tasks :exc:`RuntimeError` is raised if there is no running loop in current thread. - This function has been **added in Python 3.7**. Prior to - Python 3.7, the low-level :func:`asyncio.ensure_future` function - can be used instead:: - - async def coro(): - ... - - # In Python 3.7+ - task = asyncio.create_task(coro()) - ... - - # This works in all Python versions but is less readable - task = asyncio.ensure_future(coro()) - ... - .. important:: Save a reference to the result of this function, to avoid From webhook-mailer at python.org Wed May 4 20:31:00 2022 From: webhook-mailer at python.org (miss-islington) Date: Thu, 05 May 2022 00:31:00 -0000 Subject: [Python-checkins] gh-92223: Remove pre-Python 3.7 alternative in asyncio docs (GH-92224) Message-ID: https://github.com/python/cpython/commit/bb2dcf1c7996c9da3372b89c1759c94ed567b298 commit: bb2dcf1c7996c9da3372b89c1759c94ed567b298 branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-04T17:30:54-07:00 summary: gh-92223: Remove pre-Python 3.7 alternative in asyncio docs (GH-92224) (cherry picked from commit d1b2e989be2bc5128d6602e4f370d0ee6f5ac476) Co-authored-by: Sebastian Rittau files: M Doc/library/asyncio-task.rst diff --git a/Doc/library/asyncio-task.rst b/Doc/library/asyncio-task.rst index efd4d1bc628ad..dc09286e5f852 100644 --- a/Doc/library/asyncio-task.rst +++ b/Doc/library/asyncio-task.rst @@ -20,7 +20,7 @@ Coroutines :term:`Coroutines ` declared with the async/await syntax is the preferred way of writing asyncio applications. For example, the following -snippet of code (requires Python 3.7+) prints "hello", waits 1 second, +snippet of code prints "hello", waits 1 second, and then prints "world":: >>> import asyncio @@ -259,21 +259,6 @@ Creating Tasks :exc:`RuntimeError` is raised if there is no running loop in current thread. - This function has been **added in Python 3.7**. Prior to - Python 3.7, the low-level :func:`asyncio.ensure_future` function - can be used instead:: - - async def coro(): - ... - - # In Python 3.7+ - task = asyncio.create_task(coro()) - ... - - # This works in all Python versions but is less readable - task = asyncio.ensure_future(coro()) - ... - .. important:: Save a reference to the result of this function, to avoid From webhook-mailer at python.org Wed May 4 20:36:30 2022 From: webhook-mailer at python.org (miss-islington) Date: Thu, 05 May 2022 00:36:30 -0000 Subject: [Python-checkins] gh-92223: Remove pre-Python 3.7 alternative in asyncio docs (GH-92224) Message-ID: https://github.com/python/cpython/commit/d82a769a1ded6dfa702800c83a68d051299b01fc commit: d82a769a1ded6dfa702800c83a68d051299b01fc branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-04T17:36:04-07:00 summary: gh-92223: Remove pre-Python 3.7 alternative in asyncio docs (GH-92224) (cherry picked from commit d1b2e989be2bc5128d6602e4f370d0ee6f5ac476) Co-authored-by: Sebastian Rittau files: M Doc/library/asyncio-task.rst diff --git a/Doc/library/asyncio-task.rst b/Doc/library/asyncio-task.rst index 38b12e44b6de2..7c12e2eda1c4c 100644 --- a/Doc/library/asyncio-task.rst +++ b/Doc/library/asyncio-task.rst @@ -20,7 +20,7 @@ Coroutines :term:`Coroutines ` declared with the async/await syntax is the preferred way of writing asyncio applications. For example, the following -snippet of code (requires Python 3.7+) prints "hello", waits 1 second, +snippet of code prints "hello", waits 1 second, and then prints "world":: >>> import asyncio @@ -259,21 +259,6 @@ Creating Tasks :exc:`RuntimeError` is raised if there is no running loop in current thread. - This function has been **added in Python 3.7**. Prior to - Python 3.7, the low-level :func:`asyncio.ensure_future` function - can be used instead:: - - async def coro(): - ... - - # In Python 3.7+ - task = asyncio.create_task(coro()) - ... - - # This works in all Python versions but is less readable - task = asyncio.ensure_future(coro()) - ... - .. important:: Save a reference to the result of this function, to avoid From webhook-mailer at python.org Thu May 5 00:00:38 2022 From: webhook-mailer at python.org (rhettinger) Date: Thu, 05 May 2022 04:00:38 -0000 Subject: [Python-checkins] bpo-46764: Fix wrapping bound method with @classmethod (#31367) Message-ID: https://github.com/python/cpython/commit/a918589578a2a807396c5f6afab7b59ab692c642 commit: a918589578a2a807396c5f6afab7b59ab692c642 branch: main author: Michael J. Sullivan committer: rhettinger date: 2022-05-04T23:00:21-05:00 summary: bpo-46764: Fix wrapping bound method with @classmethod (#31367) files: A Misc/NEWS.d/next/Core and Builtins/2022-02-16-03-23-38.bpo-46764.wEY4bS.rst M Lib/test/test_decorators.py M Objects/classobject.c diff --git a/Lib/test/test_decorators.py b/Lib/test/test_decorators.py index 57a741ffd2974..a6baa3ad1dd6b 100644 --- a/Lib/test/test_decorators.py +++ b/Lib/test/test_decorators.py @@ -330,6 +330,16 @@ def outer(cls): self.assertEqual(Class().inner(), 'spam') self.assertEqual(Class().outer(), 'eggs') + def test_bound_function_inside_classmethod(self): + class A: + def foo(self, cls): + return 'spam' + + class B: + bar = classmethod(A().foo) + + self.assertEqual(B.bar(), 'spam') + def test_wrapped_classmethod_inside_classmethod(self): class MyClassMethod1: def __init__(self, func): diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-02-16-03-23-38.bpo-46764.wEY4bS.rst b/Misc/NEWS.d/next/Core and Builtins/2022-02-16-03-23-38.bpo-46764.wEY4bS.rst new file mode 100644 index 0000000000000..f69793cd2d7b8 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-02-16-03-23-38.bpo-46764.wEY4bS.rst @@ -0,0 +1 @@ +Fix wrapping bound methods with @classmethod diff --git a/Objects/classobject.c b/Objects/classobject.c index cf731358e41c4..b9708ba0e41a3 100644 --- a/Objects/classobject.c +++ b/Objects/classobject.c @@ -321,13 +321,6 @@ method_traverse(PyMethodObject *im, visitproc visit, void *arg) return 0; } -static PyObject * -method_descr_get(PyObject *meth, PyObject *obj, PyObject *cls) -{ - Py_INCREF(meth); - return meth; -} - PyTypeObject PyMethod_Type = { PyVarObject_HEAD_INIT(&PyType_Type, 0) .tp_name = "method", @@ -348,7 +341,6 @@ PyTypeObject PyMethod_Type = { .tp_methods = method_methods, .tp_members = method_memberlist, .tp_getset = method_getset, - .tp_descr_get = method_descr_get, .tp_new = method_new, }; From webhook-mailer at python.org Thu May 5 01:33:14 2022 From: webhook-mailer at python.org (rhettinger) Date: Thu, 05 May 2022 05:33:14 -0000 Subject: [Python-checkins] Allow translating argument error messages (#17169) Message-ID: https://github.com/python/cpython/commit/b885b8f4be9c74ef1ce7923dbf055c31e7f47735 commit: b885b8f4be9c74ef1ce7923dbf055c31e7f47735 branch: main author: DjMorgul committer: rhettinger date: 2022-05-05T00:32:49-05:00 summary: Allow translating argument error messages (#17169) files: M Lib/argparse.py diff --git a/Lib/argparse.py b/Lib/argparse.py index 8d1a00ad2207e..1c5520c4b41bd 100644 --- a/Lib/argparse.py +++ b/Lib/argparse.py @@ -766,7 +766,7 @@ def __str__(self): if self.argument_name is None: format = '%(message)s' else: - format = 'argument %(argument_name)s: %(message)s' + format = _('argument %(argument_name)s: %(message)s') return format % dict(message=self.message, argument_name=self.argument_name) From webhook-mailer at python.org Thu May 5 04:01:41 2022 From: webhook-mailer at python.org (rhettinger) Date: Thu, 05 May 2022 08:01:41 -0000 Subject: [Python-checkins] Clean-up and simplify median_grouped(). Vastly improve its docstring. (#92324) Message-ID: https://github.com/python/cpython/commit/5212cbc2618bd4390c4b768f1c65c28fa6b595a0 commit: 5212cbc2618bd4390c4b768f1c65c28fa6b595a0 branch: main author: Raymond Hettinger committer: rhettinger date: 2022-05-05T03:01:07-05:00 summary: Clean-up and simplify median_grouped(). Vastly improve its docstring. (#92324) files: M Lib/statistics.py M Lib/test/test_statistics.py diff --git a/Lib/statistics.py b/Lib/statistics.py index c0220889ebdc4..54f4e13265189 100644 --- a/Lib/statistics.py +++ b/Lib/statistics.py @@ -348,22 +348,6 @@ def _convert(value, T): raise -def _find_lteq(a, x): - 'Locate the leftmost value exactly equal to x' - i = bisect_left(a, x) - if i != len(a) and a[i] == x: - return i - raise ValueError - - -def _find_rteq(a, l, x): - 'Locate the rightmost value exactly equal to x' - i = bisect_right(a, x, lo=l) - if i != (len(a) + 1) and a[i - 1] == x: - return i - 1 - raise ValueError - - def _fail_neg(values, errmsg='negative value'): """Iterate over values, failing if any are less than zero.""" for x in values: @@ -628,30 +612,44 @@ def median_high(data): def median_grouped(data, interval=1): - """Return the 50th percentile (median) of grouped continuous data. - - >>> median_grouped([1, 2, 2, 3, 4, 4, 4, 4, 4, 5]) - 3.7 - >>> median_grouped([52, 52, 53, 54]) - 52.5 - - This calculates the median as the 50th percentile, and should be - used when your data is continuous and grouped. In the above example, - the values 1, 2, 3, etc. actually represent the midpoint of classes - 0.5-1.5, 1.5-2.5, 2.5-3.5, etc. The middle value falls somewhere in - class 3.5-4.5, and interpolation is used to estimate it. - - Optional argument ``interval`` represents the class interval, and - defaults to 1. Changing the class interval naturally will change the - interpolated 50th percentile value: - - >>> median_grouped([1, 3, 3, 5, 7], interval=1) - 3.25 - >>> median_grouped([1, 3, 3, 5, 7], interval=2) - 3.5 - - This function does not check whether the data points are at least - ``interval`` apart. + """Estimates the median for numeric data binned around the midpoints + of consecutive, fixed-width intervals. + + The *data* can be any iterable of numeric data with each value being + exactly the midpoint of a bin. At least one value must be present. + + The *interval* is width of each bin. + + For example, demographic information may have been summarized into + consecutive ten-year age groups with each group being represented + by the 5-year midpoints of the intervals: + + >>> demographics = Counter({ + ... 25: 172, # 20 to 30 years old + ... 35: 484, # 30 to 40 years old + ... 45: 387, # 40 to 50 years old + ... 55: 22, # 50 to 60 years old + ... 65: 6, # 60 to 70 years old + ... }) + + The 50th percentile (median) is the 536th person out of the 1071 + member cohort. That person is in the 30 to 40 year old age group. + + The regular median() function would assume that everyone in the + tricenarian age group was exactly 35 years old. A more tenable + assumption is that the 484 members of that age group are evenly + distributed between 30 and 40. For that, we use median_grouped(). + + >>> data = list(demographics.elements()) + >>> median(data) + 35 + >>> round(median_grouped(data, interval=10), 1) + 37.5 + + The caller is responsible for making sure the data points are separated + by exact multiples of *interval*. This is essential for getting a + correct result. The function does not check this precondition. + """ data = sorted(data) n = len(data) @@ -659,26 +657,30 @@ class 3.5-4.5, and interpolation is used to estimate it. raise StatisticsError("no median for empty data") elif n == 1: return data[0] + # Find the value at the midpoint. Remember this corresponds to the - # centre of the class interval. + # midpoint of the class interval. x = data[n // 2] + + # Generate a clear error message for non-numeric data for obj in (x, interval): if isinstance(obj, (str, bytes)): - raise TypeError('expected number but got %r' % obj) + raise TypeError(f'expected a number but got {obj!r}') + + # Using O(log n) bisection, find where all the x values occur in the data. + # All x will lie within data[i:j]. + i = bisect_left(data, x) + j = bisect_right(data, x, lo=i) + + # Interpolate the median using the formula found at: + # https://www.cuemath.com/data/median-of-grouped-data/ try: L = x - interval / 2 # The lower limit of the median interval. except TypeError: - # Mixed type. For now we just coerce to float. + # Coerce mixed types to float. L = float(x) - float(interval) / 2 - - # Uses bisection search to search for x in data with log(n) time complexity - # Find the position of leftmost occurrence of x in data - l1 = _find_lteq(data, x) - # Find the position of rightmost occurrence of x in data[l1...len(data)] - # Assuming always l1 <= l2 - l2 = _find_rteq(data, l1, x) - cf = l1 - f = l2 - l1 + 1 + cf = i # Cumulative frequency of the preceding interval + f = j - i # Number of elements in the median internal return L + interval * (n / 2 - cf) / f diff --git a/Lib/test/test_statistics.py b/Lib/test/test_statistics.py index bacb76a9b036b..ed6021d60bde7 100644 --- a/Lib/test/test_statistics.py +++ b/Lib/test/test_statistics.py @@ -1040,50 +1040,6 @@ def test_error_msg(self): self.assertEqual(errmsg, msg) -class FindLteqTest(unittest.TestCase): - # Test _find_lteq private function. - - def test_invalid_input_values(self): - for a, x in [ - ([], 1), - ([1, 2], 3), - ([1, 3], 2) - ]: - with self.subTest(a=a, x=x): - with self.assertRaises(ValueError): - statistics._find_lteq(a, x) - - def test_locate_successfully(self): - for a, x, expected_i in [ - ([1, 1, 1, 2, 3], 1, 0), - ([0, 1, 1, 1, 2, 3], 1, 1), - ([1, 2, 3, 3, 3], 3, 2) - ]: - with self.subTest(a=a, x=x): - self.assertEqual(expected_i, statistics._find_lteq(a, x)) - - -class FindRteqTest(unittest.TestCase): - # Test _find_rteq private function. - - def test_invalid_input_values(self): - for a, l, x in [ - ([1], 2, 1), - ([1, 3], 0, 2) - ]: - with self.assertRaises(ValueError): - statistics._find_rteq(a, l, x) - - def test_locate_successfully(self): - for a, l, x, expected_i in [ - ([1, 1, 1, 2, 3], 0, 1, 2), - ([0, 1, 1, 1, 2, 3], 0, 1, 3), - ([1, 2, 3, 3, 3], 0, 3, 4) - ]: - with self.subTest(a=a, l=l, x=x): - self.assertEqual(expected_i, statistics._find_rteq(a, l, x)) - - # === Tests for public functions === class UnivariateCommonMixin: From webhook-mailer at python.org Thu May 5 05:32:13 2022 From: webhook-mailer at python.org (vstinner) Date: Thu, 05 May 2022 09:32:13 -0000 Subject: [Python-checkins] gh-89653: PEP 670: Convert PyCFunction macros to functions (#92302) Message-ID: https://github.com/python/cpython/commit/08b562a5dfc5cb5b94c94622763f79998aa682c3 commit: 08b562a5dfc5cb5b94c94622763f79998aa682c3 branch: main author: Victor Stinner committer: vstinner date: 2022-05-05T11:31:59+02:00 summary: gh-89653: PEP 670: Convert PyCFunction macros to functions (#92302) Convert the following macros to static inline functions: * PyCFunction_GET_CLASS() * PyCFunction_GET_FLAGS() * PyCFunction_GET_FUNCTION() * PyCFunction_GET_SELF() Limited C API version 3.11 no longer casts arguments. files: M Include/cpython/methodobject.h diff --git a/Include/cpython/methodobject.h b/Include/cpython/methodobject.h index bbb67ec762036..54a61cfd077be 100644 --- a/Include/cpython/methodobject.h +++ b/Include/cpython/methodobject.h @@ -2,30 +2,7 @@ # error "this header file must not be included directly" #endif -PyAPI_DATA(PyTypeObject) PyCMethod_Type; - -#define PyCMethod_CheckExact(op) Py_IS_TYPE(op, &PyCMethod_Type) -#define PyCMethod_Check(op) PyObject_TypeCheck(op, &PyCMethod_Type) - -#define _PyCFunctionObject_CAST(func) \ - (assert(PyCFunction_Check(func)), \ - _Py_CAST(PyCFunctionObject*, (func))) -#define _PyCMethodObject_CAST(func) \ - (assert(PyCMethod_Check(func)), \ - _Py_CAST(PyCMethodObject*, (func))) - -/* Macros for direct access to these values. Type checks are *not* - done, so use with care. */ -#define PyCFunction_GET_FUNCTION(func) \ - (_PyCFunctionObject_CAST(func)->m_ml->ml_meth) -#define PyCFunction_GET_SELF(func) \ - (_PyCFunctionObject_CAST(func)->m_ml->ml_flags & METH_STATIC ? \ - NULL : _PyCFunctionObject_CAST(func)->m_self) -#define PyCFunction_GET_FLAGS(func) \ - (_PyCFunctionObject_CAST(func)->m_ml->ml_flags) -#define PyCFunction_GET_CLASS(func) \ - (_PyCFunctionObject_CAST(func)->m_ml->ml_flags & METH_METHOD ? \ - _PyCMethodObject_CAST(func)->mm_class : NULL) +// PyCFunctionObject structure typedef struct { PyObject_HEAD @@ -36,7 +13,62 @@ typedef struct { vectorcallfunc vectorcall; } PyCFunctionObject; +#define _PyCFunctionObject_CAST(func) \ + (assert(PyCFunction_Check(func)), \ + _Py_CAST(PyCFunctionObject*, (func))) + + +// PyCMethodObject structure + typedef struct { PyCFunctionObject func; PyTypeObject *mm_class; /* Class that defines this method */ } PyCMethodObject; + +#define _PyCMethodObject_CAST(func) \ + (assert(PyCMethod_Check(func)), \ + _Py_CAST(PyCMethodObject*, (func))) + +PyAPI_DATA(PyTypeObject) PyCMethod_Type; + +#define PyCMethod_CheckExact(op) Py_IS_TYPE(op, &PyCMethod_Type) +#define PyCMethod_Check(op) PyObject_TypeCheck(op, &PyCMethod_Type) + + +/* Static inline functions for direct access to these values. + Type checks are *not* done, so use with care. */ +static inline PyCFunction PyCFunction_GET_FUNCTION(PyObject *func) { + return _PyCFunctionObject_CAST(func)->m_ml->ml_meth; +} +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000 +# define PyCFunction_GET_FUNCTION(func) PyCFunction_GET_FUNCTION(_PyObject_CAST(func)) +#endif + +static inline PyObject* PyCFunction_GET_SELF(PyObject *func_obj) { + PyCFunctionObject *func = _PyCFunctionObject_CAST(func_obj); + if (func->m_ml->ml_flags & METH_STATIC) { + return _Py_NULL; + } + return func->m_self; +} +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000 +# define PyCFunction_GET_SELF(func) PyCFunction_GET_SELF(_PyObject_CAST(func)) +#endif + +static inline int PyCFunction_GET_FLAGS(PyObject *func) { + return _PyCFunctionObject_CAST(func)->m_ml->ml_flags; +} +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000 +# define PyCFunction_GET_FLAGS(func) PyCFunction_GET_FLAGS(_PyObject_CAST(func)) +#endif + +static inline PyTypeObject* PyCFunction_GET_CLASS(PyObject *func_obj) { + PyCFunctionObject *func = _PyCFunctionObject_CAST(func_obj); + if (func->m_ml->ml_flags & METH_METHOD) { + return _PyCMethodObject_CAST(func)->mm_class; + } + return _Py_NULL; +} +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000 +# define PyCFunction_GET_CLASS(func) PyCFunction_GET_CLASS(_PyObject_CAST(func)) +#endif From webhook-mailer at python.org Thu May 5 05:33:41 2022 From: webhook-mailer at python.org (vstinner) Date: Thu, 05 May 2022 09:33:41 -0000 Subject: [Python-checkins] gh-92047: Py_GetVersion multi-digit minor version (GH-92047) (#92048) Message-ID: https://github.com/python/cpython/commit/43b135f94ebf3e6e84ddb0f75ed8510b96a610e4 commit: 43b135f94ebf3e6e84ddb0f75ed8510b96a610e4 branch: main author: Robert Howlett committer: vstinner date: 2022-05-05T11:33:35+02:00 summary: gh-92047: Py_GetVersion multi-digit minor version (GH-92047) (#92048) files: M Doc/c-api/init.rst diff --git a/Doc/c-api/init.rst b/Doc/c-api/init.rst index d9a7d8e44e196..c17379c52ab70 100644 --- a/Doc/c-api/init.rst +++ b/Doc/c-api/init.rst @@ -549,7 +549,7 @@ Process-wide parameters .. index:: single: version (in module sys) The first word (up to the first space character) is the current Python version; - the first three characters are the major and minor version separated by a + the first characters are the major and minor version separated by a period. The returned string points into static storage; the caller should not modify its value. The value is available to Python code as :data:`sys.version`. From webhook-mailer at python.org Thu May 5 09:37:31 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Thu, 05 May 2022 13:37:31 -0000 Subject: [Python-checkins] bpo-43857: Improve the AttributeError message when deleting a missing attribute (#25424) Message-ID: https://github.com/python/cpython/commit/a95138b2c5a3ba3d9a1a635566e22e5843b6a45c commit: a95138b2c5a3ba3d9a1a635566e22e5843b6a45c branch: main author: G?ry Ogam committer: JelleZijlstra date: 2022-05-05T06:37:26-07:00 summary: bpo-43857: Improve the AttributeError message when deleting a missing attribute (#25424) Co-authored-by: Jelle Zijlstra files: A Misc/NEWS.d/next/Core and Builtins/2022-05-04-11-37-20.bpo-43857.WuX8p3.rst M Lib/test/test_class.py M Objects/dictobject.c M Objects/object.c diff --git a/Lib/test/test_class.py b/Lib/test/test_class.py index 7cf5e06d59e20..91c53b7c894ce 100644 --- a/Lib/test/test_class.py +++ b/Lib/test/test_class.py @@ -611,6 +611,49 @@ class A: with self.assertRaises(TypeError): type.__setattr__(A, b'x', None) + def testTypeAttributeAccessErrorMessages(self): + class A: + pass + + error_msg = "type object 'A' has no attribute 'x'" + with self.assertRaisesRegex(AttributeError, error_msg): + A.x + with self.assertRaisesRegex(AttributeError, error_msg): + del A.x + + def testObjectAttributeAccessErrorMessages(self): + class A: + pass + class B: + y = 0 + __slots__ = ('z',) + + error_msg = "'A' object has no attribute 'x'" + with self.assertRaisesRegex(AttributeError, error_msg): + A().x + with self.assertRaisesRegex(AttributeError, error_msg): + del A().x + + error_msg = "'B' object has no attribute 'x'" + with self.assertRaisesRegex(AttributeError, error_msg): + B().x + with self.assertRaisesRegex(AttributeError, error_msg): + del B().x + with self.assertRaisesRegex(AttributeError, error_msg): + B().x = 0 + + error_msg = "'B' object attribute 'y' is read-only" + with self.assertRaisesRegex(AttributeError, error_msg): + del B().y + with self.assertRaisesRegex(AttributeError, error_msg): + B().y = 0 + + error_msg = 'z' + with self.assertRaisesRegex(AttributeError, error_msg): + B().z + with self.assertRaisesRegex(AttributeError, error_msg): + del B().z + def testConstructorErrorMessages(self): # bpo-31506: Improves the error message logic for object_new & object_init diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-04-11-37-20.bpo-43857.WuX8p3.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-04-11-37-20.bpo-43857.WuX8p3.rst new file mode 100644 index 0000000000000..0db4333bf9945 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-05-04-11-37-20.bpo-43857.WuX8p3.rst @@ -0,0 +1,2 @@ +Improve the :exc:`AttributeError` message when deleting a missing attribute. +Patch by G?ry Ogam. diff --git a/Objects/dictobject.c b/Objects/dictobject.c index 063fd242e6d58..ebbd22ee7c145 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -5472,7 +5472,9 @@ _PyObject_StoreInstanceAttribute(PyObject *obj, PyDictValues *values, values->values[ix] = value; if (old_value == NULL) { if (value == NULL) { - PyErr_SetObject(PyExc_AttributeError, name); + PyErr_Format(PyExc_AttributeError, + "'%.100s' object has no attribute '%U'", + Py_TYPE(obj)->tp_name, name); return -1; } _PyDictValues_AddToInsertionOrder(values, ix); diff --git a/Objects/object.c b/Objects/object.c index 6f2d9f89562a5..d5f21b7c6aa19 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -1382,7 +1382,7 @@ _PyObject_GenericSetAttrWithDict(PyObject *obj, PyObject *name, return -1; Py_INCREF(name); - + Py_INCREF(tp); descr = _PyType_Lookup(tp, name); if (descr != NULL) { @@ -1426,11 +1426,21 @@ _PyObject_GenericSetAttrWithDict(PyObject *obj, PyObject *name, res = PyDict_SetItem(dict, name, value); Py_DECREF(dict); } - if (res < 0 && PyErr_ExceptionMatches(PyExc_KeyError)) - PyErr_SetObject(PyExc_AttributeError, name); - + if (res < 0 && PyErr_ExceptionMatches(PyExc_KeyError)) { + if (PyType_IsSubtype(tp, &PyType_Type)) { + PyErr_Format(PyExc_AttributeError, + "type object '%.50s' has no attribute '%U'", + ((PyTypeObject*)obj)->tp_name, name); + } + else { + PyErr_Format(PyExc_AttributeError, + "'%.100s' object has no attribute '%U'", + tp->tp_name, name); + } + } done: Py_XDECREF(descr); + Py_DECREF(tp); Py_DECREF(name); return res; } From webhook-mailer at python.org Thu May 5 09:40:09 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Thu, 05 May 2022 13:40:09 -0000 Subject: [Python-checkins] bpo-43827: Make arguments to abc.ABCMeta.__new__ pos-only (#25385) Message-ID: https://github.com/python/cpython/commit/42fee931d055a3ef8ed31abe44603b9b2856e04d commit: 42fee931d055a3ef8ed31abe44603b9b2856e04d branch: main author: Vlad Hoi committer: JelleZijlstra date: 2022-05-05T06:40:01-07:00 summary: bpo-43827: Make arguments to abc.ABCMeta.__new__ pos-only (#25385) To avoid conflicts with `__init__subclass__`. files: A Misc/NEWS.d/next/Library/2021-04-16-17-32-44.bpo-43827.uJaXdP.rst M Lib/abc.py M Lib/test/test_abc.py M Misc/ACKS diff --git a/Lib/abc.py b/Lib/abc.py index 3c552cebb4226..42048ddb85538 100644 --- a/Lib/abc.py +++ b/Lib/abc.py @@ -102,7 +102,7 @@ class ABCMeta(type): implementations defined by the registering ABC be callable (not even via super()). """ - def __new__(mcls, name, bases, namespace, **kwargs): + def __new__(mcls, name, bases, namespace, /, **kwargs): cls = super().__new__(mcls, name, bases, namespace, **kwargs) _abc_init(cls) return cls diff --git a/Lib/test/test_abc.py b/Lib/test/test_abc.py index c1d750dba83f9..1e7a0351db489 100644 --- a/Lib/test/test_abc.py +++ b/Lib/test/test_abc.py @@ -668,6 +668,19 @@ def __init_subclass__(cls, **kwargs): class Receiver(ReceivesClassKwargs, abc_ABC, x=1, y=2, z=3): pass self.assertEqual(saved_kwargs, dict(x=1, y=2, z=3)) + + def test_positional_only_and_kwonlyargs_with_init_subclass(self): + saved_kwargs = {} + + class A: + def __init_subclass__(cls, **kwargs): + super().__init_subclass__() + saved_kwargs.update(kwargs) + + class B(A, metaclass=abc_ABCMeta, name="test"): + pass + self.assertEqual(saved_kwargs, dict(name="test")) + return TestLegacyAPI, TestABC, TestABCWithInitSubclass TestLegacyAPI_Py, TestABC_Py, TestABCWithInitSubclass_Py = test_factory(abc.ABCMeta, diff --git a/Misc/ACKS b/Misc/ACKS index ec4de61ff9273..2b9485e7aa80c 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -753,6 +753,7 @@ Albert Hofkamp Chris Hogan Tomas Hoger Jonathan Hogg +Vladyslav Hoi Kamilla Holanda Steve Holden Akintayo Holder diff --git a/Misc/NEWS.d/next/Library/2021-04-16-17-32-44.bpo-43827.uJaXdP.rst b/Misc/NEWS.d/next/Library/2021-04-16-17-32-44.bpo-43827.uJaXdP.rst new file mode 100644 index 0000000000000..6e4f82f2d27eb --- /dev/null +++ b/Misc/NEWS.d/next/Library/2021-04-16-17-32-44.bpo-43827.uJaXdP.rst @@ -0,0 +1 @@ +All positional-or-keyword parameters to ``ABCMeta.__new__`` are now positional-only to avoid conflicts with keyword arguments to be passed to :meth:`__init_subclass__`. From webhook-mailer at python.org Thu May 5 12:04:53 2022 From: webhook-mailer at python.org (gpshead) Date: Thu, 05 May 2022 16:04:53 -0000 Subject: [Python-checkins] bpo-41818: Add os.login_tty() for *nix. (#29658) Message-ID: https://github.com/python/cpython/commit/ae553b3561f0f8e1fed454bbbd55073e4ba711eb commit: ae553b3561f0f8e1fed454bbbd55073e4ba711eb branch: main author: Soumendra Ganguly <67527439+8vasu at users.noreply.github.com> committer: gpshead date: 2022-05-05T09:04:44-07:00 summary: bpo-41818: Add os.login_tty() for *nix. (#29658) * Add `os.login_tty(fd)` for Unix. Reviewed-by: Christian Heimes Signed-off-by: Gregory P. Smith [Google LLC] files: A Misc/NEWS.d/next/Library/2022-05-02-03-56-50.gh-issue-85984.RBivvc.rst M Doc/library/os.rst M Modules/clinic/posixmodule.c.h M Modules/posixmodule.c M configure M configure.ac M pyconfig.h.in diff --git a/Doc/library/os.rst b/Doc/library/os.rst index aa50673445884..21c2073c9edc3 100644 --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -1000,6 +1000,17 @@ as internal buffering of data. .. versionadded:: 3.3 +.. function:: login_tty(fd) + + Prepare the tty of which fd is a file descriptor for a new login session. + Make the calling process a session leader; make the tty the controlling tty, + the stdin, the stdout, and the stderr of the calling process; close fd. + + .. availability:: Unix. + + .. versionadded:: 3.11 + + .. function:: lseek(fd, pos, how) Set the current position of file descriptor *fd* to position *pos*, modified diff --git a/Misc/NEWS.d/next/Library/2022-05-02-03-56-50.gh-issue-85984.RBivvc.rst b/Misc/NEWS.d/next/Library/2022-05-02-03-56-50.gh-issue-85984.RBivvc.rst new file mode 100644 index 0000000000000..e54f29ad2cbe5 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-05-02-03-56-50.gh-issue-85984.RBivvc.rst @@ -0,0 +1 @@ +New function os.login_tty() for Unix. diff --git a/Modules/clinic/posixmodule.c.h b/Modules/clinic/posixmodule.c.h index fdcd5bdd4dc17..d62b09ed7406e 100644 --- a/Modules/clinic/posixmodule.c.h +++ b/Modules/clinic/posixmodule.c.h @@ -3106,6 +3106,41 @@ os_openpty(PyObject *module, PyObject *Py_UNUSED(ignored)) #endif /* (defined(HAVE_OPENPTY) || defined(HAVE__GETPTY) || defined(HAVE_DEV_PTMX)) */ +#if (defined(HAVE_LOGIN_TTY) || defined(HAVE_FALLBACK_LOGIN_TTY)) + +PyDoc_STRVAR(os_login_tty__doc__, +"login_tty($module, fd, /)\n" +"--\n" +"\n" +"Prepare the tty of which fd is a file descriptor for a new login session.\n" +"\n" +"Make the calling process a session leader; make the tty the\n" +"controlling tty, the stdin, the stdout, and the stderr of the\n" +"calling process; close fd."); + +#define OS_LOGIN_TTY_METHODDEF \ + {"login_tty", (PyCFunction)os_login_tty, METH_O, os_login_tty__doc__}, + +static PyObject * +os_login_tty_impl(PyObject *module, int fd); + +static PyObject * +os_login_tty(PyObject *module, PyObject *arg) +{ + PyObject *return_value = NULL; + int fd; + + if (!_PyLong_FileDescriptor_Converter(arg, &fd)) { + goto exit; + } + return_value = os_login_tty_impl(module, fd); + +exit: + return return_value; +} + +#endif /* (defined(HAVE_LOGIN_TTY) || defined(HAVE_FALLBACK_LOGIN_TTY)) */ + #if defined(HAVE_FORKPTY) PyDoc_STRVAR(os_forkpty__doc__, @@ -8932,6 +8967,10 @@ os_waitstatus_to_exitcode(PyObject *module, PyObject *const *args, Py_ssize_t na #define OS_OPENPTY_METHODDEF #endif /* !defined(OS_OPENPTY_METHODDEF) */ +#ifndef OS_LOGIN_TTY_METHODDEF + #define OS_LOGIN_TTY_METHODDEF +#endif /* !defined(OS_LOGIN_TTY_METHODDEF) */ + #ifndef OS_FORKPTY_METHODDEF #define OS_FORKPTY_METHODDEF #endif /* !defined(OS_FORKPTY_METHODDEF) */ @@ -9331,4 +9370,4 @@ os_waitstatus_to_exitcode(PyObject *module, PyObject *const *args, Py_ssize_t na #ifndef OS_WAITSTATUS_TO_EXITCODE_METHODDEF #define OS_WAITSTATUS_TO_EXITCODE_METHODDEF #endif /* !defined(OS_WAITSTATUS_TO_EXITCODE_METHODDEF) */ -/*[clinic end generated code: output=3b5a56add047ee1d input=a9049054013a1b77]*/ +/*[clinic end generated code: output=6150bcc25f5e4bc7 input=a9049054013a1b77]*/ diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index c55275c6c5511..40158894411ba 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -7274,22 +7274,21 @@ os_sched_getaffinity_impl(PyObject *module, pid_t pid) # define DEV_PTY_FILE "/dev/ptmx" #endif -#if defined(HAVE_OPENPTY) || defined(HAVE_FORKPTY) || defined(HAVE_DEV_PTMX) +#if defined(HAVE_OPENPTY) || defined(HAVE_FORKPTY) || defined(HAVE_LOGIN_TTY) || defined(HAVE_DEV_PTMX) #ifdef HAVE_PTY_H #include -#else -#ifdef HAVE_LIBUTIL_H +#ifdef HAVE_UTMP_H +#include +#endif /* HAVE_UTMP_H */ +#elif defined(HAVE_LIBUTIL_H) #include -#else -#ifdef HAVE_UTIL_H +#elif defined(HAVE_UTIL_H) #include -#endif /* HAVE_UTIL_H */ -#endif /* HAVE_LIBUTIL_H */ #endif /* HAVE_PTY_H */ #ifdef HAVE_STROPTS_H #include #endif -#endif /* defined(HAVE_OPENPTY) || defined(HAVE_FORKPTY) || defined(HAVE_DEV_PTMX) */ +#endif /* defined(HAVE_OPENPTY) || defined(HAVE_FORKPTY) || defined(HAVE_LOGIN_TTY) || defined(HAVE_DEV_PTMX) */ #if defined(HAVE_OPENPTY) || defined(HAVE__GETPTY) || defined(HAVE_DEV_PTMX) @@ -7392,6 +7391,56 @@ os_openpty_impl(PyObject *module) #endif /* defined(HAVE_OPENPTY) || defined(HAVE__GETPTY) || defined(HAVE_DEV_PTMX) */ +#if defined(HAVE_SETSID) && defined(TIOCSCTTY) +#define HAVE_FALLBACK_LOGIN_TTY 1 +#endif /* defined(HAVE_SETSID) && defined(TIOCSCTTY) */ + +#if defined(HAVE_LOGIN_TTY) || defined(HAVE_FALLBACK_LOGIN_TTY) +/*[clinic input] +os.login_tty + + fd: fildes + / + +Prepare the tty of which fd is a file descriptor for a new login session. + +Make the calling process a session leader; make the tty the +controlling tty, the stdin, the stdout, and the stderr of the +calling process; close fd. +[clinic start generated code]*/ + +static PyObject * +os_login_tty_impl(PyObject *module, int fd) +/*[clinic end generated code: output=495a79911b4cc1bc input=5f298565099903a2]*/ +{ +#ifdef HAVE_LOGIN_TTY + if (login_tty(fd) == -1) { + return posix_error(); + } +#else /* defined(HAVE_FALLBACK_LOGIN_TTY) */ + /* Establish a new session. */ + if (setsid() == -1) { + return posix_error(); + } + + /* The tty becomes the controlling terminal. */ + if (ioctl(fd, TIOCSCTTY, (char *)NULL) == -1) { + return posix_error(); + } + + /* The tty becomes stdin/stdout/stderr */ + if (dup2(fd, 0) == -1 || dup2(fd, 1) == -1 || dup2(fd, 2) == -1) { + return posix_error(); + } + if (fd > 2) { + close(fd); + } +#endif /* HAVE_LOGIN_TTY */ + Py_RETURN_NONE; +} +#endif /* defined(HAVE_LOGIN_TTY) || defined(HAVE_FALLBACK_LOGIN_TTY) */ + + #ifdef HAVE_FORKPTY /*[clinic input] os.forkpty @@ -7427,8 +7476,9 @@ os_forkpty_impl(PyObject *module) /* parent: release the import lock. */ PyOS_AfterFork_Parent(); } - if (pid == -1) + if (pid == -1) { return posix_error(); + } return Py_BuildValue("(Ni)", PyLong_FromPid(pid), master_fd); } #endif /* HAVE_FORKPTY */ @@ -14797,6 +14847,7 @@ static PyMethodDef posix_methods[] = { OS_SCHED_SETAFFINITY_METHODDEF OS_SCHED_GETAFFINITY_METHODDEF OS_OPENPTY_METHODDEF + OS_LOGIN_TTY_METHODDEF OS_FORKPTY_METHODDEF OS_GETEGID_METHODDEF OS_GETEUID_METHODDEF diff --git a/configure b/configure index 0f5c2c80f6067..b57c6f3a45abe 100755 --- a/configure +++ b/configure @@ -8857,7 +8857,7 @@ for ac_header in \ sys/random.h sys/resource.h sys/select.h sys/sendfile.h sys/socket.h sys/soundcard.h sys/stat.h \ sys/statvfs.h sys/sys_domain.h sys/syscall.h sys/sysmacros.h sys/termio.h sys/time.h sys/times.h \ sys/types.h sys/uio.h sys/un.h sys/utsname.h sys/wait.h sys/xattr.h sysexits.h syslog.h \ - termios.h util.h utime.h \ + termios.h util.h utime.h utmp.h \ do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` @@ -16750,7 +16750,7 @@ fi -# check for openpty and forkpty +# check for openpty, login_tty, and forkpty for ac_func in openpty do : @@ -16849,6 +16849,65 @@ fi fi done +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing login_tty" >&5 +$as_echo_n "checking for library containing login_tty... " >&6; } +if ${ac_cv_search_login_tty+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char login_tty (); +int +main () +{ +return login_tty (); + ; + return 0; +} +_ACEOF +for ac_lib in '' util; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_login_tty=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if ${ac_cv_search_login_tty+:} false; then : + break +fi +done +if ${ac_cv_search_login_tty+:} false; then : + +else + ac_cv_search_login_tty=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_login_tty" >&5 +$as_echo "$ac_cv_search_login_tty" >&6; } +ac_res=$ac_cv_search_login_tty +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +$as_echo "#define HAVE_LOGIN_TTY 1" >>confdefs.h + + +fi + for ac_func in forkpty do : ac_fn_c_check_func "$LINENO" "forkpty" "ac_cv_func_forkpty" diff --git a/configure.ac b/configure.ac index 8c0711d8a9a15..07b8885f1e482 100644 --- a/configure.ac +++ b/configure.ac @@ -2508,7 +2508,7 @@ AC_CHECK_HEADERS([ \ sys/random.h sys/resource.h sys/select.h sys/sendfile.h sys/socket.h sys/soundcard.h sys/stat.h \ sys/statvfs.h sys/sys_domain.h sys/syscall.h sys/sysmacros.h sys/termio.h sys/time.h sys/times.h \ sys/types.h sys/uio.h sys/un.h sys/utsname.h sys/wait.h sys/xattr.h sysexits.h syslog.h \ - termios.h util.h utime.h \ + termios.h util.h utime.h utmp.h \ ]) AC_HEADER_DIRENT AC_HEADER_MAJOR @@ -4670,7 +4670,7 @@ PY_CHECK_FUNC([setgroups], [ #endif ]) -# check for openpty and forkpty +# check for openpty, login_tty, and forkpty AC_CHECK_FUNCS(openpty,, AC_CHECK_LIB(util,openpty, @@ -4678,6 +4678,9 @@ AC_CHECK_FUNCS(openpty,, AC_CHECK_LIB(bsd,openpty, [AC_DEFINE(HAVE_OPENPTY) LIBS="$LIBS -lbsd"]) ) ) +AC_SEARCH_LIBS([login_tty], [util], + [AC_DEFINE([HAVE_LOGIN_TTY], [1], [Define to 1 if you have the `login_tty' function.])] +) AC_CHECK_FUNCS(forkpty,, AC_CHECK_LIB(util,forkpty, [AC_DEFINE(HAVE_FORKPTY) LIBS="$LIBS -lutil"], diff --git a/pyconfig.h.in b/pyconfig.h.in index 4ac054a28d8ef..383fd47dd43c8 100644 --- a/pyconfig.h.in +++ b/pyconfig.h.in @@ -721,6 +721,9 @@ /* Define to 1 if you have the `log2' function. */ #undef HAVE_LOG2 +/* Define to 1 if you have the `login_tty' function. */ +#undef HAVE_LOGIN_TTY + /* Define to 1 if the system has the type `long double'. */ #undef HAVE_LONG_DOUBLE @@ -1389,6 +1392,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_UTIME_H +/* Define to 1 if you have the header file. */ +#undef HAVE_UTMP_H + /* Define to 1 if you have the `uuid_create' function. */ #undef HAVE_UUID_CREATE From webhook-mailer at python.org Thu May 5 12:39:43 2022 From: webhook-mailer at python.org (iritkatriel) Date: Thu, 05 May 2022 16:39:43 -0000 Subject: [Python-checkins] gh-92118: Add test for traceback when exception is modified by (Async)ExitStack.__exit__ (GH-92339) Message-ID: https://github.com/python/cpython/commit/e65e587f9320947d73817fbe62c11d2a0fd50dfb commit: e65e587f9320947d73817fbe62c11d2a0fd50dfb branch: main author: Irit Katriel <1055913+iritkatriel at users.noreply.github.com> committer: iritkatriel <1055913+iritkatriel at users.noreply.github.com> date: 2022-05-05T17:39:33+01:00 summary: gh-92118: Add test for traceback when exception is modified by (Async)ExitStack.__exit__ (GH-92339) files: M Lib/test/test_contextlib.py M Lib/test/test_contextlib_async.py diff --git a/Lib/test/test_contextlib.py b/Lib/test/test_contextlib.py index bfe81173ddc0b..31f5c74572b63 100644 --- a/Lib/test/test_contextlib.py +++ b/Lib/test/test_contextlib.py @@ -748,6 +748,38 @@ def test_exit_suppress(self): stack.push(lambda *exc: True) 1/0 + def test_exit_exception_traceback(self): + # This test captures the current behavior of ExitStack so that we know + # if we ever unintendedly change it. It is not a statement of what the + # desired behavior is (for instance, we may want to remove some of the + # internal contextlib frames). + + def raise_exc(exc): + raise exc + + try: + with self.exit_stack() as stack: + stack.callback(raise_exc, ValueError) + 1/0 + except ValueError as e: + exc = e + + self.assertIsInstance(exc, ValueError) + ve_frames = traceback.extract_tb(exc.__traceback__) + expected = \ + [('test_exit_exception_traceback', 'with self.exit_stack() as stack:')] + \ + self.callback_error_internal_frames + \ + [('_exit_wrapper', 'callback(*args, **kwds)'), + ('raise_exc', 'raise exc')] + + self.assertEqual( + [(f.name, f.line) for f in ve_frames], expected) + + self.assertIsInstance(exc.__context__, ZeroDivisionError) + zde_frames = traceback.extract_tb(exc.__context__.__traceback__) + self.assertEqual([(f.name, f.line) for f in zde_frames], + [('test_exit_exception_traceback', '1/0')]) + def test_exit_exception_chaining_reference(self): # Sanity check to make sure that ExitStack chaining matches # actual nested with statements @@ -1017,6 +1049,10 @@ def first(): class TestExitStack(TestBaseExitStack, unittest.TestCase): exit_stack = ExitStack + callback_error_internal_frames = [ + ('__exit__', 'raise exc_details[1]'), + ('__exit__', 'if cb(*exc_details):'), + ] class TestRedirectStream: diff --git a/Lib/test/test_contextlib_async.py b/Lib/test/test_contextlib_async.py index 462e05cc79aec..76bd81c7d02cc 100644 --- a/Lib/test/test_contextlib_async.py +++ b/Lib/test/test_contextlib_async.py @@ -487,6 +487,13 @@ def __exit__(self, *exc_details): return self.run_coroutine(self.__aexit__(*exc_details)) exit_stack = SyncAsyncExitStack + callback_error_internal_frames = [ + ('__exit__', 'return self.run_coroutine(self.__aexit__(*exc_details))'), + ('run_coroutine', 'raise exc'), + ('run_coroutine', 'raise exc'), + ('__aexit__', 'raise exc_details[1]'), + ('__aexit__', 'cb_suppress = cb(*exc_details)'), + ] def setUp(self): self.loop = asyncio.new_event_loop() From webhook-mailer at python.org Thu May 5 12:46:24 2022 From: webhook-mailer at python.org (gpshead) Date: Thu, 05 May 2022 16:46:24 -0000 Subject: [Python-checkins] gh-92301: subprocess: Prefer close_range() to procfs-based fd closing (#92303) Message-ID: https://github.com/python/cpython/commit/58573ffba0e4d3c7d6e6712169578e45d2926dbd commit: 58573ffba0e4d3c7d6e6712169578e45d2926dbd branch: main author: Alexey Izbyshev committer: gpshead date: 2022-05-05T09:46:19-07:00 summary: gh-92301: subprocess: Prefer close_range() to procfs-based fd closing (#92303) #92301: subprocess: Prefer `close_range()` to procfs-based fd closing. `close_range()` is much faster for large number of file descriptors, e.g. 4 times faster for 1000 descriptors in a Linux 5.16-based environment. We prefer close_range() only if it's known to be async-signal-safe. files: A Misc/NEWS.d/next/Library/2022-05-04-11-54-37.gh-issue-92301.eqjoYX.rst M Modules/_posixsubprocess.c diff --git a/Misc/NEWS.d/next/Library/2022-05-04-11-54-37.gh-issue-92301.eqjoYX.rst b/Misc/NEWS.d/next/Library/2022-05-04-11-54-37.gh-issue-92301.eqjoYX.rst new file mode 100644 index 0000000000000..b0b0502bf0a75 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-05-04-11-54-37.gh-issue-92301.eqjoYX.rst @@ -0,0 +1,2 @@ +Prefer ``close_range()`` to iterating over procfs for file descriptor +closing in :mod:`subprocess` for better performance. diff --git a/Modules/_posixsubprocess.c b/Modules/_posixsubprocess.c index 2440609e31bcc..21c2bd13a3e27 100644 --- a/Modules/_posixsubprocess.c +++ b/Modules/_posixsubprocess.c @@ -210,18 +210,23 @@ safe_get_max_fd(void) } -/* Close all file descriptors in the range from start_fd and higher - * except for those in py_fds_to_keep. If the range defined by - * [start_fd, safe_get_max_fd()) is large this will take a long - * time as it calls close() on EVERY possible fd. +/* Close all file descriptors in the given range except for those in + * py_fds_to_keep by invoking closer on each subrange. * - * It isn't possible to know for sure what the max fd to go up to - * is for processes with the capability of raising their maximum. + * If end_fd == -1, it's guessed via safe_get_max_fd(), but it isn't + * possible to know for sure what the max fd to go up to is for + * processes with the capability of raising their maximum, or in case + * a process opened a high fd and then lowered its maximum. */ -static void -_close_fds_by_brute_force(long start_fd, PyObject *py_fds_to_keep) +static int +_close_range_except(int start_fd, + int end_fd, + PyObject *py_fds_to_keep, + int (*closer)(int, int)) { - long end_fd = safe_get_max_fd(); + if (end_fd == -1) { + end_fd = Py_MIN(safe_get_max_fd(), INT_MAX); + } Py_ssize_t num_fds_to_keep = PyTuple_GET_SIZE(py_fds_to_keep); Py_ssize_t keep_seq_idx; /* As py_fds_to_keep is sorted we can loop through the list closing @@ -231,15 +236,17 @@ _close_fds_by_brute_force(long start_fd, PyObject *py_fds_to_keep) int keep_fd = PyLong_AsLong(py_keep_fd); if (keep_fd < start_fd) continue; - _Py_closerange(start_fd, keep_fd - 1); + if (closer(start_fd, keep_fd - 1) != 0) + return -1; start_fd = keep_fd + 1; } if (start_fd <= end_fd) { - _Py_closerange(start_fd, end_fd); + if (closer(start_fd, end_fd) != 0) + return -1; } + return 0; } - #if defined(__linux__) && defined(HAVE_SYS_SYSCALL_H) /* It doesn't matter if d_name has room for NAME_MAX chars; we're using this * only to read a directory of short file descriptor number names. The kernel @@ -255,6 +262,16 @@ struct linux_dirent64 { char d_name[256]; /* Filename (null-terminated) */ }; +static int +_brute_force_closer(int first, int last) +{ + for (int i = first; i <= last; i++) { + /* Ignore errors */ + (void)close(i); + } + return 0; +} + /* Close all open file descriptors in the range from start_fd and higher * Do not close any in the sorted py_fds_to_keep list. * @@ -278,7 +295,7 @@ _close_open_fds_safe(int start_fd, PyObject* py_fds_to_keep) fd_dir_fd = _Py_open_noraise(FD_DIR, O_RDONLY); if (fd_dir_fd == -1) { /* No way to get a list of open fds. */ - _close_fds_by_brute_force(start_fd, py_fds_to_keep); + _close_range_except(start_fd, -1, py_fds_to_keep, _brute_force_closer); return; } else { char buffer[sizeof(struct linux_dirent64)]; @@ -306,10 +323,16 @@ _close_open_fds_safe(int start_fd, PyObject* py_fds_to_keep) } } -#define _close_open_fds _close_open_fds_safe +#define _close_open_fds_fallback _close_open_fds_safe #else /* NOT (defined(__linux__) && defined(HAVE_SYS_SYSCALL_H)) */ +static int +_unsafe_closer(int first, int last) +{ + _Py_closerange(first, last); + return 0; +} /* Close all open file descriptors from start_fd and higher. * Do not close any in the sorted py_fds_to_keep tuple. @@ -325,7 +348,7 @@ _close_open_fds_safe(int start_fd, PyObject* py_fds_to_keep) * http://womble.decadent.org.uk/readdir_r-advisory.html */ static void -_close_open_fds_maybe_unsafe(long start_fd, PyObject* py_fds_to_keep) +_close_open_fds_maybe_unsafe(int start_fd, PyObject* py_fds_to_keep) { DIR *proc_fd_dir; #ifndef HAVE_DIRFD @@ -348,7 +371,7 @@ _close_open_fds_maybe_unsafe(long start_fd, PyObject* py_fds_to_keep) proc_fd_dir = opendir(FD_DIR); if (!proc_fd_dir) { /* No way to get a list of open fds. */ - _close_fds_by_brute_force(start_fd, py_fds_to_keep); + _close_range_except(start_fd, -1, py_fds_to_keep, _unsafe_closer); } else { struct dirent *dir_entry; #ifdef HAVE_DIRFD @@ -369,16 +392,45 @@ _close_open_fds_maybe_unsafe(long start_fd, PyObject* py_fds_to_keep) } if (errno) { /* readdir error, revert behavior. Highly Unlikely. */ - _close_fds_by_brute_force(start_fd, py_fds_to_keep); + _close_range_except(start_fd, -1, py_fds_to_keep, _unsafe_closer); } closedir(proc_fd_dir); } } -#define _close_open_fds _close_open_fds_maybe_unsafe +#define _close_open_fds_fallback _close_open_fds_maybe_unsafe #endif /* else NOT (defined(__linux__) && defined(HAVE_SYS_SYSCALL_H)) */ +/* We can use close_range() library function only if it's known to be + * async-signal-safe. + * + * On Linux, glibc explicitly documents it to be a thin wrapper over + * the system call, and other C libraries are likely to follow glibc. + */ +#if defined(HAVE_CLOSE_RANGE) && \ + (defined(__linux__) || defined(__FreeBSD__)) +#define HAVE_ASYNC_SAFE_CLOSE_RANGE + +static int +_close_range_closer(int first, int last) +{ + return close_range(first, last, 0); +} +#endif + +static void +_close_open_fds(int start_fd, PyObject* py_fds_to_keep) +{ +#ifdef HAVE_ASYNC_SAFE_CLOSE_RANGE + if (_close_range_except( + start_fd, INT_MAX, py_fds_to_keep, + _close_range_closer) == 0) { + return; + } +#endif + _close_open_fds_fallback(start_fd, py_fds_to_keep); +} #ifdef VFORK_USABLE /* Reset dispositions for all signals to SIG_DFL except for ignored From webhook-mailer at python.org Thu May 5 12:48:21 2022 From: webhook-mailer at python.org (gpshead) Date: Thu, 05 May 2022 16:48:21 -0000 Subject: [Python-checkins] minor hashlib doc example cleanup. (#92340) Message-ID: https://github.com/python/cpython/commit/354ab7a5c812bf103f7aed5405f02fc81fda5b58 commit: 354ab7a5c812bf103f7aed5405f02fc81fda5b58 branch: main author: Gregory P. Smith committer: gpshead date: 2022-05-05T09:48:17-07:00 summary: minor hashlib doc example cleanup. (#92340) Closes #85465 files: M Doc/library/hashlib.rst diff --git a/Doc/library/hashlib.rst b/Doc/library/hashlib.rst index da97b0e9a74d1..57f270c8d711c 100644 --- a/Doc/library/hashlib.rst +++ b/Doc/library/hashlib.rst @@ -91,8 +91,8 @@ library that Python uses on your platform. On most platforms the Hashlib now uses SHA3 and SHAKE from OpenSSL 1.1.1 and newer. -For example, to obtain the digest of the byte string ``b'Nobody inspects the -spammish repetition'``:: +For example, to obtain the digest of the byte string ``b"Nobody inspects the +spammish repetition"``:: >>> import hashlib >>> m = hashlib.sha256() @@ -100,15 +100,13 @@ spammish repetition'``:: >>> m.update(b" the spammish repetition") >>> m.digest() b'\x03\x1e\xdd}Ae\x15\x93\xc5\xfe\\\x00o\xa5u+7\xfd\xdf\xf7\xbcN\x84:\xa6\xaf\x0c\x95\x0fK\x94\x06' - >>> m.digest_size - 32 - >>> m.block_size - 64 + >>> m.hexdigest() + '031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406' More condensed: - >>> hashlib.sha224(b"Nobody inspects the spammish repetition").hexdigest() - 'a4337bc45a8fc544c03f52dc550cd6e1e87021bc896588bd79e901e2' + >>> hashlib.sha256(b"Nobody inspects the spammish repetition").hexdigest() + '031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406' .. function:: new(name[, data], *, usedforsecurity=True) From webhook-mailer at python.org Thu May 5 13:16:15 2022 From: webhook-mailer at python.org (serhiy-storchaka) Date: Thu, 05 May 2022 17:16:15 -0000 Subject: [Python-checkins] gh-87390: Fix starred tuple equality and pickling (GH-92337) Message-ID: https://github.com/python/cpython/commit/1ed8d035f1edfaec34016b9f8d615df9e9fe9414 commit: 1ed8d035f1edfaec34016b9f8d615df9e9fe9414 branch: main author: Serhiy Storchaka committer: serhiy-storchaka date: 2022-05-05T20:16:06+03:00 summary: gh-87390: Fix starred tuple equality and pickling (GH-92337) files: M Include/internal/pycore_global_strings.h M Include/internal/pycore_runtime_init.h M Lib/test/test_genericalias.py M Objects/genericaliasobject.c diff --git a/Include/internal/pycore_global_strings.h b/Include/internal/pycore_global_strings.h index 28fffa95071a0..4e1f2ec6c3529 100644 --- a/Include/internal/pycore_global_strings.h +++ b/Include/internal/pycore_global_strings.h @@ -300,6 +300,7 @@ struct _Py_global_strings { STRUCT_FOR_ID(n_unnamed_fields) STRUCT_FOR_ID(name) STRUCT_FOR_ID(newlines) + STRUCT_FOR_ID(next) STRUCT_FOR_ID(obj) STRUCT_FOR_ID(offset) STRUCT_FOR_ID(onceregistry) diff --git a/Include/internal/pycore_runtime_init.h b/Include/internal/pycore_runtime_init.h index 941badfc8cb6a..c1c5fd562e6b8 100644 --- a/Include/internal/pycore_runtime_init.h +++ b/Include/internal/pycore_runtime_init.h @@ -923,6 +923,7 @@ extern "C" { INIT_ID(n_unnamed_fields), \ INIT_ID(name), \ INIT_ID(newlines), \ + INIT_ID(next), \ INIT_ID(obj), \ INIT_ID(offset), \ INIT_ID(onceregistry), \ diff --git a/Lib/test/test_genericalias.py b/Lib/test/test_genericalias.py index 2d2adc11e1594..5fba74ec864f1 100644 --- a/Lib/test/test_genericalias.py +++ b/Lib/test/test_genericalias.py @@ -358,6 +358,8 @@ def test_equality(self): self.assertNotEqual(dict[str, int], dict[str, str]) self.assertNotEqual(list, list[int]) self.assertNotEqual(list[int], list) + self.assertNotEqual(list[int], tuple[int]) + self.assertNotEqual((*tuple[int],)[0], tuple[int]) def test_isinstance(self): self.assertTrue(isinstance([], list)) @@ -394,6 +396,7 @@ def test_pickle(self): self.assertEqual(loaded.__origin__, alias.__origin__) self.assertEqual(loaded.__args__, alias.__args__) self.assertEqual(loaded.__parameters__, alias.__parameters__) + self.assertEqual(type(loaded), type(alias)) def test_copy(self): class X(list): diff --git a/Objects/genericaliasobject.c b/Objects/genericaliasobject.c index c6ed1611bd29e..5eeb1dbb338d2 100644 --- a/Objects/genericaliasobject.c +++ b/Objects/genericaliasobject.c @@ -567,6 +567,9 @@ ga_richcompare(PyObject *a, PyObject *b, int op) gaobject *aa = (gaobject *)a; gaobject *bb = (gaobject *)b; + if (aa->starred != bb->starred) { + Py_RETURN_FALSE; + } int eq = PyObject_RichCompareBool(aa->origin, bb->origin, Py_EQ); if (eq < 0) { return NULL; @@ -604,6 +607,16 @@ static PyObject * ga_reduce(PyObject *self, PyObject *Py_UNUSED(ignored)) { gaobject *alias = (gaobject *)self; + if (alias->starred) { + PyObject *tmp = Py_GenericAlias(alias->origin, alias->args); + if (tmp != NULL) { + Py_SETREF(tmp, PyObject_GetIter(tmp)); + } + if (tmp == NULL) { + return NULL; + } + return Py_BuildValue("N(N)", _PyEval_GetBuiltin(&_Py_ID(next)), tmp); + } return Py_BuildValue("O(OO)", Py_TYPE(alias), alias->origin, alias->args); } @@ -775,6 +788,18 @@ ga_iter_clear(PyObject *self) { return 0; } +static PyObject * +ga_iter_reduce(PyObject *self, PyObject *Py_UNUSED(ignored)) +{ + gaiterobject *gi = (gaiterobject *)self; + return Py_BuildValue("N(O)", _PyEval_GetBuiltin(&_Py_ID(iter)), gi->obj); +} + +static PyMethodDef ga_iter_methods[] = { + {"__reduce__", ga_iter_reduce, METH_NOARGS}, + {0} +}; + // gh-91632: _Py_GenericAliasIterType is exported to be cleared // in _PyTypes_FiniTypes. PyTypeObject _Py_GenericAliasIterType = { @@ -784,6 +809,7 @@ PyTypeObject _Py_GenericAliasIterType = { .tp_iter = PyObject_SelfIter, .tp_iternext = (iternextfunc)ga_iternext, .tp_traverse = (traverseproc)ga_iter_traverse, + .tp_methods = ga_iter_methods, .tp_dealloc = (destructor)ga_iter_dealloc, .tp_clear = (inquiry)ga_iter_clear, .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, From webhook-mailer at python.org Thu May 5 13:48:09 2022 From: webhook-mailer at python.org (iritkatriel) Date: Thu, 05 May 2022 17:48:09 -0000 Subject: [Python-checkins] [3.10] gh-92118: Add test for traceback when exception is modified by (Async)ExitStack.__exit__ (GH-92339) (GH-92343) Message-ID: https://github.com/python/cpython/commit/9b47252d5433894c26fc07aa87b1bd6bb4238e5e commit: 9b47252d5433894c26fc07aa87b1bd6bb4238e5e branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: iritkatriel <1055913+iritkatriel at users.noreply.github.com> date: 2022-05-05T18:47:59+01:00 summary: [3.10] gh-92118: Add test for traceback when exception is modified by (Async)ExitStack.__exit__ (GH-92339) (GH-92343) files: M Lib/test/test_contextlib.py M Lib/test/test_contextlib_async.py diff --git a/Lib/test/test_contextlib.py b/Lib/test/test_contextlib.py index fbaae2dd09fd9..68bd45d97232c 100644 --- a/Lib/test/test_contextlib.py +++ b/Lib/test/test_contextlib.py @@ -4,6 +4,7 @@ import sys import tempfile import threading +import traceback import unittest from contextlib import * # Tests __all__ from test import support @@ -701,6 +702,38 @@ def test_exit_suppress(self): stack.push(lambda *exc: True) 1/0 + def test_exit_exception_traceback(self): + # This test captures the current behavior of ExitStack so that we know + # if we ever unintendedly change it. It is not a statement of what the + # desired behavior is (for instance, we may want to remove some of the + # internal contextlib frames). + + def raise_exc(exc): + raise exc + + try: + with self.exit_stack() as stack: + stack.callback(raise_exc, ValueError) + 1/0 + except ValueError as e: + exc = e + + self.assertIsInstance(exc, ValueError) + ve_frames = traceback.extract_tb(exc.__traceback__) + expected = \ + [('test_exit_exception_traceback', 'with self.exit_stack() as stack:')] + \ + self.callback_error_internal_frames + \ + [('_exit_wrapper', 'callback(*args, **kwds)'), + ('raise_exc', 'raise exc')] + + self.assertEqual( + [(f.name, f.line) for f in ve_frames], expected) + + self.assertIsInstance(exc.__context__, ZeroDivisionError) + zde_frames = traceback.extract_tb(exc.__context__.__traceback__) + self.assertEqual([(f.name, f.line) for f in zde_frames], + [('test_exit_exception_traceback', '1/0')]) + def test_exit_exception_chaining_reference(self): # Sanity check to make sure that ExitStack chaining matches # actual nested with statements @@ -968,6 +1001,10 @@ def first(): class TestExitStack(TestBaseExitStack, unittest.TestCase): exit_stack = ExitStack + callback_error_internal_frames = [ + ('__exit__', 'raise exc_details[1]'), + ('__exit__', 'if cb(*exc_details):'), + ] class TestRedirectStream: diff --git a/Lib/test/test_contextlib_async.py b/Lib/test/test_contextlib_async.py index 127d7500656a5..d6a34e22ac424 100644 --- a/Lib/test/test_contextlib_async.py +++ b/Lib/test/test_contextlib_async.py @@ -412,6 +412,13 @@ def __exit__(self, *exc_details): return self.run_coroutine(self.__aexit__(*exc_details)) exit_stack = SyncAsyncExitStack + callback_error_internal_frames = [ + ('__exit__', 'return self.run_coroutine(self.__aexit__(*exc_details))'), + ('run_coroutine', 'raise exc'), + ('run_coroutine', 'raise exc'), + ('__aexit__', 'raise exc_details[1]'), + ('__aexit__', 'cb_suppress = cb(*exc_details)'), + ] def setUp(self): self.loop = asyncio.new_event_loop() From webhook-mailer at python.org Thu May 5 15:24:26 2022 From: webhook-mailer at python.org (tiran) Date: Thu, 05 May 2022 19:24:26 -0000 Subject: [Python-checkins] gh-92345: Import rlcompleter before sys.path is extended (#92346) Message-ID: https://github.com/python/cpython/commit/8122e8d5017be9f0683a49bc20d3c82e8b5398d6 commit: 8122e8d5017be9f0683a49bc20d3c82e8b5398d6 branch: main author: Christian Heimes committer: tiran date: 2022-05-05T21:24:16+02:00 summary: gh-92345: Import rlcompleter before sys.path is extended (#92346) ``pymain_run_python()`` now imports ``readline`` and ``rlcompleter`` before sys.path is extended to include the current working directory of an interactive interpreter. Non-interactive interpreters are not affected. Also move imports of ``re`` and ``keyword`` module to top level so they are materialized early, too. The ``keyword`` module is trivial and the ``re`` is already imported via ``inspect`` -> ``linecache``. files: A Misc/NEWS.d/next/Core and Builtins/2022-05-05-20-05-41.gh-issue-92345.lnN_RA.rst M Lib/rlcompleter.py M Modules/main.c diff --git a/Lib/rlcompleter.py b/Lib/rlcompleter.py index 4ede6dcce3fea..206d6fb511cdf 100644 --- a/Lib/rlcompleter.py +++ b/Lib/rlcompleter.py @@ -32,6 +32,8 @@ import atexit import builtins import inspect +import keyword +import re import __main__ __all__ = ["Completer"] @@ -113,7 +115,6 @@ def global_matches(self, text): defined in self.namespace that match. """ - import keyword matches = [] seen = {"__builtins__"} n = len(text) @@ -146,7 +147,6 @@ def attr_matches(self, text): with a __getattr__ hook is evaluated. """ - import re m = re.match(r"(\w+(\.\w+)*)\.(\w*)", text) if not m: return [] diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-05-20-05-41.gh-issue-92345.lnN_RA.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-05-20-05-41.gh-issue-92345.lnN_RA.rst new file mode 100644 index 0000000000000..2e2a6084f492c --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-05-05-20-05-41.gh-issue-92345.lnN_RA.rst @@ -0,0 +1,3 @@ +``pymain_run_python()`` now imports ``readline`` and ``rlcompleter`` before +sys.path is extended to include the current working directory of an +interactive interpreter. Non-interactive interpreters are not affected. diff --git a/Modules/main.c b/Modules/main.c index 2443f5631b94b..624c0f3946085 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -219,6 +219,13 @@ pymain_import_readline(const PyConfig *config) else { Py_DECREF(mod); } + mod = PyImport_ImportModule("rlcompleter"); + if (mod == NULL) { + PyErr_Clear(); + } + else { + Py_DECREF(mod); + } } @@ -555,6 +562,9 @@ pymain_run_python(int *exitcode) } } + // import readline and rlcompleter before script dir is added to sys.path + pymain_import_readline(config); + if (main_importer_path != NULL) { if (pymain_sys_path_add_path0(interp, main_importer_path) < 0) { goto error; @@ -577,7 +587,6 @@ pymain_run_python(int *exitcode) } pymain_header(config); - pymain_import_readline(config); if (config->run_command) { *exitcode = pymain_run_command(config->run_command); From webhook-mailer at python.org Thu May 5 15:46:31 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Thu, 05 May 2022 19:46:31 -0000 Subject: [Python-checkins] [3.10] gh-80254: Disallow recursive usage of cursors in `sqlite3` converters (#92274) Message-ID: https://github.com/python/cpython/commit/2a2421e538f9f7ceb419074909a313ba2c46f384 commit: 2a2421e538f9f7ceb419074909a313ba2c46f384 branch: 3.10 author: Erlend Egeberg Aasland committer: JelleZijlstra date: 2022-05-05T12:46:21-07:00 summary: [3.10] gh-80254: Disallow recursive usage of cursors in `sqlite3` converters (#92274) * [3.10] gh-80254: Disallow recursive usage of cursors in `sqlite3` converters (#29054) (cherry picked from commit f629dcfe835e349433e4c5099381d668e8fe69c8) Co-authored-by: Sergey Fedoseev Co-authored-by: Jelle Zijlstra * Fix ref leak in pysqlite_cursor_iternext files: A Misc/NEWS.d/next/Library/2019-06-22-11-01-45.bpo-36073.ED8mB9.rst M Lib/sqlite3/test/regression.py M Modules/_sqlite/cursor.c diff --git a/Lib/sqlite3/test/regression.py b/Lib/sqlite3/test/regression.py index 70d0ff9af1071..8937f9f69eb03 100644 --- a/Lib/sqlite3/test/regression.py +++ b/Lib/sqlite3/test/regression.py @@ -27,6 +27,9 @@ import functools from test import support +from unittest.mock import patch + + class RegressionTests(unittest.TestCase): def setUp(self): self.con = sqlite.connect(":memory:") @@ -415,9 +418,46 @@ def test_return_empty_bytestring(self): self.assertEqual(val, b'') +class RecursiveUseOfCursors(unittest.TestCase): + # GH-80254: sqlite3 should not segfault for recursive use of cursors. + msg = "Recursive use of cursors not allowed" + + def setUp(self): + self.con = sqlite.connect(":memory:", + detect_types=sqlite.PARSE_COLNAMES) + self.cur = self.con.cursor() + self.cur.execute("create table test(x foo)") + self.cur.executemany("insert into test(x) values (?)", + [("foo",), ("bar",)]) + + def tearDown(self): + self.cur.close() + self.con.close() + + def test_recursive_cursor_init(self): + conv = lambda x: self.cur.__init__(self.con) + with patch.dict(sqlite.converters, {"INIT": conv}): + with self.assertRaisesRegex(sqlite.ProgrammingError, self.msg): + self.cur.execute(f'select x as "x [INIT]", x from test') + + def test_recursive_cursor_close(self): + conv = lambda x: self.cur.close() + with patch.dict(sqlite.converters, {"CLOSE": conv}): + with self.assertRaisesRegex(sqlite.ProgrammingError, self.msg): + self.cur.execute(f'select x as "x [CLOSE]", x from test') + + def test_recursive_cursor_fetch(self): + conv = lambda x, l=[]: self.cur.fetchone() if l else l.append(None) + with patch.dict(sqlite.converters, {"ITER": conv}): + self.cur.execute(f'select x as "x [ITER]", x from test') + with self.assertRaisesRegex(sqlite.ProgrammingError, self.msg): + self.cur.fetchall() + + def suite(): tests = [ - RegressionTests + RegressionTests, + RecursiveUseOfCursors, ] return unittest.TestSuite( [unittest.TestLoader().loadTestsFromTestCase(t) for t in tests] diff --git a/Misc/NEWS.d/next/Library/2019-06-22-11-01-45.bpo-36073.ED8mB9.rst b/Misc/NEWS.d/next/Library/2019-06-22-11-01-45.bpo-36073.ED8mB9.rst new file mode 100644 index 0000000000000..6c214d8191601 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-06-22-11-01-45.bpo-36073.ED8mB9.rst @@ -0,0 +1,2 @@ +Raise :exc:`~sqlite3.ProgrammingError` instead of segfaulting on recursive +usage of cursors in :mod:`sqlite3` converters. Patch by Sergey Fedoseev. diff --git a/Modules/_sqlite/cursor.c b/Modules/_sqlite/cursor.c index 85267cc9e7700..ac80c285fe995 100644 --- a/Modules/_sqlite/cursor.c +++ b/Modules/_sqlite/cursor.c @@ -26,6 +26,17 @@ #include "util.h" #include "clinic/cursor.c.h" +static inline int +check_cursor_locked(pysqlite_Cursor *cur) +{ + if (cur->locked) { + PyErr_SetString(pysqlite_ProgrammingError, + "Recursive use of cursors not allowed."); + return 0; + } + return 1; +} + /*[clinic input] module _sqlite3 class _sqlite3.Cursor "pysqlite_Cursor *" "pysqlite_CursorType" @@ -47,6 +58,10 @@ pysqlite_cursor_init_impl(pysqlite_Cursor *self, pysqlite_Connection *connection) /*[clinic end generated code: output=ac59dce49a809ca8 input=a8a4f75ac90999b2]*/ { + if (!check_cursor_locked(self)) { + return -1; + } + Py_INCREF(connection); Py_XSETREF(self->connection, connection); Py_CLEAR(self->statement); @@ -407,12 +422,9 @@ static int check_cursor(pysqlite_Cursor* cur) return 0; } - if (cur->locked) { - PyErr_SetString(pysqlite_ProgrammingError, "Recursive use of cursors not allowed."); - return 0; - } - - return pysqlite_check_thread(cur->connection) && pysqlite_check_connection(cur->connection); + return (pysqlite_check_thread(cur->connection) + && pysqlite_check_connection(cur->connection) + && check_cursor_locked(cur)); } static PyObject * @@ -810,27 +822,29 @@ pysqlite_cursor_iternext(pysqlite_Cursor *self) if (self->statement) { rc = pysqlite_step(self->statement->st, self->connection); if (PyErr_Occurred()) { - (void)pysqlite_statement_reset(self->statement); - Py_DECREF(next_row); - return NULL; + goto error; } if (rc != SQLITE_DONE && rc != SQLITE_ROW) { - (void)pysqlite_statement_reset(self->statement); - Py_DECREF(next_row); _pysqlite_seterror(self->connection->db, NULL); - return NULL; + goto error; } if (rc == SQLITE_ROW) { + self->locked = 1; // GH-80254: Prevent recursive use of cursors. self->next_row = _pysqlite_fetch_one_row(self); + self->locked = 0; if (self->next_row == NULL) { - (void)pysqlite_statement_reset(self->statement); - return NULL; + goto error; } } } return next_row; + +error: + (void)pysqlite_statement_reset(self->statement); + Py_DECREF(next_row); + return NULL; } /*[clinic input] @@ -973,6 +987,10 @@ static PyObject * pysqlite_cursor_close_impl(pysqlite_Cursor *self) /*[clinic end generated code: output=b6055e4ec6fe63b6 input=08b36552dbb9a986]*/ { + if (!check_cursor_locked(self)) { + return NULL; + } + if (!self->connection) { PyErr_SetString(pysqlite_ProgrammingError, "Base Cursor.__init__ not called."); From webhook-mailer at python.org Thu May 5 15:48:08 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Thu, 05 May 2022 19:48:08 -0000 Subject: [Python-checkins] [3.9] gh-80254: Disallow recursive usage of cursors in `sqlite3` converters (#92278) Message-ID: https://github.com/python/cpython/commit/7d17a7b35265ed82fe33fe3eee355152357859be commit: 7d17a7b35265ed82fe33fe3eee355152357859be branch: 3.9 author: Erlend Egeberg Aasland committer: JelleZijlstra date: 2022-05-05T12:47:58-07:00 summary: [3.9] gh-80254: Disallow recursive usage of cursors in `sqlite3` converters (#92278) * [3.9] gh-80254: Disallow recursive usage of cursors in `sqlite3` converters (cherry picked from commit c908dc5b4798c311981bd7e1f7d92fb623ee448b) Co-authored-by: Sergey Fedoseev Co-authored-by: Jelle Zijlstra * Fix ref leak in pysqlite_cursor_iternext * Explicitly free resources at test tearDown() files: A Misc/NEWS.d/next/Library/2019-06-22-11-01-45.bpo-36073.ED8mB9.rst M Lib/sqlite3/test/regression.py M Modules/_sqlite/cursor.c diff --git a/Lib/sqlite3/test/regression.py b/Lib/sqlite3/test/regression.py index 6ba3356479553..4d5b7b7ab3096 100644 --- a/Lib/sqlite3/test/regression.py +++ b/Lib/sqlite3/test/regression.py @@ -28,6 +28,9 @@ import functools from test import support +from unittest.mock import patch + + class RegressionTests(unittest.TestCase): def setUp(self): self.con = sqlite.connect(":memory:") @@ -413,10 +416,50 @@ def log(self, *args): +class RecursiveUseOfCursors(unittest.TestCase): + # GH-80254: sqlite3 should not segfault for recursive use of cursors. + msg = "Recursive use of cursors not allowed" + + def setUp(self): + self.con = sqlite.connect(":memory:", + detect_types=sqlite.PARSE_COLNAMES) + self.cur = self.con.cursor() + self.cur.execute("create table test(x foo)") + self.cur.executemany("insert into test(x) values (?)", + [("foo",), ("bar",)]) + + def tearDown(self): + self.cur.close() + self.con.close() + del self.cur + del self.con + + def test_recursive_cursor_init(self): + conv = lambda x: self.cur.__init__(self.con) + with patch.dict(sqlite.converters, {"INIT": conv}): + with self.assertRaisesRegex(sqlite.ProgrammingError, self.msg): + self.cur.execute(f'select x as "x [INIT]", x from test') + + def test_recursive_cursor_close(self): + conv = lambda x: self.cur.close() + with patch.dict(sqlite.converters, {"CLOSE": conv}): + with self.assertRaisesRegex(sqlite.ProgrammingError, self.msg): + self.cur.execute(f'select x as "x [CLOSE]", x from test') + + def test_recursive_cursor_fetch(self): + conv = lambda x, l=[]: self.cur.fetchone() if l else l.append(None) + with patch.dict(sqlite.converters, {"ITER": conv}): + self.cur.execute(f'select x as "x [ITER]", x from test') + with self.assertRaisesRegex(sqlite.ProgrammingError, self.msg): + self.cur.fetchall() + + def suite(): regression_suite = unittest.makeSuite(RegressionTests, "Check") + recursive_cursor = unittest.makeSuite(RecursiveUseOfCursors) return unittest.TestSuite(( regression_suite, + recursive_cursor, )) def test(): diff --git a/Misc/NEWS.d/next/Library/2019-06-22-11-01-45.bpo-36073.ED8mB9.rst b/Misc/NEWS.d/next/Library/2019-06-22-11-01-45.bpo-36073.ED8mB9.rst new file mode 100644 index 0000000000000..6c214d8191601 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-06-22-11-01-45.bpo-36073.ED8mB9.rst @@ -0,0 +1,2 @@ +Raise :exc:`~sqlite3.ProgrammingError` instead of segfaulting on recursive +usage of cursors in :mod:`sqlite3` converters. Patch by Sergey Fedoseev. diff --git a/Modules/_sqlite/cursor.c b/Modules/_sqlite/cursor.c index e2635e18c738e..5c83eef47ebe9 100644 --- a/Modules/_sqlite/cursor.c +++ b/Modules/_sqlite/cursor.c @@ -27,10 +27,25 @@ PyObject* pysqlite_cursor_iternext(pysqlite_Cursor* self); +static inline int +check_cursor_locked(pysqlite_Cursor *cur) +{ + if (cur->locked) { + PyErr_SetString(pysqlite_ProgrammingError, + "Recursive use of cursors not allowed."); + return 0; + } + return 1; +} + static const char errmsg_fetch_across_rollback[] = "Cursor needed to be reset because of commit/rollback and can no longer be fetched from."; static int pysqlite_cursor_init(pysqlite_Cursor* self, PyObject* args, PyObject* kwargs) { + if (!check_cursor_locked(self)) { + return -1; + } + pysqlite_Connection* connection; if (!PyArg_ParseTuple(args, "O!", &pysqlite_ConnectionType, &connection)) @@ -357,12 +372,9 @@ static int check_cursor(pysqlite_Cursor* cur) return 0; } - if (cur->locked) { - PyErr_SetString(pysqlite_ProgrammingError, "Recursive use of cursors not allowed."); - return 0; - } - - return pysqlite_check_thread(cur->connection) && pysqlite_check_connection(cur->connection); + return (pysqlite_check_thread(cur->connection) + && pysqlite_check_connection(cur->connection) + && check_cursor_locked(cur)); } static PyObject * @@ -750,27 +762,29 @@ PyObject* pysqlite_cursor_iternext(pysqlite_Cursor *self) if (self->statement) { rc = pysqlite_step(self->statement->st, self->connection); if (PyErr_Occurred()) { - (void)pysqlite_statement_reset(self->statement); - Py_DECREF(next_row); - return NULL; + goto error; } if (rc != SQLITE_DONE && rc != SQLITE_ROW) { - (void)pysqlite_statement_reset(self->statement); - Py_DECREF(next_row); _pysqlite_seterror(self->connection->db, NULL); - return NULL; + goto error; } if (rc == SQLITE_ROW) { + self->locked = 1; // GH-80254: Prevent recursive use of cursors. self->next_row = _pysqlite_fetch_one_row(self); + self->locked = 0; if (self->next_row == NULL) { - (void)pysqlite_statement_reset(self->statement); - return NULL; + goto error; } } } return next_row; + +error: + (void)pysqlite_statement_reset(self->statement); + Py_DECREF(next_row); + return NULL; } PyObject* pysqlite_cursor_fetchone(pysqlite_Cursor* self, PyObject* args) @@ -857,6 +871,10 @@ PyObject* pysqlite_noop(pysqlite_Connection* self, PyObject* args) PyObject* pysqlite_cursor_close(pysqlite_Cursor* self, PyObject* args) { + if (!check_cursor_locked(self)) { + return NULL; + } + if (!self->connection) { PyErr_SetString(pysqlite_ProgrammingError, "Base Cursor.__init__ not called."); From webhook-mailer at python.org Thu May 5 18:08:06 2022 From: webhook-mailer at python.org (tiran) Date: Thu, 05 May 2022 22:08:06 -0000 Subject: [Python-checkins] gh-64783: Don't check value of SIG_DFL and SIG_IGN (#92350) Message-ID: https://github.com/python/cpython/commit/c0012df0f6535cc804d5d97be9b16482e4e0c2a5 commit: c0012df0f6535cc804d5d97be9b16482e4e0c2a5 branch: main author: Christian Heimes committer: tiran date: 2022-05-06T00:07:53+02:00 summary: gh-64783: Don't check value of SIG_DFL and SIG_IGN (#92350) files: M Lib/test/test_signal.py diff --git a/Lib/test/test_signal.py b/Lib/test/test_signal.py index d38992db7b84d..2ba29fc837d44 100644 --- a/Lib/test/test_signal.py +++ b/Lib/test/test_signal.py @@ -121,6 +121,9 @@ def test_valid_signals(self): for name in dir(signal): if not name.startswith("SIG"): continue + if name in {"SIG_IGN", "SIG_DFL"}: + # SIG_IGN and SIG_DFL are pointers + continue with self.subTest(name=name): signum = getattr(signal, name) self.assertGreaterEqual(signum, 0) From webhook-mailer at python.org Thu May 5 18:08:47 2022 From: webhook-mailer at python.org (tiran) Date: Thu, 05 May 2022 22:08:47 -0000 Subject: [Python-checkins] gh-92135: test_cppext requires subprocess (GH-92349) Message-ID: https://github.com/python/cpython/commit/bb35d6504aca0348c212281efbdde2caf84cd116 commit: bb35d6504aca0348c212281efbdde2caf84cd116 branch: main author: Christian Heimes committer: tiran date: 2022-05-06T00:08:43+02:00 summary: gh-92135: test_cppext requires subprocess (GH-92349) files: M Lib/test/test_cppext.py diff --git a/Lib/test/test_cppext.py b/Lib/test/test_cppext.py index e056410456630..337cb08f8c9d8 100644 --- a/Lib/test/test_cppext.py +++ b/Lib/test/test_cppext.py @@ -37,6 +37,7 @@ CPPFLAGS = [] + at support.requires_subprocess() class TestCPPExt(unittest.TestCase): def build(self): cpp_ext = Extension( From webhook-mailer at python.org Thu May 5 18:39:18 2022 From: webhook-mailer at python.org (ethanfurman) Date: Thu, 05 May 2022 22:39:18 -0000 Subject: [Python-checkins] gh-91996: Add an HTTPMethod StrEnum to http (GH-91997) Message-ID: https://github.com/python/cpython/commit/9a0a7b4868c1e40a1863394bc475132b47d8926f commit: 9a0a7b4868c1e40a1863394bc475132b47d8926f branch: main author: cibofo <53799417+cibofo at users.noreply.github.com> committer: ethanfurman date: 2022-05-05T15:39:02-07:00 summary: gh-91996: Add an HTTPMethod StrEnum to http (GH-91997) * Add HTTPMethod enum to http Create a StrEnum for the 9 common HTTP methods. Co-authored-by: Ethan Furman files: A Misc/NEWS.d/next/Library/2022-04-27-19-45-58.gh-issue-91996.YEEIzk.rst M Doc/library/http.rst M Lib/http/__init__.py M Misc/ACKS diff --git a/Doc/library/http.rst b/Doc/library/http.rst index 1569d504c7f92..5895a41d849bd 100644 --- a/Doc/library/http.rst +++ b/Doc/library/http.rst @@ -21,8 +21,8 @@ HyperText Transfer Protocol: * :mod:`http.cookies` has utilities for implementing state management with cookies * :mod:`http.cookiejar` provides persistence of cookies -:mod:`http` is also a module that defines a number of HTTP status codes and -associated messages through the :class:`http.HTTPStatus` enum: + +The :mod:`http` module also defines the following enums that help you work with http related code: .. class:: HTTPStatus @@ -53,8 +53,8 @@ HTTP status codes ----------------- Supported, -`IANA-registered `_ -status codes available in :class:`http.HTTPStatus` are: +`IANA-registered status codes `_ +available in :class:`http.HTTPStatus` are: ======= =================================== ================================================================== Code Enum Name Details @@ -136,3 +136,46 @@ equal to the constant name (i.e. ``http.HTTPStatus.OK`` is also available as .. versionadded:: 3.9 Added ``103 EARLY_HINTS``, ``418 IM_A_TEAPOT`` and ``425 TOO_EARLY`` status codes. + +.. class:: HTTPMethod + + .. versionadded:: 3.11 + + A subclass of :class:`enum.StrEnum` that defines a set of HTTP methods and descriptions written in English. + + Usage:: + + >>> from http import HTTPMethod + >>> HTTMethod.GET + HTTMethod.GET + >>> HTTMethod.GET == 'GET' + True + >>> HTTMethod.GET.value + 'GET' + >>> HTTMethod.GET.description + 'Transfer a current representation of the target resource.' + >>> list(HTTPMethod) + [HTTPMethod.GET, HTTPMethod.HEAD, ...] + +.. _http-methods: + +HTTP methods +----------------- + +Supported, +`IANA-registered methods `_ +available in :class:`http.HTTPMethod` are: + +=========== =================================== ================================================================== +Method Enum Name Details +=========== =================================== ================================================================== +``GET`` ``GET`` HTTP/1.1 :rfc:`7231`, Section 4.3.1 +``HEAD`` ``HEAD`` HTTP/1.1 :rfc:`7231`, Section 4.3.2 +``POST`` ``POST`` HTTP/1.1 :rfc:`7231`, Section 4.3.3 +``PUT`` ``PUT`` HTTP/1.1 :rfc:`7231`, Section 4.3.4 +``DELETE`` ``DELETE`` HTTP/1.1 :rfc:`7231`, Section 4.3.5 +``CONNECT`` ``CONNECT`` HTTP/1.1 :rfc:`7231`, Section 4.3.6 +``OPTIONS`` ``OPTIONS`` HTTP/1.1 :rfc:`7231`, Section 4.3.7 +``TRACE`` ``TRACE`` HTTP/1.1 :rfc:`7231`, Section 4.3.8 +``PATCH`` ``PATCH`` HTTP/1.1 :rfc:`5789` +=========== =================================== ================================================================== diff --git a/Lib/http/__init__.py b/Lib/http/__init__.py index 8b980e24a5603..cd2885dc7757b 100644 --- a/Lib/http/__init__.py +++ b/Lib/http/__init__.py @@ -1,6 +1,6 @@ -from enum import IntEnum, _simple_enum +from enum import StrEnum, IntEnum, _simple_enum -__all__ = ['HTTPStatus'] +__all__ = ['HTTPStatus', 'HTTPMethod'] @_simple_enum(IntEnum) @@ -149,3 +149,32 @@ def __new__(cls, value, phrase, description=''): NETWORK_AUTHENTICATION_REQUIRED = (511, 'Network Authentication Required', 'The client needs to authenticate to gain network access') + + + at _simple_enum(StrEnum) +class HTTPMethod: + """HTTP methods and descriptions + + Methods from the following RFCs are all observed: + + * RFC 7231: Hypertext Transfer Protocol (HTTP/1.1), obsoletes 2616 + * RFC 5789: PATCH Method for HTTP + """ + def __new__(cls, value, description): + obj = str.__new__(cls, value) + obj._value_ = value + obj.description = description + return obj + + def __repr__(self): + return "<%s.%s>" % (self.__class__.__name__, self._name_) + + CONNECT = 'CONNECT', 'Establish a connection to the server.' + DELETE = 'DELETE', 'Remove the target.' + GET = 'GET', 'Retrieve the target.' + HEAD = 'HEAD', 'Same as GET, but only retrieve the status line and header section.' + OPTIONS = 'OPTIONS', 'Describe the communication options for the target.' + PATCH = 'PATCH', 'Apply partial modifications to a target.' + POST = 'POST', 'Perform target-specific processing with the request payload.' + PUT = 'PUT', 'Replace the target with the request payload.' + TRACE = 'TRACE', 'Perform a message loop-back test along the path to the target.' diff --git a/Misc/ACKS b/Misc/ACKS index 2b9485e7aa80c..91cd4332d6046 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -2004,6 +2004,7 @@ Arnaud Ysmal Bernard Yue Moshe Zadka Bader Zaidan +Yair Zak Elias Zamaria Milan Zamazal Artur Zaprzala diff --git a/Misc/NEWS.d/next/Library/2022-04-27-19-45-58.gh-issue-91996.YEEIzk.rst b/Misc/NEWS.d/next/Library/2022-04-27-19-45-58.gh-issue-91996.YEEIzk.rst new file mode 100644 index 0000000000000..72d9a597a1a59 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-04-27-19-45-58.gh-issue-91996.YEEIzk.rst @@ -0,0 +1 @@ +New http.HTTPMethod enum to represent all the available HTTP request methods in a convenient way From webhook-mailer at python.org Thu May 5 19:10:54 2022 From: webhook-mailer at python.org (tiran) Date: Thu, 05 May 2022 23:10:54 -0000 Subject: [Python-checkins] gh-70363: Emscripten cannot fstat renamed spool file (GH-92354) Message-ID: https://github.com/python/cpython/commit/49fda0cc51c09e26d68431d5f86e11d923cf7b8e commit: 49fda0cc51c09e26d68431d5f86e11d923cf7b8e branch: main author: Christian Heimes committer: tiran date: 2022-05-06T01:10:37+02:00 summary: gh-70363: Emscripten cannot fstat renamed spool file (GH-92354) files: M Lib/test/test_tempfile.py diff --git a/Lib/test/test_tempfile.py b/Lib/test/test_tempfile.py index 07a54028ec697..a05f3c84ccfc9 100644 --- a/Lib/test/test_tempfile.py +++ b/Lib/test/test_tempfile.py @@ -1109,6 +1109,9 @@ def test_del_unrolled_file(self): with self.assertWarns(ResourceWarning): f.__del__() + @unittest.skipIf( + support.is_emscripten, "Emscripten cannot fstat renamed files." + ) def test_del_rolled_file(self): # The rolled file should be deleted when the SpooledTemporaryFile # object is deleted. This should raise a ResourceWarning since the file From webhook-mailer at python.org Thu May 5 19:22:36 2022 From: webhook-mailer at python.org (gpshead) Date: Thu, 05 May 2022 23:22:36 -0000 Subject: [Python-checkins] gh-82616: Add process_group support to subprocess.Popen (#23930) Message-ID: https://github.com/python/cpython/commit/f6dd14c65336cda4e2ebccbc6408dfe3b0a68a34 commit: f6dd14c65336cda4e2ebccbc6408dfe3b0a68a34 branch: main author: Gregory P. Smith committer: gpshead date: 2022-05-05T16:22:32-07:00 summary: gh-82616: Add process_group support to subprocess.Popen (#23930) One more thing that can help prevent people from using `preexec_fn`. Also adds conditional skips to two tests exposing ASAN flakiness on the Ubuntu 20.04 Address Sanitizer Github CI system. When that build is run on more modern systems the "problem" does not show up. It seems ASAN implementation related. Co-authored-by: Zackery Spytz Co-authored-by: Serhiy Storchaka files: A Misc/NEWS.d/next/Library/2020-12-24-19-11-53.bpo-38435.rEHTAR.rst M Doc/library/subprocess.rst M Lib/multiprocessing/util.py M Lib/subprocess.py M Lib/test/test_asyncio/test_subprocess.py M Lib/test/test_capi.py M Lib/test/test_distutils.py M Lib/test/test_subprocess.py M Modules/_posixsubprocess.c diff --git a/Doc/library/subprocess.rst b/Doc/library/subprocess.rst index 1e619a51e216a..ce581abdd1dce 100644 --- a/Doc/library/subprocess.rst +++ b/Doc/library/subprocess.rst @@ -344,7 +344,8 @@ functions. startupinfo=None, creationflags=0, restore_signals=True, \ start_new_session=False, pass_fds=(), *, group=None, \ extra_groups=None, user=None, umask=-1, \ - encoding=None, errors=None, text=None, pipesize=-1) + encoding=None, errors=None, text=None, pipesize=-1, \ + process_group=None) Execute a child program in a new process. On POSIX, the class uses :meth:`os.execvpe`-like behavior to execute the child program. On Windows, @@ -500,18 +501,16 @@ functions. .. warning:: - The *preexec_fn* parameter is not safe to use in the presence of threads + The *preexec_fn* parameter is NOT SAFE to use in the presence of threads in your application. The child process could deadlock before exec is called. - If you must use it, keep it trivial! Minimize the number of libraries - you call into. .. note:: If you need to modify the environment for the child use the *env* parameter rather than doing it in a *preexec_fn*. - The *start_new_session* parameter can take the place of a previously - common use of *preexec_fn* to call os.setsid() in the child. + The *start_new_session* and *process_group* parameters should take the place of + code using *preexec_fn* to call :func:`os.setsid` or :func:`os.setpgid` in the child. .. versionchanged:: 3.8 @@ -568,12 +567,20 @@ functions. .. versionchanged:: 3.2 *restore_signals* was added. - If *start_new_session* is true the setsid() system call will be made in the - child process prior to the execution of the subprocess. (POSIX only) + If *start_new_session* is true the ``setsid()`` system call will be made in the + child process prior to the execution of the subprocess. + .. availability:: POSIX .. versionchanged:: 3.2 *start_new_session* was added. + If *process_group* is a non-negative integer, the ``setpgid(0, value)`` system call will + be made in the child process prior to the execution of the subprocess. + + .. availability:: POSIX + .. versionchanged:: 3.11 + *process_group* was added. + If *group* is not ``None``, the setregid() system call will be made in the child process prior to the execution of the subprocess. If the provided value is a string, it will be looked up via :func:`grp.getgrnam()` and diff --git a/Lib/multiprocessing/util.py b/Lib/multiprocessing/util.py index 6ad4632fccb9e..6ee0d33e88a06 100644 --- a/Lib/multiprocessing/util.py +++ b/Lib/multiprocessing/util.py @@ -453,7 +453,7 @@ def spawnv_passfds(path, args, passfds): return _posixsubprocess.fork_exec( args, [path], True, passfds, None, None, -1, -1, -1, -1, -1, -1, errpipe_read, errpipe_write, - False, False, None, None, None, -1, None, + False, False, -1, None, None, None, -1, None, subprocess._USE_VFORK) finally: os.close(errpipe_read) diff --git a/Lib/subprocess.py b/Lib/subprocess.py index 968cfc14ddf91..9099822d0b5b1 100644 --- a/Lib/subprocess.py +++ b/Lib/subprocess.py @@ -769,6 +769,8 @@ class Popen: start_new_session (POSIX only) + process_group (POSIX only) + group (POSIX only) extra_groups (POSIX only) @@ -794,7 +796,8 @@ def __init__(self, args, bufsize=-1, executable=None, startupinfo=None, creationflags=0, restore_signals=True, start_new_session=False, pass_fds=(), *, user=None, group=None, extra_groups=None, - encoding=None, errors=None, text=None, umask=-1, pipesize=-1): + encoding=None, errors=None, text=None, umask=-1, pipesize=-1, + process_group=None): """Create new Popen instance.""" _cleanup() # Held while anything is calling waitpid before returncode has been @@ -900,6 +903,9 @@ def __init__(self, args, bufsize=-1, executable=None, else: line_buffering = False + if process_group is None: + process_group = -1 # The internal APIs are int-only + gid = None if group is not None: if not hasattr(os, 'setregid'): @@ -1003,7 +1009,7 @@ def __init__(self, args, bufsize=-1, executable=None, errread, errwrite, restore_signals, gid, gids, uid, umask, - start_new_session) + start_new_session, process_group) except: # Cleanup if the child failed starting. for f in filter(None, (self.stdin, self.stdout, self.stderr)): @@ -1387,7 +1393,7 @@ def _execute_child(self, args, executable, preexec_fn, close_fds, unused_restore_signals, unused_gid, unused_gids, unused_uid, unused_umask, - unused_start_new_session): + unused_start_new_session, unused_process_group): """Execute program (MS Windows version)""" assert not pass_fds, "pass_fds not supported on Windows." @@ -1719,7 +1725,7 @@ def _execute_child(self, args, executable, preexec_fn, close_fds, errread, errwrite, restore_signals, gid, gids, uid, umask, - start_new_session): + start_new_session, process_group): """Execute program (POSIX version)""" if isinstance(args, (str, bytes)): @@ -1755,6 +1761,7 @@ def _execute_child(self, args, executable, preexec_fn, close_fds, and (c2pwrite == -1 or c2pwrite > 2) and (errwrite == -1 or errwrite > 2) and not start_new_session + and process_group == -1 and gid is None and gids is None and uid is None @@ -1812,7 +1819,7 @@ def _execute_child(self, args, executable, preexec_fn, close_fds, errread, errwrite, errpipe_read, errpipe_write, restore_signals, start_new_session, - gid, gids, uid, umask, + process_group, gid, gids, uid, umask, preexec_fn, _USE_VFORK) self._child_created = True finally: diff --git a/Lib/test/test_asyncio/test_subprocess.py b/Lib/test/test_asyncio/test_subprocess.py index 14fa6dd76f9ca..09a5c390b3629 100644 --- a/Lib/test/test_asyncio/test_subprocess.py +++ b/Lib/test/test_asyncio/test_subprocess.py @@ -15,6 +15,9 @@ if sys.platform != 'win32': from asyncio import unix_events +if support.check_sanitizer(address=True): + raise unittest.SkipTest("Exposes ASAN flakiness in GitHub CI") + # Program blocking PROGRAM_BLOCKED = [sys.executable, '-c', 'import time; time.sleep(3600)'] diff --git a/Lib/test/test_capi.py b/Lib/test/test_capi.py index ab4caefd35fbf..6d75895589328 100644 --- a/Lib/test/test_capi.py +++ b/Lib/test/test_capi.py @@ -140,7 +140,7 @@ class Z(object): def __len__(self): return 1 self.assertRaises(TypeError, _posixsubprocess.fork_exec, - 1,Z(),3,(1, 2),5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22) + 1,Z(),3,(1, 2),5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23) # Issue #15736: overflow in _PySequence_BytesToCharpArray() class Z(object): def __len__(self): @@ -148,7 +148,7 @@ def __len__(self): def __getitem__(self, i): return b'x' self.assertRaises(MemoryError, _posixsubprocess.fork_exec, - 1,Z(),3,(1, 2),5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22) + 1,Z(),3,(1, 2),5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23) @unittest.skipUnless(_posixsubprocess, '_posixsubprocess required for this test.') def test_subprocess_fork_exec(self): @@ -158,7 +158,7 @@ def __len__(self): # Issue #15738: crash in subprocess_fork_exec() self.assertRaises(TypeError, _posixsubprocess.fork_exec, - Z(),[b'1'],3,(1, 2),5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22) + Z(),[b'1'],3,(1, 2),5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23) @unittest.skipIf(MISSING_C_DOCSTRINGS, "Signature information for builtins requires docstrings") diff --git a/Lib/test/test_distutils.py b/Lib/test/test_distutils.py index d82d2b6423433..28320fb5c0bfd 100644 --- a/Lib/test/test_distutils.py +++ b/Lib/test/test_distutils.py @@ -23,6 +23,8 @@ def load_tests(*_): def tearDownModule(): support.reap_children() +if support.check_sanitizer(address=True): + raise unittest.SkipTest("Exposes ASAN flakiness in GitHub CI") if __name__ == "__main__": unittest.main() diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py index 0764120952ebd..f6854922a5b87 100644 --- a/Lib/test/test_subprocess.py +++ b/Lib/test/test_subprocess.py @@ -1905,14 +1905,32 @@ def test_start_new_session(self): output = subprocess.check_output( [sys.executable, "-c", "import os; print(os.getsid(0))"], start_new_session=True) - except OSError as e: + except PermissionError as e: if e.errno != errno.EPERM: - raise + raise # EACCES? else: parent_sid = os.getsid(0) child_sid = int(output) self.assertNotEqual(parent_sid, child_sid) + @unittest.skipUnless(hasattr(os, 'setpgid') and hasattr(os, 'getpgid'), + 'no setpgid or getpgid on platform') + def test_process_group_0(self): + # For code coverage of calling setpgid(). We don't care if we get an + # EPERM error from it depending on the test execution environment, that + # still indicates that it was called. + try: + output = subprocess.check_output( + [sys.executable, "-c", "import os; print(os.getpgid(0))"], + process_group=0) + except PermissionError as e: + if e.errno != errno.EPERM: + raise # EACCES? + else: + parent_pgid = os.getpgid(0) + child_pgid = int(output) + self.assertNotEqual(parent_pgid, child_pgid) + @unittest.skipUnless(hasattr(os, 'setreuid'), 'no setreuid on platform') def test_user(self): # For code coverage of the user parameter. We don't care if we get an @@ -3134,7 +3152,7 @@ def test_fork_exec(self): True, (), cwd, env_list, -1, -1, -1, -1, 1, 2, 3, 4, - True, True, + True, True, 0, False, [], 0, -1, func, False) # Attempt to prevent @@ -3183,7 +3201,7 @@ def __int__(self): True, fds_to_keep, None, [b"env"], -1, -1, -1, -1, 1, 2, 3, 4, - True, True, + True, True, 0, None, None, None, -1, None, "no vfork") self.assertIn('fds_to_keep', str(c.exception)) diff --git a/Misc/NEWS.d/next/Library/2020-12-24-19-11-53.bpo-38435.rEHTAR.rst b/Misc/NEWS.d/next/Library/2020-12-24-19-11-53.bpo-38435.rEHTAR.rst new file mode 100644 index 0000000000000..b18d6a432427f --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-12-24-19-11-53.bpo-38435.rEHTAR.rst @@ -0,0 +1,2 @@ +Add a ``process_group`` parameter to :class:`subprocess.Popen` to help move +more things off of the unsafe ``preexec_fn`` parameter. diff --git a/Modules/_posixsubprocess.c b/Modules/_posixsubprocess.c index 21c2bd13a3e27..9132f13e8166a 100644 --- a/Modules/_posixsubprocess.c +++ b/Modules/_posixsubprocess.c @@ -517,7 +517,7 @@ child_exec(char *const exec_array[], int errread, int errwrite, int errpipe_read, int errpipe_write, int close_fds, int restore_signals, - int call_setsid, + int call_setsid, pid_t pgid_to_set, int call_setgid, gid_t gid, int call_setgroups, size_t groups_size, const gid_t *groups, int call_setuid, uid_t uid, int child_umask, @@ -611,6 +611,11 @@ child_exec(char *const exec_array[], POSIX_CALL(setsid()); #endif +#ifdef HAVE_SETPGID + if (pgid_to_set >= 0) + POSIX_CALL(setpgid(0, pgid_to_set)); +#endif + #ifdef HAVE_SETGROUPS if (call_setgroups) POSIX_CALL(setgroups(groups_size, groups)); @@ -716,7 +721,7 @@ do_fork_exec(char *const exec_array[], int errread, int errwrite, int errpipe_read, int errpipe_write, int close_fds, int restore_signals, - int call_setsid, + int call_setsid, pid_t pgid_to_set, int call_setgid, gid_t gid, int call_setgroups, size_t groups_size, const gid_t *groups, int call_setuid, uid_t uid, int child_umask, @@ -769,7 +774,7 @@ do_fork_exec(char *const exec_array[], child_exec(exec_array, argv, envp, cwd, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite, errpipe_read, errpipe_write, - close_fds, restore_signals, call_setsid, + close_fds, restore_signals, call_setsid, pgid_to_set, call_setgid, gid, call_setgroups, groups_size, groups, call_setuid, uid, child_umask, child_sigmask, py_fds_to_keep, preexec_fn, preexec_fn_args_tuple); @@ -791,6 +796,7 @@ subprocess_fork_exec(PyObject *module, PyObject *args) int p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite; int errpipe_read, errpipe_write, close_fds, restore_signals; int call_setsid; + pid_t pgid_to_set = -1; int call_setgid = 0, call_setgroups = 0, call_setuid = 0; uid_t uid; gid_t gid, *groups = NULL; @@ -806,13 +812,13 @@ subprocess_fork_exec(PyObject *module, PyObject *args) int allow_vfork; if (!PyArg_ParseTuple( - args, "OOpO!OOiiiiiiiiiiOOOiOp:fork_exec", + args, "OOpO!OOiiiiiiiiii" _Py_PARSE_PID "OOOiOp:fork_exec", &process_args, &executable_list, &close_fds, &PyTuple_Type, &py_fds_to_keep, &cwd_obj, &env_list, &p2cread, &p2cwrite, &c2pread, &c2pwrite, &errread, &errwrite, &errpipe_read, &errpipe_write, - &restore_signals, &call_setsid, + &restore_signals, &call_setsid, &pgid_to_set, &gid_object, &groups_list, &uid_object, &child_umask, &preexec_fn, &allow_vfork)) return NULL; @@ -1016,7 +1022,7 @@ subprocess_fork_exec(PyObject *module, PyObject *args) pid = do_fork_exec(exec_array, argv, envp, cwd, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite, errpipe_read, errpipe_write, - close_fds, restore_signals, call_setsid, + close_fds, restore_signals, call_setsid, pgid_to_set, call_setgid, gid, call_setgroups, num_groups, groups, call_setuid, uid, child_umask, old_sigmask, py_fds_to_keep, preexec_fn, preexec_fn_args_tuple); @@ -1081,7 +1087,7 @@ PyDoc_STRVAR(subprocess_fork_exec_doc, "fork_exec(args, executable_list, close_fds, pass_fds, cwd, env,\n\ p2cread, p2cwrite, c2pread, c2pwrite,\n\ errread, errwrite, errpipe_read, errpipe_write,\n\ - restore_signals, call_setsid,\n\ + restore_signals, call_setsid, pgid_to_set,\n\ gid, groups_list, uid,\n\ preexec_fn)\n\ \n\ From webhook-mailer at python.org Thu May 5 19:34:22 2022 From: webhook-mailer at python.org (vstinner) Date: Thu, 05 May 2022 23:34:22 -0000 Subject: [Python-checkins] gh-57684: Add -P cmdline option and PYTHONSAFEPATH env var (#31542) Message-ID: https://github.com/python/cpython/commit/ada8b6d1b1b02ae7c38f161c2a0ad866559fe18b commit: ada8b6d1b1b02ae7c38f161c2a0ad866559fe18b branch: main author: Victor Stinner committer: vstinner date: 2022-05-06T01:34:11+02:00 summary: gh-57684: Add -P cmdline option and PYTHONSAFEPATH env var (#31542) Add the -P command line option and the PYTHONSAFEPATH environment variable to not prepend a potentially unsafe path to sys.path. * Add sys.flags.safe_path flag. * Add PyConfig.safe_path member. * Programs/_bootstrap_python.c uses config.safe_path=0. * Update subprocess._optim_args_from_interpreter_flags() to handle the -P command line option. * Modules/getpath.py sets safe_path to 1 if a "._pth" file is present. files: A Misc/NEWS.d/next/Security/2022-05-04-14-32-24.gh-issue-57684.HrlDrM.rst M Doc/c-api/init_config.rst M Doc/library/sys.rst M Doc/using/cmdline.rst M Doc/whatsnew/3.11.rst M Include/cpython/initconfig.h M Lib/subprocess.py M Lib/test/test_cmd_line.py M Lib/test/test_embed.py M Lib/test/test_support.py M Lib/test/test_sys.py M Misc/python.man M Modules/getpath.py M Modules/main.c M Programs/_bootstrap_python.c M Programs/_testembed.c M Python/dynload_win.c M Python/getopt.c M Python/initconfig.c M Python/sysmodule.c diff --git a/Doc/c-api/init_config.rst b/Doc/c-api/init_config.rst index bab5313dd9ec7..728df2100336e 100644 --- a/Doc/c-api/init_config.rst +++ b/Doc/c-api/init_config.rst @@ -543,6 +543,25 @@ PyConfig See also the :c:member:`~PyConfig.orig_argv` member. + .. c:member:: int safe_path + + If equals to zero, ``Py_RunMain()`` prepends a potentially unsafe path to + :data:`sys.path` at startup: + + * If :c:member:`argv[0] ` is equal to ``L"-m"`` + (``python -m module``), prepend the current working directory. + * If running a script (``python script.py``), prepend the script's + directory. If it's a symbolic link, resolve symbolic links. + * Otherwise (``python -c code`` and ``python``), prepend an empty string, + which means the current working directory. + + Set to 1 by the :option:`-P` command line option and the + :envvar:`PYTHONSAFEPATH` environment variable. + + Default: ``0`` in Python config, ``1`` in isolated config. + + .. versionadded:: 3.11 + .. c:member:: wchar_t* base_exec_prefix :data:`sys.base_exec_prefix`. @@ -809,13 +828,14 @@ PyConfig If greater than 0, enable isolated mode: - * :data:`sys.path` contains neither the script's directory (computed from - ``argv[0]`` or the current directory) nor the user's site-packages - directory. + * Set :c:member:`~PyConfig.safe_path` to 1: + don't prepend a potentially unsafe path to :data:`sys.path` at Python + startup. + * Set :c:member:`~PyConfig.use_environment` to 0. + * Set :c:member:`~PyConfig.user_site_directory` to 0: don't add the user + site directory to :data:`sys.path`. * Python REPL doesn't import :mod:`readline` nor enable default readline configuration on interactive prompts. - * Set :c:member:`~PyConfig.use_environment` and - :c:member:`~PyConfig.user_site_directory` to 0. Default: ``0`` in Python mode, ``1`` in isolated mode. @@ -1029,12 +1049,13 @@ PyConfig .. c:member:: wchar_t* run_filename Filename passed on the command line: trailing command line argument - without :option:`-c` or :option:`-m`. + without :option:`-c` or :option:`-m`. It is used by the + :c:func:`Py_RunMain` function. For example, it is set to ``script.py`` by the ``python3 script.py arg`` - command. + command line. - Used by :c:func:`Py_RunMain`. + See also the :c:member:`PyConfig.skip_source_first_line` option. Default: ``NULL``. @@ -1419,9 +1440,16 @@ site-package directory to :data:`sys.path`. The following configuration files are used by the path configuration: * ``pyvenv.cfg`` -* ``python._pth`` (Windows only) +* ``._pth`` file (ex: ``python._pth``) * ``pybuilddir.txt`` (Unix only) +If a ``._pth`` file is present: + +* Set :c:member:`~PyConfig.isolated` to 1. +* Set :c:member:`~PyConfig.use_environment` to 0. +* Set :c:member:`~PyConfig.site_import` to 0. +* Set :c:member:`~PyConfig.safe_path` to 1. + The ``__PYVENV_LAUNCHER__`` environment variable is used to set :c:member:`PyConfig.base_executable` diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst index f43344887e421..5f3b9b5776cb8 100644 --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -520,6 +520,7 @@ always available. :const:`hash_randomization` :option:`-R` :const:`dev_mode` :option:`-X dev <-X>` (:ref:`Python Development Mode `) :const:`utf8_mode` :option:`-X utf8 <-X>` + :const:`safe_path` :option:`-P` ============================= ================================================================ .. versionchanged:: 3.2 @@ -539,6 +540,9 @@ always available. Mode ` and the ``utf8_mode`` attribute for the new :option:`-X` ``utf8`` flag. + .. versionchanged:: 3.11 + Added the ``safe_path`` attribute for :option:`-P` option. + .. data:: float_info @@ -1138,15 +1142,19 @@ always available. the environment variable :envvar:`PYTHONPATH`, plus an installation-dependent default. - As initialized upon program startup, the first item of this list, ``path[0]``, - is the directory containing the script that was used to invoke the Python - interpreter. If the script directory is not available (e.g. if the interpreter - is invoked interactively or if the script is read from standard input), - ``path[0]`` is the empty string, which directs Python to search modules in the - current directory first. Notice that the script directory is inserted *before* - the entries inserted as a result of :envvar:`PYTHONPATH`. + By default, as initialized upon program startup, a potentially unsafe path + is prepended to :data:`sys.path` (*before* the entries inserted as a result + of :envvar:`PYTHONPATH`): + + * ``python -m module`` command line: prepend the current working + directory. + * ``python script.py`` command line: prepend the script's directory. + If it's a symbolic link, resolve symbolic links. + * ``python -c code`` and ``python`` (REPL) command lines: prepend an empty + string, which means the current working directory. - The initialization of :data:`sys.path` is documented at :ref:`sys-path-init`. + To not prepend this potentially unsafe path, use the :option:`-P` command + line option or the :envvar:`PYTHONSAFEPATH` environment variable? A program is free to modify this list for its own purposes. Only strings and bytes should be added to :data:`sys.path`; all other data types are diff --git a/Doc/using/cmdline.rst b/Doc/using/cmdline.rst index d341ea8bb43c8..668459f352008 100644 --- a/Doc/using/cmdline.rst +++ b/Doc/using/cmdline.rst @@ -257,6 +257,8 @@ Miscellaneous options Ignore all :envvar:`PYTHON*` environment variables, e.g. :envvar:`PYTHONPATH` and :envvar:`PYTHONHOME`, that might be set. + See also the :option:`-P` and :option:`-I` (isolated) options. + .. cmdoption:: -i @@ -271,7 +273,9 @@ Miscellaneous options .. cmdoption:: -I - Run Python in isolated mode. This also implies -E and -s. + Run Python in isolated mode. This also implies :option:`-E`, :option:`-P` + and :option:`-s` options. + In isolated mode :data:`sys.path` contains neither the script's directory nor the user's site-packages directory. All :envvar:`PYTHON*` environment variables are ignored, too. Further restrictions may be imposed to prevent @@ -301,6 +305,23 @@ Miscellaneous options Modify ``.pyc`` filenames according to :pep:`488`. +.. cmdoption:: -P + + Don't prepend a potentially unsafe path to :data:`sys.path`: + + * ``python -m module`` command line: Don't prepend the current working + directory. + * ``python script.py`` command line: Don't prepend the script's directory. + If it's a symbolic link, resolve symbolic links. + * ``python -c code`` and ``python`` (REPL) command lines: Don't prepend an + empty string, which means the current working directory. + + See also the :envvar:`PYTHONSAFEPATH` environment variable, and :option:`-E` + and :option:`-I` (isolated) options. + + .. versionadded:: 3.11 + + .. cmdoption:: -q Don't display the copyright and version messages even in interactive mode. @@ -583,6 +604,14 @@ conflict. within a Python program as the variable :data:`sys.path`. +.. envvar:: PYTHONSAFEPATH + + If this is set to a non-empty string, don't prepend a potentially unsafe + path to :data:`sys.path`: see the :option:`-P` option for details. + + .. versionadded:: 3.11 + + .. envvar:: PYTHONPLATLIBDIR If this is set to a non-empty string, it overrides the :data:`sys.platlibdir` diff --git a/Doc/whatsnew/3.11.rst b/Doc/whatsnew/3.11.rst index 2f32b56423de7..87dc5ddb4e611 100644 --- a/Doc/whatsnew/3.11.rst +++ b/Doc/whatsnew/3.11.rst @@ -362,6 +362,11 @@ Other Language Changes pickles instance attributes implemented as :term:`slots <__slots__>`. (Contributed by Serhiy Storchaka in :issue:`26579`.) +* Add :option:`-P` command line option and :envvar:`PYTHONSAFEPATH` environment + variable to not prepend a potentially unsafe path to :data:`sys.path` such as + the current directory, the script's directory or an empty string. + (Contributed by Victor Stinner in :gh:`57684`.) + Other CPython Implementation Changes ==================================== @@ -636,6 +641,9 @@ sys (equivalent to ``sys.exc_info()[1]``). (Contributed by Irit Katriel in :issue:`46328`.) +* Add the :data:`sys.flags.safe_path ` flag. + (Contributed by Victor Stinner in :gh:`57684`.) + sysconfig --------- @@ -1480,6 +1488,8 @@ New Features representation of exceptions. (Contributed by Irit Katriel in :issue:`46343`.) +* Added the :c:member:`PyConfig.safe_path` member. + (Contributed by Victor Stinner in :gh:`57684`.) Porting to Python 3.11 ---------------------- diff --git a/Include/cpython/initconfig.h b/Include/cpython/initconfig.h index 2ba1224d9b0b0..3b6d59389f26b 100644 --- a/Include/cpython/initconfig.h +++ b/Include/cpython/initconfig.h @@ -176,6 +176,7 @@ typedef struct PyConfig { #endif wchar_t *check_hash_pycs_mode; int use_frozen_modules; + int safe_path; /* --- Path configuration inputs ------------ */ int pathconfig_warnings; diff --git a/Lib/subprocess.py b/Lib/subprocess.py index 9099822d0b5b1..6e61cc2e5e7b0 100644 --- a/Lib/subprocess.py +++ b/Lib/subprocess.py @@ -313,12 +313,14 @@ def _args_from_interpreter_flags(): args.append('-E') if sys.flags.no_user_site: args.append('-s') + if sys.flags.safe_path: + args.append('-P') # -W options warnopts = sys.warnoptions[:] - bytes_warning = sys.flags.bytes_warning xoptions = getattr(sys, '_xoptions', {}) - dev_mode = ('dev' in xoptions) + bytes_warning = sys.flags.bytes_warning + dev_mode = sys.flags.dev_mode if bytes_warning > 1: warnopts.remove("error::BytesWarning") diff --git a/Lib/test/test_cmd_line.py b/Lib/test/test_cmd_line.py index e8f1964c2a40d..26506312185cf 100644 --- a/Lib/test/test_cmd_line.py +++ b/Lib/test/test_cmd_line.py @@ -579,13 +579,13 @@ def test_unknown_options(self): 'Cannot run -I tests when PYTHON env vars are required.') def test_isolatedmode(self): self.verify_valid_flag('-I') - self.verify_valid_flag('-IEs') + self.verify_valid_flag('-IEPs') rc, out, err = assert_python_ok('-I', '-c', 'from sys import flags as f; ' - 'print(f.no_user_site, f.ignore_environment, f.isolated)', + 'print(f.no_user_site, f.ignore_environment, f.isolated, f.safe_path)', # dummyvar to prevent extraneous -E dummyvar="") - self.assertEqual(out.strip(), b'1 1 1') + self.assertEqual(out.strip(), b'1 1 1 True') with os_helper.temp_cwd() as tmpdir: fake = os.path.join(tmpdir, "uuid.py") main = os.path.join(tmpdir, "main.py") @@ -880,7 +880,8 @@ def test_sys_flags_not_set(self): # Issue 31845: a startup refactoring broke reading flags from env vars expected_outcome = """ (sys.flags.debug == sys.flags.optimize == - sys.flags.dont_write_bytecode == sys.flags.verbose == 0) + sys.flags.dont_write_bytecode == + sys.flags.verbose == sys.flags.safe_path == 0) """ self.run_ignoring_vars( expected_outcome, @@ -888,6 +889,7 @@ def test_sys_flags_not_set(self): PYTHONOPTIMIZE="1", PYTHONDONTWRITEBYTECODE="1", PYTHONVERBOSE="1", + PYTHONSAFEPATH="1", ) class SyntaxErrorTests(unittest.TestCase): diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index e25541820748b..169ae5cb0a06e 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -479,6 +479,7 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): '_init_main': 1, '_isolated_interpreter': 0, 'use_frozen_modules': not Py_DEBUG, + 'safe_path': 0, '_is_python_build': IGNORE_CONFIG, } if MS_WINDOWS: @@ -496,6 +497,7 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): isolated=1, use_environment=0, user_site_directory=0, + safe_path=1, dev_mode=0, install_signal_handlers=0, use_hash_seed=0, @@ -855,6 +857,7 @@ def test_init_from_config(self): 'faulthandler': 1, 'platlibdir': 'my_platlibdir', 'module_search_paths': self.IGNORE_CONFIG, + 'safe_path': 1, 'check_hash_pycs_mode': 'always', 'pathconfig_warnings': 0, @@ -889,6 +892,7 @@ def test_init_compat_env(self): 'warnoptions': ['EnvVar'], 'platlibdir': 'env_platlibdir', 'module_search_paths': self.IGNORE_CONFIG, + 'safe_path': 1, } self.check_all_configs("test_init_compat_env", config, preconfig, api=API_COMPAT) @@ -919,6 +923,7 @@ def test_init_python_env(self): 'warnoptions': ['EnvVar'], 'platlibdir': 'env_platlibdir', 'module_search_paths': self.IGNORE_CONFIG, + 'safe_path': 1, } self.check_all_configs("test_init_python_env", config, preconfig, api=API_PYTHON) @@ -959,12 +964,13 @@ def test_preinit_parse_argv(self): } config = { 'argv': ['script.py'], - 'orig_argv': ['python3', '-X', 'dev', 'script.py'], + 'orig_argv': ['python3', '-X', 'dev', '-P', 'script.py'], 'run_filename': os.path.abspath('script.py'), 'dev_mode': 1, 'faulthandler': 1, 'warnoptions': ['default'], 'xoptions': ['dev'], + 'safe_path': 1, } self.check_all_configs("test_preinit_parse_argv", config, preconfig, api=API_PYTHON) @@ -975,7 +981,7 @@ def test_preinit_dont_parse_argv(self): 'isolated': 0, } argv = ["python3", - "-E", "-I", + "-E", "-I", "-P", "-X", "dev", "-X", "utf8", "script.py"] @@ -990,6 +996,7 @@ def test_preinit_dont_parse_argv(self): def test_init_isolated_flag(self): config = { 'isolated': 1, + 'safe_path': 1, 'use_environment': 0, 'user_site_directory': 0, } @@ -999,6 +1006,7 @@ def test_preinit_isolated1(self): # _PyPreConfig.isolated=1, _PyCoreConfig.isolated not set config = { 'isolated': 1, + 'safe_path': 1, 'use_environment': 0, 'user_site_directory': 0, } @@ -1008,6 +1016,7 @@ def test_preinit_isolated2(self): # _PyPreConfig.isolated=0, _PyCoreConfig.isolated=1 config = { 'isolated': 1, + 'safe_path': 1, 'use_environment': 0, 'user_site_directory': 0, } diff --git a/Lib/test/test_support.py b/Lib/test/test_support.py index 90e971deb397f..dce49809385c6 100644 --- a/Lib/test/test_support.py +++ b/Lib/test/test_support.py @@ -522,6 +522,7 @@ def test_args_from_interpreter_flags(self): ['-E'], ['-v'], ['-b'], + ['-P'], ['-q'], ['-I'], # same option multiple times @@ -541,7 +542,8 @@ def test_args_from_interpreter_flags(self): with self.subTest(opts=opts): self.check_options(opts, 'args_from_interpreter_flags') - self.check_options(['-I', '-E', '-s'], 'args_from_interpreter_flags', + self.check_options(['-I', '-E', '-s', '-P'], + 'args_from_interpreter_flags', ['-I']) def test_optim_args_from_interpreter_flags(self): diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py index bbf01b6a39011..8aaf23272607b 100644 --- a/Lib/test/test_sys.py +++ b/Lib/test/test_sys.py @@ -669,10 +669,10 @@ def test_sys_flags(self): "dont_write_bytecode", "no_user_site", "no_site", "ignore_environment", "verbose", "bytes_warning", "quiet", "hash_randomization", "isolated", "dev_mode", "utf8_mode", - "warn_default_encoding") + "warn_default_encoding", "safe_path") for attr in attrs: self.assertTrue(hasattr(sys.flags, attr), attr) - attr_type = bool if attr == "dev_mode" else int + attr_type = bool if attr in ("dev_mode", "safe_path") else int self.assertEqual(type(getattr(sys.flags, attr)), attr_type, attr) self.assertTrue(repr(sys.flags)) self.assertEqual(len(sys.flags), len(attrs)) diff --git a/Misc/NEWS.d/next/Security/2022-05-04-14-32-24.gh-issue-57684.HrlDrM.rst b/Misc/NEWS.d/next/Security/2022-05-04-14-32-24.gh-issue-57684.HrlDrM.rst new file mode 100644 index 0000000000000..f7cddccdaa782 --- /dev/null +++ b/Misc/NEWS.d/next/Security/2022-05-04-14-32-24.gh-issue-57684.HrlDrM.rst @@ -0,0 +1,3 @@ +Add the :option:`-P` command line option and the :envvar:`PYTHONSAFEPATH` +environment variable to not prepend a potentially unsafe path to +:data:`sys.path`. Patch by Victor Stinner. diff --git a/Misc/python.man b/Misc/python.man index 45a49271d4dfe..c2e7e507e2fd6 100644 --- a/Misc/python.man +++ b/Misc/python.man @@ -43,6 +43,9 @@ python \- an interpreted, interactive, object-oriented programming language .B \-OO ] [ +.B \-P +] +[ .B \-s ] [ @@ -154,7 +157,7 @@ useful to inspect global variables or a stack trace when a script raises an exception. .TP .B \-I -Run Python in isolated mode. This also implies \fB\-E\fP and \fB\-s\fP. In +Run Python in isolated mode. This also implies \fB\-E\fP, \fB\-P\fP and \fB\-s\fP. In isolated mode sys.path contains neither the script's directory nor the user's site-packages directory. All PYTHON* environment variables are ignored, too. Further restrictions may be imposed to prevent the user from injecting @@ -177,6 +180,11 @@ adding .opt-1 before the .pyc extension. Do \fB-O\fP and also discard docstrings; change the filename for compiled (bytecode) files by adding .opt-2 before the .pyc extension. .TP +.B \-P +Don't automatically prepend a potentially unsafe path to \fBsys.path\fP such +as the current directory, the script's directory or an empty string. See also the +\fBPYTHONSAFEPATH\fP environment variable. +.TP .B \-q Do not print the version and copyright messages. These messages are also suppressed in non-interactive mode. @@ -398,6 +406,10 @@ needed for developing Python extensions and embedding the interpreter. .RE .SH ENVIRONMENT VARIABLES +.IP PYTHONSAFEPATH +If this is set to a non-empty string, don't automatically prepend a potentially +unsafe path to \fBsys.path\fP such as the current directory, the script's +directory or an empty string. See also the \fB\-P\fP option. .IP PYTHONHOME Change the location of the standard Python libraries. By default, the libraries are searched in ${prefix}/lib/python and diff --git a/Modules/getpath.py b/Modules/getpath.py index 26465c88aaea5..9aff19c0af7ed 100644 --- a/Modules/getpath.py +++ b/Modules/getpath.py @@ -717,6 +717,7 @@ def search_up(prefix, *landmarks, test=isfile): config['isolated'] = 1 config['use_environment'] = 0 config['site_import'] = 0 + config['safe_path'] = 1 pythonpath = [] for line in pth: line = line.partition('#')[0].strip() diff --git a/Modules/main.c b/Modules/main.c index 624c0f3946085..cca669bdbf4b8 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -570,7 +570,7 @@ pymain_run_python(int *exitcode) goto error; } } - else if (!config->isolated) { + else if (!config->safe_path) { PyObject *path0 = NULL; int res = _PyPathConfig_ComputeSysPath0(&config->argv, &path0); if (res < 0) { diff --git a/Programs/_bootstrap_python.c b/Programs/_bootstrap_python.c index f6b49c8c806a1..6ecbf0c72b5ff 100644 --- a/Programs/_bootstrap_python.c +++ b/Programs/_bootstrap_python.c @@ -71,6 +71,7 @@ main(int argc, char **argv) config.parse_argv = 1; // add current script dir to sys.path config.isolated = 0; + config.safe_path = 0; #ifdef MS_WINDOWS status = PyConfig_SetArgv(&config, argc, argv); diff --git a/Programs/_testembed.c b/Programs/_testembed.c index 3830dc3f8b6ec..9d3d0cbddf0e5 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -676,6 +676,8 @@ static int test_init_from_config(void) Py_FrozenFlag = 0; config.pathconfig_warnings = 0; + config.safe_path = 1; + config._isolated_interpreter = 1; init_from_config_clear(&config); @@ -742,6 +744,7 @@ static void set_most_env_vars(void) putenv("PYTHONFAULTHANDLER=1"); putenv("PYTHONIOENCODING=iso8859-1:replace"); putenv("PYTHONPLATLIBDIR=env_platlibdir"); + putenv("PYTHONSAFEPATH=1"); } @@ -823,6 +826,10 @@ static int test_init_isolated_flag(void) Py_IsolatedFlag = 0; config.isolated = 1; + // These options are set to 1 by isolated=1 + config.safe_path = 0; + config.use_environment = 1; + config.user_site_directory = 1; config_set_program_name(&config); set_all_env_vars(); @@ -901,6 +908,7 @@ static int test_preinit_dont_parse_argv(void) wchar_t *argv[] = {L"python3", L"-E", L"-I", + L"-P", L"-X", L"dev", L"-X", L"utf8", L"script.py"}; @@ -934,7 +942,7 @@ static int test_preinit_parse_argv(void) /* Pre-initialize implicitly using argv: make sure that -X dev is used to configure the allocation in preinitialization */ - wchar_t *argv[] = {L"python3", L"-X", L"dev", L"script.py"}; + wchar_t *argv[] = {L"python3", L"-X", L"dev", L"-P", L"script.py"}; config_set_argv(&config, Py_ARRAY_LENGTH(argv), argv); config_set_program_name(&config); init_from_config_clear(&config); diff --git a/Python/dynload_win.c b/Python/dynload_win.c index 854b1e64c15fa..b43e9fc26f614 100644 --- a/Python/dynload_win.c +++ b/Python/dynload_win.c @@ -3,7 +3,6 @@ #include "Python.h" #include "pycore_fileutils.h" // _Py_add_relfile() -#include "pycore_pathconfig.h" // _PyPathConfig_ComputeSysPath0() #include "pycore_pystate.h" // _PyInterpreterState_GET() #ifdef HAVE_DIRECT_H diff --git a/Python/getopt.c b/Python/getopt.c index 2e3891aae2d16..fcea60759d12c 100644 --- a/Python/getopt.c +++ b/Python/getopt.c @@ -41,7 +41,7 @@ static const wchar_t *opt_ptr = L""; /* Python command line short and long options */ -#define SHORT_OPTS L"bBc:dEhiIJm:OqRsStuvVW:xX:?" +#define SHORT_OPTS L"bBc:dEhiIJm:OPqRsStuvVW:xX:?" static const _PyOS_LongOption longopts[] = { {L"check-hash-based-pycs", 1, 0}, diff --git a/Python/initconfig.c b/Python/initconfig.c index d928ebe88553a..265c7ca8e8f76 100644 --- a/Python/initconfig.c +++ b/Python/initconfig.c @@ -49,6 +49,7 @@ static const char usage_2[] = "\ .pyc extension; also PYTHONOPTIMIZE=x\n\ -OO : do -O changes and also discard docstrings; add .opt-2 before\n\ .pyc extension\n\ +-P : don't add sys.path[0]\n\ -q : don't print version and copyright messages on interactive startup\n\ -s : don't add user site directory to sys.path; also PYTHONNOUSERSITE\n\ -S : don't imply 'import site' on initialization\n\ @@ -113,6 +114,7 @@ PYTHONPATH : '%lc'-separated list of directories prefixed to the\n\ default module search path. The result is sys.path.\n\ "; static const char usage_5[] = +"PYTHONSAFEPATH: don't prepend a potentially unsafe path to sys.path.\n" "PYTHONHOME : alternate directory (or %lc).\n" " The default module search path uses %s.\n" "PYTHONPLATLIBDIR : override sys.platlibdir.\n" @@ -647,6 +649,10 @@ config_check_consistency(const PyConfig *config) assert(config->check_hash_pycs_mode != NULL); assert(config->_install_importlib >= 0); assert(config->pathconfig_warnings >= 0); + assert(config->_is_python_build >= 0); + assert(config->safe_path >= 0); + // config->use_frozen_modules is initialized later + // by _PyConfig_InitImportConfig(). return 1; } #endif @@ -737,6 +743,7 @@ _PyConfig_InitCompatConfig(PyConfig *config) #else config->use_frozen_modules = 1; #endif + config->safe_path = 0; config->_is_python_build = 0; config->code_debug_ranges = 1; } @@ -792,6 +799,7 @@ PyConfig_InitIsolatedConfig(PyConfig *config) config->use_hash_seed = 0; config->faulthandler = 0; config->tracemalloc = 0; + config->safe_path = 1; config->pathconfig_warnings = 0; #ifdef MS_WINDOWS config->legacy_windows_stdio = 0; @@ -959,6 +967,7 @@ _PyConfig_Copy(PyConfig *config, const PyConfig *config2) COPY_ATTR(_init_main); COPY_ATTR(_isolated_interpreter); COPY_ATTR(use_frozen_modules); + COPY_ATTR(safe_path); COPY_WSTRLIST(orig_argv); COPY_ATTR(_is_python_build); @@ -1065,6 +1074,7 @@ _PyConfig_AsDict(const PyConfig *config) SET_ITEM_INT(_isolated_interpreter); SET_ITEM_WSTRLIST(orig_argv); SET_ITEM_INT(use_frozen_modules); + SET_ITEM_INT(safe_path); SET_ITEM_INT(_is_python_build); return dict; @@ -1350,6 +1360,7 @@ _PyConfig_FromDict(PyConfig *config, PyObject *dict) GET_UINT(_init_main); GET_UINT(_isolated_interpreter); GET_UINT(use_frozen_modules); + GET_UINT(safe_path); GET_UINT(_is_python_build); #undef CHECK_VALUE @@ -1633,6 +1644,10 @@ config_read_env_vars(PyConfig *config) } } + if (config_get_env(config, "PYTHONSAFEPATH")) { + config->safe_path = 1; + } + return _PyStatus_OK(); } @@ -2000,6 +2015,7 @@ config_init_import(PyConfig *config, int compute_path_config) "(expected \"on\" or \"off\")"); } + assert(config->use_frozen_modules >= 0); return _PyStatus_OK(); } @@ -2327,6 +2343,10 @@ config_parse_cmdline(PyConfig *config, PyWideStringList *warnoptions, config->optimization_level++; break; + case 'P': + config->safe_path = 1; + break; + case 'B': config->write_bytecode = 0; break; @@ -2849,6 +2869,7 @@ _PyConfig_Read(PyConfig *config, int compute_path_config) assert(config->isolated >= 0); if (config->isolated) { + config->safe_path = 1; config->use_environment = 0; config->user_site_directory = 0; } @@ -2994,6 +3015,7 @@ _Py_DumpPathConfig(PyThreadState *tstate) PySys_WriteStderr(" isolated = %i\n", config->isolated); PySys_WriteStderr(" environment = %i\n", config->use_environment); PySys_WriteStderr(" user site = %i\n", config->user_site_directory); + PySys_WriteStderr(" safe_path = %i\n", config->safe_path); PySys_WriteStderr(" import site = %i\n", config->site_import); PySys_WriteStderr(" is in build tree = %i\n", config->_is_python_build); DUMP_CONFIG("stdlib dir", stdlib_dir); diff --git a/Python/sysmodule.c b/Python/sysmodule.c index d5a62fc12b668..edd1d1f23fdea 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -2479,6 +2479,7 @@ static PyStructSequence_Field flags_fields[] = { {"dev_mode", "-X dev"}, {"utf8_mode", "-X utf8"}, {"warn_default_encoding", "-X warn_default_encoding"}, + {"safe_path", "-P"}, {0} }; @@ -2486,7 +2487,7 @@ static PyStructSequence_Desc flags_desc = { "sys.flags", /* name */ flags__doc__, /* doc */ flags_fields, /* fields */ - 16 + 17 }; static int @@ -2526,6 +2527,7 @@ set_flags_from_config(PyInterpreterState *interp, PyObject *flags) SetFlagObj(PyBool_FromLong(config->dev_mode)); SetFlag(preconfig->utf8_mode); SetFlag(config->warn_default_encoding); + SetFlagObj(PyBool_FromLong(config->safe_path)); #undef SetFlagObj #undef SetFlag return 0; From webhook-mailer at python.org Thu May 5 20:31:28 2022 From: webhook-mailer at python.org (pganssle) Date: Fri, 06 May 2022 00:31:28 -0000 Subject: [Python-checkins] gh-80010: Expand fromisoformat to include most of ISO-8601 (#92177) Message-ID: https://github.com/python/cpython/commit/1303f8c927227b72d9ee9eae890be4692b4d4592 commit: 1303f8c927227b72d9ee9eae890be4692b4d4592 branch: main author: Paul Ganssle <1377457+pganssle at users.noreply.github.com> committer: pganssle <1377457+pganssle at users.noreply.github.com> date: 2022-05-05T18:31:24-06:00 summary: gh-80010: Expand fromisoformat to include most of ISO-8601 (#92177) This expands `fromisoformat` to cover most of the common uses of ISO 8601. We may expand the scope more in the future. files: A Misc/NEWS.d/next/Library/2022-05-03-12-11-27.gh-issue-80010.yG54RE.rst M Doc/library/datetime.rst M Doc/whatsnew/3.11.rst M Lib/datetime.py M Lib/test/datetimetester.py M Modules/_datetimemodule.c diff --git a/Doc/library/datetime.rst b/Doc/library/datetime.rst index ca17dc880cfb3..e0b28d7cb978d 100644 --- a/Doc/library/datetime.rst +++ b/Doc/library/datetime.rst @@ -526,18 +526,20 @@ Other constructors, all class methods: .. classmethod:: date.fromisoformat(date_string) - Return a :class:`date` corresponding to a *date_string* given in the format - ``YYYY-MM-DD``:: + Return a :class:`date` corresponding to a *date_string* given in any valid + ISO 8601 format, except ordinal dates (e.g. ``YYYY-DDD``):: >>> from datetime import date >>> date.fromisoformat('2019-12-04') datetime.date(2019, 12, 4) - - This is the inverse of :meth:`date.isoformat`. It only supports the format - ``YYYY-MM-DD``. + >>> date.fromisoformat('20191204') + datetime.date(2019, 12, 4) + >>> date.fromisoformat('2021-W01-1') + datetime.date(2021, 1, 4) .. versionadded:: 3.7 - + .. versionchanged:: 3.11 + Previously, this method only supported the format ``YYYY-MM-DD``. .. classmethod:: date.fromisocalendar(year, week, day) @@ -710,8 +712,6 @@ Instance methods: >>> date(2002, 12, 4).isoformat() '2002-12-04' - This is the inverse of :meth:`date.fromisoformat`. - .. method:: date.__str__() For a date *d*, ``str(d)`` is equivalent to ``d.isoformat()``. @@ -994,31 +994,29 @@ Other constructors, all class methods: .. classmethod:: datetime.fromisoformat(date_string) - Return a :class:`.datetime` corresponding to a *date_string* in one of the - formats emitted by :meth:`date.isoformat` and :meth:`datetime.isoformat`. - - Specifically, this function supports strings in the format: + Return a :class:`.datetime` corresponding to a *date_string* in any valid + ISO 8601 format, with the following exceptions: - .. code-block:: none - - YYYY-MM-DD[*HH[:MM[:SS[.fff[fff]]]][+HH:MM[:SS[.ffffff]]]] - - where ``*`` can match any single character. - - .. caution:: - - This does *not* support parsing arbitrary ISO 8601 strings - it is only intended - as the inverse operation of :meth:`datetime.isoformat`. A more full-featured - ISO 8601 parser, ``dateutil.parser.isoparse`` is available in the third-party package - `dateutil `__. + 1. Time zone offsets may have fractional seconds. + 2. The `T` separator may be replaced by any single unicode character. + 3. Ordinal dates are not currently supported. + 4. Fractional hours and minutes are not supported. Examples:: >>> from datetime import datetime >>> datetime.fromisoformat('2011-11-04') datetime.datetime(2011, 11, 4, 0, 0) + >>> datetime.fromisoformat('20111104') + datetime.datetime(2011, 11, 4, 0, 0) >>> datetime.fromisoformat('2011-11-04T00:05:23') datetime.datetime(2011, 11, 4, 0, 5, 23) + >>> datetime.fromisoformat('2011-11-04T00:05:23Z') + datetime.datetime(2011, 11, 4, 0, 5, 23, tzinfo=datetime.timezone.utc) + >>> datetime.fromisoformat('20111104T000523') + datetime.datetime(2011, 11, 4, 0, 5, 23) + >>> datetime.fromisoformat('2011-W01-2T00:05:23.283') + datetime.datetime(2011, 1, 4, 0, 5, 23, 283000) >>> datetime.fromisoformat('2011-11-04 00:05:23.283') datetime.datetime(2011, 11, 4, 0, 5, 23, 283000) >>> datetime.fromisoformat('2011-11-04 00:05:23.283+00:00') @@ -1028,6 +1026,10 @@ Other constructors, all class methods: tzinfo=datetime.timezone(datetime.timedelta(seconds=14400))) .. versionadded:: 3.7 + .. versionchanged:: 3.11 + Previously, this method only supported formats that could be emitted by + :meth:`date.isoformat()` or :meth:`datetime.isoformat()`. + .. classmethod:: datetime.fromisocalendar(year, week, day) @@ -1763,30 +1765,41 @@ Other constructor: .. classmethod:: time.fromisoformat(time_string) - Return a :class:`.time` corresponding to a *time_string* in one of the - formats emitted by :meth:`time.isoformat`. Specifically, this function supports - strings in the format: - - .. code-block:: none - - HH[:MM[:SS[.fff[fff]]]][+HH:MM[:SS[.ffffff]]] - - .. caution:: + Return a :class:`.time` corresponding to a *time_string* in any valid + ISO 8601 format, with the following exceptions: - This does *not* support parsing arbitrary ISO 8601 strings. It is only - intended as the inverse operation of :meth:`time.isoformat`. + 1. Time zone offsets may have fractional seconds. + 2. The leading `T`, normally required in cases where there may be ambiguity between + a date and a time, is not required. + 3. Fractional seconds may have any number of digits (anything beyond 6 will + be truncated). + 4. Fractional hours and minutes are not supported. Examples:: >>> from datetime import time >>> time.fromisoformat('04:23:01') datetime.time(4, 23, 1) + >>> time.fromisoformat('T04:23:01') + datetime.time(4, 23, 1) + >>> time.fromisoformat('T042301') + datetime.time(4, 23, 1) >>> time.fromisoformat('04:23:01.000384') datetime.time(4, 23, 1, 384) + >>> time.fromisoformat('04:23:01,000') + datetime.time(4, 23, 1, 384) >>> time.fromisoformat('04:23:01+04:00') datetime.time(4, 23, 1, tzinfo=datetime.timezone(datetime.timedelta(seconds=14400))) + >>> time.fromisoformat('04:23:01Z') + datetime.time(4, 23, 1, tzinfo=datetime.timezone.utc) + >>> time.fromisoformat('04:23:01+00:00') + datetime.time(4, 23, 1, tzinfo=datetime.timezone.utc) + .. versionadded:: 3.7 + .. versionchanged:: 3.11 + Previously, this method only supported formats that could be emitted by + :meth:`time.isoformat()`. Instance methods: diff --git a/Doc/whatsnew/3.11.rst b/Doc/whatsnew/3.11.rst index 87dc5ddb4e611..efcfa17600879 100644 --- a/Doc/whatsnew/3.11.rst +++ b/Doc/whatsnew/3.11.rst @@ -425,6 +425,14 @@ asyncio existing stream-based connections to TLS. (Contributed by Ian Good in :issue:`34975`.) +datetime +-------- + +* :meth:`datetime.date.fromisoformat`, :meth:`datetime.time.fromisoformat` and + :meth:`datetime.datetime.fromisoformat` can now be used to parse most ISO 8601 + formats (barring only those that support fractional hours and minutes). + (Contributed by Paul Ganssle in :gh:`80010`.) + fractions --------- diff --git a/Lib/datetime.py b/Lib/datetime.py index 7f79aa436eb5e..afbb6fed2ecb6 100644 --- a/Lib/datetime.py +++ b/Lib/datetime.py @@ -262,58 +262,150 @@ def _wrap_strftime(object, format, timetuple): return _time.strftime(newformat, timetuple) # Helpers for parsing the result of isoformat() +def _is_ascii_digit(c): + return c in "0123456789" + +def _find_isoformat_datetime_separator(dtstr): + # See the comment in _datetimemodule.c:_find_isoformat_datetime_separator + len_dtstr = len(dtstr) + if len_dtstr == 7: + return 7 + + assert len_dtstr > 7 + date_separator = "-" + week_indicator = "W" + + if dtstr[4] == date_separator: + if dtstr[5] == week_indicator: + if len_dtstr < 8: + raise ValueError("Invalid ISO string") + if len_dtstr > 8 and dtstr[8] == date_separator: + if len_dtstr == 9: + raise ValueError("Invalid ISO string") + if len_dtstr > 10 and _is_ascii_digit(dtstr[10]): + # This is as far as we need to resolve the ambiguity for + # the moment - if we have YYYY-Www-##, the separator is + # either a hyphen at 8 or a number at 10. + # + # We'll assume it's a hyphen at 8 because it's way more + # likely that someone will use a hyphen as a separator than + # a number, but at this point it's really best effort + # because this is an extension of the spec anyway. + # TODO(pganssle): Document this + return 8 + return 10 + else: + # YYYY-Www (8) + return 8 + else: + # YYYY-MM-DD (10) + return 10 + else: + if dtstr[4] == week_indicator: + # YYYYWww (7) or YYYYWwwd (8) + idx = 7 + while idx < len_dtstr: + if not _is_ascii_digit(dtstr[idx]): + break + idx += 1 + + if idx < 9: + return idx + + if idx % 2 == 0: + # If the index of the last number is even, it's YYYYWwwd + return 7 + else: + return 8 + else: + # YYYYMMDD (8) + return 8 + + def _parse_isoformat_date(dtstr): - # It is assumed that this function will only be called with a - # string of length exactly 10, and (though this is not used) ASCII-only + # It is assumed that this is an ASCII-only string of lengths 7, 8 or 10, + # see the comment on Modules/_datetimemodule.c:_find_isoformat_datetime_separator + assert len(dtstr) in (7, 8, 10) year = int(dtstr[0:4]) - if dtstr[4] != '-': - raise ValueError('Invalid date separator: %s' % dtstr[4]) + has_sep = dtstr[4] == '-' + + pos = 4 + has_sep + if dtstr[pos:pos + 1] == "W": + # YYYY-?Www-?D? + pos += 1 + weekno = int(dtstr[pos:pos + 2]) + pos += 2 - month = int(dtstr[5:7]) + dayno = 1 + if len(dtstr) > pos: + if (dtstr[pos:pos + 1] == '-') != has_sep: + raise ValueError("Inconsistent use of dash separator") - if dtstr[7] != '-': - raise ValueError('Invalid date separator') + pos += has_sep - day = int(dtstr[8:10]) + dayno = int(dtstr[pos:pos + 1]) + + return list(_isoweek_to_gregorian(year, weekno, dayno)) + else: + month = int(dtstr[pos:pos + 2]) + pos += 2 + if (dtstr[pos:pos + 1] == "-") != has_sep: + raise ValueError("Inconsistent use of dash separator") + + pos += has_sep + day = int(dtstr[pos:pos + 2]) + + return [year, month, day] + + +_FRACTION_CORRECTION = [100000, 10000, 1000, 100, 10] - return [year, month, day] def _parse_hh_mm_ss_ff(tstr): - # Parses things of the form HH[:MM[:SS[.fff[fff]]]] + # Parses things of the form HH[:?MM[:?SS[{.,}fff[fff]]]] len_str = len(tstr) time_comps = [0, 0, 0, 0] pos = 0 for comp in range(0, 3): if (len_str - pos) < 2: - raise ValueError('Incomplete time component') + raise ValueError("Incomplete time component") time_comps[comp] = int(tstr[pos:pos+2]) pos += 2 next_char = tstr[pos:pos+1] + if comp == 0: + has_sep = next_char == ':' + if not next_char or comp >= 2: break - if next_char != ':': - raise ValueError('Invalid time separator: %c' % next_char) + if has_sep and next_char != ':': + raise ValueError("Invalid time separator: %c" % next_char) - pos += 1 + pos += has_sep if pos < len_str: - if tstr[pos] != '.': - raise ValueError('Invalid microsecond component') + if tstr[pos] not in '.,': + raise ValueError("Invalid microsecond component") else: pos += 1 len_remainder = len_str - pos - if len_remainder not in (3, 6): - raise ValueError('Invalid microsecond component') - time_comps[3] = int(tstr[pos:]) - if len_remainder == 3: - time_comps[3] *= 1000 + if len_remainder >= 6: + to_parse = 6 + else: + to_parse = len_remainder + + time_comps[3] = int(tstr[pos:(pos+to_parse)]) + if to_parse < 6: + time_comps[3] *= _FRACTION_CORRECTION[to_parse-1] + if (len_remainder > to_parse + and not all(map(_is_ascii_digit, tstr[(pos+to_parse):]))): + raise ValueError("Non-digit values in unparsed fraction") return time_comps @@ -321,27 +413,34 @@ def _parse_isoformat_time(tstr): # Format supported is HH[:MM[:SS[.fff[fff]]]][+HH:MM[:SS[.ffffff]]] len_str = len(tstr) if len_str < 2: - raise ValueError('Isoformat time too short') + raise ValueError("Isoformat time too short") - # This is equivalent to re.search('[+-]', tstr), but faster - tz_pos = (tstr.find('-') + 1 or tstr.find('+') + 1) + # This is equivalent to re.search('[+-Z]', tstr), but faster + tz_pos = (tstr.find('-') + 1 or tstr.find('+') + 1 or tstr.find('Z') + 1) timestr = tstr[:tz_pos-1] if tz_pos > 0 else tstr time_comps = _parse_hh_mm_ss_ff(timestr) tzi = None - if tz_pos > 0: + if tz_pos == len_str and tstr[-1] == 'Z': + tzi = timezone.utc + elif tz_pos > 0: tzstr = tstr[tz_pos:] # Valid time zone strings are: + # HH len: 2 + # HHMM len: 4 # HH:MM len: 5 + # HHMMSS len: 6 + # HHMMSS.f+ len: 7+ # HH:MM:SS len: 8 - # HH:MM:SS.ffffff len: 15 + # HH:MM:SS.f+ len: 10+ - if len(tzstr) not in (5, 8, 15): - raise ValueError('Malformed time zone string') + if len(tzstr) in (0, 1, 3): + raise ValueError("Malformed time zone string") tz_comps = _parse_hh_mm_ss_ff(tzstr) + if all(x == 0 for x in tz_comps): tzi = timezone.utc else: @@ -356,6 +455,38 @@ def _parse_isoformat_time(tstr): return time_comps +# tuple[int, int, int] -> tuple[int, int, int] version of date.fromisocalendar +def _isoweek_to_gregorian(year, week, day): + # Year is bounded this way because 9999-12-31 is (9999, 52, 5) + if not MINYEAR <= year <= MAXYEAR: + raise ValueError(f"Year is out of range: {year}") + + if not 0 < week < 53: + out_of_range = True + + if week == 53: + # ISO years have 53 weeks in them on years starting with a + # Thursday and leap years starting on a Wednesday + first_weekday = _ymd2ord(year, 1, 1) % 7 + if (first_weekday == 4 or (first_weekday == 3 and + _is_leap(year))): + out_of_range = False + + if out_of_range: + raise ValueError(f"Invalid week: {week}") + + if not 0 < day < 8: + raise ValueError(f"Invalid weekday: {day} (range is [1, 7])") + + # Now compute the offset from (Y, 1, 1) in days: + day_offset = (week - 1) * 7 + (day - 1) + + # Calculate the ordinal day for monday, week 1 + day_1 = _isoweek1monday(year) + ord_day = day_1 + day_offset + + return _ord2ymd(ord_day) + # Just raise TypeError if the arg isn't None or a string. def _check_tzname(name): @@ -847,12 +978,14 @@ def fromordinal(cls, n): @classmethod def fromisoformat(cls, date_string): - """Construct a date from the output of date.isoformat().""" + """Construct a date from a string in ISO 8601 format.""" if not isinstance(date_string, str): raise TypeError('fromisoformat: argument must be str') + if len(date_string) not in (7, 8, 10): + raise ValueError(f'Invalid isoformat string: {date_string!r}') + try: - assert len(date_string) == 10 return cls(*_parse_isoformat_date(date_string)) except Exception: raise ValueError(f'Invalid isoformat string: {date_string!r}') @@ -862,35 +995,7 @@ def fromisocalendar(cls, year, week, day): """Construct a date from the ISO year, week number and weekday. This is the inverse of the date.isocalendar() function""" - # Year is bounded this way because 9999-12-31 is (9999, 52, 5) - if not MINYEAR <= year <= MAXYEAR: - raise ValueError(f"Year is out of range: {year}") - - if not 0 < week < 53: - out_of_range = True - - if week == 53: - # ISO years have 53 weeks in them on years starting with a - # Thursday and leap years starting on a Wednesday - first_weekday = _ymd2ord(year, 1, 1) % 7 - if (first_weekday == 4 or (first_weekday == 3 and - _is_leap(year))): - out_of_range = False - - if out_of_range: - raise ValueError(f"Invalid week: {week}") - - if not 0 < day < 8: - raise ValueError(f"Invalid weekday: {day} (range is [1, 7])") - - # Now compute the offset from (Y, 1, 1) in days: - day_offset = (week - 1) * 7 + (day - 1) - - # Calculate the ordinal day for monday, week 1 - day_1 = _isoweek1monday(year) - ord_day = day_1 + day_offset - - return cls(*_ord2ymd(ord_day)) + return cls(*_isoweek_to_gregorian(year, week, day)) # Conversions to string @@ -1427,10 +1532,15 @@ def isoformat(self, timespec='auto'): @classmethod def fromisoformat(cls, time_string): - """Construct a time from the output of isoformat().""" + """Construct a time from a string in one of the ISO 8601 formats.""" if not isinstance(time_string, str): raise TypeError('fromisoformat: argument must be str') + # The spec actually requires that time-only ISO 8601 strings start with + # T, but the extended format allows this to be omitted as long as there + # is no ambiguity with date strings. + time_string = time_string.removeprefix('T') + try: return cls(*_parse_isoformat_time(time_string)) except Exception: @@ -1711,24 +1821,30 @@ def combine(cls, date, time, tzinfo=True): @classmethod def fromisoformat(cls, date_string): - """Construct a datetime from the output of datetime.isoformat().""" + """Construct a datetime from a string in one of the ISO 8601 formats.""" if not isinstance(date_string, str): raise TypeError('fromisoformat: argument must be str') - # Split this at the separator - dstr = date_string[0:10] - tstr = date_string[11:] + if len(date_string) < 7: + raise ValueError(f'Invalid isoformat string: {date_string!r}') + # Split this at the separator try: + separator_location = _find_isoformat_datetime_separator(date_string) + dstr = date_string[0:separator_location] + tstr = date_string[(separator_location+1):] + date_components = _parse_isoformat_date(dstr) except ValueError: - raise ValueError(f'Invalid isoformat string: {date_string!r}') + raise ValueError( + f'Invalid isoformat string: {date_string!r}') from None if tstr: try: time_components = _parse_isoformat_time(tstr) except ValueError: - raise ValueError(f'Invalid isoformat string: {date_string!r}') + raise ValueError( + f'Invalid isoformat string: {date_string!r}') from None else: time_components = [0, 0, 0, 0, None] @@ -2509,7 +2625,9 @@ def _name_from_offset(delta): _format_time, _format_offset, _index, _is_leap, _isoweek1monday, _math, _ord2ymd, _time, _time_class, _tzinfo_class, _wrap_strftime, _ymd2ord, _divide_and_round, _parse_isoformat_date, _parse_isoformat_time, - _parse_hh_mm_ss_ff, _IsoCalendarDate) + _parse_hh_mm_ss_ff, _IsoCalendarDate, _isoweek_to_gregorian, + _find_isoformat_datetime_separator, _FRACTION_CORRECTION, + _is_ascii_digit) # XXX Since import * above excludes names that start with _, # docstring does not get overwritten. In the future, it may be # appropriate to maintain a single module level docstring and diff --git a/Lib/test/datetimetester.py b/Lib/test/datetimetester.py index d85b5466f7fc2..0495362b3f369 100644 --- a/Lib/test/datetimetester.py +++ b/Lib/test/datetimetester.py @@ -7,6 +7,7 @@ import bisect import copy import decimal +import functools import sys import os import pickle @@ -1840,6 +1841,41 @@ def test_fromisoformat(self): self.assertEqual(dt, dt_rt) + def test_fromisoformat_date_examples(self): + examples = [ + ('00010101', self.theclass(1, 1, 1)), + ('20000101', self.theclass(2000, 1, 1)), + ('20250102', self.theclass(2025, 1, 2)), + ('99991231', self.theclass(9999, 12, 31)), + ('0001-01-01', self.theclass(1, 1, 1)), + ('2000-01-01', self.theclass(2000, 1, 1)), + ('2025-01-02', self.theclass(2025, 1, 2)), + ('9999-12-31', self.theclass(9999, 12, 31)), + ('2025W01', self.theclass(2024, 12, 30)), + ('2025-W01', self.theclass(2024, 12, 30)), + ('2025W014', self.theclass(2025, 1, 2)), + ('2025-W01-4', self.theclass(2025, 1, 2)), + ('2026W01', self.theclass(2025, 12, 29)), + ('2026-W01', self.theclass(2025, 12, 29)), + ('2026W013', self.theclass(2025, 12, 31)), + ('2026-W01-3', self.theclass(2025, 12, 31)), + ('2022W52', self.theclass(2022, 12, 26)), + ('2022-W52', self.theclass(2022, 12, 26)), + ('2022W527', self.theclass(2023, 1, 1)), + ('2022-W52-7', self.theclass(2023, 1, 1)), + ('2015W534', self.theclass(2015, 12, 31)), # Has week 53 + ('2015-W53-4', self.theclass(2015, 12, 31)), # Has week 53 + ('2015-W53-5', self.theclass(2016, 1, 1)), + ('2020W531', self.theclass(2020, 12, 28)), # Leap year + ('2020-W53-1', self.theclass(2020, 12, 28)), # Leap year + ('2020-W53-6', self.theclass(2021, 1, 2)), + ] + + for input_str, expected in examples: + with self.subTest(input_str=input_str): + actual = self.theclass.fromisoformat(input_str) + self.assertEqual(actual, expected) + def test_fromisoformat_subclass(self): class DateSubclass(self.theclass): pass @@ -1862,7 +1898,8 @@ def test_fromisoformat_fails(self): '2009-12-0a', # Invalid character in day '2009-01-32', # Invalid day '2009-02-29', # Invalid leap day - '20090228', # Valid ISO8601 output not from isoformat() + '2019-W53-1', # No week 53 in 2019 + '2020-W54-1', # No week 54 '2009\ud80002\ud80028', # Separators are surrogate codepoints ] @@ -3003,6 +3040,140 @@ def test_fromisoformat_timespecs(self): dt_rt = self.theclass.fromisoformat(dtstr) self.assertEqual(dt, dt_rt) + def test_fromisoformat_datetime_examples(self): + UTC = timezone.utc + BST = timezone(timedelta(hours=1), 'BST') + EST = timezone(timedelta(hours=-5), 'EST') + EDT = timezone(timedelta(hours=-4), 'EDT') + examples = [ + ('2025-01-02', self.theclass(2025, 1, 2, 0, 0)), + ('2025-01-02T03', self.theclass(2025, 1, 2, 3, 0)), + ('2025-01-02T03:04', self.theclass(2025, 1, 2, 3, 4)), + ('2025-01-02T0304', self.theclass(2025, 1, 2, 3, 4)), + ('2025-01-02T03:04:05', self.theclass(2025, 1, 2, 3, 4, 5)), + ('2025-01-02T030405', self.theclass(2025, 1, 2, 3, 4, 5)), + ('2025-01-02T03:04:05.6', + self.theclass(2025, 1, 2, 3, 4, 5, 600000)), + ('2025-01-02T03:04:05,6', + self.theclass(2025, 1, 2, 3, 4, 5, 600000)), + ('2025-01-02T03:04:05.678', + self.theclass(2025, 1, 2, 3, 4, 5, 678000)), + ('2025-01-02T03:04:05.678901', + self.theclass(2025, 1, 2, 3, 4, 5, 678901)), + ('2025-01-02T03:04:05,678901', + self.theclass(2025, 1, 2, 3, 4, 5, 678901)), + ('2025-01-02T030405.678901', + self.theclass(2025, 1, 2, 3, 4, 5, 678901)), + ('2025-01-02T030405,678901', + self.theclass(2025, 1, 2, 3, 4, 5, 678901)), + ('2025-01-02T03:04:05.6789010', + self.theclass(2025, 1, 2, 3, 4, 5, 678901)), + ('2009-04-19T03:15:45.2345', + self.theclass(2009, 4, 19, 3, 15, 45, 234500)), + ('2009-04-19T03:15:45.1234567', + self.theclass(2009, 4, 19, 3, 15, 45, 123456)), + ('2025-01-02T03:04:05,678', + self.theclass(2025, 1, 2, 3, 4, 5, 678000)), + ('20250102', self.theclass(2025, 1, 2, 0, 0)), + ('20250102T03', self.theclass(2025, 1, 2, 3, 0)), + ('20250102T03:04', self.theclass(2025, 1, 2, 3, 4)), + ('20250102T03:04:05', self.theclass(2025, 1, 2, 3, 4, 5)), + ('20250102T030405', self.theclass(2025, 1, 2, 3, 4, 5)), + ('20250102T03:04:05.6', + self.theclass(2025, 1, 2, 3, 4, 5, 600000)), + ('20250102T03:04:05,6', + self.theclass(2025, 1, 2, 3, 4, 5, 600000)), + ('20250102T03:04:05.678', + self.theclass(2025, 1, 2, 3, 4, 5, 678000)), + ('20250102T03:04:05,678', + self.theclass(2025, 1, 2, 3, 4, 5, 678000)), + ('20250102T03:04:05.678901', + self.theclass(2025, 1, 2, 3, 4, 5, 678901)), + ('20250102T030405.678901', + self.theclass(2025, 1, 2, 3, 4, 5, 678901)), + ('20250102T030405,678901', + self.theclass(2025, 1, 2, 3, 4, 5, 678901)), + ('20250102T030405.6789010', + self.theclass(2025, 1, 2, 3, 4, 5, 678901)), + ('2022W01', self.theclass(2022, 1, 3)), + ('2022W52520', self.theclass(2022, 12, 26, 20, 0)), + ('2022W527520', self.theclass(2023, 1, 1, 20, 0)), + ('2026W01516', self.theclass(2025, 12, 29, 16, 0)), + ('2026W013516', self.theclass(2025, 12, 31, 16, 0)), + ('2025W01503', self.theclass(2024, 12, 30, 3, 0)), + ('2025W014503', self.theclass(2025, 1, 2, 3, 0)), + ('2025W01512', self.theclass(2024, 12, 30, 12, 0)), + ('2025W014512', self.theclass(2025, 1, 2, 12, 0)), + ('2025W014T121431', self.theclass(2025, 1, 2, 12, 14, 31)), + ('2026W013T162100', self.theclass(2025, 12, 31, 16, 21)), + ('2026W013 162100', self.theclass(2025, 12, 31, 16, 21)), + ('2022W527T202159', self.theclass(2023, 1, 1, 20, 21, 59)), + ('2022W527 202159', self.theclass(2023, 1, 1, 20, 21, 59)), + ('2025W014 121431', self.theclass(2025, 1, 2, 12, 14, 31)), + ('2025W014T030405', self.theclass(2025, 1, 2, 3, 4, 5)), + ('2025W014 030405', self.theclass(2025, 1, 2, 3, 4, 5)), + ('2020-W53-6T03:04:05', self.theclass(2021, 1, 2, 3, 4, 5)), + ('2020W537 03:04:05', self.theclass(2021, 1, 3, 3, 4, 5)), + ('2025-W01-4T03:04:05', self.theclass(2025, 1, 2, 3, 4, 5)), + ('2025-W01-4T03:04:05.678901', + self.theclass(2025, 1, 2, 3, 4, 5, 678901)), + ('2025-W01-4T12:14:31', self.theclass(2025, 1, 2, 12, 14, 31)), + ('2025-W01-4T12:14:31.012345', + self.theclass(2025, 1, 2, 12, 14, 31, 12345)), + ('2026-W01-3T16:21:00', self.theclass(2025, 12, 31, 16, 21)), + ('2026-W01-3T16:21:00.000000', self.theclass(2025, 12, 31, 16, 21)), + ('2022-W52-7T20:21:59', + self.theclass(2023, 1, 1, 20, 21, 59)), + ('2022-W52-7T20:21:59.999999', + self.theclass(2023, 1, 1, 20, 21, 59, 999999)), + ('2025-W01003+00', + self.theclass(2024, 12, 30, 3, 0, tzinfo=UTC)), + ('2025-01-02T03:04:05+00', + self.theclass(2025, 1, 2, 3, 4, 5, tzinfo=UTC)), + ('2025-01-02T03:04:05Z', + self.theclass(2025, 1, 2, 3, 4, 5, tzinfo=UTC)), + ('2025-01-02003:04:05,6+00:00:00.00', + self.theclass(2025, 1, 2, 3, 4, 5, 600000, tzinfo=UTC)), + ('2000-01-01T00+21', + self.theclass(2000, 1, 1, 0, 0, tzinfo=timezone(timedelta(hours=21)))), + ('2025-01-02T03:05:06+0300', + self.theclass(2025, 1, 2, 3, 5, 6, + tzinfo=timezone(timedelta(hours=3)))), + ('2025-01-02T03:05:06-0300', + self.theclass(2025, 1, 2, 3, 5, 6, + tzinfo=timezone(timedelta(hours=-3)))), + ('2025-01-02T03:04:05+0000', + self.theclass(2025, 1, 2, 3, 4, 5, tzinfo=UTC)), + ('2025-01-02T03:05:06+03', + self.theclass(2025, 1, 2, 3, 5, 6, + tzinfo=timezone(timedelta(hours=3)))), + ('2025-01-02T03:05:06-03', + self.theclass(2025, 1, 2, 3, 5, 6, + tzinfo=timezone(timedelta(hours=-3)))), + ('2020-01-01T03:05:07.123457-05:00', + self.theclass(2020, 1, 1, 3, 5, 7, 123457, tzinfo=EST)), + ('2020-01-01T03:05:07.123457-0500', + self.theclass(2020, 1, 1, 3, 5, 7, 123457, tzinfo=EST)), + ('2020-06-01T04:05:06.111111-04:00', + self.theclass(2020, 6, 1, 4, 5, 6, 111111, tzinfo=EDT)), + ('2020-06-01T04:05:06.111111-0400', + self.theclass(2020, 6, 1, 4, 5, 6, 111111, tzinfo=EDT)), + ('2021-10-31T01:30:00.000000+01:00', + self.theclass(2021, 10, 31, 1, 30, tzinfo=BST)), + ('2021-10-31T01:30:00.000000+0100', + self.theclass(2021, 10, 31, 1, 30, tzinfo=BST)), + ('2025-01-02T03:04:05,6+000000.00', + self.theclass(2025, 1, 2, 3, 4, 5, 600000, tzinfo=UTC)), + ('2025-01-02T03:04:05,678+00:00:10', + self.theclass(2025, 1, 2, 3, 4, 5, 678000, + tzinfo=timezone(timedelta(seconds=10)))), + ] + + for input_str, expected in examples: + with self.subTest(input_str=input_str): + actual = self.theclass.fromisoformat(input_str) + self.assertEqual(actual, expected) + def test_fromisoformat_fails_datetime(self): # Test that fromisoformat() fails on invalid values bad_strs = [ @@ -3016,8 +3187,6 @@ def test_fromisoformat_fails_datetime(self): '2009-04-19T03;15:45', # Bad first time separator '2009-04-19T03:15;45', # Bad second time separator '2009-04-19T03:15:4500:00', # Bad time zone separator - '2009-04-19T03:15:45.2345', # Too many digits for milliseconds - '2009-04-19T03:15:45.1234567', # Too many digits for microseconds '2009-04-19T03:15:45.123456+24:30', # Invalid time zone offset '2009-04-19T03:15:45.123456-24:30', # Invalid negative offset '2009-04-10?????12:15', # Too many unicode separators @@ -3962,6 +4131,76 @@ def test_fromisoformat_timespecs(self): t_rt = self.theclass.fromisoformat(tstr) self.assertEqual(t, t_rt) + def test_fromisoformat_fractions(self): + strs = [ + ('12:30:45.1', (12, 30, 45, 100000)), + ('12:30:45.12', (12, 30, 45, 120000)), + ('12:30:45.123', (12, 30, 45, 123000)), + ('12:30:45.1234', (12, 30, 45, 123400)), + ('12:30:45.12345', (12, 30, 45, 123450)), + ('12:30:45.123456', (12, 30, 45, 123456)), + ('12:30:45.1234567', (12, 30, 45, 123456)), + ('12:30:45.12345678', (12, 30, 45, 123456)), + ] + + for time_str, time_comps in strs: + expected = self.theclass(*time_comps) + actual = self.theclass.fromisoformat(time_str) + + self.assertEqual(actual, expected) + + def test_fromisoformat_time_examples(self): + examples = [ + ('0000', self.theclass(0, 0)), + ('00:00', self.theclass(0, 0)), + ('000000', self.theclass(0, 0)), + ('00:00:00', self.theclass(0, 0)), + ('000000.0', self.theclass(0, 0)), + ('00:00:00.0', self.theclass(0, 0)), + ('000000.000', self.theclass(0, 0)), + ('00:00:00.000', self.theclass(0, 0)), + ('000000.000000', self.theclass(0, 0)), + ('00:00:00.000000', self.theclass(0, 0)), + ('1200', self.theclass(12, 0)), + ('12:00', self.theclass(12, 0)), + ('120000', self.theclass(12, 0)), + ('12:00:00', self.theclass(12, 0)), + ('120000.0', self.theclass(12, 0)), + ('12:00:00.0', self.theclass(12, 0)), + ('120000.000', self.theclass(12, 0)), + ('12:00:00.000', self.theclass(12, 0)), + ('120000.000000', self.theclass(12, 0)), + ('12:00:00.000000', self.theclass(12, 0)), + ('2359', self.theclass(23, 59)), + ('23:59', self.theclass(23, 59)), + ('235959', self.theclass(23, 59, 59)), + ('23:59:59', self.theclass(23, 59, 59)), + ('235959.9', self.theclass(23, 59, 59, 900000)), + ('23:59:59.9', self.theclass(23, 59, 59, 900000)), + ('235959.999', self.theclass(23, 59, 59, 999000)), + ('23:59:59.999', self.theclass(23, 59, 59, 999000)), + ('235959.999999', self.theclass(23, 59, 59, 999999)), + ('23:59:59.999999', self.theclass(23, 59, 59, 999999)), + ('00:00:00Z', self.theclass(0, 0, tzinfo=timezone.utc)), + ('12:00:00+0000', self.theclass(12, 0, tzinfo=timezone.utc)), + ('12:00:00+00:00', self.theclass(12, 0, tzinfo=timezone.utc)), + ('00:00:00+05', + self.theclass(0, 0, tzinfo=timezone(timedelta(hours=5)))), + ('00:00:00+05:30', + self.theclass(0, 0, tzinfo=timezone(timedelta(hours=5, minutes=30)))), + ('12:00:00-05:00', + self.theclass(12, 0, tzinfo=timezone(timedelta(hours=-5)))), + ('12:00:00-0500', + self.theclass(12, 0, tzinfo=timezone(timedelta(hours=-5)))), + ('00:00:00,000-23:59:59.999999', + self.theclass(0, 0, tzinfo=timezone(-timedelta(hours=23, minutes=59, seconds=59, microseconds=999999)))), + ] + + for input_str, expected in examples: + with self.subTest(input_str=input_str): + actual = self.theclass.fromisoformat(input_str) + self.assertEqual(actual, expected) + def test_fromisoformat_fails(self): bad_strs = [ '', # Empty string @@ -3975,15 +4214,17 @@ def test_fromisoformat_fails(self): '1a:30:45.334034', # Invalid character in hours '12:a0:45.334034', # Invalid character in minutes '12:30:a5.334034', # Invalid character in seconds - '12:30:45.1234', # Too many digits for milliseconds - '12:30:45.1234567', # Too many digits for microseconds '12:30:45.123456+24:30', # Invalid time zone offset '12:30:45.123456-24:30', # Invalid negative offset '12?30?45', # Uses full-width unicode colons + '12:30:45.123456a', # Non-numeric data after 6 components + '12:30:45.123456789a', # Non-numeric data after 9 components '12:30:45?123456', # Uses \u2024 in place of decimal point '12:30:45a', # Extra at tend of basic time '12:30:45.123a', # Extra at end of millisecond time '12:30:45.123456a', # Extra at end of microsecond time + '12:30:45.123456-', # Extra at end of microsecond time + '12:30:45.123456+', # Extra at end of microsecond time '12:30:45.123456+12:00:30a', # Extra at end of full time ] diff --git a/Misc/NEWS.d/next/Library/2022-05-03-12-11-27.gh-issue-80010.yG54RE.rst b/Misc/NEWS.d/next/Library/2022-05-03-12-11-27.gh-issue-80010.yG54RE.rst new file mode 100644 index 0000000000000..bbcef471d2c0d --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-05-03-12-11-27.gh-issue-80010.yG54RE.rst @@ -0,0 +1,3 @@ +Add support for generalized ISO 8601 parsing to +:meth:`datetime.datetime.fromisoformat`, :meth:`datetime.date.fromisoformat` +and :meth:`datetime.time.fromisoformat`. Patch by Paul Ganssle. diff --git a/Modules/_datetimemodule.c b/Modules/_datetimemodule.c index 20cdb1822ab96..efb5278038f2f 100644 --- a/Modules/_datetimemodule.c +++ b/Modules/_datetimemodule.c @@ -395,6 +395,39 @@ iso_week1_monday(int year) return week1_monday; } +static int +iso_to_ymd(const int iso_year, const int iso_week, const int iso_day, + int *year, int *month, int *day) { + if (iso_week <= 0 || iso_week >= 53) { + int out_of_range = 1; + if (iso_week == 53) { + // ISO years have 53 weeks in it on years starting with a Thursday + // and on leap years starting on Wednesday + int first_weekday = weekday(iso_year, 1, 1); + if (first_weekday == 3 || (first_weekday == 2 && is_leap(iso_year))) { + out_of_range = 0; + } + } + + if (out_of_range) { + return -2; + } + } + + if (iso_day <= 0 || iso_day >= 8) { + return -3; + } + + // Convert (Y, W, D) to (Y, M, D) in-place + int day_1 = iso_week1_monday(iso_year); + + int day_offset = (iso_week - 1)*7 + iso_day - 1; + + ord_to_ymd(day_1 + day_offset, year, month, day); + return 0; +} + + /* --------------------------------------------------------------------------- * Range checkers. */ @@ -680,6 +713,11 @@ set_date_fields(PyDateTime_Date *self, int y, int m, int d) * String parsing utilities and helper functions */ +static unsigned char +is_digit(const char c) { + return ((unsigned int)(c - '0')) < 10; +} + static const char * parse_digits(const char *ptr, int *var, size_t num_digits) { @@ -696,14 +734,17 @@ parse_digits(const char *ptr, int *var, size_t num_digits) } static int -parse_isoformat_date(const char *dtstr, int *year, int *month, int *day) +parse_isoformat_date(const char *dtstr, const size_t len, int *year, int *month, int *day) { /* Parse the date components of the result of date.isoformat() * * Return codes: * 0: Success * -1: Failed to parse date component - * -2: Failed to parse dateseparator + * -2: Inconsistent date separator usage + * -3: Failed to parse ISO week. + * -4: Failed to parse ISO day. + * -5, -6: Failure in iso_to_ymd */ const char *p = dtstr; p = parse_digits(p, year, 4); @@ -711,8 +752,42 @@ parse_isoformat_date(const char *dtstr, int *year, int *month, int *day) return -1; } - if (*(p++) != '-') { - return -2; + const unsigned char uses_separator = (*p == '-'); + if (uses_separator) { + ++p; + } + + if(*p == 'W') { + // This is an isocalendar-style date string + p++; + int iso_week = 0; + int iso_day = 0; + + p = parse_digits(p, &iso_week, 2); + if (NULL == p) { + return -3; + } + + assert(p > dtstr); + if ((size_t)(p - dtstr) < len) { + if (uses_separator && *(p++) != '-') { + return -2; + } + + p = parse_digits(p, &iso_day, 1); + if (NULL == p) { + return -4; + } + } else { + iso_day = 1; + } + + int rv = iso_to_ymd(*year, iso_week, iso_day, year, month, day); + if (rv) { + return -3 + rv; + } else { + return 0; + } } p = parse_digits(p, month, 2); @@ -720,15 +795,13 @@ parse_isoformat_date(const char *dtstr, int *year, int *month, int *day) return -1; } - if (*(p++) != '-') { + if (uses_separator && *(p++) != '-') { return -2; } - p = parse_digits(p, day, 2); if (p == NULL) { return -1; } - return 0; } @@ -736,11 +809,14 @@ static int parse_hh_mm_ss_ff(const char *tstr, const char *tstr_end, int *hour, int *minute, int *second, int *microsecond) { + *hour = *minute = *second = *microsecond = 0; const char *p = tstr; const char *p_end = tstr_end; int *vals[3] = {hour, minute, second}; + // This is initialized to satisfy an erroneous compiler warning. + unsigned char has_separator = 1; - // Parse [HH[:MM[:SS]]] + // Parse [HH[:?MM[:?SS]]] for (size_t i = 0; i < 3; ++i) { p = parse_digits(p, vals[i], 2); if (NULL == p) { @@ -748,33 +824,47 @@ parse_hh_mm_ss_ff(const char *tstr, const char *tstr_end, int *hour, } char c = *(p++); + if (i == 0) { + has_separator = (c == ':'); + } + if (p >= p_end) { return c != '\0'; } - else if (c == ':') { + else if (has_separator && (c == ':')) { continue; } - else if (c == '.') { + else if (c == '.' || c == ',') { break; - } - else { + } else if (!has_separator) { + --p; + } else { return -4; // Malformed time separator } } - // Parse .fff[fff] + // Parse fractional components size_t len_remains = p_end - p; - if (!(len_remains == 6 || len_remains == 3)) { - return -3; + size_t to_parse = len_remains; + if (len_remains >= 6) { + to_parse = 6; } - p = parse_digits(p, microsecond, len_remains); + p = parse_digits(p, microsecond, to_parse); if (NULL == p) { return -3; } - if (len_remains == 3) { - *microsecond *= 1000; + static int correction[] = { + 100000, 10000, 1000, 100, 10 + }; + + if (to_parse < 6) { + *microsecond *= correction[to_parse-1]; + } + + while (is_digit(*p)){ + ++p; // skip truncated digits } // Return 1 if it's not the end of the string @@ -800,7 +890,7 @@ parse_isoformat_time(const char *dtstr, size_t dtlen, int *hour, int *minute, const char *tzinfo_pos = p; do { - if (*tzinfo_pos == '+' || *tzinfo_pos == '-') { + if (*tzinfo_pos == 'Z' || *tzinfo_pos == '+' || *tzinfo_pos == '-') { break; } } while (++tzinfo_pos < p_end); @@ -822,14 +912,16 @@ parse_isoformat_time(const char *dtstr, size_t dtlen, int *hour, int *minute, } } - // Parse time zone component - // Valid formats are: - // - +HH:MM (len 6) - // - +HH:MM:SS (len 9) - // - +HH:MM:SS.ffffff (len 16) - size_t tzlen = p_end - tzinfo_pos; - if (!(tzlen == 6 || tzlen == 9 || tzlen == 16)) { - return -5; + // Special case UTC / Zulu time. + if (*tzinfo_pos == 'Z') { + *tzoffset = 0; + *tzmicrosecond = 0; + + if (*(tzinfo_pos + 1) != '\0') { + return -5; + } else { + return 1; + } } int tzsign = (*tzinfo_pos == '-') ? -1 : 1; @@ -2983,8 +3075,8 @@ date_fromisoformat(PyObject *cls, PyObject *dtstr) int year = 0, month = 0, day = 0; int rv; - if (len == 10) { - rv = parse_isoformat_date(dt_ptr, &year, &month, &day); + if (len == 7 || len == 8 || len == 10) { + rv = parse_isoformat_date(dt_ptr, len, &year, &month, &day); } else { rv = -1; @@ -3027,37 +3119,21 @@ date_fromisocalendar(PyObject *cls, PyObject *args, PyObject *kw) return NULL; } - if (week <= 0 || week >= 53) { - int out_of_range = 1; - if (week == 53) { - // ISO years have 53 weeks in it on years starting with a Thursday - // and on leap years starting on Wednesday - int first_weekday = weekday(year, 1, 1); - if (first_weekday == 3 || (first_weekday == 2 && is_leap(year))) { - out_of_range = 0; - } - } + int month; + int rv = iso_to_ymd(year, week, day, &year, &month, &day); - if (out_of_range) { - PyErr_Format(PyExc_ValueError, "Invalid week: %d", week); - return NULL; - } + + if (rv == -2) { + PyErr_Format(PyExc_ValueError, "Invalid week: %d", week); + return NULL; } - if (day <= 0 || day >= 8) { + if (rv == -3) { PyErr_Format(PyExc_ValueError, "Invalid day: %d (range is [1, 7])", day); return NULL; } - // Convert (Y, W, D) to (Y, M, D) in-place - int day_1 = iso_week1_monday(year); - - int month = week; - int day_offset = (month - 1)*7 + day - 1; - - ord_to_ymd(day_1 + day_offset, &year, &month, &day); - return new_date_subclass_ex(year, month, day, cls); } @@ -3489,7 +3565,7 @@ static PyMethodDef date_methods[] = { {"fromisoformat", (PyCFunction)date_fromisoformat, METH_O | METH_CLASS, - PyDoc_STR("str -> Construct a date from the output of date.isoformat()")}, + PyDoc_STR("str -> Construct a date from a string in ISO 8601 format.")}, {"fromisocalendar", _PyCFunction_CAST(date_fromisocalendar), METH_VARARGS | METH_KEYWORDS | METH_CLASS, @@ -4564,6 +4640,14 @@ time_fromisoformat(PyObject *cls, PyObject *tstr) { goto invalid_string_error; } + // The spec actually requires that time-only ISO 8601 strings start with + // T, but the extended format allows this to be omitted as long as there + // is no ambiguity with date strings. + if (*p == 'T') { + ++p; + len -= 1; + } + int hour = 0, minute = 0, second = 0, microsecond = 0; int tzoffset, tzimicrosecond = 0; int rv = parse_isoformat_time(p, len, @@ -4671,7 +4755,7 @@ static PyMethodDef time_methods[] = { PyDoc_STR("Return time with new specified fields.")}, {"fromisoformat", (PyCFunction)time_fromisoformat, METH_O | METH_CLASS, - PyDoc_STR("string -> time from time.isoformat() output")}, + PyDoc_STR("string -> time from a string in ISO 8601 format")}, {"__reduce_ex__", (PyCFunction)time_reduce_ex, METH_VARARGS, PyDoc_STR("__reduce_ex__(proto) -> (cls, state)")}, @@ -5184,19 +5268,42 @@ datetime_combine(PyObject *cls, PyObject *args, PyObject *kw) static PyObject * _sanitize_isoformat_str(PyObject *dtstr) { + Py_ssize_t len = PyUnicode_GetLength(dtstr); + if (len < 7) { // All valid ISO 8601 strings are at least 7 characters long + return NULL; + } + // `fromisoformat` allows surrogate characters in exactly one position, // the separator; to allow datetime_fromisoformat to make the simplifying // assumption that all valid strings can be encoded in UTF-8, this function // replaces any surrogate character separators with `T`. // // The result of this, if not NULL, returns a new reference - Py_ssize_t len = PyUnicode_GetLength(dtstr); - if (len < 0) { - return NULL; + const void* const unicode_data = PyUnicode_DATA(dtstr); + const unsigned int kind = PyUnicode_KIND(dtstr); + + // Depending on the format of the string, the separator can only ever be + // in positions 7, 8 or 10. We'll check each of these for a surrogate and + // if we find one, replace it with `T`. If there is more than one surrogate, + // we don't have to bother sanitizing it, because the function will later + // fail when we try to encode the string as ASCII. + static const size_t potential_separators[3] = {7, 8, 10}; + size_t surrogate_separator = 0; + for(size_t idx = 0; + idx < sizeof(potential_separators) / sizeof(*potential_separators); + ++idx) { + size_t pos = potential_separators[idx]; + if (pos > (size_t)len) { + break; + } + + if(Py_UNICODE_IS_SURROGATE(PyUnicode_READ(kind, unicode_data, pos))) { + surrogate_separator = pos; + break; + } } - if (len <= 10 || - !Py_UNICODE_IS_SURROGATE(PyUnicode_READ_CHAR(dtstr, 10))) { + if (surrogate_separator == 0) { Py_INCREF(dtstr); return dtstr; } @@ -5206,7 +5313,7 @@ _sanitize_isoformat_str(PyObject *dtstr) return NULL; } - if (PyUnicode_WriteChar(str_out, 10, (Py_UCS4)'T')) { + if (PyUnicode_WriteChar(str_out, surrogate_separator, (Py_UCS4)'T')) { Py_DECREF(str_out); return NULL; } @@ -5214,6 +5321,106 @@ _sanitize_isoformat_str(PyObject *dtstr) return str_out; } + +static Py_ssize_t +_find_isoformat_datetime_separator(const char *dtstr, Py_ssize_t len) { + // The valid date formats can all be distinguished by characters 4 and 5 + // and further narrowed down by character + // which tells us where to look for the separator character. + // Format | As-rendered | Position + // --------------------------------------- + // %Y-%m-%d | YYYY-MM-DD | 10 + // %Y%m%d | YYYYMMDD | 8 + // %Y-W%V | YYYY-Www | 8 + // %YW%V | YYYYWww | 7 + // %Y-W%V-%u | YYYY-Www-d | 10 + // %YW%V%u | YYYYWwwd | 8 + // %Y-%j | YYYY-DDD | 8 + // %Y%j | YYYYDDD | 7 + // + // Note that because we allow *any* character for the separator, in the + // case where character 4 is W, it's not straightforward to determine where + // the separator is ? in the case of YYYY-Www-d, you have actual ambiguity, + // e.g. 2020-W01-0000 could be YYYY-Www-D0HH or YYYY-Www-HHMM, when the + // separator character is a number in the former case or a hyphen in the + // latter case. + // + // The case of YYYYWww can be distinguished from YYYYWwwd by tracking ahead + // to either the end of the string or the first non-numeric character ? + // since the time components all come in pairs YYYYWww#HH can be + // distinguished from YYYYWwwd#HH by the fact that there will always be an + // odd number of digits before the first non-digit character in the former + // case. + static const char date_separator = '-'; + static const char week_indicator = 'W'; + + if (len == 7) { + return 7; + } + + if (dtstr[4] == date_separator) { + // YYYY-??? + + if (dtstr[5] == week_indicator) { + // YYYY-W?? + + if (len < 8) { + return -1; + } + + if (len > 8 && dtstr[8] == date_separator) { + // YYYY-Www-D (10) or YYYY-Www-HH (8) + if (len == 9) { return -1; } + if (len > 10 && is_digit(dtstr[10])) { + // This is as far as we'll try to go to resolve the + // ambiguity for the moment ? if we have YYYY-Www-##, the + // separator is either a hyphen at 8 or a number at 10. + // + // We'll assume it's a hyphen at 8 because it's way more + // likely that someone will use a hyphen as a separator + // than a number, but at this point it's really best effort + // because this is an extension of the spec anyway. + return 8; + } + + return 10; + } else { + // YYYY-Www (8) + return 8; + } + } else { + // YYYY-MM-DD (10) + return 10; + } + } else { + // YYYY??? + if (dtstr[4] == week_indicator) { + // YYYYWww (7) or YYYYWwwd (8) + size_t idx = 7; + for (; idx < (size_t)len; ++idx) { + // Keep going until we run out of digits. + if (!is_digit(dtstr[idx])) { + break; + } + } + + if (idx < 9) { + return idx; + } + + if (idx % 2 == 0) { + // If the index of the last number is even, it's YYYYWww + return 7; + } else { + return 8; + } + } else { + // YYYYMMDD (8) + return 8; + } + } +} + static PyObject * datetime_fromisoformat(PyObject *cls, PyObject *dtstr) { @@ -5225,9 +5432,14 @@ datetime_fromisoformat(PyObject *cls, PyObject *dtstr) return NULL; } + // We only need to sanitize this string if the separator is a surrogate + // character. In the situation where the separator location is ambiguous, + // we don't have to sanitize it anything because that can only happen when + // the separator is either '-' or a number. This should mostly be a noop + // but it makes the reference counting easier if we still sanitize. PyObject *dtstr_clean = _sanitize_isoformat_str(dtstr); if (dtstr_clean == NULL) { - goto error; + goto invalid_string_error; } Py_ssize_t len; @@ -5243,30 +5455,35 @@ datetime_fromisoformat(PyObject *cls, PyObject *dtstr) } } + const Py_ssize_t separator_location = _find_isoformat_datetime_separator( + dt_ptr, len); + + const char *p = dt_ptr; int year = 0, month = 0, day = 0; int hour = 0, minute = 0, second = 0, microsecond = 0; int tzoffset = 0, tzusec = 0; - // date has a fixed length of 10 - int rv = parse_isoformat_date(p, &year, &month, &day); + // date runs up to separator_location + int rv = parse_isoformat_date(p, separator_location, &year, &month, &day); - if (!rv && len > 10) { + if (!rv && len > separator_location) { // In UTF-8, the length of multi-byte characters is encoded in the MSB - if ((p[10] & 0x80) == 0) { - p += 11; + p += separator_location; + if ((p[0] & 0x80) == 0) { + p += 1; } else { - switch (p[10] & 0xf0) { + switch (p[0] & 0xf0) { case 0xe0: - p += 13; + p += 3; break; case 0xf0: - p += 14; + p += 4; break; default: - p += 12; + p += 2; break; } } @@ -6327,7 +6544,7 @@ static PyMethodDef datetime_methods[] = { {"fromisoformat", (PyCFunction)datetime_fromisoformat, METH_O | METH_CLASS, - PyDoc_STR("string -> datetime from datetime.isoformat() output")}, + PyDoc_STR("string -> datetime from a string in most ISO 8601 formats")}, /* Instance methods: */ From webhook-mailer at python.org Thu May 5 21:41:44 2022 From: webhook-mailer at python.org (vstinner) Date: Fri, 06 May 2022 01:41:44 -0000 Subject: [Python-checkins] gh-57684: Update tests for PYTHONSAFEPATH=1 (#92358) Message-ID: https://github.com/python/cpython/commit/329afe78c3bbc234492a53f7a4084d07e215a077 commit: 329afe78c3bbc234492a53f7a4084d07e215a077 branch: main author: Victor Stinner committer: vstinner date: 2022-05-06T03:41:24+02:00 summary: gh-57684: Update tests for PYTHONSAFEPATH=1 (#92358) Fix tests failing with the PYTHONSAFEPATH=1 env var. Enhance also -P help in Python usage (python --help). files: M Lib/distutils/tests/test_bdist_rpm.py M Lib/test/test_cmd_line.py M Lib/test/test_cmd_line_script.py M Lib/test/test_pdb.py M Lib/test/test_runpy.py M Lib/unittest/test/test_program.py M Python/initconfig.c M Tools/freeze/test/freeze.py diff --git a/Lib/distutils/tests/test_bdist_rpm.py b/Lib/distutils/tests/test_bdist_rpm.py index f1eb9ba449382..7eefa7b9cad84 100644 --- a/Lib/distutils/tests/test_bdist_rpm.py +++ b/Lib/distutils/tests/test_bdist_rpm.py @@ -49,6 +49,9 @@ def tearDown(self): 'the rpm command is not found') @unittest.skipIf(find_executable('rpmbuild') is None, 'the rpmbuild command is not found') + # import foo fails with safe path + @unittest.skipIf(sys.flags.safe_path, + 'PYTHONSAFEPATH changes default sys.path') def test_quiet(self): # let's create a package tmp_dir = self.mkdtemp() @@ -93,6 +96,9 @@ def test_quiet(self): 'the rpm command is not found') @unittest.skipIf(find_executable('rpmbuild') is None, 'the rpmbuild command is not found') + # import foo fails with safe path + @unittest.skipIf(sys.flags.safe_path, + 'PYTHONSAFEPATH changes default sys.path') def test_no_optimize_flag(self): # let's create a package that breaks bdist_rpm tmp_dir = self.mkdtemp() diff --git a/Lib/test/test_cmd_line.py b/Lib/test/test_cmd_line.py index 26506312185cf..5a9e14bbd3200 100644 --- a/Lib/test/test_cmd_line.py +++ b/Lib/test/test_cmd_line.py @@ -363,6 +363,8 @@ def test_large_PYTHONPATH(self): self.assertIn(path1.encode('ascii'), out) self.assertIn(path2.encode('ascii'), out) + @unittest.skipIf(sys.flags.safe_path, + 'PYTHONSAFEPATH changes default sys.path') def test_empty_PYTHONPATH_issue16309(self): # On Posix, it is documented that setting PATH to the # empty string is equivalent to not setting PATH at all, @@ -594,9 +596,10 @@ def test_isolatedmode(self): with open(main, "w", encoding="utf-8") as f: f.write("import uuid\n") f.write("print('ok')\n") + # Use -E to ignore PYTHONSAFEPATH env var self.assertRaises(subprocess.CalledProcessError, subprocess.check_output, - [sys.executable, main], cwd=tmpdir, + [sys.executable, '-E', main], cwd=tmpdir, stderr=subprocess.DEVNULL) out = subprocess.check_output([sys.executable, "-I", main], cwd=tmpdir) diff --git a/Lib/test/test_cmd_line_script.py b/Lib/test/test_cmd_line_script.py index 9fe748c187060..bb433dc1e73a4 100644 --- a/Lib/test/test_cmd_line_script.py +++ b/Lib/test/test_cmd_line_script.py @@ -116,7 +116,9 @@ def _check_output(self, script_name, exit_code, data, self.assertIn(printed_file.encode('utf-8'), data) self.assertIn(printed_package.encode('utf-8'), data) self.assertIn(printed_argv0.encode('utf-8'), data) - self.assertIn(printed_path0.encode('utf-8'), data) + # PYTHONSAFEPATH=1 changes the default sys.path[0] + if not sys.flags.safe_path: + self.assertIn(printed_path0.encode('utf-8'), data) self.assertIn(printed_cwd.encode('utf-8'), data) def _check_script(self, script_exec_args, expected_file, diff --git a/Lib/test/test_pdb.py b/Lib/test/test_pdb.py index bfa2cc92d2514..0141b739c2544 100644 --- a/Lib/test/test_pdb.py +++ b/Lib/test/test_pdb.py @@ -1369,6 +1369,8 @@ class PdbTestCase(unittest.TestCase): def tearDown(self): os_helper.unlink(os_helper.TESTFN) + @unittest.skipIf(sys.flags.safe_path, + 'PYTHONSAFEPATH changes default sys.path') def _run_pdb(self, pdb_args, commands): self.addCleanup(os_helper.rmtree, '__pycache__') cmd = [sys.executable, '-m', 'pdb'] + pdb_args diff --git a/Lib/test/test_runpy.py b/Lib/test/test_runpy.py index 93e1ab556ae92..6aaa288c14e1d 100644 --- a/Lib/test/test_runpy.py +++ b/Lib/test/test_runpy.py @@ -781,13 +781,15 @@ def run(self, *args, **kwargs): super().run(*args, **kwargs) @requires_subprocess() - def assertSigInt(self, *args, **kwargs): - proc = subprocess.run(*args, **kwargs, text=True, stderr=subprocess.PIPE) - self.assertTrue(proc.stderr.endswith("\nKeyboardInterrupt\n")) + def assertSigInt(self, cmd, *args, **kwargs): + # Use -E to ignore PYTHONSAFEPATH + cmd = [sys.executable, '-E', *cmd] + proc = subprocess.run(cmd, *args, **kwargs, text=True, stderr=subprocess.PIPE) + self.assertTrue(proc.stderr.endswith("\nKeyboardInterrupt\n"), proc.stderr) self.assertEqual(proc.returncode, self.EXPECTED_CODE) def test_pymain_run_file(self): - self.assertSigInt([sys.executable, self.ham]) + self.assertSigInt([self.ham]) def test_pymain_run_file_runpy_run_module(self): tmp = self.ham.parent @@ -800,7 +802,7 @@ def test_pymain_run_file_runpy_run_module(self): """ ) ) - self.assertSigInt([sys.executable, run_module], cwd=tmp) + self.assertSigInt([run_module], cwd=tmp) def test_pymain_run_file_runpy_run_module_as_main(self): tmp = self.ham.parent @@ -813,23 +815,23 @@ def test_pymain_run_file_runpy_run_module_as_main(self): """ ) ) - self.assertSigInt([sys.executable, run_module_as_main], cwd=tmp) + self.assertSigInt([run_module_as_main], cwd=tmp) def test_pymain_run_command_run_module(self): self.assertSigInt( - [sys.executable, "-c", "import runpy; runpy.run_module('ham')"], + ["-c", "import runpy; runpy.run_module('ham')"], cwd=self.ham.parent, ) def test_pymain_run_command(self): - self.assertSigInt([sys.executable, "-c", "import ham"], cwd=self.ham.parent) + self.assertSigInt(["-c", "import ham"], cwd=self.ham.parent) def test_pymain_run_stdin(self): - self.assertSigInt([sys.executable], input="import ham", cwd=self.ham.parent) + self.assertSigInt([], input="import ham", cwd=self.ham.parent) def test_pymain_run_module(self): ham = self.ham - self.assertSigInt([sys.executable, "-m", ham.stem], cwd=ham.parent) + self.assertSigInt(["-m", ham.stem], cwd=ham.parent) if __name__ == "__main__": diff --git a/Lib/unittest/test/test_program.py b/Lib/unittest/test/test_program.py index 126497aa56656..26a8550af8fdd 100644 --- a/Lib/unittest/test/test_program.py +++ b/Lib/unittest/test/test_program.py @@ -454,7 +454,9 @@ def testParseArgsSelectedTestNames(self): def testSelectedTestNamesFunctionalTest(self): def run_unittest(args): - p = subprocess.Popen([sys.executable, '-m', 'unittest'] + args, + # Use -E to ignore PYTHONSAFEPATH env var + cmd = [sys.executable, '-E', '-m', 'unittest'] + args + p = subprocess.Popen(cmd, stdout=subprocess.DEVNULL, stderr=subprocess.PIPE, cwd=os.path.dirname(__file__)) with p: _, stderr = p.communicate() diff --git a/Python/initconfig.c b/Python/initconfig.c index 265c7ca8e8f76..a623973f95373 100644 --- a/Python/initconfig.c +++ b/Python/initconfig.c @@ -49,7 +49,7 @@ static const char usage_2[] = "\ .pyc extension; also PYTHONOPTIMIZE=x\n\ -OO : do -O changes and also discard docstrings; add .opt-2 before\n\ .pyc extension\n\ --P : don't add sys.path[0]\n\ +-P : don't prepend a potentially unsafe path to sys.path\n\ -q : don't print version and copyright messages on interactive startup\n\ -s : don't add user site directory to sys.path; also PYTHONNOUSERSITE\n\ -S : don't imply 'import site' on initialization\n\ diff --git a/Tools/freeze/test/freeze.py b/Tools/freeze/test/freeze.py index abedac03f91b0..ddbfd7fc9c2f4 100644 --- a/Tools/freeze/test/freeze.py +++ b/Tools/freeze/test/freeze.py @@ -172,7 +172,8 @@ def freeze(python, scriptfile, outdir): print(f'freezing {scriptfile}...') os.makedirs(outdir, exist_ok=True) - _run_quiet([python, FREEZE, '-o', outdir, scriptfile], outdir) + # Use -E to ignore PYTHONSAFEPATH + _run_quiet([python, '-E', FREEZE, '-o', outdir, scriptfile], outdir) _run_quiet([MAKE, '-C', os.path.dirname(scriptfile)]) name = os.path.basename(scriptfile).rpartition('.')[0] From webhook-mailer at python.org Thu May 5 22:53:16 2022 From: webhook-mailer at python.org (vstinner) Date: Fri, 06 May 2022 02:53:16 -0000 Subject: [Python-checkins] gh-57684: Document safe path in What's New in Python 3.11 (#92362) Message-ID: https://github.com/python/cpython/commit/5f29268283aba12d4f2c83cab4966286e0ac5128 commit: 5f29268283aba12d4f2c83cab4966286e0ac5128 branch: main author: Victor Stinner committer: vstinner date: 2022-05-06T04:53:00+02:00 summary: gh-57684: Document safe path in What's New in Python 3.11 (#92362) Mention also -P and PYTHONSAFEPATH in the Security Considerations page. files: M Doc/library/security_warnings.rst M Doc/whatsnew/3.11.rst diff --git a/Doc/library/security_warnings.rst b/Doc/library/security_warnings.rst index 26b015c0f8fc7..f985dc4acd11c 100644 --- a/Doc/library/security_warnings.rst +++ b/Doc/library/security_warnings.rst @@ -32,3 +32,9 @@ The following modules have specific security considerations: * :mod:`xml`: :ref:`XML vulnerabilities ` * :mod:`zipfile`: :ref:`maliciously prepared .zip files can cause disk volume exhaustion ` + +The :option:`-I` command line option can be used to run Python in isolated +mode. When it cannot be used, the :option:`-P` option or the +:envvar:`PYTHONSAFEPATH` environment variable can be used to not prepend a +potentially unsafe path to :data:`sys.path` such as the current directory, the +script's directory or an empty string. diff --git a/Doc/whatsnew/3.11.rst b/Doc/whatsnew/3.11.rst index efcfa17600879..c84b36f8d6c40 100644 --- a/Doc/whatsnew/3.11.rst +++ b/Doc/whatsnew/3.11.rst @@ -79,6 +79,12 @@ New typing features: * :pep:`673`: ``Self`` type. * :pep:`675`: Arbitrary literal string type. +Security improvements: + +* New :option:`-P` command line option and :envvar:`PYTHONSAFEPATH` environment + variable to not prepend a potentially unsafe path to :data:`sys.path` such as + the current directory, the script's directory or an empty string. + New Features ============ From webhook-mailer at python.org Thu May 5 23:24:33 2022 From: webhook-mailer at python.org (vstinner) Date: Fri, 06 May 2022 03:24:33 -0000 Subject: [Python-checkins] gh-88279: Deprecate PySys_SetArgvEx() (#92363) Message-ID: https://github.com/python/cpython/commit/299692afd8b8520383e6badeb907b285fc7c0909 commit: 299692afd8b8520383e6badeb907b285fc7c0909 branch: main author: Victor Stinner committer: vstinner date: 2022-05-06T05:24:29+02:00 summary: gh-88279: Deprecate PySys_SetArgvEx() (#92363) Deprecate the following C functions: * PySys_SetArgv() * PySys_SetArgvEx() * PySys_SetPath() files: A Misc/NEWS.d/next/C API/2022-05-06-04-55-17.gh-issue-88279.3mQ54t.rst M Doc/c-api/init.rst M Doc/c-api/intro.rst M Doc/c-api/sys.rst M Doc/whatsnew/3.11.rst M Include/sysmodule.h diff --git a/Doc/c-api/init.rst b/Doc/c-api/init.rst index c17379c52ab70..d4954958f855f 100644 --- a/Doc/c-api/init.rst +++ b/Doc/c-api/init.rst @@ -616,6 +616,11 @@ Process-wide parameters single: Py_FatalError() single: argv (in module sys) + This API is kept for backward compatibility: setting + :c:member:`PyConfig.argv`, :c:member:`PyConfig.parse_argv` and + :c:member:`PyConfig.safe_path` should be used instead, see :ref:`Python + Initialization Configuration `. + Set :data:`sys.argv` based on *argc* and *argv*. These parameters are similar to those passed to the program's :c:func:`main` function with the difference that the first entry should refer to the script file to be @@ -659,9 +664,15 @@ Process-wide parameters .. XXX impl. doesn't seem consistent in allowing ``0``/``NULL`` for the params; check w/ Guido. + .. deprecated:: 3.11 + .. c:function:: void PySys_SetArgv(int argc, wchar_t **argv) + This API is kept for backward compatibility: setting + :c:member:`PyConfig.argv` and :c:member:`PyConfig.parse_argv` should be used + instead, see :ref:`Python Initialization Configuration `. + This function works like :c:func:`PySys_SetArgvEx` with *updatepath* set to ``1`` unless the :program:`python` interpreter was started with the :option:`-I`. @@ -674,6 +685,8 @@ Process-wide parameters .. versionchanged:: 3.4 The *updatepath* value depends on :option:`-I`. + .. deprecated:: 3.11 + .. c:function:: void Py_SetPythonHome(const wchar_t *home) diff --git a/Doc/c-api/intro.rst b/Doc/c-api/intro.rst index 3e7890cb76647..9efac0b83d024 100644 --- a/Doc/c-api/intro.rst +++ b/Doc/c-api/intro.rst @@ -709,12 +709,10 @@ the table of loaded modules, and creates the fundamental modules :mod:`builtins`, :mod:`__main__`, and :mod:`sys`. It also initializes the module search path (``sys.path``). -.. index:: single: PySys_SetArgvEx() - :c:func:`Py_Initialize` does not set the "script argument list" (``sys.argv``). -If this variable is needed by Python code that will be executed later, it must -be set explicitly with a call to ``PySys_SetArgvEx(argc, argv, updatepath)`` -after the call to :c:func:`Py_Initialize`. +If this variable is needed by Python code that will be executed later, setting +:c:member:`PyConfig.argv` and :c:member:`PyConfig.parse_argv` must be set: see +:ref:`Python Initialization Configuration `. On most systems (in particular, on Unix and Windows, although the details are slightly different), :c:func:`Py_Initialize` calculates the module search path diff --git a/Doc/c-api/sys.rst b/Doc/c-api/sys.rst index 66216eee6d06e..5e8d993100f63 100644 --- a/Doc/c-api/sys.rst +++ b/Doc/c-api/sys.rst @@ -264,10 +264,17 @@ accessible to C code. They all work with the current interpreter thread's .. c:function:: void PySys_SetPath(const wchar_t *path) + This API is kept for backward compatibility: setting + :c:member:`PyConfig.module_search_paths` and + :c:member:`PyConfig.module_search_paths_set` should be used instead, see + :ref:`Python Initialization Configuration `. + Set :data:`sys.path` to a list object of paths found in *path* which should be a list of paths separated with the platform's search path delimiter (``:`` on Unix, ``;`` on Windows). + .. deprecated:: 3.11 + .. c:function:: void PySys_WriteStdout(const char *format, ...) Write the output string described by *format* to :data:`sys.stdout`. No diff --git a/Doc/whatsnew/3.11.rst b/Doc/whatsnew/3.11.rst index c84b36f8d6c40..822cb8b1f0f34 100644 --- a/Doc/whatsnew/3.11.rst +++ b/Doc/whatsnew/3.11.rst @@ -1742,6 +1742,9 @@ Deprecated * :c:func:`PySys_AddWarnOption` * :c:func:`PySys_AddXOption` * :c:func:`PySys_HasWarnOptions` + * :c:func:`PySys_SetArgvEx` + * :c:func:`PySys_SetArgv` + * :c:func:`PySys_SetPath` * :c:func:`Py_SetPath` * :c:func:`Py_SetProgramName` * :c:func:`Py_SetPythonHome` @@ -1750,7 +1753,7 @@ Deprecated Use the new :c:type:`PyConfig` API of the :ref:`Python Initialization Configuration ` instead (:pep:`587`). - (Contributed by Victor Stinner in :issue:`44113`.) + (Contributed by Victor Stinner in :gh:`88279`.) * Deprecate the ``ob_shash`` member of the :c:type:`PyBytesObject`. Use :c:func:`PyObject_Hash` instead. (Contributed by Inada Naoki in :issue:`46864`.) diff --git a/Include/sysmodule.h b/Include/sysmodule.h index 3463c62230900..b5087119b1cae 100644 --- a/Include/sysmodule.h +++ b/Include/sysmodule.h @@ -10,9 +10,9 @@ extern "C" { PyAPI_FUNC(PyObject *) PySys_GetObject(const char *); PyAPI_FUNC(int) PySys_SetObject(const char *, PyObject *); -PyAPI_FUNC(void) PySys_SetArgv(int, wchar_t **); -PyAPI_FUNC(void) PySys_SetArgvEx(int, wchar_t **, int); -PyAPI_FUNC(void) PySys_SetPath(const wchar_t *); +Py_DEPRECATED(3.11) PyAPI_FUNC(void) PySys_SetArgv(int, wchar_t **); +Py_DEPRECATED(3.11) PyAPI_FUNC(void) PySys_SetArgvEx(int, wchar_t **, int); +Py_DEPRECATED(3.11) PyAPI_FUNC(void) PySys_SetPath(const wchar_t *); PyAPI_FUNC(void) PySys_WriteStdout(const char *format, ...) Py_GCC_ATTRIBUTE((format(printf, 1, 2))); diff --git a/Misc/NEWS.d/next/C API/2022-05-06-04-55-17.gh-issue-88279.3mQ54t.rst b/Misc/NEWS.d/next/C API/2022-05-06-04-55-17.gh-issue-88279.3mQ54t.rst new file mode 100644 index 0000000000000..eb448f994e8b9 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2022-05-06-04-55-17.gh-issue-88279.3mQ54t.rst @@ -0,0 +1,2 @@ +Deprecate the C functions: :c:func:`PySys_SetArgv`, +:c:func:`PySys_SetArgvEx`, :c:func:`PySys_SetPath`. Patch by Victor Stinner. From webhook-mailer at python.org Thu May 5 23:32:40 2022 From: webhook-mailer at python.org (rhettinger) Date: Fri, 06 May 2022 03:32:40 -0000 Subject: [Python-checkins] update argparse's doc of append action. (#92344) Message-ID: https://github.com/python/cpython/commit/301351c6a227249770fdf498054e6bbce1c3ee3c commit: 301351c6a227249770fdf498054e6bbce1c3ee3c branch: main author: Hai Shi committer: rhettinger date: 2022-05-05T22:32:35-05:00 summary: update argparse's doc of append action. (#92344) files: M Doc/library/argparse.rst diff --git a/Doc/library/argparse.rst b/Doc/library/argparse.rst index 5d269cc4eac4a..b5a2b794c2385 100644 --- a/Doc/library/argparse.rst +++ b/Doc/library/argparse.rst @@ -846,8 +846,10 @@ how the command-line arguments should be handled. The supplied actions are: Namespace(foo=True, bar=False, baz=True) * ``'append'`` - This stores a list, and appends each argument value to the - list. This is useful to allow an option to be specified multiple times. - Example usage:: + list. It is useful to allow an option to be specified multiple times. + If the default value is non-empty, the default elements will be present + in the parsed value for the option, with any values from the + command line appended after those default values. Example usage:: >>> parser = argparse.ArgumentParser() >>> parser.add_argument('--foo', action='append') From webhook-mailer at python.org Thu May 5 23:59:55 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Fri, 06 May 2022 03:59:55 -0000 Subject: [Python-checkins] gh-92356: Fix regression in ctypes function call overhead (#92357) Message-ID: https://github.com/python/cpython/commit/adcb6a6055c7fe6e02621f66945be237b42e945a commit: adcb6a6055c7fe6e02621f66945be237b42e945a branch: main author: Michael Droettboom committer: JelleZijlstra date: 2022-05-05T20:59:45-07:00 summary: gh-92356: Fix regression in ctypes function call overhead (#92357) 38f331d introduced a delayed initialization routine to set up ctypes formattable (`_ctypes_init_fielddesc`), but inadvertently removed setting the `initialization` flag to 1 to avoid initting each time. files: A Misc/NEWS.d/next/Library/2022-05-05-19-25-09.gh-issue-92356.uvxWdu.rst M Modules/_ctypes/cfield.c diff --git a/Misc/NEWS.d/next/Library/2022-05-05-19-25-09.gh-issue-92356.uvxWdu.rst b/Misc/NEWS.d/next/Library/2022-05-05-19-25-09.gh-issue-92356.uvxWdu.rst new file mode 100644 index 0000000000000..9c9566e5b9d71 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-05-05-19-25-09.gh-issue-92356.uvxWdu.rst @@ -0,0 +1 @@ +Fixed a performance regression in ctypes function calls. diff --git a/Modules/_ctypes/cfield.c b/Modules/_ctypes/cfield.c index 23c11c98b2afc..c7234fbb18a0f 100644 --- a/Modules/_ctypes/cfield.c +++ b/Modules/_ctypes/cfield.c @@ -1602,6 +1602,7 @@ _ctypes_get_fielddesc(const char *fmt) struct fielddesc *table = formattable; if (!initialized) { + initialized = 1; _ctypes_init_fielddesc(); } From webhook-mailer at python.org Fri May 6 00:01:19 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Fri, 06 May 2022 04:01:19 -0000 Subject: [Python-checkins] gh-92112: Fix crash triggered by an evil custom `mro()` (#92113) Message-ID: https://github.com/python/cpython/commit/85354ed78c0edb6d81a2bd53cabc85e547b8b26e commit: 85354ed78c0edb6d81a2bd53cabc85e547b8b26e branch: main author: Alexey Izbyshev committer: JelleZijlstra date: 2022-05-05T21:01:15-07:00 summary: gh-92112: Fix crash triggered by an evil custom `mro()` (#92113) files: A Misc/NEWS.d/next/Core and Builtins/2022-05-01-10-58-38.gh-issue-92112.lLJemu.rst M Lib/test/test_descr.py M Objects/typeobject.c diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py index 48d43d7af85d9..afe0f7e9c7fd4 100644 --- a/Lib/test/test_descr.py +++ b/Lib/test/test_descr.py @@ -5784,6 +5784,23 @@ def mro(cls): class A(metaclass=M): pass + def test_disappearing_custom_mro(self): + """ + gh-92112: A custom mro() returning a result conflicting with + __bases__ and deleting itself caused a double free. + """ + class B: + pass + + class M(DebugHelperMeta): + def mro(cls): + del M.mro + return (B,) + + with self.assertRaises(TypeError): + class A(metaclass=M): + pass + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-01-10-58-38.gh-issue-92112.lLJemu.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-01-10-58-38.gh-issue-92112.lLJemu.rst new file mode 100644 index 0000000000000..00c938e89f438 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-05-01-10-58-38.gh-issue-92112.lLJemu.rst @@ -0,0 +1 @@ +Fix crash triggered by an evil custom ``mro()`` on a metaclass. diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 4afaf240da1d1..1bcfd9a9c52bc 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -345,22 +345,26 @@ type_mro_modified(PyTypeObject *type, PyObject *bases) { Py_ssize_t i, n; int custom = !Py_IS_TYPE(type, &PyType_Type); int unbound; - PyObject *mro_meth = NULL; - PyObject *type_mro_meth = NULL; if (custom) { + PyObject *mro_meth, *type_mro_meth; mro_meth = lookup_maybe_method( (PyObject *)type, &_Py_ID(mro), &unbound); - if (mro_meth == NULL) + if (mro_meth == NULL) { goto clear; + } type_mro_meth = lookup_maybe_method( (PyObject *)&PyType_Type, &_Py_ID(mro), &unbound); - if (type_mro_meth == NULL) + if (type_mro_meth == NULL) { + Py_DECREF(mro_meth); goto clear; - if (mro_meth != type_mro_meth) + } + int custom_mro = (mro_meth != type_mro_meth); + Py_DECREF(mro_meth); + Py_DECREF(type_mro_meth); + if (custom_mro) { goto clear; - Py_XDECREF(mro_meth); - Py_XDECREF(type_mro_meth); + } } n = PyTuple_GET_SIZE(bases); for (i = 0; i < n; i++) { @@ -373,8 +377,6 @@ type_mro_modified(PyTypeObject *type, PyObject *bases) { } return; clear: - Py_XDECREF(mro_meth); - Py_XDECREF(type_mro_meth); type->tp_flags &= ~Py_TPFLAGS_VALID_VERSION_TAG; type->tp_version_tag = 0; /* 0 is not a valid version tag */ } From webhook-mailer at python.org Fri May 6 00:14:18 2022 From: webhook-mailer at python.org (tim-one) Date: Fri, 06 May 2022 04:14:18 -0000 Subject: [Python-checkins] Issues/88027: A potential double free in list_sort_impl (#92367) Message-ID: https://github.com/python/cpython/commit/9652900969df77b1ac245595419431df19296af9 commit: 9652900969df77b1ac245595419431df19296af9 branch: main author: Tim Peters committer: tim-one date: 2022-05-05T23:14:09-05:00 summary: Issues/88027: A potential double free in list_sort_impl (#92367) merge_freemem(): set keys to NULL do it's harmless to call this again. files: M Objects/listobject.c diff --git a/Objects/listobject.c b/Objects/listobject.c index 972f99582163b..b50623ed73d94 100644 --- a/Objects/listobject.c +++ b/Objects/listobject.c @@ -1573,8 +1573,10 @@ static void merge_freemem(MergeState *ms) { assert(ms != NULL); - if (ms->a.keys != ms->temparray) + if (ms->a.keys != ms->temparray) { PyMem_Free(ms->a.keys); + ms->a.keys = NULL; + } } /* Ensure enough temp memory for 'need' array slots is available. From webhook-mailer at python.org Fri May 6 00:38:28 2022 From: webhook-mailer at python.org (miss-islington) Date: Fri, 06 May 2022 04:38:28 -0000 Subject: [Python-checkins] Issues/88027: A potential double free in list_sort_impl (GH-92367) Message-ID: https://github.com/python/cpython/commit/0eef443f0142b8cee705a22d0d1c9df17be94f69 commit: 0eef443f0142b8cee705a22d0d1c9df17be94f69 branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-05T21:38:14-07:00 summary: Issues/88027: A potential double free in list_sort_impl (GH-92367) merge_freemem(): set keys to NULL do it's harmless to call this again. (cherry picked from commit 9652900969df77b1ac245595419431df19296af9) Co-authored-by: Tim Peters files: M Objects/listobject.c diff --git a/Objects/listobject.c b/Objects/listobject.c index 533ee7436d311..d3bc5766df7a0 100644 --- a/Objects/listobject.c +++ b/Objects/listobject.c @@ -1548,8 +1548,10 @@ static void merge_freemem(MergeState *ms) { assert(ms != NULL); - if (ms->a.keys != ms->temparray) + if (ms->a.keys != ms->temparray) { PyMem_Free(ms->a.keys); + ms->a.keys = NULL; + } } /* Ensure enough temp memory for 'need' array slots is available. From webhook-mailer at python.org Fri May 6 00:59:03 2022 From: webhook-mailer at python.org (methane) Date: Fri, 06 May 2022 04:59:03 -0000 Subject: [Python-checkins] NEWS: Reorder items by section (GH-92373) Message-ID: https://github.com/python/cpython/commit/9b491ae04c900579ec82776aacdf71b2fd1e9d6a commit: 9b491ae04c900579ec82776aacdf71b2fd1e9d6a branch: main author: Inada Naoki committer: methane date: 2022-05-06T13:58:58+09:00 summary: NEWS: Reorder items by section (GH-92373) They caused duplicated sections. files: M Misc/NEWS.d/3.5.2rc1.rst M Misc/NEWS.d/3.5.3rc1.rst M Misc/NEWS.d/3.6.0a1.rst M Misc/NEWS.d/3.6.0a2.rst M Misc/NEWS.d/3.6.0a3.rst M Misc/NEWS.d/3.6.2rc1.rst diff --git a/Misc/NEWS.d/3.5.2rc1.rst b/Misc/NEWS.d/3.5.2rc1.rst index d891fa0880dad..01fcd866a896a 100644 --- a/Misc/NEWS.d/3.5.2rc1.rst +++ b/Misc/NEWS.d/3.5.2rc1.rst @@ -1,7 +1,73 @@ +.. bpo: 26556 +.. date: 9636 +.. nonce: v5j2uL +.. release date: 2016-06-12 +.. original section: Library +.. section: Security + +Update expat to 2.1.1, fixes CVE-2015-1283. + +.. + +.. bpo: 0 +.. date: 9635 +.. nonce: E4ochz +.. original section: Library +.. section: Security + +Fix TLS stripping vulnerability in smtplib, CVE-2016-0772. Reported by Team +Oststrom + +.. + +.. bpo: 26839 +.. date: 9629 +.. nonce: yVvy7R +.. original section: Library +.. section: Security + +On Linux, :func:`os.urandom` now calls ``getrandom()`` with +``GRND_NONBLOCK`` to fall back on reading ``/dev/urandom`` if the urandom +entropy pool is not initialized yet. Patch written by Colm Buckley. + +.. + +.. bpo: 26657 +.. date: 9597 +.. nonce: C_-XFg +.. original section: Library +.. section: Security + +Fix directory traversal vulnerability with http.server on Windows. This +fixes a regression that was introduced in 3.3.4rc1 and 3.4.0rc1. Based on +patch by Philipp Hagemeister. + +.. + +.. bpo: 26313 +.. date: 9581 +.. nonce: LjZAjy +.. original section: Library +.. section: Security + +ssl.py _load_windows_store_certs fails if windows cert store is empty. Patch +by Baji. + +.. + +.. bpo: 25939 +.. date: 9561 +.. nonce: X49Fqd +.. original section: Library +.. section: Security + +On Windows open the cert store readonly in ssl.enum_certificates. + +.. + .. bpo: 27066 .. date: 9673 .. nonce: SNExZi -.. release date: 2016-06-12 .. section: Core and Builtins Fixed SystemError if a custom opener (for open()) returns a negative number @@ -373,27 +439,6 @@ PendingDeprecationWarning. .. -.. bpo: 26556 -.. date: 9636 -.. nonce: v5j2uL -.. original section: Library -.. section: Security - -Update expat to 2.1.1, fixes CVE-2015-1283. - -.. - -.. bpo: 0 -.. date: 9635 -.. nonce: E4ochz -.. original section: Library -.. section: Security - -Fix TLS stripping vulnerability in smtplib, CVE-2016-0772. Reported by Team -Oststrom - -.. - .. bpo: 21386 .. date: 9634 .. nonce: DjV72U @@ -449,18 +494,6 @@ build information. .. -.. bpo: 26839 -.. date: 9629 -.. nonce: yVvy7R -.. original section: Library -.. section: Security - -On Linux, :func:`os.urandom` now calls ``getrandom()`` with -``GRND_NONBLOCK`` to fall back on reading ``/dev/urandom`` if the urandom -entropy pool is not initialized yet. Patch written by Colm Buckley. - -.. - .. bpo: 27164 .. date: 9628 .. nonce: 6wmjx2 @@ -776,18 +809,6 @@ limits for multibyte character encodings like utf-8. .. -.. bpo: 26657 -.. date: 9597 -.. nonce: C_-XFg -.. original section: Library -.. section: Security - -Fix directory traversal vulnerability with http.server on Windows. This -fixes a regression that was introduced in 3.3.4rc1 and 3.4.0rc1. Based on -patch by Philipp Hagemeister. - -.. - .. bpo: 26717 .. date: 9596 .. nonce: jngTdu @@ -937,17 +958,6 @@ Peter Inglesby. .. -.. bpo: 26313 -.. date: 9581 -.. nonce: LjZAjy -.. original section: Library -.. section: Security - -ssl.py _load_windows_store_certs fails if windows cert store is empty. Patch -by Baji. - -.. - .. bpo: 26569 .. date: 9580 .. nonce: EX8vF1 @@ -1136,16 +1146,6 @@ socket) when verify_request() returns false. Patch by Aviv Palivoda. .. -.. bpo: 25939 -.. date: 9561 -.. nonce: X49Fqd -.. original section: Library -.. section: Security - -On Windows open the cert store readonly in ssl.enum_certificates. - -.. - .. bpo: 25995 .. date: 9560 .. nonce: NfcimP @@ -2154,6 +2154,16 @@ Excludes venv from library when generating embeddable distro. .. +.. bpo: 17500 +.. date: 9453 +.. nonce: QTZbRV +.. section: Windows + +Remove unused and outdated icons. (See also: +https://github.com/python/pythondotorg/issues/945) + +.. + .. bpo: 26799 .. date: 9457 .. nonce: gK2VXX @@ -2191,13 +2201,3 @@ Teo. .. section: Tools/Demos Fix variable name typo in Argument Clinic. - -.. - -.. bpo: 17500 -.. date: 9453 -.. nonce: QTZbRV -.. section: Windows - -Remove unused and outdated icons. (See also: -https://github.com/python/pythondotorg/issues/945) diff --git a/Misc/NEWS.d/3.5.3rc1.rst b/Misc/NEWS.d/3.5.3rc1.rst index 037cfe416510b..2307fccbf6f92 100644 --- a/Misc/NEWS.d/3.5.3rc1.rst +++ b/Misc/NEWS.d/3.5.3rc1.rst @@ -1,7 +1,29 @@ +.. release date: 2017-01-02 +.. bpo: 27278 +.. date: 9755 +.. nonce: y_HkGw +.. original section: Library +.. section: Security + +Fix os.urandom() implementation using getrandom() on Linux. Truncate size +to INT_MAX and loop until we collected enough random bytes, instead of +casting a directly Py_ssize_t to int. + +.. + +.. bpo: 22636 +.. date: 9753 +.. nonce: 3fQW_g +.. original section: Library +.. section: Security + +Avoid shell injection problems with ctypes.util.find_library(). + +.. + .. bpo: 29073 .. date: 9898 .. nonce: EFpHQ7 -.. release date: 2017-01-02 .. section: Core and Builtins bytearray formatting no longer truncates on first null byte. @@ -1406,18 +1428,6 @@ issue25782. .. -.. bpo: 27278 -.. date: 9755 -.. nonce: y_HkGw -.. original section: Library -.. section: Security - -Fix os.urandom() implementation using getrandom() on Linux. Truncate size -to INT_MAX and loop until we collected enough random bytes, instead of -casting a directly Py_ssize_t to int. - -.. - .. bpo: 26386 .. date: 9754 .. nonce: 9L3Ut4 @@ -1427,16 +1437,6 @@ Fixed ttk.TreeView selection operations with item id's containing spaces. .. -.. bpo: 22636 -.. date: 9753 -.. nonce: 3fQW_g -.. original section: Library -.. section: Security - -Avoid shell injection problems with ctypes.util.find_library(). - -.. - .. bpo: 16182 .. date: 9752 .. nonce: RgFXyr diff --git a/Misc/NEWS.d/3.6.0a1.rst b/Misc/NEWS.d/3.6.0a1.rst index 3fa356c56d94a..53f09b3dfe336 100644 --- a/Misc/NEWS.d/3.6.0a1.rst +++ b/Misc/NEWS.d/3.6.0a1.rst @@ -1,7 +1,40 @@ +.. release date: 2016-05-16 +.. bpo: 26657 +.. date: 9135 +.. nonce: C_-XFg +.. original section: Library +.. section: Security + +Fix directory traversal vulnerability with http.server on Windows. This +fixes a regression that was introduced in 3.3.4rc1 and 3.4.0rc1. Based on +patch by Philipp Hagemeister. + +.. + +.. bpo: 26313 +.. date: 9102 +.. nonce: LjZAjy +.. original section: Library +.. section: Security + +ssl.py _load_windows_store_certs fails if windows cert store is empty. Patch +by Baji. + +.. + +.. bpo: 25939 +.. date: 9076 +.. nonce: X49Fqd +.. original section: Library +.. section: Security + +On Windows open the cert store readonly in ssl.enum_certificates. + +.. + .. bpo: 20041 .. date: 9253 .. nonce: TypyGp -.. release date: 2016-05-16 .. section: Core and Builtins Fixed TypeError when frame.f_trace is set to None. Patch by Xavier de Gaye. @@ -1198,18 +1231,6 @@ limits for multibyte character encodings like utf-8. .. -.. bpo: 26657 -.. date: 9135 -.. nonce: C_-XFg -.. original section: Library -.. section: Security - -Fix directory traversal vulnerability with http.server on Windows. This -fixes a regression that was introduced in 3.3.4rc1 and 3.4.0rc1. Based on -patch by Philipp Hagemeister. - -.. - .. bpo: 26717 .. date: 9134 .. nonce: jngTdu @@ -1532,17 +1553,6 @@ tracemalloc to get the traceback where source object was allocated. .. -.. bpo: 26313 -.. date: 9102 -.. nonce: LjZAjy -.. original section: Library -.. section: Security - -ssl.py _load_windows_store_certs fails if windows cert store is empty. Patch -by Baji. - -.. - .. bpo: 26569 .. date: 9101 .. nonce: EX8vF1 @@ -1793,16 +1803,6 @@ handle_error() method, and will now to stop a single-threaded server. .. -.. bpo: 25939 -.. date: 9076 -.. nonce: X49Fqd -.. original section: Library -.. section: Security - -On Windows open the cert store readonly in ssl.enum_certificates. - -.. - .. bpo: 25995 .. date: 9075 .. nonce: NfcimP diff --git a/Misc/NEWS.d/3.6.0a2.rst b/Misc/NEWS.d/3.6.0a2.rst index fa050dec27ff0..1b336d7bc5137 100644 --- a/Misc/NEWS.d/3.6.0a2.rst +++ b/Misc/NEWS.d/3.6.0a2.rst @@ -1,7 +1,40 @@ +.. release date: 2016-06-13 +.. bpo: 26556 +.. date: 9316 +.. nonce: v5j2uL +.. original section: Library +.. section: Security + +Update expat to 2.1.1, fixes CVE-2015-1283. + +.. + +.. bpo: 0 +.. date: 9315 +.. nonce: PHOAdg +.. original section: Library +.. section: Security + +Fix TLS stripping vulnerability in smtplib, CVE-2016-0772. Reported by Team +Oststrom. + +.. + +.. bpo: 26839 +.. date: 9303 +.. nonce: yVvy7R +.. original section: Library +.. section: Security + +On Linux, :func:`os.urandom` now calls ``getrandom()`` with +``GRND_NONBLOCK`` to fall back on reading ``/dev/urandom`` if the urandom +entropy pool is not initialized yet. Patch written by Colm Buckley. + +.. + .. bpo: 27095 .. date: 9332 .. nonce: 92UoyH -.. release date: 2016-06-13 .. section: Core and Builtins Simplified MAKE_FUNCTION and removed MAKE_CLOSURE opcodes. Patch by Demur @@ -159,27 +192,6 @@ Rees. .. -.. bpo: 26556 -.. date: 9316 -.. nonce: v5j2uL -.. original section: Library -.. section: Security - -Update expat to 2.1.1, fixes CVE-2015-1283. - -.. - -.. bpo: 0 -.. date: 9315 -.. nonce: PHOAdg -.. original section: Library -.. section: Security - -Fix TLS stripping vulnerability in smtplib, CVE-2016-0772. Reported by Team -Oststrom. - -.. - .. bpo: 21386 .. date: 9314 .. nonce: DjV72U @@ -294,18 +306,6 @@ build information. .. -.. bpo: 26839 -.. date: 9303 -.. nonce: yVvy7R -.. original section: Library -.. section: Security - -On Linux, :func:`os.urandom` now calls ``getrandom()`` with -``GRND_NONBLOCK`` to fall back on reading ``/dev/urandom`` if the urandom -entropy pool is not initialized yet. Patch written by Colm Buckley. - -.. - .. bpo: 23883 .. date: 9302 .. nonce: tsZUiM @@ -735,6 +735,16 @@ default when used interactively. .. +.. bpo: 17500 +.. date: 9257 +.. nonce: QTZbRV +.. section: Windows + +Remove unused and outdated icons. (See also: +https://github.com/python/pythondotorg/issues/945) + +.. + .. bpo: 27229 .. date: 9259 .. nonce: C2NDch @@ -755,16 +765,6 @@ Update OS X 10.5+ 32-bit-only installer to build and link with OpenSSL .. -.. bpo: 17500 -.. date: 9257 -.. nonce: QTZbRV -.. section: Windows - -Remove unused and outdated icons. (See also: -https://github.com/python/pythondotorg/issues/945) - -.. - .. bpo: 27186 .. date: 9256 .. nonce: Ll8R-t diff --git a/Misc/NEWS.d/3.6.0a3.rst b/Misc/NEWS.d/3.6.0a3.rst index 4b0000b0e7975..62892b59ded6a 100644 --- a/Misc/NEWS.d/3.6.0a3.rst +++ b/Misc/NEWS.d/3.6.0a3.rst @@ -1,7 +1,29 @@ +.. release date: 2016-07-11 +.. bpo: 27278 +.. date: 9361 +.. nonce: y_HkGw +.. original section: Library +.. section: Security + +Fix os.urandom() implementation using getrandom() on Linux. Truncate size +to INT_MAX and loop until we collected enough random bytes, instead of +casting a directly Py_ssize_t to int. + +.. + +.. bpo: 22636 +.. date: 9357 +.. nonce: 3fQW_g +.. original section: Library +.. section: Security + +Avoid shell injection problems with ctypes.util.find_library(). + +.. + .. bpo: 27473 .. date: 9385 .. nonce: _nOtTA -.. release date: 2016-07-11 .. section: Core and Builtins Fixed possible integer overflow in bytes and bytearray concatenations. @@ -248,18 +270,6 @@ issue25782. .. -.. bpo: 27278 -.. date: 9361 -.. nonce: y_HkGw -.. original section: Library -.. section: Security - -Fix os.urandom() implementation using getrandom() on Linux. Truncate size -to INT_MAX and loop until we collected enough random bytes, instead of -casting a directly Py_ssize_t to int. - -.. - .. bpo: 16864 .. date: 9360 .. nonce: W7tJDa @@ -289,16 +299,6 @@ env var PAGER). .. -.. bpo: 22636 -.. date: 9357 -.. nonce: 3fQW_g -.. original section: Library -.. section: Security - -Avoid shell injection problems with ctypes.util.find_library(). - -.. - .. bpo: 16182 .. date: 9356 .. nonce: RgFXyr diff --git a/Misc/NEWS.d/3.6.2rc1.rst b/Misc/NEWS.d/3.6.2rc1.rst index 20cabb05fa3b1..cdf4c3d541c4c 100644 --- a/Misc/NEWS.d/3.6.2rc1.rst +++ b/Misc/NEWS.d/3.6.2rc1.rst @@ -1,7 +1,19 @@ +.. release date: 2017-06-17 +.. bpo: 29591 +.. date: 9966 +.. nonce: ExKblw +.. original section: Library +.. section: Security + +Update expat copy from 2.1.1 to 2.2.0 to get fixes of CVE-2016-0718 and +CVE-2016-4472. See https://sourceforge.net/p/expat/bugs/537/ for more +information. + +.. + .. bpo: 30682 .. date: 9989 .. nonce: zZm88E -.. release date: 2017-06-17 .. section: Core and Builtins Removed a too-strict assertion that failed for certain f-strings, such as @@ -224,18 +236,6 @@ with misplaced inline modifier. Patch by Roy Williams. .. -.. bpo: 29591 -.. date: 9966 -.. nonce: ExKblw -.. original section: Library -.. section: Security - -Update expat copy from 2.1.1 to 2.2.0 to get fixes of CVE-2016-0718 and -CVE-2016-4472. See https://sourceforge.net/p/expat/bugs/537/ for more -information. - -.. - .. bpo: 24484 .. date: 9965 .. nonce: fNS32j From webhook-mailer at python.org Fri May 6 00:59:36 2022 From: webhook-mailer at python.org (ned-deily) Date: Fri, 06 May 2022 04:59:36 -0000 Subject: [Python-checkins] bpo-46907: Update macOS installer to SQLite 3.38.4. (GH-32148) Message-ID: https://github.com/python/cpython/commit/926854e8583125eaadd2a19b580c09d7c12389e9 commit: 926854e8583125eaadd2a19b580c09d7c12389e9 branch: main author: Mariusz Felisiak committer: ned-deily date: 2022-05-06T00:59:32-04:00 summary: bpo-46907: Update macOS installer to SQLite 3.38.4. (GH-32148) files: A Misc/NEWS.d/next/macOS/2022-05-05-06-21-39.bpo-46907.dkgFPk.rst M Mac/BuildScript/build-installer.py diff --git a/Mac/BuildScript/build-installer.py b/Mac/BuildScript/build-installer.py index 1fb6749fc7d5b..91e2dd6191e5d 100755 --- a/Mac/BuildScript/build-installer.py +++ b/Mac/BuildScript/build-installer.py @@ -358,14 +358,13 @@ def library_recipes(): ), ), dict( - name="SQLite 3.38.1", - url="https://sqlite.org/2022/sqlite-autoconf-3380100.tar.gz", - checksum="5af57892dc0993af596bef56931db23f", + name="SQLite 3.38.4", + url="https://sqlite.org/2022/sqlite-autoconf-3380400.tar.gz", + checksum="34c0b92a0609ed4ce78582e8dc1ed45a", extra_cflags=('-Os ' '-DSQLITE_ENABLE_FTS5 ' '-DSQLITE_ENABLE_FTS4 ' '-DSQLITE_ENABLE_FTS3_PARENTHESIS ' - '-DSQLITE_ENABLE_JSON1 ' '-DSQLITE_ENABLE_RTREE ' '-DSQLITE_OMIT_AUTOINIT ' '-DSQLITE_TCL=0 ' diff --git a/Misc/NEWS.d/next/macOS/2022-05-05-06-21-39.bpo-46907.dkgFPk.rst b/Misc/NEWS.d/next/macOS/2022-05-05-06-21-39.bpo-46907.dkgFPk.rst new file mode 100644 index 0000000000000..f530218c09b18 --- /dev/null +++ b/Misc/NEWS.d/next/macOS/2022-05-05-06-21-39.bpo-46907.dkgFPk.rst @@ -0,0 +1 @@ +Update macOS installer to SQLite 3.38.4. From webhook-mailer at python.org Fri May 6 01:15:58 2022 From: webhook-mailer at python.org (miss-islington) Date: Fri, 06 May 2022 05:15:58 -0000 Subject: [Python-checkins] NEWS: Reorder items by section (GH-92373) Message-ID: https://github.com/python/cpython/commit/3db0e0b9f7a32246a0311ed4603b338a2ecf43a4 commit: 3db0e0b9f7a32246a0311ed4603b338a2ecf43a4 branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-05T22:15:53-07:00 summary: NEWS: Reorder items by section (GH-92373) They caused duplicated sections. (cherry picked from commit 9b491ae04c900579ec82776aacdf71b2fd1e9d6a) Co-authored-by: Inada Naoki files: M Misc/NEWS.d/3.5.2rc1.rst M Misc/NEWS.d/3.5.3rc1.rst M Misc/NEWS.d/3.6.0a1.rst M Misc/NEWS.d/3.6.0a2.rst M Misc/NEWS.d/3.6.0a3.rst M Misc/NEWS.d/3.6.2rc1.rst diff --git a/Misc/NEWS.d/3.5.2rc1.rst b/Misc/NEWS.d/3.5.2rc1.rst index d891fa0880dad..01fcd866a896a 100644 --- a/Misc/NEWS.d/3.5.2rc1.rst +++ b/Misc/NEWS.d/3.5.2rc1.rst @@ -1,7 +1,73 @@ +.. bpo: 26556 +.. date: 9636 +.. nonce: v5j2uL +.. release date: 2016-06-12 +.. original section: Library +.. section: Security + +Update expat to 2.1.1, fixes CVE-2015-1283. + +.. + +.. bpo: 0 +.. date: 9635 +.. nonce: E4ochz +.. original section: Library +.. section: Security + +Fix TLS stripping vulnerability in smtplib, CVE-2016-0772. Reported by Team +Oststrom + +.. + +.. bpo: 26839 +.. date: 9629 +.. nonce: yVvy7R +.. original section: Library +.. section: Security + +On Linux, :func:`os.urandom` now calls ``getrandom()`` with +``GRND_NONBLOCK`` to fall back on reading ``/dev/urandom`` if the urandom +entropy pool is not initialized yet. Patch written by Colm Buckley. + +.. + +.. bpo: 26657 +.. date: 9597 +.. nonce: C_-XFg +.. original section: Library +.. section: Security + +Fix directory traversal vulnerability with http.server on Windows. This +fixes a regression that was introduced in 3.3.4rc1 and 3.4.0rc1. Based on +patch by Philipp Hagemeister. + +.. + +.. bpo: 26313 +.. date: 9581 +.. nonce: LjZAjy +.. original section: Library +.. section: Security + +ssl.py _load_windows_store_certs fails if windows cert store is empty. Patch +by Baji. + +.. + +.. bpo: 25939 +.. date: 9561 +.. nonce: X49Fqd +.. original section: Library +.. section: Security + +On Windows open the cert store readonly in ssl.enum_certificates. + +.. + .. bpo: 27066 .. date: 9673 .. nonce: SNExZi -.. release date: 2016-06-12 .. section: Core and Builtins Fixed SystemError if a custom opener (for open()) returns a negative number @@ -373,27 +439,6 @@ PendingDeprecationWarning. .. -.. bpo: 26556 -.. date: 9636 -.. nonce: v5j2uL -.. original section: Library -.. section: Security - -Update expat to 2.1.1, fixes CVE-2015-1283. - -.. - -.. bpo: 0 -.. date: 9635 -.. nonce: E4ochz -.. original section: Library -.. section: Security - -Fix TLS stripping vulnerability in smtplib, CVE-2016-0772. Reported by Team -Oststrom - -.. - .. bpo: 21386 .. date: 9634 .. nonce: DjV72U @@ -449,18 +494,6 @@ build information. .. -.. bpo: 26839 -.. date: 9629 -.. nonce: yVvy7R -.. original section: Library -.. section: Security - -On Linux, :func:`os.urandom` now calls ``getrandom()`` with -``GRND_NONBLOCK`` to fall back on reading ``/dev/urandom`` if the urandom -entropy pool is not initialized yet. Patch written by Colm Buckley. - -.. - .. bpo: 27164 .. date: 9628 .. nonce: 6wmjx2 @@ -776,18 +809,6 @@ limits for multibyte character encodings like utf-8. .. -.. bpo: 26657 -.. date: 9597 -.. nonce: C_-XFg -.. original section: Library -.. section: Security - -Fix directory traversal vulnerability with http.server on Windows. This -fixes a regression that was introduced in 3.3.4rc1 and 3.4.0rc1. Based on -patch by Philipp Hagemeister. - -.. - .. bpo: 26717 .. date: 9596 .. nonce: jngTdu @@ -937,17 +958,6 @@ Peter Inglesby. .. -.. bpo: 26313 -.. date: 9581 -.. nonce: LjZAjy -.. original section: Library -.. section: Security - -ssl.py _load_windows_store_certs fails if windows cert store is empty. Patch -by Baji. - -.. - .. bpo: 26569 .. date: 9580 .. nonce: EX8vF1 @@ -1136,16 +1146,6 @@ socket) when verify_request() returns false. Patch by Aviv Palivoda. .. -.. bpo: 25939 -.. date: 9561 -.. nonce: X49Fqd -.. original section: Library -.. section: Security - -On Windows open the cert store readonly in ssl.enum_certificates. - -.. - .. bpo: 25995 .. date: 9560 .. nonce: NfcimP @@ -2154,6 +2154,16 @@ Excludes venv from library when generating embeddable distro. .. +.. bpo: 17500 +.. date: 9453 +.. nonce: QTZbRV +.. section: Windows + +Remove unused and outdated icons. (See also: +https://github.com/python/pythondotorg/issues/945) + +.. + .. bpo: 26799 .. date: 9457 .. nonce: gK2VXX @@ -2191,13 +2201,3 @@ Teo. .. section: Tools/Demos Fix variable name typo in Argument Clinic. - -.. - -.. bpo: 17500 -.. date: 9453 -.. nonce: QTZbRV -.. section: Windows - -Remove unused and outdated icons. (See also: -https://github.com/python/pythondotorg/issues/945) diff --git a/Misc/NEWS.d/3.5.3rc1.rst b/Misc/NEWS.d/3.5.3rc1.rst index 037cfe416510b..2307fccbf6f92 100644 --- a/Misc/NEWS.d/3.5.3rc1.rst +++ b/Misc/NEWS.d/3.5.3rc1.rst @@ -1,7 +1,29 @@ +.. release date: 2017-01-02 +.. bpo: 27278 +.. date: 9755 +.. nonce: y_HkGw +.. original section: Library +.. section: Security + +Fix os.urandom() implementation using getrandom() on Linux. Truncate size +to INT_MAX and loop until we collected enough random bytes, instead of +casting a directly Py_ssize_t to int. + +.. + +.. bpo: 22636 +.. date: 9753 +.. nonce: 3fQW_g +.. original section: Library +.. section: Security + +Avoid shell injection problems with ctypes.util.find_library(). + +.. + .. bpo: 29073 .. date: 9898 .. nonce: EFpHQ7 -.. release date: 2017-01-02 .. section: Core and Builtins bytearray formatting no longer truncates on first null byte. @@ -1406,18 +1428,6 @@ issue25782. .. -.. bpo: 27278 -.. date: 9755 -.. nonce: y_HkGw -.. original section: Library -.. section: Security - -Fix os.urandom() implementation using getrandom() on Linux. Truncate size -to INT_MAX and loop until we collected enough random bytes, instead of -casting a directly Py_ssize_t to int. - -.. - .. bpo: 26386 .. date: 9754 .. nonce: 9L3Ut4 @@ -1427,16 +1437,6 @@ Fixed ttk.TreeView selection operations with item id's containing spaces. .. -.. bpo: 22636 -.. date: 9753 -.. nonce: 3fQW_g -.. original section: Library -.. section: Security - -Avoid shell injection problems with ctypes.util.find_library(). - -.. - .. bpo: 16182 .. date: 9752 .. nonce: RgFXyr diff --git a/Misc/NEWS.d/3.6.0a1.rst b/Misc/NEWS.d/3.6.0a1.rst index 3fa356c56d94a..53f09b3dfe336 100644 --- a/Misc/NEWS.d/3.6.0a1.rst +++ b/Misc/NEWS.d/3.6.0a1.rst @@ -1,7 +1,40 @@ +.. release date: 2016-05-16 +.. bpo: 26657 +.. date: 9135 +.. nonce: C_-XFg +.. original section: Library +.. section: Security + +Fix directory traversal vulnerability with http.server on Windows. This +fixes a regression that was introduced in 3.3.4rc1 and 3.4.0rc1. Based on +patch by Philipp Hagemeister. + +.. + +.. bpo: 26313 +.. date: 9102 +.. nonce: LjZAjy +.. original section: Library +.. section: Security + +ssl.py _load_windows_store_certs fails if windows cert store is empty. Patch +by Baji. + +.. + +.. bpo: 25939 +.. date: 9076 +.. nonce: X49Fqd +.. original section: Library +.. section: Security + +On Windows open the cert store readonly in ssl.enum_certificates. + +.. + .. bpo: 20041 .. date: 9253 .. nonce: TypyGp -.. release date: 2016-05-16 .. section: Core and Builtins Fixed TypeError when frame.f_trace is set to None. Patch by Xavier de Gaye. @@ -1198,18 +1231,6 @@ limits for multibyte character encodings like utf-8. .. -.. bpo: 26657 -.. date: 9135 -.. nonce: C_-XFg -.. original section: Library -.. section: Security - -Fix directory traversal vulnerability with http.server on Windows. This -fixes a regression that was introduced in 3.3.4rc1 and 3.4.0rc1. Based on -patch by Philipp Hagemeister. - -.. - .. bpo: 26717 .. date: 9134 .. nonce: jngTdu @@ -1532,17 +1553,6 @@ tracemalloc to get the traceback where source object was allocated. .. -.. bpo: 26313 -.. date: 9102 -.. nonce: LjZAjy -.. original section: Library -.. section: Security - -ssl.py _load_windows_store_certs fails if windows cert store is empty. Patch -by Baji. - -.. - .. bpo: 26569 .. date: 9101 .. nonce: EX8vF1 @@ -1793,16 +1803,6 @@ handle_error() method, and will now to stop a single-threaded server. .. -.. bpo: 25939 -.. date: 9076 -.. nonce: X49Fqd -.. original section: Library -.. section: Security - -On Windows open the cert store readonly in ssl.enum_certificates. - -.. - .. bpo: 25995 .. date: 9075 .. nonce: NfcimP diff --git a/Misc/NEWS.d/3.6.0a2.rst b/Misc/NEWS.d/3.6.0a2.rst index fa050dec27ff0..1b336d7bc5137 100644 --- a/Misc/NEWS.d/3.6.0a2.rst +++ b/Misc/NEWS.d/3.6.0a2.rst @@ -1,7 +1,40 @@ +.. release date: 2016-06-13 +.. bpo: 26556 +.. date: 9316 +.. nonce: v5j2uL +.. original section: Library +.. section: Security + +Update expat to 2.1.1, fixes CVE-2015-1283. + +.. + +.. bpo: 0 +.. date: 9315 +.. nonce: PHOAdg +.. original section: Library +.. section: Security + +Fix TLS stripping vulnerability in smtplib, CVE-2016-0772. Reported by Team +Oststrom. + +.. + +.. bpo: 26839 +.. date: 9303 +.. nonce: yVvy7R +.. original section: Library +.. section: Security + +On Linux, :func:`os.urandom` now calls ``getrandom()`` with +``GRND_NONBLOCK`` to fall back on reading ``/dev/urandom`` if the urandom +entropy pool is not initialized yet. Patch written by Colm Buckley. + +.. + .. bpo: 27095 .. date: 9332 .. nonce: 92UoyH -.. release date: 2016-06-13 .. section: Core and Builtins Simplified MAKE_FUNCTION and removed MAKE_CLOSURE opcodes. Patch by Demur @@ -159,27 +192,6 @@ Rees. .. -.. bpo: 26556 -.. date: 9316 -.. nonce: v5j2uL -.. original section: Library -.. section: Security - -Update expat to 2.1.1, fixes CVE-2015-1283. - -.. - -.. bpo: 0 -.. date: 9315 -.. nonce: PHOAdg -.. original section: Library -.. section: Security - -Fix TLS stripping vulnerability in smtplib, CVE-2016-0772. Reported by Team -Oststrom. - -.. - .. bpo: 21386 .. date: 9314 .. nonce: DjV72U @@ -294,18 +306,6 @@ build information. .. -.. bpo: 26839 -.. date: 9303 -.. nonce: yVvy7R -.. original section: Library -.. section: Security - -On Linux, :func:`os.urandom` now calls ``getrandom()`` with -``GRND_NONBLOCK`` to fall back on reading ``/dev/urandom`` if the urandom -entropy pool is not initialized yet. Patch written by Colm Buckley. - -.. - .. bpo: 23883 .. date: 9302 .. nonce: tsZUiM @@ -735,6 +735,16 @@ default when used interactively. .. +.. bpo: 17500 +.. date: 9257 +.. nonce: QTZbRV +.. section: Windows + +Remove unused and outdated icons. (See also: +https://github.com/python/pythondotorg/issues/945) + +.. + .. bpo: 27229 .. date: 9259 .. nonce: C2NDch @@ -755,16 +765,6 @@ Update OS X 10.5+ 32-bit-only installer to build and link with OpenSSL .. -.. bpo: 17500 -.. date: 9257 -.. nonce: QTZbRV -.. section: Windows - -Remove unused and outdated icons. (See also: -https://github.com/python/pythondotorg/issues/945) - -.. - .. bpo: 27186 .. date: 9256 .. nonce: Ll8R-t diff --git a/Misc/NEWS.d/3.6.0a3.rst b/Misc/NEWS.d/3.6.0a3.rst index 4b0000b0e7975..62892b59ded6a 100644 --- a/Misc/NEWS.d/3.6.0a3.rst +++ b/Misc/NEWS.d/3.6.0a3.rst @@ -1,7 +1,29 @@ +.. release date: 2016-07-11 +.. bpo: 27278 +.. date: 9361 +.. nonce: y_HkGw +.. original section: Library +.. section: Security + +Fix os.urandom() implementation using getrandom() on Linux. Truncate size +to INT_MAX and loop until we collected enough random bytes, instead of +casting a directly Py_ssize_t to int. + +.. + +.. bpo: 22636 +.. date: 9357 +.. nonce: 3fQW_g +.. original section: Library +.. section: Security + +Avoid shell injection problems with ctypes.util.find_library(). + +.. + .. bpo: 27473 .. date: 9385 .. nonce: _nOtTA -.. release date: 2016-07-11 .. section: Core and Builtins Fixed possible integer overflow in bytes and bytearray concatenations. @@ -248,18 +270,6 @@ issue25782. .. -.. bpo: 27278 -.. date: 9361 -.. nonce: y_HkGw -.. original section: Library -.. section: Security - -Fix os.urandom() implementation using getrandom() on Linux. Truncate size -to INT_MAX and loop until we collected enough random bytes, instead of -casting a directly Py_ssize_t to int. - -.. - .. bpo: 16864 .. date: 9360 .. nonce: W7tJDa @@ -289,16 +299,6 @@ env var PAGER). .. -.. bpo: 22636 -.. date: 9357 -.. nonce: 3fQW_g -.. original section: Library -.. section: Security - -Avoid shell injection problems with ctypes.util.find_library(). - -.. - .. bpo: 16182 .. date: 9356 .. nonce: RgFXyr diff --git a/Misc/NEWS.d/3.6.2rc1.rst b/Misc/NEWS.d/3.6.2rc1.rst index 20cabb05fa3b1..cdf4c3d541c4c 100644 --- a/Misc/NEWS.d/3.6.2rc1.rst +++ b/Misc/NEWS.d/3.6.2rc1.rst @@ -1,7 +1,19 @@ +.. release date: 2017-06-17 +.. bpo: 29591 +.. date: 9966 +.. nonce: ExKblw +.. original section: Library +.. section: Security + +Update expat copy from 2.1.1 to 2.2.0 to get fixes of CVE-2016-0718 and +CVE-2016-4472. See https://sourceforge.net/p/expat/bugs/537/ for more +information. + +.. + .. bpo: 30682 .. date: 9989 .. nonce: zZm88E -.. release date: 2017-06-17 .. section: Core and Builtins Removed a too-strict assertion that failed for certain f-strings, such as @@ -224,18 +236,6 @@ with misplaced inline modifier. Patch by Roy Williams. .. -.. bpo: 29591 -.. date: 9966 -.. nonce: ExKblw -.. original section: Library -.. section: Security - -Update expat copy from 2.1.1 to 2.2.0 to get fixes of CVE-2016-0718 and -CVE-2016-4472. See https://sourceforge.net/p/expat/bugs/537/ for more -information. - -.. - .. bpo: 24484 .. date: 9965 .. nonce: fNS32j From webhook-mailer at python.org Fri May 6 01:20:16 2022 From: webhook-mailer at python.org (miss-islington) Date: Fri, 06 May 2022 05:20:16 -0000 Subject: [Python-checkins] NEWS: Reorder items by section (GH-92373) Message-ID: https://github.com/python/cpython/commit/df48bd926ee4bec9a1ca5b94c2254ad8a4c2eb13 commit: df48bd926ee4bec9a1ca5b94c2254ad8a4c2eb13 branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-05T22:20:09-07:00 summary: NEWS: Reorder items by section (GH-92373) They caused duplicated sections. (cherry picked from commit 9b491ae04c900579ec82776aacdf71b2fd1e9d6a) Co-authored-by: Inada Naoki files: M Misc/NEWS.d/3.5.2rc1.rst M Misc/NEWS.d/3.5.3rc1.rst M Misc/NEWS.d/3.6.0a1.rst M Misc/NEWS.d/3.6.0a2.rst M Misc/NEWS.d/3.6.0a3.rst M Misc/NEWS.d/3.6.2rc1.rst diff --git a/Misc/NEWS.d/3.5.2rc1.rst b/Misc/NEWS.d/3.5.2rc1.rst index d891fa0880dad..01fcd866a896a 100644 --- a/Misc/NEWS.d/3.5.2rc1.rst +++ b/Misc/NEWS.d/3.5.2rc1.rst @@ -1,7 +1,73 @@ +.. bpo: 26556 +.. date: 9636 +.. nonce: v5j2uL +.. release date: 2016-06-12 +.. original section: Library +.. section: Security + +Update expat to 2.1.1, fixes CVE-2015-1283. + +.. + +.. bpo: 0 +.. date: 9635 +.. nonce: E4ochz +.. original section: Library +.. section: Security + +Fix TLS stripping vulnerability in smtplib, CVE-2016-0772. Reported by Team +Oststrom + +.. + +.. bpo: 26839 +.. date: 9629 +.. nonce: yVvy7R +.. original section: Library +.. section: Security + +On Linux, :func:`os.urandom` now calls ``getrandom()`` with +``GRND_NONBLOCK`` to fall back on reading ``/dev/urandom`` if the urandom +entropy pool is not initialized yet. Patch written by Colm Buckley. + +.. + +.. bpo: 26657 +.. date: 9597 +.. nonce: C_-XFg +.. original section: Library +.. section: Security + +Fix directory traversal vulnerability with http.server on Windows. This +fixes a regression that was introduced in 3.3.4rc1 and 3.4.0rc1. Based on +patch by Philipp Hagemeister. + +.. + +.. bpo: 26313 +.. date: 9581 +.. nonce: LjZAjy +.. original section: Library +.. section: Security + +ssl.py _load_windows_store_certs fails if windows cert store is empty. Patch +by Baji. + +.. + +.. bpo: 25939 +.. date: 9561 +.. nonce: X49Fqd +.. original section: Library +.. section: Security + +On Windows open the cert store readonly in ssl.enum_certificates. + +.. + .. bpo: 27066 .. date: 9673 .. nonce: SNExZi -.. release date: 2016-06-12 .. section: Core and Builtins Fixed SystemError if a custom opener (for open()) returns a negative number @@ -373,27 +439,6 @@ PendingDeprecationWarning. .. -.. bpo: 26556 -.. date: 9636 -.. nonce: v5j2uL -.. original section: Library -.. section: Security - -Update expat to 2.1.1, fixes CVE-2015-1283. - -.. - -.. bpo: 0 -.. date: 9635 -.. nonce: E4ochz -.. original section: Library -.. section: Security - -Fix TLS stripping vulnerability in smtplib, CVE-2016-0772. Reported by Team -Oststrom - -.. - .. bpo: 21386 .. date: 9634 .. nonce: DjV72U @@ -449,18 +494,6 @@ build information. .. -.. bpo: 26839 -.. date: 9629 -.. nonce: yVvy7R -.. original section: Library -.. section: Security - -On Linux, :func:`os.urandom` now calls ``getrandom()`` with -``GRND_NONBLOCK`` to fall back on reading ``/dev/urandom`` if the urandom -entropy pool is not initialized yet. Patch written by Colm Buckley. - -.. - .. bpo: 27164 .. date: 9628 .. nonce: 6wmjx2 @@ -776,18 +809,6 @@ limits for multibyte character encodings like utf-8. .. -.. bpo: 26657 -.. date: 9597 -.. nonce: C_-XFg -.. original section: Library -.. section: Security - -Fix directory traversal vulnerability with http.server on Windows. This -fixes a regression that was introduced in 3.3.4rc1 and 3.4.0rc1. Based on -patch by Philipp Hagemeister. - -.. - .. bpo: 26717 .. date: 9596 .. nonce: jngTdu @@ -937,17 +958,6 @@ Peter Inglesby. .. -.. bpo: 26313 -.. date: 9581 -.. nonce: LjZAjy -.. original section: Library -.. section: Security - -ssl.py _load_windows_store_certs fails if windows cert store is empty. Patch -by Baji. - -.. - .. bpo: 26569 .. date: 9580 .. nonce: EX8vF1 @@ -1136,16 +1146,6 @@ socket) when verify_request() returns false. Patch by Aviv Palivoda. .. -.. bpo: 25939 -.. date: 9561 -.. nonce: X49Fqd -.. original section: Library -.. section: Security - -On Windows open the cert store readonly in ssl.enum_certificates. - -.. - .. bpo: 25995 .. date: 9560 .. nonce: NfcimP @@ -2154,6 +2154,16 @@ Excludes venv from library when generating embeddable distro. .. +.. bpo: 17500 +.. date: 9453 +.. nonce: QTZbRV +.. section: Windows + +Remove unused and outdated icons. (See also: +https://github.com/python/pythondotorg/issues/945) + +.. + .. bpo: 26799 .. date: 9457 .. nonce: gK2VXX @@ -2191,13 +2201,3 @@ Teo. .. section: Tools/Demos Fix variable name typo in Argument Clinic. - -.. - -.. bpo: 17500 -.. date: 9453 -.. nonce: QTZbRV -.. section: Windows - -Remove unused and outdated icons. (See also: -https://github.com/python/pythondotorg/issues/945) diff --git a/Misc/NEWS.d/3.5.3rc1.rst b/Misc/NEWS.d/3.5.3rc1.rst index 037cfe416510b..2307fccbf6f92 100644 --- a/Misc/NEWS.d/3.5.3rc1.rst +++ b/Misc/NEWS.d/3.5.3rc1.rst @@ -1,7 +1,29 @@ +.. release date: 2017-01-02 +.. bpo: 27278 +.. date: 9755 +.. nonce: y_HkGw +.. original section: Library +.. section: Security + +Fix os.urandom() implementation using getrandom() on Linux. Truncate size +to INT_MAX and loop until we collected enough random bytes, instead of +casting a directly Py_ssize_t to int. + +.. + +.. bpo: 22636 +.. date: 9753 +.. nonce: 3fQW_g +.. original section: Library +.. section: Security + +Avoid shell injection problems with ctypes.util.find_library(). + +.. + .. bpo: 29073 .. date: 9898 .. nonce: EFpHQ7 -.. release date: 2017-01-02 .. section: Core and Builtins bytearray formatting no longer truncates on first null byte. @@ -1406,18 +1428,6 @@ issue25782. .. -.. bpo: 27278 -.. date: 9755 -.. nonce: y_HkGw -.. original section: Library -.. section: Security - -Fix os.urandom() implementation using getrandom() on Linux. Truncate size -to INT_MAX and loop until we collected enough random bytes, instead of -casting a directly Py_ssize_t to int. - -.. - .. bpo: 26386 .. date: 9754 .. nonce: 9L3Ut4 @@ -1427,16 +1437,6 @@ Fixed ttk.TreeView selection operations with item id's containing spaces. .. -.. bpo: 22636 -.. date: 9753 -.. nonce: 3fQW_g -.. original section: Library -.. section: Security - -Avoid shell injection problems with ctypes.util.find_library(). - -.. - .. bpo: 16182 .. date: 9752 .. nonce: RgFXyr diff --git a/Misc/NEWS.d/3.6.0a1.rst b/Misc/NEWS.d/3.6.0a1.rst index 3fa356c56d94a..53f09b3dfe336 100644 --- a/Misc/NEWS.d/3.6.0a1.rst +++ b/Misc/NEWS.d/3.6.0a1.rst @@ -1,7 +1,40 @@ +.. release date: 2016-05-16 +.. bpo: 26657 +.. date: 9135 +.. nonce: C_-XFg +.. original section: Library +.. section: Security + +Fix directory traversal vulnerability with http.server on Windows. This +fixes a regression that was introduced in 3.3.4rc1 and 3.4.0rc1. Based on +patch by Philipp Hagemeister. + +.. + +.. bpo: 26313 +.. date: 9102 +.. nonce: LjZAjy +.. original section: Library +.. section: Security + +ssl.py _load_windows_store_certs fails if windows cert store is empty. Patch +by Baji. + +.. + +.. bpo: 25939 +.. date: 9076 +.. nonce: X49Fqd +.. original section: Library +.. section: Security + +On Windows open the cert store readonly in ssl.enum_certificates. + +.. + .. bpo: 20041 .. date: 9253 .. nonce: TypyGp -.. release date: 2016-05-16 .. section: Core and Builtins Fixed TypeError when frame.f_trace is set to None. Patch by Xavier de Gaye. @@ -1198,18 +1231,6 @@ limits for multibyte character encodings like utf-8. .. -.. bpo: 26657 -.. date: 9135 -.. nonce: C_-XFg -.. original section: Library -.. section: Security - -Fix directory traversal vulnerability with http.server on Windows. This -fixes a regression that was introduced in 3.3.4rc1 and 3.4.0rc1. Based on -patch by Philipp Hagemeister. - -.. - .. bpo: 26717 .. date: 9134 .. nonce: jngTdu @@ -1532,17 +1553,6 @@ tracemalloc to get the traceback where source object was allocated. .. -.. bpo: 26313 -.. date: 9102 -.. nonce: LjZAjy -.. original section: Library -.. section: Security - -ssl.py _load_windows_store_certs fails if windows cert store is empty. Patch -by Baji. - -.. - .. bpo: 26569 .. date: 9101 .. nonce: EX8vF1 @@ -1793,16 +1803,6 @@ handle_error() method, and will now to stop a single-threaded server. .. -.. bpo: 25939 -.. date: 9076 -.. nonce: X49Fqd -.. original section: Library -.. section: Security - -On Windows open the cert store readonly in ssl.enum_certificates. - -.. - .. bpo: 25995 .. date: 9075 .. nonce: NfcimP diff --git a/Misc/NEWS.d/3.6.0a2.rst b/Misc/NEWS.d/3.6.0a2.rst index fa050dec27ff0..1b336d7bc5137 100644 --- a/Misc/NEWS.d/3.6.0a2.rst +++ b/Misc/NEWS.d/3.6.0a2.rst @@ -1,7 +1,40 @@ +.. release date: 2016-06-13 +.. bpo: 26556 +.. date: 9316 +.. nonce: v5j2uL +.. original section: Library +.. section: Security + +Update expat to 2.1.1, fixes CVE-2015-1283. + +.. + +.. bpo: 0 +.. date: 9315 +.. nonce: PHOAdg +.. original section: Library +.. section: Security + +Fix TLS stripping vulnerability in smtplib, CVE-2016-0772. Reported by Team +Oststrom. + +.. + +.. bpo: 26839 +.. date: 9303 +.. nonce: yVvy7R +.. original section: Library +.. section: Security + +On Linux, :func:`os.urandom` now calls ``getrandom()`` with +``GRND_NONBLOCK`` to fall back on reading ``/dev/urandom`` if the urandom +entropy pool is not initialized yet. Patch written by Colm Buckley. + +.. + .. bpo: 27095 .. date: 9332 .. nonce: 92UoyH -.. release date: 2016-06-13 .. section: Core and Builtins Simplified MAKE_FUNCTION and removed MAKE_CLOSURE opcodes. Patch by Demur @@ -159,27 +192,6 @@ Rees. .. -.. bpo: 26556 -.. date: 9316 -.. nonce: v5j2uL -.. original section: Library -.. section: Security - -Update expat to 2.1.1, fixes CVE-2015-1283. - -.. - -.. bpo: 0 -.. date: 9315 -.. nonce: PHOAdg -.. original section: Library -.. section: Security - -Fix TLS stripping vulnerability in smtplib, CVE-2016-0772. Reported by Team -Oststrom. - -.. - .. bpo: 21386 .. date: 9314 .. nonce: DjV72U @@ -294,18 +306,6 @@ build information. .. -.. bpo: 26839 -.. date: 9303 -.. nonce: yVvy7R -.. original section: Library -.. section: Security - -On Linux, :func:`os.urandom` now calls ``getrandom()`` with -``GRND_NONBLOCK`` to fall back on reading ``/dev/urandom`` if the urandom -entropy pool is not initialized yet. Patch written by Colm Buckley. - -.. - .. bpo: 23883 .. date: 9302 .. nonce: tsZUiM @@ -735,6 +735,16 @@ default when used interactively. .. +.. bpo: 17500 +.. date: 9257 +.. nonce: QTZbRV +.. section: Windows + +Remove unused and outdated icons. (See also: +https://github.com/python/pythondotorg/issues/945) + +.. + .. bpo: 27229 .. date: 9259 .. nonce: C2NDch @@ -755,16 +765,6 @@ Update OS X 10.5+ 32-bit-only installer to build and link with OpenSSL .. -.. bpo: 17500 -.. date: 9257 -.. nonce: QTZbRV -.. section: Windows - -Remove unused and outdated icons. (See also: -https://github.com/python/pythondotorg/issues/945) - -.. - .. bpo: 27186 .. date: 9256 .. nonce: Ll8R-t diff --git a/Misc/NEWS.d/3.6.0a3.rst b/Misc/NEWS.d/3.6.0a3.rst index 4b0000b0e7975..62892b59ded6a 100644 --- a/Misc/NEWS.d/3.6.0a3.rst +++ b/Misc/NEWS.d/3.6.0a3.rst @@ -1,7 +1,29 @@ +.. release date: 2016-07-11 +.. bpo: 27278 +.. date: 9361 +.. nonce: y_HkGw +.. original section: Library +.. section: Security + +Fix os.urandom() implementation using getrandom() on Linux. Truncate size +to INT_MAX and loop until we collected enough random bytes, instead of +casting a directly Py_ssize_t to int. + +.. + +.. bpo: 22636 +.. date: 9357 +.. nonce: 3fQW_g +.. original section: Library +.. section: Security + +Avoid shell injection problems with ctypes.util.find_library(). + +.. + .. bpo: 27473 .. date: 9385 .. nonce: _nOtTA -.. release date: 2016-07-11 .. section: Core and Builtins Fixed possible integer overflow in bytes and bytearray concatenations. @@ -248,18 +270,6 @@ issue25782. .. -.. bpo: 27278 -.. date: 9361 -.. nonce: y_HkGw -.. original section: Library -.. section: Security - -Fix os.urandom() implementation using getrandom() on Linux. Truncate size -to INT_MAX and loop until we collected enough random bytes, instead of -casting a directly Py_ssize_t to int. - -.. - .. bpo: 16864 .. date: 9360 .. nonce: W7tJDa @@ -289,16 +299,6 @@ env var PAGER). .. -.. bpo: 22636 -.. date: 9357 -.. nonce: 3fQW_g -.. original section: Library -.. section: Security - -Avoid shell injection problems with ctypes.util.find_library(). - -.. - .. bpo: 16182 .. date: 9356 .. nonce: RgFXyr diff --git a/Misc/NEWS.d/3.6.2rc1.rst b/Misc/NEWS.d/3.6.2rc1.rst index 20cabb05fa3b1..cdf4c3d541c4c 100644 --- a/Misc/NEWS.d/3.6.2rc1.rst +++ b/Misc/NEWS.d/3.6.2rc1.rst @@ -1,7 +1,19 @@ +.. release date: 2017-06-17 +.. bpo: 29591 +.. date: 9966 +.. nonce: ExKblw +.. original section: Library +.. section: Security + +Update expat copy from 2.1.1 to 2.2.0 to get fixes of CVE-2016-0718 and +CVE-2016-4472. See https://sourceforge.net/p/expat/bugs/537/ for more +information. + +.. + .. bpo: 30682 .. date: 9989 .. nonce: zZm88E -.. release date: 2017-06-17 .. section: Core and Builtins Removed a too-strict assertion that failed for certain f-strings, such as @@ -224,18 +236,6 @@ with misplaced inline modifier. Patch by Roy Williams. .. -.. bpo: 29591 -.. date: 9966 -.. nonce: ExKblw -.. original section: Library -.. section: Security - -Update expat copy from 2.1.1 to 2.2.0 to get fixes of CVE-2016-0718 and -CVE-2016-4472. See https://sourceforge.net/p/expat/bugs/537/ for more -information. - -.. - .. bpo: 24484 .. date: 9965 .. nonce: fNS32j From webhook-mailer at python.org Fri May 6 01:48:47 2022 From: webhook-mailer at python.org (methane) Date: Fri, 06 May 2022 05:48:47 -0000 Subject: [Python-checkins] gh-87901: Add encoding to os.popen (GH-92374) Message-ID: https://github.com/python/cpython/commit/2b563f1ad31af0bb0a9947e6f1f76e58dbf170f0 commit: 2b563f1ad31af0bb0a9947e6f1f76e58dbf170f0 branch: main author: Inada Naoki committer: methane date: 2022-05-06T14:48:36+09:00 summary: gh-87901: Add encoding to os.popen (GH-92374) files: A Misc/NEWS.d/next/Library/2022-05-06-13-53-10.gh-issue-87901.NnkUVr.rst M Doc/library/os.rst M Lib/os.py diff --git a/Doc/library/os.rst b/Doc/library/os.rst index 21c2073c9edc3..3c189bb40e234 100644 --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -3916,12 +3916,13 @@ written in Python, such as a mail server's external command delivery program. .. availability:: Unix. -.. function:: popen(cmd, mode='r', buffering=-1) +.. function:: popen(cmd, mode='r', buffering=-1, encoding=None) Open a pipe to or from command *cmd*. The return value is an open file object connected to the pipe, which can be read or written depending on whether *mode* - is ``'r'`` (default) or ``'w'``. The *buffering* argument has the same meaning as + is ``'r'`` (default) or ``'w'``. + The *buffering* and *encoding* arguments have the same meaning as the corresponding argument to the built-in :func:`open` function. The returned file object reads or writes text strings rather than bytes. @@ -3944,6 +3945,9 @@ written in Python, such as a mail server's external command delivery program. documentation for more powerful ways to manage and communicate with subprocesses. + .. versionchanged:: 3.11 + Added the *encoding* parameter. + .. function:: posix_spawn(path, argv, env, *, file_actions=None, \ setpgroup=None, resetids=False, setsid=False, setsigmask=(), \ diff --git a/Lib/os.py b/Lib/os.py index 4626d1fc4a9b5..67662ca7ad858 100644 --- a/Lib/os.py +++ b/Lib/os.py @@ -974,7 +974,7 @@ def spawnlpe(mode, file, *args): # command in a shell can't be supported. if sys.platform != 'vxworks': # Supply os.popen() - def popen(cmd, mode="r", buffering=-1): + def popen(cmd, mode="r", buffering=-1, encoding=None): if not isinstance(cmd, str): raise TypeError("invalid cmd type (%s, expected string)" % type(cmd)) if mode not in ("r", "w"): @@ -982,6 +982,7 @@ def popen(cmd, mode="r", buffering=-1): if buffering == 0 or buffering is None: raise ValueError("popen() does not support unbuffered streams") import subprocess, io + encoding = io.text_encoding(encoding) if mode == "r": proc = subprocess.Popen(cmd, shell=True, text=True, diff --git a/Misc/NEWS.d/next/Library/2022-05-06-13-53-10.gh-issue-87901.NnkUVr.rst b/Misc/NEWS.d/next/Library/2022-05-06-13-53-10.gh-issue-87901.NnkUVr.rst new file mode 100644 index 0000000000000..7f50dfbce9534 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-05-06-13-53-10.gh-issue-87901.NnkUVr.rst @@ -0,0 +1 @@ +Add the *encoding* parameter to :func:`os.popen`. From webhook-mailer at python.org Fri May 6 03:05:03 2022 From: webhook-mailer at python.org (gpshead) Date: Fri, 06 May 2022 07:05:03 -0000 Subject: [Python-checkins] gh-90622: Prevent max_tasks_per_child use with a fork mp_context. (#91587) Message-ID: https://github.com/python/cpython/commit/fa4f0a134e7911b2494ea9866c8a49ff446f9d6c commit: fa4f0a134e7911b2494ea9866c8a49ff446f9d6c branch: main author: Gregory P. Smith committer: gpshead date: 2022-05-06T00:04:53-07:00 summary: gh-90622: Prevent max_tasks_per_child use with a fork mp_context. (#91587) Prevent `max_tasks_per_child` use with a "fork" mp_context to avoid deadlocks. Also defaults to "spawn" when no mp_context is supplied for safe convenience. files: A Misc/NEWS.d/next/Library/2022-04-15-18-32-38.gh-issue-90622.WQjFDe.rst M Doc/library/concurrent.futures.rst M Lib/concurrent/futures/process.py M Lib/test/test_concurrent_futures.py diff --git a/Doc/library/concurrent.futures.rst b/Doc/library/concurrent.futures.rst index 959280833997e..99703ff3051d4 100644 --- a/Doc/library/concurrent.futures.rst +++ b/Doc/library/concurrent.futures.rst @@ -254,8 +254,11 @@ to a :class:`ProcessPoolExecutor` will result in deadlock. *max_tasks_per_child* is an optional argument that specifies the maximum number of tasks a single process can execute before it will exit and be - replaced with a fresh worker process. The default *max_tasks_per_child* is - ``None`` which means worker processes will live as long as the pool. + replaced with a fresh worker process. By default *max_tasks_per_child* is + ``None`` which means worker processes will live as long as the pool. When + a max is specified, the "spawn" multiprocessing start method will be used by + default in absense of a *mp_context* parameter. This feature is incompatible + with the "fork" start method. .. versionchanged:: 3.3 When one of the worker processes terminates abruptly, a diff --git a/Lib/concurrent/futures/process.py b/Lib/concurrent/futures/process.py index 0d49379c9bf7c..821034da21adc 100644 --- a/Lib/concurrent/futures/process.py +++ b/Lib/concurrent/futures/process.py @@ -617,14 +617,16 @@ def __init__(self, max_workers=None, mp_context=None, execute the given calls. If None or not given then as many worker processes will be created as the machine has processors. mp_context: A multiprocessing context to launch the workers. This - object should provide SimpleQueue, Queue and Process. + object should provide SimpleQueue, Queue and Process. Useful + to allow specific multiprocessing start methods. initializer: A callable used to initialize worker processes. initargs: A tuple of arguments to pass to the initializer. - max_tasks_per_child: The maximum number of tasks a worker process can - complete before it will exit and be replaced with a fresh - worker process, to enable unused resources to be freed. The - default value is None, which means worker process will live - as long as the executor will live. + max_tasks_per_child: The maximum number of tasks a worker process + can complete before it will exit and be replaced with a fresh + worker process. The default of None means worker process will + live as long as the executor. Requires a non-'fork' mp_context + start method. When given, we default to using 'spawn' if no + mp_context is supplied. """ _check_system_limits() @@ -644,7 +646,10 @@ def __init__(self, max_workers=None, mp_context=None, self._max_workers = max_workers if mp_context is None: - mp_context = mp.get_context() + if max_tasks_per_child is not None: + mp_context = mp.get_context("spawn") + else: + mp_context = mp.get_context() self._mp_context = mp_context if initializer is not None and not callable(initializer): @@ -657,6 +662,11 @@ def __init__(self, max_workers=None, mp_context=None, raise TypeError("max_tasks_per_child must be an integer") elif max_tasks_per_child <= 0: raise ValueError("max_tasks_per_child must be >= 1") + if self._mp_context.get_start_method(allow_none=False) == "fork": + # https://github.com/python/cpython/issues/90622 + raise ValueError("max_tasks_per_child is incompatible with" + " the 'fork' multiprocessing start method;" + " supply a different mp_context.") self._max_tasks_per_child = max_tasks_per_child # Management thread diff --git a/Lib/test/test_concurrent_futures.py b/Lib/test/test_concurrent_futures.py index 978a748df7fa3..4363e90b8bbab 100644 --- a/Lib/test/test_concurrent_futures.py +++ b/Lib/test/test_concurrent_futures.py @@ -1039,10 +1039,15 @@ def test_idle_process_reuse_multiple(self): executor.shutdown() def test_max_tasks_per_child(self): + context = self.get_context() + if context.get_start_method(allow_none=False) == "fork": + with self.assertRaises(ValueError): + self.executor_type(1, mp_context=context, max_tasks_per_child=3) + return # not using self.executor as we need to control construction. # arguably this could go in another class w/o that mixin. executor = self.executor_type( - 1, mp_context=self.get_context(), max_tasks_per_child=3) + 1, mp_context=context, max_tasks_per_child=3) f1 = executor.submit(os.getpid) original_pid = f1.result() # The worker pid remains the same as the worker could be reused @@ -1061,11 +1066,20 @@ def test_max_tasks_per_child(self): executor.shutdown() + def test_max_tasks_per_child_defaults_to_spawn_context(self): + # not using self.executor as we need to control construction. + # arguably this could go in another class w/o that mixin. + executor = self.executor_type(1, max_tasks_per_child=3) + self.assertEqual(executor._mp_context.get_start_method(), "spawn") + def test_max_tasks_early_shutdown(self): + context = self.get_context() + if context.get_start_method(allow_none=False) == "fork": + raise unittest.SkipTest("Incompatible with the fork start method.") # not using self.executor as we need to control construction. # arguably this could go in another class w/o that mixin. executor = self.executor_type( - 3, mp_context=self.get_context(), max_tasks_per_child=1) + 3, mp_context=context, max_tasks_per_child=1) futures = [] for i in range(6): futures.append(executor.submit(mul, i, i)) diff --git a/Misc/NEWS.d/next/Library/2022-04-15-18-32-38.gh-issue-90622.WQjFDe.rst b/Misc/NEWS.d/next/Library/2022-04-15-18-32-38.gh-issue-90622.WQjFDe.rst new file mode 100644 index 0000000000000..4144e4c38bad7 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-04-15-18-32-38.gh-issue-90622.WQjFDe.rst @@ -0,0 +1,5 @@ +In ``concurrent.futures.process.ProcessPoolExecutor`` disallow the "fork" +multiprocessing start method when the new ``max_tasks_per_child`` feature is +used as the mix of threads+fork can hang the child processes. Default to +using the safe "spawn" start method in that circumstance if no +``mp_context`` was supplied. From webhook-mailer at python.org Fri May 6 03:16:30 2022 From: webhook-mailer at python.org (ethanfurman) Date: Fri, 06 May 2022 07:16:30 -0000 Subject: [Python-checkins] gh-78157: [Enum] nested classes will not be members in 3.13 (GH-92366) Message-ID: https://github.com/python/cpython/commit/93364f9716614173406a4c83cd624b37d9a02ebf commit: 93364f9716614173406a4c83cd624b37d9a02ebf branch: main author: Ethan Furman committer: ethanfurman date: 2022-05-06T00:16:22-07:00 summary: gh-78157: [Enum] nested classes will not be members in 3.13 (GH-92366) - add member() and nonmember() functions - add deprecation warning for internal classes in enums not becoming members in 3.13 Co-authored-by: edwardcwang files: A Misc/NEWS.d/next/Library/2022-05-05-20-40-45.bpo-78157.IA_9na.rst M Doc/library/enum.rst M Lib/enum.py M Lib/test/test_enum.py M Misc/ACKS diff --git a/Doc/library/enum.rst b/Doc/library/enum.rst index 52ef0094cb71f..5db5639e81a5f 100644 --- a/Doc/library/enum.rst +++ b/Doc/library/enum.rst @@ -124,9 +124,18 @@ Module Contents Enum class decorator that checks user-selectable constraints on an enumeration. + :func:`member` + + Make `obj` a member. Can be used as a decorator. + + :func:`nonmember` + + Do not make `obj` a member. Can be used as a decorator. + .. versionadded:: 3.6 ``Flag``, ``IntFlag``, ``auto`` .. versionadded:: 3.11 ``StrEnum``, ``EnumCheck``, ``FlagBoundary``, ``property`` +.. versionadded:: 3.11 ``member``, ``nonmember`` --------------- @@ -791,6 +800,18 @@ Utilities and Decorators .. versionadded:: 3.11 +.. decorator:: member + + A decorator for use in enums: it's target will become a member. + + .. versionadded:: 3.11 + +.. decorator:: nonmember + + A decorator for use in enums: it's target will not become a member. + + .. versionadded:: 3.11 + --------------- Notes diff --git a/Lib/enum.py b/Lib/enum.py index 85245c95f9a9c..b9811fe9e6787 100644 --- a/Lib/enum.py +++ b/Lib/enum.py @@ -8,7 +8,7 @@ __all__ = [ 'EnumType', 'EnumMeta', 'Enum', 'IntEnum', 'StrEnum', 'Flag', 'IntFlag', 'ReprEnum', - 'auto', 'unique', 'property', 'verify', + 'auto', 'unique', 'property', 'verify', 'member', 'nonmember', 'FlagBoundary', 'STRICT', 'CONFORM', 'EJECT', 'KEEP', 'global_flag_repr', 'global_enum_repr', 'global_str', 'global_enum', 'EnumCheck', 'CONTINUOUS', 'NAMED_FLAGS', 'UNIQUE', @@ -20,6 +20,20 @@ # This is also why there are checks in EnumType like `if Enum is not None` Enum = Flag = EJECT = _stdlib_enums = ReprEnum = None +class nonmember(object): + """ + Protects item from becaming an Enum member during class creation. + """ + def __init__(self, value): + self.value = value + +class member(object): + """ + Forces item to became an Enum member during class creation. + """ + def __init__(self, value): + self.value = value + def _is_descriptor(obj): """ Returns True if obj is a descriptor, False otherwise. @@ -52,6 +66,15 @@ def _is_sunder(name): name[-2:-1] != '_' ) +def _is_internal_class(cls_name, obj): + # do not use `re` as `re` imports `enum` + if not isinstance(obj, type): + return False + qualname = getattr(obj, '__qualname__', '') + s_pattern = cls_name + '.' + getattr(obj, '__name__', '') + e_pattern = '.' + s_pattern + return qualname == s_pattern or qualname.endswith(e_pattern) + def _is_private(cls_name, name): # do not use `re` as `re` imports `enum` pattern = '_%s__' % (cls_name, ) @@ -139,14 +162,20 @@ def _dedent(text): lines[j] = l[i:] return '\n'.join(lines) +class _auto_null: + def __repr__(self): + return '_auto_null' +_auto_null = _auto_null() -_auto_null = object() class auto: """ Instances are replaced with an appropriate value in Enum class suites. """ value = _auto_null + def __repr__(self): + return "auto(%r)" % self.value + class property(DynamicClassAttribute): """ This is a descriptor, used to define attributes that act differently @@ -325,8 +354,16 @@ def __setitem__(self, key, value): Single underscore (sunder) names are reserved. """ + if _is_internal_class(self._cls_name, value): + import warnings + warnings.warn( + "In 3.13 classes created inside an enum will not become a member. " + "Use the `member` decorator to keep the current behavior.", + DeprecationWarning, + stacklevel=2, + ) if _is_private(self._cls_name, key): - # do nothing, name will be a normal attribute + # also do nothing, name will be a normal attribute pass elif _is_sunder(key): if key not in ( @@ -364,10 +401,22 @@ def __setitem__(self, key, value): raise TypeError('%r already defined as %r' % (key, self[key])) elif key in self._ignore: pass - elif not _is_descriptor(value): + elif isinstance(value, nonmember): + # unwrap value here; it won't be processed by the below `else` + value = value.value + elif _is_descriptor(value): + pass + # TODO: uncomment next three lines in 3.12 + # elif _is_internal_class(self._cls_name, value): + # # do nothing, name will be a normal attribute + # pass + else: if key in self: # enum overwriting a descriptor? raise TypeError('%r already defined as %r' % (key, self[key])) + elif isinstance(value, member): + # unwrap value here -- it will become a member + value = value.value if isinstance(value, auto): if value.value == _auto_null: value.value = self._generate_next_value( diff --git a/Lib/test/test_enum.py b/Lib/test/test_enum.py index b1b8e82b3859f..f9e09027228b4 100644 --- a/Lib/test/test_enum.py +++ b/Lib/test/test_enum.py @@ -12,6 +12,7 @@ from enum import Enum, IntEnum, StrEnum, EnumType, Flag, IntFlag, unique, auto from enum import STRICT, CONFORM, EJECT, KEEP, _simple_enum, _test_simple_enum from enum import verify, UNIQUE, CONTINUOUS, NAMED_FLAGS, ReprEnum +from enum import member, nonmember from io import StringIO from pickle import dumps, loads, PicklingError, HIGHEST_PROTOCOL from test import support @@ -938,6 +939,146 @@ def test_enum_function_with_qualname(self): raise Theory self.assertEqual(Theory.__qualname__, 'spanish_inquisition') + def test_enum_of_types(self): + """Support using Enum to refer to types deliberately.""" + class MyTypes(Enum): + i = int + f = float + s = str + self.assertEqual(MyTypes.i.value, int) + self.assertEqual(MyTypes.f.value, float) + self.assertEqual(MyTypes.s.value, str) + class Foo: + pass + class Bar: + pass + class MyTypes2(Enum): + a = Foo + b = Bar + self.assertEqual(MyTypes2.a.value, Foo) + self.assertEqual(MyTypes2.b.value, Bar) + class SpamEnumNotInner: + pass + class SpamEnum(Enum): + spam = SpamEnumNotInner + self.assertEqual(SpamEnum.spam.value, SpamEnumNotInner) + + @unittest.skipIf( + python_version >= (3, 13), + 'inner classes are not members', + ) + def test_nested_classes_in_enum_are_members(self): + """ + Check for warnings pre-3.13 + """ + with self.assertWarnsRegex(DeprecationWarning, 'will not become a member'): + class Outer(Enum): + a = 1 + b = 2 + class Inner(Enum): + foo = 10 + bar = 11 + self.assertTrue(isinstance(Outer.Inner, Outer)) + self.assertEqual(Outer.a.value, 1) + self.assertEqual(Outer.Inner.value.foo.value, 10) + self.assertEqual( + list(Outer.Inner.value), + [Outer.Inner.value.foo, Outer.Inner.value.bar], + ) + self.assertEqual( + list(Outer), + [Outer.a, Outer.b, Outer.Inner], + ) + + @unittest.skipIf( + python_version < (3, 13), + 'inner classes are still members', + ) + def test_nested_classes_in_enum_are_not_members(self): + """Support locally-defined nested classes.""" + class Outer(Enum): + a = 1 + b = 2 + class Inner(Enum): + foo = 10 + bar = 11 + self.assertTrue(isinstance(Outer.Inner, type)) + self.assertEqual(Outer.a.value, 1) + self.assertEqual(Outer.Inner.foo.value, 10) + self.assertEqual( + list(Outer.Inner), + [Outer.Inner.foo, Outer.Inner.bar], + ) + self.assertEqual( + list(Outer), + [Outer.a, Outer.b], + ) + + def test_nested_classes_in_enum_with_nonmember(self): + class Outer(Enum): + a = 1 + b = 2 + @nonmember + class Inner(Enum): + foo = 10 + bar = 11 + self.assertTrue(isinstance(Outer.Inner, type)) + self.assertEqual(Outer.a.value, 1) + self.assertEqual(Outer.Inner.foo.value, 10) + self.assertEqual( + list(Outer.Inner), + [Outer.Inner.foo, Outer.Inner.bar], + ) + self.assertEqual( + list(Outer), + [Outer.a, Outer.b], + ) + + def test_enum_of_types_with_nonmember(self): + """Support using Enum to refer to types deliberately.""" + class MyTypes(Enum): + i = int + f = nonmember(float) + s = str + self.assertEqual(MyTypes.i.value, int) + self.assertTrue(MyTypes.f is float) + self.assertEqual(MyTypes.s.value, str) + class Foo: + pass + class Bar: + pass + class MyTypes2(Enum): + a = Foo + b = nonmember(Bar) + self.assertEqual(MyTypes2.a.value, Foo) + self.assertTrue(MyTypes2.b is Bar) + class SpamEnumIsInner: + pass + class SpamEnum(Enum): + spam = nonmember(SpamEnumIsInner) + self.assertTrue(SpamEnum.spam is SpamEnumIsInner) + + def test_nested_classes_in_enum_with_member(self): + """Support locally-defined nested classes.""" + class Outer(Enum): + a = 1 + b = 2 + @member + class Inner(Enum): + foo = 10 + bar = 11 + self.assertTrue(isinstance(Outer.Inner, Outer)) + self.assertEqual(Outer.a.value, 1) + self.assertEqual(Outer.Inner.value.foo.value, 10) + self.assertEqual( + list(Outer.Inner.value), + [Outer.Inner.value.foo, Outer.Inner.value.bar], + ) + self.assertEqual( + list(Outer), + [Outer.a, Outer.b, Outer.Inner], + ) + def test_enum_with_value_name(self): class Huh(Enum): name = 1 diff --git a/Misc/ACKS b/Misc/ACKS index 91cd4332d6046..a55706d508a41 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1891,6 +1891,7 @@ Jacob Walls Kevin Walzer Rodrigo Steinmuller Wanderley Dingyuan Wang +Edward C Wang Jiahua Wang Ke Wang Liang-Bo Wang diff --git a/Misc/NEWS.d/next/Library/2022-05-05-20-40-45.bpo-78157.IA_9na.rst b/Misc/NEWS.d/next/Library/2022-05-05-20-40-45.bpo-78157.IA_9na.rst new file mode 100644 index 0000000000000..9e10acaf9a1e6 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-05-05-20-40-45.bpo-78157.IA_9na.rst @@ -0,0 +1,3 @@ +Deprecate nested classes in enum definitions becoming members -- in 3.13 +they will be normal classes; add `member` and `nonmember` functions to allow +control over results now. From webhook-mailer at python.org Fri May 6 03:18:30 2022 From: webhook-mailer at python.org (ezio-melotti) Date: Fri, 06 May 2022 07:18:30 -0000 Subject: [Python-checkins] Don't apply 'stale' label to issues (#91501) Message-ID: https://github.com/python/cpython/commit/bebb944de56883e886891b9786351ad36240d989 commit: bebb944de56883e886891b9786351ad36240d989 branch: main author: Hugo van Kemenade committer: ezio-melotti date: 2022-05-06T09:18:22+02:00 summary: Don't apply 'stale' label to issues (#91501) files: M .github/workflows/stale.yml diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index a8fecbf216b95..f422707afb9e5 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -20,7 +20,8 @@ jobs: repo-token: ${{ secrets.GITHUB_TOKEN }} stale-pr-message: 'This PR is stale because it has been open for 30 days with no activity.' stale-pr-label: 'stale' - days-before-stale: 30 + days-before-issue-stale: -1 + days-before-pr-stale: 30 days-before-close: -1 ascending: true operations-per-run: 120 From webhook-mailer at python.org Fri May 6 03:58:01 2022 From: webhook-mailer at python.org (rhettinger) Date: Fri, 06 May 2022 07:58:01 -0000 Subject: [Python-checkins] GH-89519: Deprecate classmethod descriptor chaining (#92379) Message-ID: https://github.com/python/cpython/commit/ebaf0945f9f630f32755137a54abd0a49f068e9a commit: ebaf0945f9f630f32755137a54abd0a49f068e9a branch: main author: Raymond Hettinger committer: rhettinger date: 2022-05-06T02:57:53-05:00 summary: GH-89519: Deprecate classmethod descriptor chaining (#92379) files: A Misc/NEWS.d/next/Core and Builtins/2022-05-06-02-29-53.gh-issue-89519.4OfkRE.rst M Doc/howto/descriptor.rst M Doc/library/functions.rst M Doc/whatsnew/3.11.rst diff --git a/Doc/howto/descriptor.rst b/Doc/howto/descriptor.rst index 825e9d0347f5d..5e9b110f0fe25 100644 --- a/Doc/howto/descriptor.rst +++ b/Doc/howto/descriptor.rst @@ -1349,6 +1349,8 @@ Using the non-data descriptor protocol, a pure Python version of if cls is None: cls = type(obj) if hasattr(type(self.f), '__get__'): + # This code path was added in Python 3.9 + # and was deprecated in Python 3.11. return self.f.__get__(cls, cls) return MethodType(self.f, cls) @@ -1386,7 +1388,7 @@ Using the non-data descriptor protocol, a pure Python version of The code path for ``hasattr(type(self.f), '__get__')`` was added in Python 3.9 and makes it possible for :func:`classmethod` to support chained decorators. For example, a classmethod and property could be -chained together: +chained together. In Python 3.11, this functionality was deprecated. .. testcode:: diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst index cb86296897082..47b4b11cced85 100644 --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -271,6 +271,11 @@ are always available. They are listed here in alphabetical order. ``__name__``, ``__qualname__``, ``__doc__`` and ``__annotations__``) and have a new ``__wrapped__`` attribute. + .. versionchanged:: 3.11 + Class methods can no longer wrap other :term:`descriptors ` such as + :func:`property`. + + .. function:: compile(source, filename, mode, flags=0, dont_inherit=False, optimize=-1) Compile the *source* into a code or AST object. Code objects can be executed diff --git a/Doc/whatsnew/3.11.rst b/Doc/whatsnew/3.11.rst index 822cb8b1f0f34..19ac8676ba638 100644 --- a/Doc/whatsnew/3.11.rst +++ b/Doc/whatsnew/3.11.rst @@ -1084,6 +1084,14 @@ CPython bytecode changes Deprecated ========== +* Chaining :class:`classmethod` descriptors (introduced in :issue:`19072`) + is now deprecated. It can no longer be used to wrap other descriptors + such as :class:`property`. The core design of this feature was flawed + and caused a number of downstream problems. To "pass-through" a + :class:`classmethod`, consider using the ``__wrapped__`` attribute + that was added in Python 3.10. + (Contributed by Raymond Hettinger in :gh:`89519`.) + * Octal escapes with value larger than ``0o377`` now produce a :exc:`DeprecationWarning`. In a future Python version they will be a :exc:`SyntaxWarning` and diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-06-02-29-53.gh-issue-89519.4OfkRE.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-06-02-29-53.gh-issue-89519.4OfkRE.rst new file mode 100644 index 0000000000000..1460546d14886 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-05-06-02-29-53.gh-issue-89519.4OfkRE.rst @@ -0,0 +1,4 @@ +Chaining classmethod descriptors (introduced in bpo-19072) is deprecated. It +can no longer be used to wrap other descriptors such as property(). The +core design of this feature was flawed, and it caused a number of downstream +problems. From webhook-mailer at python.org Fri May 6 05:37:22 2022 From: webhook-mailer at python.org (pablogsal) Date: Fri, 06 May 2022 09:37:22 -0000 Subject: [Python-checkins] Document the lifetime of `PyUnicode_AsUTF8String` (#92325) Message-ID: https://github.com/python/cpython/commit/740da8d37a84638f4a8893bee3648f36fc6beb0f commit: 740da8d37a84638f4a8893bee3648f36fc6beb0f branch: main author: Matt Wozniski committer: pablogsal date: 2022-05-06T10:37:08+01:00 summary: Document the lifetime of `PyUnicode_AsUTF8String` (#92325) The current wording implied this, but didn't state it explicitly. files: M Doc/c-api/unicode.rst diff --git a/Doc/c-api/unicode.rst b/Doc/c-api/unicode.rst index 00faac5b69abd..d139112578ca9 100644 --- a/Doc/c-api/unicode.rst +++ b/Doc/c-api/unicode.rst @@ -1075,7 +1075,8 @@ These are the UTF-8 codec APIs: This caches the UTF-8 representation of the string in the Unicode object, and subsequent calls will return a pointer to the same buffer. The caller is not - responsible for deallocating the buffer. + responsible for deallocating the buffer. The buffer is deallocated and + pointers to it become invalid when the Unicode object is garbage collected. .. versionadded:: 3.3 From webhook-mailer at python.org Fri May 6 05:53:09 2022 From: webhook-mailer at python.org (ezio-melotti) Date: Fri, 06 May 2022 09:53:09 -0000 Subject: [Python-checkins] Enum docs: Remove unnecessary apostrophes (#92382) Message-ID: https://github.com/python/cpython/commit/291945bc6e4f2a46d8229fd2fcb181b52657cc8a commit: 291945bc6e4f2a46d8229fd2fcb181b52657cc8a branch: main author: Alex Waygood committer: ezio-melotti date: 2022-05-06T11:53:00+02:00 summary: Enum docs: Remove unnecessary apostrophes (#92382) Replace "it's" with "its". files: M Doc/library/enum.rst diff --git a/Doc/library/enum.rst b/Doc/library/enum.rst index 5db5639e81a5f..5829d4617893b 100644 --- a/Doc/library/enum.rst +++ b/Doc/library/enum.rst @@ -802,13 +802,13 @@ Utilities and Decorators .. decorator:: member - A decorator for use in enums: it's target will become a member. + A decorator for use in enums: its target will become a member. .. versionadded:: 3.11 .. decorator:: nonmember - A decorator for use in enums: it's target will not become a member. + A decorator for use in enums: its target will not become a member. .. versionadded:: 3.11 From webhook-mailer at python.org Fri May 6 05:55:05 2022 From: webhook-mailer at python.org (miss-islington) Date: Fri, 06 May 2022 09:55:05 -0000 Subject: [Python-checkins] Document the lifetime of `PyUnicode_AsUTF8String` (GH-92325) Message-ID: https://github.com/python/cpython/commit/367faf71eae963e613cb4404e24748c91baa4190 commit: 367faf71eae963e613cb4404e24748c91baa4190 branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-06T02:55:01-07:00 summary: Document the lifetime of `PyUnicode_AsUTF8String` (GH-92325) The current wording implied this, but didn't state it explicitly. (cherry picked from commit 740da8d37a84638f4a8893bee3648f36fc6beb0f) Co-authored-by: Matt Wozniski files: M Doc/c-api/unicode.rst diff --git a/Doc/c-api/unicode.rst b/Doc/c-api/unicode.rst index a08cebcc000d0..cf7d2232125c8 100644 --- a/Doc/c-api/unicode.rst +++ b/Doc/c-api/unicode.rst @@ -1093,7 +1093,8 @@ These are the UTF-8 codec APIs: This caches the UTF-8 representation of the string in the Unicode object, and subsequent calls will return a pointer to the same buffer. The caller is not - responsible for deallocating the buffer. + responsible for deallocating the buffer. The buffer is deallocated and + pointers to it become invalid when the Unicode object is garbage collected. .. versionadded:: 3.3 From webhook-mailer at python.org Fri May 6 05:56:59 2022 From: webhook-mailer at python.org (miss-islington) Date: Fri, 06 May 2022 09:56:59 -0000 Subject: [Python-checkins] Document the lifetime of `PyUnicode_AsUTF8String` (GH-92325) Message-ID: https://github.com/python/cpython/commit/60407e8a1937cc4aaf6218a957743f62482257a1 commit: 60407e8a1937cc4aaf6218a957743f62482257a1 branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-06T02:56:55-07:00 summary: Document the lifetime of `PyUnicode_AsUTF8String` (GH-92325) The current wording implied this, but didn't state it explicitly. (cherry picked from commit 740da8d37a84638f4a8893bee3648f36fc6beb0f) Co-authored-by: Matt Wozniski files: M Doc/c-api/unicode.rst diff --git a/Doc/c-api/unicode.rst b/Doc/c-api/unicode.rst index a6ae8ba13657d..8bdcad63363b5 100644 --- a/Doc/c-api/unicode.rst +++ b/Doc/c-api/unicode.rst @@ -1110,7 +1110,8 @@ These are the UTF-8 codec APIs: This caches the UTF-8 representation of the string in the Unicode object, and subsequent calls will return a pointer to the same buffer. The caller is not - responsible for deallocating the buffer. + responsible for deallocating the buffer. The buffer is deallocated and + pointers to it become invalid when the Unicode object is garbage collected. .. versionadded:: 3.3 From webhook-mailer at python.org Fri May 6 06:08:46 2022 From: webhook-mailer at python.org (tiran) Date: Fri, 06 May 2022 10:08:46 -0000 Subject: [Python-checkins] gh-84461: Skip network require tests on Emscripten (GH-92383) Message-ID: https://github.com/python/cpython/commit/cbc2c199a071d4d94b92c835324bf2ab721bb507 commit: cbc2c199a071d4d94b92c835324bf2ab721bb507 branch: main author: Christian Heimes committer: tiran date: 2022-05-06T12:08:36+02:00 summary: gh-84461: Skip network require tests on Emscripten (GH-92383) files: M Lib/test/test_robotparser.py M Lib/test/test_socketserver.py M Lib/test/test_timeout.py diff --git a/Lib/test/test_robotparser.py b/Lib/test/test_robotparser.py index 08bdf59d333d4..3821d66c2db7d 100644 --- a/Lib/test/test_robotparser.py +++ b/Lib/test/test_robotparser.py @@ -345,6 +345,7 @@ def testPasswordProtectedSite(self): self.assertFalse(parser.can_fetch("*", robots_url)) + at support.requires_working_socket() class NetworkTestCase(unittest.TestCase): base_url = 'http://www.pythontest.net/' diff --git a/Lib/test/test_socketserver.py b/Lib/test/test_socketserver.py index c498d3d12e24a..2edb1e0c0e21e 100644 --- a/Lib/test/test_socketserver.py +++ b/Lib/test/test_socketserver.py @@ -21,6 +21,8 @@ test.support.requires("network") +test.support.requires_working_socket(module=True) + TEST_STR = b"hello world\n" HOST = socket_helper.HOST diff --git a/Lib/test/test_timeout.py b/Lib/test/test_timeout.py index 70a0175d77104..fa85c7e6cd87d 100644 --- a/Lib/test/test_timeout.py +++ b/Lib/test/test_timeout.py @@ -5,9 +5,6 @@ from test import support from test.support import socket_helper -# This requires the 'network' resource as given on the regrtest command line. -skip_expected = not support.is_resource_enabled('network') - import time import errno import socket @@ -292,6 +289,7 @@ def testRecvfromTimeout(self): def setUpModule(): support.requires('network') + support.requires_working_socket(module=True) if __name__ == "__main__": From webhook-mailer at python.org Fri May 6 06:15:27 2022 From: webhook-mailer at python.org (Fidget-Spinner) Date: Fri, 06 May 2022 10:15:27 -0000 Subject: [Python-checkins] gh-92332: Docs-only deprecation of `typing.Text` (GH-92351) Message-ID: https://github.com/python/cpython/commit/6f18b86fda516df9ba7614423ba5c8d0fcf366ba commit: 6f18b86fda516df9ba7614423ba5c8d0fcf366ba branch: main author: Alex Waygood committer: Fidget-Spinner date: 2022-05-06T18:15:18+08:00 summary: gh-92332: Docs-only deprecation of `typing.Text` (GH-92351) Co-authored-by: Shantanu <12621235+hauntsaninja at users.noreply.github.com> files: A Misc/NEWS.d/next/Library/2022-05-05-22-46-52.gh-issue-92332.Fv9CJx.rst M Doc/library/typing.rst M Doc/whatsnew/3.11.rst diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index 88085594caaff..005a515234110 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -1976,6 +1976,11 @@ Other concrete types .. versionadded:: 3.5.2 + .. deprecated:: 3.11 + Python 2 is no longer supported, and most type checkers also no longer + support type checking Python 2 code. Users should now use + :class:`str` instead of ``Text`` wherever possible. + Abstract Base Classes --------------------- @@ -2687,3 +2692,5 @@ convenience. This is subject to change, and not all deprecations are listed. | ``typing`` versions of standard | 3.9 | Undecided | :pep:`585` | | collections | | | | +----------------------------------+---------------+-------------------+----------------+ +| ``typing.Text`` | 3.11 | Undecided | :gh:`92332` | ++----------------------------------+---------------+-------------------+----------------+ diff --git a/Doc/whatsnew/3.11.rst b/Doc/whatsnew/3.11.rst index 19ac8676ba638..f679100863a03 100644 --- a/Doc/whatsnew/3.11.rst +++ b/Doc/whatsnew/3.11.rst @@ -1202,6 +1202,12 @@ Deprecated For now, a deprecation warning is raised for such syntax. (Contributed by Serhiy Storchaka in :gh:`91760`.) +* :class:`typing.Text`, which exists solely to provide compatibility support + between Python 2 and Python 3 code, is now deprecated. Its removal is + currently unplanned, but users are encouraged to use :class:`str` instead + wherever possible. + (Contributed by Alex Waygood in :gh:`92332`.) + Removed ======= diff --git a/Misc/NEWS.d/next/Library/2022-05-05-22-46-52.gh-issue-92332.Fv9CJx.rst b/Misc/NEWS.d/next/Library/2022-05-05-22-46-52.gh-issue-92332.Fv9CJx.rst new file mode 100644 index 0000000000000..1d055bb2b99f4 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-05-05-22-46-52.gh-issue-92332.Fv9CJx.rst @@ -0,0 +1,2 @@ +Deprecate :class:`typing.Text` (removal of the class is currently not +planned). Patch by Alex Waygood. From webhook-mailer at python.org Fri May 6 06:28:37 2022 From: webhook-mailer at python.org (ezio-melotti) Date: Fri, 06 May 2022 10:28:37 -0000 Subject: [Python-checkins] Add source for character mappings (#92014) Message-ID: https://github.com/python/cpython/commit/d707d073be5ecacb7ad341a1c1716f4998907d6b commit: d707d073be5ecacb7ad341a1c1716f4998907d6b branch: main author: slateny <46876382+slateny at users.noreply.github.com> committer: ezio-melotti date: 2022-05-06T12:28:09+02:00 summary: Add source for character mappings (#92014) files: M Lib/html/entities.py diff --git a/Lib/html/entities.py b/Lib/html/entities.py index 91ea5da2af49d..dc508631ac478 100644 --- a/Lib/html/entities.py +++ b/Lib/html/entities.py @@ -4,6 +4,7 @@ # maps the HTML entity name to the Unicode code point +# from https://html.spec.whatwg.org/multipage/named-characters.html name2codepoint = { 'AElig': 0x00c6, # latin capital letter AE = latin capital ligature AE, U+00C6 ISOlat1 'Aacute': 0x00c1, # latin capital letter A with acute, U+00C1 ISOlat1 From webhook-mailer at python.org Fri May 6 06:51:00 2022 From: webhook-mailer at python.org (serhiy-storchaka) Date: Fri, 06 May 2022 10:51:00 -0000 Subject: [Python-checkins] gh-91827: Add method info_pathlevel() in tkinter (GH-91829) Message-ID: https://github.com/python/cpython/commit/15dbe8570f215bfb4910cdd79b43dafb2ab6b38f commit: 15dbe8570f215bfb4910cdd79b43dafb2ab6b38f branch: main author: Serhiy Storchaka committer: serhiy-storchaka date: 2022-05-06T13:50:38+03:00 summary: gh-91827: Add method info_pathlevel() in tkinter (GH-91829) files: A Misc/NEWS.d/next/Library/2022-04-22-19-11-31.gh-issue-91827.6P3gOI.rst M Doc/whatsnew/3.11.rst M Lib/idlelib/help_about.py M Lib/test/test_tcl.py M Lib/tkinter/__init__.py M Lib/tkinter/test/support.py M Lib/tkinter/test/test_tkinter/test_misc.py M Lib/tkinter/test/widget_tests.py diff --git a/Doc/whatsnew/3.11.rst b/Doc/whatsnew/3.11.rst index f679100863a03..07e8332d51b61 100644 --- a/Doc/whatsnew/3.11.rst +++ b/Doc/whatsnew/3.11.rst @@ -744,6 +744,14 @@ For major changes, see :ref:`new-feat-related-type-hints-311`. (Contributed by Serhiy Storchaka in :issue:`43923`.) +tkinter +------- + +* Added method ``info_patchlevel()`` which returns the exact version of + the Tcl library as a named tuple similar to :data:`sys.version_info`. + (Contributed by Serhiy Storchaka in :issue:`91827`.) + + unicodedata ----------- diff --git a/Lib/idlelib/help_about.py b/Lib/idlelib/help_about.py index c59f494599806..9cb3ba78c50eb 100644 --- a/Lib/idlelib/help_about.py +++ b/Lib/idlelib/help_about.py @@ -76,8 +76,8 @@ def create_widgets(self): bg=self.bg, font=('courier', 24, 'bold')) header.grid(row=0, column=0, sticky=E, padx=10, pady=10) - tk_patchlevel = self.tk.call('info', 'patchlevel') - ext = '.png' if tk_patchlevel >= '8.6' else '.gif' + tk_patchlevel = self.info_patchlevel() + ext = '.png' if tk_patchlevel >= (8, 6) else '.gif' icon = os.path.join(os.path.abspath(os.path.dirname(__file__)), 'Icons', f'idle_48{ext}') self.icon_image = PhotoImage(master=self._root(), file=icon) @@ -105,7 +105,7 @@ def create_widgets(self): text='Python version: ' + version, fg=self.fg, bg=self.bg) pyver.grid(row=9, column=0, sticky=W, padx=10, pady=0) - tkver = Label(frame_background, text='Tk version: ' + tk_patchlevel, + tkver = Label(frame_background, text=f'Tk version: {tk_patchlevel}', fg=self.fg, bg=self.bg) tkver.grid(row=9, column=1, sticky=W, padx=2, pady=0) py_buttons = Frame(frame_background, bg=self.bg) diff --git a/Lib/test/test_tcl.py b/Lib/test/test_tcl.py index e73ad596fe678..548914796ed76 100644 --- a/Lib/test/test_tcl.py +++ b/Lib/test/test_tcl.py @@ -28,15 +28,7 @@ def get_tk_patchlevel(): global _tk_patchlevel if _tk_patchlevel is None: tcl = Tcl() - patchlevel = tcl.call('info', 'patchlevel') - m = re.fullmatch(r'(\d+)\.(\d+)([ab.])(\d+)', patchlevel) - major, minor, releaselevel, serial = m.groups() - major, minor, serial = int(major), int(minor), int(serial) - releaselevel = {'a': 'alpha', 'b': 'beta', '.': 'final'}[releaselevel] - if releaselevel == 'final': - _tk_patchlevel = major, minor, serial, releaselevel, 0 - else: - _tk_patchlevel = major, minor, 0, releaselevel, serial + _tk_patchlevel = tcl.info_patchlevel() return _tk_patchlevel @@ -723,7 +715,7 @@ def test_huge_string_builtins2(self, size): def setUpModule(): if support.verbose: tcl = Tcl() - print('patchlevel =', tcl.call('info', 'patchlevel')) + print('patchlevel =', tcl.call('info', 'patchlevel'), flush=True) if __name__ == "__main__": diff --git a/Lib/tkinter/__init__.py b/Lib/tkinter/__init__.py index 2e7e21c6648ea..3d23889c74f24 100644 --- a/Lib/tkinter/__init__.py +++ b/Lib/tkinter/__init__.py @@ -30,6 +30,7 @@ tk.mainloop() """ +import collections import enum import sys import types @@ -143,6 +144,28 @@ def _splitdict(tk, v, cut_minus=True, conv=None): dict[key] = value return dict +class _VersionInfoType(collections.namedtuple('_VersionInfoType', + ('major', 'minor', 'micro', 'releaselevel', 'serial'))): + def __str__(self): + if self.releaselevel == 'final': + return f'{self.major}.{self.minor}.{self.micro}' + else: + return f'{self.major}.{self.minor}{self.releaselevel[0]}{self.serial}' + +def _parse_version(version): + import re + m = re.fullmatch(r'(\d+)\.(\d+)([ab.])(\d+)', version) + major, minor, releaselevel, serial = m.groups() + major, minor, serial = int(major), int(minor), int(serial) + if releaselevel == '.': + micro = serial + serial = 0 + releaselevel = 'final' + else: + micro = 0 + releaselevel = {'a': 'alpha', 'b': 'beta'}[releaselevel] + return _VersionInfoType(major, minor, micro, releaselevel, serial) + @enum._simple_enum(enum.StrEnum) class EventType: @@ -1055,6 +1078,11 @@ def tkraise(self, aboveThis=None): lift = tkraise + def info_patchlevel(self): + """Returns the exact version of the Tcl library.""" + patchlevel = self.tk.call('info', 'patchlevel') + return _parse_version(patchlevel) + def winfo_atom(self, name, displayof=0): """Return integer which represents atom NAME.""" args = ('winfo', 'atom') + self._displayof(displayof) + (name,) diff --git a/Lib/tkinter/test/support.py b/Lib/tkinter/test/support.py index dbc47a81e6515..9e26d04536f22 100644 --- a/Lib/tkinter/test/support.py +++ b/Lib/tkinter/test/support.py @@ -101,15 +101,7 @@ def get_tk_patchlevel(): global _tk_patchlevel if _tk_patchlevel is None: tcl = tkinter.Tcl() - patchlevel = tcl.call('info', 'patchlevel') - m = re.fullmatch(r'(\d+)\.(\d+)([ab.])(\d+)', patchlevel) - major, minor, releaselevel, serial = m.groups() - major, minor, serial = int(major), int(minor), int(serial) - releaselevel = {'a': 'alpha', 'b': 'beta', '.': 'final'}[releaselevel] - if releaselevel == 'final': - _tk_patchlevel = major, minor, serial, releaselevel, 0 - else: - _tk_patchlevel = major, minor, 0, releaselevel, serial + _tk_patchlevel = tcl.info_patchlevel() return _tk_patchlevel units = { diff --git a/Lib/tkinter/test/test_tkinter/test_misc.py b/Lib/tkinter/test/test_tkinter/test_misc.py index 044eb10d68835..620b6ed638c25 100644 --- a/Lib/tkinter/test/test_tkinter/test_misc.py +++ b/Lib/tkinter/test/test_tkinter/test_misc.py @@ -341,6 +341,35 @@ def callback(): self.assertEqual(log, [1]) self.assertTrue(self.root.winfo_exists()) + def test_info_patchlevel(self): + vi = self.root.info_patchlevel() + f = tkinter.Frame(self.root) + self.assertEqual(f.info_patchlevel(), vi) + # The following is almost a copy of tests for sys.version_info. + self.assertIsInstance(vi[:], tuple) + self.assertEqual(len(vi), 5) + self.assertIsInstance(vi[0], int) + self.assertIsInstance(vi[1], int) + self.assertIsInstance(vi[2], int) + self.assertIn(vi[3], ("alpha", "beta", "candidate", "final")) + self.assertIsInstance(vi[4], int) + self.assertIsInstance(vi.major, int) + self.assertIsInstance(vi.minor, int) + self.assertIsInstance(vi.micro, int) + self.assertIn(vi.releaselevel, ("alpha", "beta", "final")) + self.assertIsInstance(vi.serial, int) + self.assertEqual(vi[0], vi.major) + self.assertEqual(vi[1], vi.minor) + self.assertEqual(vi[2], vi.micro) + self.assertEqual(vi[3], vi.releaselevel) + self.assertEqual(vi[4], vi.serial) + self.assertTrue(vi > (1,0,0)) + if vi.releaselevel == 'final': + self.assertEqual(vi.serial, 0) + else: + self.assertEqual(vi.micro, 0) + self.assertTrue(str(vi).startswith(f'{vi.major}.{vi.minor}')) + class DefaultRootTest(AbstractDefaultRootTest, unittest.TestCase): diff --git a/Lib/tkinter/test/widget_tests.py b/Lib/tkinter/test/widget_tests.py index 37d1979c23f1d..a450544c3ee6b 100644 --- a/Lib/tkinter/test/widget_tests.py +++ b/Lib/tkinter/test/widget_tests.py @@ -517,4 +517,4 @@ def test(self, option=option): def setUpModule(): if test.support.verbose: tcl = tkinter.Tcl() - print('patchlevel =', tcl.call('info', 'patchlevel')) + print('patchlevel =', tcl.call('info', 'patchlevel'), flush=True) diff --git a/Misc/NEWS.d/next/Library/2022-04-22-19-11-31.gh-issue-91827.6P3gOI.rst b/Misc/NEWS.d/next/Library/2022-04-22-19-11-31.gh-issue-91827.6P3gOI.rst new file mode 100644 index 0000000000000..83b752277785b --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-04-22-19-11-31.gh-issue-91827.6P3gOI.rst @@ -0,0 +1,3 @@ +In the :mod:`tkinter` module add method ``info_patchlevel()`` which returns +the exact version of the Tcl library as a named tuple similar to +:data:`sys.version_info`. From webhook-mailer at python.org Fri May 6 06:58:25 2022 From: webhook-mailer at python.org (ezio-melotti) Date: Fri, 06 May 2022 10:58:25 -0000 Subject: [Python-checkins] Add source for character mappings (GH-92014) (#92388) Message-ID: https://github.com/python/cpython/commit/25352d7a757e05f9513b69ed0ab33373b1ea37c1 commit: 25352d7a757e05f9513b69ed0ab33373b1ea37c1 branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: ezio-melotti date: 2022-05-06T12:58:10+02:00 summary: Add source for character mappings (GH-92014) (#92388) (cherry picked from commit d707d073be5ecacb7ad341a1c1716f4998907d6b) Co-authored-by: slateny <46876382+slateny at users.noreply.github.com> Co-authored-by: slateny <46876382+slateny at users.noreply.github.com> files: M Lib/html/entities.py diff --git a/Lib/html/entities.py b/Lib/html/entities.py index 91ea5da2af49d..dc508631ac478 100644 --- a/Lib/html/entities.py +++ b/Lib/html/entities.py @@ -4,6 +4,7 @@ # maps the HTML entity name to the Unicode code point +# from https://html.spec.whatwg.org/multipage/named-characters.html name2codepoint = { 'AElig': 0x00c6, # latin capital letter AE = latin capital ligature AE, U+00C6 ISOlat1 'Aacute': 0x00c1, # latin capital letter A with acute, U+00C1 ISOlat1 From webhook-mailer at python.org Fri May 6 06:58:25 2022 From: webhook-mailer at python.org (ezio-melotti) Date: Fri, 06 May 2022 10:58:25 -0000 Subject: [Python-checkins] Add source for character mappings (GH-92014) (#92389) Message-ID: https://github.com/python/cpython/commit/b5f5993dfe1c9e5dc48e3e514f282464da9fb4a3 commit: b5f5993dfe1c9e5dc48e3e514f282464da9fb4a3 branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: ezio-melotti date: 2022-05-06T12:58:16+02:00 summary: Add source for character mappings (GH-92014) (#92389) (cherry picked from commit d707d073be5ecacb7ad341a1c1716f4998907d6b) Co-authored-by: slateny <46876382+slateny at users.noreply.github.com> Co-authored-by: slateny <46876382+slateny at users.noreply.github.com> files: M Lib/html/entities.py diff --git a/Lib/html/entities.py b/Lib/html/entities.py index 91ea5da2af49d..dc508631ac478 100644 --- a/Lib/html/entities.py +++ b/Lib/html/entities.py @@ -4,6 +4,7 @@ # maps the HTML entity name to the Unicode code point +# from https://html.spec.whatwg.org/multipage/named-characters.html name2codepoint = { 'AElig': 0x00c6, # latin capital letter AE = latin capital ligature AE, U+00C6 ISOlat1 'Aacute': 0x00c1, # latin capital letter A with acute, U+00C1 ISOlat1 From webhook-mailer at python.org Fri May 6 08:32:15 2022 From: webhook-mailer at python.org (pablogsal) Date: Fri, 06 May 2022 12:32:15 -0000 Subject: [Python-checkins] Fix What's New: use :gh: instead of :issue: (#92395) Message-ID: https://github.com/python/cpython/commit/5fbaf80057fb9f1583b7bd1f840e7d2ba0cf27cb commit: 5fbaf80057fb9f1583b7bd1f840e7d2ba0cf27cb branch: main author: Serhiy Storchaka committer: pablogsal date: 2022-05-06T13:32:10+01:00 summary: Fix What's New: use :gh: instead of :issue: (#92395) files: M Doc/whatsnew/3.11.rst diff --git a/Doc/whatsnew/3.11.rst b/Doc/whatsnew/3.11.rst index 07e8332d51b61..b9871f7ef69f9 100644 --- a/Doc/whatsnew/3.11.rst +++ b/Doc/whatsnew/3.11.rst @@ -749,7 +749,7 @@ tkinter * Added method ``info_patchlevel()`` which returns the exact version of the Tcl library as a named tuple similar to :data:`sys.version_info`. - (Contributed by Serhiy Storchaka in :issue:`91827`.) + (Contributed by Serhiy Storchaka in :gh:`91827`.) unicodedata From webhook-mailer at python.org Fri May 6 08:40:21 2022 From: webhook-mailer at python.org (pablogsal) Date: Fri, 06 May 2022 12:40:21 -0000 Subject: [Python-checkins] gh-91321: Fix _PyObject_EXTRA_INIT for C++ (#92396) Message-ID: https://github.com/python/cpython/commit/c33d67c4506d96a02c6ace382c38e2fb7a614843 commit: c33d67c4506d96a02c6ace382c38e2fb7a614843 branch: main author: Victor Stinner committer: pablogsal date: 2022-05-06T13:40:08+01:00 summary: gh-91321: Fix _PyObject_EXTRA_INIT for C++ (#92396) In C++, the _PyObject_EXTRA_INIT macro now uses nullptr, rather than 0, to initialize the _ob_next and _ob_prev members of the PyObject structure. Fix test_cppext failure when Python is built with ./configure --with-trace-refs. files: M Include/object.h diff --git a/Include/object.h b/Include/object.h index a0dba697569c4..fac8892f65552 100644 --- a/Include/object.h +++ b/Include/object.h @@ -66,7 +66,7 @@ whose size is determined when the object is allocated. PyObject *_ob_next; \ PyObject *_ob_prev; -#define _PyObject_EXTRA_INIT 0, 0, +#define _PyObject_EXTRA_INIT _Py_NULL, _Py_NULL, #else # define _PyObject_HEAD_EXTRA From webhook-mailer at python.org Fri May 6 08:47:19 2022 From: webhook-mailer at python.org (vstinner) Date: Fri, 06 May 2022 12:47:19 -0000 Subject: [Python-checkins] gh-92047: Py_GetVersion multi-digit minor version (GH-92047) (GH-92048) (#92330) Message-ID: https://github.com/python/cpython/commit/229dc17f7a05c87e8b00c6882476fc4c076f9779 commit: 229dc17f7a05c87e8b00c6882476fc4c076f9779 branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: vstinner date: 2022-05-06T14:47:09+02:00 summary: gh-92047: Py_GetVersion multi-digit minor version (GH-92047) (GH-92048) (#92330) (cherry picked from commit 43b135f94ebf3e6e84ddb0f75ed8510b96a610e4) Co-authored-by: Robert Howlett Co-authored-by: Robert Howlett files: M Doc/c-api/init.rst diff --git a/Doc/c-api/init.rst b/Doc/c-api/init.rst index a522790446001..a44442a501555 100644 --- a/Doc/c-api/init.rst +++ b/Doc/c-api/init.rst @@ -529,7 +529,7 @@ Process-wide parameters .. index:: single: version (in module sys) The first word (up to the first space character) is the current Python version; - the first three characters are the major and minor version separated by a + the first characters are the major and minor version separated by a period. The returned string points into static storage; the caller should not modify its value. The value is available to Python code as :data:`sys.version`. From webhook-mailer at python.org Fri May 6 08:47:40 2022 From: webhook-mailer at python.org (vstinner) Date: Fri, 06 May 2022 12:47:40 -0000 Subject: [Python-checkins] gh-92047: Py_GetVersion multi-digit minor version (GH-92047) (GH-92048) (#92329) Message-ID: https://github.com/python/cpython/commit/326f6ed05914c692648d6d45f43a935b82ef7e38 commit: 326f6ed05914c692648d6d45f43a935b82ef7e38 branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: vstinner date: 2022-05-06T14:47:30+02:00 summary: gh-92047: Py_GetVersion multi-digit minor version (GH-92047) (GH-92048) (#92329) (cherry picked from commit 43b135f94ebf3e6e84ddb0f75ed8510b96a610e4) Co-authored-by: Robert Howlett Co-authored-by: Robert Howlett files: M Doc/c-api/init.rst diff --git a/Doc/c-api/init.rst b/Doc/c-api/init.rst index 8f1382e008c1e..06e886835dd5a 100644 --- a/Doc/c-api/init.rst +++ b/Doc/c-api/init.rst @@ -498,7 +498,7 @@ Process-wide parameters .. index:: single: version (in module sys) The first word (up to the first space character) is the current Python version; - the first three characters are the major and minor version separated by a + the first characters are the major and minor version separated by a period. The returned string points into static storage; the caller should not modify its value. The value is available to Python code as :data:`sys.version`. From webhook-mailer at python.org Fri May 6 09:39:27 2022 From: webhook-mailer at python.org (ezio-melotti) Date: Fri, 06 May 2022 13:39:27 -0000 Subject: [Python-checkins] gh-92368: Fix missing possessive apostrophe (#92397) Message-ID: https://github.com/python/cpython/commit/a79001ee16b3ea8b5d0fad595c969d9e1b7627f3 commit: a79001ee16b3ea8b5d0fad595c969d9e1b7627f3 branch: main author: gophra <105054704+gophra at users.noreply.github.com> committer: ezio-melotti date: 2022-05-06T15:39:16+02:00 summary: gh-92368: Fix missing possessive apostrophe (#92397) * Fix missing possessive apostrophe files: M Doc/tutorial/stdlib.rst diff --git a/Doc/tutorial/stdlib.rst b/Doc/tutorial/stdlib.rst index 227a6d8651ff5..a94a7f459ea2b 100644 --- a/Doc/tutorial/stdlib.rst +++ b/Doc/tutorial/stdlib.rst @@ -327,7 +327,7 @@ Python has a "batteries included" philosophy. This is best seen through the sophisticated and robust capabilities of its larger packages. For example: * The :mod:`xmlrpc.client` and :mod:`xmlrpc.server` modules make implementing - remote procedure calls into an almost trivial task. Despite the modules + remote procedure calls into an almost trivial task. Despite the modules' names, no direct knowledge or handling of XML is needed. * The :mod:`email` package is a library for managing email messages, including From webhook-mailer at python.org Fri May 6 10:13:19 2022 From: webhook-mailer at python.org (miss-islington) Date: Fri, 06 May 2022 14:13:19 -0000 Subject: [Python-checkins] gh-92368: Fix missing possessive apostrophe (GH-92397) Message-ID: https://github.com/python/cpython/commit/17f3b5cbfaada66b45422e80c06b0c5f8157a736 commit: 17f3b5cbfaada66b45422e80c06b0c5f8157a736 branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-06T07:12:59-07:00 summary: gh-92368: Fix missing possessive apostrophe (GH-92397) * Fix missing possessive apostrophe (cherry picked from commit a79001ee16b3ea8b5d0fad595c969d9e1b7627f3) Co-authored-by: gophra <105054704+gophra at users.noreply.github.com> files: M Doc/tutorial/stdlib.rst diff --git a/Doc/tutorial/stdlib.rst b/Doc/tutorial/stdlib.rst index aac1ae3a8a6b4..6871ed1e8689b 100644 --- a/Doc/tutorial/stdlib.rst +++ b/Doc/tutorial/stdlib.rst @@ -327,7 +327,7 @@ Python has a "batteries included" philosophy. This is best seen through the sophisticated and robust capabilities of its larger packages. For example: * The :mod:`xmlrpc.client` and :mod:`xmlrpc.server` modules make implementing - remote procedure calls into an almost trivial task. Despite the modules + remote procedure calls into an almost trivial task. Despite the modules' names, no direct knowledge or handling of XML is needed. * The :mod:`email` package is a library for managing email messages, including From webhook-mailer at python.org Fri May 6 10:13:47 2022 From: webhook-mailer at python.org (miss-islington) Date: Fri, 06 May 2022 14:13:47 -0000 Subject: [Python-checkins] gh-92368: Fix missing possessive apostrophe (GH-92397) Message-ID: https://github.com/python/cpython/commit/4a2337fe33a8f0174cad1725c2e84e039286abe5 commit: 4a2337fe33a8f0174cad1725c2e84e039286abe5 branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-06T07:13:43-07:00 summary: gh-92368: Fix missing possessive apostrophe (GH-92397) * Fix missing possessive apostrophe (cherry picked from commit a79001ee16b3ea8b5d0fad595c969d9e1b7627f3) Co-authored-by: gophra <105054704+gophra at users.noreply.github.com> files: M Doc/tutorial/stdlib.rst diff --git a/Doc/tutorial/stdlib.rst b/Doc/tutorial/stdlib.rst index a6399dc1af3a9..32dda97c79039 100644 --- a/Doc/tutorial/stdlib.rst +++ b/Doc/tutorial/stdlib.rst @@ -327,7 +327,7 @@ Python has a "batteries included" philosophy. This is best seen through the sophisticated and robust capabilities of its larger packages. For example: * The :mod:`xmlrpc.client` and :mod:`xmlrpc.server` modules make implementing - remote procedure calls into an almost trivial task. Despite the modules + remote procedure calls into an almost trivial task. Despite the modules' names, no direct knowledge or handling of XML is needed. * The :mod:`email` package is a library for managing email messages, including From webhook-mailer at python.org Fri May 6 10:18:29 2022 From: webhook-mailer at python.org (pablogsal) Date: Fri, 06 May 2022 14:18:29 -0000 Subject: [Python-checkins] gh-90997: Show cached inline values in `dis` output (#92360) Message-ID: https://github.com/python/cpython/commit/93a666b5a56919a3633a3897dfdb9bddfb9614f0 commit: 93a666b5a56919a3633a3897dfdb9bddfb9614f0 branch: main author: Brandt Bucher committer: pablogsal date: 2022-05-06T15:18:09+01:00 summary: gh-90997: Show cached inline values in `dis` output (#92360) files: A Misc/NEWS.d/next/Library/2022-05-05-17-35-01.gh-issue-90997.UV5_s0.rst M Lib/dis.py M Lib/opcode.py M Lib/test/test_dis.py diff --git a/Lib/dis.py b/Lib/dis.py index c0e5367afb55a..53c62694decaa 100644 --- a/Lib/dis.py +++ b/Lib/dis.py @@ -6,8 +6,14 @@ import io from opcode import * -from opcode import __all__ as _opcodes_all -from opcode import _nb_ops, _inline_cache_entries, _specializations, _specialized_instructions +from opcode import ( + __all__ as _opcodes_all, + _cache_format, + _inline_cache_entries, + _nb_ops, + _specializations, + _specialized_instructions, +) __all__ = ["code_info", "dis", "disassemble", "distb", "disco", "findlinestarts", "findlabels", "show_code", @@ -437,9 +443,6 @@ def _get_instructions_bytes(code, varname_from_oparg=None, cache_counter = 0 for offset, op, arg in _unpack_opargs(code): if cache_counter > 0: - if show_caches: - yield Instruction("CACHE", 0, None, None, '', - offset, None, False, None) cache_counter -= 1 continue if linestarts is not None: @@ -494,6 +497,17 @@ def _get_instructions_bytes(code, varname_from_oparg=None, yield Instruction(_all_opname[op], op, arg, argval, argrepr, offset, starts_line, is_jump_target, positions) + if show_caches and cache_counter: + for name, caches in _cache_format[opname[deop]].items(): + data = code[offset + 2: offset + 2 + caches * 2] + argrepr = f"{name}: {int.from_bytes(data, sys.byteorder)}" + for _ in range(caches): + offset += 2 + yield Instruction( + "CACHE", 0, 0, None, argrepr, offset, None, False, None + ) + # Only show the actual value for the first cache entry: + argrepr = "" def disassemble(co, lasti=-1, *, file=None, show_caches=False, adaptive=False): """Disassemble a code object.""" diff --git a/Lib/opcode.py b/Lib/opcode.py index 6c3862707c747..310582874dc8f 100644 --- a/Lib/opcode.py +++ b/Lib/opcode.py @@ -35,23 +35,20 @@ opmap = {} opname = ['<%r>' % (op,) for op in range(256)] -_inline_cache_entries = [0] * 256 - -def def_op(name, op, entries=0): +def def_op(name, op): opname[op] = name opmap[name] = op - _inline_cache_entries[op] = entries -def name_op(name, op, entries=0): - def_op(name, op, entries) +def name_op(name, op): + def_op(name, op) hasname.append(op) -def jrel_op(name, op, entries=0): - def_op(name, op, entries) +def jrel_op(name, op): + def_op(name, op) hasjrel.append(op) -def jabs_op(name, op, entries=0): - def_op(name, op, entries) +def jabs_op(name, op): + def_op(name, op) hasjabs.append(op) # Instruction opcodes for compiled code @@ -68,7 +65,7 @@ def jabs_op(name, op, entries=0): def_op('UNARY_INVERT', 15) -def_op('BINARY_SUBSCR', 25, 4) +def_op('BINARY_SUBSCR', 25) def_op('GET_LEN', 30) def_op('MATCH_MAPPING', 31) @@ -86,7 +83,7 @@ def jabs_op(name, op, entries=0): def_op('BEFORE_WITH', 53) def_op('END_ASYNC_FOR', 54) -def_op('STORE_SUBSCR', 60, 1) +def_op('STORE_SUBSCR', 60) def_op('DELETE_SUBSCR', 61) def_op('GET_ITER', 68) @@ -110,10 +107,10 @@ def jabs_op(name, op, entries=0): name_op('STORE_NAME', 90) # Index in name list name_op('DELETE_NAME', 91) # "" -def_op('UNPACK_SEQUENCE', 92, 1) # Number of tuple items +def_op('UNPACK_SEQUENCE', 92) # Number of tuple items jrel_op('FOR_ITER', 93) def_op('UNPACK_EX', 94) -name_op('STORE_ATTR', 95, 4) # Index in name list +name_op('STORE_ATTR', 95) # Index in name list name_op('DELETE_ATTR', 96) # "" name_op('STORE_GLOBAL', 97) # "" name_op('DELETE_GLOBAL', 98) # "" @@ -125,8 +122,8 @@ def jabs_op(name, op, entries=0): def_op('BUILD_LIST', 103) # Number of list items def_op('BUILD_SET', 104) # Number of set items def_op('BUILD_MAP', 105) # Number of dict entries -name_op('LOAD_ATTR', 106, 4) # Index in name list -def_op('COMPARE_OP', 107, 2) # Comparison operator +name_op('LOAD_ATTR', 106) # Index in name list +def_op('COMPARE_OP', 107) # Comparison operator hascompare.append(107) name_op('IMPORT_NAME', 108) # Index in name list name_op('IMPORT_FROM', 109) # Index in name list @@ -135,12 +132,12 @@ def jabs_op(name, op, entries=0): jrel_op('JUMP_IF_TRUE_OR_POP', 112) # "" jrel_op('POP_JUMP_FORWARD_IF_FALSE', 114) jrel_op('POP_JUMP_FORWARD_IF_TRUE', 115) -name_op('LOAD_GLOBAL', 116, 5) # Index in name list +name_op('LOAD_GLOBAL', 116) # Index in name list def_op('IS_OP', 117) def_op('CONTAINS_OP', 118) def_op('RERAISE', 119) def_op('COPY', 120) -def_op('BINARY_OP', 122, 1) +def_op('BINARY_OP', 122) jrel_op('SEND', 123) # Number of bytes to skip def_op('LOAD_FAST', 124) # Local variable number haslocal.append(124) @@ -185,15 +182,15 @@ def jabs_op(name, op, entries=0): def_op('BUILD_CONST_KEY_MAP', 156) def_op('BUILD_STRING', 157) -name_op('LOAD_METHOD', 160, 10) +name_op('LOAD_METHOD', 160) def_op('LIST_EXTEND', 162) def_op('SET_UPDATE', 163) def_op('DICT_MERGE', 164) def_op('DICT_UPDATE', 165) -def_op('PRECALL', 166, 1) +def_op('PRECALL', 166) -def_op('CALL', 171, 4) +def_op('CALL', 171) def_op('KW_NAMES', 172) hasconst.append(172) @@ -352,3 +349,59 @@ def jabs_op(name, op, entries=0): "miss", "deopt", ] + +_cache_format = { + "LOAD_GLOBAL": { + "counter": 1, + "index": 1, + "module_keys_version": 2, + "builtin_keys_version": 1, + }, + "BINARY_OP": { + "counter": 1, + }, + "UNPACK_SEQUENCE": { + "counter": 1, + }, + "COMPARE_OP": { + "counter": 1, + "mask": 1, + }, + "BINARY_SUBSCR": { + "counter": 1, + "type_version": 2, + "func_version": 1, + }, + "LOAD_ATTR": { + "counter": 1, + "version": 2, + "index": 1, + }, + "STORE_ATTR": { + "counter": 1, + "version": 2, + "index": 1, + }, + "LOAD_METHOD": { + "counter": 1, + "type_version": 2, + "dict_offset": 1, + "keys_version": 2, + "descr": 4, + }, + "CALL": { + "counter": 1, + "func_version": 2, + "min_args": 1, + }, + "PRECALL": { + "counter": 1, + }, + "STORE_SUBSCR": { + "counter": 1, + }, +} + +_inline_cache_entries = [ + sum(_cache_format.get(opname[opcode], {}).values()) for opcode in range(256) +] diff --git a/Lib/test/test_dis.py b/Lib/test/test_dis.py index b8d1c542bae90..202b99829f213 100644 --- a/Lib/test/test_dis.py +++ b/Lib/test/test_dis.py @@ -1011,6 +1011,37 @@ def test_loop_quicken(self): got = self.get_disassembly(loop_test, adaptive=True) self.do_disassembly_compare(got, dis_loop_test_quickened_code, True) + def get_cached_values(self, quickened, adaptive): + def f(): + l = [] + for i in range(42): + l.append(i) + if quickened: + self.code_quicken(f) + else: + # "copy" the code to un-quicken it: + f.__code__ = f.__code__.replace() + for instruction in dis.get_instructions( + f, show_caches=True, adaptive=adaptive + ): + if instruction.opname == "CACHE": + yield instruction.argrepr + + @cpython_only + def test_show_caches(self): + for quickened in (False, True): + for adaptive in (False, True): + with self.subTest(f"{quickened=}, {adaptive=}"): + if quickened and adaptive: + pattern = r"^(\w+: \d+)?$" + else: + pattern = r"^(\w+: 0)?$" + caches = list(self.get_cached_values(quickened, adaptive)) + for cache in caches: + self.assertRegex(cache, pattern) + self.assertEqual(caches.count(""), 8) + self.assertEqual(len(caches), 25) + class DisWithFileTests(DisTests): diff --git a/Misc/NEWS.d/next/Library/2022-05-05-17-35-01.gh-issue-90997.UV5_s0.rst b/Misc/NEWS.d/next/Library/2022-05-05-17-35-01.gh-issue-90997.UV5_s0.rst new file mode 100644 index 0000000000000..a653bebfaf4a4 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-05-05-17-35-01.gh-issue-90997.UV5_s0.rst @@ -0,0 +1,2 @@ +Show the actual named values stored in inline caches when +``show_caches=True`` is passed to :mod:`dis` utilities. From webhook-mailer at python.org Fri May 6 10:19:01 2022 From: webhook-mailer at python.org (pablogsal) Date: Fri, 06 May 2022 14:19:01 -0000 Subject: [Python-checkins] gh-90978: test_ssl of test_asyncio uses LONG_TIMEOUT (#92402) Message-ID: https://github.com/python/cpython/commit/973a5203c151efb7a86a478140f7b0c9ae70438f commit: 973a5203c151efb7a86a478140f7b0c9ae70438f branch: main author: Victor Stinner committer: pablogsal date: 2022-05-06T15:18:56+01:00 summary: gh-90978: test_ssl of test_asyncio uses LONG_TIMEOUT (#92402) On slow buildbot workers, some test_ssl tests fail randomly because of short timeout (30 seconds). Use support.LONG_TIMEOUT instead which is longer and also adjusted (by regrtest --timeout option) on buildbot workers known to be slow. files: M Lib/test/test_asyncio/test_ssl.py diff --git a/Lib/test/test_asyncio/test_ssl.py b/Lib/test/test_asyncio/test_ssl.py index 67684ab09e688..9ba6ba04b32b8 100644 --- a/Lib/test/test_asyncio/test_ssl.py +++ b/Lib/test/test_asyncio/test_ssl.py @@ -62,7 +62,7 @@ def connection_lost(self, exc): class TestSSL(test_utils.TestCase): PAYLOAD_SIZE = 1024 * 100 - TIMEOUT = 60 + TIMEOUT = support.LONG_TIMEOUT def setUp(self): super().setUp() @@ -179,7 +179,7 @@ async def wait_closed(self, obj): def test_create_server_ssl_1(self): CNT = 0 # number of clients that were successful TOTAL_CNT = 25 # total number of clients that test will create - TIMEOUT = 60.0 # timeout for this test + TIMEOUT = support.LONG_TIMEOUT # timeout for this test A_DATA = b'A' * 1024 * 1024 B_DATA = b'B' * 1024 * 1024 @@ -1019,7 +1019,7 @@ async def run_main(): def test_create_server_ssl_over_ssl(self): CNT = 0 # number of clients that were successful TOTAL_CNT = 25 # total number of clients that test will create - TIMEOUT = 30.0 # timeout for this test + TIMEOUT = support.LONG_TIMEOUT # timeout for this test A_DATA = b'A' * 1024 * 1024 B_DATA = b'B' * 1024 * 1024 From webhook-mailer at python.org Fri May 6 13:02:56 2022 From: webhook-mailer at python.org (ned-deily) Date: Fri, 06 May 2022 17:02:56 -0000 Subject: [Python-checkins] bpo-42773: fix tests not being run on pushes (GH-24004) (GH-92341) Message-ID: https://github.com/python/cpython/commit/5adef3dd28854da4589be6937d3fcdc5c207276b commit: 5adef3dd28854da4589be6937d3fcdc5c207276b branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: ned-deily date: 2022-05-06T13:02:47-04:00 summary: bpo-42773: fix tests not being run on pushes (GH-24004) (GH-92341) There was a typo, we were checking if the "GITHUB_BASE_REF" string literal was empty instead of the $GITHUB_BASE_REF value. When $GITHUB_BASE_REF is empty, the action that triggered the run was not a pull request, so we always run the full test suite. Signed-off-by: Filipe La?ns (cherry picked from commit 4ac923f2756f835f512339ee181348cc535ab07f) files: M .github/workflows/build.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 530eba70b5ba2..f05da0938efd3 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -21,7 +21,7 @@ jobs: - name: Check for source changes id: check run: | - if [ -z "GITHUB_BASE_REF" ]; then + if [ -z "$GITHUB_BASE_REF" ]; then echo '::set-output name=run_tests::true' else git fetch origin $GITHUB_BASE_REF --depth=1 From webhook-mailer at python.org Fri May 6 13:09:43 2022 From: webhook-mailer at python.org (larryhastings) Date: Fri, 06 May 2022 17:09:43 -0000 Subject: [Python-checkins] gh-92203: Add closure support to exec(). (#92204) Message-ID: https://github.com/python/cpython/commit/50210643902d28405a57a9672347f43215dbdb3b commit: 50210643902d28405a57a9672347f43215dbdb3b branch: main author: larryhastings committer: larryhastings date: 2022-05-06T10:09:35-07:00 summary: gh-92203: Add closure support to exec(). (#92204) Add a closure keyword-only parameter to exec(). It can only be specified when exec-ing a code object that uses free variables. When specified, it must be a tuple, with exactly the number of cell variables referenced by the code object. closure has a default value of None, and it must be None if the code object doesn't refer to any free variables. files: A Misc/NEWS.d/next/Core and Builtins/2022-05-02-17-12-49.gh-issue-92203.-igcjS.rst M Doc/library/functions.rst M Lib/test/test_builtin.py M Python/bltinmodule.c M Python/clinic/bltinmodule.c.h diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst index 47b4b11cced85..83d54da72256a 100644 --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -552,7 +552,7 @@ are always available. They are listed here in alphabetical order. .. index:: builtin: exec -.. function:: exec(object[, globals[, locals]]) +.. function:: exec(object[, globals[, locals]], *, closure=None) This function supports dynamic execution of Python code. *object* must be either a string or a code object. If it is a string, the string is parsed as @@ -581,6 +581,11 @@ are always available. They are listed here in alphabetical order. builtins are available to the executed code by inserting your own ``__builtins__`` dictionary into *globals* before passing it to :func:`exec`. + The *closure* argument specifies a closure--a tuple of cellvars. + It's only valid when the *object* is a code object containing free variables. + The length of the tuple must exactly match the number of free variables + referenced by the code object. + .. audit-event:: exec code_object exec Raises an :ref:`auditing event ` ``exec`` with the code object @@ -599,6 +604,9 @@ are always available. They are listed here in alphabetical order. Pass an explicit *locals* dictionary if you need to see effects of the code on *locals* after function :func:`exec` returns. + .. versionchanged:: 3.11 + Added the *closure* parameter. + .. function:: filter(function, iterable) diff --git a/Lib/test/test_builtin.py b/Lib/test/test_builtin.py index 29039230201ac..ba7a7e20d7dcd 100644 --- a/Lib/test/test_builtin.py +++ b/Lib/test/test_builtin.py @@ -24,7 +24,7 @@ from inspect import CO_COROUTINE from itertools import product from textwrap import dedent -from types import AsyncGeneratorType, FunctionType +from types import AsyncGeneratorType, FunctionType, CellType from operator import neg from test import support from test.support import (swap_attr, maybe_get_event_loop_policy) @@ -772,6 +772,84 @@ def test_exec_redirected(self): finally: sys.stdout = savestdout + def test_exec_closure(self): + def function_without_closures(): + return 3 * 5 + + result = 0 + def make_closure_functions(): + a = 2 + b = 3 + c = 5 + def three_freevars(): + nonlocal result + nonlocal a + nonlocal b + result = a*b + def four_freevars(): + nonlocal result + nonlocal a + nonlocal b + nonlocal c + result = a*b*c + return three_freevars, four_freevars + three_freevars, four_freevars = make_closure_functions() + + # "smoke" test + result = 0 + exec(three_freevars.__code__, + three_freevars.__globals__, + closure=three_freevars.__closure__) + self.assertEqual(result, 6) + + # should also work with a manually created closure + result = 0 + my_closure = (CellType(35), CellType(72), three_freevars.__closure__[2]) + exec(three_freevars.__code__, + three_freevars.__globals__, + closure=my_closure) + self.assertEqual(result, 2520) + + # should fail: closure isn't allowed + # for functions without free vars + self.assertRaises(TypeError, + exec, + function_without_closures.__code__, + function_without_closures.__globals__, + closure=my_closure) + + # should fail: closure required but wasn't specified + self.assertRaises(TypeError, + exec, + three_freevars.__code__, + three_freevars.__globals__, + closure=None) + + # should fail: closure of wrong length + self.assertRaises(TypeError, + exec, + three_freevars.__code__, + three_freevars.__globals__, + closure=four_freevars.__closure__) + + # should fail: closure using a list instead of a tuple + my_closure = list(my_closure) + self.assertRaises(TypeError, + exec, + three_freevars.__code__, + three_freevars.__globals__, + closure=my_closure) + + # should fail: closure tuple with one non-cell-var + my_closure[0] = int + my_closure = tuple(my_closure) + self.assertRaises(TypeError, + exec, + three_freevars.__code__, + three_freevars.__globals__, + closure=my_closure) + + def test_filter(self): self.assertEqual(list(filter(lambda c: 'a' <= c <= 'z', 'Hello World')), list('elloorld')) self.assertEqual(list(filter(None, [1, 'hello', [], [3], '', None, 9, 0])), [1, 'hello', [3], 9]) diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-02-17-12-49.gh-issue-92203.-igcjS.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-02-17-12-49.gh-issue-92203.-igcjS.rst new file mode 100644 index 0000000000000..f765579a1b627 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-05-02-17-12-49.gh-issue-92203.-igcjS.rst @@ -0,0 +1,5 @@ +Add a closure keyword-only parameter to exec(). It can only be specified +when exec-ing a code object that uses free variables. When specified, it +must be a tuple, with exactly the number of cell variables referenced by the +code object. closure has a default value of None, and it must be None if the +code object doesn't refer to any free variables. diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index 84ebb680e0b8f..072bf75bf8d69 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -977,6 +977,8 @@ exec as builtin_exec globals: object = None locals: object = None / + * + closure: object(c_default="NULL") = None Execute the given source in the context of globals and locals. @@ -985,12 +987,14 @@ or a code object as returned by compile(). The globals must be a dictionary and locals can be any mapping, defaulting to the current globals and locals. If only globals is given, locals defaults to it. +The closure must be a tuple of cellvars, and can only be used +when source is a code object requiring exactly that many cellvars. [clinic start generated code]*/ static PyObject * builtin_exec_impl(PyObject *module, PyObject *source, PyObject *globals, - PyObject *locals) -/*[clinic end generated code: output=3c90efc6ab68ef5d input=01ca3e1c01692829]*/ + PyObject *locals, PyObject *closure) +/*[clinic end generated code: output=7579eb4e7646743d input=f13a7e2b503d1d9a]*/ { PyObject *v; @@ -1029,20 +1033,60 @@ builtin_exec_impl(PyObject *module, PyObject *source, PyObject *globals, return NULL; } + if (closure == Py_None) { + closure = NULL; + } + if (PyCode_Check(source)) { + Py_ssize_t num_free = PyCode_GetNumFree((PyCodeObject *)source); + if (num_free == 0) { + if (closure) { + PyErr_SetString(PyExc_TypeError, + "cannot use a closure with this code object"); + return NULL; + } + } else { + int closure_is_ok = + closure + && PyTuple_CheckExact(closure) + && (PyTuple_GET_SIZE(closure) == num_free); + if (closure_is_ok) { + for (Py_ssize_t i = 0; i < num_free; i++) { + PyObject *cell = PyTuple_GET_ITEM(closure, i); + if (!PyCell_Check(cell)) { + closure_is_ok = 0; + break; + } + } + } + if (!closure_is_ok) { + PyErr_Format(PyExc_TypeError, + "code object requires a closure of exactly length %zd", + num_free); + return NULL; + } + } + if (PySys_Audit("exec", "O", source) < 0) { return NULL; } - if (PyCode_GetNumFree((PyCodeObject *)source) > 0) { - PyErr_SetString(PyExc_TypeError, - "code object passed to exec() may not " - "contain free variables"); - return NULL; + if (!closure) { + v = PyEval_EvalCode(source, globals, locals); + } else { + v = PyEval_EvalCodeEx(source, globals, locals, + NULL, 0, + NULL, 0, + NULL, 0, + NULL, + closure); } - v = PyEval_EvalCode(source, globals, locals); } else { + if (closure != NULL) { + PyErr_SetString(PyExc_TypeError, + "closure can only be used when source is a code object"); + } PyObject *source_copy; const char *str; PyCompilerFlags cf = _PyCompilerFlags_INIT; diff --git a/Python/clinic/bltinmodule.c.h b/Python/clinic/bltinmodule.c.h index f69b0069ec0f5..48f65091164d0 100644 --- a/Python/clinic/bltinmodule.c.h +++ b/Python/clinic/bltinmodule.c.h @@ -408,7 +408,7 @@ builtin_eval(PyObject *module, PyObject *const *args, Py_ssize_t nargs) } PyDoc_STRVAR(builtin_exec__doc__, -"exec($module, source, globals=None, locals=None, /)\n" +"exec($module, source, globals=None, locals=None, /, *, closure=None)\n" "--\n" "\n" "Execute the given source in the context of globals and locals.\n" @@ -417,37 +417,52 @@ PyDoc_STRVAR(builtin_exec__doc__, "or a code object as returned by compile().\n" "The globals must be a dictionary and locals can be any mapping,\n" "defaulting to the current globals and locals.\n" -"If only globals is given, locals defaults to it."); +"If only globals is given, locals defaults to it.\n" +"The closure must be a tuple of cellvars, and can only be used\n" +"when source is a code object requiring exactly that many cellvars."); #define BUILTIN_EXEC_METHODDEF \ - {"exec", _PyCFunction_CAST(builtin_exec), METH_FASTCALL, builtin_exec__doc__}, + {"exec", _PyCFunction_CAST(builtin_exec), METH_FASTCALL|METH_KEYWORDS, builtin_exec__doc__}, static PyObject * builtin_exec_impl(PyObject *module, PyObject *source, PyObject *globals, - PyObject *locals); + PyObject *locals, PyObject *closure); static PyObject * -builtin_exec(PyObject *module, PyObject *const *args, Py_ssize_t nargs) +builtin_exec(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; + static const char * const _keywords[] = {"", "", "", "closure", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "exec", 0}; + PyObject *argsbuf[4]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; PyObject *source; PyObject *globals = Py_None; PyObject *locals = Py_None; + PyObject *closure = NULL; - if (!_PyArg_CheckPositional("exec", nargs, 1, 3)) { + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 3, 0, argsbuf); + if (!args) { goto exit; } source = args[0]; if (nargs < 2) { - goto skip_optional; + goto skip_optional_posonly; } + noptargs--; globals = args[1]; if (nargs < 3) { - goto skip_optional; + goto skip_optional_posonly; } + noptargs--; locals = args[2]; -skip_optional: - return_value = builtin_exec_impl(module, source, globals, locals); +skip_optional_posonly: + if (!noptargs) { + goto skip_optional_kwonly; + } + closure = args[3]; +skip_optional_kwonly: + return_value = builtin_exec_impl(module, source, globals, locals, closure); exit: return return_value; @@ -1030,4 +1045,4 @@ builtin_issubclass(PyObject *module, PyObject *const *args, Py_ssize_t nargs) exit: return return_value; } -/*[clinic end generated code: output=6a2b78ef82bc5155 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=a2c5c53e8aead7c3 input=a9049054013a1b77]*/ From webhook-mailer at python.org Fri May 6 13:57:32 2022 From: webhook-mailer at python.org (pablogsal) Date: Fri, 06 May 2022 17:57:32 -0000 Subject: [Python-checkins] gh-90997: Move `CACHE` handling into `_unpack_opargs` (#92409) Message-ID: https://github.com/python/cpython/commit/3f61db475692511a9676765e6f9f0bb204306e93 commit: 3f61db475692511a9676765e6f9f0bb204306e93 branch: main author: Brandt Bucher committer: pablogsal date: 2022-05-06T18:57:08+01:00 summary: gh-90997: Move `CACHE` handling into `_unpack_opargs` (#92409) * Move CACHE handling into _unpack_opargs * Remove auto-added import * blurb add files: A Misc/NEWS.d/next/Library/2022-05-06-09-48-07.gh-issue-90997.4PmCgX.rst M Lib/dis.py diff --git a/Lib/dis.py b/Lib/dis.py index 53c62694decaa..046013120b000 100644 --- a/Lib/dis.py +++ b/Lib/dis.py @@ -440,11 +440,7 @@ def _get_instructions_bytes(code, varname_from_oparg=None, for i in range(start, end): labels.add(target) starts_line = None - cache_counter = 0 for offset, op, arg in _unpack_opargs(code): - if cache_counter > 0: - cache_counter -= 1 - continue if linestarts is not None: starts_line = linestarts.get(offset, None) if starts_line is not None: @@ -454,7 +450,6 @@ def _get_instructions_bytes(code, varname_from_oparg=None, argrepr = '' positions = Positions(*next(co_positions, ())) deop = _deoptop(op) - cache_counter = _inline_cache_entries[deop] if arg is not None: # Set argval to the dereferenced value of the argument when # available, and argrepr to the string representation of argval. @@ -497,7 +492,7 @@ def _get_instructions_bytes(code, varname_from_oparg=None, yield Instruction(_all_opname[op], op, arg, argval, argrepr, offset, starts_line, is_jump_target, positions) - if show_caches and cache_counter: + if show_caches and _inline_cache_entries[deop]: for name, caches in _cache_format[opname[deop]].items(): data = code[offset + 2: offset + 2 + caches * 2] argrepr = f"{name}: {int.from_bytes(data, sys.byteorder)}" @@ -586,9 +581,16 @@ def _disassemble_str(source, **kwargs): def _unpack_opargs(code): extended_arg = 0 + caches = 0 for i in range(0, len(code), 2): + # Skip inline CACHE entries: + if caches: + caches -= 1 + continue op = code[i] - if _deoptop(op) >= HAVE_ARGUMENT: + deop = _deoptop(op) + caches = _inline_cache_entries[deop] + if deop >= HAVE_ARGUMENT: arg = code[i+1] | extended_arg extended_arg = (arg << 8) if op == EXTENDED_ARG else 0 # The oparg is stored as a signed integer diff --git a/Misc/NEWS.d/next/Library/2022-05-06-09-48-07.gh-issue-90997.4PmCgX.rst b/Misc/NEWS.d/next/Library/2022-05-06-09-48-07.gh-issue-90997.4PmCgX.rst new file mode 100644 index 0000000000000..0e683070806c2 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-05-06-09-48-07.gh-issue-90997.4PmCgX.rst @@ -0,0 +1,2 @@ +Fix an issue where :mod:`dis` utilities may interpret populated inline cache +entries as valid instructions. From webhook-mailer at python.org Sat May 7 00:01:54 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Sat, 07 May 2022 04:01:54 -0000 Subject: [Python-checkins] [3.10] gh-92112: Fix crash triggered by an evil custom `mro()` (GH-92113) (#92370) Message-ID: https://github.com/python/cpython/commit/4674b315e555828e5cb15bedcf2c495669670cbb commit: 4674b315e555828e5cb15bedcf2c495669670cbb branch: 3.10 author: Jelle Zijlstra committer: JelleZijlstra date: 2022-05-06T21:01:23-07:00 summary: [3.10] gh-92112: Fix crash triggered by an evil custom `mro()` (GH-92113) (#92370) (cherry picked from commit 85354ed78c0edb6d81a2bd53cabc85e547b8b26e) Co-authored-by: Alexey Izbyshev files: A Misc/NEWS.d/next/Core and Builtins/2022-05-01-10-58-38.gh-issue-92112.lLJemu.rst M Lib/test/test_descr.py M Objects/typeobject.c diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py index f3dd1b32e2afa..b174e7168f7db 100644 --- a/Lib/test/test_descr.py +++ b/Lib/test/test_descr.py @@ -5737,6 +5737,23 @@ def mro(cls): class A(metaclass=M): pass + def test_disappearing_custom_mro(self): + """ + gh-92112: A custom mro() returning a result conflicting with + __bases__ and deleting itself caused a double free. + """ + class B: + pass + + class M(DebugHelperMeta): + def mro(cls): + del M.mro + return (B,) + + with self.assertRaises(TypeError): + class A(metaclass=M): + pass + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-01-10-58-38.gh-issue-92112.lLJemu.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-01-10-58-38.gh-issue-92112.lLJemu.rst new file mode 100644 index 0000000000000..00c938e89f438 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-05-01-10-58-38.gh-issue-92112.lLJemu.rst @@ -0,0 +1 @@ +Fix crash triggered by an evil custom ``mro()`` on a metaclass. diff --git a/Objects/typeobject.c b/Objects/typeobject.c index b3ba1208eb253..50f2742f676f6 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -369,22 +369,26 @@ type_mro_modified(PyTypeObject *type, PyObject *bases) { Py_ssize_t i, n; int custom = !Py_IS_TYPE(type, &PyType_Type); int unbound; - PyObject *mro_meth = NULL; - PyObject *type_mro_meth = NULL; if (custom) { + PyObject *mro_meth, *type_mro_meth; mro_meth = lookup_maybe_method( (PyObject *)type, &PyId_mro, &unbound); - if (mro_meth == NULL) + if (mro_meth == NULL) { goto clear; + } type_mro_meth = lookup_maybe_method( (PyObject *)&PyType_Type, &PyId_mro, &unbound); - if (type_mro_meth == NULL) + if (type_mro_meth == NULL) { + Py_DECREF(mro_meth); goto clear; - if (mro_meth != type_mro_meth) + } + int custom_mro = (mro_meth != type_mro_meth); + Py_DECREF(mro_meth); + Py_DECREF(type_mro_meth); + if (custom_mro) { goto clear; - Py_XDECREF(mro_meth); - Py_XDECREF(type_mro_meth); + } } n = PyTuple_GET_SIZE(bases); for (i = 0; i < n; i++) { @@ -400,8 +404,6 @@ type_mro_modified(PyTypeObject *type, PyObject *bases) { } return; clear: - Py_XDECREF(mro_meth); - Py_XDECREF(type_mro_meth); type->tp_flags &= ~Py_TPFLAGS_VALID_VERSION_TAG; type->tp_version_tag = 0; /* 0 is not a valid version tag */ } From webhook-mailer at python.org Sat May 7 00:23:24 2022 From: webhook-mailer at python.org (ezio-melotti) Date: Sat, 07 May 2022 04:23:24 -0000 Subject: [Python-checkins] gh-92308: Add Pending Removal section to 3.11 What's New (#92309) Message-ID: https://github.com/python/cpython/commit/0924b95f6e678beaf4a059d679515956bac608fb commit: 0924b95f6e678beaf4a059d679515956bac608fb branch: main author: Erlend Egeberg Aasland committer: ezio-melotti date: 2022-05-07T06:23:13+02:00 summary: gh-92308: Add Pending Removal section to 3.11 What's New (#92309) * gh-92308: Add Pending Removal section to 3.11 What's New * Use compact list; drop attributions * Add short text, and also missing PyUnicode_InternImmortal * Fix formatting * markup fix * Update Doc/whatsnew/3.11.rst Co-authored-by: Victor Stinner * Apply suggestions from code review Co-authored-by: Victor Stinner Co-authored-by: Victor Stinner Co-authored-by: Ezio Melotti files: M Doc/whatsnew/3.11.rst diff --git a/Doc/whatsnew/3.11.rst b/Doc/whatsnew/3.11.rst index b9871f7ef69f9..c4e8e6f9a1051 100644 --- a/Doc/whatsnew/3.11.rst +++ b/Doc/whatsnew/3.11.rst @@ -1217,6 +1217,61 @@ Deprecated (Contributed by Alex Waygood in :gh:`92332`.) +Pending Removal in Python 3.12 +============================== + +The following APIs have been deprecated in earlier Python releases, +and will be removed in Python 3.12. + +Python API: + +* :class:`pkgutil.ImpImporter` +* :class:`pkgutil.ImpLoader` +* :envvar:`PYTHONTHREADDEBUG` +* :func:`importlib.find_loader` +* :func:`importlib.util.module_for_loader` +* :func:`importlib.util.set_loader_wrapper` +* :func:`importlib.util.set_package_wrapper` +* :meth:`importlib.abc.Loader.module_repr` +* :meth:`importlib.abc.Loadermodule_repr` +* :meth:`importlib.abc.MetaPathFinder.find_module` +* :meth:`importlib.abc.MetaPathFinder.find_module` +* :meth:`importlib.abc.PathEntryFinder.find_loader` +* :meth:`importlib.abc.PathEntryFinder.find_module` +* :meth:`importlib.machinery.BuiltinImporter.find_module` +* :meth:`importlib.machinery.BuiltinLoader.module_repr` +* :meth:`importlib.machinery.FileFinder.find_loader` +* :meth:`importlib.machinery.FileFinder.find_module` +* :meth:`importlib.machinery.FrozenImporter.find_module` +* :meth:`importlib.machinery.FrozenLoader.module_repr` +* :meth:`importlib.machinery.PathFinder.find_module` +* :meth:`importlib.machinery.WindowsRegistryFinder.find_module` +* :meth:`pathlib.Path.link_to` +* The entire :ref:`distutils namespace ` +* :func:`cgi.log` +* :func:`sqlite3.OptimizedUnicode` +* :func:`sqlite3.enable_shared_cache` + +C API: + +* :c:func:`PyUnicode_AS_DATA` +* :c:func:`PyUnicode_AS_UNICODE` +* :c:func:`PyUnicode_AsUnicodeAndSize` +* :c:func:`PyUnicode_AsUnicode` +* :c:func:`PyUnicode_FromUnicode` +* :c:func:`PyUnicode_GET_DATA_SIZE` +* :c:func:`PyUnicode_GET_SIZE` +* :c:func:`PyUnicode_GetSize` +* :c:func:`PyUnicode_IS_COMPACT` +* :c:func:`PyUnicode_IS_READY` +* :c:func:`PyUnicode_READY` +* :c:func:`Py_UNICODE_WSTR_LENGTH` +* :c:func:`_PyUnicode_AsUnicode` +* :c:macro:`PyUnicode_WCHAR_KIND` +* :c:type:`PyUnicodeObject` +* :c:func:`PyUnicode_InternImmortal()` + + Removed ======= From webhook-mailer at python.org Sat May 7 14:21:27 2022 From: webhook-mailer at python.org (pablogsal) Date: Sat, 07 May 2022 18:21:27 -0000 Subject: [Python-checkins] gh-88279: Fix compiler warning for using deprecated PySys_SetArgvEx (#92428) Message-ID: https://github.com/python/cpython/commit/bd030b633f98ea5d9f93ef0105a51d2faf67070d commit: bd030b633f98ea5d9f93ef0105a51d2faf67070d branch: main author: Serhiy Storchaka committer: pablogsal date: 2022-05-07T19:21:11+01:00 summary: gh-88279: Fix compiler warning for using deprecated PySys_SetArgvEx (#92428) files: M Python/sysmodule.c diff --git a/Python/sysmodule.c b/Python/sysmodule.c index edd1d1f23fdea..4f8b4cc17f2c1 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -3302,7 +3302,10 @@ PySys_SetArgvEx(int argc, wchar_t **argv, int updatepath) void PySys_SetArgv(int argc, wchar_t **argv) { +_Py_COMP_DIAG_PUSH +_Py_COMP_DIAG_IGNORE_DEPR_DECLS PySys_SetArgvEx(argc, argv, Py_IsolatedFlag == 0); +_Py_COMP_DIAG_POP } /* Reimplementation of PyFile_WriteString() no calling indirectly From webhook-mailer at python.org Sat May 7 22:44:47 2022 From: webhook-mailer at python.org (pablogsal) Date: Sun, 08 May 2022 02:44:47 -0000 Subject: [Python-checkins] Post 3.11.0b1 Message-ID: https://github.com/python/cpython/commit/6fbb56dc6bed82b2590c740f522639e4e7bcf8ce commit: 6fbb56dc6bed82b2590c740f522639e4e7bcf8ce branch: 3.11 author: Pablo Galindo committer: pablogsal date: 2022-05-08T03:37:35+01:00 summary: Post 3.11.0b1 files: M Include/patchlevel.h diff --git a/Include/patchlevel.h b/Include/patchlevel.h index 9747ca4177722..12c0b81cd0ccf 100644 --- a/Include/patchlevel.h +++ b/Include/patchlevel.h @@ -23,7 +23,7 @@ #define PY_RELEASE_SERIAL 1 /* Version as a string */ -#define PY_VERSION "3.11.0b1" +#define PY_VERSION "3.11.0b1+" /*--end constants--*/ /* Version as a single 4-byte hex number, e.g. 0x010502B2 == 1.5.2b2. From webhook-mailer at python.org Sat May 7 22:44:47 2022 From: webhook-mailer at python.org (pablogsal) Date: Sun, 08 May 2022 02:44:47 -0000 Subject: [Python-checkins] Python 3.11.0b1 Message-ID: https://github.com/python/cpython/commit/0e5fe7f9e9d3b995a7ccc4fae498e6eaf01027a0 commit: 0e5fe7f9e9d3b995a7ccc4fae498e6eaf01027a0 branch: main author: Pablo Galindo committer: pablogsal date: 2022-05-06T23:53:50+01:00 summary: Python 3.11.0b1 files: A Misc/NEWS.d/3.11.0b1.rst D Misc/NEWS.d/next/Build/2022-03-23-20-01-16.bpo-47103.b4-00F.rst D Misc/NEWS.d/next/Build/2022-04-10-16-33-31.bpo-47152.TLkxKm.rst D Misc/NEWS.d/next/Build/2022-04-20-11-14-51.gh-issue-91731.zRoPcJ.rst D Misc/NEWS.d/next/Build/2022-05-03-03-36-47.gh-issue-89452.NIY0fF.rst D Misc/NEWS.d/next/C API/2022-01-11-12-52-37.bpo-46343.JQJWhZ.rst D Misc/NEWS.d/next/C API/2022-04-06-16-29-14.bpo-47169.wVv2bT.rst D Misc/NEWS.d/next/C API/2022-04-06-16-54-39.bpo-47169.EGzX4B.rst D Misc/NEWS.d/next/C API/2022-04-07-00-53-51.bpo-35134.zSjIzk.rst D Misc/NEWS.d/next/C API/2022-04-08-11-29-36.bpo-40421.H0ORmT.rst D Misc/NEWS.d/next/C API/2022-04-19-17-05-39.gh-issue-91020.BVJ8F3.rst D Misc/NEWS.d/next/C API/2022-04-21-01-48-22.gh-issue-91768.x_aKzv.rst D Misc/NEWS.d/next/C API/2022-04-21-23-11-35.gh-issue-80527.Cx-95G.rst D Misc/NEWS.d/next/C API/2022-04-26-16-51-31.gh-issue-91320.QDHmTv.rst D Misc/NEWS.d/next/C API/2022-05-02-12-39-33.gh-issue-92173.len2Is.rst D Misc/NEWS.d/next/C API/2022-05-03-20-08-35.gh-issue-92154.IqMcAJ.rst D Misc/NEWS.d/next/C API/2022-05-06-04-55-17.gh-issue-88279.3mQ54t.rst D Misc/NEWS.d/next/Core and Builtins/2017-07-23-11-28-45.bpo-26579.lpCY8R.rst D Misc/NEWS.d/next/Core and Builtins/2018-07-14-16-58-00.bpo-34093.WaVD-f.rst D Misc/NEWS.d/next/Core and Builtins/2021-09-28-10-58-30.bpo-36819.cyV50C.rst D Misc/NEWS.d/next/Core and Builtins/2021-12-11-11-36-48.bpo-46045.sfThay.rst D Misc/NEWS.d/next/Core and Builtins/2022-01-25-05-39-38.bpo-46509.ljrqrc.rst D Misc/NEWS.d/next/Core and Builtins/2022-02-11-17-16-30.bpo-46721.JkHaLF.rst D Misc/NEWS.d/next/Core and Builtins/2022-02-13-21-53-29.bpo-43464.yupHjd.rst D Misc/NEWS.d/next/Core and Builtins/2022-02-16-03-23-38.bpo-46764.wEY4bS.rst D Misc/NEWS.d/next/Core and Builtins/2022-03-07-11-51-51.bpo-46942.57obVi.rst D Misc/NEWS.d/next/Core and Builtins/2022-03-08-21-59-57.bpo-46962.UomDfz.rst D Misc/NEWS.d/next/Core and Builtins/2022-03-13-08-23-17.bpo-46961.SgGCkG.rst D Misc/NEWS.d/next/Core and Builtins/2022-03-31-01-30-03.bpo-47177.fQqaov.rst D Misc/NEWS.d/next/Core and Builtins/2022-03-31-14-33-48.bpo-47120.6S_uoU.rst D Misc/NEWS.d/next/Core and Builtins/2022-04-03-17-21-04.bpo-47197.Ji_c30.rst D Misc/NEWS.d/next/Core and Builtins/2022-04-04-15-12-38.bpo-45317.UDLOt8.rst D Misc/NEWS.d/next/Core and Builtins/2022-04-06-22-50-31.bpo-47120.mbfHs5.rst D Misc/NEWS.d/next/Core and Builtins/2022-04-10-18-47-21.gh-issue-91428.ZewV-M.rst D Misc/NEWS.d/next/Core and Builtins/2022-04-10-22-57-27.gh-issue-91421.dHhv6U.rst D Misc/NEWS.d/next/Core and Builtins/2022-04-11-18-44-19.gh-issue-89455.d0qMYd.rst D Misc/NEWS.d/next/Core and Builtins/2022-04-12-00-44-14.gh-issue-91462.t8oxyd.rst D Misc/NEWS.d/next/Core and Builtins/2022-04-12-09-40-57.gh-issue-46055.IPb1HA.rst D Misc/NEWS.d/next/Core and Builtins/2022-04-12-11-56-23.gh-issue-91479.-dyGJX.rst D Misc/NEWS.d/next/Core and Builtins/2022-04-13-07-14-30.gh-issue-91266.6Vkzzt.rst D Misc/NEWS.d/next/Core and Builtins/2022-04-13-11-15-09.gh-issue-91502.11YXHQ.rst D Misc/NEWS.d/next/Core and Builtins/2022-04-13-22-03-04.gh-issue-89279.-jAVxZ.rst D Misc/NEWS.d/next/Core and Builtins/2022-04-15-16-57-23.gh-issue-91576.adoDj_.rst D Misc/NEWS.d/next/Core and Builtins/2022-04-16-21-54-31.gh-issue-78607._Y7bMm.rst D Misc/NEWS.d/next/Core and Builtins/2022-04-17-02-55-38.gh-issue-91625.80CrC7.rst D Misc/NEWS.d/next/Core and Builtins/2022-04-17-11-03-45.gh-issue-91603.hYw1Lv.rst D Misc/NEWS.d/next/Core and Builtins/2022-04-18-02-45-40.gh-issue-91636.6DFdy_.rst D Misc/NEWS.d/next/Core and Builtins/2022-04-18-07-23-48.gh-issue-91102.vm-6g1.rst D Misc/NEWS.d/next/Core and Builtins/2022-04-18-15-22-56.bpo-43950.qrTvWL.rst D Misc/NEWS.d/next/Core and Builtins/2022-04-18-20-25-01.gh-issue-81548.n3VYgp.rst D Misc/NEWS.d/next/Core and Builtins/2022-04-20-14-43-37.gh-issue-91632.cvUhsZ.rst D Misc/NEWS.d/next/Core and Builtins/2022-04-21-16-15-24.gh-issue-89373.A1jgLx.rst D Misc/NEWS.d/next/Core and Builtins/2022-04-23-22-08-34.gh-issue-91603.GcWEkK.rst D Misc/NEWS.d/next/Core and Builtins/2022-04-26-05-05-32.gh-issue-91869.ELbTXl.rst D Misc/NEWS.d/next/Core and Builtins/2022-04-27-10-36-43.gh-issue-87999.YSPHfO.rst D Misc/NEWS.d/next/Core and Builtins/2022-04-28-20-19-49.gh-issue-92032.ef-UfM.rst D Misc/NEWS.d/next/Core and Builtins/2022-04-28-23-37-30.gh-issue-92036.GZJAC9.rst D Misc/NEWS.d/next/Core and Builtins/2022-04-29-02-50-41.gh-issue-92031.2PpaIN.rst D Misc/NEWS.d/next/Core and Builtins/2022-04-30-04-26-01.gh-issue-92063.vHnhf6.rst D Misc/NEWS.d/next/Core and Builtins/2022-05-01-10-58-38.gh-issue-92112.lLJemu.rst D Misc/NEWS.d/next/Core and Builtins/2022-05-01-16-40-07.gh-issue-92114.5xTlLt.rst D Misc/NEWS.d/next/Core and Builtins/2022-05-02-12-40-18.gh-issue-91173.k_Dr6z.rst D Misc/NEWS.d/next/Core and Builtins/2022-05-02-17-12-49.gh-issue-92203.-igcjS.rst D Misc/NEWS.d/next/Core and Builtins/2022-05-03-14-55-40.gh-issue-92245.G17-5i.rst D Misc/NEWS.d/next/Core and Builtins/2022-05-04-11-37-20.bpo-43857.WuX8p3.rst D Misc/NEWS.d/next/Core and Builtins/2022-05-05-20-05-41.gh-issue-92345.lnN_RA.rst D Misc/NEWS.d/next/Core and Builtins/2022-05-06-02-29-53.gh-issue-89519.4OfkRE.rst D Misc/NEWS.d/next/Documentation/2022-01-23-20-44-53.bpo-26792.dQ1v1W.rst D Misc/NEWS.d/next/Documentation/2022-03-08-22-10-38.bpo-46962.FIVe9I.rst D Misc/NEWS.d/next/Documentation/2022-03-30-17-08-12.bpo-47115.R3wt3i.rst D Misc/NEWS.d/next/Documentation/2022-04-01-09-28-31.bpo-38668.j4mrqW.rst D Misc/NEWS.d/next/Documentation/2022-04-01-23-56-13.bpo-47189.Nss0Y3.rst D Misc/NEWS.d/next/Documentation/2022-04-06-11-53-41.bpo-36329.EVtAtK.rst D Misc/NEWS.d/next/Documentation/2022-04-10-20-28-20.bpo-44347.Q1m3DM.rst D Misc/NEWS.d/next/Documentation/2022-04-17-03-19-51.gh-issue-91298.NT9qHi.rst D Misc/NEWS.d/next/Documentation/2022-04-19-20-16-00.gh-issue-91547.LsNWER.rst D Misc/NEWS.d/next/Documentation/2022-04-23-00-22-54.gh-issue-91783.N09dRR.rst D Misc/NEWS.d/next/Documentation/2022-04-24-22-09-31.gh-issue-91888.kTjJLx.rst D Misc/NEWS.d/next/Library/2018-04-18-16-15-55.bpo-24905.jYqjYx.rst D Misc/NEWS.d/next/Library/2018-11-11-04-41-11.bpo-22276.Tt19TW.rst D Misc/NEWS.d/next/Library/2019-05-06-23-36-34.bpo-34975.eb49jr.rst D Misc/NEWS.d/next/Library/2019-06-22-11-01-45.bpo-36073.ED8mB9.rst D Misc/NEWS.d/next/Library/2020-02-22-12-02-11.bpo-39716.z2WhDQ.rst D Misc/NEWS.d/next/Library/2020-05-19-01-40-51.bpo-40676.yJfq1J.rst D Misc/NEWS.d/next/Library/2020-05-24-23-52-03.bpo-40617.lycF9q.rst D Misc/NEWS.d/next/Library/2020-10-19-08-50-41.bpo-42066.DsB-R6.rst D Misc/NEWS.d/next/Library/2020-12-24-19-11-53.bpo-38435.rEHTAR.rst D Misc/NEWS.d/next/Library/2021-02-14-20-55-53.bpo-43218.VZv2M4.rst D Misc/NEWS.d/next/Library/2021-04-16-17-32-44.bpo-43827.uJaXdP.rst D Misc/NEWS.d/next/Library/2021-08-17-21-41-39.bpo-44587.57OKSz.rst D Misc/NEWS.d/next/Library/2021-09-03-07-56-48.bpo-44863.udgz95.rst D Misc/NEWS.d/next/Library/2021-09-08-16-21-03.bpo-45138.yghUrK.rst D Misc/NEWS.d/next/Library/2021-11-14-01-35-04.bpo-26175.LNlOfI.rst D Misc/NEWS.d/next/Library/2021-12-14-13-15-41.bpo-45995.Am9pNL.rst D Misc/NEWS.d/next/Library/2021-12-14-21-19-04.bpo-46075.KDtcU-.rst D Misc/NEWS.d/next/Library/2022-01-17-16-53-30.bpo-46415.6wSYg-.rst D Misc/NEWS.d/next/Library/2022-01-27-14-41-55.bpo-46547.JMyYz9.rst D Misc/NEWS.d/next/Library/2022-01-27-14-46-15.bpo-44791.tR1JFG.rst D Misc/NEWS.d/next/Library/2022-01-29-00-23-00.bpo-46285.pt84qm.rst D Misc/NEWS.d/next/Library/2022-02-02-04-51-39.bpo-45639.N8XrGO.rst D Misc/NEWS.d/next/Library/2022-02-06-12-59-32.bpo-46053.sHFo3S.rst D Misc/NEWS.d/next/Library/2022-02-09-21-40-02.bpo-46696.nPXRno.rst D Misc/NEWS.d/next/Library/2022-02-11-23-11-35.bpo-46720.nY8spB.rst D Misc/NEWS.d/next/Library/2022-02-18-20-09-29.bpo-46787.juwWc0.rst D Misc/NEWS.d/next/Library/2022-03-02-04-25-58.bpo-44807.gHNC9J.rst D Misc/NEWS.d/next/Library/2022-03-06-18-15-32.bpo-45100.B_lHu0.rst D Misc/NEWS.d/next/Library/2022-03-21-13-50-07.bpo-46681.RRhopn.rst D Misc/NEWS.d/next/Library/2022-03-25-22-18-45.bpo-46841.NUEsXW.rst D Misc/NEWS.d/next/Library/2022-03-27-12-40-16.bpo-43323.9mFPuI.rst D Misc/NEWS.d/next/Library/2022-04-01-21-44-00.bpo-47135.TvkKB-.rst D Misc/NEWS.d/next/Library/2022-04-04-11-58-07.bpo-47211.W4GFkB.rst D Misc/NEWS.d/next/Library/2022-04-05-15-53-58.bpo-47227.1HWdp9.rst D Misc/NEWS.d/next/Library/2022-04-05-17-18-13.bpo-42012.zMocQz.rst D Misc/NEWS.d/next/Library/2022-04-06-11-54-53.bpo-47000.2nmAR1.rst D Misc/NEWS.d/next/Library/2022-04-06-18-01-28.bpo-47061.qoVTR9.rst D Misc/NEWS.d/next/Library/2022-04-07-20-32-47.bpo-47061.TOufgh.rst D Misc/NEWS.d/next/Library/2022-04-08-08-55-36.bpo-47087.Q5C3EI.rst D Misc/NEWS.d/next/Library/2022-04-08-14-30-53.bpo-47260.TtcNxI.rst D Misc/NEWS.d/next/Library/2022-04-10-08-39-44.bpo-91498.8oII92.rst D Misc/NEWS.d/next/Library/2022-04-10-11-11-33.gh-issue-91217.K82AuH.rst D Misc/NEWS.d/next/Library/2022-04-10-17-12-23.gh-issue-91230.T1d_fG.rst D Misc/NEWS.d/next/Library/2022-04-10-17-50-18.bpo-47000.JlQkFx.rst D Misc/NEWS.d/next/Library/2022-04-11-13-07-30.gh-issue-91276.Vttu15.rst D Misc/NEWS.d/next/Library/2022-04-11-16-13-26.gh-issue-91217.2rf8rc.rst D Misc/NEWS.d/next/Library/2022-04-11-17-04-38.gh-issue-91217.QVDLOq.rst D Misc/NEWS.d/next/Library/2022-04-12-19-08-13.gh-issue-91404.zjqYHo.rst D Misc/NEWS.d/next/Library/2022-04-12-19-42-20.gh-issue-91217.b9_Rz9.rst D Misc/NEWS.d/next/Library/2022-04-12-20-19-10.gh-issue-91217.acd4h9.rst D Misc/NEWS.d/next/Library/2022-04-14-00-59-01.gh-issue-69093.bmlMwI.rst D Misc/NEWS.d/next/Library/2022-04-14-01-00-31.gh-issue-69093.bmlMwI.rst D Misc/NEWS.d/next/Library/2022-04-14-13-11-37.gh-issue-88116.j_SybE.rst D Misc/NEWS.d/next/Library/2022-04-14-18-06-00.gh-issue-91526.cwfhSB.rst D Misc/NEWS.d/next/Library/2022-04-15-17-06-09.gh-issue-89022.DgdQCa.rst D Misc/NEWS.d/next/Library/2022-04-15-18-32-38.gh-issue-90622.WQjFDe.rst D Misc/NEWS.d/next/Library/2022-04-15-18-38-21.gh-issue-91575.fSyAxS.rst D Misc/NEWS.d/next/Library/2022-04-15-19-34-02.gh-issue-91487.2aqguF.rst D Misc/NEWS.d/next/Library/2022-04-15-20-56-31.gh-issue-74166.70KlvL.rst D Misc/NEWS.d/next/Library/2022-04-16-05-12-13.gh-issue-91595.CocJBv.rst D Misc/NEWS.d/next/Library/2022-04-16-09-33-14.gh-issue-91217.nt9JFs.rst D Misc/NEWS.d/next/Library/2022-04-16-11-39-59.bpo-47256.1cygyd.rst D Misc/NEWS.d/next/Library/2022-04-17-11-56-17.gh-issue-91217.McJre3.rst D Misc/NEWS.d/next/Library/2022-04-17-12-07-50.gh-issue-91217.TIvrsq.rst D Misc/NEWS.d/next/Library/2022-04-17-12-27-25.gh-issue-91616.gSQg69.rst D Misc/NEWS.d/next/Library/2022-04-17-12-27-46.gh-issue-91217.tNDWtK.rst D Misc/NEWS.d/next/Library/2022-04-17-12-32-40.gh-issue-91217.ms49Rg.rst D Misc/NEWS.d/next/Library/2022-04-17-12-38-31.gh-issue-91217.55714p.rst D Misc/NEWS.d/next/Library/2022-04-17-12-41-52.gh-issue-91217.3wnHSX.rst D Misc/NEWS.d/next/Library/2022-04-18-15-23-24.gh-issue-91670.6eyChw.rst D Misc/NEWS.d/next/Library/2022-04-18-16-31-33.gh-issue-90568.9kiU7o.rst D Misc/NEWS.d/next/Library/2022-04-18-18-55-21.gh-issue-91621.ACNlda.rst D Misc/NEWS.d/next/Library/2022-04-19-15-30-06.gh-issue-91231.AWy4Cs.rst D Misc/NEWS.d/next/Library/2022-04-19-17-30-17.gh-issue-91700.MRJi6m.rst D Misc/NEWS.d/next/Library/2022-04-19-19-50-10.gh-issue-90633.Youov0.rst D Misc/NEWS.d/next/Library/2022-04-20-09-49-33.gh-issue-91734.4Dj4Gy.rst D Misc/NEWS.d/next/Library/2022-04-20-18-47-27.gh-issue-90623.5fROpX.rst D Misc/NEWS.d/next/Library/2022-04-21-11-57-23.gh-issue-84461.S7dbt4.rst D Misc/NEWS.d/next/Library/2022-04-21-19-46-03.gh-issue-91760.zDtv1E.rst D Misc/NEWS.d/next/Library/2022-04-21-21-04-08.gh-issue-91217.BZVEki.rst D Misc/NEWS.d/next/Library/2022-04-21-21-06-54.gh-issue-91217.2cVma_.rst D Misc/NEWS.d/next/Library/2022-04-22-08-25-18.gh-issue-91821.XwMkj0.rst D Misc/NEWS.d/next/Library/2022-04-22-13-01-20.gh-issue-84461.rsCiTH.rst D Misc/NEWS.d/next/Library/2022-04-22-19-11-31.gh-issue-91827.6P3gOI.rst D Misc/NEWS.d/next/Library/2022-04-23-03-24-00.gh-issue-91832.TyLi65.rst D Misc/NEWS.d/next/Library/2022-04-23-08-06-36.gh-issue-91860.ityDjK.rst D Misc/NEWS.d/next/Library/2022-04-25-14-18-01.gh-issue-91910.kY-JR0.rst D Misc/NEWS.d/next/Library/2022-04-25-18-30-20.gh-issue-64783.HFtERN.rst D Misc/NEWS.d/next/Library/2022-04-25-21-33-48.gh-issue-91401._Jo4Bu.rst D Misc/NEWS.d/next/Library/2022-04-26-09-09-07.gh-issue-68966.roapI2.rst D Misc/NEWS.d/next/Library/2022-04-26-18-02-44.gh-issue-91928.V0YveU.rst D Misc/NEWS.d/next/Library/2022-04-26-19-01-13.bpo-47029.qkT42X.rst D Misc/NEWS.d/next/Library/2022-04-27-13-30-26.gh-issue-91954.cC7ga_.rst D Misc/NEWS.d/next/Library/2022-04-27-18-04-24.gh-issue-91952.9A4RXx.rst D Misc/NEWS.d/next/Library/2022-04-27-18-30-00.gh-issue-91984.LxAB11.rst D Misc/NEWS.d/next/Library/2022-04-27-19-45-58.gh-issue-91996.YEEIzk.rst D Misc/NEWS.d/next/Library/2022-04-28-18-45-58.gh-issue-88089.hu9kRk.rst D Misc/NEWS.d/next/Library/2022-04-29-16-41-08.gh-issue-87390.3LNNCv.rst D Misc/NEWS.d/next/Library/2022-04-29-18-15-23.gh-issue-92062.X2c_Rj.rst D Misc/NEWS.d/next/Library/2022-04-30-10-53-10.gh-issue-92049.5SEKoh.rst D Misc/NEWS.d/next/Library/2022-05-01-21-45-41.gh-issue-92128.Di7VbE.rst D Misc/NEWS.d/next/Library/2022-05-02-03-56-50.gh-issue-85984.RBivvc.rst D Misc/NEWS.d/next/Library/2022-05-02-09-09-47.gh-issue-91215.l1p7CJ.rst D Misc/NEWS.d/next/Library/2022-05-02-18-19-46.gh-issue-90887.zQsmfp.rst D Misc/NEWS.d/next/Library/2022-05-02-23-08-02.gh-issue-92118.9Mm9g4.rst D Misc/NEWS.d/next/Library/2022-05-03-12-11-27.gh-issue-80010.yG54RE.rst D Misc/NEWS.d/next/Library/2022-05-03-17-33-46.gh-issue-92210.csDOQM.rst D Misc/NEWS.d/next/Library/2022-05-03-19-06-38.gh-issue-67248.DK61Go.rst D Misc/NEWS.d/next/Library/2022-05-04-11-54-37.gh-issue-92301.eqjoYX.rst D Misc/NEWS.d/next/Library/2022-05-05-17-35-01.gh-issue-90997.UV5_s0.rst D Misc/NEWS.d/next/Library/2022-05-05-19-25-09.gh-issue-92356.uvxWdu.rst D Misc/NEWS.d/next/Library/2022-05-05-20-40-45.bpo-78157.IA_9na.rst D Misc/NEWS.d/next/Library/2022-05-05-22-46-52.gh-issue-92332.Fv9CJx.rst D Misc/NEWS.d/next/Library/2022-05-06-09-48-07.gh-issue-90997.4PmCgX.rst D Misc/NEWS.d/next/Library/2022-05-06-13-53-10.gh-issue-87901.NnkUVr.rst D Misc/NEWS.d/next/Security/2022-05-04-14-32-24.gh-issue-57684.HrlDrM.rst D Misc/NEWS.d/next/Tests/2022-01-24-21-31-09.bpo-29890.zEG-ra.rst D Misc/NEWS.d/next/Tests/2022-03-24-13-35-01.bpo-47109.FjKQCE.rst D Misc/NEWS.d/next/Tests/2022-04-06-10-16-27.bpo-40280.KT5Apg.rst D Misc/NEWS.d/next/Tests/2022-04-16-17-54-05.gh-issue-91607.FnXjtW.rst D Misc/NEWS.d/next/Tests/2022-04-22-19-00-00.gh-issue-91752.Ji27dd.rst D Misc/NEWS.d/next/Tests/2022-04-25-11-16-36.gh-issue-91904.13Uvrz.rst D Misc/NEWS.d/next/Tests/2022-05-02-20-15-54.gh-issue-84461.DhxllI.rst D Misc/NEWS.d/next/Tests/2022-05-02-20-57-04.gh-issue-92169.Xi4NGV.rst D Misc/NEWS.d/next/Tools-Demos/2022-04-14-18-11-46.gh-issue-91551.l_nNT-.rst D Misc/NEWS.d/next/Tools-Demos/2022-04-18-12-52-16.gh-issue-91575.fK1TEh.rst D Misc/NEWS.d/next/Tools-Demos/2022-04-20-14-26-14.gh-issue-91583.200qI0.rst D Misc/NEWS.d/next/Windows/2020-06-04-10-42-04.bpo-40859.isKSw7.rst D Misc/NEWS.d/next/Windows/2022-03-13-20-35-41.bpo-46785.Pnknyl.rst D Misc/NEWS.d/next/Windows/2022-03-28-07-01-31.bpo-46907.Ou3G6Z.rst D Misc/NEWS.d/next/Windows/2022-04-06-15-16-37.bpo-47239.B1HP7i.rst D Misc/NEWS.d/next/Windows/2022-04-27-19-36-56.bpo-46907.lfurlP.rst D Misc/NEWS.d/next/macOS/2022-05-05-06-21-39.bpo-46907.dkgFPk.rst M Lib/pydoc_data/topics.py diff --git a/Lib/pydoc_data/topics.py b/Lib/pydoc_data/topics.py index f3c79cab220a1..f3ceaadfad645 100644 --- a/Lib/pydoc_data/topics.py +++ b/Lib/pydoc_data/topics.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Autogenerated by Sphinx on Tue Apr 5 20:53:43 2022 +# Autogenerated by Sphinx on Fri May 6 23:53:34 2022 topics = {'assert': 'The "assert" statement\n' '**********************\n' '\n' @@ -6222,13 +6222,14 @@ '+-----------+------------------------------------------------------------+\n' '\n' 'The "\'z\'" option coerces negative zero floating-point ' - 'values to positive\n' - 'zero after rounding to the format precision. This option ' - 'is only valid for\n' - 'floating-point presentation types.\n' + 'values to\n' + 'positive zero after rounding to the format precision. This ' + 'option is\n' + 'only valid for floating-point presentation types.\n' '\n' 'Changed in version 3.11: Added the "\'z\'" option (see also ' - '**PEP 682**).\n' + '**PEP\n' + '682**).\n' '\n' 'The "\'#\'" option causes the ?alternate form? to be used ' 'for the\n' @@ -7329,12 +7330,12 @@ 'Examples:\n' '\n' ' import foo # foo imported and bound locally\n' - ' import foo.bar.baz # foo.bar.baz imported, foo bound ' - 'locally\n' - ' import foo.bar.baz as fbb # foo.bar.baz imported and bound as ' - 'fbb\n' - ' from foo.bar import baz # foo.bar.baz imported and bound as ' - 'baz\n' + ' import foo.bar.baz # foo, foo.bar, and foo.bar.baz ' + 'imported, foo bound locally\n' + ' import foo.bar.baz as fbb # foo, foo.bar, and foo.bar.baz ' + 'imported, foo.bar.baz bound as fbb\n' + ' from foo.bar import baz # foo, foo.bar, and foo.bar.baz ' + 'imported, foo.bar.baz bound as baz\n' ' from foo import attr # foo imported and foo.attr bound as ' 'attr\n' '\n' @@ -12062,9 +12063,13 @@ ' >>> "they\'re bill\'s friends from the UK".title()\n' ' "They\'Re Bill\'S Friends From The Uk"\n' '\n' - ' A workaround for apostrophes can be constructed using ' - 'regular\n' - ' expressions:\n' + ' The "string.capwords()" function does not have this ' + 'problem, as it\n' + ' splits words on spaces only.\n' + '\n' + ' Alternatively, a workaround for apostrophes can be ' + 'constructed\n' + ' using regular expressions:\n' '\n' ' >>> import re\n' ' >>> def titlecase(s):\n' @@ -12314,6 +12319,12 @@ '\n' '1. As in Standard C, up to three octal digits are accepted.\n' '\n' + ' Changed in version 3.11: Octal escapes with value larger than\n' + ' "0o377" produce a "DeprecationWarning". In a future Python ' + 'version\n' + ' they will be a "SyntaxWarning" and eventually a ' + '"SyntaxError".\n' + '\n' '2. Unlike in Standard C, exactly two hex digits are required.\n' '\n' '3. In a bytes literal, hexadecimal and octal escapes denote the ' @@ -13909,14 +13920,6 @@ 'unwise to use\n' 'them as dictionary keys.)\n' '\n' - 'Dictionaries can be created by placing a comma-separated ' - 'list of "key:\n' - 'value" pairs within braces, for example: "{\'jack\': 4098, ' - "'sjoerd':\n" - '4127}" or "{4098: \'jack\', 4127: \'sjoerd\'}", or by the ' - '"dict"\n' - 'constructor.\n' - '\n' 'class dict(**kwargs)\n' 'class dict(mapping, **kwargs)\n' 'class dict(iterable, **kwargs)\n' diff --git a/Misc/NEWS.d/3.11.0b1.rst b/Misc/NEWS.d/3.11.0b1.rst new file mode 100644 index 0000000000000..64c88c66ce50e --- /dev/null +++ b/Misc/NEWS.d/3.11.0b1.rst @@ -0,0 +1,2145 @@ +.. date: 2022-05-04-14-32-24 +.. gh-issue: 57684 +.. nonce: HrlDrM +.. release date: 2022-05-06 +.. section: Security + +Add the :option:`-P` command line option and the :envvar:`PYTHONSAFEPATH` +environment variable to not prepend a potentially unsafe path to +:data:`sys.path`. Patch by Victor Stinner. + +.. + +.. date: 2022-05-06-02-29-53 +.. gh-issue: 89519 +.. nonce: 4OfkRE +.. section: Core and Builtins + +Chaining classmethod descriptors (introduced in bpo-19072) is deprecated. It +can no longer be used to wrap other descriptors such as property(). The +core design of this feature was flawed, and it caused a number of downstream +problems. + +.. + +.. date: 2022-05-05-20-05-41 +.. gh-issue: 92345 +.. nonce: lnN_RA +.. section: Core and Builtins + +``pymain_run_python()`` now imports ``readline`` and ``rlcompleter`` before +sys.path is extended to include the current working directory of an +interactive interpreter. Non-interactive interpreters are not affected. + +.. + +.. bpo: 43857 +.. date: 2022-05-04-11-37-20 +.. nonce: WuX8p3 +.. section: Core and Builtins + +Improve the :exc:`AttributeError` message when deleting a missing attribute. +Patch by G?ry Ogam. + +.. + +.. date: 2022-05-03-14-55-40 +.. gh-issue: 92245 +.. nonce: G17-5i +.. section: Core and Builtins + +Make sure that PEP 523 is respected in all cases. In 3.11a7, specialization +may have prevented Python-to-Python calls respecting PEP 523. + +.. + +.. date: 2022-05-02-17-12-49 +.. gh-issue: 92203 +.. nonce: -igcjS +.. section: Core and Builtins + +Add a closure keyword-only parameter to exec(). It can only be specified +when exec-ing a code object that uses free variables. When specified, it +must be a tuple, with exactly the number of cell variables referenced by the +code object. closure has a default value of None, and it must be None if the +code object doesn't refer to any free variables. + +.. + +.. date: 2022-05-02-12-40-18 +.. gh-issue: 91173 +.. nonce: k_Dr6z +.. section: Core and Builtins + +Disable frozen modules in debug builds. Patch by Kumar Aditya. + +.. + +.. date: 2022-05-01-16-40-07 +.. gh-issue: 92114 +.. nonce: 5xTlLt +.. section: Core and Builtins + +Improve error message when subscript a type with ``__class_getitem__`` set +to ``None``. + +.. + +.. date: 2022-05-01-10-58-38 +.. gh-issue: 92112 +.. nonce: lLJemu +.. section: Core and Builtins + +Fix crash triggered by an evil custom ``mro()`` on a metaclass. + +.. + +.. date: 2022-04-30-04-26-01 +.. gh-issue: 92063 +.. nonce: vHnhf6 +.. section: Core and Builtins + +The ``PRECALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS`` instruction now ensures +methods are called only on objects of the correct type. + +.. + +.. date: 2022-04-29-02-50-41 +.. gh-issue: 92031 +.. nonce: 2PpaIN +.. section: Core and Builtins + +Deoptimize statically-allocated code objects during ``Py_FINALIZE()`` so +that future ``_PyCode_Quicken`` calls always start with unquickened code. + +.. + +.. date: 2022-04-28-23-37-30 +.. gh-issue: 92036 +.. nonce: GZJAC9 +.. section: Core and Builtins + +Fix a crash in subinterpreters related to the garbage collector. When a +subinterpreter is deleted, untrack all objects tracked by its GC. To prevent +a crash in deallocator functions expecting objects to be tracked by the GC, +leak a strong reference to these objects on purpose, so they are never +deleted and their deallocator functions are not called. Patch by Victor +Stinner. + +.. + +.. date: 2022-04-28-20-19-49 +.. gh-issue: 92032 +.. nonce: ef-UfM +.. section: Core and Builtins + +The interpreter can now autocomplete soft keywords, as of now ``match``, +``case``, and ``_`` (wildcard pattern) from :pep:`634`. + +.. + +.. date: 2022-04-27-10-36-43 +.. gh-issue: 87999 +.. nonce: YSPHfO +.. section: Core and Builtins + +The warning emitted by the Python parser for a numeric literal immediately +followed by keyword has been changed from deprecation warning to syntax +warning. + +.. + +.. date: 2022-04-26-05-05-32 +.. gh-issue: 91869 +.. nonce: ELbTXl +.. section: Core and Builtins + +Fix an issue where specialized opcodes with extended arguments could produce +incorrect tracing output or lead to assertion failures. + +.. + +.. date: 2022-04-23-22-08-34 +.. gh-issue: 91603 +.. nonce: GcWEkK +.. section: Core and Builtins + +Speed up :class:`types.UnionType` instantiation. Based on patch provided by +Yurii Karabas. + +.. + +.. date: 2022-04-21-16-15-24 +.. gh-issue: 89373 +.. nonce: A1jgLx +.. section: Core and Builtins + +If Python is built in debug mode, Python now ensures that deallocator +functions leave the current exception unchanged. Patch by Victor Stinner. + +.. + +.. date: 2022-04-20-14-43-37 +.. gh-issue: 91632 +.. nonce: cvUhsZ +.. section: Core and Builtins + +Fix a minor memory leak at exit: release the memory of the +:class:`generic_alias_iterator` type. Patch by Dong-hee Na. + +.. + +.. date: 2022-04-18-20-25-01 +.. gh-issue: 81548 +.. nonce: n3VYgp +.. section: Core and Builtins + +Octal escapes with value larger than ``0o377`` now produce a +:exc:`DeprecationWarning`. In a future Python version they will be a +:exc:`SyntaxWarning` and eventually a :exc:`SyntaxError`. + +.. + +.. bpo: 43950 +.. date: 2022-04-18-15-22-56 +.. nonce: qrTvWL +.. section: Core and Builtins + +Use a single compact table for line starts, ends and column offsets. Reduces +memory consumption for location info by half + +.. + +.. date: 2022-04-18-07-23-48 +.. gh-issue: 91102 +.. nonce: vm-6g1 +.. section: Core and Builtins + +Use Argument Clinic for :class:`EncodingMap`. Patch by Oleg Iarygin. + +.. + +.. date: 2022-04-18-02-45-40 +.. gh-issue: 91636 +.. nonce: 6DFdy_ +.. section: Core and Builtins + +Fixed a crash in a garbage-collection edge-case, in which a +``PyFunction_Type.tp_clear`` function could leave a python function object +in an inconsistent state. + +.. + +.. date: 2022-04-17-11-03-45 +.. gh-issue: 91603 +.. nonce: hYw1Lv +.. section: Core and Builtins + +Speed up :func:`isinstance` and :func:`issubclass` checks for +:class:`types.UnionType`. Patch by Yurii Karabas. + +.. + +.. date: 2022-04-17-02-55-38 +.. gh-issue: 91625 +.. nonce: 80CrC7 +.. section: Core and Builtins + +Fixed a bug in which adaptive opcodes ignored any preceding +``EXTENDED_ARG``\ s on specialization failure. + +.. + +.. date: 2022-04-16-21-54-31 +.. gh-issue: 78607 +.. nonce: _Y7bMm +.. section: Core and Builtins + +The LLTRACE special build now looks for the name ``__lltrace__`` defined in +module globals, rather than the name ``__ltrace__``, which had been +introduced as a typo. + +.. + +.. date: 2022-04-15-16-57-23 +.. gh-issue: 91576 +.. nonce: adoDj_ +.. section: Core and Builtins + +Speed up iteration of ascii strings by 50%. Patch by Kumar Aditya. + +.. + +.. date: 2022-04-13-22-03-04 +.. gh-issue: 89279 +.. nonce: -jAVxZ +.. section: Core and Builtins + +Improve interpreter performance on Windows by inlining a few specific +macros. + +.. + +.. date: 2022-04-13-11-15-09 +.. gh-issue: 91502 +.. nonce: 11YXHQ +.. section: Core and Builtins + +Add a new :c:func:`_PyFrame_IsEntryFrame` API function, to check if a +:c:type:`PyFrameObject` is an entry frame. Patch by Pablo Galindo. + +.. + +.. date: 2022-04-13-07-14-30 +.. gh-issue: 91266 +.. nonce: 6Vkzzt +.. section: Core and Builtins + +Refactor the ``bytearray`` strip methods ``strip``, ``lstrip`` and +``rstrip`` to use a common implementation. + +.. + +.. date: 2022-04-12-11-56-23 +.. gh-issue: 91479 +.. nonce: -dyGJX +.. section: Core and Builtins + +Replaced the ``__note__`` field of :exc:`BaseException` (added in an earlier +version of 3.11) with the final design of :pep:`678`. Namely, +:exc:`BaseException` gets an :meth:`add_note` method, and its ``__notes__`` +field is created when necessary. + +.. + +.. date: 2022-04-12-09-40-57 +.. gh-issue: 46055 +.. nonce: IPb1HA +.. section: Core and Builtins + +Speed up right shift of negative integers, by removing unnecessary creation +of temporaries. Original patch by Xinhang Xu, reworked by Mark Dickinson. + +.. + +.. date: 2022-04-12-00-44-14 +.. gh-issue: 91462 +.. nonce: t8oxyd +.. section: Core and Builtins + +Make the interpreter's low-level tracing (lltrace) feature output more +readable by displaying opcode names (rather than just numbers), and by +displaying stack contents before each opcode. + +.. + +.. date: 2022-04-11-18-44-19 +.. gh-issue: 89455 +.. nonce: d0qMYd +.. section: Core and Builtins + +Fixed an uninitialized bool value in the traceback printing code path that +was introduced by the initial bpo-45292 exception groups work. + +.. + +.. date: 2022-04-10-22-57-27 +.. gh-issue: 91421 +.. nonce: dHhv6U +.. section: Core and Builtins + +Fix a potential integer overflow in _Py_DecodeUTF8Ex. + +.. + +.. date: 2022-04-10-18-47-21 +.. gh-issue: 91428 +.. nonce: ZewV-M +.. section: Core and Builtins + +Add ``static const char *const _PyOpcode_OpName[256] = {...};`` to +``opcode.h`` for debug builds to assist in debugging the Python interpreter. +It is now more convenient to make various forms of debugging output more +human-readable by including opcode names rather than just the corresponding +decimal digits. + +.. + +.. bpo: 47120 +.. date: 2022-04-06-22-50-31 +.. nonce: mbfHs5 +.. section: Core and Builtins + +Make :opcode:`POP_JUMP_IF_TRUE`, :opcode:`POP_JUMP_IF_FALSE`, +:opcode:`POP_JUMP_IF_NONE` and :opcode:`POP_JUMP_IF_NOT_NONE` virtual, +mapping to new relative jump opcodes. + +.. + +.. bpo: 45317 +.. date: 2022-04-04-15-12-38 +.. nonce: UDLOt8 +.. section: Core and Builtins + +Add internal documentation explaining design of new (for 3.11) frame stack. + +.. + +.. bpo: 47197 +.. date: 2022-04-03-17-21-04 +.. nonce: Ji_c30 +.. section: Core and Builtins + +ctypes used to mishandle ``void`` return types, so that for instance a +function declared like ``ctypes.CFUNCTYPE(None, ctypes.c_int)`` would be +called with signature ``int f(int)`` instead of ``void f(int)``. Wasm +targets require function pointers to be called with the correct signatures +so this led to crashes. The problem is now fixed. + +.. + +.. bpo: 47120 +.. date: 2022-03-31-14-33-48 +.. nonce: 6S_uoU +.. section: Core and Builtins + +Make opcodes :opcode:`JUMP_IF_TRUE_OR_POP` and +:opcode:`JUMP_IF_FALSE_OR_POP` relative rather than absolute. + +.. + +.. bpo: 47177 +.. date: 2022-03-31-01-30-03 +.. nonce: fQqaov +.. section: Core and Builtins + +Replace the ``f_lasti`` member of the internal ``_PyInterpreterFrame`` +structure with a ``prev_instr`` pointer, which reduces overhead in the main +interpreter loop. The?``f_lasti`` attribute of Python-layer frame objects is +preserved for backward-compatibility. + +.. + +.. bpo: 46961 +.. date: 2022-03-13-08-23-17 +.. nonce: SgGCkG +.. section: Core and Builtins + +Integer mod/remainder operations, including the three-argument form of +:func:`pow`, now consistently return ints from the global small integer +cache when applicable. + +.. + +.. bpo: 46962 +.. date: 2022-03-08-21-59-57 +.. nonce: UomDfz +.. section: Core and Builtins + +Classes and functions that unconditionally declared their docstrings +ignoring the `--without-doc-strings` compilation flag no longer do so. + +The classes affected are :class:`ctypes.UnionType`, +:class:`pickle.PickleBuffer`, :class:`testcapi.RecursingInfinitelyError`, +and :class:`types.GenericAlias`. + +The functions affected are 24 methods in :mod:`ctypes`. + +Patch by Oleg Iarygin. + +.. + +.. bpo: 46942 +.. date: 2022-03-07-11-51-51 +.. nonce: 57obVi +.. section: Core and Builtins + +Use Argument Clinic for the :class:`types.MethodType` constructor. Patch by +Oleg Iarygin. + +.. + +.. bpo: 46764 +.. date: 2022-02-16-03-23-38 +.. nonce: wEY4bS +.. section: Core and Builtins + +Fix wrapping bound methods with @classmethod + +.. + +.. bpo: 43464 +.. date: 2022-02-13-21-53-29 +.. nonce: yupHjd +.. section: Core and Builtins + +Optimize :meth:`set.intersection` for non-set arguments. + +.. + +.. bpo: 46721 +.. date: 2022-02-11-17-16-30 +.. nonce: JkHaLF +.. section: Core and Builtins + +Optimize :meth:`set.issuperset` for non-set argument. + +.. + +.. bpo: 46509 +.. date: 2022-01-25-05-39-38 +.. nonce: ljrqrc +.. section: Core and Builtins + +Add type-specialized versions of the ``Py_DECREF()``, and use them for +``float``, ``int``, ``str``, ``bool``, and ``None`` to avoid pointer-chasing +at runtime where types are known at C compile time. + +.. + +.. bpo: 46045 +.. date: 2021-12-11-11-36-48 +.. nonce: sfThay +.. section: Core and Builtins + +Do not use POSIX semaphores on NetBSD + +.. + +.. bpo: 36819 +.. date: 2021-09-28-10-58-30 +.. nonce: cyV50C +.. section: Core and Builtins + +Fix crashes in built-in encoders with error handlers that return position +less or equal than the starting position of non-encodable characters. + +.. + +.. bpo: 34093 +.. date: 2018-07-14-16-58-00 +.. nonce: WaVD-f +.. section: Core and Builtins + +``marshal.dumps()`` uses ``FLAG_REF`` for all interned strings. This makes +output more deterministic and helps reproducible build. + +.. + +.. bpo: 26579 +.. date: 2017-07-23-11-28-45 +.. nonce: lpCY8R +.. section: Core and Builtins + +Added ``object.__getstate__`` which provides the default implementation of +the ``__getstate__()`` method. + +Copying and pickling instances of subclasses of builtin types bytearray, +set, frozenset, collections.OrderedDict, collections.deque, weakref.WeakSet, +and datetime.tzinfo now copies and pickles instance attributes implemented +as slots. + +.. + +.. date: 2022-05-06-13-53-10 +.. gh-issue: 87901 +.. nonce: NnkUVr +.. section: Library + +Add the *encoding* parameter to :func:`os.popen`. + +.. + +.. date: 2022-05-06-09-48-07 +.. gh-issue: 90997 +.. nonce: 4PmCgX +.. section: Library + +Fix an issue where :mod:`dis` utilities may interpret populated inline cache +entries as valid instructions. + +.. + +.. date: 2022-05-05-22-46-52 +.. gh-issue: 92332 +.. nonce: Fv9CJx +.. section: Library + +Deprecate :class:`typing.Text` (removal of the class is currently not +planned). Patch by Alex Waygood. + +.. + +.. bpo: 78157 +.. date: 2022-05-05-20-40-45 +.. nonce: IA_9na +.. section: Library + +Deprecate nested classes in enum definitions becoming members -- in 3.13 +they will be normal classes; add `member` and `nonmember` functions to allow +control over results now. + +.. + +.. date: 2022-05-05-19-25-09 +.. gh-issue: 92356 +.. nonce: uvxWdu +.. section: Library + +Fixed a performance regression in ctypes function calls. + +.. + +.. date: 2022-05-05-17-35-01 +.. gh-issue: 90997 +.. nonce: UV5_s0 +.. section: Library + +Show the actual named values stored in inline caches when +``show_caches=True`` is passed to :mod:`dis` utilities. + +.. + +.. date: 2022-05-04-11-54-37 +.. gh-issue: 92301 +.. nonce: eqjoYX +.. section: Library + +Prefer ``close_range()`` to iterating over procfs for file descriptor +closing in :mod:`subprocess` for better performance. + +.. + +.. date: 2022-05-03-19-06-38 +.. gh-issue: 67248 +.. nonce: DK61Go +.. section: Library + +Sort the miscellaneous topics in Cmd.do_help() + +.. + +.. date: 2022-05-03-17-33-46 +.. gh-issue: 92210 +.. nonce: csDOQM +.. section: Library + +Port ``socket.__init__`` to Argument Clinic. Patch by Cinder. + +.. + +.. date: 2022-05-03-12-11-27 +.. gh-issue: 80010 +.. nonce: yG54RE +.. section: Library + +Add support for generalized ISO 8601 parsing to +:meth:`datetime.datetime.fromisoformat`, :meth:`datetime.date.fromisoformat` +and :meth:`datetime.time.fromisoformat`. Patch by Paul Ganssle. + +.. + +.. date: 2022-05-02-23-08-02 +.. gh-issue: 92118 +.. nonce: 9Mm9g4 +.. section: Library + +Fix a 3.11 regression in :func:`~contextlib.contextmanager`, which caused it +to propagate exceptions with incorrect tracebacks. + +.. + +.. date: 2022-05-02-18-19-46 +.. gh-issue: 90887 +.. nonce: zQsmfp +.. section: Library + +Adding ``COPYFILE_STAT``, ``COPYFILE_ACL`` and ``COPYFILE_XATTR`` constants +for :func:`os.fcopyfile` available in macOs. + +.. + +.. date: 2022-05-02-09-09-47 +.. gh-issue: 91215 +.. nonce: l1p7CJ +.. section: Library + +For @dataclass, add weakref_slot. Default is False. If True, and if +slots=True, add a slot named "__weakref__", which will allow instances to be +weakref'd. Contributed by Eric V. Smith + +.. + +.. date: 2022-05-02-03-56-50 +.. gh-issue: 85984 +.. nonce: RBivvc +.. section: Library + +New function os.login_tty() for Unix. + +.. + +.. date: 2022-05-01-21-45-41 +.. gh-issue: 92128 +.. nonce: Di7VbE +.. section: Library + +Add :meth:`~object.__class_getitem__` to :class:`logging.LoggerAdapter` and +:class:`logging.StreamHandler`, allowing them to be parameterized at +runtime. Patch by Alex Waygood. + +.. + +.. date: 2022-04-30-10-53-10 +.. gh-issue: 92049 +.. nonce: 5SEKoh +.. section: Library + +Forbid pickling constants ``re._constants.SUCCESS`` etc. Previously, +pickling did not fail, but the result could not be unpickled. + +.. + +.. date: 2022-04-29-18-15-23 +.. gh-issue: 92062 +.. nonce: X2c_Rj +.. section: Library + +:class:`inspect.Parameter` now raises :exc:`ValueError` if ``name`` is a +keyword, in addition to the existing check that it is an identifier. + +.. + +.. date: 2022-04-29-16-41-08 +.. gh-issue: 87390 +.. nonce: 3LNNCv +.. section: Library + +Add an ``__unpacked__`` attribute to :class:`types.GenericAlias`. Patch by +Jelle Zijlstra. + +.. + +.. date: 2022-04-28-18-45-58 +.. gh-issue: 88089 +.. nonce: hu9kRk +.. section: Library + +Add support for generic :class:`typing.NamedTuple`. + +.. + +.. date: 2022-04-27-19-45-58 +.. gh-issue: 91996 +.. nonce: YEEIzk +.. section: Library + +New http.HTTPMethod enum to represent all the available HTTP request methods +in a convenient way + +.. + +.. date: 2022-04-27-18-30-00 +.. gh-issue: 91984 +.. nonce: LxAB11 +.. section: Library + +Modified test strings in test_argparse.py to not contain trailing spaces +before end of line. + +.. + +.. date: 2022-04-27-18-04-24 +.. gh-issue: 91952 +.. nonce: 9A4RXx +.. section: Library + +Add ``encoding="locale"`` support to :meth:`TextIOWrapper.reconfigure`. + +.. + +.. date: 2022-04-27-13-30-26 +.. gh-issue: 91954 +.. nonce: cC7ga_ +.. section: Library + +Add *encoding* and *errors* arguments to :func:`subprocess.getoutput` and +:func:`subprocess.getstatusoutput`. + +.. + +.. bpo: 47029 +.. date: 2022-04-26-19-01-13 +.. nonce: qkT42X +.. section: Library + +Always close the read end of the pipe used by :class:`multiprocessing.Queue` +*after* the last write of buffered data to the write end of the pipe to +avoid :exc:`BrokenPipeError` at garbage collection and at +:meth:`multiprocessing.Queue.close` calls. Patch by G?ry Ogam. + +.. + +.. date: 2022-04-26-18-02-44 +.. gh-issue: 91928 +.. nonce: V0YveU +.. section: Library + +Add `datetime.UTC` alias for `datetime.timezone.utc`. + +Patch by Kabir Kwatra. + +.. + +.. date: 2022-04-26-09-09-07 +.. gh-issue: 68966 +.. nonce: roapI2 +.. section: Library + +The :mod:`mailcap` module is now deprecated and will be removed in Python +3.13. See :pep:`594` for the rationale and the :mod:`mimetypes` module for +an alternative. Patch by Victor Stinner. + +.. + +.. date: 2022-04-25-21-33-48 +.. gh-issue: 91401 +.. nonce: _Jo4Bu +.. section: Library + +Provide a way to disable :mod:`subprocess` use of ``vfork()`` just in case +it is ever needed and document the existing mechanism for ``posix_spawn()``. + +.. + +.. date: 2022-04-25-18-30-20 +.. gh-issue: 64783 +.. nonce: HFtERN +.. section: Library + +Fix :data:`signal.NSIG` value on FreeBSD to accept signal numbers greater +than 32, like :data:`signal.SIGRTMIN` and :data:`signal.SIGRTMAX`. Patch by +Victor Stinner. + +.. + +.. date: 2022-04-25-14-18-01 +.. gh-issue: 91910 +.. nonce: kY-JR0 +.. section: Library + +Add missing f prefix to f-strings in error messages from the +:mod:`multiprocessing` and :mod:`asyncio` modules. + +.. + +.. date: 2022-04-23-08-06-36 +.. gh-issue: 91860 +.. nonce: ityDjK +.. section: Library + +Add :func:`typing.dataclass_transform`, implementing :pep:`681`. Patch by +Jelle Zijlstra. + +.. + +.. date: 2022-04-23-03-24-00 +.. gh-issue: 91832 +.. nonce: TyLi65 +.. section: Library + +Add ``required`` attribute to :class:`argparse.Action` repr output. + +.. + +.. date: 2022-04-22-19-11-31 +.. gh-issue: 91827 +.. nonce: 6P3gOI +.. section: Library + +In the :mod:`tkinter` module add method ``info_patchlevel()`` which returns +the exact version of the Tcl library as a named tuple similar to +:data:`sys.version_info`. + +.. + +.. date: 2022-04-22-13-01-20 +.. gh-issue: 84461 +.. nonce: rsCiTH +.. section: Library + +Add :option:`--enable-wasm-pthreads` to enable pthreads support for WASM +builds. ``Emscripten/node`` no longer has threading enabled by default. +Include additional file systems. + +.. + +.. date: 2022-04-22-08-25-18 +.. gh-issue: 91821 +.. nonce: XwMkj0 +.. section: Library + +Fix unstable ``test_from_tuple`` test in ``test_decimal.py``. + +.. + +.. date: 2022-04-21-21-06-54 +.. gh-issue: 91217 +.. nonce: 2cVma_ +.. section: Library + +Deprecate the xdrlib module. + +.. + +.. date: 2022-04-21-21-04-08 +.. gh-issue: 91217 +.. nonce: BZVEki +.. section: Library + +Deprecate the uu module. + +.. + +.. date: 2022-04-21-19-46-03 +.. gh-issue: 91760 +.. nonce: zDtv1E +.. section: Library + +More strict rules will be applied for numerical group references and group +names in regular expressions. For now, a deprecation warning is emitted for +group references and group names which will be errors in future Python +versions. + +.. + +.. date: 2022-04-21-11-57-23 +.. gh-issue: 84461 +.. nonce: S7dbt4 +.. section: Library + +Add provisional :data:`sys._emscripten_info` named tuple with build-time and +run-time information about Emscripten platform. + +.. + +.. date: 2022-04-20-18-47-27 +.. gh-issue: 90623 +.. nonce: 5fROpX +.. section: Library + +:func:`signal.raise_signal` and :func:`os.kill` now check immediately for +pending signals. Patch by Victor Stinner. + +.. + +.. date: 2022-04-20-09-49-33 +.. gh-issue: 91734 +.. nonce: 4Dj4Gy +.. section: Library + +Fix OSS audio support on Solaris. + +.. + +.. date: 2022-04-19-19-50-10 +.. gh-issue: 90633 +.. nonce: Youov0 +.. section: Library + +Include the passed value in the exception thrown by +:func:`typing.assert_never`. Patch by Jelle Zijlstra. + +.. + +.. date: 2022-04-19-17-30-17 +.. gh-issue: 91700 +.. nonce: MRJi6m +.. section: Library + +Compilation of regular expression containing a conditional expression +``(?(group)...)`` now raises an appropriate :exc:`re.error` if the group +number refers to not defined group. Previously an internal RuntimeError was +raised. + +.. + +.. date: 2022-04-19-15-30-06 +.. gh-issue: 91231 +.. nonce: AWy4Cs +.. section: Library + +Add an optional keyword *shutdown_timeout* parameter to the +:class:`multiprocessing.BaseManager` constructor. Kill the process if +terminate() takes longer than the timeout. Patch by Victor Stinner. + +.. + +.. date: 2022-04-18-18-55-21 +.. gh-issue: 91621 +.. nonce: ACNlda +.. section: Library + +Fix :func:`typing.get_type_hints` for :class:`collections.abc.Callable`. +Patch by Shantanu Jain. + +.. + +.. date: 2022-04-18-16-31-33 +.. gh-issue: 90568 +.. nonce: 9kiU7o +.. section: Library + +Parsing ``\N`` escapes of Unicode Named Character Sequences in a +:mod:`regular expression ` raises now :exc:`re.error` instead of +``TypeError``. + +.. + +.. date: 2022-04-18-15-23-24 +.. gh-issue: 91670 +.. nonce: 6eyChw +.. section: Library + +Remove deprecated ``SO`` config variable in :mod:`sysconfig`. + +.. + +.. date: 2022-04-17-12-41-52 +.. gh-issue: 91217 +.. nonce: 3wnHSX +.. section: Library + +Deprecate the telnetlib module. + +.. + +.. date: 2022-04-17-12-38-31 +.. gh-issue: 91217 +.. nonce: 55714p +.. section: Library + +Deprecate the sunau module. + +.. + +.. date: 2022-04-17-12-32-40 +.. gh-issue: 91217 +.. nonce: ms49Rg +.. section: Library + +Deprecate the spwd module. + +.. + +.. date: 2022-04-17-12-27-46 +.. gh-issue: 91217 +.. nonce: tNDWtK +.. section: Library + +Deprecate the sndhdr module, as well as inline needed functionality for +``email.mime.MIMEAudio``. + +.. + +.. date: 2022-04-17-12-27-25 +.. gh-issue: 91616 +.. nonce: gSQg69 +.. section: Library + +:mod:`re` module, fix :meth:`~re.Pattern.fullmatch` mismatch when using +Atomic Grouping or Possessive Quantifiers. + +.. + +.. date: 2022-04-17-12-07-50 +.. gh-issue: 91217 +.. nonce: TIvrsq +.. section: Library + +Deprecate the 'pipes' module. + +.. + +.. date: 2022-04-17-11-56-17 +.. gh-issue: 91217 +.. nonce: McJre3 +.. section: Library + +Deprecate the ossaudiodev module. + +.. + +.. bpo: 47256 +.. date: 2022-04-16-11-39-59 +.. nonce: 1cygyd +.. section: Library + +:mod:`re` module, limit the maximum capturing group to 1,073,741,823 in +64-bit build, this increases the depth of backtracking. + +.. + +.. date: 2022-04-16-09-33-14 +.. gh-issue: 91217 +.. nonce: nt9JFs +.. section: Library + +Deprecate the nis module. + +.. + +.. date: 2022-04-16-05-12-13 +.. gh-issue: 91595 +.. nonce: CocJBv +.. section: Library + +Fix the comparison of character and integer inside +:func:`Tools.gdb.libpython.write_repr`. Patch by Yu Liu. + +.. + +.. date: 2022-04-15-20-56-31 +.. gh-issue: 74166 +.. nonce: 70KlvL +.. section: Library + +Add option to raise all errors from :meth:`~socket.create_connection` in an +:exc:`ExceptionGroup` when it fails to create a connection. The default +remains to raise only the last error that had occurred when multiple +addresses were tried. + +.. + +.. date: 2022-04-15-19-34-02 +.. gh-issue: 91487 +.. nonce: 2aqguF +.. section: Library + +Optimize asyncio UDP speed, over 100 times faster when transferring a large +file. + +.. + +.. date: 2022-04-15-18-38-21 +.. gh-issue: 91575 +.. nonce: fSyAxS +.. section: Library + +Update case-insensitive matching in the :mod:`re` module to the latest +Unicode version. + +.. + +.. date: 2022-04-15-18-32-38 +.. gh-issue: 90622 +.. nonce: WQjFDe +.. section: Library + +In ``concurrent.futures.process.ProcessPoolExecutor`` disallow the "fork" +multiprocessing start method when the new ``max_tasks_per_child`` feature is +used as the mix of threads+fork can hang the child processes. Default to +using the safe "spawn" start method in that circumstance if no +``mp_context`` was supplied. + +.. + +.. date: 2022-04-15-17-06-09 +.. gh-issue: 89022 +.. nonce: DgdQCa +.. section: Library + +In :mod:`sqlite3`, ``SQLITE_MISUSE`` result codes are now mapped to +:exc:`~sqlite3.InterfaceError` instead of :exc:`~sqlite3.ProgrammingError`. +Also, more accurate exceptions are raised when binding parameters fail. +Patch by Erlend E. Aasland. + +.. + +.. date: 2022-04-14-18-06-00 +.. gh-issue: 91526 +.. nonce: cwfhSB +.. section: Library + +Stop calling ``os.device_encoding(file.fileno())`` in +:class:`TextIOWrapper`. It was complex, never documented, and didn't work +for most cases. (Patch by Inada Naoki.) + +.. + +.. date: 2022-04-14-13-11-37 +.. gh-issue: 88116 +.. nonce: j_SybE +.. section: Library + +Change the frame-related functions in the :mod:`inspect` module to return a +regular object (that is backwards compatible with the old tuple-like +interface) that include the extended :pep:`657` position information (end +line number, column and end column). The affected functions are: +:func:`inspect.getframeinfo`, :func:`inspect.getouterframes`, +:func:`inspect.getinnerframes`, :func:`inspect.stack` and +:func:`inspect.trace`. Patch by Pablo Galindo. + +.. + +.. date: 2022-04-14-01-00-31 +.. gh-issue: 69093 +.. nonce: bmlMwI +.. section: Library + +Add indexing and slicing support to :class:`sqlite3.Blob`. Patch by Aviv +Palivoda and Erlend E. Aasland. + +.. + +.. date: 2022-04-14-00-59-01 +.. gh-issue: 69093 +.. nonce: bmlMwI +.. section: Library + +Add :term:`context manager` support to :class:`sqlite3.Blob`. Patch by Aviv +Palivoda and Erlend E. Aasland. + +.. + +.. date: 2022-04-12-20-19-10 +.. gh-issue: 91217 +.. nonce: acd4h9 +.. section: Library + +Deprecate nntplib. + +.. + +.. date: 2022-04-12-19-42-20 +.. gh-issue: 91217 +.. nonce: b9_Rz9 +.. section: Library + +Deprecate msilib. + +.. + +.. date: 2022-04-12-19-08-13 +.. gh-issue: 91404 +.. nonce: zjqYHo +.. section: Library + +Improve the performance of :mod:`re` matching by using computed gotos (or +"threaded code") on supported platforms and removing expensive pointer +indirections. + +.. + +.. date: 2022-04-11-17-04-38 +.. gh-issue: 91217 +.. nonce: QVDLOq +.. section: Library + +Deprecate the imghdr module. + +.. + +.. date: 2022-04-11-16-13-26 +.. gh-issue: 91217 +.. nonce: 2rf8rc +.. section: Library + +Deprecate the crypt module. + +.. + +.. date: 2022-04-11-13-07-30 +.. gh-issue: 91276 +.. nonce: Vttu15 +.. section: Library + +Make space for longer opcodes in :mod:`dis` output. + +.. + +.. bpo: 47000 +.. date: 2022-04-10-17-50-18 +.. nonce: JlQkFx +.. section: Library + +Make :class:`TextIOWrapper` uses locale encoding when ``encoding="locale"`` +is specified even in UTF-8 mode. + +.. + +.. date: 2022-04-10-17-12-23 +.. gh-issue: 91230 +.. nonce: T1d_fG +.. section: Library + +:func:`warnings.catch_warnings` now accepts arguments for +:func:`warnings.simplefilter`, providing a more concise way to locally +ignore warnings or convert them to errors. + +.. + +.. date: 2022-04-10-11-11-33 +.. gh-issue: 91217 +.. nonce: K82AuH +.. section: Library + +Deprecate the chunk module. + +.. + +.. bpo: 91498 +.. date: 2022-04-10-08-39-44 +.. nonce: 8oII92 +.. section: Library + +Add the ``TCP_CONNECTION_INFO`` option (available on macOS) to +:mod:`socket`. + +.. + +.. bpo: 47260 +.. date: 2022-04-08-14-30-53 +.. nonce: TtcNxI +.. section: Library + +Fix ``os.closerange()`` potentially being a no-op in a Linux seccomp +sandbox. + +.. + +.. bpo: 47087 +.. date: 2022-04-08-08-55-36 +.. nonce: Q5C3EI +.. section: Library + +Implement ``typing.Required`` and ``typing.NotRequired`` (:pep:`655`). Patch +by David Foster and Jelle Zijlstra. + +.. + +.. bpo: 47061 +.. date: 2022-04-07-20-32-47 +.. nonce: TOufgh +.. section: Library + +Deprecate cgi and cgitb. + +.. + +.. bpo: 47061 +.. date: 2022-04-06-18-01-28 +.. nonce: qoVTR9 +.. section: Library + +Deprecate audioop. + +.. + +.. bpo: 47000 +.. date: 2022-04-06-11-54-53 +.. nonce: 2nmAR1 +.. section: Library + +Add :func:`locale.getencoding` to get the current locale encoding. It is +similar to ``locale.getpreferredencoding(False)`` but ignores the +:ref:`Python UTF-8 Mode `. + +.. + +.. bpo: 42012 +.. date: 2022-04-05-17-18-13 +.. nonce: zMocQz +.. section: Library + +Add :mod:`wsgiref.types`, containing WSGI-specific types for static type +checking. + +.. + +.. bpo: 47227 +.. date: 2022-04-05-15-53-58 +.. nonce: 1HWdp9 +.. section: Library + +Suppress expression chaining for more :mod:`re` parsing errors. + +.. + +.. bpo: 47211 +.. date: 2022-04-04-11-58-07 +.. nonce: W4GFkB +.. section: Library + +Remove undocumented and never working function ``re.template()`` and flag +``re.TEMPLATE``. + +.. + +.. bpo: 47135 +.. date: 2022-04-01-21-44-00 +.. nonce: TvkKB- +.. section: Library + +:meth:`decimal.localcontext` now accepts context attributes via keyword +arguments + +.. + +.. bpo: 43323 +.. date: 2022-03-27-12-40-16 +.. nonce: 9mFPuI +.. section: Library + +Fix errors in the :mod:`email` module if the charset itself contains +undecodable/unencodable characters. + +.. + +.. bpo: 46841 +.. date: 2022-03-25-22-18-45 +.. nonce: NUEsXW +.. section: Library + +Disassembly of quickened code. + +.. + +.. bpo: 46681 +.. date: 2022-03-21-13-50-07 +.. nonce: RRhopn +.. section: Library + +Forward gzip.compress() compresslevel to zlib. + +.. + +.. bpo: 45100 +.. date: 2022-03-06-18-15-32 +.. nonce: B_lHu0 +.. section: Library + +Add :func:`typing.get_overloads` and :func:`typing.clear_overloads`. Patch +by Jelle Zijlstra. + +.. + +.. bpo: 44807 +.. date: 2022-03-02-04-25-58 +.. nonce: gHNC9J +.. section: Library + +:class:`typing.Protocol` no longer silently replaces :meth:`__init__` +methods defined on subclasses. Patch by Adrian Garcia Badaracco. + +.. + +.. bpo: 46787 +.. date: 2022-02-18-20-09-29 +.. nonce: juwWc0 +.. section: Library + +Fix :class:`concurrent.futures.ProcessPoolExecutor` exception memory leak + +.. + +.. bpo: 46720 +.. date: 2022-02-11-23-11-35 +.. nonce: nY8spB +.. section: Library + +Add support for path-like objects to :func:`multiprocessing.set_executable` +for Windows to be on a par with Unix-like systems. Patch by G?ry Ogam. + +.. + +.. bpo: 46696 +.. date: 2022-02-09-21-40-02 +.. nonce: nPXRno +.. section: Library + +Add ``SO_INCOMING_CPU`` constant to :mod:`socket`. + +.. + +.. bpo: 46053 +.. date: 2022-02-06-12-59-32 +.. nonce: sHFo3S +.. section: Library + +Fix OSS audio support on NetBSD. + +.. + +.. bpo: 45639 +.. date: 2022-02-02-04-51-39 +.. nonce: N8XrGO +.. section: Library + +``image/avif`` and ``image/webp`` were added to :mod:`mimetypes`. + +.. + +.. bpo: 46285 +.. date: 2022-01-29-00-23-00 +.. nonce: pt84qm +.. section: Library + +Add command-line option ``-p``/``--protocol`` to module :mod:`http.server` +which specifies the HTTP version to which the server is conformant (HTTP/1.1 +conformant servers can now be run from the command-line interface of module +:mod:`http.server`). Patch by G?ry Ogam. + +.. + +.. bpo: 44791 +.. date: 2022-01-27-14-46-15 +.. nonce: tR1JFG +.. section: Library + +Accept ellipsis as the last argument of :data:`typing.Concatenate`. + +.. + +.. bpo: 46547 +.. date: 2022-01-27-14-41-55 +.. nonce: JMyYz9 +.. section: Library + +Remove variables leaking into ``pydoc.Helper`` class namespace. + +.. + +.. bpo: 46415 +.. date: 2022-01-17-16-53-30 +.. nonce: 6wSYg- +.. section: Library + +Fix ipaddress.ip_{address,interface,network} raising TypeError instead of +ValueError if given invalid tuple as address parameter. + +.. + +.. bpo: 46075 +.. date: 2021-12-14-21-19-04 +.. nonce: KDtcU- +.. section: Library + +``CookieJar`` with ``DefaultCookiePolicy`` now can process cookies from +localhost with domain=localhost explicitly specified in Set-Cookie header. + +.. + +.. bpo: 45995 +.. date: 2021-12-14-13-15-41 +.. nonce: Am9pNL +.. section: Library + +Add a "z" option to the string formatting specification that coerces +negative zero floating-point values to positive zero after rounding to the +format precision. Contributed by John Belmonte. + +.. + +.. bpo: 26175 +.. date: 2021-11-14-01-35-04 +.. nonce: LNlOfI +.. section: Library + +Fully implement the :class:`io.BufferedIOBase` or :class:`io.TextIOBase` +interface for :class:`tempfile.SpooledTemporaryFile` objects. This lets them +work correctly with higher-level layers (like compression modules). Patch by +Carey Metcalfe. + +.. + +.. bpo: 45138 +.. date: 2021-09-08-16-21-03 +.. nonce: yghUrK +.. section: Library + +Fix a regression in the :mod:`sqlite3` trace callback where bound parameters +were not expanded in the passed statement string. The regression was +introduced in Python 3.10 by :issue:`40318`. Patch by Erlend E. Aasland. + +.. + +.. bpo: 44863 +.. date: 2021-09-03-07-56-48 +.. nonce: udgz95 +.. section: Library + +Allow :class:`~typing.TypedDict` subclasses to also include +:class:`~typing.Generic` as a base class in class based syntax. Thereby +allowing the user to define a generic ``TypedDict``, just like a +user-defined generic but with ``TypedDict`` semantics. + +.. + +.. bpo: 44587 +.. date: 2021-08-17-21-41-39 +.. nonce: 57OKSz +.. section: Library + +Fix BooleanOptionalAction to not automatically add a default string. If a +default string is desired, use a formatter to add it. + +.. + +.. bpo: 43827 +.. date: 2021-04-16-17-32-44 +.. nonce: uJaXdP +.. section: Library + +All positional-or-keyword parameters to ``ABCMeta.__new__`` are now +positional-only to avoid conflicts with keyword arguments to be passed to +:meth:`__init_subclass__`. + +.. + +.. bpo: 43218 +.. date: 2021-02-14-20-55-53 +.. nonce: VZv2M4 +.. section: Library + +Prevent creation of a venv whose path contains the PATH separator. This +could affect the usage of the activate script. Patch by Dustin Rodrigues. + +.. + +.. bpo: 38435 +.. date: 2020-12-24-19-11-53 +.. nonce: rEHTAR +.. section: Library + +Add a ``process_group`` parameter to :class:`subprocess.Popen` to help move +more things off of the unsafe ``preexec_fn`` parameter. + +.. + +.. bpo: 42066 +.. date: 2020-10-19-08-50-41 +.. nonce: DsB-R6 +.. section: Library + +Fix cookies getting sorted in :func:`CookieJar.__iter__` which is an extra +behavior and not mentioned in RFC 2965 or Netscape cookie protocol. Now the +cookies in ``CookieJar`` follows the order of the ``Set-Cookie`` header. +Patch by Iman Kermani. + +.. + +.. bpo: 40617 +.. date: 2020-05-24-23-52-03 +.. nonce: lycF9q +.. section: Library + +Add :meth:`~sqlite3.Connection.create_window_function` to +:class:`sqlite3.Connection` for creating aggregate window functions. Patch +by Erlend E. Aasland. + +.. + +.. bpo: 40676 +.. date: 2020-05-19-01-40-51 +.. nonce: yJfq1J +.. section: Library + +Convert :mod:`csv` to use Argument Clinic for :func:`csv.field_size_limit`, +:func:`csv.get_dialect`, :func:`csv.unregister_dialect` and +:func:`csv.list_dialects`. + +.. + +.. bpo: 39716 +.. date: 2020-02-22-12-02-11 +.. nonce: z2WhDQ +.. section: Library + +Raise an ArgumentError when the same subparser name is added twice to an +`argparse.ArgumentParser`. This is consistent with the (default) behavior +when the same option string is added twice to an ArgumentParser. + +.. + +.. bpo: 36073 +.. date: 2019-06-22-11-01-45 +.. nonce: ED8mB9 +.. section: Library + +Raise :exc:`~sqlite3.ProgrammingError` instead of segfaulting on recursive +usage of cursors in :mod:`sqlite3` converters. Patch by Sergey Fedoseev. + +.. + +.. bpo: 34975 +.. date: 2019-05-06-23-36-34 +.. nonce: eb49jr +.. section: Library + +Adds a ``start_tls()`` method to :class:`~asyncio.streams.StreamWriter`, +which upgrades the connection with TLS using the given +:class:`~ssl.SSLContext`. + +.. + +.. bpo: 22276 +.. date: 2018-11-11-04-41-11 +.. nonce: Tt19TW +.. section: Library + +:class:`~pathlib.Path` methods :meth:`~pathlib.Path.glob` and +:meth:`~pathlib.Path.rglob` return only directories if *pattern* ends with a +pathname components separator (``/`` or :data:`~os.sep`). Patch by Eisuke +Kawashima. + +.. + +.. bpo: 24905 +.. date: 2018-04-18-16-15-55 +.. nonce: jYqjYx +.. section: Library + +Add :meth:`~sqlite3.Connection.blobopen` to :class:`sqlite3.Connection`. +:class:`sqlite3.Blob` allows incremental I/O operations on blobs. Patch by +Aviv Palivoda and Erlend E. Aasland. + +.. + +.. date: 2022-04-24-22-09-31 +.. gh-issue: 91888 +.. nonce: kTjJLx +.. section: Documentation + +Add a new `gh` role to the documentation to link to GitHub issues. + +.. + +.. date: 2022-04-23-00-22-54 +.. gh-issue: 91783 +.. nonce: N09dRR +.. section: Documentation + +Document security issues concerning the use of the function +:meth:`shutil.unpack_archive` + +.. + +.. date: 2022-04-19-20-16-00 +.. gh-issue: 91547 +.. nonce: LsNWER +.. section: Documentation + +Remove "Undocumented modules" page. + +.. + +.. date: 2022-04-17-03-19-51 +.. gh-issue: 91298 +.. nonce: NT9qHi +.. section: Documentation + +In ``importlib.resources.abc``, refined the documentation of the Traversable +Protocol, applying changes from importlib_resources 5.7.1. + +.. + +.. bpo: 44347 +.. date: 2022-04-10-20-28-20 +.. nonce: Q1m3DM +.. section: Documentation + +Clarify the meaning of *dirs_exist_ok*, a kwarg of :func:`shutil.copytree`. + +.. + +.. bpo: 36329 +.. date: 2022-04-06-11-53-41 +.. nonce: EVtAtK +.. section: Documentation + +Remove 'make -C Doc serve' in favour of 'make -C Doc htmlview' + +.. + +.. bpo: 47189 +.. date: 2022-04-01-23-56-13 +.. nonce: Nss0Y3 +.. section: Documentation + +Add a What's New in Python 3.11 entry for the Faster CPython project. +Documentation by Ken Jin and Kumar Aditya. + +.. + +.. bpo: 38668 +.. date: 2022-04-01-09-28-31 +.. nonce: j4mrqW +.. section: Documentation + +Update the introduction to documentation for :mod:`os.path` to remove +warnings that became irrelevant after the implementations of :pep:`383` and +:pep:`529`. + +.. + +.. bpo: 47115 +.. date: 2022-03-30-17-08-12 +.. nonce: R3wt3i +.. section: Documentation + +The documentation now lists which members of C structs are part of the +:ref:`Limited API/Stable ABI `. + +.. + +.. bpo: 46962 +.. date: 2022-03-08-22-10-38 +.. nonce: FIVe9I +.. section: Documentation + +All docstrings in code snippets are now wrapped into :func:`PyDoc_STR` to +follow the guideline of `PEP 7's Documentation Strings paragraph +`_. Patch +by Oleg Iarygin. + +.. + +.. bpo: 26792 +.. date: 2022-01-23-20-44-53 +.. nonce: dQ1v1W +.. section: Documentation + +Improve the docstrings of :func:`runpy.run_module` and +:func:`runpy.run_path`. Original patch by Andrew Brezovsky. + +.. + +.. date: 2022-05-02-20-57-04 +.. gh-issue: 92169 +.. nonce: Xi4NGV +.. section: Tests + +Use ``warnings_helper.import_deprecated()`` to import deprecated modules +uniformly in tests. Patch by Hugo van Kemenade. + +.. + +.. date: 2022-05-02-20-15-54 +.. gh-issue: 84461 +.. nonce: DhxllI +.. section: Tests + +When multiprocessing is enabled, libregrtest can now use a Python executable +other than :code:`sys.executable` via the ``--python`` flag. + +.. + +.. date: 2022-04-25-11-16-36 +.. gh-issue: 91904 +.. nonce: 13Uvrz +.. section: Tests + +Fix initialization of :envvar:`PYTHONREGRTEST_UNICODE_GUARD` which prevented +running regression tests on non-UTF-8 locale. + +.. + +.. date: 2022-04-22-19-00-00 +.. gh-issue: 91752 +.. nonce: Ji27dd +.. section: Tests + +Added @requires_zlib to test.test_tools.test_freeze.TestFreeze. + +.. + +.. date: 2022-04-16-17-54-05 +.. gh-issue: 91607 +.. nonce: FnXjtW +.. section: Tests + +Fix ``test_concurrent_futures`` to test the correct multiprocessing start +method context in several cases where the test logic mixed this up. + +.. + +.. bpo: 40280 +.. date: 2022-04-06-10-16-27 +.. nonce: KT5Apg +.. section: Tests + +Threading tests are now skipped on WASM targets without pthread support. + +.. + +.. bpo: 47109 +.. date: 2022-03-24-13-35-01 +.. nonce: FjKQCE +.. section: Tests + +Test for :mod:`ctypes.macholib.dyld`, :mod:`ctypes.macholib.dylib`, and +:mod:`ctypes.macholib.framework` are brought from manual pre-:mod:`unittest` +times to :mod:`ctypes.test` location and structure. Patch by Oleg Iarygin. + +.. + +.. bpo: 29890 +.. date: 2022-01-24-21-31-09 +.. nonce: zEG-ra +.. section: Tests + +Add tests for :class:`ipaddress.IPv4Interface` and +:class:`ipaddress.IPv6Interface` construction with tuple arguments. Original +patch and tests by louisom. + +.. + +.. date: 2022-05-03-03-36-47 +.. gh-issue: 89452 +.. nonce: NIY0fF +.. section: Build + +gdbm-compat is now preferred over ndbm if both are available on the system. +This allows avoiding the problematic ndbm.h on macOS. + +.. + +.. date: 2022-04-20-11-14-51 +.. gh-issue: 91731 +.. nonce: zRoPcJ +.. section: Build + +Python is now built with ``-std=c11`` compiler option, rather than +``-std=c99``. Patch by Victor Stinner. + +.. + +.. bpo: 47152 +.. date: 2022-04-10-16-33-31 +.. nonce: TLkxKm +.. section: Build + +Add script and make target for generating ``sre_constants.h``. + +.. + +.. bpo: 47103 +.. date: 2022-03-23-20-01-16 +.. nonce: b4-00F +.. section: Build + +Windows ``PGInstrument`` builds now copy a required DLL into the output +directory, making it easier to run the profile stage of a PGO build. + +.. + +.. bpo: 46907 +.. date: 2022-04-27-19-36-56 +.. nonce: lfurlP +.. section: Windows + +Update Windows installer to use SQLite 3.38.3. + +.. + +.. bpo: 47239 +.. date: 2022-04-06-15-16-37 +.. nonce: B1HP7i +.. section: Windows + +Fixed --list and --list-paths output for :ref:`launcher` when used in an +active virtual environment. + +.. + +.. bpo: 46907 +.. date: 2022-03-28-07-01-31 +.. nonce: Ou3G6Z +.. section: Windows + +Update Windows installer to use SQLite 3.38.2. + +.. + +.. bpo: 46785 +.. date: 2022-03-13-20-35-41 +.. nonce: Pnknyl +.. section: Windows + +Fix race condition between :func:`os.stat` and unlinking a file on Windows, +by using errors codes returned by ``FindFirstFileW()`` when appropriate in +``win32_xstat_impl``. + +.. + +.. bpo: 40859 +.. date: 2020-06-04-10-42-04 +.. nonce: isKSw7 +.. section: Windows + +Update Windows build to use xz-5.2.5 + +.. + +.. bpo: 46907 +.. date: 2022-05-05-06-21-39 +.. nonce: dkgFPk +.. section: macOS + +Update macOS installer to SQLite 3.38.4. + +.. + +.. date: 2022-04-20-14-26-14 +.. gh-issue: 91583 +.. nonce: 200qI0 +.. section: Tools/Demos + +Fix regression in the code generated by Argument Clinic for functions with +the ``defining_class`` parameter. + +.. + +.. date: 2022-04-18-12-52-16 +.. gh-issue: 91575 +.. nonce: fK1TEh +.. section: Tools/Demos + +Add script ``Tools/scripts/generate_re_casefix.py`` and the make target +``regen-re`` for generating additional data for case-insensitive matching +according to the current Unicode version. + +.. + +.. date: 2022-04-14-18-11-46 +.. gh-issue: 91551 +.. nonce: l_nNT- +.. section: Tools/Demos + +Remove the ancient Pynche color editor. It has moved to +https://gitlab.com/warsaw/pynche + +.. + +.. date: 2022-05-06-04-55-17 +.. gh-issue: 88279 +.. nonce: 3mQ54t +.. section: C API + +Deprecate the C functions: :c:func:`PySys_SetArgv`, +:c:func:`PySys_SetArgvEx`, :c:func:`PySys_SetPath`. Patch by Victor Stinner. + +.. + +.. date: 2022-05-03-20-08-35 +.. gh-issue: 92154 +.. nonce: IqMcAJ +.. section: C API + +Added the :c:func:`PyCode_GetCode` function. This function does the +equivalent of the Python code ``getattr(code_object, 'co_code')``. + +.. + +.. date: 2022-05-02-12-39-33 +.. gh-issue: 92173 +.. nonce: len2Is +.. section: C API + +Fix the ``closure`` argument to :c:func:`PyEval_EvalCodeEx`. + +.. + +.. date: 2022-04-26-16-51-31 +.. gh-issue: 91320 +.. nonce: QDHmTv +.. section: C API + +Fix C++ compiler warnings about "old-style cast" (``g++ -Wold-style-cast``) +in the Python C API. Use C++ ``reinterpret_cast<>`` and ``static_cast<>`` +casts when the Python C API is used in C++. Patch by Victor Stinner. + +.. + +.. date: 2022-04-21-23-11-35 +.. gh-issue: 80527 +.. nonce: Cx-95G +.. section: C API + +Mark functions as deprecated by :pep:`623`: :c:func:`PyUnicode_AS_DATA`, +:c:func:`PyUnicode_AS_UNICODE`, :c:func:`PyUnicode_GET_DATA_SIZE`, +:c:func:`PyUnicode_GET_SIZE`. Patch by Victor Stinner. + +.. + +.. date: 2022-04-21-01-48-22 +.. gh-issue: 91768 +.. nonce: x_aKzv +.. section: C API + +:c:func:`Py_REFCNT`, :c:func:`Py_TYPE`, :c:func:`Py_SIZE` and +:c:func:`Py_IS_TYPE` functions argument type is now ``PyObject*``, rather +than ``const PyObject*``. Patch by Victor Stinner. + +.. + +.. date: 2022-04-19-17-05-39 +.. gh-issue: 91020 +.. nonce: BVJ8F3 +.. section: C API + +Add ``PyBytes_Type.tp_alloc`` to initialize ``PyBytesObject.ob_shash`` for +bytes subclasses. + +.. + +.. bpo: 40421 +.. date: 2022-04-08-11-29-36 +.. nonce: H0ORmT +.. section: C API + +Add ``PyFrame_GetLasti`` C-API function to access frame object's ``f_lasti`` +attribute safely from C code. + +.. + +.. bpo: 35134 +.. date: 2022-04-07-00-53-51 +.. nonce: zSjIzk +.. section: C API + +Remove the ``Include/code.h`` header file. C extensions should only include +the main ```` header file. Patch by Victor Stinner. + +.. + +.. bpo: 47169 +.. date: 2022-04-06-16-54-39 +.. nonce: EGzX4B +.. section: C API + +:c:func:`PyOS_CheckStack` is now exported in the Stable ABI on Windows. + +.. + +.. bpo: 47169 +.. date: 2022-04-06-16-29-14 +.. nonce: wVv2bT +.. section: C API + +:c:func:`PyThread_get_thread_native_id` is excluded from the stable ABI on +platforms where it doesn't exist (like Solaris). + +.. + +.. bpo: 46343 +.. date: 2022-01-11-12-52-37 +.. nonce: JQJWhZ +.. section: C API + +Added :c:func:`PyErr_GetHandledException` and +:c:func:`PyErr_SetHandledException` as simpler alternatives to +:c:func:`PyErr_GetExcInfo` and :c:func:`PyErr_SetExcInfo`. + +They are included in the stable ABI. diff --git a/Misc/NEWS.d/next/Build/2022-03-23-20-01-16.bpo-47103.b4-00F.rst b/Misc/NEWS.d/next/Build/2022-03-23-20-01-16.bpo-47103.b4-00F.rst deleted file mode 100644 index c1e01adce0d26..0000000000000 --- a/Misc/NEWS.d/next/Build/2022-03-23-20-01-16.bpo-47103.b4-00F.rst +++ /dev/null @@ -1,2 +0,0 @@ -Windows ``PGInstrument`` builds now copy a required DLL into the output -directory, making it easier to run the profile stage of a PGO build. diff --git a/Misc/NEWS.d/next/Build/2022-04-10-16-33-31.bpo-47152.TLkxKm.rst b/Misc/NEWS.d/next/Build/2022-04-10-16-33-31.bpo-47152.TLkxKm.rst deleted file mode 100644 index 889353f824c8a..0000000000000 --- a/Misc/NEWS.d/next/Build/2022-04-10-16-33-31.bpo-47152.TLkxKm.rst +++ /dev/null @@ -1 +0,0 @@ -Add script and make target for generating ``sre_constants.h``. diff --git a/Misc/NEWS.d/next/Build/2022-04-20-11-14-51.gh-issue-91731.zRoPcJ.rst b/Misc/NEWS.d/next/Build/2022-04-20-11-14-51.gh-issue-91731.zRoPcJ.rst deleted file mode 100644 index 92a1f52cbce4c..0000000000000 --- a/Misc/NEWS.d/next/Build/2022-04-20-11-14-51.gh-issue-91731.zRoPcJ.rst +++ /dev/null @@ -1,2 +0,0 @@ -Python is now built with ``-std=c11`` compiler option, rather than -``-std=c99``. Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/Build/2022-05-03-03-36-47.gh-issue-89452.NIY0fF.rst b/Misc/NEWS.d/next/Build/2022-05-03-03-36-47.gh-issue-89452.NIY0fF.rst deleted file mode 100644 index dd4954d1d6ac2..0000000000000 --- a/Misc/NEWS.d/next/Build/2022-05-03-03-36-47.gh-issue-89452.NIY0fF.rst +++ /dev/null @@ -1,2 +0,0 @@ -gdbm-compat is now preferred over ndbm if both are available on the system. -This allows avoiding the problematic ndbm.h on macOS. diff --git a/Misc/NEWS.d/next/C API/2022-01-11-12-52-37.bpo-46343.JQJWhZ.rst b/Misc/NEWS.d/next/C API/2022-01-11-12-52-37.bpo-46343.JQJWhZ.rst deleted file mode 100644 index 1ac8da853c879..0000000000000 --- a/Misc/NEWS.d/next/C API/2022-01-11-12-52-37.bpo-46343.JQJWhZ.rst +++ /dev/null @@ -1,5 +0,0 @@ -Added :c:func:`PyErr_GetHandledException` and -:c:func:`PyErr_SetHandledException` as simpler alternatives to -:c:func:`PyErr_GetExcInfo` and :c:func:`PyErr_SetExcInfo`. - -They are included in the stable ABI. diff --git a/Misc/NEWS.d/next/C API/2022-04-06-16-29-14.bpo-47169.wVv2bT.rst b/Misc/NEWS.d/next/C API/2022-04-06-16-29-14.bpo-47169.wVv2bT.rst deleted file mode 100644 index 66eac052391e5..0000000000000 --- a/Misc/NEWS.d/next/C API/2022-04-06-16-29-14.bpo-47169.wVv2bT.rst +++ /dev/null @@ -1,2 +0,0 @@ -:c:func:`PyThread_get_thread_native_id` is excluded from the stable ABI on -platforms where it doesn't exist (like Solaris). diff --git a/Misc/NEWS.d/next/C API/2022-04-06-16-54-39.bpo-47169.EGzX4B.rst b/Misc/NEWS.d/next/C API/2022-04-06-16-54-39.bpo-47169.EGzX4B.rst deleted file mode 100644 index df2889161193c..0000000000000 --- a/Misc/NEWS.d/next/C API/2022-04-06-16-54-39.bpo-47169.EGzX4B.rst +++ /dev/null @@ -1 +0,0 @@ -:c:func:`PyOS_CheckStack` is now exported in the Stable ABI on Windows. diff --git a/Misc/NEWS.d/next/C API/2022-04-07-00-53-51.bpo-35134.zSjIzk.rst b/Misc/NEWS.d/next/C API/2022-04-07-00-53-51.bpo-35134.zSjIzk.rst deleted file mode 100644 index 93e6e32160462..0000000000000 --- a/Misc/NEWS.d/next/C API/2022-04-07-00-53-51.bpo-35134.zSjIzk.rst +++ /dev/null @@ -1,2 +0,0 @@ -Remove the ``Include/code.h`` header file. C extensions should only include -the main ```` header file. Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/C API/2022-04-08-11-29-36.bpo-40421.H0ORmT.rst b/Misc/NEWS.d/next/C API/2022-04-08-11-29-36.bpo-40421.H0ORmT.rst deleted file mode 100644 index d4a1dbecf2867..0000000000000 --- a/Misc/NEWS.d/next/C API/2022-04-08-11-29-36.bpo-40421.H0ORmT.rst +++ /dev/null @@ -1,2 +0,0 @@ -Add ``PyFrame_GetLasti`` C-API function to access frame object's ``f_lasti`` -attribute safely from C code. diff --git a/Misc/NEWS.d/next/C API/2022-04-19-17-05-39.gh-issue-91020.BVJ8F3.rst b/Misc/NEWS.d/next/C API/2022-04-19-17-05-39.gh-issue-91020.BVJ8F3.rst deleted file mode 100644 index 1572c961de34c..0000000000000 --- a/Misc/NEWS.d/next/C API/2022-04-19-17-05-39.gh-issue-91020.BVJ8F3.rst +++ /dev/null @@ -1,2 +0,0 @@ -Add ``PyBytes_Type.tp_alloc`` to initialize ``PyBytesObject.ob_shash`` for -bytes subclasses. diff --git a/Misc/NEWS.d/next/C API/2022-04-21-01-48-22.gh-issue-91768.x_aKzv.rst b/Misc/NEWS.d/next/C API/2022-04-21-01-48-22.gh-issue-91768.x_aKzv.rst deleted file mode 100644 index 434230693211c..0000000000000 --- a/Misc/NEWS.d/next/C API/2022-04-21-01-48-22.gh-issue-91768.x_aKzv.rst +++ /dev/null @@ -1,3 +0,0 @@ -:c:func:`Py_REFCNT`, :c:func:`Py_TYPE`, :c:func:`Py_SIZE` and -:c:func:`Py_IS_TYPE` functions argument type is now ``PyObject*``, rather -than ``const PyObject*``. Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/C API/2022-04-21-23-11-35.gh-issue-80527.Cx-95G.rst b/Misc/NEWS.d/next/C API/2022-04-21-23-11-35.gh-issue-80527.Cx-95G.rst deleted file mode 100644 index 45e92f1b96759..0000000000000 --- a/Misc/NEWS.d/next/C API/2022-04-21-23-11-35.gh-issue-80527.Cx-95G.rst +++ /dev/null @@ -1,3 +0,0 @@ -Mark functions as deprecated by :pep:`623`: :c:func:`PyUnicode_AS_DATA`, -:c:func:`PyUnicode_AS_UNICODE`, :c:func:`PyUnicode_GET_DATA_SIZE`, -:c:func:`PyUnicode_GET_SIZE`. Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/C API/2022-04-26-16-51-31.gh-issue-91320.QDHmTv.rst b/Misc/NEWS.d/next/C API/2022-04-26-16-51-31.gh-issue-91320.QDHmTv.rst deleted file mode 100644 index 07e27acd4f63b..0000000000000 --- a/Misc/NEWS.d/next/C API/2022-04-26-16-51-31.gh-issue-91320.QDHmTv.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fix C++ compiler warnings about "old-style cast" (``g++ -Wold-style-cast``) in -the Python C API. Use C++ ``reinterpret_cast<>`` and ``static_cast<>`` casts -when the Python C API is used in C++. Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/C API/2022-05-02-12-39-33.gh-issue-92173.len2Is.rst b/Misc/NEWS.d/next/C API/2022-05-02-12-39-33.gh-issue-92173.len2Is.rst deleted file mode 100644 index c8f9b58bd6393..0000000000000 --- a/Misc/NEWS.d/next/C API/2022-05-02-12-39-33.gh-issue-92173.len2Is.rst +++ /dev/null @@ -1 +0,0 @@ -Fix the ``closure`` argument to :c:func:`PyEval_EvalCodeEx`. diff --git a/Misc/NEWS.d/next/C API/2022-05-03-20-08-35.gh-issue-92154.IqMcAJ.rst b/Misc/NEWS.d/next/C API/2022-05-03-20-08-35.gh-issue-92154.IqMcAJ.rst deleted file mode 100644 index 7713954fe72e9..0000000000000 --- a/Misc/NEWS.d/next/C API/2022-05-03-20-08-35.gh-issue-92154.IqMcAJ.rst +++ /dev/null @@ -1,2 +0,0 @@ -Added the :c:func:`PyCode_GetCode` function. This function does the -equivalent of the Python code ``getattr(code_object, 'co_code')``. diff --git a/Misc/NEWS.d/next/C API/2022-05-06-04-55-17.gh-issue-88279.3mQ54t.rst b/Misc/NEWS.d/next/C API/2022-05-06-04-55-17.gh-issue-88279.3mQ54t.rst deleted file mode 100644 index eb448f994e8b9..0000000000000 --- a/Misc/NEWS.d/next/C API/2022-05-06-04-55-17.gh-issue-88279.3mQ54t.rst +++ /dev/null @@ -1,2 +0,0 @@ -Deprecate the C functions: :c:func:`PySys_SetArgv`, -:c:func:`PySys_SetArgvEx`, :c:func:`PySys_SetPath`. Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/Core and Builtins/2017-07-23-11-28-45.bpo-26579.lpCY8R.rst b/Misc/NEWS.d/next/Core and Builtins/2017-07-23-11-28-45.bpo-26579.lpCY8R.rst deleted file mode 100644 index 9afd1bfa50084..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2017-07-23-11-28-45.bpo-26579.lpCY8R.rst +++ /dev/null @@ -1,7 +0,0 @@ -Added ``object.__getstate__`` which provides the default implementation of -the ``__getstate__()`` method. - -Copying and pickling instances of subclasses of builtin types bytearray, -set, frozenset, collections.OrderedDict, collections.deque, weakref.WeakSet, -and datetime.tzinfo now copies and pickles instance attributes implemented as -slots. diff --git a/Misc/NEWS.d/next/Core and Builtins/2018-07-14-16-58-00.bpo-34093.WaVD-f.rst b/Misc/NEWS.d/next/Core and Builtins/2018-07-14-16-58-00.bpo-34093.WaVD-f.rst deleted file mode 100644 index 383daaccded6c..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2018-07-14-16-58-00.bpo-34093.WaVD-f.rst +++ /dev/null @@ -1,2 +0,0 @@ -``marshal.dumps()`` uses ``FLAG_REF`` for all interned strings. This makes -output more deterministic and helps reproducible build. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-09-28-10-58-30.bpo-36819.cyV50C.rst b/Misc/NEWS.d/next/Core and Builtins/2021-09-28-10-58-30.bpo-36819.cyV50C.rst deleted file mode 100644 index 32bb55a90e6c4..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-09-28-10-58-30.bpo-36819.cyV50C.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix crashes in built-in encoders with error handlers that return position -less or equal than the starting position of non-encodable characters. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-12-11-11-36-48.bpo-46045.sfThay.rst b/Misc/NEWS.d/next/Core and Builtins/2021-12-11-11-36-48.bpo-46045.sfThay.rst deleted file mode 100644 index 97fd1883eb2ab..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-12-11-11-36-48.bpo-46045.sfThay.rst +++ /dev/null @@ -1 +0,0 @@ -Do not use POSIX semaphores on NetBSD diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-01-25-05-39-38.bpo-46509.ljrqrc.rst b/Misc/NEWS.d/next/Core and Builtins/2022-01-25-05-39-38.bpo-46509.ljrqrc.rst deleted file mode 100644 index e19ce0a243c6c..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-01-25-05-39-38.bpo-46509.ljrqrc.rst +++ /dev/null @@ -1 +0,0 @@ -Add type-specialized versions of the ``Py_DECREF()``, and use them for ``float``, ``int``, ``str``, ``bool``, and ``None`` to avoid pointer-chasing at runtime where types are known at C compile time. diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-02-11-17-16-30.bpo-46721.JkHaLF.rst b/Misc/NEWS.d/next/Core and Builtins/2022-02-11-17-16-30.bpo-46721.JkHaLF.rst deleted file mode 100644 index 5644f10fe5e3e..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-02-11-17-16-30.bpo-46721.JkHaLF.rst +++ /dev/null @@ -1 +0,0 @@ -Optimize :meth:`set.issuperset` for non-set argument. diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-02-13-21-53-29.bpo-43464.yupHjd.rst b/Misc/NEWS.d/next/Core and Builtins/2022-02-13-21-53-29.bpo-43464.yupHjd.rst deleted file mode 100644 index a67ce7c9688e2..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-02-13-21-53-29.bpo-43464.yupHjd.rst +++ /dev/null @@ -1 +0,0 @@ -Optimize :meth:`set.intersection` for non-set arguments. diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-02-16-03-23-38.bpo-46764.wEY4bS.rst b/Misc/NEWS.d/next/Core and Builtins/2022-02-16-03-23-38.bpo-46764.wEY4bS.rst deleted file mode 100644 index f69793cd2d7b8..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-02-16-03-23-38.bpo-46764.wEY4bS.rst +++ /dev/null @@ -1 +0,0 @@ -Fix wrapping bound methods with @classmethod diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-03-07-11-51-51.bpo-46942.57obVi.rst b/Misc/NEWS.d/next/Core and Builtins/2022-03-07-11-51-51.bpo-46942.57obVi.rst deleted file mode 100644 index 930a9018b1d55..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-03-07-11-51-51.bpo-46942.57obVi.rst +++ /dev/null @@ -1,2 +0,0 @@ -Use Argument Clinic for the :class:`types.MethodType` constructor. Patch by -Oleg Iarygin. diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-03-08-21-59-57.bpo-46962.UomDfz.rst b/Misc/NEWS.d/next/Core and Builtins/2022-03-08-21-59-57.bpo-46962.UomDfz.rst deleted file mode 100644 index 395c9b3d8f526..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-03-08-21-59-57.bpo-46962.UomDfz.rst +++ /dev/null @@ -1,10 +0,0 @@ -Classes and functions that unconditionally declared their docstrings -ignoring the `--without-doc-strings` compilation flag no longer do so. - -The classes affected are :class:`ctypes.UnionType`, -:class:`pickle.PickleBuffer`, :class:`testcapi.RecursingInfinitelyError`, -and :class:`types.GenericAlias`. - -The functions affected are 24 methods in :mod:`ctypes`. - -Patch by Oleg Iarygin. diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-03-13-08-23-17.bpo-46961.SgGCkG.rst b/Misc/NEWS.d/next/Core and Builtins/2022-03-13-08-23-17.bpo-46961.SgGCkG.rst deleted file mode 100644 index 8753377f6b8ed..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-03-13-08-23-17.bpo-46961.SgGCkG.rst +++ /dev/null @@ -1 +0,0 @@ -Integer mod/remainder operations, including the three-argument form of :func:`pow`, now consistently return ints from the global small integer cache when applicable. diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-03-31-01-30-03.bpo-47177.fQqaov.rst b/Misc/NEWS.d/next/Core and Builtins/2022-03-31-01-30-03.bpo-47177.fQqaov.rst deleted file mode 100644 index 01e6c88392458..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-03-31-01-30-03.bpo-47177.fQqaov.rst +++ /dev/null @@ -1 +0,0 @@ -Replace the ``f_lasti`` member of the internal ``_PyInterpreterFrame`` structure with a ``prev_instr`` pointer, which reduces overhead in the main interpreter loop. The?``f_lasti`` attribute of Python-layer frame objects is preserved for backward-compatibility. diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-03-31-14-33-48.bpo-47120.6S_uoU.rst b/Misc/NEWS.d/next/Core and Builtins/2022-03-31-14-33-48.bpo-47120.6S_uoU.rst deleted file mode 100644 index c87d9843d9157..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-03-31-14-33-48.bpo-47120.6S_uoU.rst +++ /dev/null @@ -1 +0,0 @@ -Make opcodes :opcode:`JUMP_IF_TRUE_OR_POP` and :opcode:`JUMP_IF_FALSE_OR_POP` relative rather than absolute. diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-04-03-17-21-04.bpo-47197.Ji_c30.rst b/Misc/NEWS.d/next/Core and Builtins/2022-04-03-17-21-04.bpo-47197.Ji_c30.rst deleted file mode 100644 index 697b07dc95ecc..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-04-03-17-21-04.bpo-47197.Ji_c30.rst +++ /dev/null @@ -1,5 +0,0 @@ -ctypes used to mishandle ``void`` return types, so that for instance a -function declared like ``ctypes.CFUNCTYPE(None, ctypes.c_int)`` would be -called with signature ``int f(int)`` instead of ``void f(int)``. Wasm -targets require function pointers to be called with the correct signatures -so this led to crashes. The problem is now fixed. diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-04-04-15-12-38.bpo-45317.UDLOt8.rst b/Misc/NEWS.d/next/Core and Builtins/2022-04-04-15-12-38.bpo-45317.UDLOt8.rst deleted file mode 100644 index dd2da464e2552..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-04-04-15-12-38.bpo-45317.UDLOt8.rst +++ /dev/null @@ -1 +0,0 @@ -Add internal documentation explaining design of new (for 3.11) frame stack. diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-04-06-22-50-31.bpo-47120.mbfHs5.rst b/Misc/NEWS.d/next/Core and Builtins/2022-04-06-22-50-31.bpo-47120.mbfHs5.rst deleted file mode 100644 index 3afe8c2bb6552..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-04-06-22-50-31.bpo-47120.mbfHs5.rst +++ /dev/null @@ -1 +0,0 @@ -Make :opcode:`POP_JUMP_IF_TRUE`, :opcode:`POP_JUMP_IF_FALSE`, :opcode:`POP_JUMP_IF_NONE` and :opcode:`POP_JUMP_IF_NOT_NONE` virtual, mapping to new relative jump opcodes. diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-04-10-18-47-21.gh-issue-91428.ZewV-M.rst b/Misc/NEWS.d/next/Core and Builtins/2022-04-10-18-47-21.gh-issue-91428.ZewV-M.rst deleted file mode 100644 index 3f17a406f8f57..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-04-10-18-47-21.gh-issue-91428.ZewV-M.rst +++ /dev/null @@ -1,5 +0,0 @@ -Add ``static const char *const _PyOpcode_OpName[256] = {...};`` to -``opcode.h`` for debug builds to assist in debugging the Python interpreter. -It is now more convenient to make various forms of debugging output more -human-readable by including opcode names rather than just the corresponding -decimal digits. diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-04-10-22-57-27.gh-issue-91421.dHhv6U.rst b/Misc/NEWS.d/next/Core and Builtins/2022-04-10-22-57-27.gh-issue-91421.dHhv6U.rst deleted file mode 100644 index 898eb0df18d01..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-04-10-22-57-27.gh-issue-91421.dHhv6U.rst +++ /dev/null @@ -1 +0,0 @@ -Fix a potential integer overflow in _Py_DecodeUTF8Ex. diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-04-11-18-44-19.gh-issue-89455.d0qMYd.rst b/Misc/NEWS.d/next/Core and Builtins/2022-04-11-18-44-19.gh-issue-89455.d0qMYd.rst deleted file mode 100644 index e22b4ac44c096..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-04-11-18-44-19.gh-issue-89455.d0qMYd.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fixed an uninitialized bool value in the traceback printing code path that -was introduced by the initial bpo-45292 exception groups work. diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-04-12-00-44-14.gh-issue-91462.t8oxyd.rst b/Misc/NEWS.d/next/Core and Builtins/2022-04-12-00-44-14.gh-issue-91462.t8oxyd.rst deleted file mode 100644 index 0656b303a4570..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-04-12-00-44-14.gh-issue-91462.t8oxyd.rst +++ /dev/null @@ -1 +0,0 @@ -Make the interpreter's low-level tracing (lltrace) feature output more readable by displaying opcode names (rather than just numbers), and by displaying stack contents before each opcode. diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-04-12-09-40-57.gh-issue-46055.IPb1HA.rst b/Misc/NEWS.d/next/Core and Builtins/2022-04-12-09-40-57.gh-issue-46055.IPb1HA.rst deleted file mode 100644 index ed7e4113fd2e6..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-04-12-09-40-57.gh-issue-46055.IPb1HA.rst +++ /dev/null @@ -1,2 +0,0 @@ -Speed up right shift of negative integers, by removing unnecessary creation -of temporaries. Original patch by Xinhang Xu, reworked by Mark Dickinson. diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-04-12-11-56-23.gh-issue-91479.-dyGJX.rst b/Misc/NEWS.d/next/Core and Builtins/2022-04-12-11-56-23.gh-issue-91479.-dyGJX.rst deleted file mode 100644 index e131e91e75312..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-04-12-11-56-23.gh-issue-91479.-dyGJX.rst +++ /dev/null @@ -1 +0,0 @@ -Replaced the ``__note__`` field of :exc:`BaseException` (added in an earlier version of 3.11) with the final design of :pep:`678`. Namely, :exc:`BaseException` gets an :meth:`add_note` method, and its ``__notes__`` field is created when necessary. diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-04-13-07-14-30.gh-issue-91266.6Vkzzt.rst b/Misc/NEWS.d/next/Core and Builtins/2022-04-13-07-14-30.gh-issue-91266.6Vkzzt.rst deleted file mode 100644 index bb1d7dd90f17f..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-04-13-07-14-30.gh-issue-91266.6Vkzzt.rst +++ /dev/null @@ -1 +0,0 @@ -Refactor the ``bytearray`` strip methods ``strip``, ``lstrip`` and ``rstrip`` to use a common implementation. diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-04-13-11-15-09.gh-issue-91502.11YXHQ.rst b/Misc/NEWS.d/next/Core and Builtins/2022-04-13-11-15-09.gh-issue-91502.11YXHQ.rst deleted file mode 100644 index 4edff6f005490..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-04-13-11-15-09.gh-issue-91502.11YXHQ.rst +++ /dev/null @@ -1,2 +0,0 @@ -Add a new :c:func:`_PyFrame_IsEntryFrame` API function, to check if a -:c:type:`PyFrameObject` is an entry frame. Patch by Pablo Galindo. diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-04-13-22-03-04.gh-issue-89279.-jAVxZ.rst b/Misc/NEWS.d/next/Core and Builtins/2022-04-13-22-03-04.gh-issue-89279.-jAVxZ.rst deleted file mode 100644 index 66b1c884ec450..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-04-13-22-03-04.gh-issue-89279.-jAVxZ.rst +++ /dev/null @@ -1 +0,0 @@ -Improve interpreter performance on Windows by inlining a few specific macros. diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-04-15-16-57-23.gh-issue-91576.adoDj_.rst b/Misc/NEWS.d/next/Core and Builtins/2022-04-15-16-57-23.gh-issue-91576.adoDj_.rst deleted file mode 100644 index b792f3e48f29b..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-04-15-16-57-23.gh-issue-91576.adoDj_.rst +++ /dev/null @@ -1 +0,0 @@ -Speed up iteration of ascii strings by 50%. Patch by Kumar Aditya. diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-04-16-21-54-31.gh-issue-78607._Y7bMm.rst b/Misc/NEWS.d/next/Core and Builtins/2022-04-16-21-54-31.gh-issue-78607._Y7bMm.rst deleted file mode 100644 index 808aedd50981e..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-04-16-21-54-31.gh-issue-78607._Y7bMm.rst +++ /dev/null @@ -1 +0,0 @@ -The LLTRACE special build now looks for the name ``__lltrace__`` defined in module globals, rather than the name ``__ltrace__``, which had been introduced as a typo. diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-04-17-02-55-38.gh-issue-91625.80CrC7.rst b/Misc/NEWS.d/next/Core and Builtins/2022-04-17-02-55-38.gh-issue-91625.80CrC7.rst deleted file mode 100644 index ea5b57b2b4719..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-04-17-02-55-38.gh-issue-91625.80CrC7.rst +++ /dev/null @@ -1 +0,0 @@ -Fixed a bug in which adaptive opcodes ignored any preceding ``EXTENDED_ARG``\ s on specialization failure. diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-04-17-11-03-45.gh-issue-91603.hYw1Lv.rst b/Misc/NEWS.d/next/Core and Builtins/2022-04-17-11-03-45.gh-issue-91603.hYw1Lv.rst deleted file mode 100644 index 957bd5ea09b58..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-04-17-11-03-45.gh-issue-91603.hYw1Lv.rst +++ /dev/null @@ -1,2 +0,0 @@ -Speed up :func:`isinstance` and :func:`issubclass` checks for :class:`types.UnionType`. -Patch by Yurii Karabas. diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-04-18-02-45-40.gh-issue-91636.6DFdy_.rst b/Misc/NEWS.d/next/Core and Builtins/2022-04-18-02-45-40.gh-issue-91636.6DFdy_.rst deleted file mode 100644 index 663339bafb79e..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-04-18-02-45-40.gh-issue-91636.6DFdy_.rst +++ /dev/null @@ -1 +0,0 @@ -Fixed a crash in a garbage-collection edge-case, in which a ``PyFunction_Type.tp_clear`` function could leave a python function object in an inconsistent state. diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-04-18-07-23-48.gh-issue-91102.vm-6g1.rst b/Misc/NEWS.d/next/Core and Builtins/2022-04-18-07-23-48.gh-issue-91102.vm-6g1.rst deleted file mode 100644 index 5f3897e6dcd03..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-04-18-07-23-48.gh-issue-91102.vm-6g1.rst +++ /dev/null @@ -1 +0,0 @@ -Use Argument Clinic for :class:`EncodingMap`. Patch by Oleg Iarygin. diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-04-18-15-22-56.bpo-43950.qrTvWL.rst b/Misc/NEWS.d/next/Core and Builtins/2022-04-18-15-22-56.bpo-43950.qrTvWL.rst deleted file mode 100644 index c8bfa5914b027..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-04-18-15-22-56.bpo-43950.qrTvWL.rst +++ /dev/null @@ -1,2 +0,0 @@ -Use a single compact table for line starts, ends and column offsets. Reduces -memory consumption for location info by half diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-04-18-20-25-01.gh-issue-81548.n3VYgp.rst b/Misc/NEWS.d/next/Core and Builtins/2022-04-18-20-25-01.gh-issue-81548.n3VYgp.rst deleted file mode 100644 index 56b1fd63b71c0..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-04-18-20-25-01.gh-issue-81548.n3VYgp.rst +++ /dev/null @@ -1,3 +0,0 @@ -Octal escapes with value larger than ``0o377`` now produce a -:exc:`DeprecationWarning`. In a future Python version they will be a -:exc:`SyntaxWarning` and eventually a :exc:`SyntaxError`. diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-04-20-14-43-37.gh-issue-91632.cvUhsZ.rst b/Misc/NEWS.d/next/Core and Builtins/2022-04-20-14-43-37.gh-issue-91632.cvUhsZ.rst deleted file mode 100644 index e7837828901fc..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-04-20-14-43-37.gh-issue-91632.cvUhsZ.rst +++ /dev/null @@ -1 +0,0 @@ -Fix a minor memory leak at exit: release the memory of the :class:`generic_alias_iterator` type. Patch by Dong-hee Na. diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-04-21-16-15-24.gh-issue-89373.A1jgLx.rst b/Misc/NEWS.d/next/Core and Builtins/2022-04-21-16-15-24.gh-issue-89373.A1jgLx.rst deleted file mode 100644 index 56434f7e79669..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-04-21-16-15-24.gh-issue-89373.A1jgLx.rst +++ /dev/null @@ -1,2 +0,0 @@ -If Python is built in debug mode, Python now ensures that deallocator -functions leave the current exception unchanged. Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-04-23-22-08-34.gh-issue-91603.GcWEkK.rst b/Misc/NEWS.d/next/Core and Builtins/2022-04-23-22-08-34.gh-issue-91603.GcWEkK.rst deleted file mode 100644 index c12ab72a6d672..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-04-23-22-08-34.gh-issue-91603.GcWEkK.rst +++ /dev/null @@ -1,2 +0,0 @@ -Speed up :class:`types.UnionType` instantiation. Based on patch provided by Yurii -Karabas. diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-04-26-05-05-32.gh-issue-91869.ELbTXl.rst b/Misc/NEWS.d/next/Core and Builtins/2022-04-26-05-05-32.gh-issue-91869.ELbTXl.rst deleted file mode 100644 index 05b84be23483b..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-04-26-05-05-32.gh-issue-91869.ELbTXl.rst +++ /dev/null @@ -1 +0,0 @@ -Fix an issue where specialized opcodes with extended arguments could produce incorrect tracing output or lead to assertion failures. diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-04-27-10-36-43.gh-issue-87999.YSPHfO.rst b/Misc/NEWS.d/next/Core and Builtins/2022-04-27-10-36-43.gh-issue-87999.YSPHfO.rst deleted file mode 100644 index b0ad9b5a11c12..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-04-27-10-36-43.gh-issue-87999.YSPHfO.rst +++ /dev/null @@ -1,3 +0,0 @@ -The warning emitted by the Python parser for a numeric literal immediately -followed by keyword has been changed from deprecation warning to syntax -warning. diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-04-28-20-19-49.gh-issue-92032.ef-UfM.rst b/Misc/NEWS.d/next/Core and Builtins/2022-04-28-20-19-49.gh-issue-92032.ef-UfM.rst deleted file mode 100644 index f6f0db2c50cbc..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-04-28-20-19-49.gh-issue-92032.ef-UfM.rst +++ /dev/null @@ -1,2 +0,0 @@ -The interpreter can now autocomplete soft keywords, as of now -``match``, ``case``, and ``_`` (wildcard pattern) from :pep:`634`. diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-04-28-23-37-30.gh-issue-92036.GZJAC9.rst b/Misc/NEWS.d/next/Core and Builtins/2022-04-28-23-37-30.gh-issue-92036.GZJAC9.rst deleted file mode 100644 index 78094c5e4fea7..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-04-28-23-37-30.gh-issue-92036.GZJAC9.rst +++ /dev/null @@ -1,5 +0,0 @@ -Fix a crash in subinterpreters related to the garbage collector. When a -subinterpreter is deleted, untrack all objects tracked by its GC. To prevent a -crash in deallocator functions expecting objects to be tracked by the GC, leak -a strong reference to these objects on purpose, so they are never deleted and -their deallocator functions are not called. Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-04-29-02-50-41.gh-issue-92031.2PpaIN.rst b/Misc/NEWS.d/next/Core and Builtins/2022-04-29-02-50-41.gh-issue-92031.2PpaIN.rst deleted file mode 100644 index 6bdefb8afb116..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-04-29-02-50-41.gh-issue-92031.2PpaIN.rst +++ /dev/null @@ -1 +0,0 @@ -Deoptimize statically-allocated code objects during ``Py_FINALIZE()`` so that future ``_PyCode_Quicken`` calls always start with unquickened code. diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-04-30-04-26-01.gh-issue-92063.vHnhf6.rst b/Misc/NEWS.d/next/Core and Builtins/2022-04-30-04-26-01.gh-issue-92063.vHnhf6.rst deleted file mode 100644 index d737ccc24481f..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-04-30-04-26-01.gh-issue-92063.vHnhf6.rst +++ /dev/null @@ -1,2 +0,0 @@ -The ``PRECALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS`` instruction -now ensures methods are called only on objects of the correct type. diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-01-10-58-38.gh-issue-92112.lLJemu.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-01-10-58-38.gh-issue-92112.lLJemu.rst deleted file mode 100644 index 00c938e89f438..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-05-01-10-58-38.gh-issue-92112.lLJemu.rst +++ /dev/null @@ -1 +0,0 @@ -Fix crash triggered by an evil custom ``mro()`` on a metaclass. diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-01-16-40-07.gh-issue-92114.5xTlLt.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-01-16-40-07.gh-issue-92114.5xTlLt.rst deleted file mode 100644 index a999245953022..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-05-01-16-40-07.gh-issue-92114.5xTlLt.rst +++ /dev/null @@ -1,2 +0,0 @@ -Improve error message when subscript a type with ``__class_getitem__`` set -to ``None``. diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-02-12-40-18.gh-issue-91173.k_Dr6z.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-02-12-40-18.gh-issue-91173.k_Dr6z.rst deleted file mode 100644 index fa7761381b314..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-05-02-12-40-18.gh-issue-91173.k_Dr6z.rst +++ /dev/null @@ -1 +0,0 @@ -Disable frozen modules in debug builds. Patch by Kumar Aditya. diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-02-17-12-49.gh-issue-92203.-igcjS.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-02-17-12-49.gh-issue-92203.-igcjS.rst deleted file mode 100644 index f765579a1b627..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-05-02-17-12-49.gh-issue-92203.-igcjS.rst +++ /dev/null @@ -1,5 +0,0 @@ -Add a closure keyword-only parameter to exec(). It can only be specified -when exec-ing a code object that uses free variables. When specified, it -must be a tuple, with exactly the number of cell variables referenced by the -code object. closure has a default value of None, and it must be None if the -code object doesn't refer to any free variables. diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-03-14-55-40.gh-issue-92245.G17-5i.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-03-14-55-40.gh-issue-92245.G17-5i.rst deleted file mode 100644 index 7b1c5f529a228..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-05-03-14-55-40.gh-issue-92245.G17-5i.rst +++ /dev/null @@ -1,2 +0,0 @@ -Make sure that PEP 523 is respected in all cases. In 3.11a7, specialization -may have prevented Python-to-Python calls respecting PEP 523. diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-04-11-37-20.bpo-43857.WuX8p3.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-04-11-37-20.bpo-43857.WuX8p3.rst deleted file mode 100644 index 0db4333bf9945..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-05-04-11-37-20.bpo-43857.WuX8p3.rst +++ /dev/null @@ -1,2 +0,0 @@ -Improve the :exc:`AttributeError` message when deleting a missing attribute. -Patch by G?ry Ogam. diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-05-20-05-41.gh-issue-92345.lnN_RA.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-05-20-05-41.gh-issue-92345.lnN_RA.rst deleted file mode 100644 index 2e2a6084f492c..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-05-05-20-05-41.gh-issue-92345.lnN_RA.rst +++ /dev/null @@ -1,3 +0,0 @@ -``pymain_run_python()`` now imports ``readline`` and ``rlcompleter`` before -sys.path is extended to include the current working directory of an -interactive interpreter. Non-interactive interpreters are not affected. diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-06-02-29-53.gh-issue-89519.4OfkRE.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-06-02-29-53.gh-issue-89519.4OfkRE.rst deleted file mode 100644 index 1460546d14886..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-05-06-02-29-53.gh-issue-89519.4OfkRE.rst +++ /dev/null @@ -1,4 +0,0 @@ -Chaining classmethod descriptors (introduced in bpo-19072) is deprecated. It -can no longer be used to wrap other descriptors such as property(). The -core design of this feature was flawed, and it caused a number of downstream -problems. diff --git a/Misc/NEWS.d/next/Documentation/2022-01-23-20-44-53.bpo-26792.dQ1v1W.rst b/Misc/NEWS.d/next/Documentation/2022-01-23-20-44-53.bpo-26792.dQ1v1W.rst deleted file mode 100644 index 64a3956447601..0000000000000 --- a/Misc/NEWS.d/next/Documentation/2022-01-23-20-44-53.bpo-26792.dQ1v1W.rst +++ /dev/null @@ -1,2 +0,0 @@ -Improve the docstrings of :func:`runpy.run_module` and :func:`runpy.run_path`. -Original patch by Andrew Brezovsky. diff --git a/Misc/NEWS.d/next/Documentation/2022-03-08-22-10-38.bpo-46962.FIVe9I.rst b/Misc/NEWS.d/next/Documentation/2022-03-08-22-10-38.bpo-46962.FIVe9I.rst deleted file mode 100644 index f5b54013bd672..0000000000000 --- a/Misc/NEWS.d/next/Documentation/2022-03-08-22-10-38.bpo-46962.FIVe9I.rst +++ /dev/null @@ -1,4 +0,0 @@ -All docstrings in code snippets are now wrapped into :func:`PyDoc_STR` to -follow the guideline of `PEP 7's Documentation Strings paragraph -`_. Patch -by Oleg Iarygin. diff --git a/Misc/NEWS.d/next/Documentation/2022-03-30-17-08-12.bpo-47115.R3wt3i.rst b/Misc/NEWS.d/next/Documentation/2022-03-30-17-08-12.bpo-47115.R3wt3i.rst deleted file mode 100644 index ac7b6dcb32d5f..0000000000000 --- a/Misc/NEWS.d/next/Documentation/2022-03-30-17-08-12.bpo-47115.R3wt3i.rst +++ /dev/null @@ -1,2 +0,0 @@ -The documentation now lists which members of C structs are part of the -:ref:`Limited API/Stable ABI `. diff --git a/Misc/NEWS.d/next/Documentation/2022-04-01-09-28-31.bpo-38668.j4mrqW.rst b/Misc/NEWS.d/next/Documentation/2022-04-01-09-28-31.bpo-38668.j4mrqW.rst deleted file mode 100644 index 512f0deb3543c..0000000000000 --- a/Misc/NEWS.d/next/Documentation/2022-04-01-09-28-31.bpo-38668.j4mrqW.rst +++ /dev/null @@ -1,3 +0,0 @@ -Update the introduction to documentation for :mod:`os.path` to remove -warnings that became irrelevant after the implementations of :pep:`383` and -:pep:`529`. diff --git a/Misc/NEWS.d/next/Documentation/2022-04-01-23-56-13.bpo-47189.Nss0Y3.rst b/Misc/NEWS.d/next/Documentation/2022-04-01-23-56-13.bpo-47189.Nss0Y3.rst deleted file mode 100644 index 8c400841ca1d1..0000000000000 --- a/Misc/NEWS.d/next/Documentation/2022-04-01-23-56-13.bpo-47189.Nss0Y3.rst +++ /dev/null @@ -1,2 +0,0 @@ -Add a What's New in Python 3.11 entry for the Faster CPython project. -Documentation by Ken Jin and Kumar Aditya. diff --git a/Misc/NEWS.d/next/Documentation/2022-04-06-11-53-41.bpo-36329.EVtAtK.rst b/Misc/NEWS.d/next/Documentation/2022-04-06-11-53-41.bpo-36329.EVtAtK.rst deleted file mode 100644 index 67398de51aed2..0000000000000 --- a/Misc/NEWS.d/next/Documentation/2022-04-06-11-53-41.bpo-36329.EVtAtK.rst +++ /dev/null @@ -1 +0,0 @@ -Remove 'make -C Doc serve' in favour of 'make -C Doc htmlview' diff --git a/Misc/NEWS.d/next/Documentation/2022-04-10-20-28-20.bpo-44347.Q1m3DM.rst b/Misc/NEWS.d/next/Documentation/2022-04-10-20-28-20.bpo-44347.Q1m3DM.rst deleted file mode 100644 index 27aa5742cd008..0000000000000 --- a/Misc/NEWS.d/next/Documentation/2022-04-10-20-28-20.bpo-44347.Q1m3DM.rst +++ /dev/null @@ -1 +0,0 @@ -Clarify the meaning of *dirs_exist_ok*, a kwarg of :func:`shutil.copytree`. diff --git a/Misc/NEWS.d/next/Documentation/2022-04-17-03-19-51.gh-issue-91298.NT9qHi.rst b/Misc/NEWS.d/next/Documentation/2022-04-17-03-19-51.gh-issue-91298.NT9qHi.rst deleted file mode 100644 index 471a7ced6886b..0000000000000 --- a/Misc/NEWS.d/next/Documentation/2022-04-17-03-19-51.gh-issue-91298.NT9qHi.rst +++ /dev/null @@ -1,2 +0,0 @@ -In ``importlib.resources.abc``, refined the documentation of the Traversable -Protocol, applying changes from importlib_resources 5.7.1. diff --git a/Misc/NEWS.d/next/Documentation/2022-04-19-20-16-00.gh-issue-91547.LsNWER.rst b/Misc/NEWS.d/next/Documentation/2022-04-19-20-16-00.gh-issue-91547.LsNWER.rst deleted file mode 100644 index 95b34cb2fac1f..0000000000000 --- a/Misc/NEWS.d/next/Documentation/2022-04-19-20-16-00.gh-issue-91547.LsNWER.rst +++ /dev/null @@ -1 +0,0 @@ -Remove "Undocumented modules" page. diff --git a/Misc/NEWS.d/next/Documentation/2022-04-23-00-22-54.gh-issue-91783.N09dRR.rst b/Misc/NEWS.d/next/Documentation/2022-04-23-00-22-54.gh-issue-91783.N09dRR.rst deleted file mode 100644 index 4d6be37402079..0000000000000 --- a/Misc/NEWS.d/next/Documentation/2022-04-23-00-22-54.gh-issue-91783.N09dRR.rst +++ /dev/null @@ -1,2 +0,0 @@ -Document security issues concerning the use of the function -:meth:`shutil.unpack_archive` diff --git a/Misc/NEWS.d/next/Documentation/2022-04-24-22-09-31.gh-issue-91888.kTjJLx.rst b/Misc/NEWS.d/next/Documentation/2022-04-24-22-09-31.gh-issue-91888.kTjJLx.rst deleted file mode 100644 index 9194be9dbf92d..0000000000000 --- a/Misc/NEWS.d/next/Documentation/2022-04-24-22-09-31.gh-issue-91888.kTjJLx.rst +++ /dev/null @@ -1 +0,0 @@ -Add a new `gh` role to the documentation to link to GitHub issues. diff --git a/Misc/NEWS.d/next/Library/2018-04-18-16-15-55.bpo-24905.jYqjYx.rst b/Misc/NEWS.d/next/Library/2018-04-18-16-15-55.bpo-24905.jYqjYx.rst deleted file mode 100644 index 0a57f90c12378..0000000000000 --- a/Misc/NEWS.d/next/Library/2018-04-18-16-15-55.bpo-24905.jYqjYx.rst +++ /dev/null @@ -1,3 +0,0 @@ -Add :meth:`~sqlite3.Connection.blobopen` to :class:`sqlite3.Connection`. -:class:`sqlite3.Blob` allows incremental I/O operations on blobs. -Patch by Aviv Palivoda and Erlend E. Aasland. diff --git a/Misc/NEWS.d/next/Library/2018-11-11-04-41-11.bpo-22276.Tt19TW.rst b/Misc/NEWS.d/next/Library/2018-11-11-04-41-11.bpo-22276.Tt19TW.rst deleted file mode 100644 index 357c3f4ae0e6a..0000000000000 --- a/Misc/NEWS.d/next/Library/2018-11-11-04-41-11.bpo-22276.Tt19TW.rst +++ /dev/null @@ -1,4 +0,0 @@ -:class:`~pathlib.Path` methods :meth:`~pathlib.Path.glob` and :meth:`~pathlib.Path.rglob` return only -directories if *pattern* ends with a pathname components separator -(``/`` or :data:`~os.sep`). -Patch by Eisuke Kawashima. diff --git a/Misc/NEWS.d/next/Library/2019-05-06-23-36-34.bpo-34975.eb49jr.rst b/Misc/NEWS.d/next/Library/2019-05-06-23-36-34.bpo-34975.eb49jr.rst deleted file mode 100644 index 1576269da99ee..0000000000000 --- a/Misc/NEWS.d/next/Library/2019-05-06-23-36-34.bpo-34975.eb49jr.rst +++ /dev/null @@ -1,3 +0,0 @@ -Adds a ``start_tls()`` method to :class:`~asyncio.streams.StreamWriter`, -which upgrades the connection with TLS using the given -:class:`~ssl.SSLContext`. diff --git a/Misc/NEWS.d/next/Library/2019-06-22-11-01-45.bpo-36073.ED8mB9.rst b/Misc/NEWS.d/next/Library/2019-06-22-11-01-45.bpo-36073.ED8mB9.rst deleted file mode 100644 index 6c214d8191601..0000000000000 --- a/Misc/NEWS.d/next/Library/2019-06-22-11-01-45.bpo-36073.ED8mB9.rst +++ /dev/null @@ -1,2 +0,0 @@ -Raise :exc:`~sqlite3.ProgrammingError` instead of segfaulting on recursive -usage of cursors in :mod:`sqlite3` converters. Patch by Sergey Fedoseev. diff --git a/Misc/NEWS.d/next/Library/2020-02-22-12-02-11.bpo-39716.z2WhDQ.rst b/Misc/NEWS.d/next/Library/2020-02-22-12-02-11.bpo-39716.z2WhDQ.rst deleted file mode 100644 index f122811e6bfe3..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-02-22-12-02-11.bpo-39716.z2WhDQ.rst +++ /dev/null @@ -1,3 +0,0 @@ -Raise an ArgumentError when the same subparser name is added twice to an -`argparse.ArgumentParser`. This is consistent with the (default) behavior -when the same option string is added twice to an ArgumentParser. diff --git a/Misc/NEWS.d/next/Library/2020-05-19-01-40-51.bpo-40676.yJfq1J.rst b/Misc/NEWS.d/next/Library/2020-05-19-01-40-51.bpo-40676.yJfq1J.rst deleted file mode 100644 index c67d4dcdb3216..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-05-19-01-40-51.bpo-40676.yJfq1J.rst +++ /dev/null @@ -1,3 +0,0 @@ -Convert :mod:`csv` to use Argument Clinic for :func:`csv.field_size_limit`, -:func:`csv.get_dialect`, :func:`csv.unregister_dialect` and :func:`csv.list_dialects`. - diff --git a/Misc/NEWS.d/next/Library/2020-05-24-23-52-03.bpo-40617.lycF9q.rst b/Misc/NEWS.d/next/Library/2020-05-24-23-52-03.bpo-40617.lycF9q.rst deleted file mode 100644 index 123b49ddb5ac6..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-05-24-23-52-03.bpo-40617.lycF9q.rst +++ /dev/null @@ -1,3 +0,0 @@ -Add :meth:`~sqlite3.Connection.create_window_function` to -:class:`sqlite3.Connection` for creating aggregate window functions. -Patch by Erlend E. Aasland. diff --git a/Misc/NEWS.d/next/Library/2020-10-19-08-50-41.bpo-42066.DsB-R6.rst b/Misc/NEWS.d/next/Library/2020-10-19-08-50-41.bpo-42066.DsB-R6.rst deleted file mode 100644 index f3de85461fbc0..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-10-19-08-50-41.bpo-42066.DsB-R6.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix cookies getting sorted in :func:`CookieJar.__iter__` which is an extra behavior and not mentioned in RFC 2965 or Netscape cookie protocol. -Now the cookies in ``CookieJar`` follows the order of the ``Set-Cookie`` header. Patch by Iman Kermani. diff --git a/Misc/NEWS.d/next/Library/2020-12-24-19-11-53.bpo-38435.rEHTAR.rst b/Misc/NEWS.d/next/Library/2020-12-24-19-11-53.bpo-38435.rEHTAR.rst deleted file mode 100644 index b18d6a432427f..0000000000000 --- a/Misc/NEWS.d/next/Library/2020-12-24-19-11-53.bpo-38435.rEHTAR.rst +++ /dev/null @@ -1,2 +0,0 @@ -Add a ``process_group`` parameter to :class:`subprocess.Popen` to help move -more things off of the unsafe ``preexec_fn`` parameter. diff --git a/Misc/NEWS.d/next/Library/2021-02-14-20-55-53.bpo-43218.VZv2M4.rst b/Misc/NEWS.d/next/Library/2021-02-14-20-55-53.bpo-43218.VZv2M4.rst deleted file mode 100644 index 31229c35a2148..0000000000000 --- a/Misc/NEWS.d/next/Library/2021-02-14-20-55-53.bpo-43218.VZv2M4.rst +++ /dev/null @@ -1,2 +0,0 @@ -Prevent creation of a venv whose path contains the PATH separator. This -could affect the usage of the activate script. Patch by Dustin Rodrigues. diff --git a/Misc/NEWS.d/next/Library/2021-04-16-17-32-44.bpo-43827.uJaXdP.rst b/Misc/NEWS.d/next/Library/2021-04-16-17-32-44.bpo-43827.uJaXdP.rst deleted file mode 100644 index 6e4f82f2d27eb..0000000000000 --- a/Misc/NEWS.d/next/Library/2021-04-16-17-32-44.bpo-43827.uJaXdP.rst +++ /dev/null @@ -1 +0,0 @@ -All positional-or-keyword parameters to ``ABCMeta.__new__`` are now positional-only to avoid conflicts with keyword arguments to be passed to :meth:`__init_subclass__`. diff --git a/Misc/NEWS.d/next/Library/2021-08-17-21-41-39.bpo-44587.57OKSz.rst b/Misc/NEWS.d/next/Library/2021-08-17-21-41-39.bpo-44587.57OKSz.rst deleted file mode 100644 index ce9b3a04bc62f..0000000000000 --- a/Misc/NEWS.d/next/Library/2021-08-17-21-41-39.bpo-44587.57OKSz.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix BooleanOptionalAction to not automatically add a default string. If a -default string is desired, use a formatter to add it. diff --git a/Misc/NEWS.d/next/Library/2021-09-03-07-56-48.bpo-44863.udgz95.rst b/Misc/NEWS.d/next/Library/2021-09-03-07-56-48.bpo-44863.udgz95.rst deleted file mode 100644 index 130856587fd91..0000000000000 --- a/Misc/NEWS.d/next/Library/2021-09-03-07-56-48.bpo-44863.udgz95.rst +++ /dev/null @@ -1,4 +0,0 @@ -Allow :class:`~typing.TypedDict` subclasses to also include -:class:`~typing.Generic` as a base class in class based syntax. Thereby allowing -the user to define a generic ``TypedDict``, just like a user-defined generic but -with ``TypedDict`` semantics. diff --git a/Misc/NEWS.d/next/Library/2021-09-08-16-21-03.bpo-45138.yghUrK.rst b/Misc/NEWS.d/next/Library/2021-09-08-16-21-03.bpo-45138.yghUrK.rst deleted file mode 100644 index 906ed4c4db43c..0000000000000 --- a/Misc/NEWS.d/next/Library/2021-09-08-16-21-03.bpo-45138.yghUrK.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fix a regression in the :mod:`sqlite3` trace callback where bound parameters -were not expanded in the passed statement string. The regression was introduced -in Python 3.10 by :issue:`40318`. Patch by Erlend E. Aasland. diff --git a/Misc/NEWS.d/next/Library/2021-11-14-01-35-04.bpo-26175.LNlOfI.rst b/Misc/NEWS.d/next/Library/2021-11-14-01-35-04.bpo-26175.LNlOfI.rst deleted file mode 100644 index 89072b3c04f39..0000000000000 --- a/Misc/NEWS.d/next/Library/2021-11-14-01-35-04.bpo-26175.LNlOfI.rst +++ /dev/null @@ -1,4 +0,0 @@ -Fully implement the :class:`io.BufferedIOBase` or :class:`io.TextIOBase` -interface for :class:`tempfile.SpooledTemporaryFile` objects. This lets them -work correctly with higher-level layers (like compression modules). Patch by -Carey Metcalfe. diff --git a/Misc/NEWS.d/next/Library/2021-12-14-13-15-41.bpo-45995.Am9pNL.rst b/Misc/NEWS.d/next/Library/2021-12-14-13-15-41.bpo-45995.Am9pNL.rst deleted file mode 100644 index dd42bc092c280..0000000000000 --- a/Misc/NEWS.d/next/Library/2021-12-14-13-15-41.bpo-45995.Am9pNL.rst +++ /dev/null @@ -1,3 +0,0 @@ -Add a "z" option to the string formatting specification that coerces negative -zero floating-point values to positive zero after rounding to the format -precision. Contributed by John Belmonte. diff --git a/Misc/NEWS.d/next/Library/2021-12-14-21-19-04.bpo-46075.KDtcU-.rst b/Misc/NEWS.d/next/Library/2021-12-14-21-19-04.bpo-46075.KDtcU-.rst deleted file mode 100644 index e01319300be86..0000000000000 --- a/Misc/NEWS.d/next/Library/2021-12-14-21-19-04.bpo-46075.KDtcU-.rst +++ /dev/null @@ -1 +0,0 @@ -``CookieJar`` with ``DefaultCookiePolicy`` now can process cookies from localhost with domain=localhost explicitly specified in Set-Cookie header. diff --git a/Misc/NEWS.d/next/Library/2022-01-17-16-53-30.bpo-46415.6wSYg-.rst b/Misc/NEWS.d/next/Library/2022-01-17-16-53-30.bpo-46415.6wSYg-.rst deleted file mode 100644 index 016d6656041f9..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-01-17-16-53-30.bpo-46415.6wSYg-.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix ipaddress.ip_{address,interface,network} raising TypeError instead of -ValueError if given invalid tuple as address parameter. diff --git a/Misc/NEWS.d/next/Library/2022-01-27-14-41-55.bpo-46547.JMyYz9.rst b/Misc/NEWS.d/next/Library/2022-01-27-14-41-55.bpo-46547.JMyYz9.rst deleted file mode 100644 index 83065a7a06030..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-01-27-14-41-55.bpo-46547.JMyYz9.rst +++ /dev/null @@ -1 +0,0 @@ -Remove variables leaking into ``pydoc.Helper`` class namespace. diff --git a/Misc/NEWS.d/next/Library/2022-01-27-14-46-15.bpo-44791.tR1JFG.rst b/Misc/NEWS.d/next/Library/2022-01-27-14-46-15.bpo-44791.tR1JFG.rst deleted file mode 100644 index 31c6dcc058e94..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-01-27-14-46-15.bpo-44791.tR1JFG.rst +++ /dev/null @@ -1 +0,0 @@ -Accept ellipsis as the last argument of :data:`typing.Concatenate`. diff --git a/Misc/NEWS.d/next/Library/2022-01-29-00-23-00.bpo-46285.pt84qm.rst b/Misc/NEWS.d/next/Library/2022-01-29-00-23-00.bpo-46285.pt84qm.rst deleted file mode 100644 index 83c4990e475d3..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-01-29-00-23-00.bpo-46285.pt84qm.rst +++ /dev/null @@ -1,4 +0,0 @@ -Add command-line option ``-p``/``--protocol`` to module :mod:`http.server` -which specifies the HTTP version to which the server is conformant (HTTP/1.1 -conformant servers can now be run from the command-line interface of module -:mod:`http.server`). Patch by G?ry Ogam. diff --git a/Misc/NEWS.d/next/Library/2022-02-02-04-51-39.bpo-45639.N8XrGO.rst b/Misc/NEWS.d/next/Library/2022-02-02-04-51-39.bpo-45639.N8XrGO.rst deleted file mode 100644 index 332008bf9c472..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-02-02-04-51-39.bpo-45639.N8XrGO.rst +++ /dev/null @@ -1 +0,0 @@ -``image/avif`` and ``image/webp`` were added to :mod:`mimetypes`. diff --git a/Misc/NEWS.d/next/Library/2022-02-06-12-59-32.bpo-46053.sHFo3S.rst b/Misc/NEWS.d/next/Library/2022-02-06-12-59-32.bpo-46053.sHFo3S.rst deleted file mode 100644 index ce375885792e8..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-02-06-12-59-32.bpo-46053.sHFo3S.rst +++ /dev/null @@ -1 +0,0 @@ -Fix OSS audio support on NetBSD. diff --git a/Misc/NEWS.d/next/Library/2022-02-09-21-40-02.bpo-46696.nPXRno.rst b/Misc/NEWS.d/next/Library/2022-02-09-21-40-02.bpo-46696.nPXRno.rst deleted file mode 100644 index 04c41887afd6e..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-02-09-21-40-02.bpo-46696.nPXRno.rst +++ /dev/null @@ -1 +0,0 @@ -Add ``SO_INCOMING_CPU`` constant to :mod:`socket`. diff --git a/Misc/NEWS.d/next/Library/2022-02-11-23-11-35.bpo-46720.nY8spB.rst b/Misc/NEWS.d/next/Library/2022-02-11-23-11-35.bpo-46720.nY8spB.rst deleted file mode 100644 index 70d5e5ef34333..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-02-11-23-11-35.bpo-46720.nY8spB.rst +++ /dev/null @@ -1,2 +0,0 @@ -Add support for path-like objects to :func:`multiprocessing.set_executable` for -Windows to be on a par with Unix-like systems. Patch by G?ry Ogam. diff --git a/Misc/NEWS.d/next/Library/2022-02-18-20-09-29.bpo-46787.juwWc0.rst b/Misc/NEWS.d/next/Library/2022-02-18-20-09-29.bpo-46787.juwWc0.rst deleted file mode 100644 index cf167ff48115b..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-02-18-20-09-29.bpo-46787.juwWc0.rst +++ /dev/null @@ -1 +0,0 @@ -Fix :class:`concurrent.futures.ProcessPoolExecutor` exception memory leak diff --git a/Misc/NEWS.d/next/Library/2022-03-02-04-25-58.bpo-44807.gHNC9J.rst b/Misc/NEWS.d/next/Library/2022-03-02-04-25-58.bpo-44807.gHNC9J.rst deleted file mode 100644 index 4757d3420caf8..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-03-02-04-25-58.bpo-44807.gHNC9J.rst +++ /dev/null @@ -1 +0,0 @@ -:class:`typing.Protocol` no longer silently replaces :meth:`__init__` methods defined on subclasses. Patch by Adrian Garcia Badaracco. diff --git a/Misc/NEWS.d/next/Library/2022-03-06-18-15-32.bpo-45100.B_lHu0.rst b/Misc/NEWS.d/next/Library/2022-03-06-18-15-32.bpo-45100.B_lHu0.rst deleted file mode 100644 index d644557545366..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-03-06-18-15-32.bpo-45100.B_lHu0.rst +++ /dev/null @@ -1,2 +0,0 @@ -Add :func:`typing.get_overloads` and :func:`typing.clear_overloads`. -Patch by Jelle Zijlstra. diff --git a/Misc/NEWS.d/next/Library/2022-03-21-13-50-07.bpo-46681.RRhopn.rst b/Misc/NEWS.d/next/Library/2022-03-21-13-50-07.bpo-46681.RRhopn.rst deleted file mode 100644 index 7668605698cab..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-03-21-13-50-07.bpo-46681.RRhopn.rst +++ /dev/null @@ -1 +0,0 @@ -Forward gzip.compress() compresslevel to zlib. diff --git a/Misc/NEWS.d/next/Library/2022-03-25-22-18-45.bpo-46841.NUEsXW.rst b/Misc/NEWS.d/next/Library/2022-03-25-22-18-45.bpo-46841.NUEsXW.rst deleted file mode 100644 index 0e778047593a7..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-03-25-22-18-45.bpo-46841.NUEsXW.rst +++ /dev/null @@ -1 +0,0 @@ -Disassembly of quickened code. diff --git a/Misc/NEWS.d/next/Library/2022-03-27-12-40-16.bpo-43323.9mFPuI.rst b/Misc/NEWS.d/next/Library/2022-03-27-12-40-16.bpo-43323.9mFPuI.rst deleted file mode 100644 index 98d73101d3ee5..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-03-27-12-40-16.bpo-43323.9mFPuI.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix errors in the :mod:`email` module if the charset itself contains -undecodable/unencodable characters. diff --git a/Misc/NEWS.d/next/Library/2022-04-01-21-44-00.bpo-47135.TvkKB-.rst b/Misc/NEWS.d/next/Library/2022-04-01-21-44-00.bpo-47135.TvkKB-.rst deleted file mode 100644 index 2323c22c007e9..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-01-21-44-00.bpo-47135.TvkKB-.rst +++ /dev/null @@ -1 +0,0 @@ -:meth:`decimal.localcontext` now accepts context attributes via keyword arguments diff --git a/Misc/NEWS.d/next/Library/2022-04-04-11-58-07.bpo-47211.W4GFkB.rst b/Misc/NEWS.d/next/Library/2022-04-04-11-58-07.bpo-47211.W4GFkB.rst deleted file mode 100644 index 0bd5d1619ff78..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-04-11-58-07.bpo-47211.W4GFkB.rst +++ /dev/null @@ -1,2 +0,0 @@ -Remove undocumented and never working function ``re.template()`` and flag -``re.TEMPLATE``. diff --git a/Misc/NEWS.d/next/Library/2022-04-05-15-53-58.bpo-47227.1HWdp9.rst b/Misc/NEWS.d/next/Library/2022-04-05-15-53-58.bpo-47227.1HWdp9.rst deleted file mode 100644 index 254d95150ef6c..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-05-15-53-58.bpo-47227.1HWdp9.rst +++ /dev/null @@ -1 +0,0 @@ -Suppress expression chaining for more :mod:`re` parsing errors. diff --git a/Misc/NEWS.d/next/Library/2022-04-05-17-18-13.bpo-42012.zMocQz.rst b/Misc/NEWS.d/next/Library/2022-04-05-17-18-13.bpo-42012.zMocQz.rst deleted file mode 100644 index ba84041782563..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-05-17-18-13.bpo-42012.zMocQz.rst +++ /dev/null @@ -1,2 +0,0 @@ -Add :mod:`wsgiref.types`, containing WSGI-specific types for static type -checking. diff --git a/Misc/NEWS.d/next/Library/2022-04-06-11-54-53.bpo-47000.2nmAR1.rst b/Misc/NEWS.d/next/Library/2022-04-06-11-54-53.bpo-47000.2nmAR1.rst deleted file mode 100644 index 0dd3d416c51e5..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-06-11-54-53.bpo-47000.2nmAR1.rst +++ /dev/null @@ -1,3 +0,0 @@ -Add :func:`locale.getencoding` to get the current locale encoding. -It is similar to ``locale.getpreferredencoding(False)`` but ignores the -:ref:`Python UTF-8 Mode `. diff --git a/Misc/NEWS.d/next/Library/2022-04-06-18-01-28.bpo-47061.qoVTR9.rst b/Misc/NEWS.d/next/Library/2022-04-06-18-01-28.bpo-47061.qoVTR9.rst deleted file mode 100644 index 65ffa2e180791..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-06-18-01-28.bpo-47061.qoVTR9.rst +++ /dev/null @@ -1 +0,0 @@ -Deprecate audioop. diff --git a/Misc/NEWS.d/next/Library/2022-04-07-20-32-47.bpo-47061.TOufgh.rst b/Misc/NEWS.d/next/Library/2022-04-07-20-32-47.bpo-47061.TOufgh.rst deleted file mode 100644 index bd5424979c2ac..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-07-20-32-47.bpo-47061.TOufgh.rst +++ /dev/null @@ -1 +0,0 @@ -Deprecate cgi and cgitb. diff --git a/Misc/NEWS.d/next/Library/2022-04-08-08-55-36.bpo-47087.Q5C3EI.rst b/Misc/NEWS.d/next/Library/2022-04-08-08-55-36.bpo-47087.Q5C3EI.rst deleted file mode 100644 index ca686b7da873b..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-08-08-55-36.bpo-47087.Q5C3EI.rst +++ /dev/null @@ -1,2 +0,0 @@ -Implement ``typing.Required`` and ``typing.NotRequired`` (:pep:`655`). Patch -by David Foster and Jelle Zijlstra. diff --git a/Misc/NEWS.d/next/Library/2022-04-08-14-30-53.bpo-47260.TtcNxI.rst b/Misc/NEWS.d/next/Library/2022-04-08-14-30-53.bpo-47260.TtcNxI.rst deleted file mode 100644 index 300baa19c279a..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-08-14-30-53.bpo-47260.TtcNxI.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix ``os.closerange()`` potentially being a no-op in a Linux seccomp -sandbox. diff --git a/Misc/NEWS.d/next/Library/2022-04-10-08-39-44.bpo-91498.8oII92.rst b/Misc/NEWS.d/next/Library/2022-04-10-08-39-44.bpo-91498.8oII92.rst deleted file mode 100644 index df3b81fd11683..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-10-08-39-44.bpo-91498.8oII92.rst +++ /dev/null @@ -1 +0,0 @@ -Add the ``TCP_CONNECTION_INFO`` option (available on macOS) to :mod:`socket`. diff --git a/Misc/NEWS.d/next/Library/2022-04-10-11-11-33.gh-issue-91217.K82AuH.rst b/Misc/NEWS.d/next/Library/2022-04-10-11-11-33.gh-issue-91217.K82AuH.rst deleted file mode 100644 index 0181bbcce9cd8..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-10-11-11-33.gh-issue-91217.K82AuH.rst +++ /dev/null @@ -1 +0,0 @@ -Deprecate the chunk module. diff --git a/Misc/NEWS.d/next/Library/2022-04-10-17-12-23.gh-issue-91230.T1d_fG.rst b/Misc/NEWS.d/next/Library/2022-04-10-17-12-23.gh-issue-91230.T1d_fG.rst deleted file mode 100644 index 1efc7afca4eb2..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-10-17-12-23.gh-issue-91230.T1d_fG.rst +++ /dev/null @@ -1,3 +0,0 @@ -:func:`warnings.catch_warnings` now accepts arguments for -:func:`warnings.simplefilter`, providing a more concise way to -locally ignore warnings or convert them to errors. diff --git a/Misc/NEWS.d/next/Library/2022-04-10-17-50-18.bpo-47000.JlQkFx.rst b/Misc/NEWS.d/next/Library/2022-04-10-17-50-18.bpo-47000.JlQkFx.rst deleted file mode 100644 index 77d5b8f33d9a0..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-10-17-50-18.bpo-47000.JlQkFx.rst +++ /dev/null @@ -1,2 +0,0 @@ -Make :class:`TextIOWrapper` uses locale encoding when ``encoding="locale"`` -is specified even in UTF-8 mode. diff --git a/Misc/NEWS.d/next/Library/2022-04-11-13-07-30.gh-issue-91276.Vttu15.rst b/Misc/NEWS.d/next/Library/2022-04-11-13-07-30.gh-issue-91276.Vttu15.rst deleted file mode 100644 index 9a7299f3c6e68..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-11-13-07-30.gh-issue-91276.Vttu15.rst +++ /dev/null @@ -1 +0,0 @@ -Make space for longer opcodes in :mod:`dis` output. diff --git a/Misc/NEWS.d/next/Library/2022-04-11-16-13-26.gh-issue-91217.2rf8rc.rst b/Misc/NEWS.d/next/Library/2022-04-11-16-13-26.gh-issue-91217.2rf8rc.rst deleted file mode 100644 index 067783f85c28a..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-11-16-13-26.gh-issue-91217.2rf8rc.rst +++ /dev/null @@ -1 +0,0 @@ -Deprecate the crypt module. diff --git a/Misc/NEWS.d/next/Library/2022-04-11-17-04-38.gh-issue-91217.QVDLOq.rst b/Misc/NEWS.d/next/Library/2022-04-11-17-04-38.gh-issue-91217.QVDLOq.rst deleted file mode 100644 index 3e59c205aae29..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-11-17-04-38.gh-issue-91217.QVDLOq.rst +++ /dev/null @@ -1 +0,0 @@ -Deprecate the imghdr module. diff --git a/Misc/NEWS.d/next/Library/2022-04-12-19-08-13.gh-issue-91404.zjqYHo.rst b/Misc/NEWS.d/next/Library/2022-04-12-19-08-13.gh-issue-91404.zjqYHo.rst deleted file mode 100644 index 58464fceeba5a..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-12-19-08-13.gh-issue-91404.zjqYHo.rst +++ /dev/null @@ -1,3 +0,0 @@ -Improve the performance of :mod:`re` matching by using computed gotos (or -"threaded code") on supported platforms and removing expensive pointer -indirections. diff --git a/Misc/NEWS.d/next/Library/2022-04-12-19-42-20.gh-issue-91217.b9_Rz9.rst b/Misc/NEWS.d/next/Library/2022-04-12-19-42-20.gh-issue-91217.b9_Rz9.rst deleted file mode 100644 index ee1fc22deaef0..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-12-19-42-20.gh-issue-91217.b9_Rz9.rst +++ /dev/null @@ -1 +0,0 @@ -Deprecate msilib. diff --git a/Misc/NEWS.d/next/Library/2022-04-12-20-19-10.gh-issue-91217.acd4h9.rst b/Misc/NEWS.d/next/Library/2022-04-12-20-19-10.gh-issue-91217.acd4h9.rst deleted file mode 100644 index 4a74b9d085142..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-12-20-19-10.gh-issue-91217.acd4h9.rst +++ /dev/null @@ -1 +0,0 @@ -Deprecate nntplib. diff --git a/Misc/NEWS.d/next/Library/2022-04-14-00-59-01.gh-issue-69093.bmlMwI.rst b/Misc/NEWS.d/next/Library/2022-04-14-00-59-01.gh-issue-69093.bmlMwI.rst deleted file mode 100644 index d45a139b50e82..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-14-00-59-01.gh-issue-69093.bmlMwI.rst +++ /dev/null @@ -1,2 +0,0 @@ -Add :term:`context manager` support to :class:`sqlite3.Blob`. -Patch by Aviv Palivoda and Erlend E. Aasland. diff --git a/Misc/NEWS.d/next/Library/2022-04-14-01-00-31.gh-issue-69093.bmlMwI.rst b/Misc/NEWS.d/next/Library/2022-04-14-01-00-31.gh-issue-69093.bmlMwI.rst deleted file mode 100644 index 4bb8531beeacd..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-14-01-00-31.gh-issue-69093.bmlMwI.rst +++ /dev/null @@ -1,2 +0,0 @@ -Add indexing and slicing support to :class:`sqlite3.Blob`. Patch by Aviv Palivoda -and Erlend E. Aasland. diff --git a/Misc/NEWS.d/next/Library/2022-04-14-13-11-37.gh-issue-88116.j_SybE.rst b/Misc/NEWS.d/next/Library/2022-04-14-13-11-37.gh-issue-88116.j_SybE.rst deleted file mode 100644 index 1b7bd6929e959..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-14-13-11-37.gh-issue-88116.j_SybE.rst +++ /dev/null @@ -1,8 +0,0 @@ -Change the frame-related functions in the :mod:`inspect` module to return a -regular object (that is backwards compatible with the old tuple-like interface) -that include the extended :pep:`657` position information (end line number, -column and end column). The affected functions are: :func:`inspect.getframeinfo`, -:func:`inspect.getouterframes`, :func:`inspect.getinnerframes`, :func:`inspect.stack` and -:func:`inspect.trace`. Patch by Pablo Galindo. - - diff --git a/Misc/NEWS.d/next/Library/2022-04-14-18-06-00.gh-issue-91526.cwfhSB.rst b/Misc/NEWS.d/next/Library/2022-04-14-18-06-00.gh-issue-91526.cwfhSB.rst deleted file mode 100644 index a6633421e2b0f..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-14-18-06-00.gh-issue-91526.cwfhSB.rst +++ /dev/null @@ -1,3 +0,0 @@ -Stop calling ``os.device_encoding(file.fileno())`` in -:class:`TextIOWrapper`. It was complex, never documented, and didn't work -for most cases. (Patch by Inada Naoki.) diff --git a/Misc/NEWS.d/next/Library/2022-04-15-17-06-09.gh-issue-89022.DgdQCa.rst b/Misc/NEWS.d/next/Library/2022-04-15-17-06-09.gh-issue-89022.DgdQCa.rst deleted file mode 100644 index 4392f29b376f4..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-15-17-06-09.gh-issue-89022.DgdQCa.rst +++ /dev/null @@ -1,4 +0,0 @@ -In :mod:`sqlite3`, ``SQLITE_MISUSE`` result codes are now mapped to -:exc:`~sqlite3.InterfaceError` instead of :exc:`~sqlite3.ProgrammingError`. -Also, more accurate exceptions are raised when binding parameters fail. -Patch by Erlend E. Aasland. diff --git a/Misc/NEWS.d/next/Library/2022-04-15-18-32-38.gh-issue-90622.WQjFDe.rst b/Misc/NEWS.d/next/Library/2022-04-15-18-32-38.gh-issue-90622.WQjFDe.rst deleted file mode 100644 index 4144e4c38bad7..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-15-18-32-38.gh-issue-90622.WQjFDe.rst +++ /dev/null @@ -1,5 +0,0 @@ -In ``concurrent.futures.process.ProcessPoolExecutor`` disallow the "fork" -multiprocessing start method when the new ``max_tasks_per_child`` feature is -used as the mix of threads+fork can hang the child processes. Default to -using the safe "spawn" start method in that circumstance if no -``mp_context`` was supplied. diff --git a/Misc/NEWS.d/next/Library/2022-04-15-18-38-21.gh-issue-91575.fSyAxS.rst b/Misc/NEWS.d/next/Library/2022-04-15-18-38-21.gh-issue-91575.fSyAxS.rst deleted file mode 100644 index ba046f2b4d61c..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-15-18-38-21.gh-issue-91575.fSyAxS.rst +++ /dev/null @@ -1,2 +0,0 @@ -Update case-insensitive matching in the :mod:`re` module to the latest -Unicode version. diff --git a/Misc/NEWS.d/next/Library/2022-04-15-19-34-02.gh-issue-91487.2aqguF.rst b/Misc/NEWS.d/next/Library/2022-04-15-19-34-02.gh-issue-91487.2aqguF.rst deleted file mode 100644 index d3c41a7e4cbc1..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-15-19-34-02.gh-issue-91487.2aqguF.rst +++ /dev/null @@ -1 +0,0 @@ -Optimize asyncio UDP speed, over 100 times faster when transferring a large file. diff --git a/Misc/NEWS.d/next/Library/2022-04-15-20-56-31.gh-issue-74166.70KlvL.rst b/Misc/NEWS.d/next/Library/2022-04-15-20-56-31.gh-issue-74166.70KlvL.rst deleted file mode 100644 index ddd4eb77e7c74..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-15-20-56-31.gh-issue-74166.70KlvL.rst +++ /dev/null @@ -1 +0,0 @@ -Add option to raise all errors from :meth:`~socket.create_connection` in an :exc:`ExceptionGroup` when it fails to create a connection. The default remains to raise only the last error that had occurred when multiple addresses were tried. diff --git a/Misc/NEWS.d/next/Library/2022-04-16-05-12-13.gh-issue-91595.CocJBv.rst b/Misc/NEWS.d/next/Library/2022-04-16-05-12-13.gh-issue-91595.CocJBv.rst deleted file mode 100644 index 637079a6487a4..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-16-05-12-13.gh-issue-91595.CocJBv.rst +++ /dev/null @@ -1 +0,0 @@ -Fix the comparison of character and integer inside :func:`Tools.gdb.libpython.write_repr`. Patch by Yu Liu. diff --git a/Misc/NEWS.d/next/Library/2022-04-16-09-33-14.gh-issue-91217.nt9JFs.rst b/Misc/NEWS.d/next/Library/2022-04-16-09-33-14.gh-issue-91217.nt9JFs.rst deleted file mode 100644 index fc29034169866..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-16-09-33-14.gh-issue-91217.nt9JFs.rst +++ /dev/null @@ -1 +0,0 @@ -Deprecate the nis module. diff --git a/Misc/NEWS.d/next/Library/2022-04-16-11-39-59.bpo-47256.1cygyd.rst b/Misc/NEWS.d/next/Library/2022-04-16-11-39-59.bpo-47256.1cygyd.rst deleted file mode 100644 index ac4c52bd7058a..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-16-11-39-59.bpo-47256.1cygyd.rst +++ /dev/null @@ -1,2 +0,0 @@ -:mod:`re` module, limit the maximum capturing group to 1,073,741,823 in -64-bit build, this increases the depth of backtracking. diff --git a/Misc/NEWS.d/next/Library/2022-04-17-11-56-17.gh-issue-91217.McJre3.rst b/Misc/NEWS.d/next/Library/2022-04-17-11-56-17.gh-issue-91217.McJre3.rst deleted file mode 100644 index 86ad05f963cb9..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-17-11-56-17.gh-issue-91217.McJre3.rst +++ /dev/null @@ -1 +0,0 @@ -Deprecate the ossaudiodev module. diff --git a/Misc/NEWS.d/next/Library/2022-04-17-12-07-50.gh-issue-91217.TIvrsq.rst b/Misc/NEWS.d/next/Library/2022-04-17-12-07-50.gh-issue-91217.TIvrsq.rst deleted file mode 100644 index fc8ed5775bbb2..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-17-12-07-50.gh-issue-91217.TIvrsq.rst +++ /dev/null @@ -1 +0,0 @@ -Deprecate the 'pipes' module. diff --git a/Misc/NEWS.d/next/Library/2022-04-17-12-27-25.gh-issue-91616.gSQg69.rst b/Misc/NEWS.d/next/Library/2022-04-17-12-27-25.gh-issue-91616.gSQg69.rst deleted file mode 100644 index 8f147237aed6b..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-17-12-27-25.gh-issue-91616.gSQg69.rst +++ /dev/null @@ -1,2 +0,0 @@ -:mod:`re` module, fix :meth:`~re.Pattern.fullmatch` mismatch when using Atomic -Grouping or Possessive Quantifiers. diff --git a/Misc/NEWS.d/next/Library/2022-04-17-12-27-46.gh-issue-91217.tNDWtK.rst b/Misc/NEWS.d/next/Library/2022-04-17-12-27-46.gh-issue-91217.tNDWtK.rst deleted file mode 100644 index 4ee6ba284682f..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-17-12-27-46.gh-issue-91217.tNDWtK.rst +++ /dev/null @@ -1,2 +0,0 @@ -Deprecate the sndhdr module, as well as inline needed functionality for -``email.mime.MIMEAudio``. diff --git a/Misc/NEWS.d/next/Library/2022-04-17-12-32-40.gh-issue-91217.ms49Rg.rst b/Misc/NEWS.d/next/Library/2022-04-17-12-32-40.gh-issue-91217.ms49Rg.rst deleted file mode 100644 index 9655522d0eb46..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-17-12-32-40.gh-issue-91217.ms49Rg.rst +++ /dev/null @@ -1 +0,0 @@ -Deprecate the spwd module. diff --git a/Misc/NEWS.d/next/Library/2022-04-17-12-38-31.gh-issue-91217.55714p.rst b/Misc/NEWS.d/next/Library/2022-04-17-12-38-31.gh-issue-91217.55714p.rst deleted file mode 100644 index 4cebfc4222d4c..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-17-12-38-31.gh-issue-91217.55714p.rst +++ /dev/null @@ -1 +0,0 @@ -Deprecate the sunau module. diff --git a/Misc/NEWS.d/next/Library/2022-04-17-12-41-52.gh-issue-91217.3wnHSX.rst b/Misc/NEWS.d/next/Library/2022-04-17-12-41-52.gh-issue-91217.3wnHSX.rst deleted file mode 100644 index 6c4acc7924332..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-17-12-41-52.gh-issue-91217.3wnHSX.rst +++ /dev/null @@ -1 +0,0 @@ -Deprecate the telnetlib module. diff --git a/Misc/NEWS.d/next/Library/2022-04-18-15-23-24.gh-issue-91670.6eyChw.rst b/Misc/NEWS.d/next/Library/2022-04-18-15-23-24.gh-issue-91670.6eyChw.rst deleted file mode 100644 index 38ba32db081d5..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-18-15-23-24.gh-issue-91670.6eyChw.rst +++ /dev/null @@ -1 +0,0 @@ -Remove deprecated ``SO`` config variable in :mod:`sysconfig`. diff --git a/Misc/NEWS.d/next/Library/2022-04-18-16-31-33.gh-issue-90568.9kiU7o.rst b/Misc/NEWS.d/next/Library/2022-04-18-16-31-33.gh-issue-90568.9kiU7o.rst deleted file mode 100644 index 4411c715830e2..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-18-16-31-33.gh-issue-90568.9kiU7o.rst +++ /dev/null @@ -1,3 +0,0 @@ -Parsing ``\N`` escapes of Unicode Named Character Sequences in a -:mod:`regular expression ` raises now :exc:`re.error` instead of -``TypeError``. diff --git a/Misc/NEWS.d/next/Library/2022-04-18-18-55-21.gh-issue-91621.ACNlda.rst b/Misc/NEWS.d/next/Library/2022-04-18-18-55-21.gh-issue-91621.ACNlda.rst deleted file mode 100644 index b9e68d225a25b..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-18-18-55-21.gh-issue-91621.ACNlda.rst +++ /dev/null @@ -1 +0,0 @@ -Fix :func:`typing.get_type_hints` for :class:`collections.abc.Callable`. Patch by Shantanu Jain. diff --git a/Misc/NEWS.d/next/Library/2022-04-19-15-30-06.gh-issue-91231.AWy4Cs.rst b/Misc/NEWS.d/next/Library/2022-04-19-15-30-06.gh-issue-91231.AWy4Cs.rst deleted file mode 100644 index a61fd8b9e8a8b..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-19-15-30-06.gh-issue-91231.AWy4Cs.rst +++ /dev/null @@ -1,3 +0,0 @@ -Add an optional keyword *shutdown_timeout* parameter to the -:class:`multiprocessing.BaseManager` constructor. Kill the process if -terminate() takes longer than the timeout. Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/Library/2022-04-19-17-30-17.gh-issue-91700.MRJi6m.rst b/Misc/NEWS.d/next/Library/2022-04-19-17-30-17.gh-issue-91700.MRJi6m.rst deleted file mode 100644 index 73b106869697b..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-19-17-30-17.gh-issue-91700.MRJi6m.rst +++ /dev/null @@ -1,4 +0,0 @@ -Compilation of regular expression containing a conditional expression -``(?(group)...)`` now raises an appropriate :exc:`re.error` if the group -number refers to not defined group. Previously an internal RuntimeError was -raised. diff --git a/Misc/NEWS.d/next/Library/2022-04-19-19-50-10.gh-issue-90633.Youov0.rst b/Misc/NEWS.d/next/Library/2022-04-19-19-50-10.gh-issue-90633.Youov0.rst deleted file mode 100644 index d86c2d3ff5de4..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-19-19-50-10.gh-issue-90633.Youov0.rst +++ /dev/null @@ -1,2 +0,0 @@ -Include the passed value in the exception thrown by -:func:`typing.assert_never`. Patch by Jelle Zijlstra. diff --git a/Misc/NEWS.d/next/Library/2022-04-20-09-49-33.gh-issue-91734.4Dj4Gy.rst b/Misc/NEWS.d/next/Library/2022-04-20-09-49-33.gh-issue-91734.4Dj4Gy.rst deleted file mode 100644 index 47d9e0dea458a..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-20-09-49-33.gh-issue-91734.4Dj4Gy.rst +++ /dev/null @@ -1 +0,0 @@ -Fix OSS audio support on Solaris. diff --git a/Misc/NEWS.d/next/Library/2022-04-20-18-47-27.gh-issue-90623.5fROpX.rst b/Misc/NEWS.d/next/Library/2022-04-20-18-47-27.gh-issue-90623.5fROpX.rst deleted file mode 100644 index 566cf35c32868..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-20-18-47-27.gh-issue-90623.5fROpX.rst +++ /dev/null @@ -1,2 +0,0 @@ -:func:`signal.raise_signal` and :func:`os.kill` now check immediately for -pending signals. Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/Library/2022-04-21-11-57-23.gh-issue-84461.S7dbt4.rst b/Misc/NEWS.d/next/Library/2022-04-21-11-57-23.gh-issue-84461.S7dbt4.rst deleted file mode 100644 index 08448d7d7ce21..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-21-11-57-23.gh-issue-84461.S7dbt4.rst +++ /dev/null @@ -1,2 +0,0 @@ -Add provisional :data:`sys._emscripten_info` named tuple with build-time and -run-time information about Emscripten platform. diff --git a/Misc/NEWS.d/next/Library/2022-04-21-19-46-03.gh-issue-91760.zDtv1E.rst b/Misc/NEWS.d/next/Library/2022-04-21-19-46-03.gh-issue-91760.zDtv1E.rst deleted file mode 100644 index 0bddbbe093144..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-21-19-46-03.gh-issue-91760.zDtv1E.rst +++ /dev/null @@ -1,4 +0,0 @@ -More strict rules will be applied for numerical group references and group -names in regular expressions. For now, a deprecation warning is emitted for -group references and group names which will be errors in future Python -versions. diff --git a/Misc/NEWS.d/next/Library/2022-04-21-21-04-08.gh-issue-91217.BZVEki.rst b/Misc/NEWS.d/next/Library/2022-04-21-21-04-08.gh-issue-91217.BZVEki.rst deleted file mode 100644 index ef5b5c2125584..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-21-21-04-08.gh-issue-91217.BZVEki.rst +++ /dev/null @@ -1 +0,0 @@ -Deprecate the uu module. diff --git a/Misc/NEWS.d/next/Library/2022-04-21-21-06-54.gh-issue-91217.2cVma_.rst b/Misc/NEWS.d/next/Library/2022-04-21-21-06-54.gh-issue-91217.2cVma_.rst deleted file mode 100644 index 14f2c4d06491b..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-21-21-06-54.gh-issue-91217.2cVma_.rst +++ /dev/null @@ -1 +0,0 @@ -Deprecate the xdrlib module. diff --git a/Misc/NEWS.d/next/Library/2022-04-22-08-25-18.gh-issue-91821.XwMkj0.rst b/Misc/NEWS.d/next/Library/2022-04-22-08-25-18.gh-issue-91821.XwMkj0.rst deleted file mode 100644 index 9d7f9d48c4c99..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-22-08-25-18.gh-issue-91821.XwMkj0.rst +++ /dev/null @@ -1 +0,0 @@ -Fix unstable ``test_from_tuple`` test in ``test_decimal.py``. diff --git a/Misc/NEWS.d/next/Library/2022-04-22-13-01-20.gh-issue-84461.rsCiTH.rst b/Misc/NEWS.d/next/Library/2022-04-22-13-01-20.gh-issue-84461.rsCiTH.rst deleted file mode 100644 index f1b8dc85ba82e..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-22-13-01-20.gh-issue-84461.rsCiTH.rst +++ /dev/null @@ -1,3 +0,0 @@ -Add :option:`--enable-wasm-pthreads` to enable pthreads support for WASM -builds. ``Emscripten/node`` no longer has threading enabled by default. -Include additional file systems. diff --git a/Misc/NEWS.d/next/Library/2022-04-22-19-11-31.gh-issue-91827.6P3gOI.rst b/Misc/NEWS.d/next/Library/2022-04-22-19-11-31.gh-issue-91827.6P3gOI.rst deleted file mode 100644 index 83b752277785b..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-22-19-11-31.gh-issue-91827.6P3gOI.rst +++ /dev/null @@ -1,3 +0,0 @@ -In the :mod:`tkinter` module add method ``info_patchlevel()`` which returns -the exact version of the Tcl library as a named tuple similar to -:data:`sys.version_info`. diff --git a/Misc/NEWS.d/next/Library/2022-04-23-03-24-00.gh-issue-91832.TyLi65.rst b/Misc/NEWS.d/next/Library/2022-04-23-03-24-00.gh-issue-91832.TyLi65.rst deleted file mode 100644 index 0ebf773546558..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-23-03-24-00.gh-issue-91832.TyLi65.rst +++ /dev/null @@ -1 +0,0 @@ -Add ``required`` attribute to :class:`argparse.Action` repr output. diff --git a/Misc/NEWS.d/next/Library/2022-04-23-08-06-36.gh-issue-91860.ityDjK.rst b/Misc/NEWS.d/next/Library/2022-04-23-08-06-36.gh-issue-91860.ityDjK.rst deleted file mode 100644 index d5e81c99887ff..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-23-08-06-36.gh-issue-91860.ityDjK.rst +++ /dev/null @@ -1,2 +0,0 @@ -Add :func:`typing.dataclass_transform`, implementing :pep:`681`. Patch by -Jelle Zijlstra. diff --git a/Misc/NEWS.d/next/Library/2022-04-25-14-18-01.gh-issue-91910.kY-JR0.rst b/Misc/NEWS.d/next/Library/2022-04-25-14-18-01.gh-issue-91910.kY-JR0.rst deleted file mode 100644 index f41f357ddfcc3..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-25-14-18-01.gh-issue-91910.kY-JR0.rst +++ /dev/null @@ -1 +0,0 @@ -Add missing f prefix to f-strings in error messages from the :mod:`multiprocessing` and :mod:`asyncio` modules. diff --git a/Misc/NEWS.d/next/Library/2022-04-25-18-30-20.gh-issue-64783.HFtERN.rst b/Misc/NEWS.d/next/Library/2022-04-25-18-30-20.gh-issue-64783.HFtERN.rst deleted file mode 100644 index 41814a6eb76da..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-25-18-30-20.gh-issue-64783.HFtERN.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fix :data:`signal.NSIG` value on FreeBSD to accept signal numbers greater than -32, like :data:`signal.SIGRTMIN` and :data:`signal.SIGRTMAX`. Patch by Victor -Stinner. diff --git a/Misc/NEWS.d/next/Library/2022-04-25-21-33-48.gh-issue-91401._Jo4Bu.rst b/Misc/NEWS.d/next/Library/2022-04-25-21-33-48.gh-issue-91401._Jo4Bu.rst deleted file mode 100644 index 7584710af30ff..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-25-21-33-48.gh-issue-91401._Jo4Bu.rst +++ /dev/null @@ -1,2 +0,0 @@ -Provide a way to disable :mod:`subprocess` use of ``vfork()`` just in case -it is ever needed and document the existing mechanism for ``posix_spawn()``. diff --git a/Misc/NEWS.d/next/Library/2022-04-26-09-09-07.gh-issue-68966.roapI2.rst b/Misc/NEWS.d/next/Library/2022-04-26-09-09-07.gh-issue-68966.roapI2.rst deleted file mode 100644 index 5c9ffbf09f005..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-26-09-09-07.gh-issue-68966.roapI2.rst +++ /dev/null @@ -1,3 +0,0 @@ -The :mod:`mailcap` module is now deprecated and will be removed in Python 3.13. -See :pep:`594` for the rationale and the :mod:`mimetypes` module for an -alternative. Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/Library/2022-04-26-18-02-44.gh-issue-91928.V0YveU.rst b/Misc/NEWS.d/next/Library/2022-04-26-18-02-44.gh-issue-91928.V0YveU.rst deleted file mode 100644 index 35838c7e31649..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-26-18-02-44.gh-issue-91928.V0YveU.rst +++ /dev/null @@ -1,3 +0,0 @@ -Add `datetime.UTC` alias for `datetime.timezone.utc`. - -Patch by Kabir Kwatra. diff --git a/Misc/NEWS.d/next/Library/2022-04-26-19-01-13.bpo-47029.qkT42X.rst b/Misc/NEWS.d/next/Library/2022-04-26-19-01-13.bpo-47029.qkT42X.rst deleted file mode 100644 index cc054673338f0..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-26-19-01-13.bpo-47029.qkT42X.rst +++ /dev/null @@ -1,4 +0,0 @@ -Always close the read end of the pipe used by :class:`multiprocessing.Queue` -*after* the last write of buffered data to the write end of the pipe to avoid -:exc:`BrokenPipeError` at garbage collection and at -:meth:`multiprocessing.Queue.close` calls. Patch by G?ry Ogam. diff --git a/Misc/NEWS.d/next/Library/2022-04-27-13-30-26.gh-issue-91954.cC7ga_.rst b/Misc/NEWS.d/next/Library/2022-04-27-13-30-26.gh-issue-91954.cC7ga_.rst deleted file mode 100644 index b63db25f32a4f..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-27-13-30-26.gh-issue-91954.cC7ga_.rst +++ /dev/null @@ -1,2 +0,0 @@ -Add *encoding* and *errors* arguments to :func:`subprocess.getoutput` and -:func:`subprocess.getstatusoutput`. diff --git a/Misc/NEWS.d/next/Library/2022-04-27-18-04-24.gh-issue-91952.9A4RXx.rst b/Misc/NEWS.d/next/Library/2022-04-27-18-04-24.gh-issue-91952.9A4RXx.rst deleted file mode 100644 index a0b48d16fe866..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-27-18-04-24.gh-issue-91952.9A4RXx.rst +++ /dev/null @@ -1 +0,0 @@ -Add ``encoding="locale"`` support to :meth:`TextIOWrapper.reconfigure`. diff --git a/Misc/NEWS.d/next/Library/2022-04-27-18-30-00.gh-issue-91984.LxAB11.rst b/Misc/NEWS.d/next/Library/2022-04-27-18-30-00.gh-issue-91984.LxAB11.rst deleted file mode 100644 index 82c2907bf4daa..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-27-18-30-00.gh-issue-91984.LxAB11.rst +++ /dev/null @@ -1 +0,0 @@ -Modified test strings in test_argparse.py to not contain trailing spaces before end of line. diff --git a/Misc/NEWS.d/next/Library/2022-04-27-19-45-58.gh-issue-91996.YEEIzk.rst b/Misc/NEWS.d/next/Library/2022-04-27-19-45-58.gh-issue-91996.YEEIzk.rst deleted file mode 100644 index 72d9a597a1a59..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-27-19-45-58.gh-issue-91996.YEEIzk.rst +++ /dev/null @@ -1 +0,0 @@ -New http.HTTPMethod enum to represent all the available HTTP request methods in a convenient way diff --git a/Misc/NEWS.d/next/Library/2022-04-28-18-45-58.gh-issue-88089.hu9kRk.rst b/Misc/NEWS.d/next/Library/2022-04-28-18-45-58.gh-issue-88089.hu9kRk.rst deleted file mode 100644 index 2665a472db627..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-28-18-45-58.gh-issue-88089.hu9kRk.rst +++ /dev/null @@ -1 +0,0 @@ -Add support for generic :class:`typing.NamedTuple`. diff --git a/Misc/NEWS.d/next/Library/2022-04-29-16-41-08.gh-issue-87390.3LNNCv.rst b/Misc/NEWS.d/next/Library/2022-04-29-16-41-08.gh-issue-87390.3LNNCv.rst deleted file mode 100644 index c368c1eb3be18..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-29-16-41-08.gh-issue-87390.3LNNCv.rst +++ /dev/null @@ -1,2 +0,0 @@ -Add an ``__unpacked__`` attribute to :class:`types.GenericAlias`. Patch by -Jelle Zijlstra. diff --git a/Misc/NEWS.d/next/Library/2022-04-29-18-15-23.gh-issue-92062.X2c_Rj.rst b/Misc/NEWS.d/next/Library/2022-04-29-18-15-23.gh-issue-92062.X2c_Rj.rst deleted file mode 100644 index 1ccb779a6d1d9..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-29-18-15-23.gh-issue-92062.X2c_Rj.rst +++ /dev/null @@ -1,2 +0,0 @@ -:class:`inspect.Parameter` now raises :exc:`ValueError` if ``name`` is -a keyword, in addition to the existing check that it is an identifier. diff --git a/Misc/NEWS.d/next/Library/2022-04-30-10-53-10.gh-issue-92049.5SEKoh.rst b/Misc/NEWS.d/next/Library/2022-04-30-10-53-10.gh-issue-92049.5SEKoh.rst deleted file mode 100644 index cad4621c65096..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-30-10-53-10.gh-issue-92049.5SEKoh.rst +++ /dev/null @@ -1,2 +0,0 @@ -Forbid pickling constants ``re._constants.SUCCESS`` etc. Previously, -pickling did not fail, but the result could not be unpickled. diff --git a/Misc/NEWS.d/next/Library/2022-05-01-21-45-41.gh-issue-92128.Di7VbE.rst b/Misc/NEWS.d/next/Library/2022-05-01-21-45-41.gh-issue-92128.Di7VbE.rst deleted file mode 100644 index e4d62d221d8a0..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-05-01-21-45-41.gh-issue-92128.Di7VbE.rst +++ /dev/null @@ -1,3 +0,0 @@ -Add :meth:`~object.__class_getitem__` to :class:`logging.LoggerAdapter` and -:class:`logging.StreamHandler`, allowing them to be parameterized at runtime. -Patch by Alex Waygood. diff --git a/Misc/NEWS.d/next/Library/2022-05-02-03-56-50.gh-issue-85984.RBivvc.rst b/Misc/NEWS.d/next/Library/2022-05-02-03-56-50.gh-issue-85984.RBivvc.rst deleted file mode 100644 index e54f29ad2cbe5..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-05-02-03-56-50.gh-issue-85984.RBivvc.rst +++ /dev/null @@ -1 +0,0 @@ -New function os.login_tty() for Unix. diff --git a/Misc/NEWS.d/next/Library/2022-05-02-09-09-47.gh-issue-91215.l1p7CJ.rst b/Misc/NEWS.d/next/Library/2022-05-02-09-09-47.gh-issue-91215.l1p7CJ.rst deleted file mode 100644 index 3a9897cb79642..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-05-02-09-09-47.gh-issue-91215.l1p7CJ.rst +++ /dev/null @@ -1,3 +0,0 @@ -For @dataclass, add weakref_slot. Default is False. If True, and if -slots=True, add a slot named "__weakref__", which will allow instances to be -weakref'd. Contributed by Eric V. Smith diff --git a/Misc/NEWS.d/next/Library/2022-05-02-18-19-46.gh-issue-90887.zQsmfp.rst b/Misc/NEWS.d/next/Library/2022-05-02-18-19-46.gh-issue-90887.zQsmfp.rst deleted file mode 100644 index 089f395105646..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-05-02-18-19-46.gh-issue-90887.zQsmfp.rst +++ /dev/null @@ -1 +0,0 @@ -Adding ``COPYFILE_STAT``, ``COPYFILE_ACL`` and ``COPYFILE_XATTR`` constants for :func:`os.fcopyfile` available in macOs. diff --git a/Misc/NEWS.d/next/Library/2022-05-02-23-08-02.gh-issue-92118.9Mm9g4.rst b/Misc/NEWS.d/next/Library/2022-05-02-23-08-02.gh-issue-92118.9Mm9g4.rst deleted file mode 100644 index b58ecdf40daf3..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-05-02-23-08-02.gh-issue-92118.9Mm9g4.rst +++ /dev/null @@ -1 +0,0 @@ -Fix a 3.11 regression in :func:`~contextlib.contextmanager`, which caused it to propagate exceptions with incorrect tracebacks. diff --git a/Misc/NEWS.d/next/Library/2022-05-03-12-11-27.gh-issue-80010.yG54RE.rst b/Misc/NEWS.d/next/Library/2022-05-03-12-11-27.gh-issue-80010.yG54RE.rst deleted file mode 100644 index bbcef471d2c0d..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-05-03-12-11-27.gh-issue-80010.yG54RE.rst +++ /dev/null @@ -1,3 +0,0 @@ -Add support for generalized ISO 8601 parsing to -:meth:`datetime.datetime.fromisoformat`, :meth:`datetime.date.fromisoformat` -and :meth:`datetime.time.fromisoformat`. Patch by Paul Ganssle. diff --git a/Misc/NEWS.d/next/Library/2022-05-03-17-33-46.gh-issue-92210.csDOQM.rst b/Misc/NEWS.d/next/Library/2022-05-03-17-33-46.gh-issue-92210.csDOQM.rst deleted file mode 100644 index 13f8197e69ea8..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-05-03-17-33-46.gh-issue-92210.csDOQM.rst +++ /dev/null @@ -1 +0,0 @@ -Port ``socket.__init__`` to Argument Clinic. Patch by Cinder. diff --git a/Misc/NEWS.d/next/Library/2022-05-03-19-06-38.gh-issue-67248.DK61Go.rst b/Misc/NEWS.d/next/Library/2022-05-03-19-06-38.gh-issue-67248.DK61Go.rst deleted file mode 100644 index 8237934ccda00..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-05-03-19-06-38.gh-issue-67248.DK61Go.rst +++ /dev/null @@ -1 +0,0 @@ -Sort the miscellaneous topics in Cmd.do_help() diff --git a/Misc/NEWS.d/next/Library/2022-05-04-11-54-37.gh-issue-92301.eqjoYX.rst b/Misc/NEWS.d/next/Library/2022-05-04-11-54-37.gh-issue-92301.eqjoYX.rst deleted file mode 100644 index b0b0502bf0a75..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-05-04-11-54-37.gh-issue-92301.eqjoYX.rst +++ /dev/null @@ -1,2 +0,0 @@ -Prefer ``close_range()`` to iterating over procfs for file descriptor -closing in :mod:`subprocess` for better performance. diff --git a/Misc/NEWS.d/next/Library/2022-05-05-17-35-01.gh-issue-90997.UV5_s0.rst b/Misc/NEWS.d/next/Library/2022-05-05-17-35-01.gh-issue-90997.UV5_s0.rst deleted file mode 100644 index a653bebfaf4a4..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-05-05-17-35-01.gh-issue-90997.UV5_s0.rst +++ /dev/null @@ -1,2 +0,0 @@ -Show the actual named values stored in inline caches when -``show_caches=True`` is passed to :mod:`dis` utilities. diff --git a/Misc/NEWS.d/next/Library/2022-05-05-19-25-09.gh-issue-92356.uvxWdu.rst b/Misc/NEWS.d/next/Library/2022-05-05-19-25-09.gh-issue-92356.uvxWdu.rst deleted file mode 100644 index 9c9566e5b9d71..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-05-05-19-25-09.gh-issue-92356.uvxWdu.rst +++ /dev/null @@ -1 +0,0 @@ -Fixed a performance regression in ctypes function calls. diff --git a/Misc/NEWS.d/next/Library/2022-05-05-20-40-45.bpo-78157.IA_9na.rst b/Misc/NEWS.d/next/Library/2022-05-05-20-40-45.bpo-78157.IA_9na.rst deleted file mode 100644 index 9e10acaf9a1e6..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-05-05-20-40-45.bpo-78157.IA_9na.rst +++ /dev/null @@ -1,3 +0,0 @@ -Deprecate nested classes in enum definitions becoming members -- in 3.13 -they will be normal classes; add `member` and `nonmember` functions to allow -control over results now. diff --git a/Misc/NEWS.d/next/Library/2022-05-05-22-46-52.gh-issue-92332.Fv9CJx.rst b/Misc/NEWS.d/next/Library/2022-05-05-22-46-52.gh-issue-92332.Fv9CJx.rst deleted file mode 100644 index 1d055bb2b99f4..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-05-05-22-46-52.gh-issue-92332.Fv9CJx.rst +++ /dev/null @@ -1,2 +0,0 @@ -Deprecate :class:`typing.Text` (removal of the class is currently not -planned). Patch by Alex Waygood. diff --git a/Misc/NEWS.d/next/Library/2022-05-06-09-48-07.gh-issue-90997.4PmCgX.rst b/Misc/NEWS.d/next/Library/2022-05-06-09-48-07.gh-issue-90997.4PmCgX.rst deleted file mode 100644 index 0e683070806c2..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-05-06-09-48-07.gh-issue-90997.4PmCgX.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix an issue where :mod:`dis` utilities may interpret populated inline cache -entries as valid instructions. diff --git a/Misc/NEWS.d/next/Library/2022-05-06-13-53-10.gh-issue-87901.NnkUVr.rst b/Misc/NEWS.d/next/Library/2022-05-06-13-53-10.gh-issue-87901.NnkUVr.rst deleted file mode 100644 index 7f50dfbce9534..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-05-06-13-53-10.gh-issue-87901.NnkUVr.rst +++ /dev/null @@ -1 +0,0 @@ -Add the *encoding* parameter to :func:`os.popen`. diff --git a/Misc/NEWS.d/next/Security/2022-05-04-14-32-24.gh-issue-57684.HrlDrM.rst b/Misc/NEWS.d/next/Security/2022-05-04-14-32-24.gh-issue-57684.HrlDrM.rst deleted file mode 100644 index f7cddccdaa782..0000000000000 --- a/Misc/NEWS.d/next/Security/2022-05-04-14-32-24.gh-issue-57684.HrlDrM.rst +++ /dev/null @@ -1,3 +0,0 @@ -Add the :option:`-P` command line option and the :envvar:`PYTHONSAFEPATH` -environment variable to not prepend a potentially unsafe path to -:data:`sys.path`. Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/Tests/2022-01-24-21-31-09.bpo-29890.zEG-ra.rst b/Misc/NEWS.d/next/Tests/2022-01-24-21-31-09.bpo-29890.zEG-ra.rst deleted file mode 100644 index 38a06a2f9b6be..0000000000000 --- a/Misc/NEWS.d/next/Tests/2022-01-24-21-31-09.bpo-29890.zEG-ra.rst +++ /dev/null @@ -1,2 +0,0 @@ -Add tests for :class:`ipaddress.IPv4Interface` and :class:`ipaddress.IPv6Interface` construction with tuple arguments. -Original patch and tests by louisom. diff --git a/Misc/NEWS.d/next/Tests/2022-03-24-13-35-01.bpo-47109.FjKQCE.rst b/Misc/NEWS.d/next/Tests/2022-03-24-13-35-01.bpo-47109.FjKQCE.rst deleted file mode 100644 index d0a402f3a225d..0000000000000 --- a/Misc/NEWS.d/next/Tests/2022-03-24-13-35-01.bpo-47109.FjKQCE.rst +++ /dev/null @@ -1,3 +0,0 @@ -Test for :mod:`ctypes.macholib.dyld`, :mod:`ctypes.macholib.dylib`, and -:mod:`ctypes.macholib.framework` are brought from manual pre-:mod:`unittest` -times to :mod:`ctypes.test` location and structure. Patch by Oleg Iarygin. diff --git a/Misc/NEWS.d/next/Tests/2022-04-06-10-16-27.bpo-40280.KT5Apg.rst b/Misc/NEWS.d/next/Tests/2022-04-06-10-16-27.bpo-40280.KT5Apg.rst deleted file mode 100644 index 9fcb4c9a8b3b0..0000000000000 --- a/Misc/NEWS.d/next/Tests/2022-04-06-10-16-27.bpo-40280.KT5Apg.rst +++ /dev/null @@ -1 +0,0 @@ -Threading tests are now skipped on WASM targets without pthread support. diff --git a/Misc/NEWS.d/next/Tests/2022-04-16-17-54-05.gh-issue-91607.FnXjtW.rst b/Misc/NEWS.d/next/Tests/2022-04-16-17-54-05.gh-issue-91607.FnXjtW.rst deleted file mode 100644 index 32839a826a41e..0000000000000 --- a/Misc/NEWS.d/next/Tests/2022-04-16-17-54-05.gh-issue-91607.FnXjtW.rst +++ /dev/null @@ -1 +0,0 @@ -Fix ``test_concurrent_futures`` to test the correct multiprocessing start method context in several cases where the test logic mixed this up. diff --git a/Misc/NEWS.d/next/Tests/2022-04-22-19-00-00.gh-issue-91752.Ji27dd.rst b/Misc/NEWS.d/next/Tests/2022-04-22-19-00-00.gh-issue-91752.Ji27dd.rst deleted file mode 100644 index c02c1f491cc3e..0000000000000 --- a/Misc/NEWS.d/next/Tests/2022-04-22-19-00-00.gh-issue-91752.Ji27dd.rst +++ /dev/null @@ -1 +0,0 @@ -Added @requires_zlib to test.test_tools.test_freeze.TestFreeze. diff --git a/Misc/NEWS.d/next/Tests/2022-04-25-11-16-36.gh-issue-91904.13Uvrz.rst b/Misc/NEWS.d/next/Tests/2022-04-25-11-16-36.gh-issue-91904.13Uvrz.rst deleted file mode 100644 index 31ddfc312866b..0000000000000 --- a/Misc/NEWS.d/next/Tests/2022-04-25-11-16-36.gh-issue-91904.13Uvrz.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix initialization of :envvar:`PYTHONREGRTEST_UNICODE_GUARD` which prevented -running regression tests on non-UTF-8 locale. diff --git a/Misc/NEWS.d/next/Tests/2022-05-02-20-15-54.gh-issue-84461.DhxllI.rst b/Misc/NEWS.d/next/Tests/2022-05-02-20-15-54.gh-issue-84461.DhxllI.rst deleted file mode 100644 index 4daae71060346..0000000000000 --- a/Misc/NEWS.d/next/Tests/2022-05-02-20-15-54.gh-issue-84461.DhxllI.rst +++ /dev/null @@ -1 +0,0 @@ -When multiprocessing is enabled, libregrtest can now use a Python executable other than :code:`sys.executable` via the ``--python`` flag. diff --git a/Misc/NEWS.d/next/Tests/2022-05-02-20-57-04.gh-issue-92169.Xi4NGV.rst b/Misc/NEWS.d/next/Tests/2022-05-02-20-57-04.gh-issue-92169.Xi4NGV.rst deleted file mode 100644 index 3809ed4f5a1a1..0000000000000 --- a/Misc/NEWS.d/next/Tests/2022-05-02-20-57-04.gh-issue-92169.Xi4NGV.rst +++ /dev/null @@ -1,2 +0,0 @@ -Use ``warnings_helper.import_deprecated()`` to import deprecated modules -uniformly in tests. Patch by Hugo van Kemenade. diff --git a/Misc/NEWS.d/next/Tools-Demos/2022-04-14-18-11-46.gh-issue-91551.l_nNT-.rst b/Misc/NEWS.d/next/Tools-Demos/2022-04-14-18-11-46.gh-issue-91551.l_nNT-.rst deleted file mode 100644 index 95ee25f6e02ce..0000000000000 --- a/Misc/NEWS.d/next/Tools-Demos/2022-04-14-18-11-46.gh-issue-91551.l_nNT-.rst +++ /dev/null @@ -1 +0,0 @@ -Remove the ancient Pynche color editor. It has moved to https://gitlab.com/warsaw/pynche diff --git a/Misc/NEWS.d/next/Tools-Demos/2022-04-18-12-52-16.gh-issue-91575.fK1TEh.rst b/Misc/NEWS.d/next/Tools-Demos/2022-04-18-12-52-16.gh-issue-91575.fK1TEh.rst deleted file mode 100644 index 3ed34226e070e..0000000000000 --- a/Misc/NEWS.d/next/Tools-Demos/2022-04-18-12-52-16.gh-issue-91575.fK1TEh.rst +++ /dev/null @@ -1,3 +0,0 @@ -Add script ``Tools/scripts/generate_re_casefix.py`` and the make target -``regen-re`` for generating additional data for case-insensitive matching -according to the current Unicode version. diff --git a/Misc/NEWS.d/next/Tools-Demos/2022-04-20-14-26-14.gh-issue-91583.200qI0.rst b/Misc/NEWS.d/next/Tools-Demos/2022-04-20-14-26-14.gh-issue-91583.200qI0.rst deleted file mode 100644 index bdfa71100f95a..0000000000000 --- a/Misc/NEWS.d/next/Tools-Demos/2022-04-20-14-26-14.gh-issue-91583.200qI0.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix regression in the code generated by Argument Clinic for functions with -the ``defining_class`` parameter. diff --git a/Misc/NEWS.d/next/Windows/2020-06-04-10-42-04.bpo-40859.isKSw7.rst b/Misc/NEWS.d/next/Windows/2020-06-04-10-42-04.bpo-40859.isKSw7.rst deleted file mode 100644 index ef4c727ad2866..0000000000000 --- a/Misc/NEWS.d/next/Windows/2020-06-04-10-42-04.bpo-40859.isKSw7.rst +++ /dev/null @@ -1 +0,0 @@ -Update Windows build to use xz-5.2.5 diff --git a/Misc/NEWS.d/next/Windows/2022-03-13-20-35-41.bpo-46785.Pnknyl.rst b/Misc/NEWS.d/next/Windows/2022-03-13-20-35-41.bpo-46785.Pnknyl.rst deleted file mode 100644 index 0a87abd77c8ff..0000000000000 --- a/Misc/NEWS.d/next/Windows/2022-03-13-20-35-41.bpo-46785.Pnknyl.rst +++ /dev/null @@ -1 +0,0 @@ -Fix race condition between :func:`os.stat` and unlinking a file on Windows, by using errors codes returned by ``FindFirstFileW()`` when appropriate in ``win32_xstat_impl``. diff --git a/Misc/NEWS.d/next/Windows/2022-03-28-07-01-31.bpo-46907.Ou3G6Z.rst b/Misc/NEWS.d/next/Windows/2022-03-28-07-01-31.bpo-46907.Ou3G6Z.rst deleted file mode 100644 index 36be10057e497..0000000000000 --- a/Misc/NEWS.d/next/Windows/2022-03-28-07-01-31.bpo-46907.Ou3G6Z.rst +++ /dev/null @@ -1 +0,0 @@ -Update Windows installer to use SQLite 3.38.2. diff --git a/Misc/NEWS.d/next/Windows/2022-04-06-15-16-37.bpo-47239.B1HP7i.rst b/Misc/NEWS.d/next/Windows/2022-04-06-15-16-37.bpo-47239.B1HP7i.rst deleted file mode 100644 index d8018888c2c48..0000000000000 --- a/Misc/NEWS.d/next/Windows/2022-04-06-15-16-37.bpo-47239.B1HP7i.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fixed --list and --list-paths output for :ref:`launcher` when used in an -active virtual environment. diff --git a/Misc/NEWS.d/next/Windows/2022-04-27-19-36-56.bpo-46907.lfurlP.rst b/Misc/NEWS.d/next/Windows/2022-04-27-19-36-56.bpo-46907.lfurlP.rst deleted file mode 100644 index 88ea9f931188e..0000000000000 --- a/Misc/NEWS.d/next/Windows/2022-04-27-19-36-56.bpo-46907.lfurlP.rst +++ /dev/null @@ -1 +0,0 @@ -Update Windows installer to use SQLite 3.38.3. diff --git a/Misc/NEWS.d/next/macOS/2022-05-05-06-21-39.bpo-46907.dkgFPk.rst b/Misc/NEWS.d/next/macOS/2022-05-05-06-21-39.bpo-46907.dkgFPk.rst deleted file mode 100644 index f530218c09b18..0000000000000 --- a/Misc/NEWS.d/next/macOS/2022-05-05-06-21-39.bpo-46907.dkgFPk.rst +++ /dev/null @@ -1 +0,0 @@ -Update macOS installer to SQLite 3.38.4. From webhook-mailer at python.org Sat May 7 22:48:52 2022 From: webhook-mailer at python.org (pablogsal) Date: Sun, 08 May 2022 02:48:52 -0000 Subject: [Python-checkins] Update the SOURCE_URI in pyspecific.py to point to the new branch Message-ID: https://github.com/python/cpython/commit/09f0ad48efd93b81a2e463d8efc46a45f50054dd commit: 09f0ad48efd93b81a2e463d8efc46a45f50054dd branch: main author: Pablo Galindo committer: pablogsal date: 2022-05-08T03:48:31+01:00 summary: Update the SOURCE_URI in pyspecific.py to point to the new branch files: M Doc/tools/extensions/pyspecific.py diff --git a/Doc/tools/extensions/pyspecific.py b/Doc/tools/extensions/pyspecific.py index b02e31dc88e5c..12b98f49f69f5 100644 --- a/Doc/tools/extensions/pyspecific.py +++ b/Doc/tools/extensions/pyspecific.py @@ -45,7 +45,7 @@ ISSUE_URI = 'https://bugs.python.org/issue?@action=redirect&bpo=%s' GH_ISSUE_URI = 'https://github.com/python/cpython/issues/%s' -SOURCE_URI = 'https://github.com/python/cpython/tree/3.11/%s' +SOURCE_URI = 'https://github.com/python/cpython/tree/main/%s' # monkey-patch reST parser to disable alphabetic and roman enumerated lists from docutils.parsers.rst.states import Body From webhook-mailer at python.org Sat May 7 23:01:41 2022 From: webhook-mailer at python.org (pablogsal) Date: Sun, 08 May 2022 03:01:41 -0000 Subject: [Python-checkins] Add the 3.11 branch to the CI files Message-ID: https://github.com/python/cpython/commit/9478b263a3279ebd445d722b1fdcdd1575bed652 commit: 9478b263a3279ebd445d722b1fdcdd1575bed652 branch: main author: Pablo Galindo committer: pablogsal date: 2022-05-08T04:01:20+01:00 summary: Add the 3.11 branch to the CI files files: M .azure-pipelines/ci.yml M .azure-pipelines/pr.yml M .github/workflows/build.yml M .github/workflows/build_msi.yml M .github/workflows/doc.yml diff --git a/.azure-pipelines/ci.yml b/.azure-pipelines/ci.yml index 199547432be29..9e9ce2108ed81 100644 --- a/.azure-pipelines/ci.yml +++ b/.azure-pipelines/ci.yml @@ -1,7 +1,7 @@ variables: coverage: false -trigger: ['main', '3.10', '3.9', '3.8', '3.7'] +trigger: ['main', '3.11', '3.10', '3.9', '3.8', '3.7'] jobs: - job: Prebuild diff --git a/.azure-pipelines/pr.yml b/.azure-pipelines/pr.yml index b96a192005a42..c3ecc67057280 100644 --- a/.azure-pipelines/pr.yml +++ b/.azure-pipelines/pr.yml @@ -1,7 +1,7 @@ variables: coverage: false -pr: ['main', '3.10', '3.9', '3.8', '3.7'] +pr: ['main', '3.11', '3.10', '3.9', '3.8', '3.7'] jobs: - job: Prebuild diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b489335903772..e04633b711f2f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -8,6 +8,7 @@ on: push: branches: - 'main' + - '3.11' - '3.10' - '3.9' - '3.8' @@ -15,6 +16,7 @@ on: pull_request: branches: - 'main' + - '3.11' - '3.10' - '3.9' - '3.8' diff --git a/.github/workflows/build_msi.yml b/.github/workflows/build_msi.yml index cba1e51ef27d3..ec18735e9b9fa 100644 --- a/.github/workflows/build_msi.yml +++ b/.github/workflows/build_msi.yml @@ -5,6 +5,7 @@ on: push: branches: - 'main' + - '3.11' - '3.10' - '3.9' - '3.8' @@ -14,6 +15,7 @@ on: pull_request: branches: - 'main' + - '3.11' - '3.10' - '3.9' - '3.8' diff --git a/.github/workflows/doc.yml b/.github/workflows/doc.yml index 3ed66e74b8954..0d1b85d84746a 100644 --- a/.github/workflows/doc.yml +++ b/.github/workflows/doc.yml @@ -5,6 +5,7 @@ on: #push: # branches: # - 'main' + # - '3.11' # - '3.10' # - '3.9' # - '3.8' @@ -14,6 +15,7 @@ on: pull_request: branches: - 'main' + - '3.11' - '3.10' - '3.9' - '3.8' From webhook-mailer at python.org Sat May 7 23:02:20 2022 From: webhook-mailer at python.org (pablogsal) Date: Sun, 08 May 2022 03:02:20 -0000 Subject: [Python-checkins] Add the 3.11 branch to the CI files Message-ID: https://github.com/python/cpython/commit/21282da0206e5927cff48e835a3d38b82e05dd08 commit: 21282da0206e5927cff48e835a3d38b82e05dd08 branch: 3.11 author: Pablo Galindo committer: pablogsal date: 2022-05-08T04:02:02+01:00 summary: Add the 3.11 branch to the CI files files: M .azure-pipelines/ci.yml M .azure-pipelines/pr.yml M .github/workflows/build.yml M .github/workflows/build_msi.yml M .github/workflows/doc.yml diff --git a/.azure-pipelines/ci.yml b/.azure-pipelines/ci.yml index 199547432be29..9e9ce2108ed81 100644 --- a/.azure-pipelines/ci.yml +++ b/.azure-pipelines/ci.yml @@ -1,7 +1,7 @@ variables: coverage: false -trigger: ['main', '3.10', '3.9', '3.8', '3.7'] +trigger: ['main', '3.11', '3.10', '3.9', '3.8', '3.7'] jobs: - job: Prebuild diff --git a/.azure-pipelines/pr.yml b/.azure-pipelines/pr.yml index b96a192005a42..c3ecc67057280 100644 --- a/.azure-pipelines/pr.yml +++ b/.azure-pipelines/pr.yml @@ -1,7 +1,7 @@ variables: coverage: false -pr: ['main', '3.10', '3.9', '3.8', '3.7'] +pr: ['main', '3.11', '3.10', '3.9', '3.8', '3.7'] jobs: - job: Prebuild diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b489335903772..e04633b711f2f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -8,6 +8,7 @@ on: push: branches: - 'main' + - '3.11' - '3.10' - '3.9' - '3.8' @@ -15,6 +16,7 @@ on: pull_request: branches: - 'main' + - '3.11' - '3.10' - '3.9' - '3.8' diff --git a/.github/workflows/build_msi.yml b/.github/workflows/build_msi.yml index cba1e51ef27d3..ec18735e9b9fa 100644 --- a/.github/workflows/build_msi.yml +++ b/.github/workflows/build_msi.yml @@ -5,6 +5,7 @@ on: push: branches: - 'main' + - '3.11' - '3.10' - '3.9' - '3.8' @@ -14,6 +15,7 @@ on: pull_request: branches: - 'main' + - '3.11' - '3.10' - '3.9' - '3.8' diff --git a/.github/workflows/doc.yml b/.github/workflows/doc.yml index 3ed66e74b8954..0d1b85d84746a 100644 --- a/.github/workflows/doc.yml +++ b/.github/workflows/doc.yml @@ -5,6 +5,7 @@ on: #push: # branches: # - 'main' + # - '3.11' # - '3.10' # - '3.9' # - '3.8' @@ -14,6 +15,7 @@ on: pull_request: branches: - 'main' + - '3.11' - '3.10' - '3.9' - '3.8' From webhook-mailer at python.org Sat May 7 23:32:28 2022 From: webhook-mailer at python.org (pablogsal) Date: Sun, 08 May 2022 03:32:28 -0000 Subject: [Python-checkins] [3.11] Add CI step to check changes in the exported ABI (#92442) Message-ID: https://github.com/python/cpython/commit/e89c01eac7731d7cb54d43252dbc3d3f3a040c53 commit: e89c01eac7731d7cb54d43252dbc3d3f3a040c53 branch: 3.11 author: Pablo Galindo Salgado committer: pablogsal date: 2022-05-08T04:32:17+01:00 summary: [3.11] Add CI step to check changes in the exported ABI (#92442) files: A Doc/data/python3.11.abi M .github/workflows/build.yml M Makefile.pre.in diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e04633b711f2f..8de17345df6fd 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -56,6 +56,28 @@ jobs: git diff --name-only origin/$GITHUB_BASE_REF.. | grep -qE '(ssl|hashlib|hmac|^.github)' && echo '::set-output name=run_ssl_tests::true' || true fi + check_abi: + name: 'Check if the ABI has changed' + runs-on: ubuntu-20.04 + needs: check_source + if: needs.check_source.outputs.run_tests == 'true' + steps: + - uses: actions/checkout at v2 + - uses: actions/setup-python at v2 + - name: Install Dependencies + run: | + sudo ./.github/workflows/posix-deps-apt.sh + sudo apt-get install -yq abigail-tools + - name: Build CPython + env: + CFLAGS: -g3 -O0 + run: | + # Build Python with the libpython dynamic library + ./configure --enable-shared + make -j4 + - name: Check for changes in the ABI + run: make check-abidump + check_generated_files: name: 'Check if generated files are up to date' runs-on: ubuntu-latest diff --git a/Doc/data/python3.11.abi b/Doc/data/python3.11.abi new file mode 100644 index 0000000000000..b0360f4121bc6 --- /dev/null +++ b/Doc/data/python3.11.abi @@ -0,0 +1,16566 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Makefile.pre.in b/Makefile.pre.in index e45d4fe3ecb6e..f4b23f6e76570 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -1198,6 +1198,14 @@ regen-global-objects: $(srcdir)/Tools/scripts/generate_global_objects.py ############################################################################ # ABI +regen-abidump: all + @$(MKDIR_P) $(srcdir)/Doc/data/ + abidw "libpython$(LDVERSION).so" --no-architecture --out-file $(srcdir)/Doc/data/python$(LDVERSION).abi.new + @$(UPDATE_FILE) $(srcdir)/Doc/data/python$(LDVERSION).abi $(srcdir)/Doc/data/python$(LDVERSION).abi.new + +check-abidump: all + abidiff $(srcdir)/Doc/data/python$(LDVERSION).abi "libpython$(LDVERSION).so" --drop-private-types --no-architecture --no-added-syms + regen-limited-abi: all $(RUNSHARED) ./$(BUILDPYTHON) $(srcdir)/Tools/scripts/stable_abi.py --generate-all $(srcdir)/Misc/stable_abi.toml From webhook-mailer at python.org Sun May 8 00:04:23 2022 From: webhook-mailer at python.org (miss-islington) Date: Sun, 08 May 2022 04:04:23 -0000 Subject: [Python-checkins] gh-92308: Add Pending Removal section to 3.11 What's New (GH-92309) Message-ID: https://github.com/python/cpython/commit/565a5a32962c16aa7d494002b625d308d044a72f commit: 565a5a32962c16aa7d494002b625d308d044a72f branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-07T21:04:04-07:00 summary: gh-92308: Add Pending Removal section to 3.11 What's New (GH-92309) * gh-92308: Add Pending Removal section to 3.11 What's New * Use compact list; drop attributions * Add short text, and also missing PyUnicode_InternImmortal * Fix formatting * markup fix * Update Doc/whatsnew/3.11.rst Co-authored-by: Victor Stinner * Apply suggestions from code review Co-authored-by: Victor Stinner Co-authored-by: Victor Stinner Co-authored-by: Ezio Melotti (cherry picked from commit 0924b95f6e678beaf4a059d679515956bac608fb) Co-authored-by: Erlend Egeberg Aasland files: M Doc/whatsnew/3.11.rst diff --git a/Doc/whatsnew/3.11.rst b/Doc/whatsnew/3.11.rst index b9871f7ef69f9..c4e8e6f9a1051 100644 --- a/Doc/whatsnew/3.11.rst +++ b/Doc/whatsnew/3.11.rst @@ -1217,6 +1217,61 @@ Deprecated (Contributed by Alex Waygood in :gh:`92332`.) +Pending Removal in Python 3.12 +============================== + +The following APIs have been deprecated in earlier Python releases, +and will be removed in Python 3.12. + +Python API: + +* :class:`pkgutil.ImpImporter` +* :class:`pkgutil.ImpLoader` +* :envvar:`PYTHONTHREADDEBUG` +* :func:`importlib.find_loader` +* :func:`importlib.util.module_for_loader` +* :func:`importlib.util.set_loader_wrapper` +* :func:`importlib.util.set_package_wrapper` +* :meth:`importlib.abc.Loader.module_repr` +* :meth:`importlib.abc.Loadermodule_repr` +* :meth:`importlib.abc.MetaPathFinder.find_module` +* :meth:`importlib.abc.MetaPathFinder.find_module` +* :meth:`importlib.abc.PathEntryFinder.find_loader` +* :meth:`importlib.abc.PathEntryFinder.find_module` +* :meth:`importlib.machinery.BuiltinImporter.find_module` +* :meth:`importlib.machinery.BuiltinLoader.module_repr` +* :meth:`importlib.machinery.FileFinder.find_loader` +* :meth:`importlib.machinery.FileFinder.find_module` +* :meth:`importlib.machinery.FrozenImporter.find_module` +* :meth:`importlib.machinery.FrozenLoader.module_repr` +* :meth:`importlib.machinery.PathFinder.find_module` +* :meth:`importlib.machinery.WindowsRegistryFinder.find_module` +* :meth:`pathlib.Path.link_to` +* The entire :ref:`distutils namespace ` +* :func:`cgi.log` +* :func:`sqlite3.OptimizedUnicode` +* :func:`sqlite3.enable_shared_cache` + +C API: + +* :c:func:`PyUnicode_AS_DATA` +* :c:func:`PyUnicode_AS_UNICODE` +* :c:func:`PyUnicode_AsUnicodeAndSize` +* :c:func:`PyUnicode_AsUnicode` +* :c:func:`PyUnicode_FromUnicode` +* :c:func:`PyUnicode_GET_DATA_SIZE` +* :c:func:`PyUnicode_GET_SIZE` +* :c:func:`PyUnicode_GetSize` +* :c:func:`PyUnicode_IS_COMPACT` +* :c:func:`PyUnicode_IS_READY` +* :c:func:`PyUnicode_READY` +* :c:func:`Py_UNICODE_WSTR_LENGTH` +* :c:func:`_PyUnicode_AsUnicode` +* :c:macro:`PyUnicode_WCHAR_KIND` +* :c:type:`PyUnicodeObject` +* :c:func:`PyUnicode_InternImmortal()` + + Removed ======= From webhook-mailer at python.org Sun May 8 00:12:58 2022 From: webhook-mailer at python.org (miss-islington) Date: Sun, 08 May 2022 04:12:58 -0000 Subject: [Python-checkins] gh-88279: Fix compiler warning for using deprecated PySys_SetArgvEx (GH-92428) Message-ID: https://github.com/python/cpython/commit/14bd6df0940e005c57745abf550c83f046de9a03 commit: 14bd6df0940e005c57745abf550c83f046de9a03 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-07T21:12:52-07:00 summary: gh-88279: Fix compiler warning for using deprecated PySys_SetArgvEx (GH-92428) (cherry picked from commit bd030b633f98ea5d9f93ef0105a51d2faf67070d) Co-authored-by: Serhiy Storchaka files: M Python/sysmodule.c diff --git a/Python/sysmodule.c b/Python/sysmodule.c index edd1d1f23fdea..4f8b4cc17f2c1 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -3302,7 +3302,10 @@ PySys_SetArgvEx(int argc, wchar_t **argv, int updatepath) void PySys_SetArgv(int argc, wchar_t **argv) { +_Py_COMP_DIAG_PUSH +_Py_COMP_DIAG_IGNORE_DEPR_DECLS PySys_SetArgvEx(argc, argv, Py_IsolatedFlag == 0); +_Py_COMP_DIAG_POP } /* Reimplementation of PyFile_WriteString() no calling indirectly From webhook-mailer at python.org Sun May 8 08:44:23 2022 From: webhook-mailer at python.org (pablogsal) Date: Sun, 08 May 2022 12:44:23 -0000 Subject: [Python-checkins] Update CPyhton configuration for 3.12 (#92451) Message-ID: https://github.com/python/cpython/commit/d284e8b3e351c69406519d5afdcdbed7fbbe0190 commit: d284e8b3e351c69406519d5afdcdbed7fbbe0190 branch: main author: Dong-hee Na committer: pablogsal date: 2022-05-08T13:44:12+01:00 summary: Update CPyhton configuration for 3.12 (#92451) * Update CPyhton configuration for 3.12 * Fix PC/pyconfig.h * Add expect failure files: M Lib/test/test_enum.py M PC/pyconfig.h M configure diff --git a/Lib/test/test_enum.py b/Lib/test/test_enum.py index f9e09027228b4..286d631d793e4 100644 --- a/Lib/test/test_enum.py +++ b/Lib/test/test_enum.py @@ -339,6 +339,7 @@ def test_changing_member_fails(self): python_version >= (3, 12), '__contains__ now returns True/False for all inputs', ) + @unittest.expectedFailure def test_contains_er(self): MainEnum = self.MainEnum self.assertIn(MainEnum.third, MainEnum) @@ -360,6 +361,7 @@ class OtherEnum(Enum): python_version < (3, 12), '__contains__ works only with enum memmbers before 3.12', ) + @unittest.expectedFailure def test_contains_tf(self): MainEnum = self.MainEnum self.assertIn(MainEnum.first, MainEnum) @@ -2926,6 +2928,7 @@ def test_pickle(self): python_version >= (3, 12), '__contains__ now returns True/False for all inputs', ) + @unittest.expectedFailure def test_contains_er(self): Open = self.Open Color = self.Color @@ -2948,6 +2951,7 @@ def test_contains_er(self): python_version < (3, 12), '__contains__ only works with enum memmbers before 3.12', ) + @unittest.expectedFailure def test_contains_tf(self): Open = self.Open Color = self.Color @@ -3486,6 +3490,7 @@ def test_programatic_function_from_empty_tuple(self): python_version >= (3, 12), '__contains__ now returns True/False for all inputs', ) + @unittest.expectedFailure def test_contains_er(self): Open = self.Open Color = self.Color @@ -3510,6 +3515,7 @@ def test_contains_er(self): python_version < (3, 12), '__contains__ only works with enum memmbers before 3.12', ) + @unittest.expectedFailure def test_contains_tf(self): Open = self.Open Color = self.Color diff --git a/PC/pyconfig.h b/PC/pyconfig.h index 5a96a4ebe51ee..9dfe71bacabd1 100644 --- a/PC/pyconfig.h +++ b/PC/pyconfig.h @@ -261,11 +261,11 @@ Py_NO_ENABLE_SHARED to find out. Also support MS_NO_COREDLL for b/w compat */ file in their Makefile (other compilers are generally taken care of by distutils.) */ # if defined(_DEBUG) -# pragma comment(lib,"python311_d.lib") +# pragma comment(lib,"python312_d.lib") # elif defined(Py_LIMITED_API) # pragma comment(lib,"python3.lib") # else -# pragma comment(lib,"python311.lib") +# pragma comment(lib,"python312.lib") # endif /* _DEBUG */ # endif /* _MSC_VER */ # endif /* Py_BUILD_CORE */ diff --git a/configure b/configure index b57c6f3a45abe..e956de9912301 100755 --- a/configure +++ b/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for python 3.11. +# Generated by GNU Autoconf 2.69 for python 3.12. # # Report bugs to . # @@ -580,8 +580,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='python' PACKAGE_TARNAME='python' -PACKAGE_VERSION='3.11' -PACKAGE_STRING='python 3.11' +PACKAGE_VERSION='3.12' +PACKAGE_STRING='python 3.12' PACKAGE_BUGREPORT='https://bugs.python.org/' PACKAGE_URL='' @@ -1651,7 +1651,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures python 3.11 to adapt to many kinds of systems. +\`configure' configures python 3.12 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1717,7 +1717,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of python 3.11:";; + short | recursive ) echo "Configuration of python 3.12:";; esac cat <<\_ACEOF @@ -1759,9 +1759,9 @@ Optional Features: Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) - --with-build-python=python3.11 + --with-build-python=python3.12 path to build python binary for cross compiling - (default: _bootstrap_python or python3.11) + (default: _bootstrap_python or python3.12) --with-pkg-config=[yes|no|check] use pkg-config to detect build options (default is check) @@ -1984,7 +1984,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -python configure 3.11 +python configure 3.12 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -2693,7 +2693,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by python $as_me 3.11, which was +It was created by python $as_me 3.12, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -3371,7 +3371,7 @@ rm confdefs.h mv confdefs.h.new confdefs.h -VERSION=3.11 +VERSION=3.12 # Version number of Python's own shared library file. @@ -25586,7 +25586,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by python $as_me 3.11, which was +This file was extended by python $as_me 3.12, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -25648,7 +25648,7 @@ _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -python config.status 3.11 +python config.status 3.12 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" From webhook-mailer at python.org Sun May 8 08:50:59 2022 From: webhook-mailer at python.org (corona10) Date: Sun, 08 May 2022 12:50:59 -0000 Subject: [Python-checkins] gh-92448: Update the documentation builder to render the GitHub issue. (GH-92449) Message-ID: https://github.com/python/cpython/commit/45e1721d100bab09510ccf9da49f14ca5cc268f4 commit: 45e1721d100bab09510ccf9da49f14ca5cc268f4 branch: main author: Dong-hee Na committer: corona10 date: 2022-05-08T21:50:40+09:00 summary: gh-92448: Update the documentation builder to render the GitHub issue. (GH-92449) files: M Doc/tools/extensions/pyspecific.py M Misc/NEWS.d/3.10.0a6.rst M Misc/NEWS.d/3.10.0a7.rst M Misc/NEWS.d/3.10.0b1.rst M Misc/NEWS.d/3.11.0a1.rst M Misc/NEWS.d/3.11.0b1.rst M Misc/NEWS.d/3.7.0a3.rst M Misc/NEWS.d/3.8.0a1.rst M Misc/NEWS.d/3.9.0a1.rst diff --git a/Doc/tools/extensions/pyspecific.py b/Doc/tools/extensions/pyspecific.py index 12b98f49f69f5..2e122b5607936 100644 --- a/Doc/tools/extensions/pyspecific.py +++ b/Doc/tools/extensions/pyspecific.py @@ -429,7 +429,8 @@ def run(self): # Support for including Misc/NEWS -issue_re = re.compile('(?:[Ii]ssue #|bpo-)([0-9]+)') +issue_re = re.compile('(?:[Ii]ssue #|bpo-)([0-9]+)', re.I) +gh_issue_re = re.compile('(?:gh-issue-|gh-)([0-9]+)', re.I) whatsnew_re = re.compile(r"(?im)^what's new in (.*?)\??$") @@ -456,9 +457,9 @@ def run(self): text = 'The NEWS file is not available.' node = nodes.strong(text, text) return [node] - content = issue_re.sub(r'`bpo-\1 `__', - content) + content = issue_re.sub(r':issue:`\1`', content) + # Fallback handling for the GitHub issue + content = gh_issue_re.sub(r':gh:`\1`', content) content = whatsnew_re.sub(r'\1', content) # remove first 3 lines as they are the main heading lines = ['.. default-role:: obj', ''] + content.splitlines()[3:] diff --git a/Misc/NEWS.d/3.10.0a6.rst b/Misc/NEWS.d/3.10.0a6.rst index a4ee9ae098bd9..803df6f51ce62 100644 --- a/Misc/NEWS.d/3.10.0a6.rst +++ b/Misc/NEWS.d/3.10.0a6.rst @@ -232,7 +232,7 @@ now result in :exc:`MemoryError`. Patch by Erlend E. Aasland. .. section: Library Fix segfault in :meth:`sqlite3.Connection.backup` if no argument was -provided. The regression was introduced by GH-23838. Patch by Erlend E. +provided. The regression was introduced by PR 23838. Patch by Erlend E. Aasland. .. diff --git a/Misc/NEWS.d/3.10.0a7.rst b/Misc/NEWS.d/3.10.0a7.rst index 7e9cb77266bd9..286d0a8a7e919 100644 --- a/Misc/NEWS.d/3.10.0a7.rst +++ b/Misc/NEWS.d/3.10.0a7.rst @@ -574,7 +574,7 @@ raised. Patch by Erlend E. Aasland. .. nonce: t9XEkQ .. section: Library -Fix a regression introduced in GH-24562, where an empty bytestring was +Fix a regression introduced in PR 24562, where an empty bytestring was fetched as ``None`` instead of ``b''`` in :mod:`sqlite3`. Patch by Mariusz Felisiak. diff --git a/Misc/NEWS.d/3.10.0b1.rst b/Misc/NEWS.d/3.10.0b1.rst index 83ba504d04342..2a3d358edde90 100644 --- a/Misc/NEWS.d/3.10.0b1.rst +++ b/Misc/NEWS.d/3.10.0b1.rst @@ -941,7 +941,7 @@ result from ``entry_points()`` as deprecated. .. -.. bpo: 47383 +.. gh: 47383 .. date: 2021-04-08-19-32-26 .. nonce: YI1hdL .. section: Library @@ -1001,7 +1001,7 @@ some :mod:`dataclasses`. Fix :mod:`sqlite3` regression for zero-sized blobs with converters, where ``b""`` was returned instead of ``None``. The regression was introduced by -GH-24723. Patch by Erlend E. Aasland. +PR 24723. Patch by Erlend E. Aasland. .. diff --git a/Misc/NEWS.d/3.11.0a1.rst b/Misc/NEWS.d/3.11.0a1.rst index fa30c693c34c1..33841d9e4e39b 100644 --- a/Misc/NEWS.d/3.11.0a1.rst +++ b/Misc/NEWS.d/3.11.0a1.rst @@ -1597,7 +1597,7 @@ use map function instead of genexpr in capwords. .. section: Library Fix typo: ``importlib.find_loader`` is really slated for removal in Python -3.12 not 3.10, like the others in GH-25169. +3.12 not 3.10, like the others in PR 25169. Patch by Hugo van Kemenade. diff --git a/Misc/NEWS.d/3.11.0b1.rst b/Misc/NEWS.d/3.11.0b1.rst index 64c88c66ce50e..0def806185e5a 100644 --- a/Misc/NEWS.d/3.11.0b1.rst +++ b/Misc/NEWS.d/3.11.0b1.rst @@ -570,7 +570,7 @@ planned). Patch by Alex Waygood. .. -.. bpo: 78157 +.. gh: 78157 .. date: 2022-05-05-20-40-45 .. nonce: IA_9na .. section: Library @@ -1288,7 +1288,7 @@ Deprecate the chunk module. .. -.. bpo: 91498 +.. gh: 91498 .. date: 2022-04-10-08-39-44 .. nonce: 8oII92 .. section: Library diff --git a/Misc/NEWS.d/3.7.0a3.rst b/Misc/NEWS.d/3.7.0a3.rst index 067720efa516e..6576c1fadbff6 100644 --- a/Misc/NEWS.d/3.7.0a3.rst +++ b/Misc/NEWS.d/3.7.0a3.rst @@ -288,7 +288,7 @@ by Nir Soffer. .. -.. bpo: 321010 +.. bpo: 32101 .. date: 2017-11-29-00-42-47 .. nonce: -axD5l .. section: Library diff --git a/Misc/NEWS.d/3.8.0a1.rst b/Misc/NEWS.d/3.8.0a1.rst index 5cd3fa32105c2..09b858d250c33 100644 --- a/Misc/NEWS.d/3.8.0a1.rst +++ b/Misc/NEWS.d/3.8.0a1.rst @@ -4617,7 +4617,7 @@ Based on patch by c-fos. .. section: Library Remove HMAC default to md5 marked for removal in 3.8 (removal originally -planned in 3.6, bump to 3.8 in gh-7062). +planned in 3.6, bump to 3.8 in PR 7062). .. diff --git a/Misc/NEWS.d/3.9.0a1.rst b/Misc/NEWS.d/3.9.0a1.rst index a9b6694c133f1..45f232f1948d5 100644 --- a/Misc/NEWS.d/3.9.0a1.rst +++ b/Misc/NEWS.d/3.9.0a1.rst @@ -1335,7 +1335,7 @@ module on POSIX systems. .. nonce: 9TWMlz .. section: Library -Revert GH-15522, which introduces a regression in +Revert PR 15522, which introduces a regression in :meth:`mimetypes.guess_type` due to improper handling of filenames as urls. .. From webhook-mailer at python.org Sun May 8 09:05:05 2022 From: webhook-mailer at python.org (miss-islington) Date: Sun, 08 May 2022 13:05:05 -0000 Subject: [Python-checkins] gh-92448: Update the documentation builder to render the GitHub issue. (GH-92449) Message-ID: https://github.com/python/cpython/commit/d0d22ca9fb6afc3f01d1d2dc18a5e1eaba2988fa commit: d0d22ca9fb6afc3f01d1d2dc18a5e1eaba2988fa branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-08T06:05:01-07:00 summary: gh-92448: Update the documentation builder to render the GitHub issue. (GH-92449) (cherry picked from commit 45e1721d100bab09510ccf9da49f14ca5cc268f4) Co-authored-by: Dong-hee Na files: M Doc/tools/extensions/pyspecific.py M Misc/NEWS.d/3.10.0a6.rst M Misc/NEWS.d/3.10.0a7.rst M Misc/NEWS.d/3.10.0b1.rst M Misc/NEWS.d/3.11.0a1.rst M Misc/NEWS.d/3.11.0b1.rst M Misc/NEWS.d/3.7.0a3.rst M Misc/NEWS.d/3.8.0a1.rst M Misc/NEWS.d/3.9.0a1.rst diff --git a/Doc/tools/extensions/pyspecific.py b/Doc/tools/extensions/pyspecific.py index b02e31dc88e5c..bdcfe9ac1c23d 100644 --- a/Doc/tools/extensions/pyspecific.py +++ b/Doc/tools/extensions/pyspecific.py @@ -429,7 +429,8 @@ def run(self): # Support for including Misc/NEWS -issue_re = re.compile('(?:[Ii]ssue #|bpo-)([0-9]+)') +issue_re = re.compile('(?:[Ii]ssue #|bpo-)([0-9]+)', re.I) +gh_issue_re = re.compile('(?:gh-issue-|gh-)([0-9]+)', re.I) whatsnew_re = re.compile(r"(?im)^what's new in (.*?)\??$") @@ -456,9 +457,9 @@ def run(self): text = 'The NEWS file is not available.' node = nodes.strong(text, text) return [node] - content = issue_re.sub(r'`bpo-\1 `__', - content) + content = issue_re.sub(r':issue:`\1`', content) + # Fallback handling for the GitHub issue + content = gh_issue_re.sub(r':gh:`\1`', content) content = whatsnew_re.sub(r'\1', content) # remove first 3 lines as they are the main heading lines = ['.. default-role:: obj', ''] + content.splitlines()[3:] diff --git a/Misc/NEWS.d/3.10.0a6.rst b/Misc/NEWS.d/3.10.0a6.rst index a4ee9ae098bd9..803df6f51ce62 100644 --- a/Misc/NEWS.d/3.10.0a6.rst +++ b/Misc/NEWS.d/3.10.0a6.rst @@ -232,7 +232,7 @@ now result in :exc:`MemoryError`. Patch by Erlend E. Aasland. .. section: Library Fix segfault in :meth:`sqlite3.Connection.backup` if no argument was -provided. The regression was introduced by GH-23838. Patch by Erlend E. +provided. The regression was introduced by PR 23838. Patch by Erlend E. Aasland. .. diff --git a/Misc/NEWS.d/3.10.0a7.rst b/Misc/NEWS.d/3.10.0a7.rst index 7e9cb77266bd9..286d0a8a7e919 100644 --- a/Misc/NEWS.d/3.10.0a7.rst +++ b/Misc/NEWS.d/3.10.0a7.rst @@ -574,7 +574,7 @@ raised. Patch by Erlend E. Aasland. .. nonce: t9XEkQ .. section: Library -Fix a regression introduced in GH-24562, where an empty bytestring was +Fix a regression introduced in PR 24562, where an empty bytestring was fetched as ``None`` instead of ``b''`` in :mod:`sqlite3`. Patch by Mariusz Felisiak. diff --git a/Misc/NEWS.d/3.10.0b1.rst b/Misc/NEWS.d/3.10.0b1.rst index 83ba504d04342..2a3d358edde90 100644 --- a/Misc/NEWS.d/3.10.0b1.rst +++ b/Misc/NEWS.d/3.10.0b1.rst @@ -941,7 +941,7 @@ result from ``entry_points()`` as deprecated. .. -.. bpo: 47383 +.. gh: 47383 .. date: 2021-04-08-19-32-26 .. nonce: YI1hdL .. section: Library @@ -1001,7 +1001,7 @@ some :mod:`dataclasses`. Fix :mod:`sqlite3` regression for zero-sized blobs with converters, where ``b""`` was returned instead of ``None``. The regression was introduced by -GH-24723. Patch by Erlend E. Aasland. +PR 24723. Patch by Erlend E. Aasland. .. diff --git a/Misc/NEWS.d/3.11.0a1.rst b/Misc/NEWS.d/3.11.0a1.rst index fa30c693c34c1..33841d9e4e39b 100644 --- a/Misc/NEWS.d/3.11.0a1.rst +++ b/Misc/NEWS.d/3.11.0a1.rst @@ -1597,7 +1597,7 @@ use map function instead of genexpr in capwords. .. section: Library Fix typo: ``importlib.find_loader`` is really slated for removal in Python -3.12 not 3.10, like the others in GH-25169. +3.12 not 3.10, like the others in PR 25169. Patch by Hugo van Kemenade. diff --git a/Misc/NEWS.d/3.11.0b1.rst b/Misc/NEWS.d/3.11.0b1.rst index 64c88c66ce50e..0def806185e5a 100644 --- a/Misc/NEWS.d/3.11.0b1.rst +++ b/Misc/NEWS.d/3.11.0b1.rst @@ -570,7 +570,7 @@ planned). Patch by Alex Waygood. .. -.. bpo: 78157 +.. gh: 78157 .. date: 2022-05-05-20-40-45 .. nonce: IA_9na .. section: Library @@ -1288,7 +1288,7 @@ Deprecate the chunk module. .. -.. bpo: 91498 +.. gh: 91498 .. date: 2022-04-10-08-39-44 .. nonce: 8oII92 .. section: Library diff --git a/Misc/NEWS.d/3.7.0a3.rst b/Misc/NEWS.d/3.7.0a3.rst index 067720efa516e..6576c1fadbff6 100644 --- a/Misc/NEWS.d/3.7.0a3.rst +++ b/Misc/NEWS.d/3.7.0a3.rst @@ -288,7 +288,7 @@ by Nir Soffer. .. -.. bpo: 321010 +.. bpo: 32101 .. date: 2017-11-29-00-42-47 .. nonce: -axD5l .. section: Library diff --git a/Misc/NEWS.d/3.8.0a1.rst b/Misc/NEWS.d/3.8.0a1.rst index 5cd3fa32105c2..09b858d250c33 100644 --- a/Misc/NEWS.d/3.8.0a1.rst +++ b/Misc/NEWS.d/3.8.0a1.rst @@ -4617,7 +4617,7 @@ Based on patch by c-fos. .. section: Library Remove HMAC default to md5 marked for removal in 3.8 (removal originally -planned in 3.6, bump to 3.8 in gh-7062). +planned in 3.6, bump to 3.8 in PR 7062). .. diff --git a/Misc/NEWS.d/3.9.0a1.rst b/Misc/NEWS.d/3.9.0a1.rst index a9b6694c133f1..45f232f1948d5 100644 --- a/Misc/NEWS.d/3.9.0a1.rst +++ b/Misc/NEWS.d/3.9.0a1.rst @@ -1335,7 +1335,7 @@ module on POSIX systems. .. nonce: 9TWMlz .. section: Library -Revert GH-15522, which introduces a regression in +Revert PR 15522, which introduces a regression in :meth:`mimetypes.guess_type` due to improper handling of filenames as urls. .. From webhook-mailer at python.org Sun May 8 09:15:43 2022 From: webhook-mailer at python.org (serhiy-storchaka) Date: Sun, 08 May 2022 13:15:43 -0000 Subject: [Python-checkins] gh-92417: `typing` docs: `from __future__ import annotations` can be used in all supported Python versions (GH-92418) Message-ID: https://github.com/python/cpython/commit/e5b4bd4d60aaf0292c5b9d628512145b8987b3c6 commit: e5b4bd4d60aaf0292c5b9d628512145b8987b3c6 branch: main author: Alex Waygood committer: serhiy-storchaka date: 2022-05-08T16:15:38+03:00 summary: gh-92417: `typing` docs: `from __future__ import annotations` can be used in all supported Python versions (GH-92418) files: M Doc/library/typing.rst diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index 005a515234110..1d125fb1ebebb 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -2668,7 +2668,7 @@ Constant .. note:: - If ``from __future__ import annotations`` is used in Python 3.7 or later, + If ``from __future__ import annotations`` is used, annotations are not evaluated at function definition time. Instead, they are stored as strings in ``__annotations__``. This makes it unnecessary to use quotes around the annotation From webhook-mailer at python.org Sun May 8 09:16:23 2022 From: webhook-mailer at python.org (serhiy-storchaka) Date: Sun, 08 May 2022 13:16:23 -0000 Subject: [Python-checkins] gh-92417: `asyncio` docs: `asyncio.run()` is available on all supported Python versions (GH-92419) Message-ID: https://github.com/python/cpython/commit/f4e317b304c7f86e48885b4b74c7a8826648922c commit: f4e317b304c7f86e48885b4b74c7a8826648922c branch: main author: Alex Waygood committer: serhiy-storchaka date: 2022-05-08T16:16:19+03:00 summary: gh-92417: `asyncio` docs: `asyncio.run()` is available on all supported Python versions (GH-92419) files: M Doc/library/asyncio.rst diff --git a/Doc/library/asyncio.rst b/Doc/library/asyncio.rst index 8f4d55a9de059..66c7c4c24a918 100644 --- a/Doc/library/asyncio.rst +++ b/Doc/library/asyncio.rst @@ -17,7 +17,6 @@ await asyncio.sleep(1) print('... World!') - # Python 3.7+ asyncio.run(main()) asyncio is a library to write **concurrent** code using From webhook-mailer at python.org Sun May 8 09:16:56 2022 From: webhook-mailer at python.org (serhiy-storchaka) Date: Sun, 08 May 2022 13:16:56 -0000 Subject: [Python-checkins] gh-92417: `json` docs: `dict` is ordered on all supported Python versions (GH-92422) Message-ID: https://github.com/python/cpython/commit/bc098cfdb756f207d8fa84793e8ad91a2f263efb commit: bc098cfdb756f207d8fa84793e8ad91a2f263efb branch: main author: Alex Waygood committer: serhiy-storchaka date: 2022-05-08T16:16:52+03:00 summary: gh-92417: `json` docs: `dict` is ordered on all supported Python versions (GH-92422) files: M Doc/library/json.rst diff --git a/Doc/library/json.rst b/Doc/library/json.rst index 510b0459bbb5a..1e203242327ca 100644 --- a/Doc/library/json.rst +++ b/Doc/library/json.rst @@ -125,13 +125,6 @@ See :ref:`json-commandline` for detailed documentation. This module's encoders and decoders preserve input and output order by default. Order is only lost if the underlying containers are unordered. - Prior to Python 3.7, :class:`dict` was not guaranteed to be ordered, so - inputs and outputs were typically scrambled unless - :class:`collections.OrderedDict` was specifically requested. Starting - with Python 3.7, the regular :class:`dict` became order preserving, so - it is no longer necessary to specify :class:`collections.OrderedDict` for - JSON generation and parsing. - Basic Usage ----------- From webhook-mailer at python.org Sun May 8 09:17:27 2022 From: webhook-mailer at python.org (serhiy-storchaka) Date: Sun, 08 May 2022 13:17:27 -0000 Subject: [Python-checkins] gh-92417: `doctest` docs: remove references to Python <3.6 (GH-92420) Message-ID: https://github.com/python/cpython/commit/5639ea1ef9ba8452f81b61ad73152bd1bf1fd3a6 commit: 5639ea1ef9ba8452f81b61ad73152bd1bf1fd3a6 branch: main author: Alex Waygood committer: serhiy-storchaka date: 2022-05-08T16:17:23+03:00 summary: gh-92417: `doctest` docs: remove references to Python <3.6 (GH-92420) files: M Doc/library/doctest.rst diff --git a/Doc/library/doctest.rst b/Doc/library/doctest.rst index 0bbb640bea26b..30328790eefe3 100644 --- a/Doc/library/doctest.rst +++ b/Doc/library/doctest.rst @@ -288,10 +288,6 @@ strings are treated as if they were docstrings. In output, a key ``K`` in Any classes found are recursively searched similarly, to test docstrings in their contained methods and nested classes. -.. impl-detail:: - Prior to version 3.4, extension modules written in C were not fully - searched by doctest. - .. _doctest-finding-examples: @@ -785,11 +781,6 @@ instead. Another is to do :: >>> d ['Harry', 'Hermione'] -.. note:: - - Before Python 3.6, when printing a dict, Python did not guarantee that - the key-value pairs was printed in any particular order. - There are others, but you get the idea. Another bad idea is to print things that embed an object address, like :: From webhook-mailer at python.org Sun May 8 09:19:20 2022 From: webhook-mailer at python.org (serhiy-storchaka) Date: Sun, 08 May 2022 13:19:20 -0000 Subject: [Python-checkins] GH-92431: Fix footnotes in Doc/c-api/exceptions.rst (GH-92432) Message-ID: https://github.com/python/cpython/commit/788ef54bc94b0a7aa2a93f626e4067ab8561424c commit: 788ef54bc94b0a7aa2a93f626e4067ab8561424c branch: main author: Hugo van Kemenade committer: serhiy-storchaka date: 2022-05-08T16:19:16+03:00 summary: GH-92431: Fix footnotes in Doc/c-api/exceptions.rst (GH-92432) * Remove redundant footnote ref: the footnote has been removed * Fix footnote ref to match footnote * Convert footnotes into reST footnotes: will error if missing files: M Doc/c-api/exceptions.rst diff --git a/Doc/c-api/exceptions.rst b/Doc/c-api/exceptions.rst index 7bfeca5958cc4..02ec1da1c3400 100644 --- a/Doc/c-api/exceptions.rst +++ b/Doc/c-api/exceptions.rst @@ -909,11 +909,11 @@ the variables: +-----------------------------------------+---------------------------------+----------+ | C Name | Python Name | Notes | +=========================================+=================================+==========+ -| :c:data:`PyExc_BaseException` | :exc:`BaseException` | \(1) | +| :c:data:`PyExc_BaseException` | :exc:`BaseException` | [1]_ | +-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_Exception` | :exc:`Exception` | \(1) | +| :c:data:`PyExc_Exception` | :exc:`Exception` | [1]_ | +-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_ArithmeticError` | :exc:`ArithmeticError` | \(1) | +| :c:data:`PyExc_ArithmeticError` | :exc:`ArithmeticError` | [1]_ | +-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_AssertionError` | :exc:`AssertionError` | | +-----------------------------------------+---------------------------------+----------+ @@ -959,7 +959,7 @@ the variables: +-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_KeyboardInterrupt` | :exc:`KeyboardInterrupt` | | +-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_LookupError` | :exc:`LookupError` | \(1) | +| :c:data:`PyExc_LookupError` | :exc:`LookupError` | [1]_ | +-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_MemoryError` | :exc:`MemoryError` | | +-----------------------------------------+---------------------------------+----------+ @@ -971,7 +971,7 @@ the variables: +-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_NotImplementedError` | :exc:`NotImplementedError` | | +-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_OSError` | :exc:`OSError` | \(1) | +| :c:data:`PyExc_OSError` | :exc:`OSError` | [1]_ | +-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_OverflowError` | :exc:`OverflowError` | | +-----------------------------------------+---------------------------------+----------+ @@ -981,7 +981,7 @@ the variables: +-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_RecursionError` | :exc:`RecursionError` | | +-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_ReferenceError` | :exc:`ReferenceError` | \(2) | +| :c:data:`PyExc_ReferenceError` | :exc:`ReferenceError` | | +-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_RuntimeError` | :exc:`RuntimeError` | | +-----------------------------------------+---------------------------------+----------+ @@ -1046,7 +1046,7 @@ These are compatibility aliases to :c:data:`PyExc_OSError`: +-------------------------------------+----------+ | :c:data:`PyExc_IOError` | | +-------------------------------------+----------+ -| :c:data:`PyExc_WindowsError` | \(3) | +| :c:data:`PyExc_WindowsError` | [2]_ | +-------------------------------------+----------+ .. versionchanged:: 3.3 @@ -1054,10 +1054,10 @@ These are compatibility aliases to :c:data:`PyExc_OSError`: Notes: -(1) +.. [1] This is a base class for other standard exceptions. -(2) +.. [2] Only defined on Windows; protect code that uses this by testing that the preprocessor macro ``MS_WINDOWS`` is defined. @@ -1087,7 +1087,7 @@ the variables: +------------------------------------------+---------------------------------+----------+ | C Name | Python Name | Notes | +==========================================+=================================+==========+ -| :c:data:`PyExc_Warning` | :exc:`Warning` | \(1) | +| :c:data:`PyExc_Warning` | :exc:`Warning` | [3]_ | +------------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_BytesWarning` | :exc:`BytesWarning` | | +------------------------------------------+---------------------------------+----------+ @@ -1115,5 +1115,5 @@ the variables: Notes: -(1) +.. [3] This is a base class for other standard warning categories. From webhook-mailer at python.org Sun May 8 09:21:09 2022 From: webhook-mailer at python.org (corona10) Date: Sun, 08 May 2022 13:21:09 -0000 Subject: [Python-checkins] [3.9] gh-92448: Update the documentation builder to render the GitHub issue. (GH-92449). (GH-92458) Message-ID: https://github.com/python/cpython/commit/480234488cb61fc93a67ad257fe347adc3e9edaa commit: 480234488cb61fc93a67ad257fe347adc3e9edaa branch: 3.9 author: Dong-hee Na committer: corona10 date: 2022-05-08T22:21:05+09:00 summary: [3.9] gh-92448: Update the documentation builder to render the GitHub issue. (GH-92449). (GH-92458) files: M Doc/tools/extensions/pyspecific.py M Misc/NEWS.d/3.7.0a3.rst M Misc/NEWS.d/3.8.0a1.rst M Misc/NEWS.d/3.9.0a1.rst diff --git a/Doc/tools/extensions/pyspecific.py b/Doc/tools/extensions/pyspecific.py index 6c819866976b8..4575300f53769 100644 --- a/Doc/tools/extensions/pyspecific.py +++ b/Doc/tools/extensions/pyspecific.py @@ -391,7 +391,8 @@ def run(self): # Support for including Misc/NEWS -issue_re = re.compile('(?:[Ii]ssue #|bpo-)([0-9]+)') +issue_re = re.compile('(?:[Ii]ssue #|bpo-)([0-9]+)', re.I) +gh_issue_re = re.compile('(?:gh-issue-|gh-)([0-9]+)', re.I) whatsnew_re = re.compile(r"(?im)^what's new in (.*?)\??$") @@ -418,9 +419,9 @@ def run(self): text = 'The NEWS file is not available.' node = nodes.strong(text, text) return [node] - content = issue_re.sub(r'`bpo-\1 `__', - content) + content = issue_re.sub(r':issue:`\1`', content) + # Fallback handling for the GitHub issue + content = gh_issue_re.sub(r':gh:`\1`', content) content = whatsnew_re.sub(r'\1', content) # remove first 3 lines as they are the main heading lines = ['.. default-role:: obj', ''] + content.splitlines()[3:] diff --git a/Misc/NEWS.d/3.7.0a3.rst b/Misc/NEWS.d/3.7.0a3.rst index 067720efa516e..6576c1fadbff6 100644 --- a/Misc/NEWS.d/3.7.0a3.rst +++ b/Misc/NEWS.d/3.7.0a3.rst @@ -288,7 +288,7 @@ by Nir Soffer. .. -.. bpo: 321010 +.. bpo: 32101 .. date: 2017-11-29-00-42-47 .. nonce: -axD5l .. section: Library diff --git a/Misc/NEWS.d/3.8.0a1.rst b/Misc/NEWS.d/3.8.0a1.rst index 657ea5cab925c..16e23a192a718 100644 --- a/Misc/NEWS.d/3.8.0a1.rst +++ b/Misc/NEWS.d/3.8.0a1.rst @@ -4617,7 +4617,7 @@ Based on patch by c-fos. .. section: Library Remove HMAC default to md5 marked for removal in 3.8 (removal originally -planned in 3.6, bump to 3.8 in gh-7062). +planned in 3.6, bump to 3.8 in PR 7062). .. diff --git a/Misc/NEWS.d/3.9.0a1.rst b/Misc/NEWS.d/3.9.0a1.rst index a9b6694c133f1..45f232f1948d5 100644 --- a/Misc/NEWS.d/3.9.0a1.rst +++ b/Misc/NEWS.d/3.9.0a1.rst @@ -1335,7 +1335,7 @@ module on POSIX systems. .. nonce: 9TWMlz .. section: Library -Revert GH-15522, which introduces a regression in +Revert PR 15522, which introduces a regression in :meth:`mimetypes.guess_type` due to improper handling of filenames as urls. .. From webhook-mailer at python.org Sun May 8 09:21:32 2022 From: webhook-mailer at python.org (serhiy-storchaka) Date: Sun, 08 May 2022 13:21:32 -0000 Subject: [Python-checkins] gh-92261: Disallow iteration of Union (and other special forms) (GH-92262) Message-ID: https://github.com/python/cpython/commit/4739997e141c4c84bd2241d4d887c3c658d92700 commit: 4739997e141c4c84bd2241d4d887c3c658d92700 branch: main author: Matthew Rahtz committer: serhiy-storchaka date: 2022-05-08T16:21:28+03:00 summary: gh-92261: Disallow iteration of Union (and other special forms) (GH-92262) files: A Misc/NEWS.d/next/Core and Builtins/2022-05-03-20-12-18.gh-issue-92261.aigLnb.rst M Lib/test/test_genericalias.py M Lib/test/test_typing.py M Lib/typing.py diff --git a/Lib/test/test_genericalias.py b/Lib/test/test_genericalias.py index 5fba74ec864f1..6959c2ae3c80e 100644 --- a/Lib/test/test_genericalias.py +++ b/Lib/test/test_genericalias.py @@ -487,5 +487,25 @@ def test_del_iter(self): del iter_x +class TypeIterationTests(unittest.TestCase): + _UNITERABLE_TYPES = (list, tuple) + + def test_cannot_iterate(self): + for test_type in self._UNITERABLE_TYPES: + with self.subTest(type=test_type): + expected_error_regex = "object is not iterable" + with self.assertRaisesRegex(TypeError, expected_error_regex): + iter(test_type) + with self.assertRaisesRegex(TypeError, expected_error_regex): + list(test_type) + with self.assertRaisesRegex(TypeError, expected_error_regex): + for _ in test_type: + pass + + def test_is_not_instance_of_iterable(self): + for type_to_test in self._UNITERABLE_TYPES: + self.assertNotIsInstance(type_to_test, Iterable) + + if __name__ == "__main__": unittest.main() diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index 8399465f6052d..6e1e8d6e1b473 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -7348,6 +7348,37 @@ def test_all_exported_names(self): self.assertSetEqual(computed_all, actual_all) +class TypeIterationTests(BaseTestCase): + _UNITERABLE_TYPES = ( + Any, + Union, + Union[str, int], + Union[str, T], + List, + Tuple, + Callable, + Callable[..., T], + Callable[[T], str], + Annotated, + Annotated[T, ''], + ) + + def test_cannot_iterate(self): + expected_error_regex = "object is not iterable" + for test_type in self._UNITERABLE_TYPES: + with self.subTest(type=test_type): + with self.assertRaisesRegex(TypeError, expected_error_regex): + iter(test_type) + with self.assertRaisesRegex(TypeError, expected_error_regex): + list(test_type) + with self.assertRaisesRegex(TypeError, expected_error_regex): + for _ in test_type: + pass + + def test_is_not_instance_of_iterable(self): + for type_to_test in self._UNITERABLE_TYPES: + self.assertNotIsInstance(type_to_test, collections.abc.Iterable) + if __name__ == '__main__': main() diff --git a/Lib/typing.py b/Lib/typing.py index bdc14e39033dc..46ef2d9cf6005 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -405,9 +405,24 @@ def __deepcopy__(self, memo): return self +class _NotIterable: + """Mixin to prevent iteration, without being compatible with Iterable. + + That is, we could do: + def __iter__(self): raise TypeError() + But this would make users of this mixin duck type-compatible with + collections.abc.Iterable - isinstance(foo, Iterable) would be True. + + Luckily, we can instead prevent iteration by setting __iter__ to None, which + is treated specially. + """ + + __iter__ = None + + # Internal indicator of special typing constructs. # See __doc__ instance attribute for specific docs. -class _SpecialForm(_Final, _root=True): +class _SpecialForm(_Final, _NotIterable, _root=True): __slots__ = ('_name', '__doc__', '_getitem') def __init__(self, getitem): @@ -1498,7 +1513,7 @@ def __iter__(self): # 1 for List and 2 for Dict. It may be -1 if variable number of # parameters are accepted (needs custom __getitem__). -class _SpecialGenericAlias(_BaseGenericAlias, _root=True): +class _SpecialGenericAlias(_NotIterable, _BaseGenericAlias, _root=True): def __init__(self, origin, nparams, *, inst=True, name=None): if name is None: name = origin.__name__ @@ -1541,7 +1556,7 @@ def __or__(self, right): def __ror__(self, left): return Union[left, self] -class _CallableGenericAlias(_GenericAlias, _root=True): +class _CallableGenericAlias(_NotIterable, _GenericAlias, _root=True): def __repr__(self): assert self._name == 'Callable' args = self.__args__ @@ -1606,7 +1621,7 @@ def __getitem__(self, params): return self.copy_with(params) -class _UnionGenericAlias(_GenericAlias, _root=True): +class _UnionGenericAlias(_NotIterable, _GenericAlias, _root=True): def copy_with(self, params): return Union[params] @@ -2046,7 +2061,7 @@ def _proto_hook(other): cls.__init__ = _no_init_or_replace_init -class _AnnotatedAlias(_GenericAlias, _root=True): +class _AnnotatedAlias(_NotIterable, _GenericAlias, _root=True): """Runtime representation of an annotated type. At its core 'Annotated[t, dec1, dec2, ...]' is an alias for the type 't' diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-03-20-12-18.gh-issue-92261.aigLnb.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-03-20-12-18.gh-issue-92261.aigLnb.rst new file mode 100644 index 0000000000000..df0228e273d8e --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-05-03-20-12-18.gh-issue-92261.aigLnb.rst @@ -0,0 +1 @@ +Fix hang when trying to iterate over a ``typing.Union``. From webhook-mailer at python.org Sun May 8 09:23:27 2022 From: webhook-mailer at python.org (serhiy-storchaka) Date: Sun, 08 May 2022 13:23:27 -0000 Subject: [Python-checkins] gh-92417: `stdtypes` docs: delete discussion of Python 2 differences (GH-92423) Message-ID: https://github.com/python/cpython/commit/8efda1e7c6343b1671d93837bf2c146e4cf77bbf commit: 8efda1e7c6343b1671d93837bf2c146e4cf77bbf branch: main author: Alex Waygood committer: serhiy-storchaka date: 2022-05-08T16:23:22+03:00 summary: gh-92417: `stdtypes` docs: delete discussion of Python 2 differences (GH-92423) Given that 2.7 has now been end-of-life for two and a half years, I don't think we need such a detailed explanation here anymore of the differences between Python 2 and Python 3. files: M Doc/library/stdtypes.rst diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index 44447400c29bc..065afb8ae6038 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -2573,16 +2573,6 @@ The representation of bytes objects uses the literal format (``b'...'``) since it is often more useful than e.g. ``bytes([46, 46, 46])``. You can always convert a bytes object into a list of integers using ``list(b)``. -.. note:: - For Python 2.x users: In the Python 2.x series, a variety of implicit - conversions between 8-bit strings (the closest thing 2.x offers to a - built-in binary data type) and Unicode strings were permitted. This was a - backwards compatibility workaround to account for the fact that Python - originally only supported 8-bit text, and Unicode text was a later - addition. In Python 3.x, those implicit conversions are gone - conversions - between 8-bit binary data and Unicode text must be explicit, and bytes and - string objects will always compare unequal. - .. _typebytearray: From webhook-mailer at python.org Sun May 8 09:31:44 2022 From: webhook-mailer at python.org (corona10) Date: Sun, 08 May 2022 13:31:44 -0000 Subject: [Python-checkins] [3.10] gh-92448: Update the documentation builder to render the GitHub issue (GH-92449). (GH-92457) Message-ID: https://github.com/python/cpython/commit/731d893bdf29c8048b392691f9dee74ed4c9c9b3 commit: 731d893bdf29c8048b392691f9dee74ed4c9c9b3 branch: 3.10 author: Dong-hee Na committer: corona10 date: 2022-05-08T22:31:40+09:00 summary: [3.10] gh-92448: Update the documentation builder to render the GitHub issue (GH-92449). (GH-92457) files: M Doc/tools/extensions/pyspecific.py M Misc/NEWS.d/3.10.0a6.rst M Misc/NEWS.d/3.10.0a7.rst M Misc/NEWS.d/3.10.0b1.rst M Misc/NEWS.d/3.10.1.rst M Misc/NEWS.d/3.7.0a3.rst M Misc/NEWS.d/3.8.0a1.rst M Misc/NEWS.d/3.9.0a1.rst diff --git a/Doc/tools/extensions/pyspecific.py b/Doc/tools/extensions/pyspecific.py index cbb7638627ef1..27004afc0bab9 100644 --- a/Doc/tools/extensions/pyspecific.py +++ b/Doc/tools/extensions/pyspecific.py @@ -429,7 +429,8 @@ def run(self): # Support for including Misc/NEWS -issue_re = re.compile('(?:[Ii]ssue #|bpo-)([0-9]+)') +issue_re = re.compile('(?:[Ii]ssue #|bpo-)([0-9]+)', re.I) +gh_issue_re = re.compile('(?:gh-issue-|gh-)([0-9]+)', re.I) whatsnew_re = re.compile(r"(?im)^what's new in (.*?)\??$") @@ -456,9 +457,9 @@ def run(self): text = 'The NEWS file is not available.' node = nodes.strong(text, text) return [node] - content = issue_re.sub(r'`bpo-\1 `__', - content) + content = issue_re.sub(r':issue:`\1`', content) + # Fallback handling for the GitHub issue + content = gh_issue_re.sub(r':gh:`\1`', content) content = whatsnew_re.sub(r'\1', content) # remove first 3 lines as they are the main heading lines = ['.. default-role:: obj', ''] + content.splitlines()[3:] diff --git a/Misc/NEWS.d/3.10.0a6.rst b/Misc/NEWS.d/3.10.0a6.rst index a4ee9ae098bd9..803df6f51ce62 100644 --- a/Misc/NEWS.d/3.10.0a6.rst +++ b/Misc/NEWS.d/3.10.0a6.rst @@ -232,7 +232,7 @@ now result in :exc:`MemoryError`. Patch by Erlend E. Aasland. .. section: Library Fix segfault in :meth:`sqlite3.Connection.backup` if no argument was -provided. The regression was introduced by GH-23838. Patch by Erlend E. +provided. The regression was introduced by PR 23838. Patch by Erlend E. Aasland. .. diff --git a/Misc/NEWS.d/3.10.0a7.rst b/Misc/NEWS.d/3.10.0a7.rst index f62be491d56dd..864dc2cb90a9f 100644 --- a/Misc/NEWS.d/3.10.0a7.rst +++ b/Misc/NEWS.d/3.10.0a7.rst @@ -574,7 +574,7 @@ raised. Patch by Erlend E. Aasland. .. nonce: t9XEkQ .. section: Library -Fix a regression introduced in GH-24562, where an empty bytestring was +Fix a regression introduced in PR 24562, where an empty bytestring was fetched as ``None`` instead of ``b''`` in :mod:`sqlite3`. Patch by Mariusz Felisiak. diff --git a/Misc/NEWS.d/3.10.0b1.rst b/Misc/NEWS.d/3.10.0b1.rst index 4731dca2e74cf..345a9173a0dd7 100644 --- a/Misc/NEWS.d/3.10.0b1.rst +++ b/Misc/NEWS.d/3.10.0b1.rst @@ -941,7 +941,7 @@ result from ``entry_points()`` as deprecated. .. -.. bpo: 47383 +.. gh: 47383 .. date: 2021-04-08-19-32-26 .. nonce: YI1hdL .. section: Library @@ -1001,7 +1001,7 @@ some :mod:`dataclasses`. Fix :mod:`sqlite3` regression for zero-sized blobs with converters, where ``b""`` was returned instead of ``None``. The regression was introduced by -GH-24723. Patch by Erlend E. Aasland. +PR 24723. Patch by Erlend E. Aasland. .. diff --git a/Misc/NEWS.d/3.10.1.rst b/Misc/NEWS.d/3.10.1.rst index 0f8938ab6154d..8ef3cd124619e 100644 --- a/Misc/NEWS.d/3.10.1.rst +++ b/Misc/NEWS.d/3.10.1.rst @@ -730,7 +730,7 @@ Patch by Kyungmin Lee. .. section: Library Fix typo: ``importlib.find_loader`` is really slated for removal in Python -3.12 not 3.10, like the others in GH-25169. +3.12 not 3.10, like the others in PR 25169. Patch by Hugo van Kemenade. diff --git a/Misc/NEWS.d/3.7.0a3.rst b/Misc/NEWS.d/3.7.0a3.rst index 067720efa516e..6576c1fadbff6 100644 --- a/Misc/NEWS.d/3.7.0a3.rst +++ b/Misc/NEWS.d/3.7.0a3.rst @@ -288,7 +288,7 @@ by Nir Soffer. .. -.. bpo: 321010 +.. bpo: 32101 .. date: 2017-11-29-00-42-47 .. nonce: -axD5l .. section: Library diff --git a/Misc/NEWS.d/3.8.0a1.rst b/Misc/NEWS.d/3.8.0a1.rst index 5cd3fa32105c2..09b858d250c33 100644 --- a/Misc/NEWS.d/3.8.0a1.rst +++ b/Misc/NEWS.d/3.8.0a1.rst @@ -4617,7 +4617,7 @@ Based on patch by c-fos. .. section: Library Remove HMAC default to md5 marked for removal in 3.8 (removal originally -planned in 3.6, bump to 3.8 in gh-7062). +planned in 3.6, bump to 3.8 in PR 7062). .. diff --git a/Misc/NEWS.d/3.9.0a1.rst b/Misc/NEWS.d/3.9.0a1.rst index a9b6694c133f1..45f232f1948d5 100644 --- a/Misc/NEWS.d/3.9.0a1.rst +++ b/Misc/NEWS.d/3.9.0a1.rst @@ -1335,7 +1335,7 @@ module on POSIX systems. .. nonce: 9TWMlz .. section: Library -Revert GH-15522, which introduces a regression in +Revert PR 15522, which introduces a regression in :meth:`mimetypes.guess_type` due to improper handling of filenames as urls. .. From webhook-mailer at python.org Sun May 8 09:34:13 2022 From: webhook-mailer at python.org (corona10) Date: Sun, 08 May 2022 13:34:13 -0000 Subject: [Python-checkins] gh-89474: Improve Semaphore/BoundedSemaphore.release() for multiple thread waiting (GH-92447) Message-ID: https://github.com/python/cpython/commit/c826867b7c1bb69639290d8df0f850ec3f9a6c72 commit: c826867b7c1bb69639290d8df0f850ec3f9a6c72 branch: main author: Dong-hee Na committer: corona10 date: 2022-05-08T22:33:53+09:00 summary: gh-89474: Improve Semaphore/BoundedSemaphore.release() for multiple thread waiting (GH-92447) files: M Lib/threading.py diff --git a/Lib/threading.py b/Lib/threading.py index 642f93e1eec31..40edcde11539d 100644 --- a/Lib/threading.py +++ b/Lib/threading.py @@ -481,8 +481,7 @@ def release(self, n=1): raise ValueError('n must be one or more') with self._cond: self._value += n - for i in range(n): - self._cond.notify() + self._cond.notify(n) def __exit__(self, t, v, tb): self.release() @@ -506,7 +505,7 @@ class BoundedSemaphore(Semaphore): """ def __init__(self, value=1): - Semaphore.__init__(self, value) + super().__init__(value) self._initial_value = value def __repr__(self): @@ -530,8 +529,7 @@ def release(self, n=1): if self._value + n > self._initial_value: raise ValueError("Semaphore released too many times") self._value += n - for i in range(n): - self._cond.notify() + self._cond.notify(n) class Event: From webhook-mailer at python.org Sun May 8 10:10:46 2022 From: webhook-mailer at python.org (serhiy-storchaka) Date: Sun, 08 May 2022 14:10:46 -0000 Subject: [Python-checkins] bpo-44712: Replace "type(literal)" with corresponding builtin types (GH-27294) Message-ID: https://github.com/python/cpython/commit/3680ebed7f3e529d01996dd0318601f9f0d02b4b commit: 3680ebed7f3e529d01996dd0318601f9f0d02b4b branch: main author: Serhiy Storchaka committer: serhiy-storchaka date: 2022-05-08T17:10:11+03:00 summary: bpo-44712: Replace "type(literal)" with corresponding builtin types (GH-27294) I suppose it is a remnants of very old code written when str, int, list, dict, etc were functions and not classes. files: M Lib/cgitb.py M Lib/csv.py M Lib/curses/ascii.py M Lib/distutils/command/register.py M Lib/ftplib.py M Lib/getopt.py M Lib/idlelib/browser.py M Lib/lib2to3/pgen2/token.py M Lib/plistlib.py M Lib/pty.py M Lib/pydoc.py M Lib/sunau.py M Lib/test/test_copyreg.py M Lib/test/test_descr.py M Lib/test/test_pprint.py M Lib/test/test_timeout.py M Lib/xmlrpc/client.py M Mac/BuildScript/build-installer.py M Tools/scripts/mailerdaemon.py diff --git a/Lib/cgitb.py b/Lib/cgitb.py index 8ce0e833a989a..f6b97f25c59de 100644 --- a/Lib/cgitb.py +++ b/Lib/cgitb.py @@ -74,7 +74,7 @@ def lookup(name, frame, locals): return 'global', frame.f_globals[name] if '__builtins__' in frame.f_globals: builtins = frame.f_globals['__builtins__'] - if type(builtins) is type({}): + if isinstance(builtins, dict): if name in builtins: return 'builtin', builtins[name] else: diff --git a/Lib/csv.py b/Lib/csv.py index bb3ee269ae793..a0782705d5af1 100644 --- a/Lib/csv.py +++ b/Lib/csv.py @@ -428,7 +428,7 @@ def has_header(self, sample): # on whether it's a header hasHeader = 0 for col, colType in columnTypes.items(): - if type(colType) == type(0): # it's a length + if isinstance(colType, int): # it's a length if len(header[col]) != colType: hasHeader += 1 else: diff --git a/Lib/curses/ascii.py b/Lib/curses/ascii.py index 5b243be68111f..95acff33925ed 100644 --- a/Lib/curses/ascii.py +++ b/Lib/curses/ascii.py @@ -46,7 +46,7 @@ ] def _ctoi(c): - if type(c) == type(""): + if isinstance(c, str): return ord(c) else: return c @@ -69,19 +69,19 @@ def isctrl(c): return 0 <= _ctoi(c) < 32 def ismeta(c): return _ctoi(c) > 127 def ascii(c): - if type(c) == type(""): + if isinstance(c, str): return chr(_ctoi(c) & 0x7f) else: return _ctoi(c) & 0x7f def ctrl(c): - if type(c) == type(""): + if isinstance(c, str): return chr(_ctoi(c) & 0x1f) else: return _ctoi(c) & 0x1f def alt(c): - if type(c) == type(""): + if isinstance(c, str): return chr(_ctoi(c) | 0x80) else: return _ctoi(c) | 0x80 diff --git a/Lib/distutils/command/register.py b/Lib/distutils/command/register.py index 0fac94e9e5490..170f5497141c9 100644 --- a/Lib/distutils/command/register.py +++ b/Lib/distutils/command/register.py @@ -260,7 +260,7 @@ def post_to_server(self, data, auth=None): body = io.StringIO() for key, value in data.items(): # handle multiple entries for the same name - if type(value) not in (type([]), type( () )): + if not isinstance(value, (list, tuple)): value = [value] for value in value: value = str(value) diff --git a/Lib/ftplib.py b/Lib/ftplib.py index 7c5a50715f6dc..dc9a8afbd8d24 100644 --- a/Lib/ftplib.py +++ b/Lib/ftplib.py @@ -561,7 +561,7 @@ def dir(self, *args): LIST command. (This *should* only be used for a pathname.)''' cmd = 'LIST' func = None - if args[-1:] and type(args[-1]) != type(''): + if args[-1:] and not isinstance(args[-1], str): args, func = args[:-1], args[-1] for arg in args: if arg: diff --git a/Lib/getopt.py b/Lib/getopt.py index 9d4cab1bac360..5419d77f5d774 100644 --- a/Lib/getopt.py +++ b/Lib/getopt.py @@ -81,7 +81,7 @@ def getopt(args, shortopts, longopts = []): """ opts = [] - if type(longopts) == type(""): + if isinstance(longopts, str): longopts = [longopts] else: longopts = list(longopts) diff --git a/Lib/idlelib/browser.py b/Lib/idlelib/browser.py index 3c3a53a6599a7..4da2d4071ac19 100644 --- a/Lib/idlelib/browser.py +++ b/Lib/idlelib/browser.py @@ -43,7 +43,7 @@ def transform_children(child_dict, modname=None): # If obj.name != key, it has already been suffixed. supers = [] for sup in obj.super: - if type(sup) is type(''): + if isinstance(sup, str): sname = sup else: sname = sup.name diff --git a/Lib/lib2to3/pgen2/token.py b/Lib/lib2to3/pgen2/token.py index 5f6612f5b3068..2a55138e48237 100755 --- a/Lib/lib2to3/pgen2/token.py +++ b/Lib/lib2to3/pgen2/token.py @@ -72,7 +72,7 @@ tok_name = {} for _name, _value in list(globals().items()): - if type(_value) is type(0): + if isinstance(_value, int): tok_name[_value] = _name diff --git a/Lib/plistlib.py b/Lib/plistlib.py index 4862355b2252c..d03c75dfab975 100644 --- a/Lib/plistlib.py +++ b/Lib/plistlib.py @@ -199,7 +199,7 @@ def handle_data(self, data): def add_object(self, value): if self.current_key is not None: - if not isinstance(self.stack[-1], type({})): + if not isinstance(self.stack[-1], dict): raise ValueError("unexpected element at line %d" % self.parser.CurrentLineNumber) self.stack[-1][self.current_key] = value @@ -208,7 +208,7 @@ def add_object(self, value): # this is the root object self.root = value else: - if not isinstance(self.stack[-1], type([])): + if not isinstance(self.stack[-1], list): raise ValueError("unexpected element at line %d" % self.parser.CurrentLineNumber) self.stack[-1].append(value) @@ -232,7 +232,7 @@ def end_dict(self): self.stack.pop() def end_key(self): - if self.current_key or not isinstance(self.stack[-1], type({})): + if self.current_key or not isinstance(self.stack[-1], dict): raise ValueError("unexpected key at line %d" % self.parser.CurrentLineNumber) self.current_key = self.get_data() diff --git a/Lib/pty.py b/Lib/pty.py index 8d8ce40df541c..03073f07c92c0 100644 --- a/Lib/pty.py +++ b/Lib/pty.py @@ -162,7 +162,7 @@ def _copy(master_fd, master_read=_read, stdin_read=_read): def spawn(argv, master_read=_read, stdin_read=_read): """Create a spawned process.""" - if type(argv) == type(''): + if isinstance(argv, str): argv = (argv,) sys.audit('pty.spawn', argv) diff --git a/Lib/pydoc.py b/Lib/pydoc.py index 297ff967a2ce9..cec9ac89f1cc8 100755 --- a/Lib/pydoc.py +++ b/Lib/pydoc.py @@ -727,7 +727,7 @@ def formattree(self, tree, modname, parent=None): """Produce HTML for a class tree as given by inspect.getclasstree().""" result = '' for entry in tree: - if type(entry) is type(()): + if isinstance(entry, tuple): c, bases = entry result = result + '
' result = result + self.classlink(c, modname) @@ -737,7 +737,7 @@ def formattree(self, tree, modname, parent=None): parents.append(self.classlink(base, modname)) result = result + '(' + ', '.join(parents) + ')' result = result + '\n
' - elif type(entry) is type([]): + elif isinstance(entry, list): result = result + '
\n%s
\n' % self.formattree( entry, modname, c) return '
\n%s
\n' % result @@ -1190,14 +1190,14 @@ def formattree(self, tree, modname, parent=None, prefix=''): """Render in text a class tree as returned by inspect.getclasstree().""" result = '' for entry in tree: - if type(entry) is type(()): + if isinstance(entry, tuple): c, bases = entry result = result + prefix + classname(c, modname) if bases and bases != (parent,): parents = (classname(c, modname) for c in bases) result = result + '(%s)' % ', '.join(parents) result = result + '\n' - elif type(entry) is type([]): + elif isinstance(entry, list): result = result + self.formattree( entry, modname, c, prefix + ' ') return result @@ -2044,7 +2044,7 @@ def getline(self, prompt): return self.input.readline() def help(self, request): - if type(request) is type(''): + if isinstance(request, str): request = request.strip() if request == 'keywords': self.listkeywords() elif request == 'symbols': self.listsymbols() @@ -2129,7 +2129,7 @@ def showtopic(self, topic, more_xrefs=''): if not target: self.output.write('no documentation found for %s\n' % repr(topic)) return - if type(target) is type(''): + if isinstance(target, str): return self.showtopic(target, more_xrefs) label, xrefs = target diff --git a/Lib/sunau.py b/Lib/sunau.py index 94c42f1582c02..c6caab959abd0 100644 --- a/Lib/sunau.py +++ b/Lib/sunau.py @@ -160,7 +160,7 @@ def _write_u32(file, x): class Au_read: def __init__(self, f): - if type(f) == type(''): + if isinstance(f, str): import builtins f = builtins.open(f, 'rb') self._opened = True @@ -312,7 +312,7 @@ def close(self): class Au_write: def __init__(self, f): - if type(f) == type(''): + if isinstance(f, str): import builtins f = builtins.open(f, 'wb') self._opened = True diff --git a/Lib/test/test_copyreg.py b/Lib/test/test_copyreg.py index e3f1cd81aab20..e158c19db2d65 100644 --- a/Lib/test/test_copyreg.py +++ b/Lib/test/test_copyreg.py @@ -6,6 +6,9 @@ class C: pass +def pickle_C(c): + return C, () + class WithoutSlots(object): pass @@ -32,16 +35,15 @@ class WithInherited(WithSingleString): class CopyRegTestCase(unittest.TestCase): def test_class(self): - self.assertRaises(TypeError, copyreg.pickle, - C, None, None) + copyreg.pickle(C, pickle_C) def test_noncallable_reduce(self): self.assertRaises(TypeError, copyreg.pickle, - type(1), "not a callable") + C, "not a callable") def test_noncallable_constructor(self): self.assertRaises(TypeError, copyreg.pickle, - type(1), int, "not a callable") + C, pickle_C, "not a callable") def test_bool(self): import copy diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py index afe0f7e9c7fd4..9a09d8a9e3fe0 100644 --- a/Lib/test/test_descr.py +++ b/Lib/test/test_descr.py @@ -426,7 +426,7 @@ def __init__(self_local, *a, **kw): def __getitem__(self, key): return self.get(key, 0) def __setitem__(self_local, key, value): - self.assertIsInstance(key, type(0)) + self.assertIsInstance(key, int) dict.__setitem__(self_local, key, value) def setstate(self, state): self.state = state @@ -871,7 +871,7 @@ def setstate(self, state): self.assertEqual(a.getstate(), 10) class D(dict, C): def __init__(self): - type({}).__init__(self) + dict.__init__(self) C.__init__(self) d = D() self.assertEqual(list(d.keys()), []) @@ -3288,7 +3288,7 @@ class Int(int): __slots__ = [] cant(True, int) cant(2, bool) o = object() - cant(o, type(1)) + cant(o, int) cant(o, type(None)) del o class G(object): diff --git a/Lib/test/test_pprint.py b/Lib/test/test_pprint.py index c7b9893943471..6ea7e7db2ce11 100644 --- a/Lib/test/test_pprint.py +++ b/Lib/test/test_pprint.py @@ -203,7 +203,7 @@ def test_knotted(self): def test_unreadable(self): # Not recursive but not readable anyway pp = pprint.PrettyPrinter() - for unreadable in type(3), pprint, pprint.isrecursive: + for unreadable in object(), int, pprint, pprint.isrecursive: # module-level convenience functions self.assertFalse(pprint.isrecursive(unreadable), "expected not isrecursive for %r" % (unreadable,)) diff --git a/Lib/test/test_timeout.py b/Lib/test/test_timeout.py index fa85c7e6cd87d..30e843a423a77 100644 --- a/Lib/test/test_timeout.py +++ b/Lib/test/test_timeout.py @@ -50,10 +50,10 @@ def testFloatReturnValue(self): def testReturnType(self): # Test return type of gettimeout() self.sock.settimeout(1) - self.assertEqual(type(self.sock.gettimeout()), type(1.0)) + self.assertIs(type(self.sock.gettimeout()), float) self.sock.settimeout(3.9) - self.assertEqual(type(self.sock.gettimeout()), type(1.0)) + self.assertIs(type(self.sock.gettimeout()), float) def testTypeCheck(self): # Test type checking by settimeout() diff --git a/Lib/xmlrpc/client.py b/Lib/xmlrpc/client.py index a614cef6ab2f1..bef23f4505e03 100644 --- a/Lib/xmlrpc/client.py +++ b/Lib/xmlrpc/client.py @@ -850,9 +850,9 @@ def __init__(self, results): def __getitem__(self, i): item = self.results[i] - if type(item) == type({}): + if isinstance(item, dict): raise Fault(item['faultCode'], item['faultString']) - elif type(item) == type([]): + elif isinstance(item, list): return item[0] else: raise ValueError("unexpected type in multicall result") diff --git a/Mac/BuildScript/build-installer.py b/Mac/BuildScript/build-installer.py index 91e2dd6191e5d..b5bffaff4ed0d 100755 --- a/Mac/BuildScript/build-installer.py +++ b/Mac/BuildScript/build-installer.py @@ -1351,7 +1351,7 @@ def buildPython(): build_time_vars = l_dict['build_time_vars'] vars = {} for k, v in build_time_vars.items(): - if type(v) == type(''): + if isinstance(v, str): for p in (include_path, lib_path): v = v.replace(' ' + p, '') v = v.replace(p + ' ', '') diff --git a/Tools/scripts/mailerdaemon.py b/Tools/scripts/mailerdaemon.py index 635e5482e63c1..9595ee4a01533 100755 --- a/Tools/scripts/mailerdaemon.py +++ b/Tools/scripts/mailerdaemon.py @@ -70,7 +70,7 @@ def get_errors(self): # compile the re's in the list and store them in-place. for i in range(len(emparse_list_list)): x = emparse_list_list[i] - if type(x) is type(''): + if isinstance(x, str): x = re.compile(x, re.MULTILINE) else: xl = [] @@ -105,7 +105,7 @@ def emparse_list(fp, sub): emails = [] reason = None for regexp in emparse_list_list: - if type(regexp) is type(()): + if isinstance(regexp, tuple): res = regexp[0].search(data, 0, from_index) if res is not None: try: @@ -134,7 +134,7 @@ def emparse_list(fp, sub): if reason[:15] == 'returned mail: ': reason = reason[15:] for regexp in emparse_list_reason: - if type(regexp) is type(''): + if isinstance(regexp, str): for i in range(len(emails)-1,-1,-1): email = emails[i] exp = re.compile(re.escape(email).join(regexp.split('<>')), re.MULTILINE) From webhook-mailer at python.org Sun May 8 10:25:18 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Sun, 08 May 2022 14:25:18 -0000 Subject: [Python-checkins] Add __class_getitem__ to csv.DictReader and csv.DictWriter (#92393) Message-ID: https://github.com/python/cpython/commit/5ed5c5612363538a1d73dbc3948fa70ca743ba2c commit: 5ed5c5612363538a1d73dbc3948fa70ca743ba2c branch: main author: Marc Mueller <30130371+cdce8p at users.noreply.github.com> committer: JelleZijlstra date: 2022-05-08T07:24:54-07:00 summary: Add __class_getitem__ to csv.DictReader and csv.DictWriter (#92393) files: A Misc/NEWS.d/next/Library/2022-05-06-13-00-57.gh-issue-92391.s-Lase.rst M Lib/csv.py M Lib/test/test_genericalias.py M Misc/ACKS diff --git a/Lib/csv.py b/Lib/csv.py index a0782705d5af1..bfc850ee96dab 100644 --- a/Lib/csv.py +++ b/Lib/csv.py @@ -4,6 +4,7 @@ """ import re +import types from _csv import Error, __version__, writer, reader, register_dialect, \ unregister_dialect, get_dialect, list_dialects, \ field_size_limit, \ @@ -126,6 +127,8 @@ def __next__(self): d[key] = self.restval return d + __class_getitem__ = classmethod(types.GenericAlias) + class DictWriter: def __init__(self, f, fieldnames, restval="", extrasaction="raise", @@ -156,6 +159,8 @@ def writerow(self, rowdict): def writerows(self, rowdicts): return self.writer.writerows(map(self._dict_to_list, rowdicts)) + __class_getitem__ = classmethod(types.GenericAlias) + # Guard Sniffer's type checking against builds that exclude complex() try: complex diff --git a/Lib/test/test_genericalias.py b/Lib/test/test_genericalias.py index 6959c2ae3c80e..1afb7ea4f85d0 100644 --- a/Lib/test/test_genericalias.py +++ b/Lib/test/test_genericalias.py @@ -11,6 +11,7 @@ from concurrent.futures.thread import _WorkItem from contextlib import AbstractContextManager, AbstractAsyncContextManager from contextvars import ContextVar, Token +from csv import DictReader, DictWriter from dataclasses import Field from functools import partial, partialmethod, cached_property from graphlib import TopologicalSorter @@ -122,7 +123,8 @@ class BaseTest(unittest.TestCase): WeakSet, ReferenceType, ref, ShareableList, Future, _WorkItem, - Morsel] + Morsel, + DictReader, DictWriter] if ctypes is not None: generic_types.extend((ctypes.Array, ctypes.LibraryLoader)) if ValueProxy is not None: diff --git a/Misc/ACKS b/Misc/ACKS index a55706d508a41..f3d8924ea62af 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1228,6 +1228,7 @@ Alessandro Moura Pablo Mouzo Mher Movsisyan Ruslan Mstoi +Marc Mueller Valentina Mukhamedzhanova Michael Mulich Sape Mullender diff --git a/Misc/NEWS.d/next/Library/2022-05-06-13-00-57.gh-issue-92391.s-Lase.rst b/Misc/NEWS.d/next/Library/2022-05-06-13-00-57.gh-issue-92391.s-Lase.rst new file mode 100644 index 0000000000000..e042671dae816 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-05-06-13-00-57.gh-issue-92391.s-Lase.rst @@ -0,0 +1,3 @@ +Add :meth:`~object.__class_getitem__` to :class:`csv.DictReader` and +:class:`csv.DictWriter`, allowing them to be parameterized at runtime. +Patch by Marc Mueller. From webhook-mailer at python.org Sun May 8 10:35:36 2022 From: webhook-mailer at python.org (serhiy-storchaka) Date: Sun, 08 May 2022 14:35:36 -0000 Subject: [Python-checkins] gh-77630: Change Charset to charset (GH-92439) Message-ID: https://github.com/python/cpython/commit/8f293180791f2836570bdfc29aadba04a538d435 commit: 8f293180791f2836570bdfc29aadba04a538d435 branch: main author: slateny <46876382+slateny at users.noreply.github.com> committer: serhiy-storchaka date: 2022-05-08T17:35:32+03:00 summary: gh-77630: Change Charset to charset (GH-92439) files: M Doc/library/email.charset.rst M Lib/email/charset.py diff --git a/Doc/library/email.charset.rst b/Doc/library/email.charset.rst index 38fda23bd8237..adbe6c1c7d29b 100644 --- a/Doc/library/email.charset.rst +++ b/Doc/library/email.charset.rst @@ -58,9 +58,9 @@ Import this class from the :mod:`email.charset` module. .. attribute:: header_encoding If the character set must be encoded before it can be used in an email - header, this attribute will be set to ``Charset.QP`` (for - quoted-printable), ``Charset.BASE64`` (for base64 encoding), or - ``Charset.SHORTEST`` for the shortest of QP or BASE64 encoding. Otherwise, + header, this attribute will be set to ``charset.QP`` (for + quoted-printable), ``charset.BASE64`` (for base64 encoding), or + ``charset.SHORTEST`` for the shortest of QP or BASE64 encoding. Otherwise, it will be ``None``. @@ -68,7 +68,7 @@ Import this class from the :mod:`email.charset` module. Same as *header_encoding*, but describes the encoding for the mail message's body, which indeed may be different than the header encoding. - ``Charset.SHORTEST`` is not allowed for *body_encoding*. + ``charset.SHORTEST`` is not allowed for *body_encoding*. .. attribute:: output_charset @@ -175,9 +175,9 @@ new entries to the global character set, alias, and codec registries: *charset* is the input character set, and must be the canonical name of a character set. - Optional *header_enc* and *body_enc* is either ``Charset.QP`` for - quoted-printable, ``Charset.BASE64`` for base64 encoding, - ``Charset.SHORTEST`` for the shortest of quoted-printable or base64 encoding, + Optional *header_enc* and *body_enc* is either ``charset.QP`` for + quoted-printable, ``charset.BASE64`` for base64 encoding, + ``charset.SHORTEST`` for the shortest of quoted-printable or base64 encoding, or ``None`` for no encoding. ``SHORTEST`` is only valid for *header_enc*. The default is ``None`` for no encoding. diff --git a/Lib/email/charset.py b/Lib/email/charset.py index d3d759ad9115f..791b6584b2475 100644 --- a/Lib/email/charset.py +++ b/Lib/email/charset.py @@ -112,8 +112,8 @@ def add_charset(charset, header_enc=None, body_enc=None, output_charset=None): charset is the input character set, and must be the canonical name of a character set. - Optional header_enc and body_enc is either Charset.QP for - quoted-printable, Charset.BASE64 for base64 encoding, Charset.SHORTEST for + Optional header_enc and body_enc is either charset.QP for + quoted-printable, charset.BASE64 for base64 encoding, charset.SHORTEST for the shortest of qp or base64 encoding, or None for no encoding. SHORTEST is only valid for header_enc. It describes how message headers and message bodies in the input charset are to be encoded. Default is no @@ -185,13 +185,13 @@ class Charset: header_encoding: If the character set must be encoded before it can be used in an email header, this attribute will be set to - Charset.QP (for quoted-printable), Charset.BASE64 (for - base64 encoding), or Charset.SHORTEST for the shortest of + charset.QP (for quoted-printable), charset.BASE64 (for + base64 encoding), or charset.SHORTEST for the shortest of QP or BASE64 encoding. Otherwise, it will be None. body_encoding: Same as header_encoding, but describes the encoding for the mail message's body, which indeed may be different than the - header encoding. Charset.SHORTEST is not allowed for + header encoding. charset.SHORTEST is not allowed for body_encoding. output_charset: Some character sets must be converted before they can be From webhook-mailer at python.org Sun May 8 10:49:21 2022 From: webhook-mailer at python.org (serhiy-storchaka) Date: Sun, 08 May 2022 14:49:21 -0000 Subject: [Python-checkins] bpo-45046: Support context managers in unittest (GH-28045) Message-ID: https://github.com/python/cpython/commit/086c6b1b0fe8d47ebd15512d7bdcb64c60a360f0 commit: 086c6b1b0fe8d47ebd15512d7bdcb64c60a360f0 branch: main author: Serhiy Storchaka committer: serhiy-storchaka date: 2022-05-08T17:49:09+03:00 summary: bpo-45046: Support context managers in unittest (GH-28045) Add methods enterContext() and enterClassContext() in TestCase. Add method enterAsyncContext() in IsolatedAsyncioTestCase. Add function enterModuleContext(). files: A Misc/NEWS.d/next/Library/2021-08-29-19-59-16.bpo-45046.eGq0NC.rst M Doc/library/unittest.rst M Doc/whatsnew/3.11.rst M Lib/distutils/tests/test_build_ext.py M Lib/test/test__osx_support.py M Lib/test/test_argparse.py M Lib/test/test_getopt.py M Lib/test/test_gettext.py M Lib/test/test_global.py M Lib/test/test_importlib/source/test_finder.py M Lib/test/test_importlib/test_namespace_pkgs.py M Lib/test/test_logging.py M Lib/test/test_nntplib.py M Lib/test/test_peg_generator/test_c_parser.py M Lib/test/test_poll.py M Lib/test/test_posix.py M Lib/test/test_set.py M Lib/test/test_socket.py M Lib/test/test_ssl.py M Lib/test/test_tempfile.py M Lib/test/test_urllib.py M Lib/unittest/__init__.py M Lib/unittest/async_case.py M Lib/unittest/case.py M Lib/unittest/test/test_async_case.py M Lib/unittest/test/test_runner.py diff --git a/Doc/library/unittest.rst b/Doc/library/unittest.rst index 9b8b75acce514..f6bcba06d90ee 100644 --- a/Doc/library/unittest.rst +++ b/Doc/library/unittest.rst @@ -1495,6 +1495,16 @@ Test cases .. versionadded:: 3.1 + .. method:: enterContext(cm) + + Enter the supplied :term:`context manager`. If successful, also + add its :meth:`~object.__exit__` method as a cleanup function by + :meth:`addCleanup` and return the result of the + :meth:`~object.__enter__` method. + + .. versionadded:: 3.11 + + .. method:: doCleanups() This method is called unconditionally after :meth:`tearDown`, or @@ -1510,6 +1520,7 @@ Test cases .. versionadded:: 3.1 + .. classmethod:: addClassCleanup(function, /, *args, **kwargs) Add a function to be called after :meth:`tearDownClass` to cleanup @@ -1524,6 +1535,16 @@ Test cases .. versionadded:: 3.8 + .. classmethod:: enterClassContext(cm) + + Enter the supplied :term:`context manager`. If successful, also + add its :meth:`~object.__exit__` method as a cleanup function by + :meth:`addClassCleanup` and return the result of the + :meth:`~object.__enter__` method. + + .. versionadded:: 3.11 + + .. classmethod:: doClassCleanups() This method is called unconditionally after :meth:`tearDownClass`, or @@ -1571,6 +1592,16 @@ Test cases This method accepts a coroutine that can be used as a cleanup function. + .. coroutinemethod:: enterAsyncContext(cm) + + Enter the supplied :term:`asynchronous context manager`. If successful, + also add its :meth:`~object.__aexit__` method as a cleanup function by + :meth:`addAsyncCleanup` and return the result of the + :meth:`~object.__aenter__` method. + + .. versionadded:: 3.11 + + .. method:: run(result=None) Sets up a new event loop to run the test, collecting the result into @@ -2465,6 +2496,16 @@ To add cleanup code that must be run even in the case of an exception, use .. versionadded:: 3.8 +.. classmethod:: enterModuleContext(cm) + + Enter the supplied :term:`context manager`. If successful, also + add its :meth:`~object.__exit__` method as a cleanup function by + :func:`addModuleCleanup` and return the result of the + :meth:`~object.__enter__` method. + + .. versionadded:: 3.11 + + .. function:: doModuleCleanups() This function is called unconditionally after :func:`tearDownModule`, or @@ -2480,6 +2521,7 @@ To add cleanup code that must be run even in the case of an exception, use .. versionadded:: 3.8 + Signal Handling --------------- diff --git a/Doc/whatsnew/3.11.rst b/Doc/whatsnew/3.11.rst index c4e8e6f9a1051..defaeebc7739a 100644 --- a/Doc/whatsnew/3.11.rst +++ b/Doc/whatsnew/3.11.rst @@ -758,6 +758,18 @@ unicodedata * The Unicode database has been updated to version 14.0.0. (:issue:`45190`). +unittest +-------- + +* Added methods :meth:`~unittest.TestCase.enterContext` and + :meth:`~unittest.TestCase.enterClassContext` of class + :class:`~unittest.TestCase`, method + :meth:`~unittest.IsolatedAsyncioTestCase.enterAsyncContext` of + class :class:`~unittest.IsolatedAsyncioTestCase` and function + :func:`unittest.enterModuleContext`. + (Contributed by Serhiy Storchaka in :issue:`45046`.) + + venv ---- diff --git a/Lib/distutils/tests/test_build_ext.py b/Lib/distutils/tests/test_build_ext.py index 031897bd2734f..4ebeafecef03c 100644 --- a/Lib/distutils/tests/test_build_ext.py +++ b/Lib/distutils/tests/test_build_ext.py @@ -41,9 +41,7 @@ def setUp(self): # bpo-30132: On Windows, a .pdb file may be created in the current # working directory. Create a temporary working directory to cleanup # everything at the end of the test. - change_cwd = os_helper.change_cwd(self.tmp_dir) - change_cwd.__enter__() - self.addCleanup(change_cwd.__exit__, None, None, None) + self.enterContext(os_helper.change_cwd(self.tmp_dir)) def tearDown(self): import site diff --git a/Lib/test/test__osx_support.py b/Lib/test/test__osx_support.py index 907ae27d529b5..4a14cb352138e 100644 --- a/Lib/test/test__osx_support.py +++ b/Lib/test/test__osx_support.py @@ -19,8 +19,7 @@ def setUp(self): self.maxDiff = None self.prog_name = 'bogus_program_xxxx' self.temp_path_dir = os.path.abspath(os.getcwd()) - self.env = os_helper.EnvironmentVarGuard() - self.addCleanup(self.env.__exit__) + self.env = self.enterContext(os_helper.EnvironmentVarGuard()) for cv in ('CFLAGS', 'LDFLAGS', 'CPPFLAGS', 'BASECFLAGS', 'BLDSHARED', 'LDSHARED', 'CC', 'CXX', 'PY_CFLAGS', 'PY_LDFLAGS', 'PY_CPPFLAGS', diff --git a/Lib/test/test_argparse.py b/Lib/test/test_argparse.py index 8509deb93f1e2..273db45c00f7a 100644 --- a/Lib/test/test_argparse.py +++ b/Lib/test/test_argparse.py @@ -41,9 +41,8 @@ def setUp(self): # The tests assume that line wrapping occurs at 80 columns, but this # behaviour can be overridden by setting the COLUMNS environment # variable. To ensure that this width is used, set COLUMNS to 80. - env = os_helper.EnvironmentVarGuard() + env = self.enterContext(os_helper.EnvironmentVarGuard()) env['COLUMNS'] = '80' - self.addCleanup(env.__exit__) class TempDirMixin(object): @@ -3428,9 +3427,8 @@ class TestShortColumns(HelpTestCase): but we don't want any exceptions thrown in such cases. Only ugly representation. ''' def setUp(self): - env = os_helper.EnvironmentVarGuard() + env = self.enterContext(os_helper.EnvironmentVarGuard()) env.set("COLUMNS", '15') - self.addCleanup(env.__exit__) parser_signature = TestHelpBiggerOptionals.parser_signature argument_signatures = TestHelpBiggerOptionals.argument_signatures diff --git a/Lib/test/test_getopt.py b/Lib/test/test_getopt.py index 9261276ebb972..64b9ce01e05ea 100644 --- a/Lib/test/test_getopt.py +++ b/Lib/test/test_getopt.py @@ -11,14 +11,10 @@ class GetoptTests(unittest.TestCase): def setUp(self): - self.env = EnvironmentVarGuard() + self.env = self.enterContext(EnvironmentVarGuard()) if "POSIXLY_CORRECT" in self.env: del self.env["POSIXLY_CORRECT"] - def tearDown(self): - self.env.__exit__() - del self.env - def assertError(self, *args, **kwargs): self.assertRaises(getopt.GetoptError, *args, **kwargs) diff --git a/Lib/test/test_gettext.py b/Lib/test/test_gettext.py index 467652a41f0cd..1608d1b18e98f 100644 --- a/Lib/test/test_gettext.py +++ b/Lib/test/test_gettext.py @@ -117,6 +117,7 @@ class GettextBaseTest(unittest.TestCase): def setUp(self): + self.addCleanup(os_helper.rmtree, os.path.split(LOCALEDIR)[0]) if not os.path.isdir(LOCALEDIR): os.makedirs(LOCALEDIR) with open(MOFILE, 'wb') as fp: @@ -129,14 +130,10 @@ def setUp(self): fp.write(base64.decodebytes(UMO_DATA)) with open(MMOFILE, 'wb') as fp: fp.write(base64.decodebytes(MMO_DATA)) - self.env = os_helper.EnvironmentVarGuard() + self.env = self.enterContext(os_helper.EnvironmentVarGuard()) self.env['LANGUAGE'] = 'xx' gettext._translations.clear() - def tearDown(self): - self.env.__exit__() - del self.env - os_helper.rmtree(os.path.split(LOCALEDIR)[0]) GNU_MO_DATA_ISSUE_17898 = b'''\ 3hIElQAAAAABAAAAHAAAACQAAAAAAAAAAAAAAAAAAAAsAAAAggAAAC0AAAAAUGx1cmFsLUZvcm1z diff --git a/Lib/test/test_global.py b/Lib/test/test_global.py index d0bde3fd040e6..f5b38c25ea072 100644 --- a/Lib/test/test_global.py +++ b/Lib/test/test_global.py @@ -9,14 +9,9 @@ class GlobalTests(unittest.TestCase): def setUp(self): - self._warnings_manager = check_warnings() - self._warnings_manager.__enter__() + self.enterContext(check_warnings()) warnings.filterwarnings("error", module="") - def tearDown(self): - self._warnings_manager.__exit__(None, None, None) - - def test1(self): prog_text_1 = """\ def wrong1(): @@ -54,9 +49,7 @@ def test4(self): def setUpModule(): - cm = warnings.catch_warnings() - cm.__enter__() - unittest.addModuleCleanup(cm.__exit__, None, None, None) + unittest.enterModuleContext(warnings.catch_warnings()) warnings.filterwarnings("error", module="") diff --git a/Lib/test/test_importlib/source/test_finder.py b/Lib/test/test_importlib/source/test_finder.py index 6a23e9d50f6ff..bed9d56dca84e 100644 --- a/Lib/test/test_importlib/source/test_finder.py +++ b/Lib/test/test_importlib/source/test_finder.py @@ -157,21 +157,12 @@ def test_dir_removal_handling(self): def test_no_read_directory(self): # Issue #16730 tempdir = tempfile.TemporaryDirectory() + self.enterContext(tempdir) + # Since we muck with the permissions, we want to set them back to + # their original values to make sure the directory can be properly + # cleaned up. original_mode = os.stat(tempdir.name).st_mode - def cleanup(tempdir): - """Cleanup function for the temporary directory. - - Since we muck with the permissions, we want to set them back to - their original values to make sure the directory can be properly - cleaned up. - - """ - os.chmod(tempdir.name, original_mode) - # If this is not explicitly called then the __del__ method is used, - # but since already mucking around might as well explicitly clean - # up. - tempdir.__exit__(None, None, None) - self.addCleanup(cleanup, tempdir) + self.addCleanup(os.chmod, tempdir.name, original_mode) os.chmod(tempdir.name, stat.S_IWUSR | stat.S_IXUSR) finder = self.get_finder(tempdir.name) found = self._find(finder, 'doesnotexist') diff --git a/Lib/test/test_importlib/test_namespace_pkgs.py b/Lib/test/test_importlib/test_namespace_pkgs.py index 2ea41b7a4c5c3..cd08498545e80 100644 --- a/Lib/test/test_importlib/test_namespace_pkgs.py +++ b/Lib/test/test_importlib/test_namespace_pkgs.py @@ -65,12 +65,7 @@ def setUp(self): self.resolved_paths = [ os.path.join(self.root, path) for path in self.paths ] - self.ctx = namespace_tree_context(path=self.resolved_paths) - self.ctx.__enter__() - - def tearDown(self): - # TODO: will we ever want to pass exc_info to __exit__? - self.ctx.__exit__(None, None, None) + self.enterContext(namespace_tree_context(path=self.resolved_paths)) class SingleNamespacePackage(NamespacePackageTest): diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py index 5d4ddedd059fc..e69afae484aa7 100644 --- a/Lib/test/test_logging.py +++ b/Lib/test/test_logging.py @@ -5650,9 +5650,7 @@ def test__all__(self): # why the test does this, but in any case we save the current locale # first and restore it at the end. def setUpModule(): - cm = support.run_with_locale('LC_ALL', '') - cm.__enter__() - unittest.addModuleCleanup(cm.__exit__, None, None, None) + unittest.enterModuleContext(support.run_with_locale('LC_ALL', '')) if __name__ == "__main__": diff --git a/Lib/test/test_nntplib.py b/Lib/test/test_nntplib.py index 9812c05519351..31a02f86abb00 100644 --- a/Lib/test/test_nntplib.py +++ b/Lib/test/test_nntplib.py @@ -1593,8 +1593,7 @@ def setUp(self): self.background.start() self.addCleanup(self.background.join) - self.nntp = NNTP(socket_helper.HOST, port, usenetrc=False).__enter__() - self.addCleanup(self.nntp.__exit__, None, None, None) + self.nntp = self.enterContext(NNTP(socket_helper.HOST, port, usenetrc=False)) def run_server(self, sock): # Could be generalized to handle more commands in separate methods diff --git a/Lib/test/test_peg_generator/test_c_parser.py b/Lib/test/test_peg_generator/test_c_parser.py index 13b83a9db9eb3..d25bc112cfdc4 100644 --- a/Lib/test/test_peg_generator/test_c_parser.py +++ b/Lib/test/test_peg_generator/test_c_parser.py @@ -96,9 +96,7 @@ def setUp(self): self.skipTest("The %r command is not found" % cmd) self.old_cwd = os.getcwd() self.tmp_path = tempfile.mkdtemp(dir=self.tmp_base) - change_cwd = os_helper.change_cwd(self.tmp_path) - change_cwd.__enter__() - self.addCleanup(change_cwd.__exit__, None, None, None) + self.enterContext(os_helper.change_cwd(self.tmp_path)) def tearDown(self): os.chdir(self.old_cwd) diff --git a/Lib/test/test_poll.py b/Lib/test/test_poll.py index 7d542b5cfd783..02165a0244ddf 100644 --- a/Lib/test/test_poll.py +++ b/Lib/test/test_poll.py @@ -128,8 +128,7 @@ def test_poll2(self): cmd = 'for i in 0 1 2 3 4 5 6 7 8 9; do echo testing...; sleep 1; done' proc = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, bufsize=0) - proc.__enter__() - self.addCleanup(proc.__exit__, None, None, None) + self.enterContext(proc) p = proc.stdout pollster = select.poll() pollster.register( p, select.POLLIN ) diff --git a/Lib/test/test_posix.py b/Lib/test/test_posix.py index f44b8d0403ff2..28e5e90297e24 100644 --- a/Lib/test/test_posix.py +++ b/Lib/test/test_posix.py @@ -53,19 +53,13 @@ class PosixTester(unittest.TestCase): def setUp(self): # create empty file + self.addCleanup(os_helper.unlink, os_helper.TESTFN) with open(os_helper.TESTFN, "wb"): pass - self.teardown_files = [ os_helper.TESTFN ] - self._warnings_manager = warnings_helper.check_warnings() - self._warnings_manager.__enter__() + self.enterContext(warnings_helper.check_warnings()) warnings.filterwarnings('ignore', '.* potential security risk .*', RuntimeWarning) - def tearDown(self): - for teardown_file in self.teardown_files: - os_helper.unlink(teardown_file) - self._warnings_manager.__exit__(None, None, None) - def testNoArgFunctions(self): # test posix functions which take no arguments and have # no side-effects which we need to cleanup (e.g., fork, wait, abort) @@ -973,8 +967,8 @@ def test_lchflags_symlink(self): self.assertTrue(hasattr(testfn_st, 'st_flags')) + self.addCleanup(os_helper.unlink, _DUMMY_SYMLINK) os.symlink(os_helper.TESTFN, _DUMMY_SYMLINK) - self.teardown_files.append(_DUMMY_SYMLINK) dummy_symlink_st = os.lstat(_DUMMY_SYMLINK) def chflags_nofollow(path, flags): diff --git a/Lib/test/test_set.py b/Lib/test/test_set.py index 3b57517a86101..43f23dbbf9bf7 100644 --- a/Lib/test/test_set.py +++ b/Lib/test/test_set.py @@ -1022,8 +1022,7 @@ def test_repr(self): class TestBasicOpsMixedStringBytes(TestBasicOps, unittest.TestCase): def setUp(self): - self._warning_filters = warnings_helper.check_warnings() - self._warning_filters.__enter__() + self.enterContext(warnings_helper.check_warnings()) warnings.simplefilter('ignore', BytesWarning) self.case = "string and bytes set" self.values = ["a", "b", b"a", b"b"] @@ -1031,9 +1030,6 @@ def setUp(self): self.dup = set(self.values) self.length = 4 - def tearDown(self): - self._warning_filters.__exit__(None, None, None) - def test_repr(self): self.check_repr_against_values() diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py index 613363722cf02..1aaa9e44f90c6 100755 --- a/Lib/test/test_socket.py +++ b/Lib/test/test_socket.py @@ -338,9 +338,7 @@ def serverExplicitReady(self): self.server_ready.set() def _setUp(self): - self.wait_threads = threading_helper.wait_threads_exit() - self.wait_threads.__enter__() - self.addCleanup(self.wait_threads.__exit__, None, None, None) + self.enterContext(threading_helper.wait_threads_exit()) self.server_ready = threading.Event() self.client_ready = threading.Event() diff --git a/Lib/test/test_ssl.py b/Lib/test/test_ssl.py index 0eb8d18b3561e..fed76378726c9 100644 --- a/Lib/test/test_ssl.py +++ b/Lib/test/test_ssl.py @@ -1999,9 +1999,8 @@ def setUp(self): self.server_context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER) self.server_context.load_cert_chain(SIGNED_CERTFILE) server = ThreadedEchoServer(context=self.server_context) + self.enterContext(server) self.server_addr = (HOST, server.port) - server.__enter__() - self.addCleanup(server.__exit__, None, None, None) def test_connect(self): with test_wrap_socket(socket.socket(socket.AF_INET), @@ -3713,8 +3712,7 @@ def _recvfrom_into(): def test_recv_zero(self): server = ThreadedEchoServer(CERTFILE) - server.__enter__() - self.addCleanup(server.__exit__, None, None) + self.enterContext(server) s = socket.create_connection((HOST, server.port)) self.addCleanup(s.close) s = test_wrap_socket(s, suppress_ragged_eofs=False) diff --git a/Lib/test/test_tempfile.py b/Lib/test/test_tempfile.py index a05f3c84ccfc9..f056e5ccb17f9 100644 --- a/Lib/test/test_tempfile.py +++ b/Lib/test/test_tempfile.py @@ -90,14 +90,10 @@ class BaseTestCase(unittest.TestCase): b_check = re.compile(br"^[a-z0-9_-]{8}$") def setUp(self): - self._warnings_manager = warnings_helper.check_warnings() - self._warnings_manager.__enter__() + self.enterContext(warnings_helper.check_warnings()) warnings.filterwarnings("ignore", category=RuntimeWarning, message="mktemp", module=__name__) - def tearDown(self): - self._warnings_manager.__exit__(None, None, None) - def nameCheck(self, name, dir, pre, suf): (ndir, nbase) = os.path.split(name) npre = nbase[:len(pre)] diff --git a/Lib/test/test_urllib.py b/Lib/test/test_urllib.py index 82f1d9dc2e7bb..bc6e74c291ac1 100644 --- a/Lib/test/test_urllib.py +++ b/Lib/test/test_urllib.py @@ -232,17 +232,12 @@ class ProxyTests(unittest.TestCase): def setUp(self): # Records changes to env vars - self.env = os_helper.EnvironmentVarGuard() + self.env = self.enterContext(os_helper.EnvironmentVarGuard()) # Delete all proxy related env vars for k in list(os.environ): if 'proxy' in k.lower(): self.env.unset(k) - def tearDown(self): - # Restore all proxy related env vars - self.env.__exit__() - del self.env - def test_getproxies_environment_keep_no_proxies(self): self.env.set('NO_PROXY', 'localhost') proxies = urllib.request.getproxies_environment() diff --git a/Lib/unittest/__init__.py b/Lib/unittest/__init__.py index eda951ce73e66..005d23f6d00ec 100644 --- a/Lib/unittest/__init__.py +++ b/Lib/unittest/__init__.py @@ -49,7 +49,7 @@ def testMultiply(self): 'defaultTestLoader', 'SkipTest', 'skip', 'skipIf', 'skipUnless', 'expectedFailure', 'TextTestResult', 'installHandler', 'registerResult', 'removeResult', 'removeHandler', - 'addModuleCleanup', 'doModuleCleanups'] + 'addModuleCleanup', 'doModuleCleanups', 'enterModuleContext'] # Expose obsolete functions for backwards compatibility # bpo-5846: Deprecated in Python 3.11, scheduled for removal in Python 3.13. @@ -59,7 +59,8 @@ def testMultiply(self): from .result import TestResult from .case import (addModuleCleanup, TestCase, FunctionTestCase, SkipTest, skip, - skipIf, skipUnless, expectedFailure, doModuleCleanups) + skipIf, skipUnless, expectedFailure, doModuleCleanups, + enterModuleContext) from .suite import BaseTestSuite, TestSuite from .loader import TestLoader, defaultTestLoader from .main import TestProgram, main diff --git a/Lib/unittest/async_case.py b/Lib/unittest/async_case.py index 85b938fb293af..a90eed98f8714 100644 --- a/Lib/unittest/async_case.py +++ b/Lib/unittest/async_case.py @@ -58,6 +58,26 @@ def addAsyncCleanup(self, func, /, *args, **kwargs): # 3. Regular "def func()" that returns awaitable object self.addCleanup(*(func, *args), **kwargs) + async def enterAsyncContext(self, cm): + """Enters the supplied asynchronous context manager. + + If successful, also adds its __aexit__ method as a cleanup + function and returns the result of the __aenter__ method. + """ + # We look up the special methods on the type to match the with + # statement. + cls = type(cm) + try: + enter = cls.__aenter__ + exit = cls.__aexit__ + except AttributeError: + raise TypeError(f"'{cls.__module__}.{cls.__qualname__}' object does " + f"not support the asynchronous context manager protocol" + ) from None + result = await enter(cm) + self.addAsyncCleanup(exit, cm, None, None, None) + return result + def _callSetUp(self): self._asyncioTestContext.run(self.setUp) self._callAsync(self.asyncSetUp) diff --git a/Lib/unittest/case.py b/Lib/unittest/case.py index 55770c06d7c5d..ffc8f19ddd38d 100644 --- a/Lib/unittest/case.py +++ b/Lib/unittest/case.py @@ -102,12 +102,31 @@ def _id(obj): return obj +def _enter_context(cm, addcleanup): + # We look up the special methods on the type to match the with + # statement. + cls = type(cm) + try: + enter = cls.__enter__ + exit = cls.__exit__ + except AttributeError: + raise TypeError(f"'{cls.__module__}.{cls.__qualname__}' object does " + f"not support the context manager protocol") from None + result = enter(cm) + addcleanup(exit, cm, None, None, None) + return result + + _module_cleanups = [] def addModuleCleanup(function, /, *args, **kwargs): """Same as addCleanup, except the cleanup items are called even if setUpModule fails (unlike tearDownModule).""" _module_cleanups.append((function, args, kwargs)) +def enterModuleContext(cm): + """Same as enterContext, but module-wide.""" + return _enter_context(cm, addModuleCleanup) + def doModuleCleanups(): """Execute all module cleanup functions. Normally called for you after @@ -426,12 +445,25 @@ def addCleanup(self, function, /, *args, **kwargs): Cleanup items are called even if setUp fails (unlike tearDown).""" self._cleanups.append((function, args, kwargs)) + def enterContext(self, cm): + """Enters the supplied context manager. + + If successful, also adds its __exit__ method as a cleanup + function and returns the result of the __enter__ method. + """ + return _enter_context(cm, self.addCleanup) + @classmethod def addClassCleanup(cls, function, /, *args, **kwargs): """Same as addCleanup, except the cleanup items are called even if setUpClass fails (unlike tearDownClass).""" cls._class_cleanups.append((function, args, kwargs)) + @classmethod + def enterClassContext(cls, cm): + """Same as enterContext, but class-wide.""" + return _enter_context(cm, cls.addClassCleanup) + def setUp(self): "Hook method for setting up the test fixture before exercising it." pass diff --git a/Lib/unittest/test/test_async_case.py b/Lib/unittest/test/test_async_case.py index 1b910a44eea0d..beadcac070b43 100644 --- a/Lib/unittest/test/test_async_case.py +++ b/Lib/unittest/test/test_async_case.py @@ -14,6 +14,29 @@ def tearDownModule(): asyncio.set_event_loop_policy(None) +class TestCM: + def __init__(self, ordering, enter_result=None): + self.ordering = ordering + self.enter_result = enter_result + + async def __aenter__(self): + self.ordering.append('enter') + return self.enter_result + + async def __aexit__(self, *exc_info): + self.ordering.append('exit') + + +class LacksEnterAndExit: + pass +class LacksEnter: + async def __aexit__(self, *exc_info): + pass +class LacksExit: + async def __aenter__(self): + pass + + VAR = contextvars.ContextVar('VAR', default=()) @@ -337,6 +360,36 @@ async def coro(): output = test.run() self.assertTrue(cancelled) + def test_enterAsyncContext(self): + events = [] + + class Test(unittest.IsolatedAsyncioTestCase): + async def test_func(slf): + slf.addAsyncCleanup(events.append, 'cleanup1') + cm = TestCM(events, 42) + self.assertEqual(await slf.enterAsyncContext(cm), 42) + slf.addAsyncCleanup(events.append, 'cleanup2') + events.append('test') + + test = Test('test_func') + output = test.run() + self.assertTrue(output.wasSuccessful(), output) + self.assertEqual(events, ['enter', 'test', 'cleanup2', 'exit', 'cleanup1']) + + def test_enterAsyncContext_arg_errors(self): + class Test(unittest.IsolatedAsyncioTestCase): + async def test_func(slf): + with self.assertRaisesRegex(TypeError, 'asynchronous context manager'): + await slf.enterAsyncContext(LacksEnterAndExit()) + with self.assertRaisesRegex(TypeError, 'asynchronous context manager'): + await slf.enterAsyncContext(LacksEnter()) + with self.assertRaisesRegex(TypeError, 'asynchronous context manager'): + await slf.enterAsyncContext(LacksExit()) + + test = Test('test_func') + output = test.run() + self.assertTrue(output.wasSuccessful()) + def test_debug_cleanup_same_loop(self): class Test(unittest.IsolatedAsyncioTestCase): async def asyncSetUp(self): diff --git a/Lib/unittest/test/test_runner.py b/Lib/unittest/test/test_runner.py index 18062ae5a5871..d3488b40e82bd 100644 --- a/Lib/unittest/test/test_runner.py +++ b/Lib/unittest/test/test_runner.py @@ -46,6 +46,29 @@ def cleanup(ordering, blowUp=False): raise Exception('CleanUpExc') +class TestCM: + def __init__(self, ordering, enter_result=None): + self.ordering = ordering + self.enter_result = enter_result + + def __enter__(self): + self.ordering.append('enter') + return self.enter_result + + def __exit__(self, *exc_info): + self.ordering.append('exit') + + +class LacksEnterAndExit: + pass +class LacksEnter: + def __exit__(self, *exc_info): + pass +class LacksExit: + def __enter__(self): + pass + + class TestCleanUp(unittest.TestCase): def testCleanUp(self): class TestableTest(unittest.TestCase): @@ -173,6 +196,39 @@ def cleanup2(): self.assertEqual(ordering, ['setUp', 'test', 'tearDown', 'cleanup1', 'cleanup2']) + def test_enterContext(self): + class TestableTest(unittest.TestCase): + def testNothing(self): + pass + + test = TestableTest('testNothing') + cleanups = [] + + test.addCleanup(cleanups.append, 'cleanup1') + cm = TestCM(cleanups, 42) + self.assertEqual(test.enterContext(cm), 42) + test.addCleanup(cleanups.append, 'cleanup2') + + self.assertTrue(test.doCleanups()) + self.assertEqual(cleanups, ['enter', 'cleanup2', 'exit', 'cleanup1']) + + def test_enterContext_arg_errors(self): + class TestableTest(unittest.TestCase): + def testNothing(self): + pass + + test = TestableTest('testNothing') + + with self.assertRaisesRegex(TypeError, 'the context manager'): + test.enterContext(LacksEnterAndExit()) + with self.assertRaisesRegex(TypeError, 'the context manager'): + test.enterContext(LacksEnter()) + with self.assertRaisesRegex(TypeError, 'the context manager'): + test.enterContext(LacksExit()) + + self.assertEqual(test._cleanups, []) + + class TestClassCleanup(unittest.TestCase): def test_addClassCleanUp(self): class TestableTest(unittest.TestCase): @@ -451,6 +507,35 @@ def tearDownClass(cls): self.assertEqual(ordering, ['setUpClass', 'test', 'tearDownClass', 'cleanup_good']) + def test_enterClassContext(self): + class TestableTest(unittest.TestCase): + def testNothing(self): + pass + + cleanups = [] + + TestableTest.addClassCleanup(cleanups.append, 'cleanup1') + cm = TestCM(cleanups, 42) + self.assertEqual(TestableTest.enterClassContext(cm), 42) + TestableTest.addClassCleanup(cleanups.append, 'cleanup2') + + TestableTest.doClassCleanups() + self.assertEqual(cleanups, ['enter', 'cleanup2', 'exit', 'cleanup1']) + + def test_enterClassContext_arg_errors(self): + class TestableTest(unittest.TestCase): + def testNothing(self): + pass + + with self.assertRaisesRegex(TypeError, 'the context manager'): + TestableTest.enterClassContext(LacksEnterAndExit()) + with self.assertRaisesRegex(TypeError, 'the context manager'): + TestableTest.enterClassContext(LacksEnter()) + with self.assertRaisesRegex(TypeError, 'the context manager'): + TestableTest.enterClassContext(LacksExit()) + + self.assertEqual(TestableTest._class_cleanups, []) + class TestModuleCleanUp(unittest.TestCase): def test_add_and_do_ModuleCleanup(self): @@ -1000,6 +1085,31 @@ def tearDown(self): 'cleanup2', 'setUp2', 'test2', 'tearDown2', 'cleanup3', 'tearDownModule', 'cleanup1']) + def test_enterModuleContext(self): + cleanups = [] + + unittest.addModuleCleanup(cleanups.append, 'cleanup1') + cm = TestCM(cleanups, 42) + self.assertEqual(unittest.enterModuleContext(cm), 42) + unittest.addModuleCleanup(cleanups.append, 'cleanup2') + + unittest.case.doModuleCleanups() + self.assertEqual(cleanups, ['enter', 'cleanup2', 'exit', 'cleanup1']) + + def test_enterModuleContext_arg_errors(self): + class TestableTest(unittest.TestCase): + def testNothing(self): + pass + + with self.assertRaisesRegex(TypeError, 'the context manager'): + unittest.enterModuleContext(LacksEnterAndExit()) + with self.assertRaisesRegex(TypeError, 'the context manager'): + unittest.enterModuleContext(LacksEnter()) + with self.assertRaisesRegex(TypeError, 'the context manager'): + unittest.enterModuleContext(LacksExit()) + + self.assertEqual(unittest.case._module_cleanups, []) + class Test_TextTestRunner(unittest.TestCase): """Tests for TextTestRunner.""" diff --git a/Misc/NEWS.d/next/Library/2021-08-29-19-59-16.bpo-45046.eGq0NC.rst b/Misc/NEWS.d/next/Library/2021-08-29-19-59-16.bpo-45046.eGq0NC.rst new file mode 100644 index 0000000000000..8072afaf445c5 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2021-08-29-19-59-16.bpo-45046.eGq0NC.rst @@ -0,0 +1,7 @@ +Add support of context managers in :mod:`unittest`: methods +:meth:`~unittest.TestCase.enterContext` and +:meth:`~unittest.TestCase.enterClassContext` of class +:class:`~unittest.TestCase`, method +:meth:`~unittest.IsolatedAsyncioTestCase.enterAsyncContext` of class +:class:`~unittest.IsolatedAsyncioTestCase` and function +:func:`unittest.enterModuleContext`. From webhook-mailer at python.org Sun May 8 11:04:10 2022 From: webhook-mailer at python.org (miss-islington) Date: Sun, 08 May 2022 15:04:10 -0000 Subject: [Python-checkins] gh-92417: `typing` docs: `from __future__ import annotations` can be used in all supported Python versions (GH-92418) Message-ID: https://github.com/python/cpython/commit/731e844b1779e8251b2b4084275f5b166554fe8a commit: 731e844b1779e8251b2b4084275f5b166554fe8a branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-08T08:04:06-07:00 summary: gh-92417: `typing` docs: `from __future__ import annotations` can be used in all supported Python versions (GH-92418) (cherry picked from commit e5b4bd4d60aaf0292c5b9d628512145b8987b3c6) Co-authored-by: Alex Waygood files: M Doc/library/typing.rst diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index b86c34a6599b4..f3c6a2e07475a 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -1944,7 +1944,7 @@ Constant .. note:: - If ``from __future__ import annotations`` is used in Python 3.7 or later, + If ``from __future__ import annotations`` is used, annotations are not evaluated at function definition time. Instead, they are stored as strings in ``__annotations__``. This makes it unnecessary to use quotes around the annotation From webhook-mailer at python.org Sun May 8 11:04:22 2022 From: webhook-mailer at python.org (miss-islington) Date: Sun, 08 May 2022 15:04:22 -0000 Subject: [Python-checkins] gh-92417: `typing` docs: `from __future__ import annotations` can be used in all supported Python versions (GH-92418) Message-ID: https://github.com/python/cpython/commit/80ce70110b61db63a7dec33df59369b0b1b09144 commit: 80ce70110b61db63a7dec33df59369b0b1b09144 branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-08T08:04:18-07:00 summary: gh-92417: `typing` docs: `from __future__ import annotations` can be used in all supported Python versions (GH-92418) (cherry picked from commit e5b4bd4d60aaf0292c5b9d628512145b8987b3c6) Co-authored-by: Alex Waygood files: M Doc/library/typing.rst diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index bcf2b22b1a3c2..9936f1a3e57c3 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -2290,7 +2290,7 @@ Constant .. note:: - If ``from __future__ import annotations`` is used in Python 3.7 or later, + If ``from __future__ import annotations`` is used, annotations are not evaluated at function definition time. Instead, they are stored as strings in ``__annotations__``. This makes it unnecessary to use quotes around the annotation From webhook-mailer at python.org Sun May 8 11:04:35 2022 From: webhook-mailer at python.org (miss-islington) Date: Sun, 08 May 2022 15:04:35 -0000 Subject: [Python-checkins] gh-92417: `typing` docs: `from __future__ import annotations` can be used in all supported Python versions (GH-92418) Message-ID: https://github.com/python/cpython/commit/a85bdd7e025f8b87b88d914f4df8f0b620398ea9 commit: a85bdd7e025f8b87b88d914f4df8f0b620398ea9 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-08T08:04:31-07:00 summary: gh-92417: `typing` docs: `from __future__ import annotations` can be used in all supported Python versions (GH-92418) (cherry picked from commit e5b4bd4d60aaf0292c5b9d628512145b8987b3c6) Co-authored-by: Alex Waygood files: M Doc/library/typing.rst diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index 005a515234110..1d125fb1ebebb 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -2668,7 +2668,7 @@ Constant .. note:: - If ``from __future__ import annotations`` is used in Python 3.7 or later, + If ``from __future__ import annotations`` is used, annotations are not evaluated at function definition time. Instead, they are stored as strings in ``__annotations__``. This makes it unnecessary to use quotes around the annotation From webhook-mailer at python.org Sun May 8 11:05:34 2022 From: webhook-mailer at python.org (Fidget-Spinner) Date: Sun, 08 May 2022 15:05:34 -0000 Subject: [Python-checkins] Update What's New in 3.11 faster cpython figures and contributors (GH-92401) Message-ID: https://github.com/python/cpython/commit/b7380948f2eeb46aca9ef54889d61df9c4ad0203 commit: b7380948f2eeb46aca9ef54889d61df9c4ad0203 branch: main author: Ken Jin committer: Fidget-Spinner date: 2022-05-08T23:05:30+08:00 summary: Update What's New in 3.11 faster cpython figures and contributors (GH-92401) files: M Doc/whatsnew/3.11.rst diff --git a/Doc/whatsnew/3.11.rst b/Doc/whatsnew/3.11.rst index defaeebc7739a..ddae025af5b16 100644 --- a/Doc/whatsnew/3.11.rst +++ b/Doc/whatsnew/3.11.rst @@ -63,7 +63,7 @@ Summary -- Release highlights Brevity is key. - Python 3.11 is up to 10-60% faster than Python 3.10. On average, we measured a - 1.22x speedup on the standard benchmark suite. See `Faster CPython`_ for details. + 1.25x speedup on the standard benchmark suite. See `Faster CPython`_ for details. .. PEP-sized items next. @@ -840,7 +840,7 @@ Optimizations Faster CPython ============== -CPython 3.11 is on average `1.22x faster `_ +CPython 3.11 is on average `1.25x faster `_ than CPython 3.10 when measured with the `pyperformance `_ benchmark suite, and compiled with GCC on Ubuntu Linux. Depending on your workload, the speedup @@ -942,7 +942,8 @@ and specialization attempts are not too expensive. This allows specialization to adapt to new circumstances. (PEP written by Mark Shannon, with ideas inspired by Stefan Brunthaler. -See :pep:`659` for more information.) +See :pep:`659` for more information. Implementation by Mark Shannon and Brandt +Bucher, with additional help from Irit Katriel and Dennis Sweeney.) .. If I missed out anyone, please add them. From webhook-mailer at python.org Sun May 8 11:12:24 2022 From: webhook-mailer at python.org (miss-islington) Date: Sun, 08 May 2022 15:12:24 -0000 Subject: [Python-checkins] bpo-45046: Support context managers in unittest (GH-28045) Message-ID: https://github.com/python/cpython/commit/c63c8ac2389d715c761f56bfcf17a685b62a0bd3 commit: c63c8ac2389d715c761f56bfcf17a685b62a0bd3 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-08T08:12:19-07:00 summary: bpo-45046: Support context managers in unittest (GH-28045) Add methods enterContext() and enterClassContext() in TestCase. Add method enterAsyncContext() in IsolatedAsyncioTestCase. Add function enterModuleContext(). (cherry picked from commit 086c6b1b0fe8d47ebd15512d7bdcb64c60a360f0) Co-authored-by: Serhiy Storchaka files: A Misc/NEWS.d/next/Library/2021-08-29-19-59-16.bpo-45046.eGq0NC.rst M Doc/library/unittest.rst M Doc/whatsnew/3.11.rst M Lib/distutils/tests/test_build_ext.py M Lib/test/test__osx_support.py M Lib/test/test_argparse.py M Lib/test/test_getopt.py M Lib/test/test_gettext.py M Lib/test/test_global.py M Lib/test/test_importlib/source/test_finder.py M Lib/test/test_importlib/test_namespace_pkgs.py M Lib/test/test_logging.py M Lib/test/test_nntplib.py M Lib/test/test_peg_generator/test_c_parser.py M Lib/test/test_poll.py M Lib/test/test_posix.py M Lib/test/test_set.py M Lib/test/test_socket.py M Lib/test/test_ssl.py M Lib/test/test_tempfile.py M Lib/test/test_urllib.py M Lib/unittest/__init__.py M Lib/unittest/async_case.py M Lib/unittest/case.py M Lib/unittest/test/test_async_case.py M Lib/unittest/test/test_runner.py diff --git a/Doc/library/unittest.rst b/Doc/library/unittest.rst index 9b8b75acce514..f6bcba06d90ee 100644 --- a/Doc/library/unittest.rst +++ b/Doc/library/unittest.rst @@ -1495,6 +1495,16 @@ Test cases .. versionadded:: 3.1 + .. method:: enterContext(cm) + + Enter the supplied :term:`context manager`. If successful, also + add its :meth:`~object.__exit__` method as a cleanup function by + :meth:`addCleanup` and return the result of the + :meth:`~object.__enter__` method. + + .. versionadded:: 3.11 + + .. method:: doCleanups() This method is called unconditionally after :meth:`tearDown`, or @@ -1510,6 +1520,7 @@ Test cases .. versionadded:: 3.1 + .. classmethod:: addClassCleanup(function, /, *args, **kwargs) Add a function to be called after :meth:`tearDownClass` to cleanup @@ -1524,6 +1535,16 @@ Test cases .. versionadded:: 3.8 + .. classmethod:: enterClassContext(cm) + + Enter the supplied :term:`context manager`. If successful, also + add its :meth:`~object.__exit__` method as a cleanup function by + :meth:`addClassCleanup` and return the result of the + :meth:`~object.__enter__` method. + + .. versionadded:: 3.11 + + .. classmethod:: doClassCleanups() This method is called unconditionally after :meth:`tearDownClass`, or @@ -1571,6 +1592,16 @@ Test cases This method accepts a coroutine that can be used as a cleanup function. + .. coroutinemethod:: enterAsyncContext(cm) + + Enter the supplied :term:`asynchronous context manager`. If successful, + also add its :meth:`~object.__aexit__` method as a cleanup function by + :meth:`addAsyncCleanup` and return the result of the + :meth:`~object.__aenter__` method. + + .. versionadded:: 3.11 + + .. method:: run(result=None) Sets up a new event loop to run the test, collecting the result into @@ -2465,6 +2496,16 @@ To add cleanup code that must be run even in the case of an exception, use .. versionadded:: 3.8 +.. classmethod:: enterModuleContext(cm) + + Enter the supplied :term:`context manager`. If successful, also + add its :meth:`~object.__exit__` method as a cleanup function by + :func:`addModuleCleanup` and return the result of the + :meth:`~object.__enter__` method. + + .. versionadded:: 3.11 + + .. function:: doModuleCleanups() This function is called unconditionally after :func:`tearDownModule`, or @@ -2480,6 +2521,7 @@ To add cleanup code that must be run even in the case of an exception, use .. versionadded:: 3.8 + Signal Handling --------------- diff --git a/Doc/whatsnew/3.11.rst b/Doc/whatsnew/3.11.rst index c4e8e6f9a1051..defaeebc7739a 100644 --- a/Doc/whatsnew/3.11.rst +++ b/Doc/whatsnew/3.11.rst @@ -758,6 +758,18 @@ unicodedata * The Unicode database has been updated to version 14.0.0. (:issue:`45190`). +unittest +-------- + +* Added methods :meth:`~unittest.TestCase.enterContext` and + :meth:`~unittest.TestCase.enterClassContext` of class + :class:`~unittest.TestCase`, method + :meth:`~unittest.IsolatedAsyncioTestCase.enterAsyncContext` of + class :class:`~unittest.IsolatedAsyncioTestCase` and function + :func:`unittest.enterModuleContext`. + (Contributed by Serhiy Storchaka in :issue:`45046`.) + + venv ---- diff --git a/Lib/distutils/tests/test_build_ext.py b/Lib/distutils/tests/test_build_ext.py index 031897bd2734f..4ebeafecef03c 100644 --- a/Lib/distutils/tests/test_build_ext.py +++ b/Lib/distutils/tests/test_build_ext.py @@ -41,9 +41,7 @@ def setUp(self): # bpo-30132: On Windows, a .pdb file may be created in the current # working directory. Create a temporary working directory to cleanup # everything at the end of the test. - change_cwd = os_helper.change_cwd(self.tmp_dir) - change_cwd.__enter__() - self.addCleanup(change_cwd.__exit__, None, None, None) + self.enterContext(os_helper.change_cwd(self.tmp_dir)) def tearDown(self): import site diff --git a/Lib/test/test__osx_support.py b/Lib/test/test__osx_support.py index 907ae27d529b5..4a14cb352138e 100644 --- a/Lib/test/test__osx_support.py +++ b/Lib/test/test__osx_support.py @@ -19,8 +19,7 @@ def setUp(self): self.maxDiff = None self.prog_name = 'bogus_program_xxxx' self.temp_path_dir = os.path.abspath(os.getcwd()) - self.env = os_helper.EnvironmentVarGuard() - self.addCleanup(self.env.__exit__) + self.env = self.enterContext(os_helper.EnvironmentVarGuard()) for cv in ('CFLAGS', 'LDFLAGS', 'CPPFLAGS', 'BASECFLAGS', 'BLDSHARED', 'LDSHARED', 'CC', 'CXX', 'PY_CFLAGS', 'PY_LDFLAGS', 'PY_CPPFLAGS', diff --git a/Lib/test/test_argparse.py b/Lib/test/test_argparse.py index 8509deb93f1e2..273db45c00f7a 100644 --- a/Lib/test/test_argparse.py +++ b/Lib/test/test_argparse.py @@ -41,9 +41,8 @@ def setUp(self): # The tests assume that line wrapping occurs at 80 columns, but this # behaviour can be overridden by setting the COLUMNS environment # variable. To ensure that this width is used, set COLUMNS to 80. - env = os_helper.EnvironmentVarGuard() + env = self.enterContext(os_helper.EnvironmentVarGuard()) env['COLUMNS'] = '80' - self.addCleanup(env.__exit__) class TempDirMixin(object): @@ -3428,9 +3427,8 @@ class TestShortColumns(HelpTestCase): but we don't want any exceptions thrown in such cases. Only ugly representation. ''' def setUp(self): - env = os_helper.EnvironmentVarGuard() + env = self.enterContext(os_helper.EnvironmentVarGuard()) env.set("COLUMNS", '15') - self.addCleanup(env.__exit__) parser_signature = TestHelpBiggerOptionals.parser_signature argument_signatures = TestHelpBiggerOptionals.argument_signatures diff --git a/Lib/test/test_getopt.py b/Lib/test/test_getopt.py index 9261276ebb972..64b9ce01e05ea 100644 --- a/Lib/test/test_getopt.py +++ b/Lib/test/test_getopt.py @@ -11,14 +11,10 @@ class GetoptTests(unittest.TestCase): def setUp(self): - self.env = EnvironmentVarGuard() + self.env = self.enterContext(EnvironmentVarGuard()) if "POSIXLY_CORRECT" in self.env: del self.env["POSIXLY_CORRECT"] - def tearDown(self): - self.env.__exit__() - del self.env - def assertError(self, *args, **kwargs): self.assertRaises(getopt.GetoptError, *args, **kwargs) diff --git a/Lib/test/test_gettext.py b/Lib/test/test_gettext.py index 467652a41f0cd..1608d1b18e98f 100644 --- a/Lib/test/test_gettext.py +++ b/Lib/test/test_gettext.py @@ -117,6 +117,7 @@ class GettextBaseTest(unittest.TestCase): def setUp(self): + self.addCleanup(os_helper.rmtree, os.path.split(LOCALEDIR)[0]) if not os.path.isdir(LOCALEDIR): os.makedirs(LOCALEDIR) with open(MOFILE, 'wb') as fp: @@ -129,14 +130,10 @@ def setUp(self): fp.write(base64.decodebytes(UMO_DATA)) with open(MMOFILE, 'wb') as fp: fp.write(base64.decodebytes(MMO_DATA)) - self.env = os_helper.EnvironmentVarGuard() + self.env = self.enterContext(os_helper.EnvironmentVarGuard()) self.env['LANGUAGE'] = 'xx' gettext._translations.clear() - def tearDown(self): - self.env.__exit__() - del self.env - os_helper.rmtree(os.path.split(LOCALEDIR)[0]) GNU_MO_DATA_ISSUE_17898 = b'''\ 3hIElQAAAAABAAAAHAAAACQAAAAAAAAAAAAAAAAAAAAsAAAAggAAAC0AAAAAUGx1cmFsLUZvcm1z diff --git a/Lib/test/test_global.py b/Lib/test/test_global.py index d0bde3fd040e6..f5b38c25ea072 100644 --- a/Lib/test/test_global.py +++ b/Lib/test/test_global.py @@ -9,14 +9,9 @@ class GlobalTests(unittest.TestCase): def setUp(self): - self._warnings_manager = check_warnings() - self._warnings_manager.__enter__() + self.enterContext(check_warnings()) warnings.filterwarnings("error", module="") - def tearDown(self): - self._warnings_manager.__exit__(None, None, None) - - def test1(self): prog_text_1 = """\ def wrong1(): @@ -54,9 +49,7 @@ def test4(self): def setUpModule(): - cm = warnings.catch_warnings() - cm.__enter__() - unittest.addModuleCleanup(cm.__exit__, None, None, None) + unittest.enterModuleContext(warnings.catch_warnings()) warnings.filterwarnings("error", module="") diff --git a/Lib/test/test_importlib/source/test_finder.py b/Lib/test/test_importlib/source/test_finder.py index 6a23e9d50f6ff..bed9d56dca84e 100644 --- a/Lib/test/test_importlib/source/test_finder.py +++ b/Lib/test/test_importlib/source/test_finder.py @@ -157,21 +157,12 @@ def test_dir_removal_handling(self): def test_no_read_directory(self): # Issue #16730 tempdir = tempfile.TemporaryDirectory() + self.enterContext(tempdir) + # Since we muck with the permissions, we want to set them back to + # their original values to make sure the directory can be properly + # cleaned up. original_mode = os.stat(tempdir.name).st_mode - def cleanup(tempdir): - """Cleanup function for the temporary directory. - - Since we muck with the permissions, we want to set them back to - their original values to make sure the directory can be properly - cleaned up. - - """ - os.chmod(tempdir.name, original_mode) - # If this is not explicitly called then the __del__ method is used, - # but since already mucking around might as well explicitly clean - # up. - tempdir.__exit__(None, None, None) - self.addCleanup(cleanup, tempdir) + self.addCleanup(os.chmod, tempdir.name, original_mode) os.chmod(tempdir.name, stat.S_IWUSR | stat.S_IXUSR) finder = self.get_finder(tempdir.name) found = self._find(finder, 'doesnotexist') diff --git a/Lib/test/test_importlib/test_namespace_pkgs.py b/Lib/test/test_importlib/test_namespace_pkgs.py index 2ea41b7a4c5c3..cd08498545e80 100644 --- a/Lib/test/test_importlib/test_namespace_pkgs.py +++ b/Lib/test/test_importlib/test_namespace_pkgs.py @@ -65,12 +65,7 @@ def setUp(self): self.resolved_paths = [ os.path.join(self.root, path) for path in self.paths ] - self.ctx = namespace_tree_context(path=self.resolved_paths) - self.ctx.__enter__() - - def tearDown(self): - # TODO: will we ever want to pass exc_info to __exit__? - self.ctx.__exit__(None, None, None) + self.enterContext(namespace_tree_context(path=self.resolved_paths)) class SingleNamespacePackage(NamespacePackageTest): diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py index 5d4ddedd059fc..e69afae484aa7 100644 --- a/Lib/test/test_logging.py +++ b/Lib/test/test_logging.py @@ -5650,9 +5650,7 @@ def test__all__(self): # why the test does this, but in any case we save the current locale # first and restore it at the end. def setUpModule(): - cm = support.run_with_locale('LC_ALL', '') - cm.__enter__() - unittest.addModuleCleanup(cm.__exit__, None, None, None) + unittest.enterModuleContext(support.run_with_locale('LC_ALL', '')) if __name__ == "__main__": diff --git a/Lib/test/test_nntplib.py b/Lib/test/test_nntplib.py index 9812c05519351..31a02f86abb00 100644 --- a/Lib/test/test_nntplib.py +++ b/Lib/test/test_nntplib.py @@ -1593,8 +1593,7 @@ def setUp(self): self.background.start() self.addCleanup(self.background.join) - self.nntp = NNTP(socket_helper.HOST, port, usenetrc=False).__enter__() - self.addCleanup(self.nntp.__exit__, None, None, None) + self.nntp = self.enterContext(NNTP(socket_helper.HOST, port, usenetrc=False)) def run_server(self, sock): # Could be generalized to handle more commands in separate methods diff --git a/Lib/test/test_peg_generator/test_c_parser.py b/Lib/test/test_peg_generator/test_c_parser.py index 13b83a9db9eb3..d25bc112cfdc4 100644 --- a/Lib/test/test_peg_generator/test_c_parser.py +++ b/Lib/test/test_peg_generator/test_c_parser.py @@ -96,9 +96,7 @@ def setUp(self): self.skipTest("The %r command is not found" % cmd) self.old_cwd = os.getcwd() self.tmp_path = tempfile.mkdtemp(dir=self.tmp_base) - change_cwd = os_helper.change_cwd(self.tmp_path) - change_cwd.__enter__() - self.addCleanup(change_cwd.__exit__, None, None, None) + self.enterContext(os_helper.change_cwd(self.tmp_path)) def tearDown(self): os.chdir(self.old_cwd) diff --git a/Lib/test/test_poll.py b/Lib/test/test_poll.py index 7d542b5cfd783..02165a0244ddf 100644 --- a/Lib/test/test_poll.py +++ b/Lib/test/test_poll.py @@ -128,8 +128,7 @@ def test_poll2(self): cmd = 'for i in 0 1 2 3 4 5 6 7 8 9; do echo testing...; sleep 1; done' proc = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, bufsize=0) - proc.__enter__() - self.addCleanup(proc.__exit__, None, None, None) + self.enterContext(proc) p = proc.stdout pollster = select.poll() pollster.register( p, select.POLLIN ) diff --git a/Lib/test/test_posix.py b/Lib/test/test_posix.py index f44b8d0403ff2..28e5e90297e24 100644 --- a/Lib/test/test_posix.py +++ b/Lib/test/test_posix.py @@ -53,19 +53,13 @@ class PosixTester(unittest.TestCase): def setUp(self): # create empty file + self.addCleanup(os_helper.unlink, os_helper.TESTFN) with open(os_helper.TESTFN, "wb"): pass - self.teardown_files = [ os_helper.TESTFN ] - self._warnings_manager = warnings_helper.check_warnings() - self._warnings_manager.__enter__() + self.enterContext(warnings_helper.check_warnings()) warnings.filterwarnings('ignore', '.* potential security risk .*', RuntimeWarning) - def tearDown(self): - for teardown_file in self.teardown_files: - os_helper.unlink(teardown_file) - self._warnings_manager.__exit__(None, None, None) - def testNoArgFunctions(self): # test posix functions which take no arguments and have # no side-effects which we need to cleanup (e.g., fork, wait, abort) @@ -973,8 +967,8 @@ def test_lchflags_symlink(self): self.assertTrue(hasattr(testfn_st, 'st_flags')) + self.addCleanup(os_helper.unlink, _DUMMY_SYMLINK) os.symlink(os_helper.TESTFN, _DUMMY_SYMLINK) - self.teardown_files.append(_DUMMY_SYMLINK) dummy_symlink_st = os.lstat(_DUMMY_SYMLINK) def chflags_nofollow(path, flags): diff --git a/Lib/test/test_set.py b/Lib/test/test_set.py index 3b57517a86101..43f23dbbf9bf7 100644 --- a/Lib/test/test_set.py +++ b/Lib/test/test_set.py @@ -1022,8 +1022,7 @@ def test_repr(self): class TestBasicOpsMixedStringBytes(TestBasicOps, unittest.TestCase): def setUp(self): - self._warning_filters = warnings_helper.check_warnings() - self._warning_filters.__enter__() + self.enterContext(warnings_helper.check_warnings()) warnings.simplefilter('ignore', BytesWarning) self.case = "string and bytes set" self.values = ["a", "b", b"a", b"b"] @@ -1031,9 +1030,6 @@ def setUp(self): self.dup = set(self.values) self.length = 4 - def tearDown(self): - self._warning_filters.__exit__(None, None, None) - def test_repr(self): self.check_repr_against_values() diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py index 613363722cf02..1aaa9e44f90c6 100755 --- a/Lib/test/test_socket.py +++ b/Lib/test/test_socket.py @@ -338,9 +338,7 @@ def serverExplicitReady(self): self.server_ready.set() def _setUp(self): - self.wait_threads = threading_helper.wait_threads_exit() - self.wait_threads.__enter__() - self.addCleanup(self.wait_threads.__exit__, None, None, None) + self.enterContext(threading_helper.wait_threads_exit()) self.server_ready = threading.Event() self.client_ready = threading.Event() diff --git a/Lib/test/test_ssl.py b/Lib/test/test_ssl.py index 0eb8d18b3561e..fed76378726c9 100644 --- a/Lib/test/test_ssl.py +++ b/Lib/test/test_ssl.py @@ -1999,9 +1999,8 @@ def setUp(self): self.server_context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER) self.server_context.load_cert_chain(SIGNED_CERTFILE) server = ThreadedEchoServer(context=self.server_context) + self.enterContext(server) self.server_addr = (HOST, server.port) - server.__enter__() - self.addCleanup(server.__exit__, None, None, None) def test_connect(self): with test_wrap_socket(socket.socket(socket.AF_INET), @@ -3713,8 +3712,7 @@ def _recvfrom_into(): def test_recv_zero(self): server = ThreadedEchoServer(CERTFILE) - server.__enter__() - self.addCleanup(server.__exit__, None, None) + self.enterContext(server) s = socket.create_connection((HOST, server.port)) self.addCleanup(s.close) s = test_wrap_socket(s, suppress_ragged_eofs=False) diff --git a/Lib/test/test_tempfile.py b/Lib/test/test_tempfile.py index a05f3c84ccfc9..f056e5ccb17f9 100644 --- a/Lib/test/test_tempfile.py +++ b/Lib/test/test_tempfile.py @@ -90,14 +90,10 @@ class BaseTestCase(unittest.TestCase): b_check = re.compile(br"^[a-z0-9_-]{8}$") def setUp(self): - self._warnings_manager = warnings_helper.check_warnings() - self._warnings_manager.__enter__() + self.enterContext(warnings_helper.check_warnings()) warnings.filterwarnings("ignore", category=RuntimeWarning, message="mktemp", module=__name__) - def tearDown(self): - self._warnings_manager.__exit__(None, None, None) - def nameCheck(self, name, dir, pre, suf): (ndir, nbase) = os.path.split(name) npre = nbase[:len(pre)] diff --git a/Lib/test/test_urllib.py b/Lib/test/test_urllib.py index 82f1d9dc2e7bb..bc6e74c291ac1 100644 --- a/Lib/test/test_urllib.py +++ b/Lib/test/test_urllib.py @@ -232,17 +232,12 @@ class ProxyTests(unittest.TestCase): def setUp(self): # Records changes to env vars - self.env = os_helper.EnvironmentVarGuard() + self.env = self.enterContext(os_helper.EnvironmentVarGuard()) # Delete all proxy related env vars for k in list(os.environ): if 'proxy' in k.lower(): self.env.unset(k) - def tearDown(self): - # Restore all proxy related env vars - self.env.__exit__() - del self.env - def test_getproxies_environment_keep_no_proxies(self): self.env.set('NO_PROXY', 'localhost') proxies = urllib.request.getproxies_environment() diff --git a/Lib/unittest/__init__.py b/Lib/unittest/__init__.py index eda951ce73e66..005d23f6d00ec 100644 --- a/Lib/unittest/__init__.py +++ b/Lib/unittest/__init__.py @@ -49,7 +49,7 @@ def testMultiply(self): 'defaultTestLoader', 'SkipTest', 'skip', 'skipIf', 'skipUnless', 'expectedFailure', 'TextTestResult', 'installHandler', 'registerResult', 'removeResult', 'removeHandler', - 'addModuleCleanup', 'doModuleCleanups'] + 'addModuleCleanup', 'doModuleCleanups', 'enterModuleContext'] # Expose obsolete functions for backwards compatibility # bpo-5846: Deprecated in Python 3.11, scheduled for removal in Python 3.13. @@ -59,7 +59,8 @@ def testMultiply(self): from .result import TestResult from .case import (addModuleCleanup, TestCase, FunctionTestCase, SkipTest, skip, - skipIf, skipUnless, expectedFailure, doModuleCleanups) + skipIf, skipUnless, expectedFailure, doModuleCleanups, + enterModuleContext) from .suite import BaseTestSuite, TestSuite from .loader import TestLoader, defaultTestLoader from .main import TestProgram, main diff --git a/Lib/unittest/async_case.py b/Lib/unittest/async_case.py index 85b938fb293af..a90eed98f8714 100644 --- a/Lib/unittest/async_case.py +++ b/Lib/unittest/async_case.py @@ -58,6 +58,26 @@ def addAsyncCleanup(self, func, /, *args, **kwargs): # 3. Regular "def func()" that returns awaitable object self.addCleanup(*(func, *args), **kwargs) + async def enterAsyncContext(self, cm): + """Enters the supplied asynchronous context manager. + + If successful, also adds its __aexit__ method as a cleanup + function and returns the result of the __aenter__ method. + """ + # We look up the special methods on the type to match the with + # statement. + cls = type(cm) + try: + enter = cls.__aenter__ + exit = cls.__aexit__ + except AttributeError: + raise TypeError(f"'{cls.__module__}.{cls.__qualname__}' object does " + f"not support the asynchronous context manager protocol" + ) from None + result = await enter(cm) + self.addAsyncCleanup(exit, cm, None, None, None) + return result + def _callSetUp(self): self._asyncioTestContext.run(self.setUp) self._callAsync(self.asyncSetUp) diff --git a/Lib/unittest/case.py b/Lib/unittest/case.py index 55770c06d7c5d..ffc8f19ddd38d 100644 --- a/Lib/unittest/case.py +++ b/Lib/unittest/case.py @@ -102,12 +102,31 @@ def _id(obj): return obj +def _enter_context(cm, addcleanup): + # We look up the special methods on the type to match the with + # statement. + cls = type(cm) + try: + enter = cls.__enter__ + exit = cls.__exit__ + except AttributeError: + raise TypeError(f"'{cls.__module__}.{cls.__qualname__}' object does " + f"not support the context manager protocol") from None + result = enter(cm) + addcleanup(exit, cm, None, None, None) + return result + + _module_cleanups = [] def addModuleCleanup(function, /, *args, **kwargs): """Same as addCleanup, except the cleanup items are called even if setUpModule fails (unlike tearDownModule).""" _module_cleanups.append((function, args, kwargs)) +def enterModuleContext(cm): + """Same as enterContext, but module-wide.""" + return _enter_context(cm, addModuleCleanup) + def doModuleCleanups(): """Execute all module cleanup functions. Normally called for you after @@ -426,12 +445,25 @@ def addCleanup(self, function, /, *args, **kwargs): Cleanup items are called even if setUp fails (unlike tearDown).""" self._cleanups.append((function, args, kwargs)) + def enterContext(self, cm): + """Enters the supplied context manager. + + If successful, also adds its __exit__ method as a cleanup + function and returns the result of the __enter__ method. + """ + return _enter_context(cm, self.addCleanup) + @classmethod def addClassCleanup(cls, function, /, *args, **kwargs): """Same as addCleanup, except the cleanup items are called even if setUpClass fails (unlike tearDownClass).""" cls._class_cleanups.append((function, args, kwargs)) + @classmethod + def enterClassContext(cls, cm): + """Same as enterContext, but class-wide.""" + return _enter_context(cm, cls.addClassCleanup) + def setUp(self): "Hook method for setting up the test fixture before exercising it." pass diff --git a/Lib/unittest/test/test_async_case.py b/Lib/unittest/test/test_async_case.py index 1b910a44eea0d..beadcac070b43 100644 --- a/Lib/unittest/test/test_async_case.py +++ b/Lib/unittest/test/test_async_case.py @@ -14,6 +14,29 @@ def tearDownModule(): asyncio.set_event_loop_policy(None) +class TestCM: + def __init__(self, ordering, enter_result=None): + self.ordering = ordering + self.enter_result = enter_result + + async def __aenter__(self): + self.ordering.append('enter') + return self.enter_result + + async def __aexit__(self, *exc_info): + self.ordering.append('exit') + + +class LacksEnterAndExit: + pass +class LacksEnter: + async def __aexit__(self, *exc_info): + pass +class LacksExit: + async def __aenter__(self): + pass + + VAR = contextvars.ContextVar('VAR', default=()) @@ -337,6 +360,36 @@ async def coro(): output = test.run() self.assertTrue(cancelled) + def test_enterAsyncContext(self): + events = [] + + class Test(unittest.IsolatedAsyncioTestCase): + async def test_func(slf): + slf.addAsyncCleanup(events.append, 'cleanup1') + cm = TestCM(events, 42) + self.assertEqual(await slf.enterAsyncContext(cm), 42) + slf.addAsyncCleanup(events.append, 'cleanup2') + events.append('test') + + test = Test('test_func') + output = test.run() + self.assertTrue(output.wasSuccessful(), output) + self.assertEqual(events, ['enter', 'test', 'cleanup2', 'exit', 'cleanup1']) + + def test_enterAsyncContext_arg_errors(self): + class Test(unittest.IsolatedAsyncioTestCase): + async def test_func(slf): + with self.assertRaisesRegex(TypeError, 'asynchronous context manager'): + await slf.enterAsyncContext(LacksEnterAndExit()) + with self.assertRaisesRegex(TypeError, 'asynchronous context manager'): + await slf.enterAsyncContext(LacksEnter()) + with self.assertRaisesRegex(TypeError, 'asynchronous context manager'): + await slf.enterAsyncContext(LacksExit()) + + test = Test('test_func') + output = test.run() + self.assertTrue(output.wasSuccessful()) + def test_debug_cleanup_same_loop(self): class Test(unittest.IsolatedAsyncioTestCase): async def asyncSetUp(self): diff --git a/Lib/unittest/test/test_runner.py b/Lib/unittest/test/test_runner.py index 18062ae5a5871..d3488b40e82bd 100644 --- a/Lib/unittest/test/test_runner.py +++ b/Lib/unittest/test/test_runner.py @@ -46,6 +46,29 @@ def cleanup(ordering, blowUp=False): raise Exception('CleanUpExc') +class TestCM: + def __init__(self, ordering, enter_result=None): + self.ordering = ordering + self.enter_result = enter_result + + def __enter__(self): + self.ordering.append('enter') + return self.enter_result + + def __exit__(self, *exc_info): + self.ordering.append('exit') + + +class LacksEnterAndExit: + pass +class LacksEnter: + def __exit__(self, *exc_info): + pass +class LacksExit: + def __enter__(self): + pass + + class TestCleanUp(unittest.TestCase): def testCleanUp(self): class TestableTest(unittest.TestCase): @@ -173,6 +196,39 @@ def cleanup2(): self.assertEqual(ordering, ['setUp', 'test', 'tearDown', 'cleanup1', 'cleanup2']) + def test_enterContext(self): + class TestableTest(unittest.TestCase): + def testNothing(self): + pass + + test = TestableTest('testNothing') + cleanups = [] + + test.addCleanup(cleanups.append, 'cleanup1') + cm = TestCM(cleanups, 42) + self.assertEqual(test.enterContext(cm), 42) + test.addCleanup(cleanups.append, 'cleanup2') + + self.assertTrue(test.doCleanups()) + self.assertEqual(cleanups, ['enter', 'cleanup2', 'exit', 'cleanup1']) + + def test_enterContext_arg_errors(self): + class TestableTest(unittest.TestCase): + def testNothing(self): + pass + + test = TestableTest('testNothing') + + with self.assertRaisesRegex(TypeError, 'the context manager'): + test.enterContext(LacksEnterAndExit()) + with self.assertRaisesRegex(TypeError, 'the context manager'): + test.enterContext(LacksEnter()) + with self.assertRaisesRegex(TypeError, 'the context manager'): + test.enterContext(LacksExit()) + + self.assertEqual(test._cleanups, []) + + class TestClassCleanup(unittest.TestCase): def test_addClassCleanUp(self): class TestableTest(unittest.TestCase): @@ -451,6 +507,35 @@ def tearDownClass(cls): self.assertEqual(ordering, ['setUpClass', 'test', 'tearDownClass', 'cleanup_good']) + def test_enterClassContext(self): + class TestableTest(unittest.TestCase): + def testNothing(self): + pass + + cleanups = [] + + TestableTest.addClassCleanup(cleanups.append, 'cleanup1') + cm = TestCM(cleanups, 42) + self.assertEqual(TestableTest.enterClassContext(cm), 42) + TestableTest.addClassCleanup(cleanups.append, 'cleanup2') + + TestableTest.doClassCleanups() + self.assertEqual(cleanups, ['enter', 'cleanup2', 'exit', 'cleanup1']) + + def test_enterClassContext_arg_errors(self): + class TestableTest(unittest.TestCase): + def testNothing(self): + pass + + with self.assertRaisesRegex(TypeError, 'the context manager'): + TestableTest.enterClassContext(LacksEnterAndExit()) + with self.assertRaisesRegex(TypeError, 'the context manager'): + TestableTest.enterClassContext(LacksEnter()) + with self.assertRaisesRegex(TypeError, 'the context manager'): + TestableTest.enterClassContext(LacksExit()) + + self.assertEqual(TestableTest._class_cleanups, []) + class TestModuleCleanUp(unittest.TestCase): def test_add_and_do_ModuleCleanup(self): @@ -1000,6 +1085,31 @@ def tearDown(self): 'cleanup2', 'setUp2', 'test2', 'tearDown2', 'cleanup3', 'tearDownModule', 'cleanup1']) + def test_enterModuleContext(self): + cleanups = [] + + unittest.addModuleCleanup(cleanups.append, 'cleanup1') + cm = TestCM(cleanups, 42) + self.assertEqual(unittest.enterModuleContext(cm), 42) + unittest.addModuleCleanup(cleanups.append, 'cleanup2') + + unittest.case.doModuleCleanups() + self.assertEqual(cleanups, ['enter', 'cleanup2', 'exit', 'cleanup1']) + + def test_enterModuleContext_arg_errors(self): + class TestableTest(unittest.TestCase): + def testNothing(self): + pass + + with self.assertRaisesRegex(TypeError, 'the context manager'): + unittest.enterModuleContext(LacksEnterAndExit()) + with self.assertRaisesRegex(TypeError, 'the context manager'): + unittest.enterModuleContext(LacksEnter()) + with self.assertRaisesRegex(TypeError, 'the context manager'): + unittest.enterModuleContext(LacksExit()) + + self.assertEqual(unittest.case._module_cleanups, []) + class Test_TextTestRunner(unittest.TestCase): """Tests for TextTestRunner.""" diff --git a/Misc/NEWS.d/next/Library/2021-08-29-19-59-16.bpo-45046.eGq0NC.rst b/Misc/NEWS.d/next/Library/2021-08-29-19-59-16.bpo-45046.eGq0NC.rst new file mode 100644 index 0000000000000..8072afaf445c5 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2021-08-29-19-59-16.bpo-45046.eGq0NC.rst @@ -0,0 +1,7 @@ +Add support of context managers in :mod:`unittest`: methods +:meth:`~unittest.TestCase.enterContext` and +:meth:`~unittest.TestCase.enterClassContext` of class +:class:`~unittest.TestCase`, method +:meth:`~unittest.IsolatedAsyncioTestCase.enterAsyncContext` of class +:class:`~unittest.IsolatedAsyncioTestCase` and function +:func:`unittest.enterModuleContext`. From webhook-mailer at python.org Sun May 8 11:20:38 2022 From: webhook-mailer at python.org (miss-islington) Date: Sun, 08 May 2022 15:20:38 -0000 Subject: [Python-checkins] Update What's New in 3.11 faster cpython figures and contributors (GH-92401) Message-ID: https://github.com/python/cpython/commit/f71b305ddf8ac1ad0198efbde1315656102929ee commit: f71b305ddf8ac1ad0198efbde1315656102929ee branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-08T08:20:34-07:00 summary: Update What's New in 3.11 faster cpython figures and contributors (GH-92401) (cherry picked from commit b7380948f2eeb46aca9ef54889d61df9c4ad0203) Co-authored-by: Ken Jin files: M Doc/whatsnew/3.11.rst diff --git a/Doc/whatsnew/3.11.rst b/Doc/whatsnew/3.11.rst index defaeebc7739a..ddae025af5b16 100644 --- a/Doc/whatsnew/3.11.rst +++ b/Doc/whatsnew/3.11.rst @@ -63,7 +63,7 @@ Summary -- Release highlights Brevity is key. - Python 3.11 is up to 10-60% faster than Python 3.10. On average, we measured a - 1.22x speedup on the standard benchmark suite. See `Faster CPython`_ for details. + 1.25x speedup on the standard benchmark suite. See `Faster CPython`_ for details. .. PEP-sized items next. @@ -840,7 +840,7 @@ Optimizations Faster CPython ============== -CPython 3.11 is on average `1.22x faster `_ +CPython 3.11 is on average `1.25x faster `_ than CPython 3.10 when measured with the `pyperformance `_ benchmark suite, and compiled with GCC on Ubuntu Linux. Depending on your workload, the speedup @@ -942,7 +942,8 @@ and specialization attempts are not too expensive. This allows specialization to adapt to new circumstances. (PEP written by Mark Shannon, with ideas inspired by Stefan Brunthaler. -See :pep:`659` for more information.) +See :pep:`659` for more information. Implementation by Mark Shannon and Brandt +Bucher, with additional help from Irit Katriel and Dennis Sweeney.) .. If I missed out anyone, please add them. From webhook-mailer at python.org Sun May 8 11:22:47 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Sun, 08 May 2022 15:22:47 -0000 Subject: [Python-checkins] `typing.Text`: tweak deprecation notice (#92405) Message-ID: https://github.com/python/cpython/commit/bdc99a830f27451754d80ec414d7799b0f4bfed6 commit: bdc99a830f27451754d80ec414d7799b0f4bfed6 branch: main author: Alex Waygood committer: JelleZijlstra date: 2022-05-08T08:22:32-07:00 summary: `typing.Text`: tweak deprecation notice (#92405) https://github.com/python/cpython/pull/92351/files#r866869469 Co-authored-by: Jelle Zijlstra files: M Doc/library/typing.rst diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index 1d125fb1ebebb..29bcedaddce9d 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -1978,7 +1978,8 @@ Other concrete types .. deprecated:: 3.11 Python 2 is no longer supported, and most type checkers also no longer - support type checking Python 2 code. Users should now use + support type checking Python 2 code. Removal of the alias is not + currently planned, but users are encouraged to use :class:`str` instead of ``Text`` wherever possible. Abstract Base Classes From webhook-mailer at python.org Sun May 8 11:23:12 2022 From: webhook-mailer at python.org (serhiy-storchaka) Date: Sun, 08 May 2022 15:23:12 -0000 Subject: [Python-checkins] Fix What's New for 3.12 (GH-92482) Message-ID: https://github.com/python/cpython/commit/9c005c5debf2b7afd155093adb72bad27d34657b commit: 9c005c5debf2b7afd155093adb72bad27d34657b branch: main author: Serhiy Storchaka committer: serhiy-storchaka date: 2022-05-08T18:23:08+03:00 summary: Fix What's New for 3.12 (GH-92482) files: A Doc/whatsnew/3.12.rst D Doc/whatsnew/3.12 M Doc/whatsnew/index.rst diff --git a/Doc/whatsnew/3.12 b/Doc/whatsnew/3.12.rst similarity index 100% rename from Doc/whatsnew/3.12 rename to Doc/whatsnew/3.12.rst diff --git a/Doc/whatsnew/index.rst b/Doc/whatsnew/index.rst index c787cdb0f7130..bfee225791eee 100644 --- a/Doc/whatsnew/index.rst +++ b/Doc/whatsnew/index.rst @@ -11,6 +11,7 @@ anyone wishing to stay up-to-date after a new release. .. toctree:: :maxdepth: 2 + 3.12.rst 3.11.rst 3.10.rst 3.9.rst From webhook-mailer at python.org Sun May 8 11:25:38 2022 From: webhook-mailer at python.org (miss-islington) Date: Sun, 08 May 2022 15:25:38 -0000 Subject: [Python-checkins] [3.11] gh-92417: `stdtypes` docs: delete discussion of Python 2 differences (GH-92423) (GH-92472) Message-ID: https://github.com/python/cpython/commit/eec14f42c11aae7730d686eef2b603eff6e4bf23 commit: eec14f42c11aae7730d686eef2b603eff6e4bf23 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-08T08:25:26-07:00 summary: [3.11] gh-92417: `stdtypes` docs: delete discussion of Python 2 differences (GH-92423) (GH-92472) Given that 2.7 has now been end-of-life for two and a half years, I don't think we need such a detailed explanation here anymore of the differences between Python 2 and Python 3. (cherry picked from commit 8efda1e7c6343b1671d93837bf2c146e4cf77bbf) Co-authored-by: Alex Waygood Automerge-Triggered-By: GH:serhiy-storchaka files: M Doc/library/stdtypes.rst diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index 44447400c29bc..065afb8ae6038 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -2573,16 +2573,6 @@ The representation of bytes objects uses the literal format (``b'...'``) since it is often more useful than e.g. ``bytes([46, 46, 46])``. You can always convert a bytes object into a list of integers using ``list(b)``. -.. note:: - For Python 2.x users: In the Python 2.x series, a variety of implicit - conversions between 8-bit strings (the closest thing 2.x offers to a - built-in binary data type) and Unicode strings were permitted. This was a - backwards compatibility workaround to account for the fact that Python - originally only supported 8-bit text, and Unicode text was a later - addition. In Python 3.x, those implicit conversions are gone - conversions - between 8-bit binary data and Unicode text must be explicit, and bytes and - string objects will always compare unequal. - .. _typebytearray: From webhook-mailer at python.org Sun May 8 11:26:11 2022 From: webhook-mailer at python.org (miss-islington) Date: Sun, 08 May 2022 15:26:11 -0000 Subject: [Python-checkins] [3.10] gh-92417: `stdtypes` docs: delete discussion of Python 2 differences (GH-92423) (GH-92473) Message-ID: https://github.com/python/cpython/commit/8c42fefa392e768efc4ce15099800dbe212752dc commit: 8c42fefa392e768efc4ce15099800dbe212752dc branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-08T08:26:06-07:00 summary: [3.10] gh-92417: `stdtypes` docs: delete discussion of Python 2 differences (GH-92423) (GH-92473) Given that 2.7 has now been end-of-life for two and a half years, I don't think we need such a detailed explanation here anymore of the differences between Python 2 and Python 3. (cherry picked from commit 8efda1e7c6343b1671d93837bf2c146e4cf77bbf) Co-authored-by: Alex Waygood Automerge-Triggered-By: GH:serhiy-storchaka files: M Doc/library/stdtypes.rst diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index 365680d4503ba..dd7c1ab5c9d1e 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -2535,16 +2535,6 @@ The representation of bytes objects uses the literal format (``b'...'``) since it is often more useful than e.g. ``bytes([46, 46, 46])``. You can always convert a bytes object into a list of integers using ``list(b)``. -.. note:: - For Python 2.x users: In the Python 2.x series, a variety of implicit - conversions between 8-bit strings (the closest thing 2.x offers to a - built-in binary data type) and Unicode strings were permitted. This was a - backwards compatibility workaround to account for the fact that Python - originally only supported 8-bit text, and Unicode text was a later - addition. In Python 3.x, those implicit conversions are gone - conversions - between 8-bit binary data and Unicode text must be explicit, and bytes and - string objects will always compare unequal. - .. _typebytearray: From webhook-mailer at python.org Sun May 8 11:26:54 2022 From: webhook-mailer at python.org (miss-islington) Date: Sun, 08 May 2022 15:26:54 -0000 Subject: [Python-checkins] [3.9] gh-92417: `stdtypes` docs: delete discussion of Python 2 differences (GH-92423) (GH-92474) Message-ID: https://github.com/python/cpython/commit/0cd0d6bf488662e24e1e4f3b4ffca3542382a47a commit: 0cd0d6bf488662e24e1e4f3b4ffca3542382a47a branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-08T08:26:50-07:00 summary: [3.9] gh-92417: `stdtypes` docs: delete discussion of Python 2 differences (GH-92423) (GH-92474) Given that 2.7 has now been end-of-life for two and a half years, I don't think we need such a detailed explanation here anymore of the differences between Python 2 and Python 3. (cherry picked from commit 8efda1e7c6343b1671d93837bf2c146e4cf77bbf) Co-authored-by: Alex Waygood Automerge-Triggered-By: GH:serhiy-storchaka files: M Doc/library/stdtypes.rst diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index 1cba75084b04b..2892486757e14 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -2502,16 +2502,6 @@ The representation of bytes objects uses the literal format (``b'...'``) since it is often more useful than e.g. ``bytes([46, 46, 46])``. You can always convert a bytes object into a list of integers using ``list(b)``. -.. note:: - For Python 2.x users: In the Python 2.x series, a variety of implicit - conversions between 8-bit strings (the closest thing 2.x offers to a - built-in binary data type) and Unicode strings were permitted. This was a - backwards compatibility workaround to account for the fact that Python - originally only supported 8-bit text, and Unicode text was a later - addition. In Python 3.x, those implicit conversions are gone - conversions - between 8-bit binary data and Unicode text must be explicit, and bytes and - string objects will always compare unequal. - .. _typebytearray: From webhook-mailer at python.org Sun May 8 11:28:14 2022 From: webhook-mailer at python.org (miss-islington) Date: Sun, 08 May 2022 15:28:14 -0000 Subject: [Python-checkins] [3.10] gh-77630: Change Charset to charset (GH-92439) (GH-92476) Message-ID: https://github.com/python/cpython/commit/a7d869a2ea9759b7c28837b11992e7cee19e3622 commit: a7d869a2ea9759b7c28837b11992e7cee19e3622 branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-08T08:28:06-07:00 summary: [3.10] gh-77630: Change Charset to charset (GH-92439) (GH-92476) (cherry picked from commit 8f293180791f2836570bdfc29aadba04a538d435) Co-authored-by: slateny <46876382+slateny at users.noreply.github.com> Automerge-Triggered-By: GH:serhiy-storchaka files: M Doc/library/email.charset.rst M Lib/email/charset.py diff --git a/Doc/library/email.charset.rst b/Doc/library/email.charset.rst index 38fda23bd8237..adbe6c1c7d29b 100644 --- a/Doc/library/email.charset.rst +++ b/Doc/library/email.charset.rst @@ -58,9 +58,9 @@ Import this class from the :mod:`email.charset` module. .. attribute:: header_encoding If the character set must be encoded before it can be used in an email - header, this attribute will be set to ``Charset.QP`` (for - quoted-printable), ``Charset.BASE64`` (for base64 encoding), or - ``Charset.SHORTEST`` for the shortest of QP or BASE64 encoding. Otherwise, + header, this attribute will be set to ``charset.QP`` (for + quoted-printable), ``charset.BASE64`` (for base64 encoding), or + ``charset.SHORTEST`` for the shortest of QP or BASE64 encoding. Otherwise, it will be ``None``. @@ -68,7 +68,7 @@ Import this class from the :mod:`email.charset` module. Same as *header_encoding*, but describes the encoding for the mail message's body, which indeed may be different than the header encoding. - ``Charset.SHORTEST`` is not allowed for *body_encoding*. + ``charset.SHORTEST`` is not allowed for *body_encoding*. .. attribute:: output_charset @@ -175,9 +175,9 @@ new entries to the global character set, alias, and codec registries: *charset* is the input character set, and must be the canonical name of a character set. - Optional *header_enc* and *body_enc* is either ``Charset.QP`` for - quoted-printable, ``Charset.BASE64`` for base64 encoding, - ``Charset.SHORTEST`` for the shortest of quoted-printable or base64 encoding, + Optional *header_enc* and *body_enc* is either ``charset.QP`` for + quoted-printable, ``charset.BASE64`` for base64 encoding, + ``charset.SHORTEST`` for the shortest of quoted-printable or base64 encoding, or ``None`` for no encoding. ``SHORTEST`` is only valid for *header_enc*. The default is ``None`` for no encoding. diff --git a/Lib/email/charset.py b/Lib/email/charset.py index d3d759ad9115f..791b6584b2475 100644 --- a/Lib/email/charset.py +++ b/Lib/email/charset.py @@ -112,8 +112,8 @@ def add_charset(charset, header_enc=None, body_enc=None, output_charset=None): charset is the input character set, and must be the canonical name of a character set. - Optional header_enc and body_enc is either Charset.QP for - quoted-printable, Charset.BASE64 for base64 encoding, Charset.SHORTEST for + Optional header_enc and body_enc is either charset.QP for + quoted-printable, charset.BASE64 for base64 encoding, charset.SHORTEST for the shortest of qp or base64 encoding, or None for no encoding. SHORTEST is only valid for header_enc. It describes how message headers and message bodies in the input charset are to be encoded. Default is no @@ -185,13 +185,13 @@ class Charset: header_encoding: If the character set must be encoded before it can be used in an email header, this attribute will be set to - Charset.QP (for quoted-printable), Charset.BASE64 (for - base64 encoding), or Charset.SHORTEST for the shortest of + charset.QP (for quoted-printable), charset.BASE64 (for + base64 encoding), or charset.SHORTEST for the shortest of QP or BASE64 encoding. Otherwise, it will be None. body_encoding: Same as header_encoding, but describes the encoding for the mail message's body, which indeed may be different than the - header encoding. Charset.SHORTEST is not allowed for + header encoding. charset.SHORTEST is not allowed for body_encoding. output_charset: Some character sets must be converted before they can be From webhook-mailer at python.org Sun May 8 11:28:26 2022 From: webhook-mailer at python.org (miss-islington) Date: Sun, 08 May 2022 15:28:26 -0000 Subject: [Python-checkins] [3.9] gh-77630: Change Charset to charset (GH-92439) (GH-92477) Message-ID: https://github.com/python/cpython/commit/bab695448294f4fd4ce97d4ae369546aa8206bb0 commit: bab695448294f4fd4ce97d4ae369546aa8206bb0 branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-08T08:28:18-07:00 summary: [3.9] gh-77630: Change Charset to charset (GH-92439) (GH-92477) (cherry picked from commit 8f293180791f2836570bdfc29aadba04a538d435) Co-authored-by: slateny <46876382+slateny at users.noreply.github.com> Automerge-Triggered-By: GH:serhiy-storchaka files: M Doc/library/email.charset.rst M Lib/email/charset.py diff --git a/Doc/library/email.charset.rst b/Doc/library/email.charset.rst index 38fda23bd8237..adbe6c1c7d29b 100644 --- a/Doc/library/email.charset.rst +++ b/Doc/library/email.charset.rst @@ -58,9 +58,9 @@ Import this class from the :mod:`email.charset` module. .. attribute:: header_encoding If the character set must be encoded before it can be used in an email - header, this attribute will be set to ``Charset.QP`` (for - quoted-printable), ``Charset.BASE64`` (for base64 encoding), or - ``Charset.SHORTEST`` for the shortest of QP or BASE64 encoding. Otherwise, + header, this attribute will be set to ``charset.QP`` (for + quoted-printable), ``charset.BASE64`` (for base64 encoding), or + ``charset.SHORTEST`` for the shortest of QP or BASE64 encoding. Otherwise, it will be ``None``. @@ -68,7 +68,7 @@ Import this class from the :mod:`email.charset` module. Same as *header_encoding*, but describes the encoding for the mail message's body, which indeed may be different than the header encoding. - ``Charset.SHORTEST`` is not allowed for *body_encoding*. + ``charset.SHORTEST`` is not allowed for *body_encoding*. .. attribute:: output_charset @@ -175,9 +175,9 @@ new entries to the global character set, alias, and codec registries: *charset* is the input character set, and must be the canonical name of a character set. - Optional *header_enc* and *body_enc* is either ``Charset.QP`` for - quoted-printable, ``Charset.BASE64`` for base64 encoding, - ``Charset.SHORTEST`` for the shortest of quoted-printable or base64 encoding, + Optional *header_enc* and *body_enc* is either ``charset.QP`` for + quoted-printable, ``charset.BASE64`` for base64 encoding, + ``charset.SHORTEST`` for the shortest of quoted-printable or base64 encoding, or ``None`` for no encoding. ``SHORTEST`` is only valid for *header_enc*. The default is ``None`` for no encoding. diff --git a/Lib/email/charset.py b/Lib/email/charset.py index d3d759ad9115f..791b6584b2475 100644 --- a/Lib/email/charset.py +++ b/Lib/email/charset.py @@ -112,8 +112,8 @@ def add_charset(charset, header_enc=None, body_enc=None, output_charset=None): charset is the input character set, and must be the canonical name of a character set. - Optional header_enc and body_enc is either Charset.QP for - quoted-printable, Charset.BASE64 for base64 encoding, Charset.SHORTEST for + Optional header_enc and body_enc is either charset.QP for + quoted-printable, charset.BASE64 for base64 encoding, charset.SHORTEST for the shortest of qp or base64 encoding, or None for no encoding. SHORTEST is only valid for header_enc. It describes how message headers and message bodies in the input charset are to be encoded. Default is no @@ -185,13 +185,13 @@ class Charset: header_encoding: If the character set must be encoded before it can be used in an email header, this attribute will be set to - Charset.QP (for quoted-printable), Charset.BASE64 (for - base64 encoding), or Charset.SHORTEST for the shortest of + charset.QP (for quoted-printable), charset.BASE64 (for + base64 encoding), or charset.SHORTEST for the shortest of QP or BASE64 encoding. Otherwise, it will be None. body_encoding: Same as header_encoding, but describes the encoding for the mail message's body, which indeed may be different than the - header encoding. Charset.SHORTEST is not allowed for + header encoding. charset.SHORTEST is not allowed for body_encoding. output_charset: Some character sets must be converted before they can be From webhook-mailer at python.org Sun May 8 11:28:42 2022 From: webhook-mailer at python.org (miss-islington) Date: Sun, 08 May 2022 15:28:42 -0000 Subject: [Python-checkins] [3.9] GH-92431: Fix footnotes in Doc/c-api/exceptions.rst (GH-92432) (GH-92471) Message-ID: https://github.com/python/cpython/commit/7fd4e6502e909839f0b0072a3a777b24a279a82f commit: 7fd4e6502e909839f0b0072a3a777b24a279a82f branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-08T08:28:37-07:00 summary: [3.9] GH-92431: Fix footnotes in Doc/c-api/exceptions.rst (GH-92432) (GH-92471) * Remove redundant footnote ref: the footnote has been removed * Fix footnote ref to match footnote * Convert footnotes into reST footnotes: will error if missing (cherry picked from commit 788ef54bc94b0a7aa2a93f626e4067ab8561424c) Co-authored-by: Hugo van Kemenade Automerge-Triggered-By: GH:serhiy-storchaka files: M Doc/c-api/exceptions.rst diff --git a/Doc/c-api/exceptions.rst b/Doc/c-api/exceptions.rst index 646dc5a543473..0e35590c67b41 100644 --- a/Doc/c-api/exceptions.rst +++ b/Doc/c-api/exceptions.rst @@ -845,11 +845,11 @@ the variables: +-----------------------------------------+---------------------------------+----------+ | C Name | Python Name | Notes | +=========================================+=================================+==========+ -| :c:data:`PyExc_BaseException` | :exc:`BaseException` | \(1) | +| :c:data:`PyExc_BaseException` | :exc:`BaseException` | [1]_ | +-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_Exception` | :exc:`Exception` | \(1) | +| :c:data:`PyExc_Exception` | :exc:`Exception` | [1]_ | +-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_ArithmeticError` | :exc:`ArithmeticError` | \(1) | +| :c:data:`PyExc_ArithmeticError` | :exc:`ArithmeticError` | [1]_ | +-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_AssertionError` | :exc:`AssertionError` | | +-----------------------------------------+---------------------------------+----------+ @@ -895,7 +895,7 @@ the variables: +-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_KeyboardInterrupt` | :exc:`KeyboardInterrupt` | | +-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_LookupError` | :exc:`LookupError` | \(1) | +| :c:data:`PyExc_LookupError` | :exc:`LookupError` | [1]_ | +-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_MemoryError` | :exc:`MemoryError` | | +-----------------------------------------+---------------------------------+----------+ @@ -907,7 +907,7 @@ the variables: +-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_NotImplementedError` | :exc:`NotImplementedError` | | +-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_OSError` | :exc:`OSError` | \(1) | +| :c:data:`PyExc_OSError` | :exc:`OSError` | [1]_ | +-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_OverflowError` | :exc:`OverflowError` | | +-----------------------------------------+---------------------------------+----------+ @@ -917,7 +917,7 @@ the variables: +-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_RecursionError` | :exc:`RecursionError` | | +-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_ReferenceError` | :exc:`ReferenceError` | \(2) | +| :c:data:`PyExc_ReferenceError` | :exc:`ReferenceError` | | +-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_RuntimeError` | :exc:`RuntimeError` | | +-----------------------------------------+---------------------------------+----------+ @@ -982,7 +982,7 @@ These are compatibility aliases to :c:data:`PyExc_OSError`: +-------------------------------------+----------+ | :c:data:`PyExc_IOError` | | +-------------------------------------+----------+ -| :c:data:`PyExc_WindowsError` | \(3) | +| :c:data:`PyExc_WindowsError` | [2]_ | +-------------------------------------+----------+ .. versionchanged:: 3.3 @@ -990,10 +990,10 @@ These are compatibility aliases to :c:data:`PyExc_OSError`: Notes: -(1) +.. [1] This is a base class for other standard exceptions. -(2) +.. [2] Only defined on Windows; protect code that uses this by testing that the preprocessor macro ``MS_WINDOWS`` is defined. @@ -1023,7 +1023,7 @@ the variables: +------------------------------------------+---------------------------------+----------+ | C Name | Python Name | Notes | +==========================================+=================================+==========+ -| :c:data:`PyExc_Warning` | :exc:`Warning` | \(1) | +| :c:data:`PyExc_Warning` | :exc:`Warning` | [3]_ | +------------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_BytesWarning` | :exc:`BytesWarning` | | +------------------------------------------+---------------------------------+----------+ @@ -1051,5 +1051,5 @@ the variables: Notes: -(1) +.. [3] This is a base class for other standard warning categories. From webhook-mailer at python.org Sun May 8 11:28:52 2022 From: webhook-mailer at python.org (miss-islington) Date: Sun, 08 May 2022 15:28:52 -0000 Subject: [Python-checkins] [3.10] GH-92431: Fix footnotes in Doc/c-api/exceptions.rst (GH-92432) (GH-92470) Message-ID: https://github.com/python/cpython/commit/f40731fb518c10f70239e04ac86593d4bc84b506 commit: f40731fb518c10f70239e04ac86593d4bc84b506 branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-08T08:28:47-07:00 summary: [3.10] GH-92431: Fix footnotes in Doc/c-api/exceptions.rst (GH-92432) (GH-92470) * Remove redundant footnote ref: the footnote has been removed * Fix footnote ref to match footnote * Convert footnotes into reST footnotes: will error if missing (cherry picked from commit 788ef54bc94b0a7aa2a93f626e4067ab8561424c) Co-authored-by: Hugo van Kemenade Automerge-Triggered-By: GH:serhiy-storchaka files: M Doc/c-api/exceptions.rst diff --git a/Doc/c-api/exceptions.rst b/Doc/c-api/exceptions.rst index 7deef83b2789a..fc90fa2b746e3 100644 --- a/Doc/c-api/exceptions.rst +++ b/Doc/c-api/exceptions.rst @@ -889,11 +889,11 @@ the variables: +-----------------------------------------+---------------------------------+----------+ | C Name | Python Name | Notes | +=========================================+=================================+==========+ -| :c:data:`PyExc_BaseException` | :exc:`BaseException` | \(1) | +| :c:data:`PyExc_BaseException` | :exc:`BaseException` | [1]_ | +-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_Exception` | :exc:`Exception` | \(1) | +| :c:data:`PyExc_Exception` | :exc:`Exception` | [1]_ | +-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_ArithmeticError` | :exc:`ArithmeticError` | \(1) | +| :c:data:`PyExc_ArithmeticError` | :exc:`ArithmeticError` | [1]_ | +-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_AssertionError` | :exc:`AssertionError` | | +-----------------------------------------+---------------------------------+----------+ @@ -939,7 +939,7 @@ the variables: +-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_KeyboardInterrupt` | :exc:`KeyboardInterrupt` | | +-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_LookupError` | :exc:`LookupError` | \(1) | +| :c:data:`PyExc_LookupError` | :exc:`LookupError` | [1]_ | +-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_MemoryError` | :exc:`MemoryError` | | +-----------------------------------------+---------------------------------+----------+ @@ -951,7 +951,7 @@ the variables: +-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_NotImplementedError` | :exc:`NotImplementedError` | | +-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_OSError` | :exc:`OSError` | \(1) | +| :c:data:`PyExc_OSError` | :exc:`OSError` | [1]_ | +-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_OverflowError` | :exc:`OverflowError` | | +-----------------------------------------+---------------------------------+----------+ @@ -961,7 +961,7 @@ the variables: +-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_RecursionError` | :exc:`RecursionError` | | +-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_ReferenceError` | :exc:`ReferenceError` | \(2) | +| :c:data:`PyExc_ReferenceError` | :exc:`ReferenceError` | | +-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_RuntimeError` | :exc:`RuntimeError` | | +-----------------------------------------+---------------------------------+----------+ @@ -1026,7 +1026,7 @@ These are compatibility aliases to :c:data:`PyExc_OSError`: +-------------------------------------+----------+ | :c:data:`PyExc_IOError` | | +-------------------------------------+----------+ -| :c:data:`PyExc_WindowsError` | \(3) | +| :c:data:`PyExc_WindowsError` | [2]_ | +-------------------------------------+----------+ .. versionchanged:: 3.3 @@ -1034,10 +1034,10 @@ These are compatibility aliases to :c:data:`PyExc_OSError`: Notes: -(1) +.. [1] This is a base class for other standard exceptions. -(2) +.. [2] Only defined on Windows; protect code that uses this by testing that the preprocessor macro ``MS_WINDOWS`` is defined. @@ -1067,7 +1067,7 @@ the variables: +------------------------------------------+---------------------------------+----------+ | C Name | Python Name | Notes | +==========================================+=================================+==========+ -| :c:data:`PyExc_Warning` | :exc:`Warning` | \(1) | +| :c:data:`PyExc_Warning` | :exc:`Warning` | [3]_ | +------------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_BytesWarning` | :exc:`BytesWarning` | | +------------------------------------------+---------------------------------+----------+ @@ -1095,5 +1095,5 @@ the variables: Notes: -(1) +.. [3] This is a base class for other standard warning categories. From webhook-mailer at python.org Sun May 8 11:29:01 2022 From: webhook-mailer at python.org (miss-islington) Date: Sun, 08 May 2022 15:29:01 -0000 Subject: [Python-checkins] [3.11] GH-92431: Fix footnotes in Doc/c-api/exceptions.rst (GH-92432) (GH-92469) Message-ID: https://github.com/python/cpython/commit/be6c89cf2654fb81be520535e4cde82cfeb946d8 commit: be6c89cf2654fb81be520535e4cde82cfeb946d8 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-08T08:28:56-07:00 summary: [3.11] GH-92431: Fix footnotes in Doc/c-api/exceptions.rst (GH-92432) (GH-92469) * Remove redundant footnote ref: the footnote has been removed * Fix footnote ref to match footnote * Convert footnotes into reST footnotes: will error if missing (cherry picked from commit 788ef54bc94b0a7aa2a93f626e4067ab8561424c) Co-authored-by: Hugo van Kemenade Automerge-Triggered-By: GH:serhiy-storchaka files: M Doc/c-api/exceptions.rst diff --git a/Doc/c-api/exceptions.rst b/Doc/c-api/exceptions.rst index 7bfeca5958cc4..02ec1da1c3400 100644 --- a/Doc/c-api/exceptions.rst +++ b/Doc/c-api/exceptions.rst @@ -909,11 +909,11 @@ the variables: +-----------------------------------------+---------------------------------+----------+ | C Name | Python Name | Notes | +=========================================+=================================+==========+ -| :c:data:`PyExc_BaseException` | :exc:`BaseException` | \(1) | +| :c:data:`PyExc_BaseException` | :exc:`BaseException` | [1]_ | +-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_Exception` | :exc:`Exception` | \(1) | +| :c:data:`PyExc_Exception` | :exc:`Exception` | [1]_ | +-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_ArithmeticError` | :exc:`ArithmeticError` | \(1) | +| :c:data:`PyExc_ArithmeticError` | :exc:`ArithmeticError` | [1]_ | +-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_AssertionError` | :exc:`AssertionError` | | +-----------------------------------------+---------------------------------+----------+ @@ -959,7 +959,7 @@ the variables: +-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_KeyboardInterrupt` | :exc:`KeyboardInterrupt` | | +-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_LookupError` | :exc:`LookupError` | \(1) | +| :c:data:`PyExc_LookupError` | :exc:`LookupError` | [1]_ | +-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_MemoryError` | :exc:`MemoryError` | | +-----------------------------------------+---------------------------------+----------+ @@ -971,7 +971,7 @@ the variables: +-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_NotImplementedError` | :exc:`NotImplementedError` | | +-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_OSError` | :exc:`OSError` | \(1) | +| :c:data:`PyExc_OSError` | :exc:`OSError` | [1]_ | +-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_OverflowError` | :exc:`OverflowError` | | +-----------------------------------------+---------------------------------+----------+ @@ -981,7 +981,7 @@ the variables: +-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_RecursionError` | :exc:`RecursionError` | | +-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_ReferenceError` | :exc:`ReferenceError` | \(2) | +| :c:data:`PyExc_ReferenceError` | :exc:`ReferenceError` | | +-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_RuntimeError` | :exc:`RuntimeError` | | +-----------------------------------------+---------------------------------+----------+ @@ -1046,7 +1046,7 @@ These are compatibility aliases to :c:data:`PyExc_OSError`: +-------------------------------------+----------+ | :c:data:`PyExc_IOError` | | +-------------------------------------+----------+ -| :c:data:`PyExc_WindowsError` | \(3) | +| :c:data:`PyExc_WindowsError` | [2]_ | +-------------------------------------+----------+ .. versionchanged:: 3.3 @@ -1054,10 +1054,10 @@ These are compatibility aliases to :c:data:`PyExc_OSError`: Notes: -(1) +.. [1] This is a base class for other standard exceptions. -(2) +.. [2] Only defined on Windows; protect code that uses this by testing that the preprocessor macro ``MS_WINDOWS`` is defined. @@ -1087,7 +1087,7 @@ the variables: +------------------------------------------+---------------------------------+----------+ | C Name | Python Name | Notes | +==========================================+=================================+==========+ -| :c:data:`PyExc_Warning` | :exc:`Warning` | \(1) | +| :c:data:`PyExc_Warning` | :exc:`Warning` | [3]_ | +------------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_BytesWarning` | :exc:`BytesWarning` | | +------------------------------------------+---------------------------------+----------+ @@ -1115,5 +1115,5 @@ the variables: Notes: -(1) +.. [3] This is a base class for other standard warning categories. From webhook-mailer at python.org Sun May 8 11:29:58 2022 From: webhook-mailer at python.org (miss-islington) Date: Sun, 08 May 2022 15:29:58 -0000 Subject: [Python-checkins] [3.10] gh-92417: `doctest` docs: remove references to Python <3.6 (GH-92420) (GH-92468) Message-ID: https://github.com/python/cpython/commit/45ed69b200e4de61fc469da3091da7c1fe0b0f39 commit: 45ed69b200e4de61fc469da3091da7c1fe0b0f39 branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-08T08:29:50-07:00 summary: [3.10] gh-92417: `doctest` docs: remove references to Python <3.6 (GH-92420) (GH-92468) (cherry picked from commit 5639ea1ef9ba8452f81b61ad73152bd1bf1fd3a6) Co-authored-by: Alex Waygood Automerge-Triggered-By: GH:serhiy-storchaka files: M Doc/library/doctest.rst diff --git a/Doc/library/doctest.rst b/Doc/library/doctest.rst index a77322f83acbd..146fa5e775be4 100644 --- a/Doc/library/doctest.rst +++ b/Doc/library/doctest.rst @@ -288,10 +288,6 @@ strings are treated as if they were docstrings. In output, a key ``K`` in Any classes found are recursively searched similarly, to test docstrings in their contained methods and nested classes. -.. impl-detail:: - Prior to version 3.4, extension modules written in C were not fully - searched by doctest. - .. _doctest-finding-examples: @@ -786,11 +782,6 @@ instead. Another is to do :: >>> d ['Harry', 'Hermione'] -.. note:: - - Before Python 3.6, when printing a dict, Python did not guarantee that - the key-value pairs was printed in any particular order. - There are others, but you get the idea. Another bad idea is to print things that embed an object address, like :: From webhook-mailer at python.org Sun May 8 11:30:02 2022 From: webhook-mailer at python.org (miss-islington) Date: Sun, 08 May 2022 15:30:02 -0000 Subject: [Python-checkins] [3.11] gh-92417: `doctest` docs: remove references to Python <3.6 (GH-92420) (GH-92467) Message-ID: https://github.com/python/cpython/commit/c35da32cded44b8931e25b3e7dc3a6d307a0377a commit: c35da32cded44b8931e25b3e7dc3a6d307a0377a branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-08T08:29:58-07:00 summary: [3.11] gh-92417: `doctest` docs: remove references to Python <3.6 (GH-92420) (GH-92467) (cherry picked from commit 5639ea1ef9ba8452f81b61ad73152bd1bf1fd3a6) Co-authored-by: Alex Waygood Automerge-Triggered-By: GH:serhiy-storchaka files: M Doc/library/doctest.rst diff --git a/Doc/library/doctest.rst b/Doc/library/doctest.rst index 0bbb640bea26b..30328790eefe3 100644 --- a/Doc/library/doctest.rst +++ b/Doc/library/doctest.rst @@ -288,10 +288,6 @@ strings are treated as if they were docstrings. In output, a key ``K`` in Any classes found are recursively searched similarly, to test docstrings in their contained methods and nested classes. -.. impl-detail:: - Prior to version 3.4, extension modules written in C were not fully - searched by doctest. - .. _doctest-finding-examples: @@ -785,11 +781,6 @@ instead. Another is to do :: >>> d ['Harry', 'Hermione'] -.. note:: - - Before Python 3.6, when printing a dict, Python did not guarantee that - the key-value pairs was printed in any particular order. - There are others, but you get the idea. Another bad idea is to print things that embed an object address, like :: From webhook-mailer at python.org Sun May 8 11:30:12 2022 From: webhook-mailer at python.org (miss-islington) Date: Sun, 08 May 2022 15:30:12 -0000 Subject: [Python-checkins] [3.9] gh-92417: `json` docs: `dict` is ordered on all supported Python versions (GH-92422) (GH-92466) Message-ID: https://github.com/python/cpython/commit/baed0c31ee1181c95fbadb57614eecaf5ddabf22 commit: baed0c31ee1181c95fbadb57614eecaf5ddabf22 branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-08T08:30:08-07:00 summary: [3.9] gh-92417: `json` docs: `dict` is ordered on all supported Python versions (GH-92422) (GH-92466) (cherry picked from commit bc098cfdb756f207d8fa84793e8ad91a2f263efb) Co-authored-by: Alex Waygood Automerge-Triggered-By: GH:serhiy-storchaka files: M Doc/library/json.rst diff --git a/Doc/library/json.rst b/Doc/library/json.rst index 1810e04cc8349..608e70df5b14c 100644 --- a/Doc/library/json.rst +++ b/Doc/library/json.rst @@ -125,13 +125,6 @@ See :ref:`json-commandline` for detailed documentation. This module's encoders and decoders preserve input and output order by default. Order is only lost if the underlying containers are unordered. - Prior to Python 3.7, :class:`dict` was not guaranteed to be ordered, so - inputs and outputs were typically scrambled unless - :class:`collections.OrderedDict` was specifically requested. Starting - with Python 3.7, the regular :class:`dict` became order preserving, so - it is no longer necessary to specify :class:`collections.OrderedDict` for - JSON generation and parsing. - Basic Usage ----------- From webhook-mailer at python.org Sun May 8 11:30:22 2022 From: webhook-mailer at python.org (miss-islington) Date: Sun, 08 May 2022 15:30:22 -0000 Subject: [Python-checkins] [3.10] gh-92417: `json` docs: `dict` is ordered on all supported Python versions (GH-92422) (GH-92465) Message-ID: https://github.com/python/cpython/commit/2164b5bad76663dcd1639a4ab5be5a7220ea9b6e commit: 2164b5bad76663dcd1639a4ab5be5a7220ea9b6e branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-08T08:30:18-07:00 summary: [3.10] gh-92417: `json` docs: `dict` is ordered on all supported Python versions (GH-92422) (GH-92465) (cherry picked from commit bc098cfdb756f207d8fa84793e8ad91a2f263efb) Co-authored-by: Alex Waygood Automerge-Triggered-By: GH:serhiy-storchaka files: M Doc/library/json.rst diff --git a/Doc/library/json.rst b/Doc/library/json.rst index 1810e04cc8349..608e70df5b14c 100644 --- a/Doc/library/json.rst +++ b/Doc/library/json.rst @@ -125,13 +125,6 @@ See :ref:`json-commandline` for detailed documentation. This module's encoders and decoders preserve input and output order by default. Order is only lost if the underlying containers are unordered. - Prior to Python 3.7, :class:`dict` was not guaranteed to be ordered, so - inputs and outputs were typically scrambled unless - :class:`collections.OrderedDict` was specifically requested. Starting - with Python 3.7, the regular :class:`dict` became order preserving, so - it is no longer necessary to specify :class:`collections.OrderedDict` for - JSON generation and parsing. - Basic Usage ----------- From webhook-mailer at python.org Sun May 8 11:30:31 2022 From: webhook-mailer at python.org (miss-islington) Date: Sun, 08 May 2022 15:30:31 -0000 Subject: [Python-checkins] [3.11] gh-92417: `json` docs: `dict` is ordered on all supported Python versions (GH-92422) (GH-92464) Message-ID: https://github.com/python/cpython/commit/dfad113715abf307b9d5fdc3d0bf4716faf5b001 commit: dfad113715abf307b9d5fdc3d0bf4716faf5b001 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-08T08:30:27-07:00 summary: [3.11] gh-92417: `json` docs: `dict` is ordered on all supported Python versions (GH-92422) (GH-92464) (cherry picked from commit bc098cfdb756f207d8fa84793e8ad91a2f263efb) Co-authored-by: Alex Waygood Automerge-Triggered-By: GH:serhiy-storchaka files: M Doc/library/json.rst diff --git a/Doc/library/json.rst b/Doc/library/json.rst index 510b0459bbb5a..1e203242327ca 100644 --- a/Doc/library/json.rst +++ b/Doc/library/json.rst @@ -125,13 +125,6 @@ See :ref:`json-commandline` for detailed documentation. This module's encoders and decoders preserve input and output order by default. Order is only lost if the underlying containers are unordered. - Prior to Python 3.7, :class:`dict` was not guaranteed to be ordered, so - inputs and outputs were typically scrambled unless - :class:`collections.OrderedDict` was specifically requested. Starting - with Python 3.7, the regular :class:`dict` became order preserving, so - it is no longer necessary to specify :class:`collections.OrderedDict` for - JSON generation and parsing. - Basic Usage ----------- From webhook-mailer at python.org Sun May 8 11:30:50 2022 From: webhook-mailer at python.org (miss-islington) Date: Sun, 08 May 2022 15:30:50 -0000 Subject: [Python-checkins] [3.10] gh-92417: `asyncio` docs: `asyncio.run()` is available on all supported Python versions (GH-92419) (GH-92463) Message-ID: https://github.com/python/cpython/commit/e363034752dbc02cb8b21762ed70cc1c1e3e7066 commit: e363034752dbc02cb8b21762ed70cc1c1e3e7066 branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-08T08:30:43-07:00 summary: [3.10] gh-92417: `asyncio` docs: `asyncio.run()` is available on all supported Python versions (GH-92419) (GH-92463) (cherry picked from commit f4e317b304c7f86e48885b4b74c7a8826648922c) Co-authored-by: Alex Waygood Automerge-Triggered-By: GH:serhiy-storchaka files: M Doc/library/asyncio.rst diff --git a/Doc/library/asyncio.rst b/Doc/library/asyncio.rst index 94a853259d348..a6429394389b1 100644 --- a/Doc/library/asyncio.rst +++ b/Doc/library/asyncio.rst @@ -17,7 +17,6 @@ await asyncio.sleep(1) print('... World!') - # Python 3.7+ asyncio.run(main()) asyncio is a library to write **concurrent** code using From webhook-mailer at python.org Sun May 8 11:31:02 2022 From: webhook-mailer at python.org (miss-islington) Date: Sun, 08 May 2022 15:31:02 -0000 Subject: [Python-checkins] [3.11] gh-92417: `asyncio` docs: `asyncio.run()` is available on all supported Python versions (GH-92419) (GH-92462) Message-ID: https://github.com/python/cpython/commit/29f592e6fed3ab9a13329bd603cbdf770ffe8a03 commit: 29f592e6fed3ab9a13329bd603cbdf770ffe8a03 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-08T08:30:52-07:00 summary: [3.11] gh-92417: `asyncio` docs: `asyncio.run()` is available on all supported Python versions (GH-92419) (GH-92462) (cherry picked from commit f4e317b304c7f86e48885b4b74c7a8826648922c) Co-authored-by: Alex Waygood Automerge-Triggered-By: GH:serhiy-storchaka files: M Doc/library/asyncio.rst diff --git a/Doc/library/asyncio.rst b/Doc/library/asyncio.rst index 8f4d55a9de059..66c7c4c24a918 100644 --- a/Doc/library/asyncio.rst +++ b/Doc/library/asyncio.rst @@ -17,7 +17,6 @@ await asyncio.sleep(1) print('... World!') - # Python 3.7+ asyncio.run(main()) asyncio is a library to write **concurrent** code using From webhook-mailer at python.org Sun May 8 11:32:37 2022 From: webhook-mailer at python.org (serhiy-storchaka) Date: Sun, 08 May 2022 15:32:37 -0000 Subject: [Python-checkins] gh-91162: Fix substitution of unpacked tuples in generic aliases (GH-92335) Message-ID: https://github.com/python/cpython/commit/9d25db9db1617f012d7dba118b5b8f2b9e25e116 commit: 9d25db9db1617f012d7dba118b5b8f2b9e25e116 branch: main author: Serhiy Storchaka committer: serhiy-storchaka date: 2022-05-08T18:32:32+03:00 summary: gh-91162: Fix substitution of unpacked tuples in generic aliases (GH-92335) files: M Include/internal/pycore_global_strings.h M Include/internal/pycore_runtime_init.h M Lib/test/test_typing.py M Lib/typing.py M Objects/genericaliasobject.c diff --git a/Include/internal/pycore_global_strings.h b/Include/internal/pycore_global_strings.h index 4e1f2ec6c3529..cfa8ae99d1b6d 100644 --- a/Include/internal/pycore_global_strings.h +++ b/Include/internal/pycore_global_strings.h @@ -201,8 +201,9 @@ struct _Py_global_strings { STRUCT_FOR_ID(__subclasshook__) STRUCT_FOR_ID(__truediv__) STRUCT_FOR_ID(__trunc__) + STRUCT_FOR_ID(__typing_is_unpacked_typevartuple__) STRUCT_FOR_ID(__typing_subst__) - STRUCT_FOR_ID(__typing_unpacked__) + STRUCT_FOR_ID(__typing_unpacked_tuple_args__) STRUCT_FOR_ID(__warningregistry__) STRUCT_FOR_ID(__weakref__) STRUCT_FOR_ID(__xor__) diff --git a/Include/internal/pycore_runtime_init.h b/Include/internal/pycore_runtime_init.h index c1c5fd562e6b8..57cacb97bcf1a 100644 --- a/Include/internal/pycore_runtime_init.h +++ b/Include/internal/pycore_runtime_init.h @@ -824,8 +824,9 @@ extern "C" { INIT_ID(__subclasshook__), \ INIT_ID(__truediv__), \ INIT_ID(__trunc__), \ + INIT_ID(__typing_is_unpacked_typevartuple__), \ INIT_ID(__typing_subst__), \ - INIT_ID(__typing_unpacked__), \ + INIT_ID(__typing_unpacked_tuple_args__), \ INIT_ID(__warningregistry__), \ INIT_ID(__weakref__), \ INIT_ID(__xor__), \ diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index 6e1e8d6e1b473..2afac23539155 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -603,22 +603,10 @@ class C(Generic[T]): pass ('generic[T]', '[int]', 'generic[int]'), ('generic[T]', '[int, str]', 'TypeError'), ('generic[T]', '[tuple_type[int, ...]]', 'generic[tuple_type[int, ...]]'), - # Should raise TypeError: a) according to the tentative spec, - # unpacked types cannot be used as arguments to aliases that expect - # a fixed number of arguments; b) it's equivalent to generic[()]. - ('generic[T]', '[*tuple[()]]', 'generic[*tuple[()]]'), - ('generic[T]', '[*Tuple[()]]', 'TypeError'), - # Should raise TypeError according to the tentative spec: unpacked - # types cannot be used as arguments to aliases that expect a fixed - # number of arguments. - ('generic[T]', '[*tuple[int]]', 'generic[*tuple[int]]'), - ('generic[T]', '[*Tuple[int]]', 'TypeError'), - # Ditto. - ('generic[T]', '[*tuple[int, str]]', 'generic[*tuple[int, str]]'), - ('generic[T]', '[*Tuple[int, str]]', 'TypeError'), - # Ditto. - ('generic[T]', '[*tuple[int, ...]]', 'generic[*tuple[int, ...]]'), - ('generic[T]', '[*Tuple[int, ...]]', 'TypeError'), + ('generic[T]', '[*tuple_type[int]]', 'generic[int]'), + ('generic[T]', '[*tuple_type[()]]', 'TypeError'), + ('generic[T]', '[*tuple_type[int, str]]', 'TypeError'), + ('generic[T]', '[*tuple_type[int, ...]]', 'TypeError'), ('generic[T]', '[*Ts]', 'TypeError'), ('generic[T]', '[T, *Ts]', 'TypeError'), ('generic[T]', '[*Ts, T]', 'TypeError'), @@ -664,23 +652,29 @@ class C(Generic[T1, T2]): pass ('generic[T1, T2]', '[int, str]', 'generic[int, str]'), ('generic[T1, T2]', '[int, str, bool]', 'TypeError'), ('generic[T1, T2]', '[*tuple_type[int]]', 'TypeError'), - ('generic[T1, T2]', '[*tuple_type[int, str]]', 'TypeError'), + ('generic[T1, T2]', '[*tuple_type[int, str]]', 'generic[int, str]'), ('generic[T1, T2]', '[*tuple_type[int, str, bool]]', 'TypeError'), - # Should raise TypeError according to the tentative spec: unpacked - # types cannot be used as arguments to aliases that expect a fixed - # number of arguments. - ('generic[T1, T2]', '[*tuple[int, str], *tuple[float, bool]]', 'generic[*tuple[int, str], *tuple[float, bool]]'), - ('generic[T1, T2]', '[*Tuple[int, str], *Tuple[float, bool]]', 'TypeError'), + ('generic[T1, T2]', '[int, *tuple_type[str]]', 'generic[int, str]'), + ('generic[T1, T2]', '[*tuple_type[int], str]', 'generic[int, str]'), + ('generic[T1, T2]', '[*tuple_type[int], *tuple_type[str]]', 'generic[int, str]'), + ('generic[T1, T2]', '[*tuple_type[int, str], *tuple_type[()]]', 'generic[int, str]'), + ('generic[T1, T2]', '[*tuple_type[()], *tuple_type[int, str]]', 'generic[int, str]'), + ('generic[T1, T2]', '[*tuple_type[int], *tuple_type[()]]', 'TypeError'), + ('generic[T1, T2]', '[*tuple_type[()], *tuple_type[int]]', 'TypeError'), + ('generic[T1, T2]', '[*tuple_type[int, str], *tuple_type[float]]', 'TypeError'), + ('generic[T1, T2]', '[*tuple_type[int], *tuple_type[str, float]]', 'TypeError'), + ('generic[T1, T2]', '[*tuple_type[int, str], *tuple_type[float, bool]]', 'TypeError'), ('generic[T1, T2]', '[tuple_type[int, ...]]', 'TypeError'), ('generic[T1, T2]', '[tuple_type[int, ...], tuple_type[str, ...]]', 'generic[tuple_type[int, ...], tuple_type[str, ...]]'), + # Should raise TypeError according to the tentative spec: unpacked + # types cannot be used as arguments to aliases that expect a fixed + # number of arguments. ('generic[T1, T2]', '[*tuple_type[int, ...]]', 'TypeError'), - - # Ditto. - ('generic[T1, T2]', '[*tuple[int, ...], *tuple[str, ...]]', 'generic[*tuple[int, ...], *tuple[str, ...]]'), - ('generic[T1, T2]', '[*Tuple[int, ...], *Tuple[str, ...]]', 'TypeError'), - + ('generic[T1, T2]', '[int, *tuple_type[str, ...]]', 'TypeError'), + ('generic[T1, T2]', '[*tuple_type[int, ...], str]', 'TypeError'), + ('generic[T1, T2]', '[*tuple_type[int, ...], *tuple_type[str, ...]]', 'TypeError'), ('generic[T1, T2]', '[*Ts]', 'TypeError'), ('generic[T1, T2]', '[T, *Ts]', 'TypeError'), ('generic[T1, T2]', '[*Ts, T]', 'TypeError'), @@ -720,7 +714,7 @@ class C(Generic[T1, T2, T3]): pass tests = [ # Alias # Args # Expected result ('generic[T1, bool, T2]', '[int, str]', 'generic[int, bool, str]'), - ('generic[T1, bool, T2]', '[*tuple_type[int, str]]', 'TypeError'), + ('generic[T1, bool, T2]', '[*tuple_type[int, str]]', 'generic[int, bool, str]'), ] for alias_template, args_template, expected_template in tests: @@ -753,96 +747,43 @@ class C(Generic[*Ts]): pass # Tuple because tuple currently behaves differently. tests = [ # Alias # Args # Expected result - ('C[*Ts]', '[()]', 'C[()]'), - ('tuple[*Ts]', '[()]', 'tuple[()]'), - ('Tuple[*Ts]', '[()]', 'Tuple[()]'), - - ('C[*Ts]', '[int]', 'C[int]'), - ('tuple[*Ts]', '[int]', 'tuple[int]'), - ('Tuple[*Ts]', '[int]', 'Tuple[int]'), - - ('C[*Ts]', '[int, str]', 'C[int, str]'), - ('tuple[*Ts]', '[int, str]', 'tuple[int, str]'), - ('Tuple[*Ts]', '[int, str]', 'Tuple[int, str]'), - - ('C[*Ts]', '[*tuple_type[int]]', 'C[*tuple_type[int]]'), # Should be C[int] - ('tuple[*Ts]', '[*tuple_type[int]]', 'tuple[*tuple_type[int]]'), # Should be tuple[int] - ('Tuple[*Ts]', '[*tuple_type[int]]', 'Tuple[*tuple_type[int]]'), # Should be Tuple[int] - - ('C[*Ts]', '[*tuple_type[*Ts]]', 'C[*tuple_type[*Ts]]'), # Should be C[*Ts] - ('tuple[*Ts]', '[*tuple_type[*Ts]]', 'tuple[*tuple_type[*Ts]]'), # Should be tuple[*Ts] - ('Tuple[*Ts]', '[*tuple_type[*Ts]]', 'Tuple[*tuple_type[*Ts]]'), # Should be Tuple[*Ts] - - ('C[*Ts]', '[*tuple_type[int, str]]', 'C[*tuple_type[int, str]]'), # Should be C[int, str] - ('tuple[*Ts]', '[*tuple_type[int, str]]', 'tuple[*tuple_type[int, str]]'), # Should be tuple[int, str] - ('Tuple[*Ts]', '[*tuple_type[int, str]]', 'Tuple[*tuple_type[int, str]]'), # Should be Tuple[int, str] - - ('C[*Ts]', '[tuple_type[int, ...]]', 'C[tuple_type[int, ...]]'), - ('tuple[*Ts]', '[tuple_type[int, ...]]', 'tuple[tuple_type[int, ...]]'), - ('Tuple[*Ts]', '[tuple_type[int, ...]]', 'Tuple[tuple_type[int, ...]]'), - - ('C[*Ts]', '[tuple_type[int, ...], tuple_type[str, ...]]', 'C[tuple_type[int, ...], tuple_type[str, ...]]'), - ('tuple[*Ts]', '[tuple_type[int, ...], tuple_type[str, ...]]', 'tuple[tuple_type[int, ...], tuple_type[str, ...]]'), - ('Tuple[*Ts]', '[tuple_type[int, ...], tuple_type[str, ...]]', 'Tuple[tuple_type[int, ...], tuple_type[str, ...]]'), - - ('C[*Ts]', '[*tuple_type[int, ...]]', 'C[*tuple_type[int, ...]]'), - ('tuple[*Ts]', '[*tuple_type[int, ...]]', 'tuple[*tuple_type[int, ...]]'), - ('Tuple[*Ts]', '[*tuple_type[int, ...]]', 'Tuple[*tuple_type[int, ...]]'), + ('generic[*Ts]', '[()]', 'generic[()]'), + ('generic[*Ts]', '[int]', 'generic[int]'), + ('generic[*Ts]', '[int, str]', 'generic[int, str]'), + ('generic[*Ts]', '[*tuple_type[int]]', 'generic[int]'), + ('generic[*Ts]', '[*tuple_type[*Ts]]', 'generic[*Ts]'), + ('generic[*Ts]', '[*tuple_type[int, str]]', 'generic[int, str]'), + ('generic[*Ts]', '[tuple_type[int, ...]]', 'generic[tuple_type[int, ...]]'), + ('generic[*Ts]', '[tuple_type[int, ...], tuple_type[str, ...]]', 'generic[tuple_type[int, ...], tuple_type[str, ...]]'), + ('generic[*Ts]', '[*tuple_type[int, ...]]', 'generic[*tuple_type[int, ...]]'), # Technically, multiple unpackings are forbidden by PEP 646, but we # choose to be less restrictive at runtime, to allow folks room # to experiment. So all three of these should be valid. - ('C[*Ts]', '[*tuple_type[int, ...], *tuple_type[str, ...]]', 'C[*tuple_type[int, ...], *tuple_type[str, ...]]'), - ('tuple[*Ts]', '[*tuple_type[int, ...], *tuple_type[str, ...]]', 'tuple[*tuple_type[int, ...], *tuple_type[str, ...]]'), - ('Tuple[*Ts]', '[*tuple_type[int, ...], *tuple_type[str, ...]]', 'Tuple[*tuple_type[int, ...], *tuple_type[str, ...]]'), - - ('C[*Ts]', '[*Ts]', 'C[*Ts]'), - ('tuple[*Ts]', '[*Ts]', 'tuple[*Ts]'), - ('Tuple[*Ts]', '[*Ts]', 'Tuple[*Ts]'), - - ('C[*Ts]', '[T, *Ts]', 'C[T, *Ts]'), - ('tuple[*Ts]', '[T, *Ts]', 'tuple[T, *Ts]'), - ('Tuple[*Ts]', '[T, *Ts]', 'Tuple[T, *Ts]'), + ('generic[*Ts]', '[*tuple_type[int, ...], *tuple_type[str, ...]]', 'generic[*tuple_type[int, ...], *tuple_type[str, ...]]'), - ('C[*Ts]', '[*Ts, T]', 'C[*Ts, T]'), - ('tuple[*Ts]', '[*Ts, T]', 'tuple[*Ts, T]'), - ('Tuple[*Ts]', '[*Ts, T]', 'Tuple[*Ts, T]'), + ('generic[*Ts]', '[*Ts]', 'generic[*Ts]'), + ('generic[*Ts]', '[T, *Ts]', 'generic[T, *Ts]'), + ('generic[*Ts]', '[*Ts, T]', 'generic[*Ts, T]'), + ('generic[T, *Ts]', '[int]', 'generic[int]'), + ('generic[T, *Ts]', '[int, str]', 'generic[int, str]'), + ('generic[T, *Ts]', '[int, str, bool]', 'generic[int, str, bool]'), - ('C[T, *Ts]', '[int]', 'C[int]'), - ('tuple[T, *Ts]', '[int]', 'tuple[int]'), - ('Tuple[T, *Ts]', '[int]', 'Tuple[int]'), + ('generic[T, *Ts]', '[*tuple[int, ...]]', 'TypeError'), # Should be generic[int, *tuple[int, ...]] - ('C[T, *Ts]', '[int, str]', 'C[int, str]'), - ('tuple[T, *Ts]', '[int, str]', 'tuple[int, str]'), - ('Tuple[T, *Ts]', '[int, str]', 'Tuple[int, str]'), - - ('C[T, *Ts]', '[int, str, bool]', 'C[int, str, bool]'), - ('tuple[T, *Ts]', '[int, str, bool]', 'tuple[int, str, bool]'), - ('Tuple[T, *Ts]', '[int, str, bool]', 'Tuple[int, str, bool]'), - - ('C[T, *Ts]', '[*tuple[int, ...]]', 'C[*tuple[int, ...]]'), # Should be C[int, *tuple[int, ...]] - ('C[T, *Ts]', '[*Tuple[int, ...]]', 'TypeError'), # Ditto - ('tuple[T, *Ts]', '[*tuple[int, ...]]', 'tuple[*tuple[int, ...]]'), # Should be tuple[int, *tuple[int, ...]] - ('tuple[T, *Ts]', '[*Tuple[int, ...]]', 'TypeError'), # Should be tuple[int, *Tuple[int, ...]] - ('Tuple[T, *Ts]', '[*tuple[int, ...]]', 'Tuple[*tuple[int, ...]]'), # Should be Tuple[int, *tuple[int, ...]] - ('Tuple[T, *Ts]', '[*Tuple[int, ...]]', 'TypeError'), # Should be Tuple[int, *Tuple[int, ...]] - - ('C[*Ts, T]', '[int]', 'C[int]'), - ('tuple[*Ts, T]', '[int]', 'tuple[int]'), - ('Tuple[*Ts, T]', '[int]', 'Tuple[int]'), - - ('C[*Ts, T]', '[int, str]', 'C[int, str]'), - ('tuple[*Ts, T]', '[int, str]', 'tuple[int, str]'), - ('Tuple[*Ts, T]', '[int, str]', 'Tuple[int, str]'), - - ('C[*Ts, T]', '[int, str, bool]', 'C[int, str, bool]'), - ('tuple[*Ts, T]', '[int, str, bool]', 'tuple[int, str, bool]'), - ('Tuple[*Ts, T]', '[int, str, bool]', 'Tuple[int, str, bool]'), + ('generic[*Ts, T]', '[int]', 'generic[int]'), + ('generic[*Ts, T]', '[int, str]', 'generic[int, str]'), + ('generic[*Ts, T]', '[int, str, bool]', 'generic[int, str, bool]'), ('generic[T, *tuple_type[int, ...]]', '[str]', 'generic[str, *tuple_type[int, ...]]'), ('generic[T1, T2, *tuple_type[int, ...]]', '[str, bool]', 'generic[str, bool, *tuple_type[int, ...]]'), ('generic[T1, *tuple_type[int, ...], T2]', '[str, bool]', 'generic[str, *tuple_type[int, ...], bool]'), ('generic[T1, *tuple_type[int, ...], T2]', '[str, bool, float]', 'TypeError'), + + ('generic[T1, *tuple_type[T2, ...]]', '[int, str]', 'generic[int, *tuple_type[str, ...]]'), + ('generic[*tuple_type[T1, ...], T2]', '[int, str]', 'generic[*tuple_type[int, ...], str]'), + ('generic[T1, *tuple_type[generic[*Ts], ...]]', '[int, str, bool]', 'generic[int, *tuple_type[generic[str, bool], ...]]'), + ('generic[*tuple_type[generic[*Ts], ...], T1]', '[int, str, bool]', 'generic[*tuple_type[generic[int, str], ...], bool]'), ] for alias_template, args_template, expected_template in tests: diff --git a/Lib/typing.py b/Lib/typing.py index 46ef2d9cf6005..9fa4c48b45e85 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -271,6 +271,16 @@ def _check_generic(cls, parameters, elen): raise TypeError(f"Too {'many' if alen > elen else 'few'} arguments for {cls};" f" actual {alen}, expected {elen}") +def _unpack_args(args): + newargs = [] + for arg in args: + subargs = getattr(arg, '__typing_unpacked_tuple_args__', None) + if subargs is not None and not (subargs and subargs[-1] is ...): + newargs.extend(subargs) + else: + newargs.append(arg) + return newargs + def _prepare_paramspec_params(cls, params): """Prepares the parameters for a Generic containing ParamSpec variables (internal helper). @@ -892,12 +902,8 @@ def __repr__(self): def _is_unpacked_typevartuple(x: Any) -> bool: - return ( - isinstance(x, _UnpackGenericAlias) - # If x is Unpack[tuple[...]], __parameters__ will be empty. - and x.__parameters__ - and isinstance(x.__parameters__[0], TypeVarTuple) - ) + return ((not isinstance(x, type)) and + getattr(x, '__typing_is_unpacked_typevartuple__', False)) def _is_typevar_like(x: Any) -> bool: @@ -1010,7 +1016,8 @@ def __init__(self, name, *constraints, bound=None, def __typing_subst__(self, arg): msg = "Parameters to generic types must be types." arg = _type_check(arg, msg, is_argument=True) - if (isinstance(arg, _GenericAlias) and arg.__origin__ is Unpack): + if ((isinstance(arg, _GenericAlias) and arg.__origin__ is Unpack) or + (isinstance(arg, GenericAlias) and getattr(arg, '__unpacked__', False))): raise TypeError(f"{arg} is not valid as type argument") return arg @@ -1369,19 +1376,17 @@ def __getitem__(self, args): if self.__origin__ in (Generic, Protocol): # Can't subscript Generic[...] or Protocol[...]. raise TypeError(f"Cannot subscript already-subscripted {self}") + if not self.__parameters__: + raise TypeError(f"{self} is not a generic class") # Preprocess `args`. if not isinstance(args, tuple): args = (args,) args = tuple(_type_convert(p) for p in args) + args = _unpack_args(args) if (self._paramspec_tvars and any(isinstance(t, ParamSpec) for t in self.__parameters__)): args = _prepare_paramspec_params(self, args) - elif not any(isinstance(p, TypeVarTuple) for p in self.__parameters__): - # We only run this if there are no TypeVarTuples, because we - # don't check variadic generic arity at runtime (to reduce - # complexity of typing.py). - _check_generic(self, args, len(self.__parameters__)) new_args = self._determine_new_args(args) r = self.copy_with(new_args) @@ -1405,16 +1410,28 @@ def _determine_new_args(self, args): params = self.__parameters__ # In the example above, this would be {T3: str} new_arg_by_param = {} + typevartuple_index = None for i, param in enumerate(params): if isinstance(param, TypeVarTuple): - j = len(args) - (len(params) - i - 1) - if j < i: - raise TypeError(f"Too few arguments for {self}") - new_arg_by_param.update(zip(params[:i], args[:i])) - new_arg_by_param[param] = args[i: j] - new_arg_by_param.update(zip(params[i + 1:], args[j:])) - break + if typevartuple_index is not None: + raise TypeError(f"More than one TypeVarTuple parameter in {self}") + typevartuple_index = i + + alen = len(args) + plen = len(params) + if typevartuple_index is not None: + i = typevartuple_index + j = alen - (plen - i - 1) + if j < i: + raise TypeError(f"Too few arguments for {self};" + f" actual {alen}, expected at least {plen-1}") + new_arg_by_param.update(zip(params[:i], args[:i])) + new_arg_by_param[params[i]] = tuple(args[i: j]) + new_arg_by_param.update(zip(params[i + 1:], args[j:])) else: + if alen != plen: + raise TypeError(f"Too {'many' if alen > plen else 'few'} arguments for {self};" + f" actual {alen}, expected {plen}") new_arg_by_param.update(zip(params, args)) new_args = [] @@ -1722,14 +1739,25 @@ def __repr__(self): return '*' + repr(self.__args__[0]) def __getitem__(self, args): - if self.__typing_unpacked__(): + if self.__typing_is_unpacked_typevartuple__: return args return super().__getitem__(args) - def __typing_unpacked__(self): - # If x is Unpack[tuple[...]], __parameters__ will be empty. - return bool(self.__parameters__ and - isinstance(self.__parameters__[0], TypeVarTuple)) + @property + def __typing_unpacked_tuple_args__(self): + assert self.__origin__ is Unpack + assert len(self.__args__) == 1 + arg, = self.__args__ + if isinstance(arg, _GenericAlias): + assert arg.__origin__ is tuple + return arg.__args__ + return None + + @property + def __typing_is_unpacked_typevartuple__(self): + assert self.__origin__ is Unpack + assert len(self.__args__) == 1 + return isinstance(self.__args__[0], TypeVarTuple) class Generic: diff --git a/Objects/genericaliasobject.c b/Objects/genericaliasobject.c index 5eeb1dbb338d2..39fd70999ecbe 100644 --- a/Objects/genericaliasobject.c +++ b/Objects/genericaliasobject.c @@ -320,20 +320,85 @@ subs_tvars(PyObject *obj, PyObject *params, static int _is_unpacked_typevartuple(PyObject *arg) { - PyObject *meth; - int res = _PyObject_LookupAttr(arg, &_Py_ID(__typing_unpacked__), &meth); + PyObject *tmp; + if (PyType_Check(arg)) { // TODO: Add test + return 0; + } + int res = _PyObject_LookupAttr(arg, &_Py_ID(__typing_is_unpacked_typevartuple__), &tmp); if (res > 0) { - PyObject *tmp = PyObject_CallNoArgs(meth); - Py_DECREF(meth); - if (tmp == NULL) { - return -1; - } res = PyObject_IsTrue(tmp); Py_DECREF(tmp); } return res; } +static PyObject * +_unpacked_tuple_args(PyObject *arg) +{ + PyObject *result; + assert(!PyType_Check(arg)); + // Fast path + if (_PyGenericAlias_Check(arg) && + ((gaobject *)arg)->starred && + ((gaobject *)arg)->origin == (PyObject *)&PyTuple_Type) + { + result = ((gaobject *)arg)->args; + Py_INCREF(result); + return result; + } + + if (_PyObject_LookupAttr(arg, &_Py_ID(__typing_unpacked_tuple_args__), &result) > 0) { + if (result == Py_None) { + Py_DECREF(result); + return NULL; + } + return result; + } + return NULL; +} + +static PyObject * +_unpack_args(PyObject *item) +{ + PyObject *newargs = PyList_New(0); + if (newargs == NULL) { + return NULL; + } + int is_tuple = PyTuple_Check(item); + Py_ssize_t nitems = is_tuple ? PyTuple_GET_SIZE(item) : 1; + PyObject **argitems = is_tuple ? &PyTuple_GET_ITEM(item, 0) : &item; + for (Py_ssize_t i = 0; i < nitems; i++) { + item = argitems[i]; + if (!PyType_Check(item)) { + PyObject *subargs = _unpacked_tuple_args(item); + if (subargs != NULL && + PyTuple_Check(subargs) && + !(PyTuple_GET_SIZE(subargs) && + PyTuple_GET_ITEM(subargs, PyTuple_GET_SIZE(subargs)-1) == Py_Ellipsis)) + { + if (PyList_SetSlice(newargs, PY_SSIZE_T_MAX, PY_SSIZE_T_MAX, subargs) < 0) { + Py_DECREF(subargs); + Py_DECREF(newargs); + return NULL; + } + Py_DECREF(subargs); + continue; + } + Py_XDECREF(subargs); + if (PyErr_Occurred()) { + Py_DECREF(newargs); + return NULL; + } + } + if (PyList_Append(newargs, item) < 0) { + Py_DECREF(newargs); + return NULL; + } + } + Py_SETREF(newargs, PySequence_Tuple(newargs)); + return newargs; +} + PyObject * _Py_subs_parameters(PyObject *self, PyObject *args, PyObject *parameters, PyObject *item) { @@ -343,18 +408,26 @@ _Py_subs_parameters(PyObject *self, PyObject *args, PyObject *parameters, PyObje "%R is not a generic class", self); } + item = _unpack_args(item); int is_tuple = PyTuple_Check(item); Py_ssize_t nitems = is_tuple ? PyTuple_GET_SIZE(item) : 1; PyObject **argitems = is_tuple ? &PyTuple_GET_ITEM(item, 0) : &item; - Py_ssize_t varparam = 0; - for (; varparam < nparams; varparam++) { - PyObject *param = PyTuple_GET_ITEM(parameters, varparam); + Py_ssize_t varparam = nparams; + for (Py_ssize_t i = 0; i < nparams; i++) { + PyObject *param = PyTuple_GET_ITEM(parameters, i); if (Py_TYPE(param)->tp_iter) { // TypeVarTuple - break; + if (varparam < nparams) { + Py_DECREF(item); + return PyErr_Format(PyExc_TypeError, + "More than one TypeVarTuple parameter in %S", + self); + } + varparam = i; } } if (varparam < nparams) { if (nitems < nparams - 1) { + Py_DECREF(item); return PyErr_Format(PyExc_TypeError, "Too few arguments for %R", self); @@ -362,10 +435,11 @@ _Py_subs_parameters(PyObject *self, PyObject *args, PyObject *parameters, PyObje } else { if (nitems != nparams) { + Py_DECREF(item); return PyErr_Format(PyExc_TypeError, - "Too %s arguments for %R", + "Too %s arguments for %R; actual %zd, expected %zd", nitems > nparams ? "many" : "few", - self); + self, nitems, nparams); } } /* Replace all type variables (specified by parameters) @@ -377,6 +451,7 @@ _Py_subs_parameters(PyObject *self, PyObject *args, PyObject *parameters, PyObje Py_ssize_t nargs = PyTuple_GET_SIZE(args); PyObject *newargs = PyTuple_New(nargs); if (newargs == NULL) { + Py_DECREF(item); return NULL; } for (Py_ssize_t iarg = 0, jarg = 0; iarg < nargs; iarg++) { @@ -384,11 +459,13 @@ _Py_subs_parameters(PyObject *self, PyObject *args, PyObject *parameters, PyObje int unpack = _is_unpacked_typevartuple(arg); if (unpack < 0) { Py_DECREF(newargs); + Py_DECREF(item); return NULL; } PyObject *subst; if (_PyObject_LookupAttr(arg, &_Py_ID(__typing_subst__), &subst) < 0) { Py_DECREF(newargs); + Py_DECREF(item); return NULL; } if (subst) { @@ -397,6 +474,7 @@ _Py_subs_parameters(PyObject *self, PyObject *args, PyObject *parameters, PyObje if (iparam == varparam) { Py_DECREF(subst); Py_DECREF(newargs); + Py_DECREF(item); PyErr_SetString(PyExc_TypeError, "Substitution of bare TypeVarTuple is not supported"); return NULL; @@ -412,6 +490,7 @@ _Py_subs_parameters(PyObject *self, PyObject *args, PyObject *parameters, PyObje } if (arg == NULL) { Py_DECREF(newargs); + Py_DECREF(item); return NULL; } if (unpack) { @@ -419,6 +498,7 @@ _Py_subs_parameters(PyObject *self, PyObject *args, PyObject *parameters, PyObje &PyTuple_GET_ITEM(arg, 0), PyTuple_GET_SIZE(arg)); Py_DECREF(arg); if (jarg < 0) { + Py_DECREF(item); return NULL; } } @@ -428,6 +508,7 @@ _Py_subs_parameters(PyObject *self, PyObject *args, PyObject *parameters, PyObje } } + Py_DECREF(item); return newargs; } @@ -454,6 +535,7 @@ ga_getitem(PyObject *self, PyObject *item) } PyObject *res = Py_GenericAlias(alias->origin, newargs); + ((gaobject *)res)->starred = alias->starred; Py_DECREF(newargs); return res; @@ -518,6 +600,7 @@ static const char* const attr_exceptions[] = { "__args__", "__unpacked__", "__parameters__", + "__typing_unpacked_tuple_args__", "__mro_entries__", "__reduce_ex__", // needed so we don't look up object.__reduce_ex__ "__reduce__", @@ -689,8 +772,20 @@ ga_parameters(PyObject *self, void *unused) return alias->parameters; } +static PyObject * +ga_unpacked_tuple_args(PyObject *self, void *unused) +{ + gaobject *alias = (gaobject *)self; + if (alias->starred && alias->origin == (PyObject *)&PyTuple_Type) { + Py_INCREF(alias->args); + return alias->args; + } + Py_RETURN_NONE; +} + static PyGetSetDef ga_properties[] = { {"__parameters__", ga_parameters, (setter)NULL, "Type variables in the GenericAlias.", NULL}, + {"__typing_unpacked_tuple_args__", ga_unpacked_tuple_args, (setter)NULL, NULL}, {0} }; From webhook-mailer at python.org Sun May 8 11:36:42 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Sun, 08 May 2022 15:36:42 -0000 Subject: [Python-checkins] gh-92417: `logging` docs: Remove warning that only applies to Python <3.2 (#92425) Message-ID: https://github.com/python/cpython/commit/318c4e91ef166bcd5d513bb42b9156d54d423d4a commit: 318c4e91ef166bcd5d513bb42b9156d54d423d4a branch: main author: Alex Waygood committer: JelleZijlstra date: 2022-05-08T08:36:38-07:00 summary: gh-92417: `logging` docs: Remove warning that only applies to Python <3.2 (#92425) files: M Doc/library/logging.rst diff --git a/Doc/library/logging.rst b/Doc/library/logging.rst index ea6494f219ae7..b82b90b47dd16 100644 --- a/Doc/library/logging.rst +++ b/Doc/library/logging.rst @@ -1080,16 +1080,6 @@ functions. Logs a message with level *level* on the root logger. The other arguments are interpreted as for :func:`debug`. - .. note:: The above module-level convenience functions, which delegate to the - root logger, call :func:`basicConfig` to ensure that at least one handler - is available. Because of this, they should *not* be used in threads, - in versions of Python earlier than 2.7.1 and 3.2, unless at least one - handler has been added to the root logger *before* the threads are - started. In earlier versions of Python, due to a thread safety shortcoming - in :func:`basicConfig`, this can (under rare circumstances) lead to - handlers being added multiple times to the root logger, which can in turn - lead to multiple messages for the same event. - .. function:: disable(level=CRITICAL) Provides an overriding level *level* for all loggers which takes precedence over From webhook-mailer at python.org Sun May 8 11:36:58 2022 From: webhook-mailer at python.org (miss-islington) Date: Sun, 08 May 2022 15:36:58 -0000 Subject: [Python-checkins] `typing.Text`: tweak deprecation notice (GH-92405) Message-ID: https://github.com/python/cpython/commit/6d8fd3f6085ee5bc4b0fb9e47f42aeeeef0fcae7 commit: 6d8fd3f6085ee5bc4b0fb9e47f42aeeeef0fcae7 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-08T08:36:54-07:00 summary: `typing.Text`: tweak deprecation notice (GH-92405) https://github.com/python/cpython/pull/92351/filesGH-r866869469 Co-authored-by: Jelle Zijlstra (cherry picked from commit bdc99a830f27451754d80ec414d7799b0f4bfed6) Co-authored-by: Alex Waygood files: M Doc/library/typing.rst diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index 1d125fb1ebebb..29bcedaddce9d 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -1978,7 +1978,8 @@ Other concrete types .. deprecated:: 3.11 Python 2 is no longer supported, and most type checkers also no longer - support type checking Python 2 code. Users should now use + support type checking Python 2 code. Removal of the alias is not + currently planned, but users are encouraged to use :class:`str` instead of ``Text`` wherever possible. Abstract Base Classes From webhook-mailer at python.org Sun May 8 11:44:58 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Sun, 08 May 2022 15:44:58 -0000 Subject: [Python-checkins] Fix the `versionadded` for asyncio.StreamWriter.start_tls() (#92378) Message-ID: https://github.com/python/cpython/commit/063e8ab72bf540ffd0e9214df38012be4b7727d8 commit: 063e8ab72bf540ffd0e9214df38012be4b7727d8 branch: main author: Oleg Iarygin committer: JelleZijlstra date: 2022-05-08T08:44:54-07:00 summary: Fix the `versionadded` for asyncio.StreamWriter.start_tls() (#92378) files: M Doc/library/asyncio-stream.rst diff --git a/Doc/library/asyncio-stream.rst b/Doc/library/asyncio-stream.rst index 72355d356f205..97431d103cf4b 100644 --- a/Doc/library/asyncio-stream.rst +++ b/Doc/library/asyncio-stream.rst @@ -311,7 +311,7 @@ StreamWriter handshake to complete before aborting the connection. ``60.0`` seconds if ``None`` (default). - .. versionadded:: 3.8 + .. versionadded:: 3.11 .. method:: is_closing() From webhook-mailer at python.org Sun May 8 12:02:31 2022 From: webhook-mailer at python.org (miss-islington) Date: Sun, 08 May 2022 16:02:31 -0000 Subject: [Python-checkins] Fix typo in whatsnew (GH-92488) Message-ID: https://github.com/python/cpython/commit/5c3ecddad7b8aaf2fb77ec6275c2cba02d970cb7 commit: 5c3ecddad7b8aaf2fb77ec6275c2cba02d970cb7 branch: main author: Ezio Melotti committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-08T09:02:27-07:00 summary: Fix typo in whatsnew (GH-92488) Automerge-Triggered-By: GH:ezio-melotti files: M Doc/whatsnew/3.12.rst diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst index bb6730c073e27..dacf04102acce 100644 --- a/Doc/whatsnew/3.12.rst +++ b/Doc/whatsnew/3.12.rst @@ -46,7 +46,7 @@ This saves the maintainer the effort of going through the Mercurial log when researching a change. -This article explains the new features in Python 3.12, compared to 3.10. +This article explains the new features in Python 3.12, compared to 3.11. For full details, see the :ref:`changelog `. From webhook-mailer at python.org Sun May 8 12:03:13 2022 From: webhook-mailer at python.org (miss-islington) Date: Sun, 08 May 2022 16:03:13 -0000 Subject: [Python-checkins] gh-92417: `logging` docs: Remove warning that only applies to Python <3.2 (GH-92425) Message-ID: https://github.com/python/cpython/commit/15cb6e8b8b84f4ccc4a9215fd0c0477abfe4015e commit: 15cb6e8b8b84f4ccc4a9215fd0c0477abfe4015e branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-08T09:03:09-07:00 summary: gh-92417: `logging` docs: Remove warning that only applies to Python <3.2 (GH-92425) (cherry picked from commit 318c4e91ef166bcd5d513bb42b9156d54d423d4a) Co-authored-by: Alex Waygood files: M Doc/library/logging.rst diff --git a/Doc/library/logging.rst b/Doc/library/logging.rst index 74b1f69caec5c..b32af94e85d01 100644 --- a/Doc/library/logging.rst +++ b/Doc/library/logging.rst @@ -1080,16 +1080,6 @@ functions. Logs a message with level *level* on the root logger. The other arguments are interpreted as for :func:`debug`. - .. note:: The above module-level convenience functions, which delegate to the - root logger, call :func:`basicConfig` to ensure that at least one handler - is available. Because of this, they should *not* be used in threads, - in versions of Python earlier than 2.7.1 and 3.2, unless at least one - handler has been added to the root logger *before* the threads are - started. In earlier versions of Python, due to a thread safety shortcoming - in :func:`basicConfig`, this can (under rare circumstances) lead to - handlers being added multiple times to the root logger, which can in turn - lead to multiple messages for the same event. - .. function:: disable(level=CRITICAL) Provides an overriding level *level* for all loggers which takes precedence over From webhook-mailer at python.org Sun May 8 12:04:04 2022 From: webhook-mailer at python.org (miss-islington) Date: Sun, 08 May 2022 16:04:04 -0000 Subject: [Python-checkins] gh-92417: `logging` docs: Remove warning that only applies to Python <3.2 (GH-92425) Message-ID: https://github.com/python/cpython/commit/7c6d649c2b14ae514d032d168cb60806d9edf810 commit: 7c6d649c2b14ae514d032d168cb60806d9edf810 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-08T09:04:00-07:00 summary: gh-92417: `logging` docs: Remove warning that only applies to Python <3.2 (GH-92425) (cherry picked from commit 318c4e91ef166bcd5d513bb42b9156d54d423d4a) Co-authored-by: Alex Waygood files: M Doc/library/logging.rst diff --git a/Doc/library/logging.rst b/Doc/library/logging.rst index ea6494f219ae7..b82b90b47dd16 100644 --- a/Doc/library/logging.rst +++ b/Doc/library/logging.rst @@ -1080,16 +1080,6 @@ functions. Logs a message with level *level* on the root logger. The other arguments are interpreted as for :func:`debug`. - .. note:: The above module-level convenience functions, which delegate to the - root logger, call :func:`basicConfig` to ensure that at least one handler - is available. Because of this, they should *not* be used in threads, - in versions of Python earlier than 2.7.1 and 3.2, unless at least one - handler has been added to the root logger *before* the threads are - started. In earlier versions of Python, due to a thread safety shortcoming - in :func:`basicConfig`, this can (under rare circumstances) lead to - handlers being added multiple times to the root logger, which can in turn - lead to multiple messages for the same event. - .. function:: disable(level=CRITICAL) Provides an overriding level *level* for all loggers which takes precedence over From webhook-mailer at python.org Sun May 8 12:04:33 2022 From: webhook-mailer at python.org (miss-islington) Date: Sun, 08 May 2022 16:04:33 -0000 Subject: [Python-checkins] Fix the `versionadded` for asyncio.StreamWriter.start_tls() (GH-92378) Message-ID: https://github.com/python/cpython/commit/8037fb708e1c4f5a6ba06cd60fd84779e41f289e commit: 8037fb708e1c4f5a6ba06cd60fd84779e41f289e branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-08T09:04:29-07:00 summary: Fix the `versionadded` for asyncio.StreamWriter.start_tls() (GH-92378) (cherry picked from commit 063e8ab72bf540ffd0e9214df38012be4b7727d8) Co-authored-by: Oleg Iarygin files: M Doc/library/asyncio-stream.rst diff --git a/Doc/library/asyncio-stream.rst b/Doc/library/asyncio-stream.rst index 72355d356f205..97431d103cf4b 100644 --- a/Doc/library/asyncio-stream.rst +++ b/Doc/library/asyncio-stream.rst @@ -311,7 +311,7 @@ StreamWriter handshake to complete before aborting the connection. ``60.0`` seconds if ``None`` (default). - .. versionadded:: 3.8 + .. versionadded:: 3.11 .. method:: is_closing() From webhook-mailer at python.org Sun May 8 12:07:53 2022 From: webhook-mailer at python.org (miss-islington) Date: Sun, 08 May 2022 16:07:53 -0000 Subject: [Python-checkins] gh-92417: `logging` docs: Remove warning that only applies to Python <3.2 (GH-92425) Message-ID: https://github.com/python/cpython/commit/580163d6a9870b02e0cdb0e9fa2629d7b5d51124 commit: 580163d6a9870b02e0cdb0e9fa2629d7b5d51124 branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-08T09:07:49-07:00 summary: gh-92417: `logging` docs: Remove warning that only applies to Python <3.2 (GH-92425) (cherry picked from commit 318c4e91ef166bcd5d513bb42b9156d54d423d4a) Co-authored-by: Alex Waygood files: M Doc/library/logging.rst diff --git a/Doc/library/logging.rst b/Doc/library/logging.rst index 9d6167cca5294..f85c691f5d72a 100644 --- a/Doc/library/logging.rst +++ b/Doc/library/logging.rst @@ -1073,16 +1073,6 @@ functions. Logs a message with level *level* on the root logger. The other arguments are interpreted as for :func:`debug`. - .. note:: The above module-level convenience functions, which delegate to the - root logger, call :func:`basicConfig` to ensure that at least one handler - is available. Because of this, they should *not* be used in threads, - in versions of Python earlier than 2.7.1 and 3.2, unless at least one - handler has been added to the root logger *before* the threads are - started. In earlier versions of Python, due to a thread safety shortcoming - in :func:`basicConfig`, this can (under rare circumstances) lead to - handlers being added multiple times to the root logger, which can in turn - lead to multiple messages for the same event. - .. function:: disable(level=CRITICAL) Provides an overriding level *level* for all loggers which takes precedence over From webhook-mailer at python.org Sun May 8 12:14:59 2022 From: webhook-mailer at python.org (ezio-melotti) Date: Sun, 08 May 2022 16:14:59 -0000 Subject: [Python-checkins] gh-80856: doc: reveal doctest directives (#92318) Message-ID: https://github.com/python/cpython/commit/7b024e3a3f77027f747da7580ed0a3ed2dec276a commit: 7b024e3a3f77027f747da7580ed0a3ed2dec276a branch: main author: Davide Rizzo committer: ezio-melotti date: 2022-05-08T18:14:55+02:00 summary: gh-80856: doc: reveal doctest directives (#92318) * Doc: Reveal doctest directives. * Fix whitespace. Co-authored-by: Julien Palard Co-authored-by: Ezio Melotti files: M Doc/library/doctest.rst diff --git a/Doc/library/doctest.rst b/Doc/library/doctest.rst index 30328790eefe3..be5651d15a0c9 100644 --- a/Doc/library/doctest.rst +++ b/Doc/library/doctest.rst @@ -714,36 +714,51 @@ above. An example's doctest directives modify doctest's behavior for that single example. Use ``+`` to enable the named behavior, or ``-`` to disable it. -For example, this test passes:: +For example, this test passes: - >>> print(list(range(20))) # doctest: +NORMALIZE_WHITESPACE +.. doctest:: + :no-trim-doctest-flags: + + >>> print(list(range(20))) # doctest: +NORMALIZE_WHITESPACE [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19] Without the directive it would fail, both because the actual output doesn't have two blanks before the single-digit list elements, and because the actual output is on a single line. This test also passes, and also requires a directive to do -so:: +so: + +.. doctest:: + :no-trim-doctest-flags: - >>> print(list(range(20))) # doctest: +ELLIPSIS + >>> print(list(range(20))) # doctest: +ELLIPSIS [0, 1, ..., 18, 19] Multiple directives can be used on a single physical line, separated by -commas:: +commas: - >>> print(list(range(20))) # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE +.. doctest:: + :no-trim-doctest-flags: + + >>> print(list(range(20))) # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE [0, 1, ..., 18, 19] If multiple directive comments are used for a single example, then they are -combined:: +combined: + +.. doctest:: + :no-trim-doctest-flags: - >>> print(list(range(20))) # doctest: +ELLIPSIS - ... # doctest: +NORMALIZE_WHITESPACE + >>> print(list(range(20))) # doctest: +ELLIPSIS + ... # doctest: +NORMALIZE_WHITESPACE [0, 1, ..., 18, 19] As the previous example shows, you can add ``...`` lines to your example containing only directives. This can be useful when an example is too long for -a directive to comfortably fit on the same line:: +a directive to comfortably fit on the same line: + +.. doctest:: + :no-trim-doctest-flags: >>> print(list(range(5)) + list(range(10, 20)) + list(range(30, 40))) ... # doctest: +ELLIPSIS @@ -783,18 +798,23 @@ instead. Another is to do :: There are others, but you get the idea. -Another bad idea is to print things that embed an object address, like :: +Another bad idea is to print things that embed an object address, like + +.. doctest:: - >>> id(1.0) # certain to fail some of the time + >>> id(1.0) # certain to fail some of the time # doctest: +SKIP 7948648 >>> class C: pass - >>> C() # the default repr() for instances embeds an address - <__main__.C instance at 0x00AC18F0> + >>> C() # the default repr() for instances embeds an address # doctest: +SKIP + + +The :const:`ELLIPSIS` directive gives a nice approach for the last example: -The :const:`ELLIPSIS` directive gives a nice approach for the last example:: +.. doctest:: + :no-trim-doctest-flags: - >>> C() #doctest: +ELLIPSIS - <__main__.C instance at 0x...> + >>> C() # doctest: +ELLIPSIS + Floating-point numbers are also subject to small output variations across platforms, because Python defers to the platform C library for float formatting, From webhook-mailer at python.org Sun May 8 12:19:36 2022 From: webhook-mailer at python.org (serhiy-storchaka) Date: Sun, 08 May 2022 16:19:36 -0000 Subject: [Python-checkins] gh-91760: More strict rules for numerical group references and group names in RE (GH-91792) Message-ID: https://github.com/python/cpython/commit/a84a56d80fa3d9a5909d074bbcd2efff7ef8f1b7 commit: a84a56d80fa3d9a5909d074bbcd2efff7ef8f1b7 branch: main author: Serhiy Storchaka committer: serhiy-storchaka date: 2022-05-08T19:19:29+03:00 summary: gh-91760: More strict rules for numerical group references and group names in RE (GH-91792) Only sequence of ASCII digits is now accepted as a numerical reference. The group name in bytes patterns and replacement strings can now only contain ASCII letters and digits and underscore. files: A Misc/NEWS.d/next/Library/2022-04-21-19-14-29.gh-issue-91760.54AR-m.rst M Doc/library/re.rst M Doc/whatsnew/3.12.rst M Lib/re/_parser.py M Lib/test/test_re.py diff --git a/Doc/library/re.rst b/Doc/library/re.rst index 3cd9f252fee6f..39e7d23aaf9c9 100644 --- a/Doc/library/re.rst +++ b/Doc/library/re.rst @@ -395,7 +395,8 @@ The special characters are: ``(?P...)`` Similar to regular parentheses, but the substring matched by the group is accessible via the symbolic group name *name*. Group names must be valid - Python identifiers, and each group name must be defined only once within a + Python identifiers, and in bytes patterns they must contain only characters + in the ASCII range. Each group name must be defined only once within a regular expression. A symbolic group is also a numbered group, just as if the group were not named. @@ -417,8 +418,9 @@ The special characters are: | | * ``\1`` | +---------------------------------------+----------------------------------+ - .. deprecated:: 3.11 - Group names containing non-ASCII characters in bytes patterns. + .. versionchanged:: 3.12 + In bytes patterns group names must contain only characters in + the ASCII range. .. index:: single: (?P=; in regular expressions @@ -489,8 +491,8 @@ The special characters are: will match with ``''`` as well as ``'user at host.com'``, but not with ``''``. - .. deprecated:: 3.11 - Group *id* containing anything except ASCII digits. + .. versionchanged:: 3.12 + Group *id* can only contain ASCII digits. The special sequences consist of ``'\'`` and a character from the list below. @@ -1001,9 +1003,10 @@ form. Empty matches for the pattern are replaced when adjacent to a previous non-empty match. - .. deprecated:: 3.11 - Group *id* containing anything except ASCII digits. - Group names containing non-ASCII characters in bytes replacement strings. + .. versionchanged:: 3.12 + Group *id* can only contain ASCII digits. + In bytes replacement strings group names must contain only characters + in the ASCII range. .. function:: subn(pattern, repl, string, count=0, flags=0) diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst index dacf04102acce..b73c3db040019 100644 --- a/Doc/whatsnew/3.12.rst +++ b/Doc/whatsnew/3.12.rst @@ -114,3 +114,13 @@ Porting to Python 3.12 This section lists previously described changes and other bugfixes that may require changes to your code. + +Changes in the Python API +------------------------- + +* More strict rules are now applied for numerical group references and + group names in regular expressions. + Only sequence of ASCII digits is now accepted as a numerical reference. + The group name in bytes patterns and replacement strings can now only + contain ASCII letters and digits and underscore. + (Contributed by Serhiy Storchaka in :gh:`91760`.) diff --git a/Lib/re/_parser.py b/Lib/re/_parser.py index a393c508d86e5..33b70973ae6d3 100644 --- a/Lib/re/_parser.py +++ b/Lib/re/_parser.py @@ -291,17 +291,13 @@ def error(self, msg, offset=0): msg = msg.encode('ascii', 'backslashreplace').decode('ascii') return error(msg, self.string, self.tell() - offset) - def checkgroupname(self, name, offset, nested): + def checkgroupname(self, name, offset): + if not (self.istext or name.isascii()): + msg = "bad character in group name %a" % name + raise self.error(msg, len(name) + offset) if not name.isidentifier(): msg = "bad character in group name %r" % name raise self.error(msg, len(name) + offset) - if not (self.istext or name.isascii()): - import warnings - warnings.warn( - "bad character in group name %a at position %d" % - (name, self.tell() - len(name) - offset), - DeprecationWarning, stacklevel=nested + 7 - ) def _class_escape(source, escape): # handle escape code inside character class @@ -717,11 +713,11 @@ def _parse(source, state, verbose, nested, first=False): if sourcematch("<"): # named group: skip forward to end of name name = source.getuntil(">", "group name") - source.checkgroupname(name, 1, nested) + source.checkgroupname(name, 1) elif sourcematch("="): # named backreference name = source.getuntil(")", "group name") - source.checkgroupname(name, 1, nested) + source.checkgroupname(name, 1) gid = state.groupdict.get(name) if gid is None: msg = "unknown group name %r" % name @@ -782,20 +778,14 @@ def _parse(source, state, verbose, nested, first=False): elif char == "(": # conditional backreference group condname = source.getuntil(")", "group name") - if condname.isidentifier(): - source.checkgroupname(condname, 1, nested) + if not (condname.isdecimal() and condname.isascii()): + source.checkgroupname(condname, 1) condgroup = state.groupdict.get(condname) if condgroup is None: msg = "unknown group name %r" % condname raise source.error(msg, len(condname) + 1) else: - try: - condgroup = int(condname) - if condgroup < 0: - raise ValueError - except ValueError: - msg = "bad character in group name %r" % condname - raise source.error(msg, len(condname) + 1) from None + condgroup = int(condname) if not condgroup: raise source.error("bad group number", len(condname) + 1) @@ -1022,20 +1012,14 @@ def addgroup(index, pos): if not s.match("<"): raise s.error("missing <") name = s.getuntil(">", "group name") - if name.isidentifier(): - s.checkgroupname(name, 1, -1) + if not (name.isdecimal() and name.isascii()): + s.checkgroupname(name, 1) try: index = groupindex[name] except KeyError: raise IndexError("unknown group name %r" % name) from None else: - try: - index = int(name) - if index < 0: - raise ValueError - except ValueError: - raise s.error("bad character in group name %r" % name, - len(name) + 1) from None + index = int(name) if index >= MAXGROUPS: raise s.error("invalid group reference %d" % index, len(name) + 1) diff --git a/Lib/test/test_re.py b/Lib/test/test_re.py index c1014753802c9..ba70de4344bd9 100644 --- a/Lib/test/test_re.py +++ b/Lib/test/test_re.py @@ -275,21 +275,12 @@ def test_symbolic_groups_errors(self): self.checkPatternError('(?Px)', "bad character in group name '?'", 4) self.checkPatternError('(?P=?)', "bad character in group name '?'", 4) self.checkPatternError('(?(?)y)', "bad character in group name '?'", 3) - with self.assertWarnsRegex(DeprecationWarning, - r"bad character in group name '\\xc2\\xb5' " - r"at position 4") as w: - re.compile(b'(?P<\xc2\xb5>x)') - self.assertEqual(w.filename, __file__) - with self.assertWarnsRegex(DeprecationWarning, - r"bad character in group name '\\xc2\\xb5' " - r"at position 4"): - self.checkPatternError(b'(?P=\xc2\xb5)', - r"unknown group name '\xc2\xb5'", 4) - with self.assertWarnsRegex(DeprecationWarning, - r"bad character in group name '\\xc2\\xb5' " - r"at position 3"): - self.checkPatternError(b'(?(\xc2\xb5)y)', - r"unknown group name '\xc2\xb5'", 3) + self.checkPatternError(b'(?P<\xc2\xb5>x)', + r"bad character in group name '\xc2\xb5'", 4) + self.checkPatternError(b'(?P=\xc2\xb5)', + r"bad character in group name '\xc2\xb5'", 4) + self.checkPatternError(b'(?(\xc2\xb5)y)', + r"bad character in group name '\xc2\xb5'", 3) def test_symbolic_refs(self): self.assertEqual(re.sub('(?Px)|(?Py)', r'\g', 'xx'), '') @@ -322,35 +313,22 @@ def test_symbolic_refs_errors(self): re.sub('(?Px)', r'\g', 'xx') self.checkTemplateError('(?Px)', r'\g<-1>', 'xx', "bad character in group name '-1'", 3) - with self.assertWarnsRegex(DeprecationWarning, - r"bad character in group name '\+1' " - r"at position 3") as w: - re.sub('(?Px)', r'\g<+1>', 'xx') - self.assertEqual(w.filename, __file__) - with self.assertWarnsRegex(DeprecationWarning, - r"bad character in group name '1_0' " - r"at position 3"): - re.sub('()'*10, r'\g<1_0>', 'xx') - with self.assertWarnsRegex(DeprecationWarning, - r"bad character in group name ' 1 ' " - r"at position 3"): - re.sub('(?Px)', r'\g< 1 >', 'xx') + self.checkTemplateError('(?Px)', r'\g<+1>', 'xx', + "bad character in group name '+1'", 3) + self.checkTemplateError('()'*10, r'\g<1_0>', 'xx', + "bad character in group name '1_0'", 3) + self.checkTemplateError('(?Px)', r'\g< 1 >', 'xx', + "bad character in group name ' 1 '", 3) self.checkTemplateError('(?Px)', r'\g', 'xx', "bad character in group name '?'", 3) - with self.assertWarnsRegex(DeprecationWarning, - r"bad character in group name '\\xc2\\xb5' " - r"at position 3") as w: - with self.assertRaisesRegex(IndexError, "unknown group name '\xc2\xb5'"): - re.sub(b'(?Px)', b'\\g<\xc2\xb5>', b'xx') - self.assertEqual(w.filename, __file__) + self.checkTemplateError(b'(?Px)', b'\\g<\xc2\xb5>', b'xx', + r"bad character in group name '\xc2\xb5'", 3) self.checkTemplateError('(?Px)', r'\g', 'xx', "bad character in group name '?'", 3) self.checkTemplateError('(?Px)', r'\g', 'xx', "bad character in group name '?'", 3) - with self.assertWarnsRegex(DeprecationWarning, - r"bad character in group name '?' " - r"at position 3"): - re.sub('(?Px)', r'\g', 'xx') + self.checkTemplateError('(?Px)', r'\g', 'xx', + "bad character in group name '?'", 3) def test_re_subn(self): self.assertEqual(re.subn("(?i)b+", "x", "bbbb BBBB"), ('x x', 2)) @@ -616,27 +594,18 @@ def test_re_groupref_exists_errors(self): self.checkPatternError(r'(?P)(?(0)a|b)', 'bad group number', 10) self.checkPatternError(r'()(?(-1)a|b)', "bad character in group name '-1'", 5) - with self.assertWarnsRegex(DeprecationWarning, - r"bad character in group name '\+1' " - r"at position 5") as w: - re.compile(r'()(?(+1)a|b)') - self.assertEqual(w.filename, __file__) - with self.assertWarnsRegex(DeprecationWarning, - r"bad character in group name '1_0' " - r"at position 23"): - re.compile(r'()'*10 + r'(?(1_0)a|b)') - with self.assertWarnsRegex(DeprecationWarning, - r"bad character in group name ' 1 ' " - r"at position 5"): - re.compile(r'()(?( 1 )a|b)') + self.checkPatternError(r'()(?(+1)a|b)', + "bad character in group name '+1'", 5) + self.checkPatternError(r'()'*10 + r'(?(1_0)a|b)', + "bad character in group name '1_0'", 23) + self.checkPatternError(r'()(?( 1 )a|b)', + "bad character in group name ' 1 '", 5) self.checkPatternError(r'()(?(?)a|b)', "bad character in group name '?'", 5) self.checkPatternError(r'()(?(?)a|b)', "bad character in group name '?'", 5) - with self.assertWarnsRegex(DeprecationWarning, - r"bad character in group name '?' " - r"at position 5"): - re.compile(r'()(?(?)a|b)') + self.checkPatternError(r'()(?(?)a|b)', + "bad character in group name '?'", 5) self.checkPatternError(r'()(?(1', "missing ), unterminated name", 5) self.checkPatternError(r'()(?(1)a', diff --git a/Misc/NEWS.d/next/Library/2022-04-21-19-14-29.gh-issue-91760.54AR-m.rst b/Misc/NEWS.d/next/Library/2022-04-21-19-14-29.gh-issue-91760.54AR-m.rst new file mode 100644 index 0000000000000..ac3e7cdd4bace --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-04-21-19-14-29.gh-issue-91760.54AR-m.rst @@ -0,0 +1,5 @@ +Apply more strict rules for numerical group references and group names in +regular expressions. Only sequence of ASCII digits is now accepted as +a numerical reference. The group name in +bytes patterns and replacement strings can now only contain ASCII letters +and digits and underscore. From webhook-mailer at python.org Sun May 8 12:20:43 2022 From: webhook-mailer at python.org (gpshead) Date: Sun, 08 May 2022 16:20:43 -0000 Subject: [Python-checkins] gh-90622: Do not spawn ProcessPool workers on demand via fork method. (#91598) Message-ID: https://github.com/python/cpython/commit/ebb37fc3fdcb03db4e206db017eeef7aaffbae84 commit: ebb37fc3fdcb03db4e206db017eeef7aaffbae84 branch: main author: Gregory P. Smith committer: gpshead date: 2022-05-08T09:20:34-07:00 summary: gh-90622: Do not spawn ProcessPool workers on demand via fork method. (#91598) Do not spawn ProcessPool workers on demand when they spawn via fork. This avoids potential deadlocks in the child processes due to forking from a multithreaded process. files: A Misc/NEWS.d/next/Library/2022-04-15-22-07-36.gh-issue-90622.0C6l8h.rst M Lib/concurrent/futures/process.py M Lib/test/test_concurrent_futures.py diff --git a/Lib/concurrent/futures/process.py b/Lib/concurrent/futures/process.py index 821034da21adc..7e2f5fa30e826 100644 --- a/Lib/concurrent/futures/process.py +++ b/Lib/concurrent/futures/process.py @@ -652,6 +652,10 @@ def __init__(self, max_workers=None, mp_context=None, mp_context = mp.get_context() self._mp_context = mp_context + # https://github.com/python/cpython/issues/90622 + self._safe_to_dynamically_spawn_children = ( + self._mp_context.get_start_method(allow_none=False) != "fork") + if initializer is not None and not callable(initializer): raise TypeError("initializer must be a callable") self._initializer = initializer @@ -714,6 +718,8 @@ def __init__(self, max_workers=None, mp_context=None, def _start_executor_manager_thread(self): if self._executor_manager_thread is None: # Start the processes so that their sentinels are known. + if not self._safe_to_dynamically_spawn_children: # ie, using fork. + self._launch_processes() self._executor_manager_thread = _ExecutorManagerThread(self) self._executor_manager_thread.start() _threads_wakeups[self._executor_manager_thread] = \ @@ -726,15 +732,32 @@ def _adjust_process_count(self): process_count = len(self._processes) if process_count < self._max_workers: - p = self._mp_context.Process( - target=_process_worker, - args=(self._call_queue, - self._result_queue, - self._initializer, - self._initargs, - self._max_tasks_per_child)) - p.start() - self._processes[p.pid] = p + # Assertion disabled as this codepath is also used to replace a + # worker that unexpectedly dies, even when using the 'fork' start + # method. That means there is still a potential deadlock bug. If a + # 'fork' mp_context worker dies, we'll be forking a new one when + # we know a thread is running (self._executor_manager_thread). + #assert self._safe_to_dynamically_spawn_children or not self._executor_manager_thread, 'https://github.com/python/cpython/issues/90622' + self._spawn_process() + + def _launch_processes(self): + # https://github.com/python/cpython/issues/90622 + assert not self._executor_manager_thread, ( + 'Processes cannot be fork()ed after the thread has started, ' + 'deadlock in the child processes could result.') + for _ in range(len(self._processes), self._max_workers): + self._spawn_process() + + def _spawn_process(self): + p = self._mp_context.Process( + target=_process_worker, + args=(self._call_queue, + self._result_queue, + self._initializer, + self._initargs, + self._max_tasks_per_child)) + p.start() + self._processes[p.pid] = p def submit(self, fn, /, *args, **kwargs): with self._shutdown_lock: @@ -755,7 +778,8 @@ def submit(self, fn, /, *args, **kwargs): # Wake up queue management thread self._executor_manager_thread_wakeup.wakeup() - self._adjust_process_count() + if self._safe_to_dynamically_spawn_children: + self._adjust_process_count() self._start_executor_manager_thread() return f submit.__doc__ = _base.Executor.submit.__doc__ diff --git a/Lib/test/test_concurrent_futures.py b/Lib/test/test_concurrent_futures.py index 4363e90b8bbab..6f3b4609232bb 100644 --- a/Lib/test/test_concurrent_futures.py +++ b/Lib/test/test_concurrent_futures.py @@ -497,10 +497,16 @@ def acquire_lock(lock): lock.acquire() mp_context = self.get_context() + if mp_context.get_start_method(allow_none=False) == "fork": + # fork pre-spawns, not on demand. + expected_num_processes = self.worker_count + else: + expected_num_processes = 3 + sem = mp_context.Semaphore(0) for _ in range(3): self.executor.submit(acquire_lock, sem) - self.assertEqual(len(self.executor._processes), 3) + self.assertEqual(len(self.executor._processes), expected_num_processes) for _ in range(3): sem.release() processes = self.executor._processes @@ -1021,6 +1027,8 @@ def test_saturation(self): def test_idle_process_reuse_one(self): executor = self.executor assert executor._max_workers >= 4 + if self.get_context().get_start_method(allow_none=False) == "fork": + raise unittest.SkipTest("Incompatible with the fork start method.") executor.submit(mul, 21, 2).result() executor.submit(mul, 6, 7).result() executor.submit(mul, 3, 14).result() @@ -1029,6 +1037,8 @@ def test_idle_process_reuse_one(self): def test_idle_process_reuse_multiple(self): executor = self.executor assert executor._max_workers <= 5 + if self.get_context().get_start_method(allow_none=False) == "fork": + raise unittest.SkipTest("Incompatible with the fork start method.") executor.submit(mul, 12, 7).result() executor.submit(mul, 33, 25) executor.submit(mul, 25, 26).result() diff --git a/Misc/NEWS.d/next/Library/2022-04-15-22-07-36.gh-issue-90622.0C6l8h.rst b/Misc/NEWS.d/next/Library/2022-04-15-22-07-36.gh-issue-90622.0C6l8h.rst new file mode 100644 index 0000000000000..5db0a1bbe721d --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-04-15-22-07-36.gh-issue-90622.0C6l8h.rst @@ -0,0 +1,4 @@ +Worker processes for :class:`concurrent.futures.ProcessPoolExecutor` are no +longer spawned on demand (a feature added in 3.9) when the multiprocessing +context start method is ``"fork"`` as that can lead to deadlocks in the +child processes due to a fork happening while threads are running. From webhook-mailer at python.org Sun May 8 12:32:36 2022 From: webhook-mailer at python.org (miss-islington) Date: Sun, 08 May 2022 16:32:36 -0000 Subject: [Python-checkins] gh-80856: doc: reveal doctest directives (GH-92318) Message-ID: https://github.com/python/cpython/commit/1dbf69979fb1f104c7607a412b46d0d24d480b5a commit: 1dbf69979fb1f104c7607a412b46d0d24d480b5a branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-08T09:32:20-07:00 summary: gh-80856: doc: reveal doctest directives (GH-92318) * Doc: Reveal doctest directives. * Fix whitespace. Co-authored-by: Julien Palard Co-authored-by: Ezio Melotti (cherry picked from commit 7b024e3a3f77027f747da7580ed0a3ed2dec276a) Co-authored-by: Davide Rizzo files: M Doc/library/doctest.rst diff --git a/Doc/library/doctest.rst b/Doc/library/doctest.rst index 146fa5e775be4..59091e48d309f 100644 --- a/Doc/library/doctest.rst +++ b/Doc/library/doctest.rst @@ -715,36 +715,51 @@ above. An example's doctest directives modify doctest's behavior for that single example. Use ``+`` to enable the named behavior, or ``-`` to disable it. -For example, this test passes:: +For example, this test passes: - >>> print(list(range(20))) # doctest: +NORMALIZE_WHITESPACE +.. doctest:: + :no-trim-doctest-flags: + + >>> print(list(range(20))) # doctest: +NORMALIZE_WHITESPACE [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19] Without the directive it would fail, both because the actual output doesn't have two blanks before the single-digit list elements, and because the actual output is on a single line. This test also passes, and also requires a directive to do -so:: +so: + +.. doctest:: + :no-trim-doctest-flags: - >>> print(list(range(20))) # doctest: +ELLIPSIS + >>> print(list(range(20))) # doctest: +ELLIPSIS [0, 1, ..., 18, 19] Multiple directives can be used on a single physical line, separated by -commas:: +commas: - >>> print(list(range(20))) # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE +.. doctest:: + :no-trim-doctest-flags: + + >>> print(list(range(20))) # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE [0, 1, ..., 18, 19] If multiple directive comments are used for a single example, then they are -combined:: +combined: + +.. doctest:: + :no-trim-doctest-flags: - >>> print(list(range(20))) # doctest: +ELLIPSIS - ... # doctest: +NORMALIZE_WHITESPACE + >>> print(list(range(20))) # doctest: +ELLIPSIS + ... # doctest: +NORMALIZE_WHITESPACE [0, 1, ..., 18, 19] As the previous example shows, you can add ``...`` lines to your example containing only directives. This can be useful when an example is too long for -a directive to comfortably fit on the same line:: +a directive to comfortably fit on the same line: + +.. doctest:: + :no-trim-doctest-flags: >>> print(list(range(5)) + list(range(10, 20)) + list(range(30, 40))) ... # doctest: +ELLIPSIS @@ -784,18 +799,23 @@ instead. Another is to do :: There are others, but you get the idea. -Another bad idea is to print things that embed an object address, like :: +Another bad idea is to print things that embed an object address, like + +.. doctest:: - >>> id(1.0) # certain to fail some of the time + >>> id(1.0) # certain to fail some of the time # doctest: +SKIP 7948648 >>> class C: pass - >>> C() # the default repr() for instances embeds an address - <__main__.C instance at 0x00AC18F0> + >>> C() # the default repr() for instances embeds an address # doctest: +SKIP + + +The :const:`ELLIPSIS` directive gives a nice approach for the last example: -The :const:`ELLIPSIS` directive gives a nice approach for the last example:: +.. doctest:: + :no-trim-doctest-flags: - >>> C() #doctest: +ELLIPSIS - <__main__.C instance at 0x...> + >>> C() # doctest: +ELLIPSIS + Floating-point numbers are also subject to small output variations across platforms, because Python defers to the platform C library for float formatting, From webhook-mailer at python.org Sun May 8 12:33:17 2022 From: webhook-mailer at python.org (miss-islington) Date: Sun, 08 May 2022 16:33:17 -0000 Subject: [Python-checkins] gh-80856: doc: reveal doctest directives (GH-92318) Message-ID: https://github.com/python/cpython/commit/d6b83a31409640659977ac9b1c0847292765bafe commit: d6b83a31409640659977ac9b1c0847292765bafe branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-08T09:33:11-07:00 summary: gh-80856: doc: reveal doctest directives (GH-92318) * Doc: Reveal doctest directives. * Fix whitespace. Co-authored-by: Julien Palard Co-authored-by: Ezio Melotti (cherry picked from commit 7b024e3a3f77027f747da7580ed0a3ed2dec276a) Co-authored-by: Davide Rizzo files: M Doc/library/doctest.rst diff --git a/Doc/library/doctest.rst b/Doc/library/doctest.rst index 30328790eefe3..be5651d15a0c9 100644 --- a/Doc/library/doctest.rst +++ b/Doc/library/doctest.rst @@ -714,36 +714,51 @@ above. An example's doctest directives modify doctest's behavior for that single example. Use ``+`` to enable the named behavior, or ``-`` to disable it. -For example, this test passes:: +For example, this test passes: - >>> print(list(range(20))) # doctest: +NORMALIZE_WHITESPACE +.. doctest:: + :no-trim-doctest-flags: + + >>> print(list(range(20))) # doctest: +NORMALIZE_WHITESPACE [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19] Without the directive it would fail, both because the actual output doesn't have two blanks before the single-digit list elements, and because the actual output is on a single line. This test also passes, and also requires a directive to do -so:: +so: + +.. doctest:: + :no-trim-doctest-flags: - >>> print(list(range(20))) # doctest: +ELLIPSIS + >>> print(list(range(20))) # doctest: +ELLIPSIS [0, 1, ..., 18, 19] Multiple directives can be used on a single physical line, separated by -commas:: +commas: - >>> print(list(range(20))) # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE +.. doctest:: + :no-trim-doctest-flags: + + >>> print(list(range(20))) # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE [0, 1, ..., 18, 19] If multiple directive comments are used for a single example, then they are -combined:: +combined: + +.. doctest:: + :no-trim-doctest-flags: - >>> print(list(range(20))) # doctest: +ELLIPSIS - ... # doctest: +NORMALIZE_WHITESPACE + >>> print(list(range(20))) # doctest: +ELLIPSIS + ... # doctest: +NORMALIZE_WHITESPACE [0, 1, ..., 18, 19] As the previous example shows, you can add ``...`` lines to your example containing only directives. This can be useful when an example is too long for -a directive to comfortably fit on the same line:: +a directive to comfortably fit on the same line: + +.. doctest:: + :no-trim-doctest-flags: >>> print(list(range(5)) + list(range(10, 20)) + list(range(30, 40))) ... # doctest: +ELLIPSIS @@ -783,18 +798,23 @@ instead. Another is to do :: There are others, but you get the idea. -Another bad idea is to print things that embed an object address, like :: +Another bad idea is to print things that embed an object address, like + +.. doctest:: - >>> id(1.0) # certain to fail some of the time + >>> id(1.0) # certain to fail some of the time # doctest: +SKIP 7948648 >>> class C: pass - >>> C() # the default repr() for instances embeds an address - <__main__.C instance at 0x00AC18F0> + >>> C() # the default repr() for instances embeds an address # doctest: +SKIP + + +The :const:`ELLIPSIS` directive gives a nice approach for the last example: -The :const:`ELLIPSIS` directive gives a nice approach for the last example:: +.. doctest:: + :no-trim-doctest-flags: - >>> C() #doctest: +ELLIPSIS - <__main__.C instance at 0x...> + >>> C() # doctest: +ELLIPSIS + Floating-point numbers are also subject to small output variations across platforms, because Python defers to the platform C library for float formatting, From webhook-mailer at python.org Sun May 8 12:45:12 2022 From: webhook-mailer at python.org (Fidget-Spinner) Date: Sun, 08 May 2022 16:45:12 -0000 Subject: [Python-checkins] Use percentage over factor for 3.11 whatsnew performance (GH-92496) Message-ID: https://github.com/python/cpython/commit/9304f9855852f8cc823534b954206181b933065e commit: 9304f9855852f8cc823534b954206181b933065e branch: main author: Ken Jin committer: Fidget-Spinner date: 2022-05-09T00:44:55+08:00 summary: Use percentage over factor for 3.11 whatsnew performance (GH-92496) files: M Doc/whatsnew/3.11.rst diff --git a/Doc/whatsnew/3.11.rst b/Doc/whatsnew/3.11.rst index ddae025af5b16..793c92aaea416 100644 --- a/Doc/whatsnew/3.11.rst +++ b/Doc/whatsnew/3.11.rst @@ -840,7 +840,7 @@ Optimizations Faster CPython ============== -CPython 3.11 is on average `1.25x faster `_ +CPython 3.11 is on average `25% faster `_ than CPython 3.10 when measured with the `pyperformance `_ benchmark suite, and compiled with GCC on Ubuntu Linux. Depending on your workload, the speedup From webhook-mailer at python.org Sun May 8 12:59:22 2022 From: webhook-mailer at python.org (miss-islington) Date: Sun, 08 May 2022 16:59:22 -0000 Subject: [Python-checkins] Use percentage over factor for 3.11 whatsnew performance (GH-92496) Message-ID: https://github.com/python/cpython/commit/5917e71017af916e4e03953794ec85f0381d8625 commit: 5917e71017af916e4e03953794ec85f0381d8625 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-08T09:59:14-07:00 summary: Use percentage over factor for 3.11 whatsnew performance (GH-92496) (cherry picked from commit 9304f9855852f8cc823534b954206181b933065e) Co-authored-by: Ken Jin files: M Doc/whatsnew/3.11.rst diff --git a/Doc/whatsnew/3.11.rst b/Doc/whatsnew/3.11.rst index ddae025af5b16..793c92aaea416 100644 --- a/Doc/whatsnew/3.11.rst +++ b/Doc/whatsnew/3.11.rst @@ -840,7 +840,7 @@ Optimizations Faster CPython ============== -CPython 3.11 is on average `1.25x faster `_ +CPython 3.11 is on average `25% faster `_ than CPython 3.10 when measured with the `pyperformance `_ benchmark suite, and compiled with GCC on Ubuntu Linux. Depending on your workload, the speedup From webhook-mailer at python.org Sun May 8 13:12:55 2022 From: webhook-mailer at python.org (gpshead) Date: Sun, 08 May 2022 17:12:55 -0000 Subject: [Python-checkins] [3.10] gh-90622: Do not spawn ProcessPool workers on demand via fork method. (GH-91598) (#92497) Message-ID: https://github.com/python/cpython/commit/b795376a628ae7cc354addbb926d724ebe364fec commit: b795376a628ae7cc354addbb926d724ebe364fec branch: 3.10 author: Gregory P. Smith committer: gpshead date: 2022-05-08T10:12:46-07:00 summary: [3.10] gh-90622: Do not spawn ProcessPool workers on demand via fork method. (GH-91598) (#92497) Do not spawn ProcessPool workers on demand when they spawn via fork. This avoids potential deadlocks in the child processes due to forking from a multithreaded process.. (cherry picked from commit ebb37fc3fdcb03db4e206db017eeef7aaffbae84) Co-authored-by: Gregory P. Smith files: A Misc/NEWS.d/next/Library/2022-04-15-22-07-36.gh-issue-90622.0C6l8h.rst M Lib/concurrent/futures/process.py M Lib/test/test_concurrent_futures.py diff --git a/Lib/concurrent/futures/process.py b/Lib/concurrent/futures/process.py index c03187de85a91..57941e485d81c 100644 --- a/Lib/concurrent/futures/process.py +++ b/Lib/concurrent/futures/process.py @@ -615,6 +615,10 @@ def __init__(self, max_workers=None, mp_context=None, mp_context = mp.get_context() self._mp_context = mp_context + # https://github.com/python/cpython/issues/90622 + self._safe_to_dynamically_spawn_children = ( + self._mp_context.get_start_method(allow_none=False) != "fork") + if initializer is not None and not callable(initializer): raise TypeError("initializer must be a callable") self._initializer = initializer @@ -665,6 +669,8 @@ def __init__(self, max_workers=None, mp_context=None, def _start_executor_manager_thread(self): if self._executor_manager_thread is None: # Start the processes so that their sentinels are known. + if not self._safe_to_dynamically_spawn_children: # ie, using fork. + self._launch_processes() self._executor_manager_thread = _ExecutorManagerThread(self) self._executor_manager_thread.start() _threads_wakeups[self._executor_manager_thread] = \ @@ -677,14 +683,31 @@ def _adjust_process_count(self): process_count = len(self._processes) if process_count < self._max_workers: - p = self._mp_context.Process( - target=_process_worker, - args=(self._call_queue, - self._result_queue, - self._initializer, - self._initargs)) - p.start() - self._processes[p.pid] = p + # Assertion disabled as this codepath is also used to replace a + # worker that unexpectedly dies, even when using the 'fork' start + # method. That means there is still a potential deadlock bug. If a + # 'fork' mp_context worker dies, we'll be forking a new one when + # we know a thread is running (self._executor_manager_thread). + #assert self._safe_to_dynamically_spawn_children or not self._executor_manager_thread, 'https://github.com/python/cpython/issues/90622' + self._spawn_process() + + def _launch_processes(self): + # https://github.com/python/cpython/issues/90622 + assert not self._executor_manager_thread, ( + 'Processes cannot be fork()ed after the thread has started, ' + 'deadlock in the child processes could result.') + for _ in range(len(self._processes), self._max_workers): + self._spawn_process() + + def _spawn_process(self): + p = self._mp_context.Process( + target=_process_worker, + args=(self._call_queue, + self._result_queue, + self._initializer, + self._initargs)) + p.start() + self._processes[p.pid] = p def submit(self, fn, /, *args, **kwargs): with self._shutdown_lock: @@ -705,7 +728,8 @@ def submit(self, fn, /, *args, **kwargs): # Wake up queue management thread self._executor_manager_thread_wakeup.wakeup() - self._adjust_process_count() + if self._safe_to_dynamically_spawn_children: + self._adjust_process_count() self._start_executor_manager_thread() return f submit.__doc__ = _base.Executor.submit.__doc__ diff --git a/Lib/test/test_concurrent_futures.py b/Lib/test/test_concurrent_futures.py index d3d912892cc2d..d8e091979aee3 100644 --- a/Lib/test/test_concurrent_futures.py +++ b/Lib/test/test_concurrent_futures.py @@ -498,10 +498,16 @@ def acquire_lock(lock): lock.acquire() mp_context = self.get_context() + if mp_context.get_start_method(allow_none=False) == "fork": + # fork pre-spawns, not on demand. + expected_num_processes = self.worker_count + else: + expected_num_processes = 3 + sem = mp_context.Semaphore(0) for _ in range(3): self.executor.submit(acquire_lock, sem) - self.assertEqual(len(self.executor._processes), 3) + self.assertEqual(len(self.executor._processes), expected_num_processes) for _ in range(3): sem.release() processes = self.executor._processes @@ -1022,6 +1028,8 @@ def test_saturation(self): def test_idle_process_reuse_one(self): executor = self.executor assert executor._max_workers >= 4 + if self.get_context().get_start_method(allow_none=False) == "fork": + raise unittest.SkipTest("Incompatible with the fork start method.") executor.submit(mul, 21, 2).result() executor.submit(mul, 6, 7).result() executor.submit(mul, 3, 14).result() @@ -1030,6 +1038,8 @@ def test_idle_process_reuse_one(self): def test_idle_process_reuse_multiple(self): executor = self.executor assert executor._max_workers <= 5 + if self.get_context().get_start_method(allow_none=False) == "fork": + raise unittest.SkipTest("Incompatible with the fork start method.") executor.submit(mul, 12, 7).result() executor.submit(mul, 33, 25) executor.submit(mul, 25, 26).result() diff --git a/Misc/NEWS.d/next/Library/2022-04-15-22-07-36.gh-issue-90622.0C6l8h.rst b/Misc/NEWS.d/next/Library/2022-04-15-22-07-36.gh-issue-90622.0C6l8h.rst new file mode 100644 index 0000000000000..5db0a1bbe721d --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-04-15-22-07-36.gh-issue-90622.0C6l8h.rst @@ -0,0 +1,4 @@ +Worker processes for :class:`concurrent.futures.ProcessPoolExecutor` are no +longer spawned on demand (a feature added in 3.9) when the multiprocessing +context start method is ``"fork"`` as that can lead to deadlocks in the +child processes due to a fork happening while threads are running. From webhook-mailer at python.org Sun May 8 13:14:18 2022 From: webhook-mailer at python.org (gpshead) Date: Sun, 08 May 2022 17:14:18 -0000 Subject: [Python-checkins] gh-90622: Do not spawn ProcessPool workers on demand via fork method. (GH-91598) (#92495) Message-ID: https://github.com/python/cpython/commit/4270b7927de2260f5f1442bb90f788e9ad25ce9c commit: 4270b7927de2260f5f1442bb90f788e9ad25ce9c branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: gpshead date: 2022-05-08T10:14:14-07:00 summary: gh-90622: Do not spawn ProcessPool workers on demand via fork method. (GH-91598) (#92495) Do not spawn ProcessPool workers on demand when they spawn via fork. This avoids potential deadlocks in the child processes due to forking from a multithreaded process. (cherry picked from commit ebb37fc3fdcb03db4e206db017eeef7aaffbae84) Co-authored-by: Gregory P. Smith files: A Misc/NEWS.d/next/Library/2022-04-15-22-07-36.gh-issue-90622.0C6l8h.rst M Lib/concurrent/futures/process.py M Lib/test/test_concurrent_futures.py diff --git a/Lib/concurrent/futures/process.py b/Lib/concurrent/futures/process.py index 821034da21adc..7e2f5fa30e826 100644 --- a/Lib/concurrent/futures/process.py +++ b/Lib/concurrent/futures/process.py @@ -652,6 +652,10 @@ def __init__(self, max_workers=None, mp_context=None, mp_context = mp.get_context() self._mp_context = mp_context + # https://github.com/python/cpython/issues/90622 + self._safe_to_dynamically_spawn_children = ( + self._mp_context.get_start_method(allow_none=False) != "fork") + if initializer is not None and not callable(initializer): raise TypeError("initializer must be a callable") self._initializer = initializer @@ -714,6 +718,8 @@ def __init__(self, max_workers=None, mp_context=None, def _start_executor_manager_thread(self): if self._executor_manager_thread is None: # Start the processes so that their sentinels are known. + if not self._safe_to_dynamically_spawn_children: # ie, using fork. + self._launch_processes() self._executor_manager_thread = _ExecutorManagerThread(self) self._executor_manager_thread.start() _threads_wakeups[self._executor_manager_thread] = \ @@ -726,15 +732,32 @@ def _adjust_process_count(self): process_count = len(self._processes) if process_count < self._max_workers: - p = self._mp_context.Process( - target=_process_worker, - args=(self._call_queue, - self._result_queue, - self._initializer, - self._initargs, - self._max_tasks_per_child)) - p.start() - self._processes[p.pid] = p + # Assertion disabled as this codepath is also used to replace a + # worker that unexpectedly dies, even when using the 'fork' start + # method. That means there is still a potential deadlock bug. If a + # 'fork' mp_context worker dies, we'll be forking a new one when + # we know a thread is running (self._executor_manager_thread). + #assert self._safe_to_dynamically_spawn_children or not self._executor_manager_thread, 'https://github.com/python/cpython/issues/90622' + self._spawn_process() + + def _launch_processes(self): + # https://github.com/python/cpython/issues/90622 + assert not self._executor_manager_thread, ( + 'Processes cannot be fork()ed after the thread has started, ' + 'deadlock in the child processes could result.') + for _ in range(len(self._processes), self._max_workers): + self._spawn_process() + + def _spawn_process(self): + p = self._mp_context.Process( + target=_process_worker, + args=(self._call_queue, + self._result_queue, + self._initializer, + self._initargs, + self._max_tasks_per_child)) + p.start() + self._processes[p.pid] = p def submit(self, fn, /, *args, **kwargs): with self._shutdown_lock: @@ -755,7 +778,8 @@ def submit(self, fn, /, *args, **kwargs): # Wake up queue management thread self._executor_manager_thread_wakeup.wakeup() - self._adjust_process_count() + if self._safe_to_dynamically_spawn_children: + self._adjust_process_count() self._start_executor_manager_thread() return f submit.__doc__ = _base.Executor.submit.__doc__ diff --git a/Lib/test/test_concurrent_futures.py b/Lib/test/test_concurrent_futures.py index 4363e90b8bbab..6f3b4609232bb 100644 --- a/Lib/test/test_concurrent_futures.py +++ b/Lib/test/test_concurrent_futures.py @@ -497,10 +497,16 @@ def acquire_lock(lock): lock.acquire() mp_context = self.get_context() + if mp_context.get_start_method(allow_none=False) == "fork": + # fork pre-spawns, not on demand. + expected_num_processes = self.worker_count + else: + expected_num_processes = 3 + sem = mp_context.Semaphore(0) for _ in range(3): self.executor.submit(acquire_lock, sem) - self.assertEqual(len(self.executor._processes), 3) + self.assertEqual(len(self.executor._processes), expected_num_processes) for _ in range(3): sem.release() processes = self.executor._processes @@ -1021,6 +1027,8 @@ def test_saturation(self): def test_idle_process_reuse_one(self): executor = self.executor assert executor._max_workers >= 4 + if self.get_context().get_start_method(allow_none=False) == "fork": + raise unittest.SkipTest("Incompatible with the fork start method.") executor.submit(mul, 21, 2).result() executor.submit(mul, 6, 7).result() executor.submit(mul, 3, 14).result() @@ -1029,6 +1037,8 @@ def test_idle_process_reuse_one(self): def test_idle_process_reuse_multiple(self): executor = self.executor assert executor._max_workers <= 5 + if self.get_context().get_start_method(allow_none=False) == "fork": + raise unittest.SkipTest("Incompatible with the fork start method.") executor.submit(mul, 12, 7).result() executor.submit(mul, 33, 25) executor.submit(mul, 25, 26).result() diff --git a/Misc/NEWS.d/next/Library/2022-04-15-22-07-36.gh-issue-90622.0C6l8h.rst b/Misc/NEWS.d/next/Library/2022-04-15-22-07-36.gh-issue-90622.0C6l8h.rst new file mode 100644 index 0000000000000..5db0a1bbe721d --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-04-15-22-07-36.gh-issue-90622.0C6l8h.rst @@ -0,0 +1,4 @@ +Worker processes for :class:`concurrent.futures.ProcessPoolExecutor` are no +longer spawned on demand (a feature added in 3.9) when the multiprocessing +context start method is ``"fork"`` as that can lead to deadlocks in the +child processes due to a fork happening while threads are running. From webhook-mailer at python.org Sun May 8 13:33:24 2022 From: webhook-mailer at python.org (ezio-melotti) Date: Sun, 08 May 2022 17:33:24 -0000 Subject: [Python-checkins] Fix use of the default role in a news entry. (#92500) Message-ID: https://github.com/python/cpython/commit/8883172893b6c3bb553cd22fc351e0206dec8388 commit: 8883172893b6c3bb553cd22fc351e0206dec8388 branch: 3.10 author: Ezio Melotti committer: ezio-melotti date: 2022-05-08T19:32:54+02:00 summary: Fix use of the default role in a news entry. (#92500) files: M Misc/NEWS.d/next/Documentation/2022-04-24-22-09-31.gh-issue-91888.kTjJLx.rst diff --git a/Misc/NEWS.d/next/Documentation/2022-04-24-22-09-31.gh-issue-91888.kTjJLx.rst b/Misc/NEWS.d/next/Documentation/2022-04-24-22-09-31.gh-issue-91888.kTjJLx.rst index 9194be9dbf92d..4ebca42a7fec5 100644 --- a/Misc/NEWS.d/next/Documentation/2022-04-24-22-09-31.gh-issue-91888.kTjJLx.rst +++ b/Misc/NEWS.d/next/Documentation/2022-04-24-22-09-31.gh-issue-91888.kTjJLx.rst @@ -1 +1 @@ -Add a new `gh` role to the documentation to link to GitHub issues. +Add a new ``gh`` role to the documentation to link to GitHub issues. From webhook-mailer at python.org Sun May 8 13:56:01 2022 From: webhook-mailer at python.org (miss-islington) Date: Sun, 08 May 2022 17:56:01 -0000 Subject: [Python-checkins] Fix use of the default role in a news entry. (GH-92500) Message-ID: https://github.com/python/cpython/commit/08907ad687638a7518fd15243f8cba592e94370c commit: 08907ad687638a7518fd15243f8cba592e94370c branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-08T10:55:44-07:00 summary: Fix use of the default role in a news entry. (GH-92500) (cherry picked from commit 8883172893b6c3bb553cd22fc351e0206dec8388) Co-authored-by: Ezio Melotti files: M Misc/NEWS.d/next/Documentation/2022-04-24-22-09-31.gh-issue-91888.kTjJLx.rst diff --git a/Misc/NEWS.d/next/Documentation/2022-04-24-22-09-31.gh-issue-91888.kTjJLx.rst b/Misc/NEWS.d/next/Documentation/2022-04-24-22-09-31.gh-issue-91888.kTjJLx.rst index 9194be9dbf92d..4ebca42a7fec5 100644 --- a/Misc/NEWS.d/next/Documentation/2022-04-24-22-09-31.gh-issue-91888.kTjJLx.rst +++ b/Misc/NEWS.d/next/Documentation/2022-04-24-22-09-31.gh-issue-91888.kTjJLx.rst @@ -1 +1 @@ -Add a new `gh` role to the documentation to link to GitHub issues. +Add a new ``gh`` role to the documentation to link to GitHub issues. From webhook-mailer at python.org Sun May 8 14:22:46 2022 From: webhook-mailer at python.org (gpshead) Date: Sun, 08 May 2022 18:22:46 -0000 Subject: [Python-checkins] [3.10] gh-90622: Do not spawn ProcessPool workers on demand via fork method. (GH-91598) (GH-92497) (#92499) Message-ID: https://github.com/python/cpython/commit/8e523c1151a4a6a1a239238dfd0cdae51e815dfe commit: 8e523c1151a4a6a1a239238dfd0cdae51e815dfe branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: gpshead date: 2022-05-08T11:22:36-07:00 summary: [3.10] gh-90622: Do not spawn ProcessPool workers on demand via fork method. (GH-91598) (GH-92497) (#92499) Do not spawn ProcessPool workers on demand when they spawn via fork. This avoids potential deadlocks in the child processes due to forking from a multithreaded process.. (cherry picked from commit ebb37fc3fdcb03db4e206db017eeef7aaffbae84) Co-authored-by: Gregory P. Smith (cherry picked from commit b795376a628ae7cc354addbb926d724ebe364fec) Co-authored-by: Gregory P. Smith Co-authored-by: Gregory P. Smith files: A Misc/NEWS.d/next/Library/2022-04-15-22-07-36.gh-issue-90622.0C6l8h.rst M Lib/concurrent/futures/process.py M Lib/test/test_concurrent_futures.py diff --git a/Lib/concurrent/futures/process.py b/Lib/concurrent/futures/process.py index e574299eb033b..f223b86d1fc8d 100644 --- a/Lib/concurrent/futures/process.py +++ b/Lib/concurrent/futures/process.py @@ -607,6 +607,10 @@ def __init__(self, max_workers=None, mp_context=None, mp_context = mp.get_context() self._mp_context = mp_context + # https://github.com/python/cpython/issues/90622 + self._safe_to_dynamically_spawn_children = ( + self._mp_context.get_start_method(allow_none=False) != "fork") + if initializer is not None and not callable(initializer): raise TypeError("initializer must be a callable") self._initializer = initializer @@ -657,6 +661,8 @@ def __init__(self, max_workers=None, mp_context=None, def _start_executor_manager_thread(self): if self._executor_manager_thread is None: # Start the processes so that their sentinels are known. + if not self._safe_to_dynamically_spawn_children: # ie, using fork. + self._launch_processes() self._executor_manager_thread = _ExecutorManagerThread(self) self._executor_manager_thread.start() _threads_wakeups[self._executor_manager_thread] = \ @@ -669,14 +675,31 @@ def _adjust_process_count(self): process_count = len(self._processes) if process_count < self._max_workers: - p = self._mp_context.Process( - target=_process_worker, - args=(self._call_queue, - self._result_queue, - self._initializer, - self._initargs)) - p.start() - self._processes[p.pid] = p + # Assertion disabled as this codepath is also used to replace a + # worker that unexpectedly dies, even when using the 'fork' start + # method. That means there is still a potential deadlock bug. If a + # 'fork' mp_context worker dies, we'll be forking a new one when + # we know a thread is running (self._executor_manager_thread). + #assert self._safe_to_dynamically_spawn_children or not self._executor_manager_thread, 'https://github.com/python/cpython/issues/90622' + self._spawn_process() + + def _launch_processes(self): + # https://github.com/python/cpython/issues/90622 + assert not self._executor_manager_thread, ( + 'Processes cannot be fork()ed after the thread has started, ' + 'deadlock in the child processes could result.') + for _ in range(len(self._processes), self._max_workers): + self._spawn_process() + + def _spawn_process(self): + p = self._mp_context.Process( + target=_process_worker, + args=(self._call_queue, + self._result_queue, + self._initializer, + self._initargs)) + p.start() + self._processes[p.pid] = p def submit(self, fn, /, *args, **kwargs): with self._shutdown_lock: @@ -697,7 +720,8 @@ def submit(self, fn, /, *args, **kwargs): # Wake up queue management thread self._executor_manager_thread_wakeup.wakeup() - self._adjust_process_count() + if self._safe_to_dynamically_spawn_children: + self._adjust_process_count() self._start_executor_manager_thread() return f submit.__doc__ = _base.Executor.submit.__doc__ diff --git a/Lib/test/test_concurrent_futures.py b/Lib/test/test_concurrent_futures.py index 81bc0e14261c3..2d27a294b16f9 100644 --- a/Lib/test/test_concurrent_futures.py +++ b/Lib/test/test_concurrent_futures.py @@ -483,10 +483,16 @@ def acquire_lock(lock): lock.acquire() mp_context = self.get_context() + if mp_context.get_start_method(allow_none=False) == "fork": + # fork pre-spawns, not on demand. + expected_num_processes = self.worker_count + else: + expected_num_processes = 3 + sem = mp_context.Semaphore(0) for _ in range(3): self.executor.submit(acquire_lock, sem) - self.assertEqual(len(self.executor._processes), 3) + self.assertEqual(len(self.executor._processes), expected_num_processes) for _ in range(3): sem.release() processes = self.executor._processes @@ -1007,6 +1013,8 @@ def test_saturation(self): def test_idle_process_reuse_one(self): executor = self.executor assert executor._max_workers >= 4 + if self.get_context().get_start_method(allow_none=False) == "fork": + raise unittest.SkipTest("Incompatible with the fork start method.") executor.submit(mul, 21, 2).result() executor.submit(mul, 6, 7).result() executor.submit(mul, 3, 14).result() @@ -1015,6 +1023,8 @@ def test_idle_process_reuse_one(self): def test_idle_process_reuse_multiple(self): executor = self.executor assert executor._max_workers <= 5 + if self.get_context().get_start_method(allow_none=False) == "fork": + raise unittest.SkipTest("Incompatible with the fork start method.") executor.submit(mul, 12, 7).result() executor.submit(mul, 33, 25) executor.submit(mul, 25, 26).result() diff --git a/Misc/NEWS.d/next/Library/2022-04-15-22-07-36.gh-issue-90622.0C6l8h.rst b/Misc/NEWS.d/next/Library/2022-04-15-22-07-36.gh-issue-90622.0C6l8h.rst new file mode 100644 index 0000000000000..5db0a1bbe721d --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-04-15-22-07-36.gh-issue-90622.0C6l8h.rst @@ -0,0 +1,4 @@ +Worker processes for :class:`concurrent.futures.ProcessPoolExecutor` are no +longer spawned on demand (a feature added in 3.9) when the multiprocessing +context start method is ``"fork"`` as that can lead to deadlocks in the +child processes due to a fork happening while threads are running. From webhook-mailer at python.org Sun May 8 15:30:54 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Sun, 08 May 2022 19:30:54 -0000 Subject: [Python-checkins] gh-77521: Add link to builtin module names in modules tutorial (#92438) Message-ID: https://github.com/python/cpython/commit/859250cc55711f4d62b65922d3f7537826c3801e commit: 859250cc55711f4d62b65922d3f7537826c3801e branch: main author: slateny <46876382+slateny at users.noreply.github.com> committer: JelleZijlstra date: 2022-05-08T12:30:38-07:00 summary: gh-77521: Add link to builtin module names in modules tutorial (#92438) Co-authored-by: Jelle Zijlstra files: M Doc/tutorial/modules.rst diff --git a/Doc/tutorial/modules.rst b/Doc/tutorial/modules.rst index 524d3c32417b9..d6f2464ae0829 100644 --- a/Doc/tutorial/modules.rst +++ b/Doc/tutorial/modules.rst @@ -183,7 +183,8 @@ The Module Search Path .. index:: triple: module; search; path When a module named :mod:`spam` is imported, the interpreter first searches for -a built-in module with that name. If not found, it then searches for a file +a built-in module with that name. These module names are listed in +:data:`sys.builtin_module_names`. If not found, it then searches for a file named :file:`spam.py` in a list of directories given by the variable :data:`sys.path`. :data:`sys.path` is initialized from these locations: From webhook-mailer at python.org Sun May 8 15:45:18 2022 From: webhook-mailer at python.org (miss-islington) Date: Sun, 08 May 2022 19:45:18 -0000 Subject: [Python-checkins] gh-77521: Add link to builtin module names in modules tutorial (GH-92438) Message-ID: https://github.com/python/cpython/commit/b6da20fffa6dc6b9a2700937f4d67a982194fc1e commit: b6da20fffa6dc6b9a2700937f4d67a982194fc1e branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-08T12:45:14-07:00 summary: gh-77521: Add link to builtin module names in modules tutorial (GH-92438) Co-authored-by: Jelle Zijlstra (cherry picked from commit 859250cc55711f4d62b65922d3f7537826c3801e) Co-authored-by: slateny <46876382+slateny at users.noreply.github.com> files: M Doc/tutorial/modules.rst diff --git a/Doc/tutorial/modules.rst b/Doc/tutorial/modules.rst index 524d3c32417b9..d6f2464ae0829 100644 --- a/Doc/tutorial/modules.rst +++ b/Doc/tutorial/modules.rst @@ -183,7 +183,8 @@ The Module Search Path .. index:: triple: module; search; path When a module named :mod:`spam` is imported, the interpreter first searches for -a built-in module with that name. If not found, it then searches for a file +a built-in module with that name. These module names are listed in +:data:`sys.builtin_module_names`. If not found, it then searches for a file named :file:`spam.py` in a list of directories given by the variable :data:`sys.path`. :data:`sys.path` is initialized from these locations: From webhook-mailer at python.org Sun May 8 15:46:22 2022 From: webhook-mailer at python.org (miss-islington) Date: Sun, 08 May 2022 19:46:22 -0000 Subject: [Python-checkins] gh-77521: Add link to builtin module names in modules tutorial (GH-92438) Message-ID: https://github.com/python/cpython/commit/ca425ac11a152c51f84d3eba0e133f21eb67f07e commit: ca425ac11a152c51f84d3eba0e133f21eb67f07e branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-08T12:46:18-07:00 summary: gh-77521: Add link to builtin module names in modules tutorial (GH-92438) Co-authored-by: Jelle Zijlstra (cherry picked from commit 859250cc55711f4d62b65922d3f7537826c3801e) Co-authored-by: slateny <46876382+slateny at users.noreply.github.com> files: M Doc/tutorial/modules.rst diff --git a/Doc/tutorial/modules.rst b/Doc/tutorial/modules.rst index 47c1f1877d696..83d7a4b277b8a 100644 --- a/Doc/tutorial/modules.rst +++ b/Doc/tutorial/modules.rst @@ -183,7 +183,8 @@ The Module Search Path .. index:: triple: module; search; path When a module named :mod:`spam` is imported, the interpreter first searches for -a built-in module with that name. If not found, it then searches for a file +a built-in module with that name. These module names are listed in +:data:`sys.builtin_module_names`. If not found, it then searches for a file named :file:`spam.py` in a list of directories given by the variable :data:`sys.path`. :data:`sys.path` is initialized from these locations: From webhook-mailer at python.org Sun May 8 15:50:33 2022 From: webhook-mailer at python.org (miss-islington) Date: Sun, 08 May 2022 19:50:33 -0000 Subject: [Python-checkins] gh-77521: Add link to builtin module names in modules tutorial (GH-92438) Message-ID: https://github.com/python/cpython/commit/0dd32b52c77beb40a0befb76da94e95f90260e45 commit: 0dd32b52c77beb40a0befb76da94e95f90260e45 branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-08T12:50:28-07:00 summary: gh-77521: Add link to builtin module names in modules tutorial (GH-92438) Co-authored-by: Jelle Zijlstra (cherry picked from commit 859250cc55711f4d62b65922d3f7537826c3801e) Co-authored-by: slateny <46876382+slateny at users.noreply.github.com> files: M Doc/tutorial/modules.rst diff --git a/Doc/tutorial/modules.rst b/Doc/tutorial/modules.rst index afce7f81d226f..c5cca91791796 100644 --- a/Doc/tutorial/modules.rst +++ b/Doc/tutorial/modules.rst @@ -183,7 +183,8 @@ The Module Search Path .. index:: triple: module; search; path When a module named :mod:`spam` is imported, the interpreter first searches for -a built-in module with that name. If not found, it then searches for a file +a built-in module with that name. These module names are listed in +:data:`sys.builtin_module_names`. If not found, it then searches for a file named :file:`spam.py` in a list of directories given by the variable :data:`sys.path`. :data:`sys.path` is initialized from these locations: From webhook-mailer at python.org Sun May 8 19:19:50 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Sun, 08 May 2022 23:19:50 -0000 Subject: [Python-checkins] gh-91968: Add socket constants SO_USER_COOKIE/SO_RTABLE from BSD (#91967) Message-ID: https://github.com/python/cpython/commit/9d85aba9e245c1a0f6d1879f8bc6c260cb4eb721 commit: 9d85aba9e245c1a0f6d1879f8bc6c260cb4eb721 branch: main author: David CARLIER committer: JelleZijlstra date: 2022-05-08T16:19:41-07:00 summary: gh-91968: Add socket constants SO_USER_COOKIE/SO_RTABLE from BSD (#91967) Those are somewhat equivalent to Linux' SO_MARK. Co-authored-by: Jelle Zijlstra files: A Misc/NEWS.d/next/Library/2022-04-26-18-37-24.gh-issue-91968.fuuH1_.rst M Doc/library/socket.rst M Modules/socketmodule.c diff --git a/Doc/library/socket.rst b/Doc/library/socket.rst index ee1aee5278b3b..4c193b892bda8 100755 --- a/Doc/library/socket.rst +++ b/Doc/library/socket.rst @@ -392,6 +392,11 @@ Constants Added ``TCP_CONNECTION_INFO``. On MacOS this constant can be used in the same way that ``TCP_INFO`` is used on Linux and BSD. + .. versionchanged:: 3.12 + Added ``SO_RTABLE`` and ``SO_USER_COOKIE``. On OpenBSD + and FreeBSD respectively those constants can be used in the same way that + ``SO_MARK`` is used on Linux. + .. data:: AF_CAN PF_CAN SOL_CAN_* diff --git a/Misc/NEWS.d/next/Library/2022-04-26-18-37-24.gh-issue-91968.fuuH1_.rst b/Misc/NEWS.d/next/Library/2022-04-26-18-37-24.gh-issue-91968.fuuH1_.rst new file mode 100644 index 0000000000000..f16f5d3a668bd --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-04-26-18-37-24.gh-issue-91968.fuuH1_.rst @@ -0,0 +1 @@ +Add ``SO_RTABLE`` and ``SO_USER_COOKIE`` constants to :mod:`socket`. diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index 9aefa443c7c69..f376513fead1b 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -7595,6 +7595,12 @@ PyInit__socket(void) #ifdef SO_MARK PyModule_AddIntMacro(m, SO_MARK); #endif +#ifdef SO_USER_COOKIE + PyModule_AddIntMacro(m, SO_USER_COOKIE); +#endif +#ifdef SO_RTABLE + PyModule_AddIntMacro(m, SO_RTABLE); +#endif #ifdef SO_DOMAIN PyModule_AddIntMacro(m, SO_DOMAIN); #endif From webhook-mailer at python.org Sun May 8 19:20:49 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Sun, 08 May 2022 23:20:49 -0000 Subject: [Python-checkins] pdb docs: workaround for double semicolon in strings (#17011) Message-ID: https://github.com/python/cpython/commit/2888b1107fd0b43cc800987a00155bdbeacdb23a commit: 2888b1107fd0b43cc800987a00155bdbeacdb23a branch: main author: Godefroid Chapelle committer: JelleZijlstra date: 2022-05-08T16:20:42-07:00 summary: pdb docs: workaround for double semicolon in strings (#17011) see https://github.com/gotcha/ipdb/issues/172 Co-authored-by: Jelle Zijlstra files: M Doc/library/pdb.rst diff --git a/Doc/library/pdb.rst b/Doc/library/pdb.rst index ca59576336bf8..383c3adcf289d 100644 --- a/Doc/library/pdb.rst +++ b/Doc/library/pdb.rst @@ -233,7 +233,8 @@ Multiple commands may be entered on a single line, separated by ``;;``. (A single ``;`` is not used as it is the separator for multiple commands in a line that is passed to the Python parser.) No intelligence is applied to separating the commands; the input is split at the first ``;;`` pair, even if it is in the -middle of a quoted string. +middle of a quoted string. A workaround for strings with double semicolons +is to use implicit string concatenation ``';'';'`` or ``";"";"``. .. index:: pair: .pdbrc; file From webhook-mailer at python.org Sun May 8 19:21:23 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Sun, 08 May 2022 23:21:23 -0000 Subject: [Python-checkins] bpo-39229: fix formatting in library/functions.rst (#17857) Message-ID: https://github.com/python/cpython/commit/f298ba1f2712ad10530a30bb225548a6889820b5 commit: f298ba1f2712ad10530a30bb225548a6889820b5 branch: main author: Rafael Fontenelle committer: JelleZijlstra date: 2022-05-08T16:21:19-07:00 summary: bpo-39229: fix formatting in library/functions.rst (#17857) Missing reference of auditing event presents error when building translated documentation files: M Doc/library/functions.rst diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst index 83d54da72256a..92b2c3bb53944 100644 --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -859,8 +859,8 @@ are always available. They are listed here in alphabetical order. .. audit-event:: builtins.input/result result input - Raises an auditing event ``builtins.input/result`` with the result after - successfully reading input. + Raises an :ref:`auditing event ` ``builtins.input/result`` + with the result after successfully reading input. .. class:: int([x]) From webhook-mailer at python.org Sun May 8 19:36:45 2022 From: webhook-mailer at python.org (miss-islington) Date: Sun, 08 May 2022 23:36:45 -0000 Subject: [Python-checkins] pdb docs: workaround for double semicolon in strings (GH-17011) Message-ID: https://github.com/python/cpython/commit/cffa76d476b6e6abbbc1b8bba1bd46ede317296f commit: cffa76d476b6e6abbbc1b8bba1bd46ede317296f branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-08T16:36:37-07:00 summary: pdb docs: workaround for double semicolon in strings (GH-17011) see https://github.com/gotcha/ipdb/issues/172 Co-authored-by: Jelle Zijlstra (cherry picked from commit 2888b1107fd0b43cc800987a00155bdbeacdb23a) Co-authored-by: Godefroid Chapelle files: M Doc/library/pdb.rst diff --git a/Doc/library/pdb.rst b/Doc/library/pdb.rst index ca59576336bf8..383c3adcf289d 100644 --- a/Doc/library/pdb.rst +++ b/Doc/library/pdb.rst @@ -233,7 +233,8 @@ Multiple commands may be entered on a single line, separated by ``;;``. (A single ``;`` is not used as it is the separator for multiple commands in a line that is passed to the Python parser.) No intelligence is applied to separating the commands; the input is split at the first ``;;`` pair, even if it is in the -middle of a quoted string. +middle of a quoted string. A workaround for strings with double semicolons +is to use implicit string concatenation ``';'';'`` or ``";"";"``. .. index:: pair: .pdbrc; file From webhook-mailer at python.org Sun May 8 19:39:00 2022 From: webhook-mailer at python.org (miss-islington) Date: Sun, 08 May 2022 23:39:00 -0000 Subject: [Python-checkins] pdb docs: workaround for double semicolon in strings (GH-17011) Message-ID: https://github.com/python/cpython/commit/6679fdf4f0dbfb35d10c26343900ece18fef2856 commit: 6679fdf4f0dbfb35d10c26343900ece18fef2856 branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-08T16:38:47-07:00 summary: pdb docs: workaround for double semicolon in strings (GH-17011) see https://github.com/gotcha/ipdb/issues/172 Co-authored-by: Jelle Zijlstra (cherry picked from commit 2888b1107fd0b43cc800987a00155bdbeacdb23a) Co-authored-by: Godefroid Chapelle files: M Doc/library/pdb.rst diff --git a/Doc/library/pdb.rst b/Doc/library/pdb.rst index 13e1a1993692d..dcd509de56adc 100644 --- a/Doc/library/pdb.rst +++ b/Doc/library/pdb.rst @@ -233,7 +233,8 @@ Multiple commands may be entered on a single line, separated by ``;;``. (A single ``;`` is not used as it is the separator for multiple commands in a line that is passed to the Python parser.) No intelligence is applied to separating the commands; the input is split at the first ``;;`` pair, even if it is in the -middle of a quoted string. +middle of a quoted string. A workaround for strings with double semicolons +is to use implicit string concatenation ``';'';'`` or ``";"";"``. .. index:: pair: .pdbrc; file From webhook-mailer at python.org Sun May 8 19:39:20 2022 From: webhook-mailer at python.org (miss-islington) Date: Sun, 08 May 2022 23:39:20 -0000 Subject: [Python-checkins] bpo-39229: fix formatting in library/functions.rst (GH-17857) Message-ID: https://github.com/python/cpython/commit/158579654ded615f0f9fa13d674b06473f7b1620 commit: 158579654ded615f0f9fa13d674b06473f7b1620 branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-08T16:39:09-07:00 summary: bpo-39229: fix formatting in library/functions.rst (GH-17857) Missing reference of auditing event presents error when building translated documentation (cherry picked from commit f298ba1f2712ad10530a30bb225548a6889820b5) Co-authored-by: Rafael Fontenelle files: M Doc/library/functions.rst diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst index ff81558da14cf..85e7d12ceb91f 100644 --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -846,8 +846,8 @@ are always available. They are listed here in alphabetical order. .. audit-event:: builtins.input/result result input - Raises an auditing event ``builtins.input/result`` with the result after - successfully reading input. + Raises an :ref:`auditing event ` ``builtins.input/result`` + with the result after successfully reading input. .. class:: int([x]) From webhook-mailer at python.org Sun May 8 19:44:37 2022 From: webhook-mailer at python.org (miss-islington) Date: Sun, 08 May 2022 23:44:37 -0000 Subject: [Python-checkins] pdb docs: workaround for double semicolon in strings (GH-17011) Message-ID: https://github.com/python/cpython/commit/bf5fc2adb7c6896cd6da59ce823098e611b16f90 commit: bf5fc2adb7c6896cd6da59ce823098e611b16f90 branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-08T16:44:33-07:00 summary: pdb docs: workaround for double semicolon in strings (GH-17011) see https://github.com/gotcha/ipdb/issues/172 Co-authored-by: Jelle Zijlstra (cherry picked from commit 2888b1107fd0b43cc800987a00155bdbeacdb23a) Co-authored-by: Godefroid Chapelle files: M Doc/library/pdb.rst diff --git a/Doc/library/pdb.rst b/Doc/library/pdb.rst index 13e1a1993692d..dcd509de56adc 100644 --- a/Doc/library/pdb.rst +++ b/Doc/library/pdb.rst @@ -233,7 +233,8 @@ Multiple commands may be entered on a single line, separated by ``;;``. (A single ``;`` is not used as it is the separator for multiple commands in a line that is passed to the Python parser.) No intelligence is applied to separating the commands; the input is split at the first ``;;`` pair, even if it is in the -middle of a quoted string. +middle of a quoted string. A workaround for strings with double semicolons +is to use implicit string concatenation ``';'';'`` or ``";"";"``. .. index:: pair: .pdbrc; file From webhook-mailer at python.org Sun May 8 22:59:19 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Mon, 09 May 2022 02:59:19 -0000 Subject: [Python-checkins] bpo-38056: overhaul Error Handlers section in codecs documentation (#15732) Message-ID: https://github.com/python/cpython/commit/5bc2390229bbcb4f13359e867fd8a140a1d5496b commit: 5bc2390229bbcb4f13359e867fd8a140a1d5496b branch: main author: Ma Lin committer: JelleZijlstra date: 2022-05-08T19:58:55-07:00 summary: bpo-38056: overhaul Error Handlers section in codecs documentation (#15732) * Some handlers were wrongly described as text-encoding only, but actually they can also be used in text-decoding. * Add more description to each handler. * Add two REPL examples. * Add indexes for Error Handler's name. Co-authored-by: Kyle Stanley Co-authored-by: Victor Stinner Co-authored-by: Jelle Zijlstra files: A Misc/NEWS.d/next/Documentation/2019-09-12-08-28-17.bpo-38056.6ktYkc.rst M Doc/glossary.rst M Doc/library/codecs.rst diff --git a/Doc/glossary.rst b/Doc/glossary.rst index 75db433abd6007..27e06c9ffcf4e9 100644 --- a/Doc/glossary.rst +++ b/Doc/glossary.rst @@ -1125,7 +1125,16 @@ Glossary See also :term:`borrowed reference`. text encoding - A codec which encodes Unicode strings to bytes. + A string in Python is a sequence of Unicode code points (in range + ``U+0000``--``U+10FFFF``). To store or transfer a string, it needs to be + serialized as a sequence of bytes. + + Serializing a string into a sequence of bytes is known as "encoding", and + recreating the string from the sequence of bytes is known as "decoding". + + There are a variety of different text serialization + :ref:`codecs `, which are collectively referred to as + "text encodings". text file A :term:`file object` able to read and write :class:`str` objects. diff --git a/Doc/library/codecs.rst b/Doc/library/codecs.rst index 26123fd0d0060c..d131408175fd16 100644 --- a/Doc/library/codecs.rst +++ b/Doc/library/codecs.rst @@ -23,11 +23,11 @@ This module defines base classes for standard Python codecs (encoders and decoders) and provides access to the internal Python codec registry, which manages the codec and error handling lookup process. Most standard codecs -are :term:`text encodings `, which encode text to bytes, -but there are also codecs provided that encode text to text, and bytes to -bytes. Custom codecs may encode and decode between arbitrary types, but some -module features are restricted to use specifically with -:term:`text encodings `, or with codecs that encode to +are :term:`text encodings `, which encode text to bytes (and +decode bytes to text), but there are also codecs provided that encode text to +text, and bytes to bytes. Custom codecs may encode and decode between arbitrary +types, but some module features are restricted to be used specifically with +:term:`text encodings ` or with codecs that encode to :class:`bytes`. The module defines the following functions for encoding and decoding with @@ -300,58 +300,56 @@ codec will handle encoding and decoding errors. Error Handlers ^^^^^^^^^^^^^^ -To simplify and standardize error handling, -codecs may implement different error handling schemes by -accepting the *errors* string argument. The following string values are -defined and implemented by all standard Python codecs: +To simplify and standardize error handling, codecs may implement different +error handling schemes by accepting the *errors* string argument: -.. tabularcolumns:: |l|L| - -+-------------------------+-----------------------------------------------+ -| Value | Meaning | -+=========================+===============================================+ -| ``'strict'`` | Raise :exc:`UnicodeError` (or a subclass); | -| | this is the default. Implemented in | -| | :func:`strict_errors`. | -+-------------------------+-----------------------------------------------+ -| ``'ignore'`` | Ignore the malformed data and continue | -| | without further notice. Implemented in | -| | :func:`ignore_errors`. | -+-------------------------+-----------------------------------------------+ - -The following error handlers are only applicable to -:term:`text encodings `: + >>> 'German ?, ?'.encode(encoding='ascii', errors='backslashreplace') + b'German \\xdf, \\u266c' + >>> 'German ?, ?'.encode(encoding='ascii', errors='xmlcharrefreplace') + b'German ß, ♬' .. index:: + pair: strict; error handler's name + pair: ignore; error handler's name + pair: replace; error handler's name + pair: backslashreplace; error handler's name + pair: surrogateescape; error handler's name single: ? (question mark); replacement character single: \ (backslash); escape sequence single: \x; escape sequence single: \u; escape sequence single: \U; escape sequence - single: \N; escape sequence + +The following error handlers can be used with all Python +:ref:`standard-encodings` codecs: + +.. tabularcolumns:: |l|L| +-------------------------+-----------------------------------------------+ | Value | Meaning | +=========================+===============================================+ -| ``'replace'`` | Replace with a suitable replacement | -| | marker; Python will use the official | -| | ``U+FFFD`` REPLACEMENT CHARACTER for the | -| | built-in codecs on decoding, and '?' on | -| | encoding. Implemented in | -| | :func:`replace_errors`. | +| ``'strict'`` | Raise :exc:`UnicodeError` (or a subclass), | +| | this is the default. Implemented in | +| | :func:`strict_errors`. | +-------------------------+-----------------------------------------------+ -| ``'xmlcharrefreplace'`` | Replace with the appropriate XML character | -| | reference (only for encoding). Implemented | -| | in :func:`xmlcharrefreplace_errors`. | +| ``'ignore'`` | Ignore the malformed data and continue without| +| | further notice. Implemented in | +| | :func:`ignore_errors`. | ++-------------------------+-----------------------------------------------+ +| ``'replace'`` | Replace with a replacement marker. On | +| | encoding, use ``?`` (ASCII character). On | +| | decoding, use ``?`` (U+FFFD, the official | +| | REPLACEMENT CHARACTER). Implemented in | +| | :func:`replace_errors`. | +-------------------------+-----------------------------------------------+ | ``'backslashreplace'`` | Replace with backslashed escape sequences. | +| | On encoding, use hexadecimal form of Unicode | +| | code point with formats ``\xhh`` ``\uxxxx`` | +| | ``\Uxxxxxxxx``. On decoding, use hexadecimal | +| | form of byte value with format ``\xhh``. | | | Implemented in | | | :func:`backslashreplace_errors`. | +-------------------------+-----------------------------------------------+ -| ``'namereplace'`` | Replace with ``\N{...}`` escape sequences | -| | (only for encoding). Implemented in | -| | :func:`namereplace_errors`. | -+-------------------------+-----------------------------------------------+ | ``'surrogateescape'`` | On decoding, replace byte with individual | | | surrogate code ranging from ``U+DC80`` to | | | ``U+DCFF``. This code will then be turned | @@ -361,27 +359,55 @@ The following error handlers are only applicable to | | more.) | +-------------------------+-----------------------------------------------+ +.. index:: + pair: xmlcharrefreplace; error handler's name + pair: namereplace; error handler's name + single: \N; escape sequence + +The following error handlers are only applicable to encoding (within +:term:`text encodings `): + ++-------------------------+-----------------------------------------------+ +| Value | Meaning | ++=========================+===============================================+ +| ``'xmlcharrefreplace'`` | Replace with XML/HTML numeric character | +| | reference, which is a decimal form of Unicode | +| | code point with format ``&#num;`` Implemented | +| | in :func:`xmlcharrefreplace_errors`. | ++-------------------------+-----------------------------------------------+ +| ``'namereplace'`` | Replace with ``\N{...}`` escape sequences, | +| | what appears in the braces is the Name | +| | property from Unicode Character Database. | +| | Implemented in :func:`namereplace_errors`. | ++-------------------------+-----------------------------------------------+ + +.. index:: + pair: surrogatepass; error handler's name + In addition, the following error handler is specific to the given codecs: +-------------------+------------------------+-------------------------------------------+ | Value | Codecs | Meaning | +===================+========================+===========================================+ -|``'surrogatepass'``| utf-8, utf-16, utf-32, | Allow encoding and decoding of surrogate | -| | utf-16-be, utf-16-le, | codes. These codecs normally treat the | -| | utf-32-be, utf-32-le | presence of surrogates as an error. | +|``'surrogatepass'``| utf-8, utf-16, utf-32, | Allow encoding and decoding surrogate code| +| | utf-16-be, utf-16-le, | point (``U+D800`` - ``U+DFFF``) as normal | +| | utf-32-be, utf-32-le | code point. Otherwise these codecs treat | +| | | the presence of surrogate code point in | +| | | :class:`str` as an error. | +-------------------+------------------------+-------------------------------------------+ .. versionadded:: 3.1 The ``'surrogateescape'`` and ``'surrogatepass'`` error handlers. .. versionchanged:: 3.4 - The ``'surrogatepass'`` error handlers now works with utf-16\* and utf-32\* codecs. + The ``'surrogatepass'`` error handler now works with utf-16\* and utf-32\* + codecs. .. versionadded:: 3.5 The ``'namereplace'`` error handler. .. versionchanged:: 3.5 - The ``'backslashreplace'`` error handlers now works with decoding and + The ``'backslashreplace'`` error handler now works with decoding and translating. The set of allowed values can be extended by registering a new named error @@ -424,42 +450,59 @@ functions: .. function:: strict_errors(exception) - Implements the ``'strict'`` error handling: each encoding or - decoding error raises a :exc:`UnicodeError`. + Implements the ``'strict'`` error handling. + Each encoding or decoding error raises a :exc:`UnicodeError`. -.. function:: replace_errors(exception) - Implements the ``'replace'`` error handling (for :term:`text encodings - ` only): substitutes ``'?'`` for encoding errors - (to be encoded by the codec), and ``'\ufffd'`` (the Unicode replacement - character) for decoding errors. +.. function:: ignore_errors(exception) + Implements the ``'ignore'`` error handling. -.. function:: ignore_errors(exception) + Malformed data is ignored; encoding or decoding is continued without + further notice. - Implements the ``'ignore'`` error handling: malformed data is ignored and - encoding or decoding is continued without further notice. +.. function:: replace_errors(exception) -.. function:: xmlcharrefreplace_errors(exception) + Implements the ``'replace'`` error handling. - Implements the ``'xmlcharrefreplace'`` error handling (for encoding with - :term:`text encodings ` only): the - unencodable character is replaced by an appropriate XML character reference. + Substitutes ``?`` (ASCII character) for encoding errors or ``?`` (U+FFFD, + the official REPLACEMENT CHARACTER) for decoding errors. .. function:: backslashreplace_errors(exception) - Implements the ``'backslashreplace'`` error handling (for - :term:`text encodings ` only): malformed data is - replaced by a backslashed escape sequence. + Implements the ``'backslashreplace'`` error handling. + + Malformed data is replaced by a backslashed escape sequence. + On encoding, use the hexadecimal form of Unicode code point with formats + ``\xhh`` ``\uxxxx`` ``\Uxxxxxxxx``. On decoding, use the hexadecimal form of + byte value with format ``\xhh``. + + .. versionchanged:: 3.5 + Works with decoding and translating. + + +.. function:: xmlcharrefreplace_errors(exception) + + Implements the ``'xmlcharrefreplace'`` error handling (for encoding within + :term:`text encoding` only). + + The unencodable character is replaced by an appropriate XML/HTML numeric + character reference, which is a decimal form of Unicode code point with + format ``&#num;`` . + .. function:: namereplace_errors(exception) - Implements the ``'namereplace'`` error handling (for encoding with - :term:`text encodings ` only): the - unencodable character is replaced by a ``\N{...}`` escape sequence. + Implements the ``'namereplace'`` error handling (for encoding within + :term:`text encoding` only). + + The unencodable character is replaced by a ``\N{...}`` escape sequence. The + set of characters that appear in the braces is the Name property from + Unicode Character Database. For example, the German lowercase letter ``'?'`` + will be converted to byte sequence ``\N{LATIN SMALL LETTER SHARP S}`` . .. versionadded:: 3.5 @@ -473,7 +516,7 @@ The base :class:`Codec` class defines these methods which also define the function interfaces of the stateless encoder and decoder: -.. method:: Codec.encode(input[, errors]) +.. method:: Codec.encode(input, errors='strict') Encodes the object *input* and returns a tuple (output object, length consumed). For instance, :term:`text encoding` converts @@ -491,7 +534,7 @@ function interfaces of the stateless encoder and decoder: of the output object type in this situation. -.. method:: Codec.decode(input[, errors]) +.. method:: Codec.decode(input, errors='strict') Decodes the object *input* and returns a tuple (output object, length consumed). For instance, for a :term:`text encoding`, decoding converts @@ -558,7 +601,7 @@ define in order to be compatible with the Python codec registry. object. - .. method:: encode(object[, final]) + .. method:: encode(object, final=False) Encodes *object* (taking the current state of the encoder into account) and returns the resulting encoded object. If this is the last call to @@ -615,7 +658,7 @@ define in order to be compatible with the Python codec registry. object. - .. method:: decode(object[, final]) + .. method:: decode(object, final=False) Decodes *object* (taking the current state of the decoder into account) and returns the resulting decoded object. If this is the last call to @@ -749,7 +792,7 @@ compatible with the Python codec registry. :func:`register_error`. - .. method:: read([size[, chars, [firstline]]]) + .. method:: read(size=-1, chars=-1, firstline=False) Decodes data from the stream and returns the resulting object. @@ -775,7 +818,7 @@ compatible with the Python codec registry. available on the stream, these should be read too. - .. method:: readline([size[, keepends]]) + .. method:: readline(size=None, keepends=True) Read one line from the input stream and return the decoded data. @@ -786,7 +829,7 @@ compatible with the Python codec registry. returned. - .. method:: readlines([sizehint[, keepends]]) + .. method:: readlines(sizehint=None, keepends=True) Read all lines available on the input stream and return them as a list of lines. @@ -877,7 +920,7 @@ Encodings and Unicode --------------------- Strings are stored internally as sequences of code points in -range ``0x0``--``0x10FFFF``. (See :pep:`393` for +range ``U+0000``--``U+10FFFF``. (See :pep:`393` for more details about the implementation.) Once a string object is used outside of CPU and memory, endianness and how these arrays are stored as bytes become an issue. As with other @@ -958,7 +1001,7 @@ encoding was used for encoding a string. Each charmap encoding can decode any random byte sequence. However that's not possible with UTF-8, as UTF-8 byte sequences have a structure that doesn't allow arbitrary byte sequences. To increase the reliability with which a UTF-8 encoding can be -detected, Microsoft invented a variant of UTF-8 (that Python 2.5 calls +detected, Microsoft invented a variant of UTF-8 (that Python calls ``"utf-8-sig"``) for its Notepad program: Before any of the Unicode characters is written to the file, a UTF-8 encoded BOM (which looks like this as a byte sequence: ``0xef``, ``0xbb``, ``0xbf``) is written. As it's rather improbable diff --git a/Misc/NEWS.d/next/Documentation/2019-09-12-08-28-17.bpo-38056.6ktYkc.rst b/Misc/NEWS.d/next/Documentation/2019-09-12-08-28-17.bpo-38056.6ktYkc.rst new file mode 100644 index 00000000000000..2e6b70fd84b6d9 --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2019-09-12-08-28-17.bpo-38056.6ktYkc.rst @@ -0,0 +1 @@ +Overhaul the :ref:`error-handlers` documentation in :mod:`codecs`. From webhook-mailer at python.org Sun May 8 23:13:53 2022 From: webhook-mailer at python.org (miss-islington) Date: Mon, 09 May 2022 03:13:53 -0000 Subject: [Python-checkins] bpo-38056: overhaul Error Handlers section in codecs documentation (GH-15732) Message-ID: https://github.com/python/cpython/commit/2f46cf637f1fd0f0c9eb984062c1f1c934f3ab52 commit: 2f46cf637f1fd0f0c9eb984062c1f1c934f3ab52 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-08T20:13:45-07:00 summary: bpo-38056: overhaul Error Handlers section in codecs documentation (GH-15732) * Some handlers were wrongly described as text-encoding only, but actually they can also be used in text-decoding. * Add more description to each handler. * Add two REPL examples. * Add indexes for Error Handler's name. Co-authored-by: Kyle Stanley Co-authored-by: Victor Stinner Co-authored-by: Jelle Zijlstra (cherry picked from commit 5bc2390229bbcb4f13359e867fd8a140a1d5496b) Co-authored-by: Ma Lin files: A Misc/NEWS.d/next/Documentation/2019-09-12-08-28-17.bpo-38056.6ktYkc.rst M Doc/glossary.rst M Doc/library/codecs.rst diff --git a/Doc/glossary.rst b/Doc/glossary.rst index 75db433abd6007..27e06c9ffcf4e9 100644 --- a/Doc/glossary.rst +++ b/Doc/glossary.rst @@ -1125,7 +1125,16 @@ Glossary See also :term:`borrowed reference`. text encoding - A codec which encodes Unicode strings to bytes. + A string in Python is a sequence of Unicode code points (in range + ``U+0000``--``U+10FFFF``). To store or transfer a string, it needs to be + serialized as a sequence of bytes. + + Serializing a string into a sequence of bytes is known as "encoding", and + recreating the string from the sequence of bytes is known as "decoding". + + There are a variety of different text serialization + :ref:`codecs `, which are collectively referred to as + "text encodings". text file A :term:`file object` able to read and write :class:`str` objects. diff --git a/Doc/library/codecs.rst b/Doc/library/codecs.rst index 26123fd0d0060c..d131408175fd16 100644 --- a/Doc/library/codecs.rst +++ b/Doc/library/codecs.rst @@ -23,11 +23,11 @@ This module defines base classes for standard Python codecs (encoders and decoders) and provides access to the internal Python codec registry, which manages the codec and error handling lookup process. Most standard codecs -are :term:`text encodings `, which encode text to bytes, -but there are also codecs provided that encode text to text, and bytes to -bytes. Custom codecs may encode and decode between arbitrary types, but some -module features are restricted to use specifically with -:term:`text encodings `, or with codecs that encode to +are :term:`text encodings `, which encode text to bytes (and +decode bytes to text), but there are also codecs provided that encode text to +text, and bytes to bytes. Custom codecs may encode and decode between arbitrary +types, but some module features are restricted to be used specifically with +:term:`text encodings ` or with codecs that encode to :class:`bytes`. The module defines the following functions for encoding and decoding with @@ -300,58 +300,56 @@ codec will handle encoding and decoding errors. Error Handlers ^^^^^^^^^^^^^^ -To simplify and standardize error handling, -codecs may implement different error handling schemes by -accepting the *errors* string argument. The following string values are -defined and implemented by all standard Python codecs: +To simplify and standardize error handling, codecs may implement different +error handling schemes by accepting the *errors* string argument: -.. tabularcolumns:: |l|L| - -+-------------------------+-----------------------------------------------+ -| Value | Meaning | -+=========================+===============================================+ -| ``'strict'`` | Raise :exc:`UnicodeError` (or a subclass); | -| | this is the default. Implemented in | -| | :func:`strict_errors`. | -+-------------------------+-----------------------------------------------+ -| ``'ignore'`` | Ignore the malformed data and continue | -| | without further notice. Implemented in | -| | :func:`ignore_errors`. | -+-------------------------+-----------------------------------------------+ - -The following error handlers are only applicable to -:term:`text encodings `: + >>> 'German ?, ?'.encode(encoding='ascii', errors='backslashreplace') + b'German \\xdf, \\u266c' + >>> 'German ?, ?'.encode(encoding='ascii', errors='xmlcharrefreplace') + b'German ß, ♬' .. index:: + pair: strict; error handler's name + pair: ignore; error handler's name + pair: replace; error handler's name + pair: backslashreplace; error handler's name + pair: surrogateescape; error handler's name single: ? (question mark); replacement character single: \ (backslash); escape sequence single: \x; escape sequence single: \u; escape sequence single: \U; escape sequence - single: \N; escape sequence + +The following error handlers can be used with all Python +:ref:`standard-encodings` codecs: + +.. tabularcolumns:: |l|L| +-------------------------+-----------------------------------------------+ | Value | Meaning | +=========================+===============================================+ -| ``'replace'`` | Replace with a suitable replacement | -| | marker; Python will use the official | -| | ``U+FFFD`` REPLACEMENT CHARACTER for the | -| | built-in codecs on decoding, and '?' on | -| | encoding. Implemented in | -| | :func:`replace_errors`. | +| ``'strict'`` | Raise :exc:`UnicodeError` (or a subclass), | +| | this is the default. Implemented in | +| | :func:`strict_errors`. | +-------------------------+-----------------------------------------------+ -| ``'xmlcharrefreplace'`` | Replace with the appropriate XML character | -| | reference (only for encoding). Implemented | -| | in :func:`xmlcharrefreplace_errors`. | +| ``'ignore'`` | Ignore the malformed data and continue without| +| | further notice. Implemented in | +| | :func:`ignore_errors`. | ++-------------------------+-----------------------------------------------+ +| ``'replace'`` | Replace with a replacement marker. On | +| | encoding, use ``?`` (ASCII character). On | +| | decoding, use ``?`` (U+FFFD, the official | +| | REPLACEMENT CHARACTER). Implemented in | +| | :func:`replace_errors`. | +-------------------------+-----------------------------------------------+ | ``'backslashreplace'`` | Replace with backslashed escape sequences. | +| | On encoding, use hexadecimal form of Unicode | +| | code point with formats ``\xhh`` ``\uxxxx`` | +| | ``\Uxxxxxxxx``. On decoding, use hexadecimal | +| | form of byte value with format ``\xhh``. | | | Implemented in | | | :func:`backslashreplace_errors`. | +-------------------------+-----------------------------------------------+ -| ``'namereplace'`` | Replace with ``\N{...}`` escape sequences | -| | (only for encoding). Implemented in | -| | :func:`namereplace_errors`. | -+-------------------------+-----------------------------------------------+ | ``'surrogateescape'`` | On decoding, replace byte with individual | | | surrogate code ranging from ``U+DC80`` to | | | ``U+DCFF``. This code will then be turned | @@ -361,27 +359,55 @@ The following error handlers are only applicable to | | more.) | +-------------------------+-----------------------------------------------+ +.. index:: + pair: xmlcharrefreplace; error handler's name + pair: namereplace; error handler's name + single: \N; escape sequence + +The following error handlers are only applicable to encoding (within +:term:`text encodings `): + ++-------------------------+-----------------------------------------------+ +| Value | Meaning | ++=========================+===============================================+ +| ``'xmlcharrefreplace'`` | Replace with XML/HTML numeric character | +| | reference, which is a decimal form of Unicode | +| | code point with format ``&#num;`` Implemented | +| | in :func:`xmlcharrefreplace_errors`. | ++-------------------------+-----------------------------------------------+ +| ``'namereplace'`` | Replace with ``\N{...}`` escape sequences, | +| | what appears in the braces is the Name | +| | property from Unicode Character Database. | +| | Implemented in :func:`namereplace_errors`. | ++-------------------------+-----------------------------------------------+ + +.. index:: + pair: surrogatepass; error handler's name + In addition, the following error handler is specific to the given codecs: +-------------------+------------------------+-------------------------------------------+ | Value | Codecs | Meaning | +===================+========================+===========================================+ -|``'surrogatepass'``| utf-8, utf-16, utf-32, | Allow encoding and decoding of surrogate | -| | utf-16-be, utf-16-le, | codes. These codecs normally treat the | -| | utf-32-be, utf-32-le | presence of surrogates as an error. | +|``'surrogatepass'``| utf-8, utf-16, utf-32, | Allow encoding and decoding surrogate code| +| | utf-16-be, utf-16-le, | point (``U+D800`` - ``U+DFFF``) as normal | +| | utf-32-be, utf-32-le | code point. Otherwise these codecs treat | +| | | the presence of surrogate code point in | +| | | :class:`str` as an error. | +-------------------+------------------------+-------------------------------------------+ .. versionadded:: 3.1 The ``'surrogateescape'`` and ``'surrogatepass'`` error handlers. .. versionchanged:: 3.4 - The ``'surrogatepass'`` error handlers now works with utf-16\* and utf-32\* codecs. + The ``'surrogatepass'`` error handler now works with utf-16\* and utf-32\* + codecs. .. versionadded:: 3.5 The ``'namereplace'`` error handler. .. versionchanged:: 3.5 - The ``'backslashreplace'`` error handlers now works with decoding and + The ``'backslashreplace'`` error handler now works with decoding and translating. The set of allowed values can be extended by registering a new named error @@ -424,42 +450,59 @@ functions: .. function:: strict_errors(exception) - Implements the ``'strict'`` error handling: each encoding or - decoding error raises a :exc:`UnicodeError`. + Implements the ``'strict'`` error handling. + Each encoding or decoding error raises a :exc:`UnicodeError`. -.. function:: replace_errors(exception) - Implements the ``'replace'`` error handling (for :term:`text encodings - ` only): substitutes ``'?'`` for encoding errors - (to be encoded by the codec), and ``'\ufffd'`` (the Unicode replacement - character) for decoding errors. +.. function:: ignore_errors(exception) + Implements the ``'ignore'`` error handling. -.. function:: ignore_errors(exception) + Malformed data is ignored; encoding or decoding is continued without + further notice. - Implements the ``'ignore'`` error handling: malformed data is ignored and - encoding or decoding is continued without further notice. +.. function:: replace_errors(exception) -.. function:: xmlcharrefreplace_errors(exception) + Implements the ``'replace'`` error handling. - Implements the ``'xmlcharrefreplace'`` error handling (for encoding with - :term:`text encodings ` only): the - unencodable character is replaced by an appropriate XML character reference. + Substitutes ``?`` (ASCII character) for encoding errors or ``?`` (U+FFFD, + the official REPLACEMENT CHARACTER) for decoding errors. .. function:: backslashreplace_errors(exception) - Implements the ``'backslashreplace'`` error handling (for - :term:`text encodings ` only): malformed data is - replaced by a backslashed escape sequence. + Implements the ``'backslashreplace'`` error handling. + + Malformed data is replaced by a backslashed escape sequence. + On encoding, use the hexadecimal form of Unicode code point with formats + ``\xhh`` ``\uxxxx`` ``\Uxxxxxxxx``. On decoding, use the hexadecimal form of + byte value with format ``\xhh``. + + .. versionchanged:: 3.5 + Works with decoding and translating. + + +.. function:: xmlcharrefreplace_errors(exception) + + Implements the ``'xmlcharrefreplace'`` error handling (for encoding within + :term:`text encoding` only). + + The unencodable character is replaced by an appropriate XML/HTML numeric + character reference, which is a decimal form of Unicode code point with + format ``&#num;`` . + .. function:: namereplace_errors(exception) - Implements the ``'namereplace'`` error handling (for encoding with - :term:`text encodings ` only): the - unencodable character is replaced by a ``\N{...}`` escape sequence. + Implements the ``'namereplace'`` error handling (for encoding within + :term:`text encoding` only). + + The unencodable character is replaced by a ``\N{...}`` escape sequence. The + set of characters that appear in the braces is the Name property from + Unicode Character Database. For example, the German lowercase letter ``'?'`` + will be converted to byte sequence ``\N{LATIN SMALL LETTER SHARP S}`` . .. versionadded:: 3.5 @@ -473,7 +516,7 @@ The base :class:`Codec` class defines these methods which also define the function interfaces of the stateless encoder and decoder: -.. method:: Codec.encode(input[, errors]) +.. method:: Codec.encode(input, errors='strict') Encodes the object *input* and returns a tuple (output object, length consumed). For instance, :term:`text encoding` converts @@ -491,7 +534,7 @@ function interfaces of the stateless encoder and decoder: of the output object type in this situation. -.. method:: Codec.decode(input[, errors]) +.. method:: Codec.decode(input, errors='strict') Decodes the object *input* and returns a tuple (output object, length consumed). For instance, for a :term:`text encoding`, decoding converts @@ -558,7 +601,7 @@ define in order to be compatible with the Python codec registry. object. - .. method:: encode(object[, final]) + .. method:: encode(object, final=False) Encodes *object* (taking the current state of the encoder into account) and returns the resulting encoded object. If this is the last call to @@ -615,7 +658,7 @@ define in order to be compatible with the Python codec registry. object. - .. method:: decode(object[, final]) + .. method:: decode(object, final=False) Decodes *object* (taking the current state of the decoder into account) and returns the resulting decoded object. If this is the last call to @@ -749,7 +792,7 @@ compatible with the Python codec registry. :func:`register_error`. - .. method:: read([size[, chars, [firstline]]]) + .. method:: read(size=-1, chars=-1, firstline=False) Decodes data from the stream and returns the resulting object. @@ -775,7 +818,7 @@ compatible with the Python codec registry. available on the stream, these should be read too. - .. method:: readline([size[, keepends]]) + .. method:: readline(size=None, keepends=True) Read one line from the input stream and return the decoded data. @@ -786,7 +829,7 @@ compatible with the Python codec registry. returned. - .. method:: readlines([sizehint[, keepends]]) + .. method:: readlines(sizehint=None, keepends=True) Read all lines available on the input stream and return them as a list of lines. @@ -877,7 +920,7 @@ Encodings and Unicode --------------------- Strings are stored internally as sequences of code points in -range ``0x0``--``0x10FFFF``. (See :pep:`393` for +range ``U+0000``--``U+10FFFF``. (See :pep:`393` for more details about the implementation.) Once a string object is used outside of CPU and memory, endianness and how these arrays are stored as bytes become an issue. As with other @@ -958,7 +1001,7 @@ encoding was used for encoding a string. Each charmap encoding can decode any random byte sequence. However that's not possible with UTF-8, as UTF-8 byte sequences have a structure that doesn't allow arbitrary byte sequences. To increase the reliability with which a UTF-8 encoding can be -detected, Microsoft invented a variant of UTF-8 (that Python 2.5 calls +detected, Microsoft invented a variant of UTF-8 (that Python calls ``"utf-8-sig"``) for its Notepad program: Before any of the Unicode characters is written to the file, a UTF-8 encoded BOM (which looks like this as a byte sequence: ``0xef``, ``0xbb``, ``0xbf``) is written. As it's rather improbable diff --git a/Misc/NEWS.d/next/Documentation/2019-09-12-08-28-17.bpo-38056.6ktYkc.rst b/Misc/NEWS.d/next/Documentation/2019-09-12-08-28-17.bpo-38056.6ktYkc.rst new file mode 100644 index 00000000000000..2e6b70fd84b6d9 --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2019-09-12-08-28-17.bpo-38056.6ktYkc.rst @@ -0,0 +1 @@ +Overhaul the :ref:`error-handlers` documentation in :mod:`codecs`. From webhook-mailer at python.org Sun May 8 23:16:35 2022 From: webhook-mailer at python.org (miss-islington) Date: Mon, 09 May 2022 03:16:35 -0000 Subject: [Python-checkins] bpo-38056: overhaul Error Handlers section in codecs documentation (GH-15732) Message-ID: https://github.com/python/cpython/commit/cd110687126d9f19da42d8eb2404032e994ef28b commit: cd110687126d9f19da42d8eb2404032e994ef28b branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-08T20:16:26-07:00 summary: bpo-38056: overhaul Error Handlers section in codecs documentation (GH-15732) * Some handlers were wrongly described as text-encoding only, but actually they can also be used in text-decoding. * Add more description to each handler. * Add two REPL examples. * Add indexes for Error Handler's name. Co-authored-by: Kyle Stanley Co-authored-by: Victor Stinner Co-authored-by: Jelle Zijlstra (cherry picked from commit 5bc2390229bbcb4f13359e867fd8a140a1d5496b) Co-authored-by: Ma Lin files: A Misc/NEWS.d/next/Documentation/2019-09-12-08-28-17.bpo-38056.6ktYkc.rst M Doc/glossary.rst M Doc/library/codecs.rst diff --git a/Doc/glossary.rst b/Doc/glossary.rst index ddf085b8c1a6c..62c9b867ca12e 100644 --- a/Doc/glossary.rst +++ b/Doc/glossary.rst @@ -1136,7 +1136,16 @@ Glossary See also :term:`borrowed reference`. text encoding - A codec which encodes Unicode strings to bytes. + A string in Python is a sequence of Unicode code points (in range + ``U+0000``--``U+10FFFF``). To store or transfer a string, it needs to be + serialized as a sequence of bytes. + + Serializing a string into a sequence of bytes is known as "encoding", and + recreating the string from the sequence of bytes is known as "decoding". + + There are a variety of different text serialization + :ref:`codecs `, which are collectively referred to as + "text encodings". text file A :term:`file object` able to read and write :class:`str` objects. diff --git a/Doc/library/codecs.rst b/Doc/library/codecs.rst index 73fbefccd728a..1c10462c1509c 100644 --- a/Doc/library/codecs.rst +++ b/Doc/library/codecs.rst @@ -23,11 +23,11 @@ This module defines base classes for standard Python codecs (encoders and decoders) and provides access to the internal Python codec registry, which manages the codec and error handling lookup process. Most standard codecs -are :term:`text encodings `, which encode text to bytes, -but there are also codecs provided that encode text to text, and bytes to -bytes. Custom codecs may encode and decode between arbitrary types, but some -module features are restricted to use specifically with -:term:`text encodings `, or with codecs that encode to +are :term:`text encodings `, which encode text to bytes (and +decode bytes to text), but there are also codecs provided that encode text to +text, and bytes to bytes. Custom codecs may encode and decode between arbitrary +types, but some module features are restricted to be used specifically with +:term:`text encodings ` or with codecs that encode to :class:`bytes`. The module defines the following functions for encoding and decoding with @@ -297,58 +297,56 @@ codec will handle encoding and decoding errors. Error Handlers ^^^^^^^^^^^^^^ -To simplify and standardize error handling, -codecs may implement different error handling schemes by -accepting the *errors* string argument. The following string values are -defined and implemented by all standard Python codecs: +To simplify and standardize error handling, codecs may implement different +error handling schemes by accepting the *errors* string argument: -.. tabularcolumns:: |l|L| - -+-------------------------+-----------------------------------------------+ -| Value | Meaning | -+=========================+===============================================+ -| ``'strict'`` | Raise :exc:`UnicodeError` (or a subclass); | -| | this is the default. Implemented in | -| | :func:`strict_errors`. | -+-------------------------+-----------------------------------------------+ -| ``'ignore'`` | Ignore the malformed data and continue | -| | without further notice. Implemented in | -| | :func:`ignore_errors`. | -+-------------------------+-----------------------------------------------+ - -The following error handlers are only applicable to -:term:`text encodings `: + >>> 'German ?, ?'.encode(encoding='ascii', errors='backslashreplace') + b'German \\xdf, \\u266c' + >>> 'German ?, ?'.encode(encoding='ascii', errors='xmlcharrefreplace') + b'German ß, ♬' .. index:: + pair: strict; error handler's name + pair: ignore; error handler's name + pair: replace; error handler's name + pair: backslashreplace; error handler's name + pair: surrogateescape; error handler's name single: ? (question mark); replacement character single: \ (backslash); escape sequence single: \x; escape sequence single: \u; escape sequence single: \U; escape sequence - single: \N; escape sequence + +The following error handlers can be used with all Python +:ref:`standard-encodings` codecs: + +.. tabularcolumns:: |l|L| +-------------------------+-----------------------------------------------+ | Value | Meaning | +=========================+===============================================+ -| ``'replace'`` | Replace with a suitable replacement | -| | marker; Python will use the official | -| | ``U+FFFD`` REPLACEMENT CHARACTER for the | -| | built-in codecs on decoding, and '?' on | -| | encoding. Implemented in | -| | :func:`replace_errors`. | +| ``'strict'`` | Raise :exc:`UnicodeError` (or a subclass), | +| | this is the default. Implemented in | +| | :func:`strict_errors`. | +-------------------------+-----------------------------------------------+ -| ``'xmlcharrefreplace'`` | Replace with the appropriate XML character | -| | reference (only for encoding). Implemented | -| | in :func:`xmlcharrefreplace_errors`. | +| ``'ignore'`` | Ignore the malformed data and continue without| +| | further notice. Implemented in | +| | :func:`ignore_errors`. | ++-------------------------+-----------------------------------------------+ +| ``'replace'`` | Replace with a replacement marker. On | +| | encoding, use ``?`` (ASCII character). On | +| | decoding, use ``?`` (U+FFFD, the official | +| | REPLACEMENT CHARACTER). Implemented in | +| | :func:`replace_errors`. | +-------------------------+-----------------------------------------------+ | ``'backslashreplace'`` | Replace with backslashed escape sequences. | +| | On encoding, use hexadecimal form of Unicode | +| | code point with formats ``\xhh`` ``\uxxxx`` | +| | ``\Uxxxxxxxx``. On decoding, use hexadecimal | +| | form of byte value with format ``\xhh``. | | | Implemented in | | | :func:`backslashreplace_errors`. | +-------------------------+-----------------------------------------------+ -| ``'namereplace'`` | Replace with ``\N{...}`` escape sequences | -| | (only for encoding). Implemented in | -| | :func:`namereplace_errors`. | -+-------------------------+-----------------------------------------------+ | ``'surrogateescape'`` | On decoding, replace byte with individual | | | surrogate code ranging from ``U+DC80`` to | | | ``U+DCFF``. This code will then be turned | @@ -358,27 +356,55 @@ The following error handlers are only applicable to | | more.) | +-------------------------+-----------------------------------------------+ +.. index:: + pair: xmlcharrefreplace; error handler's name + pair: namereplace; error handler's name + single: \N; escape sequence + +The following error handlers are only applicable to encoding (within +:term:`text encodings `): + ++-------------------------+-----------------------------------------------+ +| Value | Meaning | ++=========================+===============================================+ +| ``'xmlcharrefreplace'`` | Replace with XML/HTML numeric character | +| | reference, which is a decimal form of Unicode | +| | code point with format ``&#num;`` Implemented | +| | in :func:`xmlcharrefreplace_errors`. | ++-------------------------+-----------------------------------------------+ +| ``'namereplace'`` | Replace with ``\N{...}`` escape sequences, | +| | what appears in the braces is the Name | +| | property from Unicode Character Database. | +| | Implemented in :func:`namereplace_errors`. | ++-------------------------+-----------------------------------------------+ + +.. index:: + pair: surrogatepass; error handler's name + In addition, the following error handler is specific to the given codecs: +-------------------+------------------------+-------------------------------------------+ | Value | Codecs | Meaning | +===================+========================+===========================================+ -|``'surrogatepass'``| utf-8, utf-16, utf-32, | Allow encoding and decoding of surrogate | -| | utf-16-be, utf-16-le, | codes. These codecs normally treat the | -| | utf-32-be, utf-32-le | presence of surrogates as an error. | +|``'surrogatepass'``| utf-8, utf-16, utf-32, | Allow encoding and decoding surrogate code| +| | utf-16-be, utf-16-le, | point (``U+D800`` - ``U+DFFF``) as normal | +| | utf-32-be, utf-32-le | code point. Otherwise these codecs treat | +| | | the presence of surrogate code point in | +| | | :class:`str` as an error. | +-------------------+------------------------+-------------------------------------------+ .. versionadded:: 3.1 The ``'surrogateescape'`` and ``'surrogatepass'`` error handlers. .. versionchanged:: 3.4 - The ``'surrogatepass'`` error handlers now works with utf-16\* and utf-32\* codecs. + The ``'surrogatepass'`` error handler now works with utf-16\* and utf-32\* + codecs. .. versionadded:: 3.5 The ``'namereplace'`` error handler. .. versionchanged:: 3.5 - The ``'backslashreplace'`` error handlers now works with decoding and + The ``'backslashreplace'`` error handler now works with decoding and translating. The set of allowed values can be extended by registering a new named error @@ -421,42 +447,59 @@ functions: .. function:: strict_errors(exception) - Implements the ``'strict'`` error handling: each encoding or - decoding error raises a :exc:`UnicodeError`. + Implements the ``'strict'`` error handling. + Each encoding or decoding error raises a :exc:`UnicodeError`. -.. function:: replace_errors(exception) - Implements the ``'replace'`` error handling (for :term:`text encodings - ` only): substitutes ``'?'`` for encoding errors - (to be encoded by the codec), and ``'\ufffd'`` (the Unicode replacement - character) for decoding errors. +.. function:: ignore_errors(exception) + Implements the ``'ignore'`` error handling. -.. function:: ignore_errors(exception) + Malformed data is ignored; encoding or decoding is continued without + further notice. - Implements the ``'ignore'`` error handling: malformed data is ignored and - encoding or decoding is continued without further notice. +.. function:: replace_errors(exception) -.. function:: xmlcharrefreplace_errors(exception) + Implements the ``'replace'`` error handling. - Implements the ``'xmlcharrefreplace'`` error handling (for encoding with - :term:`text encodings ` only): the - unencodable character is replaced by an appropriate XML character reference. + Substitutes ``?`` (ASCII character) for encoding errors or ``?`` (U+FFFD, + the official REPLACEMENT CHARACTER) for decoding errors. .. function:: backslashreplace_errors(exception) - Implements the ``'backslashreplace'`` error handling (for - :term:`text encodings ` only): malformed data is - replaced by a backslashed escape sequence. + Implements the ``'backslashreplace'`` error handling. + + Malformed data is replaced by a backslashed escape sequence. + On encoding, use the hexadecimal form of Unicode code point with formats + ``\xhh`` ``\uxxxx`` ``\Uxxxxxxxx``. On decoding, use the hexadecimal form of + byte value with format ``\xhh``. + + .. versionchanged:: 3.5 + Works with decoding and translating. + + +.. function:: xmlcharrefreplace_errors(exception) + + Implements the ``'xmlcharrefreplace'`` error handling (for encoding within + :term:`text encoding` only). + + The unencodable character is replaced by an appropriate XML/HTML numeric + character reference, which is a decimal form of Unicode code point with + format ``&#num;`` . + .. function:: namereplace_errors(exception) - Implements the ``'namereplace'`` error handling (for encoding with - :term:`text encodings ` only): the - unencodable character is replaced by a ``\N{...}`` escape sequence. + Implements the ``'namereplace'`` error handling (for encoding within + :term:`text encoding` only). + + The unencodable character is replaced by a ``\N{...}`` escape sequence. The + set of characters that appear in the braces is the Name property from + Unicode Character Database. For example, the German lowercase letter ``'?'`` + will be converted to byte sequence ``\N{LATIN SMALL LETTER SHARP S}`` . .. versionadded:: 3.5 @@ -470,7 +513,7 @@ The base :class:`Codec` class defines these methods which also define the function interfaces of the stateless encoder and decoder: -.. method:: Codec.encode(input[, errors]) +.. method:: Codec.encode(input, errors='strict') Encodes the object *input* and returns a tuple (output object, length consumed). For instance, :term:`text encoding` converts @@ -488,7 +531,7 @@ function interfaces of the stateless encoder and decoder: of the output object type in this situation. -.. method:: Codec.decode(input[, errors]) +.. method:: Codec.decode(input, errors='strict') Decodes the object *input* and returns a tuple (output object, length consumed). For instance, for a :term:`text encoding`, decoding converts @@ -555,7 +598,7 @@ define in order to be compatible with the Python codec registry. object. - .. method:: encode(object[, final]) + .. method:: encode(object, final=False) Encodes *object* (taking the current state of the encoder into account) and returns the resulting encoded object. If this is the last call to @@ -612,7 +655,7 @@ define in order to be compatible with the Python codec registry. object. - .. method:: decode(object[, final]) + .. method:: decode(object, final=False) Decodes *object* (taking the current state of the decoder into account) and returns the resulting decoded object. If this is the last call to @@ -746,7 +789,7 @@ compatible with the Python codec registry. :func:`register_error`. - .. method:: read([size[, chars, [firstline]]]) + .. method:: read(size=-1, chars=-1, firstline=False) Decodes data from the stream and returns the resulting object. @@ -772,7 +815,7 @@ compatible with the Python codec registry. available on the stream, these should be read too. - .. method:: readline([size[, keepends]]) + .. method:: readline(size=None, keepends=True) Read one line from the input stream and return the decoded data. @@ -783,7 +826,7 @@ compatible with the Python codec registry. returned. - .. method:: readlines([sizehint[, keepends]]) + .. method:: readlines(sizehint=None, keepends=True) Read all lines available on the input stream and return them as a list of lines. @@ -874,7 +917,7 @@ Encodings and Unicode --------------------- Strings are stored internally as sequences of code points in -range ``0x0``--``0x10FFFF``. (See :pep:`393` for +range ``U+0000``--``U+10FFFF``. (See :pep:`393` for more details about the implementation.) Once a string object is used outside of CPU and memory, endianness and how these arrays are stored as bytes become an issue. As with other @@ -955,7 +998,7 @@ encoding was used for encoding a string. Each charmap encoding can decode any random byte sequence. However that's not possible with UTF-8, as UTF-8 byte sequences have a structure that doesn't allow arbitrary byte sequences. To increase the reliability with which a UTF-8 encoding can be -detected, Microsoft invented a variant of UTF-8 (that Python 2.5 calls +detected, Microsoft invented a variant of UTF-8 (that Python calls ``"utf-8-sig"``) for its Notepad program: Before any of the Unicode characters is written to the file, a UTF-8 encoded BOM (which looks like this as a byte sequence: ``0xef``, ``0xbb``, ``0xbf``) is written. As it's rather improbable diff --git a/Misc/NEWS.d/next/Documentation/2019-09-12-08-28-17.bpo-38056.6ktYkc.rst b/Misc/NEWS.d/next/Documentation/2019-09-12-08-28-17.bpo-38056.6ktYkc.rst new file mode 100644 index 0000000000000..2e6b70fd84b6d --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2019-09-12-08-28-17.bpo-38056.6ktYkc.rst @@ -0,0 +1 @@ +Overhaul the :ref:`error-handlers` documentation in :mod:`codecs`. From webhook-mailer at python.org Sun May 8 23:20:16 2022 From: webhook-mailer at python.org (miss-islington) Date: Mon, 09 May 2022 03:20:16 -0000 Subject: [Python-checkins] bpo-38056: overhaul Error Handlers section in codecs documentation (GH-15732) Message-ID: https://github.com/python/cpython/commit/03aa75221bf0bda469343de5af26766f09e904fe commit: 03aa75221bf0bda469343de5af26766f09e904fe branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-08T20:20:07-07:00 summary: bpo-38056: overhaul Error Handlers section in codecs documentation (GH-15732) * Some handlers were wrongly described as text-encoding only, but actually they can also be used in text-decoding. * Add more description to each handler. * Add two REPL examples. * Add indexes for Error Handler's name. Co-authored-by: Kyle Stanley Co-authored-by: Victor Stinner Co-authored-by: Jelle Zijlstra (cherry picked from commit 5bc2390229bbcb4f13359e867fd8a140a1d5496b) Co-authored-by: Ma Lin files: A Misc/NEWS.d/next/Documentation/2019-09-12-08-28-17.bpo-38056.6ktYkc.rst M Doc/glossary.rst M Doc/library/codecs.rst diff --git a/Doc/glossary.rst b/Doc/glossary.rst index f759c3fb05607..b08e395bab63d 100644 --- a/Doc/glossary.rst +++ b/Doc/glossary.rst @@ -1072,7 +1072,16 @@ Glossary as :keyword:`if`, :keyword:`while` or :keyword:`for`. text encoding - A codec which encodes Unicode strings to bytes. + A string in Python is a sequence of Unicode code points (in range + ``U+0000``--``U+10FFFF``). To store or transfer a string, it needs to be + serialized as a sequence of bytes. + + Serializing a string into a sequence of bytes is known as "encoding", and + recreating the string from the sequence of bytes is known as "decoding". + + There are a variety of different text serialization + :ref:`codecs `, which are collectively referred to as + "text encodings". text file A :term:`file object` able to read and write :class:`str` objects. diff --git a/Doc/library/codecs.rst b/Doc/library/codecs.rst index e8a0a79f8610c..d4ea2b34b6557 100644 --- a/Doc/library/codecs.rst +++ b/Doc/library/codecs.rst @@ -23,11 +23,11 @@ This module defines base classes for standard Python codecs (encoders and decoders) and provides access to the internal Python codec registry, which manages the codec and error handling lookup process. Most standard codecs -are :term:`text encodings `, which encode text to bytes, -but there are also codecs provided that encode text to text, and bytes to -bytes. Custom codecs may encode and decode between arbitrary types, but some -module features are restricted to use specifically with -:term:`text encodings `, or with codecs that encode to +are :term:`text encodings `, which encode text to bytes (and +decode bytes to text), but there are also codecs provided that encode text to +text, and bytes to bytes. Custom codecs may encode and decode between arbitrary +types, but some module features are restricted to be used specifically with +:term:`text encodings ` or with codecs that encode to :class:`bytes`. The module defines the following functions for encoding and decoding with @@ -294,58 +294,56 @@ codec will handle encoding and decoding errors. Error Handlers ^^^^^^^^^^^^^^ -To simplify and standardize error handling, -codecs may implement different error handling schemes by -accepting the *errors* string argument. The following string values are -defined and implemented by all standard Python codecs: +To simplify and standardize error handling, codecs may implement different +error handling schemes by accepting the *errors* string argument: -.. tabularcolumns:: |l|L| - -+-------------------------+-----------------------------------------------+ -| Value | Meaning | -+=========================+===============================================+ -| ``'strict'`` | Raise :exc:`UnicodeError` (or a subclass); | -| | this is the default. Implemented in | -| | :func:`strict_errors`. | -+-------------------------+-----------------------------------------------+ -| ``'ignore'`` | Ignore the malformed data and continue | -| | without further notice. Implemented in | -| | :func:`ignore_errors`. | -+-------------------------+-----------------------------------------------+ - -The following error handlers are only applicable to -:term:`text encodings `: + >>> 'German ?, ?'.encode(encoding='ascii', errors='backslashreplace') + b'German \\xdf, \\u266c' + >>> 'German ?, ?'.encode(encoding='ascii', errors='xmlcharrefreplace') + b'German ß, ♬' .. index:: + pair: strict; error handler's name + pair: ignore; error handler's name + pair: replace; error handler's name + pair: backslashreplace; error handler's name + pair: surrogateescape; error handler's name single: ? (question mark); replacement character single: \ (backslash); escape sequence single: \x; escape sequence single: \u; escape sequence single: \U; escape sequence - single: \N; escape sequence + +The following error handlers can be used with all Python +:ref:`standard-encodings` codecs: + +.. tabularcolumns:: |l|L| +-------------------------+-----------------------------------------------+ | Value | Meaning | +=========================+===============================================+ -| ``'replace'`` | Replace with a suitable replacement | -| | marker; Python will use the official | -| | ``U+FFFD`` REPLACEMENT CHARACTER for the | -| | built-in codecs on decoding, and '?' on | -| | encoding. Implemented in | -| | :func:`replace_errors`. | +| ``'strict'`` | Raise :exc:`UnicodeError` (or a subclass), | +| | this is the default. Implemented in | +| | :func:`strict_errors`. | +-------------------------+-----------------------------------------------+ -| ``'xmlcharrefreplace'`` | Replace with the appropriate XML character | -| | reference (only for encoding). Implemented | -| | in :func:`xmlcharrefreplace_errors`. | +| ``'ignore'`` | Ignore the malformed data and continue without| +| | further notice. Implemented in | +| | :func:`ignore_errors`. | ++-------------------------+-----------------------------------------------+ +| ``'replace'`` | Replace with a replacement marker. On | +| | encoding, use ``?`` (ASCII character). On | +| | decoding, use ``?`` (U+FFFD, the official | +| | REPLACEMENT CHARACTER). Implemented in | +| | :func:`replace_errors`. | +-------------------------+-----------------------------------------------+ | ``'backslashreplace'`` | Replace with backslashed escape sequences. | +| | On encoding, use hexadecimal form of Unicode | +| | code point with formats ``\xhh`` ``\uxxxx`` | +| | ``\Uxxxxxxxx``. On decoding, use hexadecimal | +| | form of byte value with format ``\xhh``. | | | Implemented in | | | :func:`backslashreplace_errors`. | +-------------------------+-----------------------------------------------+ -| ``'namereplace'`` | Replace with ``\N{...}`` escape sequences | -| | (only for encoding). Implemented in | -| | :func:`namereplace_errors`. | -+-------------------------+-----------------------------------------------+ | ``'surrogateescape'`` | On decoding, replace byte with individual | | | surrogate code ranging from ``U+DC80`` to | | | ``U+DCFF``. This code will then be turned | @@ -355,27 +353,55 @@ The following error handlers are only applicable to | | more.) | +-------------------------+-----------------------------------------------+ +.. index:: + pair: xmlcharrefreplace; error handler's name + pair: namereplace; error handler's name + single: \N; escape sequence + +The following error handlers are only applicable to encoding (within +:term:`text encodings `): + ++-------------------------+-----------------------------------------------+ +| Value | Meaning | ++=========================+===============================================+ +| ``'xmlcharrefreplace'`` | Replace with XML/HTML numeric character | +| | reference, which is a decimal form of Unicode | +| | code point with format ``&#num;`` Implemented | +| | in :func:`xmlcharrefreplace_errors`. | ++-------------------------+-----------------------------------------------+ +| ``'namereplace'`` | Replace with ``\N{...}`` escape sequences, | +| | what appears in the braces is the Name | +| | property from Unicode Character Database. | +| | Implemented in :func:`namereplace_errors`. | ++-------------------------+-----------------------------------------------+ + +.. index:: + pair: surrogatepass; error handler's name + In addition, the following error handler is specific to the given codecs: +-------------------+------------------------+-------------------------------------------+ | Value | Codecs | Meaning | +===================+========================+===========================================+ -|``'surrogatepass'``| utf-8, utf-16, utf-32, | Allow encoding and decoding of surrogate | -| | utf-16-be, utf-16-le, | codes. These codecs normally treat the | -| | utf-32-be, utf-32-le | presence of surrogates as an error. | +|``'surrogatepass'``| utf-8, utf-16, utf-32, | Allow encoding and decoding surrogate code| +| | utf-16-be, utf-16-le, | point (``U+D800`` - ``U+DFFF``) as normal | +| | utf-32-be, utf-32-le | code point. Otherwise these codecs treat | +| | | the presence of surrogate code point in | +| | | :class:`str` as an error. | +-------------------+------------------------+-------------------------------------------+ .. versionadded:: 3.1 The ``'surrogateescape'`` and ``'surrogatepass'`` error handlers. .. versionchanged:: 3.4 - The ``'surrogatepass'`` error handlers now works with utf-16\* and utf-32\* codecs. + The ``'surrogatepass'`` error handler now works with utf-16\* and utf-32\* + codecs. .. versionadded:: 3.5 The ``'namereplace'`` error handler. .. versionchanged:: 3.5 - The ``'backslashreplace'`` error handlers now works with decoding and + The ``'backslashreplace'`` error handler now works with decoding and translating. The set of allowed values can be extended by registering a new named error @@ -418,42 +444,59 @@ functions: .. function:: strict_errors(exception) - Implements the ``'strict'`` error handling: each encoding or - decoding error raises a :exc:`UnicodeError`. + Implements the ``'strict'`` error handling. + Each encoding or decoding error raises a :exc:`UnicodeError`. -.. function:: replace_errors(exception) - Implements the ``'replace'`` error handling (for :term:`text encodings - ` only): substitutes ``'?'`` for encoding errors - (to be encoded by the codec), and ``'\ufffd'`` (the Unicode replacement - character) for decoding errors. +.. function:: ignore_errors(exception) + Implements the ``'ignore'`` error handling. -.. function:: ignore_errors(exception) + Malformed data is ignored; encoding or decoding is continued without + further notice. - Implements the ``'ignore'`` error handling: malformed data is ignored and - encoding or decoding is continued without further notice. +.. function:: replace_errors(exception) -.. function:: xmlcharrefreplace_errors(exception) + Implements the ``'replace'`` error handling. - Implements the ``'xmlcharrefreplace'`` error handling (for encoding with - :term:`text encodings ` only): the - unencodable character is replaced by an appropriate XML character reference. + Substitutes ``?`` (ASCII character) for encoding errors or ``?`` (U+FFFD, + the official REPLACEMENT CHARACTER) for decoding errors. .. function:: backslashreplace_errors(exception) - Implements the ``'backslashreplace'`` error handling (for - :term:`text encodings ` only): malformed data is - replaced by a backslashed escape sequence. + Implements the ``'backslashreplace'`` error handling. + + Malformed data is replaced by a backslashed escape sequence. + On encoding, use the hexadecimal form of Unicode code point with formats + ``\xhh`` ``\uxxxx`` ``\Uxxxxxxxx``. On decoding, use the hexadecimal form of + byte value with format ``\xhh``. + + .. versionchanged:: 3.5 + Works with decoding and translating. + + +.. function:: xmlcharrefreplace_errors(exception) + + Implements the ``'xmlcharrefreplace'`` error handling (for encoding within + :term:`text encoding` only). + + The unencodable character is replaced by an appropriate XML/HTML numeric + character reference, which is a decimal form of Unicode code point with + format ``&#num;`` . + .. function:: namereplace_errors(exception) - Implements the ``'namereplace'`` error handling (for encoding with - :term:`text encodings ` only): the - unencodable character is replaced by a ``\N{...}`` escape sequence. + Implements the ``'namereplace'`` error handling (for encoding within + :term:`text encoding` only). + + The unencodable character is replaced by a ``\N{...}`` escape sequence. The + set of characters that appear in the braces is the Name property from + Unicode Character Database. For example, the German lowercase letter ``'?'`` + will be converted to byte sequence ``\N{LATIN SMALL LETTER SHARP S}`` . .. versionadded:: 3.5 @@ -467,7 +510,7 @@ The base :class:`Codec` class defines these methods which also define the function interfaces of the stateless encoder and decoder: -.. method:: Codec.encode(input[, errors]) +.. method:: Codec.encode(input, errors='strict') Encodes the object *input* and returns a tuple (output object, length consumed). For instance, :term:`text encoding` converts @@ -485,7 +528,7 @@ function interfaces of the stateless encoder and decoder: of the output object type in this situation. -.. method:: Codec.decode(input[, errors]) +.. method:: Codec.decode(input, errors='strict') Decodes the object *input* and returns a tuple (output object, length consumed). For instance, for a :term:`text encoding`, decoding converts @@ -552,7 +595,7 @@ define in order to be compatible with the Python codec registry. object. - .. method:: encode(object[, final]) + .. method:: encode(object, final=False) Encodes *object* (taking the current state of the encoder into account) and returns the resulting encoded object. If this is the last call to @@ -609,7 +652,7 @@ define in order to be compatible with the Python codec registry. object. - .. method:: decode(object[, final]) + .. method:: decode(object, final=False) Decodes *object* (taking the current state of the decoder into account) and returns the resulting decoded object. If this is the last call to @@ -743,7 +786,7 @@ compatible with the Python codec registry. :func:`register_error`. - .. method:: read([size[, chars, [firstline]]]) + .. method:: read(size=-1, chars=-1, firstline=False) Decodes data from the stream and returns the resulting object. @@ -769,7 +812,7 @@ compatible with the Python codec registry. available on the stream, these should be read too. - .. method:: readline([size[, keepends]]) + .. method:: readline(size=None, keepends=True) Read one line from the input stream and return the decoded data. @@ -780,7 +823,7 @@ compatible with the Python codec registry. returned. - .. method:: readlines([sizehint[, keepends]]) + .. method:: readlines(sizehint=None, keepends=True) Read all lines available on the input stream and return them as a list of lines. @@ -871,7 +914,7 @@ Encodings and Unicode --------------------- Strings are stored internally as sequences of code points in -range ``0x0``--``0x10FFFF``. (See :pep:`393` for +range ``U+0000``--``U+10FFFF``. (See :pep:`393` for more details about the implementation.) Once a string object is used outside of CPU and memory, endianness and how these arrays are stored as bytes become an issue. As with other @@ -952,7 +995,7 @@ encoding was used for encoding a string. Each charmap encoding can decode any random byte sequence. However that's not possible with UTF-8, as UTF-8 byte sequences have a structure that doesn't allow arbitrary byte sequences. To increase the reliability with which a UTF-8 encoding can be -detected, Microsoft invented a variant of UTF-8 (that Python 2.5 calls +detected, Microsoft invented a variant of UTF-8 (that Python calls ``"utf-8-sig"``) for its Notepad program: Before any of the Unicode characters is written to the file, a UTF-8 encoded BOM (which looks like this as a byte sequence: ``0xef``, ``0xbb``, ``0xbf``) is written. As it's rather improbable diff --git a/Misc/NEWS.d/next/Documentation/2019-09-12-08-28-17.bpo-38056.6ktYkc.rst b/Misc/NEWS.d/next/Documentation/2019-09-12-08-28-17.bpo-38056.6ktYkc.rst new file mode 100644 index 0000000000000..2e6b70fd84b6d --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2019-09-12-08-28-17.bpo-38056.6ktYkc.rst @@ -0,0 +1 @@ +Overhaul the :ref:`error-handlers` documentation in :mod:`codecs`. From webhook-mailer at python.org Mon May 9 03:09:04 2022 From: webhook-mailer at python.org (rhettinger) Date: Mon, 09 May 2022 07:09:04 -0000 Subject: [Python-checkins] Fix inconsistent return type for statistics median_grouped() gh-92531 (#92533) Message-ID: https://github.com/python/cpython/commit/e01eeb7b4b8d00b9f5c6acb48957f46ac4e252c0 commit: e01eeb7b4b8d00b9f5c6acb48957f46ac4e252c0 branch: main author: Raymond Hettinger committer: rhettinger date: 2022-05-09T02:08:41-05:00 summary: Fix inconsistent return type for statistics median_grouped() gh-92531 (#92533) files: A Misc/NEWS.d/next/Library/2022-05-09-01-27-25.gh-issue-92531.vV7S_O.rst M Lib/statistics.py M Lib/test/test_statistics.py diff --git a/Lib/statistics.py b/Lib/statistics.py index 54f4e13265189..2d66b0522f19d 100644 --- a/Lib/statistics.py +++ b/Lib/statistics.py @@ -611,7 +611,7 @@ def median_high(data): return data[n // 2] -def median_grouped(data, interval=1): +def median_grouped(data, interval=1.0): """Estimates the median for numeric data binned around the midpoints of consecutive, fixed-width intervals. @@ -650,35 +650,34 @@ def median_grouped(data, interval=1): by exact multiples of *interval*. This is essential for getting a correct result. The function does not check this precondition. + Inputs may be any numeric type that can be coerced to a float during + the interpolation step. + """ data = sorted(data) n = len(data) - if n == 0: + if not n: raise StatisticsError("no median for empty data") - elif n == 1: - return data[0] # Find the value at the midpoint. Remember this corresponds to the # midpoint of the class interval. x = data[n // 2] - # Generate a clear error message for non-numeric data - for obj in (x, interval): - if isinstance(obj, (str, bytes)): - raise TypeError(f'expected a number but got {obj!r}') - # Using O(log n) bisection, find where all the x values occur in the data. # All x will lie within data[i:j]. i = bisect_left(data, x) j = bisect_right(data, x, lo=i) + # Coerce to floats, raising a TypeError if not possible + try: + interval = float(interval) + x = float(x) + except ValueError: + raise TypeError(f'Value cannot be converted to a float') + # Interpolate the median using the formula found at: # https://www.cuemath.com/data/median-of-grouped-data/ - try: - L = x - interval / 2 # The lower limit of the median interval. - except TypeError: - # Coerce mixed types to float. - L = float(x) - float(interval) / 2 + L = x - interval / 2.0 # Lower limit of the median interval cf = i # Cumulative frequency of the preceding interval f = j - i # Number of elements in the median internal return L + interval * (n / 2 - cf) / f diff --git a/Lib/test/test_statistics.py b/Lib/test/test_statistics.py index ed6021d60bde7..6de98241c294d 100644 --- a/Lib/test/test_statistics.py +++ b/Lib/test/test_statistics.py @@ -1742,6 +1742,12 @@ def test_repeated_single_value(self): data = [x]*count self.assertEqual(self.func(data), float(x)) + def test_single_value(self): + # Override method from AverageMixin. + # Average of a single value is the value as a float. + for x in (23, 42.5, 1.3e15, Fraction(15, 19), Decimal('0.28')): + self.assertEqual(self.func([x]), float(x)) + def test_odd_fractions(self): # Test median_grouped works with an odd number of Fractions. F = Fraction diff --git a/Misc/NEWS.d/next/Library/2022-05-09-01-27-25.gh-issue-92531.vV7S_O.rst b/Misc/NEWS.d/next/Library/2022-05-09-01-27-25.gh-issue-92531.vV7S_O.rst new file mode 100644 index 0000000000000..574fa6c4d9799 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-05-09-01-27-25.gh-issue-92531.vV7S_O.rst @@ -0,0 +1,3 @@ +The statistics.median_grouped() function now always return a float. +Formerly, it did not convert the input type when for sequences of length +one. From webhook-mailer at python.org Mon May 9 04:06:30 2022 From: webhook-mailer at python.org (erlend-aasland) Date: Mon, 09 May 2022 08:06:30 -0000 Subject: [Python-checkins] CODEOWNERS: Add Erlend Aasland as sqlite3 code owner (#92535) Message-ID: https://github.com/python/cpython/commit/3edda031e4abcdc8a2974f2708db99eeb109de32 commit: 3edda031e4abcdc8a2974f2708db99eeb109de32 branch: main author: Erlend Egeberg Aasland committer: erlend-aasland date: 2022-05-09T10:06:03+02:00 summary: CODEOWNERS: Add Erlend Aasland as sqlite3 code owner (#92535) Signed-off-by: Erlend E. Aasland files: M .github/CODEOWNERS diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 62ee6f89cda67..0aea3983fa600 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -98,7 +98,7 @@ Lib/ast.py @isidentical /Lib/unittest/test/testmock/* @cjw296 # SQLite 3 -**/*sqlite* @berkerpeksag +**/*sqlite* @berkerpeksag @erlend-aasland # subprocess /Lib/subprocess.py @gpshead From webhook-mailer at python.org Mon May 9 04:27:05 2022 From: webhook-mailer at python.org (miss-islington) Date: Mon, 09 May 2022 08:27:05 -0000 Subject: [Python-checkins] CODEOWNERS: Add Erlend Aasland as sqlite3 code owner (GH-92535) Message-ID: https://github.com/python/cpython/commit/eded1036f14aeb30c697a4ad1bf58247bd985fc6 commit: eded1036f14aeb30c697a4ad1bf58247bd985fc6 branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-09T01:27:00-07:00 summary: CODEOWNERS: Add Erlend Aasland as sqlite3 code owner (GH-92535) Signed-off-by: Erlend E. Aasland (cherry picked from commit 3edda031e4abcdc8a2974f2708db99eeb109de32) Co-authored-by: Erlend Egeberg Aasland files: M .github/CODEOWNERS diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 9a5bc63924788..173b957b108c6 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -96,7 +96,7 @@ Lib/ast.py @isidentical /Lib/unittest/test/testmock/* @cjw296 # SQLite 3 -**/*sqlite* @berkerpeksag +**/*sqlite* @berkerpeksag @erlend-aasland # subprocess /Lib/subprocess.py @gpshead From webhook-mailer at python.org Mon May 9 04:32:23 2022 From: webhook-mailer at python.org (miss-islington) Date: Mon, 09 May 2022 08:32:23 -0000 Subject: [Python-checkins] CODEOWNERS: Add Erlend Aasland as sqlite3 code owner (GH-92535) Message-ID: https://github.com/python/cpython/commit/a9f1cba06e4c8dbe35a1de5d1fa6918333341807 commit: a9f1cba06e4c8dbe35a1de5d1fa6918333341807 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-09T01:31:44-07:00 summary: CODEOWNERS: Add Erlend Aasland as sqlite3 code owner (GH-92535) Signed-off-by: Erlend E. Aasland (cherry picked from commit 3edda031e4abcdc8a2974f2708db99eeb109de32) Co-authored-by: Erlend Egeberg Aasland files: M .github/CODEOWNERS diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 62ee6f89cda67..0aea3983fa600 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -98,7 +98,7 @@ Lib/ast.py @isidentical /Lib/unittest/test/testmock/* @cjw296 # SQLite 3 -**/*sqlite* @berkerpeksag +**/*sqlite* @berkerpeksag @erlend-aasland # subprocess /Lib/subprocess.py @gpshead From webhook-mailer at python.org Mon May 9 04:32:30 2022 From: webhook-mailer at python.org (miss-islington) Date: Mon, 09 May 2022 08:32:30 -0000 Subject: [Python-checkins] CODEOWNERS: Add Erlend Aasland as sqlite3 code owner (GH-92535) Message-ID: https://github.com/python/cpython/commit/7ae6f1ae09597ae76f15b98e13e767194d6f9fe2 commit: 7ae6f1ae09597ae76f15b98e13e767194d6f9fe2 branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-09T01:32:26-07:00 summary: CODEOWNERS: Add Erlend Aasland as sqlite3 code owner (GH-92535) Signed-off-by: Erlend E. Aasland (cherry picked from commit 3edda031e4abcdc8a2974f2708db99eeb109de32) Co-authored-by: Erlend Egeberg Aasland files: M .github/CODEOWNERS diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 7fe615a1e869e..aa08f2487ff53 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -79,7 +79,7 @@ Include/pytime.h @pganssle @abalkin /Lib/test/test_peg_generator/ @pablogsal @lysnikolaou # SQLite 3 -**/*sqlite* @berkerpeksag +**/*sqlite* @berkerpeksag @erlend-aasland # subprocess /Lib/subprocess.py @gpshead From webhook-mailer at python.org Mon May 9 05:00:53 2022 From: webhook-mailer at python.org (erlend-aasland) Date: Mon, 09 May 2022 09:00:53 -0000 Subject: [Python-checkins] gh-90005: Cleanup after GH-31698 (#91642) Message-ID: https://github.com/python/cpython/commit/269e7267236256e269a3a6af7a4d4fea1c7439ea commit: 269e7267236256e269a3a6af7a4d4fea1c7439ea branch: main author: Erlend Egeberg Aasland committer: erlend-aasland date: 2022-05-09T11:00:20+02:00 summary: gh-90005: Cleanup after GH-31698 (#91642) files: M configure M configure.ac diff --git a/configure b/configure index e956de9912301..010ad320582c5 100755 --- a/configure +++ b/configure @@ -654,10 +654,10 @@ MODULE_BINASCII_FALSE MODULE_BINASCII_TRUE MODULE_ZLIB_FALSE MODULE_ZLIB_TRUE -MODULE__TKINTER_FALSE -MODULE__TKINTER_TRUE MODULE__UUID_FALSE MODULE__UUID_TRUE +MODULE__TKINTER_FALSE +MODULE__TKINTER_TRUE MODULE__SQLITE3_FALSE MODULE__SQLITE3_TRUE MODULE_NIS_FALSE @@ -24197,40 +24197,6 @@ fi $as_echo "$py_cv_module__sqlite3" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdlib extension module _uuid" >&5 -$as_echo_n "checking for stdlib extension module _uuid... " >&6; } - if test "$py_cv_module__uuid" != "n/a"; then : - - if true; then : - if test "$have_uuid" = "yes"; then : - py_cv_module__uuid=yes -else - py_cv_module__uuid=missing -fi -else - py_cv_module__uuid=disabled -fi - -fi - as_fn_append MODULE_BLOCK "MODULE__UUID=$py_cv_module__uuid$as_nl" - if test "x$py_cv_module__uuid" = xyes; then : - - as_fn_append MODULE_BLOCK "MODULE__UUID_CFLAGS=$LIBUUID_CFLAGS$as_nl" - as_fn_append MODULE_BLOCK "MODULE__UUID_LDFLAGS=$LIBUUID_LIBS$as_nl" - -fi - if test "$py_cv_module__uuid" = yes; then - MODULE__UUID_TRUE= - MODULE__UUID_FALSE='#' -else - MODULE__UUID_TRUE='#' - MODULE__UUID_FALSE= -fi - - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $py_cv_module__uuid" >&5 -$as_echo "$py_cv_module__uuid" >&6; } - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdlib extension module _tkinter" >&5 $as_echo_n "checking for stdlib extension module _tkinter... " >&6; } if test "$py_cv_module__tkinter" != "n/a"; then : @@ -24265,6 +24231,40 @@ fi $as_echo "$py_cv_module__tkinter" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdlib extension module _uuid" >&5 +$as_echo_n "checking for stdlib extension module _uuid... " >&6; } + if test "$py_cv_module__uuid" != "n/a"; then : + + if true; then : + if test "$have_uuid" = "yes"; then : + py_cv_module__uuid=yes +else + py_cv_module__uuid=missing +fi +else + py_cv_module__uuid=disabled +fi + +fi + as_fn_append MODULE_BLOCK "MODULE__UUID=$py_cv_module__uuid$as_nl" + if test "x$py_cv_module__uuid" = xyes; then : + + as_fn_append MODULE_BLOCK "MODULE__UUID_CFLAGS=$LIBUUID_CFLAGS$as_nl" + as_fn_append MODULE_BLOCK "MODULE__UUID_LDFLAGS=$LIBUUID_LIBS$as_nl" + +fi + if test "$py_cv_module__uuid" = yes; then + MODULE__UUID_TRUE= + MODULE__UUID_FALSE='#' +else + MODULE__UUID_TRUE='#' + MODULE__UUID_FALSE= +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $py_cv_module__uuid" >&5 +$as_echo "$py_cv_module__uuid" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdlib extension module zlib" >&5 $as_echo_n "checking for stdlib extension module zlib... " >&6; } @@ -25121,14 +25121,14 @@ if test -z "${MODULE__SQLITE3_TRUE}" && test -z "${MODULE__SQLITE3_FALSE}"; then as_fn_error $? "conditional \"MODULE__SQLITE3\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi -if test -z "${MODULE__UUID_TRUE}" && test -z "${MODULE__UUID_FALSE}"; then - as_fn_error $? "conditional \"MODULE__UUID\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi if test -z "${MODULE__TKINTER_TRUE}" && test -z "${MODULE__TKINTER_FALSE}"; then as_fn_error $? "conditional \"MODULE__TKINTER\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi +if test -z "${MODULE__UUID_TRUE}" && test -z "${MODULE__UUID_FALSE}"; then + as_fn_error $? "conditional \"MODULE__UUID\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi if test -z "${MODULE_ZLIB_TRUE}" && test -z "${MODULE_ZLIB_FALSE}"; then as_fn_error $? "conditional \"MODULE_ZLIB\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 diff --git a/configure.ac b/configure.ac index 39bb5c48b65db..65b96976031ac 100644 --- a/configure.ac +++ b/configure.ac @@ -6869,12 +6869,12 @@ PY_STDLIB_MOD([_sqlite3], [test "$have_sqlite3" = "yes"], [test "$have_supported_sqlite3" = "yes"], [$LIBSQLITE3_CFLAGS], [$LIBSQLITE3_LIBS]) -dnl PY_STDLIB_MOD([_tkinter], [], [], [], []) +PY_STDLIB_MOD([_tkinter], + [], [test "$have_tcltk" = "yes"], + [$TCLTK_CFLAGS], [$TCLTK_LIBS]) PY_STDLIB_MOD([_uuid], [], [test "$have_uuid" = "yes"], [$LIBUUID_CFLAGS], [$LIBUUID_LIBS]) -PY_STDLIB_MOD([_tkinter], [], - [test "$have_tcltk" = "yes"], [$TCLTK_CFLAGS], [$TCLTK_LIBS]) dnl compression libs PY_STDLIB_MOD([zlib], [], [test "$have_zlib" = yes], From webhook-mailer at python.org Mon May 9 05:24:12 2022 From: webhook-mailer at python.org (miss-islington) Date: Mon, 09 May 2022 09:24:12 -0000 Subject: [Python-checkins] gh-90005: Cleanup after GH-31698 (GH-91642) Message-ID: https://github.com/python/cpython/commit/5e2e9c4e74643aecd87a88fdb12e15f4690acb04 commit: 5e2e9c4e74643aecd87a88fdb12e15f4690acb04 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-09T02:23:24-07:00 summary: gh-90005: Cleanup after GH-31698 (GH-91642) (cherry picked from commit 269e7267236256e269a3a6af7a4d4fea1c7439ea) Co-authored-by: Erlend Egeberg Aasland files: M configure M configure.ac diff --git a/configure b/configure index b57c6f3a45abe..a4ef0e50902cb 100755 --- a/configure +++ b/configure @@ -654,10 +654,10 @@ MODULE_BINASCII_FALSE MODULE_BINASCII_TRUE MODULE_ZLIB_FALSE MODULE_ZLIB_TRUE -MODULE__TKINTER_FALSE -MODULE__TKINTER_TRUE MODULE__UUID_FALSE MODULE__UUID_TRUE +MODULE__TKINTER_FALSE +MODULE__TKINTER_TRUE MODULE__SQLITE3_FALSE MODULE__SQLITE3_TRUE MODULE_NIS_FALSE @@ -24197,40 +24197,6 @@ fi $as_echo "$py_cv_module__sqlite3" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdlib extension module _uuid" >&5 -$as_echo_n "checking for stdlib extension module _uuid... " >&6; } - if test "$py_cv_module__uuid" != "n/a"; then : - - if true; then : - if test "$have_uuid" = "yes"; then : - py_cv_module__uuid=yes -else - py_cv_module__uuid=missing -fi -else - py_cv_module__uuid=disabled -fi - -fi - as_fn_append MODULE_BLOCK "MODULE__UUID=$py_cv_module__uuid$as_nl" - if test "x$py_cv_module__uuid" = xyes; then : - - as_fn_append MODULE_BLOCK "MODULE__UUID_CFLAGS=$LIBUUID_CFLAGS$as_nl" - as_fn_append MODULE_BLOCK "MODULE__UUID_LDFLAGS=$LIBUUID_LIBS$as_nl" - -fi - if test "$py_cv_module__uuid" = yes; then - MODULE__UUID_TRUE= - MODULE__UUID_FALSE='#' -else - MODULE__UUID_TRUE='#' - MODULE__UUID_FALSE= -fi - - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $py_cv_module__uuid" >&5 -$as_echo "$py_cv_module__uuid" >&6; } - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdlib extension module _tkinter" >&5 $as_echo_n "checking for stdlib extension module _tkinter... " >&6; } if test "$py_cv_module__tkinter" != "n/a"; then : @@ -24265,6 +24231,40 @@ fi $as_echo "$py_cv_module__tkinter" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdlib extension module _uuid" >&5 +$as_echo_n "checking for stdlib extension module _uuid... " >&6; } + if test "$py_cv_module__uuid" != "n/a"; then : + + if true; then : + if test "$have_uuid" = "yes"; then : + py_cv_module__uuid=yes +else + py_cv_module__uuid=missing +fi +else + py_cv_module__uuid=disabled +fi + +fi + as_fn_append MODULE_BLOCK "MODULE__UUID=$py_cv_module__uuid$as_nl" + if test "x$py_cv_module__uuid" = xyes; then : + + as_fn_append MODULE_BLOCK "MODULE__UUID_CFLAGS=$LIBUUID_CFLAGS$as_nl" + as_fn_append MODULE_BLOCK "MODULE__UUID_LDFLAGS=$LIBUUID_LIBS$as_nl" + +fi + if test "$py_cv_module__uuid" = yes; then + MODULE__UUID_TRUE= + MODULE__UUID_FALSE='#' +else + MODULE__UUID_TRUE='#' + MODULE__UUID_FALSE= +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $py_cv_module__uuid" >&5 +$as_echo "$py_cv_module__uuid" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdlib extension module zlib" >&5 $as_echo_n "checking for stdlib extension module zlib... " >&6; } @@ -25121,14 +25121,14 @@ if test -z "${MODULE__SQLITE3_TRUE}" && test -z "${MODULE__SQLITE3_FALSE}"; then as_fn_error $? "conditional \"MODULE__SQLITE3\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi -if test -z "${MODULE__UUID_TRUE}" && test -z "${MODULE__UUID_FALSE}"; then - as_fn_error $? "conditional \"MODULE__UUID\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi if test -z "${MODULE__TKINTER_TRUE}" && test -z "${MODULE__TKINTER_FALSE}"; then as_fn_error $? "conditional \"MODULE__TKINTER\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi +if test -z "${MODULE__UUID_TRUE}" && test -z "${MODULE__UUID_FALSE}"; then + as_fn_error $? "conditional \"MODULE__UUID\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi if test -z "${MODULE_ZLIB_TRUE}" && test -z "${MODULE_ZLIB_FALSE}"; then as_fn_error $? "conditional \"MODULE_ZLIB\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 diff --git a/configure.ac b/configure.ac index 07b8885f1e482..c27d4ca3b569c 100644 --- a/configure.ac +++ b/configure.ac @@ -6869,12 +6869,12 @@ PY_STDLIB_MOD([_sqlite3], [test "$have_sqlite3" = "yes"], [test "$have_supported_sqlite3" = "yes"], [$LIBSQLITE3_CFLAGS], [$LIBSQLITE3_LIBS]) -dnl PY_STDLIB_MOD([_tkinter], [], [], [], []) +PY_STDLIB_MOD([_tkinter], + [], [test "$have_tcltk" = "yes"], + [$TCLTK_CFLAGS], [$TCLTK_LIBS]) PY_STDLIB_MOD([_uuid], [], [test "$have_uuid" = "yes"], [$LIBUUID_CFLAGS], [$LIBUUID_LIBS]) -PY_STDLIB_MOD([_tkinter], [], - [test "$have_tcltk" = "yes"], [$TCLTK_CFLAGS], [$TCLTK_LIBS]) dnl compression libs PY_STDLIB_MOD([zlib], [], [test "$have_zlib" = yes], From webhook-mailer at python.org Mon May 9 06:36:42 2022 From: webhook-mailer at python.org (vstinner) Date: Mon, 09 May 2022 10:36:42 -0000 Subject: [Python-checkins] Enhance PyConfig documentation (#92394) Message-ID: https://github.com/python/cpython/commit/7b9803f93fbd1f8cfcc93ae7847ba029e9183db4 commit: 7b9803f93fbd1f8cfcc93ae7847ba029e9183db4 branch: main author: Victor Stinner committer: vstinner date: 2022-05-09T12:35:59+02:00 summary: Enhance PyConfig documentation (#92394) files: M Doc/c-api/init_config.rst diff --git a/Doc/c-api/init_config.rst b/Doc/c-api/init_config.rst index 728df2100336e..cc223a7fa4b94 100644 --- a/Doc/c-api/init_config.rst +++ b/Doc/c-api/init_config.rst @@ -97,7 +97,7 @@ PyWideStringList If *index* is greater than or equal to *list* length, append *item* to *list*. - *index* must be greater than or equal to 0. + *index* must be greater than or equal to ``0``. Python must be preinitialized to call this function. @@ -256,8 +256,8 @@ PyPreConfig Set the LC_CTYPE locale to the user preferred locale? - If equals to 0, set :c:member:`~PyPreConfig.coerce_c_locale` and - :c:member:`~PyPreConfig.coerce_c_locale_warn` members to 0. + If equals to ``0``, set :c:member:`~PyPreConfig.coerce_c_locale` and + :c:member:`~PyPreConfig.coerce_c_locale_warn` members to ``0``. See the :term:`locale encoding`. @@ -265,9 +265,9 @@ PyPreConfig .. c:member:: int coerce_c_locale - If equals to 2, coerce the C locale. + If equals to ``2``, coerce the C locale. - If equals to 1, read the LC_CTYPE locale to decide if it should be + If equals to ``1``, read the LC_CTYPE locale to decide if it should be coerced. See the :term:`locale encoding`. @@ -282,8 +282,8 @@ PyPreConfig .. c:member:: int dev_mode - If non-zero, enables the :ref:`Python Development Mode `: - see :c:member:`PyConfig.dev_mode`. + :ref:`Python Development Mode `: see + :c:member:`PyConfig.dev_mode`. Default: ``-1`` in Python mode, ``0`` in isolated mode. @@ -329,8 +329,10 @@ PyPreConfig If non-zero, enable the :ref:`Python UTF-8 Mode `. - Set by the :option:`-X utf8 <-X>` command line option and the - :envvar:`PYTHONUTF8` environment variable. + Set to ``0`` or ``1`` by the :option:`-X utf8 <-X>` command line option + and the :envvar:`PYTHONUTF8` environment variable. + + Also set to ``1`` if the ``LC_CTYPE`` locale is ``C`` or ``POSIX``. Default: ``-1`` in Python config and ``0`` in isolated config. @@ -555,7 +557,7 @@ PyConfig * Otherwise (``python -c code`` and ``python``), prepend an empty string, which means the current working directory. - Set to 1 by the :option:`-P` command line option and the + Set to ``1`` by the :option:`-P` command line option and the :envvar:`PYTHONSAFEPATH` environment variable. Default: ``0`` in Python config, ``1`` in isolated config. @@ -592,10 +594,10 @@ PyConfig .. c:member:: int buffered_stdio - If equals to 0 and :c:member:`~PyConfig.configure_c_stdio` is non-zero, + If equals to ``0`` and :c:member:`~PyConfig.configure_c_stdio` is non-zero, disable buffering on the C streams stdout and stderr. - Set to 0 by the :option:`-u` command line option and the + Set to ``0`` by the :option:`-u` command line option and the :envvar:`PYTHONUNBUFFERED` environment variable. stdin is always opened in buffered mode. @@ -604,11 +606,11 @@ PyConfig .. c:member:: int bytes_warning - If equals to 1, issue a warning when comparing :class:`bytes` or + If equals to ``1``, issue a warning when comparing :class:`bytes` or :class:`bytearray` with :class:`str`, or comparing :class:`bytes` with :class:`int`. - If equal or greater to 2, raise a :exc:`BytesWarning` exception in these + If equal or greater to ``2``, raise a :exc:`BytesWarning` exception in these cases. Incremented by the :option:`-b` command line option. @@ -671,6 +673,9 @@ PyConfig If non-zero, enable the :ref:`Python Development Mode `. + Set to ``1`` by the :option:`-X dev <-X>` option and the + :envvar:`PYTHONDEVMODE` environment variable. + Default: ``-1`` in Python mode, ``0`` in isolated mode. .. c:member:: int dump_refs @@ -800,7 +805,7 @@ PyConfig Enter interactive mode after executing a script or a command. - If greater than 0, enable inspect: when a script is passed as first + If greater than ``0``, enable inspect: when a script is passed as first argument or the -c option is used, enter interactive mode after executing the script or the command, even when :data:`sys.stdin` does not appear to be a terminal. @@ -818,7 +823,7 @@ PyConfig .. c:member:: int interactive - If greater than 0, enable the interactive mode (REPL). + If greater than ``0``, enable the interactive mode (REPL). Incremented by the :option:`-i` command line option. @@ -826,17 +831,19 @@ PyConfig .. c:member:: int isolated - If greater than 0, enable isolated mode: + If greater than ``0``, enable isolated mode: - * Set :c:member:`~PyConfig.safe_path` to 1: + * Set :c:member:`~PyConfig.safe_path` to ``1``: don't prepend a potentially unsafe path to :data:`sys.path` at Python startup. - * Set :c:member:`~PyConfig.use_environment` to 0. - * Set :c:member:`~PyConfig.user_site_directory` to 0: don't add the user + * Set :c:member:`~PyConfig.use_environment` to ``0``. + * Set :c:member:`~PyConfig.user_site_directory` to ``0``: don't add the user site directory to :data:`sys.path`. * Python REPL doesn't import :mod:`readline` nor enable default readline configuration on interactive prompts. + Set to ``1`` by the :option:`-I` command line option. + Default: ``0`` in Python mode, ``1`` in isolated mode. See also :c:member:`PyPreConfig.isolated`. @@ -906,7 +913,7 @@ PyConfig Module search paths: :data:`sys.path`. - If :c:member:`~PyConfig.module_search_paths_set` is equal to 0, + If :c:member:`~PyConfig.module_search_paths_set` is equal to ``0``, :c:func:`Py_InitializeFromConfig` will replace :c:member:`~PyConfig.module_search_paths` and sets :c:member:`~PyConfig.module_search_paths_set` to ``1``. @@ -970,7 +977,7 @@ PyConfig .. c:member:: int parser_debug - Parser debug mode. If greater than 0, turn on parser debugging output (for expert only, depending + Parser debug mode. If greater than ``0``, turn on parser debugging output (for expert only, depending on compilation options). Incremented by the :option:`-d` command line option. Set to the @@ -981,7 +988,7 @@ PyConfig .. c:member:: int pathconfig_warnings If non-zero, calculation of path configuration is allowed to log - warnings into ``stderr``. If equals to 0, suppress these warnings. + warnings into ``stderr``. If equals to ``0``, suppress these warnings. Default: ``1`` in Python mode, ``0`` in isolated mode. @@ -1031,7 +1038,7 @@ PyConfig .. c:member:: int quiet - Quiet mode. If greater than 0, don't display the copyright and version at + Quiet mode. If greater than ``0``, don't display the copyright and version at Python startup in interactive mode. Incremented by the :option:`-q` command line option. @@ -1071,7 +1078,7 @@ PyConfig Show total reference count at exit? - Set to 1 by :option:`-X showrefcount <-X>` command line option. + Set to ``1`` by :option:`-X showrefcount <-X>` command line option. Need a :ref:`debug build of Python ` (the ``Py_REF_DEBUG`` macro must be defined). @@ -1150,6 +1157,8 @@ PyConfig If equals to zero, ignore the :ref:`environment variables `. + Set to ``0`` by the :option:`-E` environment variable. + Default: ``1`` in Python config and ``0`` in isolated config. .. c:member:: int user_site_directory @@ -1164,11 +1173,11 @@ PyConfig .. c:member:: int verbose - Verbose mode. If greater than 0, print a message each time a module is + Verbose mode. If greater than ``0``, print a message each time a module is imported, showing the place (filename or built-in module) from which it is loaded. - If greater or equal to 2, print a message for each file that is checked + If greater or equal to ``2``, print a message for each file that is checked for when searching for a module. Also provides information on module cleanup at exit. @@ -1199,7 +1208,7 @@ PyConfig .. c:member:: int write_bytecode - If equal to 0, Python won't try to write ``.pyc`` files on the import of + If equal to ``0``, Python won't try to write ``.pyc`` files on the import of source modules. Set to ``0`` by the :option:`-B` command line option and the @@ -1400,18 +1409,18 @@ Python Path Configuration If at least one "output field" is not set, Python calculates the path configuration to fill unset fields. If -:c:member:`~PyConfig.module_search_paths_set` is equal to 0, +:c:member:`~PyConfig.module_search_paths_set` is equal to ``0``, :c:member:`~PyConfig.module_search_paths` is overridden and -:c:member:`~PyConfig.module_search_paths_set` is set to 1. +:c:member:`~PyConfig.module_search_paths_set` is set to ``1``. It is possible to completely ignore the function calculating the default path configuration by setting explicitly all path configuration output fields listed above. A string is considered as set even if it is non-empty. ``module_search_paths`` is considered as set if -``module_search_paths_set`` is set to 1. In this case, path +``module_search_paths_set`` is set to ``1``. In this case, path configuration input fields are ignored as well. -Set :c:member:`~PyConfig.pathconfig_warnings` to 0 to suppress warnings when +Set :c:member:`~PyConfig.pathconfig_warnings` to ``0`` to suppress warnings when calculating the path configuration (Unix only, Windows does not log any warning). If :c:member:`~PyConfig.base_prefix` or :c:member:`~PyConfig.base_exec_prefix` @@ -1445,10 +1454,10 @@ The following configuration files are used by the path configuration: If a ``._pth`` file is present: -* Set :c:member:`~PyConfig.isolated` to 1. -* Set :c:member:`~PyConfig.use_environment` to 0. -* Set :c:member:`~PyConfig.site_import` to 0. -* Set :c:member:`~PyConfig.safe_path` to 1. +* Set :c:member:`~PyConfig.isolated` to ``1``. +* Set :c:member:`~PyConfig.use_environment` to ``0``. +* Set :c:member:`~PyConfig.site_import` to ``0``. +* Set :c:member:`~PyConfig.safe_path` to ``1``. The ``__PYVENV_LAUNCHER__`` environment variable is used to set :c:member:`PyConfig.base_executable` @@ -1511,7 +1520,7 @@ initialization, the core feature of :pep:`432`: Private provisional API: -* :c:member:`PyConfig._init_main`: if set to 0, +* :c:member:`PyConfig._init_main`: if set to ``0``, :c:func:`Py_InitializeFromConfig` stops at the "Core" initialization phase. * :c:member:`PyConfig._isolated_interpreter`: if non-zero, disallow threads, subprocesses and fork. From webhook-mailer at python.org Mon May 9 06:41:16 2022 From: webhook-mailer at python.org (vstinner) Date: Mon, 09 May 2022 10:41:16 -0000 Subject: [Python-checkins] What's New in Python 3.11: move C API changes (#92390) Message-ID: https://github.com/python/cpython/commit/d8104d13cd80737f5efe1cd94aeec5979f912cd0 commit: d8104d13cd80737f5efe1cd94aeec5979f912cd0 branch: main author: Victor Stinner committer: vstinner date: 2022-05-09T12:40:56+02:00 summary: What's New in Python 3.11: move C API changes (#92390) Move C API changes to the C API > Porting to Python 3.11 section. files: M Doc/whatsnew/3.11.rst diff --git a/Doc/whatsnew/3.11.rst b/Doc/whatsnew/3.11.rst index 793c92aaea416..ab760d166030b 100644 --- a/Doc/whatsnew/3.11.rst +++ b/Doc/whatsnew/3.11.rst @@ -1501,37 +1501,6 @@ Build Changes C API Changes ============= -* :c:func:`PyErr_SetExcInfo()` no longer uses the ``type`` and ``traceback`` - arguments, the interpreter now derives those values from the exception - instance (the ``value`` argument). The function still steals references - of all three arguments. - (Contributed by Irit Katriel in :issue:`45711`.) - -* :c:func:`PyErr_GetExcInfo()` now derives the ``type`` and ``traceback`` - fields of the result from the exception instance (the ``value`` field). - (Contributed by Irit Katriel in :issue:`45711`.) - -* :c:type:`_frozen` has a new ``is_package`` field to indicate whether - or not the frozen module is a package. Previously, a negative value - in the ``size`` field was the indicator. Now only non-negative values - be used for ``size``. - (Contributed by Kumar Aditya in :issue:`46608`.) - -* :c:func:`_PyFrameEvalFunction` now takes ``_PyInterpreterFrame*`` - as its second parameter, instead of ``PyFrameObject*``. - See :pep:`523` for more details of how to use this function pointer type. - -* :c:func:`PyCode_New` and :c:func:`PyCode_NewWithPosOnlyArgs` now take - an additional ``exception_table`` argument. - Using these functions should be avoided, if at all possible. - To get a custom code object: create a code object using the compiler, - then get a modified version with the ``replace`` method. - -* :c:type:`PyCodeObject` no longer has a ``co_code`` field. Instead, - use ``PyObject_GetAttrString(code_object, "co_code")`` or - :c:func:`PyCode_GetCode` to get the underlying bytes object. - (Contributed by Brandt Bucher in :issue:`46841` and Ken Jin in :gh:`92154`.) - New Features ------------ @@ -1598,6 +1567,37 @@ New Features Porting to Python 3.11 ---------------------- +* :c:func:`PyErr_SetExcInfo()` no longer uses the ``type`` and ``traceback`` + arguments, the interpreter now derives those values from the exception + instance (the ``value`` argument). The function still steals references + of all three arguments. + (Contributed by Irit Katriel in :issue:`45711`.) + +* :c:func:`PyErr_GetExcInfo()` now derives the ``type`` and ``traceback`` + fields of the result from the exception instance (the ``value`` field). + (Contributed by Irit Katriel in :issue:`45711`.) + +* :c:type:`_frozen` has a new ``is_package`` field to indicate whether + or not the frozen module is a package. Previously, a negative value + in the ``size`` field was the indicator. Now only non-negative values + be used for ``size``. + (Contributed by Kumar Aditya in :issue:`46608`.) + +* :c:func:`_PyFrameEvalFunction` now takes ``_PyInterpreterFrame*`` + as its second parameter, instead of ``PyFrameObject*``. + See :pep:`523` for more details of how to use this function pointer type. + +* :c:func:`PyCode_New` and :c:func:`PyCode_NewWithPosOnlyArgs` now take + an additional ``exception_table`` argument. + Using these functions should be avoided, if at all possible. + To get a custom code object: create a code object using the compiler, + then get a modified version with the ``replace`` method. + +* :c:type:`PyCodeObject` no longer has a ``co_code`` field. Instead, + use ``PyObject_GetAttrString(code_object, "co_code")`` or + :c:func:`PyCode_GetCode` to get the underlying bytes object. + (Contributed by Brandt Bucher in :issue:`46841` and Ken Jin in :gh:`92154`.) + * The old trashcan macros (``Py_TRASHCAN_SAFE_BEGIN``/``Py_TRASHCAN_SAFE_END``) are now deprecated. They should be replaced by the new macros ``Py_TRASHCAN_BEGIN`` and ``Py_TRASHCAN_END``. From webhook-mailer at python.org Mon May 9 06:51:17 2022 From: webhook-mailer at python.org (miss-islington) Date: Mon, 09 May 2022 10:51:17 -0000 Subject: [Python-checkins] Enhance PyConfig documentation (GH-92394) Message-ID: https://github.com/python/cpython/commit/ea58fea81877bc4609e8fe46b7ea29d894631c3e commit: ea58fea81877bc4609e8fe46b7ea29d894631c3e branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-09T03:51:11-07:00 summary: Enhance PyConfig documentation (GH-92394) (cherry picked from commit 7b9803f93fbd1f8cfcc93ae7847ba029e9183db4) Co-authored-by: Victor Stinner files: M Doc/c-api/init_config.rst diff --git a/Doc/c-api/init_config.rst b/Doc/c-api/init_config.rst index 728df2100336e..cc223a7fa4b94 100644 --- a/Doc/c-api/init_config.rst +++ b/Doc/c-api/init_config.rst @@ -97,7 +97,7 @@ PyWideStringList If *index* is greater than or equal to *list* length, append *item* to *list*. - *index* must be greater than or equal to 0. + *index* must be greater than or equal to ``0``. Python must be preinitialized to call this function. @@ -256,8 +256,8 @@ PyPreConfig Set the LC_CTYPE locale to the user preferred locale? - If equals to 0, set :c:member:`~PyPreConfig.coerce_c_locale` and - :c:member:`~PyPreConfig.coerce_c_locale_warn` members to 0. + If equals to ``0``, set :c:member:`~PyPreConfig.coerce_c_locale` and + :c:member:`~PyPreConfig.coerce_c_locale_warn` members to ``0``. See the :term:`locale encoding`. @@ -265,9 +265,9 @@ PyPreConfig .. c:member:: int coerce_c_locale - If equals to 2, coerce the C locale. + If equals to ``2``, coerce the C locale. - If equals to 1, read the LC_CTYPE locale to decide if it should be + If equals to ``1``, read the LC_CTYPE locale to decide if it should be coerced. See the :term:`locale encoding`. @@ -282,8 +282,8 @@ PyPreConfig .. c:member:: int dev_mode - If non-zero, enables the :ref:`Python Development Mode `: - see :c:member:`PyConfig.dev_mode`. + :ref:`Python Development Mode `: see + :c:member:`PyConfig.dev_mode`. Default: ``-1`` in Python mode, ``0`` in isolated mode. @@ -329,8 +329,10 @@ PyPreConfig If non-zero, enable the :ref:`Python UTF-8 Mode `. - Set by the :option:`-X utf8 <-X>` command line option and the - :envvar:`PYTHONUTF8` environment variable. + Set to ``0`` or ``1`` by the :option:`-X utf8 <-X>` command line option + and the :envvar:`PYTHONUTF8` environment variable. + + Also set to ``1`` if the ``LC_CTYPE`` locale is ``C`` or ``POSIX``. Default: ``-1`` in Python config and ``0`` in isolated config. @@ -555,7 +557,7 @@ PyConfig * Otherwise (``python -c code`` and ``python``), prepend an empty string, which means the current working directory. - Set to 1 by the :option:`-P` command line option and the + Set to ``1`` by the :option:`-P` command line option and the :envvar:`PYTHONSAFEPATH` environment variable. Default: ``0`` in Python config, ``1`` in isolated config. @@ -592,10 +594,10 @@ PyConfig .. c:member:: int buffered_stdio - If equals to 0 and :c:member:`~PyConfig.configure_c_stdio` is non-zero, + If equals to ``0`` and :c:member:`~PyConfig.configure_c_stdio` is non-zero, disable buffering on the C streams stdout and stderr. - Set to 0 by the :option:`-u` command line option and the + Set to ``0`` by the :option:`-u` command line option and the :envvar:`PYTHONUNBUFFERED` environment variable. stdin is always opened in buffered mode. @@ -604,11 +606,11 @@ PyConfig .. c:member:: int bytes_warning - If equals to 1, issue a warning when comparing :class:`bytes` or + If equals to ``1``, issue a warning when comparing :class:`bytes` or :class:`bytearray` with :class:`str`, or comparing :class:`bytes` with :class:`int`. - If equal or greater to 2, raise a :exc:`BytesWarning` exception in these + If equal or greater to ``2``, raise a :exc:`BytesWarning` exception in these cases. Incremented by the :option:`-b` command line option. @@ -671,6 +673,9 @@ PyConfig If non-zero, enable the :ref:`Python Development Mode `. + Set to ``1`` by the :option:`-X dev <-X>` option and the + :envvar:`PYTHONDEVMODE` environment variable. + Default: ``-1`` in Python mode, ``0`` in isolated mode. .. c:member:: int dump_refs @@ -800,7 +805,7 @@ PyConfig Enter interactive mode after executing a script or a command. - If greater than 0, enable inspect: when a script is passed as first + If greater than ``0``, enable inspect: when a script is passed as first argument or the -c option is used, enter interactive mode after executing the script or the command, even when :data:`sys.stdin` does not appear to be a terminal. @@ -818,7 +823,7 @@ PyConfig .. c:member:: int interactive - If greater than 0, enable the interactive mode (REPL). + If greater than ``0``, enable the interactive mode (REPL). Incremented by the :option:`-i` command line option. @@ -826,17 +831,19 @@ PyConfig .. c:member:: int isolated - If greater than 0, enable isolated mode: + If greater than ``0``, enable isolated mode: - * Set :c:member:`~PyConfig.safe_path` to 1: + * Set :c:member:`~PyConfig.safe_path` to ``1``: don't prepend a potentially unsafe path to :data:`sys.path` at Python startup. - * Set :c:member:`~PyConfig.use_environment` to 0. - * Set :c:member:`~PyConfig.user_site_directory` to 0: don't add the user + * Set :c:member:`~PyConfig.use_environment` to ``0``. + * Set :c:member:`~PyConfig.user_site_directory` to ``0``: don't add the user site directory to :data:`sys.path`. * Python REPL doesn't import :mod:`readline` nor enable default readline configuration on interactive prompts. + Set to ``1`` by the :option:`-I` command line option. + Default: ``0`` in Python mode, ``1`` in isolated mode. See also :c:member:`PyPreConfig.isolated`. @@ -906,7 +913,7 @@ PyConfig Module search paths: :data:`sys.path`. - If :c:member:`~PyConfig.module_search_paths_set` is equal to 0, + If :c:member:`~PyConfig.module_search_paths_set` is equal to ``0``, :c:func:`Py_InitializeFromConfig` will replace :c:member:`~PyConfig.module_search_paths` and sets :c:member:`~PyConfig.module_search_paths_set` to ``1``. @@ -970,7 +977,7 @@ PyConfig .. c:member:: int parser_debug - Parser debug mode. If greater than 0, turn on parser debugging output (for expert only, depending + Parser debug mode. If greater than ``0``, turn on parser debugging output (for expert only, depending on compilation options). Incremented by the :option:`-d` command line option. Set to the @@ -981,7 +988,7 @@ PyConfig .. c:member:: int pathconfig_warnings If non-zero, calculation of path configuration is allowed to log - warnings into ``stderr``. If equals to 0, suppress these warnings. + warnings into ``stderr``. If equals to ``0``, suppress these warnings. Default: ``1`` in Python mode, ``0`` in isolated mode. @@ -1031,7 +1038,7 @@ PyConfig .. c:member:: int quiet - Quiet mode. If greater than 0, don't display the copyright and version at + Quiet mode. If greater than ``0``, don't display the copyright and version at Python startup in interactive mode. Incremented by the :option:`-q` command line option. @@ -1071,7 +1078,7 @@ PyConfig Show total reference count at exit? - Set to 1 by :option:`-X showrefcount <-X>` command line option. + Set to ``1`` by :option:`-X showrefcount <-X>` command line option. Need a :ref:`debug build of Python ` (the ``Py_REF_DEBUG`` macro must be defined). @@ -1150,6 +1157,8 @@ PyConfig If equals to zero, ignore the :ref:`environment variables `. + Set to ``0`` by the :option:`-E` environment variable. + Default: ``1`` in Python config and ``0`` in isolated config. .. c:member:: int user_site_directory @@ -1164,11 +1173,11 @@ PyConfig .. c:member:: int verbose - Verbose mode. If greater than 0, print a message each time a module is + Verbose mode. If greater than ``0``, print a message each time a module is imported, showing the place (filename or built-in module) from which it is loaded. - If greater or equal to 2, print a message for each file that is checked + If greater or equal to ``2``, print a message for each file that is checked for when searching for a module. Also provides information on module cleanup at exit. @@ -1199,7 +1208,7 @@ PyConfig .. c:member:: int write_bytecode - If equal to 0, Python won't try to write ``.pyc`` files on the import of + If equal to ``0``, Python won't try to write ``.pyc`` files on the import of source modules. Set to ``0`` by the :option:`-B` command line option and the @@ -1400,18 +1409,18 @@ Python Path Configuration If at least one "output field" is not set, Python calculates the path configuration to fill unset fields. If -:c:member:`~PyConfig.module_search_paths_set` is equal to 0, +:c:member:`~PyConfig.module_search_paths_set` is equal to ``0``, :c:member:`~PyConfig.module_search_paths` is overridden and -:c:member:`~PyConfig.module_search_paths_set` is set to 1. +:c:member:`~PyConfig.module_search_paths_set` is set to ``1``. It is possible to completely ignore the function calculating the default path configuration by setting explicitly all path configuration output fields listed above. A string is considered as set even if it is non-empty. ``module_search_paths`` is considered as set if -``module_search_paths_set`` is set to 1. In this case, path +``module_search_paths_set`` is set to ``1``. In this case, path configuration input fields are ignored as well. -Set :c:member:`~PyConfig.pathconfig_warnings` to 0 to suppress warnings when +Set :c:member:`~PyConfig.pathconfig_warnings` to ``0`` to suppress warnings when calculating the path configuration (Unix only, Windows does not log any warning). If :c:member:`~PyConfig.base_prefix` or :c:member:`~PyConfig.base_exec_prefix` @@ -1445,10 +1454,10 @@ The following configuration files are used by the path configuration: If a ``._pth`` file is present: -* Set :c:member:`~PyConfig.isolated` to 1. -* Set :c:member:`~PyConfig.use_environment` to 0. -* Set :c:member:`~PyConfig.site_import` to 0. -* Set :c:member:`~PyConfig.safe_path` to 1. +* Set :c:member:`~PyConfig.isolated` to ``1``. +* Set :c:member:`~PyConfig.use_environment` to ``0``. +* Set :c:member:`~PyConfig.site_import` to ``0``. +* Set :c:member:`~PyConfig.safe_path` to ``1``. The ``__PYVENV_LAUNCHER__`` environment variable is used to set :c:member:`PyConfig.base_executable` @@ -1511,7 +1520,7 @@ initialization, the core feature of :pep:`432`: Private provisional API: -* :c:member:`PyConfig._init_main`: if set to 0, +* :c:member:`PyConfig._init_main`: if set to ``0``, :c:func:`Py_InitializeFromConfig` stops at the "Core" initialization phase. * :c:member:`PyConfig._isolated_interpreter`: if non-zero, disallow threads, subprocesses and fork. From webhook-mailer at python.org Mon May 9 06:55:50 2022 From: webhook-mailer at python.org (miss-islington) Date: Mon, 09 May 2022 10:55:50 -0000 Subject: [Python-checkins] What's New in Python 3.11: move C API changes (GH-92390) Message-ID: https://github.com/python/cpython/commit/2505e22d922b07a1f3a9f8c09dde8aae3eb19e8f commit: 2505e22d922b07a1f3a9f8c09dde8aae3eb19e8f branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-09T03:55:45-07:00 summary: What's New in Python 3.11: move C API changes (GH-92390) Move C API changes to the C API > Porting to Python 3.11 section. (cherry picked from commit d8104d13cd80737f5efe1cd94aeec5979f912cd0) Co-authored-by: Victor Stinner files: M Doc/whatsnew/3.11.rst diff --git a/Doc/whatsnew/3.11.rst b/Doc/whatsnew/3.11.rst index 793c92aaea416..ab760d166030b 100644 --- a/Doc/whatsnew/3.11.rst +++ b/Doc/whatsnew/3.11.rst @@ -1501,37 +1501,6 @@ Build Changes C API Changes ============= -* :c:func:`PyErr_SetExcInfo()` no longer uses the ``type`` and ``traceback`` - arguments, the interpreter now derives those values from the exception - instance (the ``value`` argument). The function still steals references - of all three arguments. - (Contributed by Irit Katriel in :issue:`45711`.) - -* :c:func:`PyErr_GetExcInfo()` now derives the ``type`` and ``traceback`` - fields of the result from the exception instance (the ``value`` field). - (Contributed by Irit Katriel in :issue:`45711`.) - -* :c:type:`_frozen` has a new ``is_package`` field to indicate whether - or not the frozen module is a package. Previously, a negative value - in the ``size`` field was the indicator. Now only non-negative values - be used for ``size``. - (Contributed by Kumar Aditya in :issue:`46608`.) - -* :c:func:`_PyFrameEvalFunction` now takes ``_PyInterpreterFrame*`` - as its second parameter, instead of ``PyFrameObject*``. - See :pep:`523` for more details of how to use this function pointer type. - -* :c:func:`PyCode_New` and :c:func:`PyCode_NewWithPosOnlyArgs` now take - an additional ``exception_table`` argument. - Using these functions should be avoided, if at all possible. - To get a custom code object: create a code object using the compiler, - then get a modified version with the ``replace`` method. - -* :c:type:`PyCodeObject` no longer has a ``co_code`` field. Instead, - use ``PyObject_GetAttrString(code_object, "co_code")`` or - :c:func:`PyCode_GetCode` to get the underlying bytes object. - (Contributed by Brandt Bucher in :issue:`46841` and Ken Jin in :gh:`92154`.) - New Features ------------ @@ -1598,6 +1567,37 @@ New Features Porting to Python 3.11 ---------------------- +* :c:func:`PyErr_SetExcInfo()` no longer uses the ``type`` and ``traceback`` + arguments, the interpreter now derives those values from the exception + instance (the ``value`` argument). The function still steals references + of all three arguments. + (Contributed by Irit Katriel in :issue:`45711`.) + +* :c:func:`PyErr_GetExcInfo()` now derives the ``type`` and ``traceback`` + fields of the result from the exception instance (the ``value`` field). + (Contributed by Irit Katriel in :issue:`45711`.) + +* :c:type:`_frozen` has a new ``is_package`` field to indicate whether + or not the frozen module is a package. Previously, a negative value + in the ``size`` field was the indicator. Now only non-negative values + be used for ``size``. + (Contributed by Kumar Aditya in :issue:`46608`.) + +* :c:func:`_PyFrameEvalFunction` now takes ``_PyInterpreterFrame*`` + as its second parameter, instead of ``PyFrameObject*``. + See :pep:`523` for more details of how to use this function pointer type. + +* :c:func:`PyCode_New` and :c:func:`PyCode_NewWithPosOnlyArgs` now take + an additional ``exception_table`` argument. + Using these functions should be avoided, if at all possible. + To get a custom code object: create a code object using the compiler, + then get a modified version with the ``replace`` method. + +* :c:type:`PyCodeObject` no longer has a ``co_code`` field. Instead, + use ``PyObject_GetAttrString(code_object, "co_code")`` or + :c:func:`PyCode_GetCode` to get the underlying bytes object. + (Contributed by Brandt Bucher in :issue:`46841` and Ken Jin in :gh:`92154`.) + * The old trashcan macros (``Py_TRASHCAN_SAFE_BEGIN``/``Py_TRASHCAN_SAFE_END``) are now deprecated. They should be replaced by the new macros ``Py_TRASHCAN_BEGIN`` and ``Py_TRASHCAN_END``. From webhook-mailer at python.org Mon May 9 08:26:40 2022 From: webhook-mailer at python.org (vstinner) Date: Mon, 09 May 2022 12:26:40 -0000 Subject: [Python-checkins] What's New in Python 3.12: move C API at the end (#92555) Message-ID: https://github.com/python/cpython/commit/11a608d2b1b9c10079a1fe2ebf815a638c640c79 commit: 11a608d2b1b9c10079a1fe2ebf815a638c640c79 branch: main author: Victor Stinner committer: vstinner date: 2022-05-09T14:26:30+02:00 summary: What's New in Python 3.12: move C API at the end (#92555) * Separate Build and C API changes in two sections * Add sub-sections to the C API changes files: M Doc/whatsnew/3.12.rst diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst index b73c3db040019..af8973ae20304 100644 --- a/Doc/whatsnew/3.12.rst +++ b/Doc/whatsnew/3.12.rst @@ -94,11 +94,6 @@ Optimizations -Build and C API Changes -======================= - -* :c:func:`PyFrame_BlockSetup` and :c:func:`PyFrame_BlockPop` have been removed. - Deprecated ========== @@ -124,3 +119,25 @@ Changes in the Python API The group name in bytes patterns and replacement strings can now only contain ASCII letters and digits and underscore. (Contributed by Serhiy Storchaka in :gh:`91760`.) + + +Build Changes +============= + + +C API Changes +============= + +New Features +------------ + +Porting to Python 3.12 +---------------------- + +Deprecated +---------- + +Removed +------- + +* :c:func:`PyFrame_BlockSetup` and :c:func:`PyFrame_BlockPop` have been removed. From webhook-mailer at python.org Mon May 9 09:45:34 2022 From: webhook-mailer at python.org (markshannon) Date: Mon, 09 May 2022 13:45:34 -0000 Subject: [Python-checkins] gh-91345: Talk about ``sys._getframe`` compatibility in 3.11 whatsnew (GH-92552) Message-ID: https://github.com/python/cpython/commit/be3cdd66c95806c648b6000c2b9f0e8417473eb8 commit: be3cdd66c95806c648b6000c2b9f0e8417473eb8 branch: main author: Ken Jin committer: markshannon date: 2022-05-09T14:45:13+01:00 summary: gh-91345: Talk about ``sys._getframe`` compatibility in 3.11 whatsnew (GH-92552) files: M Doc/whatsnew/3.11.rst diff --git a/Doc/whatsnew/3.11.rst b/Doc/whatsnew/3.11.rst index ab760d166030b..fd7082e9fd74d 100644 --- a/Doc/whatsnew/3.11.rst +++ b/Doc/whatsnew/3.11.rst @@ -891,10 +891,11 @@ holds execution information. The following are new frame optimizations: - Streamlined the internal frame struct to contain only essential information. Frames previously held extra debugging and memory management information. -Old-style frame objects are now created only when required by debuggers. For -most user code, no frame objects are created at all. As a result, nearly all -Python functions calls have sped up significantly. We measured a 3-7% speedup -in pyperformance. +Old-style frame objects are now created only when requested by debuggers or +by Python introspection functions such as ``sys._getframe`` or +``inspect.currentframe``. For most user code, no frame objects are +created at all. As a result, nearly all Python functions calls have sped +up significantly. We measured a 3-7% speedup in pyperformance. (Contributed by Mark Shannon in :issue:`44590`.) From webhook-mailer at python.org Mon May 9 09:47:43 2022 From: webhook-mailer at python.org (ambv) Date: Mon, 09 May 2022 13:47:43 -0000 Subject: [Python-checkins] bpo-47138: Ensure Windows docs build uses the same pinned version as other platforms (GH-32161) (#32183) Message-ID: https://github.com/python/cpython/commit/bf54487da34974a5a7c27526a44cf881c6f7a111 commit: bf54487da34974a5a7c27526a44cf881c6f7a111 branch: 3.8 author: Steve Dower committer: ambv date: 2022-05-09T15:47:32+02:00 summary: bpo-47138: Ensure Windows docs build uses the same pinned version as other platforms (GH-32161) (#32183) Co-authored-by: Ned Deily files: M Doc/make.bat diff --git a/Doc/make.bat b/Doc/make.bat index 7fde063642771..ac66b56e9a3ef 100644 --- a/Doc/make.bat +++ b/Doc/make.bat @@ -13,7 +13,7 @@ if not defined SPHINXBUILD ( %PYTHON% -c "import sphinx" > nul 2> nul if errorlevel 1 ( echo Installing sphinx with %PYTHON% - %PYTHON% -m pip install sphinx==2.2.0 + %PYTHON% -m pip install -r requirements.txt if errorlevel 1 exit /B ) set SPHINXBUILD=%PYTHON% -c "import sphinx.cmd.build, sys; sys.exit(sphinx.cmd.build.main())" @@ -30,6 +30,7 @@ if not defined BLURB ( %PYTHON% -c "import blurb" > nul 2> nul if errorlevel 1 ( echo Installing blurb with %PYTHON% + rem Should have been installed with Sphinx earlier %PYTHON% -m pip install blurb if errorlevel 1 exit /B ) From webhook-mailer at python.org Mon May 9 10:18:51 2022 From: webhook-mailer at python.org (miss-islington) Date: Mon, 09 May 2022 14:18:51 -0000 Subject: [Python-checkins] gh-91345: Talk about ``sys._getframe`` compatibility in 3.11 whatsnew (GH-92552) Message-ID: https://github.com/python/cpython/commit/1e4cdcf97f1ad759595dab7caa203b963216ac1b commit: 1e4cdcf97f1ad759595dab7caa203b963216ac1b branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-09T07:18:37-07:00 summary: gh-91345: Talk about ``sys._getframe`` compatibility in 3.11 whatsnew (GH-92552) (cherry picked from commit be3cdd66c95806c648b6000c2b9f0e8417473eb8) Co-authored-by: Ken Jin files: M Doc/whatsnew/3.11.rst diff --git a/Doc/whatsnew/3.11.rst b/Doc/whatsnew/3.11.rst index ab760d166030b..fd7082e9fd74d 100644 --- a/Doc/whatsnew/3.11.rst +++ b/Doc/whatsnew/3.11.rst @@ -891,10 +891,11 @@ holds execution information. The following are new frame optimizations: - Streamlined the internal frame struct to contain only essential information. Frames previously held extra debugging and memory management information. -Old-style frame objects are now created only when required by debuggers. For -most user code, no frame objects are created at all. As a result, nearly all -Python functions calls have sped up significantly. We measured a 3-7% speedup -in pyperformance. +Old-style frame objects are now created only when requested by debuggers or +by Python introspection functions such as ``sys._getframe`` or +``inspect.currentframe``. For most user code, no frame objects are +created at all. As a result, nearly all Python functions calls have sped +up significantly. We measured a 3-7% speedup in pyperformance. (Contributed by Mark Shannon in :issue:`44590`.) From webhook-mailer at python.org Mon May 9 12:41:38 2022 From: webhook-mailer at python.org (zooba) Date: Mon, 09 May 2022 16:41:38 -0000 Subject: [Python-checkins] gh-86019: Add table for Windows installer options (GH-91809) Message-ID: https://github.com/python/cpython/commit/e3fa60b937ccf2e92f92d89b981ad2549afa4a82 commit: e3fa60b937ccf2e92f92d89b981ad2549afa4a82 branch: main author: slateny <46876382+slateny at users.noreply.github.com> committer: zooba date: 2022-05-09T17:40:51+01:00 summary: gh-86019: Add table for Windows installer options (GH-91809) files: M Doc/using/windows.rst diff --git a/Doc/using/windows.rst b/Doc/using/windows.rst index 88dcb002e2c24..1d1be20bea25f 100644 --- a/Doc/using/windows.rst +++ b/Doc/using/windows.rst @@ -126,11 +126,24 @@ command line, allowing scripted installers to replicate an installation on many machines without user interaction. These options may also be set without suppressing the UI in order to change some of the defaults. -To completely hide the installer UI and install Python silently, pass the -``/quiet`` option. To skip past the user interaction but still display -progress and errors, pass the ``/passive`` option. The ``/uninstall`` -option may be passed to immediately begin removing Python - no confirmation -prompt will be displayed. +The following options (found by executing the installer with ``/?``) can be +passed into the installer: + ++---------------------+--------------------------------------------------------+ +| Name | Description | ++=====================+========================================================+ +| /passive | to display progress without requiring user interaction | ++---------------------+--------------------------------------------------------+ +| /quiet | to install/uninstall without displaying any UI | ++---------------------+--------------------------------------------------------+ +| /simple | to prevent user customization | ++---------------------+--------------------------------------------------------+ +| /uninstall | to remove Python (without confirmation) | ++---------------------+--------------------------------------------------------+ +| /layout [directory] | to pre-download all components | ++---------------------+--------------------------------------------------------+ +| /log [filename] | to specify log files location | ++---------------------+--------------------------------------------------------+ All other options are passed as ``name=value``, where the value is usually ``0`` to disable a feature, ``1`` to enable a feature, or a path. The full list From webhook-mailer at python.org Mon May 9 12:49:33 2022 From: webhook-mailer at python.org (miss-islington) Date: Mon, 09 May 2022 16:49:33 -0000 Subject: [Python-checkins] gh-92417: `asyncio` docs: `asyncio.run()` is available on all supported Python versions (GH-92419) Message-ID: https://github.com/python/cpython/commit/ad82e1244e000e13d0079c5be44e5591d6596419 commit: ad82e1244e000e13d0079c5be44e5591d6596419 branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-09T09:49:25-07:00 summary: gh-92417: `asyncio` docs: `asyncio.run()` is available on all supported Python versions (GH-92419) (cherry picked from commit f4e317b304c7f86e48885b4b74c7a8826648922c) Co-authored-by: Alex Waygood files: M Doc/library/asyncio.rst diff --git a/Doc/library/asyncio.rst b/Doc/library/asyncio.rst index 94a853259d348..a6429394389b1 100644 --- a/Doc/library/asyncio.rst +++ b/Doc/library/asyncio.rst @@ -17,7 +17,6 @@ await asyncio.sleep(1) print('... World!') - # Python 3.7+ asyncio.run(main()) asyncio is a library to write **concurrent** code using From webhook-mailer at python.org Mon May 9 13:39:19 2022 From: webhook-mailer at python.org (pablogsal) Date: Mon, 09 May 2022 17:39:19 -0000 Subject: [Python-checkins] gh-91731: Add macro compatibility for static_assert for old libcs (GH-92559) Message-ID: https://github.com/python/cpython/commit/f0614ca9801d0768094570b784d2b26936bcca34 commit: f0614ca9801d0768094570b784d2b26936bcca34 branch: main author: Pablo Galindo Salgado committer: pablogsal date: 2022-05-09T18:38:38+01:00 summary: gh-91731: Add macro compatibility for static_assert for old libcs (GH-92559) files: M Include/pymacro.h diff --git a/Include/pymacro.h b/Include/pymacro.h index 71d6714afd112..5037bbd013801 100644 --- a/Include/pymacro.h +++ b/Include/pymacro.h @@ -10,6 +10,14 @@ # define static_assert _Static_assert #endif +// static_assert is defined in GLIB from version 2.16. Before it requires +// compiler support (gcc >= 4.6) and is called _Static_assert. +#if (defined(__GLIBC__) \ + && (__GLIBC__ < 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ <= 16)) \ + && !defined(static_assert)) +# define static_assert _Static_assert +#endif + /* Minimum value between x and y */ #define Py_MIN(x, y) (((x) > (y)) ? (y) : (x)) From webhook-mailer at python.org Mon May 9 14:32:54 2022 From: webhook-mailer at python.org (ned-deily) Date: Mon, 09 May 2022 18:32:54 -0000 Subject: [Python-checkins] gh-92171: Update Tcl/Tk download links in macOS installer script (GH-92179) Message-ID: https://github.com/python/cpython/commit/6ecf594baaf4488834ed1e841923d484230b0bfb commit: 6ecf594baaf4488834ed1e841923d484230b0bfb branch: main author: Erlend Egeberg Aasland committer: ned-deily date: 2022-05-09T14:32:21-04:00 summary: gh-92171: Update Tcl/Tk download links in macOS installer script (GH-92179) files: M Mac/BuildScript/build-installer.py diff --git a/Mac/BuildScript/build-installer.py b/Mac/BuildScript/build-installer.py index b5bffaff4ed0d..50b55f9cd1da8 100755 --- a/Mac/BuildScript/build-installer.py +++ b/Mac/BuildScript/build-installer.py @@ -271,10 +271,11 @@ def library_recipes(): tk_patches = [ ] + base_url = "https://prdownloads.sourceforge.net/tcl/{what}{version}-src.tar.gz" result.extend([ dict( name="Tcl %s"%(tcl_tk_ver,), - url="ftp://ftp.tcl.tk/pub/tcl//tcl8_6/tcl%s-src.tar.gz"%(tcl_tk_ver,), + url=base_url.format(what="tcl", version=tcl_tk_ver), checksum=tcl_checksum, buildDir="unix", configure_pre=[ @@ -291,7 +292,7 @@ def library_recipes(): ), dict( name="Tk %s"%(tcl_tk_ver,), - url="ftp://ftp.tcl.tk/pub/tcl//tcl8_6/tk%s-src.tar.gz"%(tcl_tk_ver,), + url=base_url.format(what="tk", version=tcl_tk_ver), checksum=tk_checksum, patches=tk_patches, buildDir="unix", From webhook-mailer at python.org Mon May 9 15:35:51 2022 From: webhook-mailer at python.org (pablogsal) Date: Mon, 09 May 2022 19:35:51 -0000 Subject: [Python-checkins] gh-91731: Add macro compatibility for static_assert for old libcs (GH-92559) (#92566) Message-ID: https://github.com/python/cpython/commit/57ff4984e66673ee8bc1534063b591a3b9450e94 commit: 57ff4984e66673ee8bc1534063b591a3b9450e94 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: pablogsal date: 2022-05-09T20:35:42+01:00 summary: gh-91731: Add macro compatibility for static_assert for old libcs (GH-92559) (#92566) (cherry picked from commit f0614ca9801d0768094570b784d2b26936bcca34) Co-authored-by: Pablo Galindo Salgado Co-authored-by: Pablo Galindo Salgado files: M Include/pymacro.h diff --git a/Include/pymacro.h b/Include/pymacro.h index 71d6714afd112..5037bbd013801 100644 --- a/Include/pymacro.h +++ b/Include/pymacro.h @@ -10,6 +10,14 @@ # define static_assert _Static_assert #endif +// static_assert is defined in GLIB from version 2.16. Before it requires +// compiler support (gcc >= 4.6) and is called _Static_assert. +#if (defined(__GLIBC__) \ + && (__GLIBC__ < 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ <= 16)) \ + && !defined(static_assert)) +# define static_assert _Static_assert +#endif + /* Minimum value between x and y */ #define Py_MIN(x, y) (((x) > (y)) ? (y) : (x)) From webhook-mailer at python.org Mon May 9 17:10:28 2022 From: webhook-mailer at python.org (JulienPalard) Date: Mon, 09 May 2022 21:10:28 -0000 Subject: [Python-checkins] Doc: Update py2app link. (#91585) Message-ID: https://github.com/python/cpython/commit/b77a95f44a024d1afab28e380252aa6d9c4efb1c commit: b77a95f44a024d1afab28e380252aa6d9c4efb1c branch: main author: Julien Palard committer: JulienPalard date: 2022-05-09T23:10:19+02:00 summary: Doc: Update py2app link. (#91585) See: https://mail.python.org/archives/list/docs at python.org/thread/KDVFGNGGUGGPVRZT7WZYHHWXCRS2GEN7/ files: M Doc/using/mac.rst diff --git a/Doc/using/mac.rst b/Doc/using/mac.rst index 2f132a96bef08..f7db038430b6d 100644 --- a/Doc/using/mac.rst +++ b/Doc/using/mac.rst @@ -160,7 +160,7 @@ Distributing Python Applications on the Mac The standard tool for deploying standalone Python applications on the Mac is :program:`py2app`. More information on installing and using py2app can be found -at http://undefined.org/python/#py2app. +at https://pypi.org/project/py2app/. Other Resources From webhook-mailer at python.org Mon May 9 17:25:48 2022 From: webhook-mailer at python.org (miss-islington) Date: Mon, 09 May 2022 21:25:48 -0000 Subject: [Python-checkins] Doc: Update py2app link. (GH-91585) Message-ID: https://github.com/python/cpython/commit/b7b7b4fcf8a4f26b524bc2b6a0cfe00177e7701a commit: b7b7b4fcf8a4f26b524bc2b6a0cfe00177e7701a branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-09T14:25:33-07:00 summary: Doc: Update py2app link. (GH-91585) See: https://mail.python.org/archives/list/docs at python.org/thread/KDVFGNGGUGGPVRZT7WZYHHWXCRS2GEN7/ (cherry picked from commit b77a95f44a024d1afab28e380252aa6d9c4efb1c) Co-authored-by: Julien Palard files: M Doc/using/mac.rst diff --git a/Doc/using/mac.rst b/Doc/using/mac.rst index 2f132a96bef08..f7db038430b6d 100644 --- a/Doc/using/mac.rst +++ b/Doc/using/mac.rst @@ -160,7 +160,7 @@ Distributing Python Applications on the Mac The standard tool for deploying standalone Python applications on the Mac is :program:`py2app`. More information on installing and using py2app can be found -at http://undefined.org/python/#py2app. +at https://pypi.org/project/py2app/. Other Resources From webhook-mailer at python.org Mon May 9 17:28:51 2022 From: webhook-mailer at python.org (miss-islington) Date: Mon, 09 May 2022 21:28:51 -0000 Subject: [Python-checkins] Doc: Update py2app link. (GH-91585) Message-ID: https://github.com/python/cpython/commit/826ceab4884c667ca69ee222af1b6dcf1d49b91d commit: 826ceab4884c667ca69ee222af1b6dcf1d49b91d branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-09T14:28:40-07:00 summary: Doc: Update py2app link. (GH-91585) See: https://mail.python.org/archives/list/docs at python.org/thread/KDVFGNGGUGGPVRZT7WZYHHWXCRS2GEN7/ (cherry picked from commit b77a95f44a024d1afab28e380252aa6d9c4efb1c) Co-authored-by: Julien Palard files: M Doc/using/mac.rst diff --git a/Doc/using/mac.rst b/Doc/using/mac.rst index 2f132a96bef08..f7db038430b6d 100644 --- a/Doc/using/mac.rst +++ b/Doc/using/mac.rst @@ -160,7 +160,7 @@ Distributing Python Applications on the Mac The standard tool for deploying standalone Python applications on the Mac is :program:`py2app`. More information on installing and using py2app can be found -at http://undefined.org/python/#py2app. +at https://pypi.org/project/py2app/. Other Resources From webhook-mailer at python.org Mon May 9 17:31:24 2022 From: webhook-mailer at python.org (miss-islington) Date: Mon, 09 May 2022 21:31:24 -0000 Subject: [Python-checkins] Doc: Update py2app link. (GH-91585) Message-ID: https://github.com/python/cpython/commit/249be828e475202fd6f63fc357be75eca1267c9f commit: 249be828e475202fd6f63fc357be75eca1267c9f branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-09T14:31:12-07:00 summary: Doc: Update py2app link. (GH-91585) See: https://mail.python.org/archives/list/docs at python.org/thread/KDVFGNGGUGGPVRZT7WZYHHWXCRS2GEN7/ (cherry picked from commit b77a95f44a024d1afab28e380252aa6d9c4efb1c) Co-authored-by: Julien Palard files: M Doc/using/mac.rst diff --git a/Doc/using/mac.rst b/Doc/using/mac.rst index 2f132a96bef08..f7db038430b6d 100644 --- a/Doc/using/mac.rst +++ b/Doc/using/mac.rst @@ -160,7 +160,7 @@ Distributing Python Applications on the Mac The standard tool for deploying standalone Python applications on the Mac is :program:`py2app`. More information on installing and using py2app can be found -at http://undefined.org/python/#py2app. +at https://pypi.org/project/py2app/. Other Resources From webhook-mailer at python.org Mon May 9 17:37:11 2022 From: webhook-mailer at python.org (erlend-aasland) Date: Mon, 09 May 2022 21:37:11 -0000 Subject: [Python-checkins] bpo-46907: Update Windows installer to SQLite 3.38.4. (#92322) Message-ID: https://github.com/python/cpython/commit/22bddc864d3cc04ed218beb3b706ff1790db836a commit: 22bddc864d3cc04ed218beb3b706ff1790db836a branch: main author: Mariusz Felisiak committer: erlend-aasland date: 2022-05-09T23:37:01+02:00 summary: bpo-46907: Update Windows installer to SQLite 3.38.4. (#92322) files: A Misc/NEWS.d/next/Windows/2022-05-05-06-27-59.bpo-46907.IW-uvT.rst M PCbuild/get_externals.bat M PCbuild/python.props M PCbuild/readme.txt diff --git a/Misc/NEWS.d/next/Windows/2022-05-05-06-27-59.bpo-46907.IW-uvT.rst b/Misc/NEWS.d/next/Windows/2022-05-05-06-27-59.bpo-46907.IW-uvT.rst new file mode 100644 index 0000000000000..420fbd210ef19 --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2022-05-05-06-27-59.bpo-46907.IW-uvT.rst @@ -0,0 +1 @@ +Update Windows installer to use SQLite 3.38.4. diff --git a/PCbuild/get_externals.bat b/PCbuild/get_externals.bat index 4241baadec4bd..d293445179885 100644 --- a/PCbuild/get_externals.bat +++ b/PCbuild/get_externals.bat @@ -54,7 +54,7 @@ set libraries= set libraries=%libraries% bzip2-1.0.8 if NOT "%IncludeLibffiSrc%"=="false" set libraries=%libraries% libffi-3.4.2 if NOT "%IncludeSSLSrc%"=="false" set libraries=%libraries% openssl-1.1.1n -set libraries=%libraries% sqlite-3.38.3.0 +set libraries=%libraries% sqlite-3.38.4.0 if NOT "%IncludeTkinterSrc%"=="false" set libraries=%libraries% tcl-core-8.6.12.1 if NOT "%IncludeTkinterSrc%"=="false" set libraries=%libraries% tk-8.6.12.1 if NOT "%IncludeTkinterSrc%"=="false" set libraries=%libraries% tix-8.4.3.6 diff --git a/PCbuild/python.props b/PCbuild/python.props index e50fdc0aa61f3..7f10e7c45ef7b 100644 --- a/PCbuild/python.props +++ b/PCbuild/python.props @@ -61,7 +61,7 @@ $(EXTERNALS_DIR) $([System.IO.Path]::GetFullPath(`$(PySourcePath)externals`)) $(ExternalsDir)\ - $(ExternalsDir)sqlite-3.38.3.0\ + $(ExternalsDir)sqlite-3.38.4.0\ $(ExternalsDir)bzip2-1.0.8\ $(ExternalsDir)xz-5.2.5\ $(ExternalsDir)libffi-3.4.2\ diff --git a/PCbuild/readme.txt b/PCbuild/readme.txt index da8947c938b51..2c820e54c2cb1 100644 --- a/PCbuild/readme.txt +++ b/PCbuild/readme.txt @@ -189,7 +189,7 @@ _ssl again when building. _sqlite3 - Wraps SQLite 3.38.3, which is itself built by sqlite3.vcxproj + Wraps SQLite 3.38.4, which is itself built by sqlite3.vcxproj Homepage: http://www.sqlite.org/ _tkinter From webhook-mailer at python.org Mon May 9 18:07:35 2022 From: webhook-mailer at python.org (miss-islington) Date: Mon, 09 May 2022 22:07:35 -0000 Subject: [Python-checkins] bpo-46907: Update Windows installer to SQLite 3.38.4. (GH-92322) Message-ID: https://github.com/python/cpython/commit/a86229e82475e5e5e46327641a2be1628c7233ae commit: a86229e82475e5e5e46327641a2be1628c7233ae branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-09T15:07:29-07:00 summary: bpo-46907: Update Windows installer to SQLite 3.38.4. (GH-92322) (cherry picked from commit 22bddc864d3cc04ed218beb3b706ff1790db836a) Co-authored-by: Mariusz Felisiak files: A Misc/NEWS.d/next/Windows/2022-05-05-06-27-59.bpo-46907.IW-uvT.rst M PCbuild/get_externals.bat M PCbuild/python.props M PCbuild/readme.txt diff --git a/Misc/NEWS.d/next/Windows/2022-05-05-06-27-59.bpo-46907.IW-uvT.rst b/Misc/NEWS.d/next/Windows/2022-05-05-06-27-59.bpo-46907.IW-uvT.rst new file mode 100644 index 0000000000000..420fbd210ef19 --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2022-05-05-06-27-59.bpo-46907.IW-uvT.rst @@ -0,0 +1 @@ +Update Windows installer to use SQLite 3.38.4. diff --git a/PCbuild/get_externals.bat b/PCbuild/get_externals.bat index 4241baadec4bd..d293445179885 100644 --- a/PCbuild/get_externals.bat +++ b/PCbuild/get_externals.bat @@ -54,7 +54,7 @@ set libraries= set libraries=%libraries% bzip2-1.0.8 if NOT "%IncludeLibffiSrc%"=="false" set libraries=%libraries% libffi-3.4.2 if NOT "%IncludeSSLSrc%"=="false" set libraries=%libraries% openssl-1.1.1n -set libraries=%libraries% sqlite-3.38.3.0 +set libraries=%libraries% sqlite-3.38.4.0 if NOT "%IncludeTkinterSrc%"=="false" set libraries=%libraries% tcl-core-8.6.12.1 if NOT "%IncludeTkinterSrc%"=="false" set libraries=%libraries% tk-8.6.12.1 if NOT "%IncludeTkinterSrc%"=="false" set libraries=%libraries% tix-8.4.3.6 diff --git a/PCbuild/python.props b/PCbuild/python.props index e50fdc0aa61f3..7f10e7c45ef7b 100644 --- a/PCbuild/python.props +++ b/PCbuild/python.props @@ -61,7 +61,7 @@ $(EXTERNALS_DIR) $([System.IO.Path]::GetFullPath(`$(PySourcePath)externals`)) $(ExternalsDir)\ - $(ExternalsDir)sqlite-3.38.3.0\ + $(ExternalsDir)sqlite-3.38.4.0\ $(ExternalsDir)bzip2-1.0.8\ $(ExternalsDir)xz-5.2.5\ $(ExternalsDir)libffi-3.4.2\ diff --git a/PCbuild/readme.txt b/PCbuild/readme.txt index da8947c938b51..2c820e54c2cb1 100644 --- a/PCbuild/readme.txt +++ b/PCbuild/readme.txt @@ -189,7 +189,7 @@ _ssl again when building. _sqlite3 - Wraps SQLite 3.38.3, which is itself built by sqlite3.vcxproj + Wraps SQLite 3.38.4, which is itself built by sqlite3.vcxproj Homepage: http://www.sqlite.org/ _tkinter From webhook-mailer at python.org Mon May 9 18:43:03 2022 From: webhook-mailer at python.org (zooba) Date: Mon, 09 May 2022 22:43:03 -0000 Subject: [Python-checkins] bpo-46785: Fix race condition between os.stat() and unlink on Windows (GH-31858) Message-ID: https://github.com/python/cpython/commit/1fb25a96aeceae4b8615a7ab550bf7538353e5c5 commit: 1fb25a96aeceae4b8615a7ab550bf7538353e5c5 branch: 3.9 author: Itai Steinherz committer: zooba date: 2022-05-09T23:42:59+01:00 summary: bpo-46785: Fix race condition between os.stat() and unlink on Windows (GH-31858) * [3.9] bpo-46785: Fix race condition between os.stat() and unlink on Windows (GH-31858). (cherry picked from commit 39e6b8ae6a5b49bb23746fdcc354d148ff2d98e3) Co-authored-by: Itai Steinherz files: A Misc/NEWS.d/next/Windows/2022-03-13-20-35-41.bpo-46785.Pnknyl.rst M Lib/test/test_os.py M Misc/ACKS M Modules/posixmodule.c diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py index e48157a3de26d..78dd3151b36f9 100644 --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -23,6 +23,7 @@ import sys import sysconfig import tempfile +import textwrap import threading import time import types @@ -2714,6 +2715,48 @@ def test_getfinalpathname_handles(self): self.assertEqual(0, handle_delta) + def test_stat_unlink_race(self): + # bpo-46785: the implementation of os.stat() falls back to reading + # the parent directory if CreateFileW() fails with a permission + # error. If reading the parent directory fails because the file or + # directory are subsequently unlinked, or because the volume or + # share are no longer available, then the original permission error + # should not be restored. + filename = support.TESTFN + self.addCleanup(support.unlink, filename) + deadline = time.time() + 5 + command = textwrap.dedent("""\ + import os + import sys + import time + + filename = sys.argv[1] + deadline = float(sys.argv[2]) + + while time.time() < deadline: + try: + with open(filename, "w") as f: + pass + except OSError: + pass + try: + os.remove(filename) + except OSError: + pass + """) + + with subprocess.Popen([sys.executable, '-c', command, filename, str(deadline)]) as proc: + while time.time() < deadline: + try: + os.stat(filename) + except FileNotFoundError as e: + assert e.winerror == 2 # ERROR_FILE_NOT_FOUND + try: + proc.wait(1) + except subprocess.TimeoutExpired: + proc.terminate() + + @support.skip_unless_symlink class NonLocalSymlinkTests(unittest.TestCase): diff --git a/Misc/ACKS b/Misc/ACKS index d6b9650f642a9..a9f15b4f96726 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1664,6 +1664,7 @@ Anthony Starks David Steele Oliver Steele Greg Stein +Itai Steinherz Marek Stepniowski Baruch Sterin Chris Stern diff --git a/Misc/NEWS.d/next/Windows/2022-03-13-20-35-41.bpo-46785.Pnknyl.rst b/Misc/NEWS.d/next/Windows/2022-03-13-20-35-41.bpo-46785.Pnknyl.rst new file mode 100644 index 0000000000000..0a87abd77c8ff --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2022-03-13-20-35-41.bpo-46785.Pnknyl.rst @@ -0,0 +1 @@ +Fix race condition between :func:`os.stat` and unlinking a file on Windows, by using errors codes returned by ``FindFirstFileW()`` when appropriate in ``win32_xstat_impl``. diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 29d61268e1b5d..1270af735e2b2 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -1853,7 +1853,17 @@ win32_xstat_impl(const wchar_t *path, struct _Py_stat_struct *result, /* Try reading the parent directory. */ if (!attributes_from_dir(path, &fileInfo, &tagInfo.ReparseTag)) { /* Cannot read the parent directory. */ - SetLastError(error); + switch (GetLastError()) { + case ERROR_FILE_NOT_FOUND: /* File cannot be found */ + case ERROR_PATH_NOT_FOUND: /* File parent directory cannot be found */ + case ERROR_NOT_READY: /* Drive exists but unavailable */ + case ERROR_BAD_NET_NAME: /* Remote drive unavailable */ + break; + /* Restore the error from CreateFileW(). */ + default: + SetLastError(error); + } + return -1; } if (fileInfo.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) { From webhook-mailer at python.org Mon May 9 19:04:09 2022 From: webhook-mailer at python.org (gpshead) Date: Mon, 09 May 2022 23:04:09 -0000 Subject: [Python-checkins] gh-88750: Remove the PYTHONTHREADDEBUG env var support. (#92509) Message-ID: https://github.com/python/cpython/commit/6ed7c353b8ded48a9128413f35921ddc4e5b1065 commit: 6ed7c353b8ded48a9128413f35921ddc4e5b1065 branch: main author: Gregory P. Smith committer: gpshead date: 2022-05-09T16:03:46-07:00 summary: gh-88750: Remove the PYTHONTHREADDEBUG env var support. (#92509) Remove the `PYTHONTHREADDEBUG` env var support. Remove no-op dprintf() macro calls. files: A Misc/NEWS.d/next/Core and Builtins/2022-05-08-19-43-31.gh-issue-88750.1BjJg-.rst M Doc/using/cmdline.rst M Doc/using/configure.rst M Lib/test/test_threading.py M Misc/python.man M Python/pylifecycle.c M Python/thread.c M Python/thread_nt.h M Python/thread_pthread.h diff --git a/Doc/using/cmdline.rst b/Doc/using/cmdline.rst index 668459f352008..bc54ed8691825 100644 --- a/Doc/using/cmdline.rst +++ b/Doc/using/cmdline.rst @@ -999,15 +999,6 @@ conflict. Debug-mode variables ~~~~~~~~~~~~~~~~~~~~ -.. envvar:: PYTHONTHREADDEBUG - - If set, Python will print threading debug info into stdout. - - Need a :ref:`debug build of Python `. - - .. deprecated-removed:: 3.10 3.12 - - .. envvar:: PYTHONDUMPREFS If set, Python will dump objects and reference counts still alive after diff --git a/Doc/using/configure.rst b/Doc/using/configure.rst index 4bf9b84e6b90f..d61647f5ea71e 100644 --- a/Doc/using/configure.rst +++ b/Doc/using/configure.rst @@ -278,7 +278,6 @@ Effects of a debug build: * Add ``d`` to :data:`sys.abiflags`. * Add :func:`sys.gettotalrefcount` function. * Add :option:`-X showrefcount <-X>` command line option. -* Add :envvar:`PYTHONTHREADDEBUG` environment variable. * Add support for the ``__lltrace__`` variable: enable low-level tracing in the bytecode evaluation loop if the variable is defined. * Install :ref:`debug hooks on memory allocators ` diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py index f7dea136a87c0..a1bf354e65e2e 100644 --- a/Lib/test/test_threading.py +++ b/Lib/test/test_threading.py @@ -945,16 +945,6 @@ def noop(): pass threading.Thread(target=noop).start() # Thread.join() is not called - @unittest.skipUnless(Py_DEBUG, 'need debug build (Py_DEBUG)') - def test_debug_deprecation(self): - # bpo-44584: The PYTHONTHREADDEBUG environment variable is deprecated - rc, out, err = assert_python_ok("-Wdefault", "-c", "pass", - PYTHONTHREADDEBUG="1") - msg = (b'DeprecationWarning: The threading debug ' - b'(PYTHONTHREADDEBUG environment variable) ' - b'is deprecated and will be removed in Python 3.12') - self.assertIn(msg, err) - def test_import_from_another_thread(self): # bpo-1596321: If the threading module is first import from a thread # different than the main thread, threading._shutdown() must handle diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-08-19-43-31.gh-issue-88750.1BjJg-.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-08-19-43-31.gh-issue-88750.1BjJg-.rst new file mode 100644 index 0000000000000..bc8d41397c00c --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-05-08-19-43-31.gh-issue-88750.1BjJg-.rst @@ -0,0 +1,2 @@ +The deprecated debug build only ``PYTHONTHREADDEBUG`` environment variable +no longer does anything. diff --git a/Misc/python.man b/Misc/python.man index c2e7e507e2fd6..69dab58a9aac2 100644 --- a/Misc/python.man +++ b/Misc/python.man @@ -560,9 +560,6 @@ can be set to the callable of your debugger of choice. Setting these variables only has an effect in a debug build of Python, that is, if Python was configured with the \fB\--with-pydebug\fP build option. -.IP PYTHONTHREADDEBUG -If this environment variable is set, Python will print threading debug info. -The feature is deprecated in Python 3.10 and will be removed in Python 3.12. .IP PYTHONDUMPREFS If this environment variable is set, Python will dump objects and reference counts still alive after shutting down the interpreter. diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 273f6d62b2a20..8644b5b68b6c5 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -1091,8 +1091,6 @@ pyinit_main_reconfigure(PyThreadState *tstate) static PyStatus init_interp_main(PyThreadState *tstate) { - extern void _PyThread_debug_deprecation(void); - assert(!_PyErr_Occurred(tstate)); PyStatus status; @@ -1194,9 +1192,6 @@ init_interp_main(PyThreadState *tstate) #endif } - // Warn about PYTHONTHREADDEBUG deprecation - _PyThread_debug_deprecation(); - assert(!_PyErr_Occurred(tstate)); return _PyStatus_OK(); diff --git a/Python/thread.c b/Python/thread.c index e80e8a906bc8e..846f02545271c 100644 --- a/Python/thread.c +++ b/Python/thread.c @@ -42,14 +42,6 @@ #endif /* _POSIX_THREADS */ - -#ifdef Py_DEBUG -static int thread_debug = 0; -# define dprintf(args) (void)((thread_debug & 1) && printf args) -#else -# define dprintf(args) -#endif - static int initialized; static void PyThread__init_thread(void); /* Forward */ @@ -57,42 +49,12 @@ static void PyThread__init_thread(void); /* Forward */ void PyThread_init_thread(void) { -#ifdef Py_DEBUG - const char *p = Py_GETENV("PYTHONTHREADDEBUG"); - - if (p) { - if (*p) - thread_debug = atoi(p); - else - thread_debug = 1; - } -#endif /* Py_DEBUG */ if (initialized) return; initialized = 1; - dprintf(("PyThread_init_thread called\n")); PyThread__init_thread(); } -void -_PyThread_debug_deprecation(void) -{ -#ifdef Py_DEBUG - if (thread_debug) { - // Flush previous dprintf() logs - fflush(stdout); - if (PyErr_WarnEx(PyExc_DeprecationWarning, - "The threading debug (PYTHONTHREADDEBUG environment " - "variable) is deprecated and will be removed " - "in Python 3.12", - 0)) - { - _PyErr_WriteUnraisableMsg("at Python startup", NULL); - } - } -#endif -} - #if defined(_POSIX_THREADS) # define PYTHREAD_NAME "pthread" # include "thread_pthread.h" diff --git a/Python/thread_nt.h b/Python/thread_nt.h index 084bd58731487..b1defad426591 100644 --- a/Python/thread_nt.h +++ b/Python/thread_nt.h @@ -188,8 +188,6 @@ PyThread_start_new_thread(void (*func)(void *), void *arg) unsigned threadID; callobj *obj; - dprintf(("%lu: PyThread_start_new_thread called\n", - PyThread_get_thread_ident())); if (!initialized) PyThread_init_thread(); @@ -209,14 +207,10 @@ PyThread_start_new_thread(void (*func)(void *), void *arg) * too many threads". */ int e = errno; - dprintf(("%lu: PyThread_start_new_thread failed, errno %d\n", - PyThread_get_thread_ident(), e)); threadID = (unsigned)-1; HeapFree(GetProcessHeap(), 0, obj); } else { - dprintf(("%lu: PyThread_start_new_thread succeeded: %p\n", - PyThread_get_thread_ident(), (void*)hThread)); CloseHandle(hThread); } return threadID; @@ -257,7 +251,6 @@ PyThread_get_thread_native_id(void) void _Py_NO_RETURN PyThread_exit_thread(void) { - dprintf(("%lu: PyThread_exit_thread called\n", PyThread_get_thread_ident())); if (!initialized) exit(0); _endthreadex(0); @@ -273,22 +266,17 @@ PyThread_allocate_lock(void) { PNRMUTEX aLock; - dprintf(("PyThread_allocate_lock called\n")); if (!initialized) PyThread_init_thread(); aLock = AllocNonRecursiveMutex() ; - dprintf(("%lu: PyThread_allocate_lock() -> %p\n", PyThread_get_thread_ident(), aLock)); - return (PyThread_type_lock) aLock; } void PyThread_free_lock(PyThread_type_lock aLock) { - dprintf(("%lu: PyThread_free_lock(%p) called\n", PyThread_get_thread_ident(),aLock)); - FreeNonRecursiveMutex(aLock) ; } @@ -333,9 +321,6 @@ PyThread_acquire_lock_timed(PyThread_type_lock aLock, milliseconds = INFINITE; } - dprintf(("%lu: PyThread_acquire_lock_timed(%p, %lld) called\n", - PyThread_get_thread_ident(), aLock, microseconds)); - if (aLock && EnterNonRecursiveMutex((PNRMUTEX)aLock, (DWORD)milliseconds) == WAIT_OBJECT_0) { success = PY_LOCK_ACQUIRED; @@ -344,9 +329,6 @@ PyThread_acquire_lock_timed(PyThread_type_lock aLock, success = PY_LOCK_FAILURE; } - dprintf(("%lu: PyThread_acquire_lock(%p, %lld) -> %d\n", - PyThread_get_thread_ident(), aLock, microseconds, success)); - return success; } int @@ -358,10 +340,9 @@ PyThread_acquire_lock(PyThread_type_lock aLock, int waitflag) void PyThread_release_lock(PyThread_type_lock aLock) { - dprintf(("%lu: PyThread_release_lock(%p) called\n", PyThread_get_thread_ident(),aLock)); - - if (!(aLock && LeaveNonRecursiveMutex((PNRMUTEX) aLock))) - dprintf(("%lu: Could not PyThread_release_lock(%p) error: %ld\n", PyThread_get_thread_ident(), aLock, GetLastError())); + if (aLock) { + (void)LeaveNonRecursiveMutex((PNRMUTEX) aLock); + } } /* minimum/maximum thread stack sizes supported */ diff --git a/Python/thread_pthread.h b/Python/thread_pthread.h index c90ab25d4841d..2237018e9cbc2 100644 --- a/Python/thread_pthread.h +++ b/Python/thread_pthread.h @@ -252,7 +252,6 @@ PyThread_start_new_thread(void (*func)(void *), void *arg) size_t tss; #endif - dprintf(("PyThread_start_new_thread called\n")); if (!initialized) PyThread_init_thread(); @@ -358,7 +357,6 @@ PyThread_get_thread_native_id(void) void _Py_NO_RETURN PyThread_exit_thread(void) { - dprintf(("PyThread_exit_thread called\n")); if (!initialized) exit(0); pthread_exit(0); @@ -376,7 +374,6 @@ PyThread_allocate_lock(void) sem_t *lock; int status, error = 0; - dprintf(("PyThread_allocate_lock called\n")); if (!initialized) PyThread_init_thread(); @@ -392,7 +389,6 @@ PyThread_allocate_lock(void) } } - dprintf(("PyThread_allocate_lock() -> %p\n", (void *)lock)); return (PyThread_type_lock)lock; } @@ -403,7 +399,6 @@ PyThread_free_lock(PyThread_type_lock lock) int status, error = 0; (void) error; /* silence unused-but-set-variable warning */ - dprintf(("PyThread_free_lock(%p) called\n", lock)); if (!thelock) return; @@ -435,8 +430,6 @@ PyThread_acquire_lock_timed(PyThread_type_lock lock, PY_TIMEOUT_T microseconds, int status, error = 0; (void) error; /* silence unused-but-set-variable warning */ - dprintf(("PyThread_acquire_lock_timed(%p, %lld, %d) called\n", - lock, microseconds, intr_flag)); _PyTime_t timeout; // relative timeout if (microseconds >= 0) { @@ -544,8 +537,6 @@ PyThread_acquire_lock_timed(PyThread_type_lock lock, PY_TIMEOUT_T microseconds, success = PY_LOCK_FAILURE; } - dprintf(("PyThread_acquire_lock_timed(%p, %lld, %d) -> %d\n", - lock, microseconds, intr_flag, success)); return success; } @@ -556,7 +547,6 @@ PyThread_release_lock(PyThread_type_lock lock) int status, error = 0; (void) error; /* silence unused-but-set-variable warning */ - dprintf(("PyThread_release_lock(%p) called\n", lock)); status = sem_post(thelock); CHECK_STATUS("sem_post"); @@ -573,7 +563,6 @@ PyThread_allocate_lock(void) pthread_lock *lock; int status, error = 0; - dprintf(("PyThread_allocate_lock called\n")); if (!initialized) PyThread_init_thread(); @@ -599,7 +588,6 @@ PyThread_allocate_lock(void) } } - dprintf(("PyThread_allocate_lock() -> %p\n", (void *)lock)); return (PyThread_type_lock) lock; } @@ -610,7 +598,6 @@ PyThread_free_lock(PyThread_type_lock lock) int status, error = 0; (void) error; /* silence unused-but-set-variable warning */ - dprintf(("PyThread_free_lock(%p) called\n", lock)); /* some pthread-like implementations tie the mutex to the cond * and must have the cond destroyed first. @@ -632,9 +619,6 @@ PyThread_acquire_lock_timed(PyThread_type_lock lock, PY_TIMEOUT_T microseconds, pthread_lock *thelock = (pthread_lock *)lock; int status, error = 0; - dprintf(("PyThread_acquire_lock_timed(%p, %lld, %d) called\n", - lock, microseconds, intr_flag)); - if (microseconds == 0) { status = pthread_mutex_trylock( &thelock->mut ); if (status != EBUSY) @@ -694,8 +678,6 @@ PyThread_acquire_lock_timed(PyThread_type_lock lock, PY_TIMEOUT_T microseconds, } if (error) success = PY_LOCK_FAILURE; - dprintf(("PyThread_acquire_lock_timed(%p, %lld, %d) -> %d\n", - lock, microseconds, intr_flag, success)); return success; } @@ -706,7 +688,6 @@ PyThread_release_lock(PyThread_type_lock lock) int status, error = 0; (void) error; /* silence unused-but-set-variable warning */ - dprintf(("PyThread_release_lock(%p) called\n", lock)); status = pthread_mutex_lock( &thelock->mut ); CHECK_STATUS_PTHREAD("pthread_mutex_lock[3]"); From webhook-mailer at python.org Mon May 9 20:00:42 2022 From: webhook-mailer at python.org (vstinner) Date: Tue, 10 May 2022 00:00:42 -0000 Subject: [Python-checkins] gh-88750: On Windows, PyThread_acquire_lock() no longer checks for NULL (#92586) Message-ID: https://github.com/python/cpython/commit/cb35402c1867b48704c2de1d1efd465ca738f374 commit: cb35402c1867b48704c2de1d1efd465ca738f374 branch: main author: Victor Stinner committer: vstinner date: 2022-05-10T02:00:38+02:00 summary: gh-88750: On Windows, PyThread_acquire_lock() no longer checks for NULL (#92586) On Windows, PyThread_acquire_lock(), PyThread_acquire_lock_timed() and PyThread_release_lock() no longer check at runtime if the lock is not NULL. files: M Python/thread_nt.h diff --git a/Python/thread_nt.h b/Python/thread_nt.h index b1defad426591..d1f1323948a6c 100644 --- a/Python/thread_nt.h +++ b/Python/thread_nt.h @@ -264,14 +264,17 @@ PyThread_exit_thread(void) PyThread_type_lock PyThread_allocate_lock(void) { - PNRMUTEX aLock; + PNRMUTEX mutex; if (!initialized) PyThread_init_thread(); - aLock = AllocNonRecursiveMutex() ; + mutex = AllocNonRecursiveMutex() ; - return (PyThread_type_lock) aLock; + PyThread_type_lock aLock = (PyThread_type_lock) mutex; + assert(aLock); + + return aLock; } void @@ -295,6 +298,8 @@ PyLockStatus PyThread_acquire_lock_timed(PyThread_type_lock aLock, PY_TIMEOUT_T microseconds, int intr_flag) { + assert(aLock); + /* Fow now, intr_flag does nothing on Windows, and lock acquires are * uninterruptible. */ PyLockStatus success; @@ -321,8 +326,8 @@ PyThread_acquire_lock_timed(PyThread_type_lock aLock, milliseconds = INFINITE; } - if (aLock && EnterNonRecursiveMutex((PNRMUTEX)aLock, - (DWORD)milliseconds) == WAIT_OBJECT_0) { + if (EnterNonRecursiveMutex((PNRMUTEX)aLock, + (DWORD)milliseconds) == WAIT_OBJECT_0) { success = PY_LOCK_ACQUIRED; } else { @@ -340,9 +345,8 @@ PyThread_acquire_lock(PyThread_type_lock aLock, int waitflag) void PyThread_release_lock(PyThread_type_lock aLock) { - if (aLock) { - (void)LeaveNonRecursiveMutex((PNRMUTEX) aLock); - } + assert(aLock); + (void)LeaveNonRecursiveMutex((PNRMUTEX) aLock); } /* minimum/maximum thread stack sizes supported */ From webhook-mailer at python.org Mon May 9 20:12:22 2022 From: webhook-mailer at python.org (miss-islington) Date: Tue, 10 May 2022 00:12:22 -0000 Subject: [Python-checkins] gh-92550 - Fix regression in `pathlib.Path.rglob()` (GH-92583) Message-ID: https://github.com/python/cpython/commit/dcdf250d2de1428f7d8b4e9ecf51d2fd8200e21a commit: dcdf250d2de1428f7d8b4e9ecf51d2fd8200e21a branch: main author: Barney Gale committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-09T17:12:16-07:00 summary: gh-92550 - Fix regression in `pathlib.Path.rglob()` (GH-92583) We could try to remedy this by taking a slice, but we then run into an issue where the empty string will match altsep on POSIX. That rabbit hole could keep getting deeper. A proper fix for the original issue involves making pathlib's path normalisation more configurable - in this case we want to retain trailing slashes, but in other we might want to preserve `./` prefixes, or elide `../` segments when we're sure we won't encounter symlinks. This reverts commit ea2f5bcda1a392804487e6883be89fbad38a01a5. files: A Misc/NEWS.d/next/Library/2022-05-09-23-36-19.gh-issue-92550.qZ4AhU.rst M Doc/library/pathlib.rst M Doc/whatsnew/3.11.rst M Lib/pathlib.py M Lib/test/test_pathlib.py diff --git a/Doc/library/pathlib.rst b/Doc/library/pathlib.rst index ab26e2f1719fe..01e9cfb93e391 100644 --- a/Doc/library/pathlib.rst +++ b/Doc/library/pathlib.rst @@ -815,9 +815,6 @@ call fails (for example because the path doesn't exist). .. audit-event:: pathlib.Path.glob self,pattern pathlib.Path.glob - .. versionchanged:: 3.11 - Return only directories if *pattern* ends with a pathname components - separator (:data:`~os.sep` or :data:`~os.altsep`). .. method:: Path.group() @@ -1107,9 +1104,6 @@ call fails (for example because the path doesn't exist). .. audit-event:: pathlib.Path.rglob self,pattern pathlib.Path.rglob - .. versionchanged:: 3.11 - Return only directories if *pattern* ends with a pathname components - separator (:data:`~os.sep` or :data:`~os.altsep`). .. method:: Path.rmdir() diff --git a/Doc/whatsnew/3.11.rst b/Doc/whatsnew/3.11.rst index fd7082e9fd74d..ed61e01f9c38e 100644 --- a/Doc/whatsnew/3.11.rst +++ b/Doc/whatsnew/3.11.rst @@ -557,15 +557,6 @@ os instead of ``CryptGenRandom()`` which is deprecated. (Contributed by Dong-hee Na in :issue:`44611`.) - -pathlib -------- - -* :meth:`~pathlib.Path.glob` and :meth:`~pathlib.Path.rglob` return only - directories if *pattern* ends with a pathname components separator: - :data:`~os.sep` or :data:`~os.altsep`. - (Contributed by Eisuke Kawasima in :issue:`22276` and :issue:`33392`.) - re -- diff --git a/Lib/pathlib.py b/Lib/pathlib.py index 1f098fe6bd5f3..4763ab54f6ba8 100644 --- a/Lib/pathlib.py +++ b/Lib/pathlib.py @@ -281,8 +281,6 @@ def make_uri(self, path): def _make_selector(pattern_parts, flavour): pat = pattern_parts[0] child_parts = pattern_parts[1:] - if not pat: - return _TerminatingSelector() if pat == '**': cls = _RecursiveWildcardSelector elif '**' in pat: @@ -945,8 +943,6 @@ def glob(self, pattern): drv, root, pattern_parts = self._flavour.parse_parts((pattern,)) if drv or root: raise NotImplementedError("Non-relative patterns are unsupported") - if pattern[-1] in (self._flavour.sep, self._flavour.altsep): - pattern_parts.append('') selector = _make_selector(tuple(pattern_parts), self._flavour) for p in selector.select_from(self): yield p @@ -960,8 +956,6 @@ def rglob(self, pattern): drv, root, pattern_parts = self._flavour.parse_parts((pattern,)) if drv or root: raise NotImplementedError("Non-relative patterns are unsupported") - if pattern[-1] in (self._flavour.sep, self._flavour.altsep): - pattern_parts.append('') selector = _make_selector(("**",) + tuple(pattern_parts), self._flavour) for p in selector.select_from(self): yield p diff --git a/Lib/test/test_pathlib.py b/Lib/test/test_pathlib.py index 6737068c0ff6d..b8b08bf0ce1bb 100644 --- a/Lib/test/test_pathlib.py +++ b/Lib/test/test_pathlib.py @@ -1662,11 +1662,6 @@ def _check(glob, expected): else: _check(p.glob("*/fileB"), ['dirB/fileB', 'linkB/fileB']) - if not os_helper.can_symlink(): - _check(p.glob("*/"), ["dirA", "dirB", "dirC", "dirE"]) - else: - _check(p.glob("*/"), ["dirA", "dirB", "dirC", "dirE", "linkB"]) - def test_rglob_common(self): def _check(glob, expected): self.assertEqual(set(glob), { P(BASE, q) for q in expected }) @@ -1684,16 +1679,6 @@ def _check(glob, expected): "linkB/fileB", "dirA/linkC/fileB"]) _check(p.rglob("file*"), ["fileA", "dirB/fileB", "dirC/fileC", "dirC/dirD/fileD"]) - if not os_helper.can_symlink(): - _check(p.rglob("*/"), [ - "dirA", "dirB", "dirC", "dirC/dirD", "dirE", - ]) - else: - _check(p.rglob("*/"), [ - "dirA", "dirA/linkC", "dirB", "dirB/linkD", "dirC", - "dirC/dirD", "dirE", "linkB", - ]) - p = P(BASE, "dirC") _check(p.rglob("file*"), ["dirC/fileC", "dirC/dirD/fileD"]) _check(p.rglob("*/*"), ["dirC/dirD/fileD"]) @@ -2719,7 +2704,6 @@ def test_glob(self): P = self.cls p = P(BASE) self.assertEqual(set(p.glob("FILEa")), { P(BASE, "fileA") }) - self.assertEqual(set(p.glob("*a\\")), { P(BASE, "dirA") }) self.assertEqual(set(p.glob("F*a")), { P(BASE, "fileA") }) self.assertEqual(set(map(str, p.glob("FILEa"))), {f"{p}\\FILEa"}) self.assertEqual(set(map(str, p.glob("F*a"))), {f"{p}\\fileA"}) @@ -2728,7 +2712,6 @@ def test_rglob(self): P = self.cls p = P(BASE, "dirC") self.assertEqual(set(p.rglob("FILEd")), { P(BASE, "dirC/dirD/fileD") }) - self.assertEqual(set(p.rglob("*\\")), { P(BASE, "dirC/dirD") }) self.assertEqual(set(map(str, p.rglob("FILEd"))), {f"{p}\\dirD\\FILEd"}) def test_expanduser(self): diff --git a/Misc/NEWS.d/next/Library/2022-05-09-23-36-19.gh-issue-92550.qZ4AhU.rst b/Misc/NEWS.d/next/Library/2022-05-09-23-36-19.gh-issue-92550.qZ4AhU.rst new file mode 100644 index 0000000000000..1931b329b3c6e --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-05-09-23-36-19.gh-issue-92550.qZ4AhU.rst @@ -0,0 +1,2 @@ +:meth:`pathlib.Path.rglob` raised :exc:`IndexError` when called with an +empty string. This regression was introduced in 3.11b1. From webhook-mailer at python.org Mon May 9 20:39:48 2022 From: webhook-mailer at python.org (miss-islington) Date: Tue, 10 May 2022 00:39:48 -0000 Subject: [Python-checkins] gh-92550 - Fix regression in `pathlib.Path.rglob()` (GH-92583) Message-ID: https://github.com/python/cpython/commit/a51baec9ce0eae2b4db069a55daf8f03be3ab2f4 commit: a51baec9ce0eae2b4db069a55daf8f03be3ab2f4 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-09T17:39:43-07:00 summary: gh-92550 - Fix regression in `pathlib.Path.rglob()` (GH-92583) We could try to remedy this by taking a slice, but we then run into an issue where the empty string will match altsep on POSIX. That rabbit hole could keep getting deeper. A proper fix for the original issue involves making pathlib's path normalisation more configurable - in this case we want to retain trailing slashes, but in other we might want to preserve `./` prefixes, or elide `../` segments when we're sure we won't encounter symlinks. This reverts commit ea2f5bcda1a392804487e6883be89fbad38a01a5. (cherry picked from commit dcdf250d2de1428f7d8b4e9ecf51d2fd8200e21a) Co-authored-by: Barney Gale files: A Misc/NEWS.d/next/Library/2022-05-09-23-36-19.gh-issue-92550.qZ4AhU.rst M Doc/library/pathlib.rst M Doc/whatsnew/3.11.rst M Lib/pathlib.py M Lib/test/test_pathlib.py diff --git a/Doc/library/pathlib.rst b/Doc/library/pathlib.rst index ab26e2f1719fe..01e9cfb93e391 100644 --- a/Doc/library/pathlib.rst +++ b/Doc/library/pathlib.rst @@ -815,9 +815,6 @@ call fails (for example because the path doesn't exist). .. audit-event:: pathlib.Path.glob self,pattern pathlib.Path.glob - .. versionchanged:: 3.11 - Return only directories if *pattern* ends with a pathname components - separator (:data:`~os.sep` or :data:`~os.altsep`). .. method:: Path.group() @@ -1107,9 +1104,6 @@ call fails (for example because the path doesn't exist). .. audit-event:: pathlib.Path.rglob self,pattern pathlib.Path.rglob - .. versionchanged:: 3.11 - Return only directories if *pattern* ends with a pathname components - separator (:data:`~os.sep` or :data:`~os.altsep`). .. method:: Path.rmdir() diff --git a/Doc/whatsnew/3.11.rst b/Doc/whatsnew/3.11.rst index fd7082e9fd74d..ed61e01f9c38e 100644 --- a/Doc/whatsnew/3.11.rst +++ b/Doc/whatsnew/3.11.rst @@ -557,15 +557,6 @@ os instead of ``CryptGenRandom()`` which is deprecated. (Contributed by Dong-hee Na in :issue:`44611`.) - -pathlib -------- - -* :meth:`~pathlib.Path.glob` and :meth:`~pathlib.Path.rglob` return only - directories if *pattern* ends with a pathname components separator: - :data:`~os.sep` or :data:`~os.altsep`. - (Contributed by Eisuke Kawasima in :issue:`22276` and :issue:`33392`.) - re -- diff --git a/Lib/pathlib.py b/Lib/pathlib.py index 1f098fe6bd5f3..4763ab54f6ba8 100644 --- a/Lib/pathlib.py +++ b/Lib/pathlib.py @@ -281,8 +281,6 @@ def make_uri(self, path): def _make_selector(pattern_parts, flavour): pat = pattern_parts[0] child_parts = pattern_parts[1:] - if not pat: - return _TerminatingSelector() if pat == '**': cls = _RecursiveWildcardSelector elif '**' in pat: @@ -945,8 +943,6 @@ def glob(self, pattern): drv, root, pattern_parts = self._flavour.parse_parts((pattern,)) if drv or root: raise NotImplementedError("Non-relative patterns are unsupported") - if pattern[-1] in (self._flavour.sep, self._flavour.altsep): - pattern_parts.append('') selector = _make_selector(tuple(pattern_parts), self._flavour) for p in selector.select_from(self): yield p @@ -960,8 +956,6 @@ def rglob(self, pattern): drv, root, pattern_parts = self._flavour.parse_parts((pattern,)) if drv or root: raise NotImplementedError("Non-relative patterns are unsupported") - if pattern[-1] in (self._flavour.sep, self._flavour.altsep): - pattern_parts.append('') selector = _make_selector(("**",) + tuple(pattern_parts), self._flavour) for p in selector.select_from(self): yield p diff --git a/Lib/test/test_pathlib.py b/Lib/test/test_pathlib.py index 6737068c0ff6d..b8b08bf0ce1bb 100644 --- a/Lib/test/test_pathlib.py +++ b/Lib/test/test_pathlib.py @@ -1662,11 +1662,6 @@ def _check(glob, expected): else: _check(p.glob("*/fileB"), ['dirB/fileB', 'linkB/fileB']) - if not os_helper.can_symlink(): - _check(p.glob("*/"), ["dirA", "dirB", "dirC", "dirE"]) - else: - _check(p.glob("*/"), ["dirA", "dirB", "dirC", "dirE", "linkB"]) - def test_rglob_common(self): def _check(glob, expected): self.assertEqual(set(glob), { P(BASE, q) for q in expected }) @@ -1684,16 +1679,6 @@ def _check(glob, expected): "linkB/fileB", "dirA/linkC/fileB"]) _check(p.rglob("file*"), ["fileA", "dirB/fileB", "dirC/fileC", "dirC/dirD/fileD"]) - if not os_helper.can_symlink(): - _check(p.rglob("*/"), [ - "dirA", "dirB", "dirC", "dirC/dirD", "dirE", - ]) - else: - _check(p.rglob("*/"), [ - "dirA", "dirA/linkC", "dirB", "dirB/linkD", "dirC", - "dirC/dirD", "dirE", "linkB", - ]) - p = P(BASE, "dirC") _check(p.rglob("file*"), ["dirC/fileC", "dirC/dirD/fileD"]) _check(p.rglob("*/*"), ["dirC/dirD/fileD"]) @@ -2719,7 +2704,6 @@ def test_glob(self): P = self.cls p = P(BASE) self.assertEqual(set(p.glob("FILEa")), { P(BASE, "fileA") }) - self.assertEqual(set(p.glob("*a\\")), { P(BASE, "dirA") }) self.assertEqual(set(p.glob("F*a")), { P(BASE, "fileA") }) self.assertEqual(set(map(str, p.glob("FILEa"))), {f"{p}\\FILEa"}) self.assertEqual(set(map(str, p.glob("F*a"))), {f"{p}\\fileA"}) @@ -2728,7 +2712,6 @@ def test_rglob(self): P = self.cls p = P(BASE, "dirC") self.assertEqual(set(p.rglob("FILEd")), { P(BASE, "dirC/dirD/fileD") }) - self.assertEqual(set(p.rglob("*\\")), { P(BASE, "dirC/dirD") }) self.assertEqual(set(map(str, p.rglob("FILEd"))), {f"{p}\\dirD\\FILEd"}) def test_expanduser(self): diff --git a/Misc/NEWS.d/next/Library/2022-05-09-23-36-19.gh-issue-92550.qZ4AhU.rst b/Misc/NEWS.d/next/Library/2022-05-09-23-36-19.gh-issue-92550.qZ4AhU.rst new file mode 100644 index 0000000000000..1931b329b3c6e --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-05-09-23-36-19.gh-issue-92550.qZ4AhU.rst @@ -0,0 +1,2 @@ +:meth:`pathlib.Path.rglob` raised :exc:`IndexError` when called with an +empty string. This regression was introduced in 3.11b1. From webhook-mailer at python.org Mon May 9 22:41:05 2022 From: webhook-mailer at python.org (ethanfurman) Date: Tue, 10 May 2022 02:41:05 -0000 Subject: [Python-checkins] [Enum] Remove redundant check for existing members. (GH-92590) Message-ID: https://github.com/python/cpython/commit/5be069568ddbce1d50f785426e6b6c2b82957f70 commit: 5be069568ddbce1d50f785426e6b6c2b82957f70 branch: main author: Ethan Furman committer: ethanfurman date: 2022-05-09T19:40:42-07:00 summary: [Enum] Remove redundant check for existing members. (GH-92590) files: M Lib/enum.py diff --git a/Lib/enum.py b/Lib/enum.py index b9811fe9e6787..1df38a6f7e5f5 100644 --- a/Lib/enum.py +++ b/Lib/enum.py @@ -1024,9 +1024,6 @@ def _get_mixins_(mcls, class_name, bases): """ if not bases: return object, Enum - - mcls._check_for_existing_members_(class_name, bases) - # ensure final parent class is an Enum derivative, find any concrete # data type, and check that Enum has no members first_enum = bases[-1] From webhook-mailer at python.org Mon May 9 23:49:06 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Tue, 10 May 2022 03:49:06 -0000 Subject: [Python-checkins] bpo-13553: Document tkinter.Tk args (#4786) Message-ID: https://github.com/python/cpython/commit/c56e2bb9949c95ec8911cd5554b07044a564796f commit: c56e2bb9949c95ec8911cd5554b07044a564796f branch: main author: Cheryl Sabella committer: JelleZijlstra date: 2022-05-09T20:49:00-07:00 summary: bpo-13553: Document tkinter.Tk args (#4786) files: A Misc/NEWS.d/next/Documentation/2017-12-10-19-13-39.bpo-13553.gQbZs4.rst M Doc/library/tkinter.rst M Lib/tkinter/__init__.py diff --git a/Doc/library/tkinter.rst b/Doc/library/tkinter.rst index 65395d824cab7..37b6a02a31710 100644 --- a/Doc/library/tkinter.rst +++ b/Doc/library/tkinter.rst @@ -124,16 +124,72 @@ the modern themed widget set and API:: from tkinter import ttk -.. class:: Tk(screenName=None, baseName=None, className='Tk', useTk=1) - - The :class:`Tk` class is instantiated without arguments. This creates a toplevel - widget of Tk which usually is the main window of an application. Each instance - has its own associated Tcl interpreter. - - .. FIXME: The following keyword arguments are currently recognized: - - -.. function:: Tcl(screenName=None, baseName=None, className='Tk', useTk=0) +.. class:: Tk(screenName=None, baseName=None, className='Tk', useTk=True, sync=False, use=None) + + Construct a toplevel Tk widget, which is usually the main window of an + application, and initialize a Tcl interpreter for this widget. Each + instance has its own associated Tcl interpreter. + + The :class:`Tk` class is typically instantiated using all default values. + However, the following keyword arguments are currently recognized: + + *screenName* + When given (as a string), sets the :envvar:`DISPLAY` environment + variable. (X11 only) + *baseName* + Name of the profile file. By default, *baseName* is derived from the + program name (``sys.argv[0]``). + *className* + Name of the widget class. Used as a profile file and also as the name + with which Tcl is invoked (*argv0* in *interp*). + *useTk* + If ``True``, initialize the Tk subsystem. The :func:`tkinter.Tcl() ` + function sets this to ``False``. + *sync* + If ``True``, execute all X server commands synchronously, so that errors + are reported immediately. Can be used for debugging. (X11 only) + *use* + Specifies the *id* of the window in which to embed the application, + instead of it being created as an independent toplevel window. *id* must + be specified in the same way as the value for the -use option for + toplevel widgets (that is, it has a form like that returned by + :meth:`winfo_id`). + + Note that on some platforms this will only work correctly if *id* refers + to a Tk frame or toplevel that has its -container option enabled. + + :class:`Tk` reads and interprets profile files, named + :file:`.{className}.tcl` and :file:`.{baseName}.tcl`, into the Tcl + interpreter and calls :func:`exec` on the contents of + :file:`.{className}.py` and :file:`.{baseName}.py`. The path for the + profile files is the :envvar:`HOME` environment variable or, if that + isn't defined, then :attr:`os.curdir`. + + .. attribute:: tk + + The Tk application object created by instantiating :class:`Tk`. This + provides access to the Tcl interpreter. Each widget that is attached + the same instance of :class:`Tk` has the same value for its :attr:`tk` + attribute. + + .. attribute:: master + + The widget object that contains this widget. For :class:`Tk`, the + *master* is :const:`None` because it is the main window. The terms + *master* and *parent* are similar and sometimes used interchangeably + as argument names; however, calling :meth:`winfo_parent` returns a + string of the widget name whereas :attr:`master` returns the object. + *parent*/*child* reflects the tree-like relationship while + *master*/*slave* reflects the container structure. + + .. attribute:: children + + The immediate descendants of this widget as a :class:`dict` with the + child widget names as the keys and the child instance objects as the + values. + + +.. function:: Tcl(screenName=None, baseName=None, className='Tk', useTk=False) The :func:`Tcl` function is a factory function which creates an object much like that created by the :class:`Tk` class, except that it does not initialize the Tk diff --git a/Lib/tkinter/__init__.py b/Lib/tkinter/__init__.py index 3d23889c74f24..296320235afdd 100644 --- a/Lib/tkinter/__init__.py +++ b/Lib/tkinter/__init__.py @@ -2126,7 +2126,7 @@ def wm_iconbitmap(self, bitmap=None, default=None): the bitmap if None is given. Under Windows, the DEFAULT parameter can be used to set the icon - for the widget and any descendents that don't have an icon set + for the widget and any descendants that don't have an icon set explicitly. DEFAULT can be the relative path to a .ico file (example: root.iconbitmap(default='myicon.ico') ). See Tk documentation for more information.""" @@ -2372,9 +2372,9 @@ def destroy(self): _default_root = None def readprofile(self, baseName, className): - """Internal function. It reads BASENAME.tcl and CLASSNAME.tcl into - the Tcl Interpreter and calls exec on the contents of BASENAME.py and - CLASSNAME.py if such a file exists in the home directory.""" + """Internal function. It reads .BASENAME.tcl and .CLASSNAME.tcl into + the Tcl Interpreter and calls exec on the contents of .BASENAME.py and + .CLASSNAME.py if such a file exists in the home directory.""" import os if 'HOME' in os.environ: home = os.environ['HOME'] else: home = os.curdir diff --git a/Misc/NEWS.d/next/Documentation/2017-12-10-19-13-39.bpo-13553.gQbZs4.rst b/Misc/NEWS.d/next/Documentation/2017-12-10-19-13-39.bpo-13553.gQbZs4.rst new file mode 100644 index 0000000000000..23d3c1555e370 --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2017-12-10-19-13-39.bpo-13553.gQbZs4.rst @@ -0,0 +1 @@ +Document tkinter.Tk args. From webhook-mailer at python.org Mon May 9 23:51:33 2022 From: webhook-mailer at python.org (miss-islington) Date: Tue, 10 May 2022 03:51:33 -0000 Subject: [Python-checkins] gh-91928: Add what's new entry for datetime.UTC alias (GH-92567) Message-ID: https://github.com/python/cpython/commit/a0a825c38a0c2ceec024a276f1f527c93ba57af2 commit: a0a825c38a0c2ceec024a276f1f527c93ba57af2 branch: main author: Paul Ganssle <1377457+pganssle at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-09T20:51:28-07:00 summary: gh-91928: Add what's new entry for datetime.UTC alias (GH-92567) I merged this without a What's New entry to avoid merge conflicts, so here's the follow-up adding the entry. @Kab1r do you mind reviewing? Closes #91928 Automerge-Triggered-By: GH:pganssle files: M Doc/whatsnew/3.11.rst diff --git a/Doc/whatsnew/3.11.rst b/Doc/whatsnew/3.11.rst index ed61e01f9c38e..db5ede683a6c6 100644 --- a/Doc/whatsnew/3.11.rst +++ b/Doc/whatsnew/3.11.rst @@ -434,6 +434,8 @@ asyncio datetime -------- +* Add :attr:`datetime.UTC`, a convenience alias for + :attr:`datetime.timezone.utc`. (Contributed by Kabir Kwatra in :gh:`91973`.) * :meth:`datetime.date.fromisoformat`, :meth:`datetime.time.fromisoformat` and :meth:`datetime.datetime.fromisoformat` can now be used to parse most ISO 8601 formats (barring only those that support fractional hours and minutes). From webhook-mailer at python.org Tue May 10 00:04:11 2022 From: webhook-mailer at python.org (ned-deily) Date: Tue, 10 May 2022 04:04:11 -0000 Subject: [Python-checkins] [3.7] Update Sphinx bpo role to use redirect URI. (GH-91893) Message-ID: https://github.com/python/cpython/commit/6fd61c96c33c2ebb008abfc843560c4a2f4f0d46 commit: 6fd61c96c33c2ebb008abfc843560c4a2f4f0d46 branch: 3.7 author: Ezio Melotti committer: ned-deily date: 2022-05-10T00:04:07-04:00 summary: [3.7] Update Sphinx bpo role to use redirect URI. (GH-91893) (cherry picked from commit 08cfe079503ffd19d8b7ab324f0fdb1c6b150ca8) Co-authored-by: Ezio Melotti files: M Doc/tools/extensions/pyspecific.py diff --git a/Doc/tools/extensions/pyspecific.py b/Doc/tools/extensions/pyspecific.py index 3b6fa90059160..4dd178619803a 100644 --- a/Doc/tools/extensions/pyspecific.py +++ b/Doc/tools/extensions/pyspecific.py @@ -35,7 +35,7 @@ import suspicious -ISSUE_URI = 'https://bugs.python.org/issue%s' +ISSUE_URI = 'https://bugs.python.org/issue?@action=redirect&bpo=%s' SOURCE_URI = 'https://github.com/python/cpython/tree/3.7/%s' # monkey-patch reST parser to disable alphabetic and roman enumerated lists From webhook-mailer at python.org Tue May 10 00:05:18 2022 From: webhook-mailer at python.org (ned-deily) Date: Tue, 10 May 2022 04:05:18 -0000 Subject: [Python-checkins] Add redirects to Misc/NEWS bpo links (GH-91454) (GH-91894) Message-ID: https://github.com/python/cpython/commit/5da1197d51871cc7bb97a0de4d9bf99664579671 commit: 5da1197d51871cc7bb97a0de4d9bf99664579671 branch: 3.7 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: ned-deily date: 2022-05-10T00:05:14-04:00 summary: Add redirects to Misc/NEWS bpo links (GH-91454) (GH-91894) (cherry picked from commit 17dbb6bc10ca8a8b602335414c047294f00afcbe) Co-authored-by: Ezio Melotti files: M Doc/tools/extensions/pyspecific.py diff --git a/Doc/tools/extensions/pyspecific.py b/Doc/tools/extensions/pyspecific.py index 4dd178619803a..37e2a696cfa1b 100644 --- a/Doc/tools/extensions/pyspecific.py +++ b/Doc/tools/extensions/pyspecific.py @@ -313,7 +313,8 @@ def run(self): text = 'The NEWS file is not available.' node = nodes.strong(text, text) return [node] - content = issue_re.sub(r'`bpo-\1 `__', + content = issue_re.sub(r'`bpo-\1 `__', content) content = whatsnew_re.sub(r'\1', content) # remove first 3 lines as they are the main heading From webhook-mailer at python.org Tue May 10 00:07:09 2022 From: webhook-mailer at python.org (miss-islington) Date: Tue, 10 May 2022 04:07:09 -0000 Subject: [Python-checkins] gh-91928: Add what's new entry for datetime.UTC alias (GH-92567) Message-ID: https://github.com/python/cpython/commit/2d38a2f5b843e1faf6627c2dba7acb9264a98fd2 commit: 2d38a2f5b843e1faf6627c2dba7acb9264a98fd2 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-09T21:07:05-07:00 summary: gh-91928: Add what's new entry for datetime.UTC alias (GH-92567) I merged this without a What's New entry to avoid merge conflicts, so here's the follow-up adding the entry. @Kab1r do you mind reviewing? Closes GH-91928 Automerge-Triggered-By: GH:pganssle (cherry picked from commit a0a825c38a0c2ceec024a276f1f527c93ba57af2) Co-authored-by: Paul Ganssle <1377457+pganssle at users.noreply.github.com> files: M Doc/whatsnew/3.11.rst diff --git a/Doc/whatsnew/3.11.rst b/Doc/whatsnew/3.11.rst index ed61e01f9c38e..db5ede683a6c6 100644 --- a/Doc/whatsnew/3.11.rst +++ b/Doc/whatsnew/3.11.rst @@ -434,6 +434,8 @@ asyncio datetime -------- +* Add :attr:`datetime.UTC`, a convenience alias for + :attr:`datetime.timezone.utc`. (Contributed by Kabir Kwatra in :gh:`91973`.) * :meth:`datetime.date.fromisoformat`, :meth:`datetime.time.fromisoformat` and :meth:`datetime.datetime.fromisoformat` can now be used to parse most ISO 8601 formats (barring only those that support fractional hours and minutes). From webhook-mailer at python.org Tue May 10 00:15:45 2022 From: webhook-mailer at python.org (ned-deily) Date: Tue, 10 May 2022 04:15:45 -0000 Subject: [Python-checkins] [3.7] gh-91888: add a `:gh:` role to the documentation (GH-91889) (GH-91937) Message-ID: https://github.com/python/cpython/commit/73317e3c155446c6127b3d10a31ef421b73effe5 commit: 73317e3c155446c6127b3d10a31ef421b73effe5 branch: 3.7 author: Ezio Melotti committer: ned-deily date: 2022-05-10T00:15:41-04:00 summary: [3.7] gh-91888: add a `:gh:` role to the documentation (GH-91889) (GH-91937) Co-authored-by: Hugo van Kemenade . Co-authored-by: Ezio Melotti (cherry picked from commit f7641a2ffec243e5f600028a84debe9028a9ee44) files: A Misc/NEWS.d/next/Documentation/2022-04-24-22-09-31.gh-issue-91888.kTjJLx.rst M Doc/tools/extensions/pyspecific.py diff --git a/Doc/tools/extensions/pyspecific.py b/Doc/tools/extensions/pyspecific.py index 37e2a696cfa1b..e4f45414dbcc8 100644 --- a/Doc/tools/extensions/pyspecific.py +++ b/Doc/tools/extensions/pyspecific.py @@ -36,6 +36,7 @@ ISSUE_URI = 'https://bugs.python.org/issue?@action=redirect&bpo=%s' +GH_ISSUE_URI = 'https://github.com/python/cpython/issues/%s' SOURCE_URI = 'https://github.com/python/cpython/tree/3.7/%s' # monkey-patch reST parser to disable alphabetic and roman enumerated lists @@ -81,11 +82,33 @@ def new_depart_literal_block(self, node): def issue_role(typ, rawtext, text, lineno, inliner, options={}, content=[]): issue = utils.unescape(text) + # sanity check: there are no bpo issues within these two values + if 47261 < int(issue) < 400000: + msg = inliner.reporter.error(f'The BPO ID {text!r} seems too high -- ' + 'use :gh:`...` for GitHub IDs', line=lineno) + prb = inliner.problematic(rawtext, rawtext, msg) + return [prb], [msg] text = 'bpo-' + issue refnode = nodes.reference(text, text, refuri=ISSUE_URI % issue) return [refnode], [] +# Support for marking up and linking to GitHub issues + +def gh_issue_role(typ, rawtext, text, lineno, inliner, options={}, content=[]): + issue = utils.unescape(text) + # sanity check: all GitHub issues have ID >= 32426 + # even though some of them are also valid BPO IDs + if int(issue) < 32426: + msg = inliner.reporter.error(f'The GitHub ID {text!r} seems too low -- ' + 'use :issue:`...` for BPO IDs', line=lineno) + prb = inliner.problematic(rawtext, rawtext, msg) + return [prb], [msg] + text = 'gh-' + issue + refnode = nodes.reference(text, text, refuri=GH_ISSUE_URI % issue) + return [refnode], [] + + # Support for linking to Python source files easily def source_role(typ, rawtext, text, lineno, inliner, options={}, content=[]): @@ -431,6 +454,7 @@ def parse_pdb_command(env, sig, signode): def setup(app): app.add_role('issue', issue_role) + app.add_role('gh', gh_issue_role) app.add_role('source', source_role) app.add_directive('impl-detail', ImplementationDetail) app.add_directive('availability', Availability) diff --git a/Misc/NEWS.d/next/Documentation/2022-04-24-22-09-31.gh-issue-91888.kTjJLx.rst b/Misc/NEWS.d/next/Documentation/2022-04-24-22-09-31.gh-issue-91888.kTjJLx.rst new file mode 100644 index 0000000000000..4ebca42a7fec5 --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2022-04-24-22-09-31.gh-issue-91888.kTjJLx.rst @@ -0,0 +1 @@ +Add a new ``gh`` role to the documentation to link to GitHub issues. From webhook-mailer at python.org Tue May 10 00:18:02 2022 From: webhook-mailer at python.org (miss-islington) Date: Tue, 10 May 2022 04:18:02 -0000 Subject: [Python-checkins] bpo-13553: Document tkinter.Tk args (GH-4786) Message-ID: https://github.com/python/cpython/commit/74c094d8049f4c8ab5821487b753f5c17aefdfc7 commit: 74c094d8049f4c8ab5821487b753f5c17aefdfc7 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-09T21:17:57-07:00 summary: bpo-13553: Document tkinter.Tk args (GH-4786) (cherry picked from commit c56e2bb9949c95ec8911cd5554b07044a564796f) Co-authored-by: Cheryl Sabella files: A Misc/NEWS.d/next/Documentation/2017-12-10-19-13-39.bpo-13553.gQbZs4.rst M Doc/library/tkinter.rst M Lib/tkinter/__init__.py diff --git a/Doc/library/tkinter.rst b/Doc/library/tkinter.rst index 65395d824cab7..37b6a02a31710 100644 --- a/Doc/library/tkinter.rst +++ b/Doc/library/tkinter.rst @@ -124,16 +124,72 @@ the modern themed widget set and API:: from tkinter import ttk -.. class:: Tk(screenName=None, baseName=None, className='Tk', useTk=1) - - The :class:`Tk` class is instantiated without arguments. This creates a toplevel - widget of Tk which usually is the main window of an application. Each instance - has its own associated Tcl interpreter. - - .. FIXME: The following keyword arguments are currently recognized: - - -.. function:: Tcl(screenName=None, baseName=None, className='Tk', useTk=0) +.. class:: Tk(screenName=None, baseName=None, className='Tk', useTk=True, sync=False, use=None) + + Construct a toplevel Tk widget, which is usually the main window of an + application, and initialize a Tcl interpreter for this widget. Each + instance has its own associated Tcl interpreter. + + The :class:`Tk` class is typically instantiated using all default values. + However, the following keyword arguments are currently recognized: + + *screenName* + When given (as a string), sets the :envvar:`DISPLAY` environment + variable. (X11 only) + *baseName* + Name of the profile file. By default, *baseName* is derived from the + program name (``sys.argv[0]``). + *className* + Name of the widget class. Used as a profile file and also as the name + with which Tcl is invoked (*argv0* in *interp*). + *useTk* + If ``True``, initialize the Tk subsystem. The :func:`tkinter.Tcl() ` + function sets this to ``False``. + *sync* + If ``True``, execute all X server commands synchronously, so that errors + are reported immediately. Can be used for debugging. (X11 only) + *use* + Specifies the *id* of the window in which to embed the application, + instead of it being created as an independent toplevel window. *id* must + be specified in the same way as the value for the -use option for + toplevel widgets (that is, it has a form like that returned by + :meth:`winfo_id`). + + Note that on some platforms this will only work correctly if *id* refers + to a Tk frame or toplevel that has its -container option enabled. + + :class:`Tk` reads and interprets profile files, named + :file:`.{className}.tcl` and :file:`.{baseName}.tcl`, into the Tcl + interpreter and calls :func:`exec` on the contents of + :file:`.{className}.py` and :file:`.{baseName}.py`. The path for the + profile files is the :envvar:`HOME` environment variable or, if that + isn't defined, then :attr:`os.curdir`. + + .. attribute:: tk + + The Tk application object created by instantiating :class:`Tk`. This + provides access to the Tcl interpreter. Each widget that is attached + the same instance of :class:`Tk` has the same value for its :attr:`tk` + attribute. + + .. attribute:: master + + The widget object that contains this widget. For :class:`Tk`, the + *master* is :const:`None` because it is the main window. The terms + *master* and *parent* are similar and sometimes used interchangeably + as argument names; however, calling :meth:`winfo_parent` returns a + string of the widget name whereas :attr:`master` returns the object. + *parent*/*child* reflects the tree-like relationship while + *master*/*slave* reflects the container structure. + + .. attribute:: children + + The immediate descendants of this widget as a :class:`dict` with the + child widget names as the keys and the child instance objects as the + values. + + +.. function:: Tcl(screenName=None, baseName=None, className='Tk', useTk=False) The :func:`Tcl` function is a factory function which creates an object much like that created by the :class:`Tk` class, except that it does not initialize the Tk diff --git a/Lib/tkinter/__init__.py b/Lib/tkinter/__init__.py index 3d23889c74f24..296320235afdd 100644 --- a/Lib/tkinter/__init__.py +++ b/Lib/tkinter/__init__.py @@ -2126,7 +2126,7 @@ def wm_iconbitmap(self, bitmap=None, default=None): the bitmap if None is given. Under Windows, the DEFAULT parameter can be used to set the icon - for the widget and any descendents that don't have an icon set + for the widget and any descendants that don't have an icon set explicitly. DEFAULT can be the relative path to a .ico file (example: root.iconbitmap(default='myicon.ico') ). See Tk documentation for more information.""" @@ -2372,9 +2372,9 @@ def destroy(self): _default_root = None def readprofile(self, baseName, className): - """Internal function. It reads BASENAME.tcl and CLASSNAME.tcl into - the Tcl Interpreter and calls exec on the contents of BASENAME.py and - CLASSNAME.py if such a file exists in the home directory.""" + """Internal function. It reads .BASENAME.tcl and .CLASSNAME.tcl into + the Tcl Interpreter and calls exec on the contents of .BASENAME.py and + .CLASSNAME.py if such a file exists in the home directory.""" import os if 'HOME' in os.environ: home = os.environ['HOME'] else: home = os.curdir diff --git a/Misc/NEWS.d/next/Documentation/2017-12-10-19-13-39.bpo-13553.gQbZs4.rst b/Misc/NEWS.d/next/Documentation/2017-12-10-19-13-39.bpo-13553.gQbZs4.rst new file mode 100644 index 0000000000000..23d3c1555e370 --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2017-12-10-19-13-39.bpo-13553.gQbZs4.rst @@ -0,0 +1 @@ +Document tkinter.Tk args. From webhook-mailer at python.org Tue May 10 00:20:43 2022 From: webhook-mailer at python.org (miss-islington) Date: Tue, 10 May 2022 04:20:43 -0000 Subject: [Python-checkins] bpo-13553: Document tkinter.Tk args (GH-4786) Message-ID: https://github.com/python/cpython/commit/b7a87861de6a166149aa771a0672816099558ace commit: b7a87861de6a166149aa771a0672816099558ace branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-09T21:20:37-07:00 summary: bpo-13553: Document tkinter.Tk args (GH-4786) (cherry picked from commit c56e2bb9949c95ec8911cd5554b07044a564796f) Co-authored-by: Cheryl Sabella files: A Misc/NEWS.d/next/Documentation/2017-12-10-19-13-39.bpo-13553.gQbZs4.rst M Doc/library/tkinter.rst M Lib/tkinter/__init__.py diff --git a/Doc/library/tkinter.rst b/Doc/library/tkinter.rst index 999852a58cf6a..401887f216212 100644 --- a/Doc/library/tkinter.rst +++ b/Doc/library/tkinter.rst @@ -63,16 +63,72 @@ the modern themed widget set and API:: from tkinter import ttk -.. class:: Tk(screenName=None, baseName=None, className='Tk', useTk=1) - - The :class:`Tk` class is instantiated without arguments. This creates a toplevel - widget of Tk which usually is the main window of an application. Each instance - has its own associated Tcl interpreter. - - .. FIXME: The following keyword arguments are currently recognized: - - -.. function:: Tcl(screenName=None, baseName=None, className='Tk', useTk=0) +.. class:: Tk(screenName=None, baseName=None, className='Tk', useTk=True, sync=False, use=None) + + Construct a toplevel Tk widget, which is usually the main window of an + application, and initialize a Tcl interpreter for this widget. Each + instance has its own associated Tcl interpreter. + + The :class:`Tk` class is typically instantiated using all default values. + However, the following keyword arguments are currently recognized: + + *screenName* + When given (as a string), sets the :envvar:`DISPLAY` environment + variable. (X11 only) + *baseName* + Name of the profile file. By default, *baseName* is derived from the + program name (``sys.argv[0]``). + *className* + Name of the widget class. Used as a profile file and also as the name + with which Tcl is invoked (*argv0* in *interp*). + *useTk* + If ``True``, initialize the Tk subsystem. The :func:`tkinter.Tcl() ` + function sets this to ``False``. + *sync* + If ``True``, execute all X server commands synchronously, so that errors + are reported immediately. Can be used for debugging. (X11 only) + *use* + Specifies the *id* of the window in which to embed the application, + instead of it being created as an independent toplevel window. *id* must + be specified in the same way as the value for the -use option for + toplevel widgets (that is, it has a form like that returned by + :meth:`winfo_id`). + + Note that on some platforms this will only work correctly if *id* refers + to a Tk frame or toplevel that has its -container option enabled. + + :class:`Tk` reads and interprets profile files, named + :file:`.{className}.tcl` and :file:`.{baseName}.tcl`, into the Tcl + interpreter and calls :func:`exec` on the contents of + :file:`.{className}.py` and :file:`.{baseName}.py`. The path for the + profile files is the :envvar:`HOME` environment variable or, if that + isn't defined, then :attr:`os.curdir`. + + .. attribute:: tk + + The Tk application object created by instantiating :class:`Tk`. This + provides access to the Tcl interpreter. Each widget that is attached + the same instance of :class:`Tk` has the same value for its :attr:`tk` + attribute. + + .. attribute:: master + + The widget object that contains this widget. For :class:`Tk`, the + *master* is :const:`None` because it is the main window. The terms + *master* and *parent* are similar and sometimes used interchangeably + as argument names; however, calling :meth:`winfo_parent` returns a + string of the widget name whereas :attr:`master` returns the object. + *parent*/*child* reflects the tree-like relationship while + *master*/*slave* reflects the container structure. + + .. attribute:: children + + The immediate descendants of this widget as a :class:`dict` with the + child widget names as the keys and the child instance objects as the + values. + + +.. function:: Tcl(screenName=None, baseName=None, className='Tk', useTk=False) The :func:`Tcl` function is a factory function which creates an object much like that created by the :class:`Tk` class, except that it does not initialize the Tk diff --git a/Lib/tkinter/__init__.py b/Lib/tkinter/__init__.py index 9049ca308f95a..7e4f444c71f41 100644 --- a/Lib/tkinter/__init__.py +++ b/Lib/tkinter/__init__.py @@ -2070,7 +2070,7 @@ def wm_iconbitmap(self, bitmap=None, default=None): the bitmap if None is given. Under Windows, the DEFAULT parameter can be used to set the icon - for the widget and any descendents that don't have an icon set + for the widget and any descendants that don't have an icon set explicitly. DEFAULT can be the relative path to a .ico file (example: root.iconbitmap(default='myicon.ico') ). See Tk documentation for more information.""" @@ -2316,9 +2316,9 @@ def destroy(self): _default_root = None def readprofile(self, baseName, className): - """Internal function. It reads BASENAME.tcl and CLASSNAME.tcl into - the Tcl Interpreter and calls exec on the contents of BASENAME.py and - CLASSNAME.py if such a file exists in the home directory.""" + """Internal function. It reads .BASENAME.tcl and .CLASSNAME.tcl into + the Tcl Interpreter and calls exec on the contents of .BASENAME.py and + .CLASSNAME.py if such a file exists in the home directory.""" import os if 'HOME' in os.environ: home = os.environ['HOME'] else: home = os.curdir diff --git a/Misc/NEWS.d/next/Documentation/2017-12-10-19-13-39.bpo-13553.gQbZs4.rst b/Misc/NEWS.d/next/Documentation/2017-12-10-19-13-39.bpo-13553.gQbZs4.rst new file mode 100644 index 0000000000000..23d3c1555e370 --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2017-12-10-19-13-39.bpo-13553.gQbZs4.rst @@ -0,0 +1 @@ +Document tkinter.Tk args. From webhook-mailer at python.org Tue May 10 00:27:59 2022 From: webhook-mailer at python.org (miss-islington) Date: Tue, 10 May 2022 04:27:59 -0000 Subject: [Python-checkins] bpo-13553: Document tkinter.Tk args (GH-4786) Message-ID: https://github.com/python/cpython/commit/5ed2f11834ca55cfeb405540401050cff9d36aa7 commit: 5ed2f11834ca55cfeb405540401050cff9d36aa7 branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-09T21:27:37-07:00 summary: bpo-13553: Document tkinter.Tk args (GH-4786) (cherry picked from commit c56e2bb9949c95ec8911cd5554b07044a564796f) Co-authored-by: Cheryl Sabella files: A Misc/NEWS.d/next/Documentation/2017-12-10-19-13-39.bpo-13553.gQbZs4.rst M Doc/library/tkinter.rst M Lib/tkinter/__init__.py diff --git a/Doc/library/tkinter.rst b/Doc/library/tkinter.rst index 65395d824cab7..37b6a02a31710 100644 --- a/Doc/library/tkinter.rst +++ b/Doc/library/tkinter.rst @@ -124,16 +124,72 @@ the modern themed widget set and API:: from tkinter import ttk -.. class:: Tk(screenName=None, baseName=None, className='Tk', useTk=1) - - The :class:`Tk` class is instantiated without arguments. This creates a toplevel - widget of Tk which usually is the main window of an application. Each instance - has its own associated Tcl interpreter. - - .. FIXME: The following keyword arguments are currently recognized: - - -.. function:: Tcl(screenName=None, baseName=None, className='Tk', useTk=0) +.. class:: Tk(screenName=None, baseName=None, className='Tk', useTk=True, sync=False, use=None) + + Construct a toplevel Tk widget, which is usually the main window of an + application, and initialize a Tcl interpreter for this widget. Each + instance has its own associated Tcl interpreter. + + The :class:`Tk` class is typically instantiated using all default values. + However, the following keyword arguments are currently recognized: + + *screenName* + When given (as a string), sets the :envvar:`DISPLAY` environment + variable. (X11 only) + *baseName* + Name of the profile file. By default, *baseName* is derived from the + program name (``sys.argv[0]``). + *className* + Name of the widget class. Used as a profile file and also as the name + with which Tcl is invoked (*argv0* in *interp*). + *useTk* + If ``True``, initialize the Tk subsystem. The :func:`tkinter.Tcl() ` + function sets this to ``False``. + *sync* + If ``True``, execute all X server commands synchronously, so that errors + are reported immediately. Can be used for debugging. (X11 only) + *use* + Specifies the *id* of the window in which to embed the application, + instead of it being created as an independent toplevel window. *id* must + be specified in the same way as the value for the -use option for + toplevel widgets (that is, it has a form like that returned by + :meth:`winfo_id`). + + Note that on some platforms this will only work correctly if *id* refers + to a Tk frame or toplevel that has its -container option enabled. + + :class:`Tk` reads and interprets profile files, named + :file:`.{className}.tcl` and :file:`.{baseName}.tcl`, into the Tcl + interpreter and calls :func:`exec` on the contents of + :file:`.{className}.py` and :file:`.{baseName}.py`. The path for the + profile files is the :envvar:`HOME` environment variable or, if that + isn't defined, then :attr:`os.curdir`. + + .. attribute:: tk + + The Tk application object created by instantiating :class:`Tk`. This + provides access to the Tcl interpreter. Each widget that is attached + the same instance of :class:`Tk` has the same value for its :attr:`tk` + attribute. + + .. attribute:: master + + The widget object that contains this widget. For :class:`Tk`, the + *master* is :const:`None` because it is the main window. The terms + *master* and *parent* are similar and sometimes used interchangeably + as argument names; however, calling :meth:`winfo_parent` returns a + string of the widget name whereas :attr:`master` returns the object. + *parent*/*child* reflects the tree-like relationship while + *master*/*slave* reflects the container structure. + + .. attribute:: children + + The immediate descendants of this widget as a :class:`dict` with the + child widget names as the keys and the child instance objects as the + values. + + +.. function:: Tcl(screenName=None, baseName=None, className='Tk', useTk=False) The :func:`Tcl` function is a factory function which creates an object much like that created by the :class:`Tk` class, except that it does not initialize the Tk diff --git a/Lib/tkinter/__init__.py b/Lib/tkinter/__init__.py index fa88448a2c071..b20c16d6c8f39 100644 --- a/Lib/tkinter/__init__.py +++ b/Lib/tkinter/__init__.py @@ -2099,7 +2099,7 @@ def wm_iconbitmap(self, bitmap=None, default=None): the bitmap if None is given. Under Windows, the DEFAULT parameter can be used to set the icon - for the widget and any descendents that don't have an icon set + for the widget and any descendants that don't have an icon set explicitly. DEFAULT can be the relative path to a .ico file (example: root.iconbitmap(default='myicon.ico') ). See Tk documentation for more information.""" @@ -2345,9 +2345,9 @@ def destroy(self): _default_root = None def readprofile(self, baseName, className): - """Internal function. It reads BASENAME.tcl and CLASSNAME.tcl into - the Tcl Interpreter and calls exec on the contents of BASENAME.py and - CLASSNAME.py if such a file exists in the home directory.""" + """Internal function. It reads .BASENAME.tcl and .CLASSNAME.tcl into + the Tcl Interpreter and calls exec on the contents of .BASENAME.py and + .CLASSNAME.py if such a file exists in the home directory.""" import os if 'HOME' in os.environ: home = os.environ['HOME'] else: home = os.curdir diff --git a/Misc/NEWS.d/next/Documentation/2017-12-10-19-13-39.bpo-13553.gQbZs4.rst b/Misc/NEWS.d/next/Documentation/2017-12-10-19-13-39.bpo-13553.gQbZs4.rst new file mode 100644 index 0000000000000..23d3c1555e370 --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2017-12-10-19-13-39.bpo-13553.gQbZs4.rst @@ -0,0 +1 @@ +Document tkinter.Tk args. From webhook-mailer at python.org Tue May 10 00:37:52 2022 From: webhook-mailer at python.org (ned-deily) Date: Tue, 10 May 2022 04:37:52 -0000 Subject: [Python-checkins] gh-92448: Update the documentation builder to render the GitHub issue (GH-92600) Message-ID: https://github.com/python/cpython/commit/aebbd7579a421208f48dd6884b67dbd3278b71ad commit: aebbd7579a421208f48dd6884b67dbd3278b71ad branch: 3.7 author: Ned Deily committer: ned-deily date: 2022-05-10T00:37:43-04:00 summary: gh-92448: Update the documentation builder to render the GitHub issue (GH-92600) files: M Doc/tools/extensions/pyspecific.py M Misc/NEWS.d/3.7.0a3.rst M Misc/NEWS.d/3.7.5.rst M Misc/NEWS.d/3.7.7rc1.rst diff --git a/Doc/tools/extensions/pyspecific.py b/Doc/tools/extensions/pyspecific.py index e4f45414dbcc8..ce8de25942c79 100644 --- a/Doc/tools/extensions/pyspecific.py +++ b/Doc/tools/extensions/pyspecific.py @@ -309,7 +309,8 @@ def run(self): # Support for including Misc/NEWS -issue_re = re.compile('(?:[Ii]ssue #|bpo-)([0-9]+)') +issue_re = re.compile('(?:[Ii]ssue #|bpo-)([0-9]+)', re.I) +gh_issue_re = re.compile('(?:gh-issue-|gh-)([0-9]+)', re.I) whatsnew_re = re.compile(r"(?im)^what's new in (.*?)\??$") @@ -336,9 +337,9 @@ def run(self): text = 'The NEWS file is not available.' node = nodes.strong(text, text) return [node] - content = issue_re.sub(r'`bpo-\1 `__', - content) + content = issue_re.sub(r':issue:`\1`', content) + # Fallback handling for the GitHub issue + content = gh_issue_re.sub(r':gh:`\1`', content) content = whatsnew_re.sub(r'\1', content) # remove first 3 lines as they are the main heading lines = ['.. default-role:: obj', ''] + content.splitlines()[3:] diff --git a/Misc/NEWS.d/3.7.0a3.rst b/Misc/NEWS.d/3.7.0a3.rst index 176441e2b0e7d..1826f8601dec7 100644 --- a/Misc/NEWS.d/3.7.0a3.rst +++ b/Misc/NEWS.d/3.7.0a3.rst @@ -289,7 +289,7 @@ by Nir Soffer. .. -.. bpo: 321010 +.. bpo: 32101 .. date: 2017-11-29-00-42-47 .. nonce: -axD5l .. section: Library diff --git a/Misc/NEWS.d/3.7.5.rst b/Misc/NEWS.d/3.7.5.rst index f01978263c7ca..ed907d42f1708 100644 --- a/Misc/NEWS.d/3.7.5.rst +++ b/Misc/NEWS.d/3.7.5.rst @@ -13,7 +13,7 @@ Prevent ctypes crash when handling arrays in structs/unions. .. nonce: 9TWMlz .. section: Library -Revert GH-15522, which introduces a regression in +Revert PR 15522, which introduces a regression in :meth:`mimetypes.guess_type` due to improper handling of filenames as urls. .. diff --git a/Misc/NEWS.d/3.7.7rc1.rst b/Misc/NEWS.d/3.7.7rc1.rst index 27d05ab4f3e4b..c87aec8e68055 100644 --- a/Misc/NEWS.d/3.7.7rc1.rst +++ b/Misc/NEWS.d/3.7.7rc1.rst @@ -180,7 +180,7 @@ Remove obsolete check for `__args__` in bdb.Bdb.format_stack_entry. .. section: Library The original fix for bpo-27657, "Fix urlparse() with numeric paths" -(GH-16839) included in 3.7.6, inadvertently introduced a behavior change +(PR 16839) included in 3.7.6, inadvertently introduced a behavior change that broke several third-party packages relying on the original undefined parsing behavior. The change is reverted in 3.7.7, restoring the behavior of 3.7.5 and earlier releases. From webhook-mailer at python.org Tue May 10 01:39:39 2022 From: webhook-mailer at python.org (serhiy-storchaka) Date: Tue, 10 May 2022 05:39:39 -0000 Subject: [Python-checkins] gh-92261: Disallow iteration of Union (and other special forms) (GH-92262) (GH-92582) Message-ID: https://github.com/python/cpython/commit/7540a432cedf478d03da1254c470ac552f397916 commit: 7540a432cedf478d03da1254c470ac552f397916 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: serhiy-storchaka date: 2022-05-10T08:39:31+03:00 summary: gh-92261: Disallow iteration of Union (and other special forms) (GH-92262) (GH-92582) (cherry picked from commit 4739997e141c4c84bd2241d4d887c3c658d92700) Co-authored-by: Matthew Rahtz files: A Misc/NEWS.d/next/Core and Builtins/2022-05-03-20-12-18.gh-issue-92261.aigLnb.rst M Lib/test/test_genericalias.py M Lib/test/test_typing.py M Lib/typing.py diff --git a/Lib/test/test_genericalias.py b/Lib/test/test_genericalias.py index 5fba74ec864f1..6959c2ae3c80e 100644 --- a/Lib/test/test_genericalias.py +++ b/Lib/test/test_genericalias.py @@ -487,5 +487,25 @@ def test_del_iter(self): del iter_x +class TypeIterationTests(unittest.TestCase): + _UNITERABLE_TYPES = (list, tuple) + + def test_cannot_iterate(self): + for test_type in self._UNITERABLE_TYPES: + with self.subTest(type=test_type): + expected_error_regex = "object is not iterable" + with self.assertRaisesRegex(TypeError, expected_error_regex): + iter(test_type) + with self.assertRaisesRegex(TypeError, expected_error_regex): + list(test_type) + with self.assertRaisesRegex(TypeError, expected_error_regex): + for _ in test_type: + pass + + def test_is_not_instance_of_iterable(self): + for type_to_test in self._UNITERABLE_TYPES: + self.assertNotIsInstance(type_to_test, Iterable) + + if __name__ == "__main__": unittest.main() diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index 8399465f6052d..6e1e8d6e1b473 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -7348,6 +7348,37 @@ def test_all_exported_names(self): self.assertSetEqual(computed_all, actual_all) +class TypeIterationTests(BaseTestCase): + _UNITERABLE_TYPES = ( + Any, + Union, + Union[str, int], + Union[str, T], + List, + Tuple, + Callable, + Callable[..., T], + Callable[[T], str], + Annotated, + Annotated[T, ''], + ) + + def test_cannot_iterate(self): + expected_error_regex = "object is not iterable" + for test_type in self._UNITERABLE_TYPES: + with self.subTest(type=test_type): + with self.assertRaisesRegex(TypeError, expected_error_regex): + iter(test_type) + with self.assertRaisesRegex(TypeError, expected_error_regex): + list(test_type) + with self.assertRaisesRegex(TypeError, expected_error_regex): + for _ in test_type: + pass + + def test_is_not_instance_of_iterable(self): + for type_to_test in self._UNITERABLE_TYPES: + self.assertNotIsInstance(type_to_test, collections.abc.Iterable) + if __name__ == '__main__': main() diff --git a/Lib/typing.py b/Lib/typing.py index bdc14e39033dc..46ef2d9cf6005 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -405,9 +405,24 @@ def __deepcopy__(self, memo): return self +class _NotIterable: + """Mixin to prevent iteration, without being compatible with Iterable. + + That is, we could do: + def __iter__(self): raise TypeError() + But this would make users of this mixin duck type-compatible with + collections.abc.Iterable - isinstance(foo, Iterable) would be True. + + Luckily, we can instead prevent iteration by setting __iter__ to None, which + is treated specially. + """ + + __iter__ = None + + # Internal indicator of special typing constructs. # See __doc__ instance attribute for specific docs. -class _SpecialForm(_Final, _root=True): +class _SpecialForm(_Final, _NotIterable, _root=True): __slots__ = ('_name', '__doc__', '_getitem') def __init__(self, getitem): @@ -1498,7 +1513,7 @@ def __iter__(self): # 1 for List and 2 for Dict. It may be -1 if variable number of # parameters are accepted (needs custom __getitem__). -class _SpecialGenericAlias(_BaseGenericAlias, _root=True): +class _SpecialGenericAlias(_NotIterable, _BaseGenericAlias, _root=True): def __init__(self, origin, nparams, *, inst=True, name=None): if name is None: name = origin.__name__ @@ -1541,7 +1556,7 @@ def __or__(self, right): def __ror__(self, left): return Union[left, self] -class _CallableGenericAlias(_GenericAlias, _root=True): +class _CallableGenericAlias(_NotIterable, _GenericAlias, _root=True): def __repr__(self): assert self._name == 'Callable' args = self.__args__ @@ -1606,7 +1621,7 @@ def __getitem__(self, params): return self.copy_with(params) -class _UnionGenericAlias(_GenericAlias, _root=True): +class _UnionGenericAlias(_NotIterable, _GenericAlias, _root=True): def copy_with(self, params): return Union[params] @@ -2046,7 +2061,7 @@ def _proto_hook(other): cls.__init__ = _no_init_or_replace_init -class _AnnotatedAlias(_GenericAlias, _root=True): +class _AnnotatedAlias(_NotIterable, _GenericAlias, _root=True): """Runtime representation of an annotated type. At its core 'Annotated[t, dec1, dec2, ...]' is an alias for the type 't' diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-03-20-12-18.gh-issue-92261.aigLnb.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-03-20-12-18.gh-issue-92261.aigLnb.rst new file mode 100644 index 0000000000000..df0228e273d8e --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-05-03-20-12-18.gh-issue-92261.aigLnb.rst @@ -0,0 +1 @@ +Fix hang when trying to iterate over a ``typing.Union``. From webhook-mailer at python.org Tue May 10 01:47:44 2022 From: webhook-mailer at python.org (serhiy-storchaka) Date: Tue, 10 May 2022 05:47:44 -0000 Subject: [Python-checkins] gh-92417: `unittest.mock` docs: remove references to Python <2.6 (GH-92539) Message-ID: https://github.com/python/cpython/commit/6823ba4a9ee1a88102e835c5a278904f35588675 commit: 6823ba4a9ee1a88102e835c5a278904f35588675 branch: main author: Alex Waygood committer: serhiy-storchaka date: 2022-05-10T08:47:36+03:00 summary: gh-92417: `unittest.mock` docs: remove references to Python <2.6 (GH-92539) files: M Doc/library/unittest.mock-examples.rst M Doc/library/unittest.mock.rst diff --git a/Doc/library/unittest.mock-examples.rst b/Doc/library/unittest.mock-examples.rst index 24a18c6848468..054efa8126632 100644 --- a/Doc/library/unittest.mock-examples.rst +++ b/Doc/library/unittest.mock-examples.rst @@ -660,7 +660,7 @@ Applying the same patch to every test method If you want several patches in place for multiple test methods the obvious way is to apply the patch decorators to every method. This can feel like unnecessary -repetition. For Python 2.6 or more recent you can use :func:`patch` (in all its +repetition. Instead, you can use :func:`patch` (in all its various forms) as a class decorator. This applies the patches to all test methods on the class. A test method is identified by methods whose names start with ``test``:: diff --git a/Doc/library/unittest.mock.rst b/Doc/library/unittest.mock.rst index a3700ac07f1c1..acc0d67541ae8 100644 --- a/Doc/library/unittest.mock.rst +++ b/Doc/library/unittest.mock.rst @@ -2381,7 +2381,7 @@ FILTER_DIR .. data:: FILTER_DIR :data:`FILTER_DIR` is a module level variable that controls the way mock objects -respond to :func:`dir` (only for Python 2.6 or more recent). The default is ``True``, +respond to :func:`dir`. The default is ``True``, which uses the filtering described below, to only show useful members. If you dislike this filtering, or need to switch it off for diagnostic purposes, then set ``mock.FILTER_DIR = False``. From webhook-mailer at python.org Tue May 10 01:48:23 2022 From: webhook-mailer at python.org (serhiy-storchaka) Date: Tue, 10 May 2022 05:48:23 -0000 Subject: [Python-checkins] gh-92417: `zlib` docs, `binascii` docs: remove Python 2 compatibility notes (GH-92543) Message-ID: https://github.com/python/cpython/commit/7c638e64050778f2e0052ec9f84cd202b8aedfce commit: 7c638e64050778f2e0052ec9f84cd202b8aedfce branch: main author: Alex Waygood committer: serhiy-storchaka date: 2022-05-10T08:48:18+03:00 summary: gh-92417: `zlib` docs, `binascii` docs: remove Python 2 compatibility notes (GH-92543) files: M Doc/library/binascii.rst M Doc/library/zlib.rst diff --git a/Doc/library/binascii.rst b/Doc/library/binascii.rst index 19efc2df9483d..4417a5ac38251 100644 --- a/Doc/library/binascii.rst +++ b/Doc/library/binascii.rst @@ -121,8 +121,6 @@ The :mod:`binascii` module defines the following functions: .. versionchanged:: 3.0 The result is always unsigned. - To generate the same numeric value when using Python 2 or earlier, - use ``crc32(data) & 0xffffffff``. .. function:: b2a_hex(data[, sep[, bytes_per_sep=1]]) hexlify(data[, sep[, bytes_per_sep=1]]) diff --git a/Doc/library/zlib.rst b/Doc/library/zlib.rst index f0c67d5ae2584..30eb99817a859 100644 --- a/Doc/library/zlib.rst +++ b/Doc/library/zlib.rst @@ -43,8 +43,6 @@ The available exception and functions in this module are: .. versionchanged:: 3.0 The result is always unsigned. - To generate the same numeric value when using Python 2 or earlier, - use ``adler32(data) & 0xffffffff``. .. function:: compress(data, /, level=-1, wbits=MAX_WBITS) @@ -137,8 +135,6 @@ The available exception and functions in this module are: .. versionchanged:: 3.0 The result is always unsigned. - To generate the same numeric value when using Python 2 or earlier, - use ``crc32(data) & 0xffffffff``. .. function:: decompress(data, /, wbits=MAX_WBITS, bufsize=DEF_BUF_SIZE) From webhook-mailer at python.org Tue May 10 02:31:09 2022 From: webhook-mailer at python.org (serhiy-storchaka) Date: Tue, 10 May 2022 06:31:09 -0000 Subject: [Python-checkins] gh-76773: Update docs mentioning no-longer-supported Windows versions & features (GH-92529) Message-ID: https://github.com/python/cpython/commit/f1bbcba74f77eff2a4c0881f3d529f3bf0664d40 commit: f1bbcba74f77eff2a4c0881f3d529f3bf0664d40 branch: main author: CAM Gerlach committer: serhiy-storchaka date: 2022-05-10T09:30:32+03:00 summary: gh-76773: Update docs mentioning no-longer-supported Windows versions & features (GH-92529) files: M Doc/extending/windows.rst M Doc/faq/windows.rst M Doc/library/ctypes.rst M Doc/library/optparse.rst M Doc/library/os.path.rst M Doc/library/tempfile.rst M Doc/using/windows.rst M PC/readme.txt M PCbuild/readme.txt diff --git a/Doc/extending/windows.rst b/Doc/extending/windows.rst index c7b92c6ea24ca..28d0350f6f114 100644 --- a/Doc/extending/windows.rst +++ b/Doc/extending/windows.rst @@ -106,8 +106,7 @@ Using DLLs in Practice Windows Python is built in Microsoft Visual C++; using other compilers may or -may not work (though Borland seems to). The rest of this section is MSVC++ -specific. +may not work. The rest of this section is MSVC++ specific. When creating DLLs in Windows, you must pass :file:`pythonXY.lib` to the linker. To build two DLLs, spam and ni (which uses C functions found in spam), you could @@ -134,4 +133,3 @@ Developer Studio will throw in a lot of import libraries that you do not really need, adding about 100K to your executable. To get rid of them, use the Project Settings dialog, Link tab, to specify *ignore default libraries*. Add the correct :file:`msvcrtxx.lib` to the list of libraries. - diff --git a/Doc/faq/windows.rst b/Doc/faq/windows.rst index 6b95819c8ee85..df7ab71f4b662 100644 --- a/Doc/faq/windows.rst +++ b/Doc/faq/windows.rst @@ -26,8 +26,8 @@ with running programs from the Windows command line then everything will seem obvious; otherwise, you might need a little more guidance. Unless you use some sort of integrated development environment, you will end up -*typing* Windows commands into what is variously referred to as a "DOS window" -or "Command prompt window". Usually you can create such a window from your +*typing* Windows commands into what is referred to as a +"Command prompt window". Usually you can create such a window from your search bar by searching for ``cmd``. You should be able to recognize when you have started such a window because you will see a Windows "command prompt", which usually looks like this: @@ -186,9 +186,6 @@ Embedding the Python interpreter in a Windows app can be summarized as follows: by the Windows ``GetProcAddress()`` routine. Macros can make using these pointers transparent to any C code that calls routines in Python's C API. - Borland note: convert :file:`python{NN}.lib` to OMF format using Coff2Omf.exe - first. - .. XXX what about static linking? 2. If you use SWIG, it is easy to create a Python "extension module" that will @@ -279,4 +276,3 @@ How do I check for a keypress without blocking? Use the :mod:`msvcrt` module. This is a standard Windows-specific extension module. It defines a function ``kbhit()`` which checks whether a keyboard hit is present, and ``getch()`` which gets one character without echoing it. - diff --git a/Doc/library/ctypes.rst b/Doc/library/ctypes.rst index 6cca569a3f1c8..52950b551b756 100644 --- a/Doc/library/ctypes.rst +++ b/Doc/library/ctypes.rst @@ -1360,10 +1360,6 @@ way is to instantiate one of the following classes: functions in these libraries use the ``stdcall`` calling convention, and are assumed to return :c:type:`int` by default. - On Windows CE only the standard calling convention is used, for convenience the - :class:`WinDLL` and :class:`OleDLL` use the standard calling convention on this - platform. - The Python :term:`global interpreter lock` is released before calling any function exported by these libraries, and reacquired afterwards. @@ -1664,8 +1660,7 @@ See :ref:`ctypes-callback-functions` for examples. .. function:: WINFUNCTYPE(restype, *argtypes, use_errno=False, use_last_error=False) Windows only: The returned function prototype creates functions that use the - ``stdcall`` calling convention, except on Windows CE where - :func:`WINFUNCTYPE` is the same as :func:`CFUNCTYPE`. The function will + ``stdcall`` calling convention. The function will release the GIL during the call. *use_errno* and *use_last_error* have the same meaning as above. diff --git a/Doc/library/optparse.rst b/Doc/library/optparse.rst index b1094198f4c84..0d686b10365a6 100644 --- a/Doc/library/optparse.rst +++ b/Doc/library/optparse.rst @@ -131,7 +131,7 @@ option These option syntaxes are not supported by :mod:`optparse`, and they never will be. This is deliberate: the first three are non-standard on any environment, and the last only makes sense if you're exclusively targeting - VMS, MS-DOS, and/or Windows. + Windows or certain legacy platforms (e.g. VMS, MS-DOS). option argument an argument that follows an option, is closely associated with that option, diff --git a/Doc/library/os.path.rst b/Doc/library/os.path.rst index c201b1460ede3..ce7913e3712d7 100644 --- a/Doc/library/os.path.rst +++ b/Doc/library/os.path.rst @@ -5,7 +5,7 @@ :synopsis: Operations on pathnames. **Source code:** :source:`Lib/posixpath.py` (for POSIX) and -:source:`Lib/ntpath.py` (for Windows NT). +:source:`Lib/ntpath.py` (for Windows). .. index:: single: path; operations diff --git a/Doc/library/tempfile.rst b/Doc/library/tempfile.rst index 8fe38b5e81c08..b7e604c1b70ac 100644 --- a/Doc/library/tempfile.rst +++ b/Doc/library/tempfile.rst @@ -84,7 +84,7 @@ The module defines the following user-callable items: file-like object. Whether the name can be used to open the file a second time, while the named temporary file is still open, varies across platforms (it can be so used on Unix; it cannot - on Windows NT or later). If *delete* is true (the default), the file is + on Windows). If *delete* is true (the default), the file is deleted as soon as it is closed. The returned object is always a file-like object whose :attr:`!file` attribute is the underlying true file object. This file-like object can diff --git a/Doc/using/windows.rst b/Doc/using/windows.rst index 1d1be20bea25f..dcc533726813c 100644 --- a/Doc/using/windows.rst +++ b/Doc/using/windows.rst @@ -391,7 +391,9 @@ may be changed from ``.``, and the package will be installed into a subdirectory. By default, the subdirectory is named the same as the package, and without the ``-ExcludeVersion`` option this name will include the specific version installed. Inside the subdirectory is a ``tools`` directory that -contains the Python installation:: +contains the Python installation: + +.. code-block:: doscon # Without -ExcludeVersion > .\python.3.5.2\tools\python.exe -V @@ -438,7 +440,7 @@ dependants, such as Idle), pip and the Python documentation are not included. .. note:: The embedded distribution does not include the `Microsoft C Runtime - `_ and it is + `_ and it is the responsibility of the application installer to provide this. The runtime may have already been installed on a user's system previously or automatically via Windows Update, and can be detected by finding @@ -572,27 +574,22 @@ System variables, you need non-restricted access to your machine Windows will concatenate User variables *after* System variables, which may cause unexpected results when modifying :envvar:`PATH`. - The :envvar:`PYTHONPATH` variable is used by all versions of Python 2 and - Python 3, so you should not permanently configure this variable unless it - only includes code that is compatible with all of your installed Python + The :envvar:`PYTHONPATH` variable is used by all versions of Python, + so you should not permanently configure it unless the listed paths + only include code that is compatible with all of your installed Python versions. .. seealso:: - https://www.microsoft.com/en-us/wdsi/help/folder-variables - Environment variables in Windows NT - - https://technet.microsoft.com/en-us/library/cc754250.aspx - The SET command, for temporarily modifying environment variables + https://docs.microsoft.com/en-us/windows/win32/procthread/environment-variables + Overview of environment variables on Windows - https://technet.microsoft.com/en-us/library/cc755104.aspx - The SETX command, for permanently modifying environment variables + https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/set_1 + The ``set`` command, for temporarily modifying environment variables - https://support.microsoft.com/en-us/help/310519/how-to-manage-environment-variables-in-windows-xp - How To Manage Environment Variables in Windows XP + https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/setx + The ``setx`` command, for permanently modifying environment variables - https://www.chem.gla.ac.uk/~louis/software/faq/q1.html - Setting Environment variables, Louis J. Farrugia .. _windows-path-mod: @@ -690,9 +687,7 @@ From the command-line System-wide installations of Python 3.3 and later will put the launcher on your :envvar:`PATH`. The launcher is compatible with all available versions of Python, so it does not matter which version is installed. To check that the -launcher is available, execute the following command in Command Prompt: - -:: +launcher is available, execute the following command in Command Prompt:: py @@ -700,26 +695,20 @@ You should find that the latest version of Python you have installed is started - it can be exited as normal, and any additional command-line arguments specified will be sent directly to Python. -If you have multiple versions of Python installed (e.g., 2.7 and |version|) you -will have noticed that Python |version| was started - to launch Python 2.7, try -the command: - -:: - - py -2.7 +If you have multiple versions of Python installed (e.g., 3.7 and |version|) you +will have noticed that Python |version| was started - to launch Python 3.7, try +the command:: -If you want the latest version of Python 2.x you have installed, try the -command: + py -3.7 -:: +If you want the latest version of Python 2 you have installed, try the +command:: py -2 -You should find the latest version of Python 2.x starts. +You should find the latest version of Python 3.x starts. -If you see the following error, you do not have the launcher installed: - -:: +If you see the following error, you do not have the launcher installed:: 'py' is not recognized as an internal or external command, operable program or batch file. @@ -727,11 +716,11 @@ If you see the following error, you do not have the launcher installed: Per-user installations of Python do not add the launcher to :envvar:`PATH` unless the option was selected on installation. -:: +The command:: py --list -You should see the currently installed versions of Python. +displays the currently installed version(s) of Python. Virtual environments ^^^^^^^^^^^^^^^^^^^^ @@ -757,9 +746,7 @@ following contents import sys sys.stdout.write("hello from Python %s\n" % (sys.version,)) -From the directory in which hello.py lives, execute the command: - -:: +From the directory in which hello.py lives, execute the command:: py hello.py @@ -772,9 +759,9 @@ is printed. Now try changing the first line to be: Re-executing the command should now print the latest Python 3.x information. As with the above command-line examples, you can specify a more explicit -version qualifier. Assuming you have Python 2.6 installed, try changing the -first line to ``#! python2.6`` and you should find the 2.6 version -information printed. +version qualifier. Assuming you have Python 3.7 installed, try changing +the first line to ``#! python3.7`` and you should find the |version| +version information printed. Note that unlike interactive use, a bare "python" will use the latest version of Python 2.x that you have installed. This is for backward @@ -827,8 +814,8 @@ shebang lines starting with ``/usr``. Any of the above virtual commands can be suffixed with an explicit version (either just the major version, or the major and minor version). Furthermore the 32-bit version can be requested by adding "-32" after the -minor version. I.e. ``/usr/bin/python2.7-32`` will request usage of the -32-bit python 2.7. +minor version. I.e. ``/usr/bin/python3.7-32`` will request usage of the +32-bit python 3.7. .. versionadded:: 3.7 @@ -921,19 +908,19 @@ Examples: ``python2`` will use the latest Python 2.x version installed and the command ``python3`` will use the latest Python 3.x installed. -* The commands ``python3.1`` and ``python2.7`` will not consult any +* The command ``python3.7`` will not consult any options at all as the versions are fully specified. * If ``PY_PYTHON=3``, the commands ``python`` and ``python3`` will both use the latest installed Python 3 version. -* If ``PY_PYTHON=3.1-32``, the command ``python`` will use the 32-bit - implementation of 3.1 whereas the command ``python3`` will use the latest +* If ``PY_PYTHON=3.7-32``, the command ``python`` will use the 32-bit + implementation of 3.7 whereas the command ``python3`` will use the latest installed Python (PY_PYTHON was not considered at all as a major version was specified.) -* If ``PY_PYTHON=3`` and ``PY_PYTHON3=3.1``, the commands - ``python`` and ``python3`` will both use specifically 3.1 +* If ``PY_PYTHON=3`` and ``PY_PYTHON3=3.7``, the commands + ``python`` and ``python3`` will both use specifically 3.7 In addition to environment variables, the same settings can be configured in the .INI file used by the launcher. The section in the INI file is @@ -944,21 +931,21 @@ an environment variable will override things specified in the INI file. For example: -* Setting ``PY_PYTHON=3.1`` is equivalent to the INI file containing: +* Setting ``PY_PYTHON=3.7`` is equivalent to the INI file containing: .. code-block:: ini [defaults] - python=3.1 + python=3.7 -* Setting ``PY_PYTHON=3`` and ``PY_PYTHON3=3.1`` is equivalent to the INI file +* Setting ``PY_PYTHON=3`` and ``PY_PYTHON3=3.7`` is equivalent to the INI file containing: .. code-block:: ini [defaults] python=3 - python3=3.1 + python3=3.7 Diagnostics ----------- @@ -1145,13 +1132,14 @@ is a collection of modules for advanced Windows-specific support. This includes utilities for: * `Component Object Model - `_ + `_ (COM) * Win32 API calls * Registry * Event log -* `Microsoft Foundation Classes `_ (MFC) - user interfaces +* `Microsoft Foundation Classes + `_ + (MFC) user interfaces `PythonWin `_ is a sample MFC application @@ -1162,7 +1150,7 @@ shipped with PyWin32. It is an embeddable IDE with a built-in debugger. `Win32 How Do I...? `_ by Tim Golden - `Python and COM `_ + `Python and COM `_ by David and Paul Boddie @@ -1176,18 +1164,6 @@ you can distribute your application without requiring your users to install Python. -WConio ------- - -Since Python's advanced terminal handling layer, :mod:`curses`, is restricted to -Unix-like systems, there is a library exclusive to Windows as well: Windows -Console I/O for Python. - -`WConio `_ is a wrapper for -Turbo-C's :file:`CONIO.H`, used to create text user interfaces. - - - Compiling Python on Windows =========================== @@ -1197,21 +1173,13 @@ latest release's source or just grab a fresh `checkout `_. The source tree contains a build solution and project files for Microsoft -Visual Studio 2015, which is the compiler used to build the official Python +Visual Studio, which is the compiler used to build the official Python releases. These files are in the :file:`PCbuild` directory. Check :file:`PCbuild/readme.txt` for general information on the build process. - For extension modules, consult :ref:`building-on-windows`. -.. seealso:: - - `Python + Windows + distutils + SWIG + gcc MinGW `_ - or "Creating Python extensions in C/C++ with SWIG and compiling them with - MinGW gcc under Windows" or "Installing Python extension with distutils - and without Microsoft Visual C++" by S?bastien Sauvage, 2003 - Other Platforms =============== @@ -1220,12 +1188,12 @@ With ongoing development of Python, some platforms that used to be supported earlier are no longer supported (due to the lack of users or developers). Check :pep:`11` for details on all unsupported platforms. -* `Windows CE `_ is still supported. -* The `Cygwin `_ installer offers to install the Python - interpreter as well (cf. `Cygwin package source - `_, `Maintainer releases - `_) +* `Windows CE `_ is + `no longer supported `__ + since Python 3 (if it ever was). +* The `Cygwin `_ installer offers to install the + `Python interpreter `__ + as well See `Python for Windows `_ for detailed information about platforms with pre-compiled installers. diff --git a/PC/readme.txt b/PC/readme.txt index 0a96d269b0977..4e6dcf98c937f 100644 --- a/PC/readme.txt +++ b/PC/readme.txt @@ -18,7 +18,7 @@ All PC ports use this scheme to try to set up a module search path: 1) The script location; the current directory without script. 2) The PYTHONPATH variable, if set. - 3) For Win32 platforms (NT/95), paths specified in the Registry. + 3) Paths specified in the Registry. 4) Default directories lib, lib/win, lib/test, lib/tkinter; these are searched relative to the environment variable PYTHONHOME, if set, or relative to the executable and its @@ -26,8 +26,8 @@ All PC ports use this scheme to try to set up a module search path: or the current directory (not useful). 5) The directory containing the executable. -The best installation strategy is to put the Python executable (and -DLL, for Win32 platforms) in some convenient directory such as +The best installation strategy is to put the Python executable and +DLL in some convenient directory such as C:/python, and copy all library files and subdirectories (using XCOPY) to C:/python/lib. Then you don't need to set PYTHONPATH. Otherwise, set the environment variable PYTHONPATH to your Python search path. diff --git a/PCbuild/readme.txt b/PCbuild/readme.txt index 2c820e54c2cb1..e4cad75189c97 100644 --- a/PCbuild/readme.txt +++ b/PCbuild/readme.txt @@ -13,12 +13,10 @@ Quick Start Guide Building Python using Microsoft Visual C++ ------------------------------------------ -This directory is used to build CPython for Microsoft Windows NT version -6.0 or higher (Windows Vista, Windows Server 2008, or later) on 32 and 64 +This directory is used to build CPython for Microsoft Windows on 32- and 64- bit platforms. Using this directory requires an installation of -Microsoft Visual Studio 2017 (MSVC 14.1) with the *Python workload* and -its optional *Python native development* component selected. (For -command-line builds, Visual Studio 2015 may also be used.) +Microsoft Visual Studio (MSVC) with the *Python workload* and +its optional *Python native development* component selected. Building from the command line is recommended in order to obtain any external dependencies. To build, simply run the "build.bat" script without @@ -105,7 +103,7 @@ pythonw Prompt window pylauncher py.exe, the Python Launcher for Windows, see - http://docs.python.org/3/using/windows.html#launcher + https://docs.python.org/3/using/windows.html#launcher pywlauncher pyw.exe, a variant of py.exe that doesn't open a Command Prompt window @@ -168,14 +166,14 @@ _bz2 _lzma Python wrapper for version 5.2.2 of the liblzma compression library Homepage: - http://tukaani.org/xz/ + https://tukaani.org/xz/ _ssl Python wrapper for version 1.1.1k of the OpenSSL secure sockets library, which is downloaded from our binaries repository at https://github.com/python/cpython-bin-deps. Homepage: - http://www.openssl.org/ + https://www.openssl.org/ Building OpenSSL requires Perl on your path, and can be performed by running PCbuild\prepare_ssl.bat. This will retrieve the version of @@ -191,14 +189,14 @@ _ssl _sqlite3 Wraps SQLite 3.38.4, which is itself built by sqlite3.vcxproj Homepage: - http://www.sqlite.org/ + https://www.sqlite.org/ _tkinter Wraps version 8.6.6 of the Tk windowing system, which is downloaded from our binaries repository at https://github.com/python/cpython-bin-deps. Homepage: - http://www.tcl.tk/ + https://www.tcl.tk/ Building Tcl and Tk can be performed by running PCbuild\prepare_tcltk.bat. This will retrieve the version of the @@ -257,7 +255,7 @@ It creates the PGI files, runs the unit test suite or PyBench with the PGI python, and finally creates the optimized files. See - http://msdn.microsoft.com/en-us/library/e7k32f4k(VS.140).aspx + https://docs.microsoft.com/en-us/cpp/build/profile-guided-optimizations for more on this topic. From webhook-mailer at python.org Tue May 10 03:24:09 2022 From: webhook-mailer at python.org (erlend-aasland) Date: Tue, 10 May 2022 07:24:09 -0000 Subject: [Python-checkins] gh-92256: Improve Argument Clinic parser error messages (#92268) Message-ID: https://github.com/python/cpython/commit/4bd07d1dbd493fc9b2c2a77e9e905c517682052e commit: 4bd07d1dbd493fc9b2c2a77e9e905c517682052e branch: main author: Erlend Egeberg Aasland committer: erlend-aasland date: 2022-05-10T09:23:42+02:00 summary: gh-92256: Improve Argument Clinic parser error messages (#92268) Co-authored-by: Serhiy Storchaka Co-authored-by: Victor Stinner files: M Tools/clinic/clinic.py diff --git a/Tools/clinic/clinic.py b/Tools/clinic/clinic.py index bf0fe5bed5a76..5ad4f879a33f7 100755 --- a/Tools/clinic/clinic.py +++ b/Tools/clinic/clinic.py @@ -1628,10 +1628,16 @@ def parse_clinic_block(self, dsl_name): def is_stop_line(line): # make sure to recognize stop line even if it # doesn't end with EOL (it could be the very end of the file) - if not line.startswith(stop_line): + if line.startswith(stop_line): + remainder = line[len(stop_line):] + if remainder and not remainder.isspace(): + fail(f"Garbage after stop line: {remainder!r}") + return True + else: + # gh-92256: don't allow incorrectly formatted stop lines + if line.lstrip().startswith(stop_line): + fail(f"Whitespace is not allowed before the stop line: {line!r}") return False - remainder = line[len(stop_line):] - return (not remainder) or remainder.isspace() # consume body of program while self.input: From webhook-mailer at python.org Tue May 10 03:43:22 2022 From: webhook-mailer at python.org (ezio-melotti) Date: Tue, 10 May 2022 07:43:22 -0000 Subject: [Python-checkins] [3.8] gh-91888: add a `:gh:` role to the documentation (GH-91889) (#91936) Message-ID: https://github.com/python/cpython/commit/06389410e97d4bea01900d53a5888bdd86dda50d commit: 06389410e97d4bea01900d53a5888bdd86dda50d branch: 3.8 author: Ezio Melotti committer: ezio-melotti date: 2022-05-10T09:43:17+02:00 summary: [3.8] gh-91888: add a `:gh:` role to the documentation (GH-91889) (#91936) * gh-91888: Add a :gh: role to the documentation (GH-91889). * [3.8] gh-91888: add a `:gh:` role to the documentation (GH-91889) * Add a new :gh:`...` role for GitHub issues. * Fix a GitHub id to use the :gh: role. * Add Misc/NEWS entry. * Refactoring and rephrasing. Co-authored-by: Hugo van Kemenade . (cherry picked from commit f7641a2ffec243e5f600028a84debe9028a9ee44) Co-authored-by: Ezio Melotti * Fix use of the default role in NEWS entry files: A Misc/NEWS.d/next/Documentation/2022-04-24-22-09-31.gh-issue-91888.kTjJLx.rst M Doc/tools/extensions/pyspecific.py diff --git a/Doc/tools/extensions/pyspecific.py b/Doc/tools/extensions/pyspecific.py index e3369cdc1ebe1..71ec09fd04701 100644 --- a/Doc/tools/extensions/pyspecific.py +++ b/Doc/tools/extensions/pyspecific.py @@ -43,7 +43,8 @@ import suspicious -ISSUE_URI = 'https://bugs.python.org/issue%s' +ISSUE_URI = 'https://bugs.python.org/issue?@action=redirect&bpo=%s' +GH_ISSUE_URI = 'https://github.com/python/cpython/issues/%s' SOURCE_URI = 'https://github.com/python/cpython/tree/3.8/%s' # monkey-patch reST parser to disable alphabetic and roman enumerated lists @@ -58,11 +59,33 @@ def issue_role(typ, rawtext, text, lineno, inliner, options={}, content=[]): issue = utils.unescape(text) + # sanity check: there are no bpo issues within these two values + if 47261 < int(issue) < 400000: + msg = inliner.reporter.error(f'The BPO ID {text!r} seems too high -- ' + 'use :gh:`...` for GitHub IDs', line=lineno) + prb = inliner.problematic(rawtext, rawtext, msg) + return [prb], [msg] text = 'bpo-' + issue refnode = nodes.reference(text, text, refuri=ISSUE_URI % issue) return [refnode], [] +# Support for marking up and linking to GitHub issues + +def gh_issue_role(typ, rawtext, text, lineno, inliner, options={}, content=[]): + issue = utils.unescape(text) + # sanity check: all GitHub issues have ID >= 32426 + # even though some of them are also valid BPO IDs + if int(issue) < 32426: + msg = inliner.reporter.error(f'The GitHub ID {text!r} seems too low -- ' + 'use :issue:`...` for BPO IDs', line=lineno) + prb = inliner.problematic(rawtext, rawtext, msg) + return [prb], [msg] + text = 'gh-' + issue + refnode = nodes.reference(text, text, refuri=GH_ISSUE_URI % issue) + return [refnode], [] + + # Support for linking to Python source files easily def source_role(typ, rawtext, text, lineno, inliner, options={}, content=[]): @@ -575,6 +598,7 @@ def process_audit_events(app, doctree, fromdocname): def setup(app): app.add_role('issue', issue_role) + app.add_role('gh', gh_issue_role) app.add_role('source', source_role) app.add_directive('impl-detail', ImplementationDetail) app.add_directive('availability', Availability) diff --git a/Misc/NEWS.d/next/Documentation/2022-04-24-22-09-31.gh-issue-91888.kTjJLx.rst b/Misc/NEWS.d/next/Documentation/2022-04-24-22-09-31.gh-issue-91888.kTjJLx.rst new file mode 100644 index 0000000000000..4ebca42a7fec5 --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2022-04-24-22-09-31.gh-issue-91888.kTjJLx.rst @@ -0,0 +1 @@ +Add a new ``gh`` role to the documentation to link to GitHub issues. From webhook-mailer at python.org Tue May 10 03:43:30 2022 From: webhook-mailer at python.org (miss-islington) Date: Tue, 10 May 2022 07:43:30 -0000 Subject: [Python-checkins] gh-92256: Improve Argument Clinic parser error messages (GH-92268) Message-ID: https://github.com/python/cpython/commit/7954b664d4c5db56ec28da57e783186f4d713517 commit: 7954b664d4c5db56ec28da57e783186f4d713517 branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-10T00:43:26-07:00 summary: gh-92256: Improve Argument Clinic parser error messages (GH-92268) Co-authored-by: Serhiy Storchaka Co-authored-by: Victor Stinner (cherry picked from commit 4bd07d1dbd493fc9b2c2a77e9e905c517682052e) Co-authored-by: Erlend Egeberg Aasland files: M Tools/clinic/clinic.py diff --git a/Tools/clinic/clinic.py b/Tools/clinic/clinic.py index b442c494d31d4..9ea2784085aac 100755 --- a/Tools/clinic/clinic.py +++ b/Tools/clinic/clinic.py @@ -1566,10 +1566,16 @@ def parse_clinic_block(self, dsl_name): def is_stop_line(line): # make sure to recognize stop line even if it # doesn't end with EOL (it could be the very end of the file) - if not line.startswith(stop_line): + if line.startswith(stop_line): + remainder = line[len(stop_line):] + if remainder and not remainder.isspace(): + fail(f"Garbage after stop line: {remainder!r}") + return True + else: + # gh-92256: don't allow incorrectly formatted stop lines + if line.lstrip().startswith(stop_line): + fail(f"Whitespace is not allowed before the stop line: {line!r}") return False - remainder = line[len(stop_line):] - return (not remainder) or remainder.isspace() # consume body of program while self.input: From webhook-mailer at python.org Tue May 10 03:47:22 2022 From: webhook-mailer at python.org (ezio-melotti) Date: Tue, 10 May 2022 07:47:22 -0000 Subject: [Python-checkins] Add redirects to Misc/NEWS bpo links (GH-91454) (#91895) Message-ID: https://github.com/python/cpython/commit/b3b1ff1ca90efd36921fdb16900070a8b3d6baaf commit: b3b1ff1ca90efd36921fdb16900070a8b3d6baaf branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: ezio-melotti date: 2022-05-10T09:47:04+02:00 summary: Add redirects to Misc/NEWS bpo links (GH-91454) (#91895) (cherry picked from commit 17dbb6bc10ca8a8b602335414c047294f00afcbe) Co-authored-by: Ezio Melotti Co-authored-by: Ezio Melotti files: M Doc/tools/extensions/pyspecific.py diff --git a/Doc/tools/extensions/pyspecific.py b/Doc/tools/extensions/pyspecific.py index 71ec09fd04701..cd9144ea09d3f 100644 --- a/Doc/tools/extensions/pyspecific.py +++ b/Doc/tools/extensions/pyspecific.py @@ -417,7 +417,8 @@ def run(self): text = 'The NEWS file is not available.' node = nodes.strong(text, text) return [node] - content = issue_re.sub(r'`bpo-\1 `__', + content = issue_re.sub(r'`bpo-\1 `__', content) content = whatsnew_re.sub(r'\1', content) # remove first 3 lines as they are the main heading From webhook-mailer at python.org Tue May 10 03:48:41 2022 From: webhook-mailer at python.org (miss-islington) Date: Tue, 10 May 2022 07:48:41 -0000 Subject: [Python-checkins] gh-92256: Improve Argument Clinic parser error messages (GH-92268) Message-ID: https://github.com/python/cpython/commit/de3349019bb1e6917ef284f7fd5f4cb5201b5745 commit: de3349019bb1e6917ef284f7fd5f4cb5201b5745 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-10T00:48:34-07:00 summary: gh-92256: Improve Argument Clinic parser error messages (GH-92268) Co-authored-by: Serhiy Storchaka Co-authored-by: Victor Stinner (cherry picked from commit 4bd07d1dbd493fc9b2c2a77e9e905c517682052e) Co-authored-by: Erlend Egeberg Aasland files: M Tools/clinic/clinic.py diff --git a/Tools/clinic/clinic.py b/Tools/clinic/clinic.py index bf0fe5bed5a76..5ad4f879a33f7 100755 --- a/Tools/clinic/clinic.py +++ b/Tools/clinic/clinic.py @@ -1628,10 +1628,16 @@ def parse_clinic_block(self, dsl_name): def is_stop_line(line): # make sure to recognize stop line even if it # doesn't end with EOL (it could be the very end of the file) - if not line.startswith(stop_line): + if line.startswith(stop_line): + remainder = line[len(stop_line):] + if remainder and not remainder.isspace(): + fail(f"Garbage after stop line: {remainder!r}") + return True + else: + # gh-92256: don't allow incorrectly formatted stop lines + if line.lstrip().startswith(stop_line): + fail(f"Whitespace is not allowed before the stop line: {line!r}") return False - remainder = line[len(stop_line):] - return (not remainder) or remainder.isspace() # consume body of program while self.input: From webhook-mailer at python.org Tue May 10 03:49:13 2022 From: webhook-mailer at python.org (miss-islington) Date: Tue, 10 May 2022 07:49:13 -0000 Subject: [Python-checkins] gh-92256: Improve Argument Clinic parser error messages (GH-92268) Message-ID: https://github.com/python/cpython/commit/35d589cfb861ed81b5a235eb8fdcde3f143c4367 commit: 35d589cfb861ed81b5a235eb8fdcde3f143c4367 branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-10T00:49:09-07:00 summary: gh-92256: Improve Argument Clinic parser error messages (GH-92268) Co-authored-by: Serhiy Storchaka Co-authored-by: Victor Stinner (cherry picked from commit 4bd07d1dbd493fc9b2c2a77e9e905c517682052e) Co-authored-by: Erlend Egeberg Aasland files: M Tools/clinic/clinic.py diff --git a/Tools/clinic/clinic.py b/Tools/clinic/clinic.py index 655e386512a58..c68ee9a232078 100755 --- a/Tools/clinic/clinic.py +++ b/Tools/clinic/clinic.py @@ -1566,10 +1566,16 @@ def parse_clinic_block(self, dsl_name): def is_stop_line(line): # make sure to recognize stop line even if it # doesn't end with EOL (it could be the very end of the file) - if not line.startswith(stop_line): + if line.startswith(stop_line): + remainder = line[len(stop_line):] + if remainder and not remainder.isspace(): + fail(f"Garbage after stop line: {remainder!r}") + return True + else: + # gh-92256: don't allow incorrectly formatted stop lines + if line.lstrip().startswith(stop_line): + fail(f"Whitespace is not allowed before the stop line: {line!r}") return False - remainder = line[len(stop_line):] - return (not remainder) or remainder.isspace() # consume body of program while self.input: From webhook-mailer at python.org Tue May 10 03:51:34 2022 From: webhook-mailer at python.org (ezio-melotti) Date: Tue, 10 May 2022 07:51:34 -0000 Subject: [Python-checkins] [3.8] Update Sphinx bpo role to use redirect URI. (#91892) Message-ID: https://github.com/python/cpython/commit/10bc004642786662324a2b0fc9a804e1110f582b commit: 10bc004642786662324a2b0fc9a804e1110f582b branch: 3.8 author: Ezio Melotti committer: ezio-melotti date: 2022-05-10T09:51:20+02:00 summary: [3.8] Update Sphinx bpo role to use redirect URI. (#91892) * Update Sphinx bpo role to use redirect URI. (GH-32342) * [3.8] Update Sphinx bpo role to use redirect URI. (GH-32342). (cherry picked from commit 08cfe079503ffd19d8b7ab324f0fdb1c6b150ca8) Co-authored-by: Ezio Melotti files: From webhook-mailer at python.org Tue May 10 05:18:16 2022 From: webhook-mailer at python.org (serhiy-storchaka) Date: Tue, 10 May 2022 09:18:16 -0000 Subject: [Python-checkins] Add `__slots__` to `typing._NotIterable` (GH-92570) Message-ID: https://github.com/python/cpython/commit/eef47d5bc79469c2d5328d6f5a9732e44a49dd5a commit: eef47d5bc79469c2d5328d6f5a9732e44a49dd5a branch: main author: Alex Waygood committer: serhiy-storchaka date: 2022-05-10T12:17:54+03:00 summary: Add `__slots__` to `typing._NotIterable` (GH-92570) files: M Lib/typing.py diff --git a/Lib/typing.py b/Lib/typing.py index 9fa4c48b45e85..306bb9fb6df78 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -427,6 +427,7 @@ def __iter__(self): raise TypeError() is treated specially. """ + __slots__ = () __iter__ = None From webhook-mailer at python.org Tue May 10 05:28:39 2022 From: webhook-mailer at python.org (miss-islington) Date: Tue, 10 May 2022 09:28:39 -0000 Subject: [Python-checkins] [3.11] gh-92417: `unittest.mock` docs: remove references to Python <2.6 (GH-92539) (GH-92606) Message-ID: https://github.com/python/cpython/commit/c84f547d1db44a0f0ee238140552de014e1f7b43 commit: c84f547d1db44a0f0ee238140552de014e1f7b43 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-10T02:28:20-07:00 summary: [3.11] gh-92417: `unittest.mock` docs: remove references to Python <2.6 (GH-92539) (GH-92606) (cherry picked from commit 6823ba4a9ee1a88102e835c5a278904f35588675) Co-authored-by: Alex Waygood Automerge-Triggered-By: GH:serhiy-storchaka files: M Doc/library/unittest.mock-examples.rst M Doc/library/unittest.mock.rst diff --git a/Doc/library/unittest.mock-examples.rst b/Doc/library/unittest.mock-examples.rst index 24a18c6848468..054efa8126632 100644 --- a/Doc/library/unittest.mock-examples.rst +++ b/Doc/library/unittest.mock-examples.rst @@ -660,7 +660,7 @@ Applying the same patch to every test method If you want several patches in place for multiple test methods the obvious way is to apply the patch decorators to every method. This can feel like unnecessary -repetition. For Python 2.6 or more recent you can use :func:`patch` (in all its +repetition. Instead, you can use :func:`patch` (in all its various forms) as a class decorator. This applies the patches to all test methods on the class. A test method is identified by methods whose names start with ``test``:: diff --git a/Doc/library/unittest.mock.rst b/Doc/library/unittest.mock.rst index a3700ac07f1c1..acc0d67541ae8 100644 --- a/Doc/library/unittest.mock.rst +++ b/Doc/library/unittest.mock.rst @@ -2381,7 +2381,7 @@ FILTER_DIR .. data:: FILTER_DIR :data:`FILTER_DIR` is a module level variable that controls the way mock objects -respond to :func:`dir` (only for Python 2.6 or more recent). The default is ``True``, +respond to :func:`dir`. The default is ``True``, which uses the filtering described below, to only show useful members. If you dislike this filtering, or need to switch it off for diagnostic purposes, then set ``mock.FILTER_DIR = False``. From webhook-mailer at python.org Tue May 10 05:28:39 2022 From: webhook-mailer at python.org (miss-islington) Date: Tue, 10 May 2022 09:28:39 -0000 Subject: [Python-checkins] [3.10] gh-76773: Update docs mentioning no-longer-supported Windows versions & features (GH-92529) (GH-92609) Message-ID: https://github.com/python/cpython/commit/dd0e8a62df8be2a09ef6035b4c92bd9a68a7b918 commit: dd0e8a62df8be2a09ef6035b4c92bd9a68a7b918 branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-10T02:28:22-07:00 summary: [3.10] gh-76773: Update docs mentioning no-longer-supported Windows versions & features (GH-92529) (GH-92609) (cherry picked from commit f1bbcba74f77eff2a4c0881f3d529f3bf0664d40) Co-authored-by: CAM Gerlach Automerge-Triggered-By: GH:serhiy-storchaka files: M Doc/extending/windows.rst M Doc/faq/windows.rst M Doc/library/ctypes.rst M Doc/library/optparse.rst M Doc/library/os.path.rst M Doc/library/tempfile.rst M Doc/using/windows.rst M PC/readme.txt M PCbuild/readme.txt diff --git a/Doc/extending/windows.rst b/Doc/extending/windows.rst index c7b92c6ea24ca..28d0350f6f114 100644 --- a/Doc/extending/windows.rst +++ b/Doc/extending/windows.rst @@ -106,8 +106,7 @@ Using DLLs in Practice Windows Python is built in Microsoft Visual C++; using other compilers may or -may not work (though Borland seems to). The rest of this section is MSVC++ -specific. +may not work. The rest of this section is MSVC++ specific. When creating DLLs in Windows, you must pass :file:`pythonXY.lib` to the linker. To build two DLLs, spam and ni (which uses C functions found in spam), you could @@ -134,4 +133,3 @@ Developer Studio will throw in a lot of import libraries that you do not really need, adding about 100K to your executable. To get rid of them, use the Project Settings dialog, Link tab, to specify *ignore default libraries*. Add the correct :file:`msvcrtxx.lib` to the list of libraries. - diff --git a/Doc/faq/windows.rst b/Doc/faq/windows.rst index 0153a4f316ee8..4f50b3f1b93f1 100644 --- a/Doc/faq/windows.rst +++ b/Doc/faq/windows.rst @@ -26,8 +26,8 @@ with running programs from the Windows command line then everything will seem obvious; otherwise, you might need a little more guidance. Unless you use some sort of integrated development environment, you will end up -*typing* Windows commands into what is variously referred to as a "DOS window" -or "Command prompt window". Usually you can create such a window from your +*typing* Windows commands into what is referred to as a +"Command prompt window". Usually you can create such a window from your search bar by searching for ``cmd``. You should be able to recognize when you have started such a window because you will see a Windows "command prompt", which usually looks like this: @@ -186,9 +186,6 @@ Embedding the Python interpreter in a Windows app can be summarized as follows: by the Windows ``GetProcAddress()`` routine. Macros can make using these pointers transparent to any C code that calls routines in Python's C API. - Borland note: convert :file:`python{NN}.lib` to OMF format using Coff2Omf.exe - first. - .. XXX what about static linking? 2. If you use SWIG, it is easy to create a Python "extension module" that will @@ -279,4 +276,3 @@ How do I check for a keypress without blocking? Use the :mod:`msvcrt` module. This is a standard Windows-specific extension module. It defines a function ``kbhit()`` which checks whether a keyboard hit is present, and ``getch()`` which gets one character without echoing it. - diff --git a/Doc/library/ctypes.rst b/Doc/library/ctypes.rst index 7665f214916db..19ce19b1d70d1 100644 --- a/Doc/library/ctypes.rst +++ b/Doc/library/ctypes.rst @@ -1361,10 +1361,6 @@ way is to instantiate one of the following classes: functions in these libraries use the ``stdcall`` calling convention, and are assumed to return :c:type:`int` by default. - On Windows CE only the standard calling convention is used, for convenience the - :class:`WinDLL` and :class:`OleDLL` use the standard calling convention on this - platform. - The Python :term:`global interpreter lock` is released before calling any function exported by these libraries, and reacquired afterwards. @@ -1665,8 +1661,7 @@ See :ref:`ctypes-callback-functions` for examples. .. function:: WINFUNCTYPE(restype, *argtypes, use_errno=False, use_last_error=False) Windows only: The returned function prototype creates functions that use the - ``stdcall`` calling convention, except on Windows CE where - :func:`WINFUNCTYPE` is the same as :func:`CFUNCTYPE`. The function will + ``stdcall`` calling convention. The function will release the GIL during the call. *use_errno* and *use_last_error* have the same meaning as above. diff --git a/Doc/library/optparse.rst b/Doc/library/optparse.rst index b1094198f4c84..0d686b10365a6 100644 --- a/Doc/library/optparse.rst +++ b/Doc/library/optparse.rst @@ -131,7 +131,7 @@ option These option syntaxes are not supported by :mod:`optparse`, and they never will be. This is deliberate: the first three are non-standard on any environment, and the last only makes sense if you're exclusively targeting - VMS, MS-DOS, and/or Windows. + Windows or certain legacy platforms (e.g. VMS, MS-DOS). option argument an argument that follows an option, is closely associated with that option, diff --git a/Doc/library/os.path.rst b/Doc/library/os.path.rst index c201b1460ede3..ce7913e3712d7 100644 --- a/Doc/library/os.path.rst +++ b/Doc/library/os.path.rst @@ -5,7 +5,7 @@ :synopsis: Operations on pathnames. **Source code:** :source:`Lib/posixpath.py` (for POSIX) and -:source:`Lib/ntpath.py` (for Windows NT). +:source:`Lib/ntpath.py` (for Windows). .. index:: single: path; operations diff --git a/Doc/library/tempfile.rst b/Doc/library/tempfile.rst index 30491d48e10ef..f0f9f29746195 100644 --- a/Doc/library/tempfile.rst +++ b/Doc/library/tempfile.rst @@ -84,7 +84,7 @@ The module defines the following user-callable items: file-like object. Whether the name can be used to open the file a second time, while the named temporary file is still open, varies across platforms (it can be so used on Unix; it cannot - on Windows NT or later). If *delete* is true (the default), the file is + on Windows). If *delete* is true (the default), the file is deleted as soon as it is closed. The returned object is always a file-like object whose :attr:`!file` attribute is the underlying true file object. This file-like object can diff --git a/Doc/using/windows.rst b/Doc/using/windows.rst index 2c348aff12a62..87eb616d06249 100644 --- a/Doc/using/windows.rst +++ b/Doc/using/windows.rst @@ -374,7 +374,9 @@ may be changed from ``.``, and the package will be installed into a subdirectory. By default, the subdirectory is named the same as the package, and without the ``-ExcludeVersion`` option this name will include the specific version installed. Inside the subdirectory is a ``tools`` directory that -contains the Python installation:: +contains the Python installation: + +.. code-block:: doscon # Without -ExcludeVersion > .\python.3.5.2\tools\python.exe -V @@ -421,7 +423,7 @@ dependants, such as Idle), pip and the Python documentation are not included. .. note:: The embedded distribution does not include the `Microsoft C Runtime - `_ and it is + `_ and it is the responsibility of the application installer to provide this. The runtime may have already been installed on a user's system previously or automatically via Windows Update, and can be detected by finding @@ -555,27 +557,22 @@ System variables, you need non-restricted access to your machine Windows will concatenate User variables *after* System variables, which may cause unexpected results when modifying :envvar:`PATH`. - The :envvar:`PYTHONPATH` variable is used by all versions of Python 2 and - Python 3, so you should not permanently configure this variable unless it - only includes code that is compatible with all of your installed Python + The :envvar:`PYTHONPATH` variable is used by all versions of Python, + so you should not permanently configure it unless the listed paths + only include code that is compatible with all of your installed Python versions. .. seealso:: - https://www.microsoft.com/en-us/wdsi/help/folder-variables - Environment variables in Windows NT - - https://technet.microsoft.com/en-us/library/cc754250.aspx - The SET command, for temporarily modifying environment variables + https://docs.microsoft.com/en-us/windows/win32/procthread/environment-variables + Overview of environment variables on Windows - https://technet.microsoft.com/en-us/library/cc755104.aspx - The SETX command, for permanently modifying environment variables + https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/set_1 + The ``set`` command, for temporarily modifying environment variables - https://support.microsoft.com/en-us/help/310519/how-to-manage-environment-variables-in-windows-xp - How To Manage Environment Variables in Windows XP + https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/setx + The ``setx`` command, for permanently modifying environment variables - https://www.chem.gla.ac.uk/~louis/software/faq/q1.html - Setting Environment variables, Louis J. Farrugia .. _windows-path-mod: @@ -673,9 +670,7 @@ From the command-line System-wide installations of Python 3.3 and later will put the launcher on your :envvar:`PATH`. The launcher is compatible with all available versions of Python, so it does not matter which version is installed. To check that the -launcher is available, execute the following command in Command Prompt: - -:: +launcher is available, execute the following command in Command Prompt:: py @@ -683,26 +678,20 @@ You should find that the latest version of Python you have installed is started - it can be exited as normal, and any additional command-line arguments specified will be sent directly to Python. -If you have multiple versions of Python installed (e.g., 2.7 and |version|) you -will have noticed that Python |version| was started - to launch Python 2.7, try -the command: - -:: - - py -2.7 +If you have multiple versions of Python installed (e.g., 3.7 and |version|) you +will have noticed that Python |version| was started - to launch Python 3.7, try +the command:: -If you want the latest version of Python 2.x you have installed, try the -command: + py -3.7 -:: +If you want the latest version of Python 2 you have installed, try the +command:: py -2 -You should find the latest version of Python 2.x starts. +You should find the latest version of Python 3.x starts. -If you see the following error, you do not have the launcher installed: - -:: +If you see the following error, you do not have the launcher installed:: 'py' is not recognized as an internal or external command, operable program or batch file. @@ -710,11 +699,11 @@ If you see the following error, you do not have the launcher installed: Per-user installations of Python do not add the launcher to :envvar:`PATH` unless the option was selected on installation. -:: +The command:: py --list -You should see the currently installed versions of Python. +displays the currently installed version(s) of Python. Virtual environments ^^^^^^^^^^^^^^^^^^^^ @@ -740,9 +729,7 @@ following contents import sys sys.stdout.write("hello from Python %s\n" % (sys.version,)) -From the directory in which hello.py lives, execute the command: - -:: +From the directory in which hello.py lives, execute the command:: py hello.py @@ -755,9 +742,9 @@ is printed. Now try changing the first line to be: Re-executing the command should now print the latest Python 3.x information. As with the above command-line examples, you can specify a more explicit -version qualifier. Assuming you have Python 2.6 installed, try changing the -first line to ``#! python2.6`` and you should find the 2.6 version -information printed. +version qualifier. Assuming you have Python 3.7 installed, try changing +the first line to ``#! python3.7`` and you should find the |version| +version information printed. Note that unlike interactive use, a bare "python" will use the latest version of Python 2.x that you have installed. This is for backward @@ -810,8 +797,8 @@ shebang lines starting with ``/usr``. Any of the above virtual commands can be suffixed with an explicit version (either just the major version, or the major and minor version). Furthermore the 32-bit version can be requested by adding "-32" after the -minor version. I.e. ``/usr/bin/python2.7-32`` will request usage of the -32-bit python 2.7. +minor version. I.e. ``/usr/bin/python3.7-32`` will request usage of the +32-bit python 3.7. .. versionadded:: 3.7 @@ -897,19 +884,19 @@ Examples: ``python2`` will use the latest Python 2.x version installed and the command ``python3`` will use the latest Python 3.x installed. -* The commands ``python3.1`` and ``python2.7`` will not consult any +* The command ``python3.7`` will not consult any options at all as the versions are fully specified. * If ``PY_PYTHON=3``, the commands ``python`` and ``python3`` will both use the latest installed Python 3 version. -* If ``PY_PYTHON=3.1-32``, the command ``python`` will use the 32-bit - implementation of 3.1 whereas the command ``python3`` will use the latest +* If ``PY_PYTHON=3.7-32``, the command ``python`` will use the 32-bit + implementation of 3.7 whereas the command ``python3`` will use the latest installed Python (PY_PYTHON was not considered at all as a major version was specified.) -* If ``PY_PYTHON=3`` and ``PY_PYTHON3=3.1``, the commands - ``python`` and ``python3`` will both use specifically 3.1 +* If ``PY_PYTHON=3`` and ``PY_PYTHON3=3.7``, the commands + ``python`` and ``python3`` will both use specifically 3.7 In addition to environment variables, the same settings can be configured in the .INI file used by the launcher. The section in the INI file is @@ -920,21 +907,21 @@ an environment variable will override things specified in the INI file. For example: -* Setting ``PY_PYTHON=3.1`` is equivalent to the INI file containing: +* Setting ``PY_PYTHON=3.7`` is equivalent to the INI file containing: .. code-block:: ini [defaults] - python=3.1 + python=3.7 -* Setting ``PY_PYTHON=3`` and ``PY_PYTHON3=3.1`` is equivalent to the INI file +* Setting ``PY_PYTHON=3`` and ``PY_PYTHON3=3.7`` is equivalent to the INI file containing: .. code-block:: ini [defaults] python=3 - python3=3.1 + python3=3.7 Diagnostics ----------- @@ -1088,13 +1075,14 @@ is a collection of modules for advanced Windows-specific support. This includes utilities for: * `Component Object Model - `_ + `_ (COM) * Win32 API calls * Registry * Event log -* `Microsoft Foundation Classes `_ (MFC) - user interfaces +* `Microsoft Foundation Classes + `_ + (MFC) user interfaces `PythonWin `_ is a sample MFC application @@ -1105,7 +1093,7 @@ shipped with PyWin32. It is an embeddable IDE with a built-in debugger. `Win32 How Do I...? `_ by Tim Golden - `Python and COM `_ + `Python and COM `_ by David and Paul Boddie @@ -1119,18 +1107,6 @@ you can distribute your application without requiring your users to install Python. -WConio ------- - -Since Python's advanced terminal handling layer, :mod:`curses`, is restricted to -Unix-like systems, there is a library exclusive to Windows as well: Windows -Console I/O for Python. - -`WConio `_ is a wrapper for -Turbo-C's :file:`CONIO.H`, used to create text user interfaces. - - - Compiling Python on Windows =========================== @@ -1140,21 +1116,13 @@ latest release's source or just grab a fresh `checkout `_. The source tree contains a build solution and project files for Microsoft -Visual Studio 2015, which is the compiler used to build the official Python +Visual Studio, which is the compiler used to build the official Python releases. These files are in the :file:`PCbuild` directory. Check :file:`PCbuild/readme.txt` for general information on the build process. - For extension modules, consult :ref:`building-on-windows`. -.. seealso:: - - `Python + Windows + distutils + SWIG + gcc MinGW `_ - or "Creating Python extensions in C/C++ with SWIG and compiling them with - MinGW gcc under Windows" or "Installing Python extension with distutils - and without Microsoft Visual C++" by S?bastien Sauvage, 2003 - Other Platforms =============== @@ -1163,12 +1131,12 @@ With ongoing development of Python, some platforms that used to be supported earlier are no longer supported (due to the lack of users or developers). Check :pep:`11` for details on all unsupported platforms. -* `Windows CE `_ is still supported. -* The `Cygwin `_ installer offers to install the Python - interpreter as well (cf. `Cygwin package source - `_, `Maintainer releases - `_) +* `Windows CE `_ is + `no longer supported `__ + since Python 3 (if it ever was). +* The `Cygwin `_ installer offers to install the + `Python interpreter `__ + as well See `Python for Windows `_ for detailed information about platforms with pre-compiled installers. diff --git a/PC/readme.txt b/PC/readme.txt index 0a96d269b0977..4e6dcf98c937f 100644 --- a/PC/readme.txt +++ b/PC/readme.txt @@ -18,7 +18,7 @@ All PC ports use this scheme to try to set up a module search path: 1) The script location; the current directory without script. 2) The PYTHONPATH variable, if set. - 3) For Win32 platforms (NT/95), paths specified in the Registry. + 3) Paths specified in the Registry. 4) Default directories lib, lib/win, lib/test, lib/tkinter; these are searched relative to the environment variable PYTHONHOME, if set, or relative to the executable and its @@ -26,8 +26,8 @@ All PC ports use this scheme to try to set up a module search path: or the current directory (not useful). 5) The directory containing the executable. -The best installation strategy is to put the Python executable (and -DLL, for Win32 platforms) in some convenient directory such as +The best installation strategy is to put the Python executable and +DLL in some convenient directory such as C:/python, and copy all library files and subdirectories (using XCOPY) to C:/python/lib. Then you don't need to set PYTHONPATH. Otherwise, set the environment variable PYTHONPATH to your Python search path. diff --git a/PCbuild/readme.txt b/PCbuild/readme.txt index 1ea8bebc15edf..76f421a9aaee2 100644 --- a/PCbuild/readme.txt +++ b/PCbuild/readme.txt @@ -13,12 +13,10 @@ Quick Start Guide Building Python using Microsoft Visual C++ ------------------------------------------ -This directory is used to build CPython for Microsoft Windows NT version -6.0 or higher (Windows Vista, Windows Server 2008, or later) on 32 and 64 +This directory is used to build CPython for Microsoft Windows on 32- and 64- bit platforms. Using this directory requires an installation of -Microsoft Visual Studio 2017 (MSVC 14.1) with the *Python workload* and -its optional *Python native development* component selected. (For -command-line builds, Visual Studio 2015 may also be used.) +Microsoft Visual Studio (MSVC) with the *Python workload* and +its optional *Python native development* component selected. Building from the command line is recommended in order to obtain any external dependencies. To build, simply run the "build.bat" script without @@ -105,7 +103,7 @@ pythonw Prompt window pylauncher py.exe, the Python Launcher for Windows, see - http://docs.python.org/3/using/windows.html#launcher + https://docs.python.org/3/using/windows.html#launcher pywlauncher pyw.exe, a variant of py.exe that doesn't open a Command Prompt window @@ -167,14 +165,14 @@ _bz2 _lzma Python wrapper for version 5.2.2 of the liblzma compression library Homepage: - http://tukaani.org/xz/ + https://tukaani.org/xz/ _ssl Python wrapper for version 1.1.1k of the OpenSSL secure sockets library, which is downloaded from our binaries repository at https://github.com/python/cpython-bin-deps. Homepage: - http://www.openssl.org/ + https://www.openssl.org/ Building OpenSSL requires Perl on your path, and can be performed by running PCbuild\prepare_ssl.bat. This will retrieve the version of @@ -190,14 +188,14 @@ _ssl _sqlite3 Wraps SQLite 3.37.2, which is itself built by sqlite3.vcxproj Homepage: - http://www.sqlite.org/ + https://www.sqlite.org/ _tkinter Wraps version 8.6.6 of the Tk windowing system, which is downloaded from our binaries repository at https://github.com/python/cpython-bin-deps. Homepage: - http://www.tcl.tk/ + https://www.tcl.tk/ Building Tcl and Tk can be performed by running PCbuild\prepare_tcltk.bat. This will retrieve the version of the @@ -256,7 +254,7 @@ It creates the PGI files, runs the unit test suite or PyBench with the PGI python, and finally creates the optimized files. See - http://msdn.microsoft.com/en-us/library/e7k32f4k(VS.140).aspx + https://docs.microsoft.com/en-us/cpp/build/profile-guided-optimizations for more on this topic. From webhook-mailer at python.org Tue May 10 05:28:39 2022 From: webhook-mailer at python.org (miss-islington) Date: Tue, 10 May 2022 09:28:39 -0000 Subject: [Python-checkins] [3.9] gh-76773: Update docs mentioning no-longer-supported Windows versions & features (GH-92529) (GH-92610) Message-ID: https://github.com/python/cpython/commit/7534c50985e13938fc5989e81dec6b6f8260032c commit: 7534c50985e13938fc5989e81dec6b6f8260032c branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-10T02:28:24-07:00 summary: [3.9] gh-76773: Update docs mentioning no-longer-supported Windows versions & features (GH-92529) (GH-92610) (cherry picked from commit f1bbcba74f77eff2a4c0881f3d529f3bf0664d40) Co-authored-by: CAM Gerlach Automerge-Triggered-By: GH:serhiy-storchaka files: M Doc/extending/windows.rst M Doc/faq/windows.rst M Doc/library/ctypes.rst M Doc/library/optparse.rst M Doc/library/os.path.rst M Doc/library/tempfile.rst M Doc/using/windows.rst M PC/readme.txt M PCbuild/readme.txt diff --git a/Doc/extending/windows.rst b/Doc/extending/windows.rst index c7b92c6ea24ca..28d0350f6f114 100644 --- a/Doc/extending/windows.rst +++ b/Doc/extending/windows.rst @@ -106,8 +106,7 @@ Using DLLs in Practice Windows Python is built in Microsoft Visual C++; using other compilers may or -may not work (though Borland seems to). The rest of this section is MSVC++ -specific. +may not work. The rest of this section is MSVC++ specific. When creating DLLs in Windows, you must pass :file:`pythonXY.lib` to the linker. To build two DLLs, spam and ni (which uses C functions found in spam), you could @@ -134,4 +133,3 @@ Developer Studio will throw in a lot of import libraries that you do not really need, adding about 100K to your executable. To get rid of them, use the Project Settings dialog, Link tab, to specify *ignore default libraries*. Add the correct :file:`msvcrtxx.lib` to the list of libraries. - diff --git a/Doc/faq/windows.rst b/Doc/faq/windows.rst index 0153a4f316ee8..4f50b3f1b93f1 100644 --- a/Doc/faq/windows.rst +++ b/Doc/faq/windows.rst @@ -26,8 +26,8 @@ with running programs from the Windows command line then everything will seem obvious; otherwise, you might need a little more guidance. Unless you use some sort of integrated development environment, you will end up -*typing* Windows commands into what is variously referred to as a "DOS window" -or "Command prompt window". Usually you can create such a window from your +*typing* Windows commands into what is referred to as a +"Command prompt window". Usually you can create such a window from your search bar by searching for ``cmd``. You should be able to recognize when you have started such a window because you will see a Windows "command prompt", which usually looks like this: @@ -186,9 +186,6 @@ Embedding the Python interpreter in a Windows app can be summarized as follows: by the Windows ``GetProcAddress()`` routine. Macros can make using these pointers transparent to any C code that calls routines in Python's C API. - Borland note: convert :file:`python{NN}.lib` to OMF format using Coff2Omf.exe - first. - .. XXX what about static linking? 2. If you use SWIG, it is easy to create a Python "extension module" that will @@ -279,4 +276,3 @@ How do I check for a keypress without blocking? Use the :mod:`msvcrt` module. This is a standard Windows-specific extension module. It defines a function ``kbhit()`` which checks whether a keyboard hit is present, and ``getch()`` which gets one character without echoing it. - diff --git a/Doc/library/ctypes.rst b/Doc/library/ctypes.rst index 7665f214916db..19ce19b1d70d1 100644 --- a/Doc/library/ctypes.rst +++ b/Doc/library/ctypes.rst @@ -1361,10 +1361,6 @@ way is to instantiate one of the following classes: functions in these libraries use the ``stdcall`` calling convention, and are assumed to return :c:type:`int` by default. - On Windows CE only the standard calling convention is used, for convenience the - :class:`WinDLL` and :class:`OleDLL` use the standard calling convention on this - platform. - The Python :term:`global interpreter lock` is released before calling any function exported by these libraries, and reacquired afterwards. @@ -1665,8 +1661,7 @@ See :ref:`ctypes-callback-functions` for examples. .. function:: WINFUNCTYPE(restype, *argtypes, use_errno=False, use_last_error=False) Windows only: The returned function prototype creates functions that use the - ``stdcall`` calling convention, except on Windows CE where - :func:`WINFUNCTYPE` is the same as :func:`CFUNCTYPE`. The function will + ``stdcall`` calling convention. The function will release the GIL during the call. *use_errno* and *use_last_error* have the same meaning as above. diff --git a/Doc/library/optparse.rst b/Doc/library/optparse.rst index b1094198f4c84..0d686b10365a6 100644 --- a/Doc/library/optparse.rst +++ b/Doc/library/optparse.rst @@ -131,7 +131,7 @@ option These option syntaxes are not supported by :mod:`optparse`, and they never will be. This is deliberate: the first three are non-standard on any environment, and the last only makes sense if you're exclusively targeting - VMS, MS-DOS, and/or Windows. + Windows or certain legacy platforms (e.g. VMS, MS-DOS). option argument an argument that follows an option, is closely associated with that option, diff --git a/Doc/library/os.path.rst b/Doc/library/os.path.rst index 0f91971cd8d07..97bb684a2456c 100644 --- a/Doc/library/os.path.rst +++ b/Doc/library/os.path.rst @@ -5,7 +5,7 @@ :synopsis: Operations on pathnames. **Source code:** :source:`Lib/posixpath.py` (for POSIX) and -:source:`Lib/ntpath.py` (for Windows NT). +:source:`Lib/ntpath.py` (for Windows). .. index:: single: path; operations diff --git a/Doc/library/tempfile.rst b/Doc/library/tempfile.rst index 6bd7d003f5290..fe47a4f061648 100644 --- a/Doc/library/tempfile.rst +++ b/Doc/library/tempfile.rst @@ -84,7 +84,7 @@ The module defines the following user-callable items: file-like object. Whether the name can be used to open the file a second time, while the named temporary file is still open, varies across platforms (it can be so used on Unix; it cannot - on Windows NT or later). If *delete* is true (the default), the file is + on Windows). If *delete* is true (the default), the file is deleted as soon as it is closed. The returned object is always a file-like object whose :attr:`!file` attribute is the underlying true file object. This file-like object can diff --git a/Doc/using/windows.rst b/Doc/using/windows.rst index f5f33b917a481..abb74637fd946 100644 --- a/Doc/using/windows.rst +++ b/Doc/using/windows.rst @@ -374,7 +374,9 @@ may be changed from ``.``, and the package will be installed into a subdirectory. By default, the subdirectory is named the same as the package, and without the ``-ExcludeVersion`` option this name will include the specific version installed. Inside the subdirectory is a ``tools`` directory that -contains the Python installation:: +contains the Python installation: + +.. code-block:: doscon # Without -ExcludeVersion > .\python.3.5.2\tools\python.exe -V @@ -421,7 +423,7 @@ dependants, such as Idle), pip and the Python documentation are not included. .. note:: The embedded distribution does not include the `Microsoft C Runtime - `_ and it is + `_ and it is the responsibility of the application installer to provide this. The runtime may have already been installed on a user's system previously or automatically via Windows Update, and can be detected by finding @@ -555,27 +557,22 @@ System variables, you need non-restricted access to your machine Windows will concatenate User variables *after* System variables, which may cause unexpected results when modifying :envvar:`PATH`. - The :envvar:`PYTHONPATH` variable is used by all versions of Python 2 and - Python 3, so you should not permanently configure this variable unless it - only includes code that is compatible with all of your installed Python + The :envvar:`PYTHONPATH` variable is used by all versions of Python, + so you should not permanently configure it unless the listed paths + only include code that is compatible with all of your installed Python versions. .. seealso:: - https://www.microsoft.com/en-us/wdsi/help/folder-variables - Environment variables in Windows NT - - https://technet.microsoft.com/en-us/library/cc754250.aspx - The SET command, for temporarily modifying environment variables + https://docs.microsoft.com/en-us/windows/win32/procthread/environment-variables + Overview of environment variables on Windows - https://technet.microsoft.com/en-us/library/cc755104.aspx - The SETX command, for permanently modifying environment variables + https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/set_1 + The ``set`` command, for temporarily modifying environment variables - https://support.microsoft.com/en-us/help/310519/how-to-manage-environment-variables-in-windows-xp - How To Manage Environment Variables in Windows XP + https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/setx + The ``setx`` command, for permanently modifying environment variables - https://www.chem.gla.ac.uk/~louis/software/faq/q1.html - Setting Environment variables, Louis J. Farrugia .. _windows-path-mod: @@ -679,9 +676,7 @@ From the command-line System-wide installations of Python 3.3 and later will put the launcher on your :envvar:`PATH`. The launcher is compatible with all available versions of Python, so it does not matter which version is installed. To check that the -launcher is available, execute the following command in Command Prompt: - -:: +launcher is available, execute the following command in Command Prompt:: py @@ -689,26 +684,20 @@ You should find that the latest version of Python you have installed is started - it can be exited as normal, and any additional command-line arguments specified will be sent directly to Python. -If you have multiple versions of Python installed (e.g., 2.7 and |version|) you -will have noticed that Python |version| was started - to launch Python 2.7, try -the command: - -:: - - py -2.7 +If you have multiple versions of Python installed (e.g., 3.7 and |version|) you +will have noticed that Python |version| was started - to launch Python 3.7, try +the command:: -If you want the latest version of Python 2.x you have installed, try the -command: + py -3.7 -:: +If you want the latest version of Python 2 you have installed, try the +command:: py -2 -You should find the latest version of Python 2.x starts. +You should find the latest version of Python 3.x starts. -If you see the following error, you do not have the launcher installed: - -:: +If you see the following error, you do not have the launcher installed:: 'py' is not recognized as an internal or external command, operable program or batch file. @@ -716,11 +705,11 @@ If you see the following error, you do not have the launcher installed: Per-user installations of Python do not add the launcher to :envvar:`PATH` unless the option was selected on installation. -:: +The command:: py --list -You should see the currently installed versions of Python. +displays the currently installed version(s) of Python. Virtual environments ^^^^^^^^^^^^^^^^^^^^ @@ -746,9 +735,7 @@ following contents import sys sys.stdout.write("hello from Python %s\n" % (sys.version,)) -From the directory in which hello.py lives, execute the command: - -:: +From the directory in which hello.py lives, execute the command:: py hello.py @@ -761,9 +748,9 @@ is printed. Now try changing the first line to be: Re-executing the command should now print the latest Python 3.x information. As with the above command-line examples, you can specify a more explicit -version qualifier. Assuming you have Python 2.6 installed, try changing the -first line to ``#! python2.6`` and you should find the 2.6 version -information printed. +version qualifier. Assuming you have Python 3.7 installed, try changing +the first line to ``#! python3.7`` and you should find the |version| +version information printed. Note that unlike interactive use, a bare "python" will use the latest version of Python 2.x that you have installed. This is for backward @@ -816,8 +803,8 @@ shebang lines starting with ``/usr``. Any of the above virtual commands can be suffixed with an explicit version (either just the major version, or the major and minor version). Furthermore the 32-bit version can be requested by adding "-32" after the -minor version. I.e. ``/usr/bin/python2.7-32`` will request usage of the -32-bit python 2.7. +minor version. I.e. ``/usr/bin/python3.7-32`` will request usage of the +32-bit python 3.7. .. versionadded:: 3.7 @@ -903,19 +890,19 @@ Examples: ``python2`` will use the latest Python 2.x version installed and the command ``python3`` will use the latest Python 3.x installed. -* The commands ``python3.1`` and ``python2.7`` will not consult any +* The command ``python3.7`` will not consult any options at all as the versions are fully specified. * If ``PY_PYTHON=3``, the commands ``python`` and ``python3`` will both use the latest installed Python 3 version. -* If ``PY_PYTHON=3.1-32``, the command ``python`` will use the 32-bit - implementation of 3.1 whereas the command ``python3`` will use the latest +* If ``PY_PYTHON=3.7-32``, the command ``python`` will use the 32-bit + implementation of 3.7 whereas the command ``python3`` will use the latest installed Python (PY_PYTHON was not considered at all as a major version was specified.) -* If ``PY_PYTHON=3`` and ``PY_PYTHON3=3.1``, the commands - ``python`` and ``python3`` will both use specifically 3.1 +* If ``PY_PYTHON=3`` and ``PY_PYTHON3=3.7``, the commands + ``python`` and ``python3`` will both use specifically 3.7 In addition to environment variables, the same settings can be configured in the .INI file used by the launcher. The section in the INI file is @@ -926,21 +913,21 @@ an environment variable will override things specified in the INI file. For example: -* Setting ``PY_PYTHON=3.1`` is equivalent to the INI file containing: +* Setting ``PY_PYTHON=3.7`` is equivalent to the INI file containing: .. code-block:: ini [defaults] - python=3.1 + python=3.7 -* Setting ``PY_PYTHON=3`` and ``PY_PYTHON3=3.1`` is equivalent to the INI file +* Setting ``PY_PYTHON=3`` and ``PY_PYTHON3=3.7`` is equivalent to the INI file containing: .. code-block:: ini [defaults] python=3 - python3=3.1 + python3=3.7 Diagnostics ----------- @@ -1094,13 +1081,14 @@ is a collection of modules for advanced Windows-specific support. This includes utilities for: * `Component Object Model - `_ + `_ (COM) * Win32 API calls * Registry * Event log -* `Microsoft Foundation Classes `_ (MFC) - user interfaces +* `Microsoft Foundation Classes + `_ + (MFC) user interfaces `PythonWin `_ is a sample MFC application @@ -1111,7 +1099,7 @@ shipped with PyWin32. It is an embeddable IDE with a built-in debugger. `Win32 How Do I...? `_ by Tim Golden - `Python and COM `_ + `Python and COM `_ by David and Paul Boddie @@ -1125,18 +1113,6 @@ you can distribute your application without requiring your users to install Python. -WConio ------- - -Since Python's advanced terminal handling layer, :mod:`curses`, is restricted to -Unix-like systems, there is a library exclusive to Windows as well: Windows -Console I/O for Python. - -`WConio `_ is a wrapper for -Turbo-C's :file:`CONIO.H`, used to create text user interfaces. - - - Compiling Python on Windows =========================== @@ -1146,21 +1122,13 @@ latest release's source or just grab a fresh `checkout `_. The source tree contains a build solution and project files for Microsoft -Visual Studio 2015, which is the compiler used to build the official Python +Visual Studio, which is the compiler used to build the official Python releases. These files are in the :file:`PCbuild` directory. Check :file:`PCbuild/readme.txt` for general information on the build process. - For extension modules, consult :ref:`building-on-windows`. -.. seealso:: - - `Python + Windows + distutils + SWIG + gcc MinGW `_ - or "Creating Python extensions in C/C++ with SWIG and compiling them with - MinGW gcc under Windows" or "Installing Python extension with distutils - and without Microsoft Visual C++" by S?bastien Sauvage, 2003 - Other Platforms =============== @@ -1169,12 +1137,12 @@ With ongoing development of Python, some platforms that used to be supported earlier are no longer supported (due to the lack of users or developers). Check :pep:`11` for details on all unsupported platforms. -* `Windows CE `_ is still supported. -* The `Cygwin `_ installer offers to install the Python - interpreter as well (cf. `Cygwin package source - `_, `Maintainer releases - `_) +* `Windows CE `_ is + `no longer supported `__ + since Python 3 (if it ever was). +* The `Cygwin `_ installer offers to install the + `Python interpreter `__ + as well See `Python for Windows `_ for detailed information about platforms with pre-compiled installers. diff --git a/PC/readme.txt b/PC/readme.txt index 0a96d269b0977..4e6dcf98c937f 100644 --- a/PC/readme.txt +++ b/PC/readme.txt @@ -18,7 +18,7 @@ All PC ports use this scheme to try to set up a module search path: 1) The script location; the current directory without script. 2) The PYTHONPATH variable, if set. - 3) For Win32 platforms (NT/95), paths specified in the Registry. + 3) Paths specified in the Registry. 4) Default directories lib, lib/win, lib/test, lib/tkinter; these are searched relative to the environment variable PYTHONHOME, if set, or relative to the executable and its @@ -26,8 +26,8 @@ All PC ports use this scheme to try to set up a module search path: or the current directory (not useful). 5) The directory containing the executable. -The best installation strategy is to put the Python executable (and -DLL, for Win32 platforms) in some convenient directory such as +The best installation strategy is to put the Python executable and +DLL in some convenient directory such as C:/python, and copy all library files and subdirectories (using XCOPY) to C:/python/lib. Then you don't need to set PYTHONPATH. Otherwise, set the environment variable PYTHONPATH to your Python search path. diff --git a/PCbuild/readme.txt b/PCbuild/readme.txt index e8a973c167895..80b597cce3a71 100644 --- a/PCbuild/readme.txt +++ b/PCbuild/readme.txt @@ -13,12 +13,10 @@ Quick Start Guide Building Python using Microsoft Visual C++ ------------------------------------------ -This directory is used to build CPython for Microsoft Windows NT version -6.0 or higher (Windows Vista, Windows Server 2008, or later) on 32 and 64 +This directory is used to build CPython for Microsoft Windows on 32- and 64- bit platforms. Using this directory requires an installation of -Microsoft Visual Studio 2017 (MSVC 14.1) with the *Python workload* and -its optional *Python native development* component selected. (For -command-line builds, Visual Studio 2015 may also be used.) +Microsoft Visual Studio (MSVC) with the *Python workload* and +its optional *Python native development* component selected. Building from the command line is recommended in order to obtain any external dependencies. To build, simply run the "build.bat" script without @@ -105,7 +103,7 @@ pythonw Prompt window pylauncher py.exe, the Python Launcher for Windows, see - http://docs.python.org/3/using/windows.html#launcher + https://docs.python.org/3/using/windows.html#launcher pywlauncher pyw.exe, a variant of py.exe that doesn't open a Command Prompt window @@ -164,14 +162,14 @@ _bz2 _lzma Python wrapper for version 5.2.2 of the liblzma compression library Homepage: - http://tukaani.org/xz/ + https://tukaani.org/xz/ _ssl Python wrapper for version 1.1.1k of the OpenSSL secure sockets library, which is downloaded from our binaries repository at https://github.com/python/cpython-bin-deps. Homepage: - http://www.openssl.org/ + https://www.openssl.org/ Building OpenSSL requires Perl on your path, and can be performed by running PCbuild\prepare_ssl.bat. This will retrieve the version of @@ -187,14 +185,14 @@ _ssl _sqlite3 Wraps SQLite 3.37.2, which is itself built by sqlite3.vcxproj Homepage: - http://www.sqlite.org/ + https://www.sqlite.org/ _tkinter Wraps version 8.6.6 of the Tk windowing system, which is downloaded from our binaries repository at https://github.com/python/cpython-bin-deps. Homepage: - http://www.tcl.tk/ + https://www.tcl.tk/ Building Tcl and Tk can be performed by running PCbuild\prepare_tcltk.bat. This will retrieve the version of the @@ -253,7 +251,7 @@ It creates the PGI files, runs the unit test suite or PyBench with the PGI python, and finally creates the optimized files. See - http://msdn.microsoft.com/en-us/library/e7k32f4k(VS.140).aspx + https://docs.microsoft.com/en-us/cpp/build/profile-guided-optimizations for more on this topic. From webhook-mailer at python.org Tue May 10 05:30:05 2022 From: webhook-mailer at python.org (serhiy-storchaka) Date: Tue, 10 May 2022 09:30:05 -0000 Subject: [Python-checkins] gh-92417: `zlib` docs, `binascii` docs: remove Python 2 compatibility notes (GH-92543) (GH-92607) Message-ID: https://github.com/python/cpython/commit/e4fc347356352eee33c279c2fb3ec91b042ec57c commit: e4fc347356352eee33c279c2fb3ec91b042ec57c branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: serhiy-storchaka date: 2022-05-10T12:29:59+03:00 summary: gh-92417: `zlib` docs, `binascii` docs: remove Python 2 compatibility notes (GH-92543) (GH-92607) (cherry picked from commit 7c638e64050778f2e0052ec9f84cd202b8aedfce) Co-authored-by: Alex Waygood files: M Doc/library/binascii.rst M Doc/library/zlib.rst diff --git a/Doc/library/binascii.rst b/Doc/library/binascii.rst index 19efc2df9483d..4417a5ac38251 100644 --- a/Doc/library/binascii.rst +++ b/Doc/library/binascii.rst @@ -121,8 +121,6 @@ The :mod:`binascii` module defines the following functions: .. versionchanged:: 3.0 The result is always unsigned. - To generate the same numeric value when using Python 2 or earlier, - use ``crc32(data) & 0xffffffff``. .. function:: b2a_hex(data[, sep[, bytes_per_sep=1]]) hexlify(data[, sep[, bytes_per_sep=1]]) diff --git a/Doc/library/zlib.rst b/Doc/library/zlib.rst index f0c67d5ae2584..30eb99817a859 100644 --- a/Doc/library/zlib.rst +++ b/Doc/library/zlib.rst @@ -43,8 +43,6 @@ The available exception and functions in this module are: .. versionchanged:: 3.0 The result is always unsigned. - To generate the same numeric value when using Python 2 or earlier, - use ``adler32(data) & 0xffffffff``. .. function:: compress(data, /, level=-1, wbits=MAX_WBITS) @@ -137,8 +135,6 @@ The available exception and functions in this module are: .. versionchanged:: 3.0 The result is always unsigned. - To generate the same numeric value when using Python 2 or earlier, - use ``crc32(data) & 0xffffffff``. .. function:: decompress(data, /, wbits=MAX_WBITS, bufsize=DEF_BUF_SIZE) From webhook-mailer at python.org Tue May 10 05:45:22 2022 From: webhook-mailer at python.org (miss-islington) Date: Tue, 10 May 2022 09:45:22 -0000 Subject: [Python-checkins] Add `__slots__` to `typing._NotIterable` (GH-92570) Message-ID: https://github.com/python/cpython/commit/8a2b3edcdc4e071a1c79464dcc6c40c3aee26140 commit: 8a2b3edcdc4e071a1c79464dcc6c40c3aee26140 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-10T02:45:17-07:00 summary: Add `__slots__` to `typing._NotIterable` (GH-92570) (cherry picked from commit eef47d5bc79469c2d5328d6f5a9732e44a49dd5a) Co-authored-by: Alex Waygood files: M Lib/typing.py diff --git a/Lib/typing.py b/Lib/typing.py index 46ef2d9cf6005..d75203e7e06c3 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -417,6 +417,7 @@ def __iter__(self): raise TypeError() is treated specially. """ + __slots__ = () __iter__ = None From webhook-mailer at python.org Tue May 10 05:55:42 2022 From: webhook-mailer at python.org (miss-islington) Date: Tue, 10 May 2022 09:55:42 -0000 Subject: [Python-checkins] [3.11] gh-76773: Update docs mentioning no-longer-supported Windows versions & features (GH-92529) (GH-92608) Message-ID: https://github.com/python/cpython/commit/635b62a37693c9b4971c36469f5bda64d15149cf commit: 635b62a37693c9b4971c36469f5bda64d15149cf branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-10T02:55:36-07:00 summary: [3.11] gh-76773: Update docs mentioning no-longer-supported Windows versions & features (GH-92529) (GH-92608) (cherry picked from commit f1bbcba74f77eff2a4c0881f3d529f3bf0664d40) Co-authored-by: CAM Gerlach Automerge-Triggered-By: GH:serhiy-storchaka files: M Doc/extending/windows.rst M Doc/faq/windows.rst M Doc/library/ctypes.rst M Doc/library/optparse.rst M Doc/library/os.path.rst M Doc/library/tempfile.rst M Doc/using/windows.rst M PC/readme.txt M PCbuild/readme.txt diff --git a/Doc/extending/windows.rst b/Doc/extending/windows.rst index c7b92c6ea24ca..28d0350f6f114 100644 --- a/Doc/extending/windows.rst +++ b/Doc/extending/windows.rst @@ -106,8 +106,7 @@ Using DLLs in Practice Windows Python is built in Microsoft Visual C++; using other compilers may or -may not work (though Borland seems to). The rest of this section is MSVC++ -specific. +may not work. The rest of this section is MSVC++ specific. When creating DLLs in Windows, you must pass :file:`pythonXY.lib` to the linker. To build two DLLs, spam and ni (which uses C functions found in spam), you could @@ -134,4 +133,3 @@ Developer Studio will throw in a lot of import libraries that you do not really need, adding about 100K to your executable. To get rid of them, use the Project Settings dialog, Link tab, to specify *ignore default libraries*. Add the correct :file:`msvcrtxx.lib` to the list of libraries. - diff --git a/Doc/faq/windows.rst b/Doc/faq/windows.rst index 6b95819c8ee85..df7ab71f4b662 100644 --- a/Doc/faq/windows.rst +++ b/Doc/faq/windows.rst @@ -26,8 +26,8 @@ with running programs from the Windows command line then everything will seem obvious; otherwise, you might need a little more guidance. Unless you use some sort of integrated development environment, you will end up -*typing* Windows commands into what is variously referred to as a "DOS window" -or "Command prompt window". Usually you can create such a window from your +*typing* Windows commands into what is referred to as a +"Command prompt window". Usually you can create such a window from your search bar by searching for ``cmd``. You should be able to recognize when you have started such a window because you will see a Windows "command prompt", which usually looks like this: @@ -186,9 +186,6 @@ Embedding the Python interpreter in a Windows app can be summarized as follows: by the Windows ``GetProcAddress()`` routine. Macros can make using these pointers transparent to any C code that calls routines in Python's C API. - Borland note: convert :file:`python{NN}.lib` to OMF format using Coff2Omf.exe - first. - .. XXX what about static linking? 2. If you use SWIG, it is easy to create a Python "extension module" that will @@ -279,4 +276,3 @@ How do I check for a keypress without blocking? Use the :mod:`msvcrt` module. This is a standard Windows-specific extension module. It defines a function ``kbhit()`` which checks whether a keyboard hit is present, and ``getch()`` which gets one character without echoing it. - diff --git a/Doc/library/ctypes.rst b/Doc/library/ctypes.rst index 6cca569a3f1c8..52950b551b756 100644 --- a/Doc/library/ctypes.rst +++ b/Doc/library/ctypes.rst @@ -1360,10 +1360,6 @@ way is to instantiate one of the following classes: functions in these libraries use the ``stdcall`` calling convention, and are assumed to return :c:type:`int` by default. - On Windows CE only the standard calling convention is used, for convenience the - :class:`WinDLL` and :class:`OleDLL` use the standard calling convention on this - platform. - The Python :term:`global interpreter lock` is released before calling any function exported by these libraries, and reacquired afterwards. @@ -1664,8 +1660,7 @@ See :ref:`ctypes-callback-functions` for examples. .. function:: WINFUNCTYPE(restype, *argtypes, use_errno=False, use_last_error=False) Windows only: The returned function prototype creates functions that use the - ``stdcall`` calling convention, except on Windows CE where - :func:`WINFUNCTYPE` is the same as :func:`CFUNCTYPE`. The function will + ``stdcall`` calling convention. The function will release the GIL during the call. *use_errno* and *use_last_error* have the same meaning as above. diff --git a/Doc/library/optparse.rst b/Doc/library/optparse.rst index b1094198f4c84..0d686b10365a6 100644 --- a/Doc/library/optparse.rst +++ b/Doc/library/optparse.rst @@ -131,7 +131,7 @@ option These option syntaxes are not supported by :mod:`optparse`, and they never will be. This is deliberate: the first three are non-standard on any environment, and the last only makes sense if you're exclusively targeting - VMS, MS-DOS, and/or Windows. + Windows or certain legacy platforms (e.g. VMS, MS-DOS). option argument an argument that follows an option, is closely associated with that option, diff --git a/Doc/library/os.path.rst b/Doc/library/os.path.rst index c201b1460ede3..ce7913e3712d7 100644 --- a/Doc/library/os.path.rst +++ b/Doc/library/os.path.rst @@ -5,7 +5,7 @@ :synopsis: Operations on pathnames. **Source code:** :source:`Lib/posixpath.py` (for POSIX) and -:source:`Lib/ntpath.py` (for Windows NT). +:source:`Lib/ntpath.py` (for Windows). .. index:: single: path; operations diff --git a/Doc/library/tempfile.rst b/Doc/library/tempfile.rst index 8fe38b5e81c08..b7e604c1b70ac 100644 --- a/Doc/library/tempfile.rst +++ b/Doc/library/tempfile.rst @@ -84,7 +84,7 @@ The module defines the following user-callable items: file-like object. Whether the name can be used to open the file a second time, while the named temporary file is still open, varies across platforms (it can be so used on Unix; it cannot - on Windows NT or later). If *delete* is true (the default), the file is + on Windows). If *delete* is true (the default), the file is deleted as soon as it is closed. The returned object is always a file-like object whose :attr:`!file` attribute is the underlying true file object. This file-like object can diff --git a/Doc/using/windows.rst b/Doc/using/windows.rst index 88dcb002e2c24..9c2632f030bdc 100644 --- a/Doc/using/windows.rst +++ b/Doc/using/windows.rst @@ -378,7 +378,9 @@ may be changed from ``.``, and the package will be installed into a subdirectory. By default, the subdirectory is named the same as the package, and without the ``-ExcludeVersion`` option this name will include the specific version installed. Inside the subdirectory is a ``tools`` directory that -contains the Python installation:: +contains the Python installation: + +.. code-block:: doscon # Without -ExcludeVersion > .\python.3.5.2\tools\python.exe -V @@ -425,7 +427,7 @@ dependants, such as Idle), pip and the Python documentation are not included. .. note:: The embedded distribution does not include the `Microsoft C Runtime - `_ and it is + `_ and it is the responsibility of the application installer to provide this. The runtime may have already been installed on a user's system previously or automatically via Windows Update, and can be detected by finding @@ -559,27 +561,22 @@ System variables, you need non-restricted access to your machine Windows will concatenate User variables *after* System variables, which may cause unexpected results when modifying :envvar:`PATH`. - The :envvar:`PYTHONPATH` variable is used by all versions of Python 2 and - Python 3, so you should not permanently configure this variable unless it - only includes code that is compatible with all of your installed Python + The :envvar:`PYTHONPATH` variable is used by all versions of Python, + so you should not permanently configure it unless the listed paths + only include code that is compatible with all of your installed Python versions. .. seealso:: - https://www.microsoft.com/en-us/wdsi/help/folder-variables - Environment variables in Windows NT - - https://technet.microsoft.com/en-us/library/cc754250.aspx - The SET command, for temporarily modifying environment variables + https://docs.microsoft.com/en-us/windows/win32/procthread/environment-variables + Overview of environment variables on Windows - https://technet.microsoft.com/en-us/library/cc755104.aspx - The SETX command, for permanently modifying environment variables + https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/set_1 + The ``set`` command, for temporarily modifying environment variables - https://support.microsoft.com/en-us/help/310519/how-to-manage-environment-variables-in-windows-xp - How To Manage Environment Variables in Windows XP + https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/setx + The ``setx`` command, for permanently modifying environment variables - https://www.chem.gla.ac.uk/~louis/software/faq/q1.html - Setting Environment variables, Louis J. Farrugia .. _windows-path-mod: @@ -677,9 +674,7 @@ From the command-line System-wide installations of Python 3.3 and later will put the launcher on your :envvar:`PATH`. The launcher is compatible with all available versions of Python, so it does not matter which version is installed. To check that the -launcher is available, execute the following command in Command Prompt: - -:: +launcher is available, execute the following command in Command Prompt:: py @@ -687,26 +682,20 @@ You should find that the latest version of Python you have installed is started - it can be exited as normal, and any additional command-line arguments specified will be sent directly to Python. -If you have multiple versions of Python installed (e.g., 2.7 and |version|) you -will have noticed that Python |version| was started - to launch Python 2.7, try -the command: - -:: - - py -2.7 +If you have multiple versions of Python installed (e.g., 3.7 and |version|) you +will have noticed that Python |version| was started - to launch Python 3.7, try +the command:: -If you want the latest version of Python 2.x you have installed, try the -command: + py -3.7 -:: +If you want the latest version of Python 2 you have installed, try the +command:: py -2 -You should find the latest version of Python 2.x starts. +You should find the latest version of Python 3.x starts. -If you see the following error, you do not have the launcher installed: - -:: +If you see the following error, you do not have the launcher installed:: 'py' is not recognized as an internal or external command, operable program or batch file. @@ -714,11 +703,11 @@ If you see the following error, you do not have the launcher installed: Per-user installations of Python do not add the launcher to :envvar:`PATH` unless the option was selected on installation. -:: +The command:: py --list -You should see the currently installed versions of Python. +displays the currently installed version(s) of Python. Virtual environments ^^^^^^^^^^^^^^^^^^^^ @@ -744,9 +733,7 @@ following contents import sys sys.stdout.write("hello from Python %s\n" % (sys.version,)) -From the directory in which hello.py lives, execute the command: - -:: +From the directory in which hello.py lives, execute the command:: py hello.py @@ -759,9 +746,9 @@ is printed. Now try changing the first line to be: Re-executing the command should now print the latest Python 3.x information. As with the above command-line examples, you can specify a more explicit -version qualifier. Assuming you have Python 2.6 installed, try changing the -first line to ``#! python2.6`` and you should find the 2.6 version -information printed. +version qualifier. Assuming you have Python 3.7 installed, try changing +the first line to ``#! python3.7`` and you should find the |version| +version information printed. Note that unlike interactive use, a bare "python" will use the latest version of Python 2.x that you have installed. This is for backward @@ -814,8 +801,8 @@ shebang lines starting with ``/usr``. Any of the above virtual commands can be suffixed with an explicit version (either just the major version, or the major and minor version). Furthermore the 32-bit version can be requested by adding "-32" after the -minor version. I.e. ``/usr/bin/python2.7-32`` will request usage of the -32-bit python 2.7. +minor version. I.e. ``/usr/bin/python3.7-32`` will request usage of the +32-bit python 3.7. .. versionadded:: 3.7 @@ -908,19 +895,19 @@ Examples: ``python2`` will use the latest Python 2.x version installed and the command ``python3`` will use the latest Python 3.x installed. -* The commands ``python3.1`` and ``python2.7`` will not consult any +* The command ``python3.7`` will not consult any options at all as the versions are fully specified. * If ``PY_PYTHON=3``, the commands ``python`` and ``python3`` will both use the latest installed Python 3 version. -* If ``PY_PYTHON=3.1-32``, the command ``python`` will use the 32-bit - implementation of 3.1 whereas the command ``python3`` will use the latest +* If ``PY_PYTHON=3.7-32``, the command ``python`` will use the 32-bit + implementation of 3.7 whereas the command ``python3`` will use the latest installed Python (PY_PYTHON was not considered at all as a major version was specified.) -* If ``PY_PYTHON=3`` and ``PY_PYTHON3=3.1``, the commands - ``python`` and ``python3`` will both use specifically 3.1 +* If ``PY_PYTHON=3`` and ``PY_PYTHON3=3.7``, the commands + ``python`` and ``python3`` will both use specifically 3.7 In addition to environment variables, the same settings can be configured in the .INI file used by the launcher. The section in the INI file is @@ -931,21 +918,21 @@ an environment variable will override things specified in the INI file. For example: -* Setting ``PY_PYTHON=3.1`` is equivalent to the INI file containing: +* Setting ``PY_PYTHON=3.7`` is equivalent to the INI file containing: .. code-block:: ini [defaults] - python=3.1 + python=3.7 -* Setting ``PY_PYTHON=3`` and ``PY_PYTHON3=3.1`` is equivalent to the INI file +* Setting ``PY_PYTHON=3`` and ``PY_PYTHON3=3.7`` is equivalent to the INI file containing: .. code-block:: ini [defaults] python=3 - python3=3.1 + python3=3.7 Diagnostics ----------- @@ -1132,13 +1119,14 @@ is a collection of modules for advanced Windows-specific support. This includes utilities for: * `Component Object Model - `_ + `_ (COM) * Win32 API calls * Registry * Event log -* `Microsoft Foundation Classes `_ (MFC) - user interfaces +* `Microsoft Foundation Classes + `_ + (MFC) user interfaces `PythonWin `_ is a sample MFC application @@ -1149,7 +1137,7 @@ shipped with PyWin32. It is an embeddable IDE with a built-in debugger. `Win32 How Do I...? `_ by Tim Golden - `Python and COM `_ + `Python and COM `_ by David and Paul Boddie @@ -1163,18 +1151,6 @@ you can distribute your application without requiring your users to install Python. -WConio ------- - -Since Python's advanced terminal handling layer, :mod:`curses`, is restricted to -Unix-like systems, there is a library exclusive to Windows as well: Windows -Console I/O for Python. - -`WConio `_ is a wrapper for -Turbo-C's :file:`CONIO.H`, used to create text user interfaces. - - - Compiling Python on Windows =========================== @@ -1184,21 +1160,13 @@ latest release's source or just grab a fresh `checkout `_. The source tree contains a build solution and project files for Microsoft -Visual Studio 2015, which is the compiler used to build the official Python +Visual Studio, which is the compiler used to build the official Python releases. These files are in the :file:`PCbuild` directory. Check :file:`PCbuild/readme.txt` for general information on the build process. - For extension modules, consult :ref:`building-on-windows`. -.. seealso:: - - `Python + Windows + distutils + SWIG + gcc MinGW `_ - or "Creating Python extensions in C/C++ with SWIG and compiling them with - MinGW gcc under Windows" or "Installing Python extension with distutils - and without Microsoft Visual C++" by S?bastien Sauvage, 2003 - Other Platforms =============== @@ -1207,12 +1175,12 @@ With ongoing development of Python, some platforms that used to be supported earlier are no longer supported (due to the lack of users or developers). Check :pep:`11` for details on all unsupported platforms. -* `Windows CE `_ is still supported. -* The `Cygwin `_ installer offers to install the Python - interpreter as well (cf. `Cygwin package source - `_, `Maintainer releases - `_) +* `Windows CE `_ is + `no longer supported `__ + since Python 3 (if it ever was). +* The `Cygwin `_ installer offers to install the + `Python interpreter `__ + as well See `Python for Windows `_ for detailed information about platforms with pre-compiled installers. diff --git a/PC/readme.txt b/PC/readme.txt index 0a96d269b0977..4e6dcf98c937f 100644 --- a/PC/readme.txt +++ b/PC/readme.txt @@ -18,7 +18,7 @@ All PC ports use this scheme to try to set up a module search path: 1) The script location; the current directory without script. 2) The PYTHONPATH variable, if set. - 3) For Win32 platforms (NT/95), paths specified in the Registry. + 3) Paths specified in the Registry. 4) Default directories lib, lib/win, lib/test, lib/tkinter; these are searched relative to the environment variable PYTHONHOME, if set, or relative to the executable and its @@ -26,8 +26,8 @@ All PC ports use this scheme to try to set up a module search path: or the current directory (not useful). 5) The directory containing the executable. -The best installation strategy is to put the Python executable (and -DLL, for Win32 platforms) in some convenient directory such as +The best installation strategy is to put the Python executable and +DLL in some convenient directory such as C:/python, and copy all library files and subdirectories (using XCOPY) to C:/python/lib. Then you don't need to set PYTHONPATH. Otherwise, set the environment variable PYTHONPATH to your Python search path. diff --git a/PCbuild/readme.txt b/PCbuild/readme.txt index 2c820e54c2cb1..e4cad75189c97 100644 --- a/PCbuild/readme.txt +++ b/PCbuild/readme.txt @@ -13,12 +13,10 @@ Quick Start Guide Building Python using Microsoft Visual C++ ------------------------------------------ -This directory is used to build CPython for Microsoft Windows NT version -6.0 or higher (Windows Vista, Windows Server 2008, or later) on 32 and 64 +This directory is used to build CPython for Microsoft Windows on 32- and 64- bit platforms. Using this directory requires an installation of -Microsoft Visual Studio 2017 (MSVC 14.1) with the *Python workload* and -its optional *Python native development* component selected. (For -command-line builds, Visual Studio 2015 may also be used.) +Microsoft Visual Studio (MSVC) with the *Python workload* and +its optional *Python native development* component selected. Building from the command line is recommended in order to obtain any external dependencies. To build, simply run the "build.bat" script without @@ -105,7 +103,7 @@ pythonw Prompt window pylauncher py.exe, the Python Launcher for Windows, see - http://docs.python.org/3/using/windows.html#launcher + https://docs.python.org/3/using/windows.html#launcher pywlauncher pyw.exe, a variant of py.exe that doesn't open a Command Prompt window @@ -168,14 +166,14 @@ _bz2 _lzma Python wrapper for version 5.2.2 of the liblzma compression library Homepage: - http://tukaani.org/xz/ + https://tukaani.org/xz/ _ssl Python wrapper for version 1.1.1k of the OpenSSL secure sockets library, which is downloaded from our binaries repository at https://github.com/python/cpython-bin-deps. Homepage: - http://www.openssl.org/ + https://www.openssl.org/ Building OpenSSL requires Perl on your path, and can be performed by running PCbuild\prepare_ssl.bat. This will retrieve the version of @@ -191,14 +189,14 @@ _ssl _sqlite3 Wraps SQLite 3.38.4, which is itself built by sqlite3.vcxproj Homepage: - http://www.sqlite.org/ + https://www.sqlite.org/ _tkinter Wraps version 8.6.6 of the Tk windowing system, which is downloaded from our binaries repository at https://github.com/python/cpython-bin-deps. Homepage: - http://www.tcl.tk/ + https://www.tcl.tk/ Building Tcl and Tk can be performed by running PCbuild\prepare_tcltk.bat. This will retrieve the version of the @@ -257,7 +255,7 @@ It creates the PGI files, runs the unit test suite or PyBench with the PGI python, and finally creates the optimized files. See - http://msdn.microsoft.com/en-us/library/e7k32f4k(VS.140).aspx + https://docs.microsoft.com/en-us/cpp/build/profile-guided-optimizations for more on this topic. From webhook-mailer at python.org Tue May 10 08:36:34 2022 From: webhook-mailer at python.org (markshannon) Date: Tue, 10 May 2022 12:36:34 -0000 Subject: [Python-checkins] gh-92619: Fix bug where the compiler duplicates exit blocks unnecessarily (GH-92620) Message-ID: https://github.com/python/cpython/commit/7c6b7ade8df35355484d3944779fe35dcc560aab commit: 7c6b7ade8df35355484d3944779fe35dcc560aab branch: main author: Irit Katriel <1055913+iritkatriel at users.noreply.github.com> committer: markshannon date: 2022-05-10T13:36:08+01:00 summary: gh-92619: Fix bug where the compiler duplicates exit blocks unnecessarily (GH-92620) files: A Misc/NEWS.d/next/Core and Builtins/2022-05-10-11-34-35.gh-issue-92619.u0V0lY.rst M Lib/test/test_dis.py M Python/compile.c diff --git a/Lib/test/test_dis.py b/Lib/test/test_dis.py index 202b99829f213..af736d6fe9614 100644 --- a/Lib/test/test_dis.py +++ b/Lib/test/test_dis.py @@ -1490,7 +1490,7 @@ def _prepare_test_cases(): Instruction(opname='CALL', opcode=171, arg=1, argval=1, argrepr='', offset=368, starts_line=None, is_jump_target=False, positions=None), Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=378, starts_line=None, is_jump_target=False, positions=None), Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=380, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='JUMP_FORWARD', opcode=110, arg=21, argval=426, argrepr='to 426', offset=382, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='JUMP_FORWARD', opcode=110, arg=4, argval=392, argrepr='to 392', offset=382, starts_line=None, is_jump_target=False, positions=None), Instruction(opname='RERAISE', opcode=119, arg=0, argval=0, argrepr='', offset=384, starts_line=22, is_jump_target=True, positions=None), Instruction(opname='COPY', opcode=120, arg=3, argval=3, argrepr='', offset=386, starts_line=None, is_jump_target=False, positions=None), Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=388, starts_line=None, is_jump_target=False, positions=None), @@ -1502,24 +1502,16 @@ def _prepare_test_cases(): Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=420, starts_line=None, is_jump_target=False, positions=None), Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=422, starts_line=None, is_jump_target=False, positions=None), Instruction(opname='RETURN_VALUE', opcode=83, arg=None, argval=None, argrepr='', offset=424, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='NOP', opcode=9, arg=None, argval=None, argrepr='', offset=426, starts_line=23, is_jump_target=True, positions=None), - Instruction(opname='LOAD_GLOBAL', opcode=116, arg=3, argval='print', argrepr='NULL + print', offset=428, starts_line=28, is_jump_target=False, positions=None), + Instruction(opname='PUSH_EXC_INFO', opcode=35, arg=None, argval=None, argrepr='', offset=426, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='LOAD_GLOBAL', opcode=116, arg=3, argval='print', argrepr='NULL + print', offset=428, starts_line=None, is_jump_target=False, positions=None), Instruction(opname='LOAD_CONST', opcode=100, arg=10, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=440, starts_line=None, is_jump_target=False, positions=None), Instruction(opname='PRECALL', opcode=166, arg=1, argval=1, argrepr='', offset=442, starts_line=None, is_jump_target=False, positions=None), Instruction(opname='CALL', opcode=171, arg=1, argval=1, argrepr='', offset=446, starts_line=None, is_jump_target=False, positions=None), Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=456, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=458, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='RETURN_VALUE', opcode=83, arg=None, argval=None, argrepr='', offset=460, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='PUSH_EXC_INFO', opcode=35, arg=None, argval=None, argrepr='', offset=462, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='LOAD_GLOBAL', opcode=116, arg=3, argval='print', argrepr='NULL + print', offset=464, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=100, arg=10, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=476, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='PRECALL', opcode=166, arg=1, argval=1, argrepr='', offset=478, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='CALL', opcode=171, arg=1, argval=1, argrepr='', offset=482, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=492, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='RERAISE', opcode=119, arg=0, argval=0, argrepr='', offset=494, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='COPY', opcode=120, arg=3, argval=3, argrepr='', offset=496, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=498, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='RERAISE', opcode=119, arg=1, argval=1, argrepr='', offset=500, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='RERAISE', opcode=119, arg=0, argval=0, argrepr='', offset=458, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='COPY', opcode=120, arg=3, argval=3, argrepr='', offset=460, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=462, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='RERAISE', opcode=119, arg=1, argval=1, argrepr='', offset=464, starts_line=None, is_jump_target=False, positions=None), ] # One last piece of inspect fodder to check the default line number handling diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-10-11-34-35.gh-issue-92619.u0V0lY.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-10-11-34-35.gh-issue-92619.u0V0lY.rst new file mode 100644 index 0000000000000..dfc9c0d1327fe --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-05-10-11-34-35.gh-issue-92619.u0V0lY.rst @@ -0,0 +1 @@ +Make the compiler duplicate an exit block only if none of its instructions have a lineno (previously only the first instruction in the block was checked, leading to unnecessarily duplicated blocks). diff --git a/Python/compile.c b/Python/compile.c index 10d6307a48406..45944ae85e383 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -9280,7 +9280,15 @@ trim_unused_consts(struct compiler *c, struct assembler *a, PyObject *consts) static inline int is_exit_without_lineno(basicblock *b) { - return b->b_exit && b->b_instr[0].i_lineno < 0; + if (!b->b_exit) { + return 0; + } + for (int i = 0; i < b->b_iused; i++) { + if (b->b_instr[i].i_lineno >= 0) { + return 0; + } + } + return 1; } /* PEP 626 mandates that the f_lineno of a frame is correct From webhook-mailer at python.org Tue May 10 08:47:39 2022 From: webhook-mailer at python.org (pablogsal) Date: Tue, 10 May 2022 12:47:39 -0000 Subject: [Python-checkins] gh-91731: Fix typo in pymacro.h (#92618) Message-ID: https://github.com/python/cpython/commit/4e6da502f42e3cbdffbe850833d2b04996232f0d commit: 4e6da502f42e3cbdffbe850833d2b04996232f0d branch: main author: Pablo Galindo Salgado committer: pablogsal date: 2022-05-10T13:47:22+01:00 summary: gh-91731: Fix typo in pymacro.h (#92618) * Fix typo in pymacro.h * Update Include/pymacro.h Co-authored-by: Victor Stinner Co-authored-by: Victor Stinner files: M Include/pymacro.h diff --git a/Include/pymacro.h b/Include/pymacro.h index 5037bbd013801..b959eeb3f58b3 100644 --- a/Include/pymacro.h +++ b/Include/pymacro.h @@ -10,7 +10,7 @@ # define static_assert _Static_assert #endif -// static_assert is defined in GLIB from version 2.16. Before it requires +// static_assert is defined in glibc from version 2.16. Before it requires // compiler support (gcc >= 4.6) and is called _Static_assert. #if (defined(__GLIBC__) \ && (__GLIBC__ < 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ <= 16)) \ From webhook-mailer at python.org Tue May 10 09:24:34 2022 From: webhook-mailer at python.org (miss-islington) Date: Tue, 10 May 2022 13:24:34 -0000 Subject: [Python-checkins] gh-91731: Fix typo in pymacro.h (GH-92618) Message-ID: https://github.com/python/cpython/commit/6546af31ee8d36d6d240f3ce434fbd13a2d7e53b commit: 6546af31ee8d36d6d240f3ce434fbd13a2d7e53b branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-10T06:24:11-07:00 summary: gh-91731: Fix typo in pymacro.h (GH-92618) * Fix typo in pymacro.h * Update Include/pymacro.h Co-authored-by: Victor Stinner Co-authored-by: Victor Stinner (cherry picked from commit 4e6da502f42e3cbdffbe850833d2b04996232f0d) Co-authored-by: Pablo Galindo Salgado files: M Include/pymacro.h diff --git a/Include/pymacro.h b/Include/pymacro.h index 5037bbd013801..b959eeb3f58b3 100644 --- a/Include/pymacro.h +++ b/Include/pymacro.h @@ -10,7 +10,7 @@ # define static_assert _Static_assert #endif -// static_assert is defined in GLIB from version 2.16. Before it requires +// static_assert is defined in glibc from version 2.16. Before it requires // compiler support (gcc >= 4.6) and is called _Static_assert. #if (defined(__GLIBC__) \ && (__GLIBC__ < 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ <= 16)) \ From webhook-mailer at python.org Tue May 10 12:12:38 2022 From: webhook-mailer at python.org (rhettinger) Date: Tue, 10 May 2022 16:12:38 -0000 Subject: [Python-checkins] gh-80143: Add clarification for escape characters (#92292) Message-ID: https://github.com/python/cpython/commit/549567c6e70da4846c105a18a1a89e7dd09680d7 commit: 549567c6e70da4846c105a18a1a89e7dd09680d7 branch: main author: slateny <46876382+slateny at users.noreply.github.com> committer: rhettinger date: 2022-05-10T11:12:29-05:00 summary: gh-80143: Add clarification for escape characters (#92292) files: M Doc/reference/lexical_analysis.rst diff --git a/Doc/reference/lexical_analysis.rst b/Doc/reference/lexical_analysis.rst index 0e64a056a6eb2..1cf0a5b15cbbb 100644 --- a/Doc/reference/lexical_analysis.rst +++ b/Doc/reference/lexical_analysis.rst @@ -480,9 +480,11 @@ declaration is given in the source file; see section :ref:`encodings`. In plain English: Both types of literals can be enclosed in matching single quotes (``'``) or double quotes (``"``). They can also be enclosed in matching groups of three single or double quotes (these are generally referred to as -*triple-quoted strings*). The backslash (``\``) character is used to escape -characters that otherwise have a special meaning, such as newline, backslash -itself, or the quote character. +*triple-quoted strings*). The backslash (``\``) character is used to give special +meaning to otherwise ordinary characters like ``n``, which means 'newline' when +escaped (``\n``). It can also be used to escape characters that otherwise have a +special meaning, such as newline, backslash itself, or the quote character. +See :ref:`escape sequences ` below for examples. .. index:: single: b'; bytes literal @@ -541,6 +543,8 @@ retained), except that three unescaped quotes in a row terminate the literal. ( single: \u; escape sequence single: \U; escape sequence +.. _escape-sequences: + Unless an ``'r'`` or ``'R'`` prefix is present, escape sequences in string and bytes literals are interpreted according to rules similar to those used by Standard C. The recognized escape sequences are: From webhook-mailer at python.org Tue May 10 13:22:52 2022 From: webhook-mailer at python.org (rhettinger) Date: Tue, 10 May 2022 17:22:52 -0000 Subject: [Python-checkins] bpo-42259: clarify pprint saferepr docs (#30256) Message-ID: https://github.com/python/cpython/commit/392fd272cde0542859063ea01980091945029e95 commit: 392fd272cde0542859063ea01980091945029e95 branch: main author: andrei kulakov committer: rhettinger date: 2022-05-10T12:22:36-05:00 summary: bpo-42259: clarify pprint saferepr docs (#30256) files: M Doc/library/pprint.rst diff --git a/Doc/library/pprint.rst b/Doc/library/pprint.rst index 3da5aa9389b17..4e29192311fc2 100644 --- a/Doc/library/pprint.rst +++ b/Doc/library/pprint.rst @@ -171,17 +171,21 @@ The :mod:`pprint` module defines one class: .. function:: isrecursive(object) - Determine if *object* requires a recursive representation. + Determine if *object* requires a recursive representation. This function is + subject to the same limitations as noted in :func:`saferepr` below and may raise an + :exc:`RecursionError` if it fails to detect a recursive object. One more support function is also defined: .. function:: saferepr(object) - Return a string representation of *object*, protected against recursive data - structures. If the representation of *object* exposes a recursive entry, the - recursive reference will be represented as ````. The representation is not otherwise formatted. + Return a string representation of *object*, protected against recursion in + some common data structures, namely instances of :class:`dict`, :class:`list` + and :class:`tuple` or subclasses whose ``__repr__`` has not been overridden. If the + representation of object exposes a recursive entry, the recursive reference + will be represented as ````. The + representation is not otherwise formatted. >>> pprint.saferepr(stuff) "[, 'spam', 'eggs', 'lumberjack', 'knights', 'ni']" From webhook-mailer at python.org Tue May 10 14:01:54 2022 From: webhook-mailer at python.org (rhettinger) Date: Tue, 10 May 2022 18:01:54 -0000 Subject: [Python-checkins] Update numbers.rst (#31995) Message-ID: https://github.com/python/cpython/commit/dde8a1668e0a6ad09634d0c701742c91da616497 commit: dde8a1668e0a6ad09634d0c701742c91da616497 branch: main author: G?ry Ogam committer: rhettinger date: 2022-05-10T13:01:49-05:00 summary: Update numbers.rst (#31995) files: M Doc/library/numbers.rst diff --git a/Doc/library/numbers.rst b/Doc/library/numbers.rst index b77845ed0dee9..b12f82ed75a6f 100644 --- a/Doc/library/numbers.rst +++ b/Doc/library/numbers.rst @@ -202,9 +202,9 @@ forward and reverse instances of any given operator. For example, if isinstance(a, Rational): # Includes ints. return monomorphic_operator(a, b) - elif isinstance(a, numbers.Real): + elif isinstance(a, Real): return fallback_operator(float(a), float(b)) - elif isinstance(a, numbers.Complex): + elif isinstance(a, Complex): return fallback_operator(complex(a), complex(b)) else: return NotImplemented From webhook-mailer at python.org Tue May 10 15:31:53 2022 From: webhook-mailer at python.org (gpshead) Date: Tue, 10 May 2022 19:31:53 -0000 Subject: [Python-checkins] gh-84131: Remove the deprecated pathlib.Path.link_to method. (#92505) Message-ID: https://github.com/python/cpython/commit/07b34926d3090e50f9ecaa213c564f98fc9a5a93 commit: 07b34926d3090e50f9ecaa213c564f98fc9a5a93 branch: main author: Gregory P. Smith committer: gpshead date: 2022-05-10T12:31:41-07:00 summary: gh-84131: Remove the deprecated pathlib.Path.link_to method. (#92505) Co-authored-by: Barney Gale files: A Misc/NEWS.d/next/Library/2022-05-08-19-21-14.gh-issue-84131.rG5kI7.rst M Doc/library/pathlib.rst M Doc/whatsnew/3.8.rst M Lib/pathlib.py M Lib/test/test_pathlib.py diff --git a/Doc/library/pathlib.rst b/Doc/library/pathlib.rst index 01e9cfb93e391..535b5abf8e3ff 100644 --- a/Doc/library/pathlib.rst +++ b/Doc/library/pathlib.rst @@ -1162,25 +1162,6 @@ call fails (for example because the path doesn't exist). .. versionadded:: 3.10 -.. method:: Path.link_to(target) - - Make *target* a hard link to this path. - - .. warning:: - - This function does not make this path a hard link to *target*, despite - the implication of the function and argument names. The argument order - (target, link) is the reverse of :func:`Path.symlink_to` and - :func:`Path.hardlink_to`, but matches that of :func:`os.link`. - - .. versionadded:: 3.8 - - .. deprecated:: 3.10 - - This method is deprecated in favor of :meth:`Path.hardlink_to`, as the - argument order of :meth:`Path.link_to` does not match that of - :meth:`Path.symlink_to`. - .. method:: Path.touch(mode=0o666, exist_ok=True) diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index 7c293a501895b..6b88cf6606919 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -1087,6 +1087,9 @@ contain characters unrepresentable at the OS level. Added :meth:`pathlib.Path.link_to()` which creates a hard link pointing to a path. (Contributed by Joannah Nanjekye in :issue:`26978`) +Note that ``link_to`` was deprecated in 3.10 and removed in 3.12 in +favor of a ``hardlink_to`` method added in 3.10 which matches the +semantics of the existing ``symlink_to`` method. pickle diff --git a/Lib/pathlib.py b/Lib/pathlib.py index 4763ab54f6ba8..be3fd011795e5 100644 --- a/Lib/pathlib.py +++ b/Lib/pathlib.py @@ -1199,23 +1199,6 @@ def hardlink_to(self, target): raise NotImplementedError("os.link() not available on this system") os.link(target, self) - def link_to(self, target): - """ - Make the target path a hard link pointing to this path. - - Note this function does not make this path a hard link to *target*, - despite the implication of the function and argument names. The order - of arguments (target, link) is the reverse of Path.symlink_to, but - matches that of os.link. - - Deprecated since Python 3.10 and scheduled for removal in Python 3.12. - Use `hardlink_to()` instead. - """ - warnings.warn("pathlib.Path.link_to() is deprecated and is scheduled " - "for removal in Python 3.12. " - "Use pathlib.Path.hardlink_to() instead.", - DeprecationWarning, stacklevel=2) - self.__class__(target).hardlink_to(self) # Convenience functions for querying the stat results diff --git a/Lib/test/test_pathlib.py b/Lib/test/test_pathlib.py index b8b08bf0ce1bb..3412d8431ab85 100644 --- a/Lib/test/test_pathlib.py +++ b/Lib/test/test_pathlib.py @@ -1977,28 +1977,6 @@ def test_rmdir(self): self.assertFileNotFound(p.stat) self.assertFileNotFound(p.unlink) - @unittest.skipUnless(hasattr(os, "link"), "os.link() is not present") - def test_link_to(self): - P = self.cls(BASE) - p = P / 'fileA' - size = p.stat().st_size - # linking to another path. - q = P / 'dirA' / 'fileAA' - try: - with self.assertWarns(DeprecationWarning): - p.link_to(q) - except PermissionError as e: - self.skipTest('os.link(): %s' % e) - self.assertEqual(q.stat().st_size, size) - self.assertEqual(os.path.samefile(p, q), True) - self.assertTrue(p.stat) - # Linking to a str of a relative path. - r = rel_join('fileAAA') - with self.assertWarns(DeprecationWarning): - q.link_to(r) - self.assertEqual(os.stat(r).st_size, size) - self.assertTrue(q.stat) - @unittest.skipUnless(hasattr(os, "link"), "os.link() is not present") def test_hardlink_to(self): P = self.cls(BASE) @@ -2024,7 +2002,7 @@ def test_link_to_not_implemented(self): # linking to another path. q = P / 'dirA' / 'fileAA' with self.assertRaises(NotImplementedError): - p.link_to(q) + q.hardlink_to(p) def test_rename(self): P = self.cls(BASE) diff --git a/Misc/NEWS.d/next/Library/2022-05-08-19-21-14.gh-issue-84131.rG5kI7.rst b/Misc/NEWS.d/next/Library/2022-05-08-19-21-14.gh-issue-84131.rG5kI7.rst new file mode 100644 index 0000000000000..4a930bde01153 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-05-08-19-21-14.gh-issue-84131.rG5kI7.rst @@ -0,0 +1,3 @@ +The :class:`pathlib.Path` deprecated method ``link_to`` has been removed. +Use 3.10's :meth:`~pathlib.Path.hardlink_to` method instead as its semantics +are consistent with that of :meth:`~pathlib.Path.symlink_to`. From webhook-mailer at python.org Tue May 10 16:57:36 2022 From: webhook-mailer at python.org (miss-islington) Date: Tue, 10 May 2022 20:57:36 -0000 Subject: [Python-checkins] bpo-43689: improve documentation for Differ (GH-25132) Message-ID: https://github.com/python/cpython/commit/fe1c5ba60878482b34b60de36424390a2dcdae50 commit: fe1c5ba60878482b34b60de36424390a2dcdae50 branch: main author: J?rgen Gmach committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-10T13:57:12-07:00 summary: bpo-43689: improve documentation for Differ (GH-25132) Lines beginning with ``?`` try to help understanding the given diff. The output can be hard to understand when it contains whitespace characters, such as spaces, tabs or line breaks. While previously only tabs were mentioned, now all are listed. Automerge-Triggered-By: GH:rhettinger files: A Misc/NEWS.d/next/Documentation/2021-04-01-08-09-34.bpo-43689.mqCfLe.rst M Doc/library/difflib.rst diff --git a/Doc/library/difflib.rst b/Doc/library/difflib.rst index aa08988c8b36f..10f8808d33b16 100644 --- a/Doc/library/difflib.rst +++ b/Doc/library/difflib.rst @@ -79,7 +79,7 @@ diffs. For comparing directories and files, see also, the :mod:`filecmp` module. Lines beginning with '``?``' attempt to guide the eye to intraline differences, and were not present in either input sequence. These lines can be confusing if - the sequences contain tab characters. + the sequences contain whitespace characters, such as spaces, tabs or line breaks. .. class:: HtmlDiff diff --git a/Misc/NEWS.d/next/Documentation/2021-04-01-08-09-34.bpo-43689.mqCfLe.rst b/Misc/NEWS.d/next/Documentation/2021-04-01-08-09-34.bpo-43689.mqCfLe.rst new file mode 100644 index 0000000000000..5cc13d7068c95 --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2021-04-01-08-09-34.bpo-43689.mqCfLe.rst @@ -0,0 +1 @@ +The ``Differ`` documentation now also mentions other whitespace characters, which make it harder to understand the diff output. From webhook-mailer at python.org Tue May 10 17:00:07 2022 From: webhook-mailer at python.org (rhettinger) Date: Tue, 10 May 2022 21:00:07 -0000 Subject: [Python-checkins] bpo-39278: add docstrings to functions in pdb module (#17924) Message-ID: https://github.com/python/cpython/commit/f481a02e6c7c981d1316267bad5fb94fee912ad6 commit: f481a02e6c7c981d1316267bad5fb94fee912ad6 branch: main author: Carl Bordum Hansen committer: rhettinger date: 2022-05-10T15:59:58-05:00 summary: bpo-39278: add docstrings to functions in pdb module (#17924) files: M Lib/pdb.py diff --git a/Lib/pdb.py b/Lib/pdb.py index 58bc720275a28..e6ed814acbe19 100755 --- a/Lib/pdb.py +++ b/Lib/pdb.py @@ -1668,9 +1668,27 @@ def _run(self, target: Union[ModuleTarget, ScriptTarget]): # Simplified interface def run(statement, globals=None, locals=None): + """Execute the *statement* (given as a string or a code object) + under debugger control. + + The debugger prompt appears before any code is executed; you can set + breakpoints and type continue, or you can step through the statement + using step or next. + + The optional *globals* and *locals* arguments specify the + environment in which the code is executed; by default the + dictionary of the module __main__ is used (see the explanation of + the built-in exec() or eval() functions.). + """ Pdb().run(statement, globals, locals) def runeval(expression, globals=None, locals=None): + """Evaluate the *expression* (given as a string or a code object) + under debugger control. + + When runeval() returns, it returns the value of the expression. + Otherwise this function is similar to run(). + """ return Pdb().runeval(expression, globals, locals) def runctx(statement, globals, locals): @@ -1678,9 +1696,23 @@ def runctx(statement, globals, locals): run(statement, globals, locals) def runcall(*args, **kwds): + """Call the function (a function or method object, not a string) + with the given arguments. + + When runcall() returns, it returns whatever the function call + returned. The debugger prompt appears as soon as the function is + entered. + """ return Pdb().runcall(*args, **kwds) def set_trace(*, header=None): + """Enter the debugger at the calling stack frame. + + This is useful to hard-code a breakpoint at a given point in a + program, even if the code is not otherwise being debugged (e.g. when + an assertion fails). If given, *header* is printed to the console + just before debugging begins. + """ pdb = Pdb() if header is not None: pdb.message(header) @@ -1689,6 +1721,12 @@ def set_trace(*, header=None): # Post-Mortem interface def post_mortem(t=None): + """Enter post-mortem debugging of the given *traceback* object. + + If no traceback is given, it uses the one of the exception that is + currently being handled (an exception must be being handled if the + default is to be used). + """ # handling the default if t is None: # sys.exc_info() returns (type, value, traceback) if an exception is @@ -1703,6 +1741,7 @@ def post_mortem(t=None): p.interaction(None, t) def pm(): + """Enter post-mortem debugging of the traceback found in sys.last_traceback.""" post_mortem(sys.last_traceback) From webhook-mailer at python.org Tue May 10 17:01:23 2022 From: webhook-mailer at python.org (iritkatriel) Date: Tue, 10 May 2022 21:01:23 -0000 Subject: [Python-checkins] gh-92619: Fix bug where the compiler duplicates exit blocks unnecessarily (GH-92620) (GH-92621) Message-ID: https://github.com/python/cpython/commit/6a17cdebe9d3571d0c02645880f53a05e9ff7fda commit: 6a17cdebe9d3571d0c02645880f53a05e9ff7fda branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: iritkatriel <1055913+iritkatriel at users.noreply.github.com> date: 2022-05-10T22:01:17+01:00 summary: gh-92619: Fix bug where the compiler duplicates exit blocks unnecessarily (GH-92620) (GH-92621) (cherry picked from commit 7c6b7ade8df35355484d3944779fe35dcc560aab) Co-authored-by: Irit Katriel <1055913+iritkatriel at users.noreply.github.com> Co-authored-by: Irit Katriel <1055913+iritkatriel at users.noreply.github.com> files: A Misc/NEWS.d/next/Core and Builtins/2022-05-10-11-34-35.gh-issue-92619.u0V0lY.rst M Lib/test/test_dis.py M Python/compile.c diff --git a/Lib/test/test_dis.py b/Lib/test/test_dis.py index 202b99829f213..af736d6fe9614 100644 --- a/Lib/test/test_dis.py +++ b/Lib/test/test_dis.py @@ -1490,7 +1490,7 @@ def _prepare_test_cases(): Instruction(opname='CALL', opcode=171, arg=1, argval=1, argrepr='', offset=368, starts_line=None, is_jump_target=False, positions=None), Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=378, starts_line=None, is_jump_target=False, positions=None), Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=380, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='JUMP_FORWARD', opcode=110, arg=21, argval=426, argrepr='to 426', offset=382, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='JUMP_FORWARD', opcode=110, arg=4, argval=392, argrepr='to 392', offset=382, starts_line=None, is_jump_target=False, positions=None), Instruction(opname='RERAISE', opcode=119, arg=0, argval=0, argrepr='', offset=384, starts_line=22, is_jump_target=True, positions=None), Instruction(opname='COPY', opcode=120, arg=3, argval=3, argrepr='', offset=386, starts_line=None, is_jump_target=False, positions=None), Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=388, starts_line=None, is_jump_target=False, positions=None), @@ -1502,24 +1502,16 @@ def _prepare_test_cases(): Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=420, starts_line=None, is_jump_target=False, positions=None), Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=422, starts_line=None, is_jump_target=False, positions=None), Instruction(opname='RETURN_VALUE', opcode=83, arg=None, argval=None, argrepr='', offset=424, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='NOP', opcode=9, arg=None, argval=None, argrepr='', offset=426, starts_line=23, is_jump_target=True, positions=None), - Instruction(opname='LOAD_GLOBAL', opcode=116, arg=3, argval='print', argrepr='NULL + print', offset=428, starts_line=28, is_jump_target=False, positions=None), + Instruction(opname='PUSH_EXC_INFO', opcode=35, arg=None, argval=None, argrepr='', offset=426, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='LOAD_GLOBAL', opcode=116, arg=3, argval='print', argrepr='NULL + print', offset=428, starts_line=None, is_jump_target=False, positions=None), Instruction(opname='LOAD_CONST', opcode=100, arg=10, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=440, starts_line=None, is_jump_target=False, positions=None), Instruction(opname='PRECALL', opcode=166, arg=1, argval=1, argrepr='', offset=442, starts_line=None, is_jump_target=False, positions=None), Instruction(opname='CALL', opcode=171, arg=1, argval=1, argrepr='', offset=446, starts_line=None, is_jump_target=False, positions=None), Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=456, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=458, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='RETURN_VALUE', opcode=83, arg=None, argval=None, argrepr='', offset=460, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='PUSH_EXC_INFO', opcode=35, arg=None, argval=None, argrepr='', offset=462, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='LOAD_GLOBAL', opcode=116, arg=3, argval='print', argrepr='NULL + print', offset=464, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=100, arg=10, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=476, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='PRECALL', opcode=166, arg=1, argval=1, argrepr='', offset=478, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='CALL', opcode=171, arg=1, argval=1, argrepr='', offset=482, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=492, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='RERAISE', opcode=119, arg=0, argval=0, argrepr='', offset=494, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='COPY', opcode=120, arg=3, argval=3, argrepr='', offset=496, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=498, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='RERAISE', opcode=119, arg=1, argval=1, argrepr='', offset=500, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='RERAISE', opcode=119, arg=0, argval=0, argrepr='', offset=458, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='COPY', opcode=120, arg=3, argval=3, argrepr='', offset=460, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=462, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='RERAISE', opcode=119, arg=1, argval=1, argrepr='', offset=464, starts_line=None, is_jump_target=False, positions=None), ] # One last piece of inspect fodder to check the default line number handling diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-10-11-34-35.gh-issue-92619.u0V0lY.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-10-11-34-35.gh-issue-92619.u0V0lY.rst new file mode 100644 index 0000000000000..dfc9c0d1327fe --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-05-10-11-34-35.gh-issue-92619.u0V0lY.rst @@ -0,0 +1 @@ +Make the compiler duplicate an exit block only if none of its instructions have a lineno (previously only the first instruction in the block was checked, leading to unnecessarily duplicated blocks). diff --git a/Python/compile.c b/Python/compile.c index 10d6307a48406..45944ae85e383 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -9280,7 +9280,15 @@ trim_unused_consts(struct compiler *c, struct assembler *a, PyObject *consts) static inline int is_exit_without_lineno(basicblock *b) { - return b->b_exit && b->b_instr[0].i_lineno < 0; + if (!b->b_exit) { + return 0; + } + for (int i = 0; i < b->b_iused; i++) { + if (b->b_instr[i].i_lineno >= 0) { + return 0; + } + } + return 1; } /* PEP 626 mandates that the f_lineno of a frame is correct From webhook-mailer at python.org Tue May 10 17:23:54 2022 From: webhook-mailer at python.org (miss-islington) Date: Tue, 10 May 2022 21:23:54 -0000 Subject: [Python-checkins] bpo-39264: Fix UserDict.get() to account for __missing__() (GH-17910) Message-ID: https://github.com/python/cpython/commit/30a43586f0d1776d25beb71b92f9880be7997e1b commit: 30a43586f0d1776d25beb71b92f9880be7997e1b branch: main author: Bar Harel committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-10T14:23:45-07:00 summary: bpo-39264: Fix UserDict.get() to account for __missing__() (GH-17910) Here's the patch according to the discussion at the [Python-Dev mailing list](https://mail.python.org/archives/list/python-dev at python.org/thread/SDXOEMAEM6KQ3CQCJVBVRT5QNSPAVU6X/). UserDict.get() will match dict's behavior and not call `__missing__`. Automerge-Triggered-By: GH:rhettinger files: A Misc/NEWS.d/next/Library/2020-01-09-01-57-12.bpo-39264.GsBL9-.rst M Lib/collections/__init__.py M Lib/test/test_collections.py diff --git a/Lib/collections/__init__.py b/Lib/collections/__init__.py index 7af8dcd526df8..58607874be93d 100644 --- a/Lib/collections/__init__.py +++ b/Lib/collections/__init__.py @@ -1132,10 +1132,17 @@ def __delitem__(self, key): def __iter__(self): return iter(self.data) - # Modify __contains__ to work correctly when __missing__ is present + # Modify __contains__ and get() to work like dict + # does when __missing__ is present. def __contains__(self, key): return key in self.data + def get(self, key, default=None): + if key in self: + return self[key] + return default + + # Now, add the methods in dicts but not in MutableMapping def __repr__(self): return repr(self.data) diff --git a/Lib/test/test_collections.py b/Lib/test/test_collections.py index fa1d0e014dee9..59b3f2ec7bfcb 100644 --- a/Lib/test/test_collections.py +++ b/Lib/test/test_collections.py @@ -71,6 +71,14 @@ def test_dict_copy(self): obj[123] = "abc" self._copy_test(obj) + def test_dict_missing(self): + class A(UserDict): + def __missing__(self, key): + return 456 + self.assertEqual(A()[123], 456) + # get() ignores __missing__ on dict + self.assertIs(A().get(123), None) + ################################################################################ ### ChainMap (helper class for configparser and the string module) diff --git a/Misc/NEWS.d/next/Library/2020-01-09-01-57-12.bpo-39264.GsBL9-.rst b/Misc/NEWS.d/next/Library/2020-01-09-01-57-12.bpo-39264.GsBL9-.rst new file mode 100644 index 0000000000000..5f9ffdffce5c2 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-09-01-57-12.bpo-39264.GsBL9-.rst @@ -0,0 +1,3 @@ +Fixed :meth:`collections.UserDict.get` to not call +:meth:`__missing__` when a value is not found. This matches the behavior of +:class:`dict`. Patch by Bar Harel. From webhook-mailer at python.org Tue May 10 18:19:32 2022 From: webhook-mailer at python.org (rhettinger) Date: Tue, 10 May 2022 22:19:32 -0000 Subject: [Python-checkins] gh-91966 Document where key functions are applied in the bisect module (#92602) Message-ID: https://github.com/python/cpython/commit/63794dbc9351495526753eda0b1397a29b111f1b commit: 63794dbc9351495526753eda0b1397a29b111f1b branch: main author: Raymond Hettinger committer: rhettinger date: 2022-05-10T17:18:58-05:00 summary: gh-91966 Document where key functions are applied in the bisect module (#92602) files: M Doc/library/bisect.rst diff --git a/Doc/library/bisect.rst b/Doc/library/bisect.rst index edcd4aeb24aa7..901a41f549202 100644 --- a/Doc/library/bisect.rst +++ b/Doc/library/bisect.rst @@ -35,8 +35,11 @@ The following functions are provided: ``all(val >= x for val in a[i : hi])`` for the right side. *key* specifies a :term:`key function` of one argument that is used to - extract a comparison key from each input element. The default value is - ``None`` (compare the elements directly). + extract a comparison key from each element in the array. To support + searching complex records, the key function is not applied to the *x* value. + + If *key* is ``None``, the elements are compared directly with no + intervening function call. .. versionchanged:: 3.10 Added the *key* parameter. @@ -53,8 +56,11 @@ The following functions are provided: ``all(val > x for val in a[i : hi])`` for the right side. *key* specifies a :term:`key function` of one argument that is used to - extract a comparison key from each input element. The default value is - ``None`` (compare the elements directly). + extract a comparison key from each element in the array. To support + searching complex records, the key function is not applied to the *x* value. + + If *key* is ``None``, the elements are compared directly with no + intervening function call. .. versionchanged:: 3.10 Added the *key* parameter. @@ -64,14 +70,13 @@ The following functions are provided: Insert *x* in *a* in sorted order. - *key* specifies a :term:`key function` of one argument that is used to - extract a comparison key from each input element. The default value is - ``None`` (compare the elements directly). - This function first runs :func:`bisect_left` to locate an insertion point. Next, it runs the :meth:`insert` method on *a* to insert *x* at the appropriate position to maintain sort order. + To support inserting records in a table, the *key* function (if any) is + applied to *x* for the search step but not for the insertion step. + Keep in mind that the ``O(log n)`` search is dominated by the slow O(n) insertion step. @@ -85,14 +90,13 @@ The following functions are provided: Similar to :func:`insort_left`, but inserting *x* in *a* after any existing entries of *x*. - *key* specifies a :term:`key function` of one argument that is used to - extract a comparison key from each input element. The default value is - ``None`` (compare the elements directly). - This function first runs :func:`bisect_right` to locate an insertion point. Next, it runs the :meth:`insert` method on *a* to insert *x* at the appropriate position to maintain sort order. + To support inserting records in a table, the *key* function (if any) is + applied to *x* for the search step but not for the insertion step. + Keep in mind that the ``O(log n)`` search is dominated by the slow O(n) insertion step. @@ -194,8 +198,42 @@ a 'B', and so on:: >>> [grade(score) for score in [33, 99, 77, 70, 89, 90, 100]] ['F', 'A', 'C', 'C', 'B', 'A', 'A'] -One technique to avoid repeated calls to a key function is to search a list of -precomputed keys to find the index of a record:: +The :func:`bisect`function and :func:`insort` functions also work with lists of +tuples. The *key* argument can serve to extract the field used for ordering +records in a table:: + + >>> from collections import namedtuple + >>> from operator import attrgetter + >>> from bisect import bisect, insort + >>> from pprint import pprint + + >>> Movie = namedtuple('Movie', ('name', 'released', 'director')) + + >>> movies = [ + ... Movie('Jaws', 1975, 'Speilberg'), + ... Movie('Titanic', 1997, 'Cameron'), + ... Movie('The Birds', 1963, 'Hitchcock'), + ... Movie('Aliens', 1986, 'Scott') + ... ] + + >>> # Find the first movie released on or after 1960 + >>> by_year = attrgetter('released') + >>> movies.sort(key=by_year) + >>> movies[bisect(movies, 1960, key=by_year)] + Movie(name='The Birds', released=1963, director='Hitchcock') + + >>> # Insert a movie while maintaining sort order + >>> romance = Movie('Love Story', 1970, 'Hiller') + >>> insort(movies, romance, key=by_year) + >>> pprint(movies) + [Movie(name='The Birds', released=1963, director='Hitchcock'), + Movie(name='Love Story', released=1970, director='Hiller'), + Movie(name='Jaws', released=1975, director='Speilberg'), + Movie(name='Aliens', released=1986, director='Scott'), + Movie(name='Titanic', released=1997, director='Cameron')] + +If the key function is expensive, it is possible to avoid repeated function +calls by searching a list of precomputed keys to find the index of a record:: >>> data = [('red', 5), ('blue', 1), ('yellow', 8), ('black', 0)] >>> data.sort(key=lambda r: r[1]) # Or use operator.itemgetter(1). @@ -208,4 +246,3 @@ precomputed keys to find the index of a record:: ('red', 5) >>> data[bisect_left(keys, 8)] ('yellow', 8) - From webhook-mailer at python.org Tue May 10 18:52:43 2022 From: webhook-mailer at python.org (zooba) Date: Tue, 10 May 2022 22:52:43 -0000 Subject: [Python-checkins] bpo-46785: Fix race condition between os.stat() and unlink on Windows (GH-31858) Message-ID: https://github.com/python/cpython/commit/9be9b585aac111becb5b95b053360ed9b7d206e0 commit: 9be9b585aac111becb5b95b053360ed9b7d206e0 branch: 3.10 author: Itai Steinherz committer: zooba date: 2022-05-10T23:52:39+01:00 summary: bpo-46785: Fix race condition between os.stat() and unlink on Windows (GH-31858) * [3.10] bpo-46785: Fix race condition between os.stat() and unlink on Windows (GH-31858). (cherry picked from commit 39e6b8ae6a5b49bb23746fdcc354d148ff2d98e3) Co-authored-by: Itai Steinherz files: A Misc/NEWS.d/next/Windows/2022-03-13-20-35-41.bpo-46785.Pnknyl.rst M Lib/test/test_os.py M Misc/ACKS M Modules/posixmodule.c diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py index 7f7d14ef0a095..1243b575dcafd 100644 --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -23,6 +23,7 @@ import sys import sysconfig import tempfile +import textwrap import threading import time import types @@ -2859,6 +2860,48 @@ def test_getfinalpathname_handles(self): self.assertEqual(0, handle_delta) + def test_stat_unlink_race(self): + # bpo-46785: the implementation of os.stat() falls back to reading + # the parent directory if CreateFileW() fails with a permission + # error. If reading the parent directory fails because the file or + # directory are subsequently unlinked, or because the volume or + # share are no longer available, then the original permission error + # should not be restored. + filename = os_helper.TESTFN + self.addCleanup(os_helper.unlink, filename) + deadline = time.time() + 5 + command = textwrap.dedent("""\ + import os + import sys + import time + + filename = sys.argv[1] + deadline = float(sys.argv[2]) + + while time.time() < deadline: + try: + with open(filename, "w") as f: + pass + except OSError: + pass + try: + os.remove(filename) + except OSError: + pass + """) + + with subprocess.Popen([sys.executable, '-c', command, filename, str(deadline)]) as proc: + while time.time() < deadline: + try: + os.stat(filename) + except FileNotFoundError as e: + assert e.winerror == 2 # ERROR_FILE_NOT_FOUND + try: + proc.wait(1) + except subprocess.TimeoutExpired: + proc.terminate() + + @os_helper.skip_unless_symlink class NonLocalSymlinkTests(unittest.TestCase): diff --git a/Misc/ACKS b/Misc/ACKS index c6abfac531cbe..889bf8aeaea1a 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1694,6 +1694,7 @@ Anthony Starks David Steele Oliver Steele Greg Stein +Itai Steinherz Marek Stepniowski Baruch Sterin Chris Stern diff --git a/Misc/NEWS.d/next/Windows/2022-03-13-20-35-41.bpo-46785.Pnknyl.rst b/Misc/NEWS.d/next/Windows/2022-03-13-20-35-41.bpo-46785.Pnknyl.rst new file mode 100644 index 0000000000000..0a87abd77c8ff --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2022-03-13-20-35-41.bpo-46785.Pnknyl.rst @@ -0,0 +1 @@ +Fix race condition between :func:`os.stat` and unlinking a file on Windows, by using errors codes returned by ``FindFirstFileW()`` when appropriate in ``win32_xstat_impl``. diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 03de4703239a7..26c8e7bc2804d 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -1905,7 +1905,17 @@ win32_xstat_impl(const wchar_t *path, struct _Py_stat_struct *result, /* Try reading the parent directory. */ if (!attributes_from_dir(path, &fileInfo, &tagInfo.ReparseTag)) { /* Cannot read the parent directory. */ - SetLastError(error); + switch (GetLastError()) { + case ERROR_FILE_NOT_FOUND: /* File cannot be found */ + case ERROR_PATH_NOT_FOUND: /* File parent directory cannot be found */ + case ERROR_NOT_READY: /* Drive exists but unavailable */ + case ERROR_BAD_NET_NAME: /* Remote drive unavailable */ + break; + /* Restore the error from CreateFileW(). */ + default: + SetLastError(error); + } + return -1; } if (fileInfo.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) { From webhook-mailer at python.org Tue May 10 19:28:35 2022 From: webhook-mailer at python.org (vstinner) Date: Tue, 10 May 2022 23:28:35 -0000 Subject: [Python-checkins] What's New 3.12: PyFrame_BlockSetup() was removed in 3.11 (#92645) Message-ID: https://github.com/python/cpython/commit/303e5d57bc8aeb48ae5ed9dae6ca6e7efeb66122 commit: 303e5d57bc8aeb48ae5ed9dae6ca6e7efeb66122 branch: main author: Victor Stinner committer: vstinner date: 2022-05-11T01:28:17+02:00 summary: What's New 3.12: PyFrame_BlockSetup() was removed in 3.11 (#92645) What's New in Python 3.11: "PyFrame_BlockSetup() and PyFrame_BlockPop() have been removed. (Contributed by Mark Shannon in bpo-40222.)" https://docs.python.org/dev/whatsnew/3.11.html#id8 files: M Doc/whatsnew/3.12.rst diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst index af8973ae20304..461d9db793400 100644 --- a/Doc/whatsnew/3.12.rst +++ b/Doc/whatsnew/3.12.rst @@ -139,5 +139,3 @@ Deprecated Removed ------- - -* :c:func:`PyFrame_BlockSetup` and :c:func:`PyFrame_BlockPop` have been removed. From webhook-mailer at python.org Tue May 10 19:42:18 2022 From: webhook-mailer at python.org (vstinner) Date: Tue, 10 May 2022 23:42:18 -0000 Subject: [Python-checkins] gh-92584: test_decimal uses shutil.which() (#92640) Message-ID: https://github.com/python/cpython/commit/dfdebda0524ce4cc945621d69eef77a64f260095 commit: dfdebda0524ce4cc945621d69eef77a64f260095 branch: main author: Victor Stinner committer: vstinner date: 2022-05-11T01:42:09+02:00 summary: gh-92584: test_decimal uses shutil.which() (#92640) test_decimal now uses shutil.which() rather than deprecated distutils.spawn.find_executable(). files: M Modules/_decimal/tests/formathelper.py diff --git a/Modules/_decimal/tests/formathelper.py b/Modules/_decimal/tests/formathelper.py index c3daacfb7b44f..f4a6a1cebb702 100644 --- a/Modules/_decimal/tests/formathelper.py +++ b/Modules/_decimal/tests/formathelper.py @@ -32,7 +32,7 @@ import os, sys, locale, random import platform, subprocess from test.support.import_helper import import_fresh_module -from distutils.spawn import find_executable +from shutil import which C = import_fresh_module('decimal', fresh=['_decimal']) P = import_fresh_module('decimal', blocked=['_decimal']) @@ -139,7 +139,7 @@ with open("/var/lib/locales/supported.d/local") as f: locale_list = [loc.split()[0] for loc in f.readlines() \ if not loc.startswith('#')] - elif find_executable('locale'): + elif which('locale'): locale_list = subprocess.Popen(["locale", "-a"], stdout=subprocess.PIPE).communicate()[0] try: From webhook-mailer at python.org Wed May 11 00:14:34 2022 From: webhook-mailer at python.org (serhiy-storchaka) Date: Wed, 11 May 2022 04:14:34 -0000 Subject: [Python-checkins] Revert "gh-92550 - Fix regression in `pathlib.Path.rglob()` (GH-92583)" (GH-92598) Message-ID: https://github.com/python/cpython/commit/b1c4368824e5c2e4d4d5875f9c5f7a9c5a0d2ce2 commit: b1c4368824e5c2e4d4d5875f9c5f7a9c5a0d2ce2 branch: main author: Serhiy Storchaka committer: serhiy-storchaka date: 2022-05-11T07:14:25+03:00 summary: Revert "gh-92550 - Fix regression in `pathlib.Path.rglob()` (GH-92583)" (GH-92598) This reverts commit dcdf250d2de1428f7d8b4e9ecf51d2fd8200e21a. files: D Misc/NEWS.d/next/Library/2022-05-09-23-36-19.gh-issue-92550.qZ4AhU.rst M Doc/library/pathlib.rst M Doc/whatsnew/3.11.rst M Lib/pathlib.py M Lib/test/test_pathlib.py diff --git a/Doc/library/pathlib.rst b/Doc/library/pathlib.rst index 535b5abf8e3ff..d45e7aa84b28c 100644 --- a/Doc/library/pathlib.rst +++ b/Doc/library/pathlib.rst @@ -815,6 +815,9 @@ call fails (for example because the path doesn't exist). .. audit-event:: pathlib.Path.glob self,pattern pathlib.Path.glob + .. versionchanged:: 3.11 + Return only directories if *pattern* ends with a pathname components + separator (:data:`~os.sep` or :data:`~os.altsep`). .. method:: Path.group() @@ -1104,6 +1107,9 @@ call fails (for example because the path doesn't exist). .. audit-event:: pathlib.Path.rglob self,pattern pathlib.Path.rglob + .. versionchanged:: 3.11 + Return only directories if *pattern* ends with a pathname components + separator (:data:`~os.sep` or :data:`~os.altsep`). .. method:: Path.rmdir() diff --git a/Doc/whatsnew/3.11.rst b/Doc/whatsnew/3.11.rst index db5ede683a6c6..40e68e64e0429 100644 --- a/Doc/whatsnew/3.11.rst +++ b/Doc/whatsnew/3.11.rst @@ -559,6 +559,15 @@ os instead of ``CryptGenRandom()`` which is deprecated. (Contributed by Dong-hee Na in :issue:`44611`.) + +pathlib +------- + +* :meth:`~pathlib.Path.glob` and :meth:`~pathlib.Path.rglob` return only + directories if *pattern* ends with a pathname components separator: + :data:`~os.sep` or :data:`~os.altsep`. + (Contributed by Eisuke Kawasima in :issue:`22276` and :issue:`33392`.) + re -- diff --git a/Lib/pathlib.py b/Lib/pathlib.py index be3fd011795e5..67b744604c189 100644 --- a/Lib/pathlib.py +++ b/Lib/pathlib.py @@ -281,6 +281,8 @@ def make_uri(self, path): def _make_selector(pattern_parts, flavour): pat = pattern_parts[0] child_parts = pattern_parts[1:] + if not pat: + return _TerminatingSelector() if pat == '**': cls = _RecursiveWildcardSelector elif '**' in pat: @@ -943,6 +945,8 @@ def glob(self, pattern): drv, root, pattern_parts = self._flavour.parse_parts((pattern,)) if drv or root: raise NotImplementedError("Non-relative patterns are unsupported") + if pattern[-1] in (self._flavour.sep, self._flavour.altsep): + pattern_parts.append('') selector = _make_selector(tuple(pattern_parts), self._flavour) for p in selector.select_from(self): yield p @@ -956,6 +960,8 @@ def rglob(self, pattern): drv, root, pattern_parts = self._flavour.parse_parts((pattern,)) if drv or root: raise NotImplementedError("Non-relative patterns are unsupported") + if pattern[-1] in (self._flavour.sep, self._flavour.altsep): + pattern_parts.append('') selector = _make_selector(("**",) + tuple(pattern_parts), self._flavour) for p in selector.select_from(self): yield p diff --git a/Lib/test/test_pathlib.py b/Lib/test/test_pathlib.py index 3412d8431ab85..0d0c2f1eccb84 100644 --- a/Lib/test/test_pathlib.py +++ b/Lib/test/test_pathlib.py @@ -1662,6 +1662,11 @@ def _check(glob, expected): else: _check(p.glob("*/fileB"), ['dirB/fileB', 'linkB/fileB']) + if not os_helper.can_symlink(): + _check(p.glob("*/"), ["dirA", "dirB", "dirC", "dirE"]) + else: + _check(p.glob("*/"), ["dirA", "dirB", "dirC", "dirE", "linkB"]) + def test_rglob_common(self): def _check(glob, expected): self.assertEqual(set(glob), { P(BASE, q) for q in expected }) @@ -1679,6 +1684,16 @@ def _check(glob, expected): "linkB/fileB", "dirA/linkC/fileB"]) _check(p.rglob("file*"), ["fileA", "dirB/fileB", "dirC/fileC", "dirC/dirD/fileD"]) + if not os_helper.can_symlink(): + _check(p.rglob("*/"), [ + "dirA", "dirB", "dirC", "dirC/dirD", "dirE", + ]) + else: + _check(p.rglob("*/"), [ + "dirA", "dirA/linkC", "dirB", "dirB/linkD", "dirC", + "dirC/dirD", "dirE", "linkB", + ]) + p = P(BASE, "dirC") _check(p.rglob("file*"), ["dirC/fileC", "dirC/dirD/fileD"]) _check(p.rglob("*/*"), ["dirC/dirD/fileD"]) @@ -2682,6 +2697,7 @@ def test_glob(self): P = self.cls p = P(BASE) self.assertEqual(set(p.glob("FILEa")), { P(BASE, "fileA") }) + self.assertEqual(set(p.glob("*a\\")), { P(BASE, "dirA") }) self.assertEqual(set(p.glob("F*a")), { P(BASE, "fileA") }) self.assertEqual(set(map(str, p.glob("FILEa"))), {f"{p}\\FILEa"}) self.assertEqual(set(map(str, p.glob("F*a"))), {f"{p}\\fileA"}) @@ -2690,6 +2706,7 @@ def test_rglob(self): P = self.cls p = P(BASE, "dirC") self.assertEqual(set(p.rglob("FILEd")), { P(BASE, "dirC/dirD/fileD") }) + self.assertEqual(set(p.rglob("*\\")), { P(BASE, "dirC/dirD") }) self.assertEqual(set(map(str, p.rglob("FILEd"))), {f"{p}\\dirD\\FILEd"}) def test_expanduser(self): diff --git a/Misc/NEWS.d/next/Library/2022-05-09-23-36-19.gh-issue-92550.qZ4AhU.rst b/Misc/NEWS.d/next/Library/2022-05-09-23-36-19.gh-issue-92550.qZ4AhU.rst deleted file mode 100644 index 1931b329b3c6e..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-05-09-23-36-19.gh-issue-92550.qZ4AhU.rst +++ /dev/null @@ -1,2 +0,0 @@ -:meth:`pathlib.Path.rglob` raised :exc:`IndexError` when called with an -empty string. This regression was introduced in 3.11b1. From webhook-mailer at python.org Wed May 11 00:14:45 2022 From: webhook-mailer at python.org (serhiy-storchaka) Date: Wed, 11 May 2022 04:14:45 -0000 Subject: [Python-checkins] Revert "gh-92550 - Fix regression in `pathlib.Path.rglob()` (GH-92583)" (GH-92599) Message-ID: https://github.com/python/cpython/commit/5197134c1c392f3040a60c05f7bbb42c4bb24c46 commit: 5197134c1c392f3040a60c05f7bbb42c4bb24c46 branch: 3.11 author: Serhiy Storchaka committer: serhiy-storchaka date: 2022-05-11T07:14:40+03:00 summary: Revert "gh-92550 - Fix regression in `pathlib.Path.rglob()` (GH-92583)" (GH-92599) This reverts commit a51baec9ce0eae2b4db069a55daf8f03be3ab2f4. files: D Misc/NEWS.d/next/Library/2022-05-09-23-36-19.gh-issue-92550.qZ4AhU.rst M Doc/library/pathlib.rst M Doc/whatsnew/3.11.rst M Lib/pathlib.py M Lib/test/test_pathlib.py diff --git a/Doc/library/pathlib.rst b/Doc/library/pathlib.rst index 01e9cfb93e391..ab26e2f1719fe 100644 --- a/Doc/library/pathlib.rst +++ b/Doc/library/pathlib.rst @@ -815,6 +815,9 @@ call fails (for example because the path doesn't exist). .. audit-event:: pathlib.Path.glob self,pattern pathlib.Path.glob + .. versionchanged:: 3.11 + Return only directories if *pattern* ends with a pathname components + separator (:data:`~os.sep` or :data:`~os.altsep`). .. method:: Path.group() @@ -1104,6 +1107,9 @@ call fails (for example because the path doesn't exist). .. audit-event:: pathlib.Path.rglob self,pattern pathlib.Path.rglob + .. versionchanged:: 3.11 + Return only directories if *pattern* ends with a pathname components + separator (:data:`~os.sep` or :data:`~os.altsep`). .. method:: Path.rmdir() diff --git a/Doc/whatsnew/3.11.rst b/Doc/whatsnew/3.11.rst index db5ede683a6c6..40e68e64e0429 100644 --- a/Doc/whatsnew/3.11.rst +++ b/Doc/whatsnew/3.11.rst @@ -559,6 +559,15 @@ os instead of ``CryptGenRandom()`` which is deprecated. (Contributed by Dong-hee Na in :issue:`44611`.) + +pathlib +------- + +* :meth:`~pathlib.Path.glob` and :meth:`~pathlib.Path.rglob` return only + directories if *pattern* ends with a pathname components separator: + :data:`~os.sep` or :data:`~os.altsep`. + (Contributed by Eisuke Kawasima in :issue:`22276` and :issue:`33392`.) + re -- diff --git a/Lib/pathlib.py b/Lib/pathlib.py index 4763ab54f6ba8..1f098fe6bd5f3 100644 --- a/Lib/pathlib.py +++ b/Lib/pathlib.py @@ -281,6 +281,8 @@ def make_uri(self, path): def _make_selector(pattern_parts, flavour): pat = pattern_parts[0] child_parts = pattern_parts[1:] + if not pat: + return _TerminatingSelector() if pat == '**': cls = _RecursiveWildcardSelector elif '**' in pat: @@ -943,6 +945,8 @@ def glob(self, pattern): drv, root, pattern_parts = self._flavour.parse_parts((pattern,)) if drv or root: raise NotImplementedError("Non-relative patterns are unsupported") + if pattern[-1] in (self._flavour.sep, self._flavour.altsep): + pattern_parts.append('') selector = _make_selector(tuple(pattern_parts), self._flavour) for p in selector.select_from(self): yield p @@ -956,6 +960,8 @@ def rglob(self, pattern): drv, root, pattern_parts = self._flavour.parse_parts((pattern,)) if drv or root: raise NotImplementedError("Non-relative patterns are unsupported") + if pattern[-1] in (self._flavour.sep, self._flavour.altsep): + pattern_parts.append('') selector = _make_selector(("**",) + tuple(pattern_parts), self._flavour) for p in selector.select_from(self): yield p diff --git a/Lib/test/test_pathlib.py b/Lib/test/test_pathlib.py index b8b08bf0ce1bb..6737068c0ff6d 100644 --- a/Lib/test/test_pathlib.py +++ b/Lib/test/test_pathlib.py @@ -1662,6 +1662,11 @@ def _check(glob, expected): else: _check(p.glob("*/fileB"), ['dirB/fileB', 'linkB/fileB']) + if not os_helper.can_symlink(): + _check(p.glob("*/"), ["dirA", "dirB", "dirC", "dirE"]) + else: + _check(p.glob("*/"), ["dirA", "dirB", "dirC", "dirE", "linkB"]) + def test_rglob_common(self): def _check(glob, expected): self.assertEqual(set(glob), { P(BASE, q) for q in expected }) @@ -1679,6 +1684,16 @@ def _check(glob, expected): "linkB/fileB", "dirA/linkC/fileB"]) _check(p.rglob("file*"), ["fileA", "dirB/fileB", "dirC/fileC", "dirC/dirD/fileD"]) + if not os_helper.can_symlink(): + _check(p.rglob("*/"), [ + "dirA", "dirB", "dirC", "dirC/dirD", "dirE", + ]) + else: + _check(p.rglob("*/"), [ + "dirA", "dirA/linkC", "dirB", "dirB/linkD", "dirC", + "dirC/dirD", "dirE", "linkB", + ]) + p = P(BASE, "dirC") _check(p.rglob("file*"), ["dirC/fileC", "dirC/dirD/fileD"]) _check(p.rglob("*/*"), ["dirC/dirD/fileD"]) @@ -2704,6 +2719,7 @@ def test_glob(self): P = self.cls p = P(BASE) self.assertEqual(set(p.glob("FILEa")), { P(BASE, "fileA") }) + self.assertEqual(set(p.glob("*a\\")), { P(BASE, "dirA") }) self.assertEqual(set(p.glob("F*a")), { P(BASE, "fileA") }) self.assertEqual(set(map(str, p.glob("FILEa"))), {f"{p}\\FILEa"}) self.assertEqual(set(map(str, p.glob("F*a"))), {f"{p}\\fileA"}) @@ -2712,6 +2728,7 @@ def test_rglob(self): P = self.cls p = P(BASE, "dirC") self.assertEqual(set(p.rglob("FILEd")), { P(BASE, "dirC/dirD/fileD") }) + self.assertEqual(set(p.rglob("*\\")), { P(BASE, "dirC/dirD") }) self.assertEqual(set(map(str, p.rglob("FILEd"))), {f"{p}\\dirD\\FILEd"}) def test_expanduser(self): diff --git a/Misc/NEWS.d/next/Library/2022-05-09-23-36-19.gh-issue-92550.qZ4AhU.rst b/Misc/NEWS.d/next/Library/2022-05-09-23-36-19.gh-issue-92550.qZ4AhU.rst deleted file mode 100644 index 1931b329b3c6e..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-05-09-23-36-19.gh-issue-92550.qZ4AhU.rst +++ /dev/null @@ -1,2 +0,0 @@ -:meth:`pathlib.Path.rglob` raised :exc:`IndexError` when called with an -empty string. This regression was introduced in 3.11b1. From webhook-mailer at python.org Wed May 11 00:43:31 2022 From: webhook-mailer at python.org (serhiy-storchaka) Date: Wed, 11 May 2022 04:43:31 -0000 Subject: [Python-checkins] gh-92550: Fix pathlib.Path.rglob() for empty pattern (GH-92604) Message-ID: https://github.com/python/cpython/commit/87f849c775ca54f56ad60ebf96822b93bbd0029a commit: 87f849c775ca54f56ad60ebf96822b93bbd0029a branch: main author: Serhiy Storchaka committer: serhiy-storchaka date: 2022-05-11T07:43:04+03:00 summary: gh-92550: Fix pathlib.Path.rglob() for empty pattern (GH-92604) files: A Misc/NEWS.d/next/Library/2022-05-10-07-57-27.gh-issue-92550.Rk_UzM.rst M Lib/pathlib.py M Lib/test/test_pathlib.py diff --git a/Lib/pathlib.py b/Lib/pathlib.py index 67b744604c189..c608ba0954f32 100644 --- a/Lib/pathlib.py +++ b/Lib/pathlib.py @@ -960,7 +960,7 @@ def rglob(self, pattern): drv, root, pattern_parts = self._flavour.parse_parts((pattern,)) if drv or root: raise NotImplementedError("Non-relative patterns are unsupported") - if pattern[-1] in (self._flavour.sep, self._flavour.altsep): + if pattern and pattern[-1] in (self._flavour.sep, self._flavour.altsep): pattern_parts.append('') selector = _make_selector(("**",) + tuple(pattern_parts), self._flavour) for p in selector.select_from(self): diff --git a/Lib/test/test_pathlib.py b/Lib/test/test_pathlib.py index 0d0c2f1eccb84..964cc85d53153 100644 --- a/Lib/test/test_pathlib.py +++ b/Lib/test/test_pathlib.py @@ -1693,10 +1693,15 @@ def _check(glob, expected): "dirA", "dirA/linkC", "dirB", "dirB/linkD", "dirC", "dirC/dirD", "dirE", "linkB", ]) + _check(p.rglob(""), ["", "dirA", "dirB", "dirC", "dirE", "dirC/dirD"]) p = P(BASE, "dirC") + _check(p.rglob("*"), ["dirC/fileC", "dirC/novel.txt", + "dirC/dirD", "dirC/dirD/fileD"]) _check(p.rglob("file*"), ["dirC/fileC", "dirC/dirD/fileD"]) _check(p.rglob("*/*"), ["dirC/dirD/fileD"]) + _check(p.rglob("*/"), ["dirC/dirD"]) + _check(p.rglob(""), ["dirC", "dirC/dirD"]) # gh-91616, a re module regression _check(p.rglob("*.txt"), ["dirC/novel.txt"]) _check(p.rglob("*.*"), ["dirC/novel.txt"]) diff --git a/Misc/NEWS.d/next/Library/2022-05-10-07-57-27.gh-issue-92550.Rk_UzM.rst b/Misc/NEWS.d/next/Library/2022-05-10-07-57-27.gh-issue-92550.Rk_UzM.rst new file mode 100644 index 0000000000000..1f0fde31108a7 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-05-10-07-57-27.gh-issue-92550.Rk_UzM.rst @@ -0,0 +1 @@ +Fix :meth:`pathlib.Path.rglob` for empty pattern. From webhook-mailer at python.org Wed May 11 00:45:21 2022 From: webhook-mailer at python.org (rhettinger) Date: Wed, 11 May 2022 04:45:21 -0000 Subject: [Python-checkins] Fix inconsistent return type for statistics median_grouped() gh-92531 (GH-92533) (#92656) Message-ID: https://github.com/python/cpython/commit/951cfc8e542a54a479b6f01bddcb46e764be7cda commit: 951cfc8e542a54a479b6f01bddcb46e764be7cda branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: rhettinger date: 2022-05-10T23:45:17-05:00 summary: Fix inconsistent return type for statistics median_grouped() gh-92531 (GH-92533) (#92656) files: A Misc/NEWS.d/next/Library/2022-05-09-01-27-25.gh-issue-92531.vV7S_O.rst M Lib/statistics.py M Lib/test/test_statistics.py diff --git a/Lib/statistics.py b/Lib/statistics.py index 54f4e13265189..2d66b0522f19d 100644 --- a/Lib/statistics.py +++ b/Lib/statistics.py @@ -611,7 +611,7 @@ def median_high(data): return data[n // 2] -def median_grouped(data, interval=1): +def median_grouped(data, interval=1.0): """Estimates the median for numeric data binned around the midpoints of consecutive, fixed-width intervals. @@ -650,35 +650,34 @@ def median_grouped(data, interval=1): by exact multiples of *interval*. This is essential for getting a correct result. The function does not check this precondition. + Inputs may be any numeric type that can be coerced to a float during + the interpolation step. + """ data = sorted(data) n = len(data) - if n == 0: + if not n: raise StatisticsError("no median for empty data") - elif n == 1: - return data[0] # Find the value at the midpoint. Remember this corresponds to the # midpoint of the class interval. x = data[n // 2] - # Generate a clear error message for non-numeric data - for obj in (x, interval): - if isinstance(obj, (str, bytes)): - raise TypeError(f'expected a number but got {obj!r}') - # Using O(log n) bisection, find where all the x values occur in the data. # All x will lie within data[i:j]. i = bisect_left(data, x) j = bisect_right(data, x, lo=i) + # Coerce to floats, raising a TypeError if not possible + try: + interval = float(interval) + x = float(x) + except ValueError: + raise TypeError(f'Value cannot be converted to a float') + # Interpolate the median using the formula found at: # https://www.cuemath.com/data/median-of-grouped-data/ - try: - L = x - interval / 2 # The lower limit of the median interval. - except TypeError: - # Coerce mixed types to float. - L = float(x) - float(interval) / 2 + L = x - interval / 2.0 # Lower limit of the median interval cf = i # Cumulative frequency of the preceding interval f = j - i # Number of elements in the median internal return L + interval * (n / 2 - cf) / f diff --git a/Lib/test/test_statistics.py b/Lib/test/test_statistics.py index ed6021d60bde7..6de98241c294d 100644 --- a/Lib/test/test_statistics.py +++ b/Lib/test/test_statistics.py @@ -1742,6 +1742,12 @@ def test_repeated_single_value(self): data = [x]*count self.assertEqual(self.func(data), float(x)) + def test_single_value(self): + # Override method from AverageMixin. + # Average of a single value is the value as a float. + for x in (23, 42.5, 1.3e15, Fraction(15, 19), Decimal('0.28')): + self.assertEqual(self.func([x]), float(x)) + def test_odd_fractions(self): # Test median_grouped works with an odd number of Fractions. F = Fraction diff --git a/Misc/NEWS.d/next/Library/2022-05-09-01-27-25.gh-issue-92531.vV7S_O.rst b/Misc/NEWS.d/next/Library/2022-05-09-01-27-25.gh-issue-92531.vV7S_O.rst new file mode 100644 index 0000000000000..574fa6c4d9799 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-05-09-01-27-25.gh-issue-92531.vV7S_O.rst @@ -0,0 +1,3 @@ +The statistics.median_grouped() function now always return a float. +Formerly, it did not convert the input type when for sequences of length +one. From webhook-mailer at python.org Wed May 11 01:13:20 2022 From: webhook-mailer at python.org (miss-islington) Date: Wed, 11 May 2022 05:13:20 -0000 Subject: [Python-checkins] gh-92550: Fix pathlib.Path.rglob() for empty pattern (GH-92604) Message-ID: https://github.com/python/cpython/commit/5135b6ed73bb1182c4add655e5c1951567f50ad5 commit: 5135b6ed73bb1182c4add655e5c1951567f50ad5 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-10T22:13:11-07:00 summary: gh-92550: Fix pathlib.Path.rglob() for empty pattern (GH-92604) (cherry picked from commit 87f849c775ca54f56ad60ebf96822b93bbd0029a) Co-authored-by: Serhiy Storchaka files: A Misc/NEWS.d/next/Library/2022-05-10-07-57-27.gh-issue-92550.Rk_UzM.rst M Lib/pathlib.py M Lib/test/test_pathlib.py diff --git a/Lib/pathlib.py b/Lib/pathlib.py index 1f098fe6bd5f3..8c1fe30d74b65 100644 --- a/Lib/pathlib.py +++ b/Lib/pathlib.py @@ -960,7 +960,7 @@ def rglob(self, pattern): drv, root, pattern_parts = self._flavour.parse_parts((pattern,)) if drv or root: raise NotImplementedError("Non-relative patterns are unsupported") - if pattern[-1] in (self._flavour.sep, self._flavour.altsep): + if pattern and pattern[-1] in (self._flavour.sep, self._flavour.altsep): pattern_parts.append('') selector = _make_selector(("**",) + tuple(pattern_parts), self._flavour) for p in selector.select_from(self): diff --git a/Lib/test/test_pathlib.py b/Lib/test/test_pathlib.py index 6737068c0ff6d..a64bf68e8593d 100644 --- a/Lib/test/test_pathlib.py +++ b/Lib/test/test_pathlib.py @@ -1693,10 +1693,15 @@ def _check(glob, expected): "dirA", "dirA/linkC", "dirB", "dirB/linkD", "dirC", "dirC/dirD", "dirE", "linkB", ]) + _check(p.rglob(""), ["", "dirA", "dirB", "dirC", "dirE", "dirC/dirD"]) p = P(BASE, "dirC") + _check(p.rglob("*"), ["dirC/fileC", "dirC/novel.txt", + "dirC/dirD", "dirC/dirD/fileD"]) _check(p.rglob("file*"), ["dirC/fileC", "dirC/dirD/fileD"]) _check(p.rglob("*/*"), ["dirC/dirD/fileD"]) + _check(p.rglob("*/"), ["dirC/dirD"]) + _check(p.rglob(""), ["dirC", "dirC/dirD"]) # gh-91616, a re module regression _check(p.rglob("*.txt"), ["dirC/novel.txt"]) _check(p.rglob("*.*"), ["dirC/novel.txt"]) diff --git a/Misc/NEWS.d/next/Library/2022-05-10-07-57-27.gh-issue-92550.Rk_UzM.rst b/Misc/NEWS.d/next/Library/2022-05-10-07-57-27.gh-issue-92550.Rk_UzM.rst new file mode 100644 index 0000000000000..1f0fde31108a7 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-05-10-07-57-27.gh-issue-92550.Rk_UzM.rst @@ -0,0 +1 @@ +Fix :meth:`pathlib.Path.rglob` for empty pattern. From webhook-mailer at python.org Wed May 11 02:09:45 2022 From: webhook-mailer at python.org (corona10) Date: Wed, 11 May 2022 06:09:45 -0000 Subject: [Python-checkins] gh-92632: Make function starunpack_helper run faster when encounters starred argument. (GH-92655) Message-ID: https://github.com/python/cpython/commit/dc091204f92a72cc7f9ad3af2055b88dcd538161 commit: dc091204f92a72cc7f9ad3af2055b88dcd538161 branch: main author: zikcheng committer: corona10 date: 2022-05-11T15:09:40+09:00 summary: gh-92632: Make function starunpack_helper run faster when encounters starred argument. (GH-92655) files: M Python/compile.c diff --git a/Python/compile.c b/Python/compile.c index 45944ae85e383..51ef8fd17a106 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -4375,6 +4375,7 @@ starunpack_helper(struct compiler *c, asdl_expr_seq *elts, int pushed, expr_ty elt = asdl_seq_GET(elts, i); if (elt->kind == Starred_kind) { seen_star = 1; + break; } } if (!seen_star && !big) { From webhook-mailer at python.org Wed May 11 02:14:16 2022 From: webhook-mailer at python.org (serhiy-storchaka) Date: Wed, 11 May 2022 06:14:16 -0000 Subject: [Python-checkins] Fix typo in unittest.rst: addCleanupModule -> addModuleCleanup (GH-92631) Message-ID: https://github.com/python/cpython/commit/38486ca212c0827d54e7b0d0b1e2c1ccc2bdad33 commit: 38486ca212c0827d54e7b0d0b1e2c1ccc2bdad33 branch: main author: Mikhail Terekhov committer: serhiy-storchaka date: 2022-05-11T09:14:12+03:00 summary: Fix typo in unittest.rst: addCleanupModule -> addModuleCleanup (GH-92631) files: M Doc/library/unittest.rst diff --git a/Doc/library/unittest.rst b/Doc/library/unittest.rst index f6bcba06d90ee..e07a32b88b1c3 100644 --- a/Doc/library/unittest.rst +++ b/Doc/library/unittest.rst @@ -2512,7 +2512,7 @@ To add cleanup code that must be run even in the case of an exception, use after :func:`setUpModule` if :func:`setUpModule` raises an exception. It is responsible for calling all the cleanup functions added by - :func:`addCleanupModule`. If you need cleanup functions to be called + :func:`addModuleCleanup`. If you need cleanup functions to be called *prior* to :func:`tearDownModule` then you can call :func:`doModuleCleanups` yourself. From webhook-mailer at python.org Wed May 11 02:18:52 2022 From: webhook-mailer at python.org (serhiy-storchaka) Date: Wed, 11 May 2022 06:18:52 -0000 Subject: [Python-checkins] gh-89336: Fix configparser.RawConfigParser.readfp typo (GH-92636) Message-ID: https://github.com/python/cpython/commit/75e463430efcb5b20efa93f9a5d98ccd03d83a3d commit: 75e463430efcb5b20efa93f9a5d98ccd03d83a3d branch: main author: Hugo van Kemenade committer: serhiy-storchaka date: 2022-05-11T09:18:45+03:00 summary: gh-89336: Fix configparser.RawConfigParser.readfp typo (GH-92636) files: M Doc/whatsnew/3.11.rst diff --git a/Doc/whatsnew/3.11.rst b/Doc/whatsnew/3.11.rst index 40e68e64e0429..6518eea4c7ba5 100644 --- a/Doc/whatsnew/3.11.rst +++ b/Doc/whatsnew/3.11.rst @@ -1170,7 +1170,7 @@ Deprecated * the :class:`configparser.SafeConfigParser` class * the :attr:`configparser.ParsingError.filename` property - * the :meth:`configparser.ParsingError.readfp` method + * the :meth:`configparser.RawConfigParser.readfp` method (Contributed by Hugo van Kemenade in :issue:`45173`.) From webhook-mailer at python.org Wed May 11 02:31:41 2022 From: webhook-mailer at python.org (serhiy-storchaka) Date: Wed, 11 May 2022 06:31:41 -0000 Subject: [Python-checkins] gh-91810: ElementTree: Use text file's encoding by default in XML declaration (GH-91903) Message-ID: https://github.com/python/cpython/commit/707839b0fe02ba2c891a40f40e7a869d84c2c9c5 commit: 707839b0fe02ba2c891a40f40e7a869d84c2c9c5 branch: main author: Serhiy Storchaka committer: serhiy-storchaka date: 2022-05-11T09:31:07+03:00 summary: gh-91810: ElementTree: Use text file's encoding by default in XML declaration (GH-91903) ElementTree method write() and function tostring() now use the text file's encoding ("UTF-8" if not available) instead of locale encoding in XML declaration when encoding="unicode" is specified. files: A Misc/NEWS.d/next/Library/2022-04-25-10-23-01.gh-issue-91810.DOHa6B.rst M Lib/test/test_xml_etree.py M Lib/xml/etree/ElementTree.py diff --git a/Lib/test/test_xml_etree.py b/Lib/test/test_xml_etree.py index db25eaba1278f..aea77b192c100 100644 --- a/Lib/test/test_xml_etree.py +++ b/Lib/test/test_xml_etree.py @@ -10,7 +10,6 @@ import html import io import itertools -import locale import operator import os import pickle @@ -978,15 +977,13 @@ def test_tostring_xml_declaration(self): def test_tostring_xml_declaration_unicode_encoding(self): elem = ET.XML('') - preferredencoding = locale.getpreferredencoding() self.assertEqual( - f"\n", - ET.tostring(elem, encoding='unicode', xml_declaration=True) + ET.tostring(elem, encoding='unicode', xml_declaration=True), + "\n" ) def test_tostring_xml_declaration_cases(self): elem = ET.XML('?') - preferredencoding = locale.getpreferredencoding() TESTCASES = [ # (expected_retval, encoding, xml_declaration) # ... xml_declaration = None @@ -1013,7 +1010,7 @@ def test_tostring_xml_declaration_cases(self): b"ø", 'US-ASCII', True), (b"\n" b"\xf8", 'ISO-8859-1', True), - (f"\n" + ("\n" "?", 'unicode', True), ] @@ -1051,11 +1048,10 @@ def test_tostringlist_xml_declaration(self): b"\n" ) - preferredencoding = locale.getpreferredencoding() stringlist = ET.tostringlist(elem, encoding='unicode', xml_declaration=True) self.assertEqual( ''.join(stringlist), - f"\n" + "\n" ) self.assertRegex(stringlist[0], r"^<\?xml version='1.0' encoding='.+'?>") self.assertEqual(['', '', ''], stringlist[1:]) @@ -3740,17 +3736,16 @@ def test_write_to_filename_as_unicode(self): encoding = f.encoding os_helper.unlink(TESTFN) - try: - '\xf8'.encode(encoding) - except UnicodeEncodeError: - self.skipTest(f'default file encoding {encoding} not supported') - tree = ET.ElementTree(ET.XML('''\xf8''')) tree.write(TESTFN, encoding='unicode') with open(TESTFN, 'rb') as f: data = f.read() expected = "\xf8".encode(encoding, 'xmlcharrefreplace') - self.assertEqual(data, expected) + if encoding.lower() in ('utf-8', 'ascii'): + self.assertEqual(data, expected) + else: + self.assertIn(b"ø''') + self.assertEqual(f.read(), convlinesep( + b'''\n''' + b'''ø''')) with open(TESTFN, 'w', encoding='ISO-8859-1') as f: tree.write(f, encoding='unicode') self.assertFalse(f.closed) with open(TESTFN, 'rb') as f: - self.assertEqual(f.read(), b'''\xf8''') + self.assertEqual(f.read(), convlinesep( + b'''\n''' + b'''\xf8''')) def test_write_to_binary_file(self): self.addCleanup(os_helper.unlink, TESTFN) diff --git a/Lib/xml/etree/ElementTree.py b/Lib/xml/etree/ElementTree.py index 5249c7ab82b84..a5cc65e789c00 100644 --- a/Lib/xml/etree/ElementTree.py +++ b/Lib/xml/etree/ElementTree.py @@ -728,16 +728,10 @@ def write(self, file_or_filename, encoding = "utf-8" else: encoding = "us-ascii" - enc_lower = encoding.lower() - with _get_writer(file_or_filename, enc_lower) as write: + with _get_writer(file_or_filename, encoding) as (write, declared_encoding): if method == "xml" and (xml_declaration or (xml_declaration is None and - enc_lower not in ("utf-8", "us-ascii", "unicode"))): - declared_encoding = encoding - if enc_lower == "unicode": - # Retrieve the default encoding for the xml declaration - import locale - declared_encoding = locale.getpreferredencoding() + declared_encoding.lower() not in ("utf-8", "us-ascii"))): write("\n" % ( declared_encoding,)) if method == "text": @@ -762,19 +756,20 @@ def _get_writer(file_or_filename, encoding): write = file_or_filename.write except AttributeError: # file_or_filename is a file name - if encoding == "unicode": - file = open(file_or_filename, "w") + if encoding.lower() == "unicode": + file = open(file_or_filename, "w", + errors="xmlcharrefreplace") else: file = open(file_or_filename, "w", encoding=encoding, errors="xmlcharrefreplace") with file: - yield file.write + yield file.write, file.encoding else: # file_or_filename is a file-like object # encoding determines if it is a text or binary writer - if encoding == "unicode": + if encoding.lower() == "unicode": # use a text writer as is - yield write + yield write, getattr(file_or_filename, "encoding", None) or "utf-8" else: # wrap a binary writer with TextIOWrapper with contextlib.ExitStack() as stack: @@ -805,7 +800,7 @@ def _get_writer(file_or_filename, encoding): # Keep the original file open when the TextIOWrapper is # destroyed stack.callback(file.detach) - yield file.write + yield file.write, encoding def _namespaces(elem, default_namespace=None): # identify namespaces used in this tree diff --git a/Misc/NEWS.d/next/Library/2022-04-25-10-23-01.gh-issue-91810.DOHa6B.rst b/Misc/NEWS.d/next/Library/2022-04-25-10-23-01.gh-issue-91810.DOHa6B.rst new file mode 100644 index 0000000000000..0711f8466b818 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-04-25-10-23-01.gh-issue-91810.DOHa6B.rst @@ -0,0 +1,5 @@ +:class:`~xml.etree.ElementTree.ElementTree` method +:meth:`~xml.etree.ElementTree.ElementTree.write` and function +:func:`~xml.etree.ElementTree.tostring` now use the text file's encoding +("UTF-8" if not available) instead of locale encoding in XML declaration +when ``encoding="unicode"`` is specified. From webhook-mailer at python.org Wed May 11 03:06:35 2022 From: webhook-mailer at python.org (rhettinger) Date: Wed, 11 May 2022 07:06:35 -0000 Subject: [Python-checkins] gh-91966 Document where key functions are applied in the bisect module (GH-92602) (#92667) Message-ID: https://github.com/python/cpython/commit/b162f0875d1738871983826a84adb5ab51929468 commit: b162f0875d1738871983826a84adb5ab51929468 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: rhettinger date: 2022-05-11T02:06:10-05:00 summary: gh-91966 Document where key functions are applied in the bisect module (GH-92602) (#92667) files: M Doc/library/bisect.rst diff --git a/Doc/library/bisect.rst b/Doc/library/bisect.rst index edcd4aeb24aa7..901a41f549202 100644 --- a/Doc/library/bisect.rst +++ b/Doc/library/bisect.rst @@ -35,8 +35,11 @@ The following functions are provided: ``all(val >= x for val in a[i : hi])`` for the right side. *key* specifies a :term:`key function` of one argument that is used to - extract a comparison key from each input element. The default value is - ``None`` (compare the elements directly). + extract a comparison key from each element in the array. To support + searching complex records, the key function is not applied to the *x* value. + + If *key* is ``None``, the elements are compared directly with no + intervening function call. .. versionchanged:: 3.10 Added the *key* parameter. @@ -53,8 +56,11 @@ The following functions are provided: ``all(val > x for val in a[i : hi])`` for the right side. *key* specifies a :term:`key function` of one argument that is used to - extract a comparison key from each input element. The default value is - ``None`` (compare the elements directly). + extract a comparison key from each element in the array. To support + searching complex records, the key function is not applied to the *x* value. + + If *key* is ``None``, the elements are compared directly with no + intervening function call. .. versionchanged:: 3.10 Added the *key* parameter. @@ -64,14 +70,13 @@ The following functions are provided: Insert *x* in *a* in sorted order. - *key* specifies a :term:`key function` of one argument that is used to - extract a comparison key from each input element. The default value is - ``None`` (compare the elements directly). - This function first runs :func:`bisect_left` to locate an insertion point. Next, it runs the :meth:`insert` method on *a* to insert *x* at the appropriate position to maintain sort order. + To support inserting records in a table, the *key* function (if any) is + applied to *x* for the search step but not for the insertion step. + Keep in mind that the ``O(log n)`` search is dominated by the slow O(n) insertion step. @@ -85,14 +90,13 @@ The following functions are provided: Similar to :func:`insort_left`, but inserting *x* in *a* after any existing entries of *x*. - *key* specifies a :term:`key function` of one argument that is used to - extract a comparison key from each input element. The default value is - ``None`` (compare the elements directly). - This function first runs :func:`bisect_right` to locate an insertion point. Next, it runs the :meth:`insert` method on *a* to insert *x* at the appropriate position to maintain sort order. + To support inserting records in a table, the *key* function (if any) is + applied to *x* for the search step but not for the insertion step. + Keep in mind that the ``O(log n)`` search is dominated by the slow O(n) insertion step. @@ -194,8 +198,42 @@ a 'B', and so on:: >>> [grade(score) for score in [33, 99, 77, 70, 89, 90, 100]] ['F', 'A', 'C', 'C', 'B', 'A', 'A'] -One technique to avoid repeated calls to a key function is to search a list of -precomputed keys to find the index of a record:: +The :func:`bisect`function and :func:`insort` functions also work with lists of +tuples. The *key* argument can serve to extract the field used for ordering +records in a table:: + + >>> from collections import namedtuple + >>> from operator import attrgetter + >>> from bisect import bisect, insort + >>> from pprint import pprint + + >>> Movie = namedtuple('Movie', ('name', 'released', 'director')) + + >>> movies = [ + ... Movie('Jaws', 1975, 'Speilberg'), + ... Movie('Titanic', 1997, 'Cameron'), + ... Movie('The Birds', 1963, 'Hitchcock'), + ... Movie('Aliens', 1986, 'Scott') + ... ] + + >>> # Find the first movie released on or after 1960 + >>> by_year = attrgetter('released') + >>> movies.sort(key=by_year) + >>> movies[bisect(movies, 1960, key=by_year)] + Movie(name='The Birds', released=1963, director='Hitchcock') + + >>> # Insert a movie while maintaining sort order + >>> romance = Movie('Love Story', 1970, 'Hiller') + >>> insort(movies, romance, key=by_year) + >>> pprint(movies) + [Movie(name='The Birds', released=1963, director='Hitchcock'), + Movie(name='Love Story', released=1970, director='Hiller'), + Movie(name='Jaws', released=1975, director='Speilberg'), + Movie(name='Aliens', released=1986, director='Scott'), + Movie(name='Titanic', released=1997, director='Cameron')] + +If the key function is expensive, it is possible to avoid repeated function +calls by searching a list of precomputed keys to find the index of a record:: >>> data = [('red', 5), ('blue', 1), ('yellow', 8), ('black', 0)] >>> data.sort(key=lambda r: r[1]) # Or use operator.itemgetter(1). @@ -208,4 +246,3 @@ precomputed keys to find the index of a record:: ('red', 5) >>> data[bisect_left(keys, 8)] ('yellow', 8) - From webhook-mailer at python.org Wed May 11 03:06:47 2022 From: webhook-mailer at python.org (rhettinger) Date: Wed, 11 May 2022 07:06:47 -0000 Subject: [Python-checkins] gh-91966 Document where key functions are applied in the bisect module (GH-92602) (#92666) Message-ID: https://github.com/python/cpython/commit/d435ebd39ef2167517c02ca6c553864a9c783a0d commit: d435ebd39ef2167517c02ca6c553864a9c783a0d branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: rhettinger date: 2022-05-11T02:06:42-05:00 summary: gh-91966 Document where key functions are applied in the bisect module (GH-92602) (#92666) files: M Doc/library/bisect.rst diff --git a/Doc/library/bisect.rst b/Doc/library/bisect.rst index edcd4aeb24aa7..901a41f549202 100644 --- a/Doc/library/bisect.rst +++ b/Doc/library/bisect.rst @@ -35,8 +35,11 @@ The following functions are provided: ``all(val >= x for val in a[i : hi])`` for the right side. *key* specifies a :term:`key function` of one argument that is used to - extract a comparison key from each input element. The default value is - ``None`` (compare the elements directly). + extract a comparison key from each element in the array. To support + searching complex records, the key function is not applied to the *x* value. + + If *key* is ``None``, the elements are compared directly with no + intervening function call. .. versionchanged:: 3.10 Added the *key* parameter. @@ -53,8 +56,11 @@ The following functions are provided: ``all(val > x for val in a[i : hi])`` for the right side. *key* specifies a :term:`key function` of one argument that is used to - extract a comparison key from each input element. The default value is - ``None`` (compare the elements directly). + extract a comparison key from each element in the array. To support + searching complex records, the key function is not applied to the *x* value. + + If *key* is ``None``, the elements are compared directly with no + intervening function call. .. versionchanged:: 3.10 Added the *key* parameter. @@ -64,14 +70,13 @@ The following functions are provided: Insert *x* in *a* in sorted order. - *key* specifies a :term:`key function` of one argument that is used to - extract a comparison key from each input element. The default value is - ``None`` (compare the elements directly). - This function first runs :func:`bisect_left` to locate an insertion point. Next, it runs the :meth:`insert` method on *a* to insert *x* at the appropriate position to maintain sort order. + To support inserting records in a table, the *key* function (if any) is + applied to *x* for the search step but not for the insertion step. + Keep in mind that the ``O(log n)`` search is dominated by the slow O(n) insertion step. @@ -85,14 +90,13 @@ The following functions are provided: Similar to :func:`insort_left`, but inserting *x* in *a* after any existing entries of *x*. - *key* specifies a :term:`key function` of one argument that is used to - extract a comparison key from each input element. The default value is - ``None`` (compare the elements directly). - This function first runs :func:`bisect_right` to locate an insertion point. Next, it runs the :meth:`insert` method on *a* to insert *x* at the appropriate position to maintain sort order. + To support inserting records in a table, the *key* function (if any) is + applied to *x* for the search step but not for the insertion step. + Keep in mind that the ``O(log n)`` search is dominated by the slow O(n) insertion step. @@ -194,8 +198,42 @@ a 'B', and so on:: >>> [grade(score) for score in [33, 99, 77, 70, 89, 90, 100]] ['F', 'A', 'C', 'C', 'B', 'A', 'A'] -One technique to avoid repeated calls to a key function is to search a list of -precomputed keys to find the index of a record:: +The :func:`bisect`function and :func:`insort` functions also work with lists of +tuples. The *key* argument can serve to extract the field used for ordering +records in a table:: + + >>> from collections import namedtuple + >>> from operator import attrgetter + >>> from bisect import bisect, insort + >>> from pprint import pprint + + >>> Movie = namedtuple('Movie', ('name', 'released', 'director')) + + >>> movies = [ + ... Movie('Jaws', 1975, 'Speilberg'), + ... Movie('Titanic', 1997, 'Cameron'), + ... Movie('The Birds', 1963, 'Hitchcock'), + ... Movie('Aliens', 1986, 'Scott') + ... ] + + >>> # Find the first movie released on or after 1960 + >>> by_year = attrgetter('released') + >>> movies.sort(key=by_year) + >>> movies[bisect(movies, 1960, key=by_year)] + Movie(name='The Birds', released=1963, director='Hitchcock') + + >>> # Insert a movie while maintaining sort order + >>> romance = Movie('Love Story', 1970, 'Hiller') + >>> insort(movies, romance, key=by_year) + >>> pprint(movies) + [Movie(name='The Birds', released=1963, director='Hitchcock'), + Movie(name='Love Story', released=1970, director='Hiller'), + Movie(name='Jaws', released=1975, director='Speilberg'), + Movie(name='Aliens', released=1986, director='Scott'), + Movie(name='Titanic', released=1997, director='Cameron')] + +If the key function is expensive, it is possible to avoid repeated function +calls by searching a list of precomputed keys to find the index of a record:: >>> data = [('red', 5), ('blue', 1), ('yellow', 8), ('black', 0)] >>> data.sort(key=lambda r: r[1]) # Or use operator.itemgetter(1). @@ -208,4 +246,3 @@ precomputed keys to find the index of a record:: ('red', 5) >>> data[bisect_left(keys, 8)] ('yellow', 8) - From webhook-mailer at python.org Wed May 11 03:36:57 2022 From: webhook-mailer at python.org (miss-islington) Date: Wed, 11 May 2022 07:36:57 -0000 Subject: [Python-checkins] Update numbers.rst (GH-31995) Message-ID: https://github.com/python/cpython/commit/a9b5bc3274537a1074a12ce32c36a3ff3b530763 commit: a9b5bc3274537a1074a12ce32c36a3ff3b530763 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-11T00:36:24-07:00 summary: Update numbers.rst (GH-31995) (cherry picked from commit dde8a1668e0a6ad09634d0c701742c91da616497) Co-authored-by: G?ry Ogam files: M Doc/library/numbers.rst diff --git a/Doc/library/numbers.rst b/Doc/library/numbers.rst index b77845ed0dee9..b12f82ed75a6f 100644 --- a/Doc/library/numbers.rst +++ b/Doc/library/numbers.rst @@ -202,9 +202,9 @@ forward and reverse instances of any given operator. For example, if isinstance(a, Rational): # Includes ints. return monomorphic_operator(a, b) - elif isinstance(a, numbers.Real): + elif isinstance(a, Real): return fallback_operator(float(a), float(b)) - elif isinstance(a, numbers.Complex): + elif isinstance(a, Complex): return fallback_operator(complex(a), complex(b)) else: return NotImplemented From webhook-mailer at python.org Wed May 11 06:50:30 2022 From: webhook-mailer at python.org (miss-islington) Date: Wed, 11 May 2022 10:50:30 -0000 Subject: [Python-checkins] [3.10] Fix typo in unittest.rst: addCleanupModule -> addModuleCleanup (GH-92631) (GH-92660) Message-ID: https://github.com/python/cpython/commit/7a84ea4ec16371fd2785b48cbe305da70a9dc7fc commit: 7a84ea4ec16371fd2785b48cbe305da70a9dc7fc branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-11T03:50:00-07:00 summary: [3.10] Fix typo in unittest.rst: addCleanupModule -> addModuleCleanup (GH-92631) (GH-92660) (cherry picked from commit 38486ca212c0827d54e7b0d0b1e2c1ccc2bdad33) Co-authored-by: Mikhail Terekhov Automerge-Triggered-By: GH:serhiy-storchaka files: M Doc/library/unittest.rst diff --git a/Doc/library/unittest.rst b/Doc/library/unittest.rst index ae0c7d59964f1..67fec60263a4c 100644 --- a/Doc/library/unittest.rst +++ b/Doc/library/unittest.rst @@ -2439,7 +2439,7 @@ To add cleanup code that must be run even in the case of an exception, use after :func:`setUpModule` if :func:`setUpModule` raises an exception. It is responsible for calling all the cleanup functions added by - :func:`addCleanupModule`. If you need cleanup functions to be called + :func:`addModuleCleanup`. If you need cleanup functions to be called *prior* to :func:`tearDownModule` then you can call :func:`doModuleCleanups` yourself. From webhook-mailer at python.org Wed May 11 06:50:30 2022 From: webhook-mailer at python.org (miss-islington) Date: Wed, 11 May 2022 10:50:30 -0000 Subject: [Python-checkins] [3.9] Fix typo in unittest.rst: addCleanupModule -> addModuleCleanup (GH-92631) (GH-92661) Message-ID: https://github.com/python/cpython/commit/3f2113dd08a31bebdd9c9d697104dd592aefed71 commit: 3f2113dd08a31bebdd9c9d697104dd592aefed71 branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-11T03:50:00-07:00 summary: [3.9] Fix typo in unittest.rst: addCleanupModule -> addModuleCleanup (GH-92631) (GH-92661) (cherry picked from commit 38486ca212c0827d54e7b0d0b1e2c1ccc2bdad33) Co-authored-by: Mikhail Terekhov Automerge-Triggered-By: GH:serhiy-storchaka files: M Doc/library/unittest.rst diff --git a/Doc/library/unittest.rst b/Doc/library/unittest.rst index 90807579266a0..a000428c8be96 100644 --- a/Doc/library/unittest.rst +++ b/Doc/library/unittest.rst @@ -2418,7 +2418,7 @@ To add cleanup code that must be run even in the case of an exception, use after :func:`setUpModule` if :func:`setUpModule` raises an exception. It is responsible for calling all the cleanup functions added by - :func:`addCleanupModule`. If you need cleanup functions to be called + :func:`addModuleCleanup`. If you need cleanup functions to be called *prior* to :func:`tearDownModule` then you can call :func:`doModuleCleanups` yourself. From webhook-mailer at python.org Wed May 11 06:50:30 2022 From: webhook-mailer at python.org (miss-islington) Date: Wed, 11 May 2022 10:50:30 -0000 Subject: [Python-checkins] [3.11] Fix typo in unittest.rst: addCleanupModule -> addModuleCleanup (GH-92631) (GH-92659) Message-ID: https://github.com/python/cpython/commit/5ea8a93e1a35bf08153b5d02e9a332cd9b531241 commit: 5ea8a93e1a35bf08153b5d02e9a332cd9b531241 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-11T03:49:59-07:00 summary: [3.11] Fix typo in unittest.rst: addCleanupModule -> addModuleCleanup (GH-92631) (GH-92659) (cherry picked from commit 38486ca212c0827d54e7b0d0b1e2c1ccc2bdad33) Co-authored-by: Mikhail Terekhov Automerge-Triggered-By: GH:serhiy-storchaka files: M Doc/library/unittest.rst diff --git a/Doc/library/unittest.rst b/Doc/library/unittest.rst index f6bcba06d90ee..e07a32b88b1c3 100644 --- a/Doc/library/unittest.rst +++ b/Doc/library/unittest.rst @@ -2512,7 +2512,7 @@ To add cleanup code that must be run even in the case of an exception, use after :func:`setUpModule` if :func:`setUpModule` raises an exception. It is responsible for calling all the cleanup functions added by - :func:`addCleanupModule`. If you need cleanup functions to be called + :func:`addModuleCleanup`. If you need cleanup functions to be called *prior* to :func:`tearDownModule` then you can call :func:`doModuleCleanups` yourself. From webhook-mailer at python.org Wed May 11 07:37:40 2022 From: webhook-mailer at python.org (vstinner) Date: Wed, 11 May 2022 11:37:40 -0000 Subject: [Python-checkins] gh-89653: PEP 670: Convert pycore_gc.h macros to functions (#92649) Message-ID: https://github.com/python/cpython/commit/ffcc7cd57f6a52c6074ecc9f0a9f0177fb1dbfee commit: ffcc7cd57f6a52c6074ecc9f0a9f0177fb1dbfee branch: main author: Victor Stinner committer: vstinner date: 2022-05-11T13:37:18+02:00 summary: gh-89653: PEP 670: Convert pycore_gc.h macros to functions (#92649) Convert the following macros to static inline functions: * _Py_AS_GC() * _PyGCHead_FINALIZED(), _PyGCHead_SET_FINALIZED() * _PyGCHead_NEXT(), _PyGCHead_SET_NEXT() * _PyGCHead_PREV(), _PyGCHead_SET_PREV() * _PyGC_FINALIZED(), _PyGC_SET_FINALIZED() * _PyObject_GC_IS_TRACKED() * _PyObject_GC_MAY_BE_TRACKED() Add a macro wrapping the _PyObject_GC_IS_TRACKED() function to cast the argument to PyObject*. files: M Include/internal/pycore_gc.h M Objects/object.c diff --git a/Include/internal/pycore_gc.h b/Include/internal/pycore_gc.h index 16c1893639f35..bfab0adfffc9f 100644 --- a/Include/internal/pycore_gc.h +++ b/Include/internal/pycore_gc.h @@ -19,17 +19,29 @@ typedef struct { uintptr_t _gc_prev; } PyGC_Head; -#define _Py_AS_GC(o) ((PyGC_Head *)(o)-1) +static inline PyGC_Head* _Py_AS_GC(PyObject *op) { + return (_Py_CAST(PyGC_Head*, op) - 1); +} #define _PyGC_Head_UNUSED PyGC_Head /* True if the object is currently tracked by the GC. */ -#define _PyObject_GC_IS_TRACKED(o) (_Py_AS_GC(o)->_gc_next != 0) +static inline int _PyObject_GC_IS_TRACKED(PyObject *op) { + PyGC_Head *gc = _Py_AS_GC(op); + return (gc->_gc_next != 0); +} +#define _PyObject_GC_IS_TRACKED(op) _PyObject_GC_IS_TRACKED(_Py_CAST(PyObject*, op)) /* True if the object may be tracked by the GC in the future, or already is. This can be useful to implement some optimizations. */ -#define _PyObject_GC_MAY_BE_TRACKED(obj) \ - (PyObject_IS_GC(obj) && \ - (!PyTuple_CheckExact(obj) || _PyObject_GC_IS_TRACKED(obj))) +static inline int _PyObject_GC_MAY_BE_TRACKED(PyObject *obj) { + if (!PyObject_IS_GC(obj)) { + return 0; + } + if (PyTuple_CheckExact(obj)) { + return _PyObject_GC_IS_TRACKED(obj); + } + return 1; +} /* Bit flags for _gc_prev */ @@ -43,26 +55,40 @@ typedef struct { // Lowest bit of _gc_next is used for flags only in GC. // But it is always 0 for normal code. -#define _PyGCHead_NEXT(g) ((PyGC_Head*)(g)->_gc_next) -#define _PyGCHead_SET_NEXT(g, p) _Py_RVALUE((g)->_gc_next = (uintptr_t)(p)) +static inline PyGC_Head* _PyGCHead_NEXT(PyGC_Head *gc) { + uintptr_t next = gc->_gc_next; + return _Py_CAST(PyGC_Head*, next); +} +static inline void _PyGCHead_SET_NEXT(PyGC_Head *gc, PyGC_Head *next) { + gc->_gc_next = _Py_CAST(uintptr_t, next); +} // Lowest two bits of _gc_prev is used for _PyGC_PREV_MASK_* flags. -#define _PyGCHead_PREV(g) ((PyGC_Head*)((g)->_gc_prev & _PyGC_PREV_MASK)) -#define _PyGCHead_SET_PREV(g, p) do { \ - assert(((uintptr_t)p & ~_PyGC_PREV_MASK) == 0); \ - (g)->_gc_prev = ((g)->_gc_prev & ~_PyGC_PREV_MASK) \ - | ((uintptr_t)(p)); \ - } while (0) - -#define _PyGCHead_FINALIZED(g) \ - (((g)->_gc_prev & _PyGC_PREV_MASK_FINALIZED) != 0) -#define _PyGCHead_SET_FINALIZED(g) \ - _Py_RVALUE((g)->_gc_prev |= _PyGC_PREV_MASK_FINALIZED) - -#define _PyGC_FINALIZED(o) \ - _PyGCHead_FINALIZED(_Py_AS_GC(o)) -#define _PyGC_SET_FINALIZED(o) \ - _PyGCHead_SET_FINALIZED(_Py_AS_GC(o)) +static inline PyGC_Head* _PyGCHead_PREV(PyGC_Head *gc) { + uintptr_t prev = (gc->_gc_prev & _PyGC_PREV_MASK); + return _Py_CAST(PyGC_Head*, prev); +} +static inline void _PyGCHead_SET_PREV(PyGC_Head *gc, PyGC_Head *prev) { + uintptr_t uprev = _Py_CAST(uintptr_t, prev); + assert((uprev & ~_PyGC_PREV_MASK) == 0); + gc->_gc_prev = ((gc->_gc_prev & ~_PyGC_PREV_MASK) | uprev); +} + +static inline int _PyGCHead_FINALIZED(PyGC_Head *gc) { + return ((gc->_gc_prev & _PyGC_PREV_MASK_FINALIZED) != 0); +} +static inline void _PyGCHead_SET_FINALIZED(PyGC_Head *gc) { + gc->_gc_prev |= _PyGC_PREV_MASK_FINALIZED; +} + +static inline int _PyGC_FINALIZED(PyObject *op) { + PyGC_Head *gc = _Py_AS_GC(op); + return _PyGCHead_FINALIZED(gc); +} +static inline void _PyGC_SET_FINALIZED(PyObject *op) { + PyGC_Head *gc = _Py_AS_GC(op); + _PyGCHead_SET_FINALIZED(gc); +} /* GC runtime state */ diff --git a/Objects/object.c b/Objects/object.c index d5f21b7c6aa19..8339ab392fcae 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -2228,7 +2228,7 @@ _PyTrash_thread_deposit_object(PyObject *op) _PyObject_ASSERT(op, _PyObject_IS_GC(op)); _PyObject_ASSERT(op, !_PyObject_GC_IS_TRACKED(op)); _PyObject_ASSERT(op, Py_REFCNT(op) == 0); - _PyGCHead_SET_PREV(_Py_AS_GC(op), tstate->trash_delete_later); + _PyGCHead_SET_PREV(_Py_AS_GC(op), (PyGC_Head*)tstate->trash_delete_later); tstate->trash_delete_later = op; } From webhook-mailer at python.org Wed May 11 13:37:12 2022 From: webhook-mailer at python.org (miss-islington) Date: Wed, 11 May 2022 17:37:12 -0000 Subject: [Python-checkins] [3.11] gh-91810: ElementTree: Use text file's encoding by default in XML declaration (GH-91903) (GH-92663) Message-ID: https://github.com/python/cpython/commit/20fec2c265f7f47304041abcafdffe7de9937682 commit: 20fec2c265f7f47304041abcafdffe7de9937682 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-11T10:36:52-07:00 summary: [3.11] gh-91810: ElementTree: Use text file's encoding by default in XML declaration (GH-91903) (GH-92663) ElementTree method write() and function tostring() now use the text file's encoding ("UTF-8" if not available) instead of locale encoding in XML declaration when encoding="unicode" is specified. (cherry picked from commit 707839b0fe02ba2c891a40f40e7a869d84c2c9c5) Co-authored-by: Serhiy Storchaka Automerge-Triggered-By: GH:serhiy-storchaka files: A Misc/NEWS.d/next/Library/2022-04-25-10-23-01.gh-issue-91810.DOHa6B.rst M Lib/test/test_xml_etree.py M Lib/xml/etree/ElementTree.py diff --git a/Lib/test/test_xml_etree.py b/Lib/test/test_xml_etree.py index db25eaba1278f..aea77b192c100 100644 --- a/Lib/test/test_xml_etree.py +++ b/Lib/test/test_xml_etree.py @@ -10,7 +10,6 @@ import html import io import itertools -import locale import operator import os import pickle @@ -978,15 +977,13 @@ def test_tostring_xml_declaration(self): def test_tostring_xml_declaration_unicode_encoding(self): elem = ET.XML('') - preferredencoding = locale.getpreferredencoding() self.assertEqual( - f"\n", - ET.tostring(elem, encoding='unicode', xml_declaration=True) + ET.tostring(elem, encoding='unicode', xml_declaration=True), + "\n" ) def test_tostring_xml_declaration_cases(self): elem = ET.XML('?') - preferredencoding = locale.getpreferredencoding() TESTCASES = [ # (expected_retval, encoding, xml_declaration) # ... xml_declaration = None @@ -1013,7 +1010,7 @@ def test_tostring_xml_declaration_cases(self): b"ø", 'US-ASCII', True), (b"\n" b"\xf8", 'ISO-8859-1', True), - (f"\n" + ("\n" "?", 'unicode', True), ] @@ -1051,11 +1048,10 @@ def test_tostringlist_xml_declaration(self): b"\n" ) - preferredencoding = locale.getpreferredencoding() stringlist = ET.tostringlist(elem, encoding='unicode', xml_declaration=True) self.assertEqual( ''.join(stringlist), - f"\n" + "\n" ) self.assertRegex(stringlist[0], r"^<\?xml version='1.0' encoding='.+'?>") self.assertEqual(['', '', ''], stringlist[1:]) @@ -3740,17 +3736,16 @@ def test_write_to_filename_as_unicode(self): encoding = f.encoding os_helper.unlink(TESTFN) - try: - '\xf8'.encode(encoding) - except UnicodeEncodeError: - self.skipTest(f'default file encoding {encoding} not supported') - tree = ET.ElementTree(ET.XML('''\xf8''')) tree.write(TESTFN, encoding='unicode') with open(TESTFN, 'rb') as f: data = f.read() expected = "\xf8".encode(encoding, 'xmlcharrefreplace') - self.assertEqual(data, expected) + if encoding.lower() in ('utf-8', 'ascii'): + self.assertEqual(data, expected) + else: + self.assertIn(b"ø''') + self.assertEqual(f.read(), convlinesep( + b'''\n''' + b'''ø''')) with open(TESTFN, 'w', encoding='ISO-8859-1') as f: tree.write(f, encoding='unicode') self.assertFalse(f.closed) with open(TESTFN, 'rb') as f: - self.assertEqual(f.read(), b'''\xf8''') + self.assertEqual(f.read(), convlinesep( + b'''\n''' + b'''\xf8''')) def test_write_to_binary_file(self): self.addCleanup(os_helper.unlink, TESTFN) diff --git a/Lib/xml/etree/ElementTree.py b/Lib/xml/etree/ElementTree.py index 5249c7ab82b84..a5cc65e789c00 100644 --- a/Lib/xml/etree/ElementTree.py +++ b/Lib/xml/etree/ElementTree.py @@ -728,16 +728,10 @@ def write(self, file_or_filename, encoding = "utf-8" else: encoding = "us-ascii" - enc_lower = encoding.lower() - with _get_writer(file_or_filename, enc_lower) as write: + with _get_writer(file_or_filename, encoding) as (write, declared_encoding): if method == "xml" and (xml_declaration or (xml_declaration is None and - enc_lower not in ("utf-8", "us-ascii", "unicode"))): - declared_encoding = encoding - if enc_lower == "unicode": - # Retrieve the default encoding for the xml declaration - import locale - declared_encoding = locale.getpreferredencoding() + declared_encoding.lower() not in ("utf-8", "us-ascii"))): write("\n" % ( declared_encoding,)) if method == "text": @@ -762,19 +756,20 @@ def _get_writer(file_or_filename, encoding): write = file_or_filename.write except AttributeError: # file_or_filename is a file name - if encoding == "unicode": - file = open(file_or_filename, "w") + if encoding.lower() == "unicode": + file = open(file_or_filename, "w", + errors="xmlcharrefreplace") else: file = open(file_or_filename, "w", encoding=encoding, errors="xmlcharrefreplace") with file: - yield file.write + yield file.write, file.encoding else: # file_or_filename is a file-like object # encoding determines if it is a text or binary writer - if encoding == "unicode": + if encoding.lower() == "unicode": # use a text writer as is - yield write + yield write, getattr(file_or_filename, "encoding", None) or "utf-8" else: # wrap a binary writer with TextIOWrapper with contextlib.ExitStack() as stack: @@ -805,7 +800,7 @@ def _get_writer(file_or_filename, encoding): # Keep the original file open when the TextIOWrapper is # destroyed stack.callback(file.detach) - yield file.write + yield file.write, encoding def _namespaces(elem, default_namespace=None): # identify namespaces used in this tree diff --git a/Misc/NEWS.d/next/Library/2022-04-25-10-23-01.gh-issue-91810.DOHa6B.rst b/Misc/NEWS.d/next/Library/2022-04-25-10-23-01.gh-issue-91810.DOHa6B.rst new file mode 100644 index 0000000000000..0711f8466b818 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-04-25-10-23-01.gh-issue-91810.DOHa6B.rst @@ -0,0 +1,5 @@ +:class:`~xml.etree.ElementTree.ElementTree` method +:meth:`~xml.etree.ElementTree.ElementTree.write` and function +:func:`~xml.etree.ElementTree.tostring` now use the text file's encoding +("UTF-8" if not available) instead of locale encoding in XML declaration +when ``encoding="unicode"`` is specified. From webhook-mailer at python.org Wed May 11 13:38:40 2022 From: webhook-mailer at python.org (miss-islington) Date: Wed, 11 May 2022 17:38:40 -0000 Subject: [Python-checkins] [3.11] gh-89336: Fix configparser.RawConfigParser.readfp typo (GH-92636) (GH-92662) Message-ID: https://github.com/python/cpython/commit/a2c8180a9a0061ffe021da2bf1983278195ce240 commit: a2c8180a9a0061ffe021da2bf1983278195ce240 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-11T10:38:30-07:00 summary: [3.11] gh-89336: Fix configparser.RawConfigParser.readfp typo (GH-92636) (GH-92662) (cherry picked from commit 75e463430efcb5b20efa93f9a5d98ccd03d83a3d) Co-authored-by: Hugo van Kemenade Automerge-Triggered-By: GH:serhiy-storchaka files: M Doc/whatsnew/3.11.rst diff --git a/Doc/whatsnew/3.11.rst b/Doc/whatsnew/3.11.rst index 40e68e64e0429..6518eea4c7ba5 100644 --- a/Doc/whatsnew/3.11.rst +++ b/Doc/whatsnew/3.11.rst @@ -1170,7 +1170,7 @@ Deprecated * the :class:`configparser.SafeConfigParser` class * the :attr:`configparser.ParsingError.filename` property - * the :meth:`configparser.ParsingError.readfp` method + * the :meth:`configparser.RawConfigParser.readfp` method (Contributed by Hugo van Kemenade in :issue:`45173`.) From webhook-mailer at python.org Wed May 11 13:39:44 2022 From: webhook-mailer at python.org (miss-islington) Date: Wed, 11 May 2022 17:39:44 -0000 Subject: [Python-checkins] [3.10] gh-91810: ElementTree: Use text file's encoding by default in XML declaration (GH-91903) (GH-92664) Message-ID: https://github.com/python/cpython/commit/4730b0d6f3e6a6bc04de980c071a07adab41a1c9 commit: 4730b0d6f3e6a6bc04de980c071a07adab41a1c9 branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-11T10:39:21-07:00 summary: [3.10] gh-91810: ElementTree: Use text file's encoding by default in XML declaration (GH-91903) (GH-92664) ElementTree method write() and function tostring() now use the text file's encoding ("UTF-8" if not available) instead of locale encoding in XML declaration when encoding="unicode" is specified. (cherry picked from commit 707839b0fe02ba2c891a40f40e7a869d84c2c9c5) Co-authored-by: Serhiy Storchaka Automerge-Triggered-By: GH:serhiy-storchaka files: A Misc/NEWS.d/next/Library/2022-04-25-10-23-01.gh-issue-91810.DOHa6B.rst M Lib/test/test_xml_etree.py M Lib/xml/etree/ElementTree.py diff --git a/Lib/test/test_xml_etree.py b/Lib/test/test_xml_etree.py index cb6d1697f1da8..9f5b5b73412f0 100644 --- a/Lib/test/test_xml_etree.py +++ b/Lib/test/test_xml_etree.py @@ -10,7 +10,6 @@ import html import io import itertools -import locale import operator import os import pickle @@ -978,15 +977,13 @@ def test_tostring_xml_declaration(self): def test_tostring_xml_declaration_unicode_encoding(self): elem = ET.XML('') - preferredencoding = locale.getpreferredencoding() self.assertEqual( - f"\n", - ET.tostring(elem, encoding='unicode', xml_declaration=True) + ET.tostring(elem, encoding='unicode', xml_declaration=True), + "\n" ) def test_tostring_xml_declaration_cases(self): elem = ET.XML('?') - preferredencoding = locale.getpreferredencoding() TESTCASES = [ # (expected_retval, encoding, xml_declaration) # ... xml_declaration = None @@ -1013,7 +1010,7 @@ def test_tostring_xml_declaration_cases(self): b"ø", 'US-ASCII', True), (b"\n" b"\xf8", 'ISO-8859-1', True), - (f"\n" + ("\n" "?", 'unicode', True), ] @@ -1051,11 +1048,10 @@ def test_tostringlist_xml_declaration(self): b"\n" ) - preferredencoding = locale.getpreferredencoding() stringlist = ET.tostringlist(elem, encoding='unicode', xml_declaration=True) self.assertEqual( ''.join(stringlist), - f"\n" + "\n" ) self.assertRegex(stringlist[0], r"^<\?xml version='1.0' encoding='.+'?>") self.assertEqual(['', '', ''], stringlist[1:]) @@ -3740,17 +3736,16 @@ def test_write_to_filename_as_unicode(self): encoding = f.encoding os_helper.unlink(TESTFN) - try: - '\xf8'.encode(encoding) - except UnicodeEncodeError: - self.skipTest(f'default file encoding {encoding} not supported') - tree = ET.ElementTree(ET.XML('''\xf8''')) tree.write(TESTFN, encoding='unicode') with open(TESTFN, 'rb') as f: data = f.read() expected = "\xf8".encode(encoding, 'xmlcharrefreplace') - self.assertEqual(data, expected) + if encoding.lower() in ('utf-8', 'ascii'): + self.assertEqual(data, expected) + else: + self.assertIn(b"ø''') + self.assertEqual(f.read(), convlinesep( + b'''\n''' + b'''ø''')) with open(TESTFN, 'w', encoding='ISO-8859-1') as f: tree.write(f, encoding='unicode') self.assertFalse(f.closed) with open(TESTFN, 'rb') as f: - self.assertEqual(f.read(), b'''\xf8''') + self.assertEqual(f.read(), convlinesep( + b'''\n''' + b'''\xf8''')) def test_write_to_binary_file(self): self.addCleanup(os_helper.unlink, TESTFN) diff --git a/Lib/xml/etree/ElementTree.py b/Lib/xml/etree/ElementTree.py index 07be8609b83d6..58da7c8d15623 100644 --- a/Lib/xml/etree/ElementTree.py +++ b/Lib/xml/etree/ElementTree.py @@ -728,16 +728,10 @@ def write(self, file_or_filename, encoding = "utf-8" else: encoding = "us-ascii" - enc_lower = encoding.lower() - with _get_writer(file_or_filename, enc_lower) as write: + with _get_writer(file_or_filename, encoding) as (write, declared_encoding): if method == "xml" and (xml_declaration or (xml_declaration is None and - enc_lower not in ("utf-8", "us-ascii", "unicode"))): - declared_encoding = encoding - if enc_lower == "unicode": - # Retrieve the default encoding for the xml declaration - import locale - declared_encoding = locale.getpreferredencoding() + declared_encoding.lower() not in ("utf-8", "us-ascii"))): write("\n" % ( declared_encoding,)) if method == "text": @@ -762,19 +756,20 @@ def _get_writer(file_or_filename, encoding): write = file_or_filename.write except AttributeError: # file_or_filename is a file name - if encoding == "unicode": - file = open(file_or_filename, "w") + if encoding.lower() == "unicode": + file = open(file_or_filename, "w", + errors="xmlcharrefreplace") else: file = open(file_or_filename, "w", encoding=encoding, errors="xmlcharrefreplace") with file: - yield file.write + yield file.write, file.encoding else: # file_or_filename is a file-like object # encoding determines if it is a text or binary writer - if encoding == "unicode": + if encoding.lower() == "unicode": # use a text writer as is - yield write + yield write, getattr(file_or_filename, "encoding", None) or "utf-8" else: # wrap a binary writer with TextIOWrapper with contextlib.ExitStack() as stack: @@ -805,7 +800,7 @@ def _get_writer(file_or_filename, encoding): # Keep the original file open when the TextIOWrapper is # destroyed stack.callback(file.detach) - yield file.write + yield file.write, encoding def _namespaces(elem, default_namespace=None): # identify namespaces used in this tree diff --git a/Misc/NEWS.d/next/Library/2022-04-25-10-23-01.gh-issue-91810.DOHa6B.rst b/Misc/NEWS.d/next/Library/2022-04-25-10-23-01.gh-issue-91810.DOHa6B.rst new file mode 100644 index 0000000000000..0711f8466b818 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-04-25-10-23-01.gh-issue-91810.DOHa6B.rst @@ -0,0 +1,5 @@ +:class:`~xml.etree.ElementTree.ElementTree` method +:meth:`~xml.etree.ElementTree.ElementTree.write` and function +:func:`~xml.etree.ElementTree.tostring` now use the text file's encoding +("UTF-8" if not available) instead of locale encoding in XML declaration +when ``encoding="unicode"`` is specified. From webhook-mailer at python.org Wed May 11 13:40:16 2022 From: webhook-mailer at python.org (miss-islington) Date: Wed, 11 May 2022 17:40:16 -0000 Subject: [Python-checkins] [3.9] gh-91810: ElementTree: Use text file's encoding by default in XML declaration (GH-91903) (GH-92665) Message-ID: https://github.com/python/cpython/commit/bfc88d3418af6f4ef16aa306f12dd2d36ef957ae commit: bfc88d3418af6f4ef16aa306f12dd2d36ef957ae branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-11T10:40:05-07:00 summary: [3.9] gh-91810: ElementTree: Use text file's encoding by default in XML declaration (GH-91903) (GH-92665) ElementTree method write() and function tostring() now use the text file's encoding ("UTF-8" if not available) instead of locale encoding in XML declaration when encoding="unicode" is specified. (cherry picked from commit 707839b0fe02ba2c891a40f40e7a869d84c2c9c5) Co-authored-by: Serhiy Storchaka Automerge-Triggered-By: GH:serhiy-storchaka files: A Misc/NEWS.d/next/Library/2022-04-25-10-23-01.gh-issue-91810.DOHa6B.rst M Lib/test/test_xml_etree.py M Lib/xml/etree/ElementTree.py diff --git a/Lib/test/test_xml_etree.py b/Lib/test/test_xml_etree.py index 22f14a2b4d633..956d4c587c36e 100644 --- a/Lib/test/test_xml_etree.py +++ b/Lib/test/test_xml_etree.py @@ -10,7 +10,6 @@ import html import io import itertools -import locale import operator import os import pickle @@ -960,15 +959,13 @@ def test_tostring_xml_declaration(self): def test_tostring_xml_declaration_unicode_encoding(self): elem = ET.XML('') - preferredencoding = locale.getpreferredencoding() self.assertEqual( - f"\n", - ET.tostring(elem, encoding='unicode', xml_declaration=True) + ET.tostring(elem, encoding='unicode', xml_declaration=True), + "\n" ) def test_tostring_xml_declaration_cases(self): elem = ET.XML('?') - preferredencoding = locale.getpreferredencoding() TESTCASES = [ # (expected_retval, encoding, xml_declaration) # ... xml_declaration = None @@ -995,7 +992,7 @@ def test_tostring_xml_declaration_cases(self): b"ø", 'US-ASCII', True), (b"\n" b"\xf8", 'ISO-8859-1', True), - (f"\n" + ("\n" "?", 'unicode', True), ] @@ -1033,11 +1030,10 @@ def test_tostringlist_xml_declaration(self): b"\n" ) - preferredencoding = locale.getpreferredencoding() stringlist = ET.tostringlist(elem, encoding='unicode', xml_declaration=True) self.assertEqual( ''.join(stringlist), - f"\n" + "\n" ) self.assertRegex(stringlist[0], r"^<\?xml version='1.0' encoding='.+'?>") self.assertEqual(['', '', ''], stringlist[1:]) @@ -3681,17 +3677,16 @@ def test_write_to_filename_as_unicode(self): encoding = f.encoding support.unlink(TESTFN) - try: - '\xf8'.encode(encoding) - except UnicodeEncodeError: - self.skipTest(f'default file encoding {encoding} not supported') - tree = ET.ElementTree(ET.XML('''\xf8''')) tree.write(TESTFN, encoding='unicode') with open(TESTFN, 'rb') as f: data = f.read() expected = "\xf8".encode(encoding, 'xmlcharrefreplace') - self.assertEqual(data, expected) + if encoding.lower() in ('utf-8', 'ascii'): + self.assertEqual(data, expected) + else: + self.assertIn(b"ø''') + self.assertEqual(f.read(), convlinesep( + b'''\n''' + b'''ø''')) with open(TESTFN, 'w', encoding='ISO-8859-1') as f: tree.write(f, encoding='unicode') self.assertFalse(f.closed) with open(TESTFN, 'rb') as f: - self.assertEqual(f.read(), b'''\xf8''') + self.assertEqual(f.read(), convlinesep( + b'''\n''' + b'''\xf8''')) def test_write_to_binary_file(self): self.addCleanup(support.unlink, TESTFN) diff --git a/Lib/xml/etree/ElementTree.py b/Lib/xml/etree/ElementTree.py index dae2251d859da..66c43c2d0d32b 100644 --- a/Lib/xml/etree/ElementTree.py +++ b/Lib/xml/etree/ElementTree.py @@ -728,16 +728,10 @@ def write(self, file_or_filename, encoding = "utf-8" else: encoding = "us-ascii" - enc_lower = encoding.lower() - with _get_writer(file_or_filename, enc_lower) as write: + with _get_writer(file_or_filename, encoding) as (write, declared_encoding): if method == "xml" and (xml_declaration or (xml_declaration is None and - enc_lower not in ("utf-8", "us-ascii", "unicode"))): - declared_encoding = encoding - if enc_lower == "unicode": - # Retrieve the default encoding for the xml declaration - import locale - declared_encoding = locale.getpreferredencoding() + declared_encoding.lower() not in ("utf-8", "us-ascii"))): write("\n" % ( declared_encoding,)) if method == "text": @@ -762,19 +756,20 @@ def _get_writer(file_or_filename, encoding): write = file_or_filename.write except AttributeError: # file_or_filename is a file name - if encoding == "unicode": - file = open(file_or_filename, "w") + if encoding.lower() == "unicode": + file = open(file_or_filename, "w", + errors="xmlcharrefreplace") else: file = open(file_or_filename, "w", encoding=encoding, errors="xmlcharrefreplace") with file: - yield file.write + yield file.write, file.encoding else: # file_or_filename is a file-like object # encoding determines if it is a text or binary writer - if encoding == "unicode": + if encoding.lower() == "unicode": # use a text writer as is - yield write + yield write, getattr(file_or_filename, "encoding", None) or "utf-8" else: # wrap a binary writer with TextIOWrapper with contextlib.ExitStack() as stack: @@ -805,7 +800,7 @@ def _get_writer(file_or_filename, encoding): # Keep the original file open when the TextIOWrapper is # destroyed stack.callback(file.detach) - yield file.write + yield file.write, encoding def _namespaces(elem, default_namespace=None): # identify namespaces used in this tree diff --git a/Misc/NEWS.d/next/Library/2022-04-25-10-23-01.gh-issue-91810.DOHa6B.rst b/Misc/NEWS.d/next/Library/2022-04-25-10-23-01.gh-issue-91810.DOHa6B.rst new file mode 100644 index 0000000000000..0711f8466b818 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-04-25-10-23-01.gh-issue-91810.DOHa6B.rst @@ -0,0 +1,5 @@ +:class:`~xml.etree.ElementTree.ElementTree` method +:meth:`~xml.etree.ElementTree.ElementTree.write` and function +:func:`~xml.etree.ElementTree.tostring` now use the text file's encoding +("UTF-8" if not available) instead of locale encoding in XML declaration +when ``encoding="unicode"`` is specified. From webhook-mailer at python.org Wed May 11 14:17:46 2022 From: webhook-mailer at python.org (zooba) Date: Wed, 11 May 2022 18:17:46 -0000 Subject: [Python-checkins] bpo-42627: Fix incorrect parsing of Windows registry proxy settings (GH-26307) Message-ID: https://github.com/python/cpython/commit/b69297ea23c0ab9866ae8bd26a347a9b5df567a6 commit: b69297ea23c0ab9866ae8bd26a347a9b5df567a6 branch: main author: ??? committer: zooba date: 2022-05-11T19:17:17+01:00 summary: bpo-42627: Fix incorrect parsing of Windows registry proxy settings (GH-26307) files: A Misc/NEWS.d/next/Library/2021-05-22-07-58-59.bpo-42627.EejtD0.rst M Lib/urllib/request.py diff --git a/Lib/urllib/request.py b/Lib/urllib/request.py index 84997f268c930..6d580a434a7be 100644 --- a/Lib/urllib/request.py +++ b/Lib/urllib/request.py @@ -2679,22 +2679,26 @@ def getproxies_registry(): # Returned as Unicode but problems if not converted to ASCII proxyServer = str(winreg.QueryValueEx(internetSettings, 'ProxyServer')[0]) - if '=' in proxyServer: - # Per-protocol settings - for p in proxyServer.split(';'): - protocol, address = p.split('=', 1) - # See if address has a type:// prefix - if not re.match('(?:[^/:]+)://', address): - address = '%s://%s' % (protocol, address) - proxies[protocol] = address - else: - # Use one setting for all protocols - if proxyServer[:5] == 'http:': - proxies['http'] = proxyServer - else: - proxies['http'] = 'http://%s' % proxyServer - proxies['https'] = 'https://%s' % proxyServer - proxies['ftp'] = 'ftp://%s' % proxyServer + if '=' not in proxyServer and ';' not in proxyServer: + # Use one setting for all protocols. + proxyServer = 'http={0};https={0};ftp={0}'.format(proxyServer) + for p in proxyServer.split(';'): + protocol, address = p.split('=', 1) + # See if address has a type:// prefix + if not re.match('(?:[^/:]+)://', address): + # Add type:// prefix to address without specifying type + if protocol in ('http', 'https', 'ftp'): + # The default proxy type of Windows is HTTP + address = 'http://' + address + elif protocol == 'socks': + address = 'socks://' + address + proxies[protocol] = address + # Use SOCKS proxy for HTTP(S) protocols + if proxies.get('socks'): + # The default SOCKS proxy type of Windows is SOCKS4 + address = re.sub(r'^socks://', 'socks4://', proxies['socks']) + proxies['http'] = proxies.get('http') or address + proxies['https'] = proxies.get('https') or address internetSettings.Close() except (OSError, ValueError, TypeError): # Either registry key not found etc, or the value in an diff --git a/Misc/NEWS.d/next/Library/2021-05-22-07-58-59.bpo-42627.EejtD0.rst b/Misc/NEWS.d/next/Library/2021-05-22-07-58-59.bpo-42627.EejtD0.rst new file mode 100644 index 0000000000000..f165b9ced05d9 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2021-05-22-07-58-59.bpo-42627.EejtD0.rst @@ -0,0 +1 @@ +Fix incorrect parsing of Windows registry proxy settings From webhook-mailer at python.org Wed May 11 14:42:09 2022 From: webhook-mailer at python.org (miss-islington) Date: Wed, 11 May 2022 18:42:09 -0000 Subject: [Python-checkins] bpo-42627: Fix incorrect parsing of Windows registry proxy settings (GH-26307) Message-ID: https://github.com/python/cpython/commit/5a33643dce347f4447eb1919d8109931390ded66 commit: 5a33643dce347f4447eb1919d8109931390ded66 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-11T11:41:53-07:00 summary: bpo-42627: Fix incorrect parsing of Windows registry proxy settings (GH-26307) (cherry picked from commit b69297ea23c0ab9866ae8bd26a347a9b5df567a6) Co-authored-by: ??? files: A Misc/NEWS.d/next/Library/2021-05-22-07-58-59.bpo-42627.EejtD0.rst M Lib/urllib/request.py diff --git a/Lib/urllib/request.py b/Lib/urllib/request.py index 84997f268c930..6d580a434a7be 100644 --- a/Lib/urllib/request.py +++ b/Lib/urllib/request.py @@ -2679,22 +2679,26 @@ def getproxies_registry(): # Returned as Unicode but problems if not converted to ASCII proxyServer = str(winreg.QueryValueEx(internetSettings, 'ProxyServer')[0]) - if '=' in proxyServer: - # Per-protocol settings - for p in proxyServer.split(';'): - protocol, address = p.split('=', 1) - # See if address has a type:// prefix - if not re.match('(?:[^/:]+)://', address): - address = '%s://%s' % (protocol, address) - proxies[protocol] = address - else: - # Use one setting for all protocols - if proxyServer[:5] == 'http:': - proxies['http'] = proxyServer - else: - proxies['http'] = 'http://%s' % proxyServer - proxies['https'] = 'https://%s' % proxyServer - proxies['ftp'] = 'ftp://%s' % proxyServer + if '=' not in proxyServer and ';' not in proxyServer: + # Use one setting for all protocols. + proxyServer = 'http={0};https={0};ftp={0}'.format(proxyServer) + for p in proxyServer.split(';'): + protocol, address = p.split('=', 1) + # See if address has a type:// prefix + if not re.match('(?:[^/:]+)://', address): + # Add type:// prefix to address without specifying type + if protocol in ('http', 'https', 'ftp'): + # The default proxy type of Windows is HTTP + address = 'http://' + address + elif protocol == 'socks': + address = 'socks://' + address + proxies[protocol] = address + # Use SOCKS proxy for HTTP(S) protocols + if proxies.get('socks'): + # The default SOCKS proxy type of Windows is SOCKS4 + address = re.sub(r'^socks://', 'socks4://', proxies['socks']) + proxies['http'] = proxies.get('http') or address + proxies['https'] = proxies.get('https') or address internetSettings.Close() except (OSError, ValueError, TypeError): # Either registry key not found etc, or the value in an diff --git a/Misc/NEWS.d/next/Library/2021-05-22-07-58-59.bpo-42627.EejtD0.rst b/Misc/NEWS.d/next/Library/2021-05-22-07-58-59.bpo-42627.EejtD0.rst new file mode 100644 index 0000000000000..f165b9ced05d9 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2021-05-22-07-58-59.bpo-42627.EejtD0.rst @@ -0,0 +1 @@ +Fix incorrect parsing of Windows registry proxy settings From webhook-mailer at python.org Wed May 11 14:42:14 2022 From: webhook-mailer at python.org (miss-islington) Date: Wed, 11 May 2022 18:42:14 -0000 Subject: [Python-checkins] bpo-42627: Fix incorrect parsing of Windows registry proxy settings (GH-26307) Message-ID: https://github.com/python/cpython/commit/65d2dfd5c29c25a4f620e928c5ac9b14cb44fafb commit: 65d2dfd5c29c25a4f620e928c5ac9b14cb44fafb branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-11T11:42:10-07:00 summary: bpo-42627: Fix incorrect parsing of Windows registry proxy settings (GH-26307) (cherry picked from commit b69297ea23c0ab9866ae8bd26a347a9b5df567a6) Co-authored-by: ??? files: A Misc/NEWS.d/next/Library/2021-05-22-07-58-59.bpo-42627.EejtD0.rst M Lib/urllib/request.py diff --git a/Lib/urllib/request.py b/Lib/urllib/request.py index 4e289fc67df6c..2e7d01fdac8ec 100644 --- a/Lib/urllib/request.py +++ b/Lib/urllib/request.py @@ -2672,22 +2672,26 @@ def getproxies_registry(): # Returned as Unicode but problems if not converted to ASCII proxyServer = str(winreg.QueryValueEx(internetSettings, 'ProxyServer')[0]) - if '=' in proxyServer: - # Per-protocol settings - for p in proxyServer.split(';'): - protocol, address = p.split('=', 1) - # See if address has a type:// prefix - if not re.match('(?:[^/:]+)://', address): - address = '%s://%s' % (protocol, address) - proxies[protocol] = address - else: - # Use one setting for all protocols - if proxyServer[:5] == 'http:': - proxies['http'] = proxyServer - else: - proxies['http'] = 'http://%s' % proxyServer - proxies['https'] = 'https://%s' % proxyServer - proxies['ftp'] = 'ftp://%s' % proxyServer + if '=' not in proxyServer and ';' not in proxyServer: + # Use one setting for all protocols. + proxyServer = 'http={0};https={0};ftp={0}'.format(proxyServer) + for p in proxyServer.split(';'): + protocol, address = p.split('=', 1) + # See if address has a type:// prefix + if not re.match('(?:[^/:]+)://', address): + # Add type:// prefix to address without specifying type + if protocol in ('http', 'https', 'ftp'): + # The default proxy type of Windows is HTTP + address = 'http://' + address + elif protocol == 'socks': + address = 'socks://' + address + proxies[protocol] = address + # Use SOCKS proxy for HTTP(S) protocols + if proxies.get('socks'): + # The default SOCKS proxy type of Windows is SOCKS4 + address = re.sub(r'^socks://', 'socks4://', proxies['socks']) + proxies['http'] = proxies.get('http') or address + proxies['https'] = proxies.get('https') or address internetSettings.Close() except (OSError, ValueError, TypeError): # Either registry key not found etc, or the value in an diff --git a/Misc/NEWS.d/next/Library/2021-05-22-07-58-59.bpo-42627.EejtD0.rst b/Misc/NEWS.d/next/Library/2021-05-22-07-58-59.bpo-42627.EejtD0.rst new file mode 100644 index 0000000000000..f165b9ced05d9 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2021-05-22-07-58-59.bpo-42627.EejtD0.rst @@ -0,0 +1 @@ +Fix incorrect parsing of Windows registry proxy settings From webhook-mailer at python.org Wed May 11 17:23:05 2022 From: webhook-mailer at python.org (vstinner) Date: Wed, 11 May 2022 21:23:05 -0000 Subject: [Python-checkins] gh-92651: Remove the Include/token.h header file (#92652) Message-ID: https://github.com/python/cpython/commit/da5727a120e426ffaf68bf3a8016491205bd2f80 commit: da5727a120e426ffaf68bf3a8016491205bd2f80 branch: main author: Victor Stinner committer: vstinner date: 2022-05-11T23:22:50+02:00 summary: gh-92651: Remove the Include/token.h header file (#92652) Remove the token.h header file. There was never any public tokenizer C API. The token.h header file was only designed to be used by Python internals. Move Include/token.h to Include/internal/pycore_token.h. Including this header file now requires that the Py_BUILD_CORE macro is defined. It no longer checks for the Py_LIMITED_API macro. Rename functions: * PyToken_OneChar() => _PyToken_OneChar() * PyToken_TwoChars() => _PyToken_TwoChars() * PyToken_ThreeChars() => _PyToken_ThreeChars() files: A Include/internal/pycore_token.h A Misc/NEWS.d/next/C API/2022-05-11-02-33-10.gh-issue-92651.FIXLf0.rst D Include/token.h M Doc/whatsnew/3.12.rst M Makefile.pre.in M PCbuild/pythoncore.vcxproj M PCbuild/pythoncore.vcxproj.filters M PCbuild/regen.targets M Parser/pegen.h M Parser/token.c M Parser/tokenizer.c M Parser/tokenizer.h M Python/pythonrun.c M Tools/scripts/generate_token.py diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst index 461d9db793400..bc354c36cdaea 100644 --- a/Doc/whatsnew/3.12.rst +++ b/Doc/whatsnew/3.12.rst @@ -139,3 +139,8 @@ Deprecated Removed ------- + +* Remove the ``token.h`` header file. There was never any public tokenizer C + API. The ``token.h`` header file was only designed to be used by Python + internals. + (Contributed by Victor Stinner in :gh:`92651`.) diff --git a/Include/token.h b/Include/internal/pycore_token.h similarity index 87% rename from Include/token.h rename to Include/internal/pycore_token.h index eb1b9ea47b469..f9b8240e2168f 100644 --- a/Include/token.h +++ b/Include/internal/pycore_token.h @@ -1,13 +1,16 @@ /* Auto-generated by Tools/scripts/generate_token.py */ /* Token types */ -#ifndef Py_LIMITED_API -#ifndef Py_TOKEN_H -#define Py_TOKEN_H +#ifndef Py_INTERNAL_TOKEN_H +#define Py_INTERNAL_TOKEN_H #ifdef __cplusplus extern "C" { #endif +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + #undef TILDE /* Prevent clash of our definition with system macro. Ex AIX, ioctl.h */ #define ENDMARKER 0 @@ -85,13 +88,13 @@ extern "C" { (x) == DEDENT) +// Symbols exported for test_peg_generator PyAPI_DATA(const char * const) _PyParser_TokenNames[]; /* Token names */ -PyAPI_FUNC(int) PyToken_OneChar(int); -PyAPI_FUNC(int) PyToken_TwoChars(int, int); -PyAPI_FUNC(int) PyToken_ThreeChars(int, int, int); +PyAPI_FUNC(int) _PyToken_OneChar(int); +PyAPI_FUNC(int) _PyToken_TwoChars(int, int); +PyAPI_FUNC(int) _PyToken_ThreeChars(int, int, int); #ifdef __cplusplus } #endif -#endif /* !Py_TOKEN_H */ -#endif /* Py_LIMITED_API */ +#endif // !Py_INTERNAL_TOKEN_H diff --git a/Makefile.pre.in b/Makefile.pre.in index e45d4fe3ecb6e..869c78ee0d3c5 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -1325,11 +1325,11 @@ regen-token: $(PYTHON_FOR_REGEN) $(srcdir)/Tools/scripts/generate_token.py rst \ $(srcdir)/Grammar/Tokens \ $(srcdir)/Doc/library/token-list.inc - # Regenerate Include/token.h from Grammar/Tokens + # Regenerate Include/internal/pycore_token.h from Grammar/Tokens # using Tools/scripts/generate_token.py $(PYTHON_FOR_REGEN) $(srcdir)/Tools/scripts/generate_token.py h \ $(srcdir)/Grammar/Tokens \ - $(srcdir)/Include/token.h + $(srcdir)/Include/internal/pycore_token.h # Regenerate Parser/token.c from Grammar/Tokens # using Tools/scripts/generate_token.py $(PYTHON_FOR_REGEN) $(srcdir)/Tools/scripts/generate_token.py c \ @@ -1521,7 +1521,6 @@ PYTHON_HEADERS= \ $(srcdir)/Include/structmember.h \ $(srcdir)/Include/structseq.h \ $(srcdir)/Include/sysmodule.h \ - $(srcdir)/Include/token.h \ $(srcdir)/Include/traceback.h \ $(srcdir)/Include/tracemalloc.h \ $(srcdir)/Include/tupleobject.h \ @@ -1632,6 +1631,7 @@ PYTHON_HEADERS= \ $(srcdir)/Include/internal/pycore_structseq.h \ $(srcdir)/Include/internal/pycore_symtable.h \ $(srcdir)/Include/internal/pycore_sysmodule.h \ + $(srcdir)/Include/internal/pycore_token.h \ $(srcdir)/Include/internal/pycore_traceback.h \ $(srcdir)/Include/internal/pycore_tuple.h \ $(srcdir)/Include/internal/pycore_typeobject.h \ diff --git a/Misc/NEWS.d/next/C API/2022-05-11-02-33-10.gh-issue-92651.FIXLf0.rst b/Misc/NEWS.d/next/C API/2022-05-11-02-33-10.gh-issue-92651.FIXLf0.rst new file mode 100644 index 0000000000000..60a8818e46b7a --- /dev/null +++ b/Misc/NEWS.d/next/C API/2022-05-11-02-33-10.gh-issue-92651.FIXLf0.rst @@ -0,0 +1,3 @@ +Remove the ``token.h`` header file. There was never any public tokenizer C +API. The ``token.h`` header file was only designed to be used by Python +internals. Patch by Victor Stinner. diff --git a/PCbuild/pythoncore.vcxproj b/PCbuild/pythoncore.vcxproj index 3ce116d2babb0..a35884b3c3588 100644 --- a/PCbuild/pythoncore.vcxproj +++ b/PCbuild/pythoncore.vcxproj @@ -244,6 +244,7 @@ + @@ -291,7 +292,6 @@ - diff --git a/PCbuild/pythoncore.vcxproj.filters b/PCbuild/pythoncore.vcxproj.filters index 542d551045686..ff42cc92c4bd2 100644 --- a/PCbuild/pythoncore.vcxproj.filters +++ b/PCbuild/pythoncore.vcxproj.filters @@ -213,9 +213,6 @@ Include - - Include - Include @@ -633,6 +630,9 @@ Include\internal + + Include\internal + Include\internal diff --git a/PCbuild/regen.targets b/PCbuild/regen.targets index 24b5ced1de0e0..9073bb6ab2bd6 100644 --- a/PCbuild/regen.targets +++ b/PCbuild/regen.targets @@ -19,7 +19,7 @@ <_TokenOutputs Include="$(PySourcePath)Doc\library\token-list.inc"> rst - <_TokenOutputs Include="$(PySourcePath)Include\token.h"> + <_TokenOutputs Include="$(PySourcePath)Include\internal\pycore_token.h"> h <_TokenOutputs Include="$(PySourcePath)Parser\token.c"> diff --git a/Parser/pegen.h b/Parser/pegen.h index fe0c327b87556..d6a6e4e1eeb2f 100644 --- a/Parser/pegen.h +++ b/Parser/pegen.h @@ -3,8 +3,8 @@ #define PY_SSIZE_T_CLEAN #include -#include #include +#include #if 0 #define PyPARSE_YIELD_IS_KEYWORD 0x0001 diff --git a/Parser/token.c b/Parser/token.c index 74bca0eff657b..fa03fbc450b2b 100644 --- a/Parser/token.c +++ b/Parser/token.c @@ -1,7 +1,7 @@ /* Auto-generated by Tools/scripts/generate_token.py */ #include "Python.h" -#include "token.h" +#include "pycore_token.h" /* Token names */ @@ -76,7 +76,7 @@ const char * const _PyParser_TokenNames[] = { /* Return the token corresponding to a single character */ int -PyToken_OneChar(int c1) +_PyToken_OneChar(int c1) { switch (c1) { case '%': return PERCENT; @@ -107,7 +107,7 @@ PyToken_OneChar(int c1) } int -PyToken_TwoChars(int c1, int c2) +_PyToken_TwoChars(int c1, int c2) { switch (c1) { case '!': @@ -191,7 +191,7 @@ PyToken_TwoChars(int c1, int c2) } int -PyToken_ThreeChars(int c1, int c2, int c3) +_PyToken_ThreeChars(int c1, int c2, int c3) { switch (c1) { case '*': diff --git a/Parser/tokenizer.c b/Parser/tokenizer.c index c450aa8e4636c..7c797180956d5 100644 --- a/Parser/tokenizer.c +++ b/Parser/tokenizer.c @@ -1992,10 +1992,10 @@ tok_get(struct tok_state *tok, const char **p_start, const char **p_end) /* Check for two-character token */ { int c2 = tok_nextc(tok); - int token = PyToken_TwoChars(c, c2); + int token = _PyToken_TwoChars(c, c2); if (token != OP) { int c3 = tok_nextc(tok); - int token3 = PyToken_ThreeChars(c, c2, c3); + int token3 = _PyToken_ThreeChars(c, c2, c3); if (token3 != OP) { token = token3; } @@ -2059,7 +2059,7 @@ tok_get(struct tok_state *tok, const char **p_start, const char **p_end) /* Punctuation character */ *p_start = tok->start; *p_end = tok->cur; - return PyToken_OneChar(c); + return _PyToken_OneChar(c); } int diff --git a/Parser/tokenizer.h b/Parser/tokenizer.h index 0cb665104b2b8..dba71bd60fefe 100644 --- a/Parser/tokenizer.h +++ b/Parser/tokenizer.h @@ -8,7 +8,7 @@ extern "C" { /* Tokenizer interface */ -#include "token.h" /* For token types */ +#include "pycore_token.h" /* For token types */ #define MAXINDENT 100 /* Max indentation level */ #define MAXLEVEL 200 /* Max parentheses level */ diff --git a/Python/pythonrun.c b/Python/pythonrun.c index f12b9f6e9539a..202df585f31c6 100644 --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -24,7 +24,6 @@ #include "pycore_sysmodule.h" // _PySys_Audit() #include "pycore_traceback.h" // _PyTraceBack_Print_Indented() -#include "token.h" // INDENT #include "errcode.h" // E_EOF #include "marshal.h" // PyMarshal_ReadLongFromFile() diff --git a/Tools/scripts/generate_token.py b/Tools/scripts/generate_token.py index 77bb5bd5eca02..d8be8b93de141 100755 --- a/Tools/scripts/generate_token.py +++ b/Tools/scripts/generate_token.py @@ -51,13 +51,16 @@ def update_file(file, content): /* Auto-generated by Tools/scripts/generate_token.py */ /* Token types */ -#ifndef Py_LIMITED_API -#ifndef Py_TOKEN_H -#define Py_TOKEN_H +#ifndef Py_INTERNAL_TOKEN_H +#define Py_INTERNAL_TOKEN_H #ifdef __cplusplus extern "C" { #endif +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + #undef TILDE /* Prevent clash of our definition with system macro. Ex AIX, ioctl.h */ %s\ @@ -75,19 +78,19 @@ def update_file(file, content): (x) == DEDENT) +// Symbols exported for test_peg_generator PyAPI_DATA(const char * const) _PyParser_TokenNames[]; /* Token names */ -PyAPI_FUNC(int) PyToken_OneChar(int); -PyAPI_FUNC(int) PyToken_TwoChars(int, int); -PyAPI_FUNC(int) PyToken_ThreeChars(int, int, int); +PyAPI_FUNC(int) _PyToken_OneChar(int); +PyAPI_FUNC(int) _PyToken_TwoChars(int, int); +PyAPI_FUNC(int) _PyToken_ThreeChars(int, int, int); #ifdef __cplusplus } #endif -#endif /* !Py_TOKEN_H */ -#endif /* Py_LIMITED_API */ +#endif // !Py_INTERNAL_TOKEN_H """ -def make_h(infile, outfile='Include/token.h'): +def make_h(infile, outfile='Include/internal/pycore_token.h'): tok_names, ERRORTOKEN, string_to_tok = load_tokens(infile) defines = [] @@ -106,7 +109,7 @@ def make_h(infile, outfile='Include/token.h'): /* Auto-generated by Tools/scripts/generate_token.py */ #include "Python.h" -#include "token.h" +#include "pycore_token.h" /* Token names */ @@ -117,21 +120,21 @@ def make_h(infile, outfile='Include/token.h'): /* Return the token corresponding to a single character */ int -PyToken_OneChar(int c1) +_PyToken_OneChar(int c1) { %s\ return OP; } int -PyToken_TwoChars(int c1, int c2) +_PyToken_TwoChars(int c1, int c2) { %s\ return OP; } int -PyToken_ThreeChars(int c1, int c2, int c3) +_PyToken_ThreeChars(int c1, int c2, int c3) { %s\ return OP; From webhook-mailer at python.org Wed May 11 17:24:59 2022 From: webhook-mailer at python.org (vstinner) Date: Wed, 11 May 2022 21:24:59 -0000 Subject: [Python-checkins] gh-89653: PEP 670: Convert PyCell macros to functions (#92653) Message-ID: https://github.com/python/cpython/commit/897f14d38d1b455668f9f7ce87892f5efcaf8932 commit: 897f14d38d1b455668f9f7ce87892f5efcaf8932 branch: main author: Victor Stinner committer: vstinner date: 2022-05-11T23:24:48+02:00 summary: gh-89653: PEP 670: Convert PyCell macros to functions (#92653) Convert the following macros to static inline functions: * PyCell_GET() * PyCell_SET() Limited C API version 3.12 no longer casts arguments. Fix also usage of PyCell_SET(): only delete the old value after setting the new value. files: M Include/cpython/cellobject.h M Objects/cellobject.c M Objects/frameobject.c diff --git a/Include/cpython/cellobject.h b/Include/cpython/cellobject.h index e07f9d1de7942..f778f86de7469 100644 --- a/Include/cpython/cellobject.h +++ b/Include/cpython/cellobject.h @@ -21,8 +21,23 @@ PyAPI_FUNC(PyObject *) PyCell_New(PyObject *); PyAPI_FUNC(PyObject *) PyCell_Get(PyObject *); PyAPI_FUNC(int) PyCell_Set(PyObject *, PyObject *); -#define PyCell_GET(op) (((PyCellObject *)(op))->ob_ref) -#define PyCell_SET(op, v) _Py_RVALUE(((PyCellObject *)(op))->ob_ref = (v)) +static inline PyObject* PyCell_GET(PyObject *op) { + assert(PyCell_Check(op)); + PyCellObject *cell = _Py_CAST(PyCellObject*, op); + return cell->ob_ref; +} +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030c0000 +# define PyCell_GET(op) PyCell_GET(_PyObject_CAST(op)) +#endif + +static inline void PyCell_SET(PyObject *op, PyObject *value) { + assert(PyCell_Check(op)); + PyCellObject *cell = _Py_CAST(PyCellObject*, op); + cell->ob_ref = value; +} +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030c0000 +# define PyCell_SET(op, value) PyCell_SET(_PyObject_CAST(op), (value)) +#endif #ifdef __cplusplus } diff --git a/Objects/cellobject.c b/Objects/cellobject.c index 86a89f02e60d3..1ddf4c5d8b8bd 100644 --- a/Objects/cellobject.c +++ b/Objects/cellobject.c @@ -56,22 +56,21 @@ PyCell_Get(PyObject *op) PyErr_BadInternalCall(); return NULL; } - Py_XINCREF(((PyCellObject*)op)->ob_ref); - return PyCell_GET(op); + PyObject *value = PyCell_GET(op); + return Py_XNewRef(value); } int -PyCell_Set(PyObject *op, PyObject *obj) +PyCell_Set(PyObject *op, PyObject *value) { - PyObject* oldobj; if (!PyCell_Check(op)) { PyErr_BadInternalCall(); return -1; } - oldobj = PyCell_GET(op); - Py_XINCREF(obj); - PyCell_SET(op, obj); - Py_XDECREF(oldobj); + PyObject *old_value = PyCell_GET(op); + Py_XINCREF(value); + PyCell_SET(op, value); + Py_XDECREF(old_value); return 0; } diff --git a/Objects/frameobject.c b/Objects/frameobject.c index 56c4fceb6b893..60f0f2f4edd38 100644 --- a/Objects/frameobject.c +++ b/Objects/frameobject.c @@ -1086,9 +1086,9 @@ _PyFrame_LocalsToFast(_PyInterpreterFrame *frame, int clear) if (cell != NULL) { oldvalue = PyCell_GET(cell); if (value != oldvalue) { - Py_XDECREF(oldvalue); Py_XINCREF(value); PyCell_SET(cell, value); + Py_XDECREF(oldvalue); } } else if (value != oldvalue) { From webhook-mailer at python.org Wed May 11 17:26:07 2022 From: webhook-mailer at python.org (vstinner) Date: Wed, 11 May 2022 21:26:07 -0000 Subject: [Python-checkins] gh-90978: asyncio TestSSL uses SHORT_TIMEOUT (#92642) Message-ID: https://github.com/python/cpython/commit/1d1929fcb55f8fa9317c19ed4789e1dd6c435092 commit: 1d1929fcb55f8fa9317c19ed4789e1dd6c435092 branch: main author: Victor Stinner committer: vstinner date: 2022-05-11T23:25:56+02:00 summary: gh-90978: asyncio TestSSL uses SHORT_TIMEOUT (#92642) TestSSL of asyncio now uses support.SHORT_TIMEOUT rather than hardcoded timeouts like 5, 10 or 40 seconds. files: M Lib/test/test_asyncio/test_ssl.py diff --git a/Lib/test/test_asyncio/test_ssl.py b/Lib/test/test_asyncio/test_ssl.py index 9ba6ba04b32b8..5e3c1573c9c58 100644 --- a/Lib/test/test_asyncio/test_ssl.py +++ b/Lib/test/test_asyncio/test_ssl.py @@ -82,7 +82,7 @@ def tearDown(self): def tcp_server(self, server_prog, *, family=socket.AF_INET, addr=None, - timeout=5, + timeout=support.SHORT_TIMEOUT, backlog=1, max_clients=10): @@ -113,7 +113,7 @@ def tcp_server(self, server_prog, *, def tcp_client(self, client_prog, family=socket.AF_INET, - timeout=10): + timeout=support.SHORT_TIMEOUT): sock = socket.socket(family, socket.SOCK_STREAM) @@ -238,7 +238,7 @@ def prog(sock): async def start_server(): extras = {} - extras = dict(ssl_handshake_timeout=40.0) + extras = dict(ssl_handshake_timeout=support.SHORT_TIMEOUT) srv = await asyncio.start_server( handle_client, @@ -303,7 +303,7 @@ def server(sock): async def client(addr): extras = {} - extras = dict(ssl_handshake_timeout=40.0) + extras = dict(ssl_handshake_timeout=support.SHORT_TIMEOUT) reader, writer = await asyncio.open_connection( *addr, @@ -428,7 +428,7 @@ async def client(addr): *addr, ssl=client_sslctx, server_hostname='', - ssl_handshake_timeout=1.0) + ssl_handshake_timeout=support.SHORT_TIMEOUT) writer.close() await self.wait_closed(writer) @@ -590,7 +590,7 @@ def client(): extras = {} if server_ssl: - extras = dict(ssl_handshake_timeout=10.0) + extras = dict(ssl_handshake_timeout=support.SHORT_TIMEOUT) f = loop.create_task( loop.connect_accepted_socket( @@ -718,7 +718,8 @@ async def client(addr): with self.tcp_server(serve, timeout=self.TIMEOUT) as srv: self.loop.run_until_complete( - asyncio.wait_for(client(srv.addr), timeout=10)) + asyncio.wait_for(client(srv.addr), + timeout=support.SHORT_TIMEOUT)) def test_create_connection_memory_leak(self): HELLO_MSG = b'1' * self.PAYLOAD_SIZE @@ -776,7 +777,8 @@ async def client(addr): with self.tcp_server(serve, timeout=self.TIMEOUT) as srv: self.loop.run_until_complete( - asyncio.wait_for(client(srv.addr), timeout=10)) + asyncio.wait_for(client(srv.addr), + timeout=support.SHORT_TIMEOUT)) # No garbage is left for SSL client from loop.create_connection, even # if user stores the SSLTransport in corresponding protocol instance @@ -936,7 +938,8 @@ async def client(addr): with self.tcp_server(serve, timeout=self.TIMEOUT) as srv: self.loop.run_until_complete( - asyncio.wait_for(client(srv.addr), timeout=10)) + asyncio.wait_for(client(srv.addr), + timeout=support.SHORT_TIMEOUT)) def test_start_tls_server_1(self): HELLO_MSG = b'1' * self.PAYLOAD_SIZE @@ -1186,7 +1189,7 @@ def server(sock): async def client(addr): extras = {} - extras = dict(ssl_handshake_timeout=10.0) + extras = dict(ssl_handshake_timeout=support.SHORT_TIMEOUT) reader, writer = await asyncio.open_connection( *addr, From webhook-mailer at python.org Wed May 11 17:29:00 2022 From: webhook-mailer at python.org (vstinner) Date: Wed, 11 May 2022 21:29:00 -0000 Subject: [Python-checkins] gh-89653: PEP 670: Convert unicodeobject.h macros to functions (#92648) Message-ID: https://github.com/python/cpython/commit/eb88f21301931449718cd4d105018d167a02788b commit: eb88f21301931449718cd4d105018d167a02788b branch: main author: Victor Stinner committer: vstinner date: 2022-05-11T23:28:39+02:00 summary: gh-89653: PEP 670: Convert unicodeobject.h macros to functions (#92648) Convert the following Unicode macros to static inline functions. Surrogate functions: * Py_UNICODE_IS_SURROGATE() * Py_UNICODE_IS_HIGH_SURROGATE() * Py_UNICODE_IS_LOW_SURROGATE() * Py_UNICODE_HIGH_SURROGATE() * Py_UNICODE_LOW_SURROGATE() * Py_UNICODE_JOIN_SURROGATES() "Is" functions: * Py_UNICODE_ISALNUM() * Py_UNICODE_ISSPACE() In the implementation of these functions, the character type is now well defined to Py_UCS4. files: M Include/cpython/unicodeobject.h diff --git a/Include/cpython/unicodeobject.h b/Include/cpython/unicodeobject.h index 8e182d0fbf799..4d7173f4213dd 100644 --- a/Include/cpython/unicodeobject.h +++ b/Include/cpython/unicodeobject.h @@ -15,53 +15,31 @@ # define USE_UNICODE_WCHAR_CACHE 1 #endif /* USE_UNICODE_WCHAR_CACHE */ -/* Since splitting on whitespace is an important use case, and - whitespace in most situations is solely ASCII whitespace, we - optimize for the common case by using a quick look-up table - _Py_ascii_whitespace (see below) with an inlined check. - - */ -#define Py_UNICODE_ISSPACE(ch) \ - ((Py_UCS4)(ch) < 128U ? _Py_ascii_whitespace[(ch)] : _PyUnicode_IsWhitespace(ch)) - -#define Py_UNICODE_ISLOWER(ch) _PyUnicode_IsLowercase(ch) -#define Py_UNICODE_ISUPPER(ch) _PyUnicode_IsUppercase(ch) -#define Py_UNICODE_ISTITLE(ch) _PyUnicode_IsTitlecase(ch) -#define Py_UNICODE_ISLINEBREAK(ch) _PyUnicode_IsLinebreak(ch) - -#define Py_UNICODE_TOLOWER(ch) _PyUnicode_ToLowercase(ch) -#define Py_UNICODE_TOUPPER(ch) _PyUnicode_ToUppercase(ch) -#define Py_UNICODE_TOTITLE(ch) _PyUnicode_ToTitlecase(ch) - -#define Py_UNICODE_ISDECIMAL(ch) _PyUnicode_IsDecimalDigit(ch) -#define Py_UNICODE_ISDIGIT(ch) _PyUnicode_IsDigit(ch) -#define Py_UNICODE_ISNUMERIC(ch) _PyUnicode_IsNumeric(ch) -#define Py_UNICODE_ISPRINTABLE(ch) _PyUnicode_IsPrintable(ch) +// Static inline functions to work with surrogates +static inline int Py_UNICODE_IS_SURROGATE(Py_UCS4 ch) { + return (0xD800 <= ch && ch <= 0xDFFF); +} +static inline int Py_UNICODE_IS_HIGH_SURROGATE(Py_UCS4 ch) { + return (0xD800 <= ch && ch <= 0xDBFF); +} +static inline int Py_UNICODE_IS_LOW_SURROGATE(Py_UCS4 ch) { + return (0xDC00 <= ch && ch <= 0xDFFF); +} -#define Py_UNICODE_TODECIMAL(ch) _PyUnicode_ToDecimalDigit(ch) -#define Py_UNICODE_TODIGIT(ch) _PyUnicode_ToDigit(ch) -#define Py_UNICODE_TONUMERIC(ch) _PyUnicode_ToNumeric(ch) +// Join two surrogate characters and return a single Py_UCS4 value. +static inline Py_UCS4 Py_UNICODE_JOIN_SURROGATES(Py_UCS4 high, Py_UCS4 low) { + return 0x10000 + (((high & 0x03FF) << 10) | (low & 0x03FF)); +} -#define Py_UNICODE_ISALPHA(ch) _PyUnicode_IsAlpha(ch) +// High surrogate = top 10 bits added to D800 +static inline Py_UCS4 Py_UNICODE_HIGH_SURROGATE(Py_UCS4 ch) { + return (0xD800 - (0x10000 >> 10) + (ch >> 10)); +} -#define Py_UNICODE_ISALNUM(ch) \ - (Py_UNICODE_ISALPHA(ch) || \ - Py_UNICODE_ISDECIMAL(ch) || \ - Py_UNICODE_ISDIGIT(ch) || \ - Py_UNICODE_ISNUMERIC(ch)) - -/* macros to work with surrogates */ -#define Py_UNICODE_IS_SURROGATE(ch) (0xD800 <= (ch) && (ch) <= 0xDFFF) -#define Py_UNICODE_IS_HIGH_SURROGATE(ch) (0xD800 <= (ch) && (ch) <= 0xDBFF) -#define Py_UNICODE_IS_LOW_SURROGATE(ch) (0xDC00 <= (ch) && (ch) <= 0xDFFF) -/* Join two surrogate characters and return a single Py_UCS4 value. */ -#define Py_UNICODE_JOIN_SURROGATES(high, low) \ - (((((Py_UCS4)(high) & 0x03FF) << 10) | \ - ((Py_UCS4)(low) & 0x03FF)) + 0x10000) -/* high surrogate = top 10 bits added to D800 */ -#define Py_UNICODE_HIGH_SURROGATE(ch) (0xD800 - (0x10000 >> 10) + ((ch) >> 10)) -/* low surrogate = bottom 10 bits added to DC00 */ -#define Py_UNICODE_LOW_SURROGATE(ch) (0xDC00 + ((ch) & 0x3FF)) +// Low surrogate = bottom 10 bits added to DC00 +static inline Py_UCS4 Py_UNICODE_LOW_SURROGATE(Py_UCS4 ch) { + return (0xDC00 + (ch & 0x3FF)); +} /* --- Unicode Type ------------------------------------------------------- */ @@ -1013,10 +991,6 @@ PyAPI_FUNC(Py_ssize_t) _PyUnicode_InsertThousandsGrouping( /* === Characters Type APIs =============================================== */ -/* Helper array used by Py_UNICODE_ISSPACE(). */ - -PyAPI_DATA(const unsigned char) _Py_ascii_whitespace[]; - /* These should not be used directly. Use the Py_UNICODE_IS* and Py_UNICODE_TO* macros instead. @@ -1124,6 +1098,50 @@ PyAPI_FUNC(int) _PyUnicode_IsAlpha( Py_UCS4 ch /* Unicode character */ ); +// Helper array used by Py_UNICODE_ISSPACE(). +PyAPI_DATA(const unsigned char) _Py_ascii_whitespace[]; + +// Since splitting on whitespace is an important use case, and +// whitespace in most situations is solely ASCII whitespace, we +// optimize for the common case by using a quick look-up table +// _Py_ascii_whitespace (see below) with an inlined check. +static inline int Py_UNICODE_ISSPACE(Py_UCS4 ch) { + if (ch < 128) { + return _Py_ascii_whitespace[ch]; + } + return _PyUnicode_IsWhitespace(ch); +} + +#define Py_UNICODE_ISLOWER(ch) _PyUnicode_IsLowercase(ch) +#define Py_UNICODE_ISUPPER(ch) _PyUnicode_IsUppercase(ch) +#define Py_UNICODE_ISTITLE(ch) _PyUnicode_IsTitlecase(ch) +#define Py_UNICODE_ISLINEBREAK(ch) _PyUnicode_IsLinebreak(ch) + +#define Py_UNICODE_TOLOWER(ch) _PyUnicode_ToLowercase(ch) +#define Py_UNICODE_TOUPPER(ch) _PyUnicode_ToUppercase(ch) +#define Py_UNICODE_TOTITLE(ch) _PyUnicode_ToTitlecase(ch) + +#define Py_UNICODE_ISDECIMAL(ch) _PyUnicode_IsDecimalDigit(ch) +#define Py_UNICODE_ISDIGIT(ch) _PyUnicode_IsDigit(ch) +#define Py_UNICODE_ISNUMERIC(ch) _PyUnicode_IsNumeric(ch) +#define Py_UNICODE_ISPRINTABLE(ch) _PyUnicode_IsPrintable(ch) + +#define Py_UNICODE_TODECIMAL(ch) _PyUnicode_ToDecimalDigit(ch) +#define Py_UNICODE_TODIGIT(ch) _PyUnicode_ToDigit(ch) +#define Py_UNICODE_TONUMERIC(ch) _PyUnicode_ToNumeric(ch) + +#define Py_UNICODE_ISALPHA(ch) _PyUnicode_IsAlpha(ch) + +static inline int Py_UNICODE_ISALNUM(Py_UCS4 ch) { + return (Py_UNICODE_ISALPHA(ch) + || Py_UNICODE_ISDECIMAL(ch) + || Py_UNICODE_ISDIGIT(ch) + || Py_UNICODE_ISNUMERIC(ch)); +} + + +/* === Misc functions ===================================================== */ + PyAPI_FUNC(PyObject*) _PyUnicode_FormatLong(PyObject *, int, int, int); /* Return an interned Unicode object for an Identifier; may fail if there is no memory.*/ From webhook-mailer at python.org Wed May 11 17:56:17 2022 From: webhook-mailer at python.org (miss-islington) Date: Wed, 11 May 2022 21:56:17 -0000 Subject: [Python-checkins] gh-90978: asyncio TestSSL uses SHORT_TIMEOUT (GH-92642) Message-ID: https://github.com/python/cpython/commit/64593f2fedfe41c17e2bad6f207d7a07cfa762b9 commit: 64593f2fedfe41c17e2bad6f207d7a07cfa762b9 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-11T14:56:07-07:00 summary: gh-90978: asyncio TestSSL uses SHORT_TIMEOUT (GH-92642) TestSSL of asyncio now uses support.SHORT_TIMEOUT rather than hardcoded timeouts like 5, 10 or 40 seconds. (cherry picked from commit 1d1929fcb55f8fa9317c19ed4789e1dd6c435092) Co-authored-by: Victor Stinner files: M Lib/test/test_asyncio/test_ssl.py diff --git a/Lib/test/test_asyncio/test_ssl.py b/Lib/test/test_asyncio/test_ssl.py index 9ba6ba04b32b8..5e3c1573c9c58 100644 --- a/Lib/test/test_asyncio/test_ssl.py +++ b/Lib/test/test_asyncio/test_ssl.py @@ -82,7 +82,7 @@ def tearDown(self): def tcp_server(self, server_prog, *, family=socket.AF_INET, addr=None, - timeout=5, + timeout=support.SHORT_TIMEOUT, backlog=1, max_clients=10): @@ -113,7 +113,7 @@ def tcp_server(self, server_prog, *, def tcp_client(self, client_prog, family=socket.AF_INET, - timeout=10): + timeout=support.SHORT_TIMEOUT): sock = socket.socket(family, socket.SOCK_STREAM) @@ -238,7 +238,7 @@ def prog(sock): async def start_server(): extras = {} - extras = dict(ssl_handshake_timeout=40.0) + extras = dict(ssl_handshake_timeout=support.SHORT_TIMEOUT) srv = await asyncio.start_server( handle_client, @@ -303,7 +303,7 @@ def server(sock): async def client(addr): extras = {} - extras = dict(ssl_handshake_timeout=40.0) + extras = dict(ssl_handshake_timeout=support.SHORT_TIMEOUT) reader, writer = await asyncio.open_connection( *addr, @@ -428,7 +428,7 @@ async def client(addr): *addr, ssl=client_sslctx, server_hostname='', - ssl_handshake_timeout=1.0) + ssl_handshake_timeout=support.SHORT_TIMEOUT) writer.close() await self.wait_closed(writer) @@ -590,7 +590,7 @@ def client(): extras = {} if server_ssl: - extras = dict(ssl_handshake_timeout=10.0) + extras = dict(ssl_handshake_timeout=support.SHORT_TIMEOUT) f = loop.create_task( loop.connect_accepted_socket( @@ -718,7 +718,8 @@ async def client(addr): with self.tcp_server(serve, timeout=self.TIMEOUT) as srv: self.loop.run_until_complete( - asyncio.wait_for(client(srv.addr), timeout=10)) + asyncio.wait_for(client(srv.addr), + timeout=support.SHORT_TIMEOUT)) def test_create_connection_memory_leak(self): HELLO_MSG = b'1' * self.PAYLOAD_SIZE @@ -776,7 +777,8 @@ async def client(addr): with self.tcp_server(serve, timeout=self.TIMEOUT) as srv: self.loop.run_until_complete( - asyncio.wait_for(client(srv.addr), timeout=10)) + asyncio.wait_for(client(srv.addr), + timeout=support.SHORT_TIMEOUT)) # No garbage is left for SSL client from loop.create_connection, even # if user stores the SSLTransport in corresponding protocol instance @@ -936,7 +938,8 @@ async def client(addr): with self.tcp_server(serve, timeout=self.TIMEOUT) as srv: self.loop.run_until_complete( - asyncio.wait_for(client(srv.addr), timeout=10)) + asyncio.wait_for(client(srv.addr), + timeout=support.SHORT_TIMEOUT)) def test_start_tls_server_1(self): HELLO_MSG = b'1' * self.PAYLOAD_SIZE @@ -1186,7 +1189,7 @@ def server(sock): async def client(addr): extras = {} - extras = dict(ssl_handshake_timeout=10.0) + extras = dict(ssl_handshake_timeout=support.SHORT_TIMEOUT) reader, writer = await asyncio.open_connection( *addr, From webhook-mailer at python.org Wed May 11 18:01:48 2022 From: webhook-mailer at python.org (vstinner) Date: Wed, 11 May 2022 22:01:48 -0000 Subject: [Python-checkins] gh-89653: PEP 670: Limited API doesn't cast arguments (#92654) Message-ID: https://github.com/python/cpython/commit/7d3b469e475e6e52ce4f0bad7198bb05ead77b1d commit: 7d3b469e475e6e52ce4f0bad7198bb05ead77b1d branch: main author: Victor Stinner committer: vstinner date: 2022-05-12T00:01:42+02:00 summary: gh-89653: PEP 670: Limited API doesn't cast arguments (#92654) The limited API version 3.11 no longer casts arguments to expected types of functions of functions: * PyList_GET_SIZE(), PyList_SET_ITEM() * PyTuple_GET_SIZE(), PyTuple_SET_ITEM() * PyWeakref_GET_OBJECT() files: M Include/cpython/listobject.h M Include/cpython/tupleobject.h M Include/cpython/weakrefobject.h diff --git a/Include/cpython/listobject.h b/Include/cpython/listobject.h index ebbea5ebf1ebc..4989cccef9f80 100644 --- a/Include/cpython/listobject.h +++ b/Include/cpython/listobject.h @@ -33,7 +33,9 @@ PyAPI_FUNC(void) _PyList_DebugMallocStats(FILE *out); static inline Py_ssize_t PyList_GET_SIZE(PyListObject *op) { return Py_SIZE(op); } -#define PyList_GET_SIZE(op) PyList_GET_SIZE(_PyList_CAST(op)) +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000 +# define PyList_GET_SIZE(op) PyList_GET_SIZE(_PyList_CAST(op)) +#endif #define PyList_GET_ITEM(op, index) (_PyList_CAST(op)->ob_item[index]) @@ -41,5 +43,7 @@ static inline void PyList_SET_ITEM(PyListObject *op, Py_ssize_t index, PyObject *value) { op->ob_item[index] = value; } +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000 #define PyList_SET_ITEM(op, index, value) \ PyList_SET_ITEM(_PyList_CAST(op), index, _PyObject_CAST(value)) +#endif diff --git a/Include/cpython/tupleobject.h b/Include/cpython/tupleobject.h index d5b810e5f4277..a41cee1759d48 100644 --- a/Include/cpython/tupleobject.h +++ b/Include/cpython/tupleobject.h @@ -22,7 +22,9 @@ PyAPI_FUNC(void) _PyTuple_MaybeUntrack(PyObject *); static inline Py_ssize_t PyTuple_GET_SIZE(PyTupleObject *op) { return Py_SIZE(op); } -#define PyTuple_GET_SIZE(op) PyTuple_GET_SIZE(_PyTuple_CAST(op)) +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000 +# define PyTuple_GET_SIZE(op) PyTuple_GET_SIZE(_PyTuple_CAST(op)) +#endif #define PyTuple_GET_ITEM(op, index) (_PyTuple_CAST(op)->ob_item[index]) @@ -31,7 +33,9 @@ static inline void PyTuple_SET_ITEM(PyTupleObject *op, Py_ssize_t index, PyObject *value) { op->ob_item[index] = value; } +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000 #define PyTuple_SET_ITEM(op, index, value) \ PyTuple_SET_ITEM(_PyTuple_CAST(op), index, _PyObject_CAST(value)) +#endif PyAPI_FUNC(void) _PyTuple_DebugMallocStats(FILE *out); diff --git a/Include/cpython/weakrefobject.h b/Include/cpython/weakrefobject.h index bec69ba90d6b9..2dbef2cea3765 100644 --- a/Include/cpython/weakrefobject.h +++ b/Include/cpython/weakrefobject.h @@ -51,4 +51,6 @@ static inline PyObject* PyWeakref_GET_OBJECT(PyObject *ref_obj) { } return Py_None; } -#define PyWeakref_GET_OBJECT(ref) PyWeakref_GET_OBJECT(_PyObject_CAST(ref)) +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000 +# define PyWeakref_GET_OBJECT(ref) PyWeakref_GET_OBJECT(_PyObject_CAST(ref)) +#endif From webhook-mailer at python.org Wed May 11 18:12:46 2022 From: webhook-mailer at python.org (vstinner) Date: Wed, 11 May 2022 22:12:46 -0000 Subject: [Python-checkins] gh-89653: Add assertions to unicodeobject.h functions (#92692) Message-ID: https://github.com/python/cpython/commit/d492f0ab2add26d89474b002a9a5a2da306222c5 commit: d492f0ab2add26d89474b002a9a5a2da306222c5 branch: main author: Victor Stinner committer: vstinner date: 2022-05-12T00:12:42+02:00 summary: gh-89653: Add assertions to unicodeobject.h functions (#92692) files: M Include/cpython/unicodeobject.h diff --git a/Include/cpython/unicodeobject.h b/Include/cpython/unicodeobject.h index 4d7173f4213dd..b271b610f6d6b 100644 --- a/Include/cpython/unicodeobject.h +++ b/Include/cpython/unicodeobject.h @@ -28,16 +28,22 @@ static inline int Py_UNICODE_IS_LOW_SURROGATE(Py_UCS4 ch) { // Join two surrogate characters and return a single Py_UCS4 value. static inline Py_UCS4 Py_UNICODE_JOIN_SURROGATES(Py_UCS4 high, Py_UCS4 low) { + assert(Py_UNICODE_IS_HIGH_SURROGATE(high)); + assert(Py_UNICODE_IS_LOW_SURROGATE(low)); return 0x10000 + (((high & 0x03FF) << 10) | (low & 0x03FF)); } -// High surrogate = top 10 bits added to D800 +// High surrogate = top 10 bits added to 0xD800. +// The character must be in the range [U+10000; U+10ffff]. static inline Py_UCS4 Py_UNICODE_HIGH_SURROGATE(Py_UCS4 ch) { + assert(0x10000 <= ch && ch <= 0x10ffff); return (0xD800 - (0x10000 >> 10) + (ch >> 10)); } -// Low surrogate = bottom 10 bits added to DC00 +// Low surrogate = bottom 10 bits added to 0xDC00. +// The character must be in the range [U+10000; U+10ffff]. static inline Py_UCS4 Py_UNICODE_LOW_SURROGATE(Py_UCS4 ch) { + assert(0x10000 <= ch && ch <= 0x10ffff); return (0xDC00 + (ch & 0x3FF)); } From webhook-mailer at python.org Wed May 11 18:32:31 2022 From: webhook-mailer at python.org (miss-islington) Date: Wed, 11 May 2022 22:32:31 -0000 Subject: [Python-checkins] gh-89653: PEP 670: Limited API doesn't cast arguments (GH-92654) Message-ID: https://github.com/python/cpython/commit/6f9287205f2fb562262750ac2e80b555ff5003ca commit: 6f9287205f2fb562262750ac2e80b555ff5003ca branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-11T15:32:04-07:00 summary: gh-89653: PEP 670: Limited API doesn't cast arguments (GH-92654) The limited API version 3.11 no longer casts arguments to expected types of functions of functions: * PyList_GET_SIZE(), PyList_SET_ITEM() * PyTuple_GET_SIZE(), PyTuple_SET_ITEM() * PyWeakref_GET_OBJECT() (cherry picked from commit 7d3b469e475e6e52ce4f0bad7198bb05ead77b1d) Co-authored-by: Victor Stinner files: M Include/cpython/listobject.h M Include/cpython/tupleobject.h M Include/cpython/weakrefobject.h diff --git a/Include/cpython/listobject.h b/Include/cpython/listobject.h index ebbea5ebf1ebc..4989cccef9f80 100644 --- a/Include/cpython/listobject.h +++ b/Include/cpython/listobject.h @@ -33,7 +33,9 @@ PyAPI_FUNC(void) _PyList_DebugMallocStats(FILE *out); static inline Py_ssize_t PyList_GET_SIZE(PyListObject *op) { return Py_SIZE(op); } -#define PyList_GET_SIZE(op) PyList_GET_SIZE(_PyList_CAST(op)) +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000 +# define PyList_GET_SIZE(op) PyList_GET_SIZE(_PyList_CAST(op)) +#endif #define PyList_GET_ITEM(op, index) (_PyList_CAST(op)->ob_item[index]) @@ -41,5 +43,7 @@ static inline void PyList_SET_ITEM(PyListObject *op, Py_ssize_t index, PyObject *value) { op->ob_item[index] = value; } +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000 #define PyList_SET_ITEM(op, index, value) \ PyList_SET_ITEM(_PyList_CAST(op), index, _PyObject_CAST(value)) +#endif diff --git a/Include/cpython/tupleobject.h b/Include/cpython/tupleobject.h index d5b810e5f4277..a41cee1759d48 100644 --- a/Include/cpython/tupleobject.h +++ b/Include/cpython/tupleobject.h @@ -22,7 +22,9 @@ PyAPI_FUNC(void) _PyTuple_MaybeUntrack(PyObject *); static inline Py_ssize_t PyTuple_GET_SIZE(PyTupleObject *op) { return Py_SIZE(op); } -#define PyTuple_GET_SIZE(op) PyTuple_GET_SIZE(_PyTuple_CAST(op)) +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000 +# define PyTuple_GET_SIZE(op) PyTuple_GET_SIZE(_PyTuple_CAST(op)) +#endif #define PyTuple_GET_ITEM(op, index) (_PyTuple_CAST(op)->ob_item[index]) @@ -31,7 +33,9 @@ static inline void PyTuple_SET_ITEM(PyTupleObject *op, Py_ssize_t index, PyObject *value) { op->ob_item[index] = value; } +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000 #define PyTuple_SET_ITEM(op, index, value) \ PyTuple_SET_ITEM(_PyTuple_CAST(op), index, _PyObject_CAST(value)) +#endif PyAPI_FUNC(void) _PyTuple_DebugMallocStats(FILE *out); diff --git a/Include/cpython/weakrefobject.h b/Include/cpython/weakrefobject.h index bec69ba90d6b9..2dbef2cea3765 100644 --- a/Include/cpython/weakrefobject.h +++ b/Include/cpython/weakrefobject.h @@ -51,4 +51,6 @@ static inline PyObject* PyWeakref_GET_OBJECT(PyObject *ref_obj) { } return Py_None; } -#define PyWeakref_GET_OBJECT(ref) PyWeakref_GET_OBJECT(_PyObject_CAST(ref)) +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000 +# define PyWeakref_GET_OBJECT(ref) PyWeakref_GET_OBJECT(_PyObject_CAST(ref)) +#endif From webhook-mailer at python.org Wed May 11 18:49:07 2022 From: webhook-mailer at python.org (vstinner) Date: Wed, 11 May 2022 22:49:07 -0000 Subject: [Python-checkins] gh-89653: PEP 670: Use PyObject* type for parameters (#92694) Message-ID: https://github.com/python/cpython/commit/6de78ef96afbaa127472bb9dc0a4e41e44555d00 commit: 6de78ef96afbaa127472bb9dc0a4e41e44555d00 branch: main author: Victor Stinner committer: vstinner date: 2022-05-12T00:49:03+02:00 summary: gh-89653: PEP 670: Use PyObject* type for parameters (#92694) Use the PyObject* type for parameters of static inline functions: * Py_SIZE(): same parameter type than PyObject_Size() * PyList_GET_SIZE(), PyList_SET_ITEM(): same parameter type than PyList_Size() and PyList_SetItem() * PyTuple_GET_SIZE(), PyTuple_SET_ITEM(): same parameter type than PyTuple_Size() and PyTuple_SetItem(). files: M Include/cpython/listobject.h M Include/cpython/tupleobject.h M Include/object.h diff --git a/Include/cpython/listobject.h b/Include/cpython/listobject.h index 4989cccef9f80..1add8213e0c09 100644 --- a/Include/cpython/listobject.h +++ b/Include/cpython/listobject.h @@ -30,20 +30,22 @@ PyAPI_FUNC(void) _PyList_DebugMallocStats(FILE *out); // Macros and static inline functions, trading safety for speed -static inline Py_ssize_t PyList_GET_SIZE(PyListObject *op) { - return Py_SIZE(op); +static inline Py_ssize_t PyList_GET_SIZE(PyObject *op) { + PyListObject *list = _PyList_CAST(op); + return Py_SIZE(list); } #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000 -# define PyList_GET_SIZE(op) PyList_GET_SIZE(_PyList_CAST(op)) +# define PyList_GET_SIZE(op) PyList_GET_SIZE(_PyObject_CAST(op)) #endif #define PyList_GET_ITEM(op, index) (_PyList_CAST(op)->ob_item[index]) static inline void -PyList_SET_ITEM(PyListObject *op, Py_ssize_t index, PyObject *value) { - op->ob_item[index] = value; +PyList_SET_ITEM(PyObject *op, Py_ssize_t index, PyObject *value) { + PyListObject *list = _PyList_CAST(op); + list->ob_item[index] = value; } #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000 #define PyList_SET_ITEM(op, index, value) \ - PyList_SET_ITEM(_PyList_CAST(op), index, _PyObject_CAST(value)) + PyList_SET_ITEM(_PyObject_CAST(op), index, _PyObject_CAST(value)) #endif diff --git a/Include/cpython/tupleobject.h b/Include/cpython/tupleobject.h index a41cee1759d48..3d9c1aff58863 100644 --- a/Include/cpython/tupleobject.h +++ b/Include/cpython/tupleobject.h @@ -19,23 +19,25 @@ PyAPI_FUNC(void) _PyTuple_MaybeUntrack(PyObject *); // Macros and static inline functions, trading safety for speed -static inline Py_ssize_t PyTuple_GET_SIZE(PyTupleObject *op) { - return Py_SIZE(op); +static inline Py_ssize_t PyTuple_GET_SIZE(PyObject *op) { + PyTupleObject *tuple = _PyTuple_CAST(op); + return Py_SIZE(tuple); } #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000 -# define PyTuple_GET_SIZE(op) PyTuple_GET_SIZE(_PyTuple_CAST(op)) +# define PyTuple_GET_SIZE(op) PyTuple_GET_SIZE(_PyObject_CAST(op)) #endif #define PyTuple_GET_ITEM(op, index) (_PyTuple_CAST(op)->ob_item[index]) /* Function *only* to be used to fill in brand new tuples */ static inline void -PyTuple_SET_ITEM(PyTupleObject *op, Py_ssize_t index, PyObject *value) { - op->ob_item[index] = value; +PyTuple_SET_ITEM(PyObject *op, Py_ssize_t index, PyObject *value) { + PyTupleObject *tuple = _PyTuple_CAST(op); + tuple->ob_item[index] = value; } #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000 #define PyTuple_SET_ITEM(op, index, value) \ - PyTuple_SET_ITEM(_PyTuple_CAST(op), index, _PyObject_CAST(value)) + PyTuple_SET_ITEM(_PyObject_CAST(op), index, _PyObject_CAST(value)) #endif PyAPI_FUNC(void) _PyTuple_DebugMallocStats(FILE *out); diff --git a/Include/object.h b/Include/object.h index fac8892f65552..f2af428e2bb97 100644 --- a/Include/object.h +++ b/Include/object.h @@ -137,11 +137,12 @@ static inline PyTypeObject* Py_TYPE(PyObject *ob) { #endif // bpo-39573: The Py_SET_SIZE() function must be used to set an object size. -static inline Py_ssize_t Py_SIZE(PyVarObject *ob) { - return ob->ob_size; +static inline Py_ssize_t Py_SIZE(PyObject *ob) { + PyVarObject *var_ob = _PyVarObject_CAST(ob); + return var_ob->ob_size; } #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000 -# define Py_SIZE(ob) Py_SIZE(_PyVarObject_CAST(ob)) +# define Py_SIZE(ob) Py_SIZE(_PyObject_CAST(ob)) #endif From webhook-mailer at python.org Wed May 11 18:54:04 2022 From: webhook-mailer at python.org (vstinner) Date: Wed, 11 May 2022 22:54:04 -0000 Subject: [Python-checkins] gh-92031, test_embed: Improve test for unquickening static code (#92440) Message-ID: https://github.com/python/cpython/commit/27185f98fff07b1da84f390f84dc9cbc7c8f0ad5 commit: 27185f98fff07b1da84f390f84dc9cbc7c8f0ad5 branch: main author: Dennis Sweeney <36520290+sweeneyde at users.noreply.github.com> committer: vstinner date: 2022-05-12T00:54:00+02:00 summary: gh-92031, test_embed: Improve test for unquickening static code (#92440) files: M Lib/test/test_embed.py diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index 169ae5cb0a06e..5ba6e3a43fdc6 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -343,19 +343,39 @@ def test_finalize_structseq(self): out, err = self.run_embedded_interpreter("test_repeated_init_exec", code) self.assertEqual(out, 'Tests passed\n' * INIT_LOOPS) - @support.skip_if_pgo_task def test_quickened_static_code_gets_unquickened_at_Py_FINALIZE(self): # https://github.com/python/cpython/issues/92031 - code = """if 1: - from importlib._bootstrap import _handle_fromlist - import dis - for name in dis.opmap: - # quicken this frozen code object. - _handle_fromlist(dis, [name], lambda *args: None) - """ + + # Do these imports outside of the code string to avoid using + # importlib too much from within the code string, so that + # _handle_fromlist doesn't get quickened until we intend it to. + from dis import _all_opmap + resume = _all_opmap["RESUME"] + resume_quick = _all_opmap["RESUME_QUICK"] + from test.test_dis import QUICKENING_WARMUP_DELAY + + code = textwrap.dedent(f"""\ + import importlib._bootstrap + func = importlib._bootstrap._handle_fromlist + code = func.__code__ + + # Assert initially unquickened. + # Use sets to account for byte order. + if set(code._co_code_adaptive[:2]) != set([{resume}, 0]): + raise AssertionError() + + for i in range({QUICKENING_WARMUP_DELAY}): + func(importlib._bootstrap, ["x"], lambda *args: None) + + # Assert quickening worked + if set(code._co_code_adaptive[:2]) != set([{resume_quick}, 0]): + raise AssertionError() + + print("Tests passed") + """) run = self.run_embedded_interpreter - for i in range(50): - out, err = run("test_repeated_init_exec", code, timeout=60) + out, err = run("test_repeated_init_exec", code) + self.assertEqual(out, 'Tests passed\n' * INIT_LOOPS) def test_ucnhash_capi_reset(self): # bpo-47182: unicodeobject.c:ucnhash_capi was not reset on shutdown. From webhook-mailer at python.org Wed May 11 18:57:03 2022 From: webhook-mailer at python.org (zooba) Date: Wed, 11 May 2022 22:57:03 -0000 Subject: [Python-checkins] Fix minor documentation error in bisect docs (GH-92697) Message-ID: https://github.com/python/cpython/commit/b3f99b69d03cf0ea72a567a81e8bc4bc074ab303 commit: b3f99b69d03cf0ea72a567a81e8bc4bc074ab303 branch: main author: Steve Dower committer: zooba date: 2022-05-11T23:56:58+01:00 summary: Fix minor documentation error in bisect docs (GH-92697) files: M Doc/library/bisect.rst diff --git a/Doc/library/bisect.rst b/Doc/library/bisect.rst index 901a41f549202..513675d3685a5 100644 --- a/Doc/library/bisect.rst +++ b/Doc/library/bisect.rst @@ -198,7 +198,7 @@ a 'B', and so on:: >>> [grade(score) for score in [33, 99, 77, 70, 89, 90, 100]] ['F', 'A', 'C', 'C', 'B', 'A', 'A'] -The :func:`bisect`function and :func:`insort` functions also work with lists of +The :func:`bisect` and :func:`insort` functions also work with lists of tuples. The *key* argument can serve to extract the field used for ordering records in a table:: From webhook-mailer at python.org Wed May 11 18:58:46 2022 From: webhook-mailer at python.org (vstinner) Date: Wed, 11 May 2022 22:58:46 -0000 Subject: [Python-checkins] gh-89653: PEP 670: Convert PyDict_GET_SIZE() macro to function (#92695) Message-ID: https://github.com/python/cpython/commit/f9b67ad7701a4d51c0c895db4087ebd66743aa82 commit: f9b67ad7701a4d51c0c895db4087ebd66743aa82 branch: main author: Victor Stinner committer: vstinner date: 2022-05-12T00:58:42+02:00 summary: gh-89653: PEP 670: Convert PyDict_GET_SIZE() macro to function (#92695) The limited C API version 3.12 no longer casts the argument. files: M Include/cpython/dictobject.h diff --git a/Include/cpython/dictobject.h b/Include/cpython/dictobject.h index 033eaeb4c9751..f249c0e9ca5e2 100644 --- a/Include/cpython/dictobject.h +++ b/Include/cpython/dictobject.h @@ -46,7 +46,15 @@ PyAPI_FUNC(int) _PyDict_Next( PyObject *mp, Py_ssize_t *pos, PyObject **key, PyObject **value, Py_hash_t *hash); /* Get the number of items of a dictionary. */ -#define PyDict_GET_SIZE(mp) (assert(PyDict_Check(mp)),((PyDictObject *)mp)->ma_used) +static inline Py_ssize_t PyDict_GET_SIZE(PyObject *op) { + assert(PyDict_Check(op)); + PyDictObject *mp = _Py_CAST(PyDictObject*, op); + return mp->ma_used; +} +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030c0000 +# define PyDict_GET_SIZE(op) PyDict_GET_SIZE(_PyObject_CAST(op)) +#endif + PyAPI_FUNC(int) _PyDict_Contains_KnownHash(PyObject *, PyObject *, Py_hash_t); PyAPI_FUNC(int) _PyDict_ContainsId(PyObject *, _Py_Identifier *); PyAPI_FUNC(PyObject *) _PyDict_NewPresized(Py_ssize_t minused); From webhook-mailer at python.org Wed May 11 19:12:21 2022 From: webhook-mailer at python.org (miss-islington) Date: Wed, 11 May 2022 23:12:21 -0000 Subject: [Python-checkins] Fix minor documentation error in bisect docs (GH-92697) Message-ID: https://github.com/python/cpython/commit/9f29bdd8f07491d765a3730fcbf5826938b64dc4 commit: 9f29bdd8f07491d765a3730fcbf5826938b64dc4 branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-11T16:12:17-07:00 summary: Fix minor documentation error in bisect docs (GH-92697) (cherry picked from commit b3f99b69d03cf0ea72a567a81e8bc4bc074ab303) Co-authored-by: Steve Dower files: M Doc/library/bisect.rst diff --git a/Doc/library/bisect.rst b/Doc/library/bisect.rst index 901a41f549202..513675d3685a5 100644 --- a/Doc/library/bisect.rst +++ b/Doc/library/bisect.rst @@ -198,7 +198,7 @@ a 'B', and so on:: >>> [grade(score) for score in [33, 99, 77, 70, 89, 90, 100]] ['F', 'A', 'C', 'C', 'B', 'A', 'A'] -The :func:`bisect`function and :func:`insort` functions also work with lists of +The :func:`bisect` and :func:`insort` functions also work with lists of tuples. The *key* argument can serve to extract the field used for ordering records in a table:: From webhook-mailer at python.org Wed May 11 19:13:17 2022 From: webhook-mailer at python.org (miss-islington) Date: Wed, 11 May 2022 23:13:17 -0000 Subject: [Python-checkins] Fix minor documentation error in bisect docs (GH-92697) Message-ID: https://github.com/python/cpython/commit/bf86901dc122a34bffb858d468f51667036bd73f commit: bf86901dc122a34bffb858d468f51667036bd73f branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-11T16:13:13-07:00 summary: Fix minor documentation error in bisect docs (GH-92697) (cherry picked from commit b3f99b69d03cf0ea72a567a81e8bc4bc074ab303) Co-authored-by: Steve Dower files: M Doc/library/bisect.rst diff --git a/Doc/library/bisect.rst b/Doc/library/bisect.rst index 901a41f549202..513675d3685a5 100644 --- a/Doc/library/bisect.rst +++ b/Doc/library/bisect.rst @@ -198,7 +198,7 @@ a 'B', and so on:: >>> [grade(score) for score in [33, 99, 77, 70, 89, 90, 100]] ['F', 'A', 'C', 'C', 'B', 'A', 'A'] -The :func:`bisect`function and :func:`insort` functions also work with lists of +The :func:`bisect` and :func:`insort` functions also work with lists of tuples. The *key* argument can serve to extract the field used for ordering records in a table:: From webhook-mailer at python.org Wed May 11 19:23:04 2022 From: webhook-mailer at python.org (miss-islington) Date: Wed, 11 May 2022 23:23:04 -0000 Subject: [Python-checkins] gh-92031, test_embed: Improve test for unquickening static code (GH-92440) Message-ID: https://github.com/python/cpython/commit/c7b9da5204b44fd3e9960a2326d431e3ff5c8667 commit: c7b9da5204b44fd3e9960a2326d431e3ff5c8667 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-11T16:22:45-07:00 summary: gh-92031, test_embed: Improve test for unquickening static code (GH-92440) (cherry picked from commit 27185f98fff07b1da84f390f84dc9cbc7c8f0ad5) Co-authored-by: Dennis Sweeney <36520290+sweeneyde at users.noreply.github.com> files: M Lib/test/test_embed.py diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index 169ae5cb0a06e..5ba6e3a43fdc6 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -343,19 +343,39 @@ def test_finalize_structseq(self): out, err = self.run_embedded_interpreter("test_repeated_init_exec", code) self.assertEqual(out, 'Tests passed\n' * INIT_LOOPS) - @support.skip_if_pgo_task def test_quickened_static_code_gets_unquickened_at_Py_FINALIZE(self): # https://github.com/python/cpython/issues/92031 - code = """if 1: - from importlib._bootstrap import _handle_fromlist - import dis - for name in dis.opmap: - # quicken this frozen code object. - _handle_fromlist(dis, [name], lambda *args: None) - """ + + # Do these imports outside of the code string to avoid using + # importlib too much from within the code string, so that + # _handle_fromlist doesn't get quickened until we intend it to. + from dis import _all_opmap + resume = _all_opmap["RESUME"] + resume_quick = _all_opmap["RESUME_QUICK"] + from test.test_dis import QUICKENING_WARMUP_DELAY + + code = textwrap.dedent(f"""\ + import importlib._bootstrap + func = importlib._bootstrap._handle_fromlist + code = func.__code__ + + # Assert initially unquickened. + # Use sets to account for byte order. + if set(code._co_code_adaptive[:2]) != set([{resume}, 0]): + raise AssertionError() + + for i in range({QUICKENING_WARMUP_DELAY}): + func(importlib._bootstrap, ["x"], lambda *args: None) + + # Assert quickening worked + if set(code._co_code_adaptive[:2]) != set([{resume_quick}, 0]): + raise AssertionError() + + print("Tests passed") + """) run = self.run_embedded_interpreter - for i in range(50): - out, err = run("test_repeated_init_exec", code, timeout=60) + out, err = run("test_repeated_init_exec", code) + self.assertEqual(out, 'Tests passed\n' * INIT_LOOPS) def test_ucnhash_capi_reset(self): # bpo-47182: unicodeobject.c:ucnhash_capi was not reset on shutdown. From webhook-mailer at python.org Wed May 11 19:23:43 2022 From: webhook-mailer at python.org (miss-islington) Date: Wed, 11 May 2022 23:23:43 -0000 Subject: [Python-checkins] gh-89653: PEP 670: Use PyObject* type for parameters (GH-92694) Message-ID: https://github.com/python/cpython/commit/a1bef8c2e305178fae2ff90b5772e785a97d2201 commit: a1bef8c2e305178fae2ff90b5772e785a97d2201 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-11T16:23:29-07:00 summary: gh-89653: PEP 670: Use PyObject* type for parameters (GH-92694) Use the PyObject* type for parameters of static inline functions: * Py_SIZE(): same parameter type than PyObject_Size() * PyList_GET_SIZE(), PyList_SET_ITEM(): same parameter type than PyList_Size() and PyList_SetItem() * PyTuple_GET_SIZE(), PyTuple_SET_ITEM(): same parameter type than PyTuple_Size() and PyTuple_SetItem(). (cherry picked from commit 6de78ef96afbaa127472bb9dc0a4e41e44555d00) Co-authored-by: Victor Stinner files: M Include/cpython/listobject.h M Include/cpython/tupleobject.h M Include/object.h diff --git a/Include/cpython/listobject.h b/Include/cpython/listobject.h index 4989cccef9f80..1add8213e0c09 100644 --- a/Include/cpython/listobject.h +++ b/Include/cpython/listobject.h @@ -30,20 +30,22 @@ PyAPI_FUNC(void) _PyList_DebugMallocStats(FILE *out); // Macros and static inline functions, trading safety for speed -static inline Py_ssize_t PyList_GET_SIZE(PyListObject *op) { - return Py_SIZE(op); +static inline Py_ssize_t PyList_GET_SIZE(PyObject *op) { + PyListObject *list = _PyList_CAST(op); + return Py_SIZE(list); } #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000 -# define PyList_GET_SIZE(op) PyList_GET_SIZE(_PyList_CAST(op)) +# define PyList_GET_SIZE(op) PyList_GET_SIZE(_PyObject_CAST(op)) #endif #define PyList_GET_ITEM(op, index) (_PyList_CAST(op)->ob_item[index]) static inline void -PyList_SET_ITEM(PyListObject *op, Py_ssize_t index, PyObject *value) { - op->ob_item[index] = value; +PyList_SET_ITEM(PyObject *op, Py_ssize_t index, PyObject *value) { + PyListObject *list = _PyList_CAST(op); + list->ob_item[index] = value; } #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000 #define PyList_SET_ITEM(op, index, value) \ - PyList_SET_ITEM(_PyList_CAST(op), index, _PyObject_CAST(value)) + PyList_SET_ITEM(_PyObject_CAST(op), index, _PyObject_CAST(value)) #endif diff --git a/Include/cpython/tupleobject.h b/Include/cpython/tupleobject.h index a41cee1759d48..3d9c1aff58863 100644 --- a/Include/cpython/tupleobject.h +++ b/Include/cpython/tupleobject.h @@ -19,23 +19,25 @@ PyAPI_FUNC(void) _PyTuple_MaybeUntrack(PyObject *); // Macros and static inline functions, trading safety for speed -static inline Py_ssize_t PyTuple_GET_SIZE(PyTupleObject *op) { - return Py_SIZE(op); +static inline Py_ssize_t PyTuple_GET_SIZE(PyObject *op) { + PyTupleObject *tuple = _PyTuple_CAST(op); + return Py_SIZE(tuple); } #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000 -# define PyTuple_GET_SIZE(op) PyTuple_GET_SIZE(_PyTuple_CAST(op)) +# define PyTuple_GET_SIZE(op) PyTuple_GET_SIZE(_PyObject_CAST(op)) #endif #define PyTuple_GET_ITEM(op, index) (_PyTuple_CAST(op)->ob_item[index]) /* Function *only* to be used to fill in brand new tuples */ static inline void -PyTuple_SET_ITEM(PyTupleObject *op, Py_ssize_t index, PyObject *value) { - op->ob_item[index] = value; +PyTuple_SET_ITEM(PyObject *op, Py_ssize_t index, PyObject *value) { + PyTupleObject *tuple = _PyTuple_CAST(op); + tuple->ob_item[index] = value; } #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000 #define PyTuple_SET_ITEM(op, index, value) \ - PyTuple_SET_ITEM(_PyTuple_CAST(op), index, _PyObject_CAST(value)) + PyTuple_SET_ITEM(_PyObject_CAST(op), index, _PyObject_CAST(value)) #endif PyAPI_FUNC(void) _PyTuple_DebugMallocStats(FILE *out); diff --git a/Include/object.h b/Include/object.h index fac8892f65552..f2af428e2bb97 100644 --- a/Include/object.h +++ b/Include/object.h @@ -137,11 +137,12 @@ static inline PyTypeObject* Py_TYPE(PyObject *ob) { #endif // bpo-39573: The Py_SET_SIZE() function must be used to set an object size. -static inline Py_ssize_t Py_SIZE(PyVarObject *ob) { - return ob->ob_size; +static inline Py_ssize_t Py_SIZE(PyObject *ob) { + PyVarObject *var_ob = _PyVarObject_CAST(ob); + return var_ob->ob_size; } #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000 -# define Py_SIZE(ob) Py_SIZE(_PyVarObject_CAST(ob)) +# define Py_SIZE(ob) Py_SIZE(_PyObject_CAST(ob)) #endif From webhook-mailer at python.org Wed May 11 19:34:04 2022 From: webhook-mailer at python.org (vstinner) Date: Wed, 11 May 2022 23:34:04 -0000 Subject: [Python-checkins] gh-89653: PEP 670: Update C API unicode documentation (#92702) Message-ID: https://github.com/python/cpython/commit/92f0ed1d90bb3338fb36dbeb997e495ab474ae1e commit: 92f0ed1d90bb3338fb36dbeb997e495ab474ae1e branch: main author: Victor Stinner committer: vstinner date: 2022-05-12T01:33:52+02:00 summary: gh-89653: PEP 670: Update C API unicode documentation (#92702) files: M Doc/c-api/unicode.rst diff --git a/Doc/c-api/unicode.rst b/Doc/c-api/unicode.rst index d139112578ca9..a695daa306b1a 100644 --- a/Doc/c-api/unicode.rst +++ b/Doc/c-api/unicode.rst @@ -130,7 +130,7 @@ access to internal read-only data of Unicode objects: Return a pointer to the canonical representation cast to UCS1, UCS2 or UCS4 integer types for direct character access. No checks are performed if the canonical representation has the correct character size; use - :c:func:`PyUnicode_KIND` to select the right macro. Make sure + :c:func:`PyUnicode_KIND` to select the right function. Make sure :c:func:`PyUnicode_READY` has been called before accessing this. .. versionadded:: 3.3 @@ -360,40 +360,41 @@ These APIs can be used for fast direct character conversions: .. c:function:: int Py_UNICODE_TODECIMAL(Py_UCS4 ch) Return the character *ch* converted to a decimal positive integer. Return - ``-1`` if this is not possible. This macro does not raise exceptions. + ``-1`` if this is not possible. This function does not raise exceptions. .. c:function:: int Py_UNICODE_TODIGIT(Py_UCS4 ch) Return the character *ch* converted to a single digit integer. Return ``-1`` if - this is not possible. This macro does not raise exceptions. + this is not possible. This function does not raise exceptions. .. c:function:: double Py_UNICODE_TONUMERIC(Py_UCS4 ch) Return the character *ch* converted to a double. Return ``-1.0`` if this is not - possible. This macro does not raise exceptions. + possible. This function does not raise exceptions. These APIs can be used to work with surrogates: -.. c:macro:: Py_UNICODE_IS_SURROGATE(ch) +.. c:func:: int Py_UNICODE_IS_SURROGATE(Py_UCS4 ch) Check if *ch* is a surrogate (``0xD800 <= ch <= 0xDFFF``). -.. c:macro:: Py_UNICODE_IS_HIGH_SURROGATE(ch) +.. c:func:: int Py_UNICODE_IS_HIGH_SURROGATE(Py_UCS4 ch) Check if *ch* is a high surrogate (``0xD800 <= ch <= 0xDBFF``). -.. c:macro:: Py_UNICODE_IS_LOW_SURROGATE(ch) +.. c:func:: int Py_UNICODE_IS_LOW_SURROGATE(Py_UCS4 ch) Check if *ch* is a low surrogate (``0xDC00 <= ch <= 0xDFFF``). -.. c:macro:: Py_UNICODE_JOIN_SURROGATES(high, low) +.. c:func:: Py_UCS4 Py_UNICODE_JOIN_SURROGATES(Py_UCS4 high, Py_UCS4 low) - Join two surrogate characters and return a single Py_UCS4 value. + Join two surrogate characters and return a single :c:type:`Py_UCS4` value. *high* and *low* are respectively the leading and trailing surrogates in a - surrogate pair. + surrogate pair. *high* must be in the range [0xD800; 0xDBFF] and *low* must + be in the range [0xDC00; 0xDFFF]. Creating and accessing Unicode strings From webhook-mailer at python.org Wed May 11 19:35:50 2022 From: webhook-mailer at python.org (vstinner) Date: Wed, 11 May 2022 23:35:50 -0000 Subject: [Python-checkins] gh-89653: PEP 670: unicodeobject.h uses _Py_CAST() (#92696) Message-ID: https://github.com/python/cpython/commit/d0c9353a79c2003385c83892db5dfd4e443474c9 commit: d0c9353a79c2003385c83892db5dfd4e443474c9 branch: main author: Victor Stinner committer: vstinner date: 2022-05-12T01:35:41+02:00 summary: gh-89653: PEP 670: unicodeobject.h uses _Py_CAST() (#92696) Use _Py_CAST() and _Py_STATIC_CAST() in macros wrapping static inline functions of unicodeobject.h. Change also the kind type from unsigned int to int: same parameter type than PyUnicode_FromKindAndData(). The limited API version 3.11 no longer casts arguments to expected types. files: M Doc/c-api/unicode.rst M Include/cpython/unicodeobject.h diff --git a/Doc/c-api/unicode.rst b/Doc/c-api/unicode.rst index a695daa306b1a..d1e6b34dff71d 100644 --- a/Doc/c-api/unicode.rst +++ b/Doc/c-api/unicode.rst @@ -149,7 +149,7 @@ access to internal read-only data of Unicode objects: ``PyUnicode_WCHAR_KIND`` is deprecated. -.. c:function:: unsigned int PyUnicode_KIND(PyObject *o) +.. c:function:: int PyUnicode_KIND(PyObject *o) Return one of the PyUnicode kind constants (see above) that indicate how many bytes per character this Unicode object uses to store its data. *o* has to @@ -168,7 +168,7 @@ access to internal read-only data of Unicode objects: .. versionadded:: 3.3 -.. c:function:: void PyUnicode_WRITE(unsigned int kind, void *data, \ +.. c:function:: void PyUnicode_WRITE(int kind, void *data, \ Py_ssize_t index, Py_UCS4 value) Write into a canonical representation *data* (as obtained with @@ -181,7 +181,7 @@ access to internal read-only data of Unicode objects: .. versionadded:: 3.3 -.. c:function:: Py_UCS4 PyUnicode_READ(unsigned int kind, void *data, \ +.. c:function:: Py_UCS4 PyUnicode_READ(int kind, void *data, \ Py_ssize_t index) Read a code point from a canonical representation *data* (as obtained with diff --git a/Include/cpython/unicodeobject.h b/Include/cpython/unicodeobject.h index b271b610f6d6b..1e3bdad3dfd1f 100644 --- a/Include/cpython/unicodeobject.h +++ b/Include/cpython/unicodeobject.h @@ -351,7 +351,7 @@ static inline Py_ssize_t PyUnicode_GET_LENGTH(PyObject *op) { kind and data pointers obtained from other function calls. index is the index in the string (starts at 0) and value is the new code point value which should be written to that location. */ -static inline void PyUnicode_WRITE(unsigned int kind, void *data, +static inline void PyUnicode_WRITE(int kind, void *data, Py_ssize_t index, Py_UCS4 value) { if (kind == PyUnicode_1BYTE_KIND) { @@ -368,12 +368,15 @@ static inline void PyUnicode_WRITE(unsigned int kind, void *data, _Py_STATIC_CAST(Py_UCS4*, data)[index] = value; } } +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000 #define PyUnicode_WRITE(kind, data, index, value) \ - PyUnicode_WRITE((unsigned int)(kind), (void*)(data), (index), (Py_UCS4)(value)) + PyUnicode_WRITE(_Py_STATIC_CAST(int, kind), _Py_CAST(void*, data), \ + (index), _Py_STATIC_CAST(Py_UCS4, value)) +#endif /* Read a code point from the string's canonical representation. No checks or ready calls are performed. */ -static inline Py_UCS4 PyUnicode_READ(unsigned int kind, +static inline Py_UCS4 PyUnicode_READ(int kind, const void *data, Py_ssize_t index) { if (kind == PyUnicode_1BYTE_KIND) { @@ -385,8 +388,11 @@ static inline Py_UCS4 PyUnicode_READ(unsigned int kind, assert(kind == PyUnicode_4BYTE_KIND); return _Py_STATIC_CAST(const Py_UCS4*, data)[index]; } +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000 #define PyUnicode_READ(kind, data, index) \ - PyUnicode_READ((unsigned int)(kind), (const void*)(data), (index)) + PyUnicode_READ(_Py_STATIC_CAST(int, kind), _Py_CAST(const void*, data), \ + (index)) +#endif /* PyUnicode_READ_CHAR() is less efficient than PyUnicode_READ() because it calls PyUnicode_KIND() and might call it twice. For single reads, use @@ -395,7 +401,7 @@ static inline Py_UCS4 PyUnicode_READ(unsigned int kind, static inline Py_UCS4 PyUnicode_READ_CHAR(PyObject *unicode, Py_ssize_t index) { assert(PyUnicode_IS_READY(unicode)); - unsigned int kind = PyUnicode_KIND(unicode); + int kind = PyUnicode_KIND(unicode); if (kind == PyUnicode_1BYTE_KIND) { return PyUnicode_1BYTE_DATA(unicode)[index]; } @@ -420,7 +426,7 @@ static inline Py_UCS4 PyUnicode_MAX_CHAR_VALUE(PyObject *op) return 0x7fU; } - unsigned int kind = PyUnicode_KIND(op); + int kind = PyUnicode_KIND(op); if (kind == PyUnicode_1BYTE_KIND) { return 0xffU; } From webhook-mailer at python.org Wed May 11 20:01:47 2022 From: webhook-mailer at python.org (vstinner) Date: Thu, 12 May 2022 00:01:47 -0000 Subject: [Python-checkins] gh-89653: PEP 670: unicodeobject.h uses _Py_CAST() (GH-92696) (GH-92703) Message-ID: https://github.com/python/cpython/commit/6e1a214426f968cd759ebd06e1a3f9d06ab32d7c commit: 6e1a214426f968cd759ebd06e1a3f9d06ab32d7c branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: vstinner date: 2022-05-12T02:01:35+02:00 summary: gh-89653: PEP 670: unicodeobject.h uses _Py_CAST() (GH-92696) (GH-92703) Use _Py_CAST() and _Py_STATIC_CAST() in macros wrapping static inline functions of unicodeobject.h. Change also the kind type from unsigned int to int: same parameter type than PyUnicode_FromKindAndData(). The limited API version 3.11 no longer casts arguments to expected types. (cherry picked from commit d0c9353a79c2003385c83892db5dfd4e443474c9) Co-authored-by: Victor Stinner Co-authored-by: Victor Stinner files: M Doc/c-api/unicode.rst M Include/cpython/unicodeobject.h diff --git a/Doc/c-api/unicode.rst b/Doc/c-api/unicode.rst index d139112578ca9..ae24477fa45c8 100644 --- a/Doc/c-api/unicode.rst +++ b/Doc/c-api/unicode.rst @@ -149,7 +149,7 @@ access to internal read-only data of Unicode objects: ``PyUnicode_WCHAR_KIND`` is deprecated. -.. c:function:: unsigned int PyUnicode_KIND(PyObject *o) +.. c:function:: int PyUnicode_KIND(PyObject *o) Return one of the PyUnicode kind constants (see above) that indicate how many bytes per character this Unicode object uses to store its data. *o* has to @@ -168,7 +168,7 @@ access to internal read-only data of Unicode objects: .. versionadded:: 3.3 -.. c:function:: void PyUnicode_WRITE(unsigned int kind, void *data, \ +.. c:function:: void PyUnicode_WRITE(int kind, void *data, \ Py_ssize_t index, Py_UCS4 value) Write into a canonical representation *data* (as obtained with @@ -181,7 +181,7 @@ access to internal read-only data of Unicode objects: .. versionadded:: 3.3 -.. c:function:: Py_UCS4 PyUnicode_READ(unsigned int kind, void *data, \ +.. c:function:: Py_UCS4 PyUnicode_READ(int kind, void *data, \ Py_ssize_t index) Read a code point from a canonical representation *data* (as obtained with diff --git a/Include/cpython/unicodeobject.h b/Include/cpython/unicodeobject.h index 8e182d0fbf799..fdbcb1cf403ae 100644 --- a/Include/cpython/unicodeobject.h +++ b/Include/cpython/unicodeobject.h @@ -367,7 +367,7 @@ static inline Py_ssize_t PyUnicode_GET_LENGTH(PyObject *op) { kind and data pointers obtained from other function calls. index is the index in the string (starts at 0) and value is the new code point value which should be written to that location. */ -static inline void PyUnicode_WRITE(unsigned int kind, void *data, +static inline void PyUnicode_WRITE(int kind, void *data, Py_ssize_t index, Py_UCS4 value) { if (kind == PyUnicode_1BYTE_KIND) { @@ -384,12 +384,15 @@ static inline void PyUnicode_WRITE(unsigned int kind, void *data, _Py_STATIC_CAST(Py_UCS4*, data)[index] = value; } } +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000 #define PyUnicode_WRITE(kind, data, index, value) \ - PyUnicode_WRITE((unsigned int)(kind), (void*)(data), (index), (Py_UCS4)(value)) + PyUnicode_WRITE(_Py_STATIC_CAST(int, kind), _Py_CAST(void*, data), \ + (index), _Py_STATIC_CAST(Py_UCS4, value)) +#endif /* Read a code point from the string's canonical representation. No checks or ready calls are performed. */ -static inline Py_UCS4 PyUnicode_READ(unsigned int kind, +static inline Py_UCS4 PyUnicode_READ(int kind, const void *data, Py_ssize_t index) { if (kind == PyUnicode_1BYTE_KIND) { @@ -401,8 +404,11 @@ static inline Py_UCS4 PyUnicode_READ(unsigned int kind, assert(kind == PyUnicode_4BYTE_KIND); return _Py_STATIC_CAST(const Py_UCS4*, data)[index]; } +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000 #define PyUnicode_READ(kind, data, index) \ - PyUnicode_READ((unsigned int)(kind), (const void*)(data), (index)) + PyUnicode_READ(_Py_STATIC_CAST(int, kind), _Py_CAST(const void*, data), \ + (index)) +#endif /* PyUnicode_READ_CHAR() is less efficient than PyUnicode_READ() because it calls PyUnicode_KIND() and might call it twice. For single reads, use @@ -411,7 +417,7 @@ static inline Py_UCS4 PyUnicode_READ(unsigned int kind, static inline Py_UCS4 PyUnicode_READ_CHAR(PyObject *unicode, Py_ssize_t index) { assert(PyUnicode_IS_READY(unicode)); - unsigned int kind = PyUnicode_KIND(unicode); + int kind = PyUnicode_KIND(unicode); if (kind == PyUnicode_1BYTE_KIND) { return PyUnicode_1BYTE_DATA(unicode)[index]; } @@ -436,7 +442,7 @@ static inline Py_UCS4 PyUnicode_MAX_CHAR_VALUE(PyObject *op) return 0x7fU; } - unsigned int kind = PyUnicode_KIND(op); + int kind = PyUnicode_KIND(op); if (kind == PyUnicode_1BYTE_KIND) { return 0xffU; } From webhook-mailer at python.org Wed May 11 20:21:54 2022 From: webhook-mailer at python.org (zooba) Date: Thu, 12 May 2022 00:21:54 -0000 Subject: [Python-checkins] bpo-42627: Fix incorrect parsing of Windows registry proxy settings (GH-26307) Message-ID: https://github.com/python/cpython/commit/9743524fc14db39e2f309cf3d372c7e8e18fc93a commit: 9743524fc14db39e2f309cf3d372c7e8e18fc93a branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: zooba date: 2022-05-12T01:21:39+01:00 summary: bpo-42627: Fix incorrect parsing of Windows registry proxy settings (GH-26307) (cherry picked from commit b69297ea23c0ab9866ae8bd26a347a9b5df567a6) Co-authored-by: ??? files: A Misc/NEWS.d/next/Library/2021-05-22-07-58-59.bpo-42627.EejtD0.rst M Lib/urllib/request.py diff --git a/Lib/urllib/request.py b/Lib/urllib/request.py index 34b1b0b0b7643..a0ef60b30de91 100644 --- a/Lib/urllib/request.py +++ b/Lib/urllib/request.py @@ -2674,22 +2674,26 @@ def getproxies_registry(): # Returned as Unicode but problems if not converted to ASCII proxyServer = str(winreg.QueryValueEx(internetSettings, 'ProxyServer')[0]) - if '=' in proxyServer: - # Per-protocol settings - for p in proxyServer.split(';'): - protocol, address = p.split('=', 1) - # See if address has a type:// prefix - if not re.match('(?:[^/:]+)://', address): - address = '%s://%s' % (protocol, address) - proxies[protocol] = address - else: - # Use one setting for all protocols - if proxyServer[:5] == 'http:': - proxies['http'] = proxyServer - else: - proxies['http'] = 'http://%s' % proxyServer - proxies['https'] = 'https://%s' % proxyServer - proxies['ftp'] = 'ftp://%s' % proxyServer + if '=' not in proxyServer and ';' not in proxyServer: + # Use one setting for all protocols. + proxyServer = 'http={0};https={0};ftp={0}'.format(proxyServer) + for p in proxyServer.split(';'): + protocol, address = p.split('=', 1) + # See if address has a type:// prefix + if not re.match('(?:[^/:]+)://', address): + # Add type:// prefix to address without specifying type + if protocol in ('http', 'https', 'ftp'): + # The default proxy type of Windows is HTTP + address = 'http://' + address + elif protocol == 'socks': + address = 'socks://' + address + proxies[protocol] = address + # Use SOCKS proxy for HTTP(S) protocols + if proxies.get('socks'): + # The default SOCKS proxy type of Windows is SOCKS4 + address = re.sub(r'^socks://', 'socks4://', proxies['socks']) + proxies['http'] = proxies.get('http') or address + proxies['https'] = proxies.get('https') or address internetSettings.Close() except (OSError, ValueError, TypeError): # Either registry key not found etc, or the value in an diff --git a/Misc/NEWS.d/next/Library/2021-05-22-07-58-59.bpo-42627.EejtD0.rst b/Misc/NEWS.d/next/Library/2021-05-22-07-58-59.bpo-42627.EejtD0.rst new file mode 100644 index 0000000000000..f165b9ced05d9 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2021-05-22-07-58-59.bpo-42627.EejtD0.rst @@ -0,0 +1 @@ +Fix incorrect parsing of Windows registry proxy settings From webhook-mailer at python.org Wed May 11 21:38:53 2022 From: webhook-mailer at python.org (vstinner) Date: Thu, 12 May 2022 01:38:53 -0000 Subject: [Python-checkins] gh-89653: PEP 670: Fix Sphinx syntax in Unicode doc (#92707) Message-ID: https://github.com/python/cpython/commit/1a9645f5374325b41b559138ce9edb61da032b1e commit: 1a9645f5374325b41b559138ce9edb61da032b1e branch: main author: Victor Stinner committer: vstinner date: 2022-05-12T03:38:49+02:00 summary: gh-89653: PEP 670: Fix Sphinx syntax in Unicode doc (#92707) files: M Doc/c-api/unicode.rst diff --git a/Doc/c-api/unicode.rst b/Doc/c-api/unicode.rst index d1e6b34dff71d..792a469c5566f 100644 --- a/Doc/c-api/unicode.rst +++ b/Doc/c-api/unicode.rst @@ -377,19 +377,19 @@ These APIs can be used for fast direct character conversions: These APIs can be used to work with surrogates: -.. c:func:: int Py_UNICODE_IS_SURROGATE(Py_UCS4 ch) +.. c:function:: int Py_UNICODE_IS_SURROGATE(Py_UCS4 ch) Check if *ch* is a surrogate (``0xD800 <= ch <= 0xDFFF``). -.. c:func:: int Py_UNICODE_IS_HIGH_SURROGATE(Py_UCS4 ch) +.. c:function:: int Py_UNICODE_IS_HIGH_SURROGATE(Py_UCS4 ch) Check if *ch* is a high surrogate (``0xD800 <= ch <= 0xDBFF``). -.. c:func:: int Py_UNICODE_IS_LOW_SURROGATE(Py_UCS4 ch) +.. c:function:: int Py_UNICODE_IS_LOW_SURROGATE(Py_UCS4 ch) Check if *ch* is a low surrogate (``0xDC00 <= ch <= 0xDFFF``). -.. c:func:: Py_UCS4 Py_UNICODE_JOIN_SURROGATES(Py_UCS4 high, Py_UCS4 low) +.. c:function:: Py_UCS4 Py_UNICODE_JOIN_SURROGATES(Py_UCS4 high, Py_UCS4 low) Join two surrogate characters and return a single :c:type:`Py_UCS4` value. *high* and *low* are respectively the leading and trailing surrogates in a From webhook-mailer at python.org Wed May 11 23:25:49 2022 From: webhook-mailer at python.org (miss-islington) Date: Thu, 12 May 2022 03:25:49 -0000 Subject: [Python-checkins] Fix typo in argparse docs. (GH-92691) Message-ID: https://github.com/python/cpython/commit/f67d71b431af064409c1f41f6d73becee01882ae commit: f67d71b431af064409c1f41f6d73becee01882ae branch: main author: thueringa committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-11T20:25:09-07:00 summary: Fix typo in argparse docs. (GH-92691) # Fix typo in argparse docs. > Sometimes, when dealing with **a** particularly long argument list**s**, [...] Mixture between plural and singular forms is incorrect. Use singular consistently since typically only a single argument list is employed. Change to: > Sometimes, when dealing with a particularly long argument list, [...] No issue was opened, since this is a trivial change. Automerge-Triggered-By: GH:rhettinger files: M Doc/library/argparse.rst diff --git a/Doc/library/argparse.rst b/Doc/library/argparse.rst index b5a2b794c2385..1f40e4a84505d 100644 --- a/Doc/library/argparse.rst +++ b/Doc/library/argparse.rst @@ -555,7 +555,7 @@ disallowed. fromfile_prefix_chars ^^^^^^^^^^^^^^^^^^^^^ -Sometimes, when dealing with a particularly long argument lists, it +Sometimes, when dealing with a particularly long argument list, it may make sense to keep the list of arguments in a file rather than typing it out at the command line. If the ``fromfile_prefix_chars=`` argument is given to the :class:`ArgumentParser` constructor, then arguments that start with any of the From webhook-mailer at python.org Thu May 12 00:55:33 2022 From: webhook-mailer at python.org (rhettinger) Date: Thu, 12 May 2022 04:55:33 -0000 Subject: [Python-checkins] gh-86388 Remove deprecated behaviors in randrange() (#92677) Message-ID: https://github.com/python/cpython/commit/68fec31364e96d122aae0571c14683b4ddb0ebd0 commit: 68fec31364e96d122aae0571c14683b4ddb0ebd0 branch: main author: Raymond Hettinger committer: rhettinger date: 2022-05-11T23:54:51-05:00 summary: gh-86388 Remove deprecated behaviors in randrange() (#92677) files: A Misc/NEWS.d/next/Library/2022-05-11-10-06-31.gh-issue-86388.7ivUtT.rst M Doc/library/random.rst M Doc/whatsnew/3.12.rst M Lib/random.py M Lib/test/test_random.py diff --git a/Doc/library/random.rst b/Doc/library/random.rst index 72881b56a4b18..613fbce0fdf20 100644 --- a/Doc/library/random.rst +++ b/Doc/library/random.rst @@ -123,27 +123,26 @@ Functions for integers .. function:: randrange(stop) randrange(start, stop[, step]) - Return a randomly selected element from ``range(start, stop, step)``. This is - equivalent to ``choice(range(start, stop, step))``, but doesn't actually build a - range object. + Return a randomly selected element from ``range(start, stop, step)``. - The positional argument pattern matches that of :func:`range`. Keyword arguments - should not be used because the function may use them in unexpected ways. + This is roughly equivalent to ``choice(range(start, stop, step))`` but + supports arbitrarily large ranges and is optimized for common cases. + + The positional argument pattern matches the :func:`range` function. + + Keyword arguments should not be used because they can interpreted + in unexpected ways. For example ``range(start=100)`` is interpreted + as ``range(0, 100, 1)``. .. versionchanged:: 3.2 :meth:`randrange` is more sophisticated about producing equally distributed values. Formerly it used a style like ``int(random()*n)`` which could produce slightly uneven distributions. - .. deprecated:: 3.10 - The automatic conversion of non-integer types to equivalent integers is - deprecated. Currently ``randrange(10.0)`` is losslessly converted to - ``randrange(10)``. In the future, this will raise a :exc:`TypeError`. - - .. deprecated:: 3.10 - The exception raised for non-integral values such as ``randrange(10.5)`` - or ``randrange('10')`` will be changed from :exc:`ValueError` to - :exc:`TypeError`. + .. versionchanged:: 3.12 + Automatic conversion of non-integer types is no longer supported. + Calls such as ``randrange(10.0)`` and ``randrange(Fraction(10, 1))`` + now raise a :exc:`TypeError`. .. function:: randint(a, b) diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst index bc354c36cdaea..58fcb7d298da7 100644 --- a/Doc/whatsnew/3.12.rst +++ b/Doc/whatsnew/3.12.rst @@ -102,8 +102,6 @@ Deprecated Removed ======= - - Porting to Python 3.12 ====================== @@ -120,6 +118,14 @@ Changes in the Python API contain ASCII letters and digits and underscore. (Contributed by Serhiy Storchaka in :gh:`91760`.) +* Removed randrange() functionality deprecated since Python 3.10. Formerly, + randrange(10.0) losslessly converted to randrange(10). Now, it raises a + TypeError. Also, the exception raised for non-integral values such as + randrange(10.5) or randrange('10') has been changed from ValueError to + TypeError. This also prevents bugs where ``randrange(1e25)`` would silently + select from a larger range than ``randrange(10**25)``. + (Originally suggested by Serhiy Storchaka gh-86388.) + Build Changes ============= diff --git a/Lib/random.py b/Lib/random.py index 1f3530e880fce..a2dfcb574bd5e 100644 --- a/Lib/random.py +++ b/Lib/random.py @@ -282,67 +282,34 @@ def randbytes(self, n): ## -------------------- integer methods ------------------- def randrange(self, start, stop=None, step=_ONE): - """Choose a random item from range(start, stop[, step]). + """Choose a random item from range(stop) or range(start, stop[, step]). - This fixes the problem with randint() which includes the - endpoint; in Python this is usually not what you want. + Roughly equivalent to ``choice(range(start, stop, step))`` but + supports arbitrarily large ranges and is optimized for common cases. """ # This code is a bit messy to make it fast for the # common case while still doing adequate error checking. - try: - istart = _index(start) - except TypeError: - istart = int(start) - if istart != start: - _warn('randrange() will raise TypeError in the future', - DeprecationWarning, 2) - raise ValueError("non-integer arg 1 for randrange()") - _warn('non-integer arguments to randrange() have been deprecated ' - 'since Python 3.10 and will be removed in a subsequent ' - 'version', - DeprecationWarning, 2) + istart = _index(start) if stop is None: # We don't check for "step != 1" because it hasn't been # type checked and converted to an integer yet. if step is not _ONE: - raise TypeError('Missing a non-None stop argument') + raise TypeError("Missing a non-None stop argument") if istart > 0: return self._randbelow(istart) raise ValueError("empty range for randrange()") - # stop argument supplied. - try: - istop = _index(stop) - except TypeError: - istop = int(stop) - if istop != stop: - _warn('randrange() will raise TypeError in the future', - DeprecationWarning, 2) - raise ValueError("non-integer stop for randrange()") - _warn('non-integer arguments to randrange() have been deprecated ' - 'since Python 3.10 and will be removed in a subsequent ' - 'version', - DeprecationWarning, 2) + # Stop argument supplied. + istop = _index(stop) width = istop - istart - try: - istep = _index(step) - except TypeError: - istep = int(step) - if istep != step: - _warn('randrange() will raise TypeError in the future', - DeprecationWarning, 2) - raise ValueError("non-integer step for randrange()") - _warn('non-integer arguments to randrange() have been deprecated ' - 'since Python 3.10 and will be removed in a subsequent ' - 'version', - DeprecationWarning, 2) + istep = _index(step) # Fast path. if istep == 1: if width > 0: return istart + self._randbelow(width) - raise ValueError("empty range for randrange() (%d, %d, %d)" % (istart, istop, width)) + raise ValueError(f"empty range in randrange({start}, {stop})") # Non-unit step argument supplied. if istep > 0: @@ -352,7 +319,7 @@ def randrange(self, start, stop=None, step=_ONE): else: raise ValueError("zero step for randrange()") if n <= 0: - raise ValueError("empty range for randrange()") + raise ValueError(f"empty range in randrange({start}, {stop}, {step})") return istart + istep * self._randbelow(n) def randint(self, a, b): diff --git a/Lib/test/test_random.py b/Lib/test/test_random.py index 32e7868ba4de7..fcf17a949c2a6 100644 --- a/Lib/test/test_random.py +++ b/Lib/test/test_random.py @@ -485,50 +485,44 @@ def test_randrange_nonunit_step(self): self.assertEqual(rint, 0) def test_randrange_errors(self): - raises = partial(self.assertRaises, ValueError, self.gen.randrange) + raises_value_error = partial(self.assertRaises, ValueError, self.gen.randrange) + raises_type_error = partial(self.assertRaises, TypeError, self.gen.randrange) + # Empty range - raises(3, 3) - raises(-721) - raises(0, 100, -12) - # Non-integer start/stop - self.assertWarns(DeprecationWarning, raises, 3.14159) - self.assertWarns(DeprecationWarning, self.gen.randrange, 3.0) - self.assertWarns(DeprecationWarning, self.gen.randrange, Fraction(3, 1)) - self.assertWarns(DeprecationWarning, raises, '3') - self.assertWarns(DeprecationWarning, raises, 0, 2.71828) - self.assertWarns(DeprecationWarning, self.gen.randrange, 0, 2.0) - self.assertWarns(DeprecationWarning, self.gen.randrange, 0, Fraction(2, 1)) - self.assertWarns(DeprecationWarning, raises, 0, '2') - # Zero and non-integer step - raises(0, 42, 0) - self.assertWarns(DeprecationWarning, raises, 0, 42, 0.0) - self.assertWarns(DeprecationWarning, raises, 0, 0, 0.0) - self.assertWarns(DeprecationWarning, raises, 0, 42, 3.14159) - self.assertWarns(DeprecationWarning, self.gen.randrange, 0, 42, 3.0) - self.assertWarns(DeprecationWarning, self.gen.randrange, 0, 42, Fraction(3, 1)) - self.assertWarns(DeprecationWarning, raises, 0, 42, '3') - self.assertWarns(DeprecationWarning, self.gen.randrange, 0, 42, 1.0) - self.assertWarns(DeprecationWarning, raises, 0, 0, 1.0) - - def test_randrange_argument_handling(self): - randrange = self.gen.randrange - with self.assertWarns(DeprecationWarning): - randrange(10.0, 20, 2) - with self.assertWarns(DeprecationWarning): - randrange(10, 20.0, 2) - with self.assertWarns(DeprecationWarning): - randrange(10, 20, 1.0) - with self.assertWarns(DeprecationWarning): - randrange(10, 20, 2.0) - with self.assertWarns(DeprecationWarning): - with self.assertRaises(ValueError): - randrange(10.5) - with self.assertWarns(DeprecationWarning): - with self.assertRaises(ValueError): - randrange(10, 20.5) - with self.assertWarns(DeprecationWarning): - with self.assertRaises(ValueError): - randrange(10, 20, 1.5) + raises_value_error(3, 3) + raises_value_error(-721) + raises_value_error(0, 100, -12) + + # Zero step + raises_value_error(0, 42, 0) + raises_type_error(0, 42, 0.0) + raises_type_error(0, 0, 0.0) + + # Non-integer stop + raises_type_error(3.14159) + raises_type_error(3.0) + raises_type_error(Fraction(3, 1)) + raises_type_error('3') + raises_type_error(0, 2.71827) + raises_type_error(0, 2.0) + raises_type_error(0, Fraction(2, 1)) + raises_type_error(0, '2') + raises_type_error(0, 2.71827, 2) + + # Non-integer start + raises_type_error(2.71827, 5) + raises_type_error(2.0, 5) + raises_type_error(Fraction(2, 1), 5) + raises_type_error('2', 5) + raises_type_error(2.71827, 5, 2) + + # Non-integer step + raises_type_error(0, 42, 3.14159) + raises_type_error(0, 42, 3.0) + raises_type_error(0, 42, Fraction(3, 1)) + raises_type_error(0, 42, '3') + raises_type_error(0, 42, 1.0) + raises_type_error(0, 0, 1.0) def test_randrange_step(self): # bpo-42772: When stop is None, the step argument was being ignored. diff --git a/Misc/NEWS.d/next/Library/2022-05-11-10-06-31.gh-issue-86388.7ivUtT.rst b/Misc/NEWS.d/next/Library/2022-05-11-10-06-31.gh-issue-86388.7ivUtT.rst new file mode 100644 index 0000000000000..13eb5d122b28a --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-05-11-10-06-31.gh-issue-86388.7ivUtT.rst @@ -0,0 +1,5 @@ +Removed randrange() functionality deprecated since Python 3.10. Formerly, +randrange(10.0) losslessly converted to randrange(10). Now, it raises a +TypeError. Also, the exception raised for non-integral values such as +randrange(10.5) or randrange('10') has been changed from ValueError to +TypeError. From webhook-mailer at python.org Thu May 12 01:48:42 2022 From: webhook-mailer at python.org (methane) Date: Thu, 12 May 2022 05:48:42 -0000 Subject: [Python-checkins] gh-92536: PEP 623: Remove wstr and legacy APIs from Unicode (GH-92537) Message-ID: https://github.com/python/cpython/commit/f9c9354a7a173eaca2aa19e667b5cf12167b7fed commit: f9c9354a7a173eaca2aa19e667b5cf12167b7fed branch: main author: Inada Naoki committer: methane date: 2022-05-12T14:48:38+09:00 summary: gh-92536: PEP 623: Remove wstr and legacy APIs from Unicode (GH-92537) files: A Misc/NEWS.d/next/C API/2022-05-10-12-35-42.gh-issue-92536.cAoRCZ.rst D Objects/stringlib/unicodedefs.h M Doc/c-api/arg.rst M Doc/c-api/unicode.rst M Doc/data/stable_abi.dat M Doc/howto/clinic.rst M Doc/whatsnew/3.12.rst M Include/cpython/unicodeobject.h M Include/internal/pycore_runtime_init.h M Include/unicodeobject.h M Lib/test/clinic.test M Lib/test/test_getargs2.py M Lib/test/test_sys.py M Makefile.pre.in M Misc/stable_abi.toml M Modules/_io/fileio.c M Modules/_testcapimodule.c M Modules/clinic/_winapi.c.h M Modules/clinic/overlapped.c.h M Modules/clinic/posixmodule.c.h M Modules/overlapped.c M Modules/posixmodule.c M Objects/stringlib/eq.h M Objects/unicodeobject.c M PC/_msi.c M PC/clinic/_msi.c.h M PC/clinic/winreg.c.h M PC/winreg.c M Python/dynload_win.c M Python/fileutils.c M Python/getargs.c M Python/traceback.c M Tools/clinic/clinic.py M Tools/gdb/libpython.py M Tools/scripts/deepfreeze.py diff --git a/Doc/c-api/arg.rst b/Doc/c-api/arg.rst index 1d93b35dc1c88..6d0ad395540aa 100644 --- a/Doc/c-api/arg.rst +++ b/Doc/c-api/arg.rst @@ -136,48 +136,6 @@ which disallows mutable objects such as :class:`bytearray`. attempting any conversion. Raises :exc:`TypeError` if the object is not a :class:`bytearray` object. The C variable may also be declared as :c:type:`PyObject*`. -``u`` (:class:`str`) [const Py_UNICODE \*] - Convert a Python Unicode object to a C pointer to a NUL-terminated buffer of - Unicode characters. You must pass the address of a :c:type:`Py_UNICODE` - pointer variable, which will be filled with the pointer to an existing - Unicode buffer. Please note that the width of a :c:type:`Py_UNICODE` - character depends on compilation options (it is either 16 or 32 bits). - The Python string must not contain embedded null code points; if it does, - a :exc:`ValueError` exception is raised. - - .. versionchanged:: 3.5 - Previously, :exc:`TypeError` was raised when embedded null code points - were encountered in the Python string. - - .. deprecated-removed:: 3.3 3.12 - Part of the old-style :c:type:`Py_UNICODE` API; please migrate to using - :c:func:`PyUnicode_AsWideCharString`. - -``u#`` (:class:`str`) [const Py_UNICODE \*, :c:type:`Py_ssize_t`] - This variant on ``u`` stores into two C variables, the first one a pointer to a - Unicode data buffer, the second one its length. This variant allows - null code points. - - .. deprecated-removed:: 3.3 3.12 - Part of the old-style :c:type:`Py_UNICODE` API; please migrate to using - :c:func:`PyUnicode_AsWideCharString`. - -``Z`` (:class:`str` or ``None``) [const Py_UNICODE \*] - Like ``u``, but the Python object may also be ``None``, in which case the - :c:type:`Py_UNICODE` pointer is set to ``NULL``. - - .. deprecated-removed:: 3.3 3.12 - Part of the old-style :c:type:`Py_UNICODE` API; please migrate to using - :c:func:`PyUnicode_AsWideCharString`. - -``Z#`` (:class:`str` or ``None``) [const Py_UNICODE \*, :c:type:`Py_ssize_t`] - Like ``u#``, but the Python object may also be ``None``, in which case the - :c:type:`Py_UNICODE` pointer is set to ``NULL``. - - .. deprecated-removed:: 3.3 3.12 - Part of the old-style :c:type:`Py_UNICODE` API; please migrate to using - :c:func:`PyUnicode_AsWideCharString`. - ``U`` (:class:`str`) [PyObject \*] Requires that the Python object is a Unicode object, without attempting any conversion. Raises :exc:`TypeError` if the object is not a Unicode @@ -247,6 +205,11 @@ which disallows mutable objects such as :class:`bytearray`. them. Instead, the implementation assumes that the byte string object uses the encoding passed in as parameter. +.. versionchanged:: 3.12 + ``u``, ``u#``, ``Z``, and ``Z#`` are removed because they used legacy ``Py_UNICODE*`` + representation. + + Numbers ------- diff --git a/Doc/c-api/unicode.rst b/Doc/c-api/unicode.rst index 792a469c5566f..8fab3b7258276 100644 --- a/Doc/c-api/unicode.rst +++ b/Doc/c-api/unicode.rst @@ -17,26 +17,12 @@ of Unicode characters while staying memory efficient. There are special cases for strings where all code points are below 128, 256, or 65536; otherwise, code points must be below 1114112 (which is the full Unicode range). -:c:type:`Py_UNICODE*` and UTF-8 representations are created on demand and cached -in the Unicode object. The :c:type:`Py_UNICODE*` representation is deprecated -and inefficient. - -Due to the transition between the old APIs and the new APIs, Unicode objects -can internally be in two states depending on how they were created: - -* "canonical" Unicode objects are all objects created by a non-deprecated - Unicode API. They use the most efficient representation allowed by the - implementation. - -* "legacy" Unicode objects have been created through one of the deprecated - APIs (typically :c:func:`PyUnicode_FromUnicode`) and only bear the - :c:type:`Py_UNICODE*` representation; you will have to call - :c:func:`PyUnicode_READY` on them before calling any other API. +UTF-8 representation is created on demand and cached in the Unicode object. .. note:: - The "legacy" Unicode object will be removed in Python 3.12 with deprecated - APIs. All Unicode objects will be "canonical" since then. See :pep:`623` - for more information. + The :c:type:`Py_UNICODE` representation has been removed since Python 3.12 + with deprecated APIs. + See :pep:`623` for more information. Unicode Type @@ -101,18 +87,12 @@ access to internal read-only data of Unicode objects: .. c:function:: int PyUnicode_READY(PyObject *o) - Ensure the string object *o* is in the "canonical" representation. This is - required before using any of the access macros described below. - - .. XXX expand on when it is not required - - Returns ``0`` on success and ``-1`` with an exception set on failure, which in - particular happens if memory allocation fails. + Returns ``0``. This API is kept only for backward compatibility. .. versionadded:: 3.3 - .. deprecated-removed:: 3.10 3.12 - This API will be removed with :c:func:`PyUnicode_FromUnicode`. + .. deprecated:: 3.10 + This API do nothing since Python 3.12. Please remove code using this function. .. c:function:: Py_ssize_t PyUnicode_GET_LENGTH(PyObject *o) @@ -130,14 +110,12 @@ access to internal read-only data of Unicode objects: Return a pointer to the canonical representation cast to UCS1, UCS2 or UCS4 integer types for direct character access. No checks are performed if the canonical representation has the correct character size; use - :c:func:`PyUnicode_KIND` to select the right function. Make sure - :c:func:`PyUnicode_READY` has been called before accessing this. + :c:func:`PyUnicode_KIND` to select the right function. .. versionadded:: 3.3 -.. c:macro:: PyUnicode_WCHAR_KIND - PyUnicode_1BYTE_KIND +.. c:macro:: PyUnicode_1BYTE_KIND PyUnicode_2BYTE_KIND PyUnicode_4BYTE_KIND @@ -145,8 +123,8 @@ access to internal read-only data of Unicode objects: .. versionadded:: 3.3 - .. deprecated-removed:: 3.10 3.12 - ``PyUnicode_WCHAR_KIND`` is deprecated. + .. versionchanged:: 3.12 + ``PyUnicode_WCHAR_KIND`` has been removed. .. c:function:: int PyUnicode_KIND(PyObject *o) @@ -155,8 +133,6 @@ access to internal read-only data of Unicode objects: bytes per character this Unicode object uses to store its data. *o* has to be a Unicode object in the "canonical" representation (not checked). - .. XXX document "0" return value? - .. versionadded:: 3.3 @@ -208,49 +184,6 @@ access to internal read-only data of Unicode objects: .. versionadded:: 3.3 -.. c:function:: Py_ssize_t PyUnicode_GET_SIZE(PyObject *o) - - Return the size of the deprecated :c:type:`Py_UNICODE` representation, in - code units (this includes surrogate pairs as 2 units). *o* has to be a - Unicode object (not checked). - - .. deprecated-removed:: 3.3 3.12 - Part of the old-style Unicode API, please migrate to using - :c:func:`PyUnicode_GET_LENGTH`. - - -.. c:function:: Py_ssize_t PyUnicode_GET_DATA_SIZE(PyObject *o) - - Return the size of the deprecated :c:type:`Py_UNICODE` representation in - bytes. *o* has to be a Unicode object (not checked). - - .. deprecated-removed:: 3.3 3.12 - Part of the old-style Unicode API, please migrate to using - :c:func:`PyUnicode_GET_LENGTH`. - - -.. c:function:: Py_UNICODE* PyUnicode_AS_UNICODE(PyObject *o) - const char* PyUnicode_AS_DATA(PyObject *o) - - Return a pointer to a :c:type:`Py_UNICODE` representation of the object. The - returned buffer is always terminated with an extra null code point. It - may also contain embedded null code points, which would cause the string - to be truncated when used in most C functions. The ``AS_DATA`` form - casts the pointer to :c:type:`const char *`. The *o* argument has to be - a Unicode object (not checked). - - .. versionchanged:: 3.3 - This function is now inefficient -- because in many cases the - :c:type:`Py_UNICODE` representation does not exist and needs to be created - -- and can fail (return ``NULL`` with an exception set). Try to port the - code to use the new :c:func:`PyUnicode_nBYTE_DATA` macros or use - :c:func:`PyUnicode_WRITE` or :c:func:`PyUnicode_READ`. - - .. deprecated-removed:: 3.3 3.12 - Part of the old-style Unicode API, please migrate to using the - :c:func:`PyUnicode_nBYTE_DATA` family of macros. - - .. c:function:: int PyUnicode_IsIdentifier(PyObject *o) Return ``1`` if the string is a valid identifier according to the language @@ -436,12 +369,17 @@ APIs: Create a Unicode object from the char buffer *u*. The bytes will be interpreted as being UTF-8 encoded. The buffer is copied into the new - object. If the buffer is not ``NULL``, the return value might be a shared - object, i.e. modification of the data is not allowed. + object. + The return value might be a shared object, i.e. modification of the data is + not allowed. - If *u* is ``NULL``, this function behaves like :c:func:`PyUnicode_FromUnicode` - with the buffer set to ``NULL``. This usage is deprecated in favor of - :c:func:`PyUnicode_New`, and will be removed in Python 3.12. + This function raises :exc:`SystemError` when: + + * *size* < 0, + * *u* is ``NULL`` and *size* > 0 + + .. versionchanged:: 3.12 + *u* == ``NULL`` with *size* > 0 is not allowed anymore. .. c:function:: PyObject *PyUnicode_FromString(const char *u) @@ -680,79 +618,6 @@ APIs: .. versionadded:: 3.3 -Deprecated Py_UNICODE APIs -"""""""""""""""""""""""""" - -.. deprecated-removed:: 3.3 3.12 - -These API functions are deprecated with the implementation of :pep:`393`. -Extension modules can continue using them, as they will not be removed in Python -3.x, but need to be aware that their use can now cause performance and memory hits. - - -.. c:function:: PyObject* PyUnicode_FromUnicode(const Py_UNICODE *u, Py_ssize_t size) - - Create a Unicode object from the Py_UNICODE buffer *u* of the given size. *u* - may be ``NULL`` which causes the contents to be undefined. It is the user's - responsibility to fill in the needed data. The buffer is copied into the new - object. - - If the buffer is not ``NULL``, the return value might be a shared object. - Therefore, modification of the resulting Unicode object is only allowed when - *u* is ``NULL``. - - If the buffer is ``NULL``, :c:func:`PyUnicode_READY` must be called once the - string content has been filled before using any of the access macros such as - :c:func:`PyUnicode_KIND`. - - .. deprecated-removed:: 3.3 3.12 - Part of the old-style Unicode API, please migrate to using - :c:func:`PyUnicode_FromKindAndData`, :c:func:`PyUnicode_FromWideChar`, or - :c:func:`PyUnicode_New`. - - -.. c:function:: Py_UNICODE* PyUnicode_AsUnicode(PyObject *unicode) - - Return a read-only pointer to the Unicode object's internal - :c:type:`Py_UNICODE` buffer, or ``NULL`` on error. This will create the - :c:type:`Py_UNICODE*` representation of the object if it is not yet - available. The buffer is always terminated with an extra null code point. - Note that the resulting :c:type:`Py_UNICODE` string may also contain - embedded null code points, which would cause the string to be truncated when - used in most C functions. - - .. deprecated-removed:: 3.3 3.12 - Part of the old-style Unicode API, please migrate to using - :c:func:`PyUnicode_AsUCS4`, :c:func:`PyUnicode_AsWideChar`, - :c:func:`PyUnicode_ReadChar` or similar new APIs. - - -.. c:function:: Py_UNICODE* PyUnicode_AsUnicodeAndSize(PyObject *unicode, Py_ssize_t *size) - - Like :c:func:`PyUnicode_AsUnicode`, but also saves the :c:func:`Py_UNICODE` - array length (excluding the extra null terminator) in *size*. - Note that the resulting :c:type:`Py_UNICODE*` string - may contain embedded null code points, which would cause the string to be - truncated when used in most C functions. - - .. versionadded:: 3.3 - - .. deprecated-removed:: 3.3 3.12 - Part of the old-style Unicode API, please migrate to using - :c:func:`PyUnicode_AsUCS4`, :c:func:`PyUnicode_AsWideChar`, - :c:func:`PyUnicode_ReadChar` or similar new APIs. - - -.. c:function:: Py_ssize_t PyUnicode_GetSize(PyObject *unicode) - - Return the size of the deprecated :c:type:`Py_UNICODE` representation, in - code units (this includes surrogate pairs as 2 units). - - .. deprecated-removed:: 3.3 3.12 - Part of the old-style Unicode API, please migrate to using - :c:func:`PyUnicode_GET_LENGTH`. - - .. c:function:: PyObject* PyUnicode_FromObject(PyObject *obj) Copy an instance of a Unicode subtype to a new true Unicode object if diff --git a/Doc/data/stable_abi.dat b/Doc/data/stable_abi.dat index 5387d0bf983fa..3486f33c02539 100644 --- a/Doc/data/stable_abi.dat +++ b/Doc/data/stable_abi.dat @@ -761,7 +761,6 @@ function,PyUnicode_FromStringAndSize,3.2,, function,PyUnicode_FromWideChar,3.2,, function,PyUnicode_GetDefaultEncoding,3.2,, function,PyUnicode_GetLength,3.7,, -function,PyUnicode_GetSize,3.2,, function,PyUnicode_InternFromString,3.2,, function,PyUnicode_InternImmortal,3.2,, function,PyUnicode_InternInPlace,3.2,, diff --git a/Doc/howto/clinic.rst b/Doc/howto/clinic.rst index 04b1a2cac0b04..989527b651375 100644 --- a/Doc/howto/clinic.rst +++ b/Doc/howto/clinic.rst @@ -848,15 +848,15 @@ on the right is the text you'd replace it with. ``'s#'`` ``str(zeroes=True)`` ``'s*'`` ``Py_buffer(accept={buffer, str})`` ``'U'`` ``unicode`` -``'u'`` ``Py_UNICODE`` -``'u#'`` ``Py_UNICODE(zeroes=True)`` +``'u'`` ``wchar_t`` +``'u#'`` ``wchar_t(zeroes=True)`` ``'w*'`` ``Py_buffer(accept={rwbuffer})`` ``'Y'`` ``PyByteArrayObject`` ``'y'`` ``str(accept={bytes})`` ``'y#'`` ``str(accept={robuffer}, zeroes=True)`` ``'y*'`` ``Py_buffer`` -``'Z'`` ``Py_UNICODE(accept={str, NoneType})`` -``'Z#'`` ``Py_UNICODE(accept={str, NoneType}, zeroes=True)`` +``'Z'`` ``wchar_t(accept={str, NoneType})`` +``'Z#'`` ``wchar_t(accept={str, NoneType}, zeroes=True)`` ``'z'`` ``str(accept={str, NoneType})`` ``'z#'`` ``str(accept={str, NoneType}, zeroes=True)`` ``'z*'`` ``Py_buffer(accept={buffer, str, NoneType})`` diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst index 58fcb7d298da7..d5017c0350e16 100644 --- a/Doc/whatsnew/3.12.rst +++ b/Doc/whatsnew/3.12.rst @@ -66,6 +66,9 @@ Summary -- Release highlights .. PEP-sized items next. +Important deprecations, removals or restrictions: + +* :pep:`623`, Remove wstr from Unicode New Features @@ -91,7 +94,9 @@ Improved Modules Optimizations ============= - +* Removed ``wstr`` and ``wstr_length`` members from Unicode objects. + It reduces object size by 8 or 16 bytes on 64bit platform. (:pep:`623`) + (Contributed by Inada Naoki in :gh:`92536`.) Deprecated @@ -140,6 +145,13 @@ New Features Porting to Python 3.12 ---------------------- +* Legacy Unicode APIs based on ``Py_UNICODE*`` representation has been removed. + Please migrate to APIs based on UTF-8 or ``wchar_t*``. + +* Argument parsing functions like :c:func:`PyArg_ParseTuple` doesn't support + ``Py_UNICODE*`` based format (e.g. ``u``, ``Z``) anymore. Please migrate + to other formats for Unicode like ``s``, ``z``, ``es``, and ``U``. + Deprecated ---------- @@ -150,3 +162,15 @@ Removed API. The ``token.h`` header file was only designed to be used by Python internals. (Contributed by Victor Stinner in :gh:`92651`.) + +* Leagcy Unicode APIs has been removed. See :pep:`623` for detail. + + * :c:macro:`PyUnicode_WCHAR_KIND` + * :c:func:`PyUnicode_AS_UNICODE` + * :c:func:`PyUnicode_AsUnicode` + * :c:func:`PyUnicode_AsUnicodeAndSize` + * :c:func:`PyUnicode_AS_DATA` + * :c:func:`PyUnicode_FromUnicode` + * :c:func:`PyUnicode_GET_SIZE` + * :c:func:`PyUnicode_GetSize` + * :c:func:`PyUnicode_GET_DATA_SIZE` diff --git a/Include/cpython/unicodeobject.h b/Include/cpython/unicodeobject.h index 1e3bdad3dfd1f..8c53962437b6e 100644 --- a/Include/cpython/unicodeobject.h +++ b/Include/cpython/unicodeobject.h @@ -11,10 +11,6 @@ /* --- Internal Unicode Operations ---------------------------------------- */ -#ifndef USE_UNICODE_WCHAR_CACHE -# define USE_UNICODE_WCHAR_CACHE 1 -#endif /* USE_UNICODE_WCHAR_CACHE */ - // Static inline functions to work with surrogates static inline int Py_UNICODE_IS_SURROGATE(Py_UCS4 ch) { return (0xD800 <= ch && ch <= 0xDFFF); @@ -51,7 +47,7 @@ static inline Py_UCS4 Py_UNICODE_LOW_SURROGATE(Py_UCS4 ch) { /* ASCII-only strings created through PyUnicode_New use the PyASCIIObject structure. state.ascii and state.compact are set, and the data - immediately follow the structure. utf8_length and wstr_length can be found + immediately follow the structure. utf8_length can be found in the length field; the utf8 pointer is equal to the data pointer. */ typedef struct { /* There are 4 forms of Unicode strings: @@ -63,8 +59,7 @@ typedef struct { * kind = PyUnicode_1BYTE_KIND * compact = 1 * ascii = 1 - * ready = 1 - * (length is the length of the utf8 and wstr strings) + * (length is the length of the utf8) * (data starts just after the structure) * (since ASCII is decoded from UTF-8, the utf8 string are the data) @@ -75,55 +70,27 @@ typedef struct { * kind = PyUnicode_1BYTE_KIND, PyUnicode_2BYTE_KIND or PyUnicode_4BYTE_KIND * compact = 1 - * ready = 1 * ascii = 0 * utf8 is not shared with data * utf8_length = 0 if utf8 is NULL - * wstr is shared with data and wstr_length=length - if kind=PyUnicode_2BYTE_KIND and sizeof(wchar_t)=2 - or if kind=PyUnicode_4BYTE_KIND and sizeof(wchar_t)=4 - * wstr_length = 0 if wstr is NULL * (data starts just after the structure) - - legacy string, not ready: - - * structure = PyUnicodeObject - * test: kind == PyUnicode_WCHAR_KIND - * length = 0 (use wstr_length) - * hash = -1 - * kind = PyUnicode_WCHAR_KIND - * compact = 0 - * ascii = 0 - * ready = 0 - * interned = SSTATE_NOT_INTERNED - * wstr is not NULL - * data.any is NULL - * utf8 is NULL - * utf8_length = 0 - - - legacy string, ready: + - legacy string: * structure = PyUnicodeObject structure - * test: !PyUnicode_IS_COMPACT(op) && kind != PyUnicode_WCHAR_KIND + * test: !PyUnicode_IS_COMPACT(op) * kind = PyUnicode_1BYTE_KIND, PyUnicode_2BYTE_KIND or PyUnicode_4BYTE_KIND * compact = 0 - * ready = 1 * data.any is not NULL * utf8 is shared and utf8_length = length with data.any if ascii = 1 * utf8_length = 0 if utf8 is NULL - * wstr is shared with data.any and wstr_length = length - if kind=PyUnicode_2BYTE_KIND and sizeof(wchar_t)=2 - or if kind=PyUnicode_4BYTE_KIND and sizeof(wchar_4)=4 - * wstr_length = 0 if wstr is NULL Compact strings use only one memory block (structure + characters), whereas legacy strings use one block for the structure and one block for characters. - Legacy strings are created by PyUnicode_FromUnicode() and - PyUnicode_FromStringAndSize(NULL, size) functions. They become ready - when PyUnicode_READY() is called. + Legacy strings are created by subclasses of Unicode. See also _PyUnicode_CheckConsistency(). */ @@ -142,11 +109,6 @@ typedef struct { unsigned int interned:2; /* Character size: - - PyUnicode_WCHAR_KIND (0): - - * character type = wchar_t (16 or 32 bits, depending on the - platform) - - PyUnicode_1BYTE_KIND (1): * character type = Py_UCS1 (8 bits, unsigned) @@ -177,16 +139,10 @@ typedef struct { and the kind is PyUnicode_1BYTE_KIND. If ascii is set and compact is set, use the PyASCIIObject structure. */ unsigned int ascii:1; - /* The ready flag indicates whether the object layout is initialized - completely. This means that this is either a compact object, or - the data pointer is filled out. The bit is redundant, and helps - to minimize the test in PyUnicode_IS_READY(). */ - unsigned int ready:1; /* Padding to ensure that PyUnicode_DATA() is always aligned to 4 bytes (see issue #19537 on m68k). */ - unsigned int :24; + unsigned int :25; } state; - wchar_t *wstr; /* wchar_t representation (null-terminated) */ } PyASCIIObject; /* Non-ASCII strings allocated through PyUnicode_New use the @@ -197,13 +153,9 @@ typedef struct { Py_ssize_t utf8_length; /* Number of bytes in utf8, excluding the * terminating \0. */ char *utf8; /* UTF-8 representation (null-terminated) */ - Py_ssize_t wstr_length; /* Number of code points in wstr, possible - * surrogates count as two code points. */ } PyCompactUnicodeObject; -/* Strings allocated through PyUnicode_FromUnicode(NULL, len) use the - PyUnicodeObject structure. The actual string data is initially in the wstr - block, and copied into the data block using _PyUnicode_Ready. */ +/* Object format for Unicode subclasses. */ typedef struct { PyCompactUnicodeObject _base; union { @@ -247,10 +199,9 @@ static inline unsigned int PyUnicode_CHECK_INTERNED(PyObject *op) { # define PyUnicode_CHECK_INTERNED(op) PyUnicode_CHECK_INTERNED(_PyObject_CAST(op)) #endif -/* Fast check to determine whether an object is ready. Equivalent to: - PyUnicode_IS_COMPACT(op) || _PyUnicodeObject_CAST(op)->data.any */ +/* For backward compatibility */ static inline unsigned int PyUnicode_IS_READY(PyObject *op) { - return _PyASCIIObject_CAST(op)->state.ready; + return 1; } #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000 # define PyUnicode_IS_READY(op) PyUnicode_IS_READY(_PyObject_CAST(op)) @@ -260,7 +211,6 @@ static inline unsigned int PyUnicode_IS_READY(PyObject *op) { string may be compact (PyUnicode_IS_COMPACT_ASCII) or not, but must be ready. */ static inline unsigned int PyUnicode_IS_ASCII(PyObject *op) { - assert(PyUnicode_IS_READY(op)); return _PyASCIIObject_CAST(op)->state.ascii; } #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000 @@ -286,10 +236,6 @@ static inline int PyUnicode_IS_COMPACT_ASCII(PyObject *op) { #endif enum PyUnicode_Kind { -/* String contains only wstr byte characters. This is only possible - when the string was created with a legacy API and _PyUnicode_Ready() - has not been called yet. */ - PyUnicode_WCHAR_KIND = 0, /* Return values of the PyUnicode_KIND() function: */ PyUnicode_1BYTE_KIND = 1, PyUnicode_2BYTE_KIND = 2, @@ -298,8 +244,7 @@ enum PyUnicode_Kind { /* Return one of the PyUnicode_*_KIND values defined above. */ #define PyUnicode_KIND(op) \ - (assert(PyUnicode_IS_READY(op)), \ - _PyASCIIObject_CAST(op)->state.kind) + (_PyASCIIObject_CAST(op)->state.kind) /* Return a void pointer to the raw unicode buffer. */ static inline void* _PyUnicode_COMPACT_DATA(PyObject *op) { @@ -335,11 +280,8 @@ static inline void* PyUnicode_DATA(PyObject *op) { #define PyUnicode_2BYTE_DATA(op) _Py_STATIC_CAST(Py_UCS2*, PyUnicode_DATA(op)) #define PyUnicode_4BYTE_DATA(op) _Py_STATIC_CAST(Py_UCS4*, PyUnicode_DATA(op)) -/* Returns the length of the unicode string. The caller has to make sure that - the string has it's canonical representation set before calling - this function. Call PyUnicode_(FAST_)Ready to ensure that. */ +/* Returns the length of the unicode string. */ static inline Py_ssize_t PyUnicode_GET_LENGTH(PyObject *op) { - assert(PyUnicode_IS_READY(op)); return _PyASCIIObject_CAST(op)->length; } #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000 @@ -400,7 +342,6 @@ static inline Py_UCS4 PyUnicode_READ(int kind, cache kind and use PyUnicode_READ instead. */ static inline Py_UCS4 PyUnicode_READ_CHAR(PyObject *unicode, Py_ssize_t index) { - assert(PyUnicode_IS_READY(unicode)); int kind = PyUnicode_KIND(unicode); if (kind == PyUnicode_1BYTE_KIND) { return PyUnicode_1BYTE_DATA(unicode)[index]; @@ -421,7 +362,6 @@ static inline Py_UCS4 PyUnicode_READ_CHAR(PyObject *unicode, Py_ssize_t index) than iterating over the string. */ static inline Py_UCS4 PyUnicode_MAX_CHAR_VALUE(PyObject *op) { - assert(PyUnicode_IS_READY(op)); if (PyUnicode_IS_ASCII(op)) { return 0x7fU; } @@ -453,27 +393,10 @@ PyAPI_FUNC(PyObject*) PyUnicode_New( Py_UCS4 maxchar /* maximum code point value in the string */ ); -/* Initializes the canonical string representation from the deprecated - wstr/Py_UNICODE representation. This function is used to convert Unicode - objects which were created using the old API to the new flexible format - introduced with PEP 393. - - Don't call this function directly, use the public PyUnicode_READY() function - instead. */ -PyAPI_FUNC(int) _PyUnicode_Ready( - PyObject *unicode /* Unicode object */ - ); - -/* PyUnicode_READY() does less work than _PyUnicode_Ready() in the best - case. If the canonical representation is not yet set, it will still call - _PyUnicode_Ready(). - Returns 0 on success and -1 on errors. */ +/* For backward compatibility */ static inline int PyUnicode_READY(PyObject *op) { - if (PyUnicode_IS_READY(op)) { - return 0; - } - return _PyUnicode_Ready(op); + return 0; } #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000 # define PyUnicode_READY(op) PyUnicode_READY(_PyObject_CAST(op)) @@ -565,133 +488,6 @@ PyAPI_FUNC(Py_UCS4) _PyUnicode_FindMaxChar ( Py_ssize_t start, Py_ssize_t end); -/* --- Legacy deprecated API ---------------------------------------------- */ - -/* Create a Unicode Object from the Py_UNICODE buffer u of the given - size. - - u may be NULL which causes the contents to be undefined. It is the - user's responsibility to fill in the needed data afterwards. Note - that modifying the Unicode object contents after construction is - only allowed if u was set to NULL. - - The buffer is copied into the new object. */ -Py_DEPRECATED(3.3) PyAPI_FUNC(PyObject*) PyUnicode_FromUnicode( - const Py_UNICODE *u, /* Unicode buffer */ - Py_ssize_t size /* size of buffer */ - ); - -/* Return a read-only pointer to the Unicode object's internal - Py_UNICODE buffer. - If the wchar_t/Py_UNICODE representation is not yet available, this - function will calculate it. */ -Py_DEPRECATED(3.3) PyAPI_FUNC(Py_UNICODE *) PyUnicode_AsUnicode( - PyObject *unicode /* Unicode object */ - ); - -/* Similar to PyUnicode_AsUnicode(), but raises a ValueError if the string - contains null characters. */ -PyAPI_FUNC(const Py_UNICODE *) _PyUnicode_AsUnicode( - PyObject *unicode /* Unicode object */ - ); - -/* Return a read-only pointer to the Unicode object's internal - Py_UNICODE buffer and save the length at size. - If the wchar_t/Py_UNICODE representation is not yet available, this - function will calculate it. */ - -Py_DEPRECATED(3.3) PyAPI_FUNC(Py_UNICODE *) PyUnicode_AsUnicodeAndSize( - PyObject *unicode, /* Unicode object */ - Py_ssize_t *size /* location where to save the length */ - ); - - -/* Fast access macros */ - -Py_DEPRECATED(3.3) -static inline Py_ssize_t PyUnicode_WSTR_LENGTH(PyObject *op) -{ - if (PyUnicode_IS_COMPACT_ASCII(op)) { - return _PyASCIIObject_CAST(op)->length; - } - else { - return _PyCompactUnicodeObject_CAST(op)->wstr_length; - } -} -#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000 -# define PyUnicode_WSTR_LENGTH(op) PyUnicode_WSTR_LENGTH(_PyObject_CAST(op)) -#endif - -/* Returns the deprecated Py_UNICODE representation's size in code units - (this includes surrogate pairs as 2 units). - If the Py_UNICODE representation is not available, it will be computed - on request. Use PyUnicode_GET_LENGTH() for the length in code points. */ - -Py_DEPRECATED(3.3) -static inline Py_ssize_t PyUnicode_GET_SIZE(PyObject *op) -{ - _Py_COMP_DIAG_PUSH - _Py_COMP_DIAG_IGNORE_DEPR_DECLS - if (_PyASCIIObject_CAST(op)->wstr == _Py_NULL) { - (void)PyUnicode_AsUnicode(op); - assert(_PyASCIIObject_CAST(op)->wstr != _Py_NULL); - } - return PyUnicode_WSTR_LENGTH(op); - _Py_COMP_DIAG_POP -} -#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000 -# define PyUnicode_GET_SIZE(op) PyUnicode_GET_SIZE(_PyObject_CAST(op)) -#endif - -Py_DEPRECATED(3.3) -static inline Py_ssize_t PyUnicode_GET_DATA_SIZE(PyObject *op) -{ - _Py_COMP_DIAG_PUSH - _Py_COMP_DIAG_IGNORE_DEPR_DECLS - return PyUnicode_GET_SIZE(op) * Py_UNICODE_SIZE; - _Py_COMP_DIAG_POP -} -#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000 -# define PyUnicode_GET_DATA_SIZE(op) PyUnicode_GET_DATA_SIZE(_PyObject_CAST(op)) -#endif - -/* Alias for PyUnicode_AsUnicode(). This will create a wchar_t/Py_UNICODE - representation on demand. Using this macro is very inefficient now, - try to port your code to use the new PyUnicode_*BYTE_DATA() macros or - use PyUnicode_WRITE() and PyUnicode_READ(). */ - -Py_DEPRECATED(3.3) -static inline Py_UNICODE* PyUnicode_AS_UNICODE(PyObject *op) -{ - wchar_t *wstr = _PyASCIIObject_CAST(op)->wstr; - if (wstr != _Py_NULL) { - return wstr; - } - - _Py_COMP_DIAG_PUSH - _Py_COMP_DIAG_IGNORE_DEPR_DECLS - return PyUnicode_AsUnicode(op); - _Py_COMP_DIAG_POP -} -#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000 -# define PyUnicode_AS_UNICODE(op) PyUnicode_AS_UNICODE(_PyObject_CAST(op)) -#endif - -Py_DEPRECATED(3.3) -static inline const char* PyUnicode_AS_DATA(PyObject *op) -{ - _Py_COMP_DIAG_PUSH - _Py_COMP_DIAG_IGNORE_DEPR_DECLS - Py_UNICODE *data = PyUnicode_AS_UNICODE(op); - // In C++, casting directly PyUnicode* to const char* is not valid - return _Py_STATIC_CAST(const char*, _Py_STATIC_CAST(const void*, data)); - _Py_COMP_DIAG_POP -} -#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000 -# define PyUnicode_AS_DATA(op) PyUnicode_AS_DATA(_PyObject_CAST(op)) -#endif - - /* --- _PyUnicodeWriter API ----------------------------------------------- */ typedef struct { @@ -748,8 +544,7 @@ _PyUnicodeWriter_PrepareInternal(_PyUnicodeWriter *writer, Return 0 on success, raise an exception and return -1 on error. */ #define _PyUnicodeWriter_PrepareKind(WRITER, KIND) \ - (assert((KIND) != PyUnicode_WCHAR_KIND), \ - (KIND) <= (WRITER)->kind \ + ((KIND) <= (WRITER)->kind \ ? 0 \ : _PyUnicodeWriter_PrepareKindInternal((WRITER), (KIND))) diff --git a/Include/internal/pycore_runtime_init.h b/Include/internal/pycore_runtime_init.h index 57cacb97bcf1a..737507f07eacc 100644 --- a/Include/internal/pycore_runtime_init.h +++ b/Include/internal/pycore_runtime_init.h @@ -102,7 +102,6 @@ extern "C" { .kind = 1, \ .compact = 1, \ .ascii = ASCII, \ - .ready = 1, \ }, \ } #define _PyASCIIObject_INIT(LITERAL) \ diff --git a/Include/unicodeobject.h b/Include/unicodeobject.h index 1d2f54608544e..f71f37978a1ba 100644 --- a/Include/unicodeobject.h +++ b/Include/unicodeobject.h @@ -171,13 +171,6 @@ PyAPI_FUNC(Py_ssize_t) PyUnicode_GetLength( ); #endif -/* Get the number of Py_UNICODE units in the - string representation. */ - -Py_DEPRECATED(3.3) PyAPI_FUNC(Py_ssize_t) PyUnicode_GetSize( - PyObject *unicode /* Unicode object */ - ); - #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 /* Read a character from the string. */ @@ -198,9 +191,7 @@ PyAPI_FUNC(int) PyUnicode_WriteChar( ); #endif -/* Resize a Unicode object. The length is the number of characters, except - if the kind of the string is PyUnicode_WCHAR_KIND: in this case, the length - is the number of Py_UNICODE characters. +/* Resize a Unicode object. The length is the number of codepoints. *unicode is modified to point to the new (resized) object and 0 returned on success. diff --git a/Lib/test/clinic.test b/Lib/test/clinic.test index 9ef3610ba10c0..94322f6d61771 100644 --- a/Lib/test/clinic.test +++ b/Lib/test/clinic.test @@ -1819,17 +1819,11 @@ test_Py_UNICODE_converter(PyObject *module, PyObject *const *args, Py_ssize_t na exit: /* Cleanup for a */ - #if !USE_UNICODE_WCHAR_CACHE PyMem_Free((void *)a); - #endif /* USE_UNICODE_WCHAR_CACHE */ /* Cleanup for b */ - #if !USE_UNICODE_WCHAR_CACHE PyMem_Free((void *)b); - #endif /* USE_UNICODE_WCHAR_CACHE */ /* Cleanup for c */ - #if !USE_UNICODE_WCHAR_CACHE PyMem_Free((void *)c); - #endif /* USE_UNICODE_WCHAR_CACHE */ return return_value; } @@ -1839,7 +1833,7 @@ test_Py_UNICODE_converter_impl(PyObject *module, const Py_UNICODE *a, const Py_UNICODE *b, const Py_UNICODE *c, const Py_UNICODE *d, Py_ssize_t d_length, const Py_UNICODE *e, Py_ssize_t e_length) -/*[clinic end generated code: output=45e92604de227552 input=064a3b68ad7f04b0]*/ +/*[clinic end generated code: output=4d426808cdbb3ea3 input=064a3b68ad7f04b0]*/ /*[clinic input] diff --git a/Lib/test/test_getargs2.py b/Lib/test/test_getargs2.py index e0db9e40e650b..7c11c6cd33a84 100644 --- a/Lib/test/test_getargs2.py +++ b/Lib/test/test_getargs2.py @@ -1162,7 +1162,7 @@ def test_skipitem_with_suffix(self): dict_b = {'b':1} keywords = ["a", "b"] - supported = ('s#', 's*', 'z#', 'z*', 'u#', 'Z#', 'y#', 'y*', 'w#', 'w*') + supported = ('s#', 's*', 'z#', 'z*', 'y#', 'y*', 'w#', 'w*') for c in string.ascii_letters: for c2 in '#*': f = c + c2 @@ -1255,14 +1255,6 @@ class Test_testcapi(unittest.TestCase): for name in dir(_testcapi) if name.startswith('test_') and name.endswith('_code')) - @warnings_helper.ignore_warnings(category=DeprecationWarning) - def test_u_code(self): - _testcapi.test_u_code() - - @warnings_helper.ignore_warnings(category=DeprecationWarning) - def test_Z_code(self): - _testcapi.test_Z_code() - if __name__ == "__main__": unittest.main() diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py index 8aaf23272607b..9c0f4a69289d2 100644 --- a/Lib/test/test_sys.py +++ b/Lib/test/test_sys.py @@ -1538,8 +1538,8 @@ class newstyleclass(object): pass samples = ['1'*100, '\xff'*50, '\u0100'*40, '\uffff'*100, '\U00010000'*30, '\U0010ffff'*100] - asciifields = "nnbP" - compactfields = asciifields + "nPn" + asciifields = "nnb" + compactfields = asciifields + "nP" unicodefields = compactfields + "P" for s in samples: maxchar = ord(max(s)) diff --git a/Makefile.pre.in b/Makefile.pre.in index 869c78ee0d3c5..515c18cc21666 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -1405,8 +1405,7 @@ UNICODE_DEPS = \ $(srcdir)/Objects/stringlib/ucs2lib.h \ $(srcdir)/Objects/stringlib/ucs4lib.h \ $(srcdir)/Objects/stringlib/undef.h \ - $(srcdir)/Objects/stringlib/unicode_format.h \ - $(srcdir)/Objects/stringlib/unicodedefs.h + $(srcdir)/Objects/stringlib/unicode_format.h Objects/bytes_methods.o: $(srcdir)/Objects/bytes_methods.c $(BYTESTR_DEPS) Objects/bytesobject.o: $(srcdir)/Objects/bytesobject.c $(BYTESTR_DEPS) diff --git a/Misc/NEWS.d/next/C API/2022-05-10-12-35-42.gh-issue-92536.cAoRCZ.rst b/Misc/NEWS.d/next/C API/2022-05-10-12-35-42.gh-issue-92536.cAoRCZ.rst new file mode 100644 index 0000000000000..a0b1bc69e281a --- /dev/null +++ b/Misc/NEWS.d/next/C API/2022-05-10-12-35-42.gh-issue-92536.cAoRCZ.rst @@ -0,0 +1 @@ +Remove legacy Unicode APIs based on ``Py_UNICODE*``. diff --git a/Misc/stable_abi.toml b/Misc/stable_abi.toml index e34bfcd0b6173..07cce369fe80a 100644 --- a/Misc/stable_abi.toml +++ b/Misc/stable_abi.toml @@ -1524,6 +1524,7 @@ added = '3.2' [function.PyUnicode_GetSize] added = '3.2' + abi_only = true [function.PyUnicode_IsIdentifier] added = '3.2' [function.PyUnicode_Join] diff --git a/Modules/_io/fileio.c b/Modules/_io/fileio.c index 8b1cff56d75fa..00859978e8cd6 100644 --- a/Modules/_io/fileio.c +++ b/Modules/_io/fileio.c @@ -268,14 +268,7 @@ _io_FileIO___init___impl(fileio *self, PyObject *nameobj, const char *mode, if (!PyUnicode_FSDecoder(nameobj, &stringobj)) { return -1; } -#if USE_UNICODE_WCHAR_CACHE -_Py_COMP_DIAG_PUSH -_Py_COMP_DIAG_IGNORE_DEPR_DECLS - widename = PyUnicode_AsUnicode(stringobj); -_Py_COMP_DIAG_POP -#else /* USE_UNICODE_WCHAR_CACHE */ widename = PyUnicode_AsWideCharString(stringobj, NULL); -#endif /* USE_UNICODE_WCHAR_CACHE */ if (widename == NULL) return -1; #else @@ -497,9 +490,7 @@ _Py_COMP_DIAG_POP done: #ifdef MS_WINDOWS -#if !USE_UNICODE_WCHAR_CACHE PyMem_Free(widename); -#endif /* USE_UNICODE_WCHAR_CACHE */ #endif Py_CLEAR(stringobj); return ret; diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index be9ed50e0dbeb..4371bf7da0e86 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -1991,116 +1991,6 @@ parse_tuple_and_keywords(PyObject *self, PyObject *args) return return_value; } -static volatile int x; - -#if USE_UNICODE_WCHAR_CACHE -/* Ignore use of deprecated APIs */ -_Py_COMP_DIAG_PUSH -_Py_COMP_DIAG_IGNORE_DEPR_DECLS - -/* Test the u and u# codes for PyArg_ParseTuple. May leak memory in case - of an error. -*/ -static PyObject * -test_u_code(PyObject *self, PyObject *Py_UNUSED(ignored)) -{ - PyObject *tuple, *obj; - Py_UNICODE *value; - Py_ssize_t len; - - /* issue4122: Undefined reference to _Py_ascii_whitespace on Windows */ - /* Just use the macro and check that it compiles */ - x = Py_UNICODE_ISSPACE(25); - - tuple = PyTuple_New(1); - if (tuple == NULL) - return NULL; - - obj = PyUnicode_Decode("test", strlen("test"), - "ascii", NULL); - if (obj == NULL) - return NULL; - - PyTuple_SET_ITEM(tuple, 0, obj); - - value = 0; - if (!PyArg_ParseTuple(tuple, "u:test_u_code", &value)) { - return NULL; - } - if (value != PyUnicode_AS_UNICODE(obj)) - return raiseTestError("test_u_code", - "u code returned wrong value for u'test'"); - value = 0; - if (!PyArg_ParseTuple(tuple, "u#:test_u_code", &value, &len)) { - return NULL; - } - if (value != PyUnicode_AS_UNICODE(obj) || - len != PyUnicode_GET_SIZE(obj)) - return raiseTestError("test_u_code", - "u# code returned wrong values for u'test'"); - - Py_DECREF(tuple); - Py_RETURN_NONE; -} - -/* Test Z and Z# codes for PyArg_ParseTuple */ -static PyObject * -test_Z_code(PyObject *self, PyObject *Py_UNUSED(ignored)) -{ - PyObject *tuple, *obj; - const Py_UNICODE *value1, *value2; - Py_ssize_t len1, len2; - - tuple = PyTuple_New(2); - if (tuple == NULL) - return NULL; - - obj = PyUnicode_FromString("test"); - PyTuple_SET_ITEM(tuple, 0, obj); - Py_INCREF(Py_None); - PyTuple_SET_ITEM(tuple, 1, Py_None); - - /* swap values on purpose */ - value1 = NULL; - value2 = PyUnicode_AS_UNICODE(obj); - - /* Test Z for both values */ - if (!PyArg_ParseTuple(tuple, "ZZ:test_Z_code", &value1, &value2)) { - return NULL; - } - if (value1 != PyUnicode_AS_UNICODE(obj)) - return raiseTestError("test_Z_code", - "Z code returned wrong value for 'test'"); - if (value2 != NULL) - return raiseTestError("test_Z_code", - "Z code returned wrong value for None"); - - value1 = NULL; - value2 = PyUnicode_AS_UNICODE(obj); - len1 = -1; - len2 = -1; - - /* Test Z# for both values */ - if (!PyArg_ParseTuple(tuple, "Z#Z#:test_Z_code", &value1, &len1, - &value2, &len2)) - { - return NULL; - } - if (value1 != PyUnicode_AS_UNICODE(obj) || - len1 != PyUnicode_GET_SIZE(obj)) - return raiseTestError("test_Z_code", - "Z# code returned wrong values for 'test'"); - if (value2 != NULL || - len2 != 0) - return raiseTestError("test_Z_code", - "Z# code returned wrong values for None'"); - - Py_DECREF(tuple); - Py_RETURN_NONE; -} -_Py_COMP_DIAG_POP -#endif /* USE_UNICODE_WCHAR_CACHE */ - static PyObject * test_widechar(PyObject *self, PyObject *Py_UNUSED(ignored)) { @@ -2151,35 +2041,7 @@ test_widechar(PyObject *self, PyObject *Py_UNUSED(ignored)) else return raiseTestError("test_widechar", "PyUnicode_FromWideChar(L\"\\U00110000\", 1) didn't fail"); - -#if USE_UNICODE_WCHAR_CACHE -/* Ignore use of deprecated APIs */ -_Py_COMP_DIAG_PUSH -_Py_COMP_DIAG_IGNORE_DEPR_DECLS - wide = PyUnicode_FromUnicode(invalid, 1); - if (wide == NULL) - PyErr_Clear(); - else - return raiseTestError("test_widechar", - "PyUnicode_FromUnicode(L\"\\U00110000\", 1) didn't fail"); - - wide = PyUnicode_FromUnicode(NULL, 1); - if (wide == NULL) - return NULL; - PyUnicode_AS_UNICODE(wide)[0] = invalid[0]; - if (_PyUnicode_Ready(wide) < 0) { - Py_DECREF(wide); - PyErr_Clear(); - } - else { - Py_DECREF(wide); - return raiseTestError("test_widechar", - "PyUnicode_Ready() didn't fail"); - } -_Py_COMP_DIAG_POP -#endif /* USE_UNICODE_WCHAR_CACHE */ #endif - Py_RETURN_NONE; } @@ -2357,36 +2219,6 @@ unicode_copycharacters(PyObject *self, PyObject *args) return Py_BuildValue("(Nn)", to_copy, copied); } -#if USE_UNICODE_WCHAR_CACHE -/* Ignore use of deprecated APIs */ -_Py_COMP_DIAG_PUSH -_Py_COMP_DIAG_IGNORE_DEPR_DECLS - -static PyObject * -unicode_legacy_string(PyObject *self, PyObject *args) -{ - Py_UNICODE *data; - Py_ssize_t len; - PyObject *u; - - if (!PyArg_ParseTuple(args, "u#", &data, &len)) - return NULL; - - u = PyUnicode_FromUnicode(NULL, len); - if (u == NULL) - return NULL; - - memcpy(PyUnicode_AS_UNICODE(u), data, len * sizeof(Py_UNICODE)); - - if (len > 0) { /* The empty string is always ready. */ - assert(!PyUnicode_IS_READY(u)); - } - - return u; -} -_Py_COMP_DIAG_POP -#endif /* USE_UNICODE_WCHAR_CACHE */ - static PyObject * getargs_w_star(PyObject *self, PyObject *args) { @@ -6092,10 +5924,6 @@ static PyMethodDef TestMethods[] = { {"codec_incrementaldecoder", (PyCFunction)codec_incrementaldecoder, METH_VARARGS}, {"test_s_code", test_s_code, METH_NOARGS}, -#if USE_UNICODE_WCHAR_CACHE - {"test_u_code", test_u_code, METH_NOARGS}, - {"test_Z_code", test_Z_code, METH_NOARGS}, -#endif /* USE_UNICODE_WCHAR_CACHE */ {"test_widechar", test_widechar, METH_NOARGS}, {"unicode_aswidechar", unicode_aswidechar, METH_VARARGS}, {"unicode_aswidecharstring",unicode_aswidecharstring, METH_VARARGS}, @@ -6104,9 +5932,6 @@ static PyMethodDef TestMethods[] = { {"unicode_asutf8andsize", unicode_asutf8andsize, METH_VARARGS}, {"unicode_findchar", unicode_findchar, METH_VARARGS}, {"unicode_copycharacters", unicode_copycharacters, METH_VARARGS}, -#if USE_UNICODE_WCHAR_CACHE - {"unicode_legacy_string", unicode_legacy_string, METH_VARARGS}, -#endif /* USE_UNICODE_WCHAR_CACHE */ {"_test_thread_state", test_thread_state, METH_VARARGS}, {"_pending_threadfunc", pending_threadfunc, METH_VARARGS}, #ifdef HAVE_GETTIMEOFDAY diff --git a/Modules/clinic/_winapi.c.h b/Modules/clinic/_winapi.c.h index 9c83d0ba2c545..4d89888af9054 100644 --- a/Modules/clinic/_winapi.c.h +++ b/Modules/clinic/_winapi.c.h @@ -210,9 +210,7 @@ _winapi_CreateFileMapping(PyObject *module, PyObject *const *args, Py_ssize_t na exit: /* Cleanup for name */ - #if !USE_UNICODE_WCHAR_CACHE PyMem_Free((void *)name); - #endif /* USE_UNICODE_WCHAR_CACHE */ return return_value; } @@ -243,11 +241,7 @@ _winapi_CreateJunction(PyObject *module, PyObject *const *args, Py_ssize_t nargs _PyArg_BadArgument("CreateJunction", "argument 1", "str", args[0]); goto exit; } - #if USE_UNICODE_WCHAR_CACHE - src_path = _PyUnicode_AsUnicode(args[0]); - #else /* USE_UNICODE_WCHAR_CACHE */ src_path = PyUnicode_AsWideCharString(args[0], NULL); - #endif /* USE_UNICODE_WCHAR_CACHE */ if (src_path == NULL) { goto exit; } @@ -255,11 +249,7 @@ _winapi_CreateJunction(PyObject *module, PyObject *const *args, Py_ssize_t nargs _PyArg_BadArgument("CreateJunction", "argument 2", "str", args[1]); goto exit; } - #if USE_UNICODE_WCHAR_CACHE - dst_path = _PyUnicode_AsUnicode(args[1]); - #else /* USE_UNICODE_WCHAR_CACHE */ dst_path = PyUnicode_AsWideCharString(args[1], NULL); - #endif /* USE_UNICODE_WCHAR_CACHE */ if (dst_path == NULL) { goto exit; } @@ -267,13 +257,9 @@ _winapi_CreateJunction(PyObject *module, PyObject *const *args, Py_ssize_t nargs exit: /* Cleanup for src_path */ - #if !USE_UNICODE_WCHAR_CACHE PyMem_Free((void *)src_path); - #endif /* USE_UNICODE_WCHAR_CACHE */ /* Cleanup for dst_path */ - #if !USE_UNICODE_WCHAR_CACHE PyMem_Free((void *)dst_path); - #endif /* USE_UNICODE_WCHAR_CACHE */ return return_value; } @@ -412,13 +398,9 @@ _winapi_CreateProcess(PyObject *module, PyObject *const *args, Py_ssize_t nargs) exit: /* Cleanup for application_name */ - #if !USE_UNICODE_WCHAR_CACHE PyMem_Free((void *)application_name); - #endif /* USE_UNICODE_WCHAR_CACHE */ /* Cleanup for current_directory */ - #if !USE_UNICODE_WCHAR_CACHE PyMem_Free((void *)current_directory); - #endif /* USE_UNICODE_WCHAR_CACHE */ return return_value; } @@ -767,9 +749,7 @@ _winapi_OpenFileMapping(PyObject *module, PyObject *const *args, Py_ssize_t narg exit: /* Cleanup for name */ - #if !USE_UNICODE_WCHAR_CACHE PyMem_Free((void *)name); - #endif /* USE_UNICODE_WCHAR_CACHE */ return return_value; } @@ -1184,4 +1164,4 @@ _winapi__mimetypes_read_windows_registry(PyObject *module, PyObject *const *args exit: return return_value; } -/*[clinic end generated code: output=a4ede01aede352a4 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=b007dde2e7f2fff8 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/overlapped.c.h b/Modules/clinic/overlapped.c.h index 2861338317497..cac44d0a5764c 100644 --- a/Modules/clinic/overlapped.c.h +++ b/Modules/clinic/overlapped.c.h @@ -230,9 +230,7 @@ _overlapped_CreateEvent(PyObject *module, PyObject *const *args, Py_ssize_t narg exit: /* Cleanup for Name */ - #if !USE_UNICODE_WCHAR_CACHE PyMem_Free((void *)Name); - #endif /* USE_UNICODE_WCHAR_CACHE */ return return_value; } @@ -812,11 +810,7 @@ _overlapped_Overlapped_ConnectPipe(OverlappedObject *self, PyObject *arg) _PyArg_BadArgument("ConnectPipe", "argument", "str", arg); goto exit; } - #if USE_UNICODE_WCHAR_CACHE - Address = _PyUnicode_AsUnicode(arg); - #else /* USE_UNICODE_WCHAR_CACHE */ Address = PyUnicode_AsWideCharString(arg, NULL); - #endif /* USE_UNICODE_WCHAR_CACHE */ if (Address == NULL) { goto exit; } @@ -824,9 +818,7 @@ _overlapped_Overlapped_ConnectPipe(OverlappedObject *self, PyObject *arg) exit: /* Cleanup for Address */ - #if !USE_UNICODE_WCHAR_CACHE PyMem_Free((void *)Address); - #endif /* USE_UNICODE_WCHAR_CACHE */ return return_value; } @@ -968,4 +960,4 @@ _overlapped_Overlapped_WSARecvFromInto(OverlappedObject *self, PyObject *const * return return_value; } -/*[clinic end generated code: output=b0f15f5c09f1147e input=a9049054013a1b77]*/ +/*[clinic end generated code: output=9078d9f9984864a2 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/posixmodule.c.h b/Modules/clinic/posixmodule.c.h index d62b09ed7406e..1ce7d86204e6f 100644 --- a/Modules/clinic/posixmodule.c.h +++ b/Modules/clinic/posixmodule.c.h @@ -1760,11 +1760,7 @@ os_system(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *k _PyArg_BadArgument("system", "argument 'command'", "str", args[0]); goto exit; } - #if USE_UNICODE_WCHAR_CACHE - command = _PyUnicode_AsUnicode(args[0]); - #else /* USE_UNICODE_WCHAR_CACHE */ command = PyUnicode_AsWideCharString(args[0], NULL); - #endif /* USE_UNICODE_WCHAR_CACHE */ if (command == NULL) { goto exit; } @@ -1776,9 +1772,7 @@ os_system(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *k exit: /* Cleanup for command */ - #if !USE_UNICODE_WCHAR_CACHE PyMem_Free((void *)command); - #endif /* USE_UNICODE_WCHAR_CACHE */ return return_value; } @@ -7264,11 +7258,7 @@ os_startfile(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject _PyArg_BadArgument("startfile", "argument 'operation'", "str", args[1]); goto exit; } - #if USE_UNICODE_WCHAR_CACHE - operation = _PyUnicode_AsUnicode(args[1]); - #else /* USE_UNICODE_WCHAR_CACHE */ operation = PyUnicode_AsWideCharString(args[1], NULL); - #endif /* USE_UNICODE_WCHAR_CACHE */ if (operation == NULL) { goto exit; } @@ -7281,11 +7271,7 @@ os_startfile(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject _PyArg_BadArgument("startfile", "argument 'arguments'", "str", args[2]); goto exit; } - #if USE_UNICODE_WCHAR_CACHE - arguments = _PyUnicode_AsUnicode(args[2]); - #else /* USE_UNICODE_WCHAR_CACHE */ arguments = PyUnicode_AsWideCharString(args[2], NULL); - #endif /* USE_UNICODE_WCHAR_CACHE */ if (arguments == NULL) { goto exit; } @@ -7312,13 +7298,9 @@ os_startfile(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject /* Cleanup for filepath */ path_cleanup(&filepath); /* Cleanup for operation */ - #if !USE_UNICODE_WCHAR_CACHE PyMem_Free((void *)operation); - #endif /* USE_UNICODE_WCHAR_CACHE */ /* Cleanup for arguments */ - #if !USE_UNICODE_WCHAR_CACHE PyMem_Free((void *)arguments); - #endif /* USE_UNICODE_WCHAR_CACHE */ /* Cleanup for cwd */ path_cleanup(&cwd); @@ -9370,4 +9352,4 @@ os_waitstatus_to_exitcode(PyObject *module, PyObject *const *args, Py_ssize_t na #ifndef OS_WAITSTATUS_TO_EXITCODE_METHODDEF #define OS_WAITSTATUS_TO_EXITCODE_METHODDEF #endif /* !defined(OS_WAITSTATUS_TO_EXITCODE_METHODDEF) */ -/*[clinic end generated code: output=6150bcc25f5e4bc7 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=bae15f09a1b3d2e7 input=a9049054013a1b77]*/ diff --git a/Modules/overlapped.c b/Modules/overlapped.c index 74fba8346c2e1..e40a52476bd19 100644 --- a/Modules/overlapped.c +++ b/Modules/overlapped.c @@ -1346,7 +1346,7 @@ static int parse_address(PyObject *obj, SOCKADDR *Address, int Length) { PyObject *Host_obj; - Py_UNICODE *Host; + wchar_t *Host; unsigned short Port; unsigned long FlowInfo; unsigned long ScopeId; @@ -1358,11 +1358,7 @@ parse_address(PyObject *obj, SOCKADDR *Address, int Length) if (!PyArg_ParseTuple(obj, "UH", &Host_obj, &Port)) { return -1; } -#if USE_UNICODE_WCHAR_CACHE - Host = (wchar_t *)_PyUnicode_AsUnicode(Host_obj); -#else /* USE_UNICODE_WCHAR_CACHE */ Host = PyUnicode_AsWideCharString(Host_obj, NULL); -#endif /* USE_UNICODE_WCHAR_CACHE */ if (Host == NULL) { return -1; } @@ -1374,9 +1370,7 @@ parse_address(PyObject *obj, SOCKADDR *Address, int Length) else { ((SOCKADDR_IN*)Address)->sin_port = htons(Port); } -#if !USE_UNICODE_WCHAR_CACHE PyMem_Free(Host); -#endif /* USE_UNICODE_WCHAR_CACHE */ return Length; } case 4: { @@ -1386,11 +1380,7 @@ parse_address(PyObject *obj, SOCKADDR *Address, int Length) { return -1; } -#if USE_UNICODE_WCHAR_CACHE - Host = (wchar_t *)_PyUnicode_AsUnicode(Host_obj); -#else /* USE_UNICODE_WCHAR_CACHE */ Host = PyUnicode_AsWideCharString(Host_obj, NULL); -#endif /* USE_UNICODE_WCHAR_CACHE */ if (Host == NULL) { return -1; } @@ -1404,9 +1394,7 @@ parse_address(PyObject *obj, SOCKADDR *Address, int Length) ((SOCKADDR_IN6*)Address)->sin6_flowinfo = FlowInfo; ((SOCKADDR_IN6*)Address)->sin6_scope_id = ScopeId; } -#if !USE_UNICODE_WCHAR_CACHE PyMem_Free(Host); -#endif /* USE_UNICODE_WCHAR_CACHE */ return Length; } default: diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 40158894411ba..0a72aca8d51fa 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -1098,11 +1098,9 @@ typedef struct { static void path_cleanup(path_t *path) { -#if !USE_UNICODE_WCHAR_CACHE wchar_t *wide = (wchar_t *)path->wide; path->wide = NULL; PyMem_Free(wide); -#endif /* USE_UNICODE_WCHAR_CACHE */ Py_CLEAR(path->object); Py_CLEAR(path->cleanup); } @@ -1190,14 +1188,7 @@ path_converter(PyObject *o, void *p) if (is_unicode) { #ifdef MS_WINDOWS -#if USE_UNICODE_WCHAR_CACHE -_Py_COMP_DIAG_PUSH -_Py_COMP_DIAG_IGNORE_DEPR_DECLS - wide = PyUnicode_AsUnicodeAndSize(o, &length); -_Py_COMP_DIAG_POP -#else /* USE_UNICODE_WCHAR_CACHE */ wide = PyUnicode_AsWideCharString(o, &length); -#endif /* USE_UNICODE_WCHAR_CACHE */ if (!wide) { goto error_exit; } @@ -1213,9 +1204,7 @@ _Py_COMP_DIAG_POP path->wide = wide; path->narrow = FALSE; path->fd = -1; -#if !USE_UNICODE_WCHAR_CACHE wide = NULL; -#endif /* USE_UNICODE_WCHAR_CACHE */ goto success_exit; #else if (!PyUnicode_FSConverter(o, &bytes)) { @@ -1291,15 +1280,8 @@ _Py_COMP_DIAG_POP goto error_exit; } -#if USE_UNICODE_WCHAR_CACHE -_Py_COMP_DIAG_PUSH -_Py_COMP_DIAG_IGNORE_DEPR_DECLS - wide = PyUnicode_AsUnicodeAndSize(wo, &length); -_Py_COMP_DIAG_POP -#else /* USE_UNICODE_WCHAR_CACHE */ wide = PyUnicode_AsWideCharString(wo, &length); Py_DECREF(wo); -#endif /* USE_UNICODE_WCHAR_CACHE */ if (!wide) { goto error_exit; } @@ -1314,11 +1296,7 @@ _Py_COMP_DIAG_POP path->wide = wide; path->narrow = TRUE; Py_DECREF(bytes); -#if USE_UNICODE_WCHAR_CACHE - path->cleanup = wo; -#else /* USE_UNICODE_WCHAR_CACHE */ wide = NULL; -#endif /* USE_UNICODE_WCHAR_CACHE */ #else path->wide = NULL; path->narrow = narrow; @@ -1342,11 +1320,7 @@ _Py_COMP_DIAG_POP Py_XDECREF(o); Py_XDECREF(bytes); #ifdef MS_WINDOWS -#if USE_UNICODE_WCHAR_CACHE - Py_XDECREF(wo); -#else /* USE_UNICODE_WCHAR_CACHE */ PyMem_Free(wide); -#endif /* USE_UNICODE_WCHAR_CACHE */ #endif return 0; } @@ -13575,15 +13549,8 @@ DirEntry_fetch_stat(PyObject *module, DirEntry *self, int follow_symlinks) #ifdef MS_WINDOWS if (!PyUnicode_FSDecoder(self->path, &ub)) return NULL; -#if USE_UNICODE_WCHAR_CACHE -_Py_COMP_DIAG_PUSH -_Py_COMP_DIAG_IGNORE_DEPR_DECLS - const wchar_t *path = PyUnicode_AsUnicode(ub); -_Py_COMP_DIAG_POP -#else /* USE_UNICODE_WCHAR_CACHE */ wchar_t *path = PyUnicode_AsWideCharString(ub, NULL); Py_DECREF(ub); -#endif /* USE_UNICODE_WCHAR_CACHE */ #else /* POSIX */ if (!PyUnicode_FSConverter(self->path, &ub)) return NULL; @@ -13616,11 +13583,11 @@ _Py_COMP_DIAG_POP } Py_END_ALLOW_THREADS } -#if defined(MS_WINDOWS) && !USE_UNICODE_WCHAR_CACHE +#if defined(MS_WINDOWS) PyMem_Free(path); -#else /* USE_UNICODE_WCHAR_CACHE */ +#else Py_DECREF(ub); -#endif /* USE_UNICODE_WCHAR_CACHE */ +#endif if (result != 0) return path_object_error(self->path); @@ -13814,19 +13781,10 @@ os_DirEntry_inode_impl(DirEntry *self) if (!PyUnicode_FSDecoder(self->path, &unicode)) return NULL; -#if USE_UNICODE_WCHAR_CACHE -_Py_COMP_DIAG_PUSH -_Py_COMP_DIAG_IGNORE_DEPR_DECLS - const wchar_t *path = PyUnicode_AsUnicode(unicode); - result = LSTAT(path, &stat); - Py_DECREF(unicode); -_Py_COMP_DIAG_POP -#else /* USE_UNICODE_WCHAR_CACHE */ wchar_t *path = PyUnicode_AsWideCharString(unicode, NULL); Py_DECREF(unicode); result = LSTAT(path, &stat); PyMem_Free(path); -#endif /* USE_UNICODE_WCHAR_CACHE */ if (result != 0) return path_object_error(self->path); diff --git a/Objects/stringlib/eq.h b/Objects/stringlib/eq.h index 9c1058b86cbed..2f2438845a629 100644 --- a/Objects/stringlib/eq.h +++ b/Objects/stringlib/eq.h @@ -4,15 +4,10 @@ * unicode_eq() is called when the hash of two unicode objects is equal. */ Py_LOCAL_INLINE(int) -unicode_eq(PyObject *aa, PyObject *bb) +unicode_eq(PyObject *a, PyObject *b) { - assert(PyUnicode_Check(aa)); - assert(PyUnicode_Check(bb)); - assert(PyUnicode_IS_READY(aa)); - assert(PyUnicode_IS_READY(bb)); - - PyUnicodeObject *a = (PyUnicodeObject *)aa; - PyUnicodeObject *b = (PyUnicodeObject *)bb; + assert(PyUnicode_Check(a)); + assert(PyUnicode_Check(b)); if (PyUnicode_GET_LENGTH(a) != PyUnicode_GET_LENGTH(b)) return 0; diff --git a/Objects/stringlib/unicodedefs.h b/Objects/stringlib/unicodedefs.h deleted file mode 100644 index ba2ce0aeea1cc..0000000000000 --- a/Objects/stringlib/unicodedefs.h +++ /dev/null @@ -1,32 +0,0 @@ -#ifndef STRINGLIB_UNICODEDEFS_H -#define STRINGLIB_UNICODEDEFS_H - -/* this is sort of a hack. there's at least one place (formatting - floats) where some stringlib code takes a different path if it's - compiled as unicode. */ -#define STRINGLIB_IS_UNICODE 1 - -#define FASTSEARCH fastsearch -#define STRINGLIB(F) stringlib_##F -#define STRINGLIB_OBJECT PyUnicodeObject -#define STRINGLIB_SIZEOF_CHAR Py_UNICODE_SIZE -#define STRINGLIB_CHAR Py_UNICODE -#define STRINGLIB_TYPE_NAME "unicode" -#define STRINGLIB_PARSE_CODE "U" -#define STRINGLIB_ISSPACE Py_UNICODE_ISSPACE -#define STRINGLIB_ISLINEBREAK BLOOM_LINEBREAK -#define STRINGLIB_ISDECIMAL Py_UNICODE_ISDECIMAL -#define STRINGLIB_TODECIMAL Py_UNICODE_TODECIMAL -#define STRINGLIB_STR PyUnicode_AS_UNICODE -#define STRINGLIB_LEN PyUnicode_GET_SIZE -#define STRINGLIB_NEW PyUnicode_FromUnicode -#define STRINGLIB_CHECK PyUnicode_Check -#define STRINGLIB_CHECK_EXACT PyUnicode_CheckExact -#define STRINGLIB_MUTABLE 0 - -#define STRINGLIB_TOSTR PyObject_Str -#define STRINGLIB_TOASCII PyObject_ASCII - -#define STRINGLIB_WANT_CONTAINS_OBJ 1 - -#endif /* !STRINGLIB_UNICODEDEFS_H */ diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 656c7ccc8e865..cc50fcd76791c 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -115,7 +115,6 @@ extern "C" { (_PyCompactUnicodeObject_CAST(op)->utf8) #define PyUnicode_UTF8(op) \ (assert(_PyUnicode_CHECK(op)), \ - assert(PyUnicode_IS_READY(op)), \ PyUnicode_IS_COMPACT_ASCII(op) ? \ ((char*)(_PyASCIIObject_CAST(op) + 1)) : \ _PyUnicode_UTF8(op)) @@ -123,21 +122,10 @@ extern "C" { (_PyCompactUnicodeObject_CAST(op)->utf8_length) #define PyUnicode_UTF8_LENGTH(op) \ (assert(_PyUnicode_CHECK(op)), \ - assert(PyUnicode_IS_READY(op)), \ PyUnicode_IS_COMPACT_ASCII(op) ? \ _PyASCIIObject_CAST(op)->length : \ _PyUnicode_UTF8_LENGTH(op)) -#define _PyUnicode_WSTR(op) \ - (_PyASCIIObject_CAST(op)->wstr) - -/* Don't use deprecated macro of unicodeobject.h */ -#undef PyUnicode_WSTR_LENGTH -#define PyUnicode_WSTR_LENGTH(op) \ - (PyUnicode_IS_COMPACT_ASCII(op) ? \ - _PyASCIIObject_CAST(op)->length : \ - _PyCompactUnicodeObject_CAST(op)->wstr_length) -#define _PyUnicode_WSTR_LENGTH(op) \ - (_PyCompactUnicodeObject_CAST(op)->wstr_length) + #define _PyUnicode_LENGTH(op) \ (_PyASCIIObject_CAST(op)->length) #define _PyUnicode_STATE(op) \ @@ -153,20 +141,10 @@ extern "C" { #define _PyUnicode_DATA_ANY(op) \ (_PyUnicodeObject_CAST(op)->data.any) -#undef PyUnicode_READY -#define PyUnicode_READY(op) \ - (assert(_PyUnicode_CHECK(op)), \ - (PyUnicode_IS_READY(op) ? \ - 0 : \ - _PyUnicode_Ready(op))) - #define _PyUnicode_SHARE_UTF8(op) \ (assert(_PyUnicode_CHECK(op)), \ assert(!PyUnicode_IS_COMPACT_ASCII(op)), \ (_PyUnicode_UTF8(op) == PyUnicode_DATA(op))) -#define _PyUnicode_SHARE_WSTR(op) \ - (assert(_PyUnicode_CHECK(op)), \ - (_PyUnicode_WSTR(unicode) == PyUnicode_DATA(op))) /* true if the Unicode object has an allocated UTF-8 memory block (not shared with other data) */ @@ -175,13 +153,6 @@ extern "C" { && _PyUnicode_UTF8(op) \ && _PyUnicode_UTF8(op) != PyUnicode_DATA(op))) -/* true if the Unicode object has an allocated wstr memory block - (not shared with other data) */ -#define _PyUnicode_HAS_WSTR_MEMORY(op) \ - ((_PyUnicode_WSTR(op) && \ - (!PyUnicode_IS_READY(op) || \ - _PyUnicode_WSTR(op) != PyUnicode_DATA(op)))) - /* Generic helper macro to convert characters of different types. from_type and to_type have to be valid type names, begin and end are pointers to the source characters which should be of type @@ -280,7 +251,6 @@ unicode_fill(enum PyUnicode_Kind kind, void *data, Py_UCS4 value, Py_ssize_t start, Py_ssize_t length) { assert(0 <= start); - assert(kind != PyUnicode_WCHAR_KIND); switch (kind) { case PyUnicode_1BYTE_KIND: { assert(value <= 0xff); @@ -342,7 +312,6 @@ const unsigned char _Py_ascii_whitespace[] = { }; /* forward */ -static PyUnicodeObject *_PyUnicode_New(Py_ssize_t length); static PyObject* get_latin1_char(unsigned char ch); static int unicode_modifiable(PyObject *unicode); @@ -518,7 +487,6 @@ _PyUnicode_CheckConsistency(PyObject *op, int check_content) if (ascii->state.ascii == 1 && ascii->state.compact == 1) { CHECK(kind == PyUnicode_1BYTE_KIND); - CHECK(ascii->state.ready == 1); } else { PyCompactUnicodeObject *compact = _PyCompactUnicodeObject_CAST(op); @@ -530,62 +498,32 @@ _PyUnicode_CheckConsistency(PyObject *op, int check_content) || kind == PyUnicode_2BYTE_KIND || kind == PyUnicode_4BYTE_KIND); CHECK(ascii->state.ascii == 0); - CHECK(ascii->state.ready == 1); CHECK(compact->utf8 != data); } else { PyUnicodeObject *unicode = _PyUnicodeObject_CAST(op); data = unicode->data.any; - if (kind == PyUnicode_WCHAR_KIND) { - CHECK(ascii->length == 0); - CHECK(ascii->hash == -1); - CHECK(ascii->state.compact == 0); - CHECK(ascii->state.ascii == 0); - CHECK(ascii->state.ready == 0); - CHECK(ascii->state.interned == SSTATE_NOT_INTERNED); - CHECK(ascii->wstr != NULL); - CHECK(data == NULL); - CHECK(compact->utf8 == NULL); + CHECK(kind == PyUnicode_1BYTE_KIND + || kind == PyUnicode_2BYTE_KIND + || kind == PyUnicode_4BYTE_KIND); + CHECK(ascii->state.compact == 0); + CHECK(data != NULL); + if (ascii->state.ascii) { + CHECK(compact->utf8 == data); + CHECK(compact->utf8_length == ascii->length); } else { - CHECK(kind == PyUnicode_1BYTE_KIND - || kind == PyUnicode_2BYTE_KIND - || kind == PyUnicode_4BYTE_KIND); - CHECK(ascii->state.compact == 0); - CHECK(ascii->state.ready == 1); - CHECK(data != NULL); - if (ascii->state.ascii) { - CHECK(compact->utf8 == data); - CHECK(compact->utf8_length == ascii->length); - } - else - CHECK(compact->utf8 != data); + CHECK(compact->utf8 != data); } } - if (kind != PyUnicode_WCHAR_KIND) { - if ( -#if SIZEOF_WCHAR_T == 2 - kind == PyUnicode_2BYTE_KIND -#else - kind == PyUnicode_4BYTE_KIND -#endif - ) - { - CHECK(ascii->wstr == data); - CHECK(compact->wstr_length == ascii->length); - } else - CHECK(ascii->wstr != data); - } if (compact->utf8 == NULL) CHECK(compact->utf8_length == 0); - if (ascii->wstr == NULL) - CHECK(compact->wstr_length == 0); } /* check that the best kind is used: O(n) operation */ - if (check_content && kind != PyUnicode_WCHAR_KIND) { + if (check_content) { Py_ssize_t i; Py_UCS4 maxchar = 0; const void *data; @@ -621,47 +559,12 @@ _PyUnicode_CheckConsistency(PyObject *op, int check_content) #undef CHECK } - -static PyObject* -unicode_result_wchar(PyObject *unicode) -{ -#ifndef Py_DEBUG - Py_ssize_t len; - - len = _PyUnicode_WSTR_LENGTH(unicode); - if (len == 0) { - Py_DECREF(unicode); - _Py_RETURN_UNICODE_EMPTY(); - } - - if (len == 1) { - wchar_t ch = _PyUnicode_WSTR(unicode)[0]; - if ((Py_UCS4)ch < 256) { - Py_DECREF(unicode); - return get_latin1_char((unsigned char)ch); - } - } - - if (_PyUnicode_Ready(unicode) < 0) { - Py_DECREF(unicode); - return NULL; - } -#else - assert(Py_REFCNT(unicode) == 1); - - /* don't make the result ready in debug mode to ensure that the caller - makes the string ready before using it */ - assert(_PyUnicode_CheckConsistency(unicode, 1)); -#endif - return unicode; -} - static PyObject* -unicode_result_ready(PyObject *unicode) +unicode_result(PyObject *unicode) { - Py_ssize_t length; + assert(_PyUnicode_CHECK(unicode)); - length = PyUnicode_GET_LENGTH(unicode); + Py_ssize_t length = PyUnicode_GET_LENGTH(unicode); if (length == 0) { PyObject *empty = unicode_get_empty(); if (unicode != empty) { @@ -689,22 +592,10 @@ unicode_result_ready(PyObject *unicode) return unicode; } -static PyObject* -unicode_result(PyObject *unicode) -{ - assert(_PyUnicode_CHECK(unicode)); - if (PyUnicode_IS_READY(unicode)) - return unicode_result_ready(unicode); - else - return unicode_result_wchar(unicode); -} - static PyObject* unicode_result_unchanged(PyObject *unicode) { if (PyUnicode_CheckExact(unicode)) { - if (PyUnicode_READY(unicode) == -1) - return NULL; Py_INCREF(unicode); return unicode; } @@ -724,7 +615,6 @@ backslashreplace(_PyBytesWriter *writer, char *str, enum PyUnicode_Kind kind; const void *data; - assert(PyUnicode_IS_READY(unicode)); kind = PyUnicode_KIND(unicode); data = PyUnicode_DATA(unicode); @@ -791,7 +681,6 @@ xmlcharrefreplace(_PyBytesWriter *writer, char *str, enum PyUnicode_Kind kind; const void *data; - assert(PyUnicode_IS_READY(unicode)); kind = PyUnicode_KIND(unicode); data = PyUnicode_DATA(unicode); @@ -915,7 +804,7 @@ ensure_unicode(PyObject *obj) Py_TYPE(obj)->tp_name); return -1; } - return PyUnicode_READY(obj); + return 0; } /* Compilation of templated routines */ @@ -961,15 +850,6 @@ ensure_unicode(PyObject *obj) #include "stringlib/find_max_char.h" #include "stringlib/undef.h" -_Py_COMP_DIAG_PUSH -_Py_COMP_DIAG_IGNORE_DEPR_DECLS -#include "stringlib/unicodedefs.h" -#include "stringlib/fastsearch.h" -#include "stringlib/count.h" -#include "stringlib/find.h" -#include "stringlib/undef.h" -_Py_COMP_DIAG_POP - #undef STRINGLIB_GET_EMPTY /* --- Unicode Object ----------------------------------------------------- */ @@ -1029,14 +909,12 @@ resize_compact(PyObject *unicode, Py_ssize_t length) Py_ssize_t char_size; Py_ssize_t struct_size; Py_ssize_t new_size; - int share_wstr; PyObject *new_unicode; #ifdef Py_DEBUG Py_ssize_t old_length = _PyUnicode_LENGTH(unicode); #endif assert(unicode_modifiable(unicode)); - assert(PyUnicode_IS_READY(unicode)); assert(PyUnicode_IS_COMPACT(unicode)); char_size = PyUnicode_KIND(unicode); @@ -1044,7 +922,6 @@ resize_compact(PyObject *unicode, Py_ssize_t length) struct_size = sizeof(PyASCIIObject); else struct_size = sizeof(PyCompactUnicodeObject); - share_wstr = _PyUnicode_SHARE_WSTR(unicode); if (length > ((PY_SSIZE_T_MAX - struct_size) / char_size - 1)) { PyErr_NoMemory(); @@ -1074,17 +951,6 @@ resize_compact(PyObject *unicode, Py_ssize_t length) _Py_NewReference(unicode); _PyUnicode_LENGTH(unicode) = length; - if (share_wstr) { - _PyUnicode_WSTR(unicode) = PyUnicode_DATA(unicode); - if (!PyUnicode_IS_ASCII(unicode)) - _PyUnicode_WSTR_LENGTH(unicode) = length; - } - else if (_PyUnicode_HAS_WSTR_MEMORY(unicode)) { - PyObject_Free(_PyUnicode_WSTR(unicode)); - _PyUnicode_WSTR(unicode) = NULL; - if (!PyUnicode_IS_ASCII(unicode)) - _PyUnicode_WSTR_LENGTH(unicode) = 0; - } #ifdef Py_DEBUG unicode_fill_invalid(unicode, old_length); #endif @@ -1097,78 +963,55 @@ resize_compact(PyObject *unicode, Py_ssize_t length) static int resize_inplace(PyObject *unicode, Py_ssize_t length) { - wchar_t *wstr; - Py_ssize_t new_size; assert(!PyUnicode_IS_COMPACT(unicode)); assert(Py_REFCNT(unicode) == 1); - if (PyUnicode_IS_READY(unicode)) { - Py_ssize_t char_size; - int share_wstr, share_utf8; - void *data; + Py_ssize_t new_size; + Py_ssize_t char_size; + int share_utf8; + void *data; #ifdef Py_DEBUG - Py_ssize_t old_length = _PyUnicode_LENGTH(unicode); + Py_ssize_t old_length = _PyUnicode_LENGTH(unicode); #endif - data = _PyUnicode_DATA_ANY(unicode); - char_size = PyUnicode_KIND(unicode); - share_wstr = _PyUnicode_SHARE_WSTR(unicode); - share_utf8 = _PyUnicode_SHARE_UTF8(unicode); + data = _PyUnicode_DATA_ANY(unicode); + char_size = PyUnicode_KIND(unicode); + share_utf8 = _PyUnicode_SHARE_UTF8(unicode); - if (length > (PY_SSIZE_T_MAX / char_size - 1)) { - PyErr_NoMemory(); - return -1; - } - new_size = (length + 1) * char_size; + if (length > (PY_SSIZE_T_MAX / char_size - 1)) { + PyErr_NoMemory(); + return -1; + } + new_size = (length + 1) * char_size; - if (!share_utf8 && _PyUnicode_HAS_UTF8_MEMORY(unicode)) - { - PyObject_Free(_PyUnicode_UTF8(unicode)); - _PyUnicode_UTF8(unicode) = NULL; - _PyUnicode_UTF8_LENGTH(unicode) = 0; - } + if (!share_utf8 && _PyUnicode_HAS_UTF8_MEMORY(unicode)) + { + PyObject_Free(_PyUnicode_UTF8(unicode)); + _PyUnicode_UTF8(unicode) = NULL; + _PyUnicode_UTF8_LENGTH(unicode) = 0; + } - data = (PyObject *)PyObject_Realloc(data, new_size); - if (data == NULL) { - PyErr_NoMemory(); - return -1; - } - _PyUnicode_DATA_ANY(unicode) = data; - if (share_wstr) { - _PyUnicode_WSTR(unicode) = data; - _PyUnicode_WSTR_LENGTH(unicode) = length; - } - if (share_utf8) { - _PyUnicode_UTF8(unicode) = data; - _PyUnicode_UTF8_LENGTH(unicode) = length; - } - _PyUnicode_LENGTH(unicode) = length; - PyUnicode_WRITE(PyUnicode_KIND(unicode), data, length, 0); + data = (PyObject *)PyObject_Realloc(data, new_size); + if (data == NULL) { + PyErr_NoMemory(); + return -1; + } + _PyUnicode_DATA_ANY(unicode) = data; + if (share_utf8) { + _PyUnicode_UTF8(unicode) = data; + _PyUnicode_UTF8_LENGTH(unicode) = length; + } + _PyUnicode_LENGTH(unicode) = length; + PyUnicode_WRITE(PyUnicode_KIND(unicode), data, length, 0); #ifdef Py_DEBUG - unicode_fill_invalid(unicode, old_length); + unicode_fill_invalid(unicode, old_length); #endif - if (share_wstr || _PyUnicode_WSTR(unicode) == NULL) { - assert(_PyUnicode_CheckConsistency(unicode, 0)); - return 0; - } - } - assert(_PyUnicode_WSTR(unicode) != NULL); /* check for integer overflow */ if (length > PY_SSIZE_T_MAX / (Py_ssize_t)sizeof(wchar_t) - 1) { PyErr_NoMemory(); return -1; } - new_size = sizeof(wchar_t) * (length + 1); - wstr = _PyUnicode_WSTR(unicode); - wstr = PyObject_Realloc(wstr, new_size); - if (!wstr) { - PyErr_NoMemory(); - return -1; - } - _PyUnicode_WSTR(unicode) = wstr; - _PyUnicode_WSTR(unicode)[length] = 0; - _PyUnicode_WSTR_LENGTH(unicode) = length; assert(_PyUnicode_CheckConsistency(unicode, 0)); return 0; } @@ -1177,99 +1020,15 @@ static PyObject* resize_copy(PyObject *unicode, Py_ssize_t length) { Py_ssize_t copy_length; - if (_PyUnicode_KIND(unicode) != PyUnicode_WCHAR_KIND) { - PyObject *copy; - - assert(PyUnicode_IS_READY(unicode)); - - copy = PyUnicode_New(length, PyUnicode_MAX_CHAR_VALUE(unicode)); - if (copy == NULL) - return NULL; - - copy_length = Py_MIN(length, PyUnicode_GET_LENGTH(unicode)); - _PyUnicode_FastCopyCharacters(copy, 0, unicode, 0, copy_length); - return copy; - } - else { - PyObject *w; - - w = (PyObject*)_PyUnicode_New(length); - if (w == NULL) - return NULL; - copy_length = _PyUnicode_WSTR_LENGTH(unicode); - copy_length = Py_MIN(copy_length, length); - memcpy(_PyUnicode_WSTR(w), _PyUnicode_WSTR(unicode), - copy_length * sizeof(wchar_t)); - return w; - } -} - -/* We allocate one more byte to make sure the string is - Ux0000 terminated; some code (e.g. new_identifier) - relies on that. - - XXX This allocator could further be enhanced by assuring that the - free list never reduces its size below 1. - -*/ - -static PyUnicodeObject * -_PyUnicode_New(Py_ssize_t length) -{ - PyUnicodeObject *unicode; - size_t new_size; - - /* Optimization for empty strings */ - if (length == 0) { - return (PyUnicodeObject *)unicode_new_empty(); - } - - /* Ensure we won't overflow the size. */ - if (length > ((PY_SSIZE_T_MAX / (Py_ssize_t)sizeof(Py_UNICODE)) - 1)) { - return (PyUnicodeObject *)PyErr_NoMemory(); - } - if (length < 0) { - PyErr_SetString(PyExc_SystemError, - "Negative size passed to _PyUnicode_New"); - return NULL; - } - - unicode = PyObject_New(PyUnicodeObject, &PyUnicode_Type); - if (unicode == NULL) - return NULL; - new_size = sizeof(Py_UNICODE) * ((size_t)length + 1); + PyObject *copy; - _PyUnicode_WSTR_LENGTH(unicode) = length; - _PyUnicode_HASH(unicode) = -1; - _PyUnicode_STATE(unicode).interned = 0; - _PyUnicode_STATE(unicode).kind = 0; - _PyUnicode_STATE(unicode).compact = 0; - _PyUnicode_STATE(unicode).ready = 0; - _PyUnicode_STATE(unicode).ascii = 0; - _PyUnicode_DATA_ANY(unicode) = NULL; - _PyUnicode_LENGTH(unicode) = 0; - _PyUnicode_UTF8(unicode) = NULL; - _PyUnicode_UTF8_LENGTH(unicode) = 0; - - _PyUnicode_WSTR(unicode) = (Py_UNICODE*) PyObject_Malloc(new_size); - if (!_PyUnicode_WSTR(unicode)) { - Py_DECREF(unicode); - PyErr_NoMemory(); + copy = PyUnicode_New(length, PyUnicode_MAX_CHAR_VALUE(unicode)); + if (copy == NULL) return NULL; - } - /* Initialize the first element to guard against cases where - * the caller fails before initializing str -- unicode_resize() - * reads str[0], and the Keep-Alive optimization can keep memory - * allocated for str alive across a call to unicode_dealloc(unicode). - * We don't want unicode_resize to read uninitialized memory in - * that case. - */ - _PyUnicode_WSTR(unicode)[0] = 0; - _PyUnicode_WSTR(unicode)[length] = 0; - - assert(_PyUnicode_CheckConsistency((PyObject *)unicode, 0)); - return unicode; + copy_length = Py_MIN(length, PyUnicode_GET_LENGTH(unicode)); + _PyUnicode_FastCopyCharacters(copy, 0, unicode, 0, copy_length); + return copy; } static const char* @@ -1279,8 +1038,6 @@ unicode_kind_name(PyObject *unicode) _PyUnicode_Dump() */ if (!PyUnicode_IS_COMPACT(unicode)) { - if (!PyUnicode_IS_READY(unicode)) - return "wstr"; switch (PyUnicode_KIND(unicode)) { case PyUnicode_1BYTE_KIND: @@ -1296,7 +1053,6 @@ unicode_kind_name(PyObject *unicode) return ""; } } - assert(PyUnicode_IS_READY(unicode)); switch (PyUnicode_KIND(unicode)) { case PyUnicode_1BYTE_KIND: if (PyUnicode_IS_ASCII(unicode)) @@ -1353,15 +1109,7 @@ _PyUnicode_Dump(PyObject *op) data = unicode->data.any; printf("%s: len=%zu, ", unicode_kind_name(op), ascii->length); - if (ascii->wstr == data) - printf("shared "); - printf("wstr=%p", (void *)ascii->wstr); - - if (!(ascii->state.ascii == 1 && ascii->state.compact == 1)) { - printf(" (%zu), ", compact->wstr_length); - if (!ascii->state.compact && compact->utf8 == unicode->data.any) { - printf("shared "); - } + if (!ascii->state.ascii) { printf("utf8=%p (%zu)", (void *)compact->utf8, compact->utf8_length); } printf(", data=%p\n", data); @@ -1381,12 +1129,11 @@ PyUnicode_New(Py_ssize_t size, Py_UCS4 maxchar) PyCompactUnicodeObject *unicode; void *data; enum PyUnicode_Kind kind; - int is_sharing, is_ascii; + int is_ascii; Py_ssize_t char_size; Py_ssize_t struct_size; is_ascii = 0; - is_sharing = 0; struct_size = sizeof(PyCompactUnicodeObject); if (maxchar < 128) { kind = PyUnicode_1BYTE_KIND; @@ -1401,8 +1148,6 @@ PyUnicode_New(Py_ssize_t size, Py_UCS4 maxchar) else if (maxchar < 65536) { kind = PyUnicode_2BYTE_KIND; char_size = 2; - if (sizeof(wchar_t) == 2) - is_sharing = 1; } else { if (maxchar > MAX_UNICODE) { @@ -1412,8 +1157,6 @@ PyUnicode_New(Py_ssize_t size, Py_UCS4 maxchar) } kind = PyUnicode_4BYTE_KIND; char_size = 4; - if (sizeof(wchar_t) == 4) - is_sharing = 1; } /* Ensure we won't overflow the size. */ @@ -1445,16 +1188,12 @@ PyUnicode_New(Py_ssize_t size, Py_UCS4 maxchar) _PyUnicode_STATE(unicode).interned = 0; _PyUnicode_STATE(unicode).kind = kind; _PyUnicode_STATE(unicode).compact = 1; - _PyUnicode_STATE(unicode).ready = 1; _PyUnicode_STATE(unicode).ascii = is_ascii; if (is_ascii) { ((char*)data)[size] = 0; - _PyUnicode_WSTR(unicode) = NULL; } else if (kind == PyUnicode_1BYTE_KIND) { ((char*)data)[size] = 0; - _PyUnicode_WSTR(unicode) = NULL; - _PyUnicode_WSTR_LENGTH(unicode) = 0; unicode->utf8 = NULL; unicode->utf8_length = 0; } @@ -1465,14 +1204,6 @@ PyUnicode_New(Py_ssize_t size, Py_UCS4 maxchar) ((Py_UCS2*)data)[size] = 0; else /* kind == PyUnicode_4BYTE_KIND */ ((Py_UCS4*)data)[size] = 0; - if (is_sharing) { - _PyUnicode_WSTR_LENGTH(unicode) = size; - _PyUnicode_WSTR(unicode) = (wchar_t *)data; - } - else { - _PyUnicode_WSTR_LENGTH(unicode) = 0; - _PyUnicode_WSTR(unicode) = NULL; - } } #ifdef Py_DEBUG unicode_fill_invalid((PyObject*)unicode, 0); @@ -1545,11 +1276,9 @@ _copy_characters(PyObject *to, Py_ssize_t to_start, assert(0 <= from_start); assert(0 <= to_start); assert(PyUnicode_Check(from)); - assert(PyUnicode_IS_READY(from)); assert(from_start + how_many <= PyUnicode_GET_LENGTH(from)); assert(PyUnicode_Check(to)); - assert(PyUnicode_IS_READY(to)); assert(to_start + how_many <= PyUnicode_GET_LENGTH(to)); if (how_many == 0) @@ -1694,11 +1423,6 @@ PyUnicode_CopyCharacters(PyObject *to, Py_ssize_t to_start, return -1; } - if (PyUnicode_READY(from) == -1) - return -1; - if (PyUnicode_READY(to) == -1) - return -1; - if ((size_t)from_start > (size_t)PyUnicode_GET_LENGTH(from)) { PyErr_SetString(PyExc_IndexError, "string index out of range"); return -1; @@ -1783,135 +1507,6 @@ find_maxchar_surrogates(const wchar_t *begin, const wchar_t *end, return 0; } -int -_PyUnicode_Ready(PyObject *unicode) -{ - wchar_t *end; - Py_UCS4 maxchar = 0; - Py_ssize_t num_surrogates; -#if SIZEOF_WCHAR_T == 2 - Py_ssize_t length_wo_surrogates; -#endif - - /* _PyUnicode_Ready() is only intended for old-style API usage where - strings were created using _PyObject_New() and where no canonical - representation (the str field) has been set yet aka strings - which are not yet ready. */ - assert(_PyUnicode_CHECK(unicode)); - assert(_PyUnicode_KIND(unicode) == PyUnicode_WCHAR_KIND); - assert(_PyUnicode_WSTR(unicode) != NULL); - assert(_PyUnicode_DATA_ANY(unicode) == NULL); - assert(_PyUnicode_UTF8(unicode) == NULL); - /* Actually, it should neither be interned nor be anything else: */ - assert(_PyUnicode_STATE(unicode).interned == SSTATE_NOT_INTERNED); - - end = _PyUnicode_WSTR(unicode) + _PyUnicode_WSTR_LENGTH(unicode); - if (find_maxchar_surrogates(_PyUnicode_WSTR(unicode), end, - &maxchar, &num_surrogates) == -1) - return -1; - - if (maxchar < 256) { - _PyUnicode_DATA_ANY(unicode) = PyObject_Malloc(_PyUnicode_WSTR_LENGTH(unicode) + 1); - if (!_PyUnicode_DATA_ANY(unicode)) { - PyErr_NoMemory(); - return -1; - } - _PyUnicode_CONVERT_BYTES(wchar_t, unsigned char, - _PyUnicode_WSTR(unicode), end, - PyUnicode_1BYTE_DATA(unicode)); - PyUnicode_1BYTE_DATA(unicode)[_PyUnicode_WSTR_LENGTH(unicode)] = '\0'; - _PyUnicode_LENGTH(unicode) = _PyUnicode_WSTR_LENGTH(unicode); - _PyUnicode_STATE(unicode).kind = PyUnicode_1BYTE_KIND; - if (maxchar < 128) { - _PyUnicode_STATE(unicode).ascii = 1; - _PyUnicode_UTF8(unicode) = _PyUnicode_DATA_ANY(unicode); - _PyUnicode_UTF8_LENGTH(unicode) = _PyUnicode_WSTR_LENGTH(unicode); - } - else { - _PyUnicode_STATE(unicode).ascii = 0; - _PyUnicode_UTF8(unicode) = NULL; - _PyUnicode_UTF8_LENGTH(unicode) = 0; - } - PyObject_Free(_PyUnicode_WSTR(unicode)); - _PyUnicode_WSTR(unicode) = NULL; - _PyUnicode_WSTR_LENGTH(unicode) = 0; - } - /* In this case we might have to convert down from 4-byte native - wchar_t to 2-byte unicode. */ - else if (maxchar < 65536) { - assert(num_surrogates == 0 && - "FindMaxCharAndNumSurrogatePairs() messed up"); - -#if SIZEOF_WCHAR_T == 2 - /* We can share representations and are done. */ - _PyUnicode_DATA_ANY(unicode) = _PyUnicode_WSTR(unicode); - PyUnicode_2BYTE_DATA(unicode)[_PyUnicode_WSTR_LENGTH(unicode)] = '\0'; - _PyUnicode_LENGTH(unicode) = _PyUnicode_WSTR_LENGTH(unicode); - _PyUnicode_STATE(unicode).kind = PyUnicode_2BYTE_KIND; - _PyUnicode_UTF8(unicode) = NULL; - _PyUnicode_UTF8_LENGTH(unicode) = 0; -#else - /* sizeof(wchar_t) == 4 */ - _PyUnicode_DATA_ANY(unicode) = PyObject_Malloc( - 2 * (_PyUnicode_WSTR_LENGTH(unicode) + 1)); - if (!_PyUnicode_DATA_ANY(unicode)) { - PyErr_NoMemory(); - return -1; - } - _PyUnicode_CONVERT_BYTES(wchar_t, Py_UCS2, - _PyUnicode_WSTR(unicode), end, - PyUnicode_2BYTE_DATA(unicode)); - PyUnicode_2BYTE_DATA(unicode)[_PyUnicode_WSTR_LENGTH(unicode)] = '\0'; - _PyUnicode_LENGTH(unicode) = _PyUnicode_WSTR_LENGTH(unicode); - _PyUnicode_STATE(unicode).kind = PyUnicode_2BYTE_KIND; - _PyUnicode_UTF8(unicode) = NULL; - _PyUnicode_UTF8_LENGTH(unicode) = 0; - PyObject_Free(_PyUnicode_WSTR(unicode)); - _PyUnicode_WSTR(unicode) = NULL; - _PyUnicode_WSTR_LENGTH(unicode) = 0; -#endif - } - /* maxchar exceeds 16 bit, wee need 4 bytes for unicode characters */ - else { -#if SIZEOF_WCHAR_T == 2 - /* in case the native representation is 2-bytes, we need to allocate a - new normalized 4-byte version. */ - length_wo_surrogates = _PyUnicode_WSTR_LENGTH(unicode) - num_surrogates; - if (length_wo_surrogates > PY_SSIZE_T_MAX / 4 - 1) { - PyErr_NoMemory(); - return -1; - } - _PyUnicode_DATA_ANY(unicode) = PyObject_Malloc(4 * (length_wo_surrogates + 1)); - if (!_PyUnicode_DATA_ANY(unicode)) { - PyErr_NoMemory(); - return -1; - } - _PyUnicode_LENGTH(unicode) = length_wo_surrogates; - _PyUnicode_STATE(unicode).kind = PyUnicode_4BYTE_KIND; - _PyUnicode_UTF8(unicode) = NULL; - _PyUnicode_UTF8_LENGTH(unicode) = 0; - /* unicode_convert_wchar_to_ucs4() requires a ready string */ - _PyUnicode_STATE(unicode).ready = 1; - unicode_convert_wchar_to_ucs4(_PyUnicode_WSTR(unicode), end, unicode); - PyObject_Free(_PyUnicode_WSTR(unicode)); - _PyUnicode_WSTR(unicode) = NULL; - _PyUnicode_WSTR_LENGTH(unicode) = 0; -#else - assert(num_surrogates == 0); - - _PyUnicode_DATA_ANY(unicode) = _PyUnicode_WSTR(unicode); - _PyUnicode_LENGTH(unicode) = _PyUnicode_WSTR_LENGTH(unicode); - _PyUnicode_UTF8(unicode) = NULL; - _PyUnicode_UTF8_LENGTH(unicode) = 0; - _PyUnicode_STATE(unicode).kind = PyUnicode_4BYTE_KIND; -#endif - PyUnicode_4BYTE_DATA(unicode)[_PyUnicode_LENGTH(unicode)] = '\0'; - } - _PyUnicode_STATE(unicode).ready = 1; - assert(_PyUnicode_CheckConsistency(unicode, 1)); - return 0; -} - static void unicode_dealloc(PyObject *unicode) { @@ -1953,9 +1548,6 @@ unicode_dealloc(PyObject *unicode) Py_UNREACHABLE(); } - if (_PyUnicode_HAS_WSTR_MEMORY(unicode)) { - PyObject_Free(_PyUnicode_WSTR(unicode)); - } if (_PyUnicode_HAS_UTF8_MEMORY(unicode)) { PyObject_Free(_PyUnicode_UTF8(unicode)); } @@ -1975,7 +1567,7 @@ unicode_is_singleton(PyObject *unicode) } PyASCIIObject *ascii = _PyASCIIObject_CAST(unicode); - if (ascii->state.kind != PyUnicode_WCHAR_KIND && ascii->length == 1) { + if (ascii->length == 1) { Py_UCS4 ch = PyUnicode_READ_CHAR(unicode, 0); if (ch < 256 && LATIN1(ch) == unicode) { return 1; @@ -2017,10 +1609,7 @@ unicode_resize(PyObject **p_unicode, Py_ssize_t length) assert(PyUnicode_Check(unicode)); assert(0 <= length); - if (_PyUnicode_KIND(unicode) == PyUnicode_WCHAR_KIND) - old_length = PyUnicode_WSTR_LENGTH(unicode); - else - old_length = PyUnicode_GET_LENGTH(unicode); + old_length = PyUnicode_GET_LENGTH(unicode); if (old_length == length) return 0; @@ -2149,28 +1738,6 @@ unicode_char(Py_UCS4 ch) return unicode; } -PyObject * -PyUnicode_FromUnicode(const Py_UNICODE *u, Py_ssize_t size) -{ - if (u == NULL) { - if (size > 0) { - if (PyErr_WarnEx(PyExc_DeprecationWarning, - "PyUnicode_FromUnicode(NULL, size) is deprecated; " - "use PyUnicode_New() instead", 1) < 0) { - return NULL; - } - } - return (PyObject*)_PyUnicode_New(size); - } - - if (size < 0) { - PyErr_BadInternalCall(); - return NULL; - } - - return PyUnicode_FromWideChar(u, size); -} - PyObject * PyUnicode_FromWideChar(const wchar_t *u, Py_ssize_t size) { @@ -2264,16 +1831,12 @@ PyUnicode_FromStringAndSize(const char *u, Py_ssize_t size) if (u != NULL) { return PyUnicode_DecodeUTF8Stateful(u, size, NULL, NULL); } - else { - if (size > 0) { - if (PyErr_WarnEx(PyExc_DeprecationWarning, - "PyUnicode_FromStringAndSize(NULL, size) is deprecated; " - "use PyUnicode_New() instead", 1) < 0) { - return NULL; - } - } - return (PyObject *)_PyUnicode_New(size); + if (size > 0) { + PyErr_SetString(PyExc_SystemError, + "NULL string with positive size with NULL passed to PyUnicode_FromStringAndSize"); + return NULL; } + return unicode_new_empty(); } PyObject * @@ -2504,7 +2067,6 @@ _PyUnicode_FindMaxChar(PyObject *unicode, Py_ssize_t start, Py_ssize_t end) enum PyUnicode_Kind kind; const void *startptr, *endptr; - assert(PyUnicode_IS_READY(unicode)); assert(0 <= start); assert(end <= PyUnicode_GET_LENGTH(unicode)); assert(start <= end); @@ -2547,7 +2109,6 @@ unicode_adjust_maxchar(PyObject **p_unicode) assert(p_unicode != NULL); unicode = *p_unicode; - assert(PyUnicode_IS_READY(unicode)); if (PyUnicode_IS_ASCII(unicode)) return; @@ -2591,8 +2152,6 @@ _PyUnicode_Copy(PyObject *unicode) PyErr_BadInternalCall(); return NULL; } - if (PyUnicode_READY(unicode) == -1) - return NULL; length = PyUnicode_GET_LENGTH(unicode); copy = PyUnicode_New(length, PyUnicode_MAX_CHAR_VALUE(unicode)); @@ -2661,8 +2220,6 @@ as_ucs4(PyObject *string, Py_UCS4 *target, Py_ssize_t targetsize, int kind; const void *data; Py_ssize_t len, targetlen; - if (PyUnicode_READY(string) == -1) - return NULL; kind = PyUnicode_KIND(string); data = PyUnicode_DATA(string); len = PyUnicode_GET_LENGTH(string); @@ -2733,9 +2290,6 @@ unicode_fromformat_write_str(_PyUnicodeWriter *writer, PyObject *str, Py_ssize_t length, fill, arglen; Py_UCS4 maxchar; - if (PyUnicode_READY(str) == -1) - return -1; - length = PyUnicode_GET_LENGTH(str); if ((precision == -1 || precision >= length) && width <= length) @@ -3172,13 +2726,6 @@ unicode_get_widechar_size(PyObject *unicode) assert(unicode != NULL); assert(_PyUnicode_CHECK(unicode)); -#if USE_UNICODE_WCHAR_CACHE - if (_PyUnicode_WSTR(unicode) != NULL) { - return PyUnicode_WSTR_LENGTH(unicode); - } -#endif /* USE_UNICODE_WCHAR_CACHE */ - assert(PyUnicode_IS_READY(unicode)); - res = _PyUnicode_LENGTH(unicode); #if SIZEOF_WCHAR_T == 2 if (PyUnicode_KIND(unicode) == PyUnicode_4BYTE_KIND) { @@ -3200,19 +2747,10 @@ unicode_copy_as_widechar(PyObject *unicode, wchar_t *w, Py_ssize_t size) assert(unicode != NULL); assert(_PyUnicode_CHECK(unicode)); -#if USE_UNICODE_WCHAR_CACHE - const wchar_t *wstr = _PyUnicode_WSTR(unicode); - if (wstr != NULL) { - memcpy(w, wstr, size * sizeof(wchar_t)); - return; - } -#else /* USE_UNICODE_WCHAR_CACHE */ if (PyUnicode_KIND(unicode) == sizeof(wchar_t)) { memcpy(w, PyUnicode_DATA(unicode), size * sizeof(wchar_t)); return; } -#endif /* USE_UNICODE_WCHAR_CACHE */ - assert(PyUnicode_IS_READY(unicode)); if (PyUnicode_KIND(unicode) == PyUnicode_1BYTE_KIND) { const Py_UCS1 *s = PyUnicode_1BYTE_DATA(unicode); @@ -3353,26 +2891,16 @@ _PyUnicode_WideCharString_Converter(PyObject *obj, void *ptr) { wchar_t **p = (wchar_t **)ptr; if (obj == NULL) { -#if !USE_UNICODE_WCHAR_CACHE PyMem_Free(*p); -#endif /* USE_UNICODE_WCHAR_CACHE */ *p = NULL; return 1; } if (PyUnicode_Check(obj)) { -#if USE_UNICODE_WCHAR_CACHE - *p = (wchar_t *)_PyUnicode_AsUnicode(obj); - if (*p == NULL) { - return 0; - } - return 1; -#else /* USE_UNICODE_WCHAR_CACHE */ *p = PyUnicode_AsWideCharString(obj, NULL); if (*p == NULL) { return 0; } return Py_CLEANUP_SUPPORTED; -#endif /* USE_UNICODE_WCHAR_CACHE */ } PyErr_Format(PyExc_TypeError, "argument must be str, not %.50s", @@ -3385,9 +2913,7 @@ _PyUnicode_WideCharString_Opt_Converter(PyObject *obj, void *ptr) { wchar_t **p = (wchar_t **)ptr; if (obj == NULL) { -#if !USE_UNICODE_WCHAR_CACHE PyMem_Free(*p); -#endif /* USE_UNICODE_WCHAR_CACHE */ *p = NULL; return 1; } @@ -3396,19 +2922,11 @@ _PyUnicode_WideCharString_Opt_Converter(PyObject *obj, void *ptr) return 1; } if (PyUnicode_Check(obj)) { -#if USE_UNICODE_WCHAR_CACHE - *p = (wchar_t *)_PyUnicode_AsUnicode(obj); - if (*p == NULL) { - return 0; - } - return 1; -#else /* USE_UNICODE_WCHAR_CACHE */ *p = PyUnicode_AsWideCharString(obj, NULL); if (*p == NULL) { return 0; } return Py_CLEANUP_SUPPORTED; -#endif /* USE_UNICODE_WCHAR_CACHE */ } PyErr_Format(PyExc_TypeError, "argument must be str or None, not %.50s", @@ -3434,8 +2952,6 @@ PyUnicode_FromObject(PyObject *obj) /* XXX Perhaps we should make this API an alias of PyObject_Str() instead ?! */ if (PyUnicode_CheckExact(obj)) { - if (PyUnicode_READY(obj) == -1) - return NULL; Py_INCREF(obj); return obj; } @@ -4161,10 +3677,6 @@ PyUnicode_FSDecoder(PyObject* arg, void* addr) Py_DECREF(path); return 0; } - if (PyUnicode_READY(output) == -1) { - Py_DECREF(output); - return 0; - } if (findchar(PyUnicode_DATA(output), PyUnicode_KIND(output), PyUnicode_GET_LENGTH(output), 0, 1) >= 0) { PyErr_SetString(PyExc_ValueError, "embedded null character"); @@ -4185,8 +3697,6 @@ PyUnicode_AsUTF8AndSize(PyObject *unicode, Py_ssize_t *psize) PyErr_BadArgument(); return NULL; } - if (PyUnicode_READY(unicode) == -1) - return NULL; if (PyUnicode_UTF8(unicode) == NULL) { if (unicode_fill_utf8(unicode) == -1) { @@ -4205,85 +3715,22 @@ PyUnicode_AsUTF8(PyObject *unicode) return PyUnicode_AsUTF8AndSize(unicode, NULL); } -Py_UNICODE * -PyUnicode_AsUnicodeAndSize(PyObject *unicode, Py_ssize_t *size) -{ - if (!PyUnicode_Check(unicode)) { - PyErr_BadArgument(); - return NULL; - } - Py_UNICODE *w = _PyUnicode_WSTR(unicode); - if (w == NULL) { - /* Non-ASCII compact unicode object */ - assert(_PyUnicode_KIND(unicode) != PyUnicode_WCHAR_KIND); - assert(PyUnicode_IS_READY(unicode)); - - Py_ssize_t wlen = unicode_get_widechar_size(unicode); - if ((size_t)wlen > PY_SSIZE_T_MAX / sizeof(wchar_t) - 1) { - PyErr_NoMemory(); - return NULL; - } - w = (wchar_t *) PyObject_Malloc(sizeof(wchar_t) * (wlen + 1)); - if (w == NULL) { - PyErr_NoMemory(); - return NULL; - } - unicode_copy_as_widechar(unicode, w, wlen + 1); - _PyUnicode_WSTR(unicode) = w; - if (!PyUnicode_IS_COMPACT_ASCII(unicode)) { - _PyUnicode_WSTR_LENGTH(unicode) = wlen; - } - } - if (size != NULL) - *size = PyUnicode_WSTR_LENGTH(unicode); - return w; -} - -/* Deprecated APIs */ - -_Py_COMP_DIAG_PUSH -_Py_COMP_DIAG_IGNORE_DEPR_DECLS - -Py_UNICODE * -PyUnicode_AsUnicode(PyObject *unicode) -{ - return PyUnicode_AsUnicodeAndSize(unicode, NULL); -} - -const Py_UNICODE * -_PyUnicode_AsUnicode(PyObject *unicode) -{ - Py_ssize_t size; - const Py_UNICODE *wstr; - - wstr = PyUnicode_AsUnicodeAndSize(unicode, &size); - if (wstr && wcslen(wstr) != (size_t)size) { - PyErr_SetString(PyExc_ValueError, "embedded null character"); - return NULL; - } - return wstr; -} - +/* +PyUnicode_GetSize() has been deprecated since Python 3.3 +because it returned length of Py_UNICODE. -Py_ssize_t +But this function is part of stable abi, because it don't +include Py_UNICODE in signature and it was not excluded from +stable abi in PEP 384. +*/ +PyAPI_FUNC(Py_ssize_t) PyUnicode_GetSize(PyObject *unicode) { - if (!PyUnicode_Check(unicode)) { - PyErr_BadArgument(); - goto onError; - } - if (_PyUnicode_WSTR(unicode) == NULL) { - if (PyUnicode_AsUnicode(unicode) == NULL) - goto onError; - } - return PyUnicode_WSTR_LENGTH(unicode); - - onError: + PyErr_SetString(PyExc_RuntimeError, + "PyUnicode_GetSize has been removed."); return -1; } -_Py_COMP_DIAG_POP - Py_ssize_t PyUnicode_GetLength(PyObject *unicode) { @@ -4291,8 +3738,6 @@ PyUnicode_GetLength(PyObject *unicode) PyErr_BadArgument(); return -1; } - if (PyUnicode_READY(unicode) == -1) - return -1; return PyUnicode_GET_LENGTH(unicode); } @@ -4306,9 +3751,6 @@ PyUnicode_ReadChar(PyObject *unicode, Py_ssize_t index) PyErr_BadArgument(); return (Py_UCS4)-1; } - if (PyUnicode_READY(unicode) == -1) { - return (Py_UCS4)-1; - } if (index < 0 || index >= PyUnicode_GET_LENGTH(unicode)) { PyErr_SetString(PyExc_IndexError, "string index out of range"); return (Py_UCS4)-1; @@ -4325,7 +3767,6 @@ PyUnicode_WriteChar(PyObject *unicode, Py_ssize_t index, Py_UCS4 ch) PyErr_BadArgument(); return -1; } - assert(PyUnicode_IS_READY(unicode)); if (index < 0 || index >= PyUnicode_GET_LENGTH(unicode)) { PyErr_SetString(PyExc_IndexError, "string index out of range"); return -1; @@ -4458,19 +3899,10 @@ unicode_decode_call_errorhandler_wchar( goto onError; } -#if USE_UNICODE_WCHAR_CACHE -_Py_COMP_DIAG_PUSH -_Py_COMP_DIAG_IGNORE_DEPR_DECLS - repwlen = PyUnicode_GetSize(repunicode); - if (repwlen < 0) - goto onError; -_Py_COMP_DIAG_POP -#else /* USE_UNICODE_WCHAR_CACHE */ repwlen = PyUnicode_AsWideChar(repunicode, NULL, 0); if (repwlen < 0) goto onError; repwlen--; -#endif /* USE_UNICODE_WCHAR_CACHE */ /* need more space? (at least enough for what we have+the replacement+the rest of the string (starting at the new input position), so we won't have to check space @@ -4920,8 +4352,6 @@ _PyUnicode_EncodeUTF7(PyObject *str, char * out; const char * start; - if (PyUnicode_READY(str) == -1) - return NULL; kind = PyUnicode_KIND(str); data = PyUnicode_DATA(str); len = PyUnicode_GET_LENGTH(str); @@ -5550,9 +4980,6 @@ unicode_encode_utf8(PyObject *unicode, _Py_error_handler error_handler, return NULL; } - if (PyUnicode_READY(unicode) == -1) - return NULL; - if (PyUnicode_UTF8(unicode)) return PyBytes_FromStringAndSize(PyUnicode_UTF8(unicode), PyUnicode_UTF8_LENGTH(unicode)); @@ -5833,8 +5260,6 @@ _PyUnicode_EncodeUTF32(PyObject *str, PyErr_BadArgument(); return NULL; } - if (PyUnicode_READY(str) == -1) - return NULL; kind = PyUnicode_KIND(str); data = PyUnicode_DATA(str); len = PyUnicode_GET_LENGTH(str); @@ -5901,8 +5326,6 @@ _PyUnicode_EncodeUTF32(PyObject *str, } else { assert(PyUnicode_Check(rep)); - if (PyUnicode_READY(rep) < 0) - goto error; moreunits = repsize = PyUnicode_GET_LENGTH(rep); if (!PyUnicode_IS_ASCII(rep)) { raise_encode_exception(&exc, encoding, @@ -6155,8 +5578,6 @@ _PyUnicode_EncodeUTF16(PyObject *str, PyErr_BadArgument(); return NULL; } - if (PyUnicode_READY(str) == -1) - return NULL; kind = PyUnicode_KIND(str); data = PyUnicode_DATA(str); len = PyUnicode_GET_LENGTH(str); @@ -6240,8 +5661,6 @@ _PyUnicode_EncodeUTF16(PyObject *str, } else { assert(PyUnicode_Check(rep)); - if (PyUnicode_READY(rep) < 0) - goto error; moreunits = repsize = PyUnicode_GET_LENGTH(rep); if (!PyUnicode_IS_ASCII(rep)) { raise_encode_exception(&exc, encoding, @@ -6619,9 +6038,6 @@ PyUnicode_AsUnicodeEscapeString(PyObject *unicode) PyErr_BadArgument(); return NULL; } - if (PyUnicode_READY(unicode) == -1) { - return NULL; - } len = PyUnicode_GET_LENGTH(unicode); if (len == 0) { @@ -6876,9 +6292,6 @@ PyUnicode_AsRawUnicodeEscapeString(PyObject *unicode) PyErr_BadArgument(); return NULL; } - if (PyUnicode_READY(unicode) == -1) { - return NULL; - } kind = PyUnicode_KIND(unicode); data = PyUnicode_DATA(unicode); len = PyUnicode_GET_LENGTH(unicode); @@ -7015,8 +6428,6 @@ unicode_encode_call_errorhandler(const char *errors, return NULL; } - if (PyUnicode_READY(unicode) == -1) - return NULL; len = PyUnicode_GET_LENGTH(unicode); make_encode_exception(exceptionObject, @@ -7074,8 +6485,6 @@ unicode_encode_ucs1(PyObject *unicode, /* output object */ _PyBytesWriter writer; - if (PyUnicode_READY(unicode) == -1) - return NULL; size = PyUnicode_GET_LENGTH(unicode); kind = PyUnicode_KIND(unicode); data = PyUnicode_DATA(unicode); @@ -7194,9 +6603,6 @@ unicode_encode_ucs1(PyObject *unicode, else { assert(PyUnicode_Check(rep)); - if (PyUnicode_READY(rep) < 0) - goto onError; - if (limit == 256 ? PyUnicode_KIND(rep) != PyUnicode_1BYTE_KIND : !PyUnicode_IS_ASCII(rep)) @@ -7243,8 +6649,6 @@ _PyUnicode_AsLatin1String(PyObject *unicode, const char *errors) PyErr_BadArgument(); return NULL; } - if (PyUnicode_READY(unicode) == -1) - return NULL; /* Fast path: if it is a one-byte string, construct bytes object directly. */ if (PyUnicode_KIND(unicode) == PyUnicode_1BYTE_KIND) @@ -7369,8 +6773,6 @@ _PyUnicode_AsASCIIString(PyObject *unicode, const char *errors) PyErr_BadArgument(); return NULL; } - if (PyUnicode_READY(unicode) == -1) - return NULL; /* Fast path: if it is an ASCII-only string, construct bytes object directly. Else defer to above function to raise the exception. */ if (PyUnicode_IS_ASCII(unicode)) @@ -7758,22 +7160,11 @@ encode_code_page_strict(UINT code_page, PyObject **outbytes, substring = PyUnicode_Substring(unicode, offset, offset+len); if (substring == NULL) return -1; -#if USE_UNICODE_WCHAR_CACHE -_Py_COMP_DIAG_PUSH -_Py_COMP_DIAG_IGNORE_DEPR_DECLS - p = PyUnicode_AsUnicodeAndSize(substring, &size); - if (p == NULL) { - Py_DECREF(substring); - return -1; - } -_Py_COMP_DIAG_POP -#else /* USE_UNICODE_WCHAR_CACHE */ p = PyUnicode_AsWideCharString(substring, &size); Py_CLEAR(substring); if (p == NULL) { return -1; } -#endif /* USE_UNICODE_WCHAR_CACHE */ assert(size <= INT_MAX); /* First get the size of the result */ @@ -7824,11 +7215,7 @@ _Py_COMP_DIAG_POP ret = 0; done: -#if USE_UNICODE_WCHAR_CACHE - Py_DECREF(substring); -#else /* USE_UNICODE_WCHAR_CACHE */ PyMem_Free(p); -#endif /* USE_UNICODE_WCHAR_CACHE */ return ret; error: @@ -7981,11 +7368,6 @@ encode_code_page_errors(UINT code_page, PyObject **outbytes, enum PyUnicode_Kind kind; const void *data; - if (PyUnicode_READY(rep) == -1) { - Py_DECREF(rep); - goto error; - } - outsize = PyUnicode_GET_LENGTH(rep); morebytes += outsize; if (morebytes > 0) { @@ -8046,8 +7428,6 @@ encode_code_page(int code_page, return NULL; } - if (PyUnicode_READY(unicode) == -1) - return NULL; len = PyUnicode_GET_LENGTH(unicode); if (code_page < 0) { @@ -8129,9 +7509,6 @@ charmap_decode_string(const char *s, Py_UCS4 x; unsigned char ch; - if (PyUnicode_READY(mapping) == -1) - return -1; - maplen = PyUnicode_GET_LENGTH(mapping); mapdata = PyUnicode_DATA(mapping); mapkind = PyUnicode_KIND(mapping); @@ -8284,8 +7661,6 @@ charmap_decode_mapping(const char *s, goto onError; } else if (PyUnicode_Check(item)) { - if (PyUnicode_READY(item) == -1) - goto onError; if (PyUnicode_GET_LENGTH(item) == 1) { Py_UCS4 value = PyUnicode_READ_CHAR(item, 0); if (value == 0xFFFE) @@ -8699,8 +8074,6 @@ charmap_encoding_error( Py_UCS4 ch; int val; - if (PyUnicode_READY(unicode) == -1) - return -1; size = PyUnicode_GET_LENGTH(unicode); /* find all unencodable characters */ while (collendpos < size) { @@ -8796,10 +8169,6 @@ charmap_encoding_error( break; } /* generate replacement */ - if (PyUnicode_READY(repunicode) == -1) { - Py_DECREF(repunicode); - return -1; - } repsize = PyUnicode_GET_LENGTH(repunicode); data = PyUnicode_DATA(repunicode); kind = PyUnicode_KIND(repunicode); @@ -8840,8 +8209,6 @@ _PyUnicode_EncodeCharmap(PyObject *unicode, const void *data; int kind; - if (PyUnicode_READY(unicode) == -1) - return NULL; size = PyUnicode_GET_LENGTH(unicode); data = PyUnicode_DATA(unicode); kind = PyUnicode_KIND(unicode); @@ -9120,10 +8487,6 @@ unicode_fast_translate_lookup(PyObject *mapping, Py_UCS1 ch, else if (PyUnicode_Check(item)) { Py_UCS4 replace; - if (PyUnicode_READY(item) == -1) { - Py_DECREF(item); - return -1; - } if (PyUnicode_GET_LENGTH(item) != 1) goto exit; @@ -9220,8 +8583,6 @@ _PyUnicode_TranslateCharmap(PyObject *input, return NULL; } - if (PyUnicode_READY(input) == -1) - return NULL; data = PyUnicode_DATA(input); kind = PyUnicode_KIND(input); size = PyUnicode_GET_LENGTH(input); @@ -9237,8 +8598,6 @@ _PyUnicode_TranslateCharmap(PyObject *input, ignore = (errors != NULL && strcmp(errors, "ignore") == 0); - if (PyUnicode_READY(input) == -1) - return NULL; if (PyUnicode_IS_ASCII(input)) { res = unicode_fast_translate(input, mapping, &writer, ignore, &i); if (res < 0) { @@ -9334,8 +8693,6 @@ _PyUnicode_TransformDecimalAndSpaceToASCII(PyObject *unicode) PyErr_BadInternalCall(); return NULL; } - if (PyUnicode_READY(unicode) == -1) - return NULL; if (PyUnicode_IS_ASCII(unicode)) { /* If the string is already ASCII, just return the same string */ Py_INCREF(unicode); @@ -9527,15 +8884,6 @@ _PyUnicode_InsertThousandsGrouping( assert(0 <= n_digits); assert(grouping != NULL); - if (digits != NULL) { - if (PyUnicode_READY(digits) == -1) { - return -1; - } - } - if (PyUnicode_READY(thousands_sep) == -1) { - return -1; - } - Py_ssize_t count = 0; Py_ssize_t n_zeros; int loop_broken = 0; @@ -9716,8 +9064,6 @@ PyUnicode_FindChar(PyObject *str, Py_UCS4 ch, { int kind; Py_ssize_t len, result; - if (PyUnicode_READY(str) == -1) - return -2; len = PyUnicode_GET_LENGTH(str); ADJUST_INDICES(start, end, len); if (end - start < 1) @@ -9746,10 +9092,6 @@ tailmatch(PyObject *self, Py_ssize_t i; Py_ssize_t end_sub; - if (PyUnicode_READY(self) == -1 || - PyUnicode_READY(substring) == -1) - return -1; - ADJUST_INDICES(start, end, PyUnicode_GET_LENGTH(self)); end -= PyUnicode_GET_LENGTH(substring); if (end < start) @@ -10008,8 +9350,6 @@ case_operation(PyObject *self, void *outdata; Py_UCS4 maxchar = 0, *tmp, *tmpend; - assert(PyUnicode_IS_READY(self)); - kind = PyUnicode_KIND(self); data = PyUnicode_DATA(self); length = PyUnicode_GET_LENGTH(self); @@ -10118,8 +9458,6 @@ _PyUnicode_JoinArray(PyObject *separator, PyObject *const *items, Py_ssize_t seq Py_TYPE(separator)->tp_name); goto onError; } - if (PyUnicode_READY(separator)) - goto onError; sep = separator; seplen = PyUnicode_GET_LENGTH(separator); maxchar = PyUnicode_MAX_CHAR_VALUE(separator); @@ -10151,8 +9489,6 @@ _PyUnicode_JoinArray(PyObject *separator, PyObject *const *items, Py_ssize_t seq i, Py_TYPE(item)->tp_name); goto onError; } - if (PyUnicode_READY(item) == -1) - goto onError; add_sz = PyUnicode_GET_LENGTH(item); item_maxchar = PyUnicode_MAX_CHAR_VALUE(item); maxchar = Py_MAX(maxchar, item_maxchar); @@ -10247,7 +9583,6 @@ _PyUnicode_FastFill(PyObject *unicode, Py_ssize_t start, Py_ssize_t length, { const enum PyUnicode_Kind kind = PyUnicode_KIND(unicode); void *data = PyUnicode_DATA(unicode); - assert(PyUnicode_IS_READY(unicode)); assert(unicode_modifiable(unicode)); assert(fill_char <= PyUnicode_MAX_CHAR_VALUE(unicode)); assert(start >= 0); @@ -10265,8 +9600,6 @@ PyUnicode_Fill(PyObject *unicode, Py_ssize_t start, Py_ssize_t length, PyErr_BadInternalCall(); return -1; } - if (PyUnicode_READY(unicode) == -1) - return -1; if (unicode_check_modifiable(unicode)) return -1; @@ -10379,9 +9712,6 @@ split(PyObject *self, if (maxcount < 0) maxcount = PY_SSIZE_T_MAX; - if (PyUnicode_READY(self) == -1) - return NULL; - if (substring == NULL) switch (PyUnicode_KIND(self)) { case PyUnicode_1BYTE_KIND: @@ -10409,9 +9739,6 @@ split(PyObject *self, Py_UNREACHABLE(); } - if (PyUnicode_READY(substring) == -1) - return NULL; - kind1 = PyUnicode_KIND(self); kind2 = PyUnicode_KIND(substring); len1 = PyUnicode_GET_LENGTH(self); @@ -10471,9 +9798,6 @@ rsplit(PyObject *self, if (maxcount < 0) maxcount = PY_SSIZE_T_MAX; - if (PyUnicode_READY(self) == -1) - return NULL; - if (substring == NULL) switch (PyUnicode_KIND(self)) { case PyUnicode_1BYTE_KIND: @@ -10501,9 +9825,6 @@ rsplit(PyObject *self, Py_UNREACHABLE(); } - if (PyUnicode_READY(substring) == -1) - return NULL; - kind1 = PyUnicode_KIND(self); kind2 = PyUnicode_KIND(substring); len1 = PyUnicode_GET_LENGTH(self); @@ -10905,8 +10226,6 @@ static PyObject * unicode_title_impl(PyObject *self) /*[clinic end generated code: output=c75ae03809574902 input=fa945d669b26e683]*/ { - if (PyUnicode_READY(self) == -1) - return NULL; return case_operation(self, do_title); } @@ -10923,8 +10242,6 @@ static PyObject * unicode_capitalize_impl(PyObject *self) /*[clinic end generated code: output=e49a4c333cdb7667 input=f4cbf1016938da6d]*/ { - if (PyUnicode_READY(self) == -1) - return NULL; if (PyUnicode_GET_LENGTH(self) == 0) return unicode_result_unchanged(self); return case_operation(self, do_capitalize); @@ -10940,8 +10257,6 @@ static PyObject * unicode_casefold_impl(PyObject *self) /*[clinic end generated code: output=0120daf657ca40af input=384d66cc2ae30daf]*/ { - if (PyUnicode_READY(self) == -1) - return NULL; if (PyUnicode_IS_ASCII(self)) return ascii_upper_or_lower(self, 1); return case_operation(self, do_casefold); @@ -10961,8 +10276,6 @@ convert_uc(PyObject *obj, void *addr) "not %.100s", Py_TYPE(obj)->tp_name); return 0; } - if (PyUnicode_READY(obj) < 0) - return 0; if (PyUnicode_GET_LENGTH(obj) != 1) { PyErr_SetString(PyExc_TypeError, "The fill character must be exactly one character long"); @@ -10990,9 +10303,6 @@ unicode_center_impl(PyObject *self, Py_ssize_t width, Py_UCS4 fillchar) { Py_ssize_t marg, left; - if (PyUnicode_READY(self) == -1) - return NULL; - if (PyUnicode_GET_LENGTH(self) >= width) return unicode_result_unchanged(self); @@ -11149,9 +10459,6 @@ _PyUnicode_Equal(PyObject *str1, PyObject *str2) if (str1 == str2) { return 1; } - if (PyUnicode_READY(str1) || PyUnicode_READY(str2)) { - return -1; - } return unicode_compare_eq(str1, str2); } @@ -11160,10 +10467,6 @@ int PyUnicode_Compare(PyObject *left, PyObject *right) { if (PyUnicode_Check(left) && PyUnicode_Check(right)) { - if (PyUnicode_READY(left) == -1 || - PyUnicode_READY(right) == -1) - return -1; - /* a string is equal to itself */ if (left == right) return 0; @@ -11183,24 +10486,8 @@ PyUnicode_CompareWithASCIIString(PyObject* uni, const char* str) Py_ssize_t i; int kind; Py_UCS4 chr; - const unsigned char *ustr = (const unsigned char *)str; assert(_PyUnicode_CHECK(uni)); - if (!PyUnicode_IS_READY(uni)) { - const wchar_t *ws = _PyUnicode_WSTR(uni); - /* Compare Unicode string and source character set string */ - for (i = 0; (chr = ws[i]) && ustr[i]; i++) { - if (chr != ustr[i]) - return (chr < ustr[i]) ? -1 : 1; - } - /* This check keeps Python strings that end in '\0' from comparing equal - to C strings identical up to that point. */ - if (_PyUnicode_WSTR_LENGTH(uni) != i || chr) - return 1; /* uni is longer */ - if (ustr[i]) - return -1; /* str is longer */ - return 0; - } kind = PyUnicode_KIND(uni); if (kind == PyUnicode_1BYTE_KIND) { const void *data = PyUnicode_1BYTE_DATA(uni); @@ -11238,24 +10525,6 @@ PyUnicode_CompareWithASCIIString(PyObject* uni, const char* str) } } -static int -non_ready_unicode_equal_to_ascii_string(PyObject *unicode, const char *str) -{ - size_t i, len; - const wchar_t *p; - len = (size_t)_PyUnicode_WSTR_LENGTH(unicode); - if (strlen(str) != len) - return 0; - p = _PyUnicode_WSTR(unicode); - assert(p); - for (i = 0; i < len; i++) { - unsigned char c = (unsigned char)str[i]; - if (c >= 128 || p[i] != (wchar_t)c) - return 0; - } - return 1; -} - int _PyUnicode_EqualToASCIIString(PyObject *unicode, const char *str) { @@ -11267,11 +10536,6 @@ _PyUnicode_EqualToASCIIString(PyObject *unicode, const char *str) assert((unsigned char)*p < 128); } #endif - if (PyUnicode_READY(unicode) == -1) { - /* Memory error or bad data */ - PyErr_Clear(); - return non_ready_unicode_equal_to_ascii_string(unicode, str); - } if (!PyUnicode_IS_ASCII(unicode)) return 0; len = (size_t)PyUnicode_GET_LENGTH(unicode); @@ -11292,12 +10556,6 @@ _PyUnicode_EqualToASCIIId(PyObject *left, _Py_Identifier *right) } #endif - if (PyUnicode_READY(left) == -1) { - /* memory error or bad data */ - PyErr_Clear(); - return non_ready_unicode_equal_to_ascii_string(left, right->string); - } - if (!PyUnicode_IS_ASCII(left)) return 0; @@ -11333,10 +10591,6 @@ PyUnicode_RichCompare(PyObject *left, PyObject *right, int op) if (!PyUnicode_Check(left) || !PyUnicode_Check(right)) Py_RETURN_NOTIMPLEMENTED; - if (PyUnicode_READY(left) == -1 || - PyUnicode_READY(right) == -1) - return NULL; - if (left == right) { switch (op) { case Py_EQ: @@ -11384,8 +10638,6 @@ PyUnicode_Contains(PyObject *str, PyObject *substr) Py_TYPE(substr)->tp_name); return -1; } - if (PyUnicode_READY(substr) == -1) - return -1; if (ensure_unicode(str) < 0) return -1; @@ -11449,8 +10701,6 @@ PyUnicode_Concat(PyObject *left, PyObject *right) Py_TYPE(right)->tp_name); return NULL; } - if (PyUnicode_READY(right) < 0) - return NULL; /* Shortcuts */ PyObject *empty = unicode_get_empty(); // Borrowed reference @@ -11504,11 +10754,6 @@ PyUnicode_Append(PyObject **p_left, PyObject *right) goto error; } - if (PyUnicode_READY(left) == -1) - goto error; - if (PyUnicode_READY(right) == -1) - goto error; - /* Shortcuts */ PyObject *empty = unicode_get_empty(); // Borrowed reference if (left == empty) { @@ -11575,7 +10820,7 @@ PyUnicode_AppendAndDel(PyObject **pleft, PyObject *right) } /* -Wraps stringlib_parse_args_finds() and additionally ensures that the +Wraps asciilib_parse_args_finds() and additionally ensures that the first argument is a unicode object. */ @@ -11584,8 +10829,7 @@ parse_args_finds_unicode(const char * function_name, PyObject *args, PyObject **substring, Py_ssize_t *start, Py_ssize_t *end) { - if(stringlib_parse_args_finds(function_name, args, substring, - start, end)) { + if (asciilib_parse_args_finds(function_name, args, substring, start, end)) { if (ensure_unicode(*substring) < 0) return 0; return 1; @@ -11708,9 +10952,6 @@ unicode_expandtabs_impl(PyObject *self, int tabsize) int kind; int found; - if (PyUnicode_READY(self) == -1) - return NULL; - /* First pass: determine size of output string */ src_len = PyUnicode_GET_LENGTH(self); i = j = line_pos = 0; @@ -11796,9 +11037,6 @@ unicode_find(PyObject *self, PyObject *args) if (!parse_args_finds_unicode("find", args, &substring, &start, &end)) return NULL; - if (PyUnicode_READY(self) == -1) - return NULL; - result = any_find_slice(self, substring, start, end, 1); if (result == -2) @@ -11818,9 +11056,6 @@ unicode_getitem(PyObject *self, Py_ssize_t index) PyErr_BadArgument(); return NULL; } - if (PyUnicode_READY(self) == -1) { - return NULL; - } if (index < 0 || index >= PyUnicode_GET_LENGTH(self)) { PyErr_SetString(PyExc_IndexError, "string index out of range"); return NULL; @@ -11843,8 +11078,6 @@ unicode_hash(PyObject *self) #endif if (_PyUnicode_HASH(self) != -1) return _PyUnicode_HASH(self); - if (PyUnicode_READY(self) == -1) - return -1; x = _Py_HashBytes(PyUnicode_DATA(self), PyUnicode_GET_LENGTH(self) * PyUnicode_KIND(self)); @@ -11873,9 +11106,6 @@ unicode_index(PyObject *self, PyObject *args) if (!parse_args_finds_unicode("index", args, &substring, &start, &end)) return NULL; - if (PyUnicode_READY(self) == -1) - return NULL; - result = any_find_slice(self, substring, start, end, 1); if (result == -2) @@ -11902,9 +11132,6 @@ static PyObject * unicode_isascii_impl(PyObject *self) /*[clinic end generated code: output=c5910d64b5a8003f input=5a43cbc6399621d5]*/ { - if (PyUnicode_READY(self) == -1) { - return NULL; - } return PyBool_FromLong(PyUnicode_IS_ASCII(self)); } @@ -11926,8 +11153,6 @@ unicode_islower_impl(PyObject *self) const void *data; int cased; - if (PyUnicode_READY(self) == -1) - return NULL; length = PyUnicode_GET_LENGTH(self); kind = PyUnicode_KIND(self); data = PyUnicode_DATA(self); @@ -11971,8 +11196,6 @@ unicode_isupper_impl(PyObject *self) const void *data; int cased; - if (PyUnicode_READY(self) == -1) - return NULL; length = PyUnicode_GET_LENGTH(self); kind = PyUnicode_KIND(self); data = PyUnicode_DATA(self); @@ -12016,8 +11239,6 @@ unicode_istitle_impl(PyObject *self) const void *data; int cased, previous_is_cased; - if (PyUnicode_READY(self) == -1) - return NULL; length = PyUnicode_GET_LENGTH(self); kind = PyUnicode_KIND(self); data = PyUnicode_DATA(self); @@ -12073,8 +11294,6 @@ unicode_isspace_impl(PyObject *self) int kind; const void *data; - if (PyUnicode_READY(self) == -1) - return NULL; length = PyUnicode_GET_LENGTH(self); kind = PyUnicode_KIND(self); data = PyUnicode_DATA(self); @@ -12113,8 +11332,6 @@ unicode_isalpha_impl(PyObject *self) int kind; const void *data; - if (PyUnicode_READY(self) == -1) - return NULL; length = PyUnicode_GET_LENGTH(self); kind = PyUnicode_KIND(self); data = PyUnicode_DATA(self); @@ -12152,9 +11369,6 @@ unicode_isalnum_impl(PyObject *self) const void *data; Py_ssize_t len, i; - if (PyUnicode_READY(self) == -1) - return NULL; - kind = PyUnicode_KIND(self); data = PyUnicode_DATA(self); len = PyUnicode_GET_LENGTH(self); @@ -12194,8 +11408,6 @@ unicode_isdecimal_impl(PyObject *self) int kind; const void *data; - if (PyUnicode_READY(self) == -1) - return NULL; length = PyUnicode_GET_LENGTH(self); kind = PyUnicode_KIND(self); data = PyUnicode_DATA(self); @@ -12233,8 +11445,6 @@ unicode_isdigit_impl(PyObject *self) int kind; const void *data; - if (PyUnicode_READY(self) == -1) - return NULL; length = PyUnicode_GET_LENGTH(self); kind = PyUnicode_KIND(self); data = PyUnicode_DATA(self); @@ -12273,8 +11483,6 @@ unicode_isnumeric_impl(PyObject *self) int kind; const void *data; - if (PyUnicode_READY(self) == -1) - return NULL; length = PyUnicode_GET_LENGTH(self); kind = PyUnicode_KIND(self); data = PyUnicode_DATA(self); @@ -12299,9 +11507,6 @@ Py_ssize_t _PyUnicode_ScanIdentifier(PyObject *self) { Py_ssize_t i; - if (PyUnicode_READY(self) == -1) - return -1; - Py_ssize_t len = PyUnicode_GET_LENGTH(self); if (len == 0) { /* an empty string is not a valid identifier */ @@ -12335,54 +11540,10 @@ _PyUnicode_ScanIdentifier(PyObject *self) int PyUnicode_IsIdentifier(PyObject *self) { - if (PyUnicode_IS_READY(self)) { - Py_ssize_t i = _PyUnicode_ScanIdentifier(self); - Py_ssize_t len = PyUnicode_GET_LENGTH(self); - /* an empty string is not a valid identifier */ - return len && i == len; - } - else { -_Py_COMP_DIAG_PUSH -_Py_COMP_DIAG_IGNORE_DEPR_DECLS - Py_ssize_t i = 0, len = PyUnicode_GET_SIZE(self); - if (len == 0) { - /* an empty string is not a valid identifier */ - return 0; - } - - const wchar_t *wstr = _PyUnicode_WSTR(self); - Py_UCS4 ch = wstr[i++]; -#if SIZEOF_WCHAR_T == 2 - if (Py_UNICODE_IS_HIGH_SURROGATE(ch) - && i < len - && Py_UNICODE_IS_LOW_SURROGATE(wstr[i])) - { - ch = Py_UNICODE_JOIN_SURROGATES(ch, wstr[i]); - i++; - } -#endif - if (!_PyUnicode_IsXidStart(ch) && ch != 0x5F /* LOW LINE */) { - return 0; - } - - while (i < len) { - ch = wstr[i++]; -#if SIZEOF_WCHAR_T == 2 - if (Py_UNICODE_IS_HIGH_SURROGATE(ch) - && i < len - && Py_UNICODE_IS_LOW_SURROGATE(wstr[i])) - { - ch = Py_UNICODE_JOIN_SURROGATES(ch, wstr[i]); - i++; - } -#endif - if (!_PyUnicode_IsXidContinue(ch)) { - return 0; - } - } - return 1; -_Py_COMP_DIAG_POP - } + Py_ssize_t i = _PyUnicode_ScanIdentifier(self); + Py_ssize_t len = PyUnicode_GET_LENGTH(self); + /* an empty string is not a valid identifier */ + return len && i == len; } /*[clinic input] @@ -12418,8 +11579,6 @@ unicode_isprintable_impl(PyObject *self) int kind; const void *data; - if (PyUnicode_READY(self) == -1) - return NULL; length = PyUnicode_GET_LENGTH(self); kind = PyUnicode_KIND(self); data = PyUnicode_DATA(self); @@ -12461,8 +11620,6 @@ unicode_join(PyObject *self, PyObject *iterable) static Py_ssize_t unicode_length(PyObject *self) { - if (PyUnicode_READY(self) == -1) - return -1; return PyUnicode_GET_LENGTH(self); } @@ -12482,9 +11639,6 @@ static PyObject * unicode_ljust_impl(PyObject *self, Py_ssize_t width, Py_UCS4 fillchar) /*[clinic end generated code: output=1cce0e0e0a0b84b3 input=3ab599e335e60a32]*/ { - if (PyUnicode_READY(self) == -1) - return NULL; - if (PyUnicode_GET_LENGTH(self) >= width) return unicode_result_unchanged(self); @@ -12501,8 +11655,6 @@ static PyObject * unicode_lower_impl(PyObject *self) /*[clinic end generated code: output=84ef9ed42efad663 input=60a2984b8beff23a]*/ { - if (PyUnicode_READY(self) == -1) - return NULL; if (PyUnicode_IS_ASCII(self)) return ascii_upper_or_lower(self, 1); return case_operation(self, do_lower); @@ -12527,9 +11679,6 @@ _PyUnicode_XStrip(PyObject *self, int striptype, PyObject *sepobj) BLOOM_MASK sepmask; Py_ssize_t seplen; - if (PyUnicode_READY(self) == -1 || PyUnicode_READY(sepobj) == -1) - return NULL; - kind = PyUnicode_KIND(self); data = PyUnicode_DATA(self); len = PyUnicode_GET_LENGTH(self); @@ -12575,9 +11724,6 @@ PyUnicode_Substring(PyObject *self, Py_ssize_t start, Py_ssize_t end) int kind; Py_ssize_t length; - if (PyUnicode_READY(self) == -1) - return NULL; - length = PyUnicode_GET_LENGTH(self); end = Py_MIN(end, length); @@ -12610,9 +11756,6 @@ do_strip(PyObject *self, int striptype) { Py_ssize_t len, i, j; - if (PyUnicode_READY(self) == -1) - return NULL; - len = PyUnicode_GET_LENGTH(self); if (PyUnicode_IS_ASCII(self)) { @@ -12759,9 +11902,6 @@ unicode_repeat(PyObject *str, Py_ssize_t len) if (len == 1) return unicode_result_unchanged(str); - if (PyUnicode_READY(str) == -1) - return NULL; - if (PyUnicode_GET_LENGTH(str) > PY_SSIZE_T_MAX / len) { PyErr_SetString(PyExc_OverflowError, "repeated string is too long"); @@ -12836,8 +11976,6 @@ unicode_replace_impl(PyObject *self, PyObject *old, PyObject *new, Py_ssize_t count) /*[clinic end generated code: output=b63f1a8b5eebf448 input=147d12206276ebeb]*/ { - if (PyUnicode_READY(self) == -1) - return NULL; return replace(self, old, new, count); } @@ -12907,9 +12045,6 @@ unicode_repr(PyObject *unicode) const void *idata; void *odata; - if (PyUnicode_READY(unicode) == -1) - return NULL; - isize = PyUnicode_GET_LENGTH(unicode); idata = PyUnicode_DATA(unicode); @@ -13082,9 +12217,6 @@ unicode_rfind(PyObject *self, PyObject *args) if (!parse_args_finds_unicode("rfind", args, &substring, &start, &end)) return NULL; - if (PyUnicode_READY(self) == -1) - return NULL; - result = any_find_slice(self, substring, start, end, -1); if (result == -2) @@ -13114,9 +12246,6 @@ unicode_rindex(PyObject *self, PyObject *args) if (!parse_args_finds_unicode("rindex", args, &substring, &start, &end)) return NULL; - if (PyUnicode_READY(self) == -1) - return NULL; - result = any_find_slice(self, substring, start, end, -1); if (result == -2) @@ -13146,9 +12275,6 @@ static PyObject * unicode_rjust_impl(PyObject *self, Py_ssize_t width, Py_UCS4 fillchar) /*[clinic end generated code: output=804a1a57fbe8d5cf input=d05f550b5beb1f72]*/ { - if (PyUnicode_READY(self) == -1) - return NULL; - if (PyUnicode_GET_LENGTH(self) >= width) return unicode_result_unchanged(self); @@ -13412,8 +12538,6 @@ static PyObject * unicode_swapcase_impl(PyObject *self) /*[clinic end generated code: output=5d28966bf6d7b2af input=3f3ef96d5798a7bb]*/ { - if (PyUnicode_READY(self) == -1) - return NULL; return case_operation(self, do_swapcase); } @@ -13579,8 +12703,6 @@ static PyObject * unicode_upper_impl(PyObject *self) /*[clinic end generated code: output=1b7ddd16bbcdc092 input=db3d55682dfe2e6c]*/ { - if (PyUnicode_READY(self) == -1) - return NULL; if (PyUnicode_IS_ASCII(self)) return ascii_upper_or_lower(self, 0); return case_operation(self, do_upper); @@ -13607,9 +12729,6 @@ unicode_zfill_impl(PyObject *self, Py_ssize_t width) const void *data; Py_UCS4 chr; - if (PyUnicode_READY(self) == -1) - return NULL; - if (PyUnicode_GET_LENGTH(self) >= width) return unicode_result_unchanged(self); @@ -13652,7 +12771,7 @@ unicode_startswith(PyObject *self, Py_ssize_t end = PY_SSIZE_T_MAX; int result; - if (!stringlib_parse_args_finds("startswith", args, &subobj, &start, &end)) + if (!asciilib_parse_args_finds("startswith", args, &subobj, &start, &end)) return NULL; if (PyTuple_Check(subobj)) { Py_ssize_t i; @@ -13706,7 +12825,7 @@ unicode_endswith(PyObject *self, Py_ssize_t end = PY_SSIZE_T_MAX; int result; - if (!stringlib_parse_args_finds("endswith", args, &subobj, &start, &end)) + if (!asciilib_parse_args_finds("endswith", args, &subobj, &start, &end)) return NULL; if (PyTuple_Check(subobj)) { Py_ssize_t i; @@ -13753,7 +12872,7 @@ _PyUnicodeWriter_Update(_PyUnicodeWriter *writer) else { /* use a value smaller than PyUnicode_1BYTE_KIND() so _PyUnicodeWriter_PrepareKind() will copy the buffer. */ - writer->kind = PyUnicode_WCHAR_KIND; + writer->kind = 0; assert(writer->kind <= PyUnicode_1BYTE_KIND); /* Copy-on-write mode: set buffer size to 0 so @@ -13773,7 +12892,7 @@ _PyUnicodeWriter_Init(_PyUnicodeWriter *writer) /* use a value smaller than PyUnicode_1BYTE_KIND() so _PyUnicodeWriter_PrepareKind() will copy the buffer. */ - writer->kind = PyUnicode_WCHAR_KIND; + writer->kind = 0; assert(writer->kind <= PyUnicode_1BYTE_KIND); } @@ -13908,8 +13027,6 @@ _PyUnicodeWriter_WriteStr(_PyUnicodeWriter *writer, PyObject *str) Py_UCS4 maxchar; Py_ssize_t len; - if (PyUnicode_READY(str) == -1) - return -1; len = PyUnicode_GET_LENGTH(str); if (len == 0) return 0; @@ -13940,9 +13057,6 @@ _PyUnicodeWriter_WriteSubstring(_PyUnicodeWriter *writer, PyObject *str, Py_UCS4 maxchar; Py_ssize_t len; - if (PyUnicode_READY(str) == -1) - return -1; - assert(0 <= start); assert(end <= PyUnicode_GET_LENGTH(str)); assert(start <= end); @@ -14071,7 +13185,7 @@ _PyUnicodeWriter_Finish(_PyUnicodeWriter *writer) } assert(_PyUnicode_CheckConsistency(str, 1)); - return unicode_result_ready(str); + return unicode_result(str); } void @@ -14110,8 +13224,6 @@ unicode___format___impl(PyObject *self, PyObject *format_spec) _PyUnicodeWriter writer; int ret; - if (PyUnicode_READY(self) == -1) - return NULL; _PyUnicodeWriter_Init(&writer); ret = _PyUnicode_FormatAdvancedWriter(&writer, self, format_spec, 0, @@ -14137,11 +13249,13 @@ unicode_sizeof_impl(PyObject *self) /* If it's a compact object, account for base structure + character data. */ - if (PyUnicode_IS_COMPACT_ASCII(self)) + if (PyUnicode_IS_COMPACT_ASCII(self)) { size = sizeof(PyASCIIObject) + PyUnicode_GET_LENGTH(self) + 1; - else if (PyUnicode_IS_COMPACT(self)) + } + else if (PyUnicode_IS_COMPACT(self)) { size = sizeof(PyCompactUnicodeObject) + (PyUnicode_GET_LENGTH(self) + 1) * PyUnicode_KIND(self); + } else { /* If it is a two-block object, account for base object, and for character block if present. */ @@ -14150,10 +13264,6 @@ unicode_sizeof_impl(PyObject *self) size += (PyUnicode_GET_LENGTH(self) + 1) * PyUnicode_KIND(self); } - /* If the wstr pointer is present, account for it unless it is shared - with the data pointer. Check if the data is not shared. */ - if (_PyUnicode_HAS_WSTR_MEMORY(self)) - size += (PyUnicode_WSTR_LENGTH(self) + 1) * sizeof(wchar_t); if (_PyUnicode_HAS_UTF8_MEMORY(self)) size += PyUnicode_UTF8_LENGTH(self) + 1; @@ -14252,9 +13362,6 @@ static PySequenceMethods unicode_as_sequence = { static PyObject* unicode_subscript(PyObject* self, PyObject* item) { - if (PyUnicode_READY(self) == -1) - return NULL; - if (_PyIndex_Check(item)) { Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError); if (i == -1 && PyErr_Occurred()) @@ -14478,7 +13585,6 @@ _PyUnicode_FormatLong(PyObject *val, int alt, int prec, int type) return NULL; assert(unicode_modifiable(result)); - assert(PyUnicode_IS_READY(result)); assert(PyUnicode_IS_ASCII(result)); /* To modify the string in-place, there can only be one reference. */ @@ -15014,9 +14120,6 @@ unicode_format_arg_output(struct unicode_formatter_t *ctx, if (arg->sign && arg->flags & F_ZERO) fill = '0'; - if (PyUnicode_READY(str) == -1) - return -1; - len = PyUnicode_GET_LENGTH(str); if ((arg->width == -1 || arg->width <= len) && (arg->prec == -1 || arg->prec >= len) @@ -15318,15 +14421,12 @@ unicode_subtype_new(PyTypeObject *type, PyObject *unicode) { PyObject *self; Py_ssize_t length, char_size; - int share_wstr, share_utf8; + int share_utf8; unsigned int kind; void *data; assert(PyType_IsSubtype(type, &PyUnicode_Type)); assert(_PyUnicode_CHECK(unicode)); - if (PyUnicode_READY(unicode) == -1) { - return NULL; - } self = type->tp_alloc(type, 0); if (self == NULL) { @@ -15345,15 +14445,11 @@ unicode_subtype_new(PyTypeObject *type, PyObject *unicode) _PyUnicode_STATE(self).kind = kind; _PyUnicode_STATE(self).compact = 0; _PyUnicode_STATE(self).ascii = _PyUnicode_STATE(unicode).ascii; - _PyUnicode_STATE(self).ready = 1; - _PyUnicode_WSTR(self) = NULL; _PyUnicode_UTF8_LENGTH(self) = 0; _PyUnicode_UTF8(self) = NULL; - _PyUnicode_WSTR_LENGTH(self) = 0; _PyUnicode_DATA_ANY(self) = NULL; share_utf8 = 0; - share_wstr = 0; if (kind == PyUnicode_1BYTE_KIND) { char_size = 1; if (PyUnicode_MAX_CHAR_VALUE(unicode) < 128) @@ -15361,14 +14457,10 @@ unicode_subtype_new(PyTypeObject *type, PyObject *unicode) } else if (kind == PyUnicode_2BYTE_KIND) { char_size = 2; - if (sizeof(wchar_t) == 2) - share_wstr = 1; } else { assert(kind == PyUnicode_4BYTE_KIND); char_size = 4; - if (sizeof(wchar_t) == 4) - share_wstr = 1; } /* Ensure we won't overflow the length. */ @@ -15387,13 +14479,8 @@ unicode_subtype_new(PyTypeObject *type, PyObject *unicode) _PyUnicode_UTF8_LENGTH(self) = length; _PyUnicode_UTF8(self) = data; } - if (share_wstr) { - _PyUnicode_WSTR_LENGTH(self) = length; - _PyUnicode_WSTR(self) = (wchar_t *)data; - } - memcpy(data, PyUnicode_DATA(unicode), - kind * (length + 1)); + memcpy(data, PyUnicode_DATA(unicode), kind * (length + 1)); assert(_PyUnicode_CheckConsistency(self, 1)); #ifdef Py_DEBUG _PyUnicode_HASH(self) = _PyUnicode_HASH(unicode); @@ -15563,11 +14650,6 @@ PyUnicode_InternInPlace(PyObject **p) } #ifdef INTERNED_STRINGS - if (PyUnicode_READY(s) == -1) { - PyErr_Clear(); - return; - } - if (interned == NULL) { interned = PyDict_New(); if (interned == NULL) { @@ -15656,8 +14738,6 @@ _PyUnicode_ClearInterned(PyInterpreterState *interp) Py_ssize_t pos = 0; PyObject *s, *ignored_value; while (PyDict_Next(interned, &pos, &s, &ignored_value)) { - assert(PyUnicode_IS_READY(s)); - switch (PyUnicode_CHECK_INTERNED(s)) { case SSTATE_INTERNED_IMMORTAL: Py_SET_REFCNT(s, Py_REFCNT(s) + 1); @@ -15779,7 +14859,7 @@ unicodeiter_reduce(unicodeiterobject *it, PyObject *Py_UNUSED(ignored)) return Py_BuildValue("N(O)n", _PyEval_GetBuiltin(&_Py_ID(iter)), it->it_seq, it->it_index); } else { - PyObject *u = (PyObject *)_PyUnicode_New(0); + PyObject *u = unicode_new_empty(); if (u == NULL) return NULL; return Py_BuildValue("N(N)", _PyEval_GetBuiltin(&_Py_ID(iter)), u); @@ -15871,8 +14951,6 @@ unicode_iter(PyObject *seq) PyErr_BadInternalCall(); return NULL; } - if (PyUnicode_READY(seq) == -1) - return NULL; if (PyUnicode_IS_COMPACT_ASCII(seq)) { it = PyObject_GC_New(unicodeiterobject, &_PyUnicodeASCIIIter_Type); } @@ -16120,20 +15198,8 @@ static void unicode_static_dealloc(PyObject *op) assert(ascii->state.compact); - if (ascii->state.ascii) { - if (ascii->wstr) { - PyObject_Free(ascii->wstr); - ascii->wstr = NULL; - } - } - else { + if (!ascii->state.ascii) { PyCompactUnicodeObject* compact = (PyCompactUnicodeObject*)op; - void* data = (void*)(compact + 1); - if (ascii->wstr && ascii->wstr != data) { - PyObject_Free(ascii->wstr); - ascii->wstr = NULL; - compact->wstr_length = 0; - } if (compact->utf8) { PyObject_Free(compact->utf8); compact->utf8 = NULL; diff --git a/PC/_msi.c b/PC/_msi.c index 01516e85ccff3..3f50f9b884594 100644 --- a/PC/_msi.c +++ b/PC/_msi.c @@ -757,19 +757,13 @@ _msi_SummaryInformation_SetProperty_impl(msiobj *self, int field, int status; if (PyUnicode_Check(data)) { -#if USE_UNICODE_WCHAR_CACHE - const WCHAR *value = _PyUnicode_AsUnicode(data); -#else /* USE_UNICODE_WCHAR_CACHE */ WCHAR *value = PyUnicode_AsWideCharString(data, NULL); -#endif /* USE_UNICODE_WCHAR_CACHE */ if (value == NULL) { return NULL; } status = MsiSummaryInfoSetPropertyW(self->h, field, VT_LPSTR, 0, NULL, value); -#if !USE_UNICODE_WCHAR_CACHE PyMem_Free(value); -#endif /* USE_UNICODE_WCHAR_CACHE */ } else if (PyLong_CheckExact(data)) { long value = PyLong_AsLong(data); if (value == -1 && PyErr_Occurred()) { diff --git a/PC/clinic/_msi.c.h b/PC/clinic/_msi.c.h index fd21142158312..ca1f8ad76a312 100644 --- a/PC/clinic/_msi.c.h +++ b/PC/clinic/_msi.c.h @@ -208,11 +208,7 @@ _msi_Record_SetString(msiobj *self, PyObject *const *args, Py_ssize_t nargs) _PyArg_BadArgument("SetString", "argument 2", "str", args[1]); goto exit; } - #if USE_UNICODE_WCHAR_CACHE - value = _PyUnicode_AsUnicode(args[1]); - #else /* USE_UNICODE_WCHAR_CACHE */ value = PyUnicode_AsWideCharString(args[1], NULL); - #endif /* USE_UNICODE_WCHAR_CACHE */ if (value == NULL) { goto exit; } @@ -220,9 +216,7 @@ _msi_Record_SetString(msiobj *self, PyObject *const *args, Py_ssize_t nargs) exit: /* Cleanup for value */ - #if !USE_UNICODE_WCHAR_CACHE PyMem_Free((void *)value); - #endif /* USE_UNICODE_WCHAR_CACHE */ return return_value; } @@ -257,11 +251,7 @@ _msi_Record_SetStream(msiobj *self, PyObject *const *args, Py_ssize_t nargs) _PyArg_BadArgument("SetStream", "argument 2", "str", args[1]); goto exit; } - #if USE_UNICODE_WCHAR_CACHE - value = _PyUnicode_AsUnicode(args[1]); - #else /* USE_UNICODE_WCHAR_CACHE */ value = PyUnicode_AsWideCharString(args[1], NULL); - #endif /* USE_UNICODE_WCHAR_CACHE */ if (value == NULL) { goto exit; } @@ -269,9 +259,7 @@ _msi_Record_SetStream(msiobj *self, PyObject *const *args, Py_ssize_t nargs) exit: /* Cleanup for value */ - #if !USE_UNICODE_WCHAR_CACHE PyMem_Free((void *)value); - #endif /* USE_UNICODE_WCHAR_CACHE */ return return_value; } @@ -561,11 +549,7 @@ _msi_Database_OpenView(msiobj *self, PyObject *arg) _PyArg_BadArgument("OpenView", "argument", "str", arg); goto exit; } - #if USE_UNICODE_WCHAR_CACHE - sql = _PyUnicode_AsUnicode(arg); - #else /* USE_UNICODE_WCHAR_CACHE */ sql = PyUnicode_AsWideCharString(arg, NULL); - #endif /* USE_UNICODE_WCHAR_CACHE */ if (sql == NULL) { goto exit; } @@ -573,9 +557,7 @@ _msi_Database_OpenView(msiobj *self, PyObject *arg) exit: /* Cleanup for sql */ - #if !USE_UNICODE_WCHAR_CACHE PyMem_Free((void *)sql); - #endif /* USE_UNICODE_WCHAR_CACHE */ return return_value; } @@ -660,11 +642,7 @@ _msi_OpenDatabase(PyObject *module, PyObject *const *args, Py_ssize_t nargs) _PyArg_BadArgument("OpenDatabase", "argument 1", "str", args[0]); goto exit; } - #if USE_UNICODE_WCHAR_CACHE - path = _PyUnicode_AsUnicode(args[0]); - #else /* USE_UNICODE_WCHAR_CACHE */ path = PyUnicode_AsWideCharString(args[0], NULL); - #endif /* USE_UNICODE_WCHAR_CACHE */ if (path == NULL) { goto exit; } @@ -676,9 +654,7 @@ _msi_OpenDatabase(PyObject *module, PyObject *const *args, Py_ssize_t nargs) exit: /* Cleanup for path */ - #if !USE_UNICODE_WCHAR_CACHE PyMem_Free((void *)path); - #endif /* USE_UNICODE_WCHAR_CACHE */ return return_value; } @@ -713,4 +689,4 @@ _msi_CreateRecord(PyObject *module, PyObject *arg) exit: return return_value; } -/*[clinic end generated code: output=d7eb07e6bfcdc13f input=a9049054013a1b77]*/ +/*[clinic end generated code: output=a592695c4315db22 input=a9049054013a1b77]*/ diff --git a/PC/clinic/winreg.c.h b/PC/clinic/winreg.c.h index 8bcb290ecd3b5..6af24af539b0b 100644 --- a/PC/clinic/winreg.c.h +++ b/PC/clinic/winreg.c.h @@ -159,11 +159,7 @@ winreg_ConnectRegistry(PyObject *module, PyObject *const *args, Py_ssize_t nargs computer_name = NULL; } else if (PyUnicode_Check(args[0])) { - #if USE_UNICODE_WCHAR_CACHE - computer_name = _PyUnicode_AsUnicode(args[0]); - #else /* USE_UNICODE_WCHAR_CACHE */ computer_name = PyUnicode_AsWideCharString(args[0], NULL); - #endif /* USE_UNICODE_WCHAR_CACHE */ if (computer_name == NULL) { goto exit; } @@ -183,9 +179,7 @@ winreg_ConnectRegistry(PyObject *module, PyObject *const *args, Py_ssize_t nargs exit: /* Cleanup for computer_name */ - #if !USE_UNICODE_WCHAR_CACHE PyMem_Free((void *)computer_name); - #endif /* USE_UNICODE_WCHAR_CACHE */ return return_value; } @@ -233,11 +227,7 @@ winreg_CreateKey(PyObject *module, PyObject *const *args, Py_ssize_t nargs) sub_key = NULL; } else if (PyUnicode_Check(args[1])) { - #if USE_UNICODE_WCHAR_CACHE - sub_key = _PyUnicode_AsUnicode(args[1]); - #else /* USE_UNICODE_WCHAR_CACHE */ sub_key = PyUnicode_AsWideCharString(args[1], NULL); - #endif /* USE_UNICODE_WCHAR_CACHE */ if (sub_key == NULL) { goto exit; } @@ -254,9 +244,7 @@ winreg_CreateKey(PyObject *module, PyObject *const *args, Py_ssize_t nargs) exit: /* Cleanup for sub_key */ - #if !USE_UNICODE_WCHAR_CACHE PyMem_Free((void *)sub_key); - #endif /* USE_UNICODE_WCHAR_CACHE */ return return_value; } @@ -318,9 +306,7 @@ winreg_CreateKeyEx(PyObject *module, PyObject *const *args, Py_ssize_t nargs, Py exit: /* Cleanup for sub_key */ - #if !USE_UNICODE_WCHAR_CACHE PyMem_Free((void *)sub_key); - #endif /* USE_UNICODE_WCHAR_CACHE */ return return_value; } @@ -366,11 +352,7 @@ winreg_DeleteKey(PyObject *module, PyObject *const *args, Py_ssize_t nargs) _PyArg_BadArgument("DeleteKey", "argument 2", "str", args[1]); goto exit; } - #if USE_UNICODE_WCHAR_CACHE - sub_key = _PyUnicode_AsUnicode(args[1]); - #else /* USE_UNICODE_WCHAR_CACHE */ sub_key = PyUnicode_AsWideCharString(args[1], NULL); - #endif /* USE_UNICODE_WCHAR_CACHE */ if (sub_key == NULL) { goto exit; } @@ -378,9 +360,7 @@ winreg_DeleteKey(PyObject *module, PyObject *const *args, Py_ssize_t nargs) exit: /* Cleanup for sub_key */ - #if !USE_UNICODE_WCHAR_CACHE PyMem_Free((void *)sub_key); - #endif /* USE_UNICODE_WCHAR_CACHE */ return return_value; } @@ -437,9 +417,7 @@ winreg_DeleteKeyEx(PyObject *module, PyObject *const *args, Py_ssize_t nargs, Py exit: /* Cleanup for sub_key */ - #if !USE_UNICODE_WCHAR_CACHE PyMem_Free((void *)sub_key); - #endif /* USE_UNICODE_WCHAR_CACHE */ return return_value; } @@ -478,11 +456,7 @@ winreg_DeleteValue(PyObject *module, PyObject *const *args, Py_ssize_t nargs) value = NULL; } else if (PyUnicode_Check(args[1])) { - #if USE_UNICODE_WCHAR_CACHE - value = _PyUnicode_AsUnicode(args[1]); - #else /* USE_UNICODE_WCHAR_CACHE */ value = PyUnicode_AsWideCharString(args[1], NULL); - #endif /* USE_UNICODE_WCHAR_CACHE */ if (value == NULL) { goto exit; } @@ -495,9 +469,7 @@ winreg_DeleteValue(PyObject *module, PyObject *const *args, Py_ssize_t nargs) exit: /* Cleanup for value */ - #if !USE_UNICODE_WCHAR_CACHE PyMem_Free((void *)value); - #endif /* USE_UNICODE_WCHAR_CACHE */ return return_value; } @@ -622,11 +594,7 @@ winreg_ExpandEnvironmentStrings(PyObject *module, PyObject *arg) _PyArg_BadArgument("ExpandEnvironmentStrings", "argument", "str", arg); goto exit; } - #if USE_UNICODE_WCHAR_CACHE - string = _PyUnicode_AsUnicode(arg); - #else /* USE_UNICODE_WCHAR_CACHE */ string = PyUnicode_AsWideCharString(arg, NULL); - #endif /* USE_UNICODE_WCHAR_CACHE */ if (string == NULL) { goto exit; } @@ -634,9 +602,7 @@ winreg_ExpandEnvironmentStrings(PyObject *module, PyObject *arg) exit: /* Cleanup for string */ - #if !USE_UNICODE_WCHAR_CACHE PyMem_Free((void *)string); - #endif /* USE_UNICODE_WCHAR_CACHE */ return return_value; } @@ -734,11 +700,7 @@ winreg_LoadKey(PyObject *module, PyObject *const *args, Py_ssize_t nargs) _PyArg_BadArgument("LoadKey", "argument 2", "str", args[1]); goto exit; } - #if USE_UNICODE_WCHAR_CACHE - sub_key = _PyUnicode_AsUnicode(args[1]); - #else /* USE_UNICODE_WCHAR_CACHE */ sub_key = PyUnicode_AsWideCharString(args[1], NULL); - #endif /* USE_UNICODE_WCHAR_CACHE */ if (sub_key == NULL) { goto exit; } @@ -746,11 +708,7 @@ winreg_LoadKey(PyObject *module, PyObject *const *args, Py_ssize_t nargs) _PyArg_BadArgument("LoadKey", "argument 3", "str", args[2]); goto exit; } - #if USE_UNICODE_WCHAR_CACHE - file_name = _PyUnicode_AsUnicode(args[2]); - #else /* USE_UNICODE_WCHAR_CACHE */ file_name = PyUnicode_AsWideCharString(args[2], NULL); - #endif /* USE_UNICODE_WCHAR_CACHE */ if (file_name == NULL) { goto exit; } @@ -758,13 +716,9 @@ winreg_LoadKey(PyObject *module, PyObject *const *args, Py_ssize_t nargs) exit: /* Cleanup for sub_key */ - #if !USE_UNICODE_WCHAR_CACHE PyMem_Free((void *)sub_key); - #endif /* USE_UNICODE_WCHAR_CACHE */ /* Cleanup for file_name */ - #if !USE_UNICODE_WCHAR_CACHE PyMem_Free((void *)file_name); - #endif /* USE_UNICODE_WCHAR_CACHE */ return return_value; } @@ -819,9 +773,7 @@ winreg_OpenKey(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObje exit: /* Cleanup for sub_key */ - #if !USE_UNICODE_WCHAR_CACHE PyMem_Free((void *)sub_key); - #endif /* USE_UNICODE_WCHAR_CACHE */ return return_value; } @@ -876,9 +828,7 @@ winreg_OpenKeyEx(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyOb exit: /* Cleanup for sub_key */ - #if !USE_UNICODE_WCHAR_CACHE PyMem_Free((void *)sub_key); - #endif /* USE_UNICODE_WCHAR_CACHE */ return return_value; } @@ -962,11 +912,7 @@ winreg_QueryValue(PyObject *module, PyObject *const *args, Py_ssize_t nargs) sub_key = NULL; } else if (PyUnicode_Check(args[1])) { - #if USE_UNICODE_WCHAR_CACHE - sub_key = _PyUnicode_AsUnicode(args[1]); - #else /* USE_UNICODE_WCHAR_CACHE */ sub_key = PyUnicode_AsWideCharString(args[1], NULL); - #endif /* USE_UNICODE_WCHAR_CACHE */ if (sub_key == NULL) { goto exit; } @@ -979,9 +925,7 @@ winreg_QueryValue(PyObject *module, PyObject *const *args, Py_ssize_t nargs) exit: /* Cleanup for sub_key */ - #if !USE_UNICODE_WCHAR_CACHE PyMem_Free((void *)sub_key); - #endif /* USE_UNICODE_WCHAR_CACHE */ return return_value; } @@ -1025,11 +969,7 @@ winreg_QueryValueEx(PyObject *module, PyObject *const *args, Py_ssize_t nargs) name = NULL; } else if (PyUnicode_Check(args[1])) { - #if USE_UNICODE_WCHAR_CACHE - name = _PyUnicode_AsUnicode(args[1]); - #else /* USE_UNICODE_WCHAR_CACHE */ name = PyUnicode_AsWideCharString(args[1], NULL); - #endif /* USE_UNICODE_WCHAR_CACHE */ if (name == NULL) { goto exit; } @@ -1042,9 +982,7 @@ winreg_QueryValueEx(PyObject *module, PyObject *const *args, Py_ssize_t nargs) exit: /* Cleanup for name */ - #if !USE_UNICODE_WCHAR_CACHE PyMem_Free((void *)name); - #endif /* USE_UNICODE_WCHAR_CACHE */ return return_value; } @@ -1093,11 +1031,7 @@ winreg_SaveKey(PyObject *module, PyObject *const *args, Py_ssize_t nargs) _PyArg_BadArgument("SaveKey", "argument 2", "str", args[1]); goto exit; } - #if USE_UNICODE_WCHAR_CACHE - file_name = _PyUnicode_AsUnicode(args[1]); - #else /* USE_UNICODE_WCHAR_CACHE */ file_name = PyUnicode_AsWideCharString(args[1], NULL); - #endif /* USE_UNICODE_WCHAR_CACHE */ if (file_name == NULL) { goto exit; } @@ -1105,9 +1039,7 @@ winreg_SaveKey(PyObject *module, PyObject *const *args, Py_ssize_t nargs) exit: /* Cleanup for file_name */ - #if !USE_UNICODE_WCHAR_CACHE PyMem_Free((void *)file_name); - #endif /* USE_UNICODE_WCHAR_CACHE */ return return_value; } @@ -1162,9 +1094,7 @@ winreg_SetValue(PyObject *module, PyObject *const *args, Py_ssize_t nargs) exit: /* Cleanup for sub_key */ - #if !USE_UNICODE_WCHAR_CACHE PyMem_Free((void *)sub_key); - #endif /* USE_UNICODE_WCHAR_CACHE */ return return_value; } @@ -1238,9 +1168,7 @@ winreg_SetValueEx(PyObject *module, PyObject *const *args, Py_ssize_t nargs) exit: /* Cleanup for value_name */ - #if !USE_UNICODE_WCHAR_CACHE PyMem_Free((void *)value_name); - #endif /* USE_UNICODE_WCHAR_CACHE */ return return_value; } @@ -1346,4 +1274,4 @@ winreg_QueryReflectionKey(PyObject *module, PyObject *arg) exit: return return_value; } -/*[clinic end generated code: output=c3454803528f6e97 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=9782b1630b59e201 input=a9049054013a1b77]*/ diff --git a/PC/winreg.c b/PC/winreg.c index 2d44c82000c68..92d05f5144a3c 100644 --- a/PC/winreg.c +++ b/PC/winreg.c @@ -645,19 +645,9 @@ Py2Reg(PyObject *value, DWORD typ, BYTE **retDataBuf, DWORD *retDataSize) t = PyList_GET_ITEM(value, j); if (!PyUnicode_Check(t)) return FALSE; -#if USE_UNICODE_WCHAR_CACHE -_Py_COMP_DIAG_PUSH -_Py_COMP_DIAG_IGNORE_DEPR_DECLS - len = PyUnicode_GetSize(t); - if (len < 0) - return FALSE; - len++; -_Py_COMP_DIAG_POP -#else /* USE_UNICODE_WCHAR_CACHE */ len = PyUnicode_AsWideChar(t, NULL, 0); if (len < 0) return FALSE; -#endif /* USE_UNICODE_WCHAR_CACHE */ size += Py_SAFE_DOWNCAST(len * sizeof(wchar_t), size_t, DWORD); } @@ -1709,40 +1699,27 @@ winreg_SetValue_impl(PyObject *module, HKEY key, const Py_UNICODE *sub_key, return NULL; } -#if USE_UNICODE_WCHAR_CACHE -_Py_COMP_DIAG_PUSH -_Py_COMP_DIAG_IGNORE_DEPR_DECLS - const wchar_t *value = PyUnicode_AsUnicodeAndSize(value_obj, &value_length); -_Py_COMP_DIAG_POP -#else /* USE_UNICODE_WCHAR_CACHE */ wchar_t *value = PyUnicode_AsWideCharString(value_obj, &value_length); -#endif /* USE_UNICODE_WCHAR_CACHE */ if (value == NULL) { return NULL; } if ((Py_ssize_t)(DWORD)value_length != value_length) { PyErr_SetString(PyExc_OverflowError, "value is too long"); -#if !USE_UNICODE_WCHAR_CACHE PyMem_Free(value); -#endif /* USE_UNICODE_WCHAR_CACHE */ return NULL; } if (PySys_Audit("winreg.SetValue", "nunu#", (Py_ssize_t)key, sub_key, (Py_ssize_t)type, value, value_length) < 0) { -#if !USE_UNICODE_WCHAR_CACHE PyMem_Free(value); -#endif /* USE_UNICODE_WCHAR_CACHE */ return NULL; } Py_BEGIN_ALLOW_THREADS rc = RegSetValueW(key, sub_key, REG_SZ, value, (DWORD)(value_length + 1)); Py_END_ALLOW_THREADS -#if !USE_UNICODE_WCHAR_CACHE PyMem_Free(value); -#endif /* USE_UNICODE_WCHAR_CACHE */ if (rc != ERROR_SUCCESS) return PyErr_SetFromWindowsErrWithFunction(rc, "RegSetValue"); Py_RETURN_NONE; diff --git a/Python/dynload_win.c b/Python/dynload_win.c index b43e9fc26f614..c03bc5602bffe 100644 --- a/Python/dynload_win.c +++ b/Python/dynload_win.c @@ -225,11 +225,7 @@ dl_funcptr _PyImport_FindSharedFuncptrWindows(const char *prefix, _Py_CheckPython3(); -#if USE_UNICODE_WCHAR_CACHE - const wchar_t *wpathname = _PyUnicode_AsUnicode(pathname); -#else /* USE_UNICODE_WCHAR_CACHE */ wchar_t *wpathname = PyUnicode_AsWideCharString(pathname, NULL); -#endif /* USE_UNICODE_WCHAR_CACHE */ if (wpathname == NULL) return NULL; @@ -251,9 +247,7 @@ dl_funcptr _PyImport_FindSharedFuncptrWindows(const char *prefix, LOAD_LIBRARY_SEARCH_DEFAULT_DIRS | LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR); Py_END_ALLOW_THREADS -#if !USE_UNICODE_WCHAR_CACHE PyMem_Free(wpathname); -#endif /* USE_UNICODE_WCHAR_CACHE */ /* restore old error mode settings */ SetErrorMode(old_mode); diff --git a/Python/fileutils.c b/Python/fileutils.c index 4f7f8944a72da..a38886a17ccbb 100644 --- a/Python/fileutils.c +++ b/Python/fileutils.c @@ -1244,18 +1244,12 @@ _Py_stat(PyObject *path, struct stat *statbuf) #ifdef MS_WINDOWS int err; -#if USE_UNICODE_WCHAR_CACHE - const wchar_t *wpath = _PyUnicode_AsUnicode(path); -#else /* USE_UNICODE_WCHAR_CACHE */ wchar_t *wpath = PyUnicode_AsWideCharString(path, NULL); -#endif /* USE_UNICODE_WCHAR_CACHE */ if (wpath == NULL) return -2; err = _Py_wstat(wpath, statbuf); -#if !USE_UNICODE_WCHAR_CACHE PyMem_Free(wpath); -#endif /* USE_UNICODE_WCHAR_CACHE */ return err; #else int ret; @@ -1663,11 +1657,8 @@ _Py_fopen_obj(PyObject *path, const char *mode) Py_TYPE(path)); return NULL; } -#if USE_UNICODE_WCHAR_CACHE - const wchar_t *wpath = _PyUnicode_AsUnicode(path); -#else /* USE_UNICODE_WCHAR_CACHE */ + wchar_t *wpath = PyUnicode_AsWideCharString(path, NULL); -#endif /* USE_UNICODE_WCHAR_CACHE */ if (wpath == NULL) return NULL; @@ -1675,9 +1666,7 @@ _Py_fopen_obj(PyObject *path, const char *mode) wmode, Py_ARRAY_LENGTH(wmode)); if (usize == 0) { PyErr_SetFromWindowsErr(0); -#if !USE_UNICODE_WCHAR_CACHE PyMem_Free(wpath); -#endif /* USE_UNICODE_WCHAR_CACHE */ return NULL; } @@ -1687,9 +1676,7 @@ _Py_fopen_obj(PyObject *path, const char *mode) Py_END_ALLOW_THREADS } while (f == NULL && errno == EINTR && !(async_err = PyErr_CheckSignals())); -#if !USE_UNICODE_WCHAR_CACHE PyMem_Free(wpath); -#endif /* USE_UNICODE_WCHAR_CACHE */ #else PyObject *bytes; const char *path_bytes; diff --git a/Python/getargs.c b/Python/getargs.c index a2ea4d7da45f8..ed3ffdafe37cd 100644 --- a/Python/getargs.c +++ b/Python/getargs.c @@ -1012,58 +1012,6 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, break; } - case 'u': /* raw unicode buffer (Py_UNICODE *) */ - case 'Z': /* raw unicode buffer or None */ - { - if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1, - "getargs: The '%c' format is deprecated. Use 'U' instead.", c)) { - return NULL; - } -_Py_COMP_DIAG_PUSH -_Py_COMP_DIAG_IGNORE_DEPR_DECLS - Py_UNICODE **p = va_arg(*p_va, Py_UNICODE **); - - if (*format == '#') { - /* "u#" or "Z#" */ - REQUIRE_PY_SSIZE_T_CLEAN; - Py_ssize_t *psize = va_arg(*p_va, Py_ssize_t*); - - if (c == 'Z' && arg == Py_None) { - *p = NULL; - *psize = 0; - } - else if (PyUnicode_Check(arg)) { - Py_ssize_t len; - *p = PyUnicode_AsUnicodeAndSize(arg, &len); - if (*p == NULL) - RETURN_ERR_OCCURRED; - *psize = len; - } - else - return converterr(c == 'Z' ? "str or None" : "str", - arg, msgbuf, bufsize); - format++; - } else { - /* "u" or "Z" */ - if (c == 'Z' && arg == Py_None) - *p = NULL; - else if (PyUnicode_Check(arg)) { - Py_ssize_t len; - *p = PyUnicode_AsUnicodeAndSize(arg, &len); - if (*p == NULL) - RETURN_ERR_OCCURRED; - if (wcslen(*p) != (size_t)len) { - PyErr_SetString(PyExc_ValueError, "embedded null character"); - RETURN_ERR_OCCURRED; - } - } else - return converterr(c == 'Z' ? "str or None" : "str", - arg, msgbuf, bufsize); - } - break; -_Py_COMP_DIAG_POP - } - case 'e': {/* encoded string */ char **buffer; const char *encoding; @@ -2685,8 +2633,6 @@ skipitem(const char **p_format, va_list *p_va, int flags) case 's': /* string */ case 'z': /* string or None */ case 'y': /* bytes */ - case 'u': /* unicode string */ - case 'Z': /* unicode string or None */ case 'w': /* buffer, read-write */ { if (p_va != NULL) { diff --git a/Python/traceback.c b/Python/traceback.c index 3ec0618af99f2..e76c9aa1a14c5 100644 --- a/Python/traceback.c +++ b/Python/traceback.c @@ -1077,7 +1077,6 @@ _Py_DumpASCII(int fd, PyObject *text) int truncated; int kind; void *data = NULL; - wchar_t *wstr = NULL; Py_UCS4 ch; if (!PyUnicode_Check(text)) @@ -1085,13 +1084,7 @@ _Py_DumpASCII(int fd, PyObject *text) size = ascii->length; kind = ascii->state.kind; - if (kind == PyUnicode_WCHAR_KIND) { - wstr = ascii->wstr; - if (wstr == NULL) - return; - size = _PyCompactUnicodeObject_CAST(text)->wstr_length; - } - else if (ascii->state.compact) { + if (ascii->state.compact) { if (ascii->state.ascii) data = ascii + 1; else @@ -1132,10 +1125,7 @@ _Py_DumpASCII(int fd, PyObject *text) } for (i=0; i < size; i++) { - if (kind != PyUnicode_WCHAR_KIND) - ch = PyUnicode_READ(kind, data, i); - else - ch = wstr[i]; + ch = PyUnicode_READ(kind, data, i); if (' ' <= ch && ch <= 126) { /* printable ASCII character */ char c = (char)ch; diff --git a/Tools/clinic/clinic.py b/Tools/clinic/clinic.py index 5ad4f879a33f7..53e29df8a8e40 100755 --- a/Tools/clinic/clinic.py +++ b/Tools/clinic/clinic.py @@ -3526,9 +3526,7 @@ def converter_init(self, *, accept={str}, zeroes=False): def cleanup(self): if not self.length: return """\ -#if !USE_UNICODE_WCHAR_CACHE PyMem_Free((void *){name}); -#endif /* USE_UNICODE_WCHAR_CACHE */ """.format(name=self.name) def parse_arg(self, argname, argnum): @@ -3539,11 +3537,7 @@ def parse_arg(self, argname, argnum): _PyArg_BadArgument("{{name}}", {argnum}, "str", {argname}); goto exit; }}}} - #if USE_UNICODE_WCHAR_CACHE - {paramname} = _PyUnicode_AsUnicode({argname}); - #else /* USE_UNICODE_WCHAR_CACHE */ {paramname} = PyUnicode_AsWideCharString({argname}, NULL); - #endif /* USE_UNICODE_WCHAR_CACHE */ if ({paramname} == NULL) {{{{ goto exit; }}}} @@ -3554,11 +3548,7 @@ def parse_arg(self, argname, argnum): {paramname} = NULL; }}}} else if (PyUnicode_Check({argname})) {{{{ - #if USE_UNICODE_WCHAR_CACHE - {paramname} = _PyUnicode_AsUnicode({argname}); - #else /* USE_UNICODE_WCHAR_CACHE */ {paramname} = PyUnicode_AsWideCharString({argname}, NULL); - #endif /* USE_UNICODE_WCHAR_CACHE */ if ({paramname} == NULL) {{{{ goto exit; }}}} diff --git a/Tools/gdb/libpython.py b/Tools/gdb/libpython.py index 857e52f00a06e..80563ea59ec4b 100755 --- a/Tools/gdb/libpython.py +++ b/Tools/gdb/libpython.py @@ -1376,57 +1376,28 @@ def char_width(self): return _type_Py_UNICODE.sizeof def proxyval(self, visited): - may_have_surrogates = False compact = self.field('_base') ascii = compact['_base'] state = ascii['state'] is_compact_ascii = (int(state['ascii']) and int(state['compact'])) - if not int(state['ready']): - # string is not ready - field_length = int(compact['wstr_length']) - may_have_surrogates = True - field_str = ascii['wstr'] + field_length = int(ascii['length']) + if is_compact_ascii: + field_str = ascii.address + 1 + elif int(state['compact']): + field_str = compact.address + 1 else: - field_length = int(ascii['length']) - if is_compact_ascii: - field_str = ascii.address + 1 - elif int(state['compact']): - field_str = compact.address + 1 - else: - field_str = self.field('data')['any'] - repr_kind = int(state['kind']) - if repr_kind == 1: - field_str = field_str.cast(_type_unsigned_char_ptr()) - elif repr_kind == 2: - field_str = field_str.cast(_type_unsigned_short_ptr()) - elif repr_kind == 4: - field_str = field_str.cast(_type_unsigned_int_ptr()) + field_str = self.field('data')['any'] + repr_kind = int(state['kind']) + if repr_kind == 1: + field_str = field_str.cast(_type_unsigned_char_ptr()) + elif repr_kind == 2: + field_str = field_str.cast(_type_unsigned_short_ptr()) + elif repr_kind == 4: + field_str = field_str.cast(_type_unsigned_int_ptr()) # Gather a list of ints from the Py_UNICODE array; these are either # UCS-1, UCS-2 or UCS-4 code points: - if not may_have_surrogates: - Py_UNICODEs = [int(field_str[i]) for i in safe_range(field_length)] - else: - # A more elaborate routine if sizeof(Py_UNICODE) is 2 in the - # inferior process: we must join surrogate pairs. - Py_UNICODEs = [] - i = 0 - limit = safety_limit(field_length) - while i < limit: - ucs = int(field_str[i]) - i += 1 - if ucs < 0xD800 or ucs >= 0xDC00 or i == field_length: - Py_UNICODEs.append(ucs) - continue - # This could be a surrogate pair. - ucs2 = int(field_str[i]) - if ucs2 < 0xDC00 or ucs2 > 0xDFFF: - continue - code = (ucs & 0x03FF) << 10 - code |= ucs2 & 0x03FF - code += 0x00010000 - Py_UNICODEs.append(code) - i += 1 + Py_UNICODEs = [int(field_str[i]) for i in safe_range(field_length)] # Convert the int code points to unicode characters, and generate a # local unicode instance. diff --git a/Tools/scripts/deepfreeze.py b/Tools/scripts/deepfreeze.py index 5ee6c2f58e599..ac2076708a156 100644 --- a/Tools/scripts/deepfreeze.py +++ b/Tools/scripts/deepfreeze.py @@ -200,7 +200,6 @@ def generate_unicode(self, name: str, s: str) -> str: self.write(".kind = 1,") self.write(".compact = 1,") self.write(".ascii = 1,") - self.write(".ready = 1,") self.write(f"._data = {make_string_literal(s.encode('ascii'))},") return f"& {name}._ascii.ob_base" else: @@ -213,21 +212,10 @@ def generate_unicode(self, name: str, s: str) -> str: self.write(f".kind = {kind},") self.write(".compact = 1,") self.write(".ascii = 0,") - self.write(".ready = 1,") with self.block(f"._data =", ","): for i in range(0, len(s), 16): data = s[i:i+16] self.write(", ".join(map(str, map(ord, data))) + ",") - if kind == PyUnicode_2BYTE_KIND: - self.patchups.append("if (sizeof(wchar_t) == 2) {") - self.patchups.append(f" {name}._compact._base.wstr = (wchar_t *) {name}._data;") - self.patchups.append(f" {name}._compact.wstr_length = {len(s)};") - self.patchups.append("}") - if kind == PyUnicode_4BYTE_KIND: - self.patchups.append("if (sizeof(wchar_t) == 4) {") - self.patchups.append(f" {name}._compact._base.wstr = (wchar_t *) {name}._data;") - self.patchups.append(f" {name}._compact.wstr_length = {len(s)};") - self.patchups.append("}") return f"& {name}._compact._base.ob_base" From webhook-mailer at python.org Thu May 12 08:38:00 2022 From: webhook-mailer at python.org (Fidget-Spinner) Date: Thu, 12 May 2022 12:38:00 -0000 Subject: [Python-checkins] Update outdated `LOAD_METHOD` comments in `Python/ceval.c` (GH-92641) Message-ID: https://github.com/python/cpython/commit/bdf99691972c4e452a86eb3ca7ff7ae748d881a6 commit: bdf99691972c4e452a86eb3ca7ff7ae748d881a6 branch: main author: Crowthebird <78076854+thatbirdguythatuknownot at users.noreply.github.com> committer: Fidget-Spinner date: 2022-05-12T20:37:55+08:00 summary: Update outdated `LOAD_METHOD` comments in `Python/ceval.c` (GH-92641) files: M Python/ceval.c diff --git a/Python/ceval.c b/Python/ceval.c index b2735a1b2d395..f6b07b4b28eb6 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -4537,7 +4537,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int TARGET(LOAD_METHOD) { PREDICTED(LOAD_METHOD); - /* Designed to work in tandem with CALL_METHOD. */ + /* Designed to work in tandem with PRECALL. */ PyObject *name = GETITEM(names, oparg); PyObject *obj = TOP(); PyObject *meth = NULL; @@ -4562,7 +4562,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int /* meth is not an unbound method (but a regular attr, or something was returned by a descriptor protocol). Set the second element of the stack to NULL, to signal - CALL_METHOD that it's not a method call. + PRECALL that it's not a method call. NULL | meth | arg1 | ... | argN */ From webhook-mailer at python.org Thu May 12 09:00:11 2022 From: webhook-mailer at python.org (miss-islington) Date: Thu, 12 May 2022 13:00:11 -0000 Subject: [Python-checkins] Update outdated `LOAD_METHOD` comments in `Python/ceval.c` (GH-92641) Message-ID: https://github.com/python/cpython/commit/3d1ad42591263ac9dc827d47d52883dfc32416b6 commit: 3d1ad42591263ac9dc827d47d52883dfc32416b6 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-12T05:59:36-07:00 summary: Update outdated `LOAD_METHOD` comments in `Python/ceval.c` (GH-92641) (cherry picked from commit bdf99691972c4e452a86eb3ca7ff7ae748d881a6) Co-authored-by: Crowthebird <78076854+thatbirdguythatuknownot at users.noreply.github.com> files: M Python/ceval.c diff --git a/Python/ceval.c b/Python/ceval.c index b2735a1b2d395..f6b07b4b28eb6 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -4537,7 +4537,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int TARGET(LOAD_METHOD) { PREDICTED(LOAD_METHOD); - /* Designed to work in tandem with CALL_METHOD. */ + /* Designed to work in tandem with PRECALL. */ PyObject *name = GETITEM(names, oparg); PyObject *obj = TOP(); PyObject *meth = NULL; @@ -4562,7 +4562,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int /* meth is not an unbound method (but a regular attr, or something was returned by a descriptor protocol). Set the second element of the stack to NULL, to signal - CALL_METHOD that it's not a method call. + PRECALL that it's not a method call. NULL | meth | arg1 | ... | argN */ From webhook-mailer at python.org Thu May 12 10:23:54 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Thu, 12 May 2022 14:23:54 -0000 Subject: [Python-checkins] gh-92436: __future__ docs: add note on expectations for "from __future__ import annotations" (#92568) Message-ID: https://github.com/python/cpython/commit/6582c96454ddb731eb412c2a473300172225fdb9 commit: 6582c96454ddb731eb412c2a473300172225fdb9 branch: main author: Jelle Zijlstra committer: JelleZijlstra date: 2022-05-12T07:23:42-07:00 summary: gh-92436: __future__ docs: add note on expectations for "from __future__ import annotations" (#92568) files: M Doc/library/__future__.rst diff --git a/Doc/library/__future__.rst b/Doc/library/__future__.rst index 24bbd90d02cf7..8bd23daee7397 100644 --- a/Doc/library/__future__.rst +++ b/Doc/library/__future__.rst @@ -90,12 +90,20 @@ language using this mechanism: | generator_stop | 3.5.0b1 | 3.7 | :pep:`479`: | | | | | *StopIteration handling inside generators* | +------------------+-------------+--------------+---------------------------------------------+ -| annotations | 3.7.0b1 | 3.11 | :pep:`563`: | +| annotations | 3.7.0b1 | TBD [1]_ | :pep:`563`: | | | | | *Postponed evaluation of annotations* | +------------------+-------------+--------------+---------------------------------------------+ .. XXX Adding a new entry? Remember to update simple_stmts.rst, too. +.. [1] + ``from __future__ import annotations`` was previously scheduled to + become mandatory in Python 3.10, but the Python Steering Council + twice decided to delay the change + (`announcement for Python 3.10 `__; + `announcement for Python 3.11 `__). + No final decision has been made yet. See also :pep:`563` and :pep:`649`. + .. seealso:: From webhook-mailer at python.org Thu May 12 10:24:08 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Thu, 12 May 2022 14:24:08 -0000 Subject: [Python-checkins] gh-92514: Remove unused test.support.BasicTestRunner (#92515) Message-ID: https://github.com/python/cpython/commit/8a0d9a6bb77a72cd8b9ece01b7c1163fff28029a commit: 8a0d9a6bb77a72cd8b9ece01b7c1163fff28029a branch: main author: Jelle Zijlstra committer: JelleZijlstra date: 2022-05-12T07:24:04-07:00 summary: gh-92514: Remove unused test.support.BasicTestRunner (#92515) files: A Misc/NEWS.d/next/Tests/2022-05-08-15-40-41.gh-issue-92514.Xbf5JY.rst M Doc/library/test.rst M Lib/test/support/__init__.py diff --git a/Doc/library/test.rst b/Doc/library/test.rst index 699db14596f25..707e966455ceb 100644 --- a/Doc/library/test.rst +++ b/Doc/library/test.rst @@ -980,13 +980,6 @@ The :mod:`test.support` module defines the following classes: Try to match a single stored value (*dv*) with a supplied value (*v*). -.. class:: BasicTestRunner() - - .. method:: run(test) - - Run *test* and return the result. - - :mod:`test.support.socket_helper` --- Utilities for socket tests ================================================================ diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py index 3b2f33979db9a..41502cf4e97be 100644 --- a/Lib/test/support/__init__.py +++ b/Lib/test/support/__init__.py @@ -36,7 +36,7 @@ "is_resource_enabled", "requires", "requires_freebsd_version", "requires_linux_version", "requires_mac_ver", "check_syntax_error", - "BasicTestRunner", "run_unittest", "run_doctest", + "run_unittest", "run_doctest", "requires_gzip", "requires_bz2", "requires_lzma", "bigmemtest", "bigaddrspacetest", "cpython_only", "get_attribute", "requires_IEEE_754", "requires_zlib", @@ -983,12 +983,6 @@ def wrapper(self): #======================================================================= # unittest integration. -class BasicTestRunner: - def run(self, test): - result = unittest.TestResult() - test(result) - return result - def _id(obj): return obj diff --git a/Misc/NEWS.d/next/Tests/2022-05-08-15-40-41.gh-issue-92514.Xbf5JY.rst b/Misc/NEWS.d/next/Tests/2022-05-08-15-40-41.gh-issue-92514.Xbf5JY.rst new file mode 100644 index 0000000000000..6b82196a25e40 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2022-05-08-15-40-41.gh-issue-92514.Xbf5JY.rst @@ -0,0 +1 @@ +Remove unused ``test.support.BasicTestRunner``. Patch by Jelle Zijlstra. From webhook-mailer at python.org Thu May 12 10:38:04 2022 From: webhook-mailer at python.org (miss-islington) Date: Thu, 12 May 2022 14:38:04 -0000 Subject: [Python-checkins] gh-92436: __future__ docs: add note on expectations for "from __future__ import annotations" (GH-92568) Message-ID: https://github.com/python/cpython/commit/715b070dcc17fc35bbc09f729354d7a05a8b2539 commit: 715b070dcc17fc35bbc09f729354d7a05a8b2539 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-12T07:37:59-07:00 summary: gh-92436: __future__ docs: add note on expectations for "from __future__ import annotations" (GH-92568) (cherry picked from commit 6582c96454ddb731eb412c2a473300172225fdb9) Co-authored-by: Jelle Zijlstra files: M Doc/library/__future__.rst diff --git a/Doc/library/__future__.rst b/Doc/library/__future__.rst index 24bbd90d02cf7..8bd23daee7397 100644 --- a/Doc/library/__future__.rst +++ b/Doc/library/__future__.rst @@ -90,12 +90,20 @@ language using this mechanism: | generator_stop | 3.5.0b1 | 3.7 | :pep:`479`: | | | | | *StopIteration handling inside generators* | +------------------+-------------+--------------+---------------------------------------------+ -| annotations | 3.7.0b1 | 3.11 | :pep:`563`: | +| annotations | 3.7.0b1 | TBD [1]_ | :pep:`563`: | | | | | *Postponed evaluation of annotations* | +------------------+-------------+--------------+---------------------------------------------+ .. XXX Adding a new entry? Remember to update simple_stmts.rst, too. +.. [1] + ``from __future__ import annotations`` was previously scheduled to + become mandatory in Python 3.10, but the Python Steering Council + twice decided to delay the change + (`announcement for Python 3.10 `__; + `announcement for Python 3.11 `__). + No final decision has been made yet. See also :pep:`563` and :pep:`649`. + .. seealso:: From webhook-mailer at python.org Thu May 12 10:43:02 2022 From: webhook-mailer at python.org (miss-islington) Date: Thu, 12 May 2022 14:43:02 -0000 Subject: [Python-checkins] gh-92436: __future__ docs: add note on expectations for "from __future__ import annotations" (GH-92568) Message-ID: https://github.com/python/cpython/commit/5d62759f98e82625277f46ea86a1a29b07b8ffe1 commit: 5d62759f98e82625277f46ea86a1a29b07b8ffe1 branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-12T07:42:57-07:00 summary: gh-92436: __future__ docs: add note on expectations for "from __future__ import annotations" (GH-92568) (cherry picked from commit 6582c96454ddb731eb412c2a473300172225fdb9) Co-authored-by: Jelle Zijlstra files: M Doc/library/__future__.rst diff --git a/Doc/library/__future__.rst b/Doc/library/__future__.rst index 24bbd90d02cf7..8bd23daee7397 100644 --- a/Doc/library/__future__.rst +++ b/Doc/library/__future__.rst @@ -90,12 +90,20 @@ language using this mechanism: | generator_stop | 3.5.0b1 | 3.7 | :pep:`479`: | | | | | *StopIteration handling inside generators* | +------------------+-------------+--------------+---------------------------------------------+ -| annotations | 3.7.0b1 | 3.11 | :pep:`563`: | +| annotations | 3.7.0b1 | TBD [1]_ | :pep:`563`: | | | | | *Postponed evaluation of annotations* | +------------------+-------------+--------------+---------------------------------------------+ .. XXX Adding a new entry? Remember to update simple_stmts.rst, too. +.. [1] + ``from __future__ import annotations`` was previously scheduled to + become mandatory in Python 3.10, but the Python Steering Council + twice decided to delay the change + (`announcement for Python 3.10 `__; + `announcement for Python 3.11 `__). + No final decision has been made yet. See also :pep:`563` and :pep:`649`. + .. seealso:: From webhook-mailer at python.org Thu May 12 11:26:16 2022 From: webhook-mailer at python.org (ericvsmith) Date: Thu, 12 May 2022 15:26:16 -0000 Subject: [Python-checkins] gh-91578: improved error message when trying to instantiate an abstract class with missing methods (gh-47246) Message-ID: https://github.com/python/cpython/commit/079f0dd7191fbadd4c3a5899b6af12492e84d2b4 commit: 079f0dd7191fbadd4c3a5899b6af12492e84d2b4 branch: main author: ravi140222 <100869741+ravi140222 at users.noreply.github.com> committer: ericvsmith date: 2022-05-12T11:26:11-04:00 summary: gh-91578: improved error message when trying to instantiate an abstract class with missing methods (gh-47246) files: A Misc/NEWS.d/next/Core and Builtins/2022-04-15-22-12-53.gh-issue-91578.rDOtyK.rst M Lib/test/test_abc.py M Lib/test/test_dataclasses.py M Objects/typeobject.c diff --git a/Lib/test/test_abc.py b/Lib/test/test_abc.py index 1e7a0351db489..a083236fb0fc4 100644 --- a/Lib/test/test_abc.py +++ b/Lib/test/test_abc.py @@ -154,7 +154,7 @@ class C(metaclass=abc_ABCMeta): @abc.abstractmethod def method_one(self): pass - msg = r"class C with abstract method method_one" + msg = r"class C without an implementation for abstract method method_one" self.assertRaisesRegex(TypeError, msg, C) def test_object_new_with_many_abstractmethods(self): @@ -165,7 +165,7 @@ def method_one(self): @abc.abstractmethod def method_two(self): pass - msg = r"class C with abstract methods method_one, method_two" + msg = r"class C without an implementation for abstract methods method_one, method_two" self.assertRaisesRegex(TypeError, msg, C) def test_abstractmethod_integration(self): @@ -535,7 +535,7 @@ def updated_foo(self): A.foo = updated_foo abc.update_abstractmethods(A) self.assertEqual(A.__abstractmethods__, {'foo', 'bar'}) - msg = "class A with abstract methods bar, foo" + msg = "class A without an implementation for abstract methods bar, foo" self.assertRaisesRegex(TypeError, msg, A) def test_update_implementation(self): @@ -547,7 +547,7 @@ def foo(self): class B(A): pass - msg = "class B with abstract method foo" + msg = "class B without an implementation for abstract method foo" self.assertRaisesRegex(TypeError, msg, B) self.assertEqual(B.__abstractmethods__, {'foo'}) @@ -605,7 +605,7 @@ def foo(self): abc.update_abstractmethods(B) - msg = "class B with abstract method foo" + msg = "class B without an implementation for abstract method foo" self.assertRaisesRegex(TypeError, msg, B) def test_update_layered_implementation(self): @@ -627,7 +627,7 @@ def foo(self): abc.update_abstractmethods(C) - msg = "class C with abstract method foo" + msg = "class C without an implementation for abstract method foo" self.assertRaisesRegex(TypeError, msg, C) def test_update_multi_inheritance(self): diff --git a/Lib/test/test_dataclasses.py b/Lib/test/test_dataclasses.py index 6a36da104ac89..cf29cd07516f0 100644 --- a/Lib/test/test_dataclasses.py +++ b/Lib/test/test_dataclasses.py @@ -3762,7 +3762,7 @@ class Date(A): day: 'int' self.assertTrue(inspect.isabstract(Date)) - msg = 'class Date with abstract method foo' + msg = 'class Date without an implementation for abstract method foo' self.assertRaisesRegex(TypeError, msg, Date) diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-04-15-22-12-53.gh-issue-91578.rDOtyK.rst b/Misc/NEWS.d/next/Core and Builtins/2022-04-15-22-12-53.gh-issue-91578.rDOtyK.rst new file mode 100644 index 0000000000000..4dc738ab9051a --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-04-15-22-12-53.gh-issue-91578.rDOtyK.rst @@ -0,0 +1 @@ +Updates the error message for abstract class. diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 1bcfd9a9c52bc..1daf2b8d3b0ff 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -4559,7 +4559,7 @@ object_new(PyTypeObject *type, PyObject *args, PyObject *kwds) PyErr_Format(PyExc_TypeError, "Can't instantiate abstract class %s " - "with abstract method%s %U", + "without an implementation for abstract method%s %U", type->tp_name, method_count > 1 ? "s" : "", joined); From webhook-mailer at python.org Thu May 12 11:32:00 2022 From: webhook-mailer at python.org (markshannon) Date: Thu, 12 May 2022 15:32:00 -0000 Subject: [Python-checkins] [3.10] gh-92311: Let frame_setlineno jump over listcomps (GH-92717) Message-ID: https://github.com/python/cpython/commit/a24e67697362e76dd25d6901109277458b5971b9 commit: a24e67697362e76dd25d6901109277458b5971b9 branch: 3.10 author: Dennis Sweeney <36520290+sweeneyde at users.noreply.github.com> committer: markshannon date: 2022-05-12T16:31:43+01:00 summary: [3.10] gh-92311: Let frame_setlineno jump over listcomps (GH-92717) files: A Misc/NEWS.d/next/Core and Builtins/2022-05-12-09-38-20.gh-issue-92311.VEgtts.rst M Lib/test/test_sys_settrace.py M Objects/frameobject.c diff --git a/Lib/test/test_sys_settrace.py b/Lib/test/test_sys_settrace.py index 4f13bbd6bfda2..76d1aeecf69e4 100644 --- a/Lib/test/test_sys_settrace.py +++ b/Lib/test/test_sys_settrace.py @@ -2094,6 +2094,54 @@ def gen(): yield 3 next(gen()) output.append(5) + + @jump_test(2, 3, [1, 3]) + def test_jump_forward_over_listcomp(output): + output.append(1) + x = [i for i in range(10)] + output.append(3) + + # checking for segfaults. + # See https://github.com/python/cpython/issues/92311 + @jump_test(3, 1, []) + def test_jump_backward_over_listcomp(output): + a = 1 + x = [i for i in range(10)] + c = 3 + + @jump_test(8, 2, [2, 7, 2]) + def test_jump_backward_over_listcomp_v2(output): + flag = False + output.append(2) + if flag: + return + x = [i for i in range(5)] + flag = 6 + output.append(7) + output.append(8) + + @async_jump_test(2, 3, [1, 3]) + async def test_jump_forward_over_async_listcomp(output): + output.append(1) + x = [i async for i in asynciter(range(10))] + output.append(3) + + @async_jump_test(3, 1, []) + async def test_jump_backward_over_async_listcomp(output): + a = 1 + x = [i async for i in asynciter(range(10))] + c = 3 + + @async_jump_test(8, 2, [2, 7, 2]) + async def test_jump_backward_over_async_listcomp_v2(output): + flag = False + output.append(2) + if flag: + return + x = [i async for i in asynciter(range(5))] + flag = 6 + output.append(7) + output.append(8) if __name__ == "__main__": diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-12-09-38-20.gh-issue-92311.VEgtts.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-12-09-38-20.gh-issue-92311.VEgtts.rst new file mode 100644 index 0000000000000..b800def656cbf --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-05-12-09-38-20.gh-issue-92311.VEgtts.rst @@ -0,0 +1 @@ +Fixed a bug where setting ``frame.f_lineno`` to jump over a list comprehension could misbehave or crash. diff --git a/Objects/frameobject.c b/Objects/frameobject.c index d02cf9d3ba9f0..be84d33bf5238 100644 --- a/Objects/frameobject.c +++ b/Objects/frameobject.c @@ -195,7 +195,10 @@ markblocks(PyCodeObject *code_obj, int len) break; case GET_ITER: case GET_AITER: - block_stack = push_block(block_stack, Loop); + // For-loops get a Loop block, but comprehensions do not. + if (_Py_OPCODE(code[i + 1]) != CALL_FUNCTION) { + block_stack = push_block(block_stack, Loop); + } blocks[i+1] = block_stack; break; case FOR_ITER: From webhook-mailer at python.org Thu May 12 11:42:27 2022 From: webhook-mailer at python.org (ambv) Date: Thu, 12 May 2022 15:42:27 -0000 Subject: [Python-checkins] =?utf-8?q?=5B3=2E8=5D_gh-92448=3A_Update_the_d?= =?utf-8?q?ocumentation_builder_to_render_the_GitHub=E2=80=A6_=28GH-92605?= =?utf-8?q?=29?= Message-ID: https://github.com/python/cpython/commit/a5ed8947037da5f9d50efd17f70546986dd46c74 commit: a5ed8947037da5f9d50efd17f70546986dd46c74 branch: 3.8 author: Dong-hee Na committer: ambv date: 2022-05-12T17:42:22+02:00 summary: [3.8] gh-92448: Update the documentation builder to render the GitHub? (GH-92605) (cherry picked from commit 45e1721d100bab09510ccf9da49f14ca5cc268f4) Co-authored-by: Dong-hee Na files: M Doc/tools/extensions/pyspecific.py M Misc/NEWS.d/3.7.0a3.rst M Misc/NEWS.d/3.8.0.rst M Misc/NEWS.d/3.8.0a1.rst M Misc/NEWS.d/3.8.2rc2.rst diff --git a/Doc/tools/extensions/pyspecific.py b/Doc/tools/extensions/pyspecific.py index cd9144ea09d3f..359d76451493d 100644 --- a/Doc/tools/extensions/pyspecific.py +++ b/Doc/tools/extensions/pyspecific.py @@ -390,7 +390,8 @@ def run(self): # Support for including Misc/NEWS -issue_re = re.compile('(?:[Ii]ssue #|bpo-)([0-9]+)') +issue_re = re.compile('(?:[Ii]ssue #|bpo-)([0-9]+)', re.I) +gh_issue_re = re.compile('(?:gh-issue-|gh-)([0-9]+)', re.I) whatsnew_re = re.compile(r"(?im)^what's new in (.*?)\??$") @@ -417,9 +418,9 @@ def run(self): text = 'The NEWS file is not available.' node = nodes.strong(text, text) return [node] - content = issue_re.sub(r'`bpo-\1 `__', - content) + content = issue_re.sub(r':issue:`\1`', content) + # Fallback handling for the GitHub issue + content = gh_issue_re.sub(r':gh:`\1`', content) content = whatsnew_re.sub(r'\1', content) # remove first 3 lines as they are the main heading lines = ['.. default-role:: obj', ''] + content.splitlines()[3:] diff --git a/Misc/NEWS.d/3.7.0a3.rst b/Misc/NEWS.d/3.7.0a3.rst index 8ef7a5118a1f5..3944825e15bc6 100644 --- a/Misc/NEWS.d/3.7.0a3.rst +++ b/Misc/NEWS.d/3.7.0a3.rst @@ -288,7 +288,7 @@ by Nir Soffer. .. -.. bpo: 321010 +.. bpo: 32101 .. date: 2017-11-29-00-42-47 .. nonce: -axD5l .. section: Library diff --git a/Misc/NEWS.d/3.8.0.rst b/Misc/NEWS.d/3.8.0.rst index e72025cfca572..8e9ab4097e748 100644 --- a/Misc/NEWS.d/3.8.0.rst +++ b/Misc/NEWS.d/3.8.0.rst @@ -28,7 +28,7 @@ none were collected. .. nonce: 9TWMlz .. section: Library -Revert GH-15522, which introduces a regression in +Revert PR 15522, which introduces a regression in :meth:`mimetypes.guess_type` due to improper handling of filenames as urls. .. diff --git a/Misc/NEWS.d/3.8.0a1.rst b/Misc/NEWS.d/3.8.0a1.rst index 873f53b450376..da25b1970c63c 100644 --- a/Misc/NEWS.d/3.8.0a1.rst +++ b/Misc/NEWS.d/3.8.0a1.rst @@ -4617,7 +4617,7 @@ Based on patch by c-fos. .. section: Library Remove HMAC default to md5 marked for removal in 3.8 (removal originally -planned in 3.6, bump to 3.8 in gh-7062). +planned in 3.6, bump to 3.8 in PR 7062). .. diff --git a/Misc/NEWS.d/3.8.2rc2.rst b/Misc/NEWS.d/3.8.2rc2.rst index fed6ceadb28c5..feadb3affc851 100644 --- a/Misc/NEWS.d/3.8.2rc2.rst +++ b/Misc/NEWS.d/3.8.2rc2.rst @@ -54,7 +54,7 @@ Syntax errors raised in the tokenizer now always set correct "text" and .. section: Library The original fix for bpo-27657, "Fix urlparse() with numeric paths" -(GH-16839) included in 3.8.1, inadvertently introduced a behavior change +(PR 16839) included in 3.8.1, inadvertently introduced a behavior change that broke several third-party packages relying on the original undefined parsing behavior. The change is reverted in 3.8.2, restoring the behavior of 3.8.0 and earlier releases. From webhook-mailer at python.org Thu May 12 14:18:55 2022 From: webhook-mailer at python.org (rhettinger) Date: Thu, 12 May 2022 18:18:55 -0000 Subject: [Python-checkins] Add notes for maintaining ABCs (#92736) Message-ID: https://github.com/python/cpython/commit/a834e2d8e1230c17193c19b425e83e0bf736179e commit: a834e2d8e1230c17193c19b425e83e0bf736179e branch: main author: Raymond Hettinger committer: rhettinger date: 2022-05-12T13:18:39-05:00 summary: Add notes for maintaining ABCs (#92736) files: M Lib/_collections_abc.py M Lib/numbers.py diff --git a/Lib/_collections_abc.py b/Lib/_collections_abc.py index e96e4c3535586..c62233b81a5c9 100644 --- a/Lib/_collections_abc.py +++ b/Lib/_collections_abc.py @@ -6,6 +6,32 @@ Unit tests are in test_collections. """ +############ Maintenance notes ######################################### +# +# ABCs are different from other standard library modules in that they +# specify compliance tests. In general, once an ABC has been published, +# new methods (either abstract or concrete) cannot be added. +# +# Though classes that inherit from an ABC would automatically receive a +# new mixin method, registered classes would become non-compliant and +# violate the contract promised by ``isinstance(someobj, SomeABC)``. +# +# Though irritating, the correct procedure for adding new abstract or +# mixin methods is to create a new ABC as a subclass of the previous +# ABC. For example, union(), intersection(), and difference() cannot +# be added to Set but could go into a new ABC that extends Set. +# +# Because they are so hard to change, new ABCs should have their APIs +# carefully thought through prior to publication. +# +# Since ABCMeta only checks for the presence of methods, it is possible +# to alter the signature of a method by adding optional arguments +# or changing parameters names. This is still a bit dubious but at +# least it won't cause isinstance() to return an incorrect result. +# +# +####################################################################### + from abc import ABCMeta, abstractmethod import sys diff --git a/Lib/numbers.py b/Lib/numbers.py index 5b98e642083b3..9548aebd776a7 100644 --- a/Lib/numbers.py +++ b/Lib/numbers.py @@ -5,6 +5,31 @@ TODO: Fill out more detailed documentation on the operators.""" +############ Maintenance notes ######################################### +# +# ABCs are different from other standard library modules in that they +# specify compliance tests. In general, once an ABC has been published, +# new methods (either abstract or concrete) cannot be added. +# +# Though classes that inherit from an ABC would automatically receive a +# new mixin method, registered classes would become non-compliant and +# violate the contract promised by ``isinstance(someobj, SomeABC)``. +# +# Though irritating, the correct procedure for adding new abstract or +# mixin methods is to create a new ABC as a subclass of the previous +# ABC. +# +# Because they are so hard to change, new ABCs should have their APIs +# carefully thought through prior to publication. +# +# Since ABCMeta only checks for the presence of methods, it is possible +# to alter the signature of a method by adding optional arguments +# or changing parameter names. This is still a bit dubious but at +# least it won't cause isinstance() to return an incorrect result. +# +# +####################################################################### + from abc import ABCMeta, abstractmethod __all__ = ["Number", "Complex", "Real", "Rational", "Integral"] From webhook-mailer at python.org Thu May 12 17:00:55 2022 From: webhook-mailer at python.org (pganssle) Date: Thu, 12 May 2022 21:00:55 -0000 Subject: [Python-checkins] Check result of utc_to_seconds and skip fold probe in pure Python (#91582) Message-ID: https://github.com/python/cpython/commit/83c0247d47b99f4571e35ea95361436e1d2a61cd commit: 83c0247d47b99f4571e35ea95361436e1d2a61cd branch: main author: Paul Ganssle <1377457+pganssle at users.noreply.github.com> committer: pganssle <1377457+pganssle at users.noreply.github.com> date: 2022-05-12T17:00:50-04:00 summary: Check result of utc_to_seconds and skip fold probe in pure Python (#91582) The `utc_to_seconds` call can fail, here's a minimal reproducer on Linux: TZ=UTC python -c "from datetime import *; datetime.fromtimestamp(253402300799 + 1)" The old behavior still raised an error in a similar way, but only because subsequent calculations happened to fail as well. Better to fail fast. This also refactors the tests to split out the `fromtimestamp` and `utcfromtimestamp` tests, and to get us closer to the actual desired limits of the functions. As part of this, we also changed the way we detect platforms where the same limits don't necessarily apply (e.g. Windows). As part of refactoring the tests to hit this condition explicitly (even though the user-facing behvior doesn't change in any way we plan to guarantee), I noticed that there was a difference in the places that `datetime.utcfromtimestamp` fails in the C and pure Python versions, which was fixed by skipping the "probe for fold" logic for UTC specifically ? since UTC doesn't have any folds or gaps, we were never going to find a fold value anyway. This should prevent some failures in the pure python `utcfromtimestamp` method on timestamps close to 0001-01-01. There are two separate news entries for this because one is a potentially user-facing change, the other is an internal code correctness change that, if anything, changes some error messages. The two happen to be coupled because of the test refactoring, but they are probably best thought of as independent changes. Fixes GH-91581 files: A Misc/NEWS.d/next/Library/2022-04-15-13-16-25.gh-issue-91581.9OGsrN.rst A Misc/NEWS.d/next/Library/2022-05-11-14-34-09.gh-issue-91581.glkou2.rst M Lib/datetime.py M Lib/test/datetimetester.py M Modules/_datetimemodule.c diff --git a/Lib/datetime.py b/Lib/datetime.py index afbb6fed2ecb6..00ded32cc3e3c 100644 --- a/Lib/datetime.py +++ b/Lib/datetime.py @@ -1754,7 +1754,7 @@ def _fromtimestamp(cls, t, utc, tz): y, m, d, hh, mm, ss, weekday, jday, dst = converter(t) ss = min(ss, 59) # clamp out leap seconds if the platform has them result = cls(y, m, d, hh, mm, ss, us, tz) - if tz is None: + if tz is None and not utc: # As of version 2015f max fold in IANA database is # 23 hours at 1969-09-30 13:00:00 in Kwajalein. # Let's probe 24 hours in the past to detect a transition: @@ -1775,7 +1775,7 @@ def _fromtimestamp(cls, t, utc, tz): probe2 = cls(y, m, d, hh, mm, ss, us, tz) if probe2 == result: result._fold = 1 - else: + elif tz is not None: result = tz.fromutc(result) return result diff --git a/Lib/test/datetimetester.py b/Lib/test/datetimetester.py index 0495362b3f369..8e4bcc7c9efdc 100644 --- a/Lib/test/datetimetester.py +++ b/Lib/test/datetimetester.py @@ -2515,45 +2515,101 @@ def test_microsecond_rounding(self): self.assertEqual(t.microsecond, 7812) def test_timestamp_limits(self): - # minimum timestamp - min_dt = self.theclass.min.replace(tzinfo=timezone.utc) + with self.subTest("minimum UTC"): + min_dt = self.theclass.min.replace(tzinfo=timezone.utc) + min_ts = min_dt.timestamp() + + # This test assumes that datetime.min == 0000-01-01T00:00:00.00 + # If that assumption changes, this value can change as well + self.assertEqual(min_ts, -62135596800) + + with self.subTest("maximum UTC"): + # Zero out microseconds to avoid rounding issues + max_dt = self.theclass.max.replace(tzinfo=timezone.utc, + microsecond=0) + max_ts = max_dt.timestamp() + + # This test assumes that datetime.max == 9999-12-31T23:59:59.999999 + # If that assumption changes, this value can change as well + self.assertEqual(max_ts, 253402300799.0) + + def test_fromtimestamp_limits(self): + try: + self.theclass.fromtimestamp(-2**32 - 1) + except (OSError, OverflowError): + self.skipTest("Test not valid on this platform") + + # XXX: Replace these with datetime.{min,max}.timestamp() when we solve + # the issue with gh-91012 + min_dt = self.theclass.min + timedelta(days=1) min_ts = min_dt.timestamp() + + max_dt = self.theclass.max.replace(microsecond=0) + max_ts = ((self.theclass.max - timedelta(hours=23)).timestamp() + + timedelta(hours=22, minutes=59, seconds=59).total_seconds()) + + for (test_name, ts, expected) in [ + ("minimum", min_ts, min_dt), + ("maximum", max_ts, max_dt), + ]: + with self.subTest(test_name, ts=ts, expected=expected): + actual = self.theclass.fromtimestamp(ts) + + self.assertEqual(actual, expected) + + # Test error conditions + test_cases = [ + ("Too small by a little", min_ts - timedelta(days=1, hours=12).total_seconds()), + ("Too small by a lot", min_ts - timedelta(days=400).total_seconds()), + ("Too big by a little", max_ts + timedelta(days=1).total_seconds()), + ("Too big by a lot", max_ts + timedelta(days=400).total_seconds()), + ] + + for test_name, ts in test_cases: + with self.subTest(test_name, ts=ts): + with self.assertRaises((ValueError, OverflowError)): + # converting a Python int to C time_t can raise a + # OverflowError, especially on 32-bit platforms. + self.theclass.fromtimestamp(ts) + + def test_utcfromtimestamp_limits(self): try: - # date 0001-01-01 00:00:00+00:00: timestamp=-62135596800 - self.assertEqual(self.theclass.fromtimestamp(min_ts, tz=timezone.utc), - min_dt) - except (OverflowError, OSError) as exc: - # the date 0001-01-01 doesn't fit into 32-bit time_t, - # or platform doesn't support such very old date - self.skipTest(str(exc)) - - # maximum timestamp: set seconds to zero to avoid rounding issues - max_dt = self.theclass.max.replace(tzinfo=timezone.utc, - second=0, microsecond=0) + self.theclass.utcfromtimestamp(-2**32 - 1) + except (OSError, OverflowError): + self.skipTest("Test not valid on this platform") + + min_dt = self.theclass.min.replace(tzinfo=timezone.utc) + min_ts = min_dt.timestamp() + + max_dt = self.theclass.max.replace(microsecond=0, tzinfo=timezone.utc) max_ts = max_dt.timestamp() - # date 9999-12-31 23:59:00+00:00: timestamp 253402300740 - self.assertEqual(self.theclass.fromtimestamp(max_ts, tz=timezone.utc), - max_dt) - - # number of seconds greater than 1 year: make sure that the new date - # is not valid in datetime.datetime limits - delta = 3600 * 24 * 400 - - # too small - ts = min_ts - delta - # converting a Python int to C time_t can raise a OverflowError, - # especially on 32-bit platforms. - with self.assertRaises((ValueError, OverflowError)): - self.theclass.fromtimestamp(ts) - with self.assertRaises((ValueError, OverflowError)): - self.theclass.utcfromtimestamp(ts) - - # too big - ts = max_dt.timestamp() + delta - with self.assertRaises((ValueError, OverflowError)): - self.theclass.fromtimestamp(ts) - with self.assertRaises((ValueError, OverflowError)): - self.theclass.utcfromtimestamp(ts) + + for (test_name, ts, expected) in [ + ("minimum", min_ts, min_dt.replace(tzinfo=None)), + ("maximum", max_ts, max_dt.replace(tzinfo=None)), + ]: + with self.subTest(test_name, ts=ts, expected=expected): + try: + actual = self.theclass.utcfromtimestamp(ts) + except (OSError, OverflowError) as exc: + self.skipTest(str(exc)) + + self.assertEqual(actual, expected) + + # Test error conditions + test_cases = [ + ("Too small by a little", min_ts - 1), + ("Too small by a lot", min_ts - timedelta(days=400).total_seconds()), + ("Too big by a little", max_ts + 1), + ("Too big by a lot", max_ts + timedelta(days=400).total_seconds()), + ] + + for test_name, ts in test_cases: + with self.subTest(test_name, ts=ts): + with self.assertRaises((ValueError, OverflowError)): + # converting a Python int to C time_t can raise a + # OverflowError, especially on 32-bit platforms. + self.theclass.utcfromtimestamp(ts) def test_insane_fromtimestamp(self): # It's possible that some platform maps time_t to double, diff --git a/Misc/NEWS.d/next/Library/2022-04-15-13-16-25.gh-issue-91581.9OGsrN.rst b/Misc/NEWS.d/next/Library/2022-04-15-13-16-25.gh-issue-91581.9OGsrN.rst new file mode 100644 index 0000000000000..1c3008f425578 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-04-15-13-16-25.gh-issue-91581.9OGsrN.rst @@ -0,0 +1,6 @@ +Remove an unhandled error case in the C implementation of calls to +:meth:`datetime.fromtimestamp ` with no time +zone (i.e. getting a local time from an epoch timestamp). This should have no +user-facing effect other than giving a possibly more accurate error message +when called with timestamps that fall on 10000-01-01 in the local time. Patch +by Paul Ganssle. diff --git a/Misc/NEWS.d/next/Library/2022-05-11-14-34-09.gh-issue-91581.glkou2.rst b/Misc/NEWS.d/next/Library/2022-05-11-14-34-09.gh-issue-91581.glkou2.rst new file mode 100644 index 0000000000000..846f57844a675 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-05-11-14-34-09.gh-issue-91581.glkou2.rst @@ -0,0 +1,5 @@ +:meth:`~datetime.datetime.utcfromtimestamp` no longer attempts to resolve +``fold`` in the pure Python implementation, since the fold is never 1 in UTC. +In addition to being slightly faster in the common case, this also prevents +some errors when the timestamp is close to :attr:`datetime.min +`. Patch by Paul Ganssle. diff --git a/Modules/_datetimemodule.c b/Modules/_datetimemodule.c index efb5278038f2f..e0bb4ee602c42 100644 --- a/Modules/_datetimemodule.c +++ b/Modules/_datetimemodule.c @@ -5071,6 +5071,10 @@ datetime_from_timet_and_us(PyObject *cls, TM_FUNC f, time_t timet, int us, result_seconds = utc_to_seconds(year, month, day, hour, minute, second); + if (result_seconds == -1 && PyErr_Occurred()) { + return NULL; + } + /* Probe max_fold_seconds to detect a fold. */ probe_seconds = local(epoch + timet - max_fold_seconds); if (probe_seconds == -1) From webhook-mailer at python.org Thu May 12 17:12:33 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Thu, 12 May 2022 21:12:33 -0000 Subject: [Python-checkins] [3.9] gh-92436: __future__ docs: add note on expectations for "from __future__ import annotations" (GH-92568). (#92726) Message-ID: https://github.com/python/cpython/commit/f6bd1bd19a3ec270cfe552e40dfd462a7f28492e commit: f6bd1bd19a3ec270cfe552e40dfd462a7f28492e branch: 3.9 author: Jelle Zijlstra committer: JelleZijlstra date: 2022-05-12T14:12:28-07:00 summary: [3.9] gh-92436: __future__ docs: add note on expectations for "from __future__ import annotations" (GH-92568). (#92726) (cherry picked from commit 6582c96454ddb731eb412c2a473300172225fdb9) Co-authored-by: Jelle Zijlstra files: M Doc/library/__future__.rst diff --git a/Doc/library/__future__.rst b/Doc/library/__future__.rst index 41399942d3030..8bd23daee7397 100644 --- a/Doc/library/__future__.rst +++ b/Doc/library/__future__.rst @@ -90,12 +90,20 @@ language using this mechanism: | generator_stop | 3.5.0b1 | 3.7 | :pep:`479`: | | | | | *StopIteration handling inside generators* | +------------------+-------------+--------------+---------------------------------------------+ -| annotations | 3.7.0b1 | 3.10 | :pep:`563`: | +| annotations | 3.7.0b1 | TBD [1]_ | :pep:`563`: | | | | | *Postponed evaluation of annotations* | +------------------+-------------+--------------+---------------------------------------------+ .. XXX Adding a new entry? Remember to update simple_stmts.rst, too. +.. [1] + ``from __future__ import annotations`` was previously scheduled to + become mandatory in Python 3.10, but the Python Steering Council + twice decided to delay the change + (`announcement for Python 3.10 `__; + `announcement for Python 3.11 `__). + No final decision has been made yet. See also :pep:`563` and :pep:`649`. + .. seealso:: From webhook-mailer at python.org Thu May 12 17:41:50 2022 From: webhook-mailer at python.org (sweeneyde) Date: Thu, 12 May 2022 21:41:50 -0000 Subject: [Python-checkins] [3.9] gh-92311: Let frame_setlineno jump over listcomps (#92740) Message-ID: https://github.com/python/cpython/commit/801f77119da98df9d18a2a0904c1e8dc2e2f217f commit: 801f77119da98df9d18a2a0904c1e8dc2e2f217f branch: 3.9 author: Dennis Sweeney <36520290+sweeneyde at users.noreply.github.com> committer: sweeneyde <36520290+sweeneyde at users.noreply.github.com> date: 2022-05-12T17:41:34-04:00 summary: [3.9] gh-92311: Let frame_setlineno jump over listcomps (#92740) files: A Misc/NEWS.d/next/Core and Builtins/2022-05-12-18-59-27.gh-issue-92311.VEgtts.rst M Lib/test/test_sys_settrace.py M Objects/frameobject.c diff --git a/Lib/test/test_sys_settrace.py b/Lib/test/test_sys_settrace.py index 7519309c5e589..8884bf45a9991 100644 --- a/Lib/test/test_sys_settrace.py +++ b/Lib/test/test_sys_settrace.py @@ -1603,6 +1603,54 @@ def gen(): next(gen()) output.append(5) + @jump_test(2, 3, [1, 3]) + def test_jump_forward_over_listcomp(output): + output.append(1) + x = [i for i in range(10)] + output.append(3) + + # checking for segfaults. + # See https://github.com/python/cpython/issues/92311 + @jump_test(3, 1, []) + def test_jump_backward_over_listcomp(output): + a = 1 + x = [i for i in range(10)] + c = 3 + + @jump_test(8, 2, [2, 7, 2]) + def test_jump_backward_over_listcomp_v2(output): + flag = False + output.append(2) + if flag: + return + x = [i for i in range(5)] + flag = 6 + output.append(7) + output.append(8) + + @async_jump_test(2, 3, [1, 3]) + async def test_jump_forward_over_async_listcomp(output): + output.append(1) + x = [i async for i in asynciter(range(10))] + output.append(3) + + @async_jump_test(3, 1, []) + async def test_jump_backward_over_async_listcomp(output): + a = 1 + x = [i async for i in asynciter(range(10))] + c = 3 + + @async_jump_test(8, 2, [2, 7, 2]) + async def test_jump_backward_over_async_listcomp_v2(output): + flag = False + output.append(2) + if flag: + return + x = [i async for i in asynciter(range(5))] + flag = 6 + output.append(7) + output.append(8) + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-12-18-59-27.gh-issue-92311.VEgtts.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-12-18-59-27.gh-issue-92311.VEgtts.rst new file mode 100644 index 0000000000000..b800def656cbf --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-05-12-18-59-27.gh-issue-92311.VEgtts.rst @@ -0,0 +1 @@ +Fixed a bug where setting ``frame.f_lineno`` to jump over a list comprehension could misbehave or crash. diff --git a/Objects/frameobject.c b/Objects/frameobject.c index 4ae17bcfc2109..10db68ef1e072 100644 --- a/Objects/frameobject.c +++ b/Objects/frameobject.c @@ -173,7 +173,10 @@ markblocks(PyCodeObject *code_obj, int len) break; case GET_ITER: case GET_AITER: - block_stack = push_block(block_stack, Loop); + // For-loops get a Loop block, but comprehensions do not. + if (_Py_OPCODE(code[i + 1]) != CALL_FUNCTION) { + block_stack = push_block(block_stack, Loop); + } blocks[i+1] = block_stack; break; case FOR_ITER: From webhook-mailer at python.org Thu May 12 17:43:58 2022 From: webhook-mailer at python.org (sweeneyde) Date: Thu, 12 May 2022 21:43:58 -0000 Subject: [Python-checkins] gh-92311: Add tests for frame_setlineno jumping over listcomps (#92741) Message-ID: https://github.com/python/cpython/commit/8cf2906828b4ea281ea5381bf59b9052bae99f53 commit: 8cf2906828b4ea281ea5381bf59b9052bae99f53 branch: main author: Dennis Sweeney <36520290+sweeneyde at users.noreply.github.com> committer: sweeneyde <36520290+sweeneyde at users.noreply.github.com> date: 2022-05-12T17:43:54-04:00 summary: gh-92311: Add tests for frame_setlineno jumping over listcomps (#92741) files: M Lib/test/test_sys_settrace.py diff --git a/Lib/test/test_sys_settrace.py b/Lib/test/test_sys_settrace.py index b1c8f6f80af83..715204edc44e3 100644 --- a/Lib/test/test_sys_settrace.py +++ b/Lib/test/test_sys_settrace.py @@ -2431,6 +2431,54 @@ def gen(): next(gen()) output.append(5) + @jump_test(2, 3, [1, 3]) + def test_jump_forward_over_listcomp(output): + output.append(1) + x = [i for i in range(10)] + output.append(3) + + # checking for segfaults. + # See https://github.com/python/cpython/issues/92311 + @jump_test(3, 1, []) + def test_jump_backward_over_listcomp(output): + a = 1 + x = [i for i in range(10)] + c = 3 + + @jump_test(8, 2, [2, 7, 2]) + def test_jump_backward_over_listcomp_v2(output): + flag = False + output.append(2) + if flag: + return + x = [i for i in range(5)] + flag = 6 + output.append(7) + output.append(8) + + @async_jump_test(2, 3, [1, 3]) + async def test_jump_forward_over_async_listcomp(output): + output.append(1) + x = [i async for i in asynciter(range(10))] + output.append(3) + + @async_jump_test(3, 1, []) + async def test_jump_backward_over_async_listcomp(output): + a = 1 + x = [i async for i in asynciter(range(10))] + c = 3 + + @async_jump_test(8, 2, [2, 7, 2]) + async def test_jump_backward_over_async_listcomp_v2(output): + flag = False + output.append(2) + if flag: + return + x = [i async for i in asynciter(range(5))] + flag = 6 + output.append(7) + output.append(8) + class TestExtendedArgs(unittest.TestCase): From webhook-mailer at python.org Thu May 12 18:20:18 2022 From: webhook-mailer at python.org (vstinner) Date: Thu, 12 May 2022 22:20:18 -0000 Subject: [Python-checkins] gh-92584: test_cppext uses setuptools (#92639) Message-ID: https://github.com/python/cpython/commit/4e283777229ade11012b590624bd2cf04c42436d commit: 4e283777229ade11012b590624bd2cf04c42436d branch: main author: Victor Stinner committer: vstinner date: 2022-05-13T00:20:13+02:00 summary: gh-92584: test_cppext uses setuptools (#92639) Rewrite test_cppext to run in a virtual environment and to build the C++ extension with setuptools rather than distutils. files: A Lib/test/setup_testcppext.py M Lib/test/test_cppext.py diff --git a/Lib/test/setup_testcppext.py b/Lib/test/setup_testcppext.py new file mode 100644 index 0000000000000..780cb7b24a78c --- /dev/null +++ b/Lib/test/setup_testcppext.py @@ -0,0 +1,42 @@ +# gh-91321: Build a basic C++ test extension to check that the Python C API is +# compatible with C++ and does not emit C++ compiler warnings. +import sys +from test import support + +from setuptools import setup, Extension + + +MS_WINDOWS = (sys.platform == 'win32') + + +SOURCE = support.findfile('_testcppext.cpp') +if not MS_WINDOWS: + # C++ compiler flags for GCC and clang + CPPFLAGS = [ + # Python currently targets C++11 + '-std=c++11', + # gh-91321: The purpose of _testcppext extension is to check that building + # a C++ extension using the Python C API does not emit C++ compiler + # warnings + '-Werror', + # Warn on old-style cast (C cast) like: (PyObject*)op + '-Wold-style-cast', + # Warn when using NULL rather than _Py_NULL in static inline functions + '-Wzero-as-null-pointer-constant', + ] +else: + # Don't pass any compiler flag to MSVC + CPPFLAGS = [] + + +def main(): + cpp_ext = Extension( + '_testcppext', + sources=[SOURCE], + language='c++', + extra_compile_args=CPPFLAGS) + setup(name="_testcppext", ext_modules=[cpp_ext]) + + +if __name__ == "__main__": + main() diff --git a/Lib/test/test_cppext.py b/Lib/test/test_cppext.py index 337cb08f8c9d8..8acf0f1b7c0dc 100644 --- a/Lib/test/test_cppext.py +++ b/Lib/test/test_cppext.py @@ -1,91 +1,59 @@ # gh-91321: Build a basic C++ test extension to check that the Python C API is # compatible with C++ and does not emit C++ compiler warnings. -import contextlib -import os +import os.path import sys import unittest -import warnings +import subprocess from test import support from test.support import os_helper -with warnings.catch_warnings(): - warnings.simplefilter('ignore', DeprecationWarning) - from distutils.core import setup, Extension - import distutils.sysconfig - MS_WINDOWS = (sys.platform == 'win32') -SOURCE = support.findfile('_testcppext.cpp') -if not MS_WINDOWS: - # C++ compiler flags for GCC and clang - CPPFLAGS = [ - # Python currently targets C++11 - '-std=c++11', - # gh-91321: The purpose of _testcppext extension is to check that building - # a C++ extension using the Python C API does not emit C++ compiler - # warnings - '-Werror', - # Warn on old-style cast (C cast) like: (PyObject*)op - '-Wold-style-cast', - # Warn when using NULL rather than _Py_NULL in static inline functions - '-Wzero-as-null-pointer-constant', - ] -else: - # Don't pass any compiler flag to MSVC - CPPFLAGS = [] +SETUP_TESTCPPEXT = support.findfile('setup_testcppext.py') @support.requires_subprocess() class TestCPPExt(unittest.TestCase): - def build(self): - cpp_ext = Extension( - '_testcppext', - sources=[SOURCE], - language='c++', - extra_compile_args=CPPFLAGS) - capture_stdout = (not support.verbose) - - try: - try: - if capture_stdout: - stdout = support.captured_stdout() - else: - print() - stdout = contextlib.nullcontext() - with (stdout, - support.swap_attr(sys, 'argv', ['setup.py', 'build_ext', '--verbose'])): - setup(name="_testcppext", ext_modules=[cpp_ext]) - return - except: - if capture_stdout: - # Show output on error - print() - print(stdout.getvalue()) - raise - except SystemExit: - self.fail("Build failed") - # With MSVC, the linker fails with: cannot open file 'python311.lib' # https://github.com/python/cpython/pull/32175#issuecomment-1111175897 @unittest.skipIf(MS_WINDOWS, 'test fails on Windows') def test_build(self): - # save/restore os.environ - def restore_env(old_env): - os.environ.clear() - os.environ.update(old_env) - self.addCleanup(restore_env, dict(os.environ)) - - def restore_sysconfig_vars(old_config_vars): - distutils.sysconfig._config_vars.clear() - distutils.sysconfig._config_vars.update(old_config_vars) - self.addCleanup(restore_sysconfig_vars, - dict(distutils.sysconfig._config_vars)) - # Build in a temporary directory with os_helper.temp_cwd(): - self.build() + self._test_build() + + def _test_build(self): + venv_dir = 'env' + + # Create virtual environment to get setuptools + cmd = [sys.executable, '-X', 'dev', '-m', 'venv', venv_dir] + if support.verbose: + print() + print('Run:', ' '.join(cmd)) + subprocess.run(cmd, check=True) + + # Get the Python executable of the venv + python_exe = 'python' + if sys.executable.endswith('.exe'): + python_exe += '.exe' + if MS_WINDOWS: + python = os.path.join(venv_dir, 'Scripts', python_exe) + else: + python = os.path.join(venv_dir, 'bin', python_exe) + + # Build the C++ extension + cmd = [python, '-X', 'dev', SETUP_TESTCPPEXT, 'build_ext', '--verbose'] + if support.verbose: + print('Run:', ' '.join(cmd)) + proc = subprocess.run(cmd, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + text=True) + if proc.returncode: + print(proc.stdout, end='') + self.fail(f"Build failed with exit code {proc.returncode}") if __name__ == "__main__": From webhook-mailer at python.org Fri May 13 00:15:51 2022 From: webhook-mailer at python.org (methane) Date: Fri, 13 May 2022 04:15:51 -0000 Subject: [Python-checkins] gh-92536: Doc update about Py_UNICODE removal (GH-92756) Message-ID: https://github.com/python/cpython/commit/e371d5d5d125b0acdde2791d88562338a7359500 commit: e371d5d5d125b0acdde2791d88562338a7359500 branch: main author: Inada Naoki committer: methane date: 2022-05-13T13:15:41+09:00 summary: gh-92536: Doc update about Py_UNICODE removal (GH-92756) files: M Doc/c-api/arg.rst M Doc/c-api/unicode.rst diff --git a/Doc/c-api/arg.rst b/Doc/c-api/arg.rst index 6d0ad395540aa..d9cabf90f8e29 100644 --- a/Doc/c-api/arg.rst +++ b/Doc/c-api/arg.rst @@ -206,8 +206,8 @@ which disallows mutable objects such as :class:`bytearray`. encoding passed in as parameter. .. versionchanged:: 3.12 - ``u``, ``u#``, ``Z``, and ``Z#`` are removed because they used legacy ``Py_UNICODE*`` - representation. + ``u``, ``u#``, ``Z``, and ``Z#`` are removed because they used a legacy + ``Py_UNICODE*`` representation. Numbers diff --git a/Doc/c-api/unicode.rst b/Doc/c-api/unicode.rst index 8fab3b7258276..6acd7ba790842 100644 --- a/Doc/c-api/unicode.rst +++ b/Doc/c-api/unicode.rst @@ -92,7 +92,7 @@ access to internal read-only data of Unicode objects: .. versionadded:: 3.3 .. deprecated:: 3.10 - This API do nothing since Python 3.12. Please remove code using this function. + This API does nothing since Python 3.12. .. c:function:: Py_ssize_t PyUnicode_GET_LENGTH(PyObject *o) From webhook-mailer at python.org Fri May 13 02:36:10 2022 From: webhook-mailer at python.org (tiran) Date: Fri, 13 May 2022 06:36:10 -0000 Subject: [Python-checkins] gh-90473: Increase stack size, disable obmalloc on WASI (GH-92732) Message-ID: https://github.com/python/cpython/commit/d81d57e9598dea741e049f3876ccd87072a38906 commit: d81d57e9598dea741e049f3876ccd87072a38906 branch: main author: Christian Heimes committer: tiran date: 2022-05-13T08:36:01+02:00 summary: gh-90473: Increase stack size, disable obmalloc on WASI (GH-92732) files: A Misc/NEWS.d/next/Build/2022-05-12-10-19-15.gh-issue-90473.-syvqK.rst M Lib/test/support/os_helper.py M Lib/test/test_builtin.py M configure M configure.ac diff --git a/Lib/test/support/os_helper.py b/Lib/test/support/os_helper.py index eee37ef0d5a71..ed4ec15c7cbe9 100644 --- a/Lib/test/support/os_helper.py +++ b/Lib/test/support/os_helper.py @@ -50,7 +50,7 @@ % (TESTFN_UNENCODABLE, sys.getfilesystemencoding())) TESTFN_UNENCODABLE = None # macOS and Emscripten deny unencodable filenames (invalid utf-8) -elif sys.platform not in {'darwin', 'emscripten'}: +elif sys.platform not in {'darwin', 'emscripten', 'wasi'}: try: # ascii and utf-8 cannot encode the byte 0xff b'\xff'.decode(sys.getfilesystemencoding()) diff --git a/Lib/test/test_builtin.py b/Lib/test/test_builtin.py index ba7a7e20d7dcd..efa9459a58629 100644 --- a/Lib/test/test_builtin.py +++ b/Lib/test/test_builtin.py @@ -393,7 +393,10 @@ def test_compile_top_level_await_no_coro(self): msg=f"source={source} mode={mode}") - @unittest.skipIf(support.is_emscripten, "socket.accept is broken") + @unittest.skipIf( + support.is_emscripten or support.is_wasi, + "socket.accept is broken" + ) def test_compile_top_level_await(self): """Test whether code some top level await can be compiled. diff --git a/Misc/NEWS.d/next/Build/2022-05-12-10-19-15.gh-issue-90473.-syvqK.rst b/Misc/NEWS.d/next/Build/2022-05-12-10-19-15.gh-issue-90473.-syvqK.rst new file mode 100644 index 0000000000000..29ce3de1f2134 --- /dev/null +++ b/Misc/NEWS.d/next/Build/2022-05-12-10-19-15.gh-issue-90473.-syvqK.rst @@ -0,0 +1 @@ +Disable pymalloc and increase stack size on ``wasm32-wasi``. diff --git a/configure b/configure index 010ad320582c5..02810880e914f 100755 --- a/configure +++ b/configure @@ -7922,6 +7922,8 @@ $as_echo "#define _WASI_EMULATED_PROCESS_CLOCKS 1" >>confdefs.h LIBS="$LIBS -lwasi-emulated-signal -lwasi-emulated-getpid -lwasi-emulated-process-clocks" echo "#define _WASI_EMULATED_SIGNAL 1" >> confdefs.h + as_fn_append LDFLAGS_NODIST " -z stack-size=524288 -Wl,--stack-first -Wl,--initial-memory=10485760" + ;; #( *) : ;; @@ -14231,19 +14233,26 @@ int domain = AF_INET6; _ACEOF if ac_fn_c_try_compile "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } ipv6=yes else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } ipv6=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +case $ac_sys_system in #( + WASI) : + ipv6=no + ;; #( + *) : + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ipv6" >&5 +$as_echo "$ipv6" >&6; } + if test "$ipv6" = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if RFC2553 API is available" >&5 $as_echo_n "checking if RFC2553 API is available... " >&6; } @@ -14557,6 +14566,8 @@ then case $ac_sys_system in #( Emscripten) : with_pymalloc="no" ;; #( + WASI) : + with_pymalloc="no" ;; #( *) : with_pymalloc="yes" ;; @@ -22597,6 +22608,12 @@ case $ac_sys_system in #( ;; #( WASI/*) : + + + py_cv_module__ctypes_test=n/a + py_cv_module_=n/a + + ;; #( *) : ;; diff --git a/configure.ac b/configure.ac index 65b96976031ac..eab326232b14d 100644 --- a/configure.ac +++ b/configure.ac @@ -1994,6 +1994,10 @@ AS_CASE([$ac_sys_system], AC_DEFINE([_WASI_EMULATED_PROCESS_CLOCKS], [1], [Define to 1 if you want to emulate process clocks on WASI]) LIBS="$LIBS -lwasi-emulated-signal -lwasi-emulated-getpid -lwasi-emulated-process-clocks" echo "#define _WASI_EMULATED_SIGNAL 1" >> confdefs.h + + dnl increase initial memory and stack size, move stack first + dnl https://github.com/WebAssembly/wasi-libc/issues/233 + AS_VAR_APPEND([LDFLAGS_NODIST], [" -z stack-size=524288 -Wl,--stack-first -Wl,--initial-memory=10485760"]) ] ) @@ -4046,13 +4050,17 @@ dnl the check does not work on cross compilation case... #include #include ]], [[int domain = AF_INET6;]])],[ - AC_MSG_RESULT(yes) ipv6=yes ],[ - AC_MSG_RESULT(no) ipv6=no ]) +AS_CASE([$ac_sys_system], + [WASI], [ipv6=no] +) + +AC_MSG_RESULT([$ipv6]) + if test "$ipv6" = "yes"; then AC_MSG_CHECKING(if RFC2553 API is available) AC_COMPILE_IFELSE([ @@ -4232,9 +4240,10 @@ AC_ARG_WITH(pymalloc, if test -z "$with_pymalloc" then - dnl default to yes except for wasm32-emscripten + dnl default to yes except for wasm32-emscripten and wasm32-wasi. AS_CASE([$ac_sys_system], [Emscripten], [with_pymalloc="no"], + [WASI], [with_pymalloc="no"], [with_pymalloc="yes"] ) fi @@ -6680,7 +6689,11 @@ AS_CASE([$ac_sys_system], ) ], [Emscripten/node*], [], - [WASI/*], [] + [WASI/*], [ + PY_STDLIB_MOD_SET_NA( + [_ctypes_test], + ) + ] ) ], [PY_STDLIB_MOD_SET_NA([_scproxy])] From webhook-mailer at python.org Fri May 13 03:01:00 2022 From: webhook-mailer at python.org (miss-islington) Date: Fri, 13 May 2022 07:01:00 -0000 Subject: [Python-checkins] gh-90473: Increase stack size, disable obmalloc on WASI (GH-92732) Message-ID: https://github.com/python/cpython/commit/c41667e71b6f1b0c9581160ccd82026738c3a736 commit: c41667e71b6f1b0c9581160ccd82026738c3a736 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-13T00:00:33-07:00 summary: gh-90473: Increase stack size, disable obmalloc on WASI (GH-92732) (cherry picked from commit d81d57e9598dea741e049f3876ccd87072a38906) Co-authored-by: Christian Heimes files: A Misc/NEWS.d/next/Build/2022-05-12-10-19-15.gh-issue-90473.-syvqK.rst M Lib/test/support/os_helper.py M Lib/test/test_builtin.py M configure M configure.ac diff --git a/Lib/test/support/os_helper.py b/Lib/test/support/os_helper.py index eee37ef0d5a71..ed4ec15c7cbe9 100644 --- a/Lib/test/support/os_helper.py +++ b/Lib/test/support/os_helper.py @@ -50,7 +50,7 @@ % (TESTFN_UNENCODABLE, sys.getfilesystemencoding())) TESTFN_UNENCODABLE = None # macOS and Emscripten deny unencodable filenames (invalid utf-8) -elif sys.platform not in {'darwin', 'emscripten'}: +elif sys.platform not in {'darwin', 'emscripten', 'wasi'}: try: # ascii and utf-8 cannot encode the byte 0xff b'\xff'.decode(sys.getfilesystemencoding()) diff --git a/Lib/test/test_builtin.py b/Lib/test/test_builtin.py index ba7a7e20d7dcd..efa9459a58629 100644 --- a/Lib/test/test_builtin.py +++ b/Lib/test/test_builtin.py @@ -393,7 +393,10 @@ def test_compile_top_level_await_no_coro(self): msg=f"source={source} mode={mode}") - @unittest.skipIf(support.is_emscripten, "socket.accept is broken") + @unittest.skipIf( + support.is_emscripten or support.is_wasi, + "socket.accept is broken" + ) def test_compile_top_level_await(self): """Test whether code some top level await can be compiled. diff --git a/Misc/NEWS.d/next/Build/2022-05-12-10-19-15.gh-issue-90473.-syvqK.rst b/Misc/NEWS.d/next/Build/2022-05-12-10-19-15.gh-issue-90473.-syvqK.rst new file mode 100644 index 0000000000000..29ce3de1f2134 --- /dev/null +++ b/Misc/NEWS.d/next/Build/2022-05-12-10-19-15.gh-issue-90473.-syvqK.rst @@ -0,0 +1 @@ +Disable pymalloc and increase stack size on ``wasm32-wasi``. diff --git a/configure b/configure index a4ef0e50902cb..286a94946a083 100755 --- a/configure +++ b/configure @@ -7922,6 +7922,8 @@ $as_echo "#define _WASI_EMULATED_PROCESS_CLOCKS 1" >>confdefs.h LIBS="$LIBS -lwasi-emulated-signal -lwasi-emulated-getpid -lwasi-emulated-process-clocks" echo "#define _WASI_EMULATED_SIGNAL 1" >> confdefs.h + as_fn_append LDFLAGS_NODIST " -z stack-size=524288 -Wl,--stack-first -Wl,--initial-memory=10485760" + ;; #( *) : ;; @@ -14231,19 +14233,26 @@ int domain = AF_INET6; _ACEOF if ac_fn_c_try_compile "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } ipv6=yes else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } ipv6=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +case $ac_sys_system in #( + WASI) : + ipv6=no + ;; #( + *) : + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ipv6" >&5 +$as_echo "$ipv6" >&6; } + if test "$ipv6" = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if RFC2553 API is available" >&5 $as_echo_n "checking if RFC2553 API is available... " >&6; } @@ -14557,6 +14566,8 @@ then case $ac_sys_system in #( Emscripten) : with_pymalloc="no" ;; #( + WASI) : + with_pymalloc="no" ;; #( *) : with_pymalloc="yes" ;; @@ -22597,6 +22608,12 @@ case $ac_sys_system in #( ;; #( WASI/*) : + + + py_cv_module__ctypes_test=n/a + py_cv_module_=n/a + + ;; #( *) : ;; diff --git a/configure.ac b/configure.ac index c27d4ca3b569c..693f79bba0849 100644 --- a/configure.ac +++ b/configure.ac @@ -1994,6 +1994,10 @@ AS_CASE([$ac_sys_system], AC_DEFINE([_WASI_EMULATED_PROCESS_CLOCKS], [1], [Define to 1 if you want to emulate process clocks on WASI]) LIBS="$LIBS -lwasi-emulated-signal -lwasi-emulated-getpid -lwasi-emulated-process-clocks" echo "#define _WASI_EMULATED_SIGNAL 1" >> confdefs.h + + dnl increase initial memory and stack size, move stack first + dnl https://github.com/WebAssembly/wasi-libc/issues/233 + AS_VAR_APPEND([LDFLAGS_NODIST], [" -z stack-size=524288 -Wl,--stack-first -Wl,--initial-memory=10485760"]) ] ) @@ -4046,13 +4050,17 @@ dnl the check does not work on cross compilation case... #include #include ]], [[int domain = AF_INET6;]])],[ - AC_MSG_RESULT(yes) ipv6=yes ],[ - AC_MSG_RESULT(no) ipv6=no ]) +AS_CASE([$ac_sys_system], + [WASI], [ipv6=no] +) + +AC_MSG_RESULT([$ipv6]) + if test "$ipv6" = "yes"; then AC_MSG_CHECKING(if RFC2553 API is available) AC_COMPILE_IFELSE([ @@ -4232,9 +4240,10 @@ AC_ARG_WITH(pymalloc, if test -z "$with_pymalloc" then - dnl default to yes except for wasm32-emscripten + dnl default to yes except for wasm32-emscripten and wasm32-wasi. AS_CASE([$ac_sys_system], [Emscripten], [with_pymalloc="no"], + [WASI], [with_pymalloc="no"], [with_pymalloc="yes"] ) fi @@ -6680,7 +6689,11 @@ AS_CASE([$ac_sys_system], ) ], [Emscripten/node*], [], - [WASI/*], [] + [WASI/*], [ + PY_STDLIB_MOD_SET_NA( + [_ctypes_test], + ) + ] ) ], [PY_STDLIB_MOD_SET_NA([_scproxy])] From webhook-mailer at python.org Fri May 13 05:50:38 2022 From: webhook-mailer at python.org (vstinner) Date: Fri, 13 May 2022 09:50:38 -0000 Subject: [Python-checkins] gh-89653: PEP 670: Convert PyUnicode_KIND() macro to function (#92705) Message-ID: https://github.com/python/cpython/commit/db388df1d9aff02f791fe01c7c2b28d73982dce6 commit: db388df1d9aff02f791fe01c7c2b28d73982dce6 branch: main author: Victor Stinner committer: vstinner date: 2022-05-13T11:49:56+02:00 summary: gh-89653: PEP 670: Convert PyUnicode_KIND() macro to function (#92705) In the limited C API version 3.12, PyUnicode_KIND() is now implemented as a static inline function. Keep the macro for the regular C API and for the limited C API version 3.11 and older to prevent introducing new compiler warnings. Update _decimal.c and stringlib/eq.h for PyUnicode_KIND(). files: M Include/cpython/unicodeobject.h M Modules/_decimal/_decimal.c M Objects/stringlib/eq.h diff --git a/Include/cpython/unicodeobject.h b/Include/cpython/unicodeobject.h index 8c53962437b6e..030614e263344 100644 --- a/Include/cpython/unicodeobject.h +++ b/Include/cpython/unicodeobject.h @@ -242,9 +242,23 @@ enum PyUnicode_Kind { PyUnicode_4BYTE_KIND = 4 }; -/* Return one of the PyUnicode_*_KIND values defined above. */ +// PyUnicode_KIND(): Return one of the PyUnicode_*_KIND values defined above. +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030c0000 +// gh-89653: Converting this macro to a static inline function would introduce +// new compiler warnings on "kind < PyUnicode_KIND(str)" (compare signed and +// unsigned numbers) where kind type is an int or on +// "unsigned int kind = PyUnicode_KIND(str)" (cast signed to unsigned). +// Only declare the function as static inline function in the limited C API +// version 3.12 which is stricter. #define PyUnicode_KIND(op) \ (_PyASCIIObject_CAST(op)->state.kind) +#else +// Limited C API 3.12 and newer +static inline int PyUnicode_KIND(PyObject *op) { + assert(PyUnicode_IS_READY(op)); + return _PyASCIIObject_CAST(op)->state.kind; +} +#endif /* Return a void pointer to the raw unicode buffer. */ static inline void* _PyUnicode_COMPACT_DATA(PyObject *op) { diff --git a/Modules/_decimal/_decimal.c b/Modules/_decimal/_decimal.c index 65885965ff046..5cbddac623248 100644 --- a/Modules/_decimal/_decimal.c +++ b/Modules/_decimal/_decimal.c @@ -1933,7 +1933,7 @@ is_space(enum PyUnicode_Kind kind, const void *data, Py_ssize_t pos) Return NULL if malloc fails and an empty string if invalid characters are found. */ static char * -numeric_as_ascii(const PyObject *u, int strip_ws, int ignore_underscores) +numeric_as_ascii(PyObject *u, int strip_ws, int ignore_underscores) { enum PyUnicode_Kind kind; const void *data; @@ -2047,7 +2047,7 @@ PyDecType_FromCStringExact(PyTypeObject *type, const char *s, /* Return a new PyDecObject or a subtype from a PyUnicodeObject. */ static PyObject * -PyDecType_FromUnicode(PyTypeObject *type, const PyObject *u, +PyDecType_FromUnicode(PyTypeObject *type, PyObject *u, PyObject *context) { PyObject *dec; @@ -2067,7 +2067,7 @@ PyDecType_FromUnicode(PyTypeObject *type, const PyObject *u, * conversion. If the conversion is not exact, fail with InvalidOperation. * Allow leading and trailing whitespace in the input operand. */ static PyObject * -PyDecType_FromUnicodeExactWS(PyTypeObject *type, const PyObject *u, +PyDecType_FromUnicodeExactWS(PyTypeObject *type, PyObject *u, PyObject *context) { PyObject *dec; @@ -2150,7 +2150,7 @@ PyDecType_FromSsizeExact(PyTypeObject *type, mpd_ssize_t v, PyObject *context) /* Convert from a PyLongObject. The context is not modified; flags set during conversion are accumulated in the status parameter. */ static PyObject * -dec_from_long(PyTypeObject *type, const PyObject *v, +dec_from_long(PyTypeObject *type, PyObject *v, const mpd_context_t *ctx, uint32_t *status) { PyObject *dec; @@ -2201,7 +2201,7 @@ dec_from_long(PyTypeObject *type, const PyObject *v, /* Return a new PyDecObject from a PyLongObject. Use the context for conversion. */ static PyObject * -PyDecType_FromLong(PyTypeObject *type, const PyObject *v, PyObject *context) +PyDecType_FromLong(PyTypeObject *type, PyObject *v, PyObject *context) { PyObject *dec; uint32_t status = 0; @@ -2227,7 +2227,7 @@ PyDecType_FromLong(PyTypeObject *type, const PyObject *v, PyObject *context) /* Return a new PyDecObject from a PyLongObject. Use a maximum context for conversion. If the conversion is not exact, set InvalidOperation. */ static PyObject * -PyDecType_FromLongExact(PyTypeObject *type, const PyObject *v, +PyDecType_FromLongExact(PyTypeObject *type, PyObject *v, PyObject *context) { PyObject *dec; diff --git a/Objects/stringlib/eq.h b/Objects/stringlib/eq.h index 2f2438845a629..2eac4baf5ca9c 100644 --- a/Objects/stringlib/eq.h +++ b/Objects/stringlib/eq.h @@ -6,9 +6,6 @@ Py_LOCAL_INLINE(int) unicode_eq(PyObject *a, PyObject *b) { - assert(PyUnicode_Check(a)); - assert(PyUnicode_Check(b)); - if (PyUnicode_GET_LENGTH(a) != PyUnicode_GET_LENGTH(b)) return 0; if (PyUnicode_GET_LENGTH(a) == 0) From webhook-mailer at python.org Fri May 13 06:25:23 2022 From: webhook-mailer at python.org (markshannon) Date: Fri, 13 May 2022 10:25:23 -0000 Subject: [Python-checkins] GH-92236: Remove spurious "line" event when starting coroutine or generator. (GH-92722) Message-ID: https://github.com/python/cpython/commit/22a1db378c5c381272362c5b2f68ac78a368e136 commit: 22a1db378c5c381272362c5b2f68ac78a368e136 branch: main author: Mark Shannon committer: markshannon date: 2022-05-13T11:24:45+01:00 summary: GH-92236: Remove spurious "line" event when starting coroutine or generator. (GH-92722) files: A Misc/NEWS.d/next/Core and Builtins/2022-05-12-13-23-19.gh-issue-92236.sDRzUe.rst M Lib/test/test_sys_settrace.py M Modules/_testcapimodule.c M Python/ceval.c diff --git a/Lib/test/test_sys_settrace.py b/Lib/test/test_sys_settrace.py index 715204edc44e3..9cc6bcfcab5e1 100644 --- a/Lib/test/test_sys_settrace.py +++ b/Lib/test/test_sys_settrace.py @@ -7,6 +7,7 @@ import gc from functools import wraps import asyncio +from test.support import import_helper support.requires_working_socket(module=True) @@ -1473,6 +1474,58 @@ def __init__(self): (3, 'return'), (1, 'return')]) + @support.cpython_only + def test_no_line_event_after_creating_generator(self): + # Spurious line events before call events only show up with C tracer + + # Skip this test if the _testcapi module isn't available. + _testcapi = import_helper.import_module('_testcapi') + + def gen(): + yield 1 + + def func(): + for _ in ( + gen() + ): + pass + + EXPECTED_EVENTS = [ + (0, 'call'), + (2, 'line'), + (1, 'line'), + (-3, 'call'), + (-2, 'line'), + (-2, 'return'), + (4, 'line'), + (1, 'line'), + (-2, 'call'), + (-2, 'return'), + (1, 'return'), + ] + + # C level events should be the same as expected and the same as Python level. + + events = [] + # Turning on and off tracing must be on same line to avoid unwanted LINE events. + _testcapi.settrace_to_record(events); func(); sys.settrace(None) + start_line = func.__code__.co_firstlineno + events = [ + (line-start_line, EVENT_NAMES[what]) + for (what, line, arg) in events + ] + self.assertEqual(events, EXPECTED_EVENTS) + + self.run_and_compare(func, EXPECTED_EVENTS) + + +EVENT_NAMES = [ + 'call', + 'exception', + 'line', + 'return' +] + class SkipLineEventsTraceTestCase(TraceTestCase): """Repeat the trace tests, but with per-line events skipped""" diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-12-13-23-19.gh-issue-92236.sDRzUe.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-12-13-23-19.gh-issue-92236.sDRzUe.rst new file mode 100644 index 0000000000000..fe482d505c67b --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-05-12-13-23-19.gh-issue-92236.sDRzUe.rst @@ -0,0 +1,2 @@ +Remove spurious "LINE" event when starting a generator or coroutine, visible +tracing functions implemented in C. diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index 4371bf7da0e86..363dbbb666ca5 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -5787,6 +5787,51 @@ test_code_api(PyObject *self, PyObject *Py_UNUSED(args)) Py_RETURN_NONE; } +static int +record_func(PyObject *obj, PyFrameObject *f, int what, PyObject *arg) +{ + assert(PyList_Check(obj)); + PyObject *what_obj = NULL; + PyObject *line_obj = NULL; + PyObject *tuple = NULL; + int res = -1; + what_obj = PyLong_FromLong(what); + if (what_obj == NULL) { + goto error; + } + int line = PyFrame_GetLineNumber(f); + line_obj = PyLong_FromLong(line); + if (line_obj == NULL) { + goto error; + } + tuple = PyTuple_Pack(3, what_obj, line_obj, arg); + if (tuple == NULL) { + goto error; + } + PyTuple_SET_ITEM(tuple, 0, what_obj); + if (PyList_Append(obj, tuple)) { + goto error; + } + res = 0; +error: + Py_XDECREF(what_obj); + Py_XDECREF(line_obj); + Py_XDECREF(tuple); + return res; +} + +static PyObject * +settrace_to_record(PyObject *self, PyObject *list) +{ + + if (!PyList_Check(list)) { + PyErr_SetString(PyExc_TypeError, "argument must be a list"); + return NULL; + } + PyEval_SetTrace(record_func, list); + Py_RETURN_NONE; +} + static PyObject *negative_dictoffset(PyObject *, PyObject *); static PyObject *test_buildvalue_issue38913(PyObject *, PyObject *); static PyObject *getargs_s_hash_int(PyObject *, PyObject *, PyObject*); @@ -6076,6 +6121,7 @@ static PyMethodDef TestMethods[] = { {"frame_getlasti", frame_getlasti, METH_O, NULL}, {"get_feature_macros", get_feature_macros, METH_NOARGS, NULL}, {"test_code_api", test_code_api, METH_NOARGS, NULL}, + {"settrace_to_record", settrace_to_record, METH_O, NULL}, {NULL, NULL} /* sentinel */ }; diff --git a/Python/ceval.c b/Python/ceval.c index f6b07b4b28eb6..c73218fcf307e 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -5680,6 +5680,12 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int TRACE_FUNCTION_ENTRY(); DTRACE_FUNCTION_ENTRY(); break; + case POP_TOP: + if (_Py_OPCODE(next_instr[-1]) == RETURN_GENERATOR) { + /* Frame not fully initialized */ + break; + } + /* fall through */ default: /* line-by-line tracing support */ if (PyDTrace_LINE_ENABLED()) { From webhook-mailer at python.org Fri May 13 06:41:16 2022 From: webhook-mailer at python.org (vstinner) Date: Fri, 13 May 2022 10:41:16 -0000 Subject: [Python-checkins] gh-89653: Use int type for Unicode kind (#92704) Message-ID: https://github.com/python/cpython/commit/f62ad4f2c4214fdc05cc45c27a5c068553c7942c commit: f62ad4f2c4214fdc05cc45c27a5c068553c7942c branch: main author: Victor Stinner committer: vstinner date: 2022-05-13T12:41:05+02:00 summary: gh-89653: Use int type for Unicode kind (#92704) Use the same type that PyUnicode_FromKindAndData() kind parameter type (public C API): int. files: M Include/cpython/unicodeobject.h M Modules/_csv.c M Modules/_datetimemodule.c M Modules/_decimal/_decimal.c M Modules/_elementtree.c M Modules/_operator.c M Modules/_pickle.c M Modules/pyexpat.c M Objects/bytesobject.c M Objects/longobject.c M Objects/stringlib/localeutil.h M Objects/unicodeobject.c M Python/formatter_unicode.c diff --git a/Include/cpython/unicodeobject.h b/Include/cpython/unicodeobject.h index 030614e263344d..16db2cb7bffb99 100644 --- a/Include/cpython/unicodeobject.h +++ b/Include/cpython/unicodeobject.h @@ -507,7 +507,7 @@ PyAPI_FUNC(Py_UCS4) _PyUnicode_FindMaxChar ( typedef struct { PyObject *buffer; void *data; - enum PyUnicode_Kind kind; + int kind; Py_UCS4 maxchar; Py_ssize_t size; Py_ssize_t pos; @@ -566,7 +566,7 @@ _PyUnicodeWriter_PrepareInternal(_PyUnicodeWriter *writer, macro instead. */ PyAPI_FUNC(int) _PyUnicodeWriter_PrepareKindInternal(_PyUnicodeWriter *writer, - enum PyUnicode_Kind kind); + int kind); /* Append a Unicode character. Return 0 on success, raise an exception and return -1 on error. */ diff --git a/Modules/_csv.c b/Modules/_csv.c index cbf4c5de51968e..d34d0a1296ae72 100644 --- a/Modules/_csv.c +++ b/Modules/_csv.c @@ -868,7 +868,7 @@ Reader_iternext(ReaderObj *self) PyObject *fields = NULL; Py_UCS4 c; Py_ssize_t pos, linelen; - unsigned int kind; + int kind; const void *data; PyObject *lineobj; @@ -1066,7 +1066,7 @@ join_reset(WriterObj *self) * record length. */ static Py_ssize_t -join_append_data(WriterObj *self, unsigned int field_kind, const void *field_data, +join_append_data(WriterObj *self, int field_kind, const void *field_data, Py_ssize_t field_len, int *quoted, int copy_phase) { @@ -1179,7 +1179,7 @@ join_check_rec_size(WriterObj *self, Py_ssize_t rec_len) static int join_append(WriterObj *self, PyObject *field, int quoted) { - unsigned int field_kind = -1; + int field_kind = -1; const void *field_data = NULL; Py_ssize_t field_len = 0; Py_ssize_t rec_len; @@ -1211,7 +1211,7 @@ static int join_append_lineterminator(WriterObj *self) { Py_ssize_t terminator_len, i; - unsigned int term_kind; + int term_kind; const void *term_data; terminator_len = PyUnicode_GET_LENGTH(self->dialect->lineterminator); diff --git a/Modules/_datetimemodule.c b/Modules/_datetimemodule.c index e0bb4ee602c425..06dff8fdd9eed9 100644 --- a/Modules/_datetimemodule.c +++ b/Modules/_datetimemodule.c @@ -5284,7 +5284,7 @@ _sanitize_isoformat_str(PyObject *dtstr) // // The result of this, if not NULL, returns a new reference const void* const unicode_data = PyUnicode_DATA(dtstr); - const unsigned int kind = PyUnicode_KIND(dtstr); + const int kind = PyUnicode_KIND(dtstr); // Depending on the format of the string, the separator can only ever be // in positions 7, 8 or 10. We'll check each of these for a surrogate and diff --git a/Modules/_decimal/_decimal.c b/Modules/_decimal/_decimal.c index 5cbddac6232487..548bd601b0eb87 100644 --- a/Modules/_decimal/_decimal.c +++ b/Modules/_decimal/_decimal.c @@ -1918,7 +1918,7 @@ dec_dealloc(PyObject *dec) /******************************************************************************/ Py_LOCAL_INLINE(int) -is_space(enum PyUnicode_Kind kind, const void *data, Py_ssize_t pos) +is_space(int kind, const void *data, Py_ssize_t pos) { Py_UCS4 ch = PyUnicode_READ(kind, data, pos); return Py_UNICODE_ISSPACE(ch); @@ -1935,7 +1935,7 @@ is_space(enum PyUnicode_Kind kind, const void *data, Py_ssize_t pos) static char * numeric_as_ascii(PyObject *u, int strip_ws, int ignore_underscores) { - enum PyUnicode_Kind kind; + int kind; const void *data; Py_UCS4 ch; char *res, *cp; diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c index 89f877f6e1279f..453e57a94f2c6b 100644 --- a/Modules/_elementtree.c +++ b/Modules/_elementtree.c @@ -1121,7 +1121,7 @@ checkpath(PyObject* tag) if (PyUnicode_Check(tag)) { const Py_ssize_t len = PyUnicode_GET_LENGTH(tag); const void *data = PyUnicode_DATA(tag); - unsigned int kind = PyUnicode_KIND(tag); + int kind = PyUnicode_KIND(tag); if (len >= 3 && PyUnicode_READ(kind, data, 0) == '{' && ( PyUnicode_READ(kind, data, 1) == '}' || ( PyUnicode_READ(kind, data, 1) == '*' && diff --git a/Modules/_operator.c b/Modules/_operator.c index 739ae5b229e1e0..1af4a4feb7728a 100644 --- a/Modules/_operator.c +++ b/Modules/_operator.c @@ -1230,9 +1230,6 @@ attrgetter_new(PyTypeObject *type, PyObject *args, PyObject *kwds) /* prepare attr while checking args */ for (idx = 0; idx < nattrs; ++idx) { PyObject *item = PyTuple_GET_ITEM(args, idx); - Py_ssize_t item_len; - const void *data; - unsigned int kind; int dot_count; if (!PyUnicode_Check(item)) { @@ -1245,9 +1242,9 @@ attrgetter_new(PyTypeObject *type, PyObject *args, PyObject *kwds) Py_DECREF(attr); return NULL; } - item_len = PyUnicode_GET_LENGTH(item); - kind = PyUnicode_KIND(item); - data = PyUnicode_DATA(item); + Py_ssize_t item_len = PyUnicode_GET_LENGTH(item); + int kind = PyUnicode_KIND(item); + const void *data = PyUnicode_DATA(item); /* check whether the string is dotted */ dot_count = 0; diff --git a/Modules/_pickle.c b/Modules/_pickle.c index 851feadd27df82..0adfa4103cc0d0 100644 --- a/Modules/_pickle.c +++ b/Modules/_pickle.c @@ -2579,7 +2579,7 @@ raw_unicode_escape(PyObject *obj) char *p; Py_ssize_t i, size; const void *data; - unsigned int kind; + int kind; _PyBytesWriter writer; if (PyUnicode_READY(obj)) diff --git a/Modules/pyexpat.c b/Modules/pyexpat.c index ad8148adae98be..b8535dfe7115a1 100644 --- a/Modules/pyexpat.c +++ b/Modules/pyexpat.c @@ -1088,7 +1088,7 @@ PyUnknownEncodingHandler(void *encodingHandlerData, PyObject* u; int i; const void *data; - unsigned int kind; + int kind; if (PyErr_Occurred()) return XML_STATUS_ERROR; diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c index b429f7687f7f1e..1dfa1d57cf65a1 100644 --- a/Objects/bytesobject.c +++ b/Objects/bytesobject.c @@ -2396,7 +2396,7 @@ _PyBytes_FromHex(PyObject *string, int use_bytearray) if (!PyUnicode_IS_ASCII(string)) { const void *data = PyUnicode_DATA(string); - unsigned int kind = PyUnicode_KIND(string); + int kind = PyUnicode_KIND(string); Py_ssize_t i; /* search for the first non-ASCII character */ diff --git a/Objects/longobject.c b/Objects/longobject.c index 78360a58facc63..7f60866d2eb280 100644 --- a/Objects/longobject.c +++ b/Objects/longobject.c @@ -1714,7 +1714,7 @@ long_to_decimal_string_internal(PyObject *aa, digit *pout, *pin, rem, tenpow; int negative; int d; - enum PyUnicode_Kind kind; + int kind; a = (PyLongObject *)aa; if (a == NULL || !PyLong_Check(a)) { @@ -1904,7 +1904,7 @@ long_format_binary(PyObject *aa, int base, int alternate, PyObject *v = NULL; Py_ssize_t sz; Py_ssize_t size_a; - enum PyUnicode_Kind kind; + int kind; int negative; int bits; diff --git a/Objects/stringlib/localeutil.h b/Objects/stringlib/localeutil.h index bd16e0a172802f..d77715ec0de9ef 100644 --- a/Objects/stringlib/localeutil.h +++ b/Objects/stringlib/localeutil.h @@ -75,7 +75,7 @@ InsertThousandsGrouping_fill(_PyUnicodeWriter *writer, Py_ssize_t *buffer_pos, if (n_zeros) { *buffer_pos -= n_zeros; - enum PyUnicode_Kind kind = PyUnicode_KIND(writer->buffer); + int kind = PyUnicode_KIND(writer->buffer); void *data = PyUnicode_DATA(writer->buffer); unicode_fill(kind, data, '0', *buffer_pos, n_zeros); } diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index cc50fcd76791c2..ee3275793528cd 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -247,7 +247,7 @@ static inline PyObject* unicode_new_empty(void) } while (0) static inline void -unicode_fill(enum PyUnicode_Kind kind, void *data, Py_UCS4 value, +unicode_fill(int kind, void *data, Py_UCS4 value, Py_ssize_t start, Py_ssize_t length) { assert(0 <= start); @@ -483,7 +483,7 @@ _PyUnicode_CheckConsistency(PyObject *op, int check_content) CHECK(PyUnicode_Check(op)); PyASCIIObject *ascii = _PyASCIIObject_CAST(op); - unsigned int kind = ascii->state.kind; + int kind = ascii->state.kind; if (ascii->state.ascii == 1 && ascii->state.compact == 1) { CHECK(kind == PyUnicode_1BYTE_KIND); @@ -612,7 +612,7 @@ backslashreplace(_PyBytesWriter *writer, char *str, { Py_ssize_t size, i; Py_UCS4 ch; - enum PyUnicode_Kind kind; + int kind; const void *data; kind = PyUnicode_KIND(unicode); @@ -678,7 +678,7 @@ xmlcharrefreplace(_PyBytesWriter *writer, char *str, { Py_ssize_t size, i; Py_UCS4 ch; - enum PyUnicode_Kind kind; + int kind; const void *data; kind = PyUnicode_KIND(unicode); @@ -1128,7 +1128,7 @@ PyUnicode_New(Py_ssize_t size, Py_UCS4 maxchar) PyObject *obj; PyCompactUnicodeObject *unicode; void *data; - enum PyUnicode_Kind kind; + int kind; int is_ascii; Py_ssize_t char_size; Py_ssize_t struct_size; @@ -1268,7 +1268,7 @@ _copy_characters(PyObject *to, Py_ssize_t to_start, PyObject *from, Py_ssize_t from_start, Py_ssize_t how_many, int check_maxchar) { - unsigned int from_kind, to_kind; + int from_kind, to_kind; const void *from_data; void *to_data; @@ -1663,7 +1663,7 @@ static void unicode_write_cstr(PyObject *unicode, Py_ssize_t index, const char *str, Py_ssize_t len) { - enum PyUnicode_Kind kind = PyUnicode_KIND(unicode); + int kind = PyUnicode_KIND(unicode); const void *data = PyUnicode_DATA(unicode); const char *end = str + len; @@ -1950,7 +1950,7 @@ _PyUnicode_FromASCII(const char *buffer, Py_ssize_t size) } static Py_UCS4 -kind_maxchar_limit(unsigned int kind) +kind_maxchar_limit(int kind) { switch (kind) { case PyUnicode_1BYTE_KIND: @@ -2064,7 +2064,7 @@ PyUnicode_FromKindAndData(int kind, const void *buffer, Py_ssize_t size) Py_UCS4 _PyUnicode_FindMaxChar(PyObject *unicode, Py_ssize_t start, Py_ssize_t end) { - enum PyUnicode_Kind kind; + int kind; const void *startptr, *endptr; assert(0 <= start); @@ -2105,7 +2105,7 @@ unicode_adjust_maxchar(PyObject **p_unicode) PyObject *unicode, *copy; Py_UCS4 max_char; Py_ssize_t len; - unsigned int kind; + int kind; assert(p_unicode != NULL); unicode = *p_unicode; @@ -2170,7 +2170,7 @@ _PyUnicode_Copy(PyObject *unicode) character. Return NULL on error. */ static void* -unicode_askind(unsigned int skind, void const *data, Py_ssize_t len, unsigned int kind) +unicode_askind(int skind, void const *data, Py_ssize_t len, int kind) { void *result; @@ -4984,7 +4984,7 @@ unicode_encode_utf8(PyObject *unicode, _Py_error_handler error_handler, return PyBytes_FromStringAndSize(PyUnicode_UTF8(unicode), PyUnicode_UTF8_LENGTH(unicode)); - enum PyUnicode_Kind kind = PyUnicode_KIND(unicode); + int kind = PyUnicode_KIND(unicode); const void *data = PyUnicode_DATA(unicode); Py_ssize_t size = PyUnicode_GET_LENGTH(unicode); @@ -5020,7 +5020,7 @@ unicode_fill_utf8(PyObject *unicode) /* the string cannot be ASCII, or PyUnicode_UTF8() would be set */ assert(!PyUnicode_IS_ASCII(unicode)); - enum PyUnicode_Kind kind = PyUnicode_KIND(unicode); + int kind = PyUnicode_KIND(unicode); const void *data = PyUnicode_DATA(unicode); Py_ssize_t size = PyUnicode_GET_LENGTH(unicode); @@ -5155,7 +5155,7 @@ PyUnicode_DecodeUTF32Stateful(const char *s, Py_UCS4 maxch = PyUnicode_MAX_CHAR_VALUE(writer.buffer); if (e - q >= 4) { - enum PyUnicode_Kind kind = writer.kind; + int kind = writer.kind; void *data = writer.data; const unsigned char *last = e - 4; Py_ssize_t pos = writer.pos; @@ -5240,7 +5240,7 @@ _PyUnicode_EncodeUTF32(PyObject *str, const char *errors, int byteorder) { - enum PyUnicode_Kind kind; + int kind; const void *data; Py_ssize_t len; PyObject *v; @@ -5557,7 +5557,7 @@ _PyUnicode_EncodeUTF16(PyObject *str, const char *errors, int byteorder) { - enum PyUnicode_Kind kind; + int kind; const void *data; Py_ssize_t len; PyObject *v; @@ -6022,7 +6022,7 @@ PyUnicode_AsUnicodeEscapeString(PyObject *unicode) Py_ssize_t i, len; PyObject *repr; char *p; - enum PyUnicode_Kind kind; + int kind; const void *data; Py_ssize_t expandsize; @@ -7365,7 +7365,7 @@ encode_code_page_errors(UINT code_page, PyObject **outbytes, } else { Py_ssize_t i; - enum PyUnicode_Kind kind; + int kind; const void *data; outsize = PyUnicode_GET_LENGTH(rep); @@ -7504,7 +7504,7 @@ charmap_decode_string(const char *s, Py_ssize_t startinpos, endinpos; PyObject *errorHandler = NULL, *exc = NULL; Py_ssize_t maplen; - enum PyUnicode_Kind mapkind; + int mapkind; const void *mapdata; Py_UCS4 x; unsigned char ch; @@ -7542,7 +7542,7 @@ charmap_decode_string(const char *s, while (s < e) { if (mapkind == PyUnicode_2BYTE_KIND && maplen >= 256) { - enum PyUnicode_Kind outkind = writer->kind; + int outkind = writer->kind; const Py_UCS2 *mapdata_ucs2 = (const Py_UCS2 *)mapdata; if (outkind == PyUnicode_1BYTE_KIND) { Py_UCS1 *outdata = (Py_UCS1 *)writer->data; @@ -8061,7 +8061,7 @@ charmap_encoding_error( PyObject *repunicode = NULL; /* initialize to prevent gcc warning */ Py_ssize_t size, repsize; Py_ssize_t newpos; - enum PyUnicode_Kind kind; + int kind; const void *data; Py_ssize_t index; /* startpos for collecting unencodable chars */ @@ -9422,7 +9422,7 @@ _PyUnicode_JoinArray(PyObject *separator, PyObject *const *items, Py_ssize_t seq int use_memcpy; unsigned char *res_data = NULL, *sep_data = NULL; PyObject *last_obj; - unsigned int kind = 0; + int kind = 0; /* If empty sequence, return u"". */ if (seqlen == 0) { @@ -9581,7 +9581,7 @@ void _PyUnicode_FastFill(PyObject *unicode, Py_ssize_t start, Py_ssize_t length, Py_UCS4 fill_char) { - const enum PyUnicode_Kind kind = PyUnicode_KIND(unicode); + const int kind = PyUnicode_KIND(unicode); void *data = PyUnicode_DATA(unicode); assert(unicode_modifiable(unicode)); assert(fill_char <= PyUnicode_MAX_CHAR_VALUE(unicode)); @@ -11049,7 +11049,7 @@ static PyObject * unicode_getitem(PyObject *self, Py_ssize_t index) { const void *data; - enum PyUnicode_Kind kind; + int kind; Py_UCS4 ch; if (!PyUnicode_Check(self)) { @@ -12985,7 +12985,7 @@ _PyUnicodeWriter_PrepareInternal(_PyUnicodeWriter *writer, int _PyUnicodeWriter_PrepareKindInternal(_PyUnicodeWriter *writer, - enum PyUnicode_Kind kind) + int kind) { Py_UCS4 maxchar; @@ -13444,7 +13444,7 @@ struct unicode_formatter_t { Py_ssize_t arglen, argidx; PyObject *dict; - enum PyUnicode_Kind fmtkind; + int fmtkind; Py_ssize_t fmtcnt, fmtpos; const void *fmtdata; PyObject *fmtstr; @@ -14106,7 +14106,7 @@ unicode_format_arg_output(struct unicode_formatter_t *ctx, PyObject *str) { Py_ssize_t len; - enum PyUnicode_Kind kind; + int kind; const void *pbuf; Py_ssize_t pindex; Py_UCS4 signchar; @@ -14422,7 +14422,7 @@ unicode_subtype_new(PyTypeObject *type, PyObject *unicode) PyObject *self; Py_ssize_t length, char_size; int share_utf8; - unsigned int kind; + int kind; void *data; assert(PyType_IsSubtype(type, &PyUnicode_Type)); diff --git a/Python/formatter_unicode.c b/Python/formatter_unicode.c index 04d37c0be28cdd..38e5f69bfb4289 100644 --- a/Python/formatter_unicode.c +++ b/Python/formatter_unicode.c @@ -608,7 +608,7 @@ fill_number(_PyUnicodeWriter *writer, const NumberFieldWidths *spec, { /* Used to keep track of digits, decimal, and remainder. */ Py_ssize_t d_pos = d_start; - const unsigned int kind = writer->kind; + const int kind = writer->kind; const void *data = writer->data; Py_ssize_t r; @@ -1215,7 +1215,7 @@ format_complex_internal(PyObject *value, int flags = 0; int result = -1; Py_UCS4 maxchar = 127; - enum PyUnicode_Kind rkind; + int rkind; void *rdata; Py_UCS4 re_sign_char = '\0'; Py_UCS4 im_sign_char = '\0'; From webhook-mailer at python.org Fri May 13 06:52:58 2022 From: webhook-mailer at python.org (markshannon) Date: Fri, 13 May 2022 10:52:58 -0000 Subject: [Python-checkins] GH-92236: Remove spurious "line" event when starting coroutine or generator. (GH-92722) (GH-92772) Message-ID: https://github.com/python/cpython/commit/2e8b2d0ee2f8d0c53d2747d400b83c171732d3a9 commit: 2e8b2d0ee2f8d0c53d2747d400b83c171732d3a9 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: markshannon date: 2022-05-13T11:52:54+01:00 summary: GH-92236: Remove spurious "line" event when starting coroutine or generator. (GH-92722) (GH-92772) (cherry picked from commit 22a1db378c5c381272362c5b2f68ac78a368e136) files: A Misc/NEWS.d/next/Core and Builtins/2022-05-12-13-23-19.gh-issue-92236.sDRzUe.rst M Lib/test/test_sys_settrace.py M Modules/_testcapimodule.c M Python/ceval.c diff --git a/Lib/test/test_sys_settrace.py b/Lib/test/test_sys_settrace.py index b1c8f6f80af83..1a67fa673dd64 100644 --- a/Lib/test/test_sys_settrace.py +++ b/Lib/test/test_sys_settrace.py @@ -7,6 +7,7 @@ import gc from functools import wraps import asyncio +from test.support import import_helper support.requires_working_socket(module=True) @@ -1473,6 +1474,58 @@ def __init__(self): (3, 'return'), (1, 'return')]) + @support.cpython_only + def test_no_line_event_after_creating_generator(self): + # Spurious line events before call events only show up with C tracer + + # Skip this test if the _testcapi module isn't available. + _testcapi = import_helper.import_module('_testcapi') + + def gen(): + yield 1 + + def func(): + for _ in ( + gen() + ): + pass + + EXPECTED_EVENTS = [ + (0, 'call'), + (2, 'line'), + (1, 'line'), + (-3, 'call'), + (-2, 'line'), + (-2, 'return'), + (4, 'line'), + (1, 'line'), + (-2, 'call'), + (-2, 'return'), + (1, 'return'), + ] + + # C level events should be the same as expected and the same as Python level. + + events = [] + # Turning on and off tracing must be on same line to avoid unwanted LINE events. + _testcapi.settrace_to_record(events); func(); sys.settrace(None) + start_line = func.__code__.co_firstlineno + events = [ + (line-start_line, EVENT_NAMES[what]) + for (what, line, arg) in events + ] + self.assertEqual(events, EXPECTED_EVENTS) + + self.run_and_compare(func, EXPECTED_EVENTS) + + +EVENT_NAMES = [ + 'call', + 'exception', + 'line', + 'return' +] + class SkipLineEventsTraceTestCase(TraceTestCase): """Repeat the trace tests, but with per-line events skipped""" diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-12-13-23-19.gh-issue-92236.sDRzUe.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-12-13-23-19.gh-issue-92236.sDRzUe.rst new file mode 100644 index 0000000000000..fe482d505c67b --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-05-12-13-23-19.gh-issue-92236.sDRzUe.rst @@ -0,0 +1,2 @@ +Remove spurious "LINE" event when starting a generator or coroutine, visible +tracing functions implemented in C. diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index be9ed50e0dbeb..de1a8e6c20b6c 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -5955,6 +5955,51 @@ test_code_api(PyObject *self, PyObject *Py_UNUSED(args)) Py_RETURN_NONE; } +static int +record_func(PyObject *obj, PyFrameObject *f, int what, PyObject *arg) +{ + assert(PyList_Check(obj)); + PyObject *what_obj = NULL; + PyObject *line_obj = NULL; + PyObject *tuple = NULL; + int res = -1; + what_obj = PyLong_FromLong(what); + if (what_obj == NULL) { + goto error; + } + int line = PyFrame_GetLineNumber(f); + line_obj = PyLong_FromLong(line); + if (line_obj == NULL) { + goto error; + } + tuple = PyTuple_Pack(3, what_obj, line_obj, arg); + if (tuple == NULL) { + goto error; + } + PyTuple_SET_ITEM(tuple, 0, what_obj); + if (PyList_Append(obj, tuple)) { + goto error; + } + res = 0; +error: + Py_XDECREF(what_obj); + Py_XDECREF(line_obj); + Py_XDECREF(tuple); + return res; +} + +static PyObject * +settrace_to_record(PyObject *self, PyObject *list) +{ + + if (!PyList_Check(list)) { + PyErr_SetString(PyExc_TypeError, "argument must be a list"); + return NULL; + } + PyEval_SetTrace(record_func, list); + Py_RETURN_NONE; +} + static PyObject *negative_dictoffset(PyObject *, PyObject *); static PyObject *test_buildvalue_issue38913(PyObject *, PyObject *); static PyObject *getargs_s_hash_int(PyObject *, PyObject *, PyObject*); @@ -6251,6 +6296,7 @@ static PyMethodDef TestMethods[] = { {"frame_getlasti", frame_getlasti, METH_O, NULL}, {"get_feature_macros", get_feature_macros, METH_NOARGS, NULL}, {"test_code_api", test_code_api, METH_NOARGS, NULL}, + {"settrace_to_record", settrace_to_record, METH_O, NULL}, {NULL, NULL} /* sentinel */ }; diff --git a/Python/ceval.c b/Python/ceval.c index f6b07b4b28eb6..c73218fcf307e 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -5680,6 +5680,12 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int TRACE_FUNCTION_ENTRY(); DTRACE_FUNCTION_ENTRY(); break; + case POP_TOP: + if (_Py_OPCODE(next_instr[-1]) == RETURN_GENERATOR) { + /* Frame not fully initialized */ + break; + } + /* fall through */ default: /* line-by-line tracing support */ if (PyDTrace_LINE_ENABLED()) { From webhook-mailer at python.org Fri May 13 07:40:34 2022 From: webhook-mailer at python.org (vstinner) Date: Fri, 13 May 2022 11:40:34 -0000 Subject: [Python-checkins] gh-85858: Remove PyUnicode_InternImmortal() function (#92579) Message-ID: https://github.com/python/cpython/commit/059b5baf98c9503d9d59c79fba117826caa5a3e1 commit: 059b5baf98c9503d9d59c79fba117826caa5a3e1 branch: main author: Victor Stinner committer: vstinner date: 2022-05-13T13:40:22+02:00 summary: gh-85858: Remove PyUnicode_InternImmortal() function (#92579) Remove the PyUnicode_InternImmortal() function and the SSTATE_INTERNED_IMMORTAL macro. The PyUnicode_InternImmortal() function is still exported in the stable ABI. The function is removed from the API. PyASCIIObject.state.interned size is now a single bit, rather than 2 bits. Keep SSTATE_NOT_INTERNED and SSTATE_INTERNED_MORTAL macros for backward compatibility, but no longer use them internally since the interned member is now a single bit and so can only have two values (interned or not interned). Update stats of _PyUnicode_ClearInterned(). files: A Misc/NEWS.d/next/C API/2022-05-09-23-16-38.gh-issue-85858.VIcNDL.rst M Doc/data/stable_abi.dat M Doc/whatsnew/3.12.rst M Include/cpython/unicodeobject.h M Include/unicodeobject.h M Misc/stable_abi.toml M Objects/unicodeobject.c diff --git a/Doc/data/stable_abi.dat b/Doc/data/stable_abi.dat index 3486f33c02539..3912a7c1242de 100644 --- a/Doc/data/stable_abi.dat +++ b/Doc/data/stable_abi.dat @@ -762,7 +762,6 @@ function,PyUnicode_FromWideChar,3.2,, function,PyUnicode_GetDefaultEncoding,3.2,, function,PyUnicode_GetLength,3.7,, function,PyUnicode_InternFromString,3.2,, -function,PyUnicode_InternImmortal,3.2,, function,PyUnicode_InternInPlace,3.2,, function,PyUnicode_IsIdentifier,3.2,, function,PyUnicode_Join,3.2,, diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst index d5017c0350e16..70b26ba48cf62 100644 --- a/Doc/whatsnew/3.12.rst +++ b/Doc/whatsnew/3.12.rst @@ -174,3 +174,7 @@ Removed * :c:func:`PyUnicode_GET_SIZE` * :c:func:`PyUnicode_GetSize` * :c:func:`PyUnicode_GET_DATA_SIZE` + +* Remove the ``PyUnicode_InternImmortal()`` function and the + ``SSTATE_INTERNED_IMMORTAL`` macro. + (Contributed by Victor Stinner in :gh:`85858`.) diff --git a/Include/cpython/unicodeobject.h b/Include/cpython/unicodeobject.h index 16db2cb7bffb9..37bb13cbe5397 100644 --- a/Include/cpython/unicodeobject.h +++ b/Include/cpython/unicodeobject.h @@ -98,15 +98,9 @@ typedef struct { Py_ssize_t length; /* Number of code points in the string */ Py_hash_t hash; /* Hash value; -1 if not set */ struct { - /* - SSTATE_NOT_INTERNED (0) - SSTATE_INTERNED_MORTAL (1) - SSTATE_INTERNED_IMMORTAL (2) - - If interned != SSTATE_NOT_INTERNED, the two references from the - dictionary to this object are *not* counted in ob_refcnt. - */ - unsigned int interned:2; + /* If interned is set, the two references from the + dictionary to this object are *not* counted in ob_refcnt. */ + unsigned int interned:1; /* Character size: - PyUnicode_1BYTE_KIND (1): @@ -189,7 +183,6 @@ PyAPI_FUNC(int) _PyUnicode_CheckConsistency( /* Interning state. */ #define SSTATE_NOT_INTERNED 0 #define SSTATE_INTERNED_MORTAL 1 -#define SSTATE_INTERNED_IMMORTAL 2 /* Use only if you know it's a string */ static inline unsigned int PyUnicode_CHECK_INTERNED(PyObject *op) { diff --git a/Include/unicodeobject.h b/Include/unicodeobject.h index f71f37978a1ba..ed3e8d2c6cc99 100644 --- a/Include/unicodeobject.h +++ b/Include/unicodeobject.h @@ -256,10 +256,6 @@ PyAPI_FUNC(PyObject *) PyUnicode_InternFromString( const char *u /* UTF-8 encoded string */ ); -// PyUnicode_InternImmortal() is deprecated since Python 3.10 -// and will be removed in Python 3.12. Use PyUnicode_InternInPlace() instead. -Py_DEPRECATED(3.10) PyAPI_FUNC(void) PyUnicode_InternImmortal(PyObject **); - /* --- wchar_t support for platforms which support it --------------------- */ #ifdef HAVE_WCHAR_H diff --git a/Misc/NEWS.d/next/C API/2022-05-09-23-16-38.gh-issue-85858.VIcNDL.rst b/Misc/NEWS.d/next/C API/2022-05-09-23-16-38.gh-issue-85858.VIcNDL.rst new file mode 100644 index 0000000000000..c175d1efee388 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2022-05-09-23-16-38.gh-issue-85858.VIcNDL.rst @@ -0,0 +1,2 @@ +Remove the ``PyUnicode_InternImmortal()`` function and the +``SSTATE_INTERNED_IMMORTAL`` macro. Patch by Victor Stinner. diff --git a/Misc/stable_abi.toml b/Misc/stable_abi.toml index 07cce369fe80a..d848f18d68ff6 100644 --- a/Misc/stable_abi.toml +++ b/Misc/stable_abi.toml @@ -1563,6 +1563,7 @@ added = '3.2' [function.PyUnicode_InternImmortal] added = '3.2' + abi_only = true [function.PyUnicode_InternInPlace] added = '3.2' [data.PyUnicode_Type] diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index ee3275793528c..e935829072483 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -1516,13 +1516,8 @@ unicode_dealloc(PyObject *unicode) } #endif - switch (PyUnicode_CHECK_INTERNED(unicode)) { - case SSTATE_NOT_INTERNED: - break; - - case SSTATE_INTERNED_MORTAL: - { #ifdef INTERNED_STRINGS + if (PyUnicode_CHECK_INTERNED(unicode)) { /* Revive the dead object temporarily. PyDict_DelItem() removes two references (key and value) which were ignored by PyUnicode_InternInPlace(). Use refcnt=3 rather than refcnt=2 @@ -1536,17 +1531,8 @@ unicode_dealloc(PyObject *unicode) } assert(Py_REFCNT(unicode) == 1); Py_SET_REFCNT(unicode, 0); -#endif - break; - } - - case SSTATE_INTERNED_IMMORTAL: - _PyObject_ASSERT_FAILED_MSG(unicode, "Immortal interned string died"); - break; - - default: - Py_UNREACHABLE(); } +#endif if (_PyUnicode_HAS_UTF8_MEMORY(unicode)) { PyObject_Free(_PyUnicode_UTF8(unicode)); @@ -14674,7 +14660,7 @@ PyUnicode_InternInPlace(PyObject **p) refcnt. unicode_dealloc() and _PyUnicode_ClearInterned() take care of this. */ Py_SET_REFCNT(s, Py_REFCNT(s) - 2); - _PyUnicode_STATE(s).interned = SSTATE_INTERNED_MORTAL; + _PyUnicode_STATE(s).interned = 1; #else // PyDict expects that interned strings have their hash // (PyASCIIObject.hash) already computed. @@ -14682,23 +14668,14 @@ PyUnicode_InternInPlace(PyObject **p) #endif } +// Function kept for the stable ABI. +PyAPI_FUNC(void) PyUnicode_InternImmortal(PyObject **); void PyUnicode_InternImmortal(PyObject **p) { - if (PyErr_WarnEx(PyExc_DeprecationWarning, - "PyUnicode_InternImmortal() is deprecated; " - "use PyUnicode_InternInPlace() instead", 1) < 0) - { - // The function has no return value, the exception cannot - // be reported to the caller, so just log it. - PyErr_WriteUnraisable(NULL); - } - PyUnicode_InternInPlace(p); - if (PyUnicode_CHECK_INTERNED(*p) != SSTATE_INTERNED_IMMORTAL) { - _PyUnicode_STATE(*p).interned = SSTATE_INTERNED_IMMORTAL; - Py_INCREF(*p); - } + // Leak a reference on purpose + Py_INCREF(*p); } PyObject * @@ -14733,37 +14710,25 @@ _PyUnicode_ClearInterned(PyInterpreterState *interp) fprintf(stderr, "releasing %zd interned strings\n", PyDict_GET_SIZE(interned)); - Py_ssize_t immortal_size = 0, mortal_size = 0; + Py_ssize_t total_length = 0; #endif Py_ssize_t pos = 0; PyObject *s, *ignored_value; while (PyDict_Next(interned, &pos, &s, &ignored_value)) { - switch (PyUnicode_CHECK_INTERNED(s)) { - case SSTATE_INTERNED_IMMORTAL: - Py_SET_REFCNT(s, Py_REFCNT(s) + 1); -#ifdef INTERNED_STATS - immortal_size += PyUnicode_GET_LENGTH(s); -#endif - break; - case SSTATE_INTERNED_MORTAL: - // Restore the two references (key and value) ignored - // by PyUnicode_InternInPlace(). - Py_SET_REFCNT(s, Py_REFCNT(s) + 2); + assert(PyUnicode_CHECK_INTERNED(s)); + // Restore the two references (key and value) ignored + // by PyUnicode_InternInPlace(). + Py_SET_REFCNT(s, Py_REFCNT(s) + 2); #ifdef INTERNED_STATS - mortal_size += PyUnicode_GET_LENGTH(s); + total_length += PyUnicode_GET_LENGTH(s); #endif - break; - case SSTATE_NOT_INTERNED: - /* fall through */ - default: - Py_UNREACHABLE(); - } - _PyUnicode_STATE(s).interned = SSTATE_NOT_INTERNED; + + _PyUnicode_STATE(s).interned = 0; } #ifdef INTERNED_STATS fprintf(stderr, - "total size of all interned strings: %zd/%zd mortal/immortal\n", - mortal_size, immortal_size); + "total length of all interned strings: %zd characters\n", + total_length); #endif PyDict_Clear(interned); From webhook-mailer at python.org Fri May 13 08:10:51 2022 From: webhook-mailer at python.org (JulienPalard) Date: Fri, 13 May 2022 12:10:51 -0000 Subject: [Python-checkins] Document Py_ssize_t. (GH-92512) Message-ID: https://github.com/python/cpython/commit/664aa94b570a4a8f3535efb2e3d638a4ab655943 commit: 664aa94b570a4a8f3535efb2e3d638a4ab655943 branch: main author: Julien Palard committer: JulienPalard date: 2022-05-13T14:10:16+02:00 summary: Document Py_ssize_t. (GH-92512) It fixes 252 errors from a Sphinx nitpicky run (sphinx-build -n). But there's 8182 errors left. Co-authored-by: Ezio Melotti files: M Doc/c-api/arg.rst M Doc/c-api/bytes.rst M Doc/c-api/intro.rst M Doc/c-api/number.rst M Doc/c-api/object.rst M Doc/c-api/sys.rst M Doc/c-api/typeobj.rst M Doc/c-api/unicode.rst M Doc/howto/clinic.rst M Doc/whatsnew/3.8.rst diff --git a/Doc/c-api/arg.rst b/Doc/c-api/arg.rst index d9cabf90f8e29..2e63e4d4563d4 100644 --- a/Doc/c-api/arg.rst +++ b/Doc/c-api/arg.rst @@ -249,7 +249,7 @@ Numbers Convert a Python integer to a C :c:type:`unsigned long long` without overflow checking. -``n`` (:class:`int`) [Py_ssize_t] +``n`` (:class:`int`) [:c:type:`Py_ssize_t`] Convert a Python integer to a C :c:type:`Py_ssize_t`. ``c`` (:class:`bytes` or :class:`bytearray` of length 1) [char] @@ -576,7 +576,7 @@ Building values ``K`` (:class:`int`) [unsigned long long] Convert a C :c:type:`unsigned long long` to a Python integer object. - ``n`` (:class:`int`) [Py_ssize_t] + ``n`` (:class:`int`) [:c:type:`Py_ssize_t`] Convert a C :c:type:`Py_ssize_t` to a Python integer. ``c`` (:class:`bytes` of length 1) [char] diff --git a/Doc/c-api/bytes.rst b/Doc/c-api/bytes.rst index d47f0422e6100..7617487a462d3 100644 --- a/Doc/c-api/bytes.rst +++ b/Doc/c-api/bytes.rst @@ -84,8 +84,8 @@ called with a non-bytes parameter. | :attr:`%lu` | unsigned long | Equivalent to | | | | ``printf("%lu")``. [1]_ | +-------------------+---------------+--------------------------------+ - | :attr:`%zd` | Py_ssize_t | Equivalent to | - | | | ``printf("%zd")``. [1]_ | + | :attr:`%zd` | :c:type:`\ | Equivalent to | + | | Py_ssize_t` | ``printf("%zd")``. [1]_ | +-------------------+---------------+--------------------------------+ | :attr:`%zu` | size_t | Equivalent to | | | | ``printf("%zu")``. [1]_ | diff --git a/Doc/c-api/intro.rst b/Doc/c-api/intro.rst index 9efac0b83d024..e53c826c58d13 100644 --- a/Doc/c-api/intro.rst +++ b/Doc/c-api/intro.rst @@ -537,6 +537,13 @@ data attributes of a new object type, and another is used to describe the value of a complex number. These will be discussed together with the functions that use them. +.. c:type:: Py_ssize_t + + A signed integral type such that ``sizeof(Py_ssize_t) == sizeof(size_t)``. + C99 doesn't define such a thing directly (size_t is an unsigned integral type). + See :pep:`353` for details. ``PY_SSIZE_T_MAX`` is the largest positive value + of type :c:type:`Py_ssize_t`. + .. _api-exceptions: diff --git a/Doc/c-api/number.rst b/Doc/c-api/number.rst index 11c9c67d36a67..70b91f8c2d0ca 100644 --- a/Doc/c-api/number.rst +++ b/Doc/c-api/number.rst @@ -273,11 +273,11 @@ Number Protocol .. c:function:: Py_ssize_t PyNumber_AsSsize_t(PyObject *o, PyObject *exc) - Returns *o* converted to a Py_ssize_t value if *o* can be interpreted as an + Returns *o* converted to a :c:type:`Py_ssize_t` value if *o* can be interpreted as an integer. If the call fails, an exception is raised and ``-1`` is returned. If *o* can be converted to a Python int but the attempt to - convert to a Py_ssize_t value would raise an :exc:`OverflowError`, then the + convert to a :c:type:`Py_ssize_t` value would raise an :exc:`OverflowError`, then the *exc* argument is the type of exception that will be raised (usually :exc:`IndexError` or :exc:`OverflowError`). If *exc* is ``NULL``, then the exception is cleared and the value is clipped to ``PY_SSIZE_T_MIN`` for a negative diff --git a/Doc/c-api/object.rst b/Doc/c-api/object.rst index 9dcfd769c64a0..07a625bac02fc 100644 --- a/Doc/c-api/object.rst +++ b/Doc/c-api/object.rst @@ -258,7 +258,7 @@ Object Protocol .. versionchanged:: 3.2 The return type is now Py_hash_t. This is a signed integer the same size - as Py_ssize_t. + as :c:type:`Py_ssize_t`. .. c:function:: Py_hash_t PyObject_HashNotImplemented(PyObject *o) diff --git a/Doc/c-api/sys.rst b/Doc/c-api/sys.rst index 5e8d993100f63..7b714678444be 100644 --- a/Doc/c-api/sys.rst +++ b/Doc/c-api/sys.rst @@ -348,7 +348,7 @@ accessible to C code. They all work with the current interpreter thread's leaks.) Note that ``#`` format characters should always be treated as - ``Py_ssize_t``, regardless of whether ``PY_SSIZE_T_CLEAN`` was defined. + :c:type:`Py_ssize_t`, regardless of whether ``PY_SSIZE_T_CLEAN`` was defined. :func:`sys.audit` performs the same function from Python code. @@ -356,7 +356,7 @@ accessible to C code. They all work with the current interpreter thread's .. versionchanged:: 3.8.2 - Require ``Py_ssize_t`` for ``#`` format characters. Previously, an + Require :c:type:`Py_ssize_t` for ``#`` format characters. Previously, an unavoidable deprecation warning was raised. diff --git a/Doc/c-api/typeobj.rst b/Doc/c-api/typeobj.rst index ed434d8fd44fb..b3f371bb9c062 100644 --- a/Doc/c-api/typeobj.rst +++ b/Doc/c-api/typeobj.rst @@ -43,13 +43,13 @@ Quick Reference +================================================+===================================+===================+===+===+===+===+ | :c:member:`~PyTypeObject.tp_name` | const char * | __name__ | X | X | | | +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ - | :c:member:`~PyTypeObject.tp_basicsize` | Py_ssize_t | | X | X | | X | + | :c:member:`~PyTypeObject.tp_basicsize` | :c:type:`Py_ssize_t` | | X | X | | X | +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ - | :c:member:`~PyTypeObject.tp_itemsize` | Py_ssize_t | | | X | | X | + | :c:member:`~PyTypeObject.tp_itemsize` | :c:type:`Py_ssize_t` | | | X | | X | +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ | :c:member:`~PyTypeObject.tp_dealloc` | :c:type:`destructor` | | X | X | | X | +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ - | :c:member:`~PyTypeObject.tp_vectorcall_offset` | Py_ssize_t | | | X | | X | + | :c:member:`~PyTypeObject.tp_vectorcall_offset` | :c:type:`Py_ssize_t` | | | X | | X | +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ | (:c:member:`~PyTypeObject.tp_getattr`) | :c:type:`getattrfunc` | __getattribute__, | | | | G | | | | __getattr__ | | | | | @@ -96,7 +96,7 @@ Quick Reference | | | __gt__, | | | | | | | | __ge__ | | | | | +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ - | :c:member:`~PyTypeObject.tp_weaklistoffset` | Py_ssize_t | | | X | | ? | + | :c:member:`~PyTypeObject.tp_weaklistoffset` | :c:type:`Py_ssize_t` | | | X | | ? | +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ | :c:member:`~PyTypeObject.tp_iter` | :c:type:`getiterfunc` | __iter__ | | | | X | +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ @@ -117,7 +117,7 @@ Quick Reference | :c:member:`~PyTypeObject.tp_descr_set` | :c:type:`descrsetfunc` | __set__, | | | | X | | | | __delete__ | | | | | +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ - | :c:member:`~PyTypeObject.tp_dictoffset` | Py_ssize_t | | | X | | ? | + | :c:member:`~PyTypeObject.tp_dictoffset` | :c:type:`Py_ssize_t` | | | X | | ? | +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ | :c:member:`~PyTypeObject.tp_init` | :c:type:`initproc` | __init__ | X | X | | X | +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ @@ -333,7 +333,7 @@ slot typedefs | :c:type:`allocfunc` | .. line-block:: | :c:type:`PyObject` * | | | | | | | :c:type:`PyTypeObject` * | | -| | Py_ssize_t | | +| | :c:type:`Py_ssize_t` | | +-----------------------------+-----------------------------+----------------------+ | :c:type:`destructor` | void * | void | +-----------------------------+-----------------------------+----------------------+ @@ -405,7 +405,7 @@ slot typedefs +-----------------------------+-----------------------------+----------------------+ | :c:type:`iternextfunc` | :c:type:`PyObject` * | :c:type:`PyObject` * | +-----------------------------+-----------------------------+----------------------+ -| :c:type:`lenfunc` | :c:type:`PyObject` * | Py_ssize_t | +| :c:type:`lenfunc` | :c:type:`PyObject` * | :c:type:`Py_ssize_t` | +-----------------------------+-----------------------------+----------------------+ | :c:type:`getbufferproc` | .. line-block:: | int | | | | | @@ -438,12 +438,12 @@ slot typedefs | :c:type:`ssizeargfunc` | .. line-block:: | :c:type:`PyObject` * | | | | | | | :c:type:`PyObject` * | | -| | Py_ssize_t | | +| | :c:type:`Py_ssize_t` | | +-----------------------------+-----------------------------+----------------------+ | :c:type:`ssizeobjargproc` | .. line-block:: | int | | | | | | | :c:type:`PyObject` * | | -| | Py_ssize_t | | +| | :c:type:`Py_ssize_t` | | +-----------------------------+-----------------------------+----------------------+ | :c:type:`objobjproc` | .. line-block:: | int | | | | | diff --git a/Doc/c-api/unicode.rst b/Doc/c-api/unicode.rst index 6acd7ba790842..9dccbf1dc2298 100644 --- a/Doc/c-api/unicode.rst +++ b/Doc/c-api/unicode.rst @@ -436,11 +436,11 @@ APIs: | :attr:`%llu` | unsigned long long | Equivalent to | | | | ``printf("%llu")``. [1]_ | +-------------------+---------------------+----------------------------------+ - | :attr:`%zd` | Py_ssize_t | Equivalent to | - | | | ``printf("%zd")``. [1]_ | + | :attr:`%zd` | :c:type:`\ | Equivalent to | + | | Py_ssize_t` | ``printf("%zd")``. [1]_ | +-------------------+---------------------+----------------------------------+ - | :attr:`%zi` | Py_ssize_t | Equivalent to | - | | | ``printf("%zi")``. [1]_ | + | :attr:`%zi` | :c:type:`\ | Equivalent to | + | | Py_ssize_t` | ``printf("%zi")``. [1]_ | +-------------------+---------------------+----------------------------------+ | :attr:`%zu` | size_t | Equivalent to | | | | ``printf("%zu")``. [1]_ | diff --git a/Doc/howto/clinic.rst b/Doc/howto/clinic.rst index 989527b651375..7959bc3a5c5b3 100644 --- a/Doc/howto/clinic.rst +++ b/Doc/howto/clinic.rst @@ -1347,7 +1347,7 @@ Here's the simplest example of a custom converter, from ``Modules/zlibmodule.c`` /*[python end generated code: output=da39a3ee5e6b4b0d input=35521e4e733823c7]*/ This block adds a converter to Argument Clinic named ``ssize_t``. Parameters -declared as ``ssize_t`` will be declared as type ``Py_ssize_t``, and will +declared as ``ssize_t`` will be declared as type :c:type:`Py_ssize_t`, and will be parsed by the ``'O&'`` format unit, which will call the ``ssize_t_converter`` converter function. ``ssize_t`` variables automatically support default values. diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index 6b88cf6606919..c2f78f1531317 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -1493,7 +1493,7 @@ Optimizations first introduced in Python 3.4. It offers better performance and smaller size compared to Protocol 3 available since Python 3.0. -* Removed one ``Py_ssize_t`` member from ``PyGC_Head``. All GC tracked +* Removed one :c:type:`Py_ssize_t` member from ``PyGC_Head``. All GC tracked objects (e.g. tuple, list, dict) size is reduced 4 or 8 bytes. (Contributed by Inada Naoki in :issue:`33597`.) From webhook-mailer at python.org Fri May 13 09:32:10 2022 From: webhook-mailer at python.org (miss-islington) Date: Fri, 13 May 2022 13:32:10 -0000 Subject: [Python-checkins] Document Py_ssize_t. (GH-92512) Message-ID: https://github.com/python/cpython/commit/0c1795bd331db768cc2740c8e1aa6466f36ef732 commit: 0c1795bd331db768cc2740c8e1aa6466f36ef732 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-13T06:32:05-07:00 summary: Document Py_ssize_t. (GH-92512) It fixes 252 errors from a Sphinx nitpicky run (sphinx-build -n). But there's 8182 errors left. Co-authored-by: Ezio Melotti (cherry picked from commit 664aa94b570a4a8f3535efb2e3d638a4ab655943) Co-authored-by: Julien Palard files: M Doc/c-api/arg.rst M Doc/c-api/bytes.rst M Doc/c-api/intro.rst M Doc/c-api/number.rst M Doc/c-api/object.rst M Doc/c-api/sys.rst M Doc/c-api/typeobj.rst M Doc/c-api/unicode.rst M Doc/howto/clinic.rst M Doc/whatsnew/3.8.rst diff --git a/Doc/c-api/arg.rst b/Doc/c-api/arg.rst index 1d93b35dc1c88..926e5249347f8 100644 --- a/Doc/c-api/arg.rst +++ b/Doc/c-api/arg.rst @@ -286,7 +286,7 @@ Numbers Convert a Python integer to a C :c:type:`unsigned long long` without overflow checking. -``n`` (:class:`int`) [Py_ssize_t] +``n`` (:class:`int`) [:c:type:`Py_ssize_t`] Convert a Python integer to a C :c:type:`Py_ssize_t`. ``c`` (:class:`bytes` or :class:`bytearray` of length 1) [char] @@ -613,7 +613,7 @@ Building values ``K`` (:class:`int`) [unsigned long long] Convert a C :c:type:`unsigned long long` to a Python integer object. - ``n`` (:class:`int`) [Py_ssize_t] + ``n`` (:class:`int`) [:c:type:`Py_ssize_t`] Convert a C :c:type:`Py_ssize_t` to a Python integer. ``c`` (:class:`bytes` of length 1) [char] diff --git a/Doc/c-api/bytes.rst b/Doc/c-api/bytes.rst index d47f0422e6100..7617487a462d3 100644 --- a/Doc/c-api/bytes.rst +++ b/Doc/c-api/bytes.rst @@ -84,8 +84,8 @@ called with a non-bytes parameter. | :attr:`%lu` | unsigned long | Equivalent to | | | | ``printf("%lu")``. [1]_ | +-------------------+---------------+--------------------------------+ - | :attr:`%zd` | Py_ssize_t | Equivalent to | - | | | ``printf("%zd")``. [1]_ | + | :attr:`%zd` | :c:type:`\ | Equivalent to | + | | Py_ssize_t` | ``printf("%zd")``. [1]_ | +-------------------+---------------+--------------------------------+ | :attr:`%zu` | size_t | Equivalent to | | | | ``printf("%zu")``. [1]_ | diff --git a/Doc/c-api/intro.rst b/Doc/c-api/intro.rst index 9efac0b83d024..e53c826c58d13 100644 --- a/Doc/c-api/intro.rst +++ b/Doc/c-api/intro.rst @@ -537,6 +537,13 @@ data attributes of a new object type, and another is used to describe the value of a complex number. These will be discussed together with the functions that use them. +.. c:type:: Py_ssize_t + + A signed integral type such that ``sizeof(Py_ssize_t) == sizeof(size_t)``. + C99 doesn't define such a thing directly (size_t is an unsigned integral type). + See :pep:`353` for details. ``PY_SSIZE_T_MAX`` is the largest positive value + of type :c:type:`Py_ssize_t`. + .. _api-exceptions: diff --git a/Doc/c-api/number.rst b/Doc/c-api/number.rst index 11c9c67d36a67..70b91f8c2d0ca 100644 --- a/Doc/c-api/number.rst +++ b/Doc/c-api/number.rst @@ -273,11 +273,11 @@ Number Protocol .. c:function:: Py_ssize_t PyNumber_AsSsize_t(PyObject *o, PyObject *exc) - Returns *o* converted to a Py_ssize_t value if *o* can be interpreted as an + Returns *o* converted to a :c:type:`Py_ssize_t` value if *o* can be interpreted as an integer. If the call fails, an exception is raised and ``-1`` is returned. If *o* can be converted to a Python int but the attempt to - convert to a Py_ssize_t value would raise an :exc:`OverflowError`, then the + convert to a :c:type:`Py_ssize_t` value would raise an :exc:`OverflowError`, then the *exc* argument is the type of exception that will be raised (usually :exc:`IndexError` or :exc:`OverflowError`). If *exc* is ``NULL``, then the exception is cleared and the value is clipped to ``PY_SSIZE_T_MIN`` for a negative diff --git a/Doc/c-api/object.rst b/Doc/c-api/object.rst index 9dcfd769c64a0..07a625bac02fc 100644 --- a/Doc/c-api/object.rst +++ b/Doc/c-api/object.rst @@ -258,7 +258,7 @@ Object Protocol .. versionchanged:: 3.2 The return type is now Py_hash_t. This is a signed integer the same size - as Py_ssize_t. + as :c:type:`Py_ssize_t`. .. c:function:: Py_hash_t PyObject_HashNotImplemented(PyObject *o) diff --git a/Doc/c-api/sys.rst b/Doc/c-api/sys.rst index 5e8d993100f63..7b714678444be 100644 --- a/Doc/c-api/sys.rst +++ b/Doc/c-api/sys.rst @@ -348,7 +348,7 @@ accessible to C code. They all work with the current interpreter thread's leaks.) Note that ``#`` format characters should always be treated as - ``Py_ssize_t``, regardless of whether ``PY_SSIZE_T_CLEAN`` was defined. + :c:type:`Py_ssize_t`, regardless of whether ``PY_SSIZE_T_CLEAN`` was defined. :func:`sys.audit` performs the same function from Python code. @@ -356,7 +356,7 @@ accessible to C code. They all work with the current interpreter thread's .. versionchanged:: 3.8.2 - Require ``Py_ssize_t`` for ``#`` format characters. Previously, an + Require :c:type:`Py_ssize_t` for ``#`` format characters. Previously, an unavoidable deprecation warning was raised. diff --git a/Doc/c-api/typeobj.rst b/Doc/c-api/typeobj.rst index ed434d8fd44fb..b3f371bb9c062 100644 --- a/Doc/c-api/typeobj.rst +++ b/Doc/c-api/typeobj.rst @@ -43,13 +43,13 @@ Quick Reference +================================================+===================================+===================+===+===+===+===+ | :c:member:`~PyTypeObject.tp_name` | const char * | __name__ | X | X | | | +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ - | :c:member:`~PyTypeObject.tp_basicsize` | Py_ssize_t | | X | X | | X | + | :c:member:`~PyTypeObject.tp_basicsize` | :c:type:`Py_ssize_t` | | X | X | | X | +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ - | :c:member:`~PyTypeObject.tp_itemsize` | Py_ssize_t | | | X | | X | + | :c:member:`~PyTypeObject.tp_itemsize` | :c:type:`Py_ssize_t` | | | X | | X | +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ | :c:member:`~PyTypeObject.tp_dealloc` | :c:type:`destructor` | | X | X | | X | +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ - | :c:member:`~PyTypeObject.tp_vectorcall_offset` | Py_ssize_t | | | X | | X | + | :c:member:`~PyTypeObject.tp_vectorcall_offset` | :c:type:`Py_ssize_t` | | | X | | X | +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ | (:c:member:`~PyTypeObject.tp_getattr`) | :c:type:`getattrfunc` | __getattribute__, | | | | G | | | | __getattr__ | | | | | @@ -96,7 +96,7 @@ Quick Reference | | | __gt__, | | | | | | | | __ge__ | | | | | +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ - | :c:member:`~PyTypeObject.tp_weaklistoffset` | Py_ssize_t | | | X | | ? | + | :c:member:`~PyTypeObject.tp_weaklistoffset` | :c:type:`Py_ssize_t` | | | X | | ? | +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ | :c:member:`~PyTypeObject.tp_iter` | :c:type:`getiterfunc` | __iter__ | | | | X | +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ @@ -117,7 +117,7 @@ Quick Reference | :c:member:`~PyTypeObject.tp_descr_set` | :c:type:`descrsetfunc` | __set__, | | | | X | | | | __delete__ | | | | | +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ - | :c:member:`~PyTypeObject.tp_dictoffset` | Py_ssize_t | | | X | | ? | + | :c:member:`~PyTypeObject.tp_dictoffset` | :c:type:`Py_ssize_t` | | | X | | ? | +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ | :c:member:`~PyTypeObject.tp_init` | :c:type:`initproc` | __init__ | X | X | | X | +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ @@ -333,7 +333,7 @@ slot typedefs | :c:type:`allocfunc` | .. line-block:: | :c:type:`PyObject` * | | | | | | | :c:type:`PyTypeObject` * | | -| | Py_ssize_t | | +| | :c:type:`Py_ssize_t` | | +-----------------------------+-----------------------------+----------------------+ | :c:type:`destructor` | void * | void | +-----------------------------+-----------------------------+----------------------+ @@ -405,7 +405,7 @@ slot typedefs +-----------------------------+-----------------------------+----------------------+ | :c:type:`iternextfunc` | :c:type:`PyObject` * | :c:type:`PyObject` * | +-----------------------------+-----------------------------+----------------------+ -| :c:type:`lenfunc` | :c:type:`PyObject` * | Py_ssize_t | +| :c:type:`lenfunc` | :c:type:`PyObject` * | :c:type:`Py_ssize_t` | +-----------------------------+-----------------------------+----------------------+ | :c:type:`getbufferproc` | .. line-block:: | int | | | | | @@ -438,12 +438,12 @@ slot typedefs | :c:type:`ssizeargfunc` | .. line-block:: | :c:type:`PyObject` * | | | | | | | :c:type:`PyObject` * | | -| | Py_ssize_t | | +| | :c:type:`Py_ssize_t` | | +-----------------------------+-----------------------------+----------------------+ | :c:type:`ssizeobjargproc` | .. line-block:: | int | | | | | | | :c:type:`PyObject` * | | -| | Py_ssize_t | | +| | :c:type:`Py_ssize_t` | | +-----------------------------+-----------------------------+----------------------+ | :c:type:`objobjproc` | .. line-block:: | int | | | | | diff --git a/Doc/c-api/unicode.rst b/Doc/c-api/unicode.rst index ae24477fa45c8..eb99013395360 100644 --- a/Doc/c-api/unicode.rst +++ b/Doc/c-api/unicode.rst @@ -497,11 +497,11 @@ APIs: | :attr:`%llu` | unsigned long long | Equivalent to | | | | ``printf("%llu")``. [1]_ | +-------------------+---------------------+----------------------------------+ - | :attr:`%zd` | Py_ssize_t | Equivalent to | - | | | ``printf("%zd")``. [1]_ | + | :attr:`%zd` | :c:type:`\ | Equivalent to | + | | Py_ssize_t` | ``printf("%zd")``. [1]_ | +-------------------+---------------------+----------------------------------+ - | :attr:`%zi` | Py_ssize_t | Equivalent to | - | | | ``printf("%zi")``. [1]_ | + | :attr:`%zi` | :c:type:`\ | Equivalent to | + | | Py_ssize_t` | ``printf("%zi")``. [1]_ | +-------------------+---------------------+----------------------------------+ | :attr:`%zu` | size_t | Equivalent to | | | | ``printf("%zu")``. [1]_ | diff --git a/Doc/howto/clinic.rst b/Doc/howto/clinic.rst index 04b1a2cac0b04..72fb3208c3752 100644 --- a/Doc/howto/clinic.rst +++ b/Doc/howto/clinic.rst @@ -1347,7 +1347,7 @@ Here's the simplest example of a custom converter, from ``Modules/zlibmodule.c`` /*[python end generated code: output=da39a3ee5e6b4b0d input=35521e4e733823c7]*/ This block adds a converter to Argument Clinic named ``ssize_t``. Parameters -declared as ``ssize_t`` will be declared as type ``Py_ssize_t``, and will +declared as ``ssize_t`` will be declared as type :c:type:`Py_ssize_t`, and will be parsed by the ``'O&'`` format unit, which will call the ``ssize_t_converter`` converter function. ``ssize_t`` variables automatically support default values. diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index 7c293a501895b..94d3b3f15fd29 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -1490,7 +1490,7 @@ Optimizations first introduced in Python 3.4. It offers better performance and smaller size compared to Protocol 3 available since Python 3.0. -* Removed one ``Py_ssize_t`` member from ``PyGC_Head``. All GC tracked +* Removed one :c:type:`Py_ssize_t` member from ``PyGC_Head``. All GC tracked objects (e.g. tuple, list, dict) size is reduced 4 or 8 bytes. (Contributed by Inada Naoki in :issue:`33597`.) From webhook-mailer at python.org Fri May 13 09:32:44 2022 From: webhook-mailer at python.org (miss-islington) Date: Fri, 13 May 2022 13:32:44 -0000 Subject: [Python-checkins] Document Py_ssize_t. (GH-92512) Message-ID: https://github.com/python/cpython/commit/48f2d8de24d636ee039a36a5b220ef76efc2edff commit: 48f2d8de24d636ee039a36a5b220ef76efc2edff branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-13T06:32:39-07:00 summary: Document Py_ssize_t. (GH-92512) It fixes 252 errors from a Sphinx nitpicky run (sphinx-build -n). But there's 8182 errors left. Co-authored-by: Ezio Melotti (cherry picked from commit 664aa94b570a4a8f3535efb2e3d638a4ab655943) Co-authored-by: Julien Palard files: M Doc/c-api/arg.rst M Doc/c-api/bytes.rst M Doc/c-api/intro.rst M Doc/c-api/number.rst M Doc/c-api/object.rst M Doc/c-api/sys.rst M Doc/c-api/typeobj.rst M Doc/c-api/unicode.rst M Doc/howto/clinic.rst M Doc/whatsnew/3.8.rst diff --git a/Doc/c-api/arg.rst b/Doc/c-api/arg.rst index 1d93b35dc1c88..926e5249347f8 100644 --- a/Doc/c-api/arg.rst +++ b/Doc/c-api/arg.rst @@ -286,7 +286,7 @@ Numbers Convert a Python integer to a C :c:type:`unsigned long long` without overflow checking. -``n`` (:class:`int`) [Py_ssize_t] +``n`` (:class:`int`) [:c:type:`Py_ssize_t`] Convert a Python integer to a C :c:type:`Py_ssize_t`. ``c`` (:class:`bytes` or :class:`bytearray` of length 1) [char] @@ -613,7 +613,7 @@ Building values ``K`` (:class:`int`) [unsigned long long] Convert a C :c:type:`unsigned long long` to a Python integer object. - ``n`` (:class:`int`) [Py_ssize_t] + ``n`` (:class:`int`) [:c:type:`Py_ssize_t`] Convert a C :c:type:`Py_ssize_t` to a Python integer. ``c`` (:class:`bytes` of length 1) [char] diff --git a/Doc/c-api/bytes.rst b/Doc/c-api/bytes.rst index 32c7b80dc7ac6..ffbfb5a61b44b 100644 --- a/Doc/c-api/bytes.rst +++ b/Doc/c-api/bytes.rst @@ -84,8 +84,8 @@ called with a non-bytes parameter. | :attr:`%lu` | unsigned long | Equivalent to | | | | ``printf("%lu")``. [1]_ | +-------------------+---------------+--------------------------------+ - | :attr:`%zd` | Py_ssize_t | Equivalent to | - | | | ``printf("%zd")``. [1]_ | + | :attr:`%zd` | :c:type:`\ | Equivalent to | + | | Py_ssize_t` | ``printf("%zd")``. [1]_ | +-------------------+---------------+--------------------------------+ | :attr:`%zu` | size_t | Equivalent to | | | | ``printf("%zu")``. [1]_ | diff --git a/Doc/c-api/intro.rst b/Doc/c-api/intro.rst index 2d85d30702df9..083f6d32c79f8 100644 --- a/Doc/c-api/intro.rst +++ b/Doc/c-api/intro.rst @@ -502,6 +502,13 @@ data attributes of a new object type, and another is used to describe the value of a complex number. These will be discussed together with the functions that use them. +.. c:type:: Py_ssize_t + + A signed integral type such that ``sizeof(Py_ssize_t) == sizeof(size_t)``. + C99 doesn't define such a thing directly (size_t is an unsigned integral type). + See :pep:`353` for details. ``PY_SSIZE_T_MAX`` is the largest positive value + of type :c:type:`Py_ssize_t`. + .. _api-exceptions: diff --git a/Doc/c-api/number.rst b/Doc/c-api/number.rst index 11c9c67d36a67..70b91f8c2d0ca 100644 --- a/Doc/c-api/number.rst +++ b/Doc/c-api/number.rst @@ -273,11 +273,11 @@ Number Protocol .. c:function:: Py_ssize_t PyNumber_AsSsize_t(PyObject *o, PyObject *exc) - Returns *o* converted to a Py_ssize_t value if *o* can be interpreted as an + Returns *o* converted to a :c:type:`Py_ssize_t` value if *o* can be interpreted as an integer. If the call fails, an exception is raised and ``-1`` is returned. If *o* can be converted to a Python int but the attempt to - convert to a Py_ssize_t value would raise an :exc:`OverflowError`, then the + convert to a :c:type:`Py_ssize_t` value would raise an :exc:`OverflowError`, then the *exc* argument is the type of exception that will be raised (usually :exc:`IndexError` or :exc:`OverflowError`). If *exc* is ``NULL``, then the exception is cleared and the value is clipped to ``PY_SSIZE_T_MIN`` for a negative diff --git a/Doc/c-api/object.rst b/Doc/c-api/object.rst index 9dcfd769c64a0..07a625bac02fc 100644 --- a/Doc/c-api/object.rst +++ b/Doc/c-api/object.rst @@ -258,7 +258,7 @@ Object Protocol .. versionchanged:: 3.2 The return type is now Py_hash_t. This is a signed integer the same size - as Py_ssize_t. + as :c:type:`Py_ssize_t`. .. c:function:: Py_hash_t PyObject_HashNotImplemented(PyObject *o) diff --git a/Doc/c-api/sys.rst b/Doc/c-api/sys.rst index 350d4e1de41ba..7cf0a6b51f7dd 100644 --- a/Doc/c-api/sys.rst +++ b/Doc/c-api/sys.rst @@ -323,7 +323,7 @@ accessible to C code. They all work with the current interpreter thread's leaks.) Note that ``#`` format characters should always be treated as - ``Py_ssize_t``, regardless of whether ``PY_SSIZE_T_CLEAN`` was defined. + :c:type:`Py_ssize_t`, regardless of whether ``PY_SSIZE_T_CLEAN`` was defined. :func:`sys.audit` performs the same function from Python code. @@ -331,7 +331,7 @@ accessible to C code. They all work with the current interpreter thread's .. versionchanged:: 3.8.2 - Require ``Py_ssize_t`` for ``#`` format characters. Previously, an + Require :c:type:`Py_ssize_t` for ``#`` format characters. Previously, an unavoidable deprecation warning was raised. diff --git a/Doc/c-api/typeobj.rst b/Doc/c-api/typeobj.rst index d24eabe7e8d55..327a8c1208458 100644 --- a/Doc/c-api/typeobj.rst +++ b/Doc/c-api/typeobj.rst @@ -43,13 +43,13 @@ Quick Reference +================================================+===================================+===================+===+===+===+===+ | :c:member:`~PyTypeObject.tp_name` | const char * | __name__ | X | X | | | +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ - | :c:member:`~PyTypeObject.tp_basicsize` | Py_ssize_t | | X | X | | X | + | :c:member:`~PyTypeObject.tp_basicsize` | :c:type:`Py_ssize_t` | | X | X | | X | +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ - | :c:member:`~PyTypeObject.tp_itemsize` | Py_ssize_t | | | X | | X | + | :c:member:`~PyTypeObject.tp_itemsize` | :c:type:`Py_ssize_t` | | | X | | X | +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ | :c:member:`~PyTypeObject.tp_dealloc` | :c:type:`destructor` | | X | X | | X | +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ - | :c:member:`~PyTypeObject.tp_vectorcall_offset` | Py_ssize_t | | | X | | X | + | :c:member:`~PyTypeObject.tp_vectorcall_offset` | :c:type:`Py_ssize_t` | | | X | | X | +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ | (:c:member:`~PyTypeObject.tp_getattr`) | :c:type:`getattrfunc` | __getattribute__, | | | | G | | | | __getattr__ | | | | | @@ -96,7 +96,7 @@ Quick Reference | | | __gt__, | | | | | | | | __ge__ | | | | | +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ - | :c:member:`~PyTypeObject.tp_weaklistoffset` | Py_ssize_t | | | X | | ? | + | :c:member:`~PyTypeObject.tp_weaklistoffset` | :c:type:`Py_ssize_t` | | | X | | ? | +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ | :c:member:`~PyTypeObject.tp_iter` | :c:type:`getiterfunc` | __iter__ | | | | X | +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ @@ -117,7 +117,7 @@ Quick Reference | :c:member:`~PyTypeObject.tp_descr_set` | :c:type:`descrsetfunc` | __set__, | | | | X | | | | __delete__ | | | | | +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ - | :c:member:`~PyTypeObject.tp_dictoffset` | Py_ssize_t | | | X | | ? | + | :c:member:`~PyTypeObject.tp_dictoffset` | :c:type:`Py_ssize_t` | | | X | | ? | +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ | :c:member:`~PyTypeObject.tp_init` | :c:type:`initproc` | __init__ | X | X | | X | +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ @@ -333,7 +333,7 @@ slot typedefs | :c:type:`allocfunc` | .. line-block:: | :c:type:`PyObject` * | | | | | | | :c:type:`PyTypeObject` * | | -| | Py_ssize_t | | +| | :c:type:`Py_ssize_t` | | +-----------------------------+-----------------------------+----------------------+ | :c:type:`destructor` | void * | void | +-----------------------------+-----------------------------+----------------------+ @@ -405,7 +405,7 @@ slot typedefs +-----------------------------+-----------------------------+----------------------+ | :c:type:`iternextfunc` | :c:type:`PyObject` * | :c:type:`PyObject` * | +-----------------------------+-----------------------------+----------------------+ -| :c:type:`lenfunc` | :c:type:`PyObject` * | Py_ssize_t | +| :c:type:`lenfunc` | :c:type:`PyObject` * | :c:type:`Py_ssize_t` | +-----------------------------+-----------------------------+----------------------+ | :c:type:`getbufferproc` | .. line-block:: | int | | | | | @@ -438,12 +438,12 @@ slot typedefs | :c:type:`ssizeargfunc` | .. line-block:: | :c:type:`PyObject` * | | | | | | | :c:type:`PyObject` * | | -| | Py_ssize_t | | +| | :c:type:`Py_ssize_t` | | +-----------------------------+-----------------------------+----------------------+ | :c:type:`ssizeobjargproc` | .. line-block:: | int | | | | | | | :c:type:`PyObject` * | | -| | Py_ssize_t | | +| | :c:type:`Py_ssize_t` | | +-----------------------------+-----------------------------+----------------------+ | :c:type:`objobjproc` | .. line-block:: | int | | | | | diff --git a/Doc/c-api/unicode.rst b/Doc/c-api/unicode.rst index cf7d2232125c8..09ded4c32db07 100644 --- a/Doc/c-api/unicode.rst +++ b/Doc/c-api/unicode.rst @@ -490,11 +490,11 @@ APIs: | :attr:`%llu` | unsigned long long | Equivalent to | | | | ``printf("%llu")``. [1]_ | +-------------------+---------------------+----------------------------------+ - | :attr:`%zd` | Py_ssize_t | Equivalent to | - | | | ``printf("%zd")``. [1]_ | + | :attr:`%zd` | :c:type:`\ | Equivalent to | + | | Py_ssize_t` | ``printf("%zd")``. [1]_ | +-------------------+---------------------+----------------------------------+ - | :attr:`%zi` | Py_ssize_t | Equivalent to | - | | | ``printf("%zi")``. [1]_ | + | :attr:`%zi` | :c:type:`\ | Equivalent to | + | | Py_ssize_t` | ``printf("%zi")``. [1]_ | +-------------------+---------------------+----------------------------------+ | :attr:`%zu` | size_t | Equivalent to | | | | ``printf("%zu")``. [1]_ | diff --git a/Doc/howto/clinic.rst b/Doc/howto/clinic.rst index 3a3653a5ee3a3..f2195405fe96f 100644 --- a/Doc/howto/clinic.rst +++ b/Doc/howto/clinic.rst @@ -1350,7 +1350,7 @@ Here's the simplest example of a custom converter, from ``Modules/zlibmodule.c`` /*[python end generated code: output=da39a3ee5e6b4b0d input=35521e4e733823c7]*/ This block adds a converter to Argument Clinic named ``ssize_t``. Parameters -declared as ``ssize_t`` will be declared as type ``Py_ssize_t``, and will +declared as ``ssize_t`` will be declared as type :c:type:`Py_ssize_t`, and will be parsed by the ``'O&'`` format unit, which will call the ``ssize_t_converter`` converter function. ``ssize_t`` variables automatically support default values. diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index 7c293a501895b..94d3b3f15fd29 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -1490,7 +1490,7 @@ Optimizations first introduced in Python 3.4. It offers better performance and smaller size compared to Protocol 3 available since Python 3.0. -* Removed one ``Py_ssize_t`` member from ``PyGC_Head``. All GC tracked +* Removed one :c:type:`Py_ssize_t` member from ``PyGC_Head``. All GC tracked objects (e.g. tuple, list, dict) size is reduced 4 or 8 bytes. (Contributed by Inada Naoki in :issue:`33597`.) From webhook-mailer at python.org Fri May 13 10:01:53 2022 From: webhook-mailer at python.org (rhettinger) Date: Fri, 13 May 2022 14:01:53 -0000 Subject: [Python-checkins] Fix typo in argparse docs. (GH-92691) (#92731) Message-ID: https://github.com/python/cpython/commit/256c6d05e29da63ec0af74553192b9d26912b7c2 commit: 256c6d05e29da63ec0af74553192b9d26912b7c2 branch: 3.9 author: thueringa committer: rhettinger date: 2022-05-13T09:01:30-05:00 summary: Fix typo in argparse docs. (GH-92691) (#92731) files: M Doc/library/argparse.rst diff --git a/Doc/library/argparse.rst b/Doc/library/argparse.rst index fa731fec3a85a..8989d1cef1bd5 100644 --- a/Doc/library/argparse.rst +++ b/Doc/library/argparse.rst @@ -501,7 +501,7 @@ disallowed. fromfile_prefix_chars ^^^^^^^^^^^^^^^^^^^^^ -Sometimes, for example when dealing with a particularly long argument lists, it +Sometimes, for example when dealing with a particularly long argument list, it may make sense to keep the list of arguments in a file rather than typing it out at the command line. If the ``fromfile_prefix_chars=`` argument is given to the :class:`ArgumentParser` constructor, then arguments that start with any of the From webhook-mailer at python.org Fri May 13 10:03:09 2022 From: webhook-mailer at python.org (rhettinger) Date: Fri, 13 May 2022 14:03:09 -0000 Subject: [Python-checkins] Fix typo in argparse docs. (GH-92691) (#92709) Message-ID: https://github.com/python/cpython/commit/60c4bca01385ad88de48398eefaa1ede5a2d0cd0 commit: 60c4bca01385ad88de48398eefaa1ede5a2d0cd0 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: rhettinger date: 2022-05-13T09:03:03-05:00 summary: Fix typo in argparse docs. (GH-92691) (#92709) files: M Doc/library/argparse.rst diff --git a/Doc/library/argparse.rst b/Doc/library/argparse.rst index b5a2b794c2385..1f40e4a84505d 100644 --- a/Doc/library/argparse.rst +++ b/Doc/library/argparse.rst @@ -555,7 +555,7 @@ disallowed. fromfile_prefix_chars ^^^^^^^^^^^^^^^^^^^^^ -Sometimes, when dealing with a particularly long argument lists, it +Sometimes, when dealing with a particularly long argument list, it may make sense to keep the list of arguments in a file rather than typing it out at the command line. If the ``fromfile_prefix_chars=`` argument is given to the :class:`ArgumentParser` constructor, then arguments that start with any of the From webhook-mailer at python.org Fri May 13 10:06:14 2022 From: webhook-mailer at python.org (rhettinger) Date: Fri, 13 May 2022 14:06:14 -0000 Subject: [Python-checkins] gh-92446: Argparse choices should be a sequence (#92450) Message-ID: https://github.com/python/cpython/commit/b39f841047eb9d084e4873050e4d0226cb58eb6f commit: b39f841047eb9d084e4873050e4d0226cb58eb6f branch: main author: 180909 <734461790 at qq.com> committer: rhettinger date: 2022-05-13T09:06:08-05:00 summary: gh-92446: Argparse choices should be a sequence (#92450) files: M Doc/library/lzma.rst diff --git a/Doc/library/lzma.rst b/Doc/library/lzma.rst index 21092645366da..f7aaa0cb30c2a 100644 --- a/Doc/library/lzma.rst +++ b/Doc/library/lzma.rst @@ -147,7 +147,7 @@ Compressing and decompressing data in memory This format is more limited than ``.xz`` -- it does not support integrity checks or multiple filters. - * :const:`FORMAT_RAW`: A raw data stream, not using any container format. + * :const:`FORMAT_RAW`: A raw data stream, not using sequences format. This format specifier does not support integrity checks, and requires that you always specify a custom filter chain (for both compression and decompression). Additionally, data compressed in this manner cannot be From webhook-mailer at python.org Fri May 13 10:10:23 2022 From: webhook-mailer at python.org (miss-islington) Date: Fri, 13 May 2022 14:10:23 -0000 Subject: [Python-checkins] Document Py_ssize_t. (GH-92512) Message-ID: https://github.com/python/cpython/commit/f253cf469dfd65237882fcb51854d750bf80df13 commit: f253cf469dfd65237882fcb51854d750bf80df13 branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-13T07:10:10-07:00 summary: Document Py_ssize_t. (GH-92512) It fixes 252 errors from a Sphinx nitpicky run (sphinx-build -n). But there's 8182 errors left. Co-authored-by: Ezio Melotti (cherry picked from commit 664aa94b570a4a8f3535efb2e3d638a4ab655943) Co-authored-by: Julien Palard files: M Doc/c-api/arg.rst M Doc/c-api/bytes.rst M Doc/c-api/intro.rst M Doc/c-api/number.rst M Doc/c-api/object.rst M Doc/c-api/sys.rst M Doc/c-api/typeobj.rst M Doc/c-api/unicode.rst M Doc/howto/clinic.rst M Doc/whatsnew/3.8.rst diff --git a/Doc/c-api/arg.rst b/Doc/c-api/arg.rst index 7a3188009cf95..6b60344a30439 100644 --- a/Doc/c-api/arg.rst +++ b/Doc/c-api/arg.rst @@ -288,7 +288,7 @@ Numbers Convert a Python integer to a C :c:type:`unsigned long long` without overflow checking. -``n`` (:class:`int`) [Py_ssize_t] +``n`` (:class:`int`) [:c:type:`Py_ssize_t`] Convert a Python integer to a C :c:type:`Py_ssize_t`. ``c`` (:class:`bytes` or :class:`bytearray` of length 1) [char] @@ -614,7 +614,7 @@ Building values ``K`` (:class:`int`) [unsigned long long] Convert a C :c:type:`unsigned long long` to a Python integer object. - ``n`` (:class:`int`) [Py_ssize_t] + ``n`` (:class:`int`) [:c:type:`Py_ssize_t`] Convert a C :c:type:`Py_ssize_t` to a Python integer. ``c`` (:class:`bytes` of length 1) [char] diff --git a/Doc/c-api/bytes.rst b/Doc/c-api/bytes.rst index 32c7b80dc7ac6..ffbfb5a61b44b 100644 --- a/Doc/c-api/bytes.rst +++ b/Doc/c-api/bytes.rst @@ -84,8 +84,8 @@ called with a non-bytes parameter. | :attr:`%lu` | unsigned long | Equivalent to | | | | ``printf("%lu")``. [1]_ | +-------------------+---------------+--------------------------------+ - | :attr:`%zd` | Py_ssize_t | Equivalent to | - | | | ``printf("%zd")``. [1]_ | + | :attr:`%zd` | :c:type:`\ | Equivalent to | + | | Py_ssize_t` | ``printf("%zd")``. [1]_ | +-------------------+---------------+--------------------------------+ | :attr:`%zu` | size_t | Equivalent to | | | | ``printf("%zu")``. [1]_ | diff --git a/Doc/c-api/intro.rst b/Doc/c-api/intro.rst index 7ca8693afab79..ac1024cd5ee6e 100644 --- a/Doc/c-api/intro.rst +++ b/Doc/c-api/intro.rst @@ -502,6 +502,13 @@ data attributes of a new object type, and another is used to describe the value of a complex number. These will be discussed together with the functions that use them. +.. c:type:: Py_ssize_t + + A signed integral type such that ``sizeof(Py_ssize_t) == sizeof(size_t)``. + C99 doesn't define such a thing directly (size_t is an unsigned integral type). + See :pep:`353` for details. ``PY_SSIZE_T_MAX`` is the largest positive value + of type :c:type:`Py_ssize_t`. + .. _api-exceptions: diff --git a/Doc/c-api/number.rst b/Doc/c-api/number.rst index 1058b2c77f308..47033a38524b9 100644 --- a/Doc/c-api/number.rst +++ b/Doc/c-api/number.rst @@ -269,11 +269,11 @@ Number Protocol .. c:function:: Py_ssize_t PyNumber_AsSsize_t(PyObject *o, PyObject *exc) - Returns *o* converted to a Py_ssize_t value if *o* can be interpreted as an + Returns *o* converted to a :c:type:`Py_ssize_t` value if *o* can be interpreted as an integer. If the call fails, an exception is raised and ``-1`` is returned. If *o* can be converted to a Python int but the attempt to - convert to a Py_ssize_t value would raise an :exc:`OverflowError`, then the + convert to a :c:type:`Py_ssize_t` value would raise an :exc:`OverflowError`, then the *exc* argument is the type of exception that will be raised (usually :exc:`IndexError` or :exc:`OverflowError`). If *exc* is ``NULL``, then the exception is cleared and the value is clipped to ``PY_SSIZE_T_MIN`` for a negative diff --git a/Doc/c-api/object.rst b/Doc/c-api/object.rst index 43ccb44c35ba0..3e4f61ac02c2e 100644 --- a/Doc/c-api/object.rst +++ b/Doc/c-api/object.rst @@ -258,7 +258,7 @@ Object Protocol .. versionchanged:: 3.2 The return type is now Py_hash_t. This is a signed integer the same size - as Py_ssize_t. + as :c:type:`Py_ssize_t`. .. c:function:: Py_hash_t PyObject_HashNotImplemented(PyObject *o) diff --git a/Doc/c-api/sys.rst b/Doc/c-api/sys.rst index 37591a495fd4d..0a5c8d7008f2d 100644 --- a/Doc/c-api/sys.rst +++ b/Doc/c-api/sys.rst @@ -321,7 +321,7 @@ accessible to C code. They all work with the current interpreter thread's leaks.) Note that ``#`` format characters should always be treated as - ``Py_ssize_t``, regardless of whether ``PY_SSIZE_T_CLEAN`` was defined. + :c:type:`Py_ssize_t`, regardless of whether ``PY_SSIZE_T_CLEAN`` was defined. :func:`sys.audit` performs the same function from Python code. @@ -329,7 +329,7 @@ accessible to C code. They all work with the current interpreter thread's .. versionchanged:: 3.8.2 - Require ``Py_ssize_t`` for ``#`` format characters. Previously, an + Require :c:type:`Py_ssize_t` for ``#`` format characters. Previously, an unavoidable deprecation warning was raised. diff --git a/Doc/c-api/typeobj.rst b/Doc/c-api/typeobj.rst index d49f3ffa0a509..eedefd7cecb9d 100644 --- a/Doc/c-api/typeobj.rst +++ b/Doc/c-api/typeobj.rst @@ -43,13 +43,13 @@ Quick Reference +================================================+===================================+===================+===+===+===+===+ | :c:member:`~PyTypeObject.tp_name` | const char * | __name__ | X | X | | | +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ - | :c:member:`~PyTypeObject.tp_basicsize` | Py_ssize_t | | X | X | | X | + | :c:member:`~PyTypeObject.tp_basicsize` | :c:type:`Py_ssize_t` | | X | X | | X | +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ - | :c:member:`~PyTypeObject.tp_itemsize` | Py_ssize_t | | | X | | X | + | :c:member:`~PyTypeObject.tp_itemsize` | :c:type:`Py_ssize_t` | | | X | | X | +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ | :c:member:`~PyTypeObject.tp_dealloc` | :c:type:`destructor` | | X | X | | X | +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ - | :c:member:`~PyTypeObject.tp_vectorcall_offset` | Py_ssize_t | | | X | | X | + | :c:member:`~PyTypeObject.tp_vectorcall_offset` | :c:type:`Py_ssize_t` | | | X | | X | +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ | (:c:member:`~PyTypeObject.tp_getattr`) | :c:type:`getattrfunc` | __getattribute__, | | | | G | | | | __getattr__ | | | | | @@ -96,7 +96,7 @@ Quick Reference | | | __gt__, | | | | | | | | __ge__ | | | | | +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ - | :c:member:`~PyTypeObject.tp_weaklistoffset` | Py_ssize_t | | | X | | ? | + | :c:member:`~PyTypeObject.tp_weaklistoffset` | :c:type:`Py_ssize_t` | | | X | | ? | +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ | :c:member:`~PyTypeObject.tp_iter` | :c:type:`getiterfunc` | __iter__ | | | | X | +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ @@ -117,7 +117,7 @@ Quick Reference | :c:member:`~PyTypeObject.tp_descr_set` | :c:type:`descrsetfunc` | __set__, | | | | X | | | | __delete__ | | | | | +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ - | :c:member:`~PyTypeObject.tp_dictoffset` | Py_ssize_t | | | X | | ? | + | :c:member:`~PyTypeObject.tp_dictoffset` | :c:type:`Py_ssize_t` | | | X | | ? | +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ | :c:member:`~PyTypeObject.tp_init` | :c:type:`initproc` | __init__ | X | X | | X | +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ @@ -331,7 +331,7 @@ slot typedefs | :c:type:`allocfunc` | .. line-block:: | :c:type:`PyObject` * | | | | | | | :c:type:`PyTypeObject` * | | -| | Py_ssize_t | | +| | :c:type:`Py_ssize_t` | | +-----------------------------+-----------------------------+----------------------+ | :c:type:`destructor` | void * | void | +-----------------------------+-----------------------------+----------------------+ @@ -403,7 +403,7 @@ slot typedefs +-----------------------------+-----------------------------+----------------------+ | :c:type:`iternextfunc` | :c:type:`PyObject` * | :c:type:`PyObject` * | +-----------------------------+-----------------------------+----------------------+ -| :c:type:`lenfunc` | :c:type:`PyObject` * | Py_ssize_t | +| :c:type:`lenfunc` | :c:type:`PyObject` * | :c:type:`Py_ssize_t` | +-----------------------------+-----------------------------+----------------------+ | :c:type:`getbufferproc` | .. line-block:: | int | | | | | @@ -436,12 +436,12 @@ slot typedefs | :c:type:`ssizeargfunc` | .. line-block:: | :c:type:`PyObject` * | | | | | | | :c:type:`PyObject` * | | -| | Py_ssize_t | | +| | :c:type:`Py_ssize_t` | | +-----------------------------+-----------------------------+----------------------+ | :c:type:`ssizeobjargproc` | .. line-block:: | int | | | | | | | :c:type:`PyObject` * | | -| | Py_ssize_t | | +| | :c:type:`Py_ssize_t` | | +-----------------------------+-----------------------------+----------------------+ | :c:type:`objobjproc` | .. line-block:: | int | | | | | diff --git a/Doc/c-api/unicode.rst b/Doc/c-api/unicode.rst index 8bdcad63363b5..4129c614a1e79 100644 --- a/Doc/c-api/unicode.rst +++ b/Doc/c-api/unicode.rst @@ -490,11 +490,11 @@ APIs: | :attr:`%llu` | unsigned long long | Equivalent to | | | | ``printf("%llu")``. [1]_ | +-------------------+---------------------+----------------------------------+ - | :attr:`%zd` | Py_ssize_t | Equivalent to | - | | | ``printf("%zd")``. [1]_ | + | :attr:`%zd` | :c:type:`\ | Equivalent to | + | | Py_ssize_t` | ``printf("%zd")``. [1]_ | +-------------------+---------------------+----------------------------------+ - | :attr:`%zi` | Py_ssize_t | Equivalent to | - | | | ``printf("%zi")``. [1]_ | + | :attr:`%zi` | :c:type:`\ | Equivalent to | + | | Py_ssize_t` | ``printf("%zi")``. [1]_ | +-------------------+---------------------+----------------------------------+ | :attr:`%zu` | size_t | Equivalent to | | | | ``printf("%zu")``. [1]_ | diff --git a/Doc/howto/clinic.rst b/Doc/howto/clinic.rst index 50041829b8c38..145febe093b30 100644 --- a/Doc/howto/clinic.rst +++ b/Doc/howto/clinic.rst @@ -1288,7 +1288,7 @@ Here's the simplest example of a custom converter, from ``Modules/zlibmodule.c`` /*[python end generated code: output=da39a3ee5e6b4b0d input=35521e4e733823c7]*/ This block adds a converter to Argument Clinic named ``ssize_t``. Parameters -declared as ``ssize_t`` will be declared as type ``Py_ssize_t``, and will +declared as ``ssize_t`` will be declared as type :c:type:`Py_ssize_t`, and will be parsed by the ``'O&'`` format unit, which will call the ``ssize_t_converter`` converter function. ``ssize_t`` variables automatically support default values. diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index 1b3bb152eea13..92bdb4555537e 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -1489,7 +1489,7 @@ Optimizations first introduced in Python 3.4. It offers better performance and smaller size compared to Protocol 3 available since Python 3.0. -* Removed one ``Py_ssize_t`` member from ``PyGC_Head``. All GC tracked +* Removed one :c:type:`Py_ssize_t` member from ``PyGC_Head``. All GC tracked objects (e.g. tuple, list, dict) size is reduced 4 or 8 bytes. (Contributed by Inada Naoki in :issue:`33597`.) From webhook-mailer at python.org Fri May 13 10:15:38 2022 From: webhook-mailer at python.org (rhettinger) Date: Fri, 13 May 2022 14:15:38 -0000 Subject: [Python-checkins] Fix small typo (#92721) Message-ID: https://github.com/python/cpython/commit/57da3ff586c66a8d08abbee37736b9fb6f0b7112 commit: 57da3ff586c66a8d08abbee37736b9fb6f0b7112 branch: main author: Gabi Nagy committer: rhettinger date: 2022-05-13T09:15:20-05:00 summary: Fix small typo (#92721) files: M Doc/library/glob.rst diff --git a/Doc/library/glob.rst b/Doc/library/glob.rst index 01ad67732cf2e..d51fd0ebf9e40 100644 --- a/Doc/library/glob.rst +++ b/Doc/library/glob.rst @@ -49,7 +49,7 @@ For example, ``'[?]'`` matches the character ``'?'``. symlinks are included in the results (as in the shell). Whether or not the results are sorted depends on the file system. If a file that satisfies conditions is removed or added during the call of this function, whether - a path name for that file be included is unspecified. + a path name for that file will be included is unspecified. If *root_dir* is not ``None``, it should be a :term:`path-like object` specifying the root directory for searching. It has the same effect on From webhook-mailer at python.org Fri May 13 10:17:15 2022 From: webhook-mailer at python.org (rhettinger) Date: Fri, 13 May 2022 14:17:15 -0000 Subject: [Python-checkins] bpo-9182: Add a section on specifying positional arguments (#31810) Message-ID: https://github.com/python/cpython/commit/3e3e8976b8096ae1c52432bd3be15784ea82d956 commit: 3e3e8976b8096ae1c52432bd3be15784ea82d956 branch: main author: slateny <46876382+slateny at users.noreply.github.com> committer: rhettinger date: 2022-05-13T09:17:07-05:00 summary: bpo-9182: Add a section on specifying positional arguments (#31810) files: M Doc/howto/argparse.rst M Doc/library/argparse.rst diff --git a/Doc/howto/argparse.rst b/Doc/howto/argparse.rst index a97d10cfe6bb6..3075b0142d16d 100644 --- a/Doc/howto/argparse.rst +++ b/Doc/howto/argparse.rst @@ -664,6 +664,35 @@ Output: 4^2 == 16 +.. _specifying-ambiguous-arguments: + +Specifying ambiguous arguments +------------------------------ + +When there is ambiguity in deciding whether an argument is positional or for an +argument, ``--`` can be used to tell :meth:`~ArgumentParser.parse_args` that +everything after that is a positional argument:: + + >>> parser = argparse.ArgumentParser(prog='PROG') + >>> parser.add_argument('-n', nargs='+') + >>> parser.add_argument('args', nargs='*') + + >>> # ambiguous, so parse_args assumes it's an option + >>> parser.parse_args(['-f']) + usage: PROG [-h] [-n N [N ...]] [args ...] + PROG: error: unrecognized arguments: -f + + >>> parser.parse_args(['--', '-f']) + Namespace(args=['-f'], n=None) + + >>> # ambiguous, so the -n option greedily accepts arguments + >>> parser.parse_args(['-n', '1', '2', '3']) + Namespace(args=[], n=['1', '2', '3']) + + >>> parser.parse_args(['-n', '1', '--', '2', '3']) + Namespace(args=['2', '3'], n=['1']) + + Conflicting options ------------------- diff --git a/Doc/library/argparse.rst b/Doc/library/argparse.rst index 1f40e4a84505d..83dd3cdf03136 100644 --- a/Doc/library/argparse.rst +++ b/Doc/library/argparse.rst @@ -951,8 +951,8 @@ nargs ArgumentParser objects usually associate a single command-line argument with a single action to be taken. The ``nargs`` keyword argument associates a -different number of command-line arguments with a single action. The supported -values are: +different number of command-line arguments with a single action. +See also :ref:`specifying-ambiguous-arguments`. The supported values are: * ``N`` (an integer). ``N`` arguments from the command line will be gathered together into a list. For example:: @@ -1610,6 +1610,9 @@ argument:: >>> parser.parse_args(['--', '-f']) Namespace(foo='-f', one=None) +See also :ref:`the argparse howto on ambiguous arguments ` +for more details. + .. _prefix-matching: Argument abbreviations (prefix matching) From webhook-mailer at python.org Fri May 13 10:36:15 2022 From: webhook-mailer at python.org (vsajip) Date: Fri, 13 May 2022 14:36:15 -0000 Subject: [Python-checkins] gh-91249: Remove .bat extension in documentation for when activating venv on Windows. (GH-92770) Message-ID: https://github.com/python/cpython/commit/3115c2c036728300a31f54a086759da229443bdb commit: 3115c2c036728300a31f54a086759da229443bdb branch: main author: yashlad681 <30846820+yashlad681 at users.noreply.github.com> committer: vsajip date: 2022-05-13T15:36:05+01:00 summary: gh-91249: Remove .bat extension in documentation for when activating venv on Windows. (GH-92770) files: M Doc/tutorial/venv.rst diff --git a/Doc/tutorial/venv.rst b/Doc/tutorial/venv.rst index 7cdce3f9ca887..1fdb370b33d5a 100644 --- a/Doc/tutorial/venv.rst +++ b/Doc/tutorial/venv.rst @@ -60,7 +60,7 @@ Once you've created a virtual environment, you may activate it. On Windows, run:: - tutorial-env\Scripts\activate.bat + tutorial-env\Scripts\activate On Unix or MacOS, run:: From webhook-mailer at python.org Fri May 13 10:49:41 2022 From: webhook-mailer at python.org (rhettinger) Date: Fri, 13 May 2022 14:49:41 -0000 Subject: [Python-checkins] Fix numbers.Real.__rdivmod__ doc string (#31991) Message-ID: https://github.com/python/cpython/commit/7e46ae33bd522cf8331052c3c8835f9366599d8d commit: 7e46ae33bd522cf8331052c3c8835f9366599d8d branch: main author: G?ry Ogam committer: rhettinger date: 2022-05-13T09:49:36-05:00 summary: Fix numbers.Real.__rdivmod__ doc string (#31991) files: M Lib/numbers.py diff --git a/Lib/numbers.py b/Lib/numbers.py index 9548aebd776a7..8e37d79fa755a 100644 --- a/Lib/numbers.py +++ b/Lib/numbers.py @@ -143,7 +143,7 @@ def __rtruediv__(self, other): @abstractmethod def __pow__(self, exponent): - """self**exponent; should promote to float or complex when necessary.""" + """self ** exponent; should promote to float or complex when necessary.""" raise NotImplementedError @abstractmethod @@ -192,7 +192,7 @@ def __trunc__(self): """trunc(self): Truncates self to an Integral. Returns an Integral i such that: - * i>0 iff self>0; + * i > 0 iff self > 0; * abs(i) <= abs(self); * for any Integral j satisfying the first two conditions, abs(i) >= abs(j) [i.e. i has "maximal" abs among those]. @@ -228,7 +228,7 @@ def __divmod__(self, other): return (self // other, self % other) def __rdivmod__(self, other): - """divmod(other, self): The pair (self // other, self % other). + """divmod(other, self): The pair (other // self, other % self). Sometimes this can be computed faster than the pair of operations. From webhook-mailer at python.org Fri May 13 15:54:26 2022 From: webhook-mailer at python.org (brettcannon) Date: Fri, 13 May 2022 19:54:26 -0000 Subject: [Python-checkins] gh-92611: Link to PEP 594 sections & add key detail in doc deprecation notices (GH-92612) Message-ID: https://github.com/python/cpython/commit/9f68dab3d327335b938046c50b4f09944e993cc8 commit: 9f68dab3d327335b938046c50b4f09944e993cc8 branch: main author: CAM Gerlach committer: brettcannon date: 2022-05-13T12:54:12-07:00 summary: gh-92611: Link to PEP 594 sections & add key detail in doc deprecation notices (GH-92612) files: M Doc/library/aifc.rst M Doc/library/asynchat.rst M Doc/library/asyncore.rst M Doc/library/audioop.rst M Doc/library/cgi.rst M Doc/library/cgitb.rst M Doc/library/chunk.rst M Doc/library/crypt.rst M Doc/library/imghdr.rst M Doc/library/mailcap.rst M Doc/library/msilib.rst M Doc/library/nis.rst M Doc/library/ossaudiodev.rst M Doc/library/pipes.rst M Doc/library/smtpd.rst M Doc/library/sndhdr.rst M Doc/library/spwd.rst M Doc/library/sunau.rst M Doc/library/telnetlib.rst M Doc/library/uu.rst M Doc/library/xdrlib.rst diff --git a/Doc/library/aifc.rst b/Doc/library/aifc.rst index edb4bf86e5a0a..fa277857574a3 100644 --- a/Doc/library/aifc.rst +++ b/Doc/library/aifc.rst @@ -14,7 +14,8 @@ .. deprecated:: 3.11 - The :mod:`aifc` module is deprecated (see :pep:`594` for details). + The :mod:`aifc` module is deprecated + (see :pep:`PEP 594 <594#aifc>` for details). -------------- diff --git a/Doc/library/asynchat.rst b/Doc/library/asynchat.rst index 4354444a1d331..7cc9d99779bbb 100644 --- a/Doc/library/asynchat.rst +++ b/Doc/library/asynchat.rst @@ -11,7 +11,8 @@ **Source code:** :source:`Lib/asynchat.py` .. deprecated:: 3.6 - :mod:`asynchat` will be removed in Python 3.12 (:pep:`594`). + :mod:`asynchat` will be removed in Python 3.12 + (see :pep:`PEP 594 <594#asynchat>` for details). Please use :mod:`asyncio` instead. -------------- diff --git a/Doc/library/asyncore.rst b/Doc/library/asyncore.rst index e481e13db76f7..a732fd7ba4f15 100644 --- a/Doc/library/asyncore.rst +++ b/Doc/library/asyncore.rst @@ -14,7 +14,8 @@ **Source code:** :source:`Lib/asyncore.py` .. deprecated:: 3.6 - :mod:`asyncore` will be removed in Python 3.12 (:pep:`594`). + :mod:`asyncore` will be removed in Python 3.12 + (see :pep:`PEP 594 <594#asyncore>` for details). Please use :mod:`asyncio` instead. -------------- diff --git a/Doc/library/audioop.rst b/Doc/library/audioop.rst index eae206084f090..649c99e796282 100644 --- a/Doc/library/audioop.rst +++ b/Doc/library/audioop.rst @@ -6,7 +6,8 @@ :deprecated: .. deprecated:: 3.11 - The :mod:`audioop` module is deprecated (see :pep:`594` for details). + The :mod:`audioop` module is deprecated + (see :pep:`PEP 594 <594#audioop>` for details). -------------- diff --git a/Doc/library/cgi.rst b/Doc/library/cgi.rst index 7e697408af07b..31c03dee91ea8 100644 --- a/Doc/library/cgi.rst +++ b/Doc/library/cgi.rst @@ -16,7 +16,8 @@ single: Common Gateway Interface .. deprecated:: 3.11 - The :mod:`cgi` module is deprecated (see :pep:`594` for details). + The :mod:`cgi` module is deprecated + (see :pep:`PEP 594 <594#cgi>` for details and alternatives). -------------- diff --git a/Doc/library/cgitb.rst b/Doc/library/cgitb.rst index 349414610bd40..3b0b106abacd5 100644 --- a/Doc/library/cgitb.rst +++ b/Doc/library/cgitb.rst @@ -17,7 +17,8 @@ single: tracebacks; in CGI scripts .. deprecated:: 3.11 - The :mod:`cgitb` module is deprecated (see :pep:`594` for details). + The :mod:`cgitb` module is deprecated + (see :pep:`PEP 594 <594#cgitb>` for details). -------------- diff --git a/Doc/library/chunk.rst b/Doc/library/chunk.rst index 7999420f536d7..5a84c8904f714 100644 --- a/Doc/library/chunk.rst +++ b/Doc/library/chunk.rst @@ -18,7 +18,8 @@ single: RMFF .. deprecated:: 3.11 - The :mod:`chunk` module is deprecated (see :pep:`594` for details). + The :mod:`chunk` module is deprecated + (see :pep:`PEP 594 <594#chunk>` for details). -------------- diff --git a/Doc/library/crypt.rst b/Doc/library/crypt.rst index 3189ece048a26..e795f10f50eec 100644 --- a/Doc/library/crypt.rst +++ b/Doc/library/crypt.rst @@ -17,7 +17,9 @@ pair: cipher; DES .. deprecated:: 3.11 - The :mod:`crypt` module is deprecated (see :pep:`594` for details). + The :mod:`crypt` module is deprecated + (see :pep:`PEP 594 <594#crypt>` for details and alternatives). + The :mod:`hashlib` module is a potential replacement for certain use cases. -------------- diff --git a/Doc/library/imghdr.rst b/Doc/library/imghdr.rst index 084fef73daf28..c17bf897b9be9 100644 --- a/Doc/library/imghdr.rst +++ b/Doc/library/imghdr.rst @@ -8,7 +8,8 @@ **Source code:** :source:`Lib/imghdr.py` .. deprecated:: 3.11 - The :mod:`imghdr` module is deprecated (see :pep:`594` for details). + The :mod:`imghdr` module is deprecated + (see :pep:`PEP 594 <594#imghdr>` for details and alternatives). -------------- diff --git a/Doc/library/mailcap.rst b/Doc/library/mailcap.rst index 416b181f45a77..e2e5bb3445637 100644 --- a/Doc/library/mailcap.rst +++ b/Doc/library/mailcap.rst @@ -8,8 +8,9 @@ **Source code:** :source:`Lib/mailcap.py` .. deprecated:: 3.11 - The :mod:`mailcap` module is deprecated. See :pep:`594` for the rationale - and the :mod:`mimetypes` module for an alternative. + The :mod:`mailcap` module is deprecated + (see :pep:`PEP 594 <594#mailcap>` for details). + The :mod:`mimetypes` module provides an alternative. -------------- diff --git a/Doc/library/msilib.rst b/Doc/library/msilib.rst index b2fa20873fbbf..1ee8130801cba 100644 --- a/Doc/library/msilib.rst +++ b/Doc/library/msilib.rst @@ -14,7 +14,8 @@ .. index:: single: msi .. deprecated:: 3.11 - The :mod:`msilib` module is deprecated (see :pep:`594` for details). + The :mod:`msilib` module is deprecated + (see :pep:`PEP 594 <594#msilib>` for details). -------------- diff --git a/Doc/library/nis.rst b/Doc/library/nis.rst index f6b6ea83946b0..49fe62954cce8 100644 --- a/Doc/library/nis.rst +++ b/Doc/library/nis.rst @@ -11,7 +11,8 @@ .. sectionauthor:: Moshe Zadka .. deprecated:: 3.11 - The :mod:`nis` module is deprecated (see :pep:`594` for details). + The :mod:`nis` module is deprecated + (see :pep:`PEP 594 <594#nis>` for details). -------------- diff --git a/Doc/library/ossaudiodev.rst b/Doc/library/ossaudiodev.rst index e0f0a6b8259e4..728ee3036057d 100644 --- a/Doc/library/ossaudiodev.rst +++ b/Doc/library/ossaudiodev.rst @@ -7,7 +7,8 @@ :deprecated: .. deprecated:: 3.11 - The :mod:`ossaudiodev` module is deprecated (see :pep:`594` for details). + The :mod:`ossaudiodev` module is deprecated + (see :pep:`PEP 594 <594#ossaudiodev>` for details). -------------- diff --git a/Doc/library/pipes.rst b/Doc/library/pipes.rst index 4de8c51bcae04..1c5bb8bddaafb 100644 --- a/Doc/library/pipes.rst +++ b/Doc/library/pipes.rst @@ -11,7 +11,9 @@ **Source code:** :source:`Lib/pipes.py` .. deprecated:: 3.11 - The :mod:`pipes` module is deprecated (see :pep:`594` for details). + The :mod:`pipes` module is deprecated + (see :pep:`PEP 594 <594#pipes>` for details). + Please use the :mod:`subprocess` module instead. -------------- diff --git a/Doc/library/smtpd.rst b/Doc/library/smtpd.rst index 6b37a0517063d..121790b5ed0dd 100644 --- a/Doc/library/smtpd.rst +++ b/Doc/library/smtpd.rst @@ -15,7 +15,8 @@ This module offers several classes to implement SMTP (email) servers. .. deprecated:: 3.6 - :mod:`smtpd` will be removed in Python 3.12 (:pep:`594`). + :mod:`smtpd` will be removed in Python 3.12 + (see :pep:`PEP 594 <594#smtpd>` for details). The `aiosmtpd `_ package is a recommended replacement for this module. It is based on :mod:`asyncio` and provides a more straightforward API. diff --git a/Doc/library/sndhdr.rst b/Doc/library/sndhdr.rst index 41bce18b9cd84..3ca36f270dade 100644 --- a/Doc/library/sndhdr.rst +++ b/Doc/library/sndhdr.rst @@ -15,7 +15,8 @@ single: u-LAW .. deprecated:: 3.11 - The :mod:`sndhdr` module is deprecated (see :pep:`594` for details). + The :mod:`sndhdr` module is deprecated + (see :pep:`PEP 594 <594#sndhdr>` for details and alternatives). -------------- diff --git a/Doc/library/spwd.rst b/Doc/library/spwd.rst index cb31a10a52e00..40f50de07babf 100644 --- a/Doc/library/spwd.rst +++ b/Doc/library/spwd.rst @@ -7,7 +7,8 @@ :deprecated: .. deprecated:: 3.11 - The :mod:`spwd` module is deprecated (see :pep:`594` for details). + The :mod:`spwd` module is deprecated + (see :pep:`PEP 594 <594#spwd>` for details and alternatives). -------------- diff --git a/Doc/library/sunau.rst b/Doc/library/sunau.rst index cfb1257f58548..b4d996e67e17c 100644 --- a/Doc/library/sunau.rst +++ b/Doc/library/sunau.rst @@ -10,7 +10,8 @@ **Source code:** :source:`Lib/sunau.py` .. deprecated:: 3.11 - The :mod:`sunau` module is deprecated (see :pep:`594` for details). + The :mod:`sunau` module is deprecated + (see :pep:`PEP 594 <594#sunau>` for details). -------------- diff --git a/Doc/library/telnetlib.rst b/Doc/library/telnetlib.rst index 97b0a713e4422..48a927c8ac96b 100644 --- a/Doc/library/telnetlib.rst +++ b/Doc/library/telnetlib.rst @@ -12,7 +12,8 @@ .. index:: single: protocol; Telnet .. deprecated:: 3.11 - The :mod:`telnetlib` module is deprecated (see :pep:`594` for details). + The :mod:`telnetlib` module is deprecated + (see :pep:`PEP 594 <594#telnetlib>` for details and alternatives). -------------- diff --git a/Doc/library/uu.rst b/Doc/library/uu.rst index c341bc83dcfed..026ec415c9da6 100644 --- a/Doc/library/uu.rst +++ b/Doc/library/uu.rst @@ -10,7 +10,9 @@ **Source code:** :source:`Lib/uu.py` .. deprecated:: 3.11 - The :mod:`uu` module is deprecated (see :pep:`594` for details). + The :mod:`uu` module is deprecated + (see :pep:`PEP 594 <594#uu-and-the-uu-encoding>` for details). + :mod:`base64` is a modern alternative. -------------- diff --git a/Doc/library/xdrlib.rst b/Doc/library/xdrlib.rst index 060b2e2c60df6..a3124a986524b 100644 --- a/Doc/library/xdrlib.rst +++ b/Doc/library/xdrlib.rst @@ -12,7 +12,8 @@ single: External Data Representation .. deprecated:: 3.11 - The :mod:`xdrlib` module is deprecated (see :pep:`594` for details). + The :mod:`xdrlib` module is deprecated + (see :pep:`PEP 594 <594#xdrlib>` for details). -------------- From webhook-mailer at python.org Fri May 13 16:10:01 2022 From: webhook-mailer at python.org (miss-islington) Date: Fri, 13 May 2022 20:10:01 -0000 Subject: [Python-checkins] gh-92611: Link to PEP 594 sections & add key detail in doc deprecation notices (GH-92612) Message-ID: https://github.com/python/cpython/commit/9a97a89b3d051a9819e26f4dae7efb10daaa77cd commit: 9a97a89b3d051a9819e26f4dae7efb10daaa77cd branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-13T13:09:53-07:00 summary: gh-92611: Link to PEP 594 sections & add key detail in doc deprecation notices (GH-92612) (cherry picked from commit 9f68dab3d327335b938046c50b4f09944e993cc8) Co-authored-by: CAM Gerlach files: M Doc/library/aifc.rst M Doc/library/asynchat.rst M Doc/library/asyncore.rst M Doc/library/audioop.rst M Doc/library/cgi.rst M Doc/library/cgitb.rst M Doc/library/chunk.rst M Doc/library/crypt.rst M Doc/library/imghdr.rst M Doc/library/mailcap.rst M Doc/library/msilib.rst M Doc/library/nis.rst M Doc/library/ossaudiodev.rst M Doc/library/pipes.rst M Doc/library/smtpd.rst M Doc/library/sndhdr.rst M Doc/library/spwd.rst M Doc/library/sunau.rst M Doc/library/telnetlib.rst M Doc/library/uu.rst M Doc/library/xdrlib.rst diff --git a/Doc/library/aifc.rst b/Doc/library/aifc.rst index edb4bf86e5a0a..fa277857574a3 100644 --- a/Doc/library/aifc.rst +++ b/Doc/library/aifc.rst @@ -14,7 +14,8 @@ .. deprecated:: 3.11 - The :mod:`aifc` module is deprecated (see :pep:`594` for details). + The :mod:`aifc` module is deprecated + (see :pep:`PEP 594 <594#aifc>` for details). -------------- diff --git a/Doc/library/asynchat.rst b/Doc/library/asynchat.rst index 4354444a1d331..7cc9d99779bbb 100644 --- a/Doc/library/asynchat.rst +++ b/Doc/library/asynchat.rst @@ -11,7 +11,8 @@ **Source code:** :source:`Lib/asynchat.py` .. deprecated:: 3.6 - :mod:`asynchat` will be removed in Python 3.12 (:pep:`594`). + :mod:`asynchat` will be removed in Python 3.12 + (see :pep:`PEP 594 <594#asynchat>` for details). Please use :mod:`asyncio` instead. -------------- diff --git a/Doc/library/asyncore.rst b/Doc/library/asyncore.rst index e481e13db76f7..a732fd7ba4f15 100644 --- a/Doc/library/asyncore.rst +++ b/Doc/library/asyncore.rst @@ -14,7 +14,8 @@ **Source code:** :source:`Lib/asyncore.py` .. deprecated:: 3.6 - :mod:`asyncore` will be removed in Python 3.12 (:pep:`594`). + :mod:`asyncore` will be removed in Python 3.12 + (see :pep:`PEP 594 <594#asyncore>` for details). Please use :mod:`asyncio` instead. -------------- diff --git a/Doc/library/audioop.rst b/Doc/library/audioop.rst index eae206084f090..649c99e796282 100644 --- a/Doc/library/audioop.rst +++ b/Doc/library/audioop.rst @@ -6,7 +6,8 @@ :deprecated: .. deprecated:: 3.11 - The :mod:`audioop` module is deprecated (see :pep:`594` for details). + The :mod:`audioop` module is deprecated + (see :pep:`PEP 594 <594#audioop>` for details). -------------- diff --git a/Doc/library/cgi.rst b/Doc/library/cgi.rst index 7e697408af07b..31c03dee91ea8 100644 --- a/Doc/library/cgi.rst +++ b/Doc/library/cgi.rst @@ -16,7 +16,8 @@ single: Common Gateway Interface .. deprecated:: 3.11 - The :mod:`cgi` module is deprecated (see :pep:`594` for details). + The :mod:`cgi` module is deprecated + (see :pep:`PEP 594 <594#cgi>` for details and alternatives). -------------- diff --git a/Doc/library/cgitb.rst b/Doc/library/cgitb.rst index 349414610bd40..3b0b106abacd5 100644 --- a/Doc/library/cgitb.rst +++ b/Doc/library/cgitb.rst @@ -17,7 +17,8 @@ single: tracebacks; in CGI scripts .. deprecated:: 3.11 - The :mod:`cgitb` module is deprecated (see :pep:`594` for details). + The :mod:`cgitb` module is deprecated + (see :pep:`PEP 594 <594#cgitb>` for details). -------------- diff --git a/Doc/library/chunk.rst b/Doc/library/chunk.rst index 7999420f536d7..5a84c8904f714 100644 --- a/Doc/library/chunk.rst +++ b/Doc/library/chunk.rst @@ -18,7 +18,8 @@ single: RMFF .. deprecated:: 3.11 - The :mod:`chunk` module is deprecated (see :pep:`594` for details). + The :mod:`chunk` module is deprecated + (see :pep:`PEP 594 <594#chunk>` for details). -------------- diff --git a/Doc/library/crypt.rst b/Doc/library/crypt.rst index 3189ece048a26..e795f10f50eec 100644 --- a/Doc/library/crypt.rst +++ b/Doc/library/crypt.rst @@ -17,7 +17,9 @@ pair: cipher; DES .. deprecated:: 3.11 - The :mod:`crypt` module is deprecated (see :pep:`594` for details). + The :mod:`crypt` module is deprecated + (see :pep:`PEP 594 <594#crypt>` for details and alternatives). + The :mod:`hashlib` module is a potential replacement for certain use cases. -------------- diff --git a/Doc/library/imghdr.rst b/Doc/library/imghdr.rst index 084fef73daf28..c17bf897b9be9 100644 --- a/Doc/library/imghdr.rst +++ b/Doc/library/imghdr.rst @@ -8,7 +8,8 @@ **Source code:** :source:`Lib/imghdr.py` .. deprecated:: 3.11 - The :mod:`imghdr` module is deprecated (see :pep:`594` for details). + The :mod:`imghdr` module is deprecated + (see :pep:`PEP 594 <594#imghdr>` for details and alternatives). -------------- diff --git a/Doc/library/mailcap.rst b/Doc/library/mailcap.rst index 416b181f45a77..e2e5bb3445637 100644 --- a/Doc/library/mailcap.rst +++ b/Doc/library/mailcap.rst @@ -8,8 +8,9 @@ **Source code:** :source:`Lib/mailcap.py` .. deprecated:: 3.11 - The :mod:`mailcap` module is deprecated. See :pep:`594` for the rationale - and the :mod:`mimetypes` module for an alternative. + The :mod:`mailcap` module is deprecated + (see :pep:`PEP 594 <594#mailcap>` for details). + The :mod:`mimetypes` module provides an alternative. -------------- diff --git a/Doc/library/msilib.rst b/Doc/library/msilib.rst index b2fa20873fbbf..1ee8130801cba 100644 --- a/Doc/library/msilib.rst +++ b/Doc/library/msilib.rst @@ -14,7 +14,8 @@ .. index:: single: msi .. deprecated:: 3.11 - The :mod:`msilib` module is deprecated (see :pep:`594` for details). + The :mod:`msilib` module is deprecated + (see :pep:`PEP 594 <594#msilib>` for details). -------------- diff --git a/Doc/library/nis.rst b/Doc/library/nis.rst index f6b6ea83946b0..49fe62954cce8 100644 --- a/Doc/library/nis.rst +++ b/Doc/library/nis.rst @@ -11,7 +11,8 @@ .. sectionauthor:: Moshe Zadka .. deprecated:: 3.11 - The :mod:`nis` module is deprecated (see :pep:`594` for details). + The :mod:`nis` module is deprecated + (see :pep:`PEP 594 <594#nis>` for details). -------------- diff --git a/Doc/library/ossaudiodev.rst b/Doc/library/ossaudiodev.rst index e0f0a6b8259e4..728ee3036057d 100644 --- a/Doc/library/ossaudiodev.rst +++ b/Doc/library/ossaudiodev.rst @@ -7,7 +7,8 @@ :deprecated: .. deprecated:: 3.11 - The :mod:`ossaudiodev` module is deprecated (see :pep:`594` for details). + The :mod:`ossaudiodev` module is deprecated + (see :pep:`PEP 594 <594#ossaudiodev>` for details). -------------- diff --git a/Doc/library/pipes.rst b/Doc/library/pipes.rst index 4de8c51bcae04..1c5bb8bddaafb 100644 --- a/Doc/library/pipes.rst +++ b/Doc/library/pipes.rst @@ -11,7 +11,9 @@ **Source code:** :source:`Lib/pipes.py` .. deprecated:: 3.11 - The :mod:`pipes` module is deprecated (see :pep:`594` for details). + The :mod:`pipes` module is deprecated + (see :pep:`PEP 594 <594#pipes>` for details). + Please use the :mod:`subprocess` module instead. -------------- diff --git a/Doc/library/smtpd.rst b/Doc/library/smtpd.rst index 6b37a0517063d..121790b5ed0dd 100644 --- a/Doc/library/smtpd.rst +++ b/Doc/library/smtpd.rst @@ -15,7 +15,8 @@ This module offers several classes to implement SMTP (email) servers. .. deprecated:: 3.6 - :mod:`smtpd` will be removed in Python 3.12 (:pep:`594`). + :mod:`smtpd` will be removed in Python 3.12 + (see :pep:`PEP 594 <594#smtpd>` for details). The `aiosmtpd `_ package is a recommended replacement for this module. It is based on :mod:`asyncio` and provides a more straightforward API. diff --git a/Doc/library/sndhdr.rst b/Doc/library/sndhdr.rst index 41bce18b9cd84..3ca36f270dade 100644 --- a/Doc/library/sndhdr.rst +++ b/Doc/library/sndhdr.rst @@ -15,7 +15,8 @@ single: u-LAW .. deprecated:: 3.11 - The :mod:`sndhdr` module is deprecated (see :pep:`594` for details). + The :mod:`sndhdr` module is deprecated + (see :pep:`PEP 594 <594#sndhdr>` for details and alternatives). -------------- diff --git a/Doc/library/spwd.rst b/Doc/library/spwd.rst index cb31a10a52e00..40f50de07babf 100644 --- a/Doc/library/spwd.rst +++ b/Doc/library/spwd.rst @@ -7,7 +7,8 @@ :deprecated: .. deprecated:: 3.11 - The :mod:`spwd` module is deprecated (see :pep:`594` for details). + The :mod:`spwd` module is deprecated + (see :pep:`PEP 594 <594#spwd>` for details and alternatives). -------------- diff --git a/Doc/library/sunau.rst b/Doc/library/sunau.rst index cfb1257f58548..b4d996e67e17c 100644 --- a/Doc/library/sunau.rst +++ b/Doc/library/sunau.rst @@ -10,7 +10,8 @@ **Source code:** :source:`Lib/sunau.py` .. deprecated:: 3.11 - The :mod:`sunau` module is deprecated (see :pep:`594` for details). + The :mod:`sunau` module is deprecated + (see :pep:`PEP 594 <594#sunau>` for details). -------------- diff --git a/Doc/library/telnetlib.rst b/Doc/library/telnetlib.rst index 97b0a713e4422..48a927c8ac96b 100644 --- a/Doc/library/telnetlib.rst +++ b/Doc/library/telnetlib.rst @@ -12,7 +12,8 @@ .. index:: single: protocol; Telnet .. deprecated:: 3.11 - The :mod:`telnetlib` module is deprecated (see :pep:`594` for details). + The :mod:`telnetlib` module is deprecated + (see :pep:`PEP 594 <594#telnetlib>` for details and alternatives). -------------- diff --git a/Doc/library/uu.rst b/Doc/library/uu.rst index c341bc83dcfed..026ec415c9da6 100644 --- a/Doc/library/uu.rst +++ b/Doc/library/uu.rst @@ -10,7 +10,9 @@ **Source code:** :source:`Lib/uu.py` .. deprecated:: 3.11 - The :mod:`uu` module is deprecated (see :pep:`594` for details). + The :mod:`uu` module is deprecated + (see :pep:`PEP 594 <594#uu-and-the-uu-encoding>` for details). + :mod:`base64` is a modern alternative. -------------- diff --git a/Doc/library/xdrlib.rst b/Doc/library/xdrlib.rst index 060b2e2c60df6..a3124a986524b 100644 --- a/Doc/library/xdrlib.rst +++ b/Doc/library/xdrlib.rst @@ -12,7 +12,8 @@ single: External Data Representation .. deprecated:: 3.11 - The :mod:`xdrlib` module is deprecated (see :pep:`594` for details). + The :mod:`xdrlib` module is deprecated + (see :pep:`PEP 594 <594#xdrlib>` for details). -------------- From webhook-mailer at python.org Fri May 13 16:11:10 2022 From: webhook-mailer at python.org (miss-islington) Date: Fri, 13 May 2022 20:11:10 -0000 Subject: [Python-checkins] gh-92611: Link to PEP 594 sections & add key detail in doc deprecation notices (GH-92612) Message-ID: https://github.com/python/cpython/commit/597ff241889f975a3ccc286ddb1258208dc57aea commit: 597ff241889f975a3ccc286ddb1258208dc57aea branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-13T13:11:05-07:00 summary: gh-92611: Link to PEP 594 sections & add key detail in doc deprecation notices (GH-92612) (cherry picked from commit 9f68dab3d327335b938046c50b4f09944e993cc8) Co-authored-by: CAM Gerlach files: M Doc/library/aifc.rst M Doc/library/asynchat.rst M Doc/library/asyncore.rst M Doc/library/audioop.rst M Doc/library/cgi.rst M Doc/library/cgitb.rst M Doc/library/chunk.rst M Doc/library/crypt.rst M Doc/library/imghdr.rst M Doc/library/mailcap.rst M Doc/library/msilib.rst M Doc/library/nis.rst M Doc/library/ossaudiodev.rst M Doc/library/pipes.rst M Doc/library/smtpd.rst M Doc/library/sndhdr.rst M Doc/library/spwd.rst M Doc/library/sunau.rst M Doc/library/telnetlib.rst M Doc/library/uu.rst M Doc/library/xdrlib.rst diff --git a/Doc/library/aifc.rst b/Doc/library/aifc.rst index edb4bf86e5a0a..fa277857574a3 100644 --- a/Doc/library/aifc.rst +++ b/Doc/library/aifc.rst @@ -14,7 +14,8 @@ .. deprecated:: 3.11 - The :mod:`aifc` module is deprecated (see :pep:`594` for details). + The :mod:`aifc` module is deprecated + (see :pep:`PEP 594 <594#aifc>` for details). -------------- diff --git a/Doc/library/asynchat.rst b/Doc/library/asynchat.rst index 4354444a1d331..7cc9d99779bbb 100644 --- a/Doc/library/asynchat.rst +++ b/Doc/library/asynchat.rst @@ -11,7 +11,8 @@ **Source code:** :source:`Lib/asynchat.py` .. deprecated:: 3.6 - :mod:`asynchat` will be removed in Python 3.12 (:pep:`594`). + :mod:`asynchat` will be removed in Python 3.12 + (see :pep:`PEP 594 <594#asynchat>` for details). Please use :mod:`asyncio` instead. -------------- diff --git a/Doc/library/asyncore.rst b/Doc/library/asyncore.rst index e481e13db76f7..a732fd7ba4f15 100644 --- a/Doc/library/asyncore.rst +++ b/Doc/library/asyncore.rst @@ -14,7 +14,8 @@ **Source code:** :source:`Lib/asyncore.py` .. deprecated:: 3.6 - :mod:`asyncore` will be removed in Python 3.12 (:pep:`594`). + :mod:`asyncore` will be removed in Python 3.12 + (see :pep:`PEP 594 <594#asyncore>` for details). Please use :mod:`asyncio` instead. -------------- diff --git a/Doc/library/audioop.rst b/Doc/library/audioop.rst index eae206084f090..649c99e796282 100644 --- a/Doc/library/audioop.rst +++ b/Doc/library/audioop.rst @@ -6,7 +6,8 @@ :deprecated: .. deprecated:: 3.11 - The :mod:`audioop` module is deprecated (see :pep:`594` for details). + The :mod:`audioop` module is deprecated + (see :pep:`PEP 594 <594#audioop>` for details). -------------- diff --git a/Doc/library/cgi.rst b/Doc/library/cgi.rst index 306aa8d19ad72..eeb80ed57ef35 100644 --- a/Doc/library/cgi.rst +++ b/Doc/library/cgi.rst @@ -16,7 +16,8 @@ single: Common Gateway Interface .. deprecated:: 3.11 - The :mod:`cgi` module is deprecated (see :pep:`594` for details). + The :mod:`cgi` module is deprecated + (see :pep:`PEP 594 <594#cgi>` for details and alternatives). -------------- diff --git a/Doc/library/cgitb.rst b/Doc/library/cgitb.rst index 349414610bd40..3b0b106abacd5 100644 --- a/Doc/library/cgitb.rst +++ b/Doc/library/cgitb.rst @@ -17,7 +17,8 @@ single: tracebacks; in CGI scripts .. deprecated:: 3.11 - The :mod:`cgitb` module is deprecated (see :pep:`594` for details). + The :mod:`cgitb` module is deprecated + (see :pep:`PEP 594 <594#cgitb>` for details). -------------- diff --git a/Doc/library/chunk.rst b/Doc/library/chunk.rst index 7999420f536d7..5a84c8904f714 100644 --- a/Doc/library/chunk.rst +++ b/Doc/library/chunk.rst @@ -18,7 +18,8 @@ single: RMFF .. deprecated:: 3.11 - The :mod:`chunk` module is deprecated (see :pep:`594` for details). + The :mod:`chunk` module is deprecated + (see :pep:`PEP 594 <594#chunk>` for details). -------------- diff --git a/Doc/library/crypt.rst b/Doc/library/crypt.rst index 3189ece048a26..e795f10f50eec 100644 --- a/Doc/library/crypt.rst +++ b/Doc/library/crypt.rst @@ -17,7 +17,9 @@ pair: cipher; DES .. deprecated:: 3.11 - The :mod:`crypt` module is deprecated (see :pep:`594` for details). + The :mod:`crypt` module is deprecated + (see :pep:`PEP 594 <594#crypt>` for details and alternatives). + The :mod:`hashlib` module is a potential replacement for certain use cases. -------------- diff --git a/Doc/library/imghdr.rst b/Doc/library/imghdr.rst index 084fef73daf28..c17bf897b9be9 100644 --- a/Doc/library/imghdr.rst +++ b/Doc/library/imghdr.rst @@ -8,7 +8,8 @@ **Source code:** :source:`Lib/imghdr.py` .. deprecated:: 3.11 - The :mod:`imghdr` module is deprecated (see :pep:`594` for details). + The :mod:`imghdr` module is deprecated + (see :pep:`PEP 594 <594#imghdr>` for details and alternatives). -------------- diff --git a/Doc/library/mailcap.rst b/Doc/library/mailcap.rst index 416b181f45a77..e2e5bb3445637 100644 --- a/Doc/library/mailcap.rst +++ b/Doc/library/mailcap.rst @@ -8,8 +8,9 @@ **Source code:** :source:`Lib/mailcap.py` .. deprecated:: 3.11 - The :mod:`mailcap` module is deprecated. See :pep:`594` for the rationale - and the :mod:`mimetypes` module for an alternative. + The :mod:`mailcap` module is deprecated + (see :pep:`PEP 594 <594#mailcap>` for details). + The :mod:`mimetypes` module provides an alternative. -------------- diff --git a/Doc/library/msilib.rst b/Doc/library/msilib.rst index 5ce18a1f75fc2..0eba2275c8e05 100644 --- a/Doc/library/msilib.rst +++ b/Doc/library/msilib.rst @@ -14,7 +14,8 @@ .. index:: single: msi .. deprecated:: 3.11 - The :mod:`msilib` module is deprecated (see :pep:`594` for details). + The :mod:`msilib` module is deprecated + (see :pep:`PEP 594 <594#msilib>` for details). -------------- diff --git a/Doc/library/nis.rst b/Doc/library/nis.rst index f6b6ea83946b0..49fe62954cce8 100644 --- a/Doc/library/nis.rst +++ b/Doc/library/nis.rst @@ -11,7 +11,8 @@ .. sectionauthor:: Moshe Zadka .. deprecated:: 3.11 - The :mod:`nis` module is deprecated (see :pep:`594` for details). + The :mod:`nis` module is deprecated + (see :pep:`PEP 594 <594#nis>` for details). -------------- diff --git a/Doc/library/ossaudiodev.rst b/Doc/library/ossaudiodev.rst index e0f0a6b8259e4..728ee3036057d 100644 --- a/Doc/library/ossaudiodev.rst +++ b/Doc/library/ossaudiodev.rst @@ -7,7 +7,8 @@ :deprecated: .. deprecated:: 3.11 - The :mod:`ossaudiodev` module is deprecated (see :pep:`594` for details). + The :mod:`ossaudiodev` module is deprecated + (see :pep:`PEP 594 <594#ossaudiodev>` for details). -------------- diff --git a/Doc/library/pipes.rst b/Doc/library/pipes.rst index 4de8c51bcae04..1c5bb8bddaafb 100644 --- a/Doc/library/pipes.rst +++ b/Doc/library/pipes.rst @@ -11,7 +11,9 @@ **Source code:** :source:`Lib/pipes.py` .. deprecated:: 3.11 - The :mod:`pipes` module is deprecated (see :pep:`594` for details). + The :mod:`pipes` module is deprecated + (see :pep:`PEP 594 <594#pipes>` for details). + Please use the :mod:`subprocess` module instead. -------------- diff --git a/Doc/library/smtpd.rst b/Doc/library/smtpd.rst index a39bc024047fd..8fd009e5b2365 100644 --- a/Doc/library/smtpd.rst +++ b/Doc/library/smtpd.rst @@ -15,7 +15,8 @@ This module offers several classes to implement SMTP (email) servers. .. deprecated:: 3.6 - :mod:`smtpd` will be removed in Python 3.12 (:pep:`594`). + :mod:`smtpd` will be removed in Python 3.12 + (see :pep:`PEP 594 <594#smtpd>` for details). The `aiosmtpd `_ package is a recommended replacement for this module. It is based on :mod:`asyncio` and provides a more straightforward API. diff --git a/Doc/library/sndhdr.rst b/Doc/library/sndhdr.rst index 41bce18b9cd84..3ca36f270dade 100644 --- a/Doc/library/sndhdr.rst +++ b/Doc/library/sndhdr.rst @@ -15,7 +15,8 @@ single: u-LAW .. deprecated:: 3.11 - The :mod:`sndhdr` module is deprecated (see :pep:`594` for details). + The :mod:`sndhdr` module is deprecated + (see :pep:`PEP 594 <594#sndhdr>` for details and alternatives). -------------- diff --git a/Doc/library/spwd.rst b/Doc/library/spwd.rst index cb31a10a52e00..40f50de07babf 100644 --- a/Doc/library/spwd.rst +++ b/Doc/library/spwd.rst @@ -7,7 +7,8 @@ :deprecated: .. deprecated:: 3.11 - The :mod:`spwd` module is deprecated (see :pep:`594` for details). + The :mod:`spwd` module is deprecated + (see :pep:`PEP 594 <594#spwd>` for details and alternatives). -------------- diff --git a/Doc/library/sunau.rst b/Doc/library/sunau.rst index cfb1257f58548..b4d996e67e17c 100644 --- a/Doc/library/sunau.rst +++ b/Doc/library/sunau.rst @@ -10,7 +10,8 @@ **Source code:** :source:`Lib/sunau.py` .. deprecated:: 3.11 - The :mod:`sunau` module is deprecated (see :pep:`594` for details). + The :mod:`sunau` module is deprecated + (see :pep:`PEP 594 <594#sunau>` for details). -------------- diff --git a/Doc/library/telnetlib.rst b/Doc/library/telnetlib.rst index 97b0a713e4422..48a927c8ac96b 100644 --- a/Doc/library/telnetlib.rst +++ b/Doc/library/telnetlib.rst @@ -12,7 +12,8 @@ .. index:: single: protocol; Telnet .. deprecated:: 3.11 - The :mod:`telnetlib` module is deprecated (see :pep:`594` for details). + The :mod:`telnetlib` module is deprecated + (see :pep:`PEP 594 <594#telnetlib>` for details and alternatives). -------------- diff --git a/Doc/library/uu.rst b/Doc/library/uu.rst index c341bc83dcfed..026ec415c9da6 100644 --- a/Doc/library/uu.rst +++ b/Doc/library/uu.rst @@ -10,7 +10,9 @@ **Source code:** :source:`Lib/uu.py` .. deprecated:: 3.11 - The :mod:`uu` module is deprecated (see :pep:`594` for details). + The :mod:`uu` module is deprecated + (see :pep:`PEP 594 <594#uu-and-the-uu-encoding>` for details). + :mod:`base64` is a modern alternative. -------------- diff --git a/Doc/library/xdrlib.rst b/Doc/library/xdrlib.rst index 060b2e2c60df6..a3124a986524b 100644 --- a/Doc/library/xdrlib.rst +++ b/Doc/library/xdrlib.rst @@ -12,7 +12,8 @@ single: External Data Representation .. deprecated:: 3.11 - The :mod:`xdrlib` module is deprecated (see :pep:`594` for details). + The :mod:`xdrlib` module is deprecated + (see :pep:`PEP 594 <594#xdrlib>` for details). -------------- From webhook-mailer at python.org Fri May 13 16:13:12 2022 From: webhook-mailer at python.org (miss-islington) Date: Fri, 13 May 2022 20:13:12 -0000 Subject: [Python-checkins] gh-92611: Link to PEP 594 sections & add key detail in doc deprecation notices (GH-92612) Message-ID: https://github.com/python/cpython/commit/1aafad19090fbc3c3e03977a0828d0d191bc6bdf commit: 1aafad19090fbc3c3e03977a0828d0d191bc6bdf branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-13T13:13:02-07:00 summary: gh-92611: Link to PEP 594 sections & add key detail in doc deprecation notices (GH-92612) (cherry picked from commit 9f68dab3d327335b938046c50b4f09944e993cc8) Co-authored-by: CAM Gerlach files: M Doc/library/aifc.rst M Doc/library/asynchat.rst M Doc/library/asyncore.rst M Doc/library/audioop.rst M Doc/library/cgi.rst M Doc/library/cgitb.rst M Doc/library/chunk.rst M Doc/library/crypt.rst M Doc/library/imghdr.rst M Doc/library/mailcap.rst M Doc/library/msilib.rst M Doc/library/nis.rst M Doc/library/ossaudiodev.rst M Doc/library/pipes.rst M Doc/library/smtpd.rst M Doc/library/sndhdr.rst M Doc/library/spwd.rst M Doc/library/sunau.rst M Doc/library/telnetlib.rst M Doc/library/uu.rst M Doc/library/xdrlib.rst diff --git a/Doc/library/aifc.rst b/Doc/library/aifc.rst index edb4bf86e5a0a..fa277857574a3 100644 --- a/Doc/library/aifc.rst +++ b/Doc/library/aifc.rst @@ -14,7 +14,8 @@ .. deprecated:: 3.11 - The :mod:`aifc` module is deprecated (see :pep:`594` for details). + The :mod:`aifc` module is deprecated + (see :pep:`PEP 594 <594#aifc>` for details). -------------- diff --git a/Doc/library/asynchat.rst b/Doc/library/asynchat.rst index 4354444a1d331..7cc9d99779bbb 100644 --- a/Doc/library/asynchat.rst +++ b/Doc/library/asynchat.rst @@ -11,7 +11,8 @@ **Source code:** :source:`Lib/asynchat.py` .. deprecated:: 3.6 - :mod:`asynchat` will be removed in Python 3.12 (:pep:`594`). + :mod:`asynchat` will be removed in Python 3.12 + (see :pep:`PEP 594 <594#asynchat>` for details). Please use :mod:`asyncio` instead. -------------- diff --git a/Doc/library/asyncore.rst b/Doc/library/asyncore.rst index e481e13db76f7..a732fd7ba4f15 100644 --- a/Doc/library/asyncore.rst +++ b/Doc/library/asyncore.rst @@ -14,7 +14,8 @@ **Source code:** :source:`Lib/asyncore.py` .. deprecated:: 3.6 - :mod:`asyncore` will be removed in Python 3.12 (:pep:`594`). + :mod:`asyncore` will be removed in Python 3.12 + (see :pep:`PEP 594 <594#asyncore>` for details). Please use :mod:`asyncio` instead. -------------- diff --git a/Doc/library/audioop.rst b/Doc/library/audioop.rst index eae206084f090..649c99e796282 100644 --- a/Doc/library/audioop.rst +++ b/Doc/library/audioop.rst @@ -6,7 +6,8 @@ :deprecated: .. deprecated:: 3.11 - The :mod:`audioop` module is deprecated (see :pep:`594` for details). + The :mod:`audioop` module is deprecated + (see :pep:`PEP 594 <594#audioop>` for details). -------------- diff --git a/Doc/library/cgi.rst b/Doc/library/cgi.rst index 80c4d8033130c..5744ee548c966 100644 --- a/Doc/library/cgi.rst +++ b/Doc/library/cgi.rst @@ -16,7 +16,8 @@ single: Common Gateway Interface .. deprecated:: 3.11 - The :mod:`cgi` module is deprecated (see :pep:`594` for details). + The :mod:`cgi` module is deprecated + (see :pep:`PEP 594 <594#cgi>` for details and alternatives). -------------- diff --git a/Doc/library/cgitb.rst b/Doc/library/cgitb.rst index 349414610bd40..3b0b106abacd5 100644 --- a/Doc/library/cgitb.rst +++ b/Doc/library/cgitb.rst @@ -17,7 +17,8 @@ single: tracebacks; in CGI scripts .. deprecated:: 3.11 - The :mod:`cgitb` module is deprecated (see :pep:`594` for details). + The :mod:`cgitb` module is deprecated + (see :pep:`PEP 594 <594#cgitb>` for details). -------------- diff --git a/Doc/library/chunk.rst b/Doc/library/chunk.rst index 7999420f536d7..5a84c8904f714 100644 --- a/Doc/library/chunk.rst +++ b/Doc/library/chunk.rst @@ -18,7 +18,8 @@ single: RMFF .. deprecated:: 3.11 - The :mod:`chunk` module is deprecated (see :pep:`594` for details). + The :mod:`chunk` module is deprecated + (see :pep:`PEP 594 <594#chunk>` for details). -------------- diff --git a/Doc/library/crypt.rst b/Doc/library/crypt.rst index 3189ece048a26..e795f10f50eec 100644 --- a/Doc/library/crypt.rst +++ b/Doc/library/crypt.rst @@ -17,7 +17,9 @@ pair: cipher; DES .. deprecated:: 3.11 - The :mod:`crypt` module is deprecated (see :pep:`594` for details). + The :mod:`crypt` module is deprecated + (see :pep:`PEP 594 <594#crypt>` for details and alternatives). + The :mod:`hashlib` module is a potential replacement for certain use cases. -------------- diff --git a/Doc/library/imghdr.rst b/Doc/library/imghdr.rst index f63a0fa56fd26..186480be3e97a 100644 --- a/Doc/library/imghdr.rst +++ b/Doc/library/imghdr.rst @@ -8,7 +8,8 @@ **Source code:** :source:`Lib/imghdr.py` .. deprecated:: 3.11 - The :mod:`imghdr` module is deprecated (see :pep:`594` for details). + The :mod:`imghdr` module is deprecated + (see :pep:`PEP 594 <594#imghdr>` for details and alternatives). -------------- diff --git a/Doc/library/mailcap.rst b/Doc/library/mailcap.rst index cd5ab0b32f49c..a22b5b9c9e7b7 100644 --- a/Doc/library/mailcap.rst +++ b/Doc/library/mailcap.rst @@ -8,8 +8,9 @@ **Source code:** :source:`Lib/mailcap.py` .. deprecated:: 3.11 - The :mod:`mailcap` module is deprecated. See :pep:`594` for the rationale - and the :mod:`mimetypes` module for an alternative. + The :mod:`mailcap` module is deprecated + (see :pep:`PEP 594 <594#mailcap>` for details). + The :mod:`mimetypes` module provides an alternative. -------------- diff --git a/Doc/library/msilib.rst b/Doc/library/msilib.rst index 5ce18a1f75fc2..0eba2275c8e05 100644 --- a/Doc/library/msilib.rst +++ b/Doc/library/msilib.rst @@ -14,7 +14,8 @@ .. index:: single: msi .. deprecated:: 3.11 - The :mod:`msilib` module is deprecated (see :pep:`594` for details). + The :mod:`msilib` module is deprecated + (see :pep:`PEP 594 <594#msilib>` for details). -------------- diff --git a/Doc/library/nis.rst b/Doc/library/nis.rst index f6b6ea83946b0..49fe62954cce8 100644 --- a/Doc/library/nis.rst +++ b/Doc/library/nis.rst @@ -11,7 +11,8 @@ .. sectionauthor:: Moshe Zadka .. deprecated:: 3.11 - The :mod:`nis` module is deprecated (see :pep:`594` for details). + The :mod:`nis` module is deprecated + (see :pep:`PEP 594 <594#nis>` for details). -------------- diff --git a/Doc/library/ossaudiodev.rst b/Doc/library/ossaudiodev.rst index e0f0a6b8259e4..728ee3036057d 100644 --- a/Doc/library/ossaudiodev.rst +++ b/Doc/library/ossaudiodev.rst @@ -7,7 +7,8 @@ :deprecated: .. deprecated:: 3.11 - The :mod:`ossaudiodev` module is deprecated (see :pep:`594` for details). + The :mod:`ossaudiodev` module is deprecated + (see :pep:`PEP 594 <594#ossaudiodev>` for details). -------------- diff --git a/Doc/library/pipes.rst b/Doc/library/pipes.rst index 25f808566ecf9..bc21c097f7b86 100644 --- a/Doc/library/pipes.rst +++ b/Doc/library/pipes.rst @@ -11,7 +11,9 @@ **Source code:** :source:`Lib/pipes.py` .. deprecated:: 3.11 - The :mod:`pipes` module is deprecated (see :pep:`594` for details). + The :mod:`pipes` module is deprecated + (see :pep:`PEP 594 <594#pipes>` for details). + Please use the :mod:`subprocess` module instead. -------------- diff --git a/Doc/library/smtpd.rst b/Doc/library/smtpd.rst index a39bc024047fd..8fd009e5b2365 100644 --- a/Doc/library/smtpd.rst +++ b/Doc/library/smtpd.rst @@ -15,7 +15,8 @@ This module offers several classes to implement SMTP (email) servers. .. deprecated:: 3.6 - :mod:`smtpd` will be removed in Python 3.12 (:pep:`594`). + :mod:`smtpd` will be removed in Python 3.12 + (see :pep:`PEP 594 <594#smtpd>` for details). The `aiosmtpd `_ package is a recommended replacement for this module. It is based on :mod:`asyncio` and provides a more straightforward API. diff --git a/Doc/library/sndhdr.rst b/Doc/library/sndhdr.rst index 41bce18b9cd84..3ca36f270dade 100644 --- a/Doc/library/sndhdr.rst +++ b/Doc/library/sndhdr.rst @@ -15,7 +15,8 @@ single: u-LAW .. deprecated:: 3.11 - The :mod:`sndhdr` module is deprecated (see :pep:`594` for details). + The :mod:`sndhdr` module is deprecated + (see :pep:`PEP 594 <594#sndhdr>` for details and alternatives). -------------- diff --git a/Doc/library/spwd.rst b/Doc/library/spwd.rst index cb31a10a52e00..40f50de07babf 100644 --- a/Doc/library/spwd.rst +++ b/Doc/library/spwd.rst @@ -7,7 +7,8 @@ :deprecated: .. deprecated:: 3.11 - The :mod:`spwd` module is deprecated (see :pep:`594` for details). + The :mod:`spwd` module is deprecated + (see :pep:`PEP 594 <594#spwd>` for details and alternatives). -------------- diff --git a/Doc/library/sunau.rst b/Doc/library/sunau.rst index cfb1257f58548..b4d996e67e17c 100644 --- a/Doc/library/sunau.rst +++ b/Doc/library/sunau.rst @@ -10,7 +10,8 @@ **Source code:** :source:`Lib/sunau.py` .. deprecated:: 3.11 - The :mod:`sunau` module is deprecated (see :pep:`594` for details). + The :mod:`sunau` module is deprecated + (see :pep:`PEP 594 <594#sunau>` for details). -------------- diff --git a/Doc/library/telnetlib.rst b/Doc/library/telnetlib.rst index 97b0a713e4422..48a927c8ac96b 100644 --- a/Doc/library/telnetlib.rst +++ b/Doc/library/telnetlib.rst @@ -12,7 +12,8 @@ .. index:: single: protocol; Telnet .. deprecated:: 3.11 - The :mod:`telnetlib` module is deprecated (see :pep:`594` for details). + The :mod:`telnetlib` module is deprecated + (see :pep:`PEP 594 <594#telnetlib>` for details and alternatives). -------------- diff --git a/Doc/library/uu.rst b/Doc/library/uu.rst index c341bc83dcfed..026ec415c9da6 100644 --- a/Doc/library/uu.rst +++ b/Doc/library/uu.rst @@ -10,7 +10,9 @@ **Source code:** :source:`Lib/uu.py` .. deprecated:: 3.11 - The :mod:`uu` module is deprecated (see :pep:`594` for details). + The :mod:`uu` module is deprecated + (see :pep:`PEP 594 <594#uu-and-the-uu-encoding>` for details). + :mod:`base64` is a modern alternative. -------------- diff --git a/Doc/library/xdrlib.rst b/Doc/library/xdrlib.rst index 060b2e2c60df6..a3124a986524b 100644 --- a/Doc/library/xdrlib.rst +++ b/Doc/library/xdrlib.rst @@ -12,7 +12,8 @@ single: External Data Representation .. deprecated:: 3.11 - The :mod:`xdrlib` module is deprecated (see :pep:`594` for details). + The :mod:`xdrlib` module is deprecated + (see :pep:`PEP 594 <594#xdrlib>` for details). -------------- From webhook-mailer at python.org Fri May 13 17:09:26 2022 From: webhook-mailer at python.org (rhettinger) Date: Fri, 13 May 2022 21:09:26 -0000 Subject: [Python-checkins] Fix typo in argparse docs. (GH-92691) (#92729) Message-ID: https://github.com/python/cpython/commit/56e9fb3e3b1c51c9c32dda9d51f0379f711bc7d7 commit: 56e9fb3e3b1c51c9c32dda9d51f0379f711bc7d7 branch: 3.10 author: thueringa committer: rhettinger date: 2022-05-13T16:09:06-05:00 summary: Fix typo in argparse docs. (GH-92691) (#92729) files: M Doc/library/argparse.rst diff --git a/Doc/library/argparse.rst b/Doc/library/argparse.rst index d853d2afbe372..e8e54d6c58df3 100644 --- a/Doc/library/argparse.rst +++ b/Doc/library/argparse.rst @@ -502,7 +502,7 @@ disallowed. fromfile_prefix_chars ^^^^^^^^^^^^^^^^^^^^^ -Sometimes, for example when dealing with a particularly long argument lists, it +Sometimes, for example when dealing with a particularly long argument list, it may make sense to keep the list of arguments in a file rather than typing it out at the command line. If the ``fromfile_prefix_chars=`` argument is given to the :class:`ArgumentParser` constructor, then arguments that start with any of the From webhook-mailer at python.org Sat May 14 02:19:05 2022 From: webhook-mailer at python.org (miss-islington) Date: Sat, 14 May 2022 06:19:05 -0000 Subject: [Python-checkins] gh-92311: Add tests for frame_setlineno jumping over listcomps (GH-92741) Message-ID: https://github.com/python/cpython/commit/964067635602d1be5782b68a44123d59f3b92520 commit: 964067635602d1be5782b68a44123d59f3b92520 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-13T23:19:00-07:00 summary: gh-92311: Add tests for frame_setlineno jumping over listcomps (GH-92741) (cherry picked from commit 8cf2906828b4ea281ea5381bf59b9052bae99f53) Co-authored-by: Dennis Sweeney <36520290+sweeneyde at users.noreply.github.com> files: M Lib/test/test_sys_settrace.py diff --git a/Lib/test/test_sys_settrace.py b/Lib/test/test_sys_settrace.py index 1a67fa673dd64..9cc6bcfcab5e1 100644 --- a/Lib/test/test_sys_settrace.py +++ b/Lib/test/test_sys_settrace.py @@ -2484,6 +2484,54 @@ def gen(): next(gen()) output.append(5) + @jump_test(2, 3, [1, 3]) + def test_jump_forward_over_listcomp(output): + output.append(1) + x = [i for i in range(10)] + output.append(3) + + # checking for segfaults. + # See https://github.com/python/cpython/issues/92311 + @jump_test(3, 1, []) + def test_jump_backward_over_listcomp(output): + a = 1 + x = [i for i in range(10)] + c = 3 + + @jump_test(8, 2, [2, 7, 2]) + def test_jump_backward_over_listcomp_v2(output): + flag = False + output.append(2) + if flag: + return + x = [i for i in range(5)] + flag = 6 + output.append(7) + output.append(8) + + @async_jump_test(2, 3, [1, 3]) + async def test_jump_forward_over_async_listcomp(output): + output.append(1) + x = [i async for i in asynciter(range(10))] + output.append(3) + + @async_jump_test(3, 1, []) + async def test_jump_backward_over_async_listcomp(output): + a = 1 + x = [i async for i in asynciter(range(10))] + c = 3 + + @async_jump_test(8, 2, [2, 7, 2]) + async def test_jump_backward_over_async_listcomp_v2(output): + flag = False + output.append(2) + if flag: + return + x = [i async for i in asynciter(range(5))] + flag = 6 + output.append(7) + output.append(8) + class TestExtendedArgs(unittest.TestCase): From webhook-mailer at python.org Sat May 14 04:58:54 2022 From: webhook-mailer at python.org (corona10) Date: Sat, 14 May 2022 08:58:54 -0000 Subject: [Python-checkins] gh-90861: Memory optimization for set.issubset (gh-92799) Message-ID: https://github.com/python/cpython/commit/2e8f721c0f275d9d7c018b4a2a66f053cf34bb36 commit: 2e8f721c0f275d9d7c018b4a2a66f053cf34bb36 branch: main author: Dong-hee Na committer: corona10 date: 2022-05-14T17:58:19+09:00 summary: gh-90861: Memory optimization for set.issubset (gh-92799) files: M Objects/setobject.c diff --git a/Objects/setobject.c b/Objects/setobject.c index 4b6a8b8dfb679..dd55a943010ab 100644 --- a/Objects/setobject.c +++ b/Objects/setobject.c @@ -1735,13 +1735,13 @@ set_issubset(PySetObject *so, PyObject *other) int rv; if (!PyAnySet_Check(other)) { - PyObject *tmp, *result; - tmp = make_new_set(&PySet_Type, other); - if (tmp == NULL) + PyObject *tmp = set_intersection(so, other); + if (tmp == NULL) { return NULL; - result = set_issubset(so, tmp); + } + int result = (PySet_GET_SIZE(tmp) == PySet_GET_SIZE(so)); Py_DECREF(tmp); - return result; + return PyBool_FromLong(result); } if (PySet_GET_SIZE(so) > PySet_GET_SIZE(other)) Py_RETURN_FALSE; From webhook-mailer at python.org Sat May 14 10:24:46 2022 From: webhook-mailer at python.org (corona10) Date: Sat, 14 May 2022 14:24:46 -0000 Subject: [Python-checkins] GH-92804: Fix memory leak in memoryview iterator (gh-92805) Message-ID: https://github.com/python/cpython/commit/d923fdf54bc97baece879179ba4971f632b9722b commit: d923fdf54bc97baece879179ba4971f632b9722b branch: main author: Kumar Aditya <59607654+kumaraditya303 at users.noreply.github.com> committer: corona10 date: 2022-05-14T23:24:20+09:00 summary: GH-92804: Fix memory leak in memoryview iterator (gh-92805) files: A Misc/NEWS.d/next/Core and Builtins/2022-05-14-13-22-11.gh-issue-92804.rAqpI2.rst M Objects/memoryobject.c M Objects/object.c diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-14-13-22-11.gh-issue-92804.rAqpI2.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-14-13-22-11.gh-issue-92804.rAqpI2.rst new file mode 100644 index 0000000000000..7a5fd3f6568ea --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-05-14-13-22-11.gh-issue-92804.rAqpI2.rst @@ -0,0 +1 @@ +Fix memory leak in ``memoryview`` iterator as it was not finalized at exit. Patch by Kumar Aditya. diff --git a/Objects/memoryobject.c b/Objects/memoryobject.c index 45fe8985c2adb..8c26916882447 100644 --- a/Objects/memoryobject.c +++ b/Objects/memoryobject.c @@ -3156,7 +3156,7 @@ static PyMethodDef memory_methods[] = { /* Memoryview Iterator */ /**************************************************************************/ -static PyTypeObject PyMemoryIter_Type; +PyTypeObject _PyMemoryIter_Type; typedef struct { PyObject_HEAD @@ -3233,7 +3233,7 @@ memory_iter(PyObject *seq) } memoryiterobject *it; - it = PyObject_GC_New(memoryiterobject, &PyMemoryIter_Type); + it = PyObject_GC_New(memoryiterobject, &_PyMemoryIter_Type); if (it == NULL) { return NULL; } @@ -3246,7 +3246,7 @@ memory_iter(PyObject *seq) return (PyObject *)it; } -static PyTypeObject PyMemoryIter_Type = { +PyTypeObject _PyMemoryIter_Type = { PyVarObject_HEAD_INIT(&PyType_Type, 0) .tp_name = "memory_iterator", .tp_basicsize = sizeof(memoryiterobject), diff --git a/Objects/object.c b/Objects/object.c index 8339ab392fcae..c9bb60eaed87c 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -1845,6 +1845,7 @@ _PyTypes_InitState(PyInterpreterState *interp) extern PyTypeObject PyHKEY_Type; #endif extern PyTypeObject _Py_GenericAliasIterType; +extern PyTypeObject _PyMemoryIter_Type; static PyTypeObject* static_types[] = { // The two most important base types: must be initialized first and @@ -1944,6 +1945,7 @@ static PyTypeObject* static_types[] = { &_PyHamt_Type, &_PyInterpreterID_Type, &_PyManagedBuffer_Type, + &_PyMemoryIter_Type, &_PyMethodWrapper_Type, &_PyNamespace_Type, &_PyNone_Type, From webhook-mailer at python.org Sat May 14 10:55:25 2022 From: webhook-mailer at python.org (miss-islington) Date: Sat, 14 May 2022 14:55:25 -0000 Subject: [Python-checkins] GH-92804: Fix memory leak in memoryview iterator (gh-92805) Message-ID: https://github.com/python/cpython/commit/d9089c0e8b3728adba502389d193e80543741a2b commit: d9089c0e8b3728adba502389d193e80543741a2b branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-14T07:55:03-07:00 summary: GH-92804: Fix memory leak in memoryview iterator (gh-92805) (cherry picked from commit d923fdf54bc97baece879179ba4971f632b9722b) Co-authored-by: Kumar Aditya <59607654+kumaraditya303 at users.noreply.github.com> files: A Misc/NEWS.d/next/Core and Builtins/2022-05-14-13-22-11.gh-issue-92804.rAqpI2.rst M Objects/memoryobject.c M Objects/object.c diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-14-13-22-11.gh-issue-92804.rAqpI2.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-14-13-22-11.gh-issue-92804.rAqpI2.rst new file mode 100644 index 0000000000000..7a5fd3f6568ea --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-05-14-13-22-11.gh-issue-92804.rAqpI2.rst @@ -0,0 +1 @@ +Fix memory leak in ``memoryview`` iterator as it was not finalized at exit. Patch by Kumar Aditya. diff --git a/Objects/memoryobject.c b/Objects/memoryobject.c index 45fe8985c2adb..8c26916882447 100644 --- a/Objects/memoryobject.c +++ b/Objects/memoryobject.c @@ -3156,7 +3156,7 @@ static PyMethodDef memory_methods[] = { /* Memoryview Iterator */ /**************************************************************************/ -static PyTypeObject PyMemoryIter_Type; +PyTypeObject _PyMemoryIter_Type; typedef struct { PyObject_HEAD @@ -3233,7 +3233,7 @@ memory_iter(PyObject *seq) } memoryiterobject *it; - it = PyObject_GC_New(memoryiterobject, &PyMemoryIter_Type); + it = PyObject_GC_New(memoryiterobject, &_PyMemoryIter_Type); if (it == NULL) { return NULL; } @@ -3246,7 +3246,7 @@ memory_iter(PyObject *seq) return (PyObject *)it; } -static PyTypeObject PyMemoryIter_Type = { +PyTypeObject _PyMemoryIter_Type = { PyVarObject_HEAD_INIT(&PyType_Type, 0) .tp_name = "memory_iterator", .tp_basicsize = sizeof(memoryiterobject), diff --git a/Objects/object.c b/Objects/object.c index d5f21b7c6aa19..303a22b6bfd01 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -1845,6 +1845,7 @@ _PyTypes_InitState(PyInterpreterState *interp) extern PyTypeObject PyHKEY_Type; #endif extern PyTypeObject _Py_GenericAliasIterType; +extern PyTypeObject _PyMemoryIter_Type; static PyTypeObject* static_types[] = { // The two most important base types: must be initialized first and @@ -1944,6 +1945,7 @@ static PyTypeObject* static_types[] = { &_PyHamt_Type, &_PyInterpreterID_Type, &_PyManagedBuffer_Type, + &_PyMemoryIter_Type, &_PyMethodWrapper_Type, &_PyNamespace_Type, &_PyNone_Type, From webhook-mailer at python.org Sat May 14 10:59:56 2022 From: webhook-mailer at python.org (miss-islington) Date: Sat, 14 May 2022 14:59:56 -0000 Subject: [Python-checkins] Check result of utc_to_seconds and skip fold probe in pure Python (GH-91582) Message-ID: https://github.com/python/cpython/commit/dae3e2fea39067284724a81d9845e21cfac29e5a commit: dae3e2fea39067284724a81d9845e21cfac29e5a branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-14T07:59:52-07:00 summary: Check result of utc_to_seconds and skip fold probe in pure Python (GH-91582) The `utc_to_seconds` call can fail, here's a minimal reproducer on Linux: TZ=UTC python -c "from datetime import *; datetime.fromtimestamp(253402300799 + 1)" The old behavior still raised an error in a similar way, but only because subsequent calculations happened to fail as well. Better to fail fast. This also refactors the tests to split out the `fromtimestamp` and `utcfromtimestamp` tests, and to get us closer to the actual desired limits of the functions. As part of this, we also changed the way we detect platforms where the same limits don't necessarily apply (e.g. Windows). As part of refactoring the tests to hit this condition explicitly (even though the user-facing behvior doesn't change in any way we plan to guarantee), I noticed that there was a difference in the places that `datetime.utcfromtimestamp` fails in the C and pure Python versions, which was fixed by skipping the "probe for fold" logic for UTC specifically ? since UTC doesn't have any folds or gaps, we were never going to find a fold value anyway. This should prevent some failures in the pure python `utcfromtimestamp` method on timestamps close to 0001-01-01. There are two separate news entries for this because one is a potentially user-facing change, the other is an internal code correctness change that, if anything, changes some error messages. The two happen to be coupled because of the test refactoring, but they are probably best thought of as independent changes. Fixes GH-91581 (cherry picked from commit 83c0247d47b99f4571e35ea95361436e1d2a61cd) Co-authored-by: Paul Ganssle <1377457+pganssle at users.noreply.github.com> files: A Misc/NEWS.d/next/Library/2022-04-15-13-16-25.gh-issue-91581.9OGsrN.rst A Misc/NEWS.d/next/Library/2022-05-11-14-34-09.gh-issue-91581.glkou2.rst M Lib/datetime.py M Lib/test/datetimetester.py M Modules/_datetimemodule.c diff --git a/Lib/datetime.py b/Lib/datetime.py index afbb6fed2ecb6..00ded32cc3e3c 100644 --- a/Lib/datetime.py +++ b/Lib/datetime.py @@ -1754,7 +1754,7 @@ def _fromtimestamp(cls, t, utc, tz): y, m, d, hh, mm, ss, weekday, jday, dst = converter(t) ss = min(ss, 59) # clamp out leap seconds if the platform has them result = cls(y, m, d, hh, mm, ss, us, tz) - if tz is None: + if tz is None and not utc: # As of version 2015f max fold in IANA database is # 23 hours at 1969-09-30 13:00:00 in Kwajalein. # Let's probe 24 hours in the past to detect a transition: @@ -1775,7 +1775,7 @@ def _fromtimestamp(cls, t, utc, tz): probe2 = cls(y, m, d, hh, mm, ss, us, tz) if probe2 == result: result._fold = 1 - else: + elif tz is not None: result = tz.fromutc(result) return result diff --git a/Lib/test/datetimetester.py b/Lib/test/datetimetester.py index 0495362b3f369..8e4bcc7c9efdc 100644 --- a/Lib/test/datetimetester.py +++ b/Lib/test/datetimetester.py @@ -2515,45 +2515,101 @@ def test_microsecond_rounding(self): self.assertEqual(t.microsecond, 7812) def test_timestamp_limits(self): - # minimum timestamp - min_dt = self.theclass.min.replace(tzinfo=timezone.utc) + with self.subTest("minimum UTC"): + min_dt = self.theclass.min.replace(tzinfo=timezone.utc) + min_ts = min_dt.timestamp() + + # This test assumes that datetime.min == 0000-01-01T00:00:00.00 + # If that assumption changes, this value can change as well + self.assertEqual(min_ts, -62135596800) + + with self.subTest("maximum UTC"): + # Zero out microseconds to avoid rounding issues + max_dt = self.theclass.max.replace(tzinfo=timezone.utc, + microsecond=0) + max_ts = max_dt.timestamp() + + # This test assumes that datetime.max == 9999-12-31T23:59:59.999999 + # If that assumption changes, this value can change as well + self.assertEqual(max_ts, 253402300799.0) + + def test_fromtimestamp_limits(self): + try: + self.theclass.fromtimestamp(-2**32 - 1) + except (OSError, OverflowError): + self.skipTest("Test not valid on this platform") + + # XXX: Replace these with datetime.{min,max}.timestamp() when we solve + # the issue with gh-91012 + min_dt = self.theclass.min + timedelta(days=1) min_ts = min_dt.timestamp() + + max_dt = self.theclass.max.replace(microsecond=0) + max_ts = ((self.theclass.max - timedelta(hours=23)).timestamp() + + timedelta(hours=22, minutes=59, seconds=59).total_seconds()) + + for (test_name, ts, expected) in [ + ("minimum", min_ts, min_dt), + ("maximum", max_ts, max_dt), + ]: + with self.subTest(test_name, ts=ts, expected=expected): + actual = self.theclass.fromtimestamp(ts) + + self.assertEqual(actual, expected) + + # Test error conditions + test_cases = [ + ("Too small by a little", min_ts - timedelta(days=1, hours=12).total_seconds()), + ("Too small by a lot", min_ts - timedelta(days=400).total_seconds()), + ("Too big by a little", max_ts + timedelta(days=1).total_seconds()), + ("Too big by a lot", max_ts + timedelta(days=400).total_seconds()), + ] + + for test_name, ts in test_cases: + with self.subTest(test_name, ts=ts): + with self.assertRaises((ValueError, OverflowError)): + # converting a Python int to C time_t can raise a + # OverflowError, especially on 32-bit platforms. + self.theclass.fromtimestamp(ts) + + def test_utcfromtimestamp_limits(self): try: - # date 0001-01-01 00:00:00+00:00: timestamp=-62135596800 - self.assertEqual(self.theclass.fromtimestamp(min_ts, tz=timezone.utc), - min_dt) - except (OverflowError, OSError) as exc: - # the date 0001-01-01 doesn't fit into 32-bit time_t, - # or platform doesn't support such very old date - self.skipTest(str(exc)) - - # maximum timestamp: set seconds to zero to avoid rounding issues - max_dt = self.theclass.max.replace(tzinfo=timezone.utc, - second=0, microsecond=0) + self.theclass.utcfromtimestamp(-2**32 - 1) + except (OSError, OverflowError): + self.skipTest("Test not valid on this platform") + + min_dt = self.theclass.min.replace(tzinfo=timezone.utc) + min_ts = min_dt.timestamp() + + max_dt = self.theclass.max.replace(microsecond=0, tzinfo=timezone.utc) max_ts = max_dt.timestamp() - # date 9999-12-31 23:59:00+00:00: timestamp 253402300740 - self.assertEqual(self.theclass.fromtimestamp(max_ts, tz=timezone.utc), - max_dt) - - # number of seconds greater than 1 year: make sure that the new date - # is not valid in datetime.datetime limits - delta = 3600 * 24 * 400 - - # too small - ts = min_ts - delta - # converting a Python int to C time_t can raise a OverflowError, - # especially on 32-bit platforms. - with self.assertRaises((ValueError, OverflowError)): - self.theclass.fromtimestamp(ts) - with self.assertRaises((ValueError, OverflowError)): - self.theclass.utcfromtimestamp(ts) - - # too big - ts = max_dt.timestamp() + delta - with self.assertRaises((ValueError, OverflowError)): - self.theclass.fromtimestamp(ts) - with self.assertRaises((ValueError, OverflowError)): - self.theclass.utcfromtimestamp(ts) + + for (test_name, ts, expected) in [ + ("minimum", min_ts, min_dt.replace(tzinfo=None)), + ("maximum", max_ts, max_dt.replace(tzinfo=None)), + ]: + with self.subTest(test_name, ts=ts, expected=expected): + try: + actual = self.theclass.utcfromtimestamp(ts) + except (OSError, OverflowError) as exc: + self.skipTest(str(exc)) + + self.assertEqual(actual, expected) + + # Test error conditions + test_cases = [ + ("Too small by a little", min_ts - 1), + ("Too small by a lot", min_ts - timedelta(days=400).total_seconds()), + ("Too big by a little", max_ts + 1), + ("Too big by a lot", max_ts + timedelta(days=400).total_seconds()), + ] + + for test_name, ts in test_cases: + with self.subTest(test_name, ts=ts): + with self.assertRaises((ValueError, OverflowError)): + # converting a Python int to C time_t can raise a + # OverflowError, especially on 32-bit platforms. + self.theclass.utcfromtimestamp(ts) def test_insane_fromtimestamp(self): # It's possible that some platform maps time_t to double, diff --git a/Misc/NEWS.d/next/Library/2022-04-15-13-16-25.gh-issue-91581.9OGsrN.rst b/Misc/NEWS.d/next/Library/2022-04-15-13-16-25.gh-issue-91581.9OGsrN.rst new file mode 100644 index 0000000000000..1c3008f425578 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-04-15-13-16-25.gh-issue-91581.9OGsrN.rst @@ -0,0 +1,6 @@ +Remove an unhandled error case in the C implementation of calls to +:meth:`datetime.fromtimestamp ` with no time +zone (i.e. getting a local time from an epoch timestamp). This should have no +user-facing effect other than giving a possibly more accurate error message +when called with timestamps that fall on 10000-01-01 in the local time. Patch +by Paul Ganssle. diff --git a/Misc/NEWS.d/next/Library/2022-05-11-14-34-09.gh-issue-91581.glkou2.rst b/Misc/NEWS.d/next/Library/2022-05-11-14-34-09.gh-issue-91581.glkou2.rst new file mode 100644 index 0000000000000..846f57844a675 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-05-11-14-34-09.gh-issue-91581.glkou2.rst @@ -0,0 +1,5 @@ +:meth:`~datetime.datetime.utcfromtimestamp` no longer attempts to resolve +``fold`` in the pure Python implementation, since the fold is never 1 in UTC. +In addition to being slightly faster in the common case, this also prevents +some errors when the timestamp is close to :attr:`datetime.min +`. Patch by Paul Ganssle. diff --git a/Modules/_datetimemodule.c b/Modules/_datetimemodule.c index efb5278038f2f..e0bb4ee602c42 100644 --- a/Modules/_datetimemodule.c +++ b/Modules/_datetimemodule.c @@ -5071,6 +5071,10 @@ datetime_from_timet_and_us(PyObject *cls, TM_FUNC f, time_t timet, int us, result_seconds = utc_to_seconds(year, month, day, hour, minute, second); + if (result_seconds == -1 && PyErr_Occurred()) { + return NULL; + } + /* Probe max_fold_seconds to detect a fold. */ probe_seconds = local(epoch + timet - max_fold_seconds); if (probe_seconds == -1) From webhook-mailer at python.org Sat May 14 11:01:57 2022 From: webhook-mailer at python.org (miss-islington) Date: Sat, 14 May 2022 15:01:57 -0000 Subject: [Python-checkins] Check result of utc_to_seconds and skip fold probe in pure Python (GH-91582) Message-ID: https://github.com/python/cpython/commit/36d42e701f8a4040e7daf70138217038bfde3c78 commit: 36d42e701f8a4040e7daf70138217038bfde3c78 branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-14T08:01:53-07:00 summary: Check result of utc_to_seconds and skip fold probe in pure Python (GH-91582) The `utc_to_seconds` call can fail, here's a minimal reproducer on Linux: TZ=UTC python -c "from datetime import *; datetime.fromtimestamp(253402300799 + 1)" The old behavior still raised an error in a similar way, but only because subsequent calculations happened to fail as well. Better to fail fast. This also refactors the tests to split out the `fromtimestamp` and `utcfromtimestamp` tests, and to get us closer to the actual desired limits of the functions. As part of this, we also changed the way we detect platforms where the same limits don't necessarily apply (e.g. Windows). As part of refactoring the tests to hit this condition explicitly (even though the user-facing behvior doesn't change in any way we plan to guarantee), I noticed that there was a difference in the places that `datetime.utcfromtimestamp` fails in the C and pure Python versions, which was fixed by skipping the "probe for fold" logic for UTC specifically ? since UTC doesn't have any folds or gaps, we were never going to find a fold value anyway. This should prevent some failures in the pure python `utcfromtimestamp` method on timestamps close to 0001-01-01. There are two separate news entries for this because one is a potentially user-facing change, the other is an internal code correctness change that, if anything, changes some error messages. The two happen to be coupled because of the test refactoring, but they are probably best thought of as independent changes. Fixes GH-91581 (cherry picked from commit 83c0247d47b99f4571e35ea95361436e1d2a61cd) Co-authored-by: Paul Ganssle <1377457+pganssle at users.noreply.github.com> files: A Misc/NEWS.d/next/Library/2022-04-15-13-16-25.gh-issue-91581.9OGsrN.rst A Misc/NEWS.d/next/Library/2022-05-11-14-34-09.gh-issue-91581.glkou2.rst M Lib/datetime.py M Lib/test/datetimetester.py M Modules/_datetimemodule.c diff --git a/Lib/datetime.py b/Lib/datetime.py index 6bf37ccfab7ac..d087c9852c7d2 100644 --- a/Lib/datetime.py +++ b/Lib/datetime.py @@ -1652,7 +1652,7 @@ def _fromtimestamp(cls, t, utc, tz): y, m, d, hh, mm, ss, weekday, jday, dst = converter(t) ss = min(ss, 59) # clamp out leap seconds if the platform has them result = cls(y, m, d, hh, mm, ss, us, tz) - if tz is None: + if tz is None and not utc: # As of version 2015f max fold in IANA database is # 23 hours at 1969-09-30 13:00:00 in Kwajalein. # Let's probe 24 hours in the past to detect a transition: @@ -1673,7 +1673,7 @@ def _fromtimestamp(cls, t, utc, tz): probe2 = cls(y, m, d, hh, mm, ss, us, tz) if probe2 == result: result._fold = 1 - else: + elif tz is not None: result = tz.fromutc(result) return result diff --git a/Lib/test/datetimetester.py b/Lib/test/datetimetester.py index 58336595c1f57..43eab642b8f7d 100644 --- a/Lib/test/datetimetester.py +++ b/Lib/test/datetimetester.py @@ -2467,45 +2467,101 @@ def test_microsecond_rounding(self): self.assertEqual(t.microsecond, 7812) def test_timestamp_limits(self): - # minimum timestamp - min_dt = self.theclass.min.replace(tzinfo=timezone.utc) + with self.subTest("minimum UTC"): + min_dt = self.theclass.min.replace(tzinfo=timezone.utc) + min_ts = min_dt.timestamp() + + # This test assumes that datetime.min == 0000-01-01T00:00:00.00 + # If that assumption changes, this value can change as well + self.assertEqual(min_ts, -62135596800) + + with self.subTest("maximum UTC"): + # Zero out microseconds to avoid rounding issues + max_dt = self.theclass.max.replace(tzinfo=timezone.utc, + microsecond=0) + max_ts = max_dt.timestamp() + + # This test assumes that datetime.max == 9999-12-31T23:59:59.999999 + # If that assumption changes, this value can change as well + self.assertEqual(max_ts, 253402300799.0) + + def test_fromtimestamp_limits(self): + try: + self.theclass.fromtimestamp(-2**32 - 1) + except (OSError, OverflowError): + self.skipTest("Test not valid on this platform") + + # XXX: Replace these with datetime.{min,max}.timestamp() when we solve + # the issue with gh-91012 + min_dt = self.theclass.min + timedelta(days=1) min_ts = min_dt.timestamp() + + max_dt = self.theclass.max.replace(microsecond=0) + max_ts = ((self.theclass.max - timedelta(hours=23)).timestamp() + + timedelta(hours=22, minutes=59, seconds=59).total_seconds()) + + for (test_name, ts, expected) in [ + ("minimum", min_ts, min_dt), + ("maximum", max_ts, max_dt), + ]: + with self.subTest(test_name, ts=ts, expected=expected): + actual = self.theclass.fromtimestamp(ts) + + self.assertEqual(actual, expected) + + # Test error conditions + test_cases = [ + ("Too small by a little", min_ts - timedelta(days=1, hours=12).total_seconds()), + ("Too small by a lot", min_ts - timedelta(days=400).total_seconds()), + ("Too big by a little", max_ts + timedelta(days=1).total_seconds()), + ("Too big by a lot", max_ts + timedelta(days=400).total_seconds()), + ] + + for test_name, ts in test_cases: + with self.subTest(test_name, ts=ts): + with self.assertRaises((ValueError, OverflowError)): + # converting a Python int to C time_t can raise a + # OverflowError, especially on 32-bit platforms. + self.theclass.fromtimestamp(ts) + + def test_utcfromtimestamp_limits(self): try: - # date 0001-01-01 00:00:00+00:00: timestamp=-62135596800 - self.assertEqual(self.theclass.fromtimestamp(min_ts, tz=timezone.utc), - min_dt) - except (OverflowError, OSError) as exc: - # the date 0001-01-01 doesn't fit into 32-bit time_t, - # or platform doesn't support such very old date - self.skipTest(str(exc)) - - # maximum timestamp: set seconds to zero to avoid rounding issues - max_dt = self.theclass.max.replace(tzinfo=timezone.utc, - second=0, microsecond=0) + self.theclass.utcfromtimestamp(-2**32 - 1) + except (OSError, OverflowError): + self.skipTest("Test not valid on this platform") + + min_dt = self.theclass.min.replace(tzinfo=timezone.utc) + min_ts = min_dt.timestamp() + + max_dt = self.theclass.max.replace(microsecond=0, tzinfo=timezone.utc) max_ts = max_dt.timestamp() - # date 9999-12-31 23:59:00+00:00: timestamp 253402300740 - self.assertEqual(self.theclass.fromtimestamp(max_ts, tz=timezone.utc), - max_dt) - - # number of seconds greater than 1 year: make sure that the new date - # is not valid in datetime.datetime limits - delta = 3600 * 24 * 400 - - # too small - ts = min_ts - delta - # converting a Python int to C time_t can raise a OverflowError, - # especially on 32-bit platforms. - with self.assertRaises((ValueError, OverflowError)): - self.theclass.fromtimestamp(ts) - with self.assertRaises((ValueError, OverflowError)): - self.theclass.utcfromtimestamp(ts) - - # too big - ts = max_dt.timestamp() + delta - with self.assertRaises((ValueError, OverflowError)): - self.theclass.fromtimestamp(ts) - with self.assertRaises((ValueError, OverflowError)): - self.theclass.utcfromtimestamp(ts) + + for (test_name, ts, expected) in [ + ("minimum", min_ts, min_dt.replace(tzinfo=None)), + ("maximum", max_ts, max_dt.replace(tzinfo=None)), + ]: + with self.subTest(test_name, ts=ts, expected=expected): + try: + actual = self.theclass.utcfromtimestamp(ts) + except (OSError, OverflowError) as exc: + self.skipTest(str(exc)) + + self.assertEqual(actual, expected) + + # Test error conditions + test_cases = [ + ("Too small by a little", min_ts - 1), + ("Too small by a lot", min_ts - timedelta(days=400).total_seconds()), + ("Too big by a little", max_ts + 1), + ("Too big by a lot", max_ts + timedelta(days=400).total_seconds()), + ] + + for test_name, ts in test_cases: + with self.subTest(test_name, ts=ts): + with self.assertRaises((ValueError, OverflowError)): + # converting a Python int to C time_t can raise a + # OverflowError, especially on 32-bit platforms. + self.theclass.utcfromtimestamp(ts) def test_insane_fromtimestamp(self): # It's possible that some platform maps time_t to double, diff --git a/Misc/NEWS.d/next/Library/2022-04-15-13-16-25.gh-issue-91581.9OGsrN.rst b/Misc/NEWS.d/next/Library/2022-04-15-13-16-25.gh-issue-91581.9OGsrN.rst new file mode 100644 index 0000000000000..1c3008f425578 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-04-15-13-16-25.gh-issue-91581.9OGsrN.rst @@ -0,0 +1,6 @@ +Remove an unhandled error case in the C implementation of calls to +:meth:`datetime.fromtimestamp ` with no time +zone (i.e. getting a local time from an epoch timestamp). This should have no +user-facing effect other than giving a possibly more accurate error message +when called with timestamps that fall on 10000-01-01 in the local time. Patch +by Paul Ganssle. diff --git a/Misc/NEWS.d/next/Library/2022-05-11-14-34-09.gh-issue-91581.glkou2.rst b/Misc/NEWS.d/next/Library/2022-05-11-14-34-09.gh-issue-91581.glkou2.rst new file mode 100644 index 0000000000000..846f57844a675 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-05-11-14-34-09.gh-issue-91581.glkou2.rst @@ -0,0 +1,5 @@ +:meth:`~datetime.datetime.utcfromtimestamp` no longer attempts to resolve +``fold`` in the pure Python implementation, since the fold is never 1 in UTC. +In addition to being slightly faster in the common case, this also prevents +some errors when the timestamp is close to :attr:`datetime.min +`. Patch by Paul Ganssle. diff --git a/Modules/_datetimemodule.c b/Modules/_datetimemodule.c index e54a01b44c5ba..ec823ae52c6f9 100644 --- a/Modules/_datetimemodule.c +++ b/Modules/_datetimemodule.c @@ -5004,6 +5004,10 @@ datetime_from_timet_and_us(PyObject *cls, TM_FUNC f, time_t timet, int us, result_seconds = utc_to_seconds(year, month, day, hour, minute, second); + if (result_seconds == -1 && PyErr_Occurred()) { + return NULL; + } + /* Probe max_fold_seconds to detect a fold. */ probe_seconds = local(epoch + timet - max_fold_seconds); if (probe_seconds == -1) From webhook-mailer at python.org Sat May 14 14:23:24 2022 From: webhook-mailer at python.org (tiran) Date: Sat, 14 May 2022 18:23:24 -0000 Subject: [Python-checkins] gh-90473: Fail subprocess early on Emscripten/WASI (GH-92802) Message-ID: https://github.com/python/cpython/commit/db0b455ff482df68f331411bf22b3e5829398280 commit: db0b455ff482df68f331411bf22b3e5829398280 branch: main author: Christian Heimes committer: tiran date: 2022-05-14T20:23:19+02:00 summary: gh-90473: Fail subprocess early on Emscripten/WASI (GH-92802) files: A Misc/NEWS.d/next/Library/2022-05-14-11-41-23.gh-issue-90473.kPdOZl.rst M Lib/subprocess.py diff --git a/Lib/subprocess.py b/Lib/subprocess.py index 6e61cc2e5e7b0..e10b01047ebef 100644 --- a/Lib/subprocess.py +++ b/Lib/subprocess.py @@ -74,6 +74,9 @@ else: _mswindows = True +# wasm32-emscripten and wasm32-wasi do not support processes +_can_fork_exec = sys.platform not in {"emscripten", "wasi"} + if _mswindows: import _winapi from _winapi import (CREATE_NEW_CONSOLE, CREATE_NEW_PROCESS_GROUP, @@ -97,13 +100,10 @@ "CREATE_NO_WINDOW", "DETACHED_PROCESS", "CREATE_DEFAULT_ERROR_MODE", "CREATE_BREAKAWAY_FROM_JOB"]) else: - if sys.platform in {"emscripten", "wasi"}: - def _fork_exec(*args, **kwargs): - raise OSError( - errno.ENOTSUP, f"{sys.platform} does not support processes." - ) - else: + if _can_fork_exec: from _posixsubprocess import fork_exec as _fork_exec + else: + _fork_exec = None import select import selectors @@ -801,6 +801,11 @@ def __init__(self, args, bufsize=-1, executable=None, encoding=None, errors=None, text=None, umask=-1, pipesize=-1, process_group=None): """Create new Popen instance.""" + if not _can_fork_exec: + raise OSError( + errno.ENOTSUP, f"{sys.platform} does not support processes." + ) + _cleanup() # Held while anything is calling waitpid before returncode has been # updated to prevent clobbering returncode if wait() or poll() are diff --git a/Misc/NEWS.d/next/Library/2022-05-14-11-41-23.gh-issue-90473.kPdOZl.rst b/Misc/NEWS.d/next/Library/2022-05-14-11-41-23.gh-issue-90473.kPdOZl.rst new file mode 100644 index 0000000000000..bf5ee542182e0 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-05-14-11-41-23.gh-issue-90473.kPdOZl.rst @@ -0,0 +1,2 @@ +:mod:`subprocess` now fails early on Emscripten and WASI platforms to work +around missing :func:`os.pipe` on WASI. From webhook-mailer at python.org Sat May 14 14:47:45 2022 From: webhook-mailer at python.org (miss-islington) Date: Sat, 14 May 2022 18:47:45 -0000 Subject: [Python-checkins] gh-90473: Fail subprocess early on Emscripten/WASI (GH-92802) Message-ID: https://github.com/python/cpython/commit/2bcae11302ae80fe8749f81601530a4c43b737bd commit: 2bcae11302ae80fe8749f81601530a4c43b737bd branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-14T11:47:17-07:00 summary: gh-90473: Fail subprocess early on Emscripten/WASI (GH-92802) (cherry picked from commit db0b455ff482df68f331411bf22b3e5829398280) Co-authored-by: Christian Heimes files: A Misc/NEWS.d/next/Library/2022-05-14-11-41-23.gh-issue-90473.kPdOZl.rst M Lib/subprocess.py diff --git a/Lib/subprocess.py b/Lib/subprocess.py index 6e61cc2e5e7b0..e10b01047ebef 100644 --- a/Lib/subprocess.py +++ b/Lib/subprocess.py @@ -74,6 +74,9 @@ else: _mswindows = True +# wasm32-emscripten and wasm32-wasi do not support processes +_can_fork_exec = sys.platform not in {"emscripten", "wasi"} + if _mswindows: import _winapi from _winapi import (CREATE_NEW_CONSOLE, CREATE_NEW_PROCESS_GROUP, @@ -97,13 +100,10 @@ "CREATE_NO_WINDOW", "DETACHED_PROCESS", "CREATE_DEFAULT_ERROR_MODE", "CREATE_BREAKAWAY_FROM_JOB"]) else: - if sys.platform in {"emscripten", "wasi"}: - def _fork_exec(*args, **kwargs): - raise OSError( - errno.ENOTSUP, f"{sys.platform} does not support processes." - ) - else: + if _can_fork_exec: from _posixsubprocess import fork_exec as _fork_exec + else: + _fork_exec = None import select import selectors @@ -801,6 +801,11 @@ def __init__(self, args, bufsize=-1, executable=None, encoding=None, errors=None, text=None, umask=-1, pipesize=-1, process_group=None): """Create new Popen instance.""" + if not _can_fork_exec: + raise OSError( + errno.ENOTSUP, f"{sys.platform} does not support processes." + ) + _cleanup() # Held while anything is calling waitpid before returncode has been # updated to prevent clobbering returncode if wait() or poll() are diff --git a/Misc/NEWS.d/next/Library/2022-05-14-11-41-23.gh-issue-90473.kPdOZl.rst b/Misc/NEWS.d/next/Library/2022-05-14-11-41-23.gh-issue-90473.kPdOZl.rst new file mode 100644 index 0000000000000..bf5ee542182e0 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-05-14-11-41-23.gh-issue-90473.kPdOZl.rst @@ -0,0 +1,2 @@ +:mod:`subprocess` now fails early on Emscripten and WASI platforms to work +around missing :func:`os.pipe` on WASI. From webhook-mailer at python.org Sun May 15 05:20:06 2022 From: webhook-mailer at python.org (vstinner) Date: Sun, 15 May 2022 09:20:06 -0000 Subject: [Python-checkins] gh-92781: Avoid mixing declarations and code in C API (#92783) Message-ID: https://github.com/python/cpython/commit/90e72300730189c4a48529baaad9b0005d40731c commit: 90e72300730189c4a48529baaad9b0005d40731c branch: main author: Victor Stinner committer: vstinner date: 2022-05-15T11:19:52+02:00 summary: gh-92781: Avoid mixing declarations and code in C API (#92783) Avoid mixing declarations and code in the C API to fix the compiler warning: "ISO C90 forbids mixed declarations and code" [-Werror=declaration-after-statement]. files: A Misc/NEWS.d/next/C API/2022-05-13-18-17-48.gh-issue-92781.TVDr3-.rst M Include/cpython/abstract.h M Include/cpython/cellobject.h M Include/cpython/dictobject.h M Include/cpython/unicodeobject.h M Include/cpython/weakrefobject.h diff --git a/Include/cpython/abstract.h b/Include/cpython/abstract.h index 161e2cb30fde3..d276669312ee2 100644 --- a/Include/cpython/abstract.h +++ b/Include/cpython/abstract.h @@ -111,9 +111,8 @@ static inline PyObject * PyObject_CallMethodOneArg(PyObject *self, PyObject *name, PyObject *arg) { PyObject *args[2] = {self, arg}; - - assert(arg != NULL); size_t nargsf = 2 | PY_VECTORCALL_ARGUMENTS_OFFSET; + assert(arg != NULL); return PyObject_VectorcallMethod(name, args, nargsf, _Py_NULL); } @@ -160,9 +159,8 @@ static inline PyObject * _PyObject_CallMethodIdOneArg(PyObject *self, _Py_Identifier *name, PyObject *arg) { PyObject *args[2] = {self, arg}; - - assert(arg != NULL); size_t nargsf = 2 | PY_VECTORCALL_ARGUMENTS_OFFSET; + assert(arg != NULL); return _PyObject_VectorcallMethodId(name, args, nargsf, _Py_NULL); } diff --git a/Include/cpython/cellobject.h b/Include/cpython/cellobject.h index f778f86de7469..344238a533563 100644 --- a/Include/cpython/cellobject.h +++ b/Include/cpython/cellobject.h @@ -22,8 +22,9 @@ PyAPI_FUNC(PyObject *) PyCell_Get(PyObject *); PyAPI_FUNC(int) PyCell_Set(PyObject *, PyObject *); static inline PyObject* PyCell_GET(PyObject *op) { + PyCellObject *cell; assert(PyCell_Check(op)); - PyCellObject *cell = _Py_CAST(PyCellObject*, op); + cell = _Py_CAST(PyCellObject*, op); return cell->ob_ref; } #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030c0000 @@ -31,8 +32,9 @@ static inline PyObject* PyCell_GET(PyObject *op) { #endif static inline void PyCell_SET(PyObject *op, PyObject *value) { + PyCellObject *cell; assert(PyCell_Check(op)); - PyCellObject *cell = _Py_CAST(PyCellObject*, op); + cell = _Py_CAST(PyCellObject*, op); cell->ob_ref = value; } #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030c0000 diff --git a/Include/cpython/dictobject.h b/Include/cpython/dictobject.h index f249c0e9ca5e2..5788012ab159b 100644 --- a/Include/cpython/dictobject.h +++ b/Include/cpython/dictobject.h @@ -47,8 +47,9 @@ PyAPI_FUNC(int) _PyDict_Next( /* Get the number of items of a dictionary. */ static inline Py_ssize_t PyDict_GET_SIZE(PyObject *op) { + PyDictObject *mp; assert(PyDict_Check(op)); - PyDictObject *mp = _Py_CAST(PyDictObject*, op); + mp = _Py_CAST(PyDictObject*, op); return mp->ma_used; } #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030c0000 diff --git a/Include/cpython/unicodeobject.h b/Include/cpython/unicodeobject.h index 37bb13cbe5397..274339d7f9fe6 100644 --- a/Include/cpython/unicodeobject.h +++ b/Include/cpython/unicodeobject.h @@ -262,8 +262,9 @@ static inline void* _PyUnicode_COMPACT_DATA(PyObject *op) { } static inline void* _PyUnicode_NONCOMPACT_DATA(PyObject *op) { + void *data; assert(!PyUnicode_IS_COMPACT(op)); - void *data = _PyUnicodeObject_CAST(op)->data.any; + data = _PyUnicodeObject_CAST(op)->data.any; assert(data != NULL); return data; } @@ -369,11 +370,13 @@ static inline Py_UCS4 PyUnicode_READ_CHAR(PyObject *unicode, Py_ssize_t index) than iterating over the string. */ static inline Py_UCS4 PyUnicode_MAX_CHAR_VALUE(PyObject *op) { + int kind; + if (PyUnicode_IS_ASCII(op)) { return 0x7fU; } - int kind = PyUnicode_KIND(op); + kind = PyUnicode_KIND(op); if (kind == PyUnicode_1BYTE_KIND) { return 0xffU; } diff --git a/Include/cpython/weakrefobject.h b/Include/cpython/weakrefobject.h index 2dbef2cea3765..26b364f41d4d7 100644 --- a/Include/cpython/weakrefobject.h +++ b/Include/cpython/weakrefobject.h @@ -37,9 +37,11 @@ PyAPI_FUNC(Py_ssize_t) _PyWeakref_GetWeakrefCount(PyWeakReference *head); PyAPI_FUNC(void) _PyWeakref_ClearRef(PyWeakReference *self); static inline PyObject* PyWeakref_GET_OBJECT(PyObject *ref_obj) { + PyWeakReference *ref; + PyObject *obj; assert(PyWeakref_Check(ref_obj)); - PyWeakReference *ref = _Py_CAST(PyWeakReference*, ref_obj); - PyObject *obj = ref->wr_object; + ref = _Py_CAST(PyWeakReference*, ref_obj); + obj = ref->wr_object; // Explanation for the Py_REFCNT() check: when a weakref's target is part // of a long chain of deallocations which triggers the trashcan mechanism, // clearing the weakrefs can be delayed long after the target's refcount diff --git a/Misc/NEWS.d/next/C API/2022-05-13-18-17-48.gh-issue-92781.TVDr3-.rst b/Misc/NEWS.d/next/C API/2022-05-13-18-17-48.gh-issue-92781.TVDr3-.rst new file mode 100644 index 0000000000000..6442ba619450f --- /dev/null +++ b/Misc/NEWS.d/next/C API/2022-05-13-18-17-48.gh-issue-92781.TVDr3-.rst @@ -0,0 +1,3 @@ +Avoid mixing declarations and code in the C API to fix the compiler warning: +"ISO C90 forbids mixed declarations and code" +[-Werror=declaration-after-statement]. Patch by Victor Stinner. From webhook-mailer at python.org Sun May 15 10:49:29 2022 From: webhook-mailer at python.org (corona10) Date: Sun, 15 May 2022 14:49:29 -0000 Subject: [Python-checkins] gh-89668: Optimize ZipFile file header processing algorithm to avoid unneeded IO(gh-25966) Message-ID: https://github.com/python/cpython/commit/26a162baef96d78656e189b2fa16fdcab7195730 commit: 26a162baef96d78656e189b2fa16fdcab7195730 branch: main author: Jan Wolski committer: corona10 date: 2022-05-15T23:49:19+09:00 summary: gh-89668: Optimize ZipFile file header processing algorithm to avoid unneeded IO(gh-25966) files: M Lib/zipfile.py diff --git a/Lib/zipfile.py b/Lib/zipfile.py index dc02011084329..9f4437526c91f 100644 --- a/Lib/zipfile.py +++ b/Lib/zipfile.py @@ -1564,7 +1564,7 @@ def open(self, name, mode="r", pwd=None, *, force_zip64=False): fname = zef_file.read(fheader[_FH_FILENAME_LENGTH]) if fheader[_FH_EXTRA_FIELD_LENGTH]: - zef_file.read(fheader[_FH_EXTRA_FIELD_LENGTH]) + zef_file.seek(fheader[_FH_EXTRA_FIELD_LENGTH], whence=1) if zinfo.flag_bits & _MASK_COMPRESSED_PATCH: # Zip 2.7: compressed patched data From webhook-mailer at python.org Sun May 15 11:35:19 2022 From: webhook-mailer at python.org (ezio-melotti) Date: Sun, 15 May 2022 15:35:19 -0000 Subject: [Python-checkins] Restore default role check in `make check`. (#92290) Message-ID: https://github.com/python/cpython/commit/953ab0795243900ccccaaca069d932730a86fc20 commit: 953ab0795243900ccccaaca069d932730a86fc20 branch: main author: Ezio Melotti committer: ezio-melotti date: 2022-05-15T17:34:52+02:00 summary: Restore default role check in `make check`. (#92290) * Restore default role check in `make check`. * Options first, then files. * Update `make.bat` too. * Add a comment explaining the extra options. * No reason to ignore the README.rst. * Enable default-role check in sphinx-lint. Co-authored-by: Julien Palard * Update sphinx-lint default-role check. * Fix use of the default role in the docs. * Update make.bat to check for the default role too. * Fix comment in make.bat. Co-authored-by: Julien Palard files: M Doc/Makefile M Doc/library/datetime.rst M Doc/library/enum.rst M Doc/make.bat diff --git a/Doc/Makefile b/Doc/Makefile index 3a3417bf99af3..8a757a68b6f52 100644 --- a/Doc/Makefile +++ b/Doc/Makefile @@ -213,8 +213,10 @@ dist: rm dist/python-$(DISTVERSION)-docs-texinfo.tar check: - $(SPHINXLINT) -i tools -i $(VENVDIR) -i README.rst - $(SPHINXLINT) ../Misc/NEWS.d/next/ + # Check the docs and NEWS files with sphinx-lint. + # Ignore the tools and venv dirs and check that the default role is not used. + $(SPHINXLINT) -i tools -i $(VENVDIR) --enable default-role + $(SPHINXLINT) --enable default-role ../Misc/NEWS.d/next/ serve: @echo "The serve target was removed, use htmlview instead (see bpo-36329)" diff --git a/Doc/library/datetime.rst b/Doc/library/datetime.rst index e0b28d7cb978d..bde24ec5f2e11 100644 --- a/Doc/library/datetime.rst +++ b/Doc/library/datetime.rst @@ -998,7 +998,7 @@ Other constructors, all class methods: ISO 8601 format, with the following exceptions: 1. Time zone offsets may have fractional seconds. - 2. The `T` separator may be replaced by any single unicode character. + 2. The ``T`` separator may be replaced by any single unicode character. 3. Ordinal dates are not currently supported. 4. Fractional hours and minutes are not supported. diff --git a/Doc/library/enum.rst b/Doc/library/enum.rst index 5829d4617893b..c3256c56c6366 100644 --- a/Doc/library/enum.rst +++ b/Doc/library/enum.rst @@ -126,11 +126,11 @@ Module Contents :func:`member` - Make `obj` a member. Can be used as a decorator. + Make ``obj`` a member. Can be used as a decorator. :func:`nonmember` - Do not make `obj` a member. Can be used as a decorator. + Do not make ``obj`` a member. Can be used as a decorator. .. versionadded:: 3.6 ``Flag``, ``IntFlag``, ``auto`` diff --git a/Doc/make.bat b/Doc/make.bat index d9a7aa4ca7fa6..4f0b3c11f4fac 100644 --- a/Doc/make.bat +++ b/Doc/make.bat @@ -180,7 +180,10 @@ if EXIST "%BUILDDIR%\html\index.html" ( goto end :check -cmd /S /C "%SPHINXLINT% -i tools" +rem Check the docs and NEWS files with sphinx-lint. +rem Ignore the tools dir and check that the default role is not used. +cmd /S /C "%SPHINXLINT% -i tools --enable default-role" +cmd /S /C "%SPHINXLINT% --enable default-role ..\Misc\NEWS.d\next\ " goto end :serve From webhook-mailer at python.org Sun May 15 11:55:18 2022 From: webhook-mailer at python.org (ezio-melotti) Date: Sun, 15 May 2022 15:55:18 -0000 Subject: [Python-checkins] [3.11] Restore default role check in `make check`. (GH-92290) (#92821) Message-ID: https://github.com/python/cpython/commit/5b2c5ae75663fa899a60a88b46c00a7132c19d30 commit: 5b2c5ae75663fa899a60a88b46c00a7132c19d30 branch: 3.11 author: Ezio Melotti committer: ezio-melotti date: 2022-05-15T17:55:12+02:00 summary: [3.11] Restore default role check in `make check`. (GH-92290) (#92821) * Restore default role check in `make check`. * Options first, then files. * Update `make.bat` too. * Add a comment explaining the extra options. * No reason to ignore the README.rst. * Enable default-role check in sphinx-lint. Co-authored-by: Julien Palard * Update sphinx-lint default-role check. * Fix use of the default role in the docs. * Update make.bat to check for the default role too. * Fix comment in make.bat. Co-authored-by: Julien Palard (cherry picked from commit 953ab0795243900ccccaaca069d932730a86fc20) Co-authored-by: Ezio Melotti files: M Doc/Makefile M Doc/library/datetime.rst M Doc/library/enum.rst M Doc/make.bat diff --git a/Doc/Makefile b/Doc/Makefile index 3a3417bf99af3..8a757a68b6f52 100644 --- a/Doc/Makefile +++ b/Doc/Makefile @@ -213,8 +213,10 @@ dist: rm dist/python-$(DISTVERSION)-docs-texinfo.tar check: - $(SPHINXLINT) -i tools -i $(VENVDIR) -i README.rst - $(SPHINXLINT) ../Misc/NEWS.d/next/ + # Check the docs and NEWS files with sphinx-lint. + # Ignore the tools and venv dirs and check that the default role is not used. + $(SPHINXLINT) -i tools -i $(VENVDIR) --enable default-role + $(SPHINXLINT) --enable default-role ../Misc/NEWS.d/next/ serve: @echo "The serve target was removed, use htmlview instead (see bpo-36329)" diff --git a/Doc/library/datetime.rst b/Doc/library/datetime.rst index e0b28d7cb978d..bde24ec5f2e11 100644 --- a/Doc/library/datetime.rst +++ b/Doc/library/datetime.rst @@ -998,7 +998,7 @@ Other constructors, all class methods: ISO 8601 format, with the following exceptions: 1. Time zone offsets may have fractional seconds. - 2. The `T` separator may be replaced by any single unicode character. + 2. The ``T`` separator may be replaced by any single unicode character. 3. Ordinal dates are not currently supported. 4. Fractional hours and minutes are not supported. diff --git a/Doc/library/enum.rst b/Doc/library/enum.rst index 5829d4617893b..c3256c56c6366 100644 --- a/Doc/library/enum.rst +++ b/Doc/library/enum.rst @@ -126,11 +126,11 @@ Module Contents :func:`member` - Make `obj` a member. Can be used as a decorator. + Make ``obj`` a member. Can be used as a decorator. :func:`nonmember` - Do not make `obj` a member. Can be used as a decorator. + Do not make ``obj`` a member. Can be used as a decorator. .. versionadded:: 3.6 ``Flag``, ``IntFlag``, ``auto`` diff --git a/Doc/make.bat b/Doc/make.bat index d9a7aa4ca7fa6..4f0b3c11f4fac 100644 --- a/Doc/make.bat +++ b/Doc/make.bat @@ -180,7 +180,10 @@ if EXIST "%BUILDDIR%\html\index.html" ( goto end :check -cmd /S /C "%SPHINXLINT% -i tools" +rem Check the docs and NEWS files with sphinx-lint. +rem Ignore the tools dir and check that the default role is not used. +cmd /S /C "%SPHINXLINT% -i tools --enable default-role" +cmd /S /C "%SPHINXLINT% --enable default-role ..\Misc\NEWS.d\next\ " goto end :serve From webhook-mailer at python.org Mon May 16 01:25:48 2022 From: webhook-mailer at python.org (serhiy-storchaka) Date: Mon, 16 May 2022 05:25:48 -0000 Subject: [Python-checkins] gh-92530: Fix an issue that occurred after interrupting threading.Condition.notify (GH-92534) Message-ID: https://github.com/python/cpython/commit/70af994fee7c0850ae859727d9468a5f29375a38 commit: 70af994fee7c0850ae859727d9468a5f29375a38 branch: main author: Serhiy Storchaka committer: serhiy-storchaka date: 2022-05-16T08:25:29+03:00 summary: gh-92530: Fix an issue that occurred after interrupting threading.Condition.notify (GH-92534) If Condition.notify() was interrupted just after it released the waiter lock, but before removing it from the queue, the following calls of notify() failed with RuntimeError: cannot release un-acquired lock. files: A Misc/NEWS.d/next/Library/2022-05-09-09-28-02.gh-issue-92530.M4Q1RS.rst M Lib/threading.py diff --git a/Lib/threading.py b/Lib/threading.py index 40edcde11539d..a3df587f10666 100644 --- a/Lib/threading.py +++ b/Lib/threading.py @@ -368,14 +368,21 @@ def notify(self, n=1): """ if not self._is_owned(): raise RuntimeError("cannot notify on un-acquired lock") - all_waiters = self._waiters - waiters_to_notify = _deque(_islice(all_waiters, n)) - if not waiters_to_notify: - return - for waiter in waiters_to_notify: - waiter.release() + waiters = self._waiters + while waiters and n > 0: + waiter = waiters[0] + try: + waiter.release() + except RuntimeError: + # gh-92530: The previous call of notify() released the lock, + # but was interrupted before removing it from the queue. + # It can happen if a signal handler raises an exception, + # like CTRL+C which raises KeyboardInterrupt. + pass + else: + n -= 1 try: - all_waiters.remove(waiter) + waiters.remove(waiter) except ValueError: pass diff --git a/Misc/NEWS.d/next/Library/2022-05-09-09-28-02.gh-issue-92530.M4Q1RS.rst b/Misc/NEWS.d/next/Library/2022-05-09-09-28-02.gh-issue-92530.M4Q1RS.rst new file mode 100644 index 0000000000000..8bb8ca0488c96 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-05-09-09-28-02.gh-issue-92530.M4Q1RS.rst @@ -0,0 +1,2 @@ +Fix an issue that occurred after interrupting +:func:`threading.Condition.notify`. From webhook-mailer at python.org Mon May 16 02:11:51 2022 From: webhook-mailer at python.org (JulienPalard) Date: Mon, 16 May 2022 06:11:51 -0000 Subject: [Python-checkins] gh-87670: Add web.archive redirects from effbot (GH-92816) Message-ID: https://github.com/python/cpython/commit/3ed1cae9ed9d1f0dd9d68da4b30b731fdf6be768 commit: 3ed1cae9ed9d1f0dd9d68da4b30b731fdf6be768 branch: main author: Stanley <46876382+slateny at users.noreply.github.com> committer: JulienPalard date: 2022-05-16T08:11:43+02:00 summary: gh-87670: Add web.archive redirects from effbot (GH-92816) files: M Doc/whatsnew/2.5.rst M Doc/whatsnew/2.7.rst M Doc/whatsnew/3.2.rst diff --git a/Doc/whatsnew/2.5.rst b/Doc/whatsnew/2.5.rst index 4e85abaea7553..5816380e102f9 100644 --- a/Doc/whatsnew/2.5.rst +++ b/Doc/whatsnew/2.5.rst @@ -1767,7 +1767,7 @@ included. The rest of this section will provide a brief overview of using ElementTree. Full documentation for ElementTree is available at -http://effbot.org/zone/element-index.htm. +https://web.archive.org/web/20201124024954/http://effbot.org/zone/element-index.htm. ElementTree represents an XML document as a tree of element nodes. The text content of the document is stored as the :attr:`text` and :attr:`tail` @@ -1865,7 +1865,7 @@ read the package's official documentation for more details. .. seealso:: - http://effbot.org/zone/element-index.htm + https://web.archive.org/web/20201124024954/http://effbot.org/zone/element-index.htm Official documentation for ElementTree. .. ====================================================================== diff --git a/Doc/whatsnew/2.7.rst b/Doc/whatsnew/2.7.rst index 999f148fa6b79..297ce0647130e 100644 --- a/Doc/whatsnew/2.7.rst +++ b/Doc/whatsnew/2.7.rst @@ -2089,7 +2089,7 @@ version 1.3. Some of the new features are: Fredrik Lundh develops ElementTree and produced the 1.3 version; you can read his article describing 1.3 at -http://effbot.org/zone/elementtree-13-intro.htm. +https://web.archive.org/web/20200703234532/http://effbot.org/zone/elementtree-13-intro.htm. Florent Xicluna updated the version included with Python, after discussions on python-dev and in :issue:`6472`.) diff --git a/Doc/whatsnew/3.2.rst b/Doc/whatsnew/3.2.rst index 840cb061129b7..ec01a70f8ae0a 100644 --- a/Doc/whatsnew/3.2.rst +++ b/Doc/whatsnew/3.2.rst @@ -744,7 +744,8 @@ Two methods have been deprecated: * :meth:`xml.etree.ElementTree.getiterator` use ``Element.iter`` instead. For details of the update, see `Introducing ElementTree -`_ on Fredrik Lundh's website. +`_ +on Fredrik Lundh's website. (Contributed by Florent Xicluna and Fredrik Lundh, :issue:`6472`.) From webhook-mailer at python.org Mon May 16 02:26:54 2022 From: webhook-mailer at python.org (miss-islington) Date: Mon, 16 May 2022 06:26:54 -0000 Subject: [Python-checkins] gh-87670: Add web.archive redirects from effbot (GH-92816) Message-ID: https://github.com/python/cpython/commit/fdfc7eb41090c59429b3f734c3fcc8535c8c4158 commit: fdfc7eb41090c59429b3f734c3fcc8535c8c4158 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-15T23:26:31-07:00 summary: gh-87670: Add web.archive redirects from effbot (GH-92816) (cherry picked from commit 3ed1cae9ed9d1f0dd9d68da4b30b731fdf6be768) Co-authored-by: Stanley <46876382+slateny at users.noreply.github.com> files: M Doc/whatsnew/2.5.rst M Doc/whatsnew/2.7.rst M Doc/whatsnew/3.2.rst diff --git a/Doc/whatsnew/2.5.rst b/Doc/whatsnew/2.5.rst index 4e85abaea7553..5816380e102f9 100644 --- a/Doc/whatsnew/2.5.rst +++ b/Doc/whatsnew/2.5.rst @@ -1767,7 +1767,7 @@ included. The rest of this section will provide a brief overview of using ElementTree. Full documentation for ElementTree is available at -http://effbot.org/zone/element-index.htm. +https://web.archive.org/web/20201124024954/http://effbot.org/zone/element-index.htm. ElementTree represents an XML document as a tree of element nodes. The text content of the document is stored as the :attr:`text` and :attr:`tail` @@ -1865,7 +1865,7 @@ read the package's official documentation for more details. .. seealso:: - http://effbot.org/zone/element-index.htm + https://web.archive.org/web/20201124024954/http://effbot.org/zone/element-index.htm Official documentation for ElementTree. .. ====================================================================== diff --git a/Doc/whatsnew/2.7.rst b/Doc/whatsnew/2.7.rst index 999f148fa6b79..297ce0647130e 100644 --- a/Doc/whatsnew/2.7.rst +++ b/Doc/whatsnew/2.7.rst @@ -2089,7 +2089,7 @@ version 1.3. Some of the new features are: Fredrik Lundh develops ElementTree and produced the 1.3 version; you can read his article describing 1.3 at -http://effbot.org/zone/elementtree-13-intro.htm. +https://web.archive.org/web/20200703234532/http://effbot.org/zone/elementtree-13-intro.htm. Florent Xicluna updated the version included with Python, after discussions on python-dev and in :issue:`6472`.) diff --git a/Doc/whatsnew/3.2.rst b/Doc/whatsnew/3.2.rst index 840cb061129b7..ec01a70f8ae0a 100644 --- a/Doc/whatsnew/3.2.rst +++ b/Doc/whatsnew/3.2.rst @@ -744,7 +744,8 @@ Two methods have been deprecated: * :meth:`xml.etree.ElementTree.getiterator` use ``Element.iter`` instead. For details of the update, see `Introducing ElementTree -`_ on Fredrik Lundh's website. +`_ +on Fredrik Lundh's website. (Contributed by Florent Xicluna and Fredrik Lundh, :issue:`6472`.) From webhook-mailer at python.org Mon May 16 02:27:57 2022 From: webhook-mailer at python.org (miss-islington) Date: Mon, 16 May 2022 06:27:57 -0000 Subject: [Python-checkins] gh-87670: Add web.archive redirects from effbot (GH-92816) Message-ID: https://github.com/python/cpython/commit/93d9b782ccc670b1c162e7eed1dcccc82135251d commit: 93d9b782ccc670b1c162e7eed1dcccc82135251d branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-15T23:27:54-07:00 summary: gh-87670: Add web.archive redirects from effbot (GH-92816) (cherry picked from commit 3ed1cae9ed9d1f0dd9d68da4b30b731fdf6be768) Co-authored-by: Stanley <46876382+slateny at users.noreply.github.com> files: M Doc/whatsnew/2.5.rst M Doc/whatsnew/2.7.rst M Doc/whatsnew/3.2.rst diff --git a/Doc/whatsnew/2.5.rst b/Doc/whatsnew/2.5.rst index 4e85abaea7553..5816380e102f9 100644 --- a/Doc/whatsnew/2.5.rst +++ b/Doc/whatsnew/2.5.rst @@ -1767,7 +1767,7 @@ included. The rest of this section will provide a brief overview of using ElementTree. Full documentation for ElementTree is available at -http://effbot.org/zone/element-index.htm. +https://web.archive.org/web/20201124024954/http://effbot.org/zone/element-index.htm. ElementTree represents an XML document as a tree of element nodes. The text content of the document is stored as the :attr:`text` and :attr:`tail` @@ -1865,7 +1865,7 @@ read the package's official documentation for more details. .. seealso:: - http://effbot.org/zone/element-index.htm + https://web.archive.org/web/20201124024954/http://effbot.org/zone/element-index.htm Official documentation for ElementTree. .. ====================================================================== diff --git a/Doc/whatsnew/2.7.rst b/Doc/whatsnew/2.7.rst index abb65222ddd3d..6d704586cd094 100644 --- a/Doc/whatsnew/2.7.rst +++ b/Doc/whatsnew/2.7.rst @@ -2089,7 +2089,7 @@ version 1.3. Some of the new features are: Fredrik Lundh develops ElementTree and produced the 1.3 version; you can read his article describing 1.3 at -http://effbot.org/zone/elementtree-13-intro.htm. +https://web.archive.org/web/20200703234532/http://effbot.org/zone/elementtree-13-intro.htm. Florent Xicluna updated the version included with Python, after discussions on python-dev and in :issue:`6472`.) diff --git a/Doc/whatsnew/3.2.rst b/Doc/whatsnew/3.2.rst index 840cb061129b7..ec01a70f8ae0a 100644 --- a/Doc/whatsnew/3.2.rst +++ b/Doc/whatsnew/3.2.rst @@ -744,7 +744,8 @@ Two methods have been deprecated: * :meth:`xml.etree.ElementTree.getiterator` use ``Element.iter`` instead. For details of the update, see `Introducing ElementTree -`_ on Fredrik Lundh's website. +`_ +on Fredrik Lundh's website. (Contributed by Florent Xicluna and Fredrik Lundh, :issue:`6472`.) From webhook-mailer at python.org Mon May 16 02:32:26 2022 From: webhook-mailer at python.org (miss-islington) Date: Mon, 16 May 2022 06:32:26 -0000 Subject: [Python-checkins] gh-87670: Add web.archive redirects from effbot (GH-92816) Message-ID: https://github.com/python/cpython/commit/c4fc53f44e382f133bf874c079c2f6a8a61d1e2f commit: c4fc53f44e382f133bf874c079c2f6a8a61d1e2f branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-15T23:32:15-07:00 summary: gh-87670: Add web.archive redirects from effbot (GH-92816) (cherry picked from commit 3ed1cae9ed9d1f0dd9d68da4b30b731fdf6be768) Co-authored-by: Stanley <46876382+slateny at users.noreply.github.com> files: M Doc/whatsnew/2.5.rst M Doc/whatsnew/2.7.rst M Doc/whatsnew/3.2.rst diff --git a/Doc/whatsnew/2.5.rst b/Doc/whatsnew/2.5.rst index 4e85abaea7553..5816380e102f9 100644 --- a/Doc/whatsnew/2.5.rst +++ b/Doc/whatsnew/2.5.rst @@ -1767,7 +1767,7 @@ included. The rest of this section will provide a brief overview of using ElementTree. Full documentation for ElementTree is available at -http://effbot.org/zone/element-index.htm. +https://web.archive.org/web/20201124024954/http://effbot.org/zone/element-index.htm. ElementTree represents an XML document as a tree of element nodes. The text content of the document is stored as the :attr:`text` and :attr:`tail` @@ -1865,7 +1865,7 @@ read the package's official documentation for more details. .. seealso:: - http://effbot.org/zone/element-index.htm + https://web.archive.org/web/20201124024954/http://effbot.org/zone/element-index.htm Official documentation for ElementTree. .. ====================================================================== diff --git a/Doc/whatsnew/2.7.rst b/Doc/whatsnew/2.7.rst index abb65222ddd3d..6d704586cd094 100644 --- a/Doc/whatsnew/2.7.rst +++ b/Doc/whatsnew/2.7.rst @@ -2089,7 +2089,7 @@ version 1.3. Some of the new features are: Fredrik Lundh develops ElementTree and produced the 1.3 version; you can read his article describing 1.3 at -http://effbot.org/zone/elementtree-13-intro.htm. +https://web.archive.org/web/20200703234532/http://effbot.org/zone/elementtree-13-intro.htm. Florent Xicluna updated the version included with Python, after discussions on python-dev and in :issue:`6472`.) diff --git a/Doc/whatsnew/3.2.rst b/Doc/whatsnew/3.2.rst index 06bee9966c0be..828d7ca115c60 100644 --- a/Doc/whatsnew/3.2.rst +++ b/Doc/whatsnew/3.2.rst @@ -744,7 +744,8 @@ Two methods have been deprecated: * :meth:`xml.etree.ElementTree.getiterator` use ``Element.iter`` instead. For details of the update, see `Introducing ElementTree -`_ on Fredrik Lundh's website. +`_ +on Fredrik Lundh's website. (Contributed by Florent Xicluna and Fredrik Lundh, :issue:`6472`.) From webhook-mailer at python.org Mon May 16 03:37:40 2022 From: webhook-mailer at python.org (tiran) Date: Mon, 16 May 2022 07:37:40 -0000 Subject: [Python-checkins] gh-90473: WASI: Mark tests that require os.pipe() (GH-92837) Message-ID: https://github.com/python/cpython/commit/730902c0ad997462d2567e48def5352fe75c0e2c commit: 730902c0ad997462d2567e48def5352fe75c0e2c branch: main author: Christian Heimes committer: tiran date: 2022-05-16T09:37:30+02:00 summary: gh-90473: WASI: Mark tests that require os.pipe() (GH-92837) files: M Lib/test/test_atexit.py M Lib/test/test_capi.py M Lib/test/test_io.py M Lib/test/test_signal.py diff --git a/Lib/test/test_atexit.py b/Lib/test/test_atexit.py index e0feef7c65360..7ac063cfc78d3 100644 --- a/Lib/test/test_atexit.py +++ b/Lib/test/test_atexit.py @@ -82,6 +82,7 @@ def f(): self.assertEqual(ret, 0) self.assertEqual(atexit._ncallbacks(), n) + @unittest.skipUnless(hasattr(os, "pipe"), "requires os.pipe()") def test_callback_on_subinterpreter_teardown(self): # This tests if a callback is called on # subinterpreter teardown. diff --git a/Lib/test/test_capi.py b/Lib/test/test_capi.py index 6d75895589328..904ae9bc47ecf 100644 --- a/Lib/test/test_capi.py +++ b/Lib/test/test_capi.py @@ -788,6 +788,7 @@ def test_pendingcalls_non_threaded(self): class SubinterpreterTest(unittest.TestCase): + @unittest.skipUnless(hasattr(os, "pipe"), "requires os.pipe()") def test_subinterps(self): import builtins r, w = os.pipe() @@ -803,6 +804,7 @@ def test_subinterps(self): self.assertNotEqual(pickle.load(f), id(sys.modules)) self.assertNotEqual(pickle.load(f), id(builtins)) + @unittest.skipUnless(hasattr(os, "pipe"), "requires os.pipe()") def test_subinterps_recent_language_features(self): r, w = os.pipe() code = """if 1: diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py index 5528c461e58ae..039da535d488a 100644 --- a/Lib/test/test_io.py +++ b/Lib/test/test_io.py @@ -429,6 +429,7 @@ def test_invalid_operations(self): @unittest.skipIf( support.is_emscripten, "fstat() of a pipe fd is not supported" ) + @unittest.skipUnless(hasattr(os, "pipe"), "requires os.pipe()") def test_optional_abilities(self): # Test for OSError when optional APIs are not supported # The purpose of this test is to try fileno(), reading, writing and @@ -3970,6 +3971,7 @@ def test_removed_u_mode(self): @unittest.skipIf( support.is_emscripten, "fstat() of a pipe fd is not supported" ) + @unittest.skipUnless(hasattr(os, "pipe"), "requires os.pipe()") def test_open_pipe_with_append(self): # bpo-27805: Ignore ESPIPE from lseek() in open(). r, w = os.pipe() @@ -4108,6 +4110,7 @@ def cleanup_fds(): with warnings_helper.check_no_resource_warning(self): open(r, *args, closefd=False, **kwargs) + @unittest.skipUnless(hasattr(os, "pipe"), "requires os.pipe()") def test_warn_on_dealloc_fd(self): self._check_warn_on_dealloc_fd("rb", buffering=0) self._check_warn_on_dealloc_fd("rb") @@ -4147,6 +4150,7 @@ def test_nonblock_pipe_write_smallbuf(self): @unittest.skipUnless(hasattr(os, 'set_blocking'), 'os.set_blocking() required for this test') + @unittest.skipUnless(hasattr(os, "pipe"), "requires os.pipe()") def _test_nonblock_pipe_write(self, bufsize): sent = [] received = [] @@ -4458,14 +4462,17 @@ def _read(): raise @requires_alarm + @unittest.skipUnless(hasattr(os, "pipe"), "requires os.pipe()") def test_interrupted_write_unbuffered(self): self.check_interrupted_write(b"xy", b"xy", mode="wb", buffering=0) @requires_alarm + @unittest.skipUnless(hasattr(os, "pipe"), "requires os.pipe()") def test_interrupted_write_buffered(self): self.check_interrupted_write(b"xy", b"xy", mode="wb") @requires_alarm + @unittest.skipUnless(hasattr(os, "pipe"), "requires os.pipe()") def test_interrupted_write_text(self): self.check_interrupted_write("xy", b"xy", mode="w", encoding="ascii") diff --git a/Lib/test/test_signal.py b/Lib/test/test_signal.py index 2ba29fc837d44..6d3b299b24cca 100644 --- a/Lib/test/test_signal.py +++ b/Lib/test/test_signal.py @@ -222,6 +222,7 @@ def test_invalid_socket(self): # Emscripten does not support fstat on pipes yet. # https://github.com/emscripten-core/emscripten/issues/16414 @unittest.skipIf(support.is_emscripten, "Emscripten cannot fstat pipes.") + @unittest.skipUnless(hasattr(os, "pipe"), "requires os.pipe()") def test_set_wakeup_fd_result(self): r1, w1 = os.pipe() self.addCleanup(os.close, r1) @@ -260,6 +261,7 @@ def test_set_wakeup_fd_socket_result(self): # function to test if a socket is in non-blocking mode. @unittest.skipIf(sys.platform == "win32", "tests specific to POSIX") @unittest.skipIf(support.is_emscripten, "Emscripten cannot fstat pipes.") + @unittest.skipUnless(hasattr(os, "pipe"), "requires os.pipe()") def test_set_wakeup_fd_blocking(self): rfd, wfd = os.pipe() self.addCleanup(os.close, rfd) @@ -320,6 +322,7 @@ def check_signum(signals): assert_python_ok('-c', code) @unittest.skipIf(_testcapi is None, 'need _testcapi') + @unittest.skipUnless(hasattr(os, "pipe"), "requires os.pipe()") def test_wakeup_write_error(self): # Issue #16105: write() errors in the C signal handler should not # pass silently. @@ -659,6 +662,7 @@ def handler(signum, frame): @unittest.skipIf(sys.platform == "win32", "Not valid on Windows") @unittest.skipUnless(hasattr(signal, 'siginterrupt'), "needs signal.siginterrupt()") @support.requires_subprocess() + at unittest.skipUnless(hasattr(os, "pipe"), "requires os.pipe()") class SiginterruptTest(unittest.TestCase): def readpipe_interrupted(self, interrupt): From webhook-mailer at python.org Mon May 16 04:04:05 2022 From: webhook-mailer at python.org (miss-islington) Date: Mon, 16 May 2022 08:04:05 -0000 Subject: [Python-checkins] gh-90473: WASI: Mark tests that require os.pipe() (GH-92837) Message-ID: https://github.com/python/cpython/commit/5f24acdca0e2777afec90aac5e63936ec571099b commit: 5f24acdca0e2777afec90aac5e63936ec571099b branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-16T01:04:01-07:00 summary: gh-90473: WASI: Mark tests that require os.pipe() (GH-92837) (cherry picked from commit 730902c0ad997462d2567e48def5352fe75c0e2c) Co-authored-by: Christian Heimes files: M Lib/test/test_atexit.py M Lib/test/test_capi.py M Lib/test/test_io.py M Lib/test/test_signal.py diff --git a/Lib/test/test_atexit.py b/Lib/test/test_atexit.py index e0feef7c65360..7ac063cfc78d3 100644 --- a/Lib/test/test_atexit.py +++ b/Lib/test/test_atexit.py @@ -82,6 +82,7 @@ def f(): self.assertEqual(ret, 0) self.assertEqual(atexit._ncallbacks(), n) + @unittest.skipUnless(hasattr(os, "pipe"), "requires os.pipe()") def test_callback_on_subinterpreter_teardown(self): # This tests if a callback is called on # subinterpreter teardown. diff --git a/Lib/test/test_capi.py b/Lib/test/test_capi.py index 6d75895589328..904ae9bc47ecf 100644 --- a/Lib/test/test_capi.py +++ b/Lib/test/test_capi.py @@ -788,6 +788,7 @@ def test_pendingcalls_non_threaded(self): class SubinterpreterTest(unittest.TestCase): + @unittest.skipUnless(hasattr(os, "pipe"), "requires os.pipe()") def test_subinterps(self): import builtins r, w = os.pipe() @@ -803,6 +804,7 @@ def test_subinterps(self): self.assertNotEqual(pickle.load(f), id(sys.modules)) self.assertNotEqual(pickle.load(f), id(builtins)) + @unittest.skipUnless(hasattr(os, "pipe"), "requires os.pipe()") def test_subinterps_recent_language_features(self): r, w = os.pipe() code = """if 1: diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py index 5528c461e58ae..039da535d488a 100644 --- a/Lib/test/test_io.py +++ b/Lib/test/test_io.py @@ -429,6 +429,7 @@ def test_invalid_operations(self): @unittest.skipIf( support.is_emscripten, "fstat() of a pipe fd is not supported" ) + @unittest.skipUnless(hasattr(os, "pipe"), "requires os.pipe()") def test_optional_abilities(self): # Test for OSError when optional APIs are not supported # The purpose of this test is to try fileno(), reading, writing and @@ -3970,6 +3971,7 @@ def test_removed_u_mode(self): @unittest.skipIf( support.is_emscripten, "fstat() of a pipe fd is not supported" ) + @unittest.skipUnless(hasattr(os, "pipe"), "requires os.pipe()") def test_open_pipe_with_append(self): # bpo-27805: Ignore ESPIPE from lseek() in open(). r, w = os.pipe() @@ -4108,6 +4110,7 @@ def cleanup_fds(): with warnings_helper.check_no_resource_warning(self): open(r, *args, closefd=False, **kwargs) + @unittest.skipUnless(hasattr(os, "pipe"), "requires os.pipe()") def test_warn_on_dealloc_fd(self): self._check_warn_on_dealloc_fd("rb", buffering=0) self._check_warn_on_dealloc_fd("rb") @@ -4147,6 +4150,7 @@ def test_nonblock_pipe_write_smallbuf(self): @unittest.skipUnless(hasattr(os, 'set_blocking'), 'os.set_blocking() required for this test') + @unittest.skipUnless(hasattr(os, "pipe"), "requires os.pipe()") def _test_nonblock_pipe_write(self, bufsize): sent = [] received = [] @@ -4458,14 +4462,17 @@ def _read(): raise @requires_alarm + @unittest.skipUnless(hasattr(os, "pipe"), "requires os.pipe()") def test_interrupted_write_unbuffered(self): self.check_interrupted_write(b"xy", b"xy", mode="wb", buffering=0) @requires_alarm + @unittest.skipUnless(hasattr(os, "pipe"), "requires os.pipe()") def test_interrupted_write_buffered(self): self.check_interrupted_write(b"xy", b"xy", mode="wb") @requires_alarm + @unittest.skipUnless(hasattr(os, "pipe"), "requires os.pipe()") def test_interrupted_write_text(self): self.check_interrupted_write("xy", b"xy", mode="w", encoding="ascii") diff --git a/Lib/test/test_signal.py b/Lib/test/test_signal.py index 2ba29fc837d44..6d3b299b24cca 100644 --- a/Lib/test/test_signal.py +++ b/Lib/test/test_signal.py @@ -222,6 +222,7 @@ def test_invalid_socket(self): # Emscripten does not support fstat on pipes yet. # https://github.com/emscripten-core/emscripten/issues/16414 @unittest.skipIf(support.is_emscripten, "Emscripten cannot fstat pipes.") + @unittest.skipUnless(hasattr(os, "pipe"), "requires os.pipe()") def test_set_wakeup_fd_result(self): r1, w1 = os.pipe() self.addCleanup(os.close, r1) @@ -260,6 +261,7 @@ def test_set_wakeup_fd_socket_result(self): # function to test if a socket is in non-blocking mode. @unittest.skipIf(sys.platform == "win32", "tests specific to POSIX") @unittest.skipIf(support.is_emscripten, "Emscripten cannot fstat pipes.") + @unittest.skipUnless(hasattr(os, "pipe"), "requires os.pipe()") def test_set_wakeup_fd_blocking(self): rfd, wfd = os.pipe() self.addCleanup(os.close, rfd) @@ -320,6 +322,7 @@ def check_signum(signals): assert_python_ok('-c', code) @unittest.skipIf(_testcapi is None, 'need _testcapi') + @unittest.skipUnless(hasattr(os, "pipe"), "requires os.pipe()") def test_wakeup_write_error(self): # Issue #16105: write() errors in the C signal handler should not # pass silently. @@ -659,6 +662,7 @@ def handler(signum, frame): @unittest.skipIf(sys.platform == "win32", "Not valid on Windows") @unittest.skipUnless(hasattr(signal, 'siginterrupt'), "needs signal.siginterrupt()") @support.requires_subprocess() + at unittest.skipUnless(hasattr(os, "pipe"), "requires os.pipe()") class SiginterruptTest(unittest.TestCase): def readpipe_interrupted(self, interrupt): From webhook-mailer at python.org Mon May 16 06:43:03 2022 From: webhook-mailer at python.org (miss-islington) Date: Mon, 16 May 2022 10:43:03 -0000 Subject: [Python-checkins] gh-81548: Clarify the deprecation of octal sequences affect byte strings (GH-92643) Message-ID: https://github.com/python/cpython/commit/0d8500c739dc5ea926b2ec1ec02e400738225dac commit: 0d8500c739dc5ea926b2ec1ec02e400738225dac branch: main author: Pablo Galindo Salgado committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-16T03:42:58-07:00 summary: gh-81548: Clarify the deprecation of octal sequences affect byte strings (GH-92643) Automerge-Triggered-By: GH:pablogsal files: M Doc/whatsnew/3.11.rst diff --git a/Doc/whatsnew/3.11.rst b/Doc/whatsnew/3.11.rst index 6518eea4c7ba5..97dd096731f0c 100644 --- a/Doc/whatsnew/3.11.rst +++ b/Doc/whatsnew/3.11.rst @@ -1116,8 +1116,8 @@ Deprecated that was added in Python 3.10. (Contributed by Raymond Hettinger in :gh:`89519`.) -* Octal escapes with value larger than ``0o377`` now produce - a :exc:`DeprecationWarning`. +* Octal escapes in string and bytes literals with value larger than ``0o377`` now + produce :exc:`DeprecationWarning`. In a future Python version they will be a :exc:`SyntaxWarning` and eventually a :exc:`SyntaxError`. (Contributed by Serhiy Storchaka in :gh:`81548`.) From webhook-mailer at python.org Mon May 16 07:20:18 2022 From: webhook-mailer at python.org (vstinner) Date: Mon, 16 May 2022 11:20:18 -0000 Subject: [Python-checkins] gh-92781: Avoid mixing declarations and code in C API (#92783) (#92813) Message-ID: https://github.com/python/cpython/commit/a3d2ce95d185c70cdec56f10a09e2d67c0d3246e commit: a3d2ce95d185c70cdec56f10a09e2d67c0d3246e branch: 3.11 author: Victor Stinner committer: vstinner date: 2022-05-16T13:19:52+02:00 summary: gh-92781: Avoid mixing declarations and code in C API (#92783) (#92813) Avoid mixing declarations and code in the C API to fix the compiler warning: "ISO C90 forbids mixed declarations and code" [-Werror=declaration-after-statement]. (cherry picked from commit 90e72300730189c4a48529baaad9b0005d40731c) files: A Misc/NEWS.d/next/C API/2022-05-13-18-17-48.gh-issue-92781.TVDr3-.rst M Include/cpython/abstract.h M Include/cpython/unicodeobject.h M Include/cpython/weakrefobject.h diff --git a/Include/cpython/abstract.h b/Include/cpython/abstract.h index 161e2cb30fde3..d276669312ee2 100644 --- a/Include/cpython/abstract.h +++ b/Include/cpython/abstract.h @@ -111,9 +111,8 @@ static inline PyObject * PyObject_CallMethodOneArg(PyObject *self, PyObject *name, PyObject *arg) { PyObject *args[2] = {self, arg}; - - assert(arg != NULL); size_t nargsf = 2 | PY_VECTORCALL_ARGUMENTS_OFFSET; + assert(arg != NULL); return PyObject_VectorcallMethod(name, args, nargsf, _Py_NULL); } @@ -160,9 +159,8 @@ static inline PyObject * _PyObject_CallMethodIdOneArg(PyObject *self, _Py_Identifier *name, PyObject *arg) { PyObject *args[2] = {self, arg}; - - assert(arg != NULL); size_t nargsf = 2 | PY_VECTORCALL_ARGUMENTS_OFFSET; + assert(arg != NULL); return _PyObject_VectorcallMethodId(name, args, nargsf, _Py_NULL); } diff --git a/Include/cpython/unicodeobject.h b/Include/cpython/unicodeobject.h index fdbcb1cf403ae..8ec2fccaecf99 100644 --- a/Include/cpython/unicodeobject.h +++ b/Include/cpython/unicodeobject.h @@ -326,8 +326,9 @@ static inline void* _PyUnicode_COMPACT_DATA(PyObject *op) { } static inline void* _PyUnicode_NONCOMPACT_DATA(PyObject *op) { + void *data; assert(!PyUnicode_IS_COMPACT(op)); - void *data = _PyUnicodeObject_CAST(op)->data.any; + data = _PyUnicodeObject_CAST(op)->data.any; assert(data != NULL); return data; } @@ -416,8 +417,9 @@ static inline Py_UCS4 PyUnicode_READ(int kind, cache kind and use PyUnicode_READ instead. */ static inline Py_UCS4 PyUnicode_READ_CHAR(PyObject *unicode, Py_ssize_t index) { + int kind; assert(PyUnicode_IS_READY(unicode)); - int kind = PyUnicode_KIND(unicode); + kind = PyUnicode_KIND(unicode); if (kind == PyUnicode_1BYTE_KIND) { return PyUnicode_1BYTE_DATA(unicode)[index]; } @@ -437,12 +439,14 @@ static inline Py_UCS4 PyUnicode_READ_CHAR(PyObject *unicode, Py_ssize_t index) than iterating over the string. */ static inline Py_UCS4 PyUnicode_MAX_CHAR_VALUE(PyObject *op) { + int kind; + assert(PyUnicode_IS_READY(op)); if (PyUnicode_IS_ASCII(op)) { return 0x7fU; } - int kind = PyUnicode_KIND(op); + kind = PyUnicode_KIND(op); if (kind == PyUnicode_1BYTE_KIND) { return 0xffU; } diff --git a/Include/cpython/weakrefobject.h b/Include/cpython/weakrefobject.h index 2dbef2cea3765..26b364f41d4d7 100644 --- a/Include/cpython/weakrefobject.h +++ b/Include/cpython/weakrefobject.h @@ -37,9 +37,11 @@ PyAPI_FUNC(Py_ssize_t) _PyWeakref_GetWeakrefCount(PyWeakReference *head); PyAPI_FUNC(void) _PyWeakref_ClearRef(PyWeakReference *self); static inline PyObject* PyWeakref_GET_OBJECT(PyObject *ref_obj) { + PyWeakReference *ref; + PyObject *obj; assert(PyWeakref_Check(ref_obj)); - PyWeakReference *ref = _Py_CAST(PyWeakReference*, ref_obj); - PyObject *obj = ref->wr_object; + ref = _Py_CAST(PyWeakReference*, ref_obj); + obj = ref->wr_object; // Explanation for the Py_REFCNT() check: when a weakref's target is part // of a long chain of deallocations which triggers the trashcan mechanism, // clearing the weakrefs can be delayed long after the target's refcount diff --git a/Misc/NEWS.d/next/C API/2022-05-13-18-17-48.gh-issue-92781.TVDr3-.rst b/Misc/NEWS.d/next/C API/2022-05-13-18-17-48.gh-issue-92781.TVDr3-.rst new file mode 100644 index 0000000000000..6442ba619450f --- /dev/null +++ b/Misc/NEWS.d/next/C API/2022-05-13-18-17-48.gh-issue-92781.TVDr3-.rst @@ -0,0 +1,3 @@ +Avoid mixing declarations and code in the C API to fix the compiler warning: +"ISO C90 forbids mixed declarations and code" +[-Werror=declaration-after-statement]. Patch by Victor Stinner. From webhook-mailer at python.org Mon May 16 07:52:11 2022 From: webhook-mailer at python.org (JulienPalard) Date: Mon, 16 May 2022 11:52:11 -0000 Subject: [Python-checkins] Speedup: build docs in parallel (GH-92733) Message-ID: https://github.com/python/cpython/commit/a487623c6b784847a8a1e47b4597b0ae2b8def87 commit: a487623c6b784847a8a1e47b4597b0ae2b8def87 branch: main author: Hugo van Kemenade committer: JulienPalard date: 2022-05-16T13:52:00+02:00 summary: Speedup: build docs in parallel (GH-92733) files: M .github/workflows/doc.yml M Doc/Makefile diff --git a/.github/workflows/doc.yml b/.github/workflows/doc.yml index 0d1b85d84746a..8c4a034896126 100644 --- a/.github/workflows/doc.yml +++ b/.github/workflows/doc.yml @@ -43,12 +43,12 @@ jobs: # Run "check doctest html" as 3 steps to get a more readable output # in the web UI - name: 'Check documentation' - run: make -C Doc/ PYTHON=../python SPHINXOPTS="-q -W --keep-going -j4" check + run: make -C Doc/ PYTHON=../python SPHINXOPTS="-q -W --keep-going" check # Use "xvfb-run" since some doctest tests open GUI windows - name: 'Run documentation doctest' - run: xvfb-run make -C Doc/ PYTHON=../python SPHINXOPTS="-q -W --keep-going -j4" doctest + run: xvfb-run make -C Doc/ PYTHON=../python SPHINXOPTS="-q -W --keep-going" doctest - name: 'Build HTML documentation' - run: make -C Doc/ PYTHON=../python SPHINXOPTS="-q -W --keep-going -j4" html + run: make -C Doc/ PYTHON=../python SPHINXOPTS="-q -W --keep-going" html - name: 'Upload' uses: actions/upload-artifact at v3 with: diff --git a/Doc/Makefile b/Doc/Makefile index 8a757a68b6f52..5b6a95813abee 100644 --- a/Doc/Makefile +++ b/Doc/Makefile @@ -18,7 +18,7 @@ SPHINXERRORHANDLING = -W PAPEROPT_a4 = -D latex_elements.papersize=a4paper PAPEROPT_letter = -D latex_elements.papersize=letterpaper -ALLSPHINXOPTS = -b $(BUILDER) -d build/doctrees $(PAPEROPT_$(PAPER)) \ +ALLSPHINXOPTS = -b $(BUILDER) -d build/doctrees $(PAPEROPT_$(PAPER)) -j auto \ $(SPHINXOPTS) $(SPHINXERRORHANDLING) . build/$(BUILDER) $(SOURCES) .PHONY: help build html htmlhelp latex text texinfo changes linkcheck \ From webhook-mailer at python.org Mon May 16 07:54:51 2022 From: webhook-mailer at python.org (vstinner) Date: Mon, 16 May 2022 11:54:51 -0000 Subject: [Python-checkins] gh-92820: Skip test_cppext if _ctypes is missing (#92844) Message-ID: https://github.com/python/cpython/commit/ca0cc9c433830e14714a5cc93fb4e7254da3dd76 commit: ca0cc9c433830e14714a5cc93fb4e7254da3dd76 branch: main author: Victor Stinner committer: vstinner date: 2022-05-16T13:54:45+02:00 summary: gh-92820: Skip test_cppext if _ctypes is missing (#92844) Add @test.support.requires_venv_with_pip decorator. files: M Lib/test/support/__init__.py M Lib/test/test_cppext.py M Lib/test/test_venv.py diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py index 41502cf4e97be..bddfe118e369d 100644 --- a/Lib/test/support/__init__.py +++ b/Lib/test/support/__init__.py @@ -2183,3 +2183,20 @@ def clear_ignored_deprecations(*tokens: object) -> None: if warnings.filters != new_filters: warnings.filters[:] = new_filters warnings._filters_mutated() + + +# Skip a test if venv with pip is known to not work. +def requires_venv_with_pip(): + # ensurepip requires zlib to open ZIP archives (.whl binary wheel packages) + try: + import zlib + except ImportError: + return unittest.skipIf(True, "venv: ensurepip requires zlib") + + # bpo-26610: pip/pep425tags.py requires ctypes. + # gh-92820: setuptools/windows_support.py uses ctypes (setuptools 58.1). + try: + import ctypes + except ImportError: + ctypes = None + return unittest.skipUnless(ctypes, 'venv: pip requires ctypes') diff --git a/Lib/test/test_cppext.py b/Lib/test/test_cppext.py index 8acf0f1b7c0dc..9ed90616b0eab 100644 --- a/Lib/test/test_cppext.py +++ b/Lib/test/test_cppext.py @@ -19,6 +19,8 @@ class TestCPPExt(unittest.TestCase): # With MSVC, the linker fails with: cannot open file 'python311.lib' # https://github.com/python/cpython/pull/32175#issuecomment-1111175897 @unittest.skipIf(MS_WINDOWS, 'test fails on Windows') + # the test uses venv+pip: skip if it's not available + @support.requires_venv_with_pip() def test_build(self): # Build in a temporary directory with os_helper.temp_cwd(): diff --git a/Lib/test/test_venv.py b/Lib/test/test_venv.py index d96cf1e6c7493..4f897523907ef 100644 --- a/Lib/test/test_venv.py +++ b/Lib/test/test_venv.py @@ -16,7 +16,8 @@ import tempfile from test.support import (captured_stdout, captured_stderr, requires_zlib, skip_if_broken_multiprocessing_synchronize, verbose, - requires_subprocess, is_emscripten) + requires_subprocess, is_emscripten, + requires_venv_with_pip) from test.support.os_helper import (can_symlink, EnvironmentVarGuard, rmtree) import unittest import venv @@ -605,9 +606,7 @@ def do_test_with_pip(self, system_site_packages): if not system_site_packages: self.assert_pip_not_installed() - # Issue #26610: pip/pep425tags.py requires ctypes - @unittest.skipUnless(ctypes, 'pip requires ctypes') - @requires_zlib() + @requires_venv_with_pip() def test_with_pip(self): self.do_test_with_pip(False) self.do_test_with_pip(True) From webhook-mailer at python.org Mon May 16 08:17:45 2022 From: webhook-mailer at python.org (miss-islington) Date: Mon, 16 May 2022 12:17:45 -0000 Subject: [Python-checkins] Speedup: build docs in parallel (GH-92733) Message-ID: https://github.com/python/cpython/commit/2ef6a986ee7e59461578f7847695f29d0fe1d065 commit: 2ef6a986ee7e59461578f7847695f29d0fe1d065 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-16T05:17:20-07:00 summary: Speedup: build docs in parallel (GH-92733) (cherry picked from commit a487623c6b784847a8a1e47b4597b0ae2b8def87) Co-authored-by: Hugo van Kemenade files: M .github/workflows/doc.yml M Doc/Makefile diff --git a/.github/workflows/doc.yml b/.github/workflows/doc.yml index 0d1b85d84746a..8c4a034896126 100644 --- a/.github/workflows/doc.yml +++ b/.github/workflows/doc.yml @@ -43,12 +43,12 @@ jobs: # Run "check doctest html" as 3 steps to get a more readable output # in the web UI - name: 'Check documentation' - run: make -C Doc/ PYTHON=../python SPHINXOPTS="-q -W --keep-going -j4" check + run: make -C Doc/ PYTHON=../python SPHINXOPTS="-q -W --keep-going" check # Use "xvfb-run" since some doctest tests open GUI windows - name: 'Run documentation doctest' - run: xvfb-run make -C Doc/ PYTHON=../python SPHINXOPTS="-q -W --keep-going -j4" doctest + run: xvfb-run make -C Doc/ PYTHON=../python SPHINXOPTS="-q -W --keep-going" doctest - name: 'Build HTML documentation' - run: make -C Doc/ PYTHON=../python SPHINXOPTS="-q -W --keep-going -j4" html + run: make -C Doc/ PYTHON=../python SPHINXOPTS="-q -W --keep-going" html - name: 'Upload' uses: actions/upload-artifact at v3 with: diff --git a/Doc/Makefile b/Doc/Makefile index 8a757a68b6f52..5b6a95813abee 100644 --- a/Doc/Makefile +++ b/Doc/Makefile @@ -18,7 +18,7 @@ SPHINXERRORHANDLING = -W PAPEROPT_a4 = -D latex_elements.papersize=a4paper PAPEROPT_letter = -D latex_elements.papersize=letterpaper -ALLSPHINXOPTS = -b $(BUILDER) -d build/doctrees $(PAPEROPT_$(PAPER)) \ +ALLSPHINXOPTS = -b $(BUILDER) -d build/doctrees $(PAPEROPT_$(PAPER)) -j auto \ $(SPHINXOPTS) $(SPHINXERRORHANDLING) . build/$(BUILDER) $(SOURCES) .PHONY: help build html htmlhelp latex text texinfo changes linkcheck \ From webhook-mailer at python.org Mon May 16 08:38:36 2022 From: webhook-mailer at python.org (pablogsal) Date: Mon, 16 May 2022 12:38:36 -0000 Subject: [Python-checkins] gh-92671: Don't omit parentheses when unparsing empty tuples (GH-92673) Message-ID: https://github.com/python/cpython/commit/f6fd8aac13714ce17650eb4a648d5c08f0be53b4 commit: f6fd8aac13714ce17650eb4a648d5c08f0be53b4 branch: main author: Batuhan Taskaya committer: pablogsal date: 2022-05-16T13:38:06+01:00 summary: gh-92671: Don't omit parentheses when unparsing empty tuples (GH-92673) files: A Misc/NEWS.d/next/Library/2022-05-11-19-33-27.gh-issue-92671.KE4v6a.rst M Lib/ast.py M Lib/test/test_unparse.py diff --git a/Lib/ast.py b/Lib/ast.py index e81e28044bc6e..4e2ae859245f9 100644 --- a/Lib/ast.py +++ b/Lib/ast.py @@ -1335,7 +1335,11 @@ def write_item(item): ) def visit_Tuple(self, node): - with self.require_parens(_Precedence.TUPLE, node): + with self.delimit_if( + "(", + ")", + len(node.elts) == 0 or self.get_precedence(node) > _Precedence.TUPLE + ): self.items_view(self.traverse, node.elts) unop = {"Invert": "~", "Not": "not", "UAdd": "+", "USub": "-"} diff --git a/Lib/test/test_unparse.py b/Lib/test/test_unparse.py index f999ae8c16cea..969aa16678f49 100644 --- a/Lib/test/test_unparse.py +++ b/Lib/test/test_unparse.py @@ -648,6 +648,9 @@ def test_star_expr_assign_target(self): self.check_src_roundtrip(source.format(target=target)) def test_star_expr_assign_target_multiple(self): + self.check_src_roundtrip("() = []") + self.check_src_roundtrip("[] = ()") + self.check_src_roundtrip("() = [a] = c, = [d] = e, f = () = g = h") self.check_src_roundtrip("a = b = c = d") self.check_src_roundtrip("a, b = c, d = e, f = g") self.check_src_roundtrip("[a, b] = [c, d] = [e, f] = g") diff --git a/Misc/NEWS.d/next/Library/2022-05-11-19-33-27.gh-issue-92671.KE4v6a.rst b/Misc/NEWS.d/next/Library/2022-05-11-19-33-27.gh-issue-92671.KE4v6a.rst new file mode 100644 index 0000000000000..b50677ab5ca10 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-05-11-19-33-27.gh-issue-92671.KE4v6a.rst @@ -0,0 +1 @@ +Fixed :func:`ast.unparse` for empty tuples in the assignment target context. From webhook-mailer at python.org Mon May 16 09:01:51 2022 From: webhook-mailer at python.org (miss-islington) Date: Mon, 16 May 2022 13:01:51 -0000 Subject: [Python-checkins] gh-92671: Don't omit parentheses when unparsing empty tuples (GH-92673) Message-ID: https://github.com/python/cpython/commit/52e6596fb5f9371f3a1434dd7816e400862b4df8 commit: 52e6596fb5f9371f3a1434dd7816e400862b4df8 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-16T06:01:34-07:00 summary: gh-92671: Don't omit parentheses when unparsing empty tuples (GH-92673) (cherry picked from commit f6fd8aac13714ce17650eb4a648d5c08f0be53b4) Co-authored-by: Batuhan Taskaya files: A Misc/NEWS.d/next/Library/2022-05-11-19-33-27.gh-issue-92671.KE4v6a.rst M Lib/ast.py M Lib/test/test_unparse.py diff --git a/Lib/ast.py b/Lib/ast.py index e81e28044bc6e..4e2ae859245f9 100644 --- a/Lib/ast.py +++ b/Lib/ast.py @@ -1335,7 +1335,11 @@ def write_item(item): ) def visit_Tuple(self, node): - with self.require_parens(_Precedence.TUPLE, node): + with self.delimit_if( + "(", + ")", + len(node.elts) == 0 or self.get_precedence(node) > _Precedence.TUPLE + ): self.items_view(self.traverse, node.elts) unop = {"Invert": "~", "Not": "not", "UAdd": "+", "USub": "-"} diff --git a/Lib/test/test_unparse.py b/Lib/test/test_unparse.py index f999ae8c16cea..969aa16678f49 100644 --- a/Lib/test/test_unparse.py +++ b/Lib/test/test_unparse.py @@ -648,6 +648,9 @@ def test_star_expr_assign_target(self): self.check_src_roundtrip(source.format(target=target)) def test_star_expr_assign_target_multiple(self): + self.check_src_roundtrip("() = []") + self.check_src_roundtrip("[] = ()") + self.check_src_roundtrip("() = [a] = c, = [d] = e, f = () = g = h") self.check_src_roundtrip("a = b = c = d") self.check_src_roundtrip("a, b = c, d = e, f = g") self.check_src_roundtrip("[a, b] = [c, d] = [e, f] = g") diff --git a/Misc/NEWS.d/next/Library/2022-05-11-19-33-27.gh-issue-92671.KE4v6a.rst b/Misc/NEWS.d/next/Library/2022-05-11-19-33-27.gh-issue-92671.KE4v6a.rst new file mode 100644 index 0000000000000..b50677ab5ca10 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-05-11-19-33-27.gh-issue-92671.KE4v6a.rst @@ -0,0 +1 @@ +Fixed :func:`ast.unparse` for empty tuples in the assignment target context. From webhook-mailer at python.org Mon May 16 09:35:15 2022 From: webhook-mailer at python.org (markshannon) Date: Mon, 16 May 2022 13:35:15 -0000 Subject: [Python-checkins] Improve object stats (#92845) Message-ID: https://github.com/python/cpython/commit/fa2b8b75eb2b8a0193d587e02b488a73579118fc commit: fa2b8b75eb2b8a0193d587e02b488a73579118fc branch: main author: Mark Shannon committer: markshannon date: 2022-05-16T14:35:11+01:00 summary: Improve object stats (#92845) * Add incref/decref stats * Show ratios for allocation in summary files: A Include/pystats.h M Include/internal/pycore_code.h M Include/internal/pycore_object.h M Include/object.h M Makefile.pre.in M PCbuild/pythoncore.vcxproj M PCbuild/pythoncore.vcxproj.filters M Python/ceval.c M Python/specialize.c M Tools/scripts/summarize_stats.py diff --git a/Include/internal/pycore_code.h b/Include/internal/pycore_code.h index e11d1f05129c6..96cc9dcae11a7 100644 --- a/Include/internal/pycore_code.h +++ b/Include/internal/pycore_code.h @@ -265,53 +265,6 @@ extern int _PyStaticCode_InternStrings(PyCodeObject *co); #ifdef Py_STATS -#define SPECIALIZATION_FAILURE_KINDS 30 - -typedef struct _specialization_stats { - uint64_t success; - uint64_t failure; - uint64_t hit; - uint64_t deferred; - uint64_t miss; - uint64_t deopt; - uint64_t failure_kinds[SPECIALIZATION_FAILURE_KINDS]; -} SpecializationStats; - -typedef struct _opcode_stats { - SpecializationStats specialization; - uint64_t execution_count; - uint64_t pair_count[256]; -} OpcodeStats; - -typedef struct _call_stats { - uint64_t inlined_py_calls; - uint64_t pyeval_calls; - uint64_t frames_pushed; - uint64_t frame_objects_created; -} CallStats; - -typedef struct _object_stats { - uint64_t allocations; - uint64_t allocations512; - uint64_t allocations4k; - uint64_t allocations_big; - uint64_t frees; - uint64_t to_freelist; - uint64_t from_freelist; - uint64_t new_values; - uint64_t dict_materialized_on_request; - uint64_t dict_materialized_new_key; - uint64_t dict_materialized_too_big; - uint64_t dict_materialized_str_subclass; -} ObjectStats; - -typedef struct _stats { - OpcodeStats opcode_stats[256]; - CallStats call_stats; - ObjectStats object_stats; -} PyStats; - -extern PyStats _py_stats; #define STAT_INC(opname, name) _py_stats.opcode_stats[opname].specialization.name++ #define STAT_DEC(opname, name) _py_stats.opcode_stats[opname].specialization.name-- @@ -321,8 +274,6 @@ extern PyStats _py_stats; #define OBJECT_STAT_INC_COND(name, cond) \ do { if (cond) _py_stats.object_stats.name++; } while (0) -extern void _Py_PrintSpecializationStats(int to_file); - // Used by the _opcode extension which is built as a shared library PyAPI_FUNC(PyObject*) _Py_GetSpecializationStats(void); diff --git a/Include/internal/pycore_object.h b/Include/internal/pycore_object.h index f022f8246989d..cc50418e2ef40 100644 --- a/Include/internal/pycore_object.h +++ b/Include/internal/pycore_object.h @@ -34,6 +34,7 @@ PyAPI_FUNC(void) _Py_NO_RETURN _Py_FatalRefcountErrorFunc( static inline void _Py_DECREF_SPECIALIZED(PyObject *op, const destructor destruct) { + _Py_DECREF_STAT_INC(); #ifdef Py_REF_DEBUG _Py_RefTotal--; #endif @@ -51,6 +52,7 @@ _Py_DECREF_SPECIALIZED(PyObject *op, const destructor destruct) static inline void _Py_DECREF_NO_DEALLOC(PyObject *op) { + _Py_DECREF_STAT_INC(); #ifdef Py_REF_DEBUG _Py_RefTotal--; #endif diff --git a/Include/object.h b/Include/object.h index f2af428e2bb97..f01b9fa86d014 100644 --- a/Include/object.h +++ b/Include/object.h @@ -51,6 +51,8 @@ A standard interface exists for objects that contain an array of items whose size is determined when the object is allocated. */ +#include "pystats.h" + /* Py_DEBUG implies Py_REF_DEBUG. */ #if defined(Py_DEBUG) && !defined(Py_REF_DEBUG) # define Py_REF_DEBUG @@ -490,6 +492,7 @@ PyAPI_FUNC(void) _Py_DecRef(PyObject *); static inline void Py_INCREF(PyObject *op) { + _Py_INCREF_STAT_INC(); #if defined(Py_REF_DEBUG) && defined(Py_LIMITED_API) && Py_LIMITED_API+0 >= 0x030A0000 // Stable ABI for Python 3.10 built in debug mode. _Py_IncRef(op); @@ -506,7 +509,6 @@ static inline void Py_INCREF(PyObject *op) # define Py_INCREF(op) Py_INCREF(_PyObject_CAST(op)) #endif - #if defined(Py_REF_DEBUG) && defined(Py_LIMITED_API) && Py_LIMITED_API+0 >= 0x030A0000 // Stable ABI for limited C API version 3.10 of Python debug build static inline void Py_DECREF(PyObject *op) { @@ -517,6 +519,7 @@ static inline void Py_DECREF(PyObject *op) { #elif defined(Py_REF_DEBUG) static inline void Py_DECREF(const char *filename, int lineno, PyObject *op) { + _Py_DECREF_STAT_INC(); _Py_RefTotal--; if (--op->ob_refcnt != 0) { if (op->ob_refcnt < 0) { @@ -532,6 +535,7 @@ static inline void Py_DECREF(const char *filename, int lineno, PyObject *op) #else static inline void Py_DECREF(PyObject *op) { + _Py_DECREF_STAT_INC(); // Non-limited C API and limited C API for Python 3.9 and older access // directly PyObject.ob_refcnt. if (--op->ob_refcnt == 0) { diff --git a/Include/pystats.h b/Include/pystats.h new file mode 100644 index 0000000000000..bc05dd864c63a --- /dev/null +++ b/Include/pystats.h @@ -0,0 +1,77 @@ + + +#ifndef Py_PYSTATS_H +#define Py_PYSTATS_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef Py_STATS + +#define SPECIALIZATION_FAILURE_KINDS 32 + +typedef struct _specialization_stats { + uint64_t success; + uint64_t failure; + uint64_t hit; + uint64_t deferred; + uint64_t miss; + uint64_t deopt; + uint64_t failure_kinds[SPECIALIZATION_FAILURE_KINDS]; +} SpecializationStats; + +typedef struct _opcode_stats { + SpecializationStats specialization; + uint64_t execution_count; + uint64_t pair_count[256]; +} OpcodeStats; + +typedef struct _call_stats { + uint64_t inlined_py_calls; + uint64_t pyeval_calls; + uint64_t frames_pushed; + uint64_t frame_objects_created; +} CallStats; + +typedef struct _object_stats { + uint64_t increfs; + uint64_t decrefs; + uint64_t allocations; + uint64_t allocations512; + uint64_t allocations4k; + uint64_t allocations_big; + uint64_t frees; + uint64_t to_freelist; + uint64_t from_freelist; + uint64_t new_values; + uint64_t dict_materialized_on_request; + uint64_t dict_materialized_new_key; + uint64_t dict_materialized_too_big; + uint64_t dict_materialized_str_subclass; +} ObjectStats; + +typedef struct _stats { + OpcodeStats opcode_stats[256]; + CallStats call_stats; + ObjectStats object_stats; +} PyStats; + +PyAPI_DATA(PyStats) _py_stats; + +extern void _Py_PrintSpecializationStats(int to_file); + + +#define _Py_INCREF_STAT_INC() _py_stats.object_stats.increfs++ +#define _Py_DECREF_STAT_INC() _py_stats.object_stats.decrefs++ + +#else + +#define _Py_INCREF_STAT_INC() ((void)0) +#define _Py_DECREF_STAT_INC() ((void)0) + +#endif // !Py_STATS + +#ifdef __cplusplus +} +#endif +#endif /* !Py_PYSTATs_H */ diff --git a/Makefile.pre.in b/Makefile.pre.in index 515c18cc21666..a178dd0a65c73 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -1509,6 +1509,7 @@ PYTHON_HEADERS= \ $(srcdir)/Include/pymem.h \ $(srcdir)/Include/pyport.h \ $(srcdir)/Include/pystate.h \ + $(srcdir)/Include/pystats.h \ $(srcdir)/Include/pystrcmp.h \ $(srcdir)/Include/pystrtod.h \ $(srcdir)/Include/pythonrun.h \ diff --git a/PCbuild/pythoncore.vcxproj b/PCbuild/pythoncore.vcxproj index a35884b3c3588..be76f1bc55859 100644 --- a/PCbuild/pythoncore.vcxproj +++ b/PCbuild/pythoncore.vcxproj @@ -280,6 +280,7 @@ + diff --git a/PCbuild/pythoncore.vcxproj.filters b/PCbuild/pythoncore.vcxproj.filters index ff42cc92c4bd2..5573e0020491a 100644 --- a/PCbuild/pythoncore.vcxproj.filters +++ b/PCbuild/pythoncore.vcxproj.filters @@ -174,6 +174,9 @@ Include + + Include + Include diff --git a/Python/ceval.c b/Python/ceval.c index c73218fcf307e..c81d0efff9b9b 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -55,6 +55,7 @@ #undef Py_DECREF #define Py_DECREF(arg) \ do { \ + _Py_DECREF_STAT_INC(); \ PyObject *op = _PyObject_CAST(arg); \ if (--op->ob_refcnt == 0) { \ destructor dealloc = Py_TYPE(op)->tp_dealloc; \ @@ -78,6 +79,7 @@ #undef _Py_DECREF_SPECIALIZED #define _Py_DECREF_SPECIALIZED(arg, dealloc) \ do { \ + _Py_DECREF_STAT_INC(); \ PyObject *op = _PyObject_CAST(arg); \ if (--op->ob_refcnt == 0) { \ destructor d = (destructor)(dealloc); \ diff --git a/Python/specialize.c b/Python/specialize.c index fa42993606fd6..6a91389f85610 100644 --- a/Python/specialize.c +++ b/Python/specialize.c @@ -191,6 +191,8 @@ print_object_stats(FILE *out, ObjectStats *stats) fprintf(out, "Object allocations over 4 kbytes: %" PRIu64 "\n", stats->allocations_big); fprintf(out, "Object frees: %" PRIu64 "\n", stats->frees); fprintf(out, "Object new values: %" PRIu64 "\n", stats->new_values); + fprintf(out, "Object increfs: %" PRIu64 "\n", stats->increfs); + fprintf(out, "Object decrefs: %" PRIu64 "\n", stats->decrefs); fprintf(out, "Object materialize dict (on request): %" PRIu64 "\n", stats->dict_materialized_on_request); fprintf(out, "Object materialize dict (new key): %" PRIu64 "\n", stats->dict_materialized_new_key); fprintf(out, "Object materialize dict (too big): %" PRIu64 "\n", stats->dict_materialized_too_big); diff --git a/Tools/scripts/summarize_stats.py b/Tools/scripts/summarize_stats.py index bc528ca316f93..91b190114008e 100644 --- a/Tools/scripts/summarize_stats.py +++ b/Tools/scripts/summarize_stats.py @@ -8,6 +8,7 @@ from datetime import date import itertools import argparse +import sys if os.name == "nt": DEFAULT_DIR = "c:\\temp\\py_stats\\" @@ -88,7 +89,11 @@ def gather_stats(): for filename in os.listdir(DEFAULT_DIR): with open(os.path.join(DEFAULT_DIR, filename)) as fd: for line in fd: - key, value = line.split(":") + try: + key, value = line.split(":") + except ValueError: + print (f"Unparsable line: '{line.strip()}' in {filename}", file=sys.stderr) + continue key = key.strip() value = int(value) stats[key] += value @@ -265,17 +270,20 @@ def emit_call_stats(stats): def emit_object_stats(stats): with Section("Object stats", summary="allocations, frees and dict materializatons"): - total = stats.get("Object new values") + total_materializations = stats.get("Object new values") + total_allocations = stats.get("Object allocations") rows = [] for key, value in stats.items(): if key.startswith("Object"): if "materialize" in key: - materialize = f"{100*value/total:0.1f}%" + ratio = f"{100*value/total_materializations:0.1f}%" + elif "allocations" in key: + ratio = f"{100*value/total_allocations:0.1f}%" else: - materialize = "" + ratio = "" label = key[6:].strip() label = label[0].upper() + label[1:] - rows.append((label, value, materialize)) + rows.append((label, value, ratio)) emit_table(("", "Count:", "Ratio:"), rows) def get_total(opcode_stats): From webhook-mailer at python.org Mon May 16 10:02:55 2022 From: webhook-mailer at python.org (tiran) Date: Mon, 16 May 2022 14:02:55 -0000 Subject: [Python-checkins] gh-90473: Skip tests that don't apply to Emscripten and WASI (GH-92846) Message-ID: https://github.com/python/cpython/commit/9b50585e0225a80f9e383edacc7d73f1b5c8008b commit: 9b50585e0225a80f9e383edacc7d73f1b5c8008b branch: main author: Christian Heimes committer: tiran date: 2022-05-16T16:02:37+02:00 summary: gh-90473: Skip tests that don't apply to Emscripten and WASI (GH-92846) files: M Lib/test/support/__init__.py M Lib/test/test__locale.py M Lib/test/test_cmd_line_script.py M Lib/test/test_coroutines.py M Lib/test/test_genericpath.py M Lib/test/test_inspect.py M Lib/test/test_locale.py M Lib/test/test_pydoc.py M Lib/test/test_pyexpat.py M Lib/test/test_re.py M Lib/test/test_robotparser.py M Lib/test/test_selectors.py M Lib/test/test_support.py M Lib/test/test_venv.py diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py index bddfe118e369d..e4bda940b3dd6 100644 --- a/Lib/test/support/__init__.py +++ b/Lib/test/support/__init__.py @@ -521,7 +521,7 @@ def requires_subprocess(): """Used for subprocess, os.spawn calls, fd inheritance""" return unittest.skipUnless(has_subprocess_support, "requires subprocess support") -# Emscripten's socket emulation has limitation. WASI doesn't have sockets yet. +# Emscripten's socket emulation and WASI sockets have limitations. has_socket_support = not is_emscripten and not is_wasi def requires_working_socket(*, module=False): diff --git a/Lib/test/test__locale.py b/Lib/test/test__locale.py index b3bc54cd55104..0947464bb8c04 100644 --- a/Lib/test/test__locale.py +++ b/Lib/test/test__locale.py @@ -109,7 +109,8 @@ def numeric_tester(self, calc_type, calc_value, data_type, used_locale): @unittest.skipUnless(nl_langinfo, "nl_langinfo is not available") @unittest.skipIf( - support.is_emscripten, "musl libc issue on Emscripten, bpo-46390" + support.is_emscripten or support.is_wasi, + "musl libc issue on Emscripten, bpo-46390" ) def test_lc_numeric_nl_langinfo(self): # Test nl_langinfo against known values @@ -128,7 +129,8 @@ def test_lc_numeric_nl_langinfo(self): self.skipTest('no suitable locales') @unittest.skipIf( - support.is_emscripten, "musl libc issue on Emscripten, bpo-46390" + support.is_emscripten or support.is_wasi, + "musl libc issue on Emscripten, bpo-46390" ) def test_lc_numeric_localeconv(self): # Test localeconv against known values diff --git a/Lib/test/test_cmd_line_script.py b/Lib/test/test_cmd_line_script.py index bb433dc1e73a4..d783af65839ad 100644 --- a/Lib/test/test_cmd_line_script.py +++ b/Lib/test/test_cmd_line_script.py @@ -558,8 +558,9 @@ def test_non_ascii(self): # Mac OS X denies the creation of a file with an invalid UTF-8 name. # Windows allows creating a name with an arbitrary bytes name, but # Python cannot a undecodable bytes argument to a subprocess. + # WASI does not permit invalid UTF-8 names. if (os_helper.TESTFN_UNDECODABLE - and sys.platform not in ('win32', 'darwin')): + and sys.platform not in ('win32', 'darwin', 'emscripten', 'wasi')): name = os.fsdecode(os_helper.TESTFN_UNDECODABLE) elif os_helper.TESTFN_NONASCII: name = os_helper.TESTFN_NONASCII diff --git a/Lib/test/test_coroutines.py b/Lib/test/test_coroutines.py index 77944e678c750..dba5ceffaf1c0 100644 --- a/Lib/test/test_coroutines.py +++ b/Lib/test/test_coroutines.py @@ -2209,7 +2209,8 @@ async def f(): @unittest.skipIf( - support.is_emscripten, "asyncio does not work under Emscripten yet." + support.is_emscripten or support.is_wasi, + "asyncio does not work under Emscripten/WASI yet." ) class CoroAsyncIOCompatTest(unittest.TestCase): diff --git a/Lib/test/test_genericpath.py b/Lib/test/test_genericpath.py index 2741adc139bcf..489044f8090d3 100644 --- a/Lib/test/test_genericpath.py +++ b/Lib/test/test_genericpath.py @@ -484,7 +484,7 @@ def test_nonascii_abspath(self): # invalid UTF-8 name. Windows allows creating a directory with an # arbitrary bytes name, but fails to enter this directory # (when the bytes name is used). - and sys.platform not in ('win32', 'darwin', 'emscripten')): + and sys.platform not in ('win32', 'darwin', 'emscripten', 'wasi')): name = os_helper.TESTFN_UNDECODABLE elif os_helper.TESTFN_NONASCII: name = os_helper.TESTFN_NONASCII diff --git a/Lib/test/test_inspect.py b/Lib/test/test_inspect.py index fe0259ab609c7..ae1842704d37d 100644 --- a/Lib/test/test_inspect.py +++ b/Lib/test/test_inspect.py @@ -842,7 +842,10 @@ def test_nested_class_definition_inside_function(self): self.assertSourceEqual(mod2.cls213, 218, 222) self.assertSourceEqual(mod2.cls213().func219(), 220, 221) - @unittest.skipIf(support.is_emscripten, "socket.accept is broken") + @unittest.skipIf( + support.is_emscripten or support.is_wasi, + "socket.accept is broken" + ) def test_nested_class_definition_inside_async_function(self): import asyncio self.addCleanup(asyncio.set_event_loop_policy, None) diff --git a/Lib/test/test_locale.py b/Lib/test/test_locale.py index 5cb6edc52d777..bc8a7a35fbf2d 100644 --- a/Lib/test/test_locale.py +++ b/Lib/test/test_locale.py @@ -1,5 +1,5 @@ from decimal import Decimal -from test.support import verbose, is_android, is_emscripten +from test.support import verbose, is_android, is_emscripten, is_wasi from test.support.warnings_helper import check_warnings import unittest import locale @@ -373,13 +373,19 @@ def setUp(self): @unittest.skipIf(sys.platform.startswith('aix'), 'bpo-29972: broken test on AIX') - @unittest.skipIf(is_emscripten, "musl libc issue on Emscripten, bpo-46390") + @unittest.skipIf( + is_emscripten or is_wasi, + "musl libc issue on Emscripten/WASI, bpo-46390" + ) def test_strcoll_with_diacritic(self): self.assertLess(locale.strcoll('?', 'b'), 0) @unittest.skipIf(sys.platform.startswith('aix'), 'bpo-29972: broken test on AIX') - @unittest.skipIf(is_emscripten, "musl libc issue on Emscripten, bpo-46390") + @unittest.skipIf( + is_emscripten or is_wasi, + "musl libc issue on Emscripten/WASI, bpo-46390" + ) def test_strxfrm_with_diacritic(self): self.assertLess(locale.strxfrm('?'), locale.strxfrm('b')) diff --git a/Lib/test/test_pydoc.py b/Lib/test/test_pydoc.py index 13c77b6fa6822..ac181effe49bb 100644 --- a/Lib/test/test_pydoc.py +++ b/Lib/test/test_pydoc.py @@ -27,7 +27,8 @@ from test.support.script_helper import assert_python_ok, assert_python_failure from test.support import threading_helper from test.support import (reap_children, captured_output, captured_stdout, - captured_stderr, is_emscripten, requires_docstrings) + captured_stderr, is_emscripten, is_wasi, + requires_docstrings) from test.support.os_helper import (TESTFN, rmtree, unlink) from test import pydoc_mod @@ -1356,7 +1357,10 @@ def a_fn_with_https_link(): ) - at unittest.skipIf(is_emscripten, "Socket server not available on Emscripten.") + at unittest.skipIf( + is_emscripten or is_wasi, + "Socket server not available on Emscripten/WASI." +) class PydocServerTest(unittest.TestCase): """Tests for pydoc._start_server""" diff --git a/Lib/test/test_pyexpat.py b/Lib/test/test_pyexpat.py index 6e578458a2509..6f0441b66d9b8 100644 --- a/Lib/test/test_pyexpat.py +++ b/Lib/test/test_pyexpat.py @@ -12,7 +12,7 @@ from xml.parsers import expat from xml.parsers.expat import errors -from test.support import sortdict, is_emscripten +from test.support import sortdict, is_emscripten, is_wasi class SetAttributeTest(unittest.TestCase): @@ -469,6 +469,7 @@ def test_exception(self): if (sysconfig.is_python_build() and not (sys.platform == 'win32' and platform.machine() == 'ARM') and not is_emscripten + and not is_wasi ): self.assertIn('call_with_frame("StartElement"', entries[1][3]) diff --git a/Lib/test/test_re.py b/Lib/test/test_re.py index ba70de4344bd9..52ee616e210fb 100644 --- a/Lib/test/test_re.py +++ b/Lib/test/test_re.py @@ -1,6 +1,6 @@ from test.support import (gc_collect, bigmemtest, _2G, cpython_only, captured_stdout, - check_disallow_instantiation, is_emscripten) + check_disallow_instantiation, is_emscripten, is_wasi) import locale import re import string @@ -1943,7 +1943,10 @@ def test_bug_20998(self): # with ignore case. self.assertEqual(re.fullmatch('[a-c]+', 'ABC', re.I).span(), (0, 3)) - @unittest.skipIf(is_emscripten, "musl libc issue on Emscripten, bpo-46390") + @unittest.skipIf( + is_emscripten or is_wasi, + "musl libc issue on Emscripten/WASI, bpo-46390" + ) def test_locale_caching(self): # Issue #22410 oldlocale = locale.setlocale(locale.LC_CTYPE) @@ -1980,7 +1983,10 @@ def check_en_US_utf8(self): self.assertIsNone(re.match(b'(?Li)\xc5', b'\xe5')) self.assertIsNone(re.match(b'(?Li)\xe5', b'\xc5')) - @unittest.skipIf(is_emscripten, "musl libc issue on Emscripten, bpo-46390") + @unittest.skipIf( + is_emscripten or is_wasi, + "musl libc issue on Emscripten/WASI, bpo-46390" + ) def test_locale_compiled(self): oldlocale = locale.setlocale(locale.LC_CTYPE) self.addCleanup(locale.setlocale, locale.LC_CTYPE, oldlocale) diff --git a/Lib/test/test_robotparser.py b/Lib/test/test_robotparser.py index 3821d66c2db7d..8d89e2a822445 100644 --- a/Lib/test/test_robotparser.py +++ b/Lib/test/test_robotparser.py @@ -308,8 +308,9 @@ def log_message(self, format, *args): pass - at unittest.skipIf( - support.is_emscripten, "Socket server not available on Emscripten." + at unittest.skipUnless( + support.has_socket_support, + "Socket server requires working socket." ) class PasswordProtectedSiteTestCase(unittest.TestCase): diff --git a/Lib/test/test_selectors.py b/Lib/test/test_selectors.py index c927331d438b0..c2db88c203920 100644 --- a/Lib/test/test_selectors.py +++ b/Lib/test/test_selectors.py @@ -19,8 +19,8 @@ resource = None -if support.is_emscripten: - raise unittest.SkipTest("Cannot create socketpair on Emscripten.") +if support.is_emscripten or support.is_wasi: + raise unittest.SkipTest("Cannot create socketpair on Emscripten/WASI.") if hasattr(socket, 'socketpair'): diff --git a/Lib/test/test_support.py b/Lib/test/test_support.py index dce49809385c6..7a8b6819c5a91 100644 --- a/Lib/test/test_support.py +++ b/Lib/test/test_support.py @@ -691,7 +691,7 @@ def test_print_warning(self): 'Warning -- a\nWarning -- b\n') def test_has_strftime_extensions(self): - if support.is_emscripten or support.is_wasi or sys.platform == "win32": + if support.is_emscripten or sys.platform == "win32": self.assertFalse(support.has_strftime_extensions) else: self.assertTrue(support.has_strftime_extensions) diff --git a/Lib/test/test_venv.py b/Lib/test/test_venv.py index 4f897523907ef..9f2ecf3be644a 100644 --- a/Lib/test/test_venv.py +++ b/Lib/test/test_venv.py @@ -16,7 +16,7 @@ import tempfile from test.support import (captured_stdout, captured_stderr, requires_zlib, skip_if_broken_multiprocessing_synchronize, verbose, - requires_subprocess, is_emscripten, + requires_subprocess, is_emscripten, is_wasi, requires_venv_with_pip) from test.support.os_helper import (can_symlink, EnvironmentVarGuard, rmtree) import unittest @@ -35,8 +35,8 @@ or sys._base_executable != sys.executable, 'cannot run venv.create from within a venv on this platform') -if is_emscripten: - raise unittest.SkipTest("venv is not available on Emscripten.") +if is_emscripten or is_wasi: + raise unittest.SkipTest("venv is not available on Emscripten/WASI.") @requires_subprocess() def check_output(cmd, encoding=None): From webhook-mailer at python.org Mon May 16 11:25:52 2022 From: webhook-mailer at python.org (ambv) Date: Mon, 16 May 2022 15:25:52 -0000 Subject: [Python-checkins] gh-92530: Fix an issue that occurred after interrupting threading.Condition.notify (GH-92534) (GH-92831) Message-ID: https://github.com/python/cpython/commit/14d05942ea21d4a95c9eac1f0bae53540d8f1602 commit: 14d05942ea21d4a95c9eac1f0bae53540d8f1602 branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: ambv date: 2022-05-16T17:25:31+02:00 summary: gh-92530: Fix an issue that occurred after interrupting threading.Condition.notify (GH-92534) (GH-92831) If Condition.notify() was interrupted just after it released the waiter lock, but before removing it from the queue, the following calls of notify() failed with RuntimeError: cannot release un-acquired lock. (cherry picked from commit 70af994fee7c0850ae859727d9468a5f29375a38) Co-authored-by: Serhiy Storchaka files: A Misc/NEWS.d/next/Library/2022-05-09-09-28-02.gh-issue-92530.M4Q1RS.rst M Lib/threading.py diff --git a/Lib/threading.py b/Lib/threading.py index a3cb245ab9606..565f868e928d2 100644 --- a/Lib/threading.py +++ b/Lib/threading.py @@ -360,14 +360,21 @@ def notify(self, n=1): """ if not self._is_owned(): raise RuntimeError("cannot notify on un-acquired lock") - all_waiters = self._waiters - waiters_to_notify = _deque(_islice(all_waiters, n)) - if not waiters_to_notify: - return - for waiter in waiters_to_notify: - waiter.release() + waiters = self._waiters + while waiters and n > 0: + waiter = waiters[0] + try: + waiter.release() + except RuntimeError: + # gh-92530: The previous call of notify() released the lock, + # but was interrupted before removing it from the queue. + # It can happen if a signal handler raises an exception, + # like CTRL+C which raises KeyboardInterrupt. + pass + else: + n -= 1 try: - all_waiters.remove(waiter) + waiters.remove(waiter) except ValueError: pass diff --git a/Misc/NEWS.d/next/Library/2022-05-09-09-28-02.gh-issue-92530.M4Q1RS.rst b/Misc/NEWS.d/next/Library/2022-05-09-09-28-02.gh-issue-92530.M4Q1RS.rst new file mode 100644 index 0000000000000..8bb8ca0488c96 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-05-09-09-28-02.gh-issue-92530.M4Q1RS.rst @@ -0,0 +1,2 @@ +Fix an issue that occurred after interrupting +:func:`threading.Condition.notify`. From webhook-mailer at python.org Mon May 16 11:32:39 2022 From: webhook-mailer at python.org (ambv) Date: Mon, 16 May 2022 15:32:39 -0000 Subject: [Python-checkins] gh-80143: Add clarification for escape characters (GH-92292) (GH-92630) Message-ID: https://github.com/python/cpython/commit/4d05114ae74a5028c7d645a8257e18c5b9ddfa78 commit: 4d05114ae74a5028c7d645a8257e18c5b9ddfa78 branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: ambv date: 2022-05-16T17:32:28+02:00 summary: gh-80143: Add clarification for escape characters (GH-92292) (GH-92630) (cherry picked from commit 549567c6e70da4846c105a18a1a89e7dd09680d7) Co-authored-by: slateny <46876382+slateny at users.noreply.github.com> files: M Doc/reference/lexical_analysis.rst diff --git a/Doc/reference/lexical_analysis.rst b/Doc/reference/lexical_analysis.rst index 17c0fb4a51eb4..b8f9ca21c0682 100644 --- a/Doc/reference/lexical_analysis.rst +++ b/Doc/reference/lexical_analysis.rst @@ -447,9 +447,11 @@ see section :ref:`encodings`. In plain English: Both types of literals can be enclosed in matching single quotes (``'``) or double quotes (``"``). They can also be enclosed in matching groups of three single or double quotes (these are generally referred to as -*triple-quoted strings*). The backslash (``\``) character is used to escape -characters that otherwise have a special meaning, such as newline, backslash -itself, or the quote character. +*triple-quoted strings*). The backslash (``\``) character is used to give special +meaning to otherwise ordinary characters like ``n``, which means 'newline' when +escaped (``\n``). It can also be used to escape characters that otherwise have a +special meaning, such as newline, backslash itself, or the quote character. +See :ref:`escape sequences ` below for examples. .. index:: single: b'; bytes literal @@ -508,6 +510,8 @@ retained), except that three unescaped quotes in a row terminate the literal. ( single: \u; escape sequence single: \U; escape sequence +.. _escape-sequences: + Unless an ``'r'`` or ``'R'`` prefix is present, escape sequences in string and bytes literals are interpreted according to rules similar to those used by Standard C. The recognized escape sequences are: From webhook-mailer at python.org Mon May 16 11:33:11 2022 From: webhook-mailer at python.org (ambv) Date: Mon, 16 May 2022 15:33:11 -0000 Subject: [Python-checkins] Check result of utc_to_seconds and skip fold probe in pure Python (GH-91582) (GH-92748) Message-ID: https://github.com/python/cpython/commit/1699a5ee13a39da73f5d9a8c5def4438200b7b59 commit: 1699a5ee13a39da73f5d9a8c5def4438200b7b59 branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: ambv date: 2022-05-16T17:33:01+02:00 summary: Check result of utc_to_seconds and skip fold probe in pure Python (GH-91582) (GH-92748) The `utc_to_seconds` call can fail, here's a minimal reproducer on Linux: TZ=UTC python -c "from datetime import *; datetime.fromtimestamp(253402300799 + 1)" The old behavior still raised an error in a similar way, but only because subsequent calculations happened to fail as well. Better to fail fast. This also refactors the tests to split out the `fromtimestamp` and `utcfromtimestamp` tests, and to get us closer to the actual desired limits of the functions. As part of this, we also changed the way we detect platforms where the same limits don't necessarily apply (e.g. Windows). As part of refactoring the tests to hit this condition explicitly (even though the user-facing behvior doesn't change in any way we plan to guarantee), I noticed that there was a difference in the places that `datetime.utcfromtimestamp` fails in the C and pure Python versions, which was fixed by skipping the "probe for fold" logic for UTC specifically ? since UTC doesn't have any folds or gaps, we were never going to find a fold value anyway. This should prevent some failures in the pure python `utcfromtimestamp` method on timestamps close to 0001-01-01. There are two separate news entries for this because one is a potentially user-facing change, the other is an internal code correctness change that, if anything, changes some error messages. The two happen to be coupled because of the test refactoring, but they are probably best thought of as independent changes. Fixes GH-91581 (cherry picked from commit 83c0247d47b99f4571e35ea95361436e1d2a61cd) Co-authored-by: Paul Ganssle <1377457+pganssle at users.noreply.github.com> files: A Misc/NEWS.d/next/Library/2022-04-15-13-16-25.gh-issue-91581.9OGsrN.rst A Misc/NEWS.d/next/Library/2022-05-11-14-34-09.gh-issue-91581.glkou2.rst M Lib/datetime.py M Lib/test/datetimetester.py M Modules/_datetimemodule.c diff --git a/Lib/datetime.py b/Lib/datetime.py index 23d2bf0918145..51c704994bcd4 100644 --- a/Lib/datetime.py +++ b/Lib/datetime.py @@ -1683,7 +1683,7 @@ def _fromtimestamp(cls, t, utc, tz): y, m, d, hh, mm, ss, weekday, jday, dst = converter(t) ss = min(ss, 59) # clamp out leap seconds if the platform has them result = cls(y, m, d, hh, mm, ss, us, tz) - if tz is None: + if tz is None and not utc: # As of version 2015f max fold in IANA database is # 23 hours at 1969-09-30 13:00:00 in Kwajalein. # Let's probe 24 hours in the past to detect a transition: @@ -1704,7 +1704,7 @@ def _fromtimestamp(cls, t, utc, tz): probe2 = cls(y, m, d, hh, mm, ss, us, tz) if probe2 == result: result._fold = 1 - else: + elif tz is not None: result = tz.fromutc(result) return result diff --git a/Lib/test/datetimetester.py b/Lib/test/datetimetester.py index 361d5e9ba7e0a..aa5fe82afb065 100644 --- a/Lib/test/datetimetester.py +++ b/Lib/test/datetimetester.py @@ -2467,45 +2467,101 @@ def test_microsecond_rounding(self): self.assertEqual(t.microsecond, 7812) def test_timestamp_limits(self): - # minimum timestamp - min_dt = self.theclass.min.replace(tzinfo=timezone.utc) + with self.subTest("minimum UTC"): + min_dt = self.theclass.min.replace(tzinfo=timezone.utc) + min_ts = min_dt.timestamp() + + # This test assumes that datetime.min == 0000-01-01T00:00:00.00 + # If that assumption changes, this value can change as well + self.assertEqual(min_ts, -62135596800) + + with self.subTest("maximum UTC"): + # Zero out microseconds to avoid rounding issues + max_dt = self.theclass.max.replace(tzinfo=timezone.utc, + microsecond=0) + max_ts = max_dt.timestamp() + + # This test assumes that datetime.max == 9999-12-31T23:59:59.999999 + # If that assumption changes, this value can change as well + self.assertEqual(max_ts, 253402300799.0) + + def test_fromtimestamp_limits(self): + try: + self.theclass.fromtimestamp(-2**32 - 1) + except (OSError, OverflowError): + self.skipTest("Test not valid on this platform") + + # XXX: Replace these with datetime.{min,max}.timestamp() when we solve + # the issue with gh-91012 + min_dt = self.theclass.min + timedelta(days=1) min_ts = min_dt.timestamp() + + max_dt = self.theclass.max.replace(microsecond=0) + max_ts = ((self.theclass.max - timedelta(hours=23)).timestamp() + + timedelta(hours=22, minutes=59, seconds=59).total_seconds()) + + for (test_name, ts, expected) in [ + ("minimum", min_ts, min_dt), + ("maximum", max_ts, max_dt), + ]: + with self.subTest(test_name, ts=ts, expected=expected): + actual = self.theclass.fromtimestamp(ts) + + self.assertEqual(actual, expected) + + # Test error conditions + test_cases = [ + ("Too small by a little", min_ts - timedelta(days=1, hours=12).total_seconds()), + ("Too small by a lot", min_ts - timedelta(days=400).total_seconds()), + ("Too big by a little", max_ts + timedelta(days=1).total_seconds()), + ("Too big by a lot", max_ts + timedelta(days=400).total_seconds()), + ] + + for test_name, ts in test_cases: + with self.subTest(test_name, ts=ts): + with self.assertRaises((ValueError, OverflowError)): + # converting a Python int to C time_t can raise a + # OverflowError, especially on 32-bit platforms. + self.theclass.fromtimestamp(ts) + + def test_utcfromtimestamp_limits(self): try: - # date 0001-01-01 00:00:00+00:00: timestamp=-62135596800 - self.assertEqual(self.theclass.fromtimestamp(min_ts, tz=timezone.utc), - min_dt) - except (OverflowError, OSError) as exc: - # the date 0001-01-01 doesn't fit into 32-bit time_t, - # or platform doesn't support such very old date - self.skipTest(str(exc)) - - # maximum timestamp: set seconds to zero to avoid rounding issues - max_dt = self.theclass.max.replace(tzinfo=timezone.utc, - second=0, microsecond=0) + self.theclass.utcfromtimestamp(-2**32 - 1) + except (OSError, OverflowError): + self.skipTest("Test not valid on this platform") + + min_dt = self.theclass.min.replace(tzinfo=timezone.utc) + min_ts = min_dt.timestamp() + + max_dt = self.theclass.max.replace(microsecond=0, tzinfo=timezone.utc) max_ts = max_dt.timestamp() - # date 9999-12-31 23:59:00+00:00: timestamp 253402300740 - self.assertEqual(self.theclass.fromtimestamp(max_ts, tz=timezone.utc), - max_dt) - - # number of seconds greater than 1 year: make sure that the new date - # is not valid in datetime.datetime limits - delta = 3600 * 24 * 400 - - # too small - ts = min_ts - delta - # converting a Python int to C time_t can raise a OverflowError, - # especially on 32-bit platforms. - with self.assertRaises((ValueError, OverflowError)): - self.theclass.fromtimestamp(ts) - with self.assertRaises((ValueError, OverflowError)): - self.theclass.utcfromtimestamp(ts) - - # too big - ts = max_dt.timestamp() + delta - with self.assertRaises((ValueError, OverflowError)): - self.theclass.fromtimestamp(ts) - with self.assertRaises((ValueError, OverflowError)): - self.theclass.utcfromtimestamp(ts) + + for (test_name, ts, expected) in [ + ("minimum", min_ts, min_dt.replace(tzinfo=None)), + ("maximum", max_ts, max_dt.replace(tzinfo=None)), + ]: + with self.subTest(test_name, ts=ts, expected=expected): + try: + actual = self.theclass.utcfromtimestamp(ts) + except (OSError, OverflowError) as exc: + self.skipTest(str(exc)) + + self.assertEqual(actual, expected) + + # Test error conditions + test_cases = [ + ("Too small by a little", min_ts - 1), + ("Too small by a lot", min_ts - timedelta(days=400).total_seconds()), + ("Too big by a little", max_ts + 1), + ("Too big by a lot", max_ts + timedelta(days=400).total_seconds()), + ] + + for test_name, ts in test_cases: + with self.subTest(test_name, ts=ts): + with self.assertRaises((ValueError, OverflowError)): + # converting a Python int to C time_t can raise a + # OverflowError, especially on 32-bit platforms. + self.theclass.utcfromtimestamp(ts) def test_insane_fromtimestamp(self): # It's possible that some platform maps time_t to double, diff --git a/Misc/NEWS.d/next/Library/2022-04-15-13-16-25.gh-issue-91581.9OGsrN.rst b/Misc/NEWS.d/next/Library/2022-04-15-13-16-25.gh-issue-91581.9OGsrN.rst new file mode 100644 index 0000000000000..1c3008f425578 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-04-15-13-16-25.gh-issue-91581.9OGsrN.rst @@ -0,0 +1,6 @@ +Remove an unhandled error case in the C implementation of calls to +:meth:`datetime.fromtimestamp ` with no time +zone (i.e. getting a local time from an epoch timestamp). This should have no +user-facing effect other than giving a possibly more accurate error message +when called with timestamps that fall on 10000-01-01 in the local time. Patch +by Paul Ganssle. diff --git a/Misc/NEWS.d/next/Library/2022-05-11-14-34-09.gh-issue-91581.glkou2.rst b/Misc/NEWS.d/next/Library/2022-05-11-14-34-09.gh-issue-91581.glkou2.rst new file mode 100644 index 0000000000000..846f57844a675 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-05-11-14-34-09.gh-issue-91581.glkou2.rst @@ -0,0 +1,5 @@ +:meth:`~datetime.datetime.utcfromtimestamp` no longer attempts to resolve +``fold`` in the pure Python implementation, since the fold is never 1 in UTC. +In addition to being slightly faster in the common case, this also prevents +some errors when the timestamp is close to :attr:`datetime.min +`. Patch by Paul Ganssle. diff --git a/Modules/_datetimemodule.c b/Modules/_datetimemodule.c index 960237540564b..51f363d8594ec 100644 --- a/Modules/_datetimemodule.c +++ b/Modules/_datetimemodule.c @@ -5013,6 +5013,10 @@ datetime_from_timet_and_us(PyObject *cls, TM_FUNC f, time_t timet, int us, result_seconds = utc_to_seconds(year, month, day, hour, minute, second); + if (result_seconds == -1 && PyErr_Occurred()) { + return NULL; + } + /* Probe max_fold_seconds to detect a fold. */ probe_seconds = local(epoch + timet - max_fold_seconds); if (probe_seconds == -1) From webhook-mailer at python.org Mon May 16 11:35:17 2022 From: webhook-mailer at python.org (ambv) Date: Mon, 16 May 2022 15:35:17 -0000 Subject: [Python-checkins] bpo-47194: Update zlib to v1.2.12 on Windows to resolve CVE-2018-25032 (GH-32241) (GH-32250) Message-ID: https://github.com/python/cpython/commit/7ccdec3d1d837b910cd4fc5525ecde71a1326202 commit: 7ccdec3d1d837b910cd4fc5525ecde71a1326202 branch: 3.8 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: ambv date: 2022-05-16T17:35:01+02:00 summary: bpo-47194: Update zlib to v1.2.12 on Windows to resolve CVE-2018-25032 (GH-32241) (GH-32250) (cherry picked from commit 6066739ff7794e54c98c08b953a699cbc961cd28) Co-authored-by: Zachary Ware files: A Misc/NEWS.d/next/Windows/2022-04-01-14-57-40.bpo-47194.IB0XL4.rst M PCbuild/get_externals.bat M PCbuild/python.props diff --git a/Misc/NEWS.d/next/Windows/2022-04-01-14-57-40.bpo-47194.IB0XL4.rst b/Misc/NEWS.d/next/Windows/2022-04-01-14-57-40.bpo-47194.IB0XL4.rst new file mode 100644 index 0000000000000..7e76add45fa95 --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2022-04-01-14-57-40.bpo-47194.IB0XL4.rst @@ -0,0 +1 @@ +Update ``zlib`` to v1.2.12 to resolve CVE-2018-25032. diff --git a/PCbuild/get_externals.bat b/PCbuild/get_externals.bat index e0183bf250ae8..9e2d70cd5d863 100644 --- a/PCbuild/get_externals.bat +++ b/PCbuild/get_externals.bat @@ -59,7 +59,7 @@ if NOT "%IncludeTkinterSrc%"=="false" set libraries=%libraries% tcl-core-8.6.9.0 if NOT "%IncludeTkinterSrc%"=="false" set libraries=%libraries% tk-8.6.9.0 if NOT "%IncludeTkinterSrc%"=="false" set libraries=%libraries% tix-8.4.3.6 set libraries=%libraries% xz-5.2.2 -set libraries=%libraries% zlib-1.2.11 +set libraries=%libraries% zlib-1.2.12 for %%e in (%libraries%) do ( if exist "%EXTERNALS_DIR%\%%e" ( diff --git a/PCbuild/python.props b/PCbuild/python.props index ec33f3d60e972..a2d541bd76ae9 100644 --- a/PCbuild/python.props +++ b/PCbuild/python.props @@ -66,7 +66,7 @@ $(ExternalsDir)openssl-bin-1.1.1n\$(ArchName)\ $(opensslOutDir)include $(ExternalsDir)\nasm-2.11.06\ - $(ExternalsDir)\zlib-1.2.11\ + $(ExternalsDir)\zlib-1.2.12\ _d From webhook-mailer at python.org Mon May 16 11:39:29 2022 From: webhook-mailer at python.org (ambv) Date: Mon, 16 May 2022 15:39:29 -0000 Subject: [Python-checkins] [3.8] gh-80254: Disallow recursive usage of cursors in sqlite3 converters (#92333) Message-ID: https://github.com/python/cpython/commit/69cf0203ab47692efbc261c028e15e0d7a245c57 commit: 69cf0203ab47692efbc261c028e15e0d7a245c57 branch: 3.8 author: Erlend Egeberg Aasland committer: ambv date: 2022-05-16T17:39:17+02:00 summary: [3.8] gh-80254: Disallow recursive usage of cursors in sqlite3 converters (#92333) (cherry picked from commit c908dc5b4798c311981bd7e1f7d92fb623ee448b) Co-authored-by: Sergey Fedoseev Co-authored-by: Jelle Zijlstra files: A Misc/NEWS.d/next/Library/2019-06-22-11-01-45.bpo-36073.ED8mB9.rst M Lib/sqlite3/test/regression.py M Modules/_sqlite/cursor.c diff --git a/Lib/sqlite3/test/regression.py b/Lib/sqlite3/test/regression.py index 206ecd7ac7537..9ef5a80c6ee0d 100644 --- a/Lib/sqlite3/test/regression.py +++ b/Lib/sqlite3/test/regression.py @@ -28,6 +28,9 @@ import functools from test import support +from unittest.mock import patch + + class RegressionTests(unittest.TestCase): def setUp(self): self.con = sqlite.connect(":memory:") @@ -413,10 +416,50 @@ def log(self, *args): +class RecursiveUseOfCursors(unittest.TestCase): + # GH-80254: sqlite3 should not segfault for recursive use of cursors. + msg = "Recursive use of cursors not allowed" + + def setUp(self): + self.con = sqlite.connect(":memory:", + detect_types=sqlite.PARSE_COLNAMES) + self.cur = self.con.cursor() + self.cur.execute("create table test(x foo)") + self.cur.executemany("insert into test(x) values (?)", + [("foo",), ("bar",)]) + + def tearDown(self): + self.cur.close() + self.con.close() + del self.cur + del self.con + + def test_recursive_cursor_init(self): + conv = lambda x: self.cur.__init__(self.con) + with patch.dict(sqlite.converters, {"INIT": conv}): + with self.assertRaisesRegex(sqlite.ProgrammingError, self.msg): + self.cur.execute(f'select x as "x [INIT]", x from test') + + def test_recursive_cursor_close(self): + conv = lambda x: self.cur.close() + with patch.dict(sqlite.converters, {"CLOSE": conv}): + with self.assertRaisesRegex(sqlite.ProgrammingError, self.msg): + self.cur.execute(f'select x as "x [CLOSE]", x from test') + + def test_recursive_cursor_fetch(self): + conv = lambda x, l=[]: self.cur.fetchone() if l else l.append(None) + with patch.dict(sqlite.converters, {"ITER": conv}): + self.cur.execute(f'select x as "x [ITER]", x from test') + with self.assertRaisesRegex(sqlite.ProgrammingError, self.msg): + self.cur.fetchall() + + def suite(): regression_suite = unittest.makeSuite(RegressionTests, "Check") + recursive_cursor = unittest.makeSuite(RecursiveUseOfCursors) return unittest.TestSuite(( regression_suite, + recursive_cursor, )) def test(): diff --git a/Misc/NEWS.d/next/Library/2019-06-22-11-01-45.bpo-36073.ED8mB9.rst b/Misc/NEWS.d/next/Library/2019-06-22-11-01-45.bpo-36073.ED8mB9.rst new file mode 100644 index 0000000000000..6c214d8191601 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-06-22-11-01-45.bpo-36073.ED8mB9.rst @@ -0,0 +1,2 @@ +Raise :exc:`~sqlite3.ProgrammingError` instead of segfaulting on recursive +usage of cursors in :mod:`sqlite3` converters. Patch by Sergey Fedoseev. diff --git a/Modules/_sqlite/cursor.c b/Modules/_sqlite/cursor.c index 8cfa6e50e8222..996a83e501318 100644 --- a/Modules/_sqlite/cursor.c +++ b/Modules/_sqlite/cursor.c @@ -27,10 +27,25 @@ PyObject* pysqlite_cursor_iternext(pysqlite_Cursor* self); +static inline int +check_cursor_locked(pysqlite_Cursor *cur) +{ + if (cur->locked) { + PyErr_SetString(pysqlite_ProgrammingError, + "Recursive use of cursors not allowed."); + return 0; + } + return 1; +} + static const char errmsg_fetch_across_rollback[] = "Cursor needed to be reset because of commit/rollback and can no longer be fetched from."; static int pysqlite_cursor_init(pysqlite_Cursor* self, PyObject* args, PyObject* kwargs) { + if (!check_cursor_locked(self)) { + return -1; + } + pysqlite_Connection* connection; if (!PyArg_ParseTuple(args, "O!", &pysqlite_ConnectionType, &connection)) @@ -357,12 +372,9 @@ static int check_cursor(pysqlite_Cursor* cur) return 0; } - if (cur->locked) { - PyErr_SetString(pysqlite_ProgrammingError, "Recursive use of cursors not allowed."); - return 0; - } - - return pysqlite_check_thread(cur->connection) && pysqlite_check_connection(cur->connection); + return (pysqlite_check_thread(cur->connection) + && pysqlite_check_connection(cur->connection) + && check_cursor_locked(cur)); } static PyObject * @@ -761,27 +773,29 @@ PyObject* pysqlite_cursor_iternext(pysqlite_Cursor *self) if (self->statement) { rc = pysqlite_step(self->statement->st, self->connection); if (PyErr_Occurred()) { - (void)pysqlite_statement_reset(self->statement); - Py_DECREF(next_row); - return NULL; + goto error; } if (rc != SQLITE_DONE && rc != SQLITE_ROW) { - (void)pysqlite_statement_reset(self->statement); - Py_DECREF(next_row); _pysqlite_seterror(self->connection->db, NULL); - return NULL; + goto error; } if (rc == SQLITE_ROW) { + self->locked = 1; // GH-80254: Prevent recursive use of cursors. self->next_row = _pysqlite_fetch_one_row(self); + self->locked = 0; if (self->next_row == NULL) { - (void)pysqlite_statement_reset(self->statement); - return NULL; + goto error; } } } return next_row; + +error: + (void)pysqlite_statement_reset(self->statement); + Py_DECREF(next_row); + return NULL; } PyObject* pysqlite_cursor_fetchone(pysqlite_Cursor* self, PyObject* args) @@ -876,6 +890,10 @@ PyObject* pysqlite_noop(pysqlite_Connection* self, PyObject* args) PyObject* pysqlite_cursor_close(pysqlite_Cursor* self, PyObject* args) { + if (!check_cursor_locked(self)) { + return NULL; + } + if (!self->connection) { PyErr_SetString(pysqlite_ProgrammingError, "Base Cursor.__init__ not called."); From webhook-mailer at python.org Mon May 16 12:19:11 2022 From: webhook-mailer at python.org (ambv) Date: Mon, 16 May 2022 16:19:11 -0000 Subject: [Python-checkins] [3.9] bpo-34480: fix bug where match variable is used prior to being defined (GH-17643) (GH-32256) Message-ID: https://github.com/python/cpython/commit/518b2389673833887b26a8474eeb9530d17e2b8d commit: 518b2389673833887b26a8474eeb9530d17e2b8d branch: 3.9 author: Marek Suscak committer: ambv date: 2022-05-16T18:19:04+02:00 summary: [3.9] bpo-34480: fix bug where match variable is used prior to being defined (GH-17643) (GH-32256) Co-authored-by: Ezio Melotti Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com> Co-authored-by: ?ukasz Langa files: A Misc/NEWS.d/next/Library/2022-04-09-11-28-49.bpo-34480.Pw-GJ6.rst M Lib/_markupbase.py M Lib/test/test_htmlparser.py diff --git a/Lib/_markupbase.py b/Lib/_markupbase.py index 2af5f1c23b606..7091eb635b37f 100644 --- a/Lib/_markupbase.py +++ b/Lib/_markupbase.py @@ -157,6 +157,7 @@ def parse_marked_section(self, i, report=1): match= _msmarkedsectionclose.search(rawdata, i+3) else: self.error('unknown status keyword %r in marked section' % rawdata[i+3:j]) + match = None if not match: return -1 if report: diff --git a/Lib/test/test_htmlparser.py b/Lib/test/test_htmlparser.py index 12917755a5601..44a76a445d8a5 100644 --- a/Lib/test/test_htmlparser.py +++ b/Lib/test/test_htmlparser.py @@ -787,5 +787,27 @@ def test_weird_chars_in_unquoted_attribute_values(self): ('starttag', 'form', [('action', 'bogus|&#()value')])]) + def test_invalid_keyword_error_exception(self): + # bpo-34480: check that subclasses that define an + # error method that raises an exception work + class InvalidMarkupException(Exception): + pass + class MyHTMLParser(html.parser.HTMLParser): + def error(self, message): + raise InvalidMarkupException(message) + parser = MyHTMLParser() + with self.assertRaises(InvalidMarkupException): + parser.feed('') + + def test_invalid_keyword_error_pass(self): + # bpo-34480: check that subclasses that define an + # error method that doesn't raise an exception work + class MyHTMLParser(html.parser.HTMLParser): + def error(self, message): + pass + parser = MyHTMLParser() + self.assertEqual(parser.feed(''), None) + + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/Library/2022-04-09-11-28-49.bpo-34480.Pw-GJ6.rst b/Misc/NEWS.d/next/Library/2022-04-09-11-28-49.bpo-34480.Pw-GJ6.rst new file mode 100644 index 0000000000000..748df89b07e3f --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-04-09-11-28-49.bpo-34480.Pw-GJ6.rst @@ -0,0 +1,3 @@ +Fix a bug where :mod:`_markupbase` raised an :exc:`UnboundLocalError` +when an invalid keyword was found in marked section. Patch by Marek +Suscak. From webhook-mailer at python.org Mon May 16 12:48:00 2022 From: webhook-mailer at python.org (ambv) Date: Mon, 16 May 2022 16:48:00 -0000 Subject: [Python-checkins] [3.9] gh-92112: Fix crash triggered by an evil custom `mro()` (GH-92113) (GH-92372) Message-ID: https://github.com/python/cpython/commit/f82b32410ba220165eab7b8d6dcc61a09744512c commit: f82b32410ba220165eab7b8d6dcc61a09744512c branch: 3.9 author: Jelle Zijlstra committer: ambv date: 2022-05-16T18:47:35+02:00 summary: [3.9] gh-92112: Fix crash triggered by an evil custom `mro()` (GH-92113) (GH-92372) (cherry picked from commit 85354ed78c0edb6d81a2bd53cabc85e547b8b26e) Co-authored-by: Alexey Izbyshev files: A Misc/NEWS.d/next/Core and Builtins/2022-05-01-10-58-38.gh-issue-92112.lLJemu.rst M Lib/test/test_descr.py M Objects/typeobject.c diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py index e5e9f4939699e..a8fe3ef6cdf1a 100644 --- a/Lib/test/test_descr.py +++ b/Lib/test/test_descr.py @@ -5686,6 +5686,23 @@ def mro(cls): class A(metaclass=M): pass + def test_disappearing_custom_mro(self): + """ + gh-92112: A custom mro() returning a result conflicting with + __bases__ and deleting itself caused a double free. + """ + class B: + pass + + class M(DebugHelperMeta): + def mro(cls): + del M.mro + return (B,) + + with self.assertRaises(TypeError): + class A(metaclass=M): + pass + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-01-10-58-38.gh-issue-92112.lLJemu.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-01-10-58-38.gh-issue-92112.lLJemu.rst new file mode 100644 index 0000000000000..00c938e89f438 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-05-01-10-58-38.gh-issue-92112.lLJemu.rst @@ -0,0 +1 @@ +Fix crash triggered by an evil custom ``mro()`` on a metaclass. diff --git a/Objects/typeobject.c b/Objects/typeobject.c index cb0bb46145c6a..755d3361916ac 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -317,25 +317,29 @@ type_mro_modified(PyTypeObject *type, PyObject *bases) { Py_ssize_t i, n; int custom = !Py_IS_TYPE(type, &PyType_Type); int unbound; - PyObject *mro_meth = NULL; - PyObject *type_mro_meth = NULL; if (!_PyType_HasFeature(type, Py_TPFLAGS_HAVE_VERSION_TAG)) return; if (custom) { + PyObject *mro_meth, *type_mro_meth; mro_meth = lookup_maybe_method( (PyObject *)type, &PyId_mro, &unbound); - if (mro_meth == NULL) + if (mro_meth == NULL) { goto clear; + } type_mro_meth = lookup_maybe_method( (PyObject *)&PyType_Type, &PyId_mro, &unbound); - if (type_mro_meth == NULL) + if (type_mro_meth == NULL) { + Py_DECREF(mro_meth); goto clear; - if (mro_meth != type_mro_meth) + } + int custom_mro = (mro_meth != type_mro_meth); + Py_DECREF(mro_meth); + Py_DECREF(type_mro_meth); + if (custom_mro) { goto clear; - Py_XDECREF(mro_meth); - Py_XDECREF(type_mro_meth); + } } n = PyTuple_GET_SIZE(bases); for (i = 0; i < n; i++) { @@ -352,8 +356,6 @@ type_mro_modified(PyTypeObject *type, PyObject *bases) { } return; clear: - Py_XDECREF(mro_meth); - Py_XDECREF(type_mro_meth); type->tp_flags &= ~(Py_TPFLAGS_HAVE_VERSION_TAG| Py_TPFLAGS_VALID_VERSION_TAG); } From webhook-mailer at python.org Mon May 16 12:53:42 2022 From: webhook-mailer at python.org (ambv) Date: Mon, 16 May 2022 16:53:42 -0000 Subject: [Python-checkins] Speedup: build docs in parallel (GH-92733) (GH-92850) Message-ID: https://github.com/python/cpython/commit/cfb9248cd4adb2ef4309e7ddb406cab5ce6edffa commit: cfb9248cd4adb2ef4309e7ddb406cab5ce6edffa branch: 3.10 author: Hugo van Kemenade committer: ambv date: 2022-05-16T18:53:38+02:00 summary: Speedup: build docs in parallel (GH-92733) (GH-92850) (cherry picked from commit a487623c6b784847a8a1e47b4597b0ae2b8def87) files: M .github/workflows/doc.yml M Doc/Makefile diff --git a/.github/workflows/doc.yml b/.github/workflows/doc.yml index a57552b07905f..36b9f9f1d3497 100644 --- a/.github/workflows/doc.yml +++ b/.github/workflows/doc.yml @@ -37,7 +37,7 @@ jobs: - name: 'Install build dependencies' run: make -C Doc/ PYTHON=../python venv - name: 'Build documentation' - run: xvfb-run make -C Doc/ PYTHON=../python SPHINXOPTS="-q -W --keep-going -j4" doctest html suspicious + run: xvfb-run make -C Doc/ PYTHON=../python SPHINXOPTS="-q -W --keep-going" doctest html suspicious - name: 'Upload' uses: actions/upload-artifact at v3 with: diff --git a/Doc/Makefile b/Doc/Makefile index 24528a1c4f326..939498e548a06 100644 --- a/Doc/Makefile +++ b/Doc/Makefile @@ -17,7 +17,7 @@ SPHINXERRORHANDLING = -W PAPEROPT_a4 = -D latex_elements.papersize=a4paper PAPEROPT_letter = -D latex_elements.papersize=letterpaper -ALLSPHINXOPTS = -b $(BUILDER) -d build/doctrees $(PAPEROPT_$(PAPER)) \ +ALLSPHINXOPTS = -b $(BUILDER) -d build/doctrees $(PAPEROPT_$(PAPER)) -j auto \ $(SPHINXOPTS) $(SPHINXERRORHANDLING) . build/$(BUILDER) $(SOURCES) .PHONY: help build html htmlhelp latex text texinfo changes linkcheck \ From webhook-mailer at python.org Mon May 16 12:54:07 2022 From: webhook-mailer at python.org (ambv) Date: Mon, 16 May 2022 16:54:07 -0000 Subject: [Python-checkins] gh-92530: Fix an issue that occurred after interrupting threading.Condition.notify (GH-92534) (GH-92830) Message-ID: https://github.com/python/cpython/commit/e29ce9a5f111270163a047b50ea55af6cad89838 commit: e29ce9a5f111270163a047b50ea55af6cad89838 branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: ambv date: 2022-05-16T18:54:01+02:00 summary: gh-92530: Fix an issue that occurred after interrupting threading.Condition.notify (GH-92534) (GH-92830) If Condition.notify() was interrupted just after it released the waiter lock, but before removing it from the queue, the following calls of notify() failed with RuntimeError: cannot release un-acquired lock. (cherry picked from commit 70af994fee7c0850ae859727d9468a5f29375a38) Co-authored-by: Serhiy Storchaka files: A Misc/NEWS.d/next/Library/2022-05-09-09-28-02.gh-issue-92530.M4Q1RS.rst M Lib/threading.py diff --git a/Lib/threading.py b/Lib/threading.py index 2d8974291360d..668126523d500 100644 --- a/Lib/threading.py +++ b/Lib/threading.py @@ -368,14 +368,21 @@ def notify(self, n=1): """ if not self._is_owned(): raise RuntimeError("cannot notify on un-acquired lock") - all_waiters = self._waiters - waiters_to_notify = _deque(_islice(all_waiters, n)) - if not waiters_to_notify: - return - for waiter in waiters_to_notify: - waiter.release() + waiters = self._waiters + while waiters and n > 0: + waiter = waiters[0] + try: + waiter.release() + except RuntimeError: + # gh-92530: The previous call of notify() released the lock, + # but was interrupted before removing it from the queue. + # It can happen if a signal handler raises an exception, + # like CTRL+C which raises KeyboardInterrupt. + pass + else: + n -= 1 try: - all_waiters.remove(waiter) + waiters.remove(waiter) except ValueError: pass diff --git a/Misc/NEWS.d/next/Library/2022-05-09-09-28-02.gh-issue-92530.M4Q1RS.rst b/Misc/NEWS.d/next/Library/2022-05-09-09-28-02.gh-issue-92530.M4Q1RS.rst new file mode 100644 index 0000000000000..8bb8ca0488c96 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-05-09-09-28-02.gh-issue-92530.M4Q1RS.rst @@ -0,0 +1,2 @@ +Fix an issue that occurred after interrupting +:func:`threading.Condition.notify`. From webhook-mailer at python.org Mon May 16 12:54:44 2022 From: webhook-mailer at python.org (ambv) Date: Mon, 16 May 2022 16:54:44 -0000 Subject: [Python-checkins] gh-80143: Add clarification for escape characters (GH-92292) (GH-92629) Message-ID: https://github.com/python/cpython/commit/006b302beb68a7b3cee11e34dcee3c20673b5399 commit: 006b302beb68a7b3cee11e34dcee3c20673b5399 branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: ambv date: 2022-05-16T18:54:40+02:00 summary: gh-80143: Add clarification for escape characters (GH-92292) (GH-92629) (cherry picked from commit 549567c6e70da4846c105a18a1a89e7dd09680d7) Co-authored-by: slateny <46876382+slateny at users.noreply.github.com> files: M Doc/reference/lexical_analysis.rst diff --git a/Doc/reference/lexical_analysis.rst b/Doc/reference/lexical_analysis.rst index d9e2cead958c9..0dad31fd370e2 100644 --- a/Doc/reference/lexical_analysis.rst +++ b/Doc/reference/lexical_analysis.rst @@ -480,9 +480,11 @@ declaration is given in the source file; see section :ref:`encodings`. In plain English: Both types of literals can be enclosed in matching single quotes (``'``) or double quotes (``"``). They can also be enclosed in matching groups of three single or double quotes (these are generally referred to as -*triple-quoted strings*). The backslash (``\``) character is used to escape -characters that otherwise have a special meaning, such as newline, backslash -itself, or the quote character. +*triple-quoted strings*). The backslash (``\``) character is used to give special +meaning to otherwise ordinary characters like ``n``, which means 'newline' when +escaped (``\n``). It can also be used to escape characters that otherwise have a +special meaning, such as newline, backslash itself, or the quote character. +See :ref:`escape sequences ` below for examples. .. index:: single: b'; bytes literal @@ -541,6 +543,8 @@ retained), except that three unescaped quotes in a row terminate the literal. ( single: \u; escape sequence single: \U; escape sequence +.. _escape-sequences: + Unless an ``'r'`` or ``'R'`` prefix is present, escape sequences in string and bytes literals are interpreted according to rules similar to those used by Standard C. The recognized escape sequences are: From webhook-mailer at python.org Mon May 16 13:52:36 2022 From: webhook-mailer at python.org (erlend-aasland) Date: Mon, 16 May 2022 17:52:36 -0000 Subject: [Python-checkins] gh-92547: Remove deprecated sqlite3 features (#92548) Message-ID: https://github.com/python/cpython/commit/00f22e8cc234aa52ec1f28094a170d7b87d0d08f commit: 00f22e8cc234aa52ec1f28094a170d7b87d0d08f branch: main author: Erlend Egeberg Aasland committer: erlend-aasland date: 2022-05-16T19:52:08+02:00 summary: gh-92547: Remove deprecated sqlite3 features (#92548) The following sqlite3 features were deprecated in 3.10, scheduled for removal in 3.12: - sqlite3.OptimizedUnicode (gh-23163) - sqlite3.enable_shared_cache (gh-24008) Co-authored-by: Jelle Zijlstra Signed-off-by: Erlend E. Aasland files: A Misc/NEWS.d/next/Library/2022-05-09-11-55-04.gh-issue-92547.CzVZft.rst M Doc/whatsnew/3.12.rst M Lib/sqlite3/__init__.py M Lib/sqlite3/dbapi2.py M Lib/test/test_sqlite3/test_dbapi.py M Lib/test/test_sqlite3/test_factory.py M Modules/_sqlite/clinic/module.c.h M Modules/_sqlite/module.c diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst index 70b26ba48cf62..033de1780b3d1 100644 --- a/Doc/whatsnew/3.12.rst +++ b/Doc/whatsnew/3.12.rst @@ -107,6 +107,15 @@ Deprecated Removed ======= +* The following undocumented :mod:`sqlite3` features, deprecated in Python + 3.10, are now removed: + + * ``sqlite3.enable_shared_cache()`` + * ``sqlite3.OptimizedUnicode`` + + (Contributed by Erlend E. Aasland in :gh:`92548`) + + Porting to Python 3.12 ====================== diff --git a/Lib/sqlite3/__init__.py b/Lib/sqlite3/__init__.py index 5a2dbd360fb49..34a9c047dd607 100644 --- a/Lib/sqlite3/__init__.py +++ b/Lib/sqlite3/__init__.py @@ -55,17 +55,3 @@ """ from sqlite3.dbapi2 import * - - -# bpo-42264: OptimizedUnicode was deprecated in Python 3.10. It's scheduled -# for removal in Python 3.12. -def __getattr__(name): - if name == "OptimizedUnicode": - import warnings - msg = (""" - OptimizedUnicode is deprecated and will be removed in Python 3.12. - Since Python 3.3 it has simply been an alias for 'str'. - """) - warnings.warn(msg, DeprecationWarning, stacklevel=2) - return str - raise AttributeError(f"module 'sqlite3' has no attribute '{name}'") diff --git a/Lib/sqlite3/dbapi2.py b/Lib/sqlite3/dbapi2.py index 7cf4dd32d541d..36ce769d5c6b3 100644 --- a/Lib/sqlite3/dbapi2.py +++ b/Lib/sqlite3/dbapi2.py @@ -82,20 +82,6 @@ def convert_timestamp(val): register_adapters_and_converters() -# bpo-24464: enable_shared_cache was deprecated in Python 3.10. It's -# scheduled for removal in Python 3.12. -def enable_shared_cache(enable): - from _sqlite3 import enable_shared_cache as _old_enable_shared_cache - import warnings - msg = ( - "enable_shared_cache is deprecated and will be removed in Python 3.12. " - "Shared cache is strongly discouraged by the SQLite 3 documentation. " - "If shared cache must be used, open the database in URI mode using" - "the cache=shared query parameter." - ) - warnings.warn(msg, DeprecationWarning, stacklevel=2) - return _old_enable_shared_cache(enable) - # Clean up namespace del(register_adapters_and_converters) diff --git a/Lib/test/test_sqlite3/test_dbapi.py b/Lib/test/test_sqlite3/test_dbapi.py index e132fcdfb0e65..8a218973794db 100644 --- a/Lib/test/test_sqlite3/test_dbapi.py +++ b/Lib/test/test_sqlite3/test_dbapi.py @@ -344,15 +344,6 @@ def test_extended_error_code_on_exception(self): sqlite.SQLITE_CONSTRAINT_CHECK) self.assertEqual(exc.sqlite_errorname, "SQLITE_CONSTRAINT_CHECK") - # sqlite3_enable_shared_cache() is deprecated on macOS and calling it may raise - # OperationalError on some buildbots. - @unittest.skipIf(sys.platform == "darwin", "shared cache is deprecated on macOS") - def test_shared_cache_deprecated(self): - for enable in (True, False): - with self.assertWarns(DeprecationWarning) as cm: - sqlite.enable_shared_cache(enable) - self.assertIn("dbapi.py", cm.filename) - def test_disallow_instantiation(self): cx = sqlite.connect(":memory:") check_disallow_instantiation(self, type(cx("select 1"))) diff --git a/Lib/test/test_sqlite3/test_factory.py b/Lib/test/test_sqlite3/test_factory.py index 420855ba34b60..71603faa02840 100644 --- a/Lib/test/test_sqlite3/test_factory.py +++ b/Lib/test/test_sqlite3/test_factory.py @@ -256,18 +256,6 @@ def test_custom(self): self.assertEqual(type(row[0]), str, "type of row[0] must be unicode") self.assertTrue(row[0].endswith("reich"), "column must contain original data") - def test_optimized_unicode(self): - # OptimizedUnicode is deprecated as of Python 3.10 - with self.assertWarns(DeprecationWarning) as cm: - self.con.text_factory = sqlite.OptimizedUnicode - self.assertIn("factory.py", cm.filename) - austria = "?sterreich" - germany = "Deutchland" - a_row = self.con.execute("select ?", (austria,)).fetchone() - d_row = self.con.execute("select ?", (germany,)).fetchone() - self.assertEqual(type(a_row[0]), str, "type of non-ASCII row must be str") - self.assertEqual(type(d_row[0]), str, "type of ASCII-only row must be str") - def tearDown(self): self.con.close() diff --git a/Misc/NEWS.d/next/Library/2022-05-09-11-55-04.gh-issue-92547.CzVZft.rst b/Misc/NEWS.d/next/Library/2022-05-09-11-55-04.gh-issue-92547.CzVZft.rst new file mode 100644 index 0000000000000..52626974c4019 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-05-09-11-55-04.gh-issue-92547.CzVZft.rst @@ -0,0 +1,6 @@ +Remove undocumented :mod:`sqlite3` features deprecated in Python 3.10: + +* ``sqlite3.enable_shared_cache()`` +* ``sqlite3.OptimizedUnicode`` + +Patch by Erlend E. Aasland. diff --git a/Modules/_sqlite/clinic/module.c.h b/Modules/_sqlite/clinic/module.c.h index 8f7008adef2b1..74a6a362c05ab 100644 --- a/Modules/_sqlite/clinic/module.c.h +++ b/Modules/_sqlite/clinic/module.c.h @@ -158,46 +158,6 @@ pysqlite_complete_statement(PyObject *module, PyObject *const *args, Py_ssize_t return return_value; } -PyDoc_STRVAR(pysqlite_enable_shared_cache__doc__, -"enable_shared_cache($module, /, do_enable)\n" -"--\n" -"\n" -"Enable or disable shared cache mode for the calling thread.\n" -"\n" -"This method is deprecated and will be removed in Python 3.12.\n" -"Shared cache is strongly discouraged by the SQLite 3 documentation.\n" -"If shared cache must be used, open the database in URI mode using\n" -"the cache=shared query parameter."); - -#define PYSQLITE_ENABLE_SHARED_CACHE_METHODDEF \ - {"enable_shared_cache", _PyCFunction_CAST(pysqlite_enable_shared_cache), METH_FASTCALL|METH_KEYWORDS, pysqlite_enable_shared_cache__doc__}, - -static PyObject * -pysqlite_enable_shared_cache_impl(PyObject *module, int do_enable); - -static PyObject * -pysqlite_enable_shared_cache(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) -{ - PyObject *return_value = NULL; - static const char * const _keywords[] = {"do_enable", NULL}; - static _PyArg_Parser _parser = {NULL, _keywords, "enable_shared_cache", 0}; - PyObject *argsbuf[1]; - int do_enable; - - args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); - if (!args) { - goto exit; - } - do_enable = _PyLong_AsInt(args[0]); - if (do_enable == -1 && PyErr_Occurred()) { - goto exit; - } - return_value = pysqlite_enable_shared_cache_impl(module, do_enable); - -exit: - return return_value; -} - PyDoc_STRVAR(pysqlite_register_adapter__doc__, "register_adapter($module, type, caster, /)\n" "--\n" @@ -334,4 +294,4 @@ pysqlite_adapt(PyObject *module, PyObject *const *args, Py_ssize_t nargs) exit: return return_value; } -/*[clinic end generated code: output=d846459943008a9c input=a9049054013a1b77]*/ +/*[clinic end generated code: output=43aa4f4356f9269d input=a9049054013a1b77]*/ diff --git a/Modules/_sqlite/module.c b/Modules/_sqlite/module.c index fbc57c7cc739e..78591f85c1f7d 100644 --- a/Modules/_sqlite/module.c +++ b/Modules/_sqlite/module.c @@ -105,36 +105,6 @@ pysqlite_complete_statement_impl(PyObject *module, const char *statement) } } -/*[clinic input] -_sqlite3.enable_shared_cache as pysqlite_enable_shared_cache - - do_enable: int - -Enable or disable shared cache mode for the calling thread. - -This method is deprecated and will be removed in Python 3.12. -Shared cache is strongly discouraged by the SQLite 3 documentation. -If shared cache must be used, open the database in URI mode using -the cache=shared query parameter. -[clinic start generated code]*/ - -static PyObject * -pysqlite_enable_shared_cache_impl(PyObject *module, int do_enable) -/*[clinic end generated code: output=259c74eedee1516b input=26e40d5971d3487d]*/ -{ - int rc; - - rc = sqlite3_enable_shared_cache(do_enable); - - if (rc != SQLITE_OK) { - pysqlite_state *state = pysqlite_get_state(module); - PyErr_SetString(state->OperationalError, "Changing the shared_cache flag failed"); - return NULL; - } else { - Py_RETURN_NONE; - } -} - /*[clinic input] _sqlite3.register_adapter as pysqlite_register_adapter @@ -277,7 +247,6 @@ static PyMethodDef module_methods[] = { PYSQLITE_COMPLETE_STATEMENT_METHODDEF PYSQLITE_CONNECT_METHODDEF PYSQLITE_ENABLE_CALLBACK_TRACE_METHODDEF - PYSQLITE_ENABLE_SHARED_CACHE_METHODDEF PYSQLITE_REGISTER_ADAPTER_METHODDEF PYSQLITE_REGISTER_CONVERTER_METHODDEF {NULL, NULL} From webhook-mailer at python.org Mon May 16 14:16:09 2022 From: webhook-mailer at python.org (tiran) Date: Mon, 16 May 2022 18:16:09 -0000 Subject: [Python-checkins] [3.11] gh-90473: Skip tests that don't apply to Emscripten and WASI (GH-92846) (GH-92851) Message-ID: https://github.com/python/cpython/commit/8f937976bc3ce8ed14f9b7f933d4be550b0344d3 commit: 8f937976bc3ce8ed14f9b7f933d4be550b0344d3 branch: 3.11 author: Christian Heimes committer: tiran date: 2022-05-16T20:15:56+02:00 summary: [3.11] gh-90473: Skip tests that don't apply to Emscripten and WASI (GH-92846) (GH-92851) Co-authored-by: Christian Heimes files: M Lib/test/support/__init__.py M Lib/test/test__locale.py M Lib/test/test_cmd_line_script.py M Lib/test/test_coroutines.py M Lib/test/test_genericpath.py M Lib/test/test_inspect.py M Lib/test/test_locale.py M Lib/test/test_pydoc.py M Lib/test/test_pyexpat.py M Lib/test/test_re.py M Lib/test/test_robotparser.py M Lib/test/test_selectors.py M Lib/test/test_support.py M Lib/test/test_venv.py diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py index 3b2f33979db9a..b9fe8f6bf4f06 100644 --- a/Lib/test/support/__init__.py +++ b/Lib/test/support/__init__.py @@ -521,7 +521,7 @@ def requires_subprocess(): """Used for subprocess, os.spawn calls, fd inheritance""" return unittest.skipUnless(has_subprocess_support, "requires subprocess support") -# Emscripten's socket emulation has limitation. WASI doesn't have sockets yet. +# Emscripten's socket emulation and WASI sockets have limitations. has_socket_support = not is_emscripten and not is_wasi def requires_working_socket(*, module=False): diff --git a/Lib/test/test__locale.py b/Lib/test/test__locale.py index b3bc54cd55104..0947464bb8c04 100644 --- a/Lib/test/test__locale.py +++ b/Lib/test/test__locale.py @@ -109,7 +109,8 @@ def numeric_tester(self, calc_type, calc_value, data_type, used_locale): @unittest.skipUnless(nl_langinfo, "nl_langinfo is not available") @unittest.skipIf( - support.is_emscripten, "musl libc issue on Emscripten, bpo-46390" + support.is_emscripten or support.is_wasi, + "musl libc issue on Emscripten, bpo-46390" ) def test_lc_numeric_nl_langinfo(self): # Test nl_langinfo against known values @@ -128,7 +129,8 @@ def test_lc_numeric_nl_langinfo(self): self.skipTest('no suitable locales') @unittest.skipIf( - support.is_emscripten, "musl libc issue on Emscripten, bpo-46390" + support.is_emscripten or support.is_wasi, + "musl libc issue on Emscripten, bpo-46390" ) def test_lc_numeric_localeconv(self): # Test localeconv against known values diff --git a/Lib/test/test_cmd_line_script.py b/Lib/test/test_cmd_line_script.py index bb433dc1e73a4..d783af65839ad 100644 --- a/Lib/test/test_cmd_line_script.py +++ b/Lib/test/test_cmd_line_script.py @@ -558,8 +558,9 @@ def test_non_ascii(self): # Mac OS X denies the creation of a file with an invalid UTF-8 name. # Windows allows creating a name with an arbitrary bytes name, but # Python cannot a undecodable bytes argument to a subprocess. + # WASI does not permit invalid UTF-8 names. if (os_helper.TESTFN_UNDECODABLE - and sys.platform not in ('win32', 'darwin')): + and sys.platform not in ('win32', 'darwin', 'emscripten', 'wasi')): name = os.fsdecode(os_helper.TESTFN_UNDECODABLE) elif os_helper.TESTFN_NONASCII: name = os_helper.TESTFN_NONASCII diff --git a/Lib/test/test_coroutines.py b/Lib/test/test_coroutines.py index 77944e678c750..dba5ceffaf1c0 100644 --- a/Lib/test/test_coroutines.py +++ b/Lib/test/test_coroutines.py @@ -2209,7 +2209,8 @@ async def f(): @unittest.skipIf( - support.is_emscripten, "asyncio does not work under Emscripten yet." + support.is_emscripten or support.is_wasi, + "asyncio does not work under Emscripten/WASI yet." ) class CoroAsyncIOCompatTest(unittest.TestCase): diff --git a/Lib/test/test_genericpath.py b/Lib/test/test_genericpath.py index 2741adc139bcf..489044f8090d3 100644 --- a/Lib/test/test_genericpath.py +++ b/Lib/test/test_genericpath.py @@ -484,7 +484,7 @@ def test_nonascii_abspath(self): # invalid UTF-8 name. Windows allows creating a directory with an # arbitrary bytes name, but fails to enter this directory # (when the bytes name is used). - and sys.platform not in ('win32', 'darwin', 'emscripten')): + and sys.platform not in ('win32', 'darwin', 'emscripten', 'wasi')): name = os_helper.TESTFN_UNDECODABLE elif os_helper.TESTFN_NONASCII: name = os_helper.TESTFN_NONASCII diff --git a/Lib/test/test_inspect.py b/Lib/test/test_inspect.py index fe0259ab609c7..ae1842704d37d 100644 --- a/Lib/test/test_inspect.py +++ b/Lib/test/test_inspect.py @@ -842,7 +842,10 @@ def test_nested_class_definition_inside_function(self): self.assertSourceEqual(mod2.cls213, 218, 222) self.assertSourceEqual(mod2.cls213().func219(), 220, 221) - @unittest.skipIf(support.is_emscripten, "socket.accept is broken") + @unittest.skipIf( + support.is_emscripten or support.is_wasi, + "socket.accept is broken" + ) def test_nested_class_definition_inside_async_function(self): import asyncio self.addCleanup(asyncio.set_event_loop_policy, None) diff --git a/Lib/test/test_locale.py b/Lib/test/test_locale.py index 5cb6edc52d777..bc8a7a35fbf2d 100644 --- a/Lib/test/test_locale.py +++ b/Lib/test/test_locale.py @@ -1,5 +1,5 @@ from decimal import Decimal -from test.support import verbose, is_android, is_emscripten +from test.support import verbose, is_android, is_emscripten, is_wasi from test.support.warnings_helper import check_warnings import unittest import locale @@ -373,13 +373,19 @@ def setUp(self): @unittest.skipIf(sys.platform.startswith('aix'), 'bpo-29972: broken test on AIX') - @unittest.skipIf(is_emscripten, "musl libc issue on Emscripten, bpo-46390") + @unittest.skipIf( + is_emscripten or is_wasi, + "musl libc issue on Emscripten/WASI, bpo-46390" + ) def test_strcoll_with_diacritic(self): self.assertLess(locale.strcoll('?', 'b'), 0) @unittest.skipIf(sys.platform.startswith('aix'), 'bpo-29972: broken test on AIX') - @unittest.skipIf(is_emscripten, "musl libc issue on Emscripten, bpo-46390") + @unittest.skipIf( + is_emscripten or is_wasi, + "musl libc issue on Emscripten/WASI, bpo-46390" + ) def test_strxfrm_with_diacritic(self): self.assertLess(locale.strxfrm('?'), locale.strxfrm('b')) diff --git a/Lib/test/test_pydoc.py b/Lib/test/test_pydoc.py index 13c77b6fa6822..ac181effe49bb 100644 --- a/Lib/test/test_pydoc.py +++ b/Lib/test/test_pydoc.py @@ -27,7 +27,8 @@ from test.support.script_helper import assert_python_ok, assert_python_failure from test.support import threading_helper from test.support import (reap_children, captured_output, captured_stdout, - captured_stderr, is_emscripten, requires_docstrings) + captured_stderr, is_emscripten, is_wasi, + requires_docstrings) from test.support.os_helper import (TESTFN, rmtree, unlink) from test import pydoc_mod @@ -1356,7 +1357,10 @@ def a_fn_with_https_link(): ) - at unittest.skipIf(is_emscripten, "Socket server not available on Emscripten.") + at unittest.skipIf( + is_emscripten or is_wasi, + "Socket server not available on Emscripten/WASI." +) class PydocServerTest(unittest.TestCase): """Tests for pydoc._start_server""" diff --git a/Lib/test/test_pyexpat.py b/Lib/test/test_pyexpat.py index 6e578458a2509..6f0441b66d9b8 100644 --- a/Lib/test/test_pyexpat.py +++ b/Lib/test/test_pyexpat.py @@ -12,7 +12,7 @@ from xml.parsers import expat from xml.parsers.expat import errors -from test.support import sortdict, is_emscripten +from test.support import sortdict, is_emscripten, is_wasi class SetAttributeTest(unittest.TestCase): @@ -469,6 +469,7 @@ def test_exception(self): if (sysconfig.is_python_build() and not (sys.platform == 'win32' and platform.machine() == 'ARM') and not is_emscripten + and not is_wasi ): self.assertIn('call_with_frame("StartElement"', entries[1][3]) diff --git a/Lib/test/test_re.py b/Lib/test/test_re.py index c1014753802c9..442547da31d42 100644 --- a/Lib/test/test_re.py +++ b/Lib/test/test_re.py @@ -1,6 +1,6 @@ from test.support import (gc_collect, bigmemtest, _2G, cpython_only, captured_stdout, - check_disallow_instantiation, is_emscripten) + check_disallow_instantiation, is_emscripten, is_wasi) import locale import re import string @@ -1974,7 +1974,10 @@ def test_bug_20998(self): # with ignore case. self.assertEqual(re.fullmatch('[a-c]+', 'ABC', re.I).span(), (0, 3)) - @unittest.skipIf(is_emscripten, "musl libc issue on Emscripten, bpo-46390") + @unittest.skipIf( + is_emscripten or is_wasi, + "musl libc issue on Emscripten/WASI, bpo-46390" + ) def test_locale_caching(self): # Issue #22410 oldlocale = locale.setlocale(locale.LC_CTYPE) @@ -2011,7 +2014,10 @@ def check_en_US_utf8(self): self.assertIsNone(re.match(b'(?Li)\xc5', b'\xe5')) self.assertIsNone(re.match(b'(?Li)\xe5', b'\xc5')) - @unittest.skipIf(is_emscripten, "musl libc issue on Emscripten, bpo-46390") + @unittest.skipIf( + is_emscripten or is_wasi, + "musl libc issue on Emscripten/WASI, bpo-46390" + ) def test_locale_compiled(self): oldlocale = locale.setlocale(locale.LC_CTYPE) self.addCleanup(locale.setlocale, locale.LC_CTYPE, oldlocale) diff --git a/Lib/test/test_robotparser.py b/Lib/test/test_robotparser.py index 3821d66c2db7d..8d89e2a822445 100644 --- a/Lib/test/test_robotparser.py +++ b/Lib/test/test_robotparser.py @@ -308,8 +308,9 @@ def log_message(self, format, *args): pass - at unittest.skipIf( - support.is_emscripten, "Socket server not available on Emscripten." + at unittest.skipUnless( + support.has_socket_support, + "Socket server requires working socket." ) class PasswordProtectedSiteTestCase(unittest.TestCase): diff --git a/Lib/test/test_selectors.py b/Lib/test/test_selectors.py index c927331d438b0..c2db88c203920 100644 --- a/Lib/test/test_selectors.py +++ b/Lib/test/test_selectors.py @@ -19,8 +19,8 @@ resource = None -if support.is_emscripten: - raise unittest.SkipTest("Cannot create socketpair on Emscripten.") +if support.is_emscripten or support.is_wasi: + raise unittest.SkipTest("Cannot create socketpair on Emscripten/WASI.") if hasattr(socket, 'socketpair'): diff --git a/Lib/test/test_support.py b/Lib/test/test_support.py index dce49809385c6..7a8b6819c5a91 100644 --- a/Lib/test/test_support.py +++ b/Lib/test/test_support.py @@ -691,7 +691,7 @@ def test_print_warning(self): 'Warning -- a\nWarning -- b\n') def test_has_strftime_extensions(self): - if support.is_emscripten or support.is_wasi or sys.platform == "win32": + if support.is_emscripten or sys.platform == "win32": self.assertFalse(support.has_strftime_extensions) else: self.assertTrue(support.has_strftime_extensions) diff --git a/Lib/test/test_venv.py b/Lib/test/test_venv.py index d96cf1e6c7493..6bfb6e9f336ef 100644 --- a/Lib/test/test_venv.py +++ b/Lib/test/test_venv.py @@ -16,7 +16,7 @@ import tempfile from test.support import (captured_stdout, captured_stderr, requires_zlib, skip_if_broken_multiprocessing_synchronize, verbose, - requires_subprocess, is_emscripten) + requires_subprocess, is_emscripten, is_wasi) from test.support.os_helper import (can_symlink, EnvironmentVarGuard, rmtree) import unittest import venv @@ -34,8 +34,8 @@ or sys._base_executable != sys.executable, 'cannot run venv.create from within a venv on this platform') -if is_emscripten: - raise unittest.SkipTest("venv is not available on Emscripten.") +if is_emscripten or is_wasi: + raise unittest.SkipTest("venv is not available on Emscripten/WASI.") @requires_subprocess() def check_output(cmd, encoding=None): From webhook-mailer at python.org Mon May 16 19:05:55 2022 From: webhook-mailer at python.org (miss-islington) Date: Mon, 16 May 2022 23:05:55 -0000 Subject: [Python-checkins] gh-92265: set meta_path and path_hooks correctly in test_reload_namespace_changed (GH-92275) Message-ID: https://github.com/python/cpython/commit/c7d699969c81dbadd26fa2af5bc647fa5579eb08 commit: c7d699969c81dbadd26fa2af5bc647fa5579eb08 branch: main author: Filipe La?ns committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-16T16:05:47-07:00 summary: gh-92265: set meta_path and path_hooks correctly in test_reload_namespace_changed (GH-92275) Previously, we were blocking the frozen imports and forcing the source version to be used, but we did not fix up sys.meta_path or sys.path_hooks, causing the frozen importers to leak into the source version of the test. files: M Lib/test/test_importlib/test_api.py diff --git a/Lib/test/test_importlib/test_api.py b/Lib/test/test_importlib/test_api.py index 1f8f7c00bda53..ddf80947b9df4 100644 --- a/Lib/test/test_importlib/test_api.py +++ b/Lib/test/test_importlib/test_api.py @@ -301,7 +301,8 @@ def test_reload_namespace_changed(self): name = 'spam' with os_helper.temp_cwd(None) as cwd: with test_util.uncache('spam'): - with import_helper.DirsOnSysPath(cwd): + with test_util.import_state(path=[cwd]): + self.init._bootstrap_external._install(self.init._bootstrap) # Start as a namespace package. self.init.invalidate_caches() bad_path = os.path.join(cwd, name, '__init.py') From webhook-mailer at python.org Mon May 16 20:04:25 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Tue, 17 May 2022 00:04:25 -0000 Subject: [Python-checkins] re docs: fix source code link (#92819) Message-ID: https://github.com/python/cpython/commit/bd304612980edd16c568ea8a5b30795f048bbf24 commit: bd304612980edd16c568ea8a5b30795f048bbf24 branch: main author: ??? <109224573 at qq.com> committer: JelleZijlstra date: 2022-05-16T17:04:17-07:00 summary: re docs: fix source code link (#92819) files: M Doc/library/re.rst diff --git a/Doc/library/re.rst b/Doc/library/re.rst index 39e7d23aaf9c9..19b18b9f4df2a 100644 --- a/Doc/library/re.rst +++ b/Doc/library/re.rst @@ -7,7 +7,7 @@ .. moduleauthor:: Fredrik Lundh .. sectionauthor:: Andrew M. Kuchling -**Source code:** :source:`Lib/re.py` +**Source code:** :source:`Lib/re/` -------------- From webhook-mailer at python.org Mon May 16 20:21:54 2022 From: webhook-mailer at python.org (miss-islington) Date: Tue, 17 May 2022 00:21:54 -0000 Subject: [Python-checkins] re docs: fix source code link (GH-92819) Message-ID: https://github.com/python/cpython/commit/da2f0c755d50f42963fca0314aee9ceb5eb0b426 commit: da2f0c755d50f42963fca0314aee9ceb5eb0b426 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-16T17:21:50-07:00 summary: re docs: fix source code link (GH-92819) (cherry picked from commit bd304612980edd16c568ea8a5b30795f048bbf24) Co-authored-by: ??? <109224573 at qq.com> files: M Doc/library/re.rst diff --git a/Doc/library/re.rst b/Doc/library/re.rst index 3cd9f252fee6f..61b5c805ee2d4 100644 --- a/Doc/library/re.rst +++ b/Doc/library/re.rst @@ -7,7 +7,7 @@ .. moduleauthor:: Fredrik Lundh .. sectionauthor:: Andrew M. Kuchling -**Source code:** :source:`Lib/re.py` +**Source code:** :source:`Lib/re/` -------------- From webhook-mailer at python.org Mon May 16 21:32:52 2022 From: webhook-mailer at python.org (sweeneyde) Date: Tue, 17 May 2022 01:32:52 -0000 Subject: [Python-checkins] Fix NULL test in _testinternalcapi (GH-92861) Message-ID: https://github.com/python/cpython/commit/702e0da000bf28aa20cb7f3893b575d977506495 commit: 702e0da000bf28aa20cb7f3893b575d977506495 branch: main author: Dennis Sweeney <36520290+sweeneyde at users.noreply.github.com> committer: sweeneyde <36520290+sweeneyde at users.noreply.github.com> date: 2022-05-16T21:32:48-04:00 summary: Fix NULL test in _testinternalcapi (GH-92861) files: M Modules/_testinternalcapi.c diff --git a/Modules/_testinternalcapi.c b/Modules/_testinternalcapi.c index 914b20b36f146..238de749fffc5 100644 --- a/Modules/_testinternalcapi.c +++ b/Modules/_testinternalcapi.c @@ -307,7 +307,7 @@ check_edit_cost(const char *a, const char *b, Py_ssize_t expected) goto exit; } b_obj = PyUnicode_FromString(b); - if (a_obj == NULL) { + if (b_obj == NULL) { goto exit; } Py_ssize_t result = _Py_UTF8_Edit_Cost(a_obj, b_obj, -1); From webhook-mailer at python.org Mon May 16 21:55:05 2022 From: webhook-mailer at python.org (miss-islington) Date: Tue, 17 May 2022 01:55:05 -0000 Subject: [Python-checkins] Fix NULL test in _testinternalcapi (GH-92861) Message-ID: https://github.com/python/cpython/commit/add8820df87958ca584c840ffbe436c5577e6533 commit: add8820df87958ca584c840ffbe436c5577e6533 branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-16T18:54:47-07:00 summary: Fix NULL test in _testinternalcapi (GH-92861) (cherry picked from commit 702e0da000bf28aa20cb7f3893b575d977506495) Co-authored-by: Dennis Sweeney <36520290+sweeneyde at users.noreply.github.com> files: M Modules/_testinternalcapi.c diff --git a/Modules/_testinternalcapi.c b/Modules/_testinternalcapi.c index d5616fd59c6e5..75e14efb7eb15 100644 --- a/Modules/_testinternalcapi.c +++ b/Modules/_testinternalcapi.c @@ -292,7 +292,7 @@ check_edit_cost(const char *a, const char *b, Py_ssize_t expected) goto exit; } b_obj = PyUnicode_FromString(b); - if (a_obj == NULL) { + if (b_obj == NULL) { goto exit; } Py_ssize_t result = _Py_UTF8_Edit_Cost(a_obj, b_obj, -1); From webhook-mailer at python.org Mon May 16 21:57:51 2022 From: webhook-mailer at python.org (miss-islington) Date: Tue, 17 May 2022 01:57:51 -0000 Subject: [Python-checkins] Fix NULL test in _testinternalcapi (GH-92861) Message-ID: https://github.com/python/cpython/commit/386583040d3e6b9c44ef6d8f6da61c31c37c7b9e commit: 386583040d3e6b9c44ef6d8f6da61c31c37c7b9e branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-16T18:57:42-07:00 summary: Fix NULL test in _testinternalcapi (GH-92861) (cherry picked from commit 702e0da000bf28aa20cb7f3893b575d977506495) Co-authored-by: Dennis Sweeney <36520290+sweeneyde at users.noreply.github.com> files: M Modules/_testinternalcapi.c diff --git a/Modules/_testinternalcapi.c b/Modules/_testinternalcapi.c index 914b20b36f146..238de749fffc5 100644 --- a/Modules/_testinternalcapi.c +++ b/Modules/_testinternalcapi.c @@ -307,7 +307,7 @@ check_edit_cost(const char *a, const char *b, Py_ssize_t expected) goto exit; } b_obj = PyUnicode_FromString(b); - if (a_obj == NULL) { + if (b_obj == NULL) { goto exit; } Py_ssize_t result = _Py_UTF8_Edit_Cost(a_obj, b_obj, -1); From webhook-mailer at python.org Tue May 17 05:59:34 2022 From: webhook-mailer at python.org (markshannon) Date: Tue, 17 May 2022 09:59:34 -0000 Subject: [Python-checkins] Summarize stats: Increase number of predecessor/successor pairs shown from 3 to 5. (GH-92853) Message-ID: https://github.com/python/cpython/commit/93fc14933b8605c8df23073574048408df61b538 commit: 93fc14933b8605c8df23073574048408df61b538 branch: main author: Mark Shannon committer: markshannon date: 2022-05-17T10:59:24+01:00 summary: Summarize stats: Increase number of predecessor/successor pairs shown from 3 to 5. (GH-92853) files: M Tools/scripts/summarize_stats.py diff --git a/Tools/scripts/summarize_stats.py b/Tools/scripts/summarize_stats.py index 91b190114008e..f66fc7b684594 100644 --- a/Tools/scripts/summarize_stats.py +++ b/Tools/scripts/summarize_stats.py @@ -315,7 +315,7 @@ def emit_pair_counts(opcode_stats, total): emit_table(("Pair", "Count:", "Self:", "Cumulative:"), rows ) - with Section("Predecessor/Successor Pairs", summary="Top 3 predecessors and successors of each opcode"): + with Section("Predecessor/Successor Pairs", summary="Top 5 predecessors and successors of each opcode"): predecessors = collections.defaultdict(collections.Counter) successors = collections.defaultdict(collections.Counter) total_predecessors = collections.Counter() @@ -334,10 +334,10 @@ def emit_pair_counts(opcode_stats, total): pred_rows = succ_rows = () if total1: pred_rows = [(opname[pred], count, f"{count/total1:.1%}") - for (pred, count) in predecessors[i].most_common(3)] + for (pred, count) in predecessors[i].most_common(5)] if total2: succ_rows = [(opname[succ], count, f"{count/total2:.1%}") - for (succ, count) in successors[i].most_common(3)] + for (succ, count) in successors[i].most_common(5)] with Section(name, 3, f"Successors and predecessors for {name}"): emit_table(("Predecessors", "Count:", "Percentage:"), pred_rows From webhook-mailer at python.org Tue May 17 08:00:50 2022 From: webhook-mailer at python.org (iritkatriel) Date: Tue, 17 May 2022 12:00:50 -0000 Subject: [Python-checkins] gh-92782: unify the style of CFG traversal algorithms in the compiler (GH-92784) Message-ID: https://github.com/python/cpython/commit/8781a041a00b7a202d73bcb47606ea10e56fb1d1 commit: 8781a041a00b7a202d73bcb47606ea10e56fb1d1 branch: main author: Irit Katriel <1055913+iritkatriel at users.noreply.github.com> committer: iritkatriel <1055913+iritkatriel at users.noreply.github.com> date: 2022-05-17T13:00:11+01:00 summary: gh-92782: unify the style of CFG traversal algorithms in the compiler (GH-92784) files: M Python/compile.c diff --git a/Python/compile.c b/Python/compile.c index 51ef8fd17a106..fdf2e5b85adac 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -7061,7 +7061,6 @@ struct assembler { PyObject *a_except_table; /* bytes containing exception table */ basicblock *a_entry; int a_offset; /* offset into bytecode */ - int a_nblocks; /* number of reachable blocks */ int a_except_table_off; /* offset into exception table */ int a_prevlineno; /* lineno of last emitted line in line table */ int a_prev_end_lineno; /* end_lineno of last emitted line in line table */ @@ -7074,6 +7073,20 @@ struct assembler { int a_location_off; /* offset of last written location info frame */ }; +static basicblock** +make_cfg_traversal_stack(basicblock *entry) { + int nblocks = 0; + for (basicblock *b = entry; b != NULL; b = b->b_next) { + b->b_visited = 0; + nblocks++; + } + basicblock **stack = (basicblock **)PyMem_Malloc(sizeof(basicblock *) * nblocks); + if (!stack) { + PyErr_NoMemory(); + } + return stack; +} + Py_LOCAL_INLINE(void) stackdepth_push(basicblock ***sp, basicblock *b, int depth) { @@ -7089,31 +7102,26 @@ stackdepth_push(basicblock ***sp, basicblock *b, int depth) * cycles in the flow graph have no net effect on the stack depth. */ static int -stackdepth(struct compiler *c) +stackdepth(struct compiler *c, basicblock *entry) { - basicblock *b, *entryblock = NULL; - basicblock **stack, **sp; - int nblocks = 0, maxdepth = 0; - for (b = c->u->u_blocks; b != NULL; b = b->b_list) { + for (basicblock *b = entry; b != NULL; b = b->b_next) { b->b_startdepth = INT_MIN; - entryblock = b; - nblocks++; } - assert(entryblock!= NULL); - stack = (basicblock **)PyObject_Malloc(sizeof(basicblock *) * nblocks); + basicblock **stack = make_cfg_traversal_stack(entry); if (!stack) { - PyErr_NoMemory(); return -1; } - sp = stack; + int maxdepth = 0; + basicblock **sp = stack; if (c->u->u_ste->ste_generator || c->u->u_ste->ste_coroutine) { - stackdepth_push(&sp, entryblock, 1); + stackdepth_push(&sp, entry, 1); } else { - stackdepth_push(&sp, entryblock, 0); + stackdepth_push(&sp, entry, 0); } + while (sp != stack) { - b = *--sp; + basicblock *b = *--sp; int depth = b->b_startdepth; assert(depth >= 0); basicblock *next = b->b_next; @@ -7159,7 +7167,7 @@ stackdepth(struct compiler *c) stackdepth_push(&sp, next, depth); } } - PyObject_Free(stack); + PyMem_Free(stack); return maxdepth; } @@ -7264,14 +7272,8 @@ copy_except_stack(ExceptStack *stack) { static int label_exception_targets(basicblock *entry) { - int nblocks = 0; - for (basicblock *b = entry; b != NULL; b = b->b_next) { - b->b_visited = 0; - nblocks++; - } - basicblock **todo_stack = PyMem_Malloc(sizeof(basicblock *)*nblocks); + basicblock **todo_stack = make_cfg_traversal_stack(entry); if (todo_stack == NULL) { - PyErr_NoMemory(); return -1; } ExceptStack *except_stack = make_except_stack(); @@ -8051,7 +8053,7 @@ static int optimize_cfg(struct compiler *c, struct assembler *a, PyObject *consts); static int -trim_unused_consts(struct compiler *c, struct assembler *a, PyObject *consts); +trim_unused_consts(struct assembler *a, PyObject *consts); /* Duplicates exit BBs, so that line numbers can be propagated to them */ static int @@ -8347,7 +8349,6 @@ assemble(struct compiler *c, int addNone) if (!assemble_init(&a, nblocks, c->u->u_firstlineno)) goto error; a.a_entry = entryblock; - a.a_nblocks = nblocks; int numdropped = fix_cell_offsets(c, entryblock, cellfixedoffsets); PyMem_Free(cellfixedoffsets); // At this point we're done with it. @@ -8368,12 +8369,12 @@ assemble(struct compiler *c, int addNone) if (duplicate_exits_without_lineno(c)) { return NULL; } - if (trim_unused_consts(c, &a, consts)) { + if (trim_unused_consts(&a, consts)) { goto error; } propagate_line_numbers(&a); guarantee_lineno_for_exits(&a, c->u->u_firstlineno); - int maxdepth = stackdepth(c); + int maxdepth = stackdepth(c, entryblock); if (maxdepth < 0) { goto error; } @@ -9081,17 +9082,19 @@ normalize_basic_block(basicblock *bb) { static int mark_reachable(struct assembler *a) { - basicblock **stack, **sp; - sp = stack = (basicblock **)PyObject_Malloc(sizeof(basicblock *) * a->a_nblocks); + basicblock **stack = make_cfg_traversal_stack(a->a_entry); if (stack == NULL) { return -1; } + basicblock **sp = stack; a->a_entry->b_predecessors = 1; *sp++ = a->a_entry; while (sp > stack) { basicblock *b = *(--sp); + b->b_visited = 1; if (b->b_next && !b->b_nofallthrough) { - if (b->b_next->b_predecessors == 0) { + if (!b->b_next->b_visited) { + assert(b->b_next->b_predecessors == 0); *sp++ = b->b_next; } b->b_next->b_predecessors++; @@ -9101,14 +9104,15 @@ mark_reachable(struct assembler *a) { struct instr *instr = &b->b_instr[i]; if (is_jump(instr) || is_block_push(instr)) { target = instr->i_target; - if (target->b_predecessors == 0) { + if (!target->b_visited) { + assert(target->b_predecessors == 0 || target == b->b_next); *sp++ = target; } target->b_predecessors++; } } } - PyObject_Free(stack); + PyMem_Free(stack); return 0; } @@ -9128,12 +9132,15 @@ eliminate_empty_basic_blocks(basicblock *entry) { if (b->b_iused == 0) { continue; } - if (is_jump(&b->b_instr[b->b_iused-1])) { - basicblock *target = b->b_instr[b->b_iused-1].i_target; - while (target->b_iused == 0) { - target = target->b_next; + for (int i = 0; i < b->b_iused; i++) { + struct instr *instr = &b->b_instr[i]; + if (is_jump(instr) || is_block_push(instr)) { + basicblock *target = instr->i_target; + while (target->b_iused == 0) { + target = target->b_next; + } + instr->i_target = target; } - b->b_instr[b->b_iused-1].i_target = target; } } } @@ -9253,7 +9260,7 @@ optimize_cfg(struct compiler *c, struct assembler *a, PyObject *consts) // Remove trailing unused constants. static int -trim_unused_consts(struct compiler *c, struct assembler *a, PyObject *consts) +trim_unused_consts(struct assembler *a, PyObject *consts) { assert(PyList_CheckExact(consts)); From webhook-mailer at python.org Tue May 17 10:12:30 2022 From: webhook-mailer at python.org (sweeneyde) Date: Tue, 17 May 2022 14:12:30 -0000 Subject: [Python-checkins] gh-92536: Update unicode struct size to ensure MemoryError is raised (GH-92867) Message-ID: https://github.com/python/cpython/commit/19a4252459540913d0fd69beb66454f7c19bfef8 commit: 19a4252459540913d0fd69beb66454f7c19bfef8 branch: main author: Dennis Sweeney <36520290+sweeneyde at users.noreply.github.com> committer: sweeneyde <36520290+sweeneyde at users.noreply.github.com> date: 2022-05-17T10:12:21-04:00 summary: gh-92536: Update unicode struct size to ensure MemoryError is raised (GH-92867) files: M Lib/test/test_unicode.py diff --git a/Lib/test/test_unicode.py b/Lib/test/test_unicode.py index c98fabf8bc9b5..64abc0c761b3c 100644 --- a/Lib/test/test_unicode.py +++ b/Lib/test/test_unicode.py @@ -2370,14 +2370,9 @@ def test_expandtabs_optimization(self): self.assertIs(s.expandtabs(), s) def test_raiseMemError(self): - if struct.calcsize('P') == 8: - # 64 bits pointers - ascii_struct_size = 48 - compact_struct_size = 72 - else: - # 32 bits pointers - ascii_struct_size = 24 - compact_struct_size = 36 + null_byte = 1 + ascii_struct_size = sys.getsizeof("a") - len("a") - null_byte + compact_struct_size = sys.getsizeof("\xff") - len("\xff") - null_byte for char in ('a', '\xe9', '\u20ac', '\U0010ffff'): code = ord(char) @@ -2395,8 +2390,9 @@ def test_raiseMemError(self): # be allocatable, given enough memory. maxlen = ((sys.maxsize - struct_size) // char_size) alloc = lambda: char * maxlen - self.assertRaises(MemoryError, alloc) - self.assertRaises(MemoryError, alloc) + with self.subTest(char=char): + self.assertRaises(MemoryError, alloc) + self.assertRaises(MemoryError, alloc) def test_format_subclass(self): class S(str): From webhook-mailer at python.org Tue May 17 11:17:25 2022 From: webhook-mailer at python.org (serhiy-storchaka) Date: Tue, 17 May 2022 15:17:25 -0000 Subject: [Python-checkins] Fix NULL check in test_type_from_ephemeral_spec in_testcapimodule.c (GH-92863) Message-ID: https://github.com/python/cpython/commit/524f03c08ca6688785c0fe99d8f2b385bf92e58f commit: 524f03c08ca6688785c0fe99d8f2b385bf92e58f branch: main author: Dennis Sweeney <36520290+sweeneyde at users.noreply.github.com> committer: serhiy-storchaka date: 2022-05-17T18:17:16+03:00 summary: Fix NULL check in test_type_from_ephemeral_spec in_testcapimodule.c (GH-92863) files: M Modules/_testcapimodule.c diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index 363dbbb666ca5..3bc776140aaba 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -1221,7 +1221,7 @@ test_type_from_ephemeral_spec(PyObject *self, PyObject *Py_UNUSED(ignored)) memcpy(name, NAME, sizeof(NAME)); doc = PyMem_New(char, sizeof(DOC)); - if (name == NULL) { + if (doc == NULL) { PyErr_NoMemory(); goto finally; } From webhook-mailer at python.org Tue May 17 11:48:06 2022 From: webhook-mailer at python.org (miss-islington) Date: Tue, 17 May 2022 15:48:06 -0000 Subject: [Python-checkins] Fix NULL check in test_type_from_ephemeral_spec in_testcapimodule.c (GH-92863) Message-ID: https://github.com/python/cpython/commit/5c826ef0a5b64157a5943867f2013e82a9ba81f9 commit: 5c826ef0a5b64157a5943867f2013e82a9ba81f9 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-17T08:47:50-07:00 summary: Fix NULL check in test_type_from_ephemeral_spec in_testcapimodule.c (GH-92863) (cherry picked from commit 524f03c08ca6688785c0fe99d8f2b385bf92e58f) Co-authored-by: Dennis Sweeney <36520290+sweeneyde at users.noreply.github.com> files: M Modules/_testcapimodule.c diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index de1a8e6c20b6c..a2d9ac807400b 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -1221,7 +1221,7 @@ test_type_from_ephemeral_spec(PyObject *self, PyObject *Py_UNUSED(ignored)) memcpy(name, NAME, sizeof(NAME)); doc = PyMem_New(char, sizeof(DOC)); - if (name == NULL) { + if (doc == NULL) { PyErr_NoMemory(); goto finally; } From webhook-mailer at python.org Tue May 17 12:44:48 2022 From: webhook-mailer at python.org (miss-islington) Date: Tue, 17 May 2022 16:44:48 -0000 Subject: [Python-checkins] gh-81548: Clarify the deprecation of octal sequences affect byte strings (GH-92643) Message-ID: https://github.com/python/cpython/commit/76b81be41346774a2e12607aa4d55f34b170b8e9 commit: 76b81be41346774a2e12607aa4d55f34b170b8e9 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-17T09:44:23-07:00 summary: gh-81548: Clarify the deprecation of octal sequences affect byte strings (GH-92643) Automerge-Triggered-By: GH:pablogsal (cherry picked from commit 0d8500c739dc5ea926b2ec1ec02e400738225dac) Co-authored-by: Pablo Galindo Salgado files: M Doc/whatsnew/3.11.rst diff --git a/Doc/whatsnew/3.11.rst b/Doc/whatsnew/3.11.rst index 6518eea4c7ba5..97dd096731f0c 100644 --- a/Doc/whatsnew/3.11.rst +++ b/Doc/whatsnew/3.11.rst @@ -1116,8 +1116,8 @@ Deprecated that was added in Python 3.10. (Contributed by Raymond Hettinger in :gh:`89519`.) -* Octal escapes with value larger than ``0o377`` now produce - a :exc:`DeprecationWarning`. +* Octal escapes in string and bytes literals with value larger than ``0o377`` now + produce :exc:`DeprecationWarning`. In a future Python version they will be a :exc:`SyntaxWarning` and eventually a :exc:`SyntaxError`. (Contributed by Serhiy Storchaka in :gh:`81548`.) From webhook-mailer at python.org Tue May 17 12:45:44 2022 From: webhook-mailer at python.org (miss-islington) Date: Tue, 17 May 2022 16:45:44 -0000 Subject: [Python-checkins] [3.11] gh-92530: Fix an issue that occurred after interrupting threading.Condition.notify (GH-92534) (GH-92829) Message-ID: https://github.com/python/cpython/commit/38d95b5500fa2d84d718c4190ba2f1b2f6806e6c commit: 38d95b5500fa2d84d718c4190ba2f1b2f6806e6c branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-17T09:45:40-07:00 summary: [3.11] gh-92530: Fix an issue that occurred after interrupting threading.Condition.notify (GH-92534) (GH-92829) If Condition.notify() was interrupted just after it released the waiter lock, but before removing it from the queue, the following calls of notify() failed with RuntimeError: cannot release un-acquired lock. (cherry picked from commit 70af994fee7c0850ae859727d9468a5f29375a38) Co-authored-by: Serhiy Storchaka Automerge-Triggered-By: GH:serhiy-storchaka files: A Misc/NEWS.d/next/Library/2022-05-09-09-28-02.gh-issue-92530.M4Q1RS.rst M Lib/threading.py diff --git a/Lib/threading.py b/Lib/threading.py index 642f93e1eec31..8e7cdf6f620d8 100644 --- a/Lib/threading.py +++ b/Lib/threading.py @@ -368,14 +368,21 @@ def notify(self, n=1): """ if not self._is_owned(): raise RuntimeError("cannot notify on un-acquired lock") - all_waiters = self._waiters - waiters_to_notify = _deque(_islice(all_waiters, n)) - if not waiters_to_notify: - return - for waiter in waiters_to_notify: - waiter.release() + waiters = self._waiters + while waiters and n > 0: + waiter = waiters[0] + try: + waiter.release() + except RuntimeError: + # gh-92530: The previous call of notify() released the lock, + # but was interrupted before removing it from the queue. + # It can happen if a signal handler raises an exception, + # like CTRL+C which raises KeyboardInterrupt. + pass + else: + n -= 1 try: - all_waiters.remove(waiter) + waiters.remove(waiter) except ValueError: pass diff --git a/Misc/NEWS.d/next/Library/2022-05-09-09-28-02.gh-issue-92530.M4Q1RS.rst b/Misc/NEWS.d/next/Library/2022-05-09-09-28-02.gh-issue-92530.M4Q1RS.rst new file mode 100644 index 0000000000000..8bb8ca0488c96 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-05-09-09-28-02.gh-issue-92530.M4Q1RS.rst @@ -0,0 +1,2 @@ +Fix an issue that occurred after interrupting +:func:`threading.Condition.notify`. From webhook-mailer at python.org Tue May 17 13:07:41 2022 From: webhook-mailer at python.org (ambv) Date: Tue, 17 May 2022 17:07:41 -0000 Subject: [Python-checkins] Python 3.9.13 Message-ID: https://github.com/python/cpython/commit/6de2ca5339a83edb957e5a657ee6d6183cb3914c commit: 6de2ca5339a83edb957e5a657ee6d6183cb3914c branch: 3.9 author: ?ukasz Langa committer: ambv date: 2022-05-17T13:12:56+02:00 summary: Python 3.9.13 files: A Misc/NEWS.d/3.9.13.rst D Misc/NEWS.d/next/Build/2022-03-23-20-01-16.bpo-47103.b4-00F.rst D Misc/NEWS.d/next/Core and Builtins/2021-09-28-10-58-30.bpo-36819.cyV50C.rst D Misc/NEWS.d/next/Core and Builtins/2022-03-08-21-59-57.bpo-46962.UomDfz.rst D Misc/NEWS.d/next/Core and Builtins/2022-03-30-02-36-25.bpo-46775.e3Oxqf.rst D Misc/NEWS.d/next/Core and Builtins/2022-04-10-22-57-27.gh-issue-91421.dHhv6U.rst D Misc/NEWS.d/next/Core and Builtins/2022-04-28-23-37-30.gh-issue-92036.GZJAC9.rst D Misc/NEWS.d/next/Core and Builtins/2022-05-01-10-58-38.gh-issue-92112.lLJemu.rst D Misc/NEWS.d/next/Core and Builtins/2022-05-12-18-59-27.gh-issue-92311.VEgtts.rst D Misc/NEWS.d/next/Documentation/2017-12-10-19-13-39.bpo-13553.gQbZs4.rst D Misc/NEWS.d/next/Documentation/2019-09-12-08-28-17.bpo-38056.6ktYkc.rst D Misc/NEWS.d/next/Documentation/2020-07-07-22-54-51.bpo-41233.lyUJ8L.rst D Misc/NEWS.d/next/Documentation/2020-11-12-21-26-31.bpo-42340.apumUL.rst D Misc/NEWS.d/next/Documentation/2021-11-12-11-03-55.bpo-45790.6yuhe8.rst D Misc/NEWS.d/next/Documentation/2022-01-23-20-44-53.bpo-26792.dQ1v1W.rst D Misc/NEWS.d/next/Documentation/2022-03-08-22-10-38.bpo-46962.FIVe9I.rst D Misc/NEWS.d/next/Documentation/2022-03-28-12-32-17.bpo-47138.TbLXgV.rst D Misc/NEWS.d/next/Documentation/2022-04-01-09-28-31.bpo-38668.j4mrqW.rst D Misc/NEWS.d/next/Documentation/2022-04-10-20-28-20.bpo-44347.Q1m3DM.rst D Misc/NEWS.d/next/Documentation/2022-04-19-20-16-00.gh-issue-91547.LsNWER.rst D Misc/NEWS.d/next/Documentation/2022-04-23-00-22-54.gh-issue-91783.N09dRR.rst D Misc/NEWS.d/next/Documentation/2022-04-24-22-09-31.gh-issue-91888.kTjJLx.rst D Misc/NEWS.d/next/Library/2019-06-22-11-01-45.bpo-36073.ED8mB9.rst D Misc/NEWS.d/next/Library/2021-05-22-07-58-59.bpo-42627.EejtD0.rst D Misc/NEWS.d/next/Library/2021-07-26-10-46-49.bpo-44493.xp3CRH.rst D Misc/NEWS.d/next/Library/2021-08-14-00-55-16.bpo-44911.uk3hYk.rst D Misc/NEWS.d/next/Library/2022-01-17-16-53-30.bpo-46415.6wSYg-.rst D Misc/NEWS.d/next/Library/2022-02-18-20-09-29.bpo-46787.juwWc0.rst D Misc/NEWS.d/next/Library/2022-03-27-12-40-16.bpo-43323.9mFPuI.rst D Misc/NEWS.d/next/Library/2022-03-28-13-35-50.bpo-27929.j5mAmV.rst D Misc/NEWS.d/next/Library/2022-04-09-11-28-49.bpo-34480.Pw-GJ6.rst D Misc/NEWS.d/next/Library/2022-04-15-13-16-25.gh-issue-91581.9OGsrN.rst D Misc/NEWS.d/next/Library/2022-04-15-18-38-21.gh-issue-91575.fSyAxS.rst D Misc/NEWS.d/next/Library/2022-04-15-22-07-36.gh-issue-90622.0C6l8h.rst D Misc/NEWS.d/next/Library/2022-04-16-05-12-13.gh-issue-91595.CocJBv.rst D Misc/NEWS.d/next/Library/2022-04-18-16-31-33.gh-issue-90568.9kiU7o.rst D Misc/NEWS.d/next/Library/2022-04-19-04-33-39.gh-issue-91676.ceQBwh.rst D Misc/NEWS.d/next/Library/2022-04-19-17-30-17.gh-issue-91700.MRJi6m.rst D Misc/NEWS.d/next/Library/2022-04-20-09-49-33.gh-issue-91734.4Dj4Gy.rst D Misc/NEWS.d/next/Library/2022-04-23-03-24-00.gh-issue-91832.TyLi65.rst D Misc/NEWS.d/next/Library/2022-04-25-10-23-01.gh-issue-91810.DOHa6B.rst D Misc/NEWS.d/next/Library/2022-04-25-14-18-01.gh-issue-91910.kY-JR0.rst D Misc/NEWS.d/next/Library/2022-04-26-19-01-13.bpo-47029.qkT42X.rst D Misc/NEWS.d/next/Library/2022-04-30-10-53-10.gh-issue-92049.5SEKoh.rst D Misc/NEWS.d/next/Library/2022-05-09-09-28-02.gh-issue-92530.M4Q1RS.rst D Misc/NEWS.d/next/Library/2022-05-11-14-34-09.gh-issue-91581.glkou2.rst D Misc/NEWS.d/next/Tests/2022-01-24-21-31-09.bpo-29890.zEG-ra.rst D Misc/NEWS.d/next/Tests/2022-04-03-14-38-21.bpo-47205.hbbTnh.rst D Misc/NEWS.d/next/Tests/2022-04-16-17-54-05.gh-issue-91607.FnXjtW.rst D Misc/NEWS.d/next/Tools-Demos/2022-04-20-14-26-14.gh-issue-91583.200qI0.rst D Misc/NEWS.d/next/Windows/2020-06-04-10-42-04.bpo-40859.isKSw7.rst D Misc/NEWS.d/next/Windows/2022-03-13-20-35-41.bpo-46785.Pnknyl.rst D Misc/NEWS.d/next/Windows/2022-04-01-14-57-40.bpo-47194.IB0XL4.rst M Include/patchlevel.h M Lib/pydoc_data/topics.py M README.rst diff --git a/Include/patchlevel.h b/Include/patchlevel.h index 3804aa8655a76..cf3529473e73d 100644 --- a/Include/patchlevel.h +++ b/Include/patchlevel.h @@ -18,12 +18,12 @@ /*--start constants--*/ #define PY_MAJOR_VERSION 3 #define PY_MINOR_VERSION 9 -#define PY_MICRO_VERSION 12 +#define PY_MICRO_VERSION 13 #define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_FINAL #define PY_RELEASE_SERIAL 0 /* Version as a string */ -#define PY_VERSION "3.9.12+" +#define PY_VERSION "3.9.13" /*--end constants--*/ /* Version as a single 4-byte hex number, e.g. 0x010502B2 == 1.5.2b2. diff --git a/Lib/pydoc_data/topics.py b/Lib/pydoc_data/topics.py index 2546eb933bcbd..318e85660d90f 100644 --- a/Lib/pydoc_data/topics.py +++ b/Lib/pydoc_data/topics.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Autogenerated by Sphinx on Wed Mar 23 22:08:02 2022 +# Autogenerated by Sphinx on Tue May 17 12:57:36 2022 topics = {'assert': 'The "assert" statement\n' '**********************\n' '\n' @@ -93,11 +93,7 @@ ' optionally in parentheses, the object is assigned to that ' 'target.\n' '\n' - '* Else: The object must be an iterable with the same number of ' - 'items\n' - ' as there are targets in the target list, and the items are ' - 'assigned,\n' - ' from left to right, to the corresponding targets.\n' + '* Else:\n' '\n' ' * If the target list contains one target prefixed with an ' 'asterisk,\n' @@ -3980,7 +3976,10 @@ 'is\n' 'applied to separating the commands; the input is split at the ' 'first\n' - '";;" pair, even if it is in the middle of a quoted string.\n' + '";;" pair, even if it is in the middle of a quoted string. A\n' + 'workaround for strings with double semicolons is to use ' + 'implicit\n' + 'string concatenation "\';\'\';\'" or "";"";"".\n' '\n' 'If a file ".pdbrc" exists in the user?s home directory or in ' 'the\n' @@ -6402,12 +6401,12 @@ 'Examples:\n' '\n' ' import foo # foo imported and bound locally\n' - ' import foo.bar.baz # foo.bar.baz imported, foo bound ' - 'locally\n' - ' import foo.bar.baz as fbb # foo.bar.baz imported and bound as ' - 'fbb\n' - ' from foo.bar import baz # foo.bar.baz imported and bound as ' - 'baz\n' + ' import foo.bar.baz # foo, foo.bar, and foo.bar.baz ' + 'imported, foo bound locally\n' + ' import foo.bar.baz as fbb # foo, foo.bar, and foo.bar.baz ' + 'imported, foo.bar.baz bound as fbb\n' + ' from foo.bar import baz # foo, foo.bar, and foo.bar.baz ' + 'imported, foo.bar.baz bound as baz\n' ' from foo import attr # foo imported and foo.attr bound as ' 'attr\n' '\n' @@ -11091,9 +11090,13 @@ ' >>> "they\'re bill\'s friends from the UK".title()\n' ' "They\'Re Bill\'S Friends From The Uk"\n' '\n' - ' A workaround for apostrophes can be constructed using ' - 'regular\n' - ' expressions:\n' + ' The "string.capwords()" function does not have this ' + 'problem, as it\n' + ' splits words on spaces only.\n' + '\n' + ' Alternatively, a workaround for apostrophes can be ' + 'constructed\n' + ' using regular expressions:\n' '\n' ' >>> import re\n' ' >>> def titlecase(s):\n' @@ -11215,12 +11218,15 @@ 'single quotes ("\'") or double quotes ("""). They can also be ' 'enclosed\n' 'in matching groups of three single or double quotes (these are\n' - 'generally referred to as *triple-quoted strings*). The ' - 'backslash\n' - '("\\") character is used to escape characters that otherwise have ' - 'a\n' - 'special meaning, such as newline, backslash itself, or the quote\n' + 'generally referred to as *triple-quoted strings*). The backslash ' + '("\\")\n' + 'character is used to give special meaning to otherwise ordinary\n' + 'characters like "n", which means ?newline? when escaped ("\\n"). ' + 'It can\n' + 'also be used to escape characters that otherwise have a special\n' + 'meaning, such as newline, backslash itself, or the quote ' 'character.\n' + 'See escape sequences below for examples.\n' '\n' 'Bytes literals are always prefixed with "\'b\'" or "\'B\'"; they ' 'produce\n' @@ -12788,14 +12794,6 @@ 'unwise to use\n' 'them as dictionary keys.)\n' '\n' - 'Dictionaries can be created by placing a comma-separated ' - 'list of "key:\n' - 'value" pairs within braces, for example: "{\'jack\': 4098, ' - "'sjoerd':\n" - '4127}" or "{4098: \'jack\', 4127: \'sjoerd\'}", or by the ' - '"dict"\n' - 'constructor.\n' - '\n' 'class dict(**kwargs)\n' 'class dict(mapping, **kwargs)\n' 'class dict(iterable, **kwargs)\n' diff --git a/Misc/NEWS.d/3.9.13.rst b/Misc/NEWS.d/3.9.13.rst new file mode 100644 index 0000000000000..cc490522325e3 --- /dev/null +++ b/Misc/NEWS.d/3.9.13.rst @@ -0,0 +1,546 @@ +.. date: 2022-05-12-18-59-27 +.. gh-issue: 92311 +.. nonce: VEgtts +.. release date: 2022-05-17 +.. section: Core and Builtins + +Fixed a bug where setting ``frame.f_lineno`` to jump over a list +comprehension could misbehave or crash. + +.. + +.. date: 2022-05-01-10-58-38 +.. gh-issue: 92112 +.. nonce: lLJemu +.. section: Core and Builtins + +Fix crash triggered by an evil custom ``mro()`` on a metaclass. + +.. + +.. date: 2022-04-28-23-37-30 +.. gh-issue: 92036 +.. nonce: GZJAC9 +.. section: Core and Builtins + +Fix a crash in subinterpreters related to the garbage collector. When a +subinterpreter is deleted, untrack all objects tracked by its GC. To prevent +a crash in deallocator functions expecting objects to be tracked by the GC, +leak a strong reference to these objects on purpose, so they are never +deleted and their deallocator functions are not called. Patch by Victor +Stinner. + +.. + +.. date: 2022-04-10-22-57-27 +.. gh-issue: 91421 +.. nonce: dHhv6U +.. section: Core and Builtins + +Fix a potential integer overflow in _Py_DecodeUTF8Ex. + +.. + +.. bpo: 46775 +.. date: 2022-03-30-02-36-25 +.. nonce: e3Oxqf +.. section: Core and Builtins + +Some Windows system error codes(>= 10000) are now mapped into the correct +errno and may now raise a subclass of :exc:`OSError`. Patch by Dong-hee Na. + +.. + +.. bpo: 46962 +.. date: 2022-03-08-21-59-57 +.. nonce: UomDfz +.. section: Core and Builtins + +Classes and functions that unconditionally declared their docstrings +ignoring the `--without-doc-strings` compilation flag no longer do so. + +The classes affected are :class:`pickle.PickleBuffer`, +:class:`testcapi.RecursingInfinitelyError`, and :class:`types.GenericAlias`. + +The functions affected are 24 methods in :mod:`ctypes`. + +Patch by Oleg Iarygin. + +.. + +.. bpo: 36819 +.. date: 2021-09-28-10-58-30 +.. nonce: cyV50C +.. section: Core and Builtins + +Fix crashes in built-in encoders with error handlers that return position +less or equal than the starting position of non-encodable characters. + +.. + +.. date: 2022-05-11-14-34-09 +.. gh-issue: 91581 +.. nonce: glkou2 +.. section: Library + +:meth:`~datetime.datetime.utcfromtimestamp` no longer attempts to resolve +``fold`` in the pure Python implementation, since the fold is never 1 in +UTC. In addition to being slightly faster in the common case, this also +prevents some errors when the timestamp is close to :attr:`datetime.min +`. Patch by Paul Ganssle. + +.. + +.. date: 2022-05-09-09-28-02 +.. gh-issue: 92530 +.. nonce: M4Q1RS +.. section: Library + +Fix an issue that occurred after interrupting +:func:`threading.Condition.notify`. + +.. + +.. date: 2022-04-30-10-53-10 +.. gh-issue: 92049 +.. nonce: 5SEKoh +.. section: Library + +Forbid pickling constants ``re._constants.SUCCESS`` etc. Previously, +pickling did not fail, but the result could not be unpickled. + +.. + +.. bpo: 47029 +.. date: 2022-04-26-19-01-13 +.. nonce: qkT42X +.. section: Library + +Always close the read end of the pipe used by :class:`multiprocessing.Queue` +*after* the last write of buffered data to the write end of the pipe to +avoid :exc:`BrokenPipeError` at garbage collection and at +:meth:`multiprocessing.Queue.close` calls. Patch by G?ry Ogam. + +.. + +.. date: 2022-04-25-14-18-01 +.. gh-issue: 91910 +.. nonce: kY-JR0 +.. section: Library + +Add missing f prefix to f-strings in error messages from the +:mod:`multiprocessing` and :mod:`asyncio` modules. + +.. + +.. date: 2022-04-25-10-23-01 +.. gh-issue: 91810 +.. nonce: DOHa6B +.. section: Library + +:class:`~xml.etree.ElementTree.ElementTree` method +:meth:`~xml.etree.ElementTree.ElementTree.write` and function +:func:`~xml.etree.ElementTree.tostring` now use the text file's encoding +("UTF-8" if not available) instead of locale encoding in XML declaration +when ``encoding="unicode"`` is specified. + +.. + +.. date: 2022-04-23-03-24-00 +.. gh-issue: 91832 +.. nonce: TyLi65 +.. section: Library + +Add ``required`` attribute to :class:`argparse.Action` repr output. + +.. + +.. date: 2022-04-20-09-49-33 +.. gh-issue: 91734 +.. nonce: 4Dj4Gy +.. section: Library + +Fix OSS audio support on Solaris. + +.. + +.. date: 2022-04-19-17-30-17 +.. gh-issue: 91700 +.. nonce: MRJi6m +.. section: Library + +Compilation of regular expression containing a conditional expression +``(?(group)...)`` now raises an appropriate :exc:`re.error` if the group +number refers to not defined group. Previously an internal RuntimeError was +raised. + +.. + +.. date: 2022-04-19-04-33-39 +.. gh-issue: 91676 +.. nonce: ceQBwh +.. section: Library + +Fix :class:`unittest.IsolatedAsyncioTestCase` to shutdown the per test event +loop executor before returning from its ``run`` method so that a not yet +stopped or garbage collected executor state does not persist beyond the +test. + +.. + +.. date: 2022-04-18-16-31-33 +.. gh-issue: 90568 +.. nonce: 9kiU7o +.. section: Library + +Parsing ``\N`` escapes of Unicode Named Character Sequences in a +:mod:`regular expression ` raises now :exc:`re.error` instead of +``TypeError``. + +.. + +.. date: 2022-04-16-05-12-13 +.. gh-issue: 91595 +.. nonce: CocJBv +.. section: Library + +Fix the comparison of character and integer inside +:func:`Tools.gdb.libpython.write_repr`. Patch by Yu Liu. + +.. + +.. date: 2022-04-15-22-07-36 +.. gh-issue: 90622 +.. nonce: 0C6l8h +.. section: Library + +Worker processes for :class:`concurrent.futures.ProcessPoolExecutor` are no +longer spawned on demand (a feature added in 3.9) when the multiprocessing +context start method is ``"fork"`` as that can lead to deadlocks in the +child processes due to a fork happening while threads are running. + +.. + +.. date: 2022-04-15-18-38-21 +.. gh-issue: 91575 +.. nonce: fSyAxS +.. section: Library + +Update case-insensitive matching in the :mod:`re` module to the latest +Unicode version. + +.. + +.. date: 2022-04-15-13-16-25 +.. gh-issue: 91581 +.. nonce: 9OGsrN +.. section: Library + +Remove an unhandled error case in the C implementation of calls to +:meth:`datetime.fromtimestamp ` with no +time zone (i.e. getting a local time from an epoch timestamp). This should +have no user-facing effect other than giving a possibly more accurate error +message when called with timestamps that fall on 10000-01-01 in the local +time. Patch by Paul Ganssle. + +.. + +.. bpo: 34480 +.. date: 2022-04-09-11-28-49 +.. nonce: Pw-GJ6 +.. section: Library + +Fix a bug where :mod:`_markupbase` raised an :exc:`UnboundLocalError` when +an invalid keyword was found in marked section. Patch by Marek Suscak. + +.. + +.. bpo: 27929 +.. date: 2022-03-28-13-35-50 +.. nonce: j5mAmV +.. section: Library + +Fix :meth:`asyncio.loop.sock_connect` to only resolve names for +:const:`socket.AF_INET` or :const:`socket.AF_INET6` families. Resolution may +not make sense for other families, like :const:`socket.AF_BLUETOOTH` and +:const:`socket.AF_UNIX`. + +.. + +.. bpo: 43323 +.. date: 2022-03-27-12-40-16 +.. nonce: 9mFPuI +.. section: Library + +Fix errors in the :mod:`email` module if the charset itself contains +undecodable/unencodable characters. + +.. + +.. bpo: 46787 +.. date: 2022-02-18-20-09-29 +.. nonce: juwWc0 +.. section: Library + +Fix :class:`concurrent.futures.ProcessPoolExecutor` exception memory leak + +.. + +.. bpo: 46415 +.. date: 2022-01-17-16-53-30 +.. nonce: 6wSYg- +.. section: Library + +Fix ipaddress.ip_{address,interface,network} raising TypeError instead of +ValueError if given invalid tuple as address parameter. + +.. + +.. bpo: 44911 +.. date: 2021-08-14-00-55-16 +.. nonce: uk3hYk +.. section: Library + +:class:`~unittest.IsolatedAsyncioTestCase` will no longer throw an exception +while cancelling leaked tasks. Patch by Bar Harel. + +.. + +.. bpo: 44493 +.. date: 2021-07-26-10-46-49 +.. nonce: xp3CRH +.. section: Library + +Add missing terminated NUL in sockaddr_un's length + +This was potentially observable when using non-abstract AF_UNIX datagram +sockets to processes written in another programming language. + +.. + +.. bpo: 42627 +.. date: 2021-05-22-07-58-59 +.. nonce: EejtD0 +.. section: Library + +Fix incorrect parsing of Windows registry proxy settings + +.. + +.. bpo: 36073 +.. date: 2019-06-22-11-01-45 +.. nonce: ED8mB9 +.. section: Library + +Raise :exc:`~sqlite3.ProgrammingError` instead of segfaulting on recursive +usage of cursors in :mod:`sqlite3` converters. Patch by Sergey Fedoseev. + +.. + +.. date: 2022-04-24-22-09-31 +.. gh-issue: 91888 +.. nonce: kTjJLx +.. section: Documentation + +Add a new ``gh`` role to the documentation to link to GitHub issues. + +.. + +.. date: 2022-04-23-00-22-54 +.. gh-issue: 91783 +.. nonce: N09dRR +.. section: Documentation + +Document security issues concerning the use of the function +:meth:`shutil.unpack_archive` + +.. + +.. date: 2022-04-19-20-16-00 +.. gh-issue: 91547 +.. nonce: LsNWER +.. section: Documentation + +Remove "Undocumented modules" page. + +.. + +.. bpo: 44347 +.. date: 2022-04-10-20-28-20 +.. nonce: Q1m3DM +.. section: Documentation + +Clarify the meaning of *dirs_exist_ok*, a kwarg of :func:`shutil.copytree`. + +.. + +.. bpo: 38668 +.. date: 2022-04-01-09-28-31 +.. nonce: j4mrqW +.. section: Documentation + +Update the introduction to documentation for :mod:`os.path` to remove +warnings that became irrelevant after the implementations of :pep:`383` and +:pep:`529`. + +.. + +.. bpo: 47138 +.. date: 2022-03-28-12-32-17 +.. nonce: TbLXgV +.. section: Documentation + +Pin Jinja to a version compatible with Sphinx version 2.4.4. + +.. + +.. bpo: 46962 +.. date: 2022-03-08-22-10-38 +.. nonce: FIVe9I +.. section: Documentation + +All docstrings in code snippets are now wrapped into :func:`PyDoc_STR` to +follow the guideline of `PEP 7's Documentation Strings paragraph +`_. Patch +by Oleg Iarygin. + +.. + +.. bpo: 26792 +.. date: 2022-01-23-20-44-53 +.. nonce: dQ1v1W +.. section: Documentation + +Improve the docstrings of :func:`runpy.run_module` and +:func:`runpy.run_path`. Original patch by Andrew Brezovsky. + +.. + +.. bpo: 45790 +.. date: 2021-11-12-11-03-55 +.. nonce: 6yuhe8 +.. section: Documentation + +Adjust inaccurate phrasing in :doc:`../extending/newtypes_tutorial` about +the ``ob_base`` field and the macros used to access its contents. + +.. + +.. bpo: 42340 +.. date: 2020-11-12-21-26-31 +.. nonce: apumUL +.. section: Documentation + +Document that in some circumstances :exc:`KeyboardInterrupt` may cause the +code to enter an inconsistent state. Provided a sample workaround to avoid +it if needed. + +.. + +.. bpo: 41233 +.. date: 2020-07-07-22-54-51 +.. nonce: lyUJ8L +.. section: Documentation + +Link the errnos referenced in ``Doc/library/exceptions.rst`` to their +respective section in ``Doc/library/errno.rst``, and vice versa. Previously +this was only done for EINTR and InterruptedError. Patch by Yan "yyyyyyyan" +Orestes. + +.. + +.. bpo: 38056 +.. date: 2019-09-12-08-28-17 +.. nonce: 6ktYkc +.. section: Documentation + +Overhaul the :ref:`error-handlers` documentation in :mod:`codecs`. + +.. + +.. bpo: 13553 +.. date: 2017-12-10-19-13-39 +.. nonce: gQbZs4 +.. section: Documentation + +Document tkinter.Tk args. + +.. + +.. date: 2022-04-16-17-54-05 +.. gh-issue: 91607 +.. nonce: FnXjtW +.. section: Tests + +Fix ``test_concurrent_futures`` to test the correct multiprocessing start +method context in several cases where the test logic mixed this up. + +.. + +.. bpo: 47205 +.. date: 2022-04-03-14-38-21 +.. nonce: hbbTnh +.. section: Tests + +Skip test for :func:`~os.sched_getaffinity` and +:func:`~os.sched_setaffinity` error case on FreeBSD. + +.. + +.. bpo: 29890 +.. date: 2022-01-24-21-31-09 +.. nonce: zEG-ra +.. section: Tests + +Add tests for :class:`ipaddress.IPv4Interface` and +:class:`ipaddress.IPv6Interface` construction with tuple arguments. Original +patch and tests by louisom. + +.. + +.. bpo: 47103 +.. date: 2022-03-23-20-01-16 +.. nonce: b4-00F +.. section: Build + +Windows ``PGInstrument`` builds now copy a required DLL into the output +directory, making it easier to run the profile stage of a PGO build. + +.. + +.. bpo: 47194 +.. date: 2022-04-01-14-57-40 +.. nonce: IB0XL4 +.. section: Windows + +Update ``zlib`` to v1.2.12 to resolve CVE-2018-25032. + +.. + +.. bpo: 46785 +.. date: 2022-03-13-20-35-41 +.. nonce: Pnknyl +.. section: Windows + +Fix race condition between :func:`os.stat` and unlinking a file on Windows, +by using errors codes returned by ``FindFirstFileW()`` when appropriate in +``win32_xstat_impl``. + +.. + +.. bpo: 40859 +.. date: 2020-06-04-10-42-04 +.. nonce: isKSw7 +.. section: Windows + +Update Windows build to use xz-5.2.5 + +.. + +.. date: 2022-04-20-14-26-14 +.. gh-issue: 91583 +.. nonce: 200qI0 +.. section: Tools/Demos + +Fix regression in the code generated by Argument Clinic for functions with +the ``defining_class`` parameter. diff --git a/Misc/NEWS.d/next/Build/2022-03-23-20-01-16.bpo-47103.b4-00F.rst b/Misc/NEWS.d/next/Build/2022-03-23-20-01-16.bpo-47103.b4-00F.rst deleted file mode 100644 index c1e01adce0d26..0000000000000 --- a/Misc/NEWS.d/next/Build/2022-03-23-20-01-16.bpo-47103.b4-00F.rst +++ /dev/null @@ -1,2 +0,0 @@ -Windows ``PGInstrument`` builds now copy a required DLL into the output -directory, making it easier to run the profile stage of a PGO build. diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-09-28-10-58-30.bpo-36819.cyV50C.rst b/Misc/NEWS.d/next/Core and Builtins/2021-09-28-10-58-30.bpo-36819.cyV50C.rst deleted file mode 100644 index 32bb55a90e6c4..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2021-09-28-10-58-30.bpo-36819.cyV50C.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix crashes in built-in encoders with error handlers that return position -less or equal than the starting position of non-encodable characters. diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-03-08-21-59-57.bpo-46962.UomDfz.rst b/Misc/NEWS.d/next/Core and Builtins/2022-03-08-21-59-57.bpo-46962.UomDfz.rst deleted file mode 100644 index 98f19260a7ed2..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-03-08-21-59-57.bpo-46962.UomDfz.rst +++ /dev/null @@ -1,9 +0,0 @@ -Classes and functions that unconditionally declared their docstrings -ignoring the `--without-doc-strings` compilation flag no longer do so. - -The classes affected are :class:`pickle.PickleBuffer`, -:class:`testcapi.RecursingInfinitelyError`, and :class:`types.GenericAlias`. - -The functions affected are 24 methods in :mod:`ctypes`. - -Patch by Oleg Iarygin. diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-03-30-02-36-25.bpo-46775.e3Oxqf.rst b/Misc/NEWS.d/next/Core and Builtins/2022-03-30-02-36-25.bpo-46775.e3Oxqf.rst deleted file mode 100644 index da56ecd89367b..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-03-30-02-36-25.bpo-46775.e3Oxqf.rst +++ /dev/null @@ -1,3 +0,0 @@ -Some Windows system error codes(>= 10000) are now mapped into -the correct errno and may now raise a subclass of :exc:`OSError`. -Patch by Dong-hee Na. diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-04-10-22-57-27.gh-issue-91421.dHhv6U.rst b/Misc/NEWS.d/next/Core and Builtins/2022-04-10-22-57-27.gh-issue-91421.dHhv6U.rst deleted file mode 100644 index 898eb0df18d01..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-04-10-22-57-27.gh-issue-91421.dHhv6U.rst +++ /dev/null @@ -1 +0,0 @@ -Fix a potential integer overflow in _Py_DecodeUTF8Ex. diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-04-28-23-37-30.gh-issue-92036.GZJAC9.rst b/Misc/NEWS.d/next/Core and Builtins/2022-04-28-23-37-30.gh-issue-92036.GZJAC9.rst deleted file mode 100644 index 78094c5e4fea7..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-04-28-23-37-30.gh-issue-92036.GZJAC9.rst +++ /dev/null @@ -1,5 +0,0 @@ -Fix a crash in subinterpreters related to the garbage collector. When a -subinterpreter is deleted, untrack all objects tracked by its GC. To prevent a -crash in deallocator functions expecting objects to be tracked by the GC, leak -a strong reference to these objects on purpose, so they are never deleted and -their deallocator functions are not called. Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-01-10-58-38.gh-issue-92112.lLJemu.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-01-10-58-38.gh-issue-92112.lLJemu.rst deleted file mode 100644 index 00c938e89f438..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-05-01-10-58-38.gh-issue-92112.lLJemu.rst +++ /dev/null @@ -1 +0,0 @@ -Fix crash triggered by an evil custom ``mro()`` on a metaclass. diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-12-18-59-27.gh-issue-92311.VEgtts.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-12-18-59-27.gh-issue-92311.VEgtts.rst deleted file mode 100644 index b800def656cbf..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-05-12-18-59-27.gh-issue-92311.VEgtts.rst +++ /dev/null @@ -1 +0,0 @@ -Fixed a bug where setting ``frame.f_lineno`` to jump over a list comprehension could misbehave or crash. diff --git a/Misc/NEWS.d/next/Documentation/2017-12-10-19-13-39.bpo-13553.gQbZs4.rst b/Misc/NEWS.d/next/Documentation/2017-12-10-19-13-39.bpo-13553.gQbZs4.rst deleted file mode 100644 index 23d3c1555e370..0000000000000 --- a/Misc/NEWS.d/next/Documentation/2017-12-10-19-13-39.bpo-13553.gQbZs4.rst +++ /dev/null @@ -1 +0,0 @@ -Document tkinter.Tk args. diff --git a/Misc/NEWS.d/next/Documentation/2019-09-12-08-28-17.bpo-38056.6ktYkc.rst b/Misc/NEWS.d/next/Documentation/2019-09-12-08-28-17.bpo-38056.6ktYkc.rst deleted file mode 100644 index 2e6b70fd84b6d..0000000000000 --- a/Misc/NEWS.d/next/Documentation/2019-09-12-08-28-17.bpo-38056.6ktYkc.rst +++ /dev/null @@ -1 +0,0 @@ -Overhaul the :ref:`error-handlers` documentation in :mod:`codecs`. diff --git a/Misc/NEWS.d/next/Documentation/2020-07-07-22-54-51.bpo-41233.lyUJ8L.rst b/Misc/NEWS.d/next/Documentation/2020-07-07-22-54-51.bpo-41233.lyUJ8L.rst deleted file mode 100644 index ea0643aa00ee0..0000000000000 --- a/Misc/NEWS.d/next/Documentation/2020-07-07-22-54-51.bpo-41233.lyUJ8L.rst +++ /dev/null @@ -1 +0,0 @@ -Link the errnos referenced in ``Doc/library/exceptions.rst`` to their respective section in ``Doc/library/errno.rst``, and vice versa. Previously this was only done for EINTR and InterruptedError. Patch by Yan "yyyyyyyan" Orestes. diff --git a/Misc/NEWS.d/next/Documentation/2020-11-12-21-26-31.bpo-42340.apumUL.rst b/Misc/NEWS.d/next/Documentation/2020-11-12-21-26-31.bpo-42340.apumUL.rst deleted file mode 100644 index aa6857497383c..0000000000000 --- a/Misc/NEWS.d/next/Documentation/2020-11-12-21-26-31.bpo-42340.apumUL.rst +++ /dev/null @@ -1,3 +0,0 @@ -Document that in some circumstances :exc:`KeyboardInterrupt` may cause the -code to enter an inconsistent state. Provided a sample workaround to avoid -it if needed. diff --git a/Misc/NEWS.d/next/Documentation/2021-11-12-11-03-55.bpo-45790.6yuhe8.rst b/Misc/NEWS.d/next/Documentation/2021-11-12-11-03-55.bpo-45790.6yuhe8.rst deleted file mode 100644 index 41cf2cb91525f..0000000000000 --- a/Misc/NEWS.d/next/Documentation/2021-11-12-11-03-55.bpo-45790.6yuhe8.rst +++ /dev/null @@ -1,2 +0,0 @@ -Adjust inaccurate phrasing in :doc:`../extending/newtypes_tutorial` about the -``ob_base`` field and the macros used to access its contents. diff --git a/Misc/NEWS.d/next/Documentation/2022-01-23-20-44-53.bpo-26792.dQ1v1W.rst b/Misc/NEWS.d/next/Documentation/2022-01-23-20-44-53.bpo-26792.dQ1v1W.rst deleted file mode 100644 index 64a3956447601..0000000000000 --- a/Misc/NEWS.d/next/Documentation/2022-01-23-20-44-53.bpo-26792.dQ1v1W.rst +++ /dev/null @@ -1,2 +0,0 @@ -Improve the docstrings of :func:`runpy.run_module` and :func:`runpy.run_path`. -Original patch by Andrew Brezovsky. diff --git a/Misc/NEWS.d/next/Documentation/2022-03-08-22-10-38.bpo-46962.FIVe9I.rst b/Misc/NEWS.d/next/Documentation/2022-03-08-22-10-38.bpo-46962.FIVe9I.rst deleted file mode 100644 index f5b54013bd672..0000000000000 --- a/Misc/NEWS.d/next/Documentation/2022-03-08-22-10-38.bpo-46962.FIVe9I.rst +++ /dev/null @@ -1,4 +0,0 @@ -All docstrings in code snippets are now wrapped into :func:`PyDoc_STR` to -follow the guideline of `PEP 7's Documentation Strings paragraph -`_. Patch -by Oleg Iarygin. diff --git a/Misc/NEWS.d/next/Documentation/2022-03-28-12-32-17.bpo-47138.TbLXgV.rst b/Misc/NEWS.d/next/Documentation/2022-03-28-12-32-17.bpo-47138.TbLXgV.rst deleted file mode 100644 index 9dde4de2dc8b5..0000000000000 --- a/Misc/NEWS.d/next/Documentation/2022-03-28-12-32-17.bpo-47138.TbLXgV.rst +++ /dev/null @@ -1 +0,0 @@ -Pin Jinja to a version compatible with Sphinx version 2.4.4. diff --git a/Misc/NEWS.d/next/Documentation/2022-04-01-09-28-31.bpo-38668.j4mrqW.rst b/Misc/NEWS.d/next/Documentation/2022-04-01-09-28-31.bpo-38668.j4mrqW.rst deleted file mode 100644 index 512f0deb3543c..0000000000000 --- a/Misc/NEWS.d/next/Documentation/2022-04-01-09-28-31.bpo-38668.j4mrqW.rst +++ /dev/null @@ -1,3 +0,0 @@ -Update the introduction to documentation for :mod:`os.path` to remove -warnings that became irrelevant after the implementations of :pep:`383` and -:pep:`529`. diff --git a/Misc/NEWS.d/next/Documentation/2022-04-10-20-28-20.bpo-44347.Q1m3DM.rst b/Misc/NEWS.d/next/Documentation/2022-04-10-20-28-20.bpo-44347.Q1m3DM.rst deleted file mode 100644 index 27aa5742cd008..0000000000000 --- a/Misc/NEWS.d/next/Documentation/2022-04-10-20-28-20.bpo-44347.Q1m3DM.rst +++ /dev/null @@ -1 +0,0 @@ -Clarify the meaning of *dirs_exist_ok*, a kwarg of :func:`shutil.copytree`. diff --git a/Misc/NEWS.d/next/Documentation/2022-04-19-20-16-00.gh-issue-91547.LsNWER.rst b/Misc/NEWS.d/next/Documentation/2022-04-19-20-16-00.gh-issue-91547.LsNWER.rst deleted file mode 100644 index 95b34cb2fac1f..0000000000000 --- a/Misc/NEWS.d/next/Documentation/2022-04-19-20-16-00.gh-issue-91547.LsNWER.rst +++ /dev/null @@ -1 +0,0 @@ -Remove "Undocumented modules" page. diff --git a/Misc/NEWS.d/next/Documentation/2022-04-23-00-22-54.gh-issue-91783.N09dRR.rst b/Misc/NEWS.d/next/Documentation/2022-04-23-00-22-54.gh-issue-91783.N09dRR.rst deleted file mode 100644 index 4d6be37402079..0000000000000 --- a/Misc/NEWS.d/next/Documentation/2022-04-23-00-22-54.gh-issue-91783.N09dRR.rst +++ /dev/null @@ -1,2 +0,0 @@ -Document security issues concerning the use of the function -:meth:`shutil.unpack_archive` diff --git a/Misc/NEWS.d/next/Documentation/2022-04-24-22-09-31.gh-issue-91888.kTjJLx.rst b/Misc/NEWS.d/next/Documentation/2022-04-24-22-09-31.gh-issue-91888.kTjJLx.rst deleted file mode 100644 index 4ebca42a7fec5..0000000000000 --- a/Misc/NEWS.d/next/Documentation/2022-04-24-22-09-31.gh-issue-91888.kTjJLx.rst +++ /dev/null @@ -1 +0,0 @@ -Add a new ``gh`` role to the documentation to link to GitHub issues. diff --git a/Misc/NEWS.d/next/Library/2019-06-22-11-01-45.bpo-36073.ED8mB9.rst b/Misc/NEWS.d/next/Library/2019-06-22-11-01-45.bpo-36073.ED8mB9.rst deleted file mode 100644 index 6c214d8191601..0000000000000 --- a/Misc/NEWS.d/next/Library/2019-06-22-11-01-45.bpo-36073.ED8mB9.rst +++ /dev/null @@ -1,2 +0,0 @@ -Raise :exc:`~sqlite3.ProgrammingError` instead of segfaulting on recursive -usage of cursors in :mod:`sqlite3` converters. Patch by Sergey Fedoseev. diff --git a/Misc/NEWS.d/next/Library/2021-05-22-07-58-59.bpo-42627.EejtD0.rst b/Misc/NEWS.d/next/Library/2021-05-22-07-58-59.bpo-42627.EejtD0.rst deleted file mode 100644 index f165b9ced05d9..0000000000000 --- a/Misc/NEWS.d/next/Library/2021-05-22-07-58-59.bpo-42627.EejtD0.rst +++ /dev/null @@ -1 +0,0 @@ -Fix incorrect parsing of Windows registry proxy settings diff --git a/Misc/NEWS.d/next/Library/2021-07-26-10-46-49.bpo-44493.xp3CRH.rst b/Misc/NEWS.d/next/Library/2021-07-26-10-46-49.bpo-44493.xp3CRH.rst deleted file mode 100644 index 390a7222bbf55..0000000000000 --- a/Misc/NEWS.d/next/Library/2021-07-26-10-46-49.bpo-44493.xp3CRH.rst +++ /dev/null @@ -1,3 +0,0 @@ -Add missing terminated NUL in sockaddr_un's length - -This was potentially observable when using non-abstract AF_UNIX datagram sockets to processes written in another programming language. diff --git a/Misc/NEWS.d/next/Library/2021-08-14-00-55-16.bpo-44911.uk3hYk.rst b/Misc/NEWS.d/next/Library/2021-08-14-00-55-16.bpo-44911.uk3hYk.rst deleted file mode 100644 index f8aed69a40a3b..0000000000000 --- a/Misc/NEWS.d/next/Library/2021-08-14-00-55-16.bpo-44911.uk3hYk.rst +++ /dev/null @@ -1 +0,0 @@ -:class:`~unittest.IsolatedAsyncioTestCase` will no longer throw an exception while cancelling leaked tasks. Patch by Bar Harel. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2022-01-17-16-53-30.bpo-46415.6wSYg-.rst b/Misc/NEWS.d/next/Library/2022-01-17-16-53-30.bpo-46415.6wSYg-.rst deleted file mode 100644 index 016d6656041f9..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-01-17-16-53-30.bpo-46415.6wSYg-.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix ipaddress.ip_{address,interface,network} raising TypeError instead of -ValueError if given invalid tuple as address parameter. diff --git a/Misc/NEWS.d/next/Library/2022-02-18-20-09-29.bpo-46787.juwWc0.rst b/Misc/NEWS.d/next/Library/2022-02-18-20-09-29.bpo-46787.juwWc0.rst deleted file mode 100644 index cf167ff48115b..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-02-18-20-09-29.bpo-46787.juwWc0.rst +++ /dev/null @@ -1 +0,0 @@ -Fix :class:`concurrent.futures.ProcessPoolExecutor` exception memory leak diff --git a/Misc/NEWS.d/next/Library/2022-03-27-12-40-16.bpo-43323.9mFPuI.rst b/Misc/NEWS.d/next/Library/2022-03-27-12-40-16.bpo-43323.9mFPuI.rst deleted file mode 100644 index 98d73101d3ee5..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-03-27-12-40-16.bpo-43323.9mFPuI.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix errors in the :mod:`email` module if the charset itself contains -undecodable/unencodable characters. diff --git a/Misc/NEWS.d/next/Library/2022-03-28-13-35-50.bpo-27929.j5mAmV.rst b/Misc/NEWS.d/next/Library/2022-03-28-13-35-50.bpo-27929.j5mAmV.rst deleted file mode 100644 index 4c80a10bc5684..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-03-28-13-35-50.bpo-27929.j5mAmV.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fix :meth:`asyncio.loop.sock_connect` to only resolve names for :const:`socket.AF_INET` or -:const:`socket.AF_INET6` families. Resolution may not make sense for other families, -like :const:`socket.AF_BLUETOOTH` and :const:`socket.AF_UNIX`. diff --git a/Misc/NEWS.d/next/Library/2022-04-09-11-28-49.bpo-34480.Pw-GJ6.rst b/Misc/NEWS.d/next/Library/2022-04-09-11-28-49.bpo-34480.Pw-GJ6.rst deleted file mode 100644 index 748df89b07e3f..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-09-11-28-49.bpo-34480.Pw-GJ6.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fix a bug where :mod:`_markupbase` raised an :exc:`UnboundLocalError` -when an invalid keyword was found in marked section. Patch by Marek -Suscak. diff --git a/Misc/NEWS.d/next/Library/2022-04-15-13-16-25.gh-issue-91581.9OGsrN.rst b/Misc/NEWS.d/next/Library/2022-04-15-13-16-25.gh-issue-91581.9OGsrN.rst deleted file mode 100644 index 1c3008f425578..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-15-13-16-25.gh-issue-91581.9OGsrN.rst +++ /dev/null @@ -1,6 +0,0 @@ -Remove an unhandled error case in the C implementation of calls to -:meth:`datetime.fromtimestamp ` with no time -zone (i.e. getting a local time from an epoch timestamp). This should have no -user-facing effect other than giving a possibly more accurate error message -when called with timestamps that fall on 10000-01-01 in the local time. Patch -by Paul Ganssle. diff --git a/Misc/NEWS.d/next/Library/2022-04-15-18-38-21.gh-issue-91575.fSyAxS.rst b/Misc/NEWS.d/next/Library/2022-04-15-18-38-21.gh-issue-91575.fSyAxS.rst deleted file mode 100644 index ba046f2b4d61c..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-15-18-38-21.gh-issue-91575.fSyAxS.rst +++ /dev/null @@ -1,2 +0,0 @@ -Update case-insensitive matching in the :mod:`re` module to the latest -Unicode version. diff --git a/Misc/NEWS.d/next/Library/2022-04-15-22-07-36.gh-issue-90622.0C6l8h.rst b/Misc/NEWS.d/next/Library/2022-04-15-22-07-36.gh-issue-90622.0C6l8h.rst deleted file mode 100644 index 5db0a1bbe721d..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-15-22-07-36.gh-issue-90622.0C6l8h.rst +++ /dev/null @@ -1,4 +0,0 @@ -Worker processes for :class:`concurrent.futures.ProcessPoolExecutor` are no -longer spawned on demand (a feature added in 3.9) when the multiprocessing -context start method is ``"fork"`` as that can lead to deadlocks in the -child processes due to a fork happening while threads are running. diff --git a/Misc/NEWS.d/next/Library/2022-04-16-05-12-13.gh-issue-91595.CocJBv.rst b/Misc/NEWS.d/next/Library/2022-04-16-05-12-13.gh-issue-91595.CocJBv.rst deleted file mode 100644 index 637079a6487a4..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-16-05-12-13.gh-issue-91595.CocJBv.rst +++ /dev/null @@ -1 +0,0 @@ -Fix the comparison of character and integer inside :func:`Tools.gdb.libpython.write_repr`. Patch by Yu Liu. diff --git a/Misc/NEWS.d/next/Library/2022-04-18-16-31-33.gh-issue-90568.9kiU7o.rst b/Misc/NEWS.d/next/Library/2022-04-18-16-31-33.gh-issue-90568.9kiU7o.rst deleted file mode 100644 index 4411c715830e2..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-18-16-31-33.gh-issue-90568.9kiU7o.rst +++ /dev/null @@ -1,3 +0,0 @@ -Parsing ``\N`` escapes of Unicode Named Character Sequences in a -:mod:`regular expression ` raises now :exc:`re.error` instead of -``TypeError``. diff --git a/Misc/NEWS.d/next/Library/2022-04-19-04-33-39.gh-issue-91676.ceQBwh.rst b/Misc/NEWS.d/next/Library/2022-04-19-04-33-39.gh-issue-91676.ceQBwh.rst deleted file mode 100644 index dfbaef4440e0a..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-19-04-33-39.gh-issue-91676.ceQBwh.rst +++ /dev/null @@ -1,4 +0,0 @@ -Fix :class:`unittest.IsolatedAsyncioTestCase` to shutdown the per test event -loop executor before returning from its ``run`` method so that a not yet -stopped or garbage collected executor state does not persist beyond the -test. diff --git a/Misc/NEWS.d/next/Library/2022-04-19-17-30-17.gh-issue-91700.MRJi6m.rst b/Misc/NEWS.d/next/Library/2022-04-19-17-30-17.gh-issue-91700.MRJi6m.rst deleted file mode 100644 index 73b106869697b..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-19-17-30-17.gh-issue-91700.MRJi6m.rst +++ /dev/null @@ -1,4 +0,0 @@ -Compilation of regular expression containing a conditional expression -``(?(group)...)`` now raises an appropriate :exc:`re.error` if the group -number refers to not defined group. Previously an internal RuntimeError was -raised. diff --git a/Misc/NEWS.d/next/Library/2022-04-20-09-49-33.gh-issue-91734.4Dj4Gy.rst b/Misc/NEWS.d/next/Library/2022-04-20-09-49-33.gh-issue-91734.4Dj4Gy.rst deleted file mode 100644 index 47d9e0dea458a..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-20-09-49-33.gh-issue-91734.4Dj4Gy.rst +++ /dev/null @@ -1 +0,0 @@ -Fix OSS audio support on Solaris. diff --git a/Misc/NEWS.d/next/Library/2022-04-23-03-24-00.gh-issue-91832.TyLi65.rst b/Misc/NEWS.d/next/Library/2022-04-23-03-24-00.gh-issue-91832.TyLi65.rst deleted file mode 100644 index 0ebf773546558..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-23-03-24-00.gh-issue-91832.TyLi65.rst +++ /dev/null @@ -1 +0,0 @@ -Add ``required`` attribute to :class:`argparse.Action` repr output. diff --git a/Misc/NEWS.d/next/Library/2022-04-25-10-23-01.gh-issue-91810.DOHa6B.rst b/Misc/NEWS.d/next/Library/2022-04-25-10-23-01.gh-issue-91810.DOHa6B.rst deleted file mode 100644 index 0711f8466b818..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-25-10-23-01.gh-issue-91810.DOHa6B.rst +++ /dev/null @@ -1,5 +0,0 @@ -:class:`~xml.etree.ElementTree.ElementTree` method -:meth:`~xml.etree.ElementTree.ElementTree.write` and function -:func:`~xml.etree.ElementTree.tostring` now use the text file's encoding -("UTF-8" if not available) instead of locale encoding in XML declaration -when ``encoding="unicode"`` is specified. diff --git a/Misc/NEWS.d/next/Library/2022-04-25-14-18-01.gh-issue-91910.kY-JR0.rst b/Misc/NEWS.d/next/Library/2022-04-25-14-18-01.gh-issue-91910.kY-JR0.rst deleted file mode 100644 index f41f357ddfcc3..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-25-14-18-01.gh-issue-91910.kY-JR0.rst +++ /dev/null @@ -1 +0,0 @@ -Add missing f prefix to f-strings in error messages from the :mod:`multiprocessing` and :mod:`asyncio` modules. diff --git a/Misc/NEWS.d/next/Library/2022-04-26-19-01-13.bpo-47029.qkT42X.rst b/Misc/NEWS.d/next/Library/2022-04-26-19-01-13.bpo-47029.qkT42X.rst deleted file mode 100644 index cc054673338f0..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-26-19-01-13.bpo-47029.qkT42X.rst +++ /dev/null @@ -1,4 +0,0 @@ -Always close the read end of the pipe used by :class:`multiprocessing.Queue` -*after* the last write of buffered data to the write end of the pipe to avoid -:exc:`BrokenPipeError` at garbage collection and at -:meth:`multiprocessing.Queue.close` calls. Patch by G?ry Ogam. diff --git a/Misc/NEWS.d/next/Library/2022-04-30-10-53-10.gh-issue-92049.5SEKoh.rst b/Misc/NEWS.d/next/Library/2022-04-30-10-53-10.gh-issue-92049.5SEKoh.rst deleted file mode 100644 index cad4621c65096..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-30-10-53-10.gh-issue-92049.5SEKoh.rst +++ /dev/null @@ -1,2 +0,0 @@ -Forbid pickling constants ``re._constants.SUCCESS`` etc. Previously, -pickling did not fail, but the result could not be unpickled. diff --git a/Misc/NEWS.d/next/Library/2022-05-09-09-28-02.gh-issue-92530.M4Q1RS.rst b/Misc/NEWS.d/next/Library/2022-05-09-09-28-02.gh-issue-92530.M4Q1RS.rst deleted file mode 100644 index 8bb8ca0488c96..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-05-09-09-28-02.gh-issue-92530.M4Q1RS.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix an issue that occurred after interrupting -:func:`threading.Condition.notify`. diff --git a/Misc/NEWS.d/next/Library/2022-05-11-14-34-09.gh-issue-91581.glkou2.rst b/Misc/NEWS.d/next/Library/2022-05-11-14-34-09.gh-issue-91581.glkou2.rst deleted file mode 100644 index 846f57844a675..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-05-11-14-34-09.gh-issue-91581.glkou2.rst +++ /dev/null @@ -1,5 +0,0 @@ -:meth:`~datetime.datetime.utcfromtimestamp` no longer attempts to resolve -``fold`` in the pure Python implementation, since the fold is never 1 in UTC. -In addition to being slightly faster in the common case, this also prevents -some errors when the timestamp is close to :attr:`datetime.min -`. Patch by Paul Ganssle. diff --git a/Misc/NEWS.d/next/Tests/2022-01-24-21-31-09.bpo-29890.zEG-ra.rst b/Misc/NEWS.d/next/Tests/2022-01-24-21-31-09.bpo-29890.zEG-ra.rst deleted file mode 100644 index 38a06a2f9b6be..0000000000000 --- a/Misc/NEWS.d/next/Tests/2022-01-24-21-31-09.bpo-29890.zEG-ra.rst +++ /dev/null @@ -1,2 +0,0 @@ -Add tests for :class:`ipaddress.IPv4Interface` and :class:`ipaddress.IPv6Interface` construction with tuple arguments. -Original patch and tests by louisom. diff --git a/Misc/NEWS.d/next/Tests/2022-04-03-14-38-21.bpo-47205.hbbTnh.rst b/Misc/NEWS.d/next/Tests/2022-04-03-14-38-21.bpo-47205.hbbTnh.rst deleted file mode 100644 index 35fd94421326e..0000000000000 --- a/Misc/NEWS.d/next/Tests/2022-04-03-14-38-21.bpo-47205.hbbTnh.rst +++ /dev/null @@ -1,2 +0,0 @@ -Skip test for :func:`~os.sched_getaffinity` and -:func:`~os.sched_setaffinity` error case on FreeBSD. diff --git a/Misc/NEWS.d/next/Tests/2022-04-16-17-54-05.gh-issue-91607.FnXjtW.rst b/Misc/NEWS.d/next/Tests/2022-04-16-17-54-05.gh-issue-91607.FnXjtW.rst deleted file mode 100644 index 32839a826a41e..0000000000000 --- a/Misc/NEWS.d/next/Tests/2022-04-16-17-54-05.gh-issue-91607.FnXjtW.rst +++ /dev/null @@ -1 +0,0 @@ -Fix ``test_concurrent_futures`` to test the correct multiprocessing start method context in several cases where the test logic mixed this up. diff --git a/Misc/NEWS.d/next/Tools-Demos/2022-04-20-14-26-14.gh-issue-91583.200qI0.rst b/Misc/NEWS.d/next/Tools-Demos/2022-04-20-14-26-14.gh-issue-91583.200qI0.rst deleted file mode 100644 index bdfa71100f95a..0000000000000 --- a/Misc/NEWS.d/next/Tools-Demos/2022-04-20-14-26-14.gh-issue-91583.200qI0.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix regression in the code generated by Argument Clinic for functions with -the ``defining_class`` parameter. diff --git a/Misc/NEWS.d/next/Windows/2020-06-04-10-42-04.bpo-40859.isKSw7.rst b/Misc/NEWS.d/next/Windows/2020-06-04-10-42-04.bpo-40859.isKSw7.rst deleted file mode 100644 index ef4c727ad2866..0000000000000 --- a/Misc/NEWS.d/next/Windows/2020-06-04-10-42-04.bpo-40859.isKSw7.rst +++ /dev/null @@ -1 +0,0 @@ -Update Windows build to use xz-5.2.5 diff --git a/Misc/NEWS.d/next/Windows/2022-03-13-20-35-41.bpo-46785.Pnknyl.rst b/Misc/NEWS.d/next/Windows/2022-03-13-20-35-41.bpo-46785.Pnknyl.rst deleted file mode 100644 index 0a87abd77c8ff..0000000000000 --- a/Misc/NEWS.d/next/Windows/2022-03-13-20-35-41.bpo-46785.Pnknyl.rst +++ /dev/null @@ -1 +0,0 @@ -Fix race condition between :func:`os.stat` and unlinking a file on Windows, by using errors codes returned by ``FindFirstFileW()`` when appropriate in ``win32_xstat_impl``. diff --git a/Misc/NEWS.d/next/Windows/2022-04-01-14-57-40.bpo-47194.IB0XL4.rst b/Misc/NEWS.d/next/Windows/2022-04-01-14-57-40.bpo-47194.IB0XL4.rst deleted file mode 100644 index 7e76add45fa95..0000000000000 --- a/Misc/NEWS.d/next/Windows/2022-04-01-14-57-40.bpo-47194.IB0XL4.rst +++ /dev/null @@ -1 +0,0 @@ -Update ``zlib`` to v1.2.12 to resolve CVE-2018-25032. diff --git a/README.rst b/README.rst index d3b2521a875a0..7a842390b0372 100644 --- a/README.rst +++ b/README.rst @@ -1,4 +1,4 @@ -This is Python version 3.9.12 +This is Python version 3.9.13 ============================= .. image:: https://travis-ci.org/python/cpython.svg?branch=3.9 From webhook-mailer at python.org Tue May 17 13:21:16 2022 From: webhook-mailer at python.org (vstinner) Date: Tue, 17 May 2022 17:21:16 -0000 Subject: [Python-checkins] gh-89653: PEP 670: Fix PyUnicode_READ() cast (#92872) Message-ID: https://github.com/python/cpython/commit/e6fd7992a92879103215b3e9f218fe07212af9b1 commit: e6fd7992a92879103215b3e9f218fe07212af9b1 branch: main author: Victor Stinner committer: vstinner date: 2022-05-17T19:20:37+02:00 summary: gh-89653: PEP 670: Fix PyUnicode_READ() cast (#92872) _Py_CAST() cannot be used with a constant type: use _Py_STATIC_CAST() instead. files: M Include/cpython/unicodeobject.h M Lib/test/_testcppext.cpp diff --git a/Include/cpython/unicodeobject.h b/Include/cpython/unicodeobject.h index 274339d7f9fe6..f853b69dec9d1 100644 --- a/Include/cpython/unicodeobject.h +++ b/Include/cpython/unicodeobject.h @@ -340,7 +340,8 @@ static inline Py_UCS4 PyUnicode_READ(int kind, } #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000 #define PyUnicode_READ(kind, data, index) \ - PyUnicode_READ(_Py_STATIC_CAST(int, kind), _Py_CAST(const void*, data), \ + PyUnicode_READ(_Py_STATIC_CAST(int, kind), \ + _Py_STATIC_CAST(const void*, data), \ (index)) #endif diff --git a/Lib/test/_testcppext.cpp b/Lib/test/_testcppext.cpp index dc40f0ee9eb1c..f38b4870e0edb 100644 --- a/Lib/test/_testcppext.cpp +++ b/Lib/test/_testcppext.cpp @@ -50,9 +50,40 @@ test_api_casts(PyObject *Py_UNUSED(module), PyObject *Py_UNUSED(args)) } +static PyObject * +test_unicode(PyObject *Py_UNUSED(module), PyObject *Py_UNUSED(args)) +{ + PyObject *str = PyUnicode_FromString("abc"); + if (str == nullptr) { + return nullptr; + } + + assert(PyUnicode_Check(str)); + assert(PyUnicode_GET_LENGTH(str) == 3); + + // gh-92800: test PyUnicode_READ() + const void* data = PyUnicode_DATA(str); + assert(data != nullptr); + int kind = PyUnicode_KIND(str); + assert(kind == PyUnicode_1BYTE_KIND); + assert(PyUnicode_READ(kind, data, 0) == 'a'); + + // gh-92800: test PyUnicode_READ() casts + const void* const_data = PyUnicode_DATA(str); + unsigned int ukind = static_cast(kind); + assert(PyUnicode_READ(ukind, const_data, 2) == 'c'); + + assert(PyUnicode_READ_CHAR(str, 1) == 'b'); + + Py_DECREF(str); + Py_RETURN_NONE; +} + + static PyMethodDef _testcppext_methods[] = { {"add", _testcppext_add, METH_VARARGS, _testcppext_add_doc}, {"test_api_casts", test_api_casts, METH_NOARGS, nullptr}, + {"test_unicode", test_unicode, METH_NOARGS, nullptr}, {nullptr, nullptr, 0, nullptr} /* sentinel */ }; From webhook-mailer at python.org Tue May 17 13:43:35 2022 From: webhook-mailer at python.org (vstinner) Date: Tue, 17 May 2022 17:43:35 -0000 Subject: [Python-checkins] gh-89653: Add assertions on PyUnicode_READ() index (#92883) Message-ID: https://github.com/python/cpython/commit/13058323621bfb1776fc39948a4096c76f8cbc81 commit: 13058323621bfb1776fc39948a4096c76f8cbc81 branch: main author: Victor Stinner committer: vstinner date: 2022-05-17T19:43:19+02:00 summary: gh-89653: Add assertions on PyUnicode_READ() index (#92883) Add assertions on the index argument of PyUnicode_READ(), PyUnicode_READ_CHAR() and PyUnicode_WRITE() functions. files: M Include/cpython/unicodeobject.h diff --git a/Include/cpython/unicodeobject.h b/Include/cpython/unicodeobject.h index f853b69dec9d1..758aaff2d77d6 100644 --- a/Include/cpython/unicodeobject.h +++ b/Include/cpython/unicodeobject.h @@ -304,6 +304,7 @@ static inline Py_ssize_t PyUnicode_GET_LENGTH(PyObject *op) { static inline void PyUnicode_WRITE(int kind, void *data, Py_ssize_t index, Py_UCS4 value) { + assert(index >= 0); if (kind == PyUnicode_1BYTE_KIND) { assert(value <= 0xffU); _Py_STATIC_CAST(Py_UCS1*, data)[index] = _Py_STATIC_CAST(Py_UCS1, value); @@ -329,6 +330,7 @@ static inline void PyUnicode_WRITE(int kind, void *data, static inline Py_UCS4 PyUnicode_READ(int kind, const void *data, Py_ssize_t index) { + assert(index >= 0); if (kind == PyUnicode_1BYTE_KIND) { return _Py_STATIC_CAST(const Py_UCS1*, data)[index]; } @@ -351,7 +353,13 @@ static inline Py_UCS4 PyUnicode_READ(int kind, cache kind and use PyUnicode_READ instead. */ static inline Py_UCS4 PyUnicode_READ_CHAR(PyObject *unicode, Py_ssize_t index) { - int kind = PyUnicode_KIND(unicode); + int kind; + + assert(index >= 0); + // Tolerate reading the NUL character at str[len(str)] + assert(index <= PyUnicode_GET_LENGTH(unicode)); + + kind = PyUnicode_KIND(unicode); if (kind == PyUnicode_1BYTE_KIND) { return PyUnicode_1BYTE_DATA(unicode)[index]; } From webhook-mailer at python.org Tue May 17 13:46:22 2022 From: webhook-mailer at python.org (miss-islington) Date: Tue, 17 May 2022 17:46:22 -0000 Subject: [Python-checkins] gh-89653: PEP 670: Fix PyUnicode_READ() cast (GH-92872) Message-ID: https://github.com/python/cpython/commit/1df455042d610afac71e792ae2689060dd43178e commit: 1df455042d610afac71e792ae2689060dd43178e branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-17T10:45:55-07:00 summary: gh-89653: PEP 670: Fix PyUnicode_READ() cast (GH-92872) _Py_CAST() cannot be used with a constant type: use _Py_STATIC_CAST() instead. (cherry picked from commit e6fd7992a92879103215b3e9f218fe07212af9b1) Co-authored-by: Victor Stinner files: M Include/cpython/unicodeobject.h M Lib/test/_testcppext.cpp diff --git a/Include/cpython/unicodeobject.h b/Include/cpython/unicodeobject.h index 8ec2fccaecf99..84307d1885472 100644 --- a/Include/cpython/unicodeobject.h +++ b/Include/cpython/unicodeobject.h @@ -407,7 +407,8 @@ static inline Py_UCS4 PyUnicode_READ(int kind, } #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000 #define PyUnicode_READ(kind, data, index) \ - PyUnicode_READ(_Py_STATIC_CAST(int, kind), _Py_CAST(const void*, data), \ + PyUnicode_READ(_Py_STATIC_CAST(int, kind), \ + _Py_STATIC_CAST(const void*, data), \ (index)) #endif diff --git a/Lib/test/_testcppext.cpp b/Lib/test/_testcppext.cpp index dc40f0ee9eb1c..f38b4870e0edb 100644 --- a/Lib/test/_testcppext.cpp +++ b/Lib/test/_testcppext.cpp @@ -50,9 +50,40 @@ test_api_casts(PyObject *Py_UNUSED(module), PyObject *Py_UNUSED(args)) } +static PyObject * +test_unicode(PyObject *Py_UNUSED(module), PyObject *Py_UNUSED(args)) +{ + PyObject *str = PyUnicode_FromString("abc"); + if (str == nullptr) { + return nullptr; + } + + assert(PyUnicode_Check(str)); + assert(PyUnicode_GET_LENGTH(str) == 3); + + // gh-92800: test PyUnicode_READ() + const void* data = PyUnicode_DATA(str); + assert(data != nullptr); + int kind = PyUnicode_KIND(str); + assert(kind == PyUnicode_1BYTE_KIND); + assert(PyUnicode_READ(kind, data, 0) == 'a'); + + // gh-92800: test PyUnicode_READ() casts + const void* const_data = PyUnicode_DATA(str); + unsigned int ukind = static_cast(kind); + assert(PyUnicode_READ(ukind, const_data, 2) == 'c'); + + assert(PyUnicode_READ_CHAR(str, 1) == 'b'); + + Py_DECREF(str); + Py_RETURN_NONE; +} + + static PyMethodDef _testcppext_methods[] = { {"add", _testcppext_add, METH_VARARGS, _testcppext_add_doc}, {"test_api_casts", test_api_casts, METH_NOARGS, nullptr}, + {"test_unicode", test_unicode, METH_NOARGS, nullptr}, {nullptr, nullptr, 0, nullptr} /* sentinel */ }; From webhook-mailer at python.org Tue May 17 18:20:00 2022 From: webhook-mailer at python.org (vstinner) Date: Tue, 17 May 2022 22:20:00 -0000 Subject: [Python-checkins] gh-89898: Fix test_threading.test_args_argument() (#92885) Message-ID: https://github.com/python/cpython/commit/970efae274538f9910e8f9b31bc890f1b7666b0f commit: 970efae274538f9910e8f9b31bc890f1b7666b0f branch: main author: Victor Stinner committer: vstinner date: 2022-05-18T00:19:56+02:00 summary: gh-89898: Fix test_threading.test_args_argument() (#92885) Join the thread to not leak threads running in the background to the next test. Fix the following warning on the "AMD64 FreeBSD Shared 3.11" buildbot: test_args_argument (test.test_threading.ThreadTests.test_args_argument) ... Warning -- threading_cleanup() failed to cleanup 1 threads (count: 1, dangling: 2) Warning -- Dangling thread: <_MainThread(MainThread, started 35026161664)> Warning -- Dangling thread: ), started 35314998016)> ok files: M Lib/test/test_threading.py diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py index a1bf354e65e2e..6cdc45f523dcb 100644 --- a/Lib/test/test_threading.py +++ b/Lib/test/test_threading.py @@ -149,6 +149,7 @@ def test_args_argument(self): with self.subTest(target=target, args=args): t = threading.Thread(target=target, args=args) t.start() + t.join() @cpython_only def test_disallow_instantiation(self): From webhook-mailer at python.org Tue May 17 18:24:22 2022 From: webhook-mailer at python.org (zooba) Date: Tue, 17 May 2022 22:24:22 -0000 Subject: [Python-checkins] bpo-38704: Prevent installation on unsupported Windows versions (GH-17950) Message-ID: https://github.com/python/cpython/commit/6b932cb13376b026d316d4f94679e66974d837d8 commit: 6b932cb13376b026d316d4f94679e66974d837d8 branch: main author: Zackery Spytz committer: zooba date: 2022-05-17T23:24:17+01:00 summary: bpo-38704: Prevent installation on unsupported Windows versions (GH-17950) files: A Misc/NEWS.d/next/Windows/2020-01-10-23-33-03.bpo-38704.2Idtdn.rst M Tools/msi/bundle/Default.wxl diff --git a/Misc/NEWS.d/next/Windows/2020-01-10-23-33-03.bpo-38704.2Idtdn.rst b/Misc/NEWS.d/next/Windows/2020-01-10-23-33-03.bpo-38704.2Idtdn.rst new file mode 100644 index 0000000000000..519338f27a47a --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2020-01-10-23-33-03.bpo-38704.2Idtdn.rst @@ -0,0 +1 @@ +Prevent installation on unsupported Windows versions. diff --git a/Tools/msi/bundle/Default.wxl b/Tools/msi/bundle/Default.wxl index 2eddd1f749ec5..8b2633fe89f72 100644 --- a/Tools/msi/bundle/Default.wxl +++ b/Tools/msi/bundle/Default.wxl @@ -121,7 +121,6 @@ Feel free to email <a href="mailto:python-list at python.org">python-list at pyt You must restart your computer to complete the rollback of the software. &Restart Unable to install [WixBundleName] due to an existing install. Use Programs and Features to modify, repair or remove [WixBundleName]. - At least Windows 8.1 or Windows Server 2012 are required to install [WixBundleName] Visit <a href="https://www.python.org/">python.org</a> to download an earlier version of Python. From webhook-mailer at python.org Tue May 17 18:27:41 2022 From: webhook-mailer at python.org (zooba) Date: Tue, 17 May 2022 22:27:41 -0000 Subject: [Python-checkins] gh-92841: Fix asyncio's RuntimeError: Event loop is closed (GH-92842) Message-ID: https://github.com/python/cpython/commit/33880b4b1c60f54aa9e7fa02698a3c82eafe3dc7 commit: 33880b4b1c60f54aa9e7fa02698a3c82eafe3dc7 branch: main author: Oleg Iarygin committer: zooba date: 2022-05-17T23:27:32+01:00 summary: gh-92841: Fix asyncio's RuntimeError: Event loop is closed (GH-92842) files: A Misc/NEWS.d/next/Windows/2022-05-16-11-45-06.gh-issue-92841.NQx107.rst M Lib/asyncio/proactor_events.py diff --git a/Lib/asyncio/proactor_events.py b/Lib/asyncio/proactor_events.py index 9636c6b4d28fa..ddb9daca02693 100644 --- a/Lib/asyncio/proactor_events.py +++ b/Lib/asyncio/proactor_events.py @@ -113,7 +113,7 @@ def close(self): def __del__(self, _warn=warnings.warn): if self._sock is not None: _warn(f"unclosed transport {self!r}", ResourceWarning, source=self) - self.close() + self._sock.close() def _fatal_error(self, exc, message='Fatal error on pipe transport'): try: diff --git a/Misc/NEWS.d/next/Windows/2022-05-16-11-45-06.gh-issue-92841.NQx107.rst b/Misc/NEWS.d/next/Windows/2022-05-16-11-45-06.gh-issue-92841.NQx107.rst new file mode 100644 index 0000000000000..5e1897e6ba1bc --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2022-05-16-11-45-06.gh-issue-92841.NQx107.rst @@ -0,0 +1,2 @@ +:mod:`asyncio` no longer throws ``RuntimeError: Event loop is closed`` on +interpreter exit after asynchronous socket activity. Patch by Oleg Iarygin. From webhook-mailer at python.org Tue May 17 18:46:06 2022 From: webhook-mailer at python.org (miss-islington) Date: Tue, 17 May 2022 22:46:06 -0000 Subject: [Python-checkins] gh-89898: Fix test_threading.test_args_argument() (GH-92885) Message-ID: https://github.com/python/cpython/commit/58088a544c825ecc14733699c4cf32377049434e commit: 58088a544c825ecc14733699c4cf32377049434e branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-17T15:45:56-07:00 summary: gh-89898: Fix test_threading.test_args_argument() (GH-92885) Join the thread to not leak threads running in the background to the next test. Fix the following warning on the "AMD64 FreeBSD Shared 3.11" buildbot: test_args_argument (test.test_threading.ThreadTests.test_args_argument) ... Warning -- threading_cleanup() failed to cleanup 1 threads (count: 1, dangling: 2) Warning -- Dangling thread: <_MainThread(MainThread, started 35026161664)> Warning -- Dangling thread: ), started 35314998016)> ok (cherry picked from commit 970efae274538f9910e8f9b31bc890f1b7666b0f) Co-authored-by: Victor Stinner files: M Lib/test/test_threading.py diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py index f7dea136a87c0..9c6561c099f57 100644 --- a/Lib/test/test_threading.py +++ b/Lib/test/test_threading.py @@ -149,6 +149,7 @@ def test_args_argument(self): with self.subTest(target=target, args=args): t = threading.Thread(target=target, args=args) t.start() + t.join() @cpython_only def test_disallow_instantiation(self): From webhook-mailer at python.org Tue May 17 18:59:37 2022 From: webhook-mailer at python.org (miss-islington) Date: Tue, 17 May 2022 22:59:37 -0000 Subject: [Python-checkins] gh-92841: Fix asyncio's RuntimeError: Event loop is closed (GH-92842) Message-ID: https://github.com/python/cpython/commit/36da1a77c6bad47a6acc98d6629e80c58b859f7d commit: 36da1a77c6bad47a6acc98d6629e80c58b859f7d branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-17T15:59:29-07:00 summary: gh-92841: Fix asyncio's RuntimeError: Event loop is closed (GH-92842) (cherry picked from commit 33880b4b1c60f54aa9e7fa02698a3c82eafe3dc7) Co-authored-by: Oleg Iarygin files: A Misc/NEWS.d/next/Windows/2022-05-16-11-45-06.gh-issue-92841.NQx107.rst M Lib/asyncio/proactor_events.py diff --git a/Lib/asyncio/proactor_events.py b/Lib/asyncio/proactor_events.py index 9636c6b4d28fa..ddb9daca02693 100644 --- a/Lib/asyncio/proactor_events.py +++ b/Lib/asyncio/proactor_events.py @@ -113,7 +113,7 @@ def close(self): def __del__(self, _warn=warnings.warn): if self._sock is not None: _warn(f"unclosed transport {self!r}", ResourceWarning, source=self) - self.close() + self._sock.close() def _fatal_error(self, exc, message='Fatal error on pipe transport'): try: diff --git a/Misc/NEWS.d/next/Windows/2022-05-16-11-45-06.gh-issue-92841.NQx107.rst b/Misc/NEWS.d/next/Windows/2022-05-16-11-45-06.gh-issue-92841.NQx107.rst new file mode 100644 index 0000000000000..5e1897e6ba1bc --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2022-05-16-11-45-06.gh-issue-92841.NQx107.rst @@ -0,0 +1,2 @@ +:mod:`asyncio` no longer throws ``RuntimeError: Event loop is closed`` on +interpreter exit after asynchronous socket activity. Patch by Oleg Iarygin. From webhook-mailer at python.org Tue May 17 21:24:50 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Wed, 18 May 2022 01:24:50 -0000 Subject: [Python-checkins] bpo-40838: document `getdoc`, `getmodule`, `getsourcefile` in `inspect` returns `None` (#30575) Message-ID: https://github.com/python/cpython/commit/b86d783a4eff96306f315acf9a6f1aca85d47fc3 commit: b86d783a4eff96306f315acf9a6f1aca85d47fc3 branch: main author: Nikita Sobolev committer: JelleZijlstra date: 2022-05-17T18:24:35-07:00 summary: bpo-40838: document `getdoc`, `getmodule`, `getsourcefile` in `inspect` returns `None` (#30575) Co-authored-by: Alex Waygood Co-authored-by: Jelle Zijlstra files: A Misc/NEWS.d/next/Documentation/2022-01-13-16-03-15.bpo-40838.k3NVCf.rst M Doc/library/inspect.rst diff --git a/Doc/library/inspect.rst b/Doc/library/inspect.rst index 575b3088900e1..154d0f5dab0cd 100644 --- a/Doc/library/inspect.rst +++ b/Doc/library/inspect.rst @@ -512,6 +512,7 @@ Retrieving source code If the documentation string for an object is not provided and the object is a class, a method, a property or a descriptor, retrieve the documentation string from the inheritance hierarchy. + Return ``None`` if the documentation string is invalid or missing. .. versionchanged:: 3.5 Documentation strings are now inherited if not overridden. @@ -535,12 +536,14 @@ Retrieving source code .. function:: getmodule(object) - Try to guess which module an object was defined in. + Try to guess which module an object was defined in. Return ``None`` + if the module cannot be determined. .. function:: getsourcefile(object) - Return the name of the Python source file in which an object was defined. This + Return the name of the Python source file in which an object was defined + or ``None`` if no way can be identified to get the source. This will fail with a :exc:`TypeError` if the object is a built-in module, class, or function. diff --git a/Misc/NEWS.d/next/Documentation/2022-01-13-16-03-15.bpo-40838.k3NVCf.rst b/Misc/NEWS.d/next/Documentation/2022-01-13-16-03-15.bpo-40838.k3NVCf.rst new file mode 100644 index 0000000000000..0f071ab64dbec --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2022-01-13-16-03-15.bpo-40838.k3NVCf.rst @@ -0,0 +1,2 @@ +Document that :func:`inspect.getdoc`, :func:`inspect.getmodule`, and +:func:`inspect.getsourcefile` might return ``None``. From webhook-mailer at python.org Tue May 17 21:42:04 2022 From: webhook-mailer at python.org (miss-islington) Date: Wed, 18 May 2022 01:42:04 -0000 Subject: [Python-checkins] bpo-40838: document `getdoc`, `getmodule`, `getsourcefile` in `inspect` returns `None` (GH-30575) Message-ID: https://github.com/python/cpython/commit/9a61afec20554c7bfe8043709e35ebc7b1e3fa2d commit: 9a61afec20554c7bfe8043709e35ebc7b1e3fa2d branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-17T18:41:55-07:00 summary: bpo-40838: document `getdoc`, `getmodule`, `getsourcefile` in `inspect` returns `None` (GH-30575) Co-authored-by: Alex Waygood Co-authored-by: Jelle Zijlstra (cherry picked from commit b86d783a4eff96306f315acf9a6f1aca85d47fc3) Co-authored-by: Nikita Sobolev files: A Misc/NEWS.d/next/Documentation/2022-01-13-16-03-15.bpo-40838.k3NVCf.rst M Doc/library/inspect.rst diff --git a/Doc/library/inspect.rst b/Doc/library/inspect.rst index 575b3088900e1..154d0f5dab0cd 100644 --- a/Doc/library/inspect.rst +++ b/Doc/library/inspect.rst @@ -512,6 +512,7 @@ Retrieving source code If the documentation string for an object is not provided and the object is a class, a method, a property or a descriptor, retrieve the documentation string from the inheritance hierarchy. + Return ``None`` if the documentation string is invalid or missing. .. versionchanged:: 3.5 Documentation strings are now inherited if not overridden. @@ -535,12 +536,14 @@ Retrieving source code .. function:: getmodule(object) - Try to guess which module an object was defined in. + Try to guess which module an object was defined in. Return ``None`` + if the module cannot be determined. .. function:: getsourcefile(object) - Return the name of the Python source file in which an object was defined. This + Return the name of the Python source file in which an object was defined + or ``None`` if no way can be identified to get the source. This will fail with a :exc:`TypeError` if the object is a built-in module, class, or function. diff --git a/Misc/NEWS.d/next/Documentation/2022-01-13-16-03-15.bpo-40838.k3NVCf.rst b/Misc/NEWS.d/next/Documentation/2022-01-13-16-03-15.bpo-40838.k3NVCf.rst new file mode 100644 index 0000000000000..0f071ab64dbec --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2022-01-13-16-03-15.bpo-40838.k3NVCf.rst @@ -0,0 +1,2 @@ +Document that :func:`inspect.getdoc`, :func:`inspect.getmodule`, and +:func:`inspect.getsourcefile` might return ``None``. From webhook-mailer at python.org Wed May 18 00:17:33 2022 From: webhook-mailer at python.org (methane) Date: Wed, 18 May 2022 04:17:33 -0000 Subject: [Python-checkins] bpo-39829: Fix `__len__()` is called twice in list() constructor (GH-31816) Message-ID: https://github.com/python/cpython/commit/009aeb6bb689aadf954d8bebaba4c78acd571cbe commit: 009aeb6bb689aadf954d8bebaba4c78acd571cbe branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: methane date: 2022-05-18T13:16:58+09:00 summary: bpo-39829: Fix `__len__()` is called twice in list() constructor (GH-31816) (cherry picked from commit 2153daf0a02a598ed5df93f2f224c1ab2a2cca0d) This patch fixes gh-87740 too. Co-authored-by: Crowthebird <78076854+thatbirdguythatuknownot at users.noreply.github.com> files: A Misc/NEWS.d/next/Core and Builtins/2022-03-11-09-39-01.bpo-39829.mlW3Su.rst M Misc/ACKS M Objects/listobject.c diff --git a/Misc/ACKS b/Misc/ACKS index 889bf8aeaea1a..b83f99956de0b 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1332,6 +1332,7 @@ William Park Claude Paroz Heikki Partanen Harri Pasanen +Jeremiah Gabriel Pascual Ga?l Pasgrimaud Feanil Patel Ashish Nitin Patil diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-03-11-09-39-01.bpo-39829.mlW3Su.rst b/Misc/NEWS.d/next/Core and Builtins/2022-03-11-09-39-01.bpo-39829.mlW3Su.rst new file mode 100644 index 0000000000000..1f3d945188a32 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-03-11-09-39-01.bpo-39829.mlW3Su.rst @@ -0,0 +1 @@ +Removed the ``__len__()`` call when initializing a list and moved initializing to ``list_extend``. Patch by Jeremiah Pascual. diff --git a/Objects/listobject.c b/Objects/listobject.c index d3bc5766df7a0..7f37b7386051d 100644 --- a/Objects/listobject.c +++ b/Objects/listobject.c @@ -863,7 +863,6 @@ list_extend(PyListObject *self, PyObject *iterable) PyObject *it; /* iter(v) */ Py_ssize_t m; /* size of self */ Py_ssize_t n; /* guess for size of iterable */ - Py_ssize_t mn; /* m + n */ Py_ssize_t i; PyObject *(*iternext)(PyObject *); @@ -887,7 +886,13 @@ list_extend(PyListObject *self, PyObject *iterable) /* It should not be possible to allocate a list large enough to cause an overflow on any relevant platform */ assert(m < PY_SSIZE_T_MAX - n); - if (list_resize(self, m + n) < 0) { + if (self->ob_item == NULL) { + if (list_preallocate_exact(self, n) < 0) { + return NULL; + } + Py_SET_SIZE(self, n); + } + else if (list_resize(self, m + n) < 0) { Py_DECREF(iterable); return NULL; } @@ -926,10 +931,13 @@ list_extend(PyListObject *self, PyObject *iterable) * eventually run out of memory during the loop. */ } + else if (self->ob_item == NULL) { + if (n && list_preallocate_exact(self, n) < 0) + goto error; + } else { - mn = m + n; /* Make room. */ - if (list_resize(self, mn) < 0) + if (list_resize(self, m + n) < 0) goto error; /* Make the list sane again. */ Py_SET_SIZE(self, m); @@ -2717,19 +2725,6 @@ list___init___impl(PyListObject *self, PyObject *iterable) (void)_list_clear(self); } if (iterable != NULL) { - if (_PyObject_HasLen(iterable)) { - Py_ssize_t iter_len = PyObject_Size(iterable); - if (iter_len == -1) { - if (!PyErr_ExceptionMatches(PyExc_TypeError)) { - return -1; - } - PyErr_Clear(); - } - if (iter_len > 0 && self->ob_item == NULL - && list_preallocate_exact(self, iter_len)) { - return -1; - } - } PyObject *rv = list_extend(self, iterable); if (rv == NULL) return -1; From webhook-mailer at python.org Wed May 18 04:42:36 2022 From: webhook-mailer at python.org (erlend-aasland) Date: Wed, 18 May 2022 08:42:36 -0000 Subject: [Python-checkins] gh-91755: Document Py_IncRef and Py_DecRef as C functions (#91805) Message-ID: https://github.com/python/cpython/commit/58a3d28039863b014f57a1ac93b51e20920ebe7b commit: 58a3d28039863b014f57a1ac93b51e20920ebe7b branch: main author: Charlie Zhao committer: erlend-aasland date: 2022-05-18T10:42:05+02:00 summary: gh-91755: Document Py_IncRef and Py_DecRef as C functions (#91805) Co-authored-by: Erlend Egeberg Aasland Co-authored-by: Jelle Zijlstra files: M Doc/c-api/refcounting.rst diff --git a/Doc/c-api/refcounting.rst b/Doc/c-api/refcounting.rst index 391907c8c2976..738bd77e9ce42 100644 --- a/Doc/c-api/refcounting.rst +++ b/Doc/c-api/refcounting.rst @@ -109,11 +109,17 @@ objects. It is a good idea to use this macro whenever decrementing the reference count of an object that might be traversed during garbage collection. +.. c:function:: void Py_IncRef(PyObject *o) + + Increment the reference count for object *o*. A function version of :c:func:`Py_XINCREF`. + It can be used for runtime dynamic embedding of Python. + + +.. c:function:: void Py_DecRef(PyObject *o) + + Decrement the reference count for object *o*. A function version of :c:func:`Py_XDECREF`. + It can be used for runtime dynamic embedding of Python. -The following functions are for runtime dynamic embedding of Python: -``Py_IncRef(PyObject *o)``, ``Py_DecRef(PyObject *o)``. They are -simply exported function versions of :c:func:`Py_XINCREF` and -:c:func:`Py_XDECREF`, respectively. The following functions or macros are only for use within the interpreter core: :c:func:`_Py_Dealloc`, :c:func:`_Py_ForgetReference`, :c:func:`_Py_NewReference`, From webhook-mailer at python.org Wed May 18 05:00:15 2022 From: webhook-mailer at python.org (miss-islington) Date: Wed, 18 May 2022 09:00:15 -0000 Subject: [Python-checkins] gh-91755: Document Py_IncRef and Py_DecRef as C functions (GH-91805) Message-ID: https://github.com/python/cpython/commit/1815d8e64fd0bf9fc5fadc2af928a60e380a5c06 commit: 1815d8e64fd0bf9fc5fadc2af928a60e380a5c06 branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-18T02:00:00-07:00 summary: gh-91755: Document Py_IncRef and Py_DecRef as C functions (GH-91805) Co-authored-by: Erlend Egeberg Aasland Co-authored-by: Jelle Zijlstra (cherry picked from commit 58a3d28039863b014f57a1ac93b51e20920ebe7b) Co-authored-by: Charlie Zhao files: M Doc/c-api/refcounting.rst diff --git a/Doc/c-api/refcounting.rst b/Doc/c-api/refcounting.rst index 391907c8c2976..738bd77e9ce42 100644 --- a/Doc/c-api/refcounting.rst +++ b/Doc/c-api/refcounting.rst @@ -109,11 +109,17 @@ objects. It is a good idea to use this macro whenever decrementing the reference count of an object that might be traversed during garbage collection. +.. c:function:: void Py_IncRef(PyObject *o) + + Increment the reference count for object *o*. A function version of :c:func:`Py_XINCREF`. + It can be used for runtime dynamic embedding of Python. + + +.. c:function:: void Py_DecRef(PyObject *o) + + Decrement the reference count for object *o*. A function version of :c:func:`Py_XDECREF`. + It can be used for runtime dynamic embedding of Python. -The following functions are for runtime dynamic embedding of Python: -``Py_IncRef(PyObject *o)``, ``Py_DecRef(PyObject *o)``. They are -simply exported function versions of :c:func:`Py_XINCREF` and -:c:func:`Py_XDECREF`, respectively. The following functions or macros are only for use within the interpreter core: :c:func:`_Py_Dealloc`, :c:func:`_Py_ForgetReference`, :c:func:`_Py_NewReference`, From webhook-mailer at python.org Wed May 18 05:00:27 2022 From: webhook-mailer at python.org (miss-islington) Date: Wed, 18 May 2022 09:00:27 -0000 Subject: [Python-checkins] gh-91755: Document Py_IncRef and Py_DecRef as C functions (GH-91805) Message-ID: https://github.com/python/cpython/commit/fad72d0e36caa823f128d441656cc907bb663b5b commit: fad72d0e36caa823f128d441656cc907bb663b5b branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-18T02:00:22-07:00 summary: gh-91755: Document Py_IncRef and Py_DecRef as C functions (GH-91805) Co-authored-by: Erlend Egeberg Aasland Co-authored-by: Jelle Zijlstra (cherry picked from commit 58a3d28039863b014f57a1ac93b51e20920ebe7b) Co-authored-by: Charlie Zhao files: M Doc/c-api/refcounting.rst diff --git a/Doc/c-api/refcounting.rst b/Doc/c-api/refcounting.rst index 391907c8c2976..738bd77e9ce42 100644 --- a/Doc/c-api/refcounting.rst +++ b/Doc/c-api/refcounting.rst @@ -109,11 +109,17 @@ objects. It is a good idea to use this macro whenever decrementing the reference count of an object that might be traversed during garbage collection. +.. c:function:: void Py_IncRef(PyObject *o) + + Increment the reference count for object *o*. A function version of :c:func:`Py_XINCREF`. + It can be used for runtime dynamic embedding of Python. + + +.. c:function:: void Py_DecRef(PyObject *o) + + Decrement the reference count for object *o*. A function version of :c:func:`Py_XDECREF`. + It can be used for runtime dynamic embedding of Python. -The following functions are for runtime dynamic embedding of Python: -``Py_IncRef(PyObject *o)``, ``Py_DecRef(PyObject *o)``. They are -simply exported function versions of :c:func:`Py_XINCREF` and -:c:func:`Py_XDECREF`, respectively. The following functions or macros are only for use within the interpreter core: :c:func:`_Py_Dealloc`, :c:func:`_Py_ForgetReference`, :c:func:`_Py_NewReference`, From webhook-mailer at python.org Wed May 18 07:44:26 2022 From: webhook-mailer at python.org (erlend-aasland) Date: Wed, 18 May 2022 11:44:26 -0000 Subject: [Python-checkins] gh-92780: Improve sqlite3.Connection.create_collation docs (#92790) Message-ID: https://github.com/python/cpython/commit/7ee19e27150a72eec9e6a076792e3c3ae8bcffbd commit: 7ee19e27150a72eec9e6a076792e3c3ae8bcffbd branch: main author: Erlend Egeberg Aasland committer: erlend-aasland date: 2022-05-18T13:44:16+02:00 summary: gh-92780: Improve sqlite3.Connection.create_collation docs (#92790) Co-authored-by: Alex Waygood files: M Doc/library/sqlite3.rst diff --git a/Doc/library/sqlite3.rst b/Doc/library/sqlite3.rst index 69e77e922a9ab..1843e22640f01 100644 --- a/Doc/library/sqlite3.rst +++ b/Doc/library/sqlite3.rst @@ -518,22 +518,19 @@ Connection Objects .. method:: create_collation(name, callable) - Creates a collation with the specified *name* and *callable*. The callable will - be passed two string arguments. It should return -1 if the first is ordered - lower than the second, 0 if they are ordered equal and 1 if the first is ordered - higher than the second. Note that this controls sorting (ORDER BY in SQL) so - your comparisons don't affect other SQL operations. + Create a collation named *name* using the collating function *callable*. + *callable* is passed two :class:`string ` arguments, + and it should return an :class:`integer `: - Note that the callable will get its parameters as Python bytestrings, which will - normally be encoded in UTF-8. + * ``1`` if the first is ordered higher than the second + * ``-1`` if the first is ordered lower than the second + * ``0`` if they are ordered equal - The following example shows a custom collation that sorts "the wrong way": + The following example shows a reverse sorting collation: .. literalinclude:: ../includes/sqlite3/collation_reverse.py - To remove a collation, call ``create_collation`` with ``None`` as callable:: - - con.create_collation("reverse", None) + Remove a collation function by setting *callable* to :const:`None`. .. versionchanged:: 3.11 The collation name can contain any Unicode character. Earlier, only From webhook-mailer at python.org Wed May 18 07:59:06 2022 From: webhook-mailer at python.org (miss-islington) Date: Wed, 18 May 2022 11:59:06 -0000 Subject: [Python-checkins] gh-92780: Improve sqlite3.Connection.create_collation docs (GH-92790) Message-ID: https://github.com/python/cpython/commit/65ebd923b3326c21526065af74e440c267573e67 commit: 65ebd923b3326c21526065af74e440c267573e67 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-18T04:58:57-07:00 summary: gh-92780: Improve sqlite3.Connection.create_collation docs (GH-92790) Co-authored-by: Alex Waygood (cherry picked from commit 7ee19e27150a72eec9e6a076792e3c3ae8bcffbd) Co-authored-by: Erlend Egeberg Aasland files: M Doc/library/sqlite3.rst diff --git a/Doc/library/sqlite3.rst b/Doc/library/sqlite3.rst index 69e77e922a9ab..1843e22640f01 100644 --- a/Doc/library/sqlite3.rst +++ b/Doc/library/sqlite3.rst @@ -518,22 +518,19 @@ Connection Objects .. method:: create_collation(name, callable) - Creates a collation with the specified *name* and *callable*. The callable will - be passed two string arguments. It should return -1 if the first is ordered - lower than the second, 0 if they are ordered equal and 1 if the first is ordered - higher than the second. Note that this controls sorting (ORDER BY in SQL) so - your comparisons don't affect other SQL operations. + Create a collation named *name* using the collating function *callable*. + *callable* is passed two :class:`string ` arguments, + and it should return an :class:`integer `: - Note that the callable will get its parameters as Python bytestrings, which will - normally be encoded in UTF-8. + * ``1`` if the first is ordered higher than the second + * ``-1`` if the first is ordered lower than the second + * ``0`` if they are ordered equal - The following example shows a custom collation that sorts "the wrong way": + The following example shows a reverse sorting collation: .. literalinclude:: ../includes/sqlite3/collation_reverse.py - To remove a collation, call ``create_collation`` with ``None`` as callable:: - - con.create_collation("reverse", None) + Remove a collation function by setting *callable* to :const:`None`. .. versionchanged:: 3.11 The collation name can contain any Unicode character. Earlier, only From webhook-mailer at python.org Wed May 18 08:05:28 2022 From: webhook-mailer at python.org (miss-islington) Date: Wed, 18 May 2022 12:05:28 -0000 Subject: [Python-checkins] gh-92780: Improve sqlite3.Connection.create_collation docs (GH-92790) Message-ID: https://github.com/python/cpython/commit/94e21cf2299c7a2b6fdb4ddc6f1f2a879a83d21f commit: 94e21cf2299c7a2b6fdb4ddc6f1f2a879a83d21f branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-18T05:05:24-07:00 summary: gh-92780: Improve sqlite3.Connection.create_collation docs (GH-92790) Co-authored-by: Alex Waygood (cherry picked from commit 7ee19e27150a72eec9e6a076792e3c3ae8bcffbd) Co-authored-by: Erlend Egeberg Aasland files: M Doc/library/sqlite3.rst diff --git a/Doc/library/sqlite3.rst b/Doc/library/sqlite3.rst index 3fac2db174c33..a430144bd5e75 100644 --- a/Doc/library/sqlite3.rst +++ b/Doc/library/sqlite3.rst @@ -436,22 +436,19 @@ Connection Objects .. method:: create_collation(name, callable) - Creates a collation with the specified *name* and *callable*. The callable will - be passed two string arguments. It should return -1 if the first is ordered - lower than the second, 0 if they are ordered equal and 1 if the first is ordered - higher than the second. Note that this controls sorting (ORDER BY in SQL) so - your comparisons don't affect other SQL operations. + Create a collation named *name* using the collating function *callable*. + *callable* is passed two :class:`string ` arguments, + and it should return an :class:`integer `: - Note that the callable will get its parameters as Python bytestrings, which will - normally be encoded in UTF-8. + * ``1`` if the first is ordered higher than the second + * ``-1`` if the first is ordered lower than the second + * ``0`` if they are ordered equal - The following example shows a custom collation that sorts "the wrong way": + The following example shows a reverse sorting collation: .. literalinclude:: ../includes/sqlite3/collation_reverse.py - To remove a collation, call ``create_collation`` with ``None`` as callable:: - - con.create_collation("reverse", None) + Remove a collation function by setting *callable* to :const:`None`. .. method:: interrupt() From webhook-mailer at python.org Wed May 18 08:09:52 2022 From: webhook-mailer at python.org (vstinner) Date: Wed, 18 May 2022 12:09:52 -0000 Subject: [Python-checkins] gh-91755: Remove doc of C API private refcount functions (#92918) Message-ID: https://github.com/python/cpython/commit/e0477ae371d983bec07b3dc75e6426785592f2d4 commit: e0477ae371d983bec07b3dc75e6426785592f2d4 branch: main author: Victor Stinner committer: vstinner date: 2022-05-18T14:09:44+02:00 summary: gh-91755: Remove doc of C API private refcount functions (#92918) These functions should only be used by Python internals. files: M Doc/c-api/refcounting.rst diff --git a/Doc/c-api/refcounting.rst b/Doc/c-api/refcounting.rst index 738bd77e9ce42..1cff4e7215cf4 100644 --- a/Doc/c-api/refcounting.rst +++ b/Doc/c-api/refcounting.rst @@ -119,9 +119,3 @@ objects. Decrement the reference count for object *o*. A function version of :c:func:`Py_XDECREF`. It can be used for runtime dynamic embedding of Python. - - -The following functions or macros are only for use within the interpreter core: -:c:func:`_Py_Dealloc`, :c:func:`_Py_ForgetReference`, :c:func:`_Py_NewReference`, -as well as the global variable :c:data:`_Py_RefTotal`. - From webhook-mailer at python.org Wed May 18 08:49:49 2022 From: webhook-mailer at python.org (miss-islington) Date: Wed, 18 May 2022 12:49:49 -0000 Subject: [Python-checkins] bpo-40838: document `getdoc`, `getmodule`, `getsourcefile` in `inspect` returns `None` (GH-30575) Message-ID: https://github.com/python/cpython/commit/ed75d2183f9084583e2ebe9229c52711d4a62f1e commit: ed75d2183f9084583e2ebe9229c52711d4a62f1e branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-18T05:49:15-07:00 summary: bpo-40838: document `getdoc`, `getmodule`, `getsourcefile` in `inspect` returns `None` (GH-30575) Co-authored-by: Alex Waygood Co-authored-by: Jelle Zijlstra (cherry picked from commit b86d783a4eff96306f315acf9a6f1aca85d47fc3) Co-authored-by: Nikita Sobolev files: A Misc/NEWS.d/next/Documentation/2022-01-13-16-03-15.bpo-40838.k3NVCf.rst M Doc/library/inspect.rst diff --git a/Doc/library/inspect.rst b/Doc/library/inspect.rst index d7ef2adf7281b..44553afc33b75 100644 --- a/Doc/library/inspect.rst +++ b/Doc/library/inspect.rst @@ -482,6 +482,7 @@ Retrieving source code If the documentation string for an object is not provided and the object is a class, a method, a property or a descriptor, retrieve the documentation string from the inheritance hierarchy. + Return ``None`` if the documentation string is invalid or missing. .. versionchanged:: 3.5 Documentation strings are now inherited if not overridden. @@ -505,12 +506,14 @@ Retrieving source code .. function:: getmodule(object) - Try to guess which module an object was defined in. + Try to guess which module an object was defined in. Return ``None`` + if the module cannot be determined. .. function:: getsourcefile(object) - Return the name of the Python source file in which an object was defined. This + Return the name of the Python source file in which an object was defined + or ``None`` if no way can be identified to get the source. This will fail with a :exc:`TypeError` if the object is a built-in module, class, or function. diff --git a/Misc/NEWS.d/next/Documentation/2022-01-13-16-03-15.bpo-40838.k3NVCf.rst b/Misc/NEWS.d/next/Documentation/2022-01-13-16-03-15.bpo-40838.k3NVCf.rst new file mode 100644 index 0000000000000..0f071ab64dbec --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2022-01-13-16-03-15.bpo-40838.k3NVCf.rst @@ -0,0 +1,2 @@ +Document that :func:`inspect.getdoc`, :func:`inspect.getmodule`, and +:func:`inspect.getsourcefile` might return ``None``. From webhook-mailer at python.org Wed May 18 09:10:19 2022 From: webhook-mailer at python.org (erlend-aasland) Date: Wed, 18 May 2022 13:10:19 -0000 Subject: [Python-checkins] bpo-42047: Add native thread ID for DragonFlyBSD (#22714) Message-ID: https://github.com/python/cpython/commit/9a1adf2790c156318158606ad83df9ce494f326a commit: 9a1adf2790c156318158606ad83df9ce494f326a branch: main author: David CARLIER committer: erlend-aasland date: 2022-05-18T15:10:10+02:00 summary: bpo-42047: Add native thread ID for DragonFlyBSD (#22714) Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com> Co-authored-by: kj <28750310+Fidget-Spinner at users.noreply.github.com> Co-authored-by: Erlend Egeberg Aasland Co-authored-by: Victor Stinner files: A Misc/NEWS.d/next/Library/2020-10-15-18-37-12.bpo-42047.XDdoSF.rst M Doc/library/_thread.rst M Doc/library/threading.rst M Include/pythread.h M Python/thread_pthread.h diff --git a/Doc/library/_thread.rst b/Doc/library/_thread.rst index 1e6452b7b826f..75b3834b9a339 100644 --- a/Doc/library/_thread.rst +++ b/Doc/library/_thread.rst @@ -118,7 +118,7 @@ This module defines the following constants and functions: Its value may be used to uniquely identify this particular thread system-wide (until the thread terminates, after which the value may be recycled by the OS). - .. availability:: Windows, FreeBSD, Linux, macOS, OpenBSD, NetBSD, AIX. + .. availability:: Windows, FreeBSD, Linux, macOS, OpenBSD, NetBSD, AIX, DragonFlyBSD. .. versionadded:: 3.8 diff --git a/Doc/library/threading.rst b/Doc/library/threading.rst index b777560961690..0bc1f9d12a86e 100644 --- a/Doc/library/threading.rst +++ b/Doc/library/threading.rst @@ -114,7 +114,7 @@ This module defines the following functions: Its value may be used to uniquely identify this particular thread system-wide (until the thread terminates, after which the value may be recycled by the OS). - .. availability:: Windows, FreeBSD, Linux, macOS, OpenBSD, NetBSD, AIX. + .. availability:: Windows, FreeBSD, Linux, macOS, OpenBSD, NetBSD, AIX, DragonFlyBSD. .. versionadded:: 3.8 diff --git a/Include/pythread.h b/Include/pythread.h index a48329085fac5..63714437c496b 100644 --- a/Include/pythread.h +++ b/Include/pythread.h @@ -20,7 +20,9 @@ PyAPI_FUNC(unsigned long) PyThread_start_new_thread(void (*)(void *), void *); PyAPI_FUNC(void) _Py_NO_RETURN PyThread_exit_thread(void); PyAPI_FUNC(unsigned long) PyThread_get_thread_ident(void); -#if defined(__APPLE__) || defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(_WIN32) || defined(_AIX) +#if (defined(__APPLE__) || defined(__linux__) || defined(_WIN32) \ + || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) \ + || defined(__DragonFly__) || defined(_AIX)) #define PY_HAVE_THREAD_NATIVE_ID PyAPI_FUNC(unsigned long) PyThread_get_thread_native_id(void); #endif diff --git a/Misc/NEWS.d/next/Library/2020-10-15-18-37-12.bpo-42047.XDdoSF.rst b/Misc/NEWS.d/next/Library/2020-10-15-18-37-12.bpo-42047.XDdoSF.rst new file mode 100644 index 0000000000000..4c23763cf8d89 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-10-15-18-37-12.bpo-42047.XDdoSF.rst @@ -0,0 +1 @@ +Add :func:`threading.get_native_id` support for DragonFly BSD. Patch by David Carlier. diff --git a/Python/thread_pthread.h b/Python/thread_pthread.h index 2237018e9cbc2..1b2c28d0f3992 100644 --- a/Python/thread_pthread.h +++ b/Python/thread_pthread.h @@ -23,6 +23,8 @@ # include /* thread_self() */ #elif defined(__NetBSD__) # include /* _lwp_self() */ +#elif defined(__DragonFly__) +# include /* lwp_gettid() */ #endif /* The POSIX spec requires that use of pthread_attr_setstacksize @@ -349,6 +351,9 @@ PyThread_get_thread_native_id(void) #elif defined(__NetBSD__) lwpid_t native_id; native_id = _lwp_self(); +#elif defined(__DragonFly__) + lwpid_t native_id; + native_id = lwp_gettid(); #endif return (unsigned long) native_id; } From webhook-mailer at python.org Wed May 18 09:26:41 2022 From: webhook-mailer at python.org (zooba) Date: Wed, 18 May 2022 13:26:41 -0000 Subject: [Python-checkins] Remove Windows release build script (GH-92908) Message-ID: https://github.com/python/cpython/commit/3fa023721b495e02e1e6c89fdc737afc7d186cb5 commit: 3fa023721b495e02e1e6c89fdc737afc7d186cb5 branch: main author: Steve Dower committer: zooba date: 2022-05-18T14:26:36+01:00 summary: Remove Windows release build script (GH-92908) The scripts have been migrated to the release-tools repository files: D .azure-pipelines/windows-release.yml D .azure-pipelines/windows-release/build-steps.yml D .azure-pipelines/windows-release/checkout.yml D .azure-pipelines/windows-release/find-sdk.yml D .azure-pipelines/windows-release/layout-command.yml D .azure-pipelines/windows-release/mingw-lib.yml D .azure-pipelines/windows-release/msi-steps.yml D .azure-pipelines/windows-release/stage-build.yml D .azure-pipelines/windows-release/stage-layout-embed.yml D .azure-pipelines/windows-release/stage-layout-full.yml D .azure-pipelines/windows-release/stage-layout-msix.yml D .azure-pipelines/windows-release/stage-layout-nuget.yml D .azure-pipelines/windows-release/stage-msi.yml D .azure-pipelines/windows-release/stage-pack-msix.yml D .azure-pipelines/windows-release/stage-pack-nuget.yml D .azure-pipelines/windows-release/stage-publish-nugetorg.yml D .azure-pipelines/windows-release/stage-publish-pythonorg.yml D .azure-pipelines/windows-release/stage-publish-store.yml D .azure-pipelines/windows-release/stage-sign.yml D .azure-pipelines/windows-release/stage-test-embed.yml D .azure-pipelines/windows-release/stage-test-msi.yml D .azure-pipelines/windows-release/stage-test-nuget.yml diff --git a/.azure-pipelines/windows-release.yml b/.azure-pipelines/windows-release.yml deleted file mode 100644 index 581f48ba22882..0000000000000 --- a/.azure-pipelines/windows-release.yml +++ /dev/null @@ -1,220 +0,0 @@ -name: Release_$(Build.SourceBranchName)_$(SourceTag)_$(Date:yyyyMMdd)$(Rev:.rr) - -parameters: -- name: GitRemote - displayName: "Git remote" - type: string - default: python - values: - - 'python' - - 'pablogsal' - - 'ambv' - - '(Other)' -- name: GitRemote_Other - displayName: "If Other, specify Git remote" - type: string - default: 'python' -- name: SourceTag - displayName: "Git tag" - type: string - default: main -- name: DoPublish - displayName: "Publish release" - type: boolean - default: false -- name: SigningCertificate - displayName: "Code signing certificate" - type: string - default: 'Python Software Foundation' - values: - - 'Python Software Foundation' - - 'TestSign' - - 'Unsigned' -- name: SigningDescription - displayName: "Signature description" - type: string - default: 'Built: $(Build.BuildNumber)' -- name: DoARM64 - displayName: "Publish ARM64 build" - type: boolean - default: true -# Because there is no ARM64 Tcl/Tk pre-3.11, we need a separate option -# to keep those builds working when the files are going to be absent. -# Eventually when we stop releasing anything that old, we can drop this -# argument (and make it implicitly always 'true') -- name: ARM64TclTk - displayName: "Use Tcl/Tk for ARM64 (3.11 and later)" - type: boolean - default: true -- name: DoPGO - displayName: "Run PGO" - type: boolean - default: true -- name: DoCHM - displayName: "Produce compiled help document (pre-3.11)" - type: boolean - default: false -- name: DoLayout - displayName: "Produce full layout artifact" - type: boolean - default: true -- name: DoMSIX - displayName: "Produce Store packages" - type: boolean - default: true -- name: DoNuget - displayName: "Produce Nuget packages" - type: boolean - default: true -- name: DoEmbed - displayName: "Produce embeddable package" - type: boolean - default: true -- name: DoMSI - displayName: "Produce EXE/MSI installer" - type: boolean - default: true -- name: BuildToPublish - displayName: "Build number to publish (0 to skip)" - type: number - default: '0' - -variables: - __RealSigningCertificate: 'Python Software Foundation' - ${{ if ne(parameters.GitRemote, '(Other)') }}: - GitRemote: ${{ parameters.GitRemote }} - ${{ else }}: - GitRemote: ${{ parameters.GitRemote_Other }} - SourceTag: ${{ parameters.SourceTag }} - DoPGO: ${{ parameters.DoPGO }} - ${{ if ne(parameters.SigningCertificate, 'Unsigned') }}: - SigningCertificate: ${{ parameters.SigningCertificate }} - SigningDescription: ${{ parameters.SigningDescription }} - DoCHM: ${{ parameters.DoCHM }} - DoLayout: ${{ parameters.DoLayout }} - DoMSIX: ${{ parameters.DoMSIX }} - DoNuget: ${{ parameters.DoNuget }} - DoEmbed: ${{ parameters.DoEmbed }} - DoMSI: ${{ parameters.DoMSI }} - DoPublish: ${{ parameters.DoPublish }} - PublishARM64: ${{ parameters.DoARM64 }} -# QUEUE TIME VARIABLES -# PyDotOrgUsername: '' -# PyDotOrgServer: '' - -trigger: none -pr: none - -stages: -- ${{ if eq(parameters.BuildToPublish, '0') }}: - - stage: Build - displayName: Build binaries - jobs: - - template: windows-release/stage-build.yml - parameters: - ARM64TclTk: ${{ parameters.ARM64TclTk }} - - - stage: Sign - displayName: Sign binaries - dependsOn: Build - jobs: - - template: windows-release/stage-sign.yml - - - stage: Layout - displayName: Generate layouts - dependsOn: Sign - jobs: - - template: windows-release/stage-layout-full.yml - parameters: - ARM64TclTk: ${{ parameters.ARM64TclTk }} - - template: windows-release/stage-layout-embed.yml - - template: windows-release/stage-layout-nuget.yml - - - stage: Pack - dependsOn: Layout - jobs: - - template: windows-release/stage-pack-nuget.yml - - - stage: Test - dependsOn: Pack - jobs: - - template: windows-release/stage-test-embed.yml - - template: windows-release/stage-test-nuget.yml - - - ${{ if eq(parameters.DoMSIX, 'true') }}: - - stage: Layout_MSIX - displayName: Generate MSIX layouts - dependsOn: Sign - jobs: - - template: windows-release/stage-layout-msix.yml - parameters: - ARM64TclTk: ${{ parameters.ARM64TclTk }} - - - stage: Pack_MSIX - displayName: Package MSIX - dependsOn: Layout_MSIX - jobs: - - template: windows-release/stage-pack-msix.yml - - - ${{ if eq(parameters.DoMSI, 'true') }}: - - stage: Build_MSI - displayName: Build MSI installer - dependsOn: Sign - jobs: - - template: windows-release/stage-msi.yml - parameters: - ARM64TclTk: ${{ parameters.ARM64TclTk }} - - - stage: Test_MSI - displayName: Test MSI installer - dependsOn: Build_MSI - jobs: - - template: windows-release/stage-test-msi.yml - - - ${{ if eq(parameters.DoPublish, 'true') }}: - - ${{ if eq(parameters.DoMSI, 'true') }}: - - stage: PublishPyDotOrg - displayName: Publish to python.org - dependsOn: ['Test_MSI', 'Test'] - jobs: - - template: windows-release/stage-publish-pythonorg.yml - - - ${{ if eq(parameters.DoNuget, 'true') }}: - - stage: PublishNuget - displayName: Publish to nuget.org - ${{ if eq(parameters.DoMSI, 'true') }}: - dependsOn: ['Test_MSI', 'Test'] - ${{ else }}: - dependsOn: 'Test' - jobs: - - template: windows-release/stage-publish-nugetorg.yml - - - ${{ if eq(parameters.DoMSIX, 'true') }}: - - stage: PublishStore - displayName: Publish to Store - ${{ if eq(parameters.DoMSI, 'true') }}: - dependsOn: ['Test_MSI', 'Pack_MSIX'] - ${{ else }}: - dependsOn: 'Pack_MSIX' - jobs: - - template: windows-release/stage-publish-store.yml - -- ${{ else }}: - - stage: PublishExisting - displayName: Publish existing build - dependsOn: [] - jobs: - - ${{ if eq(parameters.DoMSI, 'true') }}: - - template: windows-release/stage-publish-pythonorg.yml - parameters: - BuildToPublish: ${{ parameters.BuildToPublish }} - - - ${{ if eq(parameters.DoNuget, 'true') }}: - - template: windows-release/stage-publish-nugetorg.yml - parameters: - BuildToPublish: ${{ parameters.BuildToPublish }} - - - ${{ if eq(parameters.DoMSIX, 'true') }}: - - template: windows-release/stage-publish-store.yml - parameters: - BuildToPublish: ${{ parameters.BuildToPublish }} diff --git a/.azure-pipelines/windows-release/build-steps.yml b/.azure-pipelines/windows-release/build-steps.yml deleted file mode 100644 index 5ca2016d65f9e..0000000000000 --- a/.azure-pipelines/windows-release/build-steps.yml +++ /dev/null @@ -1,84 +0,0 @@ -parameters: - ShouldPGO: false - -steps: -- template: ./checkout.yml - -- powershell: | - $d = (.\PCbuild\build.bat -V) | %{ if($_ -match '\s+(\w+):\s*(.+)\s*$') { @{$Matches[1] = $Matches[2];} }}; - Write-Host "##vso[task.setvariable variable=VersionText]$($d.PythonVersion)" - Write-Host "##vso[task.setvariable variable=VersionNumber]$($d.PythonVersionNumber)" - Write-Host "##vso[task.setvariable variable=VersionHex]$($d.PythonVersionHex)" - Write-Host "##vso[task.setvariable variable=VersionUnique]$($d.PythonVersionUnique)" - Write-Host "##vso[build.addbuildtag]$($d.PythonVersion)" - Write-Host "##vso[build.addbuildtag]$($d.PythonVersion)-$(Name)" - displayName: 'Extract version numbers' - -- ${{ if eq(parameters.ShouldPGO, 'false') }}: - - powershell: | - $env:SigningCertificate = $null - .\PCbuild\build.bat -v -p $(Platform) -c $(Configuration) - displayName: 'Run build' - env: - IncludeUwp: true - Py_OutDir: '$(Build.BinariesDirectory)\bin' - -- ${{ if eq(parameters.ShouldPGO, 'true') }}: - - powershell: | - $env:SigningCertificate = $null - .\PCbuild\build.bat -v -p $(Platform) --pgo - displayName: 'Run build with PGO' - env: - IncludeUwp: true - Py_OutDir: '$(Build.BinariesDirectory)\bin' - -- powershell: | - $kitroot = (gp 'HKLM:\SOFTWARE\Microsoft\Windows Kits\Installed Roots\').KitsRoot10 - $tool = (gci -r "$kitroot\Bin\*\x64\signtool.exe" | sort FullName -Desc | select -First 1) - if (-not $tool) { - throw "SDK is not available" - } - Write-Host "##vso[task.prependpath]$($tool.Directory)" - displayName: 'Add WinSDK tools to path' - -- powershell: | - $env:SigningCertificate = $null - $(_HostPython) PC\layout -vv -b "$(Build.BinariesDirectory)\bin" -t "$(Build.BinariesDirectory)\catalog" --catalog "${env:CAT}.cdf" --preset-default --arch $(Arch) - makecat "${env:CAT}.cdf" - del "${env:CAT}.cdf" - if (-not (Test-Path "${env:CAT}.cat")) { - throw "Failed to build catalog file" - } - displayName: 'Generate catalog' - env: - CAT: $(Build.BinariesDirectory)\bin\$(Arch)\python - PYTHON_HEXVERSION: $(VersionHex) - -- task: PublishPipelineArtifact at 0 - displayName: 'Publish binaries' - condition: and(succeeded(), not(and(eq(variables['Configuration'], 'Release'), variables['SigningCertificate']))) - inputs: - targetPath: '$(Build.BinariesDirectory)\bin\$(Arch)' - artifactName: bin_$(Name) - -- task: PublishPipelineArtifact at 0 - displayName: 'Publish binaries for signing' - condition: and(succeeded(), and(eq(variables['Configuration'], 'Release'), variables['SigningCertificate'])) - inputs: - targetPath: '$(Build.BinariesDirectory)\bin\$(Arch)' - artifactName: unsigned_bin_$(Name) - -- task: CopyFiles at 2 - displayName: 'Layout Artifact: symbols' - inputs: - sourceFolder: $(Build.BinariesDirectory)\bin\$(Arch) - targetFolder: $(Build.ArtifactStagingDirectory)\symbols\$(Name) - flatten: true - contents: | - **\*.pdb - -- task: PublishBuildArtifacts at 1 - displayName: 'Publish Artifact: symbols' - inputs: - PathToPublish: '$(Build.ArtifactStagingDirectory)\symbols' - ArtifactName: symbols diff --git a/.azure-pipelines/windows-release/checkout.yml b/.azure-pipelines/windows-release/checkout.yml deleted file mode 100644 index d42d55fff08dd..0000000000000 --- a/.azure-pipelines/windows-release/checkout.yml +++ /dev/null @@ -1,21 +0,0 @@ -parameters: - depth: 3 - -steps: -- checkout: none - -- script: git clone --progress -v --depth ${{ parameters.depth }} --branch $(SourceTag) --single-branch https://github.com/$(GitRemote)/cpython.git . - displayName: 'git clone ($(GitRemote)/$(SourceTag))' - condition: and(succeeded(), and(variables['GitRemote'], variables['SourceTag'])) - -- script: git clone --progress -v --depth ${{ parameters.depth }} --branch $(SourceTag) --single-branch $(Build.Repository.Uri) . - displayName: 'git clone (/$(SourceTag))' - condition: and(succeeded(), and(not(variables['GitRemote']), variables['SourceTag'])) - -- script: git clone --progress -v --depth ${{ parameters.depth }} --branch $(Build.SourceBranchName) --single-branch https://github.com/$(GitRemote)/cpython.git . - displayName: 'git clone ($(GitRemote)/)' - condition: and(succeeded(), and(variables['GitRemote'], not(variables['SourceTag']))) - -- script: git clone --progress -v --depth ${{ parameters.depth }} --branch $(Build.SourceBranchName) --single-branch $(Build.Repository.Uri) . - displayName: 'git clone' - condition: and(succeeded(), and(not(variables['GitRemote']), not(variables['SourceTag']))) diff --git a/.azure-pipelines/windows-release/find-sdk.yml b/.azure-pipelines/windows-release/find-sdk.yml deleted file mode 100644 index e4de78555b3f6..0000000000000 --- a/.azure-pipelines/windows-release/find-sdk.yml +++ /dev/null @@ -1,17 +0,0 @@ -# Locate the Windows SDK and add its binaries directory to PATH -# -# `toolname` can be overridden to use a different marker file. - -parameters: - toolname: signtool.exe - -steps: - - powershell: | - $kitroot = (gp 'HKLM:\SOFTWARE\Microsoft\Windows Kits\Installed Roots\').KitsRoot10 - $tool = (gci -r "$kitroot\Bin\*\${{ parameters.toolname }}" | sort FullName -Desc | select -First 1) - if (-not $tool) { - throw "SDK is not available" - } - Write-Host "##vso[task.prependpath]$($tool.Directory)" - Write-Host "Adding $($tool.Directory) to PATH" - displayName: 'Add WinSDK tools to path' diff --git a/.azure-pipelines/windows-release/layout-command.yml b/.azure-pipelines/windows-release/layout-command.yml deleted file mode 100644 index 406ccd859faa6..0000000000000 --- a/.azure-pipelines/windows-release/layout-command.yml +++ /dev/null @@ -1,23 +0,0 @@ -steps: -- task: DownloadPipelineArtifact at 1 - displayName: 'Download artifact: bin_$(HostArch)' - condition: and(succeeded(), variables['HostArch']) - inputs: - artifactName: bin_$(HostArch) - targetPath: $(Build.BinariesDirectory)\bin_$(HostArch) - -- powershell: > - Write-Host ( - '##vso[task.setvariable variable=LayoutCmd]& - "$(Python)" - "{1}\PC\layout" - -vv - --source "{1}" - --build "{0}\bin" - --arch "$(Name)" - --temp "{0}\layout-temp" - --include-cat "{0}\bin\python.cat" - --doc-build "{0}\doc"' - -f ("$(Build.BinariesDirectory)", "$(Build.SourcesDirectory)") - ) - displayName: 'Set LayoutCmd' diff --git a/.azure-pipelines/windows-release/mingw-lib.yml b/.azure-pipelines/windows-release/mingw-lib.yml deleted file mode 100644 index 30f7d34fa61d2..0000000000000 --- a/.azure-pipelines/windows-release/mingw-lib.yml +++ /dev/null @@ -1,13 +0,0 @@ -parameters: - DllToolOpt: -m i386:x86-64 - #DllToolOpt: -m i386 --as-flags=--32 - -steps: -- powershell: | - git clone https://github.com/python/cpython-bin-deps --branch binutils --single-branch --depth 1 --progress -v "binutils" - gci "bin\$(Arch)\python*.dll" | %{ - & "binutils\gendef.exe" $_ | Out-File -Encoding ascii tmp.def - & "binutils\dlltool.exe" --dllname $($_.BaseName).dll --def tmp.def --output-lib "$($_.Directory)\lib$($_.BaseName).a" ${{ parameters.DllToolOpt }} - } - displayName: 'Generate MinGW import library' - workingDirectory: $(Build.BinariesDirectory) diff --git a/.azure-pipelines/windows-release/msi-steps.yml b/.azure-pipelines/windows-release/msi-steps.yml deleted file mode 100644 index 79fc6f5ed292d..0000000000000 --- a/.azure-pipelines/windows-release/msi-steps.yml +++ /dev/null @@ -1,181 +0,0 @@ -parameters: - ARM64TclTk: true - -steps: - - template: ./checkout.yml - - - powershell: | - $d = (.\PCbuild\build.bat -V) | %{ if($_ -match '\s+(\w+):\s*(.+)\s*$') { @{$Matches[1] = $Matches[2];} }}; - Write-Host "##vso[task.setvariable variable=SigningDescription]Python $($d.PythonVersion)" - displayName: 'Update signing description' - condition: and(succeeded(), not(variables['SigningDescription'])) - - - task: DownloadPipelineArtifact at 1 - displayName: 'Download artifact: doc' - inputs: - artifactName: doc - targetPath: $(Build.BinariesDirectory)\doc - - - task: CopyFiles at 2 - displayName: 'Merge documentation files' - inputs: - sourceFolder: $(Build.BinariesDirectory)\doc - targetFolder: $(Build.SourcesDirectory)\Doc\build - - - task: DownloadPipelineArtifact at 1 - displayName: 'Download artifact: bin_win32' - inputs: - artifactName: bin_win32 - targetPath: $(Build.BinariesDirectory)\win32 - - - task: DownloadPipelineArtifact at 1 - displayName: 'Download artifact: bin_win32_d' - inputs: - artifactName: bin_win32_d - targetPath: $(Build.BinariesDirectory)\win32 - - - task: DownloadPipelineArtifact at 1 - displayName: 'Download artifact: bin_amd64' - inputs: - artifactName: bin_amd64 - targetPath: $(Build.BinariesDirectory)\amd64 - - - task: DownloadPipelineArtifact at 1 - displayName: 'Download artifact: bin_amd64_d' - inputs: - artifactName: bin_amd64_d - targetPath: $(Build.BinariesDirectory)\amd64 - - - task: DownloadPipelineArtifact at 1 - displayName: 'Download artifact: bin_arm64' - condition: and(succeeded(), eq(variables['PublishARM64'], 'true')) - inputs: - artifactName: bin_arm64 - targetPath: $(Build.BinariesDirectory)\arm64 - - - task: DownloadPipelineArtifact at 1 - displayName: 'Download artifact: bin_arm64_d' - condition: and(succeeded(), eq(variables['PublishARM64'], 'true')) - inputs: - artifactName: bin_arm64_d - targetPath: $(Build.BinariesDirectory)\arm64 - - - task: DownloadPipelineArtifact at 1 - displayName: 'Download artifact: tcltk_lib_win32' - inputs: - artifactName: tcltk_lib_win32 - targetPath: $(Build.BinariesDirectory)\tcltk_lib_win32 - - - task: DownloadPipelineArtifact at 1 - displayName: 'Download artifact: tcltk_lib_amd64' - inputs: - artifactName: tcltk_lib_amd64 - targetPath: $(Build.BinariesDirectory)\tcltk_lib_amd64 - - - ${{ if eq(parameters.ARM64TclTk, true) }}: - - task: DownloadPipelineArtifact at 1 - displayName: 'Download artifact: tcltk_lib_arm64' - condition: and(succeeded(), eq(variables['PublishARM64'], 'true')) - inputs: - artifactName: tcltk_lib_arm64 - targetPath: $(Build.BinariesDirectory)\tcltk_lib_arm64 - - - powershell: | - copy $(Build.BinariesDirectory)\amd64\Activate.ps1 Lib\venv\scripts\common\Activate.ps1 -Force - displayName: 'Copy signed files into sources' - condition: and(succeeded(), variables['SigningCertificate']) - - - script: | - call Tools\msi\get_externals.bat - call PCbuild\find_python.bat - echo ##vso[task.setvariable variable=PYTHON]%PYTHON% - call PCbuild/find_msbuild.bat - echo ##vso[task.setvariable variable=MSBUILD]%MSBUILD% - displayName: 'Get external dependencies' - - - script: | - %PYTHON% -m pip install blurb - %PYTHON% -m blurb merge -f Misc\NEWS - displayName: 'Merge NEWS file' - - - script: | - %MSBUILD% Tools\msi\launcher\launcher.wixproj - displayName: 'Build launcher installer' - env: - Platform: x86 - Py_OutDir: $(Build.BinariesDirectory) - - - script: | - %MSBUILD% Tools\msi\bundle\releaselocal.wixproj /t:Rebuild /p:RebuildAll=true - displayName: 'Build win32 installer' - env: - Platform: x86 - Py_OutDir: $(Build.BinariesDirectory) - PYTHON: $(Build.BinariesDirectory)\win32\python.exe - PythonForBuild: $(Build.BinariesDirectory)\win32\python.exe - PYTHONHOME: $(Build.SourcesDirectory) - TclTkLibraryDir: $(Build.BinariesDirectory)\tcltk_lib_win32 - BuildForRelease: true - - - script: | - %MSBUILD% Tools\msi\bundle\releaselocal.wixproj /t:Rebuild /p:RebuildAll=true - displayName: 'Build amd64 installer' - env: - Platform: x64 - Py_OutDir: $(Build.BinariesDirectory) - PYTHON: $(Build.BinariesDirectory)\amd64\python.exe - PythonForBuild: $(Build.BinariesDirectory)\amd64\python.exe - PYTHONHOME: $(Build.SourcesDirectory) - TclTkLibraryDir: $(Build.BinariesDirectory)\tcltk_lib_amd64 - BuildForRelease: true - - - script: | - %MSBUILD% Tools\msi\bundle\releaselocal.wixproj /t:Rebuild /p:RebuildAll=true - displayName: 'Build arm64 installer' - condition: and(succeeded(), eq(variables['PublishARM64'], 'true')) - env: - Platform: ARM64 - Py_OutDir: $(Build.BinariesDirectory) - PYTHON: $(Build.BinariesDirectory)\win32\python.exe - PythonForBuild: $(Build.BinariesDirectory)\win32\python.exe - PYTHONHOME: $(Build.SourcesDirectory) - BuildForRelease: true - ${{ if eq(parameters.ARM64TclTk, true) }}: - TclTkLibraryDir: $(Build.BinariesDirectory)\tcltk_lib_arm64 - - - task: CopyFiles at 2 - displayName: 'Assemble artifact: msi (win32)' - inputs: - sourceFolder: $(Build.BinariesDirectory)\win32\en-us - targetFolder: $(Build.ArtifactStagingDirectory)\msi\win32 - contents: | - *.msi - *.cab - *.exe - - - task: CopyFiles at 2 - displayName: 'Assemble artifact: msi (amd64)' - inputs: - sourceFolder: $(Build.BinariesDirectory)\amd64\en-us - targetFolder: $(Build.ArtifactStagingDirectory)\msi\amd64 - contents: | - *.msi - *.cab - *.exe - - - task: CopyFiles at 2 - displayName: 'Assemble artifact: msi (arm64)' - condition: and(succeeded(), eq(variables['PublishARM64'], 'true')) - inputs: - sourceFolder: $(Build.BinariesDirectory)\arm64\en-us - targetFolder: $(Build.ArtifactStagingDirectory)\msi\arm64 - contents: | - *.msi - *.cab - *.exe - - - task: PublishPipelineArtifact at 0 - displayName: 'Publish MSI' - inputs: - targetPath: '$(Build.ArtifactStagingDirectory)\msi' - artifactName: msi diff --git a/.azure-pipelines/windows-release/stage-build.yml b/.azure-pipelines/windows-release/stage-build.yml deleted file mode 100644 index 26f4317750436..0000000000000 --- a/.azure-pipelines/windows-release/stage-build.yml +++ /dev/null @@ -1,193 +0,0 @@ -parameters: - ARM64TclTk: true - -jobs: -- job: Build_Docs - displayName: Docs build - pool: - vmImage: windows-2022 - - workspace: - clean: all - - steps: - - template: ./checkout.yml - - - script: Doc\make.bat html - displayName: 'Build HTML docs' - env: - BUILDDIR: $(Build.BinariesDirectory)\Doc - - - script: Doc\make.bat htmlhelp - displayName: 'Build CHM docs' - condition: and(succeeded(), eq(variables['DoCHM'], 'true')) - env: - BUILDDIR: $(Build.BinariesDirectory)\Doc - - - task: CopyFiles at 2 - displayName: 'Assemble artifact: Doc' - inputs: - sourceFolder: $(Build.BinariesDirectory)\Doc - targetFolder: $(Build.ArtifactStagingDirectory)\Doc - contents: | - html\**\* - htmlhelp\*.chm - - - task: PublishPipelineArtifact at 0 - displayName: 'Publish artifact: doc' - inputs: - targetPath: $(Build.ArtifactStagingDirectory)\Doc - artifactName: doc - - -- job: Build_Python - displayName: Python build - - pool: - vmImage: windows-2022 - - workspace: - clean: all - - strategy: - matrix: - win32: - Name: win32 - Arch: win32 - Platform: x86 - Configuration: Release - _HostPython: .\python - win32_d: - Name: win32_d - Arch: win32 - Platform: x86 - Configuration: Debug - _HostPython: .\python - amd64_d: - Name: amd64_d - Arch: amd64 - Platform: x64 - Configuration: Debug - _HostPython: .\python - arm64: - Name: arm64 - Arch: arm64 - Platform: ARM64 - Configuration: Release - _HostPython: python - arm64_d: - Name: arm64_d - Arch: arm64 - Platform: ARM64 - Configuration: Debug - _HostPython: python - - steps: - - template: ./build-steps.yml - -- job: Build_Python_NonPGO - displayName: Python non-PGO build - condition: and(succeeded(), ne(variables['DoPGO'], 'true')) - - pool: - vmImage: windows-2022 - - workspace: - clean: all - - strategy: - matrix: - amd64: - Name: amd64 - Arch: amd64 - Platform: x64 - Configuration: Release - _HostPython: .\python - - steps: - - template: ./build-steps.yml - - -- job: Build_Python_PGO - displayName: Python PGO build - condition: and(succeeded(), eq(variables['DoPGO'], 'true')) - - # Allow up to five hours for PGO - timeoutInMinutes: 300 - - pool: - name: 'Windows Release' - - workspace: - clean: all - - strategy: - matrix: - amd64: - Name: amd64 - Arch: amd64 - Platform: x64 - Configuration: Release - _HostPython: .\python - - steps: - - template: ./build-steps.yml - parameters: - ShouldPGO: true - - -- job: TclTk_Lib - displayName: Publish Tcl/Tk Library - - pool: - vmImage: windows-2022 - - workspace: - clean: all - - steps: - - template: ./checkout.yml - - - script: PCbuild\get_externals.bat --no-openssl --no-libffi - displayName: 'Get external dependencies' - - - task: MSBuild at 1 - displayName: 'Copy Tcl/Tk lib for publish' - inputs: - solution: PCbuild\tcltk.props - platform: x86 - msbuildArguments: /t:CopyTclTkLib /p:OutDir="$(Build.ArtifactStagingDirectory)\tcl_win32" - - - task: MSBuild at 1 - displayName: 'Copy Tcl/Tk lib for publish' - inputs: - solution: PCbuild\tcltk.props - platform: x64 - msbuildArguments: /t:CopyTclTkLib /p:OutDir="$(Build.ArtifactStagingDirectory)\tcl_amd64" - - - ${{ if eq(parameters.ARM64TclTk, true) }}: - - task: MSBuild at 1 - displayName: 'Copy Tcl/Tk lib for publish' - inputs: - solution: PCbuild\tcltk.props - platform: ARM64 - msbuildArguments: /t:CopyTclTkLib /p:OutDir="$(Build.ArtifactStagingDirectory)\tcl_arm64" - - - task: PublishPipelineArtifact at 0 - displayName: 'Publish artifact: tcltk_lib_win32' - inputs: - targetPath: '$(Build.ArtifactStagingDirectory)\tcl_win32' - artifactName: tcltk_lib_win32 - - - task: PublishPipelineArtifact at 0 - displayName: 'Publish artifact: tcltk_lib_amd64' - inputs: - targetPath: '$(Build.ArtifactStagingDirectory)\tcl_amd64' - artifactName: tcltk_lib_amd64 - - - ${{ if eq(parameters.ARM64TclTk, true) }}: - - task: PublishPipelineArtifact at 0 - displayName: 'Publish artifact: tcltk_lib_arm64' - inputs: - targetPath: '$(Build.ArtifactStagingDirectory)\tcl_arm64' - artifactName: tcltk_lib_arm64 diff --git a/.azure-pipelines/windows-release/stage-layout-embed.yml b/.azure-pipelines/windows-release/stage-layout-embed.yml deleted file mode 100644 index c8b23d308d81e..0000000000000 --- a/.azure-pipelines/windows-release/stage-layout-embed.yml +++ /dev/null @@ -1,61 +0,0 @@ -jobs: -- job: Make_Embed_Layout - displayName: Make embeddable layout - condition: and(succeeded(), eq(variables['DoEmbed'], 'true')) - - pool: - vmImage: windows-2022 - - workspace: - clean: all - - strategy: - matrix: - win32: - Name: win32 - Python: $(Build.BinariesDirectory)\bin\python.exe - PYTHONHOME: $(Build.SourcesDirectory) - amd64: - Name: amd64 - Python: $(Build.BinariesDirectory)\bin\python.exe - PYTHONHOME: $(Build.SourcesDirectory) - arm64: - Name: arm64 - HostArch: amd64 - Python: $(Build.BinariesDirectory)\bin_amd64\python.exe - PYTHONHOME: $(Build.SourcesDirectory) - - steps: - - template: ./checkout.yml - - - task: DownloadPipelineArtifact at 1 - displayName: 'Download artifact: bin_$(Name)' - inputs: - artifactName: bin_$(Name) - targetPath: $(Build.BinariesDirectory)\bin - - - template: ./layout-command.yml - - - powershell: | - $d = (.\PCbuild\build.bat -V) | %{ if($_ -match '\s+(\w+):\s*(.+)\s*$') { @{$Matches[1] = $Matches[2];} }}; - Write-Host "##vso[task.setvariable variable=VersionText]$($d.PythonVersion)" - displayName: 'Extract version numbers' - - - powershell: > - $(LayoutCmd) - --copy "$(Build.ArtifactStagingDirectory)\layout" - --zip "$(Build.ArtifactStagingDirectory)\embed\python-$(VersionText)-embed-$(Name).zip" - --preset-embed - displayName: 'Generate embeddable layout' - - - task: PublishPipelineArtifact at 0 - displayName: 'Publish Artifact: layout_embed_$(Name)' - inputs: - targetPath: '$(Build.ArtifactStagingDirectory)\layout' - artifactName: layout_embed_$(Name) - - - task: PublishBuildArtifacts at 1 - displayName: 'Publish Artifact: embed' - inputs: - PathtoPublish: '$(Build.ArtifactStagingDirectory)\embed' - ArtifactName: embed diff --git a/.azure-pipelines/windows-release/stage-layout-full.yml b/.azure-pipelines/windows-release/stage-layout-full.yml deleted file mode 100644 index 343ee1f73c215..0000000000000 --- a/.azure-pipelines/windows-release/stage-layout-full.yml +++ /dev/null @@ -1,80 +0,0 @@ -parameters: - ARM64TclTk: true - -jobs: -- job: Make_Layouts - displayName: Make layouts - condition: and(succeeded(), eq(variables['DoLayout'], 'true')) - - pool: - vmImage: windows-2022 - - workspace: - clean: all - - strategy: - matrix: - win32: - Name: win32 - Python: $(Build.BinariesDirectory)\bin\python.exe - PYTHONHOME: $(Build.SourcesDirectory) - TclLibrary: $(Build.BinariesDirectory)\tcltk_lib\tcl8 - amd64: - Name: amd64 - Python: $(Build.BinariesDirectory)\bin\python.exe - PYTHONHOME: $(Build.SourcesDirectory) - TclLibrary: $(Build.BinariesDirectory)\tcltk_lib\tcl8 - arm64: - Name: arm64 - HostArch: amd64 - Python: $(Build.BinariesDirectory)\bin_amd64\python.exe - PYTHONHOME: $(Build.SourcesDirectory) - ${{ if eq(parameters.ARM64TclTk, true) }}: - TclLibrary: $(Build.BinariesDirectory)\tcltk_lib\tcl8 - - steps: - - template: ./checkout.yml - - - task: DownloadPipelineArtifact at 1 - displayName: 'Download artifact: bin_$(Name)' - inputs: - artifactName: bin_$(Name) - targetPath: $(Build.BinariesDirectory)\bin - - - task: DownloadPipelineArtifact at 1 - displayName: 'Download artifact: bin_$(Name)_d' - inputs: - artifactName: bin_$(Name)_d - targetPath: $(Build.BinariesDirectory)\bin - - - task: DownloadPipelineArtifact at 1 - displayName: 'Download artifact: doc' - inputs: - artifactName: doc - targetPath: $(Build.BinariesDirectory)\doc - - - task: DownloadPipelineArtifact at 1 - displayName: 'Download artifact: tcltk_lib_$(Name)' - condition: and(succeeded(), variables['TclLibrary']) - inputs: - artifactName: tcltk_lib_$(Name) - targetPath: $(Build.BinariesDirectory)\tcltk_lib - - - powershell: | - copy "$(Build.BinariesDirectory)\bin\Activate.ps1" Lib\venv\scripts\common\Activate.ps1 -Force - displayName: 'Copy signed files into sources' - condition: and(succeeded(), variables['SigningCertificate']) - - - template: ./layout-command.yml - - - powershell: | - $(LayoutCmd) --copy "$(Build.ArtifactStagingDirectory)\layout" --preset-default - displayName: 'Generate full layout' - env: - TCL_LIBRARY: $(TclLibrary) - - - task: PublishPipelineArtifact at 0 - displayName: 'Publish Artifact: layout_full_$(Name)' - inputs: - targetPath: '$(Build.ArtifactStagingDirectory)\layout' - artifactName: layout_full_$(Name) diff --git a/.azure-pipelines/windows-release/stage-layout-msix.yml b/.azure-pipelines/windows-release/stage-layout-msix.yml deleted file mode 100644 index a44e1ede20326..0000000000000 --- a/.azure-pipelines/windows-release/stage-layout-msix.yml +++ /dev/null @@ -1,102 +0,0 @@ -parameters: - ARM64TclTk: true - -jobs: -- job: Make_MSIX_Layout - displayName: Make MSIX layout - - pool: - vmImage: windows-2022 - - workspace: - clean: all - - strategy: - matrix: - #win32: - # Name: win32 - # Python: $(Build.BinariesDirectory)\bin\python.exe - # PYTHONHOME: $(Build.SourcesDirectory) - # TclLibrary: $(Build.BinariesDirectory)\tcltk_lib\tcl8 - amd64: - Name: amd64 - Python: $(Build.BinariesDirectory)\bin\python.exe - PYTHONHOME: $(Build.SourcesDirectory) - TclLibrary: $(Build.BinariesDirectory)\tcltk_lib\tcl8 - arm64: - Name: arm64 - HostArch: amd64 - Python: $(Build.BinariesDirectory)\bin_amd64\python.exe - PYTHONHOME: $(Build.SourcesDirectory) - ${{ if eq(parameters.ARM64TclTk, true) }}: - TclLibrary: $(Build.BinariesDirectory)\tcltk_lib\tcl8 - - steps: - - template: ./checkout.yml - - - task: DownloadPipelineArtifact at 1 - displayName: 'Download artifact: bin_$(Name)' - inputs: - artifactName: bin_$(Name) - targetPath: $(Build.BinariesDirectory)\bin - - - task: DownloadPipelineArtifact at 1 - displayName: 'Download artifact: bin_$(Name)_d' - inputs: - artifactName: bin_$(Name)_d - targetPath: $(Build.BinariesDirectory)\bin - - - task: DownloadPipelineArtifact at 1 - displayName: 'Download artifact: tcltk_lib_$(Name)' - condition: and(succeeded(), variables['TclLibrary']) - inputs: - artifactName: tcltk_lib_$(Name) - targetPath: $(Build.BinariesDirectory)\tcltk_lib - - - powershell: | - copy "$(Build.BinariesDirectory)\bin\Activate.ps1" Lib\venv\scripts\common\Activate.ps1 -Force - displayName: 'Copy signed files into sources' - condition: and(succeeded(), variables['SigningCertificate']) - - - template: ./layout-command.yml - - - powershell: | - Remove-Item "$(Build.ArtifactStagingDirectory)\appx-store" -Recurse -Force -EA 0 - $(LayoutCmd) --copy "$(Build.ArtifactStagingDirectory)\appx-store" --preset-appx --precompile - displayName: 'Generate store APPX layout' - env: - TCL_LIBRARY: $(TclLibrary) - - - task: PublishPipelineArtifact at 0 - displayName: 'Publish Artifact: layout_appxstore_$(Name)' - inputs: - targetPath: '$(Build.ArtifactStagingDirectory)\appx-store' - artifactName: layout_appxstore_$(Name) - - - task: DownloadPipelineArtifact at 1 - displayName: 'Download artifact: cert' - condition: and(succeeded(), variables['SigningCertificate']) - inputs: - artifactName: cert - targetPath: $(Build.BinariesDirectory)\cert - - - powershell: | - $info = (gc "$(Build.BinariesDirectory)\cert\certinfo.json" | ConvertFrom-JSON) - Write-Host "Side-loadable APPX must be signed with '$($info.Subject)'" - Write-Host "##vso[task.setvariable variable=APPX_DATA_PUBLISHER]$($info.Subject)" - Write-Host "##vso[task.setvariable variable=APPX_DATA_SHA256]$($info.SHA256)" - displayName: 'Override signing parameters' - condition: and(succeeded(), variables['SigningCertificate']) - - - powershell: | - Remove-Item "$(Build.ArtifactStagingDirectory)\appx" -Recurse -Force -EA 0 - $(LayoutCmd) --copy "$(Build.ArtifactStagingDirectory)\appx" --preset-appx --precompile --include-symbols --include-tests - displayName: 'Generate sideloading APPX layout' - env: - TCL_LIBRARY: $(TclLibrary) - - - task: PublishPipelineArtifact at 0 - displayName: 'Publish Artifact: layout_appx_$(Name)' - inputs: - targetPath: '$(Build.ArtifactStagingDirectory)\appx' - artifactName: layout_appx_$(Name) diff --git a/.azure-pipelines/windows-release/stage-layout-nuget.yml b/.azure-pipelines/windows-release/stage-layout-nuget.yml deleted file mode 100644 index b60a324dd90e3..0000000000000 --- a/.azure-pipelines/windows-release/stage-layout-nuget.yml +++ /dev/null @@ -1,52 +0,0 @@ -jobs: -- job: Make_Nuget_Layout - displayName: Make Nuget layout - condition: and(succeeded(), eq(variables['DoNuget'], 'true')) - - pool: - vmImage: windows-2022 - - workspace: - clean: all - - strategy: - matrix: - win32: - Name: win32 - Python: $(Build.BinariesDirectory)\bin\python.exe - PYTHONHOME: $(Build.SourcesDirectory) - amd64: - Name: amd64 - Python: $(Build.BinariesDirectory)\bin\python.exe - PYTHONHOME: $(Build.SourcesDirectory) - arm64: - Name: arm64 - HostArch: amd64 - Python: $(Build.BinariesDirectory)\bin_amd64\python.exe - PYTHONHOME: $(Build.SourcesDirectory) - - steps: - - template: ./checkout.yml - - - task: DownloadPipelineArtifact at 1 - displayName: 'Download artifact: bin_$(Name)' - inputs: - artifactName: bin_$(Name) - targetPath: $(Build.BinariesDirectory)\bin - - - powershell: | - copy $(Build.BinariesDirectory)\bin\Activate.ps1 Lib\venv\scripts\common\Activate.ps1 -Force - displayName: 'Copy signed files into sources' - condition: and(succeeded(), variables['SigningCertificate']) - - - template: ./layout-command.yml - - - powershell: | - $(LayoutCmd) --copy "$(Build.ArtifactStagingDirectory)\nuget" --preset-nuget - displayName: 'Generate nuget layout' - - - task: PublishPipelineArtifact at 0 - displayName: 'Publish Artifact: layout_nuget_$(Name)' - inputs: - targetPath: '$(Build.ArtifactStagingDirectory)\nuget' - artifactName: layout_nuget_$(Name) diff --git a/.azure-pipelines/windows-release/stage-msi.yml b/.azure-pipelines/windows-release/stage-msi.yml deleted file mode 100644 index 0566544a6eb63..0000000000000 --- a/.azure-pipelines/windows-release/stage-msi.yml +++ /dev/null @@ -1,43 +0,0 @@ -parameters: - ARM64TclTk: true - -jobs: -- job: Make_MSI - displayName: Make MSI - condition: and(succeeded(), not(variables['SigningCertificate'])) - - pool: - vmImage: windows-2022 - - variables: - ReleaseUri: http://www.python.org/{arch} - DownloadUrl: https://www.python.org/ftp/python/{version}/{arch}{releasename}/{msi} - Py_OutDir: $(Build.BinariesDirectory) - - workspace: - clean: all - - steps: - - template: msi-steps.yml - parameters: - ARM64TclTk: ${{ parameters.ARM64TclTk }} - -- job: Make_Signed_MSI - displayName: Make signed MSI - condition: and(succeeded(), variables['SigningCertificate']) - - pool: - name: 'Windows Release' - - variables: - ReleaseUri: http://www.python.org/{arch} - DownloadUrl: https://www.python.org/ftp/python/{version}/{arch}{releasename}/{msi} - Py_OutDir: $(Build.BinariesDirectory) - - workspace: - clean: all - - steps: - - template: msi-steps.yml - parameters: - ARM64TclTk: ${{ parameters.ARM64TclTk }} diff --git a/.azure-pipelines/windows-release/stage-pack-msix.yml b/.azure-pipelines/windows-release/stage-pack-msix.yml deleted file mode 100644 index 95988151a03db..0000000000000 --- a/.azure-pipelines/windows-release/stage-pack-msix.yml +++ /dev/null @@ -1,148 +0,0 @@ -jobs: -- job: Pack_MSIX - displayName: Pack MSIX bundles - - pool: - vmImage: windows-2022 - - workspace: - clean: all - - strategy: - matrix: - amd64: - Name: amd64 - Artifact: appx - Suffix: - ShouldSign: true - amd64_store: - Name: amd64 - Artifact: appxstore - Suffix: -store - Upload: true - arm64: - Name: arm64 - Artifact: appx - Suffix: - ShouldSign: true - arm64_store: - Name: arm64 - Artifact: appxstore - Suffix: -store - Upload: true - - steps: - - template: ./checkout.yml - - - task: DownloadPipelineArtifact at 1 - displayName: 'Download artifact: layout_$(Artifact)_$(Name)' - inputs: - artifactName: layout_$(Artifact)_$(Name) - targetPath: $(Build.BinariesDirectory)\layout - - - task: DownloadBuildArtifacts at 0 - displayName: 'Download artifact: symbols' - inputs: - artifactName: symbols - downloadPath: $(Build.BinariesDirectory) - - - powershell: | - $d = (.\PCbuild\build.bat -V) | %{ if($_ -match '\s+(\w+):\s*(.+)\s*$') { @{$Matches[1] = $Matches[2];} }}; - Write-Host "##vso[task.setvariable variable=VersionText]$($d.PythonVersion)" - Write-Host "##vso[task.setvariable variable=VersionNumber]$($d.PythonVersionNumber)" - Write-Host "##vso[task.setvariable variable=VersionHex]$($d.PythonVersionHex)" - Write-Host "##vso[task.setvariable variable=VersionUnique]$($d.PythonVersionUnique)" - Write-Host "##vso[task.setvariable variable=Filename]python-$($d.PythonVersion)-$(Name)$(Suffix)" - displayName: 'Extract version numbers' - - - powershell: | - ./Tools/msi/make_appx.ps1 -layout "$(Build.BinariesDirectory)\layout" -msix "$(Build.ArtifactStagingDirectory)\msix\$(Filename).msix" - displayName: 'Build msix' - - - powershell: | - 7z a -tzip "$(Build.ArtifactStagingDirectory)\msix\$(Filename).appxsym" *.pdb - displayName: 'Build appxsym' - workingDirectory: $(Build.BinariesDirectory)\symbols\$(Name) - - - task: PublishBuildArtifacts at 1 - displayName: 'Publish Artifact: MSIX' - condition: and(succeeded(), or(ne(variables['ShouldSign'], 'true'), not(variables['SigningCertificate']))) - inputs: - PathtoPublish: '$(Build.ArtifactStagingDirectory)\msix' - ArtifactName: msix - - - task: PublishBuildArtifacts at 1 - displayName: 'Publish Artifact: MSIX' - condition: and(succeeded(), and(eq(variables['ShouldSign'], 'true'), variables['SigningCertificate'])) - inputs: - PathtoPublish: '$(Build.ArtifactStagingDirectory)\msix' - ArtifactName: unsigned_msix - - - powershell: | - 7z a -tzip "$(Build.ArtifactStagingDirectory)\msixupload\$(Filename).msixupload" * - displayName: 'Build msixupload' - condition: and(succeeded(), eq(variables['Upload'], 'true')) - workingDirectory: $(Build.ArtifactStagingDirectory)\msix - - - task: PublishBuildArtifacts at 1 - displayName: 'Publish Artifact: MSIXUpload' - condition: and(succeeded(), eq(variables['Upload'], 'true')) - inputs: - PathtoPublish: '$(Build.ArtifactStagingDirectory)\msixupload' - ArtifactName: msixupload - - -- job: Sign_MSIX - displayName: Sign side-loadable MSIX bundles - dependsOn: - - Pack_MSIX - condition: and(succeeded(), variables['SigningCertificate']) - - pool: - name: 'Windows Release' - - workspace: - clean: all - - steps: - - template: ./checkout.yml - - template: ./find-sdk.yml - - - powershell: | - $d = (.\PCbuild\build.bat -V) | %{ if($_ -match '\s+(\w+):\s*(.+)\s*$') { @{$Matches[1] = $Matches[2];} }}; - Write-Host "##vso[task.setvariable variable=SigningDescription]Python $($d.PythonVersion)" - displayName: 'Update signing description' - condition: and(succeeded(), not(variables['SigningDescription'])) - - - task: DownloadBuildArtifacts at 0 - displayName: 'Download Artifact: unsigned_msix' - inputs: - artifactName: unsigned_msix - downloadPath: $(Build.BinariesDirectory) - - # MSIX must be signed and timestamped simultaneously - # - # Getting "Error: SignerSign() failed." (-2147024885/0x8007000b)"? - # It may be that the certificate info collected in stage-sign.yml is wrong. Check that - # you do not have multiple matches for the certificate name you have specified. - - powershell: | - $failed = $true - foreach ($retry in 1..3) { - signtool sign /a /n "$(SigningCertificate)" /fd sha256 /tr http://timestamp.digicert.com/ /td sha256 /d "$(SigningDescription)" (gi *.msix) - if ($?) { - $failed = $false - break - } - sleep 1 - } - if ($failed) { - throw "Failed to sign MSIX" - } - displayName: 'Sign MSIX' - workingDirectory: $(Build.BinariesDirectory)\unsigned_msix - - - task: PublishBuildArtifacts at 1 - displayName: 'Publish Artifact: MSIX' - inputs: - PathtoPublish: '$(Build.BinariesDirectory)\unsigned_msix' - ArtifactName: msix diff --git a/.azure-pipelines/windows-release/stage-pack-nuget.yml b/.azure-pipelines/windows-release/stage-pack-nuget.yml deleted file mode 100644 index 85b44e389ab5d..0000000000000 --- a/.azure-pipelines/windows-release/stage-pack-nuget.yml +++ /dev/null @@ -1,66 +0,0 @@ -jobs: -- job: Pack_Nuget - displayName: Pack Nuget bundles - condition: and(succeeded(), eq(variables['DoNuget'], 'true')) - - pool: - name: 'Windows Release' - - workspace: - clean: all - - strategy: - matrix: - amd64: - Name: amd64 - win32: - Name: win32 - arm64: - Name: arm64 - - steps: - - checkout: none - - - task: DownloadPipelineArtifact at 1 - displayName: 'Download artifact: layout_nuget_$(Name)' - inputs: - artifactName: layout_nuget_$(Name) - targetPath: $(Build.BinariesDirectory)\layout - - - task: NugetToolInstaller at 0 - displayName: 'Install Nuget' - inputs: - versionSpec: '>=5.0' - - - powershell: > - nuget pack - "$(Build.BinariesDirectory)\layout\python.nuspec" - -OutputDirectory $(Build.ArtifactStagingDirectory) - -NoPackageAnalysis - -NonInteractive - condition: and(succeeded(), not(variables['OverrideNugetVersion'])) - displayName: 'Create nuget package' - - - powershell: > - nuget pack - "$(Build.BinariesDirectory)\layout\python.nuspec" - -OutputDirectory $(Build.ArtifactStagingDirectory) - -NoPackageAnalysis - -NonInteractive - -Version "$(OverrideNugetVersion)" - condition: and(succeeded(), variables['OverrideNugetVersion']) - displayName: 'Create nuget package' - - - powershell: | - gci *.nupkg | %{ - nuget sign "$_" -CertificateSubjectName "$(SigningCertificate)" -Timestamper http://timestamp.digicert.com/ -Overwrite - } - displayName: 'Sign nuget package' - workingDirectory: $(Build.ArtifactStagingDirectory) - condition: and(succeeded(), variables['SigningCertificate']) - - - task: PublishBuildArtifacts at 1 - displayName: 'Publish Artifact: nuget' - inputs: - PathtoPublish: '$(Build.ArtifactStagingDirectory)' - ArtifactName: nuget diff --git a/.azure-pipelines/windows-release/stage-publish-nugetorg.yml b/.azure-pipelines/windows-release/stage-publish-nugetorg.yml deleted file mode 100644 index abb9d0f0fd485..0000000000000 --- a/.azure-pipelines/windows-release/stage-publish-nugetorg.yml +++ /dev/null @@ -1,50 +0,0 @@ -parameters: - BuildToPublish: '' - -jobs: -- job: Publish_Nuget - displayName: Publish Nuget packages - condition: and(succeeded(), eq(variables['DoNuget'], 'true'), ne(variables['SkipNugetPublish'], 'true')) - - pool: - vmImage: windows-2022 - - workspace: - clean: all - - steps: - - checkout: none - - - ${{ if parameters.BuildToPublish }}: - - task: DownloadBuildArtifacts at 0 - displayName: 'Download artifact from ${{ parameters.BuildToPublish }}' - inputs: - artifactName: nuget - downloadPath: $(Build.BinariesDirectory) - buildType: specific - project: $(System.TeamProject) - pipeline: $(Build.DefinitionName) - buildVersionToDownload: specific - buildId: ${{ parameters.BuildToPublish }} - - - ${{ else }}: - - task: DownloadBuildArtifacts at 0 - displayName: 'Download artifact: nuget' - inputs: - artifactName: nuget - downloadPath: $(Build.BinariesDirectory) - - - - powershell: 'gci pythonarm*.nupkg | %{ Write-Host "Not publishing: $($_.Name)"; gi $_ } | del' - displayName: 'Prevent publishing ARM64 packages' - workingDirectory: '$(Build.BinariesDirectory)\nuget' - condition: and(succeeded(), ne(variables['PublishARM64'], 'true')) - - - task: NuGetCommand at 2 - displayName: Push packages - condition: and(succeeded(), eq(variables['SigningCertificate'], variables['__RealSigningCertificate'])) - inputs: - command: push - packagesToPush: '$(Build.BinariesDirectory)\nuget\*.nupkg' - nuGetFeedType: external - publishFeedCredentials: 'Python on Nuget' diff --git a/.azure-pipelines/windows-release/stage-publish-pythonorg.yml b/.azure-pipelines/windows-release/stage-publish-pythonorg.yml deleted file mode 100644 index 084134e009902..0000000000000 --- a/.azure-pipelines/windows-release/stage-publish-pythonorg.yml +++ /dev/null @@ -1,192 +0,0 @@ -parameters: - BuildToPublish: '' - -jobs: -- job: Publish_Python - displayName: Publish python.org packages - condition: and(succeeded(), eq(variables['DoMSI'], 'true'), eq(variables['DoEmbed'], 'true'), ne(variables['SkipPythonOrgPublish'], 'true')) - - pool: - #vmImage: windows-2022 - name: 'Windows Release' - - workspace: - clean: all - - steps: - - template: ./checkout.yml - - - task: UsePythonVersion at 0 - displayName: 'Use Python 3.6 or later' - inputs: - versionSpec: '>=3.6' - - - ${{ if parameters.BuildToPublish }}: - - task: DownloadPipelineArtifact at 1 - displayName: 'Download artifact from ${{ parameters.BuildToPublish }}: Doc' - inputs: - artifactName: Doc - targetPath: $(Build.BinariesDirectory)\Doc - buildType: specific - project: $(System.TeamProject) - pipeline: $(Build.DefinitionName) - buildVersionToDownload: specific - buildId: ${{ parameters.BuildToPublish }} - - - task: DownloadPipelineArtifact at 1 - displayName: 'Download artifact from ${{ parameters.BuildToPublish }}: msi' - inputs: - artifactName: msi - targetPath: $(Build.BinariesDirectory)\msi - buildType: specific - project: $(System.TeamProject) - pipeline: $(Build.DefinitionName) - buildVersionToDownload: specific - buildId: ${{ parameters.BuildToPublish }} - - # Note that embed is a 'build' artifact, not a 'pipeline' artifact - - task: DownloadBuildArtifacts at 0 - displayName: 'Download artifact from ${{ parameters.BuildToPublish }}: embed' - inputs: - artifactName: embed - downloadPath: $(Build.BinariesDirectory) - buildType: specific - project: $(System.TeamProject) - pipeline: $(Build.DefinitionName) - buildVersionToDownload: specific - buildId: ${{ parameters.BuildToPublish }} - - - ${{ else }}: - - task: DownloadPipelineArtifact at 1 - displayName: 'Download artifact: Doc' - inputs: - artifactName: Doc - targetPath: $(Build.BinariesDirectory)\Doc - - - task: DownloadPipelineArtifact at 1 - displayName: 'Download artifact: msi' - inputs: - artifactName: msi - targetPath: $(Build.BinariesDirectory)\msi - - # Note that embed is a 'build' artifact, not a 'pipeline' artifact - - task: DownloadBuildArtifacts at 0 - displayName: 'Download artifact: embed' - inputs: - artifactName: embed - downloadPath: $(Build.BinariesDirectory) - - - # Note that ARM64 MSIs are skipped at build when this option is specified - - powershell: 'gci *embed-arm*.zip | %{ Write-Host "Not publishing: $($_.Name)"; gi $_ } | del' - displayName: 'Prevent publishing ARM64 packages' - workingDirectory: '$(Build.BinariesDirectory)\embed' - condition: and(succeeded(), ne(variables['PublishARM64'], 'true')) - - - - task: DownloadSecureFile at 1 - name: gpgkey - inputs: - secureFile: 'python-signing.key' - displayName: 'Download GPG key' - - - powershell: | - git clone https://github.com/python/cpython-bin-deps --branch gpg --single-branch --depth 1 --progress -v "gpg" - gpg/gpg2.exe --import "$(gpgkey.secureFilePath)" - $files = gci -File "msi\*\*", "embed\*.zip" - if ("$(DoCHM)" -ieq "true") { - $files = $files + (gci -File "doc\htmlhelp\*.chm") - } - $files.FullName | %{ - gpg/gpg2.exe -ba --batch --passphrase $(GPGPassphrase) $_ - "Made signature for $_" - } - displayName: 'Generate GPG signatures' - workingDirectory: $(Build.BinariesDirectory) - - - powershell: | - $p = gps "gpg-agent" -EA 0 - if ($p) { $p.Kill() } - displayName: 'Kill GPG agent' - condition: true - - - - powershell: > - $(Build.SourcesDirectory)\Tools\msi\uploadrelease.ps1 - -build msi - -user $(PyDotOrgUsername) - -server $(PyDotOrgServer) - -doc_htmlhelp doc\htmlhelp - -embed embed - -skippurge - -skiptest - -skiphash - condition: and(succeeded(), eq(variables['SigningCertificate'], variables['__RealSigningCertificate'])) - workingDirectory: $(Build.BinariesDirectory) - displayName: 'Upload files to python.org' - - - powershell: > - python - "$(Build.SourcesDirectory)\Tools\msi\purge.py" - (gci msi\*\python-*.exe | %{ $_.Name -replace 'python-(.+?)(-|\.exe).+', '$1' } | select -First 1) - workingDirectory: $(Build.BinariesDirectory) - condition: and(succeeded(), eq(variables['SigningCertificate'], variables['__RealSigningCertificate'])) - displayName: 'Purge CDN' - - - powershell: | - $failures = 0 - gci "msi\*\*.exe" -File | %{ - $d = mkdir "tests\$($_.BaseName)" -Force - gci $d -r -File | del - $ic = copy $_ $d -PassThru - "Checking layout for $($ic.Name)" - Start-Process -wait $ic "/passive", "/layout", "$d\layout", "/log", "$d\log\install.log" - if (-not $?) { - Write-Error "Failed to validate layout of $($inst.Name)" - $failures += 1 - } - } - if ($failures) { - Write-Error "Failed to validate $failures installers" - exit 1 - } - condition: and(succeeded(), eq(variables['SigningCertificate'], variables['__RealSigningCertificate'])) - workingDirectory: $(Build.BinariesDirectory) - displayName: 'Test layouts' - - - powershell: | - $files = gci -File "msi\*\*.exe", "embed\*.zip" - if ("$(DoCHM)" -ieq "true") { - $files = $files + (gci -File "doc\htmlhelp\python*.chm") - } - $hashes = $files | ` - Sort-Object Name | ` - Format-Table Name, @{ - Label="MD5"; - Expression={(Get-FileHash $_ -Algorithm MD5).Hash} - }, Length -AutoSize | ` - Out-String -Width 4096 - $d = mkdir "$(Build.ArtifactStagingDirectory)\hashes" -Force - $hashes | Out-File "$d\hashes.txt" -Encoding ascii - $hashes - workingDirectory: $(Build.BinariesDirectory) - displayName: 'Generate hashes' - - - powershell: | - "Copying:" - $files = gci -File "msi\*\python*.asc", "embed\*.asc" - if ("$(DoCHM)" -ieq "true") { - $files = $files + (gci -File "doc\htmlhelp\*.asc") - } - $files.FullName - $d = mkdir "$(Build.ArtifactStagingDirectory)\hashes" -Force - move $files $d -Force - gci msi -Directory | %{ move "msi\$_\*.asc" (mkdir "$d\$_" -Force) } - workingDirectory: $(Build.BinariesDirectory) - displayName: 'Copy GPG signatures for build' - - - task: PublishPipelineArtifact at 0 - displayName: 'Publish Artifact: hashes' - inputs: - targetPath: '$(Build.ArtifactStagingDirectory)\hashes' - artifactName: hashes diff --git a/.azure-pipelines/windows-release/stage-publish-store.yml b/.azure-pipelines/windows-release/stage-publish-store.yml deleted file mode 100644 index 0eae21edaa7f8..0000000000000 --- a/.azure-pipelines/windows-release/stage-publish-store.yml +++ /dev/null @@ -1,38 +0,0 @@ -parameters: - BuildToPublish: '' - -jobs: -- job: Publish_Store - displayName: Publish Store packages - condition: and(succeeded(), eq(variables['DoMSIX'], 'true'), ne(variables['SkipMSIXPublish'], 'true')) - - pool: - vmImage: windows-2022 - - workspace: - clean: all - - steps: - - checkout: none - - - ${{ if parameters.BuildToPublish }}: - - task: DownloadBuildArtifacts at 0 - displayName: 'Download artifact: msixupload' - inputs: - artifactName: msixupload - downloadPath: $(Build.BinariesDirectory) - buildType: specific - project: cpython - pipeline: Windows-Release - buildVersionToDownload: specific - buildId: ${{ parameters.BuildToPublish }} - - - ${{ else }}: - - task: DownloadBuildArtifacts at 0 - displayName: 'Download artifact: msixupload' - inputs: - artifactName: msixupload - downloadPath: $(Build.BinariesDirectory) - - # TODO: eq(variables['SigningCertificate'], variables['__RealSigningCertificate']) - # If we are not real-signed, DO NOT PUBLISH diff --git a/.azure-pipelines/windows-release/stage-sign.yml b/.azure-pipelines/windows-release/stage-sign.yml deleted file mode 100644 index 4481aa86edc2c..0000000000000 --- a/.azure-pipelines/windows-release/stage-sign.yml +++ /dev/null @@ -1,130 +0,0 @@ -parameters: - Include: '*.exe, *.dll, *.pyd, *.cat, *.ps1' - Exclude: 'vcruntime*, libffi*, libcrypto*, libssl*' - -jobs: -- job: Sign_Python - displayName: Sign Python binaries - condition: and(succeeded(), variables['SigningCertificate']) - - pool: - name: 'Windows Release' - - workspace: - clean: all - - strategy: - matrix: - win32: - Name: win32 - amd64: - Name: amd64 - arm64: - Name: arm64 - - steps: - - template: ./checkout.yml - - template: ./find-sdk.yml - - - powershell: | - $d = (.\PCbuild\build.bat -V) | %{ if($_ -match '\s+(\w+):\s*(.+)\s*$') { @{$Matches[1] = $Matches[2];} }}; - Write-Host "##vso[task.setvariable variable=SigningDescription]Python $($d.PythonVersion)" - displayName: 'Update signing description' - condition: and(succeeded(), not(variables['SigningDescription'])) - - - powershell: | - Write-Host "##vso[build.addbuildtag]signed" - displayName: 'Add build tags' - - - task: DownloadPipelineArtifact at 1 - displayName: 'Download artifact: unsigned_bin_$(Name)' - inputs: - artifactName: unsigned_bin_$(Name) - targetPath: $(Build.BinariesDirectory)\bin - - - powershell: | - copy "$(Build.SourcesDirectory)\Lib\venv\scripts\common\Activate.ps1" . - displayName: 'Copy files from source' - workingDirectory: $(Build.BinariesDirectory)\bin - - - powershell: | - $files = (gi ${{ parameters.Include }} -Exclude ${{ parameters.Exclude }}) - signtool sign /a /n "$(SigningCertificate)" /fd sha256 /d "$(SigningDescription)" $files - displayName: 'Sign binaries' - workingDirectory: $(Build.BinariesDirectory)\bin - - - powershell: | - $files = (gi ${{ parameters.Include }} -Exclude ${{ parameters.Exclude }}) - $failed = $true - foreach ($retry in 1..10) { - signtool timestamp /tr http://timestamp.digicert.com/ /td sha256 $files - if ($?) { - $failed = $false - break - } - sleep 5 - } - if ($failed) { - Write-Host "##vso[task.logissue type=error]Failed to timestamp files" - } - displayName: 'Timestamp binaries' - workingDirectory: $(Build.BinariesDirectory)\bin - continueOnError: true - - - task: PublishPipelineArtifact at 0 - displayName: 'Publish artifact: bin_$(Name)' - inputs: - targetPath: '$(Build.BinariesDirectory)\bin' - artifactName: bin_$(Name) - - -- job: Dump_CertInfo - displayName: Capture certificate info - condition: and(succeeded(), variables['SigningCertificate']) - - pool: - name: 'Windows Release' - - steps: - - checkout: none - - - powershell: | - $m = 'CN=$(SigningCertificate)' - $c = ((gci Cert:\CurrentUser\My), (gci Cert:\LocalMachine\My)) | %{ $_ } | ` - ?{ $_.Subject -match $m -and $_.NotBefore -lt (Get-Date) -and $_.NotAfter -gt (Get-Date) } | ` - select -First 1 - if (-not $c) { - Write-Host "Failed to find certificate for $(SigningCertificate)" - exit - } - $d = mkdir "$(Build.BinariesDirectory)\tmp" -Force - $cf = "$d\cert.cer" - [IO.File]::WriteAllBytes($cf, $c.Export("Cer")) - $csha = (certutil -dump $cf | sls "Cert Hash\(sha256\): (.+)").Matches.Groups[1].Value - - $info = @{ Subject=$c.Subject; SHA256=$csha; } - - $d = mkdir "$(Build.BinariesDirectory)\cert" -Force - $info | ConvertTo-JSON -Compress | Out-File -Encoding utf8 "$d\certinfo.json" - displayName: "Extract certificate info" - - - task: PublishPipelineArtifact at 0 - displayName: 'Publish artifact: cert' - inputs: - targetPath: '$(Build.BinariesDirectory)\cert' - artifactName: cert - - -- job: Mark_Unsigned - displayName: Tag unsigned build - condition: and(succeeded(), not(variables['SigningCertificate'])) - - pool: - vmImage: windows-2022 - - steps: - - checkout: none - - - powershell: | - Write-Host "##vso[build.addbuildtag]unsigned" - displayName: 'Add build tag' diff --git a/.azure-pipelines/windows-release/stage-test-embed.yml b/.azure-pipelines/windows-release/stage-test-embed.yml deleted file mode 100644 index 252db959930f2..0000000000000 --- a/.azure-pipelines/windows-release/stage-test-embed.yml +++ /dev/null @@ -1,41 +0,0 @@ -jobs: -- job: Test_Embed - displayName: Test Embed - condition: and(succeeded(), eq(variables['DoEmbed'], 'true')) - - pool: - vmImage: windows-2022 - - workspace: - clean: all - - strategy: - matrix: - win32: - Name: win32 - amd64: - Name: amd64 - - steps: - - checkout: none - - - task: DownloadBuildArtifacts at 0 - displayName: 'Download artifact: embed' - inputs: - artifactName: embed - downloadPath: $(Build.BinariesDirectory) - - - powershell: | - $p = gi "$(Build.BinariesDirectory)\embed\python*embed-$(Name).zip" - Expand-Archive -Path $p -DestinationPath "$(Build.BinariesDirectory)\Python" - $p = gi "$(Build.BinariesDirectory)\Python\python.exe" - Write-Host "##vso[task.prependpath]$(Split-Path -Parent $p)" - displayName: 'Install Python and add to PATH' - - - script: | - python -c "import sys; print(sys.version)" - displayName: 'Collect version number' - - - script: | - python -m site - displayName: 'Collect site' diff --git a/.azure-pipelines/windows-release/stage-test-msi.yml b/.azure-pipelines/windows-release/stage-test-msi.yml deleted file mode 100644 index a471d05bc6a4a..0000000000000 --- a/.azure-pipelines/windows-release/stage-test-msi.yml +++ /dev/null @@ -1,108 +0,0 @@ -jobs: -- job: Test_MSI - displayName: Test MSI - - pool: - vmImage: windows-2022 - - workspace: - clean: all - - strategy: - matrix: - win32_User: - ExeMatch: 'python-[\dabrc.]+\.exe' - Logs: $(Build.ArtifactStagingDirectory)\logs\win32_User - InstallAllUsers: 0 - win32_Machine: - ExeMatch: 'python-[\dabrc.]+\.exe' - Logs: $(Build.ArtifactStagingDirectory)\logs\win32_Machine - InstallAllUsers: 1 - amd64_User: - ExeMatch: 'python-[\dabrc.]+-amd64\.exe' - Logs: $(Build.ArtifactStagingDirectory)\logs\amd64_User - InstallAllUsers: 0 - amd64_Machine: - ExeMatch: 'python-[\dabrc.]+-amd64\.exe' - Logs: $(Build.ArtifactStagingDirectory)\logs\amd64_Machine - InstallAllUsers: 1 - - steps: - - checkout: none - - - task: DownloadPipelineArtifact at 1 - displayName: 'Download artifact: msi' - inputs: - artifactName: msi - targetPath: $(Build.BinariesDirectory)\msi - - - powershell: | - $p = (gci -r *.exe | ?{ $_.Name -match '$(ExeMatch)' } | select -First 1) - Write-Host "##vso[task.setvariable variable=SetupExe]$($p.FullName)" - Write-Host "##vso[task.setvariable variable=SetupExeName]$($p.Name)" - displayName: 'Find installer executable' - workingDirectory: $(Build.BinariesDirectory)\msi - - - script: > - "$(SetupExe)" - /passive - /log "$(Logs)\install\log.txt" - TargetDir="$(Build.BinariesDirectory)\Python" - Include_debug=1 - Include_symbols=1 - InstallAllUsers=$(InstallAllUsers) - displayName: 'Install Python' - - - powershell: | - $p = gi "$(Build.BinariesDirectory)\Python\python.exe" - Write-Host "##vso[task.prependpath]$(Split-Path -Parent $p)" - displayName: 'Add test Python to PATH' - - - script: | - python -c "import sys; print(sys.version)" - displayName: 'Collect version number' - - - script: | - python -m site - displayName: 'Collect site' - - - powershell: | - gci -r "${env:PROGRAMDATA}\Microsoft\Windows\Start Menu\Programs\Python*" - displayName: 'Capture per-machine Start Menu items' - - powershell: | - gci -r "${env:APPDATA}\Microsoft\Windows\Start Menu\Programs\Python*" - displayName: 'Capture per-user Start Menu items' - - - powershell: | - gci -r "HKLM:\Software\WOW6432Node\Python" - displayName: 'Capture per-machine 32-bit registry' - - powershell: | - gci -r "HKLM:\Software\Python" - displayName: 'Capture per-machine native registry' - - powershell: | - gci -r "HKCU:\Software\Python" - displayName: 'Capture current-user registry' - - - script: | - python -m pip install "azure<0.10" - python -m pip uninstall -y azure python-dateutil six - displayName: 'Test (un)install package' - - - script: | - python -m test -uall -v test_ttk_guionly test_tk test_idle - displayName: 'Test Tkinter and Idle' - - - script: > - "$(SetupExe)" - /passive - /uninstall - /log "$(Logs)\uninstall\log.txt" - displayName: 'Uninstall Python' - - - task: PublishBuildArtifacts at 1 - displayName: 'Publish Artifact: logs' - condition: true - continueOnError: true - inputs: - PathtoPublish: '$(Build.ArtifactStagingDirectory)\logs' - ArtifactName: msi_testlogs diff --git a/.azure-pipelines/windows-release/stage-test-nuget.yml b/.azure-pipelines/windows-release/stage-test-nuget.yml deleted file mode 100644 index c500baf29b457..0000000000000 --- a/.azure-pipelines/windows-release/stage-test-nuget.yml +++ /dev/null @@ -1,58 +0,0 @@ -jobs: -- job: Test_Nuget - displayName: Test Nuget - condition: and(succeeded(), eq(variables['DoNuget'], 'true')) - - pool: - vmImage: windows-2022 - - workspace: - clean: all - - strategy: - matrix: - win32: - Package: pythonx86 - amd64: - Package: python - - steps: - - checkout: none - - - task: DownloadBuildArtifacts at 0 - displayName: 'Download artifact: nuget' - inputs: - artifactName: nuget - downloadPath: $(Build.BinariesDirectory) - - - task: NugetToolInstaller at 0 - inputs: - versionSpec: '>= 5' - - - powershell: > - nuget install - $(Package) - -Source "$(Build.BinariesDirectory)\nuget" - -OutputDirectory "$(Build.BinariesDirectory)\install" - -Prerelease - -ExcludeVersion - -NonInteractive - displayName: 'Install Python' - - - powershell: | - $p = gi "$(Build.BinariesDirectory)\install\$(Package)\tools\python.exe" - Write-Host "##vso[task.prependpath]$(Split-Path -Parent $p)" - displayName: 'Add test Python to PATH' - - - script: | - python -c "import sys; print(sys.version)" - displayName: 'Collect version number' - - - script: | - python -m site - displayName: 'Collect site' - - - script: | - python -m pip install "azure<0.10" - python -m pip uninstall -y azure python-dateutil six - displayName: 'Test (un)install package' From webhook-mailer at python.org Wed May 18 09:38:53 2022 From: webhook-mailer at python.org (markshannon) Date: Wed, 18 May 2022 13:38:53 -0000 Subject: [Python-checkins] Split refcount stats into 'interpreter' and 'non-interpreter' (GH-92919) Message-ID: https://github.com/python/cpython/commit/a4460f2eb8b9db46a9bce3c450c8b038038a7c93 commit: a4460f2eb8b9db46a9bce3c450c8b038038a7c93 branch: main author: Mark Shannon committer: markshannon date: 2022-05-18T14:38:43+01:00 summary: Split refcount stats into 'interpreter' and 'non-interpreter' (GH-92919) files: M Include/pystats.h M Objects/genobject.c M Python/ceval.c M Python/frame.c M Python/specialize.c M Tools/scripts/summarize_stats.py diff --git a/Include/pystats.h b/Include/pystats.h index bc05dd864c63a..4375614b05e48 100644 --- a/Include/pystats.h +++ b/Include/pystats.h @@ -36,6 +36,8 @@ typedef struct _call_stats { typedef struct _object_stats { uint64_t increfs; uint64_t decrefs; + uint64_t interpreter_increfs; + uint64_t interpreter_decrefs; uint64_t allocations; uint64_t allocations512; uint64_t allocations4k; @@ -60,10 +62,18 @@ PyAPI_DATA(PyStats) _py_stats; extern void _Py_PrintSpecializationStats(int to_file); +#ifdef _PY_INTERPRETER + +#define _Py_INCREF_STAT_INC() _py_stats.object_stats.interpreter_increfs++ +#define _Py_DECREF_STAT_INC() _py_stats.object_stats.interpreter_decrefs++ + +#else #define _Py_INCREF_STAT_INC() _py_stats.object_stats.increfs++ #define _Py_DECREF_STAT_INC() _py_stats.object_stats.decrefs++ +#endif + #else #define _Py_INCREF_STAT_INC() ((void)0) diff --git a/Objects/genobject.c b/Objects/genobject.c index b9a0c30c411a0..a88522abf414c 100644 --- a/Objects/genobject.c +++ b/Objects/genobject.c @@ -1,5 +1,7 @@ /* Generator object implementation */ +#define _PY_INTERPRETER + #include "Python.h" #include "pycore_call.h" // _PyObject_CallNoArgs() #include "pycore_ceval.h" // _PyEval_EvalFrame() diff --git a/Python/ceval.c b/Python/ceval.c index c81d0efff9b9b..e4c47498c0cba 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -5,6 +5,8 @@ XXX document it! */ +#define _PY_INTERPRETER + #include "Python.h" #include "pycore_abstract.h" // _PyIndex_Check() #include "pycore_call.h" // _PyObject_FastCallDictTstate() diff --git a/Python/frame.c b/Python/frame.c index c2da123a2bbc1..3573f54ad63e9 100644 --- a/Python/frame.c +++ b/Python/frame.c @@ -1,4 +1,6 @@ +#define _PY_INTERPRETER + #include "Python.h" #include "frameobject.h" #include "pycore_code.h" // stats diff --git a/Python/specialize.c b/Python/specialize.c index 6a91389f85610..5469285e16c4d 100644 --- a/Python/specialize.c +++ b/Python/specialize.c @@ -191,6 +191,8 @@ print_object_stats(FILE *out, ObjectStats *stats) fprintf(out, "Object allocations over 4 kbytes: %" PRIu64 "\n", stats->allocations_big); fprintf(out, "Object frees: %" PRIu64 "\n", stats->frees); fprintf(out, "Object new values: %" PRIu64 "\n", stats->new_values); + fprintf(out, "Object interpreter increfs: %" PRIu64 "\n", stats->interpreter_increfs); + fprintf(out, "Object interpreter decrefs: %" PRIu64 "\n", stats->interpreter_decrefs); fprintf(out, "Object increfs: %" PRIu64 "\n", stats->increfs); fprintf(out, "Object decrefs: %" PRIu64 "\n", stats->decrefs); fprintf(out, "Object materialize dict (on request): %" PRIu64 "\n", stats->dict_materialized_on_request); diff --git a/Tools/scripts/summarize_stats.py b/Tools/scripts/summarize_stats.py index f66fc7b684594..3d7479f261b4a 100644 --- a/Tools/scripts/summarize_stats.py +++ b/Tools/scripts/summarize_stats.py @@ -272,6 +272,8 @@ def emit_object_stats(stats): with Section("Object stats", summary="allocations, frees and dict materializatons"): total_materializations = stats.get("Object new values") total_allocations = stats.get("Object allocations") + total_increfs = stats.get("Object interpreter increfs") + stats.get("Object increfs") + total_decrefs = stats.get("Object interpreter decrefs") + stats.get("Object decrefs") rows = [] for key, value in stats.items(): if key.startswith("Object"): @@ -279,6 +281,10 @@ def emit_object_stats(stats): ratio = f"{100*value/total_materializations:0.1f}%" elif "allocations" in key: ratio = f"{100*value/total_allocations:0.1f}%" + elif "increfs" in key: + ratio = f"{100*value/total_increfs:0.1f}%" + elif "decrefs" in key: + ratio = f"{100*value/total_decrefs:0.1f}%" else: ratio = "" label = key[6:].strip() From webhook-mailer at python.org Wed May 18 17:08:55 2022 From: webhook-mailer at python.org (erlend-aasland) Date: Wed, 18 May 2022 21:08:55 -0000 Subject: [Python-checkins] gh-92812: Align ArgumentParser.add_subparsers() docs with argument spec (#92814) Message-ID: https://github.com/python/cpython/commit/f2d994da104eed38f9e110e7d8f37fa6d845b207 commit: f2d994da104eed38f9e110e7d8f37fa6d845b207 branch: main author: 180909 <734461790 at qq.com> committer: erlend-aasland date: 2022-05-18T23:08:23+02:00 summary: gh-92812: Align ArgumentParser.add_subparsers() docs with argument spec (#92814) files: M Doc/library/argparse.rst diff --git a/Doc/library/argparse.rst b/Doc/library/argparse.rst index 83dd3cdf03136..0e62e99d706d4 100644 --- a/Doc/library/argparse.rst +++ b/Doc/library/argparse.rst @@ -1701,7 +1701,7 @@ Sub-commands .. method:: ArgumentParser.add_subparsers([title], [description], [prog], \ [parser_class], [action], \ - [option_string], [dest], [required], \ + [option_strings], [dest], [required], \ [help], [metavar]) Many programs split up their functionality into a number of sub-commands, From webhook-mailer at python.org Wed May 18 17:25:48 2022 From: webhook-mailer at python.org (miss-islington) Date: Wed, 18 May 2022 21:25:48 -0000 Subject: [Python-checkins] gh-92812: Align ArgumentParser.add_subparsers() docs with argument spec (GH-92814) Message-ID: https://github.com/python/cpython/commit/849963598fa0454ef1bc9c93f5654d63f59e830d commit: 849963598fa0454ef1bc9c93f5654d63f59e830d branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-18T14:25:25-07:00 summary: gh-92812: Align ArgumentParser.add_subparsers() docs with argument spec (GH-92814) (cherry picked from commit f2d994da104eed38f9e110e7d8f37fa6d845b207) Co-authored-by: 180909 <734461790 at qq.com> files: M Doc/library/argparse.rst diff --git a/Doc/library/argparse.rst b/Doc/library/argparse.rst index 1f40e4a84505d..76efed95bd4cc 100644 --- a/Doc/library/argparse.rst +++ b/Doc/library/argparse.rst @@ -1698,7 +1698,7 @@ Sub-commands .. method:: ArgumentParser.add_subparsers([title], [description], [prog], \ [parser_class], [action], \ - [option_string], [dest], [required], \ + [option_strings], [dest], [required], \ [help], [metavar]) Many programs split up their functionality into a number of sub-commands, From webhook-mailer at python.org Wed May 18 17:30:04 2022 From: webhook-mailer at python.org (miss-islington) Date: Wed, 18 May 2022 21:30:04 -0000 Subject: [Python-checkins] gh-92812: Align ArgumentParser.add_subparsers() docs with argument spec (GH-92814) Message-ID: https://github.com/python/cpython/commit/17524b084b565b321b4671f50a62864ea907b24f commit: 17524b084b565b321b4671f50a62864ea907b24f branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-18T14:30:00-07:00 summary: gh-92812: Align ArgumentParser.add_subparsers() docs with argument spec (GH-92814) (cherry picked from commit f2d994da104eed38f9e110e7d8f37fa6d845b207) Co-authored-by: 180909 <734461790 at qq.com> files: M Doc/library/argparse.rst diff --git a/Doc/library/argparse.rst b/Doc/library/argparse.rst index e8e54d6c58df3..d96f17b80a5f0 100644 --- a/Doc/library/argparse.rst +++ b/Doc/library/argparse.rst @@ -1615,7 +1615,7 @@ Sub-commands .. method:: ArgumentParser.add_subparsers([title], [description], [prog], \ [parser_class], [action], \ - [option_string], [dest], [required], \ + [option_strings], [dest], [required], \ [help], [metavar]) Many programs split up their functionality into a number of sub-commands, From webhook-mailer at python.org Wed May 18 22:43:11 2022 From: webhook-mailer at python.org (methane) Date: Thu, 19 May 2022 02:43:11 -0000 Subject: [Python-checkins] gh-87901: Remove the encoding argument from os.popen (GH-92836) Message-ID: https://github.com/python/cpython/commit/96f65835f8f66d058b444e0b4e436af45e2902f7 commit: 96f65835f8f66d058b444e0b4e436af45e2902f7 branch: main author: Inada Naoki committer: methane date: 2022-05-19T11:42:43+09:00 summary: gh-87901: Remove the encoding argument from os.popen (GH-92836) files: A Misc/NEWS.d/next/Library/2022-05-18-21-04-09.gh-issue-87901.lnf041.rst M Doc/library/os.rst M Lib/os.py diff --git a/Doc/library/os.rst b/Doc/library/os.rst index 3c189bb40e234..dc0f2e4158ac0 100644 --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -3916,13 +3916,13 @@ written in Python, such as a mail server's external command delivery program. .. availability:: Unix. -.. function:: popen(cmd, mode='r', buffering=-1, encoding=None) +.. function:: popen(cmd, mode='r', buffering=-1) Open a pipe to or from command *cmd*. The return value is an open file object connected to the pipe, which can be read or written depending on whether *mode* is ``'r'`` (default) or ``'w'``. - The *buffering* and *encoding* arguments have the same meaning as + The *buffering* argument have the same meaning as the corresponding argument to the built-in :func:`open` function. The returned file object reads or writes text strings rather than bytes. @@ -3945,8 +3945,13 @@ written in Python, such as a mail server's external command delivery program. documentation for more powerful ways to manage and communicate with subprocesses. - .. versionchanged:: 3.11 - Added the *encoding* parameter. + .. note:: + The :ref:`Python UTF-8 Mode ` affects encodings used + for *cmd* and pipe contents. + + :func:`popen` is a simple wrapper around :class:`subprocess.Popen`. + Use :class:`subprocess.Popen` or :func:`subprocess.run` to + control options like encodings. .. function:: posix_spawn(path, argv, env, *, file_actions=None, \ diff --git a/Lib/os.py b/Lib/os.py index 67662ca7ad858..648188e0f1349 100644 --- a/Lib/os.py +++ b/Lib/os.py @@ -974,15 +974,14 @@ def spawnlpe(mode, file, *args): # command in a shell can't be supported. if sys.platform != 'vxworks': # Supply os.popen() - def popen(cmd, mode="r", buffering=-1, encoding=None): + def popen(cmd, mode="r", buffering=-1): if not isinstance(cmd, str): raise TypeError("invalid cmd type (%s, expected string)" % type(cmd)) if mode not in ("r", "w"): raise ValueError("invalid mode %r" % mode) if buffering == 0 or buffering is None: raise ValueError("popen() does not support unbuffered streams") - import subprocess, io - encoding = io.text_encoding(encoding) + import subprocess if mode == "r": proc = subprocess.Popen(cmd, shell=True, text=True, diff --git a/Misc/NEWS.d/next/Library/2022-05-18-21-04-09.gh-issue-87901.lnf041.rst b/Misc/NEWS.d/next/Library/2022-05-18-21-04-09.gh-issue-87901.lnf041.rst new file mode 100644 index 0000000000000..3488541eb3d77 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-05-18-21-04-09.gh-issue-87901.lnf041.rst @@ -0,0 +1,2 @@ +Removed the ``encoding`` argument from :func:`os.popen` that was added in +3.11b1. From webhook-mailer at python.org Wed May 18 23:13:07 2022 From: webhook-mailer at python.org (miss-islington) Date: Thu, 19 May 2022 03:13:07 -0000 Subject: [Python-checkins] gh-87901: Remove the encoding argument from os.popen (GH-92836) Message-ID: https://github.com/python/cpython/commit/aa55985aa85ebad5409ed5485fd4957d5ca28f94 commit: aa55985aa85ebad5409ed5485fd4957d5ca28f94 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-18T20:12:47-07:00 summary: gh-87901: Remove the encoding argument from os.popen (GH-92836) (cherry picked from commit 96f65835f8f66d058b444e0b4e436af45e2902f7) Co-authored-by: Inada Naoki files: A Misc/NEWS.d/next/Library/2022-05-18-21-04-09.gh-issue-87901.lnf041.rst M Doc/library/os.rst M Lib/os.py diff --git a/Doc/library/os.rst b/Doc/library/os.rst index 3c189bb40e234..dc0f2e4158ac0 100644 --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -3916,13 +3916,13 @@ written in Python, such as a mail server's external command delivery program. .. availability:: Unix. -.. function:: popen(cmd, mode='r', buffering=-1, encoding=None) +.. function:: popen(cmd, mode='r', buffering=-1) Open a pipe to or from command *cmd*. The return value is an open file object connected to the pipe, which can be read or written depending on whether *mode* is ``'r'`` (default) or ``'w'``. - The *buffering* and *encoding* arguments have the same meaning as + The *buffering* argument have the same meaning as the corresponding argument to the built-in :func:`open` function. The returned file object reads or writes text strings rather than bytes. @@ -3945,8 +3945,13 @@ written in Python, such as a mail server's external command delivery program. documentation for more powerful ways to manage and communicate with subprocesses. - .. versionchanged:: 3.11 - Added the *encoding* parameter. + .. note:: + The :ref:`Python UTF-8 Mode ` affects encodings used + for *cmd* and pipe contents. + + :func:`popen` is a simple wrapper around :class:`subprocess.Popen`. + Use :class:`subprocess.Popen` or :func:`subprocess.run` to + control options like encodings. .. function:: posix_spawn(path, argv, env, *, file_actions=None, \ diff --git a/Lib/os.py b/Lib/os.py index 67662ca7ad858..648188e0f1349 100644 --- a/Lib/os.py +++ b/Lib/os.py @@ -974,15 +974,14 @@ def spawnlpe(mode, file, *args): # command in a shell can't be supported. if sys.platform != 'vxworks': # Supply os.popen() - def popen(cmd, mode="r", buffering=-1, encoding=None): + def popen(cmd, mode="r", buffering=-1): if not isinstance(cmd, str): raise TypeError("invalid cmd type (%s, expected string)" % type(cmd)) if mode not in ("r", "w"): raise ValueError("invalid mode %r" % mode) if buffering == 0 or buffering is None: raise ValueError("popen() does not support unbuffered streams") - import subprocess, io - encoding = io.text_encoding(encoding) + import subprocess if mode == "r": proc = subprocess.Popen(cmd, shell=True, text=True, diff --git a/Misc/NEWS.d/next/Library/2022-05-18-21-04-09.gh-issue-87901.lnf041.rst b/Misc/NEWS.d/next/Library/2022-05-18-21-04-09.gh-issue-87901.lnf041.rst new file mode 100644 index 0000000000000..3488541eb3d77 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-05-18-21-04-09.gh-issue-87901.lnf041.rst @@ -0,0 +1,2 @@ +Removed the ``encoding`` argument from :func:`os.popen` that was added in +3.11b1. From webhook-mailer at python.org Thu May 19 01:44:09 2022 From: webhook-mailer at python.org (serhiy-storchaka) Date: Thu, 19 May 2022 05:44:09 -0000 Subject: [Python-checkins] gh-92914: Round the allocated size for lists up to the even number (GH-92915) Message-ID: https://github.com/python/cpython/commit/8a6af5a34642f5564220eb50d72caada8f17fc78 commit: 8a6af5a34642f5564220eb50d72caada8f17fc78 branch: main author: Serhiy Storchaka committer: serhiy-storchaka date: 2022-05-19T08:43:50+03:00 summary: gh-92914: Round the allocated size for lists up to the even number (GH-92915) files: A Misc/NEWS.d/next/Core and Builtins/2022-05-18-08-32-33.gh-issue-92914.tJUeTD.rst M Lib/test/test_sys.py M Objects/listobject.c diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py index 9c0f4a69289d2..94a09ff549331 100644 --- a/Lib/test/test_sys.py +++ b/Lib/test/test_sys.py @@ -1432,9 +1432,10 @@ def get_gen(): yield 1 import re check(re.finditer('',''), size('2P')) # list - samples = [[], [1,2,3], ['1', '2', '3']] - for sample in samples: - check(list(sample), vsize('Pn') + len(sample)*self.P) + check(list([]), vsize('Pn')) + check(list([1]), vsize('Pn') + 2*self.P) + check(list([1, 2]), vsize('Pn') + 2*self.P) + check(list([1, 2, 3]), vsize('Pn') + 4*self.P) # sortwrapper (list) # XXX # cmpwrapper (list) diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-18-08-32-33.gh-issue-92914.tJUeTD.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-18-08-32-33.gh-issue-92914.tJUeTD.rst new file mode 100644 index 0000000000000..1242a15c029dc --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-05-18-08-32-33.gh-issue-92914.tJUeTD.rst @@ -0,0 +1 @@ +Always round the allocated size for lists up to the nearest even number. diff --git a/Objects/listobject.c b/Objects/listobject.c index b50623ed73d94..0a99ec919b8c8 100644 --- a/Objects/listobject.c +++ b/Objects/listobject.c @@ -94,6 +94,12 @@ list_preallocate_exact(PyListObject *self, Py_ssize_t size) assert(self->ob_item == NULL); assert(size > 0); + /* Since the Python memory allocator has granularity of 16 bytes on 64-bit + * platforms (8 on 32-bit), there is no benefit of allocating space for + * the odd number of items, and there is no drawback of rounding the + * allocated size up to the nearest even number. + */ + size = (size + 1) & ~(size_t)1; PyObject **items = PyMem_New(PyObject*, size); if (items == NULL) { PyErr_NoMemory(); From webhook-mailer at python.org Thu May 19 03:12:48 2022 From: webhook-mailer at python.org (Fidget-Spinner) Date: Thu, 19 May 2022 07:12:48 -0000 Subject: [Python-checkins] Include ``asyncio.Barrier`` in 3.11 Whats New (GH-92927) Message-ID: https://github.com/python/cpython/commit/60ee61571a60bcf4e40a4074e8db356b5af793c1 commit: 60ee61571a60bcf4e40a4074e8db356b5af793c1 branch: main author: Duprat committer: Fidget-Spinner date: 2022-05-19T15:12:33+08:00 summary: Include ``asyncio.Barrier`` in 3.11 Whats New (GH-92927) files: M Doc/whatsnew/3.11.rst diff --git a/Doc/whatsnew/3.11.rst b/Doc/whatsnew/3.11.rst index 97dd096731f0c..0cbb0ba77217f 100644 --- a/Doc/whatsnew/3.11.rst +++ b/Doc/whatsnew/3.11.rst @@ -431,6 +431,10 @@ asyncio existing stream-based connections to TLS. (Contributed by Ian Good in :issue:`34975`.) +* Add :class:`~asyncio.Barrier` class to the synchronization primitives of + the asyncio library. (Contributed by Yves Duprat and Andrew Svetlov in + :gh:`87518`.) + datetime -------- From webhook-mailer at python.org Thu May 19 04:59:58 2022 From: webhook-mailer at python.org (miss-islington) Date: Thu, 19 May 2022 08:59:58 -0000 Subject: [Python-checkins] Include ``asyncio.Barrier`` in 3.11 Whats New (GH-92927) Message-ID: https://github.com/python/cpython/commit/482e334dafb985433e5b904e8dc1ddcc41e44194 commit: 482e334dafb985433e5b904e8dc1ddcc41e44194 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-19T01:59:49-07:00 summary: Include ``asyncio.Barrier`` in 3.11 Whats New (GH-92927) (cherry picked from commit 60ee61571a60bcf4e40a4074e8db356b5af793c1) Co-authored-by: Duprat files: M Doc/whatsnew/3.11.rst diff --git a/Doc/whatsnew/3.11.rst b/Doc/whatsnew/3.11.rst index 97dd096731f0c..0cbb0ba77217f 100644 --- a/Doc/whatsnew/3.11.rst +++ b/Doc/whatsnew/3.11.rst @@ -431,6 +431,10 @@ asyncio existing stream-based connections to TLS. (Contributed by Ian Good in :issue:`34975`.) +* Add :class:`~asyncio.Barrier` class to the synchronization primitives of + the asyncio library. (Contributed by Yves Duprat and Andrew Svetlov in + :gh:`87518`.) + datetime -------- From webhook-mailer at python.org Thu May 19 05:17:52 2022 From: webhook-mailer at python.org (erlend-aasland) Date: Thu, 19 May 2022 09:17:52 -0000 Subject: [Python-checkins] gh-92670: Skip test_shutil.TestCopy.test_copyfile_nonexistent_dir on AIX (#92718) Message-ID: https://github.com/python/cpython/commit/654032ac5f6982b36d45e024037f37fb65166aed commit: 654032ac5f6982b36d45e024037f37fb65166aed branch: main author: Ayappan Perumal committer: erlend-aasland date: 2022-05-19T11:17:44+02:00 summary: gh-92670: Skip test_shutil.TestCopy.test_copyfile_nonexistent_dir on AIX (#92718) files: A Misc/NEWS.d/next/Tests/2022-05-12-05-51-06.gh-issue-92670.7L43Z_.rst M Lib/test/test_shutil.py diff --git a/Lib/test/test_shutil.py b/Lib/test/test_shutil.py index 7003386345280..a61bb126e4e73 100644 --- a/Lib/test/test_shutil.py +++ b/Lib/test/test_shutil.py @@ -1294,6 +1294,10 @@ def test_copyfile_same_file(self): self.assertEqual(read_file(src_file), 'foo') @unittest.skipIf(MACOS or SOLARIS or _winapi, 'On MACOS, Solaris and Windows the errors are not confusing (though different)') + # gh-92670: The test uses a trailing slash to force the OS consider + # the path as a directory, but on AIX the trailing slash has no effect + # and is considered as a file. + @unittest.skipIf(AIX, 'Not valid on AIX, see gh-92670') def test_copyfile_nonexistent_dir(self): # Issue 43219 src_dir = self.mkdtemp() diff --git a/Misc/NEWS.d/next/Tests/2022-05-12-05-51-06.gh-issue-92670.7L43Z_.rst b/Misc/NEWS.d/next/Tests/2022-05-12-05-51-06.gh-issue-92670.7L43Z_.rst new file mode 100644 index 0000000000000..c1349519e7c37 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2022-05-12-05-51-06.gh-issue-92670.7L43Z_.rst @@ -0,0 +1,3 @@ +Skip ``test_shutil.TestCopy.test_copyfile_nonexistent_dir`` test on AIX as the test uses a trailing +slash to force the OS consider the path as a directory, but on AIX the +trailing slash has no effect and is considered as a file. From webhook-mailer at python.org Thu May 19 05:22:32 2022 From: webhook-mailer at python.org (erlend-aasland) Date: Thu, 19 May 2022 09:22:32 -0000 Subject: [Python-checkins] Doc: amend ssl.PROTOCOL_SSLv2 and ssl.PROTOCOL_SSLv3 wording (#92634) Message-ID: https://github.com/python/cpython/commit/41638967a0e0bf1114c9bba9454d081605b49009 commit: 41638967a0e0bf1114c9bba9454d081605b49009 branch: main author: Jan Brasna <1784648+janbrasna at users.noreply.github.com> committer: erlend-aasland date: 2022-05-19T11:22:16+02:00 summary: Doc: amend ssl.PROTOCOL_SSLv2 and ssl.PROTOCOL_SSLv3 wording (#92634) files: M Doc/library/ssl.rst diff --git a/Doc/library/ssl.rst b/Doc/library/ssl.rst index 54bd335282699..c7ca4395ed96c 100644 --- a/Doc/library/ssl.rst +++ b/Doc/library/ssl.rst @@ -714,7 +714,7 @@ Constants Selects SSL version 2 as the channel encryption protocol. This protocol is not available if OpenSSL is compiled with the - ``OPENSSL_NO_SSL2`` flag. + ``no-ssl2`` option. .. warning:: @@ -728,8 +728,8 @@ Constants Selects SSL version 3 as the channel encryption protocol. - This protocol is not be available if OpenSSL is compiled with the - ``OPENSSL_NO_SSLv3`` flag. + This protocol is not available if OpenSSL is compiled with the + ``no-ssl3`` option. .. warning:: From webhook-mailer at python.org Thu May 19 05:38:24 2022 From: webhook-mailer at python.org (miss-islington) Date: Thu, 19 May 2022 09:38:24 -0000 Subject: [Python-checkins] Doc: amend ssl.PROTOCOL_SSLv2 and ssl.PROTOCOL_SSLv3 wording (GH-92634) Message-ID: https://github.com/python/cpython/commit/17a62d1e59464518c6f3c5f1a3126b974ecbc5c7 commit: 17a62d1e59464518c6f3c5f1a3126b974ecbc5c7 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-19T02:37:57-07:00 summary: Doc: amend ssl.PROTOCOL_SSLv2 and ssl.PROTOCOL_SSLv3 wording (GH-92634) (cherry picked from commit 41638967a0e0bf1114c9bba9454d081605b49009) Co-authored-by: Jan Brasna <1784648+janbrasna at users.noreply.github.com> files: M Doc/library/ssl.rst diff --git a/Doc/library/ssl.rst b/Doc/library/ssl.rst index 54bd335282699..c7ca4395ed96c 100644 --- a/Doc/library/ssl.rst +++ b/Doc/library/ssl.rst @@ -714,7 +714,7 @@ Constants Selects SSL version 2 as the channel encryption protocol. This protocol is not available if OpenSSL is compiled with the - ``OPENSSL_NO_SSL2`` flag. + ``no-ssl2`` option. .. warning:: @@ -728,8 +728,8 @@ Constants Selects SSL version 3 as the channel encryption protocol. - This protocol is not be available if OpenSSL is compiled with the - ``OPENSSL_NO_SSLv3`` flag. + This protocol is not available if OpenSSL is compiled with the + ``no-ssl3`` option. .. warning:: From webhook-mailer at python.org Thu May 19 05:40:47 2022 From: webhook-mailer at python.org (miss-islington) Date: Thu, 19 May 2022 09:40:47 -0000 Subject: [Python-checkins] Doc: amend ssl.PROTOCOL_SSLv2 and ssl.PROTOCOL_SSLv3 wording (GH-92634) Message-ID: https://github.com/python/cpython/commit/3e534b464af77cade6295d1f18619f33c8b7ba70 commit: 3e534b464af77cade6295d1f18619f33c8b7ba70 branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-19T02:40:39-07:00 summary: Doc: amend ssl.PROTOCOL_SSLv2 and ssl.PROTOCOL_SSLv3 wording (GH-92634) (cherry picked from commit 41638967a0e0bf1114c9bba9454d081605b49009) Co-authored-by: Jan Brasna <1784648+janbrasna at users.noreply.github.com> files: M Doc/library/ssl.rst diff --git a/Doc/library/ssl.rst b/Doc/library/ssl.rst index 19d983bcfe28d..afb3e356db89a 100644 --- a/Doc/library/ssl.rst +++ b/Doc/library/ssl.rst @@ -714,7 +714,7 @@ Constants Selects SSL version 2 as the channel encryption protocol. This protocol is not available if OpenSSL is compiled with the - ``OPENSSL_NO_SSL2`` flag. + ``no-ssl2`` option. .. warning:: @@ -728,8 +728,8 @@ Constants Selects SSL version 3 as the channel encryption protocol. - This protocol is not be available if OpenSSL is compiled with the - ``OPENSSL_NO_SSLv3`` flag. + This protocol is not available if OpenSSL is compiled with the + ``no-ssl3`` option. .. warning:: From webhook-mailer at python.org Thu May 19 05:50:47 2022 From: webhook-mailer at python.org (miss-islington) Date: Thu, 19 May 2022 09:50:47 -0000 Subject: [Python-checkins] gh-92670: Skip test_shutil.TestCopy.test_copyfile_nonexistent_dir on AIX (GH-92718) Message-ID: https://github.com/python/cpython/commit/ad2363d54c8647b949d4e2533d6b96b83c584904 commit: ad2363d54c8647b949d4e2533d6b96b83c584904 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-19T02:50:39-07:00 summary: gh-92670: Skip test_shutil.TestCopy.test_copyfile_nonexistent_dir on AIX (GH-92718) (cherry picked from commit 654032ac5f6982b36d45e024037f37fb65166aed) Co-authored-by: Ayappan Perumal files: A Misc/NEWS.d/next/Tests/2022-05-12-05-51-06.gh-issue-92670.7L43Z_.rst M Lib/test/test_shutil.py diff --git a/Lib/test/test_shutil.py b/Lib/test/test_shutil.py index 7003386345280..a61bb126e4e73 100644 --- a/Lib/test/test_shutil.py +++ b/Lib/test/test_shutil.py @@ -1294,6 +1294,10 @@ def test_copyfile_same_file(self): self.assertEqual(read_file(src_file), 'foo') @unittest.skipIf(MACOS or SOLARIS or _winapi, 'On MACOS, Solaris and Windows the errors are not confusing (though different)') + # gh-92670: The test uses a trailing slash to force the OS consider + # the path as a directory, but on AIX the trailing slash has no effect + # and is considered as a file. + @unittest.skipIf(AIX, 'Not valid on AIX, see gh-92670') def test_copyfile_nonexistent_dir(self): # Issue 43219 src_dir = self.mkdtemp() diff --git a/Misc/NEWS.d/next/Tests/2022-05-12-05-51-06.gh-issue-92670.7L43Z_.rst b/Misc/NEWS.d/next/Tests/2022-05-12-05-51-06.gh-issue-92670.7L43Z_.rst new file mode 100644 index 0000000000000..c1349519e7c37 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2022-05-12-05-51-06.gh-issue-92670.7L43Z_.rst @@ -0,0 +1,3 @@ +Skip ``test_shutil.TestCopy.test_copyfile_nonexistent_dir`` test on AIX as the test uses a trailing +slash to force the OS consider the path as a directory, but on AIX the +trailing slash has no effect and is considered as a file. From webhook-mailer at python.org Thu May 19 05:52:47 2022 From: webhook-mailer at python.org (miss-islington) Date: Thu, 19 May 2022 09:52:47 -0000 Subject: [Python-checkins] gh-92670: Skip test_shutil.TestCopy.test_copyfile_nonexistent_dir on AIX (GH-92718) Message-ID: https://github.com/python/cpython/commit/56c8d7cc83fbc944b78b7685828f1990fbd017da commit: 56c8d7cc83fbc944b78b7685828f1990fbd017da branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-19T02:52:41-07:00 summary: gh-92670: Skip test_shutil.TestCopy.test_copyfile_nonexistent_dir on AIX (GH-92718) (cherry picked from commit 654032ac5f6982b36d45e024037f37fb65166aed) Co-authored-by: Ayappan Perumal files: A Misc/NEWS.d/next/Tests/2022-05-12-05-51-06.gh-issue-92670.7L43Z_.rst M Lib/test/test_shutil.py diff --git a/Lib/test/test_shutil.py b/Lib/test/test_shutil.py index 7669b94ac35a6..f1d8f5a8b637f 100644 --- a/Lib/test/test_shutil.py +++ b/Lib/test/test_shutil.py @@ -1273,6 +1273,10 @@ def test_copyfile_same_file(self): self.assertEqual(read_file(src_file), 'foo') @unittest.skipIf(MACOS or SOLARIS or _winapi, 'On MACOS, Solaris and Windows the errors are not confusing (though different)') + # gh-92670: The test uses a trailing slash to force the OS consider + # the path as a directory, but on AIX the trailing slash has no effect + # and is considered as a file. + @unittest.skipIf(AIX, 'Not valid on AIX, see gh-92670') def test_copyfile_nonexistent_dir(self): # Issue 43219 src_dir = self.mkdtemp() diff --git a/Misc/NEWS.d/next/Tests/2022-05-12-05-51-06.gh-issue-92670.7L43Z_.rst b/Misc/NEWS.d/next/Tests/2022-05-12-05-51-06.gh-issue-92670.7L43Z_.rst new file mode 100644 index 0000000000000..c1349519e7c37 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2022-05-12-05-51-06.gh-issue-92670.7L43Z_.rst @@ -0,0 +1,3 @@ +Skip ``test_shutil.TestCopy.test_copyfile_nonexistent_dir`` test on AIX as the test uses a trailing +slash to force the OS consider the path as a directory, but on AIX the +trailing slash has no effect and is considered as a file. From webhook-mailer at python.org Thu May 19 06:05:37 2022 From: webhook-mailer at python.org (markshannon) Date: Thu, 19 May 2022 10:05:37 -0000 Subject: [Python-checkins] GH-90690: Remove `PRECALL` instruction (GH-92925) Message-ID: https://github.com/python/cpython/commit/e48ac9c1003c3816198cbfb6132a995150f9b048 commit: e48ac9c1003c3816198cbfb6132a995150f9b048 branch: main author: Mark Shannon committer: markshannon date: 2022-05-19T11:05:26+01:00 summary: GH-90690: Remove `PRECALL` instruction (GH-92925) files: A Misc/NEWS.d/next/Core and Builtins/2022-05-18-12-55-35.gh-issue-90690.TKuoTa.rst M Doc/library/dis.rst M Include/internal/pycore_code.h M Include/internal/pycore_opcode.h M Include/opcode.h M Lib/importlib/_bootstrap_external.py M Lib/opcode.py M Lib/test/test_compile.py M Lib/test/test_dis.py M Programs/test_frozenmain.h M Python/ceval.c M Python/compile.c M Python/opcode_targets.h M Python/specialize.c diff --git a/Doc/library/dis.rst b/Doc/library/dis.rst index 08e6c736d3e3c..027db0153bea4 100644 --- a/Doc/library/dis.rst +++ b/Doc/library/dis.rst @@ -45,9 +45,8 @@ the following command can be used to display the disassembly of 2 2 PUSH_NULL 4 LOAD_GLOBAL 1 (NULL + len) 6 LOAD_FAST 0 (alist) - 8 PRECALL 1 - 10 CALL 1 - 12 RETURN_VALUE + 8 CALL 1 + 18 RETURN_VALUE (The "2" is a line number). @@ -119,7 +118,6 @@ Example:: PUSH_NULL LOAD_GLOBAL LOAD_FAST - PRECALL CALL RETURN_VALUE @@ -1182,15 +1180,6 @@ iterations of the loop. .. versionadded:: 3.7 -.. opcode:: PRECALL (argc) - - Prefixes :opcode:`CALL`. Logically this is a no op. - It exists to enable effective specialization of calls. - ``argc`` is the number of arguments as described in :opcode:`CALL`. - - .. versionadded:: 3.11 - - .. opcode:: PUSH_NULL Pushes a ``NULL`` to the stack. @@ -1202,7 +1191,7 @@ iterations of the loop. .. opcode:: KW_NAMES (i) - Prefixes :opcode:`PRECALL`. + Prefixes :opcode:`CALL`. Stores a reference to ``co_consts[consti]`` into an internal variable for use by :opcode:`CALL`. ``co_consts[consti]`` must be a tuple of strings. diff --git a/Include/internal/pycore_code.h b/Include/internal/pycore_code.h index 96cc9dcae11a7..3d19843274112 100644 --- a/Include/internal/pycore_code.h +++ b/Include/internal/pycore_code.h @@ -80,12 +80,6 @@ typedef struct { #define INLINE_CACHE_ENTRIES_CALL CACHE_ENTRIES(_PyCallCache) -typedef struct { - _Py_CODEUNIT counter; -} _PyPrecallCache; - -#define INLINE_CACHE_ENTRIES_PRECALL CACHE_ENTRIES(_PyPrecallCache) - typedef struct { _Py_CODEUNIT counter; } _PyStoreSubscrCache; @@ -249,8 +243,6 @@ extern int _Py_Specialize_BinarySubscr(PyObject *sub, PyObject *container, _Py_C extern int _Py_Specialize_StoreSubscr(PyObject *container, PyObject *sub, _Py_CODEUNIT *instr); extern int _Py_Specialize_Call(PyObject *callable, _Py_CODEUNIT *instr, int nargs, PyObject *kwnames); -extern int _Py_Specialize_Precall(PyObject *callable, _Py_CODEUNIT *instr, - int nargs, PyObject *kwnames, int oparg); extern void _Py_Specialize_BinaryOp(PyObject *lhs, PyObject *rhs, _Py_CODEUNIT *instr, int oparg, PyObject **locals); extern void _Py_Specialize_CompareOp(PyObject *lhs, PyObject *rhs, diff --git a/Include/internal/pycore_opcode.h b/Include/internal/pycore_opcode.h index 09f6501467133..17a68f030b084 100644 --- a/Include/internal/pycore_opcode.h +++ b/Include/internal/pycore_opcode.h @@ -50,7 +50,6 @@ const uint8_t _PyOpcode_Caches[256] = { [LOAD_GLOBAL] = 5, [BINARY_OP] = 1, [LOAD_METHOD] = 10, - [PRECALL] = 1, [CALL] = 4, }; @@ -84,7 +83,22 @@ const uint8_t _PyOpcode_Deopt[256] = { [CACHE] = CACHE, [CALL] = CALL, [CALL_ADAPTIVE] = CALL, + [CALL_BOUND_METHOD_EXACT_ARGS] = CALL, + [CALL_BUILTIN_CLASS] = CALL, + [CALL_BUILTIN_FAST_WITH_KEYWORDS] = CALL, [CALL_FUNCTION_EX] = CALL_FUNCTION_EX, + [CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS] = CALL, + [CALL_NO_KW_BUILTIN_FAST] = CALL, + [CALL_NO_KW_BUILTIN_O] = CALL, + [CALL_NO_KW_ISINSTANCE] = CALL, + [CALL_NO_KW_LEN] = CALL, + [CALL_NO_KW_LIST_APPEND] = CALL, + [CALL_NO_KW_METHOD_DESCRIPTOR_FAST] = CALL, + [CALL_NO_KW_METHOD_DESCRIPTOR_NOARGS] = CALL, + [CALL_NO_KW_METHOD_DESCRIPTOR_O] = CALL, + [CALL_NO_KW_STR_1] = CALL, + [CALL_NO_KW_TUPLE_1] = CALL, + [CALL_NO_KW_TYPE_1] = CALL, [CALL_PY_EXACT_ARGS] = CALL, [CALL_PY_WITH_DEFAULTS] = CALL, [CHECK_EG_MATCH] = CHECK_EG_MATCH, @@ -176,24 +190,6 @@ const uint8_t _PyOpcode_Deopt[256] = { [POP_JUMP_FORWARD_IF_NOT_NONE] = POP_JUMP_FORWARD_IF_NOT_NONE, [POP_JUMP_FORWARD_IF_TRUE] = POP_JUMP_FORWARD_IF_TRUE, [POP_TOP] = POP_TOP, - [PRECALL] = PRECALL, - [PRECALL_ADAPTIVE] = PRECALL, - [PRECALL_BOUND_METHOD] = PRECALL, - [PRECALL_BUILTIN_CLASS] = PRECALL, - [PRECALL_BUILTIN_FAST_WITH_KEYWORDS] = PRECALL, - [PRECALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS] = PRECALL, - [PRECALL_NO_KW_BUILTIN_FAST] = PRECALL, - [PRECALL_NO_KW_BUILTIN_O] = PRECALL, - [PRECALL_NO_KW_ISINSTANCE] = PRECALL, - [PRECALL_NO_KW_LEN] = PRECALL, - [PRECALL_NO_KW_LIST_APPEND] = PRECALL, - [PRECALL_NO_KW_METHOD_DESCRIPTOR_FAST] = PRECALL, - [PRECALL_NO_KW_METHOD_DESCRIPTOR_NOARGS] = PRECALL, - [PRECALL_NO_KW_METHOD_DESCRIPTOR_O] = PRECALL, - [PRECALL_NO_KW_STR_1] = PRECALL, - [PRECALL_NO_KW_TUPLE_1] = PRECALL, - [PRECALL_NO_KW_TYPE_1] = PRECALL, - [PRECALL_PYFUNC] = PRECALL, [PREP_RERAISE_STAR] = PREP_RERAISE_STAR, [PRINT_EXPR] = PRINT_EXPR, [PUSH_EXC_INFO] = PUSH_EXC_INFO, @@ -268,7 +264,22 @@ const uint8_t _PyOpcode_Original[256] = { [CACHE] = CACHE, [CALL] = CALL, [CALL_ADAPTIVE] = CALL, + [CALL_BOUND_METHOD_EXACT_ARGS] = CALL, + [CALL_BUILTIN_CLASS] = CALL, + [CALL_BUILTIN_FAST_WITH_KEYWORDS] = CALL, [CALL_FUNCTION_EX] = CALL_FUNCTION_EX, + [CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS] = CALL, + [CALL_NO_KW_BUILTIN_FAST] = CALL, + [CALL_NO_KW_BUILTIN_O] = CALL, + [CALL_NO_KW_ISINSTANCE] = CALL, + [CALL_NO_KW_LEN] = CALL, + [CALL_NO_KW_LIST_APPEND] = CALL, + [CALL_NO_KW_METHOD_DESCRIPTOR_FAST] = CALL, + [CALL_NO_KW_METHOD_DESCRIPTOR_NOARGS] = CALL, + [CALL_NO_KW_METHOD_DESCRIPTOR_O] = CALL, + [CALL_NO_KW_STR_1] = CALL, + [CALL_NO_KW_TUPLE_1] = CALL, + [CALL_NO_KW_TYPE_1] = CALL, [CALL_PY_EXACT_ARGS] = CALL, [CALL_PY_WITH_DEFAULTS] = CALL, [CHECK_EG_MATCH] = CHECK_EG_MATCH, @@ -360,24 +371,6 @@ const uint8_t _PyOpcode_Original[256] = { [POP_JUMP_FORWARD_IF_NOT_NONE] = POP_JUMP_FORWARD_IF_NOT_NONE, [POP_JUMP_FORWARD_IF_TRUE] = POP_JUMP_FORWARD_IF_TRUE, [POP_TOP] = POP_TOP, - [PRECALL] = PRECALL, - [PRECALL_ADAPTIVE] = PRECALL, - [PRECALL_BOUND_METHOD] = PRECALL, - [PRECALL_BUILTIN_CLASS] = PRECALL, - [PRECALL_BUILTIN_FAST_WITH_KEYWORDS] = PRECALL, - [PRECALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS] = PRECALL, - [PRECALL_NO_KW_BUILTIN_FAST] = PRECALL, - [PRECALL_NO_KW_BUILTIN_O] = PRECALL, - [PRECALL_NO_KW_ISINSTANCE] = PRECALL, - [PRECALL_NO_KW_LEN] = PRECALL, - [PRECALL_NO_KW_LIST_APPEND] = PRECALL, - [PRECALL_NO_KW_METHOD_DESCRIPTOR_FAST] = PRECALL, - [PRECALL_NO_KW_METHOD_DESCRIPTOR_NOARGS] = PRECALL, - [PRECALL_NO_KW_METHOD_DESCRIPTOR_O] = PRECALL, - [PRECALL_NO_KW_STR_1] = PRECALL, - [PRECALL_NO_KW_TUPLE_1] = PRECALL, - [PRECALL_NO_KW_TYPE_1] = PRECALL, - [PRECALL_PYFUNC] = PRECALL, [PREP_RERAISE_STAR] = PREP_RERAISE_STAR, [PRINT_EXPR] = PRINT_EXPR, [PUSH_EXC_INFO] = PUSH_EXC_INFO, @@ -451,62 +444,62 @@ static const char *const _PyOpcode_OpName[256] = { [CALL_PY_EXACT_ARGS] = "CALL_PY_EXACT_ARGS", [CALL_PY_WITH_DEFAULTS] = "CALL_PY_WITH_DEFAULTS", [BINARY_SUBSCR] = "BINARY_SUBSCR", - [COMPARE_OP_ADAPTIVE] = "COMPARE_OP_ADAPTIVE", - [COMPARE_OP_FLOAT_JUMP] = "COMPARE_OP_FLOAT_JUMP", - [COMPARE_OP_INT_JUMP] = "COMPARE_OP_INT_JUMP", - [COMPARE_OP_STR_JUMP] = "COMPARE_OP_STR_JUMP", + [CALL_BOUND_METHOD_EXACT_ARGS] = "CALL_BOUND_METHOD_EXACT_ARGS", + [CALL_BUILTIN_CLASS] = "CALL_BUILTIN_CLASS", + [CALL_BUILTIN_FAST_WITH_KEYWORDS] = "CALL_BUILTIN_FAST_WITH_KEYWORDS", + [CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS] = "CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS", [GET_LEN] = "GET_LEN", [MATCH_MAPPING] = "MATCH_MAPPING", [MATCH_SEQUENCE] = "MATCH_SEQUENCE", [MATCH_KEYS] = "MATCH_KEYS", - [EXTENDED_ARG_QUICK] = "EXTENDED_ARG_QUICK", + [CALL_NO_KW_BUILTIN_FAST] = "CALL_NO_KW_BUILTIN_FAST", [PUSH_EXC_INFO] = "PUSH_EXC_INFO", [CHECK_EXC_MATCH] = "CHECK_EXC_MATCH", [CHECK_EG_MATCH] = "CHECK_EG_MATCH", + [CALL_NO_KW_BUILTIN_O] = "CALL_NO_KW_BUILTIN_O", + [CALL_NO_KW_ISINSTANCE] = "CALL_NO_KW_ISINSTANCE", + [CALL_NO_KW_LEN] = "CALL_NO_KW_LEN", + [CALL_NO_KW_LIST_APPEND] = "CALL_NO_KW_LIST_APPEND", + [CALL_NO_KW_METHOD_DESCRIPTOR_FAST] = "CALL_NO_KW_METHOD_DESCRIPTOR_FAST", + [CALL_NO_KW_METHOD_DESCRIPTOR_NOARGS] = "CALL_NO_KW_METHOD_DESCRIPTOR_NOARGS", + [CALL_NO_KW_METHOD_DESCRIPTOR_O] = "CALL_NO_KW_METHOD_DESCRIPTOR_O", + [CALL_NO_KW_STR_1] = "CALL_NO_KW_STR_1", + [CALL_NO_KW_TUPLE_1] = "CALL_NO_KW_TUPLE_1", + [CALL_NO_KW_TYPE_1] = "CALL_NO_KW_TYPE_1", + [COMPARE_OP_ADAPTIVE] = "COMPARE_OP_ADAPTIVE", + [WITH_EXCEPT_START] = "WITH_EXCEPT_START", + [GET_AITER] = "GET_AITER", + [GET_ANEXT] = "GET_ANEXT", + [BEFORE_ASYNC_WITH] = "BEFORE_ASYNC_WITH", + [BEFORE_WITH] = "BEFORE_WITH", + [END_ASYNC_FOR] = "END_ASYNC_FOR", + [COMPARE_OP_FLOAT_JUMP] = "COMPARE_OP_FLOAT_JUMP", + [COMPARE_OP_INT_JUMP] = "COMPARE_OP_INT_JUMP", + [COMPARE_OP_STR_JUMP] = "COMPARE_OP_STR_JUMP", + [EXTENDED_ARG_QUICK] = "EXTENDED_ARG_QUICK", [JUMP_BACKWARD_QUICK] = "JUMP_BACKWARD_QUICK", + [STORE_SUBSCR] = "STORE_SUBSCR", + [DELETE_SUBSCR] = "DELETE_SUBSCR", [LOAD_ATTR_ADAPTIVE] = "LOAD_ATTR_ADAPTIVE", [LOAD_ATTR_INSTANCE_VALUE] = "LOAD_ATTR_INSTANCE_VALUE", [LOAD_ATTR_MODULE] = "LOAD_ATTR_MODULE", [LOAD_ATTR_SLOT] = "LOAD_ATTR_SLOT", [LOAD_ATTR_WITH_HINT] = "LOAD_ATTR_WITH_HINT", [LOAD_CONST__LOAD_FAST] = "LOAD_CONST__LOAD_FAST", + [GET_ITER] = "GET_ITER", + [GET_YIELD_FROM_ITER] = "GET_YIELD_FROM_ITER", + [PRINT_EXPR] = "PRINT_EXPR", + [LOAD_BUILD_CLASS] = "LOAD_BUILD_CLASS", [LOAD_FAST__LOAD_CONST] = "LOAD_FAST__LOAD_CONST", [LOAD_FAST__LOAD_FAST] = "LOAD_FAST__LOAD_FAST", + [LOAD_ASSERTION_ERROR] = "LOAD_ASSERTION_ERROR", + [RETURN_GENERATOR] = "RETURN_GENERATOR", [LOAD_GLOBAL_ADAPTIVE] = "LOAD_GLOBAL_ADAPTIVE", [LOAD_GLOBAL_BUILTIN] = "LOAD_GLOBAL_BUILTIN", - [WITH_EXCEPT_START] = "WITH_EXCEPT_START", - [GET_AITER] = "GET_AITER", - [GET_ANEXT] = "GET_ANEXT", - [BEFORE_ASYNC_WITH] = "BEFORE_ASYNC_WITH", - [BEFORE_WITH] = "BEFORE_WITH", - [END_ASYNC_FOR] = "END_ASYNC_FOR", [LOAD_GLOBAL_MODULE] = "LOAD_GLOBAL_MODULE", [LOAD_METHOD_ADAPTIVE] = "LOAD_METHOD_ADAPTIVE", [LOAD_METHOD_CLASS] = "LOAD_METHOD_CLASS", [LOAD_METHOD_MODULE] = "LOAD_METHOD_MODULE", - [LOAD_METHOD_NO_DICT] = "LOAD_METHOD_NO_DICT", - [STORE_SUBSCR] = "STORE_SUBSCR", - [DELETE_SUBSCR] = "DELETE_SUBSCR", - [LOAD_METHOD_WITH_DICT] = "LOAD_METHOD_WITH_DICT", - [LOAD_METHOD_WITH_VALUES] = "LOAD_METHOD_WITH_VALUES", - [PRECALL_ADAPTIVE] = "PRECALL_ADAPTIVE", - [PRECALL_BOUND_METHOD] = "PRECALL_BOUND_METHOD", - [PRECALL_BUILTIN_CLASS] = "PRECALL_BUILTIN_CLASS", - [PRECALL_BUILTIN_FAST_WITH_KEYWORDS] = "PRECALL_BUILTIN_FAST_WITH_KEYWORDS", - [GET_ITER] = "GET_ITER", - [GET_YIELD_FROM_ITER] = "GET_YIELD_FROM_ITER", - [PRINT_EXPR] = "PRINT_EXPR", - [LOAD_BUILD_CLASS] = "LOAD_BUILD_CLASS", - [PRECALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS] = "PRECALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS", - [PRECALL_NO_KW_BUILTIN_FAST] = "PRECALL_NO_KW_BUILTIN_FAST", - [LOAD_ASSERTION_ERROR] = "LOAD_ASSERTION_ERROR", - [RETURN_GENERATOR] = "RETURN_GENERATOR", - [PRECALL_NO_KW_BUILTIN_O] = "PRECALL_NO_KW_BUILTIN_O", - [PRECALL_NO_KW_ISINSTANCE] = "PRECALL_NO_KW_ISINSTANCE", - [PRECALL_NO_KW_LEN] = "PRECALL_NO_KW_LEN", - [PRECALL_NO_KW_LIST_APPEND] = "PRECALL_NO_KW_LIST_APPEND", - [PRECALL_NO_KW_METHOD_DESCRIPTOR_FAST] = "PRECALL_NO_KW_METHOD_DESCRIPTOR_FAST", - [PRECALL_NO_KW_METHOD_DESCRIPTOR_NOARGS] = "PRECALL_NO_KW_METHOD_DESCRIPTOR_NOARGS", [LIST_TO_TUPLE] = "LIST_TO_TUPLE", [RETURN_VALUE] = "RETURN_VALUE", [IMPORT_STAR] = "IMPORT_STAR", @@ -538,7 +531,7 @@ static const char *const _PyOpcode_OpName[256] = { [JUMP_FORWARD] = "JUMP_FORWARD", [JUMP_IF_FALSE_OR_POP] = "JUMP_IF_FALSE_OR_POP", [JUMP_IF_TRUE_OR_POP] = "JUMP_IF_TRUE_OR_POP", - [PRECALL_NO_KW_METHOD_DESCRIPTOR_O] = "PRECALL_NO_KW_METHOD_DESCRIPTOR_O", + [LOAD_METHOD_NO_DICT] = "LOAD_METHOD_NO_DICT", [POP_JUMP_FORWARD_IF_FALSE] = "POP_JUMP_FORWARD_IF_FALSE", [POP_JUMP_FORWARD_IF_TRUE] = "POP_JUMP_FORWARD_IF_TRUE", [LOAD_GLOBAL] = "LOAD_GLOBAL", @@ -546,13 +539,13 @@ static const char *const _PyOpcode_OpName[256] = { [CONTAINS_OP] = "CONTAINS_OP", [RERAISE] = "RERAISE", [COPY] = "COPY", - [PRECALL_NO_KW_STR_1] = "PRECALL_NO_KW_STR_1", + [LOAD_METHOD_WITH_DICT] = "LOAD_METHOD_WITH_DICT", [BINARY_OP] = "BINARY_OP", [SEND] = "SEND", [LOAD_FAST] = "LOAD_FAST", [STORE_FAST] = "STORE_FAST", [DELETE_FAST] = "DELETE_FAST", - [PRECALL_NO_KW_TUPLE_1] = "PRECALL_NO_KW_TUPLE_1", + [LOAD_METHOD_WITH_VALUES] = "LOAD_METHOD_WITH_VALUES", [POP_JUMP_FORWARD_IF_NOT_NONE] = "POP_JUMP_FORWARD_IF_NOT_NONE", [POP_JUMP_FORWARD_IF_NONE] = "POP_JUMP_FORWARD_IF_NONE", [RAISE_VARARGS] = "RAISE_VARARGS", @@ -566,46 +559,46 @@ static const char *const _PyOpcode_OpName[256] = { [STORE_DEREF] = "STORE_DEREF", [DELETE_DEREF] = "DELETE_DEREF", [JUMP_BACKWARD] = "JUMP_BACKWARD", - [PRECALL_NO_KW_TYPE_1] = "PRECALL_NO_KW_TYPE_1", + [RESUME_QUICK] = "RESUME_QUICK", [CALL_FUNCTION_EX] = "CALL_FUNCTION_EX", - [PRECALL_PYFUNC] = "PRECALL_PYFUNC", + [STORE_ATTR_ADAPTIVE] = "STORE_ATTR_ADAPTIVE", [EXTENDED_ARG] = "EXTENDED_ARG", [LIST_APPEND] = "LIST_APPEND", [SET_ADD] = "SET_ADD", [MAP_ADD] = "MAP_ADD", [LOAD_CLASSDEREF] = "LOAD_CLASSDEREF", [COPY_FREE_VARS] = "COPY_FREE_VARS", - [RESUME_QUICK] = "RESUME_QUICK", + [STORE_ATTR_INSTANCE_VALUE] = "STORE_ATTR_INSTANCE_VALUE", [RESUME] = "RESUME", [MATCH_CLASS] = "MATCH_CLASS", - [STORE_ATTR_ADAPTIVE] = "STORE_ATTR_ADAPTIVE", - [STORE_ATTR_INSTANCE_VALUE] = "STORE_ATTR_INSTANCE_VALUE", + [STORE_ATTR_SLOT] = "STORE_ATTR_SLOT", + [STORE_ATTR_WITH_HINT] = "STORE_ATTR_WITH_HINT", [FORMAT_VALUE] = "FORMAT_VALUE", [BUILD_CONST_KEY_MAP] = "BUILD_CONST_KEY_MAP", [BUILD_STRING] = "BUILD_STRING", - [STORE_ATTR_SLOT] = "STORE_ATTR_SLOT", - [STORE_ATTR_WITH_HINT] = "STORE_ATTR_WITH_HINT", - [LOAD_METHOD] = "LOAD_METHOD", [STORE_FAST__LOAD_FAST] = "STORE_FAST__LOAD_FAST", + [STORE_FAST__STORE_FAST] = "STORE_FAST__STORE_FAST", + [LOAD_METHOD] = "LOAD_METHOD", + [STORE_SUBSCR_ADAPTIVE] = "STORE_SUBSCR_ADAPTIVE", [LIST_EXTEND] = "LIST_EXTEND", [SET_UPDATE] = "SET_UPDATE", [DICT_MERGE] = "DICT_MERGE", [DICT_UPDATE] = "DICT_UPDATE", - [PRECALL] = "PRECALL", - [STORE_FAST__STORE_FAST] = "STORE_FAST__STORE_FAST", - [STORE_SUBSCR_ADAPTIVE] = "STORE_SUBSCR_ADAPTIVE", [STORE_SUBSCR_DICT] = "STORE_SUBSCR_DICT", [STORE_SUBSCR_LIST_INT] = "STORE_SUBSCR_LIST_INT", + [UNPACK_SEQUENCE_ADAPTIVE] = "UNPACK_SEQUENCE_ADAPTIVE", + [UNPACK_SEQUENCE_LIST] = "UNPACK_SEQUENCE_LIST", + [UNPACK_SEQUENCE_TUPLE] = "UNPACK_SEQUENCE_TUPLE", [CALL] = "CALL", [KW_NAMES] = "KW_NAMES", [POP_JUMP_BACKWARD_IF_NOT_NONE] = "POP_JUMP_BACKWARD_IF_NOT_NONE", [POP_JUMP_BACKWARD_IF_NONE] = "POP_JUMP_BACKWARD_IF_NONE", [POP_JUMP_BACKWARD_IF_FALSE] = "POP_JUMP_BACKWARD_IF_FALSE", [POP_JUMP_BACKWARD_IF_TRUE] = "POP_JUMP_BACKWARD_IF_TRUE", - [UNPACK_SEQUENCE_ADAPTIVE] = "UNPACK_SEQUENCE_ADAPTIVE", - [UNPACK_SEQUENCE_LIST] = "UNPACK_SEQUENCE_LIST", - [UNPACK_SEQUENCE_TUPLE] = "UNPACK_SEQUENCE_TUPLE", [UNPACK_SEQUENCE_TWO_TUPLE] = "UNPACK_SEQUENCE_TWO_TUPLE", + [178] = "<178>", + [179] = "<179>", + [180] = "<180>", [181] = "<181>", [182] = "<182>", [183] = "<183>", @@ -685,6 +678,9 @@ static const char *const _PyOpcode_OpName[256] = { #endif #define EXTRA_CASES \ + case 178: \ + case 179: \ + case 180: \ case 181: \ case 182: \ case 183: \ diff --git a/Include/opcode.h b/Include/opcode.h index 084d34b8c73cd..9a076e01c6530 100644 --- a/Include/opcode.h +++ b/Include/opcode.h @@ -112,7 +112,6 @@ extern "C" { #define SET_UPDATE 163 #define DICT_MERGE 164 #define DICT_UPDATE 165 -#define PRECALL 166 #define CALL 171 #define KW_NAMES 172 #define POP_JUMP_BACKWARD_IF_NOT_NONE 173 @@ -136,60 +135,58 @@ extern "C" { #define CALL_ADAPTIVE 22 #define CALL_PY_EXACT_ARGS 23 #define CALL_PY_WITH_DEFAULTS 24 -#define COMPARE_OP_ADAPTIVE 26 -#define COMPARE_OP_FLOAT_JUMP 27 -#define COMPARE_OP_INT_JUMP 28 -#define COMPARE_OP_STR_JUMP 29 -#define EXTENDED_ARG_QUICK 34 -#define JUMP_BACKWARD_QUICK 38 -#define LOAD_ATTR_ADAPTIVE 39 -#define LOAD_ATTR_INSTANCE_VALUE 40 -#define LOAD_ATTR_MODULE 41 -#define LOAD_ATTR_SLOT 42 -#define LOAD_ATTR_WITH_HINT 43 -#define LOAD_CONST__LOAD_FAST 44 -#define LOAD_FAST__LOAD_CONST 45 -#define LOAD_FAST__LOAD_FAST 46 -#define LOAD_GLOBAL_ADAPTIVE 47 -#define LOAD_GLOBAL_BUILTIN 48 -#define LOAD_GLOBAL_MODULE 55 -#define LOAD_METHOD_ADAPTIVE 56 -#define LOAD_METHOD_CLASS 57 -#define LOAD_METHOD_MODULE 58 -#define LOAD_METHOD_NO_DICT 59 -#define LOAD_METHOD_WITH_DICT 62 -#define LOAD_METHOD_WITH_VALUES 63 -#define PRECALL_ADAPTIVE 64 -#define PRECALL_BOUND_METHOD 65 -#define PRECALL_BUILTIN_CLASS 66 -#define PRECALL_BUILTIN_FAST_WITH_KEYWORDS 67 -#define PRECALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS 72 -#define PRECALL_NO_KW_BUILTIN_FAST 73 -#define PRECALL_NO_KW_BUILTIN_O 76 -#define PRECALL_NO_KW_ISINSTANCE 77 -#define PRECALL_NO_KW_LEN 78 -#define PRECALL_NO_KW_LIST_APPEND 79 -#define PRECALL_NO_KW_METHOD_DESCRIPTOR_FAST 80 -#define PRECALL_NO_KW_METHOD_DESCRIPTOR_NOARGS 81 -#define PRECALL_NO_KW_METHOD_DESCRIPTOR_O 113 -#define PRECALL_NO_KW_STR_1 121 -#define PRECALL_NO_KW_TUPLE_1 127 -#define PRECALL_NO_KW_TYPE_1 141 -#define PRECALL_PYFUNC 143 -#define RESUME_QUICK 150 -#define STORE_ATTR_ADAPTIVE 153 -#define STORE_ATTR_INSTANCE_VALUE 154 -#define STORE_ATTR_SLOT 158 -#define STORE_ATTR_WITH_HINT 159 -#define STORE_FAST__LOAD_FAST 161 -#define STORE_FAST__STORE_FAST 167 -#define STORE_SUBSCR_ADAPTIVE 168 -#define STORE_SUBSCR_DICT 169 -#define STORE_SUBSCR_LIST_INT 170 -#define UNPACK_SEQUENCE_ADAPTIVE 177 -#define UNPACK_SEQUENCE_LIST 178 -#define UNPACK_SEQUENCE_TUPLE 179 -#define UNPACK_SEQUENCE_TWO_TUPLE 180 +#define CALL_BOUND_METHOD_EXACT_ARGS 26 +#define CALL_BUILTIN_CLASS 27 +#define CALL_BUILTIN_FAST_WITH_KEYWORDS 28 +#define CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS 29 +#define CALL_NO_KW_BUILTIN_FAST 34 +#define CALL_NO_KW_BUILTIN_O 38 +#define CALL_NO_KW_ISINSTANCE 39 +#define CALL_NO_KW_LEN 40 +#define CALL_NO_KW_LIST_APPEND 41 +#define CALL_NO_KW_METHOD_DESCRIPTOR_FAST 42 +#define CALL_NO_KW_METHOD_DESCRIPTOR_NOARGS 43 +#define CALL_NO_KW_METHOD_DESCRIPTOR_O 44 +#define CALL_NO_KW_STR_1 45 +#define CALL_NO_KW_TUPLE_1 46 +#define CALL_NO_KW_TYPE_1 47 +#define COMPARE_OP_ADAPTIVE 48 +#define COMPARE_OP_FLOAT_JUMP 55 +#define COMPARE_OP_INT_JUMP 56 +#define COMPARE_OP_STR_JUMP 57 +#define EXTENDED_ARG_QUICK 58 +#define JUMP_BACKWARD_QUICK 59 +#define LOAD_ATTR_ADAPTIVE 62 +#define LOAD_ATTR_INSTANCE_VALUE 63 +#define LOAD_ATTR_MODULE 64 +#define LOAD_ATTR_SLOT 65 +#define LOAD_ATTR_WITH_HINT 66 +#define LOAD_CONST__LOAD_FAST 67 +#define LOAD_FAST__LOAD_CONST 72 +#define LOAD_FAST__LOAD_FAST 73 +#define LOAD_GLOBAL_ADAPTIVE 76 +#define LOAD_GLOBAL_BUILTIN 77 +#define LOAD_GLOBAL_MODULE 78 +#define LOAD_METHOD_ADAPTIVE 79 +#define LOAD_METHOD_CLASS 80 +#define LOAD_METHOD_MODULE 81 +#define LOAD_METHOD_NO_DICT 113 +#define LOAD_METHOD_WITH_DICT 121 +#define LOAD_METHOD_WITH_VALUES 127 +#define RESUME_QUICK 141 +#define STORE_ATTR_ADAPTIVE 143 +#define STORE_ATTR_INSTANCE_VALUE 150 +#define STORE_ATTR_SLOT 153 +#define STORE_ATTR_WITH_HINT 154 +#define STORE_FAST__LOAD_FAST 158 +#define STORE_FAST__STORE_FAST 159 +#define STORE_SUBSCR_ADAPTIVE 161 +#define STORE_SUBSCR_DICT 166 +#define STORE_SUBSCR_LIST_INT 167 +#define UNPACK_SEQUENCE_ADAPTIVE 168 +#define UNPACK_SEQUENCE_LIST 169 +#define UNPACK_SEQUENCE_TUPLE 170 +#define UNPACK_SEQUENCE_TWO_TUPLE 177 #define DO_TRACING 255 #define HAS_CONST(op) (false\ diff --git a/Lib/importlib/_bootstrap_external.py b/Lib/importlib/_bootstrap_external.py index 5f67226adfc52..e7941aeae059d 100644 --- a/Lib/importlib/_bootstrap_external.py +++ b/Lib/importlib/_bootstrap_external.py @@ -402,9 +402,11 @@ def _write_atomic(path, data, mode=0o666): # add JUMP_BACKWARD_NO_INTERRUPT, make JUMP_NO_INTERRUPT virtual) # Python 3.11a7 3492 (make POP_JUMP_IF_NONE/NOT_NONE/TRUE/FALSE relative) # Python 3.11a7 3493 (Make JUMP_IF_TRUE_OR_POP/JUMP_IF_FALSE_OR_POP relative) -# Python 3.11a7 3494 (New location info table) -# Python 3.12 will start with magic number 3500 +# Python 3.11a7 3494 (New location info table) +# Python 3.12a1 3500 (Remove PRECALL opcode) + +# Python 3.13 will start with 3550 # # MAGIC must change whenever the bytecode emitted by the compiler may no @@ -416,7 +418,7 @@ def _write_atomic(path, data, mode=0o666): # Whenever MAGIC_NUMBER is changed, the ranges in the magic_values array # in PC/launcher.c must also be updated. -MAGIC_NUMBER = (3494).to_bytes(2, 'little') + b'\r\n' +MAGIC_NUMBER = (3500).to_bytes(2, 'little') + b'\r\n' _RAW_MAGIC_NUMBER = int.from_bytes(MAGIC_NUMBER, 'little') # For import.c diff --git a/Lib/opcode.py b/Lib/opcode.py index 310582874dc8f..27e9ab17969ba 100644 --- a/Lib/opcode.py +++ b/Lib/opcode.py @@ -188,7 +188,6 @@ def jabs_op(name, op): def_op('SET_UPDATE', 163) def_op('DICT_MERGE', 164) def_op('DICT_UPDATE', 165) -def_op('PRECALL', 166) def_op('CALL', 171) def_op('KW_NAMES', 172) @@ -254,6 +253,21 @@ def jabs_op(name, op): "CALL_ADAPTIVE", "CALL_PY_EXACT_ARGS", "CALL_PY_WITH_DEFAULTS", + "CALL_BOUND_METHOD_EXACT_ARGS", + "CALL_BUILTIN_CLASS", + "CALL_BUILTIN_FAST_WITH_KEYWORDS", + "CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS", + "CALL_NO_KW_BUILTIN_FAST", + "CALL_NO_KW_BUILTIN_O", + "CALL_NO_KW_ISINSTANCE", + "CALL_NO_KW_LEN", + "CALL_NO_KW_LIST_APPEND", + "CALL_NO_KW_METHOD_DESCRIPTOR_FAST", + "CALL_NO_KW_METHOD_DESCRIPTOR_NOARGS", + "CALL_NO_KW_METHOD_DESCRIPTOR_O", + "CALL_NO_KW_STR_1", + "CALL_NO_KW_TUPLE_1", + "CALL_NO_KW_TYPE_1", ], "COMPARE_OP": [ "COMPARE_OP_ADAPTIVE", @@ -294,25 +308,6 @@ def jabs_op(name, op): "LOAD_METHOD_WITH_DICT", "LOAD_METHOD_WITH_VALUES", ], - "PRECALL": [ - "PRECALL_ADAPTIVE", - "PRECALL_BOUND_METHOD", - "PRECALL_BUILTIN_CLASS", - "PRECALL_BUILTIN_FAST_WITH_KEYWORDS", - "PRECALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS", - "PRECALL_NO_KW_BUILTIN_FAST", - "PRECALL_NO_KW_BUILTIN_O", - "PRECALL_NO_KW_ISINSTANCE", - "PRECALL_NO_KW_LEN", - "PRECALL_NO_KW_LIST_APPEND", - "PRECALL_NO_KW_METHOD_DESCRIPTOR_FAST", - "PRECALL_NO_KW_METHOD_DESCRIPTOR_NOARGS", - "PRECALL_NO_KW_METHOD_DESCRIPTOR_O", - "PRECALL_NO_KW_STR_1", - "PRECALL_NO_KW_TUPLE_1", - "PRECALL_NO_KW_TYPE_1", - "PRECALL_PYFUNC", - ], "RESUME": [ "RESUME_QUICK", ], @@ -394,9 +389,6 @@ def jabs_op(name, op): "func_version": 2, "min_args": 1, }, - "PRECALL": { - "counter": 1, - }, "STORE_SUBSCR": { "counter": 1, }, diff --git a/Lib/test/test_compile.py b/Lib/test/test_compile.py index 5a9c618786f4e..487a4fa2a9540 100644 --- a/Lib/test/test_compile.py +++ b/Lib/test/test_compile.py @@ -839,7 +839,7 @@ def foo(x): instructions = [opcode.opname for opcode in opcodes] self.assertNotIn('LOAD_METHOD', instructions) self.assertIn('LOAD_ATTR', instructions) - self.assertIn('PRECALL', instructions) + self.assertIn('CALL', instructions) def test_lineno_procedure_call(self): def call(): diff --git a/Lib/test/test_dis.py b/Lib/test/test_dis.py index af736d6fe9614..a19cf49e658ec 100644 --- a/Lib/test/test_dis.py +++ b/Lib/test/test_dis.py @@ -107,7 +107,6 @@ def _f(a): %3d LOAD_GLOBAL 1 (NULL + print) LOAD_FAST 0 (a) - PRECALL 1 CALL 1 POP_TOP @@ -122,7 +121,6 @@ def _f(a): RESUME 0 LOAD_GLOBAL 1 LOAD_FAST 0 - PRECALL 1 CALL 1 POP_TOP LOAD_CONST 1 @@ -143,13 +141,12 @@ def bug708901(): %3d LOAD_CONST 2 (10) -%3d PRECALL 2 - CALL 2 +%3d CALL 2 GET_ITER - >> FOR_ITER 2 (to 40) + >> FOR_ITER 2 (to 36) STORE_FAST 0 (res) -%3d JUMP_BACKWARD 3 (to 34) +%3d JUMP_BACKWARD 3 (to 30) %3d >> LOAD_CONST 0 (None) RETURN_VALUE @@ -174,13 +171,11 @@ def bug1333982(x=[]): MAKE_FUNCTION 0 LOAD_FAST 0 (x) GET_ITER - PRECALL 0 CALL 0 %3d LOAD_CONST 3 (1) %3d BINARY_OP 0 (+) - PRECALL 0 CALL 0 RAISE_VARARGS 1 """ % (bug1333982.__code__.co_firstlineno, @@ -315,7 +310,6 @@ def bug42562(): 3 PUSH_NULL LOAD_NAME 3 (fun) LOAD_CONST 0 (1) - PRECALL 1 CALL 1 LOAD_NAME 2 (__annotations__) LOAD_CONST 2 ('y') @@ -326,7 +320,6 @@ def bug42562(): PUSH_NULL LOAD_NAME 3 (fun) LOAD_CONST 3 (0) - PRECALL 1 CALL 1 STORE_SUBSCR LOAD_NAME 1 (int) @@ -449,14 +442,12 @@ def _tryfinallyconst(b): %3d PUSH_NULL LOAD_FAST 1 (b) - PRECALL 0 CALL 0 POP_TOP RETURN_VALUE >> PUSH_EXC_INFO PUSH_NULL LOAD_FAST 1 (b) - PRECALL 0 CALL 0 POP_TOP RERAISE 0 @@ -479,7 +470,6 @@ def _tryfinallyconst(b): %3d PUSH_NULL LOAD_FAST 0 (b) - PRECALL 0 CALL 0 POP_TOP LOAD_CONST 1 (1) @@ -487,7 +477,6 @@ def _tryfinallyconst(b): PUSH_EXC_INFO PUSH_NULL LOAD_FAST 0 (b) - PRECALL 0 CALL 0 POP_TOP RERAISE 0 @@ -550,7 +539,6 @@ def foo(x): MAKE_FUNCTION 8 (closure) LOAD_DEREF 1 (y) GET_ITER - PRECALL 0 CALL 0 RETURN_VALUE """ % (dis_nested_0, @@ -608,26 +596,25 @@ def loop_test(): load_test(i) dis_loop_test_quickened_code = """\ -%3d 0 RESUME_QUICK 0 +%3d RESUME_QUICK 0 + +%3d BUILD_LIST 0 + LOAD_CONST 1 ((1, 2, 3)) + LIST_EXTEND 1 + LOAD_CONST 2 (3) + BINARY_OP_ADAPTIVE 5 (*) + GET_ITER + FOR_ITER 15 (to 48) + STORE_FAST 0 (i) -%3d 2 BUILD_LIST 0 - 4 LOAD_CONST 1 ((1, 2, 3)) - 6 LIST_EXTEND 1 - 8 LOAD_CONST 2 (3) - 10 BINARY_OP_ADAPTIVE 5 (*) - 14 GET_ITER - 16 FOR_ITER 17 (to 52) - 18 STORE_FAST 0 (i) - -%3d 20 LOAD_GLOBAL_MODULE 1 (NULL + load_test) - 32 LOAD_FAST 0 (i) - 34 PRECALL_PYFUNC 1 - 38 CALL_PY_WITH_DEFAULTS 1 - 48 POP_TOP - 50 JUMP_BACKWARD_QUICK 18 (to 16) - -%3d >> 52 LOAD_CONST 0 (None) - 54 RETURN_VALUE +%3d LOAD_GLOBAL_MODULE 1 (NULL + load_test) + LOAD_FAST 0 (i) + CALL_PY_WITH_DEFAULTS 1 + POP_TOP + JUMP_BACKWARD_QUICK 16 (to 16) + +%3d >> LOAD_CONST 0 (None) + RETURN_VALUE """ % (loop_test.__code__.co_firstlineno, loop_test.__code__.co_firstlineno + 1, loop_test.__code__.co_firstlineno + 2, @@ -990,26 +977,25 @@ def test_load_attr_specialize(self): @cpython_only def test_call_specialize(self): call_quicken = """\ - 0 RESUME_QUICK 0 + RESUME_QUICK 0 - 1 2 PUSH_NULL - 4 LOAD_NAME 0 (str) - 6 LOAD_CONST 0 (1) - 8 PRECALL_NO_KW_STR_1 1 - 12 CALL_ADAPTIVE 1 - 22 RETURN_VALUE + 1 PUSH_NULL + LOAD_NAME 0 (str) + LOAD_CONST 0 (1) + CALL_NO_KW_STR_1 1 + RETURN_VALUE """ co = compile("str(1)", "", "eval") self.code_quicken(lambda: exec(co, {}, {})) got = self.get_disassembly(co, adaptive=True) - self.do_disassembly_compare(got, call_quicken, True) + self.do_disassembly_compare(got, call_quicken) @cpython_only def test_loop_quicken(self): # Loop can trigger a quicken where the loop is located self.code_quicken(loop_test, 1) got = self.get_disassembly(loop_test, adaptive=True) - self.do_disassembly_compare(got, dis_loop_test_quickened_code, True) + self.do_disassembly_compare(got, dis_loop_test_quickened_code) def get_cached_values(self, quickened, adaptive): def f(): @@ -1040,7 +1026,7 @@ def test_show_caches(self): for cache in caches: self.assertRegex(cache, pattern) self.assertEqual(caches.count(""), 8) - self.assertEqual(len(caches), 25) + self.assertEqual(len(caches), 23) class DisWithFileTests(DisTests): @@ -1319,6 +1305,7 @@ def _prepare_test_cases(): #_prepare_test_cases() Instruction = dis.Instruction + expected_opinfo_outer = [ Instruction(opname='MAKE_CELL', opcode=135, arg=0, argval='a', argrepr='a', offset=0, starts_line=None, is_jump_target=False, positions=None), Instruction(opname='MAKE_CELL', opcode=135, arg=1, argval='b', argrepr='b', offset=2, starts_line=None, is_jump_target=False, positions=None), @@ -1338,11 +1325,10 @@ def _prepare_test_cases(): Instruction(opname='BUILD_LIST', opcode=103, arg=0, argval=0, argrepr='', offset=40, starts_line=None, is_jump_target=False, positions=None), Instruction(opname='BUILD_MAP', opcode=105, arg=0, argval=0, argrepr='', offset=42, starts_line=None, is_jump_target=False, positions=None), Instruction(opname='LOAD_CONST', opcode=100, arg=6, argval='Hello world!', argrepr="'Hello world!'", offset=44, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='PRECALL', opcode=166, arg=7, argval=7, argrepr='', offset=46, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='CALL', opcode=171, arg=7, argval=7, argrepr='', offset=50, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=60, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='LOAD_FAST', opcode=124, arg=2, argval='f', argrepr='f', offset=62, starts_line=8, is_jump_target=False, positions=None), - Instruction(opname='RETURN_VALUE', opcode=83, arg=None, argval=None, argrepr='', offset=64, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='CALL', opcode=171, arg=7, argval=7, argrepr='', offset=46, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=56, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='LOAD_FAST', opcode=124, arg=2, argval='f', argrepr='f', offset=58, starts_line=8, is_jump_target=False, positions=None), + Instruction(opname='RETURN_VALUE', opcode=83, arg=None, argval=None, argrepr='', offset=60, starts_line=None, is_jump_target=False, positions=None), ] expected_opinfo_f = [ @@ -1364,11 +1350,10 @@ def _prepare_test_cases(): Instruction(opname='LOAD_DEREF', opcode=137, arg=4, argval='b', argrepr='b', offset=40, starts_line=None, is_jump_target=False, positions=None), Instruction(opname='LOAD_DEREF', opcode=137, arg=0, argval='c', argrepr='c', offset=42, starts_line=None, is_jump_target=False, positions=None), Instruction(opname='LOAD_DEREF', opcode=137, arg=1, argval='d', argrepr='d', offset=44, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='PRECALL', opcode=166, arg=4, argval=4, argrepr='', offset=46, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='CALL', opcode=171, arg=4, argval=4, argrepr='', offset=50, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=60, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='LOAD_FAST', opcode=124, arg=2, argval='inner', argrepr='inner', offset=62, starts_line=6, is_jump_target=False, positions=None), - Instruction(opname='RETURN_VALUE', opcode=83, arg=None, argval=None, argrepr='', offset=64, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='CALL', opcode=171, arg=4, argval=4, argrepr='', offset=46, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=56, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='LOAD_FAST', opcode=124, arg=2, argval='inner', argrepr='inner', offset=58, starts_line=6, is_jump_target=False, positions=None), + Instruction(opname='RETURN_VALUE', opcode=83, arg=None, argval=None, argrepr='', offset=60, starts_line=None, is_jump_target=False, positions=None), ] expected_opinfo_inner = [ @@ -1381,137 +1366,126 @@ def _prepare_test_cases(): Instruction(opname='LOAD_DEREF', opcode=137, arg=5, argval='d', argrepr='d', offset=22, starts_line=None, is_jump_target=False, positions=None), Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='e', argrepr='e', offset=24, starts_line=None, is_jump_target=False, positions=None), Instruction(opname='LOAD_FAST', opcode=124, arg=1, argval='f', argrepr='f', offset=26, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='PRECALL', opcode=166, arg=6, argval=6, argrepr='', offset=28, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='CALL', opcode=171, arg=6, argval=6, argrepr='', offset=32, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=42, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=44, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='RETURN_VALUE', opcode=83, arg=None, argval=None, argrepr='', offset=46, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='CALL', opcode=171, arg=6, argval=6, argrepr='', offset=28, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=38, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=40, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='RETURN_VALUE', opcode=83, arg=None, argval=None, argrepr='', offset=42, starts_line=None, is_jump_target=False, positions=None), ] expected_opinfo_jumpy = [ Instruction(opname='RESUME', opcode=151, arg=0, argval=0, argrepr='', offset=0, starts_line=1, is_jump_target=False, positions=None), Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='range', argrepr='NULL + range', offset=2, starts_line=3, is_jump_target=False, positions=None), Instruction(opname='LOAD_CONST', opcode=100, arg=1, argval=10, argrepr='10', offset=14, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='PRECALL', opcode=166, arg=1, argval=1, argrepr='', offset=16, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='CALL', opcode=171, arg=1, argval=1, argrepr='', offset=20, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='GET_ITER', opcode=68, arg=None, argval=None, argrepr='', offset=30, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='FOR_ITER', opcode=93, arg=32, argval=98, argrepr='to 98', offset=32, starts_line=None, is_jump_target=True, positions=None), - Instruction(opname='STORE_FAST', opcode=125, arg=0, argval='i', argrepr='i', offset=34, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='LOAD_GLOBAL', opcode=116, arg=3, argval='print', argrepr='NULL + print', offset=36, starts_line=4, is_jump_target=False, positions=None), - Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=48, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='PRECALL', opcode=166, arg=1, argval=1, argrepr='', offset=50, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='CALL', opcode=171, arg=1, argval=1, argrepr='', offset=54, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=64, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=66, starts_line=5, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=100, arg=2, argval=4, argrepr='4', offset=68, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='COMPARE_OP', opcode=107, arg=0, argval='<', argrepr='<', offset=70, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_JUMP_FORWARD_IF_FALSE', opcode=114, arg=1, argval=80, argrepr='to 80', offset=76, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='JUMP_BACKWARD', opcode=140, arg=24, argval=32, argrepr='to 32', offset=78, starts_line=6, is_jump_target=False, positions=None), - Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=80, starts_line=7, is_jump_target=True, positions=None), - Instruction(opname='LOAD_CONST', opcode=100, arg=3, argval=6, argrepr='6', offset=82, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='COMPARE_OP', opcode=107, arg=4, argval='>', argrepr='>', offset=84, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_JUMP_FORWARD_IF_FALSE', opcode=114, arg=2, argval=96, argrepr='to 96', offset=90, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=92, starts_line=8, is_jump_target=False, positions=None), - Instruction(opname='JUMP_FORWARD', opcode=110, arg=16, argval=128, argrepr='to 128', offset=94, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='JUMP_BACKWARD', opcode=140, arg=33, argval=32, argrepr='to 32', offset=96, starts_line=7, is_jump_target=True, positions=None), - Instruction(opname='LOAD_GLOBAL', opcode=116, arg=3, argval='print', argrepr='NULL + print', offset=98, starts_line=10, is_jump_target=True, positions=None), - Instruction(opname='LOAD_CONST', opcode=100, arg=4, argval='I can haz else clause?', argrepr="'I can haz else clause?'", offset=110, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='PRECALL', opcode=166, arg=1, argval=1, argrepr='', offset=112, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='CALL', opcode=171, arg=1, argval=1, argrepr='', offset=116, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=126, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=128, starts_line=11, is_jump_target=True, positions=None), - Instruction(opname='POP_JUMP_FORWARD_IF_FALSE', opcode=114, arg=36, argval=204, argrepr='to 204', offset=130, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='LOAD_GLOBAL', opcode=116, arg=3, argval='print', argrepr='NULL + print', offset=132, starts_line=12, is_jump_target=True, positions=None), - Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=144, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='PRECALL', opcode=166, arg=1, argval=1, argrepr='', offset=146, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='CALL', opcode=171, arg=1, argval=1, argrepr='', offset=150, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=160, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=162, starts_line=13, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=100, arg=5, argval=1, argrepr='1', offset=164, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='BINARY_OP', opcode=122, arg=23, argval=23, argrepr='-=', offset=166, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='STORE_FAST', opcode=125, arg=0, argval='i', argrepr='i', offset=170, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=172, starts_line=14, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=100, arg=3, argval=6, argrepr='6', offset=174, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='COMPARE_OP', opcode=107, arg=4, argval='>', argrepr='>', offset=176, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_JUMP_FORWARD_IF_FALSE', opcode=114, arg=1, argval=186, argrepr='to 186', offset=182, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='JUMP_BACKWARD', opcode=140, arg=29, argval=128, argrepr='to 128', offset=184, starts_line=15, is_jump_target=False, positions=None), - Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=186, starts_line=16, is_jump_target=True, positions=None), - Instruction(opname='LOAD_CONST', opcode=100, arg=2, argval=4, argrepr='4', offset=188, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='COMPARE_OP', opcode=107, arg=0, argval='<', argrepr='<', offset=190, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_JUMP_FORWARD_IF_FALSE', opcode=114, arg=1, argval=200, argrepr='to 200', offset=196, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='JUMP_FORWARD', opcode=110, arg=17, argval=234, argrepr='to 234', offset=198, starts_line=17, is_jump_target=False, positions=None), - Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=200, starts_line=11, is_jump_target=True, positions=None), - Instruction(opname='POP_JUMP_BACKWARD_IF_TRUE', opcode=176, arg=36, argval=132, argrepr='to 132', offset=202, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='LOAD_GLOBAL', opcode=116, arg=3, argval='print', argrepr='NULL + print', offset=204, starts_line=19, is_jump_target=True, positions=None), - Instruction(opname='LOAD_CONST', opcode=100, arg=6, argval='Who let lolcatz into this test suite?', argrepr="'Who let lolcatz into this test suite?'", offset=216, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='PRECALL', opcode=166, arg=1, argval=1, argrepr='', offset=218, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='CALL', opcode=171, arg=1, argval=1, argrepr='', offset=222, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=232, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='NOP', opcode=9, arg=None, argval=None, argrepr='', offset=234, starts_line=20, is_jump_target=True, positions=None), - Instruction(opname='LOAD_CONST', opcode=100, arg=5, argval=1, argrepr='1', offset=236, starts_line=21, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=100, arg=7, argval=0, argrepr='0', offset=238, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='BINARY_OP', opcode=122, arg=11, argval=11, argrepr='/', offset=240, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=244, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=246, starts_line=25, is_jump_target=False, positions=None), - Instruction(opname='BEFORE_WITH', opcode=53, arg=None, argval=None, argrepr='', offset=248, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='STORE_FAST', opcode=125, arg=1, argval='dodgy', argrepr='dodgy', offset=250, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='LOAD_GLOBAL', opcode=116, arg=3, argval='print', argrepr='NULL + print', offset=252, starts_line=26, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=100, arg=8, argval='Never reach this', argrepr="'Never reach this'", offset=264, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='PRECALL', opcode=166, arg=1, argval=1, argrepr='', offset=266, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='CALL', opcode=171, arg=1, argval=1, argrepr='', offset=270, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=280, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=282, starts_line=25, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=284, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=286, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='PRECALL', opcode=166, arg=2, argval=2, argrepr='', offset=288, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='CALL', opcode=171, arg=2, argval=2, argrepr='', offset=292, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=302, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='JUMP_FORWARD', opcode=110, arg=11, argval=328, argrepr='to 328', offset=304, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='PUSH_EXC_INFO', opcode=35, arg=None, argval=None, argrepr='', offset=306, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='WITH_EXCEPT_START', opcode=49, arg=None, argval=None, argrepr='', offset=308, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_JUMP_FORWARD_IF_TRUE', opcode=115, arg=4, argval=320, argrepr='to 320', offset=310, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='RERAISE', opcode=119, arg=2, argval=2, argrepr='', offset=312, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='COPY', opcode=120, arg=3, argval=3, argrepr='', offset=314, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=316, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='RERAISE', opcode=119, arg=1, argval=1, argrepr='', offset=318, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=320, starts_line=None, is_jump_target=True, positions=None), - Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=322, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=324, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=326, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='JUMP_FORWARD', opcode=110, arg=31, argval=392, argrepr='to 392', offset=328, starts_line=None, is_jump_target=True, positions=None), - Instruction(opname='PUSH_EXC_INFO', opcode=35, arg=None, argval=None, argrepr='', offset=330, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='LOAD_GLOBAL', opcode=116, arg=4, argval='ZeroDivisionError', argrepr='ZeroDivisionError', offset=332, starts_line=22, is_jump_target=False, positions=None), - Instruction(opname='CHECK_EXC_MATCH', opcode=36, arg=None, argval=None, argrepr='', offset=344, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_JUMP_FORWARD_IF_FALSE', opcode=114, arg=18, argval=384, argrepr='to 384', offset=346, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=348, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='LOAD_GLOBAL', opcode=116, arg=3, argval='print', argrepr='NULL + print', offset=350, starts_line=23, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=100, arg=9, argval='Here we go, here we go, here we go...', argrepr="'Here we go, here we go, here we go...'", offset=362, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='PRECALL', opcode=166, arg=1, argval=1, argrepr='', offset=364, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='CALL', opcode=171, arg=1, argval=1, argrepr='', offset=368, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=378, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=380, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='JUMP_FORWARD', opcode=110, arg=4, argval=392, argrepr='to 392', offset=382, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='RERAISE', opcode=119, arg=0, argval=0, argrepr='', offset=384, starts_line=22, is_jump_target=True, positions=None), - Instruction(opname='COPY', opcode=120, arg=3, argval=3, argrepr='', offset=386, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=388, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='RERAISE', opcode=119, arg=1, argval=1, argrepr='', offset=390, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='LOAD_GLOBAL', opcode=116, arg=3, argval='print', argrepr='NULL + print', offset=392, starts_line=28, is_jump_target=True, positions=None), + Instruction(opname='CALL', opcode=171, arg=1, argval=1, argrepr='', offset=16, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='GET_ITER', opcode=68, arg=None, argval=None, argrepr='', offset=26, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='FOR_ITER', opcode=93, arg=30, argval=90, argrepr='to 90', offset=28, starts_line=None, is_jump_target=True, positions=None), + Instruction(opname='STORE_FAST', opcode=125, arg=0, argval='i', argrepr='i', offset=30, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='LOAD_GLOBAL', opcode=116, arg=3, argval='print', argrepr='NULL + print', offset=32, starts_line=4, is_jump_target=False, positions=None), + Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=44, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='CALL', opcode=171, arg=1, argval=1, argrepr='', offset=46, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=56, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=58, starts_line=5, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=100, arg=2, argval=4, argrepr='4', offset=60, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='COMPARE_OP', opcode=107, arg=0, argval='<', argrepr='<', offset=62, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_JUMP_FORWARD_IF_FALSE', opcode=114, arg=1, argval=72, argrepr='to 72', offset=68, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='JUMP_BACKWARD', opcode=140, arg=22, argval=28, argrepr='to 28', offset=70, starts_line=6, is_jump_target=False, positions=None), + Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=72, starts_line=7, is_jump_target=True, positions=None), + Instruction(opname='LOAD_CONST', opcode=100, arg=3, argval=6, argrepr='6', offset=74, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='COMPARE_OP', opcode=107, arg=4, argval='>', argrepr='>', offset=76, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_JUMP_FORWARD_IF_FALSE', opcode=114, arg=2, argval=88, argrepr='to 88', offset=82, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=84, starts_line=8, is_jump_target=False, positions=None), + Instruction(opname='JUMP_FORWARD', opcode=110, arg=14, argval=116, argrepr='to 116', offset=86, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='JUMP_BACKWARD', opcode=140, arg=31, argval=28, argrepr='to 28', offset=88, starts_line=7, is_jump_target=True, positions=None), + Instruction(opname='LOAD_GLOBAL', opcode=116, arg=3, argval='print', argrepr='NULL + print', offset=90, starts_line=10, is_jump_target=True, positions=None), + Instruction(opname='LOAD_CONST', opcode=100, arg=4, argval='I can haz else clause?', argrepr="'I can haz else clause?'", offset=102, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='CALL', opcode=171, arg=1, argval=1, argrepr='', offset=104, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=114, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=116, starts_line=11, is_jump_target=True, positions=None), + Instruction(opname='POP_JUMP_FORWARD_IF_FALSE', opcode=114, arg=34, argval=188, argrepr='to 188', offset=118, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='LOAD_GLOBAL', opcode=116, arg=3, argval='print', argrepr='NULL + print', offset=120, starts_line=12, is_jump_target=True, positions=None), + Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=132, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='CALL', opcode=171, arg=1, argval=1, argrepr='', offset=134, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=144, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=146, starts_line=13, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=100, arg=5, argval=1, argrepr='1', offset=148, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='BINARY_OP', opcode=122, arg=23, argval=23, argrepr='-=', offset=150, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='STORE_FAST', opcode=125, arg=0, argval='i', argrepr='i', offset=154, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=156, starts_line=14, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=100, arg=3, argval=6, argrepr='6', offset=158, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='COMPARE_OP', opcode=107, arg=4, argval='>', argrepr='>', offset=160, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_JUMP_FORWARD_IF_FALSE', opcode=114, arg=1, argval=170, argrepr='to 170', offset=166, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='JUMP_BACKWARD', opcode=140, arg=27, argval=116, argrepr='to 116', offset=168, starts_line=15, is_jump_target=False, positions=None), + Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=170, starts_line=16, is_jump_target=True, positions=None), + Instruction(opname='LOAD_CONST', opcode=100, arg=2, argval=4, argrepr='4', offset=172, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='COMPARE_OP', opcode=107, arg=0, argval='<', argrepr='<', offset=174, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_JUMP_FORWARD_IF_FALSE', opcode=114, arg=1, argval=184, argrepr='to 184', offset=180, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='JUMP_FORWARD', opcode=110, arg=15, argval=214, argrepr='to 214', offset=182, starts_line=17, is_jump_target=False, positions=None), + Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=184, starts_line=11, is_jump_target=True, positions=None), + Instruction(opname='POP_JUMP_BACKWARD_IF_TRUE', opcode=176, arg=34, argval=120, argrepr='to 120', offset=186, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='LOAD_GLOBAL', opcode=116, arg=3, argval='print', argrepr='NULL + print', offset=188, starts_line=19, is_jump_target=True, positions=None), + Instruction(opname='LOAD_CONST', opcode=100, arg=6, argval='Who let lolcatz into this test suite?', argrepr="'Who let lolcatz into this test suite?'", offset=200, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='CALL', opcode=171, arg=1, argval=1, argrepr='', offset=202, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=212, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='NOP', opcode=9, arg=None, argval=None, argrepr='', offset=214, starts_line=20, is_jump_target=True, positions=None), + Instruction(opname='LOAD_CONST', opcode=100, arg=5, argval=1, argrepr='1', offset=216, starts_line=21, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=100, arg=7, argval=0, argrepr='0', offset=218, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='BINARY_OP', opcode=122, arg=11, argval=11, argrepr='/', offset=220, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=224, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=226, starts_line=25, is_jump_target=False, positions=None), + Instruction(opname='BEFORE_WITH', opcode=53, arg=None, argval=None, argrepr='', offset=228, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='STORE_FAST', opcode=125, arg=1, argval='dodgy', argrepr='dodgy', offset=230, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='LOAD_GLOBAL', opcode=116, arg=3, argval='print', argrepr='NULL + print', offset=232, starts_line=26, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=100, arg=8, argval='Never reach this', argrepr="'Never reach this'", offset=244, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='CALL', opcode=171, arg=1, argval=1, argrepr='', offset=246, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=256, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=258, starts_line=25, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=260, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=262, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='CALL', opcode=171, arg=2, argval=2, argrepr='', offset=264, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=274, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='JUMP_FORWARD', opcode=110, arg=11, argval=300, argrepr='to 300', offset=276, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='PUSH_EXC_INFO', opcode=35, arg=None, argval=None, argrepr='', offset=278, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='WITH_EXCEPT_START', opcode=49, arg=None, argval=None, argrepr='', offset=280, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_JUMP_FORWARD_IF_TRUE', opcode=115, arg=4, argval=292, argrepr='to 292', offset=282, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='RERAISE', opcode=119, arg=2, argval=2, argrepr='', offset=284, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='COPY', opcode=120, arg=3, argval=3, argrepr='', offset=286, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=288, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='RERAISE', opcode=119, arg=1, argval=1, argrepr='', offset=290, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=292, starts_line=None, is_jump_target=True, positions=None), + Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=294, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=296, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=298, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='JUMP_FORWARD', opcode=110, arg=29, argval=360, argrepr='to 360', offset=300, starts_line=None, is_jump_target=True, positions=None), + Instruction(opname='PUSH_EXC_INFO', opcode=35, arg=None, argval=None, argrepr='', offset=302, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='LOAD_GLOBAL', opcode=116, arg=4, argval='ZeroDivisionError', argrepr='ZeroDivisionError', offset=304, starts_line=22, is_jump_target=False, positions=None), + Instruction(opname='CHECK_EXC_MATCH', opcode=36, arg=None, argval=None, argrepr='', offset=316, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_JUMP_FORWARD_IF_FALSE', opcode=114, arg=16, argval=352, argrepr='to 352', offset=318, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=320, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='LOAD_GLOBAL', opcode=116, arg=3, argval='print', argrepr='NULL + print', offset=322, starts_line=23, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=100, arg=9, argval='Here we go, here we go, here we go...', argrepr="'Here we go, here we go, here we go...'", offset=334, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='CALL', opcode=171, arg=1, argval=1, argrepr='', offset=336, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=346, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=348, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='JUMP_FORWARD', opcode=110, arg=4, argval=360, argrepr='to 360', offset=350, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='RERAISE', opcode=119, arg=0, argval=0, argrepr='', offset=352, starts_line=22, is_jump_target=True, positions=None), + Instruction(opname='COPY', opcode=120, arg=3, argval=3, argrepr='', offset=354, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=356, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='RERAISE', opcode=119, arg=1, argval=1, argrepr='', offset=358, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='LOAD_GLOBAL', opcode=116, arg=3, argval='print', argrepr='NULL + print', offset=360, starts_line=28, is_jump_target=True, positions=None), + Instruction(opname='LOAD_CONST', opcode=100, arg=10, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=372, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='CALL', opcode=171, arg=1, argval=1, argrepr='', offset=374, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=384, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=386, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='RETURN_VALUE', opcode=83, arg=None, argval=None, argrepr='', offset=388, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='PUSH_EXC_INFO', opcode=35, arg=None, argval=None, argrepr='', offset=390, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='LOAD_GLOBAL', opcode=116, arg=3, argval='print', argrepr='NULL + print', offset=392, starts_line=None, is_jump_target=False, positions=None), Instruction(opname='LOAD_CONST', opcode=100, arg=10, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=404, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='PRECALL', opcode=166, arg=1, argval=1, argrepr='', offset=406, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='CALL', opcode=171, arg=1, argval=1, argrepr='', offset=410, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=420, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=422, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='RETURN_VALUE', opcode=83, arg=None, argval=None, argrepr='', offset=424, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='PUSH_EXC_INFO', opcode=35, arg=None, argval=None, argrepr='', offset=426, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='LOAD_GLOBAL', opcode=116, arg=3, argval='print', argrepr='NULL + print', offset=428, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=100, arg=10, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=440, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='PRECALL', opcode=166, arg=1, argval=1, argrepr='', offset=442, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='CALL', opcode=171, arg=1, argval=1, argrepr='', offset=446, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=456, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='RERAISE', opcode=119, arg=0, argval=0, argrepr='', offset=458, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='COPY', opcode=120, arg=3, argval=3, argrepr='', offset=460, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=462, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='RERAISE', opcode=119, arg=1, argval=1, argrepr='', offset=464, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='CALL', opcode=171, arg=1, argval=1, argrepr='', offset=406, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=416, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='RERAISE', opcode=119, arg=0, argval=0, argrepr='', offset=418, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='COPY', opcode=120, arg=3, argval=3, argrepr='', offset=420, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=422, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='RERAISE', opcode=119, arg=1, argval=1, argrepr='', offset=424, starts_line=None, is_jump_target=False, positions=None), ] # One last piece of inspect fodder to check the default line number handling @@ -1581,7 +1555,6 @@ def test_co_positions(self): (1, 3, 0, 1), (1, 3, 0, 1), (1, 3, 0, 1), - (1, 3, 0, 1), (1, 3, 0, 1) ] self.assertEqual(positions, expected) diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-18-12-55-35.gh-issue-90690.TKuoTa.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-18-12-55-35.gh-issue-90690.TKuoTa.rst new file mode 100644 index 0000000000000..6c5aa91dfb9d3 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-05-18-12-55-35.gh-issue-90690.TKuoTa.rst @@ -0,0 +1,2 @@ +The PRECALL instruction has been removed. It offered only a small advantage +for specialization and is not needed in the vast majority of cases. diff --git a/Programs/test_frozenmain.h b/Programs/test_frozenmain.h index 1c279134e94dc..e6e2ef26b1c37 100644 --- a/Programs/test_frozenmain.h +++ b/Programs/test_frozenmain.h @@ -1,18 +1,17 @@ // Auto-generated by Programs/freeze_test_frozenmain.py unsigned char M_test_frozenmain[] = { 227,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0, - 0,0,0,0,0,115,176,0,0,0,151,0,100,0,100,1, + 0,0,0,0,0,115,160,0,0,0,151,0,100,0,100,1, 108,0,90,0,100,0,100,1,108,1,90,1,2,0,101,2, - 100,2,166,1,0,0,171,1,0,0,0,0,0,0,0,0, - 1,0,2,0,101,2,100,3,101,0,106,3,0,0,0,0, - 0,0,0,0,166,2,0,0,171,2,0,0,0,0,0,0, - 0,0,1,0,2,0,101,1,106,4,0,0,0,0,0,0, - 0,0,166,0,0,0,171,0,0,0,0,0,0,0,0,0, - 100,4,25,0,0,0,0,0,0,0,0,0,90,5,100,5, - 68,0,93,25,90,6,2,0,101,2,100,6,101,6,155,0, - 100,7,101,5,101,6,25,0,0,0,0,0,0,0,0,0, - 155,0,157,4,166,1,0,0,171,1,0,0,0,0,0,0, - 0,0,1,0,140,26,100,1,83,0,41,8,233,0,0,0, + 100,2,171,1,0,0,0,0,0,0,0,0,1,0,2,0, + 101,2,100,3,101,0,106,3,0,0,0,0,0,0,0,0, + 171,2,0,0,0,0,0,0,0,0,1,0,2,0,101,1, + 106,4,0,0,0,0,0,0,0,0,171,0,0,0,0,0, + 0,0,0,0,100,4,25,0,0,0,0,0,0,0,0,0, + 90,5,100,5,68,0,93,23,90,6,2,0,101,2,100,6, + 101,6,155,0,100,7,101,5,101,6,25,0,0,0,0,0, + 0,0,0,0,155,0,157,4,171,1,0,0,0,0,0,0, + 0,0,1,0,140,24,100,1,83,0,41,8,233,0,0,0, 0,78,122,18,70,114,111,122,101,110,32,72,101,108,108,111, 32,87,111,114,108,100,122,8,115,121,115,46,97,114,103,118, 218,6,99,111,110,102,105,103,41,5,218,12,112,114,111,103, @@ -28,15 +27,14 @@ unsigned char M_test_frozenmain[] = { 107,101,121,169,0,243,0,0,0,0,250,18,116,101,115,116, 95,102,114,111,122,101,110,109,97,105,110,46,112,121,250,8, 60,109,111,100,117,108,101,62,114,17,0,0,0,1,0,0, - 0,115,152,0,0,0,248,240,6,0,1,11,128,10,128,10, + 0,115,140,0,0,0,248,240,6,0,1,11,128,10,128,10, 128,10,216,0,24,208,0,24,208,0,24,208,0,24,224,0, - 5,128,5,208,6,26,209,0,27,212,0,27,208,0,27,216, - 0,5,128,5,128,106,144,35,148,40,209,0,27,212,0,27, - 208,0,27,216,9,38,208,9,26,212,9,38,209,9,40,212, - 9,40,168,24,212,9,50,128,6,240,2,6,12,2,240,0, - 7,1,42,240,0,7,1,42,128,67,240,14,0,5,10,128, - 69,208,10,40,144,67,208,10,40,208,10,40,152,54,160,35, - 156,59,208,10,40,208,10,40,209,4,41,212,4,41,208,4, - 41,208,4,41,240,15,7,1,42,240,0,7,1,42,114,15, - 0,0,0, + 5,128,5,208,6,26,212,0,27,208,0,27,216,0,5,128, + 5,128,106,144,35,148,40,212,0,27,208,0,27,216,9,38, + 208,9,26,212,9,38,212,9,40,168,24,212,9,50,128,6, + 240,2,6,12,2,240,0,7,1,42,240,0,7,1,42,128, + 67,240,14,0,5,10,128,69,208,10,40,144,67,208,10,40, + 208,10,40,152,54,160,35,156,59,208,10,40,208,10,40,212, + 4,41,208,4,41,208,4,41,240,15,7,1,42,240,0,7, + 1,42,114,15,0,0,0, }; diff --git a/Python/ceval.c b/Python/ceval.c index e4c47498c0cba..deb131813eb11 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -1439,10 +1439,6 @@ eval_frame_handle_pending(PyThreadState *tstate) #define JUMPTO(x) (next_instr = first_instr + (x)) #define JUMPBY(x) (next_instr += (x)) -// Skip from a PRECALL over a CALL to the next instruction: -#define SKIP_CALL() \ - JUMPBY(INLINE_CACHE_ENTRIES_PRECALL + 1 + INLINE_CACHE_ENTRIES_CALL) - /* Get opcode and oparg from original instructions, not quickened form. */ #define TRACING_NEXTOPARG() do { \ NEXTOPARG(); \ @@ -1687,7 +1683,7 @@ pop_frame(PyThreadState *tstate, _PyInterpreterFrame *frame) return prev_frame; } -/* It is only between the PRECALL instruction and the following CALL, +/* It is only between the KW_NAMES instruction and the following CALL, * that this has any meaning. */ typedef struct { @@ -4541,7 +4537,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int TARGET(LOAD_METHOD) { PREDICTED(LOAD_METHOD); - /* Designed to work in tandem with PRECALL. */ + /* Designed to work in tandem with CALL. */ PyObject *name = GETITEM(names, oparg); PyObject *obj = TOP(); PyObject *meth = NULL; @@ -4566,7 +4562,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int /* meth is not an unbound method (but a regular attr, or something was returned by a descriptor protocol). Set the second element of the stack to NULL, to signal - PRECALL that it's not a method call. + CALL that it's not a method call. NULL | meth | arg1 | ... | argN */ @@ -4710,57 +4706,11 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int NOTRACE_DISPATCH(); } - TARGET(PRECALL) { - PREDICTED(PRECALL); - /* Designed to work in tamdem with LOAD_METHOD. */ - /* `meth` is NULL when LOAD_METHOD thinks that it's not - a method call. - - Stack layout: - - ... | NULL | callable | arg1 | ... | argN - ^- TOP() - ^- (-oparg) - ^- (-oparg-1) - ^- (-oparg-2) - - `callable` will be POPed by call_function. - NULL will will be POPed manually later. - If `meth` isn't NULL, it's a method call. Stack layout: - - ... | method | self | arg1 | ... | argN - ^- TOP() - ^- (-oparg) - ^- (-oparg-1) - ^- (-oparg-2) - - `self` and `method` will be POPed by call_function. - We'll be passing `oparg + 1` to call_function, to - make it accept the `self` as a first argument. - */ - int is_meth = is_method(stack_pointer, oparg); - int nargs = oparg + is_meth; - /* Move ownership of reference from stack to call_shape - * and make sure that NULL is cleared from stack */ - PyObject *function = PEEK(nargs + 1); - if (!is_meth && Py_TYPE(function) == &PyMethod_Type) { - PyObject *meth = ((PyMethodObject *)function)->im_func; - PyObject *self = ((PyMethodObject *)function)->im_self; - Py_INCREF(meth); - Py_INCREF(self); - PEEK(oparg+1) = self; - PEEK(oparg+2) = meth; - Py_DECREF(function); - } - JUMPBY(INLINE_CACHE_ENTRIES_PRECALL); - DISPATCH(); - } - - TARGET(PRECALL_BOUND_METHOD) { - DEOPT_IF(is_method(stack_pointer, oparg), PRECALL); + TARGET(CALL_BOUND_METHOD_EXACT_ARGS) { + DEOPT_IF(is_method(stack_pointer, oparg), CALL); PyObject *function = PEEK(oparg + 1); - DEOPT_IF(Py_TYPE(function) != &PyMethod_Type, PRECALL); - STAT_INC(PRECALL, hit); + DEOPT_IF(Py_TYPE(function) != &PyMethod_Type, CALL); + STAT_INC(CALL, hit); PyObject *meth = ((PyMethodObject *)function)->im_func; PyObject *self = ((PyMethodObject *)function)->im_self; Py_INCREF(meth); @@ -4768,17 +4718,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int PEEK(oparg + 1) = self; PEEK(oparg + 2) = meth; Py_DECREF(function); - JUMPBY(INLINE_CACHE_ENTRIES_PRECALL); - DISPATCH(); - } - - TARGET(PRECALL_PYFUNC) { - int nargs = oparg + is_method(stack_pointer, oparg); - PyObject *function = PEEK(nargs + 1); - DEOPT_IF(Py_TYPE(function) != &PyFunction_Type, PRECALL); - STAT_INC(PRECALL, hit); - JUMPBY(INLINE_CACHE_ENTRIES_PRECALL); - DISPATCH(); + goto call_exact_args; } TARGET(KW_NAMES) { @@ -4789,11 +4729,22 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int } TARGET(CALL) { - int is_meth; + int total_args, is_meth; call_function: is_meth = is_method(stack_pointer, oparg); - int total_args = oparg + is_meth; - PyObject *function = PEEK(total_args + 1); + PyObject *function = PEEK(oparg + 1); + if (!is_meth && Py_TYPE(function) == &PyMethod_Type) { + PyObject *meth = ((PyMethodObject *)function)->im_func; + PyObject *self = ((PyMethodObject *)function)->im_self; + Py_INCREF(meth); + Py_INCREF(self); + PEEK(oparg+1) = self; + PEEK(oparg+2) = meth; + Py_DECREF(function); + is_meth = 1; + } + total_args = oparg + is_meth; + function = PEEK(total_args + 1); int positional_args = total_args - KWNAMES_LEN(); // Check if the call can be inlined or not if (Py_TYPE(function) == &PyFunction_Type && tstate->interp->eval_frame == NULL) { @@ -4850,27 +4801,6 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int DISPATCH(); } - TARGET(PRECALL_ADAPTIVE) { - _PyPrecallCache *cache = (_PyPrecallCache *)next_instr; - if (cache->counter == 0) { - next_instr--; - int is_meth = is_method(stack_pointer, oparg); - int nargs = oparg + is_meth; - PyObject *callable = PEEK(nargs + 1); - int err = _Py_Specialize_Precall(callable, next_instr, nargs, - call_shape.kwnames, oparg); - if (err < 0) { - goto error; - } - NOTRACE_DISPATCH_SAME_OPARG(); - } - else { - STAT_INC(PRECALL, deferred); - cache->counter--; - JUMP_TO_INSTRUCTION(PRECALL); - } - } - TARGET(CALL_ADAPTIVE) { _PyCallCache *cache = (_PyCallCache *)next_instr; if (cache->counter == 0) { @@ -4893,6 +4823,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int } TARGET(CALL_PY_EXACT_ARGS) { + call_exact_args: assert(call_shape.kwnames == NULL); DEOPT_IF(tstate->interp->eval_frame, CALL); _PyCallCache *cache = (_PyCallCache *)next_instr; @@ -4968,16 +4899,16 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int goto start_frame; } - TARGET(PRECALL_NO_KW_TYPE_1) { + TARGET(CALL_NO_KW_TYPE_1) { assert(call_shape.kwnames == NULL); assert(cframe.use_tracing == 0); assert(oparg == 1); - DEOPT_IF(is_method(stack_pointer, 1), PRECALL); + DEOPT_IF(is_method(stack_pointer, 1), CALL); PyObject *obj = TOP(); PyObject *callable = SECOND(); - DEOPT_IF(callable != (PyObject *)&PyType_Type, PRECALL); - STAT_INC(PRECALL, hit); - SKIP_CALL(); + DEOPT_IF(callable != (PyObject *)&PyType_Type, CALL); + STAT_INC(CALL, hit); + JUMPBY(INLINE_CACHE_ENTRIES_CALL); PyObject *res = Py_NewRef(Py_TYPE(obj)); Py_DECREF(callable); Py_DECREF(obj); @@ -4986,15 +4917,15 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int NOTRACE_DISPATCH(); } - TARGET(PRECALL_NO_KW_STR_1) { + TARGET(CALL_NO_KW_STR_1) { assert(call_shape.kwnames == NULL); assert(cframe.use_tracing == 0); assert(oparg == 1); - DEOPT_IF(is_method(stack_pointer, 1), PRECALL); + DEOPT_IF(is_method(stack_pointer, 1), CALL); PyObject *callable = PEEK(2); - DEOPT_IF(callable != (PyObject *)&PyUnicode_Type, PRECALL); - STAT_INC(PRECALL, hit); - SKIP_CALL(); + DEOPT_IF(callable != (PyObject *)&PyUnicode_Type, CALL); + STAT_INC(CALL, hit); + JUMPBY(INLINE_CACHE_ENTRIES_CALL); PyObject *arg = TOP(); PyObject *res = PyObject_Str(arg); Py_DECREF(arg); @@ -5008,14 +4939,14 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int DISPATCH(); } - TARGET(PRECALL_NO_KW_TUPLE_1) { + TARGET(CALL_NO_KW_TUPLE_1) { assert(call_shape.kwnames == NULL); assert(oparg == 1); - DEOPT_IF(is_method(stack_pointer, 1), PRECALL); + DEOPT_IF(is_method(stack_pointer, 1), CALL); PyObject *callable = PEEK(2); - DEOPT_IF(callable != (PyObject *)&PyTuple_Type, PRECALL); - STAT_INC(PRECALL, hit); - SKIP_CALL(); + DEOPT_IF(callable != (PyObject *)&PyTuple_Type, CALL); + STAT_INC(CALL, hit); + JUMPBY(INLINE_CACHE_ENTRIES_CALL); PyObject *arg = TOP(); PyObject *res = PySequence_Tuple(arg); Py_DECREF(arg); @@ -5029,16 +4960,16 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int DISPATCH(); } - TARGET(PRECALL_BUILTIN_CLASS) { + TARGET(CALL_BUILTIN_CLASS) { int is_meth = is_method(stack_pointer, oparg); int total_args = oparg + is_meth; int kwnames_len = KWNAMES_LEN(); PyObject *callable = PEEK(total_args + 1); - DEOPT_IF(!PyType_Check(callable), PRECALL); + DEOPT_IF(!PyType_Check(callable), CALL); PyTypeObject *tp = (PyTypeObject *)callable; - DEOPT_IF(tp->tp_vectorcall == NULL, PRECALL); - STAT_INC(PRECALL, hit); - SKIP_CALL(); + DEOPT_IF(tp->tp_vectorcall == NULL, CALL); + STAT_INC(CALL, hit); + JUMPBY(INLINE_CACHE_ENTRIES_CALL); STACK_SHRINK(total_args); PyObject *res = tp->tp_vectorcall((PyObject *)tp, stack_pointer, total_args-kwnames_len, call_shape.kwnames); @@ -5057,18 +4988,18 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int DISPATCH(); } - TARGET(PRECALL_NO_KW_BUILTIN_O) { + TARGET(CALL_NO_KW_BUILTIN_O) { assert(cframe.use_tracing == 0); /* Builtin METH_O functions */ assert(call_shape.kwnames == NULL); int is_meth = is_method(stack_pointer, oparg); int total_args = oparg + is_meth; - DEOPT_IF(total_args != 1, PRECALL); + DEOPT_IF(total_args != 1, CALL); PyObject *callable = PEEK(total_args + 1); - DEOPT_IF(!PyCFunction_CheckExact(callable), PRECALL); - DEOPT_IF(PyCFunction_GET_FLAGS(callable) != METH_O, PRECALL); - STAT_INC(PRECALL, hit); - SKIP_CALL(); + DEOPT_IF(!PyCFunction_CheckExact(callable), CALL); + DEOPT_IF(PyCFunction_GET_FLAGS(callable) != METH_O, CALL); + STAT_INC(CALL, hit); + JUMPBY(INLINE_CACHE_ENTRIES_CALL); PyCFunction cfunc = PyCFunction_GET_FUNCTION(callable); // This is slower but CPython promises to check all non-vectorcall // function calls. @@ -5091,18 +5022,18 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int DISPATCH(); } - TARGET(PRECALL_NO_KW_BUILTIN_FAST) { + TARGET(CALL_NO_KW_BUILTIN_FAST) { assert(cframe.use_tracing == 0); /* Builtin METH_FASTCALL functions, without keywords */ assert(call_shape.kwnames == NULL); int is_meth = is_method(stack_pointer, oparg); int total_args = oparg + is_meth; PyObject *callable = PEEK(total_args + 1); - DEOPT_IF(!PyCFunction_CheckExact(callable), PRECALL); + DEOPT_IF(!PyCFunction_CheckExact(callable), CALL); DEOPT_IF(PyCFunction_GET_FLAGS(callable) != METH_FASTCALL, - PRECALL); - STAT_INC(PRECALL, hit); - SKIP_CALL(); + CALL); + STAT_INC(CALL, hit); + JUMPBY(INLINE_CACHE_ENTRIES_CALL); PyCFunction cfunc = PyCFunction_GET_FUNCTION(callable); STACK_SHRINK(total_args); /* res = func(self, args, nargs) */ @@ -5131,17 +5062,17 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int DISPATCH(); } - TARGET(PRECALL_BUILTIN_FAST_WITH_KEYWORDS) { + TARGET(CALL_BUILTIN_FAST_WITH_KEYWORDS) { assert(cframe.use_tracing == 0); /* Builtin METH_FASTCALL | METH_KEYWORDS functions */ int is_meth = is_method(stack_pointer, oparg); int total_args = oparg + is_meth; PyObject *callable = PEEK(total_args + 1); - DEOPT_IF(!PyCFunction_CheckExact(callable), PRECALL); + DEOPT_IF(!PyCFunction_CheckExact(callable), CALL); DEOPT_IF(PyCFunction_GET_FLAGS(callable) != - (METH_FASTCALL | METH_KEYWORDS), PRECALL); - STAT_INC(PRECALL, hit); - SKIP_CALL(); + (METH_FASTCALL | METH_KEYWORDS), CALL); + STAT_INC(CALL, hit); + JUMPBY(INLINE_CACHE_ENTRIES_CALL); STACK_SHRINK(total_args); /* res = func(self, args, nargs, kwnames) */ _PyCFunctionFastWithKeywords cfunc = @@ -5170,18 +5101,18 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int DISPATCH(); } - TARGET(PRECALL_NO_KW_LEN) { + TARGET(CALL_NO_KW_LEN) { assert(cframe.use_tracing == 0); assert(call_shape.kwnames == NULL); /* len(o) */ int is_meth = is_method(stack_pointer, oparg); int total_args = oparg + is_meth; - DEOPT_IF(total_args != 1, PRECALL); + DEOPT_IF(total_args != 1, CALL); PyObject *callable = PEEK(total_args + 1); PyInterpreterState *interp = _PyInterpreterState_GET(); - DEOPT_IF(callable != interp->callable_cache.len, PRECALL); - STAT_INC(PRECALL, hit); - SKIP_CALL(); + DEOPT_IF(callable != interp->callable_cache.len, CALL); + STAT_INC(CALL, hit); + JUMPBY(INLINE_CACHE_ENTRIES_CALL); PyObject *arg = TOP(); Py_ssize_t len_i = PyObject_Length(arg); if (len_i < 0) { @@ -5200,18 +5131,18 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int DISPATCH(); } - TARGET(PRECALL_NO_KW_ISINSTANCE) { + TARGET(CALL_NO_KW_ISINSTANCE) { assert(cframe.use_tracing == 0); assert(call_shape.kwnames == NULL); /* isinstance(o, o2) */ int is_meth = is_method(stack_pointer, oparg); int total_args = oparg + is_meth; PyObject *callable = PEEK(total_args + 1); - DEOPT_IF(total_args != 2, PRECALL); + DEOPT_IF(total_args != 2, CALL); PyInterpreterState *interp = _PyInterpreterState_GET(); - DEOPT_IF(callable != interp->callable_cache.isinstance, PRECALL); - STAT_INC(PRECALL, hit); - SKIP_CALL(); + DEOPT_IF(callable != interp->callable_cache.isinstance, CALL); + STAT_INC(CALL, hit); + JUMPBY(INLINE_CACHE_ENTRIES_CALL); PyObject *cls = POP(); PyObject *inst = TOP(); int retval = PyObject_IsInstance(inst, cls); @@ -5233,18 +5164,18 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int DISPATCH(); } - TARGET(PRECALL_NO_KW_LIST_APPEND) { + TARGET(CALL_NO_KW_LIST_APPEND) { assert(cframe.use_tracing == 0); assert(call_shape.kwnames == NULL); assert(oparg == 1); PyObject *callable = PEEK(3); PyInterpreterState *interp = _PyInterpreterState_GET(); - DEOPT_IF(callable != interp->callable_cache.list_append, PRECALL); + DEOPT_IF(callable != interp->callable_cache.list_append, CALL); PyObject *list = SECOND(); - DEOPT_IF(!PyList_Check(list), PRECALL); - STAT_INC(PRECALL, hit); - // PRECALL + CALL + POP_TOP - JUMPBY(INLINE_CACHE_ENTRIES_PRECALL + 1 + INLINE_CACHE_ENTRIES_CALL + 1); + DEOPT_IF(!PyList_Check(list), CALL); + STAT_INC(CALL, hit); + // CALL + POP_TOP + JUMPBY(INLINE_CACHE_ENTRIES_CALL + 1); assert(_Py_OPCODE(next_instr[-1]) == POP_TOP); PyObject *arg = POP(); if (_PyList_AppendTakeRef((PyListObject *)list, arg) < 0) { @@ -5256,21 +5187,21 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int NOTRACE_DISPATCH(); } - TARGET(PRECALL_NO_KW_METHOD_DESCRIPTOR_O) { + TARGET(CALL_NO_KW_METHOD_DESCRIPTOR_O) { assert(call_shape.kwnames == NULL); int is_meth = is_method(stack_pointer, oparg); int total_args = oparg + is_meth; PyMethodDescrObject *callable = (PyMethodDescrObject *)PEEK(total_args + 1); - DEOPT_IF(total_args != 2, PRECALL); - DEOPT_IF(!Py_IS_TYPE(callable, &PyMethodDescr_Type), PRECALL); + DEOPT_IF(total_args != 2, CALL); + DEOPT_IF(!Py_IS_TYPE(callable, &PyMethodDescr_Type), CALL); PyMethodDef *meth = callable->d_method; - DEOPT_IF(meth->ml_flags != METH_O, PRECALL); + DEOPT_IF(meth->ml_flags != METH_O, CALL); PyObject *arg = TOP(); PyObject *self = SECOND(); - DEOPT_IF(!Py_IS_TYPE(self, callable->d_common.d_type), PRECALL); - STAT_INC(PRECALL, hit); - SKIP_CALL(); + DEOPT_IF(!Py_IS_TYPE(self, callable->d_common.d_type), CALL); + STAT_INC(CALL, hit); + JUMPBY(INLINE_CACHE_ENTRIES_CALL); PyCFunction cfunc = meth->ml_meth; // This is slower but CPython promises to check all non-vectorcall // function calls. @@ -5292,19 +5223,19 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int DISPATCH(); } - TARGET(PRECALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS) { + TARGET(CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS) { int is_meth = is_method(stack_pointer, oparg); int total_args = oparg + is_meth; PyMethodDescrObject *callable = (PyMethodDescrObject *)PEEK(total_args + 1); - DEOPT_IF(!Py_IS_TYPE(callable, &PyMethodDescr_Type), PRECALL); + DEOPT_IF(!Py_IS_TYPE(callable, &PyMethodDescr_Type), CALL); PyMethodDef *meth = callable->d_method; - DEOPT_IF(meth->ml_flags != (METH_FASTCALL|METH_KEYWORDS), PRECALL); + DEOPT_IF(meth->ml_flags != (METH_FASTCALL|METH_KEYWORDS), CALL); PyTypeObject *d_type = callable->d_common.d_type; PyObject *self = PEEK(total_args); - DEOPT_IF(!Py_IS_TYPE(self, d_type), PRECALL); - STAT_INC(PRECALL, hit); - SKIP_CALL(); + DEOPT_IF(!Py_IS_TYPE(self, d_type), CALL); + STAT_INC(CALL, hit); + JUMPBY(INLINE_CACHE_ENTRIES_CALL); int nargs = total_args-1; STACK_SHRINK(nargs); _PyCFunctionFastWithKeywords cfunc = @@ -5329,20 +5260,20 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int DISPATCH(); } - TARGET(PRECALL_NO_KW_METHOD_DESCRIPTOR_NOARGS) { + TARGET(CALL_NO_KW_METHOD_DESCRIPTOR_NOARGS) { assert(call_shape.kwnames == NULL); assert(oparg == 0 || oparg == 1); int is_meth = is_method(stack_pointer, oparg); int total_args = oparg + is_meth; - DEOPT_IF(total_args != 1, PRECALL); + DEOPT_IF(total_args != 1, CALL); PyMethodDescrObject *callable = (PyMethodDescrObject *)SECOND(); - DEOPT_IF(!Py_IS_TYPE(callable, &PyMethodDescr_Type), PRECALL); + DEOPT_IF(!Py_IS_TYPE(callable, &PyMethodDescr_Type), CALL); PyMethodDef *meth = callable->d_method; PyObject *self = TOP(); - DEOPT_IF(!Py_IS_TYPE(self, callable->d_common.d_type), PRECALL); - DEOPT_IF(meth->ml_flags != METH_NOARGS, PRECALL); - STAT_INC(PRECALL, hit); - SKIP_CALL(); + DEOPT_IF(!Py_IS_TYPE(self, callable->d_common.d_type), CALL); + DEOPT_IF(meth->ml_flags != METH_NOARGS, CALL); + STAT_INC(CALL, hit); + JUMPBY(INLINE_CACHE_ENTRIES_CALL); PyCFunction cfunc = meth->ml_meth; // This is slower but CPython promises to check all non-vectorcall // function calls. @@ -5363,20 +5294,20 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int DISPATCH(); } - TARGET(PRECALL_NO_KW_METHOD_DESCRIPTOR_FAST) { + TARGET(CALL_NO_KW_METHOD_DESCRIPTOR_FAST) { assert(call_shape.kwnames == NULL); int is_meth = is_method(stack_pointer, oparg); int total_args = oparg + is_meth; PyMethodDescrObject *callable = (PyMethodDescrObject *)PEEK(total_args + 1); /* Builtin METH_FASTCALL methods, without keywords */ - DEOPT_IF(!Py_IS_TYPE(callable, &PyMethodDescr_Type), PRECALL); + DEOPT_IF(!Py_IS_TYPE(callable, &PyMethodDescr_Type), CALL); PyMethodDef *meth = callable->d_method; - DEOPT_IF(meth->ml_flags != METH_FASTCALL, PRECALL); + DEOPT_IF(meth->ml_flags != METH_FASTCALL, CALL); PyObject *self = PEEK(total_args); - DEOPT_IF(!Py_IS_TYPE(self, callable->d_common.d_type), PRECALL); - STAT_INC(PRECALL, hit); - SKIP_CALL(); + DEOPT_IF(!Py_IS_TYPE(self, callable->d_common.d_type), CALL); + STAT_INC(CALL, hit); + JUMPBY(INLINE_CACHE_ENTRIES_CALL); _PyCFunctionFast cfunc = (_PyCFunctionFast)(void(*)(void))meth->ml_meth; int nargs = total_args-1; diff --git a/Python/compile.c b/Python/compile.c index fdf2e5b85adac..c42deb54ba3de 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -1116,12 +1116,10 @@ stack_effect(int opcode, int oparg, int jump) return -oparg; /* Functions and calls */ - case PRECALL: - return -oparg; case KW_NAMES: return 0; case CALL: - return -1; + return -1-oparg; case CALL_FUNCTION_EX: return -2 - ((oparg & 0x01) != 0); @@ -1947,7 +1945,6 @@ compiler_call_exit_with_nones(struct compiler *c) { ADDOP_LOAD_CONST(c, Py_None); ADDOP_LOAD_CONST(c, Py_None); ADDOP_LOAD_CONST(c, Py_None); - ADDOP_I(c, PRECALL, 2); ADDOP_I(c, CALL, 2); return 1; } @@ -2325,7 +2322,6 @@ compiler_apply_decorators(struct compiler *c, asdl_expr_seq* decos) int old_end_col_offset = c->u->u_end_col_offset; for (Py_ssize_t i = asdl_seq_LEN(decos) - 1; i > -1; i--) { SET_LOC(c, (expr_ty)asdl_seq_GET(decos, i)); - ADDOP_I(c, PRECALL, 0); ADDOP_I(c, CALL, 0); } c->u->u_lineno = old_lineno; @@ -4002,7 +3998,6 @@ compiler_assert(struct compiler *c, stmt_ty s) ADDOP(c, LOAD_ASSERTION_ERROR); if (s->v.Assert.msg) { VISIT(c, expr, s->v.Assert.msg); - ADDOP_I(c, PRECALL, 0); ADDOP_I(c, CALL, 0); } ADDOP_I(c, RAISE_VARARGS, 1); @@ -4831,7 +4826,6 @@ maybe_optimize_method_call(struct compiler *c, expr_ty e) return 0; }; } - ADDOP_I(c, PRECALL, argsl + kwdsl); ADDOP_I(c, CALL, argsl + kwdsl); c->u->u_lineno = old_lineno; return 1; @@ -4897,7 +4891,6 @@ compiler_joined_str(struct compiler *c, expr_ty e) VISIT(c, expr, asdl_seq_GET(e->v.JoinedStr.values, i)); ADDOP_I(c, LIST_APPEND, 1); } - ADDOP_I(c, PRECALL, 1); ADDOP_I(c, CALL, 1); } else { @@ -5071,7 +5064,6 @@ compiler_call_helper(struct compiler *c, return 0; }; } - ADDOP_I(c, PRECALL, n + nelts + nkwelts); ADDOP_I(c, CALL, n + nelts + nkwelts); return 1; @@ -5462,7 +5454,6 @@ compiler_comprehension(struct compiler *c, expr_ty e, int type, ADDOP(c, GET_ITER); } - ADDOP_I(c, PRECALL, 0); ADDOP_I(c, CALL, 0); if (is_async_generator && type != COMP_GENEXP) { diff --git a/Python/opcode_targets.h b/Python/opcode_targets.h index d37c132624718..3a6768bd228bd 100644 --- a/Python/opcode_targets.h +++ b/Python/opcode_targets.h @@ -25,62 +25,62 @@ static void *opcode_targets[256] = { &&TARGET_CALL_PY_EXACT_ARGS, &&TARGET_CALL_PY_WITH_DEFAULTS, &&TARGET_BINARY_SUBSCR, - &&TARGET_COMPARE_OP_ADAPTIVE, - &&TARGET_COMPARE_OP_FLOAT_JUMP, - &&TARGET_COMPARE_OP_INT_JUMP, - &&TARGET_COMPARE_OP_STR_JUMP, + &&TARGET_CALL_BOUND_METHOD_EXACT_ARGS, + &&TARGET_CALL_BUILTIN_CLASS, + &&TARGET_CALL_BUILTIN_FAST_WITH_KEYWORDS, + &&TARGET_CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS, &&TARGET_GET_LEN, &&TARGET_MATCH_MAPPING, &&TARGET_MATCH_SEQUENCE, &&TARGET_MATCH_KEYS, - &&TARGET_EXTENDED_ARG_QUICK, + &&TARGET_CALL_NO_KW_BUILTIN_FAST, &&TARGET_PUSH_EXC_INFO, &&TARGET_CHECK_EXC_MATCH, &&TARGET_CHECK_EG_MATCH, + &&TARGET_CALL_NO_KW_BUILTIN_O, + &&TARGET_CALL_NO_KW_ISINSTANCE, + &&TARGET_CALL_NO_KW_LEN, + &&TARGET_CALL_NO_KW_LIST_APPEND, + &&TARGET_CALL_NO_KW_METHOD_DESCRIPTOR_FAST, + &&TARGET_CALL_NO_KW_METHOD_DESCRIPTOR_NOARGS, + &&TARGET_CALL_NO_KW_METHOD_DESCRIPTOR_O, + &&TARGET_CALL_NO_KW_STR_1, + &&TARGET_CALL_NO_KW_TUPLE_1, + &&TARGET_CALL_NO_KW_TYPE_1, + &&TARGET_COMPARE_OP_ADAPTIVE, + &&TARGET_WITH_EXCEPT_START, + &&TARGET_GET_AITER, + &&TARGET_GET_ANEXT, + &&TARGET_BEFORE_ASYNC_WITH, + &&TARGET_BEFORE_WITH, + &&TARGET_END_ASYNC_FOR, + &&TARGET_COMPARE_OP_FLOAT_JUMP, + &&TARGET_COMPARE_OP_INT_JUMP, + &&TARGET_COMPARE_OP_STR_JUMP, + &&TARGET_EXTENDED_ARG_QUICK, &&TARGET_JUMP_BACKWARD_QUICK, + &&TARGET_STORE_SUBSCR, + &&TARGET_DELETE_SUBSCR, &&TARGET_LOAD_ATTR_ADAPTIVE, &&TARGET_LOAD_ATTR_INSTANCE_VALUE, &&TARGET_LOAD_ATTR_MODULE, &&TARGET_LOAD_ATTR_SLOT, &&TARGET_LOAD_ATTR_WITH_HINT, &&TARGET_LOAD_CONST__LOAD_FAST, + &&TARGET_GET_ITER, + &&TARGET_GET_YIELD_FROM_ITER, + &&TARGET_PRINT_EXPR, + &&TARGET_LOAD_BUILD_CLASS, &&TARGET_LOAD_FAST__LOAD_CONST, &&TARGET_LOAD_FAST__LOAD_FAST, + &&TARGET_LOAD_ASSERTION_ERROR, + &&TARGET_RETURN_GENERATOR, &&TARGET_LOAD_GLOBAL_ADAPTIVE, &&TARGET_LOAD_GLOBAL_BUILTIN, - &&TARGET_WITH_EXCEPT_START, - &&TARGET_GET_AITER, - &&TARGET_GET_ANEXT, - &&TARGET_BEFORE_ASYNC_WITH, - &&TARGET_BEFORE_WITH, - &&TARGET_END_ASYNC_FOR, &&TARGET_LOAD_GLOBAL_MODULE, &&TARGET_LOAD_METHOD_ADAPTIVE, &&TARGET_LOAD_METHOD_CLASS, &&TARGET_LOAD_METHOD_MODULE, - &&TARGET_LOAD_METHOD_NO_DICT, - &&TARGET_STORE_SUBSCR, - &&TARGET_DELETE_SUBSCR, - &&TARGET_LOAD_METHOD_WITH_DICT, - &&TARGET_LOAD_METHOD_WITH_VALUES, - &&TARGET_PRECALL_ADAPTIVE, - &&TARGET_PRECALL_BOUND_METHOD, - &&TARGET_PRECALL_BUILTIN_CLASS, - &&TARGET_PRECALL_BUILTIN_FAST_WITH_KEYWORDS, - &&TARGET_GET_ITER, - &&TARGET_GET_YIELD_FROM_ITER, - &&TARGET_PRINT_EXPR, - &&TARGET_LOAD_BUILD_CLASS, - &&TARGET_PRECALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS, - &&TARGET_PRECALL_NO_KW_BUILTIN_FAST, - &&TARGET_LOAD_ASSERTION_ERROR, - &&TARGET_RETURN_GENERATOR, - &&TARGET_PRECALL_NO_KW_BUILTIN_O, - &&TARGET_PRECALL_NO_KW_ISINSTANCE, - &&TARGET_PRECALL_NO_KW_LEN, - &&TARGET_PRECALL_NO_KW_LIST_APPEND, - &&TARGET_PRECALL_NO_KW_METHOD_DESCRIPTOR_FAST, - &&TARGET_PRECALL_NO_KW_METHOD_DESCRIPTOR_NOARGS, &&TARGET_LIST_TO_TUPLE, &&TARGET_RETURN_VALUE, &&TARGET_IMPORT_STAR, @@ -112,7 +112,7 @@ static void *opcode_targets[256] = { &&TARGET_JUMP_FORWARD, &&TARGET_JUMP_IF_FALSE_OR_POP, &&TARGET_JUMP_IF_TRUE_OR_POP, - &&TARGET_PRECALL_NO_KW_METHOD_DESCRIPTOR_O, + &&TARGET_LOAD_METHOD_NO_DICT, &&TARGET_POP_JUMP_FORWARD_IF_FALSE, &&TARGET_POP_JUMP_FORWARD_IF_TRUE, &&TARGET_LOAD_GLOBAL, @@ -120,13 +120,13 @@ static void *opcode_targets[256] = { &&TARGET_CONTAINS_OP, &&TARGET_RERAISE, &&TARGET_COPY, - &&TARGET_PRECALL_NO_KW_STR_1, + &&TARGET_LOAD_METHOD_WITH_DICT, &&TARGET_BINARY_OP, &&TARGET_SEND, &&TARGET_LOAD_FAST, &&TARGET_STORE_FAST, &&TARGET_DELETE_FAST, - &&TARGET_PRECALL_NO_KW_TUPLE_1, + &&TARGET_LOAD_METHOD_WITH_VALUES, &&TARGET_POP_JUMP_FORWARD_IF_NOT_NONE, &&TARGET_POP_JUMP_FORWARD_IF_NONE, &&TARGET_RAISE_VARARGS, @@ -140,45 +140,42 @@ static void *opcode_targets[256] = { &&TARGET_STORE_DEREF, &&TARGET_DELETE_DEREF, &&TARGET_JUMP_BACKWARD, - &&TARGET_PRECALL_NO_KW_TYPE_1, + &&TARGET_RESUME_QUICK, &&TARGET_CALL_FUNCTION_EX, - &&TARGET_PRECALL_PYFUNC, + &&TARGET_STORE_ATTR_ADAPTIVE, &&TARGET_EXTENDED_ARG, &&TARGET_LIST_APPEND, &&TARGET_SET_ADD, &&TARGET_MAP_ADD, &&TARGET_LOAD_CLASSDEREF, &&TARGET_COPY_FREE_VARS, - &&TARGET_RESUME_QUICK, + &&TARGET_STORE_ATTR_INSTANCE_VALUE, &&TARGET_RESUME, &&TARGET_MATCH_CLASS, - &&TARGET_STORE_ATTR_ADAPTIVE, - &&TARGET_STORE_ATTR_INSTANCE_VALUE, + &&TARGET_STORE_ATTR_SLOT, + &&TARGET_STORE_ATTR_WITH_HINT, &&TARGET_FORMAT_VALUE, &&TARGET_BUILD_CONST_KEY_MAP, &&TARGET_BUILD_STRING, - &&TARGET_STORE_ATTR_SLOT, - &&TARGET_STORE_ATTR_WITH_HINT, - &&TARGET_LOAD_METHOD, &&TARGET_STORE_FAST__LOAD_FAST, + &&TARGET_STORE_FAST__STORE_FAST, + &&TARGET_LOAD_METHOD, + &&TARGET_STORE_SUBSCR_ADAPTIVE, &&TARGET_LIST_EXTEND, &&TARGET_SET_UPDATE, &&TARGET_DICT_MERGE, &&TARGET_DICT_UPDATE, - &&TARGET_PRECALL, - &&TARGET_STORE_FAST__STORE_FAST, - &&TARGET_STORE_SUBSCR_ADAPTIVE, &&TARGET_STORE_SUBSCR_DICT, &&TARGET_STORE_SUBSCR_LIST_INT, + &&TARGET_UNPACK_SEQUENCE_ADAPTIVE, + &&TARGET_UNPACK_SEQUENCE_LIST, + &&TARGET_UNPACK_SEQUENCE_TUPLE, &&TARGET_CALL, &&TARGET_KW_NAMES, &&TARGET_POP_JUMP_BACKWARD_IF_NOT_NONE, &&TARGET_POP_JUMP_BACKWARD_IF_NONE, &&TARGET_POP_JUMP_BACKWARD_IF_FALSE, &&TARGET_POP_JUMP_BACKWARD_IF_TRUE, - &&TARGET_UNPACK_SEQUENCE_ADAPTIVE, - &&TARGET_UNPACK_SEQUENCE_LIST, - &&TARGET_UNPACK_SEQUENCE_TUPLE, &&TARGET_UNPACK_SEQUENCE_TWO_TUPLE, &&_unknown_opcode, &&_unknown_opcode, @@ -254,5 +251,8 @@ static void *opcode_targets[256] = { &&_unknown_opcode, &&_unknown_opcode, &&_unknown_opcode, + &&_unknown_opcode, + &&_unknown_opcode, + &&_unknown_opcode, &&TARGET_DO_TRACING }; diff --git a/Python/specialize.c b/Python/specialize.c index 5469285e16c4d..9579369a599d9 100644 --- a/Python/specialize.c +++ b/Python/specialize.c @@ -24,7 +24,6 @@ uint8_t _PyOpcode_Adaptive[256] = { [BINARY_SUBSCR] = BINARY_SUBSCR_ADAPTIVE, [STORE_SUBSCR] = STORE_SUBSCR_ADAPTIVE, [CALL] = CALL_ADAPTIVE, - [PRECALL] = PRECALL_ADAPTIVE, [STORE_ATTR] = STORE_ATTR_ADAPTIVE, [BINARY_OP] = BINARY_OP_ADAPTIVE, [COMPARE_OP] = COMPARE_OP_ADAPTIVE, @@ -121,7 +120,6 @@ _Py_GetSpecializationStats(void) { err += add_stat_dict(stats, BINARY_OP, "binary_op"); err += add_stat_dict(stats, COMPARE_OP, "compare_op"); err += add_stat_dict(stats, UNPACK_SEQUENCE, "unpack_sequence"); - err += add_stat_dict(stats, PRECALL, "precall"); if (err < 0) { Py_DECREF(stats); return NULL; @@ -1358,38 +1356,39 @@ _Py_Specialize_StoreSubscr(PyObject *container, PyObject *sub, _Py_CODEUNIT *ins static int specialize_class_call(PyObject *callable, _Py_CODEUNIT *instr, int nargs, - PyObject *kwnames, int oparg) + PyObject *kwnames) { - assert(_Py_OPCODE(*instr) == PRECALL_ADAPTIVE); + assert(_Py_OPCODE(*instr) == CALL_ADAPTIVE); PyTypeObject *tp = _PyType_CAST(callable); if (tp->tp_new == PyBaseObject_Type.tp_new) { - SPECIALIZATION_FAIL(PRECALL, SPEC_FAIL_CALL_PYTHON_CLASS); + SPECIALIZATION_FAIL(CALL, SPEC_FAIL_CALL_PYTHON_CLASS); return -1; } if (tp->tp_flags & Py_TPFLAGS_IMMUTABLETYPE) { + int oparg = _Py_OPARG(*instr); if (nargs == 1 && kwnames == NULL && oparg == 1) { if (tp == &PyUnicode_Type) { - _Py_SET_OPCODE(*instr, PRECALL_NO_KW_STR_1); + _Py_SET_OPCODE(*instr, CALL_NO_KW_STR_1); return 0; } else if (tp == &PyType_Type) { - _Py_SET_OPCODE(*instr, PRECALL_NO_KW_TYPE_1); + _Py_SET_OPCODE(*instr, CALL_NO_KW_TYPE_1); return 0; } else if (tp == &PyTuple_Type) { - _Py_SET_OPCODE(*instr, PRECALL_NO_KW_TUPLE_1); + _Py_SET_OPCODE(*instr, CALL_NO_KW_TUPLE_1); return 0; } } if (tp->tp_vectorcall != NULL) { - _Py_SET_OPCODE(*instr, PRECALL_BUILTIN_CLASS); + _Py_SET_OPCODE(*instr, CALL_BUILTIN_CLASS); return 0; } - SPECIALIZATION_FAIL(PRECALL, tp == &PyUnicode_Type ? + SPECIALIZATION_FAIL(CALL, tp == &PyUnicode_Type ? SPEC_FAIL_CALL_STR : SPEC_FAIL_CALL_CLASS_NO_VECTORCALL); return -1; } - SPECIALIZATION_FAIL(PRECALL, SPEC_FAIL_CALL_CLASS_MUTABLE); + SPECIALIZATION_FAIL(CALL, SPEC_FAIL_CALL_CLASS_MUTABLE); return -1; } @@ -1419,11 +1418,11 @@ builtin_call_fail_kind(int ml_flags) static int specialize_method_descriptor(PyMethodDescrObject *descr, _Py_CODEUNIT *instr, - int nargs, PyObject *kwnames, int oparg) + int nargs, PyObject *kwnames) { - assert(_Py_OPCODE(*instr) == PRECALL_ADAPTIVE); + assert(_Py_OPCODE(*instr) == CALL_ADAPTIVE); if (kwnames) { - SPECIALIZATION_FAIL(PRECALL, SPEC_FAIL_CALL_KWNAMES); + SPECIALIZATION_FAIL(CALL, SPEC_FAIL_CALL_KWNAMES); return -1; } @@ -1432,45 +1431,45 @@ specialize_method_descriptor(PyMethodDescrObject *descr, _Py_CODEUNIT *instr, METH_KEYWORDS | METH_METHOD)) { case METH_NOARGS: { if (nargs != 1) { - SPECIALIZATION_FAIL(PRECALL, SPEC_FAIL_WRONG_NUMBER_ARGUMENTS); + SPECIALIZATION_FAIL(CALL, SPEC_FAIL_WRONG_NUMBER_ARGUMENTS); return -1; } - _Py_SET_OPCODE(*instr, PRECALL_NO_KW_METHOD_DESCRIPTOR_NOARGS); + _Py_SET_OPCODE(*instr, CALL_NO_KW_METHOD_DESCRIPTOR_NOARGS); return 0; } case METH_O: { if (nargs != 2) { - SPECIALIZATION_FAIL(PRECALL, SPEC_FAIL_WRONG_NUMBER_ARGUMENTS); + SPECIALIZATION_FAIL(CALL, SPEC_FAIL_WRONG_NUMBER_ARGUMENTS); return -1; } PyInterpreterState *interp = _PyInterpreterState_GET(); PyObject *list_append = interp->callable_cache.list_append; - _Py_CODEUNIT next = instr[INLINE_CACHE_ENTRIES_PRECALL + 1 - + INLINE_CACHE_ENTRIES_CALL + 1]; + _Py_CODEUNIT next = instr[INLINE_CACHE_ENTRIES_CALL + 1]; bool pop = (_Py_OPCODE(next) == POP_TOP); + int oparg = _Py_OPARG(*instr); if ((PyObject *)descr == list_append && oparg == 1 && pop) { - _Py_SET_OPCODE(*instr, PRECALL_NO_KW_LIST_APPEND); + _Py_SET_OPCODE(*instr, CALL_NO_KW_LIST_APPEND); return 0; } - _Py_SET_OPCODE(*instr, PRECALL_NO_KW_METHOD_DESCRIPTOR_O); + _Py_SET_OPCODE(*instr, CALL_NO_KW_METHOD_DESCRIPTOR_O); return 0; } case METH_FASTCALL: { - _Py_SET_OPCODE(*instr, PRECALL_NO_KW_METHOD_DESCRIPTOR_FAST); + _Py_SET_OPCODE(*instr, CALL_NO_KW_METHOD_DESCRIPTOR_FAST); return 0; } case METH_FASTCALL|METH_KEYWORDS: { - _Py_SET_OPCODE(*instr, PRECALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS); + _Py_SET_OPCODE(*instr, CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS); return 0; } } - SPECIALIZATION_FAIL(PRECALL, builtin_call_fail_kind(descr->d_method->ml_flags)); + SPECIALIZATION_FAIL(CALL, builtin_call_fail_kind(descr->d_method->ml_flags)); return -1; } static int specialize_py_call(PyFunctionObject *func, _Py_CODEUNIT *instr, int nargs, - PyObject *kwnames) + PyObject *kwnames, bool bound_method) { _PyCallCache *cache = (_PyCallCache *)(instr + 1); assert(_Py_OPCODE(*instr) == CALL_ADAPTIVE); @@ -1512,7 +1511,11 @@ specialize_py_call(PyFunctionObject *func, _Py_CODEUNIT *instr, int nargs, write_u32(cache->func_version, version); cache->min_args = min_args; if (argcount == nargs) { - _Py_SET_OPCODE(*instr, CALL_PY_EXACT_ARGS); + _Py_SET_OPCODE(*instr, bound_method ? CALL_BOUND_METHOD_EXACT_ARGS : CALL_PY_EXACT_ARGS); + } + else if (bound_method) { + SPECIALIZATION_FAIL(CALL, SPEC_FAIL_CALL_BOUND_METHOD); + return -1; } else { _Py_SET_OPCODE(*instr, CALL_PY_WITH_DEFAULTS); @@ -1524,7 +1527,7 @@ static int specialize_c_call(PyObject *callable, _Py_CODEUNIT *instr, int nargs, PyObject *kwnames) { - assert(_Py_OPCODE(*instr) == PRECALL_ADAPTIVE); + assert(_Py_OPCODE(*instr) == CALL_ADAPTIVE); if (PyCFunction_GET_FUNCTION(callable) == NULL) { return 1; } @@ -1533,44 +1536,44 @@ specialize_c_call(PyObject *callable, _Py_CODEUNIT *instr, int nargs, METH_KEYWORDS | METH_METHOD)) { case METH_O: { if (kwnames) { - SPECIALIZATION_FAIL(PRECALL, SPEC_FAIL_CALL_KWNAMES); + SPECIALIZATION_FAIL(CALL, SPEC_FAIL_CALL_KWNAMES); return -1; } if (nargs != 1) { - SPECIALIZATION_FAIL(PRECALL, SPEC_FAIL_WRONG_NUMBER_ARGUMENTS); + SPECIALIZATION_FAIL(CALL, SPEC_FAIL_WRONG_NUMBER_ARGUMENTS); return 1; } /* len(o) */ PyInterpreterState *interp = _PyInterpreterState_GET(); if (callable == interp->callable_cache.len) { - _Py_SET_OPCODE(*instr, PRECALL_NO_KW_LEN); + _Py_SET_OPCODE(*instr, CALL_NO_KW_LEN); return 0; } - _Py_SET_OPCODE(*instr, PRECALL_NO_KW_BUILTIN_O); + _Py_SET_OPCODE(*instr, CALL_NO_KW_BUILTIN_O); return 0; } case METH_FASTCALL: { if (kwnames) { - SPECIALIZATION_FAIL(PRECALL, SPEC_FAIL_CALL_KWNAMES); + SPECIALIZATION_FAIL(CALL, SPEC_FAIL_CALL_KWNAMES); return -1; } if (nargs == 2) { /* isinstance(o1, o2) */ PyInterpreterState *interp = _PyInterpreterState_GET(); if (callable == interp->callable_cache.isinstance) { - _Py_SET_OPCODE(*instr, PRECALL_NO_KW_ISINSTANCE); + _Py_SET_OPCODE(*instr, CALL_NO_KW_ISINSTANCE); return 0; } } - _Py_SET_OPCODE(*instr, PRECALL_NO_KW_BUILTIN_FAST); + _Py_SET_OPCODE(*instr, CALL_NO_KW_BUILTIN_FAST); return 0; } case METH_FASTCALL | METH_KEYWORDS: { - _Py_SET_OPCODE(*instr, PRECALL_BUILTIN_FAST_WITH_KEYWORDS); + _Py_SET_OPCODE(*instr, CALL_BUILTIN_FAST_WITH_KEYWORDS); return 0; } default: - SPECIALIZATION_FAIL(PRECALL, + SPECIALIZATION_FAIL(CALL, builtin_call_fail_kind(PyCFunction_GET_FLAGS(callable))); return 1; } @@ -1618,62 +1621,39 @@ call_fail_kind(PyObject *callable) #endif +/* TODO: + - Specialize calling classes. +*/ int -_Py_Specialize_Precall(PyObject *callable, _Py_CODEUNIT *instr, int nargs, - PyObject *kwnames, int oparg) +_Py_Specialize_Call(PyObject *callable, _Py_CODEUNIT *instr, int nargs, + PyObject *kwnames) { - assert(_PyOpcode_Caches[PRECALL] == INLINE_CACHE_ENTRIES_PRECALL); - _PyPrecallCache *cache = (_PyPrecallCache *)(instr + 1); + assert(_PyOpcode_Caches[CALL] == INLINE_CACHE_ENTRIES_CALL); + _PyCallCache *cache = (_PyCallCache *)(instr + 1); int fail; if (PyCFunction_CheckExact(callable)) { fail = specialize_c_call(callable, instr, nargs, kwnames); } else if (PyFunction_Check(callable)) { - _Py_SET_OPCODE(*instr, PRECALL_PYFUNC); - fail = 0; + fail = specialize_py_call((PyFunctionObject *)callable, instr, nargs, + kwnames, false); } else if (PyType_Check(callable)) { - fail = specialize_class_call(callable, instr, nargs, kwnames, oparg); + fail = specialize_class_call(callable, instr, nargs, kwnames); } else if (Py_IS_TYPE(callable, &PyMethodDescr_Type)) { fail = specialize_method_descriptor((PyMethodDescrObject *)callable, - instr, nargs, kwnames, oparg); + instr, nargs, kwnames); } else if (Py_TYPE(callable) == &PyMethod_Type) { - _Py_SET_OPCODE(*instr, PRECALL_BOUND_METHOD); - fail = 0; - } - else { - SPECIALIZATION_FAIL(PRECALL, call_fail_kind(callable)); - fail = -1; - } - if (fail) { - STAT_INC(PRECALL, failure); - assert(!PyErr_Occurred()); - cache->counter = ADAPTIVE_CACHE_BACKOFF; - } - else { - STAT_INC(PRECALL, success); - assert(!PyErr_Occurred()); - cache->counter = initial_counter_value(); - } - return 0; -} - - -/* TODO: - - Specialize calling classes. -*/ -int -_Py_Specialize_Call(PyObject *callable, _Py_CODEUNIT *instr, int nargs, - PyObject *kwnames) -{ - assert(_PyOpcode_Caches[CALL] == INLINE_CACHE_ENTRIES_CALL); - _PyCallCache *cache = (_PyCallCache *)(instr + 1); - int fail; - if (PyFunction_Check(callable)) { - fail = specialize_py_call((PyFunctionObject *)callable, instr, nargs, - kwnames); + PyObject *func = ((PyMethodObject *)callable)->im_func; + if (PyFunction_Check(func)) { + fail = specialize_py_call((PyFunctionObject *)func, + instr, nargs+1, kwnames, true); + } else { + SPECIALIZATION_FAIL(CALL, SPEC_FAIL_CALL_BOUND_METHOD); + fail = -1; + } } else { SPECIALIZATION_FAIL(CALL, call_fail_kind(callable)); From webhook-mailer at python.org Thu May 19 06:43:56 2022 From: webhook-mailer at python.org (tiran) Date: Thu, 19 May 2022 10:43:56 -0000 Subject: [Python-checkins] gh-90473: Decrease recursion limit and skip tests on WASI (GH-92803) Message-ID: https://github.com/python/cpython/commit/137fd3d88aa46669f5717734e823f4c594ab2843 commit: 137fd3d88aa46669f5717734e823f4c594ab2843 branch: main author: Christian Heimes committer: tiran date: 2022-05-19T12:43:16+02:00 summary: gh-90473: Decrease recursion limit and skip tests on WASI (GH-92803) files: A Misc/NEWS.d/next/Core and Builtins/2022-05-15-15-25-05.gh-issue-90473.MoPHYW.rst M Include/internal/pycore_ceval.h M Lib/platform.py M Lib/test/pythoninfo.py M Lib/test/support/__init__.py M Lib/test/test_compile.py M Lib/test/test_fileio.py M Lib/test/test_largefile.py M Lib/test/test_logging.py M Lib/test/test_os.py M Lib/test/test_signal.py M Lib/test/test_tomllib/test_misc.py M Lib/test/test_zipimport.py M Modules/timemodule.c M Parser/parser.c M Tools/peg_generator/pegen/c_generator.py M Tools/wasm/README.md M Tools/wasm/config.site-wasm32-wasi M configure M configure.ac diff --git a/Include/internal/pycore_ceval.h b/Include/internal/pycore_ceval.h index 8dd89c6850794..3efd6beb035a1 100644 --- a/Include/internal/pycore_ceval.h +++ b/Include/internal/pycore_ceval.h @@ -12,8 +12,14 @@ extern "C" { struct pyruntimestate; struct _ceval_runtime_state; +/* WASI has limited call stack. wasmtime 0.36 can handle sufficient amount of + C stack frames for little more than 750 recursions. */ #ifndef Py_DEFAULT_RECURSION_LIMIT -# define Py_DEFAULT_RECURSION_LIMIT 1000 +# ifdef __wasi__ +# define Py_DEFAULT_RECURSION_LIMIT 750 +# else +# define Py_DEFAULT_RECURSION_LIMIT 1000 +# endif #endif #include "pycore_interp.h" // PyInterpreterState.eval_frame diff --git a/Lib/platform.py b/Lib/platform.py index 3f3f25a2c92d3..c272c407c7776 100755 --- a/Lib/platform.py +++ b/Lib/platform.py @@ -186,6 +186,10 @@ def libc_ver(executable=None, lib='', version='', chunksize=16384): executable = sys.executable + if not executable: + # sys.executable is not set. + return lib, version + V = _comparable_version # We use os.path.realpath() # here to work around problems with Cygwin not being diff --git a/Lib/test/pythoninfo.py b/Lib/test/pythoninfo.py index 28549a645b0f5..84e1c047f9219 100644 --- a/Lib/test/pythoninfo.py +++ b/Lib/test/pythoninfo.py @@ -545,8 +545,14 @@ def format_attr(attr, value): def collect_socket(info_add): import socket - hostname = socket.gethostname() - info_add('socket.hostname', hostname) + try: + hostname = socket.gethostname() + except OSError: + # WASI SDK 15.0 does not have gethostname(2). + if sys.platform != "wasi": + raise + else: + info_add('socket.hostname', hostname) def collect_sqlite(info_add): diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py index e4bda940b3dd6..c284fc67b6402 100644 --- a/Lib/test/support/__init__.py +++ b/Lib/test/support/__init__.py @@ -199,6 +199,11 @@ def get_original_stdout(): def _force_run(path, func, *args): try: return func(*args) + except FileNotFoundError as err: + # chmod() won't fix a missing file. + if verbose >= 2: + print('%s: %s' % (err.__class__.__name__, err)) + raise except OSError as err: if verbose >= 2: print('%s: %s' % (err.__class__.__name__, err)) diff --git a/Lib/test/test_compile.py b/Lib/test/test_compile.py index 487a4fa2a9540..d4357243ddabf 100644 --- a/Lib/test/test_compile.py +++ b/Lib/test/test_compile.py @@ -109,7 +109,9 @@ def __getitem__(self, key): self.assertEqual(d['z'], 12) def test_extended_arg(self): - longexpr = 'x = x or ' + '-x' * 2500 + # default: 1000 * 2.5 = 2500 repetitions + repeat = int(sys.getrecursionlimit() * 2.5) + longexpr = 'x = x or ' + '-x' * repeat g = {} code = ''' def f(x): diff --git a/Lib/test/test_fileio.py b/Lib/test/test_fileio.py index e4984d3cd559e..c26cdc028cc89 100644 --- a/Lib/test/test_fileio.py +++ b/Lib/test/test_fileio.py @@ -9,7 +9,9 @@ from weakref import proxy from functools import wraps -from test.support import cpython_only, swap_attr, gc_collect, is_emscripten +from test.support import ( + cpython_only, swap_attr, gc_collect, is_emscripten, is_wasi +) from test.support.os_helper import (TESTFN, TESTFN_UNICODE, make_bad_fd) from test.support.warnings_helper import check_warnings from collections import UserList @@ -65,6 +67,7 @@ def testAttributes(self): self.assertRaises((AttributeError, TypeError), setattr, f, attr, 'oops') + @unittest.skipIf(is_wasi, "WASI does not expose st_blksize.") def testBlksize(self): # test private _blksize attribute blksize = io.DEFAULT_BUFFER_SIZE diff --git a/Lib/test/test_largefile.py b/Lib/test/test_largefile.py index 8f6bec1620053..3c11c59baef6e 100644 --- a/Lib/test/test_largefile.py +++ b/Lib/test/test_largefile.py @@ -156,6 +156,8 @@ def test_seekable(self): def skip_no_disk_space(path, required): def decorator(fun): def wrapper(*args, **kwargs): + if not hasattr(shutil, "disk_usage"): + raise unittest.SkipTest("requires shutil.disk_usage") if shutil.disk_usage(os.path.realpath(path)).free < required: hsize = int(required / 1024 / 1024) raise unittest.SkipTest( diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py index e69afae484aa7..fd562322a7637 100644 --- a/Lib/test/test_logging.py +++ b/Lib/test/test_logging.py @@ -5280,6 +5280,7 @@ def test_emit_after_closing_in_write_mode(self): self.assertEqual(fp.read().strip(), '1') class RotatingFileHandlerTest(BaseFileTest): + @unittest.skipIf(support.is_wasi, "WASI does not have /dev/null.") def test_should_not_rollover(self): # If maxbytes is zero rollover never occurs rh = logging.handlers.RotatingFileHandler( @@ -5387,6 +5388,7 @@ def rotator(source, dest): rh.close() class TimedRotatingFileHandlerTest(BaseFileTest): + @unittest.skipIf(support.is_wasi, "WASI does not have /dev/null.") def test_should_not_rollover(self): # See bpo-45401. Should only ever rollover regular files fh = logging.handlers.TimedRotatingFileHandler( diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py index 36ad587760d70..ae071821e1ccf 100644 --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -11,7 +11,6 @@ import fractions import itertools import locale -import mmap import os import pickle import select @@ -59,6 +58,10 @@ except ImportError: INT_MAX = PY_SSIZE_T_MAX = sys.maxsize +try: + import mmap +except ImportError: + mmap = None from test.support.script_helper import assert_python_ok from test.support import unix_shell @@ -2167,7 +2170,8 @@ def test_fchown(self): @unittest.skipUnless(hasattr(os, 'fpathconf'), 'test needs os.fpathconf()') @unittest.skipIf( - support.is_emscripten, "musl libc issue on Emscripten, bpo-46390" + support.is_emscripten or support.is_wasi, + "musl libc issue on Emscripten/WASI, bpo-46390" ) def test_fpathconf(self): self.check(os.pathconf, "PC_NAME_MAX") @@ -2460,6 +2464,7 @@ def test_kill_int(self): # os.kill on Windows can take an int which gets set as the exit code self._kill(100) + @unittest.skipIf(mmap is None, "requires mmap") def _kill_with_event(self, event, name): tagname = "test_os_%s" % uuid.uuid1() m = mmap.mmap(-1, 1, tagname) diff --git a/Lib/test/test_signal.py b/Lib/test/test_signal.py index 6d3b299b24cca..6aa529b062000 100644 --- a/Lib/test/test_signal.py +++ b/Lib/test/test_signal.py @@ -107,6 +107,10 @@ def test_interprocess_signal(self): script = os.path.join(dirname, 'signalinterproctester.py') assert_python_ok(script) + @unittest.skipUnless( + hasattr(signal, "valid_signals"), + "requires signal.valid_signals" + ) def test_valid_signals(self): s = signal.valid_signals() self.assertIsInstance(s, set) @@ -212,6 +216,7 @@ def test_invalid_fd(self): self.assertRaises((ValueError, OSError), signal.set_wakeup_fd, fd) + @unittest.skipUnless(support.has_socket_support, "needs working sockets.") def test_invalid_socket(self): sock = socket.socket() fd = sock.fileno() @@ -241,6 +246,7 @@ def test_set_wakeup_fd_result(self): self.assertEqual(signal.set_wakeup_fd(-1), -1) @unittest.skipIf(support.is_emscripten, "Emscripten cannot fstat pipes.") + @unittest.skipUnless(support.has_socket_support, "needs working sockets.") def test_set_wakeup_fd_socket_result(self): sock1 = socket.socket() self.addCleanup(sock1.close) diff --git a/Lib/test/test_tomllib/test_misc.py b/Lib/test/test_tomllib/test_misc.py index 76fa5905fa49e..378db58f25594 100644 --- a/Lib/test/test_tomllib/test_misc.py +++ b/Lib/test/test_tomllib/test_misc.py @@ -6,6 +6,7 @@ import datetime from decimal import Decimal as D from pathlib import Path +import sys import tempfile import unittest @@ -91,11 +92,13 @@ def test_deepcopy(self): self.assertEqual(obj_copy, expected_obj) def test_inline_array_recursion_limit(self): - nest_count = 470 + # 470 with default recursion limit + nest_count = int(sys.getrecursionlimit() * 0.47) recursive_array_toml = "arr = " + nest_count * "[" + nest_count * "]" tomllib.loads(recursive_array_toml) def test_inline_table_recursion_limit(self): - nest_count = 310 + # 310 with default recursion limit + nest_count = int(sys.getrecursionlimit() * 0.31) recursive_table_toml = nest_count * "key = {" + nest_count * "}" tomllib.loads(recursive_table_toml) diff --git a/Lib/test/test_zipimport.py b/Lib/test/test_zipimport.py index 85dbf4d8f68eb..66789262dd6ca 100644 --- a/Lib/test/test_zipimport.py +++ b/Lib/test/test_zipimport.py @@ -804,6 +804,7 @@ def testEmptyFile(self): os_helper.create_empty_file(TESTMOD) self.assertZipFailure(TESTMOD) + @unittest.skipIf(support.is_wasi, "mode 000 not supported.") def testFileUnreadable(self): os_helper.unlink(TESTMOD) fd = os.open(TESTMOD, os.O_CREAT, 000) diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-15-15-25-05.gh-issue-90473.MoPHYW.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-15-15-25-05.gh-issue-90473.MoPHYW.rst new file mode 100644 index 0000000000000..1f9f45a511fba --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-05-15-15-25-05.gh-issue-90473.MoPHYW.rst @@ -0,0 +1 @@ +Decrease default recursion limit on WASI to address limited call stack size. diff --git a/Modules/timemodule.c b/Modules/timemodule.c index 7475ef344b72b..18f9ddb909c02 100644 --- a/Modules/timemodule.c +++ b/Modules/timemodule.c @@ -1481,7 +1481,7 @@ _PyTime_GetThreadTimeWithInfo(_PyTime_t *tp, _Py_clock_info_t *info) #elif defined(HAVE_CLOCK_GETTIME) && \ defined(CLOCK_PROCESS_CPUTIME_ID) && \ - !defined(__EMSCRIPTEN__) + !defined(__EMSCRIPTEN__) && !defined(__wasi__) #define HAVE_THREAD_TIME #if defined(__APPLE__) && defined(__has_attribute) && __has_attribute(availability) diff --git a/Parser/parser.c b/Parser/parser.c index adc8d509eb7d7..08bf6d2945600 100644 --- a/Parser/parser.c +++ b/Parser/parser.c @@ -7,7 +7,11 @@ # define D(x) #endif -# define MAXSTACK 6000 +#ifdef __wasi__ +# define MAXSTACK 4000 +#else +# define MAXSTACK 6000 +#endif static const int n_keyword_lists = 9; static KeywordToken *reserved_keywords[] = { (KeywordToken[]) {{NULL, -1}}, diff --git a/Tools/peg_generator/pegen/c_generator.py b/Tools/peg_generator/pegen/c_generator.py index 56a1e5a5a14fb..65bfd5900a696 100644 --- a/Tools/peg_generator/pegen/c_generator.py +++ b/Tools/peg_generator/pegen/c_generator.py @@ -37,7 +37,11 @@ # define D(x) #endif -# define MAXSTACK 6000 +#ifdef __wasi__ +# define MAXSTACK 4000 +#else +# define MAXSTACK 6000 +#endif """ diff --git a/Tools/wasm/README.md b/Tools/wasm/README.md index 83806f0581ace..977b2bb2a8ab9 100644 --- a/Tools/wasm/README.md +++ b/Tools/wasm/README.md @@ -220,10 +220,27 @@ AddType application/wasm wasm # WASI (wasm32-wasi) -WASI builds require [WASI SDK](https://github.com/WebAssembly/wasi-sdk) and -currently [wasix](https://github.com/singlestore-labs/wasix) for POSIX +WASI builds require [WASI SDK](https://github.com/WebAssembly/wasi-sdk) 15.0+ +and currently [wasix](https://github.com/singlestore-labs/wasix) for POSIX compatibility stubs. +## WASI limitations and issues (WASI SDK 15.0) + +A lot of Emscripten limitations also apply to WASI. Noticable restrictions +are: + +- Call stack size is limited. Default recursion limit and parser stack size + are smaller than in regular Python builds. +- ``socket(2)`` cannot create new socket file descriptors. WASI programs can + call read/write/accept on a file descriptor that is passed into the process. +- ``socket.gethostname()`` and host name resolution APIs like + ``socket.gethostbyname()`` are not implemented and always fail. +- ``chmod(2)`` is not available. It's not possible to modify file permissions, + yet. A future version of WASI may provide a limited ``set_permissions`` API. +- File locking (``fcntl``) is not available. +- ``os.pipe()``, ``os.mkfifo()``, and ``os.mknod()`` are not supported. + + # Detect WebAssembly builds ## Python code diff --git a/Tools/wasm/config.site-wasm32-wasi b/Tools/wasm/config.site-wasm32-wasi index 255e99c279a0a..ee3fc830e3d8a 100644 --- a/Tools/wasm/config.site-wasm32-wasi +++ b/Tools/wasm/config.site-wasm32-wasi @@ -17,3 +17,24 @@ ac_cv_header_sys_resource_h=no # undefined symbols / unsupported features ac_cv_func_eventfd=no + +# WASI SDK 15.0 has no pipe syscall. +ac_cv_func_pipe=no + +# WASI SDK 15.0 cannot create fifos and special files. +ac_cv_func_mkfifo=no +ac_cv_func_mkfifoat=no +ac_cv_func_mknod=no +ac_cv_func_mknodat=no + +# fdopendir() fails on SDK 15.0, +# OSError: [Errno 28] Invalid argument: '.' +ac_cv_func_fdopendir=no + +# WASIX stubs we don't want to use. +ac_cv_func_kill=no + +# WASI sockets are limited to operations on given socket fd and inet sockets. +# Disable AF_UNIX and AF_PACKET support, see socketmodule.h. +ac_cv_header_sys_un_h=no +ac_cv_header_netpacket_packet_h=no diff --git a/configure b/configure index 02810880e914f..6fa4051310b12 100755 --- a/configure +++ b/configure @@ -22611,6 +22611,7 @@ case $ac_sys_system in #( py_cv_module__ctypes_test=n/a + py_cv_module_fcntl=n/a py_cv_module_=n/a diff --git a/configure.ac b/configure.ac index eab326232b14d..bef4904325b52 100644 --- a/configure.ac +++ b/configure.ac @@ -6690,8 +6690,10 @@ AS_CASE([$ac_sys_system], ], [Emscripten/node*], [], [WASI/*], [ + dnl WASI SDK 15.0 does not support file locking. PY_STDLIB_MOD_SET_NA( [_ctypes_test], + [fcntl], ) ] ) From webhook-mailer at python.org Thu May 19 09:55:51 2022 From: webhook-mailer at python.org (corona10) Date: Thu, 19 May 2022 13:55:51 -0000 Subject: [Python-checkins] GH-92955: fix memory leak in code object lines and positions iterators (gh-92956) Message-ID: https://github.com/python/cpython/commit/c5f5f978ca6b8b62effcbc4aa61932b76718da78 commit: c5f5f978ca6b8b62effcbc4aa61932b76718da78 branch: main author: Kumar Aditya <59607654+kumaraditya303 at users.noreply.github.com> committer: corona10 date: 2022-05-19T22:55:22+09:00 summary: GH-92955: fix memory leak in code object lines and positions iterators (gh-92956) files: A Misc/NEWS.d/next/Core and Builtins/2022-05-19-13-25-50.gh-issue-92955.kmNV33.rst M Objects/codeobject.c M Objects/object.c diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-19-13-25-50.gh-issue-92955.kmNV33.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-19-13-25-50.gh-issue-92955.kmNV33.rst new file mode 100644 index 0000000000000..09f03e520c436 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-05-19-13-25-50.gh-issue-92955.kmNV33.rst @@ -0,0 +1 @@ +Fix memory leak in code object's lines and positions iterators as they were not finalized at exit. Patch by Kumar Aditya. diff --git a/Objects/codeobject.c b/Objects/codeobject.c index c2b29be1fe869..68b0b1efb2e14 100644 --- a/Objects/codeobject.c +++ b/Objects/codeobject.c @@ -1096,7 +1096,7 @@ lineiter_next(lineiterator *li) return result; } -static PyTypeObject LineIterator = { +PyTypeObject _PyLineIterator = { PyVarObject_HEAD_INIT(&PyType_Type, 0) "line_iterator", /* tp_name */ sizeof(lineiterator), /* tp_basicsize */ @@ -1142,7 +1142,7 @@ static PyTypeObject LineIterator = { static lineiterator * new_linesiterator(PyCodeObject *code) { - lineiterator *li = (lineiterator *)PyType_GenericAlloc(&LineIterator, 0); + lineiterator *li = (lineiterator *)PyType_GenericAlloc(&_PyLineIterator, 0); if (li == NULL) { return NULL; } @@ -1196,7 +1196,7 @@ positionsiter_next(positionsiterator* pi) _source_offset_converter, &pi->pi_endcolumn); } -static PyTypeObject PositionsIterator = { +PyTypeObject _PyPositionsIterator = { PyVarObject_HEAD_INIT(&PyType_Type, 0) "positions_iterator", /* tp_name */ sizeof(positionsiterator), /* tp_basicsize */ @@ -1242,7 +1242,7 @@ static PyTypeObject PositionsIterator = { static PyObject* code_positionsiterator(PyCodeObject* code, PyObject* Py_UNUSED(args)) { - positionsiterator* pi = (positionsiterator*)PyType_GenericAlloc(&PositionsIterator, 0); + positionsiterator* pi = (positionsiterator*)PyType_GenericAlloc(&_PyPositionsIterator, 0); if (pi == NULL) { return NULL; } diff --git a/Objects/object.c b/Objects/object.c index c9bb60eaed87c..95045ed03d5db 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -1846,6 +1846,8 @@ extern PyTypeObject PyHKEY_Type; #endif extern PyTypeObject _Py_GenericAliasIterType; extern PyTypeObject _PyMemoryIter_Type; +extern PyTypeObject _PyLineIterator; +extern PyTypeObject _PyPositionsIterator; static PyTypeObject* static_types[] = { // The two most important base types: must be initialized first and @@ -1944,12 +1946,14 @@ static PyTypeObject* static_types[] = { &_PyHamt_CollisionNode_Type, &_PyHamt_Type, &_PyInterpreterID_Type, + &_PyLineIterator, &_PyManagedBuffer_Type, &_PyMemoryIter_Type, &_PyMethodWrapper_Type, &_PyNamespace_Type, &_PyNone_Type, &_PyNotImplemented_Type, + &_PyPositionsIterator, &_PyUnicodeASCIIIter_Type, &_PyUnion_Type, &_PyWeakref_CallableProxyType, From webhook-mailer at python.org Thu May 19 10:08:05 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Thu, 19 May 2022 14:08:05 -0000 Subject: [Python-checkins] gh-91491: Complete Whats New in 3.11 for typing (#92708) Message-ID: https://github.com/python/cpython/commit/6b51773afd5658e15d23ce220f66fcc39c02dcae commit: 6b51773afd5658e15d23ce220f66fcc39c02dcae branch: main author: Jelle Zijlstra committer: JelleZijlstra date: 2022-05-19T07:07:54-07:00 summary: gh-91491: Complete Whats New in 3.11 for typing (#92708) Fixes #91491 Co-authored-by: Shantanu <12621235+hauntsaninja at users.noreply.github.com> Co-authored-by: Alex Waygood files: M Doc/whatsnew/3.11.rst diff --git a/Doc/whatsnew/3.11.rst b/Doc/whatsnew/3.11.rst index 0cbb0ba77217f..1fd5b35695ee3 100644 --- a/Doc/whatsnew/3.11.rst +++ b/Doc/whatsnew/3.11.rst @@ -730,6 +730,12 @@ For major changes, see :ref:`new-feat-related-type-hints-311`. the given type. At runtime it simply returns the received value. (Contributed by Jelle Zijlstra in :gh:`90638`.) +* :data:`typing.TypedDict` types can now be generic. (Contributed by + Samodya Abey in :gh:`89026`.) + +* :class:`~typing.NamedTuple` types can now be generic. + (Contributed by Serhiy Storchaka in :issue:`43923`.) + * Allow subclassing of :class:`typing.Any`. This is useful for avoiding type checker errors related to highly dynamic class, such as mocks. (Contributed by Shantanu Jain in :gh:`91154`.) @@ -743,11 +749,33 @@ For major changes, see :ref:`new-feat-related-type-hints-311`. to clear all registered overloads of a function. (Contributed by Jelle Zijlstra in :gh:`89263`.) -* :data:`typing.TypedDict` subclasses can now be generic. (Contributed by - Samodya Abey in :gh:`89026`.) +* The :meth:`__init__` method of :class:`~typing.Protocol` subclasses + is now preserved. (Contributed by Adrian Garcia Badarasco in :gh:`88970`.) -* :class:`~typing.NamedTuple` subclasses can now be generic. - (Contributed by Serhiy Storchaka in :issue:`43923`.) +* The representation of empty tuple types (``Tuple[()]``) is simplified. + This affects introspection, e.g. ``get_args(Tuple[()])`` now evaluates + to ``()`` instead of ``((),)``. + (Contributed by Serhiy Storchaka in :gh:`91137`.) + +* Loosen runtime requirements for type annotations by removing the callable + check in the private ``typing._type_check`` function. (Contributed by + Gregory Beauregard in :gh:`90802`.) + +* :func:`typing.get_type_hints` now supports evaluating strings as forward + references in :ref:`PEP 585 generic aliases `. + (Contributed by Niklas Rosenstein in :gh:`85542`.) + +* :func:`typing.get_type_hints` no longer adds :data:`~typing.Optional` + to parameters with ``None`` as a default. (Contributed by Nikita Sobolev + in :gh:`90353`.) + +* :func:`typing.get_type_hints` now supports evaluating bare stringified + :data:`~typing.ClassVar` annotations. (Contributed by Gregory Beauregard + in :gh:`90711`.) + +* :func:`typing.no_type_check` no longer modifies external classes and functions. + It also now correctly marks classmethods as not to be type checked. (Contributed + by Nikita Sobolev in :gh:`90729`.) tkinter @@ -1236,6 +1264,10 @@ Deprecated wherever possible. (Contributed by Alex Waygood in :gh:`92332`.) +* The keyword argument syntax for constructing :data:`~typing.TypedDict` types + is now deprecated. Support will be removed in Python 3.13. (Contributed by + Jingchen Ye in :gh:`90224`.) + Pending Removal in Python 3.12 ============================== From webhook-mailer at python.org Thu May 19 10:26:12 2022 From: webhook-mailer at python.org (miss-islington) Date: Thu, 19 May 2022 14:26:12 -0000 Subject: [Python-checkins] gh-91491: Complete Whats New in 3.11 for typing (GH-92708) Message-ID: https://github.com/python/cpython/commit/611d43c2a49e7c2c35fc03b0f58570b07c41b0eb commit: 611d43c2a49e7c2c35fc03b0f58570b07c41b0eb branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-19T07:25:50-07:00 summary: gh-91491: Complete Whats New in 3.11 for typing (GH-92708) Fixes GH-91491 Co-authored-by: Shantanu <12621235+hauntsaninja at users.noreply.github.com> Co-authored-by: Alex Waygood (cherry picked from commit 6b51773afd5658e15d23ce220f66fcc39c02dcae) Co-authored-by: Jelle Zijlstra files: M Doc/whatsnew/3.11.rst diff --git a/Doc/whatsnew/3.11.rst b/Doc/whatsnew/3.11.rst index 0cbb0ba77217f..1fd5b35695ee3 100644 --- a/Doc/whatsnew/3.11.rst +++ b/Doc/whatsnew/3.11.rst @@ -730,6 +730,12 @@ For major changes, see :ref:`new-feat-related-type-hints-311`. the given type. At runtime it simply returns the received value. (Contributed by Jelle Zijlstra in :gh:`90638`.) +* :data:`typing.TypedDict` types can now be generic. (Contributed by + Samodya Abey in :gh:`89026`.) + +* :class:`~typing.NamedTuple` types can now be generic. + (Contributed by Serhiy Storchaka in :issue:`43923`.) + * Allow subclassing of :class:`typing.Any`. This is useful for avoiding type checker errors related to highly dynamic class, such as mocks. (Contributed by Shantanu Jain in :gh:`91154`.) @@ -743,11 +749,33 @@ For major changes, see :ref:`new-feat-related-type-hints-311`. to clear all registered overloads of a function. (Contributed by Jelle Zijlstra in :gh:`89263`.) -* :data:`typing.TypedDict` subclasses can now be generic. (Contributed by - Samodya Abey in :gh:`89026`.) +* The :meth:`__init__` method of :class:`~typing.Protocol` subclasses + is now preserved. (Contributed by Adrian Garcia Badarasco in :gh:`88970`.) -* :class:`~typing.NamedTuple` subclasses can now be generic. - (Contributed by Serhiy Storchaka in :issue:`43923`.) +* The representation of empty tuple types (``Tuple[()]``) is simplified. + This affects introspection, e.g. ``get_args(Tuple[()])`` now evaluates + to ``()`` instead of ``((),)``. + (Contributed by Serhiy Storchaka in :gh:`91137`.) + +* Loosen runtime requirements for type annotations by removing the callable + check in the private ``typing._type_check`` function. (Contributed by + Gregory Beauregard in :gh:`90802`.) + +* :func:`typing.get_type_hints` now supports evaluating strings as forward + references in :ref:`PEP 585 generic aliases `. + (Contributed by Niklas Rosenstein in :gh:`85542`.) + +* :func:`typing.get_type_hints` no longer adds :data:`~typing.Optional` + to parameters with ``None`` as a default. (Contributed by Nikita Sobolev + in :gh:`90353`.) + +* :func:`typing.get_type_hints` now supports evaluating bare stringified + :data:`~typing.ClassVar` annotations. (Contributed by Gregory Beauregard + in :gh:`90711`.) + +* :func:`typing.no_type_check` no longer modifies external classes and functions. + It also now correctly marks classmethods as not to be type checked. (Contributed + by Nikita Sobolev in :gh:`90729`.) tkinter @@ -1236,6 +1264,10 @@ Deprecated wherever possible. (Contributed by Alex Waygood in :gh:`92332`.) +* The keyword argument syntax for constructing :data:`~typing.TypedDict` types + is now deprecated. Support will be removed in Python 3.13. (Contributed by + Jingchen Ye in :gh:`90224`.) + Pending Removal in Python 3.12 ============================== From webhook-mailer at python.org Thu May 19 10:47:41 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Thu, 19 May 2022 14:47:41 -0000 Subject: [Python-checkins] gh-92675: venv: Fix ensure_directories() to again accept a Path for env_dir (#92676) Message-ID: https://github.com/python/cpython/commit/30deeac64925effe46cb5f1cd091ccb4c850ce83 commit: 30deeac64925effe46cb5f1cd091ccb4c850ce83 branch: main author: David Foster committer: JelleZijlstra date: 2022-05-19T07:47:16-07:00 summary: gh-92675: venv: Fix ensure_directories() to again accept a Path for env_dir (#92676) Co-authored-by: Jelle Zijlstra Co-authored-by: Alex Waygood files: A Misc/NEWS.d/next/Library/2022-05-19-13-33-18.gh-issue-92675.ZeerMZ.rst M Lib/test/test_venv.py M Lib/venv/__init__.py diff --git a/Lib/test/test_venv.py b/Lib/test/test_venv.py index 9f2ecf3be644a..37b61a780cb07 100644 --- a/Lib/test/test_venv.py +++ b/Lib/test/test_venv.py @@ -8,6 +8,7 @@ import ensurepip import os import os.path +import pathlib import re import shutil import struct @@ -99,12 +100,23 @@ def isdir(self, *args): fn = self.get_env_file(*args) self.assertTrue(os.path.isdir(fn)) - def test_defaults(self): + def test_defaults_with_str_path(self): """ - Test the create function with default arguments. + Test the create function with default arguments and a str path. """ rmtree(self.env_dir) self.run_with_capture(venv.create, self.env_dir) + self._check_output_of_default_create() + + def test_defaults_with_pathlib_path(self): + """ + Test the create function with default arguments and a pathlib.Path path. + """ + rmtree(self.env_dir) + self.run_with_capture(venv.create, pathlib.Path(self.env_dir)) + self._check_output_of_default_create() + + def _check_output_of_default_create(self): self.isdir(self.bindir) self.isdir(self.include) self.isdir(*self.lib) @@ -474,7 +486,9 @@ def test_pathsep_error(self): the path separator. """ rmtree(self.env_dir) - self.assertRaises(ValueError, venv.create, self.env_dir + os.pathsep) + bad_itempath = self.env_dir + os.pathsep + self.assertRaises(ValueError, venv.create, bad_itempath) + self.assertRaises(ValueError, venv.create, pathlib.Path(bad_itempath)) @requireVenvCreate class EnsurePipTest(BaseTest): diff --git a/Lib/venv/__init__.py b/Lib/venv/__init__.py index 7bfbadda7b497..6032f3648e15f 100644 --- a/Lib/venv/__init__.py +++ b/Lib/venv/__init__.py @@ -116,7 +116,7 @@ def create_if_needed(d): elif os.path.islink(d) or os.path.isfile(d): raise ValueError('Unable to create directory %r' % d) - if os.pathsep in env_dir: + if os.pathsep in os.fspath(env_dir): raise ValueError(f'Refusing to create a venv in {env_dir} because ' f'it contains the PATH separator {os.pathsep}.') if os.path.exists(env_dir) and self.clear: diff --git a/Misc/NEWS.d/next/Library/2022-05-19-13-33-18.gh-issue-92675.ZeerMZ.rst b/Misc/NEWS.d/next/Library/2022-05-19-13-33-18.gh-issue-92675.ZeerMZ.rst new file mode 100644 index 0000000000000..6adc024fc5415 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-05-19-13-33-18.gh-issue-92675.ZeerMZ.rst @@ -0,0 +1,2 @@ +Fix :func:`venv.ensure_directories` to accept :class:`pathlib.Path` arguments +in addition to :class:`str` paths. Patch by David Foster. From webhook-mailer at python.org Thu May 19 10:59:17 2022 From: webhook-mailer at python.org (ambv) Date: Thu, 19 May 2022 14:59:17 -0000 Subject: [Python-checkins] gh-92417: Update docs and examples of doctest.IGNORE_EXCEPTION_DETAIL for Py>=3 (GH-92502) Message-ID: https://github.com/python/cpython/commit/97b9c1096feff77a564787ef520cc7d4e1d1c45f commit: 97b9c1096feff77a564787ef520cc7d4e1d1c45f branch: main author: CAM Gerlach committer: ambv date: 2022-05-19T16:59:07+02:00 summary: gh-92417: Update docs and examples of doctest.IGNORE_EXCEPTION_DETAIL for Py>=3 (GH-92502) files: M Doc/library/doctest.rst diff --git a/Doc/library/doctest.rst b/Doc/library/doctest.rst index be5651d15a0c9..2d50a49c6415e 100644 --- a/Doc/library/doctest.rst +++ b/Doc/library/doctest.rst @@ -563,41 +563,35 @@ doctest decides whether actual output matches an example's expected output: .. data:: IGNORE_EXCEPTION_DETAIL - When specified, an example that expects an exception passes if an exception of - the expected type is raised, even if the exception detail does not match. For - example, an example expecting ``ValueError: 42`` will pass if the actual - exception raised is ``ValueError: 3*14``, but will fail, e.g., if - :exc:`TypeError` is raised. + When specified, doctests expecting exceptions pass so long as an exception + of the expected type is raised, even if the details + (message and fully-qualified exception name) don't match. - It will also ignore the module name used in Python 3 doctest reports. Hence - both of these variations will work with the flag specified, regardless of - whether the test is run under Python 2.7 or Python 3.2 (or later versions):: + For example, an example expecting ``ValueError: 42`` will pass if the actual + exception raised is ``ValueError: 3*14``, but will fail if, say, a + :exc:`TypeError` is raised instead. + It will also ignore any fully-qualified name included before the + exception class, which can vary between implementations and versions + of Python and the code/libraries in use. + Hence, all three of these variations will work with the flag specified: - >>> raise CustomError('message') + .. code-block:: pycon + + >>> raise Exception('message') Traceback (most recent call last): - CustomError: message + Exception: message - >>> raise CustomError('message') + >>> raise Exception('message') Traceback (most recent call last): - my_module.CustomError: message + builtins.Exception: message - Note that :const:`ELLIPSIS` can also be used to ignore the - details of the exception message, but such a test may still fail based - on whether or not the module details are printed as part of the - exception name. Using :const:`IGNORE_EXCEPTION_DETAIL` and the details - from Python 2.3 is also the only clear way to write a doctest that doesn't - care about the exception detail yet continues to pass under Python 2.3 or - earlier (those releases do not support :ref:`doctest directives - ` and ignore them as irrelevant comments). For example:: - - >>> (1, 2)[3] = 'moo' + >>> raise Exception('message') Traceback (most recent call last): - File "", line 1, in - TypeError: object doesn't support item assignment + __main__.Exception: message - passes under Python 2.3 and later Python versions with the flag specified, - even though the detail - changed in Python 2.4 to say "does not" instead of "doesn't". + Note that :const:`ELLIPSIS` can also be used to ignore the + details of the exception message, but such a test may still fail based + on whether the module name is present or matches exactly. .. versionchanged:: 3.2 :const:`IGNORE_EXCEPTION_DETAIL` now also ignores any information relating From webhook-mailer at python.org Thu May 19 11:05:11 2022 From: webhook-mailer at python.org (ambv) Date: Thu, 19 May 2022 15:05:11 -0000 Subject: [Python-checkins] bpo-45393: help() on operator precedence has misleading entries (GH-31246) Message-ID: https://github.com/python/cpython/commit/fb082c2fc5a925085b179e63ca10b7f60b356d2f commit: fb082c2fc5a925085b179e63ca10b7f60b356d2f branch: main author: Zackery Spytz committer: ambv date: 2022-05-19T17:05:04+02:00 summary: bpo-45393: help() on operator precedence has misleading entries (GH-31246) Fix the formatting for "await x" and "not x" in the operator precedence table. files: A Misc/NEWS.d/next/Library/2022-02-09-23-44-27.bpo-45393.9v5Y8U.rst M Doc/reference/expressions.rst diff --git a/Doc/reference/expressions.rst b/Doc/reference/expressions.rst index b914c48d3d4cd..1f461e3fed8e5 100644 --- a/Doc/reference/expressions.rst +++ b/Doc/reference/expressions.rst @@ -1898,7 +1898,7 @@ precedence and have a left-to-right chaining feature as described in the | ``x[index]``, ``x[index:index]``, | Subscription, slicing, | | ``x(arguments...)``, ``x.attribute`` | call, attribute reference | +-----------------------------------------------+-------------------------------------+ -| :keyword:`await` ``x`` | Await expression | +| :keyword:`await x ` | Await expression | +-----------------------------------------------+-------------------------------------+ | ``**`` | Exponentiation [#]_ | +-----------------------------------------------+-------------------------------------+ @@ -1922,7 +1922,7 @@ precedence and have a left-to-right chaining feature as described in the | :keyword:`is`, :keyword:`is not`, ``<``, | tests and identity tests | | ``<=``, ``>``, ``>=``, ``!=``, ``==`` | | +-----------------------------------------------+-------------------------------------+ -| :keyword:`not` ``x`` | Boolean NOT | +| :keyword:`not x ` | Boolean NOT | +-----------------------------------------------+-------------------------------------+ | :keyword:`and` | Boolean AND | +-----------------------------------------------+-------------------------------------+ diff --git a/Misc/NEWS.d/next/Library/2022-02-09-23-44-27.bpo-45393.9v5Y8U.rst b/Misc/NEWS.d/next/Library/2022-02-09-23-44-27.bpo-45393.9v5Y8U.rst new file mode 100644 index 0000000000000..0a239b07d76bd --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-02-09-23-44-27.bpo-45393.9v5Y8U.rst @@ -0,0 +1,2 @@ +Fix the formatting for ``await x`` and ``not x`` in the operator precedence +table when using the :func:`help` system. From webhook-mailer at python.org Thu May 19 11:05:59 2022 From: webhook-mailer at python.org (miss-islington) Date: Thu, 19 May 2022 15:05:59 -0000 Subject: [Python-checkins] gh-90473: Decrease recursion limit and skip tests on WASI (GH-92803) Message-ID: https://github.com/python/cpython/commit/7afccd34a659af6676c17abbd431e58093d25746 commit: 7afccd34a659af6676c17abbd431e58093d25746 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-19T08:05:52-07:00 summary: gh-90473: Decrease recursion limit and skip tests on WASI (GH-92803) (cherry picked from commit 137fd3d88aa46669f5717734e823f4c594ab2843) Co-authored-by: Christian Heimes files: A Misc/NEWS.d/next/Core and Builtins/2022-05-15-15-25-05.gh-issue-90473.MoPHYW.rst M Include/internal/pycore_ceval.h M Lib/platform.py M Lib/test/pythoninfo.py M Lib/test/support/__init__.py M Lib/test/test_compile.py M Lib/test/test_fileio.py M Lib/test/test_largefile.py M Lib/test/test_logging.py M Lib/test/test_os.py M Lib/test/test_signal.py M Lib/test/test_tomllib/test_misc.py M Lib/test/test_zipimport.py M Modules/timemodule.c M Parser/parser.c M Tools/peg_generator/pegen/c_generator.py M Tools/wasm/README.md M Tools/wasm/config.site-wasm32-wasi M configure M configure.ac diff --git a/Include/internal/pycore_ceval.h b/Include/internal/pycore_ceval.h index 8dd89c6850794..3efd6beb035a1 100644 --- a/Include/internal/pycore_ceval.h +++ b/Include/internal/pycore_ceval.h @@ -12,8 +12,14 @@ extern "C" { struct pyruntimestate; struct _ceval_runtime_state; +/* WASI has limited call stack. wasmtime 0.36 can handle sufficient amount of + C stack frames for little more than 750 recursions. */ #ifndef Py_DEFAULT_RECURSION_LIMIT -# define Py_DEFAULT_RECURSION_LIMIT 1000 +# ifdef __wasi__ +# define Py_DEFAULT_RECURSION_LIMIT 750 +# else +# define Py_DEFAULT_RECURSION_LIMIT 1000 +# endif #endif #include "pycore_interp.h" // PyInterpreterState.eval_frame diff --git a/Lib/platform.py b/Lib/platform.py index 3f3f25a2c92d3..c272c407c7776 100755 --- a/Lib/platform.py +++ b/Lib/platform.py @@ -186,6 +186,10 @@ def libc_ver(executable=None, lib='', version='', chunksize=16384): executable = sys.executable + if not executable: + # sys.executable is not set. + return lib, version + V = _comparable_version # We use os.path.realpath() # here to work around problems with Cygwin not being diff --git a/Lib/test/pythoninfo.py b/Lib/test/pythoninfo.py index 28549a645b0f5..84e1c047f9219 100644 --- a/Lib/test/pythoninfo.py +++ b/Lib/test/pythoninfo.py @@ -545,8 +545,14 @@ def format_attr(attr, value): def collect_socket(info_add): import socket - hostname = socket.gethostname() - info_add('socket.hostname', hostname) + try: + hostname = socket.gethostname() + except OSError: + # WASI SDK 15.0 does not have gethostname(2). + if sys.platform != "wasi": + raise + else: + info_add('socket.hostname', hostname) def collect_sqlite(info_add): diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py index b9fe8f6bf4f06..513ada7cb1f3d 100644 --- a/Lib/test/support/__init__.py +++ b/Lib/test/support/__init__.py @@ -199,6 +199,11 @@ def get_original_stdout(): def _force_run(path, func, *args): try: return func(*args) + except FileNotFoundError as err: + # chmod() won't fix a missing file. + if verbose >= 2: + print('%s: %s' % (err.__class__.__name__, err)) + raise except OSError as err: if verbose >= 2: print('%s: %s' % (err.__class__.__name__, err)) diff --git a/Lib/test/test_compile.py b/Lib/test/test_compile.py index 5a9c618786f4e..c32c27f33b447 100644 --- a/Lib/test/test_compile.py +++ b/Lib/test/test_compile.py @@ -109,7 +109,9 @@ def __getitem__(self, key): self.assertEqual(d['z'], 12) def test_extended_arg(self): - longexpr = 'x = x or ' + '-x' * 2500 + # default: 1000 * 2.5 = 2500 repetitions + repeat = int(sys.getrecursionlimit() * 2.5) + longexpr = 'x = x or ' + '-x' * repeat g = {} code = ''' def f(x): diff --git a/Lib/test/test_fileio.py b/Lib/test/test_fileio.py index e4984d3cd559e..c26cdc028cc89 100644 --- a/Lib/test/test_fileio.py +++ b/Lib/test/test_fileio.py @@ -9,7 +9,9 @@ from weakref import proxy from functools import wraps -from test.support import cpython_only, swap_attr, gc_collect, is_emscripten +from test.support import ( + cpython_only, swap_attr, gc_collect, is_emscripten, is_wasi +) from test.support.os_helper import (TESTFN, TESTFN_UNICODE, make_bad_fd) from test.support.warnings_helper import check_warnings from collections import UserList @@ -65,6 +67,7 @@ def testAttributes(self): self.assertRaises((AttributeError, TypeError), setattr, f, attr, 'oops') + @unittest.skipIf(is_wasi, "WASI does not expose st_blksize.") def testBlksize(self): # test private _blksize attribute blksize = io.DEFAULT_BUFFER_SIZE diff --git a/Lib/test/test_largefile.py b/Lib/test/test_largefile.py index 8f6bec1620053..3c11c59baef6e 100644 --- a/Lib/test/test_largefile.py +++ b/Lib/test/test_largefile.py @@ -156,6 +156,8 @@ def test_seekable(self): def skip_no_disk_space(path, required): def decorator(fun): def wrapper(*args, **kwargs): + if not hasattr(shutil, "disk_usage"): + raise unittest.SkipTest("requires shutil.disk_usage") if shutil.disk_usage(os.path.realpath(path)).free < required: hsize = int(required / 1024 / 1024) raise unittest.SkipTest( diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py index e69afae484aa7..fd562322a7637 100644 --- a/Lib/test/test_logging.py +++ b/Lib/test/test_logging.py @@ -5280,6 +5280,7 @@ def test_emit_after_closing_in_write_mode(self): self.assertEqual(fp.read().strip(), '1') class RotatingFileHandlerTest(BaseFileTest): + @unittest.skipIf(support.is_wasi, "WASI does not have /dev/null.") def test_should_not_rollover(self): # If maxbytes is zero rollover never occurs rh = logging.handlers.RotatingFileHandler( @@ -5387,6 +5388,7 @@ def rotator(source, dest): rh.close() class TimedRotatingFileHandlerTest(BaseFileTest): + @unittest.skipIf(support.is_wasi, "WASI does not have /dev/null.") def test_should_not_rollover(self): # See bpo-45401. Should only ever rollover regular files fh = logging.handlers.TimedRotatingFileHandler( diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py index 36ad587760d70..ae071821e1ccf 100644 --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -11,7 +11,6 @@ import fractions import itertools import locale -import mmap import os import pickle import select @@ -59,6 +58,10 @@ except ImportError: INT_MAX = PY_SSIZE_T_MAX = sys.maxsize +try: + import mmap +except ImportError: + mmap = None from test.support.script_helper import assert_python_ok from test.support import unix_shell @@ -2167,7 +2170,8 @@ def test_fchown(self): @unittest.skipUnless(hasattr(os, 'fpathconf'), 'test needs os.fpathconf()') @unittest.skipIf( - support.is_emscripten, "musl libc issue on Emscripten, bpo-46390" + support.is_emscripten or support.is_wasi, + "musl libc issue on Emscripten/WASI, bpo-46390" ) def test_fpathconf(self): self.check(os.pathconf, "PC_NAME_MAX") @@ -2460,6 +2464,7 @@ def test_kill_int(self): # os.kill on Windows can take an int which gets set as the exit code self._kill(100) + @unittest.skipIf(mmap is None, "requires mmap") def _kill_with_event(self, event, name): tagname = "test_os_%s" % uuid.uuid1() m = mmap.mmap(-1, 1, tagname) diff --git a/Lib/test/test_signal.py b/Lib/test/test_signal.py index 6d3b299b24cca..6aa529b062000 100644 --- a/Lib/test/test_signal.py +++ b/Lib/test/test_signal.py @@ -107,6 +107,10 @@ def test_interprocess_signal(self): script = os.path.join(dirname, 'signalinterproctester.py') assert_python_ok(script) + @unittest.skipUnless( + hasattr(signal, "valid_signals"), + "requires signal.valid_signals" + ) def test_valid_signals(self): s = signal.valid_signals() self.assertIsInstance(s, set) @@ -212,6 +216,7 @@ def test_invalid_fd(self): self.assertRaises((ValueError, OSError), signal.set_wakeup_fd, fd) + @unittest.skipUnless(support.has_socket_support, "needs working sockets.") def test_invalid_socket(self): sock = socket.socket() fd = sock.fileno() @@ -241,6 +246,7 @@ def test_set_wakeup_fd_result(self): self.assertEqual(signal.set_wakeup_fd(-1), -1) @unittest.skipIf(support.is_emscripten, "Emscripten cannot fstat pipes.") + @unittest.skipUnless(support.has_socket_support, "needs working sockets.") def test_set_wakeup_fd_socket_result(self): sock1 = socket.socket() self.addCleanup(sock1.close) diff --git a/Lib/test/test_tomllib/test_misc.py b/Lib/test/test_tomllib/test_misc.py index 76fa5905fa49e..378db58f25594 100644 --- a/Lib/test/test_tomllib/test_misc.py +++ b/Lib/test/test_tomllib/test_misc.py @@ -6,6 +6,7 @@ import datetime from decimal import Decimal as D from pathlib import Path +import sys import tempfile import unittest @@ -91,11 +92,13 @@ def test_deepcopy(self): self.assertEqual(obj_copy, expected_obj) def test_inline_array_recursion_limit(self): - nest_count = 470 + # 470 with default recursion limit + nest_count = int(sys.getrecursionlimit() * 0.47) recursive_array_toml = "arr = " + nest_count * "[" + nest_count * "]" tomllib.loads(recursive_array_toml) def test_inline_table_recursion_limit(self): - nest_count = 310 + # 310 with default recursion limit + nest_count = int(sys.getrecursionlimit() * 0.31) recursive_table_toml = nest_count * "key = {" + nest_count * "}" tomllib.loads(recursive_table_toml) diff --git a/Lib/test/test_zipimport.py b/Lib/test/test_zipimport.py index 85dbf4d8f68eb..66789262dd6ca 100644 --- a/Lib/test/test_zipimport.py +++ b/Lib/test/test_zipimport.py @@ -804,6 +804,7 @@ def testEmptyFile(self): os_helper.create_empty_file(TESTMOD) self.assertZipFailure(TESTMOD) + @unittest.skipIf(support.is_wasi, "mode 000 not supported.") def testFileUnreadable(self): os_helper.unlink(TESTMOD) fd = os.open(TESTMOD, os.O_CREAT, 000) diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-15-15-25-05.gh-issue-90473.MoPHYW.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-15-15-25-05.gh-issue-90473.MoPHYW.rst new file mode 100644 index 0000000000000..1f9f45a511fba --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-05-15-15-25-05.gh-issue-90473.MoPHYW.rst @@ -0,0 +1 @@ +Decrease default recursion limit on WASI to address limited call stack size. diff --git a/Modules/timemodule.c b/Modules/timemodule.c index 7475ef344b72b..18f9ddb909c02 100644 --- a/Modules/timemodule.c +++ b/Modules/timemodule.c @@ -1481,7 +1481,7 @@ _PyTime_GetThreadTimeWithInfo(_PyTime_t *tp, _Py_clock_info_t *info) #elif defined(HAVE_CLOCK_GETTIME) && \ defined(CLOCK_PROCESS_CPUTIME_ID) && \ - !defined(__EMSCRIPTEN__) + !defined(__EMSCRIPTEN__) && !defined(__wasi__) #define HAVE_THREAD_TIME #if defined(__APPLE__) && defined(__has_attribute) && __has_attribute(availability) diff --git a/Parser/parser.c b/Parser/parser.c index adc8d509eb7d7..08bf6d2945600 100644 --- a/Parser/parser.c +++ b/Parser/parser.c @@ -7,7 +7,11 @@ # define D(x) #endif -# define MAXSTACK 6000 +#ifdef __wasi__ +# define MAXSTACK 4000 +#else +# define MAXSTACK 6000 +#endif static const int n_keyword_lists = 9; static KeywordToken *reserved_keywords[] = { (KeywordToken[]) {{NULL, -1}}, diff --git a/Tools/peg_generator/pegen/c_generator.py b/Tools/peg_generator/pegen/c_generator.py index 56a1e5a5a14fb..65bfd5900a696 100644 --- a/Tools/peg_generator/pegen/c_generator.py +++ b/Tools/peg_generator/pegen/c_generator.py @@ -37,7 +37,11 @@ # define D(x) #endif -# define MAXSTACK 6000 +#ifdef __wasi__ +# define MAXSTACK 4000 +#else +# define MAXSTACK 6000 +#endif """ diff --git a/Tools/wasm/README.md b/Tools/wasm/README.md index 83806f0581ace..977b2bb2a8ab9 100644 --- a/Tools/wasm/README.md +++ b/Tools/wasm/README.md @@ -220,10 +220,27 @@ AddType application/wasm wasm # WASI (wasm32-wasi) -WASI builds require [WASI SDK](https://github.com/WebAssembly/wasi-sdk) and -currently [wasix](https://github.com/singlestore-labs/wasix) for POSIX +WASI builds require [WASI SDK](https://github.com/WebAssembly/wasi-sdk) 15.0+ +and currently [wasix](https://github.com/singlestore-labs/wasix) for POSIX compatibility stubs. +## WASI limitations and issues (WASI SDK 15.0) + +A lot of Emscripten limitations also apply to WASI. Noticable restrictions +are: + +- Call stack size is limited. Default recursion limit and parser stack size + are smaller than in regular Python builds. +- ``socket(2)`` cannot create new socket file descriptors. WASI programs can + call read/write/accept on a file descriptor that is passed into the process. +- ``socket.gethostname()`` and host name resolution APIs like + ``socket.gethostbyname()`` are not implemented and always fail. +- ``chmod(2)`` is not available. It's not possible to modify file permissions, + yet. A future version of WASI may provide a limited ``set_permissions`` API. +- File locking (``fcntl``) is not available. +- ``os.pipe()``, ``os.mkfifo()``, and ``os.mknod()`` are not supported. + + # Detect WebAssembly builds ## Python code diff --git a/Tools/wasm/config.site-wasm32-wasi b/Tools/wasm/config.site-wasm32-wasi index 255e99c279a0a..ee3fc830e3d8a 100644 --- a/Tools/wasm/config.site-wasm32-wasi +++ b/Tools/wasm/config.site-wasm32-wasi @@ -17,3 +17,24 @@ ac_cv_header_sys_resource_h=no # undefined symbols / unsupported features ac_cv_func_eventfd=no + +# WASI SDK 15.0 has no pipe syscall. +ac_cv_func_pipe=no + +# WASI SDK 15.0 cannot create fifos and special files. +ac_cv_func_mkfifo=no +ac_cv_func_mkfifoat=no +ac_cv_func_mknod=no +ac_cv_func_mknodat=no + +# fdopendir() fails on SDK 15.0, +# OSError: [Errno 28] Invalid argument: '.' +ac_cv_func_fdopendir=no + +# WASIX stubs we don't want to use. +ac_cv_func_kill=no + +# WASI sockets are limited to operations on given socket fd and inet sockets. +# Disable AF_UNIX and AF_PACKET support, see socketmodule.h. +ac_cv_header_sys_un_h=no +ac_cv_header_netpacket_packet_h=no diff --git a/configure b/configure index 286a94946a083..b3267025b7305 100755 --- a/configure +++ b/configure @@ -22611,6 +22611,7 @@ case $ac_sys_system in #( py_cv_module__ctypes_test=n/a + py_cv_module_fcntl=n/a py_cv_module_=n/a diff --git a/configure.ac b/configure.ac index 693f79bba0849..65ec1393e5842 100644 --- a/configure.ac +++ b/configure.ac @@ -6690,8 +6690,10 @@ AS_CASE([$ac_sys_system], ], [Emscripten/node*], [], [WASI/*], [ + dnl WASI SDK 15.0 does not support file locking. PY_STDLIB_MOD_SET_NA( [_ctypes_test], + [fcntl], ) ] ) From webhook-mailer at python.org Thu May 19 11:17:37 2022 From: webhook-mailer at python.org (miss-islington) Date: Thu, 19 May 2022 15:17:37 -0000 Subject: [Python-checkins] gh-92675: venv: Fix ensure_directories() to again accept a Path for env_dir (GH-92676) Message-ID: https://github.com/python/cpython/commit/71cdf6a38af80bc1932c3a5f7343b589cc236226 commit: 71cdf6a38af80bc1932c3a5f7343b589cc236226 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-19T08:17:28-07:00 summary: gh-92675: venv: Fix ensure_directories() to again accept a Path for env_dir (GH-92676) Co-authored-by: Jelle Zijlstra Co-authored-by: Alex Waygood (cherry picked from commit 30deeac64925effe46cb5f1cd091ccb4c850ce83) Co-authored-by: David Foster files: A Misc/NEWS.d/next/Library/2022-05-19-13-33-18.gh-issue-92675.ZeerMZ.rst M Lib/test/test_venv.py M Lib/venv/__init__.py diff --git a/Lib/test/test_venv.py b/Lib/test/test_venv.py index 6bfb6e9f336ef..199160e4d0e72 100644 --- a/Lib/test/test_venv.py +++ b/Lib/test/test_venv.py @@ -8,6 +8,7 @@ import ensurepip import os import os.path +import pathlib import re import shutil import struct @@ -98,12 +99,23 @@ def isdir(self, *args): fn = self.get_env_file(*args) self.assertTrue(os.path.isdir(fn)) - def test_defaults(self): + def test_defaults_with_str_path(self): """ - Test the create function with default arguments. + Test the create function with default arguments and a str path. """ rmtree(self.env_dir) self.run_with_capture(venv.create, self.env_dir) + self._check_output_of_default_create() + + def test_defaults_with_pathlib_path(self): + """ + Test the create function with default arguments and a pathlib.Path path. + """ + rmtree(self.env_dir) + self.run_with_capture(venv.create, pathlib.Path(self.env_dir)) + self._check_output_of_default_create() + + def _check_output_of_default_create(self): self.isdir(self.bindir) self.isdir(self.include) self.isdir(*self.lib) @@ -473,7 +485,9 @@ def test_pathsep_error(self): the path separator. """ rmtree(self.env_dir) - self.assertRaises(ValueError, venv.create, self.env_dir + os.pathsep) + bad_itempath = self.env_dir + os.pathsep + self.assertRaises(ValueError, venv.create, bad_itempath) + self.assertRaises(ValueError, venv.create, pathlib.Path(bad_itempath)) @requireVenvCreate class EnsurePipTest(BaseTest): diff --git a/Lib/venv/__init__.py b/Lib/venv/__init__.py index 7bfbadda7b497..6032f3648e15f 100644 --- a/Lib/venv/__init__.py +++ b/Lib/venv/__init__.py @@ -116,7 +116,7 @@ def create_if_needed(d): elif os.path.islink(d) or os.path.isfile(d): raise ValueError('Unable to create directory %r' % d) - if os.pathsep in env_dir: + if os.pathsep in os.fspath(env_dir): raise ValueError(f'Refusing to create a venv in {env_dir} because ' f'it contains the PATH separator {os.pathsep}.') if os.path.exists(env_dir) and self.clear: diff --git a/Misc/NEWS.d/next/Library/2022-05-19-13-33-18.gh-issue-92675.ZeerMZ.rst b/Misc/NEWS.d/next/Library/2022-05-19-13-33-18.gh-issue-92675.ZeerMZ.rst new file mode 100644 index 0000000000000..6adc024fc5415 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-05-19-13-33-18.gh-issue-92675.ZeerMZ.rst @@ -0,0 +1,2 @@ +Fix :func:`venv.ensure_directories` to accept :class:`pathlib.Path` arguments +in addition to :class:`str` paths. Patch by David Foster. From webhook-mailer at python.org Thu May 19 11:19:43 2022 From: webhook-mailer at python.org (ambv) Date: Thu, 19 May 2022 15:19:43 -0000 Subject: [Python-checkins] gh-92417: Update docs and examples of doctest.IGNORE_EXCEPTION_DETAIL for Py>=3 (GH-92502) (GH-92962) Message-ID: https://github.com/python/cpython/commit/54653b5005f575cb5e287b4456e01936cfe4f233 commit: 54653b5005f575cb5e287b4456e01936cfe4f233 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: ambv date: 2022-05-19T17:19:34+02:00 summary: gh-92417: Update docs and examples of doctest.IGNORE_EXCEPTION_DETAIL for Py>=3 (GH-92502) (GH-92962) (cherry picked from commit 97b9c1096feff77a564787ef520cc7d4e1d1c45f) files: M Doc/library/doctest.rst diff --git a/Doc/library/doctest.rst b/Doc/library/doctest.rst index be5651d15a0c9..2d50a49c6415e 100644 --- a/Doc/library/doctest.rst +++ b/Doc/library/doctest.rst @@ -563,41 +563,35 @@ doctest decides whether actual output matches an example's expected output: .. data:: IGNORE_EXCEPTION_DETAIL - When specified, an example that expects an exception passes if an exception of - the expected type is raised, even if the exception detail does not match. For - example, an example expecting ``ValueError: 42`` will pass if the actual - exception raised is ``ValueError: 3*14``, but will fail, e.g., if - :exc:`TypeError` is raised. + When specified, doctests expecting exceptions pass so long as an exception + of the expected type is raised, even if the details + (message and fully-qualified exception name) don't match. - It will also ignore the module name used in Python 3 doctest reports. Hence - both of these variations will work with the flag specified, regardless of - whether the test is run under Python 2.7 or Python 3.2 (or later versions):: + For example, an example expecting ``ValueError: 42`` will pass if the actual + exception raised is ``ValueError: 3*14``, but will fail if, say, a + :exc:`TypeError` is raised instead. + It will also ignore any fully-qualified name included before the + exception class, which can vary between implementations and versions + of Python and the code/libraries in use. + Hence, all three of these variations will work with the flag specified: - >>> raise CustomError('message') + .. code-block:: pycon + + >>> raise Exception('message') Traceback (most recent call last): - CustomError: message + Exception: message - >>> raise CustomError('message') + >>> raise Exception('message') Traceback (most recent call last): - my_module.CustomError: message + builtins.Exception: message - Note that :const:`ELLIPSIS` can also be used to ignore the - details of the exception message, but such a test may still fail based - on whether or not the module details are printed as part of the - exception name. Using :const:`IGNORE_EXCEPTION_DETAIL` and the details - from Python 2.3 is also the only clear way to write a doctest that doesn't - care about the exception detail yet continues to pass under Python 2.3 or - earlier (those releases do not support :ref:`doctest directives - ` and ignore them as irrelevant comments). For example:: - - >>> (1, 2)[3] = 'moo' + >>> raise Exception('message') Traceback (most recent call last): - File "", line 1, in - TypeError: object doesn't support item assignment + __main__.Exception: message - passes under Python 2.3 and later Python versions with the flag specified, - even though the detail - changed in Python 2.4 to say "does not" instead of "doesn't". + Note that :const:`ELLIPSIS` can also be used to ignore the + details of the exception message, but such a test may still fail based + on whether the module name is present or matches exactly. .. versionchanged:: 3.2 :const:`IGNORE_EXCEPTION_DETAIL` now also ignores any information relating From webhook-mailer at python.org Thu May 19 11:19:58 2022 From: webhook-mailer at python.org (ambv) Date: Thu, 19 May 2022 15:19:58 -0000 Subject: [Python-checkins] gh-92417: Update docs and examples of doctest.IGNORE_EXCEPTION_DETAIL for Py>=3 (GH-92502) (GH-92963) Message-ID: https://github.com/python/cpython/commit/4e289e20e28489a76a534fd5a6f4b2869eb3af0c commit: 4e289e20e28489a76a534fd5a6f4b2869eb3af0c branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: ambv date: 2022-05-19T17:19:53+02:00 summary: gh-92417: Update docs and examples of doctest.IGNORE_EXCEPTION_DETAIL for Py>=3 (GH-92502) (GH-92963) (cherry picked from commit 97b9c1096feff77a564787ef520cc7d4e1d1c45f) files: M Doc/library/doctest.rst diff --git a/Doc/library/doctest.rst b/Doc/library/doctest.rst index 59091e48d309f1..dbb54c99133f39 100644 --- a/Doc/library/doctest.rst +++ b/Doc/library/doctest.rst @@ -564,41 +564,35 @@ doctest decides whether actual output matches an example's expected output: .. data:: IGNORE_EXCEPTION_DETAIL - When specified, an example that expects an exception passes if an exception of - the expected type is raised, even if the exception detail does not match. For - example, an example expecting ``ValueError: 42`` will pass if the actual - exception raised is ``ValueError: 3*14``, but will fail, e.g., if - :exc:`TypeError` is raised. + When specified, doctests expecting exceptions pass so long as an exception + of the expected type is raised, even if the details + (message and fully-qualified exception name) don't match. - It will also ignore the module name used in Python 3 doctest reports. Hence - both of these variations will work with the flag specified, regardless of - whether the test is run under Python 2.7 or Python 3.2 (or later versions):: + For example, an example expecting ``ValueError: 42`` will pass if the actual + exception raised is ``ValueError: 3*14``, but will fail if, say, a + :exc:`TypeError` is raised instead. + It will also ignore any fully-qualified name included before the + exception class, which can vary between implementations and versions + of Python and the code/libraries in use. + Hence, all three of these variations will work with the flag specified: - >>> raise CustomError('message') + .. code-block:: pycon + + >>> raise Exception('message') Traceback (most recent call last): - CustomError: message + Exception: message - >>> raise CustomError('message') + >>> raise Exception('message') Traceback (most recent call last): - my_module.CustomError: message + builtins.Exception: message - Note that :const:`ELLIPSIS` can also be used to ignore the - details of the exception message, but such a test may still fail based - on whether or not the module details are printed as part of the - exception name. Using :const:`IGNORE_EXCEPTION_DETAIL` and the details - from Python 2.3 is also the only clear way to write a doctest that doesn't - care about the exception detail yet continues to pass under Python 2.3 or - earlier (those releases do not support :ref:`doctest directives - ` and ignore them as irrelevant comments). For example:: - - >>> (1, 2)[3] = 'moo' + >>> raise Exception('message') Traceback (most recent call last): - File "", line 1, in - TypeError: object doesn't support item assignment + __main__.Exception: message - passes under Python 2.3 and later Python versions with the flag specified, - even though the detail - changed in Python 2.4 to say "does not" instead of "doesn't". + Note that :const:`ELLIPSIS` can also be used to ignore the + details of the exception message, but such a test may still fail based + on whether the module name is present or matches exactly. .. versionchanged:: 3.2 :const:`IGNORE_EXCEPTION_DETAIL` now also ignores any information relating From webhook-mailer at python.org Thu May 19 11:21:30 2022 From: webhook-mailer at python.org (ambv) Date: Thu, 19 May 2022 15:21:30 -0000 Subject: [Python-checkins] gh-92417: Update docs and examples of doctest.IGNORE_EXCEPTION_DETAIL for Py>=3 (GH-92502) (GH-92964) Message-ID: https://github.com/python/cpython/commit/3bc3c89612484474aeb9b59d17d989dab7854e10 commit: 3bc3c89612484474aeb9b59d17d989dab7854e10 branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: ambv date: 2022-05-19T17:21:23+02:00 summary: gh-92417: Update docs and examples of doctest.IGNORE_EXCEPTION_DETAIL for Py>=3 (GH-92502) (GH-92964) (cherry picked from commit 97b9c1096feff77a564787ef520cc7d4e1d1c45f) files: M Doc/library/doctest.rst diff --git a/Doc/library/doctest.rst b/Doc/library/doctest.rst index a77322f83acbd..3d2bb27ec2356 100644 --- a/Doc/library/doctest.rst +++ b/Doc/library/doctest.rst @@ -568,41 +568,35 @@ doctest decides whether actual output matches an example's expected output: .. data:: IGNORE_EXCEPTION_DETAIL - When specified, an example that expects an exception passes if an exception of - the expected type is raised, even if the exception detail does not match. For - example, an example expecting ``ValueError: 42`` will pass if the actual - exception raised is ``ValueError: 3*14``, but will fail, e.g., if - :exc:`TypeError` is raised. + When specified, doctests expecting exceptions pass so long as an exception + of the expected type is raised, even if the details + (message and fully-qualified exception name) don't match. - It will also ignore the module name used in Python 3 doctest reports. Hence - both of these variations will work with the flag specified, regardless of - whether the test is run under Python 2.7 or Python 3.2 (or later versions):: + For example, an example expecting ``ValueError: 42`` will pass if the actual + exception raised is ``ValueError: 3*14``, but will fail if, say, a + :exc:`TypeError` is raised instead. + It will also ignore any fully-qualified name included before the + exception class, which can vary between implementations and versions + of Python and the code/libraries in use. + Hence, all three of these variations will work with the flag specified: - >>> raise CustomError('message') + .. code-block:: pycon + + >>> raise Exception('message') Traceback (most recent call last): - CustomError: message + Exception: message - >>> raise CustomError('message') + >>> raise Exception('message') Traceback (most recent call last): - my_module.CustomError: message + builtins.Exception: message - Note that :const:`ELLIPSIS` can also be used to ignore the - details of the exception message, but such a test may still fail based - on whether or not the module details are printed as part of the - exception name. Using :const:`IGNORE_EXCEPTION_DETAIL` and the details - from Python 2.3 is also the only clear way to write a doctest that doesn't - care about the exception detail yet continues to pass under Python 2.3 or - earlier (those releases do not support :ref:`doctest directives - ` and ignore them as irrelevant comments). For example:: - - >>> (1, 2)[3] = 'moo' + >>> raise Exception('message') Traceback (most recent call last): - File "", line 1, in - TypeError: object doesn't support item assignment + __main__.Exception: message - passes under Python 2.3 and later Python versions with the flag specified, - even though the detail - changed in Python 2.4 to say "does not" instead of "doesn't". + Note that :const:`ELLIPSIS` can also be used to ignore the + details of the exception message, but such a test may still fail based + on whether the module name is present or matches exactly. .. versionchanged:: 3.2 :const:`IGNORE_EXCEPTION_DETAIL` now also ignores any information relating From webhook-mailer at python.org Thu May 19 11:26:23 2022 From: webhook-mailer at python.org (ambv) Date: Thu, 19 May 2022 15:26:23 -0000 Subject: [Python-checkins] gh-92417: `socket` docs: remove references to Python <3.3 (GH-92544) Message-ID: https://github.com/python/cpython/commit/639b62c9c479e38a6f91a80b261097574a1e7ac7 commit: 639b62c9c479e38a6f91a80b261097574a1e7ac7 branch: main author: Alex Waygood committer: ambv date: 2022-05-19T17:25:58+02:00 summary: gh-92417: `socket` docs: remove references to Python <3.3 (GH-92544) files: M Doc/library/socket.rst diff --git a/Doc/library/socket.rst b/Doc/library/socket.rst index 4c193b892bda8..95cd37a415df1 100755 --- a/Doc/library/socket.rst +++ b/Doc/library/socket.rst @@ -233,9 +233,9 @@ resolution and/or the host configuration. For deterministic behavior use a numeric address in *host* portion. All errors raise exceptions. The normal exceptions for invalid argument types -and out-of-memory conditions can be raised; starting from Python 3.3, errors +and out-of-memory conditions can be raised. Errors related to socket or address semantics raise :exc:`OSError` or one of its -subclasses (they used to raise :exc:`socket.error`). +subclasses. Non-blocking mode is supported through :meth:`~socket.setblocking`. A generalization of this based on timeouts is supported through From webhook-mailer at python.org Thu May 19 11:29:02 2022 From: webhook-mailer at python.org (ambv) Date: Thu, 19 May 2022 15:29:02 -0000 Subject: [Python-checkins] gh-92417: `fractions`, `decimal`: Improve docs for alternative constructor methods (GH-92421) Message-ID: https://github.com/python/cpython/commit/090df844ea16af3a5df79aba2b9c89ac6a31ba06 commit: 090df844ea16af3a5df79aba2b9c89ac6a31ba06 branch: main author: Alex Waygood committer: ambv date: 2022-05-19T17:28:51+02:00 summary: gh-92417: `fractions`, `decimal`: Improve docs for alternative constructor methods (GH-92421) Co-authored-by: Ezio Melotti files: M Doc/library/decimal.rst M Doc/library/fractions.rst diff --git a/Doc/library/decimal.rst b/Doc/library/decimal.rst index 2ad84f20b5560..d052581c97012 100644 --- a/Doc/library/decimal.rst +++ b/Doc/library/decimal.rst @@ -571,9 +571,10 @@ Decimal objects >>> Decimal(321).exp() Decimal('2.561702493119680037517373933E+139') - .. method:: from_float(f) + .. classmethod:: from_float(f) - Classmethod that converts a float to a decimal number, exactly. + Alternative constructor that only accepts instances of :class:`float` or + :class:`int`. Note `Decimal.from_float(0.1)` is not the same as `Decimal('0.1')`. Since 0.1 is not exactly representable in binary floating point, the diff --git a/Doc/library/fractions.rst b/Doc/library/fractions.rst index c893f2d5389d5..5f0ecf1f135ea 100644 --- a/Doc/library/fractions.rst +++ b/Doc/library/fractions.rst @@ -114,10 +114,10 @@ another rational number, or from a string. .. versionadded:: 3.8 - .. method:: from_float(flt) + .. classmethod:: from_float(flt) - This class method constructs a :class:`Fraction` representing the exact - value of *flt*, which must be a :class:`float`. Beware that + Alternative constructor which only accepts instances of + :class:`float` or :class:`numbers.Integral`. Beware that ``Fraction.from_float(0.3)`` is not the same value as ``Fraction(3, 10)``. .. note:: @@ -126,10 +126,10 @@ another rational number, or from a string. :class:`Fraction` instance directly from a :class:`float`. - .. method:: from_decimal(dec) + .. classmethod:: from_decimal(dec) - This class method constructs a :class:`Fraction` representing the exact - value of *dec*, which must be a :class:`decimal.Decimal` instance. + Alternative constructor which only accepts instances of + :class:`decimal.Decimal` or :class:`numbers.Integral`. .. note:: From webhook-mailer at python.org Thu May 19 11:32:12 2022 From: webhook-mailer at python.org (ambv) Date: Thu, 19 May 2022 15:32:12 -0000 Subject: [Python-checkins] gh-92417: `subprocess` docs: remove note on compatibility with Python <3.5 (GH-92538) Message-ID: https://github.com/python/cpython/commit/84b86000e2bc32b0fbb6dfb6445a7ffc882067d2 commit: 84b86000e2bc32b0fbb6dfb6445a7ffc882067d2 branch: main author: Alex Waygood committer: ambv date: 2022-05-19T17:31:51+02:00 summary: gh-92417: `subprocess` docs: remove note on compatibility with Python <3.5 (GH-92538) files: M Doc/library/subprocess.rst diff --git a/Doc/library/subprocess.rst b/Doc/library/subprocess.rst index ce581abdd1dce..4031a5f62167f 100644 --- a/Doc/library/subprocess.rst +++ b/Doc/library/subprocess.rst @@ -33,9 +33,6 @@ The recommended approach to invoking subprocesses is to use the :func:`run` function for all use cases it can handle. For more advanced use cases, the underlying :class:`Popen` interface can be used directly. -The :func:`run` function was added in Python 3.5; if you need to retain -compatibility with older versions, see the :ref:`call-function-trio` section. - .. function:: run(args, *, stdin=None, input=None, stdout=None, stderr=None,\ capture_output=False, shell=False, cwd=None, timeout=None, \ From webhook-mailer at python.org Thu May 19 11:33:04 2022 From: webhook-mailer at python.org (ambv) Date: Thu, 19 May 2022 15:33:04 -0000 Subject: [Python-checkins] bpo-45393: help() on operator precedence has misleading entries (GH-31246) (GH-92966) Message-ID: https://github.com/python/cpython/commit/fb566cacb3019bce3ce27158e4edcf3501086775 commit: fb566cacb3019bce3ce27158e4edcf3501086775 branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: ambv date: 2022-05-19T17:32:54+02:00 summary: bpo-45393: help() on operator precedence has misleading entries (GH-31246) (GH-92966) (cherry picked from commit fb082c2fc5a925085b179e63ca10b7f60b356d2f) Co-authored-by: Zackery Spytz files: A Misc/NEWS.d/next/Library/2022-02-09-23-44-27.bpo-45393.9v5Y8U.rst M Doc/reference/expressions.rst diff --git a/Doc/reference/expressions.rst b/Doc/reference/expressions.rst index f77927d86d9d6..1f8b08f70d504 100644 --- a/Doc/reference/expressions.rst +++ b/Doc/reference/expressions.rst @@ -1891,7 +1891,7 @@ precedence and have a left-to-right chaining feature as described in the | ``x[index]``, ``x[index:index]``, | Subscription, slicing, | | ``x(arguments...)``, ``x.attribute`` | call, attribute reference | +-----------------------------------------------+-------------------------------------+ -| :keyword:`await` ``x`` | Await expression | +| :keyword:`await x ` | Await expression | +-----------------------------------------------+-------------------------------------+ | ``**`` | Exponentiation [#]_ | +-----------------------------------------------+-------------------------------------+ @@ -1915,7 +1915,7 @@ precedence and have a left-to-right chaining feature as described in the | :keyword:`is`, :keyword:`is not`, ``<``, | tests and identity tests | | ``<=``, ``>``, ``>=``, ``!=``, ``==`` | | +-----------------------------------------------+-------------------------------------+ -| :keyword:`not` ``x`` | Boolean NOT | +| :keyword:`not x ` | Boolean NOT | +-----------------------------------------------+-------------------------------------+ | :keyword:`and` | Boolean AND | +-----------------------------------------------+-------------------------------------+ diff --git a/Misc/NEWS.d/next/Library/2022-02-09-23-44-27.bpo-45393.9v5Y8U.rst b/Misc/NEWS.d/next/Library/2022-02-09-23-44-27.bpo-45393.9v5Y8U.rst new file mode 100644 index 0000000000000..0a239b07d76bd --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-02-09-23-44-27.bpo-45393.9v5Y8U.rst @@ -0,0 +1,2 @@ +Fix the formatting for ``await x`` and ``not x`` in the operator precedence +table when using the :func:`help` system. From webhook-mailer at python.org Thu May 19 11:33:14 2022 From: webhook-mailer at python.org (ambv) Date: Thu, 19 May 2022 15:33:14 -0000 Subject: [Python-checkins] bpo-45393: help() on operator precedence has misleading entries (GH-31246) (GH-92967) Message-ID: https://github.com/python/cpython/commit/9f7cdb2cf70d8b6ed95715317e5e98f0cca8fed6 commit: 9f7cdb2cf70d8b6ed95715317e5e98f0cca8fed6 branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: ambv date: 2022-05-19T17:33:09+02:00 summary: bpo-45393: help() on operator precedence has misleading entries (GH-31246) (GH-92967) (cherry picked from commit fb082c2fc5a925085b179e63ca10b7f60b356d2f) Co-authored-by: Zackery Spytz files: A Misc/NEWS.d/next/Library/2022-02-09-23-44-27.bpo-45393.9v5Y8U.rst M Doc/reference/expressions.rst diff --git a/Doc/reference/expressions.rst b/Doc/reference/expressions.rst index 502c022501eff..9f6f6f7d81527 100644 --- a/Doc/reference/expressions.rst +++ b/Doc/reference/expressions.rst @@ -1882,7 +1882,7 @@ precedence and have a left-to-right chaining feature as described in the | ``x[index]``, ``x[index:index]``, | Subscription, slicing, | | ``x(arguments...)``, ``x.attribute`` | call, attribute reference | +-----------------------------------------------+-------------------------------------+ -| :keyword:`await` ``x`` | Await expression | +| :keyword:`await x ` | Await expression | +-----------------------------------------------+-------------------------------------+ | ``**`` | Exponentiation [#]_ | +-----------------------------------------------+-------------------------------------+ @@ -1906,7 +1906,7 @@ precedence and have a left-to-right chaining feature as described in the | :keyword:`is`, :keyword:`is not`, ``<``, | tests and identity tests | | ``<=``, ``>``, ``>=``, ``!=``, ``==`` | | +-----------------------------------------------+-------------------------------------+ -| :keyword:`not` ``x`` | Boolean NOT | +| :keyword:`not x ` | Boolean NOT | +-----------------------------------------------+-------------------------------------+ | :keyword:`and` | Boolean AND | +-----------------------------------------------+-------------------------------------+ diff --git a/Misc/NEWS.d/next/Library/2022-02-09-23-44-27.bpo-45393.9v5Y8U.rst b/Misc/NEWS.d/next/Library/2022-02-09-23-44-27.bpo-45393.9v5Y8U.rst new file mode 100644 index 0000000000000..0a239b07d76bd --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-02-09-23-44-27.bpo-45393.9v5Y8U.rst @@ -0,0 +1,2 @@ +Fix the formatting for ``await x`` and ``not x`` in the operator precedence +table when using the :func:`help` system. From webhook-mailer at python.org Thu May 19 11:35:09 2022 From: webhook-mailer at python.org (ambv) Date: Thu, 19 May 2022 15:35:09 -0000 Subject: [Python-checkins] bpo-46879: Fix incorrect sphinx object names in doc (GH-31615) Message-ID: https://github.com/python/cpython/commit/2cdd57f119e3b85f1bfd28c7ff040e0d9bcaf115 commit: 2cdd57f119e3b85f1bfd28c7ff040e0d9bcaf115 branch: main author: Martin Fischer committer: ambv date: 2022-05-19T17:34:58+02:00 summary: bpo-46879: Fix incorrect sphinx object names in doc (GH-31615) API members documented in sphinx have an object name, which allow the documentation to be linked from other projects. Sphinx calculates the object name by prefixing the current module name to the directive argument, e.g: .. module:: foo .. function:: bar.baz becomes foo.bar.baz. Since these anchors aren't displayed in the documentation, some mistakes have crept in, namely the Python stdlib documentation currently contains the objects: * asyncio.asyncio.subprocess.DEVNULL * asyncio.asyncio.subprocess.PIPE * asyncio.asyncio.subprocess.STDOUT * asyncio.asyncio.subprocess.Process * multiprocessing.sharedctypes.multiprocessing.Manager * xml.etree.ElementTree.xml.etree.ElementInclude This commit fixes this by making use of the :module: option which without an argument makes sphinx take the directive argument as is for the object name (avoiding the prefixing of the current module name that led to these broken object names). Co-authored-by: ?ukasz Langa files: M Doc/library/asyncio-subprocess.rst M Doc/library/multiprocessing.rst M Doc/library/xml.etree.elementtree.rst diff --git a/Doc/library/asyncio-subprocess.rst b/Doc/library/asyncio-subprocess.rst index e5000532a895d..28d0b21e8180b 100644 --- a/Doc/library/asyncio-subprocess.rst +++ b/Doc/library/asyncio-subprocess.rst @@ -124,6 +124,7 @@ Constants ========= .. data:: asyncio.subprocess.PIPE + :module: Can be passed to the *stdin*, *stdout* or *stderr* parameters. @@ -137,11 +138,13 @@ Constants attributes will point to :class:`StreamReader` instances. .. data:: asyncio.subprocess.STDOUT + :module: Special value that can be used as the *stderr* argument and indicates that standard error should be redirected into standard output. .. data:: asyncio.subprocess.DEVNULL + :module: Special value that can be used as the *stdin*, *stdout* or *stderr* argument to process creation functions. It indicates that the special file @@ -157,6 +160,7 @@ wrapper that allows communicating with subprocesses and watching for their completion. .. class:: asyncio.subprocess.Process + :module: An object that wraps OS processes created by the :func:`create_subprocess_exec` and :func:`create_subprocess_shell` diff --git a/Doc/library/multiprocessing.rst b/Doc/library/multiprocessing.rst index 70802ee1fdecb..2a66b0f65c088 100644 --- a/Doc/library/multiprocessing.rst +++ b/Doc/library/multiprocessing.rst @@ -1666,6 +1666,7 @@ different machines. A manager object controls a server process which manages proxies. .. function:: multiprocessing.Manager() + :module: Returns a started :class:`~multiprocessing.managers.SyncManager` object which can be used for sharing objects between processes. The returned manager diff --git a/Doc/library/xml.etree.elementtree.rst b/Doc/library/xml.etree.elementtree.rst index e3932bc9e659f..2fe0d2e082fb3 100644 --- a/Doc/library/xml.etree.elementtree.rst +++ b/Doc/library/xml.etree.elementtree.rst @@ -826,6 +826,7 @@ Functions ^^^^^^^^^ .. function:: xml.etree.ElementInclude.default_loader( href, parse, encoding=None) + :module: Default loader. This default loader reads an included resource from disk. *href* is a URL. *parse* is for parse mode either "xml" or "text". *encoding* @@ -837,6 +838,7 @@ Functions .. function:: xml.etree.ElementInclude.include( elem, loader=None, base_url=None, \ max_depth=6) + :module: This function expands XInclude directives. *elem* is the root element. *loader* is an optional resource loader. If omitted, it defaults to :func:`default_loader`. From webhook-mailer at python.org Thu May 19 11:40:58 2022 From: webhook-mailer at python.org (ambv) Date: Thu, 19 May 2022 15:40:58 -0000 Subject: [Python-checkins] bpo-45393: help() on operator precedence has misleading entries (GH-31246) (GH-92965) Message-ID: https://github.com/python/cpython/commit/4d1e243fcadaeb6827343f0db16d471debb924b9 commit: 4d1e243fcadaeb6827343f0db16d471debb924b9 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: ambv date: 2022-05-19T17:40:49+02:00 summary: bpo-45393: help() on operator precedence has misleading entries (GH-31246) (GH-92965) (cherry picked from commit fb082c2fc5a925085b179e63ca10b7f60b356d2f) Co-authored-by: Zackery Spytz files: A Misc/NEWS.d/next/Library/2022-02-09-23-44-27.bpo-45393.9v5Y8U.rst M Doc/reference/expressions.rst diff --git a/Doc/reference/expressions.rst b/Doc/reference/expressions.rst index b914c48d3d4cd..1f461e3fed8e5 100644 --- a/Doc/reference/expressions.rst +++ b/Doc/reference/expressions.rst @@ -1898,7 +1898,7 @@ precedence and have a left-to-right chaining feature as described in the | ``x[index]``, ``x[index:index]``, | Subscription, slicing, | | ``x(arguments...)``, ``x.attribute`` | call, attribute reference | +-----------------------------------------------+-------------------------------------+ -| :keyword:`await` ``x`` | Await expression | +| :keyword:`await x ` | Await expression | +-----------------------------------------------+-------------------------------------+ | ``**`` | Exponentiation [#]_ | +-----------------------------------------------+-------------------------------------+ @@ -1922,7 +1922,7 @@ precedence and have a left-to-right chaining feature as described in the | :keyword:`is`, :keyword:`is not`, ``<``, | tests and identity tests | | ``<=``, ``>``, ``>=``, ``!=``, ``==`` | | +-----------------------------------------------+-------------------------------------+ -| :keyword:`not` ``x`` | Boolean NOT | +| :keyword:`not x ` | Boolean NOT | +-----------------------------------------------+-------------------------------------+ | :keyword:`and` | Boolean AND | +-----------------------------------------------+-------------------------------------+ diff --git a/Misc/NEWS.d/next/Library/2022-02-09-23-44-27.bpo-45393.9v5Y8U.rst b/Misc/NEWS.d/next/Library/2022-02-09-23-44-27.bpo-45393.9v5Y8U.rst new file mode 100644 index 0000000000000..0a239b07d76bd --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-02-09-23-44-27.bpo-45393.9v5Y8U.rst @@ -0,0 +1,2 @@ +Fix the formatting for ``await x`` and ``not x`` in the operator precedence +table when using the :func:`help` system. From webhook-mailer at python.org Thu May 19 11:42:17 2022 From: webhook-mailer at python.org (ambv) Date: Thu, 19 May 2022 15:42:17 -0000 Subject: [Python-checkins] gh-92417: `socket` docs: remove references to Python <3.3 (GH-92544) (GH-92968) Message-ID: https://github.com/python/cpython/commit/a2d6e6c206ad2e4b734a684e708e60aac7be3325 commit: a2d6e6c206ad2e4b734a684e708e60aac7be3325 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: ambv date: 2022-05-19T17:42:07+02:00 summary: gh-92417: `socket` docs: remove references to Python <3.3 (GH-92544) (GH-92968) (cherry picked from commit 639b62c9c479e38a6f91a80b261097574a1e7ac7) Co-authored-by: Alex Waygood files: M Doc/library/socket.rst diff --git a/Doc/library/socket.rst b/Doc/library/socket.rst index ee1aee5278b3b..c27f408890ac3 100755 --- a/Doc/library/socket.rst +++ b/Doc/library/socket.rst @@ -233,9 +233,9 @@ resolution and/or the host configuration. For deterministic behavior use a numeric address in *host* portion. All errors raise exceptions. The normal exceptions for invalid argument types -and out-of-memory conditions can be raised; starting from Python 3.3, errors +and out-of-memory conditions can be raised. Errors related to socket or address semantics raise :exc:`OSError` or one of its -subclasses (they used to raise :exc:`socket.error`). +subclasses. Non-blocking mode is supported through :meth:`~socket.setblocking`. A generalization of this based on timeouts is supported through From webhook-mailer at python.org Thu May 19 11:42:31 2022 From: webhook-mailer at python.org (erlend-aasland) Date: Thu, 19 May 2022 15:42:31 -0000 Subject: [Python-checkins] gh-78630: Drop invalid HP aCC compiler switch -fPIC on HP-UX (#8847) Message-ID: https://github.com/python/cpython/commit/09be18a73d81aa82cc57a782f3b0a9811e43ad3b commit: 09be18a73d81aa82cc57a782f3b0a9811e43ad3b branch: main author: Michael Osipov committer: erlend-aasland date: 2022-05-19T17:42:21+02:00 summary: gh-78630: Drop invalid HP aCC compiler switch -fPIC on HP-UX (#8847) At compile time, '+z' is already properly used with HP aCC, and shared libraries are correctly linked with '+b'. The '-fPIC' switch can safely be dropped. files: A Misc/NEWS.d/next/Build/2018-08-21-11-10-18.bpo-34449.Z3qm3c.rst M setup.py diff --git a/Misc/NEWS.d/next/Build/2018-08-21-11-10-18.bpo-34449.Z3qm3c.rst b/Misc/NEWS.d/next/Build/2018-08-21-11-10-18.bpo-34449.Z3qm3c.rst new file mode 100644 index 0000000000000..53b75aee9cc27 --- /dev/null +++ b/Misc/NEWS.d/next/Build/2018-08-21-11-10-18.bpo-34449.Z3qm3c.rst @@ -0,0 +1 @@ +Drop invalid compiler switch ``-fPIC`` for HP aCC on HP-UX. Patch by Michael Osipov. diff --git a/setup.py b/setup.py index f45cd6de33749..4c497346e8d7e 100644 --- a/setup.py +++ b/setup.py @@ -1408,9 +1408,6 @@ def detect_ctypes(self): # finding some -z option for the Sun compiler. extra_link_args.append('-mimpure-text') - elif HOST_PLATFORM.startswith('hp-ux'): - extra_link_args.append('-fPIC') - ext = Extension('_ctypes', include_dirs=include_dirs, extra_compile_args=extra_compile_args, From webhook-mailer at python.org Thu May 19 11:44:42 2022 From: webhook-mailer at python.org (ambv) Date: Thu, 19 May 2022 15:44:42 -0000 Subject: [Python-checkins] gh-92417: `socket` docs: remove references to Python <3.3 (GH-92544) (GH-92969) Message-ID: https://github.com/python/cpython/commit/ebf3f12c389c6d9cedf54c5daac065de3ef53256 commit: ebf3f12c389c6d9cedf54c5daac065de3ef53256 branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: ambv date: 2022-05-19T17:44:31+02:00 summary: gh-92417: `socket` docs: remove references to Python <3.3 (GH-92544) (GH-92969) (cherry picked from commit 639b62c9c479e38a6f91a80b261097574a1e7ac7) Co-authored-by: Alex Waygood files: M Doc/library/socket.rst diff --git a/Doc/library/socket.rst b/Doc/library/socket.rst index 7ce8e5b0d8038..4af78e415f3d7 100755 --- a/Doc/library/socket.rst +++ b/Doc/library/socket.rst @@ -233,9 +233,9 @@ resolution and/or the host configuration. For deterministic behavior use a numeric address in *host* portion. All errors raise exceptions. The normal exceptions for invalid argument types -and out-of-memory conditions can be raised; starting from Python 3.3, errors +and out-of-memory conditions can be raised. Errors related to socket or address semantics raise :exc:`OSError` or one of its -subclasses (they used to raise :exc:`socket.error`). +subclasses. Non-blocking mode is supported through :meth:`~socket.setblocking`. A generalization of this based on timeouts is supported through From webhook-mailer at python.org Thu May 19 11:45:22 2022 From: webhook-mailer at python.org (ambv) Date: Thu, 19 May 2022 15:45:22 -0000 Subject: [Python-checkins] gh-92417: `fractions`, `decimal`: Improve docs for alternative constructor methods (GH-92421) (GH-92970) Message-ID: https://github.com/python/cpython/commit/02fe22576ece289c299a4ae895cf912b29d15476 commit: 02fe22576ece289c299a4ae895cf912b29d15476 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: ambv date: 2022-05-19T17:45:12+02:00 summary: gh-92417: `fractions`, `decimal`: Improve docs for alternative constructor methods (GH-92421) (GH-92970) Co-authored-by: Ezio Melotti (cherry picked from commit 090df844ea16af3a5df79aba2b9c89ac6a31ba06) Co-authored-by: Alex Waygood files: M Doc/library/decimal.rst M Doc/library/fractions.rst diff --git a/Doc/library/decimal.rst b/Doc/library/decimal.rst index 2ad84f20b5560..d052581c97012 100644 --- a/Doc/library/decimal.rst +++ b/Doc/library/decimal.rst @@ -571,9 +571,10 @@ Decimal objects >>> Decimal(321).exp() Decimal('2.561702493119680037517373933E+139') - .. method:: from_float(f) + .. classmethod:: from_float(f) - Classmethod that converts a float to a decimal number, exactly. + Alternative constructor that only accepts instances of :class:`float` or + :class:`int`. Note `Decimal.from_float(0.1)` is not the same as `Decimal('0.1')`. Since 0.1 is not exactly representable in binary floating point, the diff --git a/Doc/library/fractions.rst b/Doc/library/fractions.rst index c893f2d5389d5..5f0ecf1f135ea 100644 --- a/Doc/library/fractions.rst +++ b/Doc/library/fractions.rst @@ -114,10 +114,10 @@ another rational number, or from a string. .. versionadded:: 3.8 - .. method:: from_float(flt) + .. classmethod:: from_float(flt) - This class method constructs a :class:`Fraction` representing the exact - value of *flt*, which must be a :class:`float`. Beware that + Alternative constructor which only accepts instances of + :class:`float` or :class:`numbers.Integral`. Beware that ``Fraction.from_float(0.3)`` is not the same value as ``Fraction(3, 10)``. .. note:: @@ -126,10 +126,10 @@ another rational number, or from a string. :class:`Fraction` instance directly from a :class:`float`. - .. method:: from_decimal(dec) + .. classmethod:: from_decimal(dec) - This class method constructs a :class:`Fraction` representing the exact - value of *dec*, which must be a :class:`decimal.Decimal` instance. + Alternative constructor which only accepts instances of + :class:`decimal.Decimal` or :class:`numbers.Integral`. .. note:: From webhook-mailer at python.org Thu May 19 11:45:34 2022 From: webhook-mailer at python.org (ambv) Date: Thu, 19 May 2022 15:45:34 -0000 Subject: [Python-checkins] gh-92417: `fractions`, `decimal`: Improve docs for alternative constructor methods (GH-92421) (GH-92971) Message-ID: https://github.com/python/cpython/commit/93ebac7a79c055b6122ef086000b456361388dd9 commit: 93ebac7a79c055b6122ef086000b456361388dd9 branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: ambv date: 2022-05-19T17:45:30+02:00 summary: gh-92417: `fractions`, `decimal`: Improve docs for alternative constructor methods (GH-92421) (GH-92971) Co-authored-by: Ezio Melotti (cherry picked from commit 090df844ea16af3a5df79aba2b9c89ac6a31ba06) Co-authored-by: Alex Waygood files: M Doc/library/decimal.rst M Doc/library/fractions.rst diff --git a/Doc/library/decimal.rst b/Doc/library/decimal.rst index e759c5cf23b9e..47627c02561b9 100644 --- a/Doc/library/decimal.rst +++ b/Doc/library/decimal.rst @@ -571,9 +571,10 @@ Decimal objects >>> Decimal(321).exp() Decimal('2.561702493119680037517373933E+139') - .. method:: from_float(f) + .. classmethod:: from_float(f) - Classmethod that converts a float to a decimal number, exactly. + Alternative constructor that only accepts instances of :class:`float` or + :class:`int`. Note `Decimal.from_float(0.1)` is not the same as `Decimal('0.1')`. Since 0.1 is not exactly representable in binary floating point, the diff --git a/Doc/library/fractions.rst b/Doc/library/fractions.rst index a4d006eb58ffe..0f7940ae68bef 100644 --- a/Doc/library/fractions.rst +++ b/Doc/library/fractions.rst @@ -105,10 +105,10 @@ another rational number, or from a string. .. versionadded:: 3.8 - .. method:: from_float(flt) + .. classmethod:: from_float(flt) - This class method constructs a :class:`Fraction` representing the exact - value of *flt*, which must be a :class:`float`. Beware that + Alternative constructor which only accepts instances of + :class:`float` or :class:`numbers.Integral`. Beware that ``Fraction.from_float(0.3)`` is not the same value as ``Fraction(3, 10)``. .. note:: @@ -117,10 +117,10 @@ another rational number, or from a string. :class:`Fraction` instance directly from a :class:`float`. - .. method:: from_decimal(dec) + .. classmethod:: from_decimal(dec) - This class method constructs a :class:`Fraction` representing the exact - value of *dec*, which must be a :class:`decimal.Decimal` instance. + Alternative constructor which only accepts instances of + :class:`decimal.Decimal` or :class:`numbers.Integral`. .. note:: From webhook-mailer at python.org Thu May 19 11:46:23 2022 From: webhook-mailer at python.org (ambv) Date: Thu, 19 May 2022 15:46:23 -0000 Subject: [Python-checkins] bpo-28249: fix `lineno` location for empty `DocTest` instances (GH-30498) Message-ID: https://github.com/python/cpython/commit/8db2b3b6878aba9f12844526bce966b7eed81aee commit: 8db2b3b6878aba9f12844526bce966b7eed81aee branch: main author: Nikita Sobolev committer: ambv date: 2022-05-19T17:46:15+02:00 summary: bpo-28249: fix `lineno` location for empty `DocTest` instances (GH-30498) Co-authored-by: Kumar Aditya <59607654+kumaraditya303 at users.noreply.github.com> Co-authored-by: ?ukasz Langa files: A Lib/test/doctest_lineno.py A Misc/NEWS.d/next/Library/2022-01-09-14-23-00.bpo-28249.4dzB80.rst M Lib/doctest.py M Lib/test/test_doctest.py diff --git a/Lib/doctest.py b/Lib/doctest.py index ed94d15c0e2da..b2ef2ce63672e 100644 --- a/Lib/doctest.py +++ b/Lib/doctest.py @@ -1085,19 +1085,21 @@ def _get_test(self, obj, name, module, globs, source_lines): def _find_lineno(self, obj, source_lines): """ - Return a line number of the given object's docstring. Note: - this method assumes that the object has a docstring. + Return a line number of the given object's docstring. + + Returns `None` if the given object does not have a docstring. """ lineno = None + docstring = getattr(obj, '__doc__', None) # Find the line number for modules. - if inspect.ismodule(obj): + if inspect.ismodule(obj) and docstring is not None: lineno = 0 # Find the line number for classes. # Note: this could be fooled if a class is defined multiple # times in a single file. - if inspect.isclass(obj): + if inspect.isclass(obj) and docstring is not None: if source_lines is None: return None pat = re.compile(r'^\s*class\s*%s\b' % @@ -1109,7 +1111,9 @@ def _find_lineno(self, obj, source_lines): # Find the line number for functions & methods. if inspect.ismethod(obj): obj = obj.__func__ - if inspect.isfunction(obj): obj = obj.__code__ + if inspect.isfunction(obj) and getattr(obj, '__doc__', None): + # We don't use `docstring` var here, because `obj` can be changed. + obj = obj.__code__ if inspect.istraceback(obj): obj = obj.tb_frame if inspect.isframe(obj): obj = obj.f_code if inspect.iscode(obj): diff --git a/Lib/test/doctest_lineno.py b/Lib/test/doctest_lineno.py new file mode 100644 index 0000000000000..be198513a1502 --- /dev/null +++ b/Lib/test/doctest_lineno.py @@ -0,0 +1,50 @@ +# This module is used in `test_doctest`. +# It must not have a docstring. + +def func_with_docstring(): + """Some unrelated info.""" + + +def func_without_docstring(): + pass + + +def func_with_doctest(): + """ + This function really contains a test case. + + >>> func_with_doctest.__name__ + 'func_with_doctest' + """ + return 3 + + +class ClassWithDocstring: + """Some unrelated class information.""" + + +class ClassWithoutDocstring: + pass + + +class ClassWithDoctest: + """This class really has a test case in it. + + >>> ClassWithDoctest.__name__ + 'ClassWithDoctest' + """ + + +class MethodWrapper: + def method_with_docstring(self): + """Method with a docstring.""" + + def method_without_docstring(self): + pass + + def method_with_doctest(self): + """ + This has a doctest! + >>> MethodWrapper.method_with_doctest.__name__ + 'method_with_doctest' + """ diff --git a/Lib/test/test_doctest.py b/Lib/test/test_doctest.py index 3e7f3782d89f4..a4aab6cf4db3b 100644 --- a/Lib/test/test_doctest.py +++ b/Lib/test/test_doctest.py @@ -25,6 +25,7 @@ # NOTE: There are some additional tests relating to interaction with # zipimport in the test_zipimport_support test module. +# There are also related tests in `test_doctest2` module. ###################################################################### ## Sample Objects (used by test cases) @@ -460,7 +461,7 @@ def basics(): r""" >>> tests = finder.find(sample_func) >>> print(tests) # doctest: +ELLIPSIS - [] + [] The exact name depends on how test_doctest was invoked, so allow for leading path components. @@ -642,6 +643,26 @@ def basics(): r""" 1 SampleClass.double 1 SampleClass.get +When used with `exclude_empty=False` we are also interested in line numbers +of doctests that are empty. +It used to be broken for quite some time until `bpo-28249`. + + >>> from test import doctest_lineno + >>> tests = doctest.DocTestFinder(exclude_empty=False).find(doctest_lineno) + >>> for t in tests: + ... print('%5s %s' % (t.lineno, t.name)) + None test.doctest_lineno + 22 test.doctest_lineno.ClassWithDocstring + 30 test.doctest_lineno.ClassWithDoctest + None test.doctest_lineno.ClassWithoutDocstring + None test.doctest_lineno.MethodWrapper + 39 test.doctest_lineno.MethodWrapper.method_with_docstring + 45 test.doctest_lineno.MethodWrapper.method_with_doctest + None test.doctest_lineno.MethodWrapper.method_without_docstring + 4 test.doctest_lineno.func_with_docstring + 12 test.doctest_lineno.func_with_doctest + None test.doctest_lineno.func_without_docstring + Turning off Recursion ~~~~~~~~~~~~~~~~~~~~~ DocTestFinder can be told not to look for tests in contained objects diff --git a/Misc/NEWS.d/next/Library/2022-01-09-14-23-00.bpo-28249.4dzB80.rst b/Misc/NEWS.d/next/Library/2022-01-09-14-23-00.bpo-28249.4dzB80.rst new file mode 100644 index 0000000000000..b5f1312d76866 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-01-09-14-23-00.bpo-28249.4dzB80.rst @@ -0,0 +1,2 @@ +Set :attr:`doctest.DocTest.lineno` to ``None`` when object does not have +:attr:`__doc__`. From webhook-mailer at python.org Thu May 19 11:49:09 2022 From: webhook-mailer at python.org (ambv) Date: Thu, 19 May 2022 15:49:09 -0000 Subject: [Python-checkins] gh-92417: `importlib` docs: remove references to unsupported Python versions (GH-92424) Message-ID: https://github.com/python/cpython/commit/70aa1b9b912d8254df3c61ae0a55464962f4c087 commit: 70aa1b9b912d8254df3c61ae0a55464962f4c087 branch: main author: Alex Waygood committer: ambv date: 2022-05-19T17:48:44+02:00 summary: gh-92417: `importlib` docs: remove references to unsupported Python versions (GH-92424) Co-authored-by: CAM Gerlach files: M Doc/library/importlib.metadata.rst M Doc/library/importlib.rst diff --git a/Doc/library/importlib.metadata.rst b/Doc/library/importlib.metadata.rst index b3740178d6f9c..d40ed70d5cd83 100644 --- a/Doc/library/importlib.metadata.rst +++ b/Doc/library/importlib.metadata.rst @@ -17,9 +17,9 @@ package metadata. Built in part on Python's import system, this library intends to replace similar functionality in the `entry point API`_ and `metadata API`_ of ``pkg_resources``. Along with -:mod:`importlib.resources` in Python 3.7 -and newer (backported as `importlib_resources`_ for older versions of -Python), this can eliminate the need to use the older and less efficient +:mod:`importlib.resources` (with new features backported to the +`importlib_resources`_ package), this can eliminate the need to use the older +and less efficient ``pkg_resources`` package. By "installed package" we generally mean a third-party package installed into diff --git a/Doc/library/importlib.rst b/Doc/library/importlib.rst index 0241fb30b6efb..f19532213940e 100644 --- a/Doc/library/importlib.rst +++ b/Doc/library/importlib.rst @@ -414,8 +414,8 @@ ABC hierarchy:: .. versionadded:: 3.4 - .. versionchanged:: 3.5 - Starting in Python 3.6, this method will not be optional when + .. versionchanged:: 3.6 + This method is no longer optional when :meth:`exec_module` is defined. .. method:: exec_module(module) @@ -1273,8 +1273,7 @@ import, then you should use :func:`importlib.util.find_spec`. Importing a source file directly '''''''''''''''''''''''''''''''' -To import a Python source file directly, use the following recipe -(Python 3.5 and newer only):: +To import a Python source file directly, use the following recipe:: import importlib.util import sys @@ -1355,9 +1354,7 @@ Import itself is implemented in Python code, making it possible to expose most of the import machinery through importlib. The following helps illustrate the various APIs that importlib exposes by providing an approximate implementation of -:func:`importlib.import_module` (Python 3.4 and newer for the importlib usage, -Python 3.6 and newer for other parts of the code). -:: +:func:`importlib.import_module`:: import importlib.util import sys From webhook-mailer at python.org Thu May 19 11:49:17 2022 From: webhook-mailer at python.org (ambv) Date: Thu, 19 May 2022 15:49:17 -0000 Subject: [Python-checkins] gh-92417: `subprocess` docs: remove note on compatibility with Python <3.5 (GH-92538) (GH-92973) Message-ID: https://github.com/python/cpython/commit/3d47035686f34dee77e40738780ab2a9be3c3989 commit: 3d47035686f34dee77e40738780ab2a9be3c3989 branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: ambv date: 2022-05-19T17:49:13+02:00 summary: gh-92417: `subprocess` docs: remove note on compatibility with Python <3.5 (GH-92538) (GH-92973) (cherry picked from commit 84b86000e2bc32b0fbb6dfb6445a7ffc882067d2) Co-authored-by: Alex Waygood files: M Doc/library/subprocess.rst diff --git a/Doc/library/subprocess.rst b/Doc/library/subprocess.rst index 4d3312077bbd0..d0f8864493ed0 100644 --- a/Doc/library/subprocess.rst +++ b/Doc/library/subprocess.rst @@ -33,9 +33,6 @@ The recommended approach to invoking subprocesses is to use the :func:`run` function for all use cases it can handle. For more advanced use cases, the underlying :class:`Popen` interface can be used directly. -The :func:`run` function was added in Python 3.5; if you need to retain -compatibility with older versions, see the :ref:`call-function-trio` section. - .. function:: run(args, *, stdin=None, input=None, stdout=None, stderr=None,\ capture_output=False, shell=False, cwd=None, timeout=None, \ From webhook-mailer at python.org Thu May 19 11:56:15 2022 From: webhook-mailer at python.org (ambv) Date: Thu, 19 May 2022 15:56:15 -0000 Subject: [Python-checkins] gh-92417: `subprocess` docs: remove note on compatibility with Python <3.5 (GH-92538) (GH-92972) Message-ID: https://github.com/python/cpython/commit/de97d8229c6bf31f47341d10de98b938fccb8b8f commit: de97d8229c6bf31f47341d10de98b938fccb8b8f branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: ambv date: 2022-05-19T17:56:04+02:00 summary: gh-92417: `subprocess` docs: remove note on compatibility with Python <3.5 (GH-92538) (GH-92972) (cherry picked from commit 84b86000e2bc32b0fbb6dfb6445a7ffc882067d2) Co-authored-by: Alex Waygood files: M Doc/library/subprocess.rst diff --git a/Doc/library/subprocess.rst b/Doc/library/subprocess.rst index ce581abdd1dce..4031a5f62167f 100644 --- a/Doc/library/subprocess.rst +++ b/Doc/library/subprocess.rst @@ -33,9 +33,6 @@ The recommended approach to invoking subprocesses is to use the :func:`run` function for all use cases it can handle. For more advanced use cases, the underlying :class:`Popen` interface can be used directly. -The :func:`run` function was added in Python 3.5; if you need to retain -compatibility with older versions, see the :ref:`call-function-trio` section. - .. function:: run(args, *, stdin=None, input=None, stdout=None, stderr=None,\ capture_output=False, shell=False, cwd=None, timeout=None, \ From webhook-mailer at python.org Thu May 19 11:57:04 2022 From: webhook-mailer at python.org (ambv) Date: Thu, 19 May 2022 15:57:04 -0000 Subject: [Python-checkins] bpo-46879: Fix incorrect sphinx object names in doc (GH-31615) (GH-92974) Message-ID: https://github.com/python/cpython/commit/27302ae2df658c55ff0a20136b58b426e6d49a30 commit: 27302ae2df658c55ff0a20136b58b426e6d49a30 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: ambv date: 2022-05-19T17:56:59+02:00 summary: bpo-46879: Fix incorrect sphinx object names in doc (GH-31615) (GH-92974) Co-authored-by: ?ukasz Langa (cherry picked from commit 2cdd57f119e3b85f1bfd28c7ff040e0d9bcaf115) Co-authored-by: Martin Fischer files: M Doc/library/asyncio-subprocess.rst M Doc/library/multiprocessing.rst M Doc/library/xml.etree.elementtree.rst diff --git a/Doc/library/asyncio-subprocess.rst b/Doc/library/asyncio-subprocess.rst index e5000532a895d..28d0b21e8180b 100644 --- a/Doc/library/asyncio-subprocess.rst +++ b/Doc/library/asyncio-subprocess.rst @@ -124,6 +124,7 @@ Constants ========= .. data:: asyncio.subprocess.PIPE + :module: Can be passed to the *stdin*, *stdout* or *stderr* parameters. @@ -137,11 +138,13 @@ Constants attributes will point to :class:`StreamReader` instances. .. data:: asyncio.subprocess.STDOUT + :module: Special value that can be used as the *stderr* argument and indicates that standard error should be redirected into standard output. .. data:: asyncio.subprocess.DEVNULL + :module: Special value that can be used as the *stdin*, *stdout* or *stderr* argument to process creation functions. It indicates that the special file @@ -157,6 +160,7 @@ wrapper that allows communicating with subprocesses and watching for their completion. .. class:: asyncio.subprocess.Process + :module: An object that wraps OS processes created by the :func:`create_subprocess_exec` and :func:`create_subprocess_shell` diff --git a/Doc/library/multiprocessing.rst b/Doc/library/multiprocessing.rst index 70802ee1fdecb..2a66b0f65c088 100644 --- a/Doc/library/multiprocessing.rst +++ b/Doc/library/multiprocessing.rst @@ -1666,6 +1666,7 @@ different machines. A manager object controls a server process which manages proxies. .. function:: multiprocessing.Manager() + :module: Returns a started :class:`~multiprocessing.managers.SyncManager` object which can be used for sharing objects between processes. The returned manager diff --git a/Doc/library/xml.etree.elementtree.rst b/Doc/library/xml.etree.elementtree.rst index e3932bc9e659f..2fe0d2e082fb3 100644 --- a/Doc/library/xml.etree.elementtree.rst +++ b/Doc/library/xml.etree.elementtree.rst @@ -826,6 +826,7 @@ Functions ^^^^^^^^^ .. function:: xml.etree.ElementInclude.default_loader( href, parse, encoding=None) + :module: Default loader. This default loader reads an included resource from disk. *href* is a URL. *parse* is for parse mode either "xml" or "text". *encoding* @@ -837,6 +838,7 @@ Functions .. function:: xml.etree.ElementInclude.include( elem, loader=None, base_url=None, \ max_depth=6) + :module: This function expands XInclude directives. *elem* is the root element. *loader* is an optional resource loader. If omitted, it defaults to :func:`default_loader`. From webhook-mailer at python.org Thu May 19 11:57:50 2022 From: webhook-mailer at python.org (ambv) Date: Thu, 19 May 2022 15:57:50 -0000 Subject: [Python-checkins] bpo-46879: Fix incorrect sphinx object names in doc (GH-31615) (GH-92975) Message-ID: https://github.com/python/cpython/commit/5d7f3dc3dca506cf23c7a502c5083b44cf759a1c commit: 5d7f3dc3dca506cf23c7a502c5083b44cf759a1c branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: ambv date: 2022-05-19T17:57:46+02:00 summary: bpo-46879: Fix incorrect sphinx object names in doc (GH-31615) (GH-92975) (cherry picked from commit 2cdd57f119e3b85f1bfd28c7ff040e0d9bcaf115) Co-authored-by: ?ukasz Langa Co-authored-by: Martin Fischer files: M Doc/library/asyncio-subprocess.rst M Doc/library/multiprocessing.rst M Doc/library/xml.etree.elementtree.rst diff --git a/Doc/library/asyncio-subprocess.rst b/Doc/library/asyncio-subprocess.rst index e5000532a895d..28d0b21e8180b 100644 --- a/Doc/library/asyncio-subprocess.rst +++ b/Doc/library/asyncio-subprocess.rst @@ -124,6 +124,7 @@ Constants ========= .. data:: asyncio.subprocess.PIPE + :module: Can be passed to the *stdin*, *stdout* or *stderr* parameters. @@ -137,11 +138,13 @@ Constants attributes will point to :class:`StreamReader` instances. .. data:: asyncio.subprocess.STDOUT + :module: Special value that can be used as the *stderr* argument and indicates that standard error should be redirected into standard output. .. data:: asyncio.subprocess.DEVNULL + :module: Special value that can be used as the *stdin*, *stdout* or *stderr* argument to process creation functions. It indicates that the special file @@ -157,6 +160,7 @@ wrapper that allows communicating with subprocesses and watching for their completion. .. class:: asyncio.subprocess.Process + :module: An object that wraps OS processes created by the :func:`create_subprocess_exec` and :func:`create_subprocess_shell` diff --git a/Doc/library/multiprocessing.rst b/Doc/library/multiprocessing.rst index 096e6492cd42e..de8f9718337d7 100644 --- a/Doc/library/multiprocessing.rst +++ b/Doc/library/multiprocessing.rst @@ -1648,6 +1648,7 @@ different machines. A manager object controls a server process which manages proxies. .. function:: multiprocessing.Manager() + :module: Returns a started :class:`~multiprocessing.managers.SyncManager` object which can be used for sharing objects between processes. The returned manager diff --git a/Doc/library/xml.etree.elementtree.rst b/Doc/library/xml.etree.elementtree.rst index e3932bc9e659f..2fe0d2e082fb3 100644 --- a/Doc/library/xml.etree.elementtree.rst +++ b/Doc/library/xml.etree.elementtree.rst @@ -826,6 +826,7 @@ Functions ^^^^^^^^^ .. function:: xml.etree.ElementInclude.default_loader( href, parse, encoding=None) + :module: Default loader. This default loader reads an included resource from disk. *href* is a URL. *parse* is for parse mode either "xml" or "text". *encoding* @@ -837,6 +838,7 @@ Functions .. function:: xml.etree.ElementInclude.include( elem, loader=None, base_url=None, \ max_depth=6) + :module: This function expands XInclude directives. *elem* is the root element. *loader* is an optional resource loader. If omitted, it defaults to :func:`default_loader`. From webhook-mailer at python.org Thu May 19 12:04:03 2022 From: webhook-mailer at python.org (ambv) Date: Thu, 19 May 2022 16:04:03 -0000 Subject: [Python-checkins] bpo-46879: Fix incorrect sphinx object names in doc (GH-31615) (GH-92976) Message-ID: https://github.com/python/cpython/commit/a43f4e7487e5546bc798580c4754a93bbdf79712 commit: a43f4e7487e5546bc798580c4754a93bbdf79712 branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: ambv date: 2022-05-19T18:03:55+02:00 summary: bpo-46879: Fix incorrect sphinx object names in doc (GH-31615) (GH-92976) (cherry picked from commit 2cdd57f119e3b85f1bfd28c7ff040e0d9bcaf115) Co-authored-by: ?ukasz Langa Co-authored-by: Martin Fischer files: M Doc/library/asyncio-subprocess.rst M Doc/library/multiprocessing.rst M Doc/library/xml.etree.elementtree.rst diff --git a/Doc/library/asyncio-subprocess.rst b/Doc/library/asyncio-subprocess.rst index fbe68f78a2f9b..4f8b0b3e68dd4 100644 --- a/Doc/library/asyncio-subprocess.rst +++ b/Doc/library/asyncio-subprocess.rst @@ -127,6 +127,7 @@ Constants ========= .. data:: asyncio.subprocess.PIPE + :module: Can be passed to the *stdin*, *stdout* or *stderr* parameters. @@ -140,11 +141,13 @@ Constants attributes will point to :class:`StreamReader` instances. .. data:: asyncio.subprocess.STDOUT + :module: Special value that can be used as the *stderr* argument and indicates that standard error should be redirected into standard output. .. data:: asyncio.subprocess.DEVNULL + :module: Special value that can be used as the *stdin*, *stdout* or *stderr* argument to process creation functions. It indicates that the special file @@ -160,6 +163,7 @@ wrapper that allows communicating with subprocesses and watching for their completion. .. class:: asyncio.subprocess.Process + :module: An object that wraps OS processes created by the :func:`create_subprocess_exec` and :func:`create_subprocess_shell` diff --git a/Doc/library/multiprocessing.rst b/Doc/library/multiprocessing.rst index b62e1f8dba1bf..1bde2ec28ca0a 100644 --- a/Doc/library/multiprocessing.rst +++ b/Doc/library/multiprocessing.rst @@ -1648,6 +1648,7 @@ different machines. A manager object controls a server process which manages proxies. .. function:: multiprocessing.Manager() + :module: Returns a started :class:`~multiprocessing.managers.SyncManager` object which can be used for sharing objects between processes. The returned manager diff --git a/Doc/library/xml.etree.elementtree.rst b/Doc/library/xml.etree.elementtree.rst index 92248e751632b..0d96a78cbbfd5 100644 --- a/Doc/library/xml.etree.elementtree.rst +++ b/Doc/library/xml.etree.elementtree.rst @@ -808,6 +808,7 @@ Functions ^^^^^^^^^ .. function:: xml.etree.ElementInclude.default_loader( href, parse, encoding=None) + :module: Default loader. This default loader reads an included resource from disk. *href* is a URL. *parse* is for parse mode either "xml" or "text". *encoding* @@ -819,6 +820,7 @@ Functions .. function:: xml.etree.ElementInclude.include( elem, loader=None, base_url=None, \ max_depth=6) + :module: This function expands XInclude directives. *elem* is the root element. *loader* is an optional resource loader. If omitted, it defaults to :func:`default_loader`. From webhook-mailer at python.org Thu May 19 12:11:38 2022 From: webhook-mailer at python.org (ambv) Date: Thu, 19 May 2022 16:11:38 -0000 Subject: [Python-checkins] gh-92417: `importlib` docs: remove references to unsupported Python versions (GH-92424) (GH-92979) Message-ID: https://github.com/python/cpython/commit/37d60c0255f4404080e2a329b80b253c8221762d commit: 37d60c0255f4404080e2a329b80b253c8221762d branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: ambv date: 2022-05-19T18:11:25+02:00 summary: gh-92417: `importlib` docs: remove references to unsupported Python versions (GH-92424) (GH-92979) Co-authored-by: CAM Gerlach (cherry picked from commit 70aa1b9b912d8254df3c61ae0a55464962f4c087) Co-authored-by: Alex Waygood files: M Doc/library/importlib.metadata.rst M Doc/library/importlib.rst diff --git a/Doc/library/importlib.metadata.rst b/Doc/library/importlib.metadata.rst index b3740178d6f9c..d40ed70d5cd83 100644 --- a/Doc/library/importlib.metadata.rst +++ b/Doc/library/importlib.metadata.rst @@ -17,9 +17,9 @@ package metadata. Built in part on Python's import system, this library intends to replace similar functionality in the `entry point API`_ and `metadata API`_ of ``pkg_resources``. Along with -:mod:`importlib.resources` in Python 3.7 -and newer (backported as `importlib_resources`_ for older versions of -Python), this can eliminate the need to use the older and less efficient +:mod:`importlib.resources` (with new features backported to the +`importlib_resources`_ package), this can eliminate the need to use the older +and less efficient ``pkg_resources`` package. By "installed package" we generally mean a third-party package installed into diff --git a/Doc/library/importlib.rst b/Doc/library/importlib.rst index 0241fb30b6efb..f19532213940e 100644 --- a/Doc/library/importlib.rst +++ b/Doc/library/importlib.rst @@ -414,8 +414,8 @@ ABC hierarchy:: .. versionadded:: 3.4 - .. versionchanged:: 3.5 - Starting in Python 3.6, this method will not be optional when + .. versionchanged:: 3.6 + This method is no longer optional when :meth:`exec_module` is defined. .. method:: exec_module(module) @@ -1273,8 +1273,7 @@ import, then you should use :func:`importlib.util.find_spec`. Importing a source file directly '''''''''''''''''''''''''''''''' -To import a Python source file directly, use the following recipe -(Python 3.5 and newer only):: +To import a Python source file directly, use the following recipe:: import importlib.util import sys @@ -1355,9 +1354,7 @@ Import itself is implemented in Python code, making it possible to expose most of the import machinery through importlib. The following helps illustrate the various APIs that importlib exposes by providing an approximate implementation of -:func:`importlib.import_module` (Python 3.4 and newer for the importlib usage, -Python 3.6 and newer for other parts of the code). -:: +:func:`importlib.import_module`:: import importlib.util import sys From webhook-mailer at python.org Thu May 19 12:50:03 2022 From: webhook-mailer at python.org (markshannon) Date: Thu, 19 May 2022 16:50:03 -0000 Subject: [Python-checkins] GH-89914: Make the oparg of the YIELD_VALUE instruction equal the stack depth. (GH-92960) Message-ID: https://github.com/python/cpython/commit/3fd86100022103f41ada043f5bb5a7201e80ac27 commit: 3fd86100022103f41ada043f5bb5a7201e80ac27 branch: main author: Mark Shannon committer: markshannon date: 2022-05-19T17:49:29+01:00 summary: GH-89914: Make the oparg of the YIELD_VALUE instruction equal the stack depth. (GH-92960) files: A Misc/NEWS.d/next/Core and Builtins/2022-05-19-15-29-53.gh-issue-89914.8bAffH.rst M Doc/library/dis.rst M Include/internal/pycore_opcode.h M Include/opcode.h M Lib/importlib/_bootstrap_external.py M Lib/opcode.py M Python/ceval.c M Python/compile.c M Python/opcode_targets.h diff --git a/Doc/library/dis.rst b/Doc/library/dis.rst index 027db0153bea4..8bc3721109b1e 100644 --- a/Doc/library/dis.rst +++ b/Doc/library/dis.rst @@ -575,6 +575,8 @@ iterations of the loop. Pops TOS and yields it from a :term:`generator`. + .. versionchanged:: 3.11 + oparg set to be the stack depth, for efficient handling on frames. .. opcode:: YIELD_FROM diff --git a/Include/internal/pycore_opcode.h b/Include/internal/pycore_opcode.h index 17a68f030b084..79926b62a365f 100644 --- a/Include/internal/pycore_opcode.h +++ b/Include/internal/pycore_opcode.h @@ -504,7 +504,7 @@ static const char *const _PyOpcode_OpName[256] = { [RETURN_VALUE] = "RETURN_VALUE", [IMPORT_STAR] = "IMPORT_STAR", [SETUP_ANNOTATIONS] = "SETUP_ANNOTATIONS", - [YIELD_VALUE] = "YIELD_VALUE", + [LOAD_METHOD_NO_DICT] = "LOAD_METHOD_NO_DICT", [ASYNC_GEN_WRAP] = "ASYNC_GEN_WRAP", [PREP_RERAISE_STAR] = "PREP_RERAISE_STAR", [POP_EXCEPT] = "POP_EXCEPT", @@ -531,7 +531,7 @@ static const char *const _PyOpcode_OpName[256] = { [JUMP_FORWARD] = "JUMP_FORWARD", [JUMP_IF_FALSE_OR_POP] = "JUMP_IF_FALSE_OR_POP", [JUMP_IF_TRUE_OR_POP] = "JUMP_IF_TRUE_OR_POP", - [LOAD_METHOD_NO_DICT] = "LOAD_METHOD_NO_DICT", + [LOAD_METHOD_WITH_DICT] = "LOAD_METHOD_WITH_DICT", [POP_JUMP_FORWARD_IF_FALSE] = "POP_JUMP_FORWARD_IF_FALSE", [POP_JUMP_FORWARD_IF_TRUE] = "POP_JUMP_FORWARD_IF_TRUE", [LOAD_GLOBAL] = "LOAD_GLOBAL", @@ -539,13 +539,13 @@ static const char *const _PyOpcode_OpName[256] = { [CONTAINS_OP] = "CONTAINS_OP", [RERAISE] = "RERAISE", [COPY] = "COPY", - [LOAD_METHOD_WITH_DICT] = "LOAD_METHOD_WITH_DICT", + [LOAD_METHOD_WITH_VALUES] = "LOAD_METHOD_WITH_VALUES", [BINARY_OP] = "BINARY_OP", [SEND] = "SEND", [LOAD_FAST] = "LOAD_FAST", [STORE_FAST] = "STORE_FAST", [DELETE_FAST] = "DELETE_FAST", - [LOAD_METHOD_WITH_VALUES] = "LOAD_METHOD_WITH_VALUES", + [RESUME_QUICK] = "RESUME_QUICK", [POP_JUMP_FORWARD_IF_NOT_NONE] = "POP_JUMP_FORWARD_IF_NOT_NONE", [POP_JUMP_FORWARD_IF_NONE] = "POP_JUMP_FORWARD_IF_NONE", [RAISE_VARARGS] = "RAISE_VARARGS", @@ -559,16 +559,16 @@ static const char *const _PyOpcode_OpName[256] = { [STORE_DEREF] = "STORE_DEREF", [DELETE_DEREF] = "DELETE_DEREF", [JUMP_BACKWARD] = "JUMP_BACKWARD", - [RESUME_QUICK] = "RESUME_QUICK", - [CALL_FUNCTION_EX] = "CALL_FUNCTION_EX", [STORE_ATTR_ADAPTIVE] = "STORE_ATTR_ADAPTIVE", + [CALL_FUNCTION_EX] = "CALL_FUNCTION_EX", + [STORE_ATTR_INSTANCE_VALUE] = "STORE_ATTR_INSTANCE_VALUE", [EXTENDED_ARG] = "EXTENDED_ARG", [LIST_APPEND] = "LIST_APPEND", [SET_ADD] = "SET_ADD", [MAP_ADD] = "MAP_ADD", [LOAD_CLASSDEREF] = "LOAD_CLASSDEREF", [COPY_FREE_VARS] = "COPY_FREE_VARS", - [STORE_ATTR_INSTANCE_VALUE] = "STORE_ATTR_INSTANCE_VALUE", + [YIELD_VALUE] = "YIELD_VALUE", [RESUME] = "RESUME", [MATCH_CLASS] = "MATCH_CLASS", [STORE_ATTR_SLOT] = "STORE_ATTR_SLOT", diff --git a/Include/opcode.h b/Include/opcode.h index 9a076e01c6530..e04b5a6bfa7d4 100644 --- a/Include/opcode.h +++ b/Include/opcode.h @@ -42,7 +42,6 @@ extern "C" { #define RETURN_VALUE 83 #define IMPORT_STAR 84 #define SETUP_ANNOTATIONS 85 -#define YIELD_VALUE 86 #define ASYNC_GEN_WRAP 87 #define PREP_RERAISE_STAR 88 #define POP_EXCEPT 89 @@ -102,6 +101,7 @@ extern "C" { #define MAP_ADD 147 #define LOAD_CLASSDEREF 148 #define COPY_FREE_VARS 149 +#define YIELD_VALUE 150 #define RESUME 151 #define MATCH_CLASS 152 #define FORMAT_VALUE 155 @@ -170,12 +170,12 @@ extern "C" { #define LOAD_METHOD_ADAPTIVE 79 #define LOAD_METHOD_CLASS 80 #define LOAD_METHOD_MODULE 81 -#define LOAD_METHOD_NO_DICT 113 -#define LOAD_METHOD_WITH_DICT 121 -#define LOAD_METHOD_WITH_VALUES 127 -#define RESUME_QUICK 141 -#define STORE_ATTR_ADAPTIVE 143 -#define STORE_ATTR_INSTANCE_VALUE 150 +#define LOAD_METHOD_NO_DICT 86 +#define LOAD_METHOD_WITH_DICT 113 +#define LOAD_METHOD_WITH_VALUES 121 +#define RESUME_QUICK 127 +#define STORE_ATTR_ADAPTIVE 141 +#define STORE_ATTR_INSTANCE_VALUE 143 #define STORE_ATTR_SLOT 153 #define STORE_ATTR_WITH_HINT 154 #define STORE_FAST__LOAD_FAST 158 diff --git a/Lib/importlib/_bootstrap_external.py b/Lib/importlib/_bootstrap_external.py index e7941aeae059d..eac371fdefc78 100644 --- a/Lib/importlib/_bootstrap_external.py +++ b/Lib/importlib/_bootstrap_external.py @@ -405,6 +405,7 @@ def _write_atomic(path, data, mode=0o666): # Python 3.11a7 3494 (New location info table) # Python 3.12a1 3500 (Remove PRECALL opcode) +# Python 3.12a1 3501 (YIELD_VALUE oparg == stack_depth) # Python 3.13 will start with 3550 @@ -418,7 +419,7 @@ def _write_atomic(path, data, mode=0o666): # Whenever MAGIC_NUMBER is changed, the ranges in the magic_values array # in PC/launcher.c must also be updated. -MAGIC_NUMBER = (3500).to_bytes(2, 'little') + b'\r\n' +MAGIC_NUMBER = (3501).to_bytes(2, 'little') + b'\r\n' _RAW_MAGIC_NUMBER = int.from_bytes(MAGIC_NUMBER, 'little') # For import.c diff --git a/Lib/opcode.py b/Lib/opcode.py index 27e9ab17969ba..410853a25cfec 100644 --- a/Lib/opcode.py +++ b/Lib/opcode.py @@ -98,7 +98,7 @@ def jabs_op(name, op): def_op('RETURN_VALUE', 83) def_op('IMPORT_STAR', 84) def_op('SETUP_ANNOTATIONS', 85) -def_op('YIELD_VALUE', 86) + def_op('ASYNC_GEN_WRAP', 87) def_op('PREP_RERAISE_STAR', 88) def_op('POP_EXCEPT', 89) @@ -174,7 +174,7 @@ def jabs_op(name, op): def_op('LOAD_CLASSDEREF', 148) hasfree.append(148) def_op('COPY_FREE_VARS', 149) - +def_op('YIELD_VALUE', 150) def_op('RESUME', 151) def_op('MATCH_CLASS', 152) diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-19-15-29-53.gh-issue-89914.8bAffH.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-19-15-29-53.gh-issue-89914.8bAffH.rst new file mode 100644 index 0000000000000..d2156f8bbf3d2 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-05-19-15-29-53.gh-issue-89914.8bAffH.rst @@ -0,0 +1,2 @@ +The operand of the ``YIELD_VALUE`` instruction is set to the stack depth. +This is done to help frame handling on ``yield`` and may assist debuggers. diff --git a/Python/ceval.c b/Python/ceval.c index deb131813eb11..230198b41f6a5 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -2698,6 +2698,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int } TARGET(YIELD_VALUE) { + assert(oparg == STACK_LEVEL()); assert(frame->is_entry); PyObject *retval = POP(); _PyFrame_GetGenerator(frame)->gi_frame_state = FRAME_SUSPENDED; diff --git a/Python/compile.c b/Python/compile.c index c42deb54ba3de..c862c10a83e53 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -1962,7 +1962,7 @@ compiler_add_yield_from(struct compiler *c, int await) compiler_use_next_block(c, start); ADDOP_JUMP(c, SEND, exit); compiler_use_next_block(c, resume); - ADDOP(c, YIELD_VALUE); + ADDOP_I(c, YIELD_VALUE, 0); ADDOP_I(c, RESUME, await ? 3 : 2); ADDOP_JUMP(c, JUMP_NO_INTERRUPT, start); compiler_use_next_block(c, exit); @@ -4193,7 +4193,7 @@ addop_yield(struct compiler *c) { if (c->u->u_ste->ste_generator && c->u->u_ste->ste_coroutine) { ADDOP(c, ASYNC_GEN_WRAP); } - ADDOP(c, YIELD_VALUE); + ADDOP_I(c, YIELD_VALUE, 0); ADDOP_I(c, RESUME, 1); return 1; } @@ -7152,6 +7152,9 @@ stackdepth(struct compiler *c, basicblock *entry) next = NULL; break; } + if (instr->i_opcode == YIELD_VALUE) { + instr->i_oparg = depth; + } } if (next != NULL) { assert(b->b_nofallthrough == 0); diff --git a/Python/opcode_targets.h b/Python/opcode_targets.h index 3a6768bd228bd..0d8faf223112b 100644 --- a/Python/opcode_targets.h +++ b/Python/opcode_targets.h @@ -85,7 +85,7 @@ static void *opcode_targets[256] = { &&TARGET_RETURN_VALUE, &&TARGET_IMPORT_STAR, &&TARGET_SETUP_ANNOTATIONS, - &&TARGET_YIELD_VALUE, + &&TARGET_LOAD_METHOD_NO_DICT, &&TARGET_ASYNC_GEN_WRAP, &&TARGET_PREP_RERAISE_STAR, &&TARGET_POP_EXCEPT, @@ -112,7 +112,7 @@ static void *opcode_targets[256] = { &&TARGET_JUMP_FORWARD, &&TARGET_JUMP_IF_FALSE_OR_POP, &&TARGET_JUMP_IF_TRUE_OR_POP, - &&TARGET_LOAD_METHOD_NO_DICT, + &&TARGET_LOAD_METHOD_WITH_DICT, &&TARGET_POP_JUMP_FORWARD_IF_FALSE, &&TARGET_POP_JUMP_FORWARD_IF_TRUE, &&TARGET_LOAD_GLOBAL, @@ -120,13 +120,13 @@ static void *opcode_targets[256] = { &&TARGET_CONTAINS_OP, &&TARGET_RERAISE, &&TARGET_COPY, - &&TARGET_LOAD_METHOD_WITH_DICT, + &&TARGET_LOAD_METHOD_WITH_VALUES, &&TARGET_BINARY_OP, &&TARGET_SEND, &&TARGET_LOAD_FAST, &&TARGET_STORE_FAST, &&TARGET_DELETE_FAST, - &&TARGET_LOAD_METHOD_WITH_VALUES, + &&TARGET_RESUME_QUICK, &&TARGET_POP_JUMP_FORWARD_IF_NOT_NONE, &&TARGET_POP_JUMP_FORWARD_IF_NONE, &&TARGET_RAISE_VARARGS, @@ -140,16 +140,16 @@ static void *opcode_targets[256] = { &&TARGET_STORE_DEREF, &&TARGET_DELETE_DEREF, &&TARGET_JUMP_BACKWARD, - &&TARGET_RESUME_QUICK, - &&TARGET_CALL_FUNCTION_EX, &&TARGET_STORE_ATTR_ADAPTIVE, + &&TARGET_CALL_FUNCTION_EX, + &&TARGET_STORE_ATTR_INSTANCE_VALUE, &&TARGET_EXTENDED_ARG, &&TARGET_LIST_APPEND, &&TARGET_SET_ADD, &&TARGET_MAP_ADD, &&TARGET_LOAD_CLASSDEREF, &&TARGET_COPY_FREE_VARS, - &&TARGET_STORE_ATTR_INSTANCE_VALUE, + &&TARGET_YIELD_VALUE, &&TARGET_RESUME, &&TARGET_MATCH_CLASS, &&TARGET_STORE_ATTR_SLOT, From webhook-mailer at python.org Thu May 19 12:51:18 2022 From: webhook-mailer at python.org (miss-islington) Date: Thu, 19 May 2022 16:51:18 -0000 Subject: [Python-checkins] gh-78630: Drop invalid HP aCC compiler switch -fPIC on HP-UX (GH-8847) Message-ID: https://github.com/python/cpython/commit/0f1748d66e3acfd897297218fa1d552e587f7467 commit: 0f1748d66e3acfd897297218fa1d552e587f7467 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-19T09:51:08-07:00 summary: gh-78630: Drop invalid HP aCC compiler switch -fPIC on HP-UX (GH-8847) At compile time, '+z' is already properly used with HP aCC, and shared libraries are correctly linked with '+b'. The '-fPIC' switch can safely be dropped. (cherry picked from commit 09be18a73d81aa82cc57a782f3b0a9811e43ad3b) Co-authored-by: Michael Osipov files: A Misc/NEWS.d/next/Build/2018-08-21-11-10-18.bpo-34449.Z3qm3c.rst M setup.py diff --git a/Misc/NEWS.d/next/Build/2018-08-21-11-10-18.bpo-34449.Z3qm3c.rst b/Misc/NEWS.d/next/Build/2018-08-21-11-10-18.bpo-34449.Z3qm3c.rst new file mode 100644 index 0000000000000..53b75aee9cc27 --- /dev/null +++ b/Misc/NEWS.d/next/Build/2018-08-21-11-10-18.bpo-34449.Z3qm3c.rst @@ -0,0 +1 @@ +Drop invalid compiler switch ``-fPIC`` for HP aCC on HP-UX. Patch by Michael Osipov. diff --git a/setup.py b/setup.py index f45cd6de33749..4c497346e8d7e 100644 --- a/setup.py +++ b/setup.py @@ -1408,9 +1408,6 @@ def detect_ctypes(self): # finding some -z option for the Sun compiler. extra_link_args.append('-mimpure-text') - elif HOST_PLATFORM.startswith('hp-ux'): - extra_link_args.append('-fPIC') - ext = Extension('_ctypes', include_dirs=include_dirs, extra_compile_args=extra_compile_args, From webhook-mailer at python.org Thu May 19 14:03:43 2022 From: webhook-mailer at python.org (ambv) Date: Thu, 19 May 2022 18:03:43 -0000 Subject: [Python-checkins] bpo-28249: fix `lineno` location for empty `DocTest` instances (GH-30498) (GH-92978) Message-ID: https://github.com/python/cpython/commit/57d7ddd6072ef8996f60ac06d6e2b2484692171b commit: 57d7ddd6072ef8996f60ac06d6e2b2484692171b branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: ambv date: 2022-05-19T20:03:06+02:00 summary: bpo-28249: fix `lineno` location for empty `DocTest` instances (GH-30498) (GH-92978) (cherry picked from commit 8db2b3b6878aba9f12844526bce966b7eed81aee) Co-authored-by: Kumar Aditya <59607654+kumaraditya303 at users.noreply.github.com> Co-authored-by: ?ukasz Langa Co-authored-by: Nikita Sobolev files: A Lib/test/doctest_lineno.py A Misc/NEWS.d/next/Library/2022-01-09-14-23-00.bpo-28249.4dzB80.rst M Lib/doctest.py M Lib/test/test_doctest.py diff --git a/Lib/doctest.py b/Lib/doctest.py index ed94d15c0e2da..b2ef2ce63672e 100644 --- a/Lib/doctest.py +++ b/Lib/doctest.py @@ -1085,19 +1085,21 @@ def _get_test(self, obj, name, module, globs, source_lines): def _find_lineno(self, obj, source_lines): """ - Return a line number of the given object's docstring. Note: - this method assumes that the object has a docstring. + Return a line number of the given object's docstring. + + Returns `None` if the given object does not have a docstring. """ lineno = None + docstring = getattr(obj, '__doc__', None) # Find the line number for modules. - if inspect.ismodule(obj): + if inspect.ismodule(obj) and docstring is not None: lineno = 0 # Find the line number for classes. # Note: this could be fooled if a class is defined multiple # times in a single file. - if inspect.isclass(obj): + if inspect.isclass(obj) and docstring is not None: if source_lines is None: return None pat = re.compile(r'^\s*class\s*%s\b' % @@ -1109,7 +1111,9 @@ def _find_lineno(self, obj, source_lines): # Find the line number for functions & methods. if inspect.ismethod(obj): obj = obj.__func__ - if inspect.isfunction(obj): obj = obj.__code__ + if inspect.isfunction(obj) and getattr(obj, '__doc__', None): + # We don't use `docstring` var here, because `obj` can be changed. + obj = obj.__code__ if inspect.istraceback(obj): obj = obj.tb_frame if inspect.isframe(obj): obj = obj.f_code if inspect.iscode(obj): diff --git a/Lib/test/doctest_lineno.py b/Lib/test/doctest_lineno.py new file mode 100644 index 0000000000000..be198513a1502 --- /dev/null +++ b/Lib/test/doctest_lineno.py @@ -0,0 +1,50 @@ +# This module is used in `test_doctest`. +# It must not have a docstring. + +def func_with_docstring(): + """Some unrelated info.""" + + +def func_without_docstring(): + pass + + +def func_with_doctest(): + """ + This function really contains a test case. + + >>> func_with_doctest.__name__ + 'func_with_doctest' + """ + return 3 + + +class ClassWithDocstring: + """Some unrelated class information.""" + + +class ClassWithoutDocstring: + pass + + +class ClassWithDoctest: + """This class really has a test case in it. + + >>> ClassWithDoctest.__name__ + 'ClassWithDoctest' + """ + + +class MethodWrapper: + def method_with_docstring(self): + """Method with a docstring.""" + + def method_without_docstring(self): + pass + + def method_with_doctest(self): + """ + This has a doctest! + >>> MethodWrapper.method_with_doctest.__name__ + 'method_with_doctest' + """ diff --git a/Lib/test/test_doctest.py b/Lib/test/test_doctest.py index 3e7f3782d89f4..a4aab6cf4db3b 100644 --- a/Lib/test/test_doctest.py +++ b/Lib/test/test_doctest.py @@ -25,6 +25,7 @@ # NOTE: There are some additional tests relating to interaction with # zipimport in the test_zipimport_support test module. +# There are also related tests in `test_doctest2` module. ###################################################################### ## Sample Objects (used by test cases) @@ -460,7 +461,7 @@ def basics(): r""" >>> tests = finder.find(sample_func) >>> print(tests) # doctest: +ELLIPSIS - [] + [] The exact name depends on how test_doctest was invoked, so allow for leading path components. @@ -642,6 +643,26 @@ def basics(): r""" 1 SampleClass.double 1 SampleClass.get +When used with `exclude_empty=False` we are also interested in line numbers +of doctests that are empty. +It used to be broken for quite some time until `bpo-28249`. + + >>> from test import doctest_lineno + >>> tests = doctest.DocTestFinder(exclude_empty=False).find(doctest_lineno) + >>> for t in tests: + ... print('%5s %s' % (t.lineno, t.name)) + None test.doctest_lineno + 22 test.doctest_lineno.ClassWithDocstring + 30 test.doctest_lineno.ClassWithDoctest + None test.doctest_lineno.ClassWithoutDocstring + None test.doctest_lineno.MethodWrapper + 39 test.doctest_lineno.MethodWrapper.method_with_docstring + 45 test.doctest_lineno.MethodWrapper.method_with_doctest + None test.doctest_lineno.MethodWrapper.method_without_docstring + 4 test.doctest_lineno.func_with_docstring + 12 test.doctest_lineno.func_with_doctest + None test.doctest_lineno.func_without_docstring + Turning off Recursion ~~~~~~~~~~~~~~~~~~~~~ DocTestFinder can be told not to look for tests in contained objects diff --git a/Misc/NEWS.d/next/Library/2022-01-09-14-23-00.bpo-28249.4dzB80.rst b/Misc/NEWS.d/next/Library/2022-01-09-14-23-00.bpo-28249.4dzB80.rst new file mode 100644 index 0000000000000..b5f1312d76866 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-01-09-14-23-00.bpo-28249.4dzB80.rst @@ -0,0 +1,2 @@ +Set :attr:`doctest.DocTest.lineno` to ``None`` when object does not have +:attr:`__doc__`. From webhook-mailer at python.org Thu May 19 15:17:12 2022 From: webhook-mailer at python.org (ambv) Date: Thu, 19 May 2022 19:17:12 -0000 Subject: [Python-checkins] [3.10] bpo-28249: fix `lineno` location for empty `DocTest` instances (GH-30498) (#92981) Message-ID: https://github.com/python/cpython/commit/c146525844b716e73386205ee8bed9268cc73fc8 commit: c146525844b716e73386205ee8bed9268cc73fc8 branch: 3.10 author: ?ukasz Langa committer: ambv date: 2022-05-19T21:16:57+02:00 summary: [3.10] bpo-28249: fix `lineno` location for empty `DocTest` instances (GH-30498) (#92981) (cherry picked from commit 8db2b3b6878aba9f12844526bce966b7eed81aee) Co-authored-by: Kumar Aditya <59607654+kumaraditya303 at users.noreply.github.com> Co-authored-by: ?ukasz Langa Co-authored-by: Nikita Sobolev files: A Lib/test/doctest_lineno.py A Misc/NEWS.d/next/Library/2022-01-09-14-23-00.bpo-28249.4dzB80.rst M Lib/doctest.py M Lib/test/test_doctest.py diff --git a/Lib/doctest.py b/Lib/doctest.py index 67cc34347bdf7..37b31cfbb2c97 100644 --- a/Lib/doctest.py +++ b/Lib/doctest.py @@ -1085,19 +1085,21 @@ def _get_test(self, obj, name, module, globs, source_lines): def _find_lineno(self, obj, source_lines): """ - Return a line number of the given object's docstring. Note: - this method assumes that the object has a docstring. + Return a line number of the given object's docstring. + + Returns `None` if the given object does not have a docstring. """ lineno = None + docstring = getattr(obj, '__doc__', None) # Find the line number for modules. - if inspect.ismodule(obj): + if inspect.ismodule(obj) and docstring is not None: lineno = 0 # Find the line number for classes. # Note: this could be fooled if a class is defined multiple # times in a single file. - if inspect.isclass(obj): + if inspect.isclass(obj) and docstring is not None: if source_lines is None: return None pat = re.compile(r'^\s*class\s*%s\b' % @@ -1109,7 +1111,9 @@ def _find_lineno(self, obj, source_lines): # Find the line number for functions & methods. if inspect.ismethod(obj): obj = obj.__func__ - if inspect.isfunction(obj): obj = obj.__code__ + if inspect.isfunction(obj) and getattr(obj, '__doc__', None): + # We don't use `docstring` var here, because `obj` can be changed. + obj = obj.__code__ if inspect.istraceback(obj): obj = obj.tb_frame if inspect.isframe(obj): obj = obj.f_code if inspect.iscode(obj): diff --git a/Lib/test/doctest_lineno.py b/Lib/test/doctest_lineno.py new file mode 100644 index 0000000000000..be198513a1502 --- /dev/null +++ b/Lib/test/doctest_lineno.py @@ -0,0 +1,50 @@ +# This module is used in `test_doctest`. +# It must not have a docstring. + +def func_with_docstring(): + """Some unrelated info.""" + + +def func_without_docstring(): + pass + + +def func_with_doctest(): + """ + This function really contains a test case. + + >>> func_with_doctest.__name__ + 'func_with_doctest' + """ + return 3 + + +class ClassWithDocstring: + """Some unrelated class information.""" + + +class ClassWithoutDocstring: + pass + + +class ClassWithDoctest: + """This class really has a test case in it. + + >>> ClassWithDoctest.__name__ + 'ClassWithDoctest' + """ + + +class MethodWrapper: + def method_with_docstring(self): + """Method with a docstring.""" + + def method_without_docstring(self): + pass + + def method_with_doctest(self): + """ + This has a doctest! + >>> MethodWrapper.method_with_doctest.__name__ + 'method_with_doctest' + """ diff --git a/Lib/test/test_doctest.py b/Lib/test/test_doctest.py index 1098a7b9f471f..ebd4ad91924cf 100644 --- a/Lib/test/test_doctest.py +++ b/Lib/test/test_doctest.py @@ -20,6 +20,7 @@ # NOTE: There are some additional tests relating to interaction with # zipimport in the test_zipimport_support test module. +# There are also related tests in `test_doctest2` module. ###################################################################### ## Sample Objects (used by test cases) @@ -455,7 +456,7 @@ def basics(): r""" >>> tests = finder.find(sample_func) >>> print(tests) # doctest: +ELLIPSIS - [] + [] The exact name depends on how test_doctest was invoked, so allow for leading path components. @@ -637,6 +638,26 @@ def basics(): r""" 1 SampleClass.double 1 SampleClass.get +When used with `exclude_empty=False` we are also interested in line numbers +of doctests that are empty. +It used to be broken for quite some time until `bpo-28249`. + + >>> from test import doctest_lineno + >>> tests = doctest.DocTestFinder(exclude_empty=False).find(doctest_lineno) + >>> for t in tests: + ... print('%5s %s' % (t.lineno, t.name)) + None test.doctest_lineno + 22 test.doctest_lineno.ClassWithDocstring + 30 test.doctest_lineno.ClassWithDoctest + None test.doctest_lineno.ClassWithoutDocstring + None test.doctest_lineno.MethodWrapper + 39 test.doctest_lineno.MethodWrapper.method_with_docstring + 45 test.doctest_lineno.MethodWrapper.method_with_doctest + None test.doctest_lineno.MethodWrapper.method_without_docstring + 4 test.doctest_lineno.func_with_docstring + 12 test.doctest_lineno.func_with_doctest + None test.doctest_lineno.func_without_docstring + Turning off Recursion ~~~~~~~~~~~~~~~~~~~~~ DocTestFinder can be told not to look for tests in contained objects diff --git a/Misc/NEWS.d/next/Library/2022-01-09-14-23-00.bpo-28249.4dzB80.rst b/Misc/NEWS.d/next/Library/2022-01-09-14-23-00.bpo-28249.4dzB80.rst new file mode 100644 index 0000000000000..b5f1312d76866 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-01-09-14-23-00.bpo-28249.4dzB80.rst @@ -0,0 +1,2 @@ +Set :attr:`doctest.DocTest.lineno` to ``None`` when object does not have +:attr:`__doc__`. From webhook-mailer at python.org Thu May 19 15:24:07 2022 From: webhook-mailer at python.org (zooba) Date: Thu, 19 May 2022 19:24:07 -0000 Subject: [Python-checkins] gh-92913: Clarify changes to PyInitConfig.module_search_paths[_set] fields (GH-92980) Message-ID: https://github.com/python/cpython/commit/403d16fa28764718dcd0536ccb3ab8d05768465d commit: 403d16fa28764718dcd0536ccb3ab8d05768465d branch: main author: Steve Dower committer: zooba date: 2022-05-19T20:23:53+01:00 summary: gh-92913: Clarify changes to PyInitConfig.module_search_paths[_set] fields (GH-92980) files: A Misc/NEWS.d/next/C API/2022-05-19-18-05-51.gh-issue-92913.Ass1Hv.rst M Doc/c-api/init_config.rst M Doc/whatsnew/3.11.rst M Lib/test/_test_embed_set_config.py M Modules/getpath.py diff --git a/Doc/c-api/init_config.rst b/Doc/c-api/init_config.rst index cc223a7fa4b94..d6a12375cd56f 100644 --- a/Doc/c-api/init_config.rst +++ b/Doc/c-api/init_config.rst @@ -1289,7 +1289,11 @@ Example setting the program name:: } More complete example modifying the default configuration, read the -configuration, and then override some parameters:: +configuration, and then override some parameters. Note that since +3.11, many parameters are not calculated until initialization, and +so values cannot be read from the configuration structure. Any values +set before initialize is called will be left unchanged by +initialization:: PyStatus init_python(const char *program_name) { @@ -1314,7 +1318,15 @@ configuration, and then override some parameters:: goto done; } - /* Append our custom search path to sys.path */ + /* Specify sys.path explicitly */ + /* To calculate the default and then modify, finish initialization and + then use PySys_GetObject("path") to get the list. */ + condig.module_search_paths_set = 1 + status = PyWideStringList_Append(&config.module_search_paths, + L"/path/to/stdlib"); + if (PyStatus_Exception(status)) { + goto done; + } status = PyWideStringList_Append(&config.module_search_paths, L"/path/to/more/modules"); if (PyStatus_Exception(status)) { @@ -1417,8 +1429,8 @@ It is possible to completely ignore the function calculating the default path configuration by setting explicitly all path configuration output fields listed above. A string is considered as set even if it is non-empty. ``module_search_paths`` is considered as set if -``module_search_paths_set`` is set to ``1``. In this case, path -configuration input fields are ignored as well. +``module_search_paths_set`` is set to ``1``. In this case, +``module_search_paths`` will be used without modification. Set :c:member:`~PyConfig.pathconfig_warnings` to ``0`` to suppress warnings when calculating the path configuration (Unix only, Windows does not log any warning). diff --git a/Doc/whatsnew/3.11.rst b/Doc/whatsnew/3.11.rst index 1fd5b35695ee3..1f88d2557aa3d 100644 --- a/Doc/whatsnew/3.11.rst +++ b/Doc/whatsnew/3.11.rst @@ -403,6 +403,11 @@ Other CPython Implementation Changes instead of prepending them. (Contributed by Bastian Neuburger in :issue:`44934`.) +* The :c:member:`PyConfig.module_search_paths_set` field must now be set to 1 for + initialization to use :c:member:`PyConfig.module_search_paths` to initialize + :data:`sys.path`. Otherwise, initialization will recalculate the path and replace + any values added to ``module_search_paths``. + New Modules =========== @@ -1861,6 +1866,16 @@ Porting to Python 3.11 * Distributors are encouraged to build Python with the optimized Blake2 library `libb2`_. +* The :c:member:`PyConfig.module_search_paths_set` field must now be set to 1 for + initialization to use :c:member:`PyConfig.module_search_paths` to initialize + :data:`sys.path`. Otherwise, initialization will recalculate the path and replace + any values added to ``module_search_paths``. + +* :c:func:`PyConfig_Read` no longer calculates the initial search path, and will not + fill any values into :c:member:`PyConfig.module_search_paths`. To calculate default + paths and then modify them, finish initialization and use :c:func:`PySys_GetObject` + to retrieve :data:`sys.path` as a Python list object and modify it directly. + Deprecated ---------- diff --git a/Lib/test/_test_embed_set_config.py b/Lib/test/_test_embed_set_config.py index e7b7106e17851..7ff641b37bf18 100644 --- a/Lib/test/_test_embed_set_config.py +++ b/Lib/test/_test_embed_set_config.py @@ -236,10 +236,11 @@ def test_path(self): module_search_paths=['a', 'b', 'c']) self.assertEqual(sys.path, ['a', 'b', 'c']) - # Leave sys.path unchanged if module_search_paths_set=0 + # sys.path is reset if module_search_paths_set=0 self.set_config(module_search_paths_set=0, module_search_paths=['new_path']) - self.assertEqual(sys.path, ['a', 'b', 'c']) + self.assertNotEqual(sys.path, ['a', 'b', 'c']) + self.assertNotEqual(sys.path, ['new_path']) def test_argv(self): self.set_config(parse_argv=0, diff --git a/Misc/NEWS.d/next/C API/2022-05-19-18-05-51.gh-issue-92913.Ass1Hv.rst b/Misc/NEWS.d/next/C API/2022-05-19-18-05-51.gh-issue-92913.Ass1Hv.rst new file mode 100644 index 0000000000000..c448c64029d82 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2022-05-19-18-05-51.gh-issue-92913.Ass1Hv.rst @@ -0,0 +1,2 @@ +Ensures changes to :c:member:`PyConfig.module_search_paths` are ignored +unless :c:member:`PyConfig.module_search_paths_set` is set diff --git a/Modules/getpath.py b/Modules/getpath.py index 9aff19c0af7ed..47f075caf5551 100644 --- a/Modules/getpath.py +++ b/Modules/getpath.py @@ -228,6 +228,7 @@ def search_up(prefix, *landmarks, test=isfile): use_environment = config.get('use_environment', 1) pythonpath = config.get('module_search_paths') +pythonpath_was_set = config.get('module_search_paths_set') real_executable_dir = None stdlib_dir = None @@ -626,8 +627,8 @@ def search_up(prefix, *landmarks, test=isfile): config['module_search_paths'] = py_setpath.split(DELIM) config['module_search_paths_set'] = 1 -elif not pythonpath: - # If pythonpath was already set, we leave it alone. +elif not pythonpath_was_set: + # If pythonpath was already explicitly set or calculated, we leave it alone. # This won't matter in normal use, but if an embedded host is trying to # recalculate paths while running then we do not want to change it. pythonpath = [] From webhook-mailer at python.org Thu May 19 16:13:45 2022 From: webhook-mailer at python.org (miss-islington) Date: Thu, 19 May 2022 20:13:45 -0000 Subject: [Python-checkins] gh-92913: Clarify changes to PyInitConfig.module_search_paths[_set] fields (GH-92980) Message-ID: https://github.com/python/cpython/commit/4eb2f407566eac722fb02e610f2327f9f0ed40c4 commit: 4eb2f407566eac722fb02e610f2327f9f0ed40c4 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-19T13:13:15-07:00 summary: gh-92913: Clarify changes to PyInitConfig.module_search_paths[_set] fields (GH-92980) (cherry picked from commit 403d16fa28764718dcd0536ccb3ab8d05768465d) Co-authored-by: Steve Dower files: A Misc/NEWS.d/next/C API/2022-05-19-18-05-51.gh-issue-92913.Ass1Hv.rst M Doc/c-api/init_config.rst M Doc/whatsnew/3.11.rst M Lib/test/_test_embed_set_config.py M Modules/getpath.py diff --git a/Doc/c-api/init_config.rst b/Doc/c-api/init_config.rst index cc223a7fa4b94..d6a12375cd56f 100644 --- a/Doc/c-api/init_config.rst +++ b/Doc/c-api/init_config.rst @@ -1289,7 +1289,11 @@ Example setting the program name:: } More complete example modifying the default configuration, read the -configuration, and then override some parameters:: +configuration, and then override some parameters. Note that since +3.11, many parameters are not calculated until initialization, and +so values cannot be read from the configuration structure. Any values +set before initialize is called will be left unchanged by +initialization:: PyStatus init_python(const char *program_name) { @@ -1314,7 +1318,15 @@ configuration, and then override some parameters:: goto done; } - /* Append our custom search path to sys.path */ + /* Specify sys.path explicitly */ + /* To calculate the default and then modify, finish initialization and + then use PySys_GetObject("path") to get the list. */ + condig.module_search_paths_set = 1 + status = PyWideStringList_Append(&config.module_search_paths, + L"/path/to/stdlib"); + if (PyStatus_Exception(status)) { + goto done; + } status = PyWideStringList_Append(&config.module_search_paths, L"/path/to/more/modules"); if (PyStatus_Exception(status)) { @@ -1417,8 +1429,8 @@ It is possible to completely ignore the function calculating the default path configuration by setting explicitly all path configuration output fields listed above. A string is considered as set even if it is non-empty. ``module_search_paths`` is considered as set if -``module_search_paths_set`` is set to ``1``. In this case, path -configuration input fields are ignored as well. +``module_search_paths_set`` is set to ``1``. In this case, +``module_search_paths`` will be used without modification. Set :c:member:`~PyConfig.pathconfig_warnings` to ``0`` to suppress warnings when calculating the path configuration (Unix only, Windows does not log any warning). diff --git a/Doc/whatsnew/3.11.rst b/Doc/whatsnew/3.11.rst index 1fd5b35695ee3..1f88d2557aa3d 100644 --- a/Doc/whatsnew/3.11.rst +++ b/Doc/whatsnew/3.11.rst @@ -403,6 +403,11 @@ Other CPython Implementation Changes instead of prepending them. (Contributed by Bastian Neuburger in :issue:`44934`.) +* The :c:member:`PyConfig.module_search_paths_set` field must now be set to 1 for + initialization to use :c:member:`PyConfig.module_search_paths` to initialize + :data:`sys.path`. Otherwise, initialization will recalculate the path and replace + any values added to ``module_search_paths``. + New Modules =========== @@ -1861,6 +1866,16 @@ Porting to Python 3.11 * Distributors are encouraged to build Python with the optimized Blake2 library `libb2`_. +* The :c:member:`PyConfig.module_search_paths_set` field must now be set to 1 for + initialization to use :c:member:`PyConfig.module_search_paths` to initialize + :data:`sys.path`. Otherwise, initialization will recalculate the path and replace + any values added to ``module_search_paths``. + +* :c:func:`PyConfig_Read` no longer calculates the initial search path, and will not + fill any values into :c:member:`PyConfig.module_search_paths`. To calculate default + paths and then modify them, finish initialization and use :c:func:`PySys_GetObject` + to retrieve :data:`sys.path` as a Python list object and modify it directly. + Deprecated ---------- diff --git a/Lib/test/_test_embed_set_config.py b/Lib/test/_test_embed_set_config.py index e7b7106e17851..7ff641b37bf18 100644 --- a/Lib/test/_test_embed_set_config.py +++ b/Lib/test/_test_embed_set_config.py @@ -236,10 +236,11 @@ def test_path(self): module_search_paths=['a', 'b', 'c']) self.assertEqual(sys.path, ['a', 'b', 'c']) - # Leave sys.path unchanged if module_search_paths_set=0 + # sys.path is reset if module_search_paths_set=0 self.set_config(module_search_paths_set=0, module_search_paths=['new_path']) - self.assertEqual(sys.path, ['a', 'b', 'c']) + self.assertNotEqual(sys.path, ['a', 'b', 'c']) + self.assertNotEqual(sys.path, ['new_path']) def test_argv(self): self.set_config(parse_argv=0, diff --git a/Misc/NEWS.d/next/C API/2022-05-19-18-05-51.gh-issue-92913.Ass1Hv.rst b/Misc/NEWS.d/next/C API/2022-05-19-18-05-51.gh-issue-92913.Ass1Hv.rst new file mode 100644 index 0000000000000..c448c64029d82 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2022-05-19-18-05-51.gh-issue-92913.Ass1Hv.rst @@ -0,0 +1,2 @@ +Ensures changes to :c:member:`PyConfig.module_search_paths` are ignored +unless :c:member:`PyConfig.module_search_paths_set` is set diff --git a/Modules/getpath.py b/Modules/getpath.py index 9aff19c0af7ed..47f075caf5551 100644 --- a/Modules/getpath.py +++ b/Modules/getpath.py @@ -228,6 +228,7 @@ def search_up(prefix, *landmarks, test=isfile): use_environment = config.get('use_environment', 1) pythonpath = config.get('module_search_paths') +pythonpath_was_set = config.get('module_search_paths_set') real_executable_dir = None stdlib_dir = None @@ -626,8 +627,8 @@ def search_up(prefix, *landmarks, test=isfile): config['module_search_paths'] = py_setpath.split(DELIM) config['module_search_paths_set'] = 1 -elif not pythonpath: - # If pythonpath was already set, we leave it alone. +elif not pythonpath_was_set: + # If pythonpath was already explicitly set or calculated, we leave it alone. # This won't matter in normal use, but if an embedded host is trying to # recalculate paths while running then we do not want to change it. pythonpath = [] From webhook-mailer at python.org Thu May 19 17:44:08 2022 From: webhook-mailer at python.org (zooba) Date: Thu, 19 May 2022 21:44:08 -0000 Subject: [Python-checkins] gh-92984: Explicitly disable incremental linking for Windows Release and PGO builds (GH-92985) Message-ID: https://github.com/python/cpython/commit/38feffa09c74d9a853745908b7813903bae33b96 commit: 38feffa09c74d9a853745908b7813903bae33b96 branch: main author: David Machaj <46852402+dmachaj at users.noreply.github.com> committer: zooba date: 2022-05-19T22:44:03+01:00 summary: gh-92984: Explicitly disable incremental linking for Windows Release and PGO builds (GH-92985) files: A Misc/NEWS.d/next/Windows/2022-05-19-14-01-30.gh-issue-92984.Dsxnlr.rst M PCbuild/pyproject.props diff --git a/Misc/NEWS.d/next/Windows/2022-05-19-14-01-30.gh-issue-92984.Dsxnlr.rst b/Misc/NEWS.d/next/Windows/2022-05-19-14-01-30.gh-issue-92984.Dsxnlr.rst new file mode 100644 index 0000000000000..2d3071b00b761 --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2022-05-19-14-01-30.gh-issue-92984.Dsxnlr.rst @@ -0,0 +1 @@ +Explicitly disable incremental linking for non-Debug builds diff --git a/PCbuild/pyproject.props b/PCbuild/pyproject.props index 8d24393aa1861..df3efc631d154 100644 --- a/PCbuild/pyproject.props +++ b/PCbuild/pyproject.props @@ -18,6 +18,7 @@ true false false + false From webhook-mailer at python.org Thu May 19 18:45:50 2022 From: webhook-mailer at python.org (zooba) Date: Thu, 19 May 2022 22:45:50 -0000 Subject: [Python-checkins] gh-92817: Fix precedence of options to py.exe launcher (GH-92988) Message-ID: https://github.com/python/cpython/commit/73473fdeac3ff9d75ac9d189bb8552b7459812f1 commit: 73473fdeac3ff9d75ac9d189bb8552b7459812f1 branch: main author: Steve Dower committer: zooba date: 2022-05-19T23:45:41+01:00 summary: gh-92817: Fix precedence of options to py.exe launcher (GH-92988) files: A Misc/NEWS.d/next/Windows/2022-05-19-21-44-25.gh-issue-92817.Jrf-Kv.rst M Lib/test/test_launcher.py M PC/launcher2.c diff --git a/Lib/test/test_launcher.py b/Lib/test/test_launcher.py index 2e10c55e339d5..aeacbbecbfa12 100644 --- a/Lib/test/test_launcher.py +++ b/Lib/test/test_launcher.py @@ -244,6 +244,17 @@ def script(self, content, encoding="utf-8"): finally: file.unlink() + @contextlib.contextmanager + def test_venv(self): + venv = Path.cwd() / "Scripts" + venv.mkdir(exist_ok=True, parents=True) + venv_exe = (venv / Path(sys.executable).name) + venv_exe.touch() + try: + yield venv_exe, {"VIRTUAL_ENV": str(venv.parent)} + finally: + shutil.rmtree(venv) + class TestLauncher(unittest.TestCase, RunPyMixin): @classmethod @@ -451,12 +462,8 @@ def test_py_default_in_list(self): self.assertEqual("PythonTestSuite/3.100", default) def test_virtualenv_in_list(self): - venv = Path.cwd() / "Scripts" - venv.mkdir(exist_ok=True, parents=True) - venv_exe = (venv / Path(sys.executable).name) - venv_exe.touch() - try: - data = self.run_py(["-0p"], env={"VIRTUAL_ENV": str(venv.parent)}) + with self.test_venv() as (venv_exe, env): + data = self.run_py(["-0p"], env=env) for line in data["stdout"].splitlines(): m = re.match(r"\s*\*\s+(.+)$", line) if m: @@ -465,7 +472,7 @@ def test_virtualenv_in_list(self): else: self.fail("did not find active venv path") - data = self.run_py(["-0"], env={"VIRTUAL_ENV": str(venv.parent)}) + data = self.run_py(["-0"], env=env) for line in data["stdout"].splitlines(): m = re.match(r"\s*\*\s+(.+)$", line) if m: @@ -473,8 +480,17 @@ def test_virtualenv_in_list(self): break else: self.fail("did not find active venv entry") - finally: - shutil.rmtree(venv) + + def test_virtualenv_with_env(self): + with self.test_venv() as (venv_exe, env): + data1 = self.run_py([], env={**env, "PY_PYTHON": "-3"}) + data2 = self.run_py(["-3"], env={**env, "PY_PYTHON": "-3"}) + # Compare stdout, because stderr goes via ascii + self.assertEqual(data1["stdout"].strip(), str(venv_exe)) + self.assertEqual(data1["SearchInfo.lowPriorityTag"], "True") + # Ensure passing the argument doesn't trigger the same behaviour + self.assertNotEqual(data2["stdout"].strip(), str(venv_exe)) + self.assertNotEqual(data2["SearchInfo.lowPriorityTag"], "True") def test_py_shebang(self): with self.py_ini(TEST_PY_COMMANDS): diff --git a/Misc/NEWS.d/next/Windows/2022-05-19-21-44-25.gh-issue-92817.Jrf-Kv.rst b/Misc/NEWS.d/next/Windows/2022-05-19-21-44-25.gh-issue-92817.Jrf-Kv.rst new file mode 100644 index 0000000000000..16acba1d6274c --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2022-05-19-21-44-25.gh-issue-92817.Jrf-Kv.rst @@ -0,0 +1,3 @@ +Ensures that :file:`py.exe` will prefer an active virtual environment over +default tags specified with environment variables or through a +:file:`py.ini` file. diff --git a/PC/launcher2.c b/PC/launcher2.c index 35c932aa329c8..763bc138ed71d 100644 --- a/PC/launcher2.c +++ b/PC/launcher2.c @@ -386,6 +386,12 @@ typedef struct { int tagLength; // if true, treats 'tag' as a non-PEP 514 filter bool oldStyleTag; + // if true, ignores 'tag' when a high priority environment is found + // gh-92817: This is currently set when a tag is read from configuration or + // the environment, rather than the command line or a shebang line, and the + // only currently possible high priority environment is an active virtual + // environment + bool lowPriorityTag; // if true, we had an old-style tag with '-64' suffix, and so do not // want to match tags like '3.x-32' bool exclude32Bit; @@ -475,6 +481,7 @@ dumpSearchInfo(SearchInfo *search) DEBUG_2(company, companyLength); DEBUG_2(tag, tagLength); DEBUG_BOOL(oldStyleTag); + DEBUG_BOOL(lowPriorityTag); DEBUG_BOOL(exclude32Bit); DEBUG_BOOL(only32Bit); DEBUG_BOOL(allowDefaults); @@ -965,6 +972,9 @@ checkDefaults(SearchInfo *search) if (!slash) { search->tag = tag; search->tagLength = n; + // gh-92817: allow a high priority env to be selected even if it + // doesn't match the tag + search->lowPriorityTag = true; } else { search->company = tag; search->companyLength = (int)(slash - tag); @@ -995,7 +1005,7 @@ typedef struct EnvironmentInfo { const wchar_t *executableArgs; const wchar_t *architecture; const wchar_t *displayName; - bool isActiveVenv; + bool highPriority; } EnvironmentInfo; @@ -1481,7 +1491,7 @@ virtualenvSearch(const SearchInfo *search, EnvironmentInfo **result) if (!env) { return RC_NO_MEMORY; } - env->isActiveVenv = true; + env->highPriority = true; env->internalSortKey = 20; exitCode = copyWstr(&env->displayName, L"Active venv"); if (exitCode) { @@ -1821,6 +1831,15 @@ _selectEnvironment(const SearchInfo *search, EnvironmentInfo *env, EnvironmentIn return 0; } + if (env->highPriority && search->lowPriorityTag) { + // This environment is marked high priority, and the search allows + // it to be selected even though a tag is specified, so select it + // gh-92817: this allows an active venv to be selected even when a + // default tag has been found in py.ini or the environment + *best = env; + return 0; + } + if (!search->oldStyleTag) { if (_companyMatches(search, env) && _tagMatches(search, env)) { // Because of how our sort tree is set up, we will walk up the From webhook-mailer at python.org Thu May 19 18:48:47 2022 From: webhook-mailer at python.org (miss-islington) Date: Thu, 19 May 2022 22:48:47 -0000 Subject: [Python-checkins] gh-92984: Explicitly disable incremental linking for Windows Release and PGO builds (GH-92985) Message-ID: https://github.com/python/cpython/commit/49526080eb448b750396caf90081ff846e36a36d commit: 49526080eb448b750396caf90081ff846e36a36d branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-19T15:48:42-07:00 summary: gh-92984: Explicitly disable incremental linking for Windows Release and PGO builds (GH-92985) (cherry picked from commit 38feffa09c74d9a853745908b7813903bae33b96) Co-authored-by: David Machaj <46852402+dmachaj at users.noreply.github.com> files: A Misc/NEWS.d/next/Windows/2022-05-19-14-01-30.gh-issue-92984.Dsxnlr.rst M PCbuild/pyproject.props diff --git a/Misc/NEWS.d/next/Windows/2022-05-19-14-01-30.gh-issue-92984.Dsxnlr.rst b/Misc/NEWS.d/next/Windows/2022-05-19-14-01-30.gh-issue-92984.Dsxnlr.rst new file mode 100644 index 0000000000000..2d3071b00b761 --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2022-05-19-14-01-30.gh-issue-92984.Dsxnlr.rst @@ -0,0 +1 @@ +Explicitly disable incremental linking for non-Debug builds diff --git a/PCbuild/pyproject.props b/PCbuild/pyproject.props index d492b71dfbaa3..5af68b27d4c10 100644 --- a/PCbuild/pyproject.props +++ b/PCbuild/pyproject.props @@ -18,6 +18,7 @@ true false false + false From webhook-mailer at python.org Thu May 19 18:52:32 2022 From: webhook-mailer at python.org (miss-islington) Date: Thu, 19 May 2022 22:52:32 -0000 Subject: [Python-checkins] gh-92984: Explicitly disable incremental linking for Windows Release and PGO builds (GH-92985) Message-ID: https://github.com/python/cpython/commit/76fe10a89adb484c3c41df894d69dd1cfdc0fb66 commit: 76fe10a89adb484c3c41df894d69dd1cfdc0fb66 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-19T15:52:22-07:00 summary: gh-92984: Explicitly disable incremental linking for Windows Release and PGO builds (GH-92985) (cherry picked from commit 38feffa09c74d9a853745908b7813903bae33b96) Co-authored-by: David Machaj <46852402+dmachaj at users.noreply.github.com> files: A Misc/NEWS.d/next/Windows/2022-05-19-14-01-30.gh-issue-92984.Dsxnlr.rst M PCbuild/pyproject.props diff --git a/Misc/NEWS.d/next/Windows/2022-05-19-14-01-30.gh-issue-92984.Dsxnlr.rst b/Misc/NEWS.d/next/Windows/2022-05-19-14-01-30.gh-issue-92984.Dsxnlr.rst new file mode 100644 index 0000000000000..2d3071b00b761 --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2022-05-19-14-01-30.gh-issue-92984.Dsxnlr.rst @@ -0,0 +1 @@ +Explicitly disable incremental linking for non-Debug builds diff --git a/PCbuild/pyproject.props b/PCbuild/pyproject.props index 8d24393aa1861..df3efc631d154 100644 --- a/PCbuild/pyproject.props +++ b/PCbuild/pyproject.props @@ -18,6 +18,7 @@ true false false + false From webhook-mailer at python.org Thu May 19 19:10:53 2022 From: webhook-mailer at python.org (miss-islington) Date: Thu, 19 May 2022 23:10:53 -0000 Subject: [Python-checkins] gh-92817: Fix precedence of options to py.exe launcher (GH-92988) Message-ID: https://github.com/python/cpython/commit/a2ec09b7f56578f40132ee69a39c34a3f3ec5ec5 commit: a2ec09b7f56578f40132ee69a39c34a3f3ec5ec5 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-19T16:10:38-07:00 summary: gh-92817: Fix precedence of options to py.exe launcher (GH-92988) (cherry picked from commit 73473fdeac3ff9d75ac9d189bb8552b7459812f1) Co-authored-by: Steve Dower files: A Misc/NEWS.d/next/Windows/2022-05-19-21-44-25.gh-issue-92817.Jrf-Kv.rst M Lib/test/test_launcher.py M PC/launcher2.c diff --git a/Lib/test/test_launcher.py b/Lib/test/test_launcher.py index 2e10c55e339d5..aeacbbecbfa12 100644 --- a/Lib/test/test_launcher.py +++ b/Lib/test/test_launcher.py @@ -244,6 +244,17 @@ def script(self, content, encoding="utf-8"): finally: file.unlink() + @contextlib.contextmanager + def test_venv(self): + venv = Path.cwd() / "Scripts" + venv.mkdir(exist_ok=True, parents=True) + venv_exe = (venv / Path(sys.executable).name) + venv_exe.touch() + try: + yield venv_exe, {"VIRTUAL_ENV": str(venv.parent)} + finally: + shutil.rmtree(venv) + class TestLauncher(unittest.TestCase, RunPyMixin): @classmethod @@ -451,12 +462,8 @@ def test_py_default_in_list(self): self.assertEqual("PythonTestSuite/3.100", default) def test_virtualenv_in_list(self): - venv = Path.cwd() / "Scripts" - venv.mkdir(exist_ok=True, parents=True) - venv_exe = (venv / Path(sys.executable).name) - venv_exe.touch() - try: - data = self.run_py(["-0p"], env={"VIRTUAL_ENV": str(venv.parent)}) + with self.test_venv() as (venv_exe, env): + data = self.run_py(["-0p"], env=env) for line in data["stdout"].splitlines(): m = re.match(r"\s*\*\s+(.+)$", line) if m: @@ -465,7 +472,7 @@ def test_virtualenv_in_list(self): else: self.fail("did not find active venv path") - data = self.run_py(["-0"], env={"VIRTUAL_ENV": str(venv.parent)}) + data = self.run_py(["-0"], env=env) for line in data["stdout"].splitlines(): m = re.match(r"\s*\*\s+(.+)$", line) if m: @@ -473,8 +480,17 @@ def test_virtualenv_in_list(self): break else: self.fail("did not find active venv entry") - finally: - shutil.rmtree(venv) + + def test_virtualenv_with_env(self): + with self.test_venv() as (venv_exe, env): + data1 = self.run_py([], env={**env, "PY_PYTHON": "-3"}) + data2 = self.run_py(["-3"], env={**env, "PY_PYTHON": "-3"}) + # Compare stdout, because stderr goes via ascii + self.assertEqual(data1["stdout"].strip(), str(venv_exe)) + self.assertEqual(data1["SearchInfo.lowPriorityTag"], "True") + # Ensure passing the argument doesn't trigger the same behaviour + self.assertNotEqual(data2["stdout"].strip(), str(venv_exe)) + self.assertNotEqual(data2["SearchInfo.lowPriorityTag"], "True") def test_py_shebang(self): with self.py_ini(TEST_PY_COMMANDS): diff --git a/Misc/NEWS.d/next/Windows/2022-05-19-21-44-25.gh-issue-92817.Jrf-Kv.rst b/Misc/NEWS.d/next/Windows/2022-05-19-21-44-25.gh-issue-92817.Jrf-Kv.rst new file mode 100644 index 0000000000000..16acba1d6274c --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2022-05-19-21-44-25.gh-issue-92817.Jrf-Kv.rst @@ -0,0 +1,3 @@ +Ensures that :file:`py.exe` will prefer an active virtual environment over +default tags specified with environment variables or through a +:file:`py.ini` file. diff --git a/PC/launcher2.c b/PC/launcher2.c index 35c932aa329c8..763bc138ed71d 100644 --- a/PC/launcher2.c +++ b/PC/launcher2.c @@ -386,6 +386,12 @@ typedef struct { int tagLength; // if true, treats 'tag' as a non-PEP 514 filter bool oldStyleTag; + // if true, ignores 'tag' when a high priority environment is found + // gh-92817: This is currently set when a tag is read from configuration or + // the environment, rather than the command line or a shebang line, and the + // only currently possible high priority environment is an active virtual + // environment + bool lowPriorityTag; // if true, we had an old-style tag with '-64' suffix, and so do not // want to match tags like '3.x-32' bool exclude32Bit; @@ -475,6 +481,7 @@ dumpSearchInfo(SearchInfo *search) DEBUG_2(company, companyLength); DEBUG_2(tag, tagLength); DEBUG_BOOL(oldStyleTag); + DEBUG_BOOL(lowPriorityTag); DEBUG_BOOL(exclude32Bit); DEBUG_BOOL(only32Bit); DEBUG_BOOL(allowDefaults); @@ -965,6 +972,9 @@ checkDefaults(SearchInfo *search) if (!slash) { search->tag = tag; search->tagLength = n; + // gh-92817: allow a high priority env to be selected even if it + // doesn't match the tag + search->lowPriorityTag = true; } else { search->company = tag; search->companyLength = (int)(slash - tag); @@ -995,7 +1005,7 @@ typedef struct EnvironmentInfo { const wchar_t *executableArgs; const wchar_t *architecture; const wchar_t *displayName; - bool isActiveVenv; + bool highPriority; } EnvironmentInfo; @@ -1481,7 +1491,7 @@ virtualenvSearch(const SearchInfo *search, EnvironmentInfo **result) if (!env) { return RC_NO_MEMORY; } - env->isActiveVenv = true; + env->highPriority = true; env->internalSortKey = 20; exitCode = copyWstr(&env->displayName, L"Active venv"); if (exitCode) { @@ -1821,6 +1831,15 @@ _selectEnvironment(const SearchInfo *search, EnvironmentInfo *env, EnvironmentIn return 0; } + if (env->highPriority && search->lowPriorityTag) { + // This environment is marked high priority, and the search allows + // it to be selected even though a tag is specified, so select it + // gh-92817: this allows an active venv to be selected even when a + // default tag has been found in py.ini or the environment + *best = env; + return 0; + } + if (!search->oldStyleTag) { if (_companyMatches(search, env) && _tagMatches(search, env)) { // Because of how our sort tree is set up, we will walk up the From webhook-mailer at python.org Fri May 20 01:07:16 2022 From: webhook-mailer at python.org (corona10) Date: Fri, 20 May 2022 05:07:16 -0000 Subject: [Python-checkins] Update globals-to-fix.tsv to follow recent changes (gh-92959) Message-ID: https://github.com/python/cpython/commit/909868db2aeff0f64b719ae94c840e001b898a7e commit: 909868db2aeff0f64b719ae94c840e001b898a7e branch: main author: Dong-hee Na committer: corona10 date: 2022-05-20T14:06:54+09:00 summary: Update globals-to-fix.tsv to follow recent changes (gh-92959) files: M Tools/c-analyzer/cpython/globals-to-fix.tsv diff --git a/Tools/c-analyzer/cpython/globals-to-fix.tsv b/Tools/c-analyzer/cpython/globals-to-fix.tsv index 7e939277f1e05..c92f64df1c5de 100644 --- a/Tools/c-analyzer/cpython/globals-to-fix.tsv +++ b/Tools/c-analyzer/cpython/globals-to-fix.tsv @@ -18,8 +18,8 @@ Objects/capsule.c - PyCapsule_Type - Objects/cellobject.c - PyCell_Type - Objects/classobject.c - PyInstanceMethod_Type - Objects/classobject.c - PyMethod_Type - -Objects/codeobject.c - LineIterator - -Objects/codeobject.c - PositionsIterator - +Objects/codeobject.c - _PyLineIterator - +Objects/codeobject.c - _PyPositionsIterator - Objects/codeobject.c - PyCode_Type - Objects/complexobject.c - PyComplex_Type - Objects/descrobject.c - PyClassMethodDescr_Type - @@ -51,6 +51,7 @@ Objects/frameobject.c - PyFrame_Type - Objects/funcobject.c - PyClassMethod_Type - Objects/funcobject.c - PyFunction_Type - Objects/funcobject.c - PyStaticMethod_Type - +Objects/genericaliasobject.c - _Py_GenericAliasIterType - Objects/genericaliasobject.c - Py_GenericAliasType - Objects/genobject.c - PyAsyncGen_Type - Objects/genobject.c - PyCoro_Type - @@ -68,7 +69,7 @@ Objects/listobject.c - PyListRevIter_Type - Objects/listobject.c - PyList_Type - Objects/longobject.c - Int_InfoType - Objects/longobject.c - PyLong_Type - -Objects/memoryobject.c - PyMemoryIter_Type - +Objects/memoryobject.c - _PyMemoryIter_Type - Objects/memoryobject.c - PyMemoryView_Type - Objects/memoryobject.c - _PyManagedBuffer_Type - Objects/methodobject.c - PyCFunction_Type - From webhook-mailer at python.org Fri May 20 04:18:30 2022 From: webhook-mailer at python.org (erlend-aasland) Date: Fri, 20 May 2022 08:18:30 -0000 Subject: [Python-checkins] Doc: Minor adjustment of `socket.create_server` docs (#26938) Message-ID: https://github.com/python/cpython/commit/a637c09a608cd779c9a7c3e60b886d9f520c58a6 commit: a637c09a608cd779c9a7c3e60b886d9f520c58a6 branch: main author: Pavel <69010336+pavel-lexyr at users.noreply.github.com> committer: erlend-aasland date: 2022-05-20T10:18:02+02:00 summary: Doc: Minor adjustment of `socket.create_server` docs (#26938) - fix spelling in create_server() docs - add a line about create_server() in the socket.py docstring files: M Doc/library/socket.rst M Lib/socket.py diff --git a/Doc/library/socket.rst b/Doc/library/socket.rst index 95cd37a415df1..2d25646134a3d 100755 --- a/Doc/library/socket.rst +++ b/Doc/library/socket.rst @@ -712,7 +712,7 @@ The following functions all create :ref:`socket objects `. .. function:: create_server(address, *, family=AF_INET, backlog=None, reuse_port=False, dualstack_ipv6=False) Convenience function which creates a TCP socket bound to *address* (a 2-tuple - ``(host, port)``) and return the socket object. + ``(host, port)``) and returns the socket object. *family* should be either :data:`AF_INET` or :data:`AF_INET6`. *backlog* is the queue size passed to :meth:`socket.listen`; when ``0`` diff --git a/Lib/socket.py b/Lib/socket.py index e08fb620eb1be..bfca763f72c82 100755 --- a/Lib/socket.py +++ b/Lib/socket.py @@ -28,6 +28,7 @@ socket.setdefaulttimeout() -- set the default timeout value create_connection() -- connects to an address, with an optional timeout and optional source address. +create_server() -- create a TCP socket and bind it to a specified address. [*] not available on all platforms! From webhook-mailer at python.org Fri May 20 04:19:43 2022 From: webhook-mailer at python.org (erlend-aasland) Date: Fri, 20 May 2022 08:19:43 -0000 Subject: [Python-checkins] Doc: add missing manpage and title references in tkinter docs (#29008) Message-ID: https://github.com/python/cpython/commit/0e12781ad9dec6e46ccb85969c0eb7be1ecad81d commit: 0e12781ad9dec6e46ccb85969c0eb7be1ecad81d branch: main author: Rafael Fontenelle committer: erlend-aasland date: 2022-05-20T10:19:37+02:00 summary: Doc: add missing manpage and title references in tkinter docs (#29008) - add bind(3tk) manpage markup - add Tcl/Tk book reference markup files: M Doc/library/tkinter.rst diff --git a/Doc/library/tkinter.rst b/Doc/library/tkinter.rst index 37b6a02a31710..096a343bd9558 100644 --- a/Doc/library/tkinter.rst +++ b/Doc/library/tkinter.rst @@ -877,8 +877,9 @@ of the bind method is:: where: sequence - is a string that denotes the target kind of event. (See the bind man page and - page 201 of John Ousterhout's book for details). + is a string that denotes the target kind of event. (See the + :manpage:`bind(3tk)` man page, and page 201 of John Ousterhout's book, + :title-reference:`Tcl and the Tk Toolkit (2nd edition)`, for details). func is a Python function, taking one argument, to be invoked when the event occurs. From webhook-mailer at python.org Fri May 20 04:34:25 2022 From: webhook-mailer at python.org (miss-islington) Date: Fri, 20 May 2022 08:34:25 -0000 Subject: [Python-checkins] Doc: add missing manpage and title references in tkinter docs (GH-29008) Message-ID: https://github.com/python/cpython/commit/6814ab790781460777d7c98cc2eafcee46b748d6 commit: 6814ab790781460777d7c98cc2eafcee46b748d6 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-20T01:34:21-07:00 summary: Doc: add missing manpage and title references in tkinter docs (GH-29008) - add bind(3tk) manpage markup - add Tcl/Tk book reference markup (cherry picked from commit 0e12781ad9dec6e46ccb85969c0eb7be1ecad81d) Co-authored-by: Rafael Fontenelle files: M Doc/library/tkinter.rst diff --git a/Doc/library/tkinter.rst b/Doc/library/tkinter.rst index 37b6a02a31710..096a343bd9558 100644 --- a/Doc/library/tkinter.rst +++ b/Doc/library/tkinter.rst @@ -877,8 +877,9 @@ of the bind method is:: where: sequence - is a string that denotes the target kind of event. (See the bind man page and - page 201 of John Ousterhout's book for details). + is a string that denotes the target kind of event. (See the + :manpage:`bind(3tk)` man page, and page 201 of John Ousterhout's book, + :title-reference:`Tcl and the Tk Toolkit (2nd edition)`, for details). func is a Python function, taking one argument, to be invoked when the event occurs. From webhook-mailer at python.org Fri May 20 04:53:18 2022 From: webhook-mailer at python.org (serhiy-storchaka) Date: Fri, 20 May 2022 08:53:18 -0000 Subject: [Python-checkins] gh-91922: Fix sqlite connection on nonstardard locales and paths (GH-92926) Message-ID: https://github.com/python/cpython/commit/d8537580921b2e02f477ff1a8dedcf82c24ef0c2 commit: d8537580921b2e02f477ff1a8dedcf82c24ef0c2 branch: main author: Serhiy Storchaka committer: serhiy-storchaka date: 2022-05-20T11:53:05+03:00 summary: gh-91922: Fix sqlite connection on nonstardard locales and paths (GH-92926) files: A Misc/NEWS.d/next/Library/2022-05-18-17-18-41.gh-issue-91922.DwWIsJ.rst M Lib/test/test_sqlite3/test_dbapi.py M Modules/_sqlite/clinic/connection.c.h M Modules/_sqlite/connection.c diff --git a/Lib/test/test_sqlite3/test_dbapi.py b/Lib/test/test_sqlite3/test_dbapi.py index 8a218973794db..40f91a193b2cd 100644 --- a/Lib/test/test_sqlite3/test_dbapi.py +++ b/Lib/test/test_sqlite3/test_dbapi.py @@ -21,21 +21,19 @@ # 3. This notice may not be removed or altered from any source distribution. import contextlib +import os import sqlite3 as sqlite import subprocess import sys import threading import unittest +import urllib.parse -from test.support import ( - SHORT_TIMEOUT, - bigmemtest, - check_disallow_instantiation, - threading_helper, -) +from test.support import SHORT_TIMEOUT, bigmemtest, check_disallow_instantiation +from test.support import threading_helper from _testcapi import INT_MAX, ULLONG_MAX from os import SEEK_SET, SEEK_CUR, SEEK_END -from test.support.os_helper import TESTFN, unlink, temp_dir +from test.support.os_helper import TESTFN, TESTFN_UNDECODABLE, unlink, temp_dir, FakePath # Helper for tests using TESTFN @@ -654,11 +652,19 @@ class OpenTests(unittest.TestCase): def test_open_with_path_like_object(self): """ Checks that we can successfully connect to a database using an object that is PathLike, i.e. has __fspath__(). """ - class Path: - def __fspath__(self): - return TESTFN - path = Path() + path = FakePath(TESTFN) with managed_connect(path) as cx: + self.assertTrue(os.path.exists(path)) + cx.execute(self._sql) + + @unittest.skipIf(sys.platform == "win32", "skipped on Windows") + @unittest.skipIf(sys.platform == "darwin", "skipped on macOS") + @unittest.skipUnless(TESTFN_UNDECODABLE, "only works if there are undecodable paths") + def test_open_with_undecodable_path(self): + self.addCleanup(unlink, TESTFN_UNDECODABLE) + path = TESTFN_UNDECODABLE + with managed_connect(path) as cx: + self.assertTrue(os.path.exists(path)) cx.execute(self._sql) def test_open_uri(self): diff --git a/Misc/NEWS.d/next/Library/2022-05-18-17-18-41.gh-issue-91922.DwWIsJ.rst b/Misc/NEWS.d/next/Library/2022-05-18-17-18-41.gh-issue-91922.DwWIsJ.rst new file mode 100644 index 0000000000000..30f7bba115606 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-05-18-17-18-41.gh-issue-91922.DwWIsJ.rst @@ -0,0 +1,3 @@ +Fix function :func:`sqlite.connect` and the :class:`sqlite.Connection` +constructor on non-UTF-8 locales. Also, they now support bytes paths +non-decodable with the current FS encoding. diff --git a/Modules/_sqlite/clinic/connection.c.h b/Modules/_sqlite/clinic/connection.c.h index 1e27c5e0afb12..dd86fb5b64f3f 100644 --- a/Modules/_sqlite/clinic/connection.c.h +++ b/Modules/_sqlite/clinic/connection.c.h @@ -3,9 +3,9 @@ preserve [clinic start generated code]*/ static int -pysqlite_connection_init_impl(pysqlite_Connection *self, - const char *database, double timeout, - int detect_types, const char *isolation_level, +pysqlite_connection_init_impl(pysqlite_Connection *self, PyObject *database, + double timeout, int detect_types, + const char *isolation_level, int check_same_thread, PyObject *factory, int cache_size, int uri); @@ -19,7 +19,7 @@ pysqlite_connection_init(PyObject *self, PyObject *args, PyObject *kwargs) PyObject * const *fastargs; Py_ssize_t nargs = PyTuple_GET_SIZE(args); Py_ssize_t noptargs = nargs + (kwargs ? PyDict_GET_SIZE(kwargs) : 0) - 1; - const char *database = NULL; + PyObject *database; double timeout = 5.0; int detect_types = 0; const char *isolation_level = ""; @@ -32,9 +32,7 @@ pysqlite_connection_init(PyObject *self, PyObject *args, PyObject *kwargs) if (!fastargs) { goto exit; } - if (!clinic_fsconverter(fastargs[0], &database)) { - goto exit; - } + database = fastargs[0]; if (!noptargs) { goto skip_optional_pos; } @@ -102,9 +100,6 @@ pysqlite_connection_init(PyObject *self, PyObject *args, PyObject *kwargs) return_value = pysqlite_connection_init_impl((pysqlite_Connection *)self, database, timeout, detect_types, isolation_level, check_same_thread, factory, cache_size, uri); exit: - /* Cleanup for database */ - PyMem_Free((void *)database); - return return_value; } @@ -1236,4 +1231,4 @@ getlimit(pysqlite_Connection *self, PyObject *arg) #ifndef DESERIALIZE_METHODDEF #define DESERIALIZE_METHODDEF #endif /* !defined(DESERIALIZE_METHODDEF) */ -/*[clinic end generated code: output=d21767843c480a10 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=fb8908674e9f25ff input=a9049054013a1b77]*/ diff --git a/Modules/_sqlite/connection.c b/Modules/_sqlite/connection.c index 333847f0fafb9..7f7de8e709228 100644 --- a/Modules/_sqlite/connection.c +++ b/Modules/_sqlite/connection.c @@ -92,32 +92,6 @@ isolation_level_converter(PyObject *str_or_none, const char **result) return 1; } -static int -clinic_fsconverter(PyObject *pathlike, const char **result) -{ - PyObject *bytes = NULL; - Py_ssize_t len; - char *str; - - if (!PyUnicode_FSConverter(pathlike, &bytes)) { - goto error; - } - if (PyBytes_AsStringAndSize(bytes, &str, &len) < 0) { - goto error; - } - if ((*result = (const char *)PyMem_Malloc(len+1)) == NULL) { - goto error; - } - - memcpy((void *)(*result), str, len+1); - Py_DECREF(bytes); - return 1; - -error: - Py_XDECREF(bytes); - return 0; -} - #define clinic_state() (pysqlite_get_state_by_type(Py_TYPE(self))) #include "clinic/connection.c.h" #undef clinic_state @@ -159,25 +133,17 @@ new_statement_cache(pysqlite_Connection *self, pysqlite_state *state, } /*[python input] -class FSConverter_converter(CConverter): - type = "const char *" - converter = "clinic_fsconverter" - def converter_init(self): - self.c_default = "NULL" - def cleanup(self): - return f"PyMem_Free((void *){self.name});\n" - class IsolationLevel_converter(CConverter): type = "const char *" converter = "isolation_level_converter" [python start generated code]*/ -/*[python end generated code: output=da39a3ee5e6b4b0d input=be142323885672ab]*/ +/*[python end generated code: output=da39a3ee5e6b4b0d input=cbcfe85b253061c2]*/ /*[clinic input] _sqlite3.Connection.__init__ as pysqlite_connection_init - database: FSConverter + database: object timeout: double = 5.0 detect_types: int = 0 isolation_level: IsolationLevel = "" @@ -188,14 +154,19 @@ _sqlite3.Connection.__init__ as pysqlite_connection_init [clinic start generated code]*/ static int -pysqlite_connection_init_impl(pysqlite_Connection *self, - const char *database, double timeout, - int detect_types, const char *isolation_level, +pysqlite_connection_init_impl(pysqlite_Connection *self, PyObject *database, + double timeout, int detect_types, + const char *isolation_level, int check_same_thread, PyObject *factory, int cache_size, int uri) -/*[clinic end generated code: output=7d640ae1d83abfd4 input=342173993434ba1e]*/ +/*[clinic end generated code: output=839eb2fee4293bda input=b8ce63dc6f70a383]*/ { - if (PySys_Audit("sqlite3.connect", "s", database) < 0) { + if (PySys_Audit("sqlite3.connect", "O", database) < 0) { + return -1; + } + + PyObject *bytes; + if (!PyUnicode_FSConverter(database, &bytes)) { return -1; } @@ -210,7 +181,7 @@ pysqlite_connection_init_impl(pysqlite_Connection *self, sqlite3 *db; int rc; Py_BEGIN_ALLOW_THREADS - rc = sqlite3_open_v2(database, &db, + rc = sqlite3_open_v2(PyBytes_AS_STRING(bytes), &db, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | (uri ? SQLITE_OPEN_URI : 0), NULL); if (rc == SQLITE_OK) { @@ -218,6 +189,7 @@ pysqlite_connection_init_impl(pysqlite_Connection *self, } Py_END_ALLOW_THREADS + Py_DECREF(bytes); if (db == NULL && rc == SQLITE_NOMEM) { PyErr_NoMemory(); return -1; From webhook-mailer at python.org Fri May 20 05:21:54 2022 From: webhook-mailer at python.org (miss-islington) Date: Fri, 20 May 2022 09:21:54 -0000 Subject: [Python-checkins] Doc: add missing manpage and title references in tkinter docs (GH-29008) Message-ID: https://github.com/python/cpython/commit/4d363d8989bf79f091bf674701e6066908af788d commit: 4d363d8989bf79f091bf674701e6066908af788d branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-20T02:21:29-07:00 summary: Doc: add missing manpage and title references in tkinter docs (GH-29008) - add bind(3tk) manpage markup - add Tcl/Tk book reference markup (cherry picked from commit 0e12781ad9dec6e46ccb85969c0eb7be1ecad81d) Co-authored-by: Rafael Fontenelle files: M Doc/library/tkinter.rst diff --git a/Doc/library/tkinter.rst b/Doc/library/tkinter.rst index 37b6a02a31710..096a343bd9558 100644 --- a/Doc/library/tkinter.rst +++ b/Doc/library/tkinter.rst @@ -877,8 +877,9 @@ of the bind method is:: where: sequence - is a string that denotes the target kind of event. (See the bind man page and - page 201 of John Ousterhout's book for details). + is a string that denotes the target kind of event. (See the + :manpage:`bind(3tk)` man page, and page 201 of John Ousterhout's book, + :title-reference:`Tcl and the Tk Toolkit (2nd edition)`, for details). func is a Python function, taking one argument, to be invoked when the event occurs. From webhook-mailer at python.org Fri May 20 05:42:52 2022 From: webhook-mailer at python.org (miss-islington) Date: Fri, 20 May 2022 09:42:52 -0000 Subject: [Python-checkins] gh-91922: Fix sqlite connection on nonstardard locales and paths (GH-92926) Message-ID: https://github.com/python/cpython/commit/6ec050f6337d2227475594be0706b3cda26c3f0d commit: 6ec050f6337d2227475594be0706b3cda26c3f0d branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-20T02:42:48-07:00 summary: gh-91922: Fix sqlite connection on nonstardard locales and paths (GH-92926) (cherry picked from commit d8537580921b2e02f477ff1a8dedcf82c24ef0c2) Co-authored-by: Serhiy Storchaka files: A Misc/NEWS.d/next/Library/2022-05-18-17-18-41.gh-issue-91922.DwWIsJ.rst M Lib/test/test_sqlite3/test_dbapi.py M Modules/_sqlite/clinic/connection.c.h M Modules/_sqlite/connection.c diff --git a/Lib/test/test_sqlite3/test_dbapi.py b/Lib/test/test_sqlite3/test_dbapi.py index e132fcdfb0e65..eaba39186e9a7 100644 --- a/Lib/test/test_sqlite3/test_dbapi.py +++ b/Lib/test/test_sqlite3/test_dbapi.py @@ -21,21 +21,19 @@ # 3. This notice may not be removed or altered from any source distribution. import contextlib +import os import sqlite3 as sqlite import subprocess import sys import threading import unittest +import urllib.parse -from test.support import ( - SHORT_TIMEOUT, - bigmemtest, - check_disallow_instantiation, - threading_helper, -) +from test.support import SHORT_TIMEOUT, bigmemtest, check_disallow_instantiation +from test.support import threading_helper from _testcapi import INT_MAX, ULLONG_MAX from os import SEEK_SET, SEEK_CUR, SEEK_END -from test.support.os_helper import TESTFN, unlink, temp_dir +from test.support.os_helper import TESTFN, TESTFN_UNDECODABLE, unlink, temp_dir, FakePath # Helper for tests using TESTFN @@ -663,11 +661,19 @@ class OpenTests(unittest.TestCase): def test_open_with_path_like_object(self): """ Checks that we can successfully connect to a database using an object that is PathLike, i.e. has __fspath__(). """ - class Path: - def __fspath__(self): - return TESTFN - path = Path() + path = FakePath(TESTFN) with managed_connect(path) as cx: + self.assertTrue(os.path.exists(path)) + cx.execute(self._sql) + + @unittest.skipIf(sys.platform == "win32", "skipped on Windows") + @unittest.skipIf(sys.platform == "darwin", "skipped on macOS") + @unittest.skipUnless(TESTFN_UNDECODABLE, "only works if there are undecodable paths") + def test_open_with_undecodable_path(self): + self.addCleanup(unlink, TESTFN_UNDECODABLE) + path = TESTFN_UNDECODABLE + with managed_connect(path) as cx: + self.assertTrue(os.path.exists(path)) cx.execute(self._sql) def test_open_uri(self): diff --git a/Misc/NEWS.d/next/Library/2022-05-18-17-18-41.gh-issue-91922.DwWIsJ.rst b/Misc/NEWS.d/next/Library/2022-05-18-17-18-41.gh-issue-91922.DwWIsJ.rst new file mode 100644 index 0000000000000..30f7bba115606 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-05-18-17-18-41.gh-issue-91922.DwWIsJ.rst @@ -0,0 +1,3 @@ +Fix function :func:`sqlite.connect` and the :class:`sqlite.Connection` +constructor on non-UTF-8 locales. Also, they now support bytes paths +non-decodable with the current FS encoding. diff --git a/Modules/_sqlite/clinic/connection.c.h b/Modules/_sqlite/clinic/connection.c.h index 1e27c5e0afb12..dd86fb5b64f3f 100644 --- a/Modules/_sqlite/clinic/connection.c.h +++ b/Modules/_sqlite/clinic/connection.c.h @@ -3,9 +3,9 @@ preserve [clinic start generated code]*/ static int -pysqlite_connection_init_impl(pysqlite_Connection *self, - const char *database, double timeout, - int detect_types, const char *isolation_level, +pysqlite_connection_init_impl(pysqlite_Connection *self, PyObject *database, + double timeout, int detect_types, + const char *isolation_level, int check_same_thread, PyObject *factory, int cache_size, int uri); @@ -19,7 +19,7 @@ pysqlite_connection_init(PyObject *self, PyObject *args, PyObject *kwargs) PyObject * const *fastargs; Py_ssize_t nargs = PyTuple_GET_SIZE(args); Py_ssize_t noptargs = nargs + (kwargs ? PyDict_GET_SIZE(kwargs) : 0) - 1; - const char *database = NULL; + PyObject *database; double timeout = 5.0; int detect_types = 0; const char *isolation_level = ""; @@ -32,9 +32,7 @@ pysqlite_connection_init(PyObject *self, PyObject *args, PyObject *kwargs) if (!fastargs) { goto exit; } - if (!clinic_fsconverter(fastargs[0], &database)) { - goto exit; - } + database = fastargs[0]; if (!noptargs) { goto skip_optional_pos; } @@ -102,9 +100,6 @@ pysqlite_connection_init(PyObject *self, PyObject *args, PyObject *kwargs) return_value = pysqlite_connection_init_impl((pysqlite_Connection *)self, database, timeout, detect_types, isolation_level, check_same_thread, factory, cache_size, uri); exit: - /* Cleanup for database */ - PyMem_Free((void *)database); - return return_value; } @@ -1236,4 +1231,4 @@ getlimit(pysqlite_Connection *self, PyObject *arg) #ifndef DESERIALIZE_METHODDEF #define DESERIALIZE_METHODDEF #endif /* !defined(DESERIALIZE_METHODDEF) */ -/*[clinic end generated code: output=d21767843c480a10 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=fb8908674e9f25ff input=a9049054013a1b77]*/ diff --git a/Modules/_sqlite/connection.c b/Modules/_sqlite/connection.c index 333847f0fafb9..7f7de8e709228 100644 --- a/Modules/_sqlite/connection.c +++ b/Modules/_sqlite/connection.c @@ -92,32 +92,6 @@ isolation_level_converter(PyObject *str_or_none, const char **result) return 1; } -static int -clinic_fsconverter(PyObject *pathlike, const char **result) -{ - PyObject *bytes = NULL; - Py_ssize_t len; - char *str; - - if (!PyUnicode_FSConverter(pathlike, &bytes)) { - goto error; - } - if (PyBytes_AsStringAndSize(bytes, &str, &len) < 0) { - goto error; - } - if ((*result = (const char *)PyMem_Malloc(len+1)) == NULL) { - goto error; - } - - memcpy((void *)(*result), str, len+1); - Py_DECREF(bytes); - return 1; - -error: - Py_XDECREF(bytes); - return 0; -} - #define clinic_state() (pysqlite_get_state_by_type(Py_TYPE(self))) #include "clinic/connection.c.h" #undef clinic_state @@ -159,25 +133,17 @@ new_statement_cache(pysqlite_Connection *self, pysqlite_state *state, } /*[python input] -class FSConverter_converter(CConverter): - type = "const char *" - converter = "clinic_fsconverter" - def converter_init(self): - self.c_default = "NULL" - def cleanup(self): - return f"PyMem_Free((void *){self.name});\n" - class IsolationLevel_converter(CConverter): type = "const char *" converter = "isolation_level_converter" [python start generated code]*/ -/*[python end generated code: output=da39a3ee5e6b4b0d input=be142323885672ab]*/ +/*[python end generated code: output=da39a3ee5e6b4b0d input=cbcfe85b253061c2]*/ /*[clinic input] _sqlite3.Connection.__init__ as pysqlite_connection_init - database: FSConverter + database: object timeout: double = 5.0 detect_types: int = 0 isolation_level: IsolationLevel = "" @@ -188,14 +154,19 @@ _sqlite3.Connection.__init__ as pysqlite_connection_init [clinic start generated code]*/ static int -pysqlite_connection_init_impl(pysqlite_Connection *self, - const char *database, double timeout, - int detect_types, const char *isolation_level, +pysqlite_connection_init_impl(pysqlite_Connection *self, PyObject *database, + double timeout, int detect_types, + const char *isolation_level, int check_same_thread, PyObject *factory, int cache_size, int uri) -/*[clinic end generated code: output=7d640ae1d83abfd4 input=342173993434ba1e]*/ +/*[clinic end generated code: output=839eb2fee4293bda input=b8ce63dc6f70a383]*/ { - if (PySys_Audit("sqlite3.connect", "s", database) < 0) { + if (PySys_Audit("sqlite3.connect", "O", database) < 0) { + return -1; + } + + PyObject *bytes; + if (!PyUnicode_FSConverter(database, &bytes)) { return -1; } @@ -210,7 +181,7 @@ pysqlite_connection_init_impl(pysqlite_Connection *self, sqlite3 *db; int rc; Py_BEGIN_ALLOW_THREADS - rc = sqlite3_open_v2(database, &db, + rc = sqlite3_open_v2(PyBytes_AS_STRING(bytes), &db, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | (uri ? SQLITE_OPEN_URI : 0), NULL); if (rc == SQLITE_OK) { @@ -218,6 +189,7 @@ pysqlite_connection_init_impl(pysqlite_Connection *self, } Py_END_ALLOW_THREADS + Py_DECREF(bytes); if (db == NULL && rc == SQLITE_NOMEM) { PyErr_NoMemory(); return -1; From webhook-mailer at python.org Fri May 20 10:32:40 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Fri, 20 May 2022 14:32:40 -0000 Subject: [Python-checkins] gh-91860: documentation for typing.dataclass_transform (#92768) Message-ID: https://github.com/python/cpython/commit/f20a6a54fb041507a334ad71706974960d1b473f commit: f20a6a54fb041507a334ad71706974960d1b473f branch: main author: Shantanu <12621235+hauntsaninja at users.noreply.github.com> committer: JelleZijlstra date: 2022-05-20T07:32:29-07:00 summary: gh-91860: documentation for typing.dataclass_transform (#92768) Co-authored-by: Alex Waygood files: M Doc/library/typing.rst M Doc/whatsnew/3.11.rst M Lib/typing.py diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index 29bcedaddce9d..7ddc84ac5e451 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -2429,6 +2429,75 @@ Functions and decorators .. versionadded:: 3.11 +.. decorator:: dataclass_transform + + :data:`~typing.dataclass_transform` may be used to + decorate a class, metaclass, or a function that is itself a decorator. + The presence of ``@dataclass_transform()`` tells a static type checker that the + decorated object performs runtime "magic" that + transforms a class, giving it :func:`dataclasses.dataclass`-like behaviors. + + Example usage with a decorator function:: + + T = TypeVar("T") + + @dataclass_transform() + def create_model(cls: type[T]) -> type[T]: + ... + return cls + + @create_model + class CustomerModel: + id: int + name: str + + On a base class:: + + @dataclass_transform() + class ModelBase: ... + + class CustomerModel(ModelBase): + id: int + name: str + + On a metaclass:: + + @dataclass_transform() + class ModelMeta(type): ... + + class ModelBase(metaclass=ModelMeta): ... + + class CustomerModel(ModelBase): + id: int + name: str + + The ``CustomerModel`` classes defined above will + be treated by type checkers similarly to classes created with + :func:`@dataclasses.dataclass `. + For example, type checkers will assume these classes have + ``__init__`` methods that accept ``id`` and ``name``. + + The arguments to this decorator can be used to customize this behavior: + + * ``eq_default`` indicates whether the ``eq`` parameter is assumed to be + ``True`` or ``False`` if it is omitted by the caller. + * ``order_default`` indicates whether the ``order`` parameter is + assumed to be True or False if it is omitted by the caller. + * ``kw_only_default`` indicates whether the ``kw_only`` parameter is + assumed to be True or False if it is omitted by the caller. + * ``field_specifiers`` specifies a static list of supported classes + or functions that describe fields, similar to ``dataclasses.field()``. + * Arbitrary other keyword arguments are accepted in order to allow for + possible future extensions. + + At runtime, this decorator records its arguments in the + ``__dataclass_transform__`` attribute on the decorated object. + It has no other runtime effect. + + See :pep:`681` for more details. + + .. versionadded:: 3.11 + .. decorator:: overload The ``@overload`` decorator allows describing functions and methods diff --git a/Doc/whatsnew/3.11.rst b/Doc/whatsnew/3.11.rst index 1f88d2557aa3d..ff94e45f77c70 100644 --- a/Doc/whatsnew/3.11.rst +++ b/Doc/whatsnew/3.11.rst @@ -306,17 +306,17 @@ Kumar Srinivasan and Graham Bleaney.) PEP 681: Data Class Transforms ------------------------------ -The new :data:`~typing.dataclass_transform` annotation may be used to -decorate a function that is itself a decorator, a class, or a metaclass. +:data:`~typing.dataclass_transform` may be used to +decorate a class, metaclass, or a function that is itself a decorator. The presence of ``@dataclass_transform()`` tells a static type checker that the -decorated function, class, or metaclass performs runtime "magic" that -transforms a class, endowing it with dataclass-like behaviors. +decorated object performs runtime "magic" that +transforms a class, giving it :func:`dataclasses.dataclass`-like behaviors. For example:: # The ``create_model`` decorator is defined by a library. @typing.dataclass_transform() - def create_model(cls: Type[_T]) -> Type[_T]: + def create_model(cls: Type[T]) -> Type[T]: cls.__init__ = ... cls.__eq__ = ... cls.__ne__ = ... diff --git a/Lib/typing.py b/Lib/typing.py index 306bb9fb6df78..40ab516f7c8ff 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -3368,10 +3368,10 @@ def dataclass_transform( Example usage with a decorator function: - _T = TypeVar("_T") + T = TypeVar("T") @dataclass_transform() - def create_model(cls: type[_T]) -> type[_T]: + def create_model(cls: type[T]) -> type[T]: ... return cls @@ -3400,20 +3400,23 @@ class CustomerModel(ModelBase): id: int name: str - Each of the ``CustomerModel`` classes defined in this example will now - behave similarly to a dataclass created with the ``@dataclasses.dataclass`` - decorator. For example, the type checker will synthesize an ``__init__`` - method. + The ``CustomerModel`` classes defined above will + be treated by type checkers similarly to classes created with + ``@dataclasses.dataclass``. + For example, type checkers will assume these classes have + ``__init__`` methods that accept ``id`` and ``name``. The arguments to this decorator can be used to customize this behavior: - ``eq_default`` indicates whether the ``eq`` parameter is assumed to be - True or False if it is omitted by the caller. + ``True`` or ``False`` if it is omitted by the caller. - ``order_default`` indicates whether the ``order`` parameter is assumed to be True or False if it is omitted by the caller. - ``kw_only_default`` indicates whether the ``kw_only`` parameter is assumed to be True or False if it is omitted by the caller. - ``field_specifiers`` specifies a static list of supported classes or functions that describe fields, similar to ``dataclasses.field()``. + - Arbitrary other keyword arguments are accepted in order to allow for + possible future extensions. At runtime, this decorator records its arguments in the ``__dataclass_transform__`` attribute on the decorated object. From webhook-mailer at python.org Fri May 20 11:02:20 2022 From: webhook-mailer at python.org (miss-islington) Date: Fri, 20 May 2022 15:02:20 -0000 Subject: [Python-checkins] gh-91860: documentation for typing.dataclass_transform (GH-92768) Message-ID: https://github.com/python/cpython/commit/6a3a6ba7a26cac99ce200dd3a5dab9c419676d49 commit: 6a3a6ba7a26cac99ce200dd3a5dab9c419676d49 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-20T08:01:44-07:00 summary: gh-91860: documentation for typing.dataclass_transform (GH-92768) Co-authored-by: Alex Waygood (cherry picked from commit f20a6a54fb041507a334ad71706974960d1b473f) Co-authored-by: Shantanu <12621235+hauntsaninja at users.noreply.github.com> files: M Doc/library/typing.rst M Doc/whatsnew/3.11.rst M Lib/typing.py diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index 29bcedaddce9d..7ddc84ac5e451 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -2429,6 +2429,75 @@ Functions and decorators .. versionadded:: 3.11 +.. decorator:: dataclass_transform + + :data:`~typing.dataclass_transform` may be used to + decorate a class, metaclass, or a function that is itself a decorator. + The presence of ``@dataclass_transform()`` tells a static type checker that the + decorated object performs runtime "magic" that + transforms a class, giving it :func:`dataclasses.dataclass`-like behaviors. + + Example usage with a decorator function:: + + T = TypeVar("T") + + @dataclass_transform() + def create_model(cls: type[T]) -> type[T]: + ... + return cls + + @create_model + class CustomerModel: + id: int + name: str + + On a base class:: + + @dataclass_transform() + class ModelBase: ... + + class CustomerModel(ModelBase): + id: int + name: str + + On a metaclass:: + + @dataclass_transform() + class ModelMeta(type): ... + + class ModelBase(metaclass=ModelMeta): ... + + class CustomerModel(ModelBase): + id: int + name: str + + The ``CustomerModel`` classes defined above will + be treated by type checkers similarly to classes created with + :func:`@dataclasses.dataclass `. + For example, type checkers will assume these classes have + ``__init__`` methods that accept ``id`` and ``name``. + + The arguments to this decorator can be used to customize this behavior: + + * ``eq_default`` indicates whether the ``eq`` parameter is assumed to be + ``True`` or ``False`` if it is omitted by the caller. + * ``order_default`` indicates whether the ``order`` parameter is + assumed to be True or False if it is omitted by the caller. + * ``kw_only_default`` indicates whether the ``kw_only`` parameter is + assumed to be True or False if it is omitted by the caller. + * ``field_specifiers`` specifies a static list of supported classes + or functions that describe fields, similar to ``dataclasses.field()``. + * Arbitrary other keyword arguments are accepted in order to allow for + possible future extensions. + + At runtime, this decorator records its arguments in the + ``__dataclass_transform__`` attribute on the decorated object. + It has no other runtime effect. + + See :pep:`681` for more details. + + .. versionadded:: 3.11 + .. decorator:: overload The ``@overload`` decorator allows describing functions and methods diff --git a/Doc/whatsnew/3.11.rst b/Doc/whatsnew/3.11.rst index 1f88d2557aa3d..ff94e45f77c70 100644 --- a/Doc/whatsnew/3.11.rst +++ b/Doc/whatsnew/3.11.rst @@ -306,17 +306,17 @@ Kumar Srinivasan and Graham Bleaney.) PEP 681: Data Class Transforms ------------------------------ -The new :data:`~typing.dataclass_transform` annotation may be used to -decorate a function that is itself a decorator, a class, or a metaclass. +:data:`~typing.dataclass_transform` may be used to +decorate a class, metaclass, or a function that is itself a decorator. The presence of ``@dataclass_transform()`` tells a static type checker that the -decorated function, class, or metaclass performs runtime "magic" that -transforms a class, endowing it with dataclass-like behaviors. +decorated object performs runtime "magic" that +transforms a class, giving it :func:`dataclasses.dataclass`-like behaviors. For example:: # The ``create_model`` decorator is defined by a library. @typing.dataclass_transform() - def create_model(cls: Type[_T]) -> Type[_T]: + def create_model(cls: Type[T]) -> Type[T]: cls.__init__ = ... cls.__eq__ = ... cls.__ne__ = ... diff --git a/Lib/typing.py b/Lib/typing.py index d75203e7e06c3..d655a85575811 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -3340,10 +3340,10 @@ def dataclass_transform( Example usage with a decorator function: - _T = TypeVar("_T") + T = TypeVar("T") @dataclass_transform() - def create_model(cls: type[_T]) -> type[_T]: + def create_model(cls: type[T]) -> type[T]: ... return cls @@ -3372,20 +3372,23 @@ class CustomerModel(ModelBase): id: int name: str - Each of the ``CustomerModel`` classes defined in this example will now - behave similarly to a dataclass created with the ``@dataclasses.dataclass`` - decorator. For example, the type checker will synthesize an ``__init__`` - method. + The ``CustomerModel`` classes defined above will + be treated by type checkers similarly to classes created with + ``@dataclasses.dataclass``. + For example, type checkers will assume these classes have + ``__init__`` methods that accept ``id`` and ``name``. The arguments to this decorator can be used to customize this behavior: - ``eq_default`` indicates whether the ``eq`` parameter is assumed to be - True or False if it is omitted by the caller. + ``True`` or ``False`` if it is omitted by the caller. - ``order_default`` indicates whether the ``order`` parameter is assumed to be True or False if it is omitted by the caller. - ``kw_only_default`` indicates whether the ``kw_only`` parameter is assumed to be True or False if it is omitted by the caller. - ``field_specifiers`` specifies a static list of supported classes or functions that describe fields, similar to ``dataclasses.field()``. + - Arbitrary other keyword arguments are accepted in order to allow for + possible future extensions. At runtime, this decorator records its arguments in the ``__dataclass_transform__`` attribute on the decorated object. From webhook-mailer at python.org Fri May 20 11:14:32 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Fri, 20 May 2022 15:14:32 -0000 Subject: [Python-checkins] shutil._copyfileobj_readinto: tiny speedup (#92377) Message-ID: https://github.com/python/cpython/commit/87b9b4e060377f09096db7af977f604749c8a100 commit: 87b9b4e060377f09096db7af977f604749c8a100 branch: main author: Lucinda May Phipps committer: JelleZijlstra date: 2022-05-20T08:14:05-07:00 summary: shutil._copyfileobj_readinto: tiny speedup (#92377) files: M Lib/shutil.py diff --git a/Lib/shutil.py b/Lib/shutil.py index de82453aa56e1..2cbd808abf2ff 100644 --- a/Lib/shutil.py +++ b/Lib/shutil.py @@ -182,7 +182,8 @@ def _copyfileobj_readinto(fsrc, fdst, length=COPY_BUFSIZE): break elif n < length: with mv[:n] as smv: - fdst.write(smv) + fdst_write(smv) + break else: fdst_write(mv) From webhook-mailer at python.org Fri May 20 17:48:07 2022 From: webhook-mailer at python.org (miss-islington) Date: Fri, 20 May 2022 21:48:07 -0000 Subject: [Python-checkins] gh-92611: Clarify planned removal version in PEP 594-deprecated modules (GH-92793) Message-ID: https://github.com/python/cpython/commit/31fa41ed689528505c0e0cf25777773b7e81c834 commit: 31fa41ed689528505c0e0cf25777773b7e81c834 branch: main author: CAM Gerlach committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-20T14:47:51-07:00 summary: gh-92611: Clarify planned removal version in PEP 594-deprecated modules (GH-92793) As discussed in #92611 and #92564 and as a followup to PR #92612 , this 3.11+ only PR uses the proper `deprecated-removed` role for the modules deprecated by PEP 593 (PEP-594) to clearly indicate to users that a removal version is planned and what it is, so they can prepare accordingly or voice any unanticipated impacts. Related to #92792 ; if we decide to backport that PR, the upgrade to using `deprecated-removed` on those functions can be moved to this one. files: M Doc/library/aifc.rst M Doc/library/asynchat.rst M Doc/library/asyncore.rst M Doc/library/audioop.rst M Doc/library/cgi.rst M Doc/library/cgitb.rst M Doc/library/chunk.rst M Doc/library/crypt.rst M Doc/library/imghdr.rst M Doc/library/imp.rst M Doc/library/mailcap.rst M Doc/library/msilib.rst M Doc/library/nis.rst M Doc/library/ossaudiodev.rst M Doc/library/pipes.rst M Doc/library/smtpd.rst M Doc/library/sndhdr.rst M Doc/library/spwd.rst M Doc/library/sunau.rst M Doc/library/telnetlib.rst M Doc/library/uu.rst M Doc/library/xdrlib.rst diff --git a/Doc/library/aifc.rst b/Doc/library/aifc.rst index fa277857574a3..9f20a30193fa7 100644 --- a/Doc/library/aifc.rst +++ b/Doc/library/aifc.rst @@ -13,7 +13,7 @@ single: AIFF-C -.. deprecated:: 3.11 +.. deprecated-removed:: 3.11 3.13 The :mod:`aifc` module is deprecated (see :pep:`PEP 594 <594#aifc>` for details). diff --git a/Doc/library/asynchat.rst b/Doc/library/asynchat.rst index 7cc9d99779bbb..4eb6a79d4dfbf 100644 --- a/Doc/library/asynchat.rst +++ b/Doc/library/asynchat.rst @@ -10,8 +10,8 @@ **Source code:** :source:`Lib/asynchat.py` -.. deprecated:: 3.6 - :mod:`asynchat` will be removed in Python 3.12 +.. deprecated-removed:: 3.6 3.12 + The :mod:`asynchat` module is deprecated (see :pep:`PEP 594 <594#asynchat>` for details). Please use :mod:`asyncio` instead. diff --git a/Doc/library/asyncore.rst b/Doc/library/asyncore.rst index a732fd7ba4f15..0084d754419d0 100644 --- a/Doc/library/asyncore.rst +++ b/Doc/library/asyncore.rst @@ -13,8 +13,8 @@ **Source code:** :source:`Lib/asyncore.py` -.. deprecated:: 3.6 - :mod:`asyncore` will be removed in Python 3.12 +.. deprecated-removed:: 3.6 3.12 + The :mod:`asyncore` module is deprecated (see :pep:`PEP 594 <594#asyncore>` for details). Please use :mod:`asyncio` instead. diff --git a/Doc/library/audioop.rst b/Doc/library/audioop.rst index 649c99e796282..1f96575d08f5b 100644 --- a/Doc/library/audioop.rst +++ b/Doc/library/audioop.rst @@ -5,7 +5,7 @@ :synopsis: Manipulate raw audio data. :deprecated: -.. deprecated:: 3.11 +.. deprecated-removed:: 3.11 3.13 The :mod:`audioop` module is deprecated (see :pep:`PEP 594 <594#audioop>` for details). diff --git a/Doc/library/cgi.rst b/Doc/library/cgi.rst index 31c03dee91ea8..5976c90029c22 100644 --- a/Doc/library/cgi.rst +++ b/Doc/library/cgi.rst @@ -15,7 +15,7 @@ single: URL single: Common Gateway Interface -.. deprecated:: 3.11 +.. deprecated-removed:: 3.11 3.13 The :mod:`cgi` module is deprecated (see :pep:`PEP 594 <594#cgi>` for details and alternatives). diff --git a/Doc/library/cgitb.rst b/Doc/library/cgitb.rst index 3b0b106abacd5..7f00bcd55c1e5 100644 --- a/Doc/library/cgitb.rst +++ b/Doc/library/cgitb.rst @@ -16,7 +16,7 @@ single: exceptions; in CGI scripts single: tracebacks; in CGI scripts -.. deprecated:: 3.11 +.. deprecated-removed:: 3.11 3.13 The :mod:`cgitb` module is deprecated (see :pep:`PEP 594 <594#cgitb>` for details). diff --git a/Doc/library/chunk.rst b/Doc/library/chunk.rst index 5a84c8904f714..3b88e55b14788 100644 --- a/Doc/library/chunk.rst +++ b/Doc/library/chunk.rst @@ -17,7 +17,7 @@ single: Real Media File Format single: RMFF -.. deprecated:: 3.11 +.. deprecated-removed:: 3.11 3.13 The :mod:`chunk` module is deprecated (see :pep:`PEP 594 <594#chunk>` for details). diff --git a/Doc/library/crypt.rst b/Doc/library/crypt.rst index e795f10f50eec..efba4236bcbcc 100644 --- a/Doc/library/crypt.rst +++ b/Doc/library/crypt.rst @@ -16,7 +16,7 @@ single: crypt(3) pair: cipher; DES -.. deprecated:: 3.11 +.. deprecated-removed:: 3.11 3.13 The :mod:`crypt` module is deprecated (see :pep:`PEP 594 <594#crypt>` for details and alternatives). The :mod:`hashlib` module is a potential replacement for certain use cases. diff --git a/Doc/library/imghdr.rst b/Doc/library/imghdr.rst index c17bf897b9be9..318fe650776d2 100644 --- a/Doc/library/imghdr.rst +++ b/Doc/library/imghdr.rst @@ -7,7 +7,7 @@ **Source code:** :source:`Lib/imghdr.py` -.. deprecated:: 3.11 +.. deprecated-removed:: 3.11 3.13 The :mod:`imghdr` module is deprecated (see :pep:`PEP 594 <594#imghdr>` for details and alternatives). diff --git a/Doc/library/imp.rst b/Doc/library/imp.rst index 121a730e0c9b4..000793a7e66ca 100644 --- a/Doc/library/imp.rst +++ b/Doc/library/imp.rst @@ -7,7 +7,7 @@ **Source code:** :source:`Lib/imp.py` -.. deprecated:: 3.4 +.. deprecated-removed:: 3.4 3.12 The :mod:`imp` module is deprecated in favor of :mod:`importlib`. .. index:: statement: import diff --git a/Doc/library/mailcap.rst b/Doc/library/mailcap.rst index e2e5bb3445637..5490c8468d7cf 100644 --- a/Doc/library/mailcap.rst +++ b/Doc/library/mailcap.rst @@ -7,7 +7,7 @@ **Source code:** :source:`Lib/mailcap.py` -.. deprecated:: 3.11 +.. deprecated-removed:: 3.11 3.13 The :mod:`mailcap` module is deprecated (see :pep:`PEP 594 <594#mailcap>` for details). The :mod:`mimetypes` module provides an alternative. diff --git a/Doc/library/msilib.rst b/Doc/library/msilib.rst index 1ee8130801cba..fbe55db937230 100644 --- a/Doc/library/msilib.rst +++ b/Doc/library/msilib.rst @@ -13,7 +13,7 @@ .. index:: single: msi -.. deprecated:: 3.11 +.. deprecated-removed:: 3.11 3.13 The :mod:`msilib` module is deprecated (see :pep:`PEP 594 <594#msilib>` for details). diff --git a/Doc/library/nis.rst b/Doc/library/nis.rst index 49fe62954cce8..fd3c3d9293d24 100644 --- a/Doc/library/nis.rst +++ b/Doc/library/nis.rst @@ -10,7 +10,7 @@ .. moduleauthor:: Fred Gansevles .. sectionauthor:: Moshe Zadka -.. deprecated:: 3.11 +.. deprecated-removed:: 3.11 3.13 The :mod:`nis` module is deprecated (see :pep:`PEP 594 <594#nis>` for details). diff --git a/Doc/library/ossaudiodev.rst b/Doc/library/ossaudiodev.rst index 728ee3036057d..e14c1bf8d5367 100644 --- a/Doc/library/ossaudiodev.rst +++ b/Doc/library/ossaudiodev.rst @@ -6,7 +6,7 @@ :synopsis: Access to OSS-compatible audio devices. :deprecated: -.. deprecated:: 3.11 +.. deprecated-removed:: 3.11 3.13 The :mod:`ossaudiodev` module is deprecated (see :pep:`PEP 594 <594#ossaudiodev>` for details). diff --git a/Doc/library/pipes.rst b/Doc/library/pipes.rst index 1c5bb8bddaafb..245dd0d252088 100644 --- a/Doc/library/pipes.rst +++ b/Doc/library/pipes.rst @@ -10,7 +10,7 @@ **Source code:** :source:`Lib/pipes.py` -.. deprecated:: 3.11 +.. deprecated-removed:: 3.11 3.13 The :mod:`pipes` module is deprecated (see :pep:`PEP 594 <594#pipes>` for details). Please use the :mod:`subprocess` module instead. diff --git a/Doc/library/smtpd.rst b/Doc/library/smtpd.rst index 121790b5ed0dd..a0d1fb0aa5152 100644 --- a/Doc/library/smtpd.rst +++ b/Doc/library/smtpd.rst @@ -14,8 +14,8 @@ This module offers several classes to implement SMTP (email) servers. -.. deprecated:: 3.6 - :mod:`smtpd` will be removed in Python 3.12 +.. deprecated-removed:: 3.6 3.12 + The :mod:`smtpd` module is deprecated (see :pep:`PEP 594 <594#smtpd>` for details). The `aiosmtpd `_ package is a recommended replacement for this module. It is based on :mod:`asyncio` and provides a diff --git a/Doc/library/sndhdr.rst b/Doc/library/sndhdr.rst index 3ca36f270dade..e1dbe4a1a3448 100644 --- a/Doc/library/sndhdr.rst +++ b/Doc/library/sndhdr.rst @@ -14,7 +14,7 @@ single: A-LAW single: u-LAW -.. deprecated:: 3.11 +.. deprecated-removed:: 3.11 3.13 The :mod:`sndhdr` module is deprecated (see :pep:`PEP 594 <594#sndhdr>` for details and alternatives). diff --git a/Doc/library/spwd.rst b/Doc/library/spwd.rst index 40f50de07babf..87e09167ada42 100644 --- a/Doc/library/spwd.rst +++ b/Doc/library/spwd.rst @@ -6,7 +6,7 @@ :synopsis: The shadow password database (getspnam() and friends). :deprecated: -.. deprecated:: 3.11 +.. deprecated-removed:: 3.11 3.13 The :mod:`spwd` module is deprecated (see :pep:`PEP 594 <594#spwd>` for details and alternatives). diff --git a/Doc/library/sunau.rst b/Doc/library/sunau.rst index b4d996e67e17c..c7a38d96ade13 100644 --- a/Doc/library/sunau.rst +++ b/Doc/library/sunau.rst @@ -9,7 +9,7 @@ **Source code:** :source:`Lib/sunau.py` -.. deprecated:: 3.11 +.. deprecated-removed:: 3.11 3.13 The :mod:`sunau` module is deprecated (see :pep:`PEP 594 <594#sunau>` for details). diff --git a/Doc/library/telnetlib.rst b/Doc/library/telnetlib.rst index 48a927c8ac96b..70b8c7d1511d0 100644 --- a/Doc/library/telnetlib.rst +++ b/Doc/library/telnetlib.rst @@ -11,7 +11,7 @@ .. index:: single: protocol; Telnet -.. deprecated:: 3.11 +.. deprecated-removed:: 3.11 3.13 The :mod:`telnetlib` module is deprecated (see :pep:`PEP 594 <594#telnetlib>` for details and alternatives). diff --git a/Doc/library/uu.rst b/Doc/library/uu.rst index 026ec415c9da6..83c4aec47bbef 100644 --- a/Doc/library/uu.rst +++ b/Doc/library/uu.rst @@ -9,7 +9,7 @@ **Source code:** :source:`Lib/uu.py` -.. deprecated:: 3.11 +.. deprecated-removed:: 3.11 3.13 The :mod:`uu` module is deprecated (see :pep:`PEP 594 <594#uu-and-the-uu-encoding>` for details). :mod:`base64` is a modern alternative. diff --git a/Doc/library/xdrlib.rst b/Doc/library/xdrlib.rst index a3124a986524b..39e75573260c5 100644 --- a/Doc/library/xdrlib.rst +++ b/Doc/library/xdrlib.rst @@ -11,7 +11,7 @@ single: XDR single: External Data Representation -.. deprecated:: 3.11 +.. deprecated-removed:: 3.11 3.13 The :mod:`xdrlib` module is deprecated (see :pep:`PEP 594 <594#xdrlib>` for details). From webhook-mailer at python.org Fri May 20 18:25:44 2022 From: webhook-mailer at python.org (miss-islington) Date: Fri, 20 May 2022 22:25:44 -0000 Subject: [Python-checkins] gh-72073: Add Windows case in pathlib.rename (GH-93002) Message-ID: https://github.com/python/cpython/commit/f51ed04c663417f88e10eeb21dad23250358bafa commit: f51ed04c663417f88e10eeb21dad23250358bafa branch: main author: Stanley <46876382+slateny at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-20T15:25:39-07:00 summary: gh-72073: Add Windows case in pathlib.rename (GH-93002) #72073 https://docs.python.org/3.12/library/pathlib.html#pathlib.Path.rename files: M Doc/library/pathlib.rst diff --git a/Doc/library/pathlib.rst b/Doc/library/pathlib.rst index d45e7aa84b28c..cda2cc83225e0 100644 --- a/Doc/library/pathlib.rst +++ b/Doc/library/pathlib.rst @@ -1021,8 +1021,9 @@ call fails (for example because the path doesn't exist). Rename this file or directory to the given *target*, and return a new Path instance pointing to *target*. On Unix, if *target* exists and is a file, - it will be replaced silently if the user has permission. *target* can be - either a string or another path object:: + it will be replaced silently if the user has permission. + On Windows, if *target* exists, :data:`FileExistsError` will be raised. + *target* can be either a string or another path object:: >>> p = Path('foo') >>> p.open('w').write('some text') From webhook-mailer at python.org Fri May 20 18:33:19 2022 From: webhook-mailer at python.org (brettcannon) Date: Fri, 20 May 2022 22:33:19 -0000 Subject: [Python-checkins] gh-92611: Clarify planned removal version in PEP 594-deprecated modules (GH-92793) (GH-93026) Message-ID: https://github.com/python/cpython/commit/24223ec82a6ef7d32e410940567b1d4ba93e0d1d commit: 24223ec82a6ef7d32e410940567b1d4ba93e0d1d branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: brettcannon date: 2022-05-20T15:33:12-07:00 summary: gh-92611: Clarify planned removal version in PEP 594-deprecated modules (GH-92793) (GH-93026) As discussed in GH-92611 and GH-92564 and as a followup to PR GH-92612 , this 3.11+ only PR uses the proper `deprecated-removed` role for the modules deprecated by PEP 593 (PEP-594) to clearly indicate to users that a removal version is planned and what it is, so they can prepare accordingly or voice any unanticipated impacts. Related to GH-92792 ; if we decide to backport that PR, the upgrade to using `deprecated-removed` on those functions can be moved to this one. (cherry picked from commit 31fa41ed689528505c0e0cf25777773b7e81c834) Co-authored-by: CAM Gerlach files: M Doc/library/aifc.rst M Doc/library/asynchat.rst M Doc/library/asyncore.rst M Doc/library/audioop.rst M Doc/library/cgi.rst M Doc/library/cgitb.rst M Doc/library/chunk.rst M Doc/library/crypt.rst M Doc/library/imghdr.rst M Doc/library/imp.rst M Doc/library/mailcap.rst M Doc/library/msilib.rst M Doc/library/nis.rst M Doc/library/ossaudiodev.rst M Doc/library/pipes.rst M Doc/library/smtpd.rst M Doc/library/sndhdr.rst M Doc/library/spwd.rst M Doc/library/sunau.rst M Doc/library/telnetlib.rst M Doc/library/uu.rst M Doc/library/xdrlib.rst diff --git a/Doc/library/aifc.rst b/Doc/library/aifc.rst index fa277857574a3..9f20a30193fa7 100644 --- a/Doc/library/aifc.rst +++ b/Doc/library/aifc.rst @@ -13,7 +13,7 @@ single: AIFF-C -.. deprecated:: 3.11 +.. deprecated-removed:: 3.11 3.13 The :mod:`aifc` module is deprecated (see :pep:`PEP 594 <594#aifc>` for details). diff --git a/Doc/library/asynchat.rst b/Doc/library/asynchat.rst index 7cc9d99779bbb..4eb6a79d4dfbf 100644 --- a/Doc/library/asynchat.rst +++ b/Doc/library/asynchat.rst @@ -10,8 +10,8 @@ **Source code:** :source:`Lib/asynchat.py` -.. deprecated:: 3.6 - :mod:`asynchat` will be removed in Python 3.12 +.. deprecated-removed:: 3.6 3.12 + The :mod:`asynchat` module is deprecated (see :pep:`PEP 594 <594#asynchat>` for details). Please use :mod:`asyncio` instead. diff --git a/Doc/library/asyncore.rst b/Doc/library/asyncore.rst index a732fd7ba4f15..0084d754419d0 100644 --- a/Doc/library/asyncore.rst +++ b/Doc/library/asyncore.rst @@ -13,8 +13,8 @@ **Source code:** :source:`Lib/asyncore.py` -.. deprecated:: 3.6 - :mod:`asyncore` will be removed in Python 3.12 +.. deprecated-removed:: 3.6 3.12 + The :mod:`asyncore` module is deprecated (see :pep:`PEP 594 <594#asyncore>` for details). Please use :mod:`asyncio` instead. diff --git a/Doc/library/audioop.rst b/Doc/library/audioop.rst index 649c99e796282..1f96575d08f5b 100644 --- a/Doc/library/audioop.rst +++ b/Doc/library/audioop.rst @@ -5,7 +5,7 @@ :synopsis: Manipulate raw audio data. :deprecated: -.. deprecated:: 3.11 +.. deprecated-removed:: 3.11 3.13 The :mod:`audioop` module is deprecated (see :pep:`PEP 594 <594#audioop>` for details). diff --git a/Doc/library/cgi.rst b/Doc/library/cgi.rst index 31c03dee91ea8..5976c90029c22 100644 --- a/Doc/library/cgi.rst +++ b/Doc/library/cgi.rst @@ -15,7 +15,7 @@ single: URL single: Common Gateway Interface -.. deprecated:: 3.11 +.. deprecated-removed:: 3.11 3.13 The :mod:`cgi` module is deprecated (see :pep:`PEP 594 <594#cgi>` for details and alternatives). diff --git a/Doc/library/cgitb.rst b/Doc/library/cgitb.rst index 3b0b106abacd5..7f00bcd55c1e5 100644 --- a/Doc/library/cgitb.rst +++ b/Doc/library/cgitb.rst @@ -16,7 +16,7 @@ single: exceptions; in CGI scripts single: tracebacks; in CGI scripts -.. deprecated:: 3.11 +.. deprecated-removed:: 3.11 3.13 The :mod:`cgitb` module is deprecated (see :pep:`PEP 594 <594#cgitb>` for details). diff --git a/Doc/library/chunk.rst b/Doc/library/chunk.rst index 5a84c8904f714..3b88e55b14788 100644 --- a/Doc/library/chunk.rst +++ b/Doc/library/chunk.rst @@ -17,7 +17,7 @@ single: Real Media File Format single: RMFF -.. deprecated:: 3.11 +.. deprecated-removed:: 3.11 3.13 The :mod:`chunk` module is deprecated (see :pep:`PEP 594 <594#chunk>` for details). diff --git a/Doc/library/crypt.rst b/Doc/library/crypt.rst index e795f10f50eec..efba4236bcbcc 100644 --- a/Doc/library/crypt.rst +++ b/Doc/library/crypt.rst @@ -16,7 +16,7 @@ single: crypt(3) pair: cipher; DES -.. deprecated:: 3.11 +.. deprecated-removed:: 3.11 3.13 The :mod:`crypt` module is deprecated (see :pep:`PEP 594 <594#crypt>` for details and alternatives). The :mod:`hashlib` module is a potential replacement for certain use cases. diff --git a/Doc/library/imghdr.rst b/Doc/library/imghdr.rst index c17bf897b9be9..318fe650776d2 100644 --- a/Doc/library/imghdr.rst +++ b/Doc/library/imghdr.rst @@ -7,7 +7,7 @@ **Source code:** :source:`Lib/imghdr.py` -.. deprecated:: 3.11 +.. deprecated-removed:: 3.11 3.13 The :mod:`imghdr` module is deprecated (see :pep:`PEP 594 <594#imghdr>` for details and alternatives). diff --git a/Doc/library/imp.rst b/Doc/library/imp.rst index 121a730e0c9b4..000793a7e66ca 100644 --- a/Doc/library/imp.rst +++ b/Doc/library/imp.rst @@ -7,7 +7,7 @@ **Source code:** :source:`Lib/imp.py` -.. deprecated:: 3.4 +.. deprecated-removed:: 3.4 3.12 The :mod:`imp` module is deprecated in favor of :mod:`importlib`. .. index:: statement: import diff --git a/Doc/library/mailcap.rst b/Doc/library/mailcap.rst index e2e5bb3445637..5490c8468d7cf 100644 --- a/Doc/library/mailcap.rst +++ b/Doc/library/mailcap.rst @@ -7,7 +7,7 @@ **Source code:** :source:`Lib/mailcap.py` -.. deprecated:: 3.11 +.. deprecated-removed:: 3.11 3.13 The :mod:`mailcap` module is deprecated (see :pep:`PEP 594 <594#mailcap>` for details). The :mod:`mimetypes` module provides an alternative. diff --git a/Doc/library/msilib.rst b/Doc/library/msilib.rst index 1ee8130801cba..fbe55db937230 100644 --- a/Doc/library/msilib.rst +++ b/Doc/library/msilib.rst @@ -13,7 +13,7 @@ .. index:: single: msi -.. deprecated:: 3.11 +.. deprecated-removed:: 3.11 3.13 The :mod:`msilib` module is deprecated (see :pep:`PEP 594 <594#msilib>` for details). diff --git a/Doc/library/nis.rst b/Doc/library/nis.rst index 49fe62954cce8..fd3c3d9293d24 100644 --- a/Doc/library/nis.rst +++ b/Doc/library/nis.rst @@ -10,7 +10,7 @@ .. moduleauthor:: Fred Gansevles .. sectionauthor:: Moshe Zadka -.. deprecated:: 3.11 +.. deprecated-removed:: 3.11 3.13 The :mod:`nis` module is deprecated (see :pep:`PEP 594 <594#nis>` for details). diff --git a/Doc/library/ossaudiodev.rst b/Doc/library/ossaudiodev.rst index 728ee3036057d..e14c1bf8d5367 100644 --- a/Doc/library/ossaudiodev.rst +++ b/Doc/library/ossaudiodev.rst @@ -6,7 +6,7 @@ :synopsis: Access to OSS-compatible audio devices. :deprecated: -.. deprecated:: 3.11 +.. deprecated-removed:: 3.11 3.13 The :mod:`ossaudiodev` module is deprecated (see :pep:`PEP 594 <594#ossaudiodev>` for details). diff --git a/Doc/library/pipes.rst b/Doc/library/pipes.rst index 1c5bb8bddaafb..245dd0d252088 100644 --- a/Doc/library/pipes.rst +++ b/Doc/library/pipes.rst @@ -10,7 +10,7 @@ **Source code:** :source:`Lib/pipes.py` -.. deprecated:: 3.11 +.. deprecated-removed:: 3.11 3.13 The :mod:`pipes` module is deprecated (see :pep:`PEP 594 <594#pipes>` for details). Please use the :mod:`subprocess` module instead. diff --git a/Doc/library/smtpd.rst b/Doc/library/smtpd.rst index 121790b5ed0dd..a0d1fb0aa5152 100644 --- a/Doc/library/smtpd.rst +++ b/Doc/library/smtpd.rst @@ -14,8 +14,8 @@ This module offers several classes to implement SMTP (email) servers. -.. deprecated:: 3.6 - :mod:`smtpd` will be removed in Python 3.12 +.. deprecated-removed:: 3.6 3.12 + The :mod:`smtpd` module is deprecated (see :pep:`PEP 594 <594#smtpd>` for details). The `aiosmtpd `_ package is a recommended replacement for this module. It is based on :mod:`asyncio` and provides a diff --git a/Doc/library/sndhdr.rst b/Doc/library/sndhdr.rst index 3ca36f270dade..e1dbe4a1a3448 100644 --- a/Doc/library/sndhdr.rst +++ b/Doc/library/sndhdr.rst @@ -14,7 +14,7 @@ single: A-LAW single: u-LAW -.. deprecated:: 3.11 +.. deprecated-removed:: 3.11 3.13 The :mod:`sndhdr` module is deprecated (see :pep:`PEP 594 <594#sndhdr>` for details and alternatives). diff --git a/Doc/library/spwd.rst b/Doc/library/spwd.rst index 40f50de07babf..87e09167ada42 100644 --- a/Doc/library/spwd.rst +++ b/Doc/library/spwd.rst @@ -6,7 +6,7 @@ :synopsis: The shadow password database (getspnam() and friends). :deprecated: -.. deprecated:: 3.11 +.. deprecated-removed:: 3.11 3.13 The :mod:`spwd` module is deprecated (see :pep:`PEP 594 <594#spwd>` for details and alternatives). diff --git a/Doc/library/sunau.rst b/Doc/library/sunau.rst index b4d996e67e17c..c7a38d96ade13 100644 --- a/Doc/library/sunau.rst +++ b/Doc/library/sunau.rst @@ -9,7 +9,7 @@ **Source code:** :source:`Lib/sunau.py` -.. deprecated:: 3.11 +.. deprecated-removed:: 3.11 3.13 The :mod:`sunau` module is deprecated (see :pep:`PEP 594 <594#sunau>` for details). diff --git a/Doc/library/telnetlib.rst b/Doc/library/telnetlib.rst index 48a927c8ac96b..70b8c7d1511d0 100644 --- a/Doc/library/telnetlib.rst +++ b/Doc/library/telnetlib.rst @@ -11,7 +11,7 @@ .. index:: single: protocol; Telnet -.. deprecated:: 3.11 +.. deprecated-removed:: 3.11 3.13 The :mod:`telnetlib` module is deprecated (see :pep:`PEP 594 <594#telnetlib>` for details and alternatives). diff --git a/Doc/library/uu.rst b/Doc/library/uu.rst index 026ec415c9da6..83c4aec47bbef 100644 --- a/Doc/library/uu.rst +++ b/Doc/library/uu.rst @@ -9,7 +9,7 @@ **Source code:** :source:`Lib/uu.py` -.. deprecated:: 3.11 +.. deprecated-removed:: 3.11 3.13 The :mod:`uu` module is deprecated (see :pep:`PEP 594 <594#uu-and-the-uu-encoding>` for details). :mod:`base64` is a modern alternative. diff --git a/Doc/library/xdrlib.rst b/Doc/library/xdrlib.rst index a3124a986524b..39e75573260c5 100644 --- a/Doc/library/xdrlib.rst +++ b/Doc/library/xdrlib.rst @@ -11,7 +11,7 @@ single: XDR single: External Data Representation -.. deprecated:: 3.11 +.. deprecated-removed:: 3.11 3.13 The :mod:`xdrlib` module is deprecated (see :pep:`PEP 594 <594#xdrlib>` for details). From webhook-mailer at python.org Fri May 20 18:42:39 2022 From: webhook-mailer at python.org (miss-islington) Date: Fri, 20 May 2022 22:42:39 -0000 Subject: [Python-checkins] [3.11] gh-72073: Add Windows case in pathlib.rename (GH-93002) (GH-93028) Message-ID: https://github.com/python/cpython/commit/61dfe37429d29e704acb024655e450de5d1649d5 commit: 61dfe37429d29e704acb024655e450de5d1649d5 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-20T15:42:28-07:00 summary: [3.11] gh-72073: Add Windows case in pathlib.rename (GH-93002) (GH-93028) GH-72073 https://docs.python.org/3.12/library/pathlib.htmlGH-pathlib.Path.rename (cherry picked from commit f51ed04c663417f88e10eeb21dad23250358bafa) Co-authored-by: Stanley <46876382+slateny at users.noreply.github.com> Automerge-Triggered-By: GH:brettcannon files: M Doc/library/pathlib.rst diff --git a/Doc/library/pathlib.rst b/Doc/library/pathlib.rst index ab26e2f1719fe..7c407242515d2 100644 --- a/Doc/library/pathlib.rst +++ b/Doc/library/pathlib.rst @@ -1021,8 +1021,9 @@ call fails (for example because the path doesn't exist). Rename this file or directory to the given *target*, and return a new Path instance pointing to *target*. On Unix, if *target* exists and is a file, - it will be replaced silently if the user has permission. *target* can be - either a string or another path object:: + it will be replaced silently if the user has permission. + On Windows, if *target* exists, :exc:`FileExistsError` will be raised. + *target* can be either a string or another path object:: >>> p = Path('foo') >>> p.open('w').write('some text') From webhook-mailer at python.org Fri May 20 18:44:22 2022 From: webhook-mailer at python.org (miss-islington) Date: Fri, 20 May 2022 22:44:22 -0000 Subject: [Python-checkins] [3.10] gh-72073: Add Windows case in pathlib.rename (GH-93002) (GH-93029) Message-ID: https://github.com/python/cpython/commit/3c2a1e7f4af3c5c54e04dfe9ac3a68d2351b00fb commit: 3c2a1e7f4af3c5c54e04dfe9ac3a68d2351b00fb branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-20T15:44:07-07:00 summary: [3.10] gh-72073: Add Windows case in pathlib.rename (GH-93002) (GH-93029) GH-72073 https://docs.python.org/3.12/library/pathlib.htmlGH-pathlib.Path.rename (cherry picked from commit f51ed04c663417f88e10eeb21dad23250358bafa) Co-authored-by: Stanley <46876382+slateny at users.noreply.github.com> Automerge-Triggered-By: GH:brettcannon files: M Doc/library/pathlib.rst diff --git a/Doc/library/pathlib.rst b/Doc/library/pathlib.rst index f036d8119243a..004f671b033ae 100644 --- a/Doc/library/pathlib.rst +++ b/Doc/library/pathlib.rst @@ -1018,8 +1018,9 @@ call fails (for example because the path doesn't exist). Rename this file or directory to the given *target*, and return a new Path instance pointing to *target*. On Unix, if *target* exists and is a file, - it will be replaced silently if the user has permission. *target* can be - either a string or another path object:: + it will be replaced silently if the user has permission. + On Windows, if *target* exists, :exc:`FileExistsError` will be raised. + *target* can be either a string or another path object:: >>> p = Path('foo') >>> p.open('w').write('some text') From webhook-mailer at python.org Fri May 20 18:52:44 2022 From: webhook-mailer at python.org (brettcannon) Date: Fri, 20 May 2022 22:52:44 -0000 Subject: [Python-checkins] Fix a directive in the `pathlib` docs (GH-93030) Message-ID: https://github.com/python/cpython/commit/d59b2d0441d68c63e6dbe2ec76471b54a859bcda commit: d59b2d0441d68c63e6dbe2ec76471b54a859bcda branch: main author: Brett Cannon committer: brettcannon date: 2022-05-20T15:52:38-07:00 summary: Fix a directive in the `pathlib` docs (GH-93030) files: M Doc/library/pathlib.rst diff --git a/Doc/library/pathlib.rst b/Doc/library/pathlib.rst index cda2cc83225e0..e16097d00f60f 100644 --- a/Doc/library/pathlib.rst +++ b/Doc/library/pathlib.rst @@ -1022,7 +1022,7 @@ call fails (for example because the path doesn't exist). Rename this file or directory to the given *target*, and return a new Path instance pointing to *target*. On Unix, if *target* exists and is a file, it will be replaced silently if the user has permission. - On Windows, if *target* exists, :data:`FileExistsError` will be raised. + On Windows, if *target* exists, :exc:`FileExistsError` will be raised. *target* can be either a string or another path object:: >>> p = Path('foo') From webhook-mailer at python.org Fri May 20 19:02:37 2022 From: webhook-mailer at python.org (rhettinger) Date: Fri, 20 May 2022 23:02:37 -0000 Subject: [Python-checkins] Take advantage of math.comb() in the nth_combination() recipe (#93027) Message-ID: https://github.com/python/cpython/commit/59719a242d2191802476f5065236665379e226ac commit: 59719a242d2191802476f5065236665379e226ac branch: main author: Raymond Hettinger committer: rhettinger date: 2022-05-20T18:02:33-05:00 summary: Take advantage of math.comb() in the nth_combination() recipe (#93027) files: M Doc/library/itertools.rst diff --git a/Doc/library/itertools.rst b/Doc/library/itertools.rst index 26c9253cb7f5f..416c4eca5eb48 100644 --- a/Doc/library/itertools.rst +++ b/Doc/library/itertools.rst @@ -992,12 +992,7 @@ which incur interpreter overhead. "Equivalent to list(combinations(iterable, r))[index]" pool = tuple(iterable) n = len(pool) - if r < 0 or r > n: - raise ValueError - c = 1 - k = min(r, n-r) - for i in range(1, k+1): - c = c * (n - k + i) // i + c = math.comb(n, r) if index < 0: index += c if index < 0 or index >= c: @@ -1071,6 +1066,7 @@ which incur interpreter overhead. >>> import operator >>> import collections + >>> import math >>> take(10, count()) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] From webhook-mailer at python.org Fri May 20 19:34:45 2022 From: webhook-mailer at python.org (rhettinger) Date: Fri, 20 May 2022 23:34:45 -0000 Subject: [Python-checkins] Take advantage of math.comb() in the nth_combination() recipe (GH-93027) (#93032) Message-ID: https://github.com/python/cpython/commit/b52e44d9330b6a02c4215b664cd92e7562242635 commit: b52e44d9330b6a02c4215b664cd92e7562242635 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: rhettinger date: 2022-05-20T18:34:30-05:00 summary: Take advantage of math.comb() in the nth_combination() recipe (GH-93027) (#93032) files: M Doc/library/itertools.rst diff --git a/Doc/library/itertools.rst b/Doc/library/itertools.rst index 26c9253cb7f5f..416c4eca5eb48 100644 --- a/Doc/library/itertools.rst +++ b/Doc/library/itertools.rst @@ -992,12 +992,7 @@ which incur interpreter overhead. "Equivalent to list(combinations(iterable, r))[index]" pool = tuple(iterable) n = len(pool) - if r < 0 or r > n: - raise ValueError - c = 1 - k = min(r, n-r) - for i in range(1, k+1): - c = c * (n - k + i) // i + c = math.comb(n, r) if index < 0: index += c if index < 0 or index >= c: @@ -1071,6 +1066,7 @@ which incur interpreter overhead. >>> import operator >>> import collections + >>> import math >>> take(10, count()) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] From webhook-mailer at python.org Sat May 21 00:36:17 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Sat, 21 May 2022 04:36:17 -0000 Subject: [Python-checkins] gh-93019: Fix markup in zipfile.rst (#93025) Message-ID: https://github.com/python/cpython/commit/2fadde7e6645e45e090b0187c28877300b07cba3 commit: 2fadde7e6645e45e090b0187c28877300b07cba3 branch: main author: Shantanu <12621235+hauntsaninja at users.noreply.github.com> committer: JelleZijlstra date: 2022-05-20T21:36:09-07:00 summary: gh-93019: Fix markup in zipfile.rst (#93025) Fixes #93019 files: M Doc/library/zipfile.rst diff --git a/Doc/library/zipfile.rst b/Doc/library/zipfile.rst index 19e128ce02f54..4dd9fa961a8d9 100644 --- a/Doc/library/zipfile.rst +++ b/Doc/library/zipfile.rst @@ -139,7 +139,7 @@ ZipFile Objects .. class:: ZipFile(file, mode='r', compression=ZIP_STORED, allowZip64=True, \ - compresslevel=None, *, strict_timestamps=True, + compresslevel=None, *, strict_timestamps=True, \ metadata_encoding=None) Open a ZIP file, where *file* can be a path to a file (a string), a From webhook-mailer at python.org Sat May 21 00:52:47 2022 From: webhook-mailer at python.org (miss-islington) Date: Sat, 21 May 2022 04:52:47 -0000 Subject: [Python-checkins] gh-93019: Fix markup in zipfile.rst (GH-93025) Message-ID: https://github.com/python/cpython/commit/b97e28f1c243233f6c643148bfe26703c3f36885 commit: b97e28f1c243233f6c643148bfe26703c3f36885 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-20T21:52:32-07:00 summary: gh-93019: Fix markup in zipfile.rst (GH-93025) Fixes GH-93019 (cherry picked from commit 2fadde7e6645e45e090b0187c28877300b07cba3) Co-authored-by: Shantanu <12621235+hauntsaninja at users.noreply.github.com> files: M Doc/library/zipfile.rst diff --git a/Doc/library/zipfile.rst b/Doc/library/zipfile.rst index 19e128ce02f54..4dd9fa961a8d9 100644 --- a/Doc/library/zipfile.rst +++ b/Doc/library/zipfile.rst @@ -139,7 +139,7 @@ ZipFile Objects .. class:: ZipFile(file, mode='r', compression=ZIP_STORED, allowZip64=True, \ - compresslevel=None, *, strict_timestamps=True, + compresslevel=None, *, strict_timestamps=True, \ metadata_encoding=None) Open a ZIP file, where *file* can be a path to a file (a string), a From webhook-mailer at python.org Sat May 21 03:33:51 2022 From: webhook-mailer at python.org (serhiy-storchaka) Date: Sat, 21 May 2022 07:33:51 -0000 Subject: [Python-checkins] gh-71223: Improve rendering of some references in the docs (GH-93041) Message-ID: https://github.com/python/cpython/commit/7f835923c179d1d2da54b232e0113abc2c56ea31 commit: 7f835923c179d1d2da54b232e0113abc2c56ea31 branch: main author: Serhiy Storchaka committer: serhiy-storchaka date: 2022-05-21T10:33:23+03:00 summary: gh-71223: Improve rendering of some references in the docs (GH-93041) For example, instead of "eval()uated" (link from "eval()") show "evaluated" (link from the whole word). files: M Doc/library/email.headerregistry.rst M Doc/library/functions.rst M Doc/library/logging.config.rst M Doc/library/stdtypes.rst M Doc/library/threading.rst M Doc/library/weakref.rst M Doc/whatsnew/3.4.rst diff --git a/Doc/library/email.headerregistry.rst b/Doc/library/email.headerregistry.rst index 3e1d97a03264b..98527cea43da2 100644 --- a/Doc/library/email.headerregistry.rst +++ b/Doc/library/email.headerregistry.rst @@ -206,7 +206,7 @@ headers. The ``decoded`` value of the header will have all encoded words decoded to unicode. :class:`~encodings.idna` encoded domain names are also decoded to - unicode. The ``decoded`` value is set by :attr:`~str.join`\ ing the + unicode. The ``decoded`` value is set by :ref:`joining ` the :class:`str` value of the elements of the ``groups`` attribute with ``', '``. diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst index 92b2c3bb53944..f5e4c1a8640f4 100644 --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -500,6 +500,7 @@ are always available. They are listed here in alphabetical order. yield n, elem n += 1 +.. _func-eval: .. function:: eval(expression[, globals[, locals]]) diff --git a/Doc/library/logging.config.rst b/Doc/library/logging.config.rst index 2f105ba29441d..310796e7ac6b1 100644 --- a/Doc/library/logging.config.rst +++ b/Doc/library/logging.config.rst @@ -716,7 +716,7 @@ root logger section is given below. The ``level`` entry can be one of ``DEBUG, INFO, WARNING, ERROR, CRITICAL`` or ``NOTSET``. For the root logger only, ``NOTSET`` means that all messages will be -logged. Level values are :func:`eval`\ uated in the context of the ``logging`` +logged. Level values are :ref:`evaluated ` in the context of the ``logging`` package's namespace. The ``handlers`` entry is a comma-separated list of handler names, which must @@ -763,13 +763,13 @@ handler. If blank, a default formatter (``logging._defaultFormatter``) is used. If a name is specified, it must appear in the ``[formatters]`` section and have a corresponding section in the configuration file. -The ``args`` entry, when :func:`eval`\ uated in the context of the ``logging`` +The ``args`` entry, when :ref:`evaluated ` in the context of the ``logging`` package's namespace, is the list of arguments to the constructor for the handler class. Refer to the constructors for the relevant handlers, or to the examples below, to see how typical entries are constructed. If not provided, it defaults to ``()``. -The optional ``kwargs`` entry, when :func:`eval`\ uated in the context of the +The optional ``kwargs`` entry, when :ref:`evaluated ` in the context of the ``logging`` package's namespace, is the keyword argument dict to the constructor for the handler class. If not provided, it defaults to ``{}``. diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index 065afb8ae6038..33fd2831228f8 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -1866,6 +1866,8 @@ expression support in the :mod:`re` module). +.. _meth-str-join: + .. method:: str.join(iterable) Return a string which is the concatenation of the strings in *iterable*. diff --git a/Doc/library/threading.rst b/Doc/library/threading.rst index 0bc1f9d12a86e..58e4ad786fe17 100644 --- a/Doc/library/threading.rst +++ b/Doc/library/threading.rst @@ -293,7 +293,7 @@ There is the possibility that "dummy thread objects" are created. These are thread objects corresponding to "alien threads", which are threads of control started outside the threading module, such as directly from C code. Dummy thread objects have limited functionality; they are always considered alive and -daemonic, and cannot be :meth:`~Thread.join`\ ed. They are never deleted, +daemonic, and cannot be :ref:`joined `. They are never deleted, since it is impossible to detect the termination of alien threads. @@ -366,6 +366,8 @@ since it is impossible to detect the termination of alien threads. >>> t.run() 1 + .. _meth-thread-join: + .. method:: join(timeout=None) Wait until the thread terminates. This blocks the calling thread until @@ -383,7 +385,7 @@ since it is impossible to detect the termination of alien threads. When the *timeout* argument is not present or ``None``, the operation will block until the thread terminates. - A thread can be :meth:`~Thread.join`\ ed many times. + A thread can be joined many times. :meth:`~Thread.join` raises a :exc:`RuntimeError` if an attempt is made to join the current thread as that would cause a deadlock. It is also diff --git a/Doc/library/weakref.rst b/Doc/library/weakref.rst index 1102c634edaf3..8397de4fb488f 100644 --- a/Doc/library/weakref.rst +++ b/Doc/library/weakref.rst @@ -1,3 +1,5 @@ +.. _mod-weakref: + :mod:`weakref` --- Weak references ================================== diff --git a/Doc/whatsnew/3.4.rst b/Doc/whatsnew/3.4.rst index f4ff143224196..023736134b2ca 100644 --- a/Doc/whatsnew/3.4.rst +++ b/Doc/whatsnew/3.4.rst @@ -409,7 +409,7 @@ Some smaller changes made to the core Python language are: evaluating has no elements. (Contributed by Julian Berman in :issue:`18111`.) -* Module objects are now :mod:`weakref`'able. +* Module objects are now :ref:`weakly referenceable `. * Module ``__file__`` attributes (and related values) should now always contain absolute paths by default, with the sole exception of @@ -1113,8 +1113,8 @@ with additional speedups by Antoine Pitrou in :issue:`19219`.) mmap ---- -mmap objects can now be :mod:`weakref`\ ed. (Contributed by Valerie Lambert in -:issue:`4885`.) +mmap objects are now :ref:`weakly referenceable `. +(Contributed by Valerie Lambert in :issue:`4885`.) multiprocessing From webhook-mailer at python.org Sat May 21 03:49:45 2022 From: webhook-mailer at python.org (miss-islington) Date: Sat, 21 May 2022 07:49:45 -0000 Subject: [Python-checkins] gh-71223: Improve rendering of some references in the docs (GH-93041) Message-ID: https://github.com/python/cpython/commit/f2aeb3f6f782716d6b8fbff336d6258a24ba021c commit: f2aeb3f6f782716d6b8fbff336d6258a24ba021c branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-21T00:49:36-07:00 summary: gh-71223: Improve rendering of some references in the docs (GH-93041) For example, instead of "eval()uated" (link from "eval()") show "evaluated" (link from the whole word). (cherry picked from commit 7f835923c179d1d2da54b232e0113abc2c56ea31) Co-authored-by: Serhiy Storchaka files: M Doc/library/email.headerregistry.rst M Doc/library/functions.rst M Doc/library/logging.config.rst M Doc/library/stdtypes.rst M Doc/library/threading.rst M Doc/library/weakref.rst M Doc/whatsnew/3.4.rst diff --git a/Doc/library/email.headerregistry.rst b/Doc/library/email.headerregistry.rst index 3e1d97a03264b..98527cea43da2 100644 --- a/Doc/library/email.headerregistry.rst +++ b/Doc/library/email.headerregistry.rst @@ -206,7 +206,7 @@ headers. The ``decoded`` value of the header will have all encoded words decoded to unicode. :class:`~encodings.idna` encoded domain names are also decoded to - unicode. The ``decoded`` value is set by :attr:`~str.join`\ ing the + unicode. The ``decoded`` value is set by :ref:`joining ` the :class:`str` value of the elements of the ``groups`` attribute with ``', '``. diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst index 92b2c3bb53944..f5e4c1a8640f4 100644 --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -500,6 +500,7 @@ are always available. They are listed here in alphabetical order. yield n, elem n += 1 +.. _func-eval: .. function:: eval(expression[, globals[, locals]]) diff --git a/Doc/library/logging.config.rst b/Doc/library/logging.config.rst index 2f105ba29441d..310796e7ac6b1 100644 --- a/Doc/library/logging.config.rst +++ b/Doc/library/logging.config.rst @@ -716,7 +716,7 @@ root logger section is given below. The ``level`` entry can be one of ``DEBUG, INFO, WARNING, ERROR, CRITICAL`` or ``NOTSET``. For the root logger only, ``NOTSET`` means that all messages will be -logged. Level values are :func:`eval`\ uated in the context of the ``logging`` +logged. Level values are :ref:`evaluated ` in the context of the ``logging`` package's namespace. The ``handlers`` entry is a comma-separated list of handler names, which must @@ -763,13 +763,13 @@ handler. If blank, a default formatter (``logging._defaultFormatter``) is used. If a name is specified, it must appear in the ``[formatters]`` section and have a corresponding section in the configuration file. -The ``args`` entry, when :func:`eval`\ uated in the context of the ``logging`` +The ``args`` entry, when :ref:`evaluated ` in the context of the ``logging`` package's namespace, is the list of arguments to the constructor for the handler class. Refer to the constructors for the relevant handlers, or to the examples below, to see how typical entries are constructed. If not provided, it defaults to ``()``. -The optional ``kwargs`` entry, when :func:`eval`\ uated in the context of the +The optional ``kwargs`` entry, when :ref:`evaluated ` in the context of the ``logging`` package's namespace, is the keyword argument dict to the constructor for the handler class. If not provided, it defaults to ``{}``. diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index 065afb8ae6038..33fd2831228f8 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -1866,6 +1866,8 @@ expression support in the :mod:`re` module). +.. _meth-str-join: + .. method:: str.join(iterable) Return a string which is the concatenation of the strings in *iterable*. diff --git a/Doc/library/threading.rst b/Doc/library/threading.rst index b777560961690..e654dedfd91a2 100644 --- a/Doc/library/threading.rst +++ b/Doc/library/threading.rst @@ -293,7 +293,7 @@ There is the possibility that "dummy thread objects" are created. These are thread objects corresponding to "alien threads", which are threads of control started outside the threading module, such as directly from C code. Dummy thread objects have limited functionality; they are always considered alive and -daemonic, and cannot be :meth:`~Thread.join`\ ed. They are never deleted, +daemonic, and cannot be :ref:`joined `. They are never deleted, since it is impossible to detect the termination of alien threads. @@ -366,6 +366,8 @@ since it is impossible to detect the termination of alien threads. >>> t.run() 1 + .. _meth-thread-join: + .. method:: join(timeout=None) Wait until the thread terminates. This blocks the calling thread until @@ -383,7 +385,7 @@ since it is impossible to detect the termination of alien threads. When the *timeout* argument is not present or ``None``, the operation will block until the thread terminates. - A thread can be :meth:`~Thread.join`\ ed many times. + A thread can be joined many times. :meth:`~Thread.join` raises a :exc:`RuntimeError` if an attempt is made to join the current thread as that would cause a deadlock. It is also diff --git a/Doc/library/weakref.rst b/Doc/library/weakref.rst index 1102c634edaf3..8397de4fb488f 100644 --- a/Doc/library/weakref.rst +++ b/Doc/library/weakref.rst @@ -1,3 +1,5 @@ +.. _mod-weakref: + :mod:`weakref` --- Weak references ================================== diff --git a/Doc/whatsnew/3.4.rst b/Doc/whatsnew/3.4.rst index f4ff143224196..023736134b2ca 100644 --- a/Doc/whatsnew/3.4.rst +++ b/Doc/whatsnew/3.4.rst @@ -409,7 +409,7 @@ Some smaller changes made to the core Python language are: evaluating has no elements. (Contributed by Julian Berman in :issue:`18111`.) -* Module objects are now :mod:`weakref`'able. +* Module objects are now :ref:`weakly referenceable `. * Module ``__file__`` attributes (and related values) should now always contain absolute paths by default, with the sole exception of @@ -1113,8 +1113,8 @@ with additional speedups by Antoine Pitrou in :issue:`19219`.) mmap ---- -mmap objects can now be :mod:`weakref`\ ed. (Contributed by Valerie Lambert in -:issue:`4885`.) +mmap objects are now :ref:`weakly referenceable `. +(Contributed by Valerie Lambert in :issue:`4885`.) multiprocessing From webhook-mailer at python.org Sat May 21 03:55:35 2022 From: webhook-mailer at python.org (ewdurbin) Date: Sat, 21 May 2022 07:55:35 -0000 Subject: [Python-checkins] ci: add GitHub token permissions (#92999) Message-ID: https://github.com/python/cpython/commit/b96e20c1d9be4e6d5ea3e48c9c97e5ecd02f6055 commit: b96e20c1d9be4e6d5ea3e48c9c97e5ecd02f6055 branch: main author: Varun Sharma committer: ewdurbin date: 2022-05-21T03:55:21-04:00 summary: ci: add GitHub token permissions (#92999) files: M .github/workflows/build.yml M .github/workflows/build_msi.yml M .github/workflows/doc.yml M .github/workflows/new-bugs-announce-notifier.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e04633b711f2f..d800442ad07e3 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -22,6 +22,9 @@ on: - '3.8' - '3.7' +permissions: + contents: read + jobs: check_source: name: 'Check for source changes' diff --git a/.github/workflows/build_msi.yml b/.github/workflows/build_msi.yml index ec18735e9b9fa..6044ae0f7c29b 100644 --- a/.github/workflows/build_msi.yml +++ b/.github/workflows/build_msi.yml @@ -23,6 +23,9 @@ on: paths: - 'Tools/msi/**' +permissions: + contents: read + jobs: build_win32: name: 'Windows (x86) Installer' diff --git a/.github/workflows/doc.yml b/.github/workflows/doc.yml index 8c4a034896126..9cd251648cdea 100644 --- a/.github/workflows/doc.yml +++ b/.github/workflows/doc.yml @@ -24,6 +24,9 @@ on: - 'Doc/**' - 'Misc/**' +permissions: + contents: read + jobs: build_doc: name: 'Docs' diff --git a/.github/workflows/new-bugs-announce-notifier.yml b/.github/workflows/new-bugs-announce-notifier.yml index 8cd834419f00b..b2b63472d8342 100644 --- a/.github/workflows/new-bugs-announce-notifier.yml +++ b/.github/workflows/new-bugs-announce-notifier.yml @@ -5,6 +5,9 @@ on: types: - opened +permissions: + issues: read + jobs: notify-new-bugs-announce: runs-on: ubuntu-latest @@ -39,7 +42,7 @@ jobs: assignee : issue.data.assignees.map(assignee => { return assignee.login }), body : issue.data.body }; - + const data = { from: "CPython Issues ", to: "new-bugs-announce at python.org", From webhook-mailer at python.org Sat May 21 07:35:55 2022 From: webhook-mailer at python.org (serhiy-storchaka) Date: Sat, 21 May 2022 11:35:55 -0000 Subject: [Python-checkins] gh-93044: No longer convert the database argument of sqlite3.connect() to bytes (GH-93046) Message-ID: https://github.com/python/cpython/commit/14c0d33016a967a98155f2e1615660e9328aef5d commit: 14c0d33016a967a98155f2e1615660e9328aef5d branch: main author: Serhiy Storchaka committer: serhiy-storchaka date: 2022-05-21T14:35:46+03:00 summary: gh-93044: No longer convert the database argument of sqlite3.connect() to bytes (GH-93046) Just pass it to the factory as is. files: A Misc/NEWS.d/next/Library/2022-05-21-13-16-16.gh-issue-93044.eJ_XkZ.rst M Lib/test/test_sqlite3/test_dbapi.py M Modules/_sqlite/clinic/module.c.h M Modules/_sqlite/module.c diff --git a/Lib/test/test_sqlite3/test_dbapi.py b/Lib/test/test_sqlite3/test_dbapi.py index 40f91a193b2cd..f0c009afe459b 100644 --- a/Lib/test/test_sqlite3/test_dbapi.py +++ b/Lib/test/test_sqlite3/test_dbapi.py @@ -676,6 +676,19 @@ def test_open_uri(self): with managed_connect(f"file:{TESTFN}?mode=ro", uri=True) as cx: cx.execute(self._sql) + def test_factory_database_arg(self): + def factory(database, *args, **kwargs): + nonlocal database_arg + database_arg = database + return sqlite.Connection(":memory:", *args, **kwargs) + + for database in (TESTFN, os.fsencode(TESTFN), + FakePath(TESTFN), FakePath(os.fsencode(TESTFN))): + database_arg = None + with sqlite.connect(database, factory=factory): + pass + self.assertEqual(database_arg, database) + def test_database_keyword(self): with sqlite.connect(database=":memory:") as cx: self.assertEqual(type(cx), sqlite.Connection) diff --git a/Misc/NEWS.d/next/Library/2022-05-21-13-16-16.gh-issue-93044.eJ_XkZ.rst b/Misc/NEWS.d/next/Library/2022-05-21-13-16-16.gh-issue-93044.eJ_XkZ.rst new file mode 100644 index 0000000000000..c9df8676bcdda --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-05-21-13-16-16.gh-issue-93044.eJ_XkZ.rst @@ -0,0 +1,2 @@ +No longer convert the database argument of :func:`sqlite3.connect` to bytes +before passing it to the factory. diff --git a/Modules/_sqlite/clinic/module.c.h b/Modules/_sqlite/clinic/module.c.h index 74a6a362c05ab..d3367cf62bf72 100644 --- a/Modules/_sqlite/clinic/module.c.h +++ b/Modules/_sqlite/clinic/module.c.h @@ -43,9 +43,7 @@ pysqlite_connect(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyOb if (!args) { goto exit; } - if (!PyUnicode_FSConverter(args[0], &database)) { - goto exit; - } + database = args[0]; if (!noptargs) { goto skip_optional_pos; } @@ -294,4 +292,4 @@ pysqlite_adapt(PyObject *module, PyObject *const *args, Py_ssize_t nargs) exit: return return_value; } -/*[clinic end generated code: output=43aa4f4356f9269d input=a9049054013a1b77]*/ +/*[clinic end generated code: output=a7cfa6dc9d54273c input=a9049054013a1b77]*/ diff --git a/Modules/_sqlite/module.c b/Modules/_sqlite/module.c index 78591f85c1f7d..9b0e921511c56 100644 --- a/Modules/_sqlite/module.c +++ b/Modules/_sqlite/module.c @@ -46,7 +46,7 @@ module _sqlite3 /*[clinic input] _sqlite3.connect as pysqlite_connect - database: object(converter='PyUnicode_FSConverter') + database: object timeout: double = 5.0 detect_types: int = 0 isolation_level: object = NULL @@ -66,7 +66,7 @@ pysqlite_connect_impl(PyObject *module, PyObject *database, double timeout, int detect_types, PyObject *isolation_level, int check_same_thread, PyObject *factory, int cached_statements, int uri) -/*[clinic end generated code: output=450ac9078b4868bb input=ea6355ba55a78e12]*/ +/*[clinic end generated code: output=450ac9078b4868bb input=e16914663ddf93ce]*/ { if (isolation_level == NULL) { isolation_level = PyUnicode_FromString(""); @@ -81,7 +81,6 @@ pysqlite_connect_impl(PyObject *module, PyObject *database, double timeout, timeout, detect_types, isolation_level, check_same_thread, factory, cached_statements, uri); - Py_DECREF(database); // needed bco. the AC FSConverter Py_DECREF(isolation_level); return res; } From webhook-mailer at python.org Sat May 21 09:16:52 2022 From: webhook-mailer at python.org (corona10) Date: Sat, 21 May 2022 13:16:52 -0000 Subject: [Python-checkins] GH-92898: Make _Py_Cast C++ version compatible with cast operator (gh-92951) Message-ID: https://github.com/python/cpython/commit/5b71b519f966e1017c868ea2b27c61a5eac38c1f commit: 5b71b519f966e1017c868ea2b27c61a5eac38c1f branch: main author: serge-sans-paille committer: corona10 date: 2022-05-21T22:16:37+09:00 summary: GH-92898: Make _Py_Cast C++ version compatible with cast operator (gh-92951) files: M Include/pyport.h M Lib/test/_testcppext.cpp diff --git a/Include/pyport.h b/Include/pyport.h index 614a2789fb078..086ed4204e4ff 100644 --- a/Include/pyport.h +++ b/Include/pyport.h @@ -26,8 +26,32 @@ // _Py_CAST(const PyObject*, expr) fails with a compiler error. #ifdef __cplusplus # define _Py_STATIC_CAST(type, expr) static_cast(expr) -# define _Py_CAST(type, expr) \ - const_cast(reinterpret_cast(expr)) + +extern "C++" { +namespace { +template +inline type _Py_reinterpret_cast_impl(expr_type *expr) { + return reinterpret_cast(expr); +} + +template +inline type _Py_reinterpret_cast_impl(expr_type const *expr) { + return reinterpret_cast(const_cast(expr)); +} + +template +inline type _Py_reinterpret_cast_impl(expr_type &expr) { + return static_cast(expr); +} + +template +inline type _Py_reinterpret_cast_impl(expr_type const &expr) { + return static_cast(const_cast(expr)); +} +} // namespace +} +# define _Py_CAST(type, expr) _Py_reinterpret_cast_impl(expr) + #else # define _Py_STATIC_CAST(type, expr) ((type)(expr)) # define _Py_CAST(type, expr) ((type)(expr)) diff --git a/Lib/test/_testcppext.cpp b/Lib/test/_testcppext.cpp index f38b4870e0edb..f6049eedd0004 100644 --- a/Lib/test/_testcppext.cpp +++ b/Lib/test/_testcppext.cpp @@ -40,6 +40,15 @@ test_api_casts(PyObject *Py_UNUSED(module), PyObject *Py_UNUSED(args)) PyTypeObject *type = Py_TYPE(const_obj); assert(Py_REFCNT(const_obj) >= 1); + struct PyObjectProxy { + PyObject* obj; + operator PyObject *() { return obj; } + } proxy_obj = { obj }; + Py_INCREF(proxy_obj); + Py_DECREF(proxy_obj); + assert(Py_REFCNT(proxy_obj) >= 1); + + assert(type == &PyTuple_Type); assert(PyTuple_GET_SIZE(const_obj) == 2); PyObject *one = PyTuple_GET_ITEM(const_obj, 0); From webhook-mailer at python.org Sat May 21 09:54:05 2022 From: webhook-mailer at python.org (serhiy-storchaka) Date: Sat, 21 May 2022 13:54:05 -0000 Subject: [Python-checkins] [3.11] gh-93044: No longer convert the database argument of sqlite3.connect() to bytes (GH-93046) (GH-93048) Message-ID: https://github.com/python/cpython/commit/d9a48d2b413194f36111aa54df331d60c5bfde3f commit: d9a48d2b413194f36111aa54df331d60c5bfde3f branch: 3.11 author: Serhiy Storchaka committer: serhiy-storchaka date: 2022-05-21T16:53:58+03:00 summary: [3.11] gh-93044: No longer convert the database argument of sqlite3.connect() to bytes (GH-93046) (GH-93048) Just pass it to the factory as is. (cherry picked from commit 14c0d33016a967a98155f2e1615660e9328aef5d) Co-authored-by: Serhiy Storchaka files: A Misc/NEWS.d/next/Library/2022-05-21-13-16-16.gh-issue-93044.eJ_XkZ.rst M Lib/test/test_sqlite3/test_dbapi.py M Modules/_sqlite/clinic/module.c.h M Modules/_sqlite/module.c diff --git a/Lib/test/test_sqlite3/test_dbapi.py b/Lib/test/test_sqlite3/test_dbapi.py index eaba39186e9a7..2949e13e35667 100644 --- a/Lib/test/test_sqlite3/test_dbapi.py +++ b/Lib/test/test_sqlite3/test_dbapi.py @@ -685,6 +685,19 @@ def test_open_uri(self): with managed_connect(f"file:{TESTFN}?mode=ro", uri=True) as cx: cx.execute(self._sql) + def test_factory_database_arg(self): + def factory(database, *args, **kwargs): + nonlocal database_arg + database_arg = database + return sqlite.Connection(":memory:", *args, **kwargs) + + for database in (TESTFN, os.fsencode(TESTFN), + FakePath(TESTFN), FakePath(os.fsencode(TESTFN))): + database_arg = None + with sqlite.connect(database, factory=factory): + pass + self.assertEqual(database_arg, database) + def test_database_keyword(self): with sqlite.connect(database=":memory:") as cx: self.assertEqual(type(cx), sqlite.Connection) diff --git a/Misc/NEWS.d/next/Library/2022-05-21-13-16-16.gh-issue-93044.eJ_XkZ.rst b/Misc/NEWS.d/next/Library/2022-05-21-13-16-16.gh-issue-93044.eJ_XkZ.rst new file mode 100644 index 0000000000000..c9df8676bcdda --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-05-21-13-16-16.gh-issue-93044.eJ_XkZ.rst @@ -0,0 +1,2 @@ +No longer convert the database argument of :func:`sqlite3.connect` to bytes +before passing it to the factory. diff --git a/Modules/_sqlite/clinic/module.c.h b/Modules/_sqlite/clinic/module.c.h index 8f7008adef2b1..b088f4b8cfcd7 100644 --- a/Modules/_sqlite/clinic/module.c.h +++ b/Modules/_sqlite/clinic/module.c.h @@ -43,9 +43,7 @@ pysqlite_connect(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyOb if (!args) { goto exit; } - if (!PyUnicode_FSConverter(args[0], &database)) { - goto exit; - } + database = args[0]; if (!noptargs) { goto skip_optional_pos; } @@ -334,4 +332,4 @@ pysqlite_adapt(PyObject *module, PyObject *const *args, Py_ssize_t nargs) exit: return return_value; } -/*[clinic end generated code: output=d846459943008a9c input=a9049054013a1b77]*/ +/*[clinic end generated code: output=10c4f942dc9f0c79 input=a9049054013a1b77]*/ diff --git a/Modules/_sqlite/module.c b/Modules/_sqlite/module.c index fbc57c7cc739e..3f69427916ab8 100644 --- a/Modules/_sqlite/module.c +++ b/Modules/_sqlite/module.c @@ -46,7 +46,7 @@ module _sqlite3 /*[clinic input] _sqlite3.connect as pysqlite_connect - database: object(converter='PyUnicode_FSConverter') + database: object timeout: double = 5.0 detect_types: int = 0 isolation_level: object = NULL @@ -66,7 +66,7 @@ pysqlite_connect_impl(PyObject *module, PyObject *database, double timeout, int detect_types, PyObject *isolation_level, int check_same_thread, PyObject *factory, int cached_statements, int uri) -/*[clinic end generated code: output=450ac9078b4868bb input=ea6355ba55a78e12]*/ +/*[clinic end generated code: output=450ac9078b4868bb input=e16914663ddf93ce]*/ { if (isolation_level == NULL) { isolation_level = PyUnicode_FromString(""); @@ -81,7 +81,6 @@ pysqlite_connect_impl(PyObject *module, PyObject *database, double timeout, timeout, detect_types, isolation_level, check_same_thread, factory, cached_statements, uri); - Py_DECREF(database); // needed bco. the AC FSConverter Py_DECREF(isolation_level); return res; } From webhook-mailer at python.org Sat May 21 10:38:42 2022 From: webhook-mailer at python.org (serhiy-storchaka) Date: Sat, 21 May 2022 14:38:42 -0000 Subject: [Python-checkins] Improve tests for opening Sqlite by URI (GH-93047) Message-ID: https://github.com/python/cpython/commit/4e2b66489289cfd4db2a02edf173ac03cbb2fffe commit: 4e2b66489289cfd4db2a02edf173ac03cbb2fffe branch: main author: Serhiy Storchaka committer: serhiy-storchaka date: 2022-05-21T17:38:22+03:00 summary: Improve tests for opening Sqlite by URI (GH-93047) * Test with with escaped non-ascii characters * Test read-only open of existing DB. files: M Lib/test/test_sqlite3/test_dbapi.py diff --git a/Lib/test/test_sqlite3/test_dbapi.py b/Lib/test/test_sqlite3/test_dbapi.py index f0c009afe459b..744c4ad8d94e6 100644 --- a/Lib/test/test_sqlite3/test_dbapi.py +++ b/Lib/test/test_sqlite3/test_dbapi.py @@ -661,21 +661,58 @@ def test_open_with_path_like_object(self): @unittest.skipIf(sys.platform == "darwin", "skipped on macOS") @unittest.skipUnless(TESTFN_UNDECODABLE, "only works if there are undecodable paths") def test_open_with_undecodable_path(self): - self.addCleanup(unlink, TESTFN_UNDECODABLE) path = TESTFN_UNDECODABLE - with managed_connect(path) as cx: + self.addCleanup(unlink, path) + with managed_connect(path, in_mem=True) as cx: self.assertTrue(os.path.exists(path)) cx.execute(self._sql) def test_open_uri(self): - with managed_connect(TESTFN) as cx: + path = TESTFN + uri = "file:" + urllib.parse.quote(os.fsencode(path)) + self.assertFalse(os.path.exists(path)) + with managed_connect(uri, uri=True) as cx: + self.assertTrue(os.path.exists(path)) cx.execute(self._sql) - with managed_connect(f"file:{TESTFN}", uri=True) as cx: + + def test_open_unquoted_uri(self): + path = TESTFN + uri = "file:" + path + self.assertFalse(os.path.exists(path)) + with managed_connect(uri, uri=True) as cx: + self.assertTrue(os.path.exists(path)) cx.execute(self._sql) + + def test_open_uri_readonly(self): + path = TESTFN + self.addCleanup(unlink, path) + uri = "file:" + urllib.parse.quote(os.fsencode(path)) + "?mode=ro" + self.assertFalse(os.path.exists(path)) + # Cannot create new DB with self.assertRaises(sqlite.OperationalError): - with managed_connect(f"file:{TESTFN}?mode=ro", uri=True) as cx: + sqlite.connect(uri, uri=True) + self.assertFalse(os.path.exists(path)) + sqlite.connect(path).close() + self.assertTrue(os.path.exists(path)) + # Cannot modify new DB + with managed_connect(uri, uri=True) as cx: + with self.assertRaises(sqlite.OperationalError): cx.execute(self._sql) + @unittest.skipIf(sys.platform == "win32", "skipped on Windows") + @unittest.skipIf(sys.platform == "darwin", "skipped on macOS") + @unittest.skipUnless(TESTFN_UNDECODABLE, "only works if there are undecodable paths") + def test_open_undecodable_uri(self): + path = TESTFN_UNDECODABLE + uri = "file:" + urllib.parse.quote(path) + self.assertFalse(os.path.exists(path)) + try: + with managed_connect(uri, uri=True, in_mem=True) as cx: + self.assertTrue(os.path.exists(path)) + cx.execute(self._sql) + finally: + unlink(path) + def test_factory_database_arg(self): def factory(database, *args, **kwargs): nonlocal database_arg From webhook-mailer at python.org Sat May 21 10:53:04 2022 From: webhook-mailer at python.org (corona10) Date: Sat, 21 May 2022 14:53:04 -0000 Subject: [Python-checkins] [3.11] GH-92898: Make _Py_Cast C++ version compatible with cast operator (gh-92951) (gh-93049) Message-ID: https://github.com/python/cpython/commit/dd923c57252ee90306a6fe7401ffc5a9cdc91485 commit: dd923c57252ee90306a6fe7401ffc5a9cdc91485 branch: 3.11 author: Dong-hee Na committer: corona10 date: 2022-05-21T23:52:45+09:00 summary: [3.11] GH-92898: Make _Py_Cast C++ version compatible with cast operator (gh-92951) (gh-93049) files: M Include/pyport.h M Lib/test/_testcppext.cpp diff --git a/Include/pyport.h b/Include/pyport.h index 614a2789fb078..086ed4204e4ff 100644 --- a/Include/pyport.h +++ b/Include/pyport.h @@ -26,8 +26,32 @@ // _Py_CAST(const PyObject*, expr) fails with a compiler error. #ifdef __cplusplus # define _Py_STATIC_CAST(type, expr) static_cast(expr) -# define _Py_CAST(type, expr) \ - const_cast(reinterpret_cast(expr)) + +extern "C++" { +namespace { +template +inline type _Py_reinterpret_cast_impl(expr_type *expr) { + return reinterpret_cast(expr); +} + +template +inline type _Py_reinterpret_cast_impl(expr_type const *expr) { + return reinterpret_cast(const_cast(expr)); +} + +template +inline type _Py_reinterpret_cast_impl(expr_type &expr) { + return static_cast(expr); +} + +template +inline type _Py_reinterpret_cast_impl(expr_type const &expr) { + return static_cast(const_cast(expr)); +} +} // namespace +} +# define _Py_CAST(type, expr) _Py_reinterpret_cast_impl(expr) + #else # define _Py_STATIC_CAST(type, expr) ((type)(expr)) # define _Py_CAST(type, expr) ((type)(expr)) diff --git a/Lib/test/_testcppext.cpp b/Lib/test/_testcppext.cpp index f38b4870e0edb..f6049eedd0004 100644 --- a/Lib/test/_testcppext.cpp +++ b/Lib/test/_testcppext.cpp @@ -40,6 +40,15 @@ test_api_casts(PyObject *Py_UNUSED(module), PyObject *Py_UNUSED(args)) PyTypeObject *type = Py_TYPE(const_obj); assert(Py_REFCNT(const_obj) >= 1); + struct PyObjectProxy { + PyObject* obj; + operator PyObject *() { return obj; } + } proxy_obj = { obj }; + Py_INCREF(proxy_obj); + Py_DECREF(proxy_obj); + assert(Py_REFCNT(proxy_obj) >= 1); + + assert(type == &PyTuple_Type); assert(PyTuple_GET_SIZE(const_obj) == 2); PyObject *one = PyTuple_GET_ITEM(const_obj, 0); From webhook-mailer at python.org Sat May 21 10:54:14 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Sat, 21 May 2022 14:54:14 -0000 Subject: [Python-checkins] gh-91362: reword pickle docs to account for nested classes (#92429) Message-ID: https://github.com/python/cpython/commit/f9d6c59917435980fbe1b58c57257c45bfed2244 commit: f9d6c59917435980fbe1b58c57257c45bfed2244 branch: main author: Shantanu <12621235+hauntsaninja at users.noreply.github.com> committer: JelleZijlstra date: 2022-05-21T07:54:10-07:00 summary: gh-91362: reword pickle docs to account for nested classes (#92429) Fixes #91362 files: M Doc/library/pickle.rst diff --git a/Doc/library/pickle.rst b/Doc/library/pickle.rst index fa14b64027e8f..41b0f48f4611d 100644 --- a/Doc/library/pickle.rst +++ b/Doc/library/pickle.rst @@ -502,10 +502,10 @@ The following types can be pickled: * tuples, lists, sets, and dictionaries containing only picklable objects; -* functions (built-in and user-defined) defined at the top level of a module - (using :keyword:`def`, not :keyword:`lambda`); +* functions (built-in and user-defined) accessible from the top level of a + module (using :keyword:`def`, not :keyword:`lambda`); -* classes defined at the top level of a module; +* classes accessible from the top level of a module; * instances of such classes whose the result of calling :meth:`__getstate__` is picklable (see section :ref:`pickle-inst` for details). @@ -517,9 +517,9 @@ structure may exceed the maximum recursion depth, a :exc:`RecursionError` will b raised in this case. You can carefully raise this limit with :func:`sys.setrecursionlimit`. -Note that functions (built-in and user-defined) are pickled by fully qualified -name, not by value. [#]_ This means that only the function name is -pickled, along with the name of the module the function is defined in. Neither +Note that functions (built-in and user-defined) are pickled by fully +:term:`qualified name`, not by value. [#]_ This means that only the function name is +pickled, along with the name of the containing module and classes. Neither the function's code, nor any of its function attributes are pickled. Thus the defining module must be importable in the unpickling environment, and the module must contain the named object, otherwise an exception will be raised. [#]_ From webhook-mailer at python.org Sat May 21 11:05:20 2022 From: webhook-mailer at python.org (miss-islington) Date: Sat, 21 May 2022 15:05:20 -0000 Subject: [Python-checkins] Improve tests for opening Sqlite by URI (GH-93047) Message-ID: https://github.com/python/cpython/commit/76b6ed17eab5f0c9d893b8a141269cbfb0de2294 commit: 76b6ed17eab5f0c9d893b8a141269cbfb0de2294 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-21T08:05:13-07:00 summary: Improve tests for opening Sqlite by URI (GH-93047) * Test with with escaped non-ascii characters * Test read-only open of existing DB. (cherry picked from commit 4e2b66489289cfd4db2a02edf173ac03cbb2fffe) Co-authored-by: Serhiy Storchaka files: M Lib/test/test_sqlite3/test_dbapi.py diff --git a/Lib/test/test_sqlite3/test_dbapi.py b/Lib/test/test_sqlite3/test_dbapi.py index 2949e13e35667..07adbc878a8f0 100644 --- a/Lib/test/test_sqlite3/test_dbapi.py +++ b/Lib/test/test_sqlite3/test_dbapi.py @@ -670,21 +670,58 @@ def test_open_with_path_like_object(self): @unittest.skipIf(sys.platform == "darwin", "skipped on macOS") @unittest.skipUnless(TESTFN_UNDECODABLE, "only works if there are undecodable paths") def test_open_with_undecodable_path(self): - self.addCleanup(unlink, TESTFN_UNDECODABLE) path = TESTFN_UNDECODABLE - with managed_connect(path) as cx: + self.addCleanup(unlink, path) + with managed_connect(path, in_mem=True) as cx: self.assertTrue(os.path.exists(path)) cx.execute(self._sql) def test_open_uri(self): - with managed_connect(TESTFN) as cx: + path = TESTFN + uri = "file:" + urllib.parse.quote(os.fsencode(path)) + self.assertFalse(os.path.exists(path)) + with managed_connect(uri, uri=True) as cx: + self.assertTrue(os.path.exists(path)) cx.execute(self._sql) - with managed_connect(f"file:{TESTFN}", uri=True) as cx: + + def test_open_unquoted_uri(self): + path = TESTFN + uri = "file:" + path + self.assertFalse(os.path.exists(path)) + with managed_connect(uri, uri=True) as cx: + self.assertTrue(os.path.exists(path)) cx.execute(self._sql) + + def test_open_uri_readonly(self): + path = TESTFN + self.addCleanup(unlink, path) + uri = "file:" + urllib.parse.quote(os.fsencode(path)) + "?mode=ro" + self.assertFalse(os.path.exists(path)) + # Cannot create new DB with self.assertRaises(sqlite.OperationalError): - with managed_connect(f"file:{TESTFN}?mode=ro", uri=True) as cx: + sqlite.connect(uri, uri=True) + self.assertFalse(os.path.exists(path)) + sqlite.connect(path).close() + self.assertTrue(os.path.exists(path)) + # Cannot modify new DB + with managed_connect(uri, uri=True) as cx: + with self.assertRaises(sqlite.OperationalError): cx.execute(self._sql) + @unittest.skipIf(sys.platform == "win32", "skipped on Windows") + @unittest.skipIf(sys.platform == "darwin", "skipped on macOS") + @unittest.skipUnless(TESTFN_UNDECODABLE, "only works if there are undecodable paths") + def test_open_undecodable_uri(self): + path = TESTFN_UNDECODABLE + uri = "file:" + urllib.parse.quote(path) + self.assertFalse(os.path.exists(path)) + try: + with managed_connect(uri, uri=True, in_mem=True) as cx: + self.assertTrue(os.path.exists(path)) + cx.execute(self._sql) + finally: + unlink(path) + def test_factory_database_arg(self): def factory(database, *args, **kwargs): nonlocal database_arg From webhook-mailer at python.org Sat May 21 11:09:04 2022 From: webhook-mailer at python.org (miss-islington) Date: Sat, 21 May 2022 15:09:04 -0000 Subject: [Python-checkins] gh-91362: reword pickle docs to account for nested classes (GH-92429) Message-ID: https://github.com/python/cpython/commit/09c3dff3ba4c0cd224f8035265a05fbe5953987e commit: 09c3dff3ba4c0cd224f8035265a05fbe5953987e branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-21T08:08:59-07:00 summary: gh-91362: reword pickle docs to account for nested classes (GH-92429) Fixes GH-91362 (cherry picked from commit f9d6c59917435980fbe1b58c57257c45bfed2244) Co-authored-by: Shantanu <12621235+hauntsaninja at users.noreply.github.com> files: M Doc/library/pickle.rst diff --git a/Doc/library/pickle.rst b/Doc/library/pickle.rst index fa14b64027e8f..41b0f48f4611d 100644 --- a/Doc/library/pickle.rst +++ b/Doc/library/pickle.rst @@ -502,10 +502,10 @@ The following types can be pickled: * tuples, lists, sets, and dictionaries containing only picklable objects; -* functions (built-in and user-defined) defined at the top level of a module - (using :keyword:`def`, not :keyword:`lambda`); +* functions (built-in and user-defined) accessible from the top level of a + module (using :keyword:`def`, not :keyword:`lambda`); -* classes defined at the top level of a module; +* classes accessible from the top level of a module; * instances of such classes whose the result of calling :meth:`__getstate__` is picklable (see section :ref:`pickle-inst` for details). @@ -517,9 +517,9 @@ structure may exceed the maximum recursion depth, a :exc:`RecursionError` will b raised in this case. You can carefully raise this limit with :func:`sys.setrecursionlimit`. -Note that functions (built-in and user-defined) are pickled by fully qualified -name, not by value. [#]_ This means that only the function name is -pickled, along with the name of the module the function is defined in. Neither +Note that functions (built-in and user-defined) are pickled by fully +:term:`qualified name`, not by value. [#]_ This means that only the function name is +pickled, along with the name of the containing module and classes. Neither the function's code, nor any of its function attributes are pickled. Thus the defining module must be importable in the unpickling environment, and the module must contain the named object, otherwise an exception will be raised. [#]_ From webhook-mailer at python.org Sat May 21 11:11:00 2022 From: webhook-mailer at python.org (miss-islington) Date: Sat, 21 May 2022 15:11:00 -0000 Subject: [Python-checkins] gh-91362: reword pickle docs to account for nested classes (GH-92429) Message-ID: https://github.com/python/cpython/commit/54b5e4da8a4c6ae527ab238fcd6b9ba0a3ed0fc7 commit: 54b5e4da8a4c6ae527ab238fcd6b9ba0a3ed0fc7 branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-21T08:10:56-07:00 summary: gh-91362: reword pickle docs to account for nested classes (GH-92429) Fixes GH-91362 (cherry picked from commit f9d6c59917435980fbe1b58c57257c45bfed2244) Co-authored-by: Shantanu <12621235+hauntsaninja at users.noreply.github.com> files: M Doc/library/pickle.rst diff --git a/Doc/library/pickle.rst b/Doc/library/pickle.rst index f7db0e8415f4c..920df712ea58f 100644 --- a/Doc/library/pickle.rst +++ b/Doc/library/pickle.rst @@ -502,10 +502,10 @@ The following types can be pickled: * tuples, lists, sets, and dictionaries containing only picklable objects; -* functions (built-in and user-defined) defined at the top level of a module - (using :keyword:`def`, not :keyword:`lambda`); +* functions (built-in and user-defined) accessible from the top level of a + module (using :keyword:`def`, not :keyword:`lambda`); -* classes defined at the top level of a module; +* classes accessible from the top level of a module; * instances of such classes whose :attr:`~object.__dict__` or the result of calling :meth:`__getstate__` is picklable (see section :ref:`pickle-inst` for @@ -518,9 +518,9 @@ structure may exceed the maximum recursion depth, a :exc:`RecursionError` will b raised in this case. You can carefully raise this limit with :func:`sys.setrecursionlimit`. -Note that functions (built-in and user-defined) are pickled by fully qualified -name, not by value. [#]_ This means that only the function name is -pickled, along with the name of the module the function is defined in. Neither +Note that functions (built-in and user-defined) are pickled by fully +:term:`qualified name`, not by value. [#]_ This means that only the function name is +pickled, along with the name of the containing module and classes. Neither the function's code, nor any of its function attributes are pickled. Thus the defining module must be importable in the unpickling environment, and the module must contain the named object, otherwise an exception will be raised. [#]_ From webhook-mailer at python.org Sat May 21 12:06:23 2022 From: webhook-mailer at python.org (serhiy-storchaka) Date: Sat, 21 May 2022 16:06:23 -0000 Subject: [Python-checkins] Clean up the sqlite3 tests (GH-93056) Message-ID: https://github.com/python/cpython/commit/e5d8dbdd304935dbd0631ee9605efb501332f792 commit: e5d8dbdd304935dbd0631ee9605efb501332f792 branch: main author: Serhiy Storchaka committer: serhiy-storchaka date: 2022-05-21T19:06:12+03:00 summary: Clean up the sqlite3 tests (GH-93056) Remove helper managed_connect(). Use memory_database() or contextlib.closing() + addCleanup(unlink) instead. files: M Lib/test/test_sqlite3/test_dbapi.py M Lib/test/test_sqlite3/test_regression.py diff --git a/Lib/test/test_sqlite3/test_dbapi.py b/Lib/test/test_sqlite3/test_dbapi.py index 744c4ad8d94e6..0be40429c9959 100644 --- a/Lib/test/test_sqlite3/test_dbapi.py +++ b/Lib/test/test_sqlite3/test_dbapi.py @@ -36,18 +36,6 @@ from test.support.os_helper import TESTFN, TESTFN_UNDECODABLE, unlink, temp_dir, FakePath -# Helper for tests using TESTFN - at contextlib.contextmanager -def managed_connect(*args, in_mem=False, **kwargs): - cx = sqlite.connect(*args, **kwargs) - try: - yield cx - finally: - cx.close() - if not in_mem: - unlink(TESTFN) - - # Helper for temporary memory databases def memory_database(*args, **kwargs): cx = sqlite.connect(":memory:", *args, **kwargs) @@ -331,7 +319,7 @@ def test_error_code_on_exception(self): @unittest.skipIf(sqlite.sqlite_version_info <= (3, 7, 16), "Requires SQLite 3.7.16 or newer") def test_extended_error_code_on_exception(self): - with managed_connect(":memory:", in_mem=True) as con: + with memory_database() as con: with con: con.execute("create table t(t integer check(t > 0))") errmsg = "constraint failed" @@ -389,7 +377,7 @@ def test_cursor(self): def test_failed_open(self): YOU_CANNOT_OPEN_THIS = "/foo/bar/bla/23534/mydb.db" with self.assertRaises(sqlite.OperationalError): - con = sqlite.connect(YOU_CANNOT_OPEN_THIS) + sqlite.connect(YOU_CANNOT_OPEN_THIS) def test_close(self): self.cx.close() @@ -653,7 +641,9 @@ def test_open_with_path_like_object(self): """ Checks that we can successfully connect to a database using an object that is PathLike, i.e. has __fspath__(). """ path = FakePath(TESTFN) - with managed_connect(path) as cx: + self.addCleanup(unlink, path) + self.assertFalse(os.path.exists(path)) + with contextlib.closing(sqlite.connect(path)) as cx: self.assertTrue(os.path.exists(path)) cx.execute(self._sql) @@ -663,23 +653,26 @@ def test_open_with_path_like_object(self): def test_open_with_undecodable_path(self): path = TESTFN_UNDECODABLE self.addCleanup(unlink, path) - with managed_connect(path, in_mem=True) as cx: + self.assertFalse(os.path.exists(path)) + with contextlib.closing(sqlite.connect(path)) as cx: self.assertTrue(os.path.exists(path)) cx.execute(self._sql) def test_open_uri(self): path = TESTFN + self.addCleanup(unlink, path) uri = "file:" + urllib.parse.quote(os.fsencode(path)) self.assertFalse(os.path.exists(path)) - with managed_connect(uri, uri=True) as cx: + with contextlib.closing(sqlite.connect(uri, uri=True)) as cx: self.assertTrue(os.path.exists(path)) cx.execute(self._sql) def test_open_unquoted_uri(self): path = TESTFN + self.addCleanup(unlink, path) uri = "file:" + path self.assertFalse(os.path.exists(path)) - with managed_connect(uri, uri=True) as cx: + with contextlib.closing(sqlite.connect(uri, uri=True)) as cx: self.assertTrue(os.path.exists(path)) cx.execute(self._sql) @@ -695,7 +688,7 @@ def test_open_uri_readonly(self): sqlite.connect(path).close() self.assertTrue(os.path.exists(path)) # Cannot modify new DB - with managed_connect(uri, uri=True) as cx: + with contextlib.closing(sqlite.connect(uri, uri=True)) as cx: with self.assertRaises(sqlite.OperationalError): cx.execute(self._sql) @@ -704,14 +697,12 @@ def test_open_uri_readonly(self): @unittest.skipUnless(TESTFN_UNDECODABLE, "only works if there are undecodable paths") def test_open_undecodable_uri(self): path = TESTFN_UNDECODABLE + self.addCleanup(unlink, path) uri = "file:" + urllib.parse.quote(path) self.assertFalse(os.path.exists(path)) - try: - with managed_connect(uri, uri=True, in_mem=True) as cx: - self.assertTrue(os.path.exists(path)) - cx.execute(self._sql) - finally: - unlink(path) + with contextlib.closing(sqlite.connect(uri, uri=True)) as cx: + self.assertTrue(os.path.exists(path)) + cx.execute(self._sql) def test_factory_database_arg(self): def factory(database, *args, **kwargs): @@ -722,12 +713,11 @@ def factory(database, *args, **kwargs): for database in (TESTFN, os.fsencode(TESTFN), FakePath(TESTFN), FakePath(os.fsencode(TESTFN))): database_arg = None - with sqlite.connect(database, factory=factory): - pass + sqlite.connect(database, factory=factory).close() self.assertEqual(database_arg, database) def test_database_keyword(self): - with sqlite.connect(database=":memory:") as cx: + with contextlib.closing(sqlite.connect(database=":memory:")) as cx: self.assertEqual(type(cx), sqlite.Connection) diff --git a/Lib/test/test_sqlite3/test_regression.py b/Lib/test/test_sqlite3/test_regression.py index 19bb84bf38a36..0b727cecb0e8c 100644 --- a/Lib/test/test_sqlite3/test_regression.py +++ b/Lib/test/test_sqlite3/test_regression.py @@ -28,7 +28,7 @@ from test import support from unittest.mock import patch -from test.test_sqlite3.test_dbapi import memory_database, managed_connect, cx_limit +from test.test_sqlite3.test_dbapi import memory_database, cx_limit class RegressionTests(unittest.TestCase): @@ -422,7 +422,7 @@ def test_return_empty_bytestring(self): self.assertEqual(val, b'') def test_table_lock_cursor_replace_stmt(self): - with managed_connect(":memory:", in_mem=True) as con: + with memory_database() as con: cur = con.cursor() cur.execute("create table t(t)") cur.executemany("insert into t values(?)", @@ -433,7 +433,7 @@ def test_table_lock_cursor_replace_stmt(self): con.commit() def test_table_lock_cursor_dealloc(self): - with managed_connect(":memory:", in_mem=True) as con: + with memory_database() as con: con.execute("create table t(t)") con.executemany("insert into t values(?)", ((v,) for v in range(5))) @@ -444,7 +444,7 @@ def test_table_lock_cursor_dealloc(self): con.commit() def test_table_lock_cursor_non_readonly_select(self): - with managed_connect(":memory:", in_mem=True) as con: + with memory_database() as con: con.execute("create table t(t)") con.executemany("insert into t values(?)", ((v,) for v in range(5))) @@ -459,7 +459,7 @@ def dup(v): con.commit() def test_executescript_step_through_select(self): - with managed_connect(":memory:", in_mem=True) as con: + with memory_database() as con: values = [(v,) for v in range(5)] with con: con.execute("create table t(t)") From webhook-mailer at python.org Sat May 21 12:37:12 2022 From: webhook-mailer at python.org (miss-islington) Date: Sat, 21 May 2022 16:37:12 -0000 Subject: [Python-checkins] Clean up the sqlite3 tests (GH-93056) Message-ID: https://github.com/python/cpython/commit/748c83d96da735f8210167d676469860d4e11b80 commit: 748c83d96da735f8210167d676469860d4e11b80 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-21T09:37:04-07:00 summary: Clean up the sqlite3 tests (GH-93056) Remove helper managed_connect(). Use memory_database() or contextlib.closing() + addCleanup(unlink) instead. (cherry picked from commit e5d8dbdd304935dbd0631ee9605efb501332f792) Co-authored-by: Serhiy Storchaka files: M Lib/test/test_sqlite3/test_dbapi.py M Lib/test/test_sqlite3/test_regression.py diff --git a/Lib/test/test_sqlite3/test_dbapi.py b/Lib/test/test_sqlite3/test_dbapi.py index 07adbc878a8f0..a7783f3066369 100644 --- a/Lib/test/test_sqlite3/test_dbapi.py +++ b/Lib/test/test_sqlite3/test_dbapi.py @@ -36,18 +36,6 @@ from test.support.os_helper import TESTFN, TESTFN_UNDECODABLE, unlink, temp_dir, FakePath -# Helper for tests using TESTFN - at contextlib.contextmanager -def managed_connect(*args, in_mem=False, **kwargs): - cx = sqlite.connect(*args, **kwargs) - try: - yield cx - finally: - cx.close() - if not in_mem: - unlink(TESTFN) - - # Helper for temporary memory databases def memory_database(*args, **kwargs): cx = sqlite.connect(":memory:", *args, **kwargs) @@ -331,7 +319,7 @@ def test_error_code_on_exception(self): @unittest.skipIf(sqlite.sqlite_version_info <= (3, 7, 16), "Requires SQLite 3.7.16 or newer") def test_extended_error_code_on_exception(self): - with managed_connect(":memory:", in_mem=True) as con: + with memory_database() as con: with con: con.execute("create table t(t integer check(t > 0))") errmsg = "constraint failed" @@ -398,7 +386,7 @@ def test_cursor(self): def test_failed_open(self): YOU_CANNOT_OPEN_THIS = "/foo/bar/bla/23534/mydb.db" with self.assertRaises(sqlite.OperationalError): - con = sqlite.connect(YOU_CANNOT_OPEN_THIS) + sqlite.connect(YOU_CANNOT_OPEN_THIS) def test_close(self): self.cx.close() @@ -662,7 +650,9 @@ def test_open_with_path_like_object(self): """ Checks that we can successfully connect to a database using an object that is PathLike, i.e. has __fspath__(). """ path = FakePath(TESTFN) - with managed_connect(path) as cx: + self.addCleanup(unlink, path) + self.assertFalse(os.path.exists(path)) + with contextlib.closing(sqlite.connect(path)) as cx: self.assertTrue(os.path.exists(path)) cx.execute(self._sql) @@ -672,23 +662,26 @@ def test_open_with_path_like_object(self): def test_open_with_undecodable_path(self): path = TESTFN_UNDECODABLE self.addCleanup(unlink, path) - with managed_connect(path, in_mem=True) as cx: + self.assertFalse(os.path.exists(path)) + with contextlib.closing(sqlite.connect(path)) as cx: self.assertTrue(os.path.exists(path)) cx.execute(self._sql) def test_open_uri(self): path = TESTFN + self.addCleanup(unlink, path) uri = "file:" + urllib.parse.quote(os.fsencode(path)) self.assertFalse(os.path.exists(path)) - with managed_connect(uri, uri=True) as cx: + with contextlib.closing(sqlite.connect(uri, uri=True)) as cx: self.assertTrue(os.path.exists(path)) cx.execute(self._sql) def test_open_unquoted_uri(self): path = TESTFN + self.addCleanup(unlink, path) uri = "file:" + path self.assertFalse(os.path.exists(path)) - with managed_connect(uri, uri=True) as cx: + with contextlib.closing(sqlite.connect(uri, uri=True)) as cx: self.assertTrue(os.path.exists(path)) cx.execute(self._sql) @@ -704,7 +697,7 @@ def test_open_uri_readonly(self): sqlite.connect(path).close() self.assertTrue(os.path.exists(path)) # Cannot modify new DB - with managed_connect(uri, uri=True) as cx: + with contextlib.closing(sqlite.connect(uri, uri=True)) as cx: with self.assertRaises(sqlite.OperationalError): cx.execute(self._sql) @@ -713,14 +706,12 @@ def test_open_uri_readonly(self): @unittest.skipUnless(TESTFN_UNDECODABLE, "only works if there are undecodable paths") def test_open_undecodable_uri(self): path = TESTFN_UNDECODABLE + self.addCleanup(unlink, path) uri = "file:" + urllib.parse.quote(path) self.assertFalse(os.path.exists(path)) - try: - with managed_connect(uri, uri=True, in_mem=True) as cx: - self.assertTrue(os.path.exists(path)) - cx.execute(self._sql) - finally: - unlink(path) + with contextlib.closing(sqlite.connect(uri, uri=True)) as cx: + self.assertTrue(os.path.exists(path)) + cx.execute(self._sql) def test_factory_database_arg(self): def factory(database, *args, **kwargs): @@ -731,12 +722,11 @@ def factory(database, *args, **kwargs): for database in (TESTFN, os.fsencode(TESTFN), FakePath(TESTFN), FakePath(os.fsencode(TESTFN))): database_arg = None - with sqlite.connect(database, factory=factory): - pass + sqlite.connect(database, factory=factory).close() self.assertEqual(database_arg, database) def test_database_keyword(self): - with sqlite.connect(database=":memory:") as cx: + with contextlib.closing(sqlite.connect(database=":memory:")) as cx: self.assertEqual(type(cx), sqlite.Connection) diff --git a/Lib/test/test_sqlite3/test_regression.py b/Lib/test/test_sqlite3/test_regression.py index 19bb84bf38a36..0b727cecb0e8c 100644 --- a/Lib/test/test_sqlite3/test_regression.py +++ b/Lib/test/test_sqlite3/test_regression.py @@ -28,7 +28,7 @@ from test import support from unittest.mock import patch -from test.test_sqlite3.test_dbapi import memory_database, managed_connect, cx_limit +from test.test_sqlite3.test_dbapi import memory_database, cx_limit class RegressionTests(unittest.TestCase): @@ -422,7 +422,7 @@ def test_return_empty_bytestring(self): self.assertEqual(val, b'') def test_table_lock_cursor_replace_stmt(self): - with managed_connect(":memory:", in_mem=True) as con: + with memory_database() as con: cur = con.cursor() cur.execute("create table t(t)") cur.executemany("insert into t values(?)", @@ -433,7 +433,7 @@ def test_table_lock_cursor_replace_stmt(self): con.commit() def test_table_lock_cursor_dealloc(self): - with managed_connect(":memory:", in_mem=True) as con: + with memory_database() as con: con.execute("create table t(t)") con.executemany("insert into t values(?)", ((v,) for v in range(5))) @@ -444,7 +444,7 @@ def test_table_lock_cursor_dealloc(self): con.commit() def test_table_lock_cursor_non_readonly_select(self): - with managed_connect(":memory:", in_mem=True) as con: + with memory_database() as con: con.execute("create table t(t)") con.executemany("insert into t values(?)", ((v,) for v in range(5))) @@ -459,7 +459,7 @@ def dup(v): con.commit() def test_executescript_step_through_select(self): - with managed_connect(":memory:", in_mem=True) as con: + with memory_database() as con: values = [(v,) for v in range(5)] with con: con.execute("create table t(t)") From webhook-mailer at python.org Sun May 22 18:55:21 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Sun, 22 May 2022 22:55:21 -0000 Subject: [Python-checkins] termios docs: fix indentation (#93080) Message-ID: https://github.com/python/cpython/commit/ea5918e932a441aef8c22acfdcfa6345ec32d1a8 commit: ea5918e932a441aef8c22acfdcfa6345ec32d1a8 branch: main author: Jelle Zijlstra committer: JelleZijlstra date: 2022-05-22T15:55:11-07:00 summary: termios docs: fix indentation (#93080) files: M Doc/library/termios.rst diff --git a/Doc/library/termios.rst b/Doc/library/termios.rst index 3b0cb60f87452..fb1ff567d49e5 100644 --- a/Doc/library/termios.rst +++ b/Doc/library/termios.rst @@ -85,11 +85,11 @@ The module defines the following functions: .. function:: tcsetwinsize(fd, winsize) - Set the tty window size for file descriptor *fd* from *winsize*, which is - a two-item tuple ``(ws_row, ws_col)`` like the one returned by - :func:`tcgetwinsize`. Requires at least one of the pairs - (:const:`termios.TIOCGWINSZ`, :const:`termios.TIOCSWINSZ`); - (:const:`termios.TIOCGSIZE`, :const:`termios.TIOCSSIZE`) to be defined. + Set the tty window size for file descriptor *fd* from *winsize*, which is + a two-item tuple ``(ws_row, ws_col)`` like the one returned by + :func:`tcgetwinsize`. Requires at least one of the pairs + (:const:`termios.TIOCGWINSZ`, :const:`termios.TIOCSWINSZ`); + (:const:`termios.TIOCGSIZE`, :const:`termios.TIOCSSIZE`) to be defined. .. versionadded:: 3.11 From webhook-mailer at python.org Sun May 22 19:11:43 2022 From: webhook-mailer at python.org (miss-islington) Date: Sun, 22 May 2022 23:11:43 -0000 Subject: [Python-checkins] termios docs: fix indentation (GH-93080) Message-ID: https://github.com/python/cpython/commit/a86ad12399c33086fae2490ee26814ccd07ee6af commit: a86ad12399c33086fae2490ee26814ccd07ee6af branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-22T16:11:36-07:00 summary: termios docs: fix indentation (GH-93080) (cherry picked from commit ea5918e932a441aef8c22acfdcfa6345ec32d1a8) Co-authored-by: Jelle Zijlstra files: M Doc/library/termios.rst diff --git a/Doc/library/termios.rst b/Doc/library/termios.rst index 3b0cb60f87452..fb1ff567d49e5 100644 --- a/Doc/library/termios.rst +++ b/Doc/library/termios.rst @@ -85,11 +85,11 @@ The module defines the following functions: .. function:: tcsetwinsize(fd, winsize) - Set the tty window size for file descriptor *fd* from *winsize*, which is - a two-item tuple ``(ws_row, ws_col)`` like the one returned by - :func:`tcgetwinsize`. Requires at least one of the pairs - (:const:`termios.TIOCGWINSZ`, :const:`termios.TIOCSWINSZ`); - (:const:`termios.TIOCGSIZE`, :const:`termios.TIOCSSIZE`) to be defined. + Set the tty window size for file descriptor *fd* from *winsize*, which is + a two-item tuple ``(ws_row, ws_col)`` like the one returned by + :func:`tcgetwinsize`. Requires at least one of the pairs + (:const:`termios.TIOCGWINSZ`, :const:`termios.TIOCSWINSZ`); + (:const:`termios.TIOCGSIZE`, :const:`termios.TIOCSSIZE`) to be defined. .. versionadded:: 3.11 From webhook-mailer at python.org Sun May 22 21:48:39 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Mon, 23 May 2022 01:48:39 -0000 Subject: [Python-checkins] binascii docs: strict_mode parameter is keyword-only (#93055) Message-ID: https://github.com/python/cpython/commit/ac718d357af6aa42240e88add3ac348e1aebcfc2 commit: ac718d357af6aa42240e88add3ac348e1aebcfc2 branch: main author: Jelle Zijlstra committer: JelleZijlstra date: 2022-05-22T18:48:17-07:00 summary: binascii docs: strict_mode parameter is keyword-only (#93055) See https://github.com/python/cpython/commit/35b98e38b6edd63153fc8e092f94cb20725dacc1 Co-authored-by: Adam Turner <9087854+AA-Turner at users.noreply.github.com> files: M Doc/library/binascii.rst diff --git a/Doc/library/binascii.rst b/Doc/library/binascii.rst index 4417a5ac38251..5a0815faa38ea 100644 --- a/Doc/library/binascii.rst +++ b/Doc/library/binascii.rst @@ -49,7 +49,7 @@ The :mod:`binascii` module defines the following functions: Added the *backtick* parameter. -.. function:: a2b_base64(string, strict_mode=False) +.. function:: a2b_base64(string, /, *, strict_mode=False) Convert a block of base64 data back to binary and return the binary data. More than one line may be passed at a time. From webhook-mailer at python.org Sun May 22 21:52:24 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Mon, 23 May 2022 01:52:24 -0000 Subject: [Python-checkins] gh-73137: Added sub-subsection headers for flags in re (#93000) Message-ID: https://github.com/python/cpython/commit/b7a6610bc88dfecdd943e8d2817f7cd6b85fb740 commit: b7a6610bc88dfecdd943e8d2817f7cd6b85fb740 branch: main author: Stanley <46876382+slateny at users.noreply.github.com> committer: JelleZijlstra date: 2022-05-22T18:52:17-07:00 summary: gh-73137: Added sub-subsection headers for flags in re (#93000) Fixes #73137 files: M Doc/library/re.rst diff --git a/Doc/library/re.rst b/Doc/library/re.rst index 19b18b9f4df2a..d099f383d1206 100644 --- a/Doc/library/re.rst +++ b/Doc/library/re.rst @@ -667,40 +667,14 @@ functions are simplified versions of the full featured methods for compiled regular expressions. Most non-trivial applications always use the compiled form. + +Flags +^^^^^ + .. versionchanged:: 3.6 Flag constants are now instances of :class:`RegexFlag`, which is a subclass of :class:`enum.IntFlag`. -.. function:: compile(pattern, flags=0) - - Compile a regular expression pattern into a :ref:`regular expression object - `, which can be used for matching using its - :func:`~Pattern.match`, :func:`~Pattern.search` and other methods, described - below. - - The expression's behaviour can be modified by specifying a *flags* value. - Values can be any of the following variables, combined using bitwise OR (the - ``|`` operator). - - The sequence :: - - prog = re.compile(pattern) - result = prog.match(string) - - is equivalent to :: - - result = re.match(pattern, string) - - but using :func:`re.compile` and saving the resulting regular expression - object for reuse is more efficient when the expression will be used several - times in a single program. - - .. note:: - - The compiled versions of the most recent patterns passed to - :func:`re.compile` and the module-level matching functions are cached, so - programs that use only a few regular expressions at a time needn't worry - about compiling regular expressions. .. class:: RegexFlag @@ -825,6 +799,41 @@ form. Corresponds to the inline flag ``(?x)``. +Functions +^^^^^^^^^ + +.. function:: compile(pattern, flags=0) + + Compile a regular expression pattern into a :ref:`regular expression object + `, which can be used for matching using its + :func:`~Pattern.match`, :func:`~Pattern.search` and other methods, described + below. + + The expression's behaviour can be modified by specifying a *flags* value. + Values can be any of the following variables, combined using bitwise OR (the + ``|`` operator). + + The sequence :: + + prog = re.compile(pattern) + result = prog.match(string) + + is equivalent to :: + + result = re.match(pattern, string) + + but using :func:`re.compile` and saving the resulting regular expression + object for reuse is more efficient when the expression will be used several + times in a single program. + + .. note:: + + The compiled versions of the most recent patterns passed to + :func:`re.compile` and the module-level matching functions are cached, so + programs that use only a few regular expressions at a time needn't worry + about compiling regular expressions. + + .. function:: search(pattern, string, flags=0) Scan through *string* looking for the first location where the regular expression @@ -1061,6 +1070,9 @@ form. Clear the regular expression cache. +Exceptions +^^^^^^^^^^ + .. exception:: error(msg, pattern=None, pos=None) Exception raised when a string passed to one of the functions here is not a From webhook-mailer at python.org Sun May 22 21:53:31 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Mon, 23 May 2022 01:53:31 -0000 Subject: [Python-checkins] gh-92994: Clarify importlib "check" example (#92995) Message-ID: https://github.com/python/cpython/commit/e39cd765610c9099da3b5595186ad16223b670b0 commit: e39cd765610c9099da3b5595186ad16223b670b0 branch: main author: Shantanu <12621235+hauntsaninja at users.noreply.github.com> committer: JelleZijlstra date: 2022-05-22T18:53:24-07:00 summary: gh-92994: Clarify importlib "check" example (#92995) Fixes #92994 files: M Doc/library/importlib.rst diff --git a/Doc/library/importlib.rst b/Doc/library/importlib.rst index f19532213940e..aac556e2c68d9 100644 --- a/Doc/library/importlib.rst +++ b/Doc/library/importlib.rst @@ -1250,6 +1250,9 @@ Checking if a module can be imported If you need to find out if a module can be imported without actually doing the import, then you should use :func:`importlib.util.find_spec`. + +Note that if ``name`` is a submodule (contains a dot), +:func:`importlib.util.find_spec` will import the parent module. :: import importlib.util From webhook-mailer at python.org Sun May 22 21:54:32 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Mon, 23 May 2022 01:54:32 -0000 Subject: [Python-checkins] gh-91061: also accept pathlib.Path for winsound.PlaySound (#91489) Message-ID: https://github.com/python/cpython/commit/9bc616cb4cd0610c21611554b50791f4d4c850e8 commit: 9bc616cb4cd0610c21611554b50791f4d4c850e8 branch: main author: Mori Bellamy committer: JelleZijlstra date: 2022-05-22T18:54:24-07:00 summary: gh-91061: also accept pathlib.Path for winsound.PlaySound (#91489) Fixes #91061 Co-authored-by: Jelle Zijlstra files: A Misc/NEWS.d/next/Windows/2022-04-12-18-35-20.gh-issue-91061.x40hSK.rst M Lib/test/test_winsound.py M PC/winsound.c diff --git a/Lib/test/test_winsound.py b/Lib/test/test_winsound.py index 3c3359b9004fd..a59d0d24f5db4 100644 --- a/Lib/test/test_winsound.py +++ b/Lib/test/test_winsound.py @@ -1,6 +1,7 @@ # Ridiculously simple test of the winsound module for Windows. import functools +import pathlib import time import unittest @@ -84,6 +85,13 @@ def test_keyword_args(self): safe_MessageBeep(type=winsound.MB_OK) +# A class for testing winsound when the given path resolves +# to bytes rather than str. +class BytesPath(pathlib.WindowsPath): + def __fspath__(self): + return bytes(super().__fspath__(), 'UTF-8') + + class PlaySoundTest(unittest.TestCase): def test_errors(self): @@ -116,6 +124,20 @@ def test_snd_filename(self): fn = support.findfile('pluck-pcm8.wav', subdir='audiodata') safe_PlaySound(fn, winsound.SND_FILENAME | winsound.SND_NODEFAULT) + def test_snd_filepath(self): + fn = support.findfile('pluck-pcm8.wav', subdir='audiodata') + path = pathlib.Path(fn) + safe_PlaySound(path, winsound.SND_FILENAME | winsound.SND_NODEFAULT) + + def test_snd_filepath_as_bytes(self): + fn = support.findfile('pluck-pcm8.wav', subdir='audiodata') + self.assertRaises( + TypeError, + winsound.PlaySound, + BytesPath(fn), + winsound.SND_FILENAME | winsound.SND_NODEFAULT + ) + def test_aliases(self): aliases = [ "SystemAsterisk", diff --git a/Misc/NEWS.d/next/Windows/2022-04-12-18-35-20.gh-issue-91061.x40hSK.rst b/Misc/NEWS.d/next/Windows/2022-04-12-18-35-20.gh-issue-91061.x40hSK.rst new file mode 100644 index 0000000000000..aadc303442025 --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2022-04-12-18-35-20.gh-issue-91061.x40hSK.rst @@ -0,0 +1 @@ +Accept os.PathLike for the argument to winsound.PlaySound diff --git a/PC/winsound.c b/PC/winsound.c index fd04e1e55b5fc..65025ddc5e1f5 100644 --- a/PC/winsound.c +++ b/PC/winsound.c @@ -94,17 +94,25 @@ winsound_PlaySound_impl(PyObject *module, PyObject *sound, int flags) return NULL; } wsound = (wchar_t *)view.buf; + } else if (PyBytes_Check(sound)) { + PyErr_Format(PyExc_TypeError, + "'sound' must be str, os.PathLike, or None, not '%s'", + Py_TYPE(sound)->tp_name); + return NULL; } else { - if (!PyUnicode_Check(sound)) { + PyObject *obj = PyOS_FSPath(sound); + // Either is unicode/bytes/NULL, or a helpful message + // has been surfaced to the user about how they gave a non-path. + if (obj == NULL) return NULL; + if (PyBytes_Check(obj)) { PyErr_Format(PyExc_TypeError, - "'sound' must be str or None, not '%s'", - Py_TYPE(sound)->tp_name); - return NULL; - } - wsound = PyUnicode_AsWideCharString(sound, NULL); - if (wsound == NULL) { + "'sound' must resolve to str, not bytes"); + Py_DECREF(obj); return NULL; } + wsound = PyUnicode_AsWideCharString(obj, NULL); + Py_DECREF(obj); + if (wsound == NULL) return NULL; } From webhook-mailer at python.org Sun May 22 22:05:13 2022 From: webhook-mailer at python.org (miss-islington) Date: Mon, 23 May 2022 02:05:13 -0000 Subject: [Python-checkins] binascii docs: strict_mode parameter is keyword-only (GH-93055) Message-ID: https://github.com/python/cpython/commit/25334ca0820695b2bd3cbbb654e74dc1dbeb9997 commit: 25334ca0820695b2bd3cbbb654e74dc1dbeb9997 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-22T19:05:09-07:00 summary: binascii docs: strict_mode parameter is keyword-only (GH-93055) See https://github.com/python/cpython/commit/35b98e38b6edd63153fc8e092f94cb20725dacc1 Co-authored-by: Adam Turner <9087854+AA-Turner at users.noreply.github.com> (cherry picked from commit ac718d357af6aa42240e88add3ac348e1aebcfc2) Co-authored-by: Jelle Zijlstra files: M Doc/library/binascii.rst diff --git a/Doc/library/binascii.rst b/Doc/library/binascii.rst index 4417a5ac38251..5a0815faa38ea 100644 --- a/Doc/library/binascii.rst +++ b/Doc/library/binascii.rst @@ -49,7 +49,7 @@ The :mod:`binascii` module defines the following functions: Added the *backtick* parameter. -.. function:: a2b_base64(string, strict_mode=False) +.. function:: a2b_base64(string, /, *, strict_mode=False) Convert a block of base64 data back to binary and return the binary data. More than one line may be passed at a time. From webhook-mailer at python.org Sun May 22 22:06:58 2022 From: webhook-mailer at python.org (miss-islington) Date: Mon, 23 May 2022 02:06:58 -0000 Subject: [Python-checkins] gh-73137: Added sub-subsection headers for flags in re (GH-93000) Message-ID: https://github.com/python/cpython/commit/619a67cc0675556065d7bb137727c029fff7d5f8 commit: 619a67cc0675556065d7bb137727c029fff7d5f8 branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-22T19:06:54-07:00 summary: gh-73137: Added sub-subsection headers for flags in re (GH-93000) Fixes GH-73137 (cherry picked from commit b7a6610bc88dfecdd943e8d2817f7cd6b85fb740) Co-authored-by: Stanley <46876382+slateny at users.noreply.github.com> files: M Doc/library/re.rst diff --git a/Doc/library/re.rst b/Doc/library/re.rst index b12ce4b9744f9..fd12241312211 100644 --- a/Doc/library/re.rst +++ b/Doc/library/re.rst @@ -602,40 +602,14 @@ functions are simplified versions of the full featured methods for compiled regular expressions. Most non-trivial applications always use the compiled form. + +Flags +^^^^^ + .. versionchanged:: 3.6 Flag constants are now instances of :class:`RegexFlag`, which is a subclass of :class:`enum.IntFlag`. -.. function:: compile(pattern, flags=0) - - Compile a regular expression pattern into a :ref:`regular expression object - `, which can be used for matching using its - :func:`~Pattern.match`, :func:`~Pattern.search` and other methods, described - below. - - The expression's behaviour can be modified by specifying a *flags* value. - Values can be any of the following variables, combined using bitwise OR (the - ``|`` operator). - - The sequence :: - - prog = re.compile(pattern) - result = prog.match(string) - - is equivalent to :: - - result = re.match(pattern, string) - - but using :func:`re.compile` and saving the resulting regular expression - object for reuse is more efficient when the expression will be used several - times in a single program. - - .. note:: - - The compiled versions of the most recent patterns passed to - :func:`re.compile` and the module-level matching functions are cached, so - programs that use only a few regular expressions at a time needn't worry - about compiling regular expressions. .. data:: A @@ -744,6 +718,41 @@ form. Corresponds to the inline flag ``(?x)``. +Functions +^^^^^^^^^ + +.. function:: compile(pattern, flags=0) + + Compile a regular expression pattern into a :ref:`regular expression object + `, which can be used for matching using its + :func:`~Pattern.match`, :func:`~Pattern.search` and other methods, described + below. + + The expression's behaviour can be modified by specifying a *flags* value. + Values can be any of the following variables, combined using bitwise OR (the + ``|`` operator). + + The sequence :: + + prog = re.compile(pattern) + result = prog.match(string) + + is equivalent to :: + + result = re.match(pattern, string) + + but using :func:`re.compile` and saving the resulting regular expression + object for reuse is more efficient when the expression will be used several + times in a single program. + + .. note:: + + The compiled versions of the most recent patterns passed to + :func:`re.compile` and the module-level matching functions are cached, so + programs that use only a few regular expressions at a time needn't worry + about compiling regular expressions. + + .. function:: search(pattern, string, flags=0) Scan through *string* looking for the first location where the regular expression @@ -975,6 +984,9 @@ form. Clear the regular expression cache. +Exceptions +^^^^^^^^^^ + .. exception:: error(msg, pattern=None, pos=None) Exception raised when a string passed to one of the functions here is not a From webhook-mailer at python.org Sun May 22 22:11:11 2022 From: webhook-mailer at python.org (miss-islington) Date: Mon, 23 May 2022 02:11:11 -0000 Subject: [Python-checkins] gh-92994: Clarify importlib "check" example (GH-92995) Message-ID: https://github.com/python/cpython/commit/247e059de34ce8117bc4dd7b143f2582c9115f95 commit: 247e059de34ce8117bc4dd7b143f2582c9115f95 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-22T19:10:57-07:00 summary: gh-92994: Clarify importlib "check" example (GH-92995) Fixes GH-92994 (cherry picked from commit e39cd765610c9099da3b5595186ad16223b670b0) Co-authored-by: Shantanu <12621235+hauntsaninja at users.noreply.github.com> files: M Doc/library/importlib.rst diff --git a/Doc/library/importlib.rst b/Doc/library/importlib.rst index f19532213940e..aac556e2c68d9 100644 --- a/Doc/library/importlib.rst +++ b/Doc/library/importlib.rst @@ -1250,6 +1250,9 @@ Checking if a module can be imported If you need to find out if a module can be imported without actually doing the import, then you should use :func:`importlib.util.find_spec`. + +Note that if ``name`` is a submodule (contains a dot), +:func:`importlib.util.find_spec` will import the parent module. :: import importlib.util From webhook-mailer at python.org Sun May 22 22:12:03 2022 From: webhook-mailer at python.org (miss-islington) Date: Mon, 23 May 2022 02:12:03 -0000 Subject: [Python-checkins] gh-92994: Clarify importlib "check" example (GH-92995) Message-ID: https://github.com/python/cpython/commit/936eefcb820a02e6fad3c8128e89494e6b958717 commit: 936eefcb820a02e6fad3c8128e89494e6b958717 branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-22T19:11:58-07:00 summary: gh-92994: Clarify importlib "check" example (GH-92995) Fixes GH-92994 (cherry picked from commit e39cd765610c9099da3b5595186ad16223b670b0) Co-authored-by: Shantanu <12621235+hauntsaninja at users.noreply.github.com> files: M Doc/library/importlib.rst diff --git a/Doc/library/importlib.rst b/Doc/library/importlib.rst index c9fb63b75a471..85c23472e2756 100644 --- a/Doc/library/importlib.rst +++ b/Doc/library/importlib.rst @@ -1749,6 +1749,9 @@ Checking if a module can be imported If you need to find out if a module can be imported without actually doing the import, then you should use :func:`importlib.util.find_spec`. + +Note that if ``name`` is a submodule (contains a dot), +:func:`importlib.util.find_spec` will import the parent module. :: import importlib.util From webhook-mailer at python.org Sun May 22 22:14:15 2022 From: webhook-mailer at python.org (miss-islington) Date: Mon, 23 May 2022 02:14:15 -0000 Subject: [Python-checkins] gh-73137: Added sub-subsection headers for flags in re (GH-93000) Message-ID: https://github.com/python/cpython/commit/83aa0d1822032288b63e689e8740da68caed32c6 commit: 83aa0d1822032288b63e689e8740da68caed32c6 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-22T19:14:11-07:00 summary: gh-73137: Added sub-subsection headers for flags in re (GH-93000) Fixes GH-73137 (cherry picked from commit b7a6610bc88dfecdd943e8d2817f7cd6b85fb740) Co-authored-by: Stanley <46876382+slateny at users.noreply.github.com> files: M Doc/library/re.rst diff --git a/Doc/library/re.rst b/Doc/library/re.rst index 61b5c805ee2d4..2af86d22d4598 100644 --- a/Doc/library/re.rst +++ b/Doc/library/re.rst @@ -665,40 +665,14 @@ functions are simplified versions of the full featured methods for compiled regular expressions. Most non-trivial applications always use the compiled form. + +Flags +^^^^^ + .. versionchanged:: 3.6 Flag constants are now instances of :class:`RegexFlag`, which is a subclass of :class:`enum.IntFlag`. -.. function:: compile(pattern, flags=0) - - Compile a regular expression pattern into a :ref:`regular expression object - `, which can be used for matching using its - :func:`~Pattern.match`, :func:`~Pattern.search` and other methods, described - below. - - The expression's behaviour can be modified by specifying a *flags* value. - Values can be any of the following variables, combined using bitwise OR (the - ``|`` operator). - - The sequence :: - - prog = re.compile(pattern) - result = prog.match(string) - - is equivalent to :: - - result = re.match(pattern, string) - - but using :func:`re.compile` and saving the resulting regular expression - object for reuse is more efficient when the expression will be used several - times in a single program. - - .. note:: - - The compiled versions of the most recent patterns passed to - :func:`re.compile` and the module-level matching functions are cached, so - programs that use only a few regular expressions at a time needn't worry - about compiling regular expressions. .. class:: RegexFlag @@ -823,6 +797,41 @@ form. Corresponds to the inline flag ``(?x)``. +Functions +^^^^^^^^^ + +.. function:: compile(pattern, flags=0) + + Compile a regular expression pattern into a :ref:`regular expression object + `, which can be used for matching using its + :func:`~Pattern.match`, :func:`~Pattern.search` and other methods, described + below. + + The expression's behaviour can be modified by specifying a *flags* value. + Values can be any of the following variables, combined using bitwise OR (the + ``|`` operator). + + The sequence :: + + prog = re.compile(pattern) + result = prog.match(string) + + is equivalent to :: + + result = re.match(pattern, string) + + but using :func:`re.compile` and saving the resulting regular expression + object for reuse is more efficient when the expression will be used several + times in a single program. + + .. note:: + + The compiled versions of the most recent patterns passed to + :func:`re.compile` and the module-level matching functions are cached, so + programs that use only a few regular expressions at a time needn't worry + about compiling regular expressions. + + .. function:: search(pattern, string, flags=0) Scan through *string* looking for the first location where the regular expression @@ -1058,6 +1067,9 @@ form. Clear the regular expression cache. +Exceptions +^^^^^^^^^^ + .. exception:: error(msg, pattern=None, pos=None) Exception raised when a string passed to one of the functions here is not a From webhook-mailer at python.org Mon May 23 00:58:40 2022 From: webhook-mailer at python.org (terryjreedy) Date: Mon, 23 May 2022 04:58:40 -0000 Subject: [Python-checkins] gh-89158: Add some REPL secondary prompt markers (#93073) Message-ID: https://github.com/python/cpython/commit/88f0d0c1e8fdda036f3f64b0048911ba28ce7f06 commit: 88f0d0c1e8fdda036f3f64b0048911ba28ce7f06 branch: main author: Nicolas Haller committer: terryjreedy date: 2022-05-23T00:58:07-04:00 summary: gh-89158: Add some REPL secondary prompt markers (#93073) This fixes an issue on tutorial/classes.rst section 9.4 where the example "class Warehouse" was truncated when pressing the >>> button to hide the prompts and output. files: M Doc/tutorial/classes.rst diff --git a/Doc/tutorial/classes.rst b/Doc/tutorial/classes.rst index f44cb0b4e905a..58b06eb5f2535 100644 --- a/Doc/tutorial/classes.rst +++ b/Doc/tutorial/classes.rst @@ -479,9 +479,9 @@ If the same attribute name occurs in both an instance and in a class, then attribute lookup prioritizes the instance:: >>> class Warehouse: - purpose = 'storage' - region = 'west' - + ... purpose = 'storage' + ... region = 'west' + ... >>> w1 = Warehouse() >>> print(w1.purpose, w1.region) storage west From webhook-mailer at python.org Mon May 23 01:17:24 2022 From: webhook-mailer at python.org (miss-islington) Date: Mon, 23 May 2022 05:17:24 -0000 Subject: [Python-checkins] gh-89158: Add some REPL secondary prompt markers (GH-93073) Message-ID: https://github.com/python/cpython/commit/c8f1095e0a13c943eeca50802887fce4a9a7decc commit: c8f1095e0a13c943eeca50802887fce4a9a7decc branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-22T22:17:15-07:00 summary: gh-89158: Add some REPL secondary prompt markers (GH-93073) This fixes an issue on tutorial/classes.rst section 9.4 where the example "class Warehouse" was truncated when pressing the >>> button to hide the prompts and output. (cherry picked from commit 88f0d0c1e8fdda036f3f64b0048911ba28ce7f06) Co-authored-by: Nicolas Haller files: M Doc/tutorial/classes.rst diff --git a/Doc/tutorial/classes.rst b/Doc/tutorial/classes.rst index f44cb0b4e905a..58b06eb5f2535 100644 --- a/Doc/tutorial/classes.rst +++ b/Doc/tutorial/classes.rst @@ -479,9 +479,9 @@ If the same attribute name occurs in both an instance and in a class, then attribute lookup prioritizes the instance:: >>> class Warehouse: - purpose = 'storage' - region = 'west' - + ... purpose = 'storage' + ... region = 'west' + ... >>> w1 = Warehouse() >>> print(w1.purpose, w1.region) storage west From webhook-mailer at python.org Mon May 23 01:18:13 2022 From: webhook-mailer at python.org (miss-islington) Date: Mon, 23 May 2022 05:18:13 -0000 Subject: [Python-checkins] gh-89158: Add some REPL secondary prompt markers (GH-93073) Message-ID: https://github.com/python/cpython/commit/9a2fe42b11c55c7a616bcff9c15e3245805c3f41 commit: 9a2fe42b11c55c7a616bcff9c15e3245805c3f41 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-22T22:18:09-07:00 summary: gh-89158: Add some REPL secondary prompt markers (GH-93073) This fixes an issue on tutorial/classes.rst section 9.4 where the example "class Warehouse" was truncated when pressing the >>> button to hide the prompts and output. (cherry picked from commit 88f0d0c1e8fdda036f3f64b0048911ba28ce7f06) Co-authored-by: Nicolas Haller files: M Doc/tutorial/classes.rst diff --git a/Doc/tutorial/classes.rst b/Doc/tutorial/classes.rst index f44cb0b4e905a..58b06eb5f2535 100644 --- a/Doc/tutorial/classes.rst +++ b/Doc/tutorial/classes.rst @@ -479,9 +479,9 @@ If the same attribute name occurs in both an instance and in a class, then attribute lookup prioritizes the instance:: >>> class Warehouse: - purpose = 'storage' - region = 'west' - + ... purpose = 'storage' + ... region = 'west' + ... >>> w1 = Warehouse() >>> print(w1.purpose, w1.region) storage west From webhook-mailer at python.org Mon May 23 04:40:35 2022 From: webhook-mailer at python.org (tiran) Date: Mon, 23 May 2022 08:40:35 -0000 Subject: [Python-checkins] gh-90473: WASI: skip gethostname tests (GH-93092) Message-ID: https://github.com/python/cpython/commit/760ec8940aabd6a7fc471bd913ea1ac501cc604b commit: 760ec8940aabd6a7fc471bd913ea1ac501cc604b branch: main author: Christian Heimes committer: tiran date: 2022-05-23T10:39:57+02:00 summary: gh-90473: WASI: skip gethostname tests (GH-93092) - WASI's ``gethostname()`` is a stub that always fails with OSError ``ENOTSUP`` - skip mailcap ``test`` if subprocess is not available - WASI process_time clock does not work. files: M Lib/test/support/socket_helper.py M Lib/test/test_mailbox.py M Lib/test/test_mailcap.py M Lib/test/test_smtpd.py M Lib/test/test_support.py M Lib/test/test_time.py M Lib/test/test_urllib.py M Lib/test/test_urllib_response.py M Tools/wasm/README.md diff --git a/Lib/test/support/socket_helper.py b/Lib/test/support/socket_helper.py index 754af181ec922e..42b2a93398cbf7 100644 --- a/Lib/test/support/socket_helper.py +++ b/Lib/test/support/socket_helper.py @@ -11,6 +11,9 @@ HOSTv4 = "127.0.0.1" HOSTv6 = "::1" +# WASI SDK 15.0 does not provide gethostname, stub raises OSError ENOTSUP. +has_gethostname = not support.is_wasi + def find_unused_port(family=socket.AF_INET, socktype=socket.SOCK_STREAM): """Returns an unused port that should be suitable for binding. This is diff --git a/Lib/test/test_mailbox.py b/Lib/test/test_mailbox.py index 20c460e300cc9d..07c2764dfd1b2f 100644 --- a/Lib/test/test_mailbox.py +++ b/Lib/test/test_mailbox.py @@ -10,12 +10,17 @@ import tempfile from test import support from test.support import os_helper +from test.support import socket_helper import unittest import textwrap import mailbox import glob +if not socket_helper.has_gethostname: + raise unittest.SkipTest("test requires gethostname()") + + class TestBase: all_mailbox_types = (mailbox.Message, mailbox.MaildirMessage, diff --git a/Lib/test/test_mailcap.py b/Lib/test/test_mailcap.py index 97a8fac6e074ad..d3995b14720e66 100644 --- a/Lib/test/test_mailcap.py +++ b/Lib/test/test_mailcap.py @@ -221,6 +221,10 @@ def test_findmatch(self): @unittest.skipUnless(os.name == "posix", "Requires 'test' command on system") @unittest.skipIf(sys.platform == "vxworks", "'test' command is not supported on VxWorks") + @unittest.skipUnless( + test.support.has_subprocess_support, + "'test' command needs process support." + ) def test_test(self): # findmatch() will automatically check any "test" conditions and skip # the entry if the check fails. diff --git a/Lib/test/test_smtpd.py b/Lib/test/test_smtpd.py index 57eb98ebc1d1ef..39ff8793648ba6 100644 --- a/Lib/test/test_smtpd.py +++ b/Lib/test/test_smtpd.py @@ -10,6 +10,9 @@ smtpd = warnings_helper.import_deprecated('smtpd') asyncore = warnings_helper.import_deprecated('asyncore') +if not socket_helper.has_gethostname: + raise unittest.SkipTest("test requires gethostname()") + class DummyServer(smtpd.SMTPServer): def __init__(self, *args, **kwargs): diff --git a/Lib/test/test_support.py b/Lib/test/test_support.py index 7a8b6819c5a91b..23bcceedd71b2a 100644 --- a/Lib/test/test_support.py +++ b/Lib/test/test_support.py @@ -664,6 +664,7 @@ def id(self): self.assertTrue(support.match_test(test_chdir)) @unittest.skipIf(support.is_emscripten, "Unstable in Emscripten") + @unittest.skipIf(support.is_wasi, "Unavailable on WASI") def test_fd_count(self): # We cannot test the absolute value of fd_count(): on old Linux # kernel or glibc versions, os.urandom() keeps a FD open on diff --git a/Lib/test/test_time.py b/Lib/test/test_time.py index dc0bbb0ee29311..884b14231f5737 100644 --- a/Lib/test/test_time.py +++ b/Lib/test/test_time.py @@ -489,6 +489,9 @@ def test_monotonic(self): def test_perf_counter(self): time.perf_counter() + @unittest.skipIf( + support.is_wasi, "process_time not available on WASI" + ) def test_process_time(self): # process_time() should not include time spend during a sleep start = time.process_time() diff --git a/Lib/test/test_urllib.py b/Lib/test/test_urllib.py index bc6e74c291ac1c..f067560ca6caa1 100644 --- a/Lib/test/test_urllib.py +++ b/Lib/test/test_urllib.py @@ -10,6 +10,7 @@ from unittest.mock import patch from test import support from test.support import os_helper +from test.support import socket_helper from test.support import warnings_helper import os try: @@ -24,6 +25,10 @@ import collections +if not socket_helper.has_gethostname: + raise unittest.SkipTest("test requires gethostname()") + + def hexescape(char): """Escape char as RFC 2396 specifies""" hex_repr = hex(ord(char))[2:].upper() diff --git a/Lib/test/test_urllib_response.py b/Lib/test/test_urllib_response.py index 73d2ef0424f4af..b76763f4ed824f 100644 --- a/Lib/test/test_urllib_response.py +++ b/Lib/test/test_urllib_response.py @@ -4,6 +4,11 @@ import tempfile import urllib.response import unittest +from test import support + +if support.is_wasi: + raise unittest.SkipTest("Cannot create socket on WASI") + class TestResponse(unittest.TestCase): diff --git a/Tools/wasm/README.md b/Tools/wasm/README.md index 977b2bb2a8ab93..9e253bc878bd95 100644 --- a/Tools/wasm/README.md +++ b/Tools/wasm/README.md @@ -239,6 +239,7 @@ are: yet. A future version of WASI may provide a limited ``set_permissions`` API. - File locking (``fcntl``) is not available. - ``os.pipe()``, ``os.mkfifo()``, and ``os.mknod()`` are not supported. +- ``process_time`` clock does not work. # Detect WebAssembly builds From webhook-mailer at python.org Mon May 23 08:57:00 2022 From: webhook-mailer at python.org (vstinner) Date: Mon, 23 May 2022 12:57:00 -0000 Subject: [Python-checkins] gh-93103: Deprecate global configuration variable (#93104) Message-ID: https://github.com/python/cpython/commit/764e83db8536ece49550f8a44f0525cb031369a4 commit: 764e83db8536ece49550f8a44f0525cb031369a4 branch: main author: Victor Stinner committer: vstinner date: 2022-05-23T14:56:35+02:00 summary: gh-93103: Deprecate global configuration variable (#93104) Deprecate global configuration variables, like Py_IgnoreEnvironmentFlag, in the documentation: the Py_InitializeFromConfig() API should be instead. files: A Misc/NEWS.d/next/C API/2022-05-23-13-33-18.gh-issue-93103.ooD3Eb.rst M Doc/c-api/init.rst M Doc/c-api/init_config.rst diff --git a/Doc/c-api/init.rst b/Doc/c-api/init.rst index d4954958f855f5..038498f325ceb3 100644 --- a/Doc/c-api/init.rst +++ b/Doc/c-api/init.rst @@ -83,52 +83,93 @@ to 1 and ``-bb`` sets :c:data:`Py_BytesWarningFlag` to 2. .. c:var:: int Py_BytesWarningFlag + This API is kept for backward compatibility: setting + :c:member:`PyConfig.bytes_warning` should be used instead, see :ref:`Python + Initialization Configuration `. + Issue a warning when comparing :class:`bytes` or :class:`bytearray` with :class:`str` or :class:`bytes` with :class:`int`. Issue an error if greater or equal to ``2``. Set by the :option:`-b` option. + .. deprecated:: 3.12 + .. c:var:: int Py_DebugFlag + This API is kept for backward compatibility: setting + :c:member:`PyConfig.parser_debug` should be used instead, see :ref:`Python + Initialization Configuration `. + Turn on parser debugging output (for expert only, depending on compilation options). Set by the :option:`-d` option and the :envvar:`PYTHONDEBUG` environment variable. + .. deprecated:: 3.12 + .. c:var:: int Py_DontWriteBytecodeFlag + This API is kept for backward compatibility: setting + :c:member:`PyConfig.write_bytecode` should be used instead, see :ref:`Python + Initialization Configuration `. + If set to non-zero, Python won't try to write ``.pyc`` files on the import of source modules. Set by the :option:`-B` option and the :envvar:`PYTHONDONTWRITEBYTECODE` environment variable. + .. deprecated:: 3.12 + .. c:var:: int Py_FrozenFlag + This API is kept for backward compatibility: setting + :c:member:`PyConfig.pathconfig_warnings` should be used instead, see + :ref:`Python Initialization Configuration `. + Suppress error messages when calculating the module search path in :c:func:`Py_GetPath`. Private flag used by ``_freeze_module`` and ``frozenmain`` programs. + .. deprecated:: 3.12 + .. c:var:: int Py_HashRandomizationFlag + This API is kept for backward compatibility: setting + :c:member:`PyConfig.hash_seed` and :c:member:`PyConfig.use_hash_seed` should + be used instead, see :ref:`Python Initialization Configuration + `. + Set to ``1`` if the :envvar:`PYTHONHASHSEED` environment variable is set to a non-empty string. If the flag is non-zero, read the :envvar:`PYTHONHASHSEED` environment variable to initialize the secret hash seed. + .. deprecated:: 3.12 + .. c:var:: int Py_IgnoreEnvironmentFlag + This API is kept for backward compatibility: setting + :c:member:`PyConfig.use_environment` should be used instead, see + :ref:`Python Initialization Configuration `. + Ignore all :envvar:`PYTHON*` environment variables, e.g. :envvar:`PYTHONPATH` and :envvar:`PYTHONHOME`, that might be set. Set by the :option:`-E` and :option:`-I` options. + .. deprecated:: 3.12 + .. c:var:: int Py_InspectFlag + This API is kept for backward compatibility: setting + :c:member:`PyConfig.inspect` should be used instead, see + :ref:`Python Initialization Configuration `. + When a script is passed as first argument or the :option:`-c` option is used, enter interactive mode after executing the script or the command, even when :data:`sys.stdin` does not appear to be a terminal. @@ -136,12 +177,24 @@ to 1 and ``-bb`` sets :c:data:`Py_BytesWarningFlag` to 2. Set by the :option:`-i` option and the :envvar:`PYTHONINSPECT` environment variable. + .. deprecated:: 3.12 + .. c:var:: int Py_InteractiveFlag + This API is kept for backward compatibility: setting + :c:member:`PyConfig.interactive` should be used instead, see + :ref:`Python Initialization Configuration `. + Set by the :option:`-i` option. + .. deprecated:: 3.12 + .. c:var:: int Py_IsolatedFlag + This API is kept for backward compatibility: setting + :c:member:`PyConfig.isolated` should be used instead, see + :ref:`Python Initialization Configuration `. + Run Python in isolated mode. In isolated mode :data:`sys.path` contains neither the script's directory nor the user's site-packages directory. @@ -149,8 +202,14 @@ to 1 and ``-bb`` sets :c:data:`Py_BytesWarningFlag` to 2. .. versionadded:: 3.4 + .. deprecated:: 3.12 + .. c:var:: int Py_LegacyWindowsFSEncodingFlag + This API is kept for backward compatibility: setting + :c:member:`PyPreConfig.legacy_windows_fs_encoding` should be used instead, see + :ref:`Python Initialization Configuration `. + If the flag is non-zero, use the ``mbcs`` encoding with ``replace`` error handler, instead of the UTF-8 encoding with ``surrogatepass`` error handler, for the :term:`filesystem encoding and error handler`. @@ -162,8 +221,14 @@ to 1 and ``-bb`` sets :c:data:`Py_BytesWarningFlag` to 2. .. availability:: Windows. + .. deprecated:: 3.12 + .. c:var:: int Py_LegacyWindowsStdioFlag + This API is kept for backward compatibility: setting + :c:member:`PyConfig.legacy_windows_stdio` should be used instead, see + :ref:`Python Initialization Configuration `. + If the flag is non-zero, use :class:`io.FileIO` instead of :class:`WindowsConsoleIO` for :mod:`sys` standard streams. @@ -174,8 +239,14 @@ to 1 and ``-bb`` sets :c:data:`Py_BytesWarningFlag` to 2. .. availability:: Windows. + .. deprecated:: 3.12 + .. c:var:: int Py_NoSiteFlag + This API is kept for backward compatibility: setting + :c:member:`PyConfig.site_import` should be used instead, see + :ref:`Python Initialization Configuration `. + Disable the import of the module :mod:`site` and the site-dependent manipulations of :data:`sys.path` that it entails. Also disable these manipulations if :mod:`site` is explicitly imported later (call @@ -183,36 +254,66 @@ to 1 and ``-bb`` sets :c:data:`Py_BytesWarningFlag` to 2. Set by the :option:`-S` option. + .. deprecated:: 3.12 + .. c:var:: int Py_NoUserSiteDirectory + This API is kept for backward compatibility: setting + :c:member:`PyConfig.user_site_directory` should be used instead, see + :ref:`Python Initialization Configuration `. + Don't add the :data:`user site-packages directory ` to :data:`sys.path`. Set by the :option:`-s` and :option:`-I` options, and the :envvar:`PYTHONNOUSERSITE` environment variable. + .. deprecated:: 3.12 + .. c:var:: int Py_OptimizeFlag + This API is kept for backward compatibility: setting + :c:member:`PyConfig.optimization_level` should be used instead, see + :ref:`Python Initialization Configuration `. + Set by the :option:`-O` option and the :envvar:`PYTHONOPTIMIZE` environment variable. + .. deprecated:: 3.12 + .. c:var:: int Py_QuietFlag + This API is kept for backward compatibility: setting + :c:member:`PyConfig.quiet` should be used instead, see :ref:`Python + Initialization Configuration `. + Don't display the copyright and version messages even in interactive mode. Set by the :option:`-q` option. .. versionadded:: 3.2 + .. deprecated:: 3.12 + .. c:var:: int Py_UnbufferedStdioFlag + This API is kept for backward compatibility: setting + :c:member:`PyConfig.buffered_stdio` should be used instead, see :ref:`Python + Initialization Configuration `. + Force the stdout and stderr streams to be unbuffered. Set by the :option:`-u` option and the :envvar:`PYTHONUNBUFFERED` environment variable. + .. deprecated:: 3.12 + .. c:var:: int Py_VerboseFlag + This API is kept for backward compatibility: setting + :c:member:`PyConfig.verbose` should be used instead, see :ref:`Python + Initialization Configuration `. + Print a message each time a module is initialized, showing the place (filename or built-in module) from which it is loaded. If greater or equal to ``2``, print a message for each file that is checked for when @@ -221,6 +322,8 @@ to 1 and ``-bb`` sets :c:data:`Py_BytesWarningFlag` to 2. Set by the :option:`-v` option and the :envvar:`PYTHONVERBOSE` environment variable. + .. deprecated:: 3.12 + Initializing and finalizing the interpreter =========================================== @@ -253,6 +356,9 @@ Initializing and finalizing the interpreter (without calling :c:func:`Py_FinalizeEx` first). There is no return value; it is a fatal error if the initialization fails. + Use the :c:func:`Py_InitializeFromConfig` function to customize the + :ref:`Python Initialization Configuration `. + .. note:: On Windows, changes the console mode from ``O_TEXT`` to ``O_BINARY``, which will also affect non-Python uses of the console using the C Runtime. @@ -264,6 +370,9 @@ Initializing and finalizing the interpreter *initsigs* is ``0``, it skips initialization registration of signal handlers, which might be useful when Python is embedded. + Use the :c:func:`Py_InitializeFromConfig` function to customize the + :ref:`Python Initialization Configuration `. + .. c:function:: int Py_IsInitialized() diff --git a/Doc/c-api/init_config.rst b/Doc/c-api/init_config.rst index d6a12375cd56f0..b1e9800352fee8 100644 --- a/Doc/c-api/init_config.rst +++ b/Doc/c-api/init_config.rst @@ -835,8 +835,10 @@ PyConfig * Set :c:member:`~PyConfig.safe_path` to ``1``: don't prepend a potentially unsafe path to :data:`sys.path` at Python - startup. - * Set :c:member:`~PyConfig.use_environment` to ``0``. + startup, such as the current directory, the script's directory or an + empty string. + * Set :c:member:`~PyConfig.use_environment` to ``0``: ignore ``PYTHON`` + environment variables. * Set :c:member:`~PyConfig.user_site_directory` to ``0``: don't add the user site directory to :data:`sys.path`. * Python REPL doesn't import :mod:`readline` nor enable default readline @@ -846,7 +848,8 @@ PyConfig Default: ``0`` in Python mode, ``1`` in isolated mode. - See also :c:member:`PyPreConfig.isolated`. + See also the :ref:`Isolated Configuration ` and + :c:member:`PyPreConfig.isolated`. .. c:member:: int legacy_windows_stdio @@ -1177,13 +1180,13 @@ PyConfig imported, showing the place (filename or built-in module) from which it is loaded. - If greater or equal to ``2``, print a message for each file that is checked - for when searching for a module. Also provides information on module - cleanup at exit. + If greater than or equal to ``2``, print a message for each file that is + checked for when searching for a module. Also provides information on + module cleanup at exit. Incremented by the :option:`-v` command line option. - Set to the :envvar:`PYTHONVERBOSE` environment variable value. + Set by the :envvar:`PYTHONVERBOSE` environment variable value. Default: ``0``. diff --git a/Misc/NEWS.d/next/C API/2022-05-23-13-33-18.gh-issue-93103.ooD3Eb.rst b/Misc/NEWS.d/next/C API/2022-05-23-13-33-18.gh-issue-93103.ooD3Eb.rst new file mode 100644 index 00000000000000..404f0089cd0b79 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2022-05-23-13-33-18.gh-issue-93103.ooD3Eb.rst @@ -0,0 +1,4 @@ +Deprecate global configuration variables, like +:c:var:`Py_IgnoreEnvironmentFlag`, in the documentation: the +:c:func:`Py_InitializeFromConfig` API should be instead. Patch by Victor +Stinner. From webhook-mailer at python.org Mon May 23 08:57:03 2022 From: webhook-mailer at python.org (vstinner) Date: Mon, 23 May 2022 12:57:03 -0000 Subject: [Python-checkins] gh-93103: Update PyUnicode_DecodeFSDefault() doc (#93105) Message-ID: https://github.com/python/cpython/commit/fc00667247c47285751d77de7645c11a5393d870 commit: fc00667247c47285751d77de7645c11a5393d870 branch: main author: Victor Stinner committer: vstinner date: 2022-05-23T14:56:59+02:00 summary: gh-93103: Update PyUnicode_DecodeFSDefault() doc (#93105) Update documentation of PyUnicode_DecodeFSDefault(), PyUnicode_DecodeFSDefaultAndSize() and PyUnicode_EncodeFSDefault(): they now use the filesystem encoding and error handler of PyConfig, Py_FileSystemDefaultEncoding and Py_FileSystemDefaultEncodeErrors variables are no longer used. files: M Doc/c-api/unicode.rst M Include/unicodeobject.h diff --git a/Doc/c-api/unicode.rst b/Doc/c-api/unicode.rst index 9dccbf1dc2298..abcf0cd6c8790 100644 --- a/Doc/c-api/unicode.rst +++ b/Doc/c-api/unicode.rst @@ -645,8 +645,7 @@ system. cannot contain embedded null characters. Use :c:func:`PyUnicode_DecodeFSDefaultAndSize` to decode a string from - :c:data:`Py_FileSystemDefaultEncoding` (the locale encoding read at - Python startup). + the :term:`filesystem encoding and error handler`. This function ignores the :ref:`Python UTF-8 Mode `. @@ -680,9 +679,8 @@ system. *errors* is ``NULL``. Return a :class:`bytes` object. *unicode* cannot contain embedded null characters. - Use :c:func:`PyUnicode_EncodeFSDefault` to encode a string to - :c:data:`Py_FileSystemDefaultEncoding` (the locale encoding read at - Python startup). + Use :c:func:`PyUnicode_EncodeFSDefault` to encode a string to the + :term:`filesystem encoding and error handler`. This function ignores the :ref:`Python UTF-8 Mode `. @@ -703,12 +701,12 @@ system. File System Encoding """""""""""""""""""" -To encode and decode file names and other environment strings, -:c:data:`Py_FileSystemDefaultEncoding` should be used as the encoding, and -:c:data:`Py_FileSystemDefaultEncodeErrors` should be used as the error handler -(:pep:`383` and :pep:`529`). To encode file names to :class:`bytes` during -argument parsing, the ``"O&"`` converter should be used, passing -:c:func:`PyUnicode_FSConverter` as the conversion function: +Functions encoding to and decoding from the :term:`filesystem encoding and +error handler` (:pep:`383` and :pep:`529`). + +To encode file names to :class:`bytes` during argument parsing, the ``"O&"`` +converter should be used, passing :c:func:`PyUnicode_FSConverter` as the +conversion function: .. c:function:: int PyUnicode_FSConverter(PyObject* obj, void* result) @@ -745,12 +743,7 @@ conversion function: Decode a string from the :term:`filesystem encoding and error handler`. - If :c:data:`Py_FileSystemDefaultEncoding` is not set, fall back to the - locale encoding. - - :c:data:`Py_FileSystemDefaultEncoding` is initialized at startup from the - locale encoding and cannot be modified later. If you need to decode a string - from the current locale encoding, use + If you need to decode a string from the current locale encoding, use :c:func:`PyUnicode_DecodeLocaleAndSize`. .. seealso:: @@ -758,7 +751,8 @@ conversion function: The :c:func:`Py_DecodeLocale` function. .. versionchanged:: 3.6 - Use :c:data:`Py_FileSystemDefaultEncodeErrors` error handler. + The :term:`filesystem error handler ` is now used. .. c:function:: PyObject* PyUnicode_DecodeFSDefault(const char *s) @@ -766,28 +760,22 @@ conversion function: Decode a null-terminated string from the :term:`filesystem encoding and error handler`. - If :c:data:`Py_FileSystemDefaultEncoding` is not set, fall back to the - locale encoding. - - Use :c:func:`PyUnicode_DecodeFSDefaultAndSize` if you know the string length. + If the string length is known, use + :c:func:`PyUnicode_DecodeFSDefaultAndSize`. .. versionchanged:: 3.6 - Use :c:data:`Py_FileSystemDefaultEncodeErrors` error handler. + The :term:`filesystem error handler ` is now used. .. c:function:: PyObject* PyUnicode_EncodeFSDefault(PyObject *unicode) - Encode a Unicode object to :c:data:`Py_FileSystemDefaultEncoding` with the - :c:data:`Py_FileSystemDefaultEncodeErrors` error handler, and return - :class:`bytes`. Note that the resulting :class:`bytes` object may contain - null bytes. - - If :c:data:`Py_FileSystemDefaultEncoding` is not set, fall back to the - locale encoding. + Encode a Unicode object to the :term:`filesystem encoding and error + handler`, and return :class:`bytes`. Note that the resulting :class:`bytes` + object can contain null bytes. - :c:data:`Py_FileSystemDefaultEncoding` is initialized at startup from the - locale encoding and cannot be modified later. If you need to encode a string - to the current locale encoding, use :c:func:`PyUnicode_EncodeLocale`. + If you need to encode a string to the current locale encoding, use + :c:func:`PyUnicode_EncodeLocale`. .. seealso:: @@ -796,7 +784,8 @@ conversion function: .. versionadded:: 3.2 .. versionchanged:: 3.6 - Use :c:data:`Py_FileSystemDefaultEncodeErrors` error handler. + The :term:`filesystem error handler ` is now used. wchar_t Support """"""""""""""" @@ -861,10 +850,7 @@ constructor. Setting encoding to ``NULL`` causes the default encoding to be used which is UTF-8. The file system calls should use :c:func:`PyUnicode_FSConverter` for encoding file names. This uses the -variable :c:data:`Py_FileSystemDefaultEncoding` internally. This -variable should be treated as read-only: on some systems, it will be a -pointer to a static string, on others, it will change at run-time -(such as when the application invokes setlocale). +:term:`filesystem encoding and error handler` internally. Error handling is set by errors which may also be set to ``NULL`` meaning to use the default handling defined for the codec. Default error handling for all diff --git a/Include/unicodeobject.h b/Include/unicodeobject.h index ed3e8d2c6cc99..27fde229022a1 100644 --- a/Include/unicodeobject.h +++ b/Include/unicodeobject.h @@ -755,38 +755,22 @@ PyAPI_FUNC(int) PyUnicode_FSConverter(PyObject*, void*); PyAPI_FUNC(int) PyUnicode_FSDecoder(PyObject*, void*); -/* Decode a null-terminated string using Py_FileSystemDefaultEncoding - and the "surrogateescape" error handler. - - If Py_FileSystemDefaultEncoding is not set, fall back to the locale - encoding. - - Use PyUnicode_DecodeFSDefaultAndSize() if the string length is known. -*/ +/* Decode a null-terminated string from the Python filesystem encoding + and error handler. + If the string length is known, use PyUnicode_DecodeFSDefaultAndSize(). */ PyAPI_FUNC(PyObject*) PyUnicode_DecodeFSDefault( const char *s /* encoded string */ ); -/* Decode a string using Py_FileSystemDefaultEncoding - and the "surrogateescape" error handler. - - If Py_FileSystemDefaultEncoding is not set, fall back to the locale - encoding. -*/ - +/* Decode a string from the Python filesystem encoding and error handler. */ PyAPI_FUNC(PyObject*) PyUnicode_DecodeFSDefaultAndSize( const char *s, /* encoded string */ Py_ssize_t size /* size */ ); -/* Encode a Unicode object to Py_FileSystemDefaultEncoding with the - "surrogateescape" error handler, and return bytes. - - If Py_FileSystemDefaultEncoding is not set, fall back to the locale - encoding. -*/ - +/* Encode a Unicode object to the Python filesystem encoding and error handler. + Return bytes. */ PyAPI_FUNC(PyObject*) PyUnicode_EncodeFSDefault( PyObject *unicode ); From webhook-mailer at python.org Mon May 23 08:58:50 2022 From: webhook-mailer at python.org (markshannon) Date: Mon, 23 May 2022 12:58:50 -0000 Subject: [Python-checkins] gh-93061: Mark as artificial: backwards jump after async for (GH-93062) Message-ID: https://github.com/python/cpython/commit/a458be3263b4cb92f3fde726461e8ef44b2a4a9d commit: a458be3263b4cb92f3fde726461e8ef44b2a4a9d branch: main author: Dennis Sweeney <36520290+sweeneyde at users.noreply.github.com> committer: markshannon date: 2022-05-23T13:58:41+01:00 summary: gh-93061: Mark as artificial: backwards jump after async for (GH-93062) files: A Misc/NEWS.d/next/Core and Builtins/2022-05-22-02-37-50.gh-issue-93061.r70Imp.rst M Lib/test/test_sys_settrace.py M Python/compile.c diff --git a/Lib/test/test_sys_settrace.py b/Lib/test/test_sys_settrace.py index 9cc6bcfcab5e1..162fd8328582c 100644 --- a/Lib/test/test_sys_settrace.py +++ b/Lib/test/test_sys_settrace.py @@ -609,6 +609,58 @@ def run(tracer): self.compare_events(doit_async.__code__.co_firstlineno, tracer.events, events) + def test_async_for_backwards_jump_has_no_line(self): + async def arange(n): + for i in range(n): + yield i + async def f(): + async for i in arange(3): + if i > 100: + break # should never be traced + + tracer = self.make_tracer() + coro = f() + try: + sys.settrace(tracer.trace) + coro.send(None) + except Exception: + pass + finally: + sys.settrace(None) + + events = [ + (0, 'call'), + (1, 'line'), + (-3, 'call'), + (-2, 'line'), + (-1, 'line'), + (-1, 'return'), + (1, 'exception'), + (2, 'line'), + (1, 'line'), + (-1, 'call'), + (-2, 'line'), + (-1, 'line'), + (-1, 'return'), + (1, 'exception'), + (2, 'line'), + (1, 'line'), + (-1, 'call'), + (-2, 'line'), + (-1, 'line'), + (-1, 'return'), + (1, 'exception'), + (2, 'line'), + (1, 'line'), + (-1, 'call'), + (-2, 'line'), + (-2, 'return'), + (1, 'exception'), + (1, 'return'), + ] + self.compare_events(f.__code__.co_firstlineno, + tracer.events, events) + def test_21_repeated_pass(self): def func(): pass diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-22-02-37-50.gh-issue-93061.r70Imp.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-22-02-37-50.gh-issue-93061.r70Imp.rst new file mode 100644 index 0000000000000..d41e59028ad57 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-05-22-02-37-50.gh-issue-93061.r70Imp.rst @@ -0,0 +1 @@ +Backward jumps after ``async for`` loops are no longer given dubious line numbers. diff --git a/Python/compile.c b/Python/compile.c index c862c10a83e53..a4738c1f48f2a 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -3148,6 +3148,8 @@ compiler_async_for(struct compiler *c, stmt_ty s) /* Success block for __anext__ */ VISIT(c, expr, s->v.AsyncFor.target); VISIT_SEQ(c, stmt, s->v.AsyncFor.body); + /* Mark jump as artificial */ + UNSET_LOC(c); ADDOP_JUMP(c, JUMP, start); compiler_pop_fblock(c, FOR_LOOP, start); From webhook-mailer at python.org Mon May 23 10:15:18 2022 From: webhook-mailer at python.org (vstinner) Date: Mon, 23 May 2022 14:15:18 -0000 Subject: [Python-checkins] gh-92536: Mark PyUnicode_READY() argument as unused (#93011) Message-ID: https://github.com/python/cpython/commit/b2694ab46997746eae7e913738623b39f6334473 commit: b2694ab46997746eae7e913738623b39f6334473 branch: main author: Wenzel Jakob committer: vstinner date: 2022-05-23T16:15:09+02:00 summary: gh-92536: Mark PyUnicode_READY() argument as unused (#93011) files: M Include/cpython/unicodeobject.h diff --git a/Include/cpython/unicodeobject.h b/Include/cpython/unicodeobject.h index 758aaff2d77d6..3adfcb7a8c1f0 100644 --- a/Include/cpython/unicodeobject.h +++ b/Include/cpython/unicodeobject.h @@ -193,7 +193,7 @@ static inline unsigned int PyUnicode_CHECK_INTERNED(PyObject *op) { #endif /* For backward compatibility */ -static inline unsigned int PyUnicode_IS_READY(PyObject *op) { +static inline unsigned int PyUnicode_IS_READY(PyObject* Py_UNUSED(op)) { return 1; } #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000 @@ -413,7 +413,7 @@ PyAPI_FUNC(PyObject*) PyUnicode_New( ); /* For backward compatibility */ -static inline int PyUnicode_READY(PyObject *op) +static inline int PyUnicode_READY(PyObject* Py_UNUSED(op)) { return 0; } From webhook-mailer at python.org Mon May 23 11:21:54 2022 From: webhook-mailer at python.org (miss-islington) Date: Mon, 23 May 2022 15:21:54 -0000 Subject: [Python-checkins] gh-90473: WASI: skip gethostname tests (GH-93092) Message-ID: https://github.com/python/cpython/commit/a29b1f8b4b6b1d16ff896876c21f2860d5087229 commit: a29b1f8b4b6b1d16ff896876c21f2860d5087229 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-23T08:21:45-07:00 summary: gh-90473: WASI: skip gethostname tests (GH-93092) - WASI's ``gethostname()`` is a stub that always fails with OSError ``ENOTSUP`` - skip mailcap ``test`` if subprocess is not available - WASI process_time clock does not work. (cherry picked from commit 760ec8940aabd6a7fc471bd913ea1ac501cc604b) Co-authored-by: Christian Heimes files: M Lib/test/support/socket_helper.py M Lib/test/test_mailbox.py M Lib/test/test_mailcap.py M Lib/test/test_smtpd.py M Lib/test/test_support.py M Lib/test/test_time.py M Lib/test/test_urllib.py M Lib/test/test_urllib_response.py M Tools/wasm/README.md diff --git a/Lib/test/support/socket_helper.py b/Lib/test/support/socket_helper.py index 754af181ec922..42b2a93398cbf 100644 --- a/Lib/test/support/socket_helper.py +++ b/Lib/test/support/socket_helper.py @@ -11,6 +11,9 @@ HOSTv4 = "127.0.0.1" HOSTv6 = "::1" +# WASI SDK 15.0 does not provide gethostname, stub raises OSError ENOTSUP. +has_gethostname = not support.is_wasi + def find_unused_port(family=socket.AF_INET, socktype=socket.SOCK_STREAM): """Returns an unused port that should be suitable for binding. This is diff --git a/Lib/test/test_mailbox.py b/Lib/test/test_mailbox.py index 20c460e300cc9..07c2764dfd1b2 100644 --- a/Lib/test/test_mailbox.py +++ b/Lib/test/test_mailbox.py @@ -10,12 +10,17 @@ import tempfile from test import support from test.support import os_helper +from test.support import socket_helper import unittest import textwrap import mailbox import glob +if not socket_helper.has_gethostname: + raise unittest.SkipTest("test requires gethostname()") + + class TestBase: all_mailbox_types = (mailbox.Message, mailbox.MaildirMessage, diff --git a/Lib/test/test_mailcap.py b/Lib/test/test_mailcap.py index 97a8fac6e074a..d3995b14720e6 100644 --- a/Lib/test/test_mailcap.py +++ b/Lib/test/test_mailcap.py @@ -221,6 +221,10 @@ def test_findmatch(self): @unittest.skipUnless(os.name == "posix", "Requires 'test' command on system") @unittest.skipIf(sys.platform == "vxworks", "'test' command is not supported on VxWorks") + @unittest.skipUnless( + test.support.has_subprocess_support, + "'test' command needs process support." + ) def test_test(self): # findmatch() will automatically check any "test" conditions and skip # the entry if the check fails. diff --git a/Lib/test/test_smtpd.py b/Lib/test/test_smtpd.py index 57eb98ebc1d1e..39ff8793648ba 100644 --- a/Lib/test/test_smtpd.py +++ b/Lib/test/test_smtpd.py @@ -10,6 +10,9 @@ smtpd = warnings_helper.import_deprecated('smtpd') asyncore = warnings_helper.import_deprecated('asyncore') +if not socket_helper.has_gethostname: + raise unittest.SkipTest("test requires gethostname()") + class DummyServer(smtpd.SMTPServer): def __init__(self, *args, **kwargs): diff --git a/Lib/test/test_support.py b/Lib/test/test_support.py index 7a8b6819c5a91..23bcceedd71b2 100644 --- a/Lib/test/test_support.py +++ b/Lib/test/test_support.py @@ -664,6 +664,7 @@ def id(self): self.assertTrue(support.match_test(test_chdir)) @unittest.skipIf(support.is_emscripten, "Unstable in Emscripten") + @unittest.skipIf(support.is_wasi, "Unavailable on WASI") def test_fd_count(self): # We cannot test the absolute value of fd_count(): on old Linux # kernel or glibc versions, os.urandom() keeps a FD open on diff --git a/Lib/test/test_time.py b/Lib/test/test_time.py index dc0bbb0ee2931..884b14231f573 100644 --- a/Lib/test/test_time.py +++ b/Lib/test/test_time.py @@ -489,6 +489,9 @@ def test_monotonic(self): def test_perf_counter(self): time.perf_counter() + @unittest.skipIf( + support.is_wasi, "process_time not available on WASI" + ) def test_process_time(self): # process_time() should not include time spend during a sleep start = time.process_time() diff --git a/Lib/test/test_urllib.py b/Lib/test/test_urllib.py index bc6e74c291ac1..f067560ca6caa 100644 --- a/Lib/test/test_urllib.py +++ b/Lib/test/test_urllib.py @@ -10,6 +10,7 @@ from unittest.mock import patch from test import support from test.support import os_helper +from test.support import socket_helper from test.support import warnings_helper import os try: @@ -24,6 +25,10 @@ import collections +if not socket_helper.has_gethostname: + raise unittest.SkipTest("test requires gethostname()") + + def hexescape(char): """Escape char as RFC 2396 specifies""" hex_repr = hex(ord(char))[2:].upper() diff --git a/Lib/test/test_urllib_response.py b/Lib/test/test_urllib_response.py index 73d2ef0424f4a..b76763f4ed824 100644 --- a/Lib/test/test_urllib_response.py +++ b/Lib/test/test_urllib_response.py @@ -4,6 +4,11 @@ import tempfile import urllib.response import unittest +from test import support + +if support.is_wasi: + raise unittest.SkipTest("Cannot create socket on WASI") + class TestResponse(unittest.TestCase): diff --git a/Tools/wasm/README.md b/Tools/wasm/README.md index 977b2bb2a8ab9..9e253bc878bd9 100644 --- a/Tools/wasm/README.md +++ b/Tools/wasm/README.md @@ -239,6 +239,7 @@ are: yet. A future version of WASI may provide a limited ``set_permissions`` API. - File locking (``fcntl``) is not available. - ``os.pipe()``, ``os.mkfifo()``, and ``os.mknod()`` are not supported. +- ``process_time`` clock does not work. # Detect WebAssembly builds From webhook-mailer at python.org Mon May 23 11:56:11 2022 From: webhook-mailer at python.org (ethanfurman) Date: Mon, 23 May 2022 15:56:11 -0000 Subject: [Python-checkins] gh93107: [Enum] fix missing variable in global_str (GH-93107) Message-ID: https://github.com/python/cpython/commit/046df59658c9f64a9f0fc909ed62e92c6c4dd668 commit: 046df59658c9f64a9f0fc909ed62e92c6c4dd668 branch: main author: Ethan Furman committer: ethanfurman date: 2022-05-23T08:56:07-07:00 summary: gh93107: [Enum] fix missing variable in global_str (GH-93107) files: M Lib/enum.py M Lib/test/test_enum.py diff --git a/Lib/enum.py b/Lib/enum.py index 1df38a6f7e5f5..62fd5ce8fb9a0 100644 --- a/Lib/enum.py +++ b/Lib/enum.py @@ -1640,6 +1640,7 @@ def global_str(self): use enum_name instead of class.enum_name """ if self._name_ is None: + cls_name = self.__class__.__name__ return "%s(%r)" % (cls_name, self._value_) else: return self._name_ diff --git a/Lib/test/test_enum.py b/Lib/test/test_enum.py index 286d631d793e4..44a3912630c32 100644 --- a/Lib/test/test_enum.py +++ b/Lib/test/test_enum.py @@ -189,6 +189,12 @@ class HeadlightsC(IntFlag, boundary=enum.CONFORM): FOG_C = auto() + at enum.global_enum +class NoName(Flag): + ONE = 1 + TWO = 2 + + # tests class _EnumTests: @@ -616,6 +622,7 @@ class _PlainOutputTests: def test_str(self): TE = self.MainEnum if self.is_flag: + self.assertEqual(str(TE(0)), "MainEnum(0)") self.assertEqual(str(TE.dupe), "MainEnum.dupe") self.assertEqual(str(self.dupe2), "MainEnum.first|third") else: @@ -3242,6 +3249,10 @@ def test_global_repr_conform1(self): '%(m)s.OFF_C' % {'m': SHORT_MODULE}, ) + def test_global_enum_str(self): + self.assertEqual(str(NoName.ONE & NoName.TWO), 'NoName(0)') + self.assertEqual(str(NoName(0)), 'NoName(0)') + def test_format(self): Perm = self.Perm self.assertEqual(format(Perm.R, ''), '4') From webhook-mailer at python.org Mon May 23 11:58:20 2022 From: webhook-mailer at python.org (erlend-aasland) Date: Mon, 23 May 2022 15:58:20 -0000 Subject: [Python-checkins] GH-93115: Fix version check in sqlite3 module constants test (#93116) Message-ID: https://github.com/python/cpython/commit/d5f0dd160011826f0196d220aefc29d2ce497428 commit: d5f0dd160011826f0196d220aefc29d2ce497428 branch: main author: Florian Bruhin committer: erlend-aasland date: 2022-05-23T17:58:11+02:00 summary: GH-93115: Fix version check in sqlite3 module constants test (#93116) files: M Lib/test/test_sqlite3/test_dbapi.py diff --git a/Lib/test/test_sqlite3/test_dbapi.py b/Lib/test/test_sqlite3/test_dbapi.py index 0be40429c9959..840a401b6b3ee 100644 --- a/Lib/test/test_sqlite3/test_dbapi.py +++ b/Lib/test/test_sqlite3/test_dbapi.py @@ -228,7 +228,7 @@ def test_module_constants(self): "SQLITE_READONLY_CANTLOCK", "SQLITE_READONLY_RECOVERY", ] - if sqlite.version_info >= (3, 7, 16): + if sqlite.sqlite_version_info >= (3, 7, 16): consts += [ "SQLITE_CONSTRAINT_CHECK", "SQLITE_CONSTRAINT_COMMITHOOK", @@ -241,63 +241,63 @@ def test_module_constants(self): "SQLITE_CONSTRAINT_VTAB", "SQLITE_READONLY_ROLLBACK", ] - if sqlite.version_info >= (3, 7, 17): + if sqlite.sqlite_version_info >= (3, 7, 17): consts += [ "SQLITE_IOERR_MMAP", "SQLITE_NOTICE_RECOVER_ROLLBACK", "SQLITE_NOTICE_RECOVER_WAL", ] - if sqlite.version_info >= (3, 8, 0): + if sqlite.sqlite_version_info >= (3, 8, 0): consts += [ "SQLITE_BUSY_SNAPSHOT", "SQLITE_IOERR_GETTEMPPATH", "SQLITE_WARNING_AUTOINDEX", ] - if sqlite.version_info >= (3, 8, 1): + if sqlite.sqlite_version_info >= (3, 8, 1): consts += ["SQLITE_CANTOPEN_CONVPATH", "SQLITE_IOERR_CONVPATH"] - if sqlite.version_info >= (3, 8, 2): + if sqlite.sqlite_version_info >= (3, 8, 2): consts.append("SQLITE_CONSTRAINT_ROWID") - if sqlite.version_info >= (3, 8, 3): + if sqlite.sqlite_version_info >= (3, 8, 3): consts.append("SQLITE_READONLY_DBMOVED") - if sqlite.version_info >= (3, 8, 7): + if sqlite.sqlite_version_info >= (3, 8, 7): consts.append("SQLITE_AUTH_USER") - if sqlite.version_info >= (3, 9, 0): + if sqlite.sqlite_version_info >= (3, 9, 0): consts.append("SQLITE_IOERR_VNODE") - if sqlite.version_info >= (3, 10, 0): + if sqlite.sqlite_version_info >= (3, 10, 0): consts.append("SQLITE_IOERR_AUTH") - if sqlite.version_info >= (3, 14, 1): + if sqlite.sqlite_version_info >= (3, 14, 1): consts.append("SQLITE_OK_LOAD_PERMANENTLY") - if sqlite.version_info >= (3, 21, 0): + if sqlite.sqlite_version_info >= (3, 21, 0): consts += [ "SQLITE_IOERR_BEGIN_ATOMIC", "SQLITE_IOERR_COMMIT_ATOMIC", "SQLITE_IOERR_ROLLBACK_ATOMIC", ] - if sqlite.version_info >= (3, 22, 0): + if sqlite.sqlite_version_info >= (3, 22, 0): consts += [ "SQLITE_ERROR_MISSING_COLLSEQ", "SQLITE_ERROR_RETRY", "SQLITE_READONLY_CANTINIT", "SQLITE_READONLY_DIRECTORY", ] - if sqlite.version_info >= (3, 24, 0): + if sqlite.sqlite_version_info >= (3, 24, 0): consts += ["SQLITE_CORRUPT_SEQUENCE", "SQLITE_LOCKED_VTAB"] - if sqlite.version_info >= (3, 25, 0): + if sqlite.sqlite_version_info >= (3, 25, 0): consts += ["SQLITE_CANTOPEN_DIRTYWAL", "SQLITE_ERROR_SNAPSHOT"] - if sqlite.version_info >= (3, 31, 0): + if sqlite.sqlite_version_info >= (3, 31, 0): consts += [ "SQLITE_CANTOPEN_SYMLINK", "SQLITE_CONSTRAINT_PINNED", "SQLITE_OK_SYMLINK", ] - if sqlite.version_info >= (3, 32, 0): + if sqlite.sqlite_version_info >= (3, 32, 0): consts += [ "SQLITE_BUSY_TIMEOUT", "SQLITE_CORRUPT_INDEX", "SQLITE_IOERR_DATA", ] - if sqlite.version_info >= (3, 34, 0): - const.append("SQLITE_IOERR_CORRUPTFS") + if sqlite.sqlite_version_info >= (3, 34, 0): + consts.append("SQLITE_IOERR_CORRUPTFS") for const in consts: with self.subTest(const=const): self.assertTrue(hasattr(sqlite, const)) From webhook-mailer at python.org Mon May 23 12:04:42 2022 From: webhook-mailer at python.org (zooba) Date: Mon, 23 May 2022 16:04:42 -0000 Subject: [Python-checkins] gh-93005: Fixes launcher test when no Python install is available (GH-93007) Message-ID: https://github.com/python/cpython/commit/949dbf97ba09da3cfb243d5ad7f90967ad15f354 commit: 949dbf97ba09da3cfb243d5ad7f90967ad15f354 branch: main author: Steve Dower committer: zooba date: 2022-05-23T17:04:26+01:00 summary: gh-93005: Fixes launcher test when no Python install is available (GH-93007) files: M Lib/test/test_launcher.py M PC/launcher2.c diff --git a/Lib/test/test_launcher.py b/Lib/test/test_launcher.py index aeacbbecbfa12..8d9de688f0a53 100644 --- a/Lib/test/test_launcher.py +++ b/Lib/test/test_launcher.py @@ -245,7 +245,7 @@ def script(self, content, encoding="utf-8"): file.unlink() @contextlib.contextmanager - def test_venv(self): + def fake_venv(self): venv = Path.cwd() / "Scripts" venv.mkdir(exist_ok=True, parents=True) venv_exe = (venv / Path(sys.executable).name) @@ -462,7 +462,7 @@ def test_py_default_in_list(self): self.assertEqual("PythonTestSuite/3.100", default) def test_virtualenv_in_list(self): - with self.test_venv() as (venv_exe, env): + with self.fake_venv() as (venv_exe, env): data = self.run_py(["-0p"], env=env) for line in data["stdout"].splitlines(): m = re.match(r"\s*\*\s+(.+)$", line) @@ -482,9 +482,9 @@ def test_virtualenv_in_list(self): self.fail("did not find active venv entry") def test_virtualenv_with_env(self): - with self.test_venv() as (venv_exe, env): - data1 = self.run_py([], env={**env, "PY_PYTHON": "-3"}) - data2 = self.run_py(["-3"], env={**env, "PY_PYTHON": "-3"}) + with self.fake_venv() as (venv_exe, env): + data1 = self.run_py([], env={**env, "PY_PYTHON": "PythonTestSuite/3"}) + data2 = self.run_py(["-3"], env={**env, "PY_PYTHON": "PythonTestSuite/3"}) # Compare stdout, because stderr goes via ascii self.assertEqual(data1["stdout"].strip(), str(venv_exe)) self.assertEqual(data1["SearchInfo.lowPriorityTag"], "True") diff --git a/PC/launcher2.c b/PC/launcher2.c index 763bc138ed71d..ae11f4f024a90 100644 --- a/PC/launcher2.c +++ b/PC/launcher2.c @@ -972,9 +972,6 @@ checkDefaults(SearchInfo *search) if (!slash) { search->tag = tag; search->tagLength = n; - // gh-92817: allow a high priority env to be selected even if it - // doesn't match the tag - search->lowPriorityTag = true; } else { search->company = tag; search->companyLength = (int)(slash - tag); @@ -982,6 +979,9 @@ checkDefaults(SearchInfo *search) search->tagLength = n - (search->companyLength + 1); search->oldStyleTag = false; } + // gh-92817: allow a high priority env to be selected even if it + // doesn't match the tag + search->lowPriorityTag = true; } return 0; From webhook-mailer at python.org Mon May 23 12:10:27 2022 From: webhook-mailer at python.org (warsaw) Date: Mon, 23 May 2022 16:10:27 -0000 Subject: [Python-checkins] gh-93010: InvalidHeaderError used but nonexistent (#93015) Message-ID: https://github.com/python/cpython/commit/71abeb0895f7563dc5ac4b4f077a8f87dab57e7a commit: 71abeb0895f7563dc5ac4b4f077a8f87dab57e7a branch: main author: oda-gitso <105083118+oda-gitso at users.noreply.github.com> committer: warsaw date: 2022-05-23T09:10:18-07:00 summary: gh-93010: InvalidHeaderError used but nonexistent (#93015) * fix issue 93010 Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com> files: A Misc/NEWS.d/next/Library/2022-05-20-15-52-43.gh-issue-93010.WF-cAc.rst M Lib/email/_header_value_parser.py M Lib/test/test_email/test_email.py diff --git a/Lib/email/_header_value_parser.py b/Lib/email/_header_value_parser.py index 8a8fb8bc42a95..e637e6df06612 100644 --- a/Lib/email/_header_value_parser.py +++ b/Lib/email/_header_value_parser.py @@ -2379,7 +2379,7 @@ def get_section(value): digits += value[0] value = value[1:] if digits[0] == '0' and digits != '0': - section.defects.append(errors.InvalidHeaderError( + section.defects.append(errors.InvalidHeaderDefect( "section number has an invalid leading 0")) section.number = int(digits) section.append(ValueTerminal(digits, 'digits')) diff --git a/Lib/test/test_email/test_email.py b/Lib/test/test_email/test_email.py index 69f883a3673f2..2b1e2b864feda 100644 --- a/Lib/test/test_email/test_email.py +++ b/Lib/test/test_email/test_email.py @@ -19,24 +19,25 @@ import email.policy from email.charset import Charset -from email.header import Header, decode_header, make_header -from email.parser import Parser, HeaderParser from email.generator import Generator, DecodedGenerator, BytesGenerator +from email.header import Header, decode_header, make_header +from email.headerregistry import HeaderRegistry from email.message import Message from email.mime.application import MIMEApplication from email.mime.audio import MIMEAudio -from email.mime.text import MIMEText -from email.mime.image import MIMEImage from email.mime.base import MIMEBase +from email.mime.image import MIMEImage from email.mime.message import MIMEMessage from email.mime.multipart import MIMEMultipart from email.mime.nonmultipart import MIMENonMultipart -from email import utils -from email import errors +from email.mime.text import MIMEText +from email.parser import Parser, HeaderParser +from email import base64mime from email import encoders +from email import errors from email import iterators -from email import base64mime from email import quoprimime +from email import utils from test.support import threading_helper from test.support.os_helper import unlink @@ -5541,7 +5542,12 @@ def test_long_headers_flatten(self): result = fp.getvalue() self._signed_parts_eq(original, result) - +class TestHeaderRegistry(TestEmailBase): + # See issue gh-93010. + def test_HeaderRegistry(self): + reg = HeaderRegistry() + a = reg('Content-Disposition', 'attachment; 0*00="foo"') + self.assertIsInstance(a.defects[0], errors.InvalidHeaderDefect) if __name__ == '__main__': unittest.main() diff --git a/Misc/NEWS.d/next/Library/2022-05-20-15-52-43.gh-issue-93010.WF-cAc.rst b/Misc/NEWS.d/next/Library/2022-05-20-15-52-43.gh-issue-93010.WF-cAc.rst new file mode 100644 index 0000000000000..24208b5160ed5 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-05-20-15-52-43.gh-issue-93010.WF-cAc.rst @@ -0,0 +1 @@ +In a very special case, the email package tried to append the nonexistent ``InvalidHeaderError`` to the defect list. It should have been ``InvalidHeaderDefect``. From webhook-mailer at python.org Mon May 23 12:35:17 2022 From: webhook-mailer at python.org (miss-islington) Date: Mon, 23 May 2022 16:35:17 -0000 Subject: [Python-checkins] GH-93115: Fix version check in sqlite3 module constants test (GH-93116) Message-ID: https://github.com/python/cpython/commit/acc998a83140e2d085037f40bf0cc5dcd64c8740 commit: acc998a83140e2d085037f40bf0cc5dcd64c8740 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-23T09:35:13-07:00 summary: GH-93115: Fix version check in sqlite3 module constants test (GH-93116) (cherry picked from commit d5f0dd160011826f0196d220aefc29d2ce497428) Co-authored-by: Florian Bruhin files: M Lib/test/test_sqlite3/test_dbapi.py diff --git a/Lib/test/test_sqlite3/test_dbapi.py b/Lib/test/test_sqlite3/test_dbapi.py index a7783f3066369..e514adb35eec1 100644 --- a/Lib/test/test_sqlite3/test_dbapi.py +++ b/Lib/test/test_sqlite3/test_dbapi.py @@ -228,7 +228,7 @@ def test_module_constants(self): "SQLITE_READONLY_CANTLOCK", "SQLITE_READONLY_RECOVERY", ] - if sqlite.version_info >= (3, 7, 16): + if sqlite.sqlite_version_info >= (3, 7, 16): consts += [ "SQLITE_CONSTRAINT_CHECK", "SQLITE_CONSTRAINT_COMMITHOOK", @@ -241,63 +241,63 @@ def test_module_constants(self): "SQLITE_CONSTRAINT_VTAB", "SQLITE_READONLY_ROLLBACK", ] - if sqlite.version_info >= (3, 7, 17): + if sqlite.sqlite_version_info >= (3, 7, 17): consts += [ "SQLITE_IOERR_MMAP", "SQLITE_NOTICE_RECOVER_ROLLBACK", "SQLITE_NOTICE_RECOVER_WAL", ] - if sqlite.version_info >= (3, 8, 0): + if sqlite.sqlite_version_info >= (3, 8, 0): consts += [ "SQLITE_BUSY_SNAPSHOT", "SQLITE_IOERR_GETTEMPPATH", "SQLITE_WARNING_AUTOINDEX", ] - if sqlite.version_info >= (3, 8, 1): + if sqlite.sqlite_version_info >= (3, 8, 1): consts += ["SQLITE_CANTOPEN_CONVPATH", "SQLITE_IOERR_CONVPATH"] - if sqlite.version_info >= (3, 8, 2): + if sqlite.sqlite_version_info >= (3, 8, 2): consts.append("SQLITE_CONSTRAINT_ROWID") - if sqlite.version_info >= (3, 8, 3): + if sqlite.sqlite_version_info >= (3, 8, 3): consts.append("SQLITE_READONLY_DBMOVED") - if sqlite.version_info >= (3, 8, 7): + if sqlite.sqlite_version_info >= (3, 8, 7): consts.append("SQLITE_AUTH_USER") - if sqlite.version_info >= (3, 9, 0): + if sqlite.sqlite_version_info >= (3, 9, 0): consts.append("SQLITE_IOERR_VNODE") - if sqlite.version_info >= (3, 10, 0): + if sqlite.sqlite_version_info >= (3, 10, 0): consts.append("SQLITE_IOERR_AUTH") - if sqlite.version_info >= (3, 14, 1): + if sqlite.sqlite_version_info >= (3, 14, 1): consts.append("SQLITE_OK_LOAD_PERMANENTLY") - if sqlite.version_info >= (3, 21, 0): + if sqlite.sqlite_version_info >= (3, 21, 0): consts += [ "SQLITE_IOERR_BEGIN_ATOMIC", "SQLITE_IOERR_COMMIT_ATOMIC", "SQLITE_IOERR_ROLLBACK_ATOMIC", ] - if sqlite.version_info >= (3, 22, 0): + if sqlite.sqlite_version_info >= (3, 22, 0): consts += [ "SQLITE_ERROR_MISSING_COLLSEQ", "SQLITE_ERROR_RETRY", "SQLITE_READONLY_CANTINIT", "SQLITE_READONLY_DIRECTORY", ] - if sqlite.version_info >= (3, 24, 0): + if sqlite.sqlite_version_info >= (3, 24, 0): consts += ["SQLITE_CORRUPT_SEQUENCE", "SQLITE_LOCKED_VTAB"] - if sqlite.version_info >= (3, 25, 0): + if sqlite.sqlite_version_info >= (3, 25, 0): consts += ["SQLITE_CANTOPEN_DIRTYWAL", "SQLITE_ERROR_SNAPSHOT"] - if sqlite.version_info >= (3, 31, 0): + if sqlite.sqlite_version_info >= (3, 31, 0): consts += [ "SQLITE_CANTOPEN_SYMLINK", "SQLITE_CONSTRAINT_PINNED", "SQLITE_OK_SYMLINK", ] - if sqlite.version_info >= (3, 32, 0): + if sqlite.sqlite_version_info >= (3, 32, 0): consts += [ "SQLITE_BUSY_TIMEOUT", "SQLITE_CORRUPT_INDEX", "SQLITE_IOERR_DATA", ] - if sqlite.version_info >= (3, 34, 0): - const.append("SQLITE_IOERR_CORRUPTFS") + if sqlite.sqlite_version_info >= (3, 34, 0): + consts.append("SQLITE_IOERR_CORRUPTFS") for const in consts: with self.subTest(const=const): self.assertTrue(hasattr(sqlite, const)) From webhook-mailer at python.org Mon May 23 12:39:17 2022 From: webhook-mailer at python.org (zooba) Date: Mon, 23 May 2022 16:39:17 -0000 Subject: [Python-checkins] gh-92913: Fix typos in documentation (GH-93129) Message-ID: https://github.com/python/cpython/commit/6a6f823ea7f565722148462a0372aa90085637bc commit: 6a6f823ea7f565722148462a0372aa90085637bc branch: main author: Steve Dower committer: zooba date: 2022-05-23T17:39:10+01:00 summary: gh-92913: Fix typos in documentation (GH-93129) files: M Doc/c-api/init_config.rst diff --git a/Doc/c-api/init_config.rst b/Doc/c-api/init_config.rst index b1e9800352fee..34883c9f349f5 100644 --- a/Doc/c-api/init_config.rst +++ b/Doc/c-api/init_config.rst @@ -1322,9 +1322,9 @@ initialization:: } /* Specify sys.path explicitly */ - /* To calculate the default and then modify, finish initialization and - then use PySys_GetObject("path") to get the list. */ - condig.module_search_paths_set = 1 + /* If you want to modify the default set of paths, finish + initialization first and then use PySys_GetObject("path") */ + config.module_search_paths_set = 1; status = PyWideStringList_Append(&config.module_search_paths, L"/path/to/stdlib"); if (PyStatus_Exception(status)) { From webhook-mailer at python.org Mon May 23 12:42:46 2022 From: webhook-mailer at python.org (miss-islington) Date: Mon, 23 May 2022 16:42:46 -0000 Subject: [Python-checkins] gh-93005: Fixes launcher test when no Python install is available (GH-93007) Message-ID: https://github.com/python/cpython/commit/8c5739e42598b62facaec0466c84560e1a348334 commit: 8c5739e42598b62facaec0466c84560e1a348334 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-23T09:42:41-07:00 summary: gh-93005: Fixes launcher test when no Python install is available (GH-93007) (cherry picked from commit 949dbf97ba09da3cfb243d5ad7f90967ad15f354) Co-authored-by: Steve Dower files: M Lib/test/test_launcher.py M PC/launcher2.c diff --git a/Lib/test/test_launcher.py b/Lib/test/test_launcher.py index aeacbbecbfa12..8d9de688f0a53 100644 --- a/Lib/test/test_launcher.py +++ b/Lib/test/test_launcher.py @@ -245,7 +245,7 @@ def script(self, content, encoding="utf-8"): file.unlink() @contextlib.contextmanager - def test_venv(self): + def fake_venv(self): venv = Path.cwd() / "Scripts" venv.mkdir(exist_ok=True, parents=True) venv_exe = (venv / Path(sys.executable).name) @@ -462,7 +462,7 @@ def test_py_default_in_list(self): self.assertEqual("PythonTestSuite/3.100", default) def test_virtualenv_in_list(self): - with self.test_venv() as (venv_exe, env): + with self.fake_venv() as (venv_exe, env): data = self.run_py(["-0p"], env=env) for line in data["stdout"].splitlines(): m = re.match(r"\s*\*\s+(.+)$", line) @@ -482,9 +482,9 @@ def test_virtualenv_in_list(self): self.fail("did not find active venv entry") def test_virtualenv_with_env(self): - with self.test_venv() as (venv_exe, env): - data1 = self.run_py([], env={**env, "PY_PYTHON": "-3"}) - data2 = self.run_py(["-3"], env={**env, "PY_PYTHON": "-3"}) + with self.fake_venv() as (venv_exe, env): + data1 = self.run_py([], env={**env, "PY_PYTHON": "PythonTestSuite/3"}) + data2 = self.run_py(["-3"], env={**env, "PY_PYTHON": "PythonTestSuite/3"}) # Compare stdout, because stderr goes via ascii self.assertEqual(data1["stdout"].strip(), str(venv_exe)) self.assertEqual(data1["SearchInfo.lowPriorityTag"], "True") diff --git a/PC/launcher2.c b/PC/launcher2.c index 763bc138ed71d..ae11f4f024a90 100644 --- a/PC/launcher2.c +++ b/PC/launcher2.c @@ -972,9 +972,6 @@ checkDefaults(SearchInfo *search) if (!slash) { search->tag = tag; search->tagLength = n; - // gh-92817: allow a high priority env to be selected even if it - // doesn't match the tag - search->lowPriorityTag = true; } else { search->company = tag; search->companyLength = (int)(slash - tag); @@ -982,6 +979,9 @@ checkDefaults(SearchInfo *search) search->tagLength = n - (search->companyLength + 1); search->oldStyleTag = false; } + // gh-92817: allow a high priority env to be selected even if it + // doesn't match the tag + search->lowPriorityTag = true; } return 0; From webhook-mailer at python.org Mon May 23 12:54:48 2022 From: webhook-mailer at python.org (miss-islington) Date: Mon, 23 May 2022 16:54:48 -0000 Subject: [Python-checkins] gh-92913: Fix typos in documentation (GH-93129) Message-ID: https://github.com/python/cpython/commit/fc31e2de3cf26bf10e56309b02f147fe8e9b9cfd commit: fc31e2de3cf26bf10e56309b02f147fe8e9b9cfd branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-23T09:54:36-07:00 summary: gh-92913: Fix typos in documentation (GH-93129) (cherry picked from commit 6a6f823ea7f565722148462a0372aa90085637bc) Co-authored-by: Steve Dower files: M Doc/c-api/init_config.rst diff --git a/Doc/c-api/init_config.rst b/Doc/c-api/init_config.rst index d6a12375cd56f..41826c8a5e53c 100644 --- a/Doc/c-api/init_config.rst +++ b/Doc/c-api/init_config.rst @@ -1319,9 +1319,9 @@ initialization:: } /* Specify sys.path explicitly */ - /* To calculate the default and then modify, finish initialization and - then use PySys_GetObject("path") to get the list. */ - condig.module_search_paths_set = 1 + /* If you want to modify the default set of paths, finish + initialization first and then use PySys_GetObject("path") */ + config.module_search_paths_set = 1; status = PyWideStringList_Append(&config.module_search_paths, L"/path/to/stdlib"); if (PyStatus_Exception(status)) { From webhook-mailer at python.org Mon May 23 12:57:17 2022 From: webhook-mailer at python.org (miss-islington) Date: Mon, 23 May 2022 16:57:17 -0000 Subject: [Python-checkins] gh-93010: InvalidHeaderError used but nonexistent (GH-93015) Message-ID: https://github.com/python/cpython/commit/a509d2674a388a13ca55451480673e2af2ab2875 commit: a509d2674a388a13ca55451480673e2af2ab2875 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-23T09:57:12-07:00 summary: gh-93010: InvalidHeaderError used but nonexistent (GH-93015) * fix issue 93010 Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com> (cherry picked from commit 71abeb0895f7563dc5ac4b4f077a8f87dab57e7a) Co-authored-by: oda-gitso <105083118+oda-gitso at users.noreply.github.com> files: A Misc/NEWS.d/next/Library/2022-05-20-15-52-43.gh-issue-93010.WF-cAc.rst M Lib/email/_header_value_parser.py M Lib/test/test_email/test_email.py diff --git a/Lib/email/_header_value_parser.py b/Lib/email/_header_value_parser.py index 8a8fb8bc42a95..e637e6df06612 100644 --- a/Lib/email/_header_value_parser.py +++ b/Lib/email/_header_value_parser.py @@ -2379,7 +2379,7 @@ def get_section(value): digits += value[0] value = value[1:] if digits[0] == '0' and digits != '0': - section.defects.append(errors.InvalidHeaderError( + section.defects.append(errors.InvalidHeaderDefect( "section number has an invalid leading 0")) section.number = int(digits) section.append(ValueTerminal(digits, 'digits')) diff --git a/Lib/test/test_email/test_email.py b/Lib/test/test_email/test_email.py index 69f883a3673f2..2b1e2b864feda 100644 --- a/Lib/test/test_email/test_email.py +++ b/Lib/test/test_email/test_email.py @@ -19,24 +19,25 @@ import email.policy from email.charset import Charset -from email.header import Header, decode_header, make_header -from email.parser import Parser, HeaderParser from email.generator import Generator, DecodedGenerator, BytesGenerator +from email.header import Header, decode_header, make_header +from email.headerregistry import HeaderRegistry from email.message import Message from email.mime.application import MIMEApplication from email.mime.audio import MIMEAudio -from email.mime.text import MIMEText -from email.mime.image import MIMEImage from email.mime.base import MIMEBase +from email.mime.image import MIMEImage from email.mime.message import MIMEMessage from email.mime.multipart import MIMEMultipart from email.mime.nonmultipart import MIMENonMultipart -from email import utils -from email import errors +from email.mime.text import MIMEText +from email.parser import Parser, HeaderParser +from email import base64mime from email import encoders +from email import errors from email import iterators -from email import base64mime from email import quoprimime +from email import utils from test.support import threading_helper from test.support.os_helper import unlink @@ -5541,7 +5542,12 @@ def test_long_headers_flatten(self): result = fp.getvalue() self._signed_parts_eq(original, result) - +class TestHeaderRegistry(TestEmailBase): + # See issue gh-93010. + def test_HeaderRegistry(self): + reg = HeaderRegistry() + a = reg('Content-Disposition', 'attachment; 0*00="foo"') + self.assertIsInstance(a.defects[0], errors.InvalidHeaderDefect) if __name__ == '__main__': unittest.main() diff --git a/Misc/NEWS.d/next/Library/2022-05-20-15-52-43.gh-issue-93010.WF-cAc.rst b/Misc/NEWS.d/next/Library/2022-05-20-15-52-43.gh-issue-93010.WF-cAc.rst new file mode 100644 index 0000000000000..24208b5160ed5 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-05-20-15-52-43.gh-issue-93010.WF-cAc.rst @@ -0,0 +1 @@ +In a very special case, the email package tried to append the nonexistent ``InvalidHeaderError`` to the defect list. It should have been ``InvalidHeaderDefect``. From webhook-mailer at python.org Mon May 23 13:02:22 2022 From: webhook-mailer at python.org (miss-islington) Date: Mon, 23 May 2022 17:02:22 -0000 Subject: [Python-checkins] gh-93010: InvalidHeaderError used but nonexistent (GH-93015) Message-ID: https://github.com/python/cpython/commit/b15b94de091d184e1f1281af190debaf9b92de78 commit: b15b94de091d184e1f1281af190debaf9b92de78 branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-23T10:02:15-07:00 summary: gh-93010: InvalidHeaderError used but nonexistent (GH-93015) * fix issue 93010 Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com> (cherry picked from commit 71abeb0895f7563dc5ac4b4f077a8f87dab57e7a) Co-authored-by: oda-gitso <105083118+oda-gitso at users.noreply.github.com> files: A Misc/NEWS.d/next/Library/2022-05-20-15-52-43.gh-issue-93010.WF-cAc.rst M Lib/email/_header_value_parser.py M Lib/test/test_email/test_email.py diff --git a/Lib/email/_header_value_parser.py b/Lib/email/_header_value_parser.py index 8a8fb8bc42a95..e637e6df06612 100644 --- a/Lib/email/_header_value_parser.py +++ b/Lib/email/_header_value_parser.py @@ -2379,7 +2379,7 @@ def get_section(value): digits += value[0] value = value[1:] if digits[0] == '0' and digits != '0': - section.defects.append(errors.InvalidHeaderError( + section.defects.append(errors.InvalidHeaderDefect( "section number has an invalid leading 0")) section.number = int(digits) section.append(ValueTerminal(digits, 'digits')) diff --git a/Lib/test/test_email/test_email.py b/Lib/test/test_email/test_email.py index af0ea03fedf0c..3a5663ac01d0f 100644 --- a/Lib/test/test_email/test_email.py +++ b/Lib/test/test_email/test_email.py @@ -18,24 +18,25 @@ import email.policy from email.charset import Charset -from email.header import Header, decode_header, make_header -from email.parser import Parser, HeaderParser from email.generator import Generator, DecodedGenerator, BytesGenerator +from email.header import Header, decode_header, make_header +from email.headerregistry import HeaderRegistry from email.message import Message from email.mime.application import MIMEApplication from email.mime.audio import MIMEAudio -from email.mime.text import MIMEText -from email.mime.image import MIMEImage from email.mime.base import MIMEBase +from email.mime.image import MIMEImage from email.mime.message import MIMEMessage from email.mime.multipart import MIMEMultipart from email.mime.nonmultipart import MIMENonMultipart -from email import utils -from email import errors +from email.mime.text import MIMEText +from email.parser import Parser, HeaderParser +from email import base64mime from email import encoders +from email import errors from email import iterators -from email import base64mime from email import quoprimime +from email import utils from test.support import threading_helper from test.support.os_helper import unlink @@ -5508,7 +5509,12 @@ def test_long_headers_flatten(self): result = fp.getvalue() self._signed_parts_eq(original, result) - +class TestHeaderRegistry(TestEmailBase): + # See issue gh-93010. + def test_HeaderRegistry(self): + reg = HeaderRegistry() + a = reg('Content-Disposition', 'attachment; 0*00="foo"') + self.assertIsInstance(a.defects[0], errors.InvalidHeaderDefect) if __name__ == '__main__': unittest.main() diff --git a/Misc/NEWS.d/next/Library/2022-05-20-15-52-43.gh-issue-93010.WF-cAc.rst b/Misc/NEWS.d/next/Library/2022-05-20-15-52-43.gh-issue-93010.WF-cAc.rst new file mode 100644 index 0000000000000..24208b5160ed5 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-05-20-15-52-43.gh-issue-93010.WF-cAc.rst @@ -0,0 +1 @@ +In a very special case, the email package tried to append the nonexistent ``InvalidHeaderError`` to the defect list. It should have been ``InvalidHeaderDefect``. From webhook-mailer at python.org Mon May 23 13:11:28 2022 From: webhook-mailer at python.org (ethanfurman) Date: Mon, 23 May 2022 17:11:28 -0000 Subject: [Python-checkins] [3.11] gh-93100: [Enum] fix missing variable in global_str (GH-93107) (GH-93134) Message-ID: https://github.com/python/cpython/commit/96218f774e2b3c5a4ded5f48b22ec97e02043def commit: 96218f774e2b3c5a4ded5f48b22ec97e02043def branch: 3.11 author: Ethan Furman committer: ethanfurman date: 2022-05-23T10:11:18-07:00 summary: [3.11] gh-93100: [Enum] fix missing variable in global_str (GH-93107) (GH-93134) (cherry picked from commit 046df59658c9f64a9f0fc909ed62e92c6c4dd668) Co-authored-by: Ethan Furman files: M Lib/enum.py M Lib/test/test_enum.py diff --git a/Lib/enum.py b/Lib/enum.py index b9811fe9e6787..43cd1bc2b1e31 100644 --- a/Lib/enum.py +++ b/Lib/enum.py @@ -1643,6 +1643,7 @@ def global_str(self): use enum_name instead of class.enum_name """ if self._name_ is None: + cls_name = self.__class__.__name__ return "%s(%r)" % (cls_name, self._value_) else: return self._name_ diff --git a/Lib/test/test_enum.py b/Lib/test/test_enum.py index f9e09027228b4..c9ed08397d77c 100644 --- a/Lib/test/test_enum.py +++ b/Lib/test/test_enum.py @@ -189,6 +189,12 @@ class HeadlightsC(IntFlag, boundary=enum.CONFORM): FOG_C = auto() + at enum.global_enum +class NoName(Flag): + ONE = 1 + TWO = 2 + + # tests class _EnumTests: @@ -614,6 +620,7 @@ class _PlainOutputTests: def test_str(self): TE = self.MainEnum if self.is_flag: + self.assertEqual(str(TE(0)), "MainEnum(0)") self.assertEqual(str(TE.dupe), "MainEnum.dupe") self.assertEqual(str(self.dupe2), "MainEnum.first|third") else: @@ -3238,6 +3245,10 @@ def test_global_repr_conform1(self): '%(m)s.OFF_C' % {'m': SHORT_MODULE}, ) + def test_global_enum_str(self): + self.assertEqual(str(NoName.ONE & NoName.TWO), 'NoName(0)') + self.assertEqual(str(NoName(0)), 'NoName(0)') + def test_format(self): Perm = self.Perm self.assertEqual(format(Perm.R, ''), '4') From webhook-mailer at python.org Mon May 23 13:59:31 2022 From: webhook-mailer at python.org (serhiy-storchaka) Date: Mon, 23 May 2022 17:59:31 -0000 Subject: [Python-checkins] gh-83245: Raise BadZipFile instead of ValueError when reading a corrupt ZIP file (GH-32291) Message-ID: https://github.com/python/cpython/commit/202ed2506c84cd98e9e35621b5b2929ceb717864 commit: 202ed2506c84cd98e9e35621b5b2929ceb717864 branch: main author: Sam Ezeh committer: serhiy-storchaka date: 2022-05-23T20:59:21+03:00 summary: gh-83245: Raise BadZipFile instead of ValueError when reading a corrupt ZIP file (GH-32291) Co-authored-by: Serhiy Storchaka files: A Misc/NEWS.d/next/Library/2022-04-03-19-40-09.bpo-39064.76PbIz.rst M Lib/test/test_zipfile.py M Lib/zipfile.py diff --git a/Lib/test/test_zipfile.py b/Lib/test/test_zipfile.py index 848bf4f76d453..f4c11d88c8a09 100644 --- a/Lib/test/test_zipfile.py +++ b/Lib/test/test_zipfile.py @@ -1740,6 +1740,17 @@ def test_empty_file_raises_BadZipFile(self): fp.write("short file") self.assertRaises(zipfile.BadZipFile, zipfile.ZipFile, TESTFN) + def test_negative_central_directory_offset_raises_BadZipFile(self): + # Zip file containing an empty EOCD record + buffer = bytearray(b'PK\x05\x06' + b'\0'*18) + + # Set the size of the central directory bytes to become 1, + # causing the central directory offset to become negative + for dirsize in 1, 2**32-1: + buffer[12:16] = struct.pack(' https://github.com/python/cpython/commit/a49721ea075a18a7787ace6752b4eb0954e1b607 commit: a49721ea075a18a7787ace6752b4eb0954e1b607 branch: main author: Ethan Furman committer: ethanfurman date: 2022-05-23T11:21:58-07:00 summary: gh-93118: [Enum] fix error message (GH-93138) Include member names in error message. files: M Lib/enum.py diff --git a/Lib/enum.py b/Lib/enum.py index 62fd5ce8fb9a0..64b44197df522 100644 --- a/Lib/enum.py +++ b/Lib/enum.py @@ -480,8 +480,9 @@ def __new__(metacls, cls, bases, classdict, *, boundary=None, _simple=False, **k # check for illegal enum names (any others?) invalid_names = set(member_names) & {'mro', ''} if invalid_names: - raise ValueError('invalid enum member name(s) '.format( - ','.join(repr(n) for n in invalid_names))) + raise ValueError('invalid enum member name(s) %s' % ( + ','.join(repr(n) for n in invalid_names) + )) # # adjust the sunders _order_ = classdict.pop('_order_', None) From webhook-mailer at python.org Mon May 23 14:59:07 2022 From: webhook-mailer at python.org (sweeneyde) Date: Mon, 23 May 2022 18:59:07 -0000 Subject: [Python-checkins] gh-93061: Mark as artificial: backwards jump after async for (GH-93062) (GH-93110) Message-ID: https://github.com/python/cpython/commit/f0950585a3723fd674964733ae3ced9217cf9d21 commit: f0950585a3723fd674964733ae3ced9217cf9d21 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: sweeneyde <36520290+sweeneyde at users.noreply.github.com> date: 2022-05-23T14:58:53-04:00 summary: gh-93061: Mark as artificial: backwards jump after async for (GH-93062) (GH-93110) (cherry picked from commit a458be3263b4cb92f3fde726461e8ef44b2a4a9d) Co-authored-by: Dennis Sweeney <36520290+sweeneyde at users.noreply.github.com> files: A Misc/NEWS.d/next/Core and Builtins/2022-05-22-02-37-50.gh-issue-93061.r70Imp.rst M Lib/test/test_sys_settrace.py M Python/compile.c diff --git a/Lib/test/test_sys_settrace.py b/Lib/test/test_sys_settrace.py index 9cc6bcfcab5e1..162fd8328582c 100644 --- a/Lib/test/test_sys_settrace.py +++ b/Lib/test/test_sys_settrace.py @@ -609,6 +609,58 @@ def run(tracer): self.compare_events(doit_async.__code__.co_firstlineno, tracer.events, events) + def test_async_for_backwards_jump_has_no_line(self): + async def arange(n): + for i in range(n): + yield i + async def f(): + async for i in arange(3): + if i > 100: + break # should never be traced + + tracer = self.make_tracer() + coro = f() + try: + sys.settrace(tracer.trace) + coro.send(None) + except Exception: + pass + finally: + sys.settrace(None) + + events = [ + (0, 'call'), + (1, 'line'), + (-3, 'call'), + (-2, 'line'), + (-1, 'line'), + (-1, 'return'), + (1, 'exception'), + (2, 'line'), + (1, 'line'), + (-1, 'call'), + (-2, 'line'), + (-1, 'line'), + (-1, 'return'), + (1, 'exception'), + (2, 'line'), + (1, 'line'), + (-1, 'call'), + (-2, 'line'), + (-1, 'line'), + (-1, 'return'), + (1, 'exception'), + (2, 'line'), + (1, 'line'), + (-1, 'call'), + (-2, 'line'), + (-2, 'return'), + (1, 'exception'), + (1, 'return'), + ] + self.compare_events(f.__code__.co_firstlineno, + tracer.events, events) + def test_21_repeated_pass(self): def func(): pass diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-22-02-37-50.gh-issue-93061.r70Imp.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-22-02-37-50.gh-issue-93061.r70Imp.rst new file mode 100644 index 0000000000000..d41e59028ad57 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-05-22-02-37-50.gh-issue-93061.r70Imp.rst @@ -0,0 +1 @@ +Backward jumps after ``async for`` loops are no longer given dubious line numbers. diff --git a/Python/compile.c b/Python/compile.c index 45944ae85e383..cc0d76e0384c4 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -3152,6 +3152,8 @@ compiler_async_for(struct compiler *c, stmt_ty s) /* Success block for __anext__ */ VISIT(c, expr, s->v.AsyncFor.target); VISIT_SEQ(c, stmt, s->v.AsyncFor.body); + /* Mark jump as artificial */ + UNSET_LOC(c); ADDOP_JUMP(c, JUMP, start); compiler_pop_fblock(c, FOR_LOOP, start); From webhook-mailer at python.org Mon May 23 15:10:22 2022 From: webhook-mailer at python.org (ambv) Date: Mon, 23 May 2022 19:10:22 -0000 Subject: [Python-checkins] gh-93065: Fix HAMT to iterate correctly over 7-level deep trees (GH-93066) Message-ID: https://github.com/python/cpython/commit/c1f5c903a7e4ed27190488f4e33b00d3c3d952e5 commit: c1f5c903a7e4ed27190488f4e33b00d3c3d952e5 branch: main author: Yury Selivanov committer: ambv date: 2022-05-23T21:09:59+02:00 summary: gh-93065: Fix HAMT to iterate correctly over 7-level deep trees (GH-93066) Also while there, clarify a few things about why we reduce the hash to 32 bits. Co-authored-by: Eli Libman Co-authored-by: Yury Selivanov Co-authored-by: ?ukasz Langa files: A Misc/NEWS.d/next/Core and Builtins/2022-05-21-23-21-37.gh-issue-93065.5I18WC.rst M Include/internal/pycore_hamt.h M Lib/test/test_context.py M Misc/ACKS M Python/hamt.c diff --git a/Include/internal/pycore_hamt.h b/Include/internal/pycore_hamt.h index 85e35c5afc90c..4d64288bbab49 100644 --- a/Include/internal/pycore_hamt.h +++ b/Include/internal/pycore_hamt.h @@ -5,7 +5,19 @@ # error "this header requires Py_BUILD_CORE define" #endif -#define _Py_HAMT_MAX_TREE_DEPTH 7 + +/* +HAMT tree is shaped by hashes of keys. Every group of 5 bits of a hash denotes +the exact position of the key in one level of the tree. Since we're using +32 bit hashes, we can have at most 7 such levels. Although if there are +two distinct keys with equal hashes, they will have to occupy the same +cell in the 7th level of the tree -- so we'd put them in a "collision" node. +Which brings the total possible tree depth to 8. Read more about the actual +layout of the HAMT tree in `hamt.c`. + +This constant is used to define a datastucture for storing iteration state. +*/ +#define _Py_HAMT_MAX_TREE_DEPTH 8 extern PyTypeObject _PyHamt_Type; diff --git a/Lib/test/test_context.py b/Lib/test/test_context.py index 3132cea668cb1..b1aece4f5c9c4 100644 --- a/Lib/test/test_context.py +++ b/Lib/test/test_context.py @@ -535,6 +535,41 @@ def test_hamt_collision_1(self): self.assertEqual(len(h4), 2) self.assertEqual(len(h5), 3) + def test_hamt_collision_3(self): + # Test that iteration works with the deepest tree possible. + # https://github.com/python/cpython/issues/93065 + + C = HashKey(0b10000000_00000000_00000000_00000000, 'C') + D = HashKey(0b10000000_00000000_00000000_00000000, 'D') + + E = HashKey(0b00000000_00000000_00000000_00000000, 'E') + + h = hamt() + h = h.set(C, 'C') + h = h.set(D, 'D') + h = h.set(E, 'E') + + # BitmapNode(size=2 count=1 bitmap=0b1): + # NULL: + # BitmapNode(size=2 count=1 bitmap=0b1): + # NULL: + # BitmapNode(size=2 count=1 bitmap=0b1): + # NULL: + # BitmapNode(size=2 count=1 bitmap=0b1): + # NULL: + # BitmapNode(size=2 count=1 bitmap=0b1): + # NULL: + # BitmapNode(size=2 count=1 bitmap=0b1): + # NULL: + # BitmapNode(size=4 count=2 bitmap=0b101): + # : 'E' + # NULL: + # CollisionNode(size=4 id=0x107a24520): + # : 'C' + # : 'D' + + self.assertEqual({k.name for k in h.keys()}, {'C', 'D', 'E'}) + def test_hamt_stress(self): COLLECTION_SIZE = 7000 TEST_ITERS_EVERY = 647 diff --git a/Misc/ACKS b/Misc/ACKS index f3d8924ea62af..d0e18303434f2 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1062,6 +1062,7 @@ Robert Li Xuanji Li Zekun Li Zheao Li +Eli Libman Dan Lidral-Porter Robert van Liere Ross Light diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-21-23-21-37.gh-issue-93065.5I18WC.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-21-23-21-37.gh-issue-93065.5I18WC.rst new file mode 100644 index 0000000000000..ea801653f7502 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-05-21-23-21-37.gh-issue-93065.5I18WC.rst @@ -0,0 +1,5 @@ +Fix contextvars HAMT implementation to handle iteration over deep trees. + +The bug was discovered and fixed by Eli Libman. See +`MagicStack/immutables#84 `_ +for more details. diff --git a/Python/hamt.c b/Python/hamt.c index c3cb4e6fda450..908c253187031 100644 --- a/Python/hamt.c +++ b/Python/hamt.c @@ -409,14 +409,22 @@ hamt_hash(PyObject *o) return -1; } - /* While it's suboptimal to reduce Python's 64 bit hash to + /* While it's somewhat suboptimal to reduce Python's 64 bit hash to 32 bits via XOR, it seems that the resulting hash function is good enough (this is also how Long type is hashed in Java.) Storing 10, 100, 1000 Python strings results in a relatively shallow and uniform tree structure. - Please don't change this hashing algorithm, as there are many - tests that test some exact tree shape to cover all code paths. + Also it's worth noting that it would be possible to adapt the tree + structure to 64 bit hashes, but that would increase memory pressure + and provide little to no performance benefits for collections with + fewer than billions of key/value pairs. + + Important: do not change this hash reducing function. There are many + tests that need an exact tree shape to cover all code paths and + we do that by specifying concrete values for test data's `__hash__`. + If this function is changed most of the regression tests would + become useless. */ int32_t xored = (int32_t)(hash & 0xffffffffl) ^ (int32_t)(hash >> 32); return xored == -1 ? -2 : xored; From webhook-mailer at python.org Mon May 23 15:18:48 2022 From: webhook-mailer at python.org (vsajip) Date: Mon, 23 May 2022 19:18:48 -0000 Subject: [Python-checkins] gh-92859: Doc: add info about logging.debug() calling basicConfig() (GH-93063) Message-ID: https://github.com/python/cpython/commit/2176898308acafedf87a48d33f29645e79b9af86 commit: 2176898308acafedf87a48d33f29645e79b9af86 branch: main author: Nicolas Haller committer: vsajip date: 2022-05-23T20:18:43+01:00 summary: gh-92859: Doc: add info about logging.debug() calling basicConfig() (GH-93063) files: M Doc/howto/logging.rst M Doc/library/logging.rst diff --git a/Doc/howto/logging.rst b/Doc/howto/logging.rst index 4d76c27332ccd3..93400627136e35 100644 --- a/Doc/howto/logging.rst +++ b/Doc/howto/logging.rst @@ -178,10 +178,11 @@ following example:: raise ValueError('Invalid log level: %s' % loglevel) logging.basicConfig(level=numeric_level, ...) -The call to :func:`basicConfig` should come *before* any calls to :func:`debug`, -:func:`info` etc. As it's intended as a one-off simple configuration facility, -only the first call will actually do anything: subsequent calls are effectively -no-ops. +The call to :func:`basicConfig` should come *before* any calls to +:func:`debug`, :func:`info`, etc. Otherwise, those functions will call +:func:`basicConfig` for you with the default options. As it's intended as a +one-off simple configuration facility, only the first call will actually do +anything: subsequent calls are effectively no-ops. If you run the above script several times, the messages from successive runs are appended to the file *example.log*. If you want each run to start afresh, diff --git a/Doc/library/logging.rst b/Doc/library/logging.rst index b82b90b47dd160..3310c73656258f 100644 --- a/Doc/library/logging.rst +++ b/Doc/library/logging.rst @@ -242,6 +242,10 @@ is the module's name in the Python package namespace. above example). In such circumstances, it is likely that specialized :class:`Formatter`\ s would be used with particular :class:`Handler`\ s. + If no handler is attached to this logger (or any of its ancestors, + taking into account the relevant :attr:`Logger.propagate` attributes), + the message will be sent to the handler set on :attr:`lastResort`. + .. versionchanged:: 3.2 The *stack_info* parameter was added. @@ -1038,6 +1042,10 @@ functions. above example). In such circumstances, it is likely that specialized :class:`Formatter`\ s would be used with particular :class:`Handler`\ s. + This function (as well as :func:`info`, :func:`warning`, :func:`error` and + :func:`critical`) will call :func:`basicConfig` if the root logger doesn't + have any handler attached. + .. versionchanged:: 3.2 The *stack_info* parameter was added. From webhook-mailer at python.org Mon May 23 15:45:17 2022 From: webhook-mailer at python.org (vsajip) Date: Mon, 23 May 2022 19:45:17 -0000 Subject: [Python-checkins] gh-92859: Doc: add info about logging.debug() calling basicConfig() (GH-93063) (GH-93151) Message-ID: https://github.com/python/cpython/commit/cea65730a75c06a34d00ffb29704cc7ac1a56b4b commit: cea65730a75c06a34d00ffb29704cc7ac1a56b4b branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: vsajip date: 2022-05-23T20:45:03+01:00 summary: gh-92859: Doc: add info about logging.debug() calling basicConfig() (GH-93063) (GH-93151) (cherry picked from commit 2176898308acafedf87a48d33f29645e79b9af86) files: M Doc/howto/logging.rst M Doc/library/logging.rst diff --git a/Doc/howto/logging.rst b/Doc/howto/logging.rst index 4d76c27332ccd..93400627136e3 100644 --- a/Doc/howto/logging.rst +++ b/Doc/howto/logging.rst @@ -178,10 +178,11 @@ following example:: raise ValueError('Invalid log level: %s' % loglevel) logging.basicConfig(level=numeric_level, ...) -The call to :func:`basicConfig` should come *before* any calls to :func:`debug`, -:func:`info` etc. As it's intended as a one-off simple configuration facility, -only the first call will actually do anything: subsequent calls are effectively -no-ops. +The call to :func:`basicConfig` should come *before* any calls to +:func:`debug`, :func:`info`, etc. Otherwise, those functions will call +:func:`basicConfig` for you with the default options. As it's intended as a +one-off simple configuration facility, only the first call will actually do +anything: subsequent calls are effectively no-ops. If you run the above script several times, the messages from successive runs are appended to the file *example.log*. If you want each run to start afresh, diff --git a/Doc/library/logging.rst b/Doc/library/logging.rst index b82b90b47dd16..3310c73656258 100644 --- a/Doc/library/logging.rst +++ b/Doc/library/logging.rst @@ -242,6 +242,10 @@ is the module's name in the Python package namespace. above example). In such circumstances, it is likely that specialized :class:`Formatter`\ s would be used with particular :class:`Handler`\ s. + If no handler is attached to this logger (or any of its ancestors, + taking into account the relevant :attr:`Logger.propagate` attributes), + the message will be sent to the handler set on :attr:`lastResort`. + .. versionchanged:: 3.2 The *stack_info* parameter was added. @@ -1038,6 +1042,10 @@ functions. above example). In such circumstances, it is likely that specialized :class:`Formatter`\ s would be used with particular :class:`Handler`\ s. + This function (as well as :func:`info`, :func:`warning`, :func:`error` and + :func:`critical`) will call :func:`basicConfig` if the root logger doesn't + have any handler attached. + .. versionchanged:: 3.2 The *stack_info* parameter was added. From webhook-mailer at python.org Mon May 23 15:45:53 2022 From: webhook-mailer at python.org (vsajip) Date: Mon, 23 May 2022 19:45:53 -0000 Subject: [Python-checkins] [3.10] gh-92859: Doc: add info about logging.debug() calling basicConfig() (GH-93063) (GH-93150) Message-ID: https://github.com/python/cpython/commit/251104f12d0cebb997f26f8ca3dac48202c7456a commit: 251104f12d0cebb997f26f8ca3dac48202c7456a branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: vsajip date: 2022-05-23T20:45:44+01:00 summary: [3.10] gh-92859: Doc: add info about logging.debug() calling basicConfig() (GH-93063) (GH-93150) files: M Doc/howto/logging.rst M Doc/library/logging.rst diff --git a/Doc/howto/logging.rst b/Doc/howto/logging.rst index fcc6bec768800..ff4e1d73a9653 100644 --- a/Doc/howto/logging.rst +++ b/Doc/howto/logging.rst @@ -178,10 +178,11 @@ following example:: raise ValueError('Invalid log level: %s' % loglevel) logging.basicConfig(level=numeric_level, ...) -The call to :func:`basicConfig` should come *before* any calls to :func:`debug`, -:func:`info` etc. As it's intended as a one-off simple configuration facility, -only the first call will actually do anything: subsequent calls are effectively -no-ops. +The call to :func:`basicConfig` should come *before* any calls to +:func:`debug`, :func:`info`, etc. Otherwise, those functions will call +:func:`basicConfig` for you with the default options. As it's intended as a +one-off simple configuration facility, only the first call will actually do +anything: subsequent calls are effectively no-ops. If you run the above script several times, the messages from successive runs are appended to the file *example.log*. If you want each run to start afresh, diff --git a/Doc/library/logging.rst b/Doc/library/logging.rst index b32af94e85d01..c9b049388e6d9 100644 --- a/Doc/library/logging.rst +++ b/Doc/library/logging.rst @@ -242,6 +242,10 @@ is the module's name in the Python package namespace. above example). In such circumstances, it is likely that specialized :class:`Formatter`\ s would be used with particular :class:`Handler`\ s. + If no handler is attached to this logger (or any of its ancestors, + taking into account the relevant :attr:`Logger.propagate` attributes), + the message will be sent to the handler set on :attr:`lastResort`. + .. versionchanged:: 3.2 The *stack_info* parameter was added. @@ -1038,6 +1042,10 @@ functions. above example). In such circumstances, it is likely that specialized :class:`Formatter`\ s would be used with particular :class:`Handler`\ s. + This function (as well as :func:`info`, :func:`warning`, :func:`error` and + :func:`critical`) will call :func:`basicConfig` if the root logger doesn't + have any handler attached. + .. versionchanged:: 3.2 The *stack_info* parameter was added. From webhook-mailer at python.org Mon May 23 17:09:35 2022 From: webhook-mailer at python.org (ned-deily) Date: Mon, 23 May 2022 21:09:35 -0000 Subject: [Python-checkins] [3.7] gh-80254: Disallow recursive usage of cursors in sqlite3 converters (GH-92334) Message-ID: https://github.com/python/cpython/commit/2a353b220b05961ee5cb2ea19bc3f726b3909f8f commit: 2a353b220b05961ee5cb2ea19bc3f726b3909f8f branch: 3.7 author: Erlend Egeberg Aasland committer: ned-deily date: 2022-05-23T17:09:12-04:00 summary: [3.7] gh-80254: Disallow recursive usage of cursors in sqlite3 converters (GH-92334) (cherry picked from commit c908dc5b4798c311981bd7e1f7d92fb623ee448b) Co-authored-by: Sergey Fedoseev Co-authored-by: Jelle Zijlstra files: A Misc/NEWS.d/next/Library/2019-06-22-11-01-45.bpo-36073.ED8mB9.rst M Lib/sqlite3/test/regression.py M Modules/_sqlite/cursor.c diff --git a/Lib/sqlite3/test/regression.py b/Lib/sqlite3/test/regression.py index 25c58f562d4c3..ef0dce5fbaa44 100644 --- a/Lib/sqlite3/test/regression.py +++ b/Lib/sqlite3/test/regression.py @@ -27,6 +27,9 @@ import weakref from test import support +from unittest.mock import patch + + class RegressionTests(unittest.TestCase): def setUp(self): self.con = sqlite.connect(":memory:") @@ -444,11 +447,50 @@ class UnhashableType(type): self.con.execute('SELECT %s()' % aggr_name) +class RecursiveUseOfCursors(unittest.TestCase): + # GH-80254: sqlite3 should not segfault for recursive use of cursors. + msg = "Recursive use of cursors not allowed" + + def setUp(self): + self.con = sqlite.connect(":memory:", + detect_types=sqlite.PARSE_COLNAMES) + self.cur = self.con.cursor() + self.cur.execute("create table test(x foo)") + self.cur.executemany("insert into test(x) values (?)", + [("foo",), ("bar",)]) + + def tearDown(self): + self.cur.close() + self.con.close() + del self.cur + del self.con + + def test_recursive_cursor_init(self): + conv = lambda x: self.cur.__init__(self.con) + with patch.dict(sqlite.converters, {"INIT": conv}): + with self.assertRaisesRegex(sqlite.ProgrammingError, self.msg): + self.cur.execute(f'select x as "x [INIT]", x from test') + + def test_recursive_cursor_close(self): + conv = lambda x: self.cur.close() + with patch.dict(sqlite.converters, {"CLOSE": conv}): + with self.assertRaisesRegex(sqlite.ProgrammingError, self.msg): + self.cur.execute(f'select x as "x [CLOSE]", x from test') + + def test_recursive_cursor_fetch(self): + conv = lambda x, l=[]: self.cur.fetchone() if l else l.append(None) + with patch.dict(sqlite.converters, {"ITER": conv}): + self.cur.execute(f'select x as "x [ITER]", x from test') + with self.assertRaisesRegex(sqlite.ProgrammingError, self.msg): + self.cur.fetchall() + + def suite(): regression_suite = unittest.makeSuite(RegressionTests, "Check") return unittest.TestSuite(( regression_suite, unittest.makeSuite(UnhashableCallbacksTestCase), + unittest.makeSuite(RecursiveUseOfCursors), )) def test(): diff --git a/Misc/NEWS.d/next/Library/2019-06-22-11-01-45.bpo-36073.ED8mB9.rst b/Misc/NEWS.d/next/Library/2019-06-22-11-01-45.bpo-36073.ED8mB9.rst new file mode 100644 index 0000000000000..6c214d8191601 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-06-22-11-01-45.bpo-36073.ED8mB9.rst @@ -0,0 +1,2 @@ +Raise :exc:`~sqlite3.ProgrammingError` instead of segfaulting on recursive +usage of cursors in :mod:`sqlite3` converters. Patch by Sergey Fedoseev. diff --git a/Modules/_sqlite/cursor.c b/Modules/_sqlite/cursor.c index 6c98a99bd0257..b0aaa68eab08e 100644 --- a/Modules/_sqlite/cursor.c +++ b/Modules/_sqlite/cursor.c @@ -27,10 +27,25 @@ PyObject* pysqlite_cursor_iternext(pysqlite_Cursor* self); +static inline int +check_cursor_locked(pysqlite_Cursor *cur) +{ + if (cur->locked) { + PyErr_SetString(pysqlite_ProgrammingError, + "Recursive use of cursors not allowed."); + return 0; + } + return 1; +} + static const char errmsg_fetch_across_rollback[] = "Cursor needed to be reset because of commit/rollback and can no longer be fetched from."; static int pysqlite_cursor_init(pysqlite_Cursor* self, PyObject* args, PyObject* kwargs) { + if (!check_cursor_locked(self)) { + return -1; + } + pysqlite_Connection* connection; if (!PyArg_ParseTuple(args, "O!", &pysqlite_ConnectionType, &connection)) @@ -376,12 +391,9 @@ static int check_cursor(pysqlite_Cursor* cur) return 0; } - if (cur->locked) { - PyErr_SetString(pysqlite_ProgrammingError, "Recursive use of cursors not allowed."); - return 0; - } - - return pysqlite_check_thread(cur->connection) && pysqlite_check_connection(cur->connection); + return (pysqlite_check_thread(cur->connection) + && pysqlite_check_connection(cur->connection) + && check_cursor_locked(cur)); } PyObject* _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject* args) @@ -790,27 +802,29 @@ PyObject* pysqlite_cursor_iternext(pysqlite_Cursor *self) if (self->statement) { rc = pysqlite_step(self->statement->st, self->connection); if (PyErr_Occurred()) { - (void)pysqlite_statement_reset(self->statement); - Py_DECREF(next_row); - return NULL; + goto error; } if (rc != SQLITE_DONE && rc != SQLITE_ROW) { - (void)pysqlite_statement_reset(self->statement); - Py_DECREF(next_row); _pysqlite_seterror(self->connection->db, NULL); - return NULL; + goto error; } if (rc == SQLITE_ROW) { + self->locked = 1; // GH-80254: Prevent recursive use of cursors. self->next_row = _pysqlite_fetch_one_row(self); + self->locked = 0; if (self->next_row == NULL) { - (void)pysqlite_statement_reset(self->statement); - return NULL; + goto error; } } } return next_row; + +error: + (void)pysqlite_statement_reset(self->statement); + Py_DECREF(next_row); + return NULL; } PyObject* pysqlite_cursor_fetchone(pysqlite_Cursor* self, PyObject* args) @@ -905,6 +919,10 @@ PyObject* pysqlite_noop(pysqlite_Connection* self, PyObject* args) PyObject* pysqlite_cursor_close(pysqlite_Cursor* self, PyObject* args) { + if (!check_cursor_locked(self)) { + return NULL; + } + if (!self->connection) { PyErr_SetString(pysqlite_ProgrammingError, "Base Cursor.__init__ not called."); From webhook-mailer at python.org Mon May 23 17:11:29 2022 From: webhook-mailer at python.org (ned-deily) Date: Mon, 23 May 2022 21:11:29 -0000 Subject: [Python-checkins] [3.7] gh-93065: Fix HAMT to iterate correctly over 7-level deep trees (GH-93149) Message-ID: https://github.com/python/cpython/commit/3a4ca49b4b49b77501955dfa5a04191e67822216 commit: 3a4ca49b4b49b77501955dfa5a04191e67822216 branch: 3.7 author: ?ukasz Langa committer: ned-deily date: 2022-05-23T17:11:19-04:00 summary: [3.7] gh-93065: Fix HAMT to iterate correctly over 7-level deep trees (GH-93149) Also while there, clarify a few things about why we reduce the hash to 32 bits. Co-authored-by: Eli Libman Co-authored-by: Yury Selivanov Co-authored-by: ?ukasz Langa (cherry picked from commit c1f5c903a7e4ed27190488f4e33b00d3c3d952e5) files: A Misc/NEWS.d/next/Core and Builtins/2022-05-21-23-21-37.gh-issue-93065.5I18WC.rst M Include/internal/hamt.h M Lib/test/test_context.py M Misc/ACKS M Python/hamt.c diff --git a/Include/internal/hamt.h b/Include/internal/hamt.h index 29ad28b1d8706..6b396f0626d6e 100644 --- a/Include/internal/hamt.h +++ b/Include/internal/hamt.h @@ -2,7 +2,19 @@ #define Py_INTERNAL_HAMT_H -#define _Py_HAMT_MAX_TREE_DEPTH 7 + +/* +HAMT tree is shaped by hashes of keys. Every group of 5 bits of a hash denotes +the exact position of the key in one level of the tree. Since we're using +32 bit hashes, we can have at most 7 such levels. Although if there are +two distinct keys with equal hashes, they will have to occupy the same +cell in the 7th level of the tree -- so we'd put them in a "collision" node. +Which brings the total possible tree depth to 8. Read more about the actual +layout of the HAMT tree in `hamt.c`. + +This constant is used to define a datastucture for storing iteration state. +*/ +#define _Py_HAMT_MAX_TREE_DEPTH 8 #define PyHamt_Check(o) (Py_TYPE(o) == &_PyHamt_Type) diff --git a/Lib/test/test_context.py b/Lib/test/test_context.py index b9e991a400092..b954b135dd6a5 100644 --- a/Lib/test/test_context.py +++ b/Lib/test/test_context.py @@ -537,6 +537,41 @@ def test_hamt_collision_1(self): self.assertEqual(len(h4), 2) self.assertEqual(len(h5), 3) + def test_hamt_collision_3(self): + # Test that iteration works with the deepest tree possible. + # https://github.com/python/cpython/issues/93065 + + C = HashKey(0b10000000_00000000_00000000_00000000, 'C') + D = HashKey(0b10000000_00000000_00000000_00000000, 'D') + + E = HashKey(0b00000000_00000000_00000000_00000000, 'E') + + h = hamt() + h = h.set(C, 'C') + h = h.set(D, 'D') + h = h.set(E, 'E') + + # BitmapNode(size=2 count=1 bitmap=0b1): + # NULL: + # BitmapNode(size=2 count=1 bitmap=0b1): + # NULL: + # BitmapNode(size=2 count=1 bitmap=0b1): + # NULL: + # BitmapNode(size=2 count=1 bitmap=0b1): + # NULL: + # BitmapNode(size=2 count=1 bitmap=0b1): + # NULL: + # BitmapNode(size=2 count=1 bitmap=0b1): + # NULL: + # BitmapNode(size=4 count=2 bitmap=0b101): + # : 'E' + # NULL: + # CollisionNode(size=4 id=0x107a24520): + # : 'C' + # : 'D' + + self.assertEqual({k.name for k in h.keys()}, {'C', 'D', 'E'}) + def test_hamt_stress(self): COLLECTION_SIZE = 7000 TEST_ITERS_EVERY = 647 diff --git a/Misc/ACKS b/Misc/ACKS index a893fdce0e9ac..bd62c958c5d2d 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -963,6 +963,8 @@ Robert Li Xuanji Li Zekun Li Zheao Li +Eli Libman +Dan Lidral-Porter Robert van Liere Ross Light Shawn Ligocki diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-21-23-21-37.gh-issue-93065.5I18WC.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-21-23-21-37.gh-issue-93065.5I18WC.rst new file mode 100644 index 0000000000000..ea801653f7502 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-05-21-23-21-37.gh-issue-93065.5I18WC.rst @@ -0,0 +1,5 @@ +Fix contextvars HAMT implementation to handle iteration over deep trees. + +The bug was discovered and fixed by Eli Libman. See +`MagicStack/immutables#84 `_ +for more details. diff --git a/Python/hamt.c b/Python/hamt.c index 6bcdfac15fd30..acacf639d403e 100644 --- a/Python/hamt.c +++ b/Python/hamt.c @@ -406,14 +406,22 @@ hamt_hash(PyObject *o) return -1; } - /* While it's suboptimal to reduce Python's 64 bit hash to + /* While it's somewhat suboptimal to reduce Python's 64 bit hash to 32 bits via XOR, it seems that the resulting hash function is good enough (this is also how Long type is hashed in Java.) Storing 10, 100, 1000 Python strings results in a relatively shallow and uniform tree structure. - Please don't change this hashing algorithm, as there are many - tests that test some exact tree shape to cover all code paths. + Also it's worth noting that it would be possible to adapt the tree + structure to 64 bit hashes, but that would increase memory pressure + and provide little to no performance benefits for collections with + fewer than billions of key/value pairs. + + Important: do not change this hash reducing function. There are many + tests that need an exact tree shape to cover all code paths and + we do that by specifying concrete values for test data's `__hash__`. + If this function is changed most of the regression tests would + become useless. */ int32_t xored = (int32_t)(hash & 0xffffffffl) ^ (int32_t)(hash >> 32); return xored == -1 ? -2 : xored; From webhook-mailer at python.org Mon May 23 17:37:38 2022 From: webhook-mailer at python.org (ethanfurman) Date: Mon, 23 May 2022 21:37:38 -0000 Subject: [Python-checkins] gh-93118: [Enum] fix error message (GH-93138) (GH-93142) Message-ID: https://github.com/python/cpython/commit/b8c4cc6b76bde5371baee18c76146b86adb81dbb commit: b8c4cc6b76bde5371baee18c76146b86adb81dbb branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: ethanfurman date: 2022-05-23T14:37:18-07:00 summary: gh-93118: [Enum] fix error message (GH-93138) (GH-93142) Include member names in error message. (cherry picked from commit a49721ea075a18a7787ace6752b4eb0954e1b607) files: M Lib/enum.py diff --git a/Lib/enum.py b/Lib/enum.py index 43cd1bc2b1e31..31923d757f803 100644 --- a/Lib/enum.py +++ b/Lib/enum.py @@ -480,8 +480,9 @@ def __new__(metacls, cls, bases, classdict, *, boundary=None, _simple=False, **k # check for illegal enum names (any others?) invalid_names = set(member_names) & {'mro', ''} if invalid_names: - raise ValueError('invalid enum member name(s) '.format( - ','.join(repr(n) for n in invalid_names))) + raise ValueError('invalid enum member name(s) %s' % ( + ','.join(repr(n) for n in invalid_names) + )) # # adjust the sunders _order_ = classdict.pop('_order_', None) From webhook-mailer at python.org Mon May 23 17:45:20 2022 From: webhook-mailer at python.org (JulienPalard) Date: Mon, 23 May 2022 21:45:20 -0000 Subject: [Python-checkins] Doc: No need to use rst syntax in code comments. (GH-93102) Message-ID: https://github.com/python/cpython/commit/e739ff141680fd7e2a762cf98c4352c6c850af1f commit: e739ff141680fd7e2a762cf98c4352c6c850af1f branch: main author: Julien Palard committer: JulienPalard date: 2022-05-23T23:45:16+02:00 summary: Doc: No need to use rst syntax in code comments. (GH-93102) And it raises `make suspicious` false positives. files: M Doc/whatsnew/3.11.rst diff --git a/Doc/whatsnew/3.11.rst b/Doc/whatsnew/3.11.rst index ff94e45f77c70..12b4c22d54807 100644 --- a/Doc/whatsnew/3.11.rst +++ b/Doc/whatsnew/3.11.rst @@ -314,7 +314,7 @@ transforms a class, giving it :func:`dataclasses.dataclass`-like behaviors. For example:: - # The ``create_model`` decorator is defined by a library. + # The create_model decorator is defined by a library. @typing.dataclass_transform() def create_model(cls: Type[T]) -> Type[T]: cls.__init__ = ... @@ -322,7 +322,7 @@ For example:: cls.__ne__ = ... return cls - # The ``create_model`` decorator can now be used to create new model + # The create_model decorator can now be used to create new model # classes, like this: @create_model class CustomerModel: From webhook-mailer at python.org Mon May 23 18:00:49 2022 From: webhook-mailer at python.org (miss-islington) Date: Mon, 23 May 2022 22:00:49 -0000 Subject: [Python-checkins] Doc: No need to use rst syntax in code comments. (GH-93102) Message-ID: https://github.com/python/cpython/commit/fd35be511a5845e887408189a06513063319f417 commit: fd35be511a5845e887408189a06513063319f417 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-23T15:00:34-07:00 summary: Doc: No need to use rst syntax in code comments. (GH-93102) And it raises `make suspicious` false positives. (cherry picked from commit e739ff141680fd7e2a762cf98c4352c6c850af1f) Co-authored-by: Julien Palard files: M Doc/whatsnew/3.11.rst diff --git a/Doc/whatsnew/3.11.rst b/Doc/whatsnew/3.11.rst index ff94e45f77c70..12b4c22d54807 100644 --- a/Doc/whatsnew/3.11.rst +++ b/Doc/whatsnew/3.11.rst @@ -314,7 +314,7 @@ transforms a class, giving it :func:`dataclasses.dataclass`-like behaviors. For example:: - # The ``create_model`` decorator is defined by a library. + # The create_model decorator is defined by a library. @typing.dataclass_transform() def create_model(cls: Type[T]) -> Type[T]: cls.__init__ = ... @@ -322,7 +322,7 @@ For example:: cls.__ne__ = ... return cls - # The ``create_model`` decorator can now be used to create new model + # The create_model decorator can now be used to create new model # classes, like this: @create_model class CustomerModel: From webhook-mailer at python.org Mon May 23 19:53:43 2022 From: webhook-mailer at python.org (sweeneyde) Date: Mon, 23 May 2022 23:53:43 -0000 Subject: [Python-checkins] gh-93061: Mark as artificial: backwards jump after async for (GH-93120) Message-ID: https://github.com/python/cpython/commit/c1b12495f67be5eca2692532de14e81a93025e6a commit: c1b12495f67be5eca2692532de14e81a93025e6a branch: 3.10 author: Dennis Sweeney <36520290+sweeneyde at users.noreply.github.com> committer: sweeneyde <36520290+sweeneyde at users.noreply.github.com> date: 2022-05-23T19:53:38-04:00 summary: gh-93061: Mark as artificial: backwards jump after async for (GH-93120) files: A Misc/NEWS.d/next/Core and Builtins/2022-05-22-02-37-50.gh-issue-93061.r70Imp.rst M Lib/test/test_sys_settrace.py M Python/compile.c diff --git a/Lib/test/test_sys_settrace.py b/Lib/test/test_sys_settrace.py index 76d1aeecf69e4..4b3d096f16315 100644 --- a/Lib/test/test_sys_settrace.py +++ b/Lib/test/test_sys_settrace.py @@ -607,6 +607,58 @@ def run(tracer): self.compare_events(doit_async.__code__.co_firstlineno, tracer.events, events) + def test_async_for_backwards_jump_has_no_line(self): + async def arange(n): + for i in range(n): + yield i + async def f(): + async for i in arange(3): + if i > 100: + break # should never be traced + + tracer = self.make_tracer() + coro = f() + try: + sys.settrace(tracer.trace) + coro.send(None) + except Exception: + pass + finally: + sys.settrace(None) + + events = [ + (0, 'call'), + (1, 'line'), + (-3, 'call'), + (-2, 'line'), + (-1, 'line'), + (-1, 'return'), + (1, 'exception'), + (2, 'line'), + (1, 'line'), + (-1, 'call'), + (-2, 'line'), + (-1, 'line'), + (-1, 'return'), + (1, 'exception'), + (2, 'line'), + (1, 'line'), + (-1, 'call'), + (-2, 'line'), + (-1, 'line'), + (-1, 'return'), + (1, 'exception'), + (2, 'line'), + (1, 'line'), + (-1, 'call'), + (-2, 'line'), + (-2, 'return'), + (1, 'exception'), + (1, 'return'), + ] + self.compare_events(f.__code__.co_firstlineno, + tracer.events, events) + def test_21_repeated_pass(self): def func(): pass diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-22-02-37-50.gh-issue-93061.r70Imp.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-22-02-37-50.gh-issue-93061.r70Imp.rst new file mode 100644 index 0000000000000..d41e59028ad57 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-05-22-02-37-50.gh-issue-93061.r70Imp.rst @@ -0,0 +1 @@ +Backward jumps after ``async for`` loops are no longer given dubious line numbers. diff --git a/Python/compile.c b/Python/compile.c index f012406c06693..7210d42fc7699 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -2925,6 +2925,8 @@ compiler_async_for(struct compiler *c, stmt_ty s) /* Success block for __anext__ */ VISIT(c, expr, s->v.AsyncFor.target); VISIT_SEQ(c, stmt, s->v.AsyncFor.body); + /* Mark jump as artificial */ + c->u->u_lineno = -1; ADDOP_JUMP(c, JUMP_ABSOLUTE, start); compiler_pop_fblock(c, FOR_LOOP, start); From webhook-mailer at python.org Mon May 23 20:37:10 2022 From: webhook-mailer at python.org (corona10) Date: Tue, 24 May 2022 00:37:10 -0000 Subject: [Python-checkins] gh-93099: Fix _pyio to use locale module properly (gh-93136) Message-ID: https://github.com/python/cpython/commit/f7fabae75c7b8ecd0c5673b5d62a15db24a05953 commit: f7fabae75c7b8ecd0c5673b5d62a15db24a05953 branch: main author: Dong-hee Na committer: corona10 date: 2022-05-24T09:37:01+09:00 summary: gh-93099: Fix _pyio to use locale module properly (gh-93136) files: M Lib/_pyio.py M Lib/test/test_io.py diff --git a/Lib/_pyio.py b/Lib/_pyio.py index 0f647eed99d81..0bfdeaafae274 100644 --- a/Lib/_pyio.py +++ b/Lib/_pyio.py @@ -2022,13 +2022,7 @@ def __init__(self, buffer, encoding=None, errors=None, newline=None, encoding = text_encoding(encoding) if encoding == "locale": - try: - import locale - except ImportError: - # Importing locale may fail if Python is being built - encoding = "utf-8" - else: - encoding = locale.getencoding() + encoding = self._get_locale_encoding() if not isinstance(encoding, str): raise ValueError("invalid encoding: %r" % encoding) @@ -2162,7 +2156,7 @@ def reconfigure(self, *, if not isinstance(encoding, str): raise TypeError("invalid encoding: %r" % encoding) if encoding == "locale": - encoding = locale.getencoding() + encoding = self._get_locale_encoding() if newline is Ellipsis: newline = self._readnl @@ -2267,6 +2261,15 @@ def _get_decoded_chars(self, n=None): self._decoded_chars_used += len(chars) return chars + def _get_locale_encoding(self): + try: + import locale + except ImportError: + # Importing locale may fail if Python is being built + return "utf-8" + else: + return locale.getencoding() + def _rewind_decoded_chars(self, n): """Rewind the _decoded_chars buffer.""" if self._decoded_chars_used < n: diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py index 039da535d488a..daccbae5b4a1d 100644 --- a/Lib/test/test_io.py +++ b/Lib/test/test_io.py @@ -3570,6 +3570,10 @@ def seekable(self): return True F.tell = lambda x: 0 t = self.TextIOWrapper(F(), encoding='utf-8') + def test_reconfigure_locale(self): + wrapper = io.TextIOWrapper(io.BytesIO(b"test")) + wrapper.reconfigure(encoding="locale") + def test_reconfigure_encoding_read(self): # latin1 -> utf8 # (latin1 can decode utf-8 encoded string) From webhook-mailer at python.org Mon May 23 21:03:46 2022 From: webhook-mailer at python.org (miss-islington) Date: Tue, 24 May 2022 01:03:46 -0000 Subject: [Python-checkins] gh-93099: Fix _pyio to use locale module properly (gh-93136) Message-ID: https://github.com/python/cpython/commit/97fe65a7bebf0f7acbd8af9537c6f4293301892e commit: 97fe65a7bebf0f7acbd8af9537c6f4293301892e branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-23T18:03:37-07:00 summary: gh-93099: Fix _pyio to use locale module properly (gh-93136) (cherry picked from commit f7fabae75c7b8ecd0c5673b5d62a15db24a05953) Co-authored-by: Dong-hee Na files: M Lib/_pyio.py M Lib/test/test_io.py diff --git a/Lib/_pyio.py b/Lib/_pyio.py index 0f647eed99d81..0bfdeaafae274 100644 --- a/Lib/_pyio.py +++ b/Lib/_pyio.py @@ -2022,13 +2022,7 @@ def __init__(self, buffer, encoding=None, errors=None, newline=None, encoding = text_encoding(encoding) if encoding == "locale": - try: - import locale - except ImportError: - # Importing locale may fail if Python is being built - encoding = "utf-8" - else: - encoding = locale.getencoding() + encoding = self._get_locale_encoding() if not isinstance(encoding, str): raise ValueError("invalid encoding: %r" % encoding) @@ -2162,7 +2156,7 @@ def reconfigure(self, *, if not isinstance(encoding, str): raise TypeError("invalid encoding: %r" % encoding) if encoding == "locale": - encoding = locale.getencoding() + encoding = self._get_locale_encoding() if newline is Ellipsis: newline = self._readnl @@ -2267,6 +2261,15 @@ def _get_decoded_chars(self, n=None): self._decoded_chars_used += len(chars) return chars + def _get_locale_encoding(self): + try: + import locale + except ImportError: + # Importing locale may fail if Python is being built + return "utf-8" + else: + return locale.getencoding() + def _rewind_decoded_chars(self, n): """Rewind the _decoded_chars buffer.""" if self._decoded_chars_used < n: diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py index 039da535d488a..daccbae5b4a1d 100644 --- a/Lib/test/test_io.py +++ b/Lib/test/test_io.py @@ -3570,6 +3570,10 @@ def seekable(self): return True F.tell = lambda x: 0 t = self.TextIOWrapper(F(), encoding='utf-8') + def test_reconfigure_locale(self): + wrapper = io.TextIOWrapper(io.BytesIO(b"test")) + wrapper.reconfigure(encoding="locale") + def test_reconfigure_encoding_read(self): # latin1 -> utf8 # (latin1 can decode utf-8 encoded string) From webhook-mailer at python.org Mon May 23 21:46:04 2022 From: webhook-mailer at python.org (methane) Date: Tue, 24 May 2022 01:46:04 -0000 Subject: [Python-checkins] gh-93033: Use wmemchr in stringlib (GH-93034) Message-ID: https://github.com/python/cpython/commit/7108bdf27c7a460cf83c4a01dea54ae4591d8aea commit: 7108bdf27c7a460cf83c4a01dea54ae4591d8aea branch: main author: goldsteinn <35538541+goldsteinn at users.noreply.github.com> committer: methane date: 2022-05-24T10:45:31+09:00 summary: gh-93033: Use wmemchr in stringlib (GH-93034) Generally comparable perf for the "good" case where memchr doesn't return any collisions (false matches on lower byte) but clearly faster with collisions. files: A Misc/NEWS.d/next/Library/2022-05-22-23-46-18.gh-issue-93033.wZfiL-.rst M Objects/bytearrayobject.c M Objects/bytes_methods.c M Objects/stringlib/asciilib.h M Objects/stringlib/fastsearch.h M Objects/stringlib/replace.h M Objects/stringlib/stringdefs.h M Objects/stringlib/ucs1lib.h M Objects/stringlib/ucs2lib.h M Objects/stringlib/ucs4lib.h M Objects/stringlib/undef.h diff --git a/Misc/NEWS.d/next/Library/2022-05-22-23-46-18.gh-issue-93033.wZfiL-.rst b/Misc/NEWS.d/next/Library/2022-05-22-23-46-18.gh-issue-93033.wZfiL-.rst new file mode 100644 index 0000000000000..3cee530339fb5 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-05-22-23-46-18.gh-issue-93033.wZfiL-.rst @@ -0,0 +1 @@ +Search in some strings (platform dependent i.e [U+0xFFFF, U+0x0100] on Windows or [U+0xFFFFFFFF, U+0x00010000] on Linux 64-bit) are now up to 10 times faster. diff --git a/Objects/bytearrayobject.c b/Objects/bytearrayobject.c index b9436d9aa5b1a..d017962641487 100644 --- a/Objects/bytearrayobject.c +++ b/Objects/bytearrayobject.c @@ -1096,6 +1096,7 @@ bytearray_dealloc(PyByteArrayObject *self) #define STRINGLIB_ISSPACE Py_ISSPACE #define STRINGLIB_ISLINEBREAK(x) ((x == '\n') || (x == '\r')) #define STRINGLIB_CHECK_EXACT PyByteArray_CheckExact +#define STRINGLIB_FAST_MEMCHR memchr #define STRINGLIB_MUTABLE 1 #include "stringlib/fastsearch.h" diff --git a/Objects/bytes_methods.c b/Objects/bytes_methods.c index 994fb8a73c6cd..6b8166385d375 100644 --- a/Objects/bytes_methods.c +++ b/Objects/bytes_methods.c @@ -431,6 +431,7 @@ _Py_bytes_maketrans(Py_buffer *frm, Py_buffer *to) #define STRINGLIB(F) stringlib_##F #define STRINGLIB_CHAR char #define STRINGLIB_SIZEOF_CHAR 1 +#define STRINGLIB_FAST_MEMCHR memchr #include "stringlib/fastsearch.h" #include "stringlib/count.h" diff --git a/Objects/stringlib/asciilib.h b/Objects/stringlib/asciilib.h index eebe888e411e0..b3016bfbbb0dd 100644 --- a/Objects/stringlib/asciilib.h +++ b/Objects/stringlib/asciilib.h @@ -21,6 +21,7 @@ #define STRINGLIB_CHECK PyUnicode_Check #define STRINGLIB_CHECK_EXACT PyUnicode_CheckExact #define STRINGLIB_MUTABLE 0 +#define STRINGLIB_FAST_MEMCHR memchr #define STRINGLIB_TOSTR PyObject_Str #define STRINGLIB_TOASCII PyObject_ASCII diff --git a/Objects/stringlib/fastsearch.h b/Objects/stringlib/fastsearch.h index b91082bd523cb..a838c66cccf74 100644 --- a/Objects/stringlib/fastsearch.h +++ b/Objects/stringlib/fastsearch.h @@ -39,7 +39,7 @@ #define STRINGLIB_BLOOM(mask, ch) \ ((mask & (1UL << ((ch) & (STRINGLIB_BLOOM_WIDTH -1))))) -#if STRINGLIB_SIZEOF_CHAR == 1 +#ifdef STRINGLIB_FAST_MEMCHR # define MEMCHR_CUT_OFF 15 #else # define MEMCHR_CUT_OFF 40 @@ -53,8 +53,8 @@ STRINGLIB(find_char)(const STRINGLIB_CHAR* s, Py_ssize_t n, STRINGLIB_CHAR ch) p = s; e = s + n; if (n > MEMCHR_CUT_OFF) { -#if STRINGLIB_SIZEOF_CHAR == 1 - p = memchr(s, ch, n); +#ifdef STRINGLIB_FAST_MEMCHR + p = STRINGLIB_FAST_MEMCHR(s, ch, n); if (p != NULL) return (p - s); return -1; @@ -102,16 +102,26 @@ STRINGLIB(find_char)(const STRINGLIB_CHAR* s, Py_ssize_t n, STRINGLIB_CHAR ch) return -1; } +#undef MEMCHR_CUT_OFF + +#if STRINGLIB_SIZEOF_CHAR == 1 +# define MEMRCHR_CUT_OFF 15 +#else +# define MEMRCHR_CUT_OFF 40 +#endif + + Py_LOCAL_INLINE(Py_ssize_t) STRINGLIB(rfind_char)(const STRINGLIB_CHAR* s, Py_ssize_t n, STRINGLIB_CHAR ch) { const STRINGLIB_CHAR *p; #ifdef HAVE_MEMRCHR - /* memrchr() is a GNU extension, available since glibc 2.1.91. - it doesn't seem as optimized as memchr(), but is still quite - faster than our hand-written loop below */ + /* memrchr() is a GNU extension, available since glibc 2.1.91. it + doesn't seem as optimized as memchr(), but is still quite + faster than our hand-written loop below. There is no wmemrchr + for 4-byte chars. */ - if (n > MEMCHR_CUT_OFF) { + if (n > MEMRCHR_CUT_OFF) { #if STRINGLIB_SIZEOF_CHAR == 1 p = memrchr(s, ch, n); if (p != NULL) @@ -139,11 +149,11 @@ STRINGLIB(rfind_char)(const STRINGLIB_CHAR* s, Py_ssize_t n, STRINGLIB_CHAR ch) if (*p == ch) return n; /* False positive */ - if (n1 - n > MEMCHR_CUT_OFF) + if (n1 - n > MEMRCHR_CUT_OFF) continue; - if (n <= MEMCHR_CUT_OFF) + if (n <= MEMRCHR_CUT_OFF) break; - s1 = p - MEMCHR_CUT_OFF; + s1 = p - MEMRCHR_CUT_OFF; while (p > s1) { p--; if (*p == ch) @@ -151,7 +161,7 @@ STRINGLIB(rfind_char)(const STRINGLIB_CHAR* s, Py_ssize_t n, STRINGLIB_CHAR ch) } n = p - s; } - while (n > MEMCHR_CUT_OFF); + while (n > MEMRCHR_CUT_OFF); } #endif } @@ -165,7 +175,7 @@ STRINGLIB(rfind_char)(const STRINGLIB_CHAR* s, Py_ssize_t n, STRINGLIB_CHAR ch) return -1; } -#undef MEMCHR_CUT_OFF +#undef MEMRCHR_CUT_OFF /* Change to a 1 to see logging comments walk through the algorithm. */ #if 0 && STRINGLIB_SIZEOF_CHAR == 1 diff --git a/Objects/stringlib/replace.h b/Objects/stringlib/replace.h index ef318ed6dd573..123c9f850f5a0 100644 --- a/Objects/stringlib/replace.h +++ b/Objects/stringlib/replace.h @@ -29,9 +29,9 @@ STRINGLIB(replace_1char_inplace)(STRINGLIB_CHAR* s, STRINGLIB_CHAR* end, if (!--attempts) { /* if u1 was not found for attempts iterations, use FASTSEARCH() or memchr() */ -#if STRINGLIB_SIZEOF_CHAR == 1 +#ifdef STRINGLIB_FAST_MEMCHR s++; - s = memchr(s, u1, end - s); + s = STRINGLIB_FAST_MEMCHR(s, u1, end - s); if (s == NULL) return; #else diff --git a/Objects/stringlib/stringdefs.h b/Objects/stringlib/stringdefs.h index 88641b25d47c6..484b98b729130 100644 --- a/Objects/stringlib/stringdefs.h +++ b/Objects/stringlib/stringdefs.h @@ -24,4 +24,5 @@ #define STRINGLIB_CHECK_EXACT PyBytes_CheckExact #define STRINGLIB_TOSTR PyObject_Str #define STRINGLIB_TOASCII PyObject_Repr +#define STRINGLIB_FAST_MEMCHR memchr #endif /* !STRINGLIB_STRINGDEFS_H */ diff --git a/Objects/stringlib/ucs1lib.h b/Objects/stringlib/ucs1lib.h index 026ab11f1f7b8..1b9b65ecbaadb 100644 --- a/Objects/stringlib/ucs1lib.h +++ b/Objects/stringlib/ucs1lib.h @@ -20,6 +20,7 @@ #define STRINGLIB_NEW _PyUnicode_FromUCS1 #define STRINGLIB_CHECK PyUnicode_Check #define STRINGLIB_CHECK_EXACT PyUnicode_CheckExact +#define STRINGLIB_FAST_MEMCHR memchr #define STRINGLIB_MUTABLE 0 #define STRINGLIB_TOSTR PyObject_Str diff --git a/Objects/stringlib/ucs2lib.h b/Objects/stringlib/ucs2lib.h index 75f11bc290508..4b49bbb31d7cb 100644 --- a/Objects/stringlib/ucs2lib.h +++ b/Objects/stringlib/ucs2lib.h @@ -21,6 +21,10 @@ #define STRINGLIB_CHECK PyUnicode_Check #define STRINGLIB_CHECK_EXACT PyUnicode_CheckExact #define STRINGLIB_MUTABLE 0 +#if SIZEOF_WCHAR_T == 2 +#define STRINGLIB_FAST_MEMCHR(s, c, n) \ + (Py_UCS2 *)wmemchr((const wchar_t *)(s), c, n) +#endif #define STRINGLIB_TOSTR PyObject_Str #define STRINGLIB_TOASCII PyObject_ASCII diff --git a/Objects/stringlib/ucs4lib.h b/Objects/stringlib/ucs4lib.h index 57344f235b659..def4ca5d17d50 100644 --- a/Objects/stringlib/ucs4lib.h +++ b/Objects/stringlib/ucs4lib.h @@ -21,6 +21,10 @@ #define STRINGLIB_CHECK PyUnicode_Check #define STRINGLIB_CHECK_EXACT PyUnicode_CheckExact #define STRINGLIB_MUTABLE 0 +#if SIZEOF_WCHAR_T == 4 +#define STRINGLIB_FAST_MEMCHR(s, c, n) \ + (Py_UCS4 *)wmemchr((const wchar_t *)(s), c, n) +#endif #define STRINGLIB_TOSTR PyObject_Str #define STRINGLIB_TOASCII PyObject_ASCII diff --git a/Objects/stringlib/undef.h b/Objects/stringlib/undef.h index bf32298505ed7..cc873a2ec4e02 100644 --- a/Objects/stringlib/undef.h +++ b/Objects/stringlib/undef.h @@ -8,3 +8,4 @@ #undef STRINGLIB_NEW #undef STRINGLIB_IS_UNICODE #undef STRINGLIB_MUTABLE +#undef STRINGLIB_FAST_MEMCHR From webhook-mailer at python.org Tue May 24 04:52:40 2022 From: webhook-mailer at python.org (ambv) Date: Tue, 24 May 2022 08:52:40 -0000 Subject: [Python-checkins] gh-93065: Fix HAMT to iterate correctly over 7-level deep trees (GH-93066) (GH-93145) Message-ID: https://github.com/python/cpython/commit/c771cbe8f9b13d674b74d5f81ab36a5e20febb7d commit: c771cbe8f9b13d674b74d5f81ab36a5e20febb7d branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: ambv date: 2022-05-24T10:52:06+02:00 summary: gh-93065: Fix HAMT to iterate correctly over 7-level deep trees (GH-93066) (GH-93145) Also while there, clarify a few things about why we reduce the hash to 32 bits. Co-authored-by: Eli Libman Co-authored-by: Yury Selivanov Co-authored-by: ?ukasz Langa (cherry picked from commit c1f5c903a7e4ed27190488f4e33b00d3c3d952e5) files: A Misc/NEWS.d/next/Core and Builtins/2022-05-21-23-21-37.gh-issue-93065.5I18WC.rst M Include/internal/pycore_hamt.h M Lib/test/test_context.py M Misc/ACKS M Python/hamt.c diff --git a/Include/internal/pycore_hamt.h b/Include/internal/pycore_hamt.h index 85e35c5afc90c..4d64288bbab49 100644 --- a/Include/internal/pycore_hamt.h +++ b/Include/internal/pycore_hamt.h @@ -5,7 +5,19 @@ # error "this header requires Py_BUILD_CORE define" #endif -#define _Py_HAMT_MAX_TREE_DEPTH 7 + +/* +HAMT tree is shaped by hashes of keys. Every group of 5 bits of a hash denotes +the exact position of the key in one level of the tree. Since we're using +32 bit hashes, we can have at most 7 such levels. Although if there are +two distinct keys with equal hashes, they will have to occupy the same +cell in the 7th level of the tree -- so we'd put them in a "collision" node. +Which brings the total possible tree depth to 8. Read more about the actual +layout of the HAMT tree in `hamt.c`. + +This constant is used to define a datastucture for storing iteration state. +*/ +#define _Py_HAMT_MAX_TREE_DEPTH 8 extern PyTypeObject _PyHamt_Type; diff --git a/Lib/test/test_context.py b/Lib/test/test_context.py index 3132cea668cb1..b1aece4f5c9c4 100644 --- a/Lib/test/test_context.py +++ b/Lib/test/test_context.py @@ -535,6 +535,41 @@ def test_hamt_collision_1(self): self.assertEqual(len(h4), 2) self.assertEqual(len(h5), 3) + def test_hamt_collision_3(self): + # Test that iteration works with the deepest tree possible. + # https://github.com/python/cpython/issues/93065 + + C = HashKey(0b10000000_00000000_00000000_00000000, 'C') + D = HashKey(0b10000000_00000000_00000000_00000000, 'D') + + E = HashKey(0b00000000_00000000_00000000_00000000, 'E') + + h = hamt() + h = h.set(C, 'C') + h = h.set(D, 'D') + h = h.set(E, 'E') + + # BitmapNode(size=2 count=1 bitmap=0b1): + # NULL: + # BitmapNode(size=2 count=1 bitmap=0b1): + # NULL: + # BitmapNode(size=2 count=1 bitmap=0b1): + # NULL: + # BitmapNode(size=2 count=1 bitmap=0b1): + # NULL: + # BitmapNode(size=2 count=1 bitmap=0b1): + # NULL: + # BitmapNode(size=2 count=1 bitmap=0b1): + # NULL: + # BitmapNode(size=4 count=2 bitmap=0b101): + # : 'E' + # NULL: + # CollisionNode(size=4 id=0x107a24520): + # : 'C' + # : 'D' + + self.assertEqual({k.name for k in h.keys()}, {'C', 'D', 'E'}) + def test_hamt_stress(self): COLLECTION_SIZE = 7000 TEST_ITERS_EVERY = 647 diff --git a/Misc/ACKS b/Misc/ACKS index a55706d508a41..4ea1fa17d5400 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1062,6 +1062,7 @@ Robert Li Xuanji Li Zekun Li Zheao Li +Eli Libman Dan Lidral-Porter Robert van Liere Ross Light diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-21-23-21-37.gh-issue-93065.5I18WC.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-21-23-21-37.gh-issue-93065.5I18WC.rst new file mode 100644 index 0000000000000..ea801653f7502 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-05-21-23-21-37.gh-issue-93065.5I18WC.rst @@ -0,0 +1,5 @@ +Fix contextvars HAMT implementation to handle iteration over deep trees. + +The bug was discovered and fixed by Eli Libman. See +`MagicStack/immutables#84 `_ +for more details. diff --git a/Python/hamt.c b/Python/hamt.c index c3cb4e6fda450..908c253187031 100644 --- a/Python/hamt.c +++ b/Python/hamt.c @@ -409,14 +409,22 @@ hamt_hash(PyObject *o) return -1; } - /* While it's suboptimal to reduce Python's 64 bit hash to + /* While it's somewhat suboptimal to reduce Python's 64 bit hash to 32 bits via XOR, it seems that the resulting hash function is good enough (this is also how Long type is hashed in Java.) Storing 10, 100, 1000 Python strings results in a relatively shallow and uniform tree structure. - Please don't change this hashing algorithm, as there are many - tests that test some exact tree shape to cover all code paths. + Also it's worth noting that it would be possible to adapt the tree + structure to 64 bit hashes, but that would increase memory pressure + and provide little to no performance benefits for collections with + fewer than billions of key/value pairs. + + Important: do not change this hash reducing function. There are many + tests that need an exact tree shape to cover all code paths and + we do that by specifying concrete values for test data's `__hash__`. + If this function is changed most of the regression tests would + become useless. */ int32_t xored = (int32_t)(hash & 0xffffffffl) ^ (int32_t)(hash >> 32); return xored == -1 ? -2 : xored; From webhook-mailer at python.org Tue May 24 04:52:40 2022 From: webhook-mailer at python.org (ambv) Date: Tue, 24 May 2022 08:52:40 -0000 Subject: [Python-checkins] gh-93065: Fix HAMT to iterate correctly over 7-level deep trees (GH-93066) (GH-93146) Message-ID: https://github.com/python/cpython/commit/a4bea26ee4da780b399eab8f9f7eaa1517f52d56 commit: a4bea26ee4da780b399eab8f9f7eaa1517f52d56 branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: ambv date: 2022-05-24T10:52:29+02:00 summary: gh-93065: Fix HAMT to iterate correctly over 7-level deep trees (GH-93066) (GH-93146) Also while there, clarify a few things about why we reduce the hash to 32 bits. Co-authored-by: Eli Libman Co-authored-by: Yury Selivanov Co-authored-by: ?ukasz Langa (cherry picked from commit c1f5c903a7e4ed27190488f4e33b00d3c3d952e5) files: A Misc/NEWS.d/next/Core and Builtins/2022-05-21-23-21-37.gh-issue-93065.5I18WC.rst M Include/internal/pycore_hamt.h M Lib/test/test_context.py M Misc/ACKS M Python/hamt.c diff --git a/Include/internal/pycore_hamt.h b/Include/internal/pycore_hamt.h index aaf655909551a..357d96616272a 100644 --- a/Include/internal/pycore_hamt.h +++ b/Include/internal/pycore_hamt.h @@ -5,7 +5,19 @@ # error "this header requires Py_BUILD_CORE define" #endif -#define _Py_HAMT_MAX_TREE_DEPTH 7 + +/* +HAMT tree is shaped by hashes of keys. Every group of 5 bits of a hash denotes +the exact position of the key in one level of the tree. Since we're using +32 bit hashes, we can have at most 7 such levels. Although if there are +two distinct keys with equal hashes, they will have to occupy the same +cell in the 7th level of the tree -- so we'd put them in a "collision" node. +Which brings the total possible tree depth to 8. Read more about the actual +layout of the HAMT tree in `hamt.c`. + +This constant is used to define a datastucture for storing iteration state. +*/ +#define _Py_HAMT_MAX_TREE_DEPTH 8 #define PyHamt_Check(o) Py_IS_TYPE(o, &_PyHamt_Type) diff --git a/Lib/test/test_context.py b/Lib/test/test_context.py index 2d8b63a1f5958..689e3d4dc4591 100644 --- a/Lib/test/test_context.py +++ b/Lib/test/test_context.py @@ -533,6 +533,41 @@ def test_hamt_collision_1(self): self.assertEqual(len(h4), 2) self.assertEqual(len(h5), 3) + def test_hamt_collision_3(self): + # Test that iteration works with the deepest tree possible. + # https://github.com/python/cpython/issues/93065 + + C = HashKey(0b10000000_00000000_00000000_00000000, 'C') + D = HashKey(0b10000000_00000000_00000000_00000000, 'D') + + E = HashKey(0b00000000_00000000_00000000_00000000, 'E') + + h = hamt() + h = h.set(C, 'C') + h = h.set(D, 'D') + h = h.set(E, 'E') + + # BitmapNode(size=2 count=1 bitmap=0b1): + # NULL: + # BitmapNode(size=2 count=1 bitmap=0b1): + # NULL: + # BitmapNode(size=2 count=1 bitmap=0b1): + # NULL: + # BitmapNode(size=2 count=1 bitmap=0b1): + # NULL: + # BitmapNode(size=2 count=1 bitmap=0b1): + # NULL: + # BitmapNode(size=2 count=1 bitmap=0b1): + # NULL: + # BitmapNode(size=4 count=2 bitmap=0b101): + # : 'E' + # NULL: + # CollisionNode(size=4 id=0x107a24520): + # : 'C' + # : 'D' + + self.assertEqual({k.name for k in h.keys()}, {'C', 'D', 'E'}) + def test_hamt_stress(self): COLLECTION_SIZE = 7000 TEST_ITERS_EVERY = 647 diff --git a/Misc/ACKS b/Misc/ACKS index b83f99956de0b..7a363b99836a2 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1054,6 +1054,7 @@ Robert Li Xuanji Li Zekun Li Zheao Li +Eli Libman Dan Lidral-Porter Robert van Liere Ross Light diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-21-23-21-37.gh-issue-93065.5I18WC.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-21-23-21-37.gh-issue-93065.5I18WC.rst new file mode 100644 index 0000000000000..ea801653f7502 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-05-21-23-21-37.gh-issue-93065.5I18WC.rst @@ -0,0 +1,5 @@ +Fix contextvars HAMT implementation to handle iteration over deep trees. + +The bug was discovered and fixed by Eli Libman. See +`MagicStack/immutables#84 `_ +for more details. diff --git a/Python/hamt.c b/Python/hamt.c index e272e8808fd95..6572a554311cc 100644 --- a/Python/hamt.c +++ b/Python/hamt.c @@ -408,14 +408,22 @@ hamt_hash(PyObject *o) return -1; } - /* While it's suboptimal to reduce Python's 64 bit hash to + /* While it's somewhat suboptimal to reduce Python's 64 bit hash to 32 bits via XOR, it seems that the resulting hash function is good enough (this is also how Long type is hashed in Java.) Storing 10, 100, 1000 Python strings results in a relatively shallow and uniform tree structure. - Please don't change this hashing algorithm, as there are many - tests that test some exact tree shape to cover all code paths. + Also it's worth noting that it would be possible to adapt the tree + structure to 64 bit hashes, but that would increase memory pressure + and provide little to no performance benefits for collections with + fewer than billions of key/value pairs. + + Important: do not change this hash reducing function. There are many + tests that need an exact tree shape to cover all code paths and + we do that by specifying concrete values for test data's `__hash__`. + If this function is changed most of the regression tests would + become useless. */ int32_t xored = (int32_t)(hash & 0xffffffffl) ^ (int32_t)(hash >> 32); return xored == -1 ? -2 : xored; From webhook-mailer at python.org Tue May 24 04:52:54 2022 From: webhook-mailer at python.org (ambv) Date: Tue, 24 May 2022 08:52:54 -0000 Subject: [Python-checkins] gh-93065: Fix HAMT to iterate correctly over 7-level deep trees (GH-93066) (#93147) Message-ID: https://github.com/python/cpython/commit/95c9c2b9cb2d3c1d29c8ce77f154de8bd5313dae commit: 95c9c2b9cb2d3c1d29c8ce77f154de8bd5313dae branch: 3.9 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: ambv date: 2022-05-24T10:52:49+02:00 summary: gh-93065: Fix HAMT to iterate correctly over 7-level deep trees (GH-93066) (#93147) Also while there, clarify a few things about why we reduce the hash to 32 bits. Co-authored-by: Eli Libman Co-authored-by: Yury Selivanov Co-authored-by: ?ukasz Langa (cherry picked from commit c1f5c903a7e4ed27190488f4e33b00d3c3d952e5) files: A Misc/NEWS.d/next/Core and Builtins/2022-05-21-23-21-37.gh-issue-93065.5I18WC.rst M Include/internal/pycore_hamt.h M Lib/test/test_context.py M Misc/ACKS M Python/hamt.c diff --git a/Include/internal/pycore_hamt.h b/Include/internal/pycore_hamt.h index aaf655909551a..357d96616272a 100644 --- a/Include/internal/pycore_hamt.h +++ b/Include/internal/pycore_hamt.h @@ -5,7 +5,19 @@ # error "this header requires Py_BUILD_CORE define" #endif -#define _Py_HAMT_MAX_TREE_DEPTH 7 + +/* +HAMT tree is shaped by hashes of keys. Every group of 5 bits of a hash denotes +the exact position of the key in one level of the tree. Since we're using +32 bit hashes, we can have at most 7 such levels. Although if there are +two distinct keys with equal hashes, they will have to occupy the same +cell in the 7th level of the tree -- so we'd put them in a "collision" node. +Which brings the total possible tree depth to 8. Read more about the actual +layout of the HAMT tree in `hamt.c`. + +This constant is used to define a datastucture for storing iteration state. +*/ +#define _Py_HAMT_MAX_TREE_DEPTH 8 #define PyHamt_Check(o) Py_IS_TYPE(o, &_PyHamt_Type) diff --git a/Lib/test/test_context.py b/Lib/test/test_context.py index 2d8b63a1f5958..689e3d4dc4591 100644 --- a/Lib/test/test_context.py +++ b/Lib/test/test_context.py @@ -533,6 +533,41 @@ def test_hamt_collision_1(self): self.assertEqual(len(h4), 2) self.assertEqual(len(h5), 3) + def test_hamt_collision_3(self): + # Test that iteration works with the deepest tree possible. + # https://github.com/python/cpython/issues/93065 + + C = HashKey(0b10000000_00000000_00000000_00000000, 'C') + D = HashKey(0b10000000_00000000_00000000_00000000, 'D') + + E = HashKey(0b00000000_00000000_00000000_00000000, 'E') + + h = hamt() + h = h.set(C, 'C') + h = h.set(D, 'D') + h = h.set(E, 'E') + + # BitmapNode(size=2 count=1 bitmap=0b1): + # NULL: + # BitmapNode(size=2 count=1 bitmap=0b1): + # NULL: + # BitmapNode(size=2 count=1 bitmap=0b1): + # NULL: + # BitmapNode(size=2 count=1 bitmap=0b1): + # NULL: + # BitmapNode(size=2 count=1 bitmap=0b1): + # NULL: + # BitmapNode(size=2 count=1 bitmap=0b1): + # NULL: + # BitmapNode(size=4 count=2 bitmap=0b101): + # : 'E' + # NULL: + # CollisionNode(size=4 id=0x107a24520): + # : 'C' + # : 'D' + + self.assertEqual({k.name for k in h.keys()}, {'C', 'D', 'E'}) + def test_hamt_stress(self): COLLECTION_SIZE = 7000 TEST_ITERS_EVERY = 647 diff --git a/Misc/ACKS b/Misc/ACKS index a9f15b4f96726..c6e7c3a0ddf95 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1033,6 +1033,7 @@ Robert Li Xuanji Li Zekun Li Zheao Li +Eli Libman Dan Lidral-Porter Robert van Liere Ross Light diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-21-23-21-37.gh-issue-93065.5I18WC.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-21-23-21-37.gh-issue-93065.5I18WC.rst new file mode 100644 index 0000000000000..ea801653f7502 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-05-21-23-21-37.gh-issue-93065.5I18WC.rst @@ -0,0 +1,5 @@ +Fix contextvars HAMT implementation to handle iteration over deep trees. + +The bug was discovered and fixed by Eli Libman. See +`MagicStack/immutables#84 `_ +for more details. diff --git a/Python/hamt.c b/Python/hamt.c index 8801c5ea418c7..3296109f7265b 100644 --- a/Python/hamt.c +++ b/Python/hamt.c @@ -407,14 +407,22 @@ hamt_hash(PyObject *o) return -1; } - /* While it's suboptimal to reduce Python's 64 bit hash to + /* While it's somewhat suboptimal to reduce Python's 64 bit hash to 32 bits via XOR, it seems that the resulting hash function is good enough (this is also how Long type is hashed in Java.) Storing 10, 100, 1000 Python strings results in a relatively shallow and uniform tree structure. - Please don't change this hashing algorithm, as there are many - tests that test some exact tree shape to cover all code paths. + Also it's worth noting that it would be possible to adapt the tree + structure to 64 bit hashes, but that would increase memory pressure + and provide little to no performance benefits for collections with + fewer than billions of key/value pairs. + + Important: do not change this hash reducing function. There are many + tests that need an exact tree shape to cover all code paths and + we do that by specifying concrete values for test data's `__hash__`. + If this function is changed most of the regression tests would + become useless. */ int32_t xored = (int32_t)(hash & 0xffffffffl) ^ (int32_t)(hash >> 32); return xored == -1 ? -2 : xored; From webhook-mailer at python.org Tue May 24 05:27:00 2022 From: webhook-mailer at python.org (ambv) Date: Tue, 24 May 2022 09:27:00 -0000 Subject: [Python-checkins] [3.8] gh-93065: Fix HAMT to iterate correctly over 7-level deep trees (GH-93066) (#93148) Message-ID: https://github.com/python/cpython/commit/6d4927ad1383e8bb8bda6659d24b6d05094a7b99 commit: 6d4927ad1383e8bb8bda6659d24b6d05094a7b99 branch: 3.8 author: ?ukasz Langa committer: ambv date: 2022-05-24T11:26:25+02:00 summary: [3.8] gh-93065: Fix HAMT to iterate correctly over 7-level deep trees (GH-93066) (#93148) Also while there, clarify a few things about why we reduce the hash to 32 bits. Co-authored-by: Eli Libman Co-authored-by: Yury Selivanov Co-authored-by: ?ukasz Langa (cherry picked from commit c1f5c903a7e4ed27190488f4e33b00d3c3d952e5) files: A Misc/NEWS.d/next/Core and Builtins/2022-05-21-23-21-37.gh-issue-93065.5I18WC.rst M Include/internal/pycore_hamt.h M Lib/test/test_context.py M Misc/ACKS M Python/hamt.c diff --git a/Include/internal/pycore_hamt.h b/Include/internal/pycore_hamt.h index e65aef5e21a95..ff9cc24fd7166 100644 --- a/Include/internal/pycore_hamt.h +++ b/Include/internal/pycore_hamt.h @@ -5,7 +5,19 @@ # error "this header requires Py_BUILD_CORE define" #endif -#define _Py_HAMT_MAX_TREE_DEPTH 7 + +/* +HAMT tree is shaped by hashes of keys. Every group of 5 bits of a hash denotes +the exact position of the key in one level of the tree. Since we're using +32 bit hashes, we can have at most 7 such levels. Although if there are +two distinct keys with equal hashes, they will have to occupy the same +cell in the 7th level of the tree -- so we'd put them in a "collision" node. +Which brings the total possible tree depth to 8. Read more about the actual +layout of the HAMT tree in `hamt.c`. + +This constant is used to define a datastucture for storing iteration state. +*/ +#define _Py_HAMT_MAX_TREE_DEPTH 8 #define PyHamt_Check(o) (Py_TYPE(o) == &_PyHamt_Type) diff --git a/Lib/test/test_context.py b/Lib/test/test_context.py index b9e991a400092..b954b135dd6a5 100644 --- a/Lib/test/test_context.py +++ b/Lib/test/test_context.py @@ -537,6 +537,41 @@ def test_hamt_collision_1(self): self.assertEqual(len(h4), 2) self.assertEqual(len(h5), 3) + def test_hamt_collision_3(self): + # Test that iteration works with the deepest tree possible. + # https://github.com/python/cpython/issues/93065 + + C = HashKey(0b10000000_00000000_00000000_00000000, 'C') + D = HashKey(0b10000000_00000000_00000000_00000000, 'D') + + E = HashKey(0b00000000_00000000_00000000_00000000, 'E') + + h = hamt() + h = h.set(C, 'C') + h = h.set(D, 'D') + h = h.set(E, 'E') + + # BitmapNode(size=2 count=1 bitmap=0b1): + # NULL: + # BitmapNode(size=2 count=1 bitmap=0b1): + # NULL: + # BitmapNode(size=2 count=1 bitmap=0b1): + # NULL: + # BitmapNode(size=2 count=1 bitmap=0b1): + # NULL: + # BitmapNode(size=2 count=1 bitmap=0b1): + # NULL: + # BitmapNode(size=2 count=1 bitmap=0b1): + # NULL: + # BitmapNode(size=4 count=2 bitmap=0b101): + # : 'E' + # NULL: + # CollisionNode(size=4 id=0x107a24520): + # : 'C' + # : 'D' + + self.assertEqual({k.name for k in h.keys()}, {'C', 'D', 'E'}) + def test_hamt_stress(self): COLLECTION_SIZE = 7000 TEST_ITERS_EVERY = 647 diff --git a/Misc/ACKS b/Misc/ACKS index a265e7e9a7273..ed9b639b1d924 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1002,6 +1002,8 @@ Robert Li Xuanji Li Zekun Li Zheao Li +Eli Libman +Dan Lidral-Porter Robert van Liere Ross Light Shawn Ligocki diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-21-23-21-37.gh-issue-93065.5I18WC.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-21-23-21-37.gh-issue-93065.5I18WC.rst new file mode 100644 index 0000000000000..ea801653f7502 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-05-21-23-21-37.gh-issue-93065.5I18WC.rst @@ -0,0 +1,5 @@ +Fix contextvars HAMT implementation to handle iteration over deep trees. + +The bug was discovered and fixed by Eli Libman. See +`MagicStack/immutables#84 `_ +for more details. diff --git a/Python/hamt.c b/Python/hamt.c index 5efc8d7fabe8e..0e463d74ef64e 100644 --- a/Python/hamt.c +++ b/Python/hamt.c @@ -408,14 +408,22 @@ hamt_hash(PyObject *o) return -1; } - /* While it's suboptimal to reduce Python's 64 bit hash to + /* While it's somewhat suboptimal to reduce Python's 64 bit hash to 32 bits via XOR, it seems that the resulting hash function is good enough (this is also how Long type is hashed in Java.) Storing 10, 100, 1000 Python strings results in a relatively shallow and uniform tree structure. - Please don't change this hashing algorithm, as there are many - tests that test some exact tree shape to cover all code paths. + Also it's worth noting that it would be possible to adapt the tree + structure to 64 bit hashes, but that would increase memory pressure + and provide little to no performance benefits for collections with + fewer than billions of key/value pairs. + + Important: do not change this hash reducing function. There are many + tests that need an exact tree shape to cover all code paths and + we do that by specifying concrete values for test data's `__hash__`. + If this function is changed most of the regression tests would + become useless. */ int32_t xored = (int32_t)(hash & 0xffffffffl) ^ (int32_t)(hash >> 32); return xored == -1 ? -2 : xored; From webhook-mailer at python.org Tue May 24 08:10:26 2022 From: webhook-mailer at python.org (vstinner) Date: Tue, 24 May 2022 12:10:26 -0000 Subject: [Python-checkins] GH-93112: Fix missing ResourceDenied import in test_urllib2net (#93113) Message-ID: https://github.com/python/cpython/commit/37c9a351b15c3fc4fcdca5dcb9ce19e51d7d2dd7 commit: 37c9a351b15c3fc4fcdca5dcb9ce19e51d7d2dd7 branch: main author: Florian Bruhin committer: vstinner date: 2022-05-24T14:09:52+02:00 summary: GH-93112: Fix missing ResourceDenied import in test_urllib2net (#93113) The code was moved out of test.support in 311110abcd8ab648dbf1803e36a8ba5d93fa019b (GH-20812), thus making ResourceDenied undefined. files: M Lib/test/test_urllib2net.py diff --git a/Lib/test/test_urllib2net.py b/Lib/test/test_urllib2net.py index 04cfb492e4549..5da41c37bbfb8 100644 --- a/Lib/test/test_urllib2net.py +++ b/Lib/test/test_urllib2net.py @@ -3,6 +3,7 @@ from test import support from test.support import os_helper from test.support import socket_helper +from test.support import ResourceDenied from test.test_urllib2 import sanepathname2url import os From webhook-mailer at python.org Tue May 24 08:32:39 2022 From: webhook-mailer at python.org (miss-islington) Date: Tue, 24 May 2022 12:32:39 -0000 Subject: [Python-checkins] GH-93112: Fix missing ResourceDenied import in test_urllib2net (GH-93113) Message-ID: https://github.com/python/cpython/commit/db2b1e1830b74f5e15abc3bac3fd67e35ca39951 commit: db2b1e1830b74f5e15abc3bac3fd67e35ca39951 branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-24T05:32:19-07:00 summary: GH-93112: Fix missing ResourceDenied import in test_urllib2net (GH-93113) The code was moved out of test.support in 311110abcd8ab648dbf1803e36a8ba5d93fa019b (GH-20812), thus making ResourceDenied undefined. (cherry picked from commit 37c9a351b15c3fc4fcdca5dcb9ce19e51d7d2dd7) Co-authored-by: Florian Bruhin files: M Lib/test/test_urllib2net.py diff --git a/Lib/test/test_urllib2net.py b/Lib/test/test_urllib2net.py index aa41811560c78..a7e7c9f0b91e2 100644 --- a/Lib/test/test_urllib2net.py +++ b/Lib/test/test_urllib2net.py @@ -3,6 +3,7 @@ from test import support from test.support import os_helper from test.support import socket_helper +from test.support import ResourceDenied from test.test_urllib2 import sanepathname2url import os From webhook-mailer at python.org Tue May 24 08:37:28 2022 From: webhook-mailer at python.org (miss-islington) Date: Tue, 24 May 2022 12:37:28 -0000 Subject: [Python-checkins] GH-93112: Fix missing ResourceDenied import in test_urllib2net (GH-93113) Message-ID: https://github.com/python/cpython/commit/719edfaf794a8c117c31f7bbe97d9afc2effbac4 commit: 719edfaf794a8c117c31f7bbe97d9afc2effbac4 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-24T05:37:06-07:00 summary: GH-93112: Fix missing ResourceDenied import in test_urllib2net (GH-93113) The code was moved out of test.support in 311110abcd8ab648dbf1803e36a8ba5d93fa019b (GH-20812), thus making ResourceDenied undefined. (cherry picked from commit 37c9a351b15c3fc4fcdca5dcb9ce19e51d7d2dd7) Co-authored-by: Florian Bruhin files: M Lib/test/test_urllib2net.py diff --git a/Lib/test/test_urllib2net.py b/Lib/test/test_urllib2net.py index 04cfb492e4549..5da41c37bbfb8 100644 --- a/Lib/test/test_urllib2net.py +++ b/Lib/test/test_urllib2net.py @@ -3,6 +3,7 @@ from test import support from test.support import os_helper from test.support import socket_helper +from test.support import ResourceDenied from test.test_urllib2 import sanepathname2url import os From webhook-mailer at python.org Tue May 24 09:42:01 2022 From: webhook-mailer at python.org (vstinner) Date: Tue, 24 May 2022 13:42:01 -0000 Subject: [Python-checkins] GH-89369: test_contextlib_async finalizes event loop after each test (#93074) Message-ID: https://github.com/python/cpython/commit/d2ef66a10be1250b13c32fbf3c0f9a9d2d98b124 commit: d2ef66a10be1250b13c32fbf3c0f9a9d2d98b124 branch: main author: Kumar Aditya <59607654+kumaraditya303 at users.noreply.github.com> committer: vstinner date: 2022-05-24T15:41:32+02:00 summary: GH-89369: test_contextlib_async finalizes event loop after each test (#93074) Use asyncio.run(). files: M Lib/test/test_contextlib_async.py diff --git a/Lib/test/test_contextlib_async.py b/Lib/test/test_contextlib_async.py index 76bd81c7d02cc..b64673d2c31e0 100644 --- a/Lib/test/test_contextlib_async.py +++ b/Lib/test/test_contextlib_async.py @@ -15,15 +15,12 @@ def _async_test(func): @functools.wraps(func) def wrapper(*args, **kwargs): coro = func(*args, **kwargs) - loop = asyncio.new_event_loop() - asyncio.set_event_loop(loop) - try: - return loop.run_until_complete(coro) - finally: - loop.close() - asyncio.set_event_loop_policy(None) + asyncio.run(coro) return wrapper +def tearDownModule(): + asyncio.set_event_loop_policy(None) + class TestAbstractAsyncContextManager(unittest.TestCase): From webhook-mailer at python.org Tue May 24 10:08:03 2022 From: webhook-mailer at python.org (miss-islington) Date: Tue, 24 May 2022 14:08:03 -0000 Subject: [Python-checkins] GH-89369: test_contextlib_async finalizes event loop after each test (GH-93074) Message-ID: https://github.com/python/cpython/commit/a6ee7f99cc3344e130383b7cf070723ff47ea99c commit: a6ee7f99cc3344e130383b7cf070723ff47ea99c branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-24T07:07:59-07:00 summary: GH-89369: test_contextlib_async finalizes event loop after each test (GH-93074) Use asyncio.run(). (cherry picked from commit d2ef66a10be1250b13c32fbf3c0f9a9d2d98b124) Co-authored-by: Kumar Aditya <59607654+kumaraditya303 at users.noreply.github.com> files: M Lib/test/test_contextlib_async.py diff --git a/Lib/test/test_contextlib_async.py b/Lib/test/test_contextlib_async.py index 76bd81c7d02cc..b64673d2c31e0 100644 --- a/Lib/test/test_contextlib_async.py +++ b/Lib/test/test_contextlib_async.py @@ -15,15 +15,12 @@ def _async_test(func): @functools.wraps(func) def wrapper(*args, **kwargs): coro = func(*args, **kwargs) - loop = asyncio.new_event_loop() - asyncio.set_event_loop(loop) - try: - return loop.run_until_complete(coro) - finally: - loop.close() - asyncio.set_event_loop_policy(None) + asyncio.run(coro) return wrapper +def tearDownModule(): + asyncio.set_event_loop_policy(None) + class TestAbstractAsyncContextManager(unittest.TestCase): From webhook-mailer at python.org Tue May 24 10:25:54 2022 From: webhook-mailer at python.org (miss-islington) Date: Tue, 24 May 2022 14:25:54 -0000 Subject: [Python-checkins] GH-89369: test_contextlib_async finalizes event loop after each test (GH-93074) Message-ID: https://github.com/python/cpython/commit/502dba0cf38ebd657d444fd49b8d648fe86bbb7d commit: 502dba0cf38ebd657d444fd49b8d648fe86bbb7d branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-24T07:25:50-07:00 summary: GH-89369: test_contextlib_async finalizes event loop after each test (GH-93074) Use asyncio.run(). (cherry picked from commit d2ef66a10be1250b13c32fbf3c0f9a9d2d98b124) Co-authored-by: Kumar Aditya <59607654+kumaraditya303 at users.noreply.github.com> files: M Lib/test/test_contextlib_async.py diff --git a/Lib/test/test_contextlib_async.py b/Lib/test/test_contextlib_async.py index d6a34e22ac424..d44d36209c703 100644 --- a/Lib/test/test_contextlib_async.py +++ b/Lib/test/test_contextlib_async.py @@ -14,15 +14,12 @@ def _async_test(func): @functools.wraps(func) def wrapper(*args, **kwargs): coro = func(*args, **kwargs) - loop = asyncio.new_event_loop() - asyncio.set_event_loop(loop) - try: - return loop.run_until_complete(coro) - finally: - loop.close() - asyncio.set_event_loop_policy(None) + asyncio.run(coro) return wrapper +def tearDownModule(): + asyncio.set_event_loop_policy(None) + class TestAbstractAsyncContextManager(unittest.TestCase): From webhook-mailer at python.org Tue May 24 16:35:14 2022 From: webhook-mailer at python.org (vstinner) Date: Tue, 24 May 2022 20:35:14 -0000 Subject: [Python-checkins] gh-93103: Parser uses PyConfig.parser_debug instead of Py_DebugFlag (#93106) Message-ID: https://github.com/python/cpython/commit/5115a1683154a1f2093aa7f2c6834e47d326cb7d commit: 5115a1683154a1f2093aa7f2c6834e47d326cb7d branch: main author: Victor Stinner committer: vstinner date: 2022-05-24T22:35:08+02:00 summary: gh-93103: Parser uses PyConfig.parser_debug instead of Py_DebugFlag (#93106) * Replace deprecated Py_DebugFlag with PyConfig.parser_debug in the parser. * Add Parser.debug member. * Add tok_state.debug member. * Py_FrozenMain(): Replace Py_VerboseFlag with PyConfig.verbose. files: M Parser/parser.c M Parser/pegen.c M Parser/pegen.h M Parser/tokenizer.c M Parser/tokenizer.h M Python/frozenmain.c M Tools/peg_generator/pegen/c_generator.py diff --git a/Parser/parser.c b/Parser/parser.c index 08bf6d2945600..31ad9a0ce7a72 100644 --- a/Parser/parser.c +++ b/Parser/parser.c @@ -2,7 +2,7 @@ #include "pegen.h" #if defined(Py_DEBUG) && defined(Py_BUILD_CORE) -# define D(x) if (Py_DebugFlag) x; +# define D(x) if (p->debug) { x; } #else # define D(x) #endif diff --git a/Parser/pegen.c b/Parser/pegen.c index 143461d44a1a4..ec4fee3fc4b71 100644 --- a/Parser/pegen.c +++ b/Parser/pegen.c @@ -774,6 +774,9 @@ _PyPegen_Parser_New(struct tok_state *tok, int start_rule, int flags, p->known_err_token = NULL; p->level = 0; p->call_invalid_rules = 0; +#ifdef Py_DEBUG + p->debug = _Py_GetConfig()->parser_debug; +#endif return p; } diff --git a/Parser/pegen.h b/Parser/pegen.h index d6a6e4e1eeb2f..d8ac7e8cb918f 100644 --- a/Parser/pegen.h +++ b/Parser/pegen.h @@ -78,6 +78,7 @@ typedef struct { Token *known_err_token; int level; int call_invalid_rules; + int debug; } Parser; typedef struct { diff --git a/Parser/tokenizer.c b/Parser/tokenizer.c index 7c797180956d5..b34dade8f6d9b 100644 --- a/Parser/tokenizer.c +++ b/Parser/tokenizer.c @@ -88,6 +88,9 @@ tok_new(void) tok->async_def_nl = 0; tok->interactive_underflow = IUNDERFLOW_NORMAL; tok->str = NULL; +#ifdef Py_DEBUG + tok->debug = _Py_GetConfig()->parser_debug; +#endif return tok; } @@ -1021,7 +1024,7 @@ tok_nextc(struct tok_state *tok) rc = tok_underflow_file(tok); } #if defined(Py_DEBUG) - if (Py_DebugFlag) { + if (tok->debug) { fprintf(stderr, "line[%d] = ", tok->lineno); print_escape(stderr, tok->cur, tok->inp - tok->cur); fprintf(stderr, " tok->done = %d\n", tok->done); diff --git a/Parser/tokenizer.h b/Parser/tokenizer.h index dba71bd60fefe..5ac64a99b7d66 100644 --- a/Parser/tokenizer.h +++ b/Parser/tokenizer.h @@ -84,6 +84,9 @@ struct tok_state { NEWLINE token after it. */ /* How to proceed when asked for a new token in interactive mode */ enum interactive_underflow_t interactive_underflow; +#ifdef Py_DEBUG + int debug; +#endif }; extern struct tok_state *_PyTokenizer_FromString(const char *, int); diff --git a/Python/frozenmain.c b/Python/frozenmain.c index 8743e082b4ff8..f8be165f7671d 100644 --- a/Python/frozenmain.c +++ b/Python/frozenmain.c @@ -53,7 +53,7 @@ Py_FrozenMain(int argc, char **argv) PyWinFreeze_ExeInit(); #endif - if (Py_VerboseFlag) { + if (_Py_GetConfig()->verbose) { fprintf(stderr, "Python %s\n%s\n", Py_GetVersion(), Py_GetCopyright()); } diff --git a/Tools/peg_generator/pegen/c_generator.py b/Tools/peg_generator/pegen/c_generator.py index 65bfd5900a696..31bb505983329 100644 --- a/Tools/peg_generator/pegen/c_generator.py +++ b/Tools/peg_generator/pegen/c_generator.py @@ -32,7 +32,7 @@ #include "pegen.h" #if defined(Py_DEBUG) && defined(Py_BUILD_CORE) -# define D(x) if (Py_DebugFlag) x; +# define D(x) if (p->debug) { x; } #else # define D(x) #endif From webhook-mailer at python.org Tue May 24 16:37:16 2022 From: webhook-mailer at python.org (zooba) Date: Tue, 24 May 2022 20:37:16 -0000 Subject: [Python-checkins] gh-92658: Add Hyper-V socket support (GH-92755) Message-ID: https://github.com/python/cpython/commit/fbd11f3edd6d2034774d802e048261e613ffcbf5 commit: fbd11f3edd6d2034774d802e048261e613ffcbf5 branch: main author: Jordan Borean committer: zooba date: 2022-05-24T21:37:06+01:00 summary: gh-92658: Add Hyper-V socket support (GH-92755) files: A Misc/NEWS.d/next/Core and Builtins/2022-05-13-00-57-18.gh-issue-92658.YdhFE2.rst M Doc/library/socket.rst M Lib/test/test_socket.py M Modules/socketmodule.c M Modules/socketmodule.h M PCbuild/_socket.vcxproj diff --git a/Doc/library/socket.rst b/Doc/library/socket.rst index 2d25646134a3d..1b801955dff17 100755 --- a/Doc/library/socket.rst +++ b/Doc/library/socket.rst @@ -225,6 +225,29 @@ created. Socket addresses are represented as follows: .. versionadded:: 3.9 +- :const:`AF_HYPERV` is a Windows-only socket based interface for communicating + with Hyper-V hosts and guests. The address family is represented as a + ``(vm_id, service_id)`` tuple where the ``vm_id`` and ``service_id`` are + UUID strings. + + The ``vm_id`` is the virtual machine identifier or a set of known VMID values + if the target is not a specific virtual machine. Known VMID constants + defined on ``socket`` are: + + - ``HV_GUID_ZERO`` + - ``HV_GUID_BROADCAST`` + - ``HV_GUID_WILDCARD`` - Used to bind on itself and accept connections from + all partitions. + - ``HV_GUID_CHILDREN`` - Used to bind on itself and accept connection from + child partitions. + - ``HV_GUID_LOOPBACK`` - Used as a target to itself. + - ``HV_GUID_PARENT`` - When used as a bind accepts connection from the parent + partition. When used as an address target it will connect to the parent parition. + + The ``service_id`` is the service identifier of the registered service. + + .. versionadded:: 3.12 + If you use a hostname in the *host* portion of IPv4/v6 socket address, the program may show a nondeterministic behavior, as Python uses the first address returned from the DNS resolution. The socket address will be resolved @@ -589,6 +612,26 @@ Constants .. availability:: Linux >= 3.9 +.. data:: AF_HYPERV + HV_PROTOCOL_RAW + HVSOCKET_CONNECT_TIMEOUT + HVSOCKET_CONNECT_TIMEOUT_MAX + HVSOCKET_CONTAINER_PASSTHRU + HVSOCKET_CONNECTED_SUSPEND + HVSOCKET_ADDRESS_FLAG_PASSTHRU + HV_GUID_ZERO + HV_GUID_WILDCARD + HV_GUID_BROADCAST + HV_GUID_CHILDREN + HV_GUID_LOOPBACK + HV_GUID_LOOPBACK + + Constants for Windows Hyper-V sockets for host/guest communications. + + .. availability:: Windows. + + .. versionadded:: 3.12 + Functions ^^^^^^^^^ diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py index 1aaa9e44f90c6..c98190382416c 100755 --- a/Lib/test/test_socket.py +++ b/Lib/test/test_socket.py @@ -22,6 +22,7 @@ import signal import math import pickle +import re import struct import random import shutil @@ -143,6 +144,17 @@ def _have_socket_bluetooth(): return True +def _have_socket_hyperv(): + """Check whether AF_HYPERV sockets are supported on this host.""" + try: + s = socket.socket(socket.AF_HYPERV, socket.SOCK_STREAM, socket.HV_PROTOCOL_RAW) + except (AttributeError, OSError): + return False + else: + s.close() + return True + + @contextlib.contextmanager def socket_setdefaulttimeout(timeout): old_timeout = socket.getdefaulttimeout() @@ -171,6 +183,8 @@ def socket_setdefaulttimeout(timeout): HAVE_SOCKET_BLUETOOTH = _have_socket_bluetooth() +HAVE_SOCKET_HYPERV = _have_socket_hyperv() + # Size in bytes of the int type SIZEOF_INT = array.array("i").itemsize @@ -2459,6 +2473,60 @@ def testCreateScoSocket(self): pass + at unittest.skipUnless(HAVE_SOCKET_HYPERV, + 'Hyper-V sockets required for this test.') +class BasicHyperVTest(unittest.TestCase): + + def testHyperVConstants(self): + socket.HVSOCKET_CONNECT_TIMEOUT + socket.HVSOCKET_CONNECT_TIMEOUT_MAX + socket.HVSOCKET_CONTAINER_PASSTHRU + socket.HVSOCKET_CONNECTED_SUSPEND + socket.HVSOCKET_ADDRESS_FLAG_PASSTHRU + socket.HV_GUID_ZERO + socket.HV_GUID_WILDCARD + socket.HV_GUID_BROADCAST + socket.HV_GUID_CHILDREN + socket.HV_GUID_LOOPBACK + socket.HV_GUID_LOOPBACK + + def testCreateHyperVSocketWithUnknownProtoFailure(self): + expected = "A protocol was specified in the socket function call " \ + "that does not support the semantics of the socket type requested" + with self.assertRaisesRegex(OSError, expected): + socket.socket(socket.AF_HYPERV, socket.SOCK_STREAM) + + def testCreateHyperVSocketAddrNotTupleFailure(self): + expected = "connect(): AF_HYPERV address must be tuple, not str" + with socket.socket(socket.AF_HYPERV, socket.SOCK_STREAM, socket.HV_PROTOCOL_RAW) as s: + with self.assertRaisesRegex(TypeError, re.escape(expected)): + s.connect(socket.HV_GUID_ZERO) + + def testCreateHyperVSocketAddrNotTupleOf2StrsFailure(self): + expected = "AF_HYPERV address must be a str tuple (vm_id, service_id)" + with socket.socket(socket.AF_HYPERV, socket.SOCK_STREAM, socket.HV_PROTOCOL_RAW) as s: + with self.assertRaisesRegex(TypeError, re.escape(expected)): + s.connect((socket.HV_GUID_ZERO,)) + + def testCreateHyperVSocketAddrNotTupleOfStrsFailure(self): + expected = "AF_HYPERV address must be a str tuple (vm_id, service_id)" + with socket.socket(socket.AF_HYPERV, socket.SOCK_STREAM, socket.HV_PROTOCOL_RAW) as s: + with self.assertRaisesRegex(TypeError, re.escape(expected)): + s.connect((1, 2)) + + def testCreateHyperVSocketAddrVmIdNotValidUUIDFailure(self): + expected = "connect(): AF_HYPERV address vm_id is not a valid UUID string" + with socket.socket(socket.AF_HYPERV, socket.SOCK_STREAM, socket.HV_PROTOCOL_RAW) as s: + with self.assertRaisesRegex(ValueError, re.escape(expected)): + s.connect(("00", socket.HV_GUID_ZERO)) + + def testCreateHyperVSocketAddrServiceIdNotValidUUIDFailure(self): + expected = "connect(): AF_HYPERV address service_id is not a valid UUID string" + with socket.socket(socket.AF_HYPERV, socket.SOCK_STREAM, socket.HV_PROTOCOL_RAW) as s: + with self.assertRaisesRegex(ValueError, re.escape(expected)): + s.connect((socket.HV_GUID_ZERO, "00")) + + class BasicTCPTest(SocketConnectedTest): def __init__(self, methodName='runTest'): diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-13-00-57-18.gh-issue-92658.YdhFE2.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-13-00-57-18.gh-issue-92658.YdhFE2.rst new file mode 100644 index 0000000000000..887b3d6159660 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-05-13-00-57-18.gh-issue-92658.YdhFE2.rst @@ -0,0 +1 @@ +Add support for connecting and binding to Hyper-V sockets on Windows Hyper-V hosts and guests. diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index f376513fead1b..0bc99011b2c4e 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -271,6 +271,9 @@ shutdown(how) -- shut down traffic in one or both directions\n\ # include # endif +/* Helpers needed for AF_HYPERV */ +# include + /* Macros based on the IPPROTO enum, see: https://bugs.python.org/issue29515 */ #ifdef MS_WINDOWS #define IPPROTO_ICMP IPPROTO_ICMP @@ -1579,6 +1582,35 @@ makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto) } #endif /* HAVE_SOCKADDR_ALG */ +#ifdef AF_HYPERV + case AF_HYPERV: + { + SOCKADDR_HV *a = (SOCKADDR_HV *) addr; + + wchar_t *guidStr; + RPC_STATUS res = UuidToStringW(&a->VmId, &guidStr); + if (res != RPC_S_OK) { + PyErr_SetFromWindowsErr(res); + return 0; + } + PyObject *vmId = PyUnicode_FromWideChar(guidStr, -1); + res = RpcStringFreeW(&guidStr); + assert(res == RPC_S_OK); + + res = UuidToStringW(&a->ServiceId, &guidStr); + if (res != RPC_S_OK) { + Py_DECREF(vmId); + PyErr_SetFromWindowsErr(res); + return 0; + } + PyObject *serviceId = PyUnicode_FromWideChar(guidStr, -1); + res = RpcStringFreeW(&guidStr); + assert(res == RPC_S_OK); + + return Py_BuildValue("NN", vmId, serviceId); + } +#endif /* AF_HYPERV */ + /* More cases here... */ default: @@ -2375,6 +2407,76 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, return 1; } #endif /* HAVE_SOCKADDR_ALG */ +#ifdef AF_HYPERV + case AF_HYPERV: + { + switch (s->sock_proto) { + case HV_PROTOCOL_RAW: + { + PyObject *vm_id_obj = NULL; + PyObject *service_id_obj = NULL; + + SOCKADDR_HV *addr = &addrbuf->hv; + + memset(addr, 0, sizeof(*addr)); + addr->Family = AF_HYPERV; + + if (!PyTuple_Check(args)) { + PyErr_Format(PyExc_TypeError, + "%s(): AF_HYPERV address must be tuple, not %.500s", + caller, Py_TYPE(args)->tp_name); + return 0; + } + if (!PyArg_ParseTuple(args, + "UU;AF_HYPERV address must be a str tuple (vm_id, service_id)", + &vm_id_obj, &service_id_obj)) + { + return 0; + } + + wchar_t *guid_str = PyUnicode_AsWideCharString(vm_id_obj, NULL); + if (guid_str == NULL) { + PyErr_Format(PyExc_ValueError, + "%s(): AF_HYPERV address vm_id is not a valid UUID string", + caller); + return 0; + } + RPC_STATUS rc = UuidFromStringW(guid_str, &addr->VmId); + PyMem_Free(guid_str); + if (rc != RPC_S_OK) { + PyErr_Format(PyExc_ValueError, + "%s(): AF_HYPERV address vm_id is not a valid UUID string", + caller); + return 0; + } + + guid_str = PyUnicode_AsWideCharString(service_id_obj, NULL); + if (guid_str == NULL) { + PyErr_Format(PyExc_ValueError, + "%s(): AF_HYPERV address service_id is not a valid UUID string", + caller); + return 0; + } + rc = UuidFromStringW(guid_str, &addr->ServiceId); + PyMem_Free(guid_str); + if (rc != RPC_S_OK) { + PyErr_Format(PyExc_ValueError, + "%s(): AF_HYPERV address service_id is not a valid UUID string", + caller); + return 0; + } + + *len_ret = sizeof(*addr); + return 1; + } + default: + PyErr_Format(PyExc_OSError, + "%s(): unsupported AF_HYPERV protocol: %d", + caller, s->sock_proto); + return 0; + } + } +#endif /* AF_HYPERV */ /* More cases here... */ @@ -2524,6 +2626,13 @@ getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret) return 1; } #endif /* HAVE_SOCKADDR_ALG */ +#ifdef AF_HYPERV + case AF_HYPERV: + { + *len_ret = sizeof (SOCKADDR_HV); + return 1; + } +#endif /* AF_HYPERV */ /* More cases here... */ @@ -7351,6 +7460,28 @@ PyInit__socket(void) /* Linux LLC */ PyModule_AddIntMacro(m, AF_LLC); #endif +#ifdef AF_HYPERV + /* Hyper-V sockets */ + PyModule_AddIntMacro(m, AF_HYPERV); + + /* for proto */ + PyModule_AddIntMacro(m, HV_PROTOCOL_RAW); + + /* for setsockopt() */ + PyModule_AddIntMacro(m, HVSOCKET_CONNECT_TIMEOUT); + PyModule_AddIntMacro(m, HVSOCKET_CONNECT_TIMEOUT_MAX); + PyModule_AddIntMacro(m, HVSOCKET_CONTAINER_PASSTHRU); + PyModule_AddIntMacro(m, HVSOCKET_CONNECTED_SUSPEND); + PyModule_AddIntMacro(m, HVSOCKET_ADDRESS_FLAG_PASSTHRU); + + /* for bind() or connect() */ + PyModule_AddStringConstant(m, "HV_GUID_ZERO", "00000000-0000-0000-0000-000000000000"); + PyModule_AddStringConstant(m, "HV_GUID_WILDCARD", "00000000-0000-0000-0000-000000000000"); + PyModule_AddStringConstant(m, "HV_GUID_BROADCAST", "FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF"); + PyModule_AddStringConstant(m, "HV_GUID_CHILDREN", "90DB8B89-0D35-4F79-8CE9-49EA0AC8B7CD"); + PyModule_AddStringConstant(m, "HV_GUID_LOOPBACK", "E0E16197-DD56-4A10-9195-5EE7A155A838"); + PyModule_AddStringConstant(m, "HV_GUID_PARENT", "A42E7CDA-D03F-480C-9CC2-A4DE20ABB878"); +#endif /* AF_HYPERV */ #ifdef USE_BLUETOOTH PyModule_AddIntMacro(m, AF_BLUETOOTH); diff --git a/Modules/socketmodule.h b/Modules/socketmodule.h index 1b35b11cdee6a..66d9ccf24e3fd 100644 --- a/Modules/socketmodule.h +++ b/Modules/socketmodule.h @@ -76,6 +76,15 @@ struct SOCKADDR_BTH_REDEF { # else typedef int socklen_t; # endif /* IPPROTO_IPV6 */ + +/* Remove ifdef once Py_WINVER >= 0x0604 + * socket.h only defines AF_HYPERV if _WIN32_WINNT is at that level or higher + * so for now it's just manually defined. + */ +# ifndef AF_HYPERV +# define AF_HYPERV 34 +# endif +# include #endif /* MS_WINDOWS */ #ifdef HAVE_SYS_UN_H @@ -288,6 +297,9 @@ typedef union sock_addr { #ifdef HAVE_LINUX_TIPC_H struct sockaddr_tipc tipc; #endif +#ifdef AF_HYPERV + SOCKADDR_HV hv; +#endif } sock_addr_t; /* The object holding a socket. It holds some extra information, diff --git a/PCbuild/_socket.vcxproj b/PCbuild/_socket.vcxproj index 8fd75f90e7ee1..78fa4d6729abb 100644 --- a/PCbuild/_socket.vcxproj +++ b/PCbuild/_socket.vcxproj @@ -93,7 +93,7 @@ - ws2_32.lib;iphlpapi.lib;%(AdditionalDependencies) + ws2_32.lib;iphlpapi.lib;Rpcrt4.lib;%(AdditionalDependencies) From webhook-mailer at python.org Tue May 24 17:23:10 2022 From: webhook-mailer at python.org (vstinner) Date: Tue, 24 May 2022 21:23:10 -0000 Subject: [Python-checkins] gh-93103: Enhance PyConfig.parser_debug documentation (#93186) Message-ID: https://github.com/python/cpython/commit/c7667a2d353cebb0287d29a3ead29b2107425b96 commit: c7667a2d353cebb0287d29a3ead29b2107425b96 branch: main author: Victor Stinner committer: vstinner date: 2022-05-24T23:23:01+02:00 summary: gh-93103: Enhance PyConfig.parser_debug documentation (#93186) Document that -d option and PYTHONDEBUG env var require a debug build of Python. Also mention them in the debug build documentation. files: M Doc/c-api/init_config.rst M Doc/using/cmdline.rst M Doc/using/configure.rst diff --git a/Doc/c-api/init_config.rst b/Doc/c-api/init_config.rst index 34883c9f349f5..897705cec86fd 100644 --- a/Doc/c-api/init_config.rst +++ b/Doc/c-api/init_config.rst @@ -986,6 +986,9 @@ PyConfig Incremented by the :option:`-d` command line option. Set to the :envvar:`PYTHONDEBUG` environment variable value. + Need a :ref:`debug build of Python ` (the ``Py_DEBUG`` macro + must be defined). + Default: ``0``. .. c:member:: int pathconfig_warnings diff --git a/Doc/using/cmdline.rst b/Doc/using/cmdline.rst index bc54ed8691825..07c05a94b99f9 100644 --- a/Doc/using/cmdline.rst +++ b/Doc/using/cmdline.rst @@ -248,8 +248,11 @@ Miscellaneous options .. cmdoption:: -d - Turn on parser debugging output (for expert only, depending on compilation - options). See also :envvar:`PYTHONDEBUG`. + Turn on parser debugging output (for expert only). + See also the :envvar:`PYTHONDEBUG` environment variable. + + This option requires a :ref:`debug build of Python `, otherwise + it's ignored. .. cmdoption:: -E @@ -660,6 +663,9 @@ conflict. :option:`-d` option. If set to an integer, it is equivalent to specifying :option:`-d` multiple times. + This environment variable requires a :ref:`debug build of Python + `, otherwise it's ignored. + .. envvar:: PYTHONINSPECT diff --git a/Doc/using/configure.rst b/Doc/using/configure.rst index d61647f5ea71e..8cbeb496f2df5 100644 --- a/Doc/using/configure.rst +++ b/Doc/using/configure.rst @@ -278,6 +278,8 @@ Effects of a debug build: * Add ``d`` to :data:`sys.abiflags`. * Add :func:`sys.gettotalrefcount` function. * Add :option:`-X showrefcount <-X>` command line option. +* Add :option:`-d` command line option and :envvar:`PYTHONDEBUG` environment + variable to debug the parser. * Add support for the ``__lltrace__`` variable: enable low-level tracing in the bytecode evaluation loop if the variable is defined. * Install :ref:`debug hooks on memory allocators ` From webhook-mailer at python.org Tue May 24 18:09:58 2022 From: webhook-mailer at python.org (vstinner) Date: Tue, 24 May 2022 22:09:58 -0000 Subject: [Python-checkins] gh-93103: Py_DecodeLocale() uses _PyRuntime.preconfig (#93187) Message-ID: https://github.com/python/cpython/commit/32b7bcffba0e6f6c96d70cafbae1488c6bc36cbc commit: 32b7bcffba0e6f6c96d70cafbae1488c6bc36cbc branch: main author: Victor Stinner committer: vstinner date: 2022-05-25T00:09:48+02:00 summary: gh-93103: Py_DecodeLocale() uses _PyRuntime.preconfig (#93187) The Py_DecodeLocale() and Py_EncodeLocale() now use _PyRuntime.preconfig, rather than Py_UTF8Mode and Py_LegacyWindowsFSEncodingFlag global configuration varibles, to decide if the UTF-8 encoding is used or not. As documented, these functions must not be called before Python is preinitialized. The new PyConfig API should now be used, rather than using deprecated functions like Py_SetPath() or PySys_SetArgv(). files: M Python/fileutils.c M Python/preconfig.c diff --git a/Python/fileutils.c b/Python/fileutils.c index a38886a17ccbb..7e5d01f6e63d3 100644 --- a/Python/fileutils.c +++ b/Python/fileutils.c @@ -603,9 +603,9 @@ _Py_DecodeLocaleEx(const char* arg, wchar_t **wstr, size_t *wlen, return _Py_DecodeUTF8Ex(arg, strlen(arg), wstr, wlen, reason, errors); #else - int use_utf8 = (Py_UTF8Mode == 1); + int use_utf8 = (_PyRuntime.preconfig.utf8_mode >= 1); #ifdef MS_WINDOWS - use_utf8 |= !Py_LegacyWindowsFSEncodingFlag; + use_utf8 |= (_PyRuntime.preconfig.legacy_windows_fs_encoding == 0); #endif if (use_utf8) { return _Py_DecodeUTF8Ex(arg, strlen(arg), wstr, wlen, reason, @@ -795,9 +795,9 @@ encode_locale_ex(const wchar_t *text, char **str, size_t *error_pos, return _Py_EncodeUTF8Ex(text, str, error_pos, reason, raw_malloc, errors); #else - int use_utf8 = (Py_UTF8Mode == 1); + int use_utf8 = (_PyRuntime.preconfig.utf8_mode >= 1); #ifdef MS_WINDOWS - use_utf8 |= !Py_LegacyWindowsFSEncodingFlag; + use_utf8 |= (_PyRuntime.preconfig.legacy_windows_fs_encoding == 0); #endif if (use_utf8) { return _Py_EncodeUTF8Ex(text, str, error_pos, reason, diff --git a/Python/preconfig.c b/Python/preconfig.c index afa16cccf32e9..e7125cd2e3e0e 100644 --- a/Python/preconfig.c +++ b/Python/preconfig.c @@ -826,12 +826,10 @@ _PyPreConfig_Read(PyPreConfig *config, const _PyArgv *args) _Py_SetLocaleFromEnv(LC_CTYPE); } - _PyPreCmdline cmdline = _PyPreCmdline_INIT; - int init_utf8_mode = Py_UTF8Mode; -#ifdef MS_WINDOWS - int init_legacy_encoding = Py_LegacyWindowsFSEncodingFlag; -#endif + PyPreConfig save_runtime_config; + preconfig_copy(&save_runtime_config, &_PyRuntime.preconfig); + _PyPreCmdline cmdline = _PyPreCmdline_INIT; int locale_coerced = 0; int loops = 0; @@ -847,11 +845,9 @@ _PyPreConfig_Read(PyPreConfig *config, const _PyArgv *args) } /* bpo-34207: Py_DecodeLocale() and Py_EncodeLocale() depend - on Py_UTF8Mode and Py_LegacyWindowsFSEncodingFlag. */ - Py_UTF8Mode = config->utf8_mode; -#ifdef MS_WINDOWS - Py_LegacyWindowsFSEncodingFlag = config->legacy_windows_fs_encoding; -#endif + on the utf8_mode and legacy_windows_fs_encoding members + of _PyRuntime.preconfig. */ + preconfig_copy(&_PyRuntime.preconfig, config); if (args) { // Set command line arguments at each iteration. If they are bytes @@ -914,14 +910,10 @@ _PyPreConfig_Read(PyPreConfig *config, const _PyArgv *args) status = _PyStatus_OK(); done: - if (init_ctype_locale != NULL) { - setlocale(LC_CTYPE, init_ctype_locale); - PyMem_RawFree(init_ctype_locale); - } - Py_UTF8Mode = init_utf8_mode ; -#ifdef MS_WINDOWS - Py_LegacyWindowsFSEncodingFlag = init_legacy_encoding; -#endif + // Revert side effects + setlocale(LC_CTYPE, init_ctype_locale); + PyMem_RawFree(init_ctype_locale); + preconfig_copy(&_PyRuntime.preconfig, &save_runtime_config); _PyPreCmdline_Clear(&cmdline); return status; } From webhook-mailer at python.org Tue May 24 20:11:59 2022 From: webhook-mailer at python.org (vstinner) Date: Wed, 25 May 2022 00:11:59 -0000 Subject: [Python-checkins] test.pythoninfo no longer requires socket (#93191) Message-ID: https://github.com/python/cpython/commit/4a31ed8a32699973ae1f779022794fdab9fa08ee commit: 4a31ed8a32699973ae1f779022794fdab9fa08ee branch: main author: Victor Stinner committer: vstinner date: 2022-05-25T02:11:51+02:00 summary: test.pythoninfo no longer requires socket (#93191) test.pythoninfo no longer fails if "import socket" fails: the socket module is now optional. files: M Lib/test/pythoninfo.py diff --git a/Lib/test/pythoninfo.py b/Lib/test/pythoninfo.py index 84e1c047f9219..eadc87a052c4a 100644 --- a/Lib/test/pythoninfo.py +++ b/Lib/test/pythoninfo.py @@ -543,7 +543,10 @@ def format_attr(attr, value): def collect_socket(info_add): - import socket + try: + import socket + except ImportError: + return try: hostname = socket.gethostname() From webhook-mailer at python.org Tue May 24 20:41:11 2022 From: webhook-mailer at python.org (miss-islington) Date: Wed, 25 May 2022 00:41:11 -0000 Subject: [Python-checkins] test.pythoninfo no longer requires socket (GH-93191) Message-ID: https://github.com/python/cpython/commit/7a5f190c9fa7c6cbd334dfea9ae6032ac886dd89 commit: 7a5f190c9fa7c6cbd334dfea9ae6032ac886dd89 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-24T17:41:02-07:00 summary: test.pythoninfo no longer requires socket (GH-93191) test.pythoninfo no longer fails if "import socket" fails: the socket module is now optional. (cherry picked from commit 4a31ed8a32699973ae1f779022794fdab9fa08ee) Co-authored-by: Victor Stinner files: M Lib/test/pythoninfo.py diff --git a/Lib/test/pythoninfo.py b/Lib/test/pythoninfo.py index 84e1c047f9219..eadc87a052c4a 100644 --- a/Lib/test/pythoninfo.py +++ b/Lib/test/pythoninfo.py @@ -543,7 +543,10 @@ def format_attr(attr, value): def collect_socket(info_add): - import socket + try: + import socket + except ImportError: + return try: hostname = socket.gethostname() From webhook-mailer at python.org Tue May 24 20:42:10 2022 From: webhook-mailer at python.org (miss-islington) Date: Wed, 25 May 2022 00:42:10 -0000 Subject: [Python-checkins] test.pythoninfo no longer requires socket (GH-93191) Message-ID: https://github.com/python/cpython/commit/2d5d01f26ba7939e8a035b6fe7abcc8490c9f208 commit: 2d5d01f26ba7939e8a035b6fe7abcc8490c9f208 branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-24T17:42:06-07:00 summary: test.pythoninfo no longer requires socket (GH-93191) test.pythoninfo no longer fails if "import socket" fails: the socket module is now optional. (cherry picked from commit 4a31ed8a32699973ae1f779022794fdab9fa08ee) Co-authored-by: Victor Stinner files: M Lib/test/pythoninfo.py diff --git a/Lib/test/pythoninfo.py b/Lib/test/pythoninfo.py index 8c8011b550acd..005eae549cb04 100644 --- a/Lib/test/pythoninfo.py +++ b/Lib/test/pythoninfo.py @@ -532,7 +532,10 @@ def format_attr(attr, value): def collect_socket(info_add): - import socket + try: + import socket + except ImportError: + return hostname = socket.gethostname() info_add('socket.hostname', hostname) From webhook-mailer at python.org Tue May 24 21:16:38 2022 From: webhook-mailer at python.org (ethanfurman) Date: Wed, 25 May 2022 01:16:38 -0000 Subject: [Python-checkins] gh-93035: [Enum] Fix IntFlag crash when no single-bit members (GH-93076) Message-ID: https://github.com/python/cpython/commit/08cfc3dabf0f81a4494cd0d697befc7d0dec77b7 commit: 08cfc3dabf0f81a4494cd0d697befc7d0dec77b7 branch: main author: Tobin Yehle committer: ethanfurman date: 2022-05-24T18:16:20-07:00 summary: gh-93035: [Enum] Fix IntFlag crash when no single-bit members (GH-93076) `EnumType` attempts to create a custom docstring for each enum/flag, but that was failing with pathological flags that had no members (only multi-bit aliases). files: M Lib/enum.py diff --git a/Lib/enum.py b/Lib/enum.py index 64b44197df522..0b97d3d8a68ef 100644 --- a/Lib/enum.py +++ b/Lib/enum.py @@ -538,7 +538,7 @@ def __new__(metacls, cls, bases, classdict, *, boundary=None, _simple=False, **k # # create a default docstring if one has not been provided if enum_class.__doc__ is None: - if not member_names: + if not member_names or not list(enum_class): enum_class.__doc__ = classdict['__doc__'] = _dedent("""\ Create a collection of name/value pairs. From webhook-mailer at python.org Tue May 24 21:22:49 2022 From: webhook-mailer at python.org (corona10) Date: Wed, 25 May 2022 01:22:49 -0000 Subject: [Python-checkins] gh-92434: Silence a compiler warning in _xxsubinterpretersmodule.c for 32bit version (gh-93091) Message-ID: https://github.com/python/cpython/commit/ac1dcb8ee7745561407130bb917de3277528d4f6 commit: ac1dcb8ee7745561407130bb917de3277528d4f6 branch: main author: neonene <53406459+neonene at users.noreply.github.com> committer: corona10 date: 2022-05-25T10:22:39+09:00 summary: gh-92434: Silence a compiler warning in _xxsubinterpretersmodule.c for 32bit version (gh-93091) files: M Modules/_xxsubinterpretersmodule.c diff --git a/Modules/_xxsubinterpretersmodule.c b/Modules/_xxsubinterpretersmodule.c index 9b1f186c5b6c7..ee04e308fe554 100644 --- a/Modules/_xxsubinterpretersmodule.c +++ b/Modules/_xxsubinterpretersmodule.c @@ -2338,7 +2338,7 @@ channel_list_all(PyObject *self, PyObject *Py_UNUSED(ignored)) ids = NULL; break; } - PyList_SET_ITEM(ids, i, id); + PyList_SET_ITEM(ids, (Py_ssize_t)i, id); } finally: From webhook-mailer at python.org Tue May 24 22:45:06 2022 From: webhook-mailer at python.org (vstinner) Date: Wed, 25 May 2022 02:45:06 -0000 Subject: [Python-checkins] gh-92658: AF_HYPERV is only supported on Windows (#93192) Message-ID: https://github.com/python/cpython/commit/08e4e887f2d4650972272b2f4441485f3e1e9aab commit: 08e4e887f2d4650972272b2f4441485f3e1e9aab branch: main author: Victor Stinner committer: vstinner date: 2022-05-25T04:44:57+02:00 summary: gh-92658: AF_HYPERV is only supported on Windows (#93192) Only build the AF_HYPERV support on Windows for the _socket extension. FreeBSD defines the AF_HYPERV macro but doesn't have the SOCKADDR_HV type. files: M Modules/socketmodule.c M Modules/socketmodule.h diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index 0bc99011b2c4e..002762e2e41ef 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -1582,7 +1582,7 @@ makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto) } #endif /* HAVE_SOCKADDR_ALG */ -#ifdef AF_HYPERV +#ifdef HAVE_AF_HYPERV case AF_HYPERV: { SOCKADDR_HV *a = (SOCKADDR_HV *) addr; @@ -2407,7 +2407,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, return 1; } #endif /* HAVE_SOCKADDR_ALG */ -#ifdef AF_HYPERV +#ifdef HAVE_AF_HYPERV case AF_HYPERV: { switch (s->sock_proto) { @@ -2476,7 +2476,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, return 0; } } -#endif /* AF_HYPERV */ +#endif /* HAVE_AF_HYPERV */ /* More cases here... */ @@ -2626,13 +2626,13 @@ getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret) return 1; } #endif /* HAVE_SOCKADDR_ALG */ -#ifdef AF_HYPERV +#ifdef HAVE_AF_HYPERV case AF_HYPERV: { *len_ret = sizeof (SOCKADDR_HV); return 1; } -#endif /* AF_HYPERV */ +#endif /* HAVE_AF_HYPERV */ /* More cases here... */ @@ -7460,7 +7460,7 @@ PyInit__socket(void) /* Linux LLC */ PyModule_AddIntMacro(m, AF_LLC); #endif -#ifdef AF_HYPERV +#ifdef HAVE_AF_HYPERV /* Hyper-V sockets */ PyModule_AddIntMacro(m, AF_HYPERV); @@ -7481,7 +7481,7 @@ PyInit__socket(void) PyModule_AddStringConstant(m, "HV_GUID_CHILDREN", "90DB8B89-0D35-4F79-8CE9-49EA0AC8B7CD"); PyModule_AddStringConstant(m, "HV_GUID_LOOPBACK", "E0E16197-DD56-4A10-9195-5EE7A155A838"); PyModule_AddStringConstant(m, "HV_GUID_PARENT", "A42E7CDA-D03F-480C-9CC2-A4DE20ABB878"); -#endif /* AF_HYPERV */ +#endif /* HAVE_AF_HYPERV */ #ifdef USE_BLUETOOTH PyModule_AddIntMacro(m, AF_BLUETOOTH); diff --git a/Modules/socketmodule.h b/Modules/socketmodule.h index 66d9ccf24e3fd..f31ba532a6c60 100644 --- a/Modules/socketmodule.h +++ b/Modules/socketmodule.h @@ -249,6 +249,11 @@ typedef int SOCKET_T; #define PyLong_AsSocket_t(fd) (SOCKET_T)PyLong_AsLongLong(fd) #endif +// AF_HYPERV is only supported on Windows +#if defined(AF_HYPERV) && defined(MS_WINDOWS) +# define HAVE_AF_HYPERV +#endif + /* Socket address */ typedef union sock_addr { struct sockaddr_in in; @@ -297,7 +302,7 @@ typedef union sock_addr { #ifdef HAVE_LINUX_TIPC_H struct sockaddr_tipc tipc; #endif -#ifdef AF_HYPERV +#ifdef HAVE_AF_HYPERV SOCKADDR_HV hv; #endif } sock_addr_t; From webhook-mailer at python.org Wed May 25 02:05:57 2022 From: webhook-mailer at python.org (serhiy-storchaka) Date: Wed, 25 May 2022 06:05:57 -0000 Subject: [Python-checkins] gh-92728: Restore re.template, but deprecate it (GH-93161) Message-ID: https://github.com/python/cpython/commit/16a7e4a0b75080275bf12cfb71d54b01d85099b2 commit: 16a7e4a0b75080275bf12cfb71d54b01d85099b2 branch: main author: Miro Hron?ok committer: serhiy-storchaka date: 2022-05-25T09:05:35+03:00 summary: gh-92728: Restore re.template, but deprecate it (GH-93161) Revert "bpo-47211: Remove function re.template() and flag re.TEMPLATE (GH-32300)" This reverts commit b09184bf05b07b77c5ecfedd4daa846be3cbf0a9. files: A Misc/NEWS.d/next/Library/2022-05-24-10-59-02.gh-issue-92728.zxTifq.rst M Doc/whatsnew/3.11.rst M Lib/re/__init__.py M Lib/re/_compiler.py M Lib/re/_constants.py M Lib/re/_parser.py M Lib/test/test_re.py M Misc/NEWS.d/3.11.0b1.rst M Modules/_sre/sre.c M Modules/_sre/sre_constants.h diff --git a/Doc/whatsnew/3.11.rst b/Doc/whatsnew/3.11.rst index 12b4c22d54807..c7ff6ca4938c7 100644 --- a/Doc/whatsnew/3.11.rst +++ b/Doc/whatsnew/3.11.rst @@ -1273,6 +1273,11 @@ Deprecated is now deprecated. Support will be removed in Python 3.13. (Contributed by Jingchen Ye in :gh:`90224`.) +* The :func:`re.template` function and the corresponding :const:`re.TEMPLATE` + and :const:`re.T` flags are deprecated, as they were undocumented and + lacked an obvious purpose. They will be removed in Python 3.13. + (Contributed by Serhiy Storchaka and Miro Hron?ok in :gh:`92728`.) + Pending Removal in Python 3.12 ============================== diff --git a/Lib/re/__init__.py b/Lib/re/__init__.py index c9b511422f1e5..d58c2117ef3e1 100644 --- a/Lib/re/__init__.py +++ b/Lib/re/__init__.py @@ -129,7 +129,7 @@ # public symbols __all__ = [ "match", "fullmatch", "search", "sub", "subn", "split", - "findall", "finditer", "compile", "purge", "escape", + "findall", "finditer", "compile", "purge", "template", "escape", "error", "Pattern", "Match", "A", "I", "L", "M", "S", "X", "U", "ASCII", "IGNORECASE", "LOCALE", "MULTILINE", "DOTALL", "VERBOSE", "UNICODE", "NOFLAG", "RegexFlag", @@ -148,6 +148,8 @@ class RegexFlag: MULTILINE = M = _compiler.SRE_FLAG_MULTILINE # make anchors look for newline DOTALL = S = _compiler.SRE_FLAG_DOTALL # make dot match newline VERBOSE = X = _compiler.SRE_FLAG_VERBOSE # ignore whitespace and comments + # sre extensions (experimental, don't rely on these) + TEMPLATE = T = _compiler.SRE_FLAG_TEMPLATE # unknown purpose, deprecated DEBUG = _compiler.SRE_FLAG_DEBUG # dump pattern after compilation __str__ = object.__str__ _numeric_repr_ = hex @@ -229,6 +231,18 @@ def purge(): _cache.clear() _compile_repl.cache_clear() +def template(pattern, flags=0): + "Compile a template pattern, returning a Pattern object, deprecated" + import warnings + warnings.warn("The re.template() function is deprecated " + "as it is an undocumented function " + "without an obvious purpose. " + "Use re.compile() instead.", + DeprecationWarning) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", DeprecationWarning) # warn just once + return _compile(pattern, flags|T) + # SPECIAL_CHARS # closing ')', '}' and ']' # '-' (a range in character set) @@ -270,6 +284,13 @@ def _compile(pattern, flags): return pattern if not _compiler.isstring(pattern): raise TypeError("first argument must be string or compiled pattern") + if flags & T: + import warnings + warnings.warn("The re.TEMPLATE/re.T flag is deprecated " + "as it is an undocumented flag " + "without an obvious purpose. " + "Don't use it.", + DeprecationWarning) p = _compiler.compile(pattern, flags) if not (flags & DEBUG): if len(_cache) >= _MAXCACHE: diff --git a/Lib/re/_compiler.py b/Lib/re/_compiler.py index 63d82025505b7..4b5322338cbd5 100644 --- a/Lib/re/_compiler.py +++ b/Lib/re/_compiler.py @@ -108,6 +108,8 @@ def _compile(data, pattern, flags): else: emit(ANY) elif op in REPEATING_CODES: + if flags & SRE_FLAG_TEMPLATE: + raise error("internal: unsupported template operator %r" % (op,)) if _simple(av[2]): emit(REPEATING_CODES[op][2]) skip = _len(code); emit(0) diff --git a/Lib/re/_constants.py b/Lib/re/_constants.py index 71204d903b322..1cc85c631f22b 100644 --- a/Lib/re/_constants.py +++ b/Lib/re/_constants.py @@ -204,6 +204,7 @@ def _makecodes(*names): } # flags +SRE_FLAG_TEMPLATE = 1 # template mode (unknown purpose, deprecated) SRE_FLAG_IGNORECASE = 2 # case insensitive SRE_FLAG_LOCALE = 4 # honour system locale SRE_FLAG_MULTILINE = 8 # treat target as multiline string diff --git a/Lib/re/_parser.py b/Lib/re/_parser.py index 33b70973ae6d3..0d9cf632ea710 100644 --- a/Lib/re/_parser.py +++ b/Lib/re/_parser.py @@ -61,11 +61,12 @@ "x": SRE_FLAG_VERBOSE, # extensions "a": SRE_FLAG_ASCII, + "t": SRE_FLAG_TEMPLATE, "u": SRE_FLAG_UNICODE, } TYPE_FLAGS = SRE_FLAG_ASCII | SRE_FLAG_LOCALE | SRE_FLAG_UNICODE -GLOBAL_FLAGS = SRE_FLAG_DEBUG +GLOBAL_FLAGS = SRE_FLAG_DEBUG | SRE_FLAG_TEMPLATE class State: # keeps track of state for parsing diff --git a/Lib/test/test_re.py b/Lib/test/test_re.py index 52ee616e210fb..3752d734dbdef 100644 --- a/Lib/test/test_re.py +++ b/Lib/test/test_re.py @@ -2386,6 +2386,30 @@ def test_bug_gh91616(self): self.assertTrue(re.fullmatch(r'(?s:(?>.*?\.).*)\Z', "a.txt")) # reproducer self.assertTrue(re.fullmatch(r'(?s:(?=(?P.*?\.))(?P=g0).*)\Z', "a.txt")) + def test_template_function_and_flag_is_deprecated(self): + with self.assertWarns(DeprecationWarning) as cm: + template_re1 = re.template(r'a') + self.assertIn('re.template()', str(cm.warning)) + self.assertIn('is deprecated', str(cm.warning)) + self.assertIn('function', str(cm.warning)) + self.assertNotIn('flag', str(cm.warning)) + + with self.assertWarns(DeprecationWarning) as cm: + # we deliberately use more flags here to test that that still + # triggers the warning + # if paranoid, we could test multiple different combinations, + # but it's probably not worth it + template_re2 = re.compile(r'a', flags=re.TEMPLATE|re.UNICODE) + self.assertIn('re.TEMPLATE', str(cm.warning)) + self.assertIn('is deprecated', str(cm.warning)) + self.assertIn('flag', str(cm.warning)) + self.assertNotIn('function', str(cm.warning)) + + # while deprecated, is should still function + self.assertEqual(template_re1, template_re2) + self.assertTrue(template_re1.match('ahoy')) + self.assertFalse(template_re1.match('nope')) + def get_debug_out(pat): with captured_stdout() as out: @@ -2580,11 +2604,11 @@ def test_flags_repr(self): "re.IGNORECASE|re.DOTALL|re.VERBOSE|0x100000") self.assertEqual( repr(~re.I), - "re.ASCII|re.LOCALE|re.UNICODE|re.MULTILINE|re.DOTALL|re.VERBOSE|re.DEBUG|0x1") + "re.ASCII|re.LOCALE|re.UNICODE|re.MULTILINE|re.DOTALL|re.VERBOSE|re.TEMPLATE|re.DEBUG") self.assertEqual(repr(~(re.I|re.S|re.X)), - "re.ASCII|re.LOCALE|re.UNICODE|re.MULTILINE|re.DEBUG|0x1") + "re.ASCII|re.LOCALE|re.UNICODE|re.MULTILINE|re.TEMPLATE|re.DEBUG") self.assertEqual(repr(~(re.I|re.S|re.X|(1<<20))), - "re.ASCII|re.LOCALE|re.UNICODE|re.MULTILINE|re.DEBUG|0xffe01") + "re.ASCII|re.LOCALE|re.UNICODE|re.MULTILINE|re.TEMPLATE|re.DEBUG|0xffe00") class ImplementationTest(unittest.TestCase): diff --git a/Misc/NEWS.d/3.11.0b1.rst b/Misc/NEWS.d/3.11.0b1.rst index 0def806185e5a..c135eff4598e4 100644 --- a/Misc/NEWS.d/3.11.0b1.rst +++ b/Misc/NEWS.d/3.11.0b1.rst @@ -1373,6 +1373,7 @@ Suppress expression chaining for more :mod:`re` parsing errors. Remove undocumented and never working function ``re.template()`` and flag ``re.TEMPLATE``. +This was later reverted in 3.11.0b2 and deprecated instead. .. diff --git a/Misc/NEWS.d/next/Library/2022-05-24-10-59-02.gh-issue-92728.zxTifq.rst b/Misc/NEWS.d/next/Library/2022-05-24-10-59-02.gh-issue-92728.zxTifq.rst new file mode 100644 index 0000000000000..b39609be2c4cf --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-05-24-10-59-02.gh-issue-92728.zxTifq.rst @@ -0,0 +1,3 @@ +The :func:`re.template` function and the corresponding :const:`re.TEMPLATE` +and :const:`re.T` flags are restored after they were removed in 3.11.0b1, +but they are now deprecated, so they might be removed from Python 3.13. diff --git a/Modules/_sre/sre.c b/Modules/_sre/sre.c index bd9204da428af..491734f243849 100644 --- a/Modules/_sre/sre.c +++ b/Modules/_sre/sre.c @@ -1323,6 +1323,7 @@ pattern_repr(PatternObject *obj) const char *name; int value; } flag_names[] = { + {"re.TEMPLATE", SRE_FLAG_TEMPLATE}, {"re.IGNORECASE", SRE_FLAG_IGNORECASE}, {"re.LOCALE", SRE_FLAG_LOCALE}, {"re.MULTILINE", SRE_FLAG_MULTILINE}, diff --git a/Modules/_sre/sre_constants.h b/Modules/_sre/sre_constants.h index d5de650b7025a..590d5be7cb4d9 100644 --- a/Modules/_sre/sre_constants.h +++ b/Modules/_sre/sre_constants.h @@ -85,6 +85,7 @@ #define SRE_CATEGORY_UNI_NOT_WORD 15 #define SRE_CATEGORY_UNI_LINEBREAK 16 #define SRE_CATEGORY_UNI_NOT_LINEBREAK 17 +#define SRE_FLAG_TEMPLATE 1 #define SRE_FLAG_IGNORECASE 2 #define SRE_FLAG_LOCALE 4 #define SRE_FLAG_MULTILINE 8 From webhook-mailer at python.org Wed May 25 02:32:33 2022 From: webhook-mailer at python.org (miss-islington) Date: Wed, 25 May 2022 06:32:33 -0000 Subject: [Python-checkins] gh-92728: Restore re.template, but deprecate it (GH-93161) Message-ID: https://github.com/python/cpython/commit/74b205b3eb6432d81d745da1dae4359e42ae76d4 commit: 74b205b3eb6432d81d745da1dae4359e42ae76d4 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-24T23:32:20-07:00 summary: gh-92728: Restore re.template, but deprecate it (GH-93161) Revert "bpo-47211: Remove function re.template() and flag re.TEMPLATE (GH-32300)" This reverts commit b09184bf05b07b77c5ecfedd4daa846be3cbf0a9. (cherry picked from commit 16a7e4a0b75080275bf12cfb71d54b01d85099b2) Co-authored-by: Miro Hron?ok files: A Misc/NEWS.d/next/Library/2022-05-24-10-59-02.gh-issue-92728.zxTifq.rst M Doc/whatsnew/3.11.rst M Lib/re/__init__.py M Lib/re/_compiler.py M Lib/re/_constants.py M Lib/re/_parser.py M Lib/test/test_re.py M Misc/NEWS.d/3.11.0b1.rst M Modules/_sre/sre.c M Modules/_sre/sre_constants.h diff --git a/Doc/whatsnew/3.11.rst b/Doc/whatsnew/3.11.rst index 12b4c22d54807..c7ff6ca4938c7 100644 --- a/Doc/whatsnew/3.11.rst +++ b/Doc/whatsnew/3.11.rst @@ -1273,6 +1273,11 @@ Deprecated is now deprecated. Support will be removed in Python 3.13. (Contributed by Jingchen Ye in :gh:`90224`.) +* The :func:`re.template` function and the corresponding :const:`re.TEMPLATE` + and :const:`re.T` flags are deprecated, as they were undocumented and + lacked an obvious purpose. They will be removed in Python 3.13. + (Contributed by Serhiy Storchaka and Miro Hron?ok in :gh:`92728`.) + Pending Removal in Python 3.12 ============================== diff --git a/Lib/re/__init__.py b/Lib/re/__init__.py index c9b511422f1e5..d58c2117ef3e1 100644 --- a/Lib/re/__init__.py +++ b/Lib/re/__init__.py @@ -129,7 +129,7 @@ # public symbols __all__ = [ "match", "fullmatch", "search", "sub", "subn", "split", - "findall", "finditer", "compile", "purge", "escape", + "findall", "finditer", "compile", "purge", "template", "escape", "error", "Pattern", "Match", "A", "I", "L", "M", "S", "X", "U", "ASCII", "IGNORECASE", "LOCALE", "MULTILINE", "DOTALL", "VERBOSE", "UNICODE", "NOFLAG", "RegexFlag", @@ -148,6 +148,8 @@ class RegexFlag: MULTILINE = M = _compiler.SRE_FLAG_MULTILINE # make anchors look for newline DOTALL = S = _compiler.SRE_FLAG_DOTALL # make dot match newline VERBOSE = X = _compiler.SRE_FLAG_VERBOSE # ignore whitespace and comments + # sre extensions (experimental, don't rely on these) + TEMPLATE = T = _compiler.SRE_FLAG_TEMPLATE # unknown purpose, deprecated DEBUG = _compiler.SRE_FLAG_DEBUG # dump pattern after compilation __str__ = object.__str__ _numeric_repr_ = hex @@ -229,6 +231,18 @@ def purge(): _cache.clear() _compile_repl.cache_clear() +def template(pattern, flags=0): + "Compile a template pattern, returning a Pattern object, deprecated" + import warnings + warnings.warn("The re.template() function is deprecated " + "as it is an undocumented function " + "without an obvious purpose. " + "Use re.compile() instead.", + DeprecationWarning) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", DeprecationWarning) # warn just once + return _compile(pattern, flags|T) + # SPECIAL_CHARS # closing ')', '}' and ']' # '-' (a range in character set) @@ -270,6 +284,13 @@ def _compile(pattern, flags): return pattern if not _compiler.isstring(pattern): raise TypeError("first argument must be string or compiled pattern") + if flags & T: + import warnings + warnings.warn("The re.TEMPLATE/re.T flag is deprecated " + "as it is an undocumented flag " + "without an obvious purpose. " + "Don't use it.", + DeprecationWarning) p = _compiler.compile(pattern, flags) if not (flags & DEBUG): if len(_cache) >= _MAXCACHE: diff --git a/Lib/re/_compiler.py b/Lib/re/_compiler.py index 63d82025505b7..4b5322338cbd5 100644 --- a/Lib/re/_compiler.py +++ b/Lib/re/_compiler.py @@ -108,6 +108,8 @@ def _compile(data, pattern, flags): else: emit(ANY) elif op in REPEATING_CODES: + if flags & SRE_FLAG_TEMPLATE: + raise error("internal: unsupported template operator %r" % (op,)) if _simple(av[2]): emit(REPEATING_CODES[op][2]) skip = _len(code); emit(0) diff --git a/Lib/re/_constants.py b/Lib/re/_constants.py index 71204d903b322..1cc85c631f22b 100644 --- a/Lib/re/_constants.py +++ b/Lib/re/_constants.py @@ -204,6 +204,7 @@ def _makecodes(*names): } # flags +SRE_FLAG_TEMPLATE = 1 # template mode (unknown purpose, deprecated) SRE_FLAG_IGNORECASE = 2 # case insensitive SRE_FLAG_LOCALE = 4 # honour system locale SRE_FLAG_MULTILINE = 8 # treat target as multiline string diff --git a/Lib/re/_parser.py b/Lib/re/_parser.py index a393c508d86e5..f747a0396b1f3 100644 --- a/Lib/re/_parser.py +++ b/Lib/re/_parser.py @@ -61,11 +61,12 @@ "x": SRE_FLAG_VERBOSE, # extensions "a": SRE_FLAG_ASCII, + "t": SRE_FLAG_TEMPLATE, "u": SRE_FLAG_UNICODE, } TYPE_FLAGS = SRE_FLAG_ASCII | SRE_FLAG_LOCALE | SRE_FLAG_UNICODE -GLOBAL_FLAGS = SRE_FLAG_DEBUG +GLOBAL_FLAGS = SRE_FLAG_DEBUG | SRE_FLAG_TEMPLATE class State: # keeps track of state for parsing diff --git a/Lib/test/test_re.py b/Lib/test/test_re.py index 442547da31d42..6d61412f16068 100644 --- a/Lib/test/test_re.py +++ b/Lib/test/test_re.py @@ -2417,6 +2417,30 @@ def test_bug_gh91616(self): self.assertTrue(re.fullmatch(r'(?s:(?>.*?\.).*)\Z', "a.txt")) # reproducer self.assertTrue(re.fullmatch(r'(?s:(?=(?P.*?\.))(?P=g0).*)\Z', "a.txt")) + def test_template_function_and_flag_is_deprecated(self): + with self.assertWarns(DeprecationWarning) as cm: + template_re1 = re.template(r'a') + self.assertIn('re.template()', str(cm.warning)) + self.assertIn('is deprecated', str(cm.warning)) + self.assertIn('function', str(cm.warning)) + self.assertNotIn('flag', str(cm.warning)) + + with self.assertWarns(DeprecationWarning) as cm: + # we deliberately use more flags here to test that that still + # triggers the warning + # if paranoid, we could test multiple different combinations, + # but it's probably not worth it + template_re2 = re.compile(r'a', flags=re.TEMPLATE|re.UNICODE) + self.assertIn('re.TEMPLATE', str(cm.warning)) + self.assertIn('is deprecated', str(cm.warning)) + self.assertIn('flag', str(cm.warning)) + self.assertNotIn('function', str(cm.warning)) + + # while deprecated, is should still function + self.assertEqual(template_re1, template_re2) + self.assertTrue(template_re1.match('ahoy')) + self.assertFalse(template_re1.match('nope')) + def get_debug_out(pat): with captured_stdout() as out: @@ -2611,11 +2635,11 @@ def test_flags_repr(self): "re.IGNORECASE|re.DOTALL|re.VERBOSE|0x100000") self.assertEqual( repr(~re.I), - "re.ASCII|re.LOCALE|re.UNICODE|re.MULTILINE|re.DOTALL|re.VERBOSE|re.DEBUG|0x1") + "re.ASCII|re.LOCALE|re.UNICODE|re.MULTILINE|re.DOTALL|re.VERBOSE|re.TEMPLATE|re.DEBUG") self.assertEqual(repr(~(re.I|re.S|re.X)), - "re.ASCII|re.LOCALE|re.UNICODE|re.MULTILINE|re.DEBUG|0x1") + "re.ASCII|re.LOCALE|re.UNICODE|re.MULTILINE|re.TEMPLATE|re.DEBUG") self.assertEqual(repr(~(re.I|re.S|re.X|(1<<20))), - "re.ASCII|re.LOCALE|re.UNICODE|re.MULTILINE|re.DEBUG|0xffe01") + "re.ASCII|re.LOCALE|re.UNICODE|re.MULTILINE|re.TEMPLATE|re.DEBUG|0xffe00") class ImplementationTest(unittest.TestCase): diff --git a/Misc/NEWS.d/3.11.0b1.rst b/Misc/NEWS.d/3.11.0b1.rst index 0def806185e5a..c135eff4598e4 100644 --- a/Misc/NEWS.d/3.11.0b1.rst +++ b/Misc/NEWS.d/3.11.0b1.rst @@ -1373,6 +1373,7 @@ Suppress expression chaining for more :mod:`re` parsing errors. Remove undocumented and never working function ``re.template()`` and flag ``re.TEMPLATE``. +This was later reverted in 3.11.0b2 and deprecated instead. .. diff --git a/Misc/NEWS.d/next/Library/2022-05-24-10-59-02.gh-issue-92728.zxTifq.rst b/Misc/NEWS.d/next/Library/2022-05-24-10-59-02.gh-issue-92728.zxTifq.rst new file mode 100644 index 0000000000000..b39609be2c4cf --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-05-24-10-59-02.gh-issue-92728.zxTifq.rst @@ -0,0 +1,3 @@ +The :func:`re.template` function and the corresponding :const:`re.TEMPLATE` +and :const:`re.T` flags are restored after they were removed in 3.11.0b1, +but they are now deprecated, so they might be removed from Python 3.13. diff --git a/Modules/_sre/sre.c b/Modules/_sre/sre.c index bd9204da428af..491734f243849 100644 --- a/Modules/_sre/sre.c +++ b/Modules/_sre/sre.c @@ -1323,6 +1323,7 @@ pattern_repr(PatternObject *obj) const char *name; int value; } flag_names[] = { + {"re.TEMPLATE", SRE_FLAG_TEMPLATE}, {"re.IGNORECASE", SRE_FLAG_IGNORECASE}, {"re.LOCALE", SRE_FLAG_LOCALE}, {"re.MULTILINE", SRE_FLAG_MULTILINE}, diff --git a/Modules/_sre/sre_constants.h b/Modules/_sre/sre_constants.h index d5de650b7025a..590d5be7cb4d9 100644 --- a/Modules/_sre/sre_constants.h +++ b/Modules/_sre/sre_constants.h @@ -85,6 +85,7 @@ #define SRE_CATEGORY_UNI_NOT_WORD 15 #define SRE_CATEGORY_UNI_LINEBREAK 16 #define SRE_CATEGORY_UNI_NOT_LINEBREAK 17 +#define SRE_FLAG_TEMPLATE 1 #define SRE_FLAG_IGNORECASE 2 #define SRE_FLAG_LOCALE 4 #define SRE_FLAG_MULTILINE 8 From webhook-mailer at python.org Wed May 25 03:58:03 2022 From: webhook-mailer at python.org (miss-islington) Date: Wed, 25 May 2022 07:58:03 -0000 Subject: [Python-checkins] [3.11] gh-83245: Raise BadZipFile instead of ValueError when reading a corrupt ZIP file (GH-32291) (GH-93141) Message-ID: https://github.com/python/cpython/commit/e9d6ca4334273d44e7bd369d119380b4b7d9807d commit: e9d6ca4334273d44e7bd369d119380b4b7d9807d branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-25T00:57:36-07:00 summary: [3.11] gh-83245: Raise BadZipFile instead of ValueError when reading a corrupt ZIP file (GH-32291) (GH-93141) Co-authored-by: Serhiy Storchaka (cherry picked from commit 202ed2506c84cd98e9e35621b5b2929ceb717864) Co-authored-by: Sam Ezeh Automerge-Triggered-By: GH:serhiy-storchaka files: A Misc/NEWS.d/next/Library/2022-04-03-19-40-09.bpo-39064.76PbIz.rst M Lib/test/test_zipfile.py M Lib/zipfile.py diff --git a/Lib/test/test_zipfile.py b/Lib/test/test_zipfile.py index 848bf4f76d453..f4c11d88c8a09 100644 --- a/Lib/test/test_zipfile.py +++ b/Lib/test/test_zipfile.py @@ -1740,6 +1740,17 @@ def test_empty_file_raises_BadZipFile(self): fp.write("short file") self.assertRaises(zipfile.BadZipFile, zipfile.ZipFile, TESTFN) + def test_negative_central_directory_offset_raises_BadZipFile(self): + # Zip file containing an empty EOCD record + buffer = bytearray(b'PK\x05\x06' + b'\0'*18) + + # Set the size of the central directory bytes to become 1, + # causing the central directory offset to become negative + for dirsize in 1, 2**32-1: + buffer[12:16] = struct.pack(' https://github.com/python/cpython/commit/132ea299361e08c77c2b02ff25cf31eb73d3642f commit: 132ea299361e08c77c2b02ff25cf31eb73d3642f branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-25T00:57:56-07:00 summary: [3.10] gh-83245: Raise BadZipFile instead of ValueError when reading a corrupt ZIP file (GH-32291) (GH-93140) Co-authored-by: Serhiy Storchaka (cherry picked from commit 202ed2506c84cd98e9e35621b5b2929ceb717864) Co-authored-by: Sam Ezeh Automerge-Triggered-By: GH:serhiy-storchaka files: A Misc/NEWS.d/next/Library/2022-04-03-19-40-09.bpo-39064.76PbIz.rst M Lib/test/test_zipfile.py M Lib/zipfile.py diff --git a/Lib/test/test_zipfile.py b/Lib/test/test_zipfile.py index 6e06ee6a60043..e557d569a119c 100644 --- a/Lib/test/test_zipfile.py +++ b/Lib/test/test_zipfile.py @@ -1736,6 +1736,17 @@ def test_empty_file_raises_BadZipFile(self): fp.write("short file") self.assertRaises(zipfile.BadZipFile, zipfile.ZipFile, TESTFN) + def test_negative_central_directory_offset_raises_BadZipFile(self): + # Zip file containing an empty EOCD record + buffer = bytearray(b'PK\x05\x06' + b'\0'*18) + + # Set the size of the central directory bytes to become 1, + # causing the central directory offset to become negative + for dirsize in 1, 2**32-1: + buffer[12:16] = struct.pack(' https://github.com/python/cpython/commit/19710145b496b5e5341630d80be9c400aa792bd1 commit: 19710145b496b5e5341630d80be9c400aa792bd1 branch: main author: Florian Bruhin committer: serhiy-storchaka date: 2022-05-25T10:59:32+03:00 summary: test_threaded_import: Fix unittest.main spelling (GH-93114) files: M Lib/test/test_importlib/test_threaded_import.py diff --git a/Lib/test/test_importlib/test_threaded_import.py b/Lib/test/test_importlib/test_threaded_import.py index cc1d804f35f91..9aeeb5e686e93 100644 --- a/Lib/test/test_importlib/test_threaded_import.py +++ b/Lib/test/test_importlib/test_threaded_import.py @@ -272,4 +272,4 @@ def setUpModule(): if __name__ == "__main__": - unittets.main() + unittest.main() From webhook-mailer at python.org Wed May 25 04:18:06 2022 From: webhook-mailer at python.org (miss-islington) Date: Wed, 25 May 2022 08:18:06 -0000 Subject: [Python-checkins] test_threaded_import: Fix unittest.main spelling (GH-93114) Message-ID: https://github.com/python/cpython/commit/02d35fc4ef8a718e74ab97402b6d8371b69d3635 commit: 02d35fc4ef8a718e74ab97402b6d8371b69d3635 branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-25T01:17:57-07:00 summary: test_threaded_import: Fix unittest.main spelling (GH-93114) (cherry picked from commit 19710145b496b5e5341630d80be9c400aa792bd1) Co-authored-by: Florian Bruhin files: M Lib/test/test_importlib/test_threaded_import.py diff --git a/Lib/test/test_importlib/test_threaded_import.py b/Lib/test/test_importlib/test_threaded_import.py index 76b028eac97bf..d37eb2914f2c7 100644 --- a/Lib/test/test_importlib/test_threaded_import.py +++ b/Lib/test/test_importlib/test_threaded_import.py @@ -270,4 +270,4 @@ def setUpModule(): if __name__ == "__main__": - unittets.main() + unittest.main() From webhook-mailer at python.org Wed May 25 04:22:29 2022 From: webhook-mailer at python.org (miss-islington) Date: Wed, 25 May 2022 08:22:29 -0000 Subject: [Python-checkins] test_threaded_import: Fix unittest.main spelling (GH-93114) Message-ID: https://github.com/python/cpython/commit/2ea3d3b847a607c536f6d5714328cb54733eeca0 commit: 2ea3d3b847a607c536f6d5714328cb54733eeca0 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-25T01:22:21-07:00 summary: test_threaded_import: Fix unittest.main spelling (GH-93114) (cherry picked from commit 19710145b496b5e5341630d80be9c400aa792bd1) Co-authored-by: Florian Bruhin files: M Lib/test/test_importlib/test_threaded_import.py diff --git a/Lib/test/test_importlib/test_threaded_import.py b/Lib/test/test_importlib/test_threaded_import.py index cc1d804f35f91..9aeeb5e686e93 100644 --- a/Lib/test/test_importlib/test_threaded_import.py +++ b/Lib/test/test_importlib/test_threaded_import.py @@ -272,4 +272,4 @@ def setUpModule(): if __name__ == "__main__": - unittets.main() + unittest.main() From webhook-mailer at python.org Wed May 25 05:45:51 2022 From: webhook-mailer at python.org (vstinner) Date: Wed, 25 May 2022 09:45:51 -0000 Subject: [Python-checkins] gh-91924: Fix __lltrace__ for non-UTF-8 stdout encoding (#93199) Message-ID: https://github.com/python/cpython/commit/5695c0e0a25da58dfc1d22fc1cd68c2fda0a320d commit: 5695c0e0a25da58dfc1d22fc1cd68c2fda0a320d branch: main author: Victor Stinner committer: vstinner date: 2022-05-25T11:45:33+02:00 summary: gh-91924: Fix __lltrace__ for non-UTF-8 stdout encoding (#93199) Fix __lltrace__ debug feature if the stdout encoding is not UTF-8. If the stdout encoding is not UTF-8, the first call to lltrace_resume_frame() indirectly sets lltrace to 0 when calling unicode_check_encoding_errors() which calls encodings.search_function(). files: A Misc/NEWS.d/next/Core and Builtins/2022-05-25-04-07-22.gh-issue-91924.-UyO4q.rst M Python/ceval.c diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-25-04-07-22.gh-issue-91924.-UyO4q.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-25-04-07-22.gh-issue-91924.-UyO4q.rst new file mode 100644 index 0000000000000..44866a03cf48b --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-05-25-04-07-22.gh-issue-91924.-UyO4q.rst @@ -0,0 +1,2 @@ +Fix ``__lltrace__`` debug feature if the stdout encoding is not UTF-8. Patch +by Victor Stinner. diff --git a/Python/ceval.c b/Python/ceval.c index 230198b41f6a5..e82f734302216 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -107,7 +107,6 @@ static PyObject * do_call_core( PyObject *callargs, PyObject *kwdict, int use_tracing); #ifdef LLTRACE -static int lltrace; static void dump_stack(_PyInterpreterFrame *frame, PyObject **stack_pointer) { @@ -1715,6 +1714,9 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int uint8_t opcode; /* Current opcode */ int oparg; /* Current opcode argument, if any */ _Py_atomic_int * const eval_breaker = &tstate->interp->ceval.eval_breaker; +#ifdef LLTRACE + int lltrace = 0; +#endif _PyCFrame cframe; CallShape call_shape; From webhook-mailer at python.org Wed May 25 06:12:18 2022 From: webhook-mailer at python.org (miss-islington) Date: Wed, 25 May 2022 10:12:18 -0000 Subject: [Python-checkins] gh-91924: Fix __lltrace__ for non-UTF-8 stdout encoding (GH-93199) Message-ID: https://github.com/python/cpython/commit/307dacd651356d7318d5330b98794560329cf5e2 commit: 307dacd651356d7318d5330b98794560329cf5e2 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-25T03:11:46-07:00 summary: gh-91924: Fix __lltrace__ for non-UTF-8 stdout encoding (GH-93199) Fix __lltrace__ debug feature if the stdout encoding is not UTF-8. If the stdout encoding is not UTF-8, the first call to lltrace_resume_frame() indirectly sets lltrace to 0 when calling unicode_check_encoding_errors() which calls encodings.search_function(). (cherry picked from commit 5695c0e0a25da58dfc1d22fc1cd68c2fda0a320d) Co-authored-by: Victor Stinner files: A Misc/NEWS.d/next/Core and Builtins/2022-05-25-04-07-22.gh-issue-91924.-UyO4q.rst M Python/ceval.c diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-25-04-07-22.gh-issue-91924.-UyO4q.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-25-04-07-22.gh-issue-91924.-UyO4q.rst new file mode 100644 index 0000000000000..44866a03cf48b --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-05-25-04-07-22.gh-issue-91924.-UyO4q.rst @@ -0,0 +1,2 @@ +Fix ``__lltrace__`` debug feature if the stdout encoding is not UTF-8. Patch +by Victor Stinner. diff --git a/Python/ceval.c b/Python/ceval.c index c73218fcf307e..62379b4a85527 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -103,7 +103,6 @@ static PyObject * do_call_core( PyObject *callargs, PyObject *kwdict, int use_tracing); #ifdef LLTRACE -static int lltrace; static void dump_stack(_PyInterpreterFrame *frame, PyObject **stack_pointer) { @@ -1715,6 +1714,9 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int uint8_t opcode; /* Current opcode */ int oparg; /* Current opcode argument, if any */ _Py_atomic_int * const eval_breaker = &tstate->interp->ceval.eval_breaker; +#ifdef LLTRACE + int lltrace = 0; +#endif _PyCFrame cframe; CallShape call_shape; From webhook-mailer at python.org Wed May 25 06:39:35 2022 From: webhook-mailer at python.org (vstinner) Date: Wed, 25 May 2022 10:39:35 -0000 Subject: [Python-checkins] gh-93040 Wrap unused parameters in Objects/obmalloc.c with Py_UNUSED (#93175) Message-ID: https://github.com/python/cpython/commit/9485a0dbddcee014821b41c960133632bb68b33c commit: 9485a0dbddcee014821b41c960133632bb68b33c branch: main author: oda-gitso <105083118+oda-gitso at users.noreply.github.com> committer: vstinner date: 2022-05-25T12:39:06+02:00 summary: gh-93040 Wrap unused parameters in Objects/obmalloc.c with Py_UNUSED (#93175) files: A Misc/NEWS.d/next/Core and Builtins/2022-05-24-14-35-48.gh-issue-93040.9X6Ofu.rst M Objects/obmalloc.c diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-24-14-35-48.gh-issue-93040.9X6Ofu.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-24-14-35-48.gh-issue-93040.9X6Ofu.rst new file mode 100644 index 0000000000000..b2e527446ea7a --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-05-24-14-35-48.gh-issue-93040.9X6Ofu.rst @@ -0,0 +1 @@ +Wraps unused parameters in ``Objects/obmalloc.c`` with ``Py_UNUSED``. diff --git a/Objects/obmalloc.c b/Objects/obmalloc.c index 823855ca6d8e8..78a6f01a0964e 100644 --- a/Objects/obmalloc.c +++ b/Objects/obmalloc.c @@ -90,7 +90,7 @@ struct _PyTraceMalloc_Config _Py_tracemalloc_config = _PyTraceMalloc_Config_INIT static void * -_PyMem_RawMalloc(void *ctx, size_t size) +_PyMem_RawMalloc(void *Py_UNUSED(ctx), size_t size) { /* PyMem_RawMalloc(0) means malloc(1). Some systems would return NULL for malloc(0), which would be treated as an error. Some platforms would @@ -102,7 +102,7 @@ _PyMem_RawMalloc(void *ctx, size_t size) } static void * -_PyMem_RawCalloc(void *ctx, size_t nelem, size_t elsize) +_PyMem_RawCalloc(void *Py_UNUSED(ctx), size_t nelem, size_t elsize) { /* PyMem_RawCalloc(0, 0) means calloc(1, 1). Some systems would return NULL for calloc(0, 0), which would be treated as an error. Some platforms @@ -116,7 +116,7 @@ _PyMem_RawCalloc(void *ctx, size_t nelem, size_t elsize) } static void * -_PyMem_RawRealloc(void *ctx, void *ptr, size_t size) +_PyMem_RawRealloc(void *Py_UNUSED(ctx), void *ptr, size_t size) { if (size == 0) size = 1; @@ -124,7 +124,7 @@ _PyMem_RawRealloc(void *ctx, void *ptr, size_t size) } static void -_PyMem_RawFree(void *ctx, void *ptr) +_PyMem_RawFree(void *Py_UNUSED(ctx), void *ptr) { free(ptr); } @@ -132,21 +132,22 @@ _PyMem_RawFree(void *ctx, void *ptr) #ifdef MS_WINDOWS static void * -_PyObject_ArenaVirtualAlloc(void *ctx, size_t size) +_PyObject_ArenaVirtualAlloc(void *Py_UNUSED(ctx), size_t size) { return VirtualAlloc(NULL, size, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); } static void -_PyObject_ArenaVirtualFree(void *ctx, void *ptr, size_t size) +_PyObject_ArenaVirtualFree(void *Py_UNUSED(ctx), void *ptr, + size_t Py_UNUSED(size)) { VirtualFree(ptr, 0, MEM_RELEASE); } #elif defined(ARENAS_USE_MMAP) static void * -_PyObject_ArenaMmap(void *ctx, size_t size) +_PyObject_ArenaMmap(void *Py_UNUSED(ctx), size_t size) { void *ptr; ptr = mmap(NULL, size, PROT_READ|PROT_WRITE, @@ -158,20 +159,20 @@ _PyObject_ArenaMmap(void *ctx, size_t size) } static void -_PyObject_ArenaMunmap(void *ctx, void *ptr, size_t size) +_PyObject_ArenaMunmap(void *Py_UNUSED(ctx), void *ptr, size_t size) { munmap(ptr, size); } #else static void * -_PyObject_ArenaMalloc(void *ctx, size_t size) +_PyObject_ArenaMalloc(void *Py_UNUSED(ctx), size_t size) { return malloc(size); } static void -_PyObject_ArenaFree(void *ctx, void *ptr, size_t size) +_PyObject_ArenaFree(void *Py_UNUSED(ctx), void *ptr, size_t Py_UNUSED(size)) { free(ptr); } @@ -1684,7 +1685,7 @@ new_arena(void) pymalloc. When the radix tree is used, 'poolp' is unused. */ static bool -address_in_range(void *p, poolp pool) +address_in_range(void *p, poolp Py_UNUSED(pool)) { return arena_map_is_used(p); } @@ -1945,7 +1946,7 @@ allocate_from_new_pool(uint size) or when the max memory limit has been reached. */ static inline void* -pymalloc_alloc(void *ctx, size_t nbytes) +pymalloc_alloc(void *Py_UNUSED(ctx), size_t nbytes) { #ifdef WITH_VALGRIND if (UNLIKELY(running_on_valgrind == -1)) { @@ -2215,7 +2216,7 @@ insert_to_freepool(poolp pool) Return 1 if it was freed. Return 0 if the block was not allocated by pymalloc_alloc(). */ static inline int -pymalloc_free(void *ctx, void *p) +pymalloc_free(void *Py_UNUSED(ctx), void *p) { assert(p != NULL); From webhook-mailer at python.org Wed May 25 08:21:54 2022 From: webhook-mailer at python.org (vstinner) Date: Wed, 25 May 2022 12:21:54 -0000 Subject: [Python-checkins] gh-93202: Always use %zd printf formatter (#93201) Message-ID: https://github.com/python/cpython/commit/71d8775feeb647ae5003cfd466de7b58cd1bf269 commit: 71d8775feeb647ae5003cfd466de7b58cd1bf269 branch: main author: Victor Stinner committer: vstinner date: 2022-05-25T14:21:36+02:00 summary: gh-93202: Always use %zd printf formatter (#93201) Python now always use the ``%zu`` and ``%zd`` printf formats to format a size_t or Py_ssize_t number. Building Python 3.12 requires a C11 compiler, so these printf formats are now always supported. * PyObject_Print() and _PyObject_Dump() now use the printf %zd format to display an object reference count. * Update PY_FORMAT_SIZE_T comment. * Remove outdated notes about the %zd format in PyBytes_FromFormat() and PyUnicode_FromFormat() documentations. * configure no longer checks for the %zd format and no longer defines PY_FORMAT_SIZE_T macro in pyconfig.h. * pymacconfig.h no longer undefines PY_FORMAT_SIZE_T: macOS 10.4 is no longer supported. Python 3.12 now requires macOS 10.6 (Snow Leopard) or newer. files: A Misc/NEWS.d/next/Build/2022-05-25-05-46-00.gh-issue-93202.T37jtj.rst M Doc/c-api/bytes.rst M Doc/c-api/unicode.rst M Include/pymacconfig.h M Include/pyport.h M Modules/_ctypes/_ctypes.c M Objects/object.c M configure M configure.ac M pyconfig.h.in diff --git a/Doc/c-api/bytes.rst b/Doc/c-api/bytes.rst index 7617487a462d3..d62962cab45f6 100644 --- a/Doc/c-api/bytes.rst +++ b/Doc/c-api/bytes.rst @@ -58,9 +58,6 @@ called with a non-bytes parameter. .. % XXX: This should be exactly the same as the table in PyErr_Format. .. % One should just refer to the other. - .. % XXX: The descriptions for %zd and %zu are wrong, but the truth is complicated - .. % because not all compilers support the %z width modifier -- we fake it - .. % when necessary via interpolating PY_FORMAT_SIZE_T. .. tabularcolumns:: |l|l|L| diff --git a/Doc/c-api/unicode.rst b/Doc/c-api/unicode.rst index abcf0cd6c8790..5d420bfa93cb2 100644 --- a/Doc/c-api/unicode.rst +++ b/Doc/c-api/unicode.rst @@ -397,10 +397,6 @@ APIs: ASCII-encoded string. The following format characters are allowed: .. % This should be exactly the same as the table in PyErr_Format. - .. % The descriptions for %zd and %zu are wrong, but the truth is complicated - .. % because not all compilers support the %z width modifier -- we fake it - .. % when necessary via interpolating PY_FORMAT_SIZE_T. - .. % Similar comments apply to the %ll width modifier and .. tabularcolumns:: |l|l|L| diff --git a/Include/pymacconfig.h b/Include/pymacconfig.h index 9dde11bd58e21..00459a03b980b 100644 --- a/Include/pymacconfig.h +++ b/Include/pymacconfig.h @@ -84,18 +84,6 @@ # define HAVE_GCC_ASM_FOR_X87 #endif - /* - * The definition in pyconfig.h is only valid on the OS release - * where configure ran on and not necessarily for all systems where - * the executable can be used on. - * - * Specifically: OSX 10.4 has limited supported for '%zd', while - * 10.5 has full support for '%zd'. A binary built on 10.5 won't - * work properly on 10.4 unless we suppress the definition - * of PY_FORMAT_SIZE_T - */ -#undef PY_FORMAT_SIZE_T - #endif /* defined(_APPLE__) */ diff --git a/Include/pyport.h b/Include/pyport.h index 086ed4204e4ff..8e6763789115e 100644 --- a/Include/pyport.h +++ b/Include/pyport.h @@ -186,32 +186,10 @@ typedef Py_ssize_t Py_ssize_clean_t; /* Largest possible value of size_t. */ #define PY_SIZE_MAX SIZE_MAX -/* Macro kept for backward compatibility: use "z" in new code. +/* Macro kept for backward compatibility: use directly "z" in new code. * - * PY_FORMAT_SIZE_T is a platform-specific modifier for use in a printf - * format to convert an argument with the width of a size_t or Py_ssize_t. - * C99 introduced "z" for this purpose, but old MSVCs had not supported it. - * Since MSVC supports "z" since (at least) 2015, we can just use "z" - * for new code. - * - * These "high level" Python format functions interpret "z" correctly on - * all platforms (Python interprets the format string itself, and does whatever - * the platform C requires to convert a size_t/Py_ssize_t argument): - * - * PyBytes_FromFormat - * PyErr_Format - * PyBytes_FromFormatV - * PyUnicode_FromFormatV - * - * Lower-level uses require that you interpolate the correct format modifier - * yourself (e.g., calling printf, fprintf, sprintf, PyOS_snprintf); for - * example, - * - * Py_ssize_t index; - * fprintf(stderr, "index %" PY_FORMAT_SIZE_T "d sucks\n", index); - * - * That will expand to %zd or to something else correct for a Py_ssize_t on - * the platform. + * PY_FORMAT_SIZE_T is a modifier for use in a printf format to convert an + * argument with the width of a size_t or Py_ssize_t: "z" (C99). */ #ifndef PY_FORMAT_SIZE_T # define PY_FORMAT_SIZE_T "z" diff --git a/Misc/NEWS.d/next/Build/2022-05-25-05-46-00.gh-issue-93202.T37jtj.rst b/Misc/NEWS.d/next/Build/2022-05-25-05-46-00.gh-issue-93202.T37jtj.rst new file mode 100644 index 0000000000000..6018e400c15d9 --- /dev/null +++ b/Misc/NEWS.d/next/Build/2022-05-25-05-46-00.gh-issue-93202.T37jtj.rst @@ -0,0 +1,4 @@ +Python now always use the ``%zu`` and ``%zd`` printf formats to format a +``size_t`` or ``Py_ssize_t`` number. Building Python 3.12 requires a C11 +compiler, so these printf formats are now always supported. Patch by Victor +Stinner. diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c index d6fa11d348130..2c629d76beb3b 100644 --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -396,9 +396,9 @@ _ctypes_alloc_format_string_with_shape(int ndim, const Py_ssize_t *shape, strcat(new_prefix, "("); for (k = 0; k < ndim; ++k) { if (k < ndim-1) { - sprintf(buf, "%"PY_FORMAT_SIZE_T"d,", shape[k]); + sprintf(buf, "%zd,", shape[k]); } else { - sprintf(buf, "%"PY_FORMAT_SIZE_T"d)", shape[k]); + sprintf(buf, "%zd)", shape[k]); } strcat(new_prefix, buf); } diff --git a/Objects/object.c b/Objects/object.c index 95045ed03d5db..49b1cba89b1d6 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -274,11 +274,8 @@ PyObject_Print(PyObject *op, FILE *fp, int flags) } else { if (Py_REFCNT(op) <= 0) { - /* XXX(twouters) cast refcount to long until %zd is - universally available */ Py_BEGIN_ALLOW_THREADS - fprintf(fp, "", - (long)Py_REFCNT(op), (void *)op); + fprintf(fp, "", Py_REFCNT(op), (void *)op); Py_END_ALLOW_THREADS } else { @@ -371,9 +368,7 @@ _PyObject_Dump(PyObject* op) /* first, write fields which are the least likely to crash */ fprintf(stderr, "object address : %p\n", (void *)op); - /* XXX(twouters) cast refcount to long until %zd is - universally available */ - fprintf(stderr, "object refcount : %ld\n", (long)Py_REFCNT(op)); + fprintf(stderr, "object refcount : %zd\n", Py_REFCNT(op)); fflush(stderr); PyTypeObject *type = Py_TYPE(op); diff --git a/configure b/configure index 6fa4051310b12..c72fc4afdb9e6 100755 --- a/configure +++ b/configure @@ -21150,72 +21150,6 @@ then LIBS="$LIBS -framework CoreFoundation" fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for %zd printf() format support" >&5 -$as_echo_n "checking for %zd printf() format support... " >&6; } -if ${ac_cv_have_size_t_format+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : - ac_cv_have_size_t_format="cross -- assuming yes" - -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -#include -#include -#include - -#ifdef HAVE_SYS_TYPES_H -#include -#endif - -#ifdef HAVE_SSIZE_T -typedef ssize_t Py_ssize_t; -#elif SIZEOF_VOID_P == SIZEOF_LONG -typedef long Py_ssize_t; -#else -typedef int Py_ssize_t; -#endif - -int main() -{ - char buffer[256]; - - if(sprintf(buffer, "%zd", (size_t)123) < 0) - return 1; - - if (strcmp(buffer, "123")) - return 1; - - if (sprintf(buffer, "%zd", (Py_ssize_t)-123) < 0) - return 1; - - if (strcmp(buffer, "-123")) - return 1; - - return 0; -} - -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - ac_cv_have_size_t_format=yes -else - ac_cv_have_size_t_format=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_size_t_format" >&5 -$as_echo "$ac_cv_have_size_t_format" >&6; } -if test "$ac_cv_have_size_t_format" != no ; then - -$as_echo "#define PY_FORMAT_SIZE_T \"z\"" >>confdefs.h - -fi - ac_fn_c_check_type "$LINENO" "socklen_t" "ac_cv_type_socklen_t" " #ifdef HAVE_SYS_TYPES_H #include diff --git a/configure.ac b/configure.ac index bef4904325b52..a8d499df2f16d 100644 --- a/configure.ac +++ b/configure.ac @@ -6004,52 +6004,6 @@ then LIBS="$LIBS -framework CoreFoundation" fi -AC_CACHE_CHECK([for %zd printf() format support], ac_cv_have_size_t_format, [dnl -AC_RUN_IFELSE([AC_LANG_SOURCE([[ -#include -#include -#include - -#ifdef HAVE_SYS_TYPES_H -#include -#endif - -#ifdef HAVE_SSIZE_T -typedef ssize_t Py_ssize_t; -#elif SIZEOF_VOID_P == SIZEOF_LONG -typedef long Py_ssize_t; -#else -typedef int Py_ssize_t; -#endif - -int main() -{ - char buffer[256]; - - if(sprintf(buffer, "%zd", (size_t)123) < 0) - return 1; - - if (strcmp(buffer, "123")) - return 1; - - if (sprintf(buffer, "%zd", (Py_ssize_t)-123) < 0) - return 1; - - if (strcmp(buffer, "-123")) - return 1; - - return 0; -} -]])], - [ac_cv_have_size_t_format=yes], - [ac_cv_have_size_t_format=no], - [ac_cv_have_size_t_format="cross -- assuming yes" -])]) -if test "$ac_cv_have_size_t_format" != no ; then - AC_DEFINE(PY_FORMAT_SIZE_T, "z", - [Define to printf format modifier for Py_ssize_t]) -fi - AC_CHECK_TYPE(socklen_t,, AC_DEFINE(socklen_t,int, [Define to `int' if does not define.]),[ diff --git a/pyconfig.h.in b/pyconfig.h.in index 383fd47dd43c8..b244ed233d63a 100644 --- a/pyconfig.h.in +++ b/pyconfig.h.in @@ -1506,9 +1506,6 @@ /* Define if you want to coerce the C locale to a UTF-8 based locale */ #undef PY_COERCE_C_LOCALE -/* Define to printf format modifier for Py_ssize_t */ -#undef PY_FORMAT_SIZE_T - /* Define to 1 to build the sqlite module with loadable extensions support. */ #undef PY_SQLITE_ENABLE_LOAD_EXTENSION From webhook-mailer at python.org Wed May 25 08:53:35 2022 From: webhook-mailer at python.org (erlend-aasland) Date: Wed, 25 May 2022 12:53:35 -0000 Subject: [Python-checkins] gh-93117: Remove too large sqlite3 bigmemtest (#93154) Message-ID: https://github.com/python/cpython/commit/db3ef0c82a1a16db60c35f8a08c3fd9bfaa8b643 commit: db3ef0c82a1a16db60c35f8a08c3fd9bfaa8b643 branch: main author: Erlend Egeberg Aasland committer: erlend-aasland date: 2022-05-25T14:53:26+02:00 summary: gh-93117: Remove too large sqlite3 bigmemtest (#93154) files: M Lib/test/test_sqlite3/test_dbapi.py diff --git a/Lib/test/test_sqlite3/test_dbapi.py b/Lib/test/test_sqlite3/test_dbapi.py index 840a401b6b3ee..1fa02db3b3af4 100644 --- a/Lib/test/test_sqlite3/test_dbapi.py +++ b/Lib/test/test_sqlite3/test_dbapi.py @@ -29,7 +29,7 @@ import unittest import urllib.parse -from test.support import SHORT_TIMEOUT, bigmemtest, check_disallow_instantiation +from test.support import SHORT_TIMEOUT, check_disallow_instantiation from test.support import threading_helper from _testcapi import INT_MAX, ULLONG_MAX from os import SEEK_SET, SEEK_CUR, SEEK_END @@ -626,13 +626,6 @@ def test_deserialize_corrupt_database(self): # deserialized database. cx.execute("create table fail(f)") - @unittest.skipUnless(sys.maxsize > 2**32, 'requires 64bit platform') - @bigmemtest(size=2**63, memuse=3, dry_run=False) - def test_deserialize_too_much_data_64bit(self): - with memory_database() as cx: - with self.assertRaisesRegex(OverflowError, "'data' is too large"): - cx.deserialize(b"b" * size) - class OpenTests(unittest.TestCase): _sql = "create table test(id integer)" From webhook-mailer at python.org Wed May 25 09:06:24 2022 From: webhook-mailer at python.org (markshannon) Date: Wed, 25 May 2022 13:06:24 -0000 Subject: [Python-checkins] gh-92777: Add LOAD_METHOD_LAZY_DICT (GH-92778) Message-ID: https://github.com/python/cpython/commit/5e6e5b98a8b943a8e05feb9c0c982150565f4c10 commit: 5e6e5b98a8b943a8e05feb9c0c982150565f4c10 branch: main author: Ken Jin committer: markshannon date: 2022-05-25T14:06:15+01:00 summary: gh-92777: Add LOAD_METHOD_LAZY_DICT (GH-92778) files: A Misc/NEWS.d/next/Core and Builtins/2022-05-13-12-36-10.gh-issue-92777.Odo4vP.rst M Include/internal/pycore_opcode.h M Include/opcode.h M Lib/opcode.py M Python/ceval.c M Python/opcode_targets.h M Python/specialize.c diff --git a/Include/internal/pycore_opcode.h b/Include/internal/pycore_opcode.h index 79926b62a365f..c693fe3c5eca6 100644 --- a/Include/internal/pycore_opcode.h +++ b/Include/internal/pycore_opcode.h @@ -167,6 +167,7 @@ const uint8_t _PyOpcode_Deopt[256] = { [LOAD_METHOD] = LOAD_METHOD, [LOAD_METHOD_ADAPTIVE] = LOAD_METHOD, [LOAD_METHOD_CLASS] = LOAD_METHOD, + [LOAD_METHOD_LAZY_DICT] = LOAD_METHOD, [LOAD_METHOD_MODULE] = LOAD_METHOD, [LOAD_METHOD_NO_DICT] = LOAD_METHOD, [LOAD_METHOD_WITH_DICT] = LOAD_METHOD, @@ -348,6 +349,7 @@ const uint8_t _PyOpcode_Original[256] = { [LOAD_METHOD] = LOAD_METHOD, [LOAD_METHOD_ADAPTIVE] = LOAD_METHOD, [LOAD_METHOD_CLASS] = LOAD_METHOD, + [LOAD_METHOD_LAZY_DICT] = LOAD_METHOD, [LOAD_METHOD_MODULE] = LOAD_METHOD, [LOAD_METHOD_NO_DICT] = LOAD_METHOD, [LOAD_METHOD_WITH_DICT] = LOAD_METHOD, @@ -499,12 +501,12 @@ static const char *const _PyOpcode_OpName[256] = { [LOAD_GLOBAL_MODULE] = "LOAD_GLOBAL_MODULE", [LOAD_METHOD_ADAPTIVE] = "LOAD_METHOD_ADAPTIVE", [LOAD_METHOD_CLASS] = "LOAD_METHOD_CLASS", - [LOAD_METHOD_MODULE] = "LOAD_METHOD_MODULE", + [LOAD_METHOD_LAZY_DICT] = "LOAD_METHOD_LAZY_DICT", [LIST_TO_TUPLE] = "LIST_TO_TUPLE", [RETURN_VALUE] = "RETURN_VALUE", [IMPORT_STAR] = "IMPORT_STAR", [SETUP_ANNOTATIONS] = "SETUP_ANNOTATIONS", - [LOAD_METHOD_NO_DICT] = "LOAD_METHOD_NO_DICT", + [LOAD_METHOD_MODULE] = "LOAD_METHOD_MODULE", [ASYNC_GEN_WRAP] = "ASYNC_GEN_WRAP", [PREP_RERAISE_STAR] = "PREP_RERAISE_STAR", [POP_EXCEPT] = "POP_EXCEPT", @@ -531,7 +533,7 @@ static const char *const _PyOpcode_OpName[256] = { [JUMP_FORWARD] = "JUMP_FORWARD", [JUMP_IF_FALSE_OR_POP] = "JUMP_IF_FALSE_OR_POP", [JUMP_IF_TRUE_OR_POP] = "JUMP_IF_TRUE_OR_POP", - [LOAD_METHOD_WITH_DICT] = "LOAD_METHOD_WITH_DICT", + [LOAD_METHOD_NO_DICT] = "LOAD_METHOD_NO_DICT", [POP_JUMP_FORWARD_IF_FALSE] = "POP_JUMP_FORWARD_IF_FALSE", [POP_JUMP_FORWARD_IF_TRUE] = "POP_JUMP_FORWARD_IF_TRUE", [LOAD_GLOBAL] = "LOAD_GLOBAL", @@ -539,13 +541,13 @@ static const char *const _PyOpcode_OpName[256] = { [CONTAINS_OP] = "CONTAINS_OP", [RERAISE] = "RERAISE", [COPY] = "COPY", - [LOAD_METHOD_WITH_VALUES] = "LOAD_METHOD_WITH_VALUES", + [LOAD_METHOD_WITH_DICT] = "LOAD_METHOD_WITH_DICT", [BINARY_OP] = "BINARY_OP", [SEND] = "SEND", [LOAD_FAST] = "LOAD_FAST", [STORE_FAST] = "STORE_FAST", [DELETE_FAST] = "DELETE_FAST", - [RESUME_QUICK] = "RESUME_QUICK", + [LOAD_METHOD_WITH_VALUES] = "LOAD_METHOD_WITH_VALUES", [POP_JUMP_FORWARD_IF_NOT_NONE] = "POP_JUMP_FORWARD_IF_NOT_NONE", [POP_JUMP_FORWARD_IF_NONE] = "POP_JUMP_FORWARD_IF_NONE", [RAISE_VARARGS] = "RAISE_VARARGS", @@ -559,9 +561,9 @@ static const char *const _PyOpcode_OpName[256] = { [STORE_DEREF] = "STORE_DEREF", [DELETE_DEREF] = "DELETE_DEREF", [JUMP_BACKWARD] = "JUMP_BACKWARD", - [STORE_ATTR_ADAPTIVE] = "STORE_ATTR_ADAPTIVE", + [RESUME_QUICK] = "RESUME_QUICK", [CALL_FUNCTION_EX] = "CALL_FUNCTION_EX", - [STORE_ATTR_INSTANCE_VALUE] = "STORE_ATTR_INSTANCE_VALUE", + [STORE_ATTR_ADAPTIVE] = "STORE_ATTR_ADAPTIVE", [EXTENDED_ARG] = "EXTENDED_ARG", [LIST_APPEND] = "LIST_APPEND", [SET_ADD] = "SET_ADD", @@ -571,32 +573,32 @@ static const char *const _PyOpcode_OpName[256] = { [YIELD_VALUE] = "YIELD_VALUE", [RESUME] = "RESUME", [MATCH_CLASS] = "MATCH_CLASS", + [STORE_ATTR_INSTANCE_VALUE] = "STORE_ATTR_INSTANCE_VALUE", [STORE_ATTR_SLOT] = "STORE_ATTR_SLOT", - [STORE_ATTR_WITH_HINT] = "STORE_ATTR_WITH_HINT", [FORMAT_VALUE] = "FORMAT_VALUE", [BUILD_CONST_KEY_MAP] = "BUILD_CONST_KEY_MAP", [BUILD_STRING] = "BUILD_STRING", + [STORE_ATTR_WITH_HINT] = "STORE_ATTR_WITH_HINT", [STORE_FAST__LOAD_FAST] = "STORE_FAST__LOAD_FAST", - [STORE_FAST__STORE_FAST] = "STORE_FAST__STORE_FAST", [LOAD_METHOD] = "LOAD_METHOD", - [STORE_SUBSCR_ADAPTIVE] = "STORE_SUBSCR_ADAPTIVE", + [STORE_FAST__STORE_FAST] = "STORE_FAST__STORE_FAST", [LIST_EXTEND] = "LIST_EXTEND", [SET_UPDATE] = "SET_UPDATE", [DICT_MERGE] = "DICT_MERGE", [DICT_UPDATE] = "DICT_UPDATE", + [STORE_SUBSCR_ADAPTIVE] = "STORE_SUBSCR_ADAPTIVE", [STORE_SUBSCR_DICT] = "STORE_SUBSCR_DICT", [STORE_SUBSCR_LIST_INT] = "STORE_SUBSCR_LIST_INT", [UNPACK_SEQUENCE_ADAPTIVE] = "UNPACK_SEQUENCE_ADAPTIVE", [UNPACK_SEQUENCE_LIST] = "UNPACK_SEQUENCE_LIST", - [UNPACK_SEQUENCE_TUPLE] = "UNPACK_SEQUENCE_TUPLE", [CALL] = "CALL", [KW_NAMES] = "KW_NAMES", [POP_JUMP_BACKWARD_IF_NOT_NONE] = "POP_JUMP_BACKWARD_IF_NOT_NONE", [POP_JUMP_BACKWARD_IF_NONE] = "POP_JUMP_BACKWARD_IF_NONE", [POP_JUMP_BACKWARD_IF_FALSE] = "POP_JUMP_BACKWARD_IF_FALSE", [POP_JUMP_BACKWARD_IF_TRUE] = "POP_JUMP_BACKWARD_IF_TRUE", + [UNPACK_SEQUENCE_TUPLE] = "UNPACK_SEQUENCE_TUPLE", [UNPACK_SEQUENCE_TWO_TUPLE] = "UNPACK_SEQUENCE_TWO_TUPLE", - [178] = "<178>", [179] = "<179>", [180] = "<180>", [181] = "<181>", @@ -678,7 +680,6 @@ static const char *const _PyOpcode_OpName[256] = { #endif #define EXTRA_CASES \ - case 178: \ case 179: \ case 180: \ case 181: \ diff --git a/Include/opcode.h b/Include/opcode.h index e04b5a6bfa7d4..f76ca946be3ad 100644 --- a/Include/opcode.h +++ b/Include/opcode.h @@ -169,24 +169,25 @@ extern "C" { #define LOAD_GLOBAL_MODULE 78 #define LOAD_METHOD_ADAPTIVE 79 #define LOAD_METHOD_CLASS 80 -#define LOAD_METHOD_MODULE 81 -#define LOAD_METHOD_NO_DICT 86 -#define LOAD_METHOD_WITH_DICT 113 -#define LOAD_METHOD_WITH_VALUES 121 -#define RESUME_QUICK 127 -#define STORE_ATTR_ADAPTIVE 141 -#define STORE_ATTR_INSTANCE_VALUE 143 -#define STORE_ATTR_SLOT 153 -#define STORE_ATTR_WITH_HINT 154 -#define STORE_FAST__LOAD_FAST 158 -#define STORE_FAST__STORE_FAST 159 -#define STORE_SUBSCR_ADAPTIVE 161 -#define STORE_SUBSCR_DICT 166 -#define STORE_SUBSCR_LIST_INT 167 -#define UNPACK_SEQUENCE_ADAPTIVE 168 -#define UNPACK_SEQUENCE_LIST 169 -#define UNPACK_SEQUENCE_TUPLE 170 -#define UNPACK_SEQUENCE_TWO_TUPLE 177 +#define LOAD_METHOD_LAZY_DICT 81 +#define LOAD_METHOD_MODULE 86 +#define LOAD_METHOD_NO_DICT 113 +#define LOAD_METHOD_WITH_DICT 121 +#define LOAD_METHOD_WITH_VALUES 127 +#define RESUME_QUICK 141 +#define STORE_ATTR_ADAPTIVE 143 +#define STORE_ATTR_INSTANCE_VALUE 153 +#define STORE_ATTR_SLOT 154 +#define STORE_ATTR_WITH_HINT 158 +#define STORE_FAST__LOAD_FAST 159 +#define STORE_FAST__STORE_FAST 161 +#define STORE_SUBSCR_ADAPTIVE 166 +#define STORE_SUBSCR_DICT 167 +#define STORE_SUBSCR_LIST_INT 168 +#define UNPACK_SEQUENCE_ADAPTIVE 169 +#define UNPACK_SEQUENCE_LIST 170 +#define UNPACK_SEQUENCE_TUPLE 177 +#define UNPACK_SEQUENCE_TWO_TUPLE 178 #define DO_TRACING 255 #define HAS_CONST(op) (false\ diff --git a/Lib/opcode.py b/Lib/opcode.py index 410853a25cfec..573e461666d4d 100644 --- a/Lib/opcode.py +++ b/Lib/opcode.py @@ -303,6 +303,7 @@ def jabs_op(name, op): "LOAD_METHOD": [ "LOAD_METHOD_ADAPTIVE", "LOAD_METHOD_CLASS", + "LOAD_METHOD_LAZY_DICT", "LOAD_METHOD_MODULE", "LOAD_METHOD_NO_DICT", "LOAD_METHOD_WITH_DICT", diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-13-12-36-10.gh-issue-92777.Odo4vP.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-13-12-36-10.gh-issue-92777.Odo4vP.rst new file mode 100644 index 0000000000000..19416590a8e9a --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-05-13-12-36-10.gh-issue-92777.Odo4vP.rst @@ -0,0 +1 @@ +Specialize ``LOAD_METHOD`` for objects with lazy dictionaries. Patch by Ken Jin. diff --git a/Python/ceval.c b/Python/ceval.c index e82f734302216..56b1017fd9298 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -4673,6 +4673,29 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int NOTRACE_DISPATCH(); } + TARGET(LOAD_METHOD_LAZY_DICT) { + assert(cframe.use_tracing == 0); + PyObject *self = TOP(); + PyTypeObject *self_cls = Py_TYPE(self); + _PyLoadMethodCache *cache = (_PyLoadMethodCache *)next_instr; + uint32_t type_version = read_u32(cache->type_version); + DEOPT_IF(self_cls->tp_version_tag != type_version, LOAD_METHOD); + int dictoffset = cache->dict_offset; + PyObject *dict = *(PyObject **)((char *)self + dictoffset); + assert(dictoffset == self_cls->tp_dictoffset && dictoffset > 0); + /* This object has a __dict__, just not yet created */ + DEOPT_IF(dict != NULL, LOAD_METHOD); + STAT_INC(LOAD_METHOD, hit); + PyObject *res = read_obj(cache->descr); + assert(res != NULL); + assert(_PyType_HasFeature(Py_TYPE(res), Py_TPFLAGS_METHOD_DESCRIPTOR)); + Py_INCREF(res); + SET_TOP(res); + PUSH(self); + JUMPBY(INLINE_CACHE_ENTRIES_LOAD_METHOD); + NOTRACE_DISPATCH(); + } + TARGET(LOAD_METHOD_MODULE) { /* LOAD_METHOD, for module methods */ assert(cframe.use_tracing == 0); diff --git a/Python/opcode_targets.h b/Python/opcode_targets.h index 0d8faf223112b..71b7a76a01aa8 100644 --- a/Python/opcode_targets.h +++ b/Python/opcode_targets.h @@ -80,12 +80,12 @@ static void *opcode_targets[256] = { &&TARGET_LOAD_GLOBAL_MODULE, &&TARGET_LOAD_METHOD_ADAPTIVE, &&TARGET_LOAD_METHOD_CLASS, - &&TARGET_LOAD_METHOD_MODULE, + &&TARGET_LOAD_METHOD_LAZY_DICT, &&TARGET_LIST_TO_TUPLE, &&TARGET_RETURN_VALUE, &&TARGET_IMPORT_STAR, &&TARGET_SETUP_ANNOTATIONS, - &&TARGET_LOAD_METHOD_NO_DICT, + &&TARGET_LOAD_METHOD_MODULE, &&TARGET_ASYNC_GEN_WRAP, &&TARGET_PREP_RERAISE_STAR, &&TARGET_POP_EXCEPT, @@ -112,7 +112,7 @@ static void *opcode_targets[256] = { &&TARGET_JUMP_FORWARD, &&TARGET_JUMP_IF_FALSE_OR_POP, &&TARGET_JUMP_IF_TRUE_OR_POP, - &&TARGET_LOAD_METHOD_WITH_DICT, + &&TARGET_LOAD_METHOD_NO_DICT, &&TARGET_POP_JUMP_FORWARD_IF_FALSE, &&TARGET_POP_JUMP_FORWARD_IF_TRUE, &&TARGET_LOAD_GLOBAL, @@ -120,13 +120,13 @@ static void *opcode_targets[256] = { &&TARGET_CONTAINS_OP, &&TARGET_RERAISE, &&TARGET_COPY, - &&TARGET_LOAD_METHOD_WITH_VALUES, + &&TARGET_LOAD_METHOD_WITH_DICT, &&TARGET_BINARY_OP, &&TARGET_SEND, &&TARGET_LOAD_FAST, &&TARGET_STORE_FAST, &&TARGET_DELETE_FAST, - &&TARGET_RESUME_QUICK, + &&TARGET_LOAD_METHOD_WITH_VALUES, &&TARGET_POP_JUMP_FORWARD_IF_NOT_NONE, &&TARGET_POP_JUMP_FORWARD_IF_NONE, &&TARGET_RAISE_VARARGS, @@ -140,9 +140,9 @@ static void *opcode_targets[256] = { &&TARGET_STORE_DEREF, &&TARGET_DELETE_DEREF, &&TARGET_JUMP_BACKWARD, - &&TARGET_STORE_ATTR_ADAPTIVE, + &&TARGET_RESUME_QUICK, &&TARGET_CALL_FUNCTION_EX, - &&TARGET_STORE_ATTR_INSTANCE_VALUE, + &&TARGET_STORE_ATTR_ADAPTIVE, &&TARGET_EXTENDED_ARG, &&TARGET_LIST_APPEND, &&TARGET_SET_ADD, @@ -152,30 +152,31 @@ static void *opcode_targets[256] = { &&TARGET_YIELD_VALUE, &&TARGET_RESUME, &&TARGET_MATCH_CLASS, + &&TARGET_STORE_ATTR_INSTANCE_VALUE, &&TARGET_STORE_ATTR_SLOT, - &&TARGET_STORE_ATTR_WITH_HINT, &&TARGET_FORMAT_VALUE, &&TARGET_BUILD_CONST_KEY_MAP, &&TARGET_BUILD_STRING, + &&TARGET_STORE_ATTR_WITH_HINT, &&TARGET_STORE_FAST__LOAD_FAST, - &&TARGET_STORE_FAST__STORE_FAST, &&TARGET_LOAD_METHOD, - &&TARGET_STORE_SUBSCR_ADAPTIVE, + &&TARGET_STORE_FAST__STORE_FAST, &&TARGET_LIST_EXTEND, &&TARGET_SET_UPDATE, &&TARGET_DICT_MERGE, &&TARGET_DICT_UPDATE, + &&TARGET_STORE_SUBSCR_ADAPTIVE, &&TARGET_STORE_SUBSCR_DICT, &&TARGET_STORE_SUBSCR_LIST_INT, &&TARGET_UNPACK_SEQUENCE_ADAPTIVE, &&TARGET_UNPACK_SEQUENCE_LIST, - &&TARGET_UNPACK_SEQUENCE_TUPLE, &&TARGET_CALL, &&TARGET_KW_NAMES, &&TARGET_POP_JUMP_BACKWARD_IF_NOT_NONE, &&TARGET_POP_JUMP_BACKWARD_IF_NONE, &&TARGET_POP_JUMP_BACKWARD_IF_FALSE, &&TARGET_POP_JUMP_BACKWARD_IF_TRUE, + &&TARGET_UNPACK_SEQUENCE_TUPLE, &&TARGET_UNPACK_SEQUENCE_TWO_TUPLE, &&_unknown_opcode, &&_unknown_opcode, @@ -253,6 +254,5 @@ static void *opcode_targets[256] = { &&_unknown_opcode, &&_unknown_opcode, &&_unknown_opcode, - &&_unknown_opcode, &&TARGET_DO_TRACING }; diff --git a/Python/specialize.c b/Python/specialize.c index 9579369a599d9..7148b5dd02960 100644 --- a/Python/specialize.c +++ b/Python/specialize.c @@ -903,7 +903,8 @@ typedef enum { MANAGED_VALUES = 1, MANAGED_DICT = 2, OFFSET_DICT = 3, - NO_DICT = 4 + NO_DICT = 4, + LAZY_DICT = 5, } ObjectDictKind; // Please collect stats carefully before and after modifying. A subtle change @@ -972,14 +973,17 @@ _Py_Specialize_LoadMethod(PyObject *owner, _Py_CODEUNIT *instr, PyObject *name) else { PyObject *dict = *(PyObject **) ((char *)owner + dictoffset); if (dict == NULL) { - SPECIALIZATION_FAIL(LOAD_METHOD, SPEC_FAIL_NO_DICT); - goto fail; + // This object will have a dict if user access __dict__ + dictkind = LAZY_DICT; + keys = NULL; + } + else { + keys = ((PyDictObject *)dict)->ma_keys; + dictkind = OFFSET_DICT; } - keys = ((PyDictObject *)dict)->ma_keys; - dictkind = OFFSET_DICT; } } - if (dictkind != NO_DICT) { + if (dictkind == MANAGED_VALUES || dictkind == MANAGED_DICT || dictkind == OFFSET_DICT) { Py_ssize_t index = _PyDictKeys_StringLookup(keys, name); if (index != DKIX_EMPTY) { SPECIALIZATION_FAIL(LOAD_METHOD, SPEC_FAIL_LOAD_METHOD_IS_ATTR); @@ -1008,6 +1012,11 @@ _Py_Specialize_LoadMethod(PyObject *owner, _Py_CODEUNIT *instr, PyObject *name) cache->dict_offset = (uint16_t)owner_cls->tp_dictoffset; _Py_SET_OPCODE(*instr, LOAD_METHOD_WITH_DICT); break; + case LAZY_DICT: + assert(owner_cls->tp_dictoffset > 0 && owner_cls->tp_dictoffset <= INT16_MAX); + cache->dict_offset = (uint16_t)owner_cls->tp_dictoffset; + _Py_SET_OPCODE(*instr, LOAD_METHOD_LAZY_DICT); + break; } /* `descr` is borrowed. This is safe for methods (even inherited ones from * super classes!) as long as tp_version_tag is validated for two main reasons: From webhook-mailer at python.org Wed May 25 09:57:34 2022 From: webhook-mailer at python.org (tiran) Date: Wed, 25 May 2022 13:57:34 -0000 Subject: [Python-checkins] gh-90473: Misc test fixes for WASI (GH-93218) Message-ID: https://github.com/python/cpython/commit/1f134e96ba994bea3aaea533d4a558df3c5cc3c0 commit: 1f134e96ba994bea3aaea533d4a558df3c5cc3c0 branch: main author: Christian Heimes committer: tiran date: 2022-05-25T15:57:26+02:00 summary: gh-90473: Misc test fixes for WASI (GH-93218) * ``sys.executable`` is not set * WASI does not support subprocess * ``pwd`` module is not available * WASI checks ``open`` syscall flags more strict, needs r, w, rw flag. * ``umask`` is not available * ``/dev/null`` may not be accessible files: M Lib/distutils/tests/test_build.py M Lib/lib2to3/tests/test_parser.py M Lib/test/test_netrc.py M Lib/test/test_os.py M Lib/test/test_pathlib.py M Lib/test/test_tarfile.py M Lib/test/test_unicode_file.py M Tools/wasm/README.md diff --git a/Lib/distutils/tests/test_build.py b/Lib/distutils/tests/test_build.py index 83a9e4f4dd2f4..71b5e164bae14 100644 --- a/Lib/distutils/tests/test_build.py +++ b/Lib/distutils/tests/test_build.py @@ -12,6 +12,7 @@ class BuildTestCase(support.TempdirManager, support.LoggingSilencer, unittest.TestCase): + @unittest.skipUnless(sys.executable, "test requires sys.executable") def test_finalize_options(self): pkg_dir, dist = self.create_dist() cmd = build(dist) diff --git a/Lib/lib2to3/tests/test_parser.py b/Lib/lib2to3/tests/test_parser.py index e2dddbec577c0..8e7773bcae13e 100644 --- a/Lib/lib2to3/tests/test_parser.py +++ b/Lib/lib2to3/tests/test_parser.py @@ -63,7 +63,7 @@ def test_load_grammar_from_pickle(self): @unittest.skipIf(sys.executable is None, 'sys.executable required') @unittest.skipIf( - sys.platform == 'emscripten', 'requires working subprocess' + sys.platform in {'emscripten', 'wasi'}, 'requires working subprocess' ) def test_load_grammar_from_subprocess(self): tmpdir = tempfile.mkdtemp() diff --git a/Lib/test/test_netrc.py b/Lib/test/test_netrc.py index 3cca1e8ff1ac1..05a23e5e8a3ce 100644 --- a/Lib/test/test_netrc.py +++ b/Lib/test/test_netrc.py @@ -1,6 +1,11 @@ import netrc, os, unittest, sys, textwrap from test.support import os_helper, run_unittest +try: + import pwd +except ImportError: + pwd = None + temp_filename = os_helper.TESTFN class NetrcTestCase(unittest.TestCase): @@ -266,6 +271,7 @@ def test_comment_at_end_of_machine_line_pass_has_hash(self): @unittest.skipUnless(os.name == 'posix', 'POSIX only test') + @unittest.skipIf(pwd is None, 'security check requires pwd module') def test_security(self): # This test is incomplete since we are normally not run as root and # therefore can't test the file ownership being wrong. diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py index ae071821e1ccf..009bb5aec35a4 100644 --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -1765,6 +1765,7 @@ def test_remove_nothing(self): self.assertTrue(os.path.exists(os_helper.TESTFN)) + at unittest.skipIf(support.is_wasi, "WASI has no /dev/null") class DevNullTests(unittest.TestCase): def test_devnull(self): with open(os.devnull, 'wb', 0) as f: @@ -2111,6 +2112,7 @@ def test_chmod(self): self.assertRaises(OSError, os.chmod, os_helper.TESTFN, 0) + at unittest.skipIf(support.is_wasi, "Cannot create invalid FD on WASI.") class TestInvalidFD(unittest.TestCase): singles = ["fchdir", "dup", "fdatasync", "fstat", "fstatvfs", "fsync", "tcgetpgrp", "ttyname"] diff --git a/Lib/test/test_pathlib.py b/Lib/test/test_pathlib.py index 964cc85d53153..642dfebdcd1cb 100644 --- a/Lib/test/test_pathlib.py +++ b/Lib/test/test_pathlib.py @@ -13,7 +13,7 @@ from unittest import mock from test.support import import_helper -from test.support import is_emscripten +from test.support import is_emscripten, is_wasi from test.support import os_helper from test.support.os_helper import TESTFN, FakePath @@ -1530,6 +1530,7 @@ def test_empty_path(self): p = self.cls('') self.assertEqual(p.stat(), os.stat('.')) + @unittest.skipIf(is_wasi, "WASI has no user accounts.") def test_expanduser_common(self): P = self.cls p = P('~') @@ -2508,7 +2509,8 @@ def _check_symlink_loop(self, *args, strict=True): print(path.resolve(strict)) @unittest.skipIf( - is_emscripten, "umask is not implemented on Emscripten." + is_emscripten or is_wasi, + "umask is not implemented on Emscripten/WASI." ) def test_open_mode(self): old_mask = os.umask(0) @@ -2534,7 +2536,8 @@ def test_resolve_root(self): os.chdir(current_directory) @unittest.skipIf( - is_emscripten, "umask is not implemented on Emscripten." + is_emscripten or is_wasi, + "umask is not implemented on Emscripten/WASI." ) def test_touch_mode(self): old_mask = os.umask(0) diff --git a/Lib/test/test_tarfile.py b/Lib/test/test_tarfile.py index 12850cd635e99..a364043d3d9dd 100644 --- a/Lib/test/test_tarfile.py +++ b/Lib/test/test_tarfile.py @@ -1498,7 +1498,10 @@ def test_stream_padding(self): @unittest.skipUnless(sys.platform != "win32" and hasattr(os, "umask"), "Missing umask implementation") - @unittest.skipIf(support.is_emscripten, "Emscripten's umask is a stub.") + @unittest.skipIf( + support.is_emscripten or support.is_wasi, + "Emscripten's/WASI's umask is a stub." + ) def test_file_mode(self): # Test for issue #8464: Create files with correct # permissions. diff --git a/Lib/test/test_unicode_file.py b/Lib/test/test_unicode_file.py index 80c22c6cdd1da..fe25bfe9f88d1 100644 --- a/Lib/test/test_unicode_file.py +++ b/Lib/test/test_unicode_file.py @@ -110,7 +110,7 @@ def _test_single(self, filename): os.unlink(filename) self.assertTrue(not os.path.exists(filename)) # and again with os.open. - f = os.open(filename, os.O_CREAT) + f = os.open(filename, os.O_CREAT | os.O_WRONLY) os.close(f) try: self._do_single(filename) diff --git a/Tools/wasm/README.md b/Tools/wasm/README.md index 9e253bc878bd9..239eb90d0743c 100644 --- a/Tools/wasm/README.md +++ b/Tools/wasm/README.md @@ -239,7 +239,11 @@ are: yet. A future version of WASI may provide a limited ``set_permissions`` API. - File locking (``fcntl``) is not available. - ``os.pipe()``, ``os.mkfifo()``, and ``os.mknod()`` are not supported. -- ``process_time`` clock does not work. +- ``process_time`` does not work as expected because it's implemented using + wall clock. +- ``os.umask`` is a stub. +- ``sys.executable`` is empty. +- ``/dev/null`` / ``os.devnull`` may not be available. # Detect WebAssembly builds From webhook-mailer at python.org Wed May 25 10:24:54 2022 From: webhook-mailer at python.org (miss-islington) Date: Wed, 25 May 2022 14:24:54 -0000 Subject: [Python-checkins] gh-90473: Misc test fixes for WASI (GH-93218) Message-ID: https://github.com/python/cpython/commit/0fb70ce19197e97b6254ecd2c12f6e8c5b07ef5b commit: 0fb70ce19197e97b6254ecd2c12f6e8c5b07ef5b branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-25T07:24:32-07:00 summary: gh-90473: Misc test fixes for WASI (GH-93218) * ``sys.executable`` is not set * WASI does not support subprocess * ``pwd`` module is not available * WASI checks ``open`` syscall flags more strict, needs r, w, rw flag. * ``umask`` is not available * ``/dev/null`` may not be accessible (cherry picked from commit 1f134e96ba994bea3aaea533d4a558df3c5cc3c0) Co-authored-by: Christian Heimes files: M Lib/distutils/tests/test_build.py M Lib/lib2to3/tests/test_parser.py M Lib/test/test_netrc.py M Lib/test/test_os.py M Lib/test/test_pathlib.py M Lib/test/test_tarfile.py M Lib/test/test_unicode_file.py M Tools/wasm/README.md diff --git a/Lib/distutils/tests/test_build.py b/Lib/distutils/tests/test_build.py index 83a9e4f4dd2f4..71b5e164bae14 100644 --- a/Lib/distutils/tests/test_build.py +++ b/Lib/distutils/tests/test_build.py @@ -12,6 +12,7 @@ class BuildTestCase(support.TempdirManager, support.LoggingSilencer, unittest.TestCase): + @unittest.skipUnless(sys.executable, "test requires sys.executable") def test_finalize_options(self): pkg_dir, dist = self.create_dist() cmd = build(dist) diff --git a/Lib/lib2to3/tests/test_parser.py b/Lib/lib2to3/tests/test_parser.py index e2dddbec577c0..8e7773bcae13e 100644 --- a/Lib/lib2to3/tests/test_parser.py +++ b/Lib/lib2to3/tests/test_parser.py @@ -63,7 +63,7 @@ def test_load_grammar_from_pickle(self): @unittest.skipIf(sys.executable is None, 'sys.executable required') @unittest.skipIf( - sys.platform == 'emscripten', 'requires working subprocess' + sys.platform in {'emscripten', 'wasi'}, 'requires working subprocess' ) def test_load_grammar_from_subprocess(self): tmpdir = tempfile.mkdtemp() diff --git a/Lib/test/test_netrc.py b/Lib/test/test_netrc.py index 3cca1e8ff1ac1..05a23e5e8a3ce 100644 --- a/Lib/test/test_netrc.py +++ b/Lib/test/test_netrc.py @@ -1,6 +1,11 @@ import netrc, os, unittest, sys, textwrap from test.support import os_helper, run_unittest +try: + import pwd +except ImportError: + pwd = None + temp_filename = os_helper.TESTFN class NetrcTestCase(unittest.TestCase): @@ -266,6 +271,7 @@ def test_comment_at_end_of_machine_line_pass_has_hash(self): @unittest.skipUnless(os.name == 'posix', 'POSIX only test') + @unittest.skipIf(pwd is None, 'security check requires pwd module') def test_security(self): # This test is incomplete since we are normally not run as root and # therefore can't test the file ownership being wrong. diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py index ae071821e1ccf..009bb5aec35a4 100644 --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -1765,6 +1765,7 @@ def test_remove_nothing(self): self.assertTrue(os.path.exists(os_helper.TESTFN)) + at unittest.skipIf(support.is_wasi, "WASI has no /dev/null") class DevNullTests(unittest.TestCase): def test_devnull(self): with open(os.devnull, 'wb', 0) as f: @@ -2111,6 +2112,7 @@ def test_chmod(self): self.assertRaises(OSError, os.chmod, os_helper.TESTFN, 0) + at unittest.skipIf(support.is_wasi, "Cannot create invalid FD on WASI.") class TestInvalidFD(unittest.TestCase): singles = ["fchdir", "dup", "fdatasync", "fstat", "fstatvfs", "fsync", "tcgetpgrp", "ttyname"] diff --git a/Lib/test/test_pathlib.py b/Lib/test/test_pathlib.py index a64bf68e8593d..ac3e652631b03 100644 --- a/Lib/test/test_pathlib.py +++ b/Lib/test/test_pathlib.py @@ -13,7 +13,7 @@ from unittest import mock from test.support import import_helper -from test.support import is_emscripten +from test.support import is_emscripten, is_wasi from test.support import os_helper from test.support.os_helper import TESTFN, FakePath @@ -1530,6 +1530,7 @@ def test_empty_path(self): p = self.cls('') self.assertEqual(p.stat(), os.stat('.')) + @unittest.skipIf(is_wasi, "WASI has no user accounts.") def test_expanduser_common(self): P = self.cls p = P('~') @@ -2530,7 +2531,8 @@ def _check_symlink_loop(self, *args, strict=True): print(path.resolve(strict)) @unittest.skipIf( - is_emscripten, "umask is not implemented on Emscripten." + is_emscripten or is_wasi, + "umask is not implemented on Emscripten/WASI." ) def test_open_mode(self): old_mask = os.umask(0) @@ -2556,7 +2558,8 @@ def test_resolve_root(self): os.chdir(current_directory) @unittest.skipIf( - is_emscripten, "umask is not implemented on Emscripten." + is_emscripten or is_wasi, + "umask is not implemented on Emscripten/WASI." ) def test_touch_mode(self): old_mask = os.umask(0) diff --git a/Lib/test/test_tarfile.py b/Lib/test/test_tarfile.py index 12850cd635e99..a364043d3d9dd 100644 --- a/Lib/test/test_tarfile.py +++ b/Lib/test/test_tarfile.py @@ -1498,7 +1498,10 @@ def test_stream_padding(self): @unittest.skipUnless(sys.platform != "win32" and hasattr(os, "umask"), "Missing umask implementation") - @unittest.skipIf(support.is_emscripten, "Emscripten's umask is a stub.") + @unittest.skipIf( + support.is_emscripten or support.is_wasi, + "Emscripten's/WASI's umask is a stub." + ) def test_file_mode(self): # Test for issue #8464: Create files with correct # permissions. diff --git a/Lib/test/test_unicode_file.py b/Lib/test/test_unicode_file.py index 80c22c6cdd1da..fe25bfe9f88d1 100644 --- a/Lib/test/test_unicode_file.py +++ b/Lib/test/test_unicode_file.py @@ -110,7 +110,7 @@ def _test_single(self, filename): os.unlink(filename) self.assertTrue(not os.path.exists(filename)) # and again with os.open. - f = os.open(filename, os.O_CREAT) + f = os.open(filename, os.O_CREAT | os.O_WRONLY) os.close(f) try: self._do_single(filename) diff --git a/Tools/wasm/README.md b/Tools/wasm/README.md index 9e253bc878bd9..239eb90d0743c 100644 --- a/Tools/wasm/README.md +++ b/Tools/wasm/README.md @@ -239,7 +239,11 @@ are: yet. A future version of WASI may provide a limited ``set_permissions`` API. - File locking (``fcntl``) is not available. - ``os.pipe()``, ``os.mkfifo()``, and ``os.mknod()`` are not supported. -- ``process_time`` clock does not work. +- ``process_time`` does not work as expected because it's implemented using + wall clock. +- ``os.umask`` is a stub. +- ``sys.executable`` is empty. +- ``/dev/null`` / ``os.devnull`` may not be available. # Detect WebAssembly builds From webhook-mailer at python.org Wed May 25 11:34:33 2022 From: webhook-mailer at python.org (miss-islington) Date: Wed, 25 May 2022 15:34:33 -0000 Subject: [Python-checkins] gh-93124: Fix typos in comments (GH-93125) Message-ID: https://github.com/python/cpython/commit/a4974003ecdb0aba2385ca6f2af91aa989696cab commit: a4974003ecdb0aba2385ca6f2af91aa989696cab branch: main author: Akuli committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-25T08:34:14-07:00 summary: gh-93124: Fix typos in comments (GH-93125) Fixes #93124 Automerge-Triggered-By: GH:rhettinger files: M Lib/test/test_asyncio/test_locks.py M Lib/test/test_asyncio/test_runners.py M Lib/test/test_builtin.py M Lib/test/test_peg_generator/test_c_parser.py diff --git a/Lib/test/test_asyncio/test_locks.py b/Lib/test/test_asyncio/test_locks.py index 415cbe570fde9..ff25d9edef518 100644 --- a/Lib/test/test_asyncio/test_locks.py +++ b/Lib/test/test_asyncio/test_locks.py @@ -1271,7 +1271,7 @@ async def coro(): # catch here waiting tasks results1.append(True) else: - # here drained task ouside the barrier + # here drained task outside the barrier if rest_of_tasks == barrier._count: # tasks outside the barrier await barrier.reset() @@ -1377,7 +1377,7 @@ async def coro(): # last task exited from barrier await barrier.reset() - # wit here to reach the `parties` + # wait here to reach the `parties` await barrier.wait() else: try: diff --git a/Lib/test/test_asyncio/test_runners.py b/Lib/test/test_asyncio/test_runners.py index 0c2092147842c..957cfe41eff85 100644 --- a/Lib/test/test_asyncio/test_runners.py +++ b/Lib/test/test_asyncio/test_runners.py @@ -376,9 +376,9 @@ async def coro(): with asyncio.Runner() as runner: with self.assertRaises(asyncio.CancelledError): runner.run(coro()) - + def test_signal_install_not_supported_ok(self): - # signal.signal() can throw if the "main thread" doensn't have signals enabled + # signal.signal() can throw if the "main thread" doesn't have signals enabled assert threading.current_thread() is threading.main_thread() async def coro(): diff --git a/Lib/test/test_builtin.py b/Lib/test/test_builtin.py index efa9459a58629..d5eaf291a5ca2 100644 --- a/Lib/test/test_builtin.py +++ b/Lib/test/test_builtin.py @@ -2188,7 +2188,7 @@ def skip_if_readline(self): # the readline implementation. In some cases, the Python readline # callback rlhandler() is called by readline with a string without # non-ASCII characters. Skip tests on non-ASCII characters if the - # readline module is loaded, since test_builtin is not intented to test + # readline module is loaded, since test_builtin is not intended to test # the readline module, but the builtins module. if 'readline' in sys.modules: self.skipTest("the readline module is loaded") diff --git a/Lib/test/test_peg_generator/test_c_parser.py b/Lib/test/test_peg_generator/test_c_parser.py index d25bc112cfdc4..1b3fcbb92f829 100644 --- a/Lib/test/test_peg_generator/test_c_parser.py +++ b/Lib/test/test_peg_generator/test_c_parser.py @@ -75,7 +75,7 @@ class TestCParser(unittest.TestCase): @classmethod def setUpClass(cls): - # When running under regtest, a seperate tempdir is used + # When running under regtest, a separate tempdir is used # as the current directory and watched for left-overs. # Reusing that as the base for temporary directories # ensures everything is cleaned up properly and From webhook-mailer at python.org Wed May 25 11:38:59 2022 From: webhook-mailer at python.org (sweeneyde) Date: Wed, 25 May 2022 15:38:59 -0000 Subject: [Python-checkins] gh-93172: Remove unnecessary "if"s in binascii_a2b_qp_impl() from Modules/binascii.c (GH-93181) Message-ID: https://github.com/python/cpython/commit/32e3b790bc588c9ccbea810a4bea7a20bee43fb2 commit: 32e3b790bc588c9ccbea810a4bea7a20bee43fb2 branch: main author: oda-gitso <105083118+oda-gitso at users.noreply.github.com> committer: sweeneyde <36520290+sweeneyde at users.noreply.github.com> date: 2022-05-25T11:38:47-04:00 summary: gh-93172: Remove unnecessary "if"s in binascii_a2b_qp_impl() from Modules/binascii.c (GH-93181) files: M Modules/binascii.c diff --git a/Modules/binascii.c b/Modules/binascii.c index afe4988549171..ffc2c59413613 100644 --- a/Modules/binascii.c +++ b/Modules/binascii.c @@ -1024,10 +1024,7 @@ binascii_a2b_qp_impl(PyObject *module, Py_buffer *data, int header) out++; } } - if ((rv = PyBytes_FromStringAndSize((char *)odata, out)) == NULL) { - PyMem_Free(odata); - return NULL; - } + rv = PyBytes_FromStringAndSize((char *)odata, out); PyMem_Free(odata); return rv; } @@ -1232,10 +1229,7 @@ binascii_b2a_qp_impl(PyObject *module, Py_buffer *data, int quotetabs, } } } - if ((rv = PyBytes_FromStringAndSize((char *)odata, out)) == NULL) { - PyMem_Free(odata); - return NULL; - } + rv = PyBytes_FromStringAndSize((char *)odata, out); PyMem_Free(odata); return rv; } From webhook-mailer at python.org Wed May 25 13:50:32 2022 From: webhook-mailer at python.org (ethanfurman) Date: Wed, 25 May 2022 17:50:32 -0000 Subject: [Python-checkins] [3.11] gh-93035: [Enum] Fix IntFlag crash when no single-bit members (GH-93076) (GH-93197) Message-ID: https://github.com/python/cpython/commit/37a7f1b0997466bb088df82f5fe35fe6d1cebb22 commit: 37a7f1b0997466bb088df82f5fe35fe6d1cebb22 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: ethanfurman date: 2022-05-25T10:50:24-07:00 summary: [3.11] gh-93035: [Enum] Fix IntFlag crash when no single-bit members (GH-93076) (GH-93197) `EnumType` attempts to create a custom docstring for each enum/flag, but that was failing with pathological flags that had no members (only multi-bit aliases). (cherry picked from commit 08cfc3dabf0f81a4494cd0d697befc7d0dec77b7) Co-authored-by: Tobin Yehle files: M Lib/enum.py diff --git a/Lib/enum.py b/Lib/enum.py index 31923d757f803..4a21226f0193f 100644 --- a/Lib/enum.py +++ b/Lib/enum.py @@ -538,7 +538,7 @@ def __new__(metacls, cls, bases, classdict, *, boundary=None, _simple=False, **k # # create a default docstring if one has not been provided if enum_class.__doc__ is None: - if not member_names: + if not member_names or not list(enum_class): enum_class.__doc__ = classdict['__doc__'] = _dedent("""\ Create a collection of name/value pairs. From webhook-mailer at python.org Wed May 25 13:57:42 2022 From: webhook-mailer at python.org (mdickinson) Date: Wed, 25 May 2022 17:57:42 -0000 Subject: [Python-checkins] Remove unnecessary for loop initializer in long_lshift1() (GH-93071) Message-ID: https://github.com/python/cpython/commit/854db1a6061c83d80a3f1e4e87f043b521719920 commit: 854db1a6061c83d80a3f1e4e87f043b521719920 branch: main author: oda-gitso <105083118+oda-gitso at users.noreply.github.com> committer: mdickinson date: 2022-05-25T18:57:33+01:00 summary: Remove unnecessary for loop initializer in long_lshift1() (GH-93071) * Remove unnecessary for loop initialization. files: M Objects/longobject.c diff --git a/Objects/longobject.c b/Objects/longobject.c index 7f60866d2eb28..14d5954f84849 100644 --- a/Objects/longobject.c +++ b/Objects/longobject.c @@ -4842,7 +4842,7 @@ long_lshift1(PyLongObject *a, Py_ssize_t wordshift, digit remshift) for (i = 0; i < wordshift; i++) z->ob_digit[i] = 0; accum = 0; - for (i = wordshift, j = 0; j < oldsize; i++, j++) { + for (j = 0; j < oldsize; i++, j++) { accum |= (twodigits)a->ob_digit[j] << remshift; z->ob_digit[i] = (digit)(accum & PyLong_MASK); accum >>= PyLong_SHIFT; From webhook-mailer at python.org Wed May 25 16:04:13 2022 From: webhook-mailer at python.org (vstinner) Date: Wed, 25 May 2022 20:04:13 -0000 Subject: [Python-checkins] gh-90817: Deprecate explicitly locale.resetlocale() (#93196) Message-ID: https://github.com/python/cpython/commit/bf58cd01b313837511d9399f18588ccd2e5dc5a9 commit: bf58cd01b313837511d9399f18588ccd2e5dc5a9 branch: main author: Victor Stinner committer: vstinner date: 2022-05-25T22:04:06+02:00 summary: gh-90817: Deprecate explicitly locale.resetlocale() (#93196) The function was already deprecated in Python 3.11 since it calls locale.getdefaultlocale() which was deprecated in Python 3.11. files: A Misc/NEWS.d/next/Library/2022-05-25-02-45-41.gh-issue-90817.yxANgU.rst M Doc/library/locale.rst M Doc/whatsnew/3.11.rst M Lib/locale.py diff --git a/Doc/library/locale.rst b/Doc/library/locale.rst index 77a3e036841ba..112f0bae78daf 100644 --- a/Doc/library/locale.rst +++ b/Doc/library/locale.rst @@ -375,6 +375,8 @@ The :mod:`locale` module defines the following exception and functions: The default setting is determined by calling :func:`getdefaultlocale`. *category* defaults to :const:`LC_ALL`. + .. deprecated:: 3.11 3.13 + .. function:: strcoll(string1, string2) diff --git a/Doc/whatsnew/3.11.rst b/Doc/whatsnew/3.11.rst index c7ff6ca4938c7..24d1343689c98 100644 --- a/Doc/whatsnew/3.11.rst +++ b/Doc/whatsnew/3.11.rst @@ -1221,7 +1221,11 @@ Deprecated removed in Python 3.13. Use :func:`locale.setlocale`, :func:`locale.getpreferredencoding(False) ` and :func:`locale.getlocale` functions instead. - (Contributed by Victor Stinner in :issue:`46659`.) + (Contributed by Victor Stinner in :gh:`90817`.) + +* The :func:`locale.resetlocale` function is deprecated and will be + removed in Python 3.13. Use ``locale.setlocale(locale.LC_ALL, "")`` instead. + (Contributed by Victor Stinner in :gh:`90817`.) * The :mod:`asynchat`, :mod:`asyncore` and :mod:`smtpd` modules have been deprecated since at least Python 3.6. Their documentation and deprecation diff --git a/Lib/locale.py b/Lib/locale.py index 25eb75ac65a32..7a7694e1bfb71 100644 --- a/Lib/locale.py +++ b/Lib/locale.py @@ -633,7 +633,17 @@ def resetlocale(category=LC_ALL): getdefaultlocale(). category defaults to LC_ALL. """ - _setlocale(category, _build_localename(getdefaultlocale())) + import warnings + warnings.warn( + 'Use locale.setlocale(locale.LC_ALL, "") instead', + DeprecationWarning, stacklevel=2 + ) + + with warnings.catch_warnings(): + warnings.simplefilter('ignore', category=DeprecationWarning) + loc = getdefaultlocale() + + _setlocale(category, _build_localename(loc)) try: diff --git a/Misc/NEWS.d/next/Library/2022-05-25-02-45-41.gh-issue-90817.yxANgU.rst b/Misc/NEWS.d/next/Library/2022-05-25-02-45-41.gh-issue-90817.yxANgU.rst new file mode 100644 index 0000000000000..06937e8869172 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-05-25-02-45-41.gh-issue-90817.yxANgU.rst @@ -0,0 +1,3 @@ +The :func:`locale.resetlocale` function is deprecated and will be removed in +Python 3.13. Use ``locale.setlocale(locale.LC_ALL, "")`` instead. Patch by +Victor Stinner. From webhook-mailer at python.org Wed May 25 16:30:15 2022 From: webhook-mailer at python.org (miss-islington) Date: Wed, 25 May 2022 20:30:15 -0000 Subject: [Python-checkins] gh-90817: Deprecate explicitly locale.resetlocale() (GH-93196) Message-ID: https://github.com/python/cpython/commit/83940c07666090301168d0108cf545d3db28b925 commit: 83940c07666090301168d0108cf545d3db28b925 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-25T13:29:58-07:00 summary: gh-90817: Deprecate explicitly locale.resetlocale() (GH-93196) The function was already deprecated in Python 3.11 since it calls locale.getdefaultlocale() which was deprecated in Python 3.11. (cherry picked from commit bf58cd01b313837511d9399f18588ccd2e5dc5a9) Co-authored-by: Victor Stinner files: A Misc/NEWS.d/next/Library/2022-05-25-02-45-41.gh-issue-90817.yxANgU.rst M Doc/library/locale.rst M Doc/whatsnew/3.11.rst M Lib/locale.py diff --git a/Doc/library/locale.rst b/Doc/library/locale.rst index 77a3e036841ba..112f0bae78daf 100644 --- a/Doc/library/locale.rst +++ b/Doc/library/locale.rst @@ -375,6 +375,8 @@ The :mod:`locale` module defines the following exception and functions: The default setting is determined by calling :func:`getdefaultlocale`. *category* defaults to :const:`LC_ALL`. + .. deprecated:: 3.11 3.13 + .. function:: strcoll(string1, string2) diff --git a/Doc/whatsnew/3.11.rst b/Doc/whatsnew/3.11.rst index c7ff6ca4938c7..24d1343689c98 100644 --- a/Doc/whatsnew/3.11.rst +++ b/Doc/whatsnew/3.11.rst @@ -1221,7 +1221,11 @@ Deprecated removed in Python 3.13. Use :func:`locale.setlocale`, :func:`locale.getpreferredencoding(False) ` and :func:`locale.getlocale` functions instead. - (Contributed by Victor Stinner in :issue:`46659`.) + (Contributed by Victor Stinner in :gh:`90817`.) + +* The :func:`locale.resetlocale` function is deprecated and will be + removed in Python 3.13. Use ``locale.setlocale(locale.LC_ALL, "")`` instead. + (Contributed by Victor Stinner in :gh:`90817`.) * The :mod:`asynchat`, :mod:`asyncore` and :mod:`smtpd` modules have been deprecated since at least Python 3.6. Their documentation and deprecation diff --git a/Lib/locale.py b/Lib/locale.py index 25eb75ac65a32..7a7694e1bfb71 100644 --- a/Lib/locale.py +++ b/Lib/locale.py @@ -633,7 +633,17 @@ def resetlocale(category=LC_ALL): getdefaultlocale(). category defaults to LC_ALL. """ - _setlocale(category, _build_localename(getdefaultlocale())) + import warnings + warnings.warn( + 'Use locale.setlocale(locale.LC_ALL, "") instead', + DeprecationWarning, stacklevel=2 + ) + + with warnings.catch_warnings(): + warnings.simplefilter('ignore', category=DeprecationWarning) + loc = getdefaultlocale() + + _setlocale(category, _build_localename(loc)) try: diff --git a/Misc/NEWS.d/next/Library/2022-05-25-02-45-41.gh-issue-90817.yxANgU.rst b/Misc/NEWS.d/next/Library/2022-05-25-02-45-41.gh-issue-90817.yxANgU.rst new file mode 100644 index 0000000000000..06937e8869172 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-05-25-02-45-41.gh-issue-90817.yxANgU.rst @@ -0,0 +1,3 @@ +The :func:`locale.resetlocale` function is deprecated and will be removed in +Python 3.13. Use ``locale.setlocale(locale.LC_ALL, "")`` instead. Patch by +Victor Stinner. From webhook-mailer at python.org Wed May 25 17:59:38 2022 From: webhook-mailer at python.org (zooba) Date: Wed, 25 May 2022 21:59:38 -0000 Subject: [Python-checkins] gh-93005: Fix py.exe launcher test to search for intended tag (GH-93190) Message-ID: https://github.com/python/cpython/commit/ca58e4a2c596d1b4cdcae9ec92844d3d3272c4ce commit: ca58e4a2c596d1b4cdcae9ec92844d3d3272c4ce branch: main author: Steve Dower committer: zooba date: 2022-05-25T22:59:33+01:00 summary: gh-93005: Fix py.exe launcher test to search for intended tag (GH-93190) files: M Lib/test/test_launcher.py diff --git a/Lib/test/test_launcher.py b/Lib/test/test_launcher.py index 8d9de688f0a53..e9f6fcb7d7f24 100644 --- a/Lib/test/test_launcher.py +++ b/Lib/test/test_launcher.py @@ -484,7 +484,7 @@ def test_virtualenv_in_list(self): def test_virtualenv_with_env(self): with self.fake_venv() as (venv_exe, env): data1 = self.run_py([], env={**env, "PY_PYTHON": "PythonTestSuite/3"}) - data2 = self.run_py(["-3"], env={**env, "PY_PYTHON": "PythonTestSuite/3"}) + data2 = self.run_py(["-V:PythonTestSuite/3"], env={**env, "PY_PYTHON": "PythonTestSuite/3"}) # Compare stdout, because stderr goes via ascii self.assertEqual(data1["stdout"].strip(), str(venv_exe)) self.assertEqual(data1["SearchInfo.lowPriorityTag"], "True") From webhook-mailer at python.org Wed May 25 18:13:26 2022 From: webhook-mailer at python.org (vstinner) Date: Wed, 25 May 2022 22:13:26 -0000 Subject: [Python-checkins] gh-69443: Add test.support.Py_DEBUG constant (#93226) Message-ID: https://github.com/python/cpython/commit/518595652759462b13904df767f69b8cc2c61143 commit: 518595652759462b13904df767f69b8cc2c61143 branch: main author: Victor Stinner committer: vstinner date: 2022-05-26T00:12:54+02:00 summary: gh-69443: Add test.support.Py_DEBUG constant (#93226) files: M Doc/library/test.rst M Lib/test/support/__init__.py M Lib/test/test_capi.py M Lib/test/test_cmd_line.py M Lib/test/test_embed.py M Lib/test/test_hashlib.py M Lib/test/test_io.py M Lib/test/test_lltrace.py M Lib/test/test_marshal.py M Lib/test/test_regrtest.py M Lib/test/test_ssl.py M Lib/test/test_threading.py M Lib/test/test_warnings/__init__.py diff --git a/Doc/library/test.rst b/Doc/library/test.rst index 707e966455ceb..548919cd59785 100644 --- a/Doc/library/test.rst +++ b/Doc/library/test.rst @@ -319,6 +319,15 @@ The :mod:`test.support` module defines the following constants: to make writes blocking. +.. data:: Py_DEBUG + + True if Python is built with the :c:macro:`Py_DEBUG` macro defined: if + Python is :ref:`built in debug mode ` + (:option:`./configure --with-pydebug <--with-pydebug>`). + + .. versionadded:: 3.12 + + .. data:: SOCK_MAX_SIZE A constant that is likely larger than the underlying OS socket buffer size, diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py index c284fc67b6402..e23ffee22d1cd 100644 --- a/Lib/test/support/__init__.py +++ b/Lib/test/support/__init__.py @@ -59,6 +59,7 @@ "run_with_tz", "PGO", "missing_compiler_executable", "ALWAYS_EQ", "NEVER_EQ", "LARGEST", "SMALLEST", "LOOPBACK_TIMEOUT", "INTERNET_TIMEOUT", "SHORT_TIMEOUT", "LONG_TIMEOUT", + "Py_DEBUG", ] @@ -2205,3 +2206,8 @@ def requires_venv_with_pip(): except ImportError: ctypes = None return unittest.skipUnless(ctypes, 'venv: pip requires ctypes') + + +# True if Python is built with the Py_DEBUG macro defined: if +# Python is built in debug mode (./configure --with-pydebug). +Py_DEBUG = hasattr(sys, 'gettotalrefcount') diff --git a/Lib/test/test_capi.py b/Lib/test/test_capi.py index 904ae9bc47ecf..49cd82108c92c 100644 --- a/Lib/test/test_capi.py +++ b/Lib/test/test_capi.py @@ -36,9 +36,6 @@ import _testinternalcapi -# Were we compiled --with-pydebug or with #define Py_DEBUG? -Py_DEBUG = hasattr(sys, 'gettotalrefcount') - def decode_stderr(err): return err.decode('utf-8', 'replace').replace('\r', '') @@ -230,7 +227,7 @@ def test_c_type_with_ipow(self): def test_return_null_without_error(self): # Issue #23571: A function must not return NULL without setting an # error - if Py_DEBUG: + if support.Py_DEBUG: code = textwrap.dedent(""" import _testcapi from test import support @@ -258,7 +255,7 @@ def test_return_null_without_error(self): def test_return_result_with_error(self): # Issue #23571: A function must not return a result with an error set - if Py_DEBUG: + if support.Py_DEBUG: code = textwrap.dedent(""" import _testcapi from test import support @@ -516,7 +513,7 @@ def __del__(self): del subclass_instance # Test that setting __class__ modified the reference counts of the types - if Py_DEBUG: + if support.Py_DEBUG: # gh-89373: In debug mode, _Py_Dealloc() keeps a strong reference # to the type while calling tp_dealloc() self.assertEqual(type_refcnt, B.refcnt_in_del) @@ -586,7 +583,7 @@ def test_c_subclass_of_heap_ctype_with_del_modifying_dunder_class_only_decrefs_o del subclass_instance # Test that setting __class__ modified the reference counts of the types - if Py_DEBUG: + if support.Py_DEBUG: # gh-89373: In debug mode, _Py_Dealloc() keeps a strong reference # to the type while calling tp_dealloc() self.assertEqual(type_refcnt, _testcapi.HeapCTypeSubclassWithFinalizer.refcnt_in_del) @@ -1029,7 +1026,7 @@ class PyMemPymallocDebugTests(PyMemDebugTests): PYTHONMALLOC = 'pymalloc_debug' - at unittest.skipUnless(Py_DEBUG, 'need Py_DEBUG') + at unittest.skipUnless(support.Py_DEBUG, 'need Py_DEBUG') class PyMemDefaultTests(PyMemDebugTests): # test default allocator of Python compiled in debug mode PYTHONMALLOC = '' diff --git a/Lib/test/test_cmd_line.py b/Lib/test/test_cmd_line.py index 5a9e14bbd3200..ed733d2f61666 100644 --- a/Lib/test/test_cmd_line.py +++ b/Lib/test/test_cmd_line.py @@ -18,9 +18,6 @@ if not support.has_subprocess_support: raise unittest.SkipTest("test module requires subprocess") -# Debug build? -Py_DEBUG = hasattr(sys, "gettotalrefcount") - # XXX (ncoghlan): Move to script_helper and make consistent with run_python def _kill_python_and_exit_code(p): @@ -120,7 +117,7 @@ def run_python(*args): # "-X showrefcount" shows the refcount, but only in debug builds rc, out, err = run_python('-I', '-X', 'showrefcount', '-c', code) self.assertEqual(out.rstrip(), b"{'showrefcount': True}") - if Py_DEBUG: + if support.Py_DEBUG: # bpo-46417: Tolerate negative reference count which can occur # because of bugs in C extensions. This test is only about checking # the showrefcount feature. @@ -685,7 +682,7 @@ def test_xdev(self): code = ("import warnings; " "print(' '.join('%s::%s' % (f[0], f[2].__name__) " "for f in warnings.filters))") - if Py_DEBUG: + if support.Py_DEBUG: expected_filters = "default::Warning" else: expected_filters = ("default::Warning " @@ -757,7 +754,7 @@ def test_warnings_filter_precedence(self): expected_filters = ("error::BytesWarning " "once::UserWarning " "always::UserWarning") - if not Py_DEBUG: + if not support.Py_DEBUG: expected_filters += (" " "default::DeprecationWarning " "ignore::DeprecationWarning " @@ -795,10 +792,10 @@ def test_pythonmalloc(self): # Test the PYTHONMALLOC environment variable pymalloc = support.with_pymalloc() if pymalloc: - default_name = 'pymalloc_debug' if Py_DEBUG else 'pymalloc' + default_name = 'pymalloc_debug' if support.Py_DEBUG else 'pymalloc' default_name_debug = 'pymalloc_debug' else: - default_name = 'malloc_debug' if Py_DEBUG else 'malloc' + default_name = 'malloc_debug' if support.Py_DEBUG else 'malloc' default_name_debug = 'malloc_debug' tests = [ diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index 5ba6e3a43fdc6..f1ca6da147376 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -22,7 +22,6 @@ MS_WINDOWS = (os.name == 'nt') MACOS = (sys.platform == 'darwin') -Py_DEBUG = hasattr(sys, 'gettotalrefcount') PYMEM_ALLOCATOR_NOT_SET = 0 PYMEM_ALLOCATOR_DEBUG = 2 PYMEM_ALLOCATOR_MALLOC = 3 @@ -498,7 +497,7 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): 'pathconfig_warnings': 1, '_init_main': 1, '_isolated_interpreter': 0, - 'use_frozen_modules': not Py_DEBUG, + 'use_frozen_modules': not support.Py_DEBUG, 'safe_path': 0, '_is_python_build': IGNORE_CONFIG, } @@ -1206,7 +1205,7 @@ def test_init_setpath_config(self): # The current getpath.c doesn't determine the stdlib dir # in this case. 'stdlib_dir': '', - 'use_frozen_modules': not Py_DEBUG, + 'use_frozen_modules': not support.Py_DEBUG, # overridden by PyConfig 'program_name': 'conf_program_name', 'base_executable': 'conf_executable', @@ -1445,12 +1444,12 @@ def test_init_pyvenv_cfg(self): config['base_prefix'] = pyvenv_home config['prefix'] = pyvenv_home config['stdlib_dir'] = os.path.join(pyvenv_home, 'Lib') - config['use_frozen_modules'] = not Py_DEBUG + config['use_frozen_modules'] = not support.Py_DEBUG else: # cannot reliably assume stdlib_dir here because it # depends too much on our build. But it ought to be found config['stdlib_dir'] = self.IGNORE_CONFIG - config['use_frozen_modules'] = not Py_DEBUG + config['use_frozen_modules'] = not support.Py_DEBUG env = self.copy_paths_by_env(config) self.check_all_configs("test_init_compat_config", config, @@ -1680,7 +1679,7 @@ def test_frozenmain(self): """).lstrip() self.assertEqual(out, expected) - @unittest.skipUnless(hasattr(sys, 'gettotalrefcount'), + @unittest.skipUnless(support.Py_DEBUG, '-X showrefcount requires a Python debug build') def test_no_memleak(self): # bpo-1635741: Python must release all memory at exit diff --git a/Lib/test/test_hashlib.py b/Lib/test/test_hashlib.py index 67becdd6d317f..bc9407dc9e424 100644 --- a/Lib/test/test_hashlib.py +++ b/Lib/test/test_hashlib.py @@ -26,8 +26,6 @@ from test.support import warnings_helper from http.client import HTTPException -# Were we compiled --with-pydebug or with #define Py_DEBUG? -COMPILED_WITH_PYDEBUG = hasattr(sys, 'gettotalrefcount') # default builtin hash module default_builtin_hashes = {'md5', 'sha1', 'sha256', 'sha512', 'sha3', 'blake2'} @@ -109,7 +107,7 @@ class HashLibTestCase(unittest.TestCase): shakes = {'shake_128', 'shake_256'} # Issue #14693: fallback modules are always compiled under POSIX - _warn_on_extension_import = os.name == 'posix' or COMPILED_WITH_PYDEBUG + _warn_on_extension_import = (os.name == 'posix' or support.Py_DEBUG) def _conditional_import_module(self, module_name): """Import a module and return a reference to it or None on failure.""" diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py index daccbae5b4a1d..129734b22328e 100644 --- a/Lib/test/test_io.py +++ b/Lib/test/test_io.py @@ -68,7 +68,7 @@ class EmptyStruct(ctypes.Structure): # Does io.IOBase finalizer log the exception if the close() method fails? # The exception is ignored silently by default in release build. -IOBASE_EMITS_UNRAISABLE = (hasattr(sys, "gettotalrefcount") or sys.flags.dev_mode) +IOBASE_EMITS_UNRAISABLE = (support.Py_DEBUG or sys.flags.dev_mode) def _default_chunk_size(): diff --git a/Lib/test/test_lltrace.py b/Lib/test/test_lltrace.py index 63b65e4b2f821..5d175ce57b179 100644 --- a/Lib/test/test_lltrace.py +++ b/Lib/test/test_lltrace.py @@ -3,7 +3,8 @@ import textwrap import unittest -from test.support import os_helper, verbose +from test import support +from test.support import os_helper from test.support.script_helper import assert_python_ok def example(): @@ -14,9 +15,8 @@ def example(): y = "an example" print(x, y) -Py_DEBUG = hasattr(sys, 'gettotalrefcount') - at unittest.skipUnless(Py_DEBUG, "lltrace requires Py_DEBUG") + at unittest.skipUnless(support.Py_DEBUG, "lltrace requires Py_DEBUG") class TestLLTrace(unittest.TestCase): def run_code(self, code): @@ -28,7 +28,7 @@ def run_code(self, code): self.assertEqual(stderr, b"") self.assertEqual(status, 0) result = stdout.decode('utf-8') - if verbose: + if support.verbose: print("\n\n--- code ---") print(code) print("\n--- stdout ---") diff --git a/Lib/test/test_marshal.py b/Lib/test/test_marshal.py index aae86cc257d7e..882a819ca8090 100644 --- a/Lib/test/test_marshal.py +++ b/Lib/test/test_marshal.py @@ -256,7 +256,7 @@ def test_recursion_limit(self): # The max stack depth should match the value in Python/marshal.c. # BUG: https://bugs.python.org/issue33720 # Windows always limits the maximum depth on release and debug builds - #if os.name == 'nt' and hasattr(sys, 'gettotalrefcount'): + #if os.name == 'nt' and support.Py_DEBUG: if os.name == 'nt': MAX_MARSHAL_STACK_DEPTH = 1000 else: diff --git a/Lib/test/test_regrtest.py b/Lib/test/test_regrtest.py index 15e2f89ee20c1..4f632bb2f3954 100644 --- a/Lib/test/test_regrtest.py +++ b/Lib/test/test_regrtest.py @@ -25,7 +25,6 @@ if not support.has_subprocess_support: raise unittest.SkipTest("test module requires subprocess") -Py_DEBUG = hasattr(sys, 'gettotalrefcount') ROOT_DIR = os.path.join(os.path.dirname(__file__), '..', '..') ROOT_DIR = os.path.abspath(os.path.normpath(ROOT_DIR)) LOG_PREFIX = r'[0-9]+:[0-9]+:[0-9]+ (?:load avg: [0-9]+\.[0-9]{2} )?' @@ -665,7 +664,7 @@ def test_tools_buildbot_test(self): test_args.append('-arm32') # 32-bit ARM build elif platform.architecture()[0] == '64bit': test_args.append('-x64') # 64-bit build - if not Py_DEBUG: + if not support.Py_DEBUG: test_args.append('+d') # Release build, use python.exe self.run_batch(script, *test_args, *self.tests) @@ -682,7 +681,7 @@ def test_pcbuild_rt(self): rt_args.append('-arm32') # 32-bit ARM build elif platform.architecture()[0] == '64bit': rt_args.append('-x64') # 64-bit build - if Py_DEBUG: + if support.Py_DEBUG: rt_args.append('-d') # Debug build, use python_d.exe self.run_batch(script, *rt_args, *self.regrtest_args, *self.tests) @@ -903,7 +902,7 @@ def check_leak(self, code, what): reflog = fp.read() self.assertIn(line2, reflog) - @unittest.skipUnless(Py_DEBUG, 'need a debug build') + @unittest.skipUnless(support.Py_DEBUG, 'need a debug build') def test_huntrleaks(self): # test --huntrleaks code = textwrap.dedent(""" @@ -917,7 +916,7 @@ def test_leak(self): """) self.check_leak(code, 'references') - @unittest.skipUnless(Py_DEBUG, 'need a debug build') + @unittest.skipUnless(support.Py_DEBUG, 'need a debug build') def test_huntrleaks_fd_leak(self): # test --huntrleaks for file descriptor leak code = textwrap.dedent(""" diff --git a/Lib/test/test_ssl.py b/Lib/test/test_ssl.py index fed76378726c9..6a66c167933de 100644 --- a/Lib/test/test_ssl.py +++ b/Lib/test/test_ssl.py @@ -38,8 +38,7 @@ from ssl import TLSVersion, _TLSContentType, _TLSMessageType, _TLSAlertType -Py_DEBUG = hasattr(sys, 'gettotalrefcount') -Py_DEBUG_WIN32 = Py_DEBUG and sys.platform == 'win32' +Py_DEBUG_WIN32 = support.Py_DEBUG and sys.platform == 'win32' PROTOCOLS = sorted(ssl._PROTOCOL_NAMES) HOST = socket_helper.HOST @@ -1657,7 +1656,8 @@ def test_load_default_certs_env(self): self.assertEqual(ctx.cert_store_stats(), {"crl": 0, "x509": 1, "x509_ca": 0}) @unittest.skipUnless(sys.platform == "win32", "Windows specific") - @unittest.skipIf(hasattr(sys, "gettotalrefcount"), "Debug build does not share environment between CRTs") + @unittest.skipIf(support.Py_DEBUG, + "Debug build does not share environment between CRTs") def test_load_default_certs_env_windows(self): ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) ctx.load_default_certs() diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py index 6cdc45f523dcb..dcd27697bb483 100644 --- a/Lib/test/test_threading.py +++ b/Lib/test/test_threading.py @@ -33,9 +33,6 @@ # on platforms known to behave badly. platforms_to_skip = ('netbsd5', 'hp-ux11') -# Is Python built with Py_DEBUG macro defined? -Py_DEBUG = hasattr(sys, 'gettotalrefcount') - def restore_default_excepthook(testcase): testcase.addCleanup(setattr, threading, 'excepthook', threading.excepthook) diff --git a/Lib/test/test_warnings/__init__.py b/Lib/test/test_warnings/__init__.py index 0f960b82bfaeb..b00ddd5df2f25 100644 --- a/Lib/test/test_warnings/__init__.py +++ b/Lib/test/test_warnings/__init__.py @@ -22,8 +22,6 @@ c_warnings = import_helper.import_fresh_module('warnings', fresh=['_warnings']) -Py_DEBUG = hasattr(sys, 'gettotalrefcount') - @contextmanager def warnings_state(module): """Use a specific warnings implementation in warning_tests.""" @@ -1191,7 +1189,7 @@ def test_conflicting_envvar_and_command_line(self): def test_default_filter_configuration(self): pure_python_api = self.module is py_warnings - if Py_DEBUG: + if support.Py_DEBUG: expected_default_filters = [] else: if pure_python_api: From webhook-mailer at python.org Wed May 25 18:16:41 2022 From: webhook-mailer at python.org (vstinner) Date: Wed, 25 May 2022 22:16:41 -0000 Subject: [Python-checkins] [3.10] gh-91924: Fix __ltrace__ for non-UTF-8 stdout encoding (#93214) Message-ID: https://github.com/python/cpython/commit/9369942054fe3fe389f4f4ff808d33c5d7945052 commit: 9369942054fe3fe389f4f4ff808d33c5d7945052 branch: 3.10 author: Victor Stinner committer: vstinner date: 2022-05-26T00:16:32+02:00 summary: [3.10] gh-91924: Fix __ltrace__ for non-UTF-8 stdout encoding (#93214) Fix __ltrace__ debug feature if the stdout encoding is not UTF-8. If the stdout encoding is not UTF-8, the first call to lltrace_resume_frame() indirectly sets lltrace to 0 when calling unicode_check_encoding_errors() which calls encodings.search_function(). Add test_lltrace.test_lltrace() test. files: A Misc/NEWS.d/next/Core and Builtins/2022-05-25-04-07-22.gh-issue-91924.-UyO4q.rst M Lib/test/test_lltrace.py M Python/ceval.c diff --git a/Lib/test/test_lltrace.py b/Lib/test/test_lltrace.py index 06e33f4c4c2f3..b5b0c10d404be 100644 --- a/Lib/test/test_lltrace.py +++ b/Lib/test/test_lltrace.py @@ -1,11 +1,16 @@ -import os +import opcode +import re +import sys import textwrap import unittest -from test.support import os_helper +from test.support import os_helper, verbose from test.support.script_helper import assert_python_ok +Py_DEBUG = hasattr(sys, 'gettotalrefcount') + + at unittest.skipUnless(Py_DEBUG, "lltrace requires Py_DEBUG") class TestLLTrace(unittest.TestCase): def test_lltrace_does_not_crash_on_subscript_operator(self): @@ -27,5 +32,67 @@ def test_lltrace_does_not_crash_on_subscript_operator(self): assert_python_ok(os_helper.TESTFN) + def run_code(self, code): + code = textwrap.dedent(code).strip() + with open(os_helper.TESTFN, 'w', encoding='utf-8') as fd: + self.addCleanup(os_helper.unlink, os_helper.TESTFN) + fd.write(code) + status, stdout, stderr = assert_python_ok(os_helper.TESTFN) + self.assertEqual(stderr, b"") + self.assertEqual(status, 0) + result = stdout.decode('utf-8') + if verbose: + print("\n\n--- code ---") + print(code) + print("\n--- stdout ---") + print(result) + print() + return result + + def check_op(self, op, stdout, present): + op = opcode.opmap[op] + regex = re.compile(f': {op}($|, )', re.MULTILINE) + if present: + self.assertTrue(regex.search(stdout), + f'": {op}" not found in: {stdout}') + else: + self.assertFalse(regex.search(stdout), + f'": {op}" found in: {stdout}') + + def check_op_in(self, op, stdout): + self.check_op(op, stdout, True) + + def check_op_not_in(self, op, stdout): + self.check_op(op, stdout, False) + + def test_lltrace(self): + stdout = self.run_code(""" + def dont_trace_1(): + a = "a" + a = 10 * a + def trace_me(): + for i in range(3): + +i + def dont_trace_2(): + x = 42 + y = -x + dont_trace_1() + __ltrace__ = 1 + trace_me() + del __ltrace__ + dont_trace_2() + """) + self.check_op_in("GET_ITER", stdout) + self.check_op_in("FOR_ITER", stdout) + self.check_op_in("UNARY_POSITIVE", stdout) + self.check_op_in("POP_TOP", stdout) + + # before: dont_trace_1() is not traced + self.check_op_not_in("BINARY_MULTIPLY", stdout) + + # after: dont_trace_2() is not traced + self.check_op_not_in("UNARY_NEGATIVE", stdout) + + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-25-04-07-22.gh-issue-91924.-UyO4q.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-25-04-07-22.gh-issue-91924.-UyO4q.rst new file mode 100644 index 0000000000000..3986ad8aa8d95 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-05-25-04-07-22.gh-issue-91924.-UyO4q.rst @@ -0,0 +1,2 @@ +Fix ``__ltrace__`` debug feature if the stdout encoding is not UTF-8. Patch +by Victor Stinner. diff --git a/Python/ceval.c b/Python/ceval.c index 21674e0be1324..9a193c994d12e 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -5377,6 +5377,8 @@ prtrace(PyThreadState *tstate, PyObject *v, const char *str) } printf("\n"); PyErr_Restore(type, value, traceback); + // gh-91924: PyObject_Print() can indirectly set lltrace to 0 + lltrace = 1; return 1; } #endif From webhook-mailer at python.org Wed May 25 18:29:44 2022 From: webhook-mailer at python.org (miss-islington) Date: Wed, 25 May 2022 22:29:44 -0000 Subject: [Python-checkins] gh-93005: Fix py.exe launcher test to search for intended tag (GH-93190) Message-ID: https://github.com/python/cpython/commit/4d863453f8a68ca65acb6207e256b963bdf0fd14 commit: 4d863453f8a68ca65acb6207e256b963bdf0fd14 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-25T15:29:36-07:00 summary: gh-93005: Fix py.exe launcher test to search for intended tag (GH-93190) (cherry picked from commit ca58e4a2c596d1b4cdcae9ec92844d3d3272c4ce) Co-authored-by: Steve Dower files: M Lib/test/test_launcher.py diff --git a/Lib/test/test_launcher.py b/Lib/test/test_launcher.py index 8d9de688f0a53..e9f6fcb7d7f24 100644 --- a/Lib/test/test_launcher.py +++ b/Lib/test/test_launcher.py @@ -484,7 +484,7 @@ def test_virtualenv_in_list(self): def test_virtualenv_with_env(self): with self.fake_venv() as (venv_exe, env): data1 = self.run_py([], env={**env, "PY_PYTHON": "PythonTestSuite/3"}) - data2 = self.run_py(["-3"], env={**env, "PY_PYTHON": "PythonTestSuite/3"}) + data2 = self.run_py(["-V:PythonTestSuite/3"], env={**env, "PY_PYTHON": "PythonTestSuite/3"}) # Compare stdout, because stderr goes via ascii self.assertEqual(data1["stdout"].strip(), str(venv_exe)) self.assertEqual(data1["SearchInfo.lowPriorityTag"], "True") From webhook-mailer at python.org Thu May 26 04:30:59 2022 From: webhook-mailer at python.org (vsajip) Date: Thu, 26 May 2022 08:30:59 -0000 Subject: [Python-checkins] gh-91513: Add 'asyncio' taskName to logging LogRecord attributes. (GH-93193) Message-ID: https://github.com/python/cpython/commit/cc377063ef3ef99edce00e0c706809d9510e2bed commit: cc377063ef3ef99edce00e0c706809d9510e2bed branch: main author: jackh-ncl <1750152+jackh-ncl at users.noreply.github.com> committer: vsajip date: 2022-05-26T09:30:51+01:00 summary: gh-91513: Add 'asyncio' taskName to logging LogRecord attributes. (GH-93193) files: A Misc/NEWS.d/next/Library/2022-05-25-00-21-28.gh-issue-91513.9VyCT4.rst M Doc/howto/logging.rst M Doc/library/logging.rst M Lib/logging/__init__.py M Lib/test/test_logging.py diff --git a/Doc/howto/logging.rst b/Doc/howto/logging.rst index 93400627136e3..125bde2915227 100644 --- a/Doc/howto/logging.rst +++ b/Doc/howto/logging.rst @@ -1101,6 +1101,9 @@ need: | Current process name when using ``multiprocessing`` | Set ``logging.logMultiprocessing`` to ``False``. | | to manage multiple processes. | | +-----------------------------------------------------+---------------------------------------------------+ +| Current :class:`asyncio.Task` name when using | Set ``logging.logAsyncioTasks`` to ``False``. | +| ``asyncio``. | | ++-----------------------------------------------------+---------------------------------------------------+ Also note that the core logging module only includes the basic handlers. If you don't import :mod:`logging.handlers` and :mod:`logging.config`, they won't diff --git a/Doc/library/logging.rst b/Doc/library/logging.rst index 3310c73656258..ac86bc8077ef7 100644 --- a/Doc/library/logging.rst +++ b/Doc/library/logging.rst @@ -872,10 +872,14 @@ the options available to you. +----------------+-------------------------+-----------------------------------------------+ | threadName | ``%(threadName)s`` | Thread name (if available). | +----------------+-------------------------+-----------------------------------------------+ +| taskName | ``%(taskName)s`` | :class:`asyncio.Task` name (if available). | ++----------------+-------------------------+-----------------------------------------------+ .. versionchanged:: 3.1 *processName* was added. +.. versionchanged:: 3.12 + *taskName* was added. .. _logger-adapter: diff --git a/Lib/logging/__init__.py b/Lib/logging/__init__.py index 79e4b7d09bfa4..e7636e18bec4a 100644 --- a/Lib/logging/__init__.py +++ b/Lib/logging/__init__.py @@ -64,20 +64,25 @@ raiseExceptions = True # -# If you don't want threading information in the log, set this to zero +# If you don't want threading information in the log, set this to False # logThreads = True # -# If you don't want multiprocessing information in the log, set this to zero +# If you don't want multiprocessing information in the log, set this to False # logMultiprocessing = True # -# If you don't want process information in the log, set this to zero +# If you don't want process information in the log, set this to False # logProcesses = True +# +# If you don't want asyncio task information in the log, set this to False +# +logAsyncioTasks = True + #--------------------------------------------------------------------------- # Level related stuff #--------------------------------------------------------------------------- @@ -361,6 +366,15 @@ def __init__(self, name, level, pathname, lineno, else: self.process = None + self.taskName = None + if logAsyncioTasks: + asyncio = sys.modules.get('asyncio') + if asyncio: + try: + self.taskName = asyncio.current_task().get_name() + except Exception: + pass + def __repr__(self): return ''%(self.name, self.levelno, self.pathname, self.lineno, self.msg) @@ -566,6 +580,7 @@ class Formatter(object): (typically at application startup time) %(thread)d Thread ID (if available) %(threadName)s Thread name (if available) + %(taskName)s Task name (if available) %(process)d Process ID (if available) %(message)s The result of record.getMessage(), computed just as the record is emitted diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py index fd562322a7637..07804a2686a14 100644 --- a/Lib/test/test_logging.py +++ b/Lib/test/test_logging.py @@ -18,7 +18,6 @@ Copyright (C) 2001-2021 Vinay Sajip. All Rights Reserved. """ - import logging import logging.handlers import logging.config @@ -50,6 +49,7 @@ from test.support.logging_helper import TestHandler import textwrap import threading +import asyncio import time import unittest import warnings @@ -4552,29 +4552,63 @@ def test_multiprocessing(self): import multiprocessing def test_optional(self): - r = logging.makeLogRecord({}) + NONE = self.assertIsNone NOT_NONE = self.assertIsNotNone + + r = logging.makeLogRecord({}) NOT_NONE(r.thread) NOT_NONE(r.threadName) NOT_NONE(r.process) NOT_NONE(r.processName) + NONE(r.taskName) log_threads = logging.logThreads log_processes = logging.logProcesses log_multiprocessing = logging.logMultiprocessing + log_asyncio_tasks = logging.logAsyncioTasks try: logging.logThreads = False logging.logProcesses = False logging.logMultiprocessing = False + logging.logAsyncioTasks = False r = logging.makeLogRecord({}) - NONE = self.assertIsNone + NONE(r.thread) NONE(r.threadName) NONE(r.process) NONE(r.processName) + NONE(r.taskName) finally: logging.logThreads = log_threads logging.logProcesses = log_processes logging.logMultiprocessing = log_multiprocessing + logging.logAsyncioTasks = log_asyncio_tasks + + async def _make_record_async(self, assertion): + r = logging.makeLogRecord({}) + assertion(r.taskName) + + def test_taskName_with_asyncio_imported(self): + try: + make_record = self._make_record_async + with asyncio.Runner() as runner: + logging.logAsyncioTasks = True + runner.run(make_record(self.assertIsNotNone)) + logging.logAsyncioTasks = False + runner.run(make_record(self.assertIsNone)) + finally: + asyncio.set_event_loop_policy(None) + + def test_taskName_without_asyncio_imported(self): + try: + make_record = self._make_record_async + with asyncio.Runner() as runner, support.swap_item(sys.modules, 'asyncio', None): + logging.logAsyncioTasks = True + runner.run(make_record(self.assertIsNone)) + logging.logAsyncioTasks = False + runner.run(make_record(self.assertIsNone)) + finally: + asyncio.set_event_loop_policy(None) + class BasicConfigTest(unittest.TestCase): @@ -4853,6 +4887,30 @@ def dummy_handle_error(record): # didn't write anything due to the encoding error self.assertEqual(data, r'') + def test_log_taskName(self): + async def log_record(): + logging.warning('hello world') + + try: + encoding = 'utf-8' + logging.basicConfig(filename='test.log', errors='strict', encoding=encoding, + format='%(taskName)s - %(message)s', level=logging.WARNING) + + self.assertEqual(len(logging.root.handlers), 1) + handler = logging.root.handlers[0] + self.assertIsInstance(handler, logging.FileHandler) + + with asyncio.Runner(debug=True) as runner: + logging.logAsyncioTasks = True + runner.run(log_record()) + finally: + asyncio.set_event_loop_policy(None) + handler.close() + with open('test.log', encoding='utf-8') as f: + data = f.read().strip() + os.remove('test.log') + self.assertRegex(data, r'Task-\d+ - hello world') + def _test_log(self, method, level=None): # logging.root has no handlers so basicConfig should be called @@ -5644,7 +5702,7 @@ def test__all__(self): 'logThreads', 'logMultiprocessing', 'logProcesses', 'currentframe', 'PercentStyle', 'StrFormatStyle', 'StringTemplateStyle', 'Filterer', 'PlaceHolder', 'Manager', 'RootLogger', 'root', - 'threading'} + 'threading', 'logAsyncioTasks'} support.check__all__(self, logging, not_exported=not_exported) diff --git a/Misc/NEWS.d/next/Library/2022-05-25-00-21-28.gh-issue-91513.9VyCT4.rst b/Misc/NEWS.d/next/Library/2022-05-25-00-21-28.gh-issue-91513.9VyCT4.rst new file mode 100644 index 0000000000000..f9f93767ed173 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-05-25-00-21-28.gh-issue-91513.9VyCT4.rst @@ -0,0 +1 @@ +Added ``taskName`` attribute to :mod:`logging` module for use with :mod:`asyncio` tasks. From webhook-mailer at python.org Thu May 26 10:07:09 2022 From: webhook-mailer at python.org (vstinner) Date: Thu, 26 May 2022 14:07:09 -0000 Subject: [Python-checkins] test.pythoninfo logs more build info (#93225) Message-ID: https://github.com/python/cpython/commit/06dd26f89f35b6d6ef4b68c169cb6c675af7e4a4 commit: 06dd26f89f35b6d6ef4b68c169cb6c675af7e4a4 branch: main author: Victor Stinner committer: vstinner date: 2022-05-26T16:07:01+02:00 summary: test.pythoninfo logs more build info (#93225) Log also test.support.check_sanitizer() values. files: M Lib/test/pythoninfo.py diff --git a/Lib/test/pythoninfo.py b/Lib/test/pythoninfo.py index eadc87a052c4a..ca57965bcf105 100644 --- a/Lib/test/pythoninfo.py +++ b/Lib/test/pythoninfo.py @@ -10,6 +10,9 @@ import warnings +MS_WINDOWS = (sys.platform == 'win32') + + def normalize_text(text): if text is None: return None @@ -127,13 +130,21 @@ def collect_sys(info_add): encoding = '%s/%s' % (encoding, errors) info_add('sys.%s.encoding' % name, encoding) - # Were we compiled --with-pydebug or with #define Py_DEBUG? + # Were we compiled --with-pydebug? Py_DEBUG = hasattr(sys, 'gettotalrefcount') if Py_DEBUG: text = 'Yes (sys.gettotalrefcount() present)' else: text = 'No (sys.gettotalrefcount() missing)' - info_add('Py_DEBUG', text) + info_add('build.Py_DEBUG', text) + + # Were we compiled --with-trace-refs? + Py_TRACE_REFS = hasattr(sys, 'getobjects') + if Py_TRACE_REFS: + text = 'Yes (sys.getobjects() present)' + else: + text = 'No (sys.getobjects() missing)' + info_add('build.Py_REF_DEBUG', text) def collect_platform(info_add): @@ -455,6 +466,11 @@ def collect_datetime(info_add): def collect_sysconfig(info_add): + # On Windows, sysconfig is not reliable to get macros used + # to build Python + if MS_WINDOWS: + return + import sysconfig for name in ( @@ -488,6 +504,28 @@ def collect_sysconfig(info_add): value = normalize_text(value) info_add('sysconfig[%s]' % name, value) + PY_CFLAGS = sysconfig.get_config_var('PY_CFLAGS') + NDEBUG = (PY_CFLAGS and '-DNDEBUG' in PY_CFLAGS) + if NDEBUG: + text = 'ignore assertions (macro defined)' + else: + text= 'build assertions (macro not defined)' + info_add('build.NDEBUG',text) + + for name in ( + 'WITH_DOC_STRINGS', + 'WITH_DTRACE', + 'WITH_FREELISTS', + 'WITH_PYMALLOC', + 'WITH_VALGRIND', + ): + value = sysconfig.get_config_var(name) + if value: + text = 'Yes' + else: + text = 'No' + info_add(f'build.{name}', text) + def collect_ssl(info_add): import os @@ -605,7 +643,6 @@ def collect_testcapi(info_add): return call_func(info_add, 'pymem.allocator', _testcapi, 'pymem_getallocatorsname') - copy_attr(info_add, 'pymem.with_pymalloc', _testcapi, 'WITH_PYMALLOC') def collect_resource(info_add): @@ -647,6 +684,13 @@ def collect_test_support(info_add): call_func(info_add, 'test_support._is_gui_available', support, '_is_gui_available') call_func(info_add, 'test_support.python_is_optimized', support, 'python_is_optimized') + info_add('test_support.check_sanitizer(address=True)', + support.check_sanitizer(address=True)) + info_add('test_support.check_sanitizer(memory=True)', + support.check_sanitizer(memory=True)) + info_add('test_support.check_sanitizer(ub=True)', + support.check_sanitizer(ub=True)) + def collect_cc(info_add): import subprocess From webhook-mailer at python.org Thu May 26 10:31:44 2022 From: webhook-mailer at python.org (merwok) Date: Thu, 26 May 2022 14:31:44 -0000 Subject: [Python-checkins] gh-93217: fix some issues in man page and --help (#93219) Message-ID: https://github.com/python/cpython/commit/da397194832c4b8db8446af42919d8ad47b3cb4a commit: da397194832c4b8db8446af42919d8ad47b3cb4a branch: main author: ?ric committer: merwok date: 2022-05-26T10:31:39-04:00 summary: gh-93217: fix some issues in man page and --help (#93219) files: M Misc/python.man M Python/initconfig.c diff --git a/Misc/python.man b/Misc/python.man index 69dab58a9aac2..c6628fe75f40f 100644 --- a/Misc/python.man +++ b/Misc/python.man @@ -69,10 +69,10 @@ python \- an interpreted, interactive, object-oriented programming language .B \-x ] [ -[ .B \-X .I option ] +[ .B \-? ] .br @@ -310,7 +310,8 @@ Set implementation specific option. The following options are available: more verbose than the default if the code is correct: new warnings are only emitted when an issue is detected. Effect of the developer mode: * Add default warning filter, as -W default - * Install debug hooks on memory allocators: see the PyMem_SetupDebugHooks() C function + * Install debug hooks on memory allocators: see the PyMem_SetupDebugHooks() + C function * Enable the faulthandler module to dump the Python traceback on a crash * Enable asyncio debug mode * Set the dev_mode attribute of sys.flags to True @@ -321,7 +322,19 @@ Set implementation specific option. The following options are available: otherwise activate automatically). See PYTHONUTF8 for more details -X pycache_prefix=PATH: enable writing .pyc files to a parallel tree rooted at the - given directory instead of to the code tree. + given directory instead of to the code tree. + + -X warn_default_encoding: enable opt-in EncodingWarning for 'encoding=None' + + -X no_debug_ranges: disable the inclusion of the tables mapping extra location + information (end line, start column offset and end column offset) to every + instruction in code objects. This is useful when smaller code objects and pyc + files are desired as well as suppressing the extra visual location indicators + when the interpreter displays tracebacks. + + -X frozen_modules=[on|off]: whether or not frozen modules should be used + The default is "on" (or "off" if you are running a local build). + .TP .B \-x Skip the first line of the source. This is intended for a DOS diff --git a/Python/initconfig.c b/Python/initconfig.c index a623973f95373..5c9c7ee41e753 100644 --- a/Python/initconfig.c +++ b/Python/initconfig.c @@ -38,7 +38,7 @@ Options and arguments (and corresponding environment variables):\n\ -d : turn on parser debugging output (for experts only, only works on\n\ debug builds); also PYTHONDEBUG=x\n\ -E : ignore PYTHON* environment variables (such as PYTHONPATH)\n\ --h : print this help message and exit (also --help)\n\ +-h : print this help message and exit (also -? or --help)\n\ "; static const char usage_2[] = "\ -i : inspect interactively after running script; forces a prompt even\n\ @@ -65,7 +65,6 @@ static const char usage_3[] = "\ also PYTHONWARNINGS=arg\n\ -x : skip first line of source, allowing use of non-Unix forms of #!cmd\n\ -X opt : set implementation-specific option. The following options are available:\n\ -\n\ -X faulthandler: enable faulthandler\n\ -X showrefcount: output the total reference count and number of used\n\ memory blocks when the program finishes or after each statement in the\n\ @@ -82,7 +81,8 @@ static const char usage_3[] = "\ checks which are too expensive to be enabled by default. Effect of the\n\ developer mode:\n\ * Add default warning filter, as -W default\n\ - * Install debug hooks on memory allocators: see the PyMem_SetupDebugHooks() C function\n\ + * Install debug hooks on memory allocators: see the PyMem_SetupDebugHooks()\n\ + C function\n\ * Enable the faulthandler module to dump the Python traceback on a crash\n\ * Enable asyncio debug mode\n\ * Set the dev_mode attribute of sys.flags to True\n\ @@ -100,7 +100,6 @@ static const char usage_3[] = "\ when the interpreter displays tracebacks.\n\ -X frozen_modules=[on|off]: whether or not frozen modules should be used.\n\ The default is \"on\" (or \"off\" if you are running a local build).\n\ -\n\ --check-hash-based-pycs always|default|never:\n\ control how Python invalidates hash-based .pyc files\n\ "; @@ -141,7 +140,7 @@ static const char usage_6[] = "PYTHONNODEBUGRANGES: If this variable is set, it disables the inclusion of the \n" " tables mapping extra location information (end line, start column offset \n" " and end column offset) to every instruction in code objects. This is useful \n" -" when smaller cothe de objects and pyc files are desired as well as suppressing the \n" +" when smaller code objects and pyc files are desired as well as suppressing the \n" " extra visual location indicators when the interpreter displays tracebacks.\n"; #if defined(MS_WINDOWS) From webhook-mailer at python.org Thu May 26 10:34:08 2022 From: webhook-mailer at python.org (miss-islington) Date: Thu, 26 May 2022 14:34:08 -0000 Subject: [Python-checkins] test.pythoninfo logs more build info (GH-93225) Message-ID: https://github.com/python/cpython/commit/9555d779531753e2d91643d23a65eac62bcac20e commit: 9555d779531753e2d91643d23a65eac62bcac20e branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-26T07:33:50-07:00 summary: test.pythoninfo logs more build info (GH-93225) Log also test.support.check_sanitizer() values. (cherry picked from commit 06dd26f89f35b6d6ef4b68c169cb6c675af7e4a4) Co-authored-by: Victor Stinner files: M Lib/test/pythoninfo.py diff --git a/Lib/test/pythoninfo.py b/Lib/test/pythoninfo.py index eadc87a052c4a..ca57965bcf105 100644 --- a/Lib/test/pythoninfo.py +++ b/Lib/test/pythoninfo.py @@ -10,6 +10,9 @@ import warnings +MS_WINDOWS = (sys.platform == 'win32') + + def normalize_text(text): if text is None: return None @@ -127,13 +130,21 @@ def collect_sys(info_add): encoding = '%s/%s' % (encoding, errors) info_add('sys.%s.encoding' % name, encoding) - # Were we compiled --with-pydebug or with #define Py_DEBUG? + # Were we compiled --with-pydebug? Py_DEBUG = hasattr(sys, 'gettotalrefcount') if Py_DEBUG: text = 'Yes (sys.gettotalrefcount() present)' else: text = 'No (sys.gettotalrefcount() missing)' - info_add('Py_DEBUG', text) + info_add('build.Py_DEBUG', text) + + # Were we compiled --with-trace-refs? + Py_TRACE_REFS = hasattr(sys, 'getobjects') + if Py_TRACE_REFS: + text = 'Yes (sys.getobjects() present)' + else: + text = 'No (sys.getobjects() missing)' + info_add('build.Py_REF_DEBUG', text) def collect_platform(info_add): @@ -455,6 +466,11 @@ def collect_datetime(info_add): def collect_sysconfig(info_add): + # On Windows, sysconfig is not reliable to get macros used + # to build Python + if MS_WINDOWS: + return + import sysconfig for name in ( @@ -488,6 +504,28 @@ def collect_sysconfig(info_add): value = normalize_text(value) info_add('sysconfig[%s]' % name, value) + PY_CFLAGS = sysconfig.get_config_var('PY_CFLAGS') + NDEBUG = (PY_CFLAGS and '-DNDEBUG' in PY_CFLAGS) + if NDEBUG: + text = 'ignore assertions (macro defined)' + else: + text= 'build assertions (macro not defined)' + info_add('build.NDEBUG',text) + + for name in ( + 'WITH_DOC_STRINGS', + 'WITH_DTRACE', + 'WITH_FREELISTS', + 'WITH_PYMALLOC', + 'WITH_VALGRIND', + ): + value = sysconfig.get_config_var(name) + if value: + text = 'Yes' + else: + text = 'No' + info_add(f'build.{name}', text) + def collect_ssl(info_add): import os @@ -605,7 +643,6 @@ def collect_testcapi(info_add): return call_func(info_add, 'pymem.allocator', _testcapi, 'pymem_getallocatorsname') - copy_attr(info_add, 'pymem.with_pymalloc', _testcapi, 'WITH_PYMALLOC') def collect_resource(info_add): @@ -647,6 +684,13 @@ def collect_test_support(info_add): call_func(info_add, 'test_support._is_gui_available', support, '_is_gui_available') call_func(info_add, 'test_support.python_is_optimized', support, 'python_is_optimized') + info_add('test_support.check_sanitizer(address=True)', + support.check_sanitizer(address=True)) + info_add('test_support.check_sanitizer(memory=True)', + support.check_sanitizer(memory=True)) + info_add('test_support.check_sanitizer(ub=True)', + support.check_sanitizer(ub=True)) + def collect_cc(info_add): import subprocess From webhook-mailer at python.org Thu May 26 10:53:25 2022 From: webhook-mailer at python.org (miss-islington) Date: Thu, 26 May 2022 14:53:25 -0000 Subject: [Python-checkins] gh-93217: fix some issues in man page and --help (GH-93219) Message-ID: https://github.com/python/cpython/commit/33336e46daff556e3850b75045e33434a8f46378 commit: 33336e46daff556e3850b75045e33434a8f46378 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-26T07:53:20-07:00 summary: gh-93217: fix some issues in man page and --help (GH-93219) (cherry picked from commit da397194832c4b8db8446af42919d8ad47b3cb4a) Co-authored-by: ?ric files: M Misc/python.man M Python/initconfig.c diff --git a/Misc/python.man b/Misc/python.man index c2e7e507e2fd6..f6c28647a4e99 100644 --- a/Misc/python.man +++ b/Misc/python.man @@ -69,10 +69,10 @@ python \- an interpreted, interactive, object-oriented programming language .B \-x ] [ -[ .B \-X .I option ] +[ .B \-? ] .br @@ -310,7 +310,8 @@ Set implementation specific option. The following options are available: more verbose than the default if the code is correct: new warnings are only emitted when an issue is detected. Effect of the developer mode: * Add default warning filter, as -W default - * Install debug hooks on memory allocators: see the PyMem_SetupDebugHooks() C function + * Install debug hooks on memory allocators: see the PyMem_SetupDebugHooks() + C function * Enable the faulthandler module to dump the Python traceback on a crash * Enable asyncio debug mode * Set the dev_mode attribute of sys.flags to True @@ -321,7 +322,19 @@ Set implementation specific option. The following options are available: otherwise activate automatically). See PYTHONUTF8 for more details -X pycache_prefix=PATH: enable writing .pyc files to a parallel tree rooted at the - given directory instead of to the code tree. + given directory instead of to the code tree. + + -X warn_default_encoding: enable opt-in EncodingWarning for 'encoding=None' + + -X no_debug_ranges: disable the inclusion of the tables mapping extra location + information (end line, start column offset and end column offset) to every + instruction in code objects. This is useful when smaller code objects and pyc + files are desired as well as suppressing the extra visual location indicators + when the interpreter displays tracebacks. + + -X frozen_modules=[on|off]: whether or not frozen modules should be used + The default is "on" (or "off" if you are running a local build). + .TP .B \-x Skip the first line of the source. This is intended for a DOS diff --git a/Python/initconfig.c b/Python/initconfig.c index a623973f95373..5c9c7ee41e753 100644 --- a/Python/initconfig.c +++ b/Python/initconfig.c @@ -38,7 +38,7 @@ Options and arguments (and corresponding environment variables):\n\ -d : turn on parser debugging output (for experts only, only works on\n\ debug builds); also PYTHONDEBUG=x\n\ -E : ignore PYTHON* environment variables (such as PYTHONPATH)\n\ --h : print this help message and exit (also --help)\n\ +-h : print this help message and exit (also -? or --help)\n\ "; static const char usage_2[] = "\ -i : inspect interactively after running script; forces a prompt even\n\ @@ -65,7 +65,6 @@ static const char usage_3[] = "\ also PYTHONWARNINGS=arg\n\ -x : skip first line of source, allowing use of non-Unix forms of #!cmd\n\ -X opt : set implementation-specific option. The following options are available:\n\ -\n\ -X faulthandler: enable faulthandler\n\ -X showrefcount: output the total reference count and number of used\n\ memory blocks when the program finishes or after each statement in the\n\ @@ -82,7 +81,8 @@ static const char usage_3[] = "\ checks which are too expensive to be enabled by default. Effect of the\n\ developer mode:\n\ * Add default warning filter, as -W default\n\ - * Install debug hooks on memory allocators: see the PyMem_SetupDebugHooks() C function\n\ + * Install debug hooks on memory allocators: see the PyMem_SetupDebugHooks()\n\ + C function\n\ * Enable the faulthandler module to dump the Python traceback on a crash\n\ * Enable asyncio debug mode\n\ * Set the dev_mode attribute of sys.flags to True\n\ @@ -100,7 +100,6 @@ static const char usage_3[] = "\ when the interpreter displays tracebacks.\n\ -X frozen_modules=[on|off]: whether or not frozen modules should be used.\n\ The default is \"on\" (or \"off\" if you are running a local build).\n\ -\n\ --check-hash-based-pycs always|default|never:\n\ control how Python invalidates hash-based .pyc files\n\ "; @@ -141,7 +140,7 @@ static const char usage_6[] = "PYTHONNODEBUGRANGES: If this variable is set, it disables the inclusion of the \n" " tables mapping extra location information (end line, start column offset \n" " and end column offset) to every instruction in code objects. This is useful \n" -" when smaller cothe de objects and pyc files are desired as well as suppressing the \n" +" when smaller code objects and pyc files are desired as well as suppressing the \n" " extra visual location indicators when the interpreter displays tracebacks.\n"; #if defined(MS_WINDOWS) From webhook-mailer at python.org Thu May 26 12:11:24 2022 From: webhook-mailer at python.org (vsajip) Date: Thu, 26 May 2022 16:11:24 -0000 Subject: [Python-checkins] =?utf-8?q?gh-91513=3A_Tidied_up_a_test_and_did?= =?utf-8?q?_minor_refactoring_around_test_filename_gener=E2=80=A6_=28GH-93?= =?utf-8?q?265=29?= Message-ID: https://github.com/python/cpython/commit/efc5d37671d2b9f31850a9edaa495fadae038759 commit: efc5d37671d2b9f31850a9edaa495fadae038759 branch: main author: Vinay Sajip committer: vsajip date: 2022-05-26T17:11:15+01:00 summary: gh-91513: Tidied up a test and did minor refactoring around test filename gener? (GH-93265) files: M Lib/test/test_logging.py diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py index 07804a2686a14..1c5e8523754ca 100644 --- a/Lib/test/test_logging.py +++ b/Lib/test/test_logging.py @@ -540,6 +540,12 @@ def test_specific_filters(self): handler.removeFilter(garr) +def make_temp_file(*args, **kwargs): + fd, fn = tempfile.mkstemp(*args, **kwargs) + os.close(fd) + return fn + + class HandlerTest(BaseTest): def test_name(self): h = logging.Handler() @@ -554,8 +560,7 @@ def test_builtin_handlers(self): # but we can try instantiating them with various options if sys.platform in ('linux', 'darwin'): for existing in (True, False): - fd, fn = tempfile.mkstemp() - os.close(fd) + fn = make_temp_file() if not existing: os.unlink(fn) h = logging.handlers.WatchedFileHandler(fn, encoding='utf-8', delay=True) @@ -609,8 +614,7 @@ def test_path_objects(self): See Issue #27493. """ - fd, fn = tempfile.mkstemp() - os.close(fd) + fn = make_temp_file() os.unlink(fn) pfn = pathlib.Path(fn) cases = ( @@ -649,8 +653,7 @@ def remove_loop(fname, tries): self.deletion_time = None for delay in (False, True): - fd, fn = tempfile.mkstemp('.log', 'test_logging-3-') - os.close(fd) + fn = make_temp_file('.log', 'test_logging-3-') remover = threading.Thread(target=remove_loop, args=(fn, del_count)) remover.daemon = True remover.start() @@ -1596,8 +1599,7 @@ def cleanup(h1, fn): os.remove(fn) with self.check_no_resource_warning(): - fd, fn = tempfile.mkstemp(".log", "test_logging-X-") - os.close(fd) + fn = make_temp_file(".log", "test_logging-X-") # Replace single backslash with double backslash in windows # to avoid unicode error during string formatting @@ -1782,8 +1784,7 @@ def test_noserver(self): self.root_logger.error('Nor this') def _get_temp_domain_socket(): - fd, fn = tempfile.mkstemp(prefix='test_logging_', suffix='.sock') - os.close(fd) + fn = make_temp_file(prefix='test_logging_', suffix='.sock') # just need a name - file can't be present, or we'll get an # 'address already in use' error. os.remove(fn) @@ -2135,8 +2136,7 @@ class EncodingTest(BaseTest): def test_encoding_plain_file(self): # In Python 2.x, a plain file object is treated as having no encoding. log = logging.getLogger("test") - fd, fn = tempfile.mkstemp(".log", "test_logging-1-") - os.close(fd) + fn = make_temp_file(".log", "test_logging-1-") # the non-ascii data we write to the log. data = "foo\x80" try: @@ -3227,8 +3227,7 @@ def cleanup(h1, fn): os.remove(fn) with self.check_no_resource_warning(): - fd, fn = tempfile.mkstemp(".log", "test_logging-X-") - os.close(fd) + fn = make_temp_file(".log", "test_logging-X-") config = { "version": 1, @@ -4891,10 +4890,14 @@ def test_log_taskName(self): async def log_record(): logging.warning('hello world') + handler = None + log_filename = make_temp_file('.log', 'test-logging-taskname-') + self.addCleanup(os.remove, log_filename) try: encoding = 'utf-8' - logging.basicConfig(filename='test.log', errors='strict', encoding=encoding, - format='%(taskName)s - %(message)s', level=logging.WARNING) + logging.basicConfig(filename=log_filename, errors='strict', + encoding=encoding, level=logging.WARNING, + format='%(taskName)s - %(message)s') self.assertEqual(len(logging.root.handlers), 1) handler = logging.root.handlers[0] @@ -4903,13 +4906,13 @@ async def log_record(): with asyncio.Runner(debug=True) as runner: logging.logAsyncioTasks = True runner.run(log_record()) - finally: - asyncio.set_event_loop_policy(None) - handler.close() - with open('test.log', encoding='utf-8') as f: + with open(log_filename, encoding='utf-8') as f: data = f.read().strip() - os.remove('test.log') self.assertRegex(data, r'Task-\d+ - hello world') + finally: + asyncio.set_event_loop_policy(None) + if handler: + handler.close() def _test_log(self, method, level=None): @@ -5294,8 +5297,7 @@ class BaseFileTest(BaseTest): def setUp(self): BaseTest.setUp(self) - fd, self.fn = tempfile.mkstemp(".log", "test_logging-2-") - os.close(fd) + self.fn = make_temp_file(".log", "test_logging-2-") self.rmfiles = [] def tearDown(self): From webhook-mailer at python.org Thu May 26 18:39:57 2022 From: webhook-mailer at python.org (vstinner) Date: Thu, 26 May 2022 22:39:57 -0000 Subject: [Python-checkins] gh-91924: Optimize unicode_check_encoding_errors() (#93200) Message-ID: https://github.com/python/cpython/commit/5f8c3fb99746b9a7fadd4ec24cc4025b9c5d79d0 commit: 5f8c3fb99746b9a7fadd4ec24cc4025b9c5d79d0 branch: main author: Victor Stinner committer: vstinner date: 2022-05-27T00:39:49+02:00 summary: gh-91924: Optimize unicode_check_encoding_errors() (#93200) Avoid _PyCodec_Lookup() and PyCodec_LookupError() for most common built-in encodings and error handlers to avoid creating a temporary Unicode string object, whereas these encodings and error handlers are known to be valid. files: M Objects/unicodeobject.c diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index e935829072483..3acbf54f1c0b2 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -454,7 +454,14 @@ unicode_check_encoding_errors(const char *encoding, const char *errors) return 0; } - if (encoding != NULL) { + if (encoding != NULL + // Fast path for the most common built-in encodings. Even if the codec + // is cached, _PyCodec_Lookup() decodes the bytes string from UTF-8 to + // create a temporary Unicode string (the key in the cache). + && strcmp(encoding, "utf-8") != 0 + && strcmp(encoding, "utf8") != 0 + && strcmp(encoding, "ascii") != 0) + { PyObject *handler = _PyCodec_Lookup(encoding); if (handler == NULL) { return -1; @@ -462,7 +469,14 @@ unicode_check_encoding_errors(const char *encoding, const char *errors) Py_DECREF(handler); } - if (errors != NULL) { + if (errors != NULL + // Fast path for the most common built-in error handlers. + && strcmp(errors, "strict") != 0 + && strcmp(errors, "ignore") != 0 + && strcmp(errors, "replace") != 0 + && strcmp(errors, "surrogateescape") != 0 + && strcmp(errors, "surrogatepass") != 0) + { PyObject *handler = PyCodec_LookupError(errors); if (handler == NULL) { return -1; From webhook-mailer at python.org Thu May 26 19:12:43 2022 From: webhook-mailer at python.org (vstinner) Date: Thu, 26 May 2022 23:12:43 -0000 Subject: [Python-checkins] gh-92898: Enhance _testcppext test on cast to PyObject* (#93111) Message-ID: https://github.com/python/cpython/commit/20d30ba2ccf9182e4f08db112f428c909148a40b commit: 20d30ba2ccf9182e4f08db112f428c909148a40b branch: main author: Victor Stinner committer: vstinner date: 2022-05-27T01:12:39+02:00 summary: gh-92898: Enhance _testcppext test on cast to PyObject* (#93111) * Add StrongRef class. * Rename and reformat functions of the _Py_CAST() implementation. files: A Misc/NEWS.d/next/C API/2022-05-23-15-22-18.gh-issue-92898.Qjc9d3.rst M Include/pyport.h M Lib/test/_testcppext.cpp diff --git a/Include/pyport.h b/Include/pyport.h index 8e6763789115e..6ea2bba232b3d 100644 --- a/Include/pyport.h +++ b/Include/pyport.h @@ -22,35 +22,33 @@ // _Py_CAST(PyObject*, op) can convert a "const PyObject*" to // "PyObject*". // -// The type argument must not be constant. For example, in C++, -// _Py_CAST(const PyObject*, expr) fails with a compiler error. +// The type argument must not be a constant type. #ifdef __cplusplus # define _Py_STATIC_CAST(type, expr) static_cast(expr) - extern "C++" { -namespace { -template -inline type _Py_reinterpret_cast_impl(expr_type *expr) { - return reinterpret_cast(expr); -} - -template -inline type _Py_reinterpret_cast_impl(expr_type const *expr) { - return reinterpret_cast(const_cast(expr)); -} - -template -inline type _Py_reinterpret_cast_impl(expr_type &expr) { - return static_cast(expr); -} - -template -inline type _Py_reinterpret_cast_impl(expr_type const &expr) { - return static_cast(const_cast(expr)); -} -} // namespace + namespace { + template + inline type _Py_CAST_impl(expr_type *expr) { + return reinterpret_cast(expr); + } + + template + inline type _Py_CAST_impl(expr_type const *expr) { + return reinterpret_cast(const_cast(expr)); + } + + template + inline type _Py_CAST_impl(expr_type &expr) { + return static_cast(expr); + } + + template + inline type _Py_CAST_impl(expr_type const &expr) { + return static_cast(const_cast(expr)); + } + } } -# define _Py_CAST(type, expr) _Py_reinterpret_cast_impl(expr) +# define _Py_CAST(type, expr) _Py_CAST_impl(expr) #else # define _Py_STATIC_CAST(type, expr) ((type)(expr)) diff --git a/Lib/test/_testcppext.cpp b/Lib/test/_testcppext.cpp index f6049eedd0004..eade7ccdaaff7 100644 --- a/Lib/test/_testcppext.cpp +++ b/Lib/test/_testcppext.cpp @@ -23,6 +23,26 @@ _testcppext_add(PyObject *Py_UNUSED(module), PyObject *args) } +// Class to test operator casting an object to PyObject* +class StrongRef +{ +public: + StrongRef(PyObject *obj) : m_obj(obj) { + Py_INCREF(this->m_obj); + } + + ~StrongRef() { + Py_DECREF(this->m_obj); + } + + // Cast to PyObject*: get a borrowed reference + inline operator PyObject*() const { return this->m_obj; } + +private: + PyObject *m_obj; // Strong reference +}; + + static PyObject * test_api_casts(PyObject *Py_UNUSED(module), PyObject *Py_UNUSED(args)) { @@ -30,6 +50,8 @@ test_api_casts(PyObject *Py_UNUSED(module), PyObject *Py_UNUSED(args)) if (obj == nullptr) { return nullptr; } + Py_ssize_t refcnt = Py_REFCNT(obj); + assert(refcnt >= 1); // gh-92138: For backward compatibility, functions of Python C API accepts // "const PyObject*". Check that using it does not emit C++ compiler @@ -38,22 +60,20 @@ test_api_casts(PyObject *Py_UNUSED(module), PyObject *Py_UNUSED(args)) Py_INCREF(const_obj); Py_DECREF(const_obj); PyTypeObject *type = Py_TYPE(const_obj); - assert(Py_REFCNT(const_obj) >= 1); - - struct PyObjectProxy { - PyObject* obj; - operator PyObject *() { return obj; } - } proxy_obj = { obj }; - Py_INCREF(proxy_obj); - Py_DECREF(proxy_obj); - assert(Py_REFCNT(proxy_obj) >= 1); - - + assert(Py_REFCNT(const_obj) == refcnt); assert(type == &PyTuple_Type); assert(PyTuple_GET_SIZE(const_obj) == 2); PyObject *one = PyTuple_GET_ITEM(const_obj, 0); assert(PyLong_AsLong(one) == 1); + // gh-92898: StrongRef doesn't inherit from PyObject but has an operator to + // cast to PyObject*. + StrongRef strong_ref(obj); + assert(Py_TYPE(strong_ref) == &PyTuple_Type); + assert(Py_REFCNT(strong_ref) == (refcnt + 1)); + Py_INCREF(strong_ref); + Py_DECREF(strong_ref); + Py_DECREF(obj); Py_RETURN_NONE; } diff --git a/Misc/NEWS.d/next/C API/2022-05-23-15-22-18.gh-issue-92898.Qjc9d3.rst b/Misc/NEWS.d/next/C API/2022-05-23-15-22-18.gh-issue-92898.Qjc9d3.rst new file mode 100644 index 0000000000000..01eca1db1f18c --- /dev/null +++ b/Misc/NEWS.d/next/C API/2022-05-23-15-22-18.gh-issue-92898.Qjc9d3.rst @@ -0,0 +1,2 @@ +Fix C++ compiler warnings when casting function arguments to ``PyObject*``. +Patch by Serge Guelton. From webhook-mailer at python.org Thu May 26 19:39:49 2022 From: webhook-mailer at python.org (miss-islington) Date: Thu, 26 May 2022 23:39:49 -0000 Subject: [Python-checkins] gh-92898: Enhance _testcppext test on cast to PyObject* (GH-93111) Message-ID: https://github.com/python/cpython/commit/9303a5ac30c3fd4f04881d432b10be894959cfbd commit: 9303a5ac30c3fd4f04881d432b10be894959cfbd branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-26T16:39:28-07:00 summary: gh-92898: Enhance _testcppext test on cast to PyObject* (GH-93111) * Add StrongRef class. * Rename and reformat functions of the _Py_CAST() implementation. (cherry picked from commit 20d30ba2ccf9182e4f08db112f428c909148a40b) Co-authored-by: Victor Stinner files: A Misc/NEWS.d/next/C API/2022-05-23-15-22-18.gh-issue-92898.Qjc9d3.rst M Include/pyport.h M Lib/test/_testcppext.cpp diff --git a/Include/pyport.h b/Include/pyport.h index 086ed4204e4ff..5a9adf162bfd9 100644 --- a/Include/pyport.h +++ b/Include/pyport.h @@ -22,35 +22,33 @@ // _Py_CAST(PyObject*, op) can convert a "const PyObject*" to // "PyObject*". // -// The type argument must not be constant. For example, in C++, -// _Py_CAST(const PyObject*, expr) fails with a compiler error. +// The type argument must not be a constant type. #ifdef __cplusplus # define _Py_STATIC_CAST(type, expr) static_cast(expr) - extern "C++" { -namespace { -template -inline type _Py_reinterpret_cast_impl(expr_type *expr) { - return reinterpret_cast(expr); -} - -template -inline type _Py_reinterpret_cast_impl(expr_type const *expr) { - return reinterpret_cast(const_cast(expr)); -} - -template -inline type _Py_reinterpret_cast_impl(expr_type &expr) { - return static_cast(expr); -} - -template -inline type _Py_reinterpret_cast_impl(expr_type const &expr) { - return static_cast(const_cast(expr)); -} -} // namespace + namespace { + template + inline type _Py_CAST_impl(expr_type *expr) { + return reinterpret_cast(expr); + } + + template + inline type _Py_CAST_impl(expr_type const *expr) { + return reinterpret_cast(const_cast(expr)); + } + + template + inline type _Py_CAST_impl(expr_type &expr) { + return static_cast(expr); + } + + template + inline type _Py_CAST_impl(expr_type const &expr) { + return static_cast(const_cast(expr)); + } + } } -# define _Py_CAST(type, expr) _Py_reinterpret_cast_impl(expr) +# define _Py_CAST(type, expr) _Py_CAST_impl(expr) #else # define _Py_STATIC_CAST(type, expr) ((type)(expr)) diff --git a/Lib/test/_testcppext.cpp b/Lib/test/_testcppext.cpp index f6049eedd0004..eade7ccdaaff7 100644 --- a/Lib/test/_testcppext.cpp +++ b/Lib/test/_testcppext.cpp @@ -23,6 +23,26 @@ _testcppext_add(PyObject *Py_UNUSED(module), PyObject *args) } +// Class to test operator casting an object to PyObject* +class StrongRef +{ +public: + StrongRef(PyObject *obj) : m_obj(obj) { + Py_INCREF(this->m_obj); + } + + ~StrongRef() { + Py_DECREF(this->m_obj); + } + + // Cast to PyObject*: get a borrowed reference + inline operator PyObject*() const { return this->m_obj; } + +private: + PyObject *m_obj; // Strong reference +}; + + static PyObject * test_api_casts(PyObject *Py_UNUSED(module), PyObject *Py_UNUSED(args)) { @@ -30,6 +50,8 @@ test_api_casts(PyObject *Py_UNUSED(module), PyObject *Py_UNUSED(args)) if (obj == nullptr) { return nullptr; } + Py_ssize_t refcnt = Py_REFCNT(obj); + assert(refcnt >= 1); // gh-92138: For backward compatibility, functions of Python C API accepts // "const PyObject*". Check that using it does not emit C++ compiler @@ -38,22 +60,20 @@ test_api_casts(PyObject *Py_UNUSED(module), PyObject *Py_UNUSED(args)) Py_INCREF(const_obj); Py_DECREF(const_obj); PyTypeObject *type = Py_TYPE(const_obj); - assert(Py_REFCNT(const_obj) >= 1); - - struct PyObjectProxy { - PyObject* obj; - operator PyObject *() { return obj; } - } proxy_obj = { obj }; - Py_INCREF(proxy_obj); - Py_DECREF(proxy_obj); - assert(Py_REFCNT(proxy_obj) >= 1); - - + assert(Py_REFCNT(const_obj) == refcnt); assert(type == &PyTuple_Type); assert(PyTuple_GET_SIZE(const_obj) == 2); PyObject *one = PyTuple_GET_ITEM(const_obj, 0); assert(PyLong_AsLong(one) == 1); + // gh-92898: StrongRef doesn't inherit from PyObject but has an operator to + // cast to PyObject*. + StrongRef strong_ref(obj); + assert(Py_TYPE(strong_ref) == &PyTuple_Type); + assert(Py_REFCNT(strong_ref) == (refcnt + 1)); + Py_INCREF(strong_ref); + Py_DECREF(strong_ref); + Py_DECREF(obj); Py_RETURN_NONE; } diff --git a/Misc/NEWS.d/next/C API/2022-05-23-15-22-18.gh-issue-92898.Qjc9d3.rst b/Misc/NEWS.d/next/C API/2022-05-23-15-22-18.gh-issue-92898.Qjc9d3.rst new file mode 100644 index 0000000000000..01eca1db1f18c --- /dev/null +++ b/Misc/NEWS.d/next/C API/2022-05-23-15-22-18.gh-issue-92898.Qjc9d3.rst @@ -0,0 +1,2 @@ +Fix C++ compiler warnings when casting function arguments to ``PyObject*``. +Patch by Serge Guelton. From webhook-mailer at python.org Fri May 27 04:27:55 2022 From: webhook-mailer at python.org (encukou) Date: Fri, 27 May 2022 08:27:55 -0000 Subject: [Python-checkins] gh-60074: add new stable API function PyType_FromMetaclass (GH-93012) Message-ID: https://github.com/python/cpython/commit/5e34b494a08015e9b5a3deade23943bdba284a93 commit: 5e34b494a08015e9b5a3deade23943bdba284a93 branch: main author: Wenzel Jakob committer: encukou date: 2022-05-27T10:27:39+02:00 summary: gh-60074: add new stable API function PyType_FromMetaclass (GH-93012) Added a new stable API function ``PyType_FromMetaclass``, which mirrors the behavior of ``PyType_FromModuleAndSpec`` except that it takes an additional metaclass argument. This is, e.g., useful for language binding tools that need to store additional information in the type object. files: A Misc/NEWS.d/next/Core and Builtins/2022-05-20-13-32-24.gh-issue-93012.e9B-pv.rst M Doc/c-api/type.rst M Doc/c-api/typeobj.rst M Doc/data/stable_abi.dat M Doc/whatsnew/3.12.rst M Include/object.h M Lib/test/test_capi.py M Lib/test/test_stable_abi_ctypes.py M Misc/stable_abi.toml M Modules/_testcapimodule.c M Objects/typeobject.c M PC/python3dll.c diff --git a/Doc/c-api/type.rst b/Doc/c-api/type.rst index d740e4eb0897e..99b3845237d86 100644 --- a/Doc/c-api/type.rst +++ b/Doc/c-api/type.rst @@ -190,11 +190,16 @@ Creating Heap-Allocated Types The following functions and structs are used to create :ref:`heap types `. -.. c:function:: PyObject* PyType_FromModuleAndSpec(PyObject *module, PyType_Spec *spec, PyObject *bases) +.. c:function:: PyObject* PyType_FromMetaclass(PyTypeObject *metaclass, PyObject *module, PyType_Spec *spec, PyObject *bases) - Creates and returns a :ref:`heap type ` from the *spec* + Create and return a :ref:`heap type ` from the *spec* (:const:`Py_TPFLAGS_HEAPTYPE`). + The metaclass *metaclass* is used to construct the resulting type object. + When *metaclass* is ``NULL``, the default :c:type:`PyType_Type` is used + instead. Note that metaclasses that override + :c:member:`~PyTypeObject.tp_new` are not supported. + The *bases* argument can be used to specify base classes; it can either be only one class or a tuple of classes. If *bases* is ``NULL``, the *Py_tp_bases* slot is used instead. @@ -210,6 +215,12 @@ The following functions and structs are used to create This function calls :c:func:`PyType_Ready` on the new type. + .. versionadded:: 3.12 + +.. c:function:: PyObject* PyType_FromModuleAndSpec(PyObject *module, PyType_Spec *spec, PyObject *bases) + + Equivalent to ``PyType_FromMetaclass(NULL, module, spec, bases)``. + .. versionadded:: 3.9 .. versionchanged:: 3.10 @@ -217,15 +228,16 @@ The following functions and structs are used to create The function now accepts a single class as the *bases* argument and ``NULL`` as the ``tp_doc`` slot. + .. c:function:: PyObject* PyType_FromSpecWithBases(PyType_Spec *spec, PyObject *bases) - Equivalent to ``PyType_FromModuleAndSpec(NULL, spec, bases)``. + Equivalent to ``PyType_FromMetaclass(NULL, NULL, spec, bases)``. .. versionadded:: 3.3 .. c:function:: PyObject* PyType_FromSpec(PyType_Spec *spec) - Equivalent to ``PyType_FromSpecWithBases(spec, NULL)``. + Equivalent to ``PyType_FromMetaclass(NULL, NULL, spec, NULL)``. .. c:type:: PyType_Spec diff --git a/Doc/c-api/typeobj.rst b/Doc/c-api/typeobj.rst index b3f371bb9c062..df479046d4aeb 100644 --- a/Doc/c-api/typeobj.rst +++ b/Doc/c-api/typeobj.rst @@ -2071,7 +2071,7 @@ flag set. This is done by filling a :c:type:`PyType_Spec` structure and calling :c:func:`PyType_FromSpec`, :c:func:`PyType_FromSpecWithBases`, -or :c:func:`PyType_FromModuleAndSpec`. +:c:func:`PyType_FromModuleAndSpec`, or :c:func:`PyType_FromMetaclass`. .. _number-structs: diff --git a/Doc/data/stable_abi.dat b/Doc/data/stable_abi.dat index 3912a7c1242de..82cd5796efd27 100644 --- a/Doc/data/stable_abi.dat +++ b/Doc/data/stable_abi.dat @@ -653,6 +653,7 @@ function,PyTuple_Size,3.2,, var,PyTuple_Type,3.2,, type,PyTypeObject,3.2,,opaque function,PyType_ClearCache,3.2,, +function,PyType_FromMetaclass,3.12,, function,PyType_FromModuleAndSpec,3.10,, function,PyType_FromSpec,3.2,, function,PyType_FromSpecWithBases,3.3,, diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst index 033de1780b3d1..fd487848f09a3 100644 --- a/Doc/whatsnew/3.12.rst +++ b/Doc/whatsnew/3.12.rst @@ -151,6 +151,11 @@ C API Changes New Features ------------ +* Added the new limited C API function :c:func:`PyType_FromMetaclass`, + which generalizes the existing :c:func:`PyType_FromModuleAndSpec` using + an additional metaclass argument. + (Contributed by Wenzel Jakob in :gh:`93012`.) + Porting to Python 3.12 ---------------------- diff --git a/Include/object.h b/Include/object.h index f01b9fa86d014..a3c6bd4fa984d 100644 --- a/Include/object.h +++ b/Include/object.h @@ -257,6 +257,9 @@ PyAPI_FUNC(void *) PyType_GetModuleState(PyTypeObject *); PyAPI_FUNC(PyObject *) PyType_GetName(PyTypeObject *); PyAPI_FUNC(PyObject *) PyType_GetQualName(PyTypeObject *); #endif +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030C0000 +PyAPI_FUNC(PyObject *) PyType_FromMetaclass(PyTypeObject*, PyObject*, PyType_Spec*, PyObject*); +#endif /* Generic type check */ PyAPI_FUNC(int) PyType_IsSubtype(PyTypeObject *, PyTypeObject *); diff --git a/Lib/test/test_capi.py b/Lib/test/test_capi.py index 49cd82108c92c..95930ba40ceb5 100644 --- a/Lib/test/test_capi.py +++ b/Lib/test/test_capi.py @@ -605,6 +605,19 @@ def test_heaptype_with_setattro(self): del obj.value self.assertEqual(obj.pvalue, 0) + def test_heaptype_with_custom_metaclass(self): + self.assertTrue(issubclass(_testcapi.HeapCTypeMetaclass, type)) + self.assertTrue(issubclass(_testcapi.HeapCTypeMetaclassCustomNew, type)) + + t = _testcapi.pytype_fromspec_meta(_testcapi.HeapCTypeMetaclass) + self.assertIsInstance(t, type) + self.assertEqual(t.__name__, "HeapCTypeViaMetaclass") + self.assertIs(type(t), _testcapi.HeapCTypeMetaclass) + + msg = "Metaclasses with custom tp_new are not supported." + with self.assertRaisesRegex(TypeError, msg): + t = _testcapi.pytype_fromspec_meta(_testcapi.HeapCTypeMetaclassCustomNew) + def test_pynumber_tobase(self): from _testcapi import pynumber_tobase self.assertEqual(pynumber_tobase(123, 2), '0b1111011') diff --git a/Lib/test/test_stable_abi_ctypes.py b/Lib/test/test_stable_abi_ctypes.py index 18c85061ca089..53e93ab6b9b4c 100644 --- a/Lib/test/test_stable_abi_ctypes.py +++ b/Lib/test/test_stable_abi_ctypes.py @@ -660,6 +660,7 @@ def test_windows_feature_macros(self): "PyTuple_Size", "PyTuple_Type", "PyType_ClearCache", + "PyType_FromMetaclass", "PyType_FromModuleAndSpec", "PyType_FromSpec", "PyType_FromSpecWithBases", diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-20-13-32-24.gh-issue-93012.e9B-pv.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-20-13-32-24.gh-issue-93012.e9B-pv.rst new file mode 100644 index 0000000000000..8de0f000647dc --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-05-20-13-32-24.gh-issue-93012.e9B-pv.rst @@ -0,0 +1,8 @@ +Added the new function :c:func:`PyType_FromMetaclass`, which generalizes the +existing :c:func:`PyType_FromModuleAndSpec` using an additional metaclass +argument. This is useful for language binding tools, where it can be used to +intercept type-related operations like subclassing or static attribute access +by specifying a metaclass with custom slots. + +Importantly, :c:func:`PyType_FromMetaclass` is available in the Limited API, +which provides a path towards migrating more binding tools onto the Stable ABI. diff --git a/Misc/stable_abi.toml b/Misc/stable_abi.toml index d848f18d68ff6..84bec82709605 100644 --- a/Misc/stable_abi.toml +++ b/Misc/stable_abi.toml @@ -2275,3 +2275,5 @@ added = '3.11' [function.PyErr_SetHandledException] added = '3.11' +[function.PyType_FromMetaclass] + added = '3.12' diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index 3bc776140aaba..37f4ded8001c6 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -308,6 +308,32 @@ test_dict_inner(int count) } } +static PyObject *pytype_fromspec_meta(PyObject* self, PyObject *meta) +{ + if (!PyType_Check(meta)) { + PyErr_SetString( + TestError, + "pytype_fromspec_meta: must be invoked with a type argument!"); + return NULL; + } + + PyType_Slot HeapCTypeViaMetaclass_slots[] = { + {0}, + }; + + PyType_Spec HeapCTypeViaMetaclass_spec = { + "_testcapi.HeapCTypeViaMetaclass", + sizeof(PyObject), + 0, + Py_TPFLAGS_DEFAULT, + HeapCTypeViaMetaclass_slots + }; + + return PyType_FromMetaclass( + (PyTypeObject *) meta, NULL, &HeapCTypeViaMetaclass_spec, NULL); +} + + static PyObject* test_dict_iteration(PyObject* self, PyObject *Py_UNUSED(ignored)) { @@ -5886,6 +5912,7 @@ static PyMethodDef TestMethods[] = { {"test_long_numbits", test_long_numbits, METH_NOARGS}, {"test_k_code", test_k_code, METH_NOARGS}, {"test_empty_argparse", test_empty_argparse, METH_NOARGS}, + {"pytype_fromspec_meta", pytype_fromspec_meta, METH_O}, {"parse_tuple_and_keywords", parse_tuple_and_keywords, METH_VARARGS}, {"pyobject_repr_from_null", pyobject_repr_from_null, METH_NOARGS}, {"pyobject_str_from_null", pyobject_str_from_null, METH_NOARGS}, @@ -7078,6 +7105,38 @@ static PyType_Spec HeapCTypeSubclassWithFinalizer_spec = { HeapCTypeSubclassWithFinalizer_slots }; +static PyType_Slot HeapCTypeMetaclass_slots[] = { + {0}, +}; + +static PyType_Spec HeapCTypeMetaclass_spec = { + "_testcapi.HeapCTypeMetaclass", + sizeof(PyHeapTypeObject), + sizeof(PyMemberDef), + Py_TPFLAGS_DEFAULT, + HeapCTypeMetaclass_slots +}; + +static PyObject * +heap_ctype_metaclass_custom_tp_new(PyTypeObject *tp, PyObject *args, PyObject *kwargs) +{ + return PyType_Type.tp_new(tp, args, kwargs); +} + +static PyType_Slot HeapCTypeMetaclassCustomNew_slots[] = { + { Py_tp_new, heap_ctype_metaclass_custom_tp_new }, + {0}, +}; + +static PyType_Spec HeapCTypeMetaclassCustomNew_spec = { + "_testcapi.HeapCTypeMetaclassCustomNew", + sizeof(PyHeapTypeObject), + sizeof(PyMemberDef), + Py_TPFLAGS_DEFAULT, + HeapCTypeMetaclassCustomNew_slots +}; + + typedef struct { PyObject_HEAD PyObject *dict; @@ -7591,6 +7650,20 @@ PyInit__testcapi(void) Py_DECREF(subclass_with_finalizer_bases); PyModule_AddObject(m, "HeapCTypeSubclassWithFinalizer", HeapCTypeSubclassWithFinalizer); + PyObject *HeapCTypeMetaclass = PyType_FromMetaclass( + &PyType_Type, m, &HeapCTypeMetaclass_spec, (PyObject *) &PyType_Type); + if (HeapCTypeMetaclass == NULL) { + return NULL; + } + PyModule_AddObject(m, "HeapCTypeMetaclass", HeapCTypeMetaclass); + + PyObject *HeapCTypeMetaclassCustomNew = PyType_FromMetaclass( + &PyType_Type, m, &HeapCTypeMetaclassCustomNew_spec, (PyObject *) &PyType_Type); + if (HeapCTypeMetaclassCustomNew == NULL) { + return NULL; + } + PyModule_AddObject(m, "HeapCTypeMetaclassCustomNew", HeapCTypeMetaclassCustomNew); + if (PyType_Ready(&ContainerNoGC_type) < 0) { return NULL; } diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 1daf2b8d3b0ff..ff5196c904eef 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -3366,13 +3366,8 @@ static const PySlot_Offset pyslot_offsets[] = { }; PyObject * -PyType_FromSpecWithBases(PyType_Spec *spec, PyObject *bases) -{ - return PyType_FromModuleAndSpec(NULL, spec, bases); -} - -PyObject * -PyType_FromModuleAndSpec(PyObject *module, PyType_Spec *spec, PyObject *bases) +PyType_FromMetaclass(PyTypeObject *metaclass, PyObject *module, + PyType_Spec *spec, PyObject *bases) { PyHeapTypeObject *res; PyObject *modname; @@ -3384,6 +3379,16 @@ PyType_FromModuleAndSpec(PyObject *module, PyType_Spec *spec, PyObject *bases) char *res_start; short slot_offset, subslot_offset; + if (!metaclass) { + metaclass = &PyType_Type; + } + + if (metaclass->tp_new != PyType_Type.tp_new) { + PyErr_SetString(PyExc_TypeError, + "Metaclasses with custom tp_new are not supported."); + return NULL; + } + nmembers = weaklistoffset = dictoffset = vectorcalloffset = 0; for (slot = spec->slots; slot->slot; slot++) { if (slot->slot == Py_tp_members) { @@ -3412,7 +3417,7 @@ PyType_FromModuleAndSpec(PyObject *module, PyType_Spec *spec, PyObject *bases) } } - res = (PyHeapTypeObject*)PyType_GenericAlloc(&PyType_Type, nmembers); + res = (PyHeapTypeObject*)metaclass->tp_alloc(metaclass, nmembers); if (res == NULL) return NULL; res_start = (char*)res; @@ -3639,10 +3644,22 @@ PyType_FromModuleAndSpec(PyObject *module, PyType_Spec *spec, PyObject *bases) return NULL; } +PyObject * +PyType_FromModuleAndSpec(PyObject *module, PyType_Spec *spec, PyObject *bases) +{ + return PyType_FromMetaclass(NULL, module, spec, bases); +} + +PyObject * +PyType_FromSpecWithBases(PyType_Spec *spec, PyObject *bases) +{ + return PyType_FromMetaclass(NULL, NULL, spec, bases); +} + PyObject * PyType_FromSpec(PyType_Spec *spec) { - return PyType_FromSpecWithBases(spec, NULL); + return PyType_FromMetaclass(NULL, NULL, spec, NULL); } PyObject * diff --git a/PC/python3dll.c b/PC/python3dll.c index 50e7a9607bec9..024ec49d68d79 100755 --- a/PC/python3dll.c +++ b/PC/python3dll.c @@ -599,6 +599,7 @@ EXPORT_FUNC(PyTuple_Pack) EXPORT_FUNC(PyTuple_SetItem) EXPORT_FUNC(PyTuple_Size) EXPORT_FUNC(PyType_ClearCache) +EXPORT_FUNC(PyType_FromMetaclass) EXPORT_FUNC(PyType_FromModuleAndSpec) EXPORT_FUNC(PyType_FromSpec) EXPORT_FUNC(PyType_FromSpecWithBases) From webhook-mailer at python.org Fri May 27 06:18:35 2022 From: webhook-mailer at python.org (markshannon) Date: Fri, 27 May 2022 10:18:35 -0000 Subject: [Python-checkins] gh-93223: More aggressive Jump-To-Jump elimination (GH-93229) Message-ID: https://github.com/python/cpython/commit/ddc4a782d3f32efbc03c69ddd59b6fa10911bcd9 commit: ddc4a782d3f32efbc03c69ddd59b6fa10911bcd9 branch: main author: Dennis Sweeney <36520290+sweeneyde at users.noreply.github.com> committer: markshannon date: 2022-05-27T11:17:59+01:00 summary: gh-93223: More aggressive Jump-To-Jump elimination (GH-93229) files: A Misc/NEWS.d/next/Core and Builtins/2022-05-25-21-56-25.gh-issue-93223.gTOGVZ.rst M Lib/test/test_dis.py M Lib/test/test_peepholer.py M Python/compile.c diff --git a/Lib/test/test_dis.py b/Lib/test/test_dis.py index a19cf49e658ec..c5b80b72f8395 100644 --- a/Lib/test/test_dis.py +++ b/Lib/test/test_dis.py @@ -1378,7 +1378,7 @@ def _prepare_test_cases(): Instruction(opname='LOAD_CONST', opcode=100, arg=1, argval=10, argrepr='10', offset=14, starts_line=None, is_jump_target=False, positions=None), Instruction(opname='CALL', opcode=171, arg=1, argval=1, argrepr='', offset=16, starts_line=None, is_jump_target=False, positions=None), Instruction(opname='GET_ITER', opcode=68, arg=None, argval=None, argrepr='', offset=26, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='FOR_ITER', opcode=93, arg=30, argval=90, argrepr='to 90', offset=28, starts_line=None, is_jump_target=True, positions=None), + Instruction(opname='FOR_ITER', opcode=93, arg=29, argval=88, argrepr='to 88', offset=28, starts_line=None, is_jump_target=True, positions=None), Instruction(opname='STORE_FAST', opcode=125, arg=0, argval='i', argrepr='i', offset=30, starts_line=None, is_jump_target=False, positions=None), Instruction(opname='LOAD_GLOBAL', opcode=116, arg=3, argval='print', argrepr='NULL + print', offset=32, starts_line=4, is_jump_target=False, positions=None), Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=44, starts_line=None, is_jump_target=False, positions=None), @@ -1392,100 +1392,99 @@ def _prepare_test_cases(): Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=72, starts_line=7, is_jump_target=True, positions=None), Instruction(opname='LOAD_CONST', opcode=100, arg=3, argval=6, argrepr='6', offset=74, starts_line=None, is_jump_target=False, positions=None), Instruction(opname='COMPARE_OP', opcode=107, arg=4, argval='>', argrepr='>', offset=76, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_JUMP_FORWARD_IF_FALSE', opcode=114, arg=2, argval=88, argrepr='to 88', offset=82, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_JUMP_BACKWARD_IF_FALSE', opcode=175, arg=28, argval=28, argrepr='to 28', offset=82, starts_line=None, is_jump_target=False, positions=None), Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=84, starts_line=8, is_jump_target=False, positions=None), - Instruction(opname='JUMP_FORWARD', opcode=110, arg=14, argval=116, argrepr='to 116', offset=86, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='JUMP_BACKWARD', opcode=140, arg=31, argval=28, argrepr='to 28', offset=88, starts_line=7, is_jump_target=True, positions=None), - Instruction(opname='LOAD_GLOBAL', opcode=116, arg=3, argval='print', argrepr='NULL + print', offset=90, starts_line=10, is_jump_target=True, positions=None), - Instruction(opname='LOAD_CONST', opcode=100, arg=4, argval='I can haz else clause?', argrepr="'I can haz else clause?'", offset=102, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='CALL', opcode=171, arg=1, argval=1, argrepr='', offset=104, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=114, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=116, starts_line=11, is_jump_target=True, positions=None), - Instruction(opname='POP_JUMP_FORWARD_IF_FALSE', opcode=114, arg=34, argval=188, argrepr='to 188', offset=118, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='LOAD_GLOBAL', opcode=116, arg=3, argval='print', argrepr='NULL + print', offset=120, starts_line=12, is_jump_target=True, positions=None), - Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=132, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='CALL', opcode=171, arg=1, argval=1, argrepr='', offset=134, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=144, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=146, starts_line=13, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=100, arg=5, argval=1, argrepr='1', offset=148, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='BINARY_OP', opcode=122, arg=23, argval=23, argrepr='-=', offset=150, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='STORE_FAST', opcode=125, arg=0, argval='i', argrepr='i', offset=154, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=156, starts_line=14, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=100, arg=3, argval=6, argrepr='6', offset=158, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='COMPARE_OP', opcode=107, arg=4, argval='>', argrepr='>', offset=160, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_JUMP_FORWARD_IF_FALSE', opcode=114, arg=1, argval=170, argrepr='to 170', offset=166, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='JUMP_BACKWARD', opcode=140, arg=27, argval=116, argrepr='to 116', offset=168, starts_line=15, is_jump_target=False, positions=None), - Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=170, starts_line=16, is_jump_target=True, positions=None), - Instruction(opname='LOAD_CONST', opcode=100, arg=2, argval=4, argrepr='4', offset=172, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='COMPARE_OP', opcode=107, arg=0, argval='<', argrepr='<', offset=174, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_JUMP_FORWARD_IF_FALSE', opcode=114, arg=1, argval=184, argrepr='to 184', offset=180, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='JUMP_FORWARD', opcode=110, arg=15, argval=214, argrepr='to 214', offset=182, starts_line=17, is_jump_target=False, positions=None), - Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=184, starts_line=11, is_jump_target=True, positions=None), - Instruction(opname='POP_JUMP_BACKWARD_IF_TRUE', opcode=176, arg=34, argval=120, argrepr='to 120', offset=186, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='LOAD_GLOBAL', opcode=116, arg=3, argval='print', argrepr='NULL + print', offset=188, starts_line=19, is_jump_target=True, positions=None), - Instruction(opname='LOAD_CONST', opcode=100, arg=6, argval='Who let lolcatz into this test suite?', argrepr="'Who let lolcatz into this test suite?'", offset=200, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='CALL', opcode=171, arg=1, argval=1, argrepr='', offset=202, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=212, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='NOP', opcode=9, arg=None, argval=None, argrepr='', offset=214, starts_line=20, is_jump_target=True, positions=None), - Instruction(opname='LOAD_CONST', opcode=100, arg=5, argval=1, argrepr='1', offset=216, starts_line=21, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=100, arg=7, argval=0, argrepr='0', offset=218, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='BINARY_OP', opcode=122, arg=11, argval=11, argrepr='/', offset=220, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=224, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=226, starts_line=25, is_jump_target=False, positions=None), - Instruction(opname='BEFORE_WITH', opcode=53, arg=None, argval=None, argrepr='', offset=228, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='STORE_FAST', opcode=125, arg=1, argval='dodgy', argrepr='dodgy', offset=230, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='LOAD_GLOBAL', opcode=116, arg=3, argval='print', argrepr='NULL + print', offset=232, starts_line=26, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=100, arg=8, argval='Never reach this', argrepr="'Never reach this'", offset=244, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='CALL', opcode=171, arg=1, argval=1, argrepr='', offset=246, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=256, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=258, starts_line=25, is_jump_target=False, positions=None), + Instruction(opname='JUMP_FORWARD', opcode=110, arg=13, argval=114, argrepr='to 114', offset=86, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='LOAD_GLOBAL', opcode=116, arg=3, argval='print', argrepr='NULL + print', offset=88, starts_line=10, is_jump_target=True, positions=None), + Instruction(opname='LOAD_CONST', opcode=100, arg=4, argval='I can haz else clause?', argrepr="'I can haz else clause?'", offset=100, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='CALL', opcode=171, arg=1, argval=1, argrepr='', offset=102, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=112, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=114, starts_line=11, is_jump_target=True, positions=None), + Instruction(opname='POP_JUMP_FORWARD_IF_FALSE', opcode=114, arg=34, argval=186, argrepr='to 186', offset=116, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='LOAD_GLOBAL', opcode=116, arg=3, argval='print', argrepr='NULL + print', offset=118, starts_line=12, is_jump_target=True, positions=None), + Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=130, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='CALL', opcode=171, arg=1, argval=1, argrepr='', offset=132, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=142, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=144, starts_line=13, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=100, arg=5, argval=1, argrepr='1', offset=146, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='BINARY_OP', opcode=122, arg=23, argval=23, argrepr='-=', offset=148, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='STORE_FAST', opcode=125, arg=0, argval='i', argrepr='i', offset=152, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=154, starts_line=14, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=100, arg=3, argval=6, argrepr='6', offset=156, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='COMPARE_OP', opcode=107, arg=4, argval='>', argrepr='>', offset=158, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_JUMP_FORWARD_IF_FALSE', opcode=114, arg=1, argval=168, argrepr='to 168', offset=164, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='JUMP_BACKWARD', opcode=140, arg=27, argval=114, argrepr='to 114', offset=166, starts_line=15, is_jump_target=False, positions=None), + Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=168, starts_line=16, is_jump_target=True, positions=None), + Instruction(opname='LOAD_CONST', opcode=100, arg=2, argval=4, argrepr='4', offset=170, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='COMPARE_OP', opcode=107, arg=0, argval='<', argrepr='<', offset=172, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_JUMP_FORWARD_IF_FALSE', opcode=114, arg=1, argval=182, argrepr='to 182', offset=178, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='JUMP_FORWARD', opcode=110, arg=15, argval=212, argrepr='to 212', offset=180, starts_line=17, is_jump_target=False, positions=None), + Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=182, starts_line=11, is_jump_target=True, positions=None), + Instruction(opname='POP_JUMP_BACKWARD_IF_TRUE', opcode=176, arg=34, argval=118, argrepr='to 118', offset=184, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='LOAD_GLOBAL', opcode=116, arg=3, argval='print', argrepr='NULL + print', offset=186, starts_line=19, is_jump_target=True, positions=None), + Instruction(opname='LOAD_CONST', opcode=100, arg=6, argval='Who let lolcatz into this test suite?', argrepr="'Who let lolcatz into this test suite?'", offset=198, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='CALL', opcode=171, arg=1, argval=1, argrepr='', offset=200, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=210, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='NOP', opcode=9, arg=None, argval=None, argrepr='', offset=212, starts_line=20, is_jump_target=True, positions=None), + Instruction(opname='LOAD_CONST', opcode=100, arg=5, argval=1, argrepr='1', offset=214, starts_line=21, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=100, arg=7, argval=0, argrepr='0', offset=216, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='BINARY_OP', opcode=122, arg=11, argval=11, argrepr='/', offset=218, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=222, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=224, starts_line=25, is_jump_target=False, positions=None), + Instruction(opname='BEFORE_WITH', opcode=53, arg=None, argval=None, argrepr='', offset=226, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='STORE_FAST', opcode=125, arg=1, argval='dodgy', argrepr='dodgy', offset=228, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='LOAD_GLOBAL', opcode=116, arg=3, argval='print', argrepr='NULL + print', offset=230, starts_line=26, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=100, arg=8, argval='Never reach this', argrepr="'Never reach this'", offset=242, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='CALL', opcode=171, arg=1, argval=1, argrepr='', offset=244, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=254, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=256, starts_line=25, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=258, starts_line=None, is_jump_target=False, positions=None), Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=260, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=262, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='CALL', opcode=171, arg=2, argval=2, argrepr='', offset=264, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=274, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='JUMP_FORWARD', opcode=110, arg=11, argval=300, argrepr='to 300', offset=276, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='PUSH_EXC_INFO', opcode=35, arg=None, argval=None, argrepr='', offset=278, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='WITH_EXCEPT_START', opcode=49, arg=None, argval=None, argrepr='', offset=280, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_JUMP_FORWARD_IF_TRUE', opcode=115, arg=4, argval=292, argrepr='to 292', offset=282, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='RERAISE', opcode=119, arg=2, argval=2, argrepr='', offset=284, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='COPY', opcode=120, arg=3, argval=3, argrepr='', offset=286, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=288, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='RERAISE', opcode=119, arg=1, argval=1, argrepr='', offset=290, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=292, starts_line=None, is_jump_target=True, positions=None), - Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=294, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='CALL', opcode=171, arg=2, argval=2, argrepr='', offset=262, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=272, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='JUMP_FORWARD', opcode=110, arg=41, argval=358, argrepr='to 358', offset=274, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='PUSH_EXC_INFO', opcode=35, arg=None, argval=None, argrepr='', offset=276, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='WITH_EXCEPT_START', opcode=49, arg=None, argval=None, argrepr='', offset=278, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_JUMP_FORWARD_IF_TRUE', opcode=115, arg=4, argval=290, argrepr='to 290', offset=280, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='RERAISE', opcode=119, arg=2, argval=2, argrepr='', offset=282, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='COPY', opcode=120, arg=3, argval=3, argrepr='', offset=284, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=286, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='RERAISE', opcode=119, arg=1, argval=1, argrepr='', offset=288, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=290, starts_line=None, is_jump_target=True, positions=None), + Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=292, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=294, starts_line=None, is_jump_target=False, positions=None), Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=296, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=298, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='JUMP_FORWARD', opcode=110, arg=29, argval=360, argrepr='to 360', offset=300, starts_line=None, is_jump_target=True, positions=None), - Instruction(opname='PUSH_EXC_INFO', opcode=35, arg=None, argval=None, argrepr='', offset=302, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='LOAD_GLOBAL', opcode=116, arg=4, argval='ZeroDivisionError', argrepr='ZeroDivisionError', offset=304, starts_line=22, is_jump_target=False, positions=None), - Instruction(opname='CHECK_EXC_MATCH', opcode=36, arg=None, argval=None, argrepr='', offset=316, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_JUMP_FORWARD_IF_FALSE', opcode=114, arg=16, argval=352, argrepr='to 352', offset=318, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=320, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='LOAD_GLOBAL', opcode=116, arg=3, argval='print', argrepr='NULL + print', offset=322, starts_line=23, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=100, arg=9, argval='Here we go, here we go, here we go...', argrepr="'Here we go, here we go, here we go...'", offset=334, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='CALL', opcode=171, arg=1, argval=1, argrepr='', offset=336, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=346, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=348, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='JUMP_FORWARD', opcode=110, arg=4, argval=360, argrepr='to 360', offset=350, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='RERAISE', opcode=119, arg=0, argval=0, argrepr='', offset=352, starts_line=22, is_jump_target=True, positions=None), - Instruction(opname='COPY', opcode=120, arg=3, argval=3, argrepr='', offset=354, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=356, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='RERAISE', opcode=119, arg=1, argval=1, argrepr='', offset=358, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='LOAD_GLOBAL', opcode=116, arg=3, argval='print', argrepr='NULL + print', offset=360, starts_line=28, is_jump_target=True, positions=None), - Instruction(opname='LOAD_CONST', opcode=100, arg=10, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=372, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='CALL', opcode=171, arg=1, argval=1, argrepr='', offset=374, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=384, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=386, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='RETURN_VALUE', opcode=83, arg=None, argval=None, argrepr='', offset=388, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='PUSH_EXC_INFO', opcode=35, arg=None, argval=None, argrepr='', offset=390, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='LOAD_GLOBAL', opcode=116, arg=3, argval='print', argrepr='NULL + print', offset=392, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='LOAD_CONST', opcode=100, arg=10, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=404, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='CALL', opcode=171, arg=1, argval=1, argrepr='', offset=406, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=416, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='RERAISE', opcode=119, arg=0, argval=0, argrepr='', offset=418, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='COPY', opcode=120, arg=3, argval=3, argrepr='', offset=420, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=422, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='RERAISE', opcode=119, arg=1, argval=1, argrepr='', offset=424, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='JUMP_FORWARD', opcode=110, arg=29, argval=358, argrepr='to 358', offset=298, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='PUSH_EXC_INFO', opcode=35, arg=None, argval=None, argrepr='', offset=300, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='LOAD_GLOBAL', opcode=116, arg=4, argval='ZeroDivisionError', argrepr='ZeroDivisionError', offset=302, starts_line=22, is_jump_target=False, positions=None), + Instruction(opname='CHECK_EXC_MATCH', opcode=36, arg=None, argval=None, argrepr='', offset=314, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_JUMP_FORWARD_IF_FALSE', opcode=114, arg=16, argval=350, argrepr='to 350', offset=316, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=318, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='LOAD_GLOBAL', opcode=116, arg=3, argval='print', argrepr='NULL + print', offset=320, starts_line=23, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=100, arg=9, argval='Here we go, here we go, here we go...', argrepr="'Here we go, here we go, here we go...'", offset=332, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='CALL', opcode=171, arg=1, argval=1, argrepr='', offset=334, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=344, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=346, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='JUMP_FORWARD', opcode=110, arg=4, argval=358, argrepr='to 358', offset=348, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='RERAISE', opcode=119, arg=0, argval=0, argrepr='', offset=350, starts_line=22, is_jump_target=True, positions=None), + Instruction(opname='COPY', opcode=120, arg=3, argval=3, argrepr='', offset=352, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=354, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='RERAISE', opcode=119, arg=1, argval=1, argrepr='', offset=356, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='LOAD_GLOBAL', opcode=116, arg=3, argval='print', argrepr='NULL + print', offset=358, starts_line=28, is_jump_target=True, positions=None), + Instruction(opname='LOAD_CONST', opcode=100, arg=10, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=370, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='CALL', opcode=171, arg=1, argval=1, argrepr='', offset=372, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=382, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=384, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='RETURN_VALUE', opcode=83, arg=None, argval=None, argrepr='', offset=386, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='PUSH_EXC_INFO', opcode=35, arg=None, argval=None, argrepr='', offset=388, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='LOAD_GLOBAL', opcode=116, arg=3, argval='print', argrepr='NULL + print', offset=390, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='LOAD_CONST', opcode=100, arg=10, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=402, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='CALL', opcode=171, arg=1, argval=1, argrepr='', offset=404, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=414, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='RERAISE', opcode=119, arg=0, argval=0, argrepr='', offset=416, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='COPY', opcode=120, arg=3, argval=3, argrepr='', offset=418, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=420, starts_line=None, is_jump_target=False, positions=None), + Instruction(opname='RERAISE', opcode=119, arg=1, argval=1, argrepr='', offset=422, starts_line=None, is_jump_target=False, positions=None), ] # One last piece of inspect fodder to check the default line number handling diff --git a/Lib/test/test_peepholer.py b/Lib/test/test_peepholer.py index 6a2f550d67052..dd993851bee92 100644 --- a/Lib/test/test_peepholer.py +++ b/Lib/test/test_peepholer.py @@ -43,11 +43,11 @@ def check_jump_targets(self, code): continue tgt = targets[instr.argval] # jump to unconditional jump - if tgt.opname in ('JUMP_ABSOLUTE', 'JUMP_FORWARD'): + if tgt.opname in ('JUMP_BACKWARD', 'JUMP_FORWARD'): self.fail(f'{instr.opname} at {instr.offset} ' f'jumps to {tgt.opname} at {tgt.offset}') # unconditional jump to RETURN_VALUE - if (instr.opname in ('JUMP_ABSOLUTE', 'JUMP_FORWARD') and + if (instr.opname in ('JUMP_BACKWARD', 'JUMP_FORWARD') and tgt.opname == 'RETURN_VALUE'): self.fail(f'{instr.opname} at {instr.offset} ' f'jumps to {tgt.opname} at {tgt.offset}') @@ -352,7 +352,7 @@ def f(cond, true_value, false_value): else false_value) self.check_jump_targets(f) self.assertNotInBytecode(f, 'JUMP_FORWARD') - self.assertNotInBytecode(f, 'JUMP_ABSOLUTE') + self.assertNotInBytecode(f, 'JUMP_BACKWARD') returns = [instr for instr in dis.get_instructions(f) if instr.opname == 'RETURN_VALUE'] self.assertEqual(len(returns), 2) @@ -372,7 +372,7 @@ def f(): self.check_lnotab(f) def test_elim_jump_to_uncond_jump2(self): - # POP_JUMP_IF_FALSE to JUMP_ABSOLUTE --> POP_JUMP_IF_FALSE to non-jump + # POP_JUMP_IF_FALSE to JUMP_BACKWARD --> POP_JUMP_IF_FALSE to non-jump def f(): while a: # Intentionally use two-line expression to test issue37213. @@ -417,6 +417,13 @@ def f(a, b, c): self.assertInBytecode(f, 'JUMP_IF_FALSE_OR_POP') self.assertInBytecode(f, 'POP_JUMP_FORWARD_IF_TRUE') + def test_elim_jump_to_uncond_jump4(self): + def f(): + for i in range(5): + if i > 3: + print(i) + self.check_jump_targets(f) + def test_elim_jump_after_return1(self): # Eliminate dead code: jumps immediately after returns can't be reached def f(cond1, cond2): @@ -429,7 +436,7 @@ def f(cond1, cond2): return 5 return 6 self.assertNotInBytecode(f, 'JUMP_FORWARD') - self.assertNotInBytecode(f, 'JUMP_ABSOLUTE') + self.assertNotInBytecode(f, 'JUMP_BACKWARD') returns = [instr for instr in dis.get_instructions(f) if instr.opname == 'RETURN_VALUE'] self.assertLessEqual(len(returns), 6) diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-25-21-56-25.gh-issue-93223.gTOGVZ.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-25-21-56-25.gh-issue-93223.gTOGVZ.rst new file mode 100644 index 0000000000000..cac30e11215b4 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-05-25-21-56-25.gh-issue-93223.gTOGVZ.rst @@ -0,0 +1 @@ +When a bytecode instruction jumps to an unconditional jump instruction, the first instruction can often be optimized to target the unconditional jump's target directly. For tracing reasons, this would previously only occur if both instructions have the same line number. This also now occurs if the unconditional jump is artificial, i.e., if it has no associated line number. diff --git a/Python/compile.c b/Python/compile.c index a4738c1f48f2a..d8f859e7533a4 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -8706,7 +8706,7 @@ jump_thread(struct instr *inst, struct instr *target, int opcode) assert(is_jump(target)); // bpo-45773: If inst->i_target == target->i_target, then nothing actually // changes (and we fall into an infinite loop): - if (inst->i_lineno == target->i_lineno && + if ((inst->i_lineno == target->i_lineno || target->i_lineno == -1) && inst->i_target != target->i_target) { inst->i_target = target->i_target; From webhook-mailer at python.org Fri May 27 07:30:53 2022 From: webhook-mailer at python.org (vstinner) Date: Fri, 27 May 2022 11:30:53 -0000 Subject: [Python-checkins] GH-93207: Remove HAVE_STDARG_PROTOTYPES configure check for stdarg.h (#93215) Message-ID: https://github.com/python/cpython/commit/cb04a09d2dfd197436a11de504b92773569e19fb commit: cb04a09d2dfd197436a11de504b92773569e19fb branch: main author: Kumar Aditya <59607654+kumaraditya303 at users.noreply.github.com> committer: vstinner date: 2022-05-27T13:30:45+02:00 summary: GH-93207: Remove HAVE_STDARG_PROTOTYPES configure check for stdarg.h (#93215) files: A Misc/NEWS.d/next/Build/2022-05-25-13-56-00.gh-issue-93207.B9Rubf.rst M Doc/whatsnew/3.12.rst M Modules/_asynciomodule.c M Modules/_hashopenssl.c M Objects/bytesobject.c M Objects/exceptions.c M Objects/unicodeobject.c M PC/pyconfig.h M Parser/tokenizer.c M Python/_warnings.c M Python/compile.c M Python/errors.c M Python/getargs.c M Python/hamt.c M Python/pylifecycle.c M Python/sysmodule.c M configure M configure.ac M pyconfig.h.in diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst index fd487848f09a3..4493476cb0318 100644 --- a/Doc/whatsnew/3.12.rst +++ b/Doc/whatsnew/3.12.rst @@ -144,6 +144,11 @@ Changes in the Python API Build Changes ============= +* ``va_start()`` with two parameters, like ``va_start(args, format),`` + is now required to build Python. + ``va_start()`` is no longer called with a single parameter. + (Contributed by Kumar Aditya in :gh:`93207`.) + C API Changes ============= diff --git a/Misc/NEWS.d/next/Build/2022-05-25-13-56-00.gh-issue-93207.B9Rubf.rst b/Misc/NEWS.d/next/Build/2022-05-25-13-56-00.gh-issue-93207.B9Rubf.rst new file mode 100644 index 0000000000000..cd462bb232f04 --- /dev/null +++ b/Misc/NEWS.d/next/Build/2022-05-25-13-56-00.gh-issue-93207.B9Rubf.rst @@ -0,0 +1,3 @@ +``va_start()`` with two parameters, like ``va_start(args, format),`` +is now required to build Python. ``va_start()`` is no longer called with a single parameter. +Patch by Kumar Aditya. diff --git a/Modules/_asynciomodule.c b/Modules/_asynciomodule.c index 5fa722305757d..c2b0e242e277f 100644 --- a/Modules/_asynciomodule.c +++ b/Modules/_asynciomodule.c @@ -2643,11 +2643,7 @@ task_set_error_soon(TaskObj *task, PyObject *et, const char *format, ...) PyObject* msg; va_list vargs; -#ifdef HAVE_STDARG_PROTOTYPES va_start(vargs, format); -#else - va_start(vargs); -#endif msg = PyUnicode_FromFormatV(format, vargs); va_end(vargs); diff --git a/Modules/_hashopenssl.c b/Modules/_hashopenssl.c index 203366e380d4e..38776edf5f9fd 100644 --- a/Modules/_hashopenssl.c +++ b/Modules/_hashopenssl.c @@ -255,11 +255,7 @@ _setException(PyObject *exc, const char* altmsg, ...) const char *lib, *func, *reason; va_list vargs; -#ifdef HAVE_STDARG_PROTOTYPES va_start(vargs, altmsg); -#else - va_start(vargs); -#endif if (!errcode) { if (altmsg == NULL) { PyErr_SetString(exc, "no reason supplied"); diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c index 1dfa1d57cf65a..80660881920fb 100644 --- a/Objects/bytesobject.c +++ b/Objects/bytesobject.c @@ -377,11 +377,7 @@ PyBytes_FromFormat(const char *format, ...) PyObject* ret; va_list vargs; -#ifdef HAVE_STDARG_PROTOTYPES va_start(vargs, format); -#else - va_start(vargs); -#endif ret = PyBytes_FromFormatV(format, vargs); va_end(vargs); return ret; diff --git a/Objects/exceptions.c b/Objects/exceptions.c index cf8258b0e244b..e212e02352efb 100644 --- a/Objects/exceptions.c +++ b/Objects/exceptions.c @@ -3816,11 +3816,7 @@ _PyErr_TrySetFromCause(const char *format, ...) Py_DECREF(tb); } -#ifdef HAVE_STDARG_PROTOTYPES va_start(vargs, format); -#else - va_start(vargs); -#endif msg_prefix = PyUnicode_FromFormatV(format, vargs); va_end(vargs); if (msg_prefix == NULL) { diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 3acbf54f1c0b2..f712fbfa71d36 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -2708,11 +2708,7 @@ PyUnicode_FromFormat(const char *format, ...) PyObject* ret; va_list vargs; -#ifdef HAVE_STDARG_PROTOTYPES va_start(vargs, format); -#else - va_start(vargs); -#endif ret = PyUnicode_FromFormatV(format, vargs); va_end(vargs); return ret; diff --git a/PC/pyconfig.h b/PC/pyconfig.h index 9dfe71bacabd1..2ddd5847f9c8a 100644 --- a/PC/pyconfig.h +++ b/PC/pyconfig.h @@ -569,9 +569,6 @@ Py_NO_ENABLE_SHARED to find out. Also support MS_NO_COREDLL for b/w compat */ /* Define to 1 if you have the header file. */ #define HAVE_SIGNAL_H 1 -/* Define if you have the prototypes. */ -#define HAVE_STDARG_PROTOTYPES - /* Define if you have the header file. */ #define HAVE_STDDEF_H 1 diff --git a/Parser/tokenizer.c b/Parser/tokenizer.c index b34dade8f6d9b..d5b549c8706ce 100644 --- a/Parser/tokenizer.c +++ b/Parser/tokenizer.c @@ -1105,11 +1105,7 @@ static int syntaxerror(struct tok_state *tok, const char *format, ...) { va_list vargs; -#ifdef HAVE_STDARG_PROTOTYPES va_start(vargs, format); -#else - va_start(vargs); -#endif int ret = _syntaxerror_range(tok, format, -1, -1, vargs); va_end(vargs); return ret; @@ -1121,11 +1117,7 @@ syntaxerror_known_range(struct tok_state *tok, const char *format, ...) { va_list vargs; -#ifdef HAVE_STDARG_PROTOTYPES va_start(vargs, format); -#else - va_start(vargs); -#endif int ret = _syntaxerror_range(tok, format, col_offset, end_col_offset, vargs); va_end(vargs); return ret; @@ -1146,11 +1138,7 @@ parser_warn(struct tok_state *tok, PyObject *category, const char *format, ...) { PyObject *errmsg; va_list vargs; -#ifdef HAVE_STDARG_PROTOTYPES va_start(vargs, format); -#else - va_start(vargs); -#endif errmsg = PyUnicode_FromFormatV(format, vargs); va_end(vargs); if (!errmsg) { diff --git a/Python/_warnings.c b/Python/_warnings.c index 942308b357e33..085ca4506baae 100644 --- a/Python/_warnings.c +++ b/Python/_warnings.c @@ -1136,11 +1136,7 @@ PyErr_WarnFormat(PyObject *category, Py_ssize_t stack_level, int res; va_list vargs; -#ifdef HAVE_STDARG_PROTOTYPES va_start(vargs, format); -#else - va_start(vargs); -#endif res = _PyErr_WarnFormatV(NULL, category, stack_level, format, vargs); va_end(vargs); return res; @@ -1153,11 +1149,7 @@ _PyErr_WarnFormat(PyObject *source, PyObject *category, Py_ssize_t stack_level, int res; va_list vargs; -#ifdef HAVE_STDARG_PROTOTYPES va_start(vargs, format); -#else - va_start(vargs); -#endif res = _PyErr_WarnFormatV(source, category, stack_level, format, vargs); va_end(vargs); return res; @@ -1170,11 +1162,7 @@ PyErr_ResourceWarning(PyObject *source, Py_ssize_t stack_level, int res; va_list vargs; -#ifdef HAVE_STDARG_PROTOTYPES va_start(vargs, format); -#else - va_start(vargs); -#endif res = _PyErr_WarnFormatV(source, PyExc_ResourceWarning, stack_level, format, vargs); va_end(vargs); @@ -1274,11 +1262,7 @@ PyErr_WarnExplicitFormat(PyObject *category, goto exit; } -#ifdef HAVE_STDARG_PROTOTYPES va_start(vargs, format); -#else - va_start(vargs); -#endif message = PyUnicode_FromFormatV(format, vargs); if (message != NULL) { PyObject *res; diff --git a/Python/compile.c b/Python/compile.c index d8f859e7533a4..541fa4c9a12b9 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -6094,11 +6094,7 @@ static int compiler_error(struct compiler *c, const char *format, ...) { va_list vargs; -#ifdef HAVE_STDARG_PROTOTYPES va_start(vargs, format); -#else - va_start(vargs); -#endif PyObject *msg = PyUnicode_FromFormatV(format, vargs); va_end(vargs); if (msg == NULL) { @@ -6131,11 +6127,7 @@ static int compiler_warn(struct compiler *c, const char *format, ...) { va_list vargs; -#ifdef HAVE_STDARG_PROTOTYPES va_start(vargs, format); -#else - va_start(vargs); -#endif PyObject *msg = PyUnicode_FromFormatV(format, vargs); va_end(vargs); if (msg == NULL) { diff --git a/Python/errors.c b/Python/errors.c index 3eb8a5ef04d28..b6b5d9b046ce8 100644 --- a/Python/errors.c +++ b/Python/errors.c @@ -688,11 +688,7 @@ _PyErr_FormatFromCauseTstate(PyThreadState *tstate, PyObject *exception, const char *format, ...) { va_list vargs; -#ifdef HAVE_STDARG_PROTOTYPES va_start(vargs, format); -#else - va_start(vargs); -#endif _PyErr_FormatVFromCause(tstate, exception, format, vargs); va_end(vargs); return NULL; @@ -703,11 +699,7 @@ _PyErr_FormatFromCause(PyObject *exception, const char *format, ...) { PyThreadState *tstate = _PyThreadState_GET(); va_list vargs; -#ifdef HAVE_STDARG_PROTOTYPES va_start(vargs, format); -#else - va_start(vargs); -#endif _PyErr_FormatVFromCause(tstate, exception, format, vargs); va_end(vargs); return NULL; @@ -1096,11 +1088,7 @@ _PyErr_Format(PyThreadState *tstate, PyObject *exception, const char *format, ...) { va_list vargs; -#ifdef HAVE_STDARG_PROTOTYPES va_start(vargs, format); -#else - va_start(vargs); -#endif _PyErr_FormatV(tstate, exception, format, vargs); va_end(vargs); return NULL; @@ -1112,11 +1100,7 @@ PyErr_Format(PyObject *exception, const char *format, ...) { PyThreadState *tstate = _PyThreadState_GET(); va_list vargs; -#ifdef HAVE_STDARG_PROTOTYPES va_start(vargs, format); -#else - va_start(vargs); -#endif _PyErr_FormatV(tstate, exception, format, vargs); va_end(vargs); return NULL; diff --git a/Python/getargs.c b/Python/getargs.c index ed3ffdafe37cd..fb4a5124beab8 100644 --- a/Python/getargs.c +++ b/Python/getargs.c @@ -2792,11 +2792,7 @@ PyArg_UnpackTuple(PyObject *args, const char *name, Py_ssize_t min, Py_ssize_t m stack = _PyTuple_ITEMS(args); nargs = PyTuple_GET_SIZE(args); -#ifdef HAVE_STDARG_PROTOTYPES va_start(vargs, max); -#else - va_start(vargs); -#endif retval = unpack_stack(stack, nargs, name, min, max, vargs); va_end(vargs); return retval; @@ -2809,11 +2805,7 @@ _PyArg_UnpackStack(PyObject *const *args, Py_ssize_t nargs, const char *name, int retval; va_list vargs; -#ifdef HAVE_STDARG_PROTOTYPES va_start(vargs, max); -#else - va_start(vargs); -#endif retval = unpack_stack(args, nargs, name, min, max, vargs); va_end(vargs); return retval; diff --git a/Python/hamt.c b/Python/hamt.c index 908c253187031..3aa31c625824c 100644 --- a/Python/hamt.c +++ b/Python/hamt.c @@ -496,11 +496,7 @@ _hamt_dump_format(_PyUnicodeWriter *writer, const char *format, ...) int ret; va_list vargs; -#ifdef HAVE_STDARG_PROTOTYPES va_start(vargs, format); -#else - va_start(vargs); -#endif msg = PyUnicode_FromFormatV(format, vargs); va_end(vargs); diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 8644b5b68b6c5..42a058181dd69 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -2838,11 +2838,7 @@ _Py_FatalErrorFormat(const char *func, const char *format, ...) } va_list vargs; -#ifdef HAVE_STDARG_PROTOTYPES va_start(vargs, format); -#else - va_start(vargs); -#endif vfprintf(stream, format, vargs); va_end(vargs); diff --git a/Python/sysmodule.c b/Python/sysmodule.c index 4f8b4cc17f2c1..b9cae15568d0f 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -292,11 +292,7 @@ _PySys_Audit(PyThreadState *tstate, const char *event, const char *argFormat, ...) { va_list vargs; -#ifdef HAVE_STDARG_PROTOTYPES va_start(vargs, argFormat); -#else - va_start(vargs); -#endif int res = sys_audit_tstate(tstate, event, argFormat, vargs); va_end(vargs); return res; @@ -307,11 +303,7 @@ PySys_Audit(const char *event, const char *argFormat, ...) { PyThreadState *tstate = _PyThreadState_GET(); va_list vargs; -#ifdef HAVE_STDARG_PROTOTYPES va_start(vargs, argFormat); -#else - va_start(vargs); -#endif int res = sys_audit_tstate(tstate, event, argFormat, vargs); va_end(vargs); return res; diff --git a/configure b/configure index c72fc4afdb9e6..04f0c4e0e8842 100755 --- a/configure +++ b/configure @@ -18416,52 +18416,6 @@ if test "x$ac_cv_function_prototypes" = xyes; then : $as_echo "#define HAVE_PROTOTYPES 1" >>confdefs.h -fi - -works=no -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for variable length prototypes and stdarg.h" >&5 -$as_echo_n "checking for variable length prototypes and stdarg.h... " >&6; } -if ${ac_cv_stdarg_prototypes+:} false; then : - $as_echo_n "(cached) " >&6 -else - -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -#include -int foo(int x, ...) { - va_list va; - va_start(va, x); - va_arg(va, int); - va_arg(va, char *); - va_arg(va, double); - return 0; -} - -int -main () -{ -return foo(10, "", 3.14); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_stdarg_prototypes=yes -else - ac_cv_stdarg_prototypes=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_stdarg_prototypes" >&5 -$as_echo "$ac_cv_stdarg_prototypes" >&6; } -if test "x$ac_cv_stdarg_prototypes" = xyes; then : - - -$as_echo "#define HAVE_STDARG_PROTOTYPES 1" >>confdefs.h - - fi diff --git a/configure.ac b/configure.ac index a8d499df2f16d..9b5926d79d44e 100644 --- a/configure.ac +++ b/configure.ac @@ -1947,7 +1947,7 @@ AS_CASE([$ac_sys_system], dnl build with WASM debug info if either Py_DEBUG is set or the target is dnl node-debug or browser-debug. AS_VAR_IF([Py_DEBUG], [yes], [wasm_debug=yes], [wasm_debug=no]) - + dnl Start with 20 MB and allow to grow AS_VAR_APPEND([LDFLAGS_NODIST], [" -sALLOW_MEMORY_GROWTH -sTOTAL_MEMORY=20971520"]) @@ -5022,27 +5022,6 @@ AS_VAR_IF([ac_cv_function_prototypes], [yes], [ [Define if your compiler supports function prototype]) ]) -works=no -AC_CACHE_CHECK([for variable length prototypes and stdarg.h], [ac_cv_stdarg_prototypes], [ -AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ -#include -int foo(int x, ...) { - va_list va; - va_start(va, x); - va_arg(va, int); - va_arg(va, char *); - va_arg(va, double); - return 0; -} -]], [[return foo(10, "", 3.14);]])], - [ac_cv_stdarg_prototypes=yes], [ac_cv_stdarg_prototypes=no]) -]) -AS_VAR_IF([ac_cv_stdarg_prototypes], [yes], [ - AC_DEFINE(HAVE_STDARG_PROTOTYPES, 1, - [Define if your compiler supports variable length function prototypes - (e.g. void fprintf(FILE *, char *, ...);) *and* ]) -]) - # check for socketpair PY_CHECK_FUNC([socketpair], [ diff --git a/pyconfig.h.in b/pyconfig.h.in index b244ed233d63a..a3bbbb894fd56 100644 --- a/pyconfig.h.in +++ b/pyconfig.h.in @@ -1115,10 +1115,6 @@ /* Define if you have struct stat.st_mtimensec */ #undef HAVE_STAT_TV_NSEC2 -/* Define if your compiler supports variable length function prototypes (e.g. - void fprintf(FILE *, char *, ...);) *and* */ -#undef HAVE_STDARG_PROTOTYPES - /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H From webhook-mailer at python.org Fri May 27 09:05:40 2022 From: webhook-mailer at python.org (vstinner) Date: Fri, 27 May 2022 13:05:40 -0000 Subject: [Python-checkins] gh-82616: Add Py_IS_TYPE_SIGNED() macro (#93178) Message-ID: https://github.com/python/cpython/commit/22b75d9bef1bffe82bfa1adfcbec0243c9202041 commit: 22b75d9bef1bffe82bfa1adfcbec0243c9202041 branch: main author: Victor Stinner committer: vstinner date: 2022-05-27T15:05:35+02:00 summary: gh-82616: Add Py_IS_TYPE_SIGNED() macro (#93178) _posixsubprocess: add a static assertion to ensure that the pid_t type is signed. Replace _Py_IntegralTypeSigned() with _Py_IS_TYPE_SIGNED(). files: M Include/internal/pycore_pymath.h M Include/pymacro.h M Modules/_posixsubprocess.c M Modules/_testcapimodule.c diff --git a/Include/internal/pycore_pymath.h b/Include/internal/pycore_pymath.h index 5c6aee2a23890..5f3afe4df6865 100644 --- a/Include/internal/pycore_pymath.h +++ b/Include/internal/pycore_pymath.h @@ -56,17 +56,13 @@ static inline void _Py_ADJUST_ERANGE2(double x, double y) } } -// Return whether integral type *type* is signed or not. -#define _Py_IntegralTypeSigned(type) \ - ((type)(-1) < 0) - // Return the maximum value of integral type *type*. #define _Py_IntegralTypeMax(type) \ - ((_Py_IntegralTypeSigned(type)) ? (((((type)1 << (sizeof(type)*CHAR_BIT - 2)) - 1) << 1) + 1) : ~(type)0) + (_Py_IS_TYPE_SIGNED(type) ? (((((type)1 << (sizeof(type)*CHAR_BIT - 2)) - 1) << 1) + 1) : ~(type)0) // Return the minimum value of integral type *type*. #define _Py_IntegralTypeMin(type) \ - ((_Py_IntegralTypeSigned(type)) ? -_Py_IntegralTypeMax(type) - 1 : 0) + (_Py_IS_TYPE_SIGNED(type) ? -_Py_IntegralTypeMax(type) - 1 : 0) // Check whether *v* is in the range of integral type *type*. This is most // useful if *v* is floating-point, since demoting a floating-point *v* to an diff --git a/Include/pymacro.h b/Include/pymacro.h index b959eeb3f58b3..0a2c342e2c8ae 100644 --- a/Include/pymacro.h +++ b/Include/pymacro.h @@ -150,4 +150,9 @@ // For example, "int x; _Py_RVALUE(x) = 1;" fails with a compiler error. #define _Py_RVALUE(EXPR) ((void)0, (EXPR)) +// Return non-zero if the type is signed, return zero if it's unsigned. +// Use "<= 0" rather than "< 0" to prevent the compiler warning: +// "comparison of unsigned expression in '< 0' is always false". +#define _Py_IS_TYPE_SIGNED(type) ((type)(-1) <= 0) + #endif /* Py_PYMACRO_H */ diff --git a/Modules/_posixsubprocess.c b/Modules/_posixsubprocess.c index 9132f13e8166a..44e60d7c14954 100644 --- a/Modules/_posixsubprocess.c +++ b/Modules/_posixsubprocess.c @@ -612,8 +612,10 @@ child_exec(char *const exec_array[], #endif #ifdef HAVE_SETPGID - if (pgid_to_set >= 0) + static_assert(_Py_IS_TYPE_SIGNED(pid_t), "pid_t is unsigned"); + if (pgid_to_set >= 0) { POSIX_CALL(setpgid(0, pgid_to_set)); + } #endif #ifdef HAVE_SETGROUPS diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index 37f4ded8001c6..ac0c96a11d3f4 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -5858,6 +5858,20 @@ settrace_to_record(PyObject *self, PyObject *list) Py_RETURN_NONE; } +static PyObject * +test_macros(PyObject *self, PyObject *Py_UNUSED(args)) +{ + // Py_MIN(), Py_MAX() + assert(Py_MIN(5, 11) == 5); + assert(Py_MAX(5, 11) == 11); + + // _Py_IS_TYPE_SIGNED() + assert(_Py_IS_TYPE_SIGNED(int)); + assert(!_Py_IS_TYPE_SIGNED(unsigned int)); + + Py_RETURN_NONE; +} + static PyObject *negative_dictoffset(PyObject *, PyObject *); static PyObject *test_buildvalue_issue38913(PyObject *, PyObject *); static PyObject *getargs_s_hash_int(PyObject *, PyObject *, PyObject*); @@ -6149,6 +6163,7 @@ static PyMethodDef TestMethods[] = { {"get_feature_macros", get_feature_macros, METH_NOARGS, NULL}, {"test_code_api", test_code_api, METH_NOARGS, NULL}, {"settrace_to_record", settrace_to_record, METH_O, NULL}, + {"test_macros", test_macros, METH_NOARGS, NULL}, {NULL, NULL} /* sentinel */ }; From webhook-mailer at python.org Fri May 27 10:16:34 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Fri, 27 May 2022 14:16:34 -0000 Subject: [Python-checkins] gh-77024: test.support: Improve documentation (#92513) Message-ID: https://github.com/python/cpython/commit/8995177030c8b41885ad92b260279b7e622ecaea commit: 8995177030c8b41885ad92b260279b7e622ecaea branch: main author: Jelle Zijlstra committer: JelleZijlstra date: 2022-05-27T07:16:25-07:00 summary: gh-77024: test.support: Improve documentation (#92513) This is a rework of #5774 on current main. I was a bit more conservative in making changes than the original PR. See @csabella's comments on issue #77024 and the discussion on #5774 for explanations of several of the changes. Co-authored-by: Cheryl Sabella Co-authored-by: Alex Waygood files: M Doc/library/test.rst diff --git a/Doc/library/test.rst b/Doc/library/test.rst index 548919cd59785..5c458bf3ec2f2 100644 --- a/Doc/library/test.rst +++ b/Doc/library/test.rst @@ -368,13 +368,19 @@ The :mod:`test.support` module defines the following constants: .. data:: MISSING_C_DOCSTRINGS - Return ``True`` if running on CPython, not on Windows, and configuration - not set with ``WITH_DOC_STRINGS``. + Set to ``True`` if Python is built without docstrings (the + :c:macro:`WITH_DOC_STRINGS` macro is not defined). + See the :option:`configure --without-doc-strings <--without-doc-strings>` option. + + See also the :data:`HAVE_DOCSTRINGS` variable. .. data:: HAVE_DOCSTRINGS - Check for presence of docstrings. + Set to ``True`` if function docstrings are available. + See the :option:`python -OO <-O>` option, which strips docstrings of functions implemented in Python. + + See also the :data:`MISSING_C_DOCSTRINGS` variable. .. data:: TEST_HTTP_URL @@ -432,11 +438,6 @@ The :mod:`test.support` module defines the following functions: Used when tests are executed by :mod:`test.regrtest`. -.. function:: system_must_validate_cert(f) - - Raise :exc:`unittest.SkipTest` on TLS certification validation failures. - - .. function:: sortdict(dict) Return a repr of *dict* with keys sorted. @@ -454,12 +455,12 @@ The :mod:`test.support` module defines the following functions: .. function:: match_test(test) - Match *test* to patterns set in :func:`set_match_tests`. + Determine whether *test* matches the patterns set in :func:`set_match_tests`. -.. function:: set_match_tests(patterns) +.. function:: set_match_tests(accept_patterns=None, ignore_patterns=None) - Define match test with regular expression *patterns*. + Define match patterns on test filenames and test method names for filtering tests. .. function:: run_unittest(*classes) @@ -499,7 +500,9 @@ The :mod:`test.support` module defines the following functions: .. function:: check_impl_detail(**guards) Use this check to guard CPython's implementation-specific tests or to - run them only on the implementations guarded by the arguments:: + run them only on the implementations guarded by the arguments. This + function returns ``True`` or ``False`` depending on the host platform. + Example usage:: check_impl_detail() # Only on CPython (default). check_impl_detail(jython=True) # Only on Jython. @@ -518,7 +521,7 @@ The :mod:`test.support` module defines the following functions: time the regrtest began. -.. function:: get_original_stdout +.. function:: get_original_stdout() Return the original stdout set by :func:`record_original_stdout` or ``sys.stdout`` if it's not set. @@ -563,7 +566,7 @@ The :mod:`test.support` module defines the following functions: .. function:: disable_faulthandler() - A context manager that replaces ``sys.stderr`` with ``sys.__stderr__``. + A context manager that temporary disables :mod:`faulthandler`. .. function:: gc_collect() @@ -576,8 +579,8 @@ The :mod:`test.support` module defines the following functions: .. function:: disable_gc() - A context manager that disables the garbage collector upon entry and - reenables it upon exit. + A context manager that disables the garbage collector on entry. On + exit, the garbage collector is restored to its prior state. .. function:: swap_attr(obj, attr, new_val) @@ -651,14 +654,14 @@ The :mod:`test.support` module defines the following functions: .. function:: calcobjsize(fmt) - Return :func:`struct.calcsize` for ``nP{fmt}0n`` or, if ``gettotalrefcount`` - exists, ``2PnP{fmt}0P``. + Return the size of the :c:type:`PyObject` whose structure members are + defined by *fmt*. The returned value includes the size of the Python object header and alignment. .. function:: calcvobjsize(fmt) - Return :func:`struct.calcsize` for ``nPn{fmt}0n`` or, if ``gettotalrefcount`` - exists, ``2PnPn{fmt}0P``. + Return the size of the :c:type:`PyVarObject` whose structure members are + defined by *fmt*. The returned value includes the size of the Python object header and alignment. .. function:: checksizeof(test, o, size) @@ -674,6 +677,11 @@ The :mod:`test.support` module defines the following functions: have an associated comment identifying the relevant tracker issue. +.. function:: system_must_validate_cert(f) + + A decorator that skips the decorated test on TLS certification validation failures. + + .. decorator:: run_with_locale(catstr, *locales) A decorator for running a function in a different locale, correctly @@ -691,19 +699,19 @@ The :mod:`test.support` module defines the following functions: .. decorator:: requires_freebsd_version(*min_version) Decorator for the minimum version when running test on FreeBSD. If the - FreeBSD version is less than the minimum, raise :exc:`unittest.SkipTest`. + FreeBSD version is less than the minimum, the test is skipped. .. decorator:: requires_linux_version(*min_version) Decorator for the minimum version when running test on Linux. If the - Linux version is less than the minimum, raise :exc:`unittest.SkipTest`. + Linux version is less than the minimum, the test is skipped. .. decorator:: requires_mac_version(*min_version) Decorator for the minimum version when running test on macOS. If the - macOS version is less than the minimum, raise :exc:`unittest.SkipTest`. + macOS version is less than the minimum, the test is skipped. .. decorator:: requires_IEEE_754 @@ -741,7 +749,7 @@ The :mod:`test.support` module defines the following functions: Decorator for only running the test if :data:`HAVE_DOCSTRINGS`. -.. decorator:: cpython_only(test) +.. decorator:: cpython_only Decorator for tests only applicable to CPython. @@ -752,12 +760,12 @@ The :mod:`test.support` module defines the following functions: returns ``False``, then uses *msg* as the reason for skipping the test. -.. decorator:: no_tracing(func) +.. decorator:: no_tracing Decorator to temporarily turn off tracing for the duration of the test. -.. decorator:: refcount_test(test) +.. decorator:: refcount_test Decorator for tests which involve reference counting. The decorator does not run the test if it is not run by CPython. Any trace function is unset @@ -780,10 +788,9 @@ The :mod:`test.support` module defines the following functions: means the test doesn't support dummy runs when ``-M`` is not specified. -.. decorator:: bigaddrspacetest(f) +.. decorator:: bigaddrspacetest - Decorator for tests that fill the address space. *f* is the function to - wrap. + Decorator for tests that fill the address space. .. function:: check_syntax_error(testcase, statement, errtext='', *, lineno=None, offset=None) @@ -885,7 +892,7 @@ The :mod:`test.support` module defines the following functions: .. function:: check_free_after_iterating(test, iter, cls, args=()) - Assert that *iter* is deallocated after iterating. + Assert instances of *cls* are deallocated after iterating. .. function:: missing_compiler_executable(cmd_names=[]) @@ -976,6 +983,16 @@ The :mod:`test.support` module defines the following classes: Class to save and restore signal handlers registered by the Python signal handler. + .. method:: save(self) + + Save the signal handlers to a dictionary mapping signal numbers to the + current signal handler. + + .. method:: restore(self) + + Set the signal numbers from the :meth:`save` dictionary to the saved + handler. + .. class:: Matcher() @@ -1112,11 +1129,11 @@ script execution tests. variables *env_vars* succeeds (``rc == 0``) and return a ``(return code, stdout, stderr)`` tuple. - If the ``__cleanenv`` keyword is set, *env_vars* is used as a fresh + If the *__cleanenv* keyword-only parameter is set, *env_vars* is used as a fresh environment. Python is started in isolated mode (command line option ``-I``), - except if the ``__isolated`` keyword is set to ``False``. + except if the *__isolated* keyword-only parameter is set to ``False``. .. versionchanged:: 3.9 The function no longer strips whitespaces from *stderr*. @@ -1227,15 +1244,17 @@ The :mod:`test.support.threading_helper` module provides support for threading t is still alive after *timeout* seconds. -.. decorator:: reap_threads(func) +.. decorator:: reap_threads Decorator to ensure the threads are cleaned up even if the test fails. .. function:: start_threads(threads, unlock=None) - Context manager to start *threads*. It attempts to join the threads upon - exit. + Context manager to start *threads*, which is a sequence of threads. + *unlock* is a function called after the threads are started, even if an + exception was raised; an example would be :meth:`threading.Event.set`. + ``start_threads`` will attempt to join the started threads upon exit. .. function:: threading_cleanup(*original_values) @@ -1317,7 +1336,10 @@ The :mod:`test.support.os_helper` module provides support for os tests. .. data:: TESTFN_NONASCII - Set to a filename containing the :data:`FS_NONASCII` character. + Set to a filename containing the :data:`FS_NONASCII` character, if it exists. + This guarantees that if the filename exists, it can be encoded and decoded + with the default filesystem encoding. This allows tests that require a + non-ASCII filename to be easily skipped on platforms where they can't work. .. data:: TESTFN_UNENCODABLE @@ -1415,13 +1437,16 @@ The :mod:`test.support.os_helper` module provides support for os tests. .. function:: rmdir(filename) Call :func:`os.rmdir` on *filename*. On Windows platforms, this is - wrapped with a wait loop that checks for the existence of the file. + wrapped with a wait loop that checks for the existence of the file, + which is needed due to antivirus programs that can hold files open and prevent + deletion. .. function:: rmtree(path) Call :func:`shutil.rmtree` on *path* or call :func:`os.lstat` and - :func:`os.rmdir` to remove a path and its contents. On Windows platforms, + :func:`os.rmdir` to remove a path and its contents. As with :func:`rmdir`, + on Windows platforms this is wrapped with a wait loop that checks for the existence of the files. @@ -1468,7 +1493,8 @@ The :mod:`test.support.os_helper` module provides support for os tests. .. function:: unlink(filename) - Call :func:`os.unlink` on *filename*. On Windows platforms, this is + Call :func:`os.unlink` on *filename*. As with :func:`rmdir`, + on Windows platforms, this is wrapped with a wait loop that checks for the existence of the file. @@ -1525,7 +1551,7 @@ The :mod:`test.support.import_helper` module provides support for import tests. .. versionadded:: 3.1 -.. function:: import_module(name, deprecated=False, *, required_on()) +.. function:: import_module(name, deprecated=False, *, required_on=()) This function imports and returns the named module. Unlike a normal import, this function raises :exc:`unittest.SkipTest` if the module @@ -1567,7 +1593,7 @@ The :mod:`test.support.import_helper` module provides support for import tests. A context manager to force import to return a new module reference. This is useful for testing module-level behaviors, such as the emission of a - DeprecationWarning on import. Example usage:: + :exc:`DeprecationWarning` on import. Example usage:: with CleanImport('foo'): importlib.import_module('foo') # New reference. @@ -1575,7 +1601,7 @@ The :mod:`test.support.import_helper` module provides support for import tests. .. class:: DirsOnSysPath(*paths) - A context manager to temporarily add directories to sys.path. + A context manager to temporarily add directories to :data:`sys.path`. This makes a copy of :data:`sys.path`, appends any directories given as positional arguments, then reverts :data:`sys.path` to the copied From webhook-mailer at python.org Fri May 27 10:31:52 2022 From: webhook-mailer at python.org (miss-islington) Date: Fri, 27 May 2022 14:31:52 -0000 Subject: [Python-checkins] gh-77024: test.support: Improve documentation (GH-92513) Message-ID: https://github.com/python/cpython/commit/34bd36c99f0b06bb981f1166664200bcc1d5c5e5 commit: 34bd36c99f0b06bb981f1166664200bcc1d5c5e5 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-27T07:31:35-07:00 summary: gh-77024: test.support: Improve documentation (GH-92513) This is a rework of GH-5774 on current main. I was a bit more conservative in making changes than the original PR. See @csabella's comments on issue GH-77024 and the discussion on GH-5774 for explanations of several of the changes. Co-authored-by: Cheryl Sabella Co-authored-by: Alex Waygood (cherry picked from commit 8995177030c8b41885ad92b260279b7e622ecaea) Co-authored-by: Jelle Zijlstra files: M Doc/library/test.rst diff --git a/Doc/library/test.rst b/Doc/library/test.rst index 699db14596f25..72411007e2452 100644 --- a/Doc/library/test.rst +++ b/Doc/library/test.rst @@ -359,13 +359,19 @@ The :mod:`test.support` module defines the following constants: .. data:: MISSING_C_DOCSTRINGS - Return ``True`` if running on CPython, not on Windows, and configuration - not set with ``WITH_DOC_STRINGS``. + Set to ``True`` if Python is built without docstrings (the + :c:macro:`WITH_DOC_STRINGS` macro is not defined). + See the :option:`configure --without-doc-strings <--without-doc-strings>` option. + + See also the :data:`HAVE_DOCSTRINGS` variable. .. data:: HAVE_DOCSTRINGS - Check for presence of docstrings. + Set to ``True`` if function docstrings are available. + See the :option:`python -OO <-O>` option, which strips docstrings of functions implemented in Python. + + See also the :data:`MISSING_C_DOCSTRINGS` variable. .. data:: TEST_HTTP_URL @@ -423,11 +429,6 @@ The :mod:`test.support` module defines the following functions: Used when tests are executed by :mod:`test.regrtest`. -.. function:: system_must_validate_cert(f) - - Raise :exc:`unittest.SkipTest` on TLS certification validation failures. - - .. function:: sortdict(dict) Return a repr of *dict* with keys sorted. @@ -445,12 +446,12 @@ The :mod:`test.support` module defines the following functions: .. function:: match_test(test) - Match *test* to patterns set in :func:`set_match_tests`. + Determine whether *test* matches the patterns set in :func:`set_match_tests`. -.. function:: set_match_tests(patterns) +.. function:: set_match_tests(accept_patterns=None, ignore_patterns=None) - Define match test with regular expression *patterns*. + Define match patterns on test filenames and test method names for filtering tests. .. function:: run_unittest(*classes) @@ -490,7 +491,9 @@ The :mod:`test.support` module defines the following functions: .. function:: check_impl_detail(**guards) Use this check to guard CPython's implementation-specific tests or to - run them only on the implementations guarded by the arguments:: + run them only on the implementations guarded by the arguments. This + function returns ``True`` or ``False`` depending on the host platform. + Example usage:: check_impl_detail() # Only on CPython (default). check_impl_detail(jython=True) # Only on Jython. @@ -509,7 +512,7 @@ The :mod:`test.support` module defines the following functions: time the regrtest began. -.. function:: get_original_stdout +.. function:: get_original_stdout() Return the original stdout set by :func:`record_original_stdout` or ``sys.stdout`` if it's not set. @@ -554,7 +557,7 @@ The :mod:`test.support` module defines the following functions: .. function:: disable_faulthandler() - A context manager that replaces ``sys.stderr`` with ``sys.__stderr__``. + A context manager that temporary disables :mod:`faulthandler`. .. function:: gc_collect() @@ -567,8 +570,8 @@ The :mod:`test.support` module defines the following functions: .. function:: disable_gc() - A context manager that disables the garbage collector upon entry and - reenables it upon exit. + A context manager that disables the garbage collector on entry. On + exit, the garbage collector is restored to its prior state. .. function:: swap_attr(obj, attr, new_val) @@ -642,14 +645,14 @@ The :mod:`test.support` module defines the following functions: .. function:: calcobjsize(fmt) - Return :func:`struct.calcsize` for ``nP{fmt}0n`` or, if ``gettotalrefcount`` - exists, ``2PnP{fmt}0P``. + Return the size of the :c:type:`PyObject` whose structure members are + defined by *fmt*. The returned value includes the size of the Python object header and alignment. .. function:: calcvobjsize(fmt) - Return :func:`struct.calcsize` for ``nPn{fmt}0n`` or, if ``gettotalrefcount`` - exists, ``2PnPn{fmt}0P``. + Return the size of the :c:type:`PyVarObject` whose structure members are + defined by *fmt*. The returned value includes the size of the Python object header and alignment. .. function:: checksizeof(test, o, size) @@ -665,6 +668,11 @@ The :mod:`test.support` module defines the following functions: have an associated comment identifying the relevant tracker issue. +.. function:: system_must_validate_cert(f) + + A decorator that skips the decorated test on TLS certification validation failures. + + .. decorator:: run_with_locale(catstr, *locales) A decorator for running a function in a different locale, correctly @@ -682,19 +690,19 @@ The :mod:`test.support` module defines the following functions: .. decorator:: requires_freebsd_version(*min_version) Decorator for the minimum version when running test on FreeBSD. If the - FreeBSD version is less than the minimum, raise :exc:`unittest.SkipTest`. + FreeBSD version is less than the minimum, the test is skipped. .. decorator:: requires_linux_version(*min_version) Decorator for the minimum version when running test on Linux. If the - Linux version is less than the minimum, raise :exc:`unittest.SkipTest`. + Linux version is less than the minimum, the test is skipped. .. decorator:: requires_mac_version(*min_version) Decorator for the minimum version when running test on macOS. If the - macOS version is less than the minimum, raise :exc:`unittest.SkipTest`. + macOS version is less than the minimum, the test is skipped. .. decorator:: requires_IEEE_754 @@ -732,7 +740,7 @@ The :mod:`test.support` module defines the following functions: Decorator for only running the test if :data:`HAVE_DOCSTRINGS`. -.. decorator:: cpython_only(test) +.. decorator:: cpython_only Decorator for tests only applicable to CPython. @@ -743,12 +751,12 @@ The :mod:`test.support` module defines the following functions: returns ``False``, then uses *msg* as the reason for skipping the test. -.. decorator:: no_tracing(func) +.. decorator:: no_tracing Decorator to temporarily turn off tracing for the duration of the test. -.. decorator:: refcount_test(test) +.. decorator:: refcount_test Decorator for tests which involve reference counting. The decorator does not run the test if it is not run by CPython. Any trace function is unset @@ -771,10 +779,9 @@ The :mod:`test.support` module defines the following functions: means the test doesn't support dummy runs when ``-M`` is not specified. -.. decorator:: bigaddrspacetest(f) +.. decorator:: bigaddrspacetest - Decorator for tests that fill the address space. *f* is the function to - wrap. + Decorator for tests that fill the address space. .. function:: check_syntax_error(testcase, statement, errtext='', *, lineno=None, offset=None) @@ -876,7 +883,7 @@ The :mod:`test.support` module defines the following functions: .. function:: check_free_after_iterating(test, iter, cls, args=()) - Assert that *iter* is deallocated after iterating. + Assert instances of *cls* are deallocated after iterating. .. function:: missing_compiler_executable(cmd_names=[]) @@ -967,6 +974,16 @@ The :mod:`test.support` module defines the following classes: Class to save and restore signal handlers registered by the Python signal handler. + .. method:: save(self) + + Save the signal handlers to a dictionary mapping signal numbers to the + current signal handler. + + .. method:: restore(self) + + Set the signal numbers from the :meth:`save` dictionary to the saved + handler. + .. class:: Matcher() @@ -1110,11 +1127,11 @@ script execution tests. variables *env_vars* succeeds (``rc == 0``) and return a ``(return code, stdout, stderr)`` tuple. - If the ``__cleanenv`` keyword is set, *env_vars* is used as a fresh + If the *__cleanenv* keyword-only parameter is set, *env_vars* is used as a fresh environment. Python is started in isolated mode (command line option ``-I``), - except if the ``__isolated`` keyword is set to ``False``. + except if the *__isolated* keyword-only parameter is set to ``False``. .. versionchanged:: 3.9 The function no longer strips whitespaces from *stderr*. @@ -1225,15 +1242,17 @@ The :mod:`test.support.threading_helper` module provides support for threading t is still alive after *timeout* seconds. -.. decorator:: reap_threads(func) +.. decorator:: reap_threads Decorator to ensure the threads are cleaned up even if the test fails. .. function:: start_threads(threads, unlock=None) - Context manager to start *threads*. It attempts to join the threads upon - exit. + Context manager to start *threads*, which is a sequence of threads. + *unlock* is a function called after the threads are started, even if an + exception was raised; an example would be :meth:`threading.Event.set`. + ``start_threads`` will attempt to join the started threads upon exit. .. function:: threading_cleanup(*original_values) @@ -1315,7 +1334,10 @@ The :mod:`test.support.os_helper` module provides support for os tests. .. data:: TESTFN_NONASCII - Set to a filename containing the :data:`FS_NONASCII` character. + Set to a filename containing the :data:`FS_NONASCII` character, if it exists. + This guarantees that if the filename exists, it can be encoded and decoded + with the default filesystem encoding. This allows tests that require a + non-ASCII filename to be easily skipped on platforms where they can't work. .. data:: TESTFN_UNENCODABLE @@ -1413,13 +1435,16 @@ The :mod:`test.support.os_helper` module provides support for os tests. .. function:: rmdir(filename) Call :func:`os.rmdir` on *filename*. On Windows platforms, this is - wrapped with a wait loop that checks for the existence of the file. + wrapped with a wait loop that checks for the existence of the file, + which is needed due to antivirus programs that can hold files open and prevent + deletion. .. function:: rmtree(path) Call :func:`shutil.rmtree` on *path* or call :func:`os.lstat` and - :func:`os.rmdir` to remove a path and its contents. On Windows platforms, + :func:`os.rmdir` to remove a path and its contents. As with :func:`rmdir`, + on Windows platforms this is wrapped with a wait loop that checks for the existence of the files. @@ -1466,7 +1491,8 @@ The :mod:`test.support.os_helper` module provides support for os tests. .. function:: unlink(filename) - Call :func:`os.unlink` on *filename*. On Windows platforms, this is + Call :func:`os.unlink` on *filename*. As with :func:`rmdir`, + on Windows platforms, this is wrapped with a wait loop that checks for the existence of the file. @@ -1523,7 +1549,7 @@ The :mod:`test.support.import_helper` module provides support for import tests. .. versionadded:: 3.1 -.. function:: import_module(name, deprecated=False, *, required_on()) +.. function:: import_module(name, deprecated=False, *, required_on=()) This function imports and returns the named module. Unlike a normal import, this function raises :exc:`unittest.SkipTest` if the module @@ -1565,7 +1591,7 @@ The :mod:`test.support.import_helper` module provides support for import tests. A context manager to force import to return a new module reference. This is useful for testing module-level behaviors, such as the emission of a - DeprecationWarning on import. Example usage:: + :exc:`DeprecationWarning` on import. Example usage:: with CleanImport('foo'): importlib.import_module('foo') # New reference. @@ -1573,7 +1599,7 @@ The :mod:`test.support.import_helper` module provides support for import tests. .. class:: DirsOnSysPath(*paths) - A context manager to temporarily add directories to sys.path. + A context manager to temporarily add directories to :data:`sys.path`. This makes a copy of :data:`sys.path`, appends any directories given as positional arguments, then reverts :data:`sys.path` to the copied From webhook-mailer at python.org Fri May 27 11:31:50 2022 From: webhook-mailer at python.org (markshannon) Date: Fri, 27 May 2022 15:31:50 -0000 Subject: [Python-checkins] GH-90230: Add stats to breakdown the origin of calls to `PyEval_EvalFrame` (GH-93284) Message-ID: https://github.com/python/cpython/commit/bbcf42449e13c0b62f145cd49d12674ef3d5bf64 commit: bbcf42449e13c0b62f145cd49d12674ef3d5bf64 branch: main author: Mark Shannon committer: markshannon date: 2022-05-27T16:31:41+01:00 summary: GH-90230: Add stats to breakdown the origin of calls to `PyEval_EvalFrame` (GH-93284) files: M Include/internal/pycore_call.h M Include/internal/pycore_ceval.h M Include/internal/pycore_code.h M Include/pystats.h M Modules/_asynciomodule.c M Objects/call.c M Objects/descrobject.c M Objects/genobject.c M Objects/typeobject.c M Python/bltinmodule.c M Python/ceval.c M Python/specialize.c M Tools/scripts/summarize_stats.py diff --git a/Include/internal/pycore_call.h b/Include/internal/pycore_call.h index 3ccacfa0b8b03..55378e3dfebf2 100644 --- a/Include/internal/pycore_call.h +++ b/Include/internal/pycore_call.h @@ -103,6 +103,7 @@ _PyObject_CallNoArgsTstate(PyThreadState *tstate, PyObject *func) { // Private static inline function variant of public PyObject_CallNoArgs() static inline PyObject * _PyObject_CallNoArgs(PyObject *func) { + EVAL_CALL_STAT_INC_IF_FUNCTION(EVAL_CALL_API, func); PyThreadState *tstate = _PyThreadState_GET(); return _PyObject_VectorcallTstate(tstate, func, NULL, 0, NULL); } @@ -111,6 +112,7 @@ _PyObject_CallNoArgs(PyObject *func) { static inline PyObject * _PyObject_FastCallTstate(PyThreadState *tstate, PyObject *func, PyObject *const *args, Py_ssize_t nargs) { + EVAL_CALL_STAT_INC_IF_FUNCTION(EVAL_CALL_API, func); return _PyObject_VectorcallTstate(tstate, func, args, (size_t)nargs, NULL); } diff --git a/Include/internal/pycore_ceval.h b/Include/internal/pycore_ceval.h index 3efd6beb035a1..972eb926b3fa2 100644 --- a/Include/internal/pycore_ceval.h +++ b/Include/internal/pycore_ceval.h @@ -68,6 +68,7 @@ extern PyObject* _PyEval_BuiltinsFromGlobals( static inline PyObject* _PyEval_EvalFrame(PyThreadState *tstate, struct _PyInterpreterFrame *frame, int throwflag) { + EVAL_CALL_STAT_INC(EVAL_CALL_TOTAL); if (tstate->interp->eval_frame == NULL) { return _PyEval_EvalFrameDefault(tstate, frame, throwflag); } diff --git a/Include/internal/pycore_code.h b/Include/internal/pycore_code.h index 3d19843274112..2cfa319f2d290 100644 --- a/Include/internal/pycore_code.h +++ b/Include/internal/pycore_code.h @@ -265,6 +265,9 @@ extern int _PyStaticCode_InternStrings(PyCodeObject *co); #define OBJECT_STAT_INC(name) _py_stats.object_stats.name++ #define OBJECT_STAT_INC_COND(name, cond) \ do { if (cond) _py_stats.object_stats.name++; } while (0) +#define EVAL_CALL_STAT_INC(name) _py_stats.call_stats.eval_calls[name]++ +#define EVAL_CALL_STAT_INC_IF_FUNCTION(name, callable) \ + do { if (PyFunction_Check(callable)) _py_stats.call_stats.eval_calls[name]++; } while (0) // Used by the _opcode extension which is built as a shared library PyAPI_FUNC(PyObject*) _Py_GetSpecializationStats(void); @@ -276,6 +279,8 @@ PyAPI_FUNC(PyObject*) _Py_GetSpecializationStats(void); #define CALL_STAT_INC(name) ((void)0) #define OBJECT_STAT_INC(name) ((void)0) #define OBJECT_STAT_INC_COND(name, cond) ((void)0) +#define EVAL_CALL_STAT_INC(name) ((void)0) +#define EVAL_CALL_STAT_INC_IF_FUNCTION(name, callable) ((void)0) #endif // !Py_STATS // Cache values are only valid in memory, so use native endianness. diff --git a/Include/pystats.h b/Include/pystats.h index 4375614b05e48..bea471bfc1de9 100644 --- a/Include/pystats.h +++ b/Include/pystats.h @@ -10,6 +10,20 @@ extern "C" { #define SPECIALIZATION_FAILURE_KINDS 32 +/* Stats for determining who is calling PyEval_EvalFrame */ +#define EVAL_CALL_TOTAL 0 +#define EVAL_CALL_VECTOR 1 +#define EVAL_CALL_GENERATOR 2 +#define EVAL_CALL_LEGACY 3 +#define EVAL_CALL_FUNCTION_VECTORCALL 4 +#define EVAL_CALL_BUILD_CLASS 5 +#define EVAL_CALL_SLOT 6 +#define EVAL_CALL_FUNCTION_EX 7 +#define EVAL_CALL_API 8 +#define EVAL_CALL_METHOD 9 + +#define EVAL_CALL_KINDS 10 + typedef struct _specialization_stats { uint64_t success; uint64_t failure; @@ -31,6 +45,7 @@ typedef struct _call_stats { uint64_t pyeval_calls; uint64_t frames_pushed; uint64_t frame_objects_created; + uint64_t eval_calls[EVAL_CALL_KINDS]; } CallStats; typedef struct _object_stats { diff --git a/Modules/_asynciomodule.c b/Modules/_asynciomodule.c index c2b0e242e277f..bb7c5a7c3ec55 100644 --- a/Modules/_asynciomodule.c +++ b/Modules/_asynciomodule.c @@ -384,7 +384,7 @@ call_soon(PyObject *loop, PyObject *func, PyObject *arg, PyObject *ctx) nargs++; } stack[nargs] = (PyObject *)ctx; - + EVAL_CALL_STAT_INC_IF_FUNCTION(EVAL_CALL_API, callable); handle = PyObject_Vectorcall(callable, stack, nargs, context_kwname); Py_DECREF(callable); } @@ -2950,6 +2950,7 @@ task_step_impl(TaskObj *task, PyObject *exc) PyObject *stack[2]; stack[0] = wrapper; stack[1] = (PyObject *)task->task_context; + EVAL_CALL_STAT_INC_IF_FUNCTION(EVAL_CALL_API, add_cb); tmp = PyObject_Vectorcall(add_cb, stack, 1, context_kwname); Py_DECREF(add_cb); Py_DECREF(wrapper); diff --git a/Objects/call.c b/Objects/call.c index 678d16269f216..3b5259b3383f4 100644 --- a/Objects/call.c +++ b/Objects/call.c @@ -109,7 +109,9 @@ _Py_CheckSlotResult(PyObject *obj, const char *slot_name, int success) PyObject * PyObject_CallNoArgs(PyObject *func) { - return _PyObject_CallNoArgs(func); + EVAL_CALL_STAT_INC_IF_FUNCTION(EVAL_CALL_API, func); + PyThreadState *tstate = _PyThreadState_GET(); + return _PyObject_VectorcallTstate(tstate, func, NULL, 0, NULL); } @@ -322,7 +324,7 @@ _PyObject_Call(PyThreadState *tstate, PyObject *callable, assert(!_PyErr_Occurred(tstate)); assert(PyTuple_Check(args)); assert(kwargs == NULL || PyDict_Check(kwargs)); - + EVAL_CALL_STAT_INC_IF_FUNCTION(EVAL_CALL_API, callable); vectorcallfunc vector_func = _PyVectorcall_Function(callable); if (vector_func != NULL) { return _PyVectorcall_Call(tstate, vector_func, callable, args, kwargs); @@ -367,6 +369,7 @@ PyCFunction_Call(PyObject *callable, PyObject *args, PyObject *kwargs) PyObject * PyObject_CallOneArg(PyObject *func, PyObject *arg) { + EVAL_CALL_STAT_INC_IF_FUNCTION(EVAL_CALL_API, func); assert(arg != NULL); PyObject *_args[2]; PyObject **args = _args + 1; // For PY_VECTORCALL_ARGUMENTS_OFFSET @@ -389,6 +392,7 @@ _PyFunction_Vectorcall(PyObject *func, PyObject* const* stack, assert(nargs >= 0); PyThreadState *tstate = _PyThreadState_GET(); assert(nargs == 0 || stack != NULL); + EVAL_CALL_STAT_INC(EVAL_CALL_FUNCTION_VECTORCALL); if (((PyCodeObject *)f->func_code)->co_flags & CO_OPTIMIZED) { return _PyEval_Vector(tstate, f, NULL, stack, nargs, kwnames); } @@ -520,7 +524,7 @@ _PyObject_CallFunctionVa(PyThreadState *tstate, PyObject *callable, if (stack == NULL) { return NULL; } - + EVAL_CALL_STAT_INC_IF_FUNCTION(EVAL_CALL_API, callable); if (nargs == 1 && PyTuple_Check(stack[0])) { /* Special cases for backward compatibility: - PyObject_CallFunction(func, "O", tuple) calls func(*tuple) @@ -815,6 +819,11 @@ object_vacall(PyThreadState *tstate, PyObject *base, stack[i] = va_arg(vargs, PyObject *); } +#ifdef Py_STATS + if (PyFunction_Check(callable)) { + EVAL_CALL_STAT_INC(EVAL_CALL_API); + } +#endif /* Call the function */ result = _PyObject_VectorcallTstate(tstate, callable, stack, nargs, NULL); @@ -852,6 +861,7 @@ PyObject_VectorcallMethod(PyObject *name, PyObject *const *args, args++; nargsf--; } + EVAL_CALL_STAT_INC_IF_FUNCTION(EVAL_CALL_METHOD, callable); PyObject *result = _PyObject_VectorcallTstate(tstate, callable, args, nargsf, kwnames); Py_DECREF(callable); diff --git a/Objects/descrobject.c b/Objects/descrobject.c index c3c541bf3c321..8e8a46ceca6b3 100644 --- a/Objects/descrobject.c +++ b/Objects/descrobject.c @@ -1677,6 +1677,7 @@ property_descr_set(PyObject *self, PyObject *obj, PyObject *value) res = PyObject_CallOneArg(func, obj); } else { + EVAL_CALL_STAT_INC_IF_FUNCTION(EVAL_CALL_API, func); PyObject *args[] = { obj, value }; res = PyObject_Vectorcall(func, args, 2, NULL); } diff --git a/Objects/genobject.c b/Objects/genobject.c index a88522abf414c..2b45e28cbf16d 100644 --- a/Objects/genobject.c +++ b/Objects/genobject.c @@ -13,6 +13,7 @@ #include "pycore_pystate.h" // _PyThreadState_GET() #include "structmember.h" // PyMemberDef #include "opcode.h" // SEND +#include "pystats.h" static PyObject *gen_close(PyGenObject *, PyObject *); static PyObject *async_gen_asend_new(PyAsyncGenObject *, PyObject *); @@ -218,6 +219,7 @@ gen_send_ex2(PyGenObject *gen, PyObject *arg, PyObject **presult, } gen->gi_frame_state = FRAME_EXECUTING; + EVAL_CALL_STAT_INC(EVAL_CALL_GENERATOR); result = _PyEval_EvalFrame(tstate, frame, exc); if (gen->gi_frame_state == FRAME_EXECUTING) { gen->gi_frame_state = FRAME_COMPLETED; diff --git a/Objects/typeobject.c b/Objects/typeobject.c index ff5196c904eef..37ac886f00446 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -1653,6 +1653,7 @@ vectorcall_unbound(PyThreadState *tstate, int unbound, PyObject *func, args++; nargsf = nargsf - 1 + PY_VECTORCALL_ARGUMENTS_OFFSET; } + EVAL_CALL_STAT_INC_IF_FUNCTION(EVAL_CALL_SLOT, func); return _PyObject_VectorcallTstate(tstate, func, args, nargsf, NULL); } diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index 072bf75bf8d69..6284bbdf97468 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -198,6 +198,7 @@ builtin___build_class__(PyObject *self, PyObject *const *args, Py_ssize_t nargs, goto error; } PyThreadState *tstate = _PyThreadState_GET(); + EVAL_CALL_STAT_INC(EVAL_CALL_BUILD_CLASS); cell = _PyEval_Vector(tstate, (PyFunctionObject *)func, ns, NULL, 0, NULL); if (cell != NULL) { if (bases != orig_bases) { diff --git a/Python/ceval.c b/Python/ceval.c index 56b1017fd9298..6158524999a84 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -1207,6 +1207,7 @@ PyEval_EvalCode(PyObject *co, PyObject *globals, PyObject *locals) if (func == NULL) { return NULL; } + EVAL_CALL_STAT_INC(EVAL_CALL_LEGACY); PyObject *res = _PyEval_Vector(tstate, func, locals, NULL, 0, NULL); Py_DECREF(func); return res; @@ -6432,6 +6433,7 @@ _PyEval_Vector(PyThreadState *tstate, PyFunctionObject *func, if (frame == NULL) { return NULL; } + EVAL_CALL_STAT_INC(EVAL_CALL_VECTOR); PyObject *retval = _PyEval_EvalFrame(tstate, frame, 0); assert( _PyFrame_GetStackPointer(frame) == _PyFrame_Stackbase(frame) || @@ -6507,6 +6509,7 @@ PyEval_EvalCodeEx(PyObject *_co, PyObject *globals, PyObject *locals, if (func == NULL) { goto fail; } + EVAL_CALL_STAT_INC(EVAL_CALL_LEGACY); res = _PyEval_Vector(tstate, func, locals, allargs, argcount, kwnames); @@ -7299,7 +7302,6 @@ do_call_core(PyThreadState *tstate, ) { PyObject *result; - if (PyCFunction_CheckExact(func) || PyCMethod_CheckExact(func)) { C_TRACE(result, PyObject_Call(func, callargs, kwdict)); return result; @@ -7329,6 +7331,7 @@ do_call_core(PyThreadState *tstate, return result; } } + EVAL_CALL_STAT_INC_IF_FUNCTION(EVAL_CALL_FUNCTION_EX, func); return PyObject_Call(func, callargs, kwdict); } diff --git a/Python/specialize.c b/Python/specialize.c index 7148b5dd02960..a2fb460388055 100644 --- a/Python/specialize.c +++ b/Python/specialize.c @@ -176,6 +176,9 @@ print_call_stats(FILE *out, CallStats *stats) fprintf(out, "Calls to Python functions inlined: %" PRIu64 "\n", stats->inlined_py_calls); fprintf(out, "Frames pushed: %" PRIu64 "\n", stats->frames_pushed); fprintf(out, "Frame objects created: %" PRIu64 "\n", stats->frame_objects_created); + for (int i = 0; i < EVAL_CALL_KINDS; i++) { + fprintf(out, "Calls via PyEval_EvalFrame[%d] : %" PRIu64 "\n", i, stats->eval_calls[i]); + } } static void @@ -904,7 +907,7 @@ typedef enum { MANAGED_DICT = 2, OFFSET_DICT = 3, NO_DICT = 4, - LAZY_DICT = 5, + LAZY_DICT = 5, } ObjectDictKind; // Please collect stats carefully before and after modifying. A subtle change diff --git a/Tools/scripts/summarize_stats.py b/Tools/scripts/summarize_stats.py index 3d7479f261b4a..04d18790f0d79 100644 --- a/Tools/scripts/summarize_stats.py +++ b/Tools/scripts/summarize_stats.py @@ -108,13 +108,14 @@ def extract_opcode_stats(stats): opcode_stats[int(n)][rest.strip(".")] = value return opcode_stats -def parse_kinds(spec_src): +def parse_kinds(spec_src, prefix="SPEC_FAIL"): defines = collections.defaultdict(list) + start = "#define " + prefix + "_" for line in spec_src: line = line.strip() - if not line.startswith("#define SPEC_FAIL_"): + if not line.startswith(start): continue - line = line[len("#define SPEC_FAIL_"):] + line = line[len(start):] name, val = line.split() defines[int(val.strip())].append(name.strip()) return defines @@ -129,8 +130,6 @@ def kind_to_text(kind, defines, opname): opname = "ATTR" if opname.endswith("SUBSCR"): opname = "SUBSCR" - if opname.startswith("PRECALL"): - opname = "CALL" for name in defines[kind]: if name.startswith(opname): return pretty(name[len(opname)+1:]) @@ -254,6 +253,9 @@ def emit_specialization_overview(opcode_stats, total): )) def emit_call_stats(stats): + stats_path = os.path.join(os.path.dirname(__file__), "../../Include/pystats.h") + with open(stats_path) as stats_src: + defines = parse_kinds(stats_src, prefix="EVAL_CALL") with Section("Call stats", summary="Inlined calls and frame stats"): total = 0 for key, value in stats.items(): @@ -263,6 +265,11 @@ def emit_call_stats(stats): for key, value in stats.items(): if "Calls to" in key: rows.append((key, value, f"{100*value/total:0.1f}%")) + elif key.startswith("Calls "): + name, index = key[:-1].split("[") + index = int(index) + label = name + " (" + pretty(defines[index][0]) + ")" + rows.append((label, value, f"{100*value/total:0.1f}%")) for key, value in stats.items(): if key.startswith("Frame"): rows.append((key, value, f"{100*value/total:0.1f}%")) From webhook-mailer at python.org Fri May 27 12:04:58 2022 From: webhook-mailer at python.org (serhiy-storchaka) Date: Fri, 27 May 2022 16:04:58 -0000 Subject: [Python-checkins] bpo-46951: Order contents of zipapps (GH-31713) Message-ID: https://github.com/python/cpython/commit/47e68d451586541259ffb6ae29e948d4ea67c059 commit: 47e68d451586541259ffb6ae29e948d4ea67c059 branch: main author: hfinucane committer: serhiy-storchaka date: 2022-05-27T19:04:29+03:00 summary: bpo-46951: Order contents of zipapps (GH-31713) So that builds are more reproducible. files: A Misc/NEWS.d/next/Library/2022-03-08-04-46-44.bpo-46951.SWAz97.rst M Lib/test/test_zipapp.py M Lib/zipapp.py diff --git a/Lib/test/test_zipapp.py b/Lib/test/test_zipapp.py index 69f2e55d56384..d135c68865812 100644 --- a/Lib/test/test_zipapp.py +++ b/Lib/test/test_zipapp.py @@ -54,6 +54,22 @@ def test_create_archive_with_subdirs(self): self.assertIn('foo/', z.namelist()) self.assertIn('bar/', z.namelist()) + def test_create_sorted_archive(self): + # Test that zipapps order their files by name + source = self.tmpdir / 'source' + source.mkdir() + (source / 'zed.py').touch() + (source / 'bin').mkdir() + (source / 'bin' / 'qux').touch() + (source / 'bin' / 'baz').touch() + (source / '__main__.py').touch() + target = io.BytesIO() + zipapp.create_archive(str(source), target) + target.seek(0) + with zipfile.ZipFile(target, 'r') as zf: + self.assertEqual(zf.namelist(), + ["__main__.py", "bin/", "bin/baz", "bin/qux", "zed.py"]) + def test_create_archive_with_filter(self): # Test packing a directory and using filter to specify # which files to include. diff --git a/Lib/zipapp.py b/Lib/zipapp.py index ce77632516c64..d8ebfcb6c73b0 100644 --- a/Lib/zipapp.py +++ b/Lib/zipapp.py @@ -136,7 +136,7 @@ def create_archive(source, target=None, interpreter=None, main=None, compression = (zipfile.ZIP_DEFLATED if compressed else zipfile.ZIP_STORED) with zipfile.ZipFile(fd, 'w', compression=compression) as z: - for child in source.rglob('*'): + for child in sorted(source.rglob('*')): arcname = child.relative_to(source) if filter is None or filter(arcname): z.write(child, arcname.as_posix()) diff --git a/Misc/NEWS.d/next/Library/2022-03-08-04-46-44.bpo-46951.SWAz97.rst b/Misc/NEWS.d/next/Library/2022-03-08-04-46-44.bpo-46951.SWAz97.rst new file mode 100644 index 0000000000000..cd7601aa8c4de --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-03-08-04-46-44.bpo-46951.SWAz97.rst @@ -0,0 +1 @@ +Order the contents of zipapp archives, to make builds more reproducible. From webhook-mailer at python.org Fri May 27 15:25:29 2022 From: webhook-mailer at python.org (miss-islington) Date: Fri, 27 May 2022 19:25:29 -0000 Subject: [Python-checkins] gh-77024: test.support: Improve documentation (GH-92513) Message-ID: https://github.com/python/cpython/commit/9912b3d989b0cb442e9f9d55fbdd30d55591e2fc commit: 9912b3d989b0cb442e9f9d55fbdd30d55591e2fc branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-27T12:25:21-07:00 summary: gh-77024: test.support: Improve documentation (GH-92513) This is a rework of GH-5774 on current main. I was a bit more conservative in making changes than the original PR. See @csabella's comments on issue GH-77024 and the discussion on GH-5774 for explanations of several of the changes. Co-authored-by: Cheryl Sabella Co-authored-by: Alex Waygood (cherry picked from commit 8995177030c8b41885ad92b260279b7e622ecaea) Co-authored-by: Jelle Zijlstra files: M Doc/library/test.rst diff --git a/Doc/library/test.rst b/Doc/library/test.rst index a8dc35476fc9b..07c3339661ad5 100644 --- a/Doc/library/test.rst +++ b/Doc/library/test.rst @@ -359,13 +359,19 @@ The :mod:`test.support` module defines the following constants: .. data:: MISSING_C_DOCSTRINGS - Return ``True`` if running on CPython, not on Windows, and configuration - not set with ``WITH_DOC_STRINGS``. + Set to ``True`` if Python is built without docstrings (the + :c:macro:`WITH_DOC_STRINGS` macro is not defined). + See the :option:`configure --without-doc-strings <--without-doc-strings>` option. + + See also the :data:`HAVE_DOCSTRINGS` variable. .. data:: HAVE_DOCSTRINGS - Check for presence of docstrings. + Set to ``True`` if function docstrings are available. + See the :option:`python -OO <-O>` option, which strips docstrings of functions implemented in Python. + + See also the :data:`MISSING_C_DOCSTRINGS` variable. .. data:: TEST_HTTP_URL @@ -423,11 +429,6 @@ The :mod:`test.support` module defines the following functions: Used when tests are executed by :mod:`test.regrtest`. -.. function:: system_must_validate_cert(f) - - Raise :exc:`unittest.SkipTest` on TLS certification validation failures. - - .. function:: sortdict(dict) Return a repr of *dict* with keys sorted. @@ -445,12 +446,12 @@ The :mod:`test.support` module defines the following functions: .. function:: match_test(test) - Match *test* to patterns set in :func:`set_match_tests`. + Determine whether *test* matches the patterns set in :func:`set_match_tests`. -.. function:: set_match_tests(patterns) +.. function:: set_match_tests(accept_patterns=None, ignore_patterns=None) - Define match test with regular expression *patterns*. + Define match patterns on test filenames and test method names for filtering tests. .. function:: run_unittest(*classes) @@ -490,7 +491,9 @@ The :mod:`test.support` module defines the following functions: .. function:: check_impl_detail(**guards) Use this check to guard CPython's implementation-specific tests or to - run them only on the implementations guarded by the arguments:: + run them only on the implementations guarded by the arguments. This + function returns ``True`` or ``False`` depending on the host platform. + Example usage:: check_impl_detail() # Only on CPython (default). check_impl_detail(jython=True) # Only on Jython. @@ -509,7 +512,7 @@ The :mod:`test.support` module defines the following functions: time the regrtest began. -.. function:: get_original_stdout +.. function:: get_original_stdout() Return the original stdout set by :func:`record_original_stdout` or ``sys.stdout`` if it's not set. @@ -554,7 +557,7 @@ The :mod:`test.support` module defines the following functions: .. function:: disable_faulthandler() - A context manager that replaces ``sys.stderr`` with ``sys.__stderr__``. + A context manager that temporary disables :mod:`faulthandler`. .. function:: gc_collect() @@ -567,8 +570,8 @@ The :mod:`test.support` module defines the following functions: .. function:: disable_gc() - A context manager that disables the garbage collector upon entry and - reenables it upon exit. + A context manager that disables the garbage collector on entry. On + exit, the garbage collector is restored to its prior state. .. function:: swap_attr(obj, attr, new_val) @@ -633,14 +636,14 @@ The :mod:`test.support` module defines the following functions: .. function:: calcobjsize(fmt) - Return :func:`struct.calcsize` for ``nP{fmt}0n`` or, if ``gettotalrefcount`` - exists, ``2PnP{fmt}0P``. + Return the size of the :c:type:`PyObject` whose structure members are + defined by *fmt*. The returned value includes the size of the Python object header and alignment. .. function:: calcvobjsize(fmt) - Return :func:`struct.calcsize` for ``nPn{fmt}0n`` or, if ``gettotalrefcount`` - exists, ``2PnPn{fmt}0P``. + Return the size of the :c:type:`PyVarObject` whose structure members are + defined by *fmt*. The returned value includes the size of the Python object header and alignment. .. function:: checksizeof(test, o, size) @@ -656,6 +659,11 @@ The :mod:`test.support` module defines the following functions: have an associated comment identifying the relevant tracker issue. +.. function:: system_must_validate_cert(f) + + A decorator that skips the decorated test on TLS certification validation failures. + + .. decorator:: run_with_locale(catstr, *locales) A decorator for running a function in a different locale, correctly @@ -673,19 +681,19 @@ The :mod:`test.support` module defines the following functions: .. decorator:: requires_freebsd_version(*min_version) Decorator for the minimum version when running test on FreeBSD. If the - FreeBSD version is less than the minimum, raise :exc:`unittest.SkipTest`. + FreeBSD version is less than the minimum, the test is skipped. .. decorator:: requires_linux_version(*min_version) Decorator for the minimum version when running test on Linux. If the - Linux version is less than the minimum, raise :exc:`unittest.SkipTest`. + Linux version is less than the minimum, the test is skipped. .. decorator:: requires_mac_version(*min_version) Decorator for the minimum version when running test on macOS. If the - macOS version is less than the minimum, raise :exc:`unittest.SkipTest`. + macOS version is less than the minimum, the test is skipped. .. decorator:: requires_IEEE_754 @@ -723,7 +731,7 @@ The :mod:`test.support` module defines the following functions: Decorator for only running the test if :data:`HAVE_DOCSTRINGS`. -.. decorator:: cpython_only(test) +.. decorator:: cpython_only Decorator for tests only applicable to CPython. @@ -734,12 +742,12 @@ The :mod:`test.support` module defines the following functions: returns ``False``, then uses *msg* as the reason for skipping the test. -.. decorator:: no_tracing(func) +.. decorator:: no_tracing Decorator to temporarily turn off tracing for the duration of the test. -.. decorator:: refcount_test(test) +.. decorator:: refcount_test Decorator for tests which involve reference counting. The decorator does not run the test if it is not run by CPython. Any trace function is unset @@ -762,10 +770,9 @@ The :mod:`test.support` module defines the following functions: means the test doesn't support dummy runs when ``-M`` is not specified. -.. decorator:: bigaddrspacetest(f) +.. decorator:: bigaddrspacetest - Decorator for tests that fill the address space. *f* is the function to - wrap. + Decorator for tests that fill the address space. .. function:: check_syntax_error(testcase, statement, errtext='', *, lineno=None, offset=None) @@ -867,7 +874,7 @@ The :mod:`test.support` module defines the following functions: .. function:: check_free_after_iterating(test, iter, cls, args=()) - Assert that *iter* is deallocated after iterating. + Assert instances of *cls* are deallocated after iterating. .. function:: missing_compiler_executable(cmd_names=[]) @@ -958,6 +965,16 @@ The :mod:`test.support` module defines the following classes: Class to save and restore signal handlers registered by the Python signal handler. + .. method:: save(self) + + Save the signal handlers to a dictionary mapping signal numbers to the + current signal handler. + + .. method:: restore(self) + + Set the signal numbers from the :meth:`save` dictionary to the saved + handler. + .. class:: Matcher() @@ -1101,11 +1118,11 @@ script execution tests. variables *env_vars* succeeds (``rc == 0``) and return a ``(return code, stdout, stderr)`` tuple. - If the ``__cleanenv`` keyword is set, *env_vars* is used as a fresh + If the *__cleanenv* keyword-only parameter is set, *env_vars* is used as a fresh environment. Python is started in isolated mode (command line option ``-I``), - except if the ``__isolated`` keyword is set to ``False``. + except if the *__isolated* keyword-only parameter is set to ``False``. .. versionchanged:: 3.9 The function no longer strips whitespaces from *stderr*. @@ -1216,15 +1233,17 @@ The :mod:`test.support.threading_helper` module provides support for threading t is still alive after *timeout* seconds. -.. decorator:: reap_threads(func) +.. decorator:: reap_threads Decorator to ensure the threads are cleaned up even if the test fails. .. function:: start_threads(threads, unlock=None) - Context manager to start *threads*. It attempts to join the threads upon - exit. + Context manager to start *threads*, which is a sequence of threads. + *unlock* is a function called after the threads are started, even if an + exception was raised; an example would be :meth:`threading.Event.set`. + ``start_threads`` will attempt to join the started threads upon exit. .. function:: threading_cleanup(*original_values) @@ -1306,7 +1325,10 @@ The :mod:`test.support.os_helper` module provides support for os tests. .. data:: TESTFN_NONASCII - Set to a filename containing the :data:`FS_NONASCII` character. + Set to a filename containing the :data:`FS_NONASCII` character, if it exists. + This guarantees that if the filename exists, it can be encoded and decoded + with the default filesystem encoding. This allows tests that require a + non-ASCII filename to be easily skipped on platforms where they can't work. .. data:: TESTFN_UNENCODABLE @@ -1404,13 +1426,16 @@ The :mod:`test.support.os_helper` module provides support for os tests. .. function:: rmdir(filename) Call :func:`os.rmdir` on *filename*. On Windows platforms, this is - wrapped with a wait loop that checks for the existence of the file. + wrapped with a wait loop that checks for the existence of the file, + which is needed due to antivirus programs that can hold files open and prevent + deletion. .. function:: rmtree(path) Call :func:`shutil.rmtree` on *path* or call :func:`os.lstat` and - :func:`os.rmdir` to remove a path and its contents. On Windows platforms, + :func:`os.rmdir` to remove a path and its contents. As with :func:`rmdir`, + on Windows platforms this is wrapped with a wait loop that checks for the existence of the files. @@ -1457,7 +1482,8 @@ The :mod:`test.support.os_helper` module provides support for os tests. .. function:: unlink(filename) - Call :func:`os.unlink` on *filename*. On Windows platforms, this is + Call :func:`os.unlink` on *filename*. As with :func:`rmdir`, + on Windows platforms, this is wrapped with a wait loop that checks for the existence of the file. @@ -1514,7 +1540,7 @@ The :mod:`test.support.import_helper` module provides support for import tests. .. versionadded:: 3.1 -.. function:: import_module(name, deprecated=False, *, required_on()) +.. function:: import_module(name, deprecated=False, *, required_on=()) This function imports and returns the named module. Unlike a normal import, this function raises :exc:`unittest.SkipTest` if the module @@ -1556,7 +1582,7 @@ The :mod:`test.support.import_helper` module provides support for import tests. A context manager to force import to return a new module reference. This is useful for testing module-level behaviors, such as the emission of a - DeprecationWarning on import. Example usage:: + :exc:`DeprecationWarning` on import. Example usage:: with CleanImport('foo'): importlib.import_module('foo') # New reference. @@ -1564,7 +1590,7 @@ The :mod:`test.support.import_helper` module provides support for import tests. .. class:: DirsOnSysPath(*paths) - A context manager to temporarily add directories to sys.path. + A context manager to temporarily add directories to :data:`sys.path`. This makes a copy of :data:`sys.path`, appends any directories given as positional arguments, then reverts :data:`sys.path` to the copied From webhook-mailer at python.org Fri May 27 18:12:04 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Fri, 27 May 2022 22:12:04 -0000 Subject: [Python-checkins] gh-91243: Document Required and NotRequired (#93173) Message-ID: https://github.com/python/cpython/commit/711eda7dec1f62ecb2a87b274b5f6bfc2b6fbef4 commit: 711eda7dec1f62ecb2a87b274b5f6bfc2b6fbef4 branch: main author: David Foster committer: JelleZijlstra date: 2022-05-27T15:11:45-07:00 summary: gh-91243: Document Required and NotRequired (#93173) Co-authored-by: Alex Waygood files: M Doc/library/typing.rst diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index 7ddc84ac5e451..c7c5536a64fb4 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -78,6 +78,8 @@ annotations. These include: *Introducing* :data:`TypeVarTuple` * :pep:`647`: User-Defined Type Guards *Introducing* :data:`TypeGuard` +* :pep:`655`: Marking individual TypedDict items as required or potentially-missing + *Introducing* :data:`Required` and :data:`NotRequired` * :pep:`673`: Self type *Introducing* :data:`Self` * :pep:`675`: Arbitrary Literal String Type @@ -1022,6 +1024,18 @@ These can be used as types in annotations using ``[]``, each having a unique syn .. versionadded:: 3.8 +.. data:: Required + +.. data:: NotRequired + + Special typing constructs that mark individual keys of a :class:`TypedDict` + as either required or non-required respectively. + + For more information, see :class:`TypedDict` and + :pep:`655` ("Marking individual TypedDict items as required or potentially-missing"). + + .. versionadded:: 3.11 + .. data:: Annotated A type, introduced in :pep:`593` (``Flexible function and variable @@ -1706,8 +1720,21 @@ These are not used in annotations. They are building blocks for declaring types. Point2D = TypedDict('Point2D', {'in': int, 'x-y': int}) By default, all keys must be present in a ``TypedDict``. It is possible to - override this by specifying totality. - Usage:: + mark individual keys as non-required using :data:`NotRequired`:: + + class Point2D(TypedDict): + x: int + y: int + label: NotRequired[str] + + # Alternative syntax + Point2D = TypedDict('Point2D', {'x': int, 'y': int, 'label': NotRequired[str]}) + + This means that a ``Point2D`` ``TypedDict`` can have the ``label`` + key omitted. + + It is also possible to mark all keys as non-required by default + by specifying a totality of ``False``:: class Point2D(TypedDict, total=False): x: int @@ -1721,6 +1748,21 @@ These are not used in annotations. They are building blocks for declaring types. ``True`` as the value of the ``total`` argument. ``True`` is the default, and makes all items defined in the class body required. + Individual keys of a ``total=False`` ``TypedDict`` can be marked as + required using :data:`Required`:: + + class Point2D(TypedDict, total=False): + x: Required[int] + y: Required[int] + label: str + + # Alternative syntax + Point2D = TypedDict('Point2D', { + 'x': Required[int], + 'y': Required[int], + 'label': str + }, total=False) + It is possible for a ``TypedDict`` type to inherit from one or more other ``TypedDict`` types using the class-based syntax. Usage:: @@ -1785,11 +1827,16 @@ These are not used in annotations. They are building blocks for declaring types. ``Point2D.__required_keys__`` and ``Point2D.__optional_keys__`` return :class:`frozenset` objects containing required and non-required keys, respectively. - Currently the only way to declare both required and non-required keys in the - same ``TypedDict`` is mixed inheritance, declaring a ``TypedDict`` with one value - for the ``total`` argument and then inheriting it from another ``TypedDict`` with - a different value for ``total``. - Usage:: + + Keys marked with :data:`Required` will always appear in ``__required_keys__`` + and keys marked with :data:`NotRequired` will always appear in ``__optional_keys__``. + + For backwards compatibility with Python 3.10 and below, + it is also possible to use inheritance to declare both required and + non-required keys in the same ``TypedDict`` . This is done by declaring a + ``TypedDict`` with one value for the ``total`` argument and then + inheriting from it in another ``TypedDict`` with a different value for + ``total``:: >>> class Point2D(TypedDict, total=False): ... x: int @@ -1807,6 +1854,10 @@ These are not used in annotations. They are building blocks for declaring types. .. versionadded:: 3.8 + .. versionchanged:: 3.11 + Added support for marking individual keys as :data:`Required` or :data:`NotRequired`. + See :pep:`655`. + .. versionchanged:: 3.11 Added support for generic ``TypedDict``\ s. From webhook-mailer at python.org Fri May 27 18:14:35 2022 From: webhook-mailer at python.org (ethanfurman) Date: Fri, 27 May 2022 22:14:35 -0000 Subject: [Python-checkins] gh-93250: [Enum] Change IntEnum boundary to KEEP for backwards compatibility (GH-93302) Message-ID: https://github.com/python/cpython/commit/70cfe56cafb2b549983f63d5d1a54654fe63c15c commit: 70cfe56cafb2b549983f63d5d1a54654fe63c15c branch: main author: Ethan Furman committer: ethanfurman date: 2022-05-27T15:14:28-07:00 summary: gh-93250: [Enum] Change IntEnum boundary to KEEP for backwards compatibility (GH-93302) In previous versions of Python if an IntEnum member was combined with another integer type value using a bit-wise operation, the resulting value would still be the IntEnum type. This change restores that behavior. files: M Lib/enum.py M Lib/test/test_enum.py diff --git a/Lib/enum.py b/Lib/enum.py index 0b97d3d8a68ef..4261b117d9db2 100644 --- a/Lib/enum.py +++ b/Lib/enum.py @@ -1572,7 +1572,7 @@ def __invert__(self): __rxor__ = __xor__ -class IntFlag(int, ReprEnum, Flag, boundary=EJECT): +class IntFlag(int, ReprEnum, Flag, boundary=KEEP): """ Support for integer-based Flags """ diff --git a/Lib/test/test_enum.py b/Lib/test/test_enum.py index 44a3912630c32..25b3e2d818929 100644 --- a/Lib/test/test_enum.py +++ b/Lib/test/test_enum.py @@ -3353,7 +3353,10 @@ def test_invert(self): self.assertIs((Open.WO|Open.CE) & ~Open.WO, Open.CE) def test_boundary(self): - self.assertIs(enum.IntFlag._boundary_, EJECT) + self.assertIs(enum.IntFlag._boundary_, KEEP) + class Simple(IntFlag, boundary=KEEP): + SINGLE = 1 + # class Iron(IntFlag, boundary=STRICT): ONE = 1 TWO = 2 @@ -3372,7 +3375,6 @@ class Space(IntFlag, boundary=EJECT): EIGHT = 8 self.assertIs(Space._boundary_, EJECT) # - # class Bizarre(IntFlag, boundary=KEEP): b = 3 c = 4 @@ -3389,6 +3391,12 @@ class Bizarre(IntFlag, boundary=KEEP): self.assertEqual(list(Bizarre), [Bizarre.c]) self.assertIs(Bizarre(3), Bizarre.b) self.assertIs(Bizarre(6), Bizarre.d) + # + simple = Simple.SINGLE | Iron.TWO + self.assertEqual(simple, 3) + self.assertIsInstance(simple, Simple) + self.assertEqual(repr(simple), ': 3>') + self.assertEqual(str(simple), '3') def test_iter(self): Color = self.Color From webhook-mailer at python.org Fri May 27 18:20:25 2022 From: webhook-mailer at python.org (1st1) Date: Fri, 27 May 2022 22:20:25 -0000 Subject: [Python-checkins] gh-93297: Make asyncio task groups prevent child tasks from being GCed (#93299) Message-ID: https://github.com/python/cpython/commit/e6a57678cafe18ca132ee9510252168fcc392a8d commit: e6a57678cafe18ca132ee9510252168fcc392a8d branch: main author: Yury Selivanov committer: 1st1 date: 2022-05-27T15:20:21-07:00 summary: gh-93297: Make asyncio task groups prevent child tasks from being GCed (#93299) files: A Misc/NEWS.d/next/Library/2022-05-27-13-18-18.gh-issue-93297.e2zuHz.rst M Lib/asyncio/taskgroups.py diff --git a/Lib/asyncio/taskgroups.py b/Lib/asyncio/taskgroups.py index 6af21f3a15d93..9e0610deed281 100644 --- a/Lib/asyncio/taskgroups.py +++ b/Lib/asyncio/taskgroups.py @@ -3,8 +3,6 @@ __all__ = ["TaskGroup"] -import weakref - from . import events from . import exceptions from . import tasks @@ -19,8 +17,7 @@ def __init__(self): self._loop = None self._parent_task = None self._parent_cancel_requested = False - self._tasks = weakref.WeakSet() - self._unfinished_tasks = 0 + self._tasks = set() self._errors = [] self._base_error = None self._on_completed_fut = None @@ -29,8 +26,6 @@ def __repr__(self): info = [''] if self._tasks: info.append(f'tasks={len(self._tasks)}') - if self._unfinished_tasks: - info.append(f'unfinished={self._unfinished_tasks}') if self._errors: info.append(f'errors={len(self._errors)}') if self._aborting: @@ -93,7 +88,7 @@ async def __aexit__(self, et, exc, tb): # can be cancelled multiple times if our parent task # is being cancelled repeatedly (or even once, when # our own cancellation is already in progress) - while self._unfinished_tasks: + while self._tasks: if self._on_completed_fut is None: self._on_completed_fut = self._loop.create_future() @@ -114,7 +109,7 @@ async def __aexit__(self, et, exc, tb): self._on_completed_fut = None - assert self._unfinished_tasks == 0 + assert not self._tasks if self._base_error is not None: raise self._base_error @@ -141,7 +136,7 @@ async def __aexit__(self, et, exc, tb): def create_task(self, coro, *, name=None, context=None): if not self._entered: raise RuntimeError(f"TaskGroup {self!r} has not been entered") - if self._exiting and self._unfinished_tasks == 0: + if self._exiting and not self._tasks: raise RuntimeError(f"TaskGroup {self!r} is finished") if context is None: task = self._loop.create_task(coro) @@ -149,7 +144,6 @@ def create_task(self, coro, *, name=None, context=None): task = self._loop.create_task(coro, context=context) tasks._set_task_name(task, name) task.add_done_callback(self._on_task_done) - self._unfinished_tasks += 1 self._tasks.add(task) return task @@ -169,10 +163,9 @@ def _abort(self): t.cancel() def _on_task_done(self, task): - self._unfinished_tasks -= 1 - assert self._unfinished_tasks >= 0 + self._tasks.discard(task) - if self._on_completed_fut is not None and not self._unfinished_tasks: + if self._on_completed_fut is not None and not self._tasks: if not self._on_completed_fut.done(): self._on_completed_fut.set_result(True) diff --git a/Misc/NEWS.d/next/Library/2022-05-27-13-18-18.gh-issue-93297.e2zuHz.rst b/Misc/NEWS.d/next/Library/2022-05-27-13-18-18.gh-issue-93297.e2zuHz.rst new file mode 100644 index 0000000000000..a8e4cd93d3047 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-05-27-13-18-18.gh-issue-93297.e2zuHz.rst @@ -0,0 +1 @@ +Make asyncio task groups prevent child tasks from being GCed From webhook-mailer at python.org Fri May 27 18:25:54 2022 From: webhook-mailer at python.org (miss-islington) Date: Fri, 27 May 2022 22:25:54 -0000 Subject: [Python-checkins] gh-91243: Document Required and NotRequired (GH-93173) Message-ID: https://github.com/python/cpython/commit/3f7abff97bf6472f35d23a00656e88d77c93feea commit: 3f7abff97bf6472f35d23a00656e88d77c93feea branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-27T15:25:50-07:00 summary: gh-91243: Document Required and NotRequired (GH-93173) Co-authored-by: Alex Waygood (cherry picked from commit 711eda7dec1f62ecb2a87b274b5f6bfc2b6fbef4) Co-authored-by: David Foster files: M Doc/library/typing.rst diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index 7ddc84ac5e451..c7c5536a64fb4 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -78,6 +78,8 @@ annotations. These include: *Introducing* :data:`TypeVarTuple` * :pep:`647`: User-Defined Type Guards *Introducing* :data:`TypeGuard` +* :pep:`655`: Marking individual TypedDict items as required or potentially-missing + *Introducing* :data:`Required` and :data:`NotRequired` * :pep:`673`: Self type *Introducing* :data:`Self` * :pep:`675`: Arbitrary Literal String Type @@ -1022,6 +1024,18 @@ These can be used as types in annotations using ``[]``, each having a unique syn .. versionadded:: 3.8 +.. data:: Required + +.. data:: NotRequired + + Special typing constructs that mark individual keys of a :class:`TypedDict` + as either required or non-required respectively. + + For more information, see :class:`TypedDict` and + :pep:`655` ("Marking individual TypedDict items as required or potentially-missing"). + + .. versionadded:: 3.11 + .. data:: Annotated A type, introduced in :pep:`593` (``Flexible function and variable @@ -1706,8 +1720,21 @@ These are not used in annotations. They are building blocks for declaring types. Point2D = TypedDict('Point2D', {'in': int, 'x-y': int}) By default, all keys must be present in a ``TypedDict``. It is possible to - override this by specifying totality. - Usage:: + mark individual keys as non-required using :data:`NotRequired`:: + + class Point2D(TypedDict): + x: int + y: int + label: NotRequired[str] + + # Alternative syntax + Point2D = TypedDict('Point2D', {'x': int, 'y': int, 'label': NotRequired[str]}) + + This means that a ``Point2D`` ``TypedDict`` can have the ``label`` + key omitted. + + It is also possible to mark all keys as non-required by default + by specifying a totality of ``False``:: class Point2D(TypedDict, total=False): x: int @@ -1721,6 +1748,21 @@ These are not used in annotations. They are building blocks for declaring types. ``True`` as the value of the ``total`` argument. ``True`` is the default, and makes all items defined in the class body required. + Individual keys of a ``total=False`` ``TypedDict`` can be marked as + required using :data:`Required`:: + + class Point2D(TypedDict, total=False): + x: Required[int] + y: Required[int] + label: str + + # Alternative syntax + Point2D = TypedDict('Point2D', { + 'x': Required[int], + 'y': Required[int], + 'label': str + }, total=False) + It is possible for a ``TypedDict`` type to inherit from one or more other ``TypedDict`` types using the class-based syntax. Usage:: @@ -1785,11 +1827,16 @@ These are not used in annotations. They are building blocks for declaring types. ``Point2D.__required_keys__`` and ``Point2D.__optional_keys__`` return :class:`frozenset` objects containing required and non-required keys, respectively. - Currently the only way to declare both required and non-required keys in the - same ``TypedDict`` is mixed inheritance, declaring a ``TypedDict`` with one value - for the ``total`` argument and then inheriting it from another ``TypedDict`` with - a different value for ``total``. - Usage:: + + Keys marked with :data:`Required` will always appear in ``__required_keys__`` + and keys marked with :data:`NotRequired` will always appear in ``__optional_keys__``. + + For backwards compatibility with Python 3.10 and below, + it is also possible to use inheritance to declare both required and + non-required keys in the same ``TypedDict`` . This is done by declaring a + ``TypedDict`` with one value for the ``total`` argument and then + inheriting from it in another ``TypedDict`` with a different value for + ``total``:: >>> class Point2D(TypedDict, total=False): ... x: int @@ -1807,6 +1854,10 @@ These are not used in annotations. They are building blocks for declaring types. .. versionadded:: 3.8 + .. versionchanged:: 3.11 + Added support for marking individual keys as :data:`Required` or :data:`NotRequired`. + See :pep:`655`. + .. versionchanged:: 3.11 Added support for generic ``TypedDict``\ s. From webhook-mailer at python.org Fri May 27 18:43:22 2022 From: webhook-mailer at python.org (ethanfurman) Date: Fri, 27 May 2022 22:43:22 -0000 Subject: [Python-checkins] gh-93250: [Enum] Change IntEnum boundary to KEEP for backwards compatibility (GH-93302) (GH-93304) Message-ID: https://github.com/python/cpython/commit/647426d4fa272da33269a9c183f3949a3477202d commit: 647426d4fa272da33269a9c183f3949a3477202d branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: ethanfurman date: 2022-05-27T15:43:13-07:00 summary: gh-93250: [Enum] Change IntEnum boundary to KEEP for backwards compatibility (GH-93302) (GH-93304) In previous versions of Python if an IntEnum member was combined with another integer type value using a bit-wise operation, the resulting value would still be the IntEnum type. This change restores that behavior. (cherry picked from commit 70cfe56cafb2b549983f63d5d1a54654fe63c15c) Co-authored-by: Ethan Furman files: M Lib/enum.py M Lib/test/test_enum.py diff --git a/Lib/enum.py b/Lib/enum.py index 4a21226f0193f..fe521b1018d48 100644 --- a/Lib/enum.py +++ b/Lib/enum.py @@ -1575,7 +1575,7 @@ def __invert__(self): __rxor__ = __xor__ -class IntFlag(int, ReprEnum, Flag, boundary=EJECT): +class IntFlag(int, ReprEnum, Flag, boundary=KEEP): """ Support for integer-based Flags """ diff --git a/Lib/test/test_enum.py b/Lib/test/test_enum.py index c9ed08397d77c..56cebfea3f1ba 100644 --- a/Lib/test/test_enum.py +++ b/Lib/test/test_enum.py @@ -3349,7 +3349,10 @@ def test_invert(self): self.assertIs((Open.WO|Open.CE) & ~Open.WO, Open.CE) def test_boundary(self): - self.assertIs(enum.IntFlag._boundary_, EJECT) + self.assertIs(enum.IntFlag._boundary_, KEEP) + class Simple(IntFlag, boundary=KEEP): + SINGLE = 1 + # class Iron(IntFlag, boundary=STRICT): ONE = 1 TWO = 2 @@ -3368,7 +3371,6 @@ class Space(IntFlag, boundary=EJECT): EIGHT = 8 self.assertIs(Space._boundary_, EJECT) # - # class Bizarre(IntFlag, boundary=KEEP): b = 3 c = 4 @@ -3385,6 +3387,12 @@ class Bizarre(IntFlag, boundary=KEEP): self.assertEqual(list(Bizarre), [Bizarre.c]) self.assertIs(Bizarre(3), Bizarre.b) self.assertIs(Bizarre(6), Bizarre.d) + # + simple = Simple.SINGLE | Iron.TWO + self.assertEqual(simple, 3) + self.assertIsInstance(simple, Simple) + self.assertEqual(repr(simple), ': 3>') + self.assertEqual(str(simple), '3') def test_iter(self): Color = self.Color From webhook-mailer at python.org Fri May 27 18:47:03 2022 From: webhook-mailer at python.org (1st1) Date: Fri, 27 May 2022 22:47:03 -0000 Subject: [Python-checkins] gh-93297: Make asyncio task groups prevent child tasks from being GCed (GH-93299) (#93305) Message-ID: https://github.com/python/cpython/commit/cf63b80bc482ef971ecb6d3ed9a1dc4a93d73744 commit: cf63b80bc482ef971ecb6d3ed9a1dc4a93d73744 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: 1st1 date: 2022-05-27T15:46:57-07:00 summary: gh-93297: Make asyncio task groups prevent child tasks from being GCed (GH-93299) (#93305) (cherry picked from commit e6a57678cafe18ca132ee9510252168fcc392a8d) Co-authored-by: Yury Selivanov Co-authored-by: Yury Selivanov files: A Misc/NEWS.d/next/Library/2022-05-27-13-18-18.gh-issue-93297.e2zuHz.rst M Lib/asyncio/taskgroups.py diff --git a/Lib/asyncio/taskgroups.py b/Lib/asyncio/taskgroups.py index 6af21f3a15d93..9e0610deed281 100644 --- a/Lib/asyncio/taskgroups.py +++ b/Lib/asyncio/taskgroups.py @@ -3,8 +3,6 @@ __all__ = ["TaskGroup"] -import weakref - from . import events from . import exceptions from . import tasks @@ -19,8 +17,7 @@ def __init__(self): self._loop = None self._parent_task = None self._parent_cancel_requested = False - self._tasks = weakref.WeakSet() - self._unfinished_tasks = 0 + self._tasks = set() self._errors = [] self._base_error = None self._on_completed_fut = None @@ -29,8 +26,6 @@ def __repr__(self): info = [''] if self._tasks: info.append(f'tasks={len(self._tasks)}') - if self._unfinished_tasks: - info.append(f'unfinished={self._unfinished_tasks}') if self._errors: info.append(f'errors={len(self._errors)}') if self._aborting: @@ -93,7 +88,7 @@ async def __aexit__(self, et, exc, tb): # can be cancelled multiple times if our parent task # is being cancelled repeatedly (or even once, when # our own cancellation is already in progress) - while self._unfinished_tasks: + while self._tasks: if self._on_completed_fut is None: self._on_completed_fut = self._loop.create_future() @@ -114,7 +109,7 @@ async def __aexit__(self, et, exc, tb): self._on_completed_fut = None - assert self._unfinished_tasks == 0 + assert not self._tasks if self._base_error is not None: raise self._base_error @@ -141,7 +136,7 @@ async def __aexit__(self, et, exc, tb): def create_task(self, coro, *, name=None, context=None): if not self._entered: raise RuntimeError(f"TaskGroup {self!r} has not been entered") - if self._exiting and self._unfinished_tasks == 0: + if self._exiting and not self._tasks: raise RuntimeError(f"TaskGroup {self!r} is finished") if context is None: task = self._loop.create_task(coro) @@ -149,7 +144,6 @@ def create_task(self, coro, *, name=None, context=None): task = self._loop.create_task(coro, context=context) tasks._set_task_name(task, name) task.add_done_callback(self._on_task_done) - self._unfinished_tasks += 1 self._tasks.add(task) return task @@ -169,10 +163,9 @@ def _abort(self): t.cancel() def _on_task_done(self, task): - self._unfinished_tasks -= 1 - assert self._unfinished_tasks >= 0 + self._tasks.discard(task) - if self._on_completed_fut is not None and not self._unfinished_tasks: + if self._on_completed_fut is not None and not self._tasks: if not self._on_completed_fut.done(): self._on_completed_fut.set_result(True) diff --git a/Misc/NEWS.d/next/Library/2022-05-27-13-18-18.gh-issue-93297.e2zuHz.rst b/Misc/NEWS.d/next/Library/2022-05-27-13-18-18.gh-issue-93297.e2zuHz.rst new file mode 100644 index 0000000000000..a8e4cd93d3047 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-05-27-13-18-18.gh-issue-93297.e2zuHz.rst @@ -0,0 +1 @@ +Make asyncio task groups prevent child tasks from being GCed From webhook-mailer at python.org Fri May 27 19:38:20 2022 From: webhook-mailer at python.org (ericsnowcurrently) Date: Fri, 27 May 2022 23:38:20 -0000 Subject: [Python-checkins] bpo-40514: Drop EXPERIMENTAL_ISOLATED_SUBINTERPRETERS (gh-93185) Message-ID: https://github.com/python/cpython/commit/caa279d6fd5f151e57f891cd4f6ba51b532501c6 commit: caa279d6fd5f151e57f891cd4f6ba51b532501c6 branch: main author: Eric Snow committer: ericsnowcurrently date: 2022-05-27T17:38:01-06:00 summary: bpo-40514: Drop EXPERIMENTAL_ISOLATED_SUBINTERPRETERS (gh-93185) This was added for bpo-40514 (gh-84694) to test out a per-interpreter GIL. However, it has since proven unnecessary to keep the experiment in the repo. (It can be done as a branch in a fork like normal.) So here we are removing: * the configure option * the macro * the code enabled by the macro files: A Misc/NEWS.d/next/Core and Builtins/2022-05-25-12-30-12.gh-issue-84694.5sjy2w.rst M Doc/whatsnew/3.12.rst M Include/internal/pycore_ceval.h M Include/internal/pycore_interp.h M Include/internal/pycore_pystate.h M Include/internal/pycore_runtime.h M Modules/_xxsubinterpretersmodule.c M Modules/gcmodule.c M Objects/typeobject.c M Objects/unicodeobject.c M Python/ceval.c M Python/ceval_gil.h M Python/preconfig.c M Python/pylifecycle.c M Python/pystate.c M configure M configure.ac M pyconfig.h.in diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst index 4493476cb0318..8a7309726ed2a 100644 --- a/Doc/whatsnew/3.12.rst +++ b/Doc/whatsnew/3.12.rst @@ -115,6 +115,10 @@ Removed (Contributed by Erlend E. Aasland in :gh:`92548`) +* The ``--experimental-isolated-subinterpreters`` configure flag + (and corresponding ``EXPERIMENTAL_ISOLATED_SUBINTERPRETERS``) + have been removed. + Porting to Python 3.12 ====================== diff --git a/Include/internal/pycore_ceval.h b/Include/internal/pycore_ceval.h index 972eb926b3fa2..dafe31b216bf0 100644 --- a/Include/internal/pycore_ceval.h +++ b/Include/internal/pycore_ceval.h @@ -81,11 +81,7 @@ _PyEval_Vector(PyThreadState *tstate, PyObject* const* args, size_t argcount, PyObject *kwnames); -#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS -extern int _PyEval_ThreadsInitialized(PyInterpreterState *interp); -#else extern int _PyEval_ThreadsInitialized(struct pyruntimestate *runtime); -#endif extern PyStatus _PyEval_InitGIL(PyThreadState *tstate); extern void _PyEval_FiniGIL(PyInterpreterState *interp); diff --git a/Include/internal/pycore_interp.h b/Include/internal/pycore_interp.h index d55627908a28f..bcfcd88d84492 100644 --- a/Include/internal/pycore_interp.h +++ b/Include/internal/pycore_interp.h @@ -51,9 +51,6 @@ struct _ceval_state { /* Request for dropping the GIL */ _Py_atomic_int gil_drop_request; struct _pending_calls pending; -#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS - struct _gil_runtime_state gil; -#endif }; diff --git a/Include/internal/pycore_pystate.h b/Include/internal/pycore_pystate.h index c4bc53c707fda..e2d7c5bee28b9 100644 --- a/Include/internal/pycore_pystate.h +++ b/Include/internal/pycore_pystate.h @@ -64,18 +64,10 @@ _Py_ThreadCanHandlePendingCalls(void) /* Variable and macro for in-line access to current thread and interpreter state */ -#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS -PyAPI_FUNC(PyThreadState*) _PyThreadState_GetTSS(void); -#endif - static inline PyThreadState* _PyRuntimeState_GetThreadState(_PyRuntimeState *runtime) { -#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS - return _PyThreadState_GetTSS(); -#else return (PyThreadState*)_Py_atomic_load_relaxed(&runtime->gilstate.tstate_current); -#endif } /* Get the current Python thread state. @@ -90,11 +82,7 @@ _PyRuntimeState_GetThreadState(_PyRuntimeState *runtime) static inline PyThreadState* _PyThreadState_GET(void) { -#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS - return _PyThreadState_GetTSS(); -#else return _PyRuntimeState_GetThreadState(&_PyRuntime); -#endif } PyAPI_FUNC(void) _Py_NO_RETURN _Py_FatalError_TstateNULL(const char *func); diff --git a/Include/internal/pycore_runtime.h b/Include/internal/pycore_runtime.h index 18191c3771dfc..ae63ae74afa5f 100644 --- a/Include/internal/pycore_runtime.h +++ b/Include/internal/pycore_runtime.h @@ -23,9 +23,7 @@ struct _ceval_runtime_state { the main thread of the main interpreter can handle signals: see _Py_ThreadCanHandleSignals(). */ _Py_atomic_int signals_pending; -#ifndef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS struct _gil_runtime_state gil; -#endif }; /* GIL state */ diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-25-12-30-12.gh-issue-84694.5sjy2w.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-25-12-30-12.gh-issue-84694.5sjy2w.rst new file mode 100644 index 0000000000000..c062d28b29486 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-05-25-12-30-12.gh-issue-84694.5sjy2w.rst @@ -0,0 +1,2 @@ +The ``--experimental-isolated-subinterpreters`` configure option and +``EXPERIMENTAL_ISOLATED_SUBINTERPRETERS`` macro have been removed. diff --git a/Modules/_xxsubinterpretersmodule.c b/Modules/_xxsubinterpretersmodule.c index ee04e308fe554..eed9a8a1d85d5 100644 --- a/Modules/_xxsubinterpretersmodule.c +++ b/Modules/_xxsubinterpretersmodule.c @@ -1932,20 +1932,6 @@ _run_script_in_interpreter(PyInterpreterState *interp, const char *codestr, return -1; } -#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS - // Switch to interpreter. - PyThreadState *new_tstate = PyInterpreterState_ThreadHead(interp); - PyThreadState *save1 = PyEval_SaveThread(); - - (void)PyThreadState_Swap(new_tstate); - - // Run the script. - _sharedexception *exc = NULL; - int result = _run_script(interp, codestr, shared, &exc); - - // Switch back. - PyEval_RestoreThread(save1); -#else // Switch to interpreter. PyThreadState *save_tstate = NULL; if (interp != PyInterpreterState_Get()) { @@ -1963,7 +1949,6 @@ _run_script_in_interpreter(PyInterpreterState *interp, const char *codestr, if (save_tstate != NULL) { PyThreadState_Swap(save_tstate); } -#endif // Propagate any exception out to the caller. if (exc != NULL) { diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c index 45dad8f0824df..3bda6e4bb8c02 100644 --- a/Modules/gcmodule.c +++ b/Modules/gcmodule.c @@ -1195,14 +1195,6 @@ gc_collect_main(PyThreadState *tstate, int generation, assert(gcstate->garbage != NULL); assert(!_PyErr_Occurred(tstate)); -#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS - if (tstate->interp->config._isolated_interpreter) { - // bpo-40533: The garbage collector must not be run on parallel on - // Python objects shared by multiple interpreters. - return 0; - } -#endif - if (gcstate->debug & DEBUG_STATS) { PySys_WriteStderr("gc: collecting generation %d...\n", generation); show_stats_each_generations(gcstate); diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 37ac886f00446..2566d217a0f3b 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -54,11 +54,6 @@ typedef struct PySlot_Offset { } PySlot_Offset; -/* bpo-40521: Interned strings are shared by all subinterpreters */ -#ifndef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS -# define INTERN_NAME_STRINGS -#endif - static PyObject * slot_tp_new(PyTypeObject *type, PyObject *args, PyObject *kwds); @@ -4027,7 +4022,7 @@ type_setattro(PyTypeObject *type, PyObject *name, PyObject *value) if (name == NULL) return -1; } -#ifdef INTERN_NAME_STRINGS + /* bpo-40521: Interned strings are shared by all subinterpreters */ if (!PyUnicode_CHECK_INTERNED(name)) { PyUnicode_InternInPlace(&name); if (!PyUnicode_CHECK_INTERNED(name)) { @@ -4037,7 +4032,6 @@ type_setattro(PyTypeObject *type, PyObject *name, PyObject *value) return -1; } } -#endif } else { /* Will fail in _PyObject_GenericSetAttrWithDict. */ @@ -8474,17 +8468,11 @@ _PyTypes_InitSlotDefs(void) for (slotdef *p = slotdefs; p->name; p++) { /* Slots must be ordered by their offset in the PyHeapTypeObject. */ assert(!p[1].name || p->offset <= p[1].offset); -#ifdef INTERN_NAME_STRINGS + /* bpo-40521: Interned strings are shared by all subinterpreters */ p->name_strobj = PyUnicode_InternFromString(p->name); if (!p->name_strobj || !PyUnicode_CHECK_INTERNED(p->name_strobj)) { return _PyStatus_NO_MEMORY(); } -#else - p->name_strobj = PyUnicode_FromString(p->name); - if (!p->name_strobj) { - return _PyStatus_NO_MEMORY(); - } -#endif } slotdefs_initialized = 1; return _PyStatus_OK(); @@ -8509,24 +8497,17 @@ update_slot(PyTypeObject *type, PyObject *name) int offset; assert(PyUnicode_CheckExact(name)); -#ifdef INTERN_NAME_STRINGS assert(PyUnicode_CHECK_INTERNED(name)); -#endif assert(slotdefs_initialized); pp = ptrs; for (p = slotdefs; p->name; p++) { assert(PyUnicode_CheckExact(p->name_strobj)); assert(PyUnicode_CheckExact(name)); -#ifdef INTERN_NAME_STRINGS + /* bpo-40521: Using interned strings. */ if (p->name_strobj == name) { *pp++ = p; } -#else - if (p->name_strobj == name || _PyUnicode_EQ(p->name_strobj, name)) { - *pp++ = p; - } -#endif } *pp = NULL; for (pp = ptrs; *pp; pp++) { diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index f712fbfa71d36..d0e4bcd920e40 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -190,11 +190,6 @@ extern "C" { # define OVERALLOCATE_FACTOR 4 #endif -/* bpo-40521: Interned strings are shared by all interpreters. */ -#ifndef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS -# define INTERNED_STRINGS -#endif - /* This dictionary holds all interned unicode strings. Note that references to strings in this dictionary are *not* counted in the string's ob_refcnt. When the interned string reaches a refcnt of 0 the string deallocation @@ -203,9 +198,7 @@ extern "C" { Another way to look at this is that to say that the actual reference count of a string is: s->ob_refcnt + (s->state ? 2 : 0) */ -#ifdef INTERNED_STRINGS static PyObject *interned = NULL; -#endif /* Forward declaration */ static inline int @@ -1530,7 +1523,6 @@ unicode_dealloc(PyObject *unicode) } #endif -#ifdef INTERNED_STRINGS if (PyUnicode_CHECK_INTERNED(unicode)) { /* Revive the dead object temporarily. PyDict_DelItem() removes two references (key and value) which were ignored by @@ -1546,7 +1538,6 @@ unicode_dealloc(PyObject *unicode) assert(Py_REFCNT(unicode) == 1); Py_SET_REFCNT(unicode, 0); } -#endif if (_PyUnicode_HAS_UTF8_MEMORY(unicode)) { PyObject_Free(_PyUnicode_UTF8(unicode)); @@ -10568,13 +10559,11 @@ _PyUnicode_EqualToASCIIId(PyObject *left, _Py_Identifier *right) if (PyUnicode_CHECK_INTERNED(left)) return 0; -#ifdef INTERNED_STRINGS assert(_PyUnicode_HASH(right_uni) != -1); Py_hash_t hash = _PyUnicode_HASH(left); if (hash != -1 && hash != _PyUnicode_HASH(right_uni)) { return 0; } -#endif return unicode_compare_eq(left, right_uni); } @@ -14645,7 +14634,6 @@ PyUnicode_InternInPlace(PyObject **p) return; } -#ifdef INTERNED_STRINGS if (interned == NULL) { interned = PyDict_New(); if (interned == NULL) { @@ -14671,11 +14659,6 @@ PyUnicode_InternInPlace(PyObject **p) this. */ Py_SET_REFCNT(s, Py_REFCNT(s) - 2); _PyUnicode_STATE(s).interned = 1; -#else - // PyDict expects that interned strings have their hash - // (PyASCIIObject.hash) already computed. - (void)unicode_hash(s); -#endif } // Function kept for the stable ABI. diff --git a/Python/ceval.c b/Python/ceval.c index 6158524999a84..fdbf0d4d6e99d 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -352,21 +352,6 @@ _Py_FatalError_TstateNULL(const char *func) "(the current Python thread state is NULL)"); } -#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS -int -_PyEval_ThreadsInitialized(PyInterpreterState *interp) -{ - return gil_created(&interp->ceval.gil); -} - -int -PyEval_ThreadsInitialized(void) -{ - // Fatal error if there is no current interpreter - PyInterpreterState *interp = PyInterpreterState_Get(); - return _PyEval_ThreadsInitialized(interp); -} -#else int _PyEval_ThreadsInitialized(_PyRuntimeState *runtime) { @@ -379,25 +364,18 @@ PyEval_ThreadsInitialized(void) _PyRuntimeState *runtime = &_PyRuntime; return _PyEval_ThreadsInitialized(runtime); } -#endif PyStatus _PyEval_InitGIL(PyThreadState *tstate) { -#ifndef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS if (!_Py_IsMainInterpreter(tstate->interp)) { /* Currently, the GIL is shared by all interpreters, and only the main interpreter is responsible to create and destroy it. */ return _PyStatus_OK(); } -#endif -#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS - struct _gil_runtime_state *gil = &tstate->interp->ceval.gil; -#else struct _gil_runtime_state *gil = &tstate->interp->runtime->ceval.gil; -#endif assert(!gil_created(gil)); PyThread_init_thread(); @@ -412,20 +390,14 @@ _PyEval_InitGIL(PyThreadState *tstate) void _PyEval_FiniGIL(PyInterpreterState *interp) { -#ifndef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS if (!_Py_IsMainInterpreter(interp)) { /* Currently, the GIL is shared by all interpreters, and only the main interpreter is responsible to create and destroy it. */ return; } -#endif -#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS - struct _gil_runtime_state *gil = &interp->ceval.gil; -#else struct _gil_runtime_state *gil = &interp->runtime->ceval.gil; -#endif if (!gil_created(gil)) { /* First Py_InitializeFromConfig() call: the GIL doesn't exist yet: do nothing. */ @@ -489,13 +461,9 @@ PyEval_AcquireThread(PyThreadState *tstate) take_gil(tstate); struct _gilstate_runtime_state *gilstate = &tstate->interp->runtime->gilstate; -#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS - (void)_PyThreadState_Swap(gilstate, tstate); -#else if (_PyThreadState_Swap(gilstate, tstate) != NULL) { Py_FatalError("non-NULL old thread state"); } -#endif } void @@ -522,11 +490,7 @@ _PyEval_ReInitThreads(PyThreadState *tstate) { _PyRuntimeState *runtime = tstate->interp->runtime; -#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS - struct _gil_runtime_state *gil = &tstate->interp->ceval.gil; -#else struct _gil_runtime_state *gil = &runtime->ceval.gil; -#endif if (!gil_created(gil)) { return _PyStatus_OK(); } @@ -558,21 +522,12 @@ PyThreadState * PyEval_SaveThread(void) { _PyRuntimeState *runtime = &_PyRuntime; -#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS - PyThreadState *old_tstate = _PyThreadState_GET(); - PyThreadState *tstate = _PyThreadState_Swap(&runtime->gilstate, old_tstate); -#else PyThreadState *tstate = _PyThreadState_Swap(&runtime->gilstate, NULL); -#endif _Py_EnsureTstateNotNULL(tstate); struct _ceval_runtime_state *ceval = &runtime->ceval; struct _ceval_state *ceval2 = &tstate->interp->ceval; -#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS - assert(gil_created(&ceval2->gil)); -#else assert(gil_created(&ceval->gil)); -#endif drop_gil(ceval, ceval2, tstate); return tstate; } @@ -836,9 +791,7 @@ Py_MakePendingCalls(void) void _PyEval_InitRuntimeState(struct _ceval_runtime_state *ceval) { -#ifndef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS _gil_initialize(&ceval->gil); -#endif } void @@ -848,10 +801,6 @@ _PyEval_InitState(struct _ceval_state *ceval, PyThread_type_lock pending_lock) assert(pending->lock == NULL); pending->lock = pending_lock; - -#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS - _gil_initialize(&ceval->gil); -#endif } void @@ -1267,13 +1216,9 @@ eval_frame_handle_pending(PyThreadState *tstate) take_gil(tstate); -#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS - (void)_PyThreadState_Swap(&runtime->gilstate, tstate); -#else if (_PyThreadState_Swap(&runtime->gilstate, tstate) != NULL) { Py_FatalError("orphan tstate"); } -#endif } /* Check for asynchronous exception. */ diff --git a/Python/ceval_gil.h b/Python/ceval_gil.h index 9b8b43253f04d..1b2dc7f8e1dc3 100644 --- a/Python/ceval_gil.h +++ b/Python/ceval_gil.h @@ -144,11 +144,7 @@ static void drop_gil(struct _ceval_runtime_state *ceval, struct _ceval_state *ceval2, PyThreadState *tstate) { -#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS - struct _gil_runtime_state *gil = &ceval2->gil; -#else struct _gil_runtime_state *gil = &ceval->gil; -#endif if (!_Py_atomic_load_relaxed(&gil->locked)) { Py_FatalError("drop_gil: GIL is not locked"); } @@ -232,11 +228,7 @@ take_gil(PyThreadState *tstate) PyInterpreterState *interp = tstate->interp; struct _ceval_runtime_state *ceval = &interp->runtime->ceval; struct _ceval_state *ceval2 = &interp->ceval; -#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS - struct _gil_runtime_state *gil = &ceval2->gil; -#else struct _gil_runtime_state *gil = &ceval->gil; -#endif /* Check that _PyEval_InitThreads() was called to create the lock */ assert(gil_created(gil)); @@ -328,22 +320,12 @@ take_gil(PyThreadState *tstate) void _PyEval_SetSwitchInterval(unsigned long microseconds) { -#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS - PyInterpreterState *interp = PyInterpreterState_Get(); - struct _gil_runtime_state *gil = &interp->ceval.gil; -#else struct _gil_runtime_state *gil = &_PyRuntime.ceval.gil; -#endif gil->interval = microseconds; } unsigned long _PyEval_GetSwitchInterval() { -#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS - PyInterpreterState *interp = PyInterpreterState_Get(); - struct _gil_runtime_state *gil = &interp->ceval.gil; -#else struct _gil_runtime_state *gil = &_PyRuntime.ceval.gil; -#endif return gil->interval; } diff --git a/Python/preconfig.c b/Python/preconfig.c index e7125cd2e3e0e..c30c75807a28a 100644 --- a/Python/preconfig.c +++ b/Python/preconfig.c @@ -294,17 +294,7 @@ _PyPreConfig_InitCompatConfig(PyPreConfig *config) config->coerce_c_locale_warn = 0; config->dev_mode = -1; -#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS - /* bpo-40512: pymalloc is not compatible with subinterpreters, - force usage of libc malloc() which is thread-safe. */ -#ifdef Py_DEBUG - config->allocator = PYMEM_ALLOCATOR_MALLOC_DEBUG; -#else - config->allocator = PYMEM_ALLOCATOR_MALLOC; -#endif -#else config->allocator = PYMEM_ALLOCATOR_NOT_SET; -#endif #ifdef MS_WINDOWS config->legacy_windows_fs_encoding = -1; #endif diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 42a058181dd69..31a358fe80de2 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -1981,12 +1981,10 @@ new_interpreter(PyThreadState **tstate_p, int isolated_subinterpreter) /* Copy the current interpreter config into the new interpreter */ const PyConfig *config; -#ifndef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS if (save_tstate != NULL) { config = _PyInterpreterState_GetConfig(save_tstate->interp); } else -#endif { /* No current thread state, copy from the main interpreter */ PyInterpreterState *main_interp = _PyInterpreterState_Main(); diff --git a/Python/pystate.c b/Python/pystate.c index 3e28a6ab69a98..df56c0530f05b 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -1165,14 +1165,6 @@ _PyThreadState_DeleteExcept(_PyRuntimeState *runtime, PyThreadState *tstate) } -#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS -PyThreadState* -_PyThreadState_GetTSS(void) { - return PyThread_tss_get(&_PyRuntime.gilstate.autoTSSkey); -} -#endif - - PyThreadState * _PyThreadState_UncheckedGet(void) { @@ -1192,11 +1184,7 @@ PyThreadState_Get(void) PyThreadState * _PyThreadState_Swap(struct _gilstate_runtime_state *gilstate, PyThreadState *newts) { -#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS - PyThreadState *oldts = _PyThreadState_GetTSS(); -#else PyThreadState *oldts = _PyRuntimeGILState_GetThreadState(gilstate); -#endif _PyRuntimeGILState_SetThreadState(gilstate, newts); /* It should not be possible for more than one thread state @@ -1214,9 +1202,6 @@ _PyThreadState_Swap(struct _gilstate_runtime_state *gilstate, PyThreadState *new Py_FatalError("Invalid thread state for this thread"); errno = err; } -#endif -#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS - PyThread_tss_set(&gilstate->autoTSSkey, newts); #endif return oldts; } @@ -1665,9 +1650,7 @@ PyGILState_Ensure(void) /* Ensure that _PyEval_InitThreads() and _PyGILState_Init() have been called by Py_Initialize() */ -#ifndef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS assert(_PyEval_ThreadsInitialized(runtime)); -#endif assert(gilstate->autoInterpreterState); PyThreadState *tcur = (PyThreadState *)PyThread_tss_get(&gilstate->autoTSSkey); diff --git a/configure b/configure index 04f0c4e0e8842..de2983aee7c08 100755 --- a/configure +++ b/configure @@ -1061,7 +1061,6 @@ with_openssl with_openssl_rpath with_ssl_default_suites with_builtin_hashlib_hashes -with_experimental_isolated_subinterpreters enable_test_modules ' ac_precious_vars='build_alias @@ -1861,9 +1860,6 @@ Optional Packages: --with-builtin-hashlib-hashes=md5,sha1,sha256,sha512,sha3,blake2 builtin hash modules, md5, sha1, sha256, sha512, sha3 (with shake), blake2 - --with-experimental-isolated-subinterpreters - better isolate subinterpreters, experimental build - mode (default is no) Some influential environment variables: PKG_CONFIG path to pkg-config utility @@ -22363,30 +22359,6 @@ fi fi -# --with-experimental-isolated-subinterpreters - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-experimental-isolated-subinterpreters" >&5 -$as_echo_n "checking for --with-experimental-isolated-subinterpreters... " >&6; } - -# Check whether --with-experimental-isolated-subinterpreters was given. -if test "${with_experimental_isolated_subinterpreters+set}" = set; then : - withval=$with_experimental_isolated_subinterpreters; -if test "$withval" != no -then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; }; - $as_echo "#define EXPERIMENTAL_ISOLATED_SUBINTERPRETERS 1" >>confdefs.h - -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; }; -fi -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - # Check whether to disable test modules. Once set, setup.py will not build # test extension modules and "make install" will not install test suites. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for --disable-test-modules" >&5 diff --git a/configure.ac b/configure.ac index 9b5926d79d44e..e925bc0c8df1a 100644 --- a/configure.ac +++ b/configure.ac @@ -6540,23 +6540,6 @@ AS_VAR_IF([with_builtin_blake2], [yes], [ ], [have_libb2=no]) ]) -# --with-experimental-isolated-subinterpreters -AH_TEMPLATE(EXPERIMENTAL_ISOLATED_SUBINTERPRETERS, - [Better isolate subinterpreters, experimental build mode.]) -AC_MSG_CHECKING(for --with-experimental-isolated-subinterpreters) -AC_ARG_WITH(experimental-isolated-subinterpreters, - AS_HELP_STRING([--with-experimental-isolated-subinterpreters], - [better isolate subinterpreters, experimental build mode (default is no)]), -[ -if test "$withval" != no -then - AC_MSG_RESULT(yes); - AC_DEFINE(EXPERIMENTAL_ISOLATED_SUBINTERPRETERS) -else - AC_MSG_RESULT(no); -fi], -[AC_MSG_RESULT(no)]) - # Check whether to disable test modules. Once set, setup.py will not build # test extension modules and "make install" will not install test suites. AC_MSG_CHECKING([for --disable-test-modules]) diff --git a/pyconfig.h.in b/pyconfig.h.in index a3bbbb894fd56..1fba0c68aae4b 100644 --- a/pyconfig.h.in +++ b/pyconfig.h.in @@ -44,9 +44,6 @@ /* Define if --enable-ipv6 is specified */ #undef ENABLE_IPV6 -/* Better isolate subinterpreters, experimental build mode. */ -#undef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS - /* Define to 1 if your system stores words within floats with the most significant word first */ #undef FLOAT_WORDS_BIGENDIAN From webhook-mailer at python.org Fri May 27 20:56:39 2022 From: webhook-mailer at python.org (miss-islington) Date: Sat, 28 May 2022 00:56:39 -0000 Subject: [Python-checkins] [3.11] bpo-40514: Drop EXPERIMENTAL_ISOLATED_SUBINTERPRETERS (gh-93185) (GH-93306) Message-ID: https://github.com/python/cpython/commit/36374251aa39c0a89be277fb76439bacc709f8b7 commit: 36374251aa39c0a89be277fb76439bacc709f8b7 branch: 3.11 author: Eric Snow committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-27T17:56:30-07:00 summary: [3.11] bpo-40514: Drop EXPERIMENTAL_ISOLATED_SUBINTERPRETERS (gh-93185) (GH-93306) (cherry picked from commit caa279d6fd5f151e57f891cd4f6ba51b532501c6) This was added for bpo-40514 (gh-84694) to test out a per-interpreter GIL. However, it has since proven unnecessary to keep the experiment in the repo. (It can be done as a branch in a fork like normal.) So here we are removing: * the configure option * the macro * the code enabled by the macro Automerge-Triggered-By: GH:ericsnowcurrently files: A Misc/NEWS.d/next/Core and Builtins/2022-05-25-12-30-12.gh-issue-84694.5sjy2w.rst M Doc/whatsnew/3.11.rst M Include/internal/pycore_ceval.h M Include/internal/pycore_interp.h M Include/internal/pycore_pystate.h M Include/internal/pycore_runtime.h M Modules/_xxsubinterpretersmodule.c M Modules/gcmodule.c M Objects/typeobject.c M Objects/unicodeobject.c M Python/ceval.c M Python/ceval_gil.h M Python/preconfig.c M Python/pylifecycle.c M Python/pystate.c M configure M configure.ac M pyconfig.h.in diff --git a/Doc/whatsnew/3.11.rst b/Doc/whatsnew/3.11.rst index 24d1343689c98..4f9bafefe2b9b 100644 --- a/Doc/whatsnew/3.11.rst +++ b/Doc/whatsnew/3.11.rst @@ -1425,6 +1425,11 @@ Removed Python's test suite." (Contributed by Victor Stinner in :issue:`46852`.) +* The ``--experimental-isolated-subinterpreters`` configure flag + (and corresponding ``EXPERIMENTAL_ISOLATED_SUBINTERPRETERS``) + have been removed. + + Porting to Python 3.11 ====================== diff --git a/Include/internal/pycore_ceval.h b/Include/internal/pycore_ceval.h index 3efd6beb035a1..d969a5e6eb99b 100644 --- a/Include/internal/pycore_ceval.h +++ b/Include/internal/pycore_ceval.h @@ -80,11 +80,7 @@ _PyEval_Vector(PyThreadState *tstate, PyObject* const* args, size_t argcount, PyObject *kwnames); -#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS -extern int _PyEval_ThreadsInitialized(PyInterpreterState *interp); -#else extern int _PyEval_ThreadsInitialized(struct pyruntimestate *runtime); -#endif extern PyStatus _PyEval_InitGIL(PyThreadState *tstate); extern void _PyEval_FiniGIL(PyInterpreterState *interp); diff --git a/Include/internal/pycore_interp.h b/Include/internal/pycore_interp.h index d55627908a28f..bcfcd88d84492 100644 --- a/Include/internal/pycore_interp.h +++ b/Include/internal/pycore_interp.h @@ -51,9 +51,6 @@ struct _ceval_state { /* Request for dropping the GIL */ _Py_atomic_int gil_drop_request; struct _pending_calls pending; -#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS - struct _gil_runtime_state gil; -#endif }; diff --git a/Include/internal/pycore_pystate.h b/Include/internal/pycore_pystate.h index c4bc53c707fda..e2d7c5bee28b9 100644 --- a/Include/internal/pycore_pystate.h +++ b/Include/internal/pycore_pystate.h @@ -64,18 +64,10 @@ _Py_ThreadCanHandlePendingCalls(void) /* Variable and macro for in-line access to current thread and interpreter state */ -#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS -PyAPI_FUNC(PyThreadState*) _PyThreadState_GetTSS(void); -#endif - static inline PyThreadState* _PyRuntimeState_GetThreadState(_PyRuntimeState *runtime) { -#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS - return _PyThreadState_GetTSS(); -#else return (PyThreadState*)_Py_atomic_load_relaxed(&runtime->gilstate.tstate_current); -#endif } /* Get the current Python thread state. @@ -90,11 +82,7 @@ _PyRuntimeState_GetThreadState(_PyRuntimeState *runtime) static inline PyThreadState* _PyThreadState_GET(void) { -#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS - return _PyThreadState_GetTSS(); -#else return _PyRuntimeState_GetThreadState(&_PyRuntime); -#endif } PyAPI_FUNC(void) _Py_NO_RETURN _Py_FatalError_TstateNULL(const char *func); diff --git a/Include/internal/pycore_runtime.h b/Include/internal/pycore_runtime.h index 18191c3771dfc..ae63ae74afa5f 100644 --- a/Include/internal/pycore_runtime.h +++ b/Include/internal/pycore_runtime.h @@ -23,9 +23,7 @@ struct _ceval_runtime_state { the main thread of the main interpreter can handle signals: see _Py_ThreadCanHandleSignals(). */ _Py_atomic_int signals_pending; -#ifndef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS struct _gil_runtime_state gil; -#endif }; /* GIL state */ diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-25-12-30-12.gh-issue-84694.5sjy2w.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-25-12-30-12.gh-issue-84694.5sjy2w.rst new file mode 100644 index 0000000000000..c062d28b29486 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-05-25-12-30-12.gh-issue-84694.5sjy2w.rst @@ -0,0 +1,2 @@ +The ``--experimental-isolated-subinterpreters`` configure option and +``EXPERIMENTAL_ISOLATED_SUBINTERPRETERS`` macro have been removed. diff --git a/Modules/_xxsubinterpretersmodule.c b/Modules/_xxsubinterpretersmodule.c index 9b1f186c5b6c7..d1df00111cf54 100644 --- a/Modules/_xxsubinterpretersmodule.c +++ b/Modules/_xxsubinterpretersmodule.c @@ -1932,20 +1932,6 @@ _run_script_in_interpreter(PyInterpreterState *interp, const char *codestr, return -1; } -#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS - // Switch to interpreter. - PyThreadState *new_tstate = PyInterpreterState_ThreadHead(interp); - PyThreadState *save1 = PyEval_SaveThread(); - - (void)PyThreadState_Swap(new_tstate); - - // Run the script. - _sharedexception *exc = NULL; - int result = _run_script(interp, codestr, shared, &exc); - - // Switch back. - PyEval_RestoreThread(save1); -#else // Switch to interpreter. PyThreadState *save_tstate = NULL; if (interp != PyInterpreterState_Get()) { @@ -1963,7 +1949,6 @@ _run_script_in_interpreter(PyInterpreterState *interp, const char *codestr, if (save_tstate != NULL) { PyThreadState_Swap(save_tstate); } -#endif // Propagate any exception out to the caller. if (exc != NULL) { diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c index 45dad8f0824df..3bda6e4bb8c02 100644 --- a/Modules/gcmodule.c +++ b/Modules/gcmodule.c @@ -1195,14 +1195,6 @@ gc_collect_main(PyThreadState *tstate, int generation, assert(gcstate->garbage != NULL); assert(!_PyErr_Occurred(tstate)); -#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS - if (tstate->interp->config._isolated_interpreter) { - // bpo-40533: The garbage collector must not be run on parallel on - // Python objects shared by multiple interpreters. - return 0; - } -#endif - if (gcstate->debug & DEBUG_STATS) { PySys_WriteStderr("gc: collecting generation %d...\n", generation); show_stats_each_generations(gcstate); diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 1bcfd9a9c52bc..c1bae0b9a6d62 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -54,11 +54,6 @@ typedef struct PySlot_Offset { } PySlot_Offset; -/* bpo-40521: Interned strings are shared by all subinterpreters */ -#ifndef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS -# define INTERN_NAME_STRINGS -#endif - static PyObject * slot_tp_new(PyTypeObject *type, PyObject *args, PyObject *kwds); @@ -4009,7 +4004,7 @@ type_setattro(PyTypeObject *type, PyObject *name, PyObject *value) if (name == NULL) return -1; } -#ifdef INTERN_NAME_STRINGS + /* bpo-40521: Interned strings are shared by all subinterpreters */ if (!PyUnicode_CHECK_INTERNED(name)) { PyUnicode_InternInPlace(&name); if (!PyUnicode_CHECK_INTERNED(name)) { @@ -4019,7 +4014,6 @@ type_setattro(PyTypeObject *type, PyObject *name, PyObject *value) return -1; } } -#endif } else { /* Will fail in _PyObject_GenericSetAttrWithDict. */ @@ -8456,17 +8450,11 @@ _PyTypes_InitSlotDefs(void) for (slotdef *p = slotdefs; p->name; p++) { /* Slots must be ordered by their offset in the PyHeapTypeObject. */ assert(!p[1].name || p->offset <= p[1].offset); -#ifdef INTERN_NAME_STRINGS + /* bpo-40521: Interned strings are shared by all subinterpreters */ p->name_strobj = PyUnicode_InternFromString(p->name); if (!p->name_strobj || !PyUnicode_CHECK_INTERNED(p->name_strobj)) { return _PyStatus_NO_MEMORY(); } -#else - p->name_strobj = PyUnicode_FromString(p->name); - if (!p->name_strobj) { - return _PyStatus_NO_MEMORY(); - } -#endif } slotdefs_initialized = 1; return _PyStatus_OK(); @@ -8491,24 +8479,17 @@ update_slot(PyTypeObject *type, PyObject *name) int offset; assert(PyUnicode_CheckExact(name)); -#ifdef INTERN_NAME_STRINGS assert(PyUnicode_CHECK_INTERNED(name)); -#endif assert(slotdefs_initialized); pp = ptrs; for (p = slotdefs; p->name; p++) { assert(PyUnicode_CheckExact(p->name_strobj)); assert(PyUnicode_CheckExact(name)); -#ifdef INTERN_NAME_STRINGS + /* bpo-40521: Using interned strings. */ if (p->name_strobj == name) { *pp++ = p; } -#else - if (p->name_strobj == name || _PyUnicode_EQ(p->name_strobj, name)) { - *pp++ = p; - } -#endif } *pp = NULL; for (pp = ptrs; *pp; pp++) { diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 656c7ccc8e865..a7bd961c64a83 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -219,11 +219,6 @@ extern "C" { # define OVERALLOCATE_FACTOR 4 #endif -/* bpo-40521: Interned strings are shared by all interpreters. */ -#ifndef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS -# define INTERNED_STRINGS -#endif - /* This dictionary holds all interned unicode strings. Note that references to strings in this dictionary are *not* counted in the string's ob_refcnt. When the interned string reaches a refcnt of 0 the string deallocation @@ -232,9 +227,7 @@ extern "C" { Another way to look at this is that to say that the actual reference count of a string is: s->ob_refcnt + (s->state ? 2 : 0) */ -#ifdef INTERNED_STRINGS static PyObject *interned = NULL; -#endif /* Forward declaration */ static inline int @@ -1924,10 +1917,8 @@ unicode_dealloc(PyObject *unicode) switch (PyUnicode_CHECK_INTERNED(unicode)) { case SSTATE_NOT_INTERNED: break; - case SSTATE_INTERNED_MORTAL: { -#ifdef INTERNED_STRINGS /* Revive the dead object temporarily. PyDict_DelItem() removes two references (key and value) which were ignored by PyUnicode_InternInPlace(). Use refcnt=3 rather than refcnt=2 @@ -1941,7 +1932,6 @@ unicode_dealloc(PyObject *unicode) } assert(Py_REFCNT(unicode) == 1); Py_SET_REFCNT(unicode, 0); -#endif break; } @@ -11314,13 +11304,11 @@ _PyUnicode_EqualToASCIIId(PyObject *left, _Py_Identifier *right) if (PyUnicode_CHECK_INTERNED(left)) return 0; -#ifdef INTERNED_STRINGS assert(_PyUnicode_HASH(right_uni) != -1); Py_hash_t hash = _PyUnicode_HASH(left); if (hash != -1 && hash != _PyUnicode_HASH(right_uni)) { return 0; } -#endif return unicode_compare_eq(left, right_uni); } @@ -15562,7 +15550,6 @@ PyUnicode_InternInPlace(PyObject **p) return; } -#ifdef INTERNED_STRINGS if (PyUnicode_READY(s) == -1) { PyErr_Clear(); return; @@ -15593,11 +15580,6 @@ PyUnicode_InternInPlace(PyObject **p) this. */ Py_SET_REFCNT(s, Py_REFCNT(s) - 2); _PyUnicode_STATE(s).interned = SSTATE_INTERNED_MORTAL; -#else - // PyDict expects that interned strings have their hash - // (PyASCIIObject.hash) already computed. - (void)unicode_hash(s); -#endif } void diff --git a/Python/ceval.c b/Python/ceval.c index 62379b4a85527..b8b27a815fb25 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -348,21 +348,6 @@ _Py_FatalError_TstateNULL(const char *func) "(the current Python thread state is NULL)"); } -#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS -int -_PyEval_ThreadsInitialized(PyInterpreterState *interp) -{ - return gil_created(&interp->ceval.gil); -} - -int -PyEval_ThreadsInitialized(void) -{ - // Fatal error if there is no current interpreter - PyInterpreterState *interp = PyInterpreterState_Get(); - return _PyEval_ThreadsInitialized(interp); -} -#else int _PyEval_ThreadsInitialized(_PyRuntimeState *runtime) { @@ -375,25 +360,18 @@ PyEval_ThreadsInitialized(void) _PyRuntimeState *runtime = &_PyRuntime; return _PyEval_ThreadsInitialized(runtime); } -#endif PyStatus _PyEval_InitGIL(PyThreadState *tstate) { -#ifndef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS if (!_Py_IsMainInterpreter(tstate->interp)) { /* Currently, the GIL is shared by all interpreters, and only the main interpreter is responsible to create and destroy it. */ return _PyStatus_OK(); } -#endif -#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS - struct _gil_runtime_state *gil = &tstate->interp->ceval.gil; -#else struct _gil_runtime_state *gil = &tstate->interp->runtime->ceval.gil; -#endif assert(!gil_created(gil)); PyThread_init_thread(); @@ -408,20 +386,14 @@ _PyEval_InitGIL(PyThreadState *tstate) void _PyEval_FiniGIL(PyInterpreterState *interp) { -#ifndef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS if (!_Py_IsMainInterpreter(interp)) { /* Currently, the GIL is shared by all interpreters, and only the main interpreter is responsible to create and destroy it. */ return; } -#endif -#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS - struct _gil_runtime_state *gil = &interp->ceval.gil; -#else struct _gil_runtime_state *gil = &interp->runtime->ceval.gil; -#endif if (!gil_created(gil)) { /* First Py_InitializeFromConfig() call: the GIL doesn't exist yet: do nothing. */ @@ -485,13 +457,9 @@ PyEval_AcquireThread(PyThreadState *tstate) take_gil(tstate); struct _gilstate_runtime_state *gilstate = &tstate->interp->runtime->gilstate; -#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS - (void)_PyThreadState_Swap(gilstate, tstate); -#else if (_PyThreadState_Swap(gilstate, tstate) != NULL) { Py_FatalError("non-NULL old thread state"); } -#endif } void @@ -518,11 +486,7 @@ _PyEval_ReInitThreads(PyThreadState *tstate) { _PyRuntimeState *runtime = tstate->interp->runtime; -#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS - struct _gil_runtime_state *gil = &tstate->interp->ceval.gil; -#else struct _gil_runtime_state *gil = &runtime->ceval.gil; -#endif if (!gil_created(gil)) { return _PyStatus_OK(); } @@ -554,21 +518,12 @@ PyThreadState * PyEval_SaveThread(void) { _PyRuntimeState *runtime = &_PyRuntime; -#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS - PyThreadState *old_tstate = _PyThreadState_GET(); - PyThreadState *tstate = _PyThreadState_Swap(&runtime->gilstate, old_tstate); -#else PyThreadState *tstate = _PyThreadState_Swap(&runtime->gilstate, NULL); -#endif _Py_EnsureTstateNotNULL(tstate); struct _ceval_runtime_state *ceval = &runtime->ceval; struct _ceval_state *ceval2 = &tstate->interp->ceval; -#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS - assert(gil_created(&ceval2->gil)); -#else assert(gil_created(&ceval->gil)); -#endif drop_gil(ceval, ceval2, tstate); return tstate; } @@ -832,9 +787,7 @@ Py_MakePendingCalls(void) void _PyEval_InitRuntimeState(struct _ceval_runtime_state *ceval) { -#ifndef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS _gil_initialize(&ceval->gil); -#endif } void @@ -844,10 +797,6 @@ _PyEval_InitState(struct _ceval_state *ceval, PyThread_type_lock pending_lock) assert(pending->lock == NULL); pending->lock = pending_lock; - -#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS - _gil_initialize(&ceval->gil); -#endif } void @@ -1262,13 +1211,9 @@ eval_frame_handle_pending(PyThreadState *tstate) take_gil(tstate); -#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS - (void)_PyThreadState_Swap(&runtime->gilstate, tstate); -#else if (_PyThreadState_Swap(&runtime->gilstate, tstate) != NULL) { Py_FatalError("orphan tstate"); } -#endif } /* Check for asynchronous exception. */ diff --git a/Python/ceval_gil.h b/Python/ceval_gil.h index 9b8b43253f04d..1b2dc7f8e1dc3 100644 --- a/Python/ceval_gil.h +++ b/Python/ceval_gil.h @@ -144,11 +144,7 @@ static void drop_gil(struct _ceval_runtime_state *ceval, struct _ceval_state *ceval2, PyThreadState *tstate) { -#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS - struct _gil_runtime_state *gil = &ceval2->gil; -#else struct _gil_runtime_state *gil = &ceval->gil; -#endif if (!_Py_atomic_load_relaxed(&gil->locked)) { Py_FatalError("drop_gil: GIL is not locked"); } @@ -232,11 +228,7 @@ take_gil(PyThreadState *tstate) PyInterpreterState *interp = tstate->interp; struct _ceval_runtime_state *ceval = &interp->runtime->ceval; struct _ceval_state *ceval2 = &interp->ceval; -#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS - struct _gil_runtime_state *gil = &ceval2->gil; -#else struct _gil_runtime_state *gil = &ceval->gil; -#endif /* Check that _PyEval_InitThreads() was called to create the lock */ assert(gil_created(gil)); @@ -328,22 +320,12 @@ take_gil(PyThreadState *tstate) void _PyEval_SetSwitchInterval(unsigned long microseconds) { -#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS - PyInterpreterState *interp = PyInterpreterState_Get(); - struct _gil_runtime_state *gil = &interp->ceval.gil; -#else struct _gil_runtime_state *gil = &_PyRuntime.ceval.gil; -#endif gil->interval = microseconds; } unsigned long _PyEval_GetSwitchInterval() { -#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS - PyInterpreterState *interp = PyInterpreterState_Get(); - struct _gil_runtime_state *gil = &interp->ceval.gil; -#else struct _gil_runtime_state *gil = &_PyRuntime.ceval.gil; -#endif return gil->interval; } diff --git a/Python/preconfig.c b/Python/preconfig.c index afa16cccf32e9..0deb07a893ddf 100644 --- a/Python/preconfig.c +++ b/Python/preconfig.c @@ -294,17 +294,7 @@ _PyPreConfig_InitCompatConfig(PyPreConfig *config) config->coerce_c_locale_warn = 0; config->dev_mode = -1; -#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS - /* bpo-40512: pymalloc is not compatible with subinterpreters, - force usage of libc malloc() which is thread-safe. */ -#ifdef Py_DEBUG - config->allocator = PYMEM_ALLOCATOR_MALLOC_DEBUG; -#else - config->allocator = PYMEM_ALLOCATOR_MALLOC; -#endif -#else config->allocator = PYMEM_ALLOCATOR_NOT_SET; -#endif #ifdef MS_WINDOWS config->legacy_windows_fs_encoding = -1; #endif diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 273f6d62b2a20..960a38aebef8d 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -1986,12 +1986,10 @@ new_interpreter(PyThreadState **tstate_p, int isolated_subinterpreter) /* Copy the current interpreter config into the new interpreter */ const PyConfig *config; -#ifndef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS if (save_tstate != NULL) { config = _PyInterpreterState_GetConfig(save_tstate->interp); } else -#endif { /* No current thread state, copy from the main interpreter */ PyInterpreterState *main_interp = _PyInterpreterState_Main(); diff --git a/Python/pystate.c b/Python/pystate.c index 3e28a6ab69a98..df56c0530f05b 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -1165,14 +1165,6 @@ _PyThreadState_DeleteExcept(_PyRuntimeState *runtime, PyThreadState *tstate) } -#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS -PyThreadState* -_PyThreadState_GetTSS(void) { - return PyThread_tss_get(&_PyRuntime.gilstate.autoTSSkey); -} -#endif - - PyThreadState * _PyThreadState_UncheckedGet(void) { @@ -1192,11 +1184,7 @@ PyThreadState_Get(void) PyThreadState * _PyThreadState_Swap(struct _gilstate_runtime_state *gilstate, PyThreadState *newts) { -#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS - PyThreadState *oldts = _PyThreadState_GetTSS(); -#else PyThreadState *oldts = _PyRuntimeGILState_GetThreadState(gilstate); -#endif _PyRuntimeGILState_SetThreadState(gilstate, newts); /* It should not be possible for more than one thread state @@ -1214,9 +1202,6 @@ _PyThreadState_Swap(struct _gilstate_runtime_state *gilstate, PyThreadState *new Py_FatalError("Invalid thread state for this thread"); errno = err; } -#endif -#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS - PyThread_tss_set(&gilstate->autoTSSkey, newts); #endif return oldts; } @@ -1665,9 +1650,7 @@ PyGILState_Ensure(void) /* Ensure that _PyEval_InitThreads() and _PyGILState_Init() have been called by Py_Initialize() */ -#ifndef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS assert(_PyEval_ThreadsInitialized(runtime)); -#endif assert(gilstate->autoInterpreterState); PyThreadState *tcur = (PyThreadState *)PyThread_tss_get(&gilstate->autoTSSkey); diff --git a/configure b/configure index b3267025b7305..5ee45f320dff3 100755 --- a/configure +++ b/configure @@ -1061,7 +1061,6 @@ with_openssl with_openssl_rpath with_ssl_default_suites with_builtin_hashlib_hashes -with_experimental_isolated_subinterpreters enable_test_modules ' ac_precious_vars='build_alias @@ -1861,9 +1860,6 @@ Optional Packages: --with-builtin-hashlib-hashes=md5,sha1,sha256,sha512,sha3,blake2 builtin hash modules, md5, sha1, sha256, sha512, sha3 (with shake), blake2 - --with-experimental-isolated-subinterpreters - better isolate subinterpreters, experimental build - mode (default is no) Some influential environment variables: PKG_CONFIG path to pkg-config utility @@ -22475,30 +22471,6 @@ fi fi -# --with-experimental-isolated-subinterpreters - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-experimental-isolated-subinterpreters" >&5 -$as_echo_n "checking for --with-experimental-isolated-subinterpreters... " >&6; } - -# Check whether --with-experimental-isolated-subinterpreters was given. -if test "${with_experimental_isolated_subinterpreters+set}" = set; then : - withval=$with_experimental_isolated_subinterpreters; -if test "$withval" != no -then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; }; - $as_echo "#define EXPERIMENTAL_ISOLATED_SUBINTERPRETERS 1" >>confdefs.h - -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; }; -fi -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - # Check whether to disable test modules. Once set, setup.py will not build # test extension modules and "make install" will not install test suites. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for --disable-test-modules" >&5 diff --git a/configure.ac b/configure.ac index 65ec1393e5842..91f124aebb68b 100644 --- a/configure.ac +++ b/configure.ac @@ -6607,23 +6607,6 @@ AS_VAR_IF([with_builtin_blake2], [yes], [ ], [have_libb2=no]) ]) -# --with-experimental-isolated-subinterpreters -AH_TEMPLATE(EXPERIMENTAL_ISOLATED_SUBINTERPRETERS, - [Better isolate subinterpreters, experimental build mode.]) -AC_MSG_CHECKING(for --with-experimental-isolated-subinterpreters) -AC_ARG_WITH(experimental-isolated-subinterpreters, - AS_HELP_STRING([--with-experimental-isolated-subinterpreters], - [better isolate subinterpreters, experimental build mode (default is no)]), -[ -if test "$withval" != no -then - AC_MSG_RESULT(yes); - AC_DEFINE(EXPERIMENTAL_ISOLATED_SUBINTERPRETERS) -else - AC_MSG_RESULT(no); -fi], -[AC_MSG_RESULT(no)]) - # Check whether to disable test modules. Once set, setup.py will not build # test extension modules and "make install" will not install test suites. AC_MSG_CHECKING([for --disable-test-modules]) diff --git a/pyconfig.h.in b/pyconfig.h.in index 383fd47dd43c8..b325ef259c8c0 100644 --- a/pyconfig.h.in +++ b/pyconfig.h.in @@ -44,9 +44,6 @@ /* Define if --enable-ipv6 is specified */ #undef ENABLE_IPV6 -/* Better isolate subinterpreters, experimental build mode. */ -#undef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS - /* Define to 1 if your system stores words within floats with the most significant word first */ #undef FLOAT_WORDS_BIGENDIAN From webhook-mailer at python.org Fri May 27 23:32:12 2022 From: webhook-mailer at python.org (corona10) Date: Sat, 28 May 2022 03:32:12 -0000 Subject: [Python-checkins] gh-84508: Add mapping files for Korean and Japanese. (gh-93309) Message-ID: https://github.com/python/cpython/commit/dec1e9346d82fa4a4761389c81d36ef9d01f332b commit: dec1e9346d82fa4a4761389c81d36ef9d01f332b branch: main author: Dong-hee Na committer: corona10 date: 2022-05-28T12:32:00+09:00 summary: gh-84508: Add mapping files for Korean and Japanese. (gh-93309) files: A Tools/unicode/python-mappings/CP932.TXT A Tools/unicode/python-mappings/CP949.TXT A Tools/unicode/python-mappings/JIS0208.TXT A Tools/unicode/python-mappings/JIS0212.TXT diff --git a/Tools/unicode/python-mappings/CP932.TXT b/Tools/unicode/python-mappings/CP932.TXT new file mode 100644 index 0000000000000..7ff471bcd1058 --- /dev/null +++ b/Tools/unicode/python-mappings/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 at 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/Tools/unicode/python-mappings/CP949.TXT b/Tools/unicode/python-mappings/CP949.TXT new file mode 100644 index 0000000000000..d2822fc525d93 --- /dev/null +++ b/Tools/unicode/python-mappings/CP949.TXT @@ -0,0 +1,17322 @@ +# +# Name: cp949 to Unicode table +# Unicode version: 2.0 +# Table version: 2.01 +# Table format: Format A +# Date: 1/7/2000 +# +# Contact: Shawn.Steele at microsoft.com +# +# General notes: none +# +# Format: Three tab-separated columns +# Column #1 is the cp949 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 cp949 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 #DBCS LEAD BYTE +0xA1 #DBCS LEAD BYTE +0xA2 #DBCS LEAD BYTE +0xA3 #DBCS LEAD BYTE +0xA4 #DBCS LEAD BYTE +0xA5 #DBCS LEAD BYTE +0xA6 #DBCS LEAD BYTE +0xA7 #DBCS LEAD BYTE +0xA8 #DBCS LEAD BYTE +0xA9 #DBCS LEAD BYTE +0xAA #DBCS LEAD BYTE +0xAB #DBCS LEAD BYTE +0xAC #DBCS LEAD BYTE +0xAD #DBCS LEAD BYTE +0xAE #DBCS LEAD BYTE +0xAF #DBCS LEAD BYTE +0xB0 #DBCS LEAD BYTE +0xB1 #DBCS LEAD BYTE +0xB2 #DBCS LEAD BYTE +0xB3 #DBCS LEAD BYTE +0xB4 #DBCS LEAD BYTE +0xB5 #DBCS LEAD BYTE +0xB6 #DBCS LEAD BYTE +0xB7 #DBCS LEAD BYTE +0xB8 #DBCS LEAD BYTE +0xB9 #DBCS LEAD BYTE +0xBA #DBCS LEAD BYTE +0xBB #DBCS LEAD BYTE +0xBC #DBCS LEAD BYTE +0xBD #DBCS LEAD BYTE +0xBE #DBCS LEAD BYTE +0xBF #DBCS LEAD BYTE +0xC0 #DBCS LEAD BYTE +0xC1 #DBCS LEAD BYTE +0xC2 #DBCS LEAD BYTE +0xC3 #DBCS LEAD BYTE +0xC4 #DBCS LEAD BYTE +0xC5 #DBCS LEAD BYTE +0xC6 #DBCS LEAD BYTE +0xC7 #DBCS LEAD BYTE +0xC8 #DBCS LEAD BYTE +0xC9 #DBCS LEAD BYTE +0xCA #DBCS LEAD BYTE +0xCB #DBCS LEAD BYTE +0xCC #DBCS LEAD BYTE +0xCD #DBCS LEAD BYTE +0xCE #DBCS LEAD BYTE +0xCF #DBCS LEAD BYTE +0xD0 #DBCS LEAD BYTE +0xD1 #DBCS LEAD BYTE +0xD2 #DBCS LEAD BYTE +0xD3 #DBCS LEAD BYTE +0xD4 #DBCS LEAD BYTE +0xD5 #DBCS LEAD BYTE +0xD6 #DBCS LEAD BYTE +0xD7 #DBCS LEAD BYTE +0xD8 #DBCS LEAD BYTE +0xD9 #DBCS LEAD BYTE +0xDA #DBCS LEAD BYTE +0xDB #DBCS LEAD BYTE +0xDC #DBCS LEAD BYTE +0xDD #DBCS LEAD BYTE +0xDE #DBCS LEAD BYTE +0xDF #DBCS LEAD BYTE +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 #DBCS LEAD BYTE +0xFE #DBCS LEAD BYTE +0xFF #UNDEFINED +0x8141 0xAC02 #HANGUL SYLLABLE KIYEOK A SSANGKIYEOK +0x8142 0xAC03 #HANGUL SYLLABLE KIYEOK A KIYEOKSIOS +0x8143 0xAC05 #HANGUL SYLLABLE KIYEOK A NIEUNCIEUC +0x8144 0xAC06 #HANGUL SYLLABLE KIYEOK A NIEUNHIEUH +0x8145 0xAC0B #HANGUL SYLLABLE KIYEOK A RIEULPIEUP +0x8146 0xAC0C #HANGUL SYLLABLE KIYEOK A RIEULSIOS +0x8147 0xAC0D #HANGUL SYLLABLE KIYEOK A RIEULTHIEUTH +0x8148 0xAC0E #HANGUL SYLLABLE KIYEOK A RIEULPHIEUPH +0x8149 0xAC0F #HANGUL SYLLABLE KIYEOK A RIEULHIEUH +0x814A 0xAC18 #HANGUL SYLLABLE KIYEOK A KHIEUKH +0x814B 0xAC1E #HANGUL SYLLABLE KIYEOK AE SSANGKIYEOK +0x814C 0xAC1F #HANGUL SYLLABLE KIYEOK AE KIYEOKSIOS +0x814D 0xAC21 #HANGUL SYLLABLE KIYEOK AE NIEUNCIEUC +0x814E 0xAC22 #HANGUL SYLLABLE KIYEOK AE NIEUNHIEUH +0x814F 0xAC23 #HANGUL SYLLABLE KIYEOK AE TIKEUT +0x8150 0xAC25 #HANGUL SYLLABLE KIYEOK AE RIEULKIYEOK +0x8151 0xAC26 #HANGUL SYLLABLE KIYEOK AE RIEULMIEUM +0x8152 0xAC27 #HANGUL SYLLABLE KIYEOK AE RIEULPIEUP +0x8153 0xAC28 #HANGUL SYLLABLE KIYEOK AE RIEULSIOS +0x8154 0xAC29 #HANGUL SYLLABLE KIYEOK AE RIEULTHIEUTH +0x8155 0xAC2A #HANGUL SYLLABLE KIYEOK AE RIEULPHIEUPH +0x8156 0xAC2B #HANGUL SYLLABLE KIYEOK AE RIEULHIEUH +0x8157 0xAC2E #HANGUL SYLLABLE KIYEOK AE PIEUPSIOS +0x8158 0xAC32 #HANGUL SYLLABLE KIYEOK AE CIEUC +0x8159 0xAC33 #HANGUL SYLLABLE KIYEOK AE CHIEUCH +0x815A 0xAC34 #HANGUL SYLLABLE KIYEOK AE KHIEUKH +0x8161 0xAC35 #HANGUL SYLLABLE KIYEOK AE THIEUTH +0x8162 0xAC36 #HANGUL SYLLABLE KIYEOK AE PHIEUPH +0x8163 0xAC37 #HANGUL SYLLABLE KIYEOK AE HIEUH +0x8164 0xAC3A #HANGUL SYLLABLE KIYEOK YA SSANGKIYEOK +0x8165 0xAC3B #HANGUL SYLLABLE KIYEOK YA KIYEOKSIOS +0x8166 0xAC3D #HANGUL SYLLABLE KIYEOK YA NIEUNCIEUC +0x8167 0xAC3E #HANGUL SYLLABLE KIYEOK YA NIEUNHIEUH +0x8168 0xAC3F #HANGUL SYLLABLE KIYEOK YA TIKEUT +0x8169 0xAC41 #HANGUL SYLLABLE KIYEOK YA RIEULKIYEOK +0x816A 0xAC42 #HANGUL SYLLABLE KIYEOK YA RIEULMIEUM +0x816B 0xAC43 #HANGUL SYLLABLE KIYEOK YA RIEULPIEUP +0x816C 0xAC44 #HANGUL SYLLABLE KIYEOK YA RIEULSIOS +0x816D 0xAC45 #HANGUL SYLLABLE KIYEOK YA RIEULTHIEUTH +0x816E 0xAC46 #HANGUL SYLLABLE KIYEOK YA RIEULPHIEUPH +0x816F 0xAC47 #HANGUL SYLLABLE KIYEOK YA RIEULHIEUH +0x8170 0xAC48 #HANGUL SYLLABLE KIYEOK YA MIEUM +0x8171 0xAC49 #HANGUL SYLLABLE KIYEOK YA PIEUP +0x8172 0xAC4A #HANGUL SYLLABLE KIYEOK YA PIEUPSIOS +0x8173 0xAC4C #HANGUL SYLLABLE KIYEOK YA SSANGSIOS +0x8174 0xAC4E #HANGUL SYLLABLE KIYEOK YA CIEUC +0x8175 0xAC4F #HANGUL SYLLABLE KIYEOK YA CHIEUCH +0x8176 0xAC50 #HANGUL SYLLABLE KIYEOK YA KHIEUKH +0x8177 0xAC51 #HANGUL SYLLABLE KIYEOK YA THIEUTH +0x8178 0xAC52 #HANGUL SYLLABLE KIYEOK YA PHIEUPH +0x8179 0xAC53 #HANGUL SYLLABLE KIYEOK YA HIEUH +0x817A 0xAC55 #HANGUL SYLLABLE KIYEOK YAE KIYEOK +0x8181 0xAC56 #HANGUL SYLLABLE KIYEOK YAE SSANGKIYEOK +0x8182 0xAC57 #HANGUL SYLLABLE KIYEOK YAE KIYEOKSIOS +0x8183 0xAC59 #HANGUL SYLLABLE KIYEOK YAE NIEUNCIEUC +0x8184 0xAC5A #HANGUL SYLLABLE KIYEOK YAE NIEUNHIEUH +0x8185 0xAC5B #HANGUL SYLLABLE KIYEOK YAE TIKEUT +0x8186 0xAC5D #HANGUL SYLLABLE KIYEOK YAE RIEULKIYEOK +0x8187 0xAC5E #HANGUL SYLLABLE KIYEOK YAE RIEULMIEUM +0x8188 0xAC5F #HANGUL SYLLABLE KIYEOK YAE RIEULPIEUP +0x8189 0xAC60 #HANGUL SYLLABLE KIYEOK YAE RIEULSIOS +0x818A 0xAC61 #HANGUL SYLLABLE KIYEOK YAE RIEULTHIEUTH +0x818B 0xAC62 #HANGUL SYLLABLE KIYEOK YAE RIEULPHIEUPH +0x818C 0xAC63 #HANGUL SYLLABLE KIYEOK YAE RIEULHIEUH +0x818D 0xAC64 #HANGUL SYLLABLE KIYEOK YAE MIEUM +0x818E 0xAC65 #HANGUL SYLLABLE KIYEOK YAE PIEUP +0x818F 0xAC66 #HANGUL SYLLABLE KIYEOK YAE PIEUPSIOS +0x8190 0xAC67 #HANGUL SYLLABLE KIYEOK YAE SIOS +0x8191 0xAC68 #HANGUL SYLLABLE KIYEOK YAE SSANGSIOS +0x8192 0xAC69 #HANGUL SYLLABLE KIYEOK YAE IEUNG +0x8193 0xAC6A #HANGUL SYLLABLE KIYEOK YAE CIEUC +0x8194 0xAC6B #HANGUL SYLLABLE KIYEOK YAE CHIEUCH +0x8195 0xAC6C #HANGUL SYLLABLE KIYEOK YAE KHIEUKH +0x8196 0xAC6D #HANGUL SYLLABLE KIYEOK YAE THIEUTH +0x8197 0xAC6E #HANGUL SYLLABLE KIYEOK YAE PHIEUPH +0x8198 0xAC6F #HANGUL SYLLABLE KIYEOK YAE HIEUH +0x8199 0xAC72 #HANGUL SYLLABLE KIYEOK EO SSANGKIYEOK +0x819A 0xAC73 #HANGUL SYLLABLE KIYEOK EO KIYEOKSIOS +0x819B 0xAC75 #HANGUL SYLLABLE KIYEOK EO NIEUNCIEUC +0x819C 0xAC76 #HANGUL SYLLABLE KIYEOK EO NIEUNHIEUH +0x819D 0xAC79 #HANGUL SYLLABLE KIYEOK EO RIEULKIYEOK +0x819E 0xAC7B #HANGUL SYLLABLE KIYEOK EO RIEULPIEUP +0x819F 0xAC7C #HANGUL SYLLABLE KIYEOK EO RIEULSIOS +0x81A0 0xAC7D #HANGUL SYLLABLE KIYEOK EO RIEULTHIEUTH +0x81A1 0xAC7E #HANGUL SYLLABLE KIYEOK EO RIEULPHIEUPH +0x81A2 0xAC7F #HANGUL SYLLABLE KIYEOK EO RIEULHIEUH +0x81A3 0xAC82 #HANGUL SYLLABLE KIYEOK EO PIEUPSIOS +0x81A4 0xAC87 #HANGUL SYLLABLE KIYEOK EO CHIEUCH +0x81A5 0xAC88 #HANGUL SYLLABLE KIYEOK EO KHIEUKH +0x81A6 0xAC8D #HANGUL SYLLABLE KIYEOK E KIYEOK +0x81A7 0xAC8E #HANGUL SYLLABLE KIYEOK E SSANGKIYEOK +0x81A8 0xAC8F #HANGUL SYLLABLE KIYEOK E KIYEOKSIOS +0x81A9 0xAC91 #HANGUL SYLLABLE KIYEOK E NIEUNCIEUC +0x81AA 0xAC92 #HANGUL SYLLABLE KIYEOK E NIEUNHIEUH +0x81AB 0xAC93 #HANGUL SYLLABLE KIYEOK E TIKEUT +0x81AC 0xAC95 #HANGUL SYLLABLE KIYEOK E RIEULKIYEOK +0x81AD 0xAC96 #HANGUL SYLLABLE KIYEOK E RIEULMIEUM +0x81AE 0xAC97 #HANGUL SYLLABLE KIYEOK E RIEULPIEUP +0x81AF 0xAC98 #HANGUL SYLLABLE KIYEOK E RIEULSIOS +0x81B0 0xAC99 #HANGUL SYLLABLE KIYEOK E RIEULTHIEUTH +0x81B1 0xAC9A #HANGUL SYLLABLE KIYEOK E RIEULPHIEUPH +0x81B2 0xAC9B #HANGUL SYLLABLE KIYEOK E RIEULHIEUH +0x81B3 0xAC9E #HANGUL SYLLABLE KIYEOK E PIEUPSIOS +0x81B4 0xACA2 #HANGUL SYLLABLE KIYEOK E CIEUC +0x81B5 0xACA3 #HANGUL SYLLABLE KIYEOK E CHIEUCH +0x81B6 0xACA4 #HANGUL SYLLABLE KIYEOK E KHIEUKH +0x81B7 0xACA5 #HANGUL SYLLABLE KIYEOK E THIEUTH +0x81B8 0xACA6 #HANGUL SYLLABLE KIYEOK E PHIEUPH +0x81B9 0xACA7 #HANGUL SYLLABLE KIYEOK E HIEUH +0x81BA 0xACAB #HANGUL SYLLABLE KIYEOK YEO KIYEOKSIOS +0x81BB 0xACAD #HANGUL SYLLABLE KIYEOK YEO NIEUNCIEUC +0x81BC 0xACAE #HANGUL SYLLABLE KIYEOK YEO NIEUNHIEUH +0x81BD 0xACB1 #HANGUL SYLLABLE KIYEOK YEO RIEULKIYEOK +0x81BE 0xACB2 #HANGUL SYLLABLE KIYEOK YEO RIEULMIEUM +0x81BF 0xACB3 #HANGUL SYLLABLE KIYEOK YEO RIEULPIEUP +0x81C0 0xACB4 #HANGUL SYLLABLE KIYEOK YEO RIEULSIOS +0x81C1 0xACB5 #HANGUL SYLLABLE KIYEOK YEO RIEULTHIEUTH +0x81C2 0xACB6 #HANGUL SYLLABLE KIYEOK YEO RIEULPHIEUPH +0x81C3 0xACB7 #HANGUL SYLLABLE KIYEOK YEO RIEULHIEUH +0x81C4 0xACBA #HANGUL SYLLABLE KIYEOK YEO PIEUPSIOS +0x81C5 0xACBE #HANGUL SYLLABLE KIYEOK YEO CIEUC +0x81C6 0xACBF #HANGUL SYLLABLE KIYEOK YEO CHIEUCH +0x81C7 0xACC0 #HANGUL SYLLABLE KIYEOK YEO KHIEUKH +0x81C8 0xACC2 #HANGUL SYLLABLE KIYEOK YEO PHIEUPH +0x81C9 0xACC3 #HANGUL SYLLABLE KIYEOK YEO HIEUH +0x81CA 0xACC5 #HANGUL SYLLABLE KIYEOK YE KIYEOK +0x81CB 0xACC6 #HANGUL SYLLABLE KIYEOK YE SSANGKIYEOK +0x81CC 0xACC7 #HANGUL SYLLABLE KIYEOK YE KIYEOKSIOS +0x81CD 0xACC9 #HANGUL SYLLABLE KIYEOK YE NIEUNCIEUC +0x81CE 0xACCA #HANGUL SYLLABLE KIYEOK YE NIEUNHIEUH +0x81CF 0xACCB #HANGUL SYLLABLE KIYEOK YE TIKEUT +0x81D0 0xACCD #HANGUL SYLLABLE KIYEOK YE RIEULKIYEOK +0x81D1 0xACCE #HANGUL SYLLABLE KIYEOK YE RIEULMIEUM +0x81D2 0xACCF #HANGUL SYLLABLE KIYEOK YE RIEULPIEUP +0x81D3 0xACD0 #HANGUL SYLLABLE KIYEOK YE RIEULSIOS +0x81D4 0xACD1 #HANGUL SYLLABLE KIYEOK YE RIEULTHIEUTH +0x81D5 0xACD2 #HANGUL SYLLABLE KIYEOK YE RIEULPHIEUPH +0x81D6 0xACD3 #HANGUL SYLLABLE KIYEOK YE RIEULHIEUH +0x81D7 0xACD4 #HANGUL SYLLABLE KIYEOK YE MIEUM +0x81D8 0xACD6 #HANGUL SYLLABLE KIYEOK YE PIEUPSIOS +0x81D9 0xACD8 #HANGUL SYLLABLE KIYEOK YE SSANGSIOS +0x81DA 0xACD9 #HANGUL SYLLABLE KIYEOK YE IEUNG +0x81DB 0xACDA #HANGUL SYLLABLE KIYEOK YE CIEUC +0x81DC 0xACDB #HANGUL SYLLABLE KIYEOK YE CHIEUCH +0x81DD 0xACDC #HANGUL SYLLABLE KIYEOK YE KHIEUKH +0x81DE 0xACDD #HANGUL SYLLABLE KIYEOK YE THIEUTH +0x81DF 0xACDE #HANGUL SYLLABLE KIYEOK YE PHIEUPH +0x81E0 0xACDF #HANGUL SYLLABLE KIYEOK YE HIEUH +0x81E1 0xACE2 #HANGUL SYLLABLE KIYEOK O SSANGKIYEOK +0x81E2 0xACE3 #HANGUL SYLLABLE KIYEOK O KIYEOKSIOS +0x81E3 0xACE5 #HANGUL SYLLABLE KIYEOK O NIEUNCIEUC +0x81E4 0xACE6 #HANGUL SYLLABLE KIYEOK O NIEUNHIEUH +0x81E5 0xACE9 #HANGUL SYLLABLE KIYEOK O RIEULKIYEOK +0x81E6 0xACEB #HANGUL SYLLABLE KIYEOK O RIEULPIEUP +0x81E7 0xACED #HANGUL SYLLABLE KIYEOK O RIEULTHIEUTH +0x81E8 0xACEE #HANGUL SYLLABLE KIYEOK O RIEULPHIEUPH +0x81E9 0xACF2 #HANGUL SYLLABLE KIYEOK O PIEUPSIOS +0x81EA 0xACF4 #HANGUL SYLLABLE KIYEOK O SSANGSIOS +0x81EB 0xACF7 #HANGUL SYLLABLE KIYEOK O CHIEUCH +0x81EC 0xACF8 #HANGUL SYLLABLE KIYEOK O KHIEUKH +0x81ED 0xACF9 #HANGUL SYLLABLE KIYEOK O THIEUTH +0x81EE 0xACFA #HANGUL SYLLABLE KIYEOK O PHIEUPH +0x81EF 0xACFB #HANGUL SYLLABLE KIYEOK O HIEUH +0x81F0 0xACFE #HANGUL SYLLABLE KIYEOK WA SSANGKIYEOK +0x81F1 0xACFF #HANGUL SYLLABLE KIYEOK WA KIYEOKSIOS +0x81F2 0xAD01 #HANGUL SYLLABLE KIYEOK WA NIEUNCIEUC +0x81F3 0xAD02 #HANGUL SYLLABLE KIYEOK WA NIEUNHIEUH +0x81F4 0xAD03 #HANGUL SYLLABLE KIYEOK WA TIKEUT +0x81F5 0xAD05 #HANGUL SYLLABLE KIYEOK WA RIEULKIYEOK +0x81F6 0xAD07 #HANGUL SYLLABLE KIYEOK WA RIEULPIEUP +0x81F7 0xAD08 #HANGUL SYLLABLE KIYEOK WA RIEULSIOS +0x81F8 0xAD09 #HANGUL SYLLABLE KIYEOK WA RIEULTHIEUTH +0x81F9 0xAD0A #HANGUL SYLLABLE KIYEOK WA RIEULPHIEUPH +0x81FA 0xAD0B #HANGUL SYLLABLE KIYEOK WA RIEULHIEUH +0x81FB 0xAD0E #HANGUL SYLLABLE KIYEOK WA PIEUPSIOS +0x81FC 0xAD10 #HANGUL SYLLABLE KIYEOK WA SSANGSIOS +0x81FD 0xAD12 #HANGUL SYLLABLE KIYEOK WA CIEUC +0x81FE 0xAD13 #HANGUL SYLLABLE KIYEOK WA CHIEUCH +0x8241 0xAD14 #HANGUL SYLLABLE KIYEOK WA KHIEUKH +0x8242 0xAD15 #HANGUL SYLLABLE KIYEOK WA THIEUTH +0x8243 0xAD16 #HANGUL SYLLABLE KIYEOK WA PHIEUPH +0x8244 0xAD17 #HANGUL SYLLABLE KIYEOK WA HIEUH +0x8245 0xAD19 #HANGUL SYLLABLE KIYEOK WAE KIYEOK +0x8246 0xAD1A #HANGUL SYLLABLE KIYEOK WAE SSANGKIYEOK +0x8247 0xAD1B #HANGUL SYLLABLE KIYEOK WAE KIYEOKSIOS +0x8248 0xAD1D #HANGUL SYLLABLE KIYEOK WAE NIEUNCIEUC +0x8249 0xAD1E #HANGUL SYLLABLE KIYEOK WAE NIEUNHIEUH +0x824A 0xAD1F #HANGUL SYLLABLE KIYEOK WAE TIKEUT +0x824B 0xAD21 #HANGUL SYLLABLE KIYEOK WAE RIEULKIYEOK +0x824C 0xAD22 #HANGUL SYLLABLE KIYEOK WAE RIEULMIEUM +0x824D 0xAD23 #HANGUL SYLLABLE KIYEOK WAE RIEULPIEUP +0x824E 0xAD24 #HANGUL SYLLABLE KIYEOK WAE RIEULSIOS +0x824F 0xAD25 #HANGUL SYLLABLE KIYEOK WAE RIEULTHIEUTH +0x8250 0xAD26 #HANGUL SYLLABLE KIYEOK WAE RIEULPHIEUPH +0x8251 0xAD27 #HANGUL SYLLABLE KIYEOK WAE RIEULHIEUH +0x8252 0xAD28 #HANGUL SYLLABLE KIYEOK WAE MIEUM +0x8253 0xAD2A #HANGUL SYLLABLE KIYEOK WAE PIEUPSIOS +0x8254 0xAD2B #HANGUL SYLLABLE KIYEOK WAE SIOS +0x8255 0xAD2E #HANGUL SYLLABLE KIYEOK WAE CIEUC +0x8256 0xAD2F #HANGUL SYLLABLE KIYEOK WAE CHIEUCH +0x8257 0xAD30 #HANGUL SYLLABLE KIYEOK WAE KHIEUKH +0x8258 0xAD31 #HANGUL SYLLABLE KIYEOK WAE THIEUTH +0x8259 0xAD32 #HANGUL SYLLABLE KIYEOK WAE PHIEUPH +0x825A 0xAD33 #HANGUL SYLLABLE KIYEOK WAE HIEUH +0x8261 0xAD36 #HANGUL SYLLABLE KIYEOK OE SSANGKIYEOK +0x8262 0xAD37 #HANGUL SYLLABLE KIYEOK OE KIYEOKSIOS +0x8263 0xAD39 #HANGUL SYLLABLE KIYEOK OE NIEUNCIEUC +0x8264 0xAD3A #HANGUL SYLLABLE KIYEOK OE NIEUNHIEUH +0x8265 0xAD3B #HANGUL SYLLABLE KIYEOK OE TIKEUT +0x8266 0xAD3D #HANGUL SYLLABLE KIYEOK OE RIEULKIYEOK +0x8267 0xAD3E #HANGUL SYLLABLE KIYEOK OE RIEULMIEUM +0x8268 0xAD3F #HANGUL SYLLABLE KIYEOK OE RIEULPIEUP +0x8269 0xAD40 #HANGUL SYLLABLE KIYEOK OE RIEULSIOS +0x826A 0xAD41 #HANGUL SYLLABLE KIYEOK OE RIEULTHIEUTH +0x826B 0xAD42 #HANGUL SYLLABLE KIYEOK OE RIEULPHIEUPH +0x826C 0xAD43 #HANGUL SYLLABLE KIYEOK OE RIEULHIEUH +0x826D 0xAD46 #HANGUL SYLLABLE KIYEOK OE PIEUPSIOS +0x826E 0xAD48 #HANGUL SYLLABLE KIYEOK OE SSANGSIOS +0x826F 0xAD4A #HANGUL SYLLABLE KIYEOK OE CIEUC +0x8270 0xAD4B #HANGUL SYLLABLE KIYEOK OE CHIEUCH +0x8271 0xAD4C #HANGUL SYLLABLE KIYEOK OE KHIEUKH +0x8272 0xAD4D #HANGUL SYLLABLE KIYEOK OE THIEUTH +0x8273 0xAD4E #HANGUL SYLLABLE KIYEOK OE PHIEUPH +0x8274 0xAD4F #HANGUL SYLLABLE KIYEOK OE HIEUH +0x8275 0xAD51 #HANGUL SYLLABLE KIYEOK YO KIYEOK +0x8276 0xAD52 #HANGUL SYLLABLE KIYEOK YO SSANGKIYEOK +0x8277 0xAD53 #HANGUL SYLLABLE KIYEOK YO KIYEOKSIOS +0x8278 0xAD55 #HANGUL SYLLABLE KIYEOK YO NIEUNCIEUC +0x8279 0xAD56 #HANGUL SYLLABLE KIYEOK YO NIEUNHIEUH +0x827A 0xAD57 #HANGUL SYLLABLE KIYEOK YO TIKEUT +0x8281 0xAD59 #HANGUL SYLLABLE KIYEOK YO RIEULKIYEOK +0x8282 0xAD5A #HANGUL SYLLABLE KIYEOK YO RIEULMIEUM +0x8283 0xAD5B #HANGUL SYLLABLE KIYEOK YO RIEULPIEUP +0x8284 0xAD5C #HANGUL SYLLABLE KIYEOK YO RIEULSIOS +0x8285 0xAD5D #HANGUL SYLLABLE KIYEOK YO RIEULTHIEUTH +0x8286 0xAD5E #HANGUL SYLLABLE KIYEOK YO RIEULPHIEUPH +0x8287 0xAD5F #HANGUL SYLLABLE KIYEOK YO RIEULHIEUH +0x8288 0xAD60 #HANGUL SYLLABLE KIYEOK YO MIEUM +0x8289 0xAD62 #HANGUL SYLLABLE KIYEOK YO PIEUPSIOS +0x828A 0xAD64 #HANGUL SYLLABLE KIYEOK YO SSANGSIOS +0x828B 0xAD65 #HANGUL SYLLABLE KIYEOK YO IEUNG +0x828C 0xAD66 #HANGUL SYLLABLE KIYEOK YO CIEUC +0x828D 0xAD67 #HANGUL SYLLABLE KIYEOK YO CHIEUCH +0x828E 0xAD68 #HANGUL SYLLABLE KIYEOK YO KHIEUKH +0x828F 0xAD69 #HANGUL SYLLABLE KIYEOK YO THIEUTH +0x8290 0xAD6A #HANGUL SYLLABLE KIYEOK YO PHIEUPH +0x8291 0xAD6B #HANGUL SYLLABLE KIYEOK YO HIEUH +0x8292 0xAD6E #HANGUL SYLLABLE KIYEOK U SSANGKIYEOK +0x8293 0xAD6F #HANGUL SYLLABLE KIYEOK U KIYEOKSIOS +0x8294 0xAD71 #HANGUL SYLLABLE KIYEOK U NIEUNCIEUC +0x8295 0xAD72 #HANGUL SYLLABLE KIYEOK U NIEUNHIEUH +0x8296 0xAD77 #HANGUL SYLLABLE KIYEOK U RIEULPIEUP +0x8297 0xAD78 #HANGUL SYLLABLE KIYEOK U RIEULSIOS +0x8298 0xAD79 #HANGUL SYLLABLE KIYEOK U RIEULTHIEUTH +0x8299 0xAD7A #HANGUL SYLLABLE KIYEOK U RIEULPHIEUPH +0x829A 0xAD7E #HANGUL SYLLABLE KIYEOK U PIEUPSIOS +0x829B 0xAD80 #HANGUL SYLLABLE KIYEOK U SSANGSIOS +0x829C 0xAD83 #HANGUL SYLLABLE KIYEOK U CHIEUCH +0x829D 0xAD84 #HANGUL SYLLABLE KIYEOK U KHIEUKH +0x829E 0xAD85 #HANGUL SYLLABLE KIYEOK U THIEUTH +0x829F 0xAD86 #HANGUL SYLLABLE KIYEOK U PHIEUPH +0x82A0 0xAD87 #HANGUL SYLLABLE KIYEOK U HIEUH +0x82A1 0xAD8A #HANGUL SYLLABLE KIYEOK WEO SSANGKIYEOK +0x82A2 0xAD8B #HANGUL SYLLABLE KIYEOK WEO KIYEOKSIOS +0x82A3 0xAD8D #HANGUL SYLLABLE KIYEOK WEO NIEUNCIEUC +0x82A4 0xAD8E #HANGUL SYLLABLE KIYEOK WEO NIEUNHIEUH +0x82A5 0xAD8F #HANGUL SYLLABLE KIYEOK WEO TIKEUT +0x82A6 0xAD91 #HANGUL SYLLABLE KIYEOK WEO RIEULKIYEOK +0x82A7 0xAD92 #HANGUL SYLLABLE KIYEOK WEO RIEULMIEUM +0x82A8 0xAD93 #HANGUL SYLLABLE KIYEOK WEO RIEULPIEUP +0x82A9 0xAD94 #HANGUL SYLLABLE KIYEOK WEO RIEULSIOS +0x82AA 0xAD95 #HANGUL SYLLABLE KIYEOK WEO RIEULTHIEUTH +0x82AB 0xAD96 #HANGUL SYLLABLE KIYEOK WEO RIEULPHIEUPH +0x82AC 0xAD97 #HANGUL SYLLABLE KIYEOK WEO RIEULHIEUH +0x82AD 0xAD98 #HANGUL SYLLABLE KIYEOK WEO MIEUM +0x82AE 0xAD99 #HANGUL SYLLABLE KIYEOK WEO PIEUP +0x82AF 0xAD9A #HANGUL SYLLABLE KIYEOK WEO PIEUPSIOS +0x82B0 0xAD9B #HANGUL SYLLABLE KIYEOK WEO SIOS +0x82B1 0xAD9E #HANGUL SYLLABLE KIYEOK WEO CIEUC +0x82B2 0xAD9F #HANGUL SYLLABLE KIYEOK WEO CHIEUCH +0x82B3 0xADA0 #HANGUL SYLLABLE KIYEOK WEO KHIEUKH +0x82B4 0xADA1 #HANGUL SYLLABLE KIYEOK WEO THIEUTH +0x82B5 0xADA2 #HANGUL SYLLABLE KIYEOK WEO PHIEUPH +0x82B6 0xADA3 #HANGUL SYLLABLE KIYEOK WEO HIEUH +0x82B7 0xADA5 #HANGUL SYLLABLE KIYEOK WE KIYEOK +0x82B8 0xADA6 #HANGUL SYLLABLE KIYEOK WE SSANGKIYEOK +0x82B9 0xADA7 #HANGUL SYLLABLE KIYEOK WE KIYEOKSIOS +0x82BA 0xADA8 #HANGUL SYLLABLE KIYEOK WE NIEUN +0x82BB 0xADA9 #HANGUL SYLLABLE KIYEOK WE NIEUNCIEUC +0x82BC 0xADAA #HANGUL SYLLABLE KIYEOK WE NIEUNHIEUH +0x82BD 0xADAB #HANGUL SYLLABLE KIYEOK WE TIKEUT +0x82BE 0xADAC #HANGUL SYLLABLE KIYEOK WE RIEUL +0x82BF 0xADAD #HANGUL SYLLABLE KIYEOK WE RIEULKIYEOK +0x82C0 0xADAE #HANGUL SYLLABLE KIYEOK WE RIEULMIEUM +0x82C1 0xADAF #HANGUL SYLLABLE KIYEOK WE RIEULPIEUP +0x82C2 0xADB0 #HANGUL SYLLABLE KIYEOK WE RIEULSIOS +0x82C3 0xADB1 #HANGUL SYLLABLE KIYEOK WE RIEULTHIEUTH +0x82C4 0xADB2 #HANGUL SYLLABLE KIYEOK WE RIEULPHIEUPH +0x82C5 0xADB3 #HANGUL SYLLABLE KIYEOK WE RIEULHIEUH +0x82C6 0xADB4 #HANGUL SYLLABLE KIYEOK WE MIEUM +0x82C7 0xADB5 #HANGUL SYLLABLE KIYEOK WE PIEUP +0x82C8 0xADB6 #HANGUL SYLLABLE KIYEOK WE PIEUPSIOS +0x82C9 0xADB8 #HANGUL SYLLABLE KIYEOK WE SSANGSIOS +0x82CA 0xADB9 #HANGUL SYLLABLE KIYEOK WE IEUNG +0x82CB 0xADBA #HANGUL SYLLABLE KIYEOK WE CIEUC +0x82CC 0xADBB #HANGUL SYLLABLE KIYEOK WE CHIEUCH +0x82CD 0xADBC #HANGUL SYLLABLE KIYEOK WE KHIEUKH +0x82CE 0xADBD #HANGUL SYLLABLE KIYEOK WE THIEUTH +0x82CF 0xADBE #HANGUL SYLLABLE KIYEOK WE PHIEUPH +0x82D0 0xADBF #HANGUL SYLLABLE KIYEOK WE HIEUH +0x82D1 0xADC2 #HANGUL SYLLABLE KIYEOK WI SSANGKIYEOK +0x82D2 0xADC3 #HANGUL SYLLABLE KIYEOK WI KIYEOKSIOS +0x82D3 0xADC5 #HANGUL SYLLABLE KIYEOK WI NIEUNCIEUC +0x82D4 0xADC6 #HANGUL SYLLABLE KIYEOK WI NIEUNHIEUH +0x82D5 0xADC7 #HANGUL SYLLABLE KIYEOK WI TIKEUT +0x82D6 0xADC9 #HANGUL SYLLABLE KIYEOK WI RIEULKIYEOK +0x82D7 0xADCA #HANGUL SYLLABLE KIYEOK WI RIEULMIEUM +0x82D8 0xADCB #HANGUL SYLLABLE KIYEOK WI RIEULPIEUP +0x82D9 0xADCC #HANGUL SYLLABLE KIYEOK WI RIEULSIOS +0x82DA 0xADCD #HANGUL SYLLABLE KIYEOK WI RIEULTHIEUTH +0x82DB 0xADCE #HANGUL SYLLABLE KIYEOK WI RIEULPHIEUPH +0x82DC 0xADCF #HANGUL SYLLABLE KIYEOK WI RIEULHIEUH +0x82DD 0xADD2 #HANGUL SYLLABLE KIYEOK WI PIEUPSIOS +0x82DE 0xADD4 #HANGUL SYLLABLE KIYEOK WI SSANGSIOS +0x82DF 0xADD5 #HANGUL SYLLABLE KIYEOK WI IEUNG +0x82E0 0xADD6 #HANGUL SYLLABLE KIYEOK WI CIEUC +0x82E1 0xADD7 #HANGUL SYLLABLE KIYEOK WI CHIEUCH +0x82E2 0xADD8 #HANGUL SYLLABLE KIYEOK WI KHIEUKH +0x82E3 0xADD9 #HANGUL SYLLABLE KIYEOK WI THIEUTH +0x82E4 0xADDA #HANGUL SYLLABLE KIYEOK WI PHIEUPH +0x82E5 0xADDB #HANGUL SYLLABLE KIYEOK WI HIEUH +0x82E6 0xADDD #HANGUL SYLLABLE KIYEOK YU KIYEOK +0x82E7 0xADDE #HANGUL SYLLABLE KIYEOK YU SSANGKIYEOK +0x82E8 0xADDF #HANGUL SYLLABLE KIYEOK YU KIYEOKSIOS +0x82E9 0xADE1 #HANGUL SYLLABLE KIYEOK YU NIEUNCIEUC +0x82EA 0xADE2 #HANGUL SYLLABLE KIYEOK YU NIEUNHIEUH +0x82EB 0xADE3 #HANGUL SYLLABLE KIYEOK YU TIKEUT +0x82EC 0xADE5 #HANGUL SYLLABLE KIYEOK YU RIEULKIYEOK +0x82ED 0xADE6 #HANGUL SYLLABLE KIYEOK YU RIEULMIEUM +0x82EE 0xADE7 #HANGUL SYLLABLE KIYEOK YU RIEULPIEUP +0x82EF 0xADE8 #HANGUL SYLLABLE KIYEOK YU RIEULSIOS +0x82F0 0xADE9 #HANGUL SYLLABLE KIYEOK YU RIEULTHIEUTH +0x82F1 0xADEA #HANGUL SYLLABLE KIYEOK YU RIEULPHIEUPH +0x82F2 0xADEB #HANGUL SYLLABLE KIYEOK YU RIEULHIEUH +0x82F3 0xADEC #HANGUL SYLLABLE KIYEOK YU MIEUM +0x82F4 0xADED #HANGUL SYLLABLE KIYEOK YU PIEUP +0x82F5 0xADEE #HANGUL SYLLABLE KIYEOK YU PIEUPSIOS +0x82F6 0xADEF #HANGUL SYLLABLE KIYEOK YU SIOS +0x82F7 0xADF0 #HANGUL SYLLABLE KIYEOK YU SSANGSIOS +0x82F8 0xADF1 #HANGUL SYLLABLE KIYEOK YU IEUNG +0x82F9 0xADF2 #HANGUL SYLLABLE KIYEOK YU CIEUC +0x82FA 0xADF3 #HANGUL SYLLABLE KIYEOK YU CHIEUCH +0x82FB 0xADF4 #HANGUL SYLLABLE KIYEOK YU KHIEUKH +0x82FC 0xADF5 #HANGUL SYLLABLE KIYEOK YU THIEUTH +0x82FD 0xADF6 #HANGUL SYLLABLE KIYEOK YU PHIEUPH +0x82FE 0xADF7 #HANGUL SYLLABLE KIYEOK YU HIEUH +0x8341 0xADFA #HANGUL SYLLABLE KIYEOK EU SSANGKIYEOK +0x8342 0xADFB #HANGUL SYLLABLE KIYEOK EU KIYEOKSIOS +0x8343 0xADFD #HANGUL SYLLABLE KIYEOK EU NIEUNCIEUC +0x8344 0xADFE #HANGUL SYLLABLE KIYEOK EU NIEUNHIEUH +0x8345 0xAE02 #HANGUL SYLLABLE KIYEOK EU RIEULMIEUM +0x8346 0xAE03 #HANGUL SYLLABLE KIYEOK EU RIEULPIEUP +0x8347 0xAE04 #HANGUL SYLLABLE KIYEOK EU RIEULSIOS +0x8348 0xAE05 #HANGUL SYLLABLE KIYEOK EU RIEULTHIEUTH +0x8349 0xAE06 #HANGUL SYLLABLE KIYEOK EU RIEULPHIEUPH +0x834A 0xAE07 #HANGUL SYLLABLE KIYEOK EU RIEULHIEUH +0x834B 0xAE0A #HANGUL SYLLABLE KIYEOK EU PIEUPSIOS +0x834C 0xAE0C #HANGUL SYLLABLE KIYEOK EU SSANGSIOS +0x834D 0xAE0E #HANGUL SYLLABLE KIYEOK EU CIEUC +0x834E 0xAE0F #HANGUL SYLLABLE KIYEOK EU CHIEUCH +0x834F 0xAE10 #HANGUL SYLLABLE KIYEOK EU KHIEUKH +0x8350 0xAE11 #HANGUL SYLLABLE KIYEOK EU THIEUTH +0x8351 0xAE12 #HANGUL SYLLABLE KIYEOK EU PHIEUPH +0x8352 0xAE13 #HANGUL SYLLABLE KIYEOK EU HIEUH +0x8353 0xAE15 #HANGUL SYLLABLE KIYEOK YI KIYEOK +0x8354 0xAE16 #HANGUL SYLLABLE KIYEOK YI SSANGKIYEOK +0x8355 0xAE17 #HANGUL SYLLABLE KIYEOK YI KIYEOKSIOS +0x8356 0xAE18 #HANGUL SYLLABLE KIYEOK YI NIEUN +0x8357 0xAE19 #HANGUL SYLLABLE KIYEOK YI NIEUNCIEUC +0x8358 0xAE1A #HANGUL SYLLABLE KIYEOK YI NIEUNHIEUH +0x8359 0xAE1B #HANGUL SYLLABLE KIYEOK YI TIKEUT +0x835A 0xAE1C #HANGUL SYLLABLE KIYEOK YI RIEUL +0x8361 0xAE1D #HANGUL SYLLABLE KIYEOK YI RIEULKIYEOK +0x8362 0xAE1E #HANGUL SYLLABLE KIYEOK YI RIEULMIEUM +0x8363 0xAE1F #HANGUL SYLLABLE KIYEOK YI RIEULPIEUP +0x8364 0xAE20 #HANGUL SYLLABLE KIYEOK YI RIEULSIOS +0x8365 0xAE21 #HANGUL SYLLABLE KIYEOK YI RIEULTHIEUTH +0x8366 0xAE22 #HANGUL SYLLABLE KIYEOK YI RIEULPHIEUPH +0x8367 0xAE23 #HANGUL SYLLABLE KIYEOK YI RIEULHIEUH +0x8368 0xAE24 #HANGUL SYLLABLE KIYEOK YI MIEUM +0x8369 0xAE25 #HANGUL SYLLABLE KIYEOK YI PIEUP +0x836A 0xAE26 #HANGUL SYLLABLE KIYEOK YI PIEUPSIOS +0x836B 0xAE27 #HANGUL SYLLABLE KIYEOK YI SIOS +0x836C 0xAE28 #HANGUL SYLLABLE KIYEOK YI SSANGSIOS +0x836D 0xAE29 #HANGUL SYLLABLE KIYEOK YI IEUNG +0x836E 0xAE2A #HANGUL SYLLABLE KIYEOK YI CIEUC +0x836F 0xAE2B #HANGUL SYLLABLE KIYEOK YI CHIEUCH +0x8370 0xAE2C #HANGUL SYLLABLE KIYEOK YI KHIEUKH +0x8371 0xAE2D #HANGUL SYLLABLE KIYEOK YI THIEUTH +0x8372 0xAE2E #HANGUL SYLLABLE KIYEOK YI PHIEUPH +0x8373 0xAE2F #HANGUL SYLLABLE KIYEOK YI HIEUH +0x8374 0xAE32 #HANGUL SYLLABLE KIYEOK I SSANGKIYEOK +0x8375 0xAE33 #HANGUL SYLLABLE KIYEOK I KIYEOKSIOS +0x8376 0xAE35 #HANGUL SYLLABLE KIYEOK I NIEUNCIEUC +0x8377 0xAE36 #HANGUL SYLLABLE KIYEOK I NIEUNHIEUH +0x8378 0xAE39 #HANGUL SYLLABLE KIYEOK I RIEULKIYEOK +0x8379 0xAE3B #HANGUL SYLLABLE KIYEOK I RIEULPIEUP +0x837A 0xAE3C #HANGUL SYLLABLE KIYEOK I RIEULSIOS +0x8381 0xAE3D #HANGUL SYLLABLE KIYEOK I RIEULTHIEUTH +0x8382 0xAE3E #HANGUL SYLLABLE KIYEOK I RIEULPHIEUPH +0x8383 0xAE3F #HANGUL SYLLABLE KIYEOK I RIEULHIEUH +0x8384 0xAE42 #HANGUL SYLLABLE KIYEOK I PIEUPSIOS +0x8385 0xAE44 #HANGUL SYLLABLE KIYEOK I SSANGSIOS +0x8386 0xAE47 #HANGUL SYLLABLE KIYEOK I CHIEUCH +0x8387 0xAE48 #HANGUL SYLLABLE KIYEOK I KHIEUKH +0x8388 0xAE49 #HANGUL SYLLABLE KIYEOK I THIEUTH +0x8389 0xAE4B #HANGUL SYLLABLE KIYEOK I HIEUH +0x838A 0xAE4F #HANGUL SYLLABLE SSANGKIYEOK A KIYEOKSIOS +0x838B 0xAE51 #HANGUL SYLLABLE SSANGKIYEOK A NIEUNCIEUC +0x838C 0xAE52 #HANGUL SYLLABLE SSANGKIYEOK A NIEUNHIEUH +0x838D 0xAE53 #HANGUL SYLLABLE SSANGKIYEOK A TIKEUT +0x838E 0xAE55 #HANGUL SYLLABLE SSANGKIYEOK A RIEULKIYEOK +0x838F 0xAE57 #HANGUL SYLLABLE SSANGKIYEOK A RIEULPIEUP +0x8390 0xAE58 #HANGUL SYLLABLE SSANGKIYEOK A RIEULSIOS +0x8391 0xAE59 #HANGUL SYLLABLE SSANGKIYEOK A RIEULTHIEUTH +0x8392 0xAE5A #HANGUL SYLLABLE SSANGKIYEOK A RIEULPHIEUPH +0x8393 0xAE5B #HANGUL SYLLABLE SSANGKIYEOK A RIEULHIEUH +0x8394 0xAE5E #HANGUL SYLLABLE SSANGKIYEOK A PIEUPSIOS +0x8395 0xAE62 #HANGUL SYLLABLE SSANGKIYEOK A CIEUC +0x8396 0xAE63 #HANGUL SYLLABLE SSANGKIYEOK A CHIEUCH +0x8397 0xAE64 #HANGUL SYLLABLE SSANGKIYEOK A KHIEUKH +0x8398 0xAE66 #HANGUL SYLLABLE SSANGKIYEOK A PHIEUPH +0x8399 0xAE67 #HANGUL SYLLABLE SSANGKIYEOK A HIEUH +0x839A 0xAE6A #HANGUL SYLLABLE SSANGKIYEOK AE SSANGKIYEOK +0x839B 0xAE6B #HANGUL SYLLABLE SSANGKIYEOK AE KIYEOKSIOS +0x839C 0xAE6D #HANGUL SYLLABLE SSANGKIYEOK AE NIEUNCIEUC +0x839D 0xAE6E #HANGUL SYLLABLE SSANGKIYEOK AE NIEUNHIEUH +0x839E 0xAE6F #HANGUL SYLLABLE SSANGKIYEOK AE TIKEUT +0x839F 0xAE71 #HANGUL SYLLABLE SSANGKIYEOK AE RIEULKIYEOK +0x83A0 0xAE72 #HANGUL SYLLABLE SSANGKIYEOK AE RIEULMIEUM +0x83A1 0xAE73 #HANGUL SYLLABLE SSANGKIYEOK AE RIEULPIEUP +0x83A2 0xAE74 #HANGUL SYLLABLE SSANGKIYEOK AE RIEULSIOS +0x83A3 0xAE75 #HANGUL SYLLABLE SSANGKIYEOK AE RIEULTHIEUTH +0x83A4 0xAE76 #HANGUL SYLLABLE SSANGKIYEOK AE RIEULPHIEUPH +0x83A5 0xAE77 #HANGUL SYLLABLE SSANGKIYEOK AE RIEULHIEUH +0x83A6 0xAE7A #HANGUL SYLLABLE SSANGKIYEOK AE PIEUPSIOS +0x83A7 0xAE7E #HANGUL SYLLABLE SSANGKIYEOK AE CIEUC +0x83A8 0xAE7F #HANGUL SYLLABLE SSANGKIYEOK AE CHIEUCH +0x83A9 0xAE80 #HANGUL SYLLABLE SSANGKIYEOK AE KHIEUKH +0x83AA 0xAE81 #HANGUL SYLLABLE SSANGKIYEOK AE THIEUTH +0x83AB 0xAE82 #HANGUL SYLLABLE SSANGKIYEOK AE PHIEUPH +0x83AC 0xAE83 #HANGUL SYLLABLE SSANGKIYEOK AE HIEUH +0x83AD 0xAE86 #HANGUL SYLLABLE SSANGKIYEOK YA SSANGKIYEOK +0x83AE 0xAE87 #HANGUL SYLLABLE SSANGKIYEOK YA KIYEOKSIOS +0x83AF 0xAE88 #HANGUL SYLLABLE SSANGKIYEOK YA NIEUN +0x83B0 0xAE89 #HANGUL SYLLABLE SSANGKIYEOK YA NIEUNCIEUC +0x83B1 0xAE8A #HANGUL SYLLABLE SSANGKIYEOK YA NIEUNHIEUH +0x83B2 0xAE8B #HANGUL SYLLABLE SSANGKIYEOK YA TIKEUT +0x83B3 0xAE8D #HANGUL SYLLABLE SSANGKIYEOK YA RIEULKIYEOK +0x83B4 0xAE8E #HANGUL SYLLABLE SSANGKIYEOK YA RIEULMIEUM +0x83B5 0xAE8F #HANGUL SYLLABLE SSANGKIYEOK YA RIEULPIEUP +0x83B6 0xAE90 #HANGUL SYLLABLE SSANGKIYEOK YA RIEULSIOS +0x83B7 0xAE91 #HANGUL SYLLABLE SSANGKIYEOK YA RIEULTHIEUTH +0x83B8 0xAE92 #HANGUL SYLLABLE SSANGKIYEOK YA RIEULPHIEUPH +0x83B9 0xAE93 #HANGUL SYLLABLE SSANGKIYEOK YA RIEULHIEUH +0x83BA 0xAE94 #HANGUL SYLLABLE SSANGKIYEOK YA MIEUM +0x83BB 0xAE95 #HANGUL SYLLABLE SSANGKIYEOK YA PIEUP +0x83BC 0xAE96 #HANGUL SYLLABLE SSANGKIYEOK YA PIEUPSIOS +0x83BD 0xAE97 #HANGUL SYLLABLE SSANGKIYEOK YA SIOS +0x83BE 0xAE98 #HANGUL SYLLABLE SSANGKIYEOK YA SSANGSIOS +0x83BF 0xAE99 #HANGUL SYLLABLE SSANGKIYEOK YA IEUNG +0x83C0 0xAE9A #HANGUL SYLLABLE SSANGKIYEOK YA CIEUC +0x83C1 0xAE9B #HANGUL SYLLABLE SSANGKIYEOK YA CHIEUCH +0x83C2 0xAE9C #HANGUL SYLLABLE SSANGKIYEOK YA KHIEUKH +0x83C3 0xAE9D #HANGUL SYLLABLE SSANGKIYEOK YA THIEUTH +0x83C4 0xAE9E #HANGUL SYLLABLE SSANGKIYEOK YA PHIEUPH +0x83C5 0xAE9F #HANGUL SYLLABLE SSANGKIYEOK YA HIEUH +0x83C6 0xAEA0 #HANGUL SYLLABLE SSANGKIYEOK YAE +0x83C7 0xAEA1 #HANGUL SYLLABLE SSANGKIYEOK YAE KIYEOK +0x83C8 0xAEA2 #HANGUL SYLLABLE SSANGKIYEOK YAE SSANGKIYEOK +0x83C9 0xAEA3 #HANGUL SYLLABLE SSANGKIYEOK YAE KIYEOKSIOS +0x83CA 0xAEA4 #HANGUL SYLLABLE SSANGKIYEOK YAE NIEUN +0x83CB 0xAEA5 #HANGUL SYLLABLE SSANGKIYEOK YAE NIEUNCIEUC +0x83CC 0xAEA6 #HANGUL SYLLABLE SSANGKIYEOK YAE NIEUNHIEUH +0x83CD 0xAEA7 #HANGUL SYLLABLE SSANGKIYEOK YAE TIKEUT +0x83CE 0xAEA8 #HANGUL SYLLABLE SSANGKIYEOK YAE RIEUL +0x83CF 0xAEA9 #HANGUL SYLLABLE SSANGKIYEOK YAE RIEULKIYEOK +0x83D0 0xAEAA #HANGUL SYLLABLE SSANGKIYEOK YAE RIEULMIEUM +0x83D1 0xAEAB #HANGUL SYLLABLE SSANGKIYEOK YAE RIEULPIEUP +0x83D2 0xAEAC #HANGUL SYLLABLE SSANGKIYEOK YAE RIEULSIOS +0x83D3 0xAEAD #HANGUL SYLLABLE SSANGKIYEOK YAE RIEULTHIEUTH +0x83D4 0xAEAE #HANGUL SYLLABLE SSANGKIYEOK YAE RIEULPHIEUPH +0x83D5 0xAEAF #HANGUL SYLLABLE SSANGKIYEOK YAE RIEULHIEUH +0x83D6 0xAEB0 #HANGUL SYLLABLE SSANGKIYEOK YAE MIEUM +0x83D7 0xAEB1 #HANGUL SYLLABLE SSANGKIYEOK YAE PIEUP +0x83D8 0xAEB2 #HANGUL SYLLABLE SSANGKIYEOK YAE PIEUPSIOS +0x83D9 0xAEB3 #HANGUL SYLLABLE SSANGKIYEOK YAE SIOS +0x83DA 0xAEB4 #HANGUL SYLLABLE SSANGKIYEOK YAE SSANGSIOS +0x83DB 0xAEB5 #HANGUL SYLLABLE SSANGKIYEOK YAE IEUNG +0x83DC 0xAEB6 #HANGUL SYLLABLE SSANGKIYEOK YAE CIEUC +0x83DD 0xAEB7 #HANGUL SYLLABLE SSANGKIYEOK YAE CHIEUCH +0x83DE 0xAEB8 #HANGUL SYLLABLE SSANGKIYEOK YAE KHIEUKH +0x83DF 0xAEB9 #HANGUL SYLLABLE SSANGKIYEOK YAE THIEUTH +0x83E0 0xAEBA #HANGUL SYLLABLE SSANGKIYEOK YAE PHIEUPH +0x83E1 0xAEBB #HANGUL SYLLABLE SSANGKIYEOK YAE HIEUH +0x83E2 0xAEBF #HANGUL SYLLABLE SSANGKIYEOK EO KIYEOKSIOS +0x83E3 0xAEC1 #HANGUL SYLLABLE SSANGKIYEOK EO NIEUNCIEUC +0x83E4 0xAEC2 #HANGUL SYLLABLE SSANGKIYEOK EO NIEUNHIEUH +0x83E5 0xAEC3 #HANGUL SYLLABLE SSANGKIYEOK EO TIKEUT +0x83E6 0xAEC5 #HANGUL SYLLABLE SSANGKIYEOK EO RIEULKIYEOK +0x83E7 0xAEC6 #HANGUL SYLLABLE SSANGKIYEOK EO RIEULMIEUM +0x83E8 0xAEC7 #HANGUL SYLLABLE SSANGKIYEOK EO RIEULPIEUP +0x83E9 0xAEC8 #HANGUL SYLLABLE SSANGKIYEOK EO RIEULSIOS +0x83EA 0xAEC9 #HANGUL SYLLABLE SSANGKIYEOK EO RIEULTHIEUTH +0x83EB 0xAECA #HANGUL SYLLABLE SSANGKIYEOK EO RIEULPHIEUPH +0x83EC 0xAECB #HANGUL SYLLABLE SSANGKIYEOK EO RIEULHIEUH +0x83ED 0xAECE #HANGUL SYLLABLE SSANGKIYEOK EO PIEUPSIOS +0x83EE 0xAED2 #HANGUL SYLLABLE SSANGKIYEOK EO CIEUC +0x83EF 0xAED3 #HANGUL SYLLABLE SSANGKIYEOK EO CHIEUCH +0x83F0 0xAED4 #HANGUL SYLLABLE SSANGKIYEOK EO KHIEUKH +0x83F1 0xAED5 #HANGUL SYLLABLE SSANGKIYEOK EO THIEUTH +0x83F2 0xAED6 #HANGUL SYLLABLE SSANGKIYEOK EO PHIEUPH +0x83F3 0xAED7 #HANGUL SYLLABLE SSANGKIYEOK EO HIEUH +0x83F4 0xAEDA #HANGUL SYLLABLE SSANGKIYEOK E SSANGKIYEOK +0x83F5 0xAEDB #HANGUL SYLLABLE SSANGKIYEOK E KIYEOKSIOS +0x83F6 0xAEDD #HANGUL SYLLABLE SSANGKIYEOK E NIEUNCIEUC +0x83F7 0xAEDE #HANGUL SYLLABLE SSANGKIYEOK E NIEUNHIEUH +0x83F8 0xAEDF #HANGUL SYLLABLE SSANGKIYEOK E TIKEUT +0x83F9 0xAEE0 #HANGUL SYLLABLE SSANGKIYEOK E RIEUL +0x83FA 0xAEE1 #HANGUL SYLLABLE SSANGKIYEOK E RIEULKIYEOK +0x83FB 0xAEE2 #HANGUL SYLLABLE SSANGKIYEOK E RIEULMIEUM +0x83FC 0xAEE3 #HANGUL SYLLABLE SSANGKIYEOK E RIEULPIEUP +0x83FD 0xAEE4 #HANGUL SYLLABLE SSANGKIYEOK E RIEULSIOS +0x83FE 0xAEE5 #HANGUL SYLLABLE SSANGKIYEOK E RIEULTHIEUTH +0x8441 0xAEE6 #HANGUL SYLLABLE SSANGKIYEOK E RIEULPHIEUPH +0x8442 0xAEE7 #HANGUL SYLLABLE SSANGKIYEOK E RIEULHIEUH +0x8443 0xAEE9 #HANGUL SYLLABLE SSANGKIYEOK E PIEUP +0x8444 0xAEEA #HANGUL SYLLABLE SSANGKIYEOK E PIEUPSIOS +0x8445 0xAEEC #HANGUL SYLLABLE SSANGKIYEOK E SSANGSIOS +0x8446 0xAEEE #HANGUL SYLLABLE SSANGKIYEOK E CIEUC +0x8447 0xAEEF #HANGUL SYLLABLE SSANGKIYEOK E CHIEUCH +0x8448 0xAEF0 #HANGUL SYLLABLE SSANGKIYEOK E KHIEUKH +0x8449 0xAEF1 #HANGUL SYLLABLE SSANGKIYEOK E THIEUTH +0x844A 0xAEF2 #HANGUL SYLLABLE SSANGKIYEOK E PHIEUPH +0x844B 0xAEF3 #HANGUL SYLLABLE SSANGKIYEOK E HIEUH +0x844C 0xAEF5 #HANGUL SYLLABLE SSANGKIYEOK YEO KIYEOK +0x844D 0xAEF6 #HANGUL SYLLABLE SSANGKIYEOK YEO SSANGKIYEOK +0x844E 0xAEF7 #HANGUL SYLLABLE SSANGKIYEOK YEO KIYEOKSIOS +0x844F 0xAEF9 #HANGUL SYLLABLE SSANGKIYEOK YEO NIEUNCIEUC +0x8450 0xAEFA #HANGUL SYLLABLE SSANGKIYEOK YEO NIEUNHIEUH +0x8451 0xAEFB #HANGUL SYLLABLE SSANGKIYEOK YEO TIKEUT +0x8452 0xAEFD #HANGUL SYLLABLE SSANGKIYEOK YEO RIEULKIYEOK +0x8453 0xAEFE #HANGUL SYLLABLE SSANGKIYEOK YEO RIEULMIEUM +0x8454 0xAEFF #HANGUL SYLLABLE SSANGKIYEOK YEO RIEULPIEUP +0x8455 0xAF00 #HANGUL SYLLABLE SSANGKIYEOK YEO RIEULSIOS +0x8456 0xAF01 #HANGUL SYLLABLE SSANGKIYEOK YEO RIEULTHIEUTH +0x8457 0xAF02 #HANGUL SYLLABLE SSANGKIYEOK YEO RIEULPHIEUPH +0x8458 0xAF03 #HANGUL SYLLABLE SSANGKIYEOK YEO RIEULHIEUH +0x8459 0xAF04 #HANGUL SYLLABLE SSANGKIYEOK YEO MIEUM +0x845A 0xAF05 #HANGUL SYLLABLE SSANGKIYEOK YEO PIEUP +0x8461 0xAF06 #HANGUL SYLLABLE SSANGKIYEOK YEO PIEUPSIOS +0x8462 0xAF09 #HANGUL SYLLABLE SSANGKIYEOK YEO IEUNG +0x8463 0xAF0A #HANGUL SYLLABLE SSANGKIYEOK YEO CIEUC +0x8464 0xAF0B #HANGUL SYLLABLE SSANGKIYEOK YEO CHIEUCH +0x8465 0xAF0C #HANGUL SYLLABLE SSANGKIYEOK YEO KHIEUKH +0x8466 0xAF0E #HANGUL SYLLABLE SSANGKIYEOK YEO PHIEUPH +0x8467 0xAF0F #HANGUL SYLLABLE SSANGKIYEOK YEO HIEUH +0x8468 0xAF11 #HANGUL SYLLABLE SSANGKIYEOK YE KIYEOK +0x8469 0xAF12 #HANGUL SYLLABLE SSANGKIYEOK YE SSANGKIYEOK +0x846A 0xAF13 #HANGUL SYLLABLE SSANGKIYEOK YE KIYEOKSIOS +0x846B 0xAF14 #HANGUL SYLLABLE SSANGKIYEOK YE NIEUN +0x846C 0xAF15 #HANGUL SYLLABLE SSANGKIYEOK YE NIEUNCIEUC +0x846D 0xAF16 #HANGUL SYLLABLE SSANGKIYEOK YE NIEUNHIEUH +0x846E 0xAF17 #HANGUL SYLLABLE SSANGKIYEOK YE TIKEUT +0x846F 0xAF18 #HANGUL SYLLABLE SSANGKIYEOK YE RIEUL +0x8470 0xAF19 #HANGUL SYLLABLE SSANGKIYEOK YE RIEULKIYEOK +0x8471 0xAF1A #HANGUL SYLLABLE SSANGKIYEOK YE RIEULMIEUM +0x8472 0xAF1B #HANGUL SYLLABLE SSANGKIYEOK YE RIEULPIEUP +0x8473 0xAF1C #HANGUL SYLLABLE SSANGKIYEOK YE RIEULSIOS +0x8474 0xAF1D #HANGUL SYLLABLE SSANGKIYEOK YE RIEULTHIEUTH +0x8475 0xAF1E #HANGUL SYLLABLE SSANGKIYEOK YE RIEULPHIEUPH +0x8476 0xAF1F #HANGUL SYLLABLE SSANGKIYEOK YE RIEULHIEUH +0x8477 0xAF20 #HANGUL SYLLABLE SSANGKIYEOK YE MIEUM +0x8478 0xAF21 #HANGUL SYLLABLE SSANGKIYEOK YE PIEUP +0x8479 0xAF22 #HANGUL SYLLABLE SSANGKIYEOK YE PIEUPSIOS +0x847A 0xAF23 #HANGUL SYLLABLE SSANGKIYEOK YE SIOS +0x8481 0xAF24 #HANGUL SYLLABLE SSANGKIYEOK YE SSANGSIOS +0x8482 0xAF25 #HANGUL SYLLABLE SSANGKIYEOK YE IEUNG +0x8483 0xAF26 #HANGUL SYLLABLE SSANGKIYEOK YE CIEUC +0x8484 0xAF27 #HANGUL SYLLABLE SSANGKIYEOK YE CHIEUCH +0x8485 0xAF28 #HANGUL SYLLABLE SSANGKIYEOK YE KHIEUKH +0x8486 0xAF29 #HANGUL SYLLABLE SSANGKIYEOK YE THIEUTH +0x8487 0xAF2A #HANGUL SYLLABLE SSANGKIYEOK YE PHIEUPH +0x8488 0xAF2B #HANGUL SYLLABLE SSANGKIYEOK YE HIEUH +0x8489 0xAF2E #HANGUL SYLLABLE SSANGKIYEOK O SSANGKIYEOK +0x848A 0xAF2F #HANGUL SYLLABLE SSANGKIYEOK O KIYEOKSIOS +0x848B 0xAF31 #HANGUL SYLLABLE SSANGKIYEOK O NIEUNCIEUC +0x848C 0xAF33 #HANGUL SYLLABLE SSANGKIYEOK O TIKEUT +0x848D 0xAF35 #HANGUL SYLLABLE SSANGKIYEOK O RIEULKIYEOK +0x848E 0xAF36 #HANGUL SYLLABLE SSANGKIYEOK O RIEULMIEUM +0x848F 0xAF37 #HANGUL SYLLABLE SSANGKIYEOK O RIEULPIEUP +0x8490 0xAF38 #HANGUL SYLLABLE SSANGKIYEOK O RIEULSIOS +0x8491 0xAF39 #HANGUL SYLLABLE SSANGKIYEOK O RIEULTHIEUTH +0x8492 0xAF3A #HANGUL SYLLABLE SSANGKIYEOK O RIEULPHIEUPH +0x8493 0xAF3B #HANGUL SYLLABLE SSANGKIYEOK O RIEULHIEUH +0x8494 0xAF3E #HANGUL SYLLABLE SSANGKIYEOK O PIEUPSIOS +0x8495 0xAF40 #HANGUL SYLLABLE SSANGKIYEOK O SSANGSIOS +0x8496 0xAF44 #HANGUL SYLLABLE SSANGKIYEOK O KHIEUKH +0x8497 0xAF45 #HANGUL SYLLABLE SSANGKIYEOK O THIEUTH +0x8498 0xAF46 #HANGUL SYLLABLE SSANGKIYEOK O PHIEUPH +0x8499 0xAF47 #HANGUL SYLLABLE SSANGKIYEOK O HIEUH +0x849A 0xAF4A #HANGUL SYLLABLE SSANGKIYEOK WA SSANGKIYEOK +0x849B 0xAF4B #HANGUL SYLLABLE SSANGKIYEOK WA KIYEOKSIOS +0x849C 0xAF4C #HANGUL SYLLABLE SSANGKIYEOK WA NIEUN +0x849D 0xAF4D #HANGUL SYLLABLE SSANGKIYEOK WA NIEUNCIEUC +0x849E 0xAF4E #HANGUL SYLLABLE SSANGKIYEOK WA NIEUNHIEUH +0x849F 0xAF4F #HANGUL SYLLABLE SSANGKIYEOK WA TIKEUT +0x84A0 0xAF51 #HANGUL SYLLABLE SSANGKIYEOK WA RIEULKIYEOK +0x84A1 0xAF52 #HANGUL SYLLABLE SSANGKIYEOK WA RIEULMIEUM +0x84A2 0xAF53 #HANGUL SYLLABLE SSANGKIYEOK WA RIEULPIEUP +0x84A3 0xAF54 #HANGUL SYLLABLE SSANGKIYEOK WA RIEULSIOS +0x84A4 0xAF55 #HANGUL SYLLABLE SSANGKIYEOK WA RIEULTHIEUTH +0x84A5 0xAF56 #HANGUL SYLLABLE SSANGKIYEOK WA RIEULPHIEUPH +0x84A6 0xAF57 #HANGUL SYLLABLE SSANGKIYEOK WA RIEULHIEUH +0x84A7 0xAF58 #HANGUL SYLLABLE SSANGKIYEOK WA MIEUM +0x84A8 0xAF59 #HANGUL SYLLABLE SSANGKIYEOK WA PIEUP +0x84A9 0xAF5A #HANGUL SYLLABLE SSANGKIYEOK WA PIEUPSIOS +0x84AA 0xAF5B #HANGUL SYLLABLE SSANGKIYEOK WA SIOS +0x84AB 0xAF5E #HANGUL SYLLABLE SSANGKIYEOK WA CIEUC +0x84AC 0xAF5F #HANGUL SYLLABLE SSANGKIYEOK WA CHIEUCH +0x84AD 0xAF60 #HANGUL SYLLABLE SSANGKIYEOK WA KHIEUKH +0x84AE 0xAF61 #HANGUL SYLLABLE SSANGKIYEOK WA THIEUTH +0x84AF 0xAF62 #HANGUL SYLLABLE SSANGKIYEOK WA PHIEUPH +0x84B0 0xAF63 #HANGUL SYLLABLE SSANGKIYEOK WA HIEUH +0x84B1 0xAF66 #HANGUL SYLLABLE SSANGKIYEOK WAE SSANGKIYEOK +0x84B2 0xAF67 #HANGUL SYLLABLE SSANGKIYEOK WAE KIYEOKSIOS +0x84B3 0xAF68 #HANGUL SYLLABLE SSANGKIYEOK WAE NIEUN +0x84B4 0xAF69 #HANGUL SYLLABLE SSANGKIYEOK WAE NIEUNCIEUC +0x84B5 0xAF6A #HANGUL SYLLABLE SSANGKIYEOK WAE NIEUNHIEUH +0x84B6 0xAF6B #HANGUL SYLLABLE SSANGKIYEOK WAE TIKEUT +0x84B7 0xAF6C #HANGUL SYLLABLE SSANGKIYEOK WAE RIEUL +0x84B8 0xAF6D #HANGUL SYLLABLE SSANGKIYEOK WAE RIEULKIYEOK +0x84B9 0xAF6E #HANGUL SYLLABLE SSANGKIYEOK WAE RIEULMIEUM +0x84BA 0xAF6F #HANGUL SYLLABLE SSANGKIYEOK WAE RIEULPIEUP +0x84BB 0xAF70 #HANGUL SYLLABLE SSANGKIYEOK WAE RIEULSIOS +0x84BC 0xAF71 #HANGUL SYLLABLE SSANGKIYEOK WAE RIEULTHIEUTH +0x84BD 0xAF72 #HANGUL SYLLABLE SSANGKIYEOK WAE RIEULPHIEUPH +0x84BE 0xAF73 #HANGUL SYLLABLE SSANGKIYEOK WAE RIEULHIEUH +0x84BF 0xAF74 #HANGUL SYLLABLE SSANGKIYEOK WAE MIEUM +0x84C0 0xAF75 #HANGUL SYLLABLE SSANGKIYEOK WAE PIEUP +0x84C1 0xAF76 #HANGUL SYLLABLE SSANGKIYEOK WAE PIEUPSIOS +0x84C2 0xAF77 #HANGUL SYLLABLE SSANGKIYEOK WAE SIOS +0x84C3 0xAF78 #HANGUL SYLLABLE SSANGKIYEOK WAE SSANGSIOS +0x84C4 0xAF7A #HANGUL SYLLABLE SSANGKIYEOK WAE CIEUC +0x84C5 0xAF7B #HANGUL SYLLABLE SSANGKIYEOK WAE CHIEUCH +0x84C6 0xAF7C #HANGUL SYLLABLE SSANGKIYEOK WAE KHIEUKH +0x84C7 0xAF7D #HANGUL SYLLABLE SSANGKIYEOK WAE THIEUTH +0x84C8 0xAF7E #HANGUL SYLLABLE SSANGKIYEOK WAE PHIEUPH +0x84C9 0xAF7F #HANGUL SYLLABLE SSANGKIYEOK WAE HIEUH +0x84CA 0xAF81 #HANGUL SYLLABLE SSANGKIYEOK OE KIYEOK +0x84CB 0xAF82 #HANGUL SYLLABLE SSANGKIYEOK OE SSANGKIYEOK +0x84CC 0xAF83 #HANGUL SYLLABLE SSANGKIYEOK OE KIYEOKSIOS +0x84CD 0xAF85 #HANGUL SYLLABLE SSANGKIYEOK OE NIEUNCIEUC +0x84CE 0xAF86 #HANGUL SYLLABLE SSANGKIYEOK OE NIEUNHIEUH +0x84CF 0xAF87 #HANGUL SYLLABLE SSANGKIYEOK OE TIKEUT +0x84D0 0xAF89 #HANGUL SYLLABLE SSANGKIYEOK OE RIEULKIYEOK +0x84D1 0xAF8A #HANGUL SYLLABLE SSANGKIYEOK OE RIEULMIEUM +0x84D2 0xAF8B #HANGUL SYLLABLE SSANGKIYEOK OE RIEULPIEUP +0x84D3 0xAF8C #HANGUL SYLLABLE SSANGKIYEOK OE RIEULSIOS +0x84D4 0xAF8D #HANGUL SYLLABLE SSANGKIYEOK OE RIEULTHIEUTH +0x84D5 0xAF8E #HANGUL SYLLABLE SSANGKIYEOK OE RIEULPHIEUPH +0x84D6 0xAF8F #HANGUL SYLLABLE SSANGKIYEOK OE RIEULHIEUH +0x84D7 0xAF92 #HANGUL SYLLABLE SSANGKIYEOK OE PIEUPSIOS +0x84D8 0xAF93 #HANGUL SYLLABLE SSANGKIYEOK OE SIOS +0x84D9 0xAF94 #HANGUL SYLLABLE SSANGKIYEOK OE SSANGSIOS +0x84DA 0xAF96 #HANGUL SYLLABLE SSANGKIYEOK OE CIEUC +0x84DB 0xAF97 #HANGUL SYLLABLE SSANGKIYEOK OE CHIEUCH +0x84DC 0xAF98 #HANGUL SYLLABLE SSANGKIYEOK OE KHIEUKH +0x84DD 0xAF99 #HANGUL SYLLABLE SSANGKIYEOK OE THIEUTH +0x84DE 0xAF9A #HANGUL SYLLABLE SSANGKIYEOK OE PHIEUPH +0x84DF 0xAF9B #HANGUL SYLLABLE SSANGKIYEOK OE HIEUH +0x84E0 0xAF9D #HANGUL SYLLABLE SSANGKIYEOK YO KIYEOK +0x84E1 0xAF9E #HANGUL SYLLABLE SSANGKIYEOK YO SSANGKIYEOK +0x84E2 0xAF9F #HANGUL SYLLABLE SSANGKIYEOK YO KIYEOKSIOS +0x84E3 0xAFA0 #HANGUL SYLLABLE SSANGKIYEOK YO NIEUN +0x84E4 0xAFA1 #HANGUL SYLLABLE SSANGKIYEOK YO NIEUNCIEUC +0x84E5 0xAFA2 #HANGUL SYLLABLE SSANGKIYEOK YO NIEUNHIEUH +0x84E6 0xAFA3 #HANGUL SYLLABLE SSANGKIYEOK YO TIKEUT +0x84E7 0xAFA4 #HANGUL SYLLABLE SSANGKIYEOK YO RIEUL +0x84E8 0xAFA5 #HANGUL SYLLABLE SSANGKIYEOK YO RIEULKIYEOK +0x84E9 0xAFA6 #HANGUL SYLLABLE SSANGKIYEOK YO RIEULMIEUM +0x84EA 0xAFA7 #HANGUL SYLLABLE SSANGKIYEOK YO RIEULPIEUP +0x84EB 0xAFA8 #HANGUL SYLLABLE SSANGKIYEOK YO RIEULSIOS +0x84EC 0xAFA9 #HANGUL SYLLABLE SSANGKIYEOK YO RIEULTHIEUTH +0x84ED 0xAFAA #HANGUL SYLLABLE SSANGKIYEOK YO RIEULPHIEUPH +0x84EE 0xAFAB #HANGUL SYLLABLE SSANGKIYEOK YO RIEULHIEUH +0x84EF 0xAFAC #HANGUL SYLLABLE SSANGKIYEOK YO MIEUM +0x84F0 0xAFAD #HANGUL SYLLABLE SSANGKIYEOK YO PIEUP +0x84F1 0xAFAE #HANGUL SYLLABLE SSANGKIYEOK YO PIEUPSIOS +0x84F2 0xAFAF #HANGUL SYLLABLE SSANGKIYEOK YO SIOS +0x84F3 0xAFB0 #HANGUL SYLLABLE SSANGKIYEOK YO SSANGSIOS +0x84F4 0xAFB1 #HANGUL SYLLABLE SSANGKIYEOK YO IEUNG +0x84F5 0xAFB2 #HANGUL SYLLABLE SSANGKIYEOK YO CIEUC +0x84F6 0xAFB3 #HANGUL SYLLABLE SSANGKIYEOK YO CHIEUCH +0x84F7 0xAFB4 #HANGUL SYLLABLE SSANGKIYEOK YO KHIEUKH +0x84F8 0xAFB5 #HANGUL SYLLABLE SSANGKIYEOK YO THIEUTH +0x84F9 0xAFB6 #HANGUL SYLLABLE SSANGKIYEOK YO PHIEUPH +0x84FA 0xAFB7 #HANGUL SYLLABLE SSANGKIYEOK YO HIEUH +0x84FB 0xAFBA #HANGUL SYLLABLE SSANGKIYEOK U SSANGKIYEOK +0x84FC 0xAFBB #HANGUL SYLLABLE SSANGKIYEOK U KIYEOKSIOS +0x84FD 0xAFBD #HANGUL SYLLABLE SSANGKIYEOK U NIEUNCIEUC +0x84FE 0xAFBE #HANGUL SYLLABLE SSANGKIYEOK U NIEUNHIEUH +0x8541 0xAFBF #HANGUL SYLLABLE SSANGKIYEOK U TIKEUT +0x8542 0xAFC1 #HANGUL SYLLABLE SSANGKIYEOK U RIEULKIYEOK +0x8543 0xAFC2 #HANGUL SYLLABLE SSANGKIYEOK U RIEULMIEUM +0x8544 0xAFC3 #HANGUL SYLLABLE SSANGKIYEOK U RIEULPIEUP +0x8545 0xAFC4 #HANGUL SYLLABLE SSANGKIYEOK U RIEULSIOS +0x8546 0xAFC5 #HANGUL SYLLABLE SSANGKIYEOK U RIEULTHIEUTH +0x8547 0xAFC6 #HANGUL SYLLABLE SSANGKIYEOK U RIEULPHIEUPH +0x8548 0xAFCA #HANGUL SYLLABLE SSANGKIYEOK U PIEUPSIOS +0x8549 0xAFCC #HANGUL SYLLABLE SSANGKIYEOK U SSANGSIOS +0x854A 0xAFCF #HANGUL SYLLABLE SSANGKIYEOK U CHIEUCH +0x854B 0xAFD0 #HANGUL SYLLABLE SSANGKIYEOK U KHIEUKH +0x854C 0xAFD1 #HANGUL SYLLABLE SSANGKIYEOK U THIEUTH +0x854D 0xAFD2 #HANGUL SYLLABLE SSANGKIYEOK U PHIEUPH +0x854E 0xAFD3 #HANGUL SYLLABLE SSANGKIYEOK U HIEUH +0x854F 0xAFD5 #HANGUL SYLLABLE SSANGKIYEOK WEO KIYEOK +0x8550 0xAFD6 #HANGUL SYLLABLE SSANGKIYEOK WEO SSANGKIYEOK +0x8551 0xAFD7 #HANGUL SYLLABLE SSANGKIYEOK WEO KIYEOKSIOS +0x8552 0xAFD8 #HANGUL SYLLABLE SSANGKIYEOK WEO NIEUN +0x8553 0xAFD9 #HANGUL SYLLABLE SSANGKIYEOK WEO NIEUNCIEUC +0x8554 0xAFDA #HANGUL SYLLABLE SSANGKIYEOK WEO NIEUNHIEUH +0x8555 0xAFDB #HANGUL SYLLABLE SSANGKIYEOK WEO TIKEUT +0x8556 0xAFDD #HANGUL SYLLABLE SSANGKIYEOK WEO RIEULKIYEOK +0x8557 0xAFDE #HANGUL SYLLABLE SSANGKIYEOK WEO RIEULMIEUM +0x8558 0xAFDF #HANGUL SYLLABLE SSANGKIYEOK WEO RIEULPIEUP +0x8559 0xAFE0 #HANGUL SYLLABLE SSANGKIYEOK WEO RIEULSIOS +0x855A 0xAFE1 #HANGUL SYLLABLE SSANGKIYEOK WEO RIEULTHIEUTH +0x8561 0xAFE2 #HANGUL SYLLABLE SSANGKIYEOK WEO RIEULPHIEUPH +0x8562 0xAFE3 #HANGUL SYLLABLE SSANGKIYEOK WEO RIEULHIEUH +0x8563 0xAFE4 #HANGUL SYLLABLE SSANGKIYEOK WEO MIEUM +0x8564 0xAFE5 #HANGUL SYLLABLE SSANGKIYEOK WEO PIEUP +0x8565 0xAFE6 #HANGUL SYLLABLE SSANGKIYEOK WEO PIEUPSIOS +0x8566 0xAFE7 #HANGUL SYLLABLE SSANGKIYEOK WEO SIOS +0x8567 0xAFEA #HANGUL SYLLABLE SSANGKIYEOK WEO CIEUC +0x8568 0xAFEB #HANGUL SYLLABLE SSANGKIYEOK WEO CHIEUCH +0x8569 0xAFEC #HANGUL SYLLABLE SSANGKIYEOK WEO KHIEUKH +0x856A 0xAFED #HANGUL SYLLABLE SSANGKIYEOK WEO THIEUTH +0x856B 0xAFEE #HANGUL SYLLABLE SSANGKIYEOK WEO PHIEUPH +0x856C 0xAFEF #HANGUL SYLLABLE SSANGKIYEOK WEO HIEUH +0x856D 0xAFF2 #HANGUL SYLLABLE SSANGKIYEOK WE SSANGKIYEOK +0x856E 0xAFF3 #HANGUL SYLLABLE SSANGKIYEOK WE KIYEOKSIOS +0x856F 0xAFF5 #HANGUL SYLLABLE SSANGKIYEOK WE NIEUNCIEUC +0x8570 0xAFF6 #HANGUL SYLLABLE SSANGKIYEOK WE NIEUNHIEUH +0x8571 0xAFF7 #HANGUL SYLLABLE SSANGKIYEOK WE TIKEUT +0x8572 0xAFF9 #HANGUL SYLLABLE SSANGKIYEOK WE RIEULKIYEOK +0x8573 0xAFFA #HANGUL SYLLABLE SSANGKIYEOK WE RIEULMIEUM +0x8574 0xAFFB #HANGUL SYLLABLE SSANGKIYEOK WE RIEULPIEUP +0x8575 0xAFFC #HANGUL SYLLABLE SSANGKIYEOK WE RIEULSIOS +0x8576 0xAFFD #HANGUL SYLLABLE SSANGKIYEOK WE RIEULTHIEUTH +0x8577 0xAFFE #HANGUL SYLLABLE SSANGKIYEOK WE RIEULPHIEUPH +0x8578 0xAFFF #HANGUL SYLLABLE SSANGKIYEOK WE RIEULHIEUH +0x8579 0xB002 #HANGUL SYLLABLE SSANGKIYEOK WE PIEUPSIOS +0x857A 0xB003 #HANGUL SYLLABLE SSANGKIYEOK WE SIOS +0x8581 0xB005 #HANGUL SYLLABLE SSANGKIYEOK WE IEUNG +0x8582 0xB006 #HANGUL SYLLABLE SSANGKIYEOK WE CIEUC +0x8583 0xB007 #HANGUL SYLLABLE SSANGKIYEOK WE CHIEUCH +0x8584 0xB008 #HANGUL SYLLABLE SSANGKIYEOK WE KHIEUKH +0x8585 0xB009 #HANGUL SYLLABLE SSANGKIYEOK WE THIEUTH +0x8586 0xB00A #HANGUL SYLLABLE SSANGKIYEOK WE PHIEUPH +0x8587 0xB00B #HANGUL SYLLABLE SSANGKIYEOK WE HIEUH +0x8588 0xB00D #HANGUL SYLLABLE SSANGKIYEOK WI KIYEOK +0x8589 0xB00E #HANGUL SYLLABLE SSANGKIYEOK WI SSANGKIYEOK +0x858A 0xB00F #HANGUL SYLLABLE SSANGKIYEOK WI KIYEOKSIOS +0x858B 0xB011 #HANGUL SYLLABLE SSANGKIYEOK WI NIEUNCIEUC +0x858C 0xB012 #HANGUL SYLLABLE SSANGKIYEOK WI NIEUNHIEUH +0x858D 0xB013 #HANGUL SYLLABLE SSANGKIYEOK WI TIKEUT +0x858E 0xB015 #HANGUL SYLLABLE SSANGKIYEOK WI RIEULKIYEOK +0x858F 0xB016 #HANGUL SYLLABLE SSANGKIYEOK WI RIEULMIEUM +0x8590 0xB017 #HANGUL SYLLABLE SSANGKIYEOK WI RIEULPIEUP +0x8591 0xB018 #HANGUL SYLLABLE SSANGKIYEOK WI RIEULSIOS +0x8592 0xB019 #HANGUL SYLLABLE SSANGKIYEOK WI RIEULTHIEUTH +0x8593 0xB01A #HANGUL SYLLABLE SSANGKIYEOK WI RIEULPHIEUPH +0x8594 0xB01B #HANGUL SYLLABLE SSANGKIYEOK WI RIEULHIEUH +0x8595 0xB01E #HANGUL SYLLABLE SSANGKIYEOK WI PIEUPSIOS +0x8596 0xB01F #HANGUL SYLLABLE SSANGKIYEOK WI SIOS +0x8597 0xB020 #HANGUL SYLLABLE SSANGKIYEOK WI SSANGSIOS +0x8598 0xB021 #HANGUL SYLLABLE SSANGKIYEOK WI IEUNG +0x8599 0xB022 #HANGUL SYLLABLE SSANGKIYEOK WI CIEUC +0x859A 0xB023 #HANGUL SYLLABLE SSANGKIYEOK WI CHIEUCH +0x859B 0xB024 #HANGUL SYLLABLE SSANGKIYEOK WI KHIEUKH +0x859C 0xB025 #HANGUL SYLLABLE SSANGKIYEOK WI THIEUTH +0x859D 0xB026 #HANGUL SYLLABLE SSANGKIYEOK WI PHIEUPH +0x859E 0xB027 #HANGUL SYLLABLE SSANGKIYEOK WI HIEUH +0x859F 0xB029 #HANGUL SYLLABLE SSANGKIYEOK YU KIYEOK +0x85A0 0xB02A #HANGUL SYLLABLE SSANGKIYEOK YU SSANGKIYEOK +0x85A1 0xB02B #HANGUL SYLLABLE SSANGKIYEOK YU KIYEOKSIOS +0x85A2 0xB02C #HANGUL SYLLABLE SSANGKIYEOK YU NIEUN +0x85A3 0xB02D #HANGUL SYLLABLE SSANGKIYEOK YU NIEUNCIEUC +0x85A4 0xB02E #HANGUL SYLLABLE SSANGKIYEOK YU NIEUNHIEUH +0x85A5 0xB02F #HANGUL SYLLABLE SSANGKIYEOK YU TIKEUT +0x85A6 0xB030 #HANGUL SYLLABLE SSANGKIYEOK YU RIEUL +0x85A7 0xB031 #HANGUL SYLLABLE SSANGKIYEOK YU RIEULKIYEOK +0x85A8 0xB032 #HANGUL SYLLABLE SSANGKIYEOK YU RIEULMIEUM +0x85A9 0xB033 #HANGUL SYLLABLE SSANGKIYEOK YU RIEULPIEUP +0x85AA 0xB034 #HANGUL SYLLABLE SSANGKIYEOK YU RIEULSIOS +0x85AB 0xB035 #HANGUL SYLLABLE SSANGKIYEOK YU RIEULTHIEUTH +0x85AC 0xB036 #HANGUL SYLLABLE SSANGKIYEOK YU RIEULPHIEUPH +0x85AD 0xB037 #HANGUL SYLLABLE SSANGKIYEOK YU RIEULHIEUH +0x85AE 0xB038 #HANGUL SYLLABLE SSANGKIYEOK YU MIEUM +0x85AF 0xB039 #HANGUL SYLLABLE SSANGKIYEOK YU PIEUP +0x85B0 0xB03A #HANGUL SYLLABLE SSANGKIYEOK YU PIEUPSIOS +0x85B1 0xB03B #HANGUL SYLLABLE SSANGKIYEOK YU SIOS +0x85B2 0xB03C #HANGUL SYLLABLE SSANGKIYEOK YU SSANGSIOS +0x85B3 0xB03D #HANGUL SYLLABLE SSANGKIYEOK YU IEUNG +0x85B4 0xB03E #HANGUL SYLLABLE SSANGKIYEOK YU CIEUC +0x85B5 0xB03F #HANGUL SYLLABLE SSANGKIYEOK YU CHIEUCH +0x85B6 0xB040 #HANGUL SYLLABLE SSANGKIYEOK YU KHIEUKH +0x85B7 0xB041 #HANGUL SYLLABLE SSANGKIYEOK YU THIEUTH +0x85B8 0xB042 #HANGUL SYLLABLE SSANGKIYEOK YU PHIEUPH +0x85B9 0xB043 #HANGUL SYLLABLE SSANGKIYEOK YU HIEUH +0x85BA 0xB046 #HANGUL SYLLABLE SSANGKIYEOK EU SSANGKIYEOK +0x85BB 0xB047 #HANGUL SYLLABLE SSANGKIYEOK EU KIYEOKSIOS +0x85BC 0xB049 #HANGUL SYLLABLE SSANGKIYEOK EU NIEUNCIEUC +0x85BD 0xB04B #HANGUL SYLLABLE SSANGKIYEOK EU TIKEUT +0x85BE 0xB04D #HANGUL SYLLABLE SSANGKIYEOK EU RIEULKIYEOK +0x85BF 0xB04F #HANGUL SYLLABLE SSANGKIYEOK EU RIEULPIEUP +0x85C0 0xB050 #HANGUL SYLLABLE SSANGKIYEOK EU RIEULSIOS +0x85C1 0xB051 #HANGUL SYLLABLE SSANGKIYEOK EU RIEULTHIEUTH +0x85C2 0xB052 #HANGUL SYLLABLE SSANGKIYEOK EU RIEULPHIEUPH +0x85C3 0xB056 #HANGUL SYLLABLE SSANGKIYEOK EU PIEUPSIOS +0x85C4 0xB058 #HANGUL SYLLABLE SSANGKIYEOK EU SSANGSIOS +0x85C5 0xB05A #HANGUL SYLLABLE SSANGKIYEOK EU CIEUC +0x85C6 0xB05B #HANGUL SYLLABLE SSANGKIYEOK EU CHIEUCH +0x85C7 0xB05C #HANGUL SYLLABLE SSANGKIYEOK EU KHIEUKH +0x85C8 0xB05E #HANGUL SYLLABLE SSANGKIYEOK EU PHIEUPH +0x85C9 0xB05F #HANGUL SYLLABLE SSANGKIYEOK EU HIEUH +0x85CA 0xB060 #HANGUL SYLLABLE SSANGKIYEOK YI +0x85CB 0xB061 #HANGUL SYLLABLE SSANGKIYEOK YI KIYEOK +0x85CC 0xB062 #HANGUL SYLLABLE SSANGKIYEOK YI SSANGKIYEOK +0x85CD 0xB063 #HANGUL SYLLABLE SSANGKIYEOK YI KIYEOKSIOS +0x85CE 0xB064 #HANGUL SYLLABLE SSANGKIYEOK YI NIEUN +0x85CF 0xB065 #HANGUL SYLLABLE SSANGKIYEOK YI NIEUNCIEUC +0x85D0 0xB066 #HANGUL SYLLABLE SSANGKIYEOK YI NIEUNHIEUH +0x85D1 0xB067 #HANGUL SYLLABLE SSANGKIYEOK YI TIKEUT +0x85D2 0xB068 #HANGUL SYLLABLE SSANGKIYEOK YI RIEUL +0x85D3 0xB069 #HANGUL SYLLABLE SSANGKIYEOK YI RIEULKIYEOK +0x85D4 0xB06A #HANGUL SYLLABLE SSANGKIYEOK YI RIEULMIEUM +0x85D5 0xB06B #HANGUL SYLLABLE SSANGKIYEOK YI RIEULPIEUP +0x85D6 0xB06C #HANGUL SYLLABLE SSANGKIYEOK YI RIEULSIOS +0x85D7 0xB06D #HANGUL SYLLABLE SSANGKIYEOK YI RIEULTHIEUTH +0x85D8 0xB06E #HANGUL SYLLABLE SSANGKIYEOK YI RIEULPHIEUPH +0x85D9 0xB06F #HANGUL SYLLABLE SSANGKIYEOK YI RIEULHIEUH +0x85DA 0xB070 #HANGUL SYLLABLE SSANGKIYEOK YI MIEUM +0x85DB 0xB071 #HANGUL SYLLABLE SSANGKIYEOK YI PIEUP +0x85DC 0xB072 #HANGUL SYLLABLE SSANGKIYEOK YI PIEUPSIOS +0x85DD 0xB073 #HANGUL SYLLABLE SSANGKIYEOK YI SIOS +0x85DE 0xB074 #HANGUL SYLLABLE SSANGKIYEOK YI SSANGSIOS +0x85DF 0xB075 #HANGUL SYLLABLE SSANGKIYEOK YI IEUNG +0x85E0 0xB076 #HANGUL SYLLABLE SSANGKIYEOK YI CIEUC +0x85E1 0xB077 #HANGUL SYLLABLE SSANGKIYEOK YI CHIEUCH +0x85E2 0xB078 #HANGUL SYLLABLE SSANGKIYEOK YI KHIEUKH +0x85E3 0xB079 #HANGUL SYLLABLE SSANGKIYEOK YI THIEUTH +0x85E4 0xB07A #HANGUL SYLLABLE SSANGKIYEOK YI PHIEUPH +0x85E5 0xB07B #HANGUL SYLLABLE SSANGKIYEOK YI HIEUH +0x85E6 0xB07E #HANGUL SYLLABLE SSANGKIYEOK I SSANGKIYEOK +0x85E7 0xB07F #HANGUL SYLLABLE SSANGKIYEOK I KIYEOKSIOS +0x85E8 0xB081 #HANGUL SYLLABLE SSANGKIYEOK I NIEUNCIEUC +0x85E9 0xB082 #HANGUL SYLLABLE SSANGKIYEOK I NIEUNHIEUH +0x85EA 0xB083 #HANGUL SYLLABLE SSANGKIYEOK I TIKEUT +0x85EB 0xB085 #HANGUL SYLLABLE SSANGKIYEOK I RIEULKIYEOK +0x85EC 0xB086 #HANGUL SYLLABLE SSANGKIYEOK I RIEULMIEUM +0x85ED 0xB087 #HANGUL SYLLABLE SSANGKIYEOK I RIEULPIEUP +0x85EE 0xB088 #HANGUL SYLLABLE SSANGKIYEOK I RIEULSIOS +0x85EF 0xB089 #HANGUL SYLLABLE SSANGKIYEOK I RIEULTHIEUTH +0x85F0 0xB08A #HANGUL SYLLABLE SSANGKIYEOK I RIEULPHIEUPH +0x85F1 0xB08B #HANGUL SYLLABLE SSANGKIYEOK I RIEULHIEUH +0x85F2 0xB08E #HANGUL SYLLABLE SSANGKIYEOK I PIEUPSIOS +0x85F3 0xB090 #HANGUL SYLLABLE SSANGKIYEOK I SSANGSIOS +0x85F4 0xB092 #HANGUL SYLLABLE SSANGKIYEOK I CIEUC +0x85F5 0xB093 #HANGUL SYLLABLE SSANGKIYEOK I CHIEUCH +0x85F6 0xB094 #HANGUL SYLLABLE SSANGKIYEOK I KHIEUKH +0x85F7 0xB095 #HANGUL SYLLABLE SSANGKIYEOK I THIEUTH +0x85F8 0xB096 #HANGUL SYLLABLE SSANGKIYEOK I PHIEUPH +0x85F9 0xB097 #HANGUL SYLLABLE SSANGKIYEOK I HIEUH +0x85FA 0xB09B #HANGUL SYLLABLE NIEUN A KIYEOKSIOS +0x85FB 0xB09D #HANGUL SYLLABLE NIEUN A NIEUNCIEUC +0x85FC 0xB09E #HANGUL SYLLABLE NIEUN A NIEUNHIEUH +0x85FD 0xB0A3 #HANGUL SYLLABLE NIEUN A RIEULPIEUP +0x85FE 0xB0A4 #HANGUL SYLLABLE NIEUN A RIEULSIOS +0x8641 0xB0A5 #HANGUL SYLLABLE NIEUN A RIEULTHIEUTH +0x8642 0xB0A6 #HANGUL SYLLABLE NIEUN A RIEULPHIEUPH +0x8643 0xB0A7 #HANGUL SYLLABLE NIEUN A RIEULHIEUH +0x8644 0xB0AA #HANGUL SYLLABLE NIEUN A PIEUPSIOS +0x8645 0xB0B0 #HANGUL SYLLABLE NIEUN A KHIEUKH +0x8646 0xB0B2 #HANGUL SYLLABLE NIEUN A PHIEUPH +0x8647 0xB0B6 #HANGUL SYLLABLE NIEUN AE SSANGKIYEOK +0x8648 0xB0B7 #HANGUL SYLLABLE NIEUN AE KIYEOKSIOS +0x8649 0xB0B9 #HANGUL SYLLABLE NIEUN AE NIEUNCIEUC +0x864A 0xB0BA #HANGUL SYLLABLE NIEUN AE NIEUNHIEUH +0x864B 0xB0BB #HANGUL SYLLABLE NIEUN AE TIKEUT +0x864C 0xB0BD #HANGUL SYLLABLE NIEUN AE RIEULKIYEOK +0x864D 0xB0BE #HANGUL SYLLABLE NIEUN AE RIEULMIEUM +0x864E 0xB0BF #HANGUL SYLLABLE NIEUN AE RIEULPIEUP +0x864F 0xB0C0 #HANGUL SYLLABLE NIEUN AE RIEULSIOS +0x8650 0xB0C1 #HANGUL SYLLABLE NIEUN AE RIEULTHIEUTH +0x8651 0xB0C2 #HANGUL SYLLABLE NIEUN AE RIEULPHIEUPH +0x8652 0xB0C3 #HANGUL SYLLABLE NIEUN AE RIEULHIEUH +0x8653 0xB0C6 #HANGUL SYLLABLE NIEUN AE PIEUPSIOS +0x8654 0xB0CA #HANGUL SYLLABLE NIEUN AE CIEUC +0x8655 0xB0CB #HANGUL SYLLABLE NIEUN AE CHIEUCH +0x8656 0xB0CC #HANGUL SYLLABLE NIEUN AE KHIEUKH +0x8657 0xB0CD #HANGUL SYLLABLE NIEUN AE THIEUTH +0x8658 0xB0CE #HANGUL SYLLABLE NIEUN AE PHIEUPH +0x8659 0xB0CF #HANGUL SYLLABLE NIEUN AE HIEUH +0x865A 0xB0D2 #HANGUL SYLLABLE NIEUN YA SSANGKIYEOK +0x8661 0xB0D3 #HANGUL SYLLABLE NIEUN YA KIYEOKSIOS +0x8662 0xB0D5 #HANGUL SYLLABLE NIEUN YA NIEUNCIEUC +0x8663 0xB0D6 #HANGUL SYLLABLE NIEUN YA NIEUNHIEUH +0x8664 0xB0D7 #HANGUL SYLLABLE NIEUN YA TIKEUT +0x8665 0xB0D9 #HANGUL SYLLABLE NIEUN YA RIEULKIYEOK +0x8666 0xB0DA #HANGUL SYLLABLE NIEUN YA RIEULMIEUM +0x8667 0xB0DB #HANGUL SYLLABLE NIEUN YA RIEULPIEUP +0x8668 0xB0DC #HANGUL SYLLABLE NIEUN YA RIEULSIOS +0x8669 0xB0DD #HANGUL SYLLABLE NIEUN YA RIEULTHIEUTH +0x866A 0xB0DE #HANGUL SYLLABLE NIEUN YA RIEULPHIEUPH +0x866B 0xB0DF #HANGUL SYLLABLE NIEUN YA RIEULHIEUH +0x866C 0xB0E1 #HANGUL SYLLABLE NIEUN YA PIEUP +0x866D 0xB0E2 #HANGUL SYLLABLE NIEUN YA PIEUPSIOS +0x866E 0xB0E3 #HANGUL SYLLABLE NIEUN YA SIOS +0x866F 0xB0E4 #HANGUL SYLLABLE NIEUN YA SSANGSIOS +0x8670 0xB0E6 #HANGUL SYLLABLE NIEUN YA CIEUC +0x8671 0xB0E7 #HANGUL SYLLABLE NIEUN YA CHIEUCH +0x8672 0xB0E8 #HANGUL SYLLABLE NIEUN YA KHIEUKH +0x8673 0xB0E9 #HANGUL SYLLABLE NIEUN YA THIEUTH +0x8674 0xB0EA #HANGUL SYLLABLE NIEUN YA PHIEUPH +0x8675 0xB0EB #HANGUL SYLLABLE NIEUN YA HIEUH +0x8676 0xB0EC #HANGUL SYLLABLE NIEUN YAE +0x8677 0xB0ED #HANGUL SYLLABLE NIEUN YAE KIYEOK +0x8678 0xB0EE #HANGUL SYLLABLE NIEUN YAE SSANGKIYEOK +0x8679 0xB0EF #HANGUL SYLLABLE NIEUN YAE KIYEOKSIOS +0x867A 0xB0F0 #HANGUL SYLLABLE NIEUN YAE NIEUN +0x8681 0xB0F1 #HANGUL SYLLABLE NIEUN YAE NIEUNCIEUC +0x8682 0xB0F2 #HANGUL SYLLABLE NIEUN YAE NIEUNHIEUH +0x8683 0xB0F3 #HANGUL SYLLABLE NIEUN YAE TIKEUT +0x8684 0xB0F4 #HANGUL SYLLABLE NIEUN YAE RIEUL +0x8685 0xB0F5 #HANGUL SYLLABLE NIEUN YAE RIEULKIYEOK +0x8686 0xB0F6 #HANGUL SYLLABLE NIEUN YAE RIEULMIEUM +0x8687 0xB0F7 #HANGUL SYLLABLE NIEUN YAE RIEULPIEUP +0x8688 0xB0F8 #HANGUL SYLLABLE NIEUN YAE RIEULSIOS +0x8689 0xB0F9 #HANGUL SYLLABLE NIEUN YAE RIEULTHIEUTH +0x868A 0xB0FA #HANGUL SYLLABLE NIEUN YAE RIEULPHIEUPH +0x868B 0xB0FB #HANGUL SYLLABLE NIEUN YAE RIEULHIEUH +0x868C 0xB0FC #HANGUL SYLLABLE NIEUN YAE MIEUM +0x868D 0xB0FD #HANGUL SYLLABLE NIEUN YAE PIEUP +0x868E 0xB0FE #HANGUL SYLLABLE NIEUN YAE PIEUPSIOS +0x868F 0xB0FF #HANGUL SYLLABLE NIEUN YAE SIOS +0x8690 0xB100 #HANGUL SYLLABLE NIEUN YAE SSANGSIOS +0x8691 0xB101 #HANGUL SYLLABLE NIEUN YAE IEUNG +0x8692 0xB102 #HANGUL SYLLABLE NIEUN YAE CIEUC +0x8693 0xB103 #HANGUL SYLLABLE NIEUN YAE CHIEUCH +0x8694 0xB104 #HANGUL SYLLABLE NIEUN YAE KHIEUKH +0x8695 0xB105 #HANGUL SYLLABLE NIEUN YAE THIEUTH +0x8696 0xB106 #HANGUL SYLLABLE NIEUN YAE PHIEUPH +0x8697 0xB107 #HANGUL SYLLABLE NIEUN YAE HIEUH +0x8698 0xB10A #HANGUL SYLLABLE NIEUN EO SSANGKIYEOK +0x8699 0xB10D #HANGUL SYLLABLE NIEUN EO NIEUNCIEUC +0x869A 0xB10E #HANGUL SYLLABLE NIEUN EO NIEUNHIEUH +0x869B 0xB10F #HANGUL SYLLABLE NIEUN EO TIKEUT +0x869C 0xB111 #HANGUL SYLLABLE NIEUN EO RIEULKIYEOK +0x869D 0xB114 #HANGUL SYLLABLE NIEUN EO RIEULSIOS +0x869E 0xB115 #HANGUL SYLLABLE NIEUN EO RIEULTHIEUTH +0x869F 0xB116 #HANGUL SYLLABLE NIEUN EO RIEULPHIEUPH +0x86A0 0xB117 #HANGUL SYLLABLE NIEUN EO RIEULHIEUH +0x86A1 0xB11A #HANGUL SYLLABLE NIEUN EO PIEUPSIOS +0x86A2 0xB11E #HANGUL SYLLABLE NIEUN EO CIEUC +0x86A3 0xB11F #HANGUL SYLLABLE NIEUN EO CHIEUCH +0x86A4 0xB120 #HANGUL SYLLABLE NIEUN EO KHIEUKH +0x86A5 0xB121 #HANGUL SYLLABLE NIEUN EO THIEUTH +0x86A6 0xB122 #HANGUL SYLLABLE NIEUN EO PHIEUPH +0x86A7 0xB126 #HANGUL SYLLABLE NIEUN E SSANGKIYEOK +0x86A8 0xB127 #HANGUL SYLLABLE NIEUN E KIYEOKSIOS +0x86A9 0xB129 #HANGUL SYLLABLE NIEUN E NIEUNCIEUC +0x86AA 0xB12A #HANGUL SYLLABLE NIEUN E NIEUNHIEUH +0x86AB 0xB12B #HANGUL SYLLABLE NIEUN E TIKEUT +0x86AC 0xB12D #HANGUL SYLLABLE NIEUN E RIEULKIYEOK +0x86AD 0xB12E #HANGUL SYLLABLE NIEUN E RIEULMIEUM +0x86AE 0xB12F #HANGUL SYLLABLE NIEUN E RIEULPIEUP +0x86AF 0xB130 #HANGUL SYLLABLE NIEUN E RIEULSIOS +0x86B0 0xB131 #HANGUL SYLLABLE NIEUN E RIEULTHIEUTH +0x86B1 0xB132 #HANGUL SYLLABLE NIEUN E RIEULPHIEUPH +0x86B2 0xB133 #HANGUL SYLLABLE NIEUN E RIEULHIEUH +0x86B3 0xB136 #HANGUL SYLLABLE NIEUN E PIEUPSIOS +0x86B4 0xB13A #HANGUL SYLLABLE NIEUN E CIEUC +0x86B5 0xB13B #HANGUL SYLLABLE NIEUN E CHIEUCH +0x86B6 0xB13C #HANGUL SYLLABLE NIEUN E KHIEUKH +0x86B7 0xB13D #HANGUL SYLLABLE NIEUN E THIEUTH +0x86B8 0xB13E #HANGUL SYLLABLE NIEUN E PHIEUPH +0x86B9 0xB13F #HANGUL SYLLABLE NIEUN E HIEUH +0x86BA 0xB142 #HANGUL SYLLABLE NIEUN YEO SSANGKIYEOK +0x86BB 0xB143 #HANGUL SYLLABLE NIEUN YEO KIYEOKSIOS +0x86BC 0xB145 #HANGUL SYLLABLE NIEUN YEO NIEUNCIEUC +0x86BD 0xB146 #HANGUL SYLLABLE NIEUN YEO NIEUNHIEUH +0x86BE 0xB147 #HANGUL SYLLABLE NIEUN YEO TIKEUT +0x86BF 0xB149 #HANGUL SYLLABLE NIEUN YEO RIEULKIYEOK +0x86C0 0xB14A #HANGUL SYLLABLE NIEUN YEO RIEULMIEUM +0x86C1 0xB14B #HANGUL SYLLABLE NIEUN YEO RIEULPIEUP +0x86C2 0xB14C #HANGUL SYLLABLE NIEUN YEO RIEULSIOS +0x86C3 0xB14D #HANGUL SYLLABLE NIEUN YEO RIEULTHIEUTH +0x86C4 0xB14E #HANGUL SYLLABLE NIEUN YEO RIEULPHIEUPH +0x86C5 0xB14F #HANGUL SYLLABLE NIEUN YEO RIEULHIEUH +0x86C6 0xB152 #HANGUL SYLLABLE NIEUN YEO PIEUPSIOS +0x86C7 0xB153 #HANGUL SYLLABLE NIEUN YEO SIOS +0x86C8 0xB156 #HANGUL SYLLABLE NIEUN YEO CIEUC +0x86C9 0xB157 #HANGUL SYLLABLE NIEUN YEO CHIEUCH +0x86CA 0xB159 #HANGUL SYLLABLE NIEUN YEO THIEUTH +0x86CB 0xB15A #HANGUL SYLLABLE NIEUN YEO PHIEUPH +0x86CC 0xB15B #HANGUL SYLLABLE NIEUN YEO HIEUH +0x86CD 0xB15D #HANGUL SYLLABLE NIEUN YE KIYEOK +0x86CE 0xB15E #HANGUL SYLLABLE NIEUN YE SSANGKIYEOK +0x86CF 0xB15F #HANGUL SYLLABLE NIEUN YE KIYEOKSIOS +0x86D0 0xB161 #HANGUL SYLLABLE NIEUN YE NIEUNCIEUC +0x86D1 0xB162 #HANGUL SYLLABLE NIEUN YE NIEUNHIEUH +0x86D2 0xB163 #HANGUL SYLLABLE NIEUN YE TIKEUT +0x86D3 0xB164 #HANGUL SYLLABLE NIEUN YE RIEUL +0x86D4 0xB165 #HANGUL SYLLABLE NIEUN YE RIEULKIYEOK +0x86D5 0xB166 #HANGUL SYLLABLE NIEUN YE RIEULMIEUM +0x86D6 0xB167 #HANGUL SYLLABLE NIEUN YE RIEULPIEUP +0x86D7 0xB168 #HANGUL SYLLABLE NIEUN YE RIEULSIOS +0x86D8 0xB169 #HANGUL SYLLABLE NIEUN YE RIEULTHIEUTH +0x86D9 0xB16A #HANGUL SYLLABLE NIEUN YE RIEULPHIEUPH +0x86DA 0xB16B #HANGUL SYLLABLE NIEUN YE RIEULHIEUH +0x86DB 0xB16C #HANGUL SYLLABLE NIEUN YE MIEUM +0x86DC 0xB16D #HANGUL SYLLABLE NIEUN YE PIEUP +0x86DD 0xB16E #HANGUL SYLLABLE NIEUN YE PIEUPSIOS +0x86DE 0xB16F #HANGUL SYLLABLE NIEUN YE SIOS +0x86DF 0xB170 #HANGUL SYLLABLE NIEUN YE SSANGSIOS +0x86E0 0xB171 #HANGUL SYLLABLE NIEUN YE IEUNG +0x86E1 0xB172 #HANGUL SYLLABLE NIEUN YE CIEUC +0x86E2 0xB173 #HANGUL SYLLABLE NIEUN YE CHIEUCH +0x86E3 0xB174 #HANGUL SYLLABLE NIEUN YE KHIEUKH +0x86E4 0xB175 #HANGUL SYLLABLE NIEUN YE THIEUTH +0x86E5 0xB176 #HANGUL SYLLABLE NIEUN YE PHIEUPH +0x86E6 0xB177 #HANGUL SYLLABLE NIEUN YE HIEUH +0x86E7 0xB17A #HANGUL SYLLABLE NIEUN O SSANGKIYEOK +0x86E8 0xB17B #HANGUL SYLLABLE NIEUN O KIYEOKSIOS +0x86E9 0xB17D #HANGUL SYLLABLE NIEUN O NIEUNCIEUC +0x86EA 0xB17E #HANGUL SYLLABLE NIEUN O NIEUNHIEUH +0x86EB 0xB17F #HANGUL SYLLABLE NIEUN O TIKEUT +0x86EC 0xB181 #HANGUL SYLLABLE NIEUN O RIEULKIYEOK +0x86ED 0xB183 #HANGUL SYLLABLE NIEUN O RIEULPIEUP +0x86EE 0xB184 #HANGUL SYLLABLE NIEUN O RIEULSIOS +0x86EF 0xB185 #HANGUL SYLLABLE NIEUN O RIEULTHIEUTH +0x86F0 0xB186 #HANGUL SYLLABLE NIEUN O RIEULPHIEUPH +0x86F1 0xB187 #HANGUL SYLLABLE NIEUN O RIEULHIEUH +0x86F2 0xB18A #HANGUL SYLLABLE NIEUN O PIEUPSIOS +0x86F3 0xB18C #HANGUL SYLLABLE NIEUN O SSANGSIOS +0x86F4 0xB18E #HANGUL SYLLABLE NIEUN O CIEUC +0x86F5 0xB18F #HANGUL SYLLABLE NIEUN O CHIEUCH +0x86F6 0xB190 #HANGUL SYLLABLE NIEUN O KHIEUKH +0x86F7 0xB191 #HANGUL SYLLABLE NIEUN O THIEUTH +0x86F8 0xB195 #HANGUL SYLLABLE NIEUN WA KIYEOK +0x86F9 0xB196 #HANGUL SYLLABLE NIEUN WA SSANGKIYEOK +0x86FA 0xB197 #HANGUL SYLLABLE NIEUN WA KIYEOKSIOS +0x86FB 0xB199 #HANGUL SYLLABLE NIEUN WA NIEUNCIEUC +0x86FC 0xB19A #HANGUL SYLLABLE NIEUN WA NIEUNHIEUH +0x86FD 0xB19B #HANGUL SYLLABLE NIEUN WA TIKEUT +0x86FE 0xB19D #HANGUL SYLLABLE NIEUN WA RIEULKIYEOK +0x8741 0xB19E #HANGUL SYLLABLE NIEUN WA RIEULMIEUM +0x8742 0xB19F #HANGUL SYLLABLE NIEUN WA RIEULPIEUP +0x8743 0xB1A0 #HANGUL SYLLABLE NIEUN WA RIEULSIOS +0x8744 0xB1A1 #HANGUL SYLLABLE NIEUN WA RIEULTHIEUTH +0x8745 0xB1A2 #HANGUL SYLLABLE NIEUN WA RIEULPHIEUPH +0x8746 0xB1A3 #HANGUL SYLLABLE NIEUN WA RIEULHIEUH +0x8747 0xB1A4 #HANGUL SYLLABLE NIEUN WA MIEUM +0x8748 0xB1A5 #HANGUL SYLLABLE NIEUN WA PIEUP +0x8749 0xB1A6 #HANGUL SYLLABLE NIEUN WA PIEUPSIOS +0x874A 0xB1A7 #HANGUL SYLLABLE NIEUN WA SIOS +0x874B 0xB1A9 #HANGUL SYLLABLE NIEUN WA IEUNG +0x874C 0xB1AA #HANGUL SYLLABLE NIEUN WA CIEUC +0x874D 0xB1AB #HANGUL SYLLABLE NIEUN WA CHIEUCH +0x874E 0xB1AC #HANGUL SYLLABLE NIEUN WA KHIEUKH +0x874F 0xB1AD #HANGUL SYLLABLE NIEUN WA THIEUTH +0x8750 0xB1AE #HANGUL SYLLABLE NIEUN WA PHIEUPH +0x8751 0xB1AF #HANGUL SYLLABLE NIEUN WA HIEUH +0x8752 0xB1B0 #HANGUL SYLLABLE NIEUN WAE +0x8753 0xB1B1 #HANGUL SYLLABLE NIEUN WAE KIYEOK +0x8754 0xB1B2 #HANGUL SYLLABLE NIEUN WAE SSANGKIYEOK +0x8755 0xB1B3 #HANGUL SYLLABLE NIEUN WAE KIYEOKSIOS +0x8756 0xB1B4 #HANGUL SYLLABLE NIEUN WAE NIEUN +0x8757 0xB1B5 #HANGUL SYLLABLE NIEUN WAE NIEUNCIEUC +0x8758 0xB1B6 #HANGUL SYLLABLE NIEUN WAE NIEUNHIEUH +0x8759 0xB1B7 #HANGUL SYLLABLE NIEUN WAE TIKEUT +0x875A 0xB1B8 #HANGUL SYLLABLE NIEUN WAE RIEUL +0x8761 0xB1B9 #HANGUL SYLLABLE NIEUN WAE RIEULKIYEOK +0x8762 0xB1BA #HANGUL SYLLABLE NIEUN WAE RIEULMIEUM +0x8763 0xB1BB #HANGUL SYLLABLE NIEUN WAE RIEULPIEUP +0x8764 0xB1BC #HANGUL SYLLABLE NIEUN WAE RIEULSIOS +0x8765 0xB1BD #HANGUL SYLLABLE NIEUN WAE RIEULTHIEUTH +0x8766 0xB1BE #HANGUL SYLLABLE NIEUN WAE RIEULPHIEUPH +0x8767 0xB1BF #HANGUL SYLLABLE NIEUN WAE RIEULHIEUH +0x8768 0xB1C0 #HANGUL SYLLABLE NIEUN WAE MIEUM +0x8769 0xB1C1 #HANGUL SYLLABLE NIEUN WAE PIEUP +0x876A 0xB1C2 #HANGUL SYLLABLE NIEUN WAE PIEUPSIOS +0x876B 0xB1C3 #HANGUL SYLLABLE NIEUN WAE SIOS +0x876C 0xB1C4 #HANGUL SYLLABLE NIEUN WAE SSANGSIOS +0x876D 0xB1C5 #HANGUL SYLLABLE NIEUN WAE IEUNG +0x876E 0xB1C6 #HANGUL SYLLABLE NIEUN WAE CIEUC +0x876F 0xB1C7 #HANGUL SYLLABLE NIEUN WAE CHIEUCH +0x8770 0xB1C8 #HANGUL SYLLABLE NIEUN WAE KHIEUKH +0x8771 0xB1C9 #HANGUL SYLLABLE NIEUN WAE THIEUTH +0x8772 0xB1CA #HANGUL SYLLABLE NIEUN WAE PHIEUPH +0x8773 0xB1CB #HANGUL SYLLABLE NIEUN WAE HIEUH +0x8774 0xB1CD #HANGUL SYLLABLE NIEUN OE KIYEOK +0x8775 0xB1CE #HANGUL SYLLABLE NIEUN OE SSANGKIYEOK +0x8776 0xB1CF #HANGUL SYLLABLE NIEUN OE KIYEOKSIOS +0x8777 0xB1D1 #HANGUL SYLLABLE NIEUN OE NIEUNCIEUC +0x8778 0xB1D2 #HANGUL SYLLABLE NIEUN OE NIEUNHIEUH +0x8779 0xB1D3 #HANGUL SYLLABLE NIEUN OE TIKEUT +0x877A 0xB1D5 #HANGUL SYLLABLE NIEUN OE RIEULKIYEOK +0x8781 0xB1D6 #HANGUL SYLLABLE NIEUN OE RIEULMIEUM +0x8782 0xB1D7 #HANGUL SYLLABLE NIEUN OE RIEULPIEUP +0x8783 0xB1D8 #HANGUL SYLLABLE NIEUN OE RIEULSIOS +0x8784 0xB1D9 #HANGUL SYLLABLE NIEUN OE RIEULTHIEUTH +0x8785 0xB1DA #HANGUL SYLLABLE NIEUN OE RIEULPHIEUPH +0x8786 0xB1DB #HANGUL SYLLABLE NIEUN OE RIEULHIEUH +0x8787 0xB1DE #HANGUL SYLLABLE NIEUN OE PIEUPSIOS +0x8788 0xB1E0 #HANGUL SYLLABLE NIEUN OE SSANGSIOS +0x8789 0xB1E1 #HANGUL SYLLABLE NIEUN OE IEUNG +0x878A 0xB1E2 #HANGUL SYLLABLE NIEUN OE CIEUC +0x878B 0xB1E3 #HANGUL SYLLABLE NIEUN OE CHIEUCH +0x878C 0xB1E4 #HANGUL SYLLABLE NIEUN OE KHIEUKH +0x878D 0xB1E5 #HANGUL SYLLABLE NIEUN OE THIEUTH +0x878E 0xB1E6 #HANGUL SYLLABLE NIEUN OE PHIEUPH +0x878F 0xB1E7 #HANGUL SYLLABLE NIEUN OE HIEUH +0x8790 0xB1EA #HANGUL SYLLABLE NIEUN YO SSANGKIYEOK +0x8791 0xB1EB #HANGUL SYLLABLE NIEUN YO KIYEOKSIOS +0x8792 0xB1ED #HANGUL SYLLABLE NIEUN YO NIEUNCIEUC +0x8793 0xB1EE #HANGUL SYLLABLE NIEUN YO NIEUNHIEUH +0x8794 0xB1EF #HANGUL SYLLABLE NIEUN YO TIKEUT +0x8795 0xB1F1 #HANGUL SYLLABLE NIEUN YO RIEULKIYEOK +0x8796 0xB1F2 #HANGUL SYLLABLE NIEUN YO RIEULMIEUM +0x8797 0xB1F3 #HANGUL SYLLABLE NIEUN YO RIEULPIEUP +0x8798 0xB1F4 #HANGUL SYLLABLE NIEUN YO RIEULSIOS +0x8799 0xB1F5 #HANGUL SYLLABLE NIEUN YO RIEULTHIEUTH +0x879A 0xB1F6 #HANGUL SYLLABLE NIEUN YO RIEULPHIEUPH +0x879B 0xB1F7 #HANGUL SYLLABLE NIEUN YO RIEULHIEUH +0x879C 0xB1F8 #HANGUL SYLLABLE NIEUN YO MIEUM +0x879D 0xB1FA #HANGUL SYLLABLE NIEUN YO PIEUPSIOS +0x879E 0xB1FC #HANGUL SYLLABLE NIEUN YO SSANGSIOS +0x879F 0xB1FE #HANGUL SYLLABLE NIEUN YO CIEUC +0x87A0 0xB1FF #HANGUL SYLLABLE NIEUN YO CHIEUCH +0x87A1 0xB200 #HANGUL SYLLABLE NIEUN YO KHIEUKH +0x87A2 0xB201 #HANGUL SYLLABLE NIEUN YO THIEUTH +0x87A3 0xB202 #HANGUL SYLLABLE NIEUN YO PHIEUPH +0x87A4 0xB203 #HANGUL SYLLABLE NIEUN YO HIEUH +0x87A5 0xB206 #HANGUL SYLLABLE NIEUN U SSANGKIYEOK +0x87A6 0xB207 #HANGUL SYLLABLE NIEUN U KIYEOKSIOS +0x87A7 0xB209 #HANGUL SYLLABLE NIEUN U NIEUNCIEUC +0x87A8 0xB20A #HANGUL SYLLABLE NIEUN U NIEUNHIEUH +0x87A9 0xB20D #HANGUL SYLLABLE NIEUN U RIEULKIYEOK +0x87AA 0xB20E #HANGUL SYLLABLE NIEUN U RIEULMIEUM +0x87AB 0xB20F #HANGUL SYLLABLE NIEUN U RIEULPIEUP +0x87AC 0xB210 #HANGUL SYLLABLE NIEUN U RIEULSIOS +0x87AD 0xB211 #HANGUL SYLLABLE NIEUN U RIEULTHIEUTH +0x87AE 0xB212 #HANGUL SYLLABLE NIEUN U RIEULPHIEUPH +0x87AF 0xB213 #HANGUL SYLLABLE NIEUN U RIEULHIEUH +0x87B0 0xB216 #HANGUL SYLLABLE NIEUN U PIEUPSIOS +0x87B1 0xB218 #HANGUL SYLLABLE NIEUN U SSANGSIOS +0x87B2 0xB21A #HANGUL SYLLABLE NIEUN U CIEUC +0x87B3 0xB21B #HANGUL SYLLABLE NIEUN U CHIEUCH +0x87B4 0xB21C #HANGUL SYLLABLE NIEUN U KHIEUKH +0x87B5 0xB21D #HANGUL SYLLABLE NIEUN U THIEUTH +0x87B6 0xB21E #HANGUL SYLLABLE NIEUN U PHIEUPH +0x87B7 0xB21F #HANGUL SYLLABLE NIEUN U HIEUH +0x87B8 0xB221 #HANGUL SYLLABLE NIEUN WEO KIYEOK +0x87B9 0xB222 #HANGUL SYLLABLE NIEUN WEO SSANGKIYEOK +0x87BA 0xB223 #HANGUL SYLLABLE NIEUN WEO KIYEOKSIOS +0x87BB 0xB224 #HANGUL SYLLABLE NIEUN WEO NIEUN +0x87BC 0xB225 #HANGUL SYLLABLE NIEUN WEO NIEUNCIEUC +0x87BD 0xB226 #HANGUL SYLLABLE NIEUN WEO NIEUNHIEUH +0x87BE 0xB227 #HANGUL SYLLABLE NIEUN WEO TIKEUT +0x87BF 0xB228 #HANGUL SYLLABLE NIEUN WEO RIEUL +0x87C0 0xB229 #HANGUL SYLLABLE NIEUN WEO RIEULKIYEOK +0x87C1 0xB22A #HANGUL SYLLABLE NIEUN WEO RIEULMIEUM +0x87C2 0xB22B #HANGUL SYLLABLE NIEUN WEO RIEULPIEUP +0x87C3 0xB22C #HANGUL SYLLABLE NIEUN WEO RIEULSIOS +0x87C4 0xB22D #HANGUL SYLLABLE NIEUN WEO RIEULTHIEUTH +0x87C5 0xB22E #HANGUL SYLLABLE NIEUN WEO RIEULPHIEUPH +0x87C6 0xB22F #HANGUL SYLLABLE NIEUN WEO RIEULHIEUH +0x87C7 0xB230 #HANGUL SYLLABLE NIEUN WEO MIEUM +0x87C8 0xB231 #HANGUL SYLLABLE NIEUN WEO PIEUP +0x87C9 0xB232 #HANGUL SYLLABLE NIEUN WEO PIEUPSIOS +0x87CA 0xB233 #HANGUL SYLLABLE NIEUN WEO SIOS +0x87CB 0xB235 #HANGUL SYLLABLE NIEUN WEO IEUNG +0x87CC 0xB236 #HANGUL SYLLABLE NIEUN WEO CIEUC +0x87CD 0xB237 #HANGUL SYLLABLE NIEUN WEO CHIEUCH +0x87CE 0xB238 #HANGUL SYLLABLE NIEUN WEO KHIEUKH +0x87CF 0xB239 #HANGUL SYLLABLE NIEUN WEO THIEUTH +0x87D0 0xB23A #HANGUL SYLLABLE NIEUN WEO PHIEUPH +0x87D1 0xB23B #HANGUL SYLLABLE NIEUN WEO HIEUH +0x87D2 0xB23D #HANGUL SYLLABLE NIEUN WE KIYEOK +0x87D3 0xB23E #HANGUL SYLLABLE NIEUN WE SSANGKIYEOK +0x87D4 0xB23F #HANGUL SYLLABLE NIEUN WE KIYEOKSIOS +0x87D5 0xB240 #HANGUL SYLLABLE NIEUN WE NIEUN +0x87D6 0xB241 #HANGUL SYLLABLE NIEUN WE NIEUNCIEUC +0x87D7 0xB242 #HANGUL SYLLABLE NIEUN WE NIEUNHIEUH +0x87D8 0xB243 #HANGUL SYLLABLE NIEUN WE TIKEUT +0x87D9 0xB244 #HANGUL SYLLABLE NIEUN WE RIEUL +0x87DA 0xB245 #HANGUL SYLLABLE NIEUN WE RIEULKIYEOK +0x87DB 0xB246 #HANGUL SYLLABLE NIEUN WE RIEULMIEUM +0x87DC 0xB247 #HANGUL SYLLABLE NIEUN WE RIEULPIEUP +0x87DD 0xB248 #HANGUL SYLLABLE NIEUN WE RIEULSIOS +0x87DE 0xB249 #HANGUL SYLLABLE NIEUN WE RIEULTHIEUTH +0x87DF 0xB24A #HANGUL SYLLABLE NIEUN WE RIEULPHIEUPH +0x87E0 0xB24B #HANGUL SYLLABLE NIEUN WE RIEULHIEUH +0x87E1 0xB24C #HANGUL SYLLABLE NIEUN WE MIEUM +0x87E2 0xB24D #HANGUL SYLLABLE NIEUN WE PIEUP +0x87E3 0xB24E #HANGUL SYLLABLE NIEUN WE PIEUPSIOS +0x87E4 0xB24F #HANGUL SYLLABLE NIEUN WE SIOS +0x87E5 0xB250 #HANGUL SYLLABLE NIEUN WE SSANGSIOS +0x87E6 0xB251 #HANGUL SYLLABLE NIEUN WE IEUNG +0x87E7 0xB252 #HANGUL SYLLABLE NIEUN WE CIEUC +0x87E8 0xB253 #HANGUL SYLLABLE NIEUN WE CHIEUCH +0x87E9 0xB254 #HANGUL SYLLABLE NIEUN WE KHIEUKH +0x87EA 0xB255 #HANGUL SYLLABLE NIEUN WE THIEUTH +0x87EB 0xB256 #HANGUL SYLLABLE NIEUN WE PHIEUPH +0x87EC 0xB257 #HANGUL SYLLABLE NIEUN WE HIEUH +0x87ED 0xB259 #HANGUL SYLLABLE NIEUN WI KIYEOK +0x87EE 0xB25A #HANGUL SYLLABLE NIEUN WI SSANGKIYEOK +0x87EF 0xB25B #HANGUL SYLLABLE NIEUN WI KIYEOKSIOS +0x87F0 0xB25D #HANGUL SYLLABLE NIEUN WI NIEUNCIEUC +0x87F1 0xB25E #HANGUL SYLLABLE NIEUN WI NIEUNHIEUH +0x87F2 0xB25F #HANGUL SYLLABLE NIEUN WI TIKEUT +0x87F3 0xB261 #HANGUL SYLLABLE NIEUN WI RIEULKIYEOK +0x87F4 0xB262 #HANGUL SYLLABLE NIEUN WI RIEULMIEUM +0x87F5 0xB263 #HANGUL SYLLABLE NIEUN WI RIEULPIEUP +0x87F6 0xB264 #HANGUL SYLLABLE NIEUN WI RIEULSIOS +0x87F7 0xB265 #HANGUL SYLLABLE NIEUN WI RIEULTHIEUTH +0x87F8 0xB266 #HANGUL SYLLABLE NIEUN WI RIEULPHIEUPH +0x87F9 0xB267 #HANGUL SYLLABLE NIEUN WI RIEULHIEUH +0x87FA 0xB26A #HANGUL SYLLABLE NIEUN WI PIEUPSIOS +0x87FB 0xB26B #HANGUL SYLLABLE NIEUN WI SIOS +0x87FC 0xB26C #HANGUL SYLLABLE NIEUN WI SSANGSIOS +0x87FD 0xB26D #HANGUL SYLLABLE NIEUN WI IEUNG +0x87FE 0xB26E #HANGUL SYLLABLE NIEUN WI CIEUC +0x8841 0xB26F #HANGUL SYLLABLE NIEUN WI CHIEUCH +0x8842 0xB270 #HANGUL SYLLABLE NIEUN WI KHIEUKH +0x8843 0xB271 #HANGUL SYLLABLE NIEUN WI THIEUTH +0x8844 0xB272 #HANGUL SYLLABLE NIEUN WI PHIEUPH +0x8845 0xB273 #HANGUL SYLLABLE NIEUN WI HIEUH +0x8846 0xB276 #HANGUL SYLLABLE NIEUN YU SSANGKIYEOK +0x8847 0xB277 #HANGUL SYLLABLE NIEUN YU KIYEOKSIOS +0x8848 0xB278 #HANGUL SYLLABLE NIEUN YU NIEUN +0x8849 0xB279 #HANGUL SYLLABLE NIEUN YU NIEUNCIEUC +0x884A 0xB27A #HANGUL SYLLABLE NIEUN YU NIEUNHIEUH +0x884B 0xB27B #HANGUL SYLLABLE NIEUN YU TIKEUT +0x884C 0xB27D #HANGUL SYLLABLE NIEUN YU RIEULKIYEOK +0x884D 0xB27E #HANGUL SYLLABLE NIEUN YU RIEULMIEUM +0x884E 0xB27F #HANGUL SYLLABLE NIEUN YU RIEULPIEUP +0x884F 0xB280 #HANGUL SYLLABLE NIEUN YU RIEULSIOS +0x8850 0xB281 #HANGUL SYLLABLE NIEUN YU RIEULTHIEUTH +0x8851 0xB282 #HANGUL SYLLABLE NIEUN YU RIEULPHIEUPH +0x8852 0xB283 #HANGUL SYLLABLE NIEUN YU RIEULHIEUH +0x8853 0xB286 #HANGUL SYLLABLE NIEUN YU PIEUPSIOS +0x8854 0xB287 #HANGUL SYLLABLE NIEUN YU SIOS +0x8855 0xB288 #HANGUL SYLLABLE NIEUN YU SSANGSIOS +0x8856 0xB28A #HANGUL SYLLABLE NIEUN YU CIEUC +0x8857 0xB28B #HANGUL SYLLABLE NIEUN YU CHIEUCH +0x8858 0xB28C #HANGUL SYLLABLE NIEUN YU KHIEUKH +0x8859 0xB28D #HANGUL SYLLABLE NIEUN YU THIEUTH +0x885A 0xB28E #HANGUL SYLLABLE NIEUN YU PHIEUPH +0x8861 0xB28F #HANGUL SYLLABLE NIEUN YU HIEUH +0x8862 0xB292 #HANGUL SYLLABLE NIEUN EU SSANGKIYEOK +0x8863 0xB293 #HANGUL SYLLABLE NIEUN EU KIYEOKSIOS +0x8864 0xB295 #HANGUL SYLLABLE NIEUN EU NIEUNCIEUC +0x8865 0xB296 #HANGUL SYLLABLE NIEUN EU NIEUNHIEUH +0x8866 0xB297 #HANGUL SYLLABLE NIEUN EU TIKEUT +0x8867 0xB29B #HANGUL SYLLABLE NIEUN EU RIEULPIEUP +0x8868 0xB29C #HANGUL SYLLABLE NIEUN EU RIEULSIOS +0x8869 0xB29D #HANGUL SYLLABLE NIEUN EU RIEULTHIEUTH +0x886A 0xB29E #HANGUL SYLLABLE NIEUN EU RIEULPHIEUPH +0x886B 0xB29F #HANGUL SYLLABLE NIEUN EU RIEULHIEUH +0x886C 0xB2A2 #HANGUL SYLLABLE NIEUN EU PIEUPSIOS +0x886D 0xB2A4 #HANGUL SYLLABLE NIEUN EU SSANGSIOS +0x886E 0xB2A7 #HANGUL SYLLABLE NIEUN EU CHIEUCH +0x886F 0xB2A8 #HANGUL SYLLABLE NIEUN EU KHIEUKH +0x8870 0xB2A9 #HANGUL SYLLABLE NIEUN EU THIEUTH +0x8871 0xB2AB #HANGUL SYLLABLE NIEUN EU HIEUH +0x8872 0xB2AD #HANGUL SYLLABLE NIEUN YI KIYEOK +0x8873 0xB2AE #HANGUL SYLLABLE NIEUN YI SSANGKIYEOK +0x8874 0xB2AF #HANGUL SYLLABLE NIEUN YI KIYEOKSIOS +0x8875 0xB2B1 #HANGUL SYLLABLE NIEUN YI NIEUNCIEUC +0x8876 0xB2B2 #HANGUL SYLLABLE NIEUN YI NIEUNHIEUH +0x8877 0xB2B3 #HANGUL SYLLABLE NIEUN YI TIKEUT +0x8878 0xB2B5 #HANGUL SYLLABLE NIEUN YI RIEULKIYEOK +0x8879 0xB2B6 #HANGUL SYLLABLE NIEUN YI RIEULMIEUM +0x887A 0xB2B7 #HANGUL SYLLABLE NIEUN YI RIEULPIEUP +0x8881 0xB2B8 #HANGUL SYLLABLE NIEUN YI RIEULSIOS +0x8882 0xB2B9 #HANGUL SYLLABLE NIEUN YI RIEULTHIEUTH +0x8883 0xB2BA #HANGUL SYLLABLE NIEUN YI RIEULPHIEUPH +0x8884 0xB2BB #HANGUL SYLLABLE NIEUN YI RIEULHIEUH +0x8885 0xB2BC #HANGUL SYLLABLE NIEUN YI MIEUM +0x8886 0xB2BD #HANGUL SYLLABLE NIEUN YI PIEUP +0x8887 0xB2BE #HANGUL SYLLABLE NIEUN YI PIEUPSIOS +0x8888 0xB2BF #HANGUL SYLLABLE NIEUN YI SIOS +0x8889 0xB2C0 #HANGUL SYLLABLE NIEUN YI SSANGSIOS +0x888A 0xB2C1 #HANGUL SYLLABLE NIEUN YI IEUNG +0x888B 0xB2C2 #HANGUL SYLLABLE NIEUN YI CIEUC +0x888C 0xB2C3 #HANGUL SYLLABLE NIEUN YI CHIEUCH +0x888D 0xB2C4 #HANGUL SYLLABLE NIEUN YI KHIEUKH +0x888E 0xB2C5 #HANGUL SYLLABLE NIEUN YI THIEUTH +0x888F 0xB2C6 #HANGUL SYLLABLE NIEUN YI PHIEUPH +0x8890 0xB2C7 #HANGUL SYLLABLE NIEUN YI HIEUH +0x8891 0xB2CA #HANGUL SYLLABLE NIEUN I SSANGKIYEOK +0x8892 0xB2CB #HANGUL SYLLABLE NIEUN I KIYEOKSIOS +0x8893 0xB2CD #HANGUL SYLLABLE NIEUN I NIEUNCIEUC +0x8894 0xB2CE #HANGUL SYLLABLE NIEUN I NIEUNHIEUH +0x8895 0xB2CF #HANGUL SYLLABLE NIEUN I TIKEUT +0x8896 0xB2D1 #HANGUL SYLLABLE NIEUN I RIEULKIYEOK +0x8897 0xB2D3 #HANGUL SYLLABLE NIEUN I RIEULPIEUP +0x8898 0xB2D4 #HANGUL SYLLABLE NIEUN I RIEULSIOS +0x8899 0xB2D5 #HANGUL SYLLABLE NIEUN I RIEULTHIEUTH +0x889A 0xB2D6 #HANGUL SYLLABLE NIEUN I RIEULPHIEUPH +0x889B 0xB2D7 #HANGUL SYLLABLE NIEUN I RIEULHIEUH +0x889C 0xB2DA #HANGUL SYLLABLE NIEUN I PIEUPSIOS +0x889D 0xB2DC #HANGUL SYLLABLE NIEUN I SSANGSIOS +0x889E 0xB2DE #HANGUL SYLLABLE NIEUN I CIEUC +0x889F 0xB2DF #HANGUL SYLLABLE NIEUN I CHIEUCH +0x88A0 0xB2E0 #HANGUL SYLLABLE NIEUN I KHIEUKH +0x88A1 0xB2E1 #HANGUL SYLLABLE NIEUN I THIEUTH +0x88A2 0xB2E3 #HANGUL SYLLABLE NIEUN I HIEUH +0x88A3 0xB2E7 #HANGUL SYLLABLE TIKEUT A KIYEOKSIOS +0x88A4 0xB2E9 #HANGUL SYLLABLE TIKEUT A NIEUNCIEUC +0x88A5 0xB2EA #HANGUL SYLLABLE TIKEUT A NIEUNHIEUH +0x88A6 0xB2F0 #HANGUL SYLLABLE TIKEUT A RIEULSIOS +0x88A7 0xB2F1 #HANGUL SYLLABLE TIKEUT A RIEULTHIEUTH +0x88A8 0xB2F2 #HANGUL SYLLABLE TIKEUT A RIEULPHIEUPH +0x88A9 0xB2F6 #HANGUL SYLLABLE TIKEUT A PIEUPSIOS +0x88AA 0xB2FC #HANGUL SYLLABLE TIKEUT A KHIEUKH +0x88AB 0xB2FD #HANGUL SYLLABLE TIKEUT A THIEUTH +0x88AC 0xB2FE #HANGUL SYLLABLE TIKEUT A PHIEUPH +0x88AD 0xB302 #HANGUL SYLLABLE TIKEUT AE SSANGKIYEOK +0x88AE 0xB303 #HANGUL SYLLABLE TIKEUT AE KIYEOKSIOS +0x88AF 0xB305 #HANGUL SYLLABLE TIKEUT AE NIEUNCIEUC +0x88B0 0xB306 #HANGUL SYLLABLE TIKEUT AE NIEUNHIEUH +0x88B1 0xB307 #HANGUL SYLLABLE TIKEUT AE TIKEUT +0x88B2 0xB309 #HANGUL SYLLABLE TIKEUT AE RIEULKIYEOK +0x88B3 0xB30A #HANGUL SYLLABLE TIKEUT AE RIEULMIEUM +0x88B4 0xB30B #HANGUL SYLLABLE TIKEUT AE RIEULPIEUP +0x88B5 0xB30C #HANGUL SYLLABLE TIKEUT AE RIEULSIOS +0x88B6 0xB30D #HANGUL SYLLABLE TIKEUT AE RIEULTHIEUTH +0x88B7 0xB30E #HANGUL SYLLABLE TIKEUT AE RIEULPHIEUPH +0x88B8 0xB30F #HANGUL SYLLABLE TIKEUT AE RIEULHIEUH +0x88B9 0xB312 #HANGUL SYLLABLE TIKEUT AE PIEUPSIOS +0x88BA 0xB316 #HANGUL SYLLABLE TIKEUT AE CIEUC +0x88BB 0xB317 #HANGUL SYLLABLE TIKEUT AE CHIEUCH +0x88BC 0xB318 #HANGUL SYLLABLE TIKEUT AE KHIEUKH +0x88BD 0xB319 #HANGUL SYLLABLE TIKEUT AE THIEUTH +0x88BE 0xB31A #HANGUL SYLLABLE TIKEUT AE PHIEUPH +0x88BF 0xB31B #HANGUL SYLLABLE TIKEUT AE HIEUH +0x88C0 0xB31D #HANGUL SYLLABLE TIKEUT YA KIYEOK +0x88C1 0xB31E #HANGUL SYLLABLE TIKEUT YA SSANGKIYEOK +0x88C2 0xB31F #HANGUL SYLLABLE TIKEUT YA KIYEOKSIOS +0x88C3 0xB320 #HANGUL SYLLABLE TIKEUT YA NIEUN +0x88C4 0xB321 #HANGUL SYLLABLE TIKEUT YA NIEUNCIEUC +0x88C5 0xB322 #HANGUL SYLLABLE TIKEUT YA NIEUNHIEUH +0x88C6 0xB323 #HANGUL SYLLABLE TIKEUT YA TIKEUT +0x88C7 0xB324 #HANGUL SYLLABLE TIKEUT YA RIEUL +0x88C8 0xB325 #HANGUL SYLLABLE TIKEUT YA RIEULKIYEOK +0x88C9 0xB326 #HANGUL SYLLABLE TIKEUT YA RIEULMIEUM +0x88CA 0xB327 #HANGUL SYLLABLE TIKEUT YA RIEULPIEUP +0x88CB 0xB328 #HANGUL SYLLABLE TIKEUT YA RIEULSIOS +0x88CC 0xB329 #HANGUL SYLLABLE TIKEUT YA RIEULTHIEUTH +0x88CD 0xB32A #HANGUL SYLLABLE TIKEUT YA RIEULPHIEUPH +0x88CE 0xB32B #HANGUL SYLLABLE TIKEUT YA RIEULHIEUH +0x88CF 0xB32C #HANGUL SYLLABLE TIKEUT YA MIEUM +0x88D0 0xB32D #HANGUL SYLLABLE TIKEUT YA PIEUP +0x88D1 0xB32E #HANGUL SYLLABLE TIKEUT YA PIEUPSIOS +0x88D2 0xB32F #HANGUL SYLLABLE TIKEUT YA SIOS +0x88D3 0xB330 #HANGUL SYLLABLE TIKEUT YA SSANGSIOS +0x88D4 0xB331 #HANGUL SYLLABLE TIKEUT YA IEUNG +0x88D5 0xB332 #HANGUL SYLLABLE TIKEUT YA CIEUC +0x88D6 0xB333 #HANGUL SYLLABLE TIKEUT YA CHIEUCH +0x88D7 0xB334 #HANGUL SYLLABLE TIKEUT YA KHIEUKH +0x88D8 0xB335 #HANGUL SYLLABLE TIKEUT YA THIEUTH +0x88D9 0xB336 #HANGUL SYLLABLE TIKEUT YA PHIEUPH +0x88DA 0xB337 #HANGUL SYLLABLE TIKEUT YA HIEUH +0x88DB 0xB338 #HANGUL SYLLABLE TIKEUT YAE +0x88DC 0xB339 #HANGUL SYLLABLE TIKEUT YAE KIYEOK +0x88DD 0xB33A #HANGUL SYLLABLE TIKEUT YAE SSANGKIYEOK +0x88DE 0xB33B #HANGUL SYLLABLE TIKEUT YAE KIYEOKSIOS +0x88DF 0xB33C #HANGUL SYLLABLE TIKEUT YAE NIEUN +0x88E0 0xB33D #HANGUL SYLLABLE TIKEUT YAE NIEUNCIEUC +0x88E1 0xB33E #HANGUL SYLLABLE TIKEUT YAE NIEUNHIEUH +0x88E2 0xB33F #HANGUL SYLLABLE TIKEUT YAE TIKEUT +0x88E3 0xB340 #HANGUL SYLLABLE TIKEUT YAE RIEUL +0x88E4 0xB341 #HANGUL SYLLABLE TIKEUT YAE RIEULKIYEOK +0x88E5 0xB342 #HANGUL SYLLABLE TIKEUT YAE RIEULMIEUM +0x88E6 0xB343 #HANGUL SYLLABLE TIKEUT YAE RIEULPIEUP +0x88E7 0xB344 #HANGUL SYLLABLE TIKEUT YAE RIEULSIOS +0x88E8 0xB345 #HANGUL SYLLABLE TIKEUT YAE RIEULTHIEUTH +0x88E9 0xB346 #HANGUL SYLLABLE TIKEUT YAE RIEULPHIEUPH +0x88EA 0xB347 #HANGUL SYLLABLE TIKEUT YAE RIEULHIEUH +0x88EB 0xB348 #HANGUL SYLLABLE TIKEUT YAE MIEUM +0x88EC 0xB349 #HANGUL SYLLABLE TIKEUT YAE PIEUP +0x88ED 0xB34A #HANGUL SYLLABLE TIKEUT YAE PIEUPSIOS +0x88EE 0xB34B #HANGUL SYLLABLE TIKEUT YAE SIOS +0x88EF 0xB34C #HANGUL SYLLABLE TIKEUT YAE SSANGSIOS +0x88F0 0xB34D #HANGUL SYLLABLE TIKEUT YAE IEUNG +0x88F1 0xB34E #HANGUL SYLLABLE TIKEUT YAE CIEUC +0x88F2 0xB34F #HANGUL SYLLABLE TIKEUT YAE CHIEUCH +0x88F3 0xB350 #HANGUL SYLLABLE TIKEUT YAE KHIEUKH +0x88F4 0xB351 #HANGUL SYLLABLE TIKEUT YAE THIEUTH +0x88F5 0xB352 #HANGUL SYLLABLE TIKEUT YAE PHIEUPH +0x88F6 0xB353 #HANGUL SYLLABLE TIKEUT YAE HIEUH +0x88F7 0xB357 #HANGUL SYLLABLE TIKEUT EO KIYEOKSIOS +0x88F8 0xB359 #HANGUL SYLLABLE TIKEUT EO NIEUNCIEUC +0x88F9 0xB35A #HANGUL SYLLABLE TIKEUT EO NIEUNHIEUH +0x88FA 0xB35D #HANGUL SYLLABLE TIKEUT EO RIEULKIYEOK +0x88FB 0xB360 #HANGUL SYLLABLE TIKEUT EO RIEULSIOS +0x88FC 0xB361 #HANGUL SYLLABLE TIKEUT EO RIEULTHIEUTH +0x88FD 0xB362 #HANGUL SYLLABLE TIKEUT EO RIEULPHIEUPH +0x88FE 0xB363 #HANGUL SYLLABLE TIKEUT EO RIEULHIEUH +0x8941 0xB366 #HANGUL SYLLABLE TIKEUT EO PIEUPSIOS +0x8942 0xB368 #HANGUL SYLLABLE TIKEUT EO SSANGSIOS +0x8943 0xB36A #HANGUL SYLLABLE TIKEUT EO CIEUC +0x8944 0xB36C #HANGUL SYLLABLE TIKEUT EO KHIEUKH +0x8945 0xB36D #HANGUL SYLLABLE TIKEUT EO THIEUTH +0x8946 0xB36F #HANGUL SYLLABLE TIKEUT EO HIEUH +0x8947 0xB372 #HANGUL SYLLABLE TIKEUT E SSANGKIYEOK +0x8948 0xB373 #HANGUL SYLLABLE TIKEUT E KIYEOKSIOS +0x8949 0xB375 #HANGUL SYLLABLE TIKEUT E NIEUNCIEUC +0x894A 0xB376 #HANGUL SYLLABLE TIKEUT E NIEUNHIEUH +0x894B 0xB377 #HANGUL SYLLABLE TIKEUT E TIKEUT +0x894C 0xB379 #HANGUL SYLLABLE TIKEUT E RIEULKIYEOK +0x894D 0xB37A #HANGUL SYLLABLE TIKEUT E RIEULMIEUM +0x894E 0xB37B #HANGUL SYLLABLE TIKEUT E RIEULPIEUP +0x894F 0xB37C #HANGUL SYLLABLE TIKEUT E RIEULSIOS +0x8950 0xB37D #HANGUL SYLLABLE TIKEUT E RIEULTHIEUTH +0x8951 0xB37E #HANGUL SYLLABLE TIKEUT E RIEULPHIEUPH +0x8952 0xB37F #HANGUL SYLLABLE TIKEUT E RIEULHIEUH +0x8953 0xB382 #HANGUL SYLLABLE TIKEUT E PIEUPSIOS +0x8954 0xB386 #HANGUL SYLLABLE TIKEUT E CIEUC +0x8955 0xB387 #HANGUL SYLLABLE TIKEUT E CHIEUCH +0x8956 0xB388 #HANGUL SYLLABLE TIKEUT E KHIEUKH +0x8957 0xB389 #HANGUL SYLLABLE TIKEUT E THIEUTH +0x8958 0xB38A #HANGUL SYLLABLE TIKEUT E PHIEUPH +0x8959 0xB38B #HANGUL SYLLABLE TIKEUT E HIEUH +0x895A 0xB38D #HANGUL SYLLABLE TIKEUT YEO KIYEOK +0x8961 0xB38E #HANGUL SYLLABLE TIKEUT YEO SSANGKIYEOK +0x8962 0xB38F #HANGUL SYLLABLE TIKEUT YEO KIYEOKSIOS +0x8963 0xB391 #HANGUL SYLLABLE TIKEUT YEO NIEUNCIEUC +0x8964 0xB392 #HANGUL SYLLABLE TIKEUT YEO NIEUNHIEUH +0x8965 0xB393 #HANGUL SYLLABLE TIKEUT YEO TIKEUT +0x8966 0xB395 #HANGUL SYLLABLE TIKEUT YEO RIEULKIYEOK +0x8967 0xB396 #HANGUL SYLLABLE TIKEUT YEO RIEULMIEUM +0x8968 0xB397 #HANGUL SYLLABLE TIKEUT YEO RIEULPIEUP +0x8969 0xB398 #HANGUL SYLLABLE TIKEUT YEO RIEULSIOS +0x896A 0xB399 #HANGUL SYLLABLE TIKEUT YEO RIEULTHIEUTH +0x896B 0xB39A #HANGUL SYLLABLE TIKEUT YEO RIEULPHIEUPH +0x896C 0xB39B #HANGUL SYLLABLE TIKEUT YEO RIEULHIEUH +0x896D 0xB39C #HANGUL SYLLABLE TIKEUT YEO MIEUM +0x896E 0xB39D #HANGUL SYLLABLE TIKEUT YEO PIEUP +0x896F 0xB39E #HANGUL SYLLABLE TIKEUT YEO PIEUPSIOS +0x8970 0xB39F #HANGUL SYLLABLE TIKEUT YEO SIOS +0x8971 0xB3A2 #HANGUL SYLLABLE TIKEUT YEO CIEUC +0x8972 0xB3A3 #HANGUL SYLLABLE TIKEUT YEO CHIEUCH +0x8973 0xB3A4 #HANGUL SYLLABLE TIKEUT YEO KHIEUKH +0x8974 0xB3A5 #HANGUL SYLLABLE TIKEUT YEO THIEUTH +0x8975 0xB3A6 #HANGUL SYLLABLE TIKEUT YEO PHIEUPH +0x8976 0xB3A7 #HANGUL SYLLABLE TIKEUT YEO HIEUH +0x8977 0xB3A9 #HANGUL SYLLABLE TIKEUT YE KIYEOK +0x8978 0xB3AA #HANGUL SYLLABLE TIKEUT YE SSANGKIYEOK +0x8979 0xB3AB #HANGUL SYLLABLE TIKEUT YE KIYEOKSIOS +0x897A 0xB3AD #HANGUL SYLLABLE TIKEUT YE NIEUNCIEUC +0x8981 0xB3AE #HANGUL SYLLABLE TIKEUT YE NIEUNHIEUH +0x8982 0xB3AF #HANGUL SYLLABLE TIKEUT YE TIKEUT +0x8983 0xB3B0 #HANGUL SYLLABLE TIKEUT YE RIEUL +0x8984 0xB3B1 #HANGUL SYLLABLE TIKEUT YE RIEULKIYEOK +0x8985 0xB3B2 #HANGUL SYLLABLE TIKEUT YE RIEULMIEUM +0x8986 0xB3B3 #HANGUL SYLLABLE TIKEUT YE RIEULPIEUP +0x8987 0xB3B4 #HANGUL SYLLABLE TIKEUT YE RIEULSIOS +0x8988 0xB3B5 #HANGUL SYLLABLE TIKEUT YE RIEULTHIEUTH +0x8989 0xB3B6 #HANGUL SYLLABLE TIKEUT YE RIEULPHIEUPH +0x898A 0xB3B7 #HANGUL SYLLABLE TIKEUT YE RIEULHIEUH +0x898B 0xB3B8 #HANGUL SYLLABLE TIKEUT YE MIEUM +0x898C 0xB3B9 #HANGUL SYLLABLE TIKEUT YE PIEUP +0x898D 0xB3BA #HANGUL SYLLABLE TIKEUT YE PIEUPSIOS +0x898E 0xB3BB #HANGUL SYLLABLE TIKEUT YE SIOS +0x898F 0xB3BC #HANGUL SYLLABLE TIKEUT YE SSANGSIOS +0x8990 0xB3BD #HANGUL SYLLABLE TIKEUT YE IEUNG +0x8991 0xB3BE #HANGUL SYLLABLE TIKEUT YE CIEUC +0x8992 0xB3BF #HANGUL SYLLABLE TIKEUT YE CHIEUCH +0x8993 0xB3C0 #HANGUL SYLLABLE TIKEUT YE KHIEUKH +0x8994 0xB3C1 #HANGUL SYLLABLE TIKEUT YE THIEUTH +0x8995 0xB3C2 #HANGUL SYLLABLE TIKEUT YE PHIEUPH +0x8996 0xB3C3 #HANGUL SYLLABLE TIKEUT YE HIEUH +0x8997 0xB3C6 #HANGUL SYLLABLE TIKEUT O SSANGKIYEOK +0x8998 0xB3C7 #HANGUL SYLLABLE TIKEUT O KIYEOKSIOS +0x8999 0xB3C9 #HANGUL SYLLABLE TIKEUT O NIEUNCIEUC +0x899A 0xB3CA #HANGUL SYLLABLE TIKEUT O NIEUNHIEUH +0x899B 0xB3CD #HANGUL SYLLABLE TIKEUT O RIEULKIYEOK +0x899C 0xB3CF #HANGUL SYLLABLE TIKEUT O RIEULPIEUP +0x899D 0xB3D1 #HANGUL SYLLABLE TIKEUT O RIEULTHIEUTH +0x899E 0xB3D2 #HANGUL SYLLABLE TIKEUT O RIEULPHIEUPH +0x899F 0xB3D3 #HANGUL SYLLABLE TIKEUT O RIEULHIEUH +0x89A0 0xB3D6 #HANGUL SYLLABLE TIKEUT O PIEUPSIOS +0x89A1 0xB3D8 #HANGUL SYLLABLE TIKEUT O SSANGSIOS +0x89A2 0xB3DA #HANGUL SYLLABLE TIKEUT O CIEUC +0x89A3 0xB3DC #HANGUL SYLLABLE TIKEUT O KHIEUKH +0x89A4 0xB3DE #HANGUL SYLLABLE TIKEUT O PHIEUPH +0x89A5 0xB3DF #HANGUL SYLLABLE TIKEUT O HIEUH +0x89A6 0xB3E1 #HANGUL SYLLABLE TIKEUT WA KIYEOK +0x89A7 0xB3E2 #HANGUL SYLLABLE TIKEUT WA SSANGKIYEOK +0x89A8 0xB3E3 #HANGUL SYLLABLE TIKEUT WA KIYEOKSIOS +0x89A9 0xB3E5 #HANGUL SYLLABLE TIKEUT WA NIEUNCIEUC +0x89AA 0xB3E6 #HANGUL SYLLABLE TIKEUT WA NIEUNHIEUH +0x89AB 0xB3E7 #HANGUL SYLLABLE TIKEUT WA TIKEUT +0x89AC 0xB3E9 #HANGUL SYLLABLE TIKEUT WA RIEULKIYEOK +0x89AD 0xB3EA #HANGUL SYLLABLE TIKEUT WA RIEULMIEUM +0x89AE 0xB3EB #HANGUL SYLLABLE TIKEUT WA RIEULPIEUP +0x89AF 0xB3EC #HANGUL SYLLABLE TIKEUT WA RIEULSIOS +0x89B0 0xB3ED #HANGUL SYLLABLE TIKEUT WA RIEULTHIEUTH +0x89B1 0xB3EE #HANGUL SYLLABLE TIKEUT WA RIEULPHIEUPH +0x89B2 0xB3EF #HANGUL SYLLABLE TIKEUT WA RIEULHIEUH +0x89B3 0xB3F0 #HANGUL SYLLABLE TIKEUT WA MIEUM +0x89B4 0xB3F1 #HANGUL SYLLABLE TIKEUT WA PIEUP +0x89B5 0xB3F2 #HANGUL SYLLABLE TIKEUT WA PIEUPSIOS +0x89B6 0xB3F3 #HANGUL SYLLABLE TIKEUT WA SIOS +0x89B7 0xB3F4 #HANGUL SYLLABLE TIKEUT WA SSANGSIOS +0x89B8 0xB3F5 #HANGUL SYLLABLE TIKEUT WA IEUNG +0x89B9 0xB3F6 #HANGUL SYLLABLE TIKEUT WA CIEUC +0x89BA 0xB3F7 #HANGUL SYLLABLE TIKEUT WA CHIEUCH +0x89BB 0xB3F8 #HANGUL SYLLABLE TIKEUT WA KHIEUKH +0x89BC 0xB3F9 #HANGUL SYLLABLE TIKEUT WA THIEUTH +0x89BD 0xB3FA #HANGUL SYLLABLE TIKEUT WA PHIEUPH +0x89BE 0xB3FB #HANGUL SYLLABLE TIKEUT WA HIEUH +0x89BF 0xB3FD #HANGUL SYLLABLE TIKEUT WAE KIYEOK +0x89C0 0xB3FE #HANGUL SYLLABLE TIKEUT WAE SSANGKIYEOK +0x89C1 0xB3FF #HANGUL SYLLABLE TIKEUT WAE KIYEOKSIOS +0x89C2 0xB400 #HANGUL SYLLABLE TIKEUT WAE NIEUN +0x89C3 0xB401 #HANGUL SYLLABLE TIKEUT WAE NIEUNCIEUC +0x89C4 0xB402 #HANGUL SYLLABLE TIKEUT WAE NIEUNHIEUH +0x89C5 0xB403 #HANGUL SYLLABLE TIKEUT WAE TIKEUT +0x89C6 0xB404 #HANGUL SYLLABLE TIKEUT WAE RIEUL +0x89C7 0xB405 #HANGUL SYLLABLE TIKEUT WAE RIEULKIYEOK +0x89C8 0xB406 #HANGUL SYLLABLE TIKEUT WAE RIEULMIEUM +0x89C9 0xB407 #HANGUL SYLLABLE TIKEUT WAE RIEULPIEUP +0x89CA 0xB408 #HANGUL SYLLABLE TIKEUT WAE RIEULSIOS +0x89CB 0xB409 #HANGUL SYLLABLE TIKEUT WAE RIEULTHIEUTH +0x89CC 0xB40A #HANGUL SYLLABLE TIKEUT WAE RIEULPHIEUPH +0x89CD 0xB40B #HANGUL SYLLABLE TIKEUT WAE RIEULHIEUH +0x89CE 0xB40C #HANGUL SYLLABLE TIKEUT WAE MIEUM +0x89CF 0xB40D #HANGUL SYLLABLE TIKEUT WAE PIEUP +0x89D0 0xB40E #HANGUL SYLLABLE TIKEUT WAE PIEUPSIOS +0x89D1 0xB40F #HANGUL SYLLABLE TIKEUT WAE SIOS +0x89D2 0xB411 #HANGUL SYLLABLE TIKEUT WAE IEUNG +0x89D3 0xB412 #HANGUL SYLLABLE TIKEUT WAE CIEUC +0x89D4 0xB413 #HANGUL SYLLABLE TIKEUT WAE CHIEUCH +0x89D5 0xB414 #HANGUL SYLLABLE TIKEUT WAE KHIEUKH +0x89D6 0xB415 #HANGUL SYLLABLE TIKEUT WAE THIEUTH +0x89D7 0xB416 #HANGUL SYLLABLE TIKEUT WAE PHIEUPH +0x89D8 0xB417 #HANGUL SYLLABLE TIKEUT WAE HIEUH +0x89D9 0xB419 #HANGUL SYLLABLE TIKEUT OE KIYEOK +0x89DA 0xB41A #HANGUL SYLLABLE TIKEUT OE SSANGKIYEOK +0x89DB 0xB41B #HANGUL SYLLABLE TIKEUT OE KIYEOKSIOS +0x89DC 0xB41D #HANGUL SYLLABLE TIKEUT OE NIEUNCIEUC +0x89DD 0xB41E #HANGUL SYLLABLE TIKEUT OE NIEUNHIEUH +0x89DE 0xB41F #HANGUL SYLLABLE TIKEUT OE TIKEUT +0x89DF 0xB421 #HANGUL SYLLABLE TIKEUT OE RIEULKIYEOK +0x89E0 0xB422 #HANGUL SYLLABLE TIKEUT OE RIEULMIEUM +0x89E1 0xB423 #HANGUL SYLLABLE TIKEUT OE RIEULPIEUP +0x89E2 0xB424 #HANGUL SYLLABLE TIKEUT OE RIEULSIOS +0x89E3 0xB425 #HANGUL SYLLABLE TIKEUT OE RIEULTHIEUTH +0x89E4 0xB426 #HANGUL SYLLABLE TIKEUT OE RIEULPHIEUPH +0x89E5 0xB427 #HANGUL SYLLABLE TIKEUT OE RIEULHIEUH +0x89E6 0xB42A #HANGUL SYLLABLE TIKEUT OE PIEUPSIOS +0x89E7 0xB42C #HANGUL SYLLABLE TIKEUT OE SSANGSIOS +0x89E8 0xB42D #HANGUL SYLLABLE TIKEUT OE IEUNG +0x89E9 0xB42E #HANGUL SYLLABLE TIKEUT OE CIEUC +0x89EA 0xB42F #HANGUL SYLLABLE TIKEUT OE CHIEUCH +0x89EB 0xB430 #HANGUL SYLLABLE TIKEUT OE KHIEUKH +0x89EC 0xB431 #HANGUL SYLLABLE TIKEUT OE THIEUTH +0x89ED 0xB432 #HANGUL SYLLABLE TIKEUT OE PHIEUPH +0x89EE 0xB433 #HANGUL SYLLABLE TIKEUT OE HIEUH +0x89EF 0xB435 #HANGUL SYLLABLE TIKEUT YO KIYEOK +0x89F0 0xB436 #HANGUL SYLLABLE TIKEUT YO SSANGKIYEOK +0x89F1 0xB437 #HANGUL SYLLABLE TIKEUT YO KIYEOKSIOS +0x89F2 0xB438 #HANGUL SYLLABLE TIKEUT YO NIEUN +0x89F3 0xB439 #HANGUL SYLLABLE TIKEUT YO NIEUNCIEUC +0x89F4 0xB43A #HANGUL SYLLABLE TIKEUT YO NIEUNHIEUH +0x89F5 0xB43B #HANGUL SYLLABLE TIKEUT YO TIKEUT +0x89F6 0xB43C #HANGUL SYLLABLE TIKEUT YO RIEUL +0x89F7 0xB43D #HANGUL SYLLABLE TIKEUT YO RIEULKIYEOK +0x89F8 0xB43E #HANGUL SYLLABLE TIKEUT YO RIEULMIEUM +0x89F9 0xB43F #HANGUL SYLLABLE TIKEUT YO RIEULPIEUP +0x89FA 0xB440 #HANGUL SYLLABLE TIKEUT YO RIEULSIOS +0x89FB 0xB441 #HANGUL SYLLABLE TIKEUT YO RIEULTHIEUTH +0x89FC 0xB442 #HANGUL SYLLABLE TIKEUT YO RIEULPHIEUPH +0x89FD 0xB443 #HANGUL SYLLABLE TIKEUT YO RIEULHIEUH +0x89FE 0xB444 #HANGUL SYLLABLE TIKEUT YO MIEUM +0x8A41 0xB445 #HANGUL SYLLABLE TIKEUT YO PIEUP +0x8A42 0xB446 #HANGUL SYLLABLE TIKEUT YO PIEUPSIOS +0x8A43 0xB447 #HANGUL SYLLABLE TIKEUT YO SIOS +0x8A44 0xB448 #HANGUL SYLLABLE TIKEUT YO SSANGSIOS +0x8A45 0xB449 #HANGUL SYLLABLE TIKEUT YO IEUNG +0x8A46 0xB44A #HANGUL SYLLABLE TIKEUT YO CIEUC +0x8A47 0xB44B #HANGUL SYLLABLE TIKEUT YO CHIEUCH +0x8A48 0xB44C #HANGUL SYLLABLE TIKEUT YO KHIEUKH +0x8A49 0xB44D #HANGUL SYLLABLE TIKEUT YO THIEUTH +0x8A4A 0xB44E #HANGUL SYLLABLE TIKEUT YO PHIEUPH +0x8A4B 0xB44F #HANGUL SYLLABLE TIKEUT YO HIEUH +0x8A4C 0xB452 #HANGUL SYLLABLE TIKEUT U SSANGKIYEOK +0x8A4D 0xB453 #HANGUL SYLLABLE TIKEUT U KIYEOKSIOS +0x8A4E 0xB455 #HANGUL SYLLABLE TIKEUT U NIEUNCIEUC +0x8A4F 0xB456 #HANGUL SYLLABLE TIKEUT U NIEUNHIEUH +0x8A50 0xB457 #HANGUL SYLLABLE TIKEUT U TIKEUT +0x8A51 0xB459 #HANGUL SYLLABLE TIKEUT U RIEULKIYEOK +0x8A52 0xB45A #HANGUL SYLLABLE TIKEUT U RIEULMIEUM +0x8A53 0xB45B #HANGUL SYLLABLE TIKEUT U RIEULPIEUP +0x8A54 0xB45C #HANGUL SYLLABLE TIKEUT U RIEULSIOS +0x8A55 0xB45D #HANGUL SYLLABLE TIKEUT U RIEULTHIEUTH +0x8A56 0xB45E #HANGUL SYLLABLE TIKEUT U RIEULPHIEUPH +0x8A57 0xB45F #HANGUL SYLLABLE TIKEUT U RIEULHIEUH +0x8A58 0xB462 #HANGUL SYLLABLE TIKEUT U PIEUPSIOS +0x8A59 0xB464 #HANGUL SYLLABLE TIKEUT U SSANGSIOS +0x8A5A 0xB466 #HANGUL SYLLABLE TIKEUT U CIEUC +0x8A61 0xB467 #HANGUL SYLLABLE TIKEUT U CHIEUCH +0x8A62 0xB468 #HANGUL SYLLABLE TIKEUT U KHIEUKH +0x8A63 0xB469 #HANGUL SYLLABLE TIKEUT U THIEUTH +0x8A64 0xB46A #HANGUL SYLLABLE TIKEUT U PHIEUPH +0x8A65 0xB46B #HANGUL SYLLABLE TIKEUT U HIEUH +0x8A66 0xB46D #HANGUL SYLLABLE TIKEUT WEO KIYEOK +0x8A67 0xB46E #HANGUL SYLLABLE TIKEUT WEO SSANGKIYEOK +0x8A68 0xB46F #HANGUL SYLLABLE TIKEUT WEO KIYEOKSIOS +0x8A69 0xB470 #HANGUL SYLLABLE TIKEUT WEO NIEUN +0x8A6A 0xB471 #HANGUL SYLLABLE TIKEUT WEO NIEUNCIEUC +0x8A6B 0xB472 #HANGUL SYLLABLE TIKEUT WEO NIEUNHIEUH +0x8A6C 0xB473 #HANGUL SYLLABLE TIKEUT WEO TIKEUT +0x8A6D 0xB474 #HANGUL SYLLABLE TIKEUT WEO RIEUL +0x8A6E 0xB475 #HANGUL SYLLABLE TIKEUT WEO RIEULKIYEOK +0x8A6F 0xB476 #HANGUL SYLLABLE TIKEUT WEO RIEULMIEUM +0x8A70 0xB477 #HANGUL SYLLABLE TIKEUT WEO RIEULPIEUP +0x8A71 0xB478 #HANGUL SYLLABLE TIKEUT WEO RIEULSIOS +0x8A72 0xB479 #HANGUL SYLLABLE TIKEUT WEO RIEULTHIEUTH +0x8A73 0xB47A #HANGUL SYLLABLE TIKEUT WEO RIEULPHIEUPH +0x8A74 0xB47B #HANGUL SYLLABLE TIKEUT WEO RIEULHIEUH +0x8A75 0xB47C #HANGUL SYLLABLE TIKEUT WEO MIEUM +0x8A76 0xB47D #HANGUL SYLLABLE TIKEUT WEO PIEUP +0x8A77 0xB47E #HANGUL SYLLABLE TIKEUT WEO PIEUPSIOS +0x8A78 0xB47F #HANGUL SYLLABLE TIKEUT WEO SIOS +0x8A79 0xB481 #HANGUL SYLLABLE TIKEUT WEO IEUNG +0x8A7A 0xB482 #HANGUL SYLLABLE TIKEUT WEO CIEUC +0x8A81 0xB483 #HANGUL SYLLABLE TIKEUT WEO CHIEUCH +0x8A82 0xB484 #HANGUL SYLLABLE TIKEUT WEO KHIEUKH +0x8A83 0xB485 #HANGUL SYLLABLE TIKEUT WEO THIEUTH +0x8A84 0xB486 #HANGUL SYLLABLE TIKEUT WEO PHIEUPH +0x8A85 0xB487 #HANGUL SYLLABLE TIKEUT WEO HIEUH +0x8A86 0xB489 #HANGUL SYLLABLE TIKEUT WE KIYEOK +0x8A87 0xB48A #HANGUL SYLLABLE TIKEUT WE SSANGKIYEOK +0x8A88 0xB48B #HANGUL SYLLABLE TIKEUT WE KIYEOKSIOS +0x8A89 0xB48C #HANGUL SYLLABLE TIKEUT WE NIEUN +0x8A8A 0xB48D #HANGUL SYLLABLE TIKEUT WE NIEUNCIEUC +0x8A8B 0xB48E #HANGUL SYLLABLE TIKEUT WE NIEUNHIEUH +0x8A8C 0xB48F #HANGUL SYLLABLE TIKEUT WE TIKEUT +0x8A8D 0xB490 #HANGUL SYLLABLE TIKEUT WE RIEUL +0x8A8E 0xB491 #HANGUL SYLLABLE TIKEUT WE RIEULKIYEOK +0x8A8F 0xB492 #HANGUL SYLLABLE TIKEUT WE RIEULMIEUM +0x8A90 0xB493 #HANGUL SYLLABLE TIKEUT WE RIEULPIEUP +0x8A91 0xB494 #HANGUL SYLLABLE TIKEUT WE RIEULSIOS +0x8A92 0xB495 #HANGUL SYLLABLE TIKEUT WE RIEULTHIEUTH +0x8A93 0xB496 #HANGUL SYLLABLE TIKEUT WE RIEULPHIEUPH +0x8A94 0xB497 #HANGUL SYLLABLE TIKEUT WE RIEULHIEUH +0x8A95 0xB498 #HANGUL SYLLABLE TIKEUT WE MIEUM +0x8A96 0xB499 #HANGUL SYLLABLE TIKEUT WE PIEUP +0x8A97 0xB49A #HANGUL SYLLABLE TIKEUT WE PIEUPSIOS +0x8A98 0xB49B #HANGUL SYLLABLE TIKEUT WE SIOS +0x8A99 0xB49C #HANGUL SYLLABLE TIKEUT WE SSANGSIOS +0x8A9A 0xB49E #HANGUL SYLLABLE TIKEUT WE CIEUC +0x8A9B 0xB49F #HANGUL SYLLABLE TIKEUT WE CHIEUCH +0x8A9C 0xB4A0 #HANGUL SYLLABLE TIKEUT WE KHIEUKH +0x8A9D 0xB4A1 #HANGUL SYLLABLE TIKEUT WE THIEUTH +0x8A9E 0xB4A2 #HANGUL SYLLABLE TIKEUT WE PHIEUPH +0x8A9F 0xB4A3 #HANGUL SYLLABLE TIKEUT WE HIEUH +0x8AA0 0xB4A5 #HANGUL SYLLABLE TIKEUT WI KIYEOK +0x8AA1 0xB4A6 #HANGUL SYLLABLE TIKEUT WI SSANGKIYEOK +0x8AA2 0xB4A7 #HANGUL SYLLABLE TIKEUT WI KIYEOKSIOS +0x8AA3 0xB4A9 #HANGUL SYLLABLE TIKEUT WI NIEUNCIEUC +0x8AA4 0xB4AA #HANGUL SYLLABLE TIKEUT WI NIEUNHIEUH +0x8AA5 0xB4AB #HANGUL SYLLABLE TIKEUT WI TIKEUT +0x8AA6 0xB4AD #HANGUL SYLLABLE TIKEUT WI RIEULKIYEOK +0x8AA7 0xB4AE #HANGUL SYLLABLE TIKEUT WI RIEULMIEUM +0x8AA8 0xB4AF #HANGUL SYLLABLE TIKEUT WI RIEULPIEUP +0x8AA9 0xB4B0 #HANGUL SYLLABLE TIKEUT WI RIEULSIOS +0x8AAA 0xB4B1 #HANGUL SYLLABLE TIKEUT WI RIEULTHIEUTH +0x8AAB 0xB4B2 #HANGUL SYLLABLE TIKEUT WI RIEULPHIEUPH +0x8AAC 0xB4B3 #HANGUL SYLLABLE TIKEUT WI RIEULHIEUH +0x8AAD 0xB4B4 #HANGUL SYLLABLE TIKEUT WI MIEUM +0x8AAE 0xB4B6 #HANGUL SYLLABLE TIKEUT WI PIEUPSIOS +0x8AAF 0xB4B8 #HANGUL SYLLABLE TIKEUT WI SSANGSIOS +0x8AB0 0xB4BA #HANGUL SYLLABLE TIKEUT WI CIEUC +0x8AB1 0xB4BB #HANGUL SYLLABLE TIKEUT WI CHIEUCH +0x8AB2 0xB4BC #HANGUL SYLLABLE TIKEUT WI KHIEUKH +0x8AB3 0xB4BD #HANGUL SYLLABLE TIKEUT WI THIEUTH +0x8AB4 0xB4BE #HANGUL SYLLABLE TIKEUT WI PHIEUPH +0x8AB5 0xB4BF #HANGUL SYLLABLE TIKEUT WI HIEUH +0x8AB6 0xB4C1 #HANGUL SYLLABLE TIKEUT YU KIYEOK +0x8AB7 0xB4C2 #HANGUL SYLLABLE TIKEUT YU SSANGKIYEOK +0x8AB8 0xB4C3 #HANGUL SYLLABLE TIKEUT YU KIYEOKSIOS +0x8AB9 0xB4C5 #HANGUL SYLLABLE TIKEUT YU NIEUNCIEUC +0x8ABA 0xB4C6 #HANGUL SYLLABLE TIKEUT YU NIEUNHIEUH +0x8ABB 0xB4C7 #HANGUL SYLLABLE TIKEUT YU TIKEUT +0x8ABC 0xB4C9 #HANGUL SYLLABLE TIKEUT YU RIEULKIYEOK +0x8ABD 0xB4CA #HANGUL SYLLABLE TIKEUT YU RIEULMIEUM +0x8ABE 0xB4CB #HANGUL SYLLABLE TIKEUT YU RIEULPIEUP +0x8ABF 0xB4CC #HANGUL SYLLABLE TIKEUT YU RIEULSIOS +0x8AC0 0xB4CD #HANGUL SYLLABLE TIKEUT YU RIEULTHIEUTH +0x8AC1 0xB4CE #HANGUL SYLLABLE TIKEUT YU RIEULPHIEUPH +0x8AC2 0xB4CF #HANGUL SYLLABLE TIKEUT YU RIEULHIEUH +0x8AC3 0xB4D1 #HANGUL SYLLABLE TIKEUT YU PIEUP +0x8AC4 0xB4D2 #HANGUL SYLLABLE TIKEUT YU PIEUPSIOS +0x8AC5 0xB4D3 #HANGUL SYLLABLE TIKEUT YU SIOS +0x8AC6 0xB4D4 #HANGUL SYLLABLE TIKEUT YU SSANGSIOS +0x8AC7 0xB4D6 #HANGUL SYLLABLE TIKEUT YU CIEUC +0x8AC8 0xB4D7 #HANGUL SYLLABLE TIKEUT YU CHIEUCH +0x8AC9 0xB4D8 #HANGUL SYLLABLE TIKEUT YU KHIEUKH +0x8ACA 0xB4D9 #HANGUL SYLLABLE TIKEUT YU THIEUTH +0x8ACB 0xB4DA #HANGUL SYLLABLE TIKEUT YU PHIEUPH +0x8ACC 0xB4DB #HANGUL SYLLABLE TIKEUT YU HIEUH +0x8ACD 0xB4DE #HANGUL SYLLABLE TIKEUT EU SSANGKIYEOK +0x8ACE 0xB4DF #HANGUL SYLLABLE TIKEUT EU KIYEOKSIOS +0x8ACF 0xB4E1 #HANGUL SYLLABLE TIKEUT EU NIEUNCIEUC +0x8AD0 0xB4E2 #HANGUL SYLLABLE TIKEUT EU NIEUNHIEUH +0x8AD1 0xB4E5 #HANGUL SYLLABLE TIKEUT EU RIEULKIYEOK +0x8AD2 0xB4E7 #HANGUL SYLLABLE TIKEUT EU RIEULPIEUP +0x8AD3 0xB4E8 #HANGUL SYLLABLE TIKEUT EU RIEULSIOS +0x8AD4 0xB4E9 #HANGUL SYLLABLE TIKEUT EU RIEULTHIEUTH +0x8AD5 0xB4EA #HANGUL SYLLABLE TIKEUT EU RIEULPHIEUPH +0x8AD6 0xB4EB #HANGUL SYLLABLE TIKEUT EU RIEULHIEUH +0x8AD7 0xB4EE #HANGUL SYLLABLE TIKEUT EU PIEUPSIOS +0x8AD8 0xB4F0 #HANGUL SYLLABLE TIKEUT EU SSANGSIOS +0x8AD9 0xB4F2 #HANGUL SYLLABLE TIKEUT EU CIEUC +0x8ADA 0xB4F3 #HANGUL SYLLABLE TIKEUT EU CHIEUCH +0x8ADB 0xB4F4 #HANGUL SYLLABLE TIKEUT EU KHIEUKH +0x8ADC 0xB4F5 #HANGUL SYLLABLE TIKEUT EU THIEUTH +0x8ADD 0xB4F6 #HANGUL SYLLABLE TIKEUT EU PHIEUPH +0x8ADE 0xB4F7 #HANGUL SYLLABLE TIKEUT EU HIEUH +0x8ADF 0xB4F9 #HANGUL SYLLABLE TIKEUT YI KIYEOK +0x8AE0 0xB4FA #HANGUL SYLLABLE TIKEUT YI SSANGKIYEOK +0x8AE1 0xB4FB #HANGUL SYLLABLE TIKEUT YI KIYEOKSIOS +0x8AE2 0xB4FC #HANGUL SYLLABLE TIKEUT YI NIEUN +0x8AE3 0xB4FD #HANGUL SYLLABLE TIKEUT YI NIEUNCIEUC +0x8AE4 0xB4FE #HANGUL SYLLABLE TIKEUT YI NIEUNHIEUH +0x8AE5 0xB4FF #HANGUL SYLLABLE TIKEUT YI TIKEUT +0x8AE6 0xB500 #HANGUL SYLLABLE TIKEUT YI RIEUL +0x8AE7 0xB501 #HANGUL SYLLABLE TIKEUT YI RIEULKIYEOK +0x8AE8 0xB502 #HANGUL SYLLABLE TIKEUT YI RIEULMIEUM +0x8AE9 0xB503 #HANGUL SYLLABLE TIKEUT YI RIEULPIEUP +0x8AEA 0xB504 #HANGUL SYLLABLE TIKEUT YI RIEULSIOS +0x8AEB 0xB505 #HANGUL SYLLABLE TIKEUT YI RIEULTHIEUTH +0x8AEC 0xB506 #HANGUL SYLLABLE TIKEUT YI RIEULPHIEUPH +0x8AED 0xB507 #HANGUL SYLLABLE TIKEUT YI RIEULHIEUH +0x8AEE 0xB508 #HANGUL SYLLABLE TIKEUT YI MIEUM +0x8AEF 0xB509 #HANGUL SYLLABLE TIKEUT YI PIEUP +0x8AF0 0xB50A #HANGUL SYLLABLE TIKEUT YI PIEUPSIOS +0x8AF1 0xB50B #HANGUL SYLLABLE TIKEUT YI SIOS +0x8AF2 0xB50C #HANGUL SYLLABLE TIKEUT YI SSANGSIOS +0x8AF3 0xB50D #HANGUL SYLLABLE TIKEUT YI IEUNG +0x8AF4 0xB50E #HANGUL SYLLABLE TIKEUT YI CIEUC +0x8AF5 0xB50F #HANGUL SYLLABLE TIKEUT YI CHIEUCH +0x8AF6 0xB510 #HANGUL SYLLABLE TIKEUT YI KHIEUKH +0x8AF7 0xB511 #HANGUL SYLLABLE TIKEUT YI THIEUTH +0x8AF8 0xB512 #HANGUL SYLLABLE TIKEUT YI PHIEUPH +0x8AF9 0xB513 #HANGUL SYLLABLE TIKEUT YI HIEUH +0x8AFA 0xB516 #HANGUL SYLLABLE TIKEUT I SSANGKIYEOK +0x8AFB 0xB517 #HANGUL SYLLABLE TIKEUT I KIYEOKSIOS +0x8AFC 0xB519 #HANGUL SYLLABLE TIKEUT I NIEUNCIEUC +0x8AFD 0xB51A #HANGUL SYLLABLE TIKEUT I NIEUNHIEUH +0x8AFE 0xB51D #HANGUL SYLLABLE TIKEUT I RIEULKIYEOK +0x8B41 0xB51E #HANGUL SYLLABLE TIKEUT I RIEULMIEUM +0x8B42 0xB51F #HANGUL SYLLABLE TIKEUT I RIEULPIEUP +0x8B43 0xB520 #HANGUL SYLLABLE TIKEUT I RIEULSIOS +0x8B44 0xB521 #HANGUL SYLLABLE TIKEUT I RIEULTHIEUTH +0x8B45 0xB522 #HANGUL SYLLABLE TIKEUT I RIEULPHIEUPH +0x8B46 0xB523 #HANGUL SYLLABLE TIKEUT I RIEULHIEUH +0x8B47 0xB526 #HANGUL SYLLABLE TIKEUT I PIEUPSIOS +0x8B48 0xB52B #HANGUL SYLLABLE TIKEUT I CHIEUCH +0x8B49 0xB52C #HANGUL SYLLABLE TIKEUT I KHIEUKH +0x8B4A 0xB52D #HANGUL SYLLABLE TIKEUT I THIEUTH +0x8B4B 0xB52E #HANGUL SYLLABLE TIKEUT I PHIEUPH +0x8B4C 0xB52F #HANGUL SYLLABLE TIKEUT I HIEUH +0x8B4D 0xB532 #HANGUL SYLLABLE SSANGTIKEUT A SSANGKIYEOK +0x8B4E 0xB533 #HANGUL SYLLABLE SSANGTIKEUT A KIYEOKSIOS +0x8B4F 0xB535 #HANGUL SYLLABLE SSANGTIKEUT A NIEUNCIEUC +0x8B50 0xB536 #HANGUL SYLLABLE SSANGTIKEUT A NIEUNHIEUH +0x8B51 0xB537 #HANGUL SYLLABLE SSANGTIKEUT A TIKEUT +0x8B52 0xB539 #HANGUL SYLLABLE SSANGTIKEUT A RIEULKIYEOK +0x8B53 0xB53A #HANGUL SYLLABLE SSANGTIKEUT A RIEULMIEUM +0x8B54 0xB53B #HANGUL SYLLABLE SSANGTIKEUT A RIEULPIEUP +0x8B55 0xB53C #HANGUL SYLLABLE SSANGTIKEUT A RIEULSIOS +0x8B56 0xB53D #HANGUL SYLLABLE SSANGTIKEUT A RIEULTHIEUTH +0x8B57 0xB53E #HANGUL SYLLABLE SSANGTIKEUT A RIEULPHIEUPH +0x8B58 0xB53F #HANGUL SYLLABLE SSANGTIKEUT A RIEULHIEUH +0x8B59 0xB542 #HANGUL SYLLABLE SSANGTIKEUT A PIEUPSIOS +0x8B5A 0xB546 #HANGUL SYLLABLE SSANGTIKEUT A CIEUC +0x8B61 0xB547 #HANGUL SYLLABLE SSANGTIKEUT A CHIEUCH +0x8B62 0xB548 #HANGUL SYLLABLE SSANGTIKEUT A KHIEUKH +0x8B63 0xB549 #HANGUL SYLLABLE SSANGTIKEUT A THIEUTH +0x8B64 0xB54A #HANGUL SYLLABLE SSANGTIKEUT A PHIEUPH +0x8B65 0xB54E #HANGUL SYLLABLE SSANGTIKEUT AE SSANGKIYEOK +0x8B66 0xB54F #HANGUL SYLLABLE SSANGTIKEUT AE KIYEOKSIOS +0x8B67 0xB551 #HANGUL SYLLABLE SSANGTIKEUT AE NIEUNCIEUC +0x8B68 0xB552 #HANGUL SYLLABLE SSANGTIKEUT AE NIEUNHIEUH +0x8B69 0xB553 #HANGUL SYLLABLE SSANGTIKEUT AE TIKEUT +0x8B6A 0xB555 #HANGUL SYLLABLE SSANGTIKEUT AE RIEULKIYEOK +0x8B6B 0xB556 #HANGUL SYLLABLE SSANGTIKEUT AE RIEULMIEUM +0x8B6C 0xB557 #HANGUL SYLLABLE SSANGTIKEUT AE RIEULPIEUP +0x8B6D 0xB558 #HANGUL SYLLABLE SSANGTIKEUT AE RIEULSIOS +0x8B6E 0xB559 #HANGUL SYLLABLE SSANGTIKEUT AE RIEULTHIEUTH +0x8B6F 0xB55A #HANGUL SYLLABLE SSANGTIKEUT AE RIEULPHIEUPH +0x8B70 0xB55B #HANGUL SYLLABLE SSANGTIKEUT AE RIEULHIEUH +0x8B71 0xB55E #HANGUL SYLLABLE SSANGTIKEUT AE PIEUPSIOS +0x8B72 0xB562 #HANGUL SYLLABLE SSANGTIKEUT AE CIEUC +0x8B73 0xB563 #HANGUL SYLLABLE SSANGTIKEUT AE CHIEUCH +0x8B74 0xB564 #HANGUL SYLLABLE SSANGTIKEUT AE KHIEUKH +0x8B75 0xB565 #HANGUL SYLLABLE SSANGTIKEUT AE THIEUTH +0x8B76 0xB566 #HANGUL SYLLABLE SSANGTIKEUT AE PHIEUPH +0x8B77 0xB567 #HANGUL SYLLABLE SSANGTIKEUT AE HIEUH +0x8B78 0xB568 #HANGUL SYLLABLE SSANGTIKEUT YA +0x8B79 0xB569 #HANGUL SYLLABLE SSANGTIKEUT YA KIYEOK +0x8B7A 0xB56A #HANGUL SYLLABLE SSANGTIKEUT YA SSANGKIYEOK +0x8B81 0xB56B #HANGUL SYLLABLE SSANGTIKEUT YA KIYEOKSIOS +0x8B82 0xB56C #HANGUL SYLLABLE SSANGTIKEUT YA NIEUN +0x8B83 0xB56D #HANGUL SYLLABLE SSANGTIKEUT YA NIEUNCIEUC +0x8B84 0xB56E #HANGUL SYLLABLE SSANGTIKEUT YA NIEUNHIEUH +0x8B85 0xB56F #HANGUL SYLLABLE SSANGTIKEUT YA TIKEUT +0x8B86 0xB570 #HANGUL SYLLABLE SSANGTIKEUT YA RIEUL +0x8B87 0xB571 #HANGUL SYLLABLE SSANGTIKEUT YA RIEULKIYEOK +0x8B88 0xB572 #HANGUL SYLLABLE SSANGTIKEUT YA RIEULMIEUM +0x8B89 0xB573 #HANGUL SYLLABLE SSANGTIKEUT YA RIEULPIEUP +0x8B8A 0xB574 #HANGUL SYLLABLE SSANGTIKEUT YA RIEULSIOS +0x8B8B 0xB575 #HANGUL SYLLABLE SSANGTIKEUT YA RIEULTHIEUTH +0x8B8C 0xB576 #HANGUL SYLLABLE SSANGTIKEUT YA RIEULPHIEUPH +0x8B8D 0xB577 #HANGUL SYLLABLE SSANGTIKEUT YA RIEULHIEUH +0x8B8E 0xB578 #HANGUL SYLLABLE SSANGTIKEUT YA MIEUM +0x8B8F 0xB579 #HANGUL SYLLABLE SSANGTIKEUT YA PIEUP +0x8B90 0xB57A #HANGUL SYLLABLE SSANGTIKEUT YA PIEUPSIOS +0x8B91 0xB57B #HANGUL SYLLABLE SSANGTIKEUT YA SIOS +0x8B92 0xB57C #HANGUL SYLLABLE SSANGTIKEUT YA SSANGSIOS +0x8B93 0xB57D #HANGUL SYLLABLE SSANGTIKEUT YA IEUNG +0x8B94 0xB57E #HANGUL SYLLABLE SSANGTIKEUT YA CIEUC +0x8B95 0xB57F #HANGUL SYLLABLE SSANGTIKEUT YA CHIEUCH +0x8B96 0xB580 #HANGUL SYLLABLE SSANGTIKEUT YA KHIEUKH +0x8B97 0xB581 #HANGUL SYLLABLE SSANGTIKEUT YA THIEUTH +0x8B98 0xB582 #HANGUL SYLLABLE SSANGTIKEUT YA PHIEUPH +0x8B99 0xB583 #HANGUL SYLLABLE SSANGTIKEUT YA HIEUH +0x8B9A 0xB584 #HANGUL SYLLABLE SSANGTIKEUT YAE +0x8B9B 0xB585 #HANGUL SYLLABLE SSANGTIKEUT YAE KIYEOK +0x8B9C 0xB586 #HANGUL SYLLABLE SSANGTIKEUT YAE SSANGKIYEOK +0x8B9D 0xB587 #HANGUL SYLLABLE SSANGTIKEUT YAE KIYEOKSIOS +0x8B9E 0xB588 #HANGUL SYLLABLE SSANGTIKEUT YAE NIEUN +0x8B9F 0xB589 #HANGUL SYLLABLE SSANGTIKEUT YAE NIEUNCIEUC +0x8BA0 0xB58A #HANGUL SYLLABLE SSANGTIKEUT YAE NIEUNHIEUH +0x8BA1 0xB58B #HANGUL SYLLABLE SSANGTIKEUT YAE TIKEUT +0x8BA2 0xB58C #HANGUL SYLLABLE SSANGTIKEUT YAE RIEUL +0x8BA3 0xB58D #HANGUL SYLLABLE SSANGTIKEUT YAE RIEULKIYEOK +0x8BA4 0xB58E #HANGUL SYLLABLE SSANGTIKEUT YAE RIEULMIEUM +0x8BA5 0xB58F #HANGUL SYLLABLE SSANGTIKEUT YAE RIEULPIEUP +0x8BA6 0xB590 #HANGUL SYLLABLE SSANGTIKEUT YAE RIEULSIOS +0x8BA7 0xB591 #HANGUL SYLLABLE SSANGTIKEUT YAE RIEULTHIEUTH +0x8BA8 0xB592 #HANGUL SYLLABLE SSANGTIKEUT YAE RIEULPHIEUPH +0x8BA9 0xB593 #HANGUL SYLLABLE SSANGTIKEUT YAE RIEULHIEUH +0x8BAA 0xB594 #HANGUL SYLLABLE SSANGTIKEUT YAE MIEUM +0x8BAB 0xB595 #HANGUL SYLLABLE SSANGTIKEUT YAE PIEUP +0x8BAC 0xB596 #HANGUL SYLLABLE SSANGTIKEUT YAE PIEUPSIOS +0x8BAD 0xB597 #HANGUL SYLLABLE SSANGTIKEUT YAE SIOS +0x8BAE 0xB598 #HANGUL SYLLABLE SSANGTIKEUT YAE SSANGSIOS +0x8BAF 0xB599 #HANGUL SYLLABLE SSANGTIKEUT YAE IEUNG +0x8BB0 0xB59A #HANGUL SYLLABLE SSANGTIKEUT YAE CIEUC +0x8BB1 0xB59B #HANGUL SYLLABLE SSANGTIKEUT YAE CHIEUCH +0x8BB2 0xB59C #HANGUL SYLLABLE SSANGTIKEUT YAE KHIEUKH +0x8BB3 0xB59D #HANGUL SYLLABLE SSANGTIKEUT YAE THIEUTH +0x8BB4 0xB59E #HANGUL SYLLABLE SSANGTIKEUT YAE PHIEUPH +0x8BB5 0xB59F #HANGUL SYLLABLE SSANGTIKEUT YAE HIEUH +0x8BB6 0xB5A2 #HANGUL SYLLABLE SSANGTIKEUT EO SSANGKIYEOK +0x8BB7 0xB5A3 #HANGUL SYLLABLE SSANGTIKEUT EO KIYEOKSIOS +0x8BB8 0xB5A5 #HANGUL SYLLABLE SSANGTIKEUT EO NIEUNCIEUC +0x8BB9 0xB5A6 #HANGUL SYLLABLE SSANGTIKEUT EO NIEUNHIEUH +0x8BBA 0xB5A7 #HANGUL SYLLABLE SSANGTIKEUT EO TIKEUT +0x8BBB 0xB5A9 #HANGUL SYLLABLE SSANGTIKEUT EO RIEULKIYEOK +0x8BBC 0xB5AC #HANGUL SYLLABLE SSANGTIKEUT EO RIEULSIOS +0x8BBD 0xB5AD #HANGUL SYLLABLE SSANGTIKEUT EO RIEULTHIEUTH +0x8BBE 0xB5AE #HANGUL SYLLABLE SSANGTIKEUT EO RIEULPHIEUPH +0x8BBF 0xB5AF #HANGUL SYLLABLE SSANGTIKEUT EO RIEULHIEUH +0x8BC0 0xB5B2 #HANGUL SYLLABLE SSANGTIKEUT EO PIEUPSIOS +0x8BC1 0xB5B6 #HANGUL SYLLABLE SSANGTIKEUT EO CIEUC +0x8BC2 0xB5B7 #HANGUL SYLLABLE SSANGTIKEUT EO CHIEUCH +0x8BC3 0xB5B8 #HANGUL SYLLABLE SSANGTIKEUT EO KHIEUKH +0x8BC4 0xB5B9 #HANGUL SYLLABLE SSANGTIKEUT EO THIEUTH +0x8BC5 0xB5BA #HANGUL SYLLABLE SSANGTIKEUT EO PHIEUPH +0x8BC6 0xB5BE #HANGUL SYLLABLE SSANGTIKEUT E SSANGKIYEOK +0x8BC7 0xB5BF #HANGUL SYLLABLE SSANGTIKEUT E KIYEOKSIOS +0x8BC8 0xB5C1 #HANGUL SYLLABLE SSANGTIKEUT E NIEUNCIEUC +0x8BC9 0xB5C2 #HANGUL SYLLABLE SSANGTIKEUT E NIEUNHIEUH +0x8BCA 0xB5C3 #HANGUL SYLLABLE SSANGTIKEUT E TIKEUT +0x8BCB 0xB5C5 #HANGUL SYLLABLE SSANGTIKEUT E RIEULKIYEOK +0x8BCC 0xB5C6 #HANGUL SYLLABLE SSANGTIKEUT E RIEULMIEUM +0x8BCD 0xB5C7 #HANGUL SYLLABLE SSANGTIKEUT E RIEULPIEUP +0x8BCE 0xB5C8 #HANGUL SYLLABLE SSANGTIKEUT E RIEULSIOS +0x8BCF 0xB5C9 #HANGUL SYLLABLE SSANGTIKEUT E RIEULTHIEUTH +0x8BD0 0xB5CA #HANGUL SYLLABLE SSANGTIKEUT E RIEULPHIEUPH +0x8BD1 0xB5CB #HANGUL SYLLABLE SSANGTIKEUT E RIEULHIEUH +0x8BD2 0xB5CE #HANGUL SYLLABLE SSANGTIKEUT E PIEUPSIOS +0x8BD3 0xB5D2 #HANGUL SYLLABLE SSANGTIKEUT E CIEUC +0x8BD4 0xB5D3 #HANGUL SYLLABLE SSANGTIKEUT E CHIEUCH +0x8BD5 0xB5D4 #HANGUL SYLLABLE SSANGTIKEUT E KHIEUKH +0x8BD6 0xB5D5 #HANGUL SYLLABLE SSANGTIKEUT E THIEUTH +0x8BD7 0xB5D6 #HANGUL SYLLABLE SSANGTIKEUT E PHIEUPH +0x8BD8 0xB5D7 #HANGUL SYLLABLE SSANGTIKEUT E HIEUH +0x8BD9 0xB5D9 #HANGUL SYLLABLE SSANGTIKEUT YEO KIYEOK +0x8BDA 0xB5DA #HANGUL SYLLABLE SSANGTIKEUT YEO SSANGKIYEOK +0x8BDB 0xB5DB #HANGUL SYLLABLE SSANGTIKEUT YEO KIYEOKSIOS +0x8BDC 0xB5DC #HANGUL SYLLABLE SSANGTIKEUT YEO NIEUN +0x8BDD 0xB5DD #HANGUL SYLLABLE SSANGTIKEUT YEO NIEUNCIEUC +0x8BDE 0xB5DE #HANGUL SYLLABLE SSANGTIKEUT YEO NIEUNHIEUH +0x8BDF 0xB5DF #HANGUL SYLLABLE SSANGTIKEUT YEO TIKEUT +0x8BE0 0xB5E0 #HANGUL SYLLABLE SSANGTIKEUT YEO RIEUL +0x8BE1 0xB5E1 #HANGUL SYLLABLE SSANGTIKEUT YEO RIEULKIYEOK +0x8BE2 0xB5E2 #HANGUL SYLLABLE SSANGTIKEUT YEO RIEULMIEUM +0x8BE3 0xB5E3 #HANGUL SYLLABLE SSANGTIKEUT YEO RIEULPIEUP +0x8BE4 0xB5E4 #HANGUL SYLLABLE SSANGTIKEUT YEO RIEULSIOS +0x8BE5 0xB5E5 #HANGUL SYLLABLE SSANGTIKEUT YEO RIEULTHIEUTH +0x8BE6 0xB5E6 #HANGUL SYLLABLE SSANGTIKEUT YEO RIEULPHIEUPH +0x8BE7 0xB5E7 #HANGUL SYLLABLE SSANGTIKEUT YEO RIEULHIEUH +0x8BE8 0xB5E8 #HANGUL SYLLABLE SSANGTIKEUT YEO MIEUM +0x8BE9 0xB5E9 #HANGUL SYLLABLE SSANGTIKEUT YEO PIEUP +0x8BEA 0xB5EA #HANGUL SYLLABLE SSANGTIKEUT YEO PIEUPSIOS +0x8BEB 0xB5EB #HANGUL SYLLABLE SSANGTIKEUT YEO SIOS +0x8BEC 0xB5ED #HANGUL SYLLABLE SSANGTIKEUT YEO IEUNG +0x8BED 0xB5EE #HANGUL SYLLABLE SSANGTIKEUT YEO CIEUC +0x8BEE 0xB5EF #HANGUL SYLLABLE SSANGTIKEUT YEO CHIEUCH +0x8BEF 0xB5F0 #HANGUL SYLLABLE SSANGTIKEUT YEO KHIEUKH +0x8BF0 0xB5F1 #HANGUL SYLLABLE SSANGTIKEUT YEO THIEUTH +0x8BF1 0xB5F2 #HANGUL SYLLABLE SSANGTIKEUT YEO PHIEUPH +0x8BF2 0xB5F3 #HANGUL SYLLABLE SSANGTIKEUT YEO HIEUH +0x8BF3 0xB5F4 #HANGUL SYLLABLE SSANGTIKEUT YE +0x8BF4 0xB5F5 #HANGUL SYLLABLE SSANGTIKEUT YE KIYEOK +0x8BF5 0xB5F6 #HANGUL SYLLABLE SSANGTIKEUT YE SSANGKIYEOK +0x8BF6 0xB5F7 #HANGUL SYLLABLE SSANGTIKEUT YE KIYEOKSIOS +0x8BF7 0xB5F8 #HANGUL SYLLABLE SSANGTIKEUT YE NIEUN +0x8BF8 0xB5F9 #HANGUL SYLLABLE SSANGTIKEUT YE NIEUNCIEUC +0x8BF9 0xB5FA #HANGUL SYLLABLE SSANGTIKEUT YE NIEUNHIEUH +0x8BFA 0xB5FB #HANGUL SYLLABLE SSANGTIKEUT YE TIKEUT +0x8BFB 0xB5FC #HANGUL SYLLABLE SSANGTIKEUT YE RIEUL +0x8BFC 0xB5FD #HANGUL SYLLABLE SSANGTIKEUT YE RIEULKIYEOK +0x8BFD 0xB5FE #HANGUL SYLLABLE SSANGTIKEUT YE RIEULMIEUM +0x8BFE 0xB5FF #HANGUL SYLLABLE SSANGTIKEUT YE RIEULPIEUP +0x8C41 0xB600 #HANGUL SYLLABLE SSANGTIKEUT YE RIEULSIOS +0x8C42 0xB601 #HANGUL SYLLABLE SSANGTIKEUT YE RIEULTHIEUTH +0x8C43 0xB602 #HANGUL SYLLABLE SSANGTIKEUT YE RIEULPHIEUPH +0x8C44 0xB603 #HANGUL SYLLABLE SSANGTIKEUT YE RIEULHIEUH +0x8C45 0xB604 #HANGUL SYLLABLE SSANGTIKEUT YE MIEUM +0x8C46 0xB605 #HANGUL SYLLABLE SSANGTIKEUT YE PIEUP +0x8C47 0xB606 #HANGUL SYLLABLE SSANGTIKEUT YE PIEUPSIOS +0x8C48 0xB607 #HANGUL SYLLABLE SSANGTIKEUT YE SIOS +0x8C49 0xB608 #HANGUL SYLLABLE SSANGTIKEUT YE SSANGSIOS +0x8C4A 0xB609 #HANGUL SYLLABLE SSANGTIKEUT YE IEUNG +0x8C4B 0xB60A #HANGUL SYLLABLE SSANGTIKEUT YE CIEUC +0x8C4C 0xB60B #HANGUL SYLLABLE SSANGTIKEUT YE CHIEUCH +0x8C4D 0xB60C #HANGUL SYLLABLE SSANGTIKEUT YE KHIEUKH +0x8C4E 0xB60D #HANGUL SYLLABLE SSANGTIKEUT YE THIEUTH +0x8C4F 0xB60E #HANGUL SYLLABLE SSANGTIKEUT YE PHIEUPH +0x8C50 0xB60F #HANGUL SYLLABLE SSANGTIKEUT YE HIEUH +0x8C51 0xB612 #HANGUL SYLLABLE SSANGTIKEUT O SSANGKIYEOK +0x8C52 0xB613 #HANGUL SYLLABLE SSANGTIKEUT O KIYEOKSIOS +0x8C53 0xB615 #HANGUL SYLLABLE SSANGTIKEUT O NIEUNCIEUC +0x8C54 0xB616 #HANGUL SYLLABLE SSANGTIKEUT O NIEUNHIEUH +0x8C55 0xB617 #HANGUL SYLLABLE SSANGTIKEUT O TIKEUT +0x8C56 0xB619 #HANGUL SYLLABLE SSANGTIKEUT O RIEULKIYEOK +0x8C57 0xB61A #HANGUL SYLLABLE SSANGTIKEUT O RIEULMIEUM +0x8C58 0xB61B #HANGUL SYLLABLE SSANGTIKEUT O RIEULPIEUP +0x8C59 0xB61C #HANGUL SYLLABLE SSANGTIKEUT O RIEULSIOS +0x8C5A 0xB61D #HANGUL SYLLABLE SSANGTIKEUT O RIEULTHIEUTH +0x8C61 0xB61E #HANGUL SYLLABLE SSANGTIKEUT O RIEULPHIEUPH +0x8C62 0xB61F #HANGUL SYLLABLE SSANGTIKEUT O RIEULHIEUH +0x8C63 0xB620 #HANGUL SYLLABLE SSANGTIKEUT O MIEUM +0x8C64 0xB621 #HANGUL SYLLABLE SSANGTIKEUT O PIEUP +0x8C65 0xB622 #HANGUL SYLLABLE SSANGTIKEUT O PIEUPSIOS +0x8C66 0xB623 #HANGUL SYLLABLE SSANGTIKEUT O SIOS +0x8C67 0xB624 #HANGUL SYLLABLE SSANGTIKEUT O SSANGSIOS +0x8C68 0xB626 #HANGUL SYLLABLE SSANGTIKEUT O CIEUC +0x8C69 0xB627 #HANGUL SYLLABLE SSANGTIKEUT O CHIEUCH +0x8C6A 0xB628 #HANGUL SYLLABLE SSANGTIKEUT O KHIEUKH +0x8C6B 0xB629 #HANGUL SYLLABLE SSANGTIKEUT O THIEUTH +0x8C6C 0xB62A #HANGUL SYLLABLE SSANGTIKEUT O PHIEUPH +0x8C6D 0xB62B #HANGUL SYLLABLE SSANGTIKEUT O HIEUH +0x8C6E 0xB62D #HANGUL SYLLABLE SSANGTIKEUT WA KIYEOK +0x8C6F 0xB62E #HANGUL SYLLABLE SSANGTIKEUT WA SSANGKIYEOK +0x8C70 0xB62F #HANGUL SYLLABLE SSANGTIKEUT WA KIYEOKSIOS +0x8C71 0xB630 #HANGUL SYLLABLE SSANGTIKEUT WA NIEUN +0x8C72 0xB631 #HANGUL SYLLABLE SSANGTIKEUT WA NIEUNCIEUC +0x8C73 0xB632 #HANGUL SYLLABLE SSANGTIKEUT WA NIEUNHIEUH +0x8C74 0xB633 #HANGUL SYLLABLE SSANGTIKEUT WA TIKEUT +0x8C75 0xB635 #HANGUL SYLLABLE SSANGTIKEUT WA RIEULKIYEOK +0x8C76 0xB636 #HANGUL SYLLABLE SSANGTIKEUT WA RIEULMIEUM +0x8C77 0xB637 #HANGUL SYLLABLE SSANGTIKEUT WA RIEULPIEUP +0x8C78 0xB638 #HANGUL SYLLABLE SSANGTIKEUT WA RIEULSIOS +0x8C79 0xB639 #HANGUL SYLLABLE SSANGTIKEUT WA RIEULTHIEUTH +0x8C7A 0xB63A #HANGUL SYLLABLE SSANGTIKEUT WA RIEULPHIEUPH +0x8C81 0xB63B #HANGUL SYLLABLE SSANGTIKEUT WA RIEULHIEUH +0x8C82 0xB63C #HANGUL SYLLABLE SSANGTIKEUT WA MIEUM +0x8C83 0xB63D #HANGUL SYLLABLE SSANGTIKEUT WA PIEUP +0x8C84 0xB63E #HANGUL SYLLABLE SSANGTIKEUT WA PIEUPSIOS +0x8C85 0xB63F #HANGUL SYLLABLE SSANGTIKEUT WA SIOS +0x8C86 0xB640 #HANGUL SYLLABLE SSANGTIKEUT WA SSANGSIOS +0x8C87 0xB641 #HANGUL SYLLABLE SSANGTIKEUT WA IEUNG +0x8C88 0xB642 #HANGUL SYLLABLE SSANGTIKEUT WA CIEUC +0x8C89 0xB643 #HANGUL SYLLABLE SSANGTIKEUT WA CHIEUCH +0x8C8A 0xB644 #HANGUL SYLLABLE SSANGTIKEUT WA KHIEUKH +0x8C8B 0xB645 #HANGUL SYLLABLE SSANGTIKEUT WA THIEUTH +0x8C8C 0xB646 #HANGUL SYLLABLE SSANGTIKEUT WA PHIEUPH +0x8C8D 0xB647 #HANGUL SYLLABLE SSANGTIKEUT WA HIEUH +0x8C8E 0xB649 #HANGUL SYLLABLE SSANGTIKEUT WAE KIYEOK +0x8C8F 0xB64A #HANGUL SYLLABLE SSANGTIKEUT WAE SSANGKIYEOK +0x8C90 0xB64B #HANGUL SYLLABLE SSANGTIKEUT WAE KIYEOKSIOS +0x8C91 0xB64C #HANGUL SYLLABLE SSANGTIKEUT WAE NIEUN +0x8C92 0xB64D #HANGUL SYLLABLE SSANGTIKEUT WAE NIEUNCIEUC +0x8C93 0xB64E #HANGUL SYLLABLE SSANGTIKEUT WAE NIEUNHIEUH +0x8C94 0xB64F #HANGUL SYLLABLE SSANGTIKEUT WAE TIKEUT +0x8C95 0xB650 #HANGUL SYLLABLE SSANGTIKEUT WAE RIEUL +0x8C96 0xB651 #HANGUL SYLLABLE SSANGTIKEUT WAE RIEULKIYEOK +0x8C97 0xB652 #HANGUL SYLLABLE SSANGTIKEUT WAE RIEULMIEUM +0x8C98 0xB653 #HANGUL SYLLABLE SSANGTIKEUT WAE RIEULPIEUP +0x8C99 0xB654 #HANGUL SYLLABLE SSANGTIKEUT WAE RIEULSIOS +0x8C9A 0xB655 #HANGUL SYLLABLE SSANGTIKEUT WAE RIEULTHIEUTH +0x8C9B 0xB656 #HANGUL SYLLABLE SSANGTIKEUT WAE RIEULPHIEUPH +0x8C9C 0xB657 #HANGUL SYLLABLE SSANGTIKEUT WAE RIEULHIEUH +0x8C9D 0xB658 #HANGUL SYLLABLE SSANGTIKEUT WAE MIEUM +0x8C9E 0xB659 #HANGUL SYLLABLE SSANGTIKEUT WAE PIEUP +0x8C9F 0xB65A #HANGUL SYLLABLE SSANGTIKEUT WAE PIEUPSIOS +0x8CA0 0xB65B #HANGUL SYLLABLE SSANGTIKEUT WAE SIOS +0x8CA1 0xB65C #HANGUL SYLLABLE SSANGTIKEUT WAE SSANGSIOS +0x8CA2 0xB65D #HANGUL SYLLABLE SSANGTIKEUT WAE IEUNG +0x8CA3 0xB65E #HANGUL SYLLABLE SSANGTIKEUT WAE CIEUC +0x8CA4 0xB65F #HANGUL SYLLABLE SSANGTIKEUT WAE CHIEUCH +0x8CA5 0xB660 #HANGUL SYLLABLE SSANGTIKEUT WAE KHIEUKH +0x8CA6 0xB661 #HANGUL SYLLABLE SSANGTIKEUT WAE THIEUTH +0x8CA7 0xB662 #HANGUL SYLLABLE SSANGTIKEUT WAE PHIEUPH +0x8CA8 0xB663 #HANGUL SYLLABLE SSANGTIKEUT WAE HIEUH +0x8CA9 0xB665 #HANGUL SYLLABLE SSANGTIKEUT OE KIYEOK +0x8CAA 0xB666 #HANGUL SYLLABLE SSANGTIKEUT OE SSANGKIYEOK +0x8CAB 0xB667 #HANGUL SYLLABLE SSANGTIKEUT OE KIYEOKSIOS +0x8CAC 0xB669 #HANGUL SYLLABLE SSANGTIKEUT OE NIEUNCIEUC +0x8CAD 0xB66A #HANGUL SYLLABLE SSANGTIKEUT OE NIEUNHIEUH +0x8CAE 0xB66B #HANGUL SYLLABLE SSANGTIKEUT OE TIKEUT +0x8CAF 0xB66C #HANGUL SYLLABLE SSANGTIKEUT OE RIEUL +0x8CB0 0xB66D #HANGUL SYLLABLE SSANGTIKEUT OE RIEULKIYEOK +0x8CB1 0xB66E #HANGUL SYLLABLE SSANGTIKEUT OE RIEULMIEUM +0x8CB2 0xB66F #HANGUL SYLLABLE SSANGTIKEUT OE RIEULPIEUP +0x8CB3 0xB670 #HANGUL SYLLABLE SSANGTIKEUT OE RIEULSIOS +0x8CB4 0xB671 #HANGUL SYLLABLE SSANGTIKEUT OE RIEULTHIEUTH +0x8CB5 0xB672 #HANGUL SYLLABLE SSANGTIKEUT OE RIEULPHIEUPH +0x8CB6 0xB673 #HANGUL SYLLABLE SSANGTIKEUT OE RIEULHIEUH +0x8CB7 0xB674 #HANGUL SYLLABLE SSANGTIKEUT OE MIEUM +0x8CB8 0xB675 #HANGUL SYLLABLE SSANGTIKEUT OE PIEUP +0x8CB9 0xB676 #HANGUL SYLLABLE SSANGTIKEUT OE PIEUPSIOS +0x8CBA 0xB677 #HANGUL SYLLABLE SSANGTIKEUT OE SIOS +0x8CBB 0xB678 #HANGUL SYLLABLE SSANGTIKEUT OE SSANGSIOS +0x8CBC 0xB679 #HANGUL SYLLABLE SSANGTIKEUT OE IEUNG +0x8CBD 0xB67A #HANGUL SYLLABLE SSANGTIKEUT OE CIEUC +0x8CBE 0xB67B #HANGUL SYLLABLE SSANGTIKEUT OE CHIEUCH +0x8CBF 0xB67C #HANGUL SYLLABLE SSANGTIKEUT OE KHIEUKH +0x8CC0 0xB67D #HANGUL SYLLABLE SSANGTIKEUT OE THIEUTH +0x8CC1 0xB67E #HANGUL SYLLABLE SSANGTIKEUT OE PHIEUPH +0x8CC2 0xB67F #HANGUL SYLLABLE SSANGTIKEUT OE HIEUH +0x8CC3 0xB680 #HANGUL SYLLABLE SSANGTIKEUT YO +0x8CC4 0xB681 #HANGUL SYLLABLE SSANGTIKEUT YO KIYEOK +0x8CC5 0xB682 #HANGUL SYLLABLE SSANGTIKEUT YO SSANGKIYEOK +0x8CC6 0xB683 #HANGUL SYLLABLE SSANGTIKEUT YO KIYEOKSIOS +0x8CC7 0xB684 #HANGUL SYLLABLE SSANGTIKEUT YO NIEUN +0x8CC8 0xB685 #HANGUL SYLLABLE SSANGTIKEUT YO NIEUNCIEUC +0x8CC9 0xB686 #HANGUL SYLLABLE SSANGTIKEUT YO NIEUNHIEUH +0x8CCA 0xB687 #HANGUL SYLLABLE SSANGTIKEUT YO TIKEUT +0x8CCB 0xB688 #HANGUL SYLLABLE SSANGTIKEUT YO RIEUL +0x8CCC 0xB689 #HANGUL SYLLABLE SSANGTIKEUT YO RIEULKIYEOK +0x8CCD 0xB68A #HANGUL SYLLABLE SSANGTIKEUT YO RIEULMIEUM +0x8CCE 0xB68B #HANGUL SYLLABLE SSANGTIKEUT YO RIEULPIEUP +0x8CCF 0xB68C #HANGUL SYLLABLE SSANGTIKEUT YO RIEULSIOS +0x8CD0 0xB68D #HANGUL SYLLABLE SSANGTIKEUT YO RIEULTHIEUTH +0x8CD1 0xB68E #HANGUL SYLLABLE SSANGTIKEUT YO RIEULPHIEUPH +0x8CD2 0xB68F #HANGUL SYLLABLE SSANGTIKEUT YO RIEULHIEUH +0x8CD3 0xB690 #HANGUL SYLLABLE SSANGTIKEUT YO MIEUM +0x8CD4 0xB691 #HANGUL SYLLABLE SSANGTIKEUT YO PIEUP +0x8CD5 0xB692 #HANGUL SYLLABLE SSANGTIKEUT YO PIEUPSIOS +0x8CD6 0xB693 #HANGUL SYLLABLE SSANGTIKEUT YO SIOS +0x8CD7 0xB694 #HANGUL SYLLABLE SSANGTIKEUT YO SSANGSIOS +0x8CD8 0xB695 #HANGUL SYLLABLE SSANGTIKEUT YO IEUNG +0x8CD9 0xB696 #HANGUL SYLLABLE SSANGTIKEUT YO CIEUC +0x8CDA 0xB697 #HANGUL SYLLABLE SSANGTIKEUT YO CHIEUCH +0x8CDB 0xB698 #HANGUL SYLLABLE SSANGTIKEUT YO KHIEUKH +0x8CDC 0xB699 #HANGUL SYLLABLE SSANGTIKEUT YO THIEUTH +0x8CDD 0xB69A #HANGUL SYLLABLE SSANGTIKEUT YO PHIEUPH +0x8CDE 0xB69B #HANGUL SYLLABLE SSANGTIKEUT YO HIEUH +0x8CDF 0xB69E #HANGUL SYLLABLE SSANGTIKEUT U SSANGKIYEOK +0x8CE0 0xB69F #HANGUL SYLLABLE SSANGTIKEUT U KIYEOKSIOS +0x8CE1 0xB6A1 #HANGUL SYLLABLE SSANGTIKEUT U NIEUNCIEUC +0x8CE2 0xB6A2 #HANGUL SYLLABLE SSANGTIKEUT U NIEUNHIEUH +0x8CE3 0xB6A3 #HANGUL SYLLABLE SSANGTIKEUT U TIKEUT +0x8CE4 0xB6A5 #HANGUL SYLLABLE SSANGTIKEUT U RIEULKIYEOK +0x8CE5 0xB6A6 #HANGUL SYLLABLE SSANGTIKEUT U RIEULMIEUM +0x8CE6 0xB6A7 #HANGUL SYLLABLE SSANGTIKEUT U RIEULPIEUP +0x8CE7 0xB6A8 #HANGUL SYLLABLE SSANGTIKEUT U RIEULSIOS +0x8CE8 0xB6A9 #HANGUL SYLLABLE SSANGTIKEUT U RIEULTHIEUTH +0x8CE9 0xB6AA #HANGUL SYLLABLE SSANGTIKEUT U RIEULPHIEUPH +0x8CEA 0xB6AD #HANGUL SYLLABLE SSANGTIKEUT U PIEUP +0x8CEB 0xB6AE #HANGUL SYLLABLE SSANGTIKEUT U PIEUPSIOS +0x8CEC 0xB6AF #HANGUL SYLLABLE SSANGTIKEUT U SIOS +0x8CED 0xB6B0 #HANGUL SYLLABLE SSANGTIKEUT U SSANGSIOS +0x8CEE 0xB6B2 #HANGUL SYLLABLE SSANGTIKEUT U CIEUC +0x8CEF 0xB6B3 #HANGUL SYLLABLE SSANGTIKEUT U CHIEUCH +0x8CF0 0xB6B4 #HANGUL SYLLABLE SSANGTIKEUT U KHIEUKH +0x8CF1 0xB6B5 #HANGUL SYLLABLE SSANGTIKEUT U THIEUTH +0x8CF2 0xB6B6 #HANGUL SYLLABLE SSANGTIKEUT U PHIEUPH +0x8CF3 0xB6B7 #HANGUL SYLLABLE SSANGTIKEUT U HIEUH +0x8CF4 0xB6B8 #HANGUL SYLLABLE SSANGTIKEUT WEO +0x8CF5 0xB6B9 #HANGUL SYLLABLE SSANGTIKEUT WEO KIYEOK +0x8CF6 0xB6BA #HANGUL SYLLABLE SSANGTIKEUT WEO SSANGKIYEOK +0x8CF7 0xB6BB #HANGUL SYLLABLE SSANGTIKEUT WEO KIYEOKSIOS +0x8CF8 0xB6BC #HANGUL SYLLABLE SSANGTIKEUT WEO NIEUN +0x8CF9 0xB6BD #HANGUL SYLLABLE SSANGTIKEUT WEO NIEUNCIEUC +0x8CFA 0xB6BE #HANGUL SYLLABLE SSANGTIKEUT WEO NIEUNHIEUH +0x8CFB 0xB6BF #HANGUL SYLLABLE SSANGTIKEUT WEO TIKEUT +0x8CFC 0xB6C0 #HANGUL SYLLABLE SSANGTIKEUT WEO RIEUL +0x8CFD 0xB6C1 #HANGUL SYLLABLE SSANGTIKEUT WEO RIEULKIYEOK +0x8CFE 0xB6C2 #HANGUL SYLLABLE SSANGTIKEUT WEO RIEULMIEUM +0x8D41 0xB6C3 #HANGUL SYLLABLE SSANGTIKEUT WEO RIEULPIEUP +0x8D42 0xB6C4 #HANGUL SYLLABLE SSANGTIKEUT WEO RIEULSIOS +0x8D43 0xB6C5 #HANGUL SYLLABLE SSANGTIKEUT WEO RIEULTHIEUTH +0x8D44 0xB6C6 #HANGUL SYLLABLE SSANGTIKEUT WEO RIEULPHIEUPH +0x8D45 0xB6C7 #HANGUL SYLLABLE SSANGTIKEUT WEO RIEULHIEUH +0x8D46 0xB6C8 #HANGUL SYLLABLE SSANGTIKEUT WEO MIEUM +0x8D47 0xB6C9 #HANGUL SYLLABLE SSANGTIKEUT WEO PIEUP +0x8D48 0xB6CA #HANGUL SYLLABLE SSANGTIKEUT WEO PIEUPSIOS +0x8D49 0xB6CB #HANGUL SYLLABLE SSANGTIKEUT WEO SIOS +0x8D4A 0xB6CC #HANGUL SYLLABLE SSANGTIKEUT WEO SSANGSIOS +0x8D4B 0xB6CD #HANGUL SYLLABLE SSANGTIKEUT WEO IEUNG +0x8D4C 0xB6CE #HANGUL SYLLABLE SSANGTIKEUT WEO CIEUC +0x8D4D 0xB6CF #HANGUL SYLLABLE SSANGTIKEUT WEO CHIEUCH +0x8D4E 0xB6D0 #HANGUL SYLLABLE SSANGTIKEUT WEO KHIEUKH +0x8D4F 0xB6D1 #HANGUL SYLLABLE SSANGTIKEUT WEO THIEUTH +0x8D50 0xB6D2 #HANGUL SYLLABLE SSANGTIKEUT WEO PHIEUPH +0x8D51 0xB6D3 #HANGUL SYLLABLE SSANGTIKEUT WEO HIEUH +0x8D52 0xB6D5 #HANGUL SYLLABLE SSANGTIKEUT WE KIYEOK +0x8D53 0xB6D6 #HANGUL SYLLABLE SSANGTIKEUT WE SSANGKIYEOK +0x8D54 0xB6D7 #HANGUL SYLLABLE SSANGTIKEUT WE KIYEOKSIOS +0x8D55 0xB6D8 #HANGUL SYLLABLE SSANGTIKEUT WE NIEUN +0x8D56 0xB6D9 #HANGUL SYLLABLE SSANGTIKEUT WE NIEUNCIEUC +0x8D57 0xB6DA #HANGUL SYLLABLE SSANGTIKEUT WE NIEUNHIEUH +0x8D58 0xB6DB #HANGUL SYLLABLE SSANGTIKEUT WE TIKEUT +0x8D59 0xB6DC #HANGUL SYLLABLE SSANGTIKEUT WE RIEUL +0x8D5A 0xB6DD #HANGUL SYLLABLE SSANGTIKEUT WE RIEULKIYEOK +0x8D61 0xB6DE #HANGUL SYLLABLE SSANGTIKEUT WE RIEULMIEUM +0x8D62 0xB6DF #HANGUL SYLLABLE SSANGTIKEUT WE RIEULPIEUP +0x8D63 0xB6E0 #HANGUL SYLLABLE SSANGTIKEUT WE RIEULSIOS +0x8D64 0xB6E1 #HANGUL SYLLABLE SSANGTIKEUT WE RIEULTHIEUTH +0x8D65 0xB6E2 #HANGUL SYLLABLE SSANGTIKEUT WE RIEULPHIEUPH +0x8D66 0xB6E3 #HANGUL SYLLABLE SSANGTIKEUT WE RIEULHIEUH +0x8D67 0xB6E4 #HANGUL SYLLABLE SSANGTIKEUT WE MIEUM +0x8D68 0xB6E5 #HANGUL SYLLABLE SSANGTIKEUT WE PIEUP +0x8D69 0xB6E6 #HANGUL SYLLABLE SSANGTIKEUT WE PIEUPSIOS +0x8D6A 0xB6E7 #HANGUL SYLLABLE SSANGTIKEUT WE SIOS +0x8D6B 0xB6E8 #HANGUL SYLLABLE SSANGTIKEUT WE SSANGSIOS +0x8D6C 0xB6E9 #HANGUL SYLLABLE SSANGTIKEUT WE IEUNG +0x8D6D 0xB6EA #HANGUL SYLLABLE SSANGTIKEUT WE CIEUC +0x8D6E 0xB6EB #HANGUL SYLLABLE SSANGTIKEUT WE CHIEUCH +0x8D6F 0xB6EC #HANGUL SYLLABLE SSANGTIKEUT WE KHIEUKH +0x8D70 0xB6ED #HANGUL SYLLABLE SSANGTIKEUT WE THIEUTH +0x8D71 0xB6EE #HANGUL SYLLABLE SSANGTIKEUT WE PHIEUPH +0x8D72 0xB6EF #HANGUL SYLLABLE SSANGTIKEUT WE HIEUH +0x8D73 0xB6F1 #HANGUL SYLLABLE SSANGTIKEUT WI KIYEOK +0x8D74 0xB6F2 #HANGUL SYLLABLE SSANGTIKEUT WI SSANGKIYEOK +0x8D75 0xB6F3 #HANGUL SYLLABLE SSANGTIKEUT WI KIYEOKSIOS +0x8D76 0xB6F5 #HANGUL SYLLABLE SSANGTIKEUT WI NIEUNCIEUC +0x8D77 0xB6F6 #HANGUL SYLLABLE SSANGTIKEUT WI NIEUNHIEUH +0x8D78 0xB6F7 #HANGUL SYLLABLE SSANGTIKEUT WI TIKEUT +0x8D79 0xB6F9 #HANGUL SYLLABLE SSANGTIKEUT WI RIEULKIYEOK +0x8D7A 0xB6FA #HANGUL SYLLABLE SSANGTIKEUT WI RIEULMIEUM +0x8D81 0xB6FB #HANGUL SYLLABLE SSANGTIKEUT WI RIEULPIEUP +0x8D82 0xB6FC #HANGUL SYLLABLE SSANGTIKEUT WI RIEULSIOS +0x8D83 0xB6FD #HANGUL SYLLABLE SSANGTIKEUT WI RIEULTHIEUTH +0x8D84 0xB6FE #HANGUL SYLLABLE SSANGTIKEUT WI RIEULPHIEUPH +0x8D85 0xB6FF #HANGUL SYLLABLE SSANGTIKEUT WI RIEULHIEUH +0x8D86 0xB702 #HANGUL SYLLABLE SSANGTIKEUT WI PIEUPSIOS +0x8D87 0xB703 #HANGUL SYLLABLE SSANGTIKEUT WI SIOS +0x8D88 0xB704 #HANGUL SYLLABLE SSANGTIKEUT WI SSANGSIOS +0x8D89 0xB706 #HANGUL SYLLABLE SSANGTIKEUT WI CIEUC +0x8D8A 0xB707 #HANGUL SYLLABLE SSANGTIKEUT WI CHIEUCH +0x8D8B 0xB708 #HANGUL SYLLABLE SSANGTIKEUT WI KHIEUKH +0x8D8C 0xB709 #HANGUL SYLLABLE SSANGTIKEUT WI THIEUTH +0x8D8D 0xB70A #HANGUL SYLLABLE SSANGTIKEUT WI PHIEUPH +0x8D8E 0xB70B #HANGUL SYLLABLE SSANGTIKEUT WI HIEUH +0x8D8F 0xB70C #HANGUL SYLLABLE SSANGTIKEUT YU +0x8D90 0xB70D #HANGUL SYLLABLE SSANGTIKEUT YU KIYEOK +0x8D91 0xB70E #HANGUL SYLLABLE SSANGTIKEUT YU SSANGKIYEOK +0x8D92 0xB70F #HANGUL SYLLABLE SSANGTIKEUT YU KIYEOKSIOS +0x8D93 0xB710 #HANGUL SYLLABLE SSANGTIKEUT YU NIEUN +0x8D94 0xB711 #HANGUL SYLLABLE SSANGTIKEUT YU NIEUNCIEUC +0x8D95 0xB712 #HANGUL SYLLABLE SSANGTIKEUT YU NIEUNHIEUH +0x8D96 0xB713 #HANGUL SYLLABLE SSANGTIKEUT YU TIKEUT +0x8D97 0xB714 #HANGUL SYLLABLE SSANGTIKEUT YU RIEUL +0x8D98 0xB715 #HANGUL SYLLABLE SSANGTIKEUT YU RIEULKIYEOK +0x8D99 0xB716 #HANGUL SYLLABLE SSANGTIKEUT YU RIEULMIEUM +0x8D9A 0xB717 #HANGUL SYLLABLE SSANGTIKEUT YU RIEULPIEUP +0x8D9B 0xB718 #HANGUL SYLLABLE SSANGTIKEUT YU RIEULSIOS +0x8D9C 0xB719 #HANGUL SYLLABLE SSANGTIKEUT YU RIEULTHIEUTH +0x8D9D 0xB71A #HANGUL SYLLABLE SSANGTIKEUT YU RIEULPHIEUPH +0x8D9E 0xB71B #HANGUL SYLLABLE SSANGTIKEUT YU RIEULHIEUH +0x8D9F 0xB71C #HANGUL SYLLABLE SSANGTIKEUT YU MIEUM +0x8DA0 0xB71D #HANGUL SYLLABLE SSANGTIKEUT YU PIEUP +0x8DA1 0xB71E #HANGUL SYLLABLE SSANGTIKEUT YU PIEUPSIOS +0x8DA2 0xB71F #HANGUL SYLLABLE SSANGTIKEUT YU SIOS +0x8DA3 0xB720 #HANGUL SYLLABLE SSANGTIKEUT YU SSANGSIOS +0x8DA4 0xB721 #HANGUL SYLLABLE SSANGTIKEUT YU IEUNG +0x8DA5 0xB722 #HANGUL SYLLABLE SSANGTIKEUT YU CIEUC +0x8DA6 0xB723 #HANGUL SYLLABLE SSANGTIKEUT YU CHIEUCH +0x8DA7 0xB724 #HANGUL SYLLABLE SSANGTIKEUT YU KHIEUKH +0x8DA8 0xB725 #HANGUL SYLLABLE SSANGTIKEUT YU THIEUTH +0x8DA9 0xB726 #HANGUL SYLLABLE SSANGTIKEUT YU PHIEUPH +0x8DAA 0xB727 #HANGUL SYLLABLE SSANGTIKEUT YU HIEUH +0x8DAB 0xB72A #HANGUL SYLLABLE SSANGTIKEUT EU SSANGKIYEOK +0x8DAC 0xB72B #HANGUL SYLLABLE SSANGTIKEUT EU KIYEOKSIOS +0x8DAD 0xB72D #HANGUL SYLLABLE SSANGTIKEUT EU NIEUNCIEUC +0x8DAE 0xB72E #HANGUL SYLLABLE SSANGTIKEUT EU NIEUNHIEUH +0x8DAF 0xB731 #HANGUL SYLLABLE SSANGTIKEUT EU RIEULKIYEOK +0x8DB0 0xB732 #HANGUL SYLLABLE SSANGTIKEUT EU RIEULMIEUM +0x8DB1 0xB733 #HANGUL SYLLABLE SSANGTIKEUT EU RIEULPIEUP +0x8DB2 0xB734 #HANGUL SYLLABLE SSANGTIKEUT EU RIEULSIOS +0x8DB3 0xB735 #HANGUL SYLLABLE SSANGTIKEUT EU RIEULTHIEUTH +0x8DB4 0xB736 #HANGUL SYLLABLE SSANGTIKEUT EU RIEULPHIEUPH +0x8DB5 0xB737 #HANGUL SYLLABLE SSANGTIKEUT EU RIEULHIEUH +0x8DB6 0xB73A #HANGUL SYLLABLE SSANGTIKEUT EU PIEUPSIOS +0x8DB7 0xB73C #HANGUL SYLLABLE SSANGTIKEUT EU SSANGSIOS +0x8DB8 0xB73D #HANGUL SYLLABLE SSANGTIKEUT EU IEUNG +0x8DB9 0xB73E #HANGUL SYLLABLE SSANGTIKEUT EU CIEUC +0x8DBA 0xB73F #HANGUL SYLLABLE SSANGTIKEUT EU CHIEUCH +0x8DBB 0xB740 #HANGUL SYLLABLE SSANGTIKEUT EU KHIEUKH +0x8DBC 0xB741 #HANGUL SYLLABLE SSANGTIKEUT EU THIEUTH +0x8DBD 0xB742 #HANGUL SYLLABLE SSANGTIKEUT EU PHIEUPH +0x8DBE 0xB743 #HANGUL SYLLABLE SSANGTIKEUT EU HIEUH +0x8DBF 0xB745 #HANGUL SYLLABLE SSANGTIKEUT YI KIYEOK +0x8DC0 0xB746 #HANGUL SYLLABLE SSANGTIKEUT YI SSANGKIYEOK +0x8DC1 0xB747 #HANGUL SYLLABLE SSANGTIKEUT YI KIYEOKSIOS +0x8DC2 0xB749 #HANGUL SYLLABLE SSANGTIKEUT YI NIEUNCIEUC +0x8DC3 0xB74A #HANGUL SYLLABLE SSANGTIKEUT YI NIEUNHIEUH +0x8DC4 0xB74B #HANGUL SYLLABLE SSANGTIKEUT YI TIKEUT +0x8DC5 0xB74D #HANGUL SYLLABLE SSANGTIKEUT YI RIEULKIYEOK +0x8DC6 0xB74E #HANGUL SYLLABLE SSANGTIKEUT YI RIEULMIEUM +0x8DC7 0xB74F #HANGUL SYLLABLE SSANGTIKEUT YI RIEULPIEUP +0x8DC8 0xB750 #HANGUL SYLLABLE SSANGTIKEUT YI RIEULSIOS +0x8DC9 0xB751 #HANGUL SYLLABLE SSANGTIKEUT YI RIEULTHIEUTH +0x8DCA 0xB752 #HANGUL SYLLABLE SSANGTIKEUT YI RIEULPHIEUPH +0x8DCB 0xB753 #HANGUL SYLLABLE SSANGTIKEUT YI RIEULHIEUH +0x8DCC 0xB756 #HANGUL SYLLABLE SSANGTIKEUT YI PIEUPSIOS +0x8DCD 0xB757 #HANGUL SYLLABLE SSANGTIKEUT YI SIOS +0x8DCE 0xB758 #HANGUL SYLLABLE SSANGTIKEUT YI SSANGSIOS +0x8DCF 0xB759 #HANGUL SYLLABLE SSANGTIKEUT YI IEUNG +0x8DD0 0xB75A #HANGUL SYLLABLE SSANGTIKEUT YI CIEUC +0x8DD1 0xB75B #HANGUL SYLLABLE SSANGTIKEUT YI CHIEUCH +0x8DD2 0xB75C #HANGUL SYLLABLE SSANGTIKEUT YI KHIEUKH +0x8DD3 0xB75D #HANGUL SYLLABLE SSANGTIKEUT YI THIEUTH +0x8DD4 0xB75E #HANGUL SYLLABLE SSANGTIKEUT YI PHIEUPH +0x8DD5 0xB75F #HANGUL SYLLABLE SSANGTIKEUT YI HIEUH +0x8DD6 0xB761 #HANGUL SYLLABLE SSANGTIKEUT I KIYEOK +0x8DD7 0xB762 #HANGUL SYLLABLE SSANGTIKEUT I SSANGKIYEOK +0x8DD8 0xB763 #HANGUL SYLLABLE SSANGTIKEUT I KIYEOKSIOS +0x8DD9 0xB765 #HANGUL SYLLABLE SSANGTIKEUT I NIEUNCIEUC +0x8DDA 0xB766 #HANGUL SYLLABLE SSANGTIKEUT I NIEUNHIEUH +0x8DDB 0xB767 #HANGUL SYLLABLE SSANGTIKEUT I TIKEUT +0x8DDC 0xB769 #HANGUL SYLLABLE SSANGTIKEUT I RIEULKIYEOK +0x8DDD 0xB76A #HANGUL SYLLABLE SSANGTIKEUT I RIEULMIEUM +0x8DDE 0xB76B #HANGUL SYLLABLE SSANGTIKEUT I RIEULPIEUP +0x8DDF 0xB76C #HANGUL SYLLABLE SSANGTIKEUT I RIEULSIOS +0x8DE0 0xB76D #HANGUL SYLLABLE SSANGTIKEUT I RIEULTHIEUTH +0x8DE1 0xB76E #HANGUL SYLLABLE SSANGTIKEUT I RIEULPHIEUPH +0x8DE2 0xB76F #HANGUL SYLLABLE SSANGTIKEUT I RIEULHIEUH +0x8DE3 0xB772 #HANGUL SYLLABLE SSANGTIKEUT I PIEUPSIOS +0x8DE4 0xB774 #HANGUL SYLLABLE SSANGTIKEUT I SSANGSIOS +0x8DE5 0xB776 #HANGUL SYLLABLE SSANGTIKEUT I CIEUC +0x8DE6 0xB777 #HANGUL SYLLABLE SSANGTIKEUT I CHIEUCH +0x8DE7 0xB778 #HANGUL SYLLABLE SSANGTIKEUT I KHIEUKH +0x8DE8 0xB779 #HANGUL SYLLABLE SSANGTIKEUT I THIEUTH +0x8DE9 0xB77A #HANGUL SYLLABLE SSANGTIKEUT I PHIEUPH +0x8DEA 0xB77B #HANGUL SYLLABLE SSANGTIKEUT I HIEUH +0x8DEB 0xB77E #HANGUL SYLLABLE RIEUL A SSANGKIYEOK +0x8DEC 0xB77F #HANGUL SYLLABLE RIEUL A KIYEOKSIOS +0x8DED 0xB781 #HANGUL SYLLABLE RIEUL A NIEUNCIEUC +0x8DEE 0xB782 #HANGUL SYLLABLE RIEUL A NIEUNHIEUH +0x8DEF 0xB783 #HANGUL SYLLABLE RIEUL A TIKEUT +0x8DF0 0xB785 #HANGUL SYLLABLE RIEUL A RIEULKIYEOK +0x8DF1 0xB786 #HANGUL SYLLABLE RIEUL A RIEULMIEUM +0x8DF2 0xB787 #HANGUL SYLLABLE RIEUL A RIEULPIEUP +0x8DF3 0xB788 #HANGUL SYLLABLE RIEUL A RIEULSIOS +0x8DF4 0xB789 #HANGUL SYLLABLE RIEUL A RIEULTHIEUTH +0x8DF5 0xB78A #HANGUL SYLLABLE RIEUL A RIEULPHIEUPH +0x8DF6 0xB78B #HANGUL SYLLABLE RIEUL A RIEULHIEUH +0x8DF7 0xB78E #HANGUL SYLLABLE RIEUL A PIEUPSIOS +0x8DF8 0xB793 #HANGUL SYLLABLE RIEUL A CHIEUCH +0x8DF9 0xB794 #HANGUL SYLLABLE RIEUL A KHIEUKH +0x8DFA 0xB795 #HANGUL SYLLABLE RIEUL A THIEUTH +0x8DFB 0xB79A #HANGUL SYLLABLE RIEUL AE SSANGKIYEOK +0x8DFC 0xB79B #HANGUL SYLLABLE RIEUL AE KIYEOKSIOS +0x8DFD 0xB79D #HANGUL SYLLABLE RIEUL AE NIEUNCIEUC +0x8DFE 0xB79E #HANGUL SYLLABLE RIEUL AE NIEUNHIEUH +0x8E41 0xB79F #HANGUL SYLLABLE RIEUL AE TIKEUT +0x8E42 0xB7A1 #HANGUL SYLLABLE RIEUL AE RIEULKIYEOK +0x8E43 0xB7A2 #HANGUL SYLLABLE RIEUL AE RIEULMIEUM +0x8E44 0xB7A3 #HANGUL SYLLABLE RIEUL AE RIEULPIEUP +0x8E45 0xB7A4 #HANGUL SYLLABLE RIEUL AE RIEULSIOS +0x8E46 0xB7A5 #HANGUL SYLLABLE RIEUL AE RIEULTHIEUTH +0x8E47 0xB7A6 #HANGUL SYLLABLE RIEUL AE RIEULPHIEUPH +0x8E48 0xB7A7 #HANGUL SYLLABLE RIEUL AE RIEULHIEUH +0x8E49 0xB7AA #HANGUL SYLLABLE RIEUL AE PIEUPSIOS +0x8E4A 0xB7AE #HANGUL SYLLABLE RIEUL AE CIEUC +0x8E4B 0xB7AF #HANGUL SYLLABLE RIEUL AE CHIEUCH +0x8E4C 0xB7B0 #HANGUL SYLLABLE RIEUL AE KHIEUKH +0x8E4D 0xB7B1 #HANGUL SYLLABLE RIEUL AE THIEUTH +0x8E4E 0xB7B2 #HANGUL SYLLABLE RIEUL AE PHIEUPH +0x8E4F 0xB7B3 #HANGUL SYLLABLE RIEUL AE HIEUH +0x8E50 0xB7B6 #HANGUL SYLLABLE RIEUL YA SSANGKIYEOK +0x8E51 0xB7B7 #HANGUL SYLLABLE RIEUL YA KIYEOKSIOS +0x8E52 0xB7B9 #HANGUL SYLLABLE RIEUL YA NIEUNCIEUC +0x8E53 0xB7BA #HANGUL SYLLABLE RIEUL YA NIEUNHIEUH +0x8E54 0xB7BB #HANGUL SYLLABLE RIEUL YA TIKEUT +0x8E55 0xB7BC #HANGUL SYLLABLE RIEUL YA RIEUL +0x8E56 0xB7BD #HANGUL SYLLABLE RIEUL YA RIEULKIYEOK +0x8E57 0xB7BE #HANGUL SYLLABLE RIEUL YA RIEULMIEUM +0x8E58 0xB7BF #HANGUL SYLLABLE RIEUL YA RIEULPIEUP +0x8E59 0xB7C0 #HANGUL SYLLABLE RIEUL YA RIEULSIOS +0x8E5A 0xB7C1 #HANGUL SYLLABLE RIEUL YA RIEULTHIEUTH +0x8E61 0xB7C2 #HANGUL SYLLABLE RIEUL YA RIEULPHIEUPH +0x8E62 0xB7C3 #HANGUL SYLLABLE RIEUL YA RIEULHIEUH +0x8E63 0xB7C4 #HANGUL SYLLABLE RIEUL YA MIEUM +0x8E64 0xB7C5 #HANGUL SYLLABLE RIEUL YA PIEUP +0x8E65 0xB7C6 #HANGUL SYLLABLE RIEUL YA PIEUPSIOS +0x8E66 0xB7C8 #HANGUL SYLLABLE RIEUL YA SSANGSIOS +0x8E67 0xB7CA #HANGUL SYLLABLE RIEUL YA CIEUC +0x8E68 0xB7CB #HANGUL SYLLABLE RIEUL YA CHIEUCH +0x8E69 0xB7CC #HANGUL SYLLABLE RIEUL YA KHIEUKH +0x8E6A 0xB7CD #HANGUL SYLLABLE RIEUL YA THIEUTH +0x8E6B 0xB7CE #HANGUL SYLLABLE RIEUL YA PHIEUPH +0x8E6C 0xB7CF #HANGUL SYLLABLE RIEUL YA HIEUH +0x8E6D 0xB7D0 #HANGUL SYLLABLE RIEUL YAE +0x8E6E 0xB7D1 #HANGUL SYLLABLE RIEUL YAE KIYEOK +0x8E6F 0xB7D2 #HANGUL SYLLABLE RIEUL YAE SSANGKIYEOK +0x8E70 0xB7D3 #HANGUL SYLLABLE RIEUL YAE KIYEOKSIOS +0x8E71 0xB7D4 #HANGUL SYLLABLE RIEUL YAE NIEUN +0x8E72 0xB7D5 #HANGUL SYLLABLE RIEUL YAE NIEUNCIEUC +0x8E73 0xB7D6 #HANGUL SYLLABLE RIEUL YAE NIEUNHIEUH +0x8E74 0xB7D7 #HANGUL SYLLABLE RIEUL YAE TIKEUT +0x8E75 0xB7D8 #HANGUL SYLLABLE RIEUL YAE RIEUL +0x8E76 0xB7D9 #HANGUL SYLLABLE RIEUL YAE RIEULKIYEOK +0x8E77 0xB7DA #HANGUL SYLLABLE RIEUL YAE RIEULMIEUM +0x8E78 0xB7DB #HANGUL SYLLABLE RIEUL YAE RIEULPIEUP +0x8E79 0xB7DC #HANGUL SYLLABLE RIEUL YAE RIEULSIOS +0x8E7A 0xB7DD #HANGUL SYLLABLE RIEUL YAE RIEULTHIEUTH +0x8E81 0xB7DE #HANGUL SYLLABLE RIEUL YAE RIEULPHIEUPH +0x8E82 0xB7DF #HANGUL SYLLABLE RIEUL YAE RIEULHIEUH +0x8E83 0xB7E0 #HANGUL SYLLABLE RIEUL YAE MIEUM +0x8E84 0xB7E1 #HANGUL SYLLABLE RIEUL YAE PIEUP +0x8E85 0xB7E2 #HANGUL SYLLABLE RIEUL YAE PIEUPSIOS +0x8E86 0xB7E3 #HANGUL SYLLABLE RIEUL YAE SIOS +0x8E87 0xB7E4 #HANGUL SYLLABLE RIEUL YAE SSANGSIOS +0x8E88 0xB7E5 #HANGUL SYLLABLE RIEUL YAE IEUNG +0x8E89 0xB7E6 #HANGUL SYLLABLE RIEUL YAE CIEUC +0x8E8A 0xB7E7 #HANGUL SYLLABLE RIEUL YAE CHIEUCH +0x8E8B 0xB7E8 #HANGUL SYLLABLE RIEUL YAE KHIEUKH +0x8E8C 0xB7E9 #HANGUL SYLLABLE RIEUL YAE THIEUTH +0x8E8D 0xB7EA #HANGUL SYLLABLE RIEUL YAE PHIEUPH +0x8E8E 0xB7EB #HANGUL SYLLABLE RIEUL YAE HIEUH +0x8E8F 0xB7EE #HANGUL SYLLABLE RIEUL EO SSANGKIYEOK +0x8E90 0xB7EF #HANGUL SYLLABLE RIEUL EO KIYEOKSIOS +0x8E91 0xB7F1 #HANGUL SYLLABLE RIEUL EO NIEUNCIEUC +0x8E92 0xB7F2 #HANGUL SYLLABLE RIEUL EO NIEUNHIEUH +0x8E93 0xB7F3 #HANGUL SYLLABLE RIEUL EO TIKEUT +0x8E94 0xB7F5 #HANGUL SYLLABLE RIEUL EO RIEULKIYEOK +0x8E95 0xB7F6 #HANGUL SYLLABLE RIEUL EO RIEULMIEUM +0x8E96 0xB7F7 #HANGUL SYLLABLE RIEUL EO RIEULPIEUP +0x8E97 0xB7F8 #HANGUL SYLLABLE RIEUL EO RIEULSIOS +0x8E98 0xB7F9 #HANGUL SYLLABLE RIEUL EO RIEULTHIEUTH +0x8E99 0xB7FA #HANGUL SYLLABLE RIEUL EO RIEULPHIEUPH +0x8E9A 0xB7FB #HANGUL SYLLABLE RIEUL EO RIEULHIEUH +0x8E9B 0xB7FE #HANGUL SYLLABLE RIEUL EO PIEUPSIOS +0x8E9C 0xB802 #HANGUL SYLLABLE RIEUL EO CIEUC +0x8E9D 0xB803 #HANGUL SYLLABLE RIEUL EO CHIEUCH +0x8E9E 0xB804 #HANGUL SYLLABLE RIEUL EO KHIEUKH +0x8E9F 0xB805 #HANGUL SYLLABLE RIEUL EO THIEUTH +0x8EA0 0xB806 #HANGUL SYLLABLE RIEUL EO PHIEUPH +0x8EA1 0xB80A #HANGUL SYLLABLE RIEUL E SSANGKIYEOK +0x8EA2 0xB80B #HANGUL SYLLABLE RIEUL E KIYEOKSIOS +0x8EA3 0xB80D #HANGUL SYLLABLE RIEUL E NIEUNCIEUC +0x8EA4 0xB80E #HANGUL SYLLABLE RIEUL E NIEUNHIEUH +0x8EA5 0xB80F #HANGUL SYLLABLE RIEUL E TIKEUT +0x8EA6 0xB811 #HANGUL SYLLABLE RIEUL E RIEULKIYEOK +0x8EA7 0xB812 #HANGUL SYLLABLE RIEUL E RIEULMIEUM +0x8EA8 0xB813 #HANGUL SYLLABLE RIEUL E RIEULPIEUP +0x8EA9 0xB814 #HANGUL SYLLABLE RIEUL E RIEULSIOS +0x8EAA 0xB815 #HANGUL SYLLABLE RIEUL E RIEULTHIEUTH +0x8EAB 0xB816 #HANGUL SYLLABLE RIEUL E RIEULPHIEUPH +0x8EAC 0xB817 #HANGUL SYLLABLE RIEUL E RIEULHIEUH +0x8EAD 0xB81A #HANGUL SYLLABLE RIEUL E PIEUPSIOS +0x8EAE 0xB81C #HANGUL SYLLABLE RIEUL E SSANGSIOS +0x8EAF 0xB81E #HANGUL SYLLABLE RIEUL E CIEUC +0x8EB0 0xB81F #HANGUL SYLLABLE RIEUL E CHIEUCH +0x8EB1 0xB820 #HANGUL SYLLABLE RIEUL E KHIEUKH +0x8EB2 0xB821 #HANGUL SYLLABLE RIEUL E THIEUTH +0x8EB3 0xB822 #HANGUL SYLLABLE RIEUL E PHIEUPH +0x8EB4 0xB823 #HANGUL SYLLABLE RIEUL E HIEUH +0x8EB5 0xB826 #HANGUL SYLLABLE RIEUL YEO SSANGKIYEOK +0x8EB6 0xB827 #HANGUL SYLLABLE RIEUL YEO KIYEOKSIOS +0x8EB7 0xB829 #HANGUL SYLLABLE RIEUL YEO NIEUNCIEUC +0x8EB8 0xB82A #HANGUL SYLLABLE RIEUL YEO NIEUNHIEUH +0x8EB9 0xB82B #HANGUL SYLLABLE RIEUL YEO TIKEUT +0x8EBA 0xB82D #HANGUL SYLLABLE RIEUL YEO RIEULKIYEOK +0x8EBB 0xB82E #HANGUL SYLLABLE RIEUL YEO RIEULMIEUM +0x8EBC 0xB82F #HANGUL SYLLABLE RIEUL YEO RIEULPIEUP +0x8EBD 0xB830 #HANGUL SYLLABLE RIEUL YEO RIEULSIOS +0x8EBE 0xB831 #HANGUL SYLLABLE RIEUL YEO RIEULTHIEUTH +0x8EBF 0xB832 #HANGUL SYLLABLE RIEUL YEO RIEULPHIEUPH +0x8EC0 0xB833 #HANGUL SYLLABLE RIEUL YEO RIEULHIEUH +0x8EC1 0xB836 #HANGUL SYLLABLE RIEUL YEO PIEUPSIOS +0x8EC2 0xB83A #HANGUL SYLLABLE RIEUL YEO CIEUC +0x8EC3 0xB83B #HANGUL SYLLABLE RIEUL YEO CHIEUCH +0x8EC4 0xB83C #HANGUL SYLLABLE RIEUL YEO KHIEUKH +0x8EC5 0xB83D #HANGUL SYLLABLE RIEUL YEO THIEUTH +0x8EC6 0xB83E #HANGUL SYLLABLE RIEUL YEO PHIEUPH +0x8EC7 0xB83F #HANGUL SYLLABLE RIEUL YEO HIEUH +0x8EC8 0xB841 #HANGUL SYLLABLE RIEUL YE KIYEOK +0x8EC9 0xB842 #HANGUL SYLLABLE RIEUL YE SSANGKIYEOK +0x8ECA 0xB843 #HANGUL SYLLABLE RIEUL YE KIYEOKSIOS +0x8ECB 0xB845 #HANGUL SYLLABLE RIEUL YE NIEUNCIEUC +0x8ECC 0xB846 #HANGUL SYLLABLE RIEUL YE NIEUNHIEUH +0x8ECD 0xB847 #HANGUL SYLLABLE RIEUL YE TIKEUT +0x8ECE 0xB848 #HANGUL SYLLABLE RIEUL YE RIEUL +0x8ECF 0xB849 #HANGUL SYLLABLE RIEUL YE RIEULKIYEOK +0x8ED0 0xB84A #HANGUL SYLLABLE RIEUL YE RIEULMIEUM +0x8ED1 0xB84B #HANGUL SYLLABLE RIEUL YE RIEULPIEUP +0x8ED2 0xB84C #HANGUL SYLLABLE RIEUL YE RIEULSIOS +0x8ED3 0xB84D #HANGUL SYLLABLE RIEUL YE RIEULTHIEUTH +0x8ED4 0xB84E #HANGUL SYLLABLE RIEUL YE RIEULPHIEUPH +0x8ED5 0xB84F #HANGUL SYLLABLE RIEUL YE RIEULHIEUH +0x8ED6 0xB850 #HANGUL SYLLABLE RIEUL YE MIEUM +0x8ED7 0xB852 #HANGUL SYLLABLE RIEUL YE PIEUPSIOS +0x8ED8 0xB854 #HANGUL SYLLABLE RIEUL YE SSANGSIOS +0x8ED9 0xB855 #HANGUL SYLLABLE RIEUL YE IEUNG +0x8EDA 0xB856 #HANGUL SYLLABLE RIEUL YE CIEUC +0x8EDB 0xB857 #HANGUL SYLLABLE RIEUL YE CHIEUCH +0x8EDC 0xB858 #HANGUL SYLLABLE RIEUL YE KHIEUKH +0x8EDD 0xB859 #HANGUL SYLLABLE RIEUL YE THIEUTH +0x8EDE 0xB85A #HANGUL SYLLABLE RIEUL YE PHIEUPH +0x8EDF 0xB85B #HANGUL SYLLABLE RIEUL YE HIEUH +0x8EE0 0xB85E #HANGUL SYLLABLE RIEUL O SSANGKIYEOK +0x8EE1 0xB85F #HANGUL SYLLABLE RIEUL O KIYEOKSIOS +0x8EE2 0xB861 #HANGUL SYLLABLE RIEUL O NIEUNCIEUC +0x8EE3 0xB862 #HANGUL SYLLABLE RIEUL O NIEUNHIEUH +0x8EE4 0xB863 #HANGUL SYLLABLE RIEUL O TIKEUT +0x8EE5 0xB865 #HANGUL SYLLABLE RIEUL O RIEULKIYEOK +0x8EE6 0xB866 #HANGUL SYLLABLE RIEUL O RIEULMIEUM +0x8EE7 0xB867 #HANGUL SYLLABLE RIEUL O RIEULPIEUP +0x8EE8 0xB868 #HANGUL SYLLABLE RIEUL O RIEULSIOS +0x8EE9 0xB869 #HANGUL SYLLABLE RIEUL O RIEULTHIEUTH +0x8EEA 0xB86A #HANGUL SYLLABLE RIEUL O RIEULPHIEUPH +0x8EEB 0xB86B #HANGUL SYLLABLE RIEUL O RIEULHIEUH +0x8EEC 0xB86E #HANGUL SYLLABLE RIEUL O PIEUPSIOS +0x8EED 0xB870 #HANGUL SYLLABLE RIEUL O SSANGSIOS +0x8EEE 0xB872 #HANGUL SYLLABLE RIEUL O CIEUC +0x8EEF 0xB873 #HANGUL SYLLABLE RIEUL O CHIEUCH +0x8EF0 0xB874 #HANGUL SYLLABLE RIEUL O KHIEUKH +0x8EF1 0xB875 #HANGUL SYLLABLE RIEUL O THIEUTH +0x8EF2 0xB876 #HANGUL SYLLABLE RIEUL O PHIEUPH +0x8EF3 0xB877 #HANGUL SYLLABLE RIEUL O HIEUH +0x8EF4 0xB879 #HANGUL SYLLABLE RIEUL WA KIYEOK +0x8EF5 0xB87A #HANGUL SYLLABLE RIEUL WA SSANGKIYEOK +0x8EF6 0xB87B #HANGUL SYLLABLE RIEUL WA KIYEOKSIOS +0x8EF7 0xB87D #HANGUL SYLLABLE RIEUL WA NIEUNCIEUC +0x8EF8 0xB87E #HANGUL SYLLABLE RIEUL WA NIEUNHIEUH +0x8EF9 0xB87F #HANGUL SYLLABLE RIEUL WA TIKEUT +0x8EFA 0xB880 #HANGUL SYLLABLE RIEUL WA RIEUL +0x8EFB 0xB881 #HANGUL SYLLABLE RIEUL WA RIEULKIYEOK +0x8EFC 0xB882 #HANGUL SYLLABLE RIEUL WA RIEULMIEUM +0x8EFD 0xB883 #HANGUL SYLLABLE RIEUL WA RIEULPIEUP +0x8EFE 0xB884 #HANGUL SYLLABLE RIEUL WA RIEULSIOS +0x8F41 0xB885 #HANGUL SYLLABLE RIEUL WA RIEULTHIEUTH +0x8F42 0xB886 #HANGUL SYLLABLE RIEUL WA RIEULPHIEUPH +0x8F43 0xB887 #HANGUL SYLLABLE RIEUL WA RIEULHIEUH +0x8F44 0xB888 #HANGUL SYLLABLE RIEUL WA MIEUM +0x8F45 0xB889 #HANGUL SYLLABLE RIEUL WA PIEUP +0x8F46 0xB88A #HANGUL SYLLABLE RIEUL WA PIEUPSIOS +0x8F47 0xB88B #HANGUL SYLLABLE RIEUL WA SIOS +0x8F48 0xB88C #HANGUL SYLLABLE RIEUL WA SSANGSIOS +0x8F49 0xB88E #HANGUL SYLLABLE RIEUL WA CIEUC +0x8F4A 0xB88F #HANGUL SYLLABLE RIEUL WA CHIEUCH +0x8F4B 0xB890 #HANGUL SYLLABLE RIEUL WA KHIEUKH +0x8F4C 0xB891 #HANGUL SYLLABLE RIEUL WA THIEUTH +0x8F4D 0xB892 #HANGUL SYLLABLE RIEUL WA PHIEUPH +0x8F4E 0xB893 #HANGUL SYLLABLE RIEUL WA HIEUH +0x8F4F 0xB894 #HANGUL SYLLABLE RIEUL WAE +0x8F50 0xB895 #HANGUL SYLLABLE RIEUL WAE KIYEOK +0x8F51 0xB896 #HANGUL SYLLABLE RIEUL WAE SSANGKIYEOK +0x8F52 0xB897 #HANGUL SYLLABLE RIEUL WAE KIYEOKSIOS +0x8F53 0xB898 #HANGUL SYLLABLE RIEUL WAE NIEUN +0x8F54 0xB899 #HANGUL SYLLABLE RIEUL WAE NIEUNCIEUC +0x8F55 0xB89A #HANGUL SYLLABLE RIEUL WAE NIEUNHIEUH +0x8F56 0xB89B #HANGUL SYLLABLE RIEUL WAE TIKEUT +0x8F57 0xB89C #HANGUL SYLLABLE RIEUL WAE RIEUL +0x8F58 0xB89D #HANGUL SYLLABLE RIEUL WAE RIEULKIYEOK +0x8F59 0xB89E #HANGUL SYLLABLE RIEUL WAE RIEULMIEUM +0x8F5A 0xB89F #HANGUL SYLLABLE RIEUL WAE RIEULPIEUP +0x8F61 0xB8A0 #HANGUL SYLLABLE RIEUL WAE RIEULSIOS +0x8F62 0xB8A1 #HANGUL SYLLABLE RIEUL WAE RIEULTHIEUTH +0x8F63 0xB8A2 #HANGUL SYLLABLE RIEUL WAE RIEULPHIEUPH +0x8F64 0xB8A3 #HANGUL SYLLABLE RIEUL WAE RIEULHIEUH +0x8F65 0xB8A4 #HANGUL SYLLABLE RIEUL WAE MIEUM +0x8F66 0xB8A5 #HANGUL SYLLABLE RIEUL WAE PIEUP +0x8F67 0xB8A6 #HANGUL SYLLABLE RIEUL WAE PIEUPSIOS +0x8F68 0xB8A7 #HANGUL SYLLABLE RIEUL WAE SIOS +0x8F69 0xB8A9 #HANGUL SYLLABLE RIEUL WAE IEUNG +0x8F6A 0xB8AA #HANGUL SYLLABLE RIEUL WAE CIEUC +0x8F6B 0xB8AB #HANGUL SYLLABLE RIEUL WAE CHIEUCH +0x8F6C 0xB8AC #HANGUL SYLLABLE RIEUL WAE KHIEUKH +0x8F6D 0xB8AD #HANGUL SYLLABLE RIEUL WAE THIEUTH +0x8F6E 0xB8AE #HANGUL SYLLABLE RIEUL WAE PHIEUPH +0x8F6F 0xB8AF #HANGUL SYLLABLE RIEUL WAE HIEUH +0x8F70 0xB8B1 #HANGUL SYLLABLE RIEUL OE KIYEOK +0x8F71 0xB8B2 #HANGUL SYLLABLE RIEUL OE SSANGKIYEOK +0x8F72 0xB8B3 #HANGUL SYLLABLE RIEUL OE KIYEOKSIOS +0x8F73 0xB8B5 #HANGUL SYLLABLE RIEUL OE NIEUNCIEUC +0x8F74 0xB8B6 #HANGUL SYLLABLE RIEUL OE NIEUNHIEUH +0x8F75 0xB8B7 #HANGUL SYLLABLE RIEUL OE TIKEUT +0x8F76 0xB8B9 #HANGUL SYLLABLE RIEUL OE RIEULKIYEOK +0x8F77 0xB8BA #HANGUL SYLLABLE RIEUL OE RIEULMIEUM +0x8F78 0xB8BB #HANGUL SYLLABLE RIEUL OE RIEULPIEUP +0x8F79 0xB8BC #HANGUL SYLLABLE RIEUL OE RIEULSIOS +0x8F7A 0xB8BD #HANGUL SYLLABLE RIEUL OE RIEULTHIEUTH +0x8F81 0xB8BE #HANGUL SYLLABLE RIEUL OE RIEULPHIEUPH +0x8F82 0xB8BF #HANGUL SYLLABLE RIEUL OE RIEULHIEUH +0x8F83 0xB8C2 #HANGUL SYLLABLE RIEUL OE PIEUPSIOS +0x8F84 0xB8C4 #HANGUL SYLLABLE RIEUL OE SSANGSIOS +0x8F85 0xB8C6 #HANGUL SYLLABLE RIEUL OE CIEUC +0x8F86 0xB8C7 #HANGUL SYLLABLE RIEUL OE CHIEUCH +0x8F87 0xB8C8 #HANGUL SYLLABLE RIEUL OE KHIEUKH +0x8F88 0xB8C9 #HANGUL SYLLABLE RIEUL OE THIEUTH +0x8F89 0xB8CA #HANGUL SYLLABLE RIEUL OE PHIEUPH +0x8F8A 0xB8CB #HANGUL SYLLABLE RIEUL OE HIEUH +0x8F8B 0xB8CD #HANGUL SYLLABLE RIEUL YO KIYEOK +0x8F8C 0xB8CE #HANGUL SYLLABLE RIEUL YO SSANGKIYEOK +0x8F8D 0xB8CF #HANGUL SYLLABLE RIEUL YO KIYEOKSIOS +0x8F8E 0xB8D1 #HANGUL SYLLABLE RIEUL YO NIEUNCIEUC +0x8F8F 0xB8D2 #HANGUL SYLLABLE RIEUL YO NIEUNHIEUH +0x8F90 0xB8D3 #HANGUL SYLLABLE RIEUL YO TIKEUT +0x8F91 0xB8D5 #HANGUL SYLLABLE RIEUL YO RIEULKIYEOK +0x8F92 0xB8D6 #HANGUL SYLLABLE RIEUL YO RIEULMIEUM +0x8F93 0xB8D7 #HANGUL SYLLABLE RIEUL YO RIEULPIEUP +0x8F94 0xB8D8 #HANGUL SYLLABLE RIEUL YO RIEULSIOS +0x8F95 0xB8D9 #HANGUL SYLLABLE RIEUL YO RIEULTHIEUTH +0x8F96 0xB8DA #HANGUL SYLLABLE RIEUL YO RIEULPHIEUPH +0x8F97 0xB8DB #HANGUL SYLLABLE RIEUL YO RIEULHIEUH +0x8F98 0xB8DC #HANGUL SYLLABLE RIEUL YO MIEUM +0x8F99 0xB8DE #HANGUL SYLLABLE RIEUL YO PIEUPSIOS +0x8F9A 0xB8E0 #HANGUL SYLLABLE RIEUL YO SSANGSIOS +0x8F9B 0xB8E2 #HANGUL SYLLABLE RIEUL YO CIEUC +0x8F9C 0xB8E3 #HANGUL SYLLABLE RIEUL YO CHIEUCH +0x8F9D 0xB8E4 #HANGUL SYLLABLE RIEUL YO KHIEUKH +0x8F9E 0xB8E5 #HANGUL SYLLABLE RIEUL YO THIEUTH +0x8F9F 0xB8E6 #HANGUL SYLLABLE RIEUL YO PHIEUPH +0x8FA0 0xB8E7 #HANGUL SYLLABLE RIEUL YO HIEUH +0x8FA1 0xB8EA #HANGUL SYLLABLE RIEUL U SSANGKIYEOK +0x8FA2 0xB8EB #HANGUL SYLLABLE RIEUL U KIYEOKSIOS +0x8FA3 0xB8ED #HANGUL SYLLABLE RIEUL U NIEUNCIEUC +0x8FA4 0xB8EE #HANGUL SYLLABLE RIEUL U NIEUNHIEUH +0x8FA5 0xB8EF #HANGUL SYLLABLE RIEUL U TIKEUT +0x8FA6 0xB8F1 #HANGUL SYLLABLE RIEUL U RIEULKIYEOK +0x8FA7 0xB8F2 #HANGUL SYLLABLE RIEUL U RIEULMIEUM +0x8FA8 0xB8F3 #HANGUL SYLLABLE RIEUL U RIEULPIEUP +0x8FA9 0xB8F4 #HANGUL SYLLABLE RIEUL U RIEULSIOS +0x8FAA 0xB8F5 #HANGUL SYLLABLE RIEUL U RIEULTHIEUTH +0x8FAB 0xB8F6 #HANGUL SYLLABLE RIEUL U RIEULPHIEUPH +0x8FAC 0xB8F7 #HANGUL SYLLABLE RIEUL U RIEULHIEUH +0x8FAD 0xB8FA #HANGUL SYLLABLE RIEUL U PIEUPSIOS +0x8FAE 0xB8FC #HANGUL SYLLABLE RIEUL U SSANGSIOS +0x8FAF 0xB8FE #HANGUL SYLLABLE RIEUL U CIEUC +0x8FB0 0xB8FF #HANGUL SYLLABLE RIEUL U CHIEUCH +0x8FB1 0xB900 #HANGUL SYLLABLE RIEUL U KHIEUKH +0x8FB2 0xB901 #HANGUL SYLLABLE RIEUL U THIEUTH +0x8FB3 0xB902 #HANGUL SYLLABLE RIEUL U PHIEUPH +0x8FB4 0xB903 #HANGUL SYLLABLE RIEUL U HIEUH +0x8FB5 0xB905 #HANGUL SYLLABLE RIEUL WEO KIYEOK +0x8FB6 0xB906 #HANGUL SYLLABLE RIEUL WEO SSANGKIYEOK +0x8FB7 0xB907 #HANGUL SYLLABLE RIEUL WEO KIYEOKSIOS +0x8FB8 0xB908 #HANGUL SYLLABLE RIEUL WEO NIEUN +0x8FB9 0xB909 #HANGUL SYLLABLE RIEUL WEO NIEUNCIEUC +0x8FBA 0xB90A #HANGUL SYLLABLE RIEUL WEO NIEUNHIEUH +0x8FBB 0xB90B #HANGUL SYLLABLE RIEUL WEO TIKEUT +0x8FBC 0xB90C #HANGUL SYLLABLE RIEUL WEO RIEUL +0x8FBD 0xB90D #HANGUL SYLLABLE RIEUL WEO RIEULKIYEOK +0x8FBE 0xB90E #HANGUL SYLLABLE RIEUL WEO RIEULMIEUM +0x8FBF 0xB90F #HANGUL SYLLABLE RIEUL WEO RIEULPIEUP +0x8FC0 0xB910 #HANGUL SYLLABLE RIEUL WEO RIEULSIOS +0x8FC1 0xB911 #HANGUL SYLLABLE RIEUL WEO RIEULTHIEUTH +0x8FC2 0xB912 #HANGUL SYLLABLE RIEUL WEO RIEULPHIEUPH +0x8FC3 0xB913 #HANGUL SYLLABLE RIEUL WEO RIEULHIEUH +0x8FC4 0xB914 #HANGUL SYLLABLE RIEUL WEO MIEUM +0x8FC5 0xB915 #HANGUL SYLLABLE RIEUL WEO PIEUP +0x8FC6 0xB916 #HANGUL SYLLABLE RIEUL WEO PIEUPSIOS +0x8FC7 0xB917 #HANGUL SYLLABLE RIEUL WEO SIOS +0x8FC8 0xB919 #HANGUL SYLLABLE RIEUL WEO IEUNG +0x8FC9 0xB91A #HANGUL SYLLABLE RIEUL WEO CIEUC +0x8FCA 0xB91B #HANGUL SYLLABLE RIEUL WEO CHIEUCH +0x8FCB 0xB91C #HANGUL SYLLABLE RIEUL WEO KHIEUKH +0x8FCC 0xB91D #HANGUL SYLLABLE RIEUL WEO THIEUTH +0x8FCD 0xB91E #HANGUL SYLLABLE RIEUL WEO PHIEUPH +0x8FCE 0xB91F #HANGUL SYLLABLE RIEUL WEO HIEUH +0x8FCF 0xB921 #HANGUL SYLLABLE RIEUL WE KIYEOK +0x8FD0 0xB922 #HANGUL SYLLABLE RIEUL WE SSANGKIYEOK +0x8FD1 0xB923 #HANGUL SYLLABLE RIEUL WE KIYEOKSIOS +0x8FD2 0xB924 #HANGUL SYLLABLE RIEUL WE NIEUN +0x8FD3 0xB925 #HANGUL SYLLABLE RIEUL WE NIEUNCIEUC +0x8FD4 0xB926 #HANGUL SYLLABLE RIEUL WE NIEUNHIEUH +0x8FD5 0xB927 #HANGUL SYLLABLE RIEUL WE TIKEUT +0x8FD6 0xB928 #HANGUL SYLLABLE RIEUL WE RIEUL +0x8FD7 0xB929 #HANGUL SYLLABLE RIEUL WE RIEULKIYEOK +0x8FD8 0xB92A #HANGUL SYLLABLE RIEUL WE RIEULMIEUM +0x8FD9 0xB92B #HANGUL SYLLABLE RIEUL WE RIEULPIEUP +0x8FDA 0xB92C #HANGUL SYLLABLE RIEUL WE RIEULSIOS +0x8FDB 0xB92D #HANGUL SYLLABLE RIEUL WE RIEULTHIEUTH +0x8FDC 0xB92E #HANGUL SYLLABLE RIEUL WE RIEULPHIEUPH +0x8FDD 0xB92F #HANGUL SYLLABLE RIEUL WE RIEULHIEUH +0x8FDE 0xB930 #HANGUL SYLLABLE RIEUL WE MIEUM +0x8FDF 0xB931 #HANGUL SYLLABLE RIEUL WE PIEUP +0x8FE0 0xB932 #HANGUL SYLLABLE RIEUL WE PIEUPSIOS +0x8FE1 0xB933 #HANGUL SYLLABLE RIEUL WE SIOS +0x8FE2 0xB934 #HANGUL SYLLABLE RIEUL WE SSANGSIOS +0x8FE3 0xB935 #HANGUL SYLLABLE RIEUL WE IEUNG +0x8FE4 0xB936 #HANGUL SYLLABLE RIEUL WE CIEUC +0x8FE5 0xB937 #HANGUL SYLLABLE RIEUL WE CHIEUCH +0x8FE6 0xB938 #HANGUL SYLLABLE RIEUL WE KHIEUKH +0x8FE7 0xB939 #HANGUL SYLLABLE RIEUL WE THIEUTH +0x8FE8 0xB93A #HANGUL SYLLABLE RIEUL WE PHIEUPH +0x8FE9 0xB93B #HANGUL SYLLABLE RIEUL WE HIEUH +0x8FEA 0xB93E #HANGUL SYLLABLE RIEUL WI SSANGKIYEOK +0x8FEB 0xB93F #HANGUL SYLLABLE RIEUL WI KIYEOKSIOS +0x8FEC 0xB941 #HANGUL SYLLABLE RIEUL WI NIEUNCIEUC +0x8FED 0xB942 #HANGUL SYLLABLE RIEUL WI NIEUNHIEUH +0x8FEE 0xB943 #HANGUL SYLLABLE RIEUL WI TIKEUT +0x8FEF 0xB945 #HANGUL SYLLABLE RIEUL WI RIEULKIYEOK +0x8FF0 0xB946 #HANGUL SYLLABLE RIEUL WI RIEULMIEUM +0x8FF1 0xB947 #HANGUL SYLLABLE RIEUL WI RIEULPIEUP +0x8FF2 0xB948 #HANGUL SYLLABLE RIEUL WI RIEULSIOS +0x8FF3 0xB949 #HANGUL SYLLABLE RIEUL WI RIEULTHIEUTH +0x8FF4 0xB94A #HANGUL SYLLABLE RIEUL WI RIEULPHIEUPH +0x8FF5 0xB94B #HANGUL SYLLABLE RIEUL WI RIEULHIEUH +0x8FF6 0xB94D #HANGUL SYLLABLE RIEUL WI PIEUP +0x8FF7 0xB94E #HANGUL SYLLABLE RIEUL WI PIEUPSIOS +0x8FF8 0xB950 #HANGUL SYLLABLE RIEUL WI SSANGSIOS +0x8FF9 0xB952 #HANGUL SYLLABLE RIEUL WI CIEUC +0x8FFA 0xB953 #HANGUL SYLLABLE RIEUL WI CHIEUCH +0x8FFB 0xB954 #HANGUL SYLLABLE RIEUL WI KHIEUKH +0x8FFC 0xB955 #HANGUL SYLLABLE RIEUL WI THIEUTH +0x8FFD 0xB956 #HANGUL SYLLABLE RIEUL WI PHIEUPH +0x8FFE 0xB957 #HANGUL SYLLABLE RIEUL WI HIEUH +0x9041 0xB95A #HANGUL SYLLABLE RIEUL YU SSANGKIYEOK +0x9042 0xB95B #HANGUL SYLLABLE RIEUL YU KIYEOKSIOS +0x9043 0xB95D #HANGUL SYLLABLE RIEUL YU NIEUNCIEUC +0x9044 0xB95E #HANGUL SYLLABLE RIEUL YU NIEUNHIEUH +0x9045 0xB95F #HANGUL SYLLABLE RIEUL YU TIKEUT +0x9046 0xB961 #HANGUL SYLLABLE RIEUL YU RIEULKIYEOK +0x9047 0xB962 #HANGUL SYLLABLE RIEUL YU RIEULMIEUM +0x9048 0xB963 #HANGUL SYLLABLE RIEUL YU RIEULPIEUP +0x9049 0xB964 #HANGUL SYLLABLE RIEUL YU RIEULSIOS +0x904A 0xB965 #HANGUL SYLLABLE RIEUL YU RIEULTHIEUTH +0x904B 0xB966 #HANGUL SYLLABLE RIEUL YU RIEULPHIEUPH +0x904C 0xB967 #HANGUL SYLLABLE RIEUL YU RIEULHIEUH +0x904D 0xB96A #HANGUL SYLLABLE RIEUL YU PIEUPSIOS +0x904E 0xB96C #HANGUL SYLLABLE RIEUL YU SSANGSIOS +0x904F 0xB96E #HANGUL SYLLABLE RIEUL YU CIEUC +0x9050 0xB96F #HANGUL SYLLABLE RIEUL YU CHIEUCH +0x9051 0xB970 #HANGUL SYLLABLE RIEUL YU KHIEUKH +0x9052 0xB971 #HANGUL SYLLABLE RIEUL YU THIEUTH +0x9053 0xB972 #HANGUL SYLLABLE RIEUL YU PHIEUPH +0x9054 0xB973 #HANGUL SYLLABLE RIEUL YU HIEUH +0x9055 0xB976 #HANGUL SYLLABLE RIEUL EU SSANGKIYEOK +0x9056 0xB977 #HANGUL SYLLABLE RIEUL EU KIYEOKSIOS +0x9057 0xB979 #HANGUL SYLLABLE RIEUL EU NIEUNCIEUC +0x9058 0xB97A #HANGUL SYLLABLE RIEUL EU NIEUNHIEUH +0x9059 0xB97B #HANGUL SYLLABLE RIEUL EU TIKEUT +0x905A 0xB97D #HANGUL SYLLABLE RIEUL EU RIEULKIYEOK +0x9061 0xB97E #HANGUL SYLLABLE RIEUL EU RIEULMIEUM +0x9062 0xB97F #HANGUL SYLLABLE RIEUL EU RIEULPIEUP +0x9063 0xB980 #HANGUL SYLLABLE RIEUL EU RIEULSIOS +0x9064 0xB981 #HANGUL SYLLABLE RIEUL EU RIEULTHIEUTH +0x9065 0xB982 #HANGUL SYLLABLE RIEUL EU RIEULPHIEUPH +0x9066 0xB983 #HANGUL SYLLABLE RIEUL EU RIEULHIEUH +0x9067 0xB986 #HANGUL SYLLABLE RIEUL EU PIEUPSIOS +0x9068 0xB988 #HANGUL SYLLABLE RIEUL EU SSANGSIOS +0x9069 0xB98B #HANGUL SYLLABLE RIEUL EU CHIEUCH +0x906A 0xB98C #HANGUL SYLLABLE RIEUL EU KHIEUKH +0x906B 0xB98F #HANGUL SYLLABLE RIEUL EU HIEUH +0x906C 0xB990 #HANGUL SYLLABLE RIEUL YI +0x906D 0xB991 #HANGUL SYLLABLE RIEUL YI KIYEOK +0x906E 0xB992 #HANGUL SYLLABLE RIEUL YI SSANGKIYEOK +0x906F 0xB993 #HANGUL SYLLABLE RIEUL YI KIYEOKSIOS +0x9070 0xB994 #HANGUL SYLLABLE RIEUL YI NIEUN +0x9071 0xB995 #HANGUL SYLLABLE RIEUL YI NIEUNCIEUC +0x9072 0xB996 #HANGUL SYLLABLE RIEUL YI NIEUNHIEUH +0x9073 0xB997 #HANGUL SYLLABLE RIEUL YI TIKEUT +0x9074 0xB998 #HANGUL SYLLABLE RIEUL YI RIEUL +0x9075 0xB999 #HANGUL SYLLABLE RIEUL YI RIEULKIYEOK +0x9076 0xB99A #HANGUL SYLLABLE RIEUL YI RIEULMIEUM +0x9077 0xB99B #HANGUL SYLLABLE RIEUL YI RIEULPIEUP +0x9078 0xB99C #HANGUL SYLLABLE RIEUL YI RIEULSIOS +0x9079 0xB99D #HANGUL SYLLABLE RIEUL YI RIEULTHIEUTH +0x907A 0xB99E #HANGUL SYLLABLE RIEUL YI RIEULPHIEUPH +0x9081 0xB99F #HANGUL SYLLABLE RIEUL YI RIEULHIEUH +0x9082 0xB9A0 #HANGUL SYLLABLE RIEUL YI MIEUM +0x9083 0xB9A1 #HANGUL SYLLABLE RIEUL YI PIEUP +0x9084 0xB9A2 #HANGUL SYLLABLE RIEUL YI PIEUPSIOS +0x9085 0xB9A3 #HANGUL SYLLABLE RIEUL YI SIOS +0x9086 0xB9A4 #HANGUL SYLLABLE RIEUL YI SSANGSIOS +0x9087 0xB9A5 #HANGUL SYLLABLE RIEUL YI IEUNG +0x9088 0xB9A6 #HANGUL SYLLABLE RIEUL YI CIEUC +0x9089 0xB9A7 #HANGUL SYLLABLE RIEUL YI CHIEUCH +0x908A 0xB9A8 #HANGUL SYLLABLE RIEUL YI KHIEUKH +0x908B 0xB9A9 #HANGUL SYLLABLE RIEUL YI THIEUTH +0x908C 0xB9AA #HANGUL SYLLABLE RIEUL YI PHIEUPH +0x908D 0xB9AB #HANGUL SYLLABLE RIEUL YI HIEUH +0x908E 0xB9AE #HANGUL SYLLABLE RIEUL I SSANGKIYEOK +0x908F 0xB9AF #HANGUL SYLLABLE RIEUL I KIYEOKSIOS +0x9090 0xB9B1 #HANGUL SYLLABLE RIEUL I NIEUNCIEUC +0x9091 0xB9B2 #HANGUL SYLLABLE RIEUL I NIEUNHIEUH +0x9092 0xB9B3 #HANGUL SYLLABLE RIEUL I TIKEUT +0x9093 0xB9B5 #HANGUL SYLLABLE RIEUL I RIEULKIYEOK +0x9094 0xB9B6 #HANGUL SYLLABLE RIEUL I RIEULMIEUM +0x9095 0xB9B7 #HANGUL SYLLABLE RIEUL I RIEULPIEUP +0x9096 0xB9B8 #HANGUL SYLLABLE RIEUL I RIEULSIOS +0x9097 0xB9B9 #HANGUL SYLLABLE RIEUL I RIEULTHIEUTH +0x9098 0xB9BA #HANGUL SYLLABLE RIEUL I RIEULPHIEUPH +0x9099 0xB9BB #HANGUL SYLLABLE RIEUL I RIEULHIEUH +0x909A 0xB9BE #HANGUL SYLLABLE RIEUL I PIEUPSIOS +0x909B 0xB9C0 #HANGUL SYLLABLE RIEUL I SSANGSIOS +0x909C 0xB9C2 #HANGUL SYLLABLE RIEUL I CIEUC +0x909D 0xB9C3 #HANGUL SYLLABLE RIEUL I CHIEUCH +0x909E 0xB9C4 #HANGUL SYLLABLE RIEUL I KHIEUKH +0x909F 0xB9C5 #HANGUL SYLLABLE RIEUL I THIEUTH +0x90A0 0xB9C6 #HANGUL SYLLABLE RIEUL I PHIEUPH +0x90A1 0xB9C7 #HANGUL SYLLABLE RIEUL I HIEUH +0x90A2 0xB9CA #HANGUL SYLLABLE MIEUM A SSANGKIYEOK +0x90A3 0xB9CB #HANGUL SYLLABLE MIEUM A KIYEOKSIOS +0x90A4 0xB9CD #HANGUL SYLLABLE MIEUM A NIEUNCIEUC +0x90A5 0xB9D3 #HANGUL SYLLABLE MIEUM A RIEULPIEUP +0x90A6 0xB9D4 #HANGUL SYLLABLE MIEUM A RIEULSIOS +0x90A7 0xB9D5 #HANGUL SYLLABLE MIEUM A RIEULTHIEUTH +0x90A8 0xB9D6 #HANGUL SYLLABLE MIEUM A RIEULPHIEUPH +0x90A9 0xB9D7 #HANGUL SYLLABLE MIEUM A RIEULHIEUH +0x90AA 0xB9DA #HANGUL SYLLABLE MIEUM A PIEUPSIOS +0x90AB 0xB9DC #HANGUL SYLLABLE MIEUM A SSANGSIOS +0x90AC 0xB9DF #HANGUL SYLLABLE MIEUM A CHIEUCH +0x90AD 0xB9E0 #HANGUL SYLLABLE MIEUM A KHIEUKH +0x90AE 0xB9E2 #HANGUL SYLLABLE MIEUM A PHIEUPH +0x90AF 0xB9E6 #HANGUL SYLLABLE MIEUM AE SSANGKIYEOK +0x90B0 0xB9E7 #HANGUL SYLLABLE MIEUM AE KIYEOKSIOS +0x90B1 0xB9E9 #HANGUL SYLLABLE MIEUM AE NIEUNCIEUC +0x90B2 0xB9EA #HANGUL SYLLABLE MIEUM AE NIEUNHIEUH +0x90B3 0xB9EB #HANGUL SYLLABLE MIEUM AE TIKEUT +0x90B4 0xB9ED #HANGUL SYLLABLE MIEUM AE RIEULKIYEOK +0x90B5 0xB9EE #HANGUL SYLLABLE MIEUM AE RIEULMIEUM +0x90B6 0xB9EF #HANGUL SYLLABLE MIEUM AE RIEULPIEUP +0x90B7 0xB9F0 #HANGUL SYLLABLE MIEUM AE RIEULSIOS +0x90B8 0xB9F1 #HANGUL SYLLABLE MIEUM AE RIEULTHIEUTH +0x90B9 0xB9F2 #HANGUL SYLLABLE MIEUM AE RIEULPHIEUPH +0x90BA 0xB9F3 #HANGUL SYLLABLE MIEUM AE RIEULHIEUH +0x90BB 0xB9F6 #HANGUL SYLLABLE MIEUM AE PIEUPSIOS +0x90BC 0xB9FB #HANGUL SYLLABLE MIEUM AE CHIEUCH +0x90BD 0xB9FC #HANGUL SYLLABLE MIEUM AE KHIEUKH +0x90BE 0xB9FD #HANGUL SYLLABLE MIEUM AE THIEUTH +0x90BF 0xB9FE #HANGUL SYLLABLE MIEUM AE PHIEUPH +0x90C0 0xB9FF #HANGUL SYLLABLE MIEUM AE HIEUH +0x90C1 0xBA02 #HANGUL SYLLABLE MIEUM YA SSANGKIYEOK +0x90C2 0xBA03 #HANGUL SYLLABLE MIEUM YA KIYEOKSIOS +0x90C3 0xBA04 #HANGUL SYLLABLE MIEUM YA NIEUN +0x90C4 0xBA05 #HANGUL SYLLABLE MIEUM YA NIEUNCIEUC +0x90C5 0xBA06 #HANGUL SYLLABLE MIEUM YA NIEUNHIEUH +0x90C6 0xBA07 #HANGUL SYLLABLE MIEUM YA TIKEUT +0x90C7 0xBA09 #HANGUL SYLLABLE MIEUM YA RIEULKIYEOK +0x90C8 0xBA0A #HANGUL SYLLABLE MIEUM YA RIEULMIEUM +0x90C9 0xBA0B #HANGUL SYLLABLE MIEUM YA RIEULPIEUP +0x90CA 0xBA0C #HANGUL SYLLABLE MIEUM YA RIEULSIOS +0x90CB 0xBA0D #HANGUL SYLLABLE MIEUM YA RIEULTHIEUTH +0x90CC 0xBA0E #HANGUL SYLLABLE MIEUM YA RIEULPHIEUPH +0x90CD 0xBA0F #HANGUL SYLLABLE MIEUM YA RIEULHIEUH +0x90CE 0xBA10 #HANGUL SYLLABLE MIEUM YA MIEUM +0x90CF 0xBA11 #HANGUL SYLLABLE MIEUM YA PIEUP +0x90D0 0xBA12 #HANGUL SYLLABLE MIEUM YA PIEUPSIOS +0x90D1 0xBA13 #HANGUL SYLLABLE MIEUM YA SIOS +0x90D2 0xBA14 #HANGUL SYLLABLE MIEUM YA SSANGSIOS +0x90D3 0xBA16 #HANGUL SYLLABLE MIEUM YA CIEUC +0x90D4 0xBA17 #HANGUL SYLLABLE MIEUM YA CHIEUCH +0x90D5 0xBA18 #HANGUL SYLLABLE MIEUM YA KHIEUKH +0x90D6 0xBA19 #HANGUL SYLLABLE MIEUM YA THIEUTH +0x90D7 0xBA1A #HANGUL SYLLABLE MIEUM YA PHIEUPH +0x90D8 0xBA1B #HANGUL SYLLABLE MIEUM YA HIEUH +0x90D9 0xBA1C #HANGUL SYLLABLE MIEUM YAE +0x90DA 0xBA1D #HANGUL SYLLABLE MIEUM YAE KIYEOK +0x90DB 0xBA1E #HANGUL SYLLABLE MIEUM YAE SSANGKIYEOK +0x90DC 0xBA1F #HANGUL SYLLABLE MIEUM YAE KIYEOKSIOS +0x90DD 0xBA20 #HANGUL SYLLABLE MIEUM YAE NIEUN +0x90DE 0xBA21 #HANGUL SYLLABLE MIEUM YAE NIEUNCIEUC +0x90DF 0xBA22 #HANGUL SYLLABLE MIEUM YAE NIEUNHIEUH +0x90E0 0xBA23 #HANGUL SYLLABLE MIEUM YAE TIKEUT +0x90E1 0xBA24 #HANGUL SYLLABLE MIEUM YAE RIEUL +0x90E2 0xBA25 #HANGUL SYLLABLE MIEUM YAE RIEULKIYEOK +0x90E3 0xBA26 #HANGUL SYLLABLE MIEUM YAE RIEULMIEUM +0x90E4 0xBA27 #HANGUL SYLLABLE MIEUM YAE RIEULPIEUP +0x90E5 0xBA28 #HANGUL SYLLABLE MIEUM YAE RIEULSIOS +0x90E6 0xBA29 #HANGUL SYLLABLE MIEUM YAE RIEULTHIEUTH +0x90E7 0xBA2A #HANGUL SYLLABLE MIEUM YAE RIEULPHIEUPH +0x90E8 0xBA2B #HANGUL SYLLABLE MIEUM YAE RIEULHIEUH +0x90E9 0xBA2C #HANGUL SYLLABLE MIEUM YAE MIEUM +0x90EA 0xBA2D #HANGUL SYLLABLE MIEUM YAE PIEUP +0x90EB 0xBA2E #HANGUL SYLLABLE MIEUM YAE PIEUPSIOS +0x90EC 0xBA2F #HANGUL SYLLABLE MIEUM YAE SIOS +0x90ED 0xBA30 #HANGUL SYLLABLE MIEUM YAE SSANGSIOS +0x90EE 0xBA31 #HANGUL SYLLABLE MIEUM YAE IEUNG +0x90EF 0xBA32 #HANGUL SYLLABLE MIEUM YAE CIEUC +0x90F0 0xBA33 #HANGUL SYLLABLE MIEUM YAE CHIEUCH +0x90F1 0xBA34 #HANGUL SYLLABLE MIEUM YAE KHIEUKH +0x90F2 0xBA35 #HANGUL SYLLABLE MIEUM YAE THIEUTH +0x90F3 0xBA36 #HANGUL SYLLABLE MIEUM YAE PHIEUPH +0x90F4 0xBA37 #HANGUL SYLLABLE MIEUM YAE HIEUH +0x90F5 0xBA3A #HANGUL SYLLABLE MIEUM EO SSANGKIYEOK +0x90F6 0xBA3B #HANGUL SYLLABLE MIEUM EO KIYEOKSIOS +0x90F7 0xBA3D #HANGUL SYLLABLE MIEUM EO NIEUNCIEUC +0x90F8 0xBA3E #HANGUL SYLLABLE MIEUM EO NIEUNHIEUH +0x90F9 0xBA3F #HANGUL SYLLABLE MIEUM EO TIKEUT +0x90FA 0xBA41 #HANGUL SYLLABLE MIEUM EO RIEULKIYEOK +0x90FB 0xBA43 #HANGUL SYLLABLE MIEUM EO RIEULPIEUP +0x90FC 0xBA44 #HANGUL SYLLABLE MIEUM EO RIEULSIOS +0x90FD 0xBA45 #HANGUL SYLLABLE MIEUM EO RIEULTHIEUTH +0x90FE 0xBA46 #HANGUL SYLLABLE MIEUM EO RIEULPHIEUPH +0x9141 0xBA47 #HANGUL SYLLABLE MIEUM EO RIEULHIEUH +0x9142 0xBA4A #HANGUL SYLLABLE MIEUM EO PIEUPSIOS +0x9143 0xBA4C #HANGUL SYLLABLE MIEUM EO SSANGSIOS +0x9144 0xBA4F #HANGUL SYLLABLE MIEUM EO CHIEUCH +0x9145 0xBA50 #HANGUL SYLLABLE MIEUM EO KHIEUKH +0x9146 0xBA51 #HANGUL SYLLABLE MIEUM EO THIEUTH +0x9147 0xBA52 #HANGUL SYLLABLE MIEUM EO PHIEUPH +0x9148 0xBA56 #HANGUL SYLLABLE MIEUM E SSANGKIYEOK +0x9149 0xBA57 #HANGUL SYLLABLE MIEUM E KIYEOKSIOS +0x914A 0xBA59 #HANGUL SYLLABLE MIEUM E NIEUNCIEUC +0x914B 0xBA5A #HANGUL SYLLABLE MIEUM E NIEUNHIEUH +0x914C 0xBA5B #HANGUL SYLLABLE MIEUM E TIKEUT +0x914D 0xBA5D #HANGUL SYLLABLE MIEUM E RIEULKIYEOK +0x914E 0xBA5E #HANGUL SYLLABLE MIEUM E RIEULMIEUM +0x914F 0xBA5F #HANGUL SYLLABLE MIEUM E RIEULPIEUP +0x9150 0xBA60 #HANGUL SYLLABLE MIEUM E RIEULSIOS +0x9151 0xBA61 #HANGUL SYLLABLE MIEUM E RIEULTHIEUTH +0x9152 0xBA62 #HANGUL SYLLABLE MIEUM E RIEULPHIEUPH +0x9153 0xBA63 #HANGUL SYLLABLE MIEUM E RIEULHIEUH +0x9154 0xBA66 #HANGUL SYLLABLE MIEUM E PIEUPSIOS +0x9155 0xBA6A #HANGUL SYLLABLE MIEUM E CIEUC +0x9156 0xBA6B #HANGUL SYLLABLE MIEUM E CHIEUCH +0x9157 0xBA6C #HANGUL SYLLABLE MIEUM E KHIEUKH +0x9158 0xBA6D #HANGUL SYLLABLE MIEUM E THIEUTH +0x9159 0xBA6E #HANGUL SYLLABLE MIEUM E PHIEUPH +0x915A 0xBA6F #HANGUL SYLLABLE MIEUM E HIEUH +0x9161 0xBA72 #HANGUL SYLLABLE MIEUM YEO SSANGKIYEOK +0x9162 0xBA73 #HANGUL SYLLABLE MIEUM YEO KIYEOKSIOS +0x9163 0xBA75 #HANGUL SYLLABLE MIEUM YEO NIEUNCIEUC +0x9164 0xBA76 #HANGUL SYLLABLE MIEUM YEO NIEUNHIEUH +0x9165 0xBA77 #HANGUL SYLLABLE MIEUM YEO TIKEUT +0x9166 0xBA79 #HANGUL SYLLABLE MIEUM YEO RIEULKIYEOK +0x9167 0xBA7A #HANGUL SYLLABLE MIEUM YEO RIEULMIEUM +0x9168 0xBA7B #HANGUL SYLLABLE MIEUM YEO RIEULPIEUP +0x9169 0xBA7C #HANGUL SYLLABLE MIEUM YEO RIEULSIOS +0x916A 0xBA7D #HANGUL SYLLABLE MIEUM YEO RIEULTHIEUTH +0x916B 0xBA7E #HANGUL SYLLABLE MIEUM YEO RIEULPHIEUPH +0x916C 0xBA7F #HANGUL SYLLABLE MIEUM YEO RIEULHIEUH +0x916D 0xBA80 #HANGUL SYLLABLE MIEUM YEO MIEUM +0x916E 0xBA81 #HANGUL SYLLABLE MIEUM YEO PIEUP +0x916F 0xBA82 #HANGUL SYLLABLE MIEUM YEO PIEUPSIOS +0x9170 0xBA86 #HANGUL SYLLABLE MIEUM YEO CIEUC +0x9171 0xBA88 #HANGUL SYLLABLE MIEUM YEO KHIEUKH +0x9172 0xBA89 #HANGUL SYLLABLE MIEUM YEO THIEUTH +0x9173 0xBA8A #HANGUL SYLLABLE MIEUM YEO PHIEUPH +0x9174 0xBA8B #HANGUL SYLLABLE MIEUM YEO HIEUH +0x9175 0xBA8D #HANGUL SYLLABLE MIEUM YE KIYEOK +0x9176 0xBA8E #HANGUL SYLLABLE MIEUM YE SSANGKIYEOK +0x9177 0xBA8F #HANGUL SYLLABLE MIEUM YE KIYEOKSIOS +0x9178 0xBA90 #HANGUL SYLLABLE MIEUM YE NIEUN +0x9179 0xBA91 #HANGUL SYLLABLE MIEUM YE NIEUNCIEUC +0x917A 0xBA92 #HANGUL SYLLABLE MIEUM YE NIEUNHIEUH +0x9181 0xBA93 #HANGUL SYLLABLE MIEUM YE TIKEUT +0x9182 0xBA94 #HANGUL SYLLABLE MIEUM YE RIEUL +0x9183 0xBA95 #HANGUL SYLLABLE MIEUM YE RIEULKIYEOK +0x9184 0xBA96 #HANGUL SYLLABLE MIEUM YE RIEULMIEUM +0x9185 0xBA97 #HANGUL SYLLABLE MIEUM YE RIEULPIEUP +0x9186 0xBA98 #HANGUL SYLLABLE MIEUM YE RIEULSIOS +0x9187 0xBA99 #HANGUL SYLLABLE MIEUM YE RIEULTHIEUTH +0x9188 0xBA9A #HANGUL SYLLABLE MIEUM YE RIEULPHIEUPH +0x9189 0xBA9B #HANGUL SYLLABLE MIEUM YE RIEULHIEUH +0x918A 0xBA9C #HANGUL SYLLABLE MIEUM YE MIEUM +0x918B 0xBA9D #HANGUL SYLLABLE MIEUM YE PIEUP +0x918C 0xBA9E #HANGUL SYLLABLE MIEUM YE PIEUPSIOS +0x918D 0xBA9F #HANGUL SYLLABLE MIEUM YE SIOS +0x918E 0xBAA0 #HANGUL SYLLABLE MIEUM YE SSANGSIOS +0x918F 0xBAA1 #HANGUL SYLLABLE MIEUM YE IEUNG +0x9190 0xBAA2 #HANGUL SYLLABLE MIEUM YE CIEUC +0x9191 0xBAA3 #HANGUL SYLLABLE MIEUM YE CHIEUCH +0x9192 0xBAA4 #HANGUL SYLLABLE MIEUM YE KHIEUKH +0x9193 0xBAA5 #HANGUL SYLLABLE MIEUM YE THIEUTH +0x9194 0xBAA6 #HANGUL SYLLABLE MIEUM YE PHIEUPH +0x9195 0xBAA7 #HANGUL SYLLABLE MIEUM YE HIEUH +0x9196 0xBAAA #HANGUL SYLLABLE MIEUM O SSANGKIYEOK +0x9197 0xBAAD #HANGUL SYLLABLE MIEUM O NIEUNCIEUC +0x9198 0xBAAE #HANGUL SYLLABLE MIEUM O NIEUNHIEUH +0x9199 0xBAAF #HANGUL SYLLABLE MIEUM O TIKEUT +0x919A 0xBAB1 #HANGUL SYLLABLE MIEUM O RIEULKIYEOK +0x919B 0xBAB3 #HANGUL SYLLABLE MIEUM O RIEULPIEUP +0x919C 0xBAB4 #HANGUL SYLLABLE MIEUM O RIEULSIOS +0x919D 0xBAB5 #HANGUL SYLLABLE MIEUM O RIEULTHIEUTH +0x919E 0xBAB6 #HANGUL SYLLABLE MIEUM O RIEULPHIEUPH +0x919F 0xBAB7 #HANGUL SYLLABLE MIEUM O RIEULHIEUH +0x91A0 0xBABA #HANGUL SYLLABLE MIEUM O PIEUPSIOS +0x91A1 0xBABC #HANGUL SYLLABLE MIEUM O SSANGSIOS +0x91A2 0xBABE #HANGUL SYLLABLE MIEUM O CIEUC +0x91A3 0xBABF #HANGUL SYLLABLE MIEUM O CHIEUCH +0x91A4 0xBAC0 #HANGUL SYLLABLE MIEUM O KHIEUKH +0x91A5 0xBAC1 #HANGUL SYLLABLE MIEUM O THIEUTH +0x91A6 0xBAC2 #HANGUL SYLLABLE MIEUM O PHIEUPH +0x91A7 0xBAC3 #HANGUL SYLLABLE MIEUM O HIEUH +0x91A8 0xBAC5 #HANGUL SYLLABLE MIEUM WA KIYEOK +0x91A9 0xBAC6 #HANGUL SYLLABLE MIEUM WA SSANGKIYEOK +0x91AA 0xBAC7 #HANGUL SYLLABLE MIEUM WA KIYEOKSIOS +0x91AB 0xBAC9 #HANGUL SYLLABLE MIEUM WA NIEUNCIEUC +0x91AC 0xBACA #HANGUL SYLLABLE MIEUM WA NIEUNHIEUH +0x91AD 0xBACB #HANGUL SYLLABLE MIEUM WA TIKEUT +0x91AE 0xBACC #HANGUL SYLLABLE MIEUM WA RIEUL +0x91AF 0xBACD #HANGUL SYLLABLE MIEUM WA RIEULKIYEOK +0x91B0 0xBACE #HANGUL SYLLABLE MIEUM WA RIEULMIEUM +0x91B1 0xBACF #HANGUL SYLLABLE MIEUM WA RIEULPIEUP +0x91B2 0xBAD0 #HANGUL SYLLABLE MIEUM WA RIEULSIOS +0x91B3 0xBAD1 #HANGUL SYLLABLE MIEUM WA RIEULTHIEUTH +0x91B4 0xBAD2 #HANGUL SYLLABLE MIEUM WA RIEULPHIEUPH +0x91B5 0xBAD3 #HANGUL SYLLABLE MIEUM WA RIEULHIEUH +0x91B6 0xBAD4 #HANGUL SYLLABLE MIEUM WA MIEUM +0x91B7 0xBAD5 #HANGUL SYLLABLE MIEUM WA PIEUP +0x91B8 0xBAD6 #HANGUL SYLLABLE MIEUM WA PIEUPSIOS +0x91B9 0xBAD7 #HANGUL SYLLABLE MIEUM WA SIOS +0x91BA 0xBADA #HANGUL SYLLABLE MIEUM WA CIEUC +0x91BB 0xBADB #HANGUL SYLLABLE MIEUM WA CHIEUCH +0x91BC 0xBADC #HANGUL SYLLABLE MIEUM WA KHIEUKH +0x91BD 0xBADD #HANGUL SYLLABLE MIEUM WA THIEUTH +0x91BE 0xBADE #HANGUL SYLLABLE MIEUM WA PHIEUPH +0x91BF 0xBADF #HANGUL SYLLABLE MIEUM WA HIEUH +0x91C0 0xBAE0 #HANGUL SYLLABLE MIEUM WAE +0x91C1 0xBAE1 #HANGUL SYLLABLE MIEUM WAE KIYEOK +0x91C2 0xBAE2 #HANGUL SYLLABLE MIEUM WAE SSANGKIYEOK +0x91C3 0xBAE3 #HANGUL SYLLABLE MIEUM WAE KIYEOKSIOS +0x91C4 0xBAE4 #HANGUL SYLLABLE MIEUM WAE NIEUN +0x91C5 0xBAE5 #HANGUL SYLLABLE MIEUM WAE NIEUNCIEUC +0x91C6 0xBAE6 #HANGUL SYLLABLE MIEUM WAE NIEUNHIEUH +0x91C7 0xBAE7 #HANGUL SYLLABLE MIEUM WAE TIKEUT +0x91C8 0xBAE8 #HANGUL SYLLABLE MIEUM WAE RIEUL +0x91C9 0xBAE9 #HANGUL SYLLABLE MIEUM WAE RIEULKIYEOK +0x91CA 0xBAEA #HANGUL SYLLABLE MIEUM WAE RIEULMIEUM +0x91CB 0xBAEB #HANGUL SYLLABLE MIEUM WAE RIEULPIEUP +0x91CC 0xBAEC #HANGUL SYLLABLE MIEUM WAE RIEULSIOS +0x91CD 0xBAED #HANGUL SYLLABLE MIEUM WAE RIEULTHIEUTH +0x91CE 0xBAEE #HANGUL SYLLABLE MIEUM WAE RIEULPHIEUPH +0x91CF 0xBAEF #HANGUL SYLLABLE MIEUM WAE RIEULHIEUH +0x91D0 0xBAF0 #HANGUL SYLLABLE MIEUM WAE MIEUM +0x91D1 0xBAF1 #HANGUL SYLLABLE MIEUM WAE PIEUP +0x91D2 0xBAF2 #HANGUL SYLLABLE MIEUM WAE PIEUPSIOS +0x91D3 0xBAF3 #HANGUL SYLLABLE MIEUM WAE SIOS +0x91D4 0xBAF4 #HANGUL SYLLABLE MIEUM WAE SSANGSIOS +0x91D5 0xBAF5 #HANGUL SYLLABLE MIEUM WAE IEUNG +0x91D6 0xBAF6 #HANGUL SYLLABLE MIEUM WAE CIEUC +0x91D7 0xBAF7 #HANGUL SYLLABLE MIEUM WAE CHIEUCH +0x91D8 0xBAF8 #HANGUL SYLLABLE MIEUM WAE KHIEUKH +0x91D9 0xBAF9 #HANGUL SYLLABLE MIEUM WAE THIEUTH +0x91DA 0xBAFA #HANGUL SYLLABLE MIEUM WAE PHIEUPH +0x91DB 0xBAFB #HANGUL SYLLABLE MIEUM WAE HIEUH +0x91DC 0xBAFD #HANGUL SYLLABLE MIEUM OE KIYEOK +0x91DD 0xBAFE #HANGUL SYLLABLE MIEUM OE SSANGKIYEOK +0x91DE 0xBAFF #HANGUL SYLLABLE MIEUM OE KIYEOKSIOS +0x91DF 0xBB01 #HANGUL SYLLABLE MIEUM OE NIEUNCIEUC +0x91E0 0xBB02 #HANGUL SYLLABLE MIEUM OE NIEUNHIEUH +0x91E1 0xBB03 #HANGUL SYLLABLE MIEUM OE TIKEUT +0x91E2 0xBB05 #HANGUL SYLLABLE MIEUM OE RIEULKIYEOK +0x91E3 0xBB06 #HANGUL SYLLABLE MIEUM OE RIEULMIEUM +0x91E4 0xBB07 #HANGUL SYLLABLE MIEUM OE RIEULPIEUP +0x91E5 0xBB08 #HANGUL SYLLABLE MIEUM OE RIEULSIOS +0x91E6 0xBB09 #HANGUL SYLLABLE MIEUM OE RIEULTHIEUTH +0x91E7 0xBB0A #HANGUL SYLLABLE MIEUM OE RIEULPHIEUPH +0x91E8 0xBB0B #HANGUL SYLLABLE MIEUM OE RIEULHIEUH +0x91E9 0xBB0C #HANGUL SYLLABLE MIEUM OE MIEUM +0x91EA 0xBB0E #HANGUL SYLLABLE MIEUM OE PIEUPSIOS +0x91EB 0xBB10 #HANGUL SYLLABLE MIEUM OE SSANGSIOS +0x91EC 0xBB12 #HANGUL SYLLABLE MIEUM OE CIEUC +0x91ED 0xBB13 #HANGUL SYLLABLE MIEUM OE CHIEUCH +0x91EE 0xBB14 #HANGUL SYLLABLE MIEUM OE KHIEUKH +0x91EF 0xBB15 #HANGUL SYLLABLE MIEUM OE THIEUTH +0x91F0 0xBB16 #HANGUL SYLLABLE MIEUM OE PHIEUPH +0x91F1 0xBB17 #HANGUL SYLLABLE MIEUM OE HIEUH +0x91F2 0xBB19 #HANGUL SYLLABLE MIEUM YO KIYEOK +0x91F3 0xBB1A #HANGUL SYLLABLE MIEUM YO SSANGKIYEOK +0x91F4 0xBB1B #HANGUL SYLLABLE MIEUM YO KIYEOKSIOS +0x91F5 0xBB1D #HANGUL SYLLABLE MIEUM YO NIEUNCIEUC +0x91F6 0xBB1E #HANGUL SYLLABLE MIEUM YO NIEUNHIEUH +0x91F7 0xBB1F #HANGUL SYLLABLE MIEUM YO TIKEUT +0x91F8 0xBB21 #HANGUL SYLLABLE MIEUM YO RIEULKIYEOK +0x91F9 0xBB22 #HANGUL SYLLABLE MIEUM YO RIEULMIEUM +0x91FA 0xBB23 #HANGUL SYLLABLE MIEUM YO RIEULPIEUP +0x91FB 0xBB24 #HANGUL SYLLABLE MIEUM YO RIEULSIOS +0x91FC 0xBB25 #HANGUL SYLLABLE MIEUM YO RIEULTHIEUTH +0x91FD 0xBB26 #HANGUL SYLLABLE MIEUM YO RIEULPHIEUPH +0x91FE 0xBB27 #HANGUL SYLLABLE MIEUM YO RIEULHIEUH +0x9241 0xBB28 #HANGUL SYLLABLE MIEUM YO MIEUM +0x9242 0xBB2A #HANGUL SYLLABLE MIEUM YO PIEUPSIOS +0x9243 0xBB2C #HANGUL SYLLABLE MIEUM YO SSANGSIOS +0x9244 0xBB2D #HANGUL SYLLABLE MIEUM YO IEUNG +0x9245 0xBB2E #HANGUL SYLLABLE MIEUM YO CIEUC +0x9246 0xBB2F #HANGUL SYLLABLE MIEUM YO CHIEUCH +0x9247 0xBB30 #HANGUL SYLLABLE MIEUM YO KHIEUKH +0x9248 0xBB31 #HANGUL SYLLABLE MIEUM YO THIEUTH +0x9249 0xBB32 #HANGUL SYLLABLE MIEUM YO PHIEUPH +0x924A 0xBB33 #HANGUL SYLLABLE MIEUM YO HIEUH +0x924B 0xBB37 #HANGUL SYLLABLE MIEUM U KIYEOKSIOS +0x924C 0xBB39 #HANGUL SYLLABLE MIEUM U NIEUNCIEUC +0x924D 0xBB3A #HANGUL SYLLABLE MIEUM U NIEUNHIEUH +0x924E 0xBB3F #HANGUL SYLLABLE MIEUM U RIEULPIEUP +0x924F 0xBB40 #HANGUL SYLLABLE MIEUM U RIEULSIOS +0x9250 0xBB41 #HANGUL SYLLABLE MIEUM U RIEULTHIEUTH +0x9251 0xBB42 #HANGUL SYLLABLE MIEUM U RIEULPHIEUPH +0x9252 0xBB43 #HANGUL SYLLABLE MIEUM U RIEULHIEUH +0x9253 0xBB46 #HANGUL SYLLABLE MIEUM U PIEUPSIOS +0x9254 0xBB48 #HANGUL SYLLABLE MIEUM U SSANGSIOS +0x9255 0xBB4A #HANGUL SYLLABLE MIEUM U CIEUC +0x9256 0xBB4B #HANGUL SYLLABLE MIEUM U CHIEUCH +0x9257 0xBB4C #HANGUL SYLLABLE MIEUM U KHIEUKH +0x9258 0xBB4E #HANGUL SYLLABLE MIEUM U PHIEUPH +0x9259 0xBB51 #HANGUL SYLLABLE MIEUM WEO KIYEOK +0x925A 0xBB52 #HANGUL SYLLABLE MIEUM WEO SSANGKIYEOK +0x9261 0xBB53 #HANGUL SYLLABLE MIEUM WEO KIYEOKSIOS +0x9262 0xBB55 #HANGUL SYLLABLE MIEUM WEO NIEUNCIEUC +0x9263 0xBB56 #HANGUL SYLLABLE MIEUM WEO NIEUNHIEUH +0x9264 0xBB57 #HANGUL SYLLABLE MIEUM WEO TIKEUT +0x9265 0xBB59 #HANGUL SYLLABLE MIEUM WEO RIEULKIYEOK +0x9266 0xBB5A #HANGUL SYLLABLE MIEUM WEO RIEULMIEUM +0x9267 0xBB5B #HANGUL SYLLABLE MIEUM WEO RIEULPIEUP +0x9268 0xBB5C #HANGUL SYLLABLE MIEUM WEO RIEULSIOS +0x9269 0xBB5D #HANGUL SYLLABLE MIEUM WEO RIEULTHIEUTH +0x926A 0xBB5E #HANGUL SYLLABLE MIEUM WEO RIEULPHIEUPH +0x926B 0xBB5F #HANGUL SYLLABLE MIEUM WEO RIEULHIEUH +0x926C 0xBB60 #HANGUL SYLLABLE MIEUM WEO MIEUM +0x926D 0xBB62 #HANGUL SYLLABLE MIEUM WEO PIEUPSIOS +0x926E 0xBB64 #HANGUL SYLLABLE MIEUM WEO SSANGSIOS +0x926F 0xBB65 #HANGUL SYLLABLE MIEUM WEO IEUNG +0x9270 0xBB66 #HANGUL SYLLABLE MIEUM WEO CIEUC +0x9271 0xBB67 #HANGUL SYLLABLE MIEUM WEO CHIEUCH +0x9272 0xBB68 #HANGUL SYLLABLE MIEUM WEO KHIEUKH +0x9273 0xBB69 #HANGUL SYLLABLE MIEUM WEO THIEUTH +0x9274 0xBB6A #HANGUL SYLLABLE MIEUM WEO PHIEUPH +0x9275 0xBB6B #HANGUL SYLLABLE MIEUM WEO HIEUH +0x9276 0xBB6D #HANGUL SYLLABLE MIEUM WE KIYEOK +0x9277 0xBB6E #HANGUL SYLLABLE MIEUM WE SSANGKIYEOK +0x9278 0xBB6F #HANGUL SYLLABLE MIEUM WE KIYEOKSIOS +0x9279 0xBB70 #HANGUL SYLLABLE MIEUM WE NIEUN +0x927A 0xBB71 #HANGUL SYLLABLE MIEUM WE NIEUNCIEUC +0x9281 0xBB72 #HANGUL SYLLABLE MIEUM WE NIEUNHIEUH +0x9282 0xBB73 #HANGUL SYLLABLE MIEUM WE TIKEUT +0x9283 0xBB74 #HANGUL SYLLABLE MIEUM WE RIEUL +0x9284 0xBB75 #HANGUL SYLLABLE MIEUM WE RIEULKIYEOK +0x9285 0xBB76 #HANGUL SYLLABLE MIEUM WE RIEULMIEUM +0x9286 0xBB77 #HANGUL SYLLABLE MIEUM WE RIEULPIEUP +0x9287 0xBB78 #HANGUL SYLLABLE MIEUM WE RIEULSIOS +0x9288 0xBB79 #HANGUL SYLLABLE MIEUM WE RIEULTHIEUTH +0x9289 0xBB7A #HANGUL SYLLABLE MIEUM WE RIEULPHIEUPH +0x928A 0xBB7B #HANGUL SYLLABLE MIEUM WE RIEULHIEUH +0x928B 0xBB7C #HANGUL SYLLABLE MIEUM WE MIEUM +0x928C 0xBB7D #HANGUL SYLLABLE MIEUM WE PIEUP +0x928D 0xBB7E #HANGUL SYLLABLE MIEUM WE PIEUPSIOS +0x928E 0xBB7F #HANGUL SYLLABLE MIEUM WE SIOS +0x928F 0xBB80 #HANGUL SYLLABLE MIEUM WE SSANGSIOS +0x9290 0xBB81 #HANGUL SYLLABLE MIEUM WE IEUNG +0x9291 0xBB82 #HANGUL SYLLABLE MIEUM WE CIEUC +0x9292 0xBB83 #HANGUL SYLLABLE MIEUM WE CHIEUCH +0x9293 0xBB84 #HANGUL SYLLABLE MIEUM WE KHIEUKH +0x9294 0xBB85 #HANGUL SYLLABLE MIEUM WE THIEUTH +0x9295 0xBB86 #HANGUL SYLLABLE MIEUM WE PHIEUPH +0x9296 0xBB87 #HANGUL SYLLABLE MIEUM WE HIEUH +0x9297 0xBB89 #HANGUL SYLLABLE MIEUM WI KIYEOK +0x9298 0xBB8A #HANGUL SYLLABLE MIEUM WI SSANGKIYEOK +0x9299 0xBB8B #HANGUL SYLLABLE MIEUM WI KIYEOKSIOS +0x929A 0xBB8D #HANGUL SYLLABLE MIEUM WI NIEUNCIEUC +0x929B 0xBB8E #HANGUL SYLLABLE MIEUM WI NIEUNHIEUH +0x929C 0xBB8F #HANGUL SYLLABLE MIEUM WI TIKEUT +0x929D 0xBB91 #HANGUL SYLLABLE MIEUM WI RIEULKIYEOK +0x929E 0xBB92 #HANGUL SYLLABLE MIEUM WI RIEULMIEUM +0x929F 0xBB93 #HANGUL SYLLABLE MIEUM WI RIEULPIEUP +0x92A0 0xBB94 #HANGUL SYLLABLE MIEUM WI RIEULSIOS +0x92A1 0xBB95 #HANGUL SYLLABLE MIEUM WI RIEULTHIEUTH +0x92A2 0xBB96 #HANGUL SYLLABLE MIEUM WI RIEULPHIEUPH +0x92A3 0xBB97 #HANGUL SYLLABLE MIEUM WI RIEULHIEUH +0x92A4 0xBB98 #HANGUL SYLLABLE MIEUM WI MIEUM +0x92A5 0xBB99 #HANGUL SYLLABLE MIEUM WI PIEUP +0x92A6 0xBB9A #HANGUL SYLLABLE MIEUM WI PIEUPSIOS +0x92A7 0xBB9B #HANGUL SYLLABLE MIEUM WI SIOS +0x92A8 0xBB9C #HANGUL SYLLABLE MIEUM WI SSANGSIOS +0x92A9 0xBB9D #HANGUL SYLLABLE MIEUM WI IEUNG +0x92AA 0xBB9E #HANGUL SYLLABLE MIEUM WI CIEUC +0x92AB 0xBB9F #HANGUL SYLLABLE MIEUM WI CHIEUCH +0x92AC 0xBBA0 #HANGUL SYLLABLE MIEUM WI KHIEUKH +0x92AD 0xBBA1 #HANGUL SYLLABLE MIEUM WI THIEUTH +0x92AE 0xBBA2 #HANGUL SYLLABLE MIEUM WI PHIEUPH +0x92AF 0xBBA3 #HANGUL SYLLABLE MIEUM WI HIEUH +0x92B0 0xBBA5 #HANGUL SYLLABLE MIEUM YU KIYEOK +0x92B1 0xBBA6 #HANGUL SYLLABLE MIEUM YU SSANGKIYEOK +0x92B2 0xBBA7 #HANGUL SYLLABLE MIEUM YU KIYEOKSIOS +0x92B3 0xBBA9 #HANGUL SYLLABLE MIEUM YU NIEUNCIEUC +0x92B4 0xBBAA #HANGUL SYLLABLE MIEUM YU NIEUNHIEUH +0x92B5 0xBBAB #HANGUL SYLLABLE MIEUM YU TIKEUT +0x92B6 0xBBAD #HANGUL SYLLABLE MIEUM YU RIEULKIYEOK +0x92B7 0xBBAE #HANGUL SYLLABLE MIEUM YU RIEULMIEUM +0x92B8 0xBBAF #HANGUL SYLLABLE MIEUM YU RIEULPIEUP +0x92B9 0xBBB0 #HANGUL SYLLABLE MIEUM YU RIEULSIOS +0x92BA 0xBBB1 #HANGUL SYLLABLE MIEUM YU RIEULTHIEUTH +0x92BB 0xBBB2 #HANGUL SYLLABLE MIEUM YU RIEULPHIEUPH +0x92BC 0xBBB3 #HANGUL SYLLABLE MIEUM YU RIEULHIEUH +0x92BD 0xBBB5 #HANGUL SYLLABLE MIEUM YU PIEUP +0x92BE 0xBBB6 #HANGUL SYLLABLE MIEUM YU PIEUPSIOS +0x92BF 0xBBB8 #HANGUL SYLLABLE MIEUM YU SSANGSIOS +0x92C0 0xBBB9 #HANGUL SYLLABLE MIEUM YU IEUNG +0x92C1 0xBBBA #HANGUL SYLLABLE MIEUM YU CIEUC +0x92C2 0xBBBB #HANGUL SYLLABLE MIEUM YU CHIEUCH +0x92C3 0xBBBC #HANGUL SYLLABLE MIEUM YU KHIEUKH +0x92C4 0xBBBD #HANGUL SYLLABLE MIEUM YU THIEUTH +0x92C5 0xBBBE #HANGUL SYLLABLE MIEUM YU PHIEUPH +0x92C6 0xBBBF #HANGUL SYLLABLE MIEUM YU HIEUH +0x92C7 0xBBC1 #HANGUL SYLLABLE MIEUM EU KIYEOK +0x92C8 0xBBC2 #HANGUL SYLLABLE MIEUM EU SSANGKIYEOK +0x92C9 0xBBC3 #HANGUL SYLLABLE MIEUM EU KIYEOKSIOS +0x92CA 0xBBC5 #HANGUL SYLLABLE MIEUM EU NIEUNCIEUC +0x92CB 0xBBC6 #HANGUL SYLLABLE MIEUM EU NIEUNHIEUH +0x92CC 0xBBC7 #HANGUL SYLLABLE MIEUM EU TIKEUT +0x92CD 0xBBC9 #HANGUL SYLLABLE MIEUM EU RIEULKIYEOK +0x92CE 0xBBCA #HANGUL SYLLABLE MIEUM EU RIEULMIEUM +0x92CF 0xBBCB #HANGUL SYLLABLE MIEUM EU RIEULPIEUP +0x92D0 0xBBCC #HANGUL SYLLABLE MIEUM EU RIEULSIOS +0x92D1 0xBBCD #HANGUL SYLLABLE MIEUM EU RIEULTHIEUTH +0x92D2 0xBBCE #HANGUL SYLLABLE MIEUM EU RIEULPHIEUPH +0x92D3 0xBBCF #HANGUL SYLLABLE MIEUM EU RIEULHIEUH +0x92D4 0xBBD1 #HANGUL SYLLABLE MIEUM EU PIEUP +0x92D5 0xBBD2 #HANGUL SYLLABLE MIEUM EU PIEUPSIOS +0x92D6 0xBBD4 #HANGUL SYLLABLE MIEUM EU SSANGSIOS +0x92D7 0xBBD5 #HANGUL SYLLABLE MIEUM EU IEUNG +0x92D8 0xBBD6 #HANGUL SYLLABLE MIEUM EU CIEUC +0x92D9 0xBBD7 #HANGUL SYLLABLE MIEUM EU CHIEUCH +0x92DA 0xBBD8 #HANGUL SYLLABLE MIEUM EU KHIEUKH +0x92DB 0xBBD9 #HANGUL SYLLABLE MIEUM EU THIEUTH +0x92DC 0xBBDA #HANGUL SYLLABLE MIEUM EU PHIEUPH +0x92DD 0xBBDB #HANGUL SYLLABLE MIEUM EU HIEUH +0x92DE 0xBBDC #HANGUL SYLLABLE MIEUM YI +0x92DF 0xBBDD #HANGUL SYLLABLE MIEUM YI KIYEOK +0x92E0 0xBBDE #HANGUL SYLLABLE MIEUM YI SSANGKIYEOK +0x92E1 0xBBDF #HANGUL SYLLABLE MIEUM YI KIYEOKSIOS +0x92E2 0xBBE0 #HANGUL SYLLABLE MIEUM YI NIEUN +0x92E3 0xBBE1 #HANGUL SYLLABLE MIEUM YI NIEUNCIEUC +0x92E4 0xBBE2 #HANGUL SYLLABLE MIEUM YI NIEUNHIEUH +0x92E5 0xBBE3 #HANGUL SYLLABLE MIEUM YI TIKEUT +0x92E6 0xBBE4 #HANGUL SYLLABLE MIEUM YI RIEUL +0x92E7 0xBBE5 #HANGUL SYLLABLE MIEUM YI RIEULKIYEOK +0x92E8 0xBBE6 #HANGUL SYLLABLE MIEUM YI RIEULMIEUM +0x92E9 0xBBE7 #HANGUL SYLLABLE MIEUM YI RIEULPIEUP +0x92EA 0xBBE8 #HANGUL SYLLABLE MIEUM YI RIEULSIOS +0x92EB 0xBBE9 #HANGUL SYLLABLE MIEUM YI RIEULTHIEUTH +0x92EC 0xBBEA #HANGUL SYLLABLE MIEUM YI RIEULPHIEUPH +0x92ED 0xBBEB #HANGUL SYLLABLE MIEUM YI RIEULHIEUH +0x92EE 0xBBEC #HANGUL SYLLABLE MIEUM YI MIEUM +0x92EF 0xBBED #HANGUL SYLLABLE MIEUM YI PIEUP +0x92F0 0xBBEE #HANGUL SYLLABLE MIEUM YI PIEUPSIOS +0x92F1 0xBBEF #HANGUL SYLLABLE MIEUM YI SIOS +0x92F2 0xBBF0 #HANGUL SYLLABLE MIEUM YI SSANGSIOS +0x92F3 0xBBF1 #HANGUL SYLLABLE MIEUM YI IEUNG +0x92F4 0xBBF2 #HANGUL SYLLABLE MIEUM YI CIEUC +0x92F5 0xBBF3 #HANGUL SYLLABLE MIEUM YI CHIEUCH +0x92F6 0xBBF4 #HANGUL SYLLABLE MIEUM YI KHIEUKH +0x92F7 0xBBF5 #HANGUL SYLLABLE MIEUM YI THIEUTH +0x92F8 0xBBF6 #HANGUL SYLLABLE MIEUM YI PHIEUPH +0x92F9 0xBBF7 #HANGUL SYLLABLE MIEUM YI HIEUH +0x92FA 0xBBFA #HANGUL SYLLABLE MIEUM I SSANGKIYEOK +0x92FB 0xBBFB #HANGUL SYLLABLE MIEUM I KIYEOKSIOS +0x92FC 0xBBFD #HANGUL SYLLABLE MIEUM I NIEUNCIEUC +0x92FD 0xBBFE #HANGUL SYLLABLE MIEUM I NIEUNHIEUH +0x92FE 0xBC01 #HANGUL SYLLABLE MIEUM I RIEULKIYEOK +0x9341 0xBC03 #HANGUL SYLLABLE MIEUM I RIEULPIEUP +0x9342 0xBC04 #HANGUL SYLLABLE MIEUM I RIEULSIOS +0x9343 0xBC05 #HANGUL SYLLABLE MIEUM I RIEULTHIEUTH +0x9344 0xBC06 #HANGUL SYLLABLE MIEUM I RIEULPHIEUPH +0x9345 0xBC07 #HANGUL SYLLABLE MIEUM I RIEULHIEUH +0x9346 0xBC0A #HANGUL SYLLABLE MIEUM I PIEUPSIOS +0x9347 0xBC0E #HANGUL SYLLABLE MIEUM I CIEUC +0x9348 0xBC10 #HANGUL SYLLABLE MIEUM I KHIEUKH +0x9349 0xBC12 #HANGUL SYLLABLE MIEUM I PHIEUPH +0x934A 0xBC13 #HANGUL SYLLABLE MIEUM I HIEUH +0x934B 0xBC19 #HANGUL SYLLABLE PIEUP A NIEUNCIEUC +0x934C 0xBC1A #HANGUL SYLLABLE PIEUP A NIEUNHIEUH +0x934D 0xBC20 #HANGUL SYLLABLE PIEUP A RIEULSIOS +0x934E 0xBC21 #HANGUL SYLLABLE PIEUP A RIEULTHIEUTH +0x934F 0xBC22 #HANGUL SYLLABLE PIEUP A RIEULPHIEUPH +0x9350 0xBC23 #HANGUL SYLLABLE PIEUP A RIEULHIEUH +0x9351 0xBC26 #HANGUL SYLLABLE PIEUP A PIEUPSIOS +0x9352 0xBC28 #HANGUL SYLLABLE PIEUP A SSANGSIOS +0x9353 0xBC2A #HANGUL SYLLABLE PIEUP A CIEUC +0x9354 0xBC2B #HANGUL SYLLABLE PIEUP A CHIEUCH +0x9355 0xBC2C #HANGUL SYLLABLE PIEUP A KHIEUKH +0x9356 0xBC2E #HANGUL SYLLABLE PIEUP A PHIEUPH +0x9357 0xBC2F #HANGUL SYLLABLE PIEUP A HIEUH +0x9358 0xBC32 #HANGUL SYLLABLE PIEUP AE SSANGKIYEOK +0x9359 0xBC33 #HANGUL SYLLABLE PIEUP AE KIYEOKSIOS +0x935A 0xBC35 #HANGUL SYLLABLE PIEUP AE NIEUNCIEUC +0x9361 0xBC36 #HANGUL SYLLABLE PIEUP AE NIEUNHIEUH +0x9362 0xBC37 #HANGUL SYLLABLE PIEUP AE TIKEUT +0x9363 0xBC39 #HANGUL SYLLABLE PIEUP AE RIEULKIYEOK +0x9364 0xBC3A #HANGUL SYLLABLE PIEUP AE RIEULMIEUM +0x9365 0xBC3B #HANGUL SYLLABLE PIEUP AE RIEULPIEUP +0x9366 0xBC3C #HANGUL SYLLABLE PIEUP AE RIEULSIOS +0x9367 0xBC3D #HANGUL SYLLABLE PIEUP AE RIEULTHIEUTH +0x9368 0xBC3E #HANGUL SYLLABLE PIEUP AE RIEULPHIEUPH +0x9369 0xBC3F #HANGUL SYLLABLE PIEUP AE RIEULHIEUH +0x936A 0xBC42 #HANGUL SYLLABLE PIEUP AE PIEUPSIOS +0x936B 0xBC46 #HANGUL SYLLABLE PIEUP AE CIEUC +0x936C 0xBC47 #HANGUL SYLLABLE PIEUP AE CHIEUCH +0x936D 0xBC48 #HANGUL SYLLABLE PIEUP AE KHIEUKH +0x936E 0xBC4A #HANGUL SYLLABLE PIEUP AE PHIEUPH +0x936F 0xBC4B #HANGUL SYLLABLE PIEUP AE HIEUH +0x9370 0xBC4E #HANGUL SYLLABLE PIEUP YA SSANGKIYEOK +0x9371 0xBC4F #HANGUL SYLLABLE PIEUP YA KIYEOKSIOS +0x9372 0xBC51 #HANGUL SYLLABLE PIEUP YA NIEUNCIEUC +0x9373 0xBC52 #HANGUL SYLLABLE PIEUP YA NIEUNHIEUH +0x9374 0xBC53 #HANGUL SYLLABLE PIEUP YA TIKEUT +0x9375 0xBC54 #HANGUL SYLLABLE PIEUP YA RIEUL +0x9376 0xBC55 #HANGUL SYLLABLE PIEUP YA RIEULKIYEOK +0x9377 0xBC56 #HANGUL SYLLABLE PIEUP YA RIEULMIEUM +0x9378 0xBC57 #HANGUL SYLLABLE PIEUP YA RIEULPIEUP +0x9379 0xBC58 #HANGUL SYLLABLE PIEUP YA RIEULSIOS +0x937A 0xBC59 #HANGUL SYLLABLE PIEUP YA RIEULTHIEUTH +0x9381 0xBC5A #HANGUL SYLLABLE PIEUP YA RIEULPHIEUPH +0x9382 0xBC5B #HANGUL SYLLABLE PIEUP YA RIEULHIEUH +0x9383 0xBC5C #HANGUL SYLLABLE PIEUP YA MIEUM +0x9384 0xBC5E #HANGUL SYLLABLE PIEUP YA PIEUPSIOS +0x9385 0xBC5F #HANGUL SYLLABLE PIEUP YA SIOS +0x9386 0xBC60 #HANGUL SYLLABLE PIEUP YA SSANGSIOS +0x9387 0xBC61 #HANGUL SYLLABLE PIEUP YA IEUNG +0x9388 0xBC62 #HANGUL SYLLABLE PIEUP YA CIEUC +0x9389 0xBC63 #HANGUL SYLLABLE PIEUP YA CHIEUCH +0x938A 0xBC64 #HANGUL SYLLABLE PIEUP YA KHIEUKH +0x938B 0xBC65 #HANGUL SYLLABLE PIEUP YA THIEUTH +0x938C 0xBC66 #HANGUL SYLLABLE PIEUP YA PHIEUPH +0x938D 0xBC67 #HANGUL SYLLABLE PIEUP YA HIEUH +0x938E 0xBC68 #HANGUL SYLLABLE PIEUP YAE +0x938F 0xBC69 #HANGUL SYLLABLE PIEUP YAE KIYEOK +0x9390 0xBC6A #HANGUL SYLLABLE PIEUP YAE SSANGKIYEOK +0x9391 0xBC6B #HANGUL SYLLABLE PIEUP YAE KIYEOKSIOS +0x9392 0xBC6C #HANGUL SYLLABLE PIEUP YAE NIEUN +0x9393 0xBC6D #HANGUL SYLLABLE PIEUP YAE NIEUNCIEUC +0x9394 0xBC6E #HANGUL SYLLABLE PIEUP YAE NIEUNHIEUH +0x9395 0xBC6F #HANGUL SYLLABLE PIEUP YAE TIKEUT +0x9396 0xBC70 #HANGUL SYLLABLE PIEUP YAE RIEUL +0x9397 0xBC71 #HANGUL SYLLABLE PIEUP YAE RIEULKIYEOK +0x9398 0xBC72 #HANGUL SYLLABLE PIEUP YAE RIEULMIEUM +0x9399 0xBC73 #HANGUL SYLLABLE PIEUP YAE RIEULPIEUP +0x939A 0xBC74 #HANGUL SYLLABLE PIEUP YAE RIEULSIOS +0x939B 0xBC75 #HANGUL SYLLABLE PIEUP YAE RIEULTHIEUTH +0x939C 0xBC76 #HANGUL SYLLABLE PIEUP YAE RIEULPHIEUPH +0x939D 0xBC77 #HANGUL SYLLABLE PIEUP YAE RIEULHIEUH +0x939E 0xBC78 #HANGUL SYLLABLE PIEUP YAE MIEUM +0x939F 0xBC79 #HANGUL SYLLABLE PIEUP YAE PIEUP +0x93A0 0xBC7A #HANGUL SYLLABLE PIEUP YAE PIEUPSIOS +0x93A1 0xBC7B #HANGUL SYLLABLE PIEUP YAE SIOS +0x93A2 0xBC7C #HANGUL SYLLABLE PIEUP YAE SSANGSIOS +0x93A3 0xBC7D #HANGUL SYLLABLE PIEUP YAE IEUNG +0x93A4 0xBC7E #HANGUL SYLLABLE PIEUP YAE CIEUC +0x93A5 0xBC7F #HANGUL SYLLABLE PIEUP YAE CHIEUCH +0x93A6 0xBC80 #HANGUL SYLLABLE PIEUP YAE KHIEUKH +0x93A7 0xBC81 #HANGUL SYLLABLE PIEUP YAE THIEUTH +0x93A8 0xBC82 #HANGUL SYLLABLE PIEUP YAE PHIEUPH +0x93A9 0xBC83 #HANGUL SYLLABLE PIEUP YAE HIEUH +0x93AA 0xBC86 #HANGUL SYLLABLE PIEUP EO SSANGKIYEOK +0x93AB 0xBC87 #HANGUL SYLLABLE PIEUP EO KIYEOKSIOS +0x93AC 0xBC89 #HANGUL SYLLABLE PIEUP EO NIEUNCIEUC +0x93AD 0xBC8A #HANGUL SYLLABLE PIEUP EO NIEUNHIEUH +0x93AE 0xBC8D #HANGUL SYLLABLE PIEUP EO RIEULKIYEOK +0x93AF 0xBC8F #HANGUL SYLLABLE PIEUP EO RIEULPIEUP +0x93B0 0xBC90 #HANGUL SYLLABLE PIEUP EO RIEULSIOS +0x93B1 0xBC91 #HANGUL SYLLABLE PIEUP EO RIEULTHIEUTH +0x93B2 0xBC92 #HANGUL SYLLABLE PIEUP EO RIEULPHIEUPH +0x93B3 0xBC93 #HANGUL SYLLABLE PIEUP EO RIEULHIEUH +0x93B4 0xBC96 #HANGUL SYLLABLE PIEUP EO PIEUPSIOS +0x93B5 0xBC98 #HANGUL SYLLABLE PIEUP EO SSANGSIOS +0x93B6 0xBC9B #HANGUL SYLLABLE PIEUP EO CHIEUCH +0x93B7 0xBC9C #HANGUL SYLLABLE PIEUP EO KHIEUKH +0x93B8 0xBC9D #HANGUL SYLLABLE PIEUP EO THIEUTH +0x93B9 0xBC9E #HANGUL SYLLABLE PIEUP EO PHIEUPH +0x93BA 0xBC9F #HANGUL SYLLABLE PIEUP EO HIEUH +0x93BB 0xBCA2 #HANGUL SYLLABLE PIEUP E SSANGKIYEOK +0x93BC 0xBCA3 #HANGUL SYLLABLE PIEUP E KIYEOKSIOS +0x93BD 0xBCA5 #HANGUL SYLLABLE PIEUP E NIEUNCIEUC +0x93BE 0xBCA6 #HANGUL SYLLABLE PIEUP E NIEUNHIEUH +0x93BF 0xBCA9 #HANGUL SYLLABLE PIEUP E RIEULKIYEOK +0x93C0 0xBCAA #HANGUL SYLLABLE PIEUP E RIEULMIEUM +0x93C1 0xBCAB #HANGUL SYLLABLE PIEUP E RIEULPIEUP +0x93C2 0xBCAC #HANGUL SYLLABLE PIEUP E RIEULSIOS +0x93C3 0xBCAD #HANGUL SYLLABLE PIEUP E RIEULTHIEUTH +0x93C4 0xBCAE #HANGUL SYLLABLE PIEUP E RIEULPHIEUPH +0x93C5 0xBCAF #HANGUL SYLLABLE PIEUP E RIEULHIEUH +0x93C6 0xBCB2 #HANGUL SYLLABLE PIEUP E PIEUPSIOS +0x93C7 0xBCB6 #HANGUL SYLLABLE PIEUP E CIEUC +0x93C8 0xBCB7 #HANGUL SYLLABLE PIEUP E CHIEUCH +0x93C9 0xBCB8 #HANGUL SYLLABLE PIEUP E KHIEUKH +0x93CA 0xBCB9 #HANGUL SYLLABLE PIEUP E THIEUTH +0x93CB 0xBCBA #HANGUL SYLLABLE PIEUP E PHIEUPH +0x93CC 0xBCBB #HANGUL SYLLABLE PIEUP E HIEUH +0x93CD 0xBCBE #HANGUL SYLLABLE PIEUP YEO SSANGKIYEOK +0x93CE 0xBCBF #HANGUL SYLLABLE PIEUP YEO KIYEOKSIOS +0x93CF 0xBCC1 #HANGUL SYLLABLE PIEUP YEO NIEUNCIEUC +0x93D0 0xBCC2 #HANGUL SYLLABLE PIEUP YEO NIEUNHIEUH +0x93D1 0xBCC3 #HANGUL SYLLABLE PIEUP YEO TIKEUT +0x93D2 0xBCC5 #HANGUL SYLLABLE PIEUP YEO RIEULKIYEOK +0x93D3 0xBCC6 #HANGUL SYLLABLE PIEUP YEO RIEULMIEUM +0x93D4 0xBCC7 #HANGUL SYLLABLE PIEUP YEO RIEULPIEUP +0x93D5 0xBCC8 #HANGUL SYLLABLE PIEUP YEO RIEULSIOS +0x93D6 0xBCC9 #HANGUL SYLLABLE PIEUP YEO RIEULTHIEUTH +0x93D7 0xBCCA #HANGUL SYLLABLE PIEUP YEO RIEULPHIEUPH +0x93D8 0xBCCB #HANGUL SYLLABLE PIEUP YEO RIEULHIEUH +0x93D9 0xBCCC #HANGUL SYLLABLE PIEUP YEO MIEUM +0x93DA 0xBCCE #HANGUL SYLLABLE PIEUP YEO PIEUPSIOS +0x93DB 0xBCD2 #HANGUL SYLLABLE PIEUP YEO CIEUC +0x93DC 0xBCD3 #HANGUL SYLLABLE PIEUP YEO CHIEUCH +0x93DD 0xBCD4 #HANGUL SYLLABLE PIEUP YEO KHIEUKH +0x93DE 0xBCD6 #HANGUL SYLLABLE PIEUP YEO PHIEUPH +0x93DF 0xBCD7 #HANGUL SYLLABLE PIEUP YEO HIEUH +0x93E0 0xBCD9 #HANGUL SYLLABLE PIEUP YE KIYEOK +0x93E1 0xBCDA #HANGUL SYLLABLE PIEUP YE SSANGKIYEOK +0x93E2 0xBCDB #HANGUL SYLLABLE PIEUP YE KIYEOKSIOS +0x93E3 0xBCDD #HANGUL SYLLABLE PIEUP YE NIEUNCIEUC +0x93E4 0xBCDE #HANGUL SYLLABLE PIEUP YE NIEUNHIEUH +0x93E5 0xBCDF #HANGUL SYLLABLE PIEUP YE TIKEUT +0x93E6 0xBCE0 #HANGUL SYLLABLE PIEUP YE RIEUL +0x93E7 0xBCE1 #HANGUL SYLLABLE PIEUP YE RIEULKIYEOK +0x93E8 0xBCE2 #HANGUL SYLLABLE PIEUP YE RIEULMIEUM +0x93E9 0xBCE3 #HANGUL SYLLABLE PIEUP YE RIEULPIEUP +0x93EA 0xBCE4 #HANGUL SYLLABLE PIEUP YE RIEULSIOS +0x93EB 0xBCE5 #HANGUL SYLLABLE PIEUP YE RIEULTHIEUTH +0x93EC 0xBCE6 #HANGUL SYLLABLE PIEUP YE RIEULPHIEUPH +0x93ED 0xBCE7 #HANGUL SYLLABLE PIEUP YE RIEULHIEUH +0x93EE 0xBCE8 #HANGUL SYLLABLE PIEUP YE MIEUM +0x93EF 0xBCE9 #HANGUL SYLLABLE PIEUP YE PIEUP +0x93F0 0xBCEA #HANGUL SYLLABLE PIEUP YE PIEUPSIOS +0x93F1 0xBCEB #HANGUL SYLLABLE PIEUP YE SIOS +0x93F2 0xBCEC #HANGUL SYLLABLE PIEUP YE SSANGSIOS +0x93F3 0xBCED #HANGUL SYLLABLE PIEUP YE IEUNG +0x93F4 0xBCEE #HANGUL SYLLABLE PIEUP YE CIEUC +0x93F5 0xBCEF #HANGUL SYLLABLE PIEUP YE CHIEUCH +0x93F6 0xBCF0 #HANGUL SYLLABLE PIEUP YE KHIEUKH +0x93F7 0xBCF1 #HANGUL SYLLABLE PIEUP YE THIEUTH +0x93F8 0xBCF2 #HANGUL SYLLABLE PIEUP YE PHIEUPH +0x93F9 0xBCF3 #HANGUL SYLLABLE PIEUP YE HIEUH +0x93FA 0xBCF7 #HANGUL SYLLABLE PIEUP O KIYEOKSIOS +0x93FB 0xBCF9 #HANGUL SYLLABLE PIEUP O NIEUNCIEUC +0x93FC 0xBCFA #HANGUL SYLLABLE PIEUP O NIEUNHIEUH +0x93FD 0xBCFB #HANGUL SYLLABLE PIEUP O TIKEUT +0x93FE 0xBCFD #HANGUL SYLLABLE PIEUP O RIEULKIYEOK +0x9441 0xBCFE #HANGUL SYLLABLE PIEUP O RIEULMIEUM +0x9442 0xBCFF #HANGUL SYLLABLE PIEUP O RIEULPIEUP +0x9443 0xBD00 #HANGUL SYLLABLE PIEUP O RIEULSIOS +0x9444 0xBD01 #HANGUL SYLLABLE PIEUP O RIEULTHIEUTH +0x9445 0xBD02 #HANGUL SYLLABLE PIEUP O RIEULPHIEUPH +0x9446 0xBD03 #HANGUL SYLLABLE PIEUP O RIEULHIEUH +0x9447 0xBD06 #HANGUL SYLLABLE PIEUP O PIEUPSIOS +0x9448 0xBD08 #HANGUL SYLLABLE PIEUP O SSANGSIOS +0x9449 0xBD0A #HANGUL SYLLABLE PIEUP O CIEUC +0x944A 0xBD0B #HANGUL SYLLABLE PIEUP O CHIEUCH +0x944B 0xBD0C #HANGUL SYLLABLE PIEUP O KHIEUKH +0x944C 0xBD0D #HANGUL SYLLABLE PIEUP O THIEUTH +0x944D 0xBD0E #HANGUL SYLLABLE PIEUP O PHIEUPH +0x944E 0xBD0F #HANGUL SYLLABLE PIEUP O HIEUH +0x944F 0xBD11 #HANGUL SYLLABLE PIEUP WA KIYEOK +0x9450 0xBD12 #HANGUL SYLLABLE PIEUP WA SSANGKIYEOK +0x9451 0xBD13 #HANGUL SYLLABLE PIEUP WA KIYEOKSIOS +0x9452 0xBD15 #HANGUL SYLLABLE PIEUP WA NIEUNCIEUC +0x9453 0xBD16 #HANGUL SYLLABLE PIEUP WA NIEUNHIEUH +0x9454 0xBD17 #HANGUL SYLLABLE PIEUP WA TIKEUT +0x9455 0xBD18 #HANGUL SYLLABLE PIEUP WA RIEUL +0x9456 0xBD19 #HANGUL SYLLABLE PIEUP WA RIEULKIYEOK +0x9457 0xBD1A #HANGUL SYLLABLE PIEUP WA RIEULMIEUM +0x9458 0xBD1B #HANGUL SYLLABLE PIEUP WA RIEULPIEUP +0x9459 0xBD1C #HANGUL SYLLABLE PIEUP WA RIEULSIOS +0x945A 0xBD1D #HANGUL SYLLABLE PIEUP WA RIEULTHIEUTH +0x9461 0xBD1E #HANGUL SYLLABLE PIEUP WA RIEULPHIEUPH +0x9462 0xBD1F #HANGUL SYLLABLE PIEUP WA RIEULHIEUH +0x9463 0xBD20 #HANGUL SYLLABLE PIEUP WA MIEUM +0x9464 0xBD21 #HANGUL SYLLABLE PIEUP WA PIEUP +0x9465 0xBD22 #HANGUL SYLLABLE PIEUP WA PIEUPSIOS +0x9466 0xBD23 #HANGUL SYLLABLE PIEUP WA SIOS +0x9467 0xBD25 #HANGUL SYLLABLE PIEUP WA IEUNG +0x9468 0xBD26 #HANGUL SYLLABLE PIEUP WA CIEUC +0x9469 0xBD27 #HANGUL SYLLABLE PIEUP WA CHIEUCH +0x946A 0xBD28 #HANGUL SYLLABLE PIEUP WA KHIEUKH +0x946B 0xBD29 #HANGUL SYLLABLE PIEUP WA THIEUTH +0x946C 0xBD2A #HANGUL SYLLABLE PIEUP WA PHIEUPH +0x946D 0xBD2B #HANGUL SYLLABLE PIEUP WA HIEUH +0x946E 0xBD2D #HANGUL SYLLABLE PIEUP WAE KIYEOK +0x946F 0xBD2E #HANGUL SYLLABLE PIEUP WAE SSANGKIYEOK +0x9470 0xBD2F #HANGUL SYLLABLE PIEUP WAE KIYEOKSIOS +0x9471 0xBD30 #HANGUL SYLLABLE PIEUP WAE NIEUN +0x9472 0xBD31 #HANGUL SYLLABLE PIEUP WAE NIEUNCIEUC +0x9473 0xBD32 #HANGUL SYLLABLE PIEUP WAE NIEUNHIEUH +0x9474 0xBD33 #HANGUL SYLLABLE PIEUP WAE TIKEUT +0x9475 0xBD34 #HANGUL SYLLABLE PIEUP WAE RIEUL +0x9476 0xBD35 #HANGUL SYLLABLE PIEUP WAE RIEULKIYEOK +0x9477 0xBD36 #HANGUL SYLLABLE PIEUP WAE RIEULMIEUM +0x9478 0xBD37 #HANGUL SYLLABLE PIEUP WAE RIEULPIEUP +0x9479 0xBD38 #HANGUL SYLLABLE PIEUP WAE RIEULSIOS +0x947A 0xBD39 #HANGUL SYLLABLE PIEUP WAE RIEULTHIEUTH +0x9481 0xBD3A #HANGUL SYLLABLE PIEUP WAE RIEULPHIEUPH +0x9482 0xBD3B #HANGUL SYLLABLE PIEUP WAE RIEULHIEUH +0x9483 0xBD3C #HANGUL SYLLABLE PIEUP WAE MIEUM +0x9484 0xBD3D #HANGUL SYLLABLE PIEUP WAE PIEUP +0x9485 0xBD3E #HANGUL SYLLABLE PIEUP WAE PIEUPSIOS +0x9486 0xBD3F #HANGUL SYLLABLE PIEUP WAE SIOS +0x9487 0xBD41 #HANGUL SYLLABLE PIEUP WAE IEUNG +0x9488 0xBD42 #HANGUL SYLLABLE PIEUP WAE CIEUC +0x9489 0xBD43 #HANGUL SYLLABLE PIEUP WAE CHIEUCH +0x948A 0xBD44 #HANGUL SYLLABLE PIEUP WAE KHIEUKH +0x948B 0xBD45 #HANGUL SYLLABLE PIEUP WAE THIEUTH +0x948C 0xBD46 #HANGUL SYLLABLE PIEUP WAE PHIEUPH +0x948D 0xBD47 #HANGUL SYLLABLE PIEUP WAE HIEUH +0x948E 0xBD4A #HANGUL SYLLABLE PIEUP OE SSANGKIYEOK +0x948F 0xBD4B #HANGUL SYLLABLE PIEUP OE KIYEOKSIOS +0x9490 0xBD4D #HANGUL SYLLABLE PIEUP OE NIEUNCIEUC +0x9491 0xBD4E #HANGUL SYLLABLE PIEUP OE NIEUNHIEUH +0x9492 0xBD4F #HANGUL SYLLABLE PIEUP OE TIKEUT +0x9493 0xBD51 #HANGUL SYLLABLE PIEUP OE RIEULKIYEOK +0x9494 0xBD52 #HANGUL SYLLABLE PIEUP OE RIEULMIEUM +0x9495 0xBD53 #HANGUL SYLLABLE PIEUP OE RIEULPIEUP +0x9496 0xBD54 #HANGUL SYLLABLE PIEUP OE RIEULSIOS +0x9497 0xBD55 #HANGUL SYLLABLE PIEUP OE RIEULTHIEUTH +0x9498 0xBD56 #HANGUL SYLLABLE PIEUP OE RIEULPHIEUPH +0x9499 0xBD57 #HANGUL SYLLABLE PIEUP OE RIEULHIEUH +0x949A 0xBD5A #HANGUL SYLLABLE PIEUP OE PIEUPSIOS +0x949B 0xBD5B #HANGUL SYLLABLE PIEUP OE SIOS +0x949C 0xBD5C #HANGUL SYLLABLE PIEUP OE SSANGSIOS +0x949D 0xBD5D #HANGUL SYLLABLE PIEUP OE IEUNG +0x949E 0xBD5E #HANGUL SYLLABLE PIEUP OE CIEUC +0x949F 0xBD5F #HANGUL SYLLABLE PIEUP OE CHIEUCH +0x94A0 0xBD60 #HANGUL SYLLABLE PIEUP OE KHIEUKH +0x94A1 0xBD61 #HANGUL SYLLABLE PIEUP OE THIEUTH +0x94A2 0xBD62 #HANGUL SYLLABLE PIEUP OE PHIEUPH +0x94A3 0xBD63 #HANGUL SYLLABLE PIEUP OE HIEUH +0x94A4 0xBD65 #HANGUL SYLLABLE PIEUP YO KIYEOK +0x94A5 0xBD66 #HANGUL SYLLABLE PIEUP YO SSANGKIYEOK +0x94A6 0xBD67 #HANGUL SYLLABLE PIEUP YO KIYEOKSIOS +0x94A7 0xBD69 #HANGUL SYLLABLE PIEUP YO NIEUNCIEUC +0x94A8 0xBD6A #HANGUL SYLLABLE PIEUP YO NIEUNHIEUH +0x94A9 0xBD6B #HANGUL SYLLABLE PIEUP YO TIKEUT +0x94AA 0xBD6C #HANGUL SYLLABLE PIEUP YO RIEUL +0x94AB 0xBD6D #HANGUL SYLLABLE PIEUP YO RIEULKIYEOK +0x94AC 0xBD6E #HANGUL SYLLABLE PIEUP YO RIEULMIEUM +0x94AD 0xBD6F #HANGUL SYLLABLE PIEUP YO RIEULPIEUP +0x94AE 0xBD70 #HANGUL SYLLABLE PIEUP YO RIEULSIOS +0x94AF 0xBD71 #HANGUL SYLLABLE PIEUP YO RIEULTHIEUTH +0x94B0 0xBD72 #HANGUL SYLLABLE PIEUP YO RIEULPHIEUPH +0x94B1 0xBD73 #HANGUL SYLLABLE PIEUP YO RIEULHIEUH +0x94B2 0xBD74 #HANGUL SYLLABLE PIEUP YO MIEUM +0x94B3 0xBD75 #HANGUL SYLLABLE PIEUP YO PIEUP +0x94B4 0xBD76 #HANGUL SYLLABLE PIEUP YO PIEUPSIOS +0x94B5 0xBD77 #HANGUL SYLLABLE PIEUP YO SIOS +0x94B6 0xBD78 #HANGUL SYLLABLE PIEUP YO SSANGSIOS +0x94B7 0xBD79 #HANGUL SYLLABLE PIEUP YO IEUNG +0x94B8 0xBD7A #HANGUL SYLLABLE PIEUP YO CIEUC +0x94B9 0xBD7B #HANGUL SYLLABLE PIEUP YO CHIEUCH +0x94BA 0xBD7C #HANGUL SYLLABLE PIEUP YO KHIEUKH +0x94BB 0xBD7D #HANGUL SYLLABLE PIEUP YO THIEUTH +0x94BC 0xBD7E #HANGUL SYLLABLE PIEUP YO PHIEUPH +0x94BD 0xBD7F #HANGUL SYLLABLE PIEUP YO HIEUH +0x94BE 0xBD82 #HANGUL SYLLABLE PIEUP U SSANGKIYEOK +0x94BF 0xBD83 #HANGUL SYLLABLE PIEUP U KIYEOKSIOS +0x94C0 0xBD85 #HANGUL SYLLABLE PIEUP U NIEUNCIEUC +0x94C1 0xBD86 #HANGUL SYLLABLE PIEUP U NIEUNHIEUH +0x94C2 0xBD8B #HANGUL SYLLABLE PIEUP U RIEULPIEUP +0x94C3 0xBD8C #HANGUL SYLLABLE PIEUP U RIEULSIOS +0x94C4 0xBD8D #HANGUL SYLLABLE PIEUP U RIEULTHIEUTH +0x94C5 0xBD8E #HANGUL SYLLABLE PIEUP U RIEULPHIEUPH +0x94C6 0xBD8F #HANGUL SYLLABLE PIEUP U RIEULHIEUH +0x94C7 0xBD92 #HANGUL SYLLABLE PIEUP U PIEUPSIOS +0x94C8 0xBD94 #HANGUL SYLLABLE PIEUP U SSANGSIOS +0x94C9 0xBD96 #HANGUL SYLLABLE PIEUP U CIEUC +0x94CA 0xBD97 #HANGUL SYLLABLE PIEUP U CHIEUCH +0x94CB 0xBD98 #HANGUL SYLLABLE PIEUP U KHIEUKH +0x94CC 0xBD9B #HANGUL SYLLABLE PIEUP U HIEUH +0x94CD 0xBD9D #HANGUL SYLLABLE PIEUP WEO KIYEOK +0x94CE 0xBD9E #HANGUL SYLLABLE PIEUP WEO SSANGKIYEOK +0x94CF 0xBD9F #HANGUL SYLLABLE PIEUP WEO KIYEOKSIOS +0x94D0 0xBDA0 #HANGUL SYLLABLE PIEUP WEO NIEUN +0x94D1 0xBDA1 #HANGUL SYLLABLE PIEUP WEO NIEUNCIEUC +0x94D2 0xBDA2 #HANGUL SYLLABLE PIEUP WEO NIEUNHIEUH +0x94D3 0xBDA3 #HANGUL SYLLABLE PIEUP WEO TIKEUT +0x94D4 0xBDA5 #HANGUL SYLLABLE PIEUP WEO RIEULKIYEOK +0x94D5 0xBDA6 #HANGUL SYLLABLE PIEUP WEO RIEULMIEUM +0x94D6 0xBDA7 #HANGUL SYLLABLE PIEUP WEO RIEULPIEUP +0x94D7 0xBDA8 #HANGUL SYLLABLE PIEUP WEO RIEULSIOS +0x94D8 0xBDA9 #HANGUL SYLLABLE PIEUP WEO RIEULTHIEUTH +0x94D9 0xBDAA #HANGUL SYLLABLE PIEUP WEO RIEULPHIEUPH +0x94DA 0xBDAB #HANGUL SYLLABLE PIEUP WEO RIEULHIEUH +0x94DB 0xBDAC #HANGUL SYLLABLE PIEUP WEO MIEUM +0x94DC 0xBDAD #HANGUL SYLLABLE PIEUP WEO PIEUP +0x94DD 0xBDAE #HANGUL SYLLABLE PIEUP WEO PIEUPSIOS +0x94DE 0xBDAF #HANGUL SYLLABLE PIEUP WEO SIOS +0x94DF 0xBDB1 #HANGUL SYLLABLE PIEUP WEO IEUNG +0x94E0 0xBDB2 #HANGUL SYLLABLE PIEUP WEO CIEUC +0x94E1 0xBDB3 #HANGUL SYLLABLE PIEUP WEO CHIEUCH +0x94E2 0xBDB4 #HANGUL SYLLABLE PIEUP WEO KHIEUKH +0x94E3 0xBDB5 #HANGUL SYLLABLE PIEUP WEO THIEUTH +0x94E4 0xBDB6 #HANGUL SYLLABLE PIEUP WEO PHIEUPH +0x94E5 0xBDB7 #HANGUL SYLLABLE PIEUP WEO HIEUH +0x94E6 0xBDB9 #HANGUL SYLLABLE PIEUP WE KIYEOK +0x94E7 0xBDBA #HANGUL SYLLABLE PIEUP WE SSANGKIYEOK +0x94E8 0xBDBB #HANGUL SYLLABLE PIEUP WE KIYEOKSIOS +0x94E9 0xBDBC #HANGUL SYLLABLE PIEUP WE NIEUN +0x94EA 0xBDBD #HANGUL SYLLABLE PIEUP WE NIEUNCIEUC +0x94EB 0xBDBE #HANGUL SYLLABLE PIEUP WE NIEUNHIEUH +0x94EC 0xBDBF #HANGUL SYLLABLE PIEUP WE TIKEUT +0x94ED 0xBDC0 #HANGUL SYLLABLE PIEUP WE RIEUL +0x94EE 0xBDC1 #HANGUL SYLLABLE PIEUP WE RIEULKIYEOK +0x94EF 0xBDC2 #HANGUL SYLLABLE PIEUP WE RIEULMIEUM +0x94F0 0xBDC3 #HANGUL SYLLABLE PIEUP WE RIEULPIEUP +0x94F1 0xBDC4 #HANGUL SYLLABLE PIEUP WE RIEULSIOS +0x94F2 0xBDC5 #HANGUL SYLLABLE PIEUP WE RIEULTHIEUTH +0x94F3 0xBDC6 #HANGUL SYLLABLE PIEUP WE RIEULPHIEUPH +0x94F4 0xBDC7 #HANGUL SYLLABLE PIEUP WE RIEULHIEUH +0x94F5 0xBDC8 #HANGUL SYLLABLE PIEUP WE MIEUM +0x94F6 0xBDC9 #HANGUL SYLLABLE PIEUP WE PIEUP +0x94F7 0xBDCA #HANGUL SYLLABLE PIEUP WE PIEUPSIOS +0x94F8 0xBDCB #HANGUL SYLLABLE PIEUP WE SIOS +0x94F9 0xBDCC #HANGUL SYLLABLE PIEUP WE SSANGSIOS +0x94FA 0xBDCD #HANGUL SYLLABLE PIEUP WE IEUNG +0x94FB 0xBDCE #HANGUL SYLLABLE PIEUP WE CIEUC +0x94FC 0xBDCF #HANGUL SYLLABLE PIEUP WE CHIEUCH +0x94FD 0xBDD0 #HANGUL SYLLABLE PIEUP WE KHIEUKH +0x94FE 0xBDD1 #HANGUL SYLLABLE PIEUP WE THIEUTH +0x9541 0xBDD2 #HANGUL SYLLABLE PIEUP WE PHIEUPH +0x9542 0xBDD3 #HANGUL SYLLABLE PIEUP WE HIEUH +0x9543 0xBDD6 #HANGUL SYLLABLE PIEUP WI SSANGKIYEOK +0x9544 0xBDD7 #HANGUL SYLLABLE PIEUP WI KIYEOKSIOS +0x9545 0xBDD9 #HANGUL SYLLABLE PIEUP WI NIEUNCIEUC +0x9546 0xBDDA #HANGUL SYLLABLE PIEUP WI NIEUNHIEUH +0x9547 0xBDDB #HANGUL SYLLABLE PIEUP WI TIKEUT +0x9548 0xBDDD #HANGUL SYLLABLE PIEUP WI RIEULKIYEOK +0x9549 0xBDDE #HANGUL SYLLABLE PIEUP WI RIEULMIEUM +0x954A 0xBDDF #HANGUL SYLLABLE PIEUP WI RIEULPIEUP +0x954B 0xBDE0 #HANGUL SYLLABLE PIEUP WI RIEULSIOS +0x954C 0xBDE1 #HANGUL SYLLABLE PIEUP WI RIEULTHIEUTH +0x954D 0xBDE2 #HANGUL SYLLABLE PIEUP WI RIEULPHIEUPH +0x954E 0xBDE3 #HANGUL SYLLABLE PIEUP WI RIEULHIEUH +0x954F 0xBDE4 #HANGUL SYLLABLE PIEUP WI MIEUM +0x9550 0xBDE5 #HANGUL SYLLABLE PIEUP WI PIEUP +0x9551 0xBDE6 #HANGUL SYLLABLE PIEUP WI PIEUPSIOS +0x9552 0xBDE7 #HANGUL SYLLABLE PIEUP WI SIOS +0x9553 0xBDE8 #HANGUL SYLLABLE PIEUP WI SSANGSIOS +0x9554 0xBDEA #HANGUL SYLLABLE PIEUP WI CIEUC +0x9555 0xBDEB #HANGUL SYLLABLE PIEUP WI CHIEUCH +0x9556 0xBDEC #HANGUL SYLLABLE PIEUP WI KHIEUKH +0x9557 0xBDED #HANGUL SYLLABLE PIEUP WI THIEUTH +0x9558 0xBDEE #HANGUL SYLLABLE PIEUP WI PHIEUPH +0x9559 0xBDEF #HANGUL SYLLABLE PIEUP WI HIEUH +0x955A 0xBDF1 #HANGUL SYLLABLE PIEUP YU KIYEOK +0x9561 0xBDF2 #HANGUL SYLLABLE PIEUP YU SSANGKIYEOK +0x9562 0xBDF3 #HANGUL SYLLABLE PIEUP YU KIYEOKSIOS +0x9563 0xBDF5 #HANGUL SYLLABLE PIEUP YU NIEUNCIEUC +0x9564 0xBDF6 #HANGUL SYLLABLE PIEUP YU NIEUNHIEUH +0x9565 0xBDF7 #HANGUL SYLLABLE PIEUP YU TIKEUT +0x9566 0xBDF9 #HANGUL SYLLABLE PIEUP YU RIEULKIYEOK +0x9567 0xBDFA #HANGUL SYLLABLE PIEUP YU RIEULMIEUM +0x9568 0xBDFB #HANGUL SYLLABLE PIEUP YU RIEULPIEUP +0x9569 0xBDFC #HANGUL SYLLABLE PIEUP YU RIEULSIOS +0x956A 0xBDFD #HANGUL SYLLABLE PIEUP YU RIEULTHIEUTH +0x956B 0xBDFE #HANGUL SYLLABLE PIEUP YU RIEULPHIEUPH +0x956C 0xBDFF #HANGUL SYLLABLE PIEUP YU RIEULHIEUH +0x956D 0xBE01 #HANGUL SYLLABLE PIEUP YU PIEUP +0x956E 0xBE02 #HANGUL SYLLABLE PIEUP YU PIEUPSIOS +0x956F 0xBE04 #HANGUL SYLLABLE PIEUP YU SSANGSIOS +0x9570 0xBE06 #HANGUL SYLLABLE PIEUP YU CIEUC +0x9571 0xBE07 #HANGUL SYLLABLE PIEUP YU CHIEUCH +0x9572 0xBE08 #HANGUL SYLLABLE PIEUP YU KHIEUKH +0x9573 0xBE09 #HANGUL SYLLABLE PIEUP YU THIEUTH +0x9574 0xBE0A #HANGUL SYLLABLE PIEUP YU PHIEUPH +0x9575 0xBE0B #HANGUL SYLLABLE PIEUP YU HIEUH +0x9576 0xBE0E #HANGUL SYLLABLE PIEUP EU SSANGKIYEOK +0x9577 0xBE0F #HANGUL SYLLABLE PIEUP EU KIYEOKSIOS +0x9578 0xBE11 #HANGUL SYLLABLE PIEUP EU NIEUNCIEUC +0x9579 0xBE12 #HANGUL SYLLABLE PIEUP EU NIEUNHIEUH +0x957A 0xBE13 #HANGUL SYLLABLE PIEUP EU TIKEUT +0x9581 0xBE15 #HANGUL SYLLABLE PIEUP EU RIEULKIYEOK +0x9582 0xBE16 #HANGUL SYLLABLE PIEUP EU RIEULMIEUM +0x9583 0xBE17 #HANGUL SYLLABLE PIEUP EU RIEULPIEUP +0x9584 0xBE18 #HANGUL SYLLABLE PIEUP EU RIEULSIOS +0x9585 0xBE19 #HANGUL SYLLABLE PIEUP EU RIEULTHIEUTH +0x9586 0xBE1A #HANGUL SYLLABLE PIEUP EU RIEULPHIEUPH +0x9587 0xBE1B #HANGUL SYLLABLE PIEUP EU RIEULHIEUH +0x9588 0xBE1E #HANGUL SYLLABLE PIEUP EU PIEUPSIOS +0x9589 0xBE20 #HANGUL SYLLABLE PIEUP EU SSANGSIOS +0x958A 0xBE21 #HANGUL SYLLABLE PIEUP EU IEUNG +0x958B 0xBE22 #HANGUL SYLLABLE PIEUP EU CIEUC +0x958C 0xBE23 #HANGUL SYLLABLE PIEUP EU CHIEUCH +0x958D 0xBE24 #HANGUL SYLLABLE PIEUP EU KHIEUKH +0x958E 0xBE25 #HANGUL SYLLABLE PIEUP EU THIEUTH +0x958F 0xBE26 #HANGUL SYLLABLE PIEUP EU PHIEUPH +0x9590 0xBE27 #HANGUL SYLLABLE PIEUP EU HIEUH +0x9591 0xBE28 #HANGUL SYLLABLE PIEUP YI +0x9592 0xBE29 #HANGUL SYLLABLE PIEUP YI KIYEOK +0x9593 0xBE2A #HANGUL SYLLABLE PIEUP YI SSANGKIYEOK +0x9594 0xBE2B #HANGUL SYLLABLE PIEUP YI KIYEOKSIOS +0x9595 0xBE2C #HANGUL SYLLABLE PIEUP YI NIEUN +0x9596 0xBE2D #HANGUL SYLLABLE PIEUP YI NIEUNCIEUC +0x9597 0xBE2E #HANGUL SYLLABLE PIEUP YI NIEUNHIEUH +0x9598 0xBE2F #HANGUL SYLLABLE PIEUP YI TIKEUT +0x9599 0xBE30 #HANGUL SYLLABLE PIEUP YI RIEUL +0x959A 0xBE31 #HANGUL SYLLABLE PIEUP YI RIEULKIYEOK +0x959B 0xBE32 #HANGUL SYLLABLE PIEUP YI RIEULMIEUM +0x959C 0xBE33 #HANGUL SYLLABLE PIEUP YI RIEULPIEUP +0x959D 0xBE34 #HANGUL SYLLABLE PIEUP YI RIEULSIOS +0x959E 0xBE35 #HANGUL SYLLABLE PIEUP YI RIEULTHIEUTH +0x959F 0xBE36 #HANGUL SYLLABLE PIEUP YI RIEULPHIEUPH +0x95A0 0xBE37 #HANGUL SYLLABLE PIEUP YI RIEULHIEUH +0x95A1 0xBE38 #HANGUL SYLLABLE PIEUP YI MIEUM +0x95A2 0xBE39 #HANGUL SYLLABLE PIEUP YI PIEUP +0x95A3 0xBE3A #HANGUL SYLLABLE PIEUP YI PIEUPSIOS +0x95A4 0xBE3B #HANGUL SYLLABLE PIEUP YI SIOS +0x95A5 0xBE3C #HANGUL SYLLABLE PIEUP YI SSANGSIOS +0x95A6 0xBE3D #HANGUL SYLLABLE PIEUP YI IEUNG +0x95A7 0xBE3E #HANGUL SYLLABLE PIEUP YI CIEUC +0x95A8 0xBE3F #HANGUL SYLLABLE PIEUP YI CHIEUCH +0x95A9 0xBE40 #HANGUL SYLLABLE PIEUP YI KHIEUKH +0x95AA 0xBE41 #HANGUL SYLLABLE PIEUP YI THIEUTH +0x95AB 0xBE42 #HANGUL SYLLABLE PIEUP YI PHIEUPH +0x95AC 0xBE43 #HANGUL SYLLABLE PIEUP YI HIEUH +0x95AD 0xBE46 #HANGUL SYLLABLE PIEUP I SSANGKIYEOK +0x95AE 0xBE47 #HANGUL SYLLABLE PIEUP I KIYEOKSIOS +0x95AF 0xBE49 #HANGUL SYLLABLE PIEUP I NIEUNCIEUC +0x95B0 0xBE4A #HANGUL SYLLABLE PIEUP I NIEUNHIEUH +0x95B1 0xBE4B #HANGUL SYLLABLE PIEUP I TIKEUT +0x95B2 0xBE4D #HANGUL SYLLABLE PIEUP I RIEULKIYEOK +0x95B3 0xBE4F #HANGUL SYLLABLE PIEUP I RIEULPIEUP +0x95B4 0xBE50 #HANGUL SYLLABLE PIEUP I RIEULSIOS +0x95B5 0xBE51 #HANGUL SYLLABLE PIEUP I RIEULTHIEUTH +0x95B6 0xBE52 #HANGUL SYLLABLE PIEUP I RIEULPHIEUPH +0x95B7 0xBE53 #HANGUL SYLLABLE PIEUP I RIEULHIEUH +0x95B8 0xBE56 #HANGUL SYLLABLE PIEUP I PIEUPSIOS +0x95B9 0xBE58 #HANGUL SYLLABLE PIEUP I SSANGSIOS +0x95BA 0xBE5C #HANGUL SYLLABLE PIEUP I KHIEUKH +0x95BB 0xBE5D #HANGUL SYLLABLE PIEUP I THIEUTH +0x95BC 0xBE5E #HANGUL SYLLABLE PIEUP I PHIEUPH +0x95BD 0xBE5F #HANGUL SYLLABLE PIEUP I HIEUH +0x95BE 0xBE62 #HANGUL SYLLABLE SSANGPIEUP A SSANGKIYEOK +0x95BF 0xBE63 #HANGUL SYLLABLE SSANGPIEUP A KIYEOKSIOS +0x95C0 0xBE65 #HANGUL SYLLABLE SSANGPIEUP A NIEUNCIEUC +0x95C1 0xBE66 #HANGUL SYLLABLE SSANGPIEUP A NIEUNHIEUH +0x95C2 0xBE67 #HANGUL SYLLABLE SSANGPIEUP A TIKEUT +0x95C3 0xBE69 #HANGUL SYLLABLE SSANGPIEUP A RIEULKIYEOK +0x95C4 0xBE6B #HANGUL SYLLABLE SSANGPIEUP A RIEULPIEUP +0x95C5 0xBE6C #HANGUL SYLLABLE SSANGPIEUP A RIEULSIOS +0x95C6 0xBE6D #HANGUL SYLLABLE SSANGPIEUP A RIEULTHIEUTH +0x95C7 0xBE6E #HANGUL SYLLABLE SSANGPIEUP A RIEULPHIEUPH +0x95C8 0xBE6F #HANGUL SYLLABLE SSANGPIEUP A RIEULHIEUH +0x95C9 0xBE72 #HANGUL SYLLABLE SSANGPIEUP A PIEUPSIOS +0x95CA 0xBE76 #HANGUL SYLLABLE SSANGPIEUP A CIEUC +0x95CB 0xBE77 #HANGUL SYLLABLE SSANGPIEUP A CHIEUCH +0x95CC 0xBE78 #HANGUL SYLLABLE SSANGPIEUP A KHIEUKH +0x95CD 0xBE79 #HANGUL SYLLABLE SSANGPIEUP A THIEUTH +0x95CE 0xBE7A #HANGUL SYLLABLE SSANGPIEUP A PHIEUPH +0x95CF 0xBE7E #HANGUL SYLLABLE SSANGPIEUP AE SSANGKIYEOK +0x95D0 0xBE7F #HANGUL SYLLABLE SSANGPIEUP AE KIYEOKSIOS +0x95D1 0xBE81 #HANGUL SYLLABLE SSANGPIEUP AE NIEUNCIEUC +0x95D2 0xBE82 #HANGUL SYLLABLE SSANGPIEUP AE NIEUNHIEUH +0x95D3 0xBE83 #HANGUL SYLLABLE SSANGPIEUP AE TIKEUT +0x95D4 0xBE85 #HANGUL SYLLABLE SSANGPIEUP AE RIEULKIYEOK +0x95D5 0xBE86 #HANGUL SYLLABLE SSANGPIEUP AE RIEULMIEUM +0x95D6 0xBE87 #HANGUL SYLLABLE SSANGPIEUP AE RIEULPIEUP +0x95D7 0xBE88 #HANGUL SYLLABLE SSANGPIEUP AE RIEULSIOS +0x95D8 0xBE89 #HANGUL SYLLABLE SSANGPIEUP AE RIEULTHIEUTH +0x95D9 0xBE8A #HANGUL SYLLABLE SSANGPIEUP AE RIEULPHIEUPH +0x95DA 0xBE8B #HANGUL SYLLABLE SSANGPIEUP AE RIEULHIEUH +0x95DB 0xBE8E #HANGUL SYLLABLE SSANGPIEUP AE PIEUPSIOS +0x95DC 0xBE92 #HANGUL SYLLABLE SSANGPIEUP AE CIEUC +0x95DD 0xBE93 #HANGUL SYLLABLE SSANGPIEUP AE CHIEUCH +0x95DE 0xBE94 #HANGUL SYLLABLE SSANGPIEUP AE KHIEUKH +0x95DF 0xBE95 #HANGUL SYLLABLE SSANGPIEUP AE THIEUTH +0x95E0 0xBE96 #HANGUL SYLLABLE SSANGPIEUP AE PHIEUPH +0x95E1 0xBE97 #HANGUL SYLLABLE SSANGPIEUP AE HIEUH +0x95E2 0xBE9A #HANGUL SYLLABLE SSANGPIEUP YA SSANGKIYEOK +0x95E3 0xBE9B #HANGUL SYLLABLE SSANGPIEUP YA KIYEOKSIOS +0x95E4 0xBE9C #HANGUL SYLLABLE SSANGPIEUP YA NIEUN +0x95E5 0xBE9D #HANGUL SYLLABLE SSANGPIEUP YA NIEUNCIEUC +0x95E6 0xBE9E #HANGUL SYLLABLE SSANGPIEUP YA NIEUNHIEUH +0x95E7 0xBE9F #HANGUL SYLLABLE SSANGPIEUP YA TIKEUT +0x95E8 0xBEA0 #HANGUL SYLLABLE SSANGPIEUP YA RIEUL +0x95E9 0xBEA1 #HANGUL SYLLABLE SSANGPIEUP YA RIEULKIYEOK +0x95EA 0xBEA2 #HANGUL SYLLABLE SSANGPIEUP YA RIEULMIEUM +0x95EB 0xBEA3 #HANGUL SYLLABLE SSANGPIEUP YA RIEULPIEUP +0x95EC 0xBEA4 #HANGUL SYLLABLE SSANGPIEUP YA RIEULSIOS +0x95ED 0xBEA5 #HANGUL SYLLABLE SSANGPIEUP YA RIEULTHIEUTH +0x95EE 0xBEA6 #HANGUL SYLLABLE SSANGPIEUP YA RIEULPHIEUPH +0x95EF 0xBEA7 #HANGUL SYLLABLE SSANGPIEUP YA RIEULHIEUH +0x95F0 0xBEA9 #HANGUL SYLLABLE SSANGPIEUP YA PIEUP +0x95F1 0xBEAA #HANGUL SYLLABLE SSANGPIEUP YA PIEUPSIOS +0x95F2 0xBEAB #HANGUL SYLLABLE SSANGPIEUP YA SIOS +0x95F3 0xBEAC #HANGUL SYLLABLE SSANGPIEUP YA SSANGSIOS +0x95F4 0xBEAD #HANGUL SYLLABLE SSANGPIEUP YA IEUNG +0x95F5 0xBEAE #HANGUL SYLLABLE SSANGPIEUP YA CIEUC +0x95F6 0xBEAF #HANGUL SYLLABLE SSANGPIEUP YA CHIEUCH +0x95F7 0xBEB0 #HANGUL SYLLABLE SSANGPIEUP YA KHIEUKH +0x95F8 0xBEB1 #HANGUL SYLLABLE SSANGPIEUP YA THIEUTH +0x95F9 0xBEB2 #HANGUL SYLLABLE SSANGPIEUP YA PHIEUPH +0x95FA 0xBEB3 #HANGUL SYLLABLE SSANGPIEUP YA HIEUH +0x95FB 0xBEB4 #HANGUL SYLLABLE SSANGPIEUP YAE +0x95FC 0xBEB5 #HANGUL SYLLABLE SSANGPIEUP YAE KIYEOK +0x95FD 0xBEB6 #HANGUL SYLLABLE SSANGPIEUP YAE SSANGKIYEOK +0x95FE 0xBEB7 #HANGUL SYLLABLE SSANGPIEUP YAE KIYEOKSIOS +0x9641 0xBEB8 #HANGUL SYLLABLE SSANGPIEUP YAE NIEUN +0x9642 0xBEB9 #HANGUL SYLLABLE SSANGPIEUP YAE NIEUNCIEUC +0x9643 0xBEBA #HANGUL SYLLABLE SSANGPIEUP YAE NIEUNHIEUH +0x9644 0xBEBB #HANGUL SYLLABLE SSANGPIEUP YAE TIKEUT +0x9645 0xBEBC #HANGUL SYLLABLE SSANGPIEUP YAE RIEUL +0x9646 0xBEBD #HANGUL SYLLABLE SSANGPIEUP YAE RIEULKIYEOK +0x9647 0xBEBE #HANGUL SYLLABLE SSANGPIEUP YAE RIEULMIEUM +0x9648 0xBEBF #HANGUL SYLLABLE SSANGPIEUP YAE RIEULPIEUP +0x9649 0xBEC0 #HANGUL SYLLABLE SSANGPIEUP YAE RIEULSIOS +0x964A 0xBEC1 #HANGUL SYLLABLE SSANGPIEUP YAE RIEULTHIEUTH +0x964B 0xBEC2 #HANGUL SYLLABLE SSANGPIEUP YAE RIEULPHIEUPH +0x964C 0xBEC3 #HANGUL SYLLABLE SSANGPIEUP YAE RIEULHIEUH +0x964D 0xBEC4 #HANGUL SYLLABLE SSANGPIEUP YAE MIEUM +0x964E 0xBEC5 #HANGUL SYLLABLE SSANGPIEUP YAE PIEUP +0x964F 0xBEC6 #HANGUL SYLLABLE SSANGPIEUP YAE PIEUPSIOS +0x9650 0xBEC7 #HANGUL SYLLABLE SSANGPIEUP YAE SIOS +0x9651 0xBEC8 #HANGUL SYLLABLE SSANGPIEUP YAE SSANGSIOS +0x9652 0xBEC9 #HANGUL SYLLABLE SSANGPIEUP YAE IEUNG +0x9653 0xBECA #HANGUL SYLLABLE SSANGPIEUP YAE CIEUC +0x9654 0xBECB #HANGUL SYLLABLE SSANGPIEUP YAE CHIEUCH +0x9655 0xBECC #HANGUL SYLLABLE SSANGPIEUP YAE KHIEUKH +0x9656 0xBECD #HANGUL SYLLABLE SSANGPIEUP YAE THIEUTH +0x9657 0xBECE #HANGUL SYLLABLE SSANGPIEUP YAE PHIEUPH +0x9658 0xBECF #HANGUL SYLLABLE SSANGPIEUP YAE HIEUH +0x9659 0xBED2 #HANGUL SYLLABLE SSANGPIEUP EO SSANGKIYEOK +0x965A 0xBED3 #HANGUL SYLLABLE SSANGPIEUP EO KIYEOKSIOS +0x9661 0xBED5 #HANGUL SYLLABLE SSANGPIEUP EO NIEUNCIEUC +0x9662 0xBED6 #HANGUL SYLLABLE SSANGPIEUP EO NIEUNHIEUH +0x9663 0xBED9 #HANGUL SYLLABLE SSANGPIEUP EO RIEULKIYEOK +0x9664 0xBEDA #HANGUL SYLLABLE SSANGPIEUP EO RIEULMIEUM +0x9665 0xBEDB #HANGUL SYLLABLE SSANGPIEUP EO RIEULPIEUP +0x9666 0xBEDC #HANGUL SYLLABLE SSANGPIEUP EO RIEULSIOS +0x9667 0xBEDD #HANGUL SYLLABLE SSANGPIEUP EO RIEULTHIEUTH +0x9668 0xBEDE #HANGUL SYLLABLE SSANGPIEUP EO RIEULPHIEUPH +0x9669 0xBEDF #HANGUL SYLLABLE SSANGPIEUP EO RIEULHIEUH +0x966A 0xBEE1 #HANGUL SYLLABLE SSANGPIEUP EO PIEUP +0x966B 0xBEE2 #HANGUL SYLLABLE SSANGPIEUP EO PIEUPSIOS +0x966C 0xBEE6 #HANGUL SYLLABLE SSANGPIEUP EO CIEUC +0x966D 0xBEE7 #HANGUL SYLLABLE SSANGPIEUP EO CHIEUCH +0x966E 0xBEE8 #HANGUL SYLLABLE SSANGPIEUP EO KHIEUKH +0x966F 0xBEE9 #HANGUL SYLLABLE SSANGPIEUP EO THIEUTH +0x9670 0xBEEA #HANGUL SYLLABLE SSANGPIEUP EO PHIEUPH +0x9671 0xBEEB #HANGUL SYLLABLE SSANGPIEUP EO HIEUH +0x9672 0xBEED #HANGUL SYLLABLE SSANGPIEUP E KIYEOK +0x9673 0xBEEE #HANGUL SYLLABLE SSANGPIEUP E SSANGKIYEOK +0x9674 0xBEEF #HANGUL SYLLABLE SSANGPIEUP E KIYEOKSIOS +0x9675 0xBEF0 #HANGUL SYLLABLE SSANGPIEUP E NIEUN +0x9676 0xBEF1 #HANGUL SYLLABLE SSANGPIEUP E NIEUNCIEUC +0x9677 0xBEF2 #HANGUL SYLLABLE SSANGPIEUP E NIEUNHIEUH +0x9678 0xBEF3 #HANGUL SYLLABLE SSANGPIEUP E TIKEUT +0x9679 0xBEF4 #HANGUL SYLLABLE SSANGPIEUP E RIEUL +0x967A 0xBEF5 #HANGUL SYLLABLE SSANGPIEUP E RIEULKIYEOK +0x9681 0xBEF6 #HANGUL SYLLABLE SSANGPIEUP E RIEULMIEUM +0x9682 0xBEF7 #HANGUL SYLLABLE SSANGPIEUP E RIEULPIEUP +0x9683 0xBEF8 #HANGUL SYLLABLE SSANGPIEUP E RIEULSIOS +0x9684 0xBEF9 #HANGUL SYLLABLE SSANGPIEUP E RIEULTHIEUTH +0x9685 0xBEFA #HANGUL SYLLABLE SSANGPIEUP E RIEULPHIEUPH +0x9686 0xBEFB #HANGUL SYLLABLE SSANGPIEUP E RIEULHIEUH +0x9687 0xBEFC #HANGUL SYLLABLE SSANGPIEUP E MIEUM +0x9688 0xBEFD #HANGUL SYLLABLE SSANGPIEUP E PIEUP +0x9689 0xBEFE #HANGUL SYLLABLE SSANGPIEUP E PIEUPSIOS +0x968A 0xBEFF #HANGUL SYLLABLE SSANGPIEUP E SIOS +0x968B 0xBF00 #HANGUL SYLLABLE SSANGPIEUP E SSANGSIOS +0x968C 0xBF02 #HANGUL SYLLABLE SSANGPIEUP E CIEUC +0x968D 0xBF03 #HANGUL SYLLABLE SSANGPIEUP E CHIEUCH +0x968E 0xBF04 #HANGUL SYLLABLE SSANGPIEUP E KHIEUKH +0x968F 0xBF05 #HANGUL SYLLABLE SSANGPIEUP E THIEUTH +0x9690 0xBF06 #HANGUL SYLLABLE SSANGPIEUP E PHIEUPH +0x9691 0xBF07 #HANGUL SYLLABLE SSANGPIEUP E HIEUH +0x9692 0xBF0A #HANGUL SYLLABLE SSANGPIEUP YEO SSANGKIYEOK +0x9693 0xBF0B #HANGUL SYLLABLE SSANGPIEUP YEO KIYEOKSIOS +0x9694 0xBF0C #HANGUL SYLLABLE SSANGPIEUP YEO NIEUN +0x9695 0xBF0D #HANGUL SYLLABLE SSANGPIEUP YEO NIEUNCIEUC +0x9696 0xBF0E #HANGUL SYLLABLE SSANGPIEUP YEO NIEUNHIEUH +0x9697 0xBF0F #HANGUL SYLLABLE SSANGPIEUP YEO TIKEUT +0x9698 0xBF10 #HANGUL SYLLABLE SSANGPIEUP YEO RIEUL +0x9699 0xBF11 #HANGUL SYLLABLE SSANGPIEUP YEO RIEULKIYEOK +0x969A 0xBF12 #HANGUL SYLLABLE SSANGPIEUP YEO RIEULMIEUM +0x969B 0xBF13 #HANGUL SYLLABLE SSANGPIEUP YEO RIEULPIEUP +0x969C 0xBF14 #HANGUL SYLLABLE SSANGPIEUP YEO RIEULSIOS +0x969D 0xBF15 #HANGUL SYLLABLE SSANGPIEUP YEO RIEULTHIEUTH +0x969E 0xBF16 #HANGUL SYLLABLE SSANGPIEUP YEO RIEULPHIEUPH +0x969F 0xBF17 #HANGUL SYLLABLE SSANGPIEUP YEO RIEULHIEUH +0x96A0 0xBF1A #HANGUL SYLLABLE SSANGPIEUP YEO PIEUPSIOS +0x96A1 0xBF1E #HANGUL SYLLABLE SSANGPIEUP YEO CIEUC +0x96A2 0xBF1F #HANGUL SYLLABLE SSANGPIEUP YEO CHIEUCH +0x96A3 0xBF20 #HANGUL SYLLABLE SSANGPIEUP YEO KHIEUKH +0x96A4 0xBF21 #HANGUL SYLLABLE SSANGPIEUP YEO THIEUTH +0x96A5 0xBF22 #HANGUL SYLLABLE SSANGPIEUP YEO PHIEUPH +0x96A6 0xBF23 #HANGUL SYLLABLE SSANGPIEUP YEO HIEUH +0x96A7 0xBF24 #HANGUL SYLLABLE SSANGPIEUP YE +0x96A8 0xBF25 #HANGUL SYLLABLE SSANGPIEUP YE KIYEOK +0x96A9 0xBF26 #HANGUL SYLLABLE SSANGPIEUP YE SSANGKIYEOK +0x96AA 0xBF27 #HANGUL SYLLABLE SSANGPIEUP YE KIYEOKSIOS +0x96AB 0xBF28 #HANGUL SYLLABLE SSANGPIEUP YE NIEUN +0x96AC 0xBF29 #HANGUL SYLLABLE SSANGPIEUP YE NIEUNCIEUC +0x96AD 0xBF2A #HANGUL SYLLABLE SSANGPIEUP YE NIEUNHIEUH +0x96AE 0xBF2B #HANGUL SYLLABLE SSANGPIEUP YE TIKEUT +0x96AF 0xBF2C #HANGUL SYLLABLE SSANGPIEUP YE RIEUL +0x96B0 0xBF2D #HANGUL SYLLABLE SSANGPIEUP YE RIEULKIYEOK +0x96B1 0xBF2E #HANGUL SYLLABLE SSANGPIEUP YE RIEULMIEUM +0x96B2 0xBF2F #HANGUL SYLLABLE SSANGPIEUP YE RIEULPIEUP +0x96B3 0xBF30 #HANGUL SYLLABLE SSANGPIEUP YE RIEULSIOS +0x96B4 0xBF31 #HANGUL SYLLABLE SSANGPIEUP YE RIEULTHIEUTH +0x96B5 0xBF32 #HANGUL SYLLABLE SSANGPIEUP YE RIEULPHIEUPH +0x96B6 0xBF33 #HANGUL SYLLABLE SSANGPIEUP YE RIEULHIEUH +0x96B7 0xBF34 #HANGUL SYLLABLE SSANGPIEUP YE MIEUM +0x96B8 0xBF35 #HANGUL SYLLABLE SSANGPIEUP YE PIEUP +0x96B9 0xBF36 #HANGUL SYLLABLE SSANGPIEUP YE PIEUPSIOS +0x96BA 0xBF37 #HANGUL SYLLABLE SSANGPIEUP YE SIOS +0x96BB 0xBF38 #HANGUL SYLLABLE SSANGPIEUP YE SSANGSIOS +0x96BC 0xBF39 #HANGUL SYLLABLE SSANGPIEUP YE IEUNG +0x96BD 0xBF3A #HANGUL SYLLABLE SSANGPIEUP YE CIEUC +0x96BE 0xBF3B #HANGUL SYLLABLE SSANGPIEUP YE CHIEUCH +0x96BF 0xBF3C #HANGUL SYLLABLE SSANGPIEUP YE KHIEUKH +0x96C0 0xBF3D #HANGUL SYLLABLE SSANGPIEUP YE THIEUTH +0x96C1 0xBF3E #HANGUL SYLLABLE SSANGPIEUP YE PHIEUPH +0x96C2 0xBF3F #HANGUL SYLLABLE SSANGPIEUP YE HIEUH +0x96C3 0xBF42 #HANGUL SYLLABLE SSANGPIEUP O SSANGKIYEOK +0x96C4 0xBF43 #HANGUL SYLLABLE SSANGPIEUP O KIYEOKSIOS +0x96C5 0xBF45 #HANGUL SYLLABLE SSANGPIEUP O NIEUNCIEUC +0x96C6 0xBF46 #HANGUL SYLLABLE SSANGPIEUP O NIEUNHIEUH +0x96C7 0xBF47 #HANGUL SYLLABLE SSANGPIEUP O TIKEUT +0x96C8 0xBF49 #HANGUL SYLLABLE SSANGPIEUP O RIEULKIYEOK +0x96C9 0xBF4A #HANGUL SYLLABLE SSANGPIEUP O RIEULMIEUM +0x96CA 0xBF4B #HANGUL SYLLABLE SSANGPIEUP O RIEULPIEUP +0x96CB 0xBF4C #HANGUL SYLLABLE SSANGPIEUP O RIEULSIOS +0x96CC 0xBF4D #HANGUL SYLLABLE SSANGPIEUP O RIEULTHIEUTH +0x96CD 0xBF4E #HANGUL SYLLABLE SSANGPIEUP O RIEULPHIEUPH +0x96CE 0xBF4F #HANGUL SYLLABLE SSANGPIEUP O RIEULHIEUH +0x96CF 0xBF52 #HANGUL SYLLABLE SSANGPIEUP O PIEUPSIOS +0x96D0 0xBF53 #HANGUL SYLLABLE SSANGPIEUP O SIOS +0x96D1 0xBF54 #HANGUL SYLLABLE SSANGPIEUP O SSANGSIOS +0x96D2 0xBF56 #HANGUL SYLLABLE SSANGPIEUP O CIEUC +0x96D3 0xBF57 #HANGUL SYLLABLE SSANGPIEUP O CHIEUCH +0x96D4 0xBF58 #HANGUL SYLLABLE SSANGPIEUP O KHIEUKH +0x96D5 0xBF59 #HANGUL SYLLABLE SSANGPIEUP O THIEUTH +0x96D6 0xBF5A #HANGUL SYLLABLE SSANGPIEUP O PHIEUPH +0x96D7 0xBF5B #HANGUL SYLLABLE SSANGPIEUP O HIEUH +0x96D8 0xBF5C #HANGUL SYLLABLE SSANGPIEUP WA +0x96D9 0xBF5D #HANGUL SYLLABLE SSANGPIEUP WA KIYEOK +0x96DA 0xBF5E #HANGUL SYLLABLE SSANGPIEUP WA SSANGKIYEOK +0x96DB 0xBF5F #HANGUL SYLLABLE SSANGPIEUP WA KIYEOKSIOS +0x96DC 0xBF60 #HANGUL SYLLABLE SSANGPIEUP WA NIEUN +0x96DD 0xBF61 #HANGUL SYLLABLE SSANGPIEUP WA NIEUNCIEUC +0x96DE 0xBF62 #HANGUL SYLLABLE SSANGPIEUP WA NIEUNHIEUH +0x96DF 0xBF63 #HANGUL SYLLABLE SSANGPIEUP WA TIKEUT +0x96E0 0xBF64 #HANGUL SYLLABLE SSANGPIEUP WA RIEUL +0x96E1 0xBF65 #HANGUL SYLLABLE SSANGPIEUP WA RIEULKIYEOK +0x96E2 0xBF66 #HANGUL SYLLABLE SSANGPIEUP WA RIEULMIEUM +0x96E3 0xBF67 #HANGUL SYLLABLE SSANGPIEUP WA RIEULPIEUP +0x96E4 0xBF68 #HANGUL SYLLABLE SSANGPIEUP WA RIEULSIOS +0x96E5 0xBF69 #HANGUL SYLLABLE SSANGPIEUP WA RIEULTHIEUTH +0x96E6 0xBF6A #HANGUL SYLLABLE SSANGPIEUP WA RIEULPHIEUPH +0x96E7 0xBF6B #HANGUL SYLLABLE SSANGPIEUP WA RIEULHIEUH +0x96E8 0xBF6C #HANGUL SYLLABLE SSANGPIEUP WA MIEUM +0x96E9 0xBF6D #HANGUL SYLLABLE SSANGPIEUP WA PIEUP +0x96EA 0xBF6E #HANGUL SYLLABLE SSANGPIEUP WA PIEUPSIOS +0x96EB 0xBF6F #HANGUL SYLLABLE SSANGPIEUP WA SIOS +0x96EC 0xBF70 #HANGUL SYLLABLE SSANGPIEUP WA SSANGSIOS +0x96ED 0xBF71 #HANGUL SYLLABLE SSANGPIEUP WA IEUNG +0x96EE 0xBF72 #HANGUL SYLLABLE SSANGPIEUP WA CIEUC +0x96EF 0xBF73 #HANGUL SYLLABLE SSANGPIEUP WA CHIEUCH +0x96F0 0xBF74 #HANGUL SYLLABLE SSANGPIEUP WA KHIEUKH +0x96F1 0xBF75 #HANGUL SYLLABLE SSANGPIEUP WA THIEUTH +0x96F2 0xBF76 #HANGUL SYLLABLE SSANGPIEUP WA PHIEUPH +0x96F3 0xBF77 #HANGUL SYLLABLE SSANGPIEUP WA HIEUH +0x96F4 0xBF78 #HANGUL SYLLABLE SSANGPIEUP WAE +0x96F5 0xBF79 #HANGUL SYLLABLE SSANGPIEUP WAE KIYEOK +0x96F6 0xBF7A #HANGUL SYLLABLE SSANGPIEUP WAE SSANGKIYEOK +0x96F7 0xBF7B #HANGUL SYLLABLE SSANGPIEUP WAE KIYEOKSIOS +0x96F8 0xBF7C #HANGUL SYLLABLE SSANGPIEUP WAE NIEUN +0x96F9 0xBF7D #HANGUL SYLLABLE SSANGPIEUP WAE NIEUNCIEUC +0x96FA 0xBF7E #HANGUL SYLLABLE SSANGPIEUP WAE NIEUNHIEUH +0x96FB 0xBF7F #HANGUL SYLLABLE SSANGPIEUP WAE TIKEUT +0x96FC 0xBF80 #HANGUL SYLLABLE SSANGPIEUP WAE RIEUL +0x96FD 0xBF81 #HANGUL SYLLABLE SSANGPIEUP WAE RIEULKIYEOK +0x96FE 0xBF82 #HANGUL SYLLABLE SSANGPIEUP WAE RIEULMIEUM +0x9741 0xBF83 #HANGUL SYLLABLE SSANGPIEUP WAE RIEULPIEUP +0x9742 0xBF84 #HANGUL SYLLABLE SSANGPIEUP WAE RIEULSIOS +0x9743 0xBF85 #HANGUL SYLLABLE SSANGPIEUP WAE RIEULTHIEUTH +0x9744 0xBF86 #HANGUL SYLLABLE SSANGPIEUP WAE RIEULPHIEUPH +0x9745 0xBF87 #HANGUL SYLLABLE SSANGPIEUP WAE RIEULHIEUH +0x9746 0xBF88 #HANGUL SYLLABLE SSANGPIEUP WAE MIEUM +0x9747 0xBF89 #HANGUL SYLLABLE SSANGPIEUP WAE PIEUP +0x9748 0xBF8A #HANGUL SYLLABLE SSANGPIEUP WAE PIEUPSIOS +0x9749 0xBF8B #HANGUL SYLLABLE SSANGPIEUP WAE SIOS +0x974A 0xBF8C #HANGUL SYLLABLE SSANGPIEUP WAE SSANGSIOS +0x974B 0xBF8D #HANGUL SYLLABLE SSANGPIEUP WAE IEUNG +0x974C 0xBF8E #HANGUL SYLLABLE SSANGPIEUP WAE CIEUC +0x974D 0xBF8F #HANGUL SYLLABLE SSANGPIEUP WAE CHIEUCH +0x974E 0xBF90 #HANGUL SYLLABLE SSANGPIEUP WAE KHIEUKH +0x974F 0xBF91 #HANGUL SYLLABLE SSANGPIEUP WAE THIEUTH +0x9750 0xBF92 #HANGUL SYLLABLE SSANGPIEUP WAE PHIEUPH +0x9751 0xBF93 #HANGUL SYLLABLE SSANGPIEUP WAE HIEUH +0x9752 0xBF95 #HANGUL SYLLABLE SSANGPIEUP OE KIYEOK +0x9753 0xBF96 #HANGUL SYLLABLE SSANGPIEUP OE SSANGKIYEOK +0x9754 0xBF97 #HANGUL SYLLABLE SSANGPIEUP OE KIYEOKSIOS +0x9755 0xBF98 #HANGUL SYLLABLE SSANGPIEUP OE NIEUN +0x9756 0xBF99 #HANGUL SYLLABLE SSANGPIEUP OE NIEUNCIEUC +0x9757 0xBF9A #HANGUL SYLLABLE SSANGPIEUP OE NIEUNHIEUH +0x9758 0xBF9B #HANGUL SYLLABLE SSANGPIEUP OE TIKEUT +0x9759 0xBF9C #HANGUL SYLLABLE SSANGPIEUP OE RIEUL +0x975A 0xBF9D #HANGUL SYLLABLE SSANGPIEUP OE RIEULKIYEOK +0x9761 0xBF9E #HANGUL SYLLABLE SSANGPIEUP OE RIEULMIEUM +0x9762 0xBF9F #HANGUL SYLLABLE SSANGPIEUP OE RIEULPIEUP +0x9763 0xBFA0 #HANGUL SYLLABLE SSANGPIEUP OE RIEULSIOS +0x9764 0xBFA1 #HANGUL SYLLABLE SSANGPIEUP OE RIEULTHIEUTH +0x9765 0xBFA2 #HANGUL SYLLABLE SSANGPIEUP OE RIEULPHIEUPH +0x9766 0xBFA3 #HANGUL SYLLABLE SSANGPIEUP OE RIEULHIEUH +0x9767 0xBFA4 #HANGUL SYLLABLE SSANGPIEUP OE MIEUM +0x9768 0xBFA5 #HANGUL SYLLABLE SSANGPIEUP OE PIEUP +0x9769 0xBFA6 #HANGUL SYLLABLE SSANGPIEUP OE PIEUPSIOS +0x976A 0xBFA7 #HANGUL SYLLABLE SSANGPIEUP OE SIOS +0x976B 0xBFA8 #HANGUL SYLLABLE SSANGPIEUP OE SSANGSIOS +0x976C 0xBFA9 #HANGUL SYLLABLE SSANGPIEUP OE IEUNG +0x976D 0xBFAA #HANGUL SYLLABLE SSANGPIEUP OE CIEUC +0x976E 0xBFAB #HANGUL SYLLABLE SSANGPIEUP OE CHIEUCH +0x976F 0xBFAC #HANGUL SYLLABLE SSANGPIEUP OE KHIEUKH +0x9770 0xBFAD #HANGUL SYLLABLE SSANGPIEUP OE THIEUTH +0x9771 0xBFAE #HANGUL SYLLABLE SSANGPIEUP OE PHIEUPH +0x9772 0xBFAF #HANGUL SYLLABLE SSANGPIEUP OE HIEUH +0x9773 0xBFB1 #HANGUL SYLLABLE SSANGPIEUP YO KIYEOK +0x9774 0xBFB2 #HANGUL SYLLABLE SSANGPIEUP YO SSANGKIYEOK +0x9775 0xBFB3 #HANGUL SYLLABLE SSANGPIEUP YO KIYEOKSIOS +0x9776 0xBFB4 #HANGUL SYLLABLE SSANGPIEUP YO NIEUN +0x9777 0xBFB5 #HANGUL SYLLABLE SSANGPIEUP YO NIEUNCIEUC +0x9778 0xBFB6 #HANGUL SYLLABLE SSANGPIEUP YO NIEUNHIEUH +0x9779 0xBFB7 #HANGUL SYLLABLE SSANGPIEUP YO TIKEUT +0x977A 0xBFB8 #HANGUL SYLLABLE SSANGPIEUP YO RIEUL +0x9781 0xBFB9 #HANGUL SYLLABLE SSANGPIEUP YO RIEULKIYEOK +0x9782 0xBFBA #HANGUL SYLLABLE SSANGPIEUP YO RIEULMIEUM +0x9783 0xBFBB #HANGUL SYLLABLE SSANGPIEUP YO RIEULPIEUP +0x9784 0xBFBC #HANGUL SYLLABLE SSANGPIEUP YO RIEULSIOS +0x9785 0xBFBD #HANGUL SYLLABLE SSANGPIEUP YO RIEULTHIEUTH +0x9786 0xBFBE #HANGUL SYLLABLE SSANGPIEUP YO RIEULPHIEUPH +0x9787 0xBFBF #HANGUL SYLLABLE SSANGPIEUP YO RIEULHIEUH +0x9788 0xBFC0 #HANGUL SYLLABLE SSANGPIEUP YO MIEUM +0x9789 0xBFC1 #HANGUL SYLLABLE SSANGPIEUP YO PIEUP +0x978A 0xBFC2 #HANGUL SYLLABLE SSANGPIEUP YO PIEUPSIOS +0x978B 0xBFC3 #HANGUL SYLLABLE SSANGPIEUP YO SIOS +0x978C 0xBFC4 #HANGUL SYLLABLE SSANGPIEUP YO SSANGSIOS +0x978D 0xBFC6 #HANGUL SYLLABLE SSANGPIEUP YO CIEUC +0x978E 0xBFC7 #HANGUL SYLLABLE SSANGPIEUP YO CHIEUCH +0x978F 0xBFC8 #HANGUL SYLLABLE SSANGPIEUP YO KHIEUKH +0x9790 0xBFC9 #HANGUL SYLLABLE SSANGPIEUP YO THIEUTH +0x9791 0xBFCA #HANGUL SYLLABLE SSANGPIEUP YO PHIEUPH +0x9792 0xBFCB #HANGUL SYLLABLE SSANGPIEUP YO HIEUH +0x9793 0xBFCE #HANGUL SYLLABLE SSANGPIEUP U SSANGKIYEOK +0x9794 0xBFCF #HANGUL SYLLABLE SSANGPIEUP U KIYEOKSIOS +0x9795 0xBFD1 #HANGUL SYLLABLE SSANGPIEUP U NIEUNCIEUC +0x9796 0xBFD2 #HANGUL SYLLABLE SSANGPIEUP U NIEUNHIEUH +0x9797 0xBFD3 #HANGUL SYLLABLE SSANGPIEUP U TIKEUT +0x9798 0xBFD5 #HANGUL SYLLABLE SSANGPIEUP U RIEULKIYEOK +0x9799 0xBFD6 #HANGUL SYLLABLE SSANGPIEUP U RIEULMIEUM +0x979A 0xBFD7 #HANGUL SYLLABLE SSANGPIEUP U RIEULPIEUP +0x979B 0xBFD8 #HANGUL SYLLABLE SSANGPIEUP U RIEULSIOS +0x979C 0xBFD9 #HANGUL SYLLABLE SSANGPIEUP U RIEULTHIEUTH +0x979D 0xBFDA #HANGUL SYLLABLE SSANGPIEUP U RIEULPHIEUPH +0x979E 0xBFDB #HANGUL SYLLABLE SSANGPIEUP U RIEULHIEUH +0x979F 0xBFDD #HANGUL SYLLABLE SSANGPIEUP U PIEUP +0x97A0 0xBFDE #HANGUL SYLLABLE SSANGPIEUP U PIEUPSIOS +0x97A1 0xBFE0 #HANGUL SYLLABLE SSANGPIEUP U SSANGSIOS +0x97A2 0xBFE2 #HANGUL SYLLABLE SSANGPIEUP U CIEUC +0x97A3 0xBFE3 #HANGUL SYLLABLE SSANGPIEUP U CHIEUCH +0x97A4 0xBFE4 #HANGUL SYLLABLE SSANGPIEUP U KHIEUKH +0x97A5 0xBFE5 #HANGUL SYLLABLE SSANGPIEUP U THIEUTH +0x97A6 0xBFE6 #HANGUL SYLLABLE SSANGPIEUP U PHIEUPH +0x97A7 0xBFE7 #HANGUL SYLLABLE SSANGPIEUP U HIEUH +0x97A8 0xBFE8 #HANGUL SYLLABLE SSANGPIEUP WEO +0x97A9 0xBFE9 #HANGUL SYLLABLE SSANGPIEUP WEO KIYEOK +0x97AA 0xBFEA #HANGUL SYLLABLE SSANGPIEUP WEO SSANGKIYEOK +0x97AB 0xBFEB #HANGUL SYLLABLE SSANGPIEUP WEO KIYEOKSIOS +0x97AC 0xBFEC #HANGUL SYLLABLE SSANGPIEUP WEO NIEUN +0x97AD 0xBFED #HANGUL SYLLABLE SSANGPIEUP WEO NIEUNCIEUC +0x97AE 0xBFEE #HANGUL SYLLABLE SSANGPIEUP WEO NIEUNHIEUH +0x97AF 0xBFEF #HANGUL SYLLABLE SSANGPIEUP WEO TIKEUT +0x97B0 0xBFF0 #HANGUL SYLLABLE SSANGPIEUP WEO RIEUL +0x97B1 0xBFF1 #HANGUL SYLLABLE SSANGPIEUP WEO RIEULKIYEOK +0x97B2 0xBFF2 #HANGUL SYLLABLE SSANGPIEUP WEO RIEULMIEUM +0x97B3 0xBFF3 #HANGUL SYLLABLE SSANGPIEUP WEO RIEULPIEUP +0x97B4 0xBFF4 #HANGUL SYLLABLE SSANGPIEUP WEO RIEULSIOS +0x97B5 0xBFF5 #HANGUL SYLLABLE SSANGPIEUP WEO RIEULTHIEUTH +0x97B6 0xBFF6 #HANGUL SYLLABLE SSANGPIEUP WEO RIEULPHIEUPH +0x97B7 0xBFF7 #HANGUL SYLLABLE SSANGPIEUP WEO RIEULHIEUH +0x97B8 0xBFF8 #HANGUL SYLLABLE SSANGPIEUP WEO MIEUM +0x97B9 0xBFF9 #HANGUL SYLLABLE SSANGPIEUP WEO PIEUP +0x97BA 0xBFFA #HANGUL SYLLABLE SSANGPIEUP WEO PIEUPSIOS +0x97BB 0xBFFB #HANGUL SYLLABLE SSANGPIEUP WEO SIOS +0x97BC 0xBFFC #HANGUL SYLLABLE SSANGPIEUP WEO SSANGSIOS +0x97BD 0xBFFD #HANGUL SYLLABLE SSANGPIEUP WEO IEUNG +0x97BE 0xBFFE #HANGUL SYLLABLE SSANGPIEUP WEO CIEUC +0x97BF 0xBFFF #HANGUL SYLLABLE SSANGPIEUP WEO CHIEUCH +0x97C0 0xC000 #HANGUL SYLLABLE SSANGPIEUP WEO KHIEUKH +0x97C1 0xC001 #HANGUL SYLLABLE SSANGPIEUP WEO THIEUTH +0x97C2 0xC002 #HANGUL SYLLABLE SSANGPIEUP WEO PHIEUPH +0x97C3 0xC003 #HANGUL SYLLABLE SSANGPIEUP WEO HIEUH +0x97C4 0xC004 #HANGUL SYLLABLE SSANGPIEUP WE +0x97C5 0xC005 #HANGUL SYLLABLE SSANGPIEUP WE KIYEOK +0x97C6 0xC006 #HANGUL SYLLABLE SSANGPIEUP WE SSANGKIYEOK +0x97C7 0xC007 #HANGUL SYLLABLE SSANGPIEUP WE KIYEOKSIOS +0x97C8 0xC008 #HANGUL SYLLABLE SSANGPIEUP WE NIEUN +0x97C9 0xC009 #HANGUL SYLLABLE SSANGPIEUP WE NIEUNCIEUC +0x97CA 0xC00A #HANGUL SYLLABLE SSANGPIEUP WE NIEUNHIEUH +0x97CB 0xC00B #HANGUL SYLLABLE SSANGPIEUP WE TIKEUT +0x97CC 0xC00C #HANGUL SYLLABLE SSANGPIEUP WE RIEUL +0x97CD 0xC00D #HANGUL SYLLABLE SSANGPIEUP WE RIEULKIYEOK +0x97CE 0xC00E #HANGUL SYLLABLE SSANGPIEUP WE RIEULMIEUM +0x97CF 0xC00F #HANGUL SYLLABLE SSANGPIEUP WE RIEULPIEUP +0x97D0 0xC010 #HANGUL SYLLABLE SSANGPIEUP WE RIEULSIOS +0x97D1 0xC011 #HANGUL SYLLABLE SSANGPIEUP WE RIEULTHIEUTH +0x97D2 0xC012 #HANGUL SYLLABLE SSANGPIEUP WE RIEULPHIEUPH +0x97D3 0xC013 #HANGUL SYLLABLE SSANGPIEUP WE RIEULHIEUH +0x97D4 0xC014 #HANGUL SYLLABLE SSANGPIEUP WE MIEUM +0x97D5 0xC015 #HANGUL SYLLABLE SSANGPIEUP WE PIEUP +0x97D6 0xC016 #HANGUL SYLLABLE SSANGPIEUP WE PIEUPSIOS +0x97D7 0xC017 #HANGUL SYLLABLE SSANGPIEUP WE SIOS +0x97D8 0xC018 #HANGUL SYLLABLE SSANGPIEUP WE SSANGSIOS +0x97D9 0xC019 #HANGUL SYLLABLE SSANGPIEUP WE IEUNG +0x97DA 0xC01A #HANGUL SYLLABLE SSANGPIEUP WE CIEUC +0x97DB 0xC01B #HANGUL SYLLABLE SSANGPIEUP WE CHIEUCH +0x97DC 0xC01C #HANGUL SYLLABLE SSANGPIEUP WE KHIEUKH +0x97DD 0xC01D #HANGUL SYLLABLE SSANGPIEUP WE THIEUTH +0x97DE 0xC01E #HANGUL SYLLABLE SSANGPIEUP WE PHIEUPH +0x97DF 0xC01F #HANGUL SYLLABLE SSANGPIEUP WE HIEUH +0x97E0 0xC020 #HANGUL SYLLABLE SSANGPIEUP WI +0x97E1 0xC021 #HANGUL SYLLABLE SSANGPIEUP WI KIYEOK +0x97E2 0xC022 #HANGUL SYLLABLE SSANGPIEUP WI SSANGKIYEOK +0x97E3 0xC023 #HANGUL SYLLABLE SSANGPIEUP WI KIYEOKSIOS +0x97E4 0xC024 #HANGUL SYLLABLE SSANGPIEUP WI NIEUN +0x97E5 0xC025 #HANGUL SYLLABLE SSANGPIEUP WI NIEUNCIEUC +0x97E6 0xC026 #HANGUL SYLLABLE SSANGPIEUP WI NIEUNHIEUH +0x97E7 0xC027 #HANGUL SYLLABLE SSANGPIEUP WI TIKEUT +0x97E8 0xC028 #HANGUL SYLLABLE SSANGPIEUP WI RIEUL +0x97E9 0xC029 #HANGUL SYLLABLE SSANGPIEUP WI RIEULKIYEOK +0x97EA 0xC02A #HANGUL SYLLABLE SSANGPIEUP WI RIEULMIEUM +0x97EB 0xC02B #HANGUL SYLLABLE SSANGPIEUP WI RIEULPIEUP +0x97EC 0xC02C #HANGUL SYLLABLE SSANGPIEUP WI RIEULSIOS +0x97ED 0xC02D #HANGUL SYLLABLE SSANGPIEUP WI RIEULTHIEUTH +0x97EE 0xC02E #HANGUL SYLLABLE SSANGPIEUP WI RIEULPHIEUPH +0x97EF 0xC02F #HANGUL SYLLABLE SSANGPIEUP WI RIEULHIEUH +0x97F0 0xC030 #HANGUL SYLLABLE SSANGPIEUP WI MIEUM +0x97F1 0xC031 #HANGUL SYLLABLE SSANGPIEUP WI PIEUP +0x97F2 0xC032 #HANGUL SYLLABLE SSANGPIEUP WI PIEUPSIOS +0x97F3 0xC033 #HANGUL SYLLABLE SSANGPIEUP WI SIOS +0x97F4 0xC034 #HANGUL SYLLABLE SSANGPIEUP WI SSANGSIOS +0x97F5 0xC035 #HANGUL SYLLABLE SSANGPIEUP WI IEUNG +0x97F6 0xC036 #HANGUL SYLLABLE SSANGPIEUP WI CIEUC +0x97F7 0xC037 #HANGUL SYLLABLE SSANGPIEUP WI CHIEUCH +0x97F8 0xC038 #HANGUL SYLLABLE SSANGPIEUP WI KHIEUKH +0x97F9 0xC039 #HANGUL SYLLABLE SSANGPIEUP WI THIEUTH +0x97FA 0xC03A #HANGUL SYLLABLE SSANGPIEUP WI PHIEUPH +0x97FB 0xC03B #HANGUL SYLLABLE SSANGPIEUP WI HIEUH +0x97FC 0xC03D #HANGUL SYLLABLE SSANGPIEUP YU KIYEOK +0x97FD 0xC03E #HANGUL SYLLABLE SSANGPIEUP YU SSANGKIYEOK +0x97FE 0xC03F #HANGUL SYLLABLE SSANGPIEUP YU KIYEOKSIOS +0x9841 0xC040 #HANGUL SYLLABLE SSANGPIEUP YU NIEUN +0x9842 0xC041 #HANGUL SYLLABLE SSANGPIEUP YU NIEUNCIEUC +0x9843 0xC042 #HANGUL SYLLABLE SSANGPIEUP YU NIEUNHIEUH +0x9844 0xC043 #HANGUL SYLLABLE SSANGPIEUP YU TIKEUT +0x9845 0xC044 #HANGUL SYLLABLE SSANGPIEUP YU RIEUL +0x9846 0xC045 #HANGUL SYLLABLE SSANGPIEUP YU RIEULKIYEOK +0x9847 0xC046 #HANGUL SYLLABLE SSANGPIEUP YU RIEULMIEUM +0x9848 0xC047 #HANGUL SYLLABLE SSANGPIEUP YU RIEULPIEUP +0x9849 0xC048 #HANGUL SYLLABLE SSANGPIEUP YU RIEULSIOS +0x984A 0xC049 #HANGUL SYLLABLE SSANGPIEUP YU RIEULTHIEUTH +0x984B 0xC04A #HANGUL SYLLABLE SSANGPIEUP YU RIEULPHIEUPH +0x984C 0xC04B #HANGUL SYLLABLE SSANGPIEUP YU RIEULHIEUH +0x984D 0xC04C #HANGUL SYLLABLE SSANGPIEUP YU MIEUM +0x984E 0xC04D #HANGUL SYLLABLE SSANGPIEUP YU PIEUP +0x984F 0xC04E #HANGUL SYLLABLE SSANGPIEUP YU PIEUPSIOS +0x9850 0xC04F #HANGUL SYLLABLE SSANGPIEUP YU SIOS +0x9851 0xC050 #HANGUL SYLLABLE SSANGPIEUP YU SSANGSIOS +0x9852 0xC052 #HANGUL SYLLABLE SSANGPIEUP YU CIEUC +0x9853 0xC053 #HANGUL SYLLABLE SSANGPIEUP YU CHIEUCH +0x9854 0xC054 #HANGUL SYLLABLE SSANGPIEUP YU KHIEUKH +0x9855 0xC055 #HANGUL SYLLABLE SSANGPIEUP YU THIEUTH +0x9856 0xC056 #HANGUL SYLLABLE SSANGPIEUP YU PHIEUPH +0x9857 0xC057 #HANGUL SYLLABLE SSANGPIEUP YU HIEUH +0x9858 0xC059 #HANGUL SYLLABLE SSANGPIEUP EU KIYEOK +0x9859 0xC05A #HANGUL SYLLABLE SSANGPIEUP EU SSANGKIYEOK +0x985A 0xC05B #HANGUL SYLLABLE SSANGPIEUP EU KIYEOKSIOS +0x9861 0xC05D #HANGUL SYLLABLE SSANGPIEUP EU NIEUNCIEUC +0x9862 0xC05E #HANGUL SYLLABLE SSANGPIEUP EU NIEUNHIEUH +0x9863 0xC05F #HANGUL SYLLABLE SSANGPIEUP EU TIKEUT +0x9864 0xC061 #HANGUL SYLLABLE SSANGPIEUP EU RIEULKIYEOK +0x9865 0xC062 #HANGUL SYLLABLE SSANGPIEUP EU RIEULMIEUM +0x9866 0xC063 #HANGUL SYLLABLE SSANGPIEUP EU RIEULPIEUP +0x9867 0xC064 #HANGUL SYLLABLE SSANGPIEUP EU RIEULSIOS +0x9868 0xC065 #HANGUL SYLLABLE SSANGPIEUP EU RIEULTHIEUTH +0x9869 0xC066 #HANGUL SYLLABLE SSANGPIEUP EU RIEULPHIEUPH +0x986A 0xC067 #HANGUL SYLLABLE SSANGPIEUP EU RIEULHIEUH +0x986B 0xC06A #HANGUL SYLLABLE SSANGPIEUP EU PIEUPSIOS +0x986C 0xC06B #HANGUL SYLLABLE SSANGPIEUP EU SIOS +0x986D 0xC06C #HANGUL SYLLABLE SSANGPIEUP EU SSANGSIOS +0x986E 0xC06D #HANGUL SYLLABLE SSANGPIEUP EU IEUNG +0x986F 0xC06E #HANGUL SYLLABLE SSANGPIEUP EU CIEUC +0x9870 0xC06F #HANGUL SYLLABLE SSANGPIEUP EU CHIEUCH +0x9871 0xC070 #HANGUL SYLLABLE SSANGPIEUP EU KHIEUKH +0x9872 0xC071 #HANGUL SYLLABLE SSANGPIEUP EU THIEUTH +0x9873 0xC072 #HANGUL SYLLABLE SSANGPIEUP EU PHIEUPH +0x9874 0xC073 #HANGUL SYLLABLE SSANGPIEUP EU HIEUH +0x9875 0xC074 #HANGUL SYLLABLE SSANGPIEUP YI +0x9876 0xC075 #HANGUL SYLLABLE SSANGPIEUP YI KIYEOK +0x9877 0xC076 #HANGUL SYLLABLE SSANGPIEUP YI SSANGKIYEOK +0x9878 0xC077 #HANGUL SYLLABLE SSANGPIEUP YI KIYEOKSIOS +0x9879 0xC078 #HANGUL SYLLABLE SSANGPIEUP YI NIEUN +0x987A 0xC079 #HANGUL SYLLABLE SSANGPIEUP YI NIEUNCIEUC +0x9881 0xC07A #HANGUL SYLLABLE SSANGPIEUP YI NIEUNHIEUH +0x9882 0xC07B #HANGUL SYLLABLE SSANGPIEUP YI TIKEUT +0x9883 0xC07C #HANGUL SYLLABLE SSANGPIEUP YI RIEUL +0x9884 0xC07D #HANGUL SYLLABLE SSANGPIEUP YI RIEULKIYEOK +0x9885 0xC07E #HANGUL SYLLABLE SSANGPIEUP YI RIEULMIEUM +0x9886 0xC07F #HANGUL SYLLABLE SSANGPIEUP YI RIEULPIEUP +0x9887 0xC080 #HANGUL SYLLABLE SSANGPIEUP YI RIEULSIOS +0x9888 0xC081 #HANGUL SYLLABLE SSANGPIEUP YI RIEULTHIEUTH +0x9889 0xC082 #HANGUL SYLLABLE SSANGPIEUP YI RIEULPHIEUPH +0x988A 0xC083 #HANGUL SYLLABLE SSANGPIEUP YI RIEULHIEUH +0x988B 0xC084 #HANGUL SYLLABLE SSANGPIEUP YI MIEUM +0x988C 0xC085 #HANGUL SYLLABLE SSANGPIEUP YI PIEUP +0x988D 0xC086 #HANGUL SYLLABLE SSANGPIEUP YI PIEUPSIOS +0x988E 0xC087 #HANGUL SYLLABLE SSANGPIEUP YI SIOS +0x988F 0xC088 #HANGUL SYLLABLE SSANGPIEUP YI SSANGSIOS +0x9890 0xC089 #HANGUL SYLLABLE SSANGPIEUP YI IEUNG +0x9891 0xC08A #HANGUL SYLLABLE SSANGPIEUP YI CIEUC +0x9892 0xC08B #HANGUL SYLLABLE SSANGPIEUP YI CHIEUCH +0x9893 0xC08C #HANGUL SYLLABLE SSANGPIEUP YI KHIEUKH +0x9894 0xC08D #HANGUL SYLLABLE SSANGPIEUP YI THIEUTH +0x9895 0xC08E #HANGUL SYLLABLE SSANGPIEUP YI PHIEUPH +0x9896 0xC08F #HANGUL SYLLABLE SSANGPIEUP YI HIEUH +0x9897 0xC092 #HANGUL SYLLABLE SSANGPIEUP I SSANGKIYEOK +0x9898 0xC093 #HANGUL SYLLABLE SSANGPIEUP I KIYEOKSIOS +0x9899 0xC095 #HANGUL SYLLABLE SSANGPIEUP I NIEUNCIEUC +0x989A 0xC096 #HANGUL SYLLABLE SSANGPIEUP I NIEUNHIEUH +0x989B 0xC097 #HANGUL SYLLABLE SSANGPIEUP I TIKEUT +0x989C 0xC099 #HANGUL SYLLABLE SSANGPIEUP I RIEULKIYEOK +0x989D 0xC09A #HANGUL SYLLABLE SSANGPIEUP I RIEULMIEUM +0x989E 0xC09B #HANGUL SYLLABLE SSANGPIEUP I RIEULPIEUP +0x989F 0xC09C #HANGUL SYLLABLE SSANGPIEUP I RIEULSIOS +0x98A0 0xC09D #HANGUL SYLLABLE SSANGPIEUP I RIEULTHIEUTH +0x98A1 0xC09E #HANGUL SYLLABLE SSANGPIEUP I RIEULPHIEUPH +0x98A2 0xC09F #HANGUL SYLLABLE SSANGPIEUP I RIEULHIEUH +0x98A3 0xC0A2 #HANGUL SYLLABLE SSANGPIEUP I PIEUPSIOS +0x98A4 0xC0A4 #HANGUL SYLLABLE SSANGPIEUP I SSANGSIOS +0x98A5 0xC0A6 #HANGUL SYLLABLE SSANGPIEUP I CIEUC +0x98A6 0xC0A7 #HANGUL SYLLABLE SSANGPIEUP I CHIEUCH +0x98A7 0xC0A8 #HANGUL SYLLABLE SSANGPIEUP I KHIEUKH +0x98A8 0xC0A9 #HANGUL SYLLABLE SSANGPIEUP I THIEUTH +0x98A9 0xC0AA #HANGUL SYLLABLE SSANGPIEUP I PHIEUPH +0x98AA 0xC0AB #HANGUL SYLLABLE SSANGPIEUP I HIEUH +0x98AB 0xC0AE #HANGUL SYLLABLE SIOS A SSANGKIYEOK +0x98AC 0xC0B1 #HANGUL SYLLABLE SIOS A NIEUNCIEUC +0x98AD 0xC0B2 #HANGUL SYLLABLE SIOS A NIEUNHIEUH +0x98AE 0xC0B7 #HANGUL SYLLABLE SIOS A RIEULPIEUP +0x98AF 0xC0B8 #HANGUL SYLLABLE SIOS A RIEULSIOS +0x98B0 0xC0B9 #HANGUL SYLLABLE SIOS A RIEULTHIEUTH +0x98B1 0xC0BA #HANGUL SYLLABLE SIOS A RIEULPHIEUPH +0x98B2 0xC0BB #HANGUL SYLLABLE SIOS A RIEULHIEUH +0x98B3 0xC0BE #HANGUL SYLLABLE SIOS A PIEUPSIOS +0x98B4 0xC0C2 #HANGUL SYLLABLE SIOS A CIEUC +0x98B5 0xC0C3 #HANGUL SYLLABLE SIOS A CHIEUCH +0x98B6 0xC0C4 #HANGUL SYLLABLE SIOS A KHIEUKH +0x98B7 0xC0C6 #HANGUL SYLLABLE SIOS A PHIEUPH +0x98B8 0xC0C7 #HANGUL SYLLABLE SIOS A HIEUH +0x98B9 0xC0CA #HANGUL SYLLABLE SIOS AE SSANGKIYEOK +0x98BA 0xC0CB #HANGUL SYLLABLE SIOS AE KIYEOKSIOS +0x98BB 0xC0CD #HANGUL SYLLABLE SIOS AE NIEUNCIEUC +0x98BC 0xC0CE #HANGUL SYLLABLE SIOS AE NIEUNHIEUH +0x98BD 0xC0CF #HANGUL SYLLABLE SIOS AE TIKEUT +0x98BE 0xC0D1 #HANGUL SYLLABLE SIOS AE RIEULKIYEOK +0x98BF 0xC0D2 #HANGUL SYLLABLE SIOS AE RIEULMIEUM +0x98C0 0xC0D3 #HANGUL SYLLABLE SIOS AE RIEULPIEUP +0x98C1 0xC0D4 #HANGUL SYLLABLE SIOS AE RIEULSIOS +0x98C2 0xC0D5 #HANGUL SYLLABLE SIOS AE RIEULTHIEUTH +0x98C3 0xC0D6 #HANGUL SYLLABLE SIOS AE RIEULPHIEUPH +0x98C4 0xC0D7 #HANGUL SYLLABLE SIOS AE RIEULHIEUH +0x98C5 0xC0DA #HANGUL SYLLABLE SIOS AE PIEUPSIOS +0x98C6 0xC0DE #HANGUL SYLLABLE SIOS AE CIEUC +0x98C7 0xC0DF #HANGUL SYLLABLE SIOS AE CHIEUCH +0x98C8 0xC0E0 #HANGUL SYLLABLE SIOS AE KHIEUKH +0x98C9 0xC0E1 #HANGUL SYLLABLE SIOS AE THIEUTH +0x98CA 0xC0E2 #HANGUL SYLLABLE SIOS AE PHIEUPH +0x98CB 0xC0E3 #HANGUL SYLLABLE SIOS AE HIEUH +0x98CC 0xC0E6 #HANGUL SYLLABLE SIOS YA SSANGKIYEOK +0x98CD 0xC0E7 #HANGUL SYLLABLE SIOS YA KIYEOKSIOS +0x98CE 0xC0E9 #HANGUL SYLLABLE SIOS YA NIEUNCIEUC +0x98CF 0xC0EA #HANGUL SYLLABLE SIOS YA NIEUNHIEUH +0x98D0 0xC0EB #HANGUL SYLLABLE SIOS YA TIKEUT +0x98D1 0xC0ED #HANGUL SYLLABLE SIOS YA RIEULKIYEOK +0x98D2 0xC0EE #HANGUL SYLLABLE SIOS YA RIEULMIEUM +0x98D3 0xC0EF #HANGUL SYLLABLE SIOS YA RIEULPIEUP +0x98D4 0xC0F0 #HANGUL SYLLABLE SIOS YA RIEULSIOS +0x98D5 0xC0F1 #HANGUL SYLLABLE SIOS YA RIEULTHIEUTH +0x98D6 0xC0F2 #HANGUL SYLLABLE SIOS YA RIEULPHIEUPH +0x98D7 0xC0F3 #HANGUL SYLLABLE SIOS YA RIEULHIEUH +0x98D8 0xC0F6 #HANGUL SYLLABLE SIOS YA PIEUPSIOS +0x98D9 0xC0F8 #HANGUL SYLLABLE SIOS YA SSANGSIOS +0x98DA 0xC0FA #HANGUL SYLLABLE SIOS YA CIEUC +0x98DB 0xC0FB #HANGUL SYLLABLE SIOS YA CHIEUCH +0x98DC 0xC0FC #HANGUL SYLLABLE SIOS YA KHIEUKH +0x98DD 0xC0FD #HANGUL SYLLABLE SIOS YA THIEUTH +0x98DE 0xC0FE #HANGUL SYLLABLE SIOS YA PHIEUPH +0x98DF 0xC0FF #HANGUL SYLLABLE SIOS YA HIEUH +0x98E0 0xC101 #HANGUL SYLLABLE SIOS YAE KIYEOK +0x98E1 0xC102 #HANGUL SYLLABLE SIOS YAE SSANGKIYEOK +0x98E2 0xC103 #HANGUL SYLLABLE SIOS YAE KIYEOKSIOS +0x98E3 0xC105 #HANGUL SYLLABLE SIOS YAE NIEUNCIEUC +0x98E4 0xC106 #HANGUL SYLLABLE SIOS YAE NIEUNHIEUH +0x98E5 0xC107 #HANGUL SYLLABLE SIOS YAE TIKEUT +0x98E6 0xC109 #HANGUL SYLLABLE SIOS YAE RIEULKIYEOK +0x98E7 0xC10A #HANGUL SYLLABLE SIOS YAE RIEULMIEUM +0x98E8 0xC10B #HANGUL SYLLABLE SIOS YAE RIEULPIEUP +0x98E9 0xC10C #HANGUL SYLLABLE SIOS YAE RIEULSIOS +0x98EA 0xC10D #HANGUL SYLLABLE SIOS YAE RIEULTHIEUTH +0x98EB 0xC10E #HANGUL SYLLABLE SIOS YAE RIEULPHIEUPH +0x98EC 0xC10F #HANGUL SYLLABLE SIOS YAE RIEULHIEUH +0x98ED 0xC111 #HANGUL SYLLABLE SIOS YAE PIEUP +0x98EE 0xC112 #HANGUL SYLLABLE SIOS YAE PIEUPSIOS +0x98EF 0xC113 #HANGUL SYLLABLE SIOS YAE SIOS +0x98F0 0xC114 #HANGUL SYLLABLE SIOS YAE SSANGSIOS +0x98F1 0xC116 #HANGUL SYLLABLE SIOS YAE CIEUC +0x98F2 0xC117 #HANGUL SYLLABLE SIOS YAE CHIEUCH +0x98F3 0xC118 #HANGUL SYLLABLE SIOS YAE KHIEUKH +0x98F4 0xC119 #HANGUL SYLLABLE SIOS YAE THIEUTH +0x98F5 0xC11A #HANGUL SYLLABLE SIOS YAE PHIEUPH +0x98F6 0xC11B #HANGUL SYLLABLE SIOS YAE HIEUH +0x98F7 0xC121 #HANGUL SYLLABLE SIOS EO NIEUNCIEUC +0x98F8 0xC122 #HANGUL SYLLABLE SIOS EO NIEUNHIEUH +0x98F9 0xC125 #HANGUL SYLLABLE SIOS EO RIEULKIYEOK +0x98FA 0xC128 #HANGUL SYLLABLE SIOS EO RIEULSIOS +0x98FB 0xC129 #HANGUL SYLLABLE SIOS EO RIEULTHIEUTH +0x98FC 0xC12A #HANGUL SYLLABLE SIOS EO RIEULPHIEUPH +0x98FD 0xC12B #HANGUL SYLLABLE SIOS EO RIEULHIEUH +0x98FE 0xC12E #HANGUL SYLLABLE SIOS EO PIEUPSIOS +0x9941 0xC132 #HANGUL SYLLABLE SIOS EO CIEUC +0x9942 0xC133 #HANGUL SYLLABLE SIOS EO CHIEUCH +0x9943 0xC134 #HANGUL SYLLABLE SIOS EO KHIEUKH +0x9944 0xC135 #HANGUL SYLLABLE SIOS EO THIEUTH +0x9945 0xC137 #HANGUL SYLLABLE SIOS EO HIEUH +0x9946 0xC13A #HANGUL SYLLABLE SIOS E SSANGKIYEOK +0x9947 0xC13B #HANGUL SYLLABLE SIOS E KIYEOKSIOS +0x9948 0xC13D #HANGUL SYLLABLE SIOS E NIEUNCIEUC +0x9949 0xC13E #HANGUL SYLLABLE SIOS E NIEUNHIEUH +0x994A 0xC13F #HANGUL SYLLABLE SIOS E TIKEUT +0x994B 0xC141 #HANGUL SYLLABLE SIOS E RIEULKIYEOK +0x994C 0xC142 #HANGUL SYLLABLE SIOS E RIEULMIEUM +0x994D 0xC143 #HANGUL SYLLABLE SIOS E RIEULPIEUP +0x994E 0xC144 #HANGUL SYLLABLE SIOS E RIEULSIOS +0x994F 0xC145 #HANGUL SYLLABLE SIOS E RIEULTHIEUTH +0x9950 0xC146 #HANGUL SYLLABLE SIOS E RIEULPHIEUPH +0x9951 0xC147 #HANGUL SYLLABLE SIOS E RIEULHIEUH +0x9952 0xC14A #HANGUL SYLLABLE SIOS E PIEUPSIOS +0x9953 0xC14E #HANGUL SYLLABLE SIOS E CIEUC +0x9954 0xC14F #HANGUL SYLLABLE SIOS E CHIEUCH +0x9955 0xC150 #HANGUL SYLLABLE SIOS E KHIEUKH +0x9956 0xC151 #HANGUL SYLLABLE SIOS E THIEUTH +0x9957 0xC152 #HANGUL SYLLABLE SIOS E PHIEUPH +0x9958 0xC153 #HANGUL SYLLABLE SIOS E HIEUH +0x9959 0xC156 #HANGUL SYLLABLE SIOS YEO SSANGKIYEOK +0x995A 0xC157 #HANGUL SYLLABLE SIOS YEO KIYEOKSIOS +0x9961 0xC159 #HANGUL SYLLABLE SIOS YEO NIEUNCIEUC +0x9962 0xC15A #HANGUL SYLLABLE SIOS YEO NIEUNHIEUH +0x9963 0xC15B #HANGUL SYLLABLE SIOS YEO TIKEUT +0x9964 0xC15D #HANGUL SYLLABLE SIOS YEO RIEULKIYEOK +0x9965 0xC15E #HANGUL SYLLABLE SIOS YEO RIEULMIEUM +0x9966 0xC15F #HANGUL SYLLABLE SIOS YEO RIEULPIEUP +0x9967 0xC160 #HANGUL SYLLABLE SIOS YEO RIEULSIOS +0x9968 0xC161 #HANGUL SYLLABLE SIOS YEO RIEULTHIEUTH +0x9969 0xC162 #HANGUL SYLLABLE SIOS YEO RIEULPHIEUPH +0x996A 0xC163 #HANGUL SYLLABLE SIOS YEO RIEULHIEUH +0x996B 0xC166 #HANGUL SYLLABLE SIOS YEO PIEUPSIOS +0x996C 0xC16A #HANGUL SYLLABLE SIOS YEO CIEUC +0x996D 0xC16B #HANGUL SYLLABLE SIOS YEO CHIEUCH +0x996E 0xC16C #HANGUL SYLLABLE SIOS YEO KHIEUKH +0x996F 0xC16D #HANGUL SYLLABLE SIOS YEO THIEUTH +0x9970 0xC16E #HANGUL SYLLABLE SIOS YEO PHIEUPH +0x9971 0xC16F #HANGUL SYLLABLE SIOS YEO HIEUH +0x9972 0xC171 #HANGUL SYLLABLE SIOS YE KIYEOK +0x9973 0xC172 #HANGUL SYLLABLE SIOS YE SSANGKIYEOK +0x9974 0xC173 #HANGUL SYLLABLE SIOS YE KIYEOKSIOS +0x9975 0xC175 #HANGUL SYLLABLE SIOS YE NIEUNCIEUC +0x9976 0xC176 #HANGUL SYLLABLE SIOS YE NIEUNHIEUH +0x9977 0xC177 #HANGUL SYLLABLE SIOS YE TIKEUT +0x9978 0xC179 #HANGUL SYLLABLE SIOS YE RIEULKIYEOK +0x9979 0xC17A #HANGUL SYLLABLE SIOS YE RIEULMIEUM +0x997A 0xC17B #HANGUL SYLLABLE SIOS YE RIEULPIEUP +0x9981 0xC17C #HANGUL SYLLABLE SIOS YE RIEULSIOS +0x9982 0xC17D #HANGUL SYLLABLE SIOS YE RIEULTHIEUTH +0x9983 0xC17E #HANGUL SYLLABLE SIOS YE RIEULPHIEUPH +0x9984 0xC17F #HANGUL SYLLABLE SIOS YE RIEULHIEUH +0x9985 0xC180 #HANGUL SYLLABLE SIOS YE MIEUM +0x9986 0xC181 #HANGUL SYLLABLE SIOS YE PIEUP +0x9987 0xC182 #HANGUL SYLLABLE SIOS YE PIEUPSIOS +0x9988 0xC183 #HANGUL SYLLABLE SIOS YE SIOS +0x9989 0xC184 #HANGUL SYLLABLE SIOS YE SSANGSIOS +0x998A 0xC186 #HANGUL SYLLABLE SIOS YE CIEUC +0x998B 0xC187 #HANGUL SYLLABLE SIOS YE CHIEUCH +0x998C 0xC188 #HANGUL SYLLABLE SIOS YE KHIEUKH +0x998D 0xC189 #HANGUL SYLLABLE SIOS YE THIEUTH +0x998E 0xC18A #HANGUL SYLLABLE SIOS YE PHIEUPH +0x998F 0xC18B #HANGUL SYLLABLE SIOS YE HIEUH +0x9990 0xC18F #HANGUL SYLLABLE SIOS O KIYEOKSIOS +0x9991 0xC191 #HANGUL SYLLABLE SIOS O NIEUNCIEUC +0x9992 0xC192 #HANGUL SYLLABLE SIOS O NIEUNHIEUH +0x9993 0xC193 #HANGUL SYLLABLE SIOS O TIKEUT +0x9994 0xC195 #HANGUL SYLLABLE SIOS O RIEULKIYEOK +0x9995 0xC197 #HANGUL SYLLABLE SIOS O RIEULPIEUP +0x9996 0xC198 #HANGUL SYLLABLE SIOS O RIEULSIOS +0x9997 0xC199 #HANGUL SYLLABLE SIOS O RIEULTHIEUTH +0x9998 0xC19A #HANGUL SYLLABLE SIOS O RIEULPHIEUPH +0x9999 0xC19B #HANGUL SYLLABLE SIOS O RIEULHIEUH +0x999A 0xC19E #HANGUL SYLLABLE SIOS O PIEUPSIOS +0x999B 0xC1A0 #HANGUL SYLLABLE SIOS O SSANGSIOS +0x999C 0xC1A2 #HANGUL SYLLABLE SIOS O CIEUC +0x999D 0xC1A3 #HANGUL SYLLABLE SIOS O CHIEUCH +0x999E 0xC1A4 #HANGUL SYLLABLE SIOS O KHIEUKH +0x999F 0xC1A6 #HANGUL SYLLABLE SIOS O PHIEUPH +0x99A0 0xC1A7 #HANGUL SYLLABLE SIOS O HIEUH +0x99A1 0xC1AA #HANGUL SYLLABLE SIOS WA SSANGKIYEOK +0x99A2 0xC1AB #HANGUL SYLLABLE SIOS WA KIYEOKSIOS +0x99A3 0xC1AD #HANGUL SYLLABLE SIOS WA NIEUNCIEUC +0x99A4 0xC1AE #HANGUL SYLLABLE SIOS WA NIEUNHIEUH +0x99A5 0xC1AF #HANGUL SYLLABLE SIOS WA TIKEUT +0x99A6 0xC1B1 #HANGUL SYLLABLE SIOS WA RIEULKIYEOK +0x99A7 0xC1B2 #HANGUL SYLLABLE SIOS WA RIEULMIEUM +0x99A8 0xC1B3 #HANGUL SYLLABLE SIOS WA RIEULPIEUP +0x99A9 0xC1B4 #HANGUL SYLLABLE SIOS WA RIEULSIOS +0x99AA 0xC1B5 #HANGUL SYLLABLE SIOS WA RIEULTHIEUTH +0x99AB 0xC1B6 #HANGUL SYLLABLE SIOS WA RIEULPHIEUPH +0x99AC 0xC1B7 #HANGUL SYLLABLE SIOS WA RIEULHIEUH +0x99AD 0xC1B8 #HANGUL SYLLABLE SIOS WA MIEUM +0x99AE 0xC1B9 #HANGUL SYLLABLE SIOS WA PIEUP +0x99AF 0xC1BA #HANGUL SYLLABLE SIOS WA PIEUPSIOS +0x99B0 0xC1BB #HANGUL SYLLABLE SIOS WA SIOS +0x99B1 0xC1BC #HANGUL SYLLABLE SIOS WA SSANGSIOS +0x99B2 0xC1BE #HANGUL SYLLABLE SIOS WA CIEUC +0x99B3 0xC1BF #HANGUL SYLLABLE SIOS WA CHIEUCH +0x99B4 0xC1C0 #HANGUL SYLLABLE SIOS WA KHIEUKH +0x99B5 0xC1C1 #HANGUL SYLLABLE SIOS WA THIEUTH +0x99B6 0xC1C2 #HANGUL SYLLABLE SIOS WA PHIEUPH +0x99B7 0xC1C3 #HANGUL SYLLABLE SIOS WA HIEUH +0x99B8 0xC1C5 #HANGUL SYLLABLE SIOS WAE KIYEOK +0x99B9 0xC1C6 #HANGUL SYLLABLE SIOS WAE SSANGKIYEOK +0x99BA 0xC1C7 #HANGUL SYLLABLE SIOS WAE KIYEOKSIOS +0x99BB 0xC1C9 #HANGUL SYLLABLE SIOS WAE NIEUNCIEUC +0x99BC 0xC1CA #HANGUL SYLLABLE SIOS WAE NIEUNHIEUH +0x99BD 0xC1CB #HANGUL SYLLABLE SIOS WAE TIKEUT +0x99BE 0xC1CD #HANGUL SYLLABLE SIOS WAE RIEULKIYEOK +0x99BF 0xC1CE #HANGUL SYLLABLE SIOS WAE RIEULMIEUM +0x99C0 0xC1CF #HANGUL SYLLABLE SIOS WAE RIEULPIEUP +0x99C1 0xC1D0 #HANGUL SYLLABLE SIOS WAE RIEULSIOS +0x99C2 0xC1D1 #HANGUL SYLLABLE SIOS WAE RIEULTHIEUTH +0x99C3 0xC1D2 #HANGUL SYLLABLE SIOS WAE RIEULPHIEUPH +0x99C4 0xC1D3 #HANGUL SYLLABLE SIOS WAE RIEULHIEUH +0x99C5 0xC1D5 #HANGUL SYLLABLE SIOS WAE PIEUP +0x99C6 0xC1D6 #HANGUL SYLLABLE SIOS WAE PIEUPSIOS +0x99C7 0xC1D9 #HANGUL SYLLABLE SIOS WAE IEUNG +0x99C8 0xC1DA #HANGUL SYLLABLE SIOS WAE CIEUC +0x99C9 0xC1DB #HANGUL SYLLABLE SIOS WAE CHIEUCH +0x99CA 0xC1DC #HANGUL SYLLABLE SIOS WAE KHIEUKH +0x99CB 0xC1DD #HANGUL SYLLABLE SIOS WAE THIEUTH +0x99CC 0xC1DE #HANGUL SYLLABLE SIOS WAE PHIEUPH +0x99CD 0xC1DF #HANGUL SYLLABLE SIOS WAE HIEUH +0x99CE 0xC1E1 #HANGUL SYLLABLE SIOS OE KIYEOK +0x99CF 0xC1E2 #HANGUL SYLLABLE SIOS OE SSANGKIYEOK +0x99D0 0xC1E3 #HANGUL SYLLABLE SIOS OE KIYEOKSIOS +0x99D1 0xC1E5 #HANGUL SYLLABLE SIOS OE NIEUNCIEUC +0x99D2 0xC1E6 #HANGUL SYLLABLE SIOS OE NIEUNHIEUH +0x99D3 0xC1E7 #HANGUL SYLLABLE SIOS OE TIKEUT +0x99D4 0xC1E9 #HANGUL SYLLABLE SIOS OE RIEULKIYEOK +0x99D5 0xC1EA #HANGUL SYLLABLE SIOS OE RIEULMIEUM +0x99D6 0xC1EB #HANGUL SYLLABLE SIOS OE RIEULPIEUP +0x99D7 0xC1EC #HANGUL SYLLABLE SIOS OE RIEULSIOS +0x99D8 0xC1ED #HANGUL SYLLABLE SIOS OE RIEULTHIEUTH +0x99D9 0xC1EE #HANGUL SYLLABLE SIOS OE RIEULPHIEUPH +0x99DA 0xC1EF #HANGUL SYLLABLE SIOS OE RIEULHIEUH +0x99DB 0xC1F2 #HANGUL SYLLABLE SIOS OE PIEUPSIOS +0x99DC 0xC1F4 #HANGUL SYLLABLE SIOS OE SSANGSIOS +0x99DD 0xC1F5 #HANGUL SYLLABLE SIOS OE IEUNG +0x99DE 0xC1F6 #HANGUL SYLLABLE SIOS OE CIEUC +0x99DF 0xC1F7 #HANGUL SYLLABLE SIOS OE CHIEUCH +0x99E0 0xC1F8 #HANGUL SYLLABLE SIOS OE KHIEUKH +0x99E1 0xC1F9 #HANGUL SYLLABLE SIOS OE THIEUTH +0x99E2 0xC1FA #HANGUL SYLLABLE SIOS OE PHIEUPH +0x99E3 0xC1FB #HANGUL SYLLABLE SIOS OE HIEUH +0x99E4 0xC1FE #HANGUL SYLLABLE SIOS YO SSANGKIYEOK +0x99E5 0xC1FF #HANGUL SYLLABLE SIOS YO KIYEOKSIOS +0x99E6 0xC201 #HANGUL SYLLABLE SIOS YO NIEUNCIEUC +0x99E7 0xC202 #HANGUL SYLLABLE SIOS YO NIEUNHIEUH +0x99E8 0xC203 #HANGUL SYLLABLE SIOS YO TIKEUT +0x99E9 0xC205 #HANGUL SYLLABLE SIOS YO RIEULKIYEOK +0x99EA 0xC206 #HANGUL SYLLABLE SIOS YO RIEULMIEUM +0x99EB 0xC207 #HANGUL SYLLABLE SIOS YO RIEULPIEUP +0x99EC 0xC208 #HANGUL SYLLABLE SIOS YO RIEULSIOS +0x99ED 0xC209 #HANGUL SYLLABLE SIOS YO RIEULTHIEUTH +0x99EE 0xC20A #HANGUL SYLLABLE SIOS YO RIEULPHIEUPH +0x99EF 0xC20B #HANGUL SYLLABLE SIOS YO RIEULHIEUH +0x99F0 0xC20E #HANGUL SYLLABLE SIOS YO PIEUPSIOS +0x99F1 0xC210 #HANGUL SYLLABLE SIOS YO SSANGSIOS +0x99F2 0xC212 #HANGUL SYLLABLE SIOS YO CIEUC +0x99F3 0xC213 #HANGUL SYLLABLE SIOS YO CHIEUCH +0x99F4 0xC214 #HANGUL SYLLABLE SIOS YO KHIEUKH +0x99F5 0xC215 #HANGUL SYLLABLE SIOS YO THIEUTH +0x99F6 0xC216 #HANGUL SYLLABLE SIOS YO PHIEUPH +0x99F7 0xC217 #HANGUL SYLLABLE SIOS YO HIEUH +0x99F8 0xC21A #HANGUL SYLLABLE SIOS U SSANGKIYEOK +0x99F9 0xC21B #HANGUL SYLLABLE SIOS U KIYEOKSIOS +0x99FA 0xC21D #HANGUL SYLLABLE SIOS U NIEUNCIEUC +0x99FB 0xC21E #HANGUL SYLLABLE SIOS U NIEUNHIEUH +0x99FC 0xC221 #HANGUL SYLLABLE SIOS U RIEULKIYEOK +0x99FD 0xC222 #HANGUL SYLLABLE SIOS U RIEULMIEUM +0x99FE 0xC223 #HANGUL SYLLABLE SIOS U RIEULPIEUP +0x9A41 0xC224 #HANGUL SYLLABLE SIOS U RIEULSIOS +0x9A42 0xC225 #HANGUL SYLLABLE SIOS U RIEULTHIEUTH +0x9A43 0xC226 #HANGUL SYLLABLE SIOS U RIEULPHIEUPH +0x9A44 0xC227 #HANGUL SYLLABLE SIOS U RIEULHIEUH +0x9A45 0xC22A #HANGUL SYLLABLE SIOS U PIEUPSIOS +0x9A46 0xC22C #HANGUL SYLLABLE SIOS U SSANGSIOS +0x9A47 0xC22E #HANGUL SYLLABLE SIOS U CIEUC +0x9A48 0xC230 #HANGUL SYLLABLE SIOS U KHIEUKH +0x9A49 0xC233 #HANGUL SYLLABLE SIOS U HIEUH +0x9A4A 0xC235 #HANGUL SYLLABLE SIOS WEO KIYEOK +0x9A4B 0xC236 #HANGUL SYLLABLE SIOS WEO SSANGKIYEOK +0x9A4C 0xC237 #HANGUL SYLLABLE SIOS WEO KIYEOKSIOS +0x9A4D 0xC238 #HANGUL SYLLABLE SIOS WEO NIEUN +0x9A4E 0xC239 #HANGUL SYLLABLE SIOS WEO NIEUNCIEUC +0x9A4F 0xC23A #HANGUL SYLLABLE SIOS WEO NIEUNHIEUH +0x9A50 0xC23B #HANGUL SYLLABLE SIOS WEO TIKEUT +0x9A51 0xC23C #HANGUL SYLLABLE SIOS WEO RIEUL +0x9A52 0xC23D #HANGUL SYLLABLE SIOS WEO RIEULKIYEOK +0x9A53 0xC23E #HANGUL SYLLABLE SIOS WEO RIEULMIEUM +0x9A54 0xC23F #HANGUL SYLLABLE SIOS WEO RIEULPIEUP +0x9A55 0xC240 #HANGUL SYLLABLE SIOS WEO RIEULSIOS +0x9A56 0xC241 #HANGUL SYLLABLE SIOS WEO RIEULTHIEUTH +0x9A57 0xC242 #HANGUL SYLLABLE SIOS WEO RIEULPHIEUPH +0x9A58 0xC243 #HANGUL SYLLABLE SIOS WEO RIEULHIEUH +0x9A59 0xC244 #HANGUL SYLLABLE SIOS WEO MIEUM +0x9A5A 0xC245 #HANGUL SYLLABLE SIOS WEO PIEUP +0x9A61 0xC246 #HANGUL SYLLABLE SIOS WEO PIEUPSIOS +0x9A62 0xC247 #HANGUL SYLLABLE SIOS WEO SIOS +0x9A63 0xC249 #HANGUL SYLLABLE SIOS WEO IEUNG +0x9A64 0xC24A #HANGUL SYLLABLE SIOS WEO CIEUC +0x9A65 0xC24B #HANGUL SYLLABLE SIOS WEO CHIEUCH +0x9A66 0xC24C #HANGUL SYLLABLE SIOS WEO KHIEUKH +0x9A67 0xC24D #HANGUL SYLLABLE SIOS WEO THIEUTH +0x9A68 0xC24E #HANGUL SYLLABLE SIOS WEO PHIEUPH +0x9A69 0xC24F #HANGUL SYLLABLE SIOS WEO HIEUH +0x9A6A 0xC252 #HANGUL SYLLABLE SIOS WE SSANGKIYEOK +0x9A6B 0xC253 #HANGUL SYLLABLE SIOS WE KIYEOKSIOS +0x9A6C 0xC255 #HANGUL SYLLABLE SIOS WE NIEUNCIEUC +0x9A6D 0xC256 #HANGUL SYLLABLE SIOS WE NIEUNHIEUH +0x9A6E 0xC257 #HANGUL SYLLABLE SIOS WE TIKEUT +0x9A6F 0xC259 #HANGUL SYLLABLE SIOS WE RIEULKIYEOK +0x9A70 0xC25A #HANGUL SYLLABLE SIOS WE RIEULMIEUM +0x9A71 0xC25B #HANGUL SYLLABLE SIOS WE RIEULPIEUP +0x9A72 0xC25C #HANGUL SYLLABLE SIOS WE RIEULSIOS +0x9A73 0xC25D #HANGUL SYLLABLE SIOS WE RIEULTHIEUTH +0x9A74 0xC25E #HANGUL SYLLABLE SIOS WE RIEULPHIEUPH +0x9A75 0xC25F #HANGUL SYLLABLE SIOS WE RIEULHIEUH +0x9A76 0xC261 #HANGUL SYLLABLE SIOS WE PIEUP +0x9A77 0xC262 #HANGUL SYLLABLE SIOS WE PIEUPSIOS +0x9A78 0xC263 #HANGUL SYLLABLE SIOS WE SIOS +0x9A79 0xC264 #HANGUL SYLLABLE SIOS WE SSANGSIOS +0x9A7A 0xC266 #HANGUL SYLLABLE SIOS WE CIEUC +0x9A81 0xC267 #HANGUL SYLLABLE SIOS WE CHIEUCH +0x9A82 0xC268 #HANGUL SYLLABLE SIOS WE KHIEUKH +0x9A83 0xC269 #HANGUL SYLLABLE SIOS WE THIEUTH +0x9A84 0xC26A #HANGUL SYLLABLE SIOS WE PHIEUPH +0x9A85 0xC26B #HANGUL SYLLABLE SIOS WE HIEUH +0x9A86 0xC26E #HANGUL SYLLABLE SIOS WI SSANGKIYEOK +0x9A87 0xC26F #HANGUL SYLLABLE SIOS WI KIYEOKSIOS +0x9A88 0xC271 #HANGUL SYLLABLE SIOS WI NIEUNCIEUC +0x9A89 0xC272 #HANGUL SYLLABLE SIOS WI NIEUNHIEUH +0x9A8A 0xC273 #HANGUL SYLLABLE SIOS WI TIKEUT +0x9A8B 0xC275 #HANGUL SYLLABLE SIOS WI RIEULKIYEOK +0x9A8C 0xC276 #HANGUL SYLLABLE SIOS WI RIEULMIEUM +0x9A8D 0xC277 #HANGUL SYLLABLE SIOS WI RIEULPIEUP +0x9A8E 0xC278 #HANGUL SYLLABLE SIOS WI RIEULSIOS +0x9A8F 0xC279 #HANGUL SYLLABLE SIOS WI RIEULTHIEUTH +0x9A90 0xC27A #HANGUL SYLLABLE SIOS WI RIEULPHIEUPH +0x9A91 0xC27B #HANGUL SYLLABLE SIOS WI RIEULHIEUH +0x9A92 0xC27E #HANGUL SYLLABLE SIOS WI PIEUPSIOS +0x9A93 0xC280 #HANGUL SYLLABLE SIOS WI SSANGSIOS +0x9A94 0xC282 #HANGUL SYLLABLE SIOS WI CIEUC +0x9A95 0xC283 #HANGUL SYLLABLE SIOS WI CHIEUCH +0x9A96 0xC284 #HANGUL SYLLABLE SIOS WI KHIEUKH +0x9A97 0xC285 #HANGUL SYLLABLE SIOS WI THIEUTH +0x9A98 0xC286 #HANGUL SYLLABLE SIOS WI PHIEUPH +0x9A99 0xC287 #HANGUL SYLLABLE SIOS WI HIEUH +0x9A9A 0xC28A #HANGUL SYLLABLE SIOS YU SSANGKIYEOK +0x9A9B 0xC28B #HANGUL SYLLABLE SIOS YU KIYEOKSIOS +0x9A9C 0xC28C #HANGUL SYLLABLE SIOS YU NIEUN +0x9A9D 0xC28D #HANGUL SYLLABLE SIOS YU NIEUNCIEUC +0x9A9E 0xC28E #HANGUL SYLLABLE SIOS YU NIEUNHIEUH +0x9A9F 0xC28F #HANGUL SYLLABLE SIOS YU TIKEUT +0x9AA0 0xC291 #HANGUL SYLLABLE SIOS YU RIEULKIYEOK +0x9AA1 0xC292 #HANGUL SYLLABLE SIOS YU RIEULMIEUM +0x9AA2 0xC293 #HANGUL SYLLABLE SIOS YU RIEULPIEUP +0x9AA3 0xC294 #HANGUL SYLLABLE SIOS YU RIEULSIOS +0x9AA4 0xC295 #HANGUL SYLLABLE SIOS YU RIEULTHIEUTH +0x9AA5 0xC296 #HANGUL SYLLABLE SIOS YU RIEULPHIEUPH +0x9AA6 0xC297 #HANGUL SYLLABLE SIOS YU RIEULHIEUH +0x9AA7 0xC299 #HANGUL SYLLABLE SIOS YU PIEUP +0x9AA8 0xC29A #HANGUL SYLLABLE SIOS YU PIEUPSIOS +0x9AA9 0xC29C #HANGUL SYLLABLE SIOS YU SSANGSIOS +0x9AAA 0xC29E #HANGUL SYLLABLE SIOS YU CIEUC +0x9AAB 0xC29F #HANGUL SYLLABLE SIOS YU CHIEUCH +0x9AAC 0xC2A0 #HANGUL SYLLABLE SIOS YU KHIEUKH +0x9AAD 0xC2A1 #HANGUL SYLLABLE SIOS YU THIEUTH +0x9AAE 0xC2A2 #HANGUL SYLLABLE SIOS YU PHIEUPH +0x9AAF 0xC2A3 #HANGUL SYLLABLE SIOS YU HIEUH +0x9AB0 0xC2A6 #HANGUL SYLLABLE SIOS EU SSANGKIYEOK +0x9AB1 0xC2A7 #HANGUL SYLLABLE SIOS EU KIYEOKSIOS +0x9AB2 0xC2A9 #HANGUL SYLLABLE SIOS EU NIEUNCIEUC +0x9AB3 0xC2AA #HANGUL SYLLABLE SIOS EU NIEUNHIEUH +0x9AB4 0xC2AB #HANGUL SYLLABLE SIOS EU TIKEUT +0x9AB5 0xC2AE #HANGUL SYLLABLE SIOS EU RIEULMIEUM +0x9AB6 0xC2AF #HANGUL SYLLABLE SIOS EU RIEULPIEUP +0x9AB7 0xC2B0 #HANGUL SYLLABLE SIOS EU RIEULSIOS +0x9AB8 0xC2B1 #HANGUL SYLLABLE SIOS EU RIEULTHIEUTH +0x9AB9 0xC2B2 #HANGUL SYLLABLE SIOS EU RIEULPHIEUPH +0x9ABA 0xC2B3 #HANGUL SYLLABLE SIOS EU RIEULHIEUH +0x9ABB 0xC2B6 #HANGUL SYLLABLE SIOS EU PIEUPSIOS +0x9ABC 0xC2B8 #HANGUL SYLLABLE SIOS EU SSANGSIOS +0x9ABD 0xC2BA #HANGUL SYLLABLE SIOS EU CIEUC +0x9ABE 0xC2BB #HANGUL SYLLABLE SIOS EU CHIEUCH +0x9ABF 0xC2BC #HANGUL SYLLABLE SIOS EU KHIEUKH +0x9AC0 0xC2BD #HANGUL SYLLABLE SIOS EU THIEUTH +0x9AC1 0xC2BE #HANGUL SYLLABLE SIOS EU PHIEUPH +0x9AC2 0xC2BF #HANGUL SYLLABLE SIOS EU HIEUH +0x9AC3 0xC2C0 #HANGUL SYLLABLE SIOS YI +0x9AC4 0xC2C1 #HANGUL SYLLABLE SIOS YI KIYEOK +0x9AC5 0xC2C2 #HANGUL SYLLABLE SIOS YI SSANGKIYEOK +0x9AC6 0xC2C3 #HANGUL SYLLABLE SIOS YI KIYEOKSIOS +0x9AC7 0xC2C4 #HANGUL SYLLABLE SIOS YI NIEUN +0x9AC8 0xC2C5 #HANGUL SYLLABLE SIOS YI NIEUNCIEUC +0x9AC9 0xC2C6 #HANGUL SYLLABLE SIOS YI NIEUNHIEUH +0x9ACA 0xC2C7 #HANGUL SYLLABLE SIOS YI TIKEUT +0x9ACB 0xC2C8 #HANGUL SYLLABLE SIOS YI RIEUL +0x9ACC 0xC2C9 #HANGUL SYLLABLE SIOS YI RIEULKIYEOK +0x9ACD 0xC2CA #HANGUL SYLLABLE SIOS YI RIEULMIEUM +0x9ACE 0xC2CB #HANGUL SYLLABLE SIOS YI RIEULPIEUP +0x9ACF 0xC2CC #HANGUL SYLLABLE SIOS YI RIEULSIOS +0x9AD0 0xC2CD #HANGUL SYLLABLE SIOS YI RIEULTHIEUTH +0x9AD1 0xC2CE #HANGUL SYLLABLE SIOS YI RIEULPHIEUPH +0x9AD2 0xC2CF #HANGUL SYLLABLE SIOS YI RIEULHIEUH +0x9AD3 0xC2D0 #HANGUL SYLLABLE SIOS YI MIEUM +0x9AD4 0xC2D1 #HANGUL SYLLABLE SIOS YI PIEUP +0x9AD5 0xC2D2 #HANGUL SYLLABLE SIOS YI PIEUPSIOS +0x9AD6 0xC2D3 #HANGUL SYLLABLE SIOS YI SIOS +0x9AD7 0xC2D4 #HANGUL SYLLABLE SIOS YI SSANGSIOS +0x9AD8 0xC2D5 #HANGUL SYLLABLE SIOS YI IEUNG +0x9AD9 0xC2D6 #HANGUL SYLLABLE SIOS YI CIEUC +0x9ADA 0xC2D7 #HANGUL SYLLABLE SIOS YI CHIEUCH +0x9ADB 0xC2D8 #HANGUL SYLLABLE SIOS YI KHIEUKH +0x9ADC 0xC2D9 #HANGUL SYLLABLE SIOS YI THIEUTH +0x9ADD 0xC2DA #HANGUL SYLLABLE SIOS YI PHIEUPH +0x9ADE 0xC2DB #HANGUL SYLLABLE SIOS YI HIEUH +0x9ADF 0xC2DE #HANGUL SYLLABLE SIOS I SSANGKIYEOK +0x9AE0 0xC2DF #HANGUL SYLLABLE SIOS I KIYEOKSIOS +0x9AE1 0xC2E1 #HANGUL SYLLABLE SIOS I NIEUNCIEUC +0x9AE2 0xC2E2 #HANGUL SYLLABLE SIOS I NIEUNHIEUH +0x9AE3 0xC2E5 #HANGUL SYLLABLE SIOS I RIEULKIYEOK +0x9AE4 0xC2E6 #HANGUL SYLLABLE SIOS I RIEULMIEUM +0x9AE5 0xC2E7 #HANGUL SYLLABLE SIOS I RIEULPIEUP +0x9AE6 0xC2E8 #HANGUL SYLLABLE SIOS I RIEULSIOS +0x9AE7 0xC2E9 #HANGUL SYLLABLE SIOS I RIEULTHIEUTH +0x9AE8 0xC2EA #HANGUL SYLLABLE SIOS I RIEULPHIEUPH +0x9AE9 0xC2EE #HANGUL SYLLABLE SIOS I PIEUPSIOS +0x9AEA 0xC2F0 #HANGUL SYLLABLE SIOS I SSANGSIOS +0x9AEB 0xC2F2 #HANGUL SYLLABLE SIOS I CIEUC +0x9AEC 0xC2F3 #HANGUL SYLLABLE SIOS I CHIEUCH +0x9AED 0xC2F4 #HANGUL SYLLABLE SIOS I KHIEUKH +0x9AEE 0xC2F5 #HANGUL SYLLABLE SIOS I THIEUTH +0x9AEF 0xC2F7 #HANGUL SYLLABLE SIOS I HIEUH +0x9AF0 0xC2FA #HANGUL SYLLABLE SSANGSIOS A SSANGKIYEOK +0x9AF1 0xC2FD #HANGUL SYLLABLE SSANGSIOS A NIEUNCIEUC +0x9AF2 0xC2FE #HANGUL SYLLABLE SSANGSIOS A NIEUNHIEUH +0x9AF3 0xC2FF #HANGUL SYLLABLE SSANGSIOS A TIKEUT +0x9AF4 0xC301 #HANGUL SYLLABLE SSANGSIOS A RIEULKIYEOK +0x9AF5 0xC302 #HANGUL SYLLABLE SSANGSIOS A RIEULMIEUM +0x9AF6 0xC303 #HANGUL SYLLABLE SSANGSIOS A RIEULPIEUP +0x9AF7 0xC304 #HANGUL SYLLABLE SSANGSIOS A RIEULSIOS +0x9AF8 0xC305 #HANGUL SYLLABLE SSANGSIOS A RIEULTHIEUTH +0x9AF9 0xC306 #HANGUL SYLLABLE SSANGSIOS A RIEULPHIEUPH +0x9AFA 0xC307 #HANGUL SYLLABLE SSANGSIOS A RIEULHIEUH +0x9AFB 0xC30A #HANGUL SYLLABLE SSANGSIOS A PIEUPSIOS +0x9AFC 0xC30B #HANGUL SYLLABLE SSANGSIOS A SIOS +0x9AFD 0xC30E #HANGUL SYLLABLE SSANGSIOS A CIEUC +0x9AFE 0xC30F #HANGUL SYLLABLE SSANGSIOS A CHIEUCH +0x9B41 0xC310 #HANGUL SYLLABLE SSANGSIOS A KHIEUKH +0x9B42 0xC311 #HANGUL SYLLABLE SSANGSIOS A THIEUTH +0x9B43 0xC312 #HANGUL SYLLABLE SSANGSIOS A PHIEUPH +0x9B44 0xC316 #HANGUL SYLLABLE SSANGSIOS AE SSANGKIYEOK +0x9B45 0xC317 #HANGUL SYLLABLE SSANGSIOS AE KIYEOKSIOS +0x9B46 0xC319 #HANGUL SYLLABLE SSANGSIOS AE NIEUNCIEUC +0x9B47 0xC31A #HANGUL SYLLABLE SSANGSIOS AE NIEUNHIEUH +0x9B48 0xC31B #HANGUL SYLLABLE SSANGSIOS AE TIKEUT +0x9B49 0xC31D #HANGUL SYLLABLE SSANGSIOS AE RIEULKIYEOK +0x9B4A 0xC31E #HANGUL SYLLABLE SSANGSIOS AE RIEULMIEUM +0x9B4B 0xC31F #HANGUL SYLLABLE SSANGSIOS AE RIEULPIEUP +0x9B4C 0xC320 #HANGUL SYLLABLE SSANGSIOS AE RIEULSIOS +0x9B4D 0xC321 #HANGUL SYLLABLE SSANGSIOS AE RIEULTHIEUTH +0x9B4E 0xC322 #HANGUL SYLLABLE SSANGSIOS AE RIEULPHIEUPH +0x9B4F 0xC323 #HANGUL SYLLABLE SSANGSIOS AE RIEULHIEUH +0x9B50 0xC326 #HANGUL SYLLABLE SSANGSIOS AE PIEUPSIOS +0x9B51 0xC327 #HANGUL SYLLABLE SSANGSIOS AE SIOS +0x9B52 0xC32A #HANGUL SYLLABLE SSANGSIOS AE CIEUC +0x9B53 0xC32B #HANGUL SYLLABLE SSANGSIOS AE CHIEUCH +0x9B54 0xC32C #HANGUL SYLLABLE SSANGSIOS AE KHIEUKH +0x9B55 0xC32D #HANGUL SYLLABLE SSANGSIOS AE THIEUTH +0x9B56 0xC32E #HANGUL SYLLABLE SSANGSIOS AE PHIEUPH +0x9B57 0xC32F #HANGUL SYLLABLE SSANGSIOS AE HIEUH +0x9B58 0xC330 #HANGUL SYLLABLE SSANGSIOS YA +0x9B59 0xC331 #HANGUL SYLLABLE SSANGSIOS YA KIYEOK +0x9B5A 0xC332 #HANGUL SYLLABLE SSANGSIOS YA SSANGKIYEOK +0x9B61 0xC333 #HANGUL SYLLABLE SSANGSIOS YA KIYEOKSIOS +0x9B62 0xC334 #HANGUL SYLLABLE SSANGSIOS YA NIEUN +0x9B63 0xC335 #HANGUL SYLLABLE SSANGSIOS YA NIEUNCIEUC +0x9B64 0xC336 #HANGUL SYLLABLE SSANGSIOS YA NIEUNHIEUH +0x9B65 0xC337 #HANGUL SYLLABLE SSANGSIOS YA TIKEUT +0x9B66 0xC338 #HANGUL SYLLABLE SSANGSIOS YA RIEUL +0x9B67 0xC339 #HANGUL SYLLABLE SSANGSIOS YA RIEULKIYEOK +0x9B68 0xC33A #HANGUL SYLLABLE SSANGSIOS YA RIEULMIEUM +0x9B69 0xC33B #HANGUL SYLLABLE SSANGSIOS YA RIEULPIEUP +0x9B6A 0xC33C #HANGUL SYLLABLE SSANGSIOS YA RIEULSIOS +0x9B6B 0xC33D #HANGUL SYLLABLE SSANGSIOS YA RIEULTHIEUTH +0x9B6C 0xC33E #HANGUL SYLLABLE SSANGSIOS YA RIEULPHIEUPH +0x9B6D 0xC33F #HANGUL SYLLABLE SSANGSIOS YA RIEULHIEUH +0x9B6E 0xC340 #HANGUL SYLLABLE SSANGSIOS YA MIEUM +0x9B6F 0xC341 #HANGUL SYLLABLE SSANGSIOS YA PIEUP +0x9B70 0xC342 #HANGUL SYLLABLE SSANGSIOS YA PIEUPSIOS +0x9B71 0xC343 #HANGUL SYLLABLE SSANGSIOS YA SIOS +0x9B72 0xC344 #HANGUL SYLLABLE SSANGSIOS YA SSANGSIOS +0x9B73 0xC346 #HANGUL SYLLABLE SSANGSIOS YA CIEUC +0x9B74 0xC347 #HANGUL SYLLABLE SSANGSIOS YA CHIEUCH +0x9B75 0xC348 #HANGUL SYLLABLE SSANGSIOS YA KHIEUKH +0x9B76 0xC349 #HANGUL SYLLABLE SSANGSIOS YA THIEUTH +0x9B77 0xC34A #HANGUL SYLLABLE SSANGSIOS YA PHIEUPH +0x9B78 0xC34B #HANGUL SYLLABLE SSANGSIOS YA HIEUH +0x9B79 0xC34C #HANGUL SYLLABLE SSANGSIOS YAE +0x9B7A 0xC34D #HANGUL SYLLABLE SSANGSIOS YAE KIYEOK +0x9B81 0xC34E #HANGUL SYLLABLE SSANGSIOS YAE SSANGKIYEOK +0x9B82 0xC34F #HANGUL SYLLABLE SSANGSIOS YAE KIYEOKSIOS +0x9B83 0xC350 #HANGUL SYLLABLE SSANGSIOS YAE NIEUN +0x9B84 0xC351 #HANGUL SYLLABLE SSANGSIOS YAE NIEUNCIEUC +0x9B85 0xC352 #HANGUL SYLLABLE SSANGSIOS YAE NIEUNHIEUH +0x9B86 0xC353 #HANGUL SYLLABLE SSANGSIOS YAE TIKEUT +0x9B87 0xC354 #HANGUL SYLLABLE SSANGSIOS YAE RIEUL +0x9B88 0xC355 #HANGUL SYLLABLE SSANGSIOS YAE RIEULKIYEOK +0x9B89 0xC356 #HANGUL SYLLABLE SSANGSIOS YAE RIEULMIEUM +0x9B8A 0xC357 #HANGUL SYLLABLE SSANGSIOS YAE RIEULPIEUP +0x9B8B 0xC358 #HANGUL SYLLABLE SSANGSIOS YAE RIEULSIOS +0x9B8C 0xC359 #HANGUL SYLLABLE SSANGSIOS YAE RIEULTHIEUTH +0x9B8D 0xC35A #HANGUL SYLLABLE SSANGSIOS YAE RIEULPHIEUPH +0x9B8E 0xC35B #HANGUL SYLLABLE SSANGSIOS YAE RIEULHIEUH +0x9B8F 0xC35C #HANGUL SYLLABLE SSANGSIOS YAE MIEUM +0x9B90 0xC35D #HANGUL SYLLABLE SSANGSIOS YAE PIEUP +0x9B91 0xC35E #HANGUL SYLLABLE SSANGSIOS YAE PIEUPSIOS +0x9B92 0xC35F #HANGUL SYLLABLE SSANGSIOS YAE SIOS +0x9B93 0xC360 #HANGUL SYLLABLE SSANGSIOS YAE SSANGSIOS +0x9B94 0xC361 #HANGUL SYLLABLE SSANGSIOS YAE IEUNG +0x9B95 0xC362 #HANGUL SYLLABLE SSANGSIOS YAE CIEUC +0x9B96 0xC363 #HANGUL SYLLABLE SSANGSIOS YAE CHIEUCH +0x9B97 0xC364 #HANGUL SYLLABLE SSANGSIOS YAE KHIEUKH +0x9B98 0xC365 #HANGUL SYLLABLE SSANGSIOS YAE THIEUTH +0x9B99 0xC366 #HANGUL SYLLABLE SSANGSIOS YAE PHIEUPH +0x9B9A 0xC367 #HANGUL SYLLABLE SSANGSIOS YAE HIEUH +0x9B9B 0xC36A #HANGUL SYLLABLE SSANGSIOS EO SSANGKIYEOK +0x9B9C 0xC36B #HANGUL SYLLABLE SSANGSIOS EO KIYEOKSIOS +0x9B9D 0xC36D #HANGUL SYLLABLE SSANGSIOS EO NIEUNCIEUC +0x9B9E 0xC36E #HANGUL SYLLABLE SSANGSIOS EO NIEUNHIEUH +0x9B9F 0xC36F #HANGUL SYLLABLE SSANGSIOS EO TIKEUT +0x9BA0 0xC371 #HANGUL SYLLABLE SSANGSIOS EO RIEULKIYEOK +0x9BA1 0xC373 #HANGUL SYLLABLE SSANGSIOS EO RIEULPIEUP +0x9BA2 0xC374 #HANGUL SYLLABLE SSANGSIOS EO RIEULSIOS +0x9BA3 0xC375 #HANGUL SYLLABLE SSANGSIOS EO RIEULTHIEUTH +0x9BA4 0xC376 #HANGUL SYLLABLE SSANGSIOS EO RIEULPHIEUPH +0x9BA5 0xC377 #HANGUL SYLLABLE SSANGSIOS EO RIEULHIEUH +0x9BA6 0xC37A #HANGUL SYLLABLE SSANGSIOS EO PIEUPSIOS +0x9BA7 0xC37B #HANGUL SYLLABLE SSANGSIOS EO SIOS +0x9BA8 0xC37E #HANGUL SYLLABLE SSANGSIOS EO CIEUC +0x9BA9 0xC37F #HANGUL SYLLABLE SSANGSIOS EO CHIEUCH +0x9BAA 0xC380 #HANGUL SYLLABLE SSANGSIOS EO KHIEUKH +0x9BAB 0xC381 #HANGUL SYLLABLE SSANGSIOS EO THIEUTH +0x9BAC 0xC382 #HANGUL SYLLABLE SSANGSIOS EO PHIEUPH +0x9BAD 0xC383 #HANGUL SYLLABLE SSANGSIOS EO HIEUH +0x9BAE 0xC385 #HANGUL SYLLABLE SSANGSIOS E KIYEOK +0x9BAF 0xC386 #HANGUL SYLLABLE SSANGSIOS E SSANGKIYEOK +0x9BB0 0xC387 #HANGUL SYLLABLE SSANGSIOS E KIYEOKSIOS +0x9BB1 0xC389 #HANGUL SYLLABLE SSANGSIOS E NIEUNCIEUC +0x9BB2 0xC38A #HANGUL SYLLABLE SSANGSIOS E NIEUNHIEUH +0x9BB3 0xC38B #HANGUL SYLLABLE SSANGSIOS E TIKEUT +0x9BB4 0xC38D #HANGUL SYLLABLE SSANGSIOS E RIEULKIYEOK +0x9BB5 0xC38E #HANGUL SYLLABLE SSANGSIOS E RIEULMIEUM +0x9BB6 0xC38F #HANGUL SYLLABLE SSANGSIOS E RIEULPIEUP +0x9BB7 0xC390 #HANGUL SYLLABLE SSANGSIOS E RIEULSIOS +0x9BB8 0xC391 #HANGUL SYLLABLE SSANGSIOS E RIEULTHIEUTH +0x9BB9 0xC392 #HANGUL SYLLABLE SSANGSIOS E RIEULPHIEUPH +0x9BBA 0xC393 #HANGUL SYLLABLE SSANGSIOS E RIEULHIEUH +0x9BBB 0xC394 #HANGUL SYLLABLE SSANGSIOS E MIEUM +0x9BBC 0xC395 #HANGUL SYLLABLE SSANGSIOS E PIEUP +0x9BBD 0xC396 #HANGUL SYLLABLE SSANGSIOS E PIEUPSIOS +0x9BBE 0xC397 #HANGUL SYLLABLE SSANGSIOS E SIOS +0x9BBF 0xC398 #HANGUL SYLLABLE SSANGSIOS E SSANGSIOS +0x9BC0 0xC399 #HANGUL SYLLABLE SSANGSIOS E IEUNG +0x9BC1 0xC39A #HANGUL SYLLABLE SSANGSIOS E CIEUC +0x9BC2 0xC39B #HANGUL SYLLABLE SSANGSIOS E CHIEUCH +0x9BC3 0xC39C #HANGUL SYLLABLE SSANGSIOS E KHIEUKH +0x9BC4 0xC39D #HANGUL SYLLABLE SSANGSIOS E THIEUTH +0x9BC5 0xC39E #HANGUL SYLLABLE SSANGSIOS E PHIEUPH +0x9BC6 0xC39F #HANGUL SYLLABLE SSANGSIOS E HIEUH +0x9BC7 0xC3A0 #HANGUL SYLLABLE SSANGSIOS YEO +0x9BC8 0xC3A1 #HANGUL SYLLABLE SSANGSIOS YEO KIYEOK +0x9BC9 0xC3A2 #HANGUL SYLLABLE SSANGSIOS YEO SSANGKIYEOK +0x9BCA 0xC3A3 #HANGUL SYLLABLE SSANGSIOS YEO KIYEOKSIOS +0x9BCB 0xC3A4 #HANGUL SYLLABLE SSANGSIOS YEO NIEUN +0x9BCC 0xC3A5 #HANGUL SYLLABLE SSANGSIOS YEO NIEUNCIEUC +0x9BCD 0xC3A6 #HANGUL SYLLABLE SSANGSIOS YEO NIEUNHIEUH +0x9BCE 0xC3A7 #HANGUL SYLLABLE SSANGSIOS YEO TIKEUT +0x9BCF 0xC3A8 #HANGUL SYLLABLE SSANGSIOS YEO RIEUL +0x9BD0 0xC3A9 #HANGUL SYLLABLE SSANGSIOS YEO RIEULKIYEOK +0x9BD1 0xC3AA #HANGUL SYLLABLE SSANGSIOS YEO RIEULMIEUM +0x9BD2 0xC3AB #HANGUL SYLLABLE SSANGSIOS YEO RIEULPIEUP +0x9BD3 0xC3AC #HANGUL SYLLABLE SSANGSIOS YEO RIEULSIOS +0x9BD4 0xC3AD #HANGUL SYLLABLE SSANGSIOS YEO RIEULTHIEUTH +0x9BD5 0xC3AE #HANGUL SYLLABLE SSANGSIOS YEO RIEULPHIEUPH +0x9BD6 0xC3AF #HANGUL SYLLABLE SSANGSIOS YEO RIEULHIEUH +0x9BD7 0xC3B0 #HANGUL SYLLABLE SSANGSIOS YEO MIEUM +0x9BD8 0xC3B1 #HANGUL SYLLABLE SSANGSIOS YEO PIEUP +0x9BD9 0xC3B2 #HANGUL SYLLABLE SSANGSIOS YEO PIEUPSIOS +0x9BDA 0xC3B3 #HANGUL SYLLABLE SSANGSIOS YEO SIOS +0x9BDB 0xC3B4 #HANGUL SYLLABLE SSANGSIOS YEO SSANGSIOS +0x9BDC 0xC3B5 #HANGUL SYLLABLE SSANGSIOS YEO IEUNG +0x9BDD 0xC3B6 #HANGUL SYLLABLE SSANGSIOS YEO CIEUC +0x9BDE 0xC3B7 #HANGUL SYLLABLE SSANGSIOS YEO CHIEUCH +0x9BDF 0xC3B8 #HANGUL SYLLABLE SSANGSIOS YEO KHIEUKH +0x9BE0 0xC3B9 #HANGUL SYLLABLE SSANGSIOS YEO THIEUTH +0x9BE1 0xC3BA #HANGUL SYLLABLE SSANGSIOS YEO PHIEUPH +0x9BE2 0xC3BB #HANGUL SYLLABLE SSANGSIOS YEO HIEUH +0x9BE3 0xC3BC #HANGUL SYLLABLE SSANGSIOS YE +0x9BE4 0xC3BD #HANGUL SYLLABLE SSANGSIOS YE KIYEOK +0x9BE5 0xC3BE #HANGUL SYLLABLE SSANGSIOS YE SSANGKIYEOK +0x9BE6 0xC3BF #HANGUL SYLLABLE SSANGSIOS YE KIYEOKSIOS +0x9BE7 0xC3C1 #HANGUL SYLLABLE SSANGSIOS YE NIEUNCIEUC +0x9BE8 0xC3C2 #HANGUL SYLLABLE SSANGSIOS YE NIEUNHIEUH +0x9BE9 0xC3C3 #HANGUL SYLLABLE SSANGSIOS YE TIKEUT +0x9BEA 0xC3C4 #HANGUL SYLLABLE SSANGSIOS YE RIEUL +0x9BEB 0xC3C5 #HANGUL SYLLABLE SSANGSIOS YE RIEULKIYEOK +0x9BEC 0xC3C6 #HANGUL SYLLABLE SSANGSIOS YE RIEULMIEUM +0x9BED 0xC3C7 #HANGUL SYLLABLE SSANGSIOS YE RIEULPIEUP +0x9BEE 0xC3C8 #HANGUL SYLLABLE SSANGSIOS YE RIEULSIOS +0x9BEF 0xC3C9 #HANGUL SYLLABLE SSANGSIOS YE RIEULTHIEUTH +0x9BF0 0xC3CA #HANGUL SYLLABLE SSANGSIOS YE RIEULPHIEUPH +0x9BF1 0xC3CB #HANGUL SYLLABLE SSANGSIOS YE RIEULHIEUH +0x9BF2 0xC3CC #HANGUL SYLLABLE SSANGSIOS YE MIEUM +0x9BF3 0xC3CD #HANGUL SYLLABLE SSANGSIOS YE PIEUP +0x9BF4 0xC3CE #HANGUL SYLLABLE SSANGSIOS YE PIEUPSIOS +0x9BF5 0xC3CF #HANGUL SYLLABLE SSANGSIOS YE SIOS +0x9BF6 0xC3D0 #HANGUL SYLLABLE SSANGSIOS YE SSANGSIOS +0x9BF7 0xC3D1 #HANGUL SYLLABLE SSANGSIOS YE IEUNG +0x9BF8 0xC3D2 #HANGUL SYLLABLE SSANGSIOS YE CIEUC +0x9BF9 0xC3D3 #HANGUL SYLLABLE SSANGSIOS YE CHIEUCH +0x9BFA 0xC3D4 #HANGUL SYLLABLE SSANGSIOS YE KHIEUKH +0x9BFB 0xC3D5 #HANGUL SYLLABLE SSANGSIOS YE THIEUTH +0x9BFC 0xC3D6 #HANGUL SYLLABLE SSANGSIOS YE PHIEUPH +0x9BFD 0xC3D7 #HANGUL SYLLABLE SSANGSIOS YE HIEUH +0x9BFE 0xC3DA #HANGUL SYLLABLE SSANGSIOS O SSANGKIYEOK +0x9C41 0xC3DB #HANGUL SYLLABLE SSANGSIOS O KIYEOKSIOS +0x9C42 0xC3DD #HANGUL SYLLABLE SSANGSIOS O NIEUNCIEUC +0x9C43 0xC3DE #HANGUL SYLLABLE SSANGSIOS O NIEUNHIEUH +0x9C44 0xC3E1 #HANGUL SYLLABLE SSANGSIOS O RIEULKIYEOK +0x9C45 0xC3E3 #HANGUL SYLLABLE SSANGSIOS O RIEULPIEUP +0x9C46 0xC3E4 #HANGUL SYLLABLE SSANGSIOS O RIEULSIOS +0x9C47 0xC3E5 #HANGUL SYLLABLE SSANGSIOS O RIEULTHIEUTH +0x9C48 0xC3E6 #HANGUL SYLLABLE SSANGSIOS O RIEULPHIEUPH +0x9C49 0xC3E7 #HANGUL SYLLABLE SSANGSIOS O RIEULHIEUH +0x9C4A 0xC3EA #HANGUL SYLLABLE SSANGSIOS O PIEUPSIOS +0x9C4B 0xC3EB #HANGUL SYLLABLE SSANGSIOS O SIOS +0x9C4C 0xC3EC #HANGUL SYLLABLE SSANGSIOS O SSANGSIOS +0x9C4D 0xC3EE #HANGUL SYLLABLE SSANGSIOS O CIEUC +0x9C4E 0xC3EF #HANGUL SYLLABLE SSANGSIOS O CHIEUCH +0x9C4F 0xC3F0 #HANGUL SYLLABLE SSANGSIOS O KHIEUKH +0x9C50 0xC3F1 #HANGUL SYLLABLE SSANGSIOS O THIEUTH +0x9C51 0xC3F2 #HANGUL SYLLABLE SSANGSIOS O PHIEUPH +0x9C52 0xC3F3 #HANGUL SYLLABLE SSANGSIOS O HIEUH +0x9C53 0xC3F6 #HANGUL SYLLABLE SSANGSIOS WA SSANGKIYEOK +0x9C54 0xC3F7 #HANGUL SYLLABLE SSANGSIOS WA KIYEOKSIOS +0x9C55 0xC3F9 #HANGUL SYLLABLE SSANGSIOS WA NIEUNCIEUC +0x9C56 0xC3FA #HANGUL SYLLABLE SSANGSIOS WA NIEUNHIEUH +0x9C57 0xC3FB #HANGUL SYLLABLE SSANGSIOS WA TIKEUT +0x9C58 0xC3FC #HANGUL SYLLABLE SSANGSIOS WA RIEUL +0x9C59 0xC3FD #HANGUL SYLLABLE SSANGSIOS WA RIEULKIYEOK +0x9C5A 0xC3FE #HANGUL SYLLABLE SSANGSIOS WA RIEULMIEUM +0x9C61 0xC3FF #HANGUL SYLLABLE SSANGSIOS WA RIEULPIEUP +0x9C62 0xC400 #HANGUL SYLLABLE SSANGSIOS WA RIEULSIOS +0x9C63 0xC401 #HANGUL SYLLABLE SSANGSIOS WA RIEULTHIEUTH +0x9C64 0xC402 #HANGUL SYLLABLE SSANGSIOS WA RIEULPHIEUPH +0x9C65 0xC403 #HANGUL SYLLABLE SSANGSIOS WA RIEULHIEUH +0x9C66 0xC404 #HANGUL SYLLABLE SSANGSIOS WA MIEUM +0x9C67 0xC405 #HANGUL SYLLABLE SSANGSIOS WA PIEUP +0x9C68 0xC406 #HANGUL SYLLABLE SSANGSIOS WA PIEUPSIOS +0x9C69 0xC407 #HANGUL SYLLABLE SSANGSIOS WA SIOS +0x9C6A 0xC409 #HANGUL SYLLABLE SSANGSIOS WA IEUNG +0x9C6B 0xC40A #HANGUL SYLLABLE SSANGSIOS WA CIEUC +0x9C6C 0xC40B #HANGUL SYLLABLE SSANGSIOS WA CHIEUCH +0x9C6D 0xC40C #HANGUL SYLLABLE SSANGSIOS WA KHIEUKH +0x9C6E 0xC40D #HANGUL SYLLABLE SSANGSIOS WA THIEUTH +0x9C6F 0xC40E #HANGUL SYLLABLE SSANGSIOS WA PHIEUPH +0x9C70 0xC40F #HANGUL SYLLABLE SSANGSIOS WA HIEUH +0x9C71 0xC411 #HANGUL SYLLABLE SSANGSIOS WAE KIYEOK +0x9C72 0xC412 #HANGUL SYLLABLE SSANGSIOS WAE SSANGKIYEOK +0x9C73 0xC413 #HANGUL SYLLABLE SSANGSIOS WAE KIYEOKSIOS +0x9C74 0xC414 #HANGUL SYLLABLE SSANGSIOS WAE NIEUN +0x9C75 0xC415 #HANGUL SYLLABLE SSANGSIOS WAE NIEUNCIEUC +0x9C76 0xC416 #HANGUL SYLLABLE SSANGSIOS WAE NIEUNHIEUH +0x9C77 0xC417 #HANGUL SYLLABLE SSANGSIOS WAE TIKEUT +0x9C78 0xC418 #HANGUL SYLLABLE SSANGSIOS WAE RIEUL +0x9C79 0xC419 #HANGUL SYLLABLE SSANGSIOS WAE RIEULKIYEOK +0x9C7A 0xC41A #HANGUL SYLLABLE SSANGSIOS WAE RIEULMIEUM +0x9C81 0xC41B #HANGUL SYLLABLE SSANGSIOS WAE RIEULPIEUP +0x9C82 0xC41C #HANGUL SYLLABLE SSANGSIOS WAE RIEULSIOS +0x9C83 0xC41D #HANGUL SYLLABLE SSANGSIOS WAE RIEULTHIEUTH +0x9C84 0xC41E #HANGUL SYLLABLE SSANGSIOS WAE RIEULPHIEUPH +0x9C85 0xC41F #HANGUL SYLLABLE SSANGSIOS WAE RIEULHIEUH +0x9C86 0xC420 #HANGUL SYLLABLE SSANGSIOS WAE MIEUM +0x9C87 0xC421 #HANGUL SYLLABLE SSANGSIOS WAE PIEUP +0x9C88 0xC422 #HANGUL SYLLABLE SSANGSIOS WAE PIEUPSIOS +0x9C89 0xC423 #HANGUL SYLLABLE SSANGSIOS WAE SIOS +0x9C8A 0xC425 #HANGUL SYLLABLE SSANGSIOS WAE IEUNG +0x9C8B 0xC426 #HANGUL SYLLABLE SSANGSIOS WAE CIEUC +0x9C8C 0xC427 #HANGUL SYLLABLE SSANGSIOS WAE CHIEUCH +0x9C8D 0xC428 #HANGUL SYLLABLE SSANGSIOS WAE KHIEUKH +0x9C8E 0xC429 #HANGUL SYLLABLE SSANGSIOS WAE THIEUTH +0x9C8F 0xC42A #HANGUL SYLLABLE SSANGSIOS WAE PHIEUPH +0x9C90 0xC42B #HANGUL SYLLABLE SSANGSIOS WAE HIEUH +0x9C91 0xC42D #HANGUL SYLLABLE SSANGSIOS OE KIYEOK +0x9C92 0xC42E #HANGUL SYLLABLE SSANGSIOS OE SSANGKIYEOK +0x9C93 0xC42F #HANGUL SYLLABLE SSANGSIOS OE KIYEOKSIOS +0x9C94 0xC431 #HANGUL SYLLABLE SSANGSIOS OE NIEUNCIEUC +0x9C95 0xC432 #HANGUL SYLLABLE SSANGSIOS OE NIEUNHIEUH +0x9C96 0xC433 #HANGUL SYLLABLE SSANGSIOS OE TIKEUT +0x9C97 0xC435 #HANGUL SYLLABLE SSANGSIOS OE RIEULKIYEOK +0x9C98 0xC436 #HANGUL SYLLABLE SSANGSIOS OE RIEULMIEUM +0x9C99 0xC437 #HANGUL SYLLABLE SSANGSIOS OE RIEULPIEUP +0x9C9A 0xC438 #HANGUL SYLLABLE SSANGSIOS OE RIEULSIOS +0x9C9B 0xC439 #HANGUL SYLLABLE SSANGSIOS OE RIEULTHIEUTH +0x9C9C 0xC43A #HANGUL SYLLABLE SSANGSIOS OE RIEULPHIEUPH +0x9C9D 0xC43B #HANGUL SYLLABLE SSANGSIOS OE RIEULHIEUH +0x9C9E 0xC43E #HANGUL SYLLABLE SSANGSIOS OE PIEUPSIOS +0x9C9F 0xC43F #HANGUL SYLLABLE SSANGSIOS OE SIOS +0x9CA0 0xC440 #HANGUL SYLLABLE SSANGSIOS OE SSANGSIOS +0x9CA1 0xC441 #HANGUL SYLLABLE SSANGSIOS OE IEUNG +0x9CA2 0xC442 #HANGUL SYLLABLE SSANGSIOS OE CIEUC +0x9CA3 0xC443 #HANGUL SYLLABLE SSANGSIOS OE CHIEUCH +0x9CA4 0xC444 #HANGUL SYLLABLE SSANGSIOS OE KHIEUKH +0x9CA5 0xC445 #HANGUL SYLLABLE SSANGSIOS OE THIEUTH +0x9CA6 0xC446 #HANGUL SYLLABLE SSANGSIOS OE PHIEUPH +0x9CA7 0xC447 #HANGUL SYLLABLE SSANGSIOS OE HIEUH +0x9CA8 0xC449 #HANGUL SYLLABLE SSANGSIOS YO KIYEOK +0x9CA9 0xC44A #HANGUL SYLLABLE SSANGSIOS YO SSANGKIYEOK +0x9CAA 0xC44B #HANGUL SYLLABLE SSANGSIOS YO KIYEOKSIOS +0x9CAB 0xC44C #HANGUL SYLLABLE SSANGSIOS YO NIEUN +0x9CAC 0xC44D #HANGUL SYLLABLE SSANGSIOS YO NIEUNCIEUC +0x9CAD 0xC44E #HANGUL SYLLABLE SSANGSIOS YO NIEUNHIEUH +0x9CAE 0xC44F #HANGUL SYLLABLE SSANGSIOS YO TIKEUT +0x9CAF 0xC450 #HANGUL SYLLABLE SSANGSIOS YO RIEUL +0x9CB0 0xC451 #HANGUL SYLLABLE SSANGSIOS YO RIEULKIYEOK +0x9CB1 0xC452 #HANGUL SYLLABLE SSANGSIOS YO RIEULMIEUM +0x9CB2 0xC453 #HANGUL SYLLABLE SSANGSIOS YO RIEULPIEUP +0x9CB3 0xC454 #HANGUL SYLLABLE SSANGSIOS YO RIEULSIOS +0x9CB4 0xC455 #HANGUL SYLLABLE SSANGSIOS YO RIEULTHIEUTH +0x9CB5 0xC456 #HANGUL SYLLABLE SSANGSIOS YO RIEULPHIEUPH +0x9CB6 0xC457 #HANGUL SYLLABLE SSANGSIOS YO RIEULHIEUH +0x9CB7 0xC458 #HANGUL SYLLABLE SSANGSIOS YO MIEUM +0x9CB8 0xC459 #HANGUL SYLLABLE SSANGSIOS YO PIEUP +0x9CB9 0xC45A #HANGUL SYLLABLE SSANGSIOS YO PIEUPSIOS +0x9CBA 0xC45B #HANGUL SYLLABLE SSANGSIOS YO SIOS +0x9CBB 0xC45C #HANGUL SYLLABLE SSANGSIOS YO SSANGSIOS +0x9CBC 0xC45D #HANGUL SYLLABLE SSANGSIOS YO IEUNG +0x9CBD 0xC45E #HANGUL SYLLABLE SSANGSIOS YO CIEUC +0x9CBE 0xC45F #HANGUL SYLLABLE SSANGSIOS YO CHIEUCH +0x9CBF 0xC460 #HANGUL SYLLABLE SSANGSIOS YO KHIEUKH +0x9CC0 0xC461 #HANGUL SYLLABLE SSANGSIOS YO THIEUTH +0x9CC1 0xC462 #HANGUL SYLLABLE SSANGSIOS YO PHIEUPH +0x9CC2 0xC463 #HANGUL SYLLABLE SSANGSIOS YO HIEUH +0x9CC3 0xC466 #HANGUL SYLLABLE SSANGSIOS U SSANGKIYEOK +0x9CC4 0xC467 #HANGUL SYLLABLE SSANGSIOS U KIYEOKSIOS +0x9CC5 0xC469 #HANGUL SYLLABLE SSANGSIOS U NIEUNCIEUC +0x9CC6 0xC46A #HANGUL SYLLABLE SSANGSIOS U NIEUNHIEUH +0x9CC7 0xC46B #HANGUL SYLLABLE SSANGSIOS U TIKEUT +0x9CC8 0xC46D #HANGUL SYLLABLE SSANGSIOS U RIEULKIYEOK +0x9CC9 0xC46E #HANGUL SYLLABLE SSANGSIOS U RIEULMIEUM +0x9CCA 0xC46F #HANGUL SYLLABLE SSANGSIOS U RIEULPIEUP +0x9CCB 0xC470 #HANGUL SYLLABLE SSANGSIOS U RIEULSIOS +0x9CCC 0xC471 #HANGUL SYLLABLE SSANGSIOS U RIEULTHIEUTH +0x9CCD 0xC472 #HANGUL SYLLABLE SSANGSIOS U RIEULPHIEUPH +0x9CCE 0xC473 #HANGUL SYLLABLE SSANGSIOS U RIEULHIEUH +0x9CCF 0xC476 #HANGUL SYLLABLE SSANGSIOS U PIEUPSIOS +0x9CD0 0xC477 #HANGUL SYLLABLE SSANGSIOS U SIOS +0x9CD1 0xC478 #HANGUL SYLLABLE SSANGSIOS U SSANGSIOS +0x9CD2 0xC47A #HANGUL SYLLABLE SSANGSIOS U CIEUC +0x9CD3 0xC47B #HANGUL SYLLABLE SSANGSIOS U CHIEUCH +0x9CD4 0xC47C #HANGUL SYLLABLE SSANGSIOS U KHIEUKH +0x9CD5 0xC47D #HANGUL SYLLABLE SSANGSIOS U THIEUTH +0x9CD6 0xC47E #HANGUL SYLLABLE SSANGSIOS U PHIEUPH +0x9CD7 0xC47F #HANGUL SYLLABLE SSANGSIOS U HIEUH +0x9CD8 0xC481 #HANGUL SYLLABLE SSANGSIOS WEO KIYEOK +0x9CD9 0xC482 #HANGUL SYLLABLE SSANGSIOS WEO SSANGKIYEOK +0x9CDA 0xC483 #HANGUL SYLLABLE SSANGSIOS WEO KIYEOKSIOS +0x9CDB 0xC484 #HANGUL SYLLABLE SSANGSIOS WEO NIEUN +0x9CDC 0xC485 #HANGUL SYLLABLE SSANGSIOS WEO NIEUNCIEUC +0x9CDD 0xC486 #HANGUL SYLLABLE SSANGSIOS WEO NIEUNHIEUH +0x9CDE 0xC487 #HANGUL SYLLABLE SSANGSIOS WEO TIKEUT +0x9CDF 0xC488 #HANGUL SYLLABLE SSANGSIOS WEO RIEUL +0x9CE0 0xC489 #HANGUL SYLLABLE SSANGSIOS WEO RIEULKIYEOK +0x9CE1 0xC48A #HANGUL SYLLABLE SSANGSIOS WEO RIEULMIEUM +0x9CE2 0xC48B #HANGUL SYLLABLE SSANGSIOS WEO RIEULPIEUP +0x9CE3 0xC48C #HANGUL SYLLABLE SSANGSIOS WEO RIEULSIOS +0x9CE4 0xC48D #HANGUL SYLLABLE SSANGSIOS WEO RIEULTHIEUTH +0x9CE5 0xC48E #HANGUL SYLLABLE SSANGSIOS WEO RIEULPHIEUPH +0x9CE6 0xC48F #HANGUL SYLLABLE SSANGSIOS WEO RIEULHIEUH +0x9CE7 0xC490 #HANGUL SYLLABLE SSANGSIOS WEO MIEUM +0x9CE8 0xC491 #HANGUL SYLLABLE SSANGSIOS WEO PIEUP +0x9CE9 0xC492 #HANGUL SYLLABLE SSANGSIOS WEO PIEUPSIOS +0x9CEA 0xC493 #HANGUL SYLLABLE SSANGSIOS WEO SIOS +0x9CEB 0xC495 #HANGUL SYLLABLE SSANGSIOS WEO IEUNG +0x9CEC 0xC496 #HANGUL SYLLABLE SSANGSIOS WEO CIEUC +0x9CED 0xC497 #HANGUL SYLLABLE SSANGSIOS WEO CHIEUCH +0x9CEE 0xC498 #HANGUL SYLLABLE SSANGSIOS WEO KHIEUKH +0x9CEF 0xC499 #HANGUL SYLLABLE SSANGSIOS WEO THIEUTH +0x9CF0 0xC49A #HANGUL SYLLABLE SSANGSIOS WEO PHIEUPH +0x9CF1 0xC49B #HANGUL SYLLABLE SSANGSIOS WEO HIEUH +0x9CF2 0xC49D #HANGUL SYLLABLE SSANGSIOS WE KIYEOK +0x9CF3 0xC49E #HANGUL SYLLABLE SSANGSIOS WE SSANGKIYEOK +0x9CF4 0xC49F #HANGUL SYLLABLE SSANGSIOS WE KIYEOKSIOS +0x9CF5 0xC4A0 #HANGUL SYLLABLE SSANGSIOS WE NIEUN +0x9CF6 0xC4A1 #HANGUL SYLLABLE SSANGSIOS WE NIEUNCIEUC +0x9CF7 0xC4A2 #HANGUL SYLLABLE SSANGSIOS WE NIEUNHIEUH +0x9CF8 0xC4A3 #HANGUL SYLLABLE SSANGSIOS WE TIKEUT +0x9CF9 0xC4A4 #HANGUL SYLLABLE SSANGSIOS WE RIEUL +0x9CFA 0xC4A5 #HANGUL SYLLABLE SSANGSIOS WE RIEULKIYEOK +0x9CFB 0xC4A6 #HANGUL SYLLABLE SSANGSIOS WE RIEULMIEUM +0x9CFC 0xC4A7 #HANGUL SYLLABLE SSANGSIOS WE RIEULPIEUP +0x9CFD 0xC4A8 #HANGUL SYLLABLE SSANGSIOS WE RIEULSIOS +0x9CFE 0xC4A9 #HANGUL SYLLABLE SSANGSIOS WE RIEULTHIEUTH +0x9D41 0xC4AA #HANGUL SYLLABLE SSANGSIOS WE RIEULPHIEUPH +0x9D42 0xC4AB #HANGUL SYLLABLE SSANGSIOS WE RIEULHIEUH +0x9D43 0xC4AC #HANGUL SYLLABLE SSANGSIOS WE MIEUM +0x9D44 0xC4AD #HANGUL SYLLABLE SSANGSIOS WE PIEUP +0x9D45 0xC4AE #HANGUL SYLLABLE SSANGSIOS WE PIEUPSIOS +0x9D46 0xC4AF #HANGUL SYLLABLE SSANGSIOS WE SIOS +0x9D47 0xC4B0 #HANGUL SYLLABLE SSANGSIOS WE SSANGSIOS +0x9D48 0xC4B1 #HANGUL SYLLABLE SSANGSIOS WE IEUNG +0x9D49 0xC4B2 #HANGUL SYLLABLE SSANGSIOS WE CIEUC +0x9D4A 0xC4B3 #HANGUL SYLLABLE SSANGSIOS WE CHIEUCH +0x9D4B 0xC4B4 #HANGUL SYLLABLE SSANGSIOS WE KHIEUKH +0x9D4C 0xC4B5 #HANGUL SYLLABLE SSANGSIOS WE THIEUTH +0x9D4D 0xC4B6 #HANGUL SYLLABLE SSANGSIOS WE PHIEUPH +0x9D4E 0xC4B7 #HANGUL SYLLABLE SSANGSIOS WE HIEUH +0x9D4F 0xC4B9 #HANGUL SYLLABLE SSANGSIOS WI KIYEOK +0x9D50 0xC4BA #HANGUL SYLLABLE SSANGSIOS WI SSANGKIYEOK +0x9D51 0xC4BB #HANGUL SYLLABLE SSANGSIOS WI KIYEOKSIOS +0x9D52 0xC4BD #HANGUL SYLLABLE SSANGSIOS WI NIEUNCIEUC +0x9D53 0xC4BE #HANGUL SYLLABLE SSANGSIOS WI NIEUNHIEUH +0x9D54 0xC4BF #HANGUL SYLLABLE SSANGSIOS WI TIKEUT +0x9D55 0xC4C0 #HANGUL SYLLABLE SSANGSIOS WI RIEUL +0x9D56 0xC4C1 #HANGUL SYLLABLE SSANGSIOS WI RIEULKIYEOK +0x9D57 0xC4C2 #HANGUL SYLLABLE SSANGSIOS WI RIEULMIEUM +0x9D58 0xC4C3 #HANGUL SYLLABLE SSANGSIOS WI RIEULPIEUP +0x9D59 0xC4C4 #HANGUL SYLLABLE SSANGSIOS WI RIEULSIOS +0x9D5A 0xC4C5 #HANGUL SYLLABLE SSANGSIOS WI RIEULTHIEUTH +0x9D61 0xC4C6 #HANGUL SYLLABLE SSANGSIOS WI RIEULPHIEUPH +0x9D62 0xC4C7 #HANGUL SYLLABLE SSANGSIOS WI RIEULHIEUH +0x9D63 0xC4C8 #HANGUL SYLLABLE SSANGSIOS WI MIEUM +0x9D64 0xC4C9 #HANGUL SYLLABLE SSANGSIOS WI PIEUP +0x9D65 0xC4CA #HANGUL SYLLABLE SSANGSIOS WI PIEUPSIOS +0x9D66 0xC4CB #HANGUL SYLLABLE SSANGSIOS WI SIOS +0x9D67 0xC4CC #HANGUL SYLLABLE SSANGSIOS WI SSANGSIOS +0x9D68 0xC4CD #HANGUL SYLLABLE SSANGSIOS WI IEUNG +0x9D69 0xC4CE #HANGUL SYLLABLE SSANGSIOS WI CIEUC +0x9D6A 0xC4CF #HANGUL SYLLABLE SSANGSIOS WI CHIEUCH +0x9D6B 0xC4D0 #HANGUL SYLLABLE SSANGSIOS WI KHIEUKH +0x9D6C 0xC4D1 #HANGUL SYLLABLE SSANGSIOS WI THIEUTH +0x9D6D 0xC4D2 #HANGUL SYLLABLE SSANGSIOS WI PHIEUPH +0x9D6E 0xC4D3 #HANGUL SYLLABLE SSANGSIOS WI HIEUH +0x9D6F 0xC4D4 #HANGUL SYLLABLE SSANGSIOS YU +0x9D70 0xC4D5 #HANGUL SYLLABLE SSANGSIOS YU KIYEOK +0x9D71 0xC4D6 #HANGUL SYLLABLE SSANGSIOS YU SSANGKIYEOK +0x9D72 0xC4D7 #HANGUL SYLLABLE SSANGSIOS YU KIYEOKSIOS +0x9D73 0xC4D8 #HANGUL SYLLABLE SSANGSIOS YU NIEUN +0x9D74 0xC4D9 #HANGUL SYLLABLE SSANGSIOS YU NIEUNCIEUC +0x9D75 0xC4DA #HANGUL SYLLABLE SSANGSIOS YU NIEUNHIEUH +0x9D76 0xC4DB #HANGUL SYLLABLE SSANGSIOS YU TIKEUT +0x9D77 0xC4DC #HANGUL SYLLABLE SSANGSIOS YU RIEUL +0x9D78 0xC4DD #HANGUL SYLLABLE SSANGSIOS YU RIEULKIYEOK +0x9D79 0xC4DE #HANGUL SYLLABLE SSANGSIOS YU RIEULMIEUM +0x9D7A 0xC4DF #HANGUL SYLLABLE SSANGSIOS YU RIEULPIEUP +0x9D81 0xC4E0 #HANGUL SYLLABLE SSANGSIOS YU RIEULSIOS +0x9D82 0xC4E1 #HANGUL SYLLABLE SSANGSIOS YU RIEULTHIEUTH +0x9D83 0xC4E2 #HANGUL SYLLABLE SSANGSIOS YU RIEULPHIEUPH +0x9D84 0xC4E3 #HANGUL SYLLABLE SSANGSIOS YU RIEULHIEUH +0x9D85 0xC4E4 #HANGUL SYLLABLE SSANGSIOS YU MIEUM +0x9D86 0xC4E5 #HANGUL SYLLABLE SSANGSIOS YU PIEUP +0x9D87 0xC4E6 #HANGUL SYLLABLE SSANGSIOS YU PIEUPSIOS +0x9D88 0xC4E7 #HANGUL SYLLABLE SSANGSIOS YU SIOS +0x9D89 0xC4E8 #HANGUL SYLLABLE SSANGSIOS YU SSANGSIOS +0x9D8A 0xC4EA #HANGUL SYLLABLE SSANGSIOS YU CIEUC +0x9D8B 0xC4EB #HANGUL SYLLABLE SSANGSIOS YU CHIEUCH +0x9D8C 0xC4EC #HANGUL SYLLABLE SSANGSIOS YU KHIEUKH +0x9D8D 0xC4ED #HANGUL SYLLABLE SSANGSIOS YU THIEUTH +0x9D8E 0xC4EE #HANGUL SYLLABLE SSANGSIOS YU PHIEUPH +0x9D8F 0xC4EF #HANGUL SYLLABLE SSANGSIOS YU HIEUH +0x9D90 0xC4F2 #HANGUL SYLLABLE SSANGSIOS EU SSANGKIYEOK +0x9D91 0xC4F3 #HANGUL SYLLABLE SSANGSIOS EU KIYEOKSIOS +0x9D92 0xC4F5 #HANGUL SYLLABLE SSANGSIOS EU NIEUNCIEUC +0x9D93 0xC4F6 #HANGUL SYLLABLE SSANGSIOS EU NIEUNHIEUH +0x9D94 0xC4F7 #HANGUL SYLLABLE SSANGSIOS EU TIKEUT +0x9D95 0xC4F9 #HANGUL SYLLABLE SSANGSIOS EU RIEULKIYEOK +0x9D96 0xC4FB #HANGUL SYLLABLE SSANGSIOS EU RIEULPIEUP +0x9D97 0xC4FC #HANGUL SYLLABLE SSANGSIOS EU RIEULSIOS +0x9D98 0xC4FD #HANGUL SYLLABLE SSANGSIOS EU RIEULTHIEUTH +0x9D99 0xC4FE #HANGUL SYLLABLE SSANGSIOS EU RIEULPHIEUPH +0x9D9A 0xC502 #HANGUL SYLLABLE SSANGSIOS EU PIEUPSIOS +0x9D9B 0xC503 #HANGUL SYLLABLE SSANGSIOS EU SIOS +0x9D9C 0xC504 #HANGUL SYLLABLE SSANGSIOS EU SSANGSIOS +0x9D9D 0xC505 #HANGUL SYLLABLE SSANGSIOS EU IEUNG +0x9D9E 0xC506 #HANGUL SYLLABLE SSANGSIOS EU CIEUC +0x9D9F 0xC507 #HANGUL SYLLABLE SSANGSIOS EU CHIEUCH +0x9DA0 0xC508 #HANGUL SYLLABLE SSANGSIOS EU KHIEUKH +0x9DA1 0xC509 #HANGUL SYLLABLE SSANGSIOS EU THIEUTH +0x9DA2 0xC50A #HANGUL SYLLABLE SSANGSIOS EU PHIEUPH +0x9DA3 0xC50B #HANGUL SYLLABLE SSANGSIOS EU HIEUH +0x9DA4 0xC50D #HANGUL SYLLABLE SSANGSIOS YI KIYEOK +0x9DA5 0xC50E #HANGUL SYLLABLE SSANGSIOS YI SSANGKIYEOK +0x9DA6 0xC50F #HANGUL SYLLABLE SSANGSIOS YI KIYEOKSIOS +0x9DA7 0xC511 #HANGUL SYLLABLE SSANGSIOS YI NIEUNCIEUC +0x9DA8 0xC512 #HANGUL SYLLABLE SSANGSIOS YI NIEUNHIEUH +0x9DA9 0xC513 #HANGUL SYLLABLE SSANGSIOS YI TIKEUT +0x9DAA 0xC515 #HANGUL SYLLABLE SSANGSIOS YI RIEULKIYEOK +0x9DAB 0xC516 #HANGUL SYLLABLE SSANGSIOS YI RIEULMIEUM +0x9DAC 0xC517 #HANGUL SYLLABLE SSANGSIOS YI RIEULPIEUP +0x9DAD 0xC518 #HANGUL SYLLABLE SSANGSIOS YI RIEULSIOS +0x9DAE 0xC519 #HANGUL SYLLABLE SSANGSIOS YI RIEULTHIEUTH +0x9DAF 0xC51A #HANGUL SYLLABLE SSANGSIOS YI RIEULPHIEUPH +0x9DB0 0xC51B #HANGUL SYLLABLE SSANGSIOS YI RIEULHIEUH +0x9DB1 0xC51D #HANGUL SYLLABLE SSANGSIOS YI PIEUP +0x9DB2 0xC51E #HANGUL SYLLABLE SSANGSIOS YI PIEUPSIOS +0x9DB3 0xC51F #HANGUL SYLLABLE SSANGSIOS YI SIOS +0x9DB4 0xC520 #HANGUL SYLLABLE SSANGSIOS YI SSANGSIOS +0x9DB5 0xC521 #HANGUL SYLLABLE SSANGSIOS YI IEUNG +0x9DB6 0xC522 #HANGUL SYLLABLE SSANGSIOS YI CIEUC +0x9DB7 0xC523 #HANGUL SYLLABLE SSANGSIOS YI CHIEUCH +0x9DB8 0xC524 #HANGUL SYLLABLE SSANGSIOS YI KHIEUKH +0x9DB9 0xC525 #HANGUL SYLLABLE SSANGSIOS YI THIEUTH +0x9DBA 0xC526 #HANGUL SYLLABLE SSANGSIOS YI PHIEUPH +0x9DBB 0xC527 #HANGUL SYLLABLE SSANGSIOS YI HIEUH +0x9DBC 0xC52A #HANGUL SYLLABLE SSANGSIOS I SSANGKIYEOK +0x9DBD 0xC52B #HANGUL SYLLABLE SSANGSIOS I KIYEOKSIOS +0x9DBE 0xC52D #HANGUL SYLLABLE SSANGSIOS I NIEUNCIEUC +0x9DBF 0xC52E #HANGUL SYLLABLE SSANGSIOS I NIEUNHIEUH +0x9DC0 0xC52F #HANGUL SYLLABLE SSANGSIOS I TIKEUT +0x9DC1 0xC531 #HANGUL SYLLABLE SSANGSIOS I RIEULKIYEOK +0x9DC2 0xC532 #HANGUL SYLLABLE SSANGSIOS I RIEULMIEUM +0x9DC3 0xC533 #HANGUL SYLLABLE SSANGSIOS I RIEULPIEUP +0x9DC4 0xC534 #HANGUL SYLLABLE SSANGSIOS I RIEULSIOS +0x9DC5 0xC535 #HANGUL SYLLABLE SSANGSIOS I RIEULTHIEUTH +0x9DC6 0xC536 #HANGUL SYLLABLE SSANGSIOS I RIEULPHIEUPH +0x9DC7 0xC537 #HANGUL SYLLABLE SSANGSIOS I RIEULHIEUH +0x9DC8 0xC53A #HANGUL SYLLABLE SSANGSIOS I PIEUPSIOS +0x9DC9 0xC53C #HANGUL SYLLABLE SSANGSIOS I SSANGSIOS +0x9DCA 0xC53E #HANGUL SYLLABLE SSANGSIOS I CIEUC +0x9DCB 0xC53F #HANGUL SYLLABLE SSANGSIOS I CHIEUCH +0x9DCC 0xC540 #HANGUL SYLLABLE SSANGSIOS I KHIEUKH +0x9DCD 0xC541 #HANGUL SYLLABLE SSANGSIOS I THIEUTH +0x9DCE 0xC542 #HANGUL SYLLABLE SSANGSIOS I PHIEUPH +0x9DCF 0xC543 #HANGUL SYLLABLE SSANGSIOS I HIEUH +0x9DD0 0xC546 #HANGUL SYLLABLE IEUNG A SSANGKIYEOK +0x9DD1 0xC547 #HANGUL SYLLABLE IEUNG A KIYEOKSIOS +0x9DD2 0xC54B #HANGUL SYLLABLE IEUNG A TIKEUT +0x9DD3 0xC54F #HANGUL SYLLABLE IEUNG A RIEULPIEUP +0x9DD4 0xC550 #HANGUL SYLLABLE IEUNG A RIEULSIOS +0x9DD5 0xC551 #HANGUL SYLLABLE IEUNG A RIEULTHIEUTH +0x9DD6 0xC552 #HANGUL SYLLABLE IEUNG A RIEULPHIEUPH +0x9DD7 0xC556 #HANGUL SYLLABLE IEUNG A PIEUPSIOS +0x9DD8 0xC55A #HANGUL SYLLABLE IEUNG A CIEUC +0x9DD9 0xC55B #HANGUL SYLLABLE IEUNG A CHIEUCH +0x9DDA 0xC55C #HANGUL SYLLABLE IEUNG A KHIEUKH +0x9DDB 0xC55F #HANGUL SYLLABLE IEUNG A HIEUH +0x9DDC 0xC562 #HANGUL SYLLABLE IEUNG AE SSANGKIYEOK +0x9DDD 0xC563 #HANGUL SYLLABLE IEUNG AE KIYEOKSIOS +0x9DDE 0xC565 #HANGUL SYLLABLE IEUNG AE NIEUNCIEUC +0x9DDF 0xC566 #HANGUL SYLLABLE IEUNG AE NIEUNHIEUH +0x9DE0 0xC567 #HANGUL SYLLABLE IEUNG AE TIKEUT +0x9DE1 0xC569 #HANGUL SYLLABLE IEUNG AE RIEULKIYEOK +0x9DE2 0xC56A #HANGUL SYLLABLE IEUNG AE RIEULMIEUM +0x9DE3 0xC56B #HANGUL SYLLABLE IEUNG AE RIEULPIEUP +0x9DE4 0xC56C #HANGUL SYLLABLE IEUNG AE RIEULSIOS +0x9DE5 0xC56D #HANGUL SYLLABLE IEUNG AE RIEULTHIEUTH +0x9DE6 0xC56E #HANGUL SYLLABLE IEUNG AE RIEULPHIEUPH +0x9DE7 0xC56F #HANGUL SYLLABLE IEUNG AE RIEULHIEUH +0x9DE8 0xC572 #HANGUL SYLLABLE IEUNG AE PIEUPSIOS +0x9DE9 0xC576 #HANGUL SYLLABLE IEUNG AE CIEUC +0x9DEA 0xC577 #HANGUL SYLLABLE IEUNG AE CHIEUCH +0x9DEB 0xC578 #HANGUL SYLLABLE IEUNG AE KHIEUKH +0x9DEC 0xC579 #HANGUL SYLLABLE IEUNG AE THIEUTH +0x9DED 0xC57A #HANGUL SYLLABLE IEUNG AE PHIEUPH +0x9DEE 0xC57B #HANGUL SYLLABLE IEUNG AE HIEUH +0x9DEF 0xC57E #HANGUL SYLLABLE IEUNG YA SSANGKIYEOK +0x9DF0 0xC57F #HANGUL SYLLABLE IEUNG YA KIYEOKSIOS +0x9DF1 0xC581 #HANGUL SYLLABLE IEUNG YA NIEUNCIEUC +0x9DF2 0xC582 #HANGUL SYLLABLE IEUNG YA NIEUNHIEUH +0x9DF3 0xC583 #HANGUL SYLLABLE IEUNG YA TIKEUT +0x9DF4 0xC585 #HANGUL SYLLABLE IEUNG YA RIEULKIYEOK +0x9DF5 0xC586 #HANGUL SYLLABLE IEUNG YA RIEULMIEUM +0x9DF6 0xC588 #HANGUL SYLLABLE IEUNG YA RIEULSIOS +0x9DF7 0xC589 #HANGUL SYLLABLE IEUNG YA RIEULTHIEUTH +0x9DF8 0xC58A #HANGUL SYLLABLE IEUNG YA RIEULPHIEUPH +0x9DF9 0xC58B #HANGUL SYLLABLE IEUNG YA RIEULHIEUH +0x9DFA 0xC58E #HANGUL SYLLABLE IEUNG YA PIEUPSIOS +0x9DFB 0xC590 #HANGUL SYLLABLE IEUNG YA SSANGSIOS +0x9DFC 0xC592 #HANGUL SYLLABLE IEUNG YA CIEUC +0x9DFD 0xC593 #HANGUL SYLLABLE IEUNG YA CHIEUCH +0x9DFE 0xC594 #HANGUL SYLLABLE IEUNG YA KHIEUKH +0x9E41 0xC596 #HANGUL SYLLABLE IEUNG YA PHIEUPH +0x9E42 0xC599 #HANGUL SYLLABLE IEUNG YAE KIYEOK +0x9E43 0xC59A #HANGUL SYLLABLE IEUNG YAE SSANGKIYEOK +0x9E44 0xC59B #HANGUL SYLLABLE IEUNG YAE KIYEOKSIOS +0x9E45 0xC59D #HANGUL SYLLABLE IEUNG YAE NIEUNCIEUC +0x9E46 0xC59E #HANGUL SYLLABLE IEUNG YAE NIEUNHIEUH +0x9E47 0xC59F #HANGUL SYLLABLE IEUNG YAE TIKEUT +0x9E48 0xC5A1 #HANGUL SYLLABLE IEUNG YAE RIEULKIYEOK +0x9E49 0xC5A2 #HANGUL SYLLABLE IEUNG YAE RIEULMIEUM +0x9E4A 0xC5A3 #HANGUL SYLLABLE IEUNG YAE RIEULPIEUP +0x9E4B 0xC5A4 #HANGUL SYLLABLE IEUNG YAE RIEULSIOS +0x9E4C 0xC5A5 #HANGUL SYLLABLE IEUNG YAE RIEULTHIEUTH +0x9E4D 0xC5A6 #HANGUL SYLLABLE IEUNG YAE RIEULPHIEUPH +0x9E4E 0xC5A7 #HANGUL SYLLABLE IEUNG YAE RIEULHIEUH +0x9E4F 0xC5A8 #HANGUL SYLLABLE IEUNG YAE MIEUM +0x9E50 0xC5AA #HANGUL SYLLABLE IEUNG YAE PIEUPSIOS +0x9E51 0xC5AB #HANGUL SYLLABLE IEUNG YAE SIOS +0x9E52 0xC5AC #HANGUL SYLLABLE IEUNG YAE SSANGSIOS +0x9E53 0xC5AD #HANGUL SYLLABLE IEUNG YAE IEUNG +0x9E54 0xC5AE #HANGUL SYLLABLE IEUNG YAE CIEUC +0x9E55 0xC5AF #HANGUL SYLLABLE IEUNG YAE CHIEUCH +0x9E56 0xC5B0 #HANGUL SYLLABLE IEUNG YAE KHIEUKH +0x9E57 0xC5B1 #HANGUL SYLLABLE IEUNG YAE THIEUTH +0x9E58 0xC5B2 #HANGUL SYLLABLE IEUNG YAE PHIEUPH +0x9E59 0xC5B3 #HANGUL SYLLABLE IEUNG YAE HIEUH +0x9E5A 0xC5B6 #HANGUL SYLLABLE IEUNG EO SSANGKIYEOK +0x9E61 0xC5B7 #HANGUL SYLLABLE IEUNG EO KIYEOKSIOS +0x9E62 0xC5BA #HANGUL SYLLABLE IEUNG EO NIEUNHIEUH +0x9E63 0xC5BF #HANGUL SYLLABLE IEUNG EO RIEULPIEUP +0x9E64 0xC5C0 #HANGUL SYLLABLE IEUNG EO RIEULSIOS +0x9E65 0xC5C1 #HANGUL SYLLABLE IEUNG EO RIEULTHIEUTH +0x9E66 0xC5C2 #HANGUL SYLLABLE IEUNG EO RIEULPHIEUPH +0x9E67 0xC5C3 #HANGUL SYLLABLE IEUNG EO RIEULHIEUH +0x9E68 0xC5CB #HANGUL SYLLABLE IEUNG EO CHIEUCH +0x9E69 0xC5CD #HANGUL SYLLABLE IEUNG EO THIEUTH +0x9E6A 0xC5CF #HANGUL SYLLABLE IEUNG EO HIEUH +0x9E6B 0xC5D2 #HANGUL SYLLABLE IEUNG E SSANGKIYEOK +0x9E6C 0xC5D3 #HANGUL SYLLABLE IEUNG E KIYEOKSIOS +0x9E6D 0xC5D5 #HANGUL SYLLABLE IEUNG E NIEUNCIEUC +0x9E6E 0xC5D6 #HANGUL SYLLABLE IEUNG E NIEUNHIEUH +0x9E6F 0xC5D7 #HANGUL SYLLABLE IEUNG E TIKEUT +0x9E70 0xC5D9 #HANGUL SYLLABLE IEUNG E RIEULKIYEOK +0x9E71 0xC5DA #HANGUL SYLLABLE IEUNG E RIEULMIEUM +0x9E72 0xC5DB #HANGUL SYLLABLE IEUNG E RIEULPIEUP +0x9E73 0xC5DC #HANGUL SYLLABLE IEUNG E RIEULSIOS +0x9E74 0xC5DD #HANGUL SYLLABLE IEUNG E RIEULTHIEUTH +0x9E75 0xC5DE #HANGUL SYLLABLE IEUNG E RIEULPHIEUPH +0x9E76 0xC5DF #HANGUL SYLLABLE IEUNG E RIEULHIEUH +0x9E77 0xC5E2 #HANGUL SYLLABLE IEUNG E PIEUPSIOS +0x9E78 0xC5E4 #HANGUL SYLLABLE IEUNG E SSANGSIOS +0x9E79 0xC5E6 #HANGUL SYLLABLE IEUNG E CIEUC +0x9E7A 0xC5E7 #HANGUL SYLLABLE IEUNG E CHIEUCH +0x9E81 0xC5E8 #HANGUL SYLLABLE IEUNG E KHIEUKH +0x9E82 0xC5E9 #HANGUL SYLLABLE IEUNG E THIEUTH +0x9E83 0xC5EA #HANGUL SYLLABLE IEUNG E PHIEUPH +0x9E84 0xC5EB #HANGUL SYLLABLE IEUNG E HIEUH +0x9E85 0xC5EF #HANGUL SYLLABLE IEUNG YEO KIYEOKSIOS +0x9E86 0xC5F1 #HANGUL SYLLABLE IEUNG YEO NIEUNCIEUC +0x9E87 0xC5F2 #HANGUL SYLLABLE IEUNG YEO NIEUNHIEUH +0x9E88 0xC5F3 #HANGUL SYLLABLE IEUNG YEO TIKEUT +0x9E89 0xC5F5 #HANGUL SYLLABLE IEUNG YEO RIEULKIYEOK +0x9E8A 0xC5F8 #HANGUL SYLLABLE IEUNG YEO RIEULSIOS +0x9E8B 0xC5F9 #HANGUL SYLLABLE IEUNG YEO RIEULTHIEUTH +0x9E8C 0xC5FA #HANGUL SYLLABLE IEUNG YEO RIEULPHIEUPH +0x9E8D 0xC5FB #HANGUL SYLLABLE IEUNG YEO RIEULHIEUH +0x9E8E 0xC602 #HANGUL SYLLABLE IEUNG YEO CIEUC +0x9E8F 0xC603 #HANGUL SYLLABLE IEUNG YEO CHIEUCH +0x9E90 0xC604 #HANGUL SYLLABLE IEUNG YEO KHIEUKH +0x9E91 0xC609 #HANGUL SYLLABLE IEUNG YE KIYEOK +0x9E92 0xC60A #HANGUL SYLLABLE IEUNG YE SSANGKIYEOK +0x9E93 0xC60B #HANGUL SYLLABLE IEUNG YE KIYEOKSIOS +0x9E94 0xC60D #HANGUL SYLLABLE IEUNG YE NIEUNCIEUC +0x9E95 0xC60E #HANGUL SYLLABLE IEUNG YE NIEUNHIEUH +0x9E96 0xC60F #HANGUL SYLLABLE IEUNG YE TIKEUT +0x9E97 0xC611 #HANGUL SYLLABLE IEUNG YE RIEULKIYEOK +0x9E98 0xC612 #HANGUL SYLLABLE IEUNG YE RIEULMIEUM +0x9E99 0xC613 #HANGUL SYLLABLE IEUNG YE RIEULPIEUP +0x9E9A 0xC614 #HANGUL SYLLABLE IEUNG YE RIEULSIOS +0x9E9B 0xC615 #HANGUL SYLLABLE IEUNG YE RIEULTHIEUTH +0x9E9C 0xC616 #HANGUL SYLLABLE IEUNG YE RIEULPHIEUPH +0x9E9D 0xC617 #HANGUL SYLLABLE IEUNG YE RIEULHIEUH +0x9E9E 0xC61A #HANGUL SYLLABLE IEUNG YE PIEUPSIOS +0x9E9F 0xC61D #HANGUL SYLLABLE IEUNG YE IEUNG +0x9EA0 0xC61E #HANGUL SYLLABLE IEUNG YE CIEUC +0x9EA1 0xC61F #HANGUL SYLLABLE IEUNG YE CHIEUCH +0x9EA2 0xC620 #HANGUL SYLLABLE IEUNG YE KHIEUKH +0x9EA3 0xC621 #HANGUL SYLLABLE IEUNG YE THIEUTH +0x9EA4 0xC622 #HANGUL SYLLABLE IEUNG YE PHIEUPH +0x9EA5 0xC623 #HANGUL SYLLABLE IEUNG YE HIEUH +0x9EA6 0xC626 #HANGUL SYLLABLE IEUNG O SSANGKIYEOK +0x9EA7 0xC627 #HANGUL SYLLABLE IEUNG O KIYEOKSIOS +0x9EA8 0xC629 #HANGUL SYLLABLE IEUNG O NIEUNCIEUC +0x9EA9 0xC62A #HANGUL SYLLABLE IEUNG O NIEUNHIEUH +0x9EAA 0xC62B #HANGUL SYLLABLE IEUNG O TIKEUT +0x9EAB 0xC62F #HANGUL SYLLABLE IEUNG O RIEULPIEUP +0x9EAC 0xC631 #HANGUL SYLLABLE IEUNG O RIEULTHIEUTH +0x9EAD 0xC632 #HANGUL SYLLABLE IEUNG O RIEULPHIEUPH +0x9EAE 0xC636 #HANGUL SYLLABLE IEUNG O PIEUPSIOS +0x9EAF 0xC638 #HANGUL SYLLABLE IEUNG O SSANGSIOS +0x9EB0 0xC63A #HANGUL SYLLABLE IEUNG O CIEUC +0x9EB1 0xC63C #HANGUL SYLLABLE IEUNG O KHIEUKH +0x9EB2 0xC63D #HANGUL SYLLABLE IEUNG O THIEUTH +0x9EB3 0xC63E #HANGUL SYLLABLE IEUNG O PHIEUPH +0x9EB4 0xC63F #HANGUL SYLLABLE IEUNG O HIEUH +0x9EB5 0xC642 #HANGUL SYLLABLE IEUNG WA SSANGKIYEOK +0x9EB6 0xC643 #HANGUL SYLLABLE IEUNG WA KIYEOKSIOS +0x9EB7 0xC645 #HANGUL SYLLABLE IEUNG WA NIEUNCIEUC +0x9EB8 0xC646 #HANGUL SYLLABLE IEUNG WA NIEUNHIEUH +0x9EB9 0xC647 #HANGUL SYLLABLE IEUNG WA TIKEUT +0x9EBA 0xC649 #HANGUL SYLLABLE IEUNG WA RIEULKIYEOK +0x9EBB 0xC64A #HANGUL SYLLABLE IEUNG WA RIEULMIEUM +0x9EBC 0xC64B #HANGUL SYLLABLE IEUNG WA RIEULPIEUP +0x9EBD 0xC64C #HANGUL SYLLABLE IEUNG WA RIEULSIOS +0x9EBE 0xC64D #HANGUL SYLLABLE IEUNG WA RIEULTHIEUTH +0x9EBF 0xC64E #HANGUL SYLLABLE IEUNG WA RIEULPHIEUPH +0x9EC0 0xC64F #HANGUL SYLLABLE IEUNG WA RIEULHIEUH +0x9EC1 0xC652 #HANGUL SYLLABLE IEUNG WA PIEUPSIOS +0x9EC2 0xC656 #HANGUL SYLLABLE IEUNG WA CIEUC +0x9EC3 0xC657 #HANGUL SYLLABLE IEUNG WA CHIEUCH +0x9EC4 0xC658 #HANGUL SYLLABLE IEUNG WA KHIEUKH +0x9EC5 0xC659 #HANGUL SYLLABLE IEUNG WA THIEUTH +0x9EC6 0xC65A #HANGUL SYLLABLE IEUNG WA PHIEUPH +0x9EC7 0xC65B #HANGUL SYLLABLE IEUNG WA HIEUH +0x9EC8 0xC65E #HANGUL SYLLABLE IEUNG WAE SSANGKIYEOK +0x9EC9 0xC65F #HANGUL SYLLABLE IEUNG WAE KIYEOKSIOS +0x9ECA 0xC661 #HANGUL SYLLABLE IEUNG WAE NIEUNCIEUC +0x9ECB 0xC662 #HANGUL SYLLABLE IEUNG WAE NIEUNHIEUH +0x9ECC 0xC663 #HANGUL SYLLABLE IEUNG WAE TIKEUT +0x9ECD 0xC664 #HANGUL SYLLABLE IEUNG WAE RIEUL +0x9ECE 0xC665 #HANGUL SYLLABLE IEUNG WAE RIEULKIYEOK +0x9ECF 0xC666 #HANGUL SYLLABLE IEUNG WAE RIEULMIEUM +0x9ED0 0xC667 #HANGUL SYLLABLE IEUNG WAE RIEULPIEUP +0x9ED1 0xC668 #HANGUL SYLLABLE IEUNG WAE RIEULSIOS +0x9ED2 0xC669 #HANGUL SYLLABLE IEUNG WAE RIEULTHIEUTH +0x9ED3 0xC66A #HANGUL SYLLABLE IEUNG WAE RIEULPHIEUPH +0x9ED4 0xC66B #HANGUL SYLLABLE IEUNG WAE RIEULHIEUH +0x9ED5 0xC66D #HANGUL SYLLABLE IEUNG WAE PIEUP +0x9ED6 0xC66E #HANGUL SYLLABLE IEUNG WAE PIEUPSIOS +0x9ED7 0xC670 #HANGUL SYLLABLE IEUNG WAE SSANGSIOS +0x9ED8 0xC672 #HANGUL SYLLABLE IEUNG WAE CIEUC +0x9ED9 0xC673 #HANGUL SYLLABLE IEUNG WAE CHIEUCH +0x9EDA 0xC674 #HANGUL SYLLABLE IEUNG WAE KHIEUKH +0x9EDB 0xC675 #HANGUL SYLLABLE IEUNG WAE THIEUTH +0x9EDC 0xC676 #HANGUL SYLLABLE IEUNG WAE PHIEUPH +0x9EDD 0xC677 #HANGUL SYLLABLE IEUNG WAE HIEUH +0x9EDE 0xC67A #HANGUL SYLLABLE IEUNG OE SSANGKIYEOK +0x9EDF 0xC67B #HANGUL SYLLABLE IEUNG OE KIYEOKSIOS +0x9EE0 0xC67D #HANGUL SYLLABLE IEUNG OE NIEUNCIEUC +0x9EE1 0xC67E #HANGUL SYLLABLE IEUNG OE NIEUNHIEUH +0x9EE2 0xC67F #HANGUL SYLLABLE IEUNG OE TIKEUT +0x9EE3 0xC681 #HANGUL SYLLABLE IEUNG OE RIEULKIYEOK +0x9EE4 0xC682 #HANGUL SYLLABLE IEUNG OE RIEULMIEUM +0x9EE5 0xC683 #HANGUL SYLLABLE IEUNG OE RIEULPIEUP +0x9EE6 0xC684 #HANGUL SYLLABLE IEUNG OE RIEULSIOS +0x9EE7 0xC685 #HANGUL SYLLABLE IEUNG OE RIEULTHIEUTH +0x9EE8 0xC686 #HANGUL SYLLABLE IEUNG OE RIEULPHIEUPH +0x9EE9 0xC687 #HANGUL SYLLABLE IEUNG OE RIEULHIEUH +0x9EEA 0xC68A #HANGUL SYLLABLE IEUNG OE PIEUPSIOS +0x9EEB 0xC68C #HANGUL SYLLABLE IEUNG OE SSANGSIOS +0x9EEC 0xC68E #HANGUL SYLLABLE IEUNG OE CIEUC +0x9EED 0xC68F #HANGUL SYLLABLE IEUNG OE CHIEUCH +0x9EEE 0xC690 #HANGUL SYLLABLE IEUNG OE KHIEUKH +0x9EEF 0xC691 #HANGUL SYLLABLE IEUNG OE THIEUTH +0x9EF0 0xC692 #HANGUL SYLLABLE IEUNG OE PHIEUPH +0x9EF1 0xC693 #HANGUL SYLLABLE IEUNG OE HIEUH +0x9EF2 0xC696 #HANGUL SYLLABLE IEUNG YO SSANGKIYEOK +0x9EF3 0xC697 #HANGUL SYLLABLE IEUNG YO KIYEOKSIOS +0x9EF4 0xC699 #HANGUL SYLLABLE IEUNG YO NIEUNCIEUC +0x9EF5 0xC69A #HANGUL SYLLABLE IEUNG YO NIEUNHIEUH +0x9EF6 0xC69B #HANGUL SYLLABLE IEUNG YO TIKEUT +0x9EF7 0xC69D #HANGUL SYLLABLE IEUNG YO RIEULKIYEOK +0x9EF8 0xC69E #HANGUL SYLLABLE IEUNG YO RIEULMIEUM +0x9EF9 0xC69F #HANGUL SYLLABLE IEUNG YO RIEULPIEUP +0x9EFA 0xC6A0 #HANGUL SYLLABLE IEUNG YO RIEULSIOS +0x9EFB 0xC6A1 #HANGUL SYLLABLE IEUNG YO RIEULTHIEUTH +0x9EFC 0xC6A2 #HANGUL SYLLABLE IEUNG YO RIEULPHIEUPH +0x9EFD 0xC6A3 #HANGUL SYLLABLE IEUNG YO RIEULHIEUH +0x9EFE 0xC6A6 #HANGUL SYLLABLE IEUNG YO PIEUPSIOS +0x9F41 0xC6A8 #HANGUL SYLLABLE IEUNG YO SSANGSIOS +0x9F42 0xC6AA #HANGUL SYLLABLE IEUNG YO CIEUC +0x9F43 0xC6AB #HANGUL SYLLABLE IEUNG YO CHIEUCH +0x9F44 0xC6AC #HANGUL SYLLABLE IEUNG YO KHIEUKH +0x9F45 0xC6AD #HANGUL SYLLABLE IEUNG YO THIEUTH +0x9F46 0xC6AE #HANGUL SYLLABLE IEUNG YO PHIEUPH +0x9F47 0xC6AF #HANGUL SYLLABLE IEUNG YO HIEUH +0x9F48 0xC6B2 #HANGUL SYLLABLE IEUNG U SSANGKIYEOK +0x9F49 0xC6B3 #HANGUL SYLLABLE IEUNG U KIYEOKSIOS +0x9F4A 0xC6B5 #HANGUL SYLLABLE IEUNG U NIEUNCIEUC +0x9F4B 0xC6B6 #HANGUL SYLLABLE IEUNG U NIEUNHIEUH +0x9F4C 0xC6B7 #HANGUL SYLLABLE IEUNG U TIKEUT +0x9F4D 0xC6BB #HANGUL SYLLABLE IEUNG U RIEULPIEUP +0x9F4E 0xC6BC #HANGUL SYLLABLE IEUNG U RIEULSIOS +0x9F4F 0xC6BD #HANGUL SYLLABLE IEUNG U RIEULTHIEUTH +0x9F50 0xC6BE #HANGUL SYLLABLE IEUNG U RIEULPHIEUPH +0x9F51 0xC6BF #HANGUL SYLLABLE IEUNG U RIEULHIEUH +0x9F52 0xC6C2 #HANGUL SYLLABLE IEUNG U PIEUPSIOS +0x9F53 0xC6C4 #HANGUL SYLLABLE IEUNG U SSANGSIOS +0x9F54 0xC6C6 #HANGUL SYLLABLE IEUNG U CIEUC +0x9F55 0xC6C7 #HANGUL SYLLABLE IEUNG U CHIEUCH +0x9F56 0xC6C8 #HANGUL SYLLABLE IEUNG U KHIEUKH +0x9F57 0xC6C9 #HANGUL SYLLABLE IEUNG U THIEUTH +0x9F58 0xC6CA #HANGUL SYLLABLE IEUNG U PHIEUPH +0x9F59 0xC6CB #HANGUL SYLLABLE IEUNG U HIEUH +0x9F5A 0xC6CE #HANGUL SYLLABLE IEUNG WEO SSANGKIYEOK +0x9F61 0xC6CF #HANGUL SYLLABLE IEUNG WEO KIYEOKSIOS +0x9F62 0xC6D1 #HANGUL SYLLABLE IEUNG WEO NIEUNCIEUC +0x9F63 0xC6D2 #HANGUL SYLLABLE IEUNG WEO NIEUNHIEUH +0x9F64 0xC6D3 #HANGUL SYLLABLE IEUNG WEO TIKEUT +0x9F65 0xC6D5 #HANGUL SYLLABLE IEUNG WEO RIEULKIYEOK +0x9F66 0xC6D6 #HANGUL SYLLABLE IEUNG WEO RIEULMIEUM +0x9F67 0xC6D7 #HANGUL SYLLABLE IEUNG WEO RIEULPIEUP +0x9F68 0xC6D8 #HANGUL SYLLABLE IEUNG WEO RIEULSIOS +0x9F69 0xC6D9 #HANGUL SYLLABLE IEUNG WEO RIEULTHIEUTH +0x9F6A 0xC6DA #HANGUL SYLLABLE IEUNG WEO RIEULPHIEUPH +0x9F6B 0xC6DB #HANGUL SYLLABLE IEUNG WEO RIEULHIEUH +0x9F6C 0xC6DE #HANGUL SYLLABLE IEUNG WEO PIEUPSIOS +0x9F6D 0xC6DF #HANGUL SYLLABLE IEUNG WEO SIOS +0x9F6E 0xC6E2 #HANGUL SYLLABLE IEUNG WEO CIEUC +0x9F6F 0xC6E3 #HANGUL SYLLABLE IEUNG WEO CHIEUCH +0x9F70 0xC6E4 #HANGUL SYLLABLE IEUNG WEO KHIEUKH +0x9F71 0xC6E5 #HANGUL SYLLABLE IEUNG WEO THIEUTH +0x9F72 0xC6E6 #HANGUL SYLLABLE IEUNG WEO PHIEUPH +0x9F73 0xC6E7 #HANGUL SYLLABLE IEUNG WEO HIEUH +0x9F74 0xC6EA #HANGUL SYLLABLE IEUNG WE SSANGKIYEOK +0x9F75 0xC6EB #HANGUL SYLLABLE IEUNG WE KIYEOKSIOS +0x9F76 0xC6ED #HANGUL SYLLABLE IEUNG WE NIEUNCIEUC +0x9F77 0xC6EE #HANGUL SYLLABLE IEUNG WE NIEUNHIEUH +0x9F78 0xC6EF #HANGUL SYLLABLE IEUNG WE TIKEUT +0x9F79 0xC6F1 #HANGUL SYLLABLE IEUNG WE RIEULKIYEOK +0x9F7A 0xC6F2 #HANGUL SYLLABLE IEUNG WE RIEULMIEUM +0x9F81 0xC6F3 #HANGUL SYLLABLE IEUNG WE RIEULPIEUP +0x9F82 0xC6F4 #HANGUL SYLLABLE IEUNG WE RIEULSIOS +0x9F83 0xC6F5 #HANGUL SYLLABLE IEUNG WE RIEULTHIEUTH +0x9F84 0xC6F6 #HANGUL SYLLABLE IEUNG WE RIEULPHIEUPH +0x9F85 0xC6F7 #HANGUL SYLLABLE IEUNG WE RIEULHIEUH +0x9F86 0xC6FA #HANGUL SYLLABLE IEUNG WE PIEUPSIOS +0x9F87 0xC6FB #HANGUL SYLLABLE IEUNG WE SIOS +0x9F88 0xC6FC #HANGUL SYLLABLE IEUNG WE SSANGSIOS +0x9F89 0xC6FE #HANGUL SYLLABLE IEUNG WE CIEUC +0x9F8A 0xC6FF #HANGUL SYLLABLE IEUNG WE CHIEUCH +0x9F8B 0xC700 #HANGUL SYLLABLE IEUNG WE KHIEUKH +0x9F8C 0xC701 #HANGUL SYLLABLE IEUNG WE THIEUTH +0x9F8D 0xC702 #HANGUL SYLLABLE IEUNG WE PHIEUPH +0x9F8E 0xC703 #HANGUL SYLLABLE IEUNG WE HIEUH +0x9F8F 0xC706 #HANGUL SYLLABLE IEUNG WI SSANGKIYEOK +0x9F90 0xC707 #HANGUL SYLLABLE IEUNG WI KIYEOKSIOS +0x9F91 0xC709 #HANGUL SYLLABLE IEUNG WI NIEUNCIEUC +0x9F92 0xC70A #HANGUL SYLLABLE IEUNG WI NIEUNHIEUH +0x9F93 0xC70B #HANGUL SYLLABLE IEUNG WI TIKEUT +0x9F94 0xC70D #HANGUL SYLLABLE IEUNG WI RIEULKIYEOK +0x9F95 0xC70E #HANGUL SYLLABLE IEUNG WI RIEULMIEUM +0x9F96 0xC70F #HANGUL SYLLABLE IEUNG WI RIEULPIEUP +0x9F97 0xC710 #HANGUL SYLLABLE IEUNG WI RIEULSIOS +0x9F98 0xC711 #HANGUL SYLLABLE IEUNG WI RIEULTHIEUTH +0x9F99 0xC712 #HANGUL SYLLABLE IEUNG WI RIEULPHIEUPH +0x9F9A 0xC713 #HANGUL SYLLABLE IEUNG WI RIEULHIEUH +0x9F9B 0xC716 #HANGUL SYLLABLE IEUNG WI PIEUPSIOS +0x9F9C 0xC718 #HANGUL SYLLABLE IEUNG WI SSANGSIOS +0x9F9D 0xC71A #HANGUL SYLLABLE IEUNG WI CIEUC +0x9F9E 0xC71B #HANGUL SYLLABLE IEUNG WI CHIEUCH +0x9F9F 0xC71C #HANGUL SYLLABLE IEUNG WI KHIEUKH +0x9FA0 0xC71D #HANGUL SYLLABLE IEUNG WI THIEUTH +0x9FA1 0xC71E #HANGUL SYLLABLE IEUNG WI PHIEUPH +0x9FA2 0xC71F #HANGUL SYLLABLE IEUNG WI HIEUH +0x9FA3 0xC722 #HANGUL SYLLABLE IEUNG YU SSANGKIYEOK +0x9FA4 0xC723 #HANGUL SYLLABLE IEUNG YU KIYEOKSIOS +0x9FA5 0xC725 #HANGUL SYLLABLE IEUNG YU NIEUNCIEUC +0x9FA6 0xC726 #HANGUL SYLLABLE IEUNG YU NIEUNHIEUH +0x9FA7 0xC727 #HANGUL SYLLABLE IEUNG YU TIKEUT +0x9FA8 0xC729 #HANGUL SYLLABLE IEUNG YU RIEULKIYEOK +0x9FA9 0xC72A #HANGUL SYLLABLE IEUNG YU RIEULMIEUM +0x9FAA 0xC72B #HANGUL SYLLABLE IEUNG YU RIEULPIEUP +0x9FAB 0xC72C #HANGUL SYLLABLE IEUNG YU RIEULSIOS +0x9FAC 0xC72D #HANGUL SYLLABLE IEUNG YU RIEULTHIEUTH +0x9FAD 0xC72E #HANGUL SYLLABLE IEUNG YU RIEULPHIEUPH +0x9FAE 0xC72F #HANGUL SYLLABLE IEUNG YU RIEULHIEUH +0x9FAF 0xC732 #HANGUL SYLLABLE IEUNG YU PIEUPSIOS +0x9FB0 0xC734 #HANGUL SYLLABLE IEUNG YU SSANGSIOS +0x9FB1 0xC736 #HANGUL SYLLABLE IEUNG YU CIEUC +0x9FB2 0xC738 #HANGUL SYLLABLE IEUNG YU KHIEUKH +0x9FB3 0xC739 #HANGUL SYLLABLE IEUNG YU THIEUTH +0x9FB4 0xC73A #HANGUL SYLLABLE IEUNG YU PHIEUPH +0x9FB5 0xC73B #HANGUL SYLLABLE IEUNG YU HIEUH +0x9FB6 0xC73E #HANGUL SYLLABLE IEUNG EU SSANGKIYEOK +0x9FB7 0xC73F #HANGUL SYLLABLE IEUNG EU KIYEOKSIOS +0x9FB8 0xC741 #HANGUL SYLLABLE IEUNG EU NIEUNCIEUC +0x9FB9 0xC742 #HANGUL SYLLABLE IEUNG EU NIEUNHIEUH +0x9FBA 0xC743 #HANGUL SYLLABLE IEUNG EU TIKEUT +0x9FBB 0xC745 #HANGUL SYLLABLE IEUNG EU RIEULKIYEOK +0x9FBC 0xC746 #HANGUL SYLLABLE IEUNG EU RIEULMIEUM +0x9FBD 0xC747 #HANGUL SYLLABLE IEUNG EU RIEULPIEUP +0x9FBE 0xC748 #HANGUL SYLLABLE IEUNG EU RIEULSIOS +0x9FBF 0xC749 #HANGUL SYLLABLE IEUNG EU RIEULTHIEUTH +0x9FC0 0xC74B #HANGUL SYLLABLE IEUNG EU RIEULHIEUH +0x9FC1 0xC74E #HANGUL SYLLABLE IEUNG EU PIEUPSIOS +0x9FC2 0xC750 #HANGUL SYLLABLE IEUNG EU SSANGSIOS +0x9FC3 0xC759 #HANGUL SYLLABLE IEUNG YI KIYEOK +0x9FC4 0xC75A #HANGUL SYLLABLE IEUNG YI SSANGKIYEOK +0x9FC5 0xC75B #HANGUL SYLLABLE IEUNG YI KIYEOKSIOS +0x9FC6 0xC75D #HANGUL SYLLABLE IEUNG YI NIEUNCIEUC +0x9FC7 0xC75E #HANGUL SYLLABLE IEUNG YI NIEUNHIEUH +0x9FC8 0xC75F #HANGUL SYLLABLE IEUNG YI TIKEUT +0x9FC9 0xC761 #HANGUL SYLLABLE IEUNG YI RIEULKIYEOK +0x9FCA 0xC762 #HANGUL SYLLABLE IEUNG YI RIEULMIEUM +0x9FCB 0xC763 #HANGUL SYLLABLE IEUNG YI RIEULPIEUP +0x9FCC 0xC764 #HANGUL SYLLABLE IEUNG YI RIEULSIOS +0x9FCD 0xC765 #HANGUL SYLLABLE IEUNG YI RIEULTHIEUTH +0x9FCE 0xC766 #HANGUL SYLLABLE IEUNG YI RIEULPHIEUPH +0x9FCF 0xC767 #HANGUL SYLLABLE IEUNG YI RIEULHIEUH +0x9FD0 0xC769 #HANGUL SYLLABLE IEUNG YI PIEUP +0x9FD1 0xC76A #HANGUL SYLLABLE IEUNG YI PIEUPSIOS +0x9FD2 0xC76C #HANGUL SYLLABLE IEUNG YI SSANGSIOS +0x9FD3 0xC76D #HANGUL SYLLABLE IEUNG YI IEUNG +0x9FD4 0xC76E #HANGUL SYLLABLE IEUNG YI CIEUC +0x9FD5 0xC76F #HANGUL SYLLABLE IEUNG YI CHIEUCH +0x9FD6 0xC770 #HANGUL SYLLABLE IEUNG YI KHIEUKH +0x9FD7 0xC771 #HANGUL SYLLABLE IEUNG YI THIEUTH +0x9FD8 0xC772 #HANGUL SYLLABLE IEUNG YI PHIEUPH +0x9FD9 0xC773 #HANGUL SYLLABLE IEUNG YI HIEUH +0x9FDA 0xC776 #HANGUL SYLLABLE IEUNG I SSANGKIYEOK +0x9FDB 0xC777 #HANGUL SYLLABLE IEUNG I KIYEOKSIOS +0x9FDC 0xC779 #HANGUL SYLLABLE IEUNG I NIEUNCIEUC +0x9FDD 0xC77A #HANGUL SYLLABLE IEUNG I NIEUNHIEUH +0x9FDE 0xC77B #HANGUL SYLLABLE IEUNG I TIKEUT +0x9FDF 0xC77F #HANGUL SYLLABLE IEUNG I RIEULPIEUP +0x9FE0 0xC780 #HANGUL SYLLABLE IEUNG I RIEULSIOS +0x9FE1 0xC781 #HANGUL SYLLABLE IEUNG I RIEULTHIEUTH +0x9FE2 0xC782 #HANGUL SYLLABLE IEUNG I RIEULPHIEUPH +0x9FE3 0xC786 #HANGUL SYLLABLE IEUNG I PIEUPSIOS +0x9FE4 0xC78B #HANGUL SYLLABLE IEUNG I CHIEUCH +0x9FE5 0xC78C #HANGUL SYLLABLE IEUNG I KHIEUKH +0x9FE6 0xC78D #HANGUL SYLLABLE IEUNG I THIEUTH +0x9FE7 0xC78F #HANGUL SYLLABLE IEUNG I HIEUH +0x9FE8 0xC792 #HANGUL SYLLABLE CIEUC A SSANGKIYEOK +0x9FE9 0xC793 #HANGUL SYLLABLE CIEUC A KIYEOKSIOS +0x9FEA 0xC795 #HANGUL SYLLABLE CIEUC A NIEUNCIEUC +0x9FEB 0xC799 #HANGUL SYLLABLE CIEUC A RIEULKIYEOK +0x9FEC 0xC79B #HANGUL SYLLABLE CIEUC A RIEULPIEUP +0x9FED 0xC79C #HANGUL SYLLABLE CIEUC A RIEULSIOS +0x9FEE 0xC79D #HANGUL SYLLABLE CIEUC A RIEULTHIEUTH +0x9FEF 0xC79E #HANGUL SYLLABLE CIEUC A RIEULPHIEUPH +0x9FF0 0xC79F #HANGUL SYLLABLE CIEUC A RIEULHIEUH +0x9FF1 0xC7A2 #HANGUL SYLLABLE CIEUC A PIEUPSIOS +0x9FF2 0xC7A7 #HANGUL SYLLABLE CIEUC A CHIEUCH +0x9FF3 0xC7A8 #HANGUL SYLLABLE CIEUC A KHIEUKH +0x9FF4 0xC7A9 #HANGUL SYLLABLE CIEUC A THIEUTH +0x9FF5 0xC7AA #HANGUL SYLLABLE CIEUC A PHIEUPH +0x9FF6 0xC7AB #HANGUL SYLLABLE CIEUC A HIEUH +0x9FF7 0xC7AE #HANGUL SYLLABLE CIEUC AE SSANGKIYEOK +0x9FF8 0xC7AF #HANGUL SYLLABLE CIEUC AE KIYEOKSIOS +0x9FF9 0xC7B1 #HANGUL SYLLABLE CIEUC AE NIEUNCIEUC +0x9FFA 0xC7B2 #HANGUL SYLLABLE CIEUC AE NIEUNHIEUH +0x9FFB 0xC7B3 #HANGUL SYLLABLE CIEUC AE TIKEUT +0x9FFC 0xC7B5 #HANGUL SYLLABLE CIEUC AE RIEULKIYEOK +0x9FFD 0xC7B6 #HANGUL SYLLABLE CIEUC AE RIEULMIEUM +0x9FFE 0xC7B7 #HANGUL SYLLABLE CIEUC AE RIEULPIEUP +0xA041 0xC7B8 #HANGUL SYLLABLE CIEUC AE RIEULSIOS +0xA042 0xC7B9 #HANGUL SYLLABLE CIEUC AE RIEULTHIEUTH +0xA043 0xC7BA #HANGUL SYLLABLE CIEUC AE RIEULPHIEUPH +0xA044 0xC7BB #HANGUL SYLLABLE CIEUC AE RIEULHIEUH +0xA045 0xC7BE #HANGUL SYLLABLE CIEUC AE PIEUPSIOS +0xA046 0xC7C2 #HANGUL SYLLABLE CIEUC AE CIEUC +0xA047 0xC7C3 #HANGUL SYLLABLE CIEUC AE CHIEUCH +0xA048 0xC7C4 #HANGUL SYLLABLE CIEUC AE KHIEUKH +0xA049 0xC7C5 #HANGUL SYLLABLE CIEUC AE THIEUTH +0xA04A 0xC7C6 #HANGUL SYLLABLE CIEUC AE PHIEUPH +0xA04B 0xC7C7 #HANGUL SYLLABLE CIEUC AE HIEUH +0xA04C 0xC7CA #HANGUL SYLLABLE CIEUC YA SSANGKIYEOK +0xA04D 0xC7CB #HANGUL SYLLABLE CIEUC YA KIYEOKSIOS +0xA04E 0xC7CD #HANGUL SYLLABLE CIEUC YA NIEUNCIEUC +0xA04F 0xC7CF #HANGUL SYLLABLE CIEUC YA TIKEUT +0xA050 0xC7D1 #HANGUL SYLLABLE CIEUC YA RIEULKIYEOK +0xA051 0xC7D2 #HANGUL SYLLABLE CIEUC YA RIEULMIEUM +0xA052 0xC7D3 #HANGUL SYLLABLE CIEUC YA RIEULPIEUP +0xA053 0xC7D4 #HANGUL SYLLABLE CIEUC YA RIEULSIOS +0xA054 0xC7D5 #HANGUL SYLLABLE CIEUC YA RIEULTHIEUTH +0xA055 0xC7D6 #HANGUL SYLLABLE CIEUC YA RIEULPHIEUPH +0xA056 0xC7D7 #HANGUL SYLLABLE CIEUC YA RIEULHIEUH +0xA057 0xC7D9 #HANGUL SYLLABLE CIEUC YA PIEUP +0xA058 0xC7DA #HANGUL SYLLABLE CIEUC YA PIEUPSIOS +0xA059 0xC7DB #HANGUL SYLLABLE CIEUC YA SIOS +0xA05A 0xC7DC #HANGUL SYLLABLE CIEUC YA SSANGSIOS +0xA061 0xC7DE #HANGUL SYLLABLE CIEUC YA CIEUC +0xA062 0xC7DF #HANGUL SYLLABLE CIEUC YA CHIEUCH +0xA063 0xC7E0 #HANGUL SYLLABLE CIEUC YA KHIEUKH +0xA064 0xC7E1 #HANGUL SYLLABLE CIEUC YA THIEUTH +0xA065 0xC7E2 #HANGUL SYLLABLE CIEUC YA PHIEUPH +0xA066 0xC7E3 #HANGUL SYLLABLE CIEUC YA HIEUH +0xA067 0xC7E5 #HANGUL SYLLABLE CIEUC YAE KIYEOK +0xA068 0xC7E6 #HANGUL SYLLABLE CIEUC YAE SSANGKIYEOK +0xA069 0xC7E7 #HANGUL SYLLABLE CIEUC YAE KIYEOKSIOS +0xA06A 0xC7E9 #HANGUL SYLLABLE CIEUC YAE NIEUNCIEUC +0xA06B 0xC7EA #HANGUL SYLLABLE CIEUC YAE NIEUNHIEUH +0xA06C 0xC7EB #HANGUL SYLLABLE CIEUC YAE TIKEUT +0xA06D 0xC7ED #HANGUL SYLLABLE CIEUC YAE RIEULKIYEOK +0xA06E 0xC7EE #HANGUL SYLLABLE CIEUC YAE RIEULMIEUM +0xA06F 0xC7EF #HANGUL SYLLABLE CIEUC YAE RIEULPIEUP +0xA070 0xC7F0 #HANGUL SYLLABLE CIEUC YAE RIEULSIOS +0xA071 0xC7F1 #HANGUL SYLLABLE CIEUC YAE RIEULTHIEUTH +0xA072 0xC7F2 #HANGUL SYLLABLE CIEUC YAE RIEULPHIEUPH +0xA073 0xC7F3 #HANGUL SYLLABLE CIEUC YAE RIEULHIEUH +0xA074 0xC7F4 #HANGUL SYLLABLE CIEUC YAE MIEUM +0xA075 0xC7F5 #HANGUL SYLLABLE CIEUC YAE PIEUP +0xA076 0xC7F6 #HANGUL SYLLABLE CIEUC YAE PIEUPSIOS +0xA077 0xC7F7 #HANGUL SYLLABLE CIEUC YAE SIOS +0xA078 0xC7F8 #HANGUL SYLLABLE CIEUC YAE SSANGSIOS +0xA079 0xC7F9 #HANGUL SYLLABLE CIEUC YAE IEUNG +0xA07A 0xC7FA #HANGUL SYLLABLE CIEUC YAE CIEUC +0xA081 0xC7FB #HANGUL SYLLABLE CIEUC YAE CHIEUCH +0xA082 0xC7FC #HANGUL SYLLABLE CIEUC YAE KHIEUKH +0xA083 0xC7FD #HANGUL SYLLABLE CIEUC YAE THIEUTH +0xA084 0xC7FE #HANGUL SYLLABLE CIEUC YAE PHIEUPH +0xA085 0xC7FF #HANGUL SYLLABLE CIEUC YAE HIEUH +0xA086 0xC802 #HANGUL SYLLABLE CIEUC EO SSANGKIYEOK +0xA087 0xC803 #HANGUL SYLLABLE CIEUC EO KIYEOKSIOS +0xA088 0xC805 #HANGUL SYLLABLE CIEUC EO NIEUNCIEUC +0xA089 0xC806 #HANGUL SYLLABLE CIEUC EO NIEUNHIEUH +0xA08A 0xC807 #HANGUL SYLLABLE CIEUC EO TIKEUT +0xA08B 0xC809 #HANGUL SYLLABLE CIEUC EO RIEULKIYEOK +0xA08C 0xC80B #HANGUL SYLLABLE CIEUC EO RIEULPIEUP +0xA08D 0xC80C #HANGUL SYLLABLE CIEUC EO RIEULSIOS +0xA08E 0xC80D #HANGUL SYLLABLE CIEUC EO RIEULTHIEUTH +0xA08F 0xC80E #HANGUL SYLLABLE CIEUC EO RIEULPHIEUPH +0xA090 0xC80F #HANGUL SYLLABLE CIEUC EO RIEULHIEUH +0xA091 0xC812 #HANGUL SYLLABLE CIEUC EO PIEUPSIOS +0xA092 0xC814 #HANGUL SYLLABLE CIEUC EO SSANGSIOS +0xA093 0xC817 #HANGUL SYLLABLE CIEUC EO CHIEUCH +0xA094 0xC818 #HANGUL SYLLABLE CIEUC EO KHIEUKH +0xA095 0xC819 #HANGUL SYLLABLE CIEUC EO THIEUTH +0xA096 0xC81A #HANGUL SYLLABLE CIEUC EO PHIEUPH +0xA097 0xC81B #HANGUL SYLLABLE CIEUC EO HIEUH +0xA098 0xC81E #HANGUL SYLLABLE CIEUC E SSANGKIYEOK +0xA099 0xC81F #HANGUL SYLLABLE CIEUC E KIYEOKSIOS +0xA09A 0xC821 #HANGUL SYLLABLE CIEUC E NIEUNCIEUC +0xA09B 0xC822 #HANGUL SYLLABLE CIEUC E NIEUNHIEUH +0xA09C 0xC823 #HANGUL SYLLABLE CIEUC E TIKEUT +0xA09D 0xC825 #HANGUL SYLLABLE CIEUC E RIEULKIYEOK +0xA09E 0xC826 #HANGUL SYLLABLE CIEUC E RIEULMIEUM +0xA09F 0xC827 #HANGUL SYLLABLE CIEUC E RIEULPIEUP +0xA0A0 0xC828 #HANGUL SYLLABLE CIEUC E RIEULSIOS +0xA0A1 0xC829 #HANGUL SYLLABLE CIEUC E RIEULTHIEUTH +0xA0A2 0xC82A #HANGUL SYLLABLE CIEUC E RIEULPHIEUPH +0xA0A3 0xC82B #HANGUL SYLLABLE CIEUC E RIEULHIEUH +0xA0A4 0xC82E #HANGUL SYLLABLE CIEUC E PIEUPSIOS +0xA0A5 0xC830 #HANGUL SYLLABLE CIEUC E SSANGSIOS +0xA0A6 0xC832 #HANGUL SYLLABLE CIEUC E CIEUC +0xA0A7 0xC833 #HANGUL SYLLABLE CIEUC E CHIEUCH +0xA0A8 0xC834 #HANGUL SYLLABLE CIEUC E KHIEUKH +0xA0A9 0xC835 #HANGUL SYLLABLE CIEUC E THIEUTH +0xA0AA 0xC836 #HANGUL SYLLABLE CIEUC E PHIEUPH +0xA0AB 0xC837 #HANGUL SYLLABLE CIEUC E HIEUH +0xA0AC 0xC839 #HANGUL SYLLABLE CIEUC YEO KIYEOK +0xA0AD 0xC83A #HANGUL SYLLABLE CIEUC YEO SSANGKIYEOK +0xA0AE 0xC83B #HANGUL SYLLABLE CIEUC YEO KIYEOKSIOS +0xA0AF 0xC83D #HANGUL SYLLABLE CIEUC YEO NIEUNCIEUC +0xA0B0 0xC83E #HANGUL SYLLABLE CIEUC YEO NIEUNHIEUH +0xA0B1 0xC83F #HANGUL SYLLABLE CIEUC YEO TIKEUT +0xA0B2 0xC841 #HANGUL SYLLABLE CIEUC YEO RIEULKIYEOK +0xA0B3 0xC842 #HANGUL SYLLABLE CIEUC YEO RIEULMIEUM +0xA0B4 0xC843 #HANGUL SYLLABLE CIEUC YEO RIEULPIEUP +0xA0B5 0xC844 #HANGUL SYLLABLE CIEUC YEO RIEULSIOS +0xA0B6 0xC845 #HANGUL SYLLABLE CIEUC YEO RIEULTHIEUTH +0xA0B7 0xC846 #HANGUL SYLLABLE CIEUC YEO RIEULPHIEUPH +0xA0B8 0xC847 #HANGUL SYLLABLE CIEUC YEO RIEULHIEUH +0xA0B9 0xC84A #HANGUL SYLLABLE CIEUC YEO PIEUPSIOS +0xA0BA 0xC84B #HANGUL SYLLABLE CIEUC YEO SIOS +0xA0BB 0xC84E #HANGUL SYLLABLE CIEUC YEO CIEUC +0xA0BC 0xC84F #HANGUL SYLLABLE CIEUC YEO CHIEUCH +0xA0BD 0xC850 #HANGUL SYLLABLE CIEUC YEO KHIEUKH +0xA0BE 0xC851 #HANGUL SYLLABLE CIEUC YEO THIEUTH +0xA0BF 0xC852 #HANGUL SYLLABLE CIEUC YEO PHIEUPH +0xA0C0 0xC853 #HANGUL SYLLABLE CIEUC YEO HIEUH +0xA0C1 0xC855 #HANGUL SYLLABLE CIEUC YE KIYEOK +0xA0C2 0xC856 #HANGUL SYLLABLE CIEUC YE SSANGKIYEOK +0xA0C3 0xC857 #HANGUL SYLLABLE CIEUC YE KIYEOKSIOS +0xA0C4 0xC858 #HANGUL SYLLABLE CIEUC YE NIEUN +0xA0C5 0xC859 #HANGUL SYLLABLE CIEUC YE NIEUNCIEUC +0xA0C6 0xC85A #HANGUL SYLLABLE CIEUC YE NIEUNHIEUH +0xA0C7 0xC85B #HANGUL SYLLABLE CIEUC YE TIKEUT +0xA0C8 0xC85C #HANGUL SYLLABLE CIEUC YE RIEUL +0xA0C9 0xC85D #HANGUL SYLLABLE CIEUC YE RIEULKIYEOK +0xA0CA 0xC85E #HANGUL SYLLABLE CIEUC YE RIEULMIEUM +0xA0CB 0xC85F #HANGUL SYLLABLE CIEUC YE RIEULPIEUP +0xA0CC 0xC860 #HANGUL SYLLABLE CIEUC YE RIEULSIOS +0xA0CD 0xC861 #HANGUL SYLLABLE CIEUC YE RIEULTHIEUTH +0xA0CE 0xC862 #HANGUL SYLLABLE CIEUC YE RIEULPHIEUPH +0xA0CF 0xC863 #HANGUL SYLLABLE CIEUC YE RIEULHIEUH +0xA0D0 0xC864 #HANGUL SYLLABLE CIEUC YE MIEUM +0xA0D1 0xC865 #HANGUL SYLLABLE CIEUC YE PIEUP +0xA0D2 0xC866 #HANGUL SYLLABLE CIEUC YE PIEUPSIOS +0xA0D3 0xC867 #HANGUL SYLLABLE CIEUC YE SIOS +0xA0D4 0xC868 #HANGUL SYLLABLE CIEUC YE SSANGSIOS +0xA0D5 0xC869 #HANGUL SYLLABLE CIEUC YE IEUNG +0xA0D6 0xC86A #HANGUL SYLLABLE CIEUC YE CIEUC +0xA0D7 0xC86B #HANGUL SYLLABLE CIEUC YE CHIEUCH +0xA0D8 0xC86C #HANGUL SYLLABLE CIEUC YE KHIEUKH +0xA0D9 0xC86D #HANGUL SYLLABLE CIEUC YE THIEUTH +0xA0DA 0xC86E #HANGUL SYLLABLE CIEUC YE PHIEUPH +0xA0DB 0xC86F #HANGUL SYLLABLE CIEUC YE HIEUH +0xA0DC 0xC872 #HANGUL SYLLABLE CIEUC O SSANGKIYEOK +0xA0DD 0xC873 #HANGUL SYLLABLE CIEUC O KIYEOKSIOS +0xA0DE 0xC875 #HANGUL SYLLABLE CIEUC O NIEUNCIEUC +0xA0DF 0xC876 #HANGUL SYLLABLE CIEUC O NIEUNHIEUH +0xA0E0 0xC877 #HANGUL SYLLABLE CIEUC O TIKEUT +0xA0E1 0xC879 #HANGUL SYLLABLE CIEUC O RIEULKIYEOK +0xA0E2 0xC87B #HANGUL SYLLABLE CIEUC O RIEULPIEUP +0xA0E3 0xC87C #HANGUL SYLLABLE CIEUC O RIEULSIOS +0xA0E4 0xC87D #HANGUL SYLLABLE CIEUC O RIEULTHIEUTH +0xA0E5 0xC87E #HANGUL SYLLABLE CIEUC O RIEULPHIEUPH +0xA0E6 0xC87F #HANGUL SYLLABLE CIEUC O RIEULHIEUH +0xA0E7 0xC882 #HANGUL SYLLABLE CIEUC O PIEUPSIOS +0xA0E8 0xC884 #HANGUL SYLLABLE CIEUC O SSANGSIOS +0xA0E9 0xC888 #HANGUL SYLLABLE CIEUC O KHIEUKH +0xA0EA 0xC889 #HANGUL SYLLABLE CIEUC O THIEUTH +0xA0EB 0xC88A #HANGUL SYLLABLE CIEUC O PHIEUPH +0xA0EC 0xC88E #HANGUL SYLLABLE CIEUC WA SSANGKIYEOK +0xA0ED 0xC88F #HANGUL SYLLABLE CIEUC WA KIYEOKSIOS +0xA0EE 0xC890 #HANGUL SYLLABLE CIEUC WA NIEUN +0xA0EF 0xC891 #HANGUL SYLLABLE CIEUC WA NIEUNCIEUC +0xA0F0 0xC892 #HANGUL SYLLABLE CIEUC WA NIEUNHIEUH +0xA0F1 0xC893 #HANGUL SYLLABLE CIEUC WA TIKEUT +0xA0F2 0xC895 #HANGUL SYLLABLE CIEUC WA RIEULKIYEOK +0xA0F3 0xC896 #HANGUL SYLLABLE CIEUC WA RIEULMIEUM +0xA0F4 0xC897 #HANGUL SYLLABLE CIEUC WA RIEULPIEUP +0xA0F5 0xC898 #HANGUL SYLLABLE CIEUC WA RIEULSIOS +0xA0F6 0xC899 #HANGUL SYLLABLE CIEUC WA RIEULTHIEUTH +0xA0F7 0xC89A #HANGUL SYLLABLE CIEUC WA RIEULPHIEUPH +0xA0F8 0xC89B #HANGUL SYLLABLE CIEUC WA RIEULHIEUH +0xA0F9 0xC89C #HANGUL SYLLABLE CIEUC WA MIEUM +0xA0FA 0xC89E #HANGUL SYLLABLE CIEUC WA PIEUPSIOS +0xA0FB 0xC8A0 #HANGUL SYLLABLE CIEUC WA SSANGSIOS +0xA0FC 0xC8A2 #HANGUL SYLLABLE CIEUC WA CIEUC +0xA0FD 0xC8A3 #HANGUL SYLLABLE CIEUC WA CHIEUCH +0xA0FE 0xC8A4 #HANGUL SYLLABLE CIEUC WA KHIEUKH +0xA141 0xC8A5 #HANGUL SYLLABLE CIEUC WA THIEUTH +0xA142 0xC8A6 #HANGUL SYLLABLE CIEUC WA PHIEUPH +0xA143 0xC8A7 #HANGUL SYLLABLE CIEUC WA HIEUH +0xA144 0xC8A9 #HANGUL SYLLABLE CIEUC WAE KIYEOK +0xA145 0xC8AA #HANGUL SYLLABLE CIEUC WAE SSANGKIYEOK +0xA146 0xC8AB #HANGUL SYLLABLE CIEUC WAE KIYEOKSIOS +0xA147 0xC8AC #HANGUL SYLLABLE CIEUC WAE NIEUN +0xA148 0xC8AD #HANGUL SYLLABLE CIEUC WAE NIEUNCIEUC +0xA149 0xC8AE #HANGUL SYLLABLE CIEUC WAE NIEUNHIEUH +0xA14A 0xC8AF #HANGUL SYLLABLE CIEUC WAE TIKEUT +0xA14B 0xC8B0 #HANGUL SYLLABLE CIEUC WAE RIEUL +0xA14C 0xC8B1 #HANGUL SYLLABLE CIEUC WAE RIEULKIYEOK +0xA14D 0xC8B2 #HANGUL SYLLABLE CIEUC WAE RIEULMIEUM +0xA14E 0xC8B3 #HANGUL SYLLABLE CIEUC WAE RIEULPIEUP +0xA14F 0xC8B4 #HANGUL SYLLABLE CIEUC WAE RIEULSIOS +0xA150 0xC8B5 #HANGUL SYLLABLE CIEUC WAE RIEULTHIEUTH +0xA151 0xC8B6 #HANGUL SYLLABLE CIEUC WAE RIEULPHIEUPH +0xA152 0xC8B7 #HANGUL SYLLABLE CIEUC WAE RIEULHIEUH +0xA153 0xC8B8 #HANGUL SYLLABLE CIEUC WAE MIEUM +0xA154 0xC8B9 #HANGUL SYLLABLE CIEUC WAE PIEUP +0xA155 0xC8BA #HANGUL SYLLABLE CIEUC WAE PIEUPSIOS +0xA156 0xC8BB #HANGUL SYLLABLE CIEUC WAE SIOS +0xA157 0xC8BE #HANGUL SYLLABLE CIEUC WAE CIEUC +0xA158 0xC8BF #HANGUL SYLLABLE CIEUC WAE CHIEUCH +0xA159 0xC8C0 #HANGUL SYLLABLE CIEUC WAE KHIEUKH +0xA15A 0xC8C1 #HANGUL SYLLABLE CIEUC WAE THIEUTH +0xA161 0xC8C2 #HANGUL SYLLABLE CIEUC WAE PHIEUPH +0xA162 0xC8C3 #HANGUL SYLLABLE CIEUC WAE HIEUH +0xA163 0xC8C5 #HANGUL SYLLABLE CIEUC OE KIYEOK +0xA164 0xC8C6 #HANGUL SYLLABLE CIEUC OE SSANGKIYEOK +0xA165 0xC8C7 #HANGUL SYLLABLE CIEUC OE KIYEOKSIOS +0xA166 0xC8C9 #HANGUL SYLLABLE CIEUC OE NIEUNCIEUC +0xA167 0xC8CA #HANGUL SYLLABLE CIEUC OE NIEUNHIEUH +0xA168 0xC8CB #HANGUL SYLLABLE CIEUC OE TIKEUT +0xA169 0xC8CD #HANGUL SYLLABLE CIEUC OE RIEULKIYEOK +0xA16A 0xC8CE #HANGUL SYLLABLE CIEUC OE RIEULMIEUM +0xA16B 0xC8CF #HANGUL SYLLABLE CIEUC OE RIEULPIEUP +0xA16C 0xC8D0 #HANGUL SYLLABLE CIEUC OE RIEULSIOS +0xA16D 0xC8D1 #HANGUL SYLLABLE CIEUC OE RIEULTHIEUTH +0xA16E 0xC8D2 #HANGUL SYLLABLE CIEUC OE RIEULPHIEUPH +0xA16F 0xC8D3 #HANGUL SYLLABLE CIEUC OE RIEULHIEUH +0xA170 0xC8D6 #HANGUL SYLLABLE CIEUC OE PIEUPSIOS +0xA171 0xC8D8 #HANGUL SYLLABLE CIEUC OE SSANGSIOS +0xA172 0xC8DA #HANGUL SYLLABLE CIEUC OE CIEUC +0xA173 0xC8DB #HANGUL SYLLABLE CIEUC OE CHIEUCH +0xA174 0xC8DC #HANGUL SYLLABLE CIEUC OE KHIEUKH +0xA175 0xC8DD #HANGUL SYLLABLE CIEUC OE THIEUTH +0xA176 0xC8DE #HANGUL SYLLABLE CIEUC OE PHIEUPH +0xA177 0xC8DF #HANGUL SYLLABLE CIEUC OE HIEUH +0xA178 0xC8E2 #HANGUL SYLLABLE CIEUC YO SSANGKIYEOK +0xA179 0xC8E3 #HANGUL SYLLABLE CIEUC YO KIYEOKSIOS +0xA17A 0xC8E5 #HANGUL SYLLABLE CIEUC YO NIEUNCIEUC +0xA181 0xC8E6 #HANGUL SYLLABLE CIEUC YO NIEUNHIEUH +0xA182 0xC8E7 #HANGUL SYLLABLE CIEUC YO TIKEUT +0xA183 0xC8E8 #HANGUL SYLLABLE CIEUC YO RIEUL +0xA184 0xC8E9 #HANGUL SYLLABLE CIEUC YO RIEULKIYEOK +0xA185 0xC8EA #HANGUL SYLLABLE CIEUC YO RIEULMIEUM +0xA186 0xC8EB #HANGUL SYLLABLE CIEUC YO RIEULPIEUP +0xA187 0xC8EC #HANGUL SYLLABLE CIEUC YO RIEULSIOS +0xA188 0xC8ED #HANGUL SYLLABLE CIEUC YO RIEULTHIEUTH +0xA189 0xC8EE #HANGUL SYLLABLE CIEUC YO RIEULPHIEUPH +0xA18A 0xC8EF #HANGUL SYLLABLE CIEUC YO RIEULHIEUH +0xA18B 0xC8F0 #HANGUL SYLLABLE CIEUC YO MIEUM +0xA18C 0xC8F1 #HANGUL SYLLABLE CIEUC YO PIEUP +0xA18D 0xC8F2 #HANGUL SYLLABLE CIEUC YO PIEUPSIOS +0xA18E 0xC8F3 #HANGUL SYLLABLE CIEUC YO SIOS +0xA18F 0xC8F4 #HANGUL SYLLABLE CIEUC YO SSANGSIOS +0xA190 0xC8F6 #HANGUL SYLLABLE CIEUC YO CIEUC +0xA191 0xC8F7 #HANGUL SYLLABLE CIEUC YO CHIEUCH +0xA192 0xC8F8 #HANGUL SYLLABLE CIEUC YO KHIEUKH +0xA193 0xC8F9 #HANGUL SYLLABLE CIEUC YO THIEUTH +0xA194 0xC8FA #HANGUL SYLLABLE CIEUC YO PHIEUPH +0xA195 0xC8FB #HANGUL SYLLABLE CIEUC YO HIEUH +0xA196 0xC8FE #HANGUL SYLLABLE CIEUC U SSANGKIYEOK +0xA197 0xC8FF #HANGUL SYLLABLE CIEUC U KIYEOKSIOS +0xA198 0xC901 #HANGUL SYLLABLE CIEUC U NIEUNCIEUC +0xA199 0xC902 #HANGUL SYLLABLE CIEUC U NIEUNHIEUH +0xA19A 0xC903 #HANGUL SYLLABLE CIEUC U TIKEUT +0xA19B 0xC907 #HANGUL SYLLABLE CIEUC U RIEULPIEUP +0xA19C 0xC908 #HANGUL SYLLABLE CIEUC U RIEULSIOS +0xA19D 0xC909 #HANGUL SYLLABLE CIEUC U RIEULTHIEUTH +0xA19E 0xC90A #HANGUL SYLLABLE CIEUC U RIEULPHIEUPH +0xA19F 0xC90B #HANGUL SYLLABLE CIEUC U RIEULHIEUH +0xA1A0 0xC90E #HANGUL SYLLABLE CIEUC U PIEUPSIOS +0xA1A1 0x3000 #IDEOGRAPHIC SPACE +0xA1A2 0x3001 #IDEOGRAPHIC COMMA +0xA1A3 0x3002 #IDEOGRAPHIC FULL STOP +0xA1A4 0x00B7 #MIDDLE DOT +0xA1A5 0x2025 #TWO DOT LEADER +0xA1A6 0x2026 #HORIZONTAL ELLIPSIS +0xA1A7 0x00A8 #DIAERESIS +0xA1A8 0x3003 #DITTO MARK +0xA1A9 0x00AD #SOFT HYPHEN +0xA1AA 0x2015 #HORIZONTAL BAR +0xA1AB 0x2225 #PARALLEL TO +0xA1AC 0xFF3C #FULLWIDTH REVERSE SOLIDUS +0xA1AD 0x223C #TILDE OPERATOR +0xA1AE 0x2018 #LEFT SINGLE QUOTATION MARK +0xA1AF 0x2019 #RIGHT SINGLE QUOTATION MARK +0xA1B0 0x201C #LEFT DOUBLE QUOTATION MARK +0xA1B1 0x201D #RIGHT DOUBLE QUOTATION MARK +0xA1B2 0x3014 #LEFT TORTOISE SHELL BRACKET +0xA1B3 0x3015 #RIGHT TORTOISE SHELL BRACKET +0xA1B4 0x3008 #LEFT ANGLE BRACKET +0xA1B5 0x3009 #RIGHT ANGLE BRACKET +0xA1B6 0x300A #LEFT DOUBLE ANGLE BRACKET +0xA1B7 0x300B #RIGHT DOUBLE ANGLE BRACKET +0xA1B8 0x300C #LEFT CORNER BRACKET +0xA1B9 0x300D #RIGHT CORNER BRACKET +0xA1BA 0x300E #LEFT WHITE CORNER BRACKET +0xA1BB 0x300F #RIGHT WHITE CORNER BRACKET +0xA1BC 0x3010 #LEFT BLACK LENTICULAR BRACKET +0xA1BD 0x3011 #RIGHT BLACK LENTICULAR BRACKET +0xA1BE 0x00B1 #PLUS-MINUS SIGN +0xA1BF 0x00D7 #MULTIPLICATION SIGN +0xA1C0 0x00F7 #DIVISION SIGN +0xA1C1 0x2260 #NOT EQUAL TO +0xA1C2 0x2264 #LESS-THAN OR EQUAL TO +0xA1C3 0x2265 #GREATER-THAN OR EQUAL TO +0xA1C4 0x221E #INFINITY +0xA1C5 0x2234 #THEREFORE +0xA1C6 0x00B0 #DEGREE SIGN +0xA1C7 0x2032 #PRIME +0xA1C8 0x2033 #DOUBLE PRIME +0xA1C9 0x2103 #DEGREE CELSIUS +0xA1CA 0x212B #ANGSTROM SIGN +0xA1CB 0xFFE0 #FULLWIDTH CENT SIGN +0xA1CC 0xFFE1 #FULLWIDTH POUND SIGN +0xA1CD 0xFFE5 #FULLWIDTH YEN SIGN +0xA1CE 0x2642 #MALE SIGN +0xA1CF 0x2640 #FEMALE SIGN +0xA1D0 0x2220 #ANGLE +0xA1D1 0x22A5 #UP TACK +0xA1D2 0x2312 #ARC +0xA1D3 0x2202 #PARTIAL DIFFERENTIAL +0xA1D4 0x2207 #NABLA +0xA1D5 0x2261 #IDENTICAL TO +0xA1D6 0x2252 #APPROXIMATELY EQUAL TO OR THE IMAGE OF +0xA1D7 0x00A7 #SECTION SIGN +0xA1D8 0x203B #REFERENCE MARK +0xA1D9 0x2606 #WHITE STAR +0xA1DA 0x2605 #BLACK STAR +0xA1DB 0x25CB #WHITE CIRCLE +0xA1DC 0x25CF #BLACK CIRCLE +0xA1DD 0x25CE #BULLSEYE +0xA1DE 0x25C7 #WHITE DIAMOND +0xA1DF 0x25C6 #BLACK DIAMOND +0xA1E0 0x25A1 #WHITE SQUARE +0xA1E1 0x25A0 #BLACK SQUARE +0xA1E2 0x25B3 #WHITE UP-POINTING TRIANGLE +0xA1E3 0x25B2 #BLACK UP-POINTING TRIANGLE +0xA1E4 0x25BD #WHITE DOWN-POINTING TRIANGLE +0xA1E5 0x25BC #BLACK DOWN-POINTING TRIANGLE +0xA1E6 0x2192 #RIGHTWARDS ARROW +0xA1E7 0x2190 #LEFTWARDS ARROW +0xA1E8 0x2191 #UPWARDS ARROW +0xA1E9 0x2193 #DOWNWARDS ARROW +0xA1EA 0x2194 #LEFT RIGHT ARROW +0xA1EB 0x3013 #GETA MARK +0xA1EC 0x226A #MUCH LESS-THAN +0xA1ED 0x226B #MUCH GREATER-THAN +0xA1EE 0x221A #SQUARE ROOT +0xA1EF 0x223D #REVERSED TILDE +0xA1F0 0x221D #PROPORTIONAL TO +0xA1F1 0x2235 #BECAUSE +0xA1F2 0x222B #INTEGRAL +0xA1F3 0x222C #DOUBLE INTEGRAL +0xA1F4 0x2208 #ELEMENT OF +0xA1F5 0x220B #CONTAINS AS MEMBER +0xA1F6 0x2286 #SUBSET OF OR EQUAL TO +0xA1F7 0x2287 #SUPERSET OF OR EQUAL TO +0xA1F8 0x2282 #SUBSET OF +0xA1F9 0x2283 #SUPERSET OF +0xA1FA 0x222A #UNION +0xA1FB 0x2229 #INTERSECTION +0xA1FC 0x2227 #LOGICAL AND +0xA1FD 0x2228 #LOGICAL OR +0xA1FE 0xFFE2 #FULLWIDTH NOT SIGN +0xA241 0xC910 #HANGUL SYLLABLE CIEUC U SSANGSIOS +0xA242 0xC912 #HANGUL SYLLABLE CIEUC U CIEUC +0xA243 0xC913 #HANGUL SYLLABLE CIEUC U CHIEUCH +0xA244 0xC914 #HANGUL SYLLABLE CIEUC U KHIEUKH +0xA245 0xC915 #HANGUL SYLLABLE CIEUC U THIEUTH +0xA246 0xC916 #HANGUL SYLLABLE CIEUC U PHIEUPH +0xA247 0xC917 #HANGUL SYLLABLE CIEUC U HIEUH +0xA248 0xC919 #HANGUL SYLLABLE CIEUC WEO KIYEOK +0xA249 0xC91A #HANGUL SYLLABLE CIEUC WEO SSANGKIYEOK +0xA24A 0xC91B #HANGUL SYLLABLE CIEUC WEO KIYEOKSIOS +0xA24B 0xC91C #HANGUL SYLLABLE CIEUC WEO NIEUN +0xA24C 0xC91D #HANGUL SYLLABLE CIEUC WEO NIEUNCIEUC +0xA24D 0xC91E #HANGUL SYLLABLE CIEUC WEO NIEUNHIEUH +0xA24E 0xC91F #HANGUL SYLLABLE CIEUC WEO TIKEUT +0xA24F 0xC920 #HANGUL SYLLABLE CIEUC WEO RIEUL +0xA250 0xC921 #HANGUL SYLLABLE CIEUC WEO RIEULKIYEOK +0xA251 0xC922 #HANGUL SYLLABLE CIEUC WEO RIEULMIEUM +0xA252 0xC923 #HANGUL SYLLABLE CIEUC WEO RIEULPIEUP +0xA253 0xC924 #HANGUL SYLLABLE CIEUC WEO RIEULSIOS +0xA254 0xC925 #HANGUL SYLLABLE CIEUC WEO RIEULTHIEUTH +0xA255 0xC926 #HANGUL SYLLABLE CIEUC WEO RIEULPHIEUPH +0xA256 0xC927 #HANGUL SYLLABLE CIEUC WEO RIEULHIEUH +0xA257 0xC928 #HANGUL SYLLABLE CIEUC WEO MIEUM +0xA258 0xC929 #HANGUL SYLLABLE CIEUC WEO PIEUP +0xA259 0xC92A #HANGUL SYLLABLE CIEUC WEO PIEUPSIOS +0xA25A 0xC92B #HANGUL SYLLABLE CIEUC WEO SIOS +0xA261 0xC92D #HANGUL SYLLABLE CIEUC WEO IEUNG +0xA262 0xC92E #HANGUL SYLLABLE CIEUC WEO CIEUC +0xA263 0xC92F #HANGUL SYLLABLE CIEUC WEO CHIEUCH +0xA264 0xC930 #HANGUL SYLLABLE CIEUC WEO KHIEUKH +0xA265 0xC931 #HANGUL SYLLABLE CIEUC WEO THIEUTH +0xA266 0xC932 #HANGUL SYLLABLE CIEUC WEO PHIEUPH +0xA267 0xC933 #HANGUL SYLLABLE CIEUC WEO HIEUH +0xA268 0xC935 #HANGUL SYLLABLE CIEUC WE KIYEOK +0xA269 0xC936 #HANGUL SYLLABLE CIEUC WE SSANGKIYEOK +0xA26A 0xC937 #HANGUL SYLLABLE CIEUC WE KIYEOKSIOS +0xA26B 0xC938 #HANGUL SYLLABLE CIEUC WE NIEUN +0xA26C 0xC939 #HANGUL SYLLABLE CIEUC WE NIEUNCIEUC +0xA26D 0xC93A #HANGUL SYLLABLE CIEUC WE NIEUNHIEUH +0xA26E 0xC93B #HANGUL SYLLABLE CIEUC WE TIKEUT +0xA26F 0xC93C #HANGUL SYLLABLE CIEUC WE RIEUL +0xA270 0xC93D #HANGUL SYLLABLE CIEUC WE RIEULKIYEOK +0xA271 0xC93E #HANGUL SYLLABLE CIEUC WE RIEULMIEUM +0xA272 0xC93F #HANGUL SYLLABLE CIEUC WE RIEULPIEUP +0xA273 0xC940 #HANGUL SYLLABLE CIEUC WE RIEULSIOS +0xA274 0xC941 #HANGUL SYLLABLE CIEUC WE RIEULTHIEUTH +0xA275 0xC942 #HANGUL SYLLABLE CIEUC WE RIEULPHIEUPH +0xA276 0xC943 #HANGUL SYLLABLE CIEUC WE RIEULHIEUH +0xA277 0xC944 #HANGUL SYLLABLE CIEUC WE MIEUM +0xA278 0xC945 #HANGUL SYLLABLE CIEUC WE PIEUP +0xA279 0xC946 #HANGUL SYLLABLE CIEUC WE PIEUPSIOS +0xA27A 0xC947 #HANGUL SYLLABLE CIEUC WE SIOS +0xA281 0xC948 #HANGUL SYLLABLE CIEUC WE SSANGSIOS +0xA282 0xC949 #HANGUL SYLLABLE CIEUC WE IEUNG +0xA283 0xC94A #HANGUL SYLLABLE CIEUC WE CIEUC +0xA284 0xC94B #HANGUL SYLLABLE CIEUC WE CHIEUCH +0xA285 0xC94C #HANGUL SYLLABLE CIEUC WE KHIEUKH +0xA286 0xC94D #HANGUL SYLLABLE CIEUC WE THIEUTH +0xA287 0xC94E #HANGUL SYLLABLE CIEUC WE PHIEUPH +0xA288 0xC94F #HANGUL SYLLABLE CIEUC WE HIEUH +0xA289 0xC952 #HANGUL SYLLABLE CIEUC WI SSANGKIYEOK +0xA28A 0xC953 #HANGUL SYLLABLE CIEUC WI KIYEOKSIOS +0xA28B 0xC955 #HANGUL SYLLABLE CIEUC WI NIEUNCIEUC +0xA28C 0xC956 #HANGUL SYLLABLE CIEUC WI NIEUNHIEUH +0xA28D 0xC957 #HANGUL SYLLABLE CIEUC WI TIKEUT +0xA28E 0xC959 #HANGUL SYLLABLE CIEUC WI RIEULKIYEOK +0xA28F 0xC95A #HANGUL SYLLABLE CIEUC WI RIEULMIEUM +0xA290 0xC95B #HANGUL SYLLABLE CIEUC WI RIEULPIEUP +0xA291 0xC95C #HANGUL SYLLABLE CIEUC WI RIEULSIOS +0xA292 0xC95D #HANGUL SYLLABLE CIEUC WI RIEULTHIEUTH +0xA293 0xC95E #HANGUL SYLLABLE CIEUC WI RIEULPHIEUPH +0xA294 0xC95F #HANGUL SYLLABLE CIEUC WI RIEULHIEUH +0xA295 0xC962 #HANGUL SYLLABLE CIEUC WI PIEUPSIOS +0xA296 0xC964 #HANGUL SYLLABLE CIEUC WI SSANGSIOS +0xA297 0xC965 #HANGUL SYLLABLE CIEUC WI IEUNG +0xA298 0xC966 #HANGUL SYLLABLE CIEUC WI CIEUC +0xA299 0xC967 #HANGUL SYLLABLE CIEUC WI CHIEUCH +0xA29A 0xC968 #HANGUL SYLLABLE CIEUC WI KHIEUKH +0xA29B 0xC969 #HANGUL SYLLABLE CIEUC WI THIEUTH +0xA29C 0xC96A #HANGUL SYLLABLE CIEUC WI PHIEUPH +0xA29D 0xC96B #HANGUL SYLLABLE CIEUC WI HIEUH +0xA29E 0xC96D #HANGUL SYLLABLE CIEUC YU KIYEOK +0xA29F 0xC96E #HANGUL SYLLABLE CIEUC YU SSANGKIYEOK +0xA2A0 0xC96F #HANGUL SYLLABLE CIEUC YU KIYEOKSIOS +0xA2A1 0x21D2 #RIGHTWARDS DOUBLE ARROW +0xA2A2 0x21D4 #LEFT RIGHT DOUBLE ARROW +0xA2A3 0x2200 #FOR ALL +0xA2A4 0x2203 #THERE EXISTS +0xA2A5 0x00B4 #ACUTE ACCENT +0xA2A6 0xFF5E #FULLWIDTH TILDE +0xA2A7 0x02C7 #CARON +0xA2A8 0x02D8 #BREVE +0xA2A9 0x02DD #DOUBLE ACUTE ACCENT +0xA2AA 0x02DA #RING ABOVE +0xA2AB 0x02D9 #DOT ABOVE +0xA2AC 0x00B8 #CEDILLA +0xA2AD 0x02DB #OGONEK +0xA2AE 0x00A1 #INVERTED EXCLAMATION MARK +0xA2AF 0x00BF #INVERTED QUESTION MARK +0xA2B0 0x02D0 #MODIFIER LETTER TRIANGULAR COLON +0xA2B1 0x222E #CONTOUR INTEGRAL +0xA2B2 0x2211 #N-ARY SUMMATION +0xA2B3 0x220F #N-ARY PRODUCT +0xA2B4 0x00A4 #CURRENCY SIGN +0xA2B5 0x2109 #DEGREE FAHRENHEIT +0xA2B6 0x2030 #PER MILLE SIGN +0xA2B7 0x25C1 #WHITE LEFT-POINTING TRIANGLE +0xA2B8 0x25C0 #BLACK LEFT-POINTING TRIANGLE +0xA2B9 0x25B7 #WHITE RIGHT-POINTING TRIANGLE +0xA2BA 0x25B6 #BLACK RIGHT-POINTING TRIANGLE +0xA2BB 0x2664 #WHITE SPADE SUIT +0xA2BC 0x2660 #BLACK SPADE SUIT +0xA2BD 0x2661 #WHITE HEART SUIT +0xA2BE 0x2665 #BLACK HEART SUIT +0xA2BF 0x2667 #WHITE CLUB SUIT +0xA2C0 0x2663 #BLACK CLUB SUIT +0xA2C1 0x2299 #CIRCLED DOT OPERATOR +0xA2C2 0x25C8 #WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND +0xA2C3 0x25A3 #WHITE SQUARE CONTAINING BLACK SMALL SQUARE +0xA2C4 0x25D0 #CIRCLE WITH LEFT HALF BLACK +0xA2C5 0x25D1 #CIRCLE WITH RIGHT HALF BLACK +0xA2C6 0x2592 #MEDIUM SHADE +0xA2C7 0x25A4 #SQUARE WITH HORIZONTAL FILL +0xA2C8 0x25A5 #SQUARE WITH VERTICAL FILL +0xA2C9 0x25A8 #SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL +0xA2CA 0x25A7 #SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL +0xA2CB 0x25A6 #SQUARE WITH ORTHOGONAL CROSSHATCH FILL +0xA2CC 0x25A9 #SQUARE WITH DIAGONAL CROSSHATCH FILL +0xA2CD 0x2668 #HOT SPRINGS +0xA2CE 0x260F #WHITE TELEPHONE +0xA2CF 0x260E #BLACK TELEPHONE +0xA2D0 0x261C #WHITE LEFT POINTING INDEX +0xA2D1 0x261E #WHITE RIGHT POINTING INDEX +0xA2D2 0x00B6 #PILCROW SIGN +0xA2D3 0x2020 #DAGGER +0xA2D4 0x2021 #DOUBLE DAGGER +0xA2D5 0x2195 #UP DOWN ARROW +0xA2D6 0x2197 #NORTH EAST ARROW +0xA2D7 0x2199 #SOUTH WEST ARROW +0xA2D8 0x2196 #NORTH WEST ARROW +0xA2D9 0x2198 #SOUTH EAST ARROW +0xA2DA 0x266D #MUSIC FLAT SIGN +0xA2DB 0x2669 #QUARTER NOTE +0xA2DC 0x266A #EIGHTH NOTE +0xA2DD 0x266C #BEAMED SIXTEENTH NOTES +0xA2DE 0x327F #KOREAN STANDARD SYMBOL +0xA2DF 0x321C #PARENTHESIZED HANGUL CIEUC U +0xA2E0 0x2116 #NUMERO SIGN +0xA2E1 0x33C7 #SQUARE CO +0xA2E2 0x2122 #TRADE MARK SIGN +0xA2E3 0x33C2 #SQUARE AM +0xA2E4 0x33D8 #SQUARE PM +0xA2E5 0x2121 #TELEPHONE SIGN +0xA2E6 0x20AC #EURO SIGN +0xA2E7 0x00AE #REGISTERED SIGN +0xA341 0xC971 #HANGUL SYLLABLE CIEUC YU NIEUNCIEUC +0xA342 0xC972 #HANGUL SYLLABLE CIEUC YU NIEUNHIEUH +0xA343 0xC973 #HANGUL SYLLABLE CIEUC YU TIKEUT +0xA344 0xC975 #HANGUL SYLLABLE CIEUC YU RIEULKIYEOK +0xA345 0xC976 #HANGUL SYLLABLE CIEUC YU RIEULMIEUM +0xA346 0xC977 #HANGUL SYLLABLE CIEUC YU RIEULPIEUP +0xA347 0xC978 #HANGUL SYLLABLE CIEUC YU RIEULSIOS +0xA348 0xC979 #HANGUL SYLLABLE CIEUC YU RIEULTHIEUTH +0xA349 0xC97A #HANGUL SYLLABLE CIEUC YU RIEULPHIEUPH +0xA34A 0xC97B #HANGUL SYLLABLE CIEUC YU RIEULHIEUH +0xA34B 0xC97D #HANGUL SYLLABLE CIEUC YU PIEUP +0xA34C 0xC97E #HANGUL SYLLABLE CIEUC YU PIEUPSIOS +0xA34D 0xC97F #HANGUL SYLLABLE CIEUC YU SIOS +0xA34E 0xC980 #HANGUL SYLLABLE CIEUC YU SSANGSIOS +0xA34F 0xC981 #HANGUL SYLLABLE CIEUC YU IEUNG +0xA350 0xC982 #HANGUL SYLLABLE CIEUC YU CIEUC +0xA351 0xC983 #HANGUL SYLLABLE CIEUC YU CHIEUCH +0xA352 0xC984 #HANGUL SYLLABLE CIEUC YU KHIEUKH +0xA353 0xC985 #HANGUL SYLLABLE CIEUC YU THIEUTH +0xA354 0xC986 #HANGUL SYLLABLE CIEUC YU PHIEUPH +0xA355 0xC987 #HANGUL SYLLABLE CIEUC YU HIEUH +0xA356 0xC98A #HANGUL SYLLABLE CIEUC EU SSANGKIYEOK +0xA357 0xC98B #HANGUL SYLLABLE CIEUC EU KIYEOKSIOS +0xA358 0xC98D #HANGUL SYLLABLE CIEUC EU NIEUNCIEUC +0xA359 0xC98E #HANGUL SYLLABLE CIEUC EU NIEUNHIEUH +0xA35A 0xC98F #HANGUL SYLLABLE CIEUC EU TIKEUT +0xA361 0xC991 #HANGUL SYLLABLE CIEUC EU RIEULKIYEOK +0xA362 0xC992 #HANGUL SYLLABLE CIEUC EU RIEULMIEUM +0xA363 0xC993 #HANGUL SYLLABLE CIEUC EU RIEULPIEUP +0xA364 0xC994 #HANGUL SYLLABLE CIEUC EU RIEULSIOS +0xA365 0xC995 #HANGUL SYLLABLE CIEUC EU RIEULTHIEUTH +0xA366 0xC996 #HANGUL SYLLABLE CIEUC EU RIEULPHIEUPH +0xA367 0xC997 #HANGUL SYLLABLE CIEUC EU RIEULHIEUH +0xA368 0xC99A #HANGUL SYLLABLE CIEUC EU PIEUPSIOS +0xA369 0xC99C #HANGUL SYLLABLE CIEUC EU SSANGSIOS +0xA36A 0xC99E #HANGUL SYLLABLE CIEUC EU CIEUC +0xA36B 0xC99F #HANGUL SYLLABLE CIEUC EU CHIEUCH +0xA36C 0xC9A0 #HANGUL SYLLABLE CIEUC EU KHIEUKH +0xA36D 0xC9A1 #HANGUL SYLLABLE CIEUC EU THIEUTH +0xA36E 0xC9A2 #HANGUL SYLLABLE CIEUC EU PHIEUPH +0xA36F 0xC9A3 #HANGUL SYLLABLE CIEUC EU HIEUH +0xA370 0xC9A4 #HANGUL SYLLABLE CIEUC YI +0xA371 0xC9A5 #HANGUL SYLLABLE CIEUC YI KIYEOK +0xA372 0xC9A6 #HANGUL SYLLABLE CIEUC YI SSANGKIYEOK +0xA373 0xC9A7 #HANGUL SYLLABLE CIEUC YI KIYEOKSIOS +0xA374 0xC9A8 #HANGUL SYLLABLE CIEUC YI NIEUN +0xA375 0xC9A9 #HANGUL SYLLABLE CIEUC YI NIEUNCIEUC +0xA376 0xC9AA #HANGUL SYLLABLE CIEUC YI NIEUNHIEUH +0xA377 0xC9AB #HANGUL SYLLABLE CIEUC YI TIKEUT +0xA378 0xC9AC #HANGUL SYLLABLE CIEUC YI RIEUL +0xA379 0xC9AD #HANGUL SYLLABLE CIEUC YI RIEULKIYEOK +0xA37A 0xC9AE #HANGUL SYLLABLE CIEUC YI RIEULMIEUM +0xA381 0xC9AF #HANGUL SYLLABLE CIEUC YI RIEULPIEUP +0xA382 0xC9B0 #HANGUL SYLLABLE CIEUC YI RIEULSIOS +0xA383 0xC9B1 #HANGUL SYLLABLE CIEUC YI RIEULTHIEUTH +0xA384 0xC9B2 #HANGUL SYLLABLE CIEUC YI RIEULPHIEUPH +0xA385 0xC9B3 #HANGUL SYLLABLE CIEUC YI RIEULHIEUH +0xA386 0xC9B4 #HANGUL SYLLABLE CIEUC YI MIEUM +0xA387 0xC9B5 #HANGUL SYLLABLE CIEUC YI PIEUP +0xA388 0xC9B6 #HANGUL SYLLABLE CIEUC YI PIEUPSIOS +0xA389 0xC9B7 #HANGUL SYLLABLE CIEUC YI SIOS +0xA38A 0xC9B8 #HANGUL SYLLABLE CIEUC YI SSANGSIOS +0xA38B 0xC9B9 #HANGUL SYLLABLE CIEUC YI IEUNG +0xA38C 0xC9BA #HANGUL SYLLABLE CIEUC YI CIEUC +0xA38D 0xC9BB #HANGUL SYLLABLE CIEUC YI CHIEUCH +0xA38E 0xC9BC #HANGUL SYLLABLE CIEUC YI KHIEUKH +0xA38F 0xC9BD #HANGUL SYLLABLE CIEUC YI THIEUTH +0xA390 0xC9BE #HANGUL SYLLABLE CIEUC YI PHIEUPH +0xA391 0xC9BF #HANGUL SYLLABLE CIEUC YI HIEUH +0xA392 0xC9C2 #HANGUL SYLLABLE CIEUC I SSANGKIYEOK +0xA393 0xC9C3 #HANGUL SYLLABLE CIEUC I KIYEOKSIOS +0xA394 0xC9C5 #HANGUL SYLLABLE CIEUC I NIEUNCIEUC +0xA395 0xC9C6 #HANGUL SYLLABLE CIEUC I NIEUNHIEUH +0xA396 0xC9C9 #HANGUL SYLLABLE CIEUC I RIEULKIYEOK +0xA397 0xC9CB #HANGUL SYLLABLE CIEUC I RIEULPIEUP +0xA398 0xC9CC #HANGUL SYLLABLE CIEUC I RIEULSIOS +0xA399 0xC9CD #HANGUL SYLLABLE CIEUC I RIEULTHIEUTH +0xA39A 0xC9CE #HANGUL SYLLABLE CIEUC I RIEULPHIEUPH +0xA39B 0xC9CF #HANGUL SYLLABLE CIEUC I RIEULHIEUH +0xA39C 0xC9D2 #HANGUL SYLLABLE CIEUC I PIEUPSIOS +0xA39D 0xC9D4 #HANGUL SYLLABLE CIEUC I SSANGSIOS +0xA39E 0xC9D7 #HANGUL SYLLABLE CIEUC I CHIEUCH +0xA39F 0xC9D8 #HANGUL SYLLABLE CIEUC I KHIEUKH +0xA3A0 0xC9DB #HANGUL SYLLABLE CIEUC I HIEUH +0xA3A1 0xFF01 #FULLWIDTH EXCLAMATION MARK +0xA3A2 0xFF02 #FULLWIDTH QUOTATION MARK +0xA3A3 0xFF03 #FULLWIDTH NUMBER SIGN +0xA3A4 0xFF04 #FULLWIDTH DOLLAR SIGN +0xA3A5 0xFF05 #FULLWIDTH PERCENT SIGN +0xA3A6 0xFF06 #FULLWIDTH AMPERSAND +0xA3A7 0xFF07 #FULLWIDTH APOSTROPHE +0xA3A8 0xFF08 #FULLWIDTH LEFT PARENTHESIS +0xA3A9 0xFF09 #FULLWIDTH RIGHT PARENTHESIS +0xA3AA 0xFF0A #FULLWIDTH ASTERISK +0xA3AB 0xFF0B #FULLWIDTH PLUS SIGN +0xA3AC 0xFF0C #FULLWIDTH COMMA +0xA3AD 0xFF0D #FULLWIDTH HYPHEN-MINUS +0xA3AE 0xFF0E #FULLWIDTH FULL STOP +0xA3AF 0xFF0F #FULLWIDTH SOLIDUS +0xA3B0 0xFF10 #FULLWIDTH DIGIT ZERO +0xA3B1 0xFF11 #FULLWIDTH DIGIT ONE +0xA3B2 0xFF12 #FULLWIDTH DIGIT TWO +0xA3B3 0xFF13 #FULLWIDTH DIGIT THREE +0xA3B4 0xFF14 #FULLWIDTH DIGIT FOUR +0xA3B5 0xFF15 #FULLWIDTH DIGIT FIVE +0xA3B6 0xFF16 #FULLWIDTH DIGIT SIX +0xA3B7 0xFF17 #FULLWIDTH DIGIT SEVEN +0xA3B8 0xFF18 #FULLWIDTH DIGIT EIGHT +0xA3B9 0xFF19 #FULLWIDTH DIGIT NINE +0xA3BA 0xFF1A #FULLWIDTH COLON +0xA3BB 0xFF1B #FULLWIDTH SEMICOLON +0xA3BC 0xFF1C #FULLWIDTH LESS-THAN SIGN +0xA3BD 0xFF1D #FULLWIDTH EQUALS SIGN +0xA3BE 0xFF1E #FULLWIDTH GREATER-THAN SIGN +0xA3BF 0xFF1F #FULLWIDTH QUESTION MARK +0xA3C0 0xFF20 #FULLWIDTH COMMERCIAL AT +0xA3C1 0xFF21 #FULLWIDTH LATIN CAPITAL LETTER A +0xA3C2 0xFF22 #FULLWIDTH LATIN CAPITAL LETTER B +0xA3C3 0xFF23 #FULLWIDTH LATIN CAPITAL LETTER C +0xA3C4 0xFF24 #FULLWIDTH LATIN CAPITAL LETTER D +0xA3C5 0xFF25 #FULLWIDTH LATIN CAPITAL LETTER E +0xA3C6 0xFF26 #FULLWIDTH LATIN CAPITAL LETTER F +0xA3C7 0xFF27 #FULLWIDTH LATIN CAPITAL LETTER G +0xA3C8 0xFF28 #FULLWIDTH LATIN CAPITAL LETTER H +0xA3C9 0xFF29 #FULLWIDTH LATIN CAPITAL LETTER I +0xA3CA 0xFF2A #FULLWIDTH LATIN CAPITAL LETTER J +0xA3CB 0xFF2B #FULLWIDTH LATIN CAPITAL LETTER K +0xA3CC 0xFF2C #FULLWIDTH LATIN CAPITAL LETTER L +0xA3CD 0xFF2D #FULLWIDTH LATIN CAPITAL LETTER M +0xA3CE 0xFF2E #FULLWIDTH LATIN CAPITAL LETTER N +0xA3CF 0xFF2F #FULLWIDTH LATIN CAPITAL LETTER O +0xA3D0 0xFF30 #FULLWIDTH LATIN CAPITAL LETTER P +0xA3D1 0xFF31 #FULLWIDTH LATIN CAPITAL LETTER Q +0xA3D2 0xFF32 #FULLWIDTH LATIN CAPITAL LETTER R +0xA3D3 0xFF33 #FULLWIDTH LATIN CAPITAL LETTER S +0xA3D4 0xFF34 #FULLWIDTH LATIN CAPITAL LETTER T +0xA3D5 0xFF35 #FULLWIDTH LATIN CAPITAL LETTER U +0xA3D6 0xFF36 #FULLWIDTH LATIN CAPITAL LETTER V +0xA3D7 0xFF37 #FULLWIDTH LATIN CAPITAL LETTER W +0xA3D8 0xFF38 #FULLWIDTH LATIN CAPITAL LETTER X +0xA3D9 0xFF39 #FULLWIDTH LATIN CAPITAL LETTER Y +0xA3DA 0xFF3A #FULLWIDTH LATIN CAPITAL LETTER Z +0xA3DB 0xFF3B #FULLWIDTH LEFT SQUARE BRACKET +0xA3DC 0xFFE6 #FULLWIDTH WON SIGN +0xA3DD 0xFF3D #FULLWIDTH RIGHT SQUARE BRACKET +0xA3DE 0xFF3E #FULLWIDTH CIRCUMFLEX ACCENT +0xA3DF 0xFF3F #FULLWIDTH LOW LINE +0xA3E0 0xFF40 #FULLWIDTH GRAVE ACCENT +0xA3E1 0xFF41 #FULLWIDTH LATIN SMALL LETTER A +0xA3E2 0xFF42 #FULLWIDTH LATIN SMALL LETTER B +0xA3E3 0xFF43 #FULLWIDTH LATIN SMALL LETTER C +0xA3E4 0xFF44 #FULLWIDTH LATIN SMALL LETTER D +0xA3E5 0xFF45 #FULLWIDTH LATIN SMALL LETTER E +0xA3E6 0xFF46 #FULLWIDTH LATIN SMALL LETTER F +0xA3E7 0xFF47 #FULLWIDTH LATIN SMALL LETTER G +0xA3E8 0xFF48 #FULLWIDTH LATIN SMALL LETTER H +0xA3E9 0xFF49 #FULLWIDTH LATIN SMALL LETTER I +0xA3EA 0xFF4A #FULLWIDTH LATIN SMALL LETTER J +0xA3EB 0xFF4B #FULLWIDTH LATIN SMALL LETTER K +0xA3EC 0xFF4C #FULLWIDTH LATIN SMALL LETTER L +0xA3ED 0xFF4D #FULLWIDTH LATIN SMALL LETTER M +0xA3EE 0xFF4E #FULLWIDTH LATIN SMALL LETTER N +0xA3EF 0xFF4F #FULLWIDTH LATIN SMALL LETTER O +0xA3F0 0xFF50 #FULLWIDTH LATIN SMALL LETTER P +0xA3F1 0xFF51 #FULLWIDTH LATIN SMALL LETTER Q +0xA3F2 0xFF52 #FULLWIDTH LATIN SMALL LETTER R +0xA3F3 0xFF53 #FULLWIDTH LATIN SMALL LETTER S +0xA3F4 0xFF54 #FULLWIDTH LATIN SMALL LETTER T +0xA3F5 0xFF55 #FULLWIDTH LATIN SMALL LETTER U +0xA3F6 0xFF56 #FULLWIDTH LATIN SMALL LETTER V +0xA3F7 0xFF57 #FULLWIDTH LATIN SMALL LETTER W +0xA3F8 0xFF58 #FULLWIDTH LATIN SMALL LETTER X +0xA3F9 0xFF59 #FULLWIDTH LATIN SMALL LETTER Y +0xA3FA 0xFF5A #FULLWIDTH LATIN SMALL LETTER Z +0xA3FB 0xFF5B #FULLWIDTH LEFT CURLY BRACKET +0xA3FC 0xFF5C #FULLWIDTH VERTICAL LINE +0xA3FD 0xFF5D #FULLWIDTH RIGHT CURLY BRACKET +0xA3FE 0xFFE3 #FULLWIDTH MACRON +0xA441 0xC9DE #HANGUL SYLLABLE SSANGCIEUC A SSANGKIYEOK +0xA442 0xC9DF #HANGUL SYLLABLE SSANGCIEUC A KIYEOKSIOS +0xA443 0xC9E1 #HANGUL SYLLABLE SSANGCIEUC A NIEUNCIEUC +0xA444 0xC9E3 #HANGUL SYLLABLE SSANGCIEUC A TIKEUT +0xA445 0xC9E5 #HANGUL SYLLABLE SSANGCIEUC A RIEULKIYEOK +0xA446 0xC9E6 #HANGUL SYLLABLE SSANGCIEUC A RIEULMIEUM +0xA447 0xC9E8 #HANGUL SYLLABLE SSANGCIEUC A RIEULSIOS +0xA448 0xC9E9 #HANGUL SYLLABLE SSANGCIEUC A RIEULTHIEUTH +0xA449 0xC9EA #HANGUL SYLLABLE SSANGCIEUC A RIEULPHIEUPH +0xA44A 0xC9EB #HANGUL SYLLABLE SSANGCIEUC A RIEULHIEUH +0xA44B 0xC9EE #HANGUL SYLLABLE SSANGCIEUC A PIEUPSIOS +0xA44C 0xC9F2 #HANGUL SYLLABLE SSANGCIEUC A CIEUC +0xA44D 0xC9F3 #HANGUL SYLLABLE SSANGCIEUC A CHIEUCH +0xA44E 0xC9F4 #HANGUL SYLLABLE SSANGCIEUC A KHIEUKH +0xA44F 0xC9F5 #HANGUL SYLLABLE SSANGCIEUC A THIEUTH +0xA450 0xC9F6 #HANGUL SYLLABLE SSANGCIEUC A PHIEUPH +0xA451 0xC9F7 #HANGUL SYLLABLE SSANGCIEUC A HIEUH +0xA452 0xC9FA #HANGUL SYLLABLE SSANGCIEUC AE SSANGKIYEOK +0xA453 0xC9FB #HANGUL SYLLABLE SSANGCIEUC AE KIYEOKSIOS +0xA454 0xC9FD #HANGUL SYLLABLE SSANGCIEUC AE NIEUNCIEUC +0xA455 0xC9FE #HANGUL SYLLABLE SSANGCIEUC AE NIEUNHIEUH +0xA456 0xC9FF #HANGUL SYLLABLE SSANGCIEUC AE TIKEUT +0xA457 0xCA01 #HANGUL SYLLABLE SSANGCIEUC AE RIEULKIYEOK +0xA458 0xCA02 #HANGUL SYLLABLE SSANGCIEUC AE RIEULMIEUM +0xA459 0xCA03 #HANGUL SYLLABLE SSANGCIEUC AE RIEULPIEUP +0xA45A 0xCA04 #HANGUL SYLLABLE SSANGCIEUC AE RIEULSIOS +0xA461 0xCA05 #HANGUL SYLLABLE SSANGCIEUC AE RIEULTHIEUTH +0xA462 0xCA06 #HANGUL SYLLABLE SSANGCIEUC AE RIEULPHIEUPH +0xA463 0xCA07 #HANGUL SYLLABLE SSANGCIEUC AE RIEULHIEUH +0xA464 0xCA0A #HANGUL SYLLABLE SSANGCIEUC AE PIEUPSIOS +0xA465 0xCA0E #HANGUL SYLLABLE SSANGCIEUC AE CIEUC +0xA466 0xCA0F #HANGUL SYLLABLE SSANGCIEUC AE CHIEUCH +0xA467 0xCA10 #HANGUL SYLLABLE SSANGCIEUC AE KHIEUKH +0xA468 0xCA11 #HANGUL SYLLABLE SSANGCIEUC AE THIEUTH +0xA469 0xCA12 #HANGUL SYLLABLE SSANGCIEUC AE PHIEUPH +0xA46A 0xCA13 #HANGUL SYLLABLE SSANGCIEUC AE HIEUH +0xA46B 0xCA15 #HANGUL SYLLABLE SSANGCIEUC YA KIYEOK +0xA46C 0xCA16 #HANGUL SYLLABLE SSANGCIEUC YA SSANGKIYEOK +0xA46D 0xCA17 #HANGUL SYLLABLE SSANGCIEUC YA KIYEOKSIOS +0xA46E 0xCA19 #HANGUL SYLLABLE SSANGCIEUC YA NIEUNCIEUC +0xA46F 0xCA1A #HANGUL SYLLABLE SSANGCIEUC YA NIEUNHIEUH +0xA470 0xCA1B #HANGUL SYLLABLE SSANGCIEUC YA TIKEUT +0xA471 0xCA1C #HANGUL SYLLABLE SSANGCIEUC YA RIEUL +0xA472 0xCA1D #HANGUL SYLLABLE SSANGCIEUC YA RIEULKIYEOK +0xA473 0xCA1E #HANGUL SYLLABLE SSANGCIEUC YA RIEULMIEUM +0xA474 0xCA1F #HANGUL SYLLABLE SSANGCIEUC YA RIEULPIEUP +0xA475 0xCA20 #HANGUL SYLLABLE SSANGCIEUC YA RIEULSIOS +0xA476 0xCA21 #HANGUL SYLLABLE SSANGCIEUC YA RIEULTHIEUTH +0xA477 0xCA22 #HANGUL SYLLABLE SSANGCIEUC YA RIEULPHIEUPH +0xA478 0xCA23 #HANGUL SYLLABLE SSANGCIEUC YA RIEULHIEUH +0xA479 0xCA24 #HANGUL SYLLABLE SSANGCIEUC YA MIEUM +0xA47A 0xCA25 #HANGUL SYLLABLE SSANGCIEUC YA PIEUP +0xA481 0xCA26 #HANGUL SYLLABLE SSANGCIEUC YA PIEUPSIOS +0xA482 0xCA27 #HANGUL SYLLABLE SSANGCIEUC YA SIOS +0xA483 0xCA28 #HANGUL SYLLABLE SSANGCIEUC YA SSANGSIOS +0xA484 0xCA2A #HANGUL SYLLABLE SSANGCIEUC YA CIEUC +0xA485 0xCA2B #HANGUL SYLLABLE SSANGCIEUC YA CHIEUCH +0xA486 0xCA2C #HANGUL SYLLABLE SSANGCIEUC YA KHIEUKH +0xA487 0xCA2D #HANGUL SYLLABLE SSANGCIEUC YA THIEUTH +0xA488 0xCA2E #HANGUL SYLLABLE SSANGCIEUC YA PHIEUPH +0xA489 0xCA2F #HANGUL SYLLABLE SSANGCIEUC YA HIEUH +0xA48A 0xCA30 #HANGUL SYLLABLE SSANGCIEUC YAE +0xA48B 0xCA31 #HANGUL SYLLABLE SSANGCIEUC YAE KIYEOK +0xA48C 0xCA32 #HANGUL SYLLABLE SSANGCIEUC YAE SSANGKIYEOK +0xA48D 0xCA33 #HANGUL SYLLABLE SSANGCIEUC YAE KIYEOKSIOS +0xA48E 0xCA34 #HANGUL SYLLABLE SSANGCIEUC YAE NIEUN +0xA48F 0xCA35 #HANGUL SYLLABLE SSANGCIEUC YAE NIEUNCIEUC +0xA490 0xCA36 #HANGUL SYLLABLE SSANGCIEUC YAE NIEUNHIEUH +0xA491 0xCA37 #HANGUL SYLLABLE SSANGCIEUC YAE TIKEUT +0xA492 0xCA38 #HANGUL SYLLABLE SSANGCIEUC YAE RIEUL +0xA493 0xCA39 #HANGUL SYLLABLE SSANGCIEUC YAE RIEULKIYEOK +0xA494 0xCA3A #HANGUL SYLLABLE SSANGCIEUC YAE RIEULMIEUM +0xA495 0xCA3B #HANGUL SYLLABLE SSANGCIEUC YAE RIEULPIEUP +0xA496 0xCA3C #HANGUL SYLLABLE SSANGCIEUC YAE RIEULSIOS +0xA497 0xCA3D #HANGUL SYLLABLE SSANGCIEUC YAE RIEULTHIEUTH +0xA498 0xCA3E #HANGUL SYLLABLE SSANGCIEUC YAE RIEULPHIEUPH +0xA499 0xCA3F #HANGUL SYLLABLE SSANGCIEUC YAE RIEULHIEUH +0xA49A 0xCA40 #HANGUL SYLLABLE SSANGCIEUC YAE MIEUM +0xA49B 0xCA41 #HANGUL SYLLABLE SSANGCIEUC YAE PIEUP +0xA49C 0xCA42 #HANGUL SYLLABLE SSANGCIEUC YAE PIEUPSIOS +0xA49D 0xCA43 #HANGUL SYLLABLE SSANGCIEUC YAE SIOS +0xA49E 0xCA44 #HANGUL SYLLABLE SSANGCIEUC YAE SSANGSIOS +0xA49F 0xCA45 #HANGUL SYLLABLE SSANGCIEUC YAE IEUNG +0xA4A0 0xCA46 #HANGUL SYLLABLE SSANGCIEUC YAE CIEUC +0xA4A1 0x3131 #HANGUL LETTER KIYEOK +0xA4A2 0x3132 #HANGUL LETTER SSANGKIYEOK +0xA4A3 0x3133 #HANGUL LETTER KIYEOK-SIOS +0xA4A4 0x3134 #HANGUL LETTER NIEUN +0xA4A5 0x3135 #HANGUL LETTER NIEUN-CIEUC +0xA4A6 0x3136 #HANGUL LETTER NIEUN-HIEUH +0xA4A7 0x3137 #HANGUL LETTER TIKEUT +0xA4A8 0x3138 #HANGUL LETTER SSANGTIKEUT +0xA4A9 0x3139 #HANGUL LETTER RIEUL +0xA4AA 0x313A #HANGUL LETTER RIEUL-KIYEOK +0xA4AB 0x313B #HANGUL LETTER RIEUL-MIEUM +0xA4AC 0x313C #HANGUL LETTER RIEUL-PIEUP +0xA4AD 0x313D #HANGUL LETTER RIEUL-SIOS +0xA4AE 0x313E #HANGUL LETTER RIEUL-THIEUTH +0xA4AF 0x313F #HANGUL LETTER RIEUL-PHIEUPH +0xA4B0 0x3140 #HANGUL LETTER RIEUL-HIEUH +0xA4B1 0x3141 #HANGUL LETTER MIEUM +0xA4B2 0x3142 #HANGUL LETTER PIEUP +0xA4B3 0x3143 #HANGUL LETTER SSANGPIEUP +0xA4B4 0x3144 #HANGUL LETTER PIEUP-SIOS +0xA4B5 0x3145 #HANGUL LETTER SIOS +0xA4B6 0x3146 #HANGUL LETTER SSANGSIOS +0xA4B7 0x3147 #HANGUL LETTER IEUNG +0xA4B8 0x3148 #HANGUL LETTER CIEUC +0xA4B9 0x3149 #HANGUL LETTER SSANGCIEUC +0xA4BA 0x314A #HANGUL LETTER CHIEUCH +0xA4BB 0x314B #HANGUL LETTER KHIEUKH +0xA4BC 0x314C #HANGUL LETTER THIEUTH +0xA4BD 0x314D #HANGUL LETTER PHIEUPH +0xA4BE 0x314E #HANGUL LETTER HIEUH +0xA4BF 0x314F #HANGUL LETTER A +0xA4C0 0x3150 #HANGUL LETTER AE +0xA4C1 0x3151 #HANGUL LETTER YA +0xA4C2 0x3152 #HANGUL LETTER YAE +0xA4C3 0x3153 #HANGUL LETTER EO +0xA4C4 0x3154 #HANGUL LETTER E +0xA4C5 0x3155 #HANGUL LETTER YEO +0xA4C6 0x3156 #HANGUL LETTER YE +0xA4C7 0x3157 #HANGUL LETTER O +0xA4C8 0x3158 #HANGUL LETTER WA +0xA4C9 0x3159 #HANGUL LETTER WAE +0xA4CA 0x315A #HANGUL LETTER OE +0xA4CB 0x315B #HANGUL LETTER YO +0xA4CC 0x315C #HANGUL LETTER U +0xA4CD 0x315D #HANGUL LETTER WEO +0xA4CE 0x315E #HANGUL LETTER WE +0xA4CF 0x315F #HANGUL LETTER WI +0xA4D0 0x3160 #HANGUL LETTER YU +0xA4D1 0x3161 #HANGUL LETTER EU +0xA4D2 0x3162 #HANGUL LETTER YI +0xA4D3 0x3163 #HANGUL LETTER I +0xA4D4 0x3164 #HANGUL FILLER +0xA4D5 0x3165 #HANGUL LETTER SSANGNIEUN +0xA4D6 0x3166 #HANGUL LETTER NIEUN-TIKEUT +0xA4D7 0x3167 #HANGUL LETTER NIEUN-SIOS +0xA4D8 0x3168 #HANGUL LETTER NIEUN-PANSIOS +0xA4D9 0x3169 #HANGUL LETTER RIEUL-KIYEOK-SIOS +0xA4DA 0x316A #HANGUL LETTER RIEUL-TIKEUT +0xA4DB 0x316B #HANGUL LETTER RIEUL-PIEUP-SIOS +0xA4DC 0x316C #HANGUL LETTER RIEUL-PANSIOS +0xA4DD 0x316D #HANGUL LETTER RIEUL-YEORINHIEUH +0xA4DE 0x316E #HANGUL LETTER MIEUM-PIEUP +0xA4DF 0x316F #HANGUL LETTER MIEUM-SIOS +0xA4E0 0x3170 #HANGUL LETTER MIEUM-PANSIOS +0xA4E1 0x3171 #HANGUL LETTER KAPYEOUNMIEUM +0xA4E2 0x3172 #HANGUL LETTER PIEUP-KIYEOK +0xA4E3 0x3173 #HANGUL LETTER PIEUP-TIKEUT +0xA4E4 0x3174 #HANGUL LETTER PIEUP-SIOS-KIYEOK +0xA4E5 0x3175 #HANGUL LETTER PIEUP-SIOS-TIKEUT +0xA4E6 0x3176 #HANGUL LETTER PIEUP-CIEUC +0xA4E7 0x3177 #HANGUL LETTER PIEUP-THIEUTH +0xA4E8 0x3178 #HANGUL LETTER KAPYEOUNPIEUP +0xA4E9 0x3179 #HANGUL LETTER KAPYEOUNSSANGPIEUP +0xA4EA 0x317A #HANGUL LETTER SIOS-KIYEOK +0xA4EB 0x317B #HANGUL LETTER SIOS-NIEUN +0xA4EC 0x317C #HANGUL LETTER SIOS-TIKEUT +0xA4ED 0x317D #HANGUL LETTER SIOS-PIEUP +0xA4EE 0x317E #HANGUL LETTER SIOS-CIEUC +0xA4EF 0x317F #HANGUL LETTER PANSIOS +0xA4F0 0x3180 #HANGUL LETTER SSANGIEUNG +0xA4F1 0x3181 #HANGUL LETTER YESIEUNG +0xA4F2 0x3182 #HANGUL LETTER YESIEUNG-SIOS +0xA4F3 0x3183 #HANGUL LETTER YESIEUNG-PANSIOS +0xA4F4 0x3184 #HANGUL LETTER KAPYEOUNPHIEUPH +0xA4F5 0x3185 #HANGUL LETTER SSANGHIEUH +0xA4F6 0x3186 #HANGUL LETTER YEORINHIEUH +0xA4F7 0x3187 #HANGUL LETTER YO-YA +0xA4F8 0x3188 #HANGUL LETTER YO-YAE +0xA4F9 0x3189 #HANGUL LETTER YO-I +0xA4FA 0x318A #HANGUL LETTER YU-YEO +0xA4FB 0x318B #HANGUL LETTER YU-YE +0xA4FC 0x318C #HANGUL LETTER YU-I +0xA4FD 0x318D #HANGUL LETTER ARAEA +0xA4FE 0x318E #HANGUL LETTER ARAEAE +0xA541 0xCA47 #HANGUL SYLLABLE SSANGCIEUC YAE CHIEUCH +0xA542 0xCA48 #HANGUL SYLLABLE SSANGCIEUC YAE KHIEUKH +0xA543 0xCA49 #HANGUL SYLLABLE SSANGCIEUC YAE THIEUTH +0xA544 0xCA4A #HANGUL SYLLABLE SSANGCIEUC YAE PHIEUPH +0xA545 0xCA4B #HANGUL SYLLABLE SSANGCIEUC YAE HIEUH +0xA546 0xCA4E #HANGUL SYLLABLE SSANGCIEUC EO SSANGKIYEOK +0xA547 0xCA4F #HANGUL SYLLABLE SSANGCIEUC EO KIYEOKSIOS +0xA548 0xCA51 #HANGUL SYLLABLE SSANGCIEUC EO NIEUNCIEUC +0xA549 0xCA52 #HANGUL SYLLABLE SSANGCIEUC EO NIEUNHIEUH +0xA54A 0xCA53 #HANGUL SYLLABLE SSANGCIEUC EO TIKEUT +0xA54B 0xCA55 #HANGUL SYLLABLE SSANGCIEUC EO RIEULKIYEOK +0xA54C 0xCA56 #HANGUL SYLLABLE SSANGCIEUC EO RIEULMIEUM +0xA54D 0xCA57 #HANGUL SYLLABLE SSANGCIEUC EO RIEULPIEUP +0xA54E 0xCA58 #HANGUL SYLLABLE SSANGCIEUC EO RIEULSIOS +0xA54F 0xCA59 #HANGUL SYLLABLE SSANGCIEUC EO RIEULTHIEUTH +0xA550 0xCA5A #HANGUL SYLLABLE SSANGCIEUC EO RIEULPHIEUPH +0xA551 0xCA5B #HANGUL SYLLABLE SSANGCIEUC EO RIEULHIEUH +0xA552 0xCA5E #HANGUL SYLLABLE SSANGCIEUC EO PIEUPSIOS +0xA553 0xCA62 #HANGUL SYLLABLE SSANGCIEUC EO CIEUC +0xA554 0xCA63 #HANGUL SYLLABLE SSANGCIEUC EO CHIEUCH +0xA555 0xCA64 #HANGUL SYLLABLE SSANGCIEUC EO KHIEUKH +0xA556 0xCA65 #HANGUL SYLLABLE SSANGCIEUC EO THIEUTH +0xA557 0xCA66 #HANGUL SYLLABLE SSANGCIEUC EO PHIEUPH +0xA558 0xCA67 #HANGUL SYLLABLE SSANGCIEUC EO HIEUH +0xA559 0xCA69 #HANGUL SYLLABLE SSANGCIEUC E KIYEOK +0xA55A 0xCA6A #HANGUL SYLLABLE SSANGCIEUC E SSANGKIYEOK +0xA561 0xCA6B #HANGUL SYLLABLE SSANGCIEUC E KIYEOKSIOS +0xA562 0xCA6C #HANGUL SYLLABLE SSANGCIEUC E NIEUN +0xA563 0xCA6D #HANGUL SYLLABLE SSANGCIEUC E NIEUNCIEUC +0xA564 0xCA6E #HANGUL SYLLABLE SSANGCIEUC E NIEUNHIEUH +0xA565 0xCA6F #HANGUL SYLLABLE SSANGCIEUC E TIKEUT +0xA566 0xCA70 #HANGUL SYLLABLE SSANGCIEUC E RIEUL +0xA567 0xCA71 #HANGUL SYLLABLE SSANGCIEUC E RIEULKIYEOK +0xA568 0xCA72 #HANGUL SYLLABLE SSANGCIEUC E RIEULMIEUM +0xA569 0xCA73 #HANGUL SYLLABLE SSANGCIEUC E RIEULPIEUP +0xA56A 0xCA74 #HANGUL SYLLABLE SSANGCIEUC E RIEULSIOS +0xA56B 0xCA75 #HANGUL SYLLABLE SSANGCIEUC E RIEULTHIEUTH +0xA56C 0xCA76 #HANGUL SYLLABLE SSANGCIEUC E RIEULPHIEUPH +0xA56D 0xCA77 #HANGUL SYLLABLE SSANGCIEUC E RIEULHIEUH +0xA56E 0xCA78 #HANGUL SYLLABLE SSANGCIEUC E MIEUM +0xA56F 0xCA79 #HANGUL SYLLABLE SSANGCIEUC E PIEUP +0xA570 0xCA7A #HANGUL SYLLABLE SSANGCIEUC E PIEUPSIOS +0xA571 0xCA7B #HANGUL SYLLABLE SSANGCIEUC E SIOS +0xA572 0xCA7C #HANGUL SYLLABLE SSANGCIEUC E SSANGSIOS +0xA573 0xCA7E #HANGUL SYLLABLE SSANGCIEUC E CIEUC +0xA574 0xCA7F #HANGUL SYLLABLE SSANGCIEUC E CHIEUCH +0xA575 0xCA80 #HANGUL SYLLABLE SSANGCIEUC E KHIEUKH +0xA576 0xCA81 #HANGUL SYLLABLE SSANGCIEUC E THIEUTH +0xA577 0xCA82 #HANGUL SYLLABLE SSANGCIEUC E PHIEUPH +0xA578 0xCA83 #HANGUL SYLLABLE SSANGCIEUC E HIEUH +0xA579 0xCA85 #HANGUL SYLLABLE SSANGCIEUC YEO KIYEOK +0xA57A 0xCA86 #HANGUL SYLLABLE SSANGCIEUC YEO SSANGKIYEOK +0xA581 0xCA87 #HANGUL SYLLABLE SSANGCIEUC YEO KIYEOKSIOS +0xA582 0xCA88 #HANGUL SYLLABLE SSANGCIEUC YEO NIEUN +0xA583 0xCA89 #HANGUL SYLLABLE SSANGCIEUC YEO NIEUNCIEUC +0xA584 0xCA8A #HANGUL SYLLABLE SSANGCIEUC YEO NIEUNHIEUH +0xA585 0xCA8B #HANGUL SYLLABLE SSANGCIEUC YEO TIKEUT +0xA586 0xCA8C #HANGUL SYLLABLE SSANGCIEUC YEO RIEUL +0xA587 0xCA8D #HANGUL SYLLABLE SSANGCIEUC YEO RIEULKIYEOK +0xA588 0xCA8E #HANGUL SYLLABLE SSANGCIEUC YEO RIEULMIEUM +0xA589 0xCA8F #HANGUL SYLLABLE SSANGCIEUC YEO RIEULPIEUP +0xA58A 0xCA90 #HANGUL SYLLABLE SSANGCIEUC YEO RIEULSIOS +0xA58B 0xCA91 #HANGUL SYLLABLE SSANGCIEUC YEO RIEULTHIEUTH +0xA58C 0xCA92 #HANGUL SYLLABLE SSANGCIEUC YEO RIEULPHIEUPH +0xA58D 0xCA93 #HANGUL SYLLABLE SSANGCIEUC YEO RIEULHIEUH +0xA58E 0xCA94 #HANGUL SYLLABLE SSANGCIEUC YEO MIEUM +0xA58F 0xCA95 #HANGUL SYLLABLE SSANGCIEUC YEO PIEUP +0xA590 0xCA96 #HANGUL SYLLABLE SSANGCIEUC YEO PIEUPSIOS +0xA591 0xCA97 #HANGUL SYLLABLE SSANGCIEUC YEO SIOS +0xA592 0xCA99 #HANGUL SYLLABLE SSANGCIEUC YEO IEUNG +0xA593 0xCA9A #HANGUL SYLLABLE SSANGCIEUC YEO CIEUC +0xA594 0xCA9B #HANGUL SYLLABLE SSANGCIEUC YEO CHIEUCH +0xA595 0xCA9C #HANGUL SYLLABLE SSANGCIEUC YEO KHIEUKH +0xA596 0xCA9D #HANGUL SYLLABLE SSANGCIEUC YEO THIEUTH +0xA597 0xCA9E #HANGUL SYLLABLE SSANGCIEUC YEO PHIEUPH +0xA598 0xCA9F #HANGUL SYLLABLE SSANGCIEUC YEO HIEUH +0xA599 0xCAA0 #HANGUL SYLLABLE SSANGCIEUC YE +0xA59A 0xCAA1 #HANGUL SYLLABLE SSANGCIEUC YE KIYEOK +0xA59B 0xCAA2 #HANGUL SYLLABLE SSANGCIEUC YE SSANGKIYEOK +0xA59C 0xCAA3 #HANGUL SYLLABLE SSANGCIEUC YE KIYEOKSIOS +0xA59D 0xCAA4 #HANGUL SYLLABLE SSANGCIEUC YE NIEUN +0xA59E 0xCAA5 #HANGUL SYLLABLE SSANGCIEUC YE NIEUNCIEUC +0xA59F 0xCAA6 #HANGUL SYLLABLE SSANGCIEUC YE NIEUNHIEUH +0xA5A0 0xCAA7 #HANGUL SYLLABLE SSANGCIEUC YE TIKEUT +0xA5A1 0x2170 #SMALL ROMAN NUMERAL ONE +0xA5A2 0x2171 #SMALL ROMAN NUMERAL TWO +0xA5A3 0x2172 #SMALL ROMAN NUMERAL THREE +0xA5A4 0x2173 #SMALL ROMAN NUMERAL FOUR +0xA5A5 0x2174 #SMALL ROMAN NUMERAL FIVE +0xA5A6 0x2175 #SMALL ROMAN NUMERAL SIX +0xA5A7 0x2176 #SMALL ROMAN NUMERAL SEVEN +0xA5A8 0x2177 #SMALL ROMAN NUMERAL EIGHT +0xA5A9 0x2178 #SMALL ROMAN NUMERAL NINE +0xA5AA 0x2179 #SMALL ROMAN NUMERAL TEN +0xA5B0 0x2160 #ROMAN NUMERAL ONE +0xA5B1 0x2161 #ROMAN NUMERAL TWO +0xA5B2 0x2162 #ROMAN NUMERAL THREE +0xA5B3 0x2163 #ROMAN NUMERAL FOUR +0xA5B4 0x2164 #ROMAN NUMERAL FIVE +0xA5B5 0x2165 #ROMAN NUMERAL SIX +0xA5B6 0x2166 #ROMAN NUMERAL SEVEN +0xA5B7 0x2167 #ROMAN NUMERAL EIGHT +0xA5B8 0x2168 #ROMAN NUMERAL NINE +0xA5B9 0x2169 #ROMAN NUMERAL TEN +0xA5C1 0x0391 #GREEK CAPITAL LETTER ALPHA +0xA5C2 0x0392 #GREEK CAPITAL LETTER BETA +0xA5C3 0x0393 #GREEK CAPITAL LETTER GAMMA +0xA5C4 0x0394 #GREEK CAPITAL LETTER DELTA +0xA5C5 0x0395 #GREEK CAPITAL LETTER EPSILON +0xA5C6 0x0396 #GREEK CAPITAL LETTER ZETA +0xA5C7 0x0397 #GREEK CAPITAL LETTER ETA +0xA5C8 0x0398 #GREEK CAPITAL LETTER THETA +0xA5C9 0x0399 #GREEK CAPITAL LETTER IOTA +0xA5CA 0x039A #GREEK CAPITAL LETTER KAPPA +0xA5CB 0x039B #GREEK CAPITAL LETTER LAMDA +0xA5CC 0x039C #GREEK CAPITAL LETTER MU +0xA5CD 0x039D #GREEK CAPITAL LETTER NU +0xA5CE 0x039E #GREEK CAPITAL LETTER XI +0xA5CF 0x039F #GREEK CAPITAL LETTER OMICRON +0xA5D0 0x03A0 #GREEK CAPITAL LETTER PI +0xA5D1 0x03A1 #GREEK CAPITAL LETTER RHO +0xA5D2 0x03A3 #GREEK CAPITAL LETTER SIGMA +0xA5D3 0x03A4 #GREEK CAPITAL LETTER TAU +0xA5D4 0x03A5 #GREEK CAPITAL LETTER UPSILON +0xA5D5 0x03A6 #GREEK CAPITAL LETTER PHI +0xA5D6 0x03A7 #GREEK CAPITAL LETTER CHI +0xA5D7 0x03A8 #GREEK CAPITAL LETTER PSI +0xA5D8 0x03A9 #GREEK CAPITAL LETTER OMEGA +0xA5E1 0x03B1 #GREEK SMALL LETTER ALPHA +0xA5E2 0x03B2 #GREEK SMALL LETTER BETA +0xA5E3 0x03B3 #GREEK SMALL LETTER GAMMA +0xA5E4 0x03B4 #GREEK SMALL LETTER DELTA +0xA5E5 0x03B5 #GREEK SMALL LETTER EPSILON +0xA5E6 0x03B6 #GREEK SMALL LETTER ZETA +0xA5E7 0x03B7 #GREEK SMALL LETTER ETA +0xA5E8 0x03B8 #GREEK SMALL LETTER THETA +0xA5E9 0x03B9 #GREEK SMALL LETTER IOTA +0xA5EA 0x03BA #GREEK SMALL LETTER KAPPA +0xA5EB 0x03BB #GREEK SMALL LETTER LAMDA +0xA5EC 0x03BC #GREEK SMALL LETTER MU +0xA5ED 0x03BD #GREEK SMALL LETTER NU +0xA5EE 0x03BE #GREEK SMALL LETTER XI +0xA5EF 0x03BF #GREEK SMALL LETTER OMICRON +0xA5F0 0x03C0 #GREEK SMALL LETTER PI +0xA5F1 0x03C1 #GREEK SMALL LETTER RHO +0xA5F2 0x03C3 #GREEK SMALL LETTER SIGMA +0xA5F3 0x03C4 #GREEK SMALL LETTER TAU +0xA5F4 0x03C5 #GREEK SMALL LETTER UPSILON +0xA5F5 0x03C6 #GREEK SMALL LETTER PHI +0xA5F6 0x03C7 #GREEK SMALL LETTER CHI +0xA5F7 0x03C8 #GREEK SMALL LETTER PSI +0xA5F8 0x03C9 #GREEK SMALL LETTER OMEGA +0xA641 0xCAA8 #HANGUL SYLLABLE SSANGCIEUC YE RIEUL +0xA642 0xCAA9 #HANGUL SYLLABLE SSANGCIEUC YE RIEULKIYEOK +0xA643 0xCAAA #HANGUL SYLLABLE SSANGCIEUC YE RIEULMIEUM +0xA644 0xCAAB #HANGUL SYLLABLE SSANGCIEUC YE RIEULPIEUP +0xA645 0xCAAC #HANGUL SYLLABLE SSANGCIEUC YE RIEULSIOS +0xA646 0xCAAD #HANGUL SYLLABLE SSANGCIEUC YE RIEULTHIEUTH +0xA647 0xCAAE #HANGUL SYLLABLE SSANGCIEUC YE RIEULPHIEUPH +0xA648 0xCAAF #HANGUL SYLLABLE SSANGCIEUC YE RIEULHIEUH +0xA649 0xCAB0 #HANGUL SYLLABLE SSANGCIEUC YE MIEUM +0xA64A 0xCAB1 #HANGUL SYLLABLE SSANGCIEUC YE PIEUP +0xA64B 0xCAB2 #HANGUL SYLLABLE SSANGCIEUC YE PIEUPSIOS +0xA64C 0xCAB3 #HANGUL SYLLABLE SSANGCIEUC YE SIOS +0xA64D 0xCAB4 #HANGUL SYLLABLE SSANGCIEUC YE SSANGSIOS +0xA64E 0xCAB5 #HANGUL SYLLABLE SSANGCIEUC YE IEUNG +0xA64F 0xCAB6 #HANGUL SYLLABLE SSANGCIEUC YE CIEUC +0xA650 0xCAB7 #HANGUL SYLLABLE SSANGCIEUC YE CHIEUCH +0xA651 0xCAB8 #HANGUL SYLLABLE SSANGCIEUC YE KHIEUKH +0xA652 0xCAB9 #HANGUL SYLLABLE SSANGCIEUC YE THIEUTH +0xA653 0xCABA #HANGUL SYLLABLE SSANGCIEUC YE PHIEUPH +0xA654 0xCABB #HANGUL SYLLABLE SSANGCIEUC YE HIEUH +0xA655 0xCABE #HANGUL SYLLABLE SSANGCIEUC O SSANGKIYEOK +0xA656 0xCABF #HANGUL SYLLABLE SSANGCIEUC O KIYEOKSIOS +0xA657 0xCAC1 #HANGUL SYLLABLE SSANGCIEUC O NIEUNCIEUC +0xA658 0xCAC2 #HANGUL SYLLABLE SSANGCIEUC O NIEUNHIEUH +0xA659 0xCAC3 #HANGUL SYLLABLE SSANGCIEUC O TIKEUT +0xA65A 0xCAC5 #HANGUL SYLLABLE SSANGCIEUC O RIEULKIYEOK +0xA661 0xCAC6 #HANGUL SYLLABLE SSANGCIEUC O RIEULMIEUM +0xA662 0xCAC7 #HANGUL SYLLABLE SSANGCIEUC O RIEULPIEUP +0xA663 0xCAC8 #HANGUL SYLLABLE SSANGCIEUC O RIEULSIOS +0xA664 0xCAC9 #HANGUL SYLLABLE SSANGCIEUC O RIEULTHIEUTH +0xA665 0xCACA #HANGUL SYLLABLE SSANGCIEUC O RIEULPHIEUPH +0xA666 0xCACB #HANGUL SYLLABLE SSANGCIEUC O RIEULHIEUH +0xA667 0xCACE #HANGUL SYLLABLE SSANGCIEUC O PIEUPSIOS +0xA668 0xCAD0 #HANGUL SYLLABLE SSANGCIEUC O SSANGSIOS +0xA669 0xCAD2 #HANGUL SYLLABLE SSANGCIEUC O CIEUC +0xA66A 0xCAD4 #HANGUL SYLLABLE SSANGCIEUC O KHIEUKH +0xA66B 0xCAD5 #HANGUL SYLLABLE SSANGCIEUC O THIEUTH +0xA66C 0xCAD6 #HANGUL SYLLABLE SSANGCIEUC O PHIEUPH +0xA66D 0xCAD7 #HANGUL SYLLABLE SSANGCIEUC O HIEUH +0xA66E 0xCADA #HANGUL SYLLABLE SSANGCIEUC WA SSANGKIYEOK +0xA66F 0xCADB #HANGUL SYLLABLE SSANGCIEUC WA KIYEOKSIOS +0xA670 0xCADC #HANGUL SYLLABLE SSANGCIEUC WA NIEUN +0xA671 0xCADD #HANGUL SYLLABLE SSANGCIEUC WA NIEUNCIEUC +0xA672 0xCADE #HANGUL SYLLABLE SSANGCIEUC WA NIEUNHIEUH +0xA673 0xCADF #HANGUL SYLLABLE SSANGCIEUC WA TIKEUT +0xA674 0xCAE1 #HANGUL SYLLABLE SSANGCIEUC WA RIEULKIYEOK +0xA675 0xCAE2 #HANGUL SYLLABLE SSANGCIEUC WA RIEULMIEUM +0xA676 0xCAE3 #HANGUL SYLLABLE SSANGCIEUC WA RIEULPIEUP +0xA677 0xCAE4 #HANGUL SYLLABLE SSANGCIEUC WA RIEULSIOS +0xA678 0xCAE5 #HANGUL SYLLABLE SSANGCIEUC WA RIEULTHIEUTH +0xA679 0xCAE6 #HANGUL SYLLABLE SSANGCIEUC WA RIEULPHIEUPH +0xA67A 0xCAE7 #HANGUL SYLLABLE SSANGCIEUC WA RIEULHIEUH +0xA681 0xCAE8 #HANGUL SYLLABLE SSANGCIEUC WA MIEUM +0xA682 0xCAE9 #HANGUL SYLLABLE SSANGCIEUC WA PIEUP +0xA683 0xCAEA #HANGUL SYLLABLE SSANGCIEUC WA PIEUPSIOS +0xA684 0xCAEB #HANGUL SYLLABLE SSANGCIEUC WA SIOS +0xA685 0xCAED #HANGUL SYLLABLE SSANGCIEUC WA IEUNG +0xA686 0xCAEE #HANGUL SYLLABLE SSANGCIEUC WA CIEUC +0xA687 0xCAEF #HANGUL SYLLABLE SSANGCIEUC WA CHIEUCH +0xA688 0xCAF0 #HANGUL SYLLABLE SSANGCIEUC WA KHIEUKH +0xA689 0xCAF1 #HANGUL SYLLABLE SSANGCIEUC WA THIEUTH +0xA68A 0xCAF2 #HANGUL SYLLABLE SSANGCIEUC WA PHIEUPH +0xA68B 0xCAF3 #HANGUL SYLLABLE SSANGCIEUC WA HIEUH +0xA68C 0xCAF5 #HANGUL SYLLABLE SSANGCIEUC WAE KIYEOK +0xA68D 0xCAF6 #HANGUL SYLLABLE SSANGCIEUC WAE SSANGKIYEOK +0xA68E 0xCAF7 #HANGUL SYLLABLE SSANGCIEUC WAE KIYEOKSIOS +0xA68F 0xCAF8 #HANGUL SYLLABLE SSANGCIEUC WAE NIEUN +0xA690 0xCAF9 #HANGUL SYLLABLE SSANGCIEUC WAE NIEUNCIEUC +0xA691 0xCAFA #HANGUL SYLLABLE SSANGCIEUC WAE NIEUNHIEUH +0xA692 0xCAFB #HANGUL SYLLABLE SSANGCIEUC WAE TIKEUT +0xA693 0xCAFC #HANGUL SYLLABLE SSANGCIEUC WAE RIEUL +0xA694 0xCAFD #HANGUL SYLLABLE SSANGCIEUC WAE RIEULKIYEOK +0xA695 0xCAFE #HANGUL SYLLABLE SSANGCIEUC WAE RIEULMIEUM +0xA696 0xCAFF #HANGUL SYLLABLE SSANGCIEUC WAE RIEULPIEUP +0xA697 0xCB00 #HANGUL SYLLABLE SSANGCIEUC WAE RIEULSIOS +0xA698 0xCB01 #HANGUL SYLLABLE SSANGCIEUC WAE RIEULTHIEUTH +0xA699 0xCB02 #HANGUL SYLLABLE SSANGCIEUC WAE RIEULPHIEUPH +0xA69A 0xCB03 #HANGUL SYLLABLE SSANGCIEUC WAE RIEULHIEUH +0xA69B 0xCB04 #HANGUL SYLLABLE SSANGCIEUC WAE MIEUM +0xA69C 0xCB05 #HANGUL SYLLABLE SSANGCIEUC WAE PIEUP +0xA69D 0xCB06 #HANGUL SYLLABLE SSANGCIEUC WAE PIEUPSIOS +0xA69E 0xCB07 #HANGUL SYLLABLE SSANGCIEUC WAE SIOS +0xA69F 0xCB09 #HANGUL SYLLABLE SSANGCIEUC WAE IEUNG +0xA6A0 0xCB0A #HANGUL SYLLABLE SSANGCIEUC WAE CIEUC +0xA6A1 0x2500 #BOX DRAWINGS LIGHT HORIZONTAL +0xA6A2 0x2502 #BOX DRAWINGS LIGHT VERTICAL +0xA6A3 0x250C #BOX DRAWINGS LIGHT DOWN AND RIGHT +0xA6A4 0x2510 #BOX DRAWINGS LIGHT DOWN AND LEFT +0xA6A5 0x2518 #BOX DRAWINGS LIGHT UP AND LEFT +0xA6A6 0x2514 #BOX DRAWINGS LIGHT UP AND RIGHT +0xA6A7 0x251C #BOX DRAWINGS LIGHT VERTICAL AND RIGHT +0xA6A8 0x252C #BOX DRAWINGS LIGHT DOWN AND HORIZONTAL +0xA6A9 0x2524 #BOX DRAWINGS LIGHT VERTICAL AND LEFT +0xA6AA 0x2534 #BOX DRAWINGS LIGHT UP AND HORIZONTAL +0xA6AB 0x253C #BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL +0xA6AC 0x2501 #BOX DRAWINGS HEAVY HORIZONTAL +0xA6AD 0x2503 #BOX DRAWINGS HEAVY VERTICAL +0xA6AE 0x250F #BOX DRAWINGS HEAVY DOWN AND RIGHT +0xA6AF 0x2513 #BOX DRAWINGS HEAVY DOWN AND LEFT +0xA6B0 0x251B #BOX DRAWINGS HEAVY UP AND LEFT +0xA6B1 0x2517 #BOX DRAWINGS HEAVY UP AND RIGHT +0xA6B2 0x2523 #BOX DRAWINGS HEAVY VERTICAL AND RIGHT +0xA6B3 0x2533 #BOX DRAWINGS HEAVY DOWN AND HORIZONTAL +0xA6B4 0x252B #BOX DRAWINGS HEAVY VERTICAL AND LEFT +0xA6B5 0x253B #BOX DRAWINGS HEAVY UP AND HORIZONTAL +0xA6B6 0x254B #BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL +0xA6B7 0x2520 #BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT +0xA6B8 0x252F #BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY +0xA6B9 0x2528 #BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT +0xA6BA 0x2537 #BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY +0xA6BB 0x253F #BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY +0xA6BC 0x251D #BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY +0xA6BD 0x2530 #BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT +0xA6BE 0x2525 #BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY +0xA6BF 0x2538 #BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT +0xA6C0 0x2542 #BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT +0xA6C1 0x2512 #BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT +0xA6C2 0x2511 #BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY +0xA6C3 0x251A #BOX DRAWINGS UP HEAVY AND LEFT LIGHT +0xA6C4 0x2519 #BOX DRAWINGS UP LIGHT AND LEFT HEAVY +0xA6C5 0x2516 #BOX DRAWINGS UP HEAVY AND RIGHT LIGHT +0xA6C6 0x2515 #BOX DRAWINGS UP LIGHT AND RIGHT HEAVY +0xA6C7 0x250E #BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT +0xA6C8 0x250D #BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY +0xA6C9 0x251E #BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT +0xA6CA 0x251F #BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT +0xA6CB 0x2521 #BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY +0xA6CC 0x2522 #BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY +0xA6CD 0x2526 #BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT +0xA6CE 0x2527 #BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT +0xA6CF 0x2529 #BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY +0xA6D0 0x252A #BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY +0xA6D1 0x252D #BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT +0xA6D2 0x252E #BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT +0xA6D3 0x2531 #BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY +0xA6D4 0x2532 #BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY +0xA6D5 0x2535 #BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT +0xA6D6 0x2536 #BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT +0xA6D7 0x2539 #BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY +0xA6D8 0x253A #BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY +0xA6D9 0x253D #BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT +0xA6DA 0x253E #BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT +0xA6DB 0x2540 #BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT +0xA6DC 0x2541 #BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT +0xA6DD 0x2543 #BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT +0xA6DE 0x2544 #BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT +0xA6DF 0x2545 #BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT +0xA6E0 0x2546 #BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT +0xA6E1 0x2547 #BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY +0xA6E2 0x2548 #BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY +0xA6E3 0x2549 #BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY +0xA6E4 0x254A #BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY +0xA741 0xCB0B #HANGUL SYLLABLE SSANGCIEUC WAE CHIEUCH +0xA742 0xCB0C #HANGUL SYLLABLE SSANGCIEUC WAE KHIEUKH +0xA743 0xCB0D #HANGUL SYLLABLE SSANGCIEUC WAE THIEUTH +0xA744 0xCB0E #HANGUL SYLLABLE SSANGCIEUC WAE PHIEUPH +0xA745 0xCB0F #HANGUL SYLLABLE SSANGCIEUC WAE HIEUH +0xA746 0xCB11 #HANGUL SYLLABLE SSANGCIEUC OE KIYEOK +0xA747 0xCB12 #HANGUL SYLLABLE SSANGCIEUC OE SSANGKIYEOK +0xA748 0xCB13 #HANGUL SYLLABLE SSANGCIEUC OE KIYEOKSIOS +0xA749 0xCB15 #HANGUL SYLLABLE SSANGCIEUC OE NIEUNCIEUC +0xA74A 0xCB16 #HANGUL SYLLABLE SSANGCIEUC OE NIEUNHIEUH +0xA74B 0xCB17 #HANGUL SYLLABLE SSANGCIEUC OE TIKEUT +0xA74C 0xCB19 #HANGUL SYLLABLE SSANGCIEUC OE RIEULKIYEOK +0xA74D 0xCB1A #HANGUL SYLLABLE SSANGCIEUC OE RIEULMIEUM +0xA74E 0xCB1B #HANGUL SYLLABLE SSANGCIEUC OE RIEULPIEUP +0xA74F 0xCB1C #HANGUL SYLLABLE SSANGCIEUC OE RIEULSIOS +0xA750 0xCB1D #HANGUL SYLLABLE SSANGCIEUC OE RIEULTHIEUTH +0xA751 0xCB1E #HANGUL SYLLABLE SSANGCIEUC OE RIEULPHIEUPH +0xA752 0xCB1F #HANGUL SYLLABLE SSANGCIEUC OE RIEULHIEUH +0xA753 0xCB22 #HANGUL SYLLABLE SSANGCIEUC OE PIEUPSIOS +0xA754 0xCB23 #HANGUL SYLLABLE SSANGCIEUC OE SIOS +0xA755 0xCB24 #HANGUL SYLLABLE SSANGCIEUC OE SSANGSIOS +0xA756 0xCB25 #HANGUL SYLLABLE SSANGCIEUC OE IEUNG +0xA757 0xCB26 #HANGUL SYLLABLE SSANGCIEUC OE CIEUC +0xA758 0xCB27 #HANGUL SYLLABLE SSANGCIEUC OE CHIEUCH +0xA759 0xCB28 #HANGUL SYLLABLE SSANGCIEUC OE KHIEUKH +0xA75A 0xCB29 #HANGUL SYLLABLE SSANGCIEUC OE THIEUTH +0xA761 0xCB2A #HANGUL SYLLABLE SSANGCIEUC OE PHIEUPH +0xA762 0xCB2B #HANGUL SYLLABLE SSANGCIEUC OE HIEUH +0xA763 0xCB2C #HANGUL SYLLABLE SSANGCIEUC YO +0xA764 0xCB2D #HANGUL SYLLABLE SSANGCIEUC YO KIYEOK +0xA765 0xCB2E #HANGUL SYLLABLE SSANGCIEUC YO SSANGKIYEOK +0xA766 0xCB2F #HANGUL SYLLABLE SSANGCIEUC YO KIYEOKSIOS +0xA767 0xCB30 #HANGUL SYLLABLE SSANGCIEUC YO NIEUN +0xA768 0xCB31 #HANGUL SYLLABLE SSANGCIEUC YO NIEUNCIEUC +0xA769 0xCB32 #HANGUL SYLLABLE SSANGCIEUC YO NIEUNHIEUH +0xA76A 0xCB33 #HANGUL SYLLABLE SSANGCIEUC YO TIKEUT +0xA76B 0xCB34 #HANGUL SYLLABLE SSANGCIEUC YO RIEUL +0xA76C 0xCB35 #HANGUL SYLLABLE SSANGCIEUC YO RIEULKIYEOK +0xA76D 0xCB36 #HANGUL SYLLABLE SSANGCIEUC YO RIEULMIEUM +0xA76E 0xCB37 #HANGUL SYLLABLE SSANGCIEUC YO RIEULPIEUP +0xA76F 0xCB38 #HANGUL SYLLABLE SSANGCIEUC YO RIEULSIOS +0xA770 0xCB39 #HANGUL SYLLABLE SSANGCIEUC YO RIEULTHIEUTH +0xA771 0xCB3A #HANGUL SYLLABLE SSANGCIEUC YO RIEULPHIEUPH +0xA772 0xCB3B #HANGUL SYLLABLE SSANGCIEUC YO RIEULHIEUH +0xA773 0xCB3C #HANGUL SYLLABLE SSANGCIEUC YO MIEUM +0xA774 0xCB3D #HANGUL SYLLABLE SSANGCIEUC YO PIEUP +0xA775 0xCB3E #HANGUL SYLLABLE SSANGCIEUC YO PIEUPSIOS +0xA776 0xCB3F #HANGUL SYLLABLE SSANGCIEUC YO SIOS +0xA777 0xCB40 #HANGUL SYLLABLE SSANGCIEUC YO SSANGSIOS +0xA778 0xCB42 #HANGUL SYLLABLE SSANGCIEUC YO CIEUC +0xA779 0xCB43 #HANGUL SYLLABLE SSANGCIEUC YO CHIEUCH +0xA77A 0xCB44 #HANGUL SYLLABLE SSANGCIEUC YO KHIEUKH +0xA781 0xCB45 #HANGUL SYLLABLE SSANGCIEUC YO THIEUTH +0xA782 0xCB46 #HANGUL SYLLABLE SSANGCIEUC YO PHIEUPH +0xA783 0xCB47 #HANGUL SYLLABLE SSANGCIEUC YO HIEUH +0xA784 0xCB4A #HANGUL SYLLABLE SSANGCIEUC U SSANGKIYEOK +0xA785 0xCB4B #HANGUL SYLLABLE SSANGCIEUC U KIYEOKSIOS +0xA786 0xCB4D #HANGUL SYLLABLE SSANGCIEUC U NIEUNCIEUC +0xA787 0xCB4E #HANGUL SYLLABLE SSANGCIEUC U NIEUNHIEUH +0xA788 0xCB4F #HANGUL SYLLABLE SSANGCIEUC U TIKEUT +0xA789 0xCB51 #HANGUL SYLLABLE SSANGCIEUC U RIEULKIYEOK +0xA78A 0xCB52 #HANGUL SYLLABLE SSANGCIEUC U RIEULMIEUM +0xA78B 0xCB53 #HANGUL SYLLABLE SSANGCIEUC U RIEULPIEUP +0xA78C 0xCB54 #HANGUL SYLLABLE SSANGCIEUC U RIEULSIOS +0xA78D 0xCB55 #HANGUL SYLLABLE SSANGCIEUC U RIEULTHIEUTH +0xA78E 0xCB56 #HANGUL SYLLABLE SSANGCIEUC U RIEULPHIEUPH +0xA78F 0xCB57 #HANGUL SYLLABLE SSANGCIEUC U RIEULHIEUH +0xA790 0xCB5A #HANGUL SYLLABLE SSANGCIEUC U PIEUPSIOS +0xA791 0xCB5B #HANGUL SYLLABLE SSANGCIEUC U SIOS +0xA792 0xCB5C #HANGUL SYLLABLE SSANGCIEUC U SSANGSIOS +0xA793 0xCB5E #HANGUL SYLLABLE SSANGCIEUC U CIEUC +0xA794 0xCB5F #HANGUL SYLLABLE SSANGCIEUC U CHIEUCH +0xA795 0xCB60 #HANGUL SYLLABLE SSANGCIEUC U KHIEUKH +0xA796 0xCB61 #HANGUL SYLLABLE SSANGCIEUC U THIEUTH +0xA797 0xCB62 #HANGUL SYLLABLE SSANGCIEUC U PHIEUPH +0xA798 0xCB63 #HANGUL SYLLABLE SSANGCIEUC U HIEUH +0xA799 0xCB65 #HANGUL SYLLABLE SSANGCIEUC WEO KIYEOK +0xA79A 0xCB66 #HANGUL SYLLABLE SSANGCIEUC WEO SSANGKIYEOK +0xA79B 0xCB67 #HANGUL SYLLABLE SSANGCIEUC WEO KIYEOKSIOS +0xA79C 0xCB68 #HANGUL SYLLABLE SSANGCIEUC WEO NIEUN +0xA79D 0xCB69 #HANGUL SYLLABLE SSANGCIEUC WEO NIEUNCIEUC +0xA79E 0xCB6A #HANGUL SYLLABLE SSANGCIEUC WEO NIEUNHIEUH +0xA79F 0xCB6B #HANGUL SYLLABLE SSANGCIEUC WEO TIKEUT +0xA7A0 0xCB6C #HANGUL SYLLABLE SSANGCIEUC WEO RIEUL +0xA7A1 0x3395 #SQUARE MU L +0xA7A2 0x3396 #SQUARE ML +0xA7A3 0x3397 #SQUARE DL +0xA7A4 0x2113 #SCRIPT SMALL L +0xA7A5 0x3398 #SQUARE KL +0xA7A6 0x33C4 #SQUARE CC +0xA7A7 0x33A3 #SQUARE MM CUBED +0xA7A8 0x33A4 #SQUARE CM CUBED +0xA7A9 0x33A5 #SQUARE M CUBED +0xA7AA 0x33A6 #SQUARE KM CUBED +0xA7AB 0x3399 #SQUARE FM +0xA7AC 0x339A #SQUARE NM +0xA7AD 0x339B #SQUARE MU M +0xA7AE 0x339C #SQUARE MM +0xA7AF 0x339D #SQUARE CM +0xA7B0 0x339E #SQUARE KM +0xA7B1 0x339F #SQUARE MM SQUARED +0xA7B2 0x33A0 #SQUARE CM SQUARED +0xA7B3 0x33A1 #SQUARE M SQUARED +0xA7B4 0x33A2 #SQUARE KM SQUARED +0xA7B5 0x33CA #SQUARE HA +0xA7B6 0x338D #SQUARE MU G +0xA7B7 0x338E #SQUARE MG +0xA7B8 0x338F #SQUARE KG +0xA7B9 0x33CF #SQUARE KT +0xA7BA 0x3388 #SQUARE CAL +0xA7BB 0x3389 #SQUARE KCAL +0xA7BC 0x33C8 #SQUARE DB +0xA7BD 0x33A7 #SQUARE M OVER S +0xA7BE 0x33A8 #SQUARE M OVER S SQUARED +0xA7BF 0x33B0 #SQUARE PS +0xA7C0 0x33B1 #SQUARE NS +0xA7C1 0x33B2 #SQUARE MU S +0xA7C2 0x33B3 #SQUARE MS +0xA7C3 0x33B4 #SQUARE PV +0xA7C4 0x33B5 #SQUARE NV +0xA7C5 0x33B6 #SQUARE MU V +0xA7C6 0x33B7 #SQUARE MV +0xA7C7 0x33B8 #SQUARE KV +0xA7C8 0x33B9 #SQUARE MV MEGA +0xA7C9 0x3380 #SQUARE PA AMPS +0xA7CA 0x3381 #SQUARE NA +0xA7CB 0x3382 #SQUARE MU A +0xA7CC 0x3383 #SQUARE MA +0xA7CD 0x3384 #SQUARE KA +0xA7CE 0x33BA #SQUARE PW +0xA7CF 0x33BB #SQUARE NW +0xA7D0 0x33BC #SQUARE MU W +0xA7D1 0x33BD #SQUARE MW +0xA7D2 0x33BE #SQUARE KW +0xA7D3 0x33BF #SQUARE MW MEGA +0xA7D4 0x3390 #SQUARE HZ +0xA7D5 0x3391 #SQUARE KHZ +0xA7D6 0x3392 #SQUARE MHZ +0xA7D7 0x3393 #SQUARE GHZ +0xA7D8 0x3394 #SQUARE THZ +0xA7D9 0x2126 #OHM SIGN +0xA7DA 0x33C0 #SQUARE K OHM +0xA7DB 0x33C1 #SQUARE M OHM +0xA7DC 0x338A #SQUARE PF +0xA7DD 0x338B #SQUARE NF +0xA7DE 0x338C #SQUARE MU F +0xA7DF 0x33D6 #SQUARE MOL +0xA7E0 0x33C5 #SQUARE CD +0xA7E1 0x33AD #SQUARE RAD +0xA7E2 0x33AE #SQUARE RAD OVER S +0xA7E3 0x33AF #SQUARE RAD OVER S SQUARED +0xA7E4 0x33DB #SQUARE SR +0xA7E5 0x33A9 #SQUARE PA +0xA7E6 0x33AA #SQUARE KPA +0xA7E7 0x33AB #SQUARE MPA +0xA7E8 0x33AC #SQUARE GPA +0xA7E9 0x33DD #SQUARE WB +0xA7EA 0x33D0 #SQUARE LM +0xA7EB 0x33D3 #SQUARE LX +0xA7EC 0x33C3 #SQUARE BQ +0xA7ED 0x33C9 #SQUARE GY +0xA7EE 0x33DC #SQUARE SV +0xA7EF 0x33C6 #SQUARE C OVER KG +0xA841 0xCB6D #HANGUL SYLLABLE SSANGCIEUC WEO RIEULKIYEOK +0xA842 0xCB6E #HANGUL SYLLABLE SSANGCIEUC WEO RIEULMIEUM +0xA843 0xCB6F #HANGUL SYLLABLE SSANGCIEUC WEO RIEULPIEUP +0xA844 0xCB70 #HANGUL SYLLABLE SSANGCIEUC WEO RIEULSIOS +0xA845 0xCB71 #HANGUL SYLLABLE SSANGCIEUC WEO RIEULTHIEUTH +0xA846 0xCB72 #HANGUL SYLLABLE SSANGCIEUC WEO RIEULPHIEUPH +0xA847 0xCB73 #HANGUL SYLLABLE SSANGCIEUC WEO RIEULHIEUH +0xA848 0xCB74 #HANGUL SYLLABLE SSANGCIEUC WEO MIEUM +0xA849 0xCB75 #HANGUL SYLLABLE SSANGCIEUC WEO PIEUP +0xA84A 0xCB76 #HANGUL SYLLABLE SSANGCIEUC WEO PIEUPSIOS +0xA84B 0xCB77 #HANGUL SYLLABLE SSANGCIEUC WEO SIOS +0xA84C 0xCB7A #HANGUL SYLLABLE SSANGCIEUC WEO CIEUC +0xA84D 0xCB7B #HANGUL SYLLABLE SSANGCIEUC WEO CHIEUCH +0xA84E 0xCB7C #HANGUL SYLLABLE SSANGCIEUC WEO KHIEUKH +0xA84F 0xCB7D #HANGUL SYLLABLE SSANGCIEUC WEO THIEUTH +0xA850 0xCB7E #HANGUL SYLLABLE SSANGCIEUC WEO PHIEUPH +0xA851 0xCB7F #HANGUL SYLLABLE SSANGCIEUC WEO HIEUH +0xA852 0xCB80 #HANGUL SYLLABLE SSANGCIEUC WE +0xA853 0xCB81 #HANGUL SYLLABLE SSANGCIEUC WE KIYEOK +0xA854 0xCB82 #HANGUL SYLLABLE SSANGCIEUC WE SSANGKIYEOK +0xA855 0xCB83 #HANGUL SYLLABLE SSANGCIEUC WE KIYEOKSIOS +0xA856 0xCB84 #HANGUL SYLLABLE SSANGCIEUC WE NIEUN +0xA857 0xCB85 #HANGUL SYLLABLE SSANGCIEUC WE NIEUNCIEUC +0xA858 0xCB86 #HANGUL SYLLABLE SSANGCIEUC WE NIEUNHIEUH +0xA859 0xCB87 #HANGUL SYLLABLE SSANGCIEUC WE TIKEUT +0xA85A 0xCB88 #HANGUL SYLLABLE SSANGCIEUC WE RIEUL +0xA861 0xCB89 #HANGUL SYLLABLE SSANGCIEUC WE RIEULKIYEOK +0xA862 0xCB8A #HANGUL SYLLABLE SSANGCIEUC WE RIEULMIEUM +0xA863 0xCB8B #HANGUL SYLLABLE SSANGCIEUC WE RIEULPIEUP +0xA864 0xCB8C #HANGUL SYLLABLE SSANGCIEUC WE RIEULSIOS +0xA865 0xCB8D #HANGUL SYLLABLE SSANGCIEUC WE RIEULTHIEUTH +0xA866 0xCB8E #HANGUL SYLLABLE SSANGCIEUC WE RIEULPHIEUPH +0xA867 0xCB8F #HANGUL SYLLABLE SSANGCIEUC WE RIEULHIEUH +0xA868 0xCB90 #HANGUL SYLLABLE SSANGCIEUC WE MIEUM +0xA869 0xCB91 #HANGUL SYLLABLE SSANGCIEUC WE PIEUP +0xA86A 0xCB92 #HANGUL SYLLABLE SSANGCIEUC WE PIEUPSIOS +0xA86B 0xCB93 #HANGUL SYLLABLE SSANGCIEUC WE SIOS +0xA86C 0xCB94 #HANGUL SYLLABLE SSANGCIEUC WE SSANGSIOS +0xA86D 0xCB95 #HANGUL SYLLABLE SSANGCIEUC WE IEUNG +0xA86E 0xCB96 #HANGUL SYLLABLE SSANGCIEUC WE CIEUC +0xA86F 0xCB97 #HANGUL SYLLABLE SSANGCIEUC WE CHIEUCH +0xA870 0xCB98 #HANGUL SYLLABLE SSANGCIEUC WE KHIEUKH +0xA871 0xCB99 #HANGUL SYLLABLE SSANGCIEUC WE THIEUTH +0xA872 0xCB9A #HANGUL SYLLABLE SSANGCIEUC WE PHIEUPH +0xA873 0xCB9B #HANGUL SYLLABLE SSANGCIEUC WE HIEUH +0xA874 0xCB9D #HANGUL SYLLABLE SSANGCIEUC WI KIYEOK +0xA875 0xCB9E #HANGUL SYLLABLE SSANGCIEUC WI SSANGKIYEOK +0xA876 0xCB9F #HANGUL SYLLABLE SSANGCIEUC WI KIYEOKSIOS +0xA877 0xCBA0 #HANGUL SYLLABLE SSANGCIEUC WI NIEUN +0xA878 0xCBA1 #HANGUL SYLLABLE SSANGCIEUC WI NIEUNCIEUC +0xA879 0xCBA2 #HANGUL SYLLABLE SSANGCIEUC WI NIEUNHIEUH +0xA87A 0xCBA3 #HANGUL SYLLABLE SSANGCIEUC WI TIKEUT +0xA881 0xCBA4 #HANGUL SYLLABLE SSANGCIEUC WI RIEUL +0xA882 0xCBA5 #HANGUL SYLLABLE SSANGCIEUC WI RIEULKIYEOK +0xA883 0xCBA6 #HANGUL SYLLABLE SSANGCIEUC WI RIEULMIEUM +0xA884 0xCBA7 #HANGUL SYLLABLE SSANGCIEUC WI RIEULPIEUP +0xA885 0xCBA8 #HANGUL SYLLABLE SSANGCIEUC WI RIEULSIOS +0xA886 0xCBA9 #HANGUL SYLLABLE SSANGCIEUC WI RIEULTHIEUTH +0xA887 0xCBAA #HANGUL SYLLABLE SSANGCIEUC WI RIEULPHIEUPH +0xA888 0xCBAB #HANGUL SYLLABLE SSANGCIEUC WI RIEULHIEUH +0xA889 0xCBAC #HANGUL SYLLABLE SSANGCIEUC WI MIEUM +0xA88A 0xCBAD #HANGUL SYLLABLE SSANGCIEUC WI PIEUP +0xA88B 0xCBAE #HANGUL SYLLABLE SSANGCIEUC WI PIEUPSIOS +0xA88C 0xCBAF #HANGUL SYLLABLE SSANGCIEUC WI SIOS +0xA88D 0xCBB0 #HANGUL SYLLABLE SSANGCIEUC WI SSANGSIOS +0xA88E 0xCBB1 #HANGUL SYLLABLE SSANGCIEUC WI IEUNG +0xA88F 0xCBB2 #HANGUL SYLLABLE SSANGCIEUC WI CIEUC +0xA890 0xCBB3 #HANGUL SYLLABLE SSANGCIEUC WI CHIEUCH +0xA891 0xCBB4 #HANGUL SYLLABLE SSANGCIEUC WI KHIEUKH +0xA892 0xCBB5 #HANGUL SYLLABLE SSANGCIEUC WI THIEUTH +0xA893 0xCBB6 #HANGUL SYLLABLE SSANGCIEUC WI PHIEUPH +0xA894 0xCBB7 #HANGUL SYLLABLE SSANGCIEUC WI HIEUH +0xA895 0xCBB9 #HANGUL SYLLABLE SSANGCIEUC YU KIYEOK +0xA896 0xCBBA #HANGUL SYLLABLE SSANGCIEUC YU SSANGKIYEOK +0xA897 0xCBBB #HANGUL SYLLABLE SSANGCIEUC YU KIYEOKSIOS +0xA898 0xCBBC #HANGUL SYLLABLE SSANGCIEUC YU NIEUN +0xA899 0xCBBD #HANGUL SYLLABLE SSANGCIEUC YU NIEUNCIEUC +0xA89A 0xCBBE #HANGUL SYLLABLE SSANGCIEUC YU NIEUNHIEUH +0xA89B 0xCBBF #HANGUL SYLLABLE SSANGCIEUC YU TIKEUT +0xA89C 0xCBC0 #HANGUL SYLLABLE SSANGCIEUC YU RIEUL +0xA89D 0xCBC1 #HANGUL SYLLABLE SSANGCIEUC YU RIEULKIYEOK +0xA89E 0xCBC2 #HANGUL SYLLABLE SSANGCIEUC YU RIEULMIEUM +0xA89F 0xCBC3 #HANGUL SYLLABLE SSANGCIEUC YU RIEULPIEUP +0xA8A0 0xCBC4 #HANGUL SYLLABLE SSANGCIEUC YU RIEULSIOS +0xA8A1 0x00C6 #LATIN CAPITAL LETTER AE +0xA8A2 0x00D0 #LATIN CAPITAL LETTER ETH +0xA8A3 0x00AA #FEMININE ORDINAL INDICATOR +0xA8A4 0x0126 #LATIN CAPITAL LETTER H WITH STROKE +0xA8A6 0x0132 #LATIN CAPITAL LIGATURE IJ +0xA8A8 0x013F #LATIN CAPITAL LETTER L WITH MIDDLE DOT +0xA8A9 0x0141 #LATIN CAPITAL LETTER L WITH STROKE +0xA8AA 0x00D8 #LATIN CAPITAL LETTER O WITH STROKE +0xA8AB 0x0152 #LATIN CAPITAL LIGATURE OE +0xA8AC 0x00BA #MASCULINE ORDINAL INDICATOR +0xA8AD 0x00DE #LATIN CAPITAL LETTER THORN +0xA8AE 0x0166 #LATIN CAPITAL LETTER T WITH STROKE +0xA8AF 0x014A #LATIN CAPITAL LETTER ENG +0xA8B1 0x3260 #CIRCLED HANGUL KIYEOK +0xA8B2 0x3261 #CIRCLED HANGUL NIEUN +0xA8B3 0x3262 #CIRCLED HANGUL TIKEUT +0xA8B4 0x3263 #CIRCLED HANGUL RIEUL +0xA8B5 0x3264 #CIRCLED HANGUL MIEUM +0xA8B6 0x3265 #CIRCLED HANGUL PIEUP +0xA8B7 0x3266 #CIRCLED HANGUL SIOS +0xA8B8 0x3267 #CIRCLED HANGUL IEUNG +0xA8B9 0x3268 #CIRCLED HANGUL CIEUC +0xA8BA 0x3269 #CIRCLED HANGUL CHIEUCH +0xA8BB 0x326A #CIRCLED HANGUL KHIEUKH +0xA8BC 0x326B #CIRCLED HANGUL THIEUTH +0xA8BD 0x326C #CIRCLED HANGUL PHIEUPH +0xA8BE 0x326D #CIRCLED HANGUL HIEUH +0xA8BF 0x326E #CIRCLED HANGUL KIYEOK A +0xA8C0 0x326F #CIRCLED HANGUL NIEUN A +0xA8C1 0x3270 #CIRCLED HANGUL TIKEUT A +0xA8C2 0x3271 #CIRCLED HANGUL RIEUL A +0xA8C3 0x3272 #CIRCLED HANGUL MIEUM A +0xA8C4 0x3273 #CIRCLED HANGUL PIEUP A +0xA8C5 0x3274 #CIRCLED HANGUL SIOS A +0xA8C6 0x3275 #CIRCLED HANGUL IEUNG A +0xA8C7 0x3276 #CIRCLED HANGUL CIEUC A +0xA8C8 0x3277 #CIRCLED HANGUL CHIEUCH A +0xA8C9 0x3278 #CIRCLED HANGUL KHIEUKH A +0xA8CA 0x3279 #CIRCLED HANGUL THIEUTH A +0xA8CB 0x327A #CIRCLED HANGUL PHIEUPH A +0xA8CC 0x327B #CIRCLED HANGUL HIEUH A +0xA8CD 0x24D0 #CIRCLED LATIN SMALL LETTER A +0xA8CE 0x24D1 #CIRCLED LATIN SMALL LETTER B +0xA8CF 0x24D2 #CIRCLED LATIN SMALL LETTER C +0xA8D0 0x24D3 #CIRCLED LATIN SMALL LETTER D +0xA8D1 0x24D4 #CIRCLED LATIN SMALL LETTER E +0xA8D2 0x24D5 #CIRCLED LATIN SMALL LETTER F +0xA8D3 0x24D6 #CIRCLED LATIN SMALL LETTER G +0xA8D4 0x24D7 #CIRCLED LATIN SMALL LETTER H +0xA8D5 0x24D8 #CIRCLED LATIN SMALL LETTER I +0xA8D6 0x24D9 #CIRCLED LATIN SMALL LETTER J +0xA8D7 0x24DA #CIRCLED LATIN SMALL LETTER K +0xA8D8 0x24DB #CIRCLED LATIN SMALL LETTER L +0xA8D9 0x24DC #CIRCLED LATIN SMALL LETTER M +0xA8DA 0x24DD #CIRCLED LATIN SMALL LETTER N +0xA8DB 0x24DE #CIRCLED LATIN SMALL LETTER O +0xA8DC 0x24DF #CIRCLED LATIN SMALL LETTER P +0xA8DD 0x24E0 #CIRCLED LATIN SMALL LETTER Q +0xA8DE 0x24E1 #CIRCLED LATIN SMALL LETTER R +0xA8DF 0x24E2 #CIRCLED LATIN SMALL LETTER S +0xA8E0 0x24E3 #CIRCLED LATIN SMALL LETTER T +0xA8E1 0x24E4 #CIRCLED LATIN SMALL LETTER U +0xA8E2 0x24E5 #CIRCLED LATIN SMALL LETTER V +0xA8E3 0x24E6 #CIRCLED LATIN SMALL LETTER W +0xA8E4 0x24E7 #CIRCLED LATIN SMALL LETTER X +0xA8E5 0x24E8 #CIRCLED LATIN SMALL LETTER Y +0xA8E6 0x24E9 #CIRCLED LATIN SMALL LETTER Z +0xA8E7 0x2460 #CIRCLED DIGIT ONE +0xA8E8 0x2461 #CIRCLED DIGIT TWO +0xA8E9 0x2462 #CIRCLED DIGIT THREE +0xA8EA 0x2463 #CIRCLED DIGIT FOUR +0xA8EB 0x2464 #CIRCLED DIGIT FIVE +0xA8EC 0x2465 #CIRCLED DIGIT SIX +0xA8ED 0x2466 #CIRCLED DIGIT SEVEN +0xA8EE 0x2467 #CIRCLED DIGIT EIGHT +0xA8EF 0x2468 #CIRCLED DIGIT NINE +0xA8F0 0x2469 #CIRCLED NUMBER TEN +0xA8F1 0x246A #CIRCLED NUMBER ELEVEN +0xA8F2 0x246B #CIRCLED NUMBER TWELVE +0xA8F3 0x246C #CIRCLED NUMBER THIRTEEN +0xA8F4 0x246D #CIRCLED NUMBER FOURTEEN +0xA8F5 0x246E #CIRCLED NUMBER FIFTEEN +0xA8F6 0x00BD #VULGAR FRACTION ONE HALF +0xA8F7 0x2153 #VULGAR FRACTION ONE THIRD +0xA8F8 0x2154 #VULGAR FRACTION TWO THIRDS +0xA8F9 0x00BC #VULGAR FRACTION ONE QUARTER +0xA8FA 0x00BE #VULGAR FRACTION THREE QUARTERS +0xA8FB 0x215B #VULGAR FRACTION ONE EIGHTH +0xA8FC 0x215C #VULGAR FRACTION THREE EIGHTHS +0xA8FD 0x215D #VULGAR FRACTION FIVE EIGHTHS +0xA8FE 0x215E #VULGAR FRACTION SEVEN EIGHTHS +0xA941 0xCBC5 #HANGUL SYLLABLE SSANGCIEUC YU RIEULTHIEUTH +0xA942 0xCBC6 #HANGUL SYLLABLE SSANGCIEUC YU RIEULPHIEUPH +0xA943 0xCBC7 #HANGUL SYLLABLE SSANGCIEUC YU RIEULHIEUH +0xA944 0xCBC8 #HANGUL SYLLABLE SSANGCIEUC YU MIEUM +0xA945 0xCBC9 #HANGUL SYLLABLE SSANGCIEUC YU PIEUP +0xA946 0xCBCA #HANGUL SYLLABLE SSANGCIEUC YU PIEUPSIOS +0xA947 0xCBCB #HANGUL SYLLABLE SSANGCIEUC YU SIOS +0xA948 0xCBCC #HANGUL SYLLABLE SSANGCIEUC YU SSANGSIOS +0xA949 0xCBCD #HANGUL SYLLABLE SSANGCIEUC YU IEUNG +0xA94A 0xCBCE #HANGUL SYLLABLE SSANGCIEUC YU CIEUC +0xA94B 0xCBCF #HANGUL SYLLABLE SSANGCIEUC YU CHIEUCH +0xA94C 0xCBD0 #HANGUL SYLLABLE SSANGCIEUC YU KHIEUKH +0xA94D 0xCBD1 #HANGUL SYLLABLE SSANGCIEUC YU THIEUTH +0xA94E 0xCBD2 #HANGUL SYLLABLE SSANGCIEUC YU PHIEUPH +0xA94F 0xCBD3 #HANGUL SYLLABLE SSANGCIEUC YU HIEUH +0xA950 0xCBD5 #HANGUL SYLLABLE SSANGCIEUC EU KIYEOK +0xA951 0xCBD6 #HANGUL SYLLABLE SSANGCIEUC EU SSANGKIYEOK +0xA952 0xCBD7 #HANGUL SYLLABLE SSANGCIEUC EU KIYEOKSIOS +0xA953 0xCBD8 #HANGUL SYLLABLE SSANGCIEUC EU NIEUN +0xA954 0xCBD9 #HANGUL SYLLABLE SSANGCIEUC EU NIEUNCIEUC +0xA955 0xCBDA #HANGUL SYLLABLE SSANGCIEUC EU NIEUNHIEUH +0xA956 0xCBDB #HANGUL SYLLABLE SSANGCIEUC EU TIKEUT +0xA957 0xCBDC #HANGUL SYLLABLE SSANGCIEUC EU RIEUL +0xA958 0xCBDD #HANGUL SYLLABLE SSANGCIEUC EU RIEULKIYEOK +0xA959 0xCBDE #HANGUL SYLLABLE SSANGCIEUC EU RIEULMIEUM +0xA95A 0xCBDF #HANGUL SYLLABLE SSANGCIEUC EU RIEULPIEUP +0xA961 0xCBE0 #HANGUL SYLLABLE SSANGCIEUC EU RIEULSIOS +0xA962 0xCBE1 #HANGUL SYLLABLE SSANGCIEUC EU RIEULTHIEUTH +0xA963 0xCBE2 #HANGUL SYLLABLE SSANGCIEUC EU RIEULPHIEUPH +0xA964 0xCBE3 #HANGUL SYLLABLE SSANGCIEUC EU RIEULHIEUH +0xA965 0xCBE5 #HANGUL SYLLABLE SSANGCIEUC EU PIEUP +0xA966 0xCBE6 #HANGUL SYLLABLE SSANGCIEUC EU PIEUPSIOS +0xA967 0xCBE8 #HANGUL SYLLABLE SSANGCIEUC EU SSANGSIOS +0xA968 0xCBEA #HANGUL SYLLABLE SSANGCIEUC EU CIEUC +0xA969 0xCBEB #HANGUL SYLLABLE SSANGCIEUC EU CHIEUCH +0xA96A 0xCBEC #HANGUL SYLLABLE SSANGCIEUC EU KHIEUKH +0xA96B 0xCBED #HANGUL SYLLABLE SSANGCIEUC EU THIEUTH +0xA96C 0xCBEE #HANGUL SYLLABLE SSANGCIEUC EU PHIEUPH +0xA96D 0xCBEF #HANGUL SYLLABLE SSANGCIEUC EU HIEUH +0xA96E 0xCBF0 #HANGUL SYLLABLE SSANGCIEUC YI +0xA96F 0xCBF1 #HANGUL SYLLABLE SSANGCIEUC YI KIYEOK +0xA970 0xCBF2 #HANGUL SYLLABLE SSANGCIEUC YI SSANGKIYEOK +0xA971 0xCBF3 #HANGUL SYLLABLE SSANGCIEUC YI KIYEOKSIOS +0xA972 0xCBF4 #HANGUL SYLLABLE SSANGCIEUC YI NIEUN +0xA973 0xCBF5 #HANGUL SYLLABLE SSANGCIEUC YI NIEUNCIEUC +0xA974 0xCBF6 #HANGUL SYLLABLE SSANGCIEUC YI NIEUNHIEUH +0xA975 0xCBF7 #HANGUL SYLLABLE SSANGCIEUC YI TIKEUT +0xA976 0xCBF8 #HANGUL SYLLABLE SSANGCIEUC YI RIEUL +0xA977 0xCBF9 #HANGUL SYLLABLE SSANGCIEUC YI RIEULKIYEOK +0xA978 0xCBFA #HANGUL SYLLABLE SSANGCIEUC YI RIEULMIEUM +0xA979 0xCBFB #HANGUL SYLLABLE SSANGCIEUC YI RIEULPIEUP +0xA97A 0xCBFC #HANGUL SYLLABLE SSANGCIEUC YI RIEULSIOS +0xA981 0xCBFD #HANGUL SYLLABLE SSANGCIEUC YI RIEULTHIEUTH +0xA982 0xCBFE #HANGUL SYLLABLE SSANGCIEUC YI RIEULPHIEUPH +0xA983 0xCBFF #HANGUL SYLLABLE SSANGCIEUC YI RIEULHIEUH +0xA984 0xCC00 #HANGUL SYLLABLE SSANGCIEUC YI MIEUM +0xA985 0xCC01 #HANGUL SYLLABLE SSANGCIEUC YI PIEUP +0xA986 0xCC02 #HANGUL SYLLABLE SSANGCIEUC YI PIEUPSIOS +0xA987 0xCC03 #HANGUL SYLLABLE SSANGCIEUC YI SIOS +0xA988 0xCC04 #HANGUL SYLLABLE SSANGCIEUC YI SSANGSIOS +0xA989 0xCC05 #HANGUL SYLLABLE SSANGCIEUC YI IEUNG +0xA98A 0xCC06 #HANGUL SYLLABLE SSANGCIEUC YI CIEUC +0xA98B 0xCC07 #HANGUL SYLLABLE SSANGCIEUC YI CHIEUCH +0xA98C 0xCC08 #HANGUL SYLLABLE SSANGCIEUC YI KHIEUKH +0xA98D 0xCC09 #HANGUL SYLLABLE SSANGCIEUC YI THIEUTH +0xA98E 0xCC0A #HANGUL SYLLABLE SSANGCIEUC YI PHIEUPH +0xA98F 0xCC0B #HANGUL SYLLABLE SSANGCIEUC YI HIEUH +0xA990 0xCC0E #HANGUL SYLLABLE SSANGCIEUC I SSANGKIYEOK +0xA991 0xCC0F #HANGUL SYLLABLE SSANGCIEUC I KIYEOKSIOS +0xA992 0xCC11 #HANGUL SYLLABLE SSANGCIEUC I NIEUNCIEUC +0xA993 0xCC12 #HANGUL SYLLABLE SSANGCIEUC I NIEUNHIEUH +0xA994 0xCC13 #HANGUL SYLLABLE SSANGCIEUC I TIKEUT +0xA995 0xCC15 #HANGUL SYLLABLE SSANGCIEUC I RIEULKIYEOK +0xA996 0xCC16 #HANGUL SYLLABLE SSANGCIEUC I RIEULMIEUM +0xA997 0xCC17 #HANGUL SYLLABLE SSANGCIEUC I RIEULPIEUP +0xA998 0xCC18 #HANGUL SYLLABLE SSANGCIEUC I RIEULSIOS +0xA999 0xCC19 #HANGUL SYLLABLE SSANGCIEUC I RIEULTHIEUTH +0xA99A 0xCC1A #HANGUL SYLLABLE SSANGCIEUC I RIEULPHIEUPH +0xA99B 0xCC1B #HANGUL SYLLABLE SSANGCIEUC I RIEULHIEUH +0xA99C 0xCC1E #HANGUL SYLLABLE SSANGCIEUC I PIEUPSIOS +0xA99D 0xCC1F #HANGUL SYLLABLE SSANGCIEUC I SIOS +0xA99E 0xCC20 #HANGUL SYLLABLE SSANGCIEUC I SSANGSIOS +0xA99F 0xCC23 #HANGUL SYLLABLE SSANGCIEUC I CHIEUCH +0xA9A0 0xCC24 #HANGUL SYLLABLE SSANGCIEUC I KHIEUKH +0xA9A1 0x00E6 #LATIN SMALL LETTER AE +0xA9A2 0x0111 #LATIN SMALL LETTER D WITH STROKE +0xA9A3 0x00F0 #LATIN SMALL LETTER ETH +0xA9A4 0x0127 #LATIN SMALL LETTER H WITH STROKE +0xA9A5 0x0131 #LATIN SMALL LETTER DOTLESS I +0xA9A6 0x0133 #LATIN SMALL LIGATURE IJ +0xA9A7 0x0138 #LATIN SMALL LETTER KRA +0xA9A8 0x0140 #LATIN SMALL LETTER L WITH MIDDLE DOT +0xA9A9 0x0142 #LATIN SMALL LETTER L WITH STROKE +0xA9AA 0x00F8 #LATIN SMALL LETTER O WITH STROKE +0xA9AB 0x0153 #LATIN SMALL LIGATURE OE +0xA9AC 0x00DF #LATIN SMALL LETTER SHARP S +0xA9AD 0x00FE #LATIN SMALL LETTER THORN +0xA9AE 0x0167 #LATIN SMALL LETTER T WITH STROKE +0xA9AF 0x014B #LATIN SMALL LETTER ENG +0xA9B0 0x0149 #LATIN SMALL LETTER N PRECEDED BY APOSTROPHE +0xA9B1 0x3200 #PARENTHESIZED HANGUL KIYEOK +0xA9B2 0x3201 #PARENTHESIZED HANGUL NIEUN +0xA9B3 0x3202 #PARENTHESIZED HANGUL TIKEUT +0xA9B4 0x3203 #PARENTHESIZED HANGUL RIEUL +0xA9B5 0x3204 #PARENTHESIZED HANGUL MIEUM +0xA9B6 0x3205 #PARENTHESIZED HANGUL PIEUP +0xA9B7 0x3206 #PARENTHESIZED HANGUL SIOS +0xA9B8 0x3207 #PARENTHESIZED HANGUL IEUNG +0xA9B9 0x3208 #PARENTHESIZED HANGUL CIEUC +0xA9BA 0x3209 #PARENTHESIZED HANGUL CHIEUCH +0xA9BB 0x320A #PARENTHESIZED HANGUL KHIEUKH +0xA9BC 0x320B #PARENTHESIZED HANGUL THIEUTH +0xA9BD 0x320C #PARENTHESIZED HANGUL PHIEUPH +0xA9BE 0x320D #PARENTHESIZED HANGUL HIEUH +0xA9BF 0x320E #PARENTHESIZED HANGUL KIYEOK A +0xA9C0 0x320F #PARENTHESIZED HANGUL NIEUN A +0xA9C1 0x3210 #PARENTHESIZED HANGUL TIKEUT A +0xA9C2 0x3211 #PARENTHESIZED HANGUL RIEUL A +0xA9C3 0x3212 #PARENTHESIZED HANGUL MIEUM A +0xA9C4 0x3213 #PARENTHESIZED HANGUL PIEUP A +0xA9C5 0x3214 #PARENTHESIZED HANGUL SIOS A +0xA9C6 0x3215 #PARENTHESIZED HANGUL IEUNG A +0xA9C7 0x3216 #PARENTHESIZED HANGUL CIEUC A +0xA9C8 0x3217 #PARENTHESIZED HANGUL CHIEUCH A +0xA9C9 0x3218 #PARENTHESIZED HANGUL KHIEUKH A +0xA9CA 0x3219 #PARENTHESIZED HANGUL THIEUTH A +0xA9CB 0x321A #PARENTHESIZED HANGUL PHIEUPH A +0xA9CC 0x321B #PARENTHESIZED HANGUL HIEUH A +0xA9CD 0x249C #PARENTHESIZED LATIN SMALL LETTER A +0xA9CE 0x249D #PARENTHESIZED LATIN SMALL LETTER B +0xA9CF 0x249E #PARENTHESIZED LATIN SMALL LETTER C +0xA9D0 0x249F #PARENTHESIZED LATIN SMALL LETTER D +0xA9D1 0x24A0 #PARENTHESIZED LATIN SMALL LETTER E +0xA9D2 0x24A1 #PARENTHESIZED LATIN SMALL LETTER F +0xA9D3 0x24A2 #PARENTHESIZED LATIN SMALL LETTER G +0xA9D4 0x24A3 #PARENTHESIZED LATIN SMALL LETTER H +0xA9D5 0x24A4 #PARENTHESIZED LATIN SMALL LETTER I +0xA9D6 0x24A5 #PARENTHESIZED LATIN SMALL LETTER J +0xA9D7 0x24A6 #PARENTHESIZED LATIN SMALL LETTER K +0xA9D8 0x24A7 #PARENTHESIZED LATIN SMALL LETTER L +0xA9D9 0x24A8 #PARENTHESIZED LATIN SMALL LETTER M +0xA9DA 0x24A9 #PARENTHESIZED LATIN SMALL LETTER N +0xA9DB 0x24AA #PARENTHESIZED LATIN SMALL LETTER O +0xA9DC 0x24AB #PARENTHESIZED LATIN SMALL LETTER P +0xA9DD 0x24AC #PARENTHESIZED LATIN SMALL LETTER Q +0xA9DE 0x24AD #PARENTHESIZED LATIN SMALL LETTER R +0xA9DF 0x24AE #PARENTHESIZED LATIN SMALL LETTER S +0xA9E0 0x24AF #PARENTHESIZED LATIN SMALL LETTER T +0xA9E1 0x24B0 #PARENTHESIZED LATIN SMALL LETTER U +0xA9E2 0x24B1 #PARENTHESIZED LATIN SMALL LETTER V +0xA9E3 0x24B2 #PARENTHESIZED LATIN SMALL LETTER W +0xA9E4 0x24B3 #PARENTHESIZED LATIN SMALL LETTER X +0xA9E5 0x24B4 #PARENTHESIZED LATIN SMALL LETTER Y +0xA9E6 0x24B5 #PARENTHESIZED LATIN SMALL LETTER Z +0xA9E7 0x2474 #PARENTHESIZED DIGIT ONE +0xA9E8 0x2475 #PARENTHESIZED DIGIT TWO +0xA9E9 0x2476 #PARENTHESIZED DIGIT THREE +0xA9EA 0x2477 #PARENTHESIZED DIGIT FOUR +0xA9EB 0x2478 #PARENTHESIZED DIGIT FIVE +0xA9EC 0x2479 #PARENTHESIZED DIGIT SIX +0xA9ED 0x247A #PARENTHESIZED DIGIT SEVEN +0xA9EE 0x247B #PARENTHESIZED DIGIT EIGHT +0xA9EF 0x247C #PARENTHESIZED DIGIT NINE +0xA9F0 0x247D #PARENTHESIZED NUMBER TEN +0xA9F1 0x247E #PARENTHESIZED NUMBER ELEVEN +0xA9F2 0x247F #PARENTHESIZED NUMBER TWELVE +0xA9F3 0x2480 #PARENTHESIZED NUMBER THIRTEEN +0xA9F4 0x2481 #PARENTHESIZED NUMBER FOURTEEN +0xA9F5 0x2482 #PARENTHESIZED NUMBER FIFTEEN +0xA9F6 0x00B9 #SUPERSCRIPT ONE +0xA9F7 0x00B2 #SUPERSCRIPT TWO +0xA9F8 0x00B3 #SUPERSCRIPT THREE +0xA9F9 0x2074 #SUPERSCRIPT FOUR +0xA9FA 0x207F #SUPERSCRIPT LATIN SMALL LETTER N +0xA9FB 0x2081 #SUBSCRIPT ONE +0xA9FC 0x2082 #SUBSCRIPT TWO +0xA9FD 0x2083 #SUBSCRIPT THREE +0xA9FE 0x2084 #SUBSCRIPT FOUR +0xAA41 0xCC25 #HANGUL SYLLABLE SSANGCIEUC I THIEUTH +0xAA42 0xCC26 #HANGUL SYLLABLE SSANGCIEUC I PHIEUPH +0xAA43 0xCC2A #HANGUL SYLLABLE CHIEUCH A SSANGKIYEOK +0xAA44 0xCC2B #HANGUL SYLLABLE CHIEUCH A KIYEOKSIOS +0xAA45 0xCC2D #HANGUL SYLLABLE CHIEUCH A NIEUNCIEUC +0xAA46 0xCC2F #HANGUL SYLLABLE CHIEUCH A TIKEUT +0xAA47 0xCC31 #HANGUL SYLLABLE CHIEUCH A RIEULKIYEOK +0xAA48 0xCC32 #HANGUL SYLLABLE CHIEUCH A RIEULMIEUM +0xAA49 0xCC33 #HANGUL SYLLABLE CHIEUCH A RIEULPIEUP +0xAA4A 0xCC34 #HANGUL SYLLABLE CHIEUCH A RIEULSIOS +0xAA4B 0xCC35 #HANGUL SYLLABLE CHIEUCH A RIEULTHIEUTH +0xAA4C 0xCC36 #HANGUL SYLLABLE CHIEUCH A RIEULPHIEUPH +0xAA4D 0xCC37 #HANGUL SYLLABLE CHIEUCH A RIEULHIEUH +0xAA4E 0xCC3A #HANGUL SYLLABLE CHIEUCH A PIEUPSIOS +0xAA4F 0xCC3F #HANGUL SYLLABLE CHIEUCH A CHIEUCH +0xAA50 0xCC40 #HANGUL SYLLABLE CHIEUCH A KHIEUKH +0xAA51 0xCC41 #HANGUL SYLLABLE CHIEUCH A THIEUTH +0xAA52 0xCC42 #HANGUL SYLLABLE CHIEUCH A PHIEUPH +0xAA53 0xCC43 #HANGUL SYLLABLE CHIEUCH A HIEUH +0xAA54 0xCC46 #HANGUL SYLLABLE CHIEUCH AE SSANGKIYEOK +0xAA55 0xCC47 #HANGUL SYLLABLE CHIEUCH AE KIYEOKSIOS +0xAA56 0xCC49 #HANGUL SYLLABLE CHIEUCH AE NIEUNCIEUC +0xAA57 0xCC4A #HANGUL SYLLABLE CHIEUCH AE NIEUNHIEUH +0xAA58 0xCC4B #HANGUL SYLLABLE CHIEUCH AE TIKEUT +0xAA59 0xCC4D #HANGUL SYLLABLE CHIEUCH AE RIEULKIYEOK +0xAA5A 0xCC4E #HANGUL SYLLABLE CHIEUCH AE RIEULMIEUM +0xAA61 0xCC4F #HANGUL SYLLABLE CHIEUCH AE RIEULPIEUP +0xAA62 0xCC50 #HANGUL SYLLABLE CHIEUCH AE RIEULSIOS +0xAA63 0xCC51 #HANGUL SYLLABLE CHIEUCH AE RIEULTHIEUTH +0xAA64 0xCC52 #HANGUL SYLLABLE CHIEUCH AE RIEULPHIEUPH +0xAA65 0xCC53 #HANGUL SYLLABLE CHIEUCH AE RIEULHIEUH +0xAA66 0xCC56 #HANGUL SYLLABLE CHIEUCH AE PIEUPSIOS +0xAA67 0xCC5A #HANGUL SYLLABLE CHIEUCH AE CIEUC +0xAA68 0xCC5B #HANGUL SYLLABLE CHIEUCH AE CHIEUCH +0xAA69 0xCC5C #HANGUL SYLLABLE CHIEUCH AE KHIEUKH +0xAA6A 0xCC5D #HANGUL SYLLABLE CHIEUCH AE THIEUTH +0xAA6B 0xCC5E #HANGUL SYLLABLE CHIEUCH AE PHIEUPH +0xAA6C 0xCC5F #HANGUL SYLLABLE CHIEUCH AE HIEUH +0xAA6D 0xCC61 #HANGUL SYLLABLE CHIEUCH YA KIYEOK +0xAA6E 0xCC62 #HANGUL SYLLABLE CHIEUCH YA SSANGKIYEOK +0xAA6F 0xCC63 #HANGUL SYLLABLE CHIEUCH YA KIYEOKSIOS +0xAA70 0xCC65 #HANGUL SYLLABLE CHIEUCH YA NIEUNCIEUC +0xAA71 0xCC67 #HANGUL SYLLABLE CHIEUCH YA TIKEUT +0xAA72 0xCC69 #HANGUL SYLLABLE CHIEUCH YA RIEULKIYEOK +0xAA73 0xCC6A #HANGUL SYLLABLE CHIEUCH YA RIEULMIEUM +0xAA74 0xCC6B #HANGUL SYLLABLE CHIEUCH YA RIEULPIEUP +0xAA75 0xCC6C #HANGUL SYLLABLE CHIEUCH YA RIEULSIOS +0xAA76 0xCC6D #HANGUL SYLLABLE CHIEUCH YA RIEULTHIEUTH +0xAA77 0xCC6E #HANGUL SYLLABLE CHIEUCH YA RIEULPHIEUPH +0xAA78 0xCC6F #HANGUL SYLLABLE CHIEUCH YA RIEULHIEUH +0xAA79 0xCC71 #HANGUL SYLLABLE CHIEUCH YA PIEUP +0xAA7A 0xCC72 #HANGUL SYLLABLE CHIEUCH YA PIEUPSIOS +0xAA81 0xCC73 #HANGUL SYLLABLE CHIEUCH YA SIOS +0xAA82 0xCC74 #HANGUL SYLLABLE CHIEUCH YA SSANGSIOS +0xAA83 0xCC76 #HANGUL SYLLABLE CHIEUCH YA CIEUC +0xAA84 0xCC77 #HANGUL SYLLABLE CHIEUCH YA CHIEUCH +0xAA85 0xCC78 #HANGUL SYLLABLE CHIEUCH YA KHIEUKH +0xAA86 0xCC79 #HANGUL SYLLABLE CHIEUCH YA THIEUTH +0xAA87 0xCC7A #HANGUL SYLLABLE CHIEUCH YA PHIEUPH +0xAA88 0xCC7B #HANGUL SYLLABLE CHIEUCH YA HIEUH +0xAA89 0xCC7C #HANGUL SYLLABLE CHIEUCH YAE +0xAA8A 0xCC7D #HANGUL SYLLABLE CHIEUCH YAE KIYEOK +0xAA8B 0xCC7E #HANGUL SYLLABLE CHIEUCH YAE SSANGKIYEOK +0xAA8C 0xCC7F #HANGUL SYLLABLE CHIEUCH YAE KIYEOKSIOS +0xAA8D 0xCC80 #HANGUL SYLLABLE CHIEUCH YAE NIEUN +0xAA8E 0xCC81 #HANGUL SYLLABLE CHIEUCH YAE NIEUNCIEUC +0xAA8F 0xCC82 #HANGUL SYLLABLE CHIEUCH YAE NIEUNHIEUH +0xAA90 0xCC83 #HANGUL SYLLABLE CHIEUCH YAE TIKEUT +0xAA91 0xCC84 #HANGUL SYLLABLE CHIEUCH YAE RIEUL +0xAA92 0xCC85 #HANGUL SYLLABLE CHIEUCH YAE RIEULKIYEOK +0xAA93 0xCC86 #HANGUL SYLLABLE CHIEUCH YAE RIEULMIEUM +0xAA94 0xCC87 #HANGUL SYLLABLE CHIEUCH YAE RIEULPIEUP +0xAA95 0xCC88 #HANGUL SYLLABLE CHIEUCH YAE RIEULSIOS +0xAA96 0xCC89 #HANGUL SYLLABLE CHIEUCH YAE RIEULTHIEUTH +0xAA97 0xCC8A #HANGUL SYLLABLE CHIEUCH YAE RIEULPHIEUPH +0xAA98 0xCC8B #HANGUL SYLLABLE CHIEUCH YAE RIEULHIEUH +0xAA99 0xCC8C #HANGUL SYLLABLE CHIEUCH YAE MIEUM +0xAA9A 0xCC8D #HANGUL SYLLABLE CHIEUCH YAE PIEUP +0xAA9B 0xCC8E #HANGUL SYLLABLE CHIEUCH YAE PIEUPSIOS +0xAA9C 0xCC8F #HANGUL SYLLABLE CHIEUCH YAE SIOS +0xAA9D 0xCC90 #HANGUL SYLLABLE CHIEUCH YAE SSANGSIOS +0xAA9E 0xCC91 #HANGUL SYLLABLE CHIEUCH YAE IEUNG +0xAA9F 0xCC92 #HANGUL SYLLABLE CHIEUCH YAE CIEUC +0xAAA0 0xCC93 #HANGUL SYLLABLE CHIEUCH YAE CHIEUCH +0xAAA1 0x3041 #HIRAGANA LETTER SMALL A +0xAAA2 0x3042 #HIRAGANA LETTER A +0xAAA3 0x3043 #HIRAGANA LETTER SMALL I +0xAAA4 0x3044 #HIRAGANA LETTER I +0xAAA5 0x3045 #HIRAGANA LETTER SMALL U +0xAAA6 0x3046 #HIRAGANA LETTER U +0xAAA7 0x3047 #HIRAGANA LETTER SMALL E +0xAAA8 0x3048 #HIRAGANA LETTER E +0xAAA9 0x3049 #HIRAGANA LETTER SMALL O +0xAAAA 0x304A #HIRAGANA LETTER O +0xAAAB 0x304B #HIRAGANA LETTER KA +0xAAAC 0x304C #HIRAGANA LETTER GA +0xAAAD 0x304D #HIRAGANA LETTER KI +0xAAAE 0x304E #HIRAGANA LETTER GI +0xAAAF 0x304F #HIRAGANA LETTER KU +0xAAB0 0x3050 #HIRAGANA LETTER GU +0xAAB1 0x3051 #HIRAGANA LETTER KE +0xAAB2 0x3052 #HIRAGANA LETTER GE +0xAAB3 0x3053 #HIRAGANA LETTER KO +0xAAB4 0x3054 #HIRAGANA LETTER GO +0xAAB5 0x3055 #HIRAGANA LETTER SA +0xAAB6 0x3056 #HIRAGANA LETTER ZA +0xAAB7 0x3057 #HIRAGANA LETTER SI +0xAAB8 0x3058 #HIRAGANA LETTER ZI +0xAAB9 0x3059 #HIRAGANA LETTER SU +0xAABA 0x305A #HIRAGANA LETTER ZU +0xAABB 0x305B #HIRAGANA LETTER SE +0xAABC 0x305C #HIRAGANA LETTER ZE +0xAABD 0x305D #HIRAGANA LETTER SO +0xAABE 0x305E #HIRAGANA LETTER ZO +0xAABF 0x305F #HIRAGANA LETTER TA +0xAAC0 0x3060 #HIRAGANA LETTER DA +0xAAC1 0x3061 #HIRAGANA LETTER TI +0xAAC2 0x3062 #HIRAGANA LETTER DI +0xAAC3 0x3063 #HIRAGANA LETTER SMALL TU +0xAAC4 0x3064 #HIRAGANA LETTER TU +0xAAC5 0x3065 #HIRAGANA LETTER DU +0xAAC6 0x3066 #HIRAGANA LETTER TE +0xAAC7 0x3067 #HIRAGANA LETTER DE +0xAAC8 0x3068 #HIRAGANA LETTER TO +0xAAC9 0x3069 #HIRAGANA LETTER DO +0xAACA 0x306A #HIRAGANA LETTER NA +0xAACB 0x306B #HIRAGANA LETTER NI +0xAACC 0x306C #HIRAGANA LETTER NU +0xAACD 0x306D #HIRAGANA LETTER NE +0xAACE 0x306E #HIRAGANA LETTER NO +0xAACF 0x306F #HIRAGANA LETTER HA +0xAAD0 0x3070 #HIRAGANA LETTER BA +0xAAD1 0x3071 #HIRAGANA LETTER PA +0xAAD2 0x3072 #HIRAGANA LETTER HI +0xAAD3 0x3073 #HIRAGANA LETTER BI +0xAAD4 0x3074 #HIRAGANA LETTER PI +0xAAD5 0x3075 #HIRAGANA LETTER HU +0xAAD6 0x3076 #HIRAGANA LETTER BU +0xAAD7 0x3077 #HIRAGANA LETTER PU +0xAAD8 0x3078 #HIRAGANA LETTER HE +0xAAD9 0x3079 #HIRAGANA LETTER BE +0xAADA 0x307A #HIRAGANA LETTER PE +0xAADB 0x307B #HIRAGANA LETTER HO +0xAADC 0x307C #HIRAGANA LETTER BO +0xAADD 0x307D #HIRAGANA LETTER PO +0xAADE 0x307E #HIRAGANA LETTER MA +0xAADF 0x307F #HIRAGANA LETTER MI +0xAAE0 0x3080 #HIRAGANA LETTER MU +0xAAE1 0x3081 #HIRAGANA LETTER ME +0xAAE2 0x3082 #HIRAGANA LETTER MO +0xAAE3 0x3083 #HIRAGANA LETTER SMALL YA +0xAAE4 0x3084 #HIRAGANA LETTER YA +0xAAE5 0x3085 #HIRAGANA LETTER SMALL YU +0xAAE6 0x3086 #HIRAGANA LETTER YU +0xAAE7 0x3087 #HIRAGANA LETTER SMALL YO +0xAAE8 0x3088 #HIRAGANA LETTER YO +0xAAE9 0x3089 #HIRAGANA LETTER RA +0xAAEA 0x308A #HIRAGANA LETTER RI +0xAAEB 0x308B #HIRAGANA LETTER RU +0xAAEC 0x308C #HIRAGANA LETTER RE +0xAAED 0x308D #HIRAGANA LETTER RO +0xAAEE 0x308E #HIRAGANA LETTER SMALL WA +0xAAEF 0x308F #HIRAGANA LETTER WA +0xAAF0 0x3090 #HIRAGANA LETTER WI +0xAAF1 0x3091 #HIRAGANA LETTER WE +0xAAF2 0x3092 #HIRAGANA LETTER WO +0xAAF3 0x3093 #HIRAGANA LETTER N +0xAB41 0xCC94 #HANGUL SYLLABLE CHIEUCH YAE KHIEUKH +0xAB42 0xCC95 #HANGUL SYLLABLE CHIEUCH YAE THIEUTH +0xAB43 0xCC96 #HANGUL SYLLABLE CHIEUCH YAE PHIEUPH +0xAB44 0xCC97 #HANGUL SYLLABLE CHIEUCH YAE HIEUH +0xAB45 0xCC9A #HANGUL SYLLABLE CHIEUCH EO SSANGKIYEOK +0xAB46 0xCC9B #HANGUL SYLLABLE CHIEUCH EO KIYEOKSIOS +0xAB47 0xCC9D #HANGUL SYLLABLE CHIEUCH EO NIEUNCIEUC +0xAB48 0xCC9E #HANGUL SYLLABLE CHIEUCH EO NIEUNHIEUH +0xAB49 0xCC9F #HANGUL SYLLABLE CHIEUCH EO TIKEUT +0xAB4A 0xCCA1 #HANGUL SYLLABLE CHIEUCH EO RIEULKIYEOK +0xAB4B 0xCCA2 #HANGUL SYLLABLE CHIEUCH EO RIEULMIEUM +0xAB4C 0xCCA3 #HANGUL SYLLABLE CHIEUCH EO RIEULPIEUP +0xAB4D 0xCCA4 #HANGUL SYLLABLE CHIEUCH EO RIEULSIOS +0xAB4E 0xCCA5 #HANGUL SYLLABLE CHIEUCH EO RIEULTHIEUTH +0xAB4F 0xCCA6 #HANGUL SYLLABLE CHIEUCH EO RIEULPHIEUPH +0xAB50 0xCCA7 #HANGUL SYLLABLE CHIEUCH EO RIEULHIEUH +0xAB51 0xCCAA #HANGUL SYLLABLE CHIEUCH EO PIEUPSIOS +0xAB52 0xCCAE #HANGUL SYLLABLE CHIEUCH EO CIEUC +0xAB53 0xCCAF #HANGUL SYLLABLE CHIEUCH EO CHIEUCH +0xAB54 0xCCB0 #HANGUL SYLLABLE CHIEUCH EO KHIEUKH +0xAB55 0xCCB1 #HANGUL SYLLABLE CHIEUCH EO THIEUTH +0xAB56 0xCCB2 #HANGUL SYLLABLE CHIEUCH EO PHIEUPH +0xAB57 0xCCB3 #HANGUL SYLLABLE CHIEUCH EO HIEUH +0xAB58 0xCCB6 #HANGUL SYLLABLE CHIEUCH E SSANGKIYEOK +0xAB59 0xCCB7 #HANGUL SYLLABLE CHIEUCH E KIYEOKSIOS +0xAB5A 0xCCB9 #HANGUL SYLLABLE CHIEUCH E NIEUNCIEUC +0xAB61 0xCCBA #HANGUL SYLLABLE CHIEUCH E NIEUNHIEUH +0xAB62 0xCCBB #HANGUL SYLLABLE CHIEUCH E TIKEUT +0xAB63 0xCCBD #HANGUL SYLLABLE CHIEUCH E RIEULKIYEOK +0xAB64 0xCCBE #HANGUL SYLLABLE CHIEUCH E RIEULMIEUM +0xAB65 0xCCBF #HANGUL SYLLABLE CHIEUCH E RIEULPIEUP +0xAB66 0xCCC0 #HANGUL SYLLABLE CHIEUCH E RIEULSIOS +0xAB67 0xCCC1 #HANGUL SYLLABLE CHIEUCH E RIEULTHIEUTH +0xAB68 0xCCC2 #HANGUL SYLLABLE CHIEUCH E RIEULPHIEUPH +0xAB69 0xCCC3 #HANGUL SYLLABLE CHIEUCH E RIEULHIEUH +0xAB6A 0xCCC6 #HANGUL SYLLABLE CHIEUCH E PIEUPSIOS +0xAB6B 0xCCC8 #HANGUL SYLLABLE CHIEUCH E SSANGSIOS +0xAB6C 0xCCCA #HANGUL SYLLABLE CHIEUCH E CIEUC +0xAB6D 0xCCCB #HANGUL SYLLABLE CHIEUCH E CHIEUCH +0xAB6E 0xCCCC #HANGUL SYLLABLE CHIEUCH E KHIEUKH +0xAB6F 0xCCCD #HANGUL SYLLABLE CHIEUCH E THIEUTH +0xAB70 0xCCCE #HANGUL SYLLABLE CHIEUCH E PHIEUPH +0xAB71 0xCCCF #HANGUL SYLLABLE CHIEUCH E HIEUH +0xAB72 0xCCD1 #HANGUL SYLLABLE CHIEUCH YEO KIYEOK +0xAB73 0xCCD2 #HANGUL SYLLABLE CHIEUCH YEO SSANGKIYEOK +0xAB74 0xCCD3 #HANGUL SYLLABLE CHIEUCH YEO KIYEOKSIOS +0xAB75 0xCCD5 #HANGUL SYLLABLE CHIEUCH YEO NIEUNCIEUC +0xAB76 0xCCD6 #HANGUL SYLLABLE CHIEUCH YEO NIEUNHIEUH +0xAB77 0xCCD7 #HANGUL SYLLABLE CHIEUCH YEO TIKEUT +0xAB78 0xCCD8 #HANGUL SYLLABLE CHIEUCH YEO RIEUL +0xAB79 0xCCD9 #HANGUL SYLLABLE CHIEUCH YEO RIEULKIYEOK +0xAB7A 0xCCDA #HANGUL SYLLABLE CHIEUCH YEO RIEULMIEUM +0xAB81 0xCCDB #HANGUL SYLLABLE CHIEUCH YEO RIEULPIEUP +0xAB82 0xCCDC #HANGUL SYLLABLE CHIEUCH YEO RIEULSIOS +0xAB83 0xCCDD #HANGUL SYLLABLE CHIEUCH YEO RIEULTHIEUTH +0xAB84 0xCCDE #HANGUL SYLLABLE CHIEUCH YEO RIEULPHIEUPH +0xAB85 0xCCDF #HANGUL SYLLABLE CHIEUCH YEO RIEULHIEUH +0xAB86 0xCCE0 #HANGUL SYLLABLE CHIEUCH YEO MIEUM +0xAB87 0xCCE1 #HANGUL SYLLABLE CHIEUCH YEO PIEUP +0xAB88 0xCCE2 #HANGUL SYLLABLE CHIEUCH YEO PIEUPSIOS +0xAB89 0xCCE3 #HANGUL SYLLABLE CHIEUCH YEO SIOS +0xAB8A 0xCCE5 #HANGUL SYLLABLE CHIEUCH YEO IEUNG +0xAB8B 0xCCE6 #HANGUL SYLLABLE CHIEUCH YEO CIEUC +0xAB8C 0xCCE7 #HANGUL SYLLABLE CHIEUCH YEO CHIEUCH +0xAB8D 0xCCE8 #HANGUL SYLLABLE CHIEUCH YEO KHIEUKH +0xAB8E 0xCCE9 #HANGUL SYLLABLE CHIEUCH YEO THIEUTH +0xAB8F 0xCCEA #HANGUL SYLLABLE CHIEUCH YEO PHIEUPH +0xAB90 0xCCEB #HANGUL SYLLABLE CHIEUCH YEO HIEUH +0xAB91 0xCCED #HANGUL SYLLABLE CHIEUCH YE KIYEOK +0xAB92 0xCCEE #HANGUL SYLLABLE CHIEUCH YE SSANGKIYEOK +0xAB93 0xCCEF #HANGUL SYLLABLE CHIEUCH YE KIYEOKSIOS +0xAB94 0xCCF1 #HANGUL SYLLABLE CHIEUCH YE NIEUNCIEUC +0xAB95 0xCCF2 #HANGUL SYLLABLE CHIEUCH YE NIEUNHIEUH +0xAB96 0xCCF3 #HANGUL SYLLABLE CHIEUCH YE TIKEUT +0xAB97 0xCCF4 #HANGUL SYLLABLE CHIEUCH YE RIEUL +0xAB98 0xCCF5 #HANGUL SYLLABLE CHIEUCH YE RIEULKIYEOK +0xAB99 0xCCF6 #HANGUL SYLLABLE CHIEUCH YE RIEULMIEUM +0xAB9A 0xCCF7 #HANGUL SYLLABLE CHIEUCH YE RIEULPIEUP +0xAB9B 0xCCF8 #HANGUL SYLLABLE CHIEUCH YE RIEULSIOS +0xAB9C 0xCCF9 #HANGUL SYLLABLE CHIEUCH YE RIEULTHIEUTH +0xAB9D 0xCCFA #HANGUL SYLLABLE CHIEUCH YE RIEULPHIEUPH +0xAB9E 0xCCFB #HANGUL SYLLABLE CHIEUCH YE RIEULHIEUH +0xAB9F 0xCCFC #HANGUL SYLLABLE CHIEUCH YE MIEUM +0xABA0 0xCCFD #HANGUL SYLLABLE CHIEUCH YE PIEUP +0xABA1 0x30A1 #KATAKANA LETTER SMALL A +0xABA2 0x30A2 #KATAKANA LETTER A +0xABA3 0x30A3 #KATAKANA LETTER SMALL I +0xABA4 0x30A4 #KATAKANA LETTER I +0xABA5 0x30A5 #KATAKANA LETTER SMALL U +0xABA6 0x30A6 #KATAKANA LETTER U +0xABA7 0x30A7 #KATAKANA LETTER SMALL E +0xABA8 0x30A8 #KATAKANA LETTER E +0xABA9 0x30A9 #KATAKANA LETTER SMALL O +0xABAA 0x30AA #KATAKANA LETTER O +0xABAB 0x30AB #KATAKANA LETTER KA +0xABAC 0x30AC #KATAKANA LETTER GA +0xABAD 0x30AD #KATAKANA LETTER KI +0xABAE 0x30AE #KATAKANA LETTER GI +0xABAF 0x30AF #KATAKANA LETTER KU +0xABB0 0x30B0 #KATAKANA LETTER GU +0xABB1 0x30B1 #KATAKANA LETTER KE +0xABB2 0x30B2 #KATAKANA LETTER GE +0xABB3 0x30B3 #KATAKANA LETTER KO +0xABB4 0x30B4 #KATAKANA LETTER GO +0xABB5 0x30B5 #KATAKANA LETTER SA +0xABB6 0x30B6 #KATAKANA LETTER ZA +0xABB7 0x30B7 #KATAKANA LETTER SI +0xABB8 0x30B8 #KATAKANA LETTER ZI +0xABB9 0x30B9 #KATAKANA LETTER SU +0xABBA 0x30BA #KATAKANA LETTER ZU +0xABBB 0x30BB #KATAKANA LETTER SE +0xABBC 0x30BC #KATAKANA LETTER ZE +0xABBD 0x30BD #KATAKANA LETTER SO +0xABBE 0x30BE #KATAKANA LETTER ZO +0xABBF 0x30BF #KATAKANA LETTER TA +0xABC0 0x30C0 #KATAKANA LETTER DA +0xABC1 0x30C1 #KATAKANA LETTER TI +0xABC2 0x30C2 #KATAKANA LETTER DI +0xABC3 0x30C3 #KATAKANA LETTER SMALL TU +0xABC4 0x30C4 #KATAKANA LETTER TU +0xABC5 0x30C5 #KATAKANA LETTER DU +0xABC6 0x30C6 #KATAKANA LETTER TE +0xABC7 0x30C7 #KATAKANA LETTER DE +0xABC8 0x30C8 #KATAKANA LETTER TO +0xABC9 0x30C9 #KATAKANA LETTER DO +0xABCA 0x30CA #KATAKANA LETTER NA +0xABCB 0x30CB #KATAKANA LETTER NI +0xABCC 0x30CC #KATAKANA LETTER NU +0xABCD 0x30CD #KATAKANA LETTER NE +0xABCE 0x30CE #KATAKANA LETTER NO +0xABCF 0x30CF #KATAKANA LETTER HA +0xABD0 0x30D0 #KATAKANA LETTER BA +0xABD1 0x30D1 #KATAKANA LETTER PA +0xABD2 0x30D2 #KATAKANA LETTER HI +0xABD3 0x30D3 #KATAKANA LETTER BI +0xABD4 0x30D4 #KATAKANA LETTER PI +0xABD5 0x30D5 #KATAKANA LETTER HU +0xABD6 0x30D6 #KATAKANA LETTER BU +0xABD7 0x30D7 #KATAKANA LETTER PU +0xABD8 0x30D8 #KATAKANA LETTER HE +0xABD9 0x30D9 #KATAKANA LETTER BE +0xABDA 0x30DA #KATAKANA LETTER PE +0xABDB 0x30DB #KATAKANA LETTER HO +0xABDC 0x30DC #KATAKANA LETTER BO +0xABDD 0x30DD #KATAKANA LETTER PO +0xABDE 0x30DE #KATAKANA LETTER MA +0xABDF 0x30DF #KATAKANA LETTER MI +0xABE0 0x30E0 #KATAKANA LETTER MU +0xABE1 0x30E1 #KATAKANA LETTER ME +0xABE2 0x30E2 #KATAKANA LETTER MO +0xABE3 0x30E3 #KATAKANA LETTER SMALL YA +0xABE4 0x30E4 #KATAKANA LETTER YA +0xABE5 0x30E5 #KATAKANA LETTER SMALL YU +0xABE6 0x30E6 #KATAKANA LETTER YU +0xABE7 0x30E7 #KATAKANA LETTER SMALL YO +0xABE8 0x30E8 #KATAKANA LETTER YO +0xABE9 0x30E9 #KATAKANA LETTER RA +0xABEA 0x30EA #KATAKANA LETTER RI +0xABEB 0x30EB #KATAKANA LETTER RU +0xABEC 0x30EC #KATAKANA LETTER RE +0xABED 0x30ED #KATAKANA LETTER RO +0xABEE 0x30EE #KATAKANA LETTER SMALL WA +0xABEF 0x30EF #KATAKANA LETTER WA +0xABF0 0x30F0 #KATAKANA LETTER WI +0xABF1 0x30F1 #KATAKANA LETTER WE +0xABF2 0x30F2 #KATAKANA LETTER WO +0xABF3 0x30F3 #KATAKANA LETTER N +0xABF4 0x30F4 #KATAKANA LETTER VU +0xABF5 0x30F5 #KATAKANA LETTER SMALL KA +0xABF6 0x30F6 #KATAKANA LETTER SMALL KE +0xAC41 0xCCFE #HANGUL SYLLABLE CHIEUCH YE PIEUPSIOS +0xAC42 0xCCFF #HANGUL SYLLABLE CHIEUCH YE SIOS +0xAC43 0xCD00 #HANGUL SYLLABLE CHIEUCH YE SSANGSIOS +0xAC44 0xCD02 #HANGUL SYLLABLE CHIEUCH YE CIEUC +0xAC45 0xCD03 #HANGUL SYLLABLE CHIEUCH YE CHIEUCH +0xAC46 0xCD04 #HANGUL SYLLABLE CHIEUCH YE KHIEUKH +0xAC47 0xCD05 #HANGUL SYLLABLE CHIEUCH YE THIEUTH +0xAC48 0xCD06 #HANGUL SYLLABLE CHIEUCH YE PHIEUPH +0xAC49 0xCD07 #HANGUL SYLLABLE CHIEUCH YE HIEUH +0xAC4A 0xCD0A #HANGUL SYLLABLE CHIEUCH O SSANGKIYEOK +0xAC4B 0xCD0B #HANGUL SYLLABLE CHIEUCH O KIYEOKSIOS +0xAC4C 0xCD0D #HANGUL SYLLABLE CHIEUCH O NIEUNCIEUC +0xAC4D 0xCD0E #HANGUL SYLLABLE CHIEUCH O NIEUNHIEUH +0xAC4E 0xCD0F #HANGUL SYLLABLE CHIEUCH O TIKEUT +0xAC4F 0xCD11 #HANGUL SYLLABLE CHIEUCH O RIEULKIYEOK +0xAC50 0xCD12 #HANGUL SYLLABLE CHIEUCH O RIEULMIEUM +0xAC51 0xCD13 #HANGUL SYLLABLE CHIEUCH O RIEULPIEUP +0xAC52 0xCD14 #HANGUL SYLLABLE CHIEUCH O RIEULSIOS +0xAC53 0xCD15 #HANGUL SYLLABLE CHIEUCH O RIEULTHIEUTH +0xAC54 0xCD16 #HANGUL SYLLABLE CHIEUCH O RIEULPHIEUPH +0xAC55 0xCD17 #HANGUL SYLLABLE CHIEUCH O RIEULHIEUH +0xAC56 0xCD1A #HANGUL SYLLABLE CHIEUCH O PIEUPSIOS +0xAC57 0xCD1C #HANGUL SYLLABLE CHIEUCH O SSANGSIOS +0xAC58 0xCD1E #HANGUL SYLLABLE CHIEUCH O CIEUC +0xAC59 0xCD1F #HANGUL SYLLABLE CHIEUCH O CHIEUCH +0xAC5A 0xCD20 #HANGUL SYLLABLE CHIEUCH O KHIEUKH +0xAC61 0xCD21 #HANGUL SYLLABLE CHIEUCH O THIEUTH +0xAC62 0xCD22 #HANGUL SYLLABLE CHIEUCH O PHIEUPH +0xAC63 0xCD23 #HANGUL SYLLABLE CHIEUCH O HIEUH +0xAC64 0xCD25 #HANGUL SYLLABLE CHIEUCH WA KIYEOK +0xAC65 0xCD26 #HANGUL SYLLABLE CHIEUCH WA SSANGKIYEOK +0xAC66 0xCD27 #HANGUL SYLLABLE CHIEUCH WA KIYEOKSIOS +0xAC67 0xCD29 #HANGUL SYLLABLE CHIEUCH WA NIEUNCIEUC +0xAC68 0xCD2A #HANGUL SYLLABLE CHIEUCH WA NIEUNHIEUH +0xAC69 0xCD2B #HANGUL SYLLABLE CHIEUCH WA TIKEUT +0xAC6A 0xCD2D #HANGUL SYLLABLE CHIEUCH WA RIEULKIYEOK +0xAC6B 0xCD2E #HANGUL SYLLABLE CHIEUCH WA RIEULMIEUM +0xAC6C 0xCD2F #HANGUL SYLLABLE CHIEUCH WA RIEULPIEUP +0xAC6D 0xCD30 #HANGUL SYLLABLE CHIEUCH WA RIEULSIOS +0xAC6E 0xCD31 #HANGUL SYLLABLE CHIEUCH WA RIEULTHIEUTH +0xAC6F 0xCD32 #HANGUL SYLLABLE CHIEUCH WA RIEULPHIEUPH +0xAC70 0xCD33 #HANGUL SYLLABLE CHIEUCH WA RIEULHIEUH +0xAC71 0xCD34 #HANGUL SYLLABLE CHIEUCH WA MIEUM +0xAC72 0xCD35 #HANGUL SYLLABLE CHIEUCH WA PIEUP +0xAC73 0xCD36 #HANGUL SYLLABLE CHIEUCH WA PIEUPSIOS +0xAC74 0xCD37 #HANGUL SYLLABLE CHIEUCH WA SIOS +0xAC75 0xCD38 #HANGUL SYLLABLE CHIEUCH WA SSANGSIOS +0xAC76 0xCD3A #HANGUL SYLLABLE CHIEUCH WA CIEUC +0xAC77 0xCD3B #HANGUL SYLLABLE CHIEUCH WA CHIEUCH +0xAC78 0xCD3C #HANGUL SYLLABLE CHIEUCH WA KHIEUKH +0xAC79 0xCD3D #HANGUL SYLLABLE CHIEUCH WA THIEUTH +0xAC7A 0xCD3E #HANGUL SYLLABLE CHIEUCH WA PHIEUPH +0xAC81 0xCD3F #HANGUL SYLLABLE CHIEUCH WA HIEUH +0xAC82 0xCD40 #HANGUL SYLLABLE CHIEUCH WAE +0xAC83 0xCD41 #HANGUL SYLLABLE CHIEUCH WAE KIYEOK +0xAC84 0xCD42 #HANGUL SYLLABLE CHIEUCH WAE SSANGKIYEOK +0xAC85 0xCD43 #HANGUL SYLLABLE CHIEUCH WAE KIYEOKSIOS +0xAC86 0xCD44 #HANGUL SYLLABLE CHIEUCH WAE NIEUN +0xAC87 0xCD45 #HANGUL SYLLABLE CHIEUCH WAE NIEUNCIEUC +0xAC88 0xCD46 #HANGUL SYLLABLE CHIEUCH WAE NIEUNHIEUH +0xAC89 0xCD47 #HANGUL SYLLABLE CHIEUCH WAE TIKEUT +0xAC8A 0xCD48 #HANGUL SYLLABLE CHIEUCH WAE RIEUL +0xAC8B 0xCD49 #HANGUL SYLLABLE CHIEUCH WAE RIEULKIYEOK +0xAC8C 0xCD4A #HANGUL SYLLABLE CHIEUCH WAE RIEULMIEUM +0xAC8D 0xCD4B #HANGUL SYLLABLE CHIEUCH WAE RIEULPIEUP +0xAC8E 0xCD4C #HANGUL SYLLABLE CHIEUCH WAE RIEULSIOS +0xAC8F 0xCD4D #HANGUL SYLLABLE CHIEUCH WAE RIEULTHIEUTH +0xAC90 0xCD4E #HANGUL SYLLABLE CHIEUCH WAE RIEULPHIEUPH +0xAC91 0xCD4F #HANGUL SYLLABLE CHIEUCH WAE RIEULHIEUH +0xAC92 0xCD50 #HANGUL SYLLABLE CHIEUCH WAE MIEUM +0xAC93 0xCD51 #HANGUL SYLLABLE CHIEUCH WAE PIEUP +0xAC94 0xCD52 #HANGUL SYLLABLE CHIEUCH WAE PIEUPSIOS +0xAC95 0xCD53 #HANGUL SYLLABLE CHIEUCH WAE SIOS +0xAC96 0xCD54 #HANGUL SYLLABLE CHIEUCH WAE SSANGSIOS +0xAC97 0xCD55 #HANGUL SYLLABLE CHIEUCH WAE IEUNG +0xAC98 0xCD56 #HANGUL SYLLABLE CHIEUCH WAE CIEUC +0xAC99 0xCD57 #HANGUL SYLLABLE CHIEUCH WAE CHIEUCH +0xAC9A 0xCD58 #HANGUL SYLLABLE CHIEUCH WAE KHIEUKH +0xAC9B 0xCD59 #HANGUL SYLLABLE CHIEUCH WAE THIEUTH +0xAC9C 0xCD5A #HANGUL SYLLABLE CHIEUCH WAE PHIEUPH +0xAC9D 0xCD5B #HANGUL SYLLABLE CHIEUCH WAE HIEUH +0xAC9E 0xCD5D #HANGUL SYLLABLE CHIEUCH OE KIYEOK +0xAC9F 0xCD5E #HANGUL SYLLABLE CHIEUCH OE SSANGKIYEOK +0xACA0 0xCD5F #HANGUL SYLLABLE CHIEUCH OE KIYEOKSIOS +0xACA1 0x0410 #CYRILLIC CAPITAL LETTER A +0xACA2 0x0411 #CYRILLIC CAPITAL LETTER BE +0xACA3 0x0412 #CYRILLIC CAPITAL LETTER VE +0xACA4 0x0413 #CYRILLIC CAPITAL LETTER GHE +0xACA5 0x0414 #CYRILLIC CAPITAL LETTER DE +0xACA6 0x0415 #CYRILLIC CAPITAL LETTER IE +0xACA7 0x0401 #CYRILLIC CAPITAL LETTER IO +0xACA8 0x0416 #CYRILLIC CAPITAL LETTER ZHE +0xACA9 0x0417 #CYRILLIC CAPITAL LETTER ZE +0xACAA 0x0418 #CYRILLIC CAPITAL LETTER I +0xACAB 0x0419 #CYRILLIC CAPITAL LETTER SHORT I +0xACAC 0x041A #CYRILLIC CAPITAL LETTER KA +0xACAD 0x041B #CYRILLIC CAPITAL LETTER EL +0xACAE 0x041C #CYRILLIC CAPITAL LETTER EM +0xACAF 0x041D #CYRILLIC CAPITAL LETTER EN +0xACB0 0x041E #CYRILLIC CAPITAL LETTER O +0xACB1 0x041F #CYRILLIC CAPITAL LETTER PE +0xACB2 0x0420 #CYRILLIC CAPITAL LETTER ER +0xACB3 0x0421 #CYRILLIC CAPITAL LETTER ES +0xACB4 0x0422 #CYRILLIC CAPITAL LETTER TE +0xACB5 0x0423 #CYRILLIC CAPITAL LETTER U +0xACB6 0x0424 #CYRILLIC CAPITAL LETTER EF +0xACB7 0x0425 #CYRILLIC CAPITAL LETTER HA +0xACB8 0x0426 #CYRILLIC CAPITAL LETTER TSE +0xACB9 0x0427 #CYRILLIC CAPITAL LETTER CHE +0xACBA 0x0428 #CYRILLIC CAPITAL LETTER SHA +0xACBB 0x0429 #CYRILLIC CAPITAL LETTER SHCHA +0xACBC 0x042A #CYRILLIC CAPITAL LETTER HARD SIGN +0xACBD 0x042B #CYRILLIC CAPITAL LETTER YERU +0xACBE 0x042C #CYRILLIC CAPITAL LETTER SOFT SIGN +0xACBF 0x042D #CYRILLIC CAPITAL LETTER E +0xACC0 0x042E #CYRILLIC CAPITAL LETTER YU +0xACC1 0x042F #CYRILLIC CAPITAL LETTER YA +0xACD1 0x0430 #CYRILLIC SMALL LETTER A +0xACD2 0x0431 #CYRILLIC SMALL LETTER BE +0xACD3 0x0432 #CYRILLIC SMALL LETTER VE +0xACD4 0x0433 #CYRILLIC SMALL LETTER GHE +0xACD5 0x0434 #CYRILLIC SMALL LETTER DE +0xACD6 0x0435 #CYRILLIC SMALL LETTER IE +0xACD7 0x0451 #CYRILLIC SMALL LETTER IO +0xACD8 0x0436 #CYRILLIC SMALL LETTER ZHE +0xACD9 0x0437 #CYRILLIC SMALL LETTER ZE +0xACDA 0x0438 #CYRILLIC SMALL LETTER I +0xACDB 0x0439 #CYRILLIC SMALL LETTER SHORT I +0xACDC 0x043A #CYRILLIC SMALL LETTER KA +0xACDD 0x043B #CYRILLIC SMALL LETTER EL +0xACDE 0x043C #CYRILLIC SMALL LETTER EM +0xACDF 0x043D #CYRILLIC SMALL LETTER EN +0xACE0 0x043E #CYRILLIC SMALL LETTER O +0xACE1 0x043F #CYRILLIC SMALL LETTER PE +0xACE2 0x0440 #CYRILLIC SMALL LETTER ER +0xACE3 0x0441 #CYRILLIC SMALL LETTER ES +0xACE4 0x0442 #CYRILLIC SMALL LETTER TE +0xACE5 0x0443 #CYRILLIC SMALL LETTER U +0xACE6 0x0444 #CYRILLIC SMALL LETTER EF +0xACE7 0x0445 #CYRILLIC SMALL LETTER HA +0xACE8 0x0446 #CYRILLIC SMALL LETTER TSE +0xACE9 0x0447 #CYRILLIC SMALL LETTER CHE +0xACEA 0x0448 #CYRILLIC SMALL LETTER SHA +0xACEB 0x0449 #CYRILLIC SMALL LETTER SHCHA +0xACEC 0x044A #CYRILLIC SMALL LETTER HARD SIGN +0xACED 0x044B #CYRILLIC SMALL LETTER YERU +0xACEE 0x044C #CYRILLIC SMALL LETTER SOFT SIGN +0xACEF 0x044D #CYRILLIC SMALL LETTER E +0xACF0 0x044E #CYRILLIC SMALL LETTER YU +0xACF1 0x044F #CYRILLIC SMALL LETTER YA +0xAD41 0xCD61 #HANGUL SYLLABLE CHIEUCH OE NIEUNCIEUC +0xAD42 0xCD62 #HANGUL SYLLABLE CHIEUCH OE NIEUNHIEUH +0xAD43 0xCD63 #HANGUL SYLLABLE CHIEUCH OE TIKEUT +0xAD44 0xCD65 #HANGUL SYLLABLE CHIEUCH OE RIEULKIYEOK +0xAD45 0xCD66 #HANGUL SYLLABLE CHIEUCH OE RIEULMIEUM +0xAD46 0xCD67 #HANGUL SYLLABLE CHIEUCH OE RIEULPIEUP +0xAD47 0xCD68 #HANGUL SYLLABLE CHIEUCH OE RIEULSIOS +0xAD48 0xCD69 #HANGUL SYLLABLE CHIEUCH OE RIEULTHIEUTH +0xAD49 0xCD6A #HANGUL SYLLABLE CHIEUCH OE RIEULPHIEUPH +0xAD4A 0xCD6B #HANGUL SYLLABLE CHIEUCH OE RIEULHIEUH +0xAD4B 0xCD6E #HANGUL SYLLABLE CHIEUCH OE PIEUPSIOS +0xAD4C 0xCD70 #HANGUL SYLLABLE CHIEUCH OE SSANGSIOS +0xAD4D 0xCD72 #HANGUL SYLLABLE CHIEUCH OE CIEUC +0xAD4E 0xCD73 #HANGUL SYLLABLE CHIEUCH OE CHIEUCH +0xAD4F 0xCD74 #HANGUL SYLLABLE CHIEUCH OE KHIEUKH +0xAD50 0xCD75 #HANGUL SYLLABLE CHIEUCH OE THIEUTH +0xAD51 0xCD76 #HANGUL SYLLABLE CHIEUCH OE PHIEUPH +0xAD52 0xCD77 #HANGUL SYLLABLE CHIEUCH OE HIEUH +0xAD53 0xCD79 #HANGUL SYLLABLE CHIEUCH YO KIYEOK +0xAD54 0xCD7A #HANGUL SYLLABLE CHIEUCH YO SSANGKIYEOK +0xAD55 0xCD7B #HANGUL SYLLABLE CHIEUCH YO KIYEOKSIOS +0xAD56 0xCD7C #HANGUL SYLLABLE CHIEUCH YO NIEUN +0xAD57 0xCD7D #HANGUL SYLLABLE CHIEUCH YO NIEUNCIEUC +0xAD58 0xCD7E #HANGUL SYLLABLE CHIEUCH YO NIEUNHIEUH +0xAD59 0xCD7F #HANGUL SYLLABLE CHIEUCH YO TIKEUT +0xAD5A 0xCD80 #HANGUL SYLLABLE CHIEUCH YO RIEUL +0xAD61 0xCD81 #HANGUL SYLLABLE CHIEUCH YO RIEULKIYEOK +0xAD62 0xCD82 #HANGUL SYLLABLE CHIEUCH YO RIEULMIEUM +0xAD63 0xCD83 #HANGUL SYLLABLE CHIEUCH YO RIEULPIEUP +0xAD64 0xCD84 #HANGUL SYLLABLE CHIEUCH YO RIEULSIOS +0xAD65 0xCD85 #HANGUL SYLLABLE CHIEUCH YO RIEULTHIEUTH +0xAD66 0xCD86 #HANGUL SYLLABLE CHIEUCH YO RIEULPHIEUPH +0xAD67 0xCD87 #HANGUL SYLLABLE CHIEUCH YO RIEULHIEUH +0xAD68 0xCD89 #HANGUL SYLLABLE CHIEUCH YO PIEUP +0xAD69 0xCD8A #HANGUL SYLLABLE CHIEUCH YO PIEUPSIOS +0xAD6A 0xCD8B #HANGUL SYLLABLE CHIEUCH YO SIOS +0xAD6B 0xCD8C #HANGUL SYLLABLE CHIEUCH YO SSANGSIOS +0xAD6C 0xCD8D #HANGUL SYLLABLE CHIEUCH YO IEUNG +0xAD6D 0xCD8E #HANGUL SYLLABLE CHIEUCH YO CIEUC +0xAD6E 0xCD8F #HANGUL SYLLABLE CHIEUCH YO CHIEUCH +0xAD6F 0xCD90 #HANGUL SYLLABLE CHIEUCH YO KHIEUKH +0xAD70 0xCD91 #HANGUL SYLLABLE CHIEUCH YO THIEUTH +0xAD71 0xCD92 #HANGUL SYLLABLE CHIEUCH YO PHIEUPH +0xAD72 0xCD93 #HANGUL SYLLABLE CHIEUCH YO HIEUH +0xAD73 0xCD96 #HANGUL SYLLABLE CHIEUCH U SSANGKIYEOK +0xAD74 0xCD97 #HANGUL SYLLABLE CHIEUCH U KIYEOKSIOS +0xAD75 0xCD99 #HANGUL SYLLABLE CHIEUCH U NIEUNCIEUC +0xAD76 0xCD9A #HANGUL SYLLABLE CHIEUCH U NIEUNHIEUH +0xAD77 0xCD9B #HANGUL SYLLABLE CHIEUCH U TIKEUT +0xAD78 0xCD9D #HANGUL SYLLABLE CHIEUCH U RIEULKIYEOK +0xAD79 0xCD9E #HANGUL SYLLABLE CHIEUCH U RIEULMIEUM +0xAD7A 0xCD9F #HANGUL SYLLABLE CHIEUCH U RIEULPIEUP +0xAD81 0xCDA0 #HANGUL SYLLABLE CHIEUCH U RIEULSIOS +0xAD82 0xCDA1 #HANGUL SYLLABLE CHIEUCH U RIEULTHIEUTH +0xAD83 0xCDA2 #HANGUL SYLLABLE CHIEUCH U RIEULPHIEUPH +0xAD84 0xCDA3 #HANGUL SYLLABLE CHIEUCH U RIEULHIEUH +0xAD85 0xCDA6 #HANGUL SYLLABLE CHIEUCH U PIEUPSIOS +0xAD86 0xCDA8 #HANGUL SYLLABLE CHIEUCH U SSANGSIOS +0xAD87 0xCDAA #HANGUL SYLLABLE CHIEUCH U CIEUC +0xAD88 0xCDAB #HANGUL SYLLABLE CHIEUCH U CHIEUCH +0xAD89 0xCDAC #HANGUL SYLLABLE CHIEUCH U KHIEUKH +0xAD8A 0xCDAD #HANGUL SYLLABLE CHIEUCH U THIEUTH +0xAD8B 0xCDAE #HANGUL SYLLABLE CHIEUCH U PHIEUPH +0xAD8C 0xCDAF #HANGUL SYLLABLE CHIEUCH U HIEUH +0xAD8D 0xCDB1 #HANGUL SYLLABLE CHIEUCH WEO KIYEOK +0xAD8E 0xCDB2 #HANGUL SYLLABLE CHIEUCH WEO SSANGKIYEOK +0xAD8F 0xCDB3 #HANGUL SYLLABLE CHIEUCH WEO KIYEOKSIOS +0xAD90 0xCDB4 #HANGUL SYLLABLE CHIEUCH WEO NIEUN +0xAD91 0xCDB5 #HANGUL SYLLABLE CHIEUCH WEO NIEUNCIEUC +0xAD92 0xCDB6 #HANGUL SYLLABLE CHIEUCH WEO NIEUNHIEUH +0xAD93 0xCDB7 #HANGUL SYLLABLE CHIEUCH WEO TIKEUT +0xAD94 0xCDB8 #HANGUL SYLLABLE CHIEUCH WEO RIEUL +0xAD95 0xCDB9 #HANGUL SYLLABLE CHIEUCH WEO RIEULKIYEOK +0xAD96 0xCDBA #HANGUL SYLLABLE CHIEUCH WEO RIEULMIEUM +0xAD97 0xCDBB #HANGUL SYLLABLE CHIEUCH WEO RIEULPIEUP +0xAD98 0xCDBC #HANGUL SYLLABLE CHIEUCH WEO RIEULSIOS +0xAD99 0xCDBD #HANGUL SYLLABLE CHIEUCH WEO RIEULTHIEUTH +0xAD9A 0xCDBE #HANGUL SYLLABLE CHIEUCH WEO RIEULPHIEUPH +0xAD9B 0xCDBF #HANGUL SYLLABLE CHIEUCH WEO RIEULHIEUH +0xAD9C 0xCDC0 #HANGUL SYLLABLE CHIEUCH WEO MIEUM +0xAD9D 0xCDC1 #HANGUL SYLLABLE CHIEUCH WEO PIEUP +0xAD9E 0xCDC2 #HANGUL SYLLABLE CHIEUCH WEO PIEUPSIOS +0xAD9F 0xCDC3 #HANGUL SYLLABLE CHIEUCH WEO SIOS +0xADA0 0xCDC5 #HANGUL SYLLABLE CHIEUCH WEO IEUNG +0xAE41 0xCDC6 #HANGUL SYLLABLE CHIEUCH WEO CIEUC +0xAE42 0xCDC7 #HANGUL SYLLABLE CHIEUCH WEO CHIEUCH +0xAE43 0xCDC8 #HANGUL SYLLABLE CHIEUCH WEO KHIEUKH +0xAE44 0xCDC9 #HANGUL SYLLABLE CHIEUCH WEO THIEUTH +0xAE45 0xCDCA #HANGUL SYLLABLE CHIEUCH WEO PHIEUPH +0xAE46 0xCDCB #HANGUL SYLLABLE CHIEUCH WEO HIEUH +0xAE47 0xCDCD #HANGUL SYLLABLE CHIEUCH WE KIYEOK +0xAE48 0xCDCE #HANGUL SYLLABLE CHIEUCH WE SSANGKIYEOK +0xAE49 0xCDCF #HANGUL SYLLABLE CHIEUCH WE KIYEOKSIOS +0xAE4A 0xCDD1 #HANGUL SYLLABLE CHIEUCH WE NIEUNCIEUC +0xAE4B 0xCDD2 #HANGUL SYLLABLE CHIEUCH WE NIEUNHIEUH +0xAE4C 0xCDD3 #HANGUL SYLLABLE CHIEUCH WE TIKEUT +0xAE4D 0xCDD4 #HANGUL SYLLABLE CHIEUCH WE RIEUL +0xAE4E 0xCDD5 #HANGUL SYLLABLE CHIEUCH WE RIEULKIYEOK +0xAE4F 0xCDD6 #HANGUL SYLLABLE CHIEUCH WE RIEULMIEUM +0xAE50 0xCDD7 #HANGUL SYLLABLE CHIEUCH WE RIEULPIEUP +0xAE51 0xCDD8 #HANGUL SYLLABLE CHIEUCH WE RIEULSIOS +0xAE52 0xCDD9 #HANGUL SYLLABLE CHIEUCH WE RIEULTHIEUTH +0xAE53 0xCDDA #HANGUL SYLLABLE CHIEUCH WE RIEULPHIEUPH +0xAE54 0xCDDB #HANGUL SYLLABLE CHIEUCH WE RIEULHIEUH +0xAE55 0xCDDC #HANGUL SYLLABLE CHIEUCH WE MIEUM +0xAE56 0xCDDD #HANGUL SYLLABLE CHIEUCH WE PIEUP +0xAE57 0xCDDE #HANGUL SYLLABLE CHIEUCH WE PIEUPSIOS +0xAE58 0xCDDF #HANGUL SYLLABLE CHIEUCH WE SIOS +0xAE59 0xCDE0 #HANGUL SYLLABLE CHIEUCH WE SSANGSIOS +0xAE5A 0xCDE1 #HANGUL SYLLABLE CHIEUCH WE IEUNG +0xAE61 0xCDE2 #HANGUL SYLLABLE CHIEUCH WE CIEUC +0xAE62 0xCDE3 #HANGUL SYLLABLE CHIEUCH WE CHIEUCH +0xAE63 0xCDE4 #HANGUL SYLLABLE CHIEUCH WE KHIEUKH +0xAE64 0xCDE5 #HANGUL SYLLABLE CHIEUCH WE THIEUTH +0xAE65 0xCDE6 #HANGUL SYLLABLE CHIEUCH WE PHIEUPH +0xAE66 0xCDE7 #HANGUL SYLLABLE CHIEUCH WE HIEUH +0xAE67 0xCDE9 #HANGUL SYLLABLE CHIEUCH WI KIYEOK +0xAE68 0xCDEA #HANGUL SYLLABLE CHIEUCH WI SSANGKIYEOK +0xAE69 0xCDEB #HANGUL SYLLABLE CHIEUCH WI KIYEOKSIOS +0xAE6A 0xCDED #HANGUL SYLLABLE CHIEUCH WI NIEUNCIEUC +0xAE6B 0xCDEE #HANGUL SYLLABLE CHIEUCH WI NIEUNHIEUH +0xAE6C 0xCDEF #HANGUL SYLLABLE CHIEUCH WI TIKEUT +0xAE6D 0xCDF1 #HANGUL SYLLABLE CHIEUCH WI RIEULKIYEOK +0xAE6E 0xCDF2 #HANGUL SYLLABLE CHIEUCH WI RIEULMIEUM +0xAE6F 0xCDF3 #HANGUL SYLLABLE CHIEUCH WI RIEULPIEUP +0xAE70 0xCDF4 #HANGUL SYLLABLE CHIEUCH WI RIEULSIOS +0xAE71 0xCDF5 #HANGUL SYLLABLE CHIEUCH WI RIEULTHIEUTH +0xAE72 0xCDF6 #HANGUL SYLLABLE CHIEUCH WI RIEULPHIEUPH +0xAE73 0xCDF7 #HANGUL SYLLABLE CHIEUCH WI RIEULHIEUH +0xAE74 0xCDFA #HANGUL SYLLABLE CHIEUCH WI PIEUPSIOS +0xAE75 0xCDFC #HANGUL SYLLABLE CHIEUCH WI SSANGSIOS +0xAE76 0xCDFE #HANGUL SYLLABLE CHIEUCH WI CIEUC +0xAE77 0xCDFF #HANGUL SYLLABLE CHIEUCH WI CHIEUCH +0xAE78 0xCE00 #HANGUL SYLLABLE CHIEUCH WI KHIEUKH +0xAE79 0xCE01 #HANGUL SYLLABLE CHIEUCH WI THIEUTH +0xAE7A 0xCE02 #HANGUL SYLLABLE CHIEUCH WI PHIEUPH +0xAE81 0xCE03 #HANGUL SYLLABLE CHIEUCH WI HIEUH +0xAE82 0xCE05 #HANGUL SYLLABLE CHIEUCH YU KIYEOK +0xAE83 0xCE06 #HANGUL SYLLABLE CHIEUCH YU SSANGKIYEOK +0xAE84 0xCE07 #HANGUL SYLLABLE CHIEUCH YU KIYEOKSIOS +0xAE85 0xCE09 #HANGUL SYLLABLE CHIEUCH YU NIEUNCIEUC +0xAE86 0xCE0A #HANGUL SYLLABLE CHIEUCH YU NIEUNHIEUH +0xAE87 0xCE0B #HANGUL SYLLABLE CHIEUCH YU TIKEUT +0xAE88 0xCE0D #HANGUL SYLLABLE CHIEUCH YU RIEULKIYEOK +0xAE89 0xCE0E #HANGUL SYLLABLE CHIEUCH YU RIEULMIEUM +0xAE8A 0xCE0F #HANGUL SYLLABLE CHIEUCH YU RIEULPIEUP +0xAE8B 0xCE10 #HANGUL SYLLABLE CHIEUCH YU RIEULSIOS +0xAE8C 0xCE11 #HANGUL SYLLABLE CHIEUCH YU RIEULTHIEUTH +0xAE8D 0xCE12 #HANGUL SYLLABLE CHIEUCH YU RIEULPHIEUPH +0xAE8E 0xCE13 #HANGUL SYLLABLE CHIEUCH YU RIEULHIEUH +0xAE8F 0xCE15 #HANGUL SYLLABLE CHIEUCH YU PIEUP +0xAE90 0xCE16 #HANGUL SYLLABLE CHIEUCH YU PIEUPSIOS +0xAE91 0xCE17 #HANGUL SYLLABLE CHIEUCH YU SIOS +0xAE92 0xCE18 #HANGUL SYLLABLE CHIEUCH YU SSANGSIOS +0xAE93 0xCE1A #HANGUL SYLLABLE CHIEUCH YU CIEUC +0xAE94 0xCE1B #HANGUL SYLLABLE CHIEUCH YU CHIEUCH +0xAE95 0xCE1C #HANGUL SYLLABLE CHIEUCH YU KHIEUKH +0xAE96 0xCE1D #HANGUL SYLLABLE CHIEUCH YU THIEUTH +0xAE97 0xCE1E #HANGUL SYLLABLE CHIEUCH YU PHIEUPH +0xAE98 0xCE1F #HANGUL SYLLABLE CHIEUCH YU HIEUH +0xAE99 0xCE22 #HANGUL SYLLABLE CHIEUCH EU SSANGKIYEOK +0xAE9A 0xCE23 #HANGUL SYLLABLE CHIEUCH EU KIYEOKSIOS +0xAE9B 0xCE25 #HANGUL SYLLABLE CHIEUCH EU NIEUNCIEUC +0xAE9C 0xCE26 #HANGUL SYLLABLE CHIEUCH EU NIEUNHIEUH +0xAE9D 0xCE27 #HANGUL SYLLABLE CHIEUCH EU TIKEUT +0xAE9E 0xCE29 #HANGUL SYLLABLE CHIEUCH EU RIEULKIYEOK +0xAE9F 0xCE2A #HANGUL SYLLABLE CHIEUCH EU RIEULMIEUM +0xAEA0 0xCE2B #HANGUL SYLLABLE CHIEUCH EU RIEULPIEUP +0xAF41 0xCE2C #HANGUL SYLLABLE CHIEUCH EU RIEULSIOS +0xAF42 0xCE2D #HANGUL SYLLABLE CHIEUCH EU RIEULTHIEUTH +0xAF43 0xCE2E #HANGUL SYLLABLE CHIEUCH EU RIEULPHIEUPH +0xAF44 0xCE2F #HANGUL SYLLABLE CHIEUCH EU RIEULHIEUH +0xAF45 0xCE32 #HANGUL SYLLABLE CHIEUCH EU PIEUPSIOS +0xAF46 0xCE34 #HANGUL SYLLABLE CHIEUCH EU SSANGSIOS +0xAF47 0xCE36 #HANGUL SYLLABLE CHIEUCH EU CIEUC +0xAF48 0xCE37 #HANGUL SYLLABLE CHIEUCH EU CHIEUCH +0xAF49 0xCE38 #HANGUL SYLLABLE CHIEUCH EU KHIEUKH +0xAF4A 0xCE39 #HANGUL SYLLABLE CHIEUCH EU THIEUTH +0xAF4B 0xCE3A #HANGUL SYLLABLE CHIEUCH EU PHIEUPH +0xAF4C 0xCE3B #HANGUL SYLLABLE CHIEUCH EU HIEUH +0xAF4D 0xCE3C #HANGUL SYLLABLE CHIEUCH YI +0xAF4E 0xCE3D #HANGUL SYLLABLE CHIEUCH YI KIYEOK +0xAF4F 0xCE3E #HANGUL SYLLABLE CHIEUCH YI SSANGKIYEOK +0xAF50 0xCE3F #HANGUL SYLLABLE CHIEUCH YI KIYEOKSIOS +0xAF51 0xCE40 #HANGUL SYLLABLE CHIEUCH YI NIEUN +0xAF52 0xCE41 #HANGUL SYLLABLE CHIEUCH YI NIEUNCIEUC +0xAF53 0xCE42 #HANGUL SYLLABLE CHIEUCH YI NIEUNHIEUH +0xAF54 0xCE43 #HANGUL SYLLABLE CHIEUCH YI TIKEUT +0xAF55 0xCE44 #HANGUL SYLLABLE CHIEUCH YI RIEUL +0xAF56 0xCE45 #HANGUL SYLLABLE CHIEUCH YI RIEULKIYEOK +0xAF57 0xCE46 #HANGUL SYLLABLE CHIEUCH YI RIEULMIEUM +0xAF58 0xCE47 #HANGUL SYLLABLE CHIEUCH YI RIEULPIEUP +0xAF59 0xCE48 #HANGUL SYLLABLE CHIEUCH YI RIEULSIOS +0xAF5A 0xCE49 #HANGUL SYLLABLE CHIEUCH YI RIEULTHIEUTH +0xAF61 0xCE4A #HANGUL SYLLABLE CHIEUCH YI RIEULPHIEUPH +0xAF62 0xCE4B #HANGUL SYLLABLE CHIEUCH YI RIEULHIEUH +0xAF63 0xCE4C #HANGUL SYLLABLE CHIEUCH YI MIEUM +0xAF64 0xCE4D #HANGUL SYLLABLE CHIEUCH YI PIEUP +0xAF65 0xCE4E #HANGUL SYLLABLE CHIEUCH YI PIEUPSIOS +0xAF66 0xCE4F #HANGUL SYLLABLE CHIEUCH YI SIOS +0xAF67 0xCE50 #HANGUL SYLLABLE CHIEUCH YI SSANGSIOS +0xAF68 0xCE51 #HANGUL SYLLABLE CHIEUCH YI IEUNG +0xAF69 0xCE52 #HANGUL SYLLABLE CHIEUCH YI CIEUC +0xAF6A 0xCE53 #HANGUL SYLLABLE CHIEUCH YI CHIEUCH +0xAF6B 0xCE54 #HANGUL SYLLABLE CHIEUCH YI KHIEUKH +0xAF6C 0xCE55 #HANGUL SYLLABLE CHIEUCH YI THIEUTH +0xAF6D 0xCE56 #HANGUL SYLLABLE CHIEUCH YI PHIEUPH +0xAF6E 0xCE57 #HANGUL SYLLABLE CHIEUCH YI HIEUH +0xAF6F 0xCE5A #HANGUL SYLLABLE CHIEUCH I SSANGKIYEOK +0xAF70 0xCE5B #HANGUL SYLLABLE CHIEUCH I KIYEOKSIOS +0xAF71 0xCE5D #HANGUL SYLLABLE CHIEUCH I NIEUNCIEUC +0xAF72 0xCE5E #HANGUL SYLLABLE CHIEUCH I NIEUNHIEUH +0xAF73 0xCE62 #HANGUL SYLLABLE CHIEUCH I RIEULMIEUM +0xAF74 0xCE63 #HANGUL SYLLABLE CHIEUCH I RIEULPIEUP +0xAF75 0xCE64 #HANGUL SYLLABLE CHIEUCH I RIEULSIOS +0xAF76 0xCE65 #HANGUL SYLLABLE CHIEUCH I RIEULTHIEUTH +0xAF77 0xCE66 #HANGUL SYLLABLE CHIEUCH I RIEULPHIEUPH +0xAF78 0xCE67 #HANGUL SYLLABLE CHIEUCH I RIEULHIEUH +0xAF79 0xCE6A #HANGUL SYLLABLE CHIEUCH I PIEUPSIOS +0xAF7A 0xCE6C #HANGUL SYLLABLE CHIEUCH I SSANGSIOS +0xAF81 0xCE6E #HANGUL SYLLABLE CHIEUCH I CIEUC +0xAF82 0xCE6F #HANGUL SYLLABLE CHIEUCH I CHIEUCH +0xAF83 0xCE70 #HANGUL SYLLABLE CHIEUCH I KHIEUKH +0xAF84 0xCE71 #HANGUL SYLLABLE CHIEUCH I THIEUTH +0xAF85 0xCE72 #HANGUL SYLLABLE CHIEUCH I PHIEUPH +0xAF86 0xCE73 #HANGUL SYLLABLE CHIEUCH I HIEUH +0xAF87 0xCE76 #HANGUL SYLLABLE KHIEUKH A SSANGKIYEOK +0xAF88 0xCE77 #HANGUL SYLLABLE KHIEUKH A KIYEOKSIOS +0xAF89 0xCE79 #HANGUL SYLLABLE KHIEUKH A NIEUNCIEUC +0xAF8A 0xCE7A #HANGUL SYLLABLE KHIEUKH A NIEUNHIEUH +0xAF8B 0xCE7B #HANGUL SYLLABLE KHIEUKH A TIKEUT +0xAF8C 0xCE7D #HANGUL SYLLABLE KHIEUKH A RIEULKIYEOK +0xAF8D 0xCE7E #HANGUL SYLLABLE KHIEUKH A RIEULMIEUM +0xAF8E 0xCE7F #HANGUL SYLLABLE KHIEUKH A RIEULPIEUP +0xAF8F 0xCE80 #HANGUL SYLLABLE KHIEUKH A RIEULSIOS +0xAF90 0xCE81 #HANGUL SYLLABLE KHIEUKH A RIEULTHIEUTH +0xAF91 0xCE82 #HANGUL SYLLABLE KHIEUKH A RIEULPHIEUPH +0xAF92 0xCE83 #HANGUL SYLLABLE KHIEUKH A RIEULHIEUH +0xAF93 0xCE86 #HANGUL SYLLABLE KHIEUKH A PIEUPSIOS +0xAF94 0xCE88 #HANGUL SYLLABLE KHIEUKH A SSANGSIOS +0xAF95 0xCE8A #HANGUL SYLLABLE KHIEUKH A CIEUC +0xAF96 0xCE8B #HANGUL SYLLABLE KHIEUKH A CHIEUCH +0xAF97 0xCE8C #HANGUL SYLLABLE KHIEUKH A KHIEUKH +0xAF98 0xCE8D #HANGUL SYLLABLE KHIEUKH A THIEUTH +0xAF99 0xCE8E #HANGUL SYLLABLE KHIEUKH A PHIEUPH +0xAF9A 0xCE8F #HANGUL SYLLABLE KHIEUKH A HIEUH +0xAF9B 0xCE92 #HANGUL SYLLABLE KHIEUKH AE SSANGKIYEOK +0xAF9C 0xCE93 #HANGUL SYLLABLE KHIEUKH AE KIYEOKSIOS +0xAF9D 0xCE95 #HANGUL SYLLABLE KHIEUKH AE NIEUNCIEUC +0xAF9E 0xCE96 #HANGUL SYLLABLE KHIEUKH AE NIEUNHIEUH +0xAF9F 0xCE97 #HANGUL SYLLABLE KHIEUKH AE TIKEUT +0xAFA0 0xCE99 #HANGUL SYLLABLE KHIEUKH AE RIEULKIYEOK +0xB041 0xCE9A #HANGUL SYLLABLE KHIEUKH AE RIEULMIEUM +0xB042 0xCE9B #HANGUL SYLLABLE KHIEUKH AE RIEULPIEUP +0xB043 0xCE9C #HANGUL SYLLABLE KHIEUKH AE RIEULSIOS +0xB044 0xCE9D #HANGUL SYLLABLE KHIEUKH AE RIEULTHIEUTH +0xB045 0xCE9E #HANGUL SYLLABLE KHIEUKH AE RIEULPHIEUPH +0xB046 0xCE9F #HANGUL SYLLABLE KHIEUKH AE RIEULHIEUH +0xB047 0xCEA2 #HANGUL SYLLABLE KHIEUKH AE PIEUPSIOS +0xB048 0xCEA6 #HANGUL SYLLABLE KHIEUKH AE CIEUC +0xB049 0xCEA7 #HANGUL SYLLABLE KHIEUKH AE CHIEUCH +0xB04A 0xCEA8 #HANGUL SYLLABLE KHIEUKH AE KHIEUKH +0xB04B 0xCEA9 #HANGUL SYLLABLE KHIEUKH AE THIEUTH +0xB04C 0xCEAA #HANGUL SYLLABLE KHIEUKH AE PHIEUPH +0xB04D 0xCEAB #HANGUL SYLLABLE KHIEUKH AE HIEUH +0xB04E 0xCEAE #HANGUL SYLLABLE KHIEUKH YA SSANGKIYEOK +0xB04F 0xCEAF #HANGUL SYLLABLE KHIEUKH YA KIYEOKSIOS +0xB050 0xCEB0 #HANGUL SYLLABLE KHIEUKH YA NIEUN +0xB051 0xCEB1 #HANGUL SYLLABLE KHIEUKH YA NIEUNCIEUC +0xB052 0xCEB2 #HANGUL SYLLABLE KHIEUKH YA NIEUNHIEUH +0xB053 0xCEB3 #HANGUL SYLLABLE KHIEUKH YA TIKEUT +0xB054 0xCEB4 #HANGUL SYLLABLE KHIEUKH YA RIEUL +0xB055 0xCEB5 #HANGUL SYLLABLE KHIEUKH YA RIEULKIYEOK +0xB056 0xCEB6 #HANGUL SYLLABLE KHIEUKH YA RIEULMIEUM +0xB057 0xCEB7 #HANGUL SYLLABLE KHIEUKH YA RIEULPIEUP +0xB058 0xCEB8 #HANGUL SYLLABLE KHIEUKH YA RIEULSIOS +0xB059 0xCEB9 #HANGUL SYLLABLE KHIEUKH YA RIEULTHIEUTH +0xB05A 0xCEBA #HANGUL SYLLABLE KHIEUKH YA RIEULPHIEUPH +0xB061 0xCEBB #HANGUL SYLLABLE KHIEUKH YA RIEULHIEUH +0xB062 0xCEBC #HANGUL SYLLABLE KHIEUKH YA MIEUM +0xB063 0xCEBD #HANGUL SYLLABLE KHIEUKH YA PIEUP +0xB064 0xCEBE #HANGUL SYLLABLE KHIEUKH YA PIEUPSIOS +0xB065 0xCEBF #HANGUL SYLLABLE KHIEUKH YA SIOS +0xB066 0xCEC0 #HANGUL SYLLABLE KHIEUKH YA SSANGSIOS +0xB067 0xCEC2 #HANGUL SYLLABLE KHIEUKH YA CIEUC +0xB068 0xCEC3 #HANGUL SYLLABLE KHIEUKH YA CHIEUCH +0xB069 0xCEC4 #HANGUL SYLLABLE KHIEUKH YA KHIEUKH +0xB06A 0xCEC5 #HANGUL SYLLABLE KHIEUKH YA THIEUTH +0xB06B 0xCEC6 #HANGUL SYLLABLE KHIEUKH YA PHIEUPH +0xB06C 0xCEC7 #HANGUL SYLLABLE KHIEUKH YA HIEUH +0xB06D 0xCEC8 #HANGUL SYLLABLE KHIEUKH YAE +0xB06E 0xCEC9 #HANGUL SYLLABLE KHIEUKH YAE KIYEOK +0xB06F 0xCECA #HANGUL SYLLABLE KHIEUKH YAE SSANGKIYEOK +0xB070 0xCECB #HANGUL SYLLABLE KHIEUKH YAE KIYEOKSIOS +0xB071 0xCECC #HANGUL SYLLABLE KHIEUKH YAE NIEUN +0xB072 0xCECD #HANGUL SYLLABLE KHIEUKH YAE NIEUNCIEUC +0xB073 0xCECE #HANGUL SYLLABLE KHIEUKH YAE NIEUNHIEUH +0xB074 0xCECF #HANGUL SYLLABLE KHIEUKH YAE TIKEUT +0xB075 0xCED0 #HANGUL SYLLABLE KHIEUKH YAE RIEUL +0xB076 0xCED1 #HANGUL SYLLABLE KHIEUKH YAE RIEULKIYEOK +0xB077 0xCED2 #HANGUL SYLLABLE KHIEUKH YAE RIEULMIEUM +0xB078 0xCED3 #HANGUL SYLLABLE KHIEUKH YAE RIEULPIEUP +0xB079 0xCED4 #HANGUL SYLLABLE KHIEUKH YAE RIEULSIOS +0xB07A 0xCED5 #HANGUL SYLLABLE KHIEUKH YAE RIEULTHIEUTH +0xB081 0xCED6 #HANGUL SYLLABLE KHIEUKH YAE RIEULPHIEUPH +0xB082 0xCED7 #HANGUL SYLLABLE KHIEUKH YAE RIEULHIEUH +0xB083 0xCED8 #HANGUL SYLLABLE KHIEUKH YAE MIEUM +0xB084 0xCED9 #HANGUL SYLLABLE KHIEUKH YAE PIEUP +0xB085 0xCEDA #HANGUL SYLLABLE KHIEUKH YAE PIEUPSIOS +0xB086 0xCEDB #HANGUL SYLLABLE KHIEUKH YAE SIOS +0xB087 0xCEDC #HANGUL SYLLABLE KHIEUKH YAE SSANGSIOS +0xB088 0xCEDD #HANGUL SYLLABLE KHIEUKH YAE IEUNG +0xB089 0xCEDE #HANGUL SYLLABLE KHIEUKH YAE CIEUC +0xB08A 0xCEDF #HANGUL SYLLABLE KHIEUKH YAE CHIEUCH +0xB08B 0xCEE0 #HANGUL SYLLABLE KHIEUKH YAE KHIEUKH +0xB08C 0xCEE1 #HANGUL SYLLABLE KHIEUKH YAE THIEUTH +0xB08D 0xCEE2 #HANGUL SYLLABLE KHIEUKH YAE PHIEUPH +0xB08E 0xCEE3 #HANGUL SYLLABLE KHIEUKH YAE HIEUH +0xB08F 0xCEE6 #HANGUL SYLLABLE KHIEUKH EO SSANGKIYEOK +0xB090 0xCEE7 #HANGUL SYLLABLE KHIEUKH EO KIYEOKSIOS +0xB091 0xCEE9 #HANGUL SYLLABLE KHIEUKH EO NIEUNCIEUC +0xB092 0xCEEA #HANGUL SYLLABLE KHIEUKH EO NIEUNHIEUH +0xB093 0xCEED #HANGUL SYLLABLE KHIEUKH EO RIEULKIYEOK +0xB094 0xCEEE #HANGUL SYLLABLE KHIEUKH EO RIEULMIEUM +0xB095 0xCEEF #HANGUL SYLLABLE KHIEUKH EO RIEULPIEUP +0xB096 0xCEF0 #HANGUL SYLLABLE KHIEUKH EO RIEULSIOS +0xB097 0xCEF1 #HANGUL SYLLABLE KHIEUKH EO RIEULTHIEUTH +0xB098 0xCEF2 #HANGUL SYLLABLE KHIEUKH EO RIEULPHIEUPH +0xB099 0xCEF3 #HANGUL SYLLABLE KHIEUKH EO RIEULHIEUH +0xB09A 0xCEF6 #HANGUL SYLLABLE KHIEUKH EO PIEUPSIOS +0xB09B 0xCEFA #HANGUL SYLLABLE KHIEUKH EO CIEUC +0xB09C 0xCEFB #HANGUL SYLLABLE KHIEUKH EO CHIEUCH +0xB09D 0xCEFC #HANGUL SYLLABLE KHIEUKH EO KHIEUKH +0xB09E 0xCEFD #HANGUL SYLLABLE KHIEUKH EO THIEUTH +0xB09F 0xCEFE #HANGUL SYLLABLE KHIEUKH EO PHIEUPH +0xB0A0 0xCEFF #HANGUL SYLLABLE KHIEUKH EO HIEUH +0xB0A1 0xAC00 #HANGUL SYLLABLE KIYEOK A +0xB0A2 0xAC01 #HANGUL SYLLABLE KIYEOK A KIYEOK +0xB0A3 0xAC04 #HANGUL SYLLABLE KIYEOK A NIEUN +0xB0A4 0xAC07 #HANGUL SYLLABLE KIYEOK A TIKEUT +0xB0A5 0xAC08 #HANGUL SYLLABLE KIYEOK A RIEUL +0xB0A6 0xAC09 #HANGUL SYLLABLE KIYEOK A RIEULKIYEOK +0xB0A7 0xAC0A #HANGUL SYLLABLE KIYEOK A RIEULMIEUM +0xB0A8 0xAC10 #HANGUL SYLLABLE KIYEOK A MIEUM +0xB0A9 0xAC11 #HANGUL SYLLABLE KIYEOK A PIEUP +0xB0AA 0xAC12 #HANGUL SYLLABLE KIYEOK A PIEUPSIOS +0xB0AB 0xAC13 #HANGUL SYLLABLE KIYEOK A SIOS +0xB0AC 0xAC14 #HANGUL SYLLABLE KIYEOK A SSANGSIOS +0xB0AD 0xAC15 #HANGUL SYLLABLE KIYEOK A IEUNG +0xB0AE 0xAC16 #HANGUL SYLLABLE KIYEOK A CIEUC +0xB0AF 0xAC17 #HANGUL SYLLABLE KIYEOK A CHIEUCH +0xB0B0 0xAC19 #HANGUL SYLLABLE KIYEOK A THIEUTH +0xB0B1 0xAC1A #HANGUL SYLLABLE KIYEOK A PHIEUPH +0xB0B2 0xAC1B #HANGUL SYLLABLE KIYEOK A HIEUH +0xB0B3 0xAC1C #HANGUL SYLLABLE KIYEOK AE +0xB0B4 0xAC1D #HANGUL SYLLABLE KIYEOK AE KIYEOK +0xB0B5 0xAC20 #HANGUL SYLLABLE KIYEOK AE NIEUN +0xB0B6 0xAC24 #HANGUL SYLLABLE KIYEOK AE RIEUL +0xB0B7 0xAC2C #HANGUL SYLLABLE KIYEOK AE MIEUM +0xB0B8 0xAC2D #HANGUL SYLLABLE KIYEOK AE PIEUP +0xB0B9 0xAC2F #HANGUL SYLLABLE KIYEOK AE SIOS +0xB0BA 0xAC30 #HANGUL SYLLABLE KIYEOK AE SSANGSIOS +0xB0BB 0xAC31 #HANGUL SYLLABLE KIYEOK AE IEUNG +0xB0BC 0xAC38 #HANGUL SYLLABLE KIYEOK YA +0xB0BD 0xAC39 #HANGUL SYLLABLE KIYEOK YA KIYEOK +0xB0BE 0xAC3C #HANGUL SYLLABLE KIYEOK YA NIEUN +0xB0BF 0xAC40 #HANGUL SYLLABLE KIYEOK YA RIEUL +0xB0C0 0xAC4B #HANGUL SYLLABLE KIYEOK YA SIOS +0xB0C1 0xAC4D #HANGUL SYLLABLE KIYEOK YA IEUNG +0xB0C2 0xAC54 #HANGUL SYLLABLE KIYEOK YAE +0xB0C3 0xAC58 #HANGUL SYLLABLE KIYEOK YAE NIEUN +0xB0C4 0xAC5C #HANGUL SYLLABLE KIYEOK YAE RIEUL +0xB0C5 0xAC70 #HANGUL SYLLABLE KIYEOK EO +0xB0C6 0xAC71 #HANGUL SYLLABLE KIYEOK EO KIYEOK +0xB0C7 0xAC74 #HANGUL SYLLABLE KIYEOK EO NIEUN +0xB0C8 0xAC77 #HANGUL SYLLABLE KIYEOK EO TIKEUT +0xB0C9 0xAC78 #HANGUL SYLLABLE KIYEOK EO RIEUL +0xB0CA 0xAC7A #HANGUL SYLLABLE KIYEOK EO RIEULMIEUM +0xB0CB 0xAC80 #HANGUL SYLLABLE KIYEOK EO MIEUM +0xB0CC 0xAC81 #HANGUL SYLLABLE KIYEOK EO PIEUP +0xB0CD 0xAC83 #HANGUL SYLLABLE KIYEOK EO SIOS +0xB0CE 0xAC84 #HANGUL SYLLABLE KIYEOK EO SSANGSIOS +0xB0CF 0xAC85 #HANGUL SYLLABLE KIYEOK EO IEUNG +0xB0D0 0xAC86 #HANGUL SYLLABLE KIYEOK EO CIEUC +0xB0D1 0xAC89 #HANGUL SYLLABLE KIYEOK EO THIEUTH +0xB0D2 0xAC8A #HANGUL SYLLABLE KIYEOK EO PHIEUPH +0xB0D3 0xAC8B #HANGUL SYLLABLE KIYEOK EO HIEUH +0xB0D4 0xAC8C #HANGUL SYLLABLE KIYEOK E +0xB0D5 0xAC90 #HANGUL SYLLABLE KIYEOK E NIEUN +0xB0D6 0xAC94 #HANGUL SYLLABLE KIYEOK E RIEUL +0xB0D7 0xAC9C #HANGUL SYLLABLE KIYEOK E MIEUM +0xB0D8 0xAC9D #HANGUL SYLLABLE KIYEOK E PIEUP +0xB0D9 0xAC9F #HANGUL SYLLABLE KIYEOK E SIOS +0xB0DA 0xACA0 #HANGUL SYLLABLE KIYEOK E SSANGSIOS +0xB0DB 0xACA1 #HANGUL SYLLABLE KIYEOK E IEUNG +0xB0DC 0xACA8 #HANGUL SYLLABLE KIYEOK YEO +0xB0DD 0xACA9 #HANGUL SYLLABLE KIYEOK YEO KIYEOK +0xB0DE 0xACAA #HANGUL SYLLABLE KIYEOK YEO SSANGKIYEOK +0xB0DF 0xACAC #HANGUL SYLLABLE KIYEOK YEO NIEUN +0xB0E0 0xACAF #HANGUL SYLLABLE KIYEOK YEO TIKEUT +0xB0E1 0xACB0 #HANGUL SYLLABLE KIYEOK YEO RIEUL +0xB0E2 0xACB8 #HANGUL SYLLABLE KIYEOK YEO MIEUM +0xB0E3 0xACB9 #HANGUL SYLLABLE KIYEOK YEO PIEUP +0xB0E4 0xACBB #HANGUL SYLLABLE KIYEOK YEO SIOS +0xB0E5 0xACBC #HANGUL SYLLABLE KIYEOK YEO SSANGSIOS +0xB0E6 0xACBD #HANGUL SYLLABLE KIYEOK YEO IEUNG +0xB0E7 0xACC1 #HANGUL SYLLABLE KIYEOK YEO THIEUTH +0xB0E8 0xACC4 #HANGUL SYLLABLE KIYEOK YE +0xB0E9 0xACC8 #HANGUL SYLLABLE KIYEOK YE NIEUN +0xB0EA 0xACCC #HANGUL SYLLABLE KIYEOK YE RIEUL +0xB0EB 0xACD5 #HANGUL SYLLABLE KIYEOK YE PIEUP +0xB0EC 0xACD7 #HANGUL SYLLABLE KIYEOK YE SIOS +0xB0ED 0xACE0 #HANGUL SYLLABLE KIYEOK O +0xB0EE 0xACE1 #HANGUL SYLLABLE KIYEOK O KIYEOK +0xB0EF 0xACE4 #HANGUL SYLLABLE KIYEOK O NIEUN +0xB0F0 0xACE7 #HANGUL SYLLABLE KIYEOK O TIKEUT +0xB0F1 0xACE8 #HANGUL SYLLABLE KIYEOK O RIEUL +0xB0F2 0xACEA #HANGUL SYLLABLE KIYEOK O RIEULMIEUM +0xB0F3 0xACEC #HANGUL SYLLABLE KIYEOK O RIEULSIOS +0xB0F4 0xACEF #HANGUL SYLLABLE KIYEOK O RIEULHIEUH +0xB0F5 0xACF0 #HANGUL SYLLABLE KIYEOK O MIEUM +0xB0F6 0xACF1 #HANGUL SYLLABLE KIYEOK O PIEUP +0xB0F7 0xACF3 #HANGUL SYLLABLE KIYEOK O SIOS +0xB0F8 0xACF5 #HANGUL SYLLABLE KIYEOK O IEUNG +0xB0F9 0xACF6 #HANGUL SYLLABLE KIYEOK O CIEUC +0xB0FA 0xACFC #HANGUL SYLLABLE KIYEOK WA +0xB0FB 0xACFD #HANGUL SYLLABLE KIYEOK WA KIYEOK +0xB0FC 0xAD00 #HANGUL SYLLABLE KIYEOK WA NIEUN +0xB0FD 0xAD04 #HANGUL SYLLABLE KIYEOK WA RIEUL +0xB0FE 0xAD06 #HANGUL SYLLABLE KIYEOK WA RIEULMIEUM +0xB141 0xCF02 #HANGUL SYLLABLE KHIEUKH E SSANGKIYEOK +0xB142 0xCF03 #HANGUL SYLLABLE KHIEUKH E KIYEOKSIOS +0xB143 0xCF05 #HANGUL SYLLABLE KHIEUKH E NIEUNCIEUC +0xB144 0xCF06 #HANGUL SYLLABLE KHIEUKH E NIEUNHIEUH +0xB145 0xCF07 #HANGUL SYLLABLE KHIEUKH E TIKEUT +0xB146 0xCF09 #HANGUL SYLLABLE KHIEUKH E RIEULKIYEOK +0xB147 0xCF0A #HANGUL SYLLABLE KHIEUKH E RIEULMIEUM +0xB148 0xCF0B #HANGUL SYLLABLE KHIEUKH E RIEULPIEUP +0xB149 0xCF0C #HANGUL SYLLABLE KHIEUKH E RIEULSIOS +0xB14A 0xCF0D #HANGUL SYLLABLE KHIEUKH E RIEULTHIEUTH +0xB14B 0xCF0E #HANGUL SYLLABLE KHIEUKH E RIEULPHIEUPH +0xB14C 0xCF0F #HANGUL SYLLABLE KHIEUKH E RIEULHIEUH +0xB14D 0xCF12 #HANGUL SYLLABLE KHIEUKH E PIEUPSIOS +0xB14E 0xCF14 #HANGUL SYLLABLE KHIEUKH E SSANGSIOS +0xB14F 0xCF16 #HANGUL SYLLABLE KHIEUKH E CIEUC +0xB150 0xCF17 #HANGUL SYLLABLE KHIEUKH E CHIEUCH +0xB151 0xCF18 #HANGUL SYLLABLE KHIEUKH E KHIEUKH +0xB152 0xCF19 #HANGUL SYLLABLE KHIEUKH E THIEUTH +0xB153 0xCF1A #HANGUL SYLLABLE KHIEUKH E PHIEUPH +0xB154 0xCF1B #HANGUL SYLLABLE KHIEUKH E HIEUH +0xB155 0xCF1D #HANGUL SYLLABLE KHIEUKH YEO KIYEOK +0xB156 0xCF1E #HANGUL SYLLABLE KHIEUKH YEO SSANGKIYEOK +0xB157 0xCF1F #HANGUL SYLLABLE KHIEUKH YEO KIYEOKSIOS +0xB158 0xCF21 #HANGUL SYLLABLE KHIEUKH YEO NIEUNCIEUC +0xB159 0xCF22 #HANGUL SYLLABLE KHIEUKH YEO NIEUNHIEUH +0xB15A 0xCF23 #HANGUL SYLLABLE KHIEUKH YEO TIKEUT +0xB161 0xCF25 #HANGUL SYLLABLE KHIEUKH YEO RIEULKIYEOK +0xB162 0xCF26 #HANGUL SYLLABLE KHIEUKH YEO RIEULMIEUM +0xB163 0xCF27 #HANGUL SYLLABLE KHIEUKH YEO RIEULPIEUP +0xB164 0xCF28 #HANGUL SYLLABLE KHIEUKH YEO RIEULSIOS +0xB165 0xCF29 #HANGUL SYLLABLE KHIEUKH YEO RIEULTHIEUTH +0xB166 0xCF2A #HANGUL SYLLABLE KHIEUKH YEO RIEULPHIEUPH +0xB167 0xCF2B #HANGUL SYLLABLE KHIEUKH YEO RIEULHIEUH +0xB168 0xCF2E #HANGUL SYLLABLE KHIEUKH YEO PIEUPSIOS +0xB169 0xCF32 #HANGUL SYLLABLE KHIEUKH YEO CIEUC +0xB16A 0xCF33 #HANGUL SYLLABLE KHIEUKH YEO CHIEUCH +0xB16B 0xCF34 #HANGUL SYLLABLE KHIEUKH YEO KHIEUKH +0xB16C 0xCF35 #HANGUL SYLLABLE KHIEUKH YEO THIEUTH +0xB16D 0xCF36 #HANGUL SYLLABLE KHIEUKH YEO PHIEUPH +0xB16E 0xCF37 #HANGUL SYLLABLE KHIEUKH YEO HIEUH +0xB16F 0xCF39 #HANGUL SYLLABLE KHIEUKH YE KIYEOK +0xB170 0xCF3A #HANGUL SYLLABLE KHIEUKH YE SSANGKIYEOK +0xB171 0xCF3B #HANGUL SYLLABLE KHIEUKH YE KIYEOKSIOS +0xB172 0xCF3C #HANGUL SYLLABLE KHIEUKH YE NIEUN +0xB173 0xCF3D #HANGUL SYLLABLE KHIEUKH YE NIEUNCIEUC +0xB174 0xCF3E #HANGUL SYLLABLE KHIEUKH YE NIEUNHIEUH +0xB175 0xCF3F #HANGUL SYLLABLE KHIEUKH YE TIKEUT +0xB176 0xCF40 #HANGUL SYLLABLE KHIEUKH YE RIEUL +0xB177 0xCF41 #HANGUL SYLLABLE KHIEUKH YE RIEULKIYEOK +0xB178 0xCF42 #HANGUL SYLLABLE KHIEUKH YE RIEULMIEUM +0xB179 0xCF43 #HANGUL SYLLABLE KHIEUKH YE RIEULPIEUP +0xB17A 0xCF44 #HANGUL SYLLABLE KHIEUKH YE RIEULSIOS +0xB181 0xCF45 #HANGUL SYLLABLE KHIEUKH YE RIEULTHIEUTH +0xB182 0xCF46 #HANGUL SYLLABLE KHIEUKH YE RIEULPHIEUPH +0xB183 0xCF47 #HANGUL SYLLABLE KHIEUKH YE RIEULHIEUH +0xB184 0xCF48 #HANGUL SYLLABLE KHIEUKH YE MIEUM +0xB185 0xCF49 #HANGUL SYLLABLE KHIEUKH YE PIEUP +0xB186 0xCF4A #HANGUL SYLLABLE KHIEUKH YE PIEUPSIOS +0xB187 0xCF4B #HANGUL SYLLABLE KHIEUKH YE SIOS +0xB188 0xCF4C #HANGUL SYLLABLE KHIEUKH YE SSANGSIOS +0xB189 0xCF4D #HANGUL SYLLABLE KHIEUKH YE IEUNG +0xB18A 0xCF4E #HANGUL SYLLABLE KHIEUKH YE CIEUC +0xB18B 0xCF4F #HANGUL SYLLABLE KHIEUKH YE CHIEUCH +0xB18C 0xCF50 #HANGUL SYLLABLE KHIEUKH YE KHIEUKH +0xB18D 0xCF51 #HANGUL SYLLABLE KHIEUKH YE THIEUTH +0xB18E 0xCF52 #HANGUL SYLLABLE KHIEUKH YE PHIEUPH +0xB18F 0xCF53 #HANGUL SYLLABLE KHIEUKH YE HIEUH +0xB190 0xCF56 #HANGUL SYLLABLE KHIEUKH O SSANGKIYEOK +0xB191 0xCF57 #HANGUL SYLLABLE KHIEUKH O KIYEOKSIOS +0xB192 0xCF59 #HANGUL SYLLABLE KHIEUKH O NIEUNCIEUC +0xB193 0xCF5A #HANGUL SYLLABLE KHIEUKH O NIEUNHIEUH +0xB194 0xCF5B #HANGUL SYLLABLE KHIEUKH O TIKEUT +0xB195 0xCF5D #HANGUL SYLLABLE KHIEUKH O RIEULKIYEOK +0xB196 0xCF5E #HANGUL SYLLABLE KHIEUKH O RIEULMIEUM +0xB197 0xCF5F #HANGUL SYLLABLE KHIEUKH O RIEULPIEUP +0xB198 0xCF60 #HANGUL SYLLABLE KHIEUKH O RIEULSIOS +0xB199 0xCF61 #HANGUL SYLLABLE KHIEUKH O RIEULTHIEUTH +0xB19A 0xCF62 #HANGUL SYLLABLE KHIEUKH O RIEULPHIEUPH +0xB19B 0xCF63 #HANGUL SYLLABLE KHIEUKH O RIEULHIEUH +0xB19C 0xCF66 #HANGUL SYLLABLE KHIEUKH O PIEUPSIOS +0xB19D 0xCF68 #HANGUL SYLLABLE KHIEUKH O SSANGSIOS +0xB19E 0xCF6A #HANGUL SYLLABLE KHIEUKH O CIEUC +0xB19F 0xCF6B #HANGUL SYLLABLE KHIEUKH O CHIEUCH +0xB1A0 0xCF6C #HANGUL SYLLABLE KHIEUKH O KHIEUKH +0xB1A1 0xAD0C #HANGUL SYLLABLE KIYEOK WA MIEUM +0xB1A2 0xAD0D #HANGUL SYLLABLE KIYEOK WA PIEUP +0xB1A3 0xAD0F #HANGUL SYLLABLE KIYEOK WA SIOS +0xB1A4 0xAD11 #HANGUL SYLLABLE KIYEOK WA IEUNG +0xB1A5 0xAD18 #HANGUL SYLLABLE KIYEOK WAE +0xB1A6 0xAD1C #HANGUL SYLLABLE KIYEOK WAE NIEUN +0xB1A7 0xAD20 #HANGUL SYLLABLE KIYEOK WAE RIEUL +0xB1A8 0xAD29 #HANGUL SYLLABLE KIYEOK WAE PIEUP +0xB1A9 0xAD2C #HANGUL SYLLABLE KIYEOK WAE SSANGSIOS +0xB1AA 0xAD2D #HANGUL SYLLABLE KIYEOK WAE IEUNG +0xB1AB 0xAD34 #HANGUL SYLLABLE KIYEOK OE +0xB1AC 0xAD35 #HANGUL SYLLABLE KIYEOK OE KIYEOK +0xB1AD 0xAD38 #HANGUL SYLLABLE KIYEOK OE NIEUN +0xB1AE 0xAD3C #HANGUL SYLLABLE KIYEOK OE RIEUL +0xB1AF 0xAD44 #HANGUL SYLLABLE KIYEOK OE MIEUM +0xB1B0 0xAD45 #HANGUL SYLLABLE KIYEOK OE PIEUP +0xB1B1 0xAD47 #HANGUL SYLLABLE KIYEOK OE SIOS +0xB1B2 0xAD49 #HANGUL SYLLABLE KIYEOK OE IEUNG +0xB1B3 0xAD50 #HANGUL SYLLABLE KIYEOK YO +0xB1B4 0xAD54 #HANGUL SYLLABLE KIYEOK YO NIEUN +0xB1B5 0xAD58 #HANGUL SYLLABLE KIYEOK YO RIEUL +0xB1B6 0xAD61 #HANGUL SYLLABLE KIYEOK YO PIEUP +0xB1B7 0xAD63 #HANGUL SYLLABLE KIYEOK YO SIOS +0xB1B8 0xAD6C #HANGUL SYLLABLE KIYEOK U +0xB1B9 0xAD6D #HANGUL SYLLABLE KIYEOK U KIYEOK +0xB1BA 0xAD70 #HANGUL SYLLABLE KIYEOK U NIEUN +0xB1BB 0xAD73 #HANGUL SYLLABLE KIYEOK U TIKEUT +0xB1BC 0xAD74 #HANGUL SYLLABLE KIYEOK U RIEUL +0xB1BD 0xAD75 #HANGUL SYLLABLE KIYEOK U RIEULKIYEOK +0xB1BE 0xAD76 #HANGUL SYLLABLE KIYEOK U RIEULMIEUM +0xB1BF 0xAD7B #HANGUL SYLLABLE KIYEOK U RIEULHIEUH +0xB1C0 0xAD7C #HANGUL SYLLABLE KIYEOK U MIEUM +0xB1C1 0xAD7D #HANGUL SYLLABLE KIYEOK U PIEUP +0xB1C2 0xAD7F #HANGUL SYLLABLE KIYEOK U SIOS +0xB1C3 0xAD81 #HANGUL SYLLABLE KIYEOK U IEUNG +0xB1C4 0xAD82 #HANGUL SYLLABLE KIYEOK U CIEUC +0xB1C5 0xAD88 #HANGUL SYLLABLE KIYEOK WEO +0xB1C6 0xAD89 #HANGUL SYLLABLE KIYEOK WEO KIYEOK +0xB1C7 0xAD8C #HANGUL SYLLABLE KIYEOK WEO NIEUN +0xB1C8 0xAD90 #HANGUL SYLLABLE KIYEOK WEO RIEUL +0xB1C9 0xAD9C #HANGUL SYLLABLE KIYEOK WEO SSANGSIOS +0xB1CA 0xAD9D #HANGUL SYLLABLE KIYEOK WEO IEUNG +0xB1CB 0xADA4 #HANGUL SYLLABLE KIYEOK WE +0xB1CC 0xADB7 #HANGUL SYLLABLE KIYEOK WE SIOS +0xB1CD 0xADC0 #HANGUL SYLLABLE KIYEOK WI +0xB1CE 0xADC1 #HANGUL SYLLABLE KIYEOK WI KIYEOK +0xB1CF 0xADC4 #HANGUL SYLLABLE KIYEOK WI NIEUN +0xB1D0 0xADC8 #HANGUL SYLLABLE KIYEOK WI RIEUL +0xB1D1 0xADD0 #HANGUL SYLLABLE KIYEOK WI MIEUM +0xB1D2 0xADD1 #HANGUL SYLLABLE KIYEOK WI PIEUP +0xB1D3 0xADD3 #HANGUL SYLLABLE KIYEOK WI SIOS +0xB1D4 0xADDC #HANGUL SYLLABLE KIYEOK YU +0xB1D5 0xADE0 #HANGUL SYLLABLE KIYEOK YU NIEUN +0xB1D6 0xADE4 #HANGUL SYLLABLE KIYEOK YU RIEUL +0xB1D7 0xADF8 #HANGUL SYLLABLE KIYEOK EU +0xB1D8 0xADF9 #HANGUL SYLLABLE KIYEOK EU KIYEOK +0xB1D9 0xADFC #HANGUL SYLLABLE KIYEOK EU NIEUN +0xB1DA 0xADFF #HANGUL SYLLABLE KIYEOK EU TIKEUT +0xB1DB 0xAE00 #HANGUL SYLLABLE KIYEOK EU RIEUL +0xB1DC 0xAE01 #HANGUL SYLLABLE KIYEOK EU RIEULKIYEOK +0xB1DD 0xAE08 #HANGUL SYLLABLE KIYEOK EU MIEUM +0xB1DE 0xAE09 #HANGUL SYLLABLE KIYEOK EU PIEUP +0xB1DF 0xAE0B #HANGUL SYLLABLE KIYEOK EU SIOS +0xB1E0 0xAE0D #HANGUL SYLLABLE KIYEOK EU IEUNG +0xB1E1 0xAE14 #HANGUL SYLLABLE KIYEOK YI +0xB1E2 0xAE30 #HANGUL SYLLABLE KIYEOK I +0xB1E3 0xAE31 #HANGUL SYLLABLE KIYEOK I KIYEOK +0xB1E4 0xAE34 #HANGUL SYLLABLE KIYEOK I NIEUN +0xB1E5 0xAE37 #HANGUL SYLLABLE KIYEOK I TIKEUT +0xB1E6 0xAE38 #HANGUL SYLLABLE KIYEOK I RIEUL +0xB1E7 0xAE3A #HANGUL SYLLABLE KIYEOK I RIEULMIEUM +0xB1E8 0xAE40 #HANGUL SYLLABLE KIYEOK I MIEUM +0xB1E9 0xAE41 #HANGUL SYLLABLE KIYEOK I PIEUP +0xB1EA 0xAE43 #HANGUL SYLLABLE KIYEOK I SIOS +0xB1EB 0xAE45 #HANGUL SYLLABLE KIYEOK I IEUNG +0xB1EC 0xAE46 #HANGUL SYLLABLE KIYEOK I CIEUC +0xB1ED 0xAE4A #HANGUL SYLLABLE KIYEOK I PHIEUPH +0xB1EE 0xAE4C #HANGUL SYLLABLE SSANGKIYEOK A +0xB1EF 0xAE4D #HANGUL SYLLABLE SSANGKIYEOK A KIYEOK +0xB1F0 0xAE4E #HANGUL SYLLABLE SSANGKIYEOK A SSANGKIYEOK +0xB1F1 0xAE50 #HANGUL SYLLABLE SSANGKIYEOK A NIEUN +0xB1F2 0xAE54 #HANGUL SYLLABLE SSANGKIYEOK A RIEUL +0xB1F3 0xAE56 #HANGUL SYLLABLE SSANGKIYEOK A RIEULMIEUM +0xB1F4 0xAE5C #HANGUL SYLLABLE SSANGKIYEOK A MIEUM +0xB1F5 0xAE5D #HANGUL SYLLABLE SSANGKIYEOK A PIEUP +0xB1F6 0xAE5F #HANGUL SYLLABLE SSANGKIYEOK A SIOS +0xB1F7 0xAE60 #HANGUL SYLLABLE SSANGKIYEOK A SSANGSIOS +0xB1F8 0xAE61 #HANGUL SYLLABLE SSANGKIYEOK A IEUNG +0xB1F9 0xAE65 #HANGUL SYLLABLE SSANGKIYEOK A THIEUTH +0xB1FA 0xAE68 #HANGUL SYLLABLE SSANGKIYEOK AE +0xB1FB 0xAE69 #HANGUL SYLLABLE SSANGKIYEOK AE KIYEOK +0xB1FC 0xAE6C #HANGUL SYLLABLE SSANGKIYEOK AE NIEUN +0xB1FD 0xAE70 #HANGUL SYLLABLE SSANGKIYEOK AE RIEUL +0xB1FE 0xAE78 #HANGUL SYLLABLE SSANGKIYEOK AE MIEUM +0xB241 0xCF6D #HANGUL SYLLABLE KHIEUKH O THIEUTH +0xB242 0xCF6E #HANGUL SYLLABLE KHIEUKH O PHIEUPH +0xB243 0xCF6F #HANGUL SYLLABLE KHIEUKH O HIEUH +0xB244 0xCF72 #HANGUL SYLLABLE KHIEUKH WA SSANGKIYEOK +0xB245 0xCF73 #HANGUL SYLLABLE KHIEUKH WA KIYEOKSIOS +0xB246 0xCF75 #HANGUL SYLLABLE KHIEUKH WA NIEUNCIEUC +0xB247 0xCF76 #HANGUL SYLLABLE KHIEUKH WA NIEUNHIEUH +0xB248 0xCF77 #HANGUL SYLLABLE KHIEUKH WA TIKEUT +0xB249 0xCF79 #HANGUL SYLLABLE KHIEUKH WA RIEULKIYEOK +0xB24A 0xCF7A #HANGUL SYLLABLE KHIEUKH WA RIEULMIEUM +0xB24B 0xCF7B #HANGUL SYLLABLE KHIEUKH WA RIEULPIEUP +0xB24C 0xCF7C #HANGUL SYLLABLE KHIEUKH WA RIEULSIOS +0xB24D 0xCF7D #HANGUL SYLLABLE KHIEUKH WA RIEULTHIEUTH +0xB24E 0xCF7E #HANGUL SYLLABLE KHIEUKH WA RIEULPHIEUPH +0xB24F 0xCF7F #HANGUL SYLLABLE KHIEUKH WA RIEULHIEUH +0xB250 0xCF81 #HANGUL SYLLABLE KHIEUKH WA PIEUP +0xB251 0xCF82 #HANGUL SYLLABLE KHIEUKH WA PIEUPSIOS +0xB252 0xCF83 #HANGUL SYLLABLE KHIEUKH WA SIOS +0xB253 0xCF84 #HANGUL SYLLABLE KHIEUKH WA SSANGSIOS +0xB254 0xCF86 #HANGUL SYLLABLE KHIEUKH WA CIEUC +0xB255 0xCF87 #HANGUL SYLLABLE KHIEUKH WA CHIEUCH +0xB256 0xCF88 #HANGUL SYLLABLE KHIEUKH WA KHIEUKH +0xB257 0xCF89 #HANGUL SYLLABLE KHIEUKH WA THIEUTH +0xB258 0xCF8A #HANGUL SYLLABLE KHIEUKH WA PHIEUPH +0xB259 0xCF8B #HANGUL SYLLABLE KHIEUKH WA HIEUH +0xB25A 0xCF8D #HANGUL SYLLABLE KHIEUKH WAE KIYEOK +0xB261 0xCF8E #HANGUL SYLLABLE KHIEUKH WAE SSANGKIYEOK +0xB262 0xCF8F #HANGUL SYLLABLE KHIEUKH WAE KIYEOKSIOS +0xB263 0xCF90 #HANGUL SYLLABLE KHIEUKH WAE NIEUN +0xB264 0xCF91 #HANGUL SYLLABLE KHIEUKH WAE NIEUNCIEUC +0xB265 0xCF92 #HANGUL SYLLABLE KHIEUKH WAE NIEUNHIEUH +0xB266 0xCF93 #HANGUL SYLLABLE KHIEUKH WAE TIKEUT +0xB267 0xCF94 #HANGUL SYLLABLE KHIEUKH WAE RIEUL +0xB268 0xCF95 #HANGUL SYLLABLE KHIEUKH WAE RIEULKIYEOK +0xB269 0xCF96 #HANGUL SYLLABLE KHIEUKH WAE RIEULMIEUM +0xB26A 0xCF97 #HANGUL SYLLABLE KHIEUKH WAE RIEULPIEUP +0xB26B 0xCF98 #HANGUL SYLLABLE KHIEUKH WAE RIEULSIOS +0xB26C 0xCF99 #HANGUL SYLLABLE KHIEUKH WAE RIEULTHIEUTH +0xB26D 0xCF9A #HANGUL SYLLABLE KHIEUKH WAE RIEULPHIEUPH +0xB26E 0xCF9B #HANGUL SYLLABLE KHIEUKH WAE RIEULHIEUH +0xB26F 0xCF9C #HANGUL SYLLABLE KHIEUKH WAE MIEUM +0xB270 0xCF9D #HANGUL SYLLABLE KHIEUKH WAE PIEUP +0xB271 0xCF9E #HANGUL SYLLABLE KHIEUKH WAE PIEUPSIOS +0xB272 0xCF9F #HANGUL SYLLABLE KHIEUKH WAE SIOS +0xB273 0xCFA0 #HANGUL SYLLABLE KHIEUKH WAE SSANGSIOS +0xB274 0xCFA2 #HANGUL SYLLABLE KHIEUKH WAE CIEUC +0xB275 0xCFA3 #HANGUL SYLLABLE KHIEUKH WAE CHIEUCH +0xB276 0xCFA4 #HANGUL SYLLABLE KHIEUKH WAE KHIEUKH +0xB277 0xCFA5 #HANGUL SYLLABLE KHIEUKH WAE THIEUTH +0xB278 0xCFA6 #HANGUL SYLLABLE KHIEUKH WAE PHIEUPH +0xB279 0xCFA7 #HANGUL SYLLABLE KHIEUKH WAE HIEUH +0xB27A 0xCFA9 #HANGUL SYLLABLE KHIEUKH OE KIYEOK +0xB281 0xCFAA #HANGUL SYLLABLE KHIEUKH OE SSANGKIYEOK +0xB282 0xCFAB #HANGUL SYLLABLE KHIEUKH OE KIYEOKSIOS +0xB283 0xCFAC #HANGUL SYLLABLE KHIEUKH OE NIEUN +0xB284 0xCFAD #HANGUL SYLLABLE KHIEUKH OE NIEUNCIEUC +0xB285 0xCFAE #HANGUL SYLLABLE KHIEUKH OE NIEUNHIEUH +0xB286 0xCFAF #HANGUL SYLLABLE KHIEUKH OE TIKEUT +0xB287 0xCFB1 #HANGUL SYLLABLE KHIEUKH OE RIEULKIYEOK +0xB288 0xCFB2 #HANGUL SYLLABLE KHIEUKH OE RIEULMIEUM +0xB289 0xCFB3 #HANGUL SYLLABLE KHIEUKH OE RIEULPIEUP +0xB28A 0xCFB4 #HANGUL SYLLABLE KHIEUKH OE RIEULSIOS +0xB28B 0xCFB5 #HANGUL SYLLABLE KHIEUKH OE RIEULTHIEUTH +0xB28C 0xCFB6 #HANGUL SYLLABLE KHIEUKH OE RIEULPHIEUPH +0xB28D 0xCFB7 #HANGUL SYLLABLE KHIEUKH OE RIEULHIEUH +0xB28E 0xCFB8 #HANGUL SYLLABLE KHIEUKH OE MIEUM +0xB28F 0xCFB9 #HANGUL SYLLABLE KHIEUKH OE PIEUP +0xB290 0xCFBA #HANGUL SYLLABLE KHIEUKH OE PIEUPSIOS +0xB291 0xCFBB #HANGUL SYLLABLE KHIEUKH OE SIOS +0xB292 0xCFBC #HANGUL SYLLABLE KHIEUKH OE SSANGSIOS +0xB293 0xCFBD #HANGUL SYLLABLE KHIEUKH OE IEUNG +0xB294 0xCFBE #HANGUL SYLLABLE KHIEUKH OE CIEUC +0xB295 0xCFBF #HANGUL SYLLABLE KHIEUKH OE CHIEUCH +0xB296 0xCFC0 #HANGUL SYLLABLE KHIEUKH OE KHIEUKH +0xB297 0xCFC1 #HANGUL SYLLABLE KHIEUKH OE THIEUTH +0xB298 0xCFC2 #HANGUL SYLLABLE KHIEUKH OE PHIEUPH +0xB299 0xCFC3 #HANGUL SYLLABLE KHIEUKH OE HIEUH +0xB29A 0xCFC5 #HANGUL SYLLABLE KHIEUKH YO KIYEOK +0xB29B 0xCFC6 #HANGUL SYLLABLE KHIEUKH YO SSANGKIYEOK +0xB29C 0xCFC7 #HANGUL SYLLABLE KHIEUKH YO KIYEOKSIOS +0xB29D 0xCFC8 #HANGUL SYLLABLE KHIEUKH YO NIEUN +0xB29E 0xCFC9 #HANGUL SYLLABLE KHIEUKH YO NIEUNCIEUC +0xB29F 0xCFCA #HANGUL SYLLABLE KHIEUKH YO NIEUNHIEUH +0xB2A0 0xCFCB #HANGUL SYLLABLE KHIEUKH YO TIKEUT +0xB2A1 0xAE79 #HANGUL SYLLABLE SSANGKIYEOK AE PIEUP +0xB2A2 0xAE7B #HANGUL SYLLABLE SSANGKIYEOK AE SIOS +0xB2A3 0xAE7C #HANGUL SYLLABLE SSANGKIYEOK AE SSANGSIOS +0xB2A4 0xAE7D #HANGUL SYLLABLE SSANGKIYEOK AE IEUNG +0xB2A5 0xAE84 #HANGUL SYLLABLE SSANGKIYEOK YA +0xB2A6 0xAE85 #HANGUL SYLLABLE SSANGKIYEOK YA KIYEOK +0xB2A7 0xAE8C #HANGUL SYLLABLE SSANGKIYEOK YA RIEUL +0xB2A8 0xAEBC #HANGUL SYLLABLE SSANGKIYEOK EO +0xB2A9 0xAEBD #HANGUL SYLLABLE SSANGKIYEOK EO KIYEOK +0xB2AA 0xAEBE #HANGUL SYLLABLE SSANGKIYEOK EO SSANGKIYEOK +0xB2AB 0xAEC0 #HANGUL SYLLABLE SSANGKIYEOK EO NIEUN +0xB2AC 0xAEC4 #HANGUL SYLLABLE SSANGKIYEOK EO RIEUL +0xB2AD 0xAECC #HANGUL SYLLABLE SSANGKIYEOK EO MIEUM +0xB2AE 0xAECD #HANGUL SYLLABLE SSANGKIYEOK EO PIEUP +0xB2AF 0xAECF #HANGUL SYLLABLE SSANGKIYEOK EO SIOS +0xB2B0 0xAED0 #HANGUL SYLLABLE SSANGKIYEOK EO SSANGSIOS +0xB2B1 0xAED1 #HANGUL SYLLABLE SSANGKIYEOK EO IEUNG +0xB2B2 0xAED8 #HANGUL SYLLABLE SSANGKIYEOK E +0xB2B3 0xAED9 #HANGUL SYLLABLE SSANGKIYEOK E KIYEOK +0xB2B4 0xAEDC #HANGUL SYLLABLE SSANGKIYEOK E NIEUN +0xB2B5 0xAEE8 #HANGUL SYLLABLE SSANGKIYEOK E MIEUM +0xB2B6 0xAEEB #HANGUL SYLLABLE SSANGKIYEOK E SIOS +0xB2B7 0xAEED #HANGUL SYLLABLE SSANGKIYEOK E IEUNG +0xB2B8 0xAEF4 #HANGUL SYLLABLE SSANGKIYEOK YEO +0xB2B9 0xAEF8 #HANGUL SYLLABLE SSANGKIYEOK YEO NIEUN +0xB2BA 0xAEFC #HANGUL SYLLABLE SSANGKIYEOK YEO RIEUL +0xB2BB 0xAF07 #HANGUL SYLLABLE SSANGKIYEOK YEO SIOS +0xB2BC 0xAF08 #HANGUL SYLLABLE SSANGKIYEOK YEO SSANGSIOS +0xB2BD 0xAF0D #HANGUL SYLLABLE SSANGKIYEOK YEO THIEUTH +0xB2BE 0xAF10 #HANGUL SYLLABLE SSANGKIYEOK YE +0xB2BF 0xAF2C #HANGUL SYLLABLE SSANGKIYEOK O +0xB2C0 0xAF2D #HANGUL SYLLABLE SSANGKIYEOK O KIYEOK +0xB2C1 0xAF30 #HANGUL SYLLABLE SSANGKIYEOK O NIEUN +0xB2C2 0xAF32 #HANGUL SYLLABLE SSANGKIYEOK O NIEUNHIEUH +0xB2C3 0xAF34 #HANGUL SYLLABLE SSANGKIYEOK O RIEUL +0xB2C4 0xAF3C #HANGUL SYLLABLE SSANGKIYEOK O MIEUM +0xB2C5 0xAF3D #HANGUL SYLLABLE SSANGKIYEOK O PIEUP +0xB2C6 0xAF3F #HANGUL SYLLABLE SSANGKIYEOK O SIOS +0xB2C7 0xAF41 #HANGUL SYLLABLE SSANGKIYEOK O IEUNG +0xB2C8 0xAF42 #HANGUL SYLLABLE SSANGKIYEOK O CIEUC +0xB2C9 0xAF43 #HANGUL SYLLABLE SSANGKIYEOK O CHIEUCH +0xB2CA 0xAF48 #HANGUL SYLLABLE SSANGKIYEOK WA +0xB2CB 0xAF49 #HANGUL SYLLABLE SSANGKIYEOK WA KIYEOK +0xB2CC 0xAF50 #HANGUL SYLLABLE SSANGKIYEOK WA RIEUL +0xB2CD 0xAF5C #HANGUL SYLLABLE SSANGKIYEOK WA SSANGSIOS +0xB2CE 0xAF5D #HANGUL SYLLABLE SSANGKIYEOK WA IEUNG +0xB2CF 0xAF64 #HANGUL SYLLABLE SSANGKIYEOK WAE +0xB2D0 0xAF65 #HANGUL SYLLABLE SSANGKIYEOK WAE KIYEOK +0xB2D1 0xAF79 #HANGUL SYLLABLE SSANGKIYEOK WAE IEUNG +0xB2D2 0xAF80 #HANGUL SYLLABLE SSANGKIYEOK OE +0xB2D3 0xAF84 #HANGUL SYLLABLE SSANGKIYEOK OE NIEUN +0xB2D4 0xAF88 #HANGUL SYLLABLE SSANGKIYEOK OE RIEUL +0xB2D5 0xAF90 #HANGUL SYLLABLE SSANGKIYEOK OE MIEUM +0xB2D6 0xAF91 #HANGUL SYLLABLE SSANGKIYEOK OE PIEUP +0xB2D7 0xAF95 #HANGUL SYLLABLE SSANGKIYEOK OE IEUNG +0xB2D8 0xAF9C #HANGUL SYLLABLE SSANGKIYEOK YO +0xB2D9 0xAFB8 #HANGUL SYLLABLE SSANGKIYEOK U +0xB2DA 0xAFB9 #HANGUL SYLLABLE SSANGKIYEOK U KIYEOK +0xB2DB 0xAFBC #HANGUL SYLLABLE SSANGKIYEOK U NIEUN +0xB2DC 0xAFC0 #HANGUL SYLLABLE SSANGKIYEOK U RIEUL +0xB2DD 0xAFC7 #HANGUL SYLLABLE SSANGKIYEOK U RIEULHIEUH +0xB2DE 0xAFC8 #HANGUL SYLLABLE SSANGKIYEOK U MIEUM +0xB2DF 0xAFC9 #HANGUL SYLLABLE SSANGKIYEOK U PIEUP +0xB2E0 0xAFCB #HANGUL SYLLABLE SSANGKIYEOK U SIOS +0xB2E1 0xAFCD #HANGUL SYLLABLE SSANGKIYEOK U IEUNG +0xB2E2 0xAFCE #HANGUL SYLLABLE SSANGKIYEOK U CIEUC +0xB2E3 0xAFD4 #HANGUL SYLLABLE SSANGKIYEOK WEO +0xB2E4 0xAFDC #HANGUL SYLLABLE SSANGKIYEOK WEO RIEUL +0xB2E5 0xAFE8 #HANGUL SYLLABLE SSANGKIYEOK WEO SSANGSIOS +0xB2E6 0xAFE9 #HANGUL SYLLABLE SSANGKIYEOK WEO IEUNG +0xB2E7 0xAFF0 #HANGUL SYLLABLE SSANGKIYEOK WE +0xB2E8 0xAFF1 #HANGUL SYLLABLE SSANGKIYEOK WE KIYEOK +0xB2E9 0xAFF4 #HANGUL SYLLABLE SSANGKIYEOK WE NIEUN +0xB2EA 0xAFF8 #HANGUL SYLLABLE SSANGKIYEOK WE RIEUL +0xB2EB 0xB000 #HANGUL SYLLABLE SSANGKIYEOK WE MIEUM +0xB2EC 0xB001 #HANGUL SYLLABLE SSANGKIYEOK WE PIEUP +0xB2ED 0xB004 #HANGUL SYLLABLE SSANGKIYEOK WE SSANGSIOS +0xB2EE 0xB00C #HANGUL SYLLABLE SSANGKIYEOK WI +0xB2EF 0xB010 #HANGUL SYLLABLE SSANGKIYEOK WI NIEUN +0xB2F0 0xB014 #HANGUL SYLLABLE SSANGKIYEOK WI RIEUL +0xB2F1 0xB01C #HANGUL SYLLABLE SSANGKIYEOK WI MIEUM +0xB2F2 0xB01D #HANGUL SYLLABLE SSANGKIYEOK WI PIEUP +0xB2F3 0xB028 #HANGUL SYLLABLE SSANGKIYEOK YU +0xB2F4 0xB044 #HANGUL SYLLABLE SSANGKIYEOK EU +0xB2F5 0xB045 #HANGUL SYLLABLE SSANGKIYEOK EU KIYEOK +0xB2F6 0xB048 #HANGUL SYLLABLE SSANGKIYEOK EU NIEUN +0xB2F7 0xB04A #HANGUL SYLLABLE SSANGKIYEOK EU NIEUNHIEUH +0xB2F8 0xB04C #HANGUL SYLLABLE SSANGKIYEOK EU RIEUL +0xB2F9 0xB04E #HANGUL SYLLABLE SSANGKIYEOK EU RIEULMIEUM +0xB2FA 0xB053 #HANGUL SYLLABLE SSANGKIYEOK EU RIEULHIEUH +0xB2FB 0xB054 #HANGUL SYLLABLE SSANGKIYEOK EU MIEUM +0xB2FC 0xB055 #HANGUL SYLLABLE SSANGKIYEOK EU PIEUP +0xB2FD 0xB057 #HANGUL SYLLABLE SSANGKIYEOK EU SIOS +0xB2FE 0xB059 #HANGUL SYLLABLE SSANGKIYEOK EU IEUNG +0xB341 0xCFCC #HANGUL SYLLABLE KHIEUKH YO RIEUL +0xB342 0xCFCD #HANGUL SYLLABLE KHIEUKH YO RIEULKIYEOK +0xB343 0xCFCE #HANGUL SYLLABLE KHIEUKH YO RIEULMIEUM +0xB344 0xCFCF #HANGUL SYLLABLE KHIEUKH YO RIEULPIEUP +0xB345 0xCFD0 #HANGUL SYLLABLE KHIEUKH YO RIEULSIOS +0xB346 0xCFD1 #HANGUL SYLLABLE KHIEUKH YO RIEULTHIEUTH +0xB347 0xCFD2 #HANGUL SYLLABLE KHIEUKH YO RIEULPHIEUPH +0xB348 0xCFD3 #HANGUL SYLLABLE KHIEUKH YO RIEULHIEUH +0xB349 0xCFD4 #HANGUL SYLLABLE KHIEUKH YO MIEUM +0xB34A 0xCFD5 #HANGUL SYLLABLE KHIEUKH YO PIEUP +0xB34B 0xCFD6 #HANGUL SYLLABLE KHIEUKH YO PIEUPSIOS +0xB34C 0xCFD7 #HANGUL SYLLABLE KHIEUKH YO SIOS +0xB34D 0xCFD8 #HANGUL SYLLABLE KHIEUKH YO SSANGSIOS +0xB34E 0xCFD9 #HANGUL SYLLABLE KHIEUKH YO IEUNG +0xB34F 0xCFDA #HANGUL SYLLABLE KHIEUKH YO CIEUC +0xB350 0xCFDB #HANGUL SYLLABLE KHIEUKH YO CHIEUCH +0xB351 0xCFDC #HANGUL SYLLABLE KHIEUKH YO KHIEUKH +0xB352 0xCFDD #HANGUL SYLLABLE KHIEUKH YO THIEUTH +0xB353 0xCFDE #HANGUL SYLLABLE KHIEUKH YO PHIEUPH +0xB354 0xCFDF #HANGUL SYLLABLE KHIEUKH YO HIEUH +0xB355 0xCFE2 #HANGUL SYLLABLE KHIEUKH U SSANGKIYEOK +0xB356 0xCFE3 #HANGUL SYLLABLE KHIEUKH U KIYEOKSIOS +0xB357 0xCFE5 #HANGUL SYLLABLE KHIEUKH U NIEUNCIEUC +0xB358 0xCFE6 #HANGUL SYLLABLE KHIEUKH U NIEUNHIEUH +0xB359 0xCFE7 #HANGUL SYLLABLE KHIEUKH U TIKEUT +0xB35A 0xCFE9 #HANGUL SYLLABLE KHIEUKH U RIEULKIYEOK +0xB361 0xCFEA #HANGUL SYLLABLE KHIEUKH U RIEULMIEUM +0xB362 0xCFEB #HANGUL SYLLABLE KHIEUKH U RIEULPIEUP +0xB363 0xCFEC #HANGUL SYLLABLE KHIEUKH U RIEULSIOS +0xB364 0xCFED #HANGUL SYLLABLE KHIEUKH U RIEULTHIEUTH +0xB365 0xCFEE #HANGUL SYLLABLE KHIEUKH U RIEULPHIEUPH +0xB366 0xCFEF #HANGUL SYLLABLE KHIEUKH U RIEULHIEUH +0xB367 0xCFF2 #HANGUL SYLLABLE KHIEUKH U PIEUPSIOS +0xB368 0xCFF4 #HANGUL SYLLABLE KHIEUKH U SSANGSIOS +0xB369 0xCFF6 #HANGUL SYLLABLE KHIEUKH U CIEUC +0xB36A 0xCFF7 #HANGUL SYLLABLE KHIEUKH U CHIEUCH +0xB36B 0xCFF8 #HANGUL SYLLABLE KHIEUKH U KHIEUKH +0xB36C 0xCFF9 #HANGUL SYLLABLE KHIEUKH U THIEUTH +0xB36D 0xCFFA #HANGUL SYLLABLE KHIEUKH U PHIEUPH +0xB36E 0xCFFB #HANGUL SYLLABLE KHIEUKH U HIEUH +0xB36F 0xCFFD #HANGUL SYLLABLE KHIEUKH WEO KIYEOK +0xB370 0xCFFE #HANGUL SYLLABLE KHIEUKH WEO SSANGKIYEOK +0xB371 0xCFFF #HANGUL SYLLABLE KHIEUKH WEO KIYEOKSIOS +0xB372 0xD001 #HANGUL SYLLABLE KHIEUKH WEO NIEUNCIEUC +0xB373 0xD002 #HANGUL SYLLABLE KHIEUKH WEO NIEUNHIEUH +0xB374 0xD003 #HANGUL SYLLABLE KHIEUKH WEO TIKEUT +0xB375 0xD005 #HANGUL SYLLABLE KHIEUKH WEO RIEULKIYEOK +0xB376 0xD006 #HANGUL SYLLABLE KHIEUKH WEO RIEULMIEUM +0xB377 0xD007 #HANGUL SYLLABLE KHIEUKH WEO RIEULPIEUP +0xB378 0xD008 #HANGUL SYLLABLE KHIEUKH WEO RIEULSIOS +0xB379 0xD009 #HANGUL SYLLABLE KHIEUKH WEO RIEULTHIEUTH +0xB37A 0xD00A #HANGUL SYLLABLE KHIEUKH WEO RIEULPHIEUPH +0xB381 0xD00B #HANGUL SYLLABLE KHIEUKH WEO RIEULHIEUH +0xB382 0xD00C #HANGUL SYLLABLE KHIEUKH WEO MIEUM +0xB383 0xD00D #HANGUL SYLLABLE KHIEUKH WEO PIEUP +0xB384 0xD00E #HANGUL SYLLABLE KHIEUKH WEO PIEUPSIOS +0xB385 0xD00F #HANGUL SYLLABLE KHIEUKH WEO SIOS +0xB386 0xD010 #HANGUL SYLLABLE KHIEUKH WEO SSANGSIOS +0xB387 0xD012 #HANGUL SYLLABLE KHIEUKH WEO CIEUC +0xB388 0xD013 #HANGUL SYLLABLE KHIEUKH WEO CHIEUCH +0xB389 0xD014 #HANGUL SYLLABLE KHIEUKH WEO KHIEUKH +0xB38A 0xD015 #HANGUL SYLLABLE KHIEUKH WEO THIEUTH +0xB38B 0xD016 #HANGUL SYLLABLE KHIEUKH WEO PHIEUPH +0xB38C 0xD017 #HANGUL SYLLABLE KHIEUKH WEO HIEUH +0xB38D 0xD019 #HANGUL SYLLABLE KHIEUKH WE KIYEOK +0xB38E 0xD01A #HANGUL SYLLABLE KHIEUKH WE SSANGKIYEOK +0xB38F 0xD01B #HANGUL SYLLABLE KHIEUKH WE KIYEOKSIOS +0xB390 0xD01C #HANGUL SYLLABLE KHIEUKH WE NIEUN +0xB391 0xD01D #HANGUL SYLLABLE KHIEUKH WE NIEUNCIEUC +0xB392 0xD01E #HANGUL SYLLABLE KHIEUKH WE NIEUNHIEUH +0xB393 0xD01F #HANGUL SYLLABLE KHIEUKH WE TIKEUT +0xB394 0xD020 #HANGUL SYLLABLE KHIEUKH WE RIEUL +0xB395 0xD021 #HANGUL SYLLABLE KHIEUKH WE RIEULKIYEOK +0xB396 0xD022 #HANGUL SYLLABLE KHIEUKH WE RIEULMIEUM +0xB397 0xD023 #HANGUL SYLLABLE KHIEUKH WE RIEULPIEUP +0xB398 0xD024 #HANGUL SYLLABLE KHIEUKH WE RIEULSIOS +0xB399 0xD025 #HANGUL SYLLABLE KHIEUKH WE RIEULTHIEUTH +0xB39A 0xD026 #HANGUL SYLLABLE KHIEUKH WE RIEULPHIEUPH +0xB39B 0xD027 #HANGUL SYLLABLE KHIEUKH WE RIEULHIEUH +0xB39C 0xD028 #HANGUL SYLLABLE KHIEUKH WE MIEUM +0xB39D 0xD029 #HANGUL SYLLABLE KHIEUKH WE PIEUP +0xB39E 0xD02A #HANGUL SYLLABLE KHIEUKH WE PIEUPSIOS +0xB39F 0xD02B #HANGUL SYLLABLE KHIEUKH WE SIOS +0xB3A0 0xD02C #HANGUL SYLLABLE KHIEUKH WE SSANGSIOS +0xB3A1 0xB05D #HANGUL SYLLABLE SSANGKIYEOK EU THIEUTH +0xB3A2 0xB07C #HANGUL SYLLABLE SSANGKIYEOK I +0xB3A3 0xB07D #HANGUL SYLLABLE SSANGKIYEOK I KIYEOK +0xB3A4 0xB080 #HANGUL SYLLABLE SSANGKIYEOK I NIEUN +0xB3A5 0xB084 #HANGUL SYLLABLE SSANGKIYEOK I RIEUL +0xB3A6 0xB08C #HANGUL SYLLABLE SSANGKIYEOK I MIEUM +0xB3A7 0xB08D #HANGUL SYLLABLE SSANGKIYEOK I PIEUP +0xB3A8 0xB08F #HANGUL SYLLABLE SSANGKIYEOK I SIOS +0xB3A9 0xB091 #HANGUL SYLLABLE SSANGKIYEOK I IEUNG +0xB3AA 0xB098 #HANGUL SYLLABLE NIEUN A +0xB3AB 0xB099 #HANGUL SYLLABLE NIEUN A KIYEOK +0xB3AC 0xB09A #HANGUL SYLLABLE NIEUN A SSANGKIYEOK +0xB3AD 0xB09C #HANGUL SYLLABLE NIEUN A NIEUN +0xB3AE 0xB09F #HANGUL SYLLABLE NIEUN A TIKEUT +0xB3AF 0xB0A0 #HANGUL SYLLABLE NIEUN A RIEUL +0xB3B0 0xB0A1 #HANGUL SYLLABLE NIEUN A RIEULKIYEOK +0xB3B1 0xB0A2 #HANGUL SYLLABLE NIEUN A RIEULMIEUM +0xB3B2 0xB0A8 #HANGUL SYLLABLE NIEUN A MIEUM +0xB3B3 0xB0A9 #HANGUL SYLLABLE NIEUN A PIEUP +0xB3B4 0xB0AB #HANGUL SYLLABLE NIEUN A SIOS +0xB3B5 0xB0AC #HANGUL SYLLABLE NIEUN A SSANGSIOS +0xB3B6 0xB0AD #HANGUL SYLLABLE NIEUN A IEUNG +0xB3B7 0xB0AE #HANGUL SYLLABLE NIEUN A CIEUC +0xB3B8 0xB0AF #HANGUL SYLLABLE NIEUN A CHIEUCH +0xB3B9 0xB0B1 #HANGUL SYLLABLE NIEUN A THIEUTH +0xB3BA 0xB0B3 #HANGUL SYLLABLE NIEUN A HIEUH +0xB3BB 0xB0B4 #HANGUL SYLLABLE NIEUN AE +0xB3BC 0xB0B5 #HANGUL SYLLABLE NIEUN AE KIYEOK +0xB3BD 0xB0B8 #HANGUL SYLLABLE NIEUN AE NIEUN +0xB3BE 0xB0BC #HANGUL SYLLABLE NIEUN AE RIEUL +0xB3BF 0xB0C4 #HANGUL SYLLABLE NIEUN AE MIEUM +0xB3C0 0xB0C5 #HANGUL SYLLABLE NIEUN AE PIEUP +0xB3C1 0xB0C7 #HANGUL SYLLABLE NIEUN AE SIOS +0xB3C2 0xB0C8 #HANGUL SYLLABLE NIEUN AE SSANGSIOS +0xB3C3 0xB0C9 #HANGUL SYLLABLE NIEUN AE IEUNG +0xB3C4 0xB0D0 #HANGUL SYLLABLE NIEUN YA +0xB3C5 0xB0D1 #HANGUL SYLLABLE NIEUN YA KIYEOK +0xB3C6 0xB0D4 #HANGUL SYLLABLE NIEUN YA NIEUN +0xB3C7 0xB0D8 #HANGUL SYLLABLE NIEUN YA RIEUL +0xB3C8 0xB0E0 #HANGUL SYLLABLE NIEUN YA MIEUM +0xB3C9 0xB0E5 #HANGUL SYLLABLE NIEUN YA IEUNG +0xB3CA 0xB108 #HANGUL SYLLABLE NIEUN EO +0xB3CB 0xB109 #HANGUL SYLLABLE NIEUN EO KIYEOK +0xB3CC 0xB10B #HANGUL SYLLABLE NIEUN EO KIYEOKSIOS +0xB3CD 0xB10C #HANGUL SYLLABLE NIEUN EO NIEUN +0xB3CE 0xB110 #HANGUL SYLLABLE NIEUN EO RIEUL +0xB3CF 0xB112 #HANGUL SYLLABLE NIEUN EO RIEULMIEUM +0xB3D0 0xB113 #HANGUL SYLLABLE NIEUN EO RIEULPIEUP +0xB3D1 0xB118 #HANGUL SYLLABLE NIEUN EO MIEUM +0xB3D2 0xB119 #HANGUL SYLLABLE NIEUN EO PIEUP +0xB3D3 0xB11B #HANGUL SYLLABLE NIEUN EO SIOS +0xB3D4 0xB11C #HANGUL SYLLABLE NIEUN EO SSANGSIOS +0xB3D5 0xB11D #HANGUL SYLLABLE NIEUN EO IEUNG +0xB3D6 0xB123 #HANGUL SYLLABLE NIEUN EO HIEUH +0xB3D7 0xB124 #HANGUL SYLLABLE NIEUN E +0xB3D8 0xB125 #HANGUL SYLLABLE NIEUN E KIYEOK +0xB3D9 0xB128 #HANGUL SYLLABLE NIEUN E NIEUN +0xB3DA 0xB12C #HANGUL SYLLABLE NIEUN E RIEUL +0xB3DB 0xB134 #HANGUL SYLLABLE NIEUN E MIEUM +0xB3DC 0xB135 #HANGUL SYLLABLE NIEUN E PIEUP +0xB3DD 0xB137 #HANGUL SYLLABLE NIEUN E SIOS +0xB3DE 0xB138 #HANGUL SYLLABLE NIEUN E SSANGSIOS +0xB3DF 0xB139 #HANGUL SYLLABLE NIEUN E IEUNG +0xB3E0 0xB140 #HANGUL SYLLABLE NIEUN YEO +0xB3E1 0xB141 #HANGUL SYLLABLE NIEUN YEO KIYEOK +0xB3E2 0xB144 #HANGUL SYLLABLE NIEUN YEO NIEUN +0xB3E3 0xB148 #HANGUL SYLLABLE NIEUN YEO RIEUL +0xB3E4 0xB150 #HANGUL SYLLABLE NIEUN YEO MIEUM +0xB3E5 0xB151 #HANGUL SYLLABLE NIEUN YEO PIEUP +0xB3E6 0xB154 #HANGUL SYLLABLE NIEUN YEO SSANGSIOS +0xB3E7 0xB155 #HANGUL SYLLABLE NIEUN YEO IEUNG +0xB3E8 0xB158 #HANGUL SYLLABLE NIEUN YEO KHIEUKH +0xB3E9 0xB15C #HANGUL SYLLABLE NIEUN YE +0xB3EA 0xB160 #HANGUL SYLLABLE NIEUN YE NIEUN +0xB3EB 0xB178 #HANGUL SYLLABLE NIEUN O +0xB3EC 0xB179 #HANGUL SYLLABLE NIEUN O KIYEOK +0xB3ED 0xB17C #HANGUL SYLLABLE NIEUN O NIEUN +0xB3EE 0xB180 #HANGUL SYLLABLE NIEUN O RIEUL +0xB3EF 0xB182 #HANGUL SYLLABLE NIEUN O RIEULMIEUM +0xB3F0 0xB188 #HANGUL SYLLABLE NIEUN O MIEUM +0xB3F1 0xB189 #HANGUL SYLLABLE NIEUN O PIEUP +0xB3F2 0xB18B #HANGUL SYLLABLE NIEUN O SIOS +0xB3F3 0xB18D #HANGUL SYLLABLE NIEUN O IEUNG +0xB3F4 0xB192 #HANGUL SYLLABLE NIEUN O PHIEUPH +0xB3F5 0xB193 #HANGUL SYLLABLE NIEUN O HIEUH +0xB3F6 0xB194 #HANGUL SYLLABLE NIEUN WA +0xB3F7 0xB198 #HANGUL SYLLABLE NIEUN WA NIEUN +0xB3F8 0xB19C #HANGUL SYLLABLE NIEUN WA RIEUL +0xB3F9 0xB1A8 #HANGUL SYLLABLE NIEUN WA SSANGSIOS +0xB3FA 0xB1CC #HANGUL SYLLABLE NIEUN OE +0xB3FB 0xB1D0 #HANGUL SYLLABLE NIEUN OE NIEUN +0xB3FC 0xB1D4 #HANGUL SYLLABLE NIEUN OE RIEUL +0xB3FD 0xB1DC #HANGUL SYLLABLE NIEUN OE MIEUM +0xB3FE 0xB1DD #HANGUL SYLLABLE NIEUN OE PIEUP +0xB441 0xD02E #HANGUL SYLLABLE KHIEUKH WE CIEUC +0xB442 0xD02F #HANGUL SYLLABLE KHIEUKH WE CHIEUCH +0xB443 0xD030 #HANGUL SYLLABLE KHIEUKH WE KHIEUKH +0xB444 0xD031 #HANGUL SYLLABLE KHIEUKH WE THIEUTH +0xB445 0xD032 #HANGUL SYLLABLE KHIEUKH WE PHIEUPH +0xB446 0xD033 #HANGUL SYLLABLE KHIEUKH WE HIEUH +0xB447 0xD036 #HANGUL SYLLABLE KHIEUKH WI SSANGKIYEOK +0xB448 0xD037 #HANGUL SYLLABLE KHIEUKH WI KIYEOKSIOS +0xB449 0xD039 #HANGUL SYLLABLE KHIEUKH WI NIEUNCIEUC +0xB44A 0xD03A #HANGUL SYLLABLE KHIEUKH WI NIEUNHIEUH +0xB44B 0xD03B #HANGUL SYLLABLE KHIEUKH WI TIKEUT +0xB44C 0xD03D #HANGUL SYLLABLE KHIEUKH WI RIEULKIYEOK +0xB44D 0xD03E #HANGUL SYLLABLE KHIEUKH WI RIEULMIEUM +0xB44E 0xD03F #HANGUL SYLLABLE KHIEUKH WI RIEULPIEUP +0xB44F 0xD040 #HANGUL SYLLABLE KHIEUKH WI RIEULSIOS +0xB450 0xD041 #HANGUL SYLLABLE KHIEUKH WI RIEULTHIEUTH +0xB451 0xD042 #HANGUL SYLLABLE KHIEUKH WI RIEULPHIEUPH +0xB452 0xD043 #HANGUL SYLLABLE KHIEUKH WI RIEULHIEUH +0xB453 0xD046 #HANGUL SYLLABLE KHIEUKH WI PIEUPSIOS +0xB454 0xD048 #HANGUL SYLLABLE KHIEUKH WI SSANGSIOS +0xB455 0xD04A #HANGUL SYLLABLE KHIEUKH WI CIEUC +0xB456 0xD04B #HANGUL SYLLABLE KHIEUKH WI CHIEUCH +0xB457 0xD04C #HANGUL SYLLABLE KHIEUKH WI KHIEUKH +0xB458 0xD04D #HANGUL SYLLABLE KHIEUKH WI THIEUTH +0xB459 0xD04E #HANGUL SYLLABLE KHIEUKH WI PHIEUPH +0xB45A 0xD04F #HANGUL SYLLABLE KHIEUKH WI HIEUH +0xB461 0xD051 #HANGUL SYLLABLE KHIEUKH YU KIYEOK +0xB462 0xD052 #HANGUL SYLLABLE KHIEUKH YU SSANGKIYEOK +0xB463 0xD053 #HANGUL SYLLABLE KHIEUKH YU KIYEOKSIOS +0xB464 0xD055 #HANGUL SYLLABLE KHIEUKH YU NIEUNCIEUC +0xB465 0xD056 #HANGUL SYLLABLE KHIEUKH YU NIEUNHIEUH +0xB466 0xD057 #HANGUL SYLLABLE KHIEUKH YU TIKEUT +0xB467 0xD059 #HANGUL SYLLABLE KHIEUKH YU RIEULKIYEOK +0xB468 0xD05A #HANGUL SYLLABLE KHIEUKH YU RIEULMIEUM +0xB469 0xD05B #HANGUL SYLLABLE KHIEUKH YU RIEULPIEUP +0xB46A 0xD05C #HANGUL SYLLABLE KHIEUKH YU RIEULSIOS +0xB46B 0xD05D #HANGUL SYLLABLE KHIEUKH YU RIEULTHIEUTH +0xB46C 0xD05E #HANGUL SYLLABLE KHIEUKH YU RIEULPHIEUPH +0xB46D 0xD05F #HANGUL SYLLABLE KHIEUKH YU RIEULHIEUH +0xB46E 0xD061 #HANGUL SYLLABLE KHIEUKH YU PIEUP +0xB46F 0xD062 #HANGUL SYLLABLE KHIEUKH YU PIEUPSIOS +0xB470 0xD063 #HANGUL SYLLABLE KHIEUKH YU SIOS +0xB471 0xD064 #HANGUL SYLLABLE KHIEUKH YU SSANGSIOS +0xB472 0xD065 #HANGUL SYLLABLE KHIEUKH YU IEUNG +0xB473 0xD066 #HANGUL SYLLABLE KHIEUKH YU CIEUC +0xB474 0xD067 #HANGUL SYLLABLE KHIEUKH YU CHIEUCH +0xB475 0xD068 #HANGUL SYLLABLE KHIEUKH YU KHIEUKH +0xB476 0xD069 #HANGUL SYLLABLE KHIEUKH YU THIEUTH +0xB477 0xD06A #HANGUL SYLLABLE KHIEUKH YU PHIEUPH +0xB478 0xD06B #HANGUL SYLLABLE KHIEUKH YU HIEUH +0xB479 0xD06E #HANGUL SYLLABLE KHIEUKH EU SSANGKIYEOK +0xB47A 0xD06F #HANGUL SYLLABLE KHIEUKH EU KIYEOKSIOS +0xB481 0xD071 #HANGUL SYLLABLE KHIEUKH EU NIEUNCIEUC +0xB482 0xD072 #HANGUL SYLLABLE KHIEUKH EU NIEUNHIEUH +0xB483 0xD073 #HANGUL SYLLABLE KHIEUKH EU TIKEUT +0xB484 0xD075 #HANGUL SYLLABLE KHIEUKH EU RIEULKIYEOK +0xB485 0xD076 #HANGUL SYLLABLE KHIEUKH EU RIEULMIEUM +0xB486 0xD077 #HANGUL SYLLABLE KHIEUKH EU RIEULPIEUP +0xB487 0xD078 #HANGUL SYLLABLE KHIEUKH EU RIEULSIOS +0xB488 0xD079 #HANGUL SYLLABLE KHIEUKH EU RIEULTHIEUTH +0xB489 0xD07A #HANGUL SYLLABLE KHIEUKH EU RIEULPHIEUPH +0xB48A 0xD07B #HANGUL SYLLABLE KHIEUKH EU RIEULHIEUH +0xB48B 0xD07E #HANGUL SYLLABLE KHIEUKH EU PIEUPSIOS +0xB48C 0xD07F #HANGUL SYLLABLE KHIEUKH EU SIOS +0xB48D 0xD080 #HANGUL SYLLABLE KHIEUKH EU SSANGSIOS +0xB48E 0xD082 #HANGUL SYLLABLE KHIEUKH EU CIEUC +0xB48F 0xD083 #HANGUL SYLLABLE KHIEUKH EU CHIEUCH +0xB490 0xD084 #HANGUL SYLLABLE KHIEUKH EU KHIEUKH +0xB491 0xD085 #HANGUL SYLLABLE KHIEUKH EU THIEUTH +0xB492 0xD086 #HANGUL SYLLABLE KHIEUKH EU PHIEUPH +0xB493 0xD087 #HANGUL SYLLABLE KHIEUKH EU HIEUH +0xB494 0xD088 #HANGUL SYLLABLE KHIEUKH YI +0xB495 0xD089 #HANGUL SYLLABLE KHIEUKH YI KIYEOK +0xB496 0xD08A #HANGUL SYLLABLE KHIEUKH YI SSANGKIYEOK +0xB497 0xD08B #HANGUL SYLLABLE KHIEUKH YI KIYEOKSIOS +0xB498 0xD08C #HANGUL SYLLABLE KHIEUKH YI NIEUN +0xB499 0xD08D #HANGUL SYLLABLE KHIEUKH YI NIEUNCIEUC +0xB49A 0xD08E #HANGUL SYLLABLE KHIEUKH YI NIEUNHIEUH +0xB49B 0xD08F #HANGUL SYLLABLE KHIEUKH YI TIKEUT +0xB49C 0xD090 #HANGUL SYLLABLE KHIEUKH YI RIEUL +0xB49D 0xD091 #HANGUL SYLLABLE KHIEUKH YI RIEULKIYEOK +0xB49E 0xD092 #HANGUL SYLLABLE KHIEUKH YI RIEULMIEUM +0xB49F 0xD093 #HANGUL SYLLABLE KHIEUKH YI RIEULPIEUP +0xB4A0 0xD094 #HANGUL SYLLABLE KHIEUKH YI RIEULSIOS +0xB4A1 0xB1DF #HANGUL SYLLABLE NIEUN OE SIOS +0xB4A2 0xB1E8 #HANGUL SYLLABLE NIEUN YO +0xB4A3 0xB1E9 #HANGUL SYLLABLE NIEUN YO KIYEOK +0xB4A4 0xB1EC #HANGUL SYLLABLE NIEUN YO NIEUN +0xB4A5 0xB1F0 #HANGUL SYLLABLE NIEUN YO RIEUL +0xB4A6 0xB1F9 #HANGUL SYLLABLE NIEUN YO PIEUP +0xB4A7 0xB1FB #HANGUL SYLLABLE NIEUN YO SIOS +0xB4A8 0xB1FD #HANGUL SYLLABLE NIEUN YO IEUNG +0xB4A9 0xB204 #HANGUL SYLLABLE NIEUN U +0xB4AA 0xB205 #HANGUL SYLLABLE NIEUN U KIYEOK +0xB4AB 0xB208 #HANGUL SYLLABLE NIEUN U NIEUN +0xB4AC 0xB20B #HANGUL SYLLABLE NIEUN U TIKEUT +0xB4AD 0xB20C #HANGUL SYLLABLE NIEUN U RIEUL +0xB4AE 0xB214 #HANGUL SYLLABLE NIEUN U MIEUM +0xB4AF 0xB215 #HANGUL SYLLABLE NIEUN U PIEUP +0xB4B0 0xB217 #HANGUL SYLLABLE NIEUN U SIOS +0xB4B1 0xB219 #HANGUL SYLLABLE NIEUN U IEUNG +0xB4B2 0xB220 #HANGUL SYLLABLE NIEUN WEO +0xB4B3 0xB234 #HANGUL SYLLABLE NIEUN WEO SSANGSIOS +0xB4B4 0xB23C #HANGUL SYLLABLE NIEUN WE +0xB4B5 0xB258 #HANGUL SYLLABLE NIEUN WI +0xB4B6 0xB25C #HANGUL SYLLABLE NIEUN WI NIEUN +0xB4B7 0xB260 #HANGUL SYLLABLE NIEUN WI RIEUL +0xB4B8 0xB268 #HANGUL SYLLABLE NIEUN WI MIEUM +0xB4B9 0xB269 #HANGUL SYLLABLE NIEUN WI PIEUP +0xB4BA 0xB274 #HANGUL SYLLABLE NIEUN YU +0xB4BB 0xB275 #HANGUL SYLLABLE NIEUN YU KIYEOK +0xB4BC 0xB27C #HANGUL SYLLABLE NIEUN YU RIEUL +0xB4BD 0xB284 #HANGUL SYLLABLE NIEUN YU MIEUM +0xB4BE 0xB285 #HANGUL SYLLABLE NIEUN YU PIEUP +0xB4BF 0xB289 #HANGUL SYLLABLE NIEUN YU IEUNG +0xB4C0 0xB290 #HANGUL SYLLABLE NIEUN EU +0xB4C1 0xB291 #HANGUL SYLLABLE NIEUN EU KIYEOK +0xB4C2 0xB294 #HANGUL SYLLABLE NIEUN EU NIEUN +0xB4C3 0xB298 #HANGUL SYLLABLE NIEUN EU RIEUL +0xB4C4 0xB299 #HANGUL SYLLABLE NIEUN EU RIEULKIYEOK +0xB4C5 0xB29A #HANGUL SYLLABLE NIEUN EU RIEULMIEUM +0xB4C6 0xB2A0 #HANGUL SYLLABLE NIEUN EU MIEUM +0xB4C7 0xB2A1 #HANGUL SYLLABLE NIEUN EU PIEUP +0xB4C8 0xB2A3 #HANGUL SYLLABLE NIEUN EU SIOS +0xB4C9 0xB2A5 #HANGUL SYLLABLE NIEUN EU IEUNG +0xB4CA 0xB2A6 #HANGUL SYLLABLE NIEUN EU CIEUC +0xB4CB 0xB2AA #HANGUL SYLLABLE NIEUN EU PHIEUPH +0xB4CC 0xB2AC #HANGUL SYLLABLE NIEUN YI +0xB4CD 0xB2B0 #HANGUL SYLLABLE NIEUN YI NIEUN +0xB4CE 0xB2B4 #HANGUL SYLLABLE NIEUN YI RIEUL +0xB4CF 0xB2C8 #HANGUL SYLLABLE NIEUN I +0xB4D0 0xB2C9 #HANGUL SYLLABLE NIEUN I KIYEOK +0xB4D1 0xB2CC #HANGUL SYLLABLE NIEUN I NIEUN +0xB4D2 0xB2D0 #HANGUL SYLLABLE NIEUN I RIEUL +0xB4D3 0xB2D2 #HANGUL SYLLABLE NIEUN I RIEULMIEUM +0xB4D4 0xB2D8 #HANGUL SYLLABLE NIEUN I MIEUM +0xB4D5 0xB2D9 #HANGUL SYLLABLE NIEUN I PIEUP +0xB4D6 0xB2DB #HANGUL SYLLABLE NIEUN I SIOS +0xB4D7 0xB2DD #HANGUL SYLLABLE NIEUN I IEUNG +0xB4D8 0xB2E2 #HANGUL SYLLABLE NIEUN I PHIEUPH +0xB4D9 0xB2E4 #HANGUL SYLLABLE TIKEUT A +0xB4DA 0xB2E5 #HANGUL SYLLABLE TIKEUT A KIYEOK +0xB4DB 0xB2E6 #HANGUL SYLLABLE TIKEUT A SSANGKIYEOK +0xB4DC 0xB2E8 #HANGUL SYLLABLE TIKEUT A NIEUN +0xB4DD 0xB2EB #HANGUL SYLLABLE TIKEUT A TIKEUT +0xB4DE 0xB2EC #HANGUL SYLLABLE TIKEUT A RIEUL +0xB4DF 0xB2ED #HANGUL SYLLABLE TIKEUT A RIEULKIYEOK +0xB4E0 0xB2EE #HANGUL SYLLABLE TIKEUT A RIEULMIEUM +0xB4E1 0xB2EF #HANGUL SYLLABLE TIKEUT A RIEULPIEUP +0xB4E2 0xB2F3 #HANGUL SYLLABLE TIKEUT A RIEULHIEUH +0xB4E3 0xB2F4 #HANGUL SYLLABLE TIKEUT A MIEUM +0xB4E4 0xB2F5 #HANGUL SYLLABLE TIKEUT A PIEUP +0xB4E5 0xB2F7 #HANGUL SYLLABLE TIKEUT A SIOS +0xB4E6 0xB2F8 #HANGUL SYLLABLE TIKEUT A SSANGSIOS +0xB4E7 0xB2F9 #HANGUL SYLLABLE TIKEUT A IEUNG +0xB4E8 0xB2FA #HANGUL SYLLABLE TIKEUT A CIEUC +0xB4E9 0xB2FB #HANGUL SYLLABLE TIKEUT A CHIEUCH +0xB4EA 0xB2FF #HANGUL SYLLABLE TIKEUT A HIEUH +0xB4EB 0xB300 #HANGUL SYLLABLE TIKEUT AE +0xB4EC 0xB301 #HANGUL SYLLABLE TIKEUT AE KIYEOK +0xB4ED 0xB304 #HANGUL SYLLABLE TIKEUT AE NIEUN +0xB4EE 0xB308 #HANGUL SYLLABLE TIKEUT AE RIEUL +0xB4EF 0xB310 #HANGUL SYLLABLE TIKEUT AE MIEUM +0xB4F0 0xB311 #HANGUL SYLLABLE TIKEUT AE PIEUP +0xB4F1 0xB313 #HANGUL SYLLABLE TIKEUT AE SIOS +0xB4F2 0xB314 #HANGUL SYLLABLE TIKEUT AE SSANGSIOS +0xB4F3 0xB315 #HANGUL SYLLABLE TIKEUT AE IEUNG +0xB4F4 0xB31C #HANGUL SYLLABLE TIKEUT YA +0xB4F5 0xB354 #HANGUL SYLLABLE TIKEUT EO +0xB4F6 0xB355 #HANGUL SYLLABLE TIKEUT EO KIYEOK +0xB4F7 0xB356 #HANGUL SYLLABLE TIKEUT EO SSANGKIYEOK +0xB4F8 0xB358 #HANGUL SYLLABLE TIKEUT EO NIEUN +0xB4F9 0xB35B #HANGUL SYLLABLE TIKEUT EO TIKEUT +0xB4FA 0xB35C #HANGUL SYLLABLE TIKEUT EO RIEUL +0xB4FB 0xB35E #HANGUL SYLLABLE TIKEUT EO RIEULMIEUM +0xB4FC 0xB35F #HANGUL SYLLABLE TIKEUT EO RIEULPIEUP +0xB4FD 0xB364 #HANGUL SYLLABLE TIKEUT EO MIEUM +0xB4FE 0xB365 #HANGUL SYLLABLE TIKEUT EO PIEUP +0xB541 0xD095 #HANGUL SYLLABLE KHIEUKH YI RIEULTHIEUTH +0xB542 0xD096 #HANGUL SYLLABLE KHIEUKH YI RIEULPHIEUPH +0xB543 0xD097 #HANGUL SYLLABLE KHIEUKH YI RIEULHIEUH +0xB544 0xD098 #HANGUL SYLLABLE KHIEUKH YI MIEUM +0xB545 0xD099 #HANGUL SYLLABLE KHIEUKH YI PIEUP +0xB546 0xD09A #HANGUL SYLLABLE KHIEUKH YI PIEUPSIOS +0xB547 0xD09B #HANGUL SYLLABLE KHIEUKH YI SIOS +0xB548 0xD09C #HANGUL SYLLABLE KHIEUKH YI SSANGSIOS +0xB549 0xD09D #HANGUL SYLLABLE KHIEUKH YI IEUNG +0xB54A 0xD09E #HANGUL SYLLABLE KHIEUKH YI CIEUC +0xB54B 0xD09F #HANGUL SYLLABLE KHIEUKH YI CHIEUCH +0xB54C 0xD0A0 #HANGUL SYLLABLE KHIEUKH YI KHIEUKH +0xB54D 0xD0A1 #HANGUL SYLLABLE KHIEUKH YI THIEUTH +0xB54E 0xD0A2 #HANGUL SYLLABLE KHIEUKH YI PHIEUPH +0xB54F 0xD0A3 #HANGUL SYLLABLE KHIEUKH YI HIEUH +0xB550 0xD0A6 #HANGUL SYLLABLE KHIEUKH I SSANGKIYEOK +0xB551 0xD0A7 #HANGUL SYLLABLE KHIEUKH I KIYEOKSIOS +0xB552 0xD0A9 #HANGUL SYLLABLE KHIEUKH I NIEUNCIEUC +0xB553 0xD0AA #HANGUL SYLLABLE KHIEUKH I NIEUNHIEUH +0xB554 0xD0AB #HANGUL SYLLABLE KHIEUKH I TIKEUT +0xB555 0xD0AD #HANGUL SYLLABLE KHIEUKH I RIEULKIYEOK +0xB556 0xD0AE #HANGUL SYLLABLE KHIEUKH I RIEULMIEUM +0xB557 0xD0AF #HANGUL SYLLABLE KHIEUKH I RIEULPIEUP +0xB558 0xD0B0 #HANGUL SYLLABLE KHIEUKH I RIEULSIOS +0xB559 0xD0B1 #HANGUL SYLLABLE KHIEUKH I RIEULTHIEUTH +0xB55A 0xD0B2 #HANGUL SYLLABLE KHIEUKH I RIEULPHIEUPH +0xB561 0xD0B3 #HANGUL SYLLABLE KHIEUKH I RIEULHIEUH +0xB562 0xD0B6 #HANGUL SYLLABLE KHIEUKH I PIEUPSIOS +0xB563 0xD0B8 #HANGUL SYLLABLE KHIEUKH I SSANGSIOS +0xB564 0xD0BA #HANGUL SYLLABLE KHIEUKH I CIEUC +0xB565 0xD0BB #HANGUL SYLLABLE KHIEUKH I CHIEUCH +0xB566 0xD0BC #HANGUL SYLLABLE KHIEUKH I KHIEUKH +0xB567 0xD0BD #HANGUL SYLLABLE KHIEUKH I THIEUTH +0xB568 0xD0BE #HANGUL SYLLABLE KHIEUKH I PHIEUPH +0xB569 0xD0BF #HANGUL SYLLABLE KHIEUKH I HIEUH +0xB56A 0xD0C2 #HANGUL SYLLABLE THIEUTH A SSANGKIYEOK +0xB56B 0xD0C3 #HANGUL SYLLABLE THIEUTH A KIYEOKSIOS +0xB56C 0xD0C5 #HANGUL SYLLABLE THIEUTH A NIEUNCIEUC +0xB56D 0xD0C6 #HANGUL SYLLABLE THIEUTH A NIEUNHIEUH +0xB56E 0xD0C7 #HANGUL SYLLABLE THIEUTH A TIKEUT +0xB56F 0xD0CA #HANGUL SYLLABLE THIEUTH A RIEULMIEUM +0xB570 0xD0CB #HANGUL SYLLABLE THIEUTH A RIEULPIEUP +0xB571 0xD0CC #HANGUL SYLLABLE THIEUTH A RIEULSIOS +0xB572 0xD0CD #HANGUL SYLLABLE THIEUTH A RIEULTHIEUTH +0xB573 0xD0CE #HANGUL SYLLABLE THIEUTH A RIEULPHIEUPH +0xB574 0xD0CF #HANGUL SYLLABLE THIEUTH A RIEULHIEUH +0xB575 0xD0D2 #HANGUL SYLLABLE THIEUTH A PIEUPSIOS +0xB576 0xD0D6 #HANGUL SYLLABLE THIEUTH A CIEUC +0xB577 0xD0D7 #HANGUL SYLLABLE THIEUTH A CHIEUCH +0xB578 0xD0D8 #HANGUL SYLLABLE THIEUTH A KHIEUKH +0xB579 0xD0D9 #HANGUL SYLLABLE THIEUTH A THIEUTH +0xB57A 0xD0DA #HANGUL SYLLABLE THIEUTH A PHIEUPH +0xB581 0xD0DB #HANGUL SYLLABLE THIEUTH A HIEUH +0xB582 0xD0DE #HANGUL SYLLABLE THIEUTH AE SSANGKIYEOK +0xB583 0xD0DF #HANGUL SYLLABLE THIEUTH AE KIYEOKSIOS +0xB584 0xD0E1 #HANGUL SYLLABLE THIEUTH AE NIEUNCIEUC +0xB585 0xD0E2 #HANGUL SYLLABLE THIEUTH AE NIEUNHIEUH +0xB586 0xD0E3 #HANGUL SYLLABLE THIEUTH AE TIKEUT +0xB587 0xD0E5 #HANGUL SYLLABLE THIEUTH AE RIEULKIYEOK +0xB588 0xD0E6 #HANGUL SYLLABLE THIEUTH AE RIEULMIEUM +0xB589 0xD0E7 #HANGUL SYLLABLE THIEUTH AE RIEULPIEUP +0xB58A 0xD0E8 #HANGUL SYLLABLE THIEUTH AE RIEULSIOS +0xB58B 0xD0E9 #HANGUL SYLLABLE THIEUTH AE RIEULTHIEUTH +0xB58C 0xD0EA #HANGUL SYLLABLE THIEUTH AE RIEULPHIEUPH +0xB58D 0xD0EB #HANGUL SYLLABLE THIEUTH AE RIEULHIEUH +0xB58E 0xD0EE #HANGUL SYLLABLE THIEUTH AE PIEUPSIOS +0xB58F 0xD0F2 #HANGUL SYLLABLE THIEUTH AE CIEUC +0xB590 0xD0F3 #HANGUL SYLLABLE THIEUTH AE CHIEUCH +0xB591 0xD0F4 #HANGUL SYLLABLE THIEUTH AE KHIEUKH +0xB592 0xD0F5 #HANGUL SYLLABLE THIEUTH AE THIEUTH +0xB593 0xD0F6 #HANGUL SYLLABLE THIEUTH AE PHIEUPH +0xB594 0xD0F7 #HANGUL SYLLABLE THIEUTH AE HIEUH +0xB595 0xD0F9 #HANGUL SYLLABLE THIEUTH YA KIYEOK +0xB596 0xD0FA #HANGUL SYLLABLE THIEUTH YA SSANGKIYEOK +0xB597 0xD0FB #HANGUL SYLLABLE THIEUTH YA KIYEOKSIOS +0xB598 0xD0FC #HANGUL SYLLABLE THIEUTH YA NIEUN +0xB599 0xD0FD #HANGUL SYLLABLE THIEUTH YA NIEUNCIEUC +0xB59A 0xD0FE #HANGUL SYLLABLE THIEUTH YA NIEUNHIEUH +0xB59B 0xD0FF #HANGUL SYLLABLE THIEUTH YA TIKEUT +0xB59C 0xD100 #HANGUL SYLLABLE THIEUTH YA RIEUL +0xB59D 0xD101 #HANGUL SYLLABLE THIEUTH YA RIEULKIYEOK +0xB59E 0xD102 #HANGUL SYLLABLE THIEUTH YA RIEULMIEUM +0xB59F 0xD103 #HANGUL SYLLABLE THIEUTH YA RIEULPIEUP +0xB5A0 0xD104 #HANGUL SYLLABLE THIEUTH YA RIEULSIOS +0xB5A1 0xB367 #HANGUL SYLLABLE TIKEUT EO SIOS +0xB5A2 0xB369 #HANGUL SYLLABLE TIKEUT EO IEUNG +0xB5A3 0xB36B #HANGUL SYLLABLE TIKEUT EO CHIEUCH +0xB5A4 0xB36E #HANGUL SYLLABLE TIKEUT EO PHIEUPH +0xB5A5 0xB370 #HANGUL SYLLABLE TIKEUT E +0xB5A6 0xB371 #HANGUL SYLLABLE TIKEUT E KIYEOK +0xB5A7 0xB374 #HANGUL SYLLABLE TIKEUT E NIEUN +0xB5A8 0xB378 #HANGUL SYLLABLE TIKEUT E RIEUL +0xB5A9 0xB380 #HANGUL SYLLABLE TIKEUT E MIEUM +0xB5AA 0xB381 #HANGUL SYLLABLE TIKEUT E PIEUP +0xB5AB 0xB383 #HANGUL SYLLABLE TIKEUT E SIOS +0xB5AC 0xB384 #HANGUL SYLLABLE TIKEUT E SSANGSIOS +0xB5AD 0xB385 #HANGUL SYLLABLE TIKEUT E IEUNG +0xB5AE 0xB38C #HANGUL SYLLABLE TIKEUT YEO +0xB5AF 0xB390 #HANGUL SYLLABLE TIKEUT YEO NIEUN +0xB5B0 0xB394 #HANGUL SYLLABLE TIKEUT YEO RIEUL +0xB5B1 0xB3A0 #HANGUL SYLLABLE TIKEUT YEO SSANGSIOS +0xB5B2 0xB3A1 #HANGUL SYLLABLE TIKEUT YEO IEUNG +0xB5B3 0xB3A8 #HANGUL SYLLABLE TIKEUT YE +0xB5B4 0xB3AC #HANGUL SYLLABLE TIKEUT YE NIEUN +0xB5B5 0xB3C4 #HANGUL SYLLABLE TIKEUT O +0xB5B6 0xB3C5 #HANGUL SYLLABLE TIKEUT O KIYEOK +0xB5B7 0xB3C8 #HANGUL SYLLABLE TIKEUT O NIEUN +0xB5B8 0xB3CB #HANGUL SYLLABLE TIKEUT O TIKEUT +0xB5B9 0xB3CC #HANGUL SYLLABLE TIKEUT O RIEUL +0xB5BA 0xB3CE #HANGUL SYLLABLE TIKEUT O RIEULMIEUM +0xB5BB 0xB3D0 #HANGUL SYLLABLE TIKEUT O RIEULSIOS +0xB5BC 0xB3D4 #HANGUL SYLLABLE TIKEUT O MIEUM +0xB5BD 0xB3D5 #HANGUL SYLLABLE TIKEUT O PIEUP +0xB5BE 0xB3D7 #HANGUL SYLLABLE TIKEUT O SIOS +0xB5BF 0xB3D9 #HANGUL SYLLABLE TIKEUT O IEUNG +0xB5C0 0xB3DB #HANGUL SYLLABLE TIKEUT O CHIEUCH +0xB5C1 0xB3DD #HANGUL SYLLABLE TIKEUT O THIEUTH +0xB5C2 0xB3E0 #HANGUL SYLLABLE TIKEUT WA +0xB5C3 0xB3E4 #HANGUL SYLLABLE TIKEUT WA NIEUN +0xB5C4 0xB3E8 #HANGUL SYLLABLE TIKEUT WA RIEUL +0xB5C5 0xB3FC #HANGUL SYLLABLE TIKEUT WAE +0xB5C6 0xB410 #HANGUL SYLLABLE TIKEUT WAE SSANGSIOS +0xB5C7 0xB418 #HANGUL SYLLABLE TIKEUT OE +0xB5C8 0xB41C #HANGUL SYLLABLE TIKEUT OE NIEUN +0xB5C9 0xB420 #HANGUL SYLLABLE TIKEUT OE RIEUL +0xB5CA 0xB428 #HANGUL SYLLABLE TIKEUT OE MIEUM +0xB5CB 0xB429 #HANGUL SYLLABLE TIKEUT OE PIEUP +0xB5CC 0xB42B #HANGUL SYLLABLE TIKEUT OE SIOS +0xB5CD 0xB434 #HANGUL SYLLABLE TIKEUT YO +0xB5CE 0xB450 #HANGUL SYLLABLE TIKEUT U +0xB5CF 0xB451 #HANGUL SYLLABLE TIKEUT U KIYEOK +0xB5D0 0xB454 #HANGUL SYLLABLE TIKEUT U NIEUN +0xB5D1 0xB458 #HANGUL SYLLABLE TIKEUT U RIEUL +0xB5D2 0xB460 #HANGUL SYLLABLE TIKEUT U MIEUM +0xB5D3 0xB461 #HANGUL SYLLABLE TIKEUT U PIEUP +0xB5D4 0xB463 #HANGUL SYLLABLE TIKEUT U SIOS +0xB5D5 0xB465 #HANGUL SYLLABLE TIKEUT U IEUNG +0xB5D6 0xB46C #HANGUL SYLLABLE TIKEUT WEO +0xB5D7 0xB480 #HANGUL SYLLABLE TIKEUT WEO SSANGSIOS +0xB5D8 0xB488 #HANGUL SYLLABLE TIKEUT WE +0xB5D9 0xB49D #HANGUL SYLLABLE TIKEUT WE IEUNG +0xB5DA 0xB4A4 #HANGUL SYLLABLE TIKEUT WI +0xB5DB 0xB4A8 #HANGUL SYLLABLE TIKEUT WI NIEUN +0xB5DC 0xB4AC #HANGUL SYLLABLE TIKEUT WI RIEUL +0xB5DD 0xB4B5 #HANGUL SYLLABLE TIKEUT WI PIEUP +0xB5DE 0xB4B7 #HANGUL SYLLABLE TIKEUT WI SIOS +0xB5DF 0xB4B9 #HANGUL SYLLABLE TIKEUT WI IEUNG +0xB5E0 0xB4C0 #HANGUL SYLLABLE TIKEUT YU +0xB5E1 0xB4C4 #HANGUL SYLLABLE TIKEUT YU NIEUN +0xB5E2 0xB4C8 #HANGUL SYLLABLE TIKEUT YU RIEUL +0xB5E3 0xB4D0 #HANGUL SYLLABLE TIKEUT YU MIEUM +0xB5E4 0xB4D5 #HANGUL SYLLABLE TIKEUT YU IEUNG +0xB5E5 0xB4DC #HANGUL SYLLABLE TIKEUT EU +0xB5E6 0xB4DD #HANGUL SYLLABLE TIKEUT EU KIYEOK +0xB5E7 0xB4E0 #HANGUL SYLLABLE TIKEUT EU NIEUN +0xB5E8 0xB4E3 #HANGUL SYLLABLE TIKEUT EU TIKEUT +0xB5E9 0xB4E4 #HANGUL SYLLABLE TIKEUT EU RIEUL +0xB5EA 0xB4E6 #HANGUL SYLLABLE TIKEUT EU RIEULMIEUM +0xB5EB 0xB4EC #HANGUL SYLLABLE TIKEUT EU MIEUM +0xB5EC 0xB4ED #HANGUL SYLLABLE TIKEUT EU PIEUP +0xB5ED 0xB4EF #HANGUL SYLLABLE TIKEUT EU SIOS +0xB5EE 0xB4F1 #HANGUL SYLLABLE TIKEUT EU IEUNG +0xB5EF 0xB4F8 #HANGUL SYLLABLE TIKEUT YI +0xB5F0 0xB514 #HANGUL SYLLABLE TIKEUT I +0xB5F1 0xB515 #HANGUL SYLLABLE TIKEUT I KIYEOK +0xB5F2 0xB518 #HANGUL SYLLABLE TIKEUT I NIEUN +0xB5F3 0xB51B #HANGUL SYLLABLE TIKEUT I TIKEUT +0xB5F4 0xB51C #HANGUL SYLLABLE TIKEUT I RIEUL +0xB5F5 0xB524 #HANGUL SYLLABLE TIKEUT I MIEUM +0xB5F6 0xB525 #HANGUL SYLLABLE TIKEUT I PIEUP +0xB5F7 0xB527 #HANGUL SYLLABLE TIKEUT I SIOS +0xB5F8 0xB528 #HANGUL SYLLABLE TIKEUT I SSANGSIOS +0xB5F9 0xB529 #HANGUL SYLLABLE TIKEUT I IEUNG +0xB5FA 0xB52A #HANGUL SYLLABLE TIKEUT I CIEUC +0xB5FB 0xB530 #HANGUL SYLLABLE SSANGTIKEUT A +0xB5FC 0xB531 #HANGUL SYLLABLE SSANGTIKEUT A KIYEOK +0xB5FD 0xB534 #HANGUL SYLLABLE SSANGTIKEUT A NIEUN +0xB5FE 0xB538 #HANGUL SYLLABLE SSANGTIKEUT A RIEUL +0xB641 0xD105 #HANGUL SYLLABLE THIEUTH YA RIEULTHIEUTH +0xB642 0xD106 #HANGUL SYLLABLE THIEUTH YA RIEULPHIEUPH +0xB643 0xD107 #HANGUL SYLLABLE THIEUTH YA RIEULHIEUH +0xB644 0xD108 #HANGUL SYLLABLE THIEUTH YA MIEUM +0xB645 0xD109 #HANGUL SYLLABLE THIEUTH YA PIEUP +0xB646 0xD10A #HANGUL SYLLABLE THIEUTH YA PIEUPSIOS +0xB647 0xD10B #HANGUL SYLLABLE THIEUTH YA SIOS +0xB648 0xD10C #HANGUL SYLLABLE THIEUTH YA SSANGSIOS +0xB649 0xD10E #HANGUL SYLLABLE THIEUTH YA CIEUC +0xB64A 0xD10F #HANGUL SYLLABLE THIEUTH YA CHIEUCH +0xB64B 0xD110 #HANGUL SYLLABLE THIEUTH YA KHIEUKH +0xB64C 0xD111 #HANGUL SYLLABLE THIEUTH YA THIEUTH +0xB64D 0xD112 #HANGUL SYLLABLE THIEUTH YA PHIEUPH +0xB64E 0xD113 #HANGUL SYLLABLE THIEUTH YA HIEUH +0xB64F 0xD114 #HANGUL SYLLABLE THIEUTH YAE +0xB650 0xD115 #HANGUL SYLLABLE THIEUTH YAE KIYEOK +0xB651 0xD116 #HANGUL SYLLABLE THIEUTH YAE SSANGKIYEOK +0xB652 0xD117 #HANGUL SYLLABLE THIEUTH YAE KIYEOKSIOS +0xB653 0xD118 #HANGUL SYLLABLE THIEUTH YAE NIEUN +0xB654 0xD119 #HANGUL SYLLABLE THIEUTH YAE NIEUNCIEUC +0xB655 0xD11A #HANGUL SYLLABLE THIEUTH YAE NIEUNHIEUH +0xB656 0xD11B #HANGUL SYLLABLE THIEUTH YAE TIKEUT +0xB657 0xD11C #HANGUL SYLLABLE THIEUTH YAE RIEUL +0xB658 0xD11D #HANGUL SYLLABLE THIEUTH YAE RIEULKIYEOK +0xB659 0xD11E #HANGUL SYLLABLE THIEUTH YAE RIEULMIEUM +0xB65A 0xD11F #HANGUL SYLLABLE THIEUTH YAE RIEULPIEUP +0xB661 0xD120 #HANGUL SYLLABLE THIEUTH YAE RIEULSIOS +0xB662 0xD121 #HANGUL SYLLABLE THIEUTH YAE RIEULTHIEUTH +0xB663 0xD122 #HANGUL SYLLABLE THIEUTH YAE RIEULPHIEUPH +0xB664 0xD123 #HANGUL SYLLABLE THIEUTH YAE RIEULHIEUH +0xB665 0xD124 #HANGUL SYLLABLE THIEUTH YAE MIEUM +0xB666 0xD125 #HANGUL SYLLABLE THIEUTH YAE PIEUP +0xB667 0xD126 #HANGUL SYLLABLE THIEUTH YAE PIEUPSIOS +0xB668 0xD127 #HANGUL SYLLABLE THIEUTH YAE SIOS +0xB669 0xD128 #HANGUL SYLLABLE THIEUTH YAE SSANGSIOS +0xB66A 0xD129 #HANGUL SYLLABLE THIEUTH YAE IEUNG +0xB66B 0xD12A #HANGUL SYLLABLE THIEUTH YAE CIEUC +0xB66C 0xD12B #HANGUL SYLLABLE THIEUTH YAE CHIEUCH +0xB66D 0xD12C #HANGUL SYLLABLE THIEUTH YAE KHIEUKH +0xB66E 0xD12D #HANGUL SYLLABLE THIEUTH YAE THIEUTH +0xB66F 0xD12E #HANGUL SYLLABLE THIEUTH YAE PHIEUPH +0xB670 0xD12F #HANGUL SYLLABLE THIEUTH YAE HIEUH +0xB671 0xD132 #HANGUL SYLLABLE THIEUTH EO SSANGKIYEOK +0xB672 0xD133 #HANGUL SYLLABLE THIEUTH EO KIYEOKSIOS +0xB673 0xD135 #HANGUL SYLLABLE THIEUTH EO NIEUNCIEUC +0xB674 0xD136 #HANGUL SYLLABLE THIEUTH EO NIEUNHIEUH +0xB675 0xD137 #HANGUL SYLLABLE THIEUTH EO TIKEUT +0xB676 0xD139 #HANGUL SYLLABLE THIEUTH EO RIEULKIYEOK +0xB677 0xD13B #HANGUL SYLLABLE THIEUTH EO RIEULPIEUP +0xB678 0xD13C #HANGUL SYLLABLE THIEUTH EO RIEULSIOS +0xB679 0xD13D #HANGUL SYLLABLE THIEUTH EO RIEULTHIEUTH +0xB67A 0xD13E #HANGUL SYLLABLE THIEUTH EO RIEULPHIEUPH +0xB681 0xD13F #HANGUL SYLLABLE THIEUTH EO RIEULHIEUH +0xB682 0xD142 #HANGUL SYLLABLE THIEUTH EO PIEUPSIOS +0xB683 0xD146 #HANGUL SYLLABLE THIEUTH EO CIEUC +0xB684 0xD147 #HANGUL SYLLABLE THIEUTH EO CHIEUCH +0xB685 0xD148 #HANGUL SYLLABLE THIEUTH EO KHIEUKH +0xB686 0xD149 #HANGUL SYLLABLE THIEUTH EO THIEUTH +0xB687 0xD14A #HANGUL SYLLABLE THIEUTH EO PHIEUPH +0xB688 0xD14B #HANGUL SYLLABLE THIEUTH EO HIEUH +0xB689 0xD14E #HANGUL SYLLABLE THIEUTH E SSANGKIYEOK +0xB68A 0xD14F #HANGUL SYLLABLE THIEUTH E KIYEOKSIOS +0xB68B 0xD151 #HANGUL SYLLABLE THIEUTH E NIEUNCIEUC +0xB68C 0xD152 #HANGUL SYLLABLE THIEUTH E NIEUNHIEUH +0xB68D 0xD153 #HANGUL SYLLABLE THIEUTH E TIKEUT +0xB68E 0xD155 #HANGUL SYLLABLE THIEUTH E RIEULKIYEOK +0xB68F 0xD156 #HANGUL SYLLABLE THIEUTH E RIEULMIEUM +0xB690 0xD157 #HANGUL SYLLABLE THIEUTH E RIEULPIEUP +0xB691 0xD158 #HANGUL SYLLABLE THIEUTH E RIEULSIOS +0xB692 0xD159 #HANGUL SYLLABLE THIEUTH E RIEULTHIEUTH +0xB693 0xD15A #HANGUL SYLLABLE THIEUTH E RIEULPHIEUPH +0xB694 0xD15B #HANGUL SYLLABLE THIEUTH E RIEULHIEUH +0xB695 0xD15E #HANGUL SYLLABLE THIEUTH E PIEUPSIOS +0xB696 0xD160 #HANGUL SYLLABLE THIEUTH E SSANGSIOS +0xB697 0xD162 #HANGUL SYLLABLE THIEUTH E CIEUC +0xB698 0xD163 #HANGUL SYLLABLE THIEUTH E CHIEUCH +0xB699 0xD164 #HANGUL SYLLABLE THIEUTH E KHIEUKH +0xB69A 0xD165 #HANGUL SYLLABLE THIEUTH E THIEUTH +0xB69B 0xD166 #HANGUL SYLLABLE THIEUTH E PHIEUPH +0xB69C 0xD167 #HANGUL SYLLABLE THIEUTH E HIEUH +0xB69D 0xD169 #HANGUL SYLLABLE THIEUTH YEO KIYEOK +0xB69E 0xD16A #HANGUL SYLLABLE THIEUTH YEO SSANGKIYEOK +0xB69F 0xD16B #HANGUL SYLLABLE THIEUTH YEO KIYEOKSIOS +0xB6A0 0xD16D #HANGUL SYLLABLE THIEUTH YEO NIEUNCIEUC +0xB6A1 0xB540 #HANGUL SYLLABLE SSANGTIKEUT A MIEUM +0xB6A2 0xB541 #HANGUL SYLLABLE SSANGTIKEUT A PIEUP +0xB6A3 0xB543 #HANGUL SYLLABLE SSANGTIKEUT A SIOS +0xB6A4 0xB544 #HANGUL SYLLABLE SSANGTIKEUT A SSANGSIOS +0xB6A5 0xB545 #HANGUL SYLLABLE SSANGTIKEUT A IEUNG +0xB6A6 0xB54B #HANGUL SYLLABLE SSANGTIKEUT A HIEUH +0xB6A7 0xB54C #HANGUL SYLLABLE SSANGTIKEUT AE +0xB6A8 0xB54D #HANGUL SYLLABLE SSANGTIKEUT AE KIYEOK +0xB6A9 0xB550 #HANGUL SYLLABLE SSANGTIKEUT AE NIEUN +0xB6AA 0xB554 #HANGUL SYLLABLE SSANGTIKEUT AE RIEUL +0xB6AB 0xB55C #HANGUL SYLLABLE SSANGTIKEUT AE MIEUM +0xB6AC 0xB55D #HANGUL SYLLABLE SSANGTIKEUT AE PIEUP +0xB6AD 0xB55F #HANGUL SYLLABLE SSANGTIKEUT AE SIOS +0xB6AE 0xB560 #HANGUL SYLLABLE SSANGTIKEUT AE SSANGSIOS +0xB6AF 0xB561 #HANGUL SYLLABLE SSANGTIKEUT AE IEUNG +0xB6B0 0xB5A0 #HANGUL SYLLABLE SSANGTIKEUT EO +0xB6B1 0xB5A1 #HANGUL SYLLABLE SSANGTIKEUT EO KIYEOK +0xB6B2 0xB5A4 #HANGUL SYLLABLE SSANGTIKEUT EO NIEUN +0xB6B3 0xB5A8 #HANGUL SYLLABLE SSANGTIKEUT EO RIEUL +0xB6B4 0xB5AA #HANGUL SYLLABLE SSANGTIKEUT EO RIEULMIEUM +0xB6B5 0xB5AB #HANGUL SYLLABLE SSANGTIKEUT EO RIEULPIEUP +0xB6B6 0xB5B0 #HANGUL SYLLABLE SSANGTIKEUT EO MIEUM +0xB6B7 0xB5B1 #HANGUL SYLLABLE SSANGTIKEUT EO PIEUP +0xB6B8 0xB5B3 #HANGUL SYLLABLE SSANGTIKEUT EO SIOS +0xB6B9 0xB5B4 #HANGUL SYLLABLE SSANGTIKEUT EO SSANGSIOS +0xB6BA 0xB5B5 #HANGUL SYLLABLE SSANGTIKEUT EO IEUNG +0xB6BB 0xB5BB #HANGUL SYLLABLE SSANGTIKEUT EO HIEUH +0xB6BC 0xB5BC #HANGUL SYLLABLE SSANGTIKEUT E +0xB6BD 0xB5BD #HANGUL SYLLABLE SSANGTIKEUT E KIYEOK +0xB6BE 0xB5C0 #HANGUL SYLLABLE SSANGTIKEUT E NIEUN +0xB6BF 0xB5C4 #HANGUL SYLLABLE SSANGTIKEUT E RIEUL +0xB6C0 0xB5CC #HANGUL SYLLABLE SSANGTIKEUT E MIEUM +0xB6C1 0xB5CD #HANGUL SYLLABLE SSANGTIKEUT E PIEUP +0xB6C2 0xB5CF #HANGUL SYLLABLE SSANGTIKEUT E SIOS +0xB6C3 0xB5D0 #HANGUL SYLLABLE SSANGTIKEUT E SSANGSIOS +0xB6C4 0xB5D1 #HANGUL SYLLABLE SSANGTIKEUT E IEUNG +0xB6C5 0xB5D8 #HANGUL SYLLABLE SSANGTIKEUT YEO +0xB6C6 0xB5EC #HANGUL SYLLABLE SSANGTIKEUT YEO SSANGSIOS +0xB6C7 0xB610 #HANGUL SYLLABLE SSANGTIKEUT O +0xB6C8 0xB611 #HANGUL SYLLABLE SSANGTIKEUT O KIYEOK +0xB6C9 0xB614 #HANGUL SYLLABLE SSANGTIKEUT O NIEUN +0xB6CA 0xB618 #HANGUL SYLLABLE SSANGTIKEUT O RIEUL +0xB6CB 0xB625 #HANGUL SYLLABLE SSANGTIKEUT O IEUNG +0xB6CC 0xB62C #HANGUL SYLLABLE SSANGTIKEUT WA +0xB6CD 0xB634 #HANGUL SYLLABLE SSANGTIKEUT WA RIEUL +0xB6CE 0xB648 #HANGUL SYLLABLE SSANGTIKEUT WAE +0xB6CF 0xB664 #HANGUL SYLLABLE SSANGTIKEUT OE +0xB6D0 0xB668 #HANGUL SYLLABLE SSANGTIKEUT OE NIEUN +0xB6D1 0xB69C #HANGUL SYLLABLE SSANGTIKEUT U +0xB6D2 0xB69D #HANGUL SYLLABLE SSANGTIKEUT U KIYEOK +0xB6D3 0xB6A0 #HANGUL SYLLABLE SSANGTIKEUT U NIEUN +0xB6D4 0xB6A4 #HANGUL SYLLABLE SSANGTIKEUT U RIEUL +0xB6D5 0xB6AB #HANGUL SYLLABLE SSANGTIKEUT U RIEULHIEUH +0xB6D6 0xB6AC #HANGUL SYLLABLE SSANGTIKEUT U MIEUM +0xB6D7 0xB6B1 #HANGUL SYLLABLE SSANGTIKEUT U IEUNG +0xB6D8 0xB6D4 #HANGUL SYLLABLE SSANGTIKEUT WE +0xB6D9 0xB6F0 #HANGUL SYLLABLE SSANGTIKEUT WI +0xB6DA 0xB6F4 #HANGUL SYLLABLE SSANGTIKEUT WI NIEUN +0xB6DB 0xB6F8 #HANGUL SYLLABLE SSANGTIKEUT WI RIEUL +0xB6DC 0xB700 #HANGUL SYLLABLE SSANGTIKEUT WI MIEUM +0xB6DD 0xB701 #HANGUL SYLLABLE SSANGTIKEUT WI PIEUP +0xB6DE 0xB705 #HANGUL SYLLABLE SSANGTIKEUT WI IEUNG +0xB6DF 0xB728 #HANGUL SYLLABLE SSANGTIKEUT EU +0xB6E0 0xB729 #HANGUL SYLLABLE SSANGTIKEUT EU KIYEOK +0xB6E1 0xB72C #HANGUL SYLLABLE SSANGTIKEUT EU NIEUN +0xB6E2 0xB72F #HANGUL SYLLABLE SSANGTIKEUT EU TIKEUT +0xB6E3 0xB730 #HANGUL SYLLABLE SSANGTIKEUT EU RIEUL +0xB6E4 0xB738 #HANGUL SYLLABLE SSANGTIKEUT EU MIEUM +0xB6E5 0xB739 #HANGUL SYLLABLE SSANGTIKEUT EU PIEUP +0xB6E6 0xB73B #HANGUL SYLLABLE SSANGTIKEUT EU SIOS +0xB6E7 0xB744 #HANGUL SYLLABLE SSANGTIKEUT YI +0xB6E8 0xB748 #HANGUL SYLLABLE SSANGTIKEUT YI NIEUN +0xB6E9 0xB74C #HANGUL SYLLABLE SSANGTIKEUT YI RIEUL +0xB6EA 0xB754 #HANGUL SYLLABLE SSANGTIKEUT YI MIEUM +0xB6EB 0xB755 #HANGUL SYLLABLE SSANGTIKEUT YI PIEUP +0xB6EC 0xB760 #HANGUL SYLLABLE SSANGTIKEUT I +0xB6ED 0xB764 #HANGUL SYLLABLE SSANGTIKEUT I NIEUN +0xB6EE 0xB768 #HANGUL SYLLABLE SSANGTIKEUT I RIEUL +0xB6EF 0xB770 #HANGUL SYLLABLE SSANGTIKEUT I MIEUM +0xB6F0 0xB771 #HANGUL SYLLABLE SSANGTIKEUT I PIEUP +0xB6F1 0xB773 #HANGUL SYLLABLE SSANGTIKEUT I SIOS +0xB6F2 0xB775 #HANGUL SYLLABLE SSANGTIKEUT I IEUNG +0xB6F3 0xB77C #HANGUL SYLLABLE RIEUL A +0xB6F4 0xB77D #HANGUL SYLLABLE RIEUL A KIYEOK +0xB6F5 0xB780 #HANGUL SYLLABLE RIEUL A NIEUN +0xB6F6 0xB784 #HANGUL SYLLABLE RIEUL A RIEUL +0xB6F7 0xB78C #HANGUL SYLLABLE RIEUL A MIEUM +0xB6F8 0xB78D #HANGUL SYLLABLE RIEUL A PIEUP +0xB6F9 0xB78F #HANGUL SYLLABLE RIEUL A SIOS +0xB6FA 0xB790 #HANGUL SYLLABLE RIEUL A SSANGSIOS +0xB6FB 0xB791 #HANGUL SYLLABLE RIEUL A IEUNG +0xB6FC 0xB792 #HANGUL SYLLABLE RIEUL A CIEUC +0xB6FD 0xB796 #HANGUL SYLLABLE RIEUL A PHIEUPH +0xB6FE 0xB797 #HANGUL SYLLABLE RIEUL A HIEUH +0xB741 0xD16E #HANGUL SYLLABLE THIEUTH YEO NIEUNHIEUH +0xB742 0xD16F #HANGUL SYLLABLE THIEUTH YEO TIKEUT +0xB743 0xD170 #HANGUL SYLLABLE THIEUTH YEO RIEUL +0xB744 0xD171 #HANGUL SYLLABLE THIEUTH YEO RIEULKIYEOK +0xB745 0xD172 #HANGUL SYLLABLE THIEUTH YEO RIEULMIEUM +0xB746 0xD173 #HANGUL SYLLABLE THIEUTH YEO RIEULPIEUP +0xB747 0xD174 #HANGUL SYLLABLE THIEUTH YEO RIEULSIOS +0xB748 0xD175 #HANGUL SYLLABLE THIEUTH YEO RIEULTHIEUTH +0xB749 0xD176 #HANGUL SYLLABLE THIEUTH YEO RIEULPHIEUPH +0xB74A 0xD177 #HANGUL SYLLABLE THIEUTH YEO RIEULHIEUH +0xB74B 0xD178 #HANGUL SYLLABLE THIEUTH YEO MIEUM +0xB74C 0xD179 #HANGUL SYLLABLE THIEUTH YEO PIEUP +0xB74D 0xD17A #HANGUL SYLLABLE THIEUTH YEO PIEUPSIOS +0xB74E 0xD17B #HANGUL SYLLABLE THIEUTH YEO SIOS +0xB74F 0xD17D #HANGUL SYLLABLE THIEUTH YEO IEUNG +0xB750 0xD17E #HANGUL SYLLABLE THIEUTH YEO CIEUC +0xB751 0xD17F #HANGUL SYLLABLE THIEUTH YEO CHIEUCH +0xB752 0xD180 #HANGUL SYLLABLE THIEUTH YEO KHIEUKH +0xB753 0xD181 #HANGUL SYLLABLE THIEUTH YEO THIEUTH +0xB754 0xD182 #HANGUL SYLLABLE THIEUTH YEO PHIEUPH +0xB755 0xD183 #HANGUL SYLLABLE THIEUTH YEO HIEUH +0xB756 0xD185 #HANGUL SYLLABLE THIEUTH YE KIYEOK +0xB757 0xD186 #HANGUL SYLLABLE THIEUTH YE SSANGKIYEOK +0xB758 0xD187 #HANGUL SYLLABLE THIEUTH YE KIYEOKSIOS +0xB759 0xD189 #HANGUL SYLLABLE THIEUTH YE NIEUNCIEUC +0xB75A 0xD18A #HANGUL SYLLABLE THIEUTH YE NIEUNHIEUH +0xB761 0xD18B #HANGUL SYLLABLE THIEUTH YE TIKEUT +0xB762 0xD18C #HANGUL SYLLABLE THIEUTH YE RIEUL +0xB763 0xD18D #HANGUL SYLLABLE THIEUTH YE RIEULKIYEOK +0xB764 0xD18E #HANGUL SYLLABLE THIEUTH YE RIEULMIEUM +0xB765 0xD18F #HANGUL SYLLABLE THIEUTH YE RIEULPIEUP +0xB766 0xD190 #HANGUL SYLLABLE THIEUTH YE RIEULSIOS +0xB767 0xD191 #HANGUL SYLLABLE THIEUTH YE RIEULTHIEUTH +0xB768 0xD192 #HANGUL SYLLABLE THIEUTH YE RIEULPHIEUPH +0xB769 0xD193 #HANGUL SYLLABLE THIEUTH YE RIEULHIEUH +0xB76A 0xD194 #HANGUL SYLLABLE THIEUTH YE MIEUM +0xB76B 0xD195 #HANGUL SYLLABLE THIEUTH YE PIEUP +0xB76C 0xD196 #HANGUL SYLLABLE THIEUTH YE PIEUPSIOS +0xB76D 0xD197 #HANGUL SYLLABLE THIEUTH YE SIOS +0xB76E 0xD198 #HANGUL SYLLABLE THIEUTH YE SSANGSIOS +0xB76F 0xD199 #HANGUL SYLLABLE THIEUTH YE IEUNG +0xB770 0xD19A #HANGUL SYLLABLE THIEUTH YE CIEUC +0xB771 0xD19B #HANGUL SYLLABLE THIEUTH YE CHIEUCH +0xB772 0xD19C #HANGUL SYLLABLE THIEUTH YE KHIEUKH +0xB773 0xD19D #HANGUL SYLLABLE THIEUTH YE THIEUTH +0xB774 0xD19E #HANGUL SYLLABLE THIEUTH YE PHIEUPH +0xB775 0xD19F #HANGUL SYLLABLE THIEUTH YE HIEUH +0xB776 0xD1A2 #HANGUL SYLLABLE THIEUTH O SSANGKIYEOK +0xB777 0xD1A3 #HANGUL SYLLABLE THIEUTH O KIYEOKSIOS +0xB778 0xD1A5 #HANGUL SYLLABLE THIEUTH O NIEUNCIEUC +0xB779 0xD1A6 #HANGUL SYLLABLE THIEUTH O NIEUNHIEUH +0xB77A 0xD1A7 #HANGUL SYLLABLE THIEUTH O TIKEUT +0xB781 0xD1A9 #HANGUL SYLLABLE THIEUTH O RIEULKIYEOK +0xB782 0xD1AA #HANGUL SYLLABLE THIEUTH O RIEULMIEUM +0xB783 0xD1AB #HANGUL SYLLABLE THIEUTH O RIEULPIEUP +0xB784 0xD1AC #HANGUL SYLLABLE THIEUTH O RIEULSIOS +0xB785 0xD1AD #HANGUL SYLLABLE THIEUTH O RIEULTHIEUTH +0xB786 0xD1AE #HANGUL SYLLABLE THIEUTH O RIEULPHIEUPH +0xB787 0xD1AF #HANGUL SYLLABLE THIEUTH O RIEULHIEUH +0xB788 0xD1B2 #HANGUL SYLLABLE THIEUTH O PIEUPSIOS +0xB789 0xD1B4 #HANGUL SYLLABLE THIEUTH O SSANGSIOS +0xB78A 0xD1B6 #HANGUL SYLLABLE THIEUTH O CIEUC +0xB78B 0xD1B7 #HANGUL SYLLABLE THIEUTH O CHIEUCH +0xB78C 0xD1B8 #HANGUL SYLLABLE THIEUTH O KHIEUKH +0xB78D 0xD1B9 #HANGUL SYLLABLE THIEUTH O THIEUTH +0xB78E 0xD1BB #HANGUL SYLLABLE THIEUTH O HIEUH +0xB78F 0xD1BD #HANGUL SYLLABLE THIEUTH WA KIYEOK +0xB790 0xD1BE #HANGUL SYLLABLE THIEUTH WA SSANGKIYEOK +0xB791 0xD1BF #HANGUL SYLLABLE THIEUTH WA KIYEOKSIOS +0xB792 0xD1C1 #HANGUL SYLLABLE THIEUTH WA NIEUNCIEUC +0xB793 0xD1C2 #HANGUL SYLLABLE THIEUTH WA NIEUNHIEUH +0xB794 0xD1C3 #HANGUL SYLLABLE THIEUTH WA TIKEUT +0xB795 0xD1C4 #HANGUL SYLLABLE THIEUTH WA RIEUL +0xB796 0xD1C5 #HANGUL SYLLABLE THIEUTH WA RIEULKIYEOK +0xB797 0xD1C6 #HANGUL SYLLABLE THIEUTH WA RIEULMIEUM +0xB798 0xD1C7 #HANGUL SYLLABLE THIEUTH WA RIEULPIEUP +0xB799 0xD1C8 #HANGUL SYLLABLE THIEUTH WA RIEULSIOS +0xB79A 0xD1C9 #HANGUL SYLLABLE THIEUTH WA RIEULTHIEUTH +0xB79B 0xD1CA #HANGUL SYLLABLE THIEUTH WA RIEULPHIEUPH +0xB79C 0xD1CB #HANGUL SYLLABLE THIEUTH WA RIEULHIEUH +0xB79D 0xD1CC #HANGUL SYLLABLE THIEUTH WA MIEUM +0xB79E 0xD1CD #HANGUL SYLLABLE THIEUTH WA PIEUP +0xB79F 0xD1CE #HANGUL SYLLABLE THIEUTH WA PIEUPSIOS +0xB7A0 0xD1CF #HANGUL SYLLABLE THIEUTH WA SIOS +0xB7A1 0xB798 #HANGUL SYLLABLE RIEUL AE +0xB7A2 0xB799 #HANGUL SYLLABLE RIEUL AE KIYEOK +0xB7A3 0xB79C #HANGUL SYLLABLE RIEUL AE NIEUN +0xB7A4 0xB7A0 #HANGUL SYLLABLE RIEUL AE RIEUL +0xB7A5 0xB7A8 #HANGUL SYLLABLE RIEUL AE MIEUM +0xB7A6 0xB7A9 #HANGUL SYLLABLE RIEUL AE PIEUP +0xB7A7 0xB7AB #HANGUL SYLLABLE RIEUL AE SIOS +0xB7A8 0xB7AC #HANGUL SYLLABLE RIEUL AE SSANGSIOS +0xB7A9 0xB7AD #HANGUL SYLLABLE RIEUL AE IEUNG +0xB7AA 0xB7B4 #HANGUL SYLLABLE RIEUL YA +0xB7AB 0xB7B5 #HANGUL SYLLABLE RIEUL YA KIYEOK +0xB7AC 0xB7B8 #HANGUL SYLLABLE RIEUL YA NIEUN +0xB7AD 0xB7C7 #HANGUL SYLLABLE RIEUL YA SIOS +0xB7AE 0xB7C9 #HANGUL SYLLABLE RIEUL YA IEUNG +0xB7AF 0xB7EC #HANGUL SYLLABLE RIEUL EO +0xB7B0 0xB7ED #HANGUL SYLLABLE RIEUL EO KIYEOK +0xB7B1 0xB7F0 #HANGUL SYLLABLE RIEUL EO NIEUN +0xB7B2 0xB7F4 #HANGUL SYLLABLE RIEUL EO RIEUL +0xB7B3 0xB7FC #HANGUL SYLLABLE RIEUL EO MIEUM +0xB7B4 0xB7FD #HANGUL SYLLABLE RIEUL EO PIEUP +0xB7B5 0xB7FF #HANGUL SYLLABLE RIEUL EO SIOS +0xB7B6 0xB800 #HANGUL SYLLABLE RIEUL EO SSANGSIOS +0xB7B7 0xB801 #HANGUL SYLLABLE RIEUL EO IEUNG +0xB7B8 0xB807 #HANGUL SYLLABLE RIEUL EO HIEUH +0xB7B9 0xB808 #HANGUL SYLLABLE RIEUL E +0xB7BA 0xB809 #HANGUL SYLLABLE RIEUL E KIYEOK +0xB7BB 0xB80C #HANGUL SYLLABLE RIEUL E NIEUN +0xB7BC 0xB810 #HANGUL SYLLABLE RIEUL E RIEUL +0xB7BD 0xB818 #HANGUL SYLLABLE RIEUL E MIEUM +0xB7BE 0xB819 #HANGUL SYLLABLE RIEUL E PIEUP +0xB7BF 0xB81B #HANGUL SYLLABLE RIEUL E SIOS +0xB7C0 0xB81D #HANGUL SYLLABLE RIEUL E IEUNG +0xB7C1 0xB824 #HANGUL SYLLABLE RIEUL YEO +0xB7C2 0xB825 #HANGUL SYLLABLE RIEUL YEO KIYEOK +0xB7C3 0xB828 #HANGUL SYLLABLE RIEUL YEO NIEUN +0xB7C4 0xB82C #HANGUL SYLLABLE RIEUL YEO RIEUL +0xB7C5 0xB834 #HANGUL SYLLABLE RIEUL YEO MIEUM +0xB7C6 0xB835 #HANGUL SYLLABLE RIEUL YEO PIEUP +0xB7C7 0xB837 #HANGUL SYLLABLE RIEUL YEO SIOS +0xB7C8 0xB838 #HANGUL SYLLABLE RIEUL YEO SSANGSIOS +0xB7C9 0xB839 #HANGUL SYLLABLE RIEUL YEO IEUNG +0xB7CA 0xB840 #HANGUL SYLLABLE RIEUL YE +0xB7CB 0xB844 #HANGUL SYLLABLE RIEUL YE NIEUN +0xB7CC 0xB851 #HANGUL SYLLABLE RIEUL YE PIEUP +0xB7CD 0xB853 #HANGUL SYLLABLE RIEUL YE SIOS +0xB7CE 0xB85C #HANGUL SYLLABLE RIEUL O +0xB7CF 0xB85D #HANGUL SYLLABLE RIEUL O KIYEOK +0xB7D0 0xB860 #HANGUL SYLLABLE RIEUL O NIEUN +0xB7D1 0xB864 #HANGUL SYLLABLE RIEUL O RIEUL +0xB7D2 0xB86C #HANGUL SYLLABLE RIEUL O MIEUM +0xB7D3 0xB86D #HANGUL SYLLABLE RIEUL O PIEUP +0xB7D4 0xB86F #HANGUL SYLLABLE RIEUL O SIOS +0xB7D5 0xB871 #HANGUL SYLLABLE RIEUL O IEUNG +0xB7D6 0xB878 #HANGUL SYLLABLE RIEUL WA +0xB7D7 0xB87C #HANGUL SYLLABLE RIEUL WA NIEUN +0xB7D8 0xB88D #HANGUL SYLLABLE RIEUL WA IEUNG +0xB7D9 0xB8A8 #HANGUL SYLLABLE RIEUL WAE SSANGSIOS +0xB7DA 0xB8B0 #HANGUL SYLLABLE RIEUL OE +0xB7DB 0xB8B4 #HANGUL SYLLABLE RIEUL OE NIEUN +0xB7DC 0xB8B8 #HANGUL SYLLABLE RIEUL OE RIEUL +0xB7DD 0xB8C0 #HANGUL SYLLABLE RIEUL OE MIEUM +0xB7DE 0xB8C1 #HANGUL SYLLABLE RIEUL OE PIEUP +0xB7DF 0xB8C3 #HANGUL SYLLABLE RIEUL OE SIOS +0xB7E0 0xB8C5 #HANGUL SYLLABLE RIEUL OE IEUNG +0xB7E1 0xB8CC #HANGUL SYLLABLE RIEUL YO +0xB7E2 0xB8D0 #HANGUL SYLLABLE RIEUL YO NIEUN +0xB7E3 0xB8D4 #HANGUL SYLLABLE RIEUL YO RIEUL +0xB7E4 0xB8DD #HANGUL SYLLABLE RIEUL YO PIEUP +0xB7E5 0xB8DF #HANGUL SYLLABLE RIEUL YO SIOS +0xB7E6 0xB8E1 #HANGUL SYLLABLE RIEUL YO IEUNG +0xB7E7 0xB8E8 #HANGUL SYLLABLE RIEUL U +0xB7E8 0xB8E9 #HANGUL SYLLABLE RIEUL U KIYEOK +0xB7E9 0xB8EC #HANGUL SYLLABLE RIEUL U NIEUN +0xB7EA 0xB8F0 #HANGUL SYLLABLE RIEUL U RIEUL +0xB7EB 0xB8F8 #HANGUL SYLLABLE RIEUL U MIEUM +0xB7EC 0xB8F9 #HANGUL SYLLABLE RIEUL U PIEUP +0xB7ED 0xB8FB #HANGUL SYLLABLE RIEUL U SIOS +0xB7EE 0xB8FD #HANGUL SYLLABLE RIEUL U IEUNG +0xB7EF 0xB904 #HANGUL SYLLABLE RIEUL WEO +0xB7F0 0xB918 #HANGUL SYLLABLE RIEUL WEO SSANGSIOS +0xB7F1 0xB920 #HANGUL SYLLABLE RIEUL WE +0xB7F2 0xB93C #HANGUL SYLLABLE RIEUL WI +0xB7F3 0xB93D #HANGUL SYLLABLE RIEUL WI KIYEOK +0xB7F4 0xB940 #HANGUL SYLLABLE RIEUL WI NIEUN +0xB7F5 0xB944 #HANGUL SYLLABLE RIEUL WI RIEUL +0xB7F6 0xB94C #HANGUL SYLLABLE RIEUL WI MIEUM +0xB7F7 0xB94F #HANGUL SYLLABLE RIEUL WI SIOS +0xB7F8 0xB951 #HANGUL SYLLABLE RIEUL WI IEUNG +0xB7F9 0xB958 #HANGUL SYLLABLE RIEUL YU +0xB7FA 0xB959 #HANGUL SYLLABLE RIEUL YU KIYEOK +0xB7FB 0xB95C #HANGUL SYLLABLE RIEUL YU NIEUN +0xB7FC 0xB960 #HANGUL SYLLABLE RIEUL YU RIEUL +0xB7FD 0xB968 #HANGUL SYLLABLE RIEUL YU MIEUM +0xB7FE 0xB969 #HANGUL SYLLABLE RIEUL YU PIEUP +0xB841 0xD1D0 #HANGUL SYLLABLE THIEUTH WA SSANGSIOS +0xB842 0xD1D1 #HANGUL SYLLABLE THIEUTH WA IEUNG +0xB843 0xD1D2 #HANGUL SYLLABLE THIEUTH WA CIEUC +0xB844 0xD1D3 #HANGUL SYLLABLE THIEUTH WA CHIEUCH +0xB845 0xD1D4 #HANGUL SYLLABLE THIEUTH WA KHIEUKH +0xB846 0xD1D5 #HANGUL SYLLABLE THIEUTH WA THIEUTH +0xB847 0xD1D6 #HANGUL SYLLABLE THIEUTH WA PHIEUPH +0xB848 0xD1D7 #HANGUL SYLLABLE THIEUTH WA HIEUH +0xB849 0xD1D9 #HANGUL SYLLABLE THIEUTH WAE KIYEOK +0xB84A 0xD1DA #HANGUL SYLLABLE THIEUTH WAE SSANGKIYEOK +0xB84B 0xD1DB #HANGUL SYLLABLE THIEUTH WAE KIYEOKSIOS +0xB84C 0xD1DC #HANGUL SYLLABLE THIEUTH WAE NIEUN +0xB84D 0xD1DD #HANGUL SYLLABLE THIEUTH WAE NIEUNCIEUC +0xB84E 0xD1DE #HANGUL SYLLABLE THIEUTH WAE NIEUNHIEUH +0xB84F 0xD1DF #HANGUL SYLLABLE THIEUTH WAE TIKEUT +0xB850 0xD1E0 #HANGUL SYLLABLE THIEUTH WAE RIEUL +0xB851 0xD1E1 #HANGUL SYLLABLE THIEUTH WAE RIEULKIYEOK +0xB852 0xD1E2 #HANGUL SYLLABLE THIEUTH WAE RIEULMIEUM +0xB853 0xD1E3 #HANGUL SYLLABLE THIEUTH WAE RIEULPIEUP +0xB854 0xD1E4 #HANGUL SYLLABLE THIEUTH WAE RIEULSIOS +0xB855 0xD1E5 #HANGUL SYLLABLE THIEUTH WAE RIEULTHIEUTH +0xB856 0xD1E6 #HANGUL SYLLABLE THIEUTH WAE RIEULPHIEUPH +0xB857 0xD1E7 #HANGUL SYLLABLE THIEUTH WAE RIEULHIEUH +0xB858 0xD1E8 #HANGUL SYLLABLE THIEUTH WAE MIEUM +0xB859 0xD1E9 #HANGUL SYLLABLE THIEUTH WAE PIEUP +0xB85A 0xD1EA #HANGUL SYLLABLE THIEUTH WAE PIEUPSIOS +0xB861 0xD1EB #HANGUL SYLLABLE THIEUTH WAE SIOS +0xB862 0xD1EC #HANGUL SYLLABLE THIEUTH WAE SSANGSIOS +0xB863 0xD1ED #HANGUL SYLLABLE THIEUTH WAE IEUNG +0xB864 0xD1EE #HANGUL SYLLABLE THIEUTH WAE CIEUC +0xB865 0xD1EF #HANGUL SYLLABLE THIEUTH WAE CHIEUCH +0xB866 0xD1F0 #HANGUL SYLLABLE THIEUTH WAE KHIEUKH +0xB867 0xD1F1 #HANGUL SYLLABLE THIEUTH WAE THIEUTH +0xB868 0xD1F2 #HANGUL SYLLABLE THIEUTH WAE PHIEUPH +0xB869 0xD1F3 #HANGUL SYLLABLE THIEUTH WAE HIEUH +0xB86A 0xD1F5 #HANGUL SYLLABLE THIEUTH OE KIYEOK +0xB86B 0xD1F6 #HANGUL SYLLABLE THIEUTH OE SSANGKIYEOK +0xB86C 0xD1F7 #HANGUL SYLLABLE THIEUTH OE KIYEOKSIOS +0xB86D 0xD1F9 #HANGUL SYLLABLE THIEUTH OE NIEUNCIEUC +0xB86E 0xD1FA #HANGUL SYLLABLE THIEUTH OE NIEUNHIEUH +0xB86F 0xD1FB #HANGUL SYLLABLE THIEUTH OE TIKEUT +0xB870 0xD1FC #HANGUL SYLLABLE THIEUTH OE RIEUL +0xB871 0xD1FD #HANGUL SYLLABLE THIEUTH OE RIEULKIYEOK +0xB872 0xD1FE #HANGUL SYLLABLE THIEUTH OE RIEULMIEUM +0xB873 0xD1FF #HANGUL SYLLABLE THIEUTH OE RIEULPIEUP +0xB874 0xD200 #HANGUL SYLLABLE THIEUTH OE RIEULSIOS +0xB875 0xD201 #HANGUL SYLLABLE THIEUTH OE RIEULTHIEUTH +0xB876 0xD202 #HANGUL SYLLABLE THIEUTH OE RIEULPHIEUPH +0xB877 0xD203 #HANGUL SYLLABLE THIEUTH OE RIEULHIEUH +0xB878 0xD204 #HANGUL SYLLABLE THIEUTH OE MIEUM +0xB879 0xD205 #HANGUL SYLLABLE THIEUTH OE PIEUP +0xB87A 0xD206 #HANGUL SYLLABLE THIEUTH OE PIEUPSIOS +0xB881 0xD208 #HANGUL SYLLABLE THIEUTH OE SSANGSIOS +0xB882 0xD20A #HANGUL SYLLABLE THIEUTH OE CIEUC +0xB883 0xD20B #HANGUL SYLLABLE THIEUTH OE CHIEUCH +0xB884 0xD20C #HANGUL SYLLABLE THIEUTH OE KHIEUKH +0xB885 0xD20D #HANGUL SYLLABLE THIEUTH OE THIEUTH +0xB886 0xD20E #HANGUL SYLLABLE THIEUTH OE PHIEUPH +0xB887 0xD20F #HANGUL SYLLABLE THIEUTH OE HIEUH +0xB888 0xD211 #HANGUL SYLLABLE THIEUTH YO KIYEOK +0xB889 0xD212 #HANGUL SYLLABLE THIEUTH YO SSANGKIYEOK +0xB88A 0xD213 #HANGUL SYLLABLE THIEUTH YO KIYEOKSIOS +0xB88B 0xD214 #HANGUL SYLLABLE THIEUTH YO NIEUN +0xB88C 0xD215 #HANGUL SYLLABLE THIEUTH YO NIEUNCIEUC +0xB88D 0xD216 #HANGUL SYLLABLE THIEUTH YO NIEUNHIEUH +0xB88E 0xD217 #HANGUL SYLLABLE THIEUTH YO TIKEUT +0xB88F 0xD218 #HANGUL SYLLABLE THIEUTH YO RIEUL +0xB890 0xD219 #HANGUL SYLLABLE THIEUTH YO RIEULKIYEOK +0xB891 0xD21A #HANGUL SYLLABLE THIEUTH YO RIEULMIEUM +0xB892 0xD21B #HANGUL SYLLABLE THIEUTH YO RIEULPIEUP +0xB893 0xD21C #HANGUL SYLLABLE THIEUTH YO RIEULSIOS +0xB894 0xD21D #HANGUL SYLLABLE THIEUTH YO RIEULTHIEUTH +0xB895 0xD21E #HANGUL SYLLABLE THIEUTH YO RIEULPHIEUPH +0xB896 0xD21F #HANGUL SYLLABLE THIEUTH YO RIEULHIEUH +0xB897 0xD220 #HANGUL SYLLABLE THIEUTH YO MIEUM +0xB898 0xD221 #HANGUL SYLLABLE THIEUTH YO PIEUP +0xB899 0xD222 #HANGUL SYLLABLE THIEUTH YO PIEUPSIOS +0xB89A 0xD223 #HANGUL SYLLABLE THIEUTH YO SIOS +0xB89B 0xD224 #HANGUL SYLLABLE THIEUTH YO SSANGSIOS +0xB89C 0xD225 #HANGUL SYLLABLE THIEUTH YO IEUNG +0xB89D 0xD226 #HANGUL SYLLABLE THIEUTH YO CIEUC +0xB89E 0xD227 #HANGUL SYLLABLE THIEUTH YO CHIEUCH +0xB89F 0xD228 #HANGUL SYLLABLE THIEUTH YO KHIEUKH +0xB8A0 0xD229 #HANGUL SYLLABLE THIEUTH YO THIEUTH +0xB8A1 0xB96B #HANGUL SYLLABLE RIEUL YU SIOS +0xB8A2 0xB96D #HANGUL SYLLABLE RIEUL YU IEUNG +0xB8A3 0xB974 #HANGUL SYLLABLE RIEUL EU +0xB8A4 0xB975 #HANGUL SYLLABLE RIEUL EU KIYEOK +0xB8A5 0xB978 #HANGUL SYLLABLE RIEUL EU NIEUN +0xB8A6 0xB97C #HANGUL SYLLABLE RIEUL EU RIEUL +0xB8A7 0xB984 #HANGUL SYLLABLE RIEUL EU MIEUM +0xB8A8 0xB985 #HANGUL SYLLABLE RIEUL EU PIEUP +0xB8A9 0xB987 #HANGUL SYLLABLE RIEUL EU SIOS +0xB8AA 0xB989 #HANGUL SYLLABLE RIEUL EU IEUNG +0xB8AB 0xB98A #HANGUL SYLLABLE RIEUL EU CIEUC +0xB8AC 0xB98D #HANGUL SYLLABLE RIEUL EU THIEUTH +0xB8AD 0xB98E #HANGUL SYLLABLE RIEUL EU PHIEUPH +0xB8AE 0xB9AC #HANGUL SYLLABLE RIEUL I +0xB8AF 0xB9AD #HANGUL SYLLABLE RIEUL I KIYEOK +0xB8B0 0xB9B0 #HANGUL SYLLABLE RIEUL I NIEUN +0xB8B1 0xB9B4 #HANGUL SYLLABLE RIEUL I RIEUL +0xB8B2 0xB9BC #HANGUL SYLLABLE RIEUL I MIEUM +0xB8B3 0xB9BD #HANGUL SYLLABLE RIEUL I PIEUP +0xB8B4 0xB9BF #HANGUL SYLLABLE RIEUL I SIOS +0xB8B5 0xB9C1 #HANGUL SYLLABLE RIEUL I IEUNG +0xB8B6 0xB9C8 #HANGUL SYLLABLE MIEUM A +0xB8B7 0xB9C9 #HANGUL SYLLABLE MIEUM A KIYEOK +0xB8B8 0xB9CC #HANGUL SYLLABLE MIEUM A NIEUN +0xB8B9 0xB9CE #HANGUL SYLLABLE MIEUM A NIEUNHIEUH +0xB8BA 0xB9CF #HANGUL SYLLABLE MIEUM A TIKEUT +0xB8BB 0xB9D0 #HANGUL SYLLABLE MIEUM A RIEUL +0xB8BC 0xB9D1 #HANGUL SYLLABLE MIEUM A RIEULKIYEOK +0xB8BD 0xB9D2 #HANGUL SYLLABLE MIEUM A RIEULMIEUM +0xB8BE 0xB9D8 #HANGUL SYLLABLE MIEUM A MIEUM +0xB8BF 0xB9D9 #HANGUL SYLLABLE MIEUM A PIEUP +0xB8C0 0xB9DB #HANGUL SYLLABLE MIEUM A SIOS +0xB8C1 0xB9DD #HANGUL SYLLABLE MIEUM A IEUNG +0xB8C2 0xB9DE #HANGUL SYLLABLE MIEUM A CIEUC +0xB8C3 0xB9E1 #HANGUL SYLLABLE MIEUM A THIEUTH +0xB8C4 0xB9E3 #HANGUL SYLLABLE MIEUM A HIEUH +0xB8C5 0xB9E4 #HANGUL SYLLABLE MIEUM AE +0xB8C6 0xB9E5 #HANGUL SYLLABLE MIEUM AE KIYEOK +0xB8C7 0xB9E8 #HANGUL SYLLABLE MIEUM AE NIEUN +0xB8C8 0xB9EC #HANGUL SYLLABLE MIEUM AE RIEUL +0xB8C9 0xB9F4 #HANGUL SYLLABLE MIEUM AE MIEUM +0xB8CA 0xB9F5 #HANGUL SYLLABLE MIEUM AE PIEUP +0xB8CB 0xB9F7 #HANGUL SYLLABLE MIEUM AE SIOS +0xB8CC 0xB9F8 #HANGUL SYLLABLE MIEUM AE SSANGSIOS +0xB8CD 0xB9F9 #HANGUL SYLLABLE MIEUM AE IEUNG +0xB8CE 0xB9FA #HANGUL SYLLABLE MIEUM AE CIEUC +0xB8CF 0xBA00 #HANGUL SYLLABLE MIEUM YA +0xB8D0 0xBA01 #HANGUL SYLLABLE MIEUM YA KIYEOK +0xB8D1 0xBA08 #HANGUL SYLLABLE MIEUM YA RIEUL +0xB8D2 0xBA15 #HANGUL SYLLABLE MIEUM YA IEUNG +0xB8D3 0xBA38 #HANGUL SYLLABLE MIEUM EO +0xB8D4 0xBA39 #HANGUL SYLLABLE MIEUM EO KIYEOK +0xB8D5 0xBA3C #HANGUL SYLLABLE MIEUM EO NIEUN +0xB8D6 0xBA40 #HANGUL SYLLABLE MIEUM EO RIEUL +0xB8D7 0xBA42 #HANGUL SYLLABLE MIEUM EO RIEULMIEUM +0xB8D8 0xBA48 #HANGUL SYLLABLE MIEUM EO MIEUM +0xB8D9 0xBA49 #HANGUL SYLLABLE MIEUM EO PIEUP +0xB8DA 0xBA4B #HANGUL SYLLABLE MIEUM EO SIOS +0xB8DB 0xBA4D #HANGUL SYLLABLE MIEUM EO IEUNG +0xB8DC 0xBA4E #HANGUL SYLLABLE MIEUM EO CIEUC +0xB8DD 0xBA53 #HANGUL SYLLABLE MIEUM EO HIEUH +0xB8DE 0xBA54 #HANGUL SYLLABLE MIEUM E +0xB8DF 0xBA55 #HANGUL SYLLABLE MIEUM E KIYEOK +0xB8E0 0xBA58 #HANGUL SYLLABLE MIEUM E NIEUN +0xB8E1 0xBA5C #HANGUL SYLLABLE MIEUM E RIEUL +0xB8E2 0xBA64 #HANGUL SYLLABLE MIEUM E MIEUM +0xB8E3 0xBA65 #HANGUL SYLLABLE MIEUM E PIEUP +0xB8E4 0xBA67 #HANGUL SYLLABLE MIEUM E SIOS +0xB8E5 0xBA68 #HANGUL SYLLABLE MIEUM E SSANGSIOS +0xB8E6 0xBA69 #HANGUL SYLLABLE MIEUM E IEUNG +0xB8E7 0xBA70 #HANGUL SYLLABLE MIEUM YEO +0xB8E8 0xBA71 #HANGUL SYLLABLE MIEUM YEO KIYEOK +0xB8E9 0xBA74 #HANGUL SYLLABLE MIEUM YEO NIEUN +0xB8EA 0xBA78 #HANGUL SYLLABLE MIEUM YEO RIEUL +0xB8EB 0xBA83 #HANGUL SYLLABLE MIEUM YEO SIOS +0xB8EC 0xBA84 #HANGUL SYLLABLE MIEUM YEO SSANGSIOS +0xB8ED 0xBA85 #HANGUL SYLLABLE MIEUM YEO IEUNG +0xB8EE 0xBA87 #HANGUL SYLLABLE MIEUM YEO CHIEUCH +0xB8EF 0xBA8C #HANGUL SYLLABLE MIEUM YE +0xB8F0 0xBAA8 #HANGUL SYLLABLE MIEUM O +0xB8F1 0xBAA9 #HANGUL SYLLABLE MIEUM O KIYEOK +0xB8F2 0xBAAB #HANGUL SYLLABLE MIEUM O KIYEOKSIOS +0xB8F3 0xBAAC #HANGUL SYLLABLE MIEUM O NIEUN +0xB8F4 0xBAB0 #HANGUL SYLLABLE MIEUM O RIEUL +0xB8F5 0xBAB2 #HANGUL SYLLABLE MIEUM O RIEULMIEUM +0xB8F6 0xBAB8 #HANGUL SYLLABLE MIEUM O MIEUM +0xB8F7 0xBAB9 #HANGUL SYLLABLE MIEUM O PIEUP +0xB8F8 0xBABB #HANGUL SYLLABLE MIEUM O SIOS +0xB8F9 0xBABD #HANGUL SYLLABLE MIEUM O IEUNG +0xB8FA 0xBAC4 #HANGUL SYLLABLE MIEUM WA +0xB8FB 0xBAC8 #HANGUL SYLLABLE MIEUM WA NIEUN +0xB8FC 0xBAD8 #HANGUL SYLLABLE MIEUM WA SSANGSIOS +0xB8FD 0xBAD9 #HANGUL SYLLABLE MIEUM WA IEUNG +0xB8FE 0xBAFC #HANGUL SYLLABLE MIEUM OE +0xB941 0xD22A #HANGUL SYLLABLE THIEUTH YO PHIEUPH +0xB942 0xD22B #HANGUL SYLLABLE THIEUTH YO HIEUH +0xB943 0xD22E #HANGUL SYLLABLE THIEUTH U SSANGKIYEOK +0xB944 0xD22F #HANGUL SYLLABLE THIEUTH U KIYEOKSIOS +0xB945 0xD231 #HANGUL SYLLABLE THIEUTH U NIEUNCIEUC +0xB946 0xD232 #HANGUL SYLLABLE THIEUTH U NIEUNHIEUH +0xB947 0xD233 #HANGUL SYLLABLE THIEUTH U TIKEUT +0xB948 0xD235 #HANGUL SYLLABLE THIEUTH U RIEULKIYEOK +0xB949 0xD236 #HANGUL SYLLABLE THIEUTH U RIEULMIEUM +0xB94A 0xD237 #HANGUL SYLLABLE THIEUTH U RIEULPIEUP +0xB94B 0xD238 #HANGUL SYLLABLE THIEUTH U RIEULSIOS +0xB94C 0xD239 #HANGUL SYLLABLE THIEUTH U RIEULTHIEUTH +0xB94D 0xD23A #HANGUL SYLLABLE THIEUTH U RIEULPHIEUPH +0xB94E 0xD23B #HANGUL SYLLABLE THIEUTH U RIEULHIEUH +0xB94F 0xD23E #HANGUL SYLLABLE THIEUTH U PIEUPSIOS +0xB950 0xD240 #HANGUL SYLLABLE THIEUTH U SSANGSIOS +0xB951 0xD242 #HANGUL SYLLABLE THIEUTH U CIEUC +0xB952 0xD243 #HANGUL SYLLABLE THIEUTH U CHIEUCH +0xB953 0xD244 #HANGUL SYLLABLE THIEUTH U KHIEUKH +0xB954 0xD245 #HANGUL SYLLABLE THIEUTH U THIEUTH +0xB955 0xD246 #HANGUL SYLLABLE THIEUTH U PHIEUPH +0xB956 0xD247 #HANGUL SYLLABLE THIEUTH U HIEUH +0xB957 0xD249 #HANGUL SYLLABLE THIEUTH WEO KIYEOK +0xB958 0xD24A #HANGUL SYLLABLE THIEUTH WEO SSANGKIYEOK +0xB959 0xD24B #HANGUL SYLLABLE THIEUTH WEO KIYEOKSIOS +0xB95A 0xD24C #HANGUL SYLLABLE THIEUTH WEO NIEUN +0xB961 0xD24D #HANGUL SYLLABLE THIEUTH WEO NIEUNCIEUC +0xB962 0xD24E #HANGUL SYLLABLE THIEUTH WEO NIEUNHIEUH +0xB963 0xD24F #HANGUL SYLLABLE THIEUTH WEO TIKEUT +0xB964 0xD250 #HANGUL SYLLABLE THIEUTH WEO RIEUL +0xB965 0xD251 #HANGUL SYLLABLE THIEUTH WEO RIEULKIYEOK +0xB966 0xD252 #HANGUL SYLLABLE THIEUTH WEO RIEULMIEUM +0xB967 0xD253 #HANGUL SYLLABLE THIEUTH WEO RIEULPIEUP +0xB968 0xD254 #HANGUL SYLLABLE THIEUTH WEO RIEULSIOS +0xB969 0xD255 #HANGUL SYLLABLE THIEUTH WEO RIEULTHIEUTH +0xB96A 0xD256 #HANGUL SYLLABLE THIEUTH WEO RIEULPHIEUPH +0xB96B 0xD257 #HANGUL SYLLABLE THIEUTH WEO RIEULHIEUH +0xB96C 0xD258 #HANGUL SYLLABLE THIEUTH WEO MIEUM +0xB96D 0xD259 #HANGUL SYLLABLE THIEUTH WEO PIEUP +0xB96E 0xD25A #HANGUL SYLLABLE THIEUTH WEO PIEUPSIOS +0xB96F 0xD25B #HANGUL SYLLABLE THIEUTH WEO SIOS +0xB970 0xD25D #HANGUL SYLLABLE THIEUTH WEO IEUNG +0xB971 0xD25E #HANGUL SYLLABLE THIEUTH WEO CIEUC +0xB972 0xD25F #HANGUL SYLLABLE THIEUTH WEO CHIEUCH +0xB973 0xD260 #HANGUL SYLLABLE THIEUTH WEO KHIEUKH +0xB974 0xD261 #HANGUL SYLLABLE THIEUTH WEO THIEUTH +0xB975 0xD262 #HANGUL SYLLABLE THIEUTH WEO PHIEUPH +0xB976 0xD263 #HANGUL SYLLABLE THIEUTH WEO HIEUH +0xB977 0xD265 #HANGUL SYLLABLE THIEUTH WE KIYEOK +0xB978 0xD266 #HANGUL SYLLABLE THIEUTH WE SSANGKIYEOK +0xB979 0xD267 #HANGUL SYLLABLE THIEUTH WE KIYEOKSIOS +0xB97A 0xD268 #HANGUL SYLLABLE THIEUTH WE NIEUN +0xB981 0xD269 #HANGUL SYLLABLE THIEUTH WE NIEUNCIEUC +0xB982 0xD26A #HANGUL SYLLABLE THIEUTH WE NIEUNHIEUH +0xB983 0xD26B #HANGUL SYLLABLE THIEUTH WE TIKEUT +0xB984 0xD26C #HANGUL SYLLABLE THIEUTH WE RIEUL +0xB985 0xD26D #HANGUL SYLLABLE THIEUTH WE RIEULKIYEOK +0xB986 0xD26E #HANGUL SYLLABLE THIEUTH WE RIEULMIEUM +0xB987 0xD26F #HANGUL SYLLABLE THIEUTH WE RIEULPIEUP +0xB988 0xD270 #HANGUL SYLLABLE THIEUTH WE RIEULSIOS +0xB989 0xD271 #HANGUL SYLLABLE THIEUTH WE RIEULTHIEUTH +0xB98A 0xD272 #HANGUL SYLLABLE THIEUTH WE RIEULPHIEUPH +0xB98B 0xD273 #HANGUL SYLLABLE THIEUTH WE RIEULHIEUH +0xB98C 0xD274 #HANGUL SYLLABLE THIEUTH WE MIEUM +0xB98D 0xD275 #HANGUL SYLLABLE THIEUTH WE PIEUP +0xB98E 0xD276 #HANGUL SYLLABLE THIEUTH WE PIEUPSIOS +0xB98F 0xD277 #HANGUL SYLLABLE THIEUTH WE SIOS +0xB990 0xD278 #HANGUL SYLLABLE THIEUTH WE SSANGSIOS +0xB991 0xD279 #HANGUL SYLLABLE THIEUTH WE IEUNG +0xB992 0xD27A #HANGUL SYLLABLE THIEUTH WE CIEUC +0xB993 0xD27B #HANGUL SYLLABLE THIEUTH WE CHIEUCH +0xB994 0xD27C #HANGUL SYLLABLE THIEUTH WE KHIEUKH +0xB995 0xD27D #HANGUL SYLLABLE THIEUTH WE THIEUTH +0xB996 0xD27E #HANGUL SYLLABLE THIEUTH WE PHIEUPH +0xB997 0xD27F #HANGUL SYLLABLE THIEUTH WE HIEUH +0xB998 0xD282 #HANGUL SYLLABLE THIEUTH WI SSANGKIYEOK +0xB999 0xD283 #HANGUL SYLLABLE THIEUTH WI KIYEOKSIOS +0xB99A 0xD285 #HANGUL SYLLABLE THIEUTH WI NIEUNCIEUC +0xB99B 0xD286 #HANGUL SYLLABLE THIEUTH WI NIEUNHIEUH +0xB99C 0xD287 #HANGUL SYLLABLE THIEUTH WI TIKEUT +0xB99D 0xD289 #HANGUL SYLLABLE THIEUTH WI RIEULKIYEOK +0xB99E 0xD28A #HANGUL SYLLABLE THIEUTH WI RIEULMIEUM +0xB99F 0xD28B #HANGUL SYLLABLE THIEUTH WI RIEULPIEUP +0xB9A0 0xD28C #HANGUL SYLLABLE THIEUTH WI RIEULSIOS +0xB9A1 0xBB00 #HANGUL SYLLABLE MIEUM OE NIEUN +0xB9A2 0xBB04 #HANGUL SYLLABLE MIEUM OE RIEUL +0xB9A3 0xBB0D #HANGUL SYLLABLE MIEUM OE PIEUP +0xB9A4 0xBB0F #HANGUL SYLLABLE MIEUM OE SIOS +0xB9A5 0xBB11 #HANGUL SYLLABLE MIEUM OE IEUNG +0xB9A6 0xBB18 #HANGUL SYLLABLE MIEUM YO +0xB9A7 0xBB1C #HANGUL SYLLABLE MIEUM YO NIEUN +0xB9A8 0xBB20 #HANGUL SYLLABLE MIEUM YO RIEUL +0xB9A9 0xBB29 #HANGUL SYLLABLE MIEUM YO PIEUP +0xB9AA 0xBB2B #HANGUL SYLLABLE MIEUM YO SIOS +0xB9AB 0xBB34 #HANGUL SYLLABLE MIEUM U +0xB9AC 0xBB35 #HANGUL SYLLABLE MIEUM U KIYEOK +0xB9AD 0xBB36 #HANGUL SYLLABLE MIEUM U SSANGKIYEOK +0xB9AE 0xBB38 #HANGUL SYLLABLE MIEUM U NIEUN +0xB9AF 0xBB3B #HANGUL SYLLABLE MIEUM U TIKEUT +0xB9B0 0xBB3C #HANGUL SYLLABLE MIEUM U RIEUL +0xB9B1 0xBB3D #HANGUL SYLLABLE MIEUM U RIEULKIYEOK +0xB9B2 0xBB3E #HANGUL SYLLABLE MIEUM U RIEULMIEUM +0xB9B3 0xBB44 #HANGUL SYLLABLE MIEUM U MIEUM +0xB9B4 0xBB45 #HANGUL SYLLABLE MIEUM U PIEUP +0xB9B5 0xBB47 #HANGUL SYLLABLE MIEUM U SIOS +0xB9B6 0xBB49 #HANGUL SYLLABLE MIEUM U IEUNG +0xB9B7 0xBB4D #HANGUL SYLLABLE MIEUM U THIEUTH +0xB9B8 0xBB4F #HANGUL SYLLABLE MIEUM U HIEUH +0xB9B9 0xBB50 #HANGUL SYLLABLE MIEUM WEO +0xB9BA 0xBB54 #HANGUL SYLLABLE MIEUM WEO NIEUN +0xB9BB 0xBB58 #HANGUL SYLLABLE MIEUM WEO RIEUL +0xB9BC 0xBB61 #HANGUL SYLLABLE MIEUM WEO PIEUP +0xB9BD 0xBB63 #HANGUL SYLLABLE MIEUM WEO SIOS +0xB9BE 0xBB6C #HANGUL SYLLABLE MIEUM WE +0xB9BF 0xBB88 #HANGUL SYLLABLE MIEUM WI +0xB9C0 0xBB8C #HANGUL SYLLABLE MIEUM WI NIEUN +0xB9C1 0xBB90 #HANGUL SYLLABLE MIEUM WI RIEUL +0xB9C2 0xBBA4 #HANGUL SYLLABLE MIEUM YU +0xB9C3 0xBBA8 #HANGUL SYLLABLE MIEUM YU NIEUN +0xB9C4 0xBBAC #HANGUL SYLLABLE MIEUM YU RIEUL +0xB9C5 0xBBB4 #HANGUL SYLLABLE MIEUM YU MIEUM +0xB9C6 0xBBB7 #HANGUL SYLLABLE MIEUM YU SIOS +0xB9C7 0xBBC0 #HANGUL SYLLABLE MIEUM EU +0xB9C8 0xBBC4 #HANGUL SYLLABLE MIEUM EU NIEUN +0xB9C9 0xBBC8 #HANGUL SYLLABLE MIEUM EU RIEUL +0xB9CA 0xBBD0 #HANGUL SYLLABLE MIEUM EU MIEUM +0xB9CB 0xBBD3 #HANGUL SYLLABLE MIEUM EU SIOS +0xB9CC 0xBBF8 #HANGUL SYLLABLE MIEUM I +0xB9CD 0xBBF9 #HANGUL SYLLABLE MIEUM I KIYEOK +0xB9CE 0xBBFC #HANGUL SYLLABLE MIEUM I NIEUN +0xB9CF 0xBBFF #HANGUL SYLLABLE MIEUM I TIKEUT +0xB9D0 0xBC00 #HANGUL SYLLABLE MIEUM I RIEUL +0xB9D1 0xBC02 #HANGUL SYLLABLE MIEUM I RIEULMIEUM +0xB9D2 0xBC08 #HANGUL SYLLABLE MIEUM I MIEUM +0xB9D3 0xBC09 #HANGUL SYLLABLE MIEUM I PIEUP +0xB9D4 0xBC0B #HANGUL SYLLABLE MIEUM I SIOS +0xB9D5 0xBC0C #HANGUL SYLLABLE MIEUM I SSANGSIOS +0xB9D6 0xBC0D #HANGUL SYLLABLE MIEUM I IEUNG +0xB9D7 0xBC0F #HANGUL SYLLABLE MIEUM I CHIEUCH +0xB9D8 0xBC11 #HANGUL SYLLABLE MIEUM I THIEUTH +0xB9D9 0xBC14 #HANGUL SYLLABLE PIEUP A +0xB9DA 0xBC15 #HANGUL SYLLABLE PIEUP A KIYEOK +0xB9DB 0xBC16 #HANGUL SYLLABLE PIEUP A SSANGKIYEOK +0xB9DC 0xBC17 #HANGUL SYLLABLE PIEUP A KIYEOKSIOS +0xB9DD 0xBC18 #HANGUL SYLLABLE PIEUP A NIEUN +0xB9DE 0xBC1B #HANGUL SYLLABLE PIEUP A TIKEUT +0xB9DF 0xBC1C #HANGUL SYLLABLE PIEUP A RIEUL +0xB9E0 0xBC1D #HANGUL SYLLABLE PIEUP A RIEULKIYEOK +0xB9E1 0xBC1E #HANGUL SYLLABLE PIEUP A RIEULMIEUM +0xB9E2 0xBC1F #HANGUL SYLLABLE PIEUP A RIEULPIEUP +0xB9E3 0xBC24 #HANGUL SYLLABLE PIEUP A MIEUM +0xB9E4 0xBC25 #HANGUL SYLLABLE PIEUP A PIEUP +0xB9E5 0xBC27 #HANGUL SYLLABLE PIEUP A SIOS +0xB9E6 0xBC29 #HANGUL SYLLABLE PIEUP A IEUNG +0xB9E7 0xBC2D #HANGUL SYLLABLE PIEUP A THIEUTH +0xB9E8 0xBC30 #HANGUL SYLLABLE PIEUP AE +0xB9E9 0xBC31 #HANGUL SYLLABLE PIEUP AE KIYEOK +0xB9EA 0xBC34 #HANGUL SYLLABLE PIEUP AE NIEUN +0xB9EB 0xBC38 #HANGUL SYLLABLE PIEUP AE RIEUL +0xB9EC 0xBC40 #HANGUL SYLLABLE PIEUP AE MIEUM +0xB9ED 0xBC41 #HANGUL SYLLABLE PIEUP AE PIEUP +0xB9EE 0xBC43 #HANGUL SYLLABLE PIEUP AE SIOS +0xB9EF 0xBC44 #HANGUL SYLLABLE PIEUP AE SSANGSIOS +0xB9F0 0xBC45 #HANGUL SYLLABLE PIEUP AE IEUNG +0xB9F1 0xBC49 #HANGUL SYLLABLE PIEUP AE THIEUTH +0xB9F2 0xBC4C #HANGUL SYLLABLE PIEUP YA +0xB9F3 0xBC4D #HANGUL SYLLABLE PIEUP YA KIYEOK +0xB9F4 0xBC50 #HANGUL SYLLABLE PIEUP YA NIEUN +0xB9F5 0xBC5D #HANGUL SYLLABLE PIEUP YA PIEUP +0xB9F6 0xBC84 #HANGUL SYLLABLE PIEUP EO +0xB9F7 0xBC85 #HANGUL SYLLABLE PIEUP EO KIYEOK +0xB9F8 0xBC88 #HANGUL SYLLABLE PIEUP EO NIEUN +0xB9F9 0xBC8B #HANGUL SYLLABLE PIEUP EO TIKEUT +0xB9FA 0xBC8C #HANGUL SYLLABLE PIEUP EO RIEUL +0xB9FB 0xBC8E #HANGUL SYLLABLE PIEUP EO RIEULMIEUM +0xB9FC 0xBC94 #HANGUL SYLLABLE PIEUP EO MIEUM +0xB9FD 0xBC95 #HANGUL SYLLABLE PIEUP EO PIEUP +0xB9FE 0xBC97 #HANGUL SYLLABLE PIEUP EO SIOS +0xBA41 0xD28D #HANGUL SYLLABLE THIEUTH WI RIEULTHIEUTH +0xBA42 0xD28E #HANGUL SYLLABLE THIEUTH WI RIEULPHIEUPH +0xBA43 0xD28F #HANGUL SYLLABLE THIEUTH WI RIEULHIEUH +0xBA44 0xD292 #HANGUL SYLLABLE THIEUTH WI PIEUPSIOS +0xBA45 0xD293 #HANGUL SYLLABLE THIEUTH WI SIOS +0xBA46 0xD294 #HANGUL SYLLABLE THIEUTH WI SSANGSIOS +0xBA47 0xD296 #HANGUL SYLLABLE THIEUTH WI CIEUC +0xBA48 0xD297 #HANGUL SYLLABLE THIEUTH WI CHIEUCH +0xBA49 0xD298 #HANGUL SYLLABLE THIEUTH WI KHIEUKH +0xBA4A 0xD299 #HANGUL SYLLABLE THIEUTH WI THIEUTH +0xBA4B 0xD29A #HANGUL SYLLABLE THIEUTH WI PHIEUPH +0xBA4C 0xD29B #HANGUL SYLLABLE THIEUTH WI HIEUH +0xBA4D 0xD29D #HANGUL SYLLABLE THIEUTH YU KIYEOK +0xBA4E 0xD29E #HANGUL SYLLABLE THIEUTH YU SSANGKIYEOK +0xBA4F 0xD29F #HANGUL SYLLABLE THIEUTH YU KIYEOKSIOS +0xBA50 0xD2A1 #HANGUL SYLLABLE THIEUTH YU NIEUNCIEUC +0xBA51 0xD2A2 #HANGUL SYLLABLE THIEUTH YU NIEUNHIEUH +0xBA52 0xD2A3 #HANGUL SYLLABLE THIEUTH YU TIKEUT +0xBA53 0xD2A5 #HANGUL SYLLABLE THIEUTH YU RIEULKIYEOK +0xBA54 0xD2A6 #HANGUL SYLLABLE THIEUTH YU RIEULMIEUM +0xBA55 0xD2A7 #HANGUL SYLLABLE THIEUTH YU RIEULPIEUP +0xBA56 0xD2A8 #HANGUL SYLLABLE THIEUTH YU RIEULSIOS +0xBA57 0xD2A9 #HANGUL SYLLABLE THIEUTH YU RIEULTHIEUTH +0xBA58 0xD2AA #HANGUL SYLLABLE THIEUTH YU RIEULPHIEUPH +0xBA59 0xD2AB #HANGUL SYLLABLE THIEUTH YU RIEULHIEUH +0xBA5A 0xD2AD #HANGUL SYLLABLE THIEUTH YU PIEUP +0xBA61 0xD2AE #HANGUL SYLLABLE THIEUTH YU PIEUPSIOS +0xBA62 0xD2AF #HANGUL SYLLABLE THIEUTH YU SIOS +0xBA63 0xD2B0 #HANGUL SYLLABLE THIEUTH YU SSANGSIOS +0xBA64 0xD2B2 #HANGUL SYLLABLE THIEUTH YU CIEUC +0xBA65 0xD2B3 #HANGUL SYLLABLE THIEUTH YU CHIEUCH +0xBA66 0xD2B4 #HANGUL SYLLABLE THIEUTH YU KHIEUKH +0xBA67 0xD2B5 #HANGUL SYLLABLE THIEUTH YU THIEUTH +0xBA68 0xD2B6 #HANGUL SYLLABLE THIEUTH YU PHIEUPH +0xBA69 0xD2B7 #HANGUL SYLLABLE THIEUTH YU HIEUH +0xBA6A 0xD2BA #HANGUL SYLLABLE THIEUTH EU SSANGKIYEOK +0xBA6B 0xD2BB #HANGUL SYLLABLE THIEUTH EU KIYEOKSIOS +0xBA6C 0xD2BD #HANGUL SYLLABLE THIEUTH EU NIEUNCIEUC +0xBA6D 0xD2BE #HANGUL SYLLABLE THIEUTH EU NIEUNHIEUH +0xBA6E 0xD2C1 #HANGUL SYLLABLE THIEUTH EU RIEULKIYEOK +0xBA6F 0xD2C3 #HANGUL SYLLABLE THIEUTH EU RIEULPIEUP +0xBA70 0xD2C4 #HANGUL SYLLABLE THIEUTH EU RIEULSIOS +0xBA71 0xD2C5 #HANGUL SYLLABLE THIEUTH EU RIEULTHIEUTH +0xBA72 0xD2C6 #HANGUL SYLLABLE THIEUTH EU RIEULPHIEUPH +0xBA73 0xD2C7 #HANGUL SYLLABLE THIEUTH EU RIEULHIEUH +0xBA74 0xD2CA #HANGUL SYLLABLE THIEUTH EU PIEUPSIOS +0xBA75 0xD2CC #HANGUL SYLLABLE THIEUTH EU SSANGSIOS +0xBA76 0xD2CD #HANGUL SYLLABLE THIEUTH EU IEUNG +0xBA77 0xD2CE #HANGUL SYLLABLE THIEUTH EU CIEUC +0xBA78 0xD2CF #HANGUL SYLLABLE THIEUTH EU CHIEUCH +0xBA79 0xD2D0 #HANGUL SYLLABLE THIEUTH EU KHIEUKH +0xBA7A 0xD2D1 #HANGUL SYLLABLE THIEUTH EU THIEUTH +0xBA81 0xD2D2 #HANGUL SYLLABLE THIEUTH EU PHIEUPH +0xBA82 0xD2D3 #HANGUL SYLLABLE THIEUTH EU HIEUH +0xBA83 0xD2D5 #HANGUL SYLLABLE THIEUTH YI KIYEOK +0xBA84 0xD2D6 #HANGUL SYLLABLE THIEUTH YI SSANGKIYEOK +0xBA85 0xD2D7 #HANGUL SYLLABLE THIEUTH YI KIYEOKSIOS +0xBA86 0xD2D9 #HANGUL SYLLABLE THIEUTH YI NIEUNCIEUC +0xBA87 0xD2DA #HANGUL SYLLABLE THIEUTH YI NIEUNHIEUH +0xBA88 0xD2DB #HANGUL SYLLABLE THIEUTH YI TIKEUT +0xBA89 0xD2DD #HANGUL SYLLABLE THIEUTH YI RIEULKIYEOK +0xBA8A 0xD2DE #HANGUL SYLLABLE THIEUTH YI RIEULMIEUM +0xBA8B 0xD2DF #HANGUL SYLLABLE THIEUTH YI RIEULPIEUP +0xBA8C 0xD2E0 #HANGUL SYLLABLE THIEUTH YI RIEULSIOS +0xBA8D 0xD2E1 #HANGUL SYLLABLE THIEUTH YI RIEULTHIEUTH +0xBA8E 0xD2E2 #HANGUL SYLLABLE THIEUTH YI RIEULPHIEUPH +0xBA8F 0xD2E3 #HANGUL SYLLABLE THIEUTH YI RIEULHIEUH +0xBA90 0xD2E6 #HANGUL SYLLABLE THIEUTH YI PIEUPSIOS +0xBA91 0xD2E7 #HANGUL SYLLABLE THIEUTH YI SIOS +0xBA92 0xD2E8 #HANGUL SYLLABLE THIEUTH YI SSANGSIOS +0xBA93 0xD2E9 #HANGUL SYLLABLE THIEUTH YI IEUNG +0xBA94 0xD2EA #HANGUL SYLLABLE THIEUTH YI CIEUC +0xBA95 0xD2EB #HANGUL SYLLABLE THIEUTH YI CHIEUCH +0xBA96 0xD2EC #HANGUL SYLLABLE THIEUTH YI KHIEUKH +0xBA97 0xD2ED #HANGUL SYLLABLE THIEUTH YI THIEUTH +0xBA98 0xD2EE #HANGUL SYLLABLE THIEUTH YI PHIEUPH +0xBA99 0xD2EF #HANGUL SYLLABLE THIEUTH YI HIEUH +0xBA9A 0xD2F2 #HANGUL SYLLABLE THIEUTH I SSANGKIYEOK +0xBA9B 0xD2F3 #HANGUL SYLLABLE THIEUTH I KIYEOKSIOS +0xBA9C 0xD2F5 #HANGUL SYLLABLE THIEUTH I NIEUNCIEUC +0xBA9D 0xD2F6 #HANGUL SYLLABLE THIEUTH I NIEUNHIEUH +0xBA9E 0xD2F7 #HANGUL SYLLABLE THIEUTH I TIKEUT +0xBA9F 0xD2F9 #HANGUL SYLLABLE THIEUTH I RIEULKIYEOK +0xBAA0 0xD2FA #HANGUL SYLLABLE THIEUTH I RIEULMIEUM +0xBAA1 0xBC99 #HANGUL SYLLABLE PIEUP EO IEUNG +0xBAA2 0xBC9A #HANGUL SYLLABLE PIEUP EO CIEUC +0xBAA3 0xBCA0 #HANGUL SYLLABLE PIEUP E +0xBAA4 0xBCA1 #HANGUL SYLLABLE PIEUP E KIYEOK +0xBAA5 0xBCA4 #HANGUL SYLLABLE PIEUP E NIEUN +0xBAA6 0xBCA7 #HANGUL SYLLABLE PIEUP E TIKEUT +0xBAA7 0xBCA8 #HANGUL SYLLABLE PIEUP E RIEUL +0xBAA8 0xBCB0 #HANGUL SYLLABLE PIEUP E MIEUM +0xBAA9 0xBCB1 #HANGUL SYLLABLE PIEUP E PIEUP +0xBAAA 0xBCB3 #HANGUL SYLLABLE PIEUP E SIOS +0xBAAB 0xBCB4 #HANGUL SYLLABLE PIEUP E SSANGSIOS +0xBAAC 0xBCB5 #HANGUL SYLLABLE PIEUP E IEUNG +0xBAAD 0xBCBC #HANGUL SYLLABLE PIEUP YEO +0xBAAE 0xBCBD #HANGUL SYLLABLE PIEUP YEO KIYEOK +0xBAAF 0xBCC0 #HANGUL SYLLABLE PIEUP YEO NIEUN +0xBAB0 0xBCC4 #HANGUL SYLLABLE PIEUP YEO RIEUL +0xBAB1 0xBCCD #HANGUL SYLLABLE PIEUP YEO PIEUP +0xBAB2 0xBCCF #HANGUL SYLLABLE PIEUP YEO SIOS +0xBAB3 0xBCD0 #HANGUL SYLLABLE PIEUP YEO SSANGSIOS +0xBAB4 0xBCD1 #HANGUL SYLLABLE PIEUP YEO IEUNG +0xBAB5 0xBCD5 #HANGUL SYLLABLE PIEUP YEO THIEUTH +0xBAB6 0xBCD8 #HANGUL SYLLABLE PIEUP YE +0xBAB7 0xBCDC #HANGUL SYLLABLE PIEUP YE NIEUN +0xBAB8 0xBCF4 #HANGUL SYLLABLE PIEUP O +0xBAB9 0xBCF5 #HANGUL SYLLABLE PIEUP O KIYEOK +0xBABA 0xBCF6 #HANGUL SYLLABLE PIEUP O SSANGKIYEOK +0xBABB 0xBCF8 #HANGUL SYLLABLE PIEUP O NIEUN +0xBABC 0xBCFC #HANGUL SYLLABLE PIEUP O RIEUL +0xBABD 0xBD04 #HANGUL SYLLABLE PIEUP O MIEUM +0xBABE 0xBD05 #HANGUL SYLLABLE PIEUP O PIEUP +0xBABF 0xBD07 #HANGUL SYLLABLE PIEUP O SIOS +0xBAC0 0xBD09 #HANGUL SYLLABLE PIEUP O IEUNG +0xBAC1 0xBD10 #HANGUL SYLLABLE PIEUP WA +0xBAC2 0xBD14 #HANGUL SYLLABLE PIEUP WA NIEUN +0xBAC3 0xBD24 #HANGUL SYLLABLE PIEUP WA SSANGSIOS +0xBAC4 0xBD2C #HANGUL SYLLABLE PIEUP WAE +0xBAC5 0xBD40 #HANGUL SYLLABLE PIEUP WAE SSANGSIOS +0xBAC6 0xBD48 #HANGUL SYLLABLE PIEUP OE +0xBAC7 0xBD49 #HANGUL SYLLABLE PIEUP OE KIYEOK +0xBAC8 0xBD4C #HANGUL SYLLABLE PIEUP OE NIEUN +0xBAC9 0xBD50 #HANGUL SYLLABLE PIEUP OE RIEUL +0xBACA 0xBD58 #HANGUL SYLLABLE PIEUP OE MIEUM +0xBACB 0xBD59 #HANGUL SYLLABLE PIEUP OE PIEUP +0xBACC 0xBD64 #HANGUL SYLLABLE PIEUP YO +0xBACD 0xBD68 #HANGUL SYLLABLE PIEUP YO NIEUN +0xBACE 0xBD80 #HANGUL SYLLABLE PIEUP U +0xBACF 0xBD81 #HANGUL SYLLABLE PIEUP U KIYEOK +0xBAD0 0xBD84 #HANGUL SYLLABLE PIEUP U NIEUN +0xBAD1 0xBD87 #HANGUL SYLLABLE PIEUP U TIKEUT +0xBAD2 0xBD88 #HANGUL SYLLABLE PIEUP U RIEUL +0xBAD3 0xBD89 #HANGUL SYLLABLE PIEUP U RIEULKIYEOK +0xBAD4 0xBD8A #HANGUL SYLLABLE PIEUP U RIEULMIEUM +0xBAD5 0xBD90 #HANGUL SYLLABLE PIEUP U MIEUM +0xBAD6 0xBD91 #HANGUL SYLLABLE PIEUP U PIEUP +0xBAD7 0xBD93 #HANGUL SYLLABLE PIEUP U SIOS +0xBAD8 0xBD95 #HANGUL SYLLABLE PIEUP U IEUNG +0xBAD9 0xBD99 #HANGUL SYLLABLE PIEUP U THIEUTH +0xBADA 0xBD9A #HANGUL SYLLABLE PIEUP U PHIEUPH +0xBADB 0xBD9C #HANGUL SYLLABLE PIEUP WEO +0xBADC 0xBDA4 #HANGUL SYLLABLE PIEUP WEO RIEUL +0xBADD 0xBDB0 #HANGUL SYLLABLE PIEUP WEO SSANGSIOS +0xBADE 0xBDB8 #HANGUL SYLLABLE PIEUP WE +0xBADF 0xBDD4 #HANGUL SYLLABLE PIEUP WI +0xBAE0 0xBDD5 #HANGUL SYLLABLE PIEUP WI KIYEOK +0xBAE1 0xBDD8 #HANGUL SYLLABLE PIEUP WI NIEUN +0xBAE2 0xBDDC #HANGUL SYLLABLE PIEUP WI RIEUL +0xBAE3 0xBDE9 #HANGUL SYLLABLE PIEUP WI IEUNG +0xBAE4 0xBDF0 #HANGUL SYLLABLE PIEUP YU +0xBAE5 0xBDF4 #HANGUL SYLLABLE PIEUP YU NIEUN +0xBAE6 0xBDF8 #HANGUL SYLLABLE PIEUP YU RIEUL +0xBAE7 0xBE00 #HANGUL SYLLABLE PIEUP YU MIEUM +0xBAE8 0xBE03 #HANGUL SYLLABLE PIEUP YU SIOS +0xBAE9 0xBE05 #HANGUL SYLLABLE PIEUP YU IEUNG +0xBAEA 0xBE0C #HANGUL SYLLABLE PIEUP EU +0xBAEB 0xBE0D #HANGUL SYLLABLE PIEUP EU KIYEOK +0xBAEC 0xBE10 #HANGUL SYLLABLE PIEUP EU NIEUN +0xBAED 0xBE14 #HANGUL SYLLABLE PIEUP EU RIEUL +0xBAEE 0xBE1C #HANGUL SYLLABLE PIEUP EU MIEUM +0xBAEF 0xBE1D #HANGUL SYLLABLE PIEUP EU PIEUP +0xBAF0 0xBE1F #HANGUL SYLLABLE PIEUP EU SIOS +0xBAF1 0xBE44 #HANGUL SYLLABLE PIEUP I +0xBAF2 0xBE45 #HANGUL SYLLABLE PIEUP I KIYEOK +0xBAF3 0xBE48 #HANGUL SYLLABLE PIEUP I NIEUN +0xBAF4 0xBE4C #HANGUL SYLLABLE PIEUP I RIEUL +0xBAF5 0xBE4E #HANGUL SYLLABLE PIEUP I RIEULMIEUM +0xBAF6 0xBE54 #HANGUL SYLLABLE PIEUP I MIEUM +0xBAF7 0xBE55 #HANGUL SYLLABLE PIEUP I PIEUP +0xBAF8 0xBE57 #HANGUL SYLLABLE PIEUP I SIOS +0xBAF9 0xBE59 #HANGUL SYLLABLE PIEUP I IEUNG +0xBAFA 0xBE5A #HANGUL SYLLABLE PIEUP I CIEUC +0xBAFB 0xBE5B #HANGUL SYLLABLE PIEUP I CHIEUCH +0xBAFC 0xBE60 #HANGUL SYLLABLE SSANGPIEUP A +0xBAFD 0xBE61 #HANGUL SYLLABLE SSANGPIEUP A KIYEOK +0xBAFE 0xBE64 #HANGUL SYLLABLE SSANGPIEUP A NIEUN +0xBB41 0xD2FB #HANGUL SYLLABLE THIEUTH I RIEULPIEUP +0xBB42 0xD2FC #HANGUL SYLLABLE THIEUTH I RIEULSIOS +0xBB43 0xD2FD #HANGUL SYLLABLE THIEUTH I RIEULTHIEUTH +0xBB44 0xD2FE #HANGUL SYLLABLE THIEUTH I RIEULPHIEUPH +0xBB45 0xD2FF #HANGUL SYLLABLE THIEUTH I RIEULHIEUH +0xBB46 0xD302 #HANGUL SYLLABLE THIEUTH I PIEUPSIOS +0xBB47 0xD304 #HANGUL SYLLABLE THIEUTH I SSANGSIOS +0xBB48 0xD306 #HANGUL SYLLABLE THIEUTH I CIEUC +0xBB49 0xD307 #HANGUL SYLLABLE THIEUTH I CHIEUCH +0xBB4A 0xD308 #HANGUL SYLLABLE THIEUTH I KHIEUKH +0xBB4B 0xD309 #HANGUL SYLLABLE THIEUTH I THIEUTH +0xBB4C 0xD30A #HANGUL SYLLABLE THIEUTH I PHIEUPH +0xBB4D 0xD30B #HANGUL SYLLABLE THIEUTH I HIEUH +0xBB4E 0xD30F #HANGUL SYLLABLE PHIEUPH A KIYEOKSIOS +0xBB4F 0xD311 #HANGUL SYLLABLE PHIEUPH A NIEUNCIEUC +0xBB50 0xD312 #HANGUL SYLLABLE PHIEUPH A NIEUNHIEUH +0xBB51 0xD313 #HANGUL SYLLABLE PHIEUPH A TIKEUT +0xBB52 0xD315 #HANGUL SYLLABLE PHIEUPH A RIEULKIYEOK +0xBB53 0xD317 #HANGUL SYLLABLE PHIEUPH A RIEULPIEUP +0xBB54 0xD318 #HANGUL SYLLABLE PHIEUPH A RIEULSIOS +0xBB55 0xD319 #HANGUL SYLLABLE PHIEUPH A RIEULTHIEUTH +0xBB56 0xD31A #HANGUL SYLLABLE PHIEUPH A RIEULPHIEUPH +0xBB57 0xD31B #HANGUL SYLLABLE PHIEUPH A RIEULHIEUH +0xBB58 0xD31E #HANGUL SYLLABLE PHIEUPH A PIEUPSIOS +0xBB59 0xD322 #HANGUL SYLLABLE PHIEUPH A CIEUC +0xBB5A 0xD323 #HANGUL SYLLABLE PHIEUPH A CHIEUCH +0xBB61 0xD324 #HANGUL SYLLABLE PHIEUPH A KHIEUKH +0xBB62 0xD326 #HANGUL SYLLABLE PHIEUPH A PHIEUPH +0xBB63 0xD327 #HANGUL SYLLABLE PHIEUPH A HIEUH +0xBB64 0xD32A #HANGUL SYLLABLE PHIEUPH AE SSANGKIYEOK +0xBB65 0xD32B #HANGUL SYLLABLE PHIEUPH AE KIYEOKSIOS +0xBB66 0xD32D #HANGUL SYLLABLE PHIEUPH AE NIEUNCIEUC +0xBB67 0xD32E #HANGUL SYLLABLE PHIEUPH AE NIEUNHIEUH +0xBB68 0xD32F #HANGUL SYLLABLE PHIEUPH AE TIKEUT +0xBB69 0xD331 #HANGUL SYLLABLE PHIEUPH AE RIEULKIYEOK +0xBB6A 0xD332 #HANGUL SYLLABLE PHIEUPH AE RIEULMIEUM +0xBB6B 0xD333 #HANGUL SYLLABLE PHIEUPH AE RIEULPIEUP +0xBB6C 0xD334 #HANGUL SYLLABLE PHIEUPH AE RIEULSIOS +0xBB6D 0xD335 #HANGUL SYLLABLE PHIEUPH AE RIEULTHIEUTH +0xBB6E 0xD336 #HANGUL SYLLABLE PHIEUPH AE RIEULPHIEUPH +0xBB6F 0xD337 #HANGUL SYLLABLE PHIEUPH AE RIEULHIEUH +0xBB70 0xD33A #HANGUL SYLLABLE PHIEUPH AE PIEUPSIOS +0xBB71 0xD33E #HANGUL SYLLABLE PHIEUPH AE CIEUC +0xBB72 0xD33F #HANGUL SYLLABLE PHIEUPH AE CHIEUCH +0xBB73 0xD340 #HANGUL SYLLABLE PHIEUPH AE KHIEUKH +0xBB74 0xD341 #HANGUL SYLLABLE PHIEUPH AE THIEUTH +0xBB75 0xD342 #HANGUL SYLLABLE PHIEUPH AE PHIEUPH +0xBB76 0xD343 #HANGUL SYLLABLE PHIEUPH AE HIEUH +0xBB77 0xD346 #HANGUL SYLLABLE PHIEUPH YA SSANGKIYEOK +0xBB78 0xD347 #HANGUL SYLLABLE PHIEUPH YA KIYEOKSIOS +0xBB79 0xD348 #HANGUL SYLLABLE PHIEUPH YA NIEUN +0xBB7A 0xD349 #HANGUL SYLLABLE PHIEUPH YA NIEUNCIEUC +0xBB81 0xD34A #HANGUL SYLLABLE PHIEUPH YA NIEUNHIEUH +0xBB82 0xD34B #HANGUL SYLLABLE PHIEUPH YA TIKEUT +0xBB83 0xD34C #HANGUL SYLLABLE PHIEUPH YA RIEUL +0xBB84 0xD34D #HANGUL SYLLABLE PHIEUPH YA RIEULKIYEOK +0xBB85 0xD34E #HANGUL SYLLABLE PHIEUPH YA RIEULMIEUM +0xBB86 0xD34F #HANGUL SYLLABLE PHIEUPH YA RIEULPIEUP +0xBB87 0xD350 #HANGUL SYLLABLE PHIEUPH YA RIEULSIOS +0xBB88 0xD351 #HANGUL SYLLABLE PHIEUPH YA RIEULTHIEUTH +0xBB89 0xD352 #HANGUL SYLLABLE PHIEUPH YA RIEULPHIEUPH +0xBB8A 0xD353 #HANGUL SYLLABLE PHIEUPH YA RIEULHIEUH +0xBB8B 0xD354 #HANGUL SYLLABLE PHIEUPH YA MIEUM +0xBB8C 0xD355 #HANGUL SYLLABLE PHIEUPH YA PIEUP +0xBB8D 0xD356 #HANGUL SYLLABLE PHIEUPH YA PIEUPSIOS +0xBB8E 0xD357 #HANGUL SYLLABLE PHIEUPH YA SIOS +0xBB8F 0xD358 #HANGUL SYLLABLE PHIEUPH YA SSANGSIOS +0xBB90 0xD359 #HANGUL SYLLABLE PHIEUPH YA IEUNG +0xBB91 0xD35A #HANGUL SYLLABLE PHIEUPH YA CIEUC +0xBB92 0xD35B #HANGUL SYLLABLE PHIEUPH YA CHIEUCH +0xBB93 0xD35C #HANGUL SYLLABLE PHIEUPH YA KHIEUKH +0xBB94 0xD35D #HANGUL SYLLABLE PHIEUPH YA THIEUTH +0xBB95 0xD35E #HANGUL SYLLABLE PHIEUPH YA PHIEUPH +0xBB96 0xD35F #HANGUL SYLLABLE PHIEUPH YA HIEUH +0xBB97 0xD360 #HANGUL SYLLABLE PHIEUPH YAE +0xBB98 0xD361 #HANGUL SYLLABLE PHIEUPH YAE KIYEOK +0xBB99 0xD362 #HANGUL SYLLABLE PHIEUPH YAE SSANGKIYEOK +0xBB9A 0xD363 #HANGUL SYLLABLE PHIEUPH YAE KIYEOKSIOS +0xBB9B 0xD364 #HANGUL SYLLABLE PHIEUPH YAE NIEUN +0xBB9C 0xD365 #HANGUL SYLLABLE PHIEUPH YAE NIEUNCIEUC +0xBB9D 0xD366 #HANGUL SYLLABLE PHIEUPH YAE NIEUNHIEUH +0xBB9E 0xD367 #HANGUL SYLLABLE PHIEUPH YAE TIKEUT +0xBB9F 0xD368 #HANGUL SYLLABLE PHIEUPH YAE RIEUL +0xBBA0 0xD369 #HANGUL SYLLABLE PHIEUPH YAE RIEULKIYEOK +0xBBA1 0xBE68 #HANGUL SYLLABLE SSANGPIEUP A RIEUL +0xBBA2 0xBE6A #HANGUL SYLLABLE SSANGPIEUP A RIEULMIEUM +0xBBA3 0xBE70 #HANGUL SYLLABLE SSANGPIEUP A MIEUM +0xBBA4 0xBE71 #HANGUL SYLLABLE SSANGPIEUP A PIEUP +0xBBA5 0xBE73 #HANGUL SYLLABLE SSANGPIEUP A SIOS +0xBBA6 0xBE74 #HANGUL SYLLABLE SSANGPIEUP A SSANGSIOS +0xBBA7 0xBE75 #HANGUL SYLLABLE SSANGPIEUP A IEUNG +0xBBA8 0xBE7B #HANGUL SYLLABLE SSANGPIEUP A HIEUH +0xBBA9 0xBE7C #HANGUL SYLLABLE SSANGPIEUP AE +0xBBAA 0xBE7D #HANGUL SYLLABLE SSANGPIEUP AE KIYEOK +0xBBAB 0xBE80 #HANGUL SYLLABLE SSANGPIEUP AE NIEUN +0xBBAC 0xBE84 #HANGUL SYLLABLE SSANGPIEUP AE RIEUL +0xBBAD 0xBE8C #HANGUL SYLLABLE SSANGPIEUP AE MIEUM +0xBBAE 0xBE8D #HANGUL SYLLABLE SSANGPIEUP AE PIEUP +0xBBAF 0xBE8F #HANGUL SYLLABLE SSANGPIEUP AE SIOS +0xBBB0 0xBE90 #HANGUL SYLLABLE SSANGPIEUP AE SSANGSIOS +0xBBB1 0xBE91 #HANGUL SYLLABLE SSANGPIEUP AE IEUNG +0xBBB2 0xBE98 #HANGUL SYLLABLE SSANGPIEUP YA +0xBBB3 0xBE99 #HANGUL SYLLABLE SSANGPIEUP YA KIYEOK +0xBBB4 0xBEA8 #HANGUL SYLLABLE SSANGPIEUP YA MIEUM +0xBBB5 0xBED0 #HANGUL SYLLABLE SSANGPIEUP EO +0xBBB6 0xBED1 #HANGUL SYLLABLE SSANGPIEUP EO KIYEOK +0xBBB7 0xBED4 #HANGUL SYLLABLE SSANGPIEUP EO NIEUN +0xBBB8 0xBED7 #HANGUL SYLLABLE SSANGPIEUP EO TIKEUT +0xBBB9 0xBED8 #HANGUL SYLLABLE SSANGPIEUP EO RIEUL +0xBBBA 0xBEE0 #HANGUL SYLLABLE SSANGPIEUP EO MIEUM +0xBBBB 0xBEE3 #HANGUL SYLLABLE SSANGPIEUP EO SIOS +0xBBBC 0xBEE4 #HANGUL SYLLABLE SSANGPIEUP EO SSANGSIOS +0xBBBD 0xBEE5 #HANGUL SYLLABLE SSANGPIEUP EO IEUNG +0xBBBE 0xBEEC #HANGUL SYLLABLE SSANGPIEUP E +0xBBBF 0xBF01 #HANGUL SYLLABLE SSANGPIEUP E IEUNG +0xBBC0 0xBF08 #HANGUL SYLLABLE SSANGPIEUP YEO +0xBBC1 0xBF09 #HANGUL SYLLABLE SSANGPIEUP YEO KIYEOK +0xBBC2 0xBF18 #HANGUL SYLLABLE SSANGPIEUP YEO MIEUM +0xBBC3 0xBF19 #HANGUL SYLLABLE SSANGPIEUP YEO PIEUP +0xBBC4 0xBF1B #HANGUL SYLLABLE SSANGPIEUP YEO SIOS +0xBBC5 0xBF1C #HANGUL SYLLABLE SSANGPIEUP YEO SSANGSIOS +0xBBC6 0xBF1D #HANGUL SYLLABLE SSANGPIEUP YEO IEUNG +0xBBC7 0xBF40 #HANGUL SYLLABLE SSANGPIEUP O +0xBBC8 0xBF41 #HANGUL SYLLABLE SSANGPIEUP O KIYEOK +0xBBC9 0xBF44 #HANGUL SYLLABLE SSANGPIEUP O NIEUN +0xBBCA 0xBF48 #HANGUL SYLLABLE SSANGPIEUP O RIEUL +0xBBCB 0xBF50 #HANGUL SYLLABLE SSANGPIEUP O MIEUM +0xBBCC 0xBF51 #HANGUL SYLLABLE SSANGPIEUP O PIEUP +0xBBCD 0xBF55 #HANGUL SYLLABLE SSANGPIEUP O IEUNG +0xBBCE 0xBF94 #HANGUL SYLLABLE SSANGPIEUP OE +0xBBCF 0xBFB0 #HANGUL SYLLABLE SSANGPIEUP YO +0xBBD0 0xBFC5 #HANGUL SYLLABLE SSANGPIEUP YO IEUNG +0xBBD1 0xBFCC #HANGUL SYLLABLE SSANGPIEUP U +0xBBD2 0xBFCD #HANGUL SYLLABLE SSANGPIEUP U KIYEOK +0xBBD3 0xBFD0 #HANGUL SYLLABLE SSANGPIEUP U NIEUN +0xBBD4 0xBFD4 #HANGUL SYLLABLE SSANGPIEUP U RIEUL +0xBBD5 0xBFDC #HANGUL SYLLABLE SSANGPIEUP U MIEUM +0xBBD6 0xBFDF #HANGUL SYLLABLE SSANGPIEUP U SIOS +0xBBD7 0xBFE1 #HANGUL SYLLABLE SSANGPIEUP U IEUNG +0xBBD8 0xC03C #HANGUL SYLLABLE SSANGPIEUP YU +0xBBD9 0xC051 #HANGUL SYLLABLE SSANGPIEUP YU IEUNG +0xBBDA 0xC058 #HANGUL SYLLABLE SSANGPIEUP EU +0xBBDB 0xC05C #HANGUL SYLLABLE SSANGPIEUP EU NIEUN +0xBBDC 0xC060 #HANGUL SYLLABLE SSANGPIEUP EU RIEUL +0xBBDD 0xC068 #HANGUL SYLLABLE SSANGPIEUP EU MIEUM +0xBBDE 0xC069 #HANGUL SYLLABLE SSANGPIEUP EU PIEUP +0xBBDF 0xC090 #HANGUL SYLLABLE SSANGPIEUP I +0xBBE0 0xC091 #HANGUL SYLLABLE SSANGPIEUP I KIYEOK +0xBBE1 0xC094 #HANGUL SYLLABLE SSANGPIEUP I NIEUN +0xBBE2 0xC098 #HANGUL SYLLABLE SSANGPIEUP I RIEUL +0xBBE3 0xC0A0 #HANGUL SYLLABLE SSANGPIEUP I MIEUM +0xBBE4 0xC0A1 #HANGUL SYLLABLE SSANGPIEUP I PIEUP +0xBBE5 0xC0A3 #HANGUL SYLLABLE SSANGPIEUP I SIOS +0xBBE6 0xC0A5 #HANGUL SYLLABLE SSANGPIEUP I IEUNG +0xBBE7 0xC0AC #HANGUL SYLLABLE SIOS A +0xBBE8 0xC0AD #HANGUL SYLLABLE SIOS A KIYEOK +0xBBE9 0xC0AF #HANGUL SYLLABLE SIOS A KIYEOKSIOS +0xBBEA 0xC0B0 #HANGUL SYLLABLE SIOS A NIEUN +0xBBEB 0xC0B3 #HANGUL SYLLABLE SIOS A TIKEUT +0xBBEC 0xC0B4 #HANGUL SYLLABLE SIOS A RIEUL +0xBBED 0xC0B5 #HANGUL SYLLABLE SIOS A RIEULKIYEOK +0xBBEE 0xC0B6 #HANGUL SYLLABLE SIOS A RIEULMIEUM +0xBBEF 0xC0BC #HANGUL SYLLABLE SIOS A MIEUM +0xBBF0 0xC0BD #HANGUL SYLLABLE SIOS A PIEUP +0xBBF1 0xC0BF #HANGUL SYLLABLE SIOS A SIOS +0xBBF2 0xC0C0 #HANGUL SYLLABLE SIOS A SSANGSIOS +0xBBF3 0xC0C1 #HANGUL SYLLABLE SIOS A IEUNG +0xBBF4 0xC0C5 #HANGUL SYLLABLE SIOS A THIEUTH +0xBBF5 0xC0C8 #HANGUL SYLLABLE SIOS AE +0xBBF6 0xC0C9 #HANGUL SYLLABLE SIOS AE KIYEOK +0xBBF7 0xC0CC #HANGUL SYLLABLE SIOS AE NIEUN +0xBBF8 0xC0D0 #HANGUL SYLLABLE SIOS AE RIEUL +0xBBF9 0xC0D8 #HANGUL SYLLABLE SIOS AE MIEUM +0xBBFA 0xC0D9 #HANGUL SYLLABLE SIOS AE PIEUP +0xBBFB 0xC0DB #HANGUL SYLLABLE SIOS AE SIOS +0xBBFC 0xC0DC #HANGUL SYLLABLE SIOS AE SSANGSIOS +0xBBFD 0xC0DD #HANGUL SYLLABLE SIOS AE IEUNG +0xBBFE 0xC0E4 #HANGUL SYLLABLE SIOS YA +0xBC41 0xD36A #HANGUL SYLLABLE PHIEUPH YAE RIEULMIEUM +0xBC42 0xD36B #HANGUL SYLLABLE PHIEUPH YAE RIEULPIEUP +0xBC43 0xD36C #HANGUL SYLLABLE PHIEUPH YAE RIEULSIOS +0xBC44 0xD36D #HANGUL SYLLABLE PHIEUPH YAE RIEULTHIEUTH +0xBC45 0xD36E #HANGUL SYLLABLE PHIEUPH YAE RIEULPHIEUPH +0xBC46 0xD36F #HANGUL SYLLABLE PHIEUPH YAE RIEULHIEUH +0xBC47 0xD370 #HANGUL SYLLABLE PHIEUPH YAE MIEUM +0xBC48 0xD371 #HANGUL SYLLABLE PHIEUPH YAE PIEUP +0xBC49 0xD372 #HANGUL SYLLABLE PHIEUPH YAE PIEUPSIOS +0xBC4A 0xD373 #HANGUL SYLLABLE PHIEUPH YAE SIOS +0xBC4B 0xD374 #HANGUL SYLLABLE PHIEUPH YAE SSANGSIOS +0xBC4C 0xD375 #HANGUL SYLLABLE PHIEUPH YAE IEUNG +0xBC4D 0xD376 #HANGUL SYLLABLE PHIEUPH YAE CIEUC +0xBC4E 0xD377 #HANGUL SYLLABLE PHIEUPH YAE CHIEUCH +0xBC4F 0xD378 #HANGUL SYLLABLE PHIEUPH YAE KHIEUKH +0xBC50 0xD379 #HANGUL SYLLABLE PHIEUPH YAE THIEUTH +0xBC51 0xD37A #HANGUL SYLLABLE PHIEUPH YAE PHIEUPH +0xBC52 0xD37B #HANGUL SYLLABLE PHIEUPH YAE HIEUH +0xBC53 0xD37E #HANGUL SYLLABLE PHIEUPH EO SSANGKIYEOK +0xBC54 0xD37F #HANGUL SYLLABLE PHIEUPH EO KIYEOKSIOS +0xBC55 0xD381 #HANGUL SYLLABLE PHIEUPH EO NIEUNCIEUC +0xBC56 0xD382 #HANGUL SYLLABLE PHIEUPH EO NIEUNHIEUH +0xBC57 0xD383 #HANGUL SYLLABLE PHIEUPH EO TIKEUT +0xBC58 0xD385 #HANGUL SYLLABLE PHIEUPH EO RIEULKIYEOK +0xBC59 0xD386 #HANGUL SYLLABLE PHIEUPH EO RIEULMIEUM +0xBC5A 0xD387 #HANGUL SYLLABLE PHIEUPH EO RIEULPIEUP +0xBC61 0xD388 #HANGUL SYLLABLE PHIEUPH EO RIEULSIOS +0xBC62 0xD389 #HANGUL SYLLABLE PHIEUPH EO RIEULTHIEUTH +0xBC63 0xD38A #HANGUL SYLLABLE PHIEUPH EO RIEULPHIEUPH +0xBC64 0xD38B #HANGUL SYLLABLE PHIEUPH EO RIEULHIEUH +0xBC65 0xD38E #HANGUL SYLLABLE PHIEUPH EO PIEUPSIOS +0xBC66 0xD392 #HANGUL SYLLABLE PHIEUPH EO CIEUC +0xBC67 0xD393 #HANGUL SYLLABLE PHIEUPH EO CHIEUCH +0xBC68 0xD394 #HANGUL SYLLABLE PHIEUPH EO KHIEUKH +0xBC69 0xD395 #HANGUL SYLLABLE PHIEUPH EO THIEUTH +0xBC6A 0xD396 #HANGUL SYLLABLE PHIEUPH EO PHIEUPH +0xBC6B 0xD397 #HANGUL SYLLABLE PHIEUPH EO HIEUH +0xBC6C 0xD39A #HANGUL SYLLABLE PHIEUPH E SSANGKIYEOK +0xBC6D 0xD39B #HANGUL SYLLABLE PHIEUPH E KIYEOKSIOS +0xBC6E 0xD39D #HANGUL SYLLABLE PHIEUPH E NIEUNCIEUC +0xBC6F 0xD39E #HANGUL SYLLABLE PHIEUPH E NIEUNHIEUH +0xBC70 0xD39F #HANGUL SYLLABLE PHIEUPH E TIKEUT +0xBC71 0xD3A1 #HANGUL SYLLABLE PHIEUPH E RIEULKIYEOK +0xBC72 0xD3A2 #HANGUL SYLLABLE PHIEUPH E RIEULMIEUM +0xBC73 0xD3A3 #HANGUL SYLLABLE PHIEUPH E RIEULPIEUP +0xBC74 0xD3A4 #HANGUL SYLLABLE PHIEUPH E RIEULSIOS +0xBC75 0xD3A5 #HANGUL SYLLABLE PHIEUPH E RIEULTHIEUTH +0xBC76 0xD3A6 #HANGUL SYLLABLE PHIEUPH E RIEULPHIEUPH +0xBC77 0xD3A7 #HANGUL SYLLABLE PHIEUPH E RIEULHIEUH +0xBC78 0xD3AA #HANGUL SYLLABLE PHIEUPH E PIEUPSIOS +0xBC79 0xD3AC #HANGUL SYLLABLE PHIEUPH E SSANGSIOS +0xBC7A 0xD3AE #HANGUL SYLLABLE PHIEUPH E CIEUC +0xBC81 0xD3AF #HANGUL SYLLABLE PHIEUPH E CHIEUCH +0xBC82 0xD3B0 #HANGUL SYLLABLE PHIEUPH E KHIEUKH +0xBC83 0xD3B1 #HANGUL SYLLABLE PHIEUPH E THIEUTH +0xBC84 0xD3B2 #HANGUL SYLLABLE PHIEUPH E PHIEUPH +0xBC85 0xD3B3 #HANGUL SYLLABLE PHIEUPH E HIEUH +0xBC86 0xD3B5 #HANGUL SYLLABLE PHIEUPH YEO KIYEOK +0xBC87 0xD3B6 #HANGUL SYLLABLE PHIEUPH YEO SSANGKIYEOK +0xBC88 0xD3B7 #HANGUL SYLLABLE PHIEUPH YEO KIYEOKSIOS +0xBC89 0xD3B9 #HANGUL SYLLABLE PHIEUPH YEO NIEUNCIEUC +0xBC8A 0xD3BA #HANGUL SYLLABLE PHIEUPH YEO NIEUNHIEUH +0xBC8B 0xD3BB #HANGUL SYLLABLE PHIEUPH YEO TIKEUT +0xBC8C 0xD3BD #HANGUL SYLLABLE PHIEUPH YEO RIEULKIYEOK +0xBC8D 0xD3BE #HANGUL SYLLABLE PHIEUPH YEO RIEULMIEUM +0xBC8E 0xD3BF #HANGUL SYLLABLE PHIEUPH YEO RIEULPIEUP +0xBC8F 0xD3C0 #HANGUL SYLLABLE PHIEUPH YEO RIEULSIOS +0xBC90 0xD3C1 #HANGUL SYLLABLE PHIEUPH YEO RIEULTHIEUTH +0xBC91 0xD3C2 #HANGUL SYLLABLE PHIEUPH YEO RIEULPHIEUPH +0xBC92 0xD3C3 #HANGUL SYLLABLE PHIEUPH YEO RIEULHIEUH +0xBC93 0xD3C6 #HANGUL SYLLABLE PHIEUPH YEO PIEUPSIOS +0xBC94 0xD3C7 #HANGUL SYLLABLE PHIEUPH YEO SIOS +0xBC95 0xD3CA #HANGUL SYLLABLE PHIEUPH YEO CIEUC +0xBC96 0xD3CB #HANGUL SYLLABLE PHIEUPH YEO CHIEUCH +0xBC97 0xD3CC #HANGUL SYLLABLE PHIEUPH YEO KHIEUKH +0xBC98 0xD3CD #HANGUL SYLLABLE PHIEUPH YEO THIEUTH +0xBC99 0xD3CE #HANGUL SYLLABLE PHIEUPH YEO PHIEUPH +0xBC9A 0xD3CF #HANGUL SYLLABLE PHIEUPH YEO HIEUH +0xBC9B 0xD3D1 #HANGUL SYLLABLE PHIEUPH YE KIYEOK +0xBC9C 0xD3D2 #HANGUL SYLLABLE PHIEUPH YE SSANGKIYEOK +0xBC9D 0xD3D3 #HANGUL SYLLABLE PHIEUPH YE KIYEOKSIOS +0xBC9E 0xD3D4 #HANGUL SYLLABLE PHIEUPH YE NIEUN +0xBC9F 0xD3D5 #HANGUL SYLLABLE PHIEUPH YE NIEUNCIEUC +0xBCA0 0xD3D6 #HANGUL SYLLABLE PHIEUPH YE NIEUNHIEUH +0xBCA1 0xC0E5 #HANGUL SYLLABLE SIOS YA KIYEOK +0xBCA2 0xC0E8 #HANGUL SYLLABLE SIOS YA NIEUN +0xBCA3 0xC0EC #HANGUL SYLLABLE SIOS YA RIEUL +0xBCA4 0xC0F4 #HANGUL SYLLABLE SIOS YA MIEUM +0xBCA5 0xC0F5 #HANGUL SYLLABLE SIOS YA PIEUP +0xBCA6 0xC0F7 #HANGUL SYLLABLE SIOS YA SIOS +0xBCA7 0xC0F9 #HANGUL SYLLABLE SIOS YA IEUNG +0xBCA8 0xC100 #HANGUL SYLLABLE SIOS YAE +0xBCA9 0xC104 #HANGUL SYLLABLE SIOS YAE NIEUN +0xBCAA 0xC108 #HANGUL SYLLABLE SIOS YAE RIEUL +0xBCAB 0xC110 #HANGUL SYLLABLE SIOS YAE MIEUM +0xBCAC 0xC115 #HANGUL SYLLABLE SIOS YAE IEUNG +0xBCAD 0xC11C #HANGUL SYLLABLE SIOS EO +0xBCAE 0xC11D #HANGUL SYLLABLE SIOS EO KIYEOK +0xBCAF 0xC11E #HANGUL SYLLABLE SIOS EO SSANGKIYEOK +0xBCB0 0xC11F #HANGUL SYLLABLE SIOS EO KIYEOKSIOS +0xBCB1 0xC120 #HANGUL SYLLABLE SIOS EO NIEUN +0xBCB2 0xC123 #HANGUL SYLLABLE SIOS EO TIKEUT +0xBCB3 0xC124 #HANGUL SYLLABLE SIOS EO RIEUL +0xBCB4 0xC126 #HANGUL SYLLABLE SIOS EO RIEULMIEUM +0xBCB5 0xC127 #HANGUL SYLLABLE SIOS EO RIEULPIEUP +0xBCB6 0xC12C #HANGUL SYLLABLE SIOS EO MIEUM +0xBCB7 0xC12D #HANGUL SYLLABLE SIOS EO PIEUP +0xBCB8 0xC12F #HANGUL SYLLABLE SIOS EO SIOS +0xBCB9 0xC130 #HANGUL SYLLABLE SIOS EO SSANGSIOS +0xBCBA 0xC131 #HANGUL SYLLABLE SIOS EO IEUNG +0xBCBB 0xC136 #HANGUL SYLLABLE SIOS EO PHIEUPH +0xBCBC 0xC138 #HANGUL SYLLABLE SIOS E +0xBCBD 0xC139 #HANGUL SYLLABLE SIOS E KIYEOK +0xBCBE 0xC13C #HANGUL SYLLABLE SIOS E NIEUN +0xBCBF 0xC140 #HANGUL SYLLABLE SIOS E RIEUL +0xBCC0 0xC148 #HANGUL SYLLABLE SIOS E MIEUM +0xBCC1 0xC149 #HANGUL SYLLABLE SIOS E PIEUP +0xBCC2 0xC14B #HANGUL SYLLABLE SIOS E SIOS +0xBCC3 0xC14C #HANGUL SYLLABLE SIOS E SSANGSIOS +0xBCC4 0xC14D #HANGUL SYLLABLE SIOS E IEUNG +0xBCC5 0xC154 #HANGUL SYLLABLE SIOS YEO +0xBCC6 0xC155 #HANGUL SYLLABLE SIOS YEO KIYEOK +0xBCC7 0xC158 #HANGUL SYLLABLE SIOS YEO NIEUN +0xBCC8 0xC15C #HANGUL SYLLABLE SIOS YEO RIEUL +0xBCC9 0xC164 #HANGUL SYLLABLE SIOS YEO MIEUM +0xBCCA 0xC165 #HANGUL SYLLABLE SIOS YEO PIEUP +0xBCCB 0xC167 #HANGUL SYLLABLE SIOS YEO SIOS +0xBCCC 0xC168 #HANGUL SYLLABLE SIOS YEO SSANGSIOS +0xBCCD 0xC169 #HANGUL SYLLABLE SIOS YEO IEUNG +0xBCCE 0xC170 #HANGUL SYLLABLE SIOS YE +0xBCCF 0xC174 #HANGUL SYLLABLE SIOS YE NIEUN +0xBCD0 0xC178 #HANGUL SYLLABLE SIOS YE RIEUL +0xBCD1 0xC185 #HANGUL SYLLABLE SIOS YE IEUNG +0xBCD2 0xC18C #HANGUL SYLLABLE SIOS O +0xBCD3 0xC18D #HANGUL SYLLABLE SIOS O KIYEOK +0xBCD4 0xC18E #HANGUL SYLLABLE SIOS O SSANGKIYEOK +0xBCD5 0xC190 #HANGUL SYLLABLE SIOS O NIEUN +0xBCD6 0xC194 #HANGUL SYLLABLE SIOS O RIEUL +0xBCD7 0xC196 #HANGUL SYLLABLE SIOS O RIEULMIEUM +0xBCD8 0xC19C #HANGUL SYLLABLE SIOS O MIEUM +0xBCD9 0xC19D #HANGUL SYLLABLE SIOS O PIEUP +0xBCDA 0xC19F #HANGUL SYLLABLE SIOS O SIOS +0xBCDB 0xC1A1 #HANGUL SYLLABLE SIOS O IEUNG +0xBCDC 0xC1A5 #HANGUL SYLLABLE SIOS O THIEUTH +0xBCDD 0xC1A8 #HANGUL SYLLABLE SIOS WA +0xBCDE 0xC1A9 #HANGUL SYLLABLE SIOS WA KIYEOK +0xBCDF 0xC1AC #HANGUL SYLLABLE SIOS WA NIEUN +0xBCE0 0xC1B0 #HANGUL SYLLABLE SIOS WA RIEUL +0xBCE1 0xC1BD #HANGUL SYLLABLE SIOS WA IEUNG +0xBCE2 0xC1C4 #HANGUL SYLLABLE SIOS WAE +0xBCE3 0xC1C8 #HANGUL SYLLABLE SIOS WAE NIEUN +0xBCE4 0xC1CC #HANGUL SYLLABLE SIOS WAE RIEUL +0xBCE5 0xC1D4 #HANGUL SYLLABLE SIOS WAE MIEUM +0xBCE6 0xC1D7 #HANGUL SYLLABLE SIOS WAE SIOS +0xBCE7 0xC1D8 #HANGUL SYLLABLE SIOS WAE SSANGSIOS +0xBCE8 0xC1E0 #HANGUL SYLLABLE SIOS OE +0xBCE9 0xC1E4 #HANGUL SYLLABLE SIOS OE NIEUN +0xBCEA 0xC1E8 #HANGUL SYLLABLE SIOS OE RIEUL +0xBCEB 0xC1F0 #HANGUL SYLLABLE SIOS OE MIEUM +0xBCEC 0xC1F1 #HANGUL SYLLABLE SIOS OE PIEUP +0xBCED 0xC1F3 #HANGUL SYLLABLE SIOS OE SIOS +0xBCEE 0xC1FC #HANGUL SYLLABLE SIOS YO +0xBCEF 0xC1FD #HANGUL SYLLABLE SIOS YO KIYEOK +0xBCF0 0xC200 #HANGUL SYLLABLE SIOS YO NIEUN +0xBCF1 0xC204 #HANGUL SYLLABLE SIOS YO RIEUL +0xBCF2 0xC20C #HANGUL SYLLABLE SIOS YO MIEUM +0xBCF3 0xC20D #HANGUL SYLLABLE SIOS YO PIEUP +0xBCF4 0xC20F #HANGUL SYLLABLE SIOS YO SIOS +0xBCF5 0xC211 #HANGUL SYLLABLE SIOS YO IEUNG +0xBCF6 0xC218 #HANGUL SYLLABLE SIOS U +0xBCF7 0xC219 #HANGUL SYLLABLE SIOS U KIYEOK +0xBCF8 0xC21C #HANGUL SYLLABLE SIOS U NIEUN +0xBCF9 0xC21F #HANGUL SYLLABLE SIOS U TIKEUT +0xBCFA 0xC220 #HANGUL SYLLABLE SIOS U RIEUL +0xBCFB 0xC228 #HANGUL SYLLABLE SIOS U MIEUM +0xBCFC 0xC229 #HANGUL SYLLABLE SIOS U PIEUP +0xBCFD 0xC22B #HANGUL SYLLABLE SIOS U SIOS +0xBCFE 0xC22D #HANGUL SYLLABLE SIOS U IEUNG +0xBD41 0xD3D7 #HANGUL SYLLABLE PHIEUPH YE TIKEUT +0xBD42 0xD3D9 #HANGUL SYLLABLE PHIEUPH YE RIEULKIYEOK +0xBD43 0xD3DA #HANGUL SYLLABLE PHIEUPH YE RIEULMIEUM +0xBD44 0xD3DB #HANGUL SYLLABLE PHIEUPH YE RIEULPIEUP +0xBD45 0xD3DC #HANGUL SYLLABLE PHIEUPH YE RIEULSIOS +0xBD46 0xD3DD #HANGUL SYLLABLE PHIEUPH YE RIEULTHIEUTH +0xBD47 0xD3DE #HANGUL SYLLABLE PHIEUPH YE RIEULPHIEUPH +0xBD48 0xD3DF #HANGUL SYLLABLE PHIEUPH YE RIEULHIEUH +0xBD49 0xD3E0 #HANGUL SYLLABLE PHIEUPH YE MIEUM +0xBD4A 0xD3E2 #HANGUL SYLLABLE PHIEUPH YE PIEUPSIOS +0xBD4B 0xD3E4 #HANGUL SYLLABLE PHIEUPH YE SSANGSIOS +0xBD4C 0xD3E5 #HANGUL SYLLABLE PHIEUPH YE IEUNG +0xBD4D 0xD3E6 #HANGUL SYLLABLE PHIEUPH YE CIEUC +0xBD4E 0xD3E7 #HANGUL SYLLABLE PHIEUPH YE CHIEUCH +0xBD4F 0xD3E8 #HANGUL SYLLABLE PHIEUPH YE KHIEUKH +0xBD50 0xD3E9 #HANGUL SYLLABLE PHIEUPH YE THIEUTH +0xBD51 0xD3EA #HANGUL SYLLABLE PHIEUPH YE PHIEUPH +0xBD52 0xD3EB #HANGUL SYLLABLE PHIEUPH YE HIEUH +0xBD53 0xD3EE #HANGUL SYLLABLE PHIEUPH O SSANGKIYEOK +0xBD54 0xD3EF #HANGUL SYLLABLE PHIEUPH O KIYEOKSIOS +0xBD55 0xD3F1 #HANGUL SYLLABLE PHIEUPH O NIEUNCIEUC +0xBD56 0xD3F2 #HANGUL SYLLABLE PHIEUPH O NIEUNHIEUH +0xBD57 0xD3F3 #HANGUL SYLLABLE PHIEUPH O TIKEUT +0xBD58 0xD3F5 #HANGUL SYLLABLE PHIEUPH O RIEULKIYEOK +0xBD59 0xD3F6 #HANGUL SYLLABLE PHIEUPH O RIEULMIEUM +0xBD5A 0xD3F7 #HANGUL SYLLABLE PHIEUPH O RIEULPIEUP +0xBD61 0xD3F8 #HANGUL SYLLABLE PHIEUPH O RIEULSIOS +0xBD62 0xD3F9 #HANGUL SYLLABLE PHIEUPH O RIEULTHIEUTH +0xBD63 0xD3FA #HANGUL SYLLABLE PHIEUPH O RIEULPHIEUPH +0xBD64 0xD3FB #HANGUL SYLLABLE PHIEUPH O RIEULHIEUH +0xBD65 0xD3FE #HANGUL SYLLABLE PHIEUPH O PIEUPSIOS +0xBD66 0xD400 #HANGUL SYLLABLE PHIEUPH O SSANGSIOS +0xBD67 0xD402 #HANGUL SYLLABLE PHIEUPH O CIEUC +0xBD68 0xD403 #HANGUL SYLLABLE PHIEUPH O CHIEUCH +0xBD69 0xD404 #HANGUL SYLLABLE PHIEUPH O KHIEUKH +0xBD6A 0xD405 #HANGUL SYLLABLE PHIEUPH O THIEUTH +0xBD6B 0xD406 #HANGUL SYLLABLE PHIEUPH O PHIEUPH +0xBD6C 0xD407 #HANGUL SYLLABLE PHIEUPH O HIEUH +0xBD6D 0xD409 #HANGUL SYLLABLE PHIEUPH WA KIYEOK +0xBD6E 0xD40A #HANGUL SYLLABLE PHIEUPH WA SSANGKIYEOK +0xBD6F 0xD40B #HANGUL SYLLABLE PHIEUPH WA KIYEOKSIOS +0xBD70 0xD40C #HANGUL SYLLABLE PHIEUPH WA NIEUN +0xBD71 0xD40D #HANGUL SYLLABLE PHIEUPH WA NIEUNCIEUC +0xBD72 0xD40E #HANGUL SYLLABLE PHIEUPH WA NIEUNHIEUH +0xBD73 0xD40F #HANGUL SYLLABLE PHIEUPH WA TIKEUT +0xBD74 0xD410 #HANGUL SYLLABLE PHIEUPH WA RIEUL +0xBD75 0xD411 #HANGUL SYLLABLE PHIEUPH WA RIEULKIYEOK +0xBD76 0xD412 #HANGUL SYLLABLE PHIEUPH WA RIEULMIEUM +0xBD77 0xD413 #HANGUL SYLLABLE PHIEUPH WA RIEULPIEUP +0xBD78 0xD414 #HANGUL SYLLABLE PHIEUPH WA RIEULSIOS +0xBD79 0xD415 #HANGUL SYLLABLE PHIEUPH WA RIEULTHIEUTH +0xBD7A 0xD416 #HANGUL SYLLABLE PHIEUPH WA RIEULPHIEUPH +0xBD81 0xD417 #HANGUL SYLLABLE PHIEUPH WA RIEULHIEUH +0xBD82 0xD418 #HANGUL SYLLABLE PHIEUPH WA MIEUM +0xBD83 0xD419 #HANGUL SYLLABLE PHIEUPH WA PIEUP +0xBD84 0xD41A #HANGUL SYLLABLE PHIEUPH WA PIEUPSIOS +0xBD85 0xD41B #HANGUL SYLLABLE PHIEUPH WA SIOS +0xBD86 0xD41C #HANGUL SYLLABLE PHIEUPH WA SSANGSIOS +0xBD87 0xD41E #HANGUL SYLLABLE PHIEUPH WA CIEUC +0xBD88 0xD41F #HANGUL SYLLABLE PHIEUPH WA CHIEUCH +0xBD89 0xD420 #HANGUL SYLLABLE PHIEUPH WA KHIEUKH +0xBD8A 0xD421 #HANGUL SYLLABLE PHIEUPH WA THIEUTH +0xBD8B 0xD422 #HANGUL SYLLABLE PHIEUPH WA PHIEUPH +0xBD8C 0xD423 #HANGUL SYLLABLE PHIEUPH WA HIEUH +0xBD8D 0xD424 #HANGUL SYLLABLE PHIEUPH WAE +0xBD8E 0xD425 #HANGUL SYLLABLE PHIEUPH WAE KIYEOK +0xBD8F 0xD426 #HANGUL SYLLABLE PHIEUPH WAE SSANGKIYEOK +0xBD90 0xD427 #HANGUL SYLLABLE PHIEUPH WAE KIYEOKSIOS +0xBD91 0xD428 #HANGUL SYLLABLE PHIEUPH WAE NIEUN +0xBD92 0xD429 #HANGUL SYLLABLE PHIEUPH WAE NIEUNCIEUC +0xBD93 0xD42A #HANGUL SYLLABLE PHIEUPH WAE NIEUNHIEUH +0xBD94 0xD42B #HANGUL SYLLABLE PHIEUPH WAE TIKEUT +0xBD95 0xD42C #HANGUL SYLLABLE PHIEUPH WAE RIEUL +0xBD96 0xD42D #HANGUL SYLLABLE PHIEUPH WAE RIEULKIYEOK +0xBD97 0xD42E #HANGUL SYLLABLE PHIEUPH WAE RIEULMIEUM +0xBD98 0xD42F #HANGUL SYLLABLE PHIEUPH WAE RIEULPIEUP +0xBD99 0xD430 #HANGUL SYLLABLE PHIEUPH WAE RIEULSIOS +0xBD9A 0xD431 #HANGUL SYLLABLE PHIEUPH WAE RIEULTHIEUTH +0xBD9B 0xD432 #HANGUL SYLLABLE PHIEUPH WAE RIEULPHIEUPH +0xBD9C 0xD433 #HANGUL SYLLABLE PHIEUPH WAE RIEULHIEUH +0xBD9D 0xD434 #HANGUL SYLLABLE PHIEUPH WAE MIEUM +0xBD9E 0xD435 #HANGUL SYLLABLE PHIEUPH WAE PIEUP +0xBD9F 0xD436 #HANGUL SYLLABLE PHIEUPH WAE PIEUPSIOS +0xBDA0 0xD437 #HANGUL SYLLABLE PHIEUPH WAE SIOS +0xBDA1 0xC22F #HANGUL SYLLABLE SIOS U CHIEUCH +0xBDA2 0xC231 #HANGUL SYLLABLE SIOS U THIEUTH +0xBDA3 0xC232 #HANGUL SYLLABLE SIOS U PHIEUPH +0xBDA4 0xC234 #HANGUL SYLLABLE SIOS WEO +0xBDA5 0xC248 #HANGUL SYLLABLE SIOS WEO SSANGSIOS +0xBDA6 0xC250 #HANGUL SYLLABLE SIOS WE +0xBDA7 0xC251 #HANGUL SYLLABLE SIOS WE KIYEOK +0xBDA8 0xC254 #HANGUL SYLLABLE SIOS WE NIEUN +0xBDA9 0xC258 #HANGUL SYLLABLE SIOS WE RIEUL +0xBDAA 0xC260 #HANGUL SYLLABLE SIOS WE MIEUM +0xBDAB 0xC265 #HANGUL SYLLABLE SIOS WE IEUNG +0xBDAC 0xC26C #HANGUL SYLLABLE SIOS WI +0xBDAD 0xC26D #HANGUL SYLLABLE SIOS WI KIYEOK +0xBDAE 0xC270 #HANGUL SYLLABLE SIOS WI NIEUN +0xBDAF 0xC274 #HANGUL SYLLABLE SIOS WI RIEUL +0xBDB0 0xC27C #HANGUL SYLLABLE SIOS WI MIEUM +0xBDB1 0xC27D #HANGUL SYLLABLE SIOS WI PIEUP +0xBDB2 0xC27F #HANGUL SYLLABLE SIOS WI SIOS +0xBDB3 0xC281 #HANGUL SYLLABLE SIOS WI IEUNG +0xBDB4 0xC288 #HANGUL SYLLABLE SIOS YU +0xBDB5 0xC289 #HANGUL SYLLABLE SIOS YU KIYEOK +0xBDB6 0xC290 #HANGUL SYLLABLE SIOS YU RIEUL +0xBDB7 0xC298 #HANGUL SYLLABLE SIOS YU MIEUM +0xBDB8 0xC29B #HANGUL SYLLABLE SIOS YU SIOS +0xBDB9 0xC29D #HANGUL SYLLABLE SIOS YU IEUNG +0xBDBA 0xC2A4 #HANGUL SYLLABLE SIOS EU +0xBDBB 0xC2A5 #HANGUL SYLLABLE SIOS EU KIYEOK +0xBDBC 0xC2A8 #HANGUL SYLLABLE SIOS EU NIEUN +0xBDBD 0xC2AC #HANGUL SYLLABLE SIOS EU RIEUL +0xBDBE 0xC2AD #HANGUL SYLLABLE SIOS EU RIEULKIYEOK +0xBDBF 0xC2B4 #HANGUL SYLLABLE SIOS EU MIEUM +0xBDC0 0xC2B5 #HANGUL SYLLABLE SIOS EU PIEUP +0xBDC1 0xC2B7 #HANGUL SYLLABLE SIOS EU SIOS +0xBDC2 0xC2B9 #HANGUL SYLLABLE SIOS EU IEUNG +0xBDC3 0xC2DC #HANGUL SYLLABLE SIOS I +0xBDC4 0xC2DD #HANGUL SYLLABLE SIOS I KIYEOK +0xBDC5 0xC2E0 #HANGUL SYLLABLE SIOS I NIEUN +0xBDC6 0xC2E3 #HANGUL SYLLABLE SIOS I TIKEUT +0xBDC7 0xC2E4 #HANGUL SYLLABLE SIOS I RIEUL +0xBDC8 0xC2EB #HANGUL SYLLABLE SIOS I RIEULHIEUH +0xBDC9 0xC2EC #HANGUL SYLLABLE SIOS I MIEUM +0xBDCA 0xC2ED #HANGUL SYLLABLE SIOS I PIEUP +0xBDCB 0xC2EF #HANGUL SYLLABLE SIOS I SIOS +0xBDCC 0xC2F1 #HANGUL SYLLABLE SIOS I IEUNG +0xBDCD 0xC2F6 #HANGUL SYLLABLE SIOS I PHIEUPH +0xBDCE 0xC2F8 #HANGUL SYLLABLE SSANGSIOS A +0xBDCF 0xC2F9 #HANGUL SYLLABLE SSANGSIOS A KIYEOK +0xBDD0 0xC2FB #HANGUL SYLLABLE SSANGSIOS A KIYEOKSIOS +0xBDD1 0xC2FC #HANGUL SYLLABLE SSANGSIOS A NIEUN +0xBDD2 0xC300 #HANGUL SYLLABLE SSANGSIOS A RIEUL +0xBDD3 0xC308 #HANGUL SYLLABLE SSANGSIOS A MIEUM +0xBDD4 0xC309 #HANGUL SYLLABLE SSANGSIOS A PIEUP +0xBDD5 0xC30C #HANGUL SYLLABLE SSANGSIOS A SSANGSIOS +0xBDD6 0xC30D #HANGUL SYLLABLE SSANGSIOS A IEUNG +0xBDD7 0xC313 #HANGUL SYLLABLE SSANGSIOS A HIEUH +0xBDD8 0xC314 #HANGUL SYLLABLE SSANGSIOS AE +0xBDD9 0xC315 #HANGUL SYLLABLE SSANGSIOS AE KIYEOK +0xBDDA 0xC318 #HANGUL SYLLABLE SSANGSIOS AE NIEUN +0xBDDB 0xC31C #HANGUL SYLLABLE SSANGSIOS AE RIEUL +0xBDDC 0xC324 #HANGUL SYLLABLE SSANGSIOS AE MIEUM +0xBDDD 0xC325 #HANGUL SYLLABLE SSANGSIOS AE PIEUP +0xBDDE 0xC328 #HANGUL SYLLABLE SSANGSIOS AE SSANGSIOS +0xBDDF 0xC329 #HANGUL SYLLABLE SSANGSIOS AE IEUNG +0xBDE0 0xC345 #HANGUL SYLLABLE SSANGSIOS YA IEUNG +0xBDE1 0xC368 #HANGUL SYLLABLE SSANGSIOS EO +0xBDE2 0xC369 #HANGUL SYLLABLE SSANGSIOS EO KIYEOK +0xBDE3 0xC36C #HANGUL SYLLABLE SSANGSIOS EO NIEUN +0xBDE4 0xC370 #HANGUL SYLLABLE SSANGSIOS EO RIEUL +0xBDE5 0xC372 #HANGUL SYLLABLE SSANGSIOS EO RIEULMIEUM +0xBDE6 0xC378 #HANGUL SYLLABLE SSANGSIOS EO MIEUM +0xBDE7 0xC379 #HANGUL SYLLABLE SSANGSIOS EO PIEUP +0xBDE8 0xC37C #HANGUL SYLLABLE SSANGSIOS EO SSANGSIOS +0xBDE9 0xC37D #HANGUL SYLLABLE SSANGSIOS EO IEUNG +0xBDEA 0xC384 #HANGUL SYLLABLE SSANGSIOS E +0xBDEB 0xC388 #HANGUL SYLLABLE SSANGSIOS E NIEUN +0xBDEC 0xC38C #HANGUL SYLLABLE SSANGSIOS E RIEUL +0xBDED 0xC3C0 #HANGUL SYLLABLE SSANGSIOS YE NIEUN +0xBDEE 0xC3D8 #HANGUL SYLLABLE SSANGSIOS O +0xBDEF 0xC3D9 #HANGUL SYLLABLE SSANGSIOS O KIYEOK +0xBDF0 0xC3DC #HANGUL SYLLABLE SSANGSIOS O NIEUN +0xBDF1 0xC3DF #HANGUL SYLLABLE SSANGSIOS O TIKEUT +0xBDF2 0xC3E0 #HANGUL SYLLABLE SSANGSIOS O RIEUL +0xBDF3 0xC3E2 #HANGUL SYLLABLE SSANGSIOS O RIEULMIEUM +0xBDF4 0xC3E8 #HANGUL SYLLABLE SSANGSIOS O MIEUM +0xBDF5 0xC3E9 #HANGUL SYLLABLE SSANGSIOS O PIEUP +0xBDF6 0xC3ED #HANGUL SYLLABLE SSANGSIOS O IEUNG +0xBDF7 0xC3F4 #HANGUL SYLLABLE SSANGSIOS WA +0xBDF8 0xC3F5 #HANGUL SYLLABLE SSANGSIOS WA KIYEOK +0xBDF9 0xC3F8 #HANGUL SYLLABLE SSANGSIOS WA NIEUN +0xBDFA 0xC408 #HANGUL SYLLABLE SSANGSIOS WA SSANGSIOS +0xBDFB 0xC410 #HANGUL SYLLABLE SSANGSIOS WAE +0xBDFC 0xC424 #HANGUL SYLLABLE SSANGSIOS WAE SSANGSIOS +0xBDFD 0xC42C #HANGUL SYLLABLE SSANGSIOS OE +0xBDFE 0xC430 #HANGUL SYLLABLE SSANGSIOS OE NIEUN +0xBE41 0xD438 #HANGUL SYLLABLE PHIEUPH WAE SSANGSIOS +0xBE42 0xD439 #HANGUL SYLLABLE PHIEUPH WAE IEUNG +0xBE43 0xD43A #HANGUL SYLLABLE PHIEUPH WAE CIEUC +0xBE44 0xD43B #HANGUL SYLLABLE PHIEUPH WAE CHIEUCH +0xBE45 0xD43C #HANGUL SYLLABLE PHIEUPH WAE KHIEUKH +0xBE46 0xD43D #HANGUL SYLLABLE PHIEUPH WAE THIEUTH +0xBE47 0xD43E #HANGUL SYLLABLE PHIEUPH WAE PHIEUPH +0xBE48 0xD43F #HANGUL SYLLABLE PHIEUPH WAE HIEUH +0xBE49 0xD441 #HANGUL SYLLABLE PHIEUPH OE KIYEOK +0xBE4A 0xD442 #HANGUL SYLLABLE PHIEUPH OE SSANGKIYEOK +0xBE4B 0xD443 #HANGUL SYLLABLE PHIEUPH OE KIYEOKSIOS +0xBE4C 0xD445 #HANGUL SYLLABLE PHIEUPH OE NIEUNCIEUC +0xBE4D 0xD446 #HANGUL SYLLABLE PHIEUPH OE NIEUNHIEUH +0xBE4E 0xD447 #HANGUL SYLLABLE PHIEUPH OE TIKEUT +0xBE4F 0xD448 #HANGUL SYLLABLE PHIEUPH OE RIEUL +0xBE50 0xD449 #HANGUL SYLLABLE PHIEUPH OE RIEULKIYEOK +0xBE51 0xD44A #HANGUL SYLLABLE PHIEUPH OE RIEULMIEUM +0xBE52 0xD44B #HANGUL SYLLABLE PHIEUPH OE RIEULPIEUP +0xBE53 0xD44C #HANGUL SYLLABLE PHIEUPH OE RIEULSIOS +0xBE54 0xD44D #HANGUL SYLLABLE PHIEUPH OE RIEULTHIEUTH +0xBE55 0xD44E #HANGUL SYLLABLE PHIEUPH OE RIEULPHIEUPH +0xBE56 0xD44F #HANGUL SYLLABLE PHIEUPH OE RIEULHIEUH +0xBE57 0xD450 #HANGUL SYLLABLE PHIEUPH OE MIEUM +0xBE58 0xD451 #HANGUL SYLLABLE PHIEUPH OE PIEUP +0xBE59 0xD452 #HANGUL SYLLABLE PHIEUPH OE PIEUPSIOS +0xBE5A 0xD453 #HANGUL SYLLABLE PHIEUPH OE SIOS +0xBE61 0xD454 #HANGUL SYLLABLE PHIEUPH OE SSANGSIOS +0xBE62 0xD455 #HANGUL SYLLABLE PHIEUPH OE IEUNG +0xBE63 0xD456 #HANGUL SYLLABLE PHIEUPH OE CIEUC +0xBE64 0xD457 #HANGUL SYLLABLE PHIEUPH OE CHIEUCH +0xBE65 0xD458 #HANGUL SYLLABLE PHIEUPH OE KHIEUKH +0xBE66 0xD459 #HANGUL SYLLABLE PHIEUPH OE THIEUTH +0xBE67 0xD45A #HANGUL SYLLABLE PHIEUPH OE PHIEUPH +0xBE68 0xD45B #HANGUL SYLLABLE PHIEUPH OE HIEUH +0xBE69 0xD45D #HANGUL SYLLABLE PHIEUPH YO KIYEOK +0xBE6A 0xD45E #HANGUL SYLLABLE PHIEUPH YO SSANGKIYEOK +0xBE6B 0xD45F #HANGUL SYLLABLE PHIEUPH YO KIYEOKSIOS +0xBE6C 0xD461 #HANGUL SYLLABLE PHIEUPH YO NIEUNCIEUC +0xBE6D 0xD462 #HANGUL SYLLABLE PHIEUPH YO NIEUNHIEUH +0xBE6E 0xD463 #HANGUL SYLLABLE PHIEUPH YO TIKEUT +0xBE6F 0xD465 #HANGUL SYLLABLE PHIEUPH YO RIEULKIYEOK +0xBE70 0xD466 #HANGUL SYLLABLE PHIEUPH YO RIEULMIEUM +0xBE71 0xD467 #HANGUL SYLLABLE PHIEUPH YO RIEULPIEUP +0xBE72 0xD468 #HANGUL SYLLABLE PHIEUPH YO RIEULSIOS +0xBE73 0xD469 #HANGUL SYLLABLE PHIEUPH YO RIEULTHIEUTH +0xBE74 0xD46A #HANGUL SYLLABLE PHIEUPH YO RIEULPHIEUPH +0xBE75 0xD46B #HANGUL SYLLABLE PHIEUPH YO RIEULHIEUH +0xBE76 0xD46C #HANGUL SYLLABLE PHIEUPH YO MIEUM +0xBE77 0xD46E #HANGUL SYLLABLE PHIEUPH YO PIEUPSIOS +0xBE78 0xD470 #HANGUL SYLLABLE PHIEUPH YO SSANGSIOS +0xBE79 0xD471 #HANGUL SYLLABLE PHIEUPH YO IEUNG +0xBE7A 0xD472 #HANGUL SYLLABLE PHIEUPH YO CIEUC +0xBE81 0xD473 #HANGUL SYLLABLE PHIEUPH YO CHIEUCH +0xBE82 0xD474 #HANGUL SYLLABLE PHIEUPH YO KHIEUKH +0xBE83 0xD475 #HANGUL SYLLABLE PHIEUPH YO THIEUTH +0xBE84 0xD476 #HANGUL SYLLABLE PHIEUPH YO PHIEUPH +0xBE85 0xD477 #HANGUL SYLLABLE PHIEUPH YO HIEUH +0xBE86 0xD47A #HANGUL SYLLABLE PHIEUPH U SSANGKIYEOK +0xBE87 0xD47B #HANGUL SYLLABLE PHIEUPH U KIYEOKSIOS +0xBE88 0xD47D #HANGUL SYLLABLE PHIEUPH U NIEUNCIEUC +0xBE89 0xD47E #HANGUL SYLLABLE PHIEUPH U NIEUNHIEUH +0xBE8A 0xD481 #HANGUL SYLLABLE PHIEUPH U RIEULKIYEOK +0xBE8B 0xD483 #HANGUL SYLLABLE PHIEUPH U RIEULPIEUP +0xBE8C 0xD484 #HANGUL SYLLABLE PHIEUPH U RIEULSIOS +0xBE8D 0xD485 #HANGUL SYLLABLE PHIEUPH U RIEULTHIEUTH +0xBE8E 0xD486 #HANGUL SYLLABLE PHIEUPH U RIEULPHIEUPH +0xBE8F 0xD487 #HANGUL SYLLABLE PHIEUPH U RIEULHIEUH +0xBE90 0xD48A #HANGUL SYLLABLE PHIEUPH U PIEUPSIOS +0xBE91 0xD48C #HANGUL SYLLABLE PHIEUPH U SSANGSIOS +0xBE92 0xD48E #HANGUL SYLLABLE PHIEUPH U CIEUC +0xBE93 0xD48F #HANGUL SYLLABLE PHIEUPH U CHIEUCH +0xBE94 0xD490 #HANGUL SYLLABLE PHIEUPH U KHIEUKH +0xBE95 0xD491 #HANGUL SYLLABLE PHIEUPH U THIEUTH +0xBE96 0xD492 #HANGUL SYLLABLE PHIEUPH U PHIEUPH +0xBE97 0xD493 #HANGUL SYLLABLE PHIEUPH U HIEUH +0xBE98 0xD495 #HANGUL SYLLABLE PHIEUPH WEO KIYEOK +0xBE99 0xD496 #HANGUL SYLLABLE PHIEUPH WEO SSANGKIYEOK +0xBE9A 0xD497 #HANGUL SYLLABLE PHIEUPH WEO KIYEOKSIOS +0xBE9B 0xD498 #HANGUL SYLLABLE PHIEUPH WEO NIEUN +0xBE9C 0xD499 #HANGUL SYLLABLE PHIEUPH WEO NIEUNCIEUC +0xBE9D 0xD49A #HANGUL SYLLABLE PHIEUPH WEO NIEUNHIEUH +0xBE9E 0xD49B #HANGUL SYLLABLE PHIEUPH WEO TIKEUT +0xBE9F 0xD49C #HANGUL SYLLABLE PHIEUPH WEO RIEUL +0xBEA0 0xD49D #HANGUL SYLLABLE PHIEUPH WEO RIEULKIYEOK +0xBEA1 0xC434 #HANGUL SYLLABLE SSANGSIOS OE RIEUL +0xBEA2 0xC43C #HANGUL SYLLABLE SSANGSIOS OE MIEUM +0xBEA3 0xC43D #HANGUL SYLLABLE SSANGSIOS OE PIEUP +0xBEA4 0xC448 #HANGUL SYLLABLE SSANGSIOS YO +0xBEA5 0xC464 #HANGUL SYLLABLE SSANGSIOS U +0xBEA6 0xC465 #HANGUL SYLLABLE SSANGSIOS U KIYEOK +0xBEA7 0xC468 #HANGUL SYLLABLE SSANGSIOS U NIEUN +0xBEA8 0xC46C #HANGUL SYLLABLE SSANGSIOS U RIEUL +0xBEA9 0xC474 #HANGUL SYLLABLE SSANGSIOS U MIEUM +0xBEAA 0xC475 #HANGUL SYLLABLE SSANGSIOS U PIEUP +0xBEAB 0xC479 #HANGUL SYLLABLE SSANGSIOS U IEUNG +0xBEAC 0xC480 #HANGUL SYLLABLE SSANGSIOS WEO +0xBEAD 0xC494 #HANGUL SYLLABLE SSANGSIOS WEO SSANGSIOS +0xBEAE 0xC49C #HANGUL SYLLABLE SSANGSIOS WE +0xBEAF 0xC4B8 #HANGUL SYLLABLE SSANGSIOS WI +0xBEB0 0xC4BC #HANGUL SYLLABLE SSANGSIOS WI NIEUN +0xBEB1 0xC4E9 #HANGUL SYLLABLE SSANGSIOS YU IEUNG +0xBEB2 0xC4F0 #HANGUL SYLLABLE SSANGSIOS EU +0xBEB3 0xC4F1 #HANGUL SYLLABLE SSANGSIOS EU KIYEOK +0xBEB4 0xC4F4 #HANGUL SYLLABLE SSANGSIOS EU NIEUN +0xBEB5 0xC4F8 #HANGUL SYLLABLE SSANGSIOS EU RIEUL +0xBEB6 0xC4FA #HANGUL SYLLABLE SSANGSIOS EU RIEULMIEUM +0xBEB7 0xC4FF #HANGUL SYLLABLE SSANGSIOS EU RIEULHIEUH +0xBEB8 0xC500 #HANGUL SYLLABLE SSANGSIOS EU MIEUM +0xBEB9 0xC501 #HANGUL SYLLABLE SSANGSIOS EU PIEUP +0xBEBA 0xC50C #HANGUL SYLLABLE SSANGSIOS YI +0xBEBB 0xC510 #HANGUL SYLLABLE SSANGSIOS YI NIEUN +0xBEBC 0xC514 #HANGUL SYLLABLE SSANGSIOS YI RIEUL +0xBEBD 0xC51C #HANGUL SYLLABLE SSANGSIOS YI MIEUM +0xBEBE 0xC528 #HANGUL SYLLABLE SSANGSIOS I +0xBEBF 0xC529 #HANGUL SYLLABLE SSANGSIOS I KIYEOK +0xBEC0 0xC52C #HANGUL SYLLABLE SSANGSIOS I NIEUN +0xBEC1 0xC530 #HANGUL SYLLABLE SSANGSIOS I RIEUL +0xBEC2 0xC538 #HANGUL SYLLABLE SSANGSIOS I MIEUM +0xBEC3 0xC539 #HANGUL SYLLABLE SSANGSIOS I PIEUP +0xBEC4 0xC53B #HANGUL SYLLABLE SSANGSIOS I SIOS +0xBEC5 0xC53D #HANGUL SYLLABLE SSANGSIOS I IEUNG +0xBEC6 0xC544 #HANGUL SYLLABLE IEUNG A +0xBEC7 0xC545 #HANGUL SYLLABLE IEUNG A KIYEOK +0xBEC8 0xC548 #HANGUL SYLLABLE IEUNG A NIEUN +0xBEC9 0xC549 #HANGUL SYLLABLE IEUNG A NIEUNCIEUC +0xBECA 0xC54A #HANGUL SYLLABLE IEUNG A NIEUNHIEUH +0xBECB 0xC54C #HANGUL SYLLABLE IEUNG A RIEUL +0xBECC 0xC54D #HANGUL SYLLABLE IEUNG A RIEULKIYEOK +0xBECD 0xC54E #HANGUL SYLLABLE IEUNG A RIEULMIEUM +0xBECE 0xC553 #HANGUL SYLLABLE IEUNG A RIEULHIEUH +0xBECF 0xC554 #HANGUL SYLLABLE IEUNG A MIEUM +0xBED0 0xC555 #HANGUL SYLLABLE IEUNG A PIEUP +0xBED1 0xC557 #HANGUL SYLLABLE IEUNG A SIOS +0xBED2 0xC558 #HANGUL SYLLABLE IEUNG A SSANGSIOS +0xBED3 0xC559 #HANGUL SYLLABLE IEUNG A IEUNG +0xBED4 0xC55D #HANGUL SYLLABLE IEUNG A THIEUTH +0xBED5 0xC55E #HANGUL SYLLABLE IEUNG A PHIEUPH +0xBED6 0xC560 #HANGUL SYLLABLE IEUNG AE +0xBED7 0xC561 #HANGUL SYLLABLE IEUNG AE KIYEOK +0xBED8 0xC564 #HANGUL SYLLABLE IEUNG AE NIEUN +0xBED9 0xC568 #HANGUL SYLLABLE IEUNG AE RIEUL +0xBEDA 0xC570 #HANGUL SYLLABLE IEUNG AE MIEUM +0xBEDB 0xC571 #HANGUL SYLLABLE IEUNG AE PIEUP +0xBEDC 0xC573 #HANGUL SYLLABLE IEUNG AE SIOS +0xBEDD 0xC574 #HANGUL SYLLABLE IEUNG AE SSANGSIOS +0xBEDE 0xC575 #HANGUL SYLLABLE IEUNG AE IEUNG +0xBEDF 0xC57C #HANGUL SYLLABLE IEUNG YA +0xBEE0 0xC57D #HANGUL SYLLABLE IEUNG YA KIYEOK +0xBEE1 0xC580 #HANGUL SYLLABLE IEUNG YA NIEUN +0xBEE2 0xC584 #HANGUL SYLLABLE IEUNG YA RIEUL +0xBEE3 0xC587 #HANGUL SYLLABLE IEUNG YA RIEULPIEUP +0xBEE4 0xC58C #HANGUL SYLLABLE IEUNG YA MIEUM +0xBEE5 0xC58D #HANGUL SYLLABLE IEUNG YA PIEUP +0xBEE6 0xC58F #HANGUL SYLLABLE IEUNG YA SIOS +0xBEE7 0xC591 #HANGUL SYLLABLE IEUNG YA IEUNG +0xBEE8 0xC595 #HANGUL SYLLABLE IEUNG YA THIEUTH +0xBEE9 0xC597 #HANGUL SYLLABLE IEUNG YA HIEUH +0xBEEA 0xC598 #HANGUL SYLLABLE IEUNG YAE +0xBEEB 0xC59C #HANGUL SYLLABLE IEUNG YAE NIEUN +0xBEEC 0xC5A0 #HANGUL SYLLABLE IEUNG YAE RIEUL +0xBEED 0xC5A9 #HANGUL SYLLABLE IEUNG YAE PIEUP +0xBEEE 0xC5B4 #HANGUL SYLLABLE IEUNG EO +0xBEEF 0xC5B5 #HANGUL SYLLABLE IEUNG EO KIYEOK +0xBEF0 0xC5B8 #HANGUL SYLLABLE IEUNG EO NIEUN +0xBEF1 0xC5B9 #HANGUL SYLLABLE IEUNG EO NIEUNCIEUC +0xBEF2 0xC5BB #HANGUL SYLLABLE IEUNG EO TIKEUT +0xBEF3 0xC5BC #HANGUL SYLLABLE IEUNG EO RIEUL +0xBEF4 0xC5BD #HANGUL SYLLABLE IEUNG EO RIEULKIYEOK +0xBEF5 0xC5BE #HANGUL SYLLABLE IEUNG EO RIEULMIEUM +0xBEF6 0xC5C4 #HANGUL SYLLABLE IEUNG EO MIEUM +0xBEF7 0xC5C5 #HANGUL SYLLABLE IEUNG EO PIEUP +0xBEF8 0xC5C6 #HANGUL SYLLABLE IEUNG EO PIEUPSIOS +0xBEF9 0xC5C7 #HANGUL SYLLABLE IEUNG EO SIOS +0xBEFA 0xC5C8 #HANGUL SYLLABLE IEUNG EO SSANGSIOS +0xBEFB 0xC5C9 #HANGUL SYLLABLE IEUNG EO IEUNG +0xBEFC 0xC5CA #HANGUL SYLLABLE IEUNG EO CIEUC +0xBEFD 0xC5CC #HANGUL SYLLABLE IEUNG EO KHIEUKH +0xBEFE 0xC5CE #HANGUL SYLLABLE IEUNG EO PHIEUPH +0xBF41 0xD49E #HANGUL SYLLABLE PHIEUPH WEO RIEULMIEUM +0xBF42 0xD49F #HANGUL SYLLABLE PHIEUPH WEO RIEULPIEUP +0xBF43 0xD4A0 #HANGUL SYLLABLE PHIEUPH WEO RIEULSIOS +0xBF44 0xD4A1 #HANGUL SYLLABLE PHIEUPH WEO RIEULTHIEUTH +0xBF45 0xD4A2 #HANGUL SYLLABLE PHIEUPH WEO RIEULPHIEUPH +0xBF46 0xD4A3 #HANGUL SYLLABLE PHIEUPH WEO RIEULHIEUH +0xBF47 0xD4A4 #HANGUL SYLLABLE PHIEUPH WEO MIEUM +0xBF48 0xD4A5 #HANGUL SYLLABLE PHIEUPH WEO PIEUP +0xBF49 0xD4A6 #HANGUL SYLLABLE PHIEUPH WEO PIEUPSIOS +0xBF4A 0xD4A7 #HANGUL SYLLABLE PHIEUPH WEO SIOS +0xBF4B 0xD4A8 #HANGUL SYLLABLE PHIEUPH WEO SSANGSIOS +0xBF4C 0xD4AA #HANGUL SYLLABLE PHIEUPH WEO CIEUC +0xBF4D 0xD4AB #HANGUL SYLLABLE PHIEUPH WEO CHIEUCH +0xBF4E 0xD4AC #HANGUL SYLLABLE PHIEUPH WEO KHIEUKH +0xBF4F 0xD4AD #HANGUL SYLLABLE PHIEUPH WEO THIEUTH +0xBF50 0xD4AE #HANGUL SYLLABLE PHIEUPH WEO PHIEUPH +0xBF51 0xD4AF #HANGUL SYLLABLE PHIEUPH WEO HIEUH +0xBF52 0xD4B0 #HANGUL SYLLABLE PHIEUPH WE +0xBF53 0xD4B1 #HANGUL SYLLABLE PHIEUPH WE KIYEOK +0xBF54 0xD4B2 #HANGUL SYLLABLE PHIEUPH WE SSANGKIYEOK +0xBF55 0xD4B3 #HANGUL SYLLABLE PHIEUPH WE KIYEOKSIOS +0xBF56 0xD4B4 #HANGUL SYLLABLE PHIEUPH WE NIEUN +0xBF57 0xD4B5 #HANGUL SYLLABLE PHIEUPH WE NIEUNCIEUC +0xBF58 0xD4B6 #HANGUL SYLLABLE PHIEUPH WE NIEUNHIEUH +0xBF59 0xD4B7 #HANGUL SYLLABLE PHIEUPH WE TIKEUT +0xBF5A 0xD4B8 #HANGUL SYLLABLE PHIEUPH WE RIEUL +0xBF61 0xD4B9 #HANGUL SYLLABLE PHIEUPH WE RIEULKIYEOK +0xBF62 0xD4BA #HANGUL SYLLABLE PHIEUPH WE RIEULMIEUM +0xBF63 0xD4BB #HANGUL SYLLABLE PHIEUPH WE RIEULPIEUP +0xBF64 0xD4BC #HANGUL SYLLABLE PHIEUPH WE RIEULSIOS +0xBF65 0xD4BD #HANGUL SYLLABLE PHIEUPH WE RIEULTHIEUTH +0xBF66 0xD4BE #HANGUL SYLLABLE PHIEUPH WE RIEULPHIEUPH +0xBF67 0xD4BF #HANGUL SYLLABLE PHIEUPH WE RIEULHIEUH +0xBF68 0xD4C0 #HANGUL SYLLABLE PHIEUPH WE MIEUM +0xBF69 0xD4C1 #HANGUL SYLLABLE PHIEUPH WE PIEUP +0xBF6A 0xD4C2 #HANGUL SYLLABLE PHIEUPH WE PIEUPSIOS +0xBF6B 0xD4C3 #HANGUL SYLLABLE PHIEUPH WE SIOS +0xBF6C 0xD4C4 #HANGUL SYLLABLE PHIEUPH WE SSANGSIOS +0xBF6D 0xD4C5 #HANGUL SYLLABLE PHIEUPH WE IEUNG +0xBF6E 0xD4C6 #HANGUL SYLLABLE PHIEUPH WE CIEUC +0xBF6F 0xD4C7 #HANGUL SYLLABLE PHIEUPH WE CHIEUCH +0xBF70 0xD4C8 #HANGUL SYLLABLE PHIEUPH WE KHIEUKH +0xBF71 0xD4C9 #HANGUL SYLLABLE PHIEUPH WE THIEUTH +0xBF72 0xD4CA #HANGUL SYLLABLE PHIEUPH WE PHIEUPH +0xBF73 0xD4CB #HANGUL SYLLABLE PHIEUPH WE HIEUH +0xBF74 0xD4CD #HANGUL SYLLABLE PHIEUPH WI KIYEOK +0xBF75 0xD4CE #HANGUL SYLLABLE PHIEUPH WI SSANGKIYEOK +0xBF76 0xD4CF #HANGUL SYLLABLE PHIEUPH WI KIYEOKSIOS +0xBF77 0xD4D1 #HANGUL SYLLABLE PHIEUPH WI NIEUNCIEUC +0xBF78 0xD4D2 #HANGUL SYLLABLE PHIEUPH WI NIEUNHIEUH +0xBF79 0xD4D3 #HANGUL SYLLABLE PHIEUPH WI TIKEUT +0xBF7A 0xD4D5 #HANGUL SYLLABLE PHIEUPH WI RIEULKIYEOK +0xBF81 0xD4D6 #HANGUL SYLLABLE PHIEUPH WI RIEULMIEUM +0xBF82 0xD4D7 #HANGUL SYLLABLE PHIEUPH WI RIEULPIEUP +0xBF83 0xD4D8 #HANGUL SYLLABLE PHIEUPH WI RIEULSIOS +0xBF84 0xD4D9 #HANGUL SYLLABLE PHIEUPH WI RIEULTHIEUTH +0xBF85 0xD4DA #HANGUL SYLLABLE PHIEUPH WI RIEULPHIEUPH +0xBF86 0xD4DB #HANGUL SYLLABLE PHIEUPH WI RIEULHIEUH +0xBF87 0xD4DD #HANGUL SYLLABLE PHIEUPH WI PIEUP +0xBF88 0xD4DE #HANGUL SYLLABLE PHIEUPH WI PIEUPSIOS +0xBF89 0xD4E0 #HANGUL SYLLABLE PHIEUPH WI SSANGSIOS +0xBF8A 0xD4E1 #HANGUL SYLLABLE PHIEUPH WI IEUNG +0xBF8B 0xD4E2 #HANGUL SYLLABLE PHIEUPH WI CIEUC +0xBF8C 0xD4E3 #HANGUL SYLLABLE PHIEUPH WI CHIEUCH +0xBF8D 0xD4E4 #HANGUL SYLLABLE PHIEUPH WI KHIEUKH +0xBF8E 0xD4E5 #HANGUL SYLLABLE PHIEUPH WI THIEUTH +0xBF8F 0xD4E6 #HANGUL SYLLABLE PHIEUPH WI PHIEUPH +0xBF90 0xD4E7 #HANGUL SYLLABLE PHIEUPH WI HIEUH +0xBF91 0xD4E9 #HANGUL SYLLABLE PHIEUPH YU KIYEOK +0xBF92 0xD4EA #HANGUL SYLLABLE PHIEUPH YU SSANGKIYEOK +0xBF93 0xD4EB #HANGUL SYLLABLE PHIEUPH YU KIYEOKSIOS +0xBF94 0xD4ED #HANGUL SYLLABLE PHIEUPH YU NIEUNCIEUC +0xBF95 0xD4EE #HANGUL SYLLABLE PHIEUPH YU NIEUNHIEUH +0xBF96 0xD4EF #HANGUL SYLLABLE PHIEUPH YU TIKEUT +0xBF97 0xD4F1 #HANGUL SYLLABLE PHIEUPH YU RIEULKIYEOK +0xBF98 0xD4F2 #HANGUL SYLLABLE PHIEUPH YU RIEULMIEUM +0xBF99 0xD4F3 #HANGUL SYLLABLE PHIEUPH YU RIEULPIEUP +0xBF9A 0xD4F4 #HANGUL SYLLABLE PHIEUPH YU RIEULSIOS +0xBF9B 0xD4F5 #HANGUL SYLLABLE PHIEUPH YU RIEULTHIEUTH +0xBF9C 0xD4F6 #HANGUL SYLLABLE PHIEUPH YU RIEULPHIEUPH +0xBF9D 0xD4F7 #HANGUL SYLLABLE PHIEUPH YU RIEULHIEUH +0xBF9E 0xD4F9 #HANGUL SYLLABLE PHIEUPH YU PIEUP +0xBF9F 0xD4FA #HANGUL SYLLABLE PHIEUPH YU PIEUPSIOS +0xBFA0 0xD4FC #HANGUL SYLLABLE PHIEUPH YU SSANGSIOS +0xBFA1 0xC5D0 #HANGUL SYLLABLE IEUNG E +0xBFA2 0xC5D1 #HANGUL SYLLABLE IEUNG E KIYEOK +0xBFA3 0xC5D4 #HANGUL SYLLABLE IEUNG E NIEUN +0xBFA4 0xC5D8 #HANGUL SYLLABLE IEUNG E RIEUL +0xBFA5 0xC5E0 #HANGUL SYLLABLE IEUNG E MIEUM +0xBFA6 0xC5E1 #HANGUL SYLLABLE IEUNG E PIEUP +0xBFA7 0xC5E3 #HANGUL SYLLABLE IEUNG E SIOS +0xBFA8 0xC5E5 #HANGUL SYLLABLE IEUNG E IEUNG +0xBFA9 0xC5EC #HANGUL SYLLABLE IEUNG YEO +0xBFAA 0xC5ED #HANGUL SYLLABLE IEUNG YEO KIYEOK +0xBFAB 0xC5EE #HANGUL SYLLABLE IEUNG YEO SSANGKIYEOK +0xBFAC 0xC5F0 #HANGUL SYLLABLE IEUNG YEO NIEUN +0xBFAD 0xC5F4 #HANGUL SYLLABLE IEUNG YEO RIEUL +0xBFAE 0xC5F6 #HANGUL SYLLABLE IEUNG YEO RIEULMIEUM +0xBFAF 0xC5F7 #HANGUL SYLLABLE IEUNG YEO RIEULPIEUP +0xBFB0 0xC5FC #HANGUL SYLLABLE IEUNG YEO MIEUM +0xBFB1 0xC5FD #HANGUL SYLLABLE IEUNG YEO PIEUP +0xBFB2 0xC5FE #HANGUL SYLLABLE IEUNG YEO PIEUPSIOS +0xBFB3 0xC5FF #HANGUL SYLLABLE IEUNG YEO SIOS +0xBFB4 0xC600 #HANGUL SYLLABLE IEUNG YEO SSANGSIOS +0xBFB5 0xC601 #HANGUL SYLLABLE IEUNG YEO IEUNG +0xBFB6 0xC605 #HANGUL SYLLABLE IEUNG YEO THIEUTH +0xBFB7 0xC606 #HANGUL SYLLABLE IEUNG YEO PHIEUPH +0xBFB8 0xC607 #HANGUL SYLLABLE IEUNG YEO HIEUH +0xBFB9 0xC608 #HANGUL SYLLABLE IEUNG YE +0xBFBA 0xC60C #HANGUL SYLLABLE IEUNG YE NIEUN +0xBFBB 0xC610 #HANGUL SYLLABLE IEUNG YE RIEUL +0xBFBC 0xC618 #HANGUL SYLLABLE IEUNG YE MIEUM +0xBFBD 0xC619 #HANGUL SYLLABLE IEUNG YE PIEUP +0xBFBE 0xC61B #HANGUL SYLLABLE IEUNG YE SIOS +0xBFBF 0xC61C #HANGUL SYLLABLE IEUNG YE SSANGSIOS +0xBFC0 0xC624 #HANGUL SYLLABLE IEUNG O +0xBFC1 0xC625 #HANGUL SYLLABLE IEUNG O KIYEOK +0xBFC2 0xC628 #HANGUL SYLLABLE IEUNG O NIEUN +0xBFC3 0xC62C #HANGUL SYLLABLE IEUNG O RIEUL +0xBFC4 0xC62D #HANGUL SYLLABLE IEUNG O RIEULKIYEOK +0xBFC5 0xC62E #HANGUL SYLLABLE IEUNG O RIEULMIEUM +0xBFC6 0xC630 #HANGUL SYLLABLE IEUNG O RIEULSIOS +0xBFC7 0xC633 #HANGUL SYLLABLE IEUNG O RIEULHIEUH +0xBFC8 0xC634 #HANGUL SYLLABLE IEUNG O MIEUM +0xBFC9 0xC635 #HANGUL SYLLABLE IEUNG O PIEUP +0xBFCA 0xC637 #HANGUL SYLLABLE IEUNG O SIOS +0xBFCB 0xC639 #HANGUL SYLLABLE IEUNG O IEUNG +0xBFCC 0xC63B #HANGUL SYLLABLE IEUNG O CHIEUCH +0xBFCD 0xC640 #HANGUL SYLLABLE IEUNG WA +0xBFCE 0xC641 #HANGUL SYLLABLE IEUNG WA KIYEOK +0xBFCF 0xC644 #HANGUL SYLLABLE IEUNG WA NIEUN +0xBFD0 0xC648 #HANGUL SYLLABLE IEUNG WA RIEUL +0xBFD1 0xC650 #HANGUL SYLLABLE IEUNG WA MIEUM +0xBFD2 0xC651 #HANGUL SYLLABLE IEUNG WA PIEUP +0xBFD3 0xC653 #HANGUL SYLLABLE IEUNG WA SIOS +0xBFD4 0xC654 #HANGUL SYLLABLE IEUNG WA SSANGSIOS +0xBFD5 0xC655 #HANGUL SYLLABLE IEUNG WA IEUNG +0xBFD6 0xC65C #HANGUL SYLLABLE IEUNG WAE +0xBFD7 0xC65D #HANGUL SYLLABLE IEUNG WAE KIYEOK +0xBFD8 0xC660 #HANGUL SYLLABLE IEUNG WAE NIEUN +0xBFD9 0xC66C #HANGUL SYLLABLE IEUNG WAE MIEUM +0xBFDA 0xC66F #HANGUL SYLLABLE IEUNG WAE SIOS +0xBFDB 0xC671 #HANGUL SYLLABLE IEUNG WAE IEUNG +0xBFDC 0xC678 #HANGUL SYLLABLE IEUNG OE +0xBFDD 0xC679 #HANGUL SYLLABLE IEUNG OE KIYEOK +0xBFDE 0xC67C #HANGUL SYLLABLE IEUNG OE NIEUN +0xBFDF 0xC680 #HANGUL SYLLABLE IEUNG OE RIEUL +0xBFE0 0xC688 #HANGUL SYLLABLE IEUNG OE MIEUM +0xBFE1 0xC689 #HANGUL SYLLABLE IEUNG OE PIEUP +0xBFE2 0xC68B #HANGUL SYLLABLE IEUNG OE SIOS +0xBFE3 0xC68D #HANGUL SYLLABLE IEUNG OE IEUNG +0xBFE4 0xC694 #HANGUL SYLLABLE IEUNG YO +0xBFE5 0xC695 #HANGUL SYLLABLE IEUNG YO KIYEOK +0xBFE6 0xC698 #HANGUL SYLLABLE IEUNG YO NIEUN +0xBFE7 0xC69C #HANGUL SYLLABLE IEUNG YO RIEUL +0xBFE8 0xC6A4 #HANGUL SYLLABLE IEUNG YO MIEUM +0xBFE9 0xC6A5 #HANGUL SYLLABLE IEUNG YO PIEUP +0xBFEA 0xC6A7 #HANGUL SYLLABLE IEUNG YO SIOS +0xBFEB 0xC6A9 #HANGUL SYLLABLE IEUNG YO IEUNG +0xBFEC 0xC6B0 #HANGUL SYLLABLE IEUNG U +0xBFED 0xC6B1 #HANGUL SYLLABLE IEUNG U KIYEOK +0xBFEE 0xC6B4 #HANGUL SYLLABLE IEUNG U NIEUN +0xBFEF 0xC6B8 #HANGUL SYLLABLE IEUNG U RIEUL +0xBFF0 0xC6B9 #HANGUL SYLLABLE IEUNG U RIEULKIYEOK +0xBFF1 0xC6BA #HANGUL SYLLABLE IEUNG U RIEULMIEUM +0xBFF2 0xC6C0 #HANGUL SYLLABLE IEUNG U MIEUM +0xBFF3 0xC6C1 #HANGUL SYLLABLE IEUNG U PIEUP +0xBFF4 0xC6C3 #HANGUL SYLLABLE IEUNG U SIOS +0xBFF5 0xC6C5 #HANGUL SYLLABLE IEUNG U IEUNG +0xBFF6 0xC6CC #HANGUL SYLLABLE IEUNG WEO +0xBFF7 0xC6CD #HANGUL SYLLABLE IEUNG WEO KIYEOK +0xBFF8 0xC6D0 #HANGUL SYLLABLE IEUNG WEO NIEUN +0xBFF9 0xC6D4 #HANGUL SYLLABLE IEUNG WEO RIEUL +0xBFFA 0xC6DC #HANGUL SYLLABLE IEUNG WEO MIEUM +0xBFFB 0xC6DD #HANGUL SYLLABLE IEUNG WEO PIEUP +0xBFFC 0xC6E0 #HANGUL SYLLABLE IEUNG WEO SSANGSIOS +0xBFFD 0xC6E1 #HANGUL SYLLABLE IEUNG WEO IEUNG +0xBFFE 0xC6E8 #HANGUL SYLLABLE IEUNG WE +0xC041 0xD4FE #HANGUL SYLLABLE PHIEUPH YU CIEUC +0xC042 0xD4FF #HANGUL SYLLABLE PHIEUPH YU CHIEUCH +0xC043 0xD500 #HANGUL SYLLABLE PHIEUPH YU KHIEUKH +0xC044 0xD501 #HANGUL SYLLABLE PHIEUPH YU THIEUTH +0xC045 0xD502 #HANGUL SYLLABLE PHIEUPH YU PHIEUPH +0xC046 0xD503 #HANGUL SYLLABLE PHIEUPH YU HIEUH +0xC047 0xD505 #HANGUL SYLLABLE PHIEUPH EU KIYEOK +0xC048 0xD506 #HANGUL SYLLABLE PHIEUPH EU SSANGKIYEOK +0xC049 0xD507 #HANGUL SYLLABLE PHIEUPH EU KIYEOKSIOS +0xC04A 0xD509 #HANGUL SYLLABLE PHIEUPH EU NIEUNCIEUC +0xC04B 0xD50A #HANGUL SYLLABLE PHIEUPH EU NIEUNHIEUH +0xC04C 0xD50B #HANGUL SYLLABLE PHIEUPH EU TIKEUT +0xC04D 0xD50D #HANGUL SYLLABLE PHIEUPH EU RIEULKIYEOK +0xC04E 0xD50E #HANGUL SYLLABLE PHIEUPH EU RIEULMIEUM +0xC04F 0xD50F #HANGUL SYLLABLE PHIEUPH EU RIEULPIEUP +0xC050 0xD510 #HANGUL SYLLABLE PHIEUPH EU RIEULSIOS +0xC051 0xD511 #HANGUL SYLLABLE PHIEUPH EU RIEULTHIEUTH +0xC052 0xD512 #HANGUL SYLLABLE PHIEUPH EU RIEULPHIEUPH +0xC053 0xD513 #HANGUL SYLLABLE PHIEUPH EU RIEULHIEUH +0xC054 0xD516 #HANGUL SYLLABLE PHIEUPH EU PIEUPSIOS +0xC055 0xD518 #HANGUL SYLLABLE PHIEUPH EU SSANGSIOS +0xC056 0xD519 #HANGUL SYLLABLE PHIEUPH EU IEUNG +0xC057 0xD51A #HANGUL SYLLABLE PHIEUPH EU CIEUC +0xC058 0xD51B #HANGUL SYLLABLE PHIEUPH EU CHIEUCH +0xC059 0xD51C #HANGUL SYLLABLE PHIEUPH EU KHIEUKH +0xC05A 0xD51D #HANGUL SYLLABLE PHIEUPH EU THIEUTH +0xC061 0xD51E #HANGUL SYLLABLE PHIEUPH EU PHIEUPH +0xC062 0xD51F #HANGUL SYLLABLE PHIEUPH EU HIEUH +0xC063 0xD520 #HANGUL SYLLABLE PHIEUPH YI +0xC064 0xD521 #HANGUL SYLLABLE PHIEUPH YI KIYEOK +0xC065 0xD522 #HANGUL SYLLABLE PHIEUPH YI SSANGKIYEOK +0xC066 0xD523 #HANGUL SYLLABLE PHIEUPH YI KIYEOKSIOS +0xC067 0xD524 #HANGUL SYLLABLE PHIEUPH YI NIEUN +0xC068 0xD525 #HANGUL SYLLABLE PHIEUPH YI NIEUNCIEUC +0xC069 0xD526 #HANGUL SYLLABLE PHIEUPH YI NIEUNHIEUH +0xC06A 0xD527 #HANGUL SYLLABLE PHIEUPH YI TIKEUT +0xC06B 0xD528 #HANGUL SYLLABLE PHIEUPH YI RIEUL +0xC06C 0xD529 #HANGUL SYLLABLE PHIEUPH YI RIEULKIYEOK +0xC06D 0xD52A #HANGUL SYLLABLE PHIEUPH YI RIEULMIEUM +0xC06E 0xD52B #HANGUL SYLLABLE PHIEUPH YI RIEULPIEUP +0xC06F 0xD52C #HANGUL SYLLABLE PHIEUPH YI RIEULSIOS +0xC070 0xD52D #HANGUL SYLLABLE PHIEUPH YI RIEULTHIEUTH +0xC071 0xD52E #HANGUL SYLLABLE PHIEUPH YI RIEULPHIEUPH +0xC072 0xD52F #HANGUL SYLLABLE PHIEUPH YI RIEULHIEUH +0xC073 0xD530 #HANGUL SYLLABLE PHIEUPH YI MIEUM +0xC074 0xD531 #HANGUL SYLLABLE PHIEUPH YI PIEUP +0xC075 0xD532 #HANGUL SYLLABLE PHIEUPH YI PIEUPSIOS +0xC076 0xD533 #HANGUL SYLLABLE PHIEUPH YI SIOS +0xC077 0xD534 #HANGUL SYLLABLE PHIEUPH YI SSANGSIOS +0xC078 0xD535 #HANGUL SYLLABLE PHIEUPH YI IEUNG +0xC079 0xD536 #HANGUL SYLLABLE PHIEUPH YI CIEUC +0xC07A 0xD537 #HANGUL SYLLABLE PHIEUPH YI CHIEUCH +0xC081 0xD538 #HANGUL SYLLABLE PHIEUPH YI KHIEUKH +0xC082 0xD539 #HANGUL SYLLABLE PHIEUPH YI THIEUTH +0xC083 0xD53A #HANGUL SYLLABLE PHIEUPH YI PHIEUPH +0xC084 0xD53B #HANGUL SYLLABLE PHIEUPH YI HIEUH +0xC085 0xD53E #HANGUL SYLLABLE PHIEUPH I SSANGKIYEOK +0xC086 0xD53F #HANGUL SYLLABLE PHIEUPH I KIYEOKSIOS +0xC087 0xD541 #HANGUL SYLLABLE PHIEUPH I NIEUNCIEUC +0xC088 0xD542 #HANGUL SYLLABLE PHIEUPH I NIEUNHIEUH +0xC089 0xD543 #HANGUL SYLLABLE PHIEUPH I TIKEUT +0xC08A 0xD545 #HANGUL SYLLABLE PHIEUPH I RIEULKIYEOK +0xC08B 0xD546 #HANGUL SYLLABLE PHIEUPH I RIEULMIEUM +0xC08C 0xD547 #HANGUL SYLLABLE PHIEUPH I RIEULPIEUP +0xC08D 0xD548 #HANGUL SYLLABLE PHIEUPH I RIEULSIOS +0xC08E 0xD549 #HANGUL SYLLABLE PHIEUPH I RIEULTHIEUTH +0xC08F 0xD54A #HANGUL SYLLABLE PHIEUPH I RIEULPHIEUPH +0xC090 0xD54B #HANGUL SYLLABLE PHIEUPH I RIEULHIEUH +0xC091 0xD54E #HANGUL SYLLABLE PHIEUPH I PIEUPSIOS +0xC092 0xD550 #HANGUL SYLLABLE PHIEUPH I SSANGSIOS +0xC093 0xD552 #HANGUL SYLLABLE PHIEUPH I CIEUC +0xC094 0xD553 #HANGUL SYLLABLE PHIEUPH I CHIEUCH +0xC095 0xD554 #HANGUL SYLLABLE PHIEUPH I KHIEUKH +0xC096 0xD555 #HANGUL SYLLABLE PHIEUPH I THIEUTH +0xC097 0xD556 #HANGUL SYLLABLE PHIEUPH I PHIEUPH +0xC098 0xD557 #HANGUL SYLLABLE PHIEUPH I HIEUH +0xC099 0xD55A #HANGUL SYLLABLE HIEUH A SSANGKIYEOK +0xC09A 0xD55B #HANGUL SYLLABLE HIEUH A KIYEOKSIOS +0xC09B 0xD55D #HANGUL SYLLABLE HIEUH A NIEUNCIEUC +0xC09C 0xD55E #HANGUL SYLLABLE HIEUH A NIEUNHIEUH +0xC09D 0xD55F #HANGUL SYLLABLE HIEUH A TIKEUT +0xC09E 0xD561 #HANGUL SYLLABLE HIEUH A RIEULKIYEOK +0xC09F 0xD562 #HANGUL SYLLABLE HIEUH A RIEULMIEUM +0xC0A0 0xD563 #HANGUL SYLLABLE HIEUH A RIEULPIEUP +0xC0A1 0xC6E9 #HANGUL SYLLABLE IEUNG WE KIYEOK +0xC0A2 0xC6EC #HANGUL SYLLABLE IEUNG WE NIEUN +0xC0A3 0xC6F0 #HANGUL SYLLABLE IEUNG WE RIEUL +0xC0A4 0xC6F8 #HANGUL SYLLABLE IEUNG WE MIEUM +0xC0A5 0xC6F9 #HANGUL SYLLABLE IEUNG WE PIEUP +0xC0A6 0xC6FD #HANGUL SYLLABLE IEUNG WE IEUNG +0xC0A7 0xC704 #HANGUL SYLLABLE IEUNG WI +0xC0A8 0xC705 #HANGUL SYLLABLE IEUNG WI KIYEOK +0xC0A9 0xC708 #HANGUL SYLLABLE IEUNG WI NIEUN +0xC0AA 0xC70C #HANGUL SYLLABLE IEUNG WI RIEUL +0xC0AB 0xC714 #HANGUL SYLLABLE IEUNG WI MIEUM +0xC0AC 0xC715 #HANGUL SYLLABLE IEUNG WI PIEUP +0xC0AD 0xC717 #HANGUL SYLLABLE IEUNG WI SIOS +0xC0AE 0xC719 #HANGUL SYLLABLE IEUNG WI IEUNG +0xC0AF 0xC720 #HANGUL SYLLABLE IEUNG YU +0xC0B0 0xC721 #HANGUL SYLLABLE IEUNG YU KIYEOK +0xC0B1 0xC724 #HANGUL SYLLABLE IEUNG YU NIEUN +0xC0B2 0xC728 #HANGUL SYLLABLE IEUNG YU RIEUL +0xC0B3 0xC730 #HANGUL SYLLABLE IEUNG YU MIEUM +0xC0B4 0xC731 #HANGUL SYLLABLE IEUNG YU PIEUP +0xC0B5 0xC733 #HANGUL SYLLABLE IEUNG YU SIOS +0xC0B6 0xC735 #HANGUL SYLLABLE IEUNG YU IEUNG +0xC0B7 0xC737 #HANGUL SYLLABLE IEUNG YU CHIEUCH +0xC0B8 0xC73C #HANGUL SYLLABLE IEUNG EU +0xC0B9 0xC73D #HANGUL SYLLABLE IEUNG EU KIYEOK +0xC0BA 0xC740 #HANGUL SYLLABLE IEUNG EU NIEUN +0xC0BB 0xC744 #HANGUL SYLLABLE IEUNG EU RIEUL +0xC0BC 0xC74A #HANGUL SYLLABLE IEUNG EU RIEULPHIEUPH +0xC0BD 0xC74C #HANGUL SYLLABLE IEUNG EU MIEUM +0xC0BE 0xC74D #HANGUL SYLLABLE IEUNG EU PIEUP +0xC0BF 0xC74F #HANGUL SYLLABLE IEUNG EU SIOS +0xC0C0 0xC751 #HANGUL SYLLABLE IEUNG EU IEUNG +0xC0C1 0xC752 #HANGUL SYLLABLE IEUNG EU CIEUC +0xC0C2 0xC753 #HANGUL SYLLABLE IEUNG EU CHIEUCH +0xC0C3 0xC754 #HANGUL SYLLABLE IEUNG EU KHIEUKH +0xC0C4 0xC755 #HANGUL SYLLABLE IEUNG EU THIEUTH +0xC0C5 0xC756 #HANGUL SYLLABLE IEUNG EU PHIEUPH +0xC0C6 0xC757 #HANGUL SYLLABLE IEUNG EU HIEUH +0xC0C7 0xC758 #HANGUL SYLLABLE IEUNG YI +0xC0C8 0xC75C #HANGUL SYLLABLE IEUNG YI NIEUN +0xC0C9 0xC760 #HANGUL SYLLABLE IEUNG YI RIEUL +0xC0CA 0xC768 #HANGUL SYLLABLE IEUNG YI MIEUM +0xC0CB 0xC76B #HANGUL SYLLABLE IEUNG YI SIOS +0xC0CC 0xC774 #HANGUL SYLLABLE IEUNG I +0xC0CD 0xC775 #HANGUL SYLLABLE IEUNG I KIYEOK +0xC0CE 0xC778 #HANGUL SYLLABLE IEUNG I NIEUN +0xC0CF 0xC77C #HANGUL SYLLABLE IEUNG I RIEUL +0xC0D0 0xC77D #HANGUL SYLLABLE IEUNG I RIEULKIYEOK +0xC0D1 0xC77E #HANGUL SYLLABLE IEUNG I RIEULMIEUM +0xC0D2 0xC783 #HANGUL SYLLABLE IEUNG I RIEULHIEUH +0xC0D3 0xC784 #HANGUL SYLLABLE IEUNG I MIEUM +0xC0D4 0xC785 #HANGUL SYLLABLE IEUNG I PIEUP +0xC0D5 0xC787 #HANGUL SYLLABLE IEUNG I SIOS +0xC0D6 0xC788 #HANGUL SYLLABLE IEUNG I SSANGSIOS +0xC0D7 0xC789 #HANGUL SYLLABLE IEUNG I IEUNG +0xC0D8 0xC78A #HANGUL SYLLABLE IEUNG I CIEUC +0xC0D9 0xC78E #HANGUL SYLLABLE IEUNG I PHIEUPH +0xC0DA 0xC790 #HANGUL SYLLABLE CIEUC A +0xC0DB 0xC791 #HANGUL SYLLABLE CIEUC A KIYEOK +0xC0DC 0xC794 #HANGUL SYLLABLE CIEUC A NIEUN +0xC0DD 0xC796 #HANGUL SYLLABLE CIEUC A NIEUNHIEUH +0xC0DE 0xC797 #HANGUL SYLLABLE CIEUC A TIKEUT +0xC0DF 0xC798 #HANGUL SYLLABLE CIEUC A RIEUL +0xC0E0 0xC79A #HANGUL SYLLABLE CIEUC A RIEULMIEUM +0xC0E1 0xC7A0 #HANGUL SYLLABLE CIEUC A MIEUM +0xC0E2 0xC7A1 #HANGUL SYLLABLE CIEUC A PIEUP +0xC0E3 0xC7A3 #HANGUL SYLLABLE CIEUC A SIOS +0xC0E4 0xC7A4 #HANGUL SYLLABLE CIEUC A SSANGSIOS +0xC0E5 0xC7A5 #HANGUL SYLLABLE CIEUC A IEUNG +0xC0E6 0xC7A6 #HANGUL SYLLABLE CIEUC A CIEUC +0xC0E7 0xC7AC #HANGUL SYLLABLE CIEUC AE +0xC0E8 0xC7AD #HANGUL SYLLABLE CIEUC AE KIYEOK +0xC0E9 0xC7B0 #HANGUL SYLLABLE CIEUC AE NIEUN +0xC0EA 0xC7B4 #HANGUL SYLLABLE CIEUC AE RIEUL +0xC0EB 0xC7BC #HANGUL SYLLABLE CIEUC AE MIEUM +0xC0EC 0xC7BD #HANGUL SYLLABLE CIEUC AE PIEUP +0xC0ED 0xC7BF #HANGUL SYLLABLE CIEUC AE SIOS +0xC0EE 0xC7C0 #HANGUL SYLLABLE CIEUC AE SSANGSIOS +0xC0EF 0xC7C1 #HANGUL SYLLABLE CIEUC AE IEUNG +0xC0F0 0xC7C8 #HANGUL SYLLABLE CIEUC YA +0xC0F1 0xC7C9 #HANGUL SYLLABLE CIEUC YA KIYEOK +0xC0F2 0xC7CC #HANGUL SYLLABLE CIEUC YA NIEUN +0xC0F3 0xC7CE #HANGUL SYLLABLE CIEUC YA NIEUNHIEUH +0xC0F4 0xC7D0 #HANGUL SYLLABLE CIEUC YA RIEUL +0xC0F5 0xC7D8 #HANGUL SYLLABLE CIEUC YA MIEUM +0xC0F6 0xC7DD #HANGUL SYLLABLE CIEUC YA IEUNG +0xC0F7 0xC7E4 #HANGUL SYLLABLE CIEUC YAE +0xC0F8 0xC7E8 #HANGUL SYLLABLE CIEUC YAE NIEUN +0xC0F9 0xC7EC #HANGUL SYLLABLE CIEUC YAE RIEUL +0xC0FA 0xC800 #HANGUL SYLLABLE CIEUC EO +0xC0FB 0xC801 #HANGUL SYLLABLE CIEUC EO KIYEOK +0xC0FC 0xC804 #HANGUL SYLLABLE CIEUC EO NIEUN +0xC0FD 0xC808 #HANGUL SYLLABLE CIEUC EO RIEUL +0xC0FE 0xC80A #HANGUL SYLLABLE CIEUC EO RIEULMIEUM +0xC141 0xD564 #HANGUL SYLLABLE HIEUH A RIEULSIOS +0xC142 0xD566 #HANGUL SYLLABLE HIEUH A RIEULPHIEUPH +0xC143 0xD567 #HANGUL SYLLABLE HIEUH A RIEULHIEUH +0xC144 0xD56A #HANGUL SYLLABLE HIEUH A PIEUPSIOS +0xC145 0xD56C #HANGUL SYLLABLE HIEUH A SSANGSIOS +0xC146 0xD56E #HANGUL SYLLABLE HIEUH A CIEUC +0xC147 0xD56F #HANGUL SYLLABLE HIEUH A CHIEUCH +0xC148 0xD570 #HANGUL SYLLABLE HIEUH A KHIEUKH +0xC149 0xD571 #HANGUL SYLLABLE HIEUH A THIEUTH +0xC14A 0xD572 #HANGUL SYLLABLE HIEUH A PHIEUPH +0xC14B 0xD573 #HANGUL SYLLABLE HIEUH A HIEUH +0xC14C 0xD576 #HANGUL SYLLABLE HIEUH AE SSANGKIYEOK +0xC14D 0xD577 #HANGUL SYLLABLE HIEUH AE KIYEOKSIOS +0xC14E 0xD579 #HANGUL SYLLABLE HIEUH AE NIEUNCIEUC +0xC14F 0xD57A #HANGUL SYLLABLE HIEUH AE NIEUNHIEUH +0xC150 0xD57B #HANGUL SYLLABLE HIEUH AE TIKEUT +0xC151 0xD57D #HANGUL SYLLABLE HIEUH AE RIEULKIYEOK +0xC152 0xD57E #HANGUL SYLLABLE HIEUH AE RIEULMIEUM +0xC153 0xD57F #HANGUL SYLLABLE HIEUH AE RIEULPIEUP +0xC154 0xD580 #HANGUL SYLLABLE HIEUH AE RIEULSIOS +0xC155 0xD581 #HANGUL SYLLABLE HIEUH AE RIEULTHIEUTH +0xC156 0xD582 #HANGUL SYLLABLE HIEUH AE RIEULPHIEUPH +0xC157 0xD583 #HANGUL SYLLABLE HIEUH AE RIEULHIEUH +0xC158 0xD586 #HANGUL SYLLABLE HIEUH AE PIEUPSIOS +0xC159 0xD58A #HANGUL SYLLABLE HIEUH AE CIEUC +0xC15A 0xD58B #HANGUL SYLLABLE HIEUH AE CHIEUCH +0xC161 0xD58C #HANGUL SYLLABLE HIEUH AE KHIEUKH +0xC162 0xD58D #HANGUL SYLLABLE HIEUH AE THIEUTH +0xC163 0xD58E #HANGUL SYLLABLE HIEUH AE PHIEUPH +0xC164 0xD58F #HANGUL SYLLABLE HIEUH AE HIEUH +0xC165 0xD591 #HANGUL SYLLABLE HIEUH YA KIYEOK +0xC166 0xD592 #HANGUL SYLLABLE HIEUH YA SSANGKIYEOK +0xC167 0xD593 #HANGUL SYLLABLE HIEUH YA KIYEOKSIOS +0xC168 0xD594 #HANGUL SYLLABLE HIEUH YA NIEUN +0xC169 0xD595 #HANGUL SYLLABLE HIEUH YA NIEUNCIEUC +0xC16A 0xD596 #HANGUL SYLLABLE HIEUH YA NIEUNHIEUH +0xC16B 0xD597 #HANGUL SYLLABLE HIEUH YA TIKEUT +0xC16C 0xD598 #HANGUL SYLLABLE HIEUH YA RIEUL +0xC16D 0xD599 #HANGUL SYLLABLE HIEUH YA RIEULKIYEOK +0xC16E 0xD59A #HANGUL SYLLABLE HIEUH YA RIEULMIEUM +0xC16F 0xD59B #HANGUL SYLLABLE HIEUH YA RIEULPIEUP +0xC170 0xD59C #HANGUL SYLLABLE HIEUH YA RIEULSIOS +0xC171 0xD59D #HANGUL SYLLABLE HIEUH YA RIEULTHIEUTH +0xC172 0xD59E #HANGUL SYLLABLE HIEUH YA RIEULPHIEUPH +0xC173 0xD59F #HANGUL SYLLABLE HIEUH YA RIEULHIEUH +0xC174 0xD5A0 #HANGUL SYLLABLE HIEUH YA MIEUM +0xC175 0xD5A1 #HANGUL SYLLABLE HIEUH YA PIEUP +0xC176 0xD5A2 #HANGUL SYLLABLE HIEUH YA PIEUPSIOS +0xC177 0xD5A3 #HANGUL SYLLABLE HIEUH YA SIOS +0xC178 0xD5A4 #HANGUL SYLLABLE HIEUH YA SSANGSIOS +0xC179 0xD5A6 #HANGUL SYLLABLE HIEUH YA CIEUC +0xC17A 0xD5A7 #HANGUL SYLLABLE HIEUH YA CHIEUCH +0xC181 0xD5A8 #HANGUL SYLLABLE HIEUH YA KHIEUKH +0xC182 0xD5A9 #HANGUL SYLLABLE HIEUH YA THIEUTH +0xC183 0xD5AA #HANGUL SYLLABLE HIEUH YA PHIEUPH +0xC184 0xD5AB #HANGUL SYLLABLE HIEUH YA HIEUH +0xC185 0xD5AC #HANGUL SYLLABLE HIEUH YAE +0xC186 0xD5AD #HANGUL SYLLABLE HIEUH YAE KIYEOK +0xC187 0xD5AE #HANGUL SYLLABLE HIEUH YAE SSANGKIYEOK +0xC188 0xD5AF #HANGUL SYLLABLE HIEUH YAE KIYEOKSIOS +0xC189 0xD5B0 #HANGUL SYLLABLE HIEUH YAE NIEUN +0xC18A 0xD5B1 #HANGUL SYLLABLE HIEUH YAE NIEUNCIEUC +0xC18B 0xD5B2 #HANGUL SYLLABLE HIEUH YAE NIEUNHIEUH +0xC18C 0xD5B3 #HANGUL SYLLABLE HIEUH YAE TIKEUT +0xC18D 0xD5B4 #HANGUL SYLLABLE HIEUH YAE RIEUL +0xC18E 0xD5B5 #HANGUL SYLLABLE HIEUH YAE RIEULKIYEOK +0xC18F 0xD5B6 #HANGUL SYLLABLE HIEUH YAE RIEULMIEUM +0xC190 0xD5B7 #HANGUL SYLLABLE HIEUH YAE RIEULPIEUP +0xC191 0xD5B8 #HANGUL SYLLABLE HIEUH YAE RIEULSIOS +0xC192 0xD5B9 #HANGUL SYLLABLE HIEUH YAE RIEULTHIEUTH +0xC193 0xD5BA #HANGUL SYLLABLE HIEUH YAE RIEULPHIEUPH +0xC194 0xD5BB #HANGUL SYLLABLE HIEUH YAE RIEULHIEUH +0xC195 0xD5BC #HANGUL SYLLABLE HIEUH YAE MIEUM +0xC196 0xD5BD #HANGUL SYLLABLE HIEUH YAE PIEUP +0xC197 0xD5BE #HANGUL SYLLABLE HIEUH YAE PIEUPSIOS +0xC198 0xD5BF #HANGUL SYLLABLE HIEUH YAE SIOS +0xC199 0xD5C0 #HANGUL SYLLABLE HIEUH YAE SSANGSIOS +0xC19A 0xD5C1 #HANGUL SYLLABLE HIEUH YAE IEUNG +0xC19B 0xD5C2 #HANGUL SYLLABLE HIEUH YAE CIEUC +0xC19C 0xD5C3 #HANGUL SYLLABLE HIEUH YAE CHIEUCH +0xC19D 0xD5C4 #HANGUL SYLLABLE HIEUH YAE KHIEUKH +0xC19E 0xD5C5 #HANGUL SYLLABLE HIEUH YAE THIEUTH +0xC19F 0xD5C6 #HANGUL SYLLABLE HIEUH YAE PHIEUPH +0xC1A0 0xD5C7 #HANGUL SYLLABLE HIEUH YAE HIEUH +0xC1A1 0xC810 #HANGUL SYLLABLE CIEUC EO MIEUM +0xC1A2 0xC811 #HANGUL SYLLABLE CIEUC EO PIEUP +0xC1A3 0xC813 #HANGUL SYLLABLE CIEUC EO SIOS +0xC1A4 0xC815 #HANGUL SYLLABLE CIEUC EO IEUNG +0xC1A5 0xC816 #HANGUL SYLLABLE CIEUC EO CIEUC +0xC1A6 0xC81C #HANGUL SYLLABLE CIEUC E +0xC1A7 0xC81D #HANGUL SYLLABLE CIEUC E KIYEOK +0xC1A8 0xC820 #HANGUL SYLLABLE CIEUC E NIEUN +0xC1A9 0xC824 #HANGUL SYLLABLE CIEUC E RIEUL +0xC1AA 0xC82C #HANGUL SYLLABLE CIEUC E MIEUM +0xC1AB 0xC82D #HANGUL SYLLABLE CIEUC E PIEUP +0xC1AC 0xC82F #HANGUL SYLLABLE CIEUC E SIOS +0xC1AD 0xC831 #HANGUL SYLLABLE CIEUC E IEUNG +0xC1AE 0xC838 #HANGUL SYLLABLE CIEUC YEO +0xC1AF 0xC83C #HANGUL SYLLABLE CIEUC YEO NIEUN +0xC1B0 0xC840 #HANGUL SYLLABLE CIEUC YEO RIEUL +0xC1B1 0xC848 #HANGUL SYLLABLE CIEUC YEO MIEUM +0xC1B2 0xC849 #HANGUL SYLLABLE CIEUC YEO PIEUP +0xC1B3 0xC84C #HANGUL SYLLABLE CIEUC YEO SSANGSIOS +0xC1B4 0xC84D #HANGUL SYLLABLE CIEUC YEO IEUNG +0xC1B5 0xC854 #HANGUL SYLLABLE CIEUC YE +0xC1B6 0xC870 #HANGUL SYLLABLE CIEUC O +0xC1B7 0xC871 #HANGUL SYLLABLE CIEUC O KIYEOK +0xC1B8 0xC874 #HANGUL SYLLABLE CIEUC O NIEUN +0xC1B9 0xC878 #HANGUL SYLLABLE CIEUC O RIEUL +0xC1BA 0xC87A #HANGUL SYLLABLE CIEUC O RIEULMIEUM +0xC1BB 0xC880 #HANGUL SYLLABLE CIEUC O MIEUM +0xC1BC 0xC881 #HANGUL SYLLABLE CIEUC O PIEUP +0xC1BD 0xC883 #HANGUL SYLLABLE CIEUC O SIOS +0xC1BE 0xC885 #HANGUL SYLLABLE CIEUC O IEUNG +0xC1BF 0xC886 #HANGUL SYLLABLE CIEUC O CIEUC +0xC1C0 0xC887 #HANGUL SYLLABLE CIEUC O CHIEUCH +0xC1C1 0xC88B #HANGUL SYLLABLE CIEUC O HIEUH +0xC1C2 0xC88C #HANGUL SYLLABLE CIEUC WA +0xC1C3 0xC88D #HANGUL SYLLABLE CIEUC WA KIYEOK +0xC1C4 0xC894 #HANGUL SYLLABLE CIEUC WA RIEUL +0xC1C5 0xC89D #HANGUL SYLLABLE CIEUC WA PIEUP +0xC1C6 0xC89F #HANGUL SYLLABLE CIEUC WA SIOS +0xC1C7 0xC8A1 #HANGUL SYLLABLE CIEUC WA IEUNG +0xC1C8 0xC8A8 #HANGUL SYLLABLE CIEUC WAE +0xC1C9 0xC8BC #HANGUL SYLLABLE CIEUC WAE SSANGSIOS +0xC1CA 0xC8BD #HANGUL SYLLABLE CIEUC WAE IEUNG +0xC1CB 0xC8C4 #HANGUL SYLLABLE CIEUC OE +0xC1CC 0xC8C8 #HANGUL SYLLABLE CIEUC OE NIEUN +0xC1CD 0xC8CC #HANGUL SYLLABLE CIEUC OE RIEUL +0xC1CE 0xC8D4 #HANGUL SYLLABLE CIEUC OE MIEUM +0xC1CF 0xC8D5 #HANGUL SYLLABLE CIEUC OE PIEUP +0xC1D0 0xC8D7 #HANGUL SYLLABLE CIEUC OE SIOS +0xC1D1 0xC8D9 #HANGUL SYLLABLE CIEUC OE IEUNG +0xC1D2 0xC8E0 #HANGUL SYLLABLE CIEUC YO +0xC1D3 0xC8E1 #HANGUL SYLLABLE CIEUC YO KIYEOK +0xC1D4 0xC8E4 #HANGUL SYLLABLE CIEUC YO NIEUN +0xC1D5 0xC8F5 #HANGUL SYLLABLE CIEUC YO IEUNG +0xC1D6 0xC8FC #HANGUL SYLLABLE CIEUC U +0xC1D7 0xC8FD #HANGUL SYLLABLE CIEUC U KIYEOK +0xC1D8 0xC900 #HANGUL SYLLABLE CIEUC U NIEUN +0xC1D9 0xC904 #HANGUL SYLLABLE CIEUC U RIEUL +0xC1DA 0xC905 #HANGUL SYLLABLE CIEUC U RIEULKIYEOK +0xC1DB 0xC906 #HANGUL SYLLABLE CIEUC U RIEULMIEUM +0xC1DC 0xC90C #HANGUL SYLLABLE CIEUC U MIEUM +0xC1DD 0xC90D #HANGUL SYLLABLE CIEUC U PIEUP +0xC1DE 0xC90F #HANGUL SYLLABLE CIEUC U SIOS +0xC1DF 0xC911 #HANGUL SYLLABLE CIEUC U IEUNG +0xC1E0 0xC918 #HANGUL SYLLABLE CIEUC WEO +0xC1E1 0xC92C #HANGUL SYLLABLE CIEUC WEO SSANGSIOS +0xC1E2 0xC934 #HANGUL SYLLABLE CIEUC WE +0xC1E3 0xC950 #HANGUL SYLLABLE CIEUC WI +0xC1E4 0xC951 #HANGUL SYLLABLE CIEUC WI KIYEOK +0xC1E5 0xC954 #HANGUL SYLLABLE CIEUC WI NIEUN +0xC1E6 0xC958 #HANGUL SYLLABLE CIEUC WI RIEUL +0xC1E7 0xC960 #HANGUL SYLLABLE CIEUC WI MIEUM +0xC1E8 0xC961 #HANGUL SYLLABLE CIEUC WI PIEUP +0xC1E9 0xC963 #HANGUL SYLLABLE CIEUC WI SIOS +0xC1EA 0xC96C #HANGUL SYLLABLE CIEUC YU +0xC1EB 0xC970 #HANGUL SYLLABLE CIEUC YU NIEUN +0xC1EC 0xC974 #HANGUL SYLLABLE CIEUC YU RIEUL +0xC1ED 0xC97C #HANGUL SYLLABLE CIEUC YU MIEUM +0xC1EE 0xC988 #HANGUL SYLLABLE CIEUC EU +0xC1EF 0xC989 #HANGUL SYLLABLE CIEUC EU KIYEOK +0xC1F0 0xC98C #HANGUL SYLLABLE CIEUC EU NIEUN +0xC1F1 0xC990 #HANGUL SYLLABLE CIEUC EU RIEUL +0xC1F2 0xC998 #HANGUL SYLLABLE CIEUC EU MIEUM +0xC1F3 0xC999 #HANGUL SYLLABLE CIEUC EU PIEUP +0xC1F4 0xC99B #HANGUL SYLLABLE CIEUC EU SIOS +0xC1F5 0xC99D #HANGUL SYLLABLE CIEUC EU IEUNG +0xC1F6 0xC9C0 #HANGUL SYLLABLE CIEUC I +0xC1F7 0xC9C1 #HANGUL SYLLABLE CIEUC I KIYEOK +0xC1F8 0xC9C4 #HANGUL SYLLABLE CIEUC I NIEUN +0xC1F9 0xC9C7 #HANGUL SYLLABLE CIEUC I TIKEUT +0xC1FA 0xC9C8 #HANGUL SYLLABLE CIEUC I RIEUL +0xC1FB 0xC9CA #HANGUL SYLLABLE CIEUC I RIEULMIEUM +0xC1FC 0xC9D0 #HANGUL SYLLABLE CIEUC I MIEUM +0xC1FD 0xC9D1 #HANGUL SYLLABLE CIEUC I PIEUP +0xC1FE 0xC9D3 #HANGUL SYLLABLE CIEUC I SIOS +0xC241 0xD5CA #HANGUL SYLLABLE HIEUH EO SSANGKIYEOK +0xC242 0xD5CB #HANGUL SYLLABLE HIEUH EO KIYEOKSIOS +0xC243 0xD5CD #HANGUL SYLLABLE HIEUH EO NIEUNCIEUC +0xC244 0xD5CE #HANGUL SYLLABLE HIEUH EO NIEUNHIEUH +0xC245 0xD5CF #HANGUL SYLLABLE HIEUH EO TIKEUT +0xC246 0xD5D1 #HANGUL SYLLABLE HIEUH EO RIEULKIYEOK +0xC247 0xD5D3 #HANGUL SYLLABLE HIEUH EO RIEULPIEUP +0xC248 0xD5D4 #HANGUL SYLLABLE HIEUH EO RIEULSIOS +0xC249 0xD5D5 #HANGUL SYLLABLE HIEUH EO RIEULTHIEUTH +0xC24A 0xD5D6 #HANGUL SYLLABLE HIEUH EO RIEULPHIEUPH +0xC24B 0xD5D7 #HANGUL SYLLABLE HIEUH EO RIEULHIEUH +0xC24C 0xD5DA #HANGUL SYLLABLE HIEUH EO PIEUPSIOS +0xC24D 0xD5DC #HANGUL SYLLABLE HIEUH EO SSANGSIOS +0xC24E 0xD5DE #HANGUL SYLLABLE HIEUH EO CIEUC +0xC24F 0xD5DF #HANGUL SYLLABLE HIEUH EO CHIEUCH +0xC250 0xD5E0 #HANGUL SYLLABLE HIEUH EO KHIEUKH +0xC251 0xD5E1 #HANGUL SYLLABLE HIEUH EO THIEUTH +0xC252 0xD5E2 #HANGUL SYLLABLE HIEUH EO PHIEUPH +0xC253 0xD5E3 #HANGUL SYLLABLE HIEUH EO HIEUH +0xC254 0xD5E6 #HANGUL SYLLABLE HIEUH E SSANGKIYEOK +0xC255 0xD5E7 #HANGUL SYLLABLE HIEUH E KIYEOKSIOS +0xC256 0xD5E9 #HANGUL SYLLABLE HIEUH E NIEUNCIEUC +0xC257 0xD5EA #HANGUL SYLLABLE HIEUH E NIEUNHIEUH +0xC258 0xD5EB #HANGUL SYLLABLE HIEUH E TIKEUT +0xC259 0xD5ED #HANGUL SYLLABLE HIEUH E RIEULKIYEOK +0xC25A 0xD5EE #HANGUL SYLLABLE HIEUH E RIEULMIEUM +0xC261 0xD5EF #HANGUL SYLLABLE HIEUH E RIEULPIEUP +0xC262 0xD5F0 #HANGUL SYLLABLE HIEUH E RIEULSIOS +0xC263 0xD5F1 #HANGUL SYLLABLE HIEUH E RIEULTHIEUTH +0xC264 0xD5F2 #HANGUL SYLLABLE HIEUH E RIEULPHIEUPH +0xC265 0xD5F3 #HANGUL SYLLABLE HIEUH E RIEULHIEUH +0xC266 0xD5F6 #HANGUL SYLLABLE HIEUH E PIEUPSIOS +0xC267 0xD5F8 #HANGUL SYLLABLE HIEUH E SSANGSIOS +0xC268 0xD5FA #HANGUL SYLLABLE HIEUH E CIEUC +0xC269 0xD5FB #HANGUL SYLLABLE HIEUH E CHIEUCH +0xC26A 0xD5FC #HANGUL SYLLABLE HIEUH E KHIEUKH +0xC26B 0xD5FD #HANGUL SYLLABLE HIEUH E THIEUTH +0xC26C 0xD5FE #HANGUL SYLLABLE HIEUH E PHIEUPH +0xC26D 0xD5FF #HANGUL SYLLABLE HIEUH E HIEUH +0xC26E 0xD602 #HANGUL SYLLABLE HIEUH YEO SSANGKIYEOK +0xC26F 0xD603 #HANGUL SYLLABLE HIEUH YEO KIYEOKSIOS +0xC270 0xD605 #HANGUL SYLLABLE HIEUH YEO NIEUNCIEUC +0xC271 0xD606 #HANGUL SYLLABLE HIEUH YEO NIEUNHIEUH +0xC272 0xD607 #HANGUL SYLLABLE HIEUH YEO TIKEUT +0xC273 0xD609 #HANGUL SYLLABLE HIEUH YEO RIEULKIYEOK +0xC274 0xD60A #HANGUL SYLLABLE HIEUH YEO RIEULMIEUM +0xC275 0xD60B #HANGUL SYLLABLE HIEUH YEO RIEULPIEUP +0xC276 0xD60C #HANGUL SYLLABLE HIEUH YEO RIEULSIOS +0xC277 0xD60D #HANGUL SYLLABLE HIEUH YEO RIEULTHIEUTH +0xC278 0xD60E #HANGUL SYLLABLE HIEUH YEO RIEULPHIEUPH +0xC279 0xD60F #HANGUL SYLLABLE HIEUH YEO RIEULHIEUH +0xC27A 0xD612 #HANGUL SYLLABLE HIEUH YEO PIEUPSIOS +0xC281 0xD616 #HANGUL SYLLABLE HIEUH YEO CIEUC +0xC282 0xD617 #HANGUL SYLLABLE HIEUH YEO CHIEUCH +0xC283 0xD618 #HANGUL SYLLABLE HIEUH YEO KHIEUKH +0xC284 0xD619 #HANGUL SYLLABLE HIEUH YEO THIEUTH +0xC285 0xD61A #HANGUL SYLLABLE HIEUH YEO PHIEUPH +0xC286 0xD61B #HANGUL SYLLABLE HIEUH YEO HIEUH +0xC287 0xD61D #HANGUL SYLLABLE HIEUH YE KIYEOK +0xC288 0xD61E #HANGUL SYLLABLE HIEUH YE SSANGKIYEOK +0xC289 0xD61F #HANGUL SYLLABLE HIEUH YE KIYEOKSIOS +0xC28A 0xD621 #HANGUL SYLLABLE HIEUH YE NIEUNCIEUC +0xC28B 0xD622 #HANGUL SYLLABLE HIEUH YE NIEUNHIEUH +0xC28C 0xD623 #HANGUL SYLLABLE HIEUH YE TIKEUT +0xC28D 0xD625 #HANGUL SYLLABLE HIEUH YE RIEULKIYEOK +0xC28E 0xD626 #HANGUL SYLLABLE HIEUH YE RIEULMIEUM +0xC28F 0xD627 #HANGUL SYLLABLE HIEUH YE RIEULPIEUP +0xC290 0xD628 #HANGUL SYLLABLE HIEUH YE RIEULSIOS +0xC291 0xD629 #HANGUL SYLLABLE HIEUH YE RIEULTHIEUTH +0xC292 0xD62A #HANGUL SYLLABLE HIEUH YE RIEULPHIEUPH +0xC293 0xD62B #HANGUL SYLLABLE HIEUH YE RIEULHIEUH +0xC294 0xD62C #HANGUL SYLLABLE HIEUH YE MIEUM +0xC295 0xD62E #HANGUL SYLLABLE HIEUH YE PIEUPSIOS +0xC296 0xD62F #HANGUL SYLLABLE HIEUH YE SIOS +0xC297 0xD630 #HANGUL SYLLABLE HIEUH YE SSANGSIOS +0xC298 0xD631 #HANGUL SYLLABLE HIEUH YE IEUNG +0xC299 0xD632 #HANGUL SYLLABLE HIEUH YE CIEUC +0xC29A 0xD633 #HANGUL SYLLABLE HIEUH YE CHIEUCH +0xC29B 0xD634 #HANGUL SYLLABLE HIEUH YE KHIEUKH +0xC29C 0xD635 #HANGUL SYLLABLE HIEUH YE THIEUTH +0xC29D 0xD636 #HANGUL SYLLABLE HIEUH YE PHIEUPH +0xC29E 0xD637 #HANGUL SYLLABLE HIEUH YE HIEUH +0xC29F 0xD63A #HANGUL SYLLABLE HIEUH O SSANGKIYEOK +0xC2A0 0xD63B #HANGUL SYLLABLE HIEUH O KIYEOKSIOS +0xC2A1 0xC9D5 #HANGUL SYLLABLE CIEUC I IEUNG +0xC2A2 0xC9D6 #HANGUL SYLLABLE CIEUC I CIEUC +0xC2A3 0xC9D9 #HANGUL SYLLABLE CIEUC I THIEUTH +0xC2A4 0xC9DA #HANGUL SYLLABLE CIEUC I PHIEUPH +0xC2A5 0xC9DC #HANGUL SYLLABLE SSANGCIEUC A +0xC2A6 0xC9DD #HANGUL SYLLABLE SSANGCIEUC A KIYEOK +0xC2A7 0xC9E0 #HANGUL SYLLABLE SSANGCIEUC A NIEUN +0xC2A8 0xC9E2 #HANGUL SYLLABLE SSANGCIEUC A NIEUNHIEUH +0xC2A9 0xC9E4 #HANGUL SYLLABLE SSANGCIEUC A RIEUL +0xC2AA 0xC9E7 #HANGUL SYLLABLE SSANGCIEUC A RIEULPIEUP +0xC2AB 0xC9EC #HANGUL SYLLABLE SSANGCIEUC A MIEUM +0xC2AC 0xC9ED #HANGUL SYLLABLE SSANGCIEUC A PIEUP +0xC2AD 0xC9EF #HANGUL SYLLABLE SSANGCIEUC A SIOS +0xC2AE 0xC9F0 #HANGUL SYLLABLE SSANGCIEUC A SSANGSIOS +0xC2AF 0xC9F1 #HANGUL SYLLABLE SSANGCIEUC A IEUNG +0xC2B0 0xC9F8 #HANGUL SYLLABLE SSANGCIEUC AE +0xC2B1 0xC9F9 #HANGUL SYLLABLE SSANGCIEUC AE KIYEOK +0xC2B2 0xC9FC #HANGUL SYLLABLE SSANGCIEUC AE NIEUN +0xC2B3 0xCA00 #HANGUL SYLLABLE SSANGCIEUC AE RIEUL +0xC2B4 0xCA08 #HANGUL SYLLABLE SSANGCIEUC AE MIEUM +0xC2B5 0xCA09 #HANGUL SYLLABLE SSANGCIEUC AE PIEUP +0xC2B6 0xCA0B #HANGUL SYLLABLE SSANGCIEUC AE SIOS +0xC2B7 0xCA0C #HANGUL SYLLABLE SSANGCIEUC AE SSANGSIOS +0xC2B8 0xCA0D #HANGUL SYLLABLE SSANGCIEUC AE IEUNG +0xC2B9 0xCA14 #HANGUL SYLLABLE SSANGCIEUC YA +0xC2BA 0xCA18 #HANGUL SYLLABLE SSANGCIEUC YA NIEUN +0xC2BB 0xCA29 #HANGUL SYLLABLE SSANGCIEUC YA IEUNG +0xC2BC 0xCA4C #HANGUL SYLLABLE SSANGCIEUC EO +0xC2BD 0xCA4D #HANGUL SYLLABLE SSANGCIEUC EO KIYEOK +0xC2BE 0xCA50 #HANGUL SYLLABLE SSANGCIEUC EO NIEUN +0xC2BF 0xCA54 #HANGUL SYLLABLE SSANGCIEUC EO RIEUL +0xC2C0 0xCA5C #HANGUL SYLLABLE SSANGCIEUC EO MIEUM +0xC2C1 0xCA5D #HANGUL SYLLABLE SSANGCIEUC EO PIEUP +0xC2C2 0xCA5F #HANGUL SYLLABLE SSANGCIEUC EO SIOS +0xC2C3 0xCA60 #HANGUL SYLLABLE SSANGCIEUC EO SSANGSIOS +0xC2C4 0xCA61 #HANGUL SYLLABLE SSANGCIEUC EO IEUNG +0xC2C5 0xCA68 #HANGUL SYLLABLE SSANGCIEUC E +0xC2C6 0xCA7D #HANGUL SYLLABLE SSANGCIEUC E IEUNG +0xC2C7 0xCA84 #HANGUL SYLLABLE SSANGCIEUC YEO +0xC2C8 0xCA98 #HANGUL SYLLABLE SSANGCIEUC YEO SSANGSIOS +0xC2C9 0xCABC #HANGUL SYLLABLE SSANGCIEUC O +0xC2CA 0xCABD #HANGUL SYLLABLE SSANGCIEUC O KIYEOK +0xC2CB 0xCAC0 #HANGUL SYLLABLE SSANGCIEUC O NIEUN +0xC2CC 0xCAC4 #HANGUL SYLLABLE SSANGCIEUC O RIEUL +0xC2CD 0xCACC #HANGUL SYLLABLE SSANGCIEUC O MIEUM +0xC2CE 0xCACD #HANGUL SYLLABLE SSANGCIEUC O PIEUP +0xC2CF 0xCACF #HANGUL SYLLABLE SSANGCIEUC O SIOS +0xC2D0 0xCAD1 #HANGUL SYLLABLE SSANGCIEUC O IEUNG +0xC2D1 0xCAD3 #HANGUL SYLLABLE SSANGCIEUC O CHIEUCH +0xC2D2 0xCAD8 #HANGUL SYLLABLE SSANGCIEUC WA +0xC2D3 0xCAD9 #HANGUL SYLLABLE SSANGCIEUC WA KIYEOK +0xC2D4 0xCAE0 #HANGUL SYLLABLE SSANGCIEUC WA RIEUL +0xC2D5 0xCAEC #HANGUL SYLLABLE SSANGCIEUC WA SSANGSIOS +0xC2D6 0xCAF4 #HANGUL SYLLABLE SSANGCIEUC WAE +0xC2D7 0xCB08 #HANGUL SYLLABLE SSANGCIEUC WAE SSANGSIOS +0xC2D8 0xCB10 #HANGUL SYLLABLE SSANGCIEUC OE +0xC2D9 0xCB14 #HANGUL SYLLABLE SSANGCIEUC OE NIEUN +0xC2DA 0xCB18 #HANGUL SYLLABLE SSANGCIEUC OE RIEUL +0xC2DB 0xCB20 #HANGUL SYLLABLE SSANGCIEUC OE MIEUM +0xC2DC 0xCB21 #HANGUL SYLLABLE SSANGCIEUC OE PIEUP +0xC2DD 0xCB41 #HANGUL SYLLABLE SSANGCIEUC YO IEUNG +0xC2DE 0xCB48 #HANGUL SYLLABLE SSANGCIEUC U +0xC2DF 0xCB49 #HANGUL SYLLABLE SSANGCIEUC U KIYEOK +0xC2E0 0xCB4C #HANGUL SYLLABLE SSANGCIEUC U NIEUN +0xC2E1 0xCB50 #HANGUL SYLLABLE SSANGCIEUC U RIEUL +0xC2E2 0xCB58 #HANGUL SYLLABLE SSANGCIEUC U MIEUM +0xC2E3 0xCB59 #HANGUL SYLLABLE SSANGCIEUC U PIEUP +0xC2E4 0xCB5D #HANGUL SYLLABLE SSANGCIEUC U IEUNG +0xC2E5 0xCB64 #HANGUL SYLLABLE SSANGCIEUC WEO +0xC2E6 0xCB78 #HANGUL SYLLABLE SSANGCIEUC WEO SSANGSIOS +0xC2E7 0xCB79 #HANGUL SYLLABLE SSANGCIEUC WEO IEUNG +0xC2E8 0xCB9C #HANGUL SYLLABLE SSANGCIEUC WI +0xC2E9 0xCBB8 #HANGUL SYLLABLE SSANGCIEUC YU +0xC2EA 0xCBD4 #HANGUL SYLLABLE SSANGCIEUC EU +0xC2EB 0xCBE4 #HANGUL SYLLABLE SSANGCIEUC EU MIEUM +0xC2EC 0xCBE7 #HANGUL SYLLABLE SSANGCIEUC EU SIOS +0xC2ED 0xCBE9 #HANGUL SYLLABLE SSANGCIEUC EU IEUNG +0xC2EE 0xCC0C #HANGUL SYLLABLE SSANGCIEUC I +0xC2EF 0xCC0D #HANGUL SYLLABLE SSANGCIEUC I KIYEOK +0xC2F0 0xCC10 #HANGUL SYLLABLE SSANGCIEUC I NIEUN +0xC2F1 0xCC14 #HANGUL SYLLABLE SSANGCIEUC I RIEUL +0xC2F2 0xCC1C #HANGUL SYLLABLE SSANGCIEUC I MIEUM +0xC2F3 0xCC1D #HANGUL SYLLABLE SSANGCIEUC I PIEUP +0xC2F4 0xCC21 #HANGUL SYLLABLE SSANGCIEUC I IEUNG +0xC2F5 0xCC22 #HANGUL SYLLABLE SSANGCIEUC I CIEUC +0xC2F6 0xCC27 #HANGUL SYLLABLE SSANGCIEUC I HIEUH +0xC2F7 0xCC28 #HANGUL SYLLABLE CHIEUCH A +0xC2F8 0xCC29 #HANGUL SYLLABLE CHIEUCH A KIYEOK +0xC2F9 0xCC2C #HANGUL SYLLABLE CHIEUCH A NIEUN +0xC2FA 0xCC2E #HANGUL SYLLABLE CHIEUCH A NIEUNHIEUH +0xC2FB 0xCC30 #HANGUL SYLLABLE CHIEUCH A RIEUL +0xC2FC 0xCC38 #HANGUL SYLLABLE CHIEUCH A MIEUM +0xC2FD 0xCC39 #HANGUL SYLLABLE CHIEUCH A PIEUP +0xC2FE 0xCC3B #HANGUL SYLLABLE CHIEUCH A SIOS +0xC341 0xD63D #HANGUL SYLLABLE HIEUH O NIEUNCIEUC +0xC342 0xD63E #HANGUL SYLLABLE HIEUH O NIEUNHIEUH +0xC343 0xD63F #HANGUL SYLLABLE HIEUH O TIKEUT +0xC344 0xD641 #HANGUL SYLLABLE HIEUH O RIEULKIYEOK +0xC345 0xD642 #HANGUL SYLLABLE HIEUH O RIEULMIEUM +0xC346 0xD643 #HANGUL SYLLABLE HIEUH O RIEULPIEUP +0xC347 0xD644 #HANGUL SYLLABLE HIEUH O RIEULSIOS +0xC348 0xD646 #HANGUL SYLLABLE HIEUH O RIEULPHIEUPH +0xC349 0xD647 #HANGUL SYLLABLE HIEUH O RIEULHIEUH +0xC34A 0xD64A #HANGUL SYLLABLE HIEUH O PIEUPSIOS +0xC34B 0xD64C #HANGUL SYLLABLE HIEUH O SSANGSIOS +0xC34C 0xD64E #HANGUL SYLLABLE HIEUH O CIEUC +0xC34D 0xD64F #HANGUL SYLLABLE HIEUH O CHIEUCH +0xC34E 0xD650 #HANGUL SYLLABLE HIEUH O KHIEUKH +0xC34F 0xD652 #HANGUL SYLLABLE HIEUH O PHIEUPH +0xC350 0xD653 #HANGUL SYLLABLE HIEUH O HIEUH +0xC351 0xD656 #HANGUL SYLLABLE HIEUH WA SSANGKIYEOK +0xC352 0xD657 #HANGUL SYLLABLE HIEUH WA KIYEOKSIOS +0xC353 0xD659 #HANGUL SYLLABLE HIEUH WA NIEUNCIEUC +0xC354 0xD65A #HANGUL SYLLABLE HIEUH WA NIEUNHIEUH +0xC355 0xD65B #HANGUL SYLLABLE HIEUH WA TIKEUT +0xC356 0xD65D #HANGUL SYLLABLE HIEUH WA RIEULKIYEOK +0xC357 0xD65E #HANGUL SYLLABLE HIEUH WA RIEULMIEUM +0xC358 0xD65F #HANGUL SYLLABLE HIEUH WA RIEULPIEUP +0xC359 0xD660 #HANGUL SYLLABLE HIEUH WA RIEULSIOS +0xC35A 0xD661 #HANGUL SYLLABLE HIEUH WA RIEULTHIEUTH +0xC361 0xD662 #HANGUL SYLLABLE HIEUH WA RIEULPHIEUPH +0xC362 0xD663 #HANGUL SYLLABLE HIEUH WA RIEULHIEUH +0xC363 0xD664 #HANGUL SYLLABLE HIEUH WA MIEUM +0xC364 0xD665 #HANGUL SYLLABLE HIEUH WA PIEUP +0xC365 0xD666 #HANGUL SYLLABLE HIEUH WA PIEUPSIOS +0xC366 0xD668 #HANGUL SYLLABLE HIEUH WA SSANGSIOS +0xC367 0xD66A #HANGUL SYLLABLE HIEUH WA CIEUC +0xC368 0xD66B #HANGUL SYLLABLE HIEUH WA CHIEUCH +0xC369 0xD66C #HANGUL SYLLABLE HIEUH WA KHIEUKH +0xC36A 0xD66D #HANGUL SYLLABLE HIEUH WA THIEUTH +0xC36B 0xD66E #HANGUL SYLLABLE HIEUH WA PHIEUPH +0xC36C 0xD66F #HANGUL SYLLABLE HIEUH WA HIEUH +0xC36D 0xD672 #HANGUL SYLLABLE HIEUH WAE SSANGKIYEOK +0xC36E 0xD673 #HANGUL SYLLABLE HIEUH WAE KIYEOKSIOS +0xC36F 0xD675 #HANGUL SYLLABLE HIEUH WAE NIEUNCIEUC +0xC370 0xD676 #HANGUL SYLLABLE HIEUH WAE NIEUNHIEUH +0xC371 0xD677 #HANGUL SYLLABLE HIEUH WAE TIKEUT +0xC372 0xD678 #HANGUL SYLLABLE HIEUH WAE RIEUL +0xC373 0xD679 #HANGUL SYLLABLE HIEUH WAE RIEULKIYEOK +0xC374 0xD67A #HANGUL SYLLABLE HIEUH WAE RIEULMIEUM +0xC375 0xD67B #HANGUL SYLLABLE HIEUH WAE RIEULPIEUP +0xC376 0xD67C #HANGUL SYLLABLE HIEUH WAE RIEULSIOS +0xC377 0xD67D #HANGUL SYLLABLE HIEUH WAE RIEULTHIEUTH +0xC378 0xD67E #HANGUL SYLLABLE HIEUH WAE RIEULPHIEUPH +0xC379 0xD67F #HANGUL SYLLABLE HIEUH WAE RIEULHIEUH +0xC37A 0xD680 #HANGUL SYLLABLE HIEUH WAE MIEUM +0xC381 0xD681 #HANGUL SYLLABLE HIEUH WAE PIEUP +0xC382 0xD682 #HANGUL SYLLABLE HIEUH WAE PIEUPSIOS +0xC383 0xD684 #HANGUL SYLLABLE HIEUH WAE SSANGSIOS +0xC384 0xD686 #HANGUL SYLLABLE HIEUH WAE CIEUC +0xC385 0xD687 #HANGUL SYLLABLE HIEUH WAE CHIEUCH +0xC386 0xD688 #HANGUL SYLLABLE HIEUH WAE KHIEUKH +0xC387 0xD689 #HANGUL SYLLABLE HIEUH WAE THIEUTH +0xC388 0xD68A #HANGUL SYLLABLE HIEUH WAE PHIEUPH +0xC389 0xD68B #HANGUL SYLLABLE HIEUH WAE HIEUH +0xC38A 0xD68E #HANGUL SYLLABLE HIEUH OE SSANGKIYEOK +0xC38B 0xD68F #HANGUL SYLLABLE HIEUH OE KIYEOKSIOS +0xC38C 0xD691 #HANGUL SYLLABLE HIEUH OE NIEUNCIEUC +0xC38D 0xD692 #HANGUL SYLLABLE HIEUH OE NIEUNHIEUH +0xC38E 0xD693 #HANGUL SYLLABLE HIEUH OE TIKEUT +0xC38F 0xD695 #HANGUL SYLLABLE HIEUH OE RIEULKIYEOK +0xC390 0xD696 #HANGUL SYLLABLE HIEUH OE RIEULMIEUM +0xC391 0xD697 #HANGUL SYLLABLE HIEUH OE RIEULPIEUP +0xC392 0xD698 #HANGUL SYLLABLE HIEUH OE RIEULSIOS +0xC393 0xD699 #HANGUL SYLLABLE HIEUH OE RIEULTHIEUTH +0xC394 0xD69A #HANGUL SYLLABLE HIEUH OE RIEULPHIEUPH +0xC395 0xD69B #HANGUL SYLLABLE HIEUH OE RIEULHIEUH +0xC396 0xD69C #HANGUL SYLLABLE HIEUH OE MIEUM +0xC397 0xD69E #HANGUL SYLLABLE HIEUH OE PIEUPSIOS +0xC398 0xD6A0 #HANGUL SYLLABLE HIEUH OE SSANGSIOS +0xC399 0xD6A2 #HANGUL SYLLABLE HIEUH OE CIEUC +0xC39A 0xD6A3 #HANGUL SYLLABLE HIEUH OE CHIEUCH +0xC39B 0xD6A4 #HANGUL SYLLABLE HIEUH OE KHIEUKH +0xC39C 0xD6A5 #HANGUL SYLLABLE HIEUH OE THIEUTH +0xC39D 0xD6A6 #HANGUL SYLLABLE HIEUH OE PHIEUPH +0xC39E 0xD6A7 #HANGUL SYLLABLE HIEUH OE HIEUH +0xC39F 0xD6A9 #HANGUL SYLLABLE HIEUH YO KIYEOK +0xC3A0 0xD6AA #HANGUL SYLLABLE HIEUH YO SSANGKIYEOK +0xC3A1 0xCC3C #HANGUL SYLLABLE CHIEUCH A SSANGSIOS +0xC3A2 0xCC3D #HANGUL SYLLABLE CHIEUCH A IEUNG +0xC3A3 0xCC3E #HANGUL SYLLABLE CHIEUCH A CIEUC +0xC3A4 0xCC44 #HANGUL SYLLABLE CHIEUCH AE +0xC3A5 0xCC45 #HANGUL SYLLABLE CHIEUCH AE KIYEOK +0xC3A6 0xCC48 #HANGUL SYLLABLE CHIEUCH AE NIEUN +0xC3A7 0xCC4C #HANGUL SYLLABLE CHIEUCH AE RIEUL +0xC3A8 0xCC54 #HANGUL SYLLABLE CHIEUCH AE MIEUM +0xC3A9 0xCC55 #HANGUL SYLLABLE CHIEUCH AE PIEUP +0xC3AA 0xCC57 #HANGUL SYLLABLE CHIEUCH AE SIOS +0xC3AB 0xCC58 #HANGUL SYLLABLE CHIEUCH AE SSANGSIOS +0xC3AC 0xCC59 #HANGUL SYLLABLE CHIEUCH AE IEUNG +0xC3AD 0xCC60 #HANGUL SYLLABLE CHIEUCH YA +0xC3AE 0xCC64 #HANGUL SYLLABLE CHIEUCH YA NIEUN +0xC3AF 0xCC66 #HANGUL SYLLABLE CHIEUCH YA NIEUNHIEUH +0xC3B0 0xCC68 #HANGUL SYLLABLE CHIEUCH YA RIEUL +0xC3B1 0xCC70 #HANGUL SYLLABLE CHIEUCH YA MIEUM +0xC3B2 0xCC75 #HANGUL SYLLABLE CHIEUCH YA IEUNG +0xC3B3 0xCC98 #HANGUL SYLLABLE CHIEUCH EO +0xC3B4 0xCC99 #HANGUL SYLLABLE CHIEUCH EO KIYEOK +0xC3B5 0xCC9C #HANGUL SYLLABLE CHIEUCH EO NIEUN +0xC3B6 0xCCA0 #HANGUL SYLLABLE CHIEUCH EO RIEUL +0xC3B7 0xCCA8 #HANGUL SYLLABLE CHIEUCH EO MIEUM +0xC3B8 0xCCA9 #HANGUL SYLLABLE CHIEUCH EO PIEUP +0xC3B9 0xCCAB #HANGUL SYLLABLE CHIEUCH EO SIOS +0xC3BA 0xCCAC #HANGUL SYLLABLE CHIEUCH EO SSANGSIOS +0xC3BB 0xCCAD #HANGUL SYLLABLE CHIEUCH EO IEUNG +0xC3BC 0xCCB4 #HANGUL SYLLABLE CHIEUCH E +0xC3BD 0xCCB5 #HANGUL SYLLABLE CHIEUCH E KIYEOK +0xC3BE 0xCCB8 #HANGUL SYLLABLE CHIEUCH E NIEUN +0xC3BF 0xCCBC #HANGUL SYLLABLE CHIEUCH E RIEUL +0xC3C0 0xCCC4 #HANGUL SYLLABLE CHIEUCH E MIEUM +0xC3C1 0xCCC5 #HANGUL SYLLABLE CHIEUCH E PIEUP +0xC3C2 0xCCC7 #HANGUL SYLLABLE CHIEUCH E SIOS +0xC3C3 0xCCC9 #HANGUL SYLLABLE CHIEUCH E IEUNG +0xC3C4 0xCCD0 #HANGUL SYLLABLE CHIEUCH YEO +0xC3C5 0xCCD4 #HANGUL SYLLABLE CHIEUCH YEO NIEUN +0xC3C6 0xCCE4 #HANGUL SYLLABLE CHIEUCH YEO SSANGSIOS +0xC3C7 0xCCEC #HANGUL SYLLABLE CHIEUCH YE +0xC3C8 0xCCF0 #HANGUL SYLLABLE CHIEUCH YE NIEUN +0xC3C9 0xCD01 #HANGUL SYLLABLE CHIEUCH YE IEUNG +0xC3CA 0xCD08 #HANGUL SYLLABLE CHIEUCH O +0xC3CB 0xCD09 #HANGUL SYLLABLE CHIEUCH O KIYEOK +0xC3CC 0xCD0C #HANGUL SYLLABLE CHIEUCH O NIEUN +0xC3CD 0xCD10 #HANGUL SYLLABLE CHIEUCH O RIEUL +0xC3CE 0xCD18 #HANGUL SYLLABLE CHIEUCH O MIEUM +0xC3CF 0xCD19 #HANGUL SYLLABLE CHIEUCH O PIEUP +0xC3D0 0xCD1B #HANGUL SYLLABLE CHIEUCH O SIOS +0xC3D1 0xCD1D #HANGUL SYLLABLE CHIEUCH O IEUNG +0xC3D2 0xCD24 #HANGUL SYLLABLE CHIEUCH WA +0xC3D3 0xCD28 #HANGUL SYLLABLE CHIEUCH WA NIEUN +0xC3D4 0xCD2C #HANGUL SYLLABLE CHIEUCH WA RIEUL +0xC3D5 0xCD39 #HANGUL SYLLABLE CHIEUCH WA IEUNG +0xC3D6 0xCD5C #HANGUL SYLLABLE CHIEUCH OE +0xC3D7 0xCD60 #HANGUL SYLLABLE CHIEUCH OE NIEUN +0xC3D8 0xCD64 #HANGUL SYLLABLE CHIEUCH OE RIEUL +0xC3D9 0xCD6C #HANGUL SYLLABLE CHIEUCH OE MIEUM +0xC3DA 0xCD6D #HANGUL SYLLABLE CHIEUCH OE PIEUP +0xC3DB 0xCD6F #HANGUL SYLLABLE CHIEUCH OE SIOS +0xC3DC 0xCD71 #HANGUL SYLLABLE CHIEUCH OE IEUNG +0xC3DD 0xCD78 #HANGUL SYLLABLE CHIEUCH YO +0xC3DE 0xCD88 #HANGUL SYLLABLE CHIEUCH YO MIEUM +0xC3DF 0xCD94 #HANGUL SYLLABLE CHIEUCH U +0xC3E0 0xCD95 #HANGUL SYLLABLE CHIEUCH U KIYEOK +0xC3E1 0xCD98 #HANGUL SYLLABLE CHIEUCH U NIEUN +0xC3E2 0xCD9C #HANGUL SYLLABLE CHIEUCH U RIEUL +0xC3E3 0xCDA4 #HANGUL SYLLABLE CHIEUCH U MIEUM +0xC3E4 0xCDA5 #HANGUL SYLLABLE CHIEUCH U PIEUP +0xC3E5 0xCDA7 #HANGUL SYLLABLE CHIEUCH U SIOS +0xC3E6 0xCDA9 #HANGUL SYLLABLE CHIEUCH U IEUNG +0xC3E7 0xCDB0 #HANGUL SYLLABLE CHIEUCH WEO +0xC3E8 0xCDC4 #HANGUL SYLLABLE CHIEUCH WEO SSANGSIOS +0xC3E9 0xCDCC #HANGUL SYLLABLE CHIEUCH WE +0xC3EA 0xCDD0 #HANGUL SYLLABLE CHIEUCH WE NIEUN +0xC3EB 0xCDE8 #HANGUL SYLLABLE CHIEUCH WI +0xC3EC 0xCDEC #HANGUL SYLLABLE CHIEUCH WI NIEUN +0xC3ED 0xCDF0 #HANGUL SYLLABLE CHIEUCH WI RIEUL +0xC3EE 0xCDF8 #HANGUL SYLLABLE CHIEUCH WI MIEUM +0xC3EF 0xCDF9 #HANGUL SYLLABLE CHIEUCH WI PIEUP +0xC3F0 0xCDFB #HANGUL SYLLABLE CHIEUCH WI SIOS +0xC3F1 0xCDFD #HANGUL SYLLABLE CHIEUCH WI IEUNG +0xC3F2 0xCE04 #HANGUL SYLLABLE CHIEUCH YU +0xC3F3 0xCE08 #HANGUL SYLLABLE CHIEUCH YU NIEUN +0xC3F4 0xCE0C #HANGUL SYLLABLE CHIEUCH YU RIEUL +0xC3F5 0xCE14 #HANGUL SYLLABLE CHIEUCH YU MIEUM +0xC3F6 0xCE19 #HANGUL SYLLABLE CHIEUCH YU IEUNG +0xC3F7 0xCE20 #HANGUL SYLLABLE CHIEUCH EU +0xC3F8 0xCE21 #HANGUL SYLLABLE CHIEUCH EU KIYEOK +0xC3F9 0xCE24 #HANGUL SYLLABLE CHIEUCH EU NIEUN +0xC3FA 0xCE28 #HANGUL SYLLABLE CHIEUCH EU RIEUL +0xC3FB 0xCE30 #HANGUL SYLLABLE CHIEUCH EU MIEUM +0xC3FC 0xCE31 #HANGUL SYLLABLE CHIEUCH EU PIEUP +0xC3FD 0xCE33 #HANGUL SYLLABLE CHIEUCH EU SIOS +0xC3FE 0xCE35 #HANGUL SYLLABLE CHIEUCH EU IEUNG +0xC441 0xD6AB #HANGUL SYLLABLE HIEUH YO KIYEOKSIOS +0xC442 0xD6AD #HANGUL SYLLABLE HIEUH YO NIEUNCIEUC +0xC443 0xD6AE #HANGUL SYLLABLE HIEUH YO NIEUNHIEUH +0xC444 0xD6AF #HANGUL SYLLABLE HIEUH YO TIKEUT +0xC445 0xD6B1 #HANGUL SYLLABLE HIEUH YO RIEULKIYEOK +0xC446 0xD6B2 #HANGUL SYLLABLE HIEUH YO RIEULMIEUM +0xC447 0xD6B3 #HANGUL SYLLABLE HIEUH YO RIEULPIEUP +0xC448 0xD6B4 #HANGUL SYLLABLE HIEUH YO RIEULSIOS +0xC449 0xD6B5 #HANGUL SYLLABLE HIEUH YO RIEULTHIEUTH +0xC44A 0xD6B6 #HANGUL SYLLABLE HIEUH YO RIEULPHIEUPH +0xC44B 0xD6B7 #HANGUL SYLLABLE HIEUH YO RIEULHIEUH +0xC44C 0xD6B8 #HANGUL SYLLABLE HIEUH YO MIEUM +0xC44D 0xD6BA #HANGUL SYLLABLE HIEUH YO PIEUPSIOS +0xC44E 0xD6BC #HANGUL SYLLABLE HIEUH YO SSANGSIOS +0xC44F 0xD6BD #HANGUL SYLLABLE HIEUH YO IEUNG +0xC450 0xD6BE #HANGUL SYLLABLE HIEUH YO CIEUC +0xC451 0xD6BF #HANGUL SYLLABLE HIEUH YO CHIEUCH +0xC452 0xD6C0 #HANGUL SYLLABLE HIEUH YO KHIEUKH +0xC453 0xD6C1 #HANGUL SYLLABLE HIEUH YO THIEUTH +0xC454 0xD6C2 #HANGUL SYLLABLE HIEUH YO PHIEUPH +0xC455 0xD6C3 #HANGUL SYLLABLE HIEUH YO HIEUH +0xC456 0xD6C6 #HANGUL SYLLABLE HIEUH U SSANGKIYEOK +0xC457 0xD6C7 #HANGUL SYLLABLE HIEUH U KIYEOKSIOS +0xC458 0xD6C9 #HANGUL SYLLABLE HIEUH U NIEUNCIEUC +0xC459 0xD6CA #HANGUL SYLLABLE HIEUH U NIEUNHIEUH +0xC45A 0xD6CB #HANGUL SYLLABLE HIEUH U TIKEUT +0xC461 0xD6CD #HANGUL SYLLABLE HIEUH U RIEULKIYEOK +0xC462 0xD6CE #HANGUL SYLLABLE HIEUH U RIEULMIEUM +0xC463 0xD6CF #HANGUL SYLLABLE HIEUH U RIEULPIEUP +0xC464 0xD6D0 #HANGUL SYLLABLE HIEUH U RIEULSIOS +0xC465 0xD6D2 #HANGUL SYLLABLE HIEUH U RIEULPHIEUPH +0xC466 0xD6D3 #HANGUL SYLLABLE HIEUH U RIEULHIEUH +0xC467 0xD6D5 #HANGUL SYLLABLE HIEUH U PIEUP +0xC468 0xD6D6 #HANGUL SYLLABLE HIEUH U PIEUPSIOS +0xC469 0xD6D8 #HANGUL SYLLABLE HIEUH U SSANGSIOS +0xC46A 0xD6DA #HANGUL SYLLABLE HIEUH U CIEUC +0xC46B 0xD6DB #HANGUL SYLLABLE HIEUH U CHIEUCH +0xC46C 0xD6DC #HANGUL SYLLABLE HIEUH U KHIEUKH +0xC46D 0xD6DD #HANGUL SYLLABLE HIEUH U THIEUTH +0xC46E 0xD6DE #HANGUL SYLLABLE HIEUH U PHIEUPH +0xC46F 0xD6DF #HANGUL SYLLABLE HIEUH U HIEUH +0xC470 0xD6E1 #HANGUL SYLLABLE HIEUH WEO KIYEOK +0xC471 0xD6E2 #HANGUL SYLLABLE HIEUH WEO SSANGKIYEOK +0xC472 0xD6E3 #HANGUL SYLLABLE HIEUH WEO KIYEOKSIOS +0xC473 0xD6E5 #HANGUL SYLLABLE HIEUH WEO NIEUNCIEUC +0xC474 0xD6E6 #HANGUL SYLLABLE HIEUH WEO NIEUNHIEUH +0xC475 0xD6E7 #HANGUL SYLLABLE HIEUH WEO TIKEUT +0xC476 0xD6E9 #HANGUL SYLLABLE HIEUH WEO RIEULKIYEOK +0xC477 0xD6EA #HANGUL SYLLABLE HIEUH WEO RIEULMIEUM +0xC478 0xD6EB #HANGUL SYLLABLE HIEUH WEO RIEULPIEUP +0xC479 0xD6EC #HANGUL SYLLABLE HIEUH WEO RIEULSIOS +0xC47A 0xD6ED #HANGUL SYLLABLE HIEUH WEO RIEULTHIEUTH +0xC481 0xD6EE #HANGUL SYLLABLE HIEUH WEO RIEULPHIEUPH +0xC482 0xD6EF #HANGUL SYLLABLE HIEUH WEO RIEULHIEUH +0xC483 0xD6F1 #HANGUL SYLLABLE HIEUH WEO PIEUP +0xC484 0xD6F2 #HANGUL SYLLABLE HIEUH WEO PIEUPSIOS +0xC485 0xD6F3 #HANGUL SYLLABLE HIEUH WEO SIOS +0xC486 0xD6F4 #HANGUL SYLLABLE HIEUH WEO SSANGSIOS +0xC487 0xD6F6 #HANGUL SYLLABLE HIEUH WEO CIEUC +0xC488 0xD6F7 #HANGUL SYLLABLE HIEUH WEO CHIEUCH +0xC489 0xD6F8 #HANGUL SYLLABLE HIEUH WEO KHIEUKH +0xC48A 0xD6F9 #HANGUL SYLLABLE HIEUH WEO THIEUTH +0xC48B 0xD6FA #HANGUL SYLLABLE HIEUH WEO PHIEUPH +0xC48C 0xD6FB #HANGUL SYLLABLE HIEUH WEO HIEUH +0xC48D 0xD6FE #HANGUL SYLLABLE HIEUH WE SSANGKIYEOK +0xC48E 0xD6FF #HANGUL SYLLABLE HIEUH WE KIYEOKSIOS +0xC48F 0xD701 #HANGUL SYLLABLE HIEUH WE NIEUNCIEUC +0xC490 0xD702 #HANGUL SYLLABLE HIEUH WE NIEUNHIEUH +0xC491 0xD703 #HANGUL SYLLABLE HIEUH WE TIKEUT +0xC492 0xD705 #HANGUL SYLLABLE HIEUH WE RIEULKIYEOK +0xC493 0xD706 #HANGUL SYLLABLE HIEUH WE RIEULMIEUM +0xC494 0xD707 #HANGUL SYLLABLE HIEUH WE RIEULPIEUP +0xC495 0xD708 #HANGUL SYLLABLE HIEUH WE RIEULSIOS +0xC496 0xD709 #HANGUL SYLLABLE HIEUH WE RIEULTHIEUTH +0xC497 0xD70A #HANGUL SYLLABLE HIEUH WE RIEULPHIEUPH +0xC498 0xD70B #HANGUL SYLLABLE HIEUH WE RIEULHIEUH +0xC499 0xD70C #HANGUL SYLLABLE HIEUH WE MIEUM +0xC49A 0xD70D #HANGUL SYLLABLE HIEUH WE PIEUP +0xC49B 0xD70E #HANGUL SYLLABLE HIEUH WE PIEUPSIOS +0xC49C 0xD70F #HANGUL SYLLABLE HIEUH WE SIOS +0xC49D 0xD710 #HANGUL SYLLABLE HIEUH WE SSANGSIOS +0xC49E 0xD712 #HANGUL SYLLABLE HIEUH WE CIEUC +0xC49F 0xD713 #HANGUL SYLLABLE HIEUH WE CHIEUCH +0xC4A0 0xD714 #HANGUL SYLLABLE HIEUH WE KHIEUKH +0xC4A1 0xCE58 #HANGUL SYLLABLE CHIEUCH I +0xC4A2 0xCE59 #HANGUL SYLLABLE CHIEUCH I KIYEOK +0xC4A3 0xCE5C #HANGUL SYLLABLE CHIEUCH I NIEUN +0xC4A4 0xCE5F #HANGUL SYLLABLE CHIEUCH I TIKEUT +0xC4A5 0xCE60 #HANGUL SYLLABLE CHIEUCH I RIEUL +0xC4A6 0xCE61 #HANGUL SYLLABLE CHIEUCH I RIEULKIYEOK +0xC4A7 0xCE68 #HANGUL SYLLABLE CHIEUCH I MIEUM +0xC4A8 0xCE69 #HANGUL SYLLABLE CHIEUCH I PIEUP +0xC4A9 0xCE6B #HANGUL SYLLABLE CHIEUCH I SIOS +0xC4AA 0xCE6D #HANGUL SYLLABLE CHIEUCH I IEUNG +0xC4AB 0xCE74 #HANGUL SYLLABLE KHIEUKH A +0xC4AC 0xCE75 #HANGUL SYLLABLE KHIEUKH A KIYEOK +0xC4AD 0xCE78 #HANGUL SYLLABLE KHIEUKH A NIEUN +0xC4AE 0xCE7C #HANGUL SYLLABLE KHIEUKH A RIEUL +0xC4AF 0xCE84 #HANGUL SYLLABLE KHIEUKH A MIEUM +0xC4B0 0xCE85 #HANGUL SYLLABLE KHIEUKH A PIEUP +0xC4B1 0xCE87 #HANGUL SYLLABLE KHIEUKH A SIOS +0xC4B2 0xCE89 #HANGUL SYLLABLE KHIEUKH A IEUNG +0xC4B3 0xCE90 #HANGUL SYLLABLE KHIEUKH AE +0xC4B4 0xCE91 #HANGUL SYLLABLE KHIEUKH AE KIYEOK +0xC4B5 0xCE94 #HANGUL SYLLABLE KHIEUKH AE NIEUN +0xC4B6 0xCE98 #HANGUL SYLLABLE KHIEUKH AE RIEUL +0xC4B7 0xCEA0 #HANGUL SYLLABLE KHIEUKH AE MIEUM +0xC4B8 0xCEA1 #HANGUL SYLLABLE KHIEUKH AE PIEUP +0xC4B9 0xCEA3 #HANGUL SYLLABLE KHIEUKH AE SIOS +0xC4BA 0xCEA4 #HANGUL SYLLABLE KHIEUKH AE SSANGSIOS +0xC4BB 0xCEA5 #HANGUL SYLLABLE KHIEUKH AE IEUNG +0xC4BC 0xCEAC #HANGUL SYLLABLE KHIEUKH YA +0xC4BD 0xCEAD #HANGUL SYLLABLE KHIEUKH YA KIYEOK +0xC4BE 0xCEC1 #HANGUL SYLLABLE KHIEUKH YA IEUNG +0xC4BF 0xCEE4 #HANGUL SYLLABLE KHIEUKH EO +0xC4C0 0xCEE5 #HANGUL SYLLABLE KHIEUKH EO KIYEOK +0xC4C1 0xCEE8 #HANGUL SYLLABLE KHIEUKH EO NIEUN +0xC4C2 0xCEEB #HANGUL SYLLABLE KHIEUKH EO TIKEUT +0xC4C3 0xCEEC #HANGUL SYLLABLE KHIEUKH EO RIEUL +0xC4C4 0xCEF4 #HANGUL SYLLABLE KHIEUKH EO MIEUM +0xC4C5 0xCEF5 #HANGUL SYLLABLE KHIEUKH EO PIEUP +0xC4C6 0xCEF7 #HANGUL SYLLABLE KHIEUKH EO SIOS +0xC4C7 0xCEF8 #HANGUL SYLLABLE KHIEUKH EO SSANGSIOS +0xC4C8 0xCEF9 #HANGUL SYLLABLE KHIEUKH EO IEUNG +0xC4C9 0xCF00 #HANGUL SYLLABLE KHIEUKH E +0xC4CA 0xCF01 #HANGUL SYLLABLE KHIEUKH E KIYEOK +0xC4CB 0xCF04 #HANGUL SYLLABLE KHIEUKH E NIEUN +0xC4CC 0xCF08 #HANGUL SYLLABLE KHIEUKH E RIEUL +0xC4CD 0xCF10 #HANGUL SYLLABLE KHIEUKH E MIEUM +0xC4CE 0xCF11 #HANGUL SYLLABLE KHIEUKH E PIEUP +0xC4CF 0xCF13 #HANGUL SYLLABLE KHIEUKH E SIOS +0xC4D0 0xCF15 #HANGUL SYLLABLE KHIEUKH E IEUNG +0xC4D1 0xCF1C #HANGUL SYLLABLE KHIEUKH YEO +0xC4D2 0xCF20 #HANGUL SYLLABLE KHIEUKH YEO NIEUN +0xC4D3 0xCF24 #HANGUL SYLLABLE KHIEUKH YEO RIEUL +0xC4D4 0xCF2C #HANGUL SYLLABLE KHIEUKH YEO MIEUM +0xC4D5 0xCF2D #HANGUL SYLLABLE KHIEUKH YEO PIEUP +0xC4D6 0xCF2F #HANGUL SYLLABLE KHIEUKH YEO SIOS +0xC4D7 0xCF30 #HANGUL SYLLABLE KHIEUKH YEO SSANGSIOS +0xC4D8 0xCF31 #HANGUL SYLLABLE KHIEUKH YEO IEUNG +0xC4D9 0xCF38 #HANGUL SYLLABLE KHIEUKH YE +0xC4DA 0xCF54 #HANGUL SYLLABLE KHIEUKH O +0xC4DB 0xCF55 #HANGUL SYLLABLE KHIEUKH O KIYEOK +0xC4DC 0xCF58 #HANGUL SYLLABLE KHIEUKH O NIEUN +0xC4DD 0xCF5C #HANGUL SYLLABLE KHIEUKH O RIEUL +0xC4DE 0xCF64 #HANGUL SYLLABLE KHIEUKH O MIEUM +0xC4DF 0xCF65 #HANGUL SYLLABLE KHIEUKH O PIEUP +0xC4E0 0xCF67 #HANGUL SYLLABLE KHIEUKH O SIOS +0xC4E1 0xCF69 #HANGUL SYLLABLE KHIEUKH O IEUNG +0xC4E2 0xCF70 #HANGUL SYLLABLE KHIEUKH WA +0xC4E3 0xCF71 #HANGUL SYLLABLE KHIEUKH WA KIYEOK +0xC4E4 0xCF74 #HANGUL SYLLABLE KHIEUKH WA NIEUN +0xC4E5 0xCF78 #HANGUL SYLLABLE KHIEUKH WA RIEUL +0xC4E6 0xCF80 #HANGUL SYLLABLE KHIEUKH WA MIEUM +0xC4E7 0xCF85 #HANGUL SYLLABLE KHIEUKH WA IEUNG +0xC4E8 0xCF8C #HANGUL SYLLABLE KHIEUKH WAE +0xC4E9 0xCFA1 #HANGUL SYLLABLE KHIEUKH WAE IEUNG +0xC4EA 0xCFA8 #HANGUL SYLLABLE KHIEUKH OE +0xC4EB 0xCFB0 #HANGUL SYLLABLE KHIEUKH OE RIEUL +0xC4EC 0xCFC4 #HANGUL SYLLABLE KHIEUKH YO +0xC4ED 0xCFE0 #HANGUL SYLLABLE KHIEUKH U +0xC4EE 0xCFE1 #HANGUL SYLLABLE KHIEUKH U KIYEOK +0xC4EF 0xCFE4 #HANGUL SYLLABLE KHIEUKH U NIEUN +0xC4F0 0xCFE8 #HANGUL SYLLABLE KHIEUKH U RIEUL +0xC4F1 0xCFF0 #HANGUL SYLLABLE KHIEUKH U MIEUM +0xC4F2 0xCFF1 #HANGUL SYLLABLE KHIEUKH U PIEUP +0xC4F3 0xCFF3 #HANGUL SYLLABLE KHIEUKH U SIOS +0xC4F4 0xCFF5 #HANGUL SYLLABLE KHIEUKH U IEUNG +0xC4F5 0xCFFC #HANGUL SYLLABLE KHIEUKH WEO +0xC4F6 0xD000 #HANGUL SYLLABLE KHIEUKH WEO NIEUN +0xC4F7 0xD004 #HANGUL SYLLABLE KHIEUKH WEO RIEUL +0xC4F8 0xD011 #HANGUL SYLLABLE KHIEUKH WEO IEUNG +0xC4F9 0xD018 #HANGUL SYLLABLE KHIEUKH WE +0xC4FA 0xD02D #HANGUL SYLLABLE KHIEUKH WE IEUNG +0xC4FB 0xD034 #HANGUL SYLLABLE KHIEUKH WI +0xC4FC 0xD035 #HANGUL SYLLABLE KHIEUKH WI KIYEOK +0xC4FD 0xD038 #HANGUL SYLLABLE KHIEUKH WI NIEUN +0xC4FE 0xD03C #HANGUL SYLLABLE KHIEUKH WI RIEUL +0xC541 0xD715 #HANGUL SYLLABLE HIEUH WE THIEUTH +0xC542 0xD716 #HANGUL SYLLABLE HIEUH WE PHIEUPH +0xC543 0xD717 #HANGUL SYLLABLE HIEUH WE HIEUH +0xC544 0xD71A #HANGUL SYLLABLE HIEUH WI SSANGKIYEOK +0xC545 0xD71B #HANGUL SYLLABLE HIEUH WI KIYEOKSIOS +0xC546 0xD71D #HANGUL SYLLABLE HIEUH WI NIEUNCIEUC +0xC547 0xD71E #HANGUL SYLLABLE HIEUH WI NIEUNHIEUH +0xC548 0xD71F #HANGUL SYLLABLE HIEUH WI TIKEUT +0xC549 0xD721 #HANGUL SYLLABLE HIEUH WI RIEULKIYEOK +0xC54A 0xD722 #HANGUL SYLLABLE HIEUH WI RIEULMIEUM +0xC54B 0xD723 #HANGUL SYLLABLE HIEUH WI RIEULPIEUP +0xC54C 0xD724 #HANGUL SYLLABLE HIEUH WI RIEULSIOS +0xC54D 0xD725 #HANGUL SYLLABLE HIEUH WI RIEULTHIEUTH +0xC54E 0xD726 #HANGUL SYLLABLE HIEUH WI RIEULPHIEUPH +0xC54F 0xD727 #HANGUL SYLLABLE HIEUH WI RIEULHIEUH +0xC550 0xD72A #HANGUL SYLLABLE HIEUH WI PIEUPSIOS +0xC551 0xD72C #HANGUL SYLLABLE HIEUH WI SSANGSIOS +0xC552 0xD72E #HANGUL SYLLABLE HIEUH WI CIEUC +0xC553 0xD72F #HANGUL SYLLABLE HIEUH WI CHIEUCH +0xC554 0xD730 #HANGUL SYLLABLE HIEUH WI KHIEUKH +0xC555 0xD731 #HANGUL SYLLABLE HIEUH WI THIEUTH +0xC556 0xD732 #HANGUL SYLLABLE HIEUH WI PHIEUPH +0xC557 0xD733 #HANGUL SYLLABLE HIEUH WI HIEUH +0xC558 0xD736 #HANGUL SYLLABLE HIEUH YU SSANGKIYEOK +0xC559 0xD737 #HANGUL SYLLABLE HIEUH YU KIYEOKSIOS +0xC55A 0xD739 #HANGUL SYLLABLE HIEUH YU NIEUNCIEUC +0xC561 0xD73A #HANGUL SYLLABLE HIEUH YU NIEUNHIEUH +0xC562 0xD73B #HANGUL SYLLABLE HIEUH YU TIKEUT +0xC563 0xD73D #HANGUL SYLLABLE HIEUH YU RIEULKIYEOK +0xC564 0xD73E #HANGUL SYLLABLE HIEUH YU RIEULMIEUM +0xC565 0xD73F #HANGUL SYLLABLE HIEUH YU RIEULPIEUP +0xC566 0xD740 #HANGUL SYLLABLE HIEUH YU RIEULSIOS +0xC567 0xD741 #HANGUL SYLLABLE HIEUH YU RIEULTHIEUTH +0xC568 0xD742 #HANGUL SYLLABLE HIEUH YU RIEULPHIEUPH +0xC569 0xD743 #HANGUL SYLLABLE HIEUH YU RIEULHIEUH +0xC56A 0xD745 #HANGUL SYLLABLE HIEUH YU PIEUP +0xC56B 0xD746 #HANGUL SYLLABLE HIEUH YU PIEUPSIOS +0xC56C 0xD748 #HANGUL SYLLABLE HIEUH YU SSANGSIOS +0xC56D 0xD74A #HANGUL SYLLABLE HIEUH YU CIEUC +0xC56E 0xD74B #HANGUL SYLLABLE HIEUH YU CHIEUCH +0xC56F 0xD74C #HANGUL SYLLABLE HIEUH YU KHIEUKH +0xC570 0xD74D #HANGUL SYLLABLE HIEUH YU THIEUTH +0xC571 0xD74E #HANGUL SYLLABLE HIEUH YU PHIEUPH +0xC572 0xD74F #HANGUL SYLLABLE HIEUH YU HIEUH +0xC573 0xD752 #HANGUL SYLLABLE HIEUH EU SSANGKIYEOK +0xC574 0xD753 #HANGUL SYLLABLE HIEUH EU KIYEOKSIOS +0xC575 0xD755 #HANGUL SYLLABLE HIEUH EU NIEUNCIEUC +0xC576 0xD75A #HANGUL SYLLABLE HIEUH EU RIEULMIEUM +0xC577 0xD75B #HANGUL SYLLABLE HIEUH EU RIEULPIEUP +0xC578 0xD75C #HANGUL SYLLABLE HIEUH EU RIEULSIOS +0xC579 0xD75D #HANGUL SYLLABLE HIEUH EU RIEULTHIEUTH +0xC57A 0xD75E #HANGUL SYLLABLE HIEUH EU RIEULPHIEUPH +0xC581 0xD75F #HANGUL SYLLABLE HIEUH EU RIEULHIEUH +0xC582 0xD762 #HANGUL SYLLABLE HIEUH EU PIEUPSIOS +0xC583 0xD764 #HANGUL SYLLABLE HIEUH EU SSANGSIOS +0xC584 0xD766 #HANGUL SYLLABLE HIEUH EU CIEUC +0xC585 0xD767 #HANGUL SYLLABLE HIEUH EU CHIEUCH +0xC586 0xD768 #HANGUL SYLLABLE HIEUH EU KHIEUKH +0xC587 0xD76A #HANGUL SYLLABLE HIEUH EU PHIEUPH +0xC588 0xD76B #HANGUL SYLLABLE HIEUH EU HIEUH +0xC589 0xD76D #HANGUL SYLLABLE HIEUH YI KIYEOK +0xC58A 0xD76E #HANGUL SYLLABLE HIEUH YI SSANGKIYEOK +0xC58B 0xD76F #HANGUL SYLLABLE HIEUH YI KIYEOKSIOS +0xC58C 0xD771 #HANGUL SYLLABLE HIEUH YI NIEUNCIEUC +0xC58D 0xD772 #HANGUL SYLLABLE HIEUH YI NIEUNHIEUH +0xC58E 0xD773 #HANGUL SYLLABLE HIEUH YI TIKEUT +0xC58F 0xD775 #HANGUL SYLLABLE HIEUH YI RIEULKIYEOK +0xC590 0xD776 #HANGUL SYLLABLE HIEUH YI RIEULMIEUM +0xC591 0xD777 #HANGUL SYLLABLE HIEUH YI RIEULPIEUP +0xC592 0xD778 #HANGUL SYLLABLE HIEUH YI RIEULSIOS +0xC593 0xD779 #HANGUL SYLLABLE HIEUH YI RIEULTHIEUTH +0xC594 0xD77A #HANGUL SYLLABLE HIEUH YI RIEULPHIEUPH +0xC595 0xD77B #HANGUL SYLLABLE HIEUH YI RIEULHIEUH +0xC596 0xD77E #HANGUL SYLLABLE HIEUH YI PIEUPSIOS +0xC597 0xD77F #HANGUL SYLLABLE HIEUH YI SIOS +0xC598 0xD780 #HANGUL SYLLABLE HIEUH YI SSANGSIOS +0xC599 0xD782 #HANGUL SYLLABLE HIEUH YI CIEUC +0xC59A 0xD783 #HANGUL SYLLABLE HIEUH YI CHIEUCH +0xC59B 0xD784 #HANGUL SYLLABLE HIEUH YI KHIEUKH +0xC59C 0xD785 #HANGUL SYLLABLE HIEUH YI THIEUTH +0xC59D 0xD786 #HANGUL SYLLABLE HIEUH YI PHIEUPH +0xC59E 0xD787 #HANGUL SYLLABLE HIEUH YI HIEUH +0xC59F 0xD78A #HANGUL SYLLABLE HIEUH I SSANGKIYEOK +0xC5A0 0xD78B #HANGUL SYLLABLE HIEUH I KIYEOKSIOS +0xC5A1 0xD044 #HANGUL SYLLABLE KHIEUKH WI MIEUM +0xC5A2 0xD045 #HANGUL SYLLABLE KHIEUKH WI PIEUP +0xC5A3 0xD047 #HANGUL SYLLABLE KHIEUKH WI SIOS +0xC5A4 0xD049 #HANGUL SYLLABLE KHIEUKH WI IEUNG +0xC5A5 0xD050 #HANGUL SYLLABLE KHIEUKH YU +0xC5A6 0xD054 #HANGUL SYLLABLE KHIEUKH YU NIEUN +0xC5A7 0xD058 #HANGUL SYLLABLE KHIEUKH YU RIEUL +0xC5A8 0xD060 #HANGUL SYLLABLE KHIEUKH YU MIEUM +0xC5A9 0xD06C #HANGUL SYLLABLE KHIEUKH EU +0xC5AA 0xD06D #HANGUL SYLLABLE KHIEUKH EU KIYEOK +0xC5AB 0xD070 #HANGUL SYLLABLE KHIEUKH EU NIEUN +0xC5AC 0xD074 #HANGUL SYLLABLE KHIEUKH EU RIEUL +0xC5AD 0xD07C #HANGUL SYLLABLE KHIEUKH EU MIEUM +0xC5AE 0xD07D #HANGUL SYLLABLE KHIEUKH EU PIEUP +0xC5AF 0xD081 #HANGUL SYLLABLE KHIEUKH EU IEUNG +0xC5B0 0xD0A4 #HANGUL SYLLABLE KHIEUKH I +0xC5B1 0xD0A5 #HANGUL SYLLABLE KHIEUKH I KIYEOK +0xC5B2 0xD0A8 #HANGUL SYLLABLE KHIEUKH I NIEUN +0xC5B3 0xD0AC #HANGUL SYLLABLE KHIEUKH I RIEUL +0xC5B4 0xD0B4 #HANGUL SYLLABLE KHIEUKH I MIEUM +0xC5B5 0xD0B5 #HANGUL SYLLABLE KHIEUKH I PIEUP +0xC5B6 0xD0B7 #HANGUL SYLLABLE KHIEUKH I SIOS +0xC5B7 0xD0B9 #HANGUL SYLLABLE KHIEUKH I IEUNG +0xC5B8 0xD0C0 #HANGUL SYLLABLE THIEUTH A +0xC5B9 0xD0C1 #HANGUL SYLLABLE THIEUTH A KIYEOK +0xC5BA 0xD0C4 #HANGUL SYLLABLE THIEUTH A NIEUN +0xC5BB 0xD0C8 #HANGUL SYLLABLE THIEUTH A RIEUL +0xC5BC 0xD0C9 #HANGUL SYLLABLE THIEUTH A RIEULKIYEOK +0xC5BD 0xD0D0 #HANGUL SYLLABLE THIEUTH A MIEUM +0xC5BE 0xD0D1 #HANGUL SYLLABLE THIEUTH A PIEUP +0xC5BF 0xD0D3 #HANGUL SYLLABLE THIEUTH A SIOS +0xC5C0 0xD0D4 #HANGUL SYLLABLE THIEUTH A SSANGSIOS +0xC5C1 0xD0D5 #HANGUL SYLLABLE THIEUTH A IEUNG +0xC5C2 0xD0DC #HANGUL SYLLABLE THIEUTH AE +0xC5C3 0xD0DD #HANGUL SYLLABLE THIEUTH AE KIYEOK +0xC5C4 0xD0E0 #HANGUL SYLLABLE THIEUTH AE NIEUN +0xC5C5 0xD0E4 #HANGUL SYLLABLE THIEUTH AE RIEUL +0xC5C6 0xD0EC #HANGUL SYLLABLE THIEUTH AE MIEUM +0xC5C7 0xD0ED #HANGUL SYLLABLE THIEUTH AE PIEUP +0xC5C8 0xD0EF #HANGUL SYLLABLE THIEUTH AE SIOS +0xC5C9 0xD0F0 #HANGUL SYLLABLE THIEUTH AE SSANGSIOS +0xC5CA 0xD0F1 #HANGUL SYLLABLE THIEUTH AE IEUNG +0xC5CB 0xD0F8 #HANGUL SYLLABLE THIEUTH YA +0xC5CC 0xD10D #HANGUL SYLLABLE THIEUTH YA IEUNG +0xC5CD 0xD130 #HANGUL SYLLABLE THIEUTH EO +0xC5CE 0xD131 #HANGUL SYLLABLE THIEUTH EO KIYEOK +0xC5CF 0xD134 #HANGUL SYLLABLE THIEUTH EO NIEUN +0xC5D0 0xD138 #HANGUL SYLLABLE THIEUTH EO RIEUL +0xC5D1 0xD13A #HANGUL SYLLABLE THIEUTH EO RIEULMIEUM +0xC5D2 0xD140 #HANGUL SYLLABLE THIEUTH EO MIEUM +0xC5D3 0xD141 #HANGUL SYLLABLE THIEUTH EO PIEUP +0xC5D4 0xD143 #HANGUL SYLLABLE THIEUTH EO SIOS +0xC5D5 0xD144 #HANGUL SYLLABLE THIEUTH EO SSANGSIOS +0xC5D6 0xD145 #HANGUL SYLLABLE THIEUTH EO IEUNG +0xC5D7 0xD14C #HANGUL SYLLABLE THIEUTH E +0xC5D8 0xD14D #HANGUL SYLLABLE THIEUTH E KIYEOK +0xC5D9 0xD150 #HANGUL SYLLABLE THIEUTH E NIEUN +0xC5DA 0xD154 #HANGUL SYLLABLE THIEUTH E RIEUL +0xC5DB 0xD15C #HANGUL SYLLABLE THIEUTH E MIEUM +0xC5DC 0xD15D #HANGUL SYLLABLE THIEUTH E PIEUP +0xC5DD 0xD15F #HANGUL SYLLABLE THIEUTH E SIOS +0xC5DE 0xD161 #HANGUL SYLLABLE THIEUTH E IEUNG +0xC5DF 0xD168 #HANGUL SYLLABLE THIEUTH YEO +0xC5E0 0xD16C #HANGUL SYLLABLE THIEUTH YEO NIEUN +0xC5E1 0xD17C #HANGUL SYLLABLE THIEUTH YEO SSANGSIOS +0xC5E2 0xD184 #HANGUL SYLLABLE THIEUTH YE +0xC5E3 0xD188 #HANGUL SYLLABLE THIEUTH YE NIEUN +0xC5E4 0xD1A0 #HANGUL SYLLABLE THIEUTH O +0xC5E5 0xD1A1 #HANGUL SYLLABLE THIEUTH O KIYEOK +0xC5E6 0xD1A4 #HANGUL SYLLABLE THIEUTH O NIEUN +0xC5E7 0xD1A8 #HANGUL SYLLABLE THIEUTH O RIEUL +0xC5E8 0xD1B0 #HANGUL SYLLABLE THIEUTH O MIEUM +0xC5E9 0xD1B1 #HANGUL SYLLABLE THIEUTH O PIEUP +0xC5EA 0xD1B3 #HANGUL SYLLABLE THIEUTH O SIOS +0xC5EB 0xD1B5 #HANGUL SYLLABLE THIEUTH O IEUNG +0xC5EC 0xD1BA #HANGUL SYLLABLE THIEUTH O PHIEUPH +0xC5ED 0xD1BC #HANGUL SYLLABLE THIEUTH WA +0xC5EE 0xD1C0 #HANGUL SYLLABLE THIEUTH WA NIEUN +0xC5EF 0xD1D8 #HANGUL SYLLABLE THIEUTH WAE +0xC5F0 0xD1F4 #HANGUL SYLLABLE THIEUTH OE +0xC5F1 0xD1F8 #HANGUL SYLLABLE THIEUTH OE NIEUN +0xC5F2 0xD207 #HANGUL SYLLABLE THIEUTH OE SIOS +0xC5F3 0xD209 #HANGUL SYLLABLE THIEUTH OE IEUNG +0xC5F4 0xD210 #HANGUL SYLLABLE THIEUTH YO +0xC5F5 0xD22C #HANGUL SYLLABLE THIEUTH U +0xC5F6 0xD22D #HANGUL SYLLABLE THIEUTH U KIYEOK +0xC5F7 0xD230 #HANGUL SYLLABLE THIEUTH U NIEUN +0xC5F8 0xD234 #HANGUL SYLLABLE THIEUTH U RIEUL +0xC5F9 0xD23C #HANGUL SYLLABLE THIEUTH U MIEUM +0xC5FA 0xD23D #HANGUL SYLLABLE THIEUTH U PIEUP +0xC5FB 0xD23F #HANGUL SYLLABLE THIEUTH U SIOS +0xC5FC 0xD241 #HANGUL SYLLABLE THIEUTH U IEUNG +0xC5FD 0xD248 #HANGUL SYLLABLE THIEUTH WEO +0xC5FE 0xD25C #HANGUL SYLLABLE THIEUTH WEO SSANGSIOS +0xC641 0xD78D #HANGUL SYLLABLE HIEUH I NIEUNCIEUC +0xC642 0xD78E #HANGUL SYLLABLE HIEUH I NIEUNHIEUH +0xC643 0xD78F #HANGUL SYLLABLE HIEUH I TIKEUT +0xC644 0xD791 #HANGUL SYLLABLE HIEUH I RIEULKIYEOK +0xC645 0xD792 #HANGUL SYLLABLE HIEUH I RIEULMIEUM +0xC646 0xD793 #HANGUL SYLLABLE HIEUH I RIEULPIEUP +0xC647 0xD794 #HANGUL SYLLABLE HIEUH I RIEULSIOS +0xC648 0xD795 #HANGUL SYLLABLE HIEUH I RIEULTHIEUTH +0xC649 0xD796 #HANGUL SYLLABLE HIEUH I RIEULPHIEUPH +0xC64A 0xD797 #HANGUL SYLLABLE HIEUH I RIEULHIEUH +0xC64B 0xD79A #HANGUL SYLLABLE HIEUH I PIEUPSIOS +0xC64C 0xD79C #HANGUL SYLLABLE HIEUH I SSANGSIOS +0xC64D 0xD79E #HANGUL SYLLABLE HIEUH I CIEUC +0xC64E 0xD79F #HANGUL SYLLABLE HIEUH I CHIEUCH +0xC64F 0xD7A0 #HANGUL SYLLABLE HIEUH I KHIEUKH +0xC650 0xD7A1 #HANGUL SYLLABLE HIEUH I THIEUTH +0xC651 0xD7A2 #HANGUL SYLLABLE HIEUH I PHIEUPH +0xC652 0xD7A3 #HANGUL SYLLABLE HIEUH I HIEUH +0xC6A1 0xD264 #HANGUL SYLLABLE THIEUTH WE +0xC6A2 0xD280 #HANGUL SYLLABLE THIEUTH WI +0xC6A3 0xD281 #HANGUL SYLLABLE THIEUTH WI KIYEOK +0xC6A4 0xD284 #HANGUL SYLLABLE THIEUTH WI NIEUN +0xC6A5 0xD288 #HANGUL SYLLABLE THIEUTH WI RIEUL +0xC6A6 0xD290 #HANGUL SYLLABLE THIEUTH WI MIEUM +0xC6A7 0xD291 #HANGUL SYLLABLE THIEUTH WI PIEUP +0xC6A8 0xD295 #HANGUL SYLLABLE THIEUTH WI IEUNG +0xC6A9 0xD29C #HANGUL SYLLABLE THIEUTH YU +0xC6AA 0xD2A0 #HANGUL SYLLABLE THIEUTH YU NIEUN +0xC6AB 0xD2A4 #HANGUL SYLLABLE THIEUTH YU RIEUL +0xC6AC 0xD2AC #HANGUL SYLLABLE THIEUTH YU MIEUM +0xC6AD 0xD2B1 #HANGUL SYLLABLE THIEUTH YU IEUNG +0xC6AE 0xD2B8 #HANGUL SYLLABLE THIEUTH EU +0xC6AF 0xD2B9 #HANGUL SYLLABLE THIEUTH EU KIYEOK +0xC6B0 0xD2BC #HANGUL SYLLABLE THIEUTH EU NIEUN +0xC6B1 0xD2BF #HANGUL SYLLABLE THIEUTH EU TIKEUT +0xC6B2 0xD2C0 #HANGUL SYLLABLE THIEUTH EU RIEUL +0xC6B3 0xD2C2 #HANGUL SYLLABLE THIEUTH EU RIEULMIEUM +0xC6B4 0xD2C8 #HANGUL SYLLABLE THIEUTH EU MIEUM +0xC6B5 0xD2C9 #HANGUL SYLLABLE THIEUTH EU PIEUP +0xC6B6 0xD2CB #HANGUL SYLLABLE THIEUTH EU SIOS +0xC6B7 0xD2D4 #HANGUL SYLLABLE THIEUTH YI +0xC6B8 0xD2D8 #HANGUL SYLLABLE THIEUTH YI NIEUN +0xC6B9 0xD2DC #HANGUL SYLLABLE THIEUTH YI RIEUL +0xC6BA 0xD2E4 #HANGUL SYLLABLE THIEUTH YI MIEUM +0xC6BB 0xD2E5 #HANGUL SYLLABLE THIEUTH YI PIEUP +0xC6BC 0xD2F0 #HANGUL SYLLABLE THIEUTH I +0xC6BD 0xD2F1 #HANGUL SYLLABLE THIEUTH I KIYEOK +0xC6BE 0xD2F4 #HANGUL SYLLABLE THIEUTH I NIEUN +0xC6BF 0xD2F8 #HANGUL SYLLABLE THIEUTH I RIEUL +0xC6C0 0xD300 #HANGUL SYLLABLE THIEUTH I MIEUM +0xC6C1 0xD301 #HANGUL SYLLABLE THIEUTH I PIEUP +0xC6C2 0xD303 #HANGUL SYLLABLE THIEUTH I SIOS +0xC6C3 0xD305 #HANGUL SYLLABLE THIEUTH I IEUNG +0xC6C4 0xD30C #HANGUL SYLLABLE PHIEUPH A +0xC6C5 0xD30D #HANGUL SYLLABLE PHIEUPH A KIYEOK +0xC6C6 0xD30E #HANGUL SYLLABLE PHIEUPH A SSANGKIYEOK +0xC6C7 0xD310 #HANGUL SYLLABLE PHIEUPH A NIEUN +0xC6C8 0xD314 #HANGUL SYLLABLE PHIEUPH A RIEUL +0xC6C9 0xD316 #HANGUL SYLLABLE PHIEUPH A RIEULMIEUM +0xC6CA 0xD31C #HANGUL SYLLABLE PHIEUPH A MIEUM +0xC6CB 0xD31D #HANGUL SYLLABLE PHIEUPH A PIEUP +0xC6CC 0xD31F #HANGUL SYLLABLE PHIEUPH A SIOS +0xC6CD 0xD320 #HANGUL SYLLABLE PHIEUPH A SSANGSIOS +0xC6CE 0xD321 #HANGUL SYLLABLE PHIEUPH A IEUNG +0xC6CF 0xD325 #HANGUL SYLLABLE PHIEUPH A THIEUTH +0xC6D0 0xD328 #HANGUL SYLLABLE PHIEUPH AE +0xC6D1 0xD329 #HANGUL SYLLABLE PHIEUPH AE KIYEOK +0xC6D2 0xD32C #HANGUL SYLLABLE PHIEUPH AE NIEUN +0xC6D3 0xD330 #HANGUL SYLLABLE PHIEUPH AE RIEUL +0xC6D4 0xD338 #HANGUL SYLLABLE PHIEUPH AE MIEUM +0xC6D5 0xD339 #HANGUL SYLLABLE PHIEUPH AE PIEUP +0xC6D6 0xD33B #HANGUL SYLLABLE PHIEUPH AE SIOS +0xC6D7 0xD33C #HANGUL SYLLABLE PHIEUPH AE SSANGSIOS +0xC6D8 0xD33D #HANGUL SYLLABLE PHIEUPH AE IEUNG +0xC6D9 0xD344 #HANGUL SYLLABLE PHIEUPH YA +0xC6DA 0xD345 #HANGUL SYLLABLE PHIEUPH YA KIYEOK +0xC6DB 0xD37C #HANGUL SYLLABLE PHIEUPH EO +0xC6DC 0xD37D #HANGUL SYLLABLE PHIEUPH EO KIYEOK +0xC6DD 0xD380 #HANGUL SYLLABLE PHIEUPH EO NIEUN +0xC6DE 0xD384 #HANGUL SYLLABLE PHIEUPH EO RIEUL +0xC6DF 0xD38C #HANGUL SYLLABLE PHIEUPH EO MIEUM +0xC6E0 0xD38D #HANGUL SYLLABLE PHIEUPH EO PIEUP +0xC6E1 0xD38F #HANGUL SYLLABLE PHIEUPH EO SIOS +0xC6E2 0xD390 #HANGUL SYLLABLE PHIEUPH EO SSANGSIOS +0xC6E3 0xD391 #HANGUL SYLLABLE PHIEUPH EO IEUNG +0xC6E4 0xD398 #HANGUL SYLLABLE PHIEUPH E +0xC6E5 0xD399 #HANGUL SYLLABLE PHIEUPH E KIYEOK +0xC6E6 0xD39C #HANGUL SYLLABLE PHIEUPH E NIEUN +0xC6E7 0xD3A0 #HANGUL SYLLABLE PHIEUPH E RIEUL +0xC6E8 0xD3A8 #HANGUL SYLLABLE PHIEUPH E MIEUM +0xC6E9 0xD3A9 #HANGUL SYLLABLE PHIEUPH E PIEUP +0xC6EA 0xD3AB #HANGUL SYLLABLE PHIEUPH E SIOS +0xC6EB 0xD3AD #HANGUL SYLLABLE PHIEUPH E IEUNG +0xC6EC 0xD3B4 #HANGUL SYLLABLE PHIEUPH YEO +0xC6ED 0xD3B8 #HANGUL SYLLABLE PHIEUPH YEO NIEUN +0xC6EE 0xD3BC #HANGUL SYLLABLE PHIEUPH YEO RIEUL +0xC6EF 0xD3C4 #HANGUL SYLLABLE PHIEUPH YEO MIEUM +0xC6F0 0xD3C5 #HANGUL SYLLABLE PHIEUPH YEO PIEUP +0xC6F1 0xD3C8 #HANGUL SYLLABLE PHIEUPH YEO SSANGSIOS +0xC6F2 0xD3C9 #HANGUL SYLLABLE PHIEUPH YEO IEUNG +0xC6F3 0xD3D0 #HANGUL SYLLABLE PHIEUPH YE +0xC6F4 0xD3D8 #HANGUL SYLLABLE PHIEUPH YE RIEUL +0xC6F5 0xD3E1 #HANGUL SYLLABLE PHIEUPH YE PIEUP +0xC6F6 0xD3E3 #HANGUL SYLLABLE PHIEUPH YE SIOS +0xC6F7 0xD3EC #HANGUL SYLLABLE PHIEUPH O +0xC6F8 0xD3ED #HANGUL SYLLABLE PHIEUPH O KIYEOK +0xC6F9 0xD3F0 #HANGUL SYLLABLE PHIEUPH O NIEUN +0xC6FA 0xD3F4 #HANGUL SYLLABLE PHIEUPH O RIEUL +0xC6FB 0xD3FC #HANGUL SYLLABLE PHIEUPH O MIEUM +0xC6FC 0xD3FD #HANGUL SYLLABLE PHIEUPH O PIEUP +0xC6FD 0xD3FF #HANGUL SYLLABLE PHIEUPH O SIOS +0xC6FE 0xD401 #HANGUL SYLLABLE PHIEUPH O IEUNG +0xC7A1 0xD408 #HANGUL SYLLABLE PHIEUPH WA +0xC7A2 0xD41D #HANGUL SYLLABLE PHIEUPH WA IEUNG +0xC7A3 0xD440 #HANGUL SYLLABLE PHIEUPH OE +0xC7A4 0xD444 #HANGUL SYLLABLE PHIEUPH OE NIEUN +0xC7A5 0xD45C #HANGUL SYLLABLE PHIEUPH YO +0xC7A6 0xD460 #HANGUL SYLLABLE PHIEUPH YO NIEUN +0xC7A7 0xD464 #HANGUL SYLLABLE PHIEUPH YO RIEUL +0xC7A8 0xD46D #HANGUL SYLLABLE PHIEUPH YO PIEUP +0xC7A9 0xD46F #HANGUL SYLLABLE PHIEUPH YO SIOS +0xC7AA 0xD478 #HANGUL SYLLABLE PHIEUPH U +0xC7AB 0xD479 #HANGUL SYLLABLE PHIEUPH U KIYEOK +0xC7AC 0xD47C #HANGUL SYLLABLE PHIEUPH U NIEUN +0xC7AD 0xD47F #HANGUL SYLLABLE PHIEUPH U TIKEUT +0xC7AE 0xD480 #HANGUL SYLLABLE PHIEUPH U RIEUL +0xC7AF 0xD482 #HANGUL SYLLABLE PHIEUPH U RIEULMIEUM +0xC7B0 0xD488 #HANGUL SYLLABLE PHIEUPH U MIEUM +0xC7B1 0xD489 #HANGUL SYLLABLE PHIEUPH U PIEUP +0xC7B2 0xD48B #HANGUL SYLLABLE PHIEUPH U SIOS +0xC7B3 0xD48D #HANGUL SYLLABLE PHIEUPH U IEUNG +0xC7B4 0xD494 #HANGUL SYLLABLE PHIEUPH WEO +0xC7B5 0xD4A9 #HANGUL SYLLABLE PHIEUPH WEO IEUNG +0xC7B6 0xD4CC #HANGUL SYLLABLE PHIEUPH WI +0xC7B7 0xD4D0 #HANGUL SYLLABLE PHIEUPH WI NIEUN +0xC7B8 0xD4D4 #HANGUL SYLLABLE PHIEUPH WI RIEUL +0xC7B9 0xD4DC #HANGUL SYLLABLE PHIEUPH WI MIEUM +0xC7BA 0xD4DF #HANGUL SYLLABLE PHIEUPH WI SIOS +0xC7BB 0xD4E8 #HANGUL SYLLABLE PHIEUPH YU +0xC7BC 0xD4EC #HANGUL SYLLABLE PHIEUPH YU NIEUN +0xC7BD 0xD4F0 #HANGUL SYLLABLE PHIEUPH YU RIEUL +0xC7BE 0xD4F8 #HANGUL SYLLABLE PHIEUPH YU MIEUM +0xC7BF 0xD4FB #HANGUL SYLLABLE PHIEUPH YU SIOS +0xC7C0 0xD4FD #HANGUL SYLLABLE PHIEUPH YU IEUNG +0xC7C1 0xD504 #HANGUL SYLLABLE PHIEUPH EU +0xC7C2 0xD508 #HANGUL SYLLABLE PHIEUPH EU NIEUN +0xC7C3 0xD50C #HANGUL SYLLABLE PHIEUPH EU RIEUL +0xC7C4 0xD514 #HANGUL SYLLABLE PHIEUPH EU MIEUM +0xC7C5 0xD515 #HANGUL SYLLABLE PHIEUPH EU PIEUP +0xC7C6 0xD517 #HANGUL SYLLABLE PHIEUPH EU SIOS +0xC7C7 0xD53C #HANGUL SYLLABLE PHIEUPH I +0xC7C8 0xD53D #HANGUL SYLLABLE PHIEUPH I KIYEOK +0xC7C9 0xD540 #HANGUL SYLLABLE PHIEUPH I NIEUN +0xC7CA 0xD544 #HANGUL SYLLABLE PHIEUPH I RIEUL +0xC7CB 0xD54C #HANGUL SYLLABLE PHIEUPH I MIEUM +0xC7CC 0xD54D #HANGUL SYLLABLE PHIEUPH I PIEUP +0xC7CD 0xD54F #HANGUL SYLLABLE PHIEUPH I SIOS +0xC7CE 0xD551 #HANGUL SYLLABLE PHIEUPH I IEUNG +0xC7CF 0xD558 #HANGUL SYLLABLE HIEUH A +0xC7D0 0xD559 #HANGUL SYLLABLE HIEUH A KIYEOK +0xC7D1 0xD55C #HANGUL SYLLABLE HIEUH A NIEUN +0xC7D2 0xD560 #HANGUL SYLLABLE HIEUH A RIEUL +0xC7D3 0xD565 #HANGUL SYLLABLE HIEUH A RIEULTHIEUTH +0xC7D4 0xD568 #HANGUL SYLLABLE HIEUH A MIEUM +0xC7D5 0xD569 #HANGUL SYLLABLE HIEUH A PIEUP +0xC7D6 0xD56B #HANGUL SYLLABLE HIEUH A SIOS +0xC7D7 0xD56D #HANGUL SYLLABLE HIEUH A IEUNG +0xC7D8 0xD574 #HANGUL SYLLABLE HIEUH AE +0xC7D9 0xD575 #HANGUL SYLLABLE HIEUH AE KIYEOK +0xC7DA 0xD578 #HANGUL SYLLABLE HIEUH AE NIEUN +0xC7DB 0xD57C #HANGUL SYLLABLE HIEUH AE RIEUL +0xC7DC 0xD584 #HANGUL SYLLABLE HIEUH AE MIEUM +0xC7DD 0xD585 #HANGUL SYLLABLE HIEUH AE PIEUP +0xC7DE 0xD587 #HANGUL SYLLABLE HIEUH AE SIOS +0xC7DF 0xD588 #HANGUL SYLLABLE HIEUH AE SSANGSIOS +0xC7E0 0xD589 #HANGUL SYLLABLE HIEUH AE IEUNG +0xC7E1 0xD590 #HANGUL SYLLABLE HIEUH YA +0xC7E2 0xD5A5 #HANGUL SYLLABLE HIEUH YA IEUNG +0xC7E3 0xD5C8 #HANGUL SYLLABLE HIEUH EO +0xC7E4 0xD5C9 #HANGUL SYLLABLE HIEUH EO KIYEOK +0xC7E5 0xD5CC #HANGUL SYLLABLE HIEUH EO NIEUN +0xC7E6 0xD5D0 #HANGUL SYLLABLE HIEUH EO RIEUL +0xC7E7 0xD5D2 #HANGUL SYLLABLE HIEUH EO RIEULMIEUM +0xC7E8 0xD5D8 #HANGUL SYLLABLE HIEUH EO MIEUM +0xC7E9 0xD5D9 #HANGUL SYLLABLE HIEUH EO PIEUP +0xC7EA 0xD5DB #HANGUL SYLLABLE HIEUH EO SIOS +0xC7EB 0xD5DD #HANGUL SYLLABLE HIEUH EO IEUNG +0xC7EC 0xD5E4 #HANGUL SYLLABLE HIEUH E +0xC7ED 0xD5E5 #HANGUL SYLLABLE HIEUH E KIYEOK +0xC7EE 0xD5E8 #HANGUL SYLLABLE HIEUH E NIEUN +0xC7EF 0xD5EC #HANGUL SYLLABLE HIEUH E RIEUL +0xC7F0 0xD5F4 #HANGUL SYLLABLE HIEUH E MIEUM +0xC7F1 0xD5F5 #HANGUL SYLLABLE HIEUH E PIEUP +0xC7F2 0xD5F7 #HANGUL SYLLABLE HIEUH E SIOS +0xC7F3 0xD5F9 #HANGUL SYLLABLE HIEUH E IEUNG +0xC7F4 0xD600 #HANGUL SYLLABLE HIEUH YEO +0xC7F5 0xD601 #HANGUL SYLLABLE HIEUH YEO KIYEOK +0xC7F6 0xD604 #HANGUL SYLLABLE HIEUH YEO NIEUN +0xC7F7 0xD608 #HANGUL SYLLABLE HIEUH YEO RIEUL +0xC7F8 0xD610 #HANGUL SYLLABLE HIEUH YEO MIEUM +0xC7F9 0xD611 #HANGUL SYLLABLE HIEUH YEO PIEUP +0xC7FA 0xD613 #HANGUL SYLLABLE HIEUH YEO SIOS +0xC7FB 0xD614 #HANGUL SYLLABLE HIEUH YEO SSANGSIOS +0xC7FC 0xD615 #HANGUL SYLLABLE HIEUH YEO IEUNG +0xC7FD 0xD61C #HANGUL SYLLABLE HIEUH YE +0xC7FE 0xD620 #HANGUL SYLLABLE HIEUH YE NIEUN +0xC8A1 0xD624 #HANGUL SYLLABLE HIEUH YE RIEUL +0xC8A2 0xD62D #HANGUL SYLLABLE HIEUH YE PIEUP +0xC8A3 0xD638 #HANGUL SYLLABLE HIEUH O +0xC8A4 0xD639 #HANGUL SYLLABLE HIEUH O KIYEOK +0xC8A5 0xD63C #HANGUL SYLLABLE HIEUH O NIEUN +0xC8A6 0xD640 #HANGUL SYLLABLE HIEUH O RIEUL +0xC8A7 0xD645 #HANGUL SYLLABLE HIEUH O RIEULTHIEUTH +0xC8A8 0xD648 #HANGUL SYLLABLE HIEUH O MIEUM +0xC8A9 0xD649 #HANGUL SYLLABLE HIEUH O PIEUP +0xC8AA 0xD64B #HANGUL SYLLABLE HIEUH O SIOS +0xC8AB 0xD64D #HANGUL SYLLABLE HIEUH O IEUNG +0xC8AC 0xD651 #HANGUL SYLLABLE HIEUH O THIEUTH +0xC8AD 0xD654 #HANGUL SYLLABLE HIEUH WA +0xC8AE 0xD655 #HANGUL SYLLABLE HIEUH WA KIYEOK +0xC8AF 0xD658 #HANGUL SYLLABLE HIEUH WA NIEUN +0xC8B0 0xD65C #HANGUL SYLLABLE HIEUH WA RIEUL +0xC8B1 0xD667 #HANGUL SYLLABLE HIEUH WA SIOS +0xC8B2 0xD669 #HANGUL SYLLABLE HIEUH WA IEUNG +0xC8B3 0xD670 #HANGUL SYLLABLE HIEUH WAE +0xC8B4 0xD671 #HANGUL SYLLABLE HIEUH WAE KIYEOK +0xC8B5 0xD674 #HANGUL SYLLABLE HIEUH WAE NIEUN +0xC8B6 0xD683 #HANGUL SYLLABLE HIEUH WAE SIOS +0xC8B7 0xD685 #HANGUL SYLLABLE HIEUH WAE IEUNG +0xC8B8 0xD68C #HANGUL SYLLABLE HIEUH OE +0xC8B9 0xD68D #HANGUL SYLLABLE HIEUH OE KIYEOK +0xC8BA 0xD690 #HANGUL SYLLABLE HIEUH OE NIEUN +0xC8BB 0xD694 #HANGUL SYLLABLE HIEUH OE RIEUL +0xC8BC 0xD69D #HANGUL SYLLABLE HIEUH OE PIEUP +0xC8BD 0xD69F #HANGUL SYLLABLE HIEUH OE SIOS +0xC8BE 0xD6A1 #HANGUL SYLLABLE HIEUH OE IEUNG +0xC8BF 0xD6A8 #HANGUL SYLLABLE HIEUH YO +0xC8C0 0xD6AC #HANGUL SYLLABLE HIEUH YO NIEUN +0xC8C1 0xD6B0 #HANGUL SYLLABLE HIEUH YO RIEUL +0xC8C2 0xD6B9 #HANGUL SYLLABLE HIEUH YO PIEUP +0xC8C3 0xD6BB #HANGUL SYLLABLE HIEUH YO SIOS +0xC8C4 0xD6C4 #HANGUL SYLLABLE HIEUH U +0xC8C5 0xD6C5 #HANGUL SYLLABLE HIEUH U KIYEOK +0xC8C6 0xD6C8 #HANGUL SYLLABLE HIEUH U NIEUN +0xC8C7 0xD6CC #HANGUL SYLLABLE HIEUH U RIEUL +0xC8C8 0xD6D1 #HANGUL SYLLABLE HIEUH U RIEULTHIEUTH +0xC8C9 0xD6D4 #HANGUL SYLLABLE HIEUH U MIEUM +0xC8CA 0xD6D7 #HANGUL SYLLABLE HIEUH U SIOS +0xC8CB 0xD6D9 #HANGUL SYLLABLE HIEUH U IEUNG +0xC8CC 0xD6E0 #HANGUL SYLLABLE HIEUH WEO +0xC8CD 0xD6E4 #HANGUL SYLLABLE HIEUH WEO NIEUN +0xC8CE 0xD6E8 #HANGUL SYLLABLE HIEUH WEO RIEUL +0xC8CF 0xD6F0 #HANGUL SYLLABLE HIEUH WEO MIEUM +0xC8D0 0xD6F5 #HANGUL SYLLABLE HIEUH WEO IEUNG +0xC8D1 0xD6FC #HANGUL SYLLABLE HIEUH WE +0xC8D2 0xD6FD #HANGUL SYLLABLE HIEUH WE KIYEOK +0xC8D3 0xD700 #HANGUL SYLLABLE HIEUH WE NIEUN +0xC8D4 0xD704 #HANGUL SYLLABLE HIEUH WE RIEUL +0xC8D5 0xD711 #HANGUL SYLLABLE HIEUH WE IEUNG +0xC8D6 0xD718 #HANGUL SYLLABLE HIEUH WI +0xC8D7 0xD719 #HANGUL SYLLABLE HIEUH WI KIYEOK +0xC8D8 0xD71C #HANGUL SYLLABLE HIEUH WI NIEUN +0xC8D9 0xD720 #HANGUL SYLLABLE HIEUH WI RIEUL +0xC8DA 0xD728 #HANGUL SYLLABLE HIEUH WI MIEUM +0xC8DB 0xD729 #HANGUL SYLLABLE HIEUH WI PIEUP +0xC8DC 0xD72B #HANGUL SYLLABLE HIEUH WI SIOS +0xC8DD 0xD72D #HANGUL SYLLABLE HIEUH WI IEUNG +0xC8DE 0xD734 #HANGUL SYLLABLE HIEUH YU +0xC8DF 0xD735 #HANGUL SYLLABLE HIEUH YU KIYEOK +0xC8E0 0xD738 #HANGUL SYLLABLE HIEUH YU NIEUN +0xC8E1 0xD73C #HANGUL SYLLABLE HIEUH YU RIEUL +0xC8E2 0xD744 #HANGUL SYLLABLE HIEUH YU MIEUM +0xC8E3 0xD747 #HANGUL SYLLABLE HIEUH YU SIOS +0xC8E4 0xD749 #HANGUL SYLLABLE HIEUH YU IEUNG +0xC8E5 0xD750 #HANGUL SYLLABLE HIEUH EU +0xC8E6 0xD751 #HANGUL SYLLABLE HIEUH EU KIYEOK +0xC8E7 0xD754 #HANGUL SYLLABLE HIEUH EU NIEUN +0xC8E8 0xD756 #HANGUL SYLLABLE HIEUH EU NIEUNHIEUH +0xC8E9 0xD757 #HANGUL SYLLABLE HIEUH EU TIKEUT +0xC8EA 0xD758 #HANGUL SYLLABLE HIEUH EU RIEUL +0xC8EB 0xD759 #HANGUL SYLLABLE HIEUH EU RIEULKIYEOK +0xC8EC 0xD760 #HANGUL SYLLABLE HIEUH EU MIEUM +0xC8ED 0xD761 #HANGUL SYLLABLE HIEUH EU PIEUP +0xC8EE 0xD763 #HANGUL SYLLABLE HIEUH EU SIOS +0xC8EF 0xD765 #HANGUL SYLLABLE HIEUH EU IEUNG +0xC8F0 0xD769 #HANGUL SYLLABLE HIEUH EU THIEUTH +0xC8F1 0xD76C #HANGUL SYLLABLE HIEUH YI +0xC8F2 0xD770 #HANGUL SYLLABLE HIEUH YI NIEUN +0xC8F3 0xD774 #HANGUL SYLLABLE HIEUH YI RIEUL +0xC8F4 0xD77C #HANGUL SYLLABLE HIEUH YI MIEUM +0xC8F5 0xD77D #HANGUL SYLLABLE HIEUH YI PIEUP +0xC8F6 0xD781 #HANGUL SYLLABLE HIEUH YI IEUNG +0xC8F7 0xD788 #HANGUL SYLLABLE HIEUH I +0xC8F8 0xD789 #HANGUL SYLLABLE HIEUH I KIYEOK +0xC8F9 0xD78C #HANGUL SYLLABLE HIEUH I NIEUN +0xC8FA 0xD790 #HANGUL SYLLABLE HIEUH I RIEUL +0xC8FB 0xD798 #HANGUL SYLLABLE HIEUH I MIEUM +0xC8FC 0xD799 #HANGUL SYLLABLE HIEUH I PIEUP +0xC8FD 0xD79B #HANGUL SYLLABLE HIEUH I SIOS +0xC8FE 0xD79D #HANGUL SYLLABLE HIEUH I IEUNG +0xCAA1 0x4F3D #CJK UNIFIED IDEOGRAPH +0xCAA2 0x4F73 #CJK UNIFIED IDEOGRAPH +0xCAA3 0x5047 #CJK UNIFIED IDEOGRAPH +0xCAA4 0x50F9 #CJK UNIFIED IDEOGRAPH +0xCAA5 0x52A0 #CJK UNIFIED IDEOGRAPH +0xCAA6 0x53EF #CJK UNIFIED IDEOGRAPH +0xCAA7 0x5475 #CJK UNIFIED IDEOGRAPH +0xCAA8 0x54E5 #CJK UNIFIED IDEOGRAPH +0xCAA9 0x5609 #CJK UNIFIED IDEOGRAPH +0xCAAA 0x5AC1 #CJK UNIFIED IDEOGRAPH +0xCAAB 0x5BB6 #CJK UNIFIED IDEOGRAPH +0xCAAC 0x6687 #CJK UNIFIED IDEOGRAPH +0xCAAD 0x67B6 #CJK UNIFIED IDEOGRAPH +0xCAAE 0x67B7 #CJK UNIFIED IDEOGRAPH +0xCAAF 0x67EF #CJK UNIFIED IDEOGRAPH +0xCAB0 0x6B4C #CJK UNIFIED IDEOGRAPH +0xCAB1 0x73C2 #CJK UNIFIED IDEOGRAPH +0xCAB2 0x75C2 #CJK UNIFIED IDEOGRAPH +0xCAB3 0x7A3C #CJK UNIFIED IDEOGRAPH +0xCAB4 0x82DB #CJK UNIFIED IDEOGRAPH +0xCAB5 0x8304 #CJK UNIFIED IDEOGRAPH +0xCAB6 0x8857 #CJK UNIFIED IDEOGRAPH +0xCAB7 0x8888 #CJK UNIFIED IDEOGRAPH +0xCAB8 0x8A36 #CJK UNIFIED IDEOGRAPH +0xCAB9 0x8CC8 #CJK UNIFIED IDEOGRAPH +0xCABA 0x8DCF #CJK UNIFIED IDEOGRAPH +0xCABB 0x8EFB #CJK UNIFIED IDEOGRAPH +0xCABC 0x8FE6 #CJK UNIFIED IDEOGRAPH +0xCABD 0x99D5 #CJK UNIFIED IDEOGRAPH +0xCABE 0x523B #CJK UNIFIED IDEOGRAPH +0xCABF 0x5374 #CJK UNIFIED IDEOGRAPH +0xCAC0 0x5404 #CJK UNIFIED IDEOGRAPH +0xCAC1 0x606A #CJK UNIFIED IDEOGRAPH +0xCAC2 0x6164 #CJK UNIFIED IDEOGRAPH +0xCAC3 0x6BBC #CJK UNIFIED IDEOGRAPH +0xCAC4 0x73CF #CJK UNIFIED IDEOGRAPH +0xCAC5 0x811A #CJK UNIFIED IDEOGRAPH +0xCAC6 0x89BA #CJK UNIFIED IDEOGRAPH +0xCAC7 0x89D2 #CJK UNIFIED IDEOGRAPH +0xCAC8 0x95A3 #CJK UNIFIED IDEOGRAPH +0xCAC9 0x4F83 #CJK UNIFIED IDEOGRAPH +0xCACA 0x520A #CJK UNIFIED IDEOGRAPH +0xCACB 0x58BE #CJK UNIFIED IDEOGRAPH +0xCACC 0x5978 #CJK UNIFIED IDEOGRAPH +0xCACD 0x59E6 #CJK UNIFIED IDEOGRAPH +0xCACE 0x5E72 #CJK UNIFIED IDEOGRAPH +0xCACF 0x5E79 #CJK UNIFIED IDEOGRAPH +0xCAD0 0x61C7 #CJK UNIFIED IDEOGRAPH +0xCAD1 0x63C0 #CJK UNIFIED IDEOGRAPH +0xCAD2 0x6746 #CJK UNIFIED IDEOGRAPH +0xCAD3 0x67EC #CJK UNIFIED IDEOGRAPH +0xCAD4 0x687F #CJK UNIFIED IDEOGRAPH +0xCAD5 0x6F97 #CJK UNIFIED IDEOGRAPH +0xCAD6 0x764E #CJK UNIFIED IDEOGRAPH +0xCAD7 0x770B #CJK UNIFIED IDEOGRAPH +0xCAD8 0x78F5 #CJK UNIFIED IDEOGRAPH +0xCAD9 0x7A08 #CJK UNIFIED IDEOGRAPH +0xCADA 0x7AFF #CJK UNIFIED IDEOGRAPH +0xCADB 0x7C21 #CJK UNIFIED IDEOGRAPH +0xCADC 0x809D #CJK UNIFIED IDEOGRAPH +0xCADD 0x826E #CJK UNIFIED IDEOGRAPH +0xCADE 0x8271 #CJK UNIFIED IDEOGRAPH +0xCADF 0x8AEB #CJK UNIFIED IDEOGRAPH +0xCAE0 0x9593 #CJK UNIFIED IDEOGRAPH +0xCAE1 0x4E6B #CJK UNIFIED IDEOGRAPH +0xCAE2 0x559D #CJK UNIFIED IDEOGRAPH +0xCAE3 0x66F7 #CJK UNIFIED IDEOGRAPH +0xCAE4 0x6E34 #CJK UNIFIED IDEOGRAPH +0xCAE5 0x78A3 #CJK UNIFIED IDEOGRAPH +0xCAE6 0x7AED #CJK UNIFIED IDEOGRAPH +0xCAE7 0x845B #CJK UNIFIED IDEOGRAPH +0xCAE8 0x8910 #CJK UNIFIED IDEOGRAPH +0xCAE9 0x874E #CJK UNIFIED IDEOGRAPH +0xCAEA 0x97A8 #CJK UNIFIED IDEOGRAPH +0xCAEB 0x52D8 #CJK UNIFIED IDEOGRAPH +0xCAEC 0x574E #CJK UNIFIED IDEOGRAPH +0xCAED 0x582A #CJK UNIFIED IDEOGRAPH +0xCAEE 0x5D4C #CJK UNIFIED IDEOGRAPH +0xCAEF 0x611F #CJK UNIFIED IDEOGRAPH +0xCAF0 0x61BE #CJK UNIFIED IDEOGRAPH +0xCAF1 0x6221 #CJK UNIFIED IDEOGRAPH +0xCAF2 0x6562 #CJK UNIFIED IDEOGRAPH +0xCAF3 0x67D1 #CJK UNIFIED IDEOGRAPH +0xCAF4 0x6A44 #CJK UNIFIED IDEOGRAPH +0xCAF5 0x6E1B #CJK UNIFIED IDEOGRAPH +0xCAF6 0x7518 #CJK UNIFIED IDEOGRAPH +0xCAF7 0x75B3 #CJK UNIFIED IDEOGRAPH +0xCAF8 0x76E3 #CJK UNIFIED IDEOGRAPH +0xCAF9 0x77B0 #CJK UNIFIED IDEOGRAPH +0xCAFA 0x7D3A #CJK UNIFIED IDEOGRAPH +0xCAFB 0x90AF #CJK UNIFIED IDEOGRAPH +0xCAFC 0x9451 #CJK UNIFIED IDEOGRAPH +0xCAFD 0x9452 #CJK UNIFIED IDEOGRAPH +0xCAFE 0x9F95 #CJK UNIFIED IDEOGRAPH +0xCBA1 0x5323 #CJK UNIFIED IDEOGRAPH +0xCBA2 0x5CAC #CJK UNIFIED IDEOGRAPH +0xCBA3 0x7532 #CJK UNIFIED IDEOGRAPH +0xCBA4 0x80DB #CJK UNIFIED IDEOGRAPH +0xCBA5 0x9240 #CJK UNIFIED IDEOGRAPH +0xCBA6 0x9598 #CJK UNIFIED IDEOGRAPH +0xCBA7 0x525B #CJK UNIFIED IDEOGRAPH +0xCBA8 0x5808 #CJK UNIFIED IDEOGRAPH +0xCBA9 0x59DC #CJK UNIFIED IDEOGRAPH +0xCBAA 0x5CA1 #CJK UNIFIED IDEOGRAPH +0xCBAB 0x5D17 #CJK UNIFIED IDEOGRAPH +0xCBAC 0x5EB7 #CJK UNIFIED IDEOGRAPH +0xCBAD 0x5F3A #CJK UNIFIED IDEOGRAPH +0xCBAE 0x5F4A #CJK UNIFIED IDEOGRAPH +0xCBAF 0x6177 #CJK UNIFIED IDEOGRAPH +0xCBB0 0x6C5F #CJK UNIFIED IDEOGRAPH +0xCBB1 0x757A #CJK UNIFIED IDEOGRAPH +0xCBB2 0x7586 #CJK UNIFIED IDEOGRAPH +0xCBB3 0x7CE0 #CJK UNIFIED IDEOGRAPH +0xCBB4 0x7D73 #CJK UNIFIED IDEOGRAPH +0xCBB5 0x7DB1 #CJK UNIFIED IDEOGRAPH +0xCBB6 0x7F8C #CJK UNIFIED IDEOGRAPH +0xCBB7 0x8154 #CJK UNIFIED IDEOGRAPH +0xCBB8 0x8221 #CJK UNIFIED IDEOGRAPH +0xCBB9 0x8591 #CJK UNIFIED IDEOGRAPH +0xCBBA 0x8941 #CJK UNIFIED IDEOGRAPH +0xCBBB 0x8B1B #CJK UNIFIED IDEOGRAPH +0xCBBC 0x92FC #CJK UNIFIED IDEOGRAPH +0xCBBD 0x964D #CJK UNIFIED IDEOGRAPH +0xCBBE 0x9C47 #CJK UNIFIED IDEOGRAPH +0xCBBF 0x4ECB #CJK UNIFIED IDEOGRAPH +0xCBC0 0x4EF7 #CJK UNIFIED IDEOGRAPH +0xCBC1 0x500B #CJK UNIFIED IDEOGRAPH +0xCBC2 0x51F1 #CJK UNIFIED IDEOGRAPH +0xCBC3 0x584F #CJK UNIFIED IDEOGRAPH +0xCBC4 0x6137 #CJK UNIFIED IDEOGRAPH +0xCBC5 0x613E #CJK UNIFIED IDEOGRAPH +0xCBC6 0x6168 #CJK UNIFIED IDEOGRAPH +0xCBC7 0x6539 #CJK UNIFIED IDEOGRAPH +0xCBC8 0x69EA #CJK UNIFIED IDEOGRAPH +0xCBC9 0x6F11 #CJK UNIFIED IDEOGRAPH +0xCBCA 0x75A5 #CJK UNIFIED IDEOGRAPH +0xCBCB 0x7686 #CJK UNIFIED IDEOGRAPH +0xCBCC 0x76D6 #CJK UNIFIED IDEOGRAPH +0xCBCD 0x7B87 #CJK UNIFIED IDEOGRAPH +0xCBCE 0x82A5 #CJK UNIFIED IDEOGRAPH +0xCBCF 0x84CB #CJK UNIFIED IDEOGRAPH +0xCBD0 0xF900 #CJK COMPATIBILITY IDEOGRAPH +0xCBD1 0x93A7 #CJK UNIFIED IDEOGRAPH +0xCBD2 0x958B #CJK UNIFIED IDEOGRAPH +0xCBD3 0x5580 #CJK UNIFIED IDEOGRAPH +0xCBD4 0x5BA2 #CJK UNIFIED IDEOGRAPH +0xCBD5 0x5751 #CJK UNIFIED IDEOGRAPH +0xCBD6 0xF901 #CJK COMPATIBILITY IDEOGRAPH +0xCBD7 0x7CB3 #CJK UNIFIED IDEOGRAPH +0xCBD8 0x7FB9 #CJK UNIFIED IDEOGRAPH +0xCBD9 0x91B5 #CJK UNIFIED IDEOGRAPH +0xCBDA 0x5028 #CJK UNIFIED IDEOGRAPH +0xCBDB 0x53BB #CJK UNIFIED IDEOGRAPH +0xCBDC 0x5C45 #CJK UNIFIED IDEOGRAPH +0xCBDD 0x5DE8 #CJK UNIFIED IDEOGRAPH +0xCBDE 0x62D2 #CJK UNIFIED IDEOGRAPH +0xCBDF 0x636E #CJK UNIFIED IDEOGRAPH +0xCBE0 0x64DA #CJK UNIFIED IDEOGRAPH +0xCBE1 0x64E7 #CJK UNIFIED IDEOGRAPH +0xCBE2 0x6E20 #CJK UNIFIED IDEOGRAPH +0xCBE3 0x70AC #CJK UNIFIED IDEOGRAPH +0xCBE4 0x795B #CJK UNIFIED IDEOGRAPH +0xCBE5 0x8DDD #CJK UNIFIED IDEOGRAPH +0xCBE6 0x8E1E #CJK UNIFIED IDEOGRAPH +0xCBE7 0xF902 #CJK COMPATIBILITY IDEOGRAPH +0xCBE8 0x907D #CJK UNIFIED IDEOGRAPH +0xCBE9 0x9245 #CJK UNIFIED IDEOGRAPH +0xCBEA 0x92F8 #CJK UNIFIED IDEOGRAPH +0xCBEB 0x4E7E #CJK UNIFIED IDEOGRAPH +0xCBEC 0x4EF6 #CJK UNIFIED IDEOGRAPH +0xCBED 0x5065 #CJK UNIFIED IDEOGRAPH +0xCBEE 0x5DFE #CJK UNIFIED IDEOGRAPH +0xCBEF 0x5EFA #CJK UNIFIED IDEOGRAPH +0xCBF0 0x6106 #CJK UNIFIED IDEOGRAPH +0xCBF1 0x6957 #CJK UNIFIED IDEOGRAPH +0xCBF2 0x8171 #CJK UNIFIED IDEOGRAPH +0xCBF3 0x8654 #CJK UNIFIED IDEOGRAPH +0xCBF4 0x8E47 #CJK UNIFIED IDEOGRAPH +0xCBF5 0x9375 #CJK UNIFIED IDEOGRAPH +0xCBF6 0x9A2B #CJK UNIFIED IDEOGRAPH +0xCBF7 0x4E5E #CJK UNIFIED IDEOGRAPH +0xCBF8 0x5091 #CJK UNIFIED IDEOGRAPH +0xCBF9 0x6770 #CJK UNIFIED IDEOGRAPH +0xCBFA 0x6840 #CJK UNIFIED IDEOGRAPH +0xCBFB 0x5109 #CJK UNIFIED IDEOGRAPH +0xCBFC 0x528D #CJK UNIFIED IDEOGRAPH +0xCBFD 0x5292 #CJK UNIFIED IDEOGRAPH +0xCBFE 0x6AA2 #CJK UNIFIED IDEOGRAPH +0xCCA1 0x77BC #CJK UNIFIED IDEOGRAPH +0xCCA2 0x9210 #CJK UNIFIED IDEOGRAPH +0xCCA3 0x9ED4 #CJK UNIFIED IDEOGRAPH +0xCCA4 0x52AB #CJK UNIFIED IDEOGRAPH +0xCCA5 0x602F #CJK UNIFIED IDEOGRAPH +0xCCA6 0x8FF2 #CJK UNIFIED IDEOGRAPH +0xCCA7 0x5048 #CJK UNIFIED IDEOGRAPH +0xCCA8 0x61A9 #CJK UNIFIED IDEOGRAPH +0xCCA9 0x63ED #CJK UNIFIED IDEOGRAPH +0xCCAA 0x64CA #CJK UNIFIED IDEOGRAPH +0xCCAB 0x683C #CJK UNIFIED IDEOGRAPH +0xCCAC 0x6A84 #CJK UNIFIED IDEOGRAPH +0xCCAD 0x6FC0 #CJK UNIFIED IDEOGRAPH +0xCCAE 0x8188 #CJK UNIFIED IDEOGRAPH +0xCCAF 0x89A1 #CJK UNIFIED IDEOGRAPH +0xCCB0 0x9694 #CJK UNIFIED IDEOGRAPH +0xCCB1 0x5805 #CJK UNIFIED IDEOGRAPH +0xCCB2 0x727D #CJK UNIFIED IDEOGRAPH +0xCCB3 0x72AC #CJK UNIFIED IDEOGRAPH +0xCCB4 0x7504 #CJK UNIFIED IDEOGRAPH +0xCCB5 0x7D79 #CJK UNIFIED IDEOGRAPH +0xCCB6 0x7E6D #CJK UNIFIED IDEOGRAPH +0xCCB7 0x80A9 #CJK UNIFIED IDEOGRAPH +0xCCB8 0x898B #CJK UNIFIED IDEOGRAPH +0xCCB9 0x8B74 #CJK UNIFIED IDEOGRAPH +0xCCBA 0x9063 #CJK UNIFIED IDEOGRAPH +0xCCBB 0x9D51 #CJK UNIFIED IDEOGRAPH +0xCCBC 0x6289 #CJK UNIFIED IDEOGRAPH +0xCCBD 0x6C7A #CJK UNIFIED IDEOGRAPH +0xCCBE 0x6F54 #CJK UNIFIED IDEOGRAPH +0xCCBF 0x7D50 #CJK UNIFIED IDEOGRAPH +0xCCC0 0x7F3A #CJK UNIFIED IDEOGRAPH +0xCCC1 0x8A23 #CJK UNIFIED IDEOGRAPH +0xCCC2 0x517C #CJK UNIFIED IDEOGRAPH +0xCCC3 0x614A #CJK UNIFIED IDEOGRAPH +0xCCC4 0x7B9D #CJK UNIFIED IDEOGRAPH +0xCCC5 0x8B19 #CJK UNIFIED IDEOGRAPH +0xCCC6 0x9257 #CJK UNIFIED IDEOGRAPH +0xCCC7 0x938C #CJK UNIFIED IDEOGRAPH +0xCCC8 0x4EAC #CJK UNIFIED IDEOGRAPH +0xCCC9 0x4FD3 #CJK UNIFIED IDEOGRAPH +0xCCCA 0x501E #CJK UNIFIED IDEOGRAPH +0xCCCB 0x50BE #CJK UNIFIED IDEOGRAPH +0xCCCC 0x5106 #CJK UNIFIED IDEOGRAPH +0xCCCD 0x52C1 #CJK UNIFIED IDEOGRAPH +0xCCCE 0x52CD #CJK UNIFIED IDEOGRAPH +0xCCCF 0x537F #CJK UNIFIED IDEOGRAPH +0xCCD0 0x5770 #CJK UNIFIED IDEOGRAPH +0xCCD1 0x5883 #CJK UNIFIED IDEOGRAPH +0xCCD2 0x5E9A #CJK UNIFIED IDEOGRAPH +0xCCD3 0x5F91 #CJK UNIFIED IDEOGRAPH +0xCCD4 0x6176 #CJK UNIFIED IDEOGRAPH +0xCCD5 0x61AC #CJK UNIFIED IDEOGRAPH +0xCCD6 0x64CE #CJK UNIFIED IDEOGRAPH +0xCCD7 0x656C #CJK UNIFIED IDEOGRAPH +0xCCD8 0x666F #CJK UNIFIED IDEOGRAPH +0xCCD9 0x66BB #CJK UNIFIED IDEOGRAPH +0xCCDA 0x66F4 #CJK UNIFIED IDEOGRAPH +0xCCDB 0x6897 #CJK UNIFIED IDEOGRAPH +0xCCDC 0x6D87 #CJK UNIFIED IDEOGRAPH +0xCCDD 0x7085 #CJK UNIFIED IDEOGRAPH +0xCCDE 0x70F1 #CJK UNIFIED IDEOGRAPH +0xCCDF 0x749F #CJK UNIFIED IDEOGRAPH +0xCCE0 0x74A5 #CJK UNIFIED IDEOGRAPH +0xCCE1 0x74CA #CJK UNIFIED IDEOGRAPH +0xCCE2 0x75D9 #CJK UNIFIED IDEOGRAPH +0xCCE3 0x786C #CJK UNIFIED IDEOGRAPH +0xCCE4 0x78EC #CJK UNIFIED IDEOGRAPH +0xCCE5 0x7ADF #CJK UNIFIED IDEOGRAPH +0xCCE6 0x7AF6 #CJK UNIFIED IDEOGRAPH +0xCCE7 0x7D45 #CJK UNIFIED IDEOGRAPH +0xCCE8 0x7D93 #CJK UNIFIED IDEOGRAPH +0xCCE9 0x8015 #CJK UNIFIED IDEOGRAPH +0xCCEA 0x803F #CJK UNIFIED IDEOGRAPH +0xCCEB 0x811B #CJK UNIFIED IDEOGRAPH +0xCCEC 0x8396 #CJK UNIFIED IDEOGRAPH +0xCCED 0x8B66 #CJK UNIFIED IDEOGRAPH +0xCCEE 0x8F15 #CJK UNIFIED IDEOGRAPH +0xCCEF 0x9015 #CJK UNIFIED IDEOGRAPH +0xCCF0 0x93E1 #CJK UNIFIED IDEOGRAPH +0xCCF1 0x9803 #CJK UNIFIED IDEOGRAPH +0xCCF2 0x9838 #CJK UNIFIED IDEOGRAPH +0xCCF3 0x9A5A #CJK UNIFIED IDEOGRAPH +0xCCF4 0x9BE8 #CJK UNIFIED IDEOGRAPH +0xCCF5 0x4FC2 #CJK UNIFIED IDEOGRAPH +0xCCF6 0x5553 #CJK UNIFIED IDEOGRAPH +0xCCF7 0x583A #CJK UNIFIED IDEOGRAPH +0xCCF8 0x5951 #CJK UNIFIED IDEOGRAPH +0xCCF9 0x5B63 #CJK UNIFIED IDEOGRAPH +0xCCFA 0x5C46 #CJK UNIFIED IDEOGRAPH +0xCCFB 0x60B8 #CJK UNIFIED IDEOGRAPH +0xCCFC 0x6212 #CJK UNIFIED IDEOGRAPH +0xCCFD 0x6842 #CJK UNIFIED IDEOGRAPH +0xCCFE 0x68B0 #CJK UNIFIED IDEOGRAPH +0xCDA1 0x68E8 #CJK UNIFIED IDEOGRAPH +0xCDA2 0x6EAA #CJK UNIFIED IDEOGRAPH +0xCDA3 0x754C #CJK UNIFIED IDEOGRAPH +0xCDA4 0x7678 #CJK UNIFIED IDEOGRAPH +0xCDA5 0x78CE #CJK UNIFIED IDEOGRAPH +0xCDA6 0x7A3D #CJK UNIFIED IDEOGRAPH +0xCDA7 0x7CFB #CJK UNIFIED IDEOGRAPH +0xCDA8 0x7E6B #CJK UNIFIED IDEOGRAPH +0xCDA9 0x7E7C #CJK UNIFIED IDEOGRAPH +0xCDAA 0x8A08 #CJK UNIFIED IDEOGRAPH +0xCDAB 0x8AA1 #CJK UNIFIED IDEOGRAPH +0xCDAC 0x8C3F #CJK UNIFIED IDEOGRAPH +0xCDAD 0x968E #CJK UNIFIED IDEOGRAPH +0xCDAE 0x9DC4 #CJK UNIFIED IDEOGRAPH +0xCDAF 0x53E4 #CJK UNIFIED IDEOGRAPH +0xCDB0 0x53E9 #CJK UNIFIED IDEOGRAPH +0xCDB1 0x544A #CJK UNIFIED IDEOGRAPH +0xCDB2 0x5471 #CJK UNIFIED IDEOGRAPH +0xCDB3 0x56FA #CJK UNIFIED IDEOGRAPH +0xCDB4 0x59D1 #CJK UNIFIED IDEOGRAPH +0xCDB5 0x5B64 #CJK UNIFIED IDEOGRAPH +0xCDB6 0x5C3B #CJK UNIFIED IDEOGRAPH +0xCDB7 0x5EAB #CJK UNIFIED IDEOGRAPH +0xCDB8 0x62F7 #CJK UNIFIED IDEOGRAPH +0xCDB9 0x6537 #CJK UNIFIED IDEOGRAPH +0xCDBA 0x6545 #CJK UNIFIED IDEOGRAPH +0xCDBB 0x6572 #CJK UNIFIED IDEOGRAPH +0xCDBC 0x66A0 #CJK UNIFIED IDEOGRAPH +0xCDBD 0x67AF #CJK UNIFIED IDEOGRAPH +0xCDBE 0x69C1 #CJK UNIFIED IDEOGRAPH +0xCDBF 0x6CBD #CJK UNIFIED IDEOGRAPH +0xCDC0 0x75FC #CJK UNIFIED IDEOGRAPH +0xCDC1 0x7690 #CJK UNIFIED IDEOGRAPH +0xCDC2 0x777E #CJK UNIFIED IDEOGRAPH +0xCDC3 0x7A3F #CJK UNIFIED IDEOGRAPH +0xCDC4 0x7F94 #CJK UNIFIED IDEOGRAPH +0xCDC5 0x8003 #CJK UNIFIED IDEOGRAPH +0xCDC6 0x80A1 #CJK UNIFIED IDEOGRAPH +0xCDC7 0x818F #CJK UNIFIED IDEOGRAPH +0xCDC8 0x82E6 #CJK UNIFIED IDEOGRAPH +0xCDC9 0x82FD #CJK UNIFIED IDEOGRAPH +0xCDCA 0x83F0 #CJK UNIFIED IDEOGRAPH +0xCDCB 0x85C1 #CJK UNIFIED IDEOGRAPH +0xCDCC 0x8831 #CJK UNIFIED IDEOGRAPH +0xCDCD 0x88B4 #CJK UNIFIED IDEOGRAPH +0xCDCE 0x8AA5 #CJK UNIFIED IDEOGRAPH +0xCDCF 0xF903 #CJK COMPATIBILITY IDEOGRAPH +0xCDD0 0x8F9C #CJK UNIFIED IDEOGRAPH +0xCDD1 0x932E #CJK UNIFIED IDEOGRAPH +0xCDD2 0x96C7 #CJK UNIFIED IDEOGRAPH +0xCDD3 0x9867 #CJK UNIFIED IDEOGRAPH +0xCDD4 0x9AD8 #CJK UNIFIED IDEOGRAPH +0xCDD5 0x9F13 #CJK UNIFIED IDEOGRAPH +0xCDD6 0x54ED #CJK UNIFIED IDEOGRAPH +0xCDD7 0x659B #CJK UNIFIED IDEOGRAPH +0xCDD8 0x66F2 #CJK UNIFIED IDEOGRAPH +0xCDD9 0x688F #CJK UNIFIED IDEOGRAPH +0xCDDA 0x7A40 #CJK UNIFIED IDEOGRAPH +0xCDDB 0x8C37 #CJK UNIFIED IDEOGRAPH +0xCDDC 0x9D60 #CJK UNIFIED IDEOGRAPH +0xCDDD 0x56F0 #CJK UNIFIED IDEOGRAPH +0xCDDE 0x5764 #CJK UNIFIED IDEOGRAPH +0xCDDF 0x5D11 #CJK UNIFIED IDEOGRAPH +0xCDE0 0x6606 #CJK UNIFIED IDEOGRAPH +0xCDE1 0x68B1 #CJK UNIFIED IDEOGRAPH +0xCDE2 0x68CD #CJK UNIFIED IDEOGRAPH +0xCDE3 0x6EFE #CJK UNIFIED IDEOGRAPH +0xCDE4 0x7428 #CJK UNIFIED IDEOGRAPH +0xCDE5 0x889E #CJK UNIFIED IDEOGRAPH +0xCDE6 0x9BE4 #CJK UNIFIED IDEOGRAPH +0xCDE7 0x6C68 #CJK UNIFIED IDEOGRAPH +0xCDE8 0xF904 #CJK COMPATIBILITY IDEOGRAPH +0xCDE9 0x9AA8 #CJK UNIFIED IDEOGRAPH +0xCDEA 0x4F9B #CJK UNIFIED IDEOGRAPH +0xCDEB 0x516C #CJK UNIFIED IDEOGRAPH +0xCDEC 0x5171 #CJK UNIFIED IDEOGRAPH +0xCDED 0x529F #CJK UNIFIED IDEOGRAPH +0xCDEE 0x5B54 #CJK UNIFIED IDEOGRAPH +0xCDEF 0x5DE5 #CJK UNIFIED IDEOGRAPH +0xCDF0 0x6050 #CJK UNIFIED IDEOGRAPH +0xCDF1 0x606D #CJK UNIFIED IDEOGRAPH +0xCDF2 0x62F1 #CJK UNIFIED IDEOGRAPH +0xCDF3 0x63A7 #CJK UNIFIED IDEOGRAPH +0xCDF4 0x653B #CJK UNIFIED IDEOGRAPH +0xCDF5 0x73D9 #CJK UNIFIED IDEOGRAPH +0xCDF6 0x7A7A #CJK UNIFIED IDEOGRAPH +0xCDF7 0x86A3 #CJK UNIFIED IDEOGRAPH +0xCDF8 0x8CA2 #CJK UNIFIED IDEOGRAPH +0xCDF9 0x978F #CJK UNIFIED IDEOGRAPH +0xCDFA 0x4E32 #CJK UNIFIED IDEOGRAPH +0xCDFB 0x5BE1 #CJK UNIFIED IDEOGRAPH +0xCDFC 0x6208 #CJK UNIFIED IDEOGRAPH +0xCDFD 0x679C #CJK UNIFIED IDEOGRAPH +0xCDFE 0x74DC #CJK UNIFIED IDEOGRAPH +0xCEA1 0x79D1 #CJK UNIFIED IDEOGRAPH +0xCEA2 0x83D3 #CJK UNIFIED IDEOGRAPH +0xCEA3 0x8A87 #CJK UNIFIED IDEOGRAPH +0xCEA4 0x8AB2 #CJK UNIFIED IDEOGRAPH +0xCEA5 0x8DE8 #CJK UNIFIED IDEOGRAPH +0xCEA6 0x904E #CJK UNIFIED IDEOGRAPH +0xCEA7 0x934B #CJK UNIFIED IDEOGRAPH +0xCEA8 0x9846 #CJK UNIFIED IDEOGRAPH +0xCEA9 0x5ED3 #CJK UNIFIED IDEOGRAPH +0xCEAA 0x69E8 #CJK UNIFIED IDEOGRAPH +0xCEAB 0x85FF #CJK UNIFIED IDEOGRAPH +0xCEAC 0x90ED #CJK UNIFIED IDEOGRAPH +0xCEAD 0xF905 #CJK COMPATIBILITY IDEOGRAPH +0xCEAE 0x51A0 #CJK UNIFIED IDEOGRAPH +0xCEAF 0x5B98 #CJK UNIFIED IDEOGRAPH +0xCEB0 0x5BEC #CJK UNIFIED IDEOGRAPH +0xCEB1 0x6163 #CJK UNIFIED IDEOGRAPH +0xCEB2 0x68FA #CJK UNIFIED IDEOGRAPH +0xCEB3 0x6B3E #CJK UNIFIED IDEOGRAPH +0xCEB4 0x704C #CJK UNIFIED IDEOGRAPH +0xCEB5 0x742F #CJK UNIFIED IDEOGRAPH +0xCEB6 0x74D8 #CJK UNIFIED IDEOGRAPH +0xCEB7 0x7BA1 #CJK UNIFIED IDEOGRAPH +0xCEB8 0x7F50 #CJK UNIFIED IDEOGRAPH +0xCEB9 0x83C5 #CJK UNIFIED IDEOGRAPH +0xCEBA 0x89C0 #CJK UNIFIED IDEOGRAPH +0xCEBB 0x8CAB #CJK UNIFIED IDEOGRAPH +0xCEBC 0x95DC #CJK UNIFIED IDEOGRAPH +0xCEBD 0x9928 #CJK UNIFIED IDEOGRAPH +0xCEBE 0x522E #CJK UNIFIED IDEOGRAPH +0xCEBF 0x605D #CJK UNIFIED IDEOGRAPH +0xCEC0 0x62EC #CJK UNIFIED IDEOGRAPH +0xCEC1 0x9002 #CJK UNIFIED IDEOGRAPH +0xCEC2 0x4F8A #CJK UNIFIED IDEOGRAPH +0xCEC3 0x5149 #CJK UNIFIED IDEOGRAPH +0xCEC4 0x5321 #CJK UNIFIED IDEOGRAPH +0xCEC5 0x58D9 #CJK UNIFIED IDEOGRAPH +0xCEC6 0x5EE3 #CJK UNIFIED IDEOGRAPH +0xCEC7 0x66E0 #CJK UNIFIED IDEOGRAPH +0xCEC8 0x6D38 #CJK UNIFIED IDEOGRAPH +0xCEC9 0x709A #CJK UNIFIED IDEOGRAPH +0xCECA 0x72C2 #CJK UNIFIED IDEOGRAPH +0xCECB 0x73D6 #CJK UNIFIED IDEOGRAPH +0xCECC 0x7B50 #CJK UNIFIED IDEOGRAPH +0xCECD 0x80F1 #CJK UNIFIED IDEOGRAPH +0xCECE 0x945B #CJK UNIFIED IDEOGRAPH +0xCECF 0x5366 #CJK UNIFIED IDEOGRAPH +0xCED0 0x639B #CJK UNIFIED IDEOGRAPH +0xCED1 0x7F6B #CJK UNIFIED IDEOGRAPH +0xCED2 0x4E56 #CJK UNIFIED IDEOGRAPH +0xCED3 0x5080 #CJK UNIFIED IDEOGRAPH +0xCED4 0x584A #CJK UNIFIED IDEOGRAPH +0xCED5 0x58DE #CJK UNIFIED IDEOGRAPH +0xCED6 0x602A #CJK UNIFIED IDEOGRAPH +0xCED7 0x6127 #CJK UNIFIED IDEOGRAPH +0xCED8 0x62D0 #CJK UNIFIED IDEOGRAPH +0xCED9 0x69D0 #CJK UNIFIED IDEOGRAPH +0xCEDA 0x9B41 #CJK UNIFIED IDEOGRAPH +0xCEDB 0x5B8F #CJK UNIFIED IDEOGRAPH +0xCEDC 0x7D18 #CJK UNIFIED IDEOGRAPH +0xCEDD 0x80B1 #CJK UNIFIED IDEOGRAPH +0xCEDE 0x8F5F #CJK UNIFIED IDEOGRAPH +0xCEDF 0x4EA4 #CJK UNIFIED IDEOGRAPH +0xCEE0 0x50D1 #CJK UNIFIED IDEOGRAPH +0xCEE1 0x54AC #CJK UNIFIED IDEOGRAPH +0xCEE2 0x55AC #CJK UNIFIED IDEOGRAPH +0xCEE3 0x5B0C #CJK UNIFIED IDEOGRAPH +0xCEE4 0x5DA0 #CJK UNIFIED IDEOGRAPH +0xCEE5 0x5DE7 #CJK UNIFIED IDEOGRAPH +0xCEE6 0x652A #CJK UNIFIED IDEOGRAPH +0xCEE7 0x654E #CJK UNIFIED IDEOGRAPH +0xCEE8 0x6821 #CJK UNIFIED IDEOGRAPH +0xCEE9 0x6A4B #CJK UNIFIED IDEOGRAPH +0xCEEA 0x72E1 #CJK UNIFIED IDEOGRAPH +0xCEEB 0x768E #CJK UNIFIED IDEOGRAPH +0xCEEC 0x77EF #CJK UNIFIED IDEOGRAPH +0xCEED 0x7D5E #CJK UNIFIED IDEOGRAPH +0xCEEE 0x7FF9 #CJK UNIFIED IDEOGRAPH +0xCEEF 0x81A0 #CJK UNIFIED IDEOGRAPH +0xCEF0 0x854E #CJK UNIFIED IDEOGRAPH +0xCEF1 0x86DF #CJK UNIFIED IDEOGRAPH +0xCEF2 0x8F03 #CJK UNIFIED IDEOGRAPH +0xCEF3 0x8F4E #CJK UNIFIED IDEOGRAPH +0xCEF4 0x90CA #CJK UNIFIED IDEOGRAPH +0xCEF5 0x9903 #CJK UNIFIED IDEOGRAPH +0xCEF6 0x9A55 #CJK UNIFIED IDEOGRAPH +0xCEF7 0x9BAB #CJK UNIFIED IDEOGRAPH +0xCEF8 0x4E18 #CJK UNIFIED IDEOGRAPH +0xCEF9 0x4E45 #CJK UNIFIED IDEOGRAPH +0xCEFA 0x4E5D #CJK UNIFIED IDEOGRAPH +0xCEFB 0x4EC7 #CJK UNIFIED IDEOGRAPH +0xCEFC 0x4FF1 #CJK UNIFIED IDEOGRAPH +0xCEFD 0x5177 #CJK UNIFIED IDEOGRAPH +0xCEFE 0x52FE #CJK UNIFIED IDEOGRAPH +0xCFA1 0x5340 #CJK UNIFIED IDEOGRAPH +0xCFA2 0x53E3 #CJK UNIFIED IDEOGRAPH +0xCFA3 0x53E5 #CJK UNIFIED IDEOGRAPH +0xCFA4 0x548E #CJK UNIFIED IDEOGRAPH +0xCFA5 0x5614 #CJK UNIFIED IDEOGRAPH +0xCFA6 0x5775 #CJK UNIFIED IDEOGRAPH +0xCFA7 0x57A2 #CJK UNIFIED IDEOGRAPH +0xCFA8 0x5BC7 #CJK UNIFIED IDEOGRAPH +0xCFA9 0x5D87 #CJK UNIFIED IDEOGRAPH +0xCFAA 0x5ED0 #CJK UNIFIED IDEOGRAPH +0xCFAB 0x61FC #CJK UNIFIED IDEOGRAPH +0xCFAC 0x62D8 #CJK UNIFIED IDEOGRAPH +0xCFAD 0x6551 #CJK UNIFIED IDEOGRAPH +0xCFAE 0x67B8 #CJK UNIFIED IDEOGRAPH +0xCFAF 0x67E9 #CJK UNIFIED IDEOGRAPH +0xCFB0 0x69CB #CJK UNIFIED IDEOGRAPH +0xCFB1 0x6B50 #CJK UNIFIED IDEOGRAPH +0xCFB2 0x6BC6 #CJK UNIFIED IDEOGRAPH +0xCFB3 0x6BEC #CJK UNIFIED IDEOGRAPH +0xCFB4 0x6C42 #CJK UNIFIED IDEOGRAPH +0xCFB5 0x6E9D #CJK UNIFIED IDEOGRAPH +0xCFB6 0x7078 #CJK UNIFIED IDEOGRAPH +0xCFB7 0x72D7 #CJK UNIFIED IDEOGRAPH +0xCFB8 0x7396 #CJK UNIFIED IDEOGRAPH +0xCFB9 0x7403 #CJK UNIFIED IDEOGRAPH +0xCFBA 0x77BF #CJK UNIFIED IDEOGRAPH +0xCFBB 0x77E9 #CJK UNIFIED IDEOGRAPH +0xCFBC 0x7A76 #CJK UNIFIED IDEOGRAPH +0xCFBD 0x7D7F #CJK UNIFIED IDEOGRAPH +0xCFBE 0x8009 #CJK UNIFIED IDEOGRAPH +0xCFBF 0x81FC #CJK UNIFIED IDEOGRAPH +0xCFC0 0x8205 #CJK UNIFIED IDEOGRAPH +0xCFC1 0x820A #CJK UNIFIED IDEOGRAPH +0xCFC2 0x82DF #CJK UNIFIED IDEOGRAPH +0xCFC3 0x8862 #CJK UNIFIED IDEOGRAPH +0xCFC4 0x8B33 #CJK UNIFIED IDEOGRAPH +0xCFC5 0x8CFC #CJK UNIFIED IDEOGRAPH +0xCFC6 0x8EC0 #CJK UNIFIED IDEOGRAPH +0xCFC7 0x9011 #CJK UNIFIED IDEOGRAPH +0xCFC8 0x90B1 #CJK UNIFIED IDEOGRAPH +0xCFC9 0x9264 #CJK UNIFIED IDEOGRAPH +0xCFCA 0x92B6 #CJK UNIFIED IDEOGRAPH +0xCFCB 0x99D2 #CJK UNIFIED IDEOGRAPH +0xCFCC 0x9A45 #CJK UNIFIED IDEOGRAPH +0xCFCD 0x9CE9 #CJK UNIFIED IDEOGRAPH +0xCFCE 0x9DD7 #CJK UNIFIED IDEOGRAPH +0xCFCF 0x9F9C #CJK UNIFIED IDEOGRAPH +0xCFD0 0x570B #CJK UNIFIED IDEOGRAPH +0xCFD1 0x5C40 #CJK UNIFIED IDEOGRAPH +0xCFD2 0x83CA #CJK UNIFIED IDEOGRAPH +0xCFD3 0x97A0 #CJK UNIFIED IDEOGRAPH +0xCFD4 0x97AB #CJK UNIFIED IDEOGRAPH +0xCFD5 0x9EB4 #CJK UNIFIED IDEOGRAPH +0xCFD6 0x541B #CJK UNIFIED IDEOGRAPH +0xCFD7 0x7A98 #CJK UNIFIED IDEOGRAPH +0xCFD8 0x7FA4 #CJK UNIFIED IDEOGRAPH +0xCFD9 0x88D9 #CJK UNIFIED IDEOGRAPH +0xCFDA 0x8ECD #CJK UNIFIED IDEOGRAPH +0xCFDB 0x90E1 #CJK UNIFIED IDEOGRAPH +0xCFDC 0x5800 #CJK UNIFIED IDEOGRAPH +0xCFDD 0x5C48 #CJK UNIFIED IDEOGRAPH +0xCFDE 0x6398 #CJK UNIFIED IDEOGRAPH +0xCFDF 0x7A9F #CJK UNIFIED IDEOGRAPH +0xCFE0 0x5BAE #CJK UNIFIED IDEOGRAPH +0xCFE1 0x5F13 #CJK UNIFIED IDEOGRAPH +0xCFE2 0x7A79 #CJK UNIFIED IDEOGRAPH +0xCFE3 0x7AAE #CJK UNIFIED IDEOGRAPH +0xCFE4 0x828E #CJK UNIFIED IDEOGRAPH +0xCFE5 0x8EAC #CJK UNIFIED IDEOGRAPH +0xCFE6 0x5026 #CJK UNIFIED IDEOGRAPH +0xCFE7 0x5238 #CJK UNIFIED IDEOGRAPH +0xCFE8 0x52F8 #CJK UNIFIED IDEOGRAPH +0xCFE9 0x5377 #CJK UNIFIED IDEOGRAPH +0xCFEA 0x5708 #CJK UNIFIED IDEOGRAPH +0xCFEB 0x62F3 #CJK UNIFIED IDEOGRAPH +0xCFEC 0x6372 #CJK UNIFIED IDEOGRAPH +0xCFED 0x6B0A #CJK UNIFIED IDEOGRAPH +0xCFEE 0x6DC3 #CJK UNIFIED IDEOGRAPH +0xCFEF 0x7737 #CJK UNIFIED IDEOGRAPH +0xCFF0 0x53A5 #CJK UNIFIED IDEOGRAPH +0xCFF1 0x7357 #CJK UNIFIED IDEOGRAPH +0xCFF2 0x8568 #CJK UNIFIED IDEOGRAPH +0xCFF3 0x8E76 #CJK UNIFIED IDEOGRAPH +0xCFF4 0x95D5 #CJK UNIFIED IDEOGRAPH +0xCFF5 0x673A #CJK UNIFIED IDEOGRAPH +0xCFF6 0x6AC3 #CJK UNIFIED IDEOGRAPH +0xCFF7 0x6F70 #CJK UNIFIED IDEOGRAPH +0xCFF8 0x8A6D #CJK UNIFIED IDEOGRAPH +0xCFF9 0x8ECC #CJK UNIFIED IDEOGRAPH +0xCFFA 0x994B #CJK UNIFIED IDEOGRAPH +0xCFFB 0xF906 #CJK COMPATIBILITY IDEOGRAPH +0xCFFC 0x6677 #CJK UNIFIED IDEOGRAPH +0xCFFD 0x6B78 #CJK UNIFIED IDEOGRAPH +0xCFFE 0x8CB4 #CJK UNIFIED IDEOGRAPH +0xD0A1 0x9B3C #CJK UNIFIED IDEOGRAPH +0xD0A2 0xF907 #CJK COMPATIBILITY IDEOGRAPH +0xD0A3 0x53EB #CJK UNIFIED IDEOGRAPH +0xD0A4 0x572D #CJK UNIFIED IDEOGRAPH +0xD0A5 0x594E #CJK UNIFIED IDEOGRAPH +0xD0A6 0x63C6 #CJK UNIFIED IDEOGRAPH +0xD0A7 0x69FB #CJK UNIFIED IDEOGRAPH +0xD0A8 0x73EA #CJK UNIFIED IDEOGRAPH +0xD0A9 0x7845 #CJK UNIFIED IDEOGRAPH +0xD0AA 0x7ABA #CJK UNIFIED IDEOGRAPH +0xD0AB 0x7AC5 #CJK UNIFIED IDEOGRAPH +0xD0AC 0x7CFE #CJK UNIFIED IDEOGRAPH +0xD0AD 0x8475 #CJK UNIFIED IDEOGRAPH +0xD0AE 0x898F #CJK UNIFIED IDEOGRAPH +0xD0AF 0x8D73 #CJK UNIFIED IDEOGRAPH +0xD0B0 0x9035 #CJK UNIFIED IDEOGRAPH +0xD0B1 0x95A8 #CJK UNIFIED IDEOGRAPH +0xD0B2 0x52FB #CJK UNIFIED IDEOGRAPH +0xD0B3 0x5747 #CJK UNIFIED IDEOGRAPH +0xD0B4 0x7547 #CJK UNIFIED IDEOGRAPH +0xD0B5 0x7B60 #CJK UNIFIED IDEOGRAPH +0xD0B6 0x83CC #CJK UNIFIED IDEOGRAPH +0xD0B7 0x921E #CJK UNIFIED IDEOGRAPH +0xD0B8 0xF908 #CJK COMPATIBILITY IDEOGRAPH +0xD0B9 0x6A58 #CJK UNIFIED IDEOGRAPH +0xD0BA 0x514B #CJK UNIFIED IDEOGRAPH +0xD0BB 0x524B #CJK UNIFIED IDEOGRAPH +0xD0BC 0x5287 #CJK UNIFIED IDEOGRAPH +0xD0BD 0x621F #CJK UNIFIED IDEOGRAPH +0xD0BE 0x68D8 #CJK UNIFIED IDEOGRAPH +0xD0BF 0x6975 #CJK UNIFIED IDEOGRAPH +0xD0C0 0x9699 #CJK UNIFIED IDEOGRAPH +0xD0C1 0x50C5 #CJK UNIFIED IDEOGRAPH +0xD0C2 0x52A4 #CJK UNIFIED IDEOGRAPH +0xD0C3 0x52E4 #CJK UNIFIED IDEOGRAPH +0xD0C4 0x61C3 #CJK UNIFIED IDEOGRAPH +0xD0C5 0x65A4 #CJK UNIFIED IDEOGRAPH +0xD0C6 0x6839 #CJK UNIFIED IDEOGRAPH +0xD0C7 0x69FF #CJK UNIFIED IDEOGRAPH +0xD0C8 0x747E #CJK UNIFIED IDEOGRAPH +0xD0C9 0x7B4B #CJK UNIFIED IDEOGRAPH +0xD0CA 0x82B9 #CJK UNIFIED IDEOGRAPH +0xD0CB 0x83EB #CJK UNIFIED IDEOGRAPH +0xD0CC 0x89B2 #CJK UNIFIED IDEOGRAPH +0xD0CD 0x8B39 #CJK UNIFIED IDEOGRAPH +0xD0CE 0x8FD1 #CJK UNIFIED IDEOGRAPH +0xD0CF 0x9949 #CJK UNIFIED IDEOGRAPH +0xD0D0 0xF909 #CJK COMPATIBILITY IDEOGRAPH +0xD0D1 0x4ECA #CJK UNIFIED IDEOGRAPH +0xD0D2 0x5997 #CJK UNIFIED IDEOGRAPH +0xD0D3 0x64D2 #CJK UNIFIED IDEOGRAPH +0xD0D4 0x6611 #CJK UNIFIED IDEOGRAPH +0xD0D5 0x6A8E #CJK UNIFIED IDEOGRAPH +0xD0D6 0x7434 #CJK UNIFIED IDEOGRAPH +0xD0D7 0x7981 #CJK UNIFIED IDEOGRAPH +0xD0D8 0x79BD #CJK UNIFIED IDEOGRAPH +0xD0D9 0x82A9 #CJK UNIFIED IDEOGRAPH +0xD0DA 0x887E #CJK UNIFIED IDEOGRAPH +0xD0DB 0x887F #CJK UNIFIED IDEOGRAPH +0xD0DC 0x895F #CJK UNIFIED IDEOGRAPH +0xD0DD 0xF90A #CJK COMPATIBILITY IDEOGRAPH +0xD0DE 0x9326 #CJK UNIFIED IDEOGRAPH +0xD0DF 0x4F0B #CJK UNIFIED IDEOGRAPH +0xD0E0 0x53CA #CJK UNIFIED IDEOGRAPH +0xD0E1 0x6025 #CJK UNIFIED IDEOGRAPH +0xD0E2 0x6271 #CJK UNIFIED IDEOGRAPH +0xD0E3 0x6C72 #CJK UNIFIED IDEOGRAPH +0xD0E4 0x7D1A #CJK UNIFIED IDEOGRAPH +0xD0E5 0x7D66 #CJK UNIFIED IDEOGRAPH +0xD0E6 0x4E98 #CJK UNIFIED IDEOGRAPH +0xD0E7 0x5162 #CJK UNIFIED IDEOGRAPH +0xD0E8 0x77DC #CJK UNIFIED IDEOGRAPH +0xD0E9 0x80AF #CJK UNIFIED IDEOGRAPH +0xD0EA 0x4F01 #CJK UNIFIED IDEOGRAPH +0xD0EB 0x4F0E #CJK UNIFIED IDEOGRAPH +0xD0EC 0x5176 #CJK UNIFIED IDEOGRAPH +0xD0ED 0x5180 #CJK UNIFIED IDEOGRAPH +0xD0EE 0x55DC #CJK UNIFIED IDEOGRAPH +0xD0EF 0x5668 #CJK UNIFIED IDEOGRAPH +0xD0F0 0x573B #CJK UNIFIED IDEOGRAPH +0xD0F1 0x57FA #CJK UNIFIED IDEOGRAPH +0xD0F2 0x57FC #CJK UNIFIED IDEOGRAPH +0xD0F3 0x5914 #CJK UNIFIED IDEOGRAPH +0xD0F4 0x5947 #CJK UNIFIED IDEOGRAPH +0xD0F5 0x5993 #CJK UNIFIED IDEOGRAPH +0xD0F6 0x5BC4 #CJK UNIFIED IDEOGRAPH +0xD0F7 0x5C90 #CJK UNIFIED IDEOGRAPH +0xD0F8 0x5D0E #CJK UNIFIED IDEOGRAPH +0xD0F9 0x5DF1 #CJK UNIFIED IDEOGRAPH +0xD0FA 0x5E7E #CJK UNIFIED IDEOGRAPH +0xD0FB 0x5FCC #CJK UNIFIED IDEOGRAPH +0xD0FC 0x6280 #CJK UNIFIED IDEOGRAPH +0xD0FD 0x65D7 #CJK UNIFIED IDEOGRAPH +0xD0FE 0x65E3 #CJK UNIFIED IDEOGRAPH +0xD1A1 0x671E #CJK UNIFIED IDEOGRAPH +0xD1A2 0x671F #CJK UNIFIED IDEOGRAPH +0xD1A3 0x675E #CJK UNIFIED IDEOGRAPH +0xD1A4 0x68CB #CJK UNIFIED IDEOGRAPH +0xD1A5 0x68C4 #CJK UNIFIED IDEOGRAPH +0xD1A6 0x6A5F #CJK UNIFIED IDEOGRAPH +0xD1A7 0x6B3A #CJK UNIFIED IDEOGRAPH +0xD1A8 0x6C23 #CJK UNIFIED IDEOGRAPH +0xD1A9 0x6C7D #CJK UNIFIED IDEOGRAPH +0xD1AA 0x6C82 #CJK UNIFIED IDEOGRAPH +0xD1AB 0x6DC7 #CJK UNIFIED IDEOGRAPH +0xD1AC 0x7398 #CJK UNIFIED IDEOGRAPH +0xD1AD 0x7426 #CJK UNIFIED IDEOGRAPH +0xD1AE 0x742A #CJK UNIFIED IDEOGRAPH +0xD1AF 0x7482 #CJK UNIFIED IDEOGRAPH +0xD1B0 0x74A3 #CJK UNIFIED IDEOGRAPH +0xD1B1 0x7578 #CJK UNIFIED IDEOGRAPH +0xD1B2 0x757F #CJK UNIFIED IDEOGRAPH +0xD1B3 0x7881 #CJK UNIFIED IDEOGRAPH +0xD1B4 0x78EF #CJK UNIFIED IDEOGRAPH +0xD1B5 0x7941 #CJK UNIFIED IDEOGRAPH +0xD1B6 0x7947 #CJK UNIFIED IDEOGRAPH +0xD1B7 0x7948 #CJK UNIFIED IDEOGRAPH +0xD1B8 0x797A #CJK UNIFIED IDEOGRAPH +0xD1B9 0x7B95 #CJK UNIFIED IDEOGRAPH +0xD1BA 0x7D00 #CJK UNIFIED IDEOGRAPH +0xD1BB 0x7DBA #CJK UNIFIED IDEOGRAPH +0xD1BC 0x7F88 #CJK UNIFIED IDEOGRAPH +0xD1BD 0x8006 #CJK UNIFIED IDEOGRAPH +0xD1BE 0x802D #CJK UNIFIED IDEOGRAPH +0xD1BF 0x808C #CJK UNIFIED IDEOGRAPH +0xD1C0 0x8A18 #CJK UNIFIED IDEOGRAPH +0xD1C1 0x8B4F #CJK UNIFIED IDEOGRAPH +0xD1C2 0x8C48 #CJK UNIFIED IDEOGRAPH +0xD1C3 0x8D77 #CJK UNIFIED IDEOGRAPH +0xD1C4 0x9321 #CJK UNIFIED IDEOGRAPH +0xD1C5 0x9324 #CJK UNIFIED IDEOGRAPH +0xD1C6 0x98E2 #CJK UNIFIED IDEOGRAPH +0xD1C7 0x9951 #CJK UNIFIED IDEOGRAPH +0xD1C8 0x9A0E #CJK UNIFIED IDEOGRAPH +0xD1C9 0x9A0F #CJK UNIFIED IDEOGRAPH +0xD1CA 0x9A65 #CJK UNIFIED IDEOGRAPH +0xD1CB 0x9E92 #CJK UNIFIED IDEOGRAPH +0xD1CC 0x7DCA #CJK UNIFIED IDEOGRAPH +0xD1CD 0x4F76 #CJK UNIFIED IDEOGRAPH +0xD1CE 0x5409 #CJK UNIFIED IDEOGRAPH +0xD1CF 0x62EE #CJK UNIFIED IDEOGRAPH +0xD1D0 0x6854 #CJK UNIFIED IDEOGRAPH +0xD1D1 0x91D1 #CJK UNIFIED IDEOGRAPH +0xD1D2 0x55AB #CJK UNIFIED IDEOGRAPH +0xD1D3 0x513A #CJK UNIFIED IDEOGRAPH +0xD1D4 0xF90B #CJK COMPATIBILITY IDEOGRAPH +0xD1D5 0xF90C #CJK COMPATIBILITY IDEOGRAPH +0xD1D6 0x5A1C #CJK UNIFIED IDEOGRAPH +0xD1D7 0x61E6 #CJK UNIFIED IDEOGRAPH +0xD1D8 0xF90D #CJK COMPATIBILITY IDEOGRAPH +0xD1D9 0x62CF #CJK UNIFIED IDEOGRAPH +0xD1DA 0x62FF #CJK UNIFIED IDEOGRAPH +0xD1DB 0xF90E #CJK COMPATIBILITY IDEOGRAPH +0xD1DC 0xF90F #CJK COMPATIBILITY IDEOGRAPH +0xD1DD 0xF910 #CJK COMPATIBILITY IDEOGRAPH +0xD1DE 0xF911 #CJK COMPATIBILITY IDEOGRAPH +0xD1DF 0xF912 #CJK COMPATIBILITY IDEOGRAPH +0xD1E0 0xF913 #CJK COMPATIBILITY IDEOGRAPH +0xD1E1 0x90A3 #CJK UNIFIED IDEOGRAPH +0xD1E2 0xF914 #CJK COMPATIBILITY IDEOGRAPH +0xD1E3 0xF915 #CJK COMPATIBILITY IDEOGRAPH +0xD1E4 0xF916 #CJK COMPATIBILITY IDEOGRAPH +0xD1E5 0xF917 #CJK COMPATIBILITY IDEOGRAPH +0xD1E6 0xF918 #CJK COMPATIBILITY IDEOGRAPH +0xD1E7 0x8AFE #CJK UNIFIED IDEOGRAPH +0xD1E8 0xF919 #CJK COMPATIBILITY IDEOGRAPH +0xD1E9 0xF91A #CJK COMPATIBILITY IDEOGRAPH +0xD1EA 0xF91B #CJK COMPATIBILITY IDEOGRAPH +0xD1EB 0xF91C #CJK COMPATIBILITY IDEOGRAPH +0xD1EC 0x6696 #CJK UNIFIED IDEOGRAPH +0xD1ED 0xF91D #CJK COMPATIBILITY IDEOGRAPH +0xD1EE 0x7156 #CJK UNIFIED IDEOGRAPH +0xD1EF 0xF91E #CJK COMPATIBILITY IDEOGRAPH +0xD1F0 0xF91F #CJK COMPATIBILITY IDEOGRAPH +0xD1F1 0x96E3 #CJK UNIFIED IDEOGRAPH +0xD1F2 0xF920 #CJK COMPATIBILITY IDEOGRAPH +0xD1F3 0x634F #CJK UNIFIED IDEOGRAPH +0xD1F4 0x637A #CJK UNIFIED IDEOGRAPH +0xD1F5 0x5357 #CJK UNIFIED IDEOGRAPH +0xD1F6 0xF921 #CJK COMPATIBILITY IDEOGRAPH +0xD1F7 0x678F #CJK UNIFIED IDEOGRAPH +0xD1F8 0x6960 #CJK UNIFIED IDEOGRAPH +0xD1F9 0x6E73 #CJK UNIFIED IDEOGRAPH +0xD1FA 0xF922 #CJK COMPATIBILITY IDEOGRAPH +0xD1FB 0x7537 #CJK UNIFIED IDEOGRAPH +0xD1FC 0xF923 #CJK COMPATIBILITY IDEOGRAPH +0xD1FD 0xF924 #CJK COMPATIBILITY IDEOGRAPH +0xD1FE 0xF925 #CJK COMPATIBILITY IDEOGRAPH +0xD2A1 0x7D0D #CJK UNIFIED IDEOGRAPH +0xD2A2 0xF926 #CJK COMPATIBILITY IDEOGRAPH +0xD2A3 0xF927 #CJK COMPATIBILITY IDEOGRAPH +0xD2A4 0x8872 #CJK UNIFIED IDEOGRAPH +0xD2A5 0x56CA #CJK UNIFIED IDEOGRAPH +0xD2A6 0x5A18 #CJK UNIFIED IDEOGRAPH +0xD2A7 0xF928 #CJK COMPATIBILITY IDEOGRAPH +0xD2A8 0xF929 #CJK COMPATIBILITY IDEOGRAPH +0xD2A9 0xF92A #CJK COMPATIBILITY IDEOGRAPH +0xD2AA 0xF92B #CJK COMPATIBILITY IDEOGRAPH +0xD2AB 0xF92C #CJK COMPATIBILITY IDEOGRAPH +0xD2AC 0x4E43 #CJK UNIFIED IDEOGRAPH +0xD2AD 0xF92D #CJK COMPATIBILITY IDEOGRAPH +0xD2AE 0x5167 #CJK UNIFIED IDEOGRAPH +0xD2AF 0x5948 #CJK UNIFIED IDEOGRAPH +0xD2B0 0x67F0 #CJK UNIFIED IDEOGRAPH +0xD2B1 0x8010 #CJK UNIFIED IDEOGRAPH +0xD2B2 0xF92E #CJK COMPATIBILITY IDEOGRAPH +0xD2B3 0x5973 #CJK UNIFIED IDEOGRAPH +0xD2B4 0x5E74 #CJK UNIFIED IDEOGRAPH +0xD2B5 0x649A #CJK UNIFIED IDEOGRAPH +0xD2B6 0x79CA #CJK UNIFIED IDEOGRAPH +0xD2B7 0x5FF5 #CJK UNIFIED IDEOGRAPH +0xD2B8 0x606C #CJK UNIFIED IDEOGRAPH +0xD2B9 0x62C8 #CJK UNIFIED IDEOGRAPH +0xD2BA 0x637B #CJK UNIFIED IDEOGRAPH +0xD2BB 0x5BE7 #CJK UNIFIED IDEOGRAPH +0xD2BC 0x5BD7 #CJK UNIFIED IDEOGRAPH +0xD2BD 0x52AA #CJK UNIFIED IDEOGRAPH +0xD2BE 0xF92F #CJK COMPATIBILITY IDEOGRAPH +0xD2BF 0x5974 #CJK UNIFIED IDEOGRAPH +0xD2C0 0x5F29 #CJK UNIFIED IDEOGRAPH +0xD2C1 0x6012 #CJK UNIFIED IDEOGRAPH +0xD2C2 0xF930 #CJK COMPATIBILITY IDEOGRAPH +0xD2C3 0xF931 #CJK COMPATIBILITY IDEOGRAPH +0xD2C4 0xF932 #CJK COMPATIBILITY IDEOGRAPH +0xD2C5 0x7459 #CJK UNIFIED IDEOGRAPH +0xD2C6 0xF933 #CJK COMPATIBILITY IDEOGRAPH +0xD2C7 0xF934 #CJK COMPATIBILITY IDEOGRAPH +0xD2C8 0xF935 #CJK COMPATIBILITY IDEOGRAPH +0xD2C9 0xF936 #CJK COMPATIBILITY IDEOGRAPH +0xD2CA 0xF937 #CJK COMPATIBILITY IDEOGRAPH +0xD2CB 0xF938 #CJK COMPATIBILITY IDEOGRAPH +0xD2CC 0x99D1 #CJK UNIFIED IDEOGRAPH +0xD2CD 0xF939 #CJK COMPATIBILITY IDEOGRAPH +0xD2CE 0xF93A #CJK COMPATIBILITY IDEOGRAPH +0xD2CF 0xF93B #CJK COMPATIBILITY IDEOGRAPH +0xD2D0 0xF93C #CJK COMPATIBILITY IDEOGRAPH +0xD2D1 0xF93D #CJK COMPATIBILITY IDEOGRAPH +0xD2D2 0xF93E #CJK COMPATIBILITY IDEOGRAPH +0xD2D3 0xF93F #CJK COMPATIBILITY IDEOGRAPH +0xD2D4 0xF940 #CJK COMPATIBILITY IDEOGRAPH +0xD2D5 0xF941 #CJK COMPATIBILITY IDEOGRAPH +0xD2D6 0xF942 #CJK COMPATIBILITY IDEOGRAPH +0xD2D7 0xF943 #CJK COMPATIBILITY IDEOGRAPH +0xD2D8 0x6FC3 #CJK UNIFIED IDEOGRAPH +0xD2D9 0xF944 #CJK COMPATIBILITY IDEOGRAPH +0xD2DA 0xF945 #CJK COMPATIBILITY IDEOGRAPH +0xD2DB 0x81BF #CJK UNIFIED IDEOGRAPH +0xD2DC 0x8FB2 #CJK UNIFIED IDEOGRAPH +0xD2DD 0x60F1 #CJK UNIFIED IDEOGRAPH +0xD2DE 0xF946 #CJK COMPATIBILITY IDEOGRAPH +0xD2DF 0xF947 #CJK COMPATIBILITY IDEOGRAPH +0xD2E0 0x8166 #CJK UNIFIED IDEOGRAPH +0xD2E1 0xF948 #CJK COMPATIBILITY IDEOGRAPH +0xD2E2 0xF949 #CJK COMPATIBILITY IDEOGRAPH +0xD2E3 0x5C3F #CJK UNIFIED IDEOGRAPH +0xD2E4 0xF94A #CJK COMPATIBILITY IDEOGRAPH +0xD2E5 0xF94B #CJK COMPATIBILITY IDEOGRAPH +0xD2E6 0xF94C #CJK COMPATIBILITY IDEOGRAPH +0xD2E7 0xF94D #CJK COMPATIBILITY IDEOGRAPH +0xD2E8 0xF94E #CJK COMPATIBILITY IDEOGRAPH +0xD2E9 0xF94F #CJK COMPATIBILITY IDEOGRAPH +0xD2EA 0xF950 #CJK COMPATIBILITY IDEOGRAPH +0xD2EB 0xF951 #CJK COMPATIBILITY IDEOGRAPH +0xD2EC 0x5AE9 #CJK UNIFIED IDEOGRAPH +0xD2ED 0x8A25 #CJK UNIFIED IDEOGRAPH +0xD2EE 0x677B #CJK UNIFIED IDEOGRAPH +0xD2EF 0x7D10 #CJK UNIFIED IDEOGRAPH +0xD2F0 0xF952 #CJK COMPATIBILITY IDEOGRAPH +0xD2F1 0xF953 #CJK COMPATIBILITY IDEOGRAPH +0xD2F2 0xF954 #CJK COMPATIBILITY IDEOGRAPH +0xD2F3 0xF955 #CJK COMPATIBILITY IDEOGRAPH +0xD2F4 0xF956 #CJK COMPATIBILITY IDEOGRAPH +0xD2F5 0xF957 #CJK COMPATIBILITY IDEOGRAPH +0xD2F6 0x80FD #CJK UNIFIED IDEOGRAPH +0xD2F7 0xF958 #CJK COMPATIBILITY IDEOGRAPH +0xD2F8 0xF959 #CJK COMPATIBILITY IDEOGRAPH +0xD2F9 0x5C3C #CJK UNIFIED IDEOGRAPH +0xD2FA 0x6CE5 #CJK UNIFIED IDEOGRAPH +0xD2FB 0x533F #CJK UNIFIED IDEOGRAPH +0xD2FC 0x6EBA #CJK UNIFIED IDEOGRAPH +0xD2FD 0x591A #CJK UNIFIED IDEOGRAPH +0xD2FE 0x8336 #CJK UNIFIED IDEOGRAPH +0xD3A1 0x4E39 #CJK UNIFIED IDEOGRAPH +0xD3A2 0x4EB6 #CJK UNIFIED IDEOGRAPH +0xD3A3 0x4F46 #CJK UNIFIED IDEOGRAPH +0xD3A4 0x55AE #CJK UNIFIED IDEOGRAPH +0xD3A5 0x5718 #CJK UNIFIED IDEOGRAPH +0xD3A6 0x58C7 #CJK UNIFIED IDEOGRAPH +0xD3A7 0x5F56 #CJK UNIFIED IDEOGRAPH +0xD3A8 0x65B7 #CJK UNIFIED IDEOGRAPH +0xD3A9 0x65E6 #CJK UNIFIED IDEOGRAPH +0xD3AA 0x6A80 #CJK UNIFIED IDEOGRAPH +0xD3AB 0x6BB5 #CJK UNIFIED IDEOGRAPH +0xD3AC 0x6E4D #CJK UNIFIED IDEOGRAPH +0xD3AD 0x77ED #CJK UNIFIED IDEOGRAPH +0xD3AE 0x7AEF #CJK UNIFIED IDEOGRAPH +0xD3AF 0x7C1E #CJK UNIFIED IDEOGRAPH +0xD3B0 0x7DDE #CJK UNIFIED IDEOGRAPH +0xD3B1 0x86CB #CJK UNIFIED IDEOGRAPH +0xD3B2 0x8892 #CJK UNIFIED IDEOGRAPH +0xD3B3 0x9132 #CJK UNIFIED IDEOGRAPH +0xD3B4 0x935B #CJK UNIFIED IDEOGRAPH +0xD3B5 0x64BB #CJK UNIFIED IDEOGRAPH +0xD3B6 0x6FBE #CJK UNIFIED IDEOGRAPH +0xD3B7 0x737A #CJK UNIFIED IDEOGRAPH +0xD3B8 0x75B8 #CJK UNIFIED IDEOGRAPH +0xD3B9 0x9054 #CJK UNIFIED IDEOGRAPH +0xD3BA 0x5556 #CJK UNIFIED IDEOGRAPH +0xD3BB 0x574D #CJK UNIFIED IDEOGRAPH +0xD3BC 0x61BA #CJK UNIFIED IDEOGRAPH +0xD3BD 0x64D4 #CJK UNIFIED IDEOGRAPH +0xD3BE 0x66C7 #CJK UNIFIED IDEOGRAPH +0xD3BF 0x6DE1 #CJK UNIFIED IDEOGRAPH +0xD3C0 0x6E5B #CJK UNIFIED IDEOGRAPH +0xD3C1 0x6F6D #CJK UNIFIED IDEOGRAPH +0xD3C2 0x6FB9 #CJK UNIFIED IDEOGRAPH +0xD3C3 0x75F0 #CJK UNIFIED IDEOGRAPH +0xD3C4 0x8043 #CJK UNIFIED IDEOGRAPH +0xD3C5 0x81BD #CJK UNIFIED IDEOGRAPH +0xD3C6 0x8541 #CJK UNIFIED IDEOGRAPH +0xD3C7 0x8983 #CJK UNIFIED IDEOGRAPH +0xD3C8 0x8AC7 #CJK UNIFIED IDEOGRAPH +0xD3C9 0x8B5A #CJK UNIFIED IDEOGRAPH +0xD3CA 0x931F #CJK UNIFIED IDEOGRAPH +0xD3CB 0x6C93 #CJK UNIFIED IDEOGRAPH +0xD3CC 0x7553 #CJK UNIFIED IDEOGRAPH +0xD3CD 0x7B54 #CJK UNIFIED IDEOGRAPH +0xD3CE 0x8E0F #CJK UNIFIED IDEOGRAPH +0xD3CF 0x905D #CJK UNIFIED IDEOGRAPH +0xD3D0 0x5510 #CJK UNIFIED IDEOGRAPH +0xD3D1 0x5802 #CJK UNIFIED IDEOGRAPH +0xD3D2 0x5858 #CJK UNIFIED IDEOGRAPH +0xD3D3 0x5E62 #CJK UNIFIED IDEOGRAPH +0xD3D4 0x6207 #CJK UNIFIED IDEOGRAPH +0xD3D5 0x649E #CJK UNIFIED IDEOGRAPH +0xD3D6 0x68E0 #CJK UNIFIED IDEOGRAPH +0xD3D7 0x7576 #CJK UNIFIED IDEOGRAPH +0xD3D8 0x7CD6 #CJK UNIFIED IDEOGRAPH +0xD3D9 0x87B3 #CJK UNIFIED IDEOGRAPH +0xD3DA 0x9EE8 #CJK UNIFIED IDEOGRAPH +0xD3DB 0x4EE3 #CJK UNIFIED IDEOGRAPH +0xD3DC 0x5788 #CJK UNIFIED IDEOGRAPH +0xD3DD 0x576E #CJK UNIFIED IDEOGRAPH +0xD3DE 0x5927 #CJK UNIFIED IDEOGRAPH +0xD3DF 0x5C0D #CJK UNIFIED IDEOGRAPH +0xD3E0 0x5CB1 #CJK UNIFIED IDEOGRAPH +0xD3E1 0x5E36 #CJK UNIFIED IDEOGRAPH +0xD3E2 0x5F85 #CJK UNIFIED IDEOGRAPH +0xD3E3 0x6234 #CJK UNIFIED IDEOGRAPH +0xD3E4 0x64E1 #CJK UNIFIED IDEOGRAPH +0xD3E5 0x73B3 #CJK UNIFIED IDEOGRAPH +0xD3E6 0x81FA #CJK UNIFIED IDEOGRAPH +0xD3E7 0x888B #CJK UNIFIED IDEOGRAPH +0xD3E8 0x8CB8 #CJK UNIFIED IDEOGRAPH +0xD3E9 0x968A #CJK UNIFIED IDEOGRAPH +0xD3EA 0x9EDB #CJK UNIFIED IDEOGRAPH +0xD3EB 0x5B85 #CJK UNIFIED IDEOGRAPH +0xD3EC 0x5FB7 #CJK UNIFIED IDEOGRAPH +0xD3ED 0x60B3 #CJK UNIFIED IDEOGRAPH +0xD3EE 0x5012 #CJK UNIFIED IDEOGRAPH +0xD3EF 0x5200 #CJK UNIFIED IDEOGRAPH +0xD3F0 0x5230 #CJK UNIFIED IDEOGRAPH +0xD3F1 0x5716 #CJK UNIFIED IDEOGRAPH +0xD3F2 0x5835 #CJK UNIFIED IDEOGRAPH +0xD3F3 0x5857 #CJK UNIFIED IDEOGRAPH +0xD3F4 0x5C0E #CJK UNIFIED IDEOGRAPH +0xD3F5 0x5C60 #CJK UNIFIED IDEOGRAPH +0xD3F6 0x5CF6 #CJK UNIFIED IDEOGRAPH +0xD3F7 0x5D8B #CJK UNIFIED IDEOGRAPH +0xD3F8 0x5EA6 #CJK UNIFIED IDEOGRAPH +0xD3F9 0x5F92 #CJK UNIFIED IDEOGRAPH +0xD3FA 0x60BC #CJK UNIFIED IDEOGRAPH +0xD3FB 0x6311 #CJK UNIFIED IDEOGRAPH +0xD3FC 0x6389 #CJK UNIFIED IDEOGRAPH +0xD3FD 0x6417 #CJK UNIFIED IDEOGRAPH +0xD3FE 0x6843 #CJK UNIFIED IDEOGRAPH +0xD4A1 0x68F9 #CJK UNIFIED IDEOGRAPH +0xD4A2 0x6AC2 #CJK UNIFIED IDEOGRAPH +0xD4A3 0x6DD8 #CJK UNIFIED IDEOGRAPH +0xD4A4 0x6E21 #CJK UNIFIED IDEOGRAPH +0xD4A5 0x6ED4 #CJK UNIFIED IDEOGRAPH +0xD4A6 0x6FE4 #CJK UNIFIED IDEOGRAPH +0xD4A7 0x71FE #CJK UNIFIED IDEOGRAPH +0xD4A8 0x76DC #CJK UNIFIED IDEOGRAPH +0xD4A9 0x7779 #CJK UNIFIED IDEOGRAPH +0xD4AA 0x79B1 #CJK UNIFIED IDEOGRAPH +0xD4AB 0x7A3B #CJK UNIFIED IDEOGRAPH +0xD4AC 0x8404 #CJK UNIFIED IDEOGRAPH +0xD4AD 0x89A9 #CJK UNIFIED IDEOGRAPH +0xD4AE 0x8CED #CJK UNIFIED IDEOGRAPH +0xD4AF 0x8DF3 #CJK UNIFIED IDEOGRAPH +0xD4B0 0x8E48 #CJK UNIFIED IDEOGRAPH +0xD4B1 0x9003 #CJK UNIFIED IDEOGRAPH +0xD4B2 0x9014 #CJK UNIFIED IDEOGRAPH +0xD4B3 0x9053 #CJK UNIFIED IDEOGRAPH +0xD4B4 0x90FD #CJK UNIFIED IDEOGRAPH +0xD4B5 0x934D #CJK UNIFIED IDEOGRAPH +0xD4B6 0x9676 #CJK UNIFIED IDEOGRAPH +0xD4B7 0x97DC #CJK UNIFIED IDEOGRAPH +0xD4B8 0x6BD2 #CJK UNIFIED IDEOGRAPH +0xD4B9 0x7006 #CJK UNIFIED IDEOGRAPH +0xD4BA 0x7258 #CJK UNIFIED IDEOGRAPH +0xD4BB 0x72A2 #CJK UNIFIED IDEOGRAPH +0xD4BC 0x7368 #CJK UNIFIED IDEOGRAPH +0xD4BD 0x7763 #CJK UNIFIED IDEOGRAPH +0xD4BE 0x79BF #CJK UNIFIED IDEOGRAPH +0xD4BF 0x7BE4 #CJK UNIFIED IDEOGRAPH +0xD4C0 0x7E9B #CJK UNIFIED IDEOGRAPH +0xD4C1 0x8B80 #CJK UNIFIED IDEOGRAPH +0xD4C2 0x58A9 #CJK UNIFIED IDEOGRAPH +0xD4C3 0x60C7 #CJK UNIFIED IDEOGRAPH +0xD4C4 0x6566 #CJK UNIFIED IDEOGRAPH +0xD4C5 0x65FD #CJK UNIFIED IDEOGRAPH +0xD4C6 0x66BE #CJK UNIFIED IDEOGRAPH +0xD4C7 0x6C8C #CJK UNIFIED IDEOGRAPH +0xD4C8 0x711E #CJK UNIFIED IDEOGRAPH +0xD4C9 0x71C9 #CJK UNIFIED IDEOGRAPH +0xD4CA 0x8C5A #CJK UNIFIED IDEOGRAPH +0xD4CB 0x9813 #CJK UNIFIED IDEOGRAPH +0xD4CC 0x4E6D #CJK UNIFIED IDEOGRAPH +0xD4CD 0x7A81 #CJK UNIFIED IDEOGRAPH +0xD4CE 0x4EDD #CJK UNIFIED IDEOGRAPH +0xD4CF 0x51AC #CJK UNIFIED IDEOGRAPH +0xD4D0 0x51CD #CJK UNIFIED IDEOGRAPH +0xD4D1 0x52D5 #CJK UNIFIED IDEOGRAPH +0xD4D2 0x540C #CJK UNIFIED IDEOGRAPH +0xD4D3 0x61A7 #CJK UNIFIED IDEOGRAPH +0xD4D4 0x6771 #CJK UNIFIED IDEOGRAPH +0xD4D5 0x6850 #CJK UNIFIED IDEOGRAPH +0xD4D6 0x68DF #CJK UNIFIED IDEOGRAPH +0xD4D7 0x6D1E #CJK UNIFIED IDEOGRAPH +0xD4D8 0x6F7C #CJK UNIFIED IDEOGRAPH +0xD4D9 0x75BC #CJK UNIFIED IDEOGRAPH +0xD4DA 0x77B3 #CJK UNIFIED IDEOGRAPH +0xD4DB 0x7AE5 #CJK UNIFIED IDEOGRAPH +0xD4DC 0x80F4 #CJK UNIFIED IDEOGRAPH +0xD4DD 0x8463 #CJK UNIFIED IDEOGRAPH +0xD4DE 0x9285 #CJK UNIFIED IDEOGRAPH +0xD4DF 0x515C #CJK UNIFIED IDEOGRAPH +0xD4E0 0x6597 #CJK UNIFIED IDEOGRAPH +0xD4E1 0x675C #CJK UNIFIED IDEOGRAPH +0xD4E2 0x6793 #CJK UNIFIED IDEOGRAPH +0xD4E3 0x75D8 #CJK UNIFIED IDEOGRAPH +0xD4E4 0x7AC7 #CJK UNIFIED IDEOGRAPH +0xD4E5 0x8373 #CJK UNIFIED IDEOGRAPH +0xD4E6 0xF95A #CJK COMPATIBILITY IDEOGRAPH +0xD4E7 0x8C46 #CJK UNIFIED IDEOGRAPH +0xD4E8 0x9017 #CJK UNIFIED IDEOGRAPH +0xD4E9 0x982D #CJK UNIFIED IDEOGRAPH +0xD4EA 0x5C6F #CJK UNIFIED IDEOGRAPH +0xD4EB 0x81C0 #CJK UNIFIED IDEOGRAPH +0xD4EC 0x829A #CJK UNIFIED IDEOGRAPH +0xD4ED 0x9041 #CJK UNIFIED IDEOGRAPH +0xD4EE 0x906F #CJK UNIFIED IDEOGRAPH +0xD4EF 0x920D #CJK UNIFIED IDEOGRAPH +0xD4F0 0x5F97 #CJK UNIFIED IDEOGRAPH +0xD4F1 0x5D9D #CJK UNIFIED IDEOGRAPH +0xD4F2 0x6A59 #CJK UNIFIED IDEOGRAPH +0xD4F3 0x71C8 #CJK UNIFIED IDEOGRAPH +0xD4F4 0x767B #CJK UNIFIED IDEOGRAPH +0xD4F5 0x7B49 #CJK UNIFIED IDEOGRAPH +0xD4F6 0x85E4 #CJK UNIFIED IDEOGRAPH +0xD4F7 0x8B04 #CJK UNIFIED IDEOGRAPH +0xD4F8 0x9127 #CJK UNIFIED IDEOGRAPH +0xD4F9 0x9A30 #CJK UNIFIED IDEOGRAPH +0xD4FA 0x5587 #CJK UNIFIED IDEOGRAPH +0xD4FB 0x61F6 #CJK UNIFIED IDEOGRAPH +0xD4FC 0xF95B #CJK COMPATIBILITY IDEOGRAPH +0xD4FD 0x7669 #CJK UNIFIED IDEOGRAPH +0xD4FE 0x7F85 #CJK UNIFIED IDEOGRAPH +0xD5A1 0x863F #CJK UNIFIED IDEOGRAPH +0xD5A2 0x87BA #CJK UNIFIED IDEOGRAPH +0xD5A3 0x88F8 #CJK UNIFIED IDEOGRAPH +0xD5A4 0x908F #CJK UNIFIED IDEOGRAPH +0xD5A5 0xF95C #CJK COMPATIBILITY IDEOGRAPH +0xD5A6 0x6D1B #CJK UNIFIED IDEOGRAPH +0xD5A7 0x70D9 #CJK UNIFIED IDEOGRAPH +0xD5A8 0x73DE #CJK UNIFIED IDEOGRAPH +0xD5A9 0x7D61 #CJK UNIFIED IDEOGRAPH +0xD5AA 0x843D #CJK UNIFIED IDEOGRAPH +0xD5AB 0xF95D #CJK COMPATIBILITY IDEOGRAPH +0xD5AC 0x916A #CJK UNIFIED IDEOGRAPH +0xD5AD 0x99F1 #CJK UNIFIED IDEOGRAPH +0xD5AE 0xF95E #CJK COMPATIBILITY IDEOGRAPH +0xD5AF 0x4E82 #CJK UNIFIED IDEOGRAPH +0xD5B0 0x5375 #CJK UNIFIED IDEOGRAPH +0xD5B1 0x6B04 #CJK UNIFIED IDEOGRAPH +0xD5B2 0x6B12 #CJK UNIFIED IDEOGRAPH +0xD5B3 0x703E #CJK UNIFIED IDEOGRAPH +0xD5B4 0x721B #CJK UNIFIED IDEOGRAPH +0xD5B5 0x862D #CJK UNIFIED IDEOGRAPH +0xD5B6 0x9E1E #CJK UNIFIED IDEOGRAPH +0xD5B7 0x524C #CJK UNIFIED IDEOGRAPH +0xD5B8 0x8FA3 #CJK UNIFIED IDEOGRAPH +0xD5B9 0x5D50 #CJK UNIFIED IDEOGRAPH +0xD5BA 0x64E5 #CJK UNIFIED IDEOGRAPH +0xD5BB 0x652C #CJK UNIFIED IDEOGRAPH +0xD5BC 0x6B16 #CJK UNIFIED IDEOGRAPH +0xD5BD 0x6FEB #CJK UNIFIED IDEOGRAPH +0xD5BE 0x7C43 #CJK UNIFIED IDEOGRAPH +0xD5BF 0x7E9C #CJK UNIFIED IDEOGRAPH +0xD5C0 0x85CD #CJK UNIFIED IDEOGRAPH +0xD5C1 0x8964 #CJK UNIFIED IDEOGRAPH +0xD5C2 0x89BD #CJK UNIFIED IDEOGRAPH +0xD5C3 0x62C9 #CJK UNIFIED IDEOGRAPH +0xD5C4 0x81D8 #CJK UNIFIED IDEOGRAPH +0xD5C5 0x881F #CJK UNIFIED IDEOGRAPH +0xD5C6 0x5ECA #CJK UNIFIED IDEOGRAPH +0xD5C7 0x6717 #CJK UNIFIED IDEOGRAPH +0xD5C8 0x6D6A #CJK UNIFIED IDEOGRAPH +0xD5C9 0x72FC #CJK UNIFIED IDEOGRAPH +0xD5CA 0x7405 #CJK UNIFIED IDEOGRAPH +0xD5CB 0x746F #CJK UNIFIED IDEOGRAPH +0xD5CC 0x8782 #CJK UNIFIED IDEOGRAPH +0xD5CD 0x90DE #CJK UNIFIED IDEOGRAPH +0xD5CE 0x4F86 #CJK UNIFIED IDEOGRAPH +0xD5CF 0x5D0D #CJK UNIFIED IDEOGRAPH +0xD5D0 0x5FA0 #CJK UNIFIED IDEOGRAPH +0xD5D1 0x840A #CJK UNIFIED IDEOGRAPH +0xD5D2 0x51B7 #CJK UNIFIED IDEOGRAPH +0xD5D3 0x63A0 #CJK UNIFIED IDEOGRAPH +0xD5D4 0x7565 #CJK UNIFIED IDEOGRAPH +0xD5D5 0x4EAE #CJK UNIFIED IDEOGRAPH +0xD5D6 0x5006 #CJK UNIFIED IDEOGRAPH +0xD5D7 0x5169 #CJK UNIFIED IDEOGRAPH +0xD5D8 0x51C9 #CJK UNIFIED IDEOGRAPH +0xD5D9 0x6881 #CJK UNIFIED IDEOGRAPH +0xD5DA 0x6A11 #CJK UNIFIED IDEOGRAPH +0xD5DB 0x7CAE #CJK UNIFIED IDEOGRAPH +0xD5DC 0x7CB1 #CJK UNIFIED IDEOGRAPH +0xD5DD 0x7CE7 #CJK UNIFIED IDEOGRAPH +0xD5DE 0x826F #CJK UNIFIED IDEOGRAPH +0xD5DF 0x8AD2 #CJK UNIFIED IDEOGRAPH +0xD5E0 0x8F1B #CJK UNIFIED IDEOGRAPH +0xD5E1 0x91CF #CJK UNIFIED IDEOGRAPH +0xD5E2 0x4FB6 #CJK UNIFIED IDEOGRAPH +0xD5E3 0x5137 #CJK UNIFIED IDEOGRAPH +0xD5E4 0x52F5 #CJK UNIFIED IDEOGRAPH +0xD5E5 0x5442 #CJK UNIFIED IDEOGRAPH +0xD5E6 0x5EEC #CJK UNIFIED IDEOGRAPH +0xD5E7 0x616E #CJK UNIFIED IDEOGRAPH +0xD5E8 0x623E #CJK UNIFIED IDEOGRAPH +0xD5E9 0x65C5 #CJK UNIFIED IDEOGRAPH +0xD5EA 0x6ADA #CJK UNIFIED IDEOGRAPH +0xD5EB 0x6FFE #CJK UNIFIED IDEOGRAPH +0xD5EC 0x792A #CJK UNIFIED IDEOGRAPH +0xD5ED 0x85DC #CJK UNIFIED IDEOGRAPH +0xD5EE 0x8823 #CJK UNIFIED IDEOGRAPH +0xD5EF 0x95AD #CJK UNIFIED IDEOGRAPH +0xD5F0 0x9A62 #CJK UNIFIED IDEOGRAPH +0xD5F1 0x9A6A #CJK UNIFIED IDEOGRAPH +0xD5F2 0x9E97 #CJK UNIFIED IDEOGRAPH +0xD5F3 0x9ECE #CJK UNIFIED IDEOGRAPH +0xD5F4 0x529B #CJK UNIFIED IDEOGRAPH +0xD5F5 0x66C6 #CJK UNIFIED IDEOGRAPH +0xD5F6 0x6B77 #CJK UNIFIED IDEOGRAPH +0xD5F7 0x701D #CJK UNIFIED IDEOGRAPH +0xD5F8 0x792B #CJK UNIFIED IDEOGRAPH +0xD5F9 0x8F62 #CJK UNIFIED IDEOGRAPH +0xD5FA 0x9742 #CJK UNIFIED IDEOGRAPH +0xD5FB 0x6190 #CJK UNIFIED IDEOGRAPH +0xD5FC 0x6200 #CJK UNIFIED IDEOGRAPH +0xD5FD 0x6523 #CJK UNIFIED IDEOGRAPH +0xD5FE 0x6F23 #CJK UNIFIED IDEOGRAPH +0xD6A1 0x7149 #CJK UNIFIED IDEOGRAPH +0xD6A2 0x7489 #CJK UNIFIED IDEOGRAPH +0xD6A3 0x7DF4 #CJK UNIFIED IDEOGRAPH +0xD6A4 0x806F #CJK UNIFIED IDEOGRAPH +0xD6A5 0x84EE #CJK UNIFIED IDEOGRAPH +0xD6A6 0x8F26 #CJK UNIFIED IDEOGRAPH +0xD6A7 0x9023 #CJK UNIFIED IDEOGRAPH +0xD6A8 0x934A #CJK UNIFIED IDEOGRAPH +0xD6A9 0x51BD #CJK UNIFIED IDEOGRAPH +0xD6AA 0x5217 #CJK UNIFIED IDEOGRAPH +0xD6AB 0x52A3 #CJK UNIFIED IDEOGRAPH +0xD6AC 0x6D0C #CJK UNIFIED IDEOGRAPH +0xD6AD 0x70C8 #CJK UNIFIED IDEOGRAPH +0xD6AE 0x88C2 #CJK UNIFIED IDEOGRAPH +0xD6AF 0x5EC9 #CJK UNIFIED IDEOGRAPH +0xD6B0 0x6582 #CJK UNIFIED IDEOGRAPH +0xD6B1 0x6BAE #CJK UNIFIED IDEOGRAPH +0xD6B2 0x6FC2 #CJK UNIFIED IDEOGRAPH +0xD6B3 0x7C3E #CJK UNIFIED IDEOGRAPH +0xD6B4 0x7375 #CJK UNIFIED IDEOGRAPH +0xD6B5 0x4EE4 #CJK UNIFIED IDEOGRAPH +0xD6B6 0x4F36 #CJK UNIFIED IDEOGRAPH +0xD6B7 0x56F9 #CJK UNIFIED IDEOGRAPH +0xD6B8 0xF95F #CJK COMPATIBILITY IDEOGRAPH +0xD6B9 0x5CBA #CJK UNIFIED IDEOGRAPH +0xD6BA 0x5DBA #CJK UNIFIED IDEOGRAPH +0xD6BB 0x601C #CJK UNIFIED IDEOGRAPH +0xD6BC 0x73B2 #CJK UNIFIED IDEOGRAPH +0xD6BD 0x7B2D #CJK UNIFIED IDEOGRAPH +0xD6BE 0x7F9A #CJK UNIFIED IDEOGRAPH +0xD6BF 0x7FCE #CJK UNIFIED IDEOGRAPH +0xD6C0 0x8046 #CJK UNIFIED IDEOGRAPH +0xD6C1 0x901E #CJK UNIFIED IDEOGRAPH +0xD6C2 0x9234 #CJK UNIFIED IDEOGRAPH +0xD6C3 0x96F6 #CJK UNIFIED IDEOGRAPH +0xD6C4 0x9748 #CJK UNIFIED IDEOGRAPH +0xD6C5 0x9818 #CJK UNIFIED IDEOGRAPH +0xD6C6 0x9F61 #CJK UNIFIED IDEOGRAPH +0xD6C7 0x4F8B #CJK UNIFIED IDEOGRAPH +0xD6C8 0x6FA7 #CJK UNIFIED IDEOGRAPH +0xD6C9 0x79AE #CJK UNIFIED IDEOGRAPH +0xD6CA 0x91B4 #CJK UNIFIED IDEOGRAPH +0xD6CB 0x96B7 #CJK UNIFIED IDEOGRAPH +0xD6CC 0x52DE #CJK UNIFIED IDEOGRAPH +0xD6CD 0xF960 #CJK COMPATIBILITY IDEOGRAPH +0xD6CE 0x6488 #CJK UNIFIED IDEOGRAPH +0xD6CF 0x64C4 #CJK UNIFIED IDEOGRAPH +0xD6D0 0x6AD3 #CJK UNIFIED IDEOGRAPH +0xD6D1 0x6F5E #CJK UNIFIED IDEOGRAPH +0xD6D2 0x7018 #CJK UNIFIED IDEOGRAPH +0xD6D3 0x7210 #CJK UNIFIED IDEOGRAPH +0xD6D4 0x76E7 #CJK UNIFIED IDEOGRAPH +0xD6D5 0x8001 #CJK UNIFIED IDEOGRAPH +0xD6D6 0x8606 #CJK UNIFIED IDEOGRAPH +0xD6D7 0x865C #CJK UNIFIED IDEOGRAPH +0xD6D8 0x8DEF #CJK UNIFIED IDEOGRAPH +0xD6D9 0x8F05 #CJK UNIFIED IDEOGRAPH +0xD6DA 0x9732 #CJK UNIFIED IDEOGRAPH +0xD6DB 0x9B6F #CJK UNIFIED IDEOGRAPH +0xD6DC 0x9DFA #CJK UNIFIED IDEOGRAPH +0xD6DD 0x9E75 #CJK UNIFIED IDEOGRAPH +0xD6DE 0x788C #CJK UNIFIED IDEOGRAPH +0xD6DF 0x797F #CJK UNIFIED IDEOGRAPH +0xD6E0 0x7DA0 #CJK UNIFIED IDEOGRAPH +0xD6E1 0x83C9 #CJK UNIFIED IDEOGRAPH +0xD6E2 0x9304 #CJK UNIFIED IDEOGRAPH +0xD6E3 0x9E7F #CJK UNIFIED IDEOGRAPH +0xD6E4 0x9E93 #CJK UNIFIED IDEOGRAPH +0xD6E5 0x8AD6 #CJK UNIFIED IDEOGRAPH +0xD6E6 0x58DF #CJK UNIFIED IDEOGRAPH +0xD6E7 0x5F04 #CJK UNIFIED IDEOGRAPH +0xD6E8 0x6727 #CJK UNIFIED IDEOGRAPH +0xD6E9 0x7027 #CJK UNIFIED IDEOGRAPH +0xD6EA 0x74CF #CJK UNIFIED IDEOGRAPH +0xD6EB 0x7C60 #CJK UNIFIED IDEOGRAPH +0xD6EC 0x807E #CJK UNIFIED IDEOGRAPH +0xD6ED 0x5121 #CJK UNIFIED IDEOGRAPH +0xD6EE 0x7028 #CJK UNIFIED IDEOGRAPH +0xD6EF 0x7262 #CJK UNIFIED IDEOGRAPH +0xD6F0 0x78CA #CJK UNIFIED IDEOGRAPH +0xD6F1 0x8CC2 #CJK UNIFIED IDEOGRAPH +0xD6F2 0x8CDA #CJK UNIFIED IDEOGRAPH +0xD6F3 0x8CF4 #CJK UNIFIED IDEOGRAPH +0xD6F4 0x96F7 #CJK UNIFIED IDEOGRAPH +0xD6F5 0x4E86 #CJK UNIFIED IDEOGRAPH +0xD6F6 0x50DA #CJK UNIFIED IDEOGRAPH +0xD6F7 0x5BEE #CJK UNIFIED IDEOGRAPH +0xD6F8 0x5ED6 #CJK UNIFIED IDEOGRAPH +0xD6F9 0x6599 #CJK UNIFIED IDEOGRAPH +0xD6FA 0x71CE #CJK UNIFIED IDEOGRAPH +0xD6FB 0x7642 #CJK UNIFIED IDEOGRAPH +0xD6FC 0x77AD #CJK UNIFIED IDEOGRAPH +0xD6FD 0x804A #CJK UNIFIED IDEOGRAPH +0xD6FE 0x84FC #CJK UNIFIED IDEOGRAPH +0xD7A1 0x907C #CJK UNIFIED IDEOGRAPH +0xD7A2 0x9B27 #CJK UNIFIED IDEOGRAPH +0xD7A3 0x9F8D #CJK UNIFIED IDEOGRAPH +0xD7A4 0x58D8 #CJK UNIFIED IDEOGRAPH +0xD7A5 0x5A41 #CJK UNIFIED IDEOGRAPH +0xD7A6 0x5C62 #CJK UNIFIED IDEOGRAPH +0xD7A7 0x6A13 #CJK UNIFIED IDEOGRAPH +0xD7A8 0x6DDA #CJK UNIFIED IDEOGRAPH +0xD7A9 0x6F0F #CJK UNIFIED IDEOGRAPH +0xD7AA 0x763B #CJK UNIFIED IDEOGRAPH +0xD7AB 0x7D2F #CJK UNIFIED IDEOGRAPH +0xD7AC 0x7E37 #CJK UNIFIED IDEOGRAPH +0xD7AD 0x851E #CJK UNIFIED IDEOGRAPH +0xD7AE 0x8938 #CJK UNIFIED IDEOGRAPH +0xD7AF 0x93E4 #CJK UNIFIED IDEOGRAPH +0xD7B0 0x964B #CJK UNIFIED IDEOGRAPH +0xD7B1 0x5289 #CJK UNIFIED IDEOGRAPH +0xD7B2 0x65D2 #CJK UNIFIED IDEOGRAPH +0xD7B3 0x67F3 #CJK UNIFIED IDEOGRAPH +0xD7B4 0x69B4 #CJK UNIFIED IDEOGRAPH +0xD7B5 0x6D41 #CJK UNIFIED IDEOGRAPH +0xD7B6 0x6E9C #CJK UNIFIED IDEOGRAPH +0xD7B7 0x700F #CJK UNIFIED IDEOGRAPH +0xD7B8 0x7409 #CJK UNIFIED IDEOGRAPH +0xD7B9 0x7460 #CJK UNIFIED IDEOGRAPH +0xD7BA 0x7559 #CJK UNIFIED IDEOGRAPH +0xD7BB 0x7624 #CJK UNIFIED IDEOGRAPH +0xD7BC 0x786B #CJK UNIFIED IDEOGRAPH +0xD7BD 0x8B2C #CJK UNIFIED IDEOGRAPH +0xD7BE 0x985E #CJK UNIFIED IDEOGRAPH +0xD7BF 0x516D #CJK UNIFIED IDEOGRAPH +0xD7C0 0x622E #CJK UNIFIED IDEOGRAPH +0xD7C1 0x9678 #CJK UNIFIED IDEOGRAPH +0xD7C2 0x4F96 #CJK UNIFIED IDEOGRAPH +0xD7C3 0x502B #CJK UNIFIED IDEOGRAPH +0xD7C4 0x5D19 #CJK UNIFIED IDEOGRAPH +0xD7C5 0x6DEA #CJK UNIFIED IDEOGRAPH +0xD7C6 0x7DB8 #CJK UNIFIED IDEOGRAPH +0xD7C7 0x8F2A #CJK UNIFIED IDEOGRAPH +0xD7C8 0x5F8B #CJK UNIFIED IDEOGRAPH +0xD7C9 0x6144 #CJK UNIFIED IDEOGRAPH +0xD7CA 0x6817 #CJK UNIFIED IDEOGRAPH +0xD7CB 0xF961 #CJK COMPATIBILITY IDEOGRAPH +0xD7CC 0x9686 #CJK UNIFIED IDEOGRAPH +0xD7CD 0x52D2 #CJK UNIFIED IDEOGRAPH +0xD7CE 0x808B #CJK UNIFIED IDEOGRAPH +0xD7CF 0x51DC #CJK UNIFIED IDEOGRAPH +0xD7D0 0x51CC #CJK UNIFIED IDEOGRAPH +0xD7D1 0x695E #CJK UNIFIED IDEOGRAPH +0xD7D2 0x7A1C #CJK UNIFIED IDEOGRAPH +0xD7D3 0x7DBE #CJK UNIFIED IDEOGRAPH +0xD7D4 0x83F1 #CJK UNIFIED IDEOGRAPH +0xD7D5 0x9675 #CJK UNIFIED IDEOGRAPH +0xD7D6 0x4FDA #CJK UNIFIED IDEOGRAPH +0xD7D7 0x5229 #CJK UNIFIED IDEOGRAPH +0xD7D8 0x5398 #CJK UNIFIED IDEOGRAPH +0xD7D9 0x540F #CJK UNIFIED IDEOGRAPH +0xD7DA 0x550E #CJK UNIFIED IDEOGRAPH +0xD7DB 0x5C65 #CJK UNIFIED IDEOGRAPH +0xD7DC 0x60A7 #CJK UNIFIED IDEOGRAPH +0xD7DD 0x674E #CJK UNIFIED IDEOGRAPH +0xD7DE 0x68A8 #CJK UNIFIED IDEOGRAPH +0xD7DF 0x6D6C #CJK UNIFIED IDEOGRAPH +0xD7E0 0x7281 #CJK UNIFIED IDEOGRAPH +0xD7E1 0x72F8 #CJK UNIFIED IDEOGRAPH +0xD7E2 0x7406 #CJK UNIFIED IDEOGRAPH +0xD7E3 0x7483 #CJK UNIFIED IDEOGRAPH +0xD7E4 0xF962 #CJK COMPATIBILITY IDEOGRAPH +0xD7E5 0x75E2 #CJK UNIFIED IDEOGRAPH +0xD7E6 0x7C6C #CJK UNIFIED IDEOGRAPH +0xD7E7 0x7F79 #CJK UNIFIED IDEOGRAPH +0xD7E8 0x7FB8 #CJK UNIFIED IDEOGRAPH +0xD7E9 0x8389 #CJK UNIFIED IDEOGRAPH +0xD7EA 0x88CF #CJK UNIFIED IDEOGRAPH +0xD7EB 0x88E1 #CJK UNIFIED IDEOGRAPH +0xD7EC 0x91CC #CJK UNIFIED IDEOGRAPH +0xD7ED 0x91D0 #CJK UNIFIED IDEOGRAPH +0xD7EE 0x96E2 #CJK UNIFIED IDEOGRAPH +0xD7EF 0x9BC9 #CJK UNIFIED IDEOGRAPH +0xD7F0 0x541D #CJK UNIFIED IDEOGRAPH +0xD7F1 0x6F7E #CJK UNIFIED IDEOGRAPH +0xD7F2 0x71D0 #CJK UNIFIED IDEOGRAPH +0xD7F3 0x7498 #CJK UNIFIED IDEOGRAPH +0xD7F4 0x85FA #CJK UNIFIED IDEOGRAPH +0xD7F5 0x8EAA #CJK UNIFIED IDEOGRAPH +0xD7F6 0x96A3 #CJK UNIFIED IDEOGRAPH +0xD7F7 0x9C57 #CJK UNIFIED IDEOGRAPH +0xD7F8 0x9E9F #CJK UNIFIED IDEOGRAPH +0xD7F9 0x6797 #CJK UNIFIED IDEOGRAPH +0xD7FA 0x6DCB #CJK UNIFIED IDEOGRAPH +0xD7FB 0x7433 #CJK UNIFIED IDEOGRAPH +0xD7FC 0x81E8 #CJK UNIFIED IDEOGRAPH +0xD7FD 0x9716 #CJK UNIFIED IDEOGRAPH +0xD7FE 0x782C #CJK UNIFIED IDEOGRAPH +0xD8A1 0x7ACB #CJK UNIFIED IDEOGRAPH +0xD8A2 0x7B20 #CJK UNIFIED IDEOGRAPH +0xD8A3 0x7C92 #CJK UNIFIED IDEOGRAPH +0xD8A4 0x6469 #CJK UNIFIED IDEOGRAPH +0xD8A5 0x746A #CJK UNIFIED IDEOGRAPH +0xD8A6 0x75F2 #CJK UNIFIED IDEOGRAPH +0xD8A7 0x78BC #CJK UNIFIED IDEOGRAPH +0xD8A8 0x78E8 #CJK UNIFIED IDEOGRAPH +0xD8A9 0x99AC #CJK UNIFIED IDEOGRAPH +0xD8AA 0x9B54 #CJK UNIFIED IDEOGRAPH +0xD8AB 0x9EBB #CJK UNIFIED IDEOGRAPH +0xD8AC 0x5BDE #CJK UNIFIED IDEOGRAPH +0xD8AD 0x5E55 #CJK UNIFIED IDEOGRAPH +0xD8AE 0x6F20 #CJK UNIFIED IDEOGRAPH +0xD8AF 0x819C #CJK UNIFIED IDEOGRAPH +0xD8B0 0x83AB #CJK UNIFIED IDEOGRAPH +0xD8B1 0x9088 #CJK UNIFIED IDEOGRAPH +0xD8B2 0x4E07 #CJK UNIFIED IDEOGRAPH +0xD8B3 0x534D #CJK UNIFIED IDEOGRAPH +0xD8B4 0x5A29 #CJK UNIFIED IDEOGRAPH +0xD8B5 0x5DD2 #CJK UNIFIED IDEOGRAPH +0xD8B6 0x5F4E #CJK UNIFIED IDEOGRAPH +0xD8B7 0x6162 #CJK UNIFIED IDEOGRAPH +0xD8B8 0x633D #CJK UNIFIED IDEOGRAPH +0xD8B9 0x6669 #CJK UNIFIED IDEOGRAPH +0xD8BA 0x66FC #CJK UNIFIED IDEOGRAPH +0xD8BB 0x6EFF #CJK UNIFIED IDEOGRAPH +0xD8BC 0x6F2B #CJK UNIFIED IDEOGRAPH +0xD8BD 0x7063 #CJK UNIFIED IDEOGRAPH +0xD8BE 0x779E #CJK UNIFIED IDEOGRAPH +0xD8BF 0x842C #CJK UNIFIED IDEOGRAPH +0xD8C0 0x8513 #CJK UNIFIED IDEOGRAPH +0xD8C1 0x883B #CJK UNIFIED IDEOGRAPH +0xD8C2 0x8F13 #CJK UNIFIED IDEOGRAPH +0xD8C3 0x9945 #CJK UNIFIED IDEOGRAPH +0xD8C4 0x9C3B #CJK UNIFIED IDEOGRAPH +0xD8C5 0x551C #CJK UNIFIED IDEOGRAPH +0xD8C6 0x62B9 #CJK UNIFIED IDEOGRAPH +0xD8C7 0x672B #CJK UNIFIED IDEOGRAPH +0xD8C8 0x6CAB #CJK UNIFIED IDEOGRAPH +0xD8C9 0x8309 #CJK UNIFIED IDEOGRAPH +0xD8CA 0x896A #CJK UNIFIED IDEOGRAPH +0xD8CB 0x977A #CJK UNIFIED IDEOGRAPH +0xD8CC 0x4EA1 #CJK UNIFIED IDEOGRAPH +0xD8CD 0x5984 #CJK UNIFIED IDEOGRAPH +0xD8CE 0x5FD8 #CJK UNIFIED IDEOGRAPH +0xD8CF 0x5FD9 #CJK UNIFIED IDEOGRAPH +0xD8D0 0x671B #CJK UNIFIED IDEOGRAPH +0xD8D1 0x7DB2 #CJK UNIFIED IDEOGRAPH +0xD8D2 0x7F54 #CJK UNIFIED IDEOGRAPH +0xD8D3 0x8292 #CJK UNIFIED IDEOGRAPH +0xD8D4 0x832B #CJK UNIFIED IDEOGRAPH +0xD8D5 0x83BD #CJK UNIFIED IDEOGRAPH +0xD8D6 0x8F1E #CJK UNIFIED IDEOGRAPH +0xD8D7 0x9099 #CJK UNIFIED IDEOGRAPH +0xD8D8 0x57CB #CJK UNIFIED IDEOGRAPH +0xD8D9 0x59B9 #CJK UNIFIED IDEOGRAPH +0xD8DA 0x5A92 #CJK UNIFIED IDEOGRAPH +0xD8DB 0x5BD0 #CJK UNIFIED IDEOGRAPH +0xD8DC 0x6627 #CJK UNIFIED IDEOGRAPH +0xD8DD 0x679A #CJK UNIFIED IDEOGRAPH +0xD8DE 0x6885 #CJK UNIFIED IDEOGRAPH +0xD8DF 0x6BCF #CJK UNIFIED IDEOGRAPH +0xD8E0 0x7164 #CJK UNIFIED IDEOGRAPH +0xD8E1 0x7F75 #CJK UNIFIED IDEOGRAPH +0xD8E2 0x8CB7 #CJK UNIFIED IDEOGRAPH +0xD8E3 0x8CE3 #CJK UNIFIED IDEOGRAPH +0xD8E4 0x9081 #CJK UNIFIED IDEOGRAPH +0xD8E5 0x9B45 #CJK UNIFIED IDEOGRAPH +0xD8E6 0x8108 #CJK UNIFIED IDEOGRAPH +0xD8E7 0x8C8A #CJK UNIFIED IDEOGRAPH +0xD8E8 0x964C #CJK UNIFIED IDEOGRAPH +0xD8E9 0x9A40 #CJK UNIFIED IDEOGRAPH +0xD8EA 0x9EA5 #CJK UNIFIED IDEOGRAPH +0xD8EB 0x5B5F #CJK UNIFIED IDEOGRAPH +0xD8EC 0x6C13 #CJK UNIFIED IDEOGRAPH +0xD8ED 0x731B #CJK UNIFIED IDEOGRAPH +0xD8EE 0x76F2 #CJK UNIFIED IDEOGRAPH +0xD8EF 0x76DF #CJK UNIFIED IDEOGRAPH +0xD8F0 0x840C #CJK UNIFIED IDEOGRAPH +0xD8F1 0x51AA #CJK UNIFIED IDEOGRAPH +0xD8F2 0x8993 #CJK UNIFIED IDEOGRAPH +0xD8F3 0x514D #CJK UNIFIED IDEOGRAPH +0xD8F4 0x5195 #CJK UNIFIED IDEOGRAPH +0xD8F5 0x52C9 #CJK UNIFIED IDEOGRAPH +0xD8F6 0x68C9 #CJK UNIFIED IDEOGRAPH +0xD8F7 0x6C94 #CJK UNIFIED IDEOGRAPH +0xD8F8 0x7704 #CJK UNIFIED IDEOGRAPH +0xD8F9 0x7720 #CJK UNIFIED IDEOGRAPH +0xD8FA 0x7DBF #CJK UNIFIED IDEOGRAPH +0xD8FB 0x7DEC #CJK UNIFIED IDEOGRAPH +0xD8FC 0x9762 #CJK UNIFIED IDEOGRAPH +0xD8FD 0x9EB5 #CJK UNIFIED IDEOGRAPH +0xD8FE 0x6EC5 #CJK UNIFIED IDEOGRAPH +0xD9A1 0x8511 #CJK UNIFIED IDEOGRAPH +0xD9A2 0x51A5 #CJK UNIFIED IDEOGRAPH +0xD9A3 0x540D #CJK UNIFIED IDEOGRAPH +0xD9A4 0x547D #CJK UNIFIED IDEOGRAPH +0xD9A5 0x660E #CJK UNIFIED IDEOGRAPH +0xD9A6 0x669D #CJK UNIFIED IDEOGRAPH +0xD9A7 0x6927 #CJK UNIFIED IDEOGRAPH +0xD9A8 0x6E9F #CJK UNIFIED IDEOGRAPH +0xD9A9 0x76BF #CJK UNIFIED IDEOGRAPH +0xD9AA 0x7791 #CJK UNIFIED IDEOGRAPH +0xD9AB 0x8317 #CJK UNIFIED IDEOGRAPH +0xD9AC 0x84C2 #CJK UNIFIED IDEOGRAPH +0xD9AD 0x879F #CJK UNIFIED IDEOGRAPH +0xD9AE 0x9169 #CJK UNIFIED IDEOGRAPH +0xD9AF 0x9298 #CJK UNIFIED IDEOGRAPH +0xD9B0 0x9CF4 #CJK UNIFIED IDEOGRAPH +0xD9B1 0x8882 #CJK UNIFIED IDEOGRAPH +0xD9B2 0x4FAE #CJK UNIFIED IDEOGRAPH +0xD9B3 0x5192 #CJK UNIFIED IDEOGRAPH +0xD9B4 0x52DF #CJK UNIFIED IDEOGRAPH +0xD9B5 0x59C6 #CJK UNIFIED IDEOGRAPH +0xD9B6 0x5E3D #CJK UNIFIED IDEOGRAPH +0xD9B7 0x6155 #CJK UNIFIED IDEOGRAPH +0xD9B8 0x6478 #CJK UNIFIED IDEOGRAPH +0xD9B9 0x6479 #CJK UNIFIED IDEOGRAPH +0xD9BA 0x66AE #CJK UNIFIED IDEOGRAPH +0xD9BB 0x67D0 #CJK UNIFIED IDEOGRAPH +0xD9BC 0x6A21 #CJK UNIFIED IDEOGRAPH +0xD9BD 0x6BCD #CJK UNIFIED IDEOGRAPH +0xD9BE 0x6BDB #CJK UNIFIED IDEOGRAPH +0xD9BF 0x725F #CJK UNIFIED IDEOGRAPH +0xD9C0 0x7261 #CJK UNIFIED IDEOGRAPH +0xD9C1 0x7441 #CJK UNIFIED IDEOGRAPH +0xD9C2 0x7738 #CJK UNIFIED IDEOGRAPH +0xD9C3 0x77DB #CJK UNIFIED IDEOGRAPH +0xD9C4 0x8017 #CJK UNIFIED IDEOGRAPH +0xD9C5 0x82BC #CJK UNIFIED IDEOGRAPH +0xD9C6 0x8305 #CJK UNIFIED IDEOGRAPH +0xD9C7 0x8B00 #CJK UNIFIED IDEOGRAPH +0xD9C8 0x8B28 #CJK UNIFIED IDEOGRAPH +0xD9C9 0x8C8C #CJK UNIFIED IDEOGRAPH +0xD9CA 0x6728 #CJK UNIFIED IDEOGRAPH +0xD9CB 0x6C90 #CJK UNIFIED IDEOGRAPH +0xD9CC 0x7267 #CJK UNIFIED IDEOGRAPH +0xD9CD 0x76EE #CJK UNIFIED IDEOGRAPH +0xD9CE 0x7766 #CJK UNIFIED IDEOGRAPH +0xD9CF 0x7A46 #CJK UNIFIED IDEOGRAPH +0xD9D0 0x9DA9 #CJK UNIFIED IDEOGRAPH +0xD9D1 0x6B7F #CJK UNIFIED IDEOGRAPH +0xD9D2 0x6C92 #CJK UNIFIED IDEOGRAPH +0xD9D3 0x5922 #CJK UNIFIED IDEOGRAPH +0xD9D4 0x6726 #CJK UNIFIED IDEOGRAPH +0xD9D5 0x8499 #CJK UNIFIED IDEOGRAPH +0xD9D6 0x536F #CJK UNIFIED IDEOGRAPH +0xD9D7 0x5893 #CJK UNIFIED IDEOGRAPH +0xD9D8 0x5999 #CJK UNIFIED IDEOGRAPH +0xD9D9 0x5EDF #CJK UNIFIED IDEOGRAPH +0xD9DA 0x63CF #CJK UNIFIED IDEOGRAPH +0xD9DB 0x6634 #CJK UNIFIED IDEOGRAPH +0xD9DC 0x6773 #CJK UNIFIED IDEOGRAPH +0xD9DD 0x6E3A #CJK UNIFIED IDEOGRAPH +0xD9DE 0x732B #CJK UNIFIED IDEOGRAPH +0xD9DF 0x7AD7 #CJK UNIFIED IDEOGRAPH +0xD9E0 0x82D7 #CJK UNIFIED IDEOGRAPH +0xD9E1 0x9328 #CJK UNIFIED IDEOGRAPH +0xD9E2 0x52D9 #CJK UNIFIED IDEOGRAPH +0xD9E3 0x5DEB #CJK UNIFIED IDEOGRAPH +0xD9E4 0x61AE #CJK UNIFIED IDEOGRAPH +0xD9E5 0x61CB #CJK UNIFIED IDEOGRAPH +0xD9E6 0x620A #CJK UNIFIED IDEOGRAPH +0xD9E7 0x62C7 #CJK UNIFIED IDEOGRAPH +0xD9E8 0x64AB #CJK UNIFIED IDEOGRAPH +0xD9E9 0x65E0 #CJK UNIFIED IDEOGRAPH +0xD9EA 0x6959 #CJK UNIFIED IDEOGRAPH +0xD9EB 0x6B66 #CJK UNIFIED IDEOGRAPH +0xD9EC 0x6BCB #CJK UNIFIED IDEOGRAPH +0xD9ED 0x7121 #CJK UNIFIED IDEOGRAPH +0xD9EE 0x73F7 #CJK UNIFIED IDEOGRAPH +0xD9EF 0x755D #CJK UNIFIED IDEOGRAPH +0xD9F0 0x7E46 #CJK UNIFIED IDEOGRAPH +0xD9F1 0x821E #CJK UNIFIED IDEOGRAPH +0xD9F2 0x8302 #CJK UNIFIED IDEOGRAPH +0xD9F3 0x856A #CJK UNIFIED IDEOGRAPH +0xD9F4 0x8AA3 #CJK UNIFIED IDEOGRAPH +0xD9F5 0x8CBF #CJK UNIFIED IDEOGRAPH +0xD9F6 0x9727 #CJK UNIFIED IDEOGRAPH +0xD9F7 0x9D61 #CJK UNIFIED IDEOGRAPH +0xD9F8 0x58A8 #CJK UNIFIED IDEOGRAPH +0xD9F9 0x9ED8 #CJK UNIFIED IDEOGRAPH +0xD9FA 0x5011 #CJK UNIFIED IDEOGRAPH +0xD9FB 0x520E #CJK UNIFIED IDEOGRAPH +0xD9FC 0x543B #CJK UNIFIED IDEOGRAPH +0xD9FD 0x554F #CJK UNIFIED IDEOGRAPH +0xD9FE 0x6587 #CJK UNIFIED IDEOGRAPH +0xDAA1 0x6C76 #CJK UNIFIED IDEOGRAPH +0xDAA2 0x7D0A #CJK UNIFIED IDEOGRAPH +0xDAA3 0x7D0B #CJK UNIFIED IDEOGRAPH +0xDAA4 0x805E #CJK UNIFIED IDEOGRAPH +0xDAA5 0x868A #CJK UNIFIED IDEOGRAPH +0xDAA6 0x9580 #CJK UNIFIED IDEOGRAPH +0xDAA7 0x96EF #CJK UNIFIED IDEOGRAPH +0xDAA8 0x52FF #CJK UNIFIED IDEOGRAPH +0xDAA9 0x6C95 #CJK UNIFIED IDEOGRAPH +0xDAAA 0x7269 #CJK UNIFIED IDEOGRAPH +0xDAAB 0x5473 #CJK UNIFIED IDEOGRAPH +0xDAAC 0x5A9A #CJK UNIFIED IDEOGRAPH +0xDAAD 0x5C3E #CJK UNIFIED IDEOGRAPH +0xDAAE 0x5D4B #CJK UNIFIED IDEOGRAPH +0xDAAF 0x5F4C #CJK UNIFIED IDEOGRAPH +0xDAB0 0x5FAE #CJK UNIFIED IDEOGRAPH +0xDAB1 0x672A #CJK UNIFIED IDEOGRAPH +0xDAB2 0x68B6 #CJK UNIFIED IDEOGRAPH +0xDAB3 0x6963 #CJK UNIFIED IDEOGRAPH +0xDAB4 0x6E3C #CJK UNIFIED IDEOGRAPH +0xDAB5 0x6E44 #CJK UNIFIED IDEOGRAPH +0xDAB6 0x7709 #CJK UNIFIED IDEOGRAPH +0xDAB7 0x7C73 #CJK UNIFIED IDEOGRAPH +0xDAB8 0x7F8E #CJK UNIFIED IDEOGRAPH +0xDAB9 0x8587 #CJK UNIFIED IDEOGRAPH +0xDABA 0x8B0E #CJK UNIFIED IDEOGRAPH +0xDABB 0x8FF7 #CJK UNIFIED IDEOGRAPH +0xDABC 0x9761 #CJK UNIFIED IDEOGRAPH +0xDABD 0x9EF4 #CJK UNIFIED IDEOGRAPH +0xDABE 0x5CB7 #CJK UNIFIED IDEOGRAPH +0xDABF 0x60B6 #CJK UNIFIED IDEOGRAPH +0xDAC0 0x610D #CJK UNIFIED IDEOGRAPH +0xDAC1 0x61AB #CJK UNIFIED IDEOGRAPH +0xDAC2 0x654F #CJK UNIFIED IDEOGRAPH +0xDAC3 0x65FB #CJK UNIFIED IDEOGRAPH +0xDAC4 0x65FC #CJK UNIFIED IDEOGRAPH +0xDAC5 0x6C11 #CJK UNIFIED IDEOGRAPH +0xDAC6 0x6CEF #CJK UNIFIED IDEOGRAPH +0xDAC7 0x739F #CJK UNIFIED IDEOGRAPH +0xDAC8 0x73C9 #CJK UNIFIED IDEOGRAPH +0xDAC9 0x7DE1 #CJK UNIFIED IDEOGRAPH +0xDACA 0x9594 #CJK UNIFIED IDEOGRAPH +0xDACB 0x5BC6 #CJK UNIFIED IDEOGRAPH +0xDACC 0x871C #CJK UNIFIED IDEOGRAPH +0xDACD 0x8B10 #CJK UNIFIED IDEOGRAPH +0xDACE 0x525D #CJK UNIFIED IDEOGRAPH +0xDACF 0x535A #CJK UNIFIED IDEOGRAPH +0xDAD0 0x62CD #CJK UNIFIED IDEOGRAPH +0xDAD1 0x640F #CJK UNIFIED IDEOGRAPH +0xDAD2 0x64B2 #CJK UNIFIED IDEOGRAPH +0xDAD3 0x6734 #CJK UNIFIED IDEOGRAPH +0xDAD4 0x6A38 #CJK UNIFIED IDEOGRAPH +0xDAD5 0x6CCA #CJK UNIFIED IDEOGRAPH +0xDAD6 0x73C0 #CJK UNIFIED IDEOGRAPH +0xDAD7 0x749E #CJK UNIFIED IDEOGRAPH +0xDAD8 0x7B94 #CJK UNIFIED IDEOGRAPH +0xDAD9 0x7C95 #CJK UNIFIED IDEOGRAPH +0xDADA 0x7E1B #CJK UNIFIED IDEOGRAPH +0xDADB 0x818A #CJK UNIFIED IDEOGRAPH +0xDADC 0x8236 #CJK UNIFIED IDEOGRAPH +0xDADD 0x8584 #CJK UNIFIED IDEOGRAPH +0xDADE 0x8FEB #CJK UNIFIED IDEOGRAPH +0xDADF 0x96F9 #CJK UNIFIED IDEOGRAPH +0xDAE0 0x99C1 #CJK UNIFIED IDEOGRAPH +0xDAE1 0x4F34 #CJK UNIFIED IDEOGRAPH +0xDAE2 0x534A #CJK UNIFIED IDEOGRAPH +0xDAE3 0x53CD #CJK UNIFIED IDEOGRAPH +0xDAE4 0x53DB #CJK UNIFIED IDEOGRAPH +0xDAE5 0x62CC #CJK UNIFIED IDEOGRAPH +0xDAE6 0x642C #CJK UNIFIED IDEOGRAPH +0xDAE7 0x6500 #CJK UNIFIED IDEOGRAPH +0xDAE8 0x6591 #CJK UNIFIED IDEOGRAPH +0xDAE9 0x69C3 #CJK UNIFIED IDEOGRAPH +0xDAEA 0x6CEE #CJK UNIFIED IDEOGRAPH +0xDAEB 0x6F58 #CJK UNIFIED IDEOGRAPH +0xDAEC 0x73ED #CJK UNIFIED IDEOGRAPH +0xDAED 0x7554 #CJK UNIFIED IDEOGRAPH +0xDAEE 0x7622 #CJK UNIFIED IDEOGRAPH +0xDAEF 0x76E4 #CJK UNIFIED IDEOGRAPH +0xDAF0 0x76FC #CJK UNIFIED IDEOGRAPH +0xDAF1 0x78D0 #CJK UNIFIED IDEOGRAPH +0xDAF2 0x78FB #CJK UNIFIED IDEOGRAPH +0xDAF3 0x792C #CJK UNIFIED IDEOGRAPH +0xDAF4 0x7D46 #CJK UNIFIED IDEOGRAPH +0xDAF5 0x822C #CJK UNIFIED IDEOGRAPH +0xDAF6 0x87E0 #CJK UNIFIED IDEOGRAPH +0xDAF7 0x8FD4 #CJK UNIFIED IDEOGRAPH +0xDAF8 0x9812 #CJK UNIFIED IDEOGRAPH +0xDAF9 0x98EF #CJK UNIFIED IDEOGRAPH +0xDAFA 0x52C3 #CJK UNIFIED IDEOGRAPH +0xDAFB 0x62D4 #CJK UNIFIED IDEOGRAPH +0xDAFC 0x64A5 #CJK UNIFIED IDEOGRAPH +0xDAFD 0x6E24 #CJK UNIFIED IDEOGRAPH +0xDAFE 0x6F51 #CJK UNIFIED IDEOGRAPH +0xDBA1 0x767C #CJK UNIFIED IDEOGRAPH +0xDBA2 0x8DCB #CJK UNIFIED IDEOGRAPH +0xDBA3 0x91B1 #CJK UNIFIED IDEOGRAPH +0xDBA4 0x9262 #CJK UNIFIED IDEOGRAPH +0xDBA5 0x9AEE #CJK UNIFIED IDEOGRAPH +0xDBA6 0x9B43 #CJK UNIFIED IDEOGRAPH +0xDBA7 0x5023 #CJK UNIFIED IDEOGRAPH +0xDBA8 0x508D #CJK UNIFIED IDEOGRAPH +0xDBA9 0x574A #CJK UNIFIED IDEOGRAPH +0xDBAA 0x59A8 #CJK UNIFIED IDEOGRAPH +0xDBAB 0x5C28 #CJK UNIFIED IDEOGRAPH +0xDBAC 0x5E47 #CJK UNIFIED IDEOGRAPH +0xDBAD 0x5F77 #CJK UNIFIED IDEOGRAPH +0xDBAE 0x623F #CJK UNIFIED IDEOGRAPH +0xDBAF 0x653E #CJK UNIFIED IDEOGRAPH +0xDBB0 0x65B9 #CJK UNIFIED IDEOGRAPH +0xDBB1 0x65C1 #CJK UNIFIED IDEOGRAPH +0xDBB2 0x6609 #CJK UNIFIED IDEOGRAPH +0xDBB3 0x678B #CJK UNIFIED IDEOGRAPH +0xDBB4 0x699C #CJK UNIFIED IDEOGRAPH +0xDBB5 0x6EC2 #CJK UNIFIED IDEOGRAPH +0xDBB6 0x78C5 #CJK UNIFIED IDEOGRAPH +0xDBB7 0x7D21 #CJK UNIFIED IDEOGRAPH +0xDBB8 0x80AA #CJK UNIFIED IDEOGRAPH +0xDBB9 0x8180 #CJK UNIFIED IDEOGRAPH +0xDBBA 0x822B #CJK UNIFIED IDEOGRAPH +0xDBBB 0x82B3 #CJK UNIFIED IDEOGRAPH +0xDBBC 0x84A1 #CJK UNIFIED IDEOGRAPH +0xDBBD 0x868C #CJK UNIFIED IDEOGRAPH +0xDBBE 0x8A2A #CJK UNIFIED IDEOGRAPH +0xDBBF 0x8B17 #CJK UNIFIED IDEOGRAPH +0xDBC0 0x90A6 #CJK UNIFIED IDEOGRAPH +0xDBC1 0x9632 #CJK UNIFIED IDEOGRAPH +0xDBC2 0x9F90 #CJK UNIFIED IDEOGRAPH +0xDBC3 0x500D #CJK UNIFIED IDEOGRAPH +0xDBC4 0x4FF3 #CJK UNIFIED IDEOGRAPH +0xDBC5 0xF963 #CJK COMPATIBILITY IDEOGRAPH +0xDBC6 0x57F9 #CJK UNIFIED IDEOGRAPH +0xDBC7 0x5F98 #CJK UNIFIED IDEOGRAPH +0xDBC8 0x62DC #CJK UNIFIED IDEOGRAPH +0xDBC9 0x6392 #CJK UNIFIED IDEOGRAPH +0xDBCA 0x676F #CJK UNIFIED IDEOGRAPH +0xDBCB 0x6E43 #CJK UNIFIED IDEOGRAPH +0xDBCC 0x7119 #CJK UNIFIED IDEOGRAPH +0xDBCD 0x76C3 #CJK UNIFIED IDEOGRAPH +0xDBCE 0x80CC #CJK UNIFIED IDEOGRAPH +0xDBCF 0x80DA #CJK UNIFIED IDEOGRAPH +0xDBD0 0x88F4 #CJK UNIFIED IDEOGRAPH +0xDBD1 0x88F5 #CJK UNIFIED IDEOGRAPH +0xDBD2 0x8919 #CJK UNIFIED IDEOGRAPH +0xDBD3 0x8CE0 #CJK UNIFIED IDEOGRAPH +0xDBD4 0x8F29 #CJK UNIFIED IDEOGRAPH +0xDBD5 0x914D #CJK UNIFIED IDEOGRAPH +0xDBD6 0x966A #CJK UNIFIED IDEOGRAPH +0xDBD7 0x4F2F #CJK UNIFIED IDEOGRAPH +0xDBD8 0x4F70 #CJK UNIFIED IDEOGRAPH +0xDBD9 0x5E1B #CJK UNIFIED IDEOGRAPH +0xDBDA 0x67CF #CJK UNIFIED IDEOGRAPH +0xDBDB 0x6822 #CJK UNIFIED IDEOGRAPH +0xDBDC 0x767D #CJK UNIFIED IDEOGRAPH +0xDBDD 0x767E #CJK UNIFIED IDEOGRAPH +0xDBDE 0x9B44 #CJK UNIFIED IDEOGRAPH +0xDBDF 0x5E61 #CJK UNIFIED IDEOGRAPH +0xDBE0 0x6A0A #CJK UNIFIED IDEOGRAPH +0xDBE1 0x7169 #CJK UNIFIED IDEOGRAPH +0xDBE2 0x71D4 #CJK UNIFIED IDEOGRAPH +0xDBE3 0x756A #CJK UNIFIED IDEOGRAPH +0xDBE4 0xF964 #CJK COMPATIBILITY IDEOGRAPH +0xDBE5 0x7E41 #CJK UNIFIED IDEOGRAPH +0xDBE6 0x8543 #CJK UNIFIED IDEOGRAPH +0xDBE7 0x85E9 #CJK UNIFIED IDEOGRAPH +0xDBE8 0x98DC #CJK UNIFIED IDEOGRAPH +0xDBE9 0x4F10 #CJK UNIFIED IDEOGRAPH +0xDBEA 0x7B4F #CJK UNIFIED IDEOGRAPH +0xDBEB 0x7F70 #CJK UNIFIED IDEOGRAPH +0xDBEC 0x95A5 #CJK UNIFIED IDEOGRAPH +0xDBED 0x51E1 #CJK UNIFIED IDEOGRAPH +0xDBEE 0x5E06 #CJK UNIFIED IDEOGRAPH +0xDBEF 0x68B5 #CJK UNIFIED IDEOGRAPH +0xDBF0 0x6C3E #CJK UNIFIED IDEOGRAPH +0xDBF1 0x6C4E #CJK UNIFIED IDEOGRAPH +0xDBF2 0x6CDB #CJK UNIFIED IDEOGRAPH +0xDBF3 0x72AF #CJK UNIFIED IDEOGRAPH +0xDBF4 0x7BC4 #CJK UNIFIED IDEOGRAPH +0xDBF5 0x8303 #CJK UNIFIED IDEOGRAPH +0xDBF6 0x6CD5 #CJK UNIFIED IDEOGRAPH +0xDBF7 0x743A #CJK UNIFIED IDEOGRAPH +0xDBF8 0x50FB #CJK UNIFIED IDEOGRAPH +0xDBF9 0x5288 #CJK UNIFIED IDEOGRAPH +0xDBFA 0x58C1 #CJK UNIFIED IDEOGRAPH +0xDBFB 0x64D8 #CJK UNIFIED IDEOGRAPH +0xDBFC 0x6A97 #CJK UNIFIED IDEOGRAPH +0xDBFD 0x74A7 #CJK UNIFIED IDEOGRAPH +0xDBFE 0x7656 #CJK UNIFIED IDEOGRAPH +0xDCA1 0x78A7 #CJK UNIFIED IDEOGRAPH +0xDCA2 0x8617 #CJK UNIFIED IDEOGRAPH +0xDCA3 0x95E2 #CJK UNIFIED IDEOGRAPH +0xDCA4 0x9739 #CJK UNIFIED IDEOGRAPH +0xDCA5 0xF965 #CJK COMPATIBILITY IDEOGRAPH +0xDCA6 0x535E #CJK UNIFIED IDEOGRAPH +0xDCA7 0x5F01 #CJK UNIFIED IDEOGRAPH +0xDCA8 0x8B8A #CJK UNIFIED IDEOGRAPH +0xDCA9 0x8FA8 #CJK UNIFIED IDEOGRAPH +0xDCAA 0x8FAF #CJK UNIFIED IDEOGRAPH +0xDCAB 0x908A #CJK UNIFIED IDEOGRAPH +0xDCAC 0x5225 #CJK UNIFIED IDEOGRAPH +0xDCAD 0x77A5 #CJK UNIFIED IDEOGRAPH +0xDCAE 0x9C49 #CJK UNIFIED IDEOGRAPH +0xDCAF 0x9F08 #CJK UNIFIED IDEOGRAPH +0xDCB0 0x4E19 #CJK UNIFIED IDEOGRAPH +0xDCB1 0x5002 #CJK UNIFIED IDEOGRAPH +0xDCB2 0x5175 #CJK UNIFIED IDEOGRAPH +0xDCB3 0x5C5B #CJK UNIFIED IDEOGRAPH +0xDCB4 0x5E77 #CJK UNIFIED IDEOGRAPH +0xDCB5 0x661E #CJK UNIFIED IDEOGRAPH +0xDCB6 0x663A #CJK UNIFIED IDEOGRAPH +0xDCB7 0x67C4 #CJK UNIFIED IDEOGRAPH +0xDCB8 0x68C5 #CJK UNIFIED IDEOGRAPH +0xDCB9 0x70B3 #CJK UNIFIED IDEOGRAPH +0xDCBA 0x7501 #CJK UNIFIED IDEOGRAPH +0xDCBB 0x75C5 #CJK UNIFIED IDEOGRAPH +0xDCBC 0x79C9 #CJK UNIFIED IDEOGRAPH +0xDCBD 0x7ADD #CJK UNIFIED IDEOGRAPH +0xDCBE 0x8F27 #CJK UNIFIED IDEOGRAPH +0xDCBF 0x9920 #CJK UNIFIED IDEOGRAPH +0xDCC0 0x9A08 #CJK UNIFIED IDEOGRAPH +0xDCC1 0x4FDD #CJK UNIFIED IDEOGRAPH +0xDCC2 0x5821 #CJK UNIFIED IDEOGRAPH +0xDCC3 0x5831 #CJK UNIFIED IDEOGRAPH +0xDCC4 0x5BF6 #CJK UNIFIED IDEOGRAPH +0xDCC5 0x666E #CJK UNIFIED IDEOGRAPH +0xDCC6 0x6B65 #CJK UNIFIED IDEOGRAPH +0xDCC7 0x6D11 #CJK UNIFIED IDEOGRAPH +0xDCC8 0x6E7A #CJK UNIFIED IDEOGRAPH +0xDCC9 0x6F7D #CJK UNIFIED IDEOGRAPH +0xDCCA 0x73E4 #CJK UNIFIED IDEOGRAPH +0xDCCB 0x752B #CJK UNIFIED IDEOGRAPH +0xDCCC 0x83E9 #CJK UNIFIED IDEOGRAPH +0xDCCD 0x88DC #CJK UNIFIED IDEOGRAPH +0xDCCE 0x8913 #CJK UNIFIED IDEOGRAPH +0xDCCF 0x8B5C #CJK UNIFIED IDEOGRAPH +0xDCD0 0x8F14 #CJK UNIFIED IDEOGRAPH +0xDCD1 0x4F0F #CJK UNIFIED IDEOGRAPH +0xDCD2 0x50D5 #CJK UNIFIED IDEOGRAPH +0xDCD3 0x5310 #CJK UNIFIED IDEOGRAPH +0xDCD4 0x535C #CJK UNIFIED IDEOGRAPH +0xDCD5 0x5B93 #CJK UNIFIED IDEOGRAPH +0xDCD6 0x5FA9 #CJK UNIFIED IDEOGRAPH +0xDCD7 0x670D #CJK UNIFIED IDEOGRAPH +0xDCD8 0x798F #CJK UNIFIED IDEOGRAPH +0xDCD9 0x8179 #CJK UNIFIED IDEOGRAPH +0xDCDA 0x832F #CJK UNIFIED IDEOGRAPH +0xDCDB 0x8514 #CJK UNIFIED IDEOGRAPH +0xDCDC 0x8907 #CJK UNIFIED IDEOGRAPH +0xDCDD 0x8986 #CJK UNIFIED IDEOGRAPH +0xDCDE 0x8F39 #CJK UNIFIED IDEOGRAPH +0xDCDF 0x8F3B #CJK UNIFIED IDEOGRAPH +0xDCE0 0x99A5 #CJK UNIFIED IDEOGRAPH +0xDCE1 0x9C12 #CJK UNIFIED IDEOGRAPH +0xDCE2 0x672C #CJK UNIFIED IDEOGRAPH +0xDCE3 0x4E76 #CJK UNIFIED IDEOGRAPH +0xDCE4 0x4FF8 #CJK UNIFIED IDEOGRAPH +0xDCE5 0x5949 #CJK UNIFIED IDEOGRAPH +0xDCE6 0x5C01 #CJK UNIFIED IDEOGRAPH +0xDCE7 0x5CEF #CJK UNIFIED IDEOGRAPH +0xDCE8 0x5CF0 #CJK UNIFIED IDEOGRAPH +0xDCE9 0x6367 #CJK UNIFIED IDEOGRAPH +0xDCEA 0x68D2 #CJK UNIFIED IDEOGRAPH +0xDCEB 0x70FD #CJK UNIFIED IDEOGRAPH +0xDCEC 0x71A2 #CJK UNIFIED IDEOGRAPH +0xDCED 0x742B #CJK UNIFIED IDEOGRAPH +0xDCEE 0x7E2B #CJK UNIFIED IDEOGRAPH +0xDCEF 0x84EC #CJK UNIFIED IDEOGRAPH +0xDCF0 0x8702 #CJK UNIFIED IDEOGRAPH +0xDCF1 0x9022 #CJK UNIFIED IDEOGRAPH +0xDCF2 0x92D2 #CJK UNIFIED IDEOGRAPH +0xDCF3 0x9CF3 #CJK UNIFIED IDEOGRAPH +0xDCF4 0x4E0D #CJK UNIFIED IDEOGRAPH +0xDCF5 0x4ED8 #CJK UNIFIED IDEOGRAPH +0xDCF6 0x4FEF #CJK UNIFIED IDEOGRAPH +0xDCF7 0x5085 #CJK UNIFIED IDEOGRAPH +0xDCF8 0x5256 #CJK UNIFIED IDEOGRAPH +0xDCF9 0x526F #CJK UNIFIED IDEOGRAPH +0xDCFA 0x5426 #CJK UNIFIED IDEOGRAPH +0xDCFB 0x5490 #CJK UNIFIED IDEOGRAPH +0xDCFC 0x57E0 #CJK UNIFIED IDEOGRAPH +0xDCFD 0x592B #CJK UNIFIED IDEOGRAPH +0xDCFE 0x5A66 #CJK UNIFIED IDEOGRAPH +0xDDA1 0x5B5A #CJK UNIFIED IDEOGRAPH +0xDDA2 0x5B75 #CJK UNIFIED IDEOGRAPH +0xDDA3 0x5BCC #CJK UNIFIED IDEOGRAPH +0xDDA4 0x5E9C #CJK UNIFIED IDEOGRAPH +0xDDA5 0xF966 #CJK COMPATIBILITY IDEOGRAPH +0xDDA6 0x6276 #CJK UNIFIED IDEOGRAPH +0xDDA7 0x6577 #CJK UNIFIED IDEOGRAPH +0xDDA8 0x65A7 #CJK UNIFIED IDEOGRAPH +0xDDA9 0x6D6E #CJK UNIFIED IDEOGRAPH +0xDDAA 0x6EA5 #CJK UNIFIED IDEOGRAPH +0xDDAB 0x7236 #CJK UNIFIED IDEOGRAPH +0xDDAC 0x7B26 #CJK UNIFIED IDEOGRAPH +0xDDAD 0x7C3F #CJK UNIFIED IDEOGRAPH +0xDDAE 0x7F36 #CJK UNIFIED IDEOGRAPH +0xDDAF 0x8150 #CJK UNIFIED IDEOGRAPH +0xDDB0 0x8151 #CJK UNIFIED IDEOGRAPH +0xDDB1 0x819A #CJK UNIFIED IDEOGRAPH +0xDDB2 0x8240 #CJK UNIFIED IDEOGRAPH +0xDDB3 0x8299 #CJK UNIFIED IDEOGRAPH +0xDDB4 0x83A9 #CJK UNIFIED IDEOGRAPH +0xDDB5 0x8A03 #CJK UNIFIED IDEOGRAPH +0xDDB6 0x8CA0 #CJK UNIFIED IDEOGRAPH +0xDDB7 0x8CE6 #CJK UNIFIED IDEOGRAPH +0xDDB8 0x8CFB #CJK UNIFIED IDEOGRAPH +0xDDB9 0x8D74 #CJK UNIFIED IDEOGRAPH +0xDDBA 0x8DBA #CJK UNIFIED IDEOGRAPH +0xDDBB 0x90E8 #CJK UNIFIED IDEOGRAPH +0xDDBC 0x91DC #CJK UNIFIED IDEOGRAPH +0xDDBD 0x961C #CJK UNIFIED IDEOGRAPH +0xDDBE 0x9644 #CJK UNIFIED IDEOGRAPH +0xDDBF 0x99D9 #CJK UNIFIED IDEOGRAPH +0xDDC0 0x9CE7 #CJK UNIFIED IDEOGRAPH +0xDDC1 0x5317 #CJK UNIFIED IDEOGRAPH +0xDDC2 0x5206 #CJK UNIFIED IDEOGRAPH +0xDDC3 0x5429 #CJK UNIFIED IDEOGRAPH +0xDDC4 0x5674 #CJK UNIFIED IDEOGRAPH +0xDDC5 0x58B3 #CJK UNIFIED IDEOGRAPH +0xDDC6 0x5954 #CJK UNIFIED IDEOGRAPH +0xDDC7 0x596E #CJK UNIFIED IDEOGRAPH +0xDDC8 0x5FFF #CJK UNIFIED IDEOGRAPH +0xDDC9 0x61A4 #CJK UNIFIED IDEOGRAPH +0xDDCA 0x626E #CJK UNIFIED IDEOGRAPH +0xDDCB 0x6610 #CJK UNIFIED IDEOGRAPH +0xDDCC 0x6C7E #CJK UNIFIED IDEOGRAPH +0xDDCD 0x711A #CJK UNIFIED IDEOGRAPH +0xDDCE 0x76C6 #CJK UNIFIED IDEOGRAPH +0xDDCF 0x7C89 #CJK UNIFIED IDEOGRAPH +0xDDD0 0x7CDE #CJK UNIFIED IDEOGRAPH +0xDDD1 0x7D1B #CJK UNIFIED IDEOGRAPH +0xDDD2 0x82AC #CJK UNIFIED IDEOGRAPH +0xDDD3 0x8CC1 #CJK UNIFIED IDEOGRAPH +0xDDD4 0x96F0 #CJK UNIFIED IDEOGRAPH +0xDDD5 0xF967 #CJK COMPATIBILITY IDEOGRAPH +0xDDD6 0x4F5B #CJK UNIFIED IDEOGRAPH +0xDDD7 0x5F17 #CJK UNIFIED IDEOGRAPH +0xDDD8 0x5F7F #CJK UNIFIED IDEOGRAPH +0xDDD9 0x62C2 #CJK UNIFIED IDEOGRAPH +0xDDDA 0x5D29 #CJK UNIFIED IDEOGRAPH +0xDDDB 0x670B #CJK UNIFIED IDEOGRAPH +0xDDDC 0x68DA #CJK UNIFIED IDEOGRAPH +0xDDDD 0x787C #CJK UNIFIED IDEOGRAPH +0xDDDE 0x7E43 #CJK UNIFIED IDEOGRAPH +0xDDDF 0x9D6C #CJK UNIFIED IDEOGRAPH +0xDDE0 0x4E15 #CJK UNIFIED IDEOGRAPH +0xDDE1 0x5099 #CJK UNIFIED IDEOGRAPH +0xDDE2 0x5315 #CJK UNIFIED IDEOGRAPH +0xDDE3 0x532A #CJK UNIFIED IDEOGRAPH +0xDDE4 0x5351 #CJK UNIFIED IDEOGRAPH +0xDDE5 0x5983 #CJK UNIFIED IDEOGRAPH +0xDDE6 0x5A62 #CJK UNIFIED IDEOGRAPH +0xDDE7 0x5E87 #CJK UNIFIED IDEOGRAPH +0xDDE8 0x60B2 #CJK UNIFIED IDEOGRAPH +0xDDE9 0x618A #CJK UNIFIED IDEOGRAPH +0xDDEA 0x6249 #CJK UNIFIED IDEOGRAPH +0xDDEB 0x6279 #CJK UNIFIED IDEOGRAPH +0xDDEC 0x6590 #CJK UNIFIED IDEOGRAPH +0xDDED 0x6787 #CJK UNIFIED IDEOGRAPH +0xDDEE 0x69A7 #CJK UNIFIED IDEOGRAPH +0xDDEF 0x6BD4 #CJK UNIFIED IDEOGRAPH +0xDDF0 0x6BD6 #CJK UNIFIED IDEOGRAPH +0xDDF1 0x6BD7 #CJK UNIFIED IDEOGRAPH +0xDDF2 0x6BD8 #CJK UNIFIED IDEOGRAPH +0xDDF3 0x6CB8 #CJK UNIFIED IDEOGRAPH +0xDDF4 0xF968 #CJK COMPATIBILITY IDEOGRAPH +0xDDF5 0x7435 #CJK UNIFIED IDEOGRAPH +0xDDF6 0x75FA #CJK UNIFIED IDEOGRAPH +0xDDF7 0x7812 #CJK UNIFIED IDEOGRAPH +0xDDF8 0x7891 #CJK UNIFIED IDEOGRAPH +0xDDF9 0x79D5 #CJK UNIFIED IDEOGRAPH +0xDDFA 0x79D8 #CJK UNIFIED IDEOGRAPH +0xDDFB 0x7C83 #CJK UNIFIED IDEOGRAPH +0xDDFC 0x7DCB #CJK UNIFIED IDEOGRAPH +0xDDFD 0x7FE1 #CJK UNIFIED IDEOGRAPH +0xDDFE 0x80A5 #CJK UNIFIED IDEOGRAPH +0xDEA1 0x813E #CJK UNIFIED IDEOGRAPH +0xDEA2 0x81C2 #CJK UNIFIED IDEOGRAPH +0xDEA3 0x83F2 #CJK UNIFIED IDEOGRAPH +0xDEA4 0x871A #CJK UNIFIED IDEOGRAPH +0xDEA5 0x88E8 #CJK UNIFIED IDEOGRAPH +0xDEA6 0x8AB9 #CJK UNIFIED IDEOGRAPH +0xDEA7 0x8B6C #CJK UNIFIED IDEOGRAPH +0xDEA8 0x8CBB #CJK UNIFIED IDEOGRAPH +0xDEA9 0x9119 #CJK UNIFIED IDEOGRAPH +0xDEAA 0x975E #CJK UNIFIED IDEOGRAPH +0xDEAB 0x98DB #CJK UNIFIED IDEOGRAPH +0xDEAC 0x9F3B #CJK UNIFIED IDEOGRAPH +0xDEAD 0x56AC #CJK UNIFIED IDEOGRAPH +0xDEAE 0x5B2A #CJK UNIFIED IDEOGRAPH +0xDEAF 0x5F6C #CJK UNIFIED IDEOGRAPH +0xDEB0 0x658C #CJK UNIFIED IDEOGRAPH +0xDEB1 0x6AB3 #CJK UNIFIED IDEOGRAPH +0xDEB2 0x6BAF #CJK UNIFIED IDEOGRAPH +0xDEB3 0x6D5C #CJK UNIFIED IDEOGRAPH +0xDEB4 0x6FF1 #CJK UNIFIED IDEOGRAPH +0xDEB5 0x7015 #CJK UNIFIED IDEOGRAPH +0xDEB6 0x725D #CJK UNIFIED IDEOGRAPH +0xDEB7 0x73AD #CJK UNIFIED IDEOGRAPH +0xDEB8 0x8CA7 #CJK UNIFIED IDEOGRAPH +0xDEB9 0x8CD3 #CJK UNIFIED IDEOGRAPH +0xDEBA 0x983B #CJK UNIFIED IDEOGRAPH +0xDEBB 0x6191 #CJK UNIFIED IDEOGRAPH +0xDEBC 0x6C37 #CJK UNIFIED IDEOGRAPH +0xDEBD 0x8058 #CJK UNIFIED IDEOGRAPH +0xDEBE 0x9A01 #CJK UNIFIED IDEOGRAPH +0xDEBF 0x4E4D #CJK UNIFIED IDEOGRAPH +0xDEC0 0x4E8B #CJK UNIFIED IDEOGRAPH +0xDEC1 0x4E9B #CJK UNIFIED IDEOGRAPH +0xDEC2 0x4ED5 #CJK UNIFIED IDEOGRAPH +0xDEC3 0x4F3A #CJK UNIFIED IDEOGRAPH +0xDEC4 0x4F3C #CJK UNIFIED IDEOGRAPH +0xDEC5 0x4F7F #CJK UNIFIED IDEOGRAPH +0xDEC6 0x4FDF #CJK UNIFIED IDEOGRAPH +0xDEC7 0x50FF #CJK UNIFIED IDEOGRAPH +0xDEC8 0x53F2 #CJK UNIFIED IDEOGRAPH +0xDEC9 0x53F8 #CJK UNIFIED IDEOGRAPH +0xDECA 0x5506 #CJK UNIFIED IDEOGRAPH +0xDECB 0x55E3 #CJK UNIFIED IDEOGRAPH +0xDECC 0x56DB #CJK UNIFIED IDEOGRAPH +0xDECD 0x58EB #CJK UNIFIED IDEOGRAPH +0xDECE 0x5962 #CJK UNIFIED IDEOGRAPH +0xDECF 0x5A11 #CJK UNIFIED IDEOGRAPH +0xDED0 0x5BEB #CJK UNIFIED IDEOGRAPH +0xDED1 0x5BFA #CJK UNIFIED IDEOGRAPH +0xDED2 0x5C04 #CJK UNIFIED IDEOGRAPH +0xDED3 0x5DF3 #CJK UNIFIED IDEOGRAPH +0xDED4 0x5E2B #CJK UNIFIED IDEOGRAPH +0xDED5 0x5F99 #CJK UNIFIED IDEOGRAPH +0xDED6 0x601D #CJK UNIFIED IDEOGRAPH +0xDED7 0x6368 #CJK UNIFIED IDEOGRAPH +0xDED8 0x659C #CJK UNIFIED IDEOGRAPH +0xDED9 0x65AF #CJK UNIFIED IDEOGRAPH +0xDEDA 0x67F6 #CJK UNIFIED IDEOGRAPH +0xDEDB 0x67FB #CJK UNIFIED IDEOGRAPH +0xDEDC 0x68AD #CJK UNIFIED IDEOGRAPH +0xDEDD 0x6B7B #CJK UNIFIED IDEOGRAPH +0xDEDE 0x6C99 #CJK UNIFIED IDEOGRAPH +0xDEDF 0x6CD7 #CJK UNIFIED IDEOGRAPH +0xDEE0 0x6E23 #CJK UNIFIED IDEOGRAPH +0xDEE1 0x7009 #CJK UNIFIED IDEOGRAPH +0xDEE2 0x7345 #CJK UNIFIED IDEOGRAPH +0xDEE3 0x7802 #CJK UNIFIED IDEOGRAPH +0xDEE4 0x793E #CJK UNIFIED IDEOGRAPH +0xDEE5 0x7940 #CJK UNIFIED IDEOGRAPH +0xDEE6 0x7960 #CJK UNIFIED IDEOGRAPH +0xDEE7 0x79C1 #CJK UNIFIED IDEOGRAPH +0xDEE8 0x7BE9 #CJK UNIFIED IDEOGRAPH +0xDEE9 0x7D17 #CJK UNIFIED IDEOGRAPH +0xDEEA 0x7D72 #CJK UNIFIED IDEOGRAPH +0xDEEB 0x8086 #CJK UNIFIED IDEOGRAPH +0xDEEC 0x820D #CJK UNIFIED IDEOGRAPH +0xDEED 0x838E #CJK UNIFIED IDEOGRAPH +0xDEEE 0x84D1 #CJK UNIFIED IDEOGRAPH +0xDEEF 0x86C7 #CJK UNIFIED IDEOGRAPH +0xDEF0 0x88DF #CJK UNIFIED IDEOGRAPH +0xDEF1 0x8A50 #CJK UNIFIED IDEOGRAPH +0xDEF2 0x8A5E #CJK UNIFIED IDEOGRAPH +0xDEF3 0x8B1D #CJK UNIFIED IDEOGRAPH +0xDEF4 0x8CDC #CJK UNIFIED IDEOGRAPH +0xDEF5 0x8D66 #CJK UNIFIED IDEOGRAPH +0xDEF6 0x8FAD #CJK UNIFIED IDEOGRAPH +0xDEF7 0x90AA #CJK UNIFIED IDEOGRAPH +0xDEF8 0x98FC #CJK UNIFIED IDEOGRAPH +0xDEF9 0x99DF #CJK UNIFIED IDEOGRAPH +0xDEFA 0x9E9D #CJK UNIFIED IDEOGRAPH +0xDEFB 0x524A #CJK UNIFIED IDEOGRAPH +0xDEFC 0xF969 #CJK COMPATIBILITY IDEOGRAPH +0xDEFD 0x6714 #CJK UNIFIED IDEOGRAPH +0xDEFE 0xF96A #CJK COMPATIBILITY IDEOGRAPH +0xDFA1 0x5098 #CJK UNIFIED IDEOGRAPH +0xDFA2 0x522A #CJK UNIFIED IDEOGRAPH +0xDFA3 0x5C71 #CJK UNIFIED IDEOGRAPH +0xDFA4 0x6563 #CJK UNIFIED IDEOGRAPH +0xDFA5 0x6C55 #CJK UNIFIED IDEOGRAPH +0xDFA6 0x73CA #CJK UNIFIED IDEOGRAPH +0xDFA7 0x7523 #CJK UNIFIED IDEOGRAPH +0xDFA8 0x759D #CJK UNIFIED IDEOGRAPH +0xDFA9 0x7B97 #CJK UNIFIED IDEOGRAPH +0xDFAA 0x849C #CJK UNIFIED IDEOGRAPH +0xDFAB 0x9178 #CJK UNIFIED IDEOGRAPH +0xDFAC 0x9730 #CJK UNIFIED IDEOGRAPH +0xDFAD 0x4E77 #CJK UNIFIED IDEOGRAPH +0xDFAE 0x6492 #CJK UNIFIED IDEOGRAPH +0xDFAF 0x6BBA #CJK UNIFIED IDEOGRAPH +0xDFB0 0x715E #CJK UNIFIED IDEOGRAPH +0xDFB1 0x85A9 #CJK UNIFIED IDEOGRAPH +0xDFB2 0x4E09 #CJK UNIFIED IDEOGRAPH +0xDFB3 0xF96B #CJK COMPATIBILITY IDEOGRAPH +0xDFB4 0x6749 #CJK UNIFIED IDEOGRAPH +0xDFB5 0x68EE #CJK UNIFIED IDEOGRAPH +0xDFB6 0x6E17 #CJK UNIFIED IDEOGRAPH +0xDFB7 0x829F #CJK UNIFIED IDEOGRAPH +0xDFB8 0x8518 #CJK UNIFIED IDEOGRAPH +0xDFB9 0x886B #CJK UNIFIED IDEOGRAPH +0xDFBA 0x63F7 #CJK UNIFIED IDEOGRAPH +0xDFBB 0x6F81 #CJK UNIFIED IDEOGRAPH +0xDFBC 0x9212 #CJK UNIFIED IDEOGRAPH +0xDFBD 0x98AF #CJK UNIFIED IDEOGRAPH +0xDFBE 0x4E0A #CJK UNIFIED IDEOGRAPH +0xDFBF 0x50B7 #CJK UNIFIED IDEOGRAPH +0xDFC0 0x50CF #CJK UNIFIED IDEOGRAPH +0xDFC1 0x511F #CJK UNIFIED IDEOGRAPH +0xDFC2 0x5546 #CJK UNIFIED IDEOGRAPH +0xDFC3 0x55AA #CJK UNIFIED IDEOGRAPH +0xDFC4 0x5617 #CJK UNIFIED IDEOGRAPH +0xDFC5 0x5B40 #CJK UNIFIED IDEOGRAPH +0xDFC6 0x5C19 #CJK UNIFIED IDEOGRAPH +0xDFC7 0x5CE0 #CJK UNIFIED IDEOGRAPH +0xDFC8 0x5E38 #CJK UNIFIED IDEOGRAPH +0xDFC9 0x5E8A #CJK UNIFIED IDEOGRAPH +0xDFCA 0x5EA0 #CJK UNIFIED IDEOGRAPH +0xDFCB 0x5EC2 #CJK UNIFIED IDEOGRAPH +0xDFCC 0x60F3 #CJK UNIFIED IDEOGRAPH +0xDFCD 0x6851 #CJK UNIFIED IDEOGRAPH +0xDFCE 0x6A61 #CJK UNIFIED IDEOGRAPH +0xDFCF 0x6E58 #CJK UNIFIED IDEOGRAPH +0xDFD0 0x723D #CJK UNIFIED IDEOGRAPH +0xDFD1 0x7240 #CJK UNIFIED IDEOGRAPH +0xDFD2 0x72C0 #CJK UNIFIED IDEOGRAPH +0xDFD3 0x76F8 #CJK UNIFIED IDEOGRAPH +0xDFD4 0x7965 #CJK UNIFIED IDEOGRAPH +0xDFD5 0x7BB1 #CJK UNIFIED IDEOGRAPH +0xDFD6 0x7FD4 #CJK UNIFIED IDEOGRAPH +0xDFD7 0x88F3 #CJK UNIFIED IDEOGRAPH +0xDFD8 0x89F4 #CJK UNIFIED IDEOGRAPH +0xDFD9 0x8A73 #CJK UNIFIED IDEOGRAPH +0xDFDA 0x8C61 #CJK UNIFIED IDEOGRAPH +0xDFDB 0x8CDE #CJK UNIFIED IDEOGRAPH +0xDFDC 0x971C #CJK UNIFIED IDEOGRAPH +0xDFDD 0x585E #CJK UNIFIED IDEOGRAPH +0xDFDE 0x74BD #CJK UNIFIED IDEOGRAPH +0xDFDF 0x8CFD #CJK UNIFIED IDEOGRAPH +0xDFE0 0x55C7 #CJK UNIFIED IDEOGRAPH +0xDFE1 0xF96C #CJK COMPATIBILITY IDEOGRAPH +0xDFE2 0x7A61 #CJK UNIFIED IDEOGRAPH +0xDFE3 0x7D22 #CJK UNIFIED IDEOGRAPH +0xDFE4 0x8272 #CJK UNIFIED IDEOGRAPH +0xDFE5 0x7272 #CJK UNIFIED IDEOGRAPH +0xDFE6 0x751F #CJK UNIFIED IDEOGRAPH +0xDFE7 0x7525 #CJK UNIFIED IDEOGRAPH +0xDFE8 0xF96D #CJK COMPATIBILITY IDEOGRAPH +0xDFE9 0x7B19 #CJK UNIFIED IDEOGRAPH +0xDFEA 0x5885 #CJK UNIFIED IDEOGRAPH +0xDFEB 0x58FB #CJK UNIFIED IDEOGRAPH +0xDFEC 0x5DBC #CJK UNIFIED IDEOGRAPH +0xDFED 0x5E8F #CJK UNIFIED IDEOGRAPH +0xDFEE 0x5EB6 #CJK UNIFIED IDEOGRAPH +0xDFEF 0x5F90 #CJK UNIFIED IDEOGRAPH +0xDFF0 0x6055 #CJK UNIFIED IDEOGRAPH +0xDFF1 0x6292 #CJK UNIFIED IDEOGRAPH +0xDFF2 0x637F #CJK UNIFIED IDEOGRAPH +0xDFF3 0x654D #CJK UNIFIED IDEOGRAPH +0xDFF4 0x6691 #CJK UNIFIED IDEOGRAPH +0xDFF5 0x66D9 #CJK UNIFIED IDEOGRAPH +0xDFF6 0x66F8 #CJK UNIFIED IDEOGRAPH +0xDFF7 0x6816 #CJK UNIFIED IDEOGRAPH +0xDFF8 0x68F2 #CJK UNIFIED IDEOGRAPH +0xDFF9 0x7280 #CJK UNIFIED IDEOGRAPH +0xDFFA 0x745E #CJK UNIFIED IDEOGRAPH +0xDFFB 0x7B6E #CJK UNIFIED IDEOGRAPH +0xDFFC 0x7D6E #CJK UNIFIED IDEOGRAPH +0xDFFD 0x7DD6 #CJK UNIFIED IDEOGRAPH +0xDFFE 0x7F72 #CJK UNIFIED IDEOGRAPH +0xE0A1 0x80E5 #CJK UNIFIED IDEOGRAPH +0xE0A2 0x8212 #CJK UNIFIED IDEOGRAPH +0xE0A3 0x85AF #CJK UNIFIED IDEOGRAPH +0xE0A4 0x897F #CJK UNIFIED IDEOGRAPH +0xE0A5 0x8A93 #CJK UNIFIED IDEOGRAPH +0xE0A6 0x901D #CJK UNIFIED IDEOGRAPH +0xE0A7 0x92E4 #CJK UNIFIED IDEOGRAPH +0xE0A8 0x9ECD #CJK UNIFIED IDEOGRAPH +0xE0A9 0x9F20 #CJK UNIFIED IDEOGRAPH +0xE0AA 0x5915 #CJK UNIFIED IDEOGRAPH +0xE0AB 0x596D #CJK UNIFIED IDEOGRAPH +0xE0AC 0x5E2D #CJK UNIFIED IDEOGRAPH +0xE0AD 0x60DC #CJK UNIFIED IDEOGRAPH +0xE0AE 0x6614 #CJK UNIFIED IDEOGRAPH +0xE0AF 0x6673 #CJK UNIFIED IDEOGRAPH +0xE0B0 0x6790 #CJK UNIFIED IDEOGRAPH +0xE0B1 0x6C50 #CJK UNIFIED IDEOGRAPH +0xE0B2 0x6DC5 #CJK UNIFIED IDEOGRAPH +0xE0B3 0x6F5F #CJK UNIFIED IDEOGRAPH +0xE0B4 0x77F3 #CJK UNIFIED IDEOGRAPH +0xE0B5 0x78A9 #CJK UNIFIED IDEOGRAPH +0xE0B6 0x84C6 #CJK UNIFIED IDEOGRAPH +0xE0B7 0x91CB #CJK UNIFIED IDEOGRAPH +0xE0B8 0x932B #CJK UNIFIED IDEOGRAPH +0xE0B9 0x4ED9 #CJK UNIFIED IDEOGRAPH +0xE0BA 0x50CA #CJK UNIFIED IDEOGRAPH +0xE0BB 0x5148 #CJK UNIFIED IDEOGRAPH +0xE0BC 0x5584 #CJK UNIFIED IDEOGRAPH +0xE0BD 0x5B0B #CJK UNIFIED IDEOGRAPH +0xE0BE 0x5BA3 #CJK UNIFIED IDEOGRAPH +0xE0BF 0x6247 #CJK UNIFIED IDEOGRAPH +0xE0C0 0x657E #CJK UNIFIED IDEOGRAPH +0xE0C1 0x65CB #CJK UNIFIED IDEOGRAPH +0xE0C2 0x6E32 #CJK UNIFIED IDEOGRAPH +0xE0C3 0x717D #CJK UNIFIED IDEOGRAPH +0xE0C4 0x7401 #CJK UNIFIED IDEOGRAPH +0xE0C5 0x7444 #CJK UNIFIED IDEOGRAPH +0xE0C6 0x7487 #CJK UNIFIED IDEOGRAPH +0xE0C7 0x74BF #CJK UNIFIED IDEOGRAPH +0xE0C8 0x766C #CJK UNIFIED IDEOGRAPH +0xE0C9 0x79AA #CJK UNIFIED IDEOGRAPH +0xE0CA 0x7DDA #CJK UNIFIED IDEOGRAPH +0xE0CB 0x7E55 #CJK UNIFIED IDEOGRAPH +0xE0CC 0x7FA8 #CJK UNIFIED IDEOGRAPH +0xE0CD 0x817A #CJK UNIFIED IDEOGRAPH +0xE0CE 0x81B3 #CJK UNIFIED IDEOGRAPH +0xE0CF 0x8239 #CJK UNIFIED IDEOGRAPH +0xE0D0 0x861A #CJK UNIFIED IDEOGRAPH +0xE0D1 0x87EC #CJK UNIFIED IDEOGRAPH +0xE0D2 0x8A75 #CJK UNIFIED IDEOGRAPH +0xE0D3 0x8DE3 #CJK UNIFIED IDEOGRAPH +0xE0D4 0x9078 #CJK UNIFIED IDEOGRAPH +0xE0D5 0x9291 #CJK UNIFIED IDEOGRAPH +0xE0D6 0x9425 #CJK UNIFIED IDEOGRAPH +0xE0D7 0x994D #CJK UNIFIED IDEOGRAPH +0xE0D8 0x9BAE #CJK UNIFIED IDEOGRAPH +0xE0D9 0x5368 #CJK UNIFIED IDEOGRAPH +0xE0DA 0x5C51 #CJK UNIFIED IDEOGRAPH +0xE0DB 0x6954 #CJK UNIFIED IDEOGRAPH +0xE0DC 0x6CC4 #CJK UNIFIED IDEOGRAPH +0xE0DD 0x6D29 #CJK UNIFIED IDEOGRAPH +0xE0DE 0x6E2B #CJK UNIFIED IDEOGRAPH +0xE0DF 0x820C #CJK UNIFIED IDEOGRAPH +0xE0E0 0x859B #CJK UNIFIED IDEOGRAPH +0xE0E1 0x893B #CJK UNIFIED IDEOGRAPH +0xE0E2 0x8A2D #CJK UNIFIED IDEOGRAPH +0xE0E3 0x8AAA #CJK UNIFIED IDEOGRAPH +0xE0E4 0x96EA #CJK UNIFIED IDEOGRAPH +0xE0E5 0x9F67 #CJK UNIFIED IDEOGRAPH +0xE0E6 0x5261 #CJK UNIFIED IDEOGRAPH +0xE0E7 0x66B9 #CJK UNIFIED IDEOGRAPH +0xE0E8 0x6BB2 #CJK UNIFIED IDEOGRAPH +0xE0E9 0x7E96 #CJK UNIFIED IDEOGRAPH +0xE0EA 0x87FE #CJK UNIFIED IDEOGRAPH +0xE0EB 0x8D0D #CJK UNIFIED IDEOGRAPH +0xE0EC 0x9583 #CJK UNIFIED IDEOGRAPH +0xE0ED 0x965D #CJK UNIFIED IDEOGRAPH +0xE0EE 0x651D #CJK UNIFIED IDEOGRAPH +0xE0EF 0x6D89 #CJK UNIFIED IDEOGRAPH +0xE0F0 0x71EE #CJK UNIFIED IDEOGRAPH +0xE0F1 0xF96E #CJK COMPATIBILITY IDEOGRAPH +0xE0F2 0x57CE #CJK UNIFIED IDEOGRAPH +0xE0F3 0x59D3 #CJK UNIFIED IDEOGRAPH +0xE0F4 0x5BAC #CJK UNIFIED IDEOGRAPH +0xE0F5 0x6027 #CJK UNIFIED IDEOGRAPH +0xE0F6 0x60FA #CJK UNIFIED IDEOGRAPH +0xE0F7 0x6210 #CJK UNIFIED IDEOGRAPH +0xE0F8 0x661F #CJK UNIFIED IDEOGRAPH +0xE0F9 0x665F #CJK UNIFIED IDEOGRAPH +0xE0FA 0x7329 #CJK UNIFIED IDEOGRAPH +0xE0FB 0x73F9 #CJK UNIFIED IDEOGRAPH +0xE0FC 0x76DB #CJK UNIFIED IDEOGRAPH +0xE0FD 0x7701 #CJK UNIFIED IDEOGRAPH +0xE0FE 0x7B6C #CJK UNIFIED IDEOGRAPH +0xE1A1 0x8056 #CJK UNIFIED IDEOGRAPH +0xE1A2 0x8072 #CJK UNIFIED IDEOGRAPH +0xE1A3 0x8165 #CJK UNIFIED IDEOGRAPH +0xE1A4 0x8AA0 #CJK UNIFIED IDEOGRAPH +0xE1A5 0x9192 #CJK UNIFIED IDEOGRAPH +0xE1A6 0x4E16 #CJK UNIFIED IDEOGRAPH +0xE1A7 0x52E2 #CJK UNIFIED IDEOGRAPH +0xE1A8 0x6B72 #CJK UNIFIED IDEOGRAPH +0xE1A9 0x6D17 #CJK UNIFIED IDEOGRAPH +0xE1AA 0x7A05 #CJK UNIFIED IDEOGRAPH +0xE1AB 0x7B39 #CJK UNIFIED IDEOGRAPH +0xE1AC 0x7D30 #CJK UNIFIED IDEOGRAPH +0xE1AD 0xF96F #CJK COMPATIBILITY IDEOGRAPH +0xE1AE 0x8CB0 #CJK UNIFIED IDEOGRAPH +0xE1AF 0x53EC #CJK UNIFIED IDEOGRAPH +0xE1B0 0x562F #CJK UNIFIED IDEOGRAPH +0xE1B1 0x5851 #CJK UNIFIED IDEOGRAPH +0xE1B2 0x5BB5 #CJK UNIFIED IDEOGRAPH +0xE1B3 0x5C0F #CJK UNIFIED IDEOGRAPH +0xE1B4 0x5C11 #CJK UNIFIED IDEOGRAPH +0xE1B5 0x5DE2 #CJK UNIFIED IDEOGRAPH +0xE1B6 0x6240 #CJK UNIFIED IDEOGRAPH +0xE1B7 0x6383 #CJK UNIFIED IDEOGRAPH +0xE1B8 0x6414 #CJK UNIFIED IDEOGRAPH +0xE1B9 0x662D #CJK UNIFIED IDEOGRAPH +0xE1BA 0x68B3 #CJK UNIFIED IDEOGRAPH +0xE1BB 0x6CBC #CJK UNIFIED IDEOGRAPH +0xE1BC 0x6D88 #CJK UNIFIED IDEOGRAPH +0xE1BD 0x6EAF #CJK UNIFIED IDEOGRAPH +0xE1BE 0x701F #CJK UNIFIED IDEOGRAPH +0xE1BF 0x70A4 #CJK UNIFIED IDEOGRAPH +0xE1C0 0x71D2 #CJK UNIFIED IDEOGRAPH +0xE1C1 0x7526 #CJK UNIFIED IDEOGRAPH +0xE1C2 0x758F #CJK UNIFIED IDEOGRAPH +0xE1C3 0x758E #CJK UNIFIED IDEOGRAPH +0xE1C4 0x7619 #CJK UNIFIED IDEOGRAPH +0xE1C5 0x7B11 #CJK UNIFIED IDEOGRAPH +0xE1C6 0x7BE0 #CJK UNIFIED IDEOGRAPH +0xE1C7 0x7C2B #CJK UNIFIED IDEOGRAPH +0xE1C8 0x7D20 #CJK UNIFIED IDEOGRAPH +0xE1C9 0x7D39 #CJK UNIFIED IDEOGRAPH +0xE1CA 0x852C #CJK UNIFIED IDEOGRAPH +0xE1CB 0x856D #CJK UNIFIED IDEOGRAPH +0xE1CC 0x8607 #CJK UNIFIED IDEOGRAPH +0xE1CD 0x8A34 #CJK UNIFIED IDEOGRAPH +0xE1CE 0x900D #CJK UNIFIED IDEOGRAPH +0xE1CF 0x9061 #CJK UNIFIED IDEOGRAPH +0xE1D0 0x90B5 #CJK UNIFIED IDEOGRAPH +0xE1D1 0x92B7 #CJK UNIFIED IDEOGRAPH +0xE1D2 0x97F6 #CJK UNIFIED IDEOGRAPH +0xE1D3 0x9A37 #CJK UNIFIED IDEOGRAPH +0xE1D4 0x4FD7 #CJK UNIFIED IDEOGRAPH +0xE1D5 0x5C6C #CJK UNIFIED IDEOGRAPH +0xE1D6 0x675F #CJK UNIFIED IDEOGRAPH +0xE1D7 0x6D91 #CJK UNIFIED IDEOGRAPH +0xE1D8 0x7C9F #CJK UNIFIED IDEOGRAPH +0xE1D9 0x7E8C #CJK UNIFIED IDEOGRAPH +0xE1DA 0x8B16 #CJK UNIFIED IDEOGRAPH +0xE1DB 0x8D16 #CJK UNIFIED IDEOGRAPH +0xE1DC 0x901F #CJK UNIFIED IDEOGRAPH +0xE1DD 0x5B6B #CJK UNIFIED IDEOGRAPH +0xE1DE 0x5DFD #CJK UNIFIED IDEOGRAPH +0xE1DF 0x640D #CJK UNIFIED IDEOGRAPH +0xE1E0 0x84C0 #CJK UNIFIED IDEOGRAPH +0xE1E1 0x905C #CJK UNIFIED IDEOGRAPH +0xE1E2 0x98E1 #CJK UNIFIED IDEOGRAPH +0xE1E3 0x7387 #CJK UNIFIED IDEOGRAPH +0xE1E4 0x5B8B #CJK UNIFIED IDEOGRAPH +0xE1E5 0x609A #CJK UNIFIED IDEOGRAPH +0xE1E6 0x677E #CJK UNIFIED IDEOGRAPH +0xE1E7 0x6DDE #CJK UNIFIED IDEOGRAPH +0xE1E8 0x8A1F #CJK UNIFIED IDEOGRAPH +0xE1E9 0x8AA6 #CJK UNIFIED IDEOGRAPH +0xE1EA 0x9001 #CJK UNIFIED IDEOGRAPH +0xE1EB 0x980C #CJK UNIFIED IDEOGRAPH +0xE1EC 0x5237 #CJK UNIFIED IDEOGRAPH +0xE1ED 0xF970 #CJK COMPATIBILITY IDEOGRAPH +0xE1EE 0x7051 #CJK UNIFIED IDEOGRAPH +0xE1EF 0x788E #CJK UNIFIED IDEOGRAPH +0xE1F0 0x9396 #CJK UNIFIED IDEOGRAPH +0xE1F1 0x8870 #CJK UNIFIED IDEOGRAPH +0xE1F2 0x91D7 #CJK UNIFIED IDEOGRAPH +0xE1F3 0x4FEE #CJK UNIFIED IDEOGRAPH +0xE1F4 0x53D7 #CJK UNIFIED IDEOGRAPH +0xE1F5 0x55FD #CJK UNIFIED IDEOGRAPH +0xE1F6 0x56DA #CJK UNIFIED IDEOGRAPH +0xE1F7 0x5782 #CJK UNIFIED IDEOGRAPH +0xE1F8 0x58FD #CJK UNIFIED IDEOGRAPH +0xE1F9 0x5AC2 #CJK UNIFIED IDEOGRAPH +0xE1FA 0x5B88 #CJK UNIFIED IDEOGRAPH +0xE1FB 0x5CAB #CJK UNIFIED IDEOGRAPH +0xE1FC 0x5CC0 #CJK UNIFIED IDEOGRAPH +0xE1FD 0x5E25 #CJK UNIFIED IDEOGRAPH +0xE1FE 0x6101 #CJK UNIFIED IDEOGRAPH +0xE2A1 0x620D #CJK UNIFIED IDEOGRAPH +0xE2A2 0x624B #CJK UNIFIED IDEOGRAPH +0xE2A3 0x6388 #CJK UNIFIED IDEOGRAPH +0xE2A4 0x641C #CJK UNIFIED IDEOGRAPH +0xE2A5 0x6536 #CJK UNIFIED IDEOGRAPH +0xE2A6 0x6578 #CJK UNIFIED IDEOGRAPH +0xE2A7 0x6A39 #CJK UNIFIED IDEOGRAPH +0xE2A8 0x6B8A #CJK UNIFIED IDEOGRAPH +0xE2A9 0x6C34 #CJK UNIFIED IDEOGRAPH +0xE2AA 0x6D19 #CJK UNIFIED IDEOGRAPH +0xE2AB 0x6F31 #CJK UNIFIED IDEOGRAPH +0xE2AC 0x71E7 #CJK UNIFIED IDEOGRAPH +0xE2AD 0x72E9 #CJK UNIFIED IDEOGRAPH +0xE2AE 0x7378 #CJK UNIFIED IDEOGRAPH +0xE2AF 0x7407 #CJK UNIFIED IDEOGRAPH +0xE2B0 0x74B2 #CJK UNIFIED IDEOGRAPH +0xE2B1 0x7626 #CJK UNIFIED IDEOGRAPH +0xE2B2 0x7761 #CJK UNIFIED IDEOGRAPH +0xE2B3 0x79C0 #CJK UNIFIED IDEOGRAPH +0xE2B4 0x7A57 #CJK UNIFIED IDEOGRAPH +0xE2B5 0x7AEA #CJK UNIFIED IDEOGRAPH +0xE2B6 0x7CB9 #CJK UNIFIED IDEOGRAPH +0xE2B7 0x7D8F #CJK UNIFIED IDEOGRAPH +0xE2B8 0x7DAC #CJK UNIFIED IDEOGRAPH +0xE2B9 0x7E61 #CJK UNIFIED IDEOGRAPH +0xE2BA 0x7F9E #CJK UNIFIED IDEOGRAPH +0xE2BB 0x8129 #CJK UNIFIED IDEOGRAPH +0xE2BC 0x8331 #CJK UNIFIED IDEOGRAPH +0xE2BD 0x8490 #CJK UNIFIED IDEOGRAPH +0xE2BE 0x84DA #CJK UNIFIED IDEOGRAPH +0xE2BF 0x85EA #CJK UNIFIED IDEOGRAPH +0xE2C0 0x8896 #CJK UNIFIED IDEOGRAPH +0xE2C1 0x8AB0 #CJK UNIFIED IDEOGRAPH +0xE2C2 0x8B90 #CJK UNIFIED IDEOGRAPH +0xE2C3 0x8F38 #CJK UNIFIED IDEOGRAPH +0xE2C4 0x9042 #CJK UNIFIED IDEOGRAPH +0xE2C5 0x9083 #CJK UNIFIED IDEOGRAPH +0xE2C6 0x916C #CJK UNIFIED IDEOGRAPH +0xE2C7 0x9296 #CJK UNIFIED IDEOGRAPH +0xE2C8 0x92B9 #CJK UNIFIED IDEOGRAPH +0xE2C9 0x968B #CJK UNIFIED IDEOGRAPH +0xE2CA 0x96A7 #CJK UNIFIED IDEOGRAPH +0xE2CB 0x96A8 #CJK UNIFIED IDEOGRAPH +0xE2CC 0x96D6 #CJK UNIFIED IDEOGRAPH +0xE2CD 0x9700 #CJK UNIFIED IDEOGRAPH +0xE2CE 0x9808 #CJK UNIFIED IDEOGRAPH +0xE2CF 0x9996 #CJK UNIFIED IDEOGRAPH +0xE2D0 0x9AD3 #CJK UNIFIED IDEOGRAPH +0xE2D1 0x9B1A #CJK UNIFIED IDEOGRAPH +0xE2D2 0x53D4 #CJK UNIFIED IDEOGRAPH +0xE2D3 0x587E #CJK UNIFIED IDEOGRAPH +0xE2D4 0x5919 #CJK UNIFIED IDEOGRAPH +0xE2D5 0x5B70 #CJK UNIFIED IDEOGRAPH +0xE2D6 0x5BBF #CJK UNIFIED IDEOGRAPH +0xE2D7 0x6DD1 #CJK UNIFIED IDEOGRAPH +0xE2D8 0x6F5A #CJK UNIFIED IDEOGRAPH +0xE2D9 0x719F #CJK UNIFIED IDEOGRAPH +0xE2DA 0x7421 #CJK UNIFIED IDEOGRAPH +0xE2DB 0x74B9 #CJK UNIFIED IDEOGRAPH +0xE2DC 0x8085 #CJK UNIFIED IDEOGRAPH +0xE2DD 0x83FD #CJK UNIFIED IDEOGRAPH +0xE2DE 0x5DE1 #CJK UNIFIED IDEOGRAPH +0xE2DF 0x5F87 #CJK UNIFIED IDEOGRAPH +0xE2E0 0x5FAA #CJK UNIFIED IDEOGRAPH +0xE2E1 0x6042 #CJK UNIFIED IDEOGRAPH +0xE2E2 0x65EC #CJK UNIFIED IDEOGRAPH +0xE2E3 0x6812 #CJK UNIFIED IDEOGRAPH +0xE2E4 0x696F #CJK UNIFIED IDEOGRAPH +0xE2E5 0x6A53 #CJK UNIFIED IDEOGRAPH +0xE2E6 0x6B89 #CJK UNIFIED IDEOGRAPH +0xE2E7 0x6D35 #CJK UNIFIED IDEOGRAPH +0xE2E8 0x6DF3 #CJK UNIFIED IDEOGRAPH +0xE2E9 0x73E3 #CJK UNIFIED IDEOGRAPH +0xE2EA 0x76FE #CJK UNIFIED IDEOGRAPH +0xE2EB 0x77AC #CJK UNIFIED IDEOGRAPH +0xE2EC 0x7B4D #CJK UNIFIED IDEOGRAPH +0xE2ED 0x7D14 #CJK UNIFIED IDEOGRAPH +0xE2EE 0x8123 #CJK UNIFIED IDEOGRAPH +0xE2EF 0x821C #CJK UNIFIED IDEOGRAPH +0xE2F0 0x8340 #CJK UNIFIED IDEOGRAPH +0xE2F1 0x84F4 #CJK UNIFIED IDEOGRAPH +0xE2F2 0x8563 #CJK UNIFIED IDEOGRAPH +0xE2F3 0x8A62 #CJK UNIFIED IDEOGRAPH +0xE2F4 0x8AC4 #CJK UNIFIED IDEOGRAPH +0xE2F5 0x9187 #CJK UNIFIED IDEOGRAPH +0xE2F6 0x931E #CJK UNIFIED IDEOGRAPH +0xE2F7 0x9806 #CJK UNIFIED IDEOGRAPH +0xE2F8 0x99B4 #CJK UNIFIED IDEOGRAPH +0xE2F9 0x620C #CJK UNIFIED IDEOGRAPH +0xE2FA 0x8853 #CJK UNIFIED IDEOGRAPH +0xE2FB 0x8FF0 #CJK UNIFIED IDEOGRAPH +0xE2FC 0x9265 #CJK UNIFIED IDEOGRAPH +0xE2FD 0x5D07 #CJK UNIFIED IDEOGRAPH +0xE2FE 0x5D27 #CJK UNIFIED IDEOGRAPH +0xE3A1 0x5D69 #CJK UNIFIED IDEOGRAPH +0xE3A2 0x745F #CJK UNIFIED IDEOGRAPH +0xE3A3 0x819D #CJK UNIFIED IDEOGRAPH +0xE3A4 0x8768 #CJK UNIFIED IDEOGRAPH +0xE3A5 0x6FD5 #CJK UNIFIED IDEOGRAPH +0xE3A6 0x62FE #CJK UNIFIED IDEOGRAPH +0xE3A7 0x7FD2 #CJK UNIFIED IDEOGRAPH +0xE3A8 0x8936 #CJK UNIFIED IDEOGRAPH +0xE3A9 0x8972 #CJK UNIFIED IDEOGRAPH +0xE3AA 0x4E1E #CJK UNIFIED IDEOGRAPH +0xE3AB 0x4E58 #CJK UNIFIED IDEOGRAPH +0xE3AC 0x50E7 #CJK UNIFIED IDEOGRAPH +0xE3AD 0x52DD #CJK UNIFIED IDEOGRAPH +0xE3AE 0x5347 #CJK UNIFIED IDEOGRAPH +0xE3AF 0x627F #CJK UNIFIED IDEOGRAPH +0xE3B0 0x6607 #CJK UNIFIED IDEOGRAPH +0xE3B1 0x7E69 #CJK UNIFIED IDEOGRAPH +0xE3B2 0x8805 #CJK UNIFIED IDEOGRAPH +0xE3B3 0x965E #CJK UNIFIED IDEOGRAPH +0xE3B4 0x4F8D #CJK UNIFIED IDEOGRAPH +0xE3B5 0x5319 #CJK UNIFIED IDEOGRAPH +0xE3B6 0x5636 #CJK UNIFIED IDEOGRAPH +0xE3B7 0x59CB #CJK UNIFIED IDEOGRAPH +0xE3B8 0x5AA4 #CJK UNIFIED IDEOGRAPH +0xE3B9 0x5C38 #CJK UNIFIED IDEOGRAPH +0xE3BA 0x5C4E #CJK UNIFIED IDEOGRAPH +0xE3BB 0x5C4D #CJK UNIFIED IDEOGRAPH +0xE3BC 0x5E02 #CJK UNIFIED IDEOGRAPH +0xE3BD 0x5F11 #CJK UNIFIED IDEOGRAPH +0xE3BE 0x6043 #CJK UNIFIED IDEOGRAPH +0xE3BF 0x65BD #CJK UNIFIED IDEOGRAPH +0xE3C0 0x662F #CJK UNIFIED IDEOGRAPH +0xE3C1 0x6642 #CJK UNIFIED IDEOGRAPH +0xE3C2 0x67BE #CJK UNIFIED IDEOGRAPH +0xE3C3 0x67F4 #CJK UNIFIED IDEOGRAPH +0xE3C4 0x731C #CJK UNIFIED IDEOGRAPH +0xE3C5 0x77E2 #CJK UNIFIED IDEOGRAPH +0xE3C6 0x793A #CJK UNIFIED IDEOGRAPH +0xE3C7 0x7FC5 #CJK UNIFIED IDEOGRAPH +0xE3C8 0x8494 #CJK UNIFIED IDEOGRAPH +0xE3C9 0x84CD #CJK UNIFIED IDEOGRAPH +0xE3CA 0x8996 #CJK UNIFIED IDEOGRAPH +0xE3CB 0x8A66 #CJK UNIFIED IDEOGRAPH +0xE3CC 0x8A69 #CJK UNIFIED IDEOGRAPH +0xE3CD 0x8AE1 #CJK UNIFIED IDEOGRAPH +0xE3CE 0x8C55 #CJK UNIFIED IDEOGRAPH +0xE3CF 0x8C7A #CJK UNIFIED IDEOGRAPH +0xE3D0 0x57F4 #CJK UNIFIED IDEOGRAPH +0xE3D1 0x5BD4 #CJK UNIFIED IDEOGRAPH +0xE3D2 0x5F0F #CJK UNIFIED IDEOGRAPH +0xE3D3 0x606F #CJK UNIFIED IDEOGRAPH +0xE3D4 0x62ED #CJK UNIFIED IDEOGRAPH +0xE3D5 0x690D #CJK UNIFIED IDEOGRAPH +0xE3D6 0x6B96 #CJK UNIFIED IDEOGRAPH +0xE3D7 0x6E5C #CJK UNIFIED IDEOGRAPH +0xE3D8 0x7184 #CJK UNIFIED IDEOGRAPH +0xE3D9 0x7BD2 #CJK UNIFIED IDEOGRAPH +0xE3DA 0x8755 #CJK UNIFIED IDEOGRAPH +0xE3DB 0x8B58 #CJK UNIFIED IDEOGRAPH +0xE3DC 0x8EFE #CJK UNIFIED IDEOGRAPH +0xE3DD 0x98DF #CJK UNIFIED IDEOGRAPH +0xE3DE 0x98FE #CJK UNIFIED IDEOGRAPH +0xE3DF 0x4F38 #CJK UNIFIED IDEOGRAPH +0xE3E0 0x4F81 #CJK UNIFIED IDEOGRAPH +0xE3E1 0x4FE1 #CJK UNIFIED IDEOGRAPH +0xE3E2 0x547B #CJK UNIFIED IDEOGRAPH +0xE3E3 0x5A20 #CJK UNIFIED IDEOGRAPH +0xE3E4 0x5BB8 #CJK UNIFIED IDEOGRAPH +0xE3E5 0x613C #CJK UNIFIED IDEOGRAPH +0xE3E6 0x65B0 #CJK UNIFIED IDEOGRAPH +0xE3E7 0x6668 #CJK UNIFIED IDEOGRAPH +0xE3E8 0x71FC #CJK UNIFIED IDEOGRAPH +0xE3E9 0x7533 #CJK UNIFIED IDEOGRAPH +0xE3EA 0x795E #CJK UNIFIED IDEOGRAPH +0xE3EB 0x7D33 #CJK UNIFIED IDEOGRAPH +0xE3EC 0x814E #CJK UNIFIED IDEOGRAPH +0xE3ED 0x81E3 #CJK UNIFIED IDEOGRAPH +0xE3EE 0x8398 #CJK UNIFIED IDEOGRAPH +0xE3EF 0x85AA #CJK UNIFIED IDEOGRAPH +0xE3F0 0x85CE #CJK UNIFIED IDEOGRAPH +0xE3F1 0x8703 #CJK UNIFIED IDEOGRAPH +0xE3F2 0x8A0A #CJK UNIFIED IDEOGRAPH +0xE3F3 0x8EAB #CJK UNIFIED IDEOGRAPH +0xE3F4 0x8F9B #CJK UNIFIED IDEOGRAPH +0xE3F5 0xF971 #CJK COMPATIBILITY IDEOGRAPH +0xE3F6 0x8FC5 #CJK UNIFIED IDEOGRAPH +0xE3F7 0x5931 #CJK UNIFIED IDEOGRAPH +0xE3F8 0x5BA4 #CJK UNIFIED IDEOGRAPH +0xE3F9 0x5BE6 #CJK UNIFIED IDEOGRAPH +0xE3FA 0x6089 #CJK UNIFIED IDEOGRAPH +0xE3FB 0x5BE9 #CJK UNIFIED IDEOGRAPH +0xE3FC 0x5C0B #CJK UNIFIED IDEOGRAPH +0xE3FD 0x5FC3 #CJK UNIFIED IDEOGRAPH +0xE3FE 0x6C81 #CJK UNIFIED IDEOGRAPH +0xE4A1 0xF972 #CJK COMPATIBILITY IDEOGRAPH +0xE4A2 0x6DF1 #CJK UNIFIED IDEOGRAPH +0xE4A3 0x700B #CJK UNIFIED IDEOGRAPH +0xE4A4 0x751A #CJK UNIFIED IDEOGRAPH +0xE4A5 0x82AF #CJK UNIFIED IDEOGRAPH +0xE4A6 0x8AF6 #CJK UNIFIED IDEOGRAPH +0xE4A7 0x4EC0 #CJK UNIFIED IDEOGRAPH +0xE4A8 0x5341 #CJK UNIFIED IDEOGRAPH +0xE4A9 0xF973 #CJK COMPATIBILITY IDEOGRAPH +0xE4AA 0x96D9 #CJK UNIFIED IDEOGRAPH +0xE4AB 0x6C0F #CJK UNIFIED IDEOGRAPH +0xE4AC 0x4E9E #CJK UNIFIED IDEOGRAPH +0xE4AD 0x4FC4 #CJK UNIFIED IDEOGRAPH +0xE4AE 0x5152 #CJK UNIFIED IDEOGRAPH +0xE4AF 0x555E #CJK UNIFIED IDEOGRAPH +0xE4B0 0x5A25 #CJK UNIFIED IDEOGRAPH +0xE4B1 0x5CE8 #CJK UNIFIED IDEOGRAPH +0xE4B2 0x6211 #CJK UNIFIED IDEOGRAPH +0xE4B3 0x7259 #CJK UNIFIED IDEOGRAPH +0xE4B4 0x82BD #CJK UNIFIED IDEOGRAPH +0xE4B5 0x83AA #CJK UNIFIED IDEOGRAPH +0xE4B6 0x86FE #CJK UNIFIED IDEOGRAPH +0xE4B7 0x8859 #CJK UNIFIED IDEOGRAPH +0xE4B8 0x8A1D #CJK UNIFIED IDEOGRAPH +0xE4B9 0x963F #CJK UNIFIED IDEOGRAPH +0xE4BA 0x96C5 #CJK UNIFIED IDEOGRAPH +0xE4BB 0x9913 #CJK UNIFIED IDEOGRAPH +0xE4BC 0x9D09 #CJK UNIFIED IDEOGRAPH +0xE4BD 0x9D5D #CJK UNIFIED IDEOGRAPH +0xE4BE 0x580A #CJK UNIFIED IDEOGRAPH +0xE4BF 0x5CB3 #CJK UNIFIED IDEOGRAPH +0xE4C0 0x5DBD #CJK UNIFIED IDEOGRAPH +0xE4C1 0x5E44 #CJK UNIFIED IDEOGRAPH +0xE4C2 0x60E1 #CJK UNIFIED IDEOGRAPH +0xE4C3 0x6115 #CJK UNIFIED IDEOGRAPH +0xE4C4 0x63E1 #CJK UNIFIED IDEOGRAPH +0xE4C5 0x6A02 #CJK UNIFIED IDEOGRAPH +0xE4C6 0x6E25 #CJK UNIFIED IDEOGRAPH +0xE4C7 0x9102 #CJK UNIFIED IDEOGRAPH +0xE4C8 0x9354 #CJK UNIFIED IDEOGRAPH +0xE4C9 0x984E #CJK UNIFIED IDEOGRAPH +0xE4CA 0x9C10 #CJK UNIFIED IDEOGRAPH +0xE4CB 0x9F77 #CJK UNIFIED IDEOGRAPH +0xE4CC 0x5B89 #CJK UNIFIED IDEOGRAPH +0xE4CD 0x5CB8 #CJK UNIFIED IDEOGRAPH +0xE4CE 0x6309 #CJK UNIFIED IDEOGRAPH +0xE4CF 0x664F #CJK UNIFIED IDEOGRAPH +0xE4D0 0x6848 #CJK UNIFIED IDEOGRAPH +0xE4D1 0x773C #CJK UNIFIED IDEOGRAPH +0xE4D2 0x96C1 #CJK UNIFIED IDEOGRAPH +0xE4D3 0x978D #CJK UNIFIED IDEOGRAPH +0xE4D4 0x9854 #CJK UNIFIED IDEOGRAPH +0xE4D5 0x9B9F #CJK UNIFIED IDEOGRAPH +0xE4D6 0x65A1 #CJK UNIFIED IDEOGRAPH +0xE4D7 0x8B01 #CJK UNIFIED IDEOGRAPH +0xE4D8 0x8ECB #CJK UNIFIED IDEOGRAPH +0xE4D9 0x95BC #CJK UNIFIED IDEOGRAPH +0xE4DA 0x5535 #CJK UNIFIED IDEOGRAPH +0xE4DB 0x5CA9 #CJK UNIFIED IDEOGRAPH +0xE4DC 0x5DD6 #CJK UNIFIED IDEOGRAPH +0xE4DD 0x5EB5 #CJK UNIFIED IDEOGRAPH +0xE4DE 0x6697 #CJK UNIFIED IDEOGRAPH +0xE4DF 0x764C #CJK UNIFIED IDEOGRAPH +0xE4E0 0x83F4 #CJK UNIFIED IDEOGRAPH +0xE4E1 0x95C7 #CJK UNIFIED IDEOGRAPH +0xE4E2 0x58D3 #CJK UNIFIED IDEOGRAPH +0xE4E3 0x62BC #CJK UNIFIED IDEOGRAPH +0xE4E4 0x72CE #CJK UNIFIED IDEOGRAPH +0xE4E5 0x9D28 #CJK UNIFIED IDEOGRAPH +0xE4E6 0x4EF0 #CJK UNIFIED IDEOGRAPH +0xE4E7 0x592E #CJK UNIFIED IDEOGRAPH +0xE4E8 0x600F #CJK UNIFIED IDEOGRAPH +0xE4E9 0x663B #CJK UNIFIED IDEOGRAPH +0xE4EA 0x6B83 #CJK UNIFIED IDEOGRAPH +0xE4EB 0x79E7 #CJK UNIFIED IDEOGRAPH +0xE4EC 0x9D26 #CJK UNIFIED IDEOGRAPH +0xE4ED 0x5393 #CJK UNIFIED IDEOGRAPH +0xE4EE 0x54C0 #CJK UNIFIED IDEOGRAPH +0xE4EF 0x57C3 #CJK UNIFIED IDEOGRAPH +0xE4F0 0x5D16 #CJK UNIFIED IDEOGRAPH +0xE4F1 0x611B #CJK UNIFIED IDEOGRAPH +0xE4F2 0x66D6 #CJK UNIFIED IDEOGRAPH +0xE4F3 0x6DAF #CJK UNIFIED IDEOGRAPH +0xE4F4 0x788D #CJK UNIFIED IDEOGRAPH +0xE4F5 0x827E #CJK UNIFIED IDEOGRAPH +0xE4F6 0x9698 #CJK UNIFIED IDEOGRAPH +0xE4F7 0x9744 #CJK UNIFIED IDEOGRAPH +0xE4F8 0x5384 #CJK UNIFIED IDEOGRAPH +0xE4F9 0x627C #CJK UNIFIED IDEOGRAPH +0xE4FA 0x6396 #CJK UNIFIED IDEOGRAPH +0xE4FB 0x6DB2 #CJK UNIFIED IDEOGRAPH +0xE4FC 0x7E0A #CJK UNIFIED IDEOGRAPH +0xE4FD 0x814B #CJK UNIFIED IDEOGRAPH +0xE4FE 0x984D #CJK UNIFIED IDEOGRAPH +0xE5A1 0x6AFB #CJK UNIFIED IDEOGRAPH +0xE5A2 0x7F4C #CJK UNIFIED IDEOGRAPH +0xE5A3 0x9DAF #CJK UNIFIED IDEOGRAPH +0xE5A4 0x9E1A #CJK UNIFIED IDEOGRAPH +0xE5A5 0x4E5F #CJK UNIFIED IDEOGRAPH +0xE5A6 0x503B #CJK UNIFIED IDEOGRAPH +0xE5A7 0x51B6 #CJK UNIFIED IDEOGRAPH +0xE5A8 0x591C #CJK UNIFIED IDEOGRAPH +0xE5A9 0x60F9 #CJK UNIFIED IDEOGRAPH +0xE5AA 0x63F6 #CJK UNIFIED IDEOGRAPH +0xE5AB 0x6930 #CJK UNIFIED IDEOGRAPH +0xE5AC 0x723A #CJK UNIFIED IDEOGRAPH +0xE5AD 0x8036 #CJK UNIFIED IDEOGRAPH +0xE5AE 0xF974 #CJK COMPATIBILITY IDEOGRAPH +0xE5AF 0x91CE #CJK UNIFIED IDEOGRAPH +0xE5B0 0x5F31 #CJK UNIFIED IDEOGRAPH +0xE5B1 0xF975 #CJK COMPATIBILITY IDEOGRAPH +0xE5B2 0xF976 #CJK COMPATIBILITY IDEOGRAPH +0xE5B3 0x7D04 #CJK UNIFIED IDEOGRAPH +0xE5B4 0x82E5 #CJK UNIFIED IDEOGRAPH +0xE5B5 0x846F #CJK UNIFIED IDEOGRAPH +0xE5B6 0x84BB #CJK UNIFIED IDEOGRAPH +0xE5B7 0x85E5 #CJK UNIFIED IDEOGRAPH +0xE5B8 0x8E8D #CJK UNIFIED IDEOGRAPH +0xE5B9 0xF977 #CJK COMPATIBILITY IDEOGRAPH +0xE5BA 0x4F6F #CJK UNIFIED IDEOGRAPH +0xE5BB 0xF978 #CJK COMPATIBILITY IDEOGRAPH +0xE5BC 0xF979 #CJK COMPATIBILITY IDEOGRAPH +0xE5BD 0x58E4 #CJK UNIFIED IDEOGRAPH +0xE5BE 0x5B43 #CJK UNIFIED IDEOGRAPH +0xE5BF 0x6059 #CJK UNIFIED IDEOGRAPH +0xE5C0 0x63DA #CJK UNIFIED IDEOGRAPH +0xE5C1 0x6518 #CJK UNIFIED IDEOGRAPH +0xE5C2 0x656D #CJK UNIFIED IDEOGRAPH +0xE5C3 0x6698 #CJK UNIFIED IDEOGRAPH +0xE5C4 0xF97A #CJK COMPATIBILITY IDEOGRAPH +0xE5C5 0x694A #CJK UNIFIED IDEOGRAPH +0xE5C6 0x6A23 #CJK UNIFIED IDEOGRAPH +0xE5C7 0x6D0B #CJK UNIFIED IDEOGRAPH +0xE5C8 0x7001 #CJK UNIFIED IDEOGRAPH +0xE5C9 0x716C #CJK UNIFIED IDEOGRAPH +0xE5CA 0x75D2 #CJK UNIFIED IDEOGRAPH +0xE5CB 0x760D #CJK UNIFIED IDEOGRAPH +0xE5CC 0x79B3 #CJK UNIFIED IDEOGRAPH +0xE5CD 0x7A70 #CJK UNIFIED IDEOGRAPH +0xE5CE 0xF97B #CJK COMPATIBILITY IDEOGRAPH +0xE5CF 0x7F8A #CJK UNIFIED IDEOGRAPH +0xE5D0 0xF97C #CJK COMPATIBILITY IDEOGRAPH +0xE5D1 0x8944 #CJK UNIFIED IDEOGRAPH +0xE5D2 0xF97D #CJK COMPATIBILITY IDEOGRAPH +0xE5D3 0x8B93 #CJK UNIFIED IDEOGRAPH +0xE5D4 0x91C0 #CJK UNIFIED IDEOGRAPH +0xE5D5 0x967D #CJK UNIFIED IDEOGRAPH +0xE5D6 0xF97E #CJK COMPATIBILITY IDEOGRAPH +0xE5D7 0x990A #CJK UNIFIED IDEOGRAPH +0xE5D8 0x5704 #CJK UNIFIED IDEOGRAPH +0xE5D9 0x5FA1 #CJK UNIFIED IDEOGRAPH +0xE5DA 0x65BC #CJK UNIFIED IDEOGRAPH +0xE5DB 0x6F01 #CJK UNIFIED IDEOGRAPH +0xE5DC 0x7600 #CJK UNIFIED IDEOGRAPH +0xE5DD 0x79A6 #CJK UNIFIED IDEOGRAPH +0xE5DE 0x8A9E #CJK UNIFIED IDEOGRAPH +0xE5DF 0x99AD #CJK UNIFIED IDEOGRAPH +0xE5E0 0x9B5A #CJK UNIFIED IDEOGRAPH +0xE5E1 0x9F6C #CJK UNIFIED IDEOGRAPH +0xE5E2 0x5104 #CJK UNIFIED IDEOGRAPH +0xE5E3 0x61B6 #CJK UNIFIED IDEOGRAPH +0xE5E4 0x6291 #CJK UNIFIED IDEOGRAPH +0xE5E5 0x6A8D #CJK UNIFIED IDEOGRAPH +0xE5E6 0x81C6 #CJK UNIFIED IDEOGRAPH +0xE5E7 0x5043 #CJK UNIFIED IDEOGRAPH +0xE5E8 0x5830 #CJK UNIFIED IDEOGRAPH +0xE5E9 0x5F66 #CJK UNIFIED IDEOGRAPH +0xE5EA 0x7109 #CJK UNIFIED IDEOGRAPH +0xE5EB 0x8A00 #CJK UNIFIED IDEOGRAPH +0xE5EC 0x8AFA #CJK UNIFIED IDEOGRAPH +0xE5ED 0x5B7C #CJK UNIFIED IDEOGRAPH +0xE5EE 0x8616 #CJK UNIFIED IDEOGRAPH +0xE5EF 0x4FFA #CJK UNIFIED IDEOGRAPH +0xE5F0 0x513C #CJK UNIFIED IDEOGRAPH +0xE5F1 0x56B4 #CJK UNIFIED IDEOGRAPH +0xE5F2 0x5944 #CJK UNIFIED IDEOGRAPH +0xE5F3 0x63A9 #CJK UNIFIED IDEOGRAPH +0xE5F4 0x6DF9 #CJK UNIFIED IDEOGRAPH +0xE5F5 0x5DAA #CJK UNIFIED IDEOGRAPH +0xE5F6 0x696D #CJK UNIFIED IDEOGRAPH +0xE5F7 0x5186 #CJK UNIFIED IDEOGRAPH +0xE5F8 0x4E88 #CJK UNIFIED IDEOGRAPH +0xE5F9 0x4F59 #CJK UNIFIED IDEOGRAPH +0xE5FA 0xF97F #CJK COMPATIBILITY IDEOGRAPH +0xE5FB 0xF980 #CJK COMPATIBILITY IDEOGRAPH +0xE5FC 0xF981 #CJK COMPATIBILITY IDEOGRAPH +0xE5FD 0x5982 #CJK UNIFIED IDEOGRAPH +0xE5FE 0xF982 #CJK COMPATIBILITY IDEOGRAPH +0xE6A1 0xF983 #CJK COMPATIBILITY IDEOGRAPH +0xE6A2 0x6B5F #CJK UNIFIED IDEOGRAPH +0xE6A3 0x6C5D #CJK UNIFIED IDEOGRAPH +0xE6A4 0xF984 #CJK COMPATIBILITY IDEOGRAPH +0xE6A5 0x74B5 #CJK UNIFIED IDEOGRAPH +0xE6A6 0x7916 #CJK UNIFIED IDEOGRAPH +0xE6A7 0xF985 #CJK COMPATIBILITY IDEOGRAPH +0xE6A8 0x8207 #CJK UNIFIED IDEOGRAPH +0xE6A9 0x8245 #CJK UNIFIED IDEOGRAPH +0xE6AA 0x8339 #CJK UNIFIED IDEOGRAPH +0xE6AB 0x8F3F #CJK UNIFIED IDEOGRAPH +0xE6AC 0x8F5D #CJK UNIFIED IDEOGRAPH +0xE6AD 0xF986 #CJK COMPATIBILITY IDEOGRAPH +0xE6AE 0x9918 #CJK UNIFIED IDEOGRAPH +0xE6AF 0xF987 #CJK COMPATIBILITY IDEOGRAPH +0xE6B0 0xF988 #CJK COMPATIBILITY IDEOGRAPH +0xE6B1 0xF989 #CJK COMPATIBILITY IDEOGRAPH +0xE6B2 0x4EA6 #CJK UNIFIED IDEOGRAPH +0xE6B3 0xF98A #CJK COMPATIBILITY IDEOGRAPH +0xE6B4 0x57DF #CJK UNIFIED IDEOGRAPH +0xE6B5 0x5F79 #CJK UNIFIED IDEOGRAPH +0xE6B6 0x6613 #CJK UNIFIED IDEOGRAPH +0xE6B7 0xF98B #CJK COMPATIBILITY IDEOGRAPH +0xE6B8 0xF98C #CJK COMPATIBILITY IDEOGRAPH +0xE6B9 0x75AB #CJK UNIFIED IDEOGRAPH +0xE6BA 0x7E79 #CJK UNIFIED IDEOGRAPH +0xE6BB 0x8B6F #CJK UNIFIED IDEOGRAPH +0xE6BC 0xF98D #CJK COMPATIBILITY IDEOGRAPH +0xE6BD 0x9006 #CJK UNIFIED IDEOGRAPH +0xE6BE 0x9A5B #CJK UNIFIED IDEOGRAPH +0xE6BF 0x56A5 #CJK UNIFIED IDEOGRAPH +0xE6C0 0x5827 #CJK UNIFIED IDEOGRAPH +0xE6C1 0x59F8 #CJK UNIFIED IDEOGRAPH +0xE6C2 0x5A1F #CJK UNIFIED IDEOGRAPH +0xE6C3 0x5BB4 #CJK UNIFIED IDEOGRAPH +0xE6C4 0xF98E #CJK COMPATIBILITY IDEOGRAPH +0xE6C5 0x5EF6 #CJK UNIFIED IDEOGRAPH +0xE6C6 0xF98F #CJK COMPATIBILITY IDEOGRAPH +0xE6C7 0xF990 #CJK COMPATIBILITY IDEOGRAPH +0xE6C8 0x6350 #CJK UNIFIED IDEOGRAPH +0xE6C9 0x633B #CJK UNIFIED IDEOGRAPH +0xE6CA 0xF991 #CJK COMPATIBILITY IDEOGRAPH +0xE6CB 0x693D #CJK UNIFIED IDEOGRAPH +0xE6CC 0x6C87 #CJK UNIFIED IDEOGRAPH +0xE6CD 0x6CBF #CJK UNIFIED IDEOGRAPH +0xE6CE 0x6D8E #CJK UNIFIED IDEOGRAPH +0xE6CF 0x6D93 #CJK UNIFIED IDEOGRAPH +0xE6D0 0x6DF5 #CJK UNIFIED IDEOGRAPH +0xE6D1 0x6F14 #CJK UNIFIED IDEOGRAPH +0xE6D2 0xF992 #CJK COMPATIBILITY IDEOGRAPH +0xE6D3 0x70DF #CJK UNIFIED IDEOGRAPH +0xE6D4 0x7136 #CJK UNIFIED IDEOGRAPH +0xE6D5 0x7159 #CJK UNIFIED IDEOGRAPH +0xE6D6 0xF993 #CJK COMPATIBILITY IDEOGRAPH +0xE6D7 0x71C3 #CJK UNIFIED IDEOGRAPH +0xE6D8 0x71D5 #CJK UNIFIED IDEOGRAPH +0xE6D9 0xF994 #CJK COMPATIBILITY IDEOGRAPH +0xE6DA 0x784F #CJK UNIFIED IDEOGRAPH +0xE6DB 0x786F #CJK UNIFIED IDEOGRAPH +0xE6DC 0xF995 #CJK COMPATIBILITY IDEOGRAPH +0xE6DD 0x7B75 #CJK UNIFIED IDEOGRAPH +0xE6DE 0x7DE3 #CJK UNIFIED IDEOGRAPH +0xE6DF 0xF996 #CJK COMPATIBILITY IDEOGRAPH +0xE6E0 0x7E2F #CJK UNIFIED IDEOGRAPH +0xE6E1 0xF997 #CJK COMPATIBILITY IDEOGRAPH +0xE6E2 0x884D #CJK UNIFIED IDEOGRAPH +0xE6E3 0x8EDF #CJK UNIFIED IDEOGRAPH +0xE6E4 0xF998 #CJK COMPATIBILITY IDEOGRAPH +0xE6E5 0xF999 #CJK COMPATIBILITY IDEOGRAPH +0xE6E6 0xF99A #CJK COMPATIBILITY IDEOGRAPH +0xE6E7 0x925B #CJK UNIFIED IDEOGRAPH +0xE6E8 0xF99B #CJK COMPATIBILITY IDEOGRAPH +0xE6E9 0x9CF6 #CJK UNIFIED IDEOGRAPH +0xE6EA 0xF99C #CJK COMPATIBILITY IDEOGRAPH +0xE6EB 0xF99D #CJK COMPATIBILITY IDEOGRAPH +0xE6EC 0xF99E #CJK COMPATIBILITY IDEOGRAPH +0xE6ED 0x6085 #CJK UNIFIED IDEOGRAPH +0xE6EE 0x6D85 #CJK UNIFIED IDEOGRAPH +0xE6EF 0xF99F #CJK COMPATIBILITY IDEOGRAPH +0xE6F0 0x71B1 #CJK UNIFIED IDEOGRAPH +0xE6F1 0xF9A0 #CJK COMPATIBILITY IDEOGRAPH +0xE6F2 0xF9A1 #CJK COMPATIBILITY IDEOGRAPH +0xE6F3 0x95B1 #CJK UNIFIED IDEOGRAPH +0xE6F4 0x53AD #CJK UNIFIED IDEOGRAPH +0xE6F5 0xF9A2 #CJK COMPATIBILITY IDEOGRAPH +0xE6F6 0xF9A3 #CJK COMPATIBILITY IDEOGRAPH +0xE6F7 0xF9A4 #CJK COMPATIBILITY IDEOGRAPH +0xE6F8 0x67D3 #CJK UNIFIED IDEOGRAPH +0xE6F9 0xF9A5 #CJK COMPATIBILITY IDEOGRAPH +0xE6FA 0x708E #CJK UNIFIED IDEOGRAPH +0xE6FB 0x7130 #CJK UNIFIED IDEOGRAPH +0xE6FC 0x7430 #CJK UNIFIED IDEOGRAPH +0xE6FD 0x8276 #CJK UNIFIED IDEOGRAPH +0xE6FE 0x82D2 #CJK UNIFIED IDEOGRAPH +0xE7A1 0xF9A6 #CJK COMPATIBILITY IDEOGRAPH +0xE7A2 0x95BB #CJK UNIFIED IDEOGRAPH +0xE7A3 0x9AE5 #CJK UNIFIED IDEOGRAPH +0xE7A4 0x9E7D #CJK UNIFIED IDEOGRAPH +0xE7A5 0x66C4 #CJK UNIFIED IDEOGRAPH +0xE7A6 0xF9A7 #CJK COMPATIBILITY IDEOGRAPH +0xE7A7 0x71C1 #CJK UNIFIED IDEOGRAPH +0xE7A8 0x8449 #CJK UNIFIED IDEOGRAPH +0xE7A9 0xF9A8 #CJK COMPATIBILITY IDEOGRAPH +0xE7AA 0xF9A9 #CJK COMPATIBILITY IDEOGRAPH +0xE7AB 0x584B #CJK UNIFIED IDEOGRAPH +0xE7AC 0xF9AA #CJK COMPATIBILITY IDEOGRAPH +0xE7AD 0xF9AB #CJK COMPATIBILITY IDEOGRAPH +0xE7AE 0x5DB8 #CJK UNIFIED IDEOGRAPH +0xE7AF 0x5F71 #CJK UNIFIED IDEOGRAPH +0xE7B0 0xF9AC #CJK COMPATIBILITY IDEOGRAPH +0xE7B1 0x6620 #CJK UNIFIED IDEOGRAPH +0xE7B2 0x668E #CJK UNIFIED IDEOGRAPH +0xE7B3 0x6979 #CJK UNIFIED IDEOGRAPH +0xE7B4 0x69AE #CJK UNIFIED IDEOGRAPH +0xE7B5 0x6C38 #CJK UNIFIED IDEOGRAPH +0xE7B6 0x6CF3 #CJK UNIFIED IDEOGRAPH +0xE7B7 0x6E36 #CJK UNIFIED IDEOGRAPH +0xE7B8 0x6F41 #CJK UNIFIED IDEOGRAPH +0xE7B9 0x6FDA #CJK UNIFIED IDEOGRAPH +0xE7BA 0x701B #CJK UNIFIED IDEOGRAPH +0xE7BB 0x702F #CJK UNIFIED IDEOGRAPH +0xE7BC 0x7150 #CJK UNIFIED IDEOGRAPH +0xE7BD 0x71DF #CJK UNIFIED IDEOGRAPH +0xE7BE 0x7370 #CJK UNIFIED IDEOGRAPH +0xE7BF 0xF9AD #CJK COMPATIBILITY IDEOGRAPH +0xE7C0 0x745B #CJK UNIFIED IDEOGRAPH +0xE7C1 0xF9AE #CJK COMPATIBILITY IDEOGRAPH +0xE7C2 0x74D4 #CJK UNIFIED IDEOGRAPH +0xE7C3 0x76C8 #CJK UNIFIED IDEOGRAPH +0xE7C4 0x7A4E #CJK UNIFIED IDEOGRAPH +0xE7C5 0x7E93 #CJK UNIFIED IDEOGRAPH +0xE7C6 0xF9AF #CJK COMPATIBILITY IDEOGRAPH +0xE7C7 0xF9B0 #CJK COMPATIBILITY IDEOGRAPH +0xE7C8 0x82F1 #CJK UNIFIED IDEOGRAPH +0xE7C9 0x8A60 #CJK UNIFIED IDEOGRAPH +0xE7CA 0x8FCE #CJK UNIFIED IDEOGRAPH +0xE7CB 0xF9B1 #CJK COMPATIBILITY IDEOGRAPH +0xE7CC 0x9348 #CJK UNIFIED IDEOGRAPH +0xE7CD 0xF9B2 #CJK COMPATIBILITY IDEOGRAPH +0xE7CE 0x9719 #CJK UNIFIED IDEOGRAPH +0xE7CF 0xF9B3 #CJK COMPATIBILITY IDEOGRAPH +0xE7D0 0xF9B4 #CJK COMPATIBILITY IDEOGRAPH +0xE7D1 0x4E42 #CJK UNIFIED IDEOGRAPH +0xE7D2 0x502A #CJK UNIFIED IDEOGRAPH +0xE7D3 0xF9B5 #CJK COMPATIBILITY IDEOGRAPH +0xE7D4 0x5208 #CJK UNIFIED IDEOGRAPH +0xE7D5 0x53E1 #CJK UNIFIED IDEOGRAPH +0xE7D6 0x66F3 #CJK UNIFIED IDEOGRAPH +0xE7D7 0x6C6D #CJK UNIFIED IDEOGRAPH +0xE7D8 0x6FCA #CJK UNIFIED IDEOGRAPH +0xE7D9 0x730A #CJK UNIFIED IDEOGRAPH +0xE7DA 0x777F #CJK UNIFIED IDEOGRAPH +0xE7DB 0x7A62 #CJK UNIFIED IDEOGRAPH +0xE7DC 0x82AE #CJK UNIFIED IDEOGRAPH +0xE7DD 0x85DD #CJK UNIFIED IDEOGRAPH +0xE7DE 0x8602 #CJK UNIFIED IDEOGRAPH +0xE7DF 0xF9B6 #CJK COMPATIBILITY IDEOGRAPH +0xE7E0 0x88D4 #CJK UNIFIED IDEOGRAPH +0xE7E1 0x8A63 #CJK UNIFIED IDEOGRAPH +0xE7E2 0x8B7D #CJK UNIFIED IDEOGRAPH +0xE7E3 0x8C6B #CJK UNIFIED IDEOGRAPH +0xE7E4 0xF9B7 #CJK COMPATIBILITY IDEOGRAPH +0xE7E5 0x92B3 #CJK UNIFIED IDEOGRAPH +0xE7E6 0xF9B8 #CJK COMPATIBILITY IDEOGRAPH +0xE7E7 0x9713 #CJK UNIFIED IDEOGRAPH +0xE7E8 0x9810 #CJK UNIFIED IDEOGRAPH +0xE7E9 0x4E94 #CJK UNIFIED IDEOGRAPH +0xE7EA 0x4F0D #CJK UNIFIED IDEOGRAPH +0xE7EB 0x4FC9 #CJK UNIFIED IDEOGRAPH +0xE7EC 0x50B2 #CJK UNIFIED IDEOGRAPH +0xE7ED 0x5348 #CJK UNIFIED IDEOGRAPH +0xE7EE 0x543E #CJK UNIFIED IDEOGRAPH +0xE7EF 0x5433 #CJK UNIFIED IDEOGRAPH +0xE7F0 0x55DA #CJK UNIFIED IDEOGRAPH +0xE7F1 0x5862 #CJK UNIFIED IDEOGRAPH +0xE7F2 0x58BA #CJK UNIFIED IDEOGRAPH +0xE7F3 0x5967 #CJK UNIFIED IDEOGRAPH +0xE7F4 0x5A1B #CJK UNIFIED IDEOGRAPH +0xE7F5 0x5BE4 #CJK UNIFIED IDEOGRAPH +0xE7F6 0x609F #CJK UNIFIED IDEOGRAPH +0xE7F7 0xF9B9 #CJK COMPATIBILITY IDEOGRAPH +0xE7F8 0x61CA #CJK UNIFIED IDEOGRAPH +0xE7F9 0x6556 #CJK UNIFIED IDEOGRAPH +0xE7FA 0x65FF #CJK UNIFIED IDEOGRAPH +0xE7FB 0x6664 #CJK UNIFIED IDEOGRAPH +0xE7FC 0x68A7 #CJK UNIFIED IDEOGRAPH +0xE7FD 0x6C5A #CJK UNIFIED IDEOGRAPH +0xE7FE 0x6FB3 #CJK UNIFIED IDEOGRAPH +0xE8A1 0x70CF #CJK UNIFIED IDEOGRAPH +0xE8A2 0x71AC #CJK UNIFIED IDEOGRAPH +0xE8A3 0x7352 #CJK UNIFIED IDEOGRAPH +0xE8A4 0x7B7D #CJK UNIFIED IDEOGRAPH +0xE8A5 0x8708 #CJK UNIFIED IDEOGRAPH +0xE8A6 0x8AA4 #CJK UNIFIED IDEOGRAPH +0xE8A7 0x9C32 #CJK UNIFIED IDEOGRAPH +0xE8A8 0x9F07 #CJK UNIFIED IDEOGRAPH +0xE8A9 0x5C4B #CJK UNIFIED IDEOGRAPH +0xE8AA 0x6C83 #CJK UNIFIED IDEOGRAPH +0xE8AB 0x7344 #CJK UNIFIED IDEOGRAPH +0xE8AC 0x7389 #CJK UNIFIED IDEOGRAPH +0xE8AD 0x923A #CJK UNIFIED IDEOGRAPH +0xE8AE 0x6EAB #CJK UNIFIED IDEOGRAPH +0xE8AF 0x7465 #CJK UNIFIED IDEOGRAPH +0xE8B0 0x761F #CJK UNIFIED IDEOGRAPH +0xE8B1 0x7A69 #CJK UNIFIED IDEOGRAPH +0xE8B2 0x7E15 #CJK UNIFIED IDEOGRAPH +0xE8B3 0x860A #CJK UNIFIED IDEOGRAPH +0xE8B4 0x5140 #CJK UNIFIED IDEOGRAPH +0xE8B5 0x58C5 #CJK UNIFIED IDEOGRAPH +0xE8B6 0x64C1 #CJK UNIFIED IDEOGRAPH +0xE8B7 0x74EE #CJK UNIFIED IDEOGRAPH +0xE8B8 0x7515 #CJK UNIFIED IDEOGRAPH +0xE8B9 0x7670 #CJK UNIFIED IDEOGRAPH +0xE8BA 0x7FC1 #CJK UNIFIED IDEOGRAPH +0xE8BB 0x9095 #CJK UNIFIED IDEOGRAPH +0xE8BC 0x96CD #CJK UNIFIED IDEOGRAPH +0xE8BD 0x9954 #CJK UNIFIED IDEOGRAPH +0xE8BE 0x6E26 #CJK UNIFIED IDEOGRAPH +0xE8BF 0x74E6 #CJK UNIFIED IDEOGRAPH +0xE8C0 0x7AA9 #CJK UNIFIED IDEOGRAPH +0xE8C1 0x7AAA #CJK UNIFIED IDEOGRAPH +0xE8C2 0x81E5 #CJK UNIFIED IDEOGRAPH +0xE8C3 0x86D9 #CJK UNIFIED IDEOGRAPH +0xE8C4 0x8778 #CJK UNIFIED IDEOGRAPH +0xE8C5 0x8A1B #CJK UNIFIED IDEOGRAPH +0xE8C6 0x5A49 #CJK UNIFIED IDEOGRAPH +0xE8C7 0x5B8C #CJK UNIFIED IDEOGRAPH +0xE8C8 0x5B9B #CJK UNIFIED IDEOGRAPH +0xE8C9 0x68A1 #CJK UNIFIED IDEOGRAPH +0xE8CA 0x6900 #CJK UNIFIED IDEOGRAPH +0xE8CB 0x6D63 #CJK UNIFIED IDEOGRAPH +0xE8CC 0x73A9 #CJK UNIFIED IDEOGRAPH +0xE8CD 0x7413 #CJK UNIFIED IDEOGRAPH +0xE8CE 0x742C #CJK UNIFIED IDEOGRAPH +0xE8CF 0x7897 #CJK UNIFIED IDEOGRAPH +0xE8D0 0x7DE9 #CJK UNIFIED IDEOGRAPH +0xE8D1 0x7FEB #CJK UNIFIED IDEOGRAPH +0xE8D2 0x8118 #CJK UNIFIED IDEOGRAPH +0xE8D3 0x8155 #CJK UNIFIED IDEOGRAPH +0xE8D4 0x839E #CJK UNIFIED IDEOGRAPH +0xE8D5 0x8C4C #CJK UNIFIED IDEOGRAPH +0xE8D6 0x962E #CJK UNIFIED IDEOGRAPH +0xE8D7 0x9811 #CJK UNIFIED IDEOGRAPH +0xE8D8 0x66F0 #CJK UNIFIED IDEOGRAPH +0xE8D9 0x5F80 #CJK UNIFIED IDEOGRAPH +0xE8DA 0x65FA #CJK UNIFIED IDEOGRAPH +0xE8DB 0x6789 #CJK UNIFIED IDEOGRAPH +0xE8DC 0x6C6A #CJK UNIFIED IDEOGRAPH +0xE8DD 0x738B #CJK UNIFIED IDEOGRAPH +0xE8DE 0x502D #CJK UNIFIED IDEOGRAPH +0xE8DF 0x5A03 #CJK UNIFIED IDEOGRAPH +0xE8E0 0x6B6A #CJK UNIFIED IDEOGRAPH +0xE8E1 0x77EE #CJK UNIFIED IDEOGRAPH +0xE8E2 0x5916 #CJK UNIFIED IDEOGRAPH +0xE8E3 0x5D6C #CJK UNIFIED IDEOGRAPH +0xE8E4 0x5DCD #CJK UNIFIED IDEOGRAPH +0xE8E5 0x7325 #CJK UNIFIED IDEOGRAPH +0xE8E6 0x754F #CJK UNIFIED IDEOGRAPH +0xE8E7 0xF9BA #CJK COMPATIBILITY IDEOGRAPH +0xE8E8 0xF9BB #CJK COMPATIBILITY IDEOGRAPH +0xE8E9 0x50E5 #CJK UNIFIED IDEOGRAPH +0xE8EA 0x51F9 #CJK UNIFIED IDEOGRAPH +0xE8EB 0x582F #CJK UNIFIED IDEOGRAPH +0xE8EC 0x592D #CJK UNIFIED IDEOGRAPH +0xE8ED 0x5996 #CJK UNIFIED IDEOGRAPH +0xE8EE 0x59DA #CJK UNIFIED IDEOGRAPH +0xE8EF 0x5BE5 #CJK UNIFIED IDEOGRAPH +0xE8F0 0xF9BC #CJK COMPATIBILITY IDEOGRAPH +0xE8F1 0xF9BD #CJK COMPATIBILITY IDEOGRAPH +0xE8F2 0x5DA2 #CJK UNIFIED IDEOGRAPH +0xE8F3 0x62D7 #CJK UNIFIED IDEOGRAPH +0xE8F4 0x6416 #CJK UNIFIED IDEOGRAPH +0xE8F5 0x6493 #CJK UNIFIED IDEOGRAPH +0xE8F6 0x64FE #CJK UNIFIED IDEOGRAPH +0xE8F7 0xF9BE #CJK COMPATIBILITY IDEOGRAPH +0xE8F8 0x66DC #CJK UNIFIED IDEOGRAPH +0xE8F9 0xF9BF #CJK COMPATIBILITY IDEOGRAPH +0xE8FA 0x6A48 #CJK UNIFIED IDEOGRAPH +0xE8FB 0xF9C0 #CJK COMPATIBILITY IDEOGRAPH +0xE8FC 0x71FF #CJK UNIFIED IDEOGRAPH +0xE8FD 0x7464 #CJK UNIFIED IDEOGRAPH +0xE8FE 0xF9C1 #CJK COMPATIBILITY IDEOGRAPH +0xE9A1 0x7A88 #CJK UNIFIED IDEOGRAPH +0xE9A2 0x7AAF #CJK UNIFIED IDEOGRAPH +0xE9A3 0x7E47 #CJK UNIFIED IDEOGRAPH +0xE9A4 0x7E5E #CJK UNIFIED IDEOGRAPH +0xE9A5 0x8000 #CJK UNIFIED IDEOGRAPH +0xE9A6 0x8170 #CJK UNIFIED IDEOGRAPH +0xE9A7 0xF9C2 #CJK COMPATIBILITY IDEOGRAPH +0xE9A8 0x87EF #CJK UNIFIED IDEOGRAPH +0xE9A9 0x8981 #CJK UNIFIED IDEOGRAPH +0xE9AA 0x8B20 #CJK UNIFIED IDEOGRAPH +0xE9AB 0x9059 #CJK UNIFIED IDEOGRAPH +0xE9AC 0xF9C3 #CJK COMPATIBILITY IDEOGRAPH +0xE9AD 0x9080 #CJK UNIFIED IDEOGRAPH +0xE9AE 0x9952 #CJK UNIFIED IDEOGRAPH +0xE9AF 0x617E #CJK UNIFIED IDEOGRAPH +0xE9B0 0x6B32 #CJK UNIFIED IDEOGRAPH +0xE9B1 0x6D74 #CJK UNIFIED IDEOGRAPH +0xE9B2 0x7E1F #CJK UNIFIED IDEOGRAPH +0xE9B3 0x8925 #CJK UNIFIED IDEOGRAPH +0xE9B4 0x8FB1 #CJK UNIFIED IDEOGRAPH +0xE9B5 0x4FD1 #CJK UNIFIED IDEOGRAPH +0xE9B6 0x50AD #CJK UNIFIED IDEOGRAPH +0xE9B7 0x5197 #CJK UNIFIED IDEOGRAPH +0xE9B8 0x52C7 #CJK UNIFIED IDEOGRAPH +0xE9B9 0x57C7 #CJK UNIFIED IDEOGRAPH +0xE9BA 0x5889 #CJK UNIFIED IDEOGRAPH +0xE9BB 0x5BB9 #CJK UNIFIED IDEOGRAPH +0xE9BC 0x5EB8 #CJK UNIFIED IDEOGRAPH +0xE9BD 0x6142 #CJK UNIFIED IDEOGRAPH +0xE9BE 0x6995 #CJK UNIFIED IDEOGRAPH +0xE9BF 0x6D8C #CJK UNIFIED IDEOGRAPH +0xE9C0 0x6E67 #CJK UNIFIED IDEOGRAPH +0xE9C1 0x6EB6 #CJK UNIFIED IDEOGRAPH +0xE9C2 0x7194 #CJK UNIFIED IDEOGRAPH +0xE9C3 0x7462 #CJK UNIFIED IDEOGRAPH +0xE9C4 0x7528 #CJK UNIFIED IDEOGRAPH +0xE9C5 0x752C #CJK UNIFIED IDEOGRAPH +0xE9C6 0x8073 #CJK UNIFIED IDEOGRAPH +0xE9C7 0x8338 #CJK UNIFIED IDEOGRAPH +0xE9C8 0x84C9 #CJK UNIFIED IDEOGRAPH +0xE9C9 0x8E0A #CJK UNIFIED IDEOGRAPH +0xE9CA 0x9394 #CJK UNIFIED IDEOGRAPH +0xE9CB 0x93DE #CJK UNIFIED IDEOGRAPH +0xE9CC 0xF9C4 #CJK COMPATIBILITY IDEOGRAPH +0xE9CD 0x4E8E #CJK UNIFIED IDEOGRAPH +0xE9CE 0x4F51 #CJK UNIFIED IDEOGRAPH +0xE9CF 0x5076 #CJK UNIFIED IDEOGRAPH +0xE9D0 0x512A #CJK UNIFIED IDEOGRAPH +0xE9D1 0x53C8 #CJK UNIFIED IDEOGRAPH +0xE9D2 0x53CB #CJK UNIFIED IDEOGRAPH +0xE9D3 0x53F3 #CJK UNIFIED IDEOGRAPH +0xE9D4 0x5B87 #CJK UNIFIED IDEOGRAPH +0xE9D5 0x5BD3 #CJK UNIFIED IDEOGRAPH +0xE9D6 0x5C24 #CJK UNIFIED IDEOGRAPH +0xE9D7 0x611A #CJK UNIFIED IDEOGRAPH +0xE9D8 0x6182 #CJK UNIFIED IDEOGRAPH +0xE9D9 0x65F4 #CJK UNIFIED IDEOGRAPH +0xE9DA 0x725B #CJK UNIFIED IDEOGRAPH +0xE9DB 0x7397 #CJK UNIFIED IDEOGRAPH +0xE9DC 0x7440 #CJK UNIFIED IDEOGRAPH +0xE9DD 0x76C2 #CJK UNIFIED IDEOGRAPH +0xE9DE 0x7950 #CJK UNIFIED IDEOGRAPH +0xE9DF 0x7991 #CJK UNIFIED IDEOGRAPH +0xE9E0 0x79B9 #CJK UNIFIED IDEOGRAPH +0xE9E1 0x7D06 #CJK UNIFIED IDEOGRAPH +0xE9E2 0x7FBD #CJK UNIFIED IDEOGRAPH +0xE9E3 0x828B #CJK UNIFIED IDEOGRAPH +0xE9E4 0x85D5 #CJK UNIFIED IDEOGRAPH +0xE9E5 0x865E #CJK UNIFIED IDEOGRAPH +0xE9E6 0x8FC2 #CJK UNIFIED IDEOGRAPH +0xE9E7 0x9047 #CJK UNIFIED IDEOGRAPH +0xE9E8 0x90F5 #CJK UNIFIED IDEOGRAPH +0xE9E9 0x91EA #CJK UNIFIED IDEOGRAPH +0xE9EA 0x9685 #CJK UNIFIED IDEOGRAPH +0xE9EB 0x96E8 #CJK UNIFIED IDEOGRAPH +0xE9EC 0x96E9 #CJK UNIFIED IDEOGRAPH +0xE9ED 0x52D6 #CJK UNIFIED IDEOGRAPH +0xE9EE 0x5F67 #CJK UNIFIED IDEOGRAPH +0xE9EF 0x65ED #CJK UNIFIED IDEOGRAPH +0xE9F0 0x6631 #CJK UNIFIED IDEOGRAPH +0xE9F1 0x682F #CJK UNIFIED IDEOGRAPH +0xE9F2 0x715C #CJK UNIFIED IDEOGRAPH +0xE9F3 0x7A36 #CJK UNIFIED IDEOGRAPH +0xE9F4 0x90C1 #CJK UNIFIED IDEOGRAPH +0xE9F5 0x980A #CJK UNIFIED IDEOGRAPH +0xE9F6 0x4E91 #CJK UNIFIED IDEOGRAPH +0xE9F7 0xF9C5 #CJK COMPATIBILITY IDEOGRAPH +0xE9F8 0x6A52 #CJK UNIFIED IDEOGRAPH +0xE9F9 0x6B9E #CJK UNIFIED IDEOGRAPH +0xE9FA 0x6F90 #CJK UNIFIED IDEOGRAPH +0xE9FB 0x7189 #CJK UNIFIED IDEOGRAPH +0xE9FC 0x8018 #CJK UNIFIED IDEOGRAPH +0xE9FD 0x82B8 #CJK UNIFIED IDEOGRAPH +0xE9FE 0x8553 #CJK UNIFIED IDEOGRAPH +0xEAA1 0x904B #CJK UNIFIED IDEOGRAPH +0xEAA2 0x9695 #CJK UNIFIED IDEOGRAPH +0xEAA3 0x96F2 #CJK UNIFIED IDEOGRAPH +0xEAA4 0x97FB #CJK UNIFIED IDEOGRAPH +0xEAA5 0x851A #CJK UNIFIED IDEOGRAPH +0xEAA6 0x9B31 #CJK UNIFIED IDEOGRAPH +0xEAA7 0x4E90 #CJK UNIFIED IDEOGRAPH +0xEAA8 0x718A #CJK UNIFIED IDEOGRAPH +0xEAA9 0x96C4 #CJK UNIFIED IDEOGRAPH +0xEAAA 0x5143 #CJK UNIFIED IDEOGRAPH +0xEAAB 0x539F #CJK UNIFIED IDEOGRAPH +0xEAAC 0x54E1 #CJK UNIFIED IDEOGRAPH +0xEAAD 0x5713 #CJK UNIFIED IDEOGRAPH +0xEAAE 0x5712 #CJK UNIFIED IDEOGRAPH +0xEAAF 0x57A3 #CJK UNIFIED IDEOGRAPH +0xEAB0 0x5A9B #CJK UNIFIED IDEOGRAPH +0xEAB1 0x5AC4 #CJK UNIFIED IDEOGRAPH +0xEAB2 0x5BC3 #CJK UNIFIED IDEOGRAPH +0xEAB3 0x6028 #CJK UNIFIED IDEOGRAPH +0xEAB4 0x613F #CJK UNIFIED IDEOGRAPH +0xEAB5 0x63F4 #CJK UNIFIED IDEOGRAPH +0xEAB6 0x6C85 #CJK UNIFIED IDEOGRAPH +0xEAB7 0x6D39 #CJK UNIFIED IDEOGRAPH +0xEAB8 0x6E72 #CJK UNIFIED IDEOGRAPH +0xEAB9 0x6E90 #CJK UNIFIED IDEOGRAPH +0xEABA 0x7230 #CJK UNIFIED IDEOGRAPH +0xEABB 0x733F #CJK UNIFIED IDEOGRAPH +0xEABC 0x7457 #CJK UNIFIED IDEOGRAPH +0xEABD 0x82D1 #CJK UNIFIED IDEOGRAPH +0xEABE 0x8881 #CJK UNIFIED IDEOGRAPH +0xEABF 0x8F45 #CJK UNIFIED IDEOGRAPH +0xEAC0 0x9060 #CJK UNIFIED IDEOGRAPH +0xEAC1 0xF9C6 #CJK COMPATIBILITY IDEOGRAPH +0xEAC2 0x9662 #CJK UNIFIED IDEOGRAPH +0xEAC3 0x9858 #CJK UNIFIED IDEOGRAPH +0xEAC4 0x9D1B #CJK UNIFIED IDEOGRAPH +0xEAC5 0x6708 #CJK UNIFIED IDEOGRAPH +0xEAC6 0x8D8A #CJK UNIFIED IDEOGRAPH +0xEAC7 0x925E #CJK UNIFIED IDEOGRAPH +0xEAC8 0x4F4D #CJK UNIFIED IDEOGRAPH +0xEAC9 0x5049 #CJK UNIFIED IDEOGRAPH +0xEACA 0x50DE #CJK UNIFIED IDEOGRAPH +0xEACB 0x5371 #CJK UNIFIED IDEOGRAPH +0xEACC 0x570D #CJK UNIFIED IDEOGRAPH +0xEACD 0x59D4 #CJK UNIFIED IDEOGRAPH +0xEACE 0x5A01 #CJK UNIFIED IDEOGRAPH +0xEACF 0x5C09 #CJK UNIFIED IDEOGRAPH +0xEAD0 0x6170 #CJK UNIFIED IDEOGRAPH +0xEAD1 0x6690 #CJK UNIFIED IDEOGRAPH +0xEAD2 0x6E2D #CJK UNIFIED IDEOGRAPH +0xEAD3 0x7232 #CJK UNIFIED IDEOGRAPH +0xEAD4 0x744B #CJK UNIFIED IDEOGRAPH +0xEAD5 0x7DEF #CJK UNIFIED IDEOGRAPH +0xEAD6 0x80C3 #CJK UNIFIED IDEOGRAPH +0xEAD7 0x840E #CJK UNIFIED IDEOGRAPH +0xEAD8 0x8466 #CJK UNIFIED IDEOGRAPH +0xEAD9 0x853F #CJK UNIFIED IDEOGRAPH +0xEADA 0x875F #CJK UNIFIED IDEOGRAPH +0xEADB 0x885B #CJK UNIFIED IDEOGRAPH +0xEADC 0x8918 #CJK UNIFIED IDEOGRAPH +0xEADD 0x8B02 #CJK UNIFIED IDEOGRAPH +0xEADE 0x9055 #CJK UNIFIED IDEOGRAPH +0xEADF 0x97CB #CJK UNIFIED IDEOGRAPH +0xEAE0 0x9B4F #CJK UNIFIED IDEOGRAPH +0xEAE1 0x4E73 #CJK UNIFIED IDEOGRAPH +0xEAE2 0x4F91 #CJK UNIFIED IDEOGRAPH +0xEAE3 0x5112 #CJK UNIFIED IDEOGRAPH +0xEAE4 0x516A #CJK UNIFIED IDEOGRAPH +0xEAE5 0xF9C7 #CJK COMPATIBILITY IDEOGRAPH +0xEAE6 0x552F #CJK UNIFIED IDEOGRAPH +0xEAE7 0x55A9 #CJK UNIFIED IDEOGRAPH +0xEAE8 0x5B7A #CJK UNIFIED IDEOGRAPH +0xEAE9 0x5BA5 #CJK UNIFIED IDEOGRAPH +0xEAEA 0x5E7C #CJK UNIFIED IDEOGRAPH +0xEAEB 0x5E7D #CJK UNIFIED IDEOGRAPH +0xEAEC 0x5EBE #CJK UNIFIED IDEOGRAPH +0xEAED 0x60A0 #CJK UNIFIED IDEOGRAPH +0xEAEE 0x60DF #CJK UNIFIED IDEOGRAPH +0xEAEF 0x6108 #CJK UNIFIED IDEOGRAPH +0xEAF0 0x6109 #CJK UNIFIED IDEOGRAPH +0xEAF1 0x63C4 #CJK UNIFIED IDEOGRAPH +0xEAF2 0x6538 #CJK UNIFIED IDEOGRAPH +0xEAF3 0x6709 #CJK UNIFIED IDEOGRAPH +0xEAF4 0xF9C8 #CJK COMPATIBILITY IDEOGRAPH +0xEAF5 0x67D4 #CJK UNIFIED IDEOGRAPH +0xEAF6 0x67DA #CJK UNIFIED IDEOGRAPH +0xEAF7 0xF9C9 #CJK COMPATIBILITY IDEOGRAPH +0xEAF8 0x6961 #CJK UNIFIED IDEOGRAPH +0xEAF9 0x6962 #CJK UNIFIED IDEOGRAPH +0xEAFA 0x6CB9 #CJK UNIFIED IDEOGRAPH +0xEAFB 0x6D27 #CJK UNIFIED IDEOGRAPH +0xEAFC 0xF9CA #CJK COMPATIBILITY IDEOGRAPH +0xEAFD 0x6E38 #CJK UNIFIED IDEOGRAPH +0xEAFE 0xF9CB #CJK COMPATIBILITY IDEOGRAPH +0xEBA1 0x6FE1 #CJK UNIFIED IDEOGRAPH +0xEBA2 0x7336 #CJK UNIFIED IDEOGRAPH +0xEBA3 0x7337 #CJK UNIFIED IDEOGRAPH +0xEBA4 0xF9CC #CJK COMPATIBILITY IDEOGRAPH +0xEBA5 0x745C #CJK UNIFIED IDEOGRAPH +0xEBA6 0x7531 #CJK UNIFIED IDEOGRAPH +0xEBA7 0xF9CD #CJK COMPATIBILITY IDEOGRAPH +0xEBA8 0x7652 #CJK UNIFIED IDEOGRAPH +0xEBA9 0xF9CE #CJK COMPATIBILITY IDEOGRAPH +0xEBAA 0xF9CF #CJK COMPATIBILITY IDEOGRAPH +0xEBAB 0x7DAD #CJK UNIFIED IDEOGRAPH +0xEBAC 0x81FE #CJK UNIFIED IDEOGRAPH +0xEBAD 0x8438 #CJK UNIFIED IDEOGRAPH +0xEBAE 0x88D5 #CJK UNIFIED IDEOGRAPH +0xEBAF 0x8A98 #CJK UNIFIED IDEOGRAPH +0xEBB0 0x8ADB #CJK UNIFIED IDEOGRAPH +0xEBB1 0x8AED #CJK UNIFIED IDEOGRAPH +0xEBB2 0x8E30 #CJK UNIFIED IDEOGRAPH +0xEBB3 0x8E42 #CJK UNIFIED IDEOGRAPH +0xEBB4 0x904A #CJK UNIFIED IDEOGRAPH +0xEBB5 0x903E #CJK UNIFIED IDEOGRAPH +0xEBB6 0x907A #CJK UNIFIED IDEOGRAPH +0xEBB7 0x9149 #CJK UNIFIED IDEOGRAPH +0xEBB8 0x91C9 #CJK UNIFIED IDEOGRAPH +0xEBB9 0x936E #CJK UNIFIED IDEOGRAPH +0xEBBA 0xF9D0 #CJK COMPATIBILITY IDEOGRAPH +0xEBBB 0xF9D1 #CJK COMPATIBILITY IDEOGRAPH +0xEBBC 0x5809 #CJK UNIFIED IDEOGRAPH +0xEBBD 0xF9D2 #CJK COMPATIBILITY IDEOGRAPH +0xEBBE 0x6BD3 #CJK UNIFIED IDEOGRAPH +0xEBBF 0x8089 #CJK UNIFIED IDEOGRAPH +0xEBC0 0x80B2 #CJK UNIFIED IDEOGRAPH +0xEBC1 0xF9D3 #CJK COMPATIBILITY IDEOGRAPH +0xEBC2 0xF9D4 #CJK COMPATIBILITY IDEOGRAPH +0xEBC3 0x5141 #CJK UNIFIED IDEOGRAPH +0xEBC4 0x596B #CJK UNIFIED IDEOGRAPH +0xEBC5 0x5C39 #CJK UNIFIED IDEOGRAPH +0xEBC6 0xF9D5 #CJK COMPATIBILITY IDEOGRAPH +0xEBC7 0xF9D6 #CJK COMPATIBILITY IDEOGRAPH +0xEBC8 0x6F64 #CJK UNIFIED IDEOGRAPH +0xEBC9 0x73A7 #CJK UNIFIED IDEOGRAPH +0xEBCA 0x80E4 #CJK UNIFIED IDEOGRAPH +0xEBCB 0x8D07 #CJK UNIFIED IDEOGRAPH +0xEBCC 0xF9D7 #CJK COMPATIBILITY IDEOGRAPH +0xEBCD 0x9217 #CJK UNIFIED IDEOGRAPH +0xEBCE 0x958F #CJK UNIFIED IDEOGRAPH +0xEBCF 0xF9D8 #CJK COMPATIBILITY IDEOGRAPH +0xEBD0 0xF9D9 #CJK COMPATIBILITY IDEOGRAPH +0xEBD1 0xF9DA #CJK COMPATIBILITY IDEOGRAPH +0xEBD2 0xF9DB #CJK COMPATIBILITY IDEOGRAPH +0xEBD3 0x807F #CJK UNIFIED IDEOGRAPH +0xEBD4 0x620E #CJK UNIFIED IDEOGRAPH +0xEBD5 0x701C #CJK UNIFIED IDEOGRAPH +0xEBD6 0x7D68 #CJK UNIFIED IDEOGRAPH +0xEBD7 0x878D #CJK UNIFIED IDEOGRAPH +0xEBD8 0xF9DC #CJK COMPATIBILITY IDEOGRAPH +0xEBD9 0x57A0 #CJK UNIFIED IDEOGRAPH +0xEBDA 0x6069 #CJK UNIFIED IDEOGRAPH +0xEBDB 0x6147 #CJK UNIFIED IDEOGRAPH +0xEBDC 0x6BB7 #CJK UNIFIED IDEOGRAPH +0xEBDD 0x8ABE #CJK UNIFIED IDEOGRAPH +0xEBDE 0x9280 #CJK UNIFIED IDEOGRAPH +0xEBDF 0x96B1 #CJK UNIFIED IDEOGRAPH +0xEBE0 0x4E59 #CJK UNIFIED IDEOGRAPH +0xEBE1 0x541F #CJK UNIFIED IDEOGRAPH +0xEBE2 0x6DEB #CJK UNIFIED IDEOGRAPH +0xEBE3 0x852D #CJK UNIFIED IDEOGRAPH +0xEBE4 0x9670 #CJK UNIFIED IDEOGRAPH +0xEBE5 0x97F3 #CJK UNIFIED IDEOGRAPH +0xEBE6 0x98EE #CJK UNIFIED IDEOGRAPH +0xEBE7 0x63D6 #CJK UNIFIED IDEOGRAPH +0xEBE8 0x6CE3 #CJK UNIFIED IDEOGRAPH +0xEBE9 0x9091 #CJK UNIFIED IDEOGRAPH +0xEBEA 0x51DD #CJK UNIFIED IDEOGRAPH +0xEBEB 0x61C9 #CJK UNIFIED IDEOGRAPH +0xEBEC 0x81BA #CJK UNIFIED IDEOGRAPH +0xEBED 0x9DF9 #CJK UNIFIED IDEOGRAPH +0xEBEE 0x4F9D #CJK UNIFIED IDEOGRAPH +0xEBEF 0x501A #CJK UNIFIED IDEOGRAPH +0xEBF0 0x5100 #CJK UNIFIED IDEOGRAPH +0xEBF1 0x5B9C #CJK UNIFIED IDEOGRAPH +0xEBF2 0x610F #CJK UNIFIED IDEOGRAPH +0xEBF3 0x61FF #CJK UNIFIED IDEOGRAPH +0xEBF4 0x64EC #CJK UNIFIED IDEOGRAPH +0xEBF5 0x6905 #CJK UNIFIED IDEOGRAPH +0xEBF6 0x6BC5 #CJK UNIFIED IDEOGRAPH +0xEBF7 0x7591 #CJK UNIFIED IDEOGRAPH +0xEBF8 0x77E3 #CJK UNIFIED IDEOGRAPH +0xEBF9 0x7FA9 #CJK UNIFIED IDEOGRAPH +0xEBFA 0x8264 #CJK UNIFIED IDEOGRAPH +0xEBFB 0x858F #CJK UNIFIED IDEOGRAPH +0xEBFC 0x87FB #CJK UNIFIED IDEOGRAPH +0xEBFD 0x8863 #CJK UNIFIED IDEOGRAPH +0xEBFE 0x8ABC #CJK UNIFIED IDEOGRAPH +0xECA1 0x8B70 #CJK UNIFIED IDEOGRAPH +0xECA2 0x91AB #CJK UNIFIED IDEOGRAPH +0xECA3 0x4E8C #CJK UNIFIED IDEOGRAPH +0xECA4 0x4EE5 #CJK UNIFIED IDEOGRAPH +0xECA5 0x4F0A #CJK UNIFIED IDEOGRAPH +0xECA6 0xF9DD #CJK COMPATIBILITY IDEOGRAPH +0xECA7 0xF9DE #CJK COMPATIBILITY IDEOGRAPH +0xECA8 0x5937 #CJK UNIFIED IDEOGRAPH +0xECA9 0x59E8 #CJK UNIFIED IDEOGRAPH +0xECAA 0xF9DF #CJK COMPATIBILITY IDEOGRAPH +0xECAB 0x5DF2 #CJK UNIFIED IDEOGRAPH +0xECAC 0x5F1B #CJK UNIFIED IDEOGRAPH +0xECAD 0x5F5B #CJK UNIFIED IDEOGRAPH +0xECAE 0x6021 #CJK UNIFIED IDEOGRAPH +0xECAF 0xF9E0 #CJK COMPATIBILITY IDEOGRAPH +0xECB0 0xF9E1 #CJK COMPATIBILITY IDEOGRAPH +0xECB1 0xF9E2 #CJK COMPATIBILITY IDEOGRAPH +0xECB2 0xF9E3 #CJK COMPATIBILITY IDEOGRAPH +0xECB3 0x723E #CJK UNIFIED IDEOGRAPH +0xECB4 0x73E5 #CJK UNIFIED IDEOGRAPH +0xECB5 0xF9E4 #CJK COMPATIBILITY IDEOGRAPH +0xECB6 0x7570 #CJK UNIFIED IDEOGRAPH +0xECB7 0x75CD #CJK UNIFIED IDEOGRAPH +0xECB8 0xF9E5 #CJK COMPATIBILITY IDEOGRAPH +0xECB9 0x79FB #CJK UNIFIED IDEOGRAPH +0xECBA 0xF9E6 #CJK COMPATIBILITY IDEOGRAPH +0xECBB 0x800C #CJK UNIFIED IDEOGRAPH +0xECBC 0x8033 #CJK UNIFIED IDEOGRAPH +0xECBD 0x8084 #CJK UNIFIED IDEOGRAPH +0xECBE 0x82E1 #CJK UNIFIED IDEOGRAPH +0xECBF 0x8351 #CJK UNIFIED IDEOGRAPH +0xECC0 0xF9E7 #CJK COMPATIBILITY IDEOGRAPH +0xECC1 0xF9E8 #CJK COMPATIBILITY IDEOGRAPH +0xECC2 0x8CBD #CJK UNIFIED IDEOGRAPH +0xECC3 0x8CB3 #CJK UNIFIED IDEOGRAPH +0xECC4 0x9087 #CJK UNIFIED IDEOGRAPH +0xECC5 0xF9E9 #CJK COMPATIBILITY IDEOGRAPH +0xECC6 0xF9EA #CJK COMPATIBILITY IDEOGRAPH +0xECC7 0x98F4 #CJK UNIFIED IDEOGRAPH +0xECC8 0x990C #CJK UNIFIED IDEOGRAPH +0xECC9 0xF9EB #CJK COMPATIBILITY IDEOGRAPH +0xECCA 0xF9EC #CJK COMPATIBILITY IDEOGRAPH +0xECCB 0x7037 #CJK UNIFIED IDEOGRAPH +0xECCC 0x76CA #CJK UNIFIED IDEOGRAPH +0xECCD 0x7FCA #CJK UNIFIED IDEOGRAPH +0xECCE 0x7FCC #CJK UNIFIED IDEOGRAPH +0xECCF 0x7FFC #CJK UNIFIED IDEOGRAPH +0xECD0 0x8B1A #CJK UNIFIED IDEOGRAPH +0xECD1 0x4EBA #CJK UNIFIED IDEOGRAPH +0xECD2 0x4EC1 #CJK UNIFIED IDEOGRAPH +0xECD3 0x5203 #CJK UNIFIED IDEOGRAPH +0xECD4 0x5370 #CJK UNIFIED IDEOGRAPH +0xECD5 0xF9ED #CJK COMPATIBILITY IDEOGRAPH +0xECD6 0x54BD #CJK UNIFIED IDEOGRAPH +0xECD7 0x56E0 #CJK UNIFIED IDEOGRAPH +0xECD8 0x59FB #CJK UNIFIED IDEOGRAPH +0xECD9 0x5BC5 #CJK UNIFIED IDEOGRAPH +0xECDA 0x5F15 #CJK UNIFIED IDEOGRAPH +0xECDB 0x5FCD #CJK UNIFIED IDEOGRAPH +0xECDC 0x6E6E #CJK UNIFIED IDEOGRAPH +0xECDD 0xF9EE #CJK COMPATIBILITY IDEOGRAPH +0xECDE 0xF9EF #CJK COMPATIBILITY IDEOGRAPH +0xECDF 0x7D6A #CJK UNIFIED IDEOGRAPH +0xECE0 0x8335 #CJK UNIFIED IDEOGRAPH +0xECE1 0xF9F0 #CJK COMPATIBILITY IDEOGRAPH +0xECE2 0x8693 #CJK UNIFIED IDEOGRAPH +0xECE3 0x8A8D #CJK UNIFIED IDEOGRAPH +0xECE4 0xF9F1 #CJK COMPATIBILITY IDEOGRAPH +0xECE5 0x976D #CJK UNIFIED IDEOGRAPH +0xECE6 0x9777 #CJK UNIFIED IDEOGRAPH +0xECE7 0xF9F2 #CJK COMPATIBILITY IDEOGRAPH +0xECE8 0xF9F3 #CJK COMPATIBILITY IDEOGRAPH +0xECE9 0x4E00 #CJK UNIFIED IDEOGRAPH +0xECEA 0x4F5A #CJK UNIFIED IDEOGRAPH +0xECEB 0x4F7E #CJK UNIFIED IDEOGRAPH +0xECEC 0x58F9 #CJK UNIFIED IDEOGRAPH +0xECED 0x65E5 #CJK UNIFIED IDEOGRAPH +0xECEE 0x6EA2 #CJK UNIFIED IDEOGRAPH +0xECEF 0x9038 #CJK UNIFIED IDEOGRAPH +0xECF0 0x93B0 #CJK UNIFIED IDEOGRAPH +0xECF1 0x99B9 #CJK UNIFIED IDEOGRAPH +0xECF2 0x4EFB #CJK UNIFIED IDEOGRAPH +0xECF3 0x58EC #CJK UNIFIED IDEOGRAPH +0xECF4 0x598A #CJK UNIFIED IDEOGRAPH +0xECF5 0x59D9 #CJK UNIFIED IDEOGRAPH +0xECF6 0x6041 #CJK UNIFIED IDEOGRAPH +0xECF7 0xF9F4 #CJK COMPATIBILITY IDEOGRAPH +0xECF8 0xF9F5 #CJK COMPATIBILITY IDEOGRAPH +0xECF9 0x7A14 #CJK UNIFIED IDEOGRAPH +0xECFA 0xF9F6 #CJK COMPATIBILITY IDEOGRAPH +0xECFB 0x834F #CJK UNIFIED IDEOGRAPH +0xECFC 0x8CC3 #CJK UNIFIED IDEOGRAPH +0xECFD 0x5165 #CJK UNIFIED IDEOGRAPH +0xECFE 0x5344 #CJK UNIFIED IDEOGRAPH +0xEDA1 0xF9F7 #CJK COMPATIBILITY IDEOGRAPH +0xEDA2 0xF9F8 #CJK COMPATIBILITY IDEOGRAPH +0xEDA3 0xF9F9 #CJK COMPATIBILITY IDEOGRAPH +0xEDA4 0x4ECD #CJK UNIFIED IDEOGRAPH +0xEDA5 0x5269 #CJK UNIFIED IDEOGRAPH +0xEDA6 0x5B55 #CJK UNIFIED IDEOGRAPH +0xEDA7 0x82BF #CJK UNIFIED IDEOGRAPH +0xEDA8 0x4ED4 #CJK UNIFIED IDEOGRAPH +0xEDA9 0x523A #CJK UNIFIED IDEOGRAPH +0xEDAA 0x54A8 #CJK UNIFIED IDEOGRAPH +0xEDAB 0x59C9 #CJK UNIFIED IDEOGRAPH +0xEDAC 0x59FF #CJK UNIFIED IDEOGRAPH +0xEDAD 0x5B50 #CJK UNIFIED IDEOGRAPH +0xEDAE 0x5B57 #CJK UNIFIED IDEOGRAPH +0xEDAF 0x5B5C #CJK UNIFIED IDEOGRAPH +0xEDB0 0x6063 #CJK UNIFIED IDEOGRAPH +0xEDB1 0x6148 #CJK UNIFIED IDEOGRAPH +0xEDB2 0x6ECB #CJK UNIFIED IDEOGRAPH +0xEDB3 0x7099 #CJK UNIFIED IDEOGRAPH +0xEDB4 0x716E #CJK UNIFIED IDEOGRAPH +0xEDB5 0x7386 #CJK UNIFIED IDEOGRAPH +0xEDB6 0x74F7 #CJK UNIFIED IDEOGRAPH +0xEDB7 0x75B5 #CJK UNIFIED IDEOGRAPH +0xEDB8 0x78C1 #CJK UNIFIED IDEOGRAPH +0xEDB9 0x7D2B #CJK UNIFIED IDEOGRAPH +0xEDBA 0x8005 #CJK UNIFIED IDEOGRAPH +0xEDBB 0x81EA #CJK UNIFIED IDEOGRAPH +0xEDBC 0x8328 #CJK UNIFIED IDEOGRAPH +0xEDBD 0x8517 #CJK UNIFIED IDEOGRAPH +0xEDBE 0x85C9 #CJK UNIFIED IDEOGRAPH +0xEDBF 0x8AEE #CJK UNIFIED IDEOGRAPH +0xEDC0 0x8CC7 #CJK UNIFIED IDEOGRAPH +0xEDC1 0x96CC #CJK UNIFIED IDEOGRAPH +0xEDC2 0x4F5C #CJK UNIFIED IDEOGRAPH +0xEDC3 0x52FA #CJK UNIFIED IDEOGRAPH +0xEDC4 0x56BC #CJK UNIFIED IDEOGRAPH +0xEDC5 0x65AB #CJK UNIFIED IDEOGRAPH +0xEDC6 0x6628 #CJK UNIFIED IDEOGRAPH +0xEDC7 0x707C #CJK UNIFIED IDEOGRAPH +0xEDC8 0x70B8 #CJK UNIFIED IDEOGRAPH +0xEDC9 0x7235 #CJK UNIFIED IDEOGRAPH +0xEDCA 0x7DBD #CJK UNIFIED IDEOGRAPH +0xEDCB 0x828D #CJK UNIFIED IDEOGRAPH +0xEDCC 0x914C #CJK UNIFIED IDEOGRAPH +0xEDCD 0x96C0 #CJK UNIFIED IDEOGRAPH +0xEDCE 0x9D72 #CJK UNIFIED IDEOGRAPH +0xEDCF 0x5B71 #CJK UNIFIED IDEOGRAPH +0xEDD0 0x68E7 #CJK UNIFIED IDEOGRAPH +0xEDD1 0x6B98 #CJK UNIFIED IDEOGRAPH +0xEDD2 0x6F7A #CJK UNIFIED IDEOGRAPH +0xEDD3 0x76DE #CJK UNIFIED IDEOGRAPH +0xEDD4 0x5C91 #CJK UNIFIED IDEOGRAPH +0xEDD5 0x66AB #CJK UNIFIED IDEOGRAPH +0xEDD6 0x6F5B #CJK UNIFIED IDEOGRAPH +0xEDD7 0x7BB4 #CJK UNIFIED IDEOGRAPH +0xEDD8 0x7C2A #CJK UNIFIED IDEOGRAPH +0xEDD9 0x8836 #CJK UNIFIED IDEOGRAPH +0xEDDA 0x96DC #CJK UNIFIED IDEOGRAPH +0xEDDB 0x4E08 #CJK UNIFIED IDEOGRAPH +0xEDDC 0x4ED7 #CJK UNIFIED IDEOGRAPH +0xEDDD 0x5320 #CJK UNIFIED IDEOGRAPH +0xEDDE 0x5834 #CJK UNIFIED IDEOGRAPH +0xEDDF 0x58BB #CJK UNIFIED IDEOGRAPH +0xEDE0 0x58EF #CJK UNIFIED IDEOGRAPH +0xEDE1 0x596C #CJK UNIFIED IDEOGRAPH +0xEDE2 0x5C07 #CJK UNIFIED IDEOGRAPH +0xEDE3 0x5E33 #CJK UNIFIED IDEOGRAPH +0xEDE4 0x5E84 #CJK UNIFIED IDEOGRAPH +0xEDE5 0x5F35 #CJK UNIFIED IDEOGRAPH +0xEDE6 0x638C #CJK UNIFIED IDEOGRAPH +0xEDE7 0x66B2 #CJK UNIFIED IDEOGRAPH +0xEDE8 0x6756 #CJK UNIFIED IDEOGRAPH +0xEDE9 0x6A1F #CJK UNIFIED IDEOGRAPH +0xEDEA 0x6AA3 #CJK UNIFIED IDEOGRAPH +0xEDEB 0x6B0C #CJK UNIFIED IDEOGRAPH +0xEDEC 0x6F3F #CJK UNIFIED IDEOGRAPH +0xEDED 0x7246 #CJK UNIFIED IDEOGRAPH +0xEDEE 0xF9FA #CJK COMPATIBILITY IDEOGRAPH +0xEDEF 0x7350 #CJK UNIFIED IDEOGRAPH +0xEDF0 0x748B #CJK UNIFIED IDEOGRAPH +0xEDF1 0x7AE0 #CJK UNIFIED IDEOGRAPH +0xEDF2 0x7CA7 #CJK UNIFIED IDEOGRAPH +0xEDF3 0x8178 #CJK UNIFIED IDEOGRAPH +0xEDF4 0x81DF #CJK UNIFIED IDEOGRAPH +0xEDF5 0x81E7 #CJK UNIFIED IDEOGRAPH +0xEDF6 0x838A #CJK UNIFIED IDEOGRAPH +0xEDF7 0x846C #CJK UNIFIED IDEOGRAPH +0xEDF8 0x8523 #CJK UNIFIED IDEOGRAPH +0xEDF9 0x8594 #CJK UNIFIED IDEOGRAPH +0xEDFA 0x85CF #CJK UNIFIED IDEOGRAPH +0xEDFB 0x88DD #CJK UNIFIED IDEOGRAPH +0xEDFC 0x8D13 #CJK UNIFIED IDEOGRAPH +0xEDFD 0x91AC #CJK UNIFIED IDEOGRAPH +0xEDFE 0x9577 #CJK UNIFIED IDEOGRAPH +0xEEA1 0x969C #CJK UNIFIED IDEOGRAPH +0xEEA2 0x518D #CJK UNIFIED IDEOGRAPH +0xEEA3 0x54C9 #CJK UNIFIED IDEOGRAPH +0xEEA4 0x5728 #CJK UNIFIED IDEOGRAPH +0xEEA5 0x5BB0 #CJK UNIFIED IDEOGRAPH +0xEEA6 0x624D #CJK UNIFIED IDEOGRAPH +0xEEA7 0x6750 #CJK UNIFIED IDEOGRAPH +0xEEA8 0x683D #CJK UNIFIED IDEOGRAPH +0xEEA9 0x6893 #CJK UNIFIED IDEOGRAPH +0xEEAA 0x6E3D #CJK UNIFIED IDEOGRAPH +0xEEAB 0x6ED3 #CJK UNIFIED IDEOGRAPH +0xEEAC 0x707D #CJK UNIFIED IDEOGRAPH +0xEEAD 0x7E21 #CJK UNIFIED IDEOGRAPH +0xEEAE 0x88C1 #CJK UNIFIED IDEOGRAPH +0xEEAF 0x8CA1 #CJK UNIFIED IDEOGRAPH +0xEEB0 0x8F09 #CJK UNIFIED IDEOGRAPH +0xEEB1 0x9F4B #CJK UNIFIED IDEOGRAPH +0xEEB2 0x9F4E #CJK UNIFIED IDEOGRAPH +0xEEB3 0x722D #CJK UNIFIED IDEOGRAPH +0xEEB4 0x7B8F #CJK UNIFIED IDEOGRAPH +0xEEB5 0x8ACD #CJK UNIFIED IDEOGRAPH +0xEEB6 0x931A #CJK UNIFIED IDEOGRAPH +0xEEB7 0x4F47 #CJK UNIFIED IDEOGRAPH +0xEEB8 0x4F4E #CJK UNIFIED IDEOGRAPH +0xEEB9 0x5132 #CJK UNIFIED IDEOGRAPH +0xEEBA 0x5480 #CJK UNIFIED IDEOGRAPH +0xEEBB 0x59D0 #CJK UNIFIED IDEOGRAPH +0xEEBC 0x5E95 #CJK UNIFIED IDEOGRAPH +0xEEBD 0x62B5 #CJK UNIFIED IDEOGRAPH +0xEEBE 0x6775 #CJK UNIFIED IDEOGRAPH +0xEEBF 0x696E #CJK UNIFIED IDEOGRAPH +0xEEC0 0x6A17 #CJK UNIFIED IDEOGRAPH +0xEEC1 0x6CAE #CJK UNIFIED IDEOGRAPH +0xEEC2 0x6E1A #CJK UNIFIED IDEOGRAPH +0xEEC3 0x72D9 #CJK UNIFIED IDEOGRAPH +0xEEC4 0x732A #CJK UNIFIED IDEOGRAPH +0xEEC5 0x75BD #CJK UNIFIED IDEOGRAPH +0xEEC6 0x7BB8 #CJK UNIFIED IDEOGRAPH +0xEEC7 0x7D35 #CJK UNIFIED IDEOGRAPH +0xEEC8 0x82E7 #CJK UNIFIED IDEOGRAPH +0xEEC9 0x83F9 #CJK UNIFIED IDEOGRAPH +0xEECA 0x8457 #CJK UNIFIED IDEOGRAPH +0xEECB 0x85F7 #CJK UNIFIED IDEOGRAPH +0xEECC 0x8A5B #CJK UNIFIED IDEOGRAPH +0xEECD 0x8CAF #CJK UNIFIED IDEOGRAPH +0xEECE 0x8E87 #CJK UNIFIED IDEOGRAPH +0xEECF 0x9019 #CJK UNIFIED IDEOGRAPH +0xEED0 0x90B8 #CJK UNIFIED IDEOGRAPH +0xEED1 0x96CE #CJK UNIFIED IDEOGRAPH +0xEED2 0x9F5F #CJK UNIFIED IDEOGRAPH +0xEED3 0x52E3 #CJK UNIFIED IDEOGRAPH +0xEED4 0x540A #CJK UNIFIED IDEOGRAPH +0xEED5 0x5AE1 #CJK UNIFIED IDEOGRAPH +0xEED6 0x5BC2 #CJK UNIFIED IDEOGRAPH +0xEED7 0x6458 #CJK UNIFIED IDEOGRAPH +0xEED8 0x6575 #CJK UNIFIED IDEOGRAPH +0xEED9 0x6EF4 #CJK UNIFIED IDEOGRAPH +0xEEDA 0x72C4 #CJK UNIFIED IDEOGRAPH +0xEEDB 0xF9FB #CJK COMPATIBILITY IDEOGRAPH +0xEEDC 0x7684 #CJK UNIFIED IDEOGRAPH +0xEEDD 0x7A4D #CJK UNIFIED IDEOGRAPH +0xEEDE 0x7B1B #CJK UNIFIED IDEOGRAPH +0xEEDF 0x7C4D #CJK UNIFIED IDEOGRAPH +0xEEE0 0x7E3E #CJK UNIFIED IDEOGRAPH +0xEEE1 0x7FDF #CJK UNIFIED IDEOGRAPH +0xEEE2 0x837B #CJK UNIFIED IDEOGRAPH +0xEEE3 0x8B2B #CJK UNIFIED IDEOGRAPH +0xEEE4 0x8CCA #CJK UNIFIED IDEOGRAPH +0xEEE5 0x8D64 #CJK UNIFIED IDEOGRAPH +0xEEE6 0x8DE1 #CJK UNIFIED IDEOGRAPH +0xEEE7 0x8E5F #CJK UNIFIED IDEOGRAPH +0xEEE8 0x8FEA #CJK UNIFIED IDEOGRAPH +0xEEE9 0x8FF9 #CJK UNIFIED IDEOGRAPH +0xEEEA 0x9069 #CJK UNIFIED IDEOGRAPH +0xEEEB 0x93D1 #CJK UNIFIED IDEOGRAPH +0xEEEC 0x4F43 #CJK UNIFIED IDEOGRAPH +0xEEED 0x4F7A #CJK UNIFIED IDEOGRAPH +0xEEEE 0x50B3 #CJK UNIFIED IDEOGRAPH +0xEEEF 0x5168 #CJK UNIFIED IDEOGRAPH +0xEEF0 0x5178 #CJK UNIFIED IDEOGRAPH +0xEEF1 0x524D #CJK UNIFIED IDEOGRAPH +0xEEF2 0x526A #CJK UNIFIED IDEOGRAPH +0xEEF3 0x5861 #CJK UNIFIED IDEOGRAPH +0xEEF4 0x587C #CJK UNIFIED IDEOGRAPH +0xEEF5 0x5960 #CJK UNIFIED IDEOGRAPH +0xEEF6 0x5C08 #CJK UNIFIED IDEOGRAPH +0xEEF7 0x5C55 #CJK UNIFIED IDEOGRAPH +0xEEF8 0x5EDB #CJK UNIFIED IDEOGRAPH +0xEEF9 0x609B #CJK UNIFIED IDEOGRAPH +0xEEFA 0x6230 #CJK UNIFIED IDEOGRAPH +0xEEFB 0x6813 #CJK UNIFIED IDEOGRAPH +0xEEFC 0x6BBF #CJK UNIFIED IDEOGRAPH +0xEEFD 0x6C08 #CJK UNIFIED IDEOGRAPH +0xEEFE 0x6FB1 #CJK UNIFIED IDEOGRAPH +0xEFA1 0x714E #CJK UNIFIED IDEOGRAPH +0xEFA2 0x7420 #CJK UNIFIED IDEOGRAPH +0xEFA3 0x7530 #CJK UNIFIED IDEOGRAPH +0xEFA4 0x7538 #CJK UNIFIED IDEOGRAPH +0xEFA5 0x7551 #CJK UNIFIED IDEOGRAPH +0xEFA6 0x7672 #CJK UNIFIED IDEOGRAPH +0xEFA7 0x7B4C #CJK UNIFIED IDEOGRAPH +0xEFA8 0x7B8B #CJK UNIFIED IDEOGRAPH +0xEFA9 0x7BAD #CJK UNIFIED IDEOGRAPH +0xEFAA 0x7BC6 #CJK UNIFIED IDEOGRAPH +0xEFAB 0x7E8F #CJK UNIFIED IDEOGRAPH +0xEFAC 0x8A6E #CJK UNIFIED IDEOGRAPH +0xEFAD 0x8F3E #CJK UNIFIED IDEOGRAPH +0xEFAE 0x8F49 #CJK UNIFIED IDEOGRAPH +0xEFAF 0x923F #CJK UNIFIED IDEOGRAPH +0xEFB0 0x9293 #CJK UNIFIED IDEOGRAPH +0xEFB1 0x9322 #CJK UNIFIED IDEOGRAPH +0xEFB2 0x942B #CJK UNIFIED IDEOGRAPH +0xEFB3 0x96FB #CJK UNIFIED IDEOGRAPH +0xEFB4 0x985A #CJK UNIFIED IDEOGRAPH +0xEFB5 0x986B #CJK UNIFIED IDEOGRAPH +0xEFB6 0x991E #CJK UNIFIED IDEOGRAPH +0xEFB7 0x5207 #CJK UNIFIED IDEOGRAPH +0xEFB8 0x622A #CJK UNIFIED IDEOGRAPH +0xEFB9 0x6298 #CJK UNIFIED IDEOGRAPH +0xEFBA 0x6D59 #CJK UNIFIED IDEOGRAPH +0xEFBB 0x7664 #CJK UNIFIED IDEOGRAPH +0xEFBC 0x7ACA #CJK UNIFIED IDEOGRAPH +0xEFBD 0x7BC0 #CJK UNIFIED IDEOGRAPH +0xEFBE 0x7D76 #CJK UNIFIED IDEOGRAPH +0xEFBF 0x5360 #CJK UNIFIED IDEOGRAPH +0xEFC0 0x5CBE #CJK UNIFIED IDEOGRAPH +0xEFC1 0x5E97 #CJK UNIFIED IDEOGRAPH +0xEFC2 0x6F38 #CJK UNIFIED IDEOGRAPH +0xEFC3 0x70B9 #CJK UNIFIED IDEOGRAPH +0xEFC4 0x7C98 #CJK UNIFIED IDEOGRAPH +0xEFC5 0x9711 #CJK UNIFIED IDEOGRAPH +0xEFC6 0x9B8E #CJK UNIFIED IDEOGRAPH +0xEFC7 0x9EDE #CJK UNIFIED IDEOGRAPH +0xEFC8 0x63A5 #CJK UNIFIED IDEOGRAPH +0xEFC9 0x647A #CJK UNIFIED IDEOGRAPH +0xEFCA 0x8776 #CJK UNIFIED IDEOGRAPH +0xEFCB 0x4E01 #CJK UNIFIED IDEOGRAPH +0xEFCC 0x4E95 #CJK UNIFIED IDEOGRAPH +0xEFCD 0x4EAD #CJK UNIFIED IDEOGRAPH +0xEFCE 0x505C #CJK UNIFIED IDEOGRAPH +0xEFCF 0x5075 #CJK UNIFIED IDEOGRAPH +0xEFD0 0x5448 #CJK UNIFIED IDEOGRAPH +0xEFD1 0x59C3 #CJK UNIFIED IDEOGRAPH +0xEFD2 0x5B9A #CJK UNIFIED IDEOGRAPH +0xEFD3 0x5E40 #CJK UNIFIED IDEOGRAPH +0xEFD4 0x5EAD #CJK UNIFIED IDEOGRAPH +0xEFD5 0x5EF7 #CJK UNIFIED IDEOGRAPH +0xEFD6 0x5F81 #CJK UNIFIED IDEOGRAPH +0xEFD7 0x60C5 #CJK UNIFIED IDEOGRAPH +0xEFD8 0x633A #CJK UNIFIED IDEOGRAPH +0xEFD9 0x653F #CJK UNIFIED IDEOGRAPH +0xEFDA 0x6574 #CJK UNIFIED IDEOGRAPH +0xEFDB 0x65CC #CJK UNIFIED IDEOGRAPH +0xEFDC 0x6676 #CJK UNIFIED IDEOGRAPH +0xEFDD 0x6678 #CJK UNIFIED IDEOGRAPH +0xEFDE 0x67FE #CJK UNIFIED IDEOGRAPH +0xEFDF 0x6968 #CJK UNIFIED IDEOGRAPH +0xEFE0 0x6A89 #CJK UNIFIED IDEOGRAPH +0xEFE1 0x6B63 #CJK UNIFIED IDEOGRAPH +0xEFE2 0x6C40 #CJK UNIFIED IDEOGRAPH +0xEFE3 0x6DC0 #CJK UNIFIED IDEOGRAPH +0xEFE4 0x6DE8 #CJK UNIFIED IDEOGRAPH +0xEFE5 0x6E1F #CJK UNIFIED IDEOGRAPH +0xEFE6 0x6E5E #CJK UNIFIED IDEOGRAPH +0xEFE7 0x701E #CJK UNIFIED IDEOGRAPH +0xEFE8 0x70A1 #CJK UNIFIED IDEOGRAPH +0xEFE9 0x738E #CJK UNIFIED IDEOGRAPH +0xEFEA 0x73FD #CJK UNIFIED IDEOGRAPH +0xEFEB 0x753A #CJK UNIFIED IDEOGRAPH +0xEFEC 0x775B #CJK UNIFIED IDEOGRAPH +0xEFED 0x7887 #CJK UNIFIED IDEOGRAPH +0xEFEE 0x798E #CJK UNIFIED IDEOGRAPH +0xEFEF 0x7A0B #CJK UNIFIED IDEOGRAPH +0xEFF0 0x7A7D #CJK UNIFIED IDEOGRAPH +0xEFF1 0x7CBE #CJK UNIFIED IDEOGRAPH +0xEFF2 0x7D8E #CJK UNIFIED IDEOGRAPH +0xEFF3 0x8247 #CJK UNIFIED IDEOGRAPH +0xEFF4 0x8A02 #CJK UNIFIED IDEOGRAPH +0xEFF5 0x8AEA #CJK UNIFIED IDEOGRAPH +0xEFF6 0x8C9E #CJK UNIFIED IDEOGRAPH +0xEFF7 0x912D #CJK UNIFIED IDEOGRAPH +0xEFF8 0x914A #CJK UNIFIED IDEOGRAPH +0xEFF9 0x91D8 #CJK UNIFIED IDEOGRAPH +0xEFFA 0x9266 #CJK UNIFIED IDEOGRAPH +0xEFFB 0x92CC #CJK UNIFIED IDEOGRAPH +0xEFFC 0x9320 #CJK UNIFIED IDEOGRAPH +0xEFFD 0x9706 #CJK UNIFIED IDEOGRAPH +0xEFFE 0x9756 #CJK UNIFIED IDEOGRAPH +0xF0A1 0x975C #CJK UNIFIED IDEOGRAPH +0xF0A2 0x9802 #CJK UNIFIED IDEOGRAPH +0xF0A3 0x9F0E #CJK UNIFIED IDEOGRAPH +0xF0A4 0x5236 #CJK UNIFIED IDEOGRAPH +0xF0A5 0x5291 #CJK UNIFIED IDEOGRAPH +0xF0A6 0x557C #CJK UNIFIED IDEOGRAPH +0xF0A7 0x5824 #CJK UNIFIED IDEOGRAPH +0xF0A8 0x5E1D #CJK UNIFIED IDEOGRAPH +0xF0A9 0x5F1F #CJK UNIFIED IDEOGRAPH +0xF0AA 0x608C #CJK UNIFIED IDEOGRAPH +0xF0AB 0x63D0 #CJK UNIFIED IDEOGRAPH +0xF0AC 0x68AF #CJK UNIFIED IDEOGRAPH +0xF0AD 0x6FDF #CJK UNIFIED IDEOGRAPH +0xF0AE 0x796D #CJK UNIFIED IDEOGRAPH +0xF0AF 0x7B2C #CJK UNIFIED IDEOGRAPH +0xF0B0 0x81CD #CJK UNIFIED IDEOGRAPH +0xF0B1 0x85BA #CJK UNIFIED IDEOGRAPH +0xF0B2 0x88FD #CJK UNIFIED IDEOGRAPH +0xF0B3 0x8AF8 #CJK UNIFIED IDEOGRAPH +0xF0B4 0x8E44 #CJK UNIFIED IDEOGRAPH +0xF0B5 0x918D #CJK UNIFIED IDEOGRAPH +0xF0B6 0x9664 #CJK UNIFIED IDEOGRAPH +0xF0B7 0x969B #CJK UNIFIED IDEOGRAPH +0xF0B8 0x973D #CJK UNIFIED IDEOGRAPH +0xF0B9 0x984C #CJK UNIFIED IDEOGRAPH +0xF0BA 0x9F4A #CJK UNIFIED IDEOGRAPH +0xF0BB 0x4FCE #CJK UNIFIED IDEOGRAPH +0xF0BC 0x5146 #CJK UNIFIED IDEOGRAPH +0xF0BD 0x51CB #CJK UNIFIED IDEOGRAPH +0xF0BE 0x52A9 #CJK UNIFIED IDEOGRAPH +0xF0BF 0x5632 #CJK UNIFIED IDEOGRAPH +0xF0C0 0x5F14 #CJK UNIFIED IDEOGRAPH +0xF0C1 0x5F6B #CJK UNIFIED IDEOGRAPH +0xF0C2 0x63AA #CJK UNIFIED IDEOGRAPH +0xF0C3 0x64CD #CJK UNIFIED IDEOGRAPH +0xF0C4 0x65E9 #CJK UNIFIED IDEOGRAPH +0xF0C5 0x6641 #CJK UNIFIED IDEOGRAPH +0xF0C6 0x66FA #CJK UNIFIED IDEOGRAPH +0xF0C7 0x66F9 #CJK UNIFIED IDEOGRAPH +0xF0C8 0x671D #CJK UNIFIED IDEOGRAPH +0xF0C9 0x689D #CJK UNIFIED IDEOGRAPH +0xF0CA 0x68D7 #CJK UNIFIED IDEOGRAPH +0xF0CB 0x69FD #CJK UNIFIED IDEOGRAPH +0xF0CC 0x6F15 #CJK UNIFIED IDEOGRAPH +0xF0CD 0x6F6E #CJK UNIFIED IDEOGRAPH +0xF0CE 0x7167 #CJK UNIFIED IDEOGRAPH +0xF0CF 0x71E5 #CJK UNIFIED IDEOGRAPH +0xF0D0 0x722A #CJK UNIFIED IDEOGRAPH +0xF0D1 0x74AA #CJK UNIFIED IDEOGRAPH +0xF0D2 0x773A #CJK UNIFIED IDEOGRAPH +0xF0D3 0x7956 #CJK UNIFIED IDEOGRAPH +0xF0D4 0x795A #CJK UNIFIED IDEOGRAPH +0xF0D5 0x79DF #CJK UNIFIED IDEOGRAPH +0xF0D6 0x7A20 #CJK UNIFIED IDEOGRAPH +0xF0D7 0x7A95 #CJK UNIFIED IDEOGRAPH +0xF0D8 0x7C97 #CJK UNIFIED IDEOGRAPH +0xF0D9 0x7CDF #CJK UNIFIED IDEOGRAPH +0xF0DA 0x7D44 #CJK UNIFIED IDEOGRAPH +0xF0DB 0x7E70 #CJK UNIFIED IDEOGRAPH +0xF0DC 0x8087 #CJK UNIFIED IDEOGRAPH +0xF0DD 0x85FB #CJK UNIFIED IDEOGRAPH +0xF0DE 0x86A4 #CJK UNIFIED IDEOGRAPH +0xF0DF 0x8A54 #CJK UNIFIED IDEOGRAPH +0xF0E0 0x8ABF #CJK UNIFIED IDEOGRAPH +0xF0E1 0x8D99 #CJK UNIFIED IDEOGRAPH +0xF0E2 0x8E81 #CJK UNIFIED IDEOGRAPH +0xF0E3 0x9020 #CJK UNIFIED IDEOGRAPH +0xF0E4 0x906D #CJK UNIFIED IDEOGRAPH +0xF0E5 0x91E3 #CJK UNIFIED IDEOGRAPH +0xF0E6 0x963B #CJK UNIFIED IDEOGRAPH +0xF0E7 0x96D5 #CJK UNIFIED IDEOGRAPH +0xF0E8 0x9CE5 #CJK UNIFIED IDEOGRAPH +0xF0E9 0x65CF #CJK UNIFIED IDEOGRAPH +0xF0EA 0x7C07 #CJK UNIFIED IDEOGRAPH +0xF0EB 0x8DB3 #CJK UNIFIED IDEOGRAPH +0xF0EC 0x93C3 #CJK UNIFIED IDEOGRAPH +0xF0ED 0x5B58 #CJK UNIFIED IDEOGRAPH +0xF0EE 0x5C0A #CJK UNIFIED IDEOGRAPH +0xF0EF 0x5352 #CJK UNIFIED IDEOGRAPH +0xF0F0 0x62D9 #CJK UNIFIED IDEOGRAPH +0xF0F1 0x731D #CJK UNIFIED IDEOGRAPH +0xF0F2 0x5027 #CJK UNIFIED IDEOGRAPH +0xF0F3 0x5B97 #CJK UNIFIED IDEOGRAPH +0xF0F4 0x5F9E #CJK UNIFIED IDEOGRAPH +0xF0F5 0x60B0 #CJK UNIFIED IDEOGRAPH +0xF0F6 0x616B #CJK UNIFIED IDEOGRAPH +0xF0F7 0x68D5 #CJK UNIFIED IDEOGRAPH +0xF0F8 0x6DD9 #CJK UNIFIED IDEOGRAPH +0xF0F9 0x742E #CJK UNIFIED IDEOGRAPH +0xF0FA 0x7A2E #CJK UNIFIED IDEOGRAPH +0xF0FB 0x7D42 #CJK UNIFIED IDEOGRAPH +0xF0FC 0x7D9C #CJK UNIFIED IDEOGRAPH +0xF0FD 0x7E31 #CJK UNIFIED IDEOGRAPH +0xF0FE 0x816B #CJK UNIFIED IDEOGRAPH +0xF1A1 0x8E2A #CJK UNIFIED IDEOGRAPH +0xF1A2 0x8E35 #CJK UNIFIED IDEOGRAPH +0xF1A3 0x937E #CJK UNIFIED IDEOGRAPH +0xF1A4 0x9418 #CJK UNIFIED IDEOGRAPH +0xF1A5 0x4F50 #CJK UNIFIED IDEOGRAPH +0xF1A6 0x5750 #CJK UNIFIED IDEOGRAPH +0xF1A7 0x5DE6 #CJK UNIFIED IDEOGRAPH +0xF1A8 0x5EA7 #CJK UNIFIED IDEOGRAPH +0xF1A9 0x632B #CJK UNIFIED IDEOGRAPH +0xF1AA 0x7F6A #CJK UNIFIED IDEOGRAPH +0xF1AB 0x4E3B #CJK UNIFIED IDEOGRAPH +0xF1AC 0x4F4F #CJK UNIFIED IDEOGRAPH +0xF1AD 0x4F8F #CJK UNIFIED IDEOGRAPH +0xF1AE 0x505A #CJK UNIFIED IDEOGRAPH +0xF1AF 0x59DD #CJK UNIFIED IDEOGRAPH +0xF1B0 0x80C4 #CJK UNIFIED IDEOGRAPH +0xF1B1 0x546A #CJK UNIFIED IDEOGRAPH +0xF1B2 0x5468 #CJK UNIFIED IDEOGRAPH +0xF1B3 0x55FE #CJK UNIFIED IDEOGRAPH +0xF1B4 0x594F #CJK UNIFIED IDEOGRAPH +0xF1B5 0x5B99 #CJK UNIFIED IDEOGRAPH +0xF1B6 0x5DDE #CJK UNIFIED IDEOGRAPH +0xF1B7 0x5EDA #CJK UNIFIED IDEOGRAPH +0xF1B8 0x665D #CJK UNIFIED IDEOGRAPH +0xF1B9 0x6731 #CJK UNIFIED IDEOGRAPH +0xF1BA 0x67F1 #CJK UNIFIED IDEOGRAPH +0xF1BB 0x682A #CJK UNIFIED IDEOGRAPH +0xF1BC 0x6CE8 #CJK UNIFIED IDEOGRAPH +0xF1BD 0x6D32 #CJK UNIFIED IDEOGRAPH +0xF1BE 0x6E4A #CJK UNIFIED IDEOGRAPH +0xF1BF 0x6F8D #CJK UNIFIED IDEOGRAPH +0xF1C0 0x70B7 #CJK UNIFIED IDEOGRAPH +0xF1C1 0x73E0 #CJK UNIFIED IDEOGRAPH +0xF1C2 0x7587 #CJK UNIFIED IDEOGRAPH +0xF1C3 0x7C4C #CJK UNIFIED IDEOGRAPH +0xF1C4 0x7D02 #CJK UNIFIED IDEOGRAPH +0xF1C5 0x7D2C #CJK UNIFIED IDEOGRAPH +0xF1C6 0x7DA2 #CJK UNIFIED IDEOGRAPH +0xF1C7 0x821F #CJK UNIFIED IDEOGRAPH +0xF1C8 0x86DB #CJK UNIFIED IDEOGRAPH +0xF1C9 0x8A3B #CJK UNIFIED IDEOGRAPH +0xF1CA 0x8A85 #CJK UNIFIED IDEOGRAPH +0xF1CB 0x8D70 #CJK UNIFIED IDEOGRAPH +0xF1CC 0x8E8A #CJK UNIFIED IDEOGRAPH +0xF1CD 0x8F33 #CJK UNIFIED IDEOGRAPH +0xF1CE 0x9031 #CJK UNIFIED IDEOGRAPH +0xF1CF 0x914E #CJK UNIFIED IDEOGRAPH +0xF1D0 0x9152 #CJK UNIFIED IDEOGRAPH +0xF1D1 0x9444 #CJK UNIFIED IDEOGRAPH +0xF1D2 0x99D0 #CJK UNIFIED IDEOGRAPH +0xF1D3 0x7AF9 #CJK UNIFIED IDEOGRAPH +0xF1D4 0x7CA5 #CJK UNIFIED IDEOGRAPH +0xF1D5 0x4FCA #CJK UNIFIED IDEOGRAPH +0xF1D6 0x5101 #CJK UNIFIED IDEOGRAPH +0xF1D7 0x51C6 #CJK UNIFIED IDEOGRAPH +0xF1D8 0x57C8 #CJK UNIFIED IDEOGRAPH +0xF1D9 0x5BEF #CJK UNIFIED IDEOGRAPH +0xF1DA 0x5CFB #CJK UNIFIED IDEOGRAPH +0xF1DB 0x6659 #CJK UNIFIED IDEOGRAPH +0xF1DC 0x6A3D #CJK UNIFIED IDEOGRAPH +0xF1DD 0x6D5A #CJK UNIFIED IDEOGRAPH +0xF1DE 0x6E96 #CJK UNIFIED IDEOGRAPH +0xF1DF 0x6FEC #CJK UNIFIED IDEOGRAPH +0xF1E0 0x710C #CJK UNIFIED IDEOGRAPH +0xF1E1 0x756F #CJK UNIFIED IDEOGRAPH +0xF1E2 0x7AE3 #CJK UNIFIED IDEOGRAPH +0xF1E3 0x8822 #CJK UNIFIED IDEOGRAPH +0xF1E4 0x9021 #CJK UNIFIED IDEOGRAPH +0xF1E5 0x9075 #CJK UNIFIED IDEOGRAPH +0xF1E6 0x96CB #CJK UNIFIED IDEOGRAPH +0xF1E7 0x99FF #CJK UNIFIED IDEOGRAPH +0xF1E8 0x8301 #CJK UNIFIED IDEOGRAPH +0xF1E9 0x4E2D #CJK UNIFIED IDEOGRAPH +0xF1EA 0x4EF2 #CJK UNIFIED IDEOGRAPH +0xF1EB 0x8846 #CJK UNIFIED IDEOGRAPH +0xF1EC 0x91CD #CJK UNIFIED IDEOGRAPH +0xF1ED 0x537D #CJK UNIFIED IDEOGRAPH +0xF1EE 0x6ADB #CJK UNIFIED IDEOGRAPH +0xF1EF 0x696B #CJK UNIFIED IDEOGRAPH +0xF1F0 0x6C41 #CJK UNIFIED IDEOGRAPH +0xF1F1 0x847A #CJK UNIFIED IDEOGRAPH +0xF1F2 0x589E #CJK UNIFIED IDEOGRAPH +0xF1F3 0x618E #CJK UNIFIED IDEOGRAPH +0xF1F4 0x66FE #CJK UNIFIED IDEOGRAPH +0xF1F5 0x62EF #CJK UNIFIED IDEOGRAPH +0xF1F6 0x70DD #CJK UNIFIED IDEOGRAPH +0xF1F7 0x7511 #CJK UNIFIED IDEOGRAPH +0xF1F8 0x75C7 #CJK UNIFIED IDEOGRAPH +0xF1F9 0x7E52 #CJK UNIFIED IDEOGRAPH +0xF1FA 0x84B8 #CJK UNIFIED IDEOGRAPH +0xF1FB 0x8B49 #CJK UNIFIED IDEOGRAPH +0xF1FC 0x8D08 #CJK UNIFIED IDEOGRAPH +0xF1FD 0x4E4B #CJK UNIFIED IDEOGRAPH +0xF1FE 0x53EA #CJK UNIFIED IDEOGRAPH +0xF2A1 0x54AB #CJK UNIFIED IDEOGRAPH +0xF2A2 0x5730 #CJK UNIFIED IDEOGRAPH +0xF2A3 0x5740 #CJK UNIFIED IDEOGRAPH +0xF2A4 0x5FD7 #CJK UNIFIED IDEOGRAPH +0xF2A5 0x6301 #CJK UNIFIED IDEOGRAPH +0xF2A6 0x6307 #CJK UNIFIED IDEOGRAPH +0xF2A7 0x646F #CJK UNIFIED IDEOGRAPH +0xF2A8 0x652F #CJK UNIFIED IDEOGRAPH +0xF2A9 0x65E8 #CJK UNIFIED IDEOGRAPH +0xF2AA 0x667A #CJK UNIFIED IDEOGRAPH +0xF2AB 0x679D #CJK UNIFIED IDEOGRAPH +0xF2AC 0x67B3 #CJK UNIFIED IDEOGRAPH +0xF2AD 0x6B62 #CJK UNIFIED IDEOGRAPH +0xF2AE 0x6C60 #CJK UNIFIED IDEOGRAPH +0xF2AF 0x6C9A #CJK UNIFIED IDEOGRAPH +0xF2B0 0x6F2C #CJK UNIFIED IDEOGRAPH +0xF2B1 0x77E5 #CJK UNIFIED IDEOGRAPH +0xF2B2 0x7825 #CJK UNIFIED IDEOGRAPH +0xF2B3 0x7949 #CJK UNIFIED IDEOGRAPH +0xF2B4 0x7957 #CJK UNIFIED IDEOGRAPH +0xF2B5 0x7D19 #CJK UNIFIED IDEOGRAPH +0xF2B6 0x80A2 #CJK UNIFIED IDEOGRAPH +0xF2B7 0x8102 #CJK UNIFIED IDEOGRAPH +0xF2B8 0x81F3 #CJK UNIFIED IDEOGRAPH +0xF2B9 0x829D #CJK UNIFIED IDEOGRAPH +0xF2BA 0x82B7 #CJK UNIFIED IDEOGRAPH +0xF2BB 0x8718 #CJK UNIFIED IDEOGRAPH +0xF2BC 0x8A8C #CJK UNIFIED IDEOGRAPH +0xF2BD 0xF9FC #CJK COMPATIBILITY IDEOGRAPH +0xF2BE 0x8D04 #CJK UNIFIED IDEOGRAPH +0xF2BF 0x8DBE #CJK UNIFIED IDEOGRAPH +0xF2C0 0x9072 #CJK UNIFIED IDEOGRAPH +0xF2C1 0x76F4 #CJK UNIFIED IDEOGRAPH +0xF2C2 0x7A19 #CJK UNIFIED IDEOGRAPH +0xF2C3 0x7A37 #CJK UNIFIED IDEOGRAPH +0xF2C4 0x7E54 #CJK UNIFIED IDEOGRAPH +0xF2C5 0x8077 #CJK UNIFIED IDEOGRAPH +0xF2C6 0x5507 #CJK UNIFIED IDEOGRAPH +0xF2C7 0x55D4 #CJK UNIFIED IDEOGRAPH +0xF2C8 0x5875 #CJK UNIFIED IDEOGRAPH +0xF2C9 0x632F #CJK UNIFIED IDEOGRAPH +0xF2CA 0x6422 #CJK UNIFIED IDEOGRAPH +0xF2CB 0x6649 #CJK UNIFIED IDEOGRAPH +0xF2CC 0x664B #CJK UNIFIED IDEOGRAPH +0xF2CD 0x686D #CJK UNIFIED IDEOGRAPH +0xF2CE 0x699B #CJK UNIFIED IDEOGRAPH +0xF2CF 0x6B84 #CJK UNIFIED IDEOGRAPH +0xF2D0 0x6D25 #CJK UNIFIED IDEOGRAPH +0xF2D1 0x6EB1 #CJK UNIFIED IDEOGRAPH +0xF2D2 0x73CD #CJK UNIFIED IDEOGRAPH +0xF2D3 0x7468 #CJK UNIFIED IDEOGRAPH +0xF2D4 0x74A1 #CJK UNIFIED IDEOGRAPH +0xF2D5 0x755B #CJK UNIFIED IDEOGRAPH +0xF2D6 0x75B9 #CJK UNIFIED IDEOGRAPH +0xF2D7 0x76E1 #CJK UNIFIED IDEOGRAPH +0xF2D8 0x771E #CJK UNIFIED IDEOGRAPH +0xF2D9 0x778B #CJK UNIFIED IDEOGRAPH +0xF2DA 0x79E6 #CJK UNIFIED IDEOGRAPH +0xF2DB 0x7E09 #CJK UNIFIED IDEOGRAPH +0xF2DC 0x7E1D #CJK UNIFIED IDEOGRAPH +0xF2DD 0x81FB #CJK UNIFIED IDEOGRAPH +0xF2DE 0x852F #CJK UNIFIED IDEOGRAPH +0xF2DF 0x8897 #CJK UNIFIED IDEOGRAPH +0xF2E0 0x8A3A #CJK UNIFIED IDEOGRAPH +0xF2E1 0x8CD1 #CJK UNIFIED IDEOGRAPH +0xF2E2 0x8EEB #CJK UNIFIED IDEOGRAPH +0xF2E3 0x8FB0 #CJK UNIFIED IDEOGRAPH +0xF2E4 0x9032 #CJK UNIFIED IDEOGRAPH +0xF2E5 0x93AD #CJK UNIFIED IDEOGRAPH +0xF2E6 0x9663 #CJK UNIFIED IDEOGRAPH +0xF2E7 0x9673 #CJK UNIFIED IDEOGRAPH +0xF2E8 0x9707 #CJK UNIFIED IDEOGRAPH +0xF2E9 0x4F84 #CJK UNIFIED IDEOGRAPH +0xF2EA 0x53F1 #CJK UNIFIED IDEOGRAPH +0xF2EB 0x59EA #CJK UNIFIED IDEOGRAPH +0xF2EC 0x5AC9 #CJK UNIFIED IDEOGRAPH +0xF2ED 0x5E19 #CJK UNIFIED IDEOGRAPH +0xF2EE 0x684E #CJK UNIFIED IDEOGRAPH +0xF2EF 0x74C6 #CJK UNIFIED IDEOGRAPH +0xF2F0 0x75BE #CJK UNIFIED IDEOGRAPH +0xF2F1 0x79E9 #CJK UNIFIED IDEOGRAPH +0xF2F2 0x7A92 #CJK UNIFIED IDEOGRAPH +0xF2F3 0x81A3 #CJK UNIFIED IDEOGRAPH +0xF2F4 0x86ED #CJK UNIFIED IDEOGRAPH +0xF2F5 0x8CEA #CJK UNIFIED IDEOGRAPH +0xF2F6 0x8DCC #CJK UNIFIED IDEOGRAPH +0xF2F7 0x8FED #CJK UNIFIED IDEOGRAPH +0xF2F8 0x659F #CJK UNIFIED IDEOGRAPH +0xF2F9 0x6715 #CJK UNIFIED IDEOGRAPH +0xF2FA 0xF9FD #CJK COMPATIBILITY IDEOGRAPH +0xF2FB 0x57F7 #CJK UNIFIED IDEOGRAPH +0xF2FC 0x6F57 #CJK UNIFIED IDEOGRAPH +0xF2FD 0x7DDD #CJK UNIFIED IDEOGRAPH +0xF2FE 0x8F2F #CJK UNIFIED IDEOGRAPH +0xF3A1 0x93F6 #CJK UNIFIED IDEOGRAPH +0xF3A2 0x96C6 #CJK UNIFIED IDEOGRAPH +0xF3A3 0x5FB5 #CJK UNIFIED IDEOGRAPH +0xF3A4 0x61F2 #CJK UNIFIED IDEOGRAPH +0xF3A5 0x6F84 #CJK UNIFIED IDEOGRAPH +0xF3A6 0x4E14 #CJK UNIFIED IDEOGRAPH +0xF3A7 0x4F98 #CJK UNIFIED IDEOGRAPH +0xF3A8 0x501F #CJK UNIFIED IDEOGRAPH +0xF3A9 0x53C9 #CJK UNIFIED IDEOGRAPH +0xF3AA 0x55DF #CJK UNIFIED IDEOGRAPH +0xF3AB 0x5D6F #CJK UNIFIED IDEOGRAPH +0xF3AC 0x5DEE #CJK UNIFIED IDEOGRAPH +0xF3AD 0x6B21 #CJK UNIFIED IDEOGRAPH +0xF3AE 0x6B64 #CJK UNIFIED IDEOGRAPH +0xF3AF 0x78CB #CJK UNIFIED IDEOGRAPH +0xF3B0 0x7B9A #CJK UNIFIED IDEOGRAPH +0xF3B1 0xF9FE #CJK COMPATIBILITY IDEOGRAPH +0xF3B2 0x8E49 #CJK UNIFIED IDEOGRAPH +0xF3B3 0x8ECA #CJK UNIFIED IDEOGRAPH +0xF3B4 0x906E #CJK UNIFIED IDEOGRAPH +0xF3B5 0x6349 #CJK UNIFIED IDEOGRAPH +0xF3B6 0x643E #CJK UNIFIED IDEOGRAPH +0xF3B7 0x7740 #CJK UNIFIED IDEOGRAPH +0xF3B8 0x7A84 #CJK UNIFIED IDEOGRAPH +0xF3B9 0x932F #CJK UNIFIED IDEOGRAPH +0xF3BA 0x947F #CJK UNIFIED IDEOGRAPH +0xF3BB 0x9F6A #CJK UNIFIED IDEOGRAPH +0xF3BC 0x64B0 #CJK UNIFIED IDEOGRAPH +0xF3BD 0x6FAF #CJK UNIFIED IDEOGRAPH +0xF3BE 0x71E6 #CJK UNIFIED IDEOGRAPH +0xF3BF 0x74A8 #CJK UNIFIED IDEOGRAPH +0xF3C0 0x74DA #CJK UNIFIED IDEOGRAPH +0xF3C1 0x7AC4 #CJK UNIFIED IDEOGRAPH +0xF3C2 0x7C12 #CJK UNIFIED IDEOGRAPH +0xF3C3 0x7E82 #CJK UNIFIED IDEOGRAPH +0xF3C4 0x7CB2 #CJK UNIFIED IDEOGRAPH +0xF3C5 0x7E98 #CJK UNIFIED IDEOGRAPH +0xF3C6 0x8B9A #CJK UNIFIED IDEOGRAPH +0xF3C7 0x8D0A #CJK UNIFIED IDEOGRAPH +0xF3C8 0x947D #CJK UNIFIED IDEOGRAPH +0xF3C9 0x9910 #CJK UNIFIED IDEOGRAPH +0xF3CA 0x994C #CJK UNIFIED IDEOGRAPH +0xF3CB 0x5239 #CJK UNIFIED IDEOGRAPH +0xF3CC 0x5BDF #CJK UNIFIED IDEOGRAPH +0xF3CD 0x64E6 #CJK UNIFIED IDEOGRAPH +0xF3CE 0x672D #CJK UNIFIED IDEOGRAPH +0xF3CF 0x7D2E #CJK UNIFIED IDEOGRAPH +0xF3D0 0x50ED #CJK UNIFIED IDEOGRAPH +0xF3D1 0x53C3 #CJK UNIFIED IDEOGRAPH +0xF3D2 0x5879 #CJK UNIFIED IDEOGRAPH +0xF3D3 0x6158 #CJK UNIFIED IDEOGRAPH +0xF3D4 0x6159 #CJK UNIFIED IDEOGRAPH +0xF3D5 0x61FA #CJK UNIFIED IDEOGRAPH +0xF3D6 0x65AC #CJK UNIFIED IDEOGRAPH +0xF3D7 0x7AD9 #CJK UNIFIED IDEOGRAPH +0xF3D8 0x8B92 #CJK UNIFIED IDEOGRAPH +0xF3D9 0x8B96 #CJK UNIFIED IDEOGRAPH +0xF3DA 0x5009 #CJK UNIFIED IDEOGRAPH +0xF3DB 0x5021 #CJK UNIFIED IDEOGRAPH +0xF3DC 0x5275 #CJK UNIFIED IDEOGRAPH +0xF3DD 0x5531 #CJK UNIFIED IDEOGRAPH +0xF3DE 0x5A3C #CJK UNIFIED IDEOGRAPH +0xF3DF 0x5EE0 #CJK UNIFIED IDEOGRAPH +0xF3E0 0x5F70 #CJK UNIFIED IDEOGRAPH +0xF3E1 0x6134 #CJK UNIFIED IDEOGRAPH +0xF3E2 0x655E #CJK UNIFIED IDEOGRAPH +0xF3E3 0x660C #CJK UNIFIED IDEOGRAPH +0xF3E4 0x6636 #CJK UNIFIED IDEOGRAPH +0xF3E5 0x66A2 #CJK UNIFIED IDEOGRAPH +0xF3E6 0x69CD #CJK UNIFIED IDEOGRAPH +0xF3E7 0x6EC4 #CJK UNIFIED IDEOGRAPH +0xF3E8 0x6F32 #CJK UNIFIED IDEOGRAPH +0xF3E9 0x7316 #CJK UNIFIED IDEOGRAPH +0xF3EA 0x7621 #CJK UNIFIED IDEOGRAPH +0xF3EB 0x7A93 #CJK UNIFIED IDEOGRAPH +0xF3EC 0x8139 #CJK UNIFIED IDEOGRAPH +0xF3ED 0x8259 #CJK UNIFIED IDEOGRAPH +0xF3EE 0x83D6 #CJK UNIFIED IDEOGRAPH +0xF3EF 0x84BC #CJK UNIFIED IDEOGRAPH +0xF3F0 0x50B5 #CJK UNIFIED IDEOGRAPH +0xF3F1 0x57F0 #CJK UNIFIED IDEOGRAPH +0xF3F2 0x5BC0 #CJK UNIFIED IDEOGRAPH +0xF3F3 0x5BE8 #CJK UNIFIED IDEOGRAPH +0xF3F4 0x5F69 #CJK UNIFIED IDEOGRAPH +0xF3F5 0x63A1 #CJK UNIFIED IDEOGRAPH +0xF3F6 0x7826 #CJK UNIFIED IDEOGRAPH +0xF3F7 0x7DB5 #CJK UNIFIED IDEOGRAPH +0xF3F8 0x83DC #CJK UNIFIED IDEOGRAPH +0xF3F9 0x8521 #CJK UNIFIED IDEOGRAPH +0xF3FA 0x91C7 #CJK UNIFIED IDEOGRAPH +0xF3FB 0x91F5 #CJK UNIFIED IDEOGRAPH +0xF3FC 0x518A #CJK UNIFIED IDEOGRAPH +0xF3FD 0x67F5 #CJK UNIFIED IDEOGRAPH +0xF3FE 0x7B56 #CJK UNIFIED IDEOGRAPH +0xF4A1 0x8CAC #CJK UNIFIED IDEOGRAPH +0xF4A2 0x51C4 #CJK UNIFIED IDEOGRAPH +0xF4A3 0x59BB #CJK UNIFIED IDEOGRAPH +0xF4A4 0x60BD #CJK UNIFIED IDEOGRAPH +0xF4A5 0x8655 #CJK UNIFIED IDEOGRAPH +0xF4A6 0x501C #CJK UNIFIED IDEOGRAPH +0xF4A7 0xF9FF #CJK COMPATIBILITY IDEOGRAPH +0xF4A8 0x5254 #CJK UNIFIED IDEOGRAPH +0xF4A9 0x5C3A #CJK UNIFIED IDEOGRAPH +0xF4AA 0x617D #CJK UNIFIED IDEOGRAPH +0xF4AB 0x621A #CJK UNIFIED IDEOGRAPH +0xF4AC 0x62D3 #CJK UNIFIED IDEOGRAPH +0xF4AD 0x64F2 #CJK UNIFIED IDEOGRAPH +0xF4AE 0x65A5 #CJK UNIFIED IDEOGRAPH +0xF4AF 0x6ECC #CJK UNIFIED IDEOGRAPH +0xF4B0 0x7620 #CJK UNIFIED IDEOGRAPH +0xF4B1 0x810A #CJK UNIFIED IDEOGRAPH +0xF4B2 0x8E60 #CJK UNIFIED IDEOGRAPH +0xF4B3 0x965F #CJK UNIFIED IDEOGRAPH +0xF4B4 0x96BB #CJK UNIFIED IDEOGRAPH +0xF4B5 0x4EDF #CJK UNIFIED IDEOGRAPH +0xF4B6 0x5343 #CJK UNIFIED IDEOGRAPH +0xF4B7 0x5598 #CJK UNIFIED IDEOGRAPH +0xF4B8 0x5929 #CJK UNIFIED IDEOGRAPH +0xF4B9 0x5DDD #CJK UNIFIED IDEOGRAPH +0xF4BA 0x64C5 #CJK UNIFIED IDEOGRAPH +0xF4BB 0x6CC9 #CJK UNIFIED IDEOGRAPH +0xF4BC 0x6DFA #CJK UNIFIED IDEOGRAPH +0xF4BD 0x7394 #CJK UNIFIED IDEOGRAPH +0xF4BE 0x7A7F #CJK UNIFIED IDEOGRAPH +0xF4BF 0x821B #CJK UNIFIED IDEOGRAPH +0xF4C0 0x85A6 #CJK UNIFIED IDEOGRAPH +0xF4C1 0x8CE4 #CJK UNIFIED IDEOGRAPH +0xF4C2 0x8E10 #CJK UNIFIED IDEOGRAPH +0xF4C3 0x9077 #CJK UNIFIED IDEOGRAPH +0xF4C4 0x91E7 #CJK UNIFIED IDEOGRAPH +0xF4C5 0x95E1 #CJK UNIFIED IDEOGRAPH +0xF4C6 0x9621 #CJK UNIFIED IDEOGRAPH +0xF4C7 0x97C6 #CJK UNIFIED IDEOGRAPH +0xF4C8 0x51F8 #CJK UNIFIED IDEOGRAPH +0xF4C9 0x54F2 #CJK UNIFIED IDEOGRAPH +0xF4CA 0x5586 #CJK UNIFIED IDEOGRAPH +0xF4CB 0x5FB9 #CJK UNIFIED IDEOGRAPH +0xF4CC 0x64A4 #CJK UNIFIED IDEOGRAPH +0xF4CD 0x6F88 #CJK UNIFIED IDEOGRAPH +0xF4CE 0x7DB4 #CJK UNIFIED IDEOGRAPH +0xF4CF 0x8F1F #CJK UNIFIED IDEOGRAPH +0xF4D0 0x8F4D #CJK UNIFIED IDEOGRAPH +0xF4D1 0x9435 #CJK UNIFIED IDEOGRAPH +0xF4D2 0x50C9 #CJK UNIFIED IDEOGRAPH +0xF4D3 0x5C16 #CJK UNIFIED IDEOGRAPH +0xF4D4 0x6CBE #CJK UNIFIED IDEOGRAPH +0xF4D5 0x6DFB #CJK UNIFIED IDEOGRAPH +0xF4D6 0x751B #CJK UNIFIED IDEOGRAPH +0xF4D7 0x77BB #CJK UNIFIED IDEOGRAPH +0xF4D8 0x7C3D #CJK UNIFIED IDEOGRAPH +0xF4D9 0x7C64 #CJK UNIFIED IDEOGRAPH +0xF4DA 0x8A79 #CJK UNIFIED IDEOGRAPH +0xF4DB 0x8AC2 #CJK UNIFIED IDEOGRAPH +0xF4DC 0x581E #CJK UNIFIED IDEOGRAPH +0xF4DD 0x59BE #CJK UNIFIED IDEOGRAPH +0xF4DE 0x5E16 #CJK UNIFIED IDEOGRAPH +0xF4DF 0x6377 #CJK UNIFIED IDEOGRAPH +0xF4E0 0x7252 #CJK UNIFIED IDEOGRAPH +0xF4E1 0x758A #CJK UNIFIED IDEOGRAPH +0xF4E2 0x776B #CJK UNIFIED IDEOGRAPH +0xF4E3 0x8ADC #CJK UNIFIED IDEOGRAPH +0xF4E4 0x8CBC #CJK UNIFIED IDEOGRAPH +0xF4E5 0x8F12 #CJK UNIFIED IDEOGRAPH +0xF4E6 0x5EF3 #CJK UNIFIED IDEOGRAPH +0xF4E7 0x6674 #CJK UNIFIED IDEOGRAPH +0xF4E8 0x6DF8 #CJK UNIFIED IDEOGRAPH +0xF4E9 0x807D #CJK UNIFIED IDEOGRAPH +0xF4EA 0x83C1 #CJK UNIFIED IDEOGRAPH +0xF4EB 0x8ACB #CJK UNIFIED IDEOGRAPH +0xF4EC 0x9751 #CJK UNIFIED IDEOGRAPH +0xF4ED 0x9BD6 #CJK UNIFIED IDEOGRAPH +0xF4EE 0xFA00 #CJK COMPATIBILITY IDEOGRAPH +0xF4EF 0x5243 #CJK UNIFIED IDEOGRAPH +0xF4F0 0x66FF #CJK UNIFIED IDEOGRAPH +0xF4F1 0x6D95 #CJK UNIFIED IDEOGRAPH +0xF4F2 0x6EEF #CJK UNIFIED IDEOGRAPH +0xF4F3 0x7DE0 #CJK UNIFIED IDEOGRAPH +0xF4F4 0x8AE6 #CJK UNIFIED IDEOGRAPH +0xF4F5 0x902E #CJK UNIFIED IDEOGRAPH +0xF4F6 0x905E #CJK UNIFIED IDEOGRAPH +0xF4F7 0x9AD4 #CJK UNIFIED IDEOGRAPH +0xF4F8 0x521D #CJK UNIFIED IDEOGRAPH +0xF4F9 0x527F #CJK UNIFIED IDEOGRAPH +0xF4FA 0x54E8 #CJK UNIFIED IDEOGRAPH +0xF4FB 0x6194 #CJK UNIFIED IDEOGRAPH +0xF4FC 0x6284 #CJK UNIFIED IDEOGRAPH +0xF4FD 0x62DB #CJK UNIFIED IDEOGRAPH +0xF4FE 0x68A2 #CJK UNIFIED IDEOGRAPH +0xF5A1 0x6912 #CJK UNIFIED IDEOGRAPH +0xF5A2 0x695A #CJK UNIFIED IDEOGRAPH +0xF5A3 0x6A35 #CJK UNIFIED IDEOGRAPH +0xF5A4 0x7092 #CJK UNIFIED IDEOGRAPH +0xF5A5 0x7126 #CJK UNIFIED IDEOGRAPH +0xF5A6 0x785D #CJK UNIFIED IDEOGRAPH +0xF5A7 0x7901 #CJK UNIFIED IDEOGRAPH +0xF5A8 0x790E #CJK UNIFIED IDEOGRAPH +0xF5A9 0x79D2 #CJK UNIFIED IDEOGRAPH +0xF5AA 0x7A0D #CJK UNIFIED IDEOGRAPH +0xF5AB 0x8096 #CJK UNIFIED IDEOGRAPH +0xF5AC 0x8278 #CJK UNIFIED IDEOGRAPH +0xF5AD 0x82D5 #CJK UNIFIED IDEOGRAPH +0xF5AE 0x8349 #CJK UNIFIED IDEOGRAPH +0xF5AF 0x8549 #CJK UNIFIED IDEOGRAPH +0xF5B0 0x8C82 #CJK UNIFIED IDEOGRAPH +0xF5B1 0x8D85 #CJK UNIFIED IDEOGRAPH +0xF5B2 0x9162 #CJK UNIFIED IDEOGRAPH +0xF5B3 0x918B #CJK UNIFIED IDEOGRAPH +0xF5B4 0x91AE #CJK UNIFIED IDEOGRAPH +0xF5B5 0x4FC3 #CJK UNIFIED IDEOGRAPH +0xF5B6 0x56D1 #CJK UNIFIED IDEOGRAPH +0xF5B7 0x71ED #CJK UNIFIED IDEOGRAPH +0xF5B8 0x77D7 #CJK UNIFIED IDEOGRAPH +0xF5B9 0x8700 #CJK UNIFIED IDEOGRAPH +0xF5BA 0x89F8 #CJK UNIFIED IDEOGRAPH +0xF5BB 0x5BF8 #CJK UNIFIED IDEOGRAPH +0xF5BC 0x5FD6 #CJK UNIFIED IDEOGRAPH +0xF5BD 0x6751 #CJK UNIFIED IDEOGRAPH +0xF5BE 0x90A8 #CJK UNIFIED IDEOGRAPH +0xF5BF 0x53E2 #CJK UNIFIED IDEOGRAPH +0xF5C0 0x585A #CJK UNIFIED IDEOGRAPH +0xF5C1 0x5BF5 #CJK UNIFIED IDEOGRAPH +0xF5C2 0x60A4 #CJK UNIFIED IDEOGRAPH +0xF5C3 0x6181 #CJK UNIFIED IDEOGRAPH +0xF5C4 0x6460 #CJK UNIFIED IDEOGRAPH +0xF5C5 0x7E3D #CJK UNIFIED IDEOGRAPH +0xF5C6 0x8070 #CJK UNIFIED IDEOGRAPH +0xF5C7 0x8525 #CJK UNIFIED IDEOGRAPH +0xF5C8 0x9283 #CJK UNIFIED IDEOGRAPH +0xF5C9 0x64AE #CJK UNIFIED IDEOGRAPH +0xF5CA 0x50AC #CJK UNIFIED IDEOGRAPH +0xF5CB 0x5D14 #CJK UNIFIED IDEOGRAPH +0xF5CC 0x6700 #CJK UNIFIED IDEOGRAPH +0xF5CD 0x589C #CJK UNIFIED IDEOGRAPH +0xF5CE 0x62BD #CJK UNIFIED IDEOGRAPH +0xF5CF 0x63A8 #CJK UNIFIED IDEOGRAPH +0xF5D0 0x690E #CJK UNIFIED IDEOGRAPH +0xF5D1 0x6978 #CJK UNIFIED IDEOGRAPH +0xF5D2 0x6A1E #CJK UNIFIED IDEOGRAPH +0xF5D3 0x6E6B #CJK UNIFIED IDEOGRAPH +0xF5D4 0x76BA #CJK UNIFIED IDEOGRAPH +0xF5D5 0x79CB #CJK UNIFIED IDEOGRAPH +0xF5D6 0x82BB #CJK UNIFIED IDEOGRAPH +0xF5D7 0x8429 #CJK UNIFIED IDEOGRAPH +0xF5D8 0x8ACF #CJK UNIFIED IDEOGRAPH +0xF5D9 0x8DA8 #CJK UNIFIED IDEOGRAPH +0xF5DA 0x8FFD #CJK UNIFIED IDEOGRAPH +0xF5DB 0x9112 #CJK UNIFIED IDEOGRAPH +0xF5DC 0x914B #CJK UNIFIED IDEOGRAPH +0xF5DD 0x919C #CJK UNIFIED IDEOGRAPH +0xF5DE 0x9310 #CJK UNIFIED IDEOGRAPH +0xF5DF 0x9318 #CJK UNIFIED IDEOGRAPH +0xF5E0 0x939A #CJK UNIFIED IDEOGRAPH +0xF5E1 0x96DB #CJK UNIFIED IDEOGRAPH +0xF5E2 0x9A36 #CJK UNIFIED IDEOGRAPH +0xF5E3 0x9C0D #CJK UNIFIED IDEOGRAPH +0xF5E4 0x4E11 #CJK UNIFIED IDEOGRAPH +0xF5E5 0x755C #CJK UNIFIED IDEOGRAPH +0xF5E6 0x795D #CJK UNIFIED IDEOGRAPH +0xF5E7 0x7AFA #CJK UNIFIED IDEOGRAPH +0xF5E8 0x7B51 #CJK UNIFIED IDEOGRAPH +0xF5E9 0x7BC9 #CJK UNIFIED IDEOGRAPH +0xF5EA 0x7E2E #CJK UNIFIED IDEOGRAPH +0xF5EB 0x84C4 #CJK UNIFIED IDEOGRAPH +0xF5EC 0x8E59 #CJK UNIFIED IDEOGRAPH +0xF5ED 0x8E74 #CJK UNIFIED IDEOGRAPH +0xF5EE 0x8EF8 #CJK UNIFIED IDEOGRAPH +0xF5EF 0x9010 #CJK UNIFIED IDEOGRAPH +0xF5F0 0x6625 #CJK UNIFIED IDEOGRAPH +0xF5F1 0x693F #CJK UNIFIED IDEOGRAPH +0xF5F2 0x7443 #CJK UNIFIED IDEOGRAPH +0xF5F3 0x51FA #CJK UNIFIED IDEOGRAPH +0xF5F4 0x672E #CJK UNIFIED IDEOGRAPH +0xF5F5 0x9EDC #CJK UNIFIED IDEOGRAPH +0xF5F6 0x5145 #CJK UNIFIED IDEOGRAPH +0xF5F7 0x5FE0 #CJK UNIFIED IDEOGRAPH +0xF5F8 0x6C96 #CJK UNIFIED IDEOGRAPH +0xF5F9 0x87F2 #CJK UNIFIED IDEOGRAPH +0xF5FA 0x885D #CJK UNIFIED IDEOGRAPH +0xF5FB 0x8877 #CJK UNIFIED IDEOGRAPH +0xF5FC 0x60B4 #CJK UNIFIED IDEOGRAPH +0xF5FD 0x81B5 #CJK UNIFIED IDEOGRAPH +0xF5FE 0x8403 #CJK UNIFIED IDEOGRAPH +0xF6A1 0x8D05 #CJK UNIFIED IDEOGRAPH +0xF6A2 0x53D6 #CJK UNIFIED IDEOGRAPH +0xF6A3 0x5439 #CJK UNIFIED IDEOGRAPH +0xF6A4 0x5634 #CJK UNIFIED IDEOGRAPH +0xF6A5 0x5A36 #CJK UNIFIED IDEOGRAPH +0xF6A6 0x5C31 #CJK UNIFIED IDEOGRAPH +0xF6A7 0x708A #CJK UNIFIED IDEOGRAPH +0xF6A8 0x7FE0 #CJK UNIFIED IDEOGRAPH +0xF6A9 0x805A #CJK UNIFIED IDEOGRAPH +0xF6AA 0x8106 #CJK UNIFIED IDEOGRAPH +0xF6AB 0x81ED #CJK UNIFIED IDEOGRAPH +0xF6AC 0x8DA3 #CJK UNIFIED IDEOGRAPH +0xF6AD 0x9189 #CJK UNIFIED IDEOGRAPH +0xF6AE 0x9A5F #CJK UNIFIED IDEOGRAPH +0xF6AF 0x9DF2 #CJK UNIFIED IDEOGRAPH +0xF6B0 0x5074 #CJK UNIFIED IDEOGRAPH +0xF6B1 0x4EC4 #CJK UNIFIED IDEOGRAPH +0xF6B2 0x53A0 #CJK UNIFIED IDEOGRAPH +0xF6B3 0x60FB #CJK UNIFIED IDEOGRAPH +0xF6B4 0x6E2C #CJK UNIFIED IDEOGRAPH +0xF6B5 0x5C64 #CJK UNIFIED IDEOGRAPH +0xF6B6 0x4F88 #CJK UNIFIED IDEOGRAPH +0xF6B7 0x5024 #CJK UNIFIED IDEOGRAPH +0xF6B8 0x55E4 #CJK UNIFIED IDEOGRAPH +0xF6B9 0x5CD9 #CJK UNIFIED IDEOGRAPH +0xF6BA 0x5E5F #CJK UNIFIED IDEOGRAPH +0xF6BB 0x6065 #CJK UNIFIED IDEOGRAPH +0xF6BC 0x6894 #CJK UNIFIED IDEOGRAPH +0xF6BD 0x6CBB #CJK UNIFIED IDEOGRAPH +0xF6BE 0x6DC4 #CJK UNIFIED IDEOGRAPH +0xF6BF 0x71BE #CJK UNIFIED IDEOGRAPH +0xF6C0 0x75D4 #CJK UNIFIED IDEOGRAPH +0xF6C1 0x75F4 #CJK UNIFIED IDEOGRAPH +0xF6C2 0x7661 #CJK UNIFIED IDEOGRAPH +0xF6C3 0x7A1A #CJK UNIFIED IDEOGRAPH +0xF6C4 0x7A49 #CJK UNIFIED IDEOGRAPH +0xF6C5 0x7DC7 #CJK UNIFIED IDEOGRAPH +0xF6C6 0x7DFB #CJK UNIFIED IDEOGRAPH +0xF6C7 0x7F6E #CJK UNIFIED IDEOGRAPH +0xF6C8 0x81F4 #CJK UNIFIED IDEOGRAPH +0xF6C9 0x86A9 #CJK UNIFIED IDEOGRAPH +0xF6CA 0x8F1C #CJK UNIFIED IDEOGRAPH +0xF6CB 0x96C9 #CJK UNIFIED IDEOGRAPH +0xF6CC 0x99B3 #CJK UNIFIED IDEOGRAPH +0xF6CD 0x9F52 #CJK UNIFIED IDEOGRAPH +0xF6CE 0x5247 #CJK UNIFIED IDEOGRAPH +0xF6CF 0x52C5 #CJK UNIFIED IDEOGRAPH +0xF6D0 0x98ED #CJK UNIFIED IDEOGRAPH +0xF6D1 0x89AA #CJK UNIFIED IDEOGRAPH +0xF6D2 0x4E03 #CJK UNIFIED IDEOGRAPH +0xF6D3 0x67D2 #CJK UNIFIED IDEOGRAPH +0xF6D4 0x6F06 #CJK UNIFIED IDEOGRAPH +0xF6D5 0x4FB5 #CJK UNIFIED IDEOGRAPH +0xF6D6 0x5BE2 #CJK UNIFIED IDEOGRAPH +0xF6D7 0x6795 #CJK UNIFIED IDEOGRAPH +0xF6D8 0x6C88 #CJK UNIFIED IDEOGRAPH +0xF6D9 0x6D78 #CJK UNIFIED IDEOGRAPH +0xF6DA 0x741B #CJK UNIFIED IDEOGRAPH +0xF6DB 0x7827 #CJK UNIFIED IDEOGRAPH +0xF6DC 0x91DD #CJK UNIFIED IDEOGRAPH +0xF6DD 0x937C #CJK UNIFIED IDEOGRAPH +0xF6DE 0x87C4 #CJK UNIFIED IDEOGRAPH +0xF6DF 0x79E4 #CJK UNIFIED IDEOGRAPH +0xF6E0 0x7A31 #CJK UNIFIED IDEOGRAPH +0xF6E1 0x5FEB #CJK UNIFIED IDEOGRAPH +0xF6E2 0x4ED6 #CJK UNIFIED IDEOGRAPH +0xF6E3 0x54A4 #CJK UNIFIED IDEOGRAPH +0xF6E4 0x553E #CJK UNIFIED IDEOGRAPH +0xF6E5 0x58AE #CJK UNIFIED IDEOGRAPH +0xF6E6 0x59A5 #CJK UNIFIED IDEOGRAPH +0xF6E7 0x60F0 #CJK UNIFIED IDEOGRAPH +0xF6E8 0x6253 #CJK UNIFIED IDEOGRAPH +0xF6E9 0x62D6 #CJK UNIFIED IDEOGRAPH +0xF6EA 0x6736 #CJK UNIFIED IDEOGRAPH +0xF6EB 0x6955 #CJK UNIFIED IDEOGRAPH +0xF6EC 0x8235 #CJK UNIFIED IDEOGRAPH +0xF6ED 0x9640 #CJK UNIFIED IDEOGRAPH +0xF6EE 0x99B1 #CJK UNIFIED IDEOGRAPH +0xF6EF 0x99DD #CJK UNIFIED IDEOGRAPH +0xF6F0 0x502C #CJK UNIFIED IDEOGRAPH +0xF6F1 0x5353 #CJK UNIFIED IDEOGRAPH +0xF6F2 0x5544 #CJK UNIFIED IDEOGRAPH +0xF6F3 0x577C #CJK UNIFIED IDEOGRAPH +0xF6F4 0xFA01 #CJK COMPATIBILITY IDEOGRAPH +0xF6F5 0x6258 #CJK UNIFIED IDEOGRAPH +0xF6F6 0xFA02 #CJK COMPATIBILITY IDEOGRAPH +0xF6F7 0x64E2 #CJK UNIFIED IDEOGRAPH +0xF6F8 0x666B #CJK UNIFIED IDEOGRAPH +0xF6F9 0x67DD #CJK UNIFIED IDEOGRAPH +0xF6FA 0x6FC1 #CJK UNIFIED IDEOGRAPH +0xF6FB 0x6FEF #CJK UNIFIED IDEOGRAPH +0xF6FC 0x7422 #CJK UNIFIED IDEOGRAPH +0xF6FD 0x7438 #CJK UNIFIED IDEOGRAPH +0xF6FE 0x8A17 #CJK UNIFIED IDEOGRAPH +0xF7A1 0x9438 #CJK UNIFIED IDEOGRAPH +0xF7A2 0x5451 #CJK UNIFIED IDEOGRAPH +0xF7A3 0x5606 #CJK UNIFIED IDEOGRAPH +0xF7A4 0x5766 #CJK UNIFIED IDEOGRAPH +0xF7A5 0x5F48 #CJK UNIFIED IDEOGRAPH +0xF7A6 0x619A #CJK UNIFIED IDEOGRAPH +0xF7A7 0x6B4E #CJK UNIFIED IDEOGRAPH +0xF7A8 0x7058 #CJK UNIFIED IDEOGRAPH +0xF7A9 0x70AD #CJK UNIFIED IDEOGRAPH +0xF7AA 0x7DBB #CJK UNIFIED IDEOGRAPH +0xF7AB 0x8A95 #CJK UNIFIED IDEOGRAPH +0xF7AC 0x596A #CJK UNIFIED IDEOGRAPH +0xF7AD 0x812B #CJK UNIFIED IDEOGRAPH +0xF7AE 0x63A2 #CJK UNIFIED IDEOGRAPH +0xF7AF 0x7708 #CJK UNIFIED IDEOGRAPH +0xF7B0 0x803D #CJK UNIFIED IDEOGRAPH +0xF7B1 0x8CAA #CJK UNIFIED IDEOGRAPH +0xF7B2 0x5854 #CJK UNIFIED IDEOGRAPH +0xF7B3 0x642D #CJK UNIFIED IDEOGRAPH +0xF7B4 0x69BB #CJK UNIFIED IDEOGRAPH +0xF7B5 0x5B95 #CJK UNIFIED IDEOGRAPH +0xF7B6 0x5E11 #CJK UNIFIED IDEOGRAPH +0xF7B7 0x6E6F #CJK UNIFIED IDEOGRAPH +0xF7B8 0xFA03 #CJK COMPATIBILITY IDEOGRAPH +0xF7B9 0x8569 #CJK UNIFIED IDEOGRAPH +0xF7BA 0x514C #CJK UNIFIED IDEOGRAPH +0xF7BB 0x53F0 #CJK UNIFIED IDEOGRAPH +0xF7BC 0x592A #CJK UNIFIED IDEOGRAPH +0xF7BD 0x6020 #CJK UNIFIED IDEOGRAPH +0xF7BE 0x614B #CJK UNIFIED IDEOGRAPH +0xF7BF 0x6B86 #CJK UNIFIED IDEOGRAPH +0xF7C0 0x6C70 #CJK UNIFIED IDEOGRAPH +0xF7C1 0x6CF0 #CJK UNIFIED IDEOGRAPH +0xF7C2 0x7B1E #CJK UNIFIED IDEOGRAPH +0xF7C3 0x80CE #CJK UNIFIED IDEOGRAPH +0xF7C4 0x82D4 #CJK UNIFIED IDEOGRAPH +0xF7C5 0x8DC6 #CJK UNIFIED IDEOGRAPH +0xF7C6 0x90B0 #CJK UNIFIED IDEOGRAPH +0xF7C7 0x98B1 #CJK UNIFIED IDEOGRAPH +0xF7C8 0xFA04 #CJK COMPATIBILITY IDEOGRAPH +0xF7C9 0x64C7 #CJK UNIFIED IDEOGRAPH +0xF7CA 0x6FA4 #CJK UNIFIED IDEOGRAPH +0xF7CB 0x6491 #CJK UNIFIED IDEOGRAPH +0xF7CC 0x6504 #CJK UNIFIED IDEOGRAPH +0xF7CD 0x514E #CJK UNIFIED IDEOGRAPH +0xF7CE 0x5410 #CJK UNIFIED IDEOGRAPH +0xF7CF 0x571F #CJK UNIFIED IDEOGRAPH +0xF7D0 0x8A0E #CJK UNIFIED IDEOGRAPH +0xF7D1 0x615F #CJK UNIFIED IDEOGRAPH +0xF7D2 0x6876 #CJK UNIFIED IDEOGRAPH +0xF7D3 0xFA05 #CJK COMPATIBILITY IDEOGRAPH +0xF7D4 0x75DB #CJK UNIFIED IDEOGRAPH +0xF7D5 0x7B52 #CJK UNIFIED IDEOGRAPH +0xF7D6 0x7D71 #CJK UNIFIED IDEOGRAPH +0xF7D7 0x901A #CJK UNIFIED IDEOGRAPH +0xF7D8 0x5806 #CJK UNIFIED IDEOGRAPH +0xF7D9 0x69CC #CJK UNIFIED IDEOGRAPH +0xF7DA 0x817F #CJK UNIFIED IDEOGRAPH +0xF7DB 0x892A #CJK UNIFIED IDEOGRAPH +0xF7DC 0x9000 #CJK UNIFIED IDEOGRAPH +0xF7DD 0x9839 #CJK UNIFIED IDEOGRAPH +0xF7DE 0x5078 #CJK UNIFIED IDEOGRAPH +0xF7DF 0x5957 #CJK UNIFIED IDEOGRAPH +0xF7E0 0x59AC #CJK UNIFIED IDEOGRAPH +0xF7E1 0x6295 #CJK UNIFIED IDEOGRAPH +0xF7E2 0x900F #CJK UNIFIED IDEOGRAPH +0xF7E3 0x9B2A #CJK UNIFIED IDEOGRAPH +0xF7E4 0x615D #CJK UNIFIED IDEOGRAPH +0xF7E5 0x7279 #CJK UNIFIED IDEOGRAPH +0xF7E6 0x95D6 #CJK UNIFIED IDEOGRAPH +0xF7E7 0x5761 #CJK UNIFIED IDEOGRAPH +0xF7E8 0x5A46 #CJK UNIFIED IDEOGRAPH +0xF7E9 0x5DF4 #CJK UNIFIED IDEOGRAPH +0xF7EA 0x628A #CJK UNIFIED IDEOGRAPH +0xF7EB 0x64AD #CJK UNIFIED IDEOGRAPH +0xF7EC 0x64FA #CJK UNIFIED IDEOGRAPH +0xF7ED 0x6777 #CJK UNIFIED IDEOGRAPH +0xF7EE 0x6CE2 #CJK UNIFIED IDEOGRAPH +0xF7EF 0x6D3E #CJK UNIFIED IDEOGRAPH +0xF7F0 0x722C #CJK UNIFIED IDEOGRAPH +0xF7F1 0x7436 #CJK UNIFIED IDEOGRAPH +0xF7F2 0x7834 #CJK UNIFIED IDEOGRAPH +0xF7F3 0x7F77 #CJK UNIFIED IDEOGRAPH +0xF7F4 0x82AD #CJK UNIFIED IDEOGRAPH +0xF7F5 0x8DDB #CJK UNIFIED IDEOGRAPH +0xF7F6 0x9817 #CJK UNIFIED IDEOGRAPH +0xF7F7 0x5224 #CJK UNIFIED IDEOGRAPH +0xF7F8 0x5742 #CJK UNIFIED IDEOGRAPH +0xF7F9 0x677F #CJK UNIFIED IDEOGRAPH +0xF7FA 0x7248 #CJK UNIFIED IDEOGRAPH +0xF7FB 0x74E3 #CJK UNIFIED IDEOGRAPH +0xF7FC 0x8CA9 #CJK UNIFIED IDEOGRAPH +0xF7FD 0x8FA6 #CJK UNIFIED IDEOGRAPH +0xF7FE 0x9211 #CJK UNIFIED IDEOGRAPH +0xF8A1 0x962A #CJK UNIFIED IDEOGRAPH +0xF8A2 0x516B #CJK UNIFIED IDEOGRAPH +0xF8A3 0x53ED #CJK UNIFIED IDEOGRAPH +0xF8A4 0x634C #CJK UNIFIED IDEOGRAPH +0xF8A5 0x4F69 #CJK UNIFIED IDEOGRAPH +0xF8A6 0x5504 #CJK UNIFIED IDEOGRAPH +0xF8A7 0x6096 #CJK UNIFIED IDEOGRAPH +0xF8A8 0x6557 #CJK UNIFIED IDEOGRAPH +0xF8A9 0x6C9B #CJK UNIFIED IDEOGRAPH +0xF8AA 0x6D7F #CJK UNIFIED IDEOGRAPH +0xF8AB 0x724C #CJK UNIFIED IDEOGRAPH +0xF8AC 0x72FD #CJK UNIFIED IDEOGRAPH +0xF8AD 0x7A17 #CJK UNIFIED IDEOGRAPH +0xF8AE 0x8987 #CJK UNIFIED IDEOGRAPH +0xF8AF 0x8C9D #CJK UNIFIED IDEOGRAPH +0xF8B0 0x5F6D #CJK UNIFIED IDEOGRAPH +0xF8B1 0x6F8E #CJK UNIFIED IDEOGRAPH +0xF8B2 0x70F9 #CJK UNIFIED IDEOGRAPH +0xF8B3 0x81A8 #CJK UNIFIED IDEOGRAPH +0xF8B4 0x610E #CJK UNIFIED IDEOGRAPH +0xF8B5 0x4FBF #CJK UNIFIED IDEOGRAPH +0xF8B6 0x504F #CJK UNIFIED IDEOGRAPH +0xF8B7 0x6241 #CJK UNIFIED IDEOGRAPH +0xF8B8 0x7247 #CJK UNIFIED IDEOGRAPH +0xF8B9 0x7BC7 #CJK UNIFIED IDEOGRAPH +0xF8BA 0x7DE8 #CJK UNIFIED IDEOGRAPH +0xF8BB 0x7FE9 #CJK UNIFIED IDEOGRAPH +0xF8BC 0x904D #CJK UNIFIED IDEOGRAPH +0xF8BD 0x97AD #CJK UNIFIED IDEOGRAPH +0xF8BE 0x9A19 #CJK UNIFIED IDEOGRAPH +0xF8BF 0x8CB6 #CJK UNIFIED IDEOGRAPH +0xF8C0 0x576A #CJK UNIFIED IDEOGRAPH +0xF8C1 0x5E73 #CJK UNIFIED IDEOGRAPH +0xF8C2 0x67B0 #CJK UNIFIED IDEOGRAPH +0xF8C3 0x840D #CJK UNIFIED IDEOGRAPH +0xF8C4 0x8A55 #CJK UNIFIED IDEOGRAPH +0xF8C5 0x5420 #CJK UNIFIED IDEOGRAPH +0xF8C6 0x5B16 #CJK UNIFIED IDEOGRAPH +0xF8C7 0x5E63 #CJK UNIFIED IDEOGRAPH +0xF8C8 0x5EE2 #CJK UNIFIED IDEOGRAPH +0xF8C9 0x5F0A #CJK UNIFIED IDEOGRAPH +0xF8CA 0x6583 #CJK UNIFIED IDEOGRAPH +0xF8CB 0x80BA #CJK UNIFIED IDEOGRAPH +0xF8CC 0x853D #CJK UNIFIED IDEOGRAPH +0xF8CD 0x9589 #CJK UNIFIED IDEOGRAPH +0xF8CE 0x965B #CJK UNIFIED IDEOGRAPH +0xF8CF 0x4F48 #CJK UNIFIED IDEOGRAPH +0xF8D0 0x5305 #CJK UNIFIED IDEOGRAPH +0xF8D1 0x530D #CJK UNIFIED IDEOGRAPH +0xF8D2 0x530F #CJK UNIFIED IDEOGRAPH +0xF8D3 0x5486 #CJK UNIFIED IDEOGRAPH +0xF8D4 0x54FA #CJK UNIFIED IDEOGRAPH +0xF8D5 0x5703 #CJK UNIFIED IDEOGRAPH +0xF8D6 0x5E03 #CJK UNIFIED IDEOGRAPH +0xF8D7 0x6016 #CJK UNIFIED IDEOGRAPH +0xF8D8 0x629B #CJK UNIFIED IDEOGRAPH +0xF8D9 0x62B1 #CJK UNIFIED IDEOGRAPH +0xF8DA 0x6355 #CJK UNIFIED IDEOGRAPH +0xF8DB 0xFA06 #CJK COMPATIBILITY IDEOGRAPH +0xF8DC 0x6CE1 #CJK UNIFIED IDEOGRAPH +0xF8DD 0x6D66 #CJK UNIFIED IDEOGRAPH +0xF8DE 0x75B1 #CJK UNIFIED IDEOGRAPH +0xF8DF 0x7832 #CJK UNIFIED IDEOGRAPH +0xF8E0 0x80DE #CJK UNIFIED IDEOGRAPH +0xF8E1 0x812F #CJK UNIFIED IDEOGRAPH +0xF8E2 0x82DE #CJK UNIFIED IDEOGRAPH +0xF8E3 0x8461 #CJK UNIFIED IDEOGRAPH +0xF8E4 0x84B2 #CJK UNIFIED IDEOGRAPH +0xF8E5 0x888D #CJK UNIFIED IDEOGRAPH +0xF8E6 0x8912 #CJK UNIFIED IDEOGRAPH +0xF8E7 0x900B #CJK UNIFIED IDEOGRAPH +0xF8E8 0x92EA #CJK UNIFIED IDEOGRAPH +0xF8E9 0x98FD #CJK UNIFIED IDEOGRAPH +0xF8EA 0x9B91 #CJK UNIFIED IDEOGRAPH +0xF8EB 0x5E45 #CJK UNIFIED IDEOGRAPH +0xF8EC 0x66B4 #CJK UNIFIED IDEOGRAPH +0xF8ED 0x66DD #CJK UNIFIED IDEOGRAPH +0xF8EE 0x7011 #CJK UNIFIED IDEOGRAPH +0xF8EF 0x7206 #CJK UNIFIED IDEOGRAPH +0xF8F0 0xFA07 #CJK COMPATIBILITY IDEOGRAPH +0xF8F1 0x4FF5 #CJK UNIFIED IDEOGRAPH +0xF8F2 0x527D #CJK UNIFIED IDEOGRAPH +0xF8F3 0x5F6A #CJK UNIFIED IDEOGRAPH +0xF8F4 0x6153 #CJK UNIFIED IDEOGRAPH +0xF8F5 0x6753 #CJK UNIFIED IDEOGRAPH +0xF8F6 0x6A19 #CJK UNIFIED IDEOGRAPH +0xF8F7 0x6F02 #CJK UNIFIED IDEOGRAPH +0xF8F8 0x74E2 #CJK UNIFIED IDEOGRAPH +0xF8F9 0x7968 #CJK UNIFIED IDEOGRAPH +0xF8FA 0x8868 #CJK UNIFIED IDEOGRAPH +0xF8FB 0x8C79 #CJK UNIFIED IDEOGRAPH +0xF8FC 0x98C7 #CJK UNIFIED IDEOGRAPH +0xF8FD 0x98C4 #CJK UNIFIED IDEOGRAPH +0xF8FE 0x9A43 #CJK UNIFIED IDEOGRAPH +0xF9A1 0x54C1 #CJK UNIFIED IDEOGRAPH +0xF9A2 0x7A1F #CJK UNIFIED IDEOGRAPH +0xF9A3 0x6953 #CJK UNIFIED IDEOGRAPH +0xF9A4 0x8AF7 #CJK UNIFIED IDEOGRAPH +0xF9A5 0x8C4A #CJK UNIFIED IDEOGRAPH +0xF9A6 0x98A8 #CJK UNIFIED IDEOGRAPH +0xF9A7 0x99AE #CJK UNIFIED IDEOGRAPH +0xF9A8 0x5F7C #CJK UNIFIED IDEOGRAPH +0xF9A9 0x62AB #CJK UNIFIED IDEOGRAPH +0xF9AA 0x75B2 #CJK UNIFIED IDEOGRAPH +0xF9AB 0x76AE #CJK UNIFIED IDEOGRAPH +0xF9AC 0x88AB #CJK UNIFIED IDEOGRAPH +0xF9AD 0x907F #CJK UNIFIED IDEOGRAPH +0xF9AE 0x9642 #CJK UNIFIED IDEOGRAPH +0xF9AF 0x5339 #CJK UNIFIED IDEOGRAPH +0xF9B0 0x5F3C #CJK UNIFIED IDEOGRAPH +0xF9B1 0x5FC5 #CJK UNIFIED IDEOGRAPH +0xF9B2 0x6CCC #CJK UNIFIED IDEOGRAPH +0xF9B3 0x73CC #CJK UNIFIED IDEOGRAPH +0xF9B4 0x7562 #CJK UNIFIED IDEOGRAPH +0xF9B5 0x758B #CJK UNIFIED IDEOGRAPH +0xF9B6 0x7B46 #CJK UNIFIED IDEOGRAPH +0xF9B7 0x82FE #CJK UNIFIED IDEOGRAPH +0xF9B8 0x999D #CJK UNIFIED IDEOGRAPH +0xF9B9 0x4E4F #CJK UNIFIED IDEOGRAPH +0xF9BA 0x903C #CJK UNIFIED IDEOGRAPH +0xF9BB 0x4E0B #CJK UNIFIED IDEOGRAPH +0xF9BC 0x4F55 #CJK UNIFIED IDEOGRAPH +0xF9BD 0x53A6 #CJK UNIFIED IDEOGRAPH +0xF9BE 0x590F #CJK UNIFIED IDEOGRAPH +0xF9BF 0x5EC8 #CJK UNIFIED IDEOGRAPH +0xF9C0 0x6630 #CJK UNIFIED IDEOGRAPH +0xF9C1 0x6CB3 #CJK UNIFIED IDEOGRAPH +0xF9C2 0x7455 #CJK UNIFIED IDEOGRAPH +0xF9C3 0x8377 #CJK UNIFIED IDEOGRAPH +0xF9C4 0x8766 #CJK UNIFIED IDEOGRAPH +0xF9C5 0x8CC0 #CJK UNIFIED IDEOGRAPH +0xF9C6 0x9050 #CJK UNIFIED IDEOGRAPH +0xF9C7 0x971E #CJK UNIFIED IDEOGRAPH +0xF9C8 0x9C15 #CJK UNIFIED IDEOGRAPH +0xF9C9 0x58D1 #CJK UNIFIED IDEOGRAPH +0xF9CA 0x5B78 #CJK UNIFIED IDEOGRAPH +0xF9CB 0x8650 #CJK UNIFIED IDEOGRAPH +0xF9CC 0x8B14 #CJK UNIFIED IDEOGRAPH +0xF9CD 0x9DB4 #CJK UNIFIED IDEOGRAPH +0xF9CE 0x5BD2 #CJK UNIFIED IDEOGRAPH +0xF9CF 0x6068 #CJK UNIFIED IDEOGRAPH +0xF9D0 0x608D #CJK UNIFIED IDEOGRAPH +0xF9D1 0x65F1 #CJK UNIFIED IDEOGRAPH +0xF9D2 0x6C57 #CJK UNIFIED IDEOGRAPH +0xF9D3 0x6F22 #CJK UNIFIED IDEOGRAPH +0xF9D4 0x6FA3 #CJK UNIFIED IDEOGRAPH +0xF9D5 0x701A #CJK UNIFIED IDEOGRAPH +0xF9D6 0x7F55 #CJK UNIFIED IDEOGRAPH +0xF9D7 0x7FF0 #CJK UNIFIED IDEOGRAPH +0xF9D8 0x9591 #CJK UNIFIED IDEOGRAPH +0xF9D9 0x9592 #CJK UNIFIED IDEOGRAPH +0xF9DA 0x9650 #CJK UNIFIED IDEOGRAPH +0xF9DB 0x97D3 #CJK UNIFIED IDEOGRAPH +0xF9DC 0x5272 #CJK UNIFIED IDEOGRAPH +0xF9DD 0x8F44 #CJK UNIFIED IDEOGRAPH +0xF9DE 0x51FD #CJK UNIFIED IDEOGRAPH +0xF9DF 0x542B #CJK UNIFIED IDEOGRAPH +0xF9E0 0x54B8 #CJK UNIFIED IDEOGRAPH +0xF9E1 0x5563 #CJK UNIFIED IDEOGRAPH +0xF9E2 0x558A #CJK UNIFIED IDEOGRAPH +0xF9E3 0x6ABB #CJK UNIFIED IDEOGRAPH +0xF9E4 0x6DB5 #CJK UNIFIED IDEOGRAPH +0xF9E5 0x7DD8 #CJK UNIFIED IDEOGRAPH +0xF9E6 0x8266 #CJK UNIFIED IDEOGRAPH +0xF9E7 0x929C #CJK UNIFIED IDEOGRAPH +0xF9E8 0x9677 #CJK UNIFIED IDEOGRAPH +0xF9E9 0x9E79 #CJK UNIFIED IDEOGRAPH +0xF9EA 0x5408 #CJK UNIFIED IDEOGRAPH +0xF9EB 0x54C8 #CJK UNIFIED IDEOGRAPH +0xF9EC 0x76D2 #CJK UNIFIED IDEOGRAPH +0xF9ED 0x86E4 #CJK UNIFIED IDEOGRAPH +0xF9EE 0x95A4 #CJK UNIFIED IDEOGRAPH +0xF9EF 0x95D4 #CJK UNIFIED IDEOGRAPH +0xF9F0 0x965C #CJK UNIFIED IDEOGRAPH +0xF9F1 0x4EA2 #CJK UNIFIED IDEOGRAPH +0xF9F2 0x4F09 #CJK UNIFIED IDEOGRAPH +0xF9F3 0x59EE #CJK UNIFIED IDEOGRAPH +0xF9F4 0x5AE6 #CJK UNIFIED IDEOGRAPH +0xF9F5 0x5DF7 #CJK UNIFIED IDEOGRAPH +0xF9F6 0x6052 #CJK UNIFIED IDEOGRAPH +0xF9F7 0x6297 #CJK UNIFIED IDEOGRAPH +0xF9F8 0x676D #CJK UNIFIED IDEOGRAPH +0xF9F9 0x6841 #CJK UNIFIED IDEOGRAPH +0xF9FA 0x6C86 #CJK UNIFIED IDEOGRAPH +0xF9FB 0x6E2F #CJK UNIFIED IDEOGRAPH +0xF9FC 0x7F38 #CJK UNIFIED IDEOGRAPH +0xF9FD 0x809B #CJK UNIFIED IDEOGRAPH +0xF9FE 0x822A #CJK UNIFIED IDEOGRAPH +0xFAA1 0xFA08 #CJK COMPATIBILITY IDEOGRAPH +0xFAA2 0xFA09 #CJK COMPATIBILITY IDEOGRAPH +0xFAA3 0x9805 #CJK UNIFIED IDEOGRAPH +0xFAA4 0x4EA5 #CJK UNIFIED IDEOGRAPH +0xFAA5 0x5055 #CJK UNIFIED IDEOGRAPH +0xFAA6 0x54B3 #CJK UNIFIED IDEOGRAPH +0xFAA7 0x5793 #CJK UNIFIED IDEOGRAPH +0xFAA8 0x595A #CJK UNIFIED IDEOGRAPH +0xFAA9 0x5B69 #CJK UNIFIED IDEOGRAPH +0xFAAA 0x5BB3 #CJK UNIFIED IDEOGRAPH +0xFAAB 0x61C8 #CJK UNIFIED IDEOGRAPH +0xFAAC 0x6977 #CJK UNIFIED IDEOGRAPH +0xFAAD 0x6D77 #CJK UNIFIED IDEOGRAPH +0xFAAE 0x7023 #CJK UNIFIED IDEOGRAPH +0xFAAF 0x87F9 #CJK UNIFIED IDEOGRAPH +0xFAB0 0x89E3 #CJK UNIFIED IDEOGRAPH +0xFAB1 0x8A72 #CJK UNIFIED IDEOGRAPH +0xFAB2 0x8AE7 #CJK UNIFIED IDEOGRAPH +0xFAB3 0x9082 #CJK UNIFIED IDEOGRAPH +0xFAB4 0x99ED #CJK UNIFIED IDEOGRAPH +0xFAB5 0x9AB8 #CJK UNIFIED IDEOGRAPH +0xFAB6 0x52BE #CJK UNIFIED IDEOGRAPH +0xFAB7 0x6838 #CJK UNIFIED IDEOGRAPH +0xFAB8 0x5016 #CJK UNIFIED IDEOGRAPH +0xFAB9 0x5E78 #CJK UNIFIED IDEOGRAPH +0xFABA 0x674F #CJK UNIFIED IDEOGRAPH +0xFABB 0x8347 #CJK UNIFIED IDEOGRAPH +0xFABC 0x884C #CJK UNIFIED IDEOGRAPH +0xFABD 0x4EAB #CJK UNIFIED IDEOGRAPH +0xFABE 0x5411 #CJK UNIFIED IDEOGRAPH +0xFABF 0x56AE #CJK UNIFIED IDEOGRAPH +0xFAC0 0x73E6 #CJK UNIFIED IDEOGRAPH +0xFAC1 0x9115 #CJK UNIFIED IDEOGRAPH +0xFAC2 0x97FF #CJK UNIFIED IDEOGRAPH +0xFAC3 0x9909 #CJK UNIFIED IDEOGRAPH +0xFAC4 0x9957 #CJK UNIFIED IDEOGRAPH +0xFAC5 0x9999 #CJK UNIFIED IDEOGRAPH +0xFAC6 0x5653 #CJK UNIFIED IDEOGRAPH +0xFAC7 0x589F #CJK UNIFIED IDEOGRAPH +0xFAC8 0x865B #CJK UNIFIED IDEOGRAPH +0xFAC9 0x8A31 #CJK UNIFIED IDEOGRAPH +0xFACA 0x61B2 #CJK UNIFIED IDEOGRAPH +0xFACB 0x6AF6 #CJK UNIFIED IDEOGRAPH +0xFACC 0x737B #CJK UNIFIED IDEOGRAPH +0xFACD 0x8ED2 #CJK UNIFIED IDEOGRAPH +0xFACE 0x6B47 #CJK UNIFIED IDEOGRAPH +0xFACF 0x96AA #CJK UNIFIED IDEOGRAPH +0xFAD0 0x9A57 #CJK UNIFIED IDEOGRAPH +0xFAD1 0x5955 #CJK UNIFIED IDEOGRAPH +0xFAD2 0x7200 #CJK UNIFIED IDEOGRAPH +0xFAD3 0x8D6B #CJK UNIFIED IDEOGRAPH +0xFAD4 0x9769 #CJK UNIFIED IDEOGRAPH +0xFAD5 0x4FD4 #CJK UNIFIED IDEOGRAPH +0xFAD6 0x5CF4 #CJK UNIFIED IDEOGRAPH +0xFAD7 0x5F26 #CJK UNIFIED IDEOGRAPH +0xFAD8 0x61F8 #CJK UNIFIED IDEOGRAPH +0xFAD9 0x665B #CJK UNIFIED IDEOGRAPH +0xFADA 0x6CEB #CJK UNIFIED IDEOGRAPH +0xFADB 0x70AB #CJK UNIFIED IDEOGRAPH +0xFADC 0x7384 #CJK UNIFIED IDEOGRAPH +0xFADD 0x73B9 #CJK UNIFIED IDEOGRAPH +0xFADE 0x73FE #CJK UNIFIED IDEOGRAPH +0xFADF 0x7729 #CJK UNIFIED IDEOGRAPH +0xFAE0 0x774D #CJK UNIFIED IDEOGRAPH +0xFAE1 0x7D43 #CJK UNIFIED IDEOGRAPH +0xFAE2 0x7D62 #CJK UNIFIED IDEOGRAPH +0xFAE3 0x7E23 #CJK UNIFIED IDEOGRAPH +0xFAE4 0x8237 #CJK UNIFIED IDEOGRAPH +0xFAE5 0x8852 #CJK UNIFIED IDEOGRAPH +0xFAE6 0xFA0A #CJK COMPATIBILITY IDEOGRAPH +0xFAE7 0x8CE2 #CJK UNIFIED IDEOGRAPH +0xFAE8 0x9249 #CJK UNIFIED IDEOGRAPH +0xFAE9 0x986F #CJK UNIFIED IDEOGRAPH +0xFAEA 0x5B51 #CJK UNIFIED IDEOGRAPH +0xFAEB 0x7A74 #CJK UNIFIED IDEOGRAPH +0xFAEC 0x8840 #CJK UNIFIED IDEOGRAPH +0xFAED 0x9801 #CJK UNIFIED IDEOGRAPH +0xFAEE 0x5ACC #CJK UNIFIED IDEOGRAPH +0xFAEF 0x4FE0 #CJK UNIFIED IDEOGRAPH +0xFAF0 0x5354 #CJK UNIFIED IDEOGRAPH +0xFAF1 0x593E #CJK UNIFIED IDEOGRAPH +0xFAF2 0x5CFD #CJK UNIFIED IDEOGRAPH +0xFAF3 0x633E #CJK UNIFIED IDEOGRAPH +0xFAF4 0x6D79 #CJK UNIFIED IDEOGRAPH +0xFAF5 0x72F9 #CJK UNIFIED IDEOGRAPH +0xFAF6 0x8105 #CJK UNIFIED IDEOGRAPH +0xFAF7 0x8107 #CJK UNIFIED IDEOGRAPH +0xFAF8 0x83A2 #CJK UNIFIED IDEOGRAPH +0xFAF9 0x92CF #CJK UNIFIED IDEOGRAPH +0xFAFA 0x9830 #CJK UNIFIED IDEOGRAPH +0xFAFB 0x4EA8 #CJK UNIFIED IDEOGRAPH +0xFAFC 0x5144 #CJK UNIFIED IDEOGRAPH +0xFAFD 0x5211 #CJK UNIFIED IDEOGRAPH +0xFAFE 0x578B #CJK UNIFIED IDEOGRAPH +0xFBA1 0x5F62 #CJK UNIFIED IDEOGRAPH +0xFBA2 0x6CC2 #CJK UNIFIED IDEOGRAPH +0xFBA3 0x6ECE #CJK UNIFIED IDEOGRAPH +0xFBA4 0x7005 #CJK UNIFIED IDEOGRAPH +0xFBA5 0x7050 #CJK UNIFIED IDEOGRAPH +0xFBA6 0x70AF #CJK UNIFIED IDEOGRAPH +0xFBA7 0x7192 #CJK UNIFIED IDEOGRAPH +0xFBA8 0x73E9 #CJK UNIFIED IDEOGRAPH +0xFBA9 0x7469 #CJK UNIFIED IDEOGRAPH +0xFBAA 0x834A #CJK UNIFIED IDEOGRAPH +0xFBAB 0x87A2 #CJK UNIFIED IDEOGRAPH +0xFBAC 0x8861 #CJK UNIFIED IDEOGRAPH +0xFBAD 0x9008 #CJK UNIFIED IDEOGRAPH +0xFBAE 0x90A2 #CJK UNIFIED IDEOGRAPH +0xFBAF 0x93A3 #CJK UNIFIED IDEOGRAPH +0xFBB0 0x99A8 #CJK UNIFIED IDEOGRAPH +0xFBB1 0x516E #CJK UNIFIED IDEOGRAPH +0xFBB2 0x5F57 #CJK UNIFIED IDEOGRAPH +0xFBB3 0x60E0 #CJK UNIFIED IDEOGRAPH +0xFBB4 0x6167 #CJK UNIFIED IDEOGRAPH +0xFBB5 0x66B3 #CJK UNIFIED IDEOGRAPH +0xFBB6 0x8559 #CJK UNIFIED IDEOGRAPH +0xFBB7 0x8E4A #CJK UNIFIED IDEOGRAPH +0xFBB8 0x91AF #CJK UNIFIED IDEOGRAPH +0xFBB9 0x978B #CJK UNIFIED IDEOGRAPH +0xFBBA 0x4E4E #CJK UNIFIED IDEOGRAPH +0xFBBB 0x4E92 #CJK UNIFIED IDEOGRAPH +0xFBBC 0x547C #CJK UNIFIED IDEOGRAPH +0xFBBD 0x58D5 #CJK UNIFIED IDEOGRAPH +0xFBBE 0x58FA #CJK UNIFIED IDEOGRAPH +0xFBBF 0x597D #CJK UNIFIED IDEOGRAPH +0xFBC0 0x5CB5 #CJK UNIFIED IDEOGRAPH +0xFBC1 0x5F27 #CJK UNIFIED IDEOGRAPH +0xFBC2 0x6236 #CJK UNIFIED IDEOGRAPH +0xFBC3 0x6248 #CJK UNIFIED IDEOGRAPH +0xFBC4 0x660A #CJK UNIFIED IDEOGRAPH +0xFBC5 0x6667 #CJK UNIFIED IDEOGRAPH +0xFBC6 0x6BEB #CJK UNIFIED IDEOGRAPH +0xFBC7 0x6D69 #CJK UNIFIED IDEOGRAPH +0xFBC8 0x6DCF #CJK UNIFIED IDEOGRAPH +0xFBC9 0x6E56 #CJK UNIFIED IDEOGRAPH +0xFBCA 0x6EF8 #CJK UNIFIED IDEOGRAPH +0xFBCB 0x6F94 #CJK UNIFIED IDEOGRAPH +0xFBCC 0x6FE0 #CJK UNIFIED IDEOGRAPH +0xFBCD 0x6FE9 #CJK UNIFIED IDEOGRAPH +0xFBCE 0x705D #CJK UNIFIED IDEOGRAPH +0xFBCF 0x72D0 #CJK UNIFIED IDEOGRAPH +0xFBD0 0x7425 #CJK UNIFIED IDEOGRAPH +0xFBD1 0x745A #CJK UNIFIED IDEOGRAPH +0xFBD2 0x74E0 #CJK UNIFIED IDEOGRAPH +0xFBD3 0x7693 #CJK UNIFIED IDEOGRAPH +0xFBD4 0x795C #CJK UNIFIED IDEOGRAPH +0xFBD5 0x7CCA #CJK UNIFIED IDEOGRAPH +0xFBD6 0x7E1E #CJK UNIFIED IDEOGRAPH +0xFBD7 0x80E1 #CJK UNIFIED IDEOGRAPH +0xFBD8 0x82A6 #CJK UNIFIED IDEOGRAPH +0xFBD9 0x846B #CJK UNIFIED IDEOGRAPH +0xFBDA 0x84BF #CJK UNIFIED IDEOGRAPH +0xFBDB 0x864E #CJK UNIFIED IDEOGRAPH +0xFBDC 0x865F #CJK UNIFIED IDEOGRAPH +0xFBDD 0x8774 #CJK UNIFIED IDEOGRAPH +0xFBDE 0x8B77 #CJK UNIFIED IDEOGRAPH +0xFBDF 0x8C6A #CJK UNIFIED IDEOGRAPH +0xFBE0 0x93AC #CJK UNIFIED IDEOGRAPH +0xFBE1 0x9800 #CJK UNIFIED IDEOGRAPH +0xFBE2 0x9865 #CJK UNIFIED IDEOGRAPH +0xFBE3 0x60D1 #CJK UNIFIED IDEOGRAPH +0xFBE4 0x6216 #CJK UNIFIED IDEOGRAPH +0xFBE5 0x9177 #CJK UNIFIED IDEOGRAPH +0xFBE6 0x5A5A #CJK UNIFIED IDEOGRAPH +0xFBE7 0x660F #CJK UNIFIED IDEOGRAPH +0xFBE8 0x6DF7 #CJK UNIFIED IDEOGRAPH +0xFBE9 0x6E3E #CJK UNIFIED IDEOGRAPH +0xFBEA 0x743F #CJK UNIFIED IDEOGRAPH +0xFBEB 0x9B42 #CJK UNIFIED IDEOGRAPH +0xFBEC 0x5FFD #CJK UNIFIED IDEOGRAPH +0xFBED 0x60DA #CJK UNIFIED IDEOGRAPH +0xFBEE 0x7B0F #CJK UNIFIED IDEOGRAPH +0xFBEF 0x54C4 #CJK UNIFIED IDEOGRAPH +0xFBF0 0x5F18 #CJK UNIFIED IDEOGRAPH +0xFBF1 0x6C5E #CJK UNIFIED IDEOGRAPH +0xFBF2 0x6CD3 #CJK UNIFIED IDEOGRAPH +0xFBF3 0x6D2A #CJK UNIFIED IDEOGRAPH +0xFBF4 0x70D8 #CJK UNIFIED IDEOGRAPH +0xFBF5 0x7D05 #CJK UNIFIED IDEOGRAPH +0xFBF6 0x8679 #CJK UNIFIED IDEOGRAPH +0xFBF7 0x8A0C #CJK UNIFIED IDEOGRAPH +0xFBF8 0x9D3B #CJK UNIFIED IDEOGRAPH +0xFBF9 0x5316 #CJK UNIFIED IDEOGRAPH +0xFBFA 0x548C #CJK UNIFIED IDEOGRAPH +0xFBFB 0x5B05 #CJK UNIFIED IDEOGRAPH +0xFBFC 0x6A3A #CJK UNIFIED IDEOGRAPH +0xFBFD 0x706B #CJK UNIFIED IDEOGRAPH +0xFBFE 0x7575 #CJK UNIFIED IDEOGRAPH +0xFCA1 0x798D #CJK UNIFIED IDEOGRAPH +0xFCA2 0x79BE #CJK UNIFIED IDEOGRAPH +0xFCA3 0x82B1 #CJK UNIFIED IDEOGRAPH +0xFCA4 0x83EF #CJK UNIFIED IDEOGRAPH +0xFCA5 0x8A71 #CJK UNIFIED IDEOGRAPH +0xFCA6 0x8B41 #CJK UNIFIED IDEOGRAPH +0xFCA7 0x8CA8 #CJK UNIFIED IDEOGRAPH +0xFCA8 0x9774 #CJK UNIFIED IDEOGRAPH +0xFCA9 0xFA0B #CJK COMPATIBILITY IDEOGRAPH +0xFCAA 0x64F4 #CJK UNIFIED IDEOGRAPH +0xFCAB 0x652B #CJK UNIFIED IDEOGRAPH +0xFCAC 0x78BA #CJK UNIFIED IDEOGRAPH +0xFCAD 0x78BB #CJK UNIFIED IDEOGRAPH +0xFCAE 0x7A6B #CJK UNIFIED IDEOGRAPH +0xFCAF 0x4E38 #CJK UNIFIED IDEOGRAPH +0xFCB0 0x559A #CJK UNIFIED IDEOGRAPH +0xFCB1 0x5950 #CJK UNIFIED IDEOGRAPH +0xFCB2 0x5BA6 #CJK UNIFIED IDEOGRAPH +0xFCB3 0x5E7B #CJK UNIFIED IDEOGRAPH +0xFCB4 0x60A3 #CJK UNIFIED IDEOGRAPH +0xFCB5 0x63DB #CJK UNIFIED IDEOGRAPH +0xFCB6 0x6B61 #CJK UNIFIED IDEOGRAPH +0xFCB7 0x6665 #CJK UNIFIED IDEOGRAPH +0xFCB8 0x6853 #CJK UNIFIED IDEOGRAPH +0xFCB9 0x6E19 #CJK UNIFIED IDEOGRAPH +0xFCBA 0x7165 #CJK UNIFIED IDEOGRAPH +0xFCBB 0x74B0 #CJK UNIFIED IDEOGRAPH +0xFCBC 0x7D08 #CJK UNIFIED IDEOGRAPH +0xFCBD 0x9084 #CJK UNIFIED IDEOGRAPH +0xFCBE 0x9A69 #CJK UNIFIED IDEOGRAPH +0xFCBF 0x9C25 #CJK UNIFIED IDEOGRAPH +0xFCC0 0x6D3B #CJK UNIFIED IDEOGRAPH +0xFCC1 0x6ED1 #CJK UNIFIED IDEOGRAPH +0xFCC2 0x733E #CJK UNIFIED IDEOGRAPH +0xFCC3 0x8C41 #CJK UNIFIED IDEOGRAPH +0xFCC4 0x95CA #CJK UNIFIED IDEOGRAPH +0xFCC5 0x51F0 #CJK UNIFIED IDEOGRAPH +0xFCC6 0x5E4C #CJK UNIFIED IDEOGRAPH +0xFCC7 0x5FA8 #CJK UNIFIED IDEOGRAPH +0xFCC8 0x604D #CJK UNIFIED IDEOGRAPH +0xFCC9 0x60F6 #CJK UNIFIED IDEOGRAPH +0xFCCA 0x6130 #CJK UNIFIED IDEOGRAPH +0xFCCB 0x614C #CJK UNIFIED IDEOGRAPH +0xFCCC 0x6643 #CJK UNIFIED IDEOGRAPH +0xFCCD 0x6644 #CJK UNIFIED IDEOGRAPH +0xFCCE 0x69A5 #CJK UNIFIED IDEOGRAPH +0xFCCF 0x6CC1 #CJK UNIFIED IDEOGRAPH +0xFCD0 0x6E5F #CJK UNIFIED IDEOGRAPH +0xFCD1 0x6EC9 #CJK UNIFIED IDEOGRAPH +0xFCD2 0x6F62 #CJK UNIFIED IDEOGRAPH +0xFCD3 0x714C #CJK UNIFIED IDEOGRAPH +0xFCD4 0x749C #CJK UNIFIED IDEOGRAPH +0xFCD5 0x7687 #CJK UNIFIED IDEOGRAPH +0xFCD6 0x7BC1 #CJK UNIFIED IDEOGRAPH +0xFCD7 0x7C27 #CJK UNIFIED IDEOGRAPH +0xFCD8 0x8352 #CJK UNIFIED IDEOGRAPH +0xFCD9 0x8757 #CJK UNIFIED IDEOGRAPH +0xFCDA 0x9051 #CJK UNIFIED IDEOGRAPH +0xFCDB 0x968D #CJK UNIFIED IDEOGRAPH +0xFCDC 0x9EC3 #CJK UNIFIED IDEOGRAPH +0xFCDD 0x532F #CJK UNIFIED IDEOGRAPH +0xFCDE 0x56DE #CJK UNIFIED IDEOGRAPH +0xFCDF 0x5EFB #CJK UNIFIED IDEOGRAPH +0xFCE0 0x5F8A #CJK UNIFIED IDEOGRAPH +0xFCE1 0x6062 #CJK UNIFIED IDEOGRAPH +0xFCE2 0x6094 #CJK UNIFIED IDEOGRAPH +0xFCE3 0x61F7 #CJK UNIFIED IDEOGRAPH +0xFCE4 0x6666 #CJK UNIFIED IDEOGRAPH +0xFCE5 0x6703 #CJK UNIFIED IDEOGRAPH +0xFCE6 0x6A9C #CJK UNIFIED IDEOGRAPH +0xFCE7 0x6DEE #CJK UNIFIED IDEOGRAPH +0xFCE8 0x6FAE #CJK UNIFIED IDEOGRAPH +0xFCE9 0x7070 #CJK UNIFIED IDEOGRAPH +0xFCEA 0x736A #CJK UNIFIED IDEOGRAPH +0xFCEB 0x7E6A #CJK UNIFIED IDEOGRAPH +0xFCEC 0x81BE #CJK UNIFIED IDEOGRAPH +0xFCED 0x8334 #CJK UNIFIED IDEOGRAPH +0xFCEE 0x86D4 #CJK UNIFIED IDEOGRAPH +0xFCEF 0x8AA8 #CJK UNIFIED IDEOGRAPH +0xFCF0 0x8CC4 #CJK UNIFIED IDEOGRAPH +0xFCF1 0x5283 #CJK UNIFIED IDEOGRAPH +0xFCF2 0x7372 #CJK UNIFIED IDEOGRAPH +0xFCF3 0x5B96 #CJK UNIFIED IDEOGRAPH +0xFCF4 0x6A6B #CJK UNIFIED IDEOGRAPH +0xFCF5 0x9404 #CJK UNIFIED IDEOGRAPH +0xFCF6 0x54EE #CJK UNIFIED IDEOGRAPH +0xFCF7 0x5686 #CJK UNIFIED IDEOGRAPH +0xFCF8 0x5B5D #CJK UNIFIED IDEOGRAPH +0xFCF9 0x6548 #CJK UNIFIED IDEOGRAPH +0xFCFA 0x6585 #CJK UNIFIED IDEOGRAPH +0xFCFB 0x66C9 #CJK UNIFIED IDEOGRAPH +0xFCFC 0x689F #CJK UNIFIED IDEOGRAPH +0xFCFD 0x6D8D #CJK UNIFIED IDEOGRAPH +0xFCFE 0x6DC6 #CJK UNIFIED IDEOGRAPH +0xFDA1 0x723B #CJK UNIFIED IDEOGRAPH +0xFDA2 0x80B4 #CJK UNIFIED IDEOGRAPH +0xFDA3 0x9175 #CJK UNIFIED IDEOGRAPH +0xFDA4 0x9A4D #CJK UNIFIED IDEOGRAPH +0xFDA5 0x4FAF #CJK UNIFIED IDEOGRAPH +0xFDA6 0x5019 #CJK UNIFIED IDEOGRAPH +0xFDA7 0x539A #CJK UNIFIED IDEOGRAPH +0xFDA8 0x540E #CJK UNIFIED IDEOGRAPH +0xFDA9 0x543C #CJK UNIFIED IDEOGRAPH +0xFDAA 0x5589 #CJK UNIFIED IDEOGRAPH +0xFDAB 0x55C5 #CJK UNIFIED IDEOGRAPH +0xFDAC 0x5E3F #CJK UNIFIED IDEOGRAPH +0xFDAD 0x5F8C #CJK UNIFIED IDEOGRAPH +0xFDAE 0x673D #CJK UNIFIED IDEOGRAPH +0xFDAF 0x7166 #CJK UNIFIED IDEOGRAPH +0xFDB0 0x73DD #CJK UNIFIED IDEOGRAPH +0xFDB1 0x9005 #CJK UNIFIED IDEOGRAPH +0xFDB2 0x52DB #CJK UNIFIED IDEOGRAPH +0xFDB3 0x52F3 #CJK UNIFIED IDEOGRAPH +0xFDB4 0x5864 #CJK UNIFIED IDEOGRAPH +0xFDB5 0x58CE #CJK UNIFIED IDEOGRAPH +0xFDB6 0x7104 #CJK UNIFIED IDEOGRAPH +0xFDB7 0x718F #CJK UNIFIED IDEOGRAPH +0xFDB8 0x71FB #CJK UNIFIED IDEOGRAPH +0xFDB9 0x85B0 #CJK UNIFIED IDEOGRAPH +0xFDBA 0x8A13 #CJK UNIFIED IDEOGRAPH +0xFDBB 0x6688 #CJK UNIFIED IDEOGRAPH +0xFDBC 0x85A8 #CJK UNIFIED IDEOGRAPH +0xFDBD 0x55A7 #CJK UNIFIED IDEOGRAPH +0xFDBE 0x6684 #CJK UNIFIED IDEOGRAPH +0xFDBF 0x714A #CJK UNIFIED IDEOGRAPH +0xFDC0 0x8431 #CJK UNIFIED IDEOGRAPH +0xFDC1 0x5349 #CJK UNIFIED IDEOGRAPH +0xFDC2 0x5599 #CJK UNIFIED IDEOGRAPH +0xFDC3 0x6BC1 #CJK UNIFIED IDEOGRAPH +0xFDC4 0x5F59 #CJK UNIFIED IDEOGRAPH +0xFDC5 0x5FBD #CJK UNIFIED IDEOGRAPH +0xFDC6 0x63EE #CJK UNIFIED IDEOGRAPH +0xFDC7 0x6689 #CJK UNIFIED IDEOGRAPH +0xFDC8 0x7147 #CJK UNIFIED IDEOGRAPH +0xFDC9 0x8AF1 #CJK UNIFIED IDEOGRAPH +0xFDCA 0x8F1D #CJK UNIFIED IDEOGRAPH +0xFDCB 0x9EBE #CJK UNIFIED IDEOGRAPH +0xFDCC 0x4F11 #CJK UNIFIED IDEOGRAPH +0xFDCD 0x643A #CJK UNIFIED IDEOGRAPH +0xFDCE 0x70CB #CJK UNIFIED IDEOGRAPH +0xFDCF 0x7566 #CJK UNIFIED IDEOGRAPH +0xFDD0 0x8667 #CJK UNIFIED IDEOGRAPH +0xFDD1 0x6064 #CJK UNIFIED IDEOGRAPH +0xFDD2 0x8B4E #CJK UNIFIED IDEOGRAPH +0xFDD3 0x9DF8 #CJK UNIFIED IDEOGRAPH +0xFDD4 0x5147 #CJK UNIFIED IDEOGRAPH +0xFDD5 0x51F6 #CJK UNIFIED IDEOGRAPH +0xFDD6 0x5308 #CJK UNIFIED IDEOGRAPH +0xFDD7 0x6D36 #CJK UNIFIED IDEOGRAPH +0xFDD8 0x80F8 #CJK UNIFIED IDEOGRAPH +0xFDD9 0x9ED1 #CJK UNIFIED IDEOGRAPH +0xFDDA 0x6615 #CJK UNIFIED IDEOGRAPH +0xFDDB 0x6B23 #CJK UNIFIED IDEOGRAPH +0xFDDC 0x7098 #CJK UNIFIED IDEOGRAPH +0xFDDD 0x75D5 #CJK UNIFIED IDEOGRAPH +0xFDDE 0x5403 #CJK UNIFIED IDEOGRAPH +0xFDDF 0x5C79 #CJK UNIFIED IDEOGRAPH +0xFDE0 0x7D07 #CJK UNIFIED IDEOGRAPH +0xFDE1 0x8A16 #CJK UNIFIED IDEOGRAPH +0xFDE2 0x6B20 #CJK UNIFIED IDEOGRAPH +0xFDE3 0x6B3D #CJK UNIFIED IDEOGRAPH +0xFDE4 0x6B46 #CJK UNIFIED IDEOGRAPH +0xFDE5 0x5438 #CJK UNIFIED IDEOGRAPH +0xFDE6 0x6070 #CJK UNIFIED IDEOGRAPH +0xFDE7 0x6D3D #CJK UNIFIED IDEOGRAPH +0xFDE8 0x7FD5 #CJK UNIFIED IDEOGRAPH +0xFDE9 0x8208 #CJK UNIFIED IDEOGRAPH +0xFDEA 0x50D6 #CJK UNIFIED IDEOGRAPH +0xFDEB 0x51DE #CJK UNIFIED IDEOGRAPH +0xFDEC 0x559C #CJK UNIFIED IDEOGRAPH +0xFDED 0x566B #CJK UNIFIED IDEOGRAPH +0xFDEE 0x56CD #CJK UNIFIED IDEOGRAPH +0xFDEF 0x59EC #CJK UNIFIED IDEOGRAPH +0xFDF0 0x5B09 #CJK UNIFIED IDEOGRAPH +0xFDF1 0x5E0C #CJK UNIFIED IDEOGRAPH +0xFDF2 0x6199 #CJK UNIFIED IDEOGRAPH +0xFDF3 0x6198 #CJK UNIFIED IDEOGRAPH +0xFDF4 0x6231 #CJK UNIFIED IDEOGRAPH +0xFDF5 0x665E #CJK UNIFIED IDEOGRAPH +0xFDF6 0x66E6 #CJK UNIFIED IDEOGRAPH +0xFDF7 0x7199 #CJK UNIFIED IDEOGRAPH +0xFDF8 0x71B9 #CJK UNIFIED IDEOGRAPH +0xFDF9 0x71BA #CJK UNIFIED IDEOGRAPH +0xFDFA 0x72A7 #CJK UNIFIED IDEOGRAPH +0xFDFB 0x79A7 #CJK UNIFIED IDEOGRAPH +0xFDFC 0x7A00 #CJK UNIFIED IDEOGRAPH +0xFDFD 0x7FB2 #CJK UNIFIED IDEOGRAPH +0xFDFE 0x8A70 #CJK UNIFIED IDEOGRAPH diff --git a/Tools/unicode/python-mappings/JIS0208.TXT b/Tools/unicode/python-mappings/JIS0208.TXT new file mode 100644 index 0000000000000..0a9382c276082 --- /dev/null +++ b/Tools/unicode/python-mappings/JIS0208.TXT @@ -0,0 +1,6942 @@ +# JIS0208.TXT +# Date: 2015-12-02 23:50:00 GMT [KW] +# ? 2015 Unicode?, Inc. +# For terms of use, see http://www.unicode.org/terms_of_use.html +# +# Name: JIS X 0208 (1990) to Unicode +# Unicode version: 1.1 +# Table version: 2.0 +# Table format: Format A +# Date: 2011 October 14 (header updated: 2015 December 02) +# +# General notes: +# +# +# This table contains one set of mappings from JIS X 0208 (1990) into Unicode. +# Note that these data are *possible* mappings only and may not be the +# same as those used by actual products, nor may they be the best suited +# for all uses. For more information on the mappings between various code +# pages incorporating the repertoire of JIS X 0208 (1990) and Unicode, consult the +# VENDORS mapping data. +# +# +# Format: Four tab-separated columns +# Column #1 is the shift-JIS code (in hex) +# Column #2 is the JIS X 0208 code (in hex as 0xXXXX) +# Column #3 is the Unicode (in hex as 0xXXXX) +# Column #4 the Unicode name (follows a comment sign, '#') +# The official names for Unicode characters U+4E00 +# to U+9FA5, inclusive, is "CJK UNIFIED IDEOGRAPH-XXXX", +# where XXXX is the code point. Including all these +# names in this file increases its size substantially +# and needlessly. The token "" is used for the +# name of these characters. If necessary, it can be +# expanded algorithmically by a parser or editor. +# +# The entries are in JIS X 0208 order +# +# The following algorithms can be used to change the hex form +# of JIS 0208 to other standard forms: +# +# To change hex to EUC form, add 0x8080 +# To change hex to kuten form, first subtract 0x2020. Then +# the high and low bytes correspond to the ku and ten of +# the kuten form. For example, 0x2121 -> 0x0101 -> 0101; +# 0x7426 -> 0x5406 -> 8406 +# +# Revision History: +# +# [v2.0, 2015 December 02] +# updates to copyright notice and terms of use +# no changes to character mappings +# +# [v1.0, 2011 October 14] +# Updated terms of use to current wording. +# Updated contact information. +# No changes to the mapping data. +# +# [v0.9, 8 March 1994] +# First release. +# +# Use the Unicode reporting form +# for any questions or comments or to report errors in the data. +# +0x8140 0x2121 0x3000 # IDEOGRAPHIC SPACE +0x8141 0x2122 0x3001 # IDEOGRAPHIC COMMA +0x8142 0x2123 0x3002 # IDEOGRAPHIC FULL STOP +0x8143 0x2124 0xFF0C # FULLWIDTH COMMA +0x8144 0x2125 0xFF0E # FULLWIDTH FULL STOP +0x8145 0x2126 0x30FB # KATAKANA MIDDLE DOT +0x8146 0x2127 0xFF1A # FULLWIDTH COLON +0x8147 0x2128 0xFF1B # FULLWIDTH SEMICOLON +0x8148 0x2129 0xFF1F # FULLWIDTH QUESTION MARK +0x8149 0x212A 0xFF01 # FULLWIDTH EXCLAMATION MARK +0x814A 0x212B 0x309B # KATAKANA-HIRAGANA VOICED SOUND MARK +0x814B 0x212C 0x309C # KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK +0x814C 0x212D 0x00B4 # ACUTE ACCENT +0x814D 0x212E 0xFF40 # FULLWIDTH GRAVE ACCENT +0x814E 0x212F 0x00A8 # DIAERESIS +0x814F 0x2130 0xFF3E # FULLWIDTH CIRCUMFLEX ACCENT +0x8150 0x2131 0xFFE3 # FULLWIDTH MACRON +0x8151 0x2132 0xFF3F # FULLWIDTH LOW LINE +0x8152 0x2133 0x30FD # KATAKANA ITERATION MARK +0x8153 0x2134 0x30FE # KATAKANA VOICED ITERATION MARK +0x8154 0x2135 0x309D # HIRAGANA ITERATION MARK +0x8155 0x2136 0x309E # HIRAGANA VOICED ITERATION MARK +0x8156 0x2137 0x3003 # DITTO MARK +0x8157 0x2138 0x4EDD # +0x8158 0x2139 0x3005 # IDEOGRAPHIC ITERATION MARK +0x8159 0x213A 0x3006 # IDEOGRAPHIC CLOSING MARK +0x815A 0x213B 0x3007 # IDEOGRAPHIC NUMBER ZERO +0x815B 0x213C 0x30FC # KATAKANA-HIRAGANA PROLONGED SOUND MARK +0x815C 0x213D 0x2015 # HORIZONTAL BAR +0x815D 0x213E 0x2010 # HYPHEN +0x815E 0x213F 0xFF0F # FULLWIDTH SOLIDUS +0x815F 0x2140 0x005C # REVERSE SOLIDUS +0x8160 0x2141 0x301C # WAVE DASH +0x8161 0x2142 0x2016 # DOUBLE VERTICAL LINE +0x8162 0x2143 0xFF5C # FULLWIDTH VERTICAL LINE +0x8163 0x2144 0x2026 # HORIZONTAL ELLIPSIS +0x8164 0x2145 0x2025 # TWO DOT LEADER +0x8165 0x2146 0x2018 # LEFT SINGLE QUOTATION MARK +0x8166 0x2147 0x2019 # RIGHT SINGLE QUOTATION MARK +0x8167 0x2148 0x201C # LEFT DOUBLE QUOTATION MARK +0x8168 0x2149 0x201D # RIGHT DOUBLE QUOTATION MARK +0x8169 0x214A 0xFF08 # FULLWIDTH LEFT PARENTHESIS +0x816A 0x214B 0xFF09 # FULLWIDTH RIGHT PARENTHESIS +0x816B 0x214C 0x3014 # LEFT TORTOISE SHELL BRACKET +0x816C 0x214D 0x3015 # RIGHT TORTOISE SHELL BRACKET +0x816D 0x214E 0xFF3B # FULLWIDTH LEFT SQUARE BRACKET +0x816E 0x214F 0xFF3D # FULLWIDTH RIGHT SQUARE BRACKET +0x816F 0x2150 0xFF5B # FULLWIDTH LEFT CURLY BRACKET +0x8170 0x2151 0xFF5D # FULLWIDTH RIGHT CURLY BRACKET +0x8171 0x2152 0x3008 # LEFT ANGLE BRACKET +0x8172 0x2153 0x3009 # RIGHT ANGLE BRACKET +0x8173 0x2154 0x300A # LEFT DOUBLE ANGLE BRACKET +0x8174 0x2155 0x300B # RIGHT DOUBLE ANGLE BRACKET +0x8175 0x2156 0x300C # LEFT CORNER BRACKET +0x8176 0x2157 0x300D # RIGHT CORNER BRACKET +0x8177 0x2158 0x300E # LEFT WHITE CORNER BRACKET +0x8178 0x2159 0x300F # RIGHT WHITE CORNER BRACKET +0x8179 0x215A 0x3010 # LEFT BLACK LENTICULAR BRACKET +0x817A 0x215B 0x3011 # RIGHT BLACK LENTICULAR BRACKET +0x817B 0x215C 0xFF0B # FULLWIDTH PLUS SIGN +0x817C 0x215D 0x2212 # MINUS SIGN +0x817D 0x215E 0x00B1 # PLUS-MINUS SIGN +0x817E 0x215F 0x00D7 # MULTIPLICATION SIGN +0x8180 0x2160 0x00F7 # DIVISION SIGN +0x8181 0x2161 0xFF1D # FULLWIDTH EQUALS SIGN +0x8182 0x2162 0x2260 # NOT EQUAL TO +0x8183 0x2163 0xFF1C # FULLWIDTH LESS-THAN SIGN +0x8184 0x2164 0xFF1E # FULLWIDTH GREATER-THAN SIGN +0x8185 0x2165 0x2266 # LESS-THAN OVER EQUAL TO +0x8186 0x2166 0x2267 # GREATER-THAN OVER EQUAL TO +0x8187 0x2167 0x221E # INFINITY +0x8188 0x2168 0x2234 # THEREFORE +0x8189 0x2169 0x2642 # MALE SIGN +0x818A 0x216A 0x2640 # FEMALE SIGN +0x818B 0x216B 0x00B0 # DEGREE SIGN +0x818C 0x216C 0x2032 # PRIME +0x818D 0x216D 0x2033 # DOUBLE PRIME +0x818E 0x216E 0x2103 # DEGREE CELSIUS +0x818F 0x216F 0xFFE5 # FULLWIDTH YEN SIGN +0x8190 0x2170 0xFF04 # FULLWIDTH DOLLAR SIGN +0x8191 0x2171 0x00A2 # CENT SIGN +0x8192 0x2172 0x00A3 # POUND SIGN +0x8193 0x2173 0xFF05 # FULLWIDTH PERCENT SIGN +0x8194 0x2174 0xFF03 # FULLWIDTH NUMBER SIGN +0x8195 0x2175 0xFF06 # FULLWIDTH AMPERSAND +0x8196 0x2176 0xFF0A # FULLWIDTH ASTERISK +0x8197 0x2177 0xFF20 # FULLWIDTH COMMERCIAL AT +0x8198 0x2178 0x00A7 # SECTION SIGN +0x8199 0x2179 0x2606 # WHITE STAR +0x819A 0x217A 0x2605 # BLACK STAR +0x819B 0x217B 0x25CB # WHITE CIRCLE +0x819C 0x217C 0x25CF # BLACK CIRCLE +0x819D 0x217D 0x25CE # BULLSEYE +0x819E 0x217E 0x25C7 # WHITE DIAMOND +0x819F 0x2221 0x25C6 # BLACK DIAMOND +0x81A0 0x2222 0x25A1 # WHITE SQUARE +0x81A1 0x2223 0x25A0 # BLACK SQUARE +0x81A2 0x2224 0x25B3 # WHITE UP-POINTING TRIANGLE +0x81A3 0x2225 0x25B2 # BLACK UP-POINTING TRIANGLE +0x81A4 0x2226 0x25BD # WHITE DOWN-POINTING TRIANGLE +0x81A5 0x2227 0x25BC # BLACK DOWN-POINTING TRIANGLE +0x81A6 0x2228 0x203B # REFERENCE MARK +0x81A7 0x2229 0x3012 # POSTAL MARK +0x81A8 0x222A 0x2192 # RIGHTWARDS ARROW +0x81A9 0x222B 0x2190 # LEFTWARDS ARROW +0x81AA 0x222C 0x2191 # UPWARDS ARROW +0x81AB 0x222D 0x2193 # DOWNWARDS ARROW +0x81AC 0x222E 0x3013 # GETA MARK +0x81B8 0x223A 0x2208 # ELEMENT OF +0x81B9 0x223B 0x220B # CONTAINS AS MEMBER +0x81BA 0x223C 0x2286 # SUBSET OF OR EQUAL TO +0x81BB 0x223D 0x2287 # SUPERSET OF OR EQUAL TO +0x81BC 0x223E 0x2282 # SUBSET OF +0x81BD 0x223F 0x2283 # SUPERSET OF +0x81BE 0x2240 0x222A # UNION +0x81BF 0x2241 0x2229 # INTERSECTION +0x81C8 0x224A 0x2227 # LOGICAL AND +0x81C9 0x224B 0x2228 # LOGICAL OR +0x81CA 0x224C 0x00AC # NOT SIGN +0x81CB 0x224D 0x21D2 # RIGHTWARDS DOUBLE ARROW +0x81CC 0x224E 0x21D4 # LEFT RIGHT DOUBLE ARROW +0x81CD 0x224F 0x2200 # FOR ALL +0x81CE 0x2250 0x2203 # THERE EXISTS +0x81DA 0x225C 0x2220 # ANGLE +0x81DB 0x225D 0x22A5 # UP TACK +0x81DC 0x225E 0x2312 # ARC +0x81DD 0x225F 0x2202 # PARTIAL DIFFERENTIAL +0x81DE 0x2260 0x2207 # NABLA +0x81DF 0x2261 0x2261 # IDENTICAL TO +0x81E0 0x2262 0x2252 # APPROXIMATELY EQUAL TO OR THE IMAGE OF +0x81E1 0x2263 0x226A # MUCH LESS-THAN +0x81E2 0x2264 0x226B # MUCH GREATER-THAN +0x81E3 0x2265 0x221A # SQUARE ROOT +0x81E4 0x2266 0x223D # REVERSED TILDE +0x81E5 0x2267 0x221D # PROPORTIONAL TO +0x81E6 0x2268 0x2235 # BECAUSE +0x81E7 0x2269 0x222B # INTEGRAL +0x81E8 0x226A 0x222C # DOUBLE INTEGRAL +0x81F0 0x2272 0x212B # ANGSTROM SIGN +0x81F1 0x2273 0x2030 # PER MILLE SIGN +0x81F2 0x2274 0x266F # MUSIC SHARP SIGN +0x81F3 0x2275 0x266D # MUSIC FLAT SIGN +0x81F4 0x2276 0x266A # EIGHTH NOTE +0x81F5 0x2277 0x2020 # DAGGER +0x81F6 0x2278 0x2021 # DOUBLE DAGGER +0x81F7 0x2279 0x00B6 # PILCROW SIGN +0x81FC 0x227E 0x25EF # LARGE CIRCLE +0x824F 0x2330 0xFF10 # FULLWIDTH DIGIT ZERO +0x8250 0x2331 0xFF11 # FULLWIDTH DIGIT ONE +0x8251 0x2332 0xFF12 # FULLWIDTH DIGIT TWO +0x8252 0x2333 0xFF13 # FULLWIDTH DIGIT THREE +0x8253 0x2334 0xFF14 # FULLWIDTH DIGIT FOUR +0x8254 0x2335 0xFF15 # FULLWIDTH DIGIT FIVE +0x8255 0x2336 0xFF16 # FULLWIDTH DIGIT SIX +0x8256 0x2337 0xFF17 # FULLWIDTH DIGIT SEVEN +0x8257 0x2338 0xFF18 # FULLWIDTH DIGIT EIGHT +0x8258 0x2339 0xFF19 # FULLWIDTH DIGIT NINE +0x8260 0x2341 0xFF21 # FULLWIDTH LATIN CAPITAL LETTER A +0x8261 0x2342 0xFF22 # FULLWIDTH LATIN CAPITAL LETTER B +0x8262 0x2343 0xFF23 # FULLWIDTH LATIN CAPITAL LETTER C +0x8263 0x2344 0xFF24 # FULLWIDTH LATIN CAPITAL LETTER D +0x8264 0x2345 0xFF25 # FULLWIDTH LATIN CAPITAL LETTER E +0x8265 0x2346 0xFF26 # FULLWIDTH LATIN CAPITAL LETTER F +0x8266 0x2347 0xFF27 # FULLWIDTH LATIN CAPITAL LETTER G +0x8267 0x2348 0xFF28 # FULLWIDTH LATIN CAPITAL LETTER H +0x8268 0x2349 0xFF29 # FULLWIDTH LATIN CAPITAL LETTER I +0x8269 0x234A 0xFF2A # FULLWIDTH LATIN CAPITAL LETTER J +0x826A 0x234B 0xFF2B # FULLWIDTH LATIN CAPITAL LETTER K +0x826B 0x234C 0xFF2C # FULLWIDTH LATIN CAPITAL LETTER L +0x826C 0x234D 0xFF2D # FULLWIDTH LATIN CAPITAL LETTER M +0x826D 0x234E 0xFF2E # FULLWIDTH LATIN CAPITAL LETTER N +0x826E 0x234F 0xFF2F # FULLWIDTH LATIN CAPITAL LETTER O +0x826F 0x2350 0xFF30 # FULLWIDTH LATIN CAPITAL LETTER P +0x8270 0x2351 0xFF31 # FULLWIDTH LATIN CAPITAL LETTER Q +0x8271 0x2352 0xFF32 # FULLWIDTH LATIN CAPITAL LETTER R +0x8272 0x2353 0xFF33 # FULLWIDTH LATIN CAPITAL LETTER S +0x8273 0x2354 0xFF34 # FULLWIDTH LATIN CAPITAL LETTER T +0x8274 0x2355 0xFF35 # FULLWIDTH LATIN CAPITAL LETTER U +0x8275 0x2356 0xFF36 # FULLWIDTH LATIN CAPITAL LETTER V +0x8276 0x2357 0xFF37 # FULLWIDTH LATIN CAPITAL LETTER W +0x8277 0x2358 0xFF38 # FULLWIDTH LATIN CAPITAL LETTER X +0x8278 0x2359 0xFF39 # FULLWIDTH LATIN CAPITAL LETTER Y +0x8279 0x235A 0xFF3A # FULLWIDTH LATIN CAPITAL LETTER Z +0x8281 0x2361 0xFF41 # FULLWIDTH LATIN SMALL LETTER A +0x8282 0x2362 0xFF42 # FULLWIDTH LATIN SMALL LETTER B +0x8283 0x2363 0xFF43 # FULLWIDTH LATIN SMALL LETTER C +0x8284 0x2364 0xFF44 # FULLWIDTH LATIN SMALL LETTER D +0x8285 0x2365 0xFF45 # FULLWIDTH LATIN SMALL LETTER E +0x8286 0x2366 0xFF46 # FULLWIDTH LATIN SMALL LETTER F +0x8287 0x2367 0xFF47 # FULLWIDTH LATIN SMALL LETTER G +0x8288 0x2368 0xFF48 # FULLWIDTH LATIN SMALL LETTER H +0x8289 0x2369 0xFF49 # FULLWIDTH LATIN SMALL LETTER I +0x828A 0x236A 0xFF4A # FULLWIDTH LATIN SMALL LETTER J +0x828B 0x236B 0xFF4B # FULLWIDTH LATIN SMALL LETTER K +0x828C 0x236C 0xFF4C # FULLWIDTH LATIN SMALL LETTER L +0x828D 0x236D 0xFF4D # FULLWIDTH LATIN SMALL LETTER M +0x828E 0x236E 0xFF4E # FULLWIDTH LATIN SMALL LETTER N +0x828F 0x236F 0xFF4F # FULLWIDTH LATIN SMALL LETTER O +0x8290 0x2370 0xFF50 # FULLWIDTH LATIN SMALL LETTER P +0x8291 0x2371 0xFF51 # FULLWIDTH LATIN SMALL LETTER Q +0x8292 0x2372 0xFF52 # FULLWIDTH LATIN SMALL LETTER R +0x8293 0x2373 0xFF53 # FULLWIDTH LATIN SMALL LETTER S +0x8294 0x2374 0xFF54 # FULLWIDTH LATIN SMALL LETTER T +0x8295 0x2375 0xFF55 # FULLWIDTH LATIN SMALL LETTER U +0x8296 0x2376 0xFF56 # FULLWIDTH LATIN SMALL LETTER V +0x8297 0x2377 0xFF57 # FULLWIDTH LATIN SMALL LETTER W +0x8298 0x2378 0xFF58 # FULLWIDTH LATIN SMALL LETTER X +0x8299 0x2379 0xFF59 # FULLWIDTH LATIN SMALL LETTER Y +0x829A 0x237A 0xFF5A # FULLWIDTH LATIN SMALL LETTER Z +0x829F 0x2421 0x3041 # HIRAGANA LETTER SMALL A +0x82A0 0x2422 0x3042 # HIRAGANA LETTER A +0x82A1 0x2423 0x3043 # HIRAGANA LETTER SMALL I +0x82A2 0x2424 0x3044 # HIRAGANA LETTER I +0x82A3 0x2425 0x3045 # HIRAGANA LETTER SMALL U +0x82A4 0x2426 0x3046 # HIRAGANA LETTER U +0x82A5 0x2427 0x3047 # HIRAGANA LETTER SMALL E +0x82A6 0x2428 0x3048 # HIRAGANA LETTER E +0x82A7 0x2429 0x3049 # HIRAGANA LETTER SMALL O +0x82A8 0x242A 0x304A # HIRAGANA LETTER O +0x82A9 0x242B 0x304B # HIRAGANA LETTER KA +0x82AA 0x242C 0x304C # HIRAGANA LETTER GA +0x82AB 0x242D 0x304D # HIRAGANA LETTER KI +0x82AC 0x242E 0x304E # HIRAGANA LETTER GI +0x82AD 0x242F 0x304F # HIRAGANA LETTER KU +0x82AE 0x2430 0x3050 # HIRAGANA LETTER GU +0x82AF 0x2431 0x3051 # HIRAGANA LETTER KE +0x82B0 0x2432 0x3052 # HIRAGANA LETTER GE +0x82B1 0x2433 0x3053 # HIRAGANA LETTER KO +0x82B2 0x2434 0x3054 # HIRAGANA LETTER GO +0x82B3 0x2435 0x3055 # HIRAGANA LETTER SA +0x82B4 0x2436 0x3056 # HIRAGANA LETTER ZA +0x82B5 0x2437 0x3057 # HIRAGANA LETTER SI +0x82B6 0x2438 0x3058 # HIRAGANA LETTER ZI +0x82B7 0x2439 0x3059 # HIRAGANA LETTER SU +0x82B8 0x243A 0x305A # HIRAGANA LETTER ZU +0x82B9 0x243B 0x305B # HIRAGANA LETTER SE +0x82BA 0x243C 0x305C # HIRAGANA LETTER ZE +0x82BB 0x243D 0x305D # HIRAGANA LETTER SO +0x82BC 0x243E 0x305E # HIRAGANA LETTER ZO +0x82BD 0x243F 0x305F # HIRAGANA LETTER TA +0x82BE 0x2440 0x3060 # HIRAGANA LETTER DA +0x82BF 0x2441 0x3061 # HIRAGANA LETTER TI +0x82C0 0x2442 0x3062 # HIRAGANA LETTER DI +0x82C1 0x2443 0x3063 # HIRAGANA LETTER SMALL TU +0x82C2 0x2444 0x3064 # HIRAGANA LETTER TU +0x82C3 0x2445 0x3065 # HIRAGANA LETTER DU +0x82C4 0x2446 0x3066 # HIRAGANA LETTER TE +0x82C5 0x2447 0x3067 # HIRAGANA LETTER DE +0x82C6 0x2448 0x3068 # HIRAGANA LETTER TO +0x82C7 0x2449 0x3069 # HIRAGANA LETTER DO +0x82C8 0x244A 0x306A # HIRAGANA LETTER NA +0x82C9 0x244B 0x306B # HIRAGANA LETTER NI +0x82CA 0x244C 0x306C # HIRAGANA LETTER NU +0x82CB 0x244D 0x306D # HIRAGANA LETTER NE +0x82CC 0x244E 0x306E # HIRAGANA LETTER NO +0x82CD 0x244F 0x306F # HIRAGANA LETTER HA +0x82CE 0x2450 0x3070 # HIRAGANA LETTER BA +0x82CF 0x2451 0x3071 # HIRAGANA LETTER PA +0x82D0 0x2452 0x3072 # HIRAGANA LETTER HI +0x82D1 0x2453 0x3073 # HIRAGANA LETTER BI +0x82D2 0x2454 0x3074 # HIRAGANA LETTER PI +0x82D3 0x2455 0x3075 # HIRAGANA LETTER HU +0x82D4 0x2456 0x3076 # HIRAGANA LETTER BU +0x82D5 0x2457 0x3077 # HIRAGANA LETTER PU +0x82D6 0x2458 0x3078 # HIRAGANA LETTER HE +0x82D7 0x2459 0x3079 # HIRAGANA LETTER BE +0x82D8 0x245A 0x307A # HIRAGANA LETTER PE +0x82D9 0x245B 0x307B # HIRAGANA LETTER HO +0x82DA 0x245C 0x307C # HIRAGANA LETTER BO +0x82DB 0x245D 0x307D # HIRAGANA LETTER PO +0x82DC 0x245E 0x307E # HIRAGANA LETTER MA +0x82DD 0x245F 0x307F # HIRAGANA LETTER MI +0x82DE 0x2460 0x3080 # HIRAGANA LETTER MU +0x82DF 0x2461 0x3081 # HIRAGANA LETTER ME +0x82E0 0x2462 0x3082 # HIRAGANA LETTER MO +0x82E1 0x2463 0x3083 # HIRAGANA LETTER SMALL YA +0x82E2 0x2464 0x3084 # HIRAGANA LETTER YA +0x82E3 0x2465 0x3085 # HIRAGANA LETTER SMALL YU +0x82E4 0x2466 0x3086 # HIRAGANA LETTER YU +0x82E5 0x2467 0x3087 # HIRAGANA LETTER SMALL YO +0x82E6 0x2468 0x3088 # HIRAGANA LETTER YO +0x82E7 0x2469 0x3089 # HIRAGANA LETTER RA +0x82E8 0x246A 0x308A # HIRAGANA LETTER RI +0x82E9 0x246B 0x308B # HIRAGANA LETTER RU +0x82EA 0x246C 0x308C # HIRAGANA LETTER RE +0x82EB 0x246D 0x308D # HIRAGANA LETTER RO +0x82EC 0x246E 0x308E # HIRAGANA LETTER SMALL WA +0x82ED 0x246F 0x308F # HIRAGANA LETTER WA +0x82EE 0x2470 0x3090 # HIRAGANA LETTER WI +0x82EF 0x2471 0x3091 # HIRAGANA LETTER WE +0x82F0 0x2472 0x3092 # HIRAGANA LETTER WO +0x82F1 0x2473 0x3093 # HIRAGANA LETTER N +0x8340 0x2521 0x30A1 # KATAKANA LETTER SMALL A +0x8341 0x2522 0x30A2 # KATAKANA LETTER A +0x8342 0x2523 0x30A3 # KATAKANA LETTER SMALL I +0x8343 0x2524 0x30A4 # KATAKANA LETTER I +0x8344 0x2525 0x30A5 # KATAKANA LETTER SMALL U +0x8345 0x2526 0x30A6 # KATAKANA LETTER U +0x8346 0x2527 0x30A7 # KATAKANA LETTER SMALL E +0x8347 0x2528 0x30A8 # KATAKANA LETTER E +0x8348 0x2529 0x30A9 # KATAKANA LETTER SMALL O +0x8349 0x252A 0x30AA # KATAKANA LETTER O +0x834A 0x252B 0x30AB # KATAKANA LETTER KA +0x834B 0x252C 0x30AC # KATAKANA LETTER GA +0x834C 0x252D 0x30AD # KATAKANA LETTER KI +0x834D 0x252E 0x30AE # KATAKANA LETTER GI +0x834E 0x252F 0x30AF # KATAKANA LETTER KU +0x834F 0x2530 0x30B0 # KATAKANA LETTER GU +0x8350 0x2531 0x30B1 # KATAKANA LETTER KE +0x8351 0x2532 0x30B2 # KATAKANA LETTER GE +0x8352 0x2533 0x30B3 # KATAKANA LETTER KO +0x8353 0x2534 0x30B4 # KATAKANA LETTER GO +0x8354 0x2535 0x30B5 # KATAKANA LETTER SA +0x8355 0x2536 0x30B6 # KATAKANA LETTER ZA +0x8356 0x2537 0x30B7 # KATAKANA LETTER SI +0x8357 0x2538 0x30B8 # KATAKANA LETTER ZI +0x8358 0x2539 0x30B9 # KATAKANA LETTER SU +0x8359 0x253A 0x30BA # KATAKANA LETTER ZU +0x835A 0x253B 0x30BB # KATAKANA LETTER SE +0x835B 0x253C 0x30BC # KATAKANA LETTER ZE +0x835C 0x253D 0x30BD # KATAKANA LETTER SO +0x835D 0x253E 0x30BE # KATAKANA LETTER ZO +0x835E 0x253F 0x30BF # KATAKANA LETTER TA +0x835F 0x2540 0x30C0 # KATAKANA LETTER DA +0x8360 0x2541 0x30C1 # KATAKANA LETTER TI +0x8361 0x2542 0x30C2 # KATAKANA LETTER DI +0x8362 0x2543 0x30C3 # KATAKANA LETTER SMALL TU +0x8363 0x2544 0x30C4 # KATAKANA LETTER TU +0x8364 0x2545 0x30C5 # KATAKANA LETTER DU +0x8365 0x2546 0x30C6 # KATAKANA LETTER TE +0x8366 0x2547 0x30C7 # KATAKANA LETTER DE +0x8367 0x2548 0x30C8 # KATAKANA LETTER TO +0x8368 0x2549 0x30C9 # KATAKANA LETTER DO +0x8369 0x254A 0x30CA # KATAKANA LETTER NA +0x836A 0x254B 0x30CB # KATAKANA LETTER NI +0x836B 0x254C 0x30CC # KATAKANA LETTER NU +0x836C 0x254D 0x30CD # KATAKANA LETTER NE +0x836D 0x254E 0x30CE # KATAKANA LETTER NO +0x836E 0x254F 0x30CF # KATAKANA LETTER HA +0x836F 0x2550 0x30D0 # KATAKANA LETTER BA +0x8370 0x2551 0x30D1 # KATAKANA LETTER PA +0x8371 0x2552 0x30D2 # KATAKANA LETTER HI +0x8372 0x2553 0x30D3 # KATAKANA LETTER BI +0x8373 0x2554 0x30D4 # KATAKANA LETTER PI +0x8374 0x2555 0x30D5 # KATAKANA LETTER HU +0x8375 0x2556 0x30D6 # KATAKANA LETTER BU +0x8376 0x2557 0x30D7 # KATAKANA LETTER PU +0x8377 0x2558 0x30D8 # KATAKANA LETTER HE +0x8378 0x2559 0x30D9 # KATAKANA LETTER BE +0x8379 0x255A 0x30DA # KATAKANA LETTER PE +0x837A 0x255B 0x30DB # KATAKANA LETTER HO +0x837B 0x255C 0x30DC # KATAKANA LETTER BO +0x837C 0x255D 0x30DD # KATAKANA LETTER PO +0x837D 0x255E 0x30DE # KATAKANA LETTER MA +0x837E 0x255F 0x30DF # KATAKANA LETTER MI +0x8380 0x2560 0x30E0 # KATAKANA LETTER MU +0x8381 0x2561 0x30E1 # KATAKANA LETTER ME +0x8382 0x2562 0x30E2 # KATAKANA LETTER MO +0x8383 0x2563 0x30E3 # KATAKANA LETTER SMALL YA +0x8384 0x2564 0x30E4 # KATAKANA LETTER YA +0x8385 0x2565 0x30E5 # KATAKANA LETTER SMALL YU +0x8386 0x2566 0x30E6 # KATAKANA LETTER YU +0x8387 0x2567 0x30E7 # KATAKANA LETTER SMALL YO +0x8388 0x2568 0x30E8 # KATAKANA LETTER YO +0x8389 0x2569 0x30E9 # KATAKANA LETTER RA +0x838A 0x256A 0x30EA # KATAKANA LETTER RI +0x838B 0x256B 0x30EB # KATAKANA LETTER RU +0x838C 0x256C 0x30EC # KATAKANA LETTER RE +0x838D 0x256D 0x30ED # KATAKANA LETTER RO +0x838E 0x256E 0x30EE # KATAKANA LETTER SMALL WA +0x838F 0x256F 0x30EF # KATAKANA LETTER WA +0x8390 0x2570 0x30F0 # KATAKANA LETTER WI +0x8391 0x2571 0x30F1 # KATAKANA LETTER WE +0x8392 0x2572 0x30F2 # KATAKANA LETTER WO +0x8393 0x2573 0x30F3 # KATAKANA LETTER N +0x8394 0x2574 0x30F4 # KATAKANA LETTER VU +0x8395 0x2575 0x30F5 # KATAKANA LETTER SMALL KA +0x8396 0x2576 0x30F6 # KATAKANA LETTER SMALL KE +0x839F 0x2621 0x0391 # GREEK CAPITAL LETTER ALPHA +0x83A0 0x2622 0x0392 # GREEK CAPITAL LETTER BETA +0x83A1 0x2623 0x0393 # GREEK CAPITAL LETTER GAMMA +0x83A2 0x2624 0x0394 # GREEK CAPITAL LETTER DELTA +0x83A3 0x2625 0x0395 # GREEK CAPITAL LETTER EPSILON +0x83A4 0x2626 0x0396 # GREEK CAPITAL LETTER ZETA +0x83A5 0x2627 0x0397 # GREEK CAPITAL LETTER ETA +0x83A6 0x2628 0x0398 # GREEK CAPITAL LETTER THETA +0x83A7 0x2629 0x0399 # GREEK CAPITAL LETTER IOTA +0x83A8 0x262A 0x039A # GREEK CAPITAL LETTER KAPPA +0x83A9 0x262B 0x039B # GREEK CAPITAL LETTER LAMDA +0x83AA 0x262C 0x039C # GREEK CAPITAL LETTER MU +0x83AB 0x262D 0x039D # GREEK CAPITAL LETTER NU +0x83AC 0x262E 0x039E # GREEK CAPITAL LETTER XI +0x83AD 0x262F 0x039F # GREEK CAPITAL LETTER OMICRON +0x83AE 0x2630 0x03A0 # GREEK CAPITAL LETTER PI +0x83AF 0x2631 0x03A1 # GREEK CAPITAL LETTER RHO +0x83B0 0x2632 0x03A3 # GREEK CAPITAL LETTER SIGMA +0x83B1 0x2633 0x03A4 # GREEK CAPITAL LETTER TAU +0x83B2 0x2634 0x03A5 # GREEK CAPITAL LETTER UPSILON +0x83B3 0x2635 0x03A6 # GREEK CAPITAL LETTER PHI +0x83B4 0x2636 0x03A7 # GREEK CAPITAL LETTER CHI +0x83B5 0x2637 0x03A8 # GREEK CAPITAL LETTER PSI +0x83B6 0x2638 0x03A9 # GREEK CAPITAL LETTER OMEGA +0x83BF 0x2641 0x03B1 # GREEK SMALL LETTER ALPHA +0x83C0 0x2642 0x03B2 # GREEK SMALL LETTER BETA +0x83C1 0x2643 0x03B3 # GREEK SMALL LETTER GAMMA +0x83C2 0x2644 0x03B4 # GREEK SMALL LETTER DELTA +0x83C3 0x2645 0x03B5 # GREEK SMALL LETTER EPSILON +0x83C4 0x2646 0x03B6 # GREEK SMALL LETTER ZETA +0x83C5 0x2647 0x03B7 # GREEK SMALL LETTER ETA +0x83C6 0x2648 0x03B8 # GREEK SMALL LETTER THETA +0x83C7 0x2649 0x03B9 # GREEK SMALL LETTER IOTA +0x83C8 0x264A 0x03BA # GREEK SMALL LETTER KAPPA +0x83C9 0x264B 0x03BB # GREEK SMALL LETTER LAMDA +0x83CA 0x264C 0x03BC # GREEK SMALL LETTER MU +0x83CB 0x264D 0x03BD # GREEK SMALL LETTER NU +0x83CC 0x264E 0x03BE # GREEK SMALL LETTER XI +0x83CD 0x264F 0x03BF # GREEK SMALL LETTER OMICRON +0x83CE 0x2650 0x03C0 # GREEK SMALL LETTER PI +0x83CF 0x2651 0x03C1 # GREEK SMALL LETTER RHO +0x83D0 0x2652 0x03C3 # GREEK SMALL LETTER SIGMA +0x83D1 0x2653 0x03C4 # GREEK SMALL LETTER TAU +0x83D2 0x2654 0x03C5 # GREEK SMALL LETTER UPSILON +0x83D3 0x2655 0x03C6 # GREEK SMALL LETTER PHI +0x83D4 0x2656 0x03C7 # GREEK SMALL LETTER CHI +0x83D5 0x2657 0x03C8 # GREEK SMALL LETTER PSI +0x83D6 0x2658 0x03C9 # GREEK SMALL LETTER OMEGA +0x8440 0x2721 0x0410 # CYRILLIC CAPITAL LETTER A +0x8441 0x2722 0x0411 # CYRILLIC CAPITAL LETTER BE +0x8442 0x2723 0x0412 # CYRILLIC CAPITAL LETTER VE +0x8443 0x2724 0x0413 # CYRILLIC CAPITAL LETTER GHE +0x8444 0x2725 0x0414 # CYRILLIC CAPITAL LETTER DE +0x8445 0x2726 0x0415 # CYRILLIC CAPITAL LETTER IE +0x8446 0x2727 0x0401 # CYRILLIC CAPITAL LETTER IO +0x8447 0x2728 0x0416 # CYRILLIC CAPITAL LETTER ZHE +0x8448 0x2729 0x0417 # CYRILLIC CAPITAL LETTER ZE +0x8449 0x272A 0x0418 # CYRILLIC CAPITAL LETTER I +0x844A 0x272B 0x0419 # CYRILLIC CAPITAL LETTER SHORT I +0x844B 0x272C 0x041A # CYRILLIC CAPITAL LETTER KA +0x844C 0x272D 0x041B # CYRILLIC CAPITAL LETTER EL +0x844D 0x272E 0x041C # CYRILLIC CAPITAL LETTER EM +0x844E 0x272F 0x041D # CYRILLIC CAPITAL LETTER EN +0x844F 0x2730 0x041E # CYRILLIC CAPITAL LETTER O +0x8450 0x2731 0x041F # CYRILLIC CAPITAL LETTER PE +0x8451 0x2732 0x0420 # CYRILLIC CAPITAL LETTER ER +0x8452 0x2733 0x0421 # CYRILLIC CAPITAL LETTER ES +0x8453 0x2734 0x0422 # CYRILLIC CAPITAL LETTER TE +0x8454 0x2735 0x0423 # CYRILLIC CAPITAL LETTER U +0x8455 0x2736 0x0424 # CYRILLIC CAPITAL LETTER EF +0x8456 0x2737 0x0425 # CYRILLIC CAPITAL LETTER HA +0x8457 0x2738 0x0426 # CYRILLIC CAPITAL LETTER TSE +0x8458 0x2739 0x0427 # CYRILLIC CAPITAL LETTER CHE +0x8459 0x273A 0x0428 # CYRILLIC CAPITAL LETTER SHA +0x845A 0x273B 0x0429 # CYRILLIC CAPITAL LETTER SHCHA +0x845B 0x273C 0x042A # CYRILLIC CAPITAL LETTER HARD SIGN +0x845C 0x273D 0x042B # CYRILLIC CAPITAL LETTER YERU +0x845D 0x273E 0x042C # CYRILLIC CAPITAL LETTER SOFT SIGN +0x845E 0x273F 0x042D # CYRILLIC CAPITAL LETTER E +0x845F 0x2740 0x042E # CYRILLIC CAPITAL LETTER YU +0x8460 0x2741 0x042F # CYRILLIC CAPITAL LETTER YA +0x8470 0x2751 0x0430 # CYRILLIC SMALL LETTER A +0x8471 0x2752 0x0431 # CYRILLIC SMALL LETTER BE +0x8472 0x2753 0x0432 # CYRILLIC SMALL LETTER VE +0x8473 0x2754 0x0433 # CYRILLIC SMALL LETTER GHE +0x8474 0x2755 0x0434 # CYRILLIC SMALL LETTER DE +0x8475 0x2756 0x0435 # CYRILLIC SMALL LETTER IE +0x8476 0x2757 0x0451 # CYRILLIC SMALL LETTER IO +0x8477 0x2758 0x0436 # CYRILLIC SMALL LETTER ZHE +0x8478 0x2759 0x0437 # CYRILLIC SMALL LETTER ZE +0x8479 0x275A 0x0438 # CYRILLIC SMALL LETTER I +0x847A 0x275B 0x0439 # CYRILLIC SMALL LETTER SHORT I +0x847B 0x275C 0x043A # CYRILLIC SMALL LETTER KA +0x847C 0x275D 0x043B # CYRILLIC SMALL LETTER EL +0x847D 0x275E 0x043C # CYRILLIC SMALL LETTER EM +0x847E 0x275F 0x043D # CYRILLIC SMALL LETTER EN +0x8480 0x2760 0x043E # CYRILLIC SMALL LETTER O +0x8481 0x2761 0x043F # CYRILLIC SMALL LETTER PE +0x8482 0x2762 0x0440 # CYRILLIC SMALL LETTER ER +0x8483 0x2763 0x0441 # CYRILLIC SMALL LETTER ES +0x8484 0x2764 0x0442 # CYRILLIC SMALL LETTER TE +0x8485 0x2765 0x0443 # CYRILLIC SMALL LETTER U +0x8486 0x2766 0x0444 # CYRILLIC SMALL LETTER EF +0x8487 0x2767 0x0445 # CYRILLIC SMALL LETTER HA +0x8488 0x2768 0x0446 # CYRILLIC SMALL LETTER TSE +0x8489 0x2769 0x0447 # CYRILLIC SMALL LETTER CHE +0x848A 0x276A 0x0448 # CYRILLIC SMALL LETTER SHA +0x848B 0x276B 0x0449 # CYRILLIC SMALL LETTER SHCHA +0x848C 0x276C 0x044A # CYRILLIC SMALL LETTER HARD SIGN +0x848D 0x276D 0x044B # CYRILLIC SMALL LETTER YERU +0x848E 0x276E 0x044C # CYRILLIC SMALL LETTER SOFT SIGN +0x848F 0x276F 0x044D # CYRILLIC SMALL LETTER E +0x8490 0x2770 0x044E # CYRILLIC SMALL LETTER YU +0x8491 0x2771 0x044F # CYRILLIC SMALL LETTER YA +0x849F 0x2821 0x2500 # BOX DRAWINGS LIGHT HORIZONTAL +0x84A0 0x2822 0x2502 # BOX DRAWINGS LIGHT VERTICAL +0x84A1 0x2823 0x250C # BOX DRAWINGS LIGHT DOWN AND RIGHT +0x84A2 0x2824 0x2510 # BOX DRAWINGS LIGHT DOWN AND LEFT +0x84A3 0x2825 0x2518 # BOX DRAWINGS LIGHT UP AND LEFT +0x84A4 0x2826 0x2514 # BOX DRAWINGS LIGHT UP AND RIGHT +0x84A5 0x2827 0x251C # BOX DRAWINGS LIGHT VERTICAL AND RIGHT +0x84A6 0x2828 0x252C # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL +0x84A7 0x2829 0x2524 # BOX DRAWINGS LIGHT VERTICAL AND LEFT +0x84A8 0x282A 0x2534 # BOX DRAWINGS LIGHT UP AND HORIZONTAL +0x84A9 0x282B 0x253C # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL +0x84AA 0x282C 0x2501 # BOX DRAWINGS HEAVY HORIZONTAL +0x84AB 0x282D 0x2503 # BOX DRAWINGS HEAVY VERTICAL +0x84AC 0x282E 0x250F # BOX DRAWINGS HEAVY DOWN AND RIGHT +0x84AD 0x282F 0x2513 # BOX DRAWINGS HEAVY DOWN AND LEFT +0x84AE 0x2830 0x251B # BOX DRAWINGS HEAVY UP AND LEFT +0x84AF 0x2831 0x2517 # BOX DRAWINGS HEAVY UP AND RIGHT +0x84B0 0x2832 0x2523 # BOX DRAWINGS HEAVY VERTICAL AND RIGHT +0x84B1 0x2833 0x2533 # BOX DRAWINGS HEAVY DOWN AND HORIZONTAL +0x84B2 0x2834 0x252B # BOX DRAWINGS HEAVY VERTICAL AND LEFT +0x84B3 0x2835 0x253B # BOX DRAWINGS HEAVY UP AND HORIZONTAL +0x84B4 0x2836 0x254B # BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL +0x84B5 0x2837 0x2520 # BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT +0x84B6 0x2838 0x252F # BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY +0x84B7 0x2839 0x2528 # BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT +0x84B8 0x283A 0x2537 # BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY +0x84B9 0x283B 0x253F # BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY +0x84BA 0x283C 0x251D # BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY +0x84BB 0x283D 0x2530 # BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT +0x84BC 0x283E 0x2525 # BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY +0x84BD 0x283F 0x2538 # BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT +0x84BE 0x2840 0x2542 # BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT +0x889F 0x3021 0x4E9C # +0x88A0 0x3022 0x5516 # +0x88A1 0x3023 0x5A03 # +0x88A2 0x3024 0x963F # +0x88A3 0x3025 0x54C0 # +0x88A4 0x3026 0x611B # +0x88A5 0x3027 0x6328 # +0x88A6 0x3028 0x59F6 # +0x88A7 0x3029 0x9022 # +0x88A8 0x302A 0x8475 # +0x88A9 0x302B 0x831C # +0x88AA 0x302C 0x7A50 # +0x88AB 0x302D 0x60AA # +0x88AC 0x302E 0x63E1 # +0x88AD 0x302F 0x6E25 # +0x88AE 0x3030 0x65ED # +0x88AF 0x3031 0x8466 # +0x88B0 0x3032 0x82A6 # +0x88B1 0x3033 0x9BF5 # +0x88B2 0x3034 0x6893 # +0x88B3 0x3035 0x5727 # +0x88B4 0x3036 0x65A1 # +0x88B5 0x3037 0x6271 # +0x88B6 0x3038 0x5B9B # +0x88B7 0x3039 0x59D0 # +0x88B8 0x303A 0x867B # +0x88B9 0x303B 0x98F4 # +0x88BA 0x303C 0x7D62 # +0x88BB 0x303D 0x7DBE # +0x88BC 0x303E 0x9B8E # +0x88BD 0x303F 0x6216 # +0x88BE 0x3040 0x7C9F # +0x88BF 0x3041 0x88B7 # +0x88C0 0x3042 0x5B89 # +0x88C1 0x3043 0x5EB5 # +0x88C2 0x3044 0x6309 # +0x88C3 0x3045 0x6697 # +0x88C4 0x3046 0x6848 # +0x88C5 0x3047 0x95C7 # +0x88C6 0x3048 0x978D # +0x88C7 0x3049 0x674F # +0x88C8 0x304A 0x4EE5 # +0x88C9 0x304B 0x4F0A # +0x88CA 0x304C 0x4F4D # +0x88CB 0x304D 0x4F9D # +0x88CC 0x304E 0x5049 # +0x88CD 0x304F 0x56F2 # +0x88CE 0x3050 0x5937 # +0x88CF 0x3051 0x59D4 # +0x88D0 0x3052 0x5A01 # +0x88D1 0x3053 0x5C09 # +0x88D2 0x3054 0x60DF # +0x88D3 0x3055 0x610F # +0x88D4 0x3056 0x6170 # +0x88D5 0x3057 0x6613 # +0x88D6 0x3058 0x6905 # +0x88D7 0x3059 0x70BA # +0x88D8 0x305A 0x754F # +0x88D9 0x305B 0x7570 # +0x88DA 0x305C 0x79FB # +0x88DB 0x305D 0x7DAD # +0x88DC 0x305E 0x7DEF # +0x88DD 0x305F 0x80C3 # +0x88DE 0x3060 0x840E # +0x88DF 0x3061 0x8863 # +0x88E0 0x3062 0x8B02 # +0x88E1 0x3063 0x9055 # +0x88E2 0x3064 0x907A # +0x88E3 0x3065 0x533B # +0x88E4 0x3066 0x4E95 # +0x88E5 0x3067 0x4EA5 # +0x88E6 0x3068 0x57DF # +0x88E7 0x3069 0x80B2 # +0x88E8 0x306A 0x90C1 # +0x88E9 0x306B 0x78EF # +0x88EA 0x306C 0x4E00 # +0x88EB 0x306D 0x58F1 # +0x88EC 0x306E 0x6EA2 # +0x88ED 0x306F 0x9038 # +0x88EE 0x3070 0x7A32 # +0x88EF 0x3071 0x8328 # +0x88F0 0x3072 0x828B # +0x88F1 0x3073 0x9C2F # +0x88F2 0x3074 0x5141 # +0x88F3 0x3075 0x5370 # +0x88F4 0x3076 0x54BD # +0x88F5 0x3077 0x54E1 # +0x88F6 0x3078 0x56E0 # +0x88F7 0x3079 0x59FB # +0x88F8 0x307A 0x5F15 # +0x88F9 0x307B 0x98F2 # +0x88FA 0x307C 0x6DEB # +0x88FB 0x307D 0x80E4 # +0x88FC 0x307E 0x852D # +0x8940 0x3121 0x9662 # +0x8941 0x3122 0x9670 # +0x8942 0x3123 0x96A0 # +0x8943 0x3124 0x97FB # +0x8944 0x3125 0x540B # +0x8945 0x3126 0x53F3 # +0x8946 0x3127 0x5B87 # +0x8947 0x3128 0x70CF # +0x8948 0x3129 0x7FBD # +0x8949 0x312A 0x8FC2 # +0x894A 0x312B 0x96E8 # +0x894B 0x312C 0x536F # +0x894C 0x312D 0x9D5C # +0x894D 0x312E 0x7ABA # +0x894E 0x312F 0x4E11 # +0x894F 0x3130 0x7893 # +0x8950 0x3131 0x81FC # +0x8951 0x3132 0x6E26 # +0x8952 0x3133 0x5618 # +0x8953 0x3134 0x5504 # +0x8954 0x3135 0x6B1D # +0x8955 0x3136 0x851A # +0x8956 0x3137 0x9C3B # +0x8957 0x3138 0x59E5 # +0x8958 0x3139 0x53A9 # +0x8959 0x313A 0x6D66 # +0x895A 0x313B 0x74DC # +0x895B 0x313C 0x958F # +0x895C 0x313D 0x5642 # +0x895D 0x313E 0x4E91 # +0x895E 0x313F 0x904B # +0x895F 0x3140 0x96F2 # +0x8960 0x3141 0x834F # +0x8961 0x3142 0x990C # +0x8962 0x3143 0x53E1 # +0x8963 0x3144 0x55B6 # +0x8964 0x3145 0x5B30 # +0x8965 0x3146 0x5F71 # +0x8966 0x3147 0x6620 # +0x8967 0x3148 0x66F3 # +0x8968 0x3149 0x6804 # +0x8969 0x314A 0x6C38 # +0x896A 0x314B 0x6CF3 # +0x896B 0x314C 0x6D29 # +0x896C 0x314D 0x745B # +0x896D 0x314E 0x76C8 # +0x896E 0x314F 0x7A4E # +0x896F 0x3150 0x9834 # +0x8970 0x3151 0x82F1 # +0x8971 0x3152 0x885B # +0x8972 0x3153 0x8A60 # +0x8973 0x3154 0x92ED # +0x8974 0x3155 0x6DB2 # +0x8975 0x3156 0x75AB # +0x8976 0x3157 0x76CA # +0x8977 0x3158 0x99C5 # +0x8978 0x3159 0x60A6 # +0x8979 0x315A 0x8B01 # +0x897A 0x315B 0x8D8A # +0x897B 0x315C 0x95B2 # +0x897C 0x315D 0x698E # +0x897D 0x315E 0x53AD # +0x897E 0x315F 0x5186 # +0x8980 0x3160 0x5712 # +0x8981 0x3161 0x5830 # +0x8982 0x3162 0x5944 # +0x8983 0x3163 0x5BB4 # +0x8984 0x3164 0x5EF6 # +0x8985 0x3165 0x6028 # +0x8986 0x3166 0x63A9 # +0x8987 0x3167 0x63F4 # +0x8988 0x3168 0x6CBF # +0x8989 0x3169 0x6F14 # +0x898A 0x316A 0x708E # +0x898B 0x316B 0x7114 # +0x898C 0x316C 0x7159 # +0x898D 0x316D 0x71D5 # +0x898E 0x316E 0x733F # +0x898F 0x316F 0x7E01 # +0x8990 0x3170 0x8276 # +0x8991 0x3171 0x82D1 # +0x8992 0x3172 0x8597 # +0x8993 0x3173 0x9060 # +0x8994 0x3174 0x925B # +0x8995 0x3175 0x9D1B # +0x8996 0x3176 0x5869 # +0x8997 0x3177 0x65BC # +0x8998 0x3178 0x6C5A # +0x8999 0x3179 0x7525 # +0x899A 0x317A 0x51F9 # +0x899B 0x317B 0x592E # +0x899C 0x317C 0x5965 # +0x899D 0x317D 0x5F80 # +0x899E 0x317E 0x5FDC # +0x899F 0x3221 0x62BC # +0x89A0 0x3222 0x65FA # +0x89A1 0x3223 0x6A2A # +0x89A2 0x3224 0x6B27 # +0x89A3 0x3225 0x6BB4 # +0x89A4 0x3226 0x738B # +0x89A5 0x3227 0x7FC1 # +0x89A6 0x3228 0x8956 # +0x89A7 0x3229 0x9D2C # +0x89A8 0x322A 0x9D0E # +0x89A9 0x322B 0x9EC4 # +0x89AA 0x322C 0x5CA1 # +0x89AB 0x322D 0x6C96 # +0x89AC 0x322E 0x837B # +0x89AD 0x322F 0x5104 # +0x89AE 0x3230 0x5C4B # +0x89AF 0x3231 0x61B6 # +0x89B0 0x3232 0x81C6 # +0x89B1 0x3233 0x6876 # +0x89B2 0x3234 0x7261 # +0x89B3 0x3235 0x4E59 # +0x89B4 0x3236 0x4FFA # +0x89B5 0x3237 0x5378 # +0x89B6 0x3238 0x6069 # +0x89B7 0x3239 0x6E29 # +0x89B8 0x323A 0x7A4F # +0x89B9 0x323B 0x97F3 # +0x89BA 0x323C 0x4E0B # +0x89BB 0x323D 0x5316 # +0x89BC 0x323E 0x4EEE # +0x89BD 0x323F 0x4F55 # +0x89BE 0x3240 0x4F3D # +0x89BF 0x3241 0x4FA1 # +0x89C0 0x3242 0x4F73 # +0x89C1 0x3243 0x52A0 # +0x89C2 0x3244 0x53EF # +0x89C3 0x3245 0x5609 # +0x89C4 0x3246 0x590F # +0x89C5 0x3247 0x5AC1 # +0x89C6 0x3248 0x5BB6 # +0x89C7 0x3249 0x5BE1 # +0x89C8 0x324A 0x79D1 # +0x89C9 0x324B 0x6687 # +0x89CA 0x324C 0x679C # +0x89CB 0x324D 0x67B6 # +0x89CC 0x324E 0x6B4C # +0x89CD 0x324F 0x6CB3 # +0x89CE 0x3250 0x706B # +0x89CF 0x3251 0x73C2 # +0x89D0 0x3252 0x798D # +0x89D1 0x3253 0x79BE # +0x89D2 0x3254 0x7A3C # +0x89D3 0x3255 0x7B87 # +0x89D4 0x3256 0x82B1 # +0x89D5 0x3257 0x82DB # +0x89D6 0x3258 0x8304 # +0x89D7 0x3259 0x8377 # +0x89D8 0x325A 0x83EF # +0x89D9 0x325B 0x83D3 # +0x89DA 0x325C 0x8766 # +0x89DB 0x325D 0x8AB2 # +0x89DC 0x325E 0x5629 # +0x89DD 0x325F 0x8CA8 # +0x89DE 0x3260 0x8FE6 # +0x89DF 0x3261 0x904E # +0x89E0 0x3262 0x971E # +0x89E1 0x3263 0x868A # +0x89E2 0x3264 0x4FC4 # +0x89E3 0x3265 0x5CE8 # +0x89E4 0x3266 0x6211 # +0x89E5 0x3267 0x7259 # +0x89E6 0x3268 0x753B # +0x89E7 0x3269 0x81E5 # +0x89E8 0x326A 0x82BD # +0x89E9 0x326B 0x86FE # +0x89EA 0x326C 0x8CC0 # +0x89EB 0x326D 0x96C5 # +0x89EC 0x326E 0x9913 # +0x89ED 0x326F 0x99D5 # +0x89EE 0x3270 0x4ECB # +0x89EF 0x3271 0x4F1A # +0x89F0 0x3272 0x89E3 # +0x89F1 0x3273 0x56DE # +0x89F2 0x3274 0x584A # +0x89F3 0x3275 0x58CA # +0x89F4 0x3276 0x5EFB # +0x89F5 0x3277 0x5FEB # +0x89F6 0x3278 0x602A # +0x89F7 0x3279 0x6094 # +0x89F8 0x327A 0x6062 # +0x89F9 0x327B 0x61D0 # +0x89FA 0x327C 0x6212 # +0x89FB 0x327D 0x62D0 # +0x89FC 0x327E 0x6539 # +0x8A40 0x3321 0x9B41 # +0x8A41 0x3322 0x6666 # +0x8A42 0x3323 0x68B0 # +0x8A43 0x3324 0x6D77 # +0x8A44 0x3325 0x7070 # +0x8A45 0x3326 0x754C # +0x8A46 0x3327 0x7686 # +0x8A47 0x3328 0x7D75 # +0x8A48 0x3329 0x82A5 # +0x8A49 0x332A 0x87F9 # +0x8A4A 0x332B 0x958B # +0x8A4B 0x332C 0x968E # +0x8A4C 0x332D 0x8C9D # +0x8A4D 0x332E 0x51F1 # +0x8A4E 0x332F 0x52BE # +0x8A4F 0x3330 0x5916 # +0x8A50 0x3331 0x54B3 # +0x8A51 0x3332 0x5BB3 # +0x8A52 0x3333 0x5D16 # +0x8A53 0x3334 0x6168 # +0x8A54 0x3335 0x6982 # +0x8A55 0x3336 0x6DAF # +0x8A56 0x3337 0x788D # +0x8A57 0x3338 0x84CB # +0x8A58 0x3339 0x8857 # +0x8A59 0x333A 0x8A72 # +0x8A5A 0x333B 0x93A7 # +0x8A5B 0x333C 0x9AB8 # +0x8A5C 0x333D 0x6D6C # +0x8A5D 0x333E 0x99A8 # +0x8A5E 0x333F 0x86D9 # +0x8A5F 0x3340 0x57A3 # +0x8A60 0x3341 0x67FF # +0x8A61 0x3342 0x86CE # +0x8A62 0x3343 0x920E # +0x8A63 0x3344 0x5283 # +0x8A64 0x3345 0x5687 # +0x8A65 0x3346 0x5404 # +0x8A66 0x3347 0x5ED3 # +0x8A67 0x3348 0x62E1 # +0x8A68 0x3349 0x64B9 # +0x8A69 0x334A 0x683C # +0x8A6A 0x334B 0x6838 # +0x8A6B 0x334C 0x6BBB # +0x8A6C 0x334D 0x7372 # +0x8A6D 0x334E 0x78BA # +0x8A6E 0x334F 0x7A6B # +0x8A6F 0x3350 0x899A # +0x8A70 0x3351 0x89D2 # +0x8A71 0x3352 0x8D6B # +0x8A72 0x3353 0x8F03 # +0x8A73 0x3354 0x90ED # +0x8A74 0x3355 0x95A3 # +0x8A75 0x3356 0x9694 # +0x8A76 0x3357 0x9769 # +0x8A77 0x3358 0x5B66 # +0x8A78 0x3359 0x5CB3 # +0x8A79 0x335A 0x697D # +0x8A7A 0x335B 0x984D # +0x8A7B 0x335C 0x984E # +0x8A7C 0x335D 0x639B # +0x8A7D 0x335E 0x7B20 # +0x8A7E 0x335F 0x6A2B # +0x8A80 0x3360 0x6A7F # +0x8A81 0x3361 0x68B6 # +0x8A82 0x3362 0x9C0D # +0x8A83 0x3363 0x6F5F # +0x8A84 0x3364 0x5272 # +0x8A85 0x3365 0x559D # +0x8A86 0x3366 0x6070 # +0x8A87 0x3367 0x62EC # +0x8A88 0x3368 0x6D3B # +0x8A89 0x3369 0x6E07 # +0x8A8A 0x336A 0x6ED1 # +0x8A8B 0x336B 0x845B # +0x8A8C 0x336C 0x8910 # +0x8A8D 0x336D 0x8F44 # +0x8A8E 0x336E 0x4E14 # +0x8A8F 0x336F 0x9C39 # +0x8A90 0x3370 0x53F6 # +0x8A91 0x3371 0x691B # +0x8A92 0x3372 0x6A3A # +0x8A93 0x3373 0x9784 # +0x8A94 0x3374 0x682A # +0x8A95 0x3375 0x515C # +0x8A96 0x3376 0x7AC3 # +0x8A97 0x3377 0x84B2 # +0x8A98 0x3378 0x91DC # +0x8A99 0x3379 0x938C # +0x8A9A 0x337A 0x565B # +0x8A9B 0x337B 0x9D28 # +0x8A9C 0x337C 0x6822 # +0x8A9D 0x337D 0x8305 # +0x8A9E 0x337E 0x8431 # +0x8A9F 0x3421 0x7CA5 # +0x8AA0 0x3422 0x5208 # +0x8AA1 0x3423 0x82C5 # +0x8AA2 0x3424 0x74E6 # +0x8AA3 0x3425 0x4E7E # +0x8AA4 0x3426 0x4F83 # +0x8AA5 0x3427 0x51A0 # +0x8AA6 0x3428 0x5BD2 # +0x8AA7 0x3429 0x520A # +0x8AA8 0x342A 0x52D8 # +0x8AA9 0x342B 0x52E7 # +0x8AAA 0x342C 0x5DFB # +0x8AAB 0x342D 0x559A # +0x8AAC 0x342E 0x582A # +0x8AAD 0x342F 0x59E6 # +0x8AAE 0x3430 0x5B8C # +0x8AAF 0x3431 0x5B98 # +0x8AB0 0x3432 0x5BDB # +0x8AB1 0x3433 0x5E72 # +0x8AB2 0x3434 0x5E79 # +0x8AB3 0x3435 0x60A3 # +0x8AB4 0x3436 0x611F # +0x8AB5 0x3437 0x6163 # +0x8AB6 0x3438 0x61BE # +0x8AB7 0x3439 0x63DB # +0x8AB8 0x343A 0x6562 # +0x8AB9 0x343B 0x67D1 # +0x8ABA 0x343C 0x6853 # +0x8ABB 0x343D 0x68FA # +0x8ABC 0x343E 0x6B3E # +0x8ABD 0x343F 0x6B53 # +0x8ABE 0x3440 0x6C57 # +0x8ABF 0x3441 0x6F22 # +0x8AC0 0x3442 0x6F97 # +0x8AC1 0x3443 0x6F45 # +0x8AC2 0x3444 0x74B0 # +0x8AC3 0x3445 0x7518 # +0x8AC4 0x3446 0x76E3 # +0x8AC5 0x3447 0x770B # +0x8AC6 0x3448 0x7AFF # +0x8AC7 0x3449 0x7BA1 # +0x8AC8 0x344A 0x7C21 # +0x8AC9 0x344B 0x7DE9 # +0x8ACA 0x344C 0x7F36 # +0x8ACB 0x344D 0x7FF0 # +0x8ACC 0x344E 0x809D # +0x8ACD 0x344F 0x8266 # +0x8ACE 0x3450 0x839E # +0x8ACF 0x3451 0x89B3 # +0x8AD0 0x3452 0x8ACC # +0x8AD1 0x3453 0x8CAB # +0x8AD2 0x3454 0x9084 # +0x8AD3 0x3455 0x9451 # +0x8AD4 0x3456 0x9593 # +0x8AD5 0x3457 0x9591 # +0x8AD6 0x3458 0x95A2 # +0x8AD7 0x3459 0x9665 # +0x8AD8 0x345A 0x97D3 # +0x8AD9 0x345B 0x9928 # +0x8ADA 0x345C 0x8218 # +0x8ADB 0x345D 0x4E38 # +0x8ADC 0x345E 0x542B # +0x8ADD 0x345F 0x5CB8 # +0x8ADE 0x3460 0x5DCC # +0x8ADF 0x3461 0x73A9 # +0x8AE0 0x3462 0x764C # +0x8AE1 0x3463 0x773C # +0x8AE2 0x3464 0x5CA9 # +0x8AE3 0x3465 0x7FEB # +0x8AE4 0x3466 0x8D0B # +0x8AE5 0x3467 0x96C1 # +0x8AE6 0x3468 0x9811 # +0x8AE7 0x3469 0x9854 # +0x8AE8 0x346A 0x9858 # +0x8AE9 0x346B 0x4F01 # +0x8AEA 0x346C 0x4F0E # +0x8AEB 0x346D 0x5371 # +0x8AEC 0x346E 0x559C # +0x8AED 0x346F 0x5668 # +0x8AEE 0x3470 0x57FA # +0x8AEF 0x3471 0x5947 # +0x8AF0 0x3472 0x5B09 # +0x8AF1 0x3473 0x5BC4 # +0x8AF2 0x3474 0x5C90 # +0x8AF3 0x3475 0x5E0C # +0x8AF4 0x3476 0x5E7E # +0x8AF5 0x3477 0x5FCC # +0x8AF6 0x3478 0x63EE # +0x8AF7 0x3479 0x673A # +0x8AF8 0x347A 0x65D7 # +0x8AF9 0x347B 0x65E2 # +0x8AFA 0x347C 0x671F # +0x8AFB 0x347D 0x68CB # +0x8AFC 0x347E 0x68C4 # +0x8B40 0x3521 0x6A5F # +0x8B41 0x3522 0x5E30 # +0x8B42 0x3523 0x6BC5 # +0x8B43 0x3524 0x6C17 # +0x8B44 0x3525 0x6C7D # +0x8B45 0x3526 0x757F # +0x8B46 0x3527 0x7948 # +0x8B47 0x3528 0x5B63 # +0x8B48 0x3529 0x7A00 # +0x8B49 0x352A 0x7D00 # +0x8B4A 0x352B 0x5FBD # +0x8B4B 0x352C 0x898F # +0x8B4C 0x352D 0x8A18 # +0x8B4D 0x352E 0x8CB4 # +0x8B4E 0x352F 0x8D77 # +0x8B4F 0x3530 0x8ECC # +0x8B50 0x3531 0x8F1D # +0x8B51 0x3532 0x98E2 # +0x8B52 0x3533 0x9A0E # +0x8B53 0x3534 0x9B3C # +0x8B54 0x3535 0x4E80 # +0x8B55 0x3536 0x507D # +0x8B56 0x3537 0x5100 # +0x8B57 0x3538 0x5993 # +0x8B58 0x3539 0x5B9C # +0x8B59 0x353A 0x622F # +0x8B5A 0x353B 0x6280 # +0x8B5B 0x353C 0x64EC # +0x8B5C 0x353D 0x6B3A # +0x8B5D 0x353E 0x72A0 # +0x8B5E 0x353F 0x7591 # +0x8B5F 0x3540 0x7947 # +0x8B60 0x3541 0x7FA9 # +0x8B61 0x3542 0x87FB # +0x8B62 0x3543 0x8ABC # +0x8B63 0x3544 0x8B70 # +0x8B64 0x3545 0x63AC # +0x8B65 0x3546 0x83CA # +0x8B66 0x3547 0x97A0 # +0x8B67 0x3548 0x5409 # +0x8B68 0x3549 0x5403 # +0x8B69 0x354A 0x55AB # +0x8B6A 0x354B 0x6854 # +0x8B6B 0x354C 0x6A58 # +0x8B6C 0x354D 0x8A70 # +0x8B6D 0x354E 0x7827 # +0x8B6E 0x354F 0x6775 # +0x8B6F 0x3550 0x9ECD # +0x8B70 0x3551 0x5374 # +0x8B71 0x3552 0x5BA2 # +0x8B72 0x3553 0x811A # +0x8B73 0x3554 0x8650 # +0x8B74 0x3555 0x9006 # +0x8B75 0x3556 0x4E18 # +0x8B76 0x3557 0x4E45 # +0x8B77 0x3558 0x4EC7 # +0x8B78 0x3559 0x4F11 # +0x8B79 0x355A 0x53CA # +0x8B7A 0x355B 0x5438 # +0x8B7B 0x355C 0x5BAE # +0x8B7C 0x355D 0x5F13 # +0x8B7D 0x355E 0x6025 # +0x8B7E 0x355F 0x6551 # +0x8B80 0x3560 0x673D # +0x8B81 0x3561 0x6C42 # +0x8B82 0x3562 0x6C72 # +0x8B83 0x3563 0x6CE3 # +0x8B84 0x3564 0x7078 # +0x8B85 0x3565 0x7403 # +0x8B86 0x3566 0x7A76 # +0x8B87 0x3567 0x7AAE # +0x8B88 0x3568 0x7B08 # +0x8B89 0x3569 0x7D1A # +0x8B8A 0x356A 0x7CFE # +0x8B8B 0x356B 0x7D66 # +0x8B8C 0x356C 0x65E7 # +0x8B8D 0x356D 0x725B # +0x8B8E 0x356E 0x53BB # +0x8B8F 0x356F 0x5C45 # +0x8B90 0x3570 0x5DE8 # +0x8B91 0x3571 0x62D2 # +0x8B92 0x3572 0x62E0 # +0x8B93 0x3573 0x6319 # +0x8B94 0x3574 0x6E20 # +0x8B95 0x3575 0x865A # +0x8B96 0x3576 0x8A31 # +0x8B97 0x3577 0x8DDD # +0x8B98 0x3578 0x92F8 # +0x8B99 0x3579 0x6F01 # +0x8B9A 0x357A 0x79A6 # +0x8B9B 0x357B 0x9B5A # +0x8B9C 0x357C 0x4EA8 # +0x8B9D 0x357D 0x4EAB # +0x8B9E 0x357E 0x4EAC # +0x8B9F 0x3621 0x4F9B # +0x8BA0 0x3622 0x4FA0 # +0x8BA1 0x3623 0x50D1 # +0x8BA2 0x3624 0x5147 # +0x8BA3 0x3625 0x7AF6 # +0x8BA4 0x3626 0x5171 # +0x8BA5 0x3627 0x51F6 # +0x8BA6 0x3628 0x5354 # +0x8BA7 0x3629 0x5321 # +0x8BA8 0x362A 0x537F # +0x8BA9 0x362B 0x53EB # +0x8BAA 0x362C 0x55AC # +0x8BAB 0x362D 0x5883 # +0x8BAC 0x362E 0x5CE1 # +0x8BAD 0x362F 0x5F37 # +0x8BAE 0x3630 0x5F4A # +0x8BAF 0x3631 0x602F # +0x8BB0 0x3632 0x6050 # +0x8BB1 0x3633 0x606D # +0x8BB2 0x3634 0x631F # +0x8BB3 0x3635 0x6559 # +0x8BB4 0x3636 0x6A4B # +0x8BB5 0x3637 0x6CC1 # +0x8BB6 0x3638 0x72C2 # +0x8BB7 0x3639 0x72ED # +0x8BB8 0x363A 0x77EF # +0x8BB9 0x363B 0x80F8 # +0x8BBA 0x363C 0x8105 # +0x8BBB 0x363D 0x8208 # +0x8BBC 0x363E 0x854E # +0x8BBD 0x363F 0x90F7 # +0x8BBE 0x3640 0x93E1 # +0x8BBF 0x3641 0x97FF # +0x8BC0 0x3642 0x9957 # +0x8BC1 0x3643 0x9A5A # +0x8BC2 0x3644 0x4EF0 # +0x8BC3 0x3645 0x51DD # +0x8BC4 0x3646 0x5C2D # +0x8BC5 0x3647 0x6681 # +0x8BC6 0x3648 0x696D # +0x8BC7 0x3649 0x5C40 # +0x8BC8 0x364A 0x66F2 # +0x8BC9 0x364B 0x6975 # +0x8BCA 0x364C 0x7389 # +0x8BCB 0x364D 0x6850 # +0x8BCC 0x364E 0x7C81 # +0x8BCD 0x364F 0x50C5 # +0x8BCE 0x3650 0x52E4 # +0x8BCF 0x3651 0x5747 # +0x8BD0 0x3652 0x5DFE # +0x8BD1 0x3653 0x9326 # +0x8BD2 0x3654 0x65A4 # +0x8BD3 0x3655 0x6B23 # +0x8BD4 0x3656 0x6B3D # +0x8BD5 0x3657 0x7434 # +0x8BD6 0x3658 0x7981 # +0x8BD7 0x3659 0x79BD # +0x8BD8 0x365A 0x7B4B # +0x8BD9 0x365B 0x7DCA # +0x8BDA 0x365C 0x82B9 # +0x8BDB 0x365D 0x83CC # +0x8BDC 0x365E 0x887F # +0x8BDD 0x365F 0x895F # +0x8BDE 0x3660 0x8B39 # +0x8BDF 0x3661 0x8FD1 # +0x8BE0 0x3662 0x91D1 # +0x8BE1 0x3663 0x541F # +0x8BE2 0x3664 0x9280 # +0x8BE3 0x3665 0x4E5D # +0x8BE4 0x3666 0x5036 # +0x8BE5 0x3667 0x53E5 # +0x8BE6 0x3668 0x533A # +0x8BE7 0x3669 0x72D7 # +0x8BE8 0x366A 0x7396 # +0x8BE9 0x366B 0x77E9 # +0x8BEA 0x366C 0x82E6 # +0x8BEB 0x366D 0x8EAF # +0x8BEC 0x366E 0x99C6 # +0x8BED 0x366F 0x99C8 # +0x8BEE 0x3670 0x99D2 # +0x8BEF 0x3671 0x5177 # +0x8BF0 0x3672 0x611A # +0x8BF1 0x3673 0x865E # +0x8BF2 0x3674 0x55B0 # +0x8BF3 0x3675 0x7A7A # +0x8BF4 0x3676 0x5076 # +0x8BF5 0x3677 0x5BD3 # +0x8BF6 0x3678 0x9047 # +0x8BF7 0x3679 0x9685 # +0x8BF8 0x367A 0x4E32 # +0x8BF9 0x367B 0x6ADB # +0x8BFA 0x367C 0x91E7 # +0x8BFB 0x367D 0x5C51 # +0x8BFC 0x367E 0x5C48 # +0x8C40 0x3721 0x6398 # +0x8C41 0x3722 0x7A9F # +0x8C42 0x3723 0x6C93 # +0x8C43 0x3724 0x9774 # +0x8C44 0x3725 0x8F61 # +0x8C45 0x3726 0x7AAA # +0x8C46 0x3727 0x718A # +0x8C47 0x3728 0x9688 # +0x8C48 0x3729 0x7C82 # +0x8C49 0x372A 0x6817 # +0x8C4A 0x372B 0x7E70 # +0x8C4B 0x372C 0x6851 # +0x8C4C 0x372D 0x936C # +0x8C4D 0x372E 0x52F2 # +0x8C4E 0x372F 0x541B # +0x8C4F 0x3730 0x85AB # +0x8C50 0x3731 0x8A13 # +0x8C51 0x3732 0x7FA4 # +0x8C52 0x3733 0x8ECD # +0x8C53 0x3734 0x90E1 # +0x8C54 0x3735 0x5366 # +0x8C55 0x3736 0x8888 # +0x8C56 0x3737 0x7941 # +0x8C57 0x3738 0x4FC2 # +0x8C58 0x3739 0x50BE # +0x8C59 0x373A 0x5211 # +0x8C5A 0x373B 0x5144 # +0x8C5B 0x373C 0x5553 # +0x8C5C 0x373D 0x572D # +0x8C5D 0x373E 0x73EA # +0x8C5E 0x373F 0x578B # +0x8C5F 0x3740 0x5951 # +0x8C60 0x3741 0x5F62 # +0x8C61 0x3742 0x5F84 # +0x8C62 0x3743 0x6075 # +0x8C63 0x3744 0x6176 # +0x8C64 0x3745 0x6167 # +0x8C65 0x3746 0x61A9 # +0x8C66 0x3747 0x63B2 # +0x8C67 0x3748 0x643A # +0x8C68 0x3749 0x656C # +0x8C69 0x374A 0x666F # +0x8C6A 0x374B 0x6842 # +0x8C6B 0x374C 0x6E13 # +0x8C6C 0x374D 0x7566 # +0x8C6D 0x374E 0x7A3D # +0x8C6E 0x374F 0x7CFB # +0x8C6F 0x3750 0x7D4C # +0x8C70 0x3751 0x7D99 # +0x8C71 0x3752 0x7E4B # +0x8C72 0x3753 0x7F6B # +0x8C73 0x3754 0x830E # +0x8C74 0x3755 0x834A # +0x8C75 0x3756 0x86CD # +0x8C76 0x3757 0x8A08 # +0x8C77 0x3758 0x8A63 # +0x8C78 0x3759 0x8B66 # +0x8C79 0x375A 0x8EFD # +0x8C7A 0x375B 0x981A # +0x8C7B 0x375C 0x9D8F # +0x8C7C 0x375D 0x82B8 # +0x8C7D 0x375E 0x8FCE # +0x8C7E 0x375F 0x9BE8 # +0x8C80 0x3760 0x5287 # +0x8C81 0x3761 0x621F # +0x8C82 0x3762 0x6483 # +0x8C83 0x3763 0x6FC0 # +0x8C84 0x3764 0x9699 # +0x8C85 0x3765 0x6841 # +0x8C86 0x3766 0x5091 # +0x8C87 0x3767 0x6B20 # +0x8C88 0x3768 0x6C7A # +0x8C89 0x3769 0x6F54 # +0x8C8A 0x376A 0x7A74 # +0x8C8B 0x376B 0x7D50 # +0x8C8C 0x376C 0x8840 # +0x8C8D 0x376D 0x8A23 # +0x8C8E 0x376E 0x6708 # +0x8C8F 0x376F 0x4EF6 # +0x8C90 0x3770 0x5039 # +0x8C91 0x3771 0x5026 # +0x8C92 0x3772 0x5065 # +0x8C93 0x3773 0x517C # +0x8C94 0x3774 0x5238 # +0x8C95 0x3775 0x5263 # +0x8C96 0x3776 0x55A7 # +0x8C97 0x3777 0x570F # +0x8C98 0x3778 0x5805 # +0x8C99 0x3779 0x5ACC # +0x8C9A 0x377A 0x5EFA # +0x8C9B 0x377B 0x61B2 # +0x8C9C 0x377C 0x61F8 # +0x8C9D 0x377D 0x62F3 # +0x8C9E 0x377E 0x6372 # +0x8C9F 0x3821 0x691C # +0x8CA0 0x3822 0x6A29 # +0x8CA1 0x3823 0x727D # +0x8CA2 0x3824 0x72AC # +0x8CA3 0x3825 0x732E # +0x8CA4 0x3826 0x7814 # +0x8CA5 0x3827 0x786F # +0x8CA6 0x3828 0x7D79 # +0x8CA7 0x3829 0x770C # +0x8CA8 0x382A 0x80A9 # +0x8CA9 0x382B 0x898B # +0x8CAA 0x382C 0x8B19 # +0x8CAB 0x382D 0x8CE2 # +0x8CAC 0x382E 0x8ED2 # +0x8CAD 0x382F 0x9063 # +0x8CAE 0x3830 0x9375 # +0x8CAF 0x3831 0x967A # +0x8CB0 0x3832 0x9855 # +0x8CB1 0x3833 0x9A13 # +0x8CB2 0x3834 0x9E78 # +0x8CB3 0x3835 0x5143 # +0x8CB4 0x3836 0x539F # +0x8CB5 0x3837 0x53B3 # +0x8CB6 0x3838 0x5E7B # +0x8CB7 0x3839 0x5F26 # +0x8CB8 0x383A 0x6E1B # +0x8CB9 0x383B 0x6E90 # +0x8CBA 0x383C 0x7384 # +0x8CBB 0x383D 0x73FE # +0x8CBC 0x383E 0x7D43 # +0x8CBD 0x383F 0x8237 # +0x8CBE 0x3840 0x8A00 # +0x8CBF 0x3841 0x8AFA # +0x8CC0 0x3842 0x9650 # +0x8CC1 0x3843 0x4E4E # +0x8CC2 0x3844 0x500B # +0x8CC3 0x3845 0x53E4 # +0x8CC4 0x3846 0x547C # +0x8CC5 0x3847 0x56FA # +0x8CC6 0x3848 0x59D1 # +0x8CC7 0x3849 0x5B64 # +0x8CC8 0x384A 0x5DF1 # +0x8CC9 0x384B 0x5EAB # +0x8CCA 0x384C 0x5F27 # +0x8CCB 0x384D 0x6238 # +0x8CCC 0x384E 0x6545 # +0x8CCD 0x384F 0x67AF # +0x8CCE 0x3850 0x6E56 # +0x8CCF 0x3851 0x72D0 # +0x8CD0 0x3852 0x7CCA # +0x8CD1 0x3853 0x88B4 # +0x8CD2 0x3854 0x80A1 # +0x8CD3 0x3855 0x80E1 # +0x8CD4 0x3856 0x83F0 # +0x8CD5 0x3857 0x864E # +0x8CD6 0x3858 0x8A87 # +0x8CD7 0x3859 0x8DE8 # +0x8CD8 0x385A 0x9237 # +0x8CD9 0x385B 0x96C7 # +0x8CDA 0x385C 0x9867 # +0x8CDB 0x385D 0x9F13 # +0x8CDC 0x385E 0x4E94 # +0x8CDD 0x385F 0x4E92 # +0x8CDE 0x3860 0x4F0D # +0x8CDF 0x3861 0x5348 # +0x8CE0 0x3862 0x5449 # +0x8CE1 0x3863 0x543E # +0x8CE2 0x3864 0x5A2F # +0x8CE3 0x3865 0x5F8C # +0x8CE4 0x3866 0x5FA1 # +0x8CE5 0x3867 0x609F # +0x8CE6 0x3868 0x68A7 # +0x8CE7 0x3869 0x6A8E # +0x8CE8 0x386A 0x745A # +0x8CE9 0x386B 0x7881 # +0x8CEA 0x386C 0x8A9E # +0x8CEB 0x386D 0x8AA4 # +0x8CEC 0x386E 0x8B77 # +0x8CED 0x386F 0x9190 # +0x8CEE 0x3870 0x4E5E # +0x8CEF 0x3871 0x9BC9 # +0x8CF0 0x3872 0x4EA4 # +0x8CF1 0x3873 0x4F7C # +0x8CF2 0x3874 0x4FAF # +0x8CF3 0x3875 0x5019 # +0x8CF4 0x3876 0x5016 # +0x8CF5 0x3877 0x5149 # +0x8CF6 0x3878 0x516C # +0x8CF7 0x3879 0x529F # +0x8CF8 0x387A 0x52B9 # +0x8CF9 0x387B 0x52FE # +0x8CFA 0x387C 0x539A # +0x8CFB 0x387D 0x53E3 # +0x8CFC 0x387E 0x5411 # +0x8D40 0x3921 0x540E # +0x8D41 0x3922 0x5589 # +0x8D42 0x3923 0x5751 # +0x8D43 0x3924 0x57A2 # +0x8D44 0x3925 0x597D # +0x8D45 0x3926 0x5B54 # +0x8D46 0x3927 0x5B5D # +0x8D47 0x3928 0x5B8F # +0x8D48 0x3929 0x5DE5 # +0x8D49 0x392A 0x5DE7 # +0x8D4A 0x392B 0x5DF7 # +0x8D4B 0x392C 0x5E78 # +0x8D4C 0x392D 0x5E83 # +0x8D4D 0x392E 0x5E9A # +0x8D4E 0x392F 0x5EB7 # +0x8D4F 0x3930 0x5F18 # +0x8D50 0x3931 0x6052 # +0x8D51 0x3932 0x614C # +0x8D52 0x3933 0x6297 # +0x8D53 0x3934 0x62D8 # +0x8D54 0x3935 0x63A7 # +0x8D55 0x3936 0x653B # +0x8D56 0x3937 0x6602 # +0x8D57 0x3938 0x6643 # +0x8D58 0x3939 0x66F4 # +0x8D59 0x393A 0x676D # +0x8D5A 0x393B 0x6821 # +0x8D5B 0x393C 0x6897 # +0x8D5C 0x393D 0x69CB # +0x8D5D 0x393E 0x6C5F # +0x8D5E 0x393F 0x6D2A # +0x8D5F 0x3940 0x6D69 # +0x8D60 0x3941 0x6E2F # +0x8D61 0x3942 0x6E9D # +0x8D62 0x3943 0x7532 # +0x8D63 0x3944 0x7687 # +0x8D64 0x3945 0x786C # +0x8D65 0x3946 0x7A3F # +0x8D66 0x3947 0x7CE0 # +0x8D67 0x3948 0x7D05 # +0x8D68 0x3949 0x7D18 # +0x8D69 0x394A 0x7D5E # +0x8D6A 0x394B 0x7DB1 # +0x8D6B 0x394C 0x8015 # +0x8D6C 0x394D 0x8003 # +0x8D6D 0x394E 0x80AF # +0x8D6E 0x394F 0x80B1 # +0x8D6F 0x3950 0x8154 # +0x8D70 0x3951 0x818F # +0x8D71 0x3952 0x822A # +0x8D72 0x3953 0x8352 # +0x8D73 0x3954 0x884C # +0x8D74 0x3955 0x8861 # +0x8D75 0x3956 0x8B1B # +0x8D76 0x3957 0x8CA2 # +0x8D77 0x3958 0x8CFC # +0x8D78 0x3959 0x90CA # +0x8D79 0x395A 0x9175 # +0x8D7A 0x395B 0x9271 # +0x8D7B 0x395C 0x783F # +0x8D7C 0x395D 0x92FC # +0x8D7D 0x395E 0x95A4 # +0x8D7E 0x395F 0x964D # +0x8D80 0x3960 0x9805 # +0x8D81 0x3961 0x9999 # +0x8D82 0x3962 0x9AD8 # +0x8D83 0x3963 0x9D3B # +0x8D84 0x3964 0x525B # +0x8D85 0x3965 0x52AB # +0x8D86 0x3966 0x53F7 # +0x8D87 0x3967 0x5408 # +0x8D88 0x3968 0x58D5 # +0x8D89 0x3969 0x62F7 # +0x8D8A 0x396A 0x6FE0 # +0x8D8B 0x396B 0x8C6A # +0x8D8C 0x396C 0x8F5F # +0x8D8D 0x396D 0x9EB9 # +0x8D8E 0x396E 0x514B # +0x8D8F 0x396F 0x523B # +0x8D90 0x3970 0x544A # +0x8D91 0x3971 0x56FD # +0x8D92 0x3972 0x7A40 # +0x8D93 0x3973 0x9177 # +0x8D94 0x3974 0x9D60 # +0x8D95 0x3975 0x9ED2 # +0x8D96 0x3976 0x7344 # +0x8D97 0x3977 0x6F09 # +0x8D98 0x3978 0x8170 # +0x8D99 0x3979 0x7511 # +0x8D9A 0x397A 0x5FFD # +0x8D9B 0x397B 0x60DA # +0x8D9C 0x397C 0x9AA8 # +0x8D9D 0x397D 0x72DB # +0x8D9E 0x397E 0x8FBC # +0x8D9F 0x3A21 0x6B64 # +0x8DA0 0x3A22 0x9803 # +0x8DA1 0x3A23 0x4ECA # +0x8DA2 0x3A24 0x56F0 # +0x8DA3 0x3A25 0x5764 # +0x8DA4 0x3A26 0x58BE # +0x8DA5 0x3A27 0x5A5A # +0x8DA6 0x3A28 0x6068 # +0x8DA7 0x3A29 0x61C7 # +0x8DA8 0x3A2A 0x660F # +0x8DA9 0x3A2B 0x6606 # +0x8DAA 0x3A2C 0x6839 # +0x8DAB 0x3A2D 0x68B1 # +0x8DAC 0x3A2E 0x6DF7 # +0x8DAD 0x3A2F 0x75D5 # +0x8DAE 0x3A30 0x7D3A # +0x8DAF 0x3A31 0x826E # +0x8DB0 0x3A32 0x9B42 # +0x8DB1 0x3A33 0x4E9B # +0x8DB2 0x3A34 0x4F50 # +0x8DB3 0x3A35 0x53C9 # +0x8DB4 0x3A36 0x5506 # +0x8DB5 0x3A37 0x5D6F # +0x8DB6 0x3A38 0x5DE6 # +0x8DB7 0x3A39 0x5DEE # +0x8DB8 0x3A3A 0x67FB # +0x8DB9 0x3A3B 0x6C99 # +0x8DBA 0x3A3C 0x7473 # +0x8DBB 0x3A3D 0x7802 # +0x8DBC 0x3A3E 0x8A50 # +0x8DBD 0x3A3F 0x9396 # +0x8DBE 0x3A40 0x88DF # +0x8DBF 0x3A41 0x5750 # +0x8DC0 0x3A42 0x5EA7 # +0x8DC1 0x3A43 0x632B # +0x8DC2 0x3A44 0x50B5 # +0x8DC3 0x3A45 0x50AC # +0x8DC4 0x3A46 0x518D # +0x8DC5 0x3A47 0x6700 # +0x8DC6 0x3A48 0x54C9 # +0x8DC7 0x3A49 0x585E # +0x8DC8 0x3A4A 0x59BB # +0x8DC9 0x3A4B 0x5BB0 # +0x8DCA 0x3A4C 0x5F69 # +0x8DCB 0x3A4D 0x624D # +0x8DCC 0x3A4E 0x63A1 # +0x8DCD 0x3A4F 0x683D # +0x8DCE 0x3A50 0x6B73 # +0x8DCF 0x3A51 0x6E08 # +0x8DD0 0x3A52 0x707D # +0x8DD1 0x3A53 0x91C7 # +0x8DD2 0x3A54 0x7280 # +0x8DD3 0x3A55 0x7815 # +0x8DD4 0x3A56 0x7826 # +0x8DD5 0x3A57 0x796D # +0x8DD6 0x3A58 0x658E # +0x8DD7 0x3A59 0x7D30 # +0x8DD8 0x3A5A 0x83DC # +0x8DD9 0x3A5B 0x88C1 # +0x8DDA 0x3A5C 0x8F09 # +0x8DDB 0x3A5D 0x969B # +0x8DDC 0x3A5E 0x5264 # +0x8DDD 0x3A5F 0x5728 # +0x8DDE 0x3A60 0x6750 # +0x8DDF 0x3A61 0x7F6A # +0x8DE0 0x3A62 0x8CA1 # +0x8DE1 0x3A63 0x51B4 # +0x8DE2 0x3A64 0x5742 # +0x8DE3 0x3A65 0x962A # +0x8DE4 0x3A66 0x583A # +0x8DE5 0x3A67 0x698A # +0x8DE6 0x3A68 0x80B4 # +0x8DE7 0x3A69 0x54B2 # +0x8DE8 0x3A6A 0x5D0E # +0x8DE9 0x3A6B 0x57FC # +0x8DEA 0x3A6C 0x7895 # +0x8DEB 0x3A6D 0x9DFA # +0x8DEC 0x3A6E 0x4F5C # +0x8DED 0x3A6F 0x524A # +0x8DEE 0x3A70 0x548B # +0x8DEF 0x3A71 0x643E # +0x8DF0 0x3A72 0x6628 # +0x8DF1 0x3A73 0x6714 # +0x8DF2 0x3A74 0x67F5 # +0x8DF3 0x3A75 0x7A84 # +0x8DF4 0x3A76 0x7B56 # +0x8DF5 0x3A77 0x7D22 # +0x8DF6 0x3A78 0x932F # +0x8DF7 0x3A79 0x685C # +0x8DF8 0x3A7A 0x9BAD # +0x8DF9 0x3A7B 0x7B39 # +0x8DFA 0x3A7C 0x5319 # +0x8DFB 0x3A7D 0x518A # +0x8DFC 0x3A7E 0x5237 # +0x8E40 0x3B21 0x5BDF # +0x8E41 0x3B22 0x62F6 # +0x8E42 0x3B23 0x64AE # +0x8E43 0x3B24 0x64E6 # +0x8E44 0x3B25 0x672D # +0x8E45 0x3B26 0x6BBA # +0x8E46 0x3B27 0x85A9 # +0x8E47 0x3B28 0x96D1 # +0x8E48 0x3B29 0x7690 # +0x8E49 0x3B2A 0x9BD6 # +0x8E4A 0x3B2B 0x634C # +0x8E4B 0x3B2C 0x9306 # +0x8E4C 0x3B2D 0x9BAB # +0x8E4D 0x3B2E 0x76BF # +0x8E4E 0x3B2F 0x6652 # +0x8E4F 0x3B30 0x4E09 # +0x8E50 0x3B31 0x5098 # +0x8E51 0x3B32 0x53C2 # +0x8E52 0x3B33 0x5C71 # +0x8E53 0x3B34 0x60E8 # +0x8E54 0x3B35 0x6492 # +0x8E55 0x3B36 0x6563 # +0x8E56 0x3B37 0x685F # +0x8E57 0x3B38 0x71E6 # +0x8E58 0x3B39 0x73CA # +0x8E59 0x3B3A 0x7523 # +0x8E5A 0x3B3B 0x7B97 # +0x8E5B 0x3B3C 0x7E82 # +0x8E5C 0x3B3D 0x8695 # +0x8E5D 0x3B3E 0x8B83 # +0x8E5E 0x3B3F 0x8CDB # +0x8E5F 0x3B40 0x9178 # +0x8E60 0x3B41 0x9910 # +0x8E61 0x3B42 0x65AC # +0x8E62 0x3B43 0x66AB # +0x8E63 0x3B44 0x6B8B # +0x8E64 0x3B45 0x4ED5 # +0x8E65 0x3B46 0x4ED4 # +0x8E66 0x3B47 0x4F3A # +0x8E67 0x3B48 0x4F7F # +0x8E68 0x3B49 0x523A # +0x8E69 0x3B4A 0x53F8 # +0x8E6A 0x3B4B 0x53F2 # +0x8E6B 0x3B4C 0x55E3 # +0x8E6C 0x3B4D 0x56DB # +0x8E6D 0x3B4E 0x58EB # +0x8E6E 0x3B4F 0x59CB # +0x8E6F 0x3B50 0x59C9 # +0x8E70 0x3B51 0x59FF # +0x8E71 0x3B52 0x5B50 # +0x8E72 0x3B53 0x5C4D # +0x8E73 0x3B54 0x5E02 # +0x8E74 0x3B55 0x5E2B # +0x8E75 0x3B56 0x5FD7 # +0x8E76 0x3B57 0x601D # +0x8E77 0x3B58 0x6307 # +0x8E78 0x3B59 0x652F # +0x8E79 0x3B5A 0x5B5C # +0x8E7A 0x3B5B 0x65AF # +0x8E7B 0x3B5C 0x65BD # +0x8E7C 0x3B5D 0x65E8 # +0x8E7D 0x3B5E 0x679D # +0x8E7E 0x3B5F 0x6B62 # +0x8E80 0x3B60 0x6B7B # +0x8E81 0x3B61 0x6C0F # +0x8E82 0x3B62 0x7345 # +0x8E83 0x3B63 0x7949 # +0x8E84 0x3B64 0x79C1 # +0x8E85 0x3B65 0x7CF8 # +0x8E86 0x3B66 0x7D19 # +0x8E87 0x3B67 0x7D2B # +0x8E88 0x3B68 0x80A2 # +0x8E89 0x3B69 0x8102 # +0x8E8A 0x3B6A 0x81F3 # +0x8E8B 0x3B6B 0x8996 # +0x8E8C 0x3B6C 0x8A5E # +0x8E8D 0x3B6D 0x8A69 # +0x8E8E 0x3B6E 0x8A66 # +0x8E8F 0x3B6F 0x8A8C # +0x8E90 0x3B70 0x8AEE # +0x8E91 0x3B71 0x8CC7 # +0x8E92 0x3B72 0x8CDC # +0x8E93 0x3B73 0x96CC # +0x8E94 0x3B74 0x98FC # +0x8E95 0x3B75 0x6B6F # +0x8E96 0x3B76 0x4E8B # +0x8E97 0x3B77 0x4F3C # +0x8E98 0x3B78 0x4F8D # +0x8E99 0x3B79 0x5150 # +0x8E9A 0x3B7A 0x5B57 # +0x8E9B 0x3B7B 0x5BFA # +0x8E9C 0x3B7C 0x6148 # +0x8E9D 0x3B7D 0x6301 # +0x8E9E 0x3B7E 0x6642 # +0x8E9F 0x3C21 0x6B21 # +0x8EA0 0x3C22 0x6ECB # +0x8EA1 0x3C23 0x6CBB # +0x8EA2 0x3C24 0x723E # +0x8EA3 0x3C25 0x74BD # +0x8EA4 0x3C26 0x75D4 # +0x8EA5 0x3C27 0x78C1 # +0x8EA6 0x3C28 0x793A # +0x8EA7 0x3C29 0x800C # +0x8EA8 0x3C2A 0x8033 # +0x8EA9 0x3C2B 0x81EA # +0x8EAA 0x3C2C 0x8494 # +0x8EAB 0x3C2D 0x8F9E # +0x8EAC 0x3C2E 0x6C50 # +0x8EAD 0x3C2F 0x9E7F # +0x8EAE 0x3C30 0x5F0F # +0x8EAF 0x3C31 0x8B58 # +0x8EB0 0x3C32 0x9D2B # +0x8EB1 0x3C33 0x7AFA # +0x8EB2 0x3C34 0x8EF8 # +0x8EB3 0x3C35 0x5B8D # +0x8EB4 0x3C36 0x96EB # +0x8EB5 0x3C37 0x4E03 # +0x8EB6 0x3C38 0x53F1 # +0x8EB7 0x3C39 0x57F7 # +0x8EB8 0x3C3A 0x5931 # +0x8EB9 0x3C3B 0x5AC9 # +0x8EBA 0x3C3C 0x5BA4 # +0x8EBB 0x3C3D 0x6089 # +0x8EBC 0x3C3E 0x6E7F # +0x8EBD 0x3C3F 0x6F06 # +0x8EBE 0x3C40 0x75BE # +0x8EBF 0x3C41 0x8CEA # +0x8EC0 0x3C42 0x5B9F # +0x8EC1 0x3C43 0x8500 # +0x8EC2 0x3C44 0x7BE0 # +0x8EC3 0x3C45 0x5072 # +0x8EC4 0x3C46 0x67F4 # +0x8EC5 0x3C47 0x829D # +0x8EC6 0x3C48 0x5C61 # +0x8EC7 0x3C49 0x854A # +0x8EC8 0x3C4A 0x7E1E # +0x8EC9 0x3C4B 0x820E # +0x8ECA 0x3C4C 0x5199 # +0x8ECB 0x3C4D 0x5C04 # +0x8ECC 0x3C4E 0x6368 # +0x8ECD 0x3C4F 0x8D66 # +0x8ECE 0x3C50 0x659C # +0x8ECF 0x3C51 0x716E # +0x8ED0 0x3C52 0x793E # +0x8ED1 0x3C53 0x7D17 # +0x8ED2 0x3C54 0x8005 # +0x8ED3 0x3C55 0x8B1D # +0x8ED4 0x3C56 0x8ECA # +0x8ED5 0x3C57 0x906E # +0x8ED6 0x3C58 0x86C7 # +0x8ED7 0x3C59 0x90AA # +0x8ED8 0x3C5A 0x501F # +0x8ED9 0x3C5B 0x52FA # +0x8EDA 0x3C5C 0x5C3A # +0x8EDB 0x3C5D 0x6753 # +0x8EDC 0x3C5E 0x707C # +0x8EDD 0x3C5F 0x7235 # +0x8EDE 0x3C60 0x914C # +0x8EDF 0x3C61 0x91C8 # +0x8EE0 0x3C62 0x932B # +0x8EE1 0x3C63 0x82E5 # +0x8EE2 0x3C64 0x5BC2 # +0x8EE3 0x3C65 0x5F31 # +0x8EE4 0x3C66 0x60F9 # +0x8EE5 0x3C67 0x4E3B # +0x8EE6 0x3C68 0x53D6 # +0x8EE7 0x3C69 0x5B88 # +0x8EE8 0x3C6A 0x624B # +0x8EE9 0x3C6B 0x6731 # +0x8EEA 0x3C6C 0x6B8A # +0x8EEB 0x3C6D 0x72E9 # +0x8EEC 0x3C6E 0x73E0 # +0x8EED 0x3C6F 0x7A2E # +0x8EEE 0x3C70 0x816B # +0x8EEF 0x3C71 0x8DA3 # +0x8EF0 0x3C72 0x9152 # +0x8EF1 0x3C73 0x9996 # +0x8EF2 0x3C74 0x5112 # +0x8EF3 0x3C75 0x53D7 # +0x8EF4 0x3C76 0x546A # +0x8EF5 0x3C77 0x5BFF # +0x8EF6 0x3C78 0x6388 # +0x8EF7 0x3C79 0x6A39 # +0x8EF8 0x3C7A 0x7DAC # +0x8EF9 0x3C7B 0x9700 # +0x8EFA 0x3C7C 0x56DA # +0x8EFB 0x3C7D 0x53CE # +0x8EFC 0x3C7E 0x5468 # +0x8F40 0x3D21 0x5B97 # +0x8F41 0x3D22 0x5C31 # +0x8F42 0x3D23 0x5DDE # +0x8F43 0x3D24 0x4FEE # +0x8F44 0x3D25 0x6101 # +0x8F45 0x3D26 0x62FE # +0x8F46 0x3D27 0x6D32 # +0x8F47 0x3D28 0x79C0 # +0x8F48 0x3D29 0x79CB # +0x8F49 0x3D2A 0x7D42 # +0x8F4A 0x3D2B 0x7E4D # +0x8F4B 0x3D2C 0x7FD2 # +0x8F4C 0x3D2D 0x81ED # +0x8F4D 0x3D2E 0x821F # +0x8F4E 0x3D2F 0x8490 # +0x8F4F 0x3D30 0x8846 # +0x8F50 0x3D31 0x8972 # +0x8F51 0x3D32 0x8B90 # +0x8F52 0x3D33 0x8E74 # +0x8F53 0x3D34 0x8F2F # +0x8F54 0x3D35 0x9031 # +0x8F55 0x3D36 0x914B # +0x8F56 0x3D37 0x916C # +0x8F57 0x3D38 0x96C6 # +0x8F58 0x3D39 0x919C # +0x8F59 0x3D3A 0x4EC0 # +0x8F5A 0x3D3B 0x4F4F # +0x8F5B 0x3D3C 0x5145 # +0x8F5C 0x3D3D 0x5341 # +0x8F5D 0x3D3E 0x5F93 # +0x8F5E 0x3D3F 0x620E # +0x8F5F 0x3D40 0x67D4 # +0x8F60 0x3D41 0x6C41 # +0x8F61 0x3D42 0x6E0B # +0x8F62 0x3D43 0x7363 # +0x8F63 0x3D44 0x7E26 # +0x8F64 0x3D45 0x91CD # +0x8F65 0x3D46 0x9283 # +0x8F66 0x3D47 0x53D4 # +0x8F67 0x3D48 0x5919 # +0x8F68 0x3D49 0x5BBF # +0x8F69 0x3D4A 0x6DD1 # +0x8F6A 0x3D4B 0x795D # +0x8F6B 0x3D4C 0x7E2E # +0x8F6C 0x3D4D 0x7C9B # +0x8F6D 0x3D4E 0x587E # +0x8F6E 0x3D4F 0x719F # +0x8F6F 0x3D50 0x51FA # +0x8F70 0x3D51 0x8853 # +0x8F71 0x3D52 0x8FF0 # +0x8F72 0x3D53 0x4FCA # +0x8F73 0x3D54 0x5CFB # +0x8F74 0x3D55 0x6625 # +0x8F75 0x3D56 0x77AC # +0x8F76 0x3D57 0x7AE3 # +0x8F77 0x3D58 0x821C # +0x8F78 0x3D59 0x99FF # +0x8F79 0x3D5A 0x51C6 # +0x8F7A 0x3D5B 0x5FAA # +0x8F7B 0x3D5C 0x65EC # +0x8F7C 0x3D5D 0x696F # +0x8F7D 0x3D5E 0x6B89 # +0x8F7E 0x3D5F 0x6DF3 # +0x8F80 0x3D60 0x6E96 # +0x8F81 0x3D61 0x6F64 # +0x8F82 0x3D62 0x76FE # +0x8F83 0x3D63 0x7D14 # +0x8F84 0x3D64 0x5DE1 # +0x8F85 0x3D65 0x9075 # +0x8F86 0x3D66 0x9187 # +0x8F87 0x3D67 0x9806 # +0x8F88 0x3D68 0x51E6 # +0x8F89 0x3D69 0x521D # +0x8F8A 0x3D6A 0x6240 # +0x8F8B 0x3D6B 0x6691 # +0x8F8C 0x3D6C 0x66D9 # +0x8F8D 0x3D6D 0x6E1A # +0x8F8E 0x3D6E 0x5EB6 # +0x8F8F 0x3D6F 0x7DD2 # +0x8F90 0x3D70 0x7F72 # +0x8F91 0x3D71 0x66F8 # +0x8F92 0x3D72 0x85AF # +0x8F93 0x3D73 0x85F7 # +0x8F94 0x3D74 0x8AF8 # +0x8F95 0x3D75 0x52A9 # +0x8F96 0x3D76 0x53D9 # +0x8F97 0x3D77 0x5973 # +0x8F98 0x3D78 0x5E8F # +0x8F99 0x3D79 0x5F90 # +0x8F9A 0x3D7A 0x6055 # +0x8F9B 0x3D7B 0x92E4 # +0x8F9C 0x3D7C 0x9664 # +0x8F9D 0x3D7D 0x50B7 # +0x8F9E 0x3D7E 0x511F # +0x8F9F 0x3E21 0x52DD # +0x8FA0 0x3E22 0x5320 # +0x8FA1 0x3E23 0x5347 # +0x8FA2 0x3E24 0x53EC # +0x8FA3 0x3E25 0x54E8 # +0x8FA4 0x3E26 0x5546 # +0x8FA5 0x3E27 0x5531 # +0x8FA6 0x3E28 0x5617 # +0x8FA7 0x3E29 0x5968 # +0x8FA8 0x3E2A 0x59BE # +0x8FA9 0x3E2B 0x5A3C # +0x8FAA 0x3E2C 0x5BB5 # +0x8FAB 0x3E2D 0x5C06 # +0x8FAC 0x3E2E 0x5C0F # +0x8FAD 0x3E2F 0x5C11 # +0x8FAE 0x3E30 0x5C1A # +0x8FAF 0x3E31 0x5E84 # +0x8FB0 0x3E32 0x5E8A # +0x8FB1 0x3E33 0x5EE0 # +0x8FB2 0x3E34 0x5F70 # +0x8FB3 0x3E35 0x627F # +0x8FB4 0x3E36 0x6284 # +0x8FB5 0x3E37 0x62DB # +0x8FB6 0x3E38 0x638C # +0x8FB7 0x3E39 0x6377 # +0x8FB8 0x3E3A 0x6607 # +0x8FB9 0x3E3B 0x660C # +0x8FBA 0x3E3C 0x662D # +0x8FBB 0x3E3D 0x6676 # +0x8FBC 0x3E3E 0x677E # +0x8FBD 0x3E3F 0x68A2 # +0x8FBE 0x3E40 0x6A1F # +0x8FBF 0x3E41 0x6A35 # +0x8FC0 0x3E42 0x6CBC # +0x8FC1 0x3E43 0x6D88 # +0x8FC2 0x3E44 0x6E09 # +0x8FC3 0x3E45 0x6E58 # +0x8FC4 0x3E46 0x713C # +0x8FC5 0x3E47 0x7126 # +0x8FC6 0x3E48 0x7167 # +0x8FC7 0x3E49 0x75C7 # +0x8FC8 0x3E4A 0x7701 # +0x8FC9 0x3E4B 0x785D # +0x8FCA 0x3E4C 0x7901 # +0x8FCB 0x3E4D 0x7965 # +0x8FCC 0x3E4E 0x79F0 # +0x8FCD 0x3E4F 0x7AE0 # +0x8FCE 0x3E50 0x7B11 # +0x8FCF 0x3E51 0x7CA7 # +0x8FD0 0x3E52 0x7D39 # +0x8FD1 0x3E53 0x8096 # +0x8FD2 0x3E54 0x83D6 # +0x8FD3 0x3E55 0x848B # +0x8FD4 0x3E56 0x8549 # +0x8FD5 0x3E57 0x885D # +0x8FD6 0x3E58 0x88F3 # +0x8FD7 0x3E59 0x8A1F # +0x8FD8 0x3E5A 0x8A3C # +0x8FD9 0x3E5B 0x8A54 # +0x8FDA 0x3E5C 0x8A73 # +0x8FDB 0x3E5D 0x8C61 # +0x8FDC 0x3E5E 0x8CDE # +0x8FDD 0x3E5F 0x91A4 # +0x8FDE 0x3E60 0x9266 # +0x8FDF 0x3E61 0x937E # +0x8FE0 0x3E62 0x9418 # +0x8FE1 0x3E63 0x969C # +0x8FE2 0x3E64 0x9798 # +0x8FE3 0x3E65 0x4E0A # +0x8FE4 0x3E66 0x4E08 # +0x8FE5 0x3E67 0x4E1E # +0x8FE6 0x3E68 0x4E57 # +0x8FE7 0x3E69 0x5197 # +0x8FE8 0x3E6A 0x5270 # +0x8FE9 0x3E6B 0x57CE # +0x8FEA 0x3E6C 0x5834 # +0x8FEB 0x3E6D 0x58CC # +0x8FEC 0x3E6E 0x5B22 # +0x8FED 0x3E6F 0x5E38 # +0x8FEE 0x3E70 0x60C5 # +0x8FEF 0x3E71 0x64FE # +0x8FF0 0x3E72 0x6761 # +0x8FF1 0x3E73 0x6756 # +0x8FF2 0x3E74 0x6D44 # +0x8FF3 0x3E75 0x72B6 # +0x8FF4 0x3E76 0x7573 # +0x8FF5 0x3E77 0x7A63 # +0x8FF6 0x3E78 0x84B8 # +0x8FF7 0x3E79 0x8B72 # +0x8FF8 0x3E7A 0x91B8 # +0x8FF9 0x3E7B 0x9320 # +0x8FFA 0x3E7C 0x5631 # +0x8FFB 0x3E7D 0x57F4 # +0x8FFC 0x3E7E 0x98FE # +0x9040 0x3F21 0x62ED # +0x9041 0x3F22 0x690D # +0x9042 0x3F23 0x6B96 # +0x9043 0x3F24 0x71ED # +0x9044 0x3F25 0x7E54 # +0x9045 0x3F26 0x8077 # +0x9046 0x3F27 0x8272 # +0x9047 0x3F28 0x89E6 # +0x9048 0x3F29 0x98DF # +0x9049 0x3F2A 0x8755 # +0x904A 0x3F2B 0x8FB1 # +0x904B 0x3F2C 0x5C3B # +0x904C 0x3F2D 0x4F38 # +0x904D 0x3F2E 0x4FE1 # +0x904E 0x3F2F 0x4FB5 # +0x904F 0x3F30 0x5507 # +0x9050 0x3F31 0x5A20 # +0x9051 0x3F32 0x5BDD # +0x9052 0x3F33 0x5BE9 # +0x9053 0x3F34 0x5FC3 # +0x9054 0x3F35 0x614E # +0x9055 0x3F36 0x632F # +0x9056 0x3F37 0x65B0 # +0x9057 0x3F38 0x664B # +0x9058 0x3F39 0x68EE # +0x9059 0x3F3A 0x699B # +0x905A 0x3F3B 0x6D78 # +0x905B 0x3F3C 0x6DF1 # +0x905C 0x3F3D 0x7533 # +0x905D 0x3F3E 0x75B9 # +0x905E 0x3F3F 0x771F # +0x905F 0x3F40 0x795E # +0x9060 0x3F41 0x79E6 # +0x9061 0x3F42 0x7D33 # +0x9062 0x3F43 0x81E3 # +0x9063 0x3F44 0x82AF # +0x9064 0x3F45 0x85AA # +0x9065 0x3F46 0x89AA # +0x9066 0x3F47 0x8A3A # +0x9067 0x3F48 0x8EAB # +0x9068 0x3F49 0x8F9B # +0x9069 0x3F4A 0x9032 # +0x906A 0x3F4B 0x91DD # +0x906B 0x3F4C 0x9707 # +0x906C 0x3F4D 0x4EBA # +0x906D 0x3F4E 0x4EC1 # +0x906E 0x3F4F 0x5203 # +0x906F 0x3F50 0x5875 # +0x9070 0x3F51 0x58EC # +0x9071 0x3F52 0x5C0B # +0x9072 0x3F53 0x751A # +0x9073 0x3F54 0x5C3D # +0x9074 0x3F55 0x814E # +0x9075 0x3F56 0x8A0A # +0x9076 0x3F57 0x8FC5 # +0x9077 0x3F58 0x9663 # +0x9078 0x3F59 0x976D # +0x9079 0x3F5A 0x7B25 # +0x907A 0x3F5B 0x8ACF # +0x907B 0x3F5C 0x9808 # +0x907C 0x3F5D 0x9162 # +0x907D 0x3F5E 0x56F3 # +0x907E 0x3F5F 0x53A8 # +0x9080 0x3F60 0x9017 # +0x9081 0x3F61 0x5439 # +0x9082 0x3F62 0x5782 # +0x9083 0x3F63 0x5E25 # +0x9084 0x3F64 0x63A8 # +0x9085 0x3F65 0x6C34 # +0x9086 0x3F66 0x708A # +0x9087 0x3F67 0x7761 # +0x9088 0x3F68 0x7C8B # +0x9089 0x3F69 0x7FE0 # +0x908A 0x3F6A 0x8870 # +0x908B 0x3F6B 0x9042 # +0x908C 0x3F6C 0x9154 # +0x908D 0x3F6D 0x9310 # +0x908E 0x3F6E 0x9318 # +0x908F 0x3F6F 0x968F # +0x9090 0x3F70 0x745E # +0x9091 0x3F71 0x9AC4 # +0x9092 0x3F72 0x5D07 # +0x9093 0x3F73 0x5D69 # +0x9094 0x3F74 0x6570 # +0x9095 0x3F75 0x67A2 # +0x9096 0x3F76 0x8DA8 # +0x9097 0x3F77 0x96DB # +0x9098 0x3F78 0x636E # +0x9099 0x3F79 0x6749 # +0x909A 0x3F7A 0x6919 # +0x909B 0x3F7B 0x83C5 # +0x909C 0x3F7C 0x9817 # +0x909D 0x3F7D 0x96C0 # +0x909E 0x3F7E 0x88FE # +0x909F 0x4021 0x6F84 # +0x90A0 0x4022 0x647A # +0x90A1 0x4023 0x5BF8 # +0x90A2 0x4024 0x4E16 # +0x90A3 0x4025 0x702C # +0x90A4 0x4026 0x755D # +0x90A5 0x4027 0x662F # +0x90A6 0x4028 0x51C4 # +0x90A7 0x4029 0x5236 # +0x90A8 0x402A 0x52E2 # +0x90A9 0x402B 0x59D3 # +0x90AA 0x402C 0x5F81 # +0x90AB 0x402D 0x6027 # +0x90AC 0x402E 0x6210 # +0x90AD 0x402F 0x653F # +0x90AE 0x4030 0x6574 # +0x90AF 0x4031 0x661F # +0x90B0 0x4032 0x6674 # +0x90B1 0x4033 0x68F2 # +0x90B2 0x4034 0x6816 # +0x90B3 0x4035 0x6B63 # +0x90B4 0x4036 0x6E05 # +0x90B5 0x4037 0x7272 # +0x90B6 0x4038 0x751F # +0x90B7 0x4039 0x76DB # +0x90B8 0x403A 0x7CBE # +0x90B9 0x403B 0x8056 # +0x90BA 0x403C 0x58F0 # +0x90BB 0x403D 0x88FD # +0x90BC 0x403E 0x897F # +0x90BD 0x403F 0x8AA0 # +0x90BE 0x4040 0x8A93 # +0x90BF 0x4041 0x8ACB # +0x90C0 0x4042 0x901D # +0x90C1 0x4043 0x9192 # +0x90C2 0x4044 0x9752 # +0x90C3 0x4045 0x9759 # +0x90C4 0x4046 0x6589 # +0x90C5 0x4047 0x7A0E # +0x90C6 0x4048 0x8106 # +0x90C7 0x4049 0x96BB # +0x90C8 0x404A 0x5E2D # +0x90C9 0x404B 0x60DC # +0x90CA 0x404C 0x621A # +0x90CB 0x404D 0x65A5 # +0x90CC 0x404E 0x6614 # +0x90CD 0x404F 0x6790 # +0x90CE 0x4050 0x77F3 # +0x90CF 0x4051 0x7A4D # +0x90D0 0x4052 0x7C4D # +0x90D1 0x4053 0x7E3E # +0x90D2 0x4054 0x810A # +0x90D3 0x4055 0x8CAC # +0x90D4 0x4056 0x8D64 # +0x90D5 0x4057 0x8DE1 # +0x90D6 0x4058 0x8E5F # +0x90D7 0x4059 0x78A9 # +0x90D8 0x405A 0x5207 # +0x90D9 0x405B 0x62D9 # +0x90DA 0x405C 0x63A5 # +0x90DB 0x405D 0x6442 # +0x90DC 0x405E 0x6298 # +0x90DD 0x405F 0x8A2D # +0x90DE 0x4060 0x7A83 # +0x90DF 0x4061 0x7BC0 # +0x90E0 0x4062 0x8AAC # +0x90E1 0x4063 0x96EA # +0x90E2 0x4064 0x7D76 # +0x90E3 0x4065 0x820C # +0x90E4 0x4066 0x8749 # +0x90E5 0x4067 0x4ED9 # +0x90E6 0x4068 0x5148 # +0x90E7 0x4069 0x5343 # +0x90E8 0x406A 0x5360 # +0x90E9 0x406B 0x5BA3 # +0x90EA 0x406C 0x5C02 # +0x90EB 0x406D 0x5C16 # +0x90EC 0x406E 0x5DDD # +0x90ED 0x406F 0x6226 # +0x90EE 0x4070 0x6247 # +0x90EF 0x4071 0x64B0 # +0x90F0 0x4072 0x6813 # +0x90F1 0x4073 0x6834 # +0x90F2 0x4074 0x6CC9 # +0x90F3 0x4075 0x6D45 # +0x90F4 0x4076 0x6D17 # +0x90F5 0x4077 0x67D3 # +0x90F6 0x4078 0x6F5C # +0x90F7 0x4079 0x714E # +0x90F8 0x407A 0x717D # +0x90F9 0x407B 0x65CB # +0x90FA 0x407C 0x7A7F # +0x90FB 0x407D 0x7BAD # +0x90FC 0x407E 0x7DDA # +0x9140 0x4121 0x7E4A # +0x9141 0x4122 0x7FA8 # +0x9142 0x4123 0x817A # +0x9143 0x4124 0x821B # +0x9144 0x4125 0x8239 # +0x9145 0x4126 0x85A6 # +0x9146 0x4127 0x8A6E # +0x9147 0x4128 0x8CCE # +0x9148 0x4129 0x8DF5 # +0x9149 0x412A 0x9078 # +0x914A 0x412B 0x9077 # +0x914B 0x412C 0x92AD # +0x914C 0x412D 0x9291 # +0x914D 0x412E 0x9583 # +0x914E 0x412F 0x9BAE # +0x914F 0x4130 0x524D # +0x9150 0x4131 0x5584 # +0x9151 0x4132 0x6F38 # +0x9152 0x4133 0x7136 # +0x9153 0x4134 0x5168 # +0x9154 0x4135 0x7985 # +0x9155 0x4136 0x7E55 # +0x9156 0x4137 0x81B3 # +0x9157 0x4138 0x7CCE # +0x9158 0x4139 0x564C # +0x9159 0x413A 0x5851 # +0x915A 0x413B 0x5CA8 # +0x915B 0x413C 0x63AA # +0x915C 0x413D 0x66FE # +0x915D 0x413E 0x66FD # +0x915E 0x413F 0x695A # +0x915F 0x4140 0x72D9 # +0x9160 0x4141 0x758F # +0x9161 0x4142 0x758E # +0x9162 0x4143 0x790E # +0x9163 0x4144 0x7956 # +0x9164 0x4145 0x79DF # +0x9165 0x4146 0x7C97 # +0x9166 0x4147 0x7D20 # +0x9167 0x4148 0x7D44 # +0x9168 0x4149 0x8607 # +0x9169 0x414A 0x8A34 # +0x916A 0x414B 0x963B # +0x916B 0x414C 0x9061 # +0x916C 0x414D 0x9F20 # +0x916D 0x414E 0x50E7 # +0x916E 0x414F 0x5275 # +0x916F 0x4150 0x53CC # +0x9170 0x4151 0x53E2 # +0x9171 0x4152 0x5009 # +0x9172 0x4153 0x55AA # +0x9173 0x4154 0x58EE # +0x9174 0x4155 0x594F # +0x9175 0x4156 0x723D # +0x9176 0x4157 0x5B8B # +0x9177 0x4158 0x5C64 # +0x9178 0x4159 0x531D # +0x9179 0x415A 0x60E3 # +0x917A 0x415B 0x60F3 # +0x917B 0x415C 0x635C # +0x917C 0x415D 0x6383 # +0x917D 0x415E 0x633F # +0x917E 0x415F 0x63BB # +0x9180 0x4160 0x64CD # +0x9181 0x4161 0x65E9 # +0x9182 0x4162 0x66F9 # +0x9183 0x4163 0x5DE3 # +0x9184 0x4164 0x69CD # +0x9185 0x4165 0x69FD # +0x9186 0x4166 0x6F15 # +0x9187 0x4167 0x71E5 # +0x9188 0x4168 0x4E89 # +0x9189 0x4169 0x75E9 # +0x918A 0x416A 0x76F8 # +0x918B 0x416B 0x7A93 # +0x918C 0x416C 0x7CDF # +0x918D 0x416D 0x7DCF # +0x918E 0x416E 0x7D9C # +0x918F 0x416F 0x8061 # +0x9190 0x4170 0x8349 # +0x9191 0x4171 0x8358 # +0x9192 0x4172 0x846C # +0x9193 0x4173 0x84BC # +0x9194 0x4174 0x85FB # +0x9195 0x4175 0x88C5 # +0x9196 0x4176 0x8D70 # +0x9197 0x4177 0x9001 # +0x9198 0x4178 0x906D # +0x9199 0x4179 0x9397 # +0x919A 0x417A 0x971C # +0x919B 0x417B 0x9A12 # +0x919C 0x417C 0x50CF # +0x919D 0x417D 0x5897 # +0x919E 0x417E 0x618E # +0x919F 0x4221 0x81D3 # +0x91A0 0x4222 0x8535 # +0x91A1 0x4223 0x8D08 # +0x91A2 0x4224 0x9020 # +0x91A3 0x4225 0x4FC3 # +0x91A4 0x4226 0x5074 # +0x91A5 0x4227 0x5247 # +0x91A6 0x4228 0x5373 # +0x91A7 0x4229 0x606F # +0x91A8 0x422A 0x6349 # +0x91A9 0x422B 0x675F # +0x91AA 0x422C 0x6E2C # +0x91AB 0x422D 0x8DB3 # +0x91AC 0x422E 0x901F # +0x91AD 0x422F 0x4FD7 # +0x91AE 0x4230 0x5C5E # +0x91AF 0x4231 0x8CCA # +0x91B0 0x4232 0x65CF # +0x91B1 0x4233 0x7D9A # +0x91B2 0x4234 0x5352 # +0x91B3 0x4235 0x8896 # +0x91B4 0x4236 0x5176 # +0x91B5 0x4237 0x63C3 # +0x91B6 0x4238 0x5B58 # +0x91B7 0x4239 0x5B6B # +0x91B8 0x423A 0x5C0A # +0x91B9 0x423B 0x640D # +0x91BA 0x423C 0x6751 # +0x91BB 0x423D 0x905C # +0x91BC 0x423E 0x4ED6 # +0x91BD 0x423F 0x591A # +0x91BE 0x4240 0x592A # +0x91BF 0x4241 0x6C70 # +0x91C0 0x4242 0x8A51 # +0x91C1 0x4243 0x553E # +0x91C2 0x4244 0x5815 # +0x91C3 0x4245 0x59A5 # +0x91C4 0x4246 0x60F0 # +0x91C5 0x4247 0x6253 # +0x91C6 0x4248 0x67C1 # +0x91C7 0x4249 0x8235 # +0x91C8 0x424A 0x6955 # +0x91C9 0x424B 0x9640 # +0x91CA 0x424C 0x99C4 # +0x91CB 0x424D 0x9A28 # +0x91CC 0x424E 0x4F53 # +0x91CD 0x424F 0x5806 # +0x91CE 0x4250 0x5BFE # +0x91CF 0x4251 0x8010 # +0x91D0 0x4252 0x5CB1 # +0x91D1 0x4253 0x5E2F # +0x91D2 0x4254 0x5F85 # +0x91D3 0x4255 0x6020 # +0x91D4 0x4256 0x614B # +0x91D5 0x4257 0x6234 # +0x91D6 0x4258 0x66FF # +0x91D7 0x4259 0x6CF0 # +0x91D8 0x425A 0x6EDE # +0x91D9 0x425B 0x80CE # +0x91DA 0x425C 0x817F # +0x91DB 0x425D 0x82D4 # +0x91DC 0x425E 0x888B # +0x91DD 0x425F 0x8CB8 # +0x91DE 0x4260 0x9000 # +0x91DF 0x4261 0x902E # +0x91E0 0x4262 0x968A # +0x91E1 0x4263 0x9EDB # +0x91E2 0x4264 0x9BDB # +0x91E3 0x4265 0x4EE3 # +0x91E4 0x4266 0x53F0 # +0x91E5 0x4267 0x5927 # +0x91E6 0x4268 0x7B2C # +0x91E7 0x4269 0x918D # +0x91E8 0x426A 0x984C # +0x91E9 0x426B 0x9DF9 # +0x91EA 0x426C 0x6EDD # +0x91EB 0x426D 0x7027 # +0x91EC 0x426E 0x5353 # +0x91ED 0x426F 0x5544 # +0x91EE 0x4270 0x5B85 # +0x91EF 0x4271 0x6258 # +0x91F0 0x4272 0x629E # +0x91F1 0x4273 0x62D3 # +0x91F2 0x4274 0x6CA2 # +0x91F3 0x4275 0x6FEF # +0x91F4 0x4276 0x7422 # +0x91F5 0x4277 0x8A17 # +0x91F6 0x4278 0x9438 # +0x91F7 0x4279 0x6FC1 # +0x91F8 0x427A 0x8AFE # +0x91F9 0x427B 0x8338 # +0x91FA 0x427C 0x51E7 # +0x91FB 0x427D 0x86F8 # +0x91FC 0x427E 0x53EA # +0x9240 0x4321 0x53E9 # +0x9241 0x4322 0x4F46 # +0x9242 0x4323 0x9054 # +0x9243 0x4324 0x8FB0 # +0x9244 0x4325 0x596A # +0x9245 0x4326 0x8131 # +0x9246 0x4327 0x5DFD # +0x9247 0x4328 0x7AEA # +0x9248 0x4329 0x8FBF # +0x9249 0x432A 0x68DA # +0x924A 0x432B 0x8C37 # +0x924B 0x432C 0x72F8 # +0x924C 0x432D 0x9C48 # +0x924D 0x432E 0x6A3D # +0x924E 0x432F 0x8AB0 # +0x924F 0x4330 0x4E39 # +0x9250 0x4331 0x5358 # +0x9251 0x4332 0x5606 # +0x9252 0x4333 0x5766 # +0x9253 0x4334 0x62C5 # +0x9254 0x4335 0x63A2 # +0x9255 0x4336 0x65E6 # +0x9256 0x4337 0x6B4E # +0x9257 0x4338 0x6DE1 # +0x9258 0x4339 0x6E5B # +0x9259 0x433A 0x70AD # +0x925A 0x433B 0x77ED # +0x925B 0x433C 0x7AEF # +0x925C 0x433D 0x7BAA # +0x925D 0x433E 0x7DBB # +0x925E 0x433F 0x803D # +0x925F 0x4340 0x80C6 # +0x9260 0x4341 0x86CB # +0x9261 0x4342 0x8A95 # +0x9262 0x4343 0x935B # +0x9263 0x4344 0x56E3 # +0x9264 0x4345 0x58C7 # +0x9265 0x4346 0x5F3E # +0x9266 0x4347 0x65AD # +0x9267 0x4348 0x6696 # +0x9268 0x4349 0x6A80 # +0x9269 0x434A 0x6BB5 # +0x926A 0x434B 0x7537 # +0x926B 0x434C 0x8AC7 # +0x926C 0x434D 0x5024 # +0x926D 0x434E 0x77E5 # +0x926E 0x434F 0x5730 # +0x926F 0x4350 0x5F1B # +0x9270 0x4351 0x6065 # +0x9271 0x4352 0x667A # +0x9272 0x4353 0x6C60 # +0x9273 0x4354 0x75F4 # +0x9274 0x4355 0x7A1A # +0x9275 0x4356 0x7F6E # +0x9276 0x4357 0x81F4 # +0x9277 0x4358 0x8718 # +0x9278 0x4359 0x9045 # +0x9279 0x435A 0x99B3 # +0x927A 0x435B 0x7BC9 # +0x927B 0x435C 0x755C # +0x927C 0x435D 0x7AF9 # +0x927D 0x435E 0x7B51 # +0x927E 0x435F 0x84C4 # +0x9280 0x4360 0x9010 # +0x9281 0x4361 0x79E9 # +0x9282 0x4362 0x7A92 # +0x9283 0x4363 0x8336 # +0x9284 0x4364 0x5AE1 # +0x9285 0x4365 0x7740 # +0x9286 0x4366 0x4E2D # +0x9287 0x4367 0x4EF2 # +0x9288 0x4368 0x5B99 # +0x9289 0x4369 0x5FE0 # +0x928A 0x436A 0x62BD # +0x928B 0x436B 0x663C # +0x928C 0x436C 0x67F1 # +0x928D 0x436D 0x6CE8 # +0x928E 0x436E 0x866B # +0x928F 0x436F 0x8877 # +0x9290 0x4370 0x8A3B # +0x9291 0x4371 0x914E # +0x9292 0x4372 0x92F3 # +0x9293 0x4373 0x99D0 # +0x9294 0x4374 0x6A17 # +0x9295 0x4375 0x7026 # +0x9296 0x4376 0x732A # +0x9297 0x4377 0x82E7 # +0x9298 0x4378 0x8457 # +0x9299 0x4379 0x8CAF # +0x929A 0x437A 0x4E01 # +0x929B 0x437B 0x5146 # +0x929C 0x437C 0x51CB # +0x929D 0x437D 0x558B # +0x929E 0x437E 0x5BF5 # +0x929F 0x4421 0x5E16 # +0x92A0 0x4422 0x5E33 # +0x92A1 0x4423 0x5E81 # +0x92A2 0x4424 0x5F14 # +0x92A3 0x4425 0x5F35 # +0x92A4 0x4426 0x5F6B # +0x92A5 0x4427 0x5FB4 # +0x92A6 0x4428 0x61F2 # +0x92A7 0x4429 0x6311 # +0x92A8 0x442A 0x66A2 # +0x92A9 0x442B 0x671D # +0x92AA 0x442C 0x6F6E # +0x92AB 0x442D 0x7252 # +0x92AC 0x442E 0x753A # +0x92AD 0x442F 0x773A # +0x92AE 0x4430 0x8074 # +0x92AF 0x4431 0x8139 # +0x92B0 0x4432 0x8178 # +0x92B1 0x4433 0x8776 # +0x92B2 0x4434 0x8ABF # +0x92B3 0x4435 0x8ADC # +0x92B4 0x4436 0x8D85 # +0x92B5 0x4437 0x8DF3 # +0x92B6 0x4438 0x929A # +0x92B7 0x4439 0x9577 # +0x92B8 0x443A 0x9802 # +0x92B9 0x443B 0x9CE5 # +0x92BA 0x443C 0x52C5 # +0x92BB 0x443D 0x6357 # +0x92BC 0x443E 0x76F4 # +0x92BD 0x443F 0x6715 # +0x92BE 0x4440 0x6C88 # +0x92BF 0x4441 0x73CD # +0x92C0 0x4442 0x8CC3 # +0x92C1 0x4443 0x93AE # +0x92C2 0x4444 0x9673 # +0x92C3 0x4445 0x6D25 # +0x92C4 0x4446 0x589C # +0x92C5 0x4447 0x690E # +0x92C6 0x4448 0x69CC # +0x92C7 0x4449 0x8FFD # +0x92C8 0x444A 0x939A # +0x92C9 0x444B 0x75DB # +0x92CA 0x444C 0x901A # +0x92CB 0x444D 0x585A # +0x92CC 0x444E 0x6802 # +0x92CD 0x444F 0x63B4 # +0x92CE 0x4450 0x69FB # +0x92CF 0x4451 0x4F43 # +0x92D0 0x4452 0x6F2C # +0x92D1 0x4453 0x67D8 # +0x92D2 0x4454 0x8FBB # +0x92D3 0x4455 0x8526 # +0x92D4 0x4456 0x7DB4 # +0x92D5 0x4457 0x9354 # +0x92D6 0x4458 0x693F # +0x92D7 0x4459 0x6F70 # +0x92D8 0x445A 0x576A # +0x92D9 0x445B 0x58F7 # +0x92DA 0x445C 0x5B2C # +0x92DB 0x445D 0x7D2C # +0x92DC 0x445E 0x722A # +0x92DD 0x445F 0x540A # +0x92DE 0x4460 0x91E3 # +0x92DF 0x4461 0x9DB4 # +0x92E0 0x4462 0x4EAD # +0x92E1 0x4463 0x4F4E # +0x92E2 0x4464 0x505C # +0x92E3 0x4465 0x5075 # +0x92E4 0x4466 0x5243 # +0x92E5 0x4467 0x8C9E # +0x92E6 0x4468 0x5448 # +0x92E7 0x4469 0x5824 # +0x92E8 0x446A 0x5B9A # +0x92E9 0x446B 0x5E1D # +0x92EA 0x446C 0x5E95 # +0x92EB 0x446D 0x5EAD # +0x92EC 0x446E 0x5EF7 # +0x92ED 0x446F 0x5F1F # +0x92EE 0x4470 0x608C # +0x92EF 0x4471 0x62B5 # +0x92F0 0x4472 0x633A # +0x92F1 0x4473 0x63D0 # +0x92F2 0x4474 0x68AF # +0x92F3 0x4475 0x6C40 # +0x92F4 0x4476 0x7887 # +0x92F5 0x4477 0x798E # +0x92F6 0x4478 0x7A0B # +0x92F7 0x4479 0x7DE0 # +0x92F8 0x447A 0x8247 # +0x92F9 0x447B 0x8A02 # +0x92FA 0x447C 0x8AE6 # +0x92FB 0x447D 0x8E44 # +0x92FC 0x447E 0x9013 # +0x9340 0x4521 0x90B8 # +0x9341 0x4522 0x912D # +0x9342 0x4523 0x91D8 # +0x9343 0x4524 0x9F0E # +0x9344 0x4525 0x6CE5 # +0x9345 0x4526 0x6458 # +0x9346 0x4527 0x64E2 # +0x9347 0x4528 0x6575 # +0x9348 0x4529 0x6EF4 # +0x9349 0x452A 0x7684 # +0x934A 0x452B 0x7B1B # +0x934B 0x452C 0x9069 # +0x934C 0x452D 0x93D1 # +0x934D 0x452E 0x6EBA # +0x934E 0x452F 0x54F2 # +0x934F 0x4530 0x5FB9 # +0x9350 0x4531 0x64A4 # +0x9351 0x4532 0x8F4D # +0x9352 0x4533 0x8FED # +0x9353 0x4534 0x9244 # +0x9354 0x4535 0x5178 # +0x9355 0x4536 0x586B # +0x9356 0x4537 0x5929 # +0x9357 0x4538 0x5C55 # +0x9358 0x4539 0x5E97 # +0x9359 0x453A 0x6DFB # +0x935A 0x453B 0x7E8F # +0x935B 0x453C 0x751C # +0x935C 0x453D 0x8CBC # +0x935D 0x453E 0x8EE2 # +0x935E 0x453F 0x985B # +0x935F 0x4540 0x70B9 # +0x9360 0x4541 0x4F1D # +0x9361 0x4542 0x6BBF # +0x9362 0x4543 0x6FB1 # +0x9363 0x4544 0x7530 # +0x9364 0x4545 0x96FB # +0x9365 0x4546 0x514E # +0x9366 0x4547 0x5410 # +0x9367 0x4548 0x5835 # +0x9368 0x4549 0x5857 # +0x9369 0x454A 0x59AC # +0x936A 0x454B 0x5C60 # +0x936B 0x454C 0x5F92 # +0x936C 0x454D 0x6597 # +0x936D 0x454E 0x675C # +0x936E 0x454F 0x6E21 # +0x936F 0x4550 0x767B # +0x9370 0x4551 0x83DF # +0x9371 0x4552 0x8CED # +0x9372 0x4553 0x9014 # +0x9373 0x4554 0x90FD # +0x9374 0x4555 0x934D # +0x9375 0x4556 0x7825 # +0x9376 0x4557 0x783A # +0x9377 0x4558 0x52AA # +0x9378 0x4559 0x5EA6 # +0x9379 0x455A 0x571F # +0x937A 0x455B 0x5974 # +0x937B 0x455C 0x6012 # +0x937C 0x455D 0x5012 # +0x937D 0x455E 0x515A # +0x937E 0x455F 0x51AC # +0x9380 0x4560 0x51CD # +0x9381 0x4561 0x5200 # +0x9382 0x4562 0x5510 # +0x9383 0x4563 0x5854 # +0x9384 0x4564 0x5858 # +0x9385 0x4565 0x5957 # +0x9386 0x4566 0x5B95 # +0x9387 0x4567 0x5CF6 # +0x9388 0x4568 0x5D8B # +0x9389 0x4569 0x60BC # +0x938A 0x456A 0x6295 # +0x938B 0x456B 0x642D # +0x938C 0x456C 0x6771 # +0x938D 0x456D 0x6843 # +0x938E 0x456E 0x68BC # +0x938F 0x456F 0x68DF # +0x9390 0x4570 0x76D7 # +0x9391 0x4571 0x6DD8 # +0x9392 0x4572 0x6E6F # +0x9393 0x4573 0x6D9B # +0x9394 0x4574 0x706F # +0x9395 0x4575 0x71C8 # +0x9396 0x4576 0x5F53 # +0x9397 0x4577 0x75D8 # +0x9398 0x4578 0x7977 # +0x9399 0x4579 0x7B49 # +0x939A 0x457A 0x7B54 # +0x939B 0x457B 0x7B52 # +0x939C 0x457C 0x7CD6 # +0x939D 0x457D 0x7D71 # +0x939E 0x457E 0x5230 # +0x939F 0x4621 0x8463 # +0x93A0 0x4622 0x8569 # +0x93A1 0x4623 0x85E4 # +0x93A2 0x4624 0x8A0E # +0x93A3 0x4625 0x8B04 # +0x93A4 0x4626 0x8C46 # +0x93A5 0x4627 0x8E0F # +0x93A6 0x4628 0x9003 # +0x93A7 0x4629 0x900F # +0x93A8 0x462A 0x9419 # +0x93A9 0x462B 0x9676 # +0x93AA 0x462C 0x982D # +0x93AB 0x462D 0x9A30 # +0x93AC 0x462E 0x95D8 # +0x93AD 0x462F 0x50CD # +0x93AE 0x4630 0x52D5 # +0x93AF 0x4631 0x540C # +0x93B0 0x4632 0x5802 # +0x93B1 0x4633 0x5C0E # +0x93B2 0x4634 0x61A7 # +0x93B3 0x4635 0x649E # +0x93B4 0x4636 0x6D1E # +0x93B5 0x4637 0x77B3 # +0x93B6 0x4638 0x7AE5 # +0x93B7 0x4639 0x80F4 # +0x93B8 0x463A 0x8404 # +0x93B9 0x463B 0x9053 # +0x93BA 0x463C 0x9285 # +0x93BB 0x463D 0x5CE0 # +0x93BC 0x463E 0x9D07 # +0x93BD 0x463F 0x533F # +0x93BE 0x4640 0x5F97 # +0x93BF 0x4641 0x5FB3 # +0x93C0 0x4642 0x6D9C # +0x93C1 0x4643 0x7279 # +0x93C2 0x4644 0x7763 # +0x93C3 0x4645 0x79BF # +0x93C4 0x4646 0x7BE4 # +0x93C5 0x4647 0x6BD2 # +0x93C6 0x4648 0x72EC # +0x93C7 0x4649 0x8AAD # +0x93C8 0x464A 0x6803 # +0x93C9 0x464B 0x6A61 # +0x93CA 0x464C 0x51F8 # +0x93CB 0x464D 0x7A81 # +0x93CC 0x464E 0x6934 # +0x93CD 0x464F 0x5C4A # +0x93CE 0x4650 0x9CF6 # +0x93CF 0x4651 0x82EB # +0x93D0 0x4652 0x5BC5 # +0x93D1 0x4653 0x9149 # +0x93D2 0x4654 0x701E # +0x93D3 0x4655 0x5678 # +0x93D4 0x4656 0x5C6F # +0x93D5 0x4657 0x60C7 # +0x93D6 0x4658 0x6566 # +0x93D7 0x4659 0x6C8C # +0x93D8 0x465A 0x8C5A # +0x93D9 0x465B 0x9041 # +0x93DA 0x465C 0x9813 # +0x93DB 0x465D 0x5451 # +0x93DC 0x465E 0x66C7 # +0x93DD 0x465F 0x920D # +0x93DE 0x4660 0x5948 # +0x93DF 0x4661 0x90A3 # +0x93E0 0x4662 0x5185 # +0x93E1 0x4663 0x4E4D # +0x93E2 0x4664 0x51EA # +0x93E3 0x4665 0x8599 # +0x93E4 0x4666 0x8B0E # +0x93E5 0x4667 0x7058 # +0x93E6 0x4668 0x637A # +0x93E7 0x4669 0x934B # +0x93E8 0x466A 0x6962 # +0x93E9 0x466B 0x99B4 # +0x93EA 0x466C 0x7E04 # +0x93EB 0x466D 0x7577 # +0x93EC 0x466E 0x5357 # +0x93ED 0x466F 0x6960 # +0x93EE 0x4670 0x8EDF # +0x93EF 0x4671 0x96E3 # +0x93F0 0x4672 0x6C5D # +0x93F1 0x4673 0x4E8C # +0x93F2 0x4674 0x5C3C # +0x93F3 0x4675 0x5F10 # +0x93F4 0x4676 0x8FE9 # +0x93F5 0x4677 0x5302 # +0x93F6 0x4678 0x8CD1 # +0x93F7 0x4679 0x8089 # +0x93F8 0x467A 0x8679 # +0x93F9 0x467B 0x5EFF # +0x93FA 0x467C 0x65E5 # +0x93FB 0x467D 0x4E73 # +0x93FC 0x467E 0x5165 # +0x9440 0x4721 0x5982 # +0x9441 0x4722 0x5C3F # +0x9442 0x4723 0x97EE # +0x9443 0x4724 0x4EFB # +0x9444 0x4725 0x598A # +0x9445 0x4726 0x5FCD # +0x9446 0x4727 0x8A8D # +0x9447 0x4728 0x6FE1 # +0x9448 0x4729 0x79B0 # +0x9449 0x472A 0x7962 # +0x944A 0x472B 0x5BE7 # +0x944B 0x472C 0x8471 # +0x944C 0x472D 0x732B # +0x944D 0x472E 0x71B1 # +0x944E 0x472F 0x5E74 # +0x944F 0x4730 0x5FF5 # +0x9450 0x4731 0x637B # +0x9451 0x4732 0x649A # +0x9452 0x4733 0x71C3 # +0x9453 0x4734 0x7C98 # +0x9454 0x4735 0x4E43 # +0x9455 0x4736 0x5EFC # +0x9456 0x4737 0x4E4B # +0x9457 0x4738 0x57DC # +0x9458 0x4739 0x56A2 # +0x9459 0x473A 0x60A9 # +0x945A 0x473B 0x6FC3 # +0x945B 0x473C 0x7D0D # +0x945C 0x473D 0x80FD # +0x945D 0x473E 0x8133 # +0x945E 0x473F 0x81BF # +0x945F 0x4740 0x8FB2 # +0x9460 0x4741 0x8997 # +0x9461 0x4742 0x86A4 # +0x9462 0x4743 0x5DF4 # +0x9463 0x4744 0x628A # +0x9464 0x4745 0x64AD # +0x9465 0x4746 0x8987 # +0x9466 0x4747 0x6777 # +0x9467 0x4748 0x6CE2 # +0x9468 0x4749 0x6D3E # +0x9469 0x474A 0x7436 # +0x946A 0x474B 0x7834 # +0x946B 0x474C 0x5A46 # +0x946C 0x474D 0x7F75 # +0x946D 0x474E 0x82AD # +0x946E 0x474F 0x99AC # +0x946F 0x4750 0x4FF3 # +0x9470 0x4751 0x5EC3 # +0x9471 0x4752 0x62DD # +0x9472 0x4753 0x6392 # +0x9473 0x4754 0x6557 # +0x9474 0x4755 0x676F # +0x9475 0x4756 0x76C3 # +0x9476 0x4757 0x724C # +0x9477 0x4758 0x80CC # +0x9478 0x4759 0x80BA # +0x9479 0x475A 0x8F29 # +0x947A 0x475B 0x914D # +0x947B 0x475C 0x500D # +0x947C 0x475D 0x57F9 # +0x947D 0x475E 0x5A92 # +0x947E 0x475F 0x6885 # +0x9480 0x4760 0x6973 # +0x9481 0x4761 0x7164 # +0x9482 0x4762 0x72FD # +0x9483 0x4763 0x8CB7 # +0x9484 0x4764 0x58F2 # +0x9485 0x4765 0x8CE0 # +0x9486 0x4766 0x966A # +0x9487 0x4767 0x9019 # +0x9488 0x4768 0x877F # +0x9489 0x4769 0x79E4 # +0x948A 0x476A 0x77E7 # +0x948B 0x476B 0x8429 # +0x948C 0x476C 0x4F2F # +0x948D 0x476D 0x5265 # +0x948E 0x476E 0x535A # +0x948F 0x476F 0x62CD # +0x9490 0x4770 0x67CF # +0x9491 0x4771 0x6CCA # +0x9492 0x4772 0x767D # +0x9493 0x4773 0x7B94 # +0x9494 0x4774 0x7C95 # +0x9495 0x4775 0x8236 # +0x9496 0x4776 0x8584 # +0x9497 0x4777 0x8FEB # +0x9498 0x4778 0x66DD # +0x9499 0x4779 0x6F20 # +0x949A 0x477A 0x7206 # +0x949B 0x477B 0x7E1B # +0x949C 0x477C 0x83AB # +0x949D 0x477D 0x99C1 # +0x949E 0x477E 0x9EA6 # +0x949F 0x4821 0x51FD # +0x94A0 0x4822 0x7BB1 # +0x94A1 0x4823 0x7872 # +0x94A2 0x4824 0x7BB8 # +0x94A3 0x4825 0x8087 # +0x94A4 0x4826 0x7B48 # +0x94A5 0x4827 0x6AE8 # +0x94A6 0x4828 0x5E61 # +0x94A7 0x4829 0x808C # +0x94A8 0x482A 0x7551 # +0x94A9 0x482B 0x7560 # +0x94AA 0x482C 0x516B # +0x94AB 0x482D 0x9262 # +0x94AC 0x482E 0x6E8C # +0x94AD 0x482F 0x767A # +0x94AE 0x4830 0x9197 # +0x94AF 0x4831 0x9AEA # +0x94B0 0x4832 0x4F10 # +0x94B1 0x4833 0x7F70 # +0x94B2 0x4834 0x629C # +0x94B3 0x4835 0x7B4F # +0x94B4 0x4836 0x95A5 # +0x94B5 0x4837 0x9CE9 # +0x94B6 0x4838 0x567A # +0x94B7 0x4839 0x5859 # +0x94B8 0x483A 0x86E4 # +0x94B9 0x483B 0x96BC # +0x94BA 0x483C 0x4F34 # +0x94BB 0x483D 0x5224 # +0x94BC 0x483E 0x534A # +0x94BD 0x483F 0x53CD # +0x94BE 0x4840 0x53DB # +0x94BF 0x4841 0x5E06 # +0x94C0 0x4842 0x642C # +0x94C1 0x4843 0x6591 # +0x94C2 0x4844 0x677F # +0x94C3 0x4845 0x6C3E # +0x94C4 0x4846 0x6C4E # +0x94C5 0x4847 0x7248 # +0x94C6 0x4848 0x72AF # +0x94C7 0x4849 0x73ED # +0x94C8 0x484A 0x7554 # +0x94C9 0x484B 0x7E41 # +0x94CA 0x484C 0x822C # +0x94CB 0x484D 0x85E9 # +0x94CC 0x484E 0x8CA9 # +0x94CD 0x484F 0x7BC4 # +0x94CE 0x4850 0x91C6 # +0x94CF 0x4851 0x7169 # +0x94D0 0x4852 0x9812 # +0x94D1 0x4853 0x98EF # +0x94D2 0x4854 0x633D # +0x94D3 0x4855 0x6669 # +0x94D4 0x4856 0x756A # +0x94D5 0x4857 0x76E4 # +0x94D6 0x4858 0x78D0 # +0x94D7 0x4859 0x8543 # +0x94D8 0x485A 0x86EE # +0x94D9 0x485B 0x532A # +0x94DA 0x485C 0x5351 # +0x94DB 0x485D 0x5426 # +0x94DC 0x485E 0x5983 # +0x94DD 0x485F 0x5E87 # +0x94DE 0x4860 0x5F7C # +0x94DF 0x4861 0x60B2 # +0x94E0 0x4862 0x6249 # +0x94E1 0x4863 0x6279 # +0x94E2 0x4864 0x62AB # +0x94E3 0x4865 0x6590 # +0x94E4 0x4866 0x6BD4 # +0x94E5 0x4867 0x6CCC # +0x94E6 0x4868 0x75B2 # +0x94E7 0x4869 0x76AE # +0x94E8 0x486A 0x7891 # +0x94E9 0x486B 0x79D8 # +0x94EA 0x486C 0x7DCB # +0x94EB 0x486D 0x7F77 # +0x94EC 0x486E 0x80A5 # +0x94ED 0x486F 0x88AB # +0x94EE 0x4870 0x8AB9 # +0x94EF 0x4871 0x8CBB # +0x94F0 0x4872 0x907F # +0x94F1 0x4873 0x975E # +0x94F2 0x4874 0x98DB # +0x94F3 0x4875 0x6A0B # +0x94F4 0x4876 0x7C38 # +0x94F5 0x4877 0x5099 # +0x94F6 0x4878 0x5C3E # +0x94F7 0x4879 0x5FAE # +0x94F8 0x487A 0x6787 # +0x94F9 0x487B 0x6BD8 # +0x94FA 0x487C 0x7435 # +0x94FB 0x487D 0x7709 # +0x94FC 0x487E 0x7F8E # +0x9540 0x4921 0x9F3B # +0x9541 0x4922 0x67CA # +0x9542 0x4923 0x7A17 # +0x9543 0x4924 0x5339 # +0x9544 0x4925 0x758B # +0x9545 0x4926 0x9AED # +0x9546 0x4927 0x5F66 # +0x9547 0x4928 0x819D # +0x9548 0x4929 0x83F1 # +0x9549 0x492A 0x8098 # +0x954A 0x492B 0x5F3C # +0x954B 0x492C 0x5FC5 # +0x954C 0x492D 0x7562 # +0x954D 0x492E 0x7B46 # +0x954E 0x492F 0x903C # +0x954F 0x4930 0x6867 # +0x9550 0x4931 0x59EB # +0x9551 0x4932 0x5A9B # +0x9552 0x4933 0x7D10 # +0x9553 0x4934 0x767E # +0x9554 0x4935 0x8B2C # +0x9555 0x4936 0x4FF5 # +0x9556 0x4937 0x5F6A # +0x9557 0x4938 0x6A19 # +0x9558 0x4939 0x6C37 # +0x9559 0x493A 0x6F02 # +0x955A 0x493B 0x74E2 # +0x955B 0x493C 0x7968 # +0x955C 0x493D 0x8868 # +0x955D 0x493E 0x8A55 # +0x955E 0x493F 0x8C79 # +0x955F 0x4940 0x5EDF # +0x9560 0x4941 0x63CF # +0x9561 0x4942 0x75C5 # +0x9562 0x4943 0x79D2 # +0x9563 0x4944 0x82D7 # +0x9564 0x4945 0x9328 # +0x9565 0x4946 0x92F2 # +0x9566 0x4947 0x849C # +0x9567 0x4948 0x86ED # +0x9568 0x4949 0x9C2D # +0x9569 0x494A 0x54C1 # +0x956A 0x494B 0x5F6C # +0x956B 0x494C 0x658C # +0x956C 0x494D 0x6D5C # +0x956D 0x494E 0x7015 # +0x956E 0x494F 0x8CA7 # +0x956F 0x4950 0x8CD3 # +0x9570 0x4951 0x983B # +0x9571 0x4952 0x654F # +0x9572 0x4953 0x74F6 # +0x9573 0x4954 0x4E0D # +0x9574 0x4955 0x4ED8 # +0x9575 0x4956 0x57E0 # +0x9576 0x4957 0x592B # +0x9577 0x4958 0x5A66 # +0x9578 0x4959 0x5BCC # +0x9579 0x495A 0x51A8 # +0x957A 0x495B 0x5E03 # +0x957B 0x495C 0x5E9C # +0x957C 0x495D 0x6016 # +0x957D 0x495E 0x6276 # +0x957E 0x495F 0x6577 # +0x9580 0x4960 0x65A7 # +0x9581 0x4961 0x666E # +0x9582 0x4962 0x6D6E # +0x9583 0x4963 0x7236 # +0x9584 0x4964 0x7B26 # +0x9585 0x4965 0x8150 # +0x9586 0x4966 0x819A # +0x9587 0x4967 0x8299 # +0x9588 0x4968 0x8B5C # +0x9589 0x4969 0x8CA0 # +0x958A 0x496A 0x8CE6 # +0x958B 0x496B 0x8D74 # +0x958C 0x496C 0x961C # +0x958D 0x496D 0x9644 # +0x958E 0x496E 0x4FAE # +0x958F 0x496F 0x64AB # +0x9590 0x4970 0x6B66 # +0x9591 0x4971 0x821E # +0x9592 0x4972 0x8461 # +0x9593 0x4973 0x856A # +0x9594 0x4974 0x90E8 # +0x9595 0x4975 0x5C01 # +0x9596 0x4976 0x6953 # +0x9597 0x4977 0x98A8 # +0x9598 0x4978 0x847A # +0x9599 0x4979 0x8557 # +0x959A 0x497A 0x4F0F # +0x959B 0x497B 0x526F # +0x959C 0x497C 0x5FA9 # +0x959D 0x497D 0x5E45 # +0x959E 0x497E 0x670D # +0x959F 0x4A21 0x798F # +0x95A0 0x4A22 0x8179 # +0x95A1 0x4A23 0x8907 # +0x95A2 0x4A24 0x8986 # +0x95A3 0x4A25 0x6DF5 # +0x95A4 0x4A26 0x5F17 # +0x95A5 0x4A27 0x6255 # +0x95A6 0x4A28 0x6CB8 # +0x95A7 0x4A29 0x4ECF # +0x95A8 0x4A2A 0x7269 # +0x95A9 0x4A2B 0x9B92 # +0x95AA 0x4A2C 0x5206 # +0x95AB 0x4A2D 0x543B # +0x95AC 0x4A2E 0x5674 # +0x95AD 0x4A2F 0x58B3 # +0x95AE 0x4A30 0x61A4 # +0x95AF 0x4A31 0x626E # +0x95B0 0x4A32 0x711A # +0x95B1 0x4A33 0x596E # +0x95B2 0x4A34 0x7C89 # +0x95B3 0x4A35 0x7CDE # +0x95B4 0x4A36 0x7D1B # +0x95B5 0x4A37 0x96F0 # +0x95B6 0x4A38 0x6587 # +0x95B7 0x4A39 0x805E # +0x95B8 0x4A3A 0x4E19 # +0x95B9 0x4A3B 0x4F75 # +0x95BA 0x4A3C 0x5175 # +0x95BB 0x4A3D 0x5840 # +0x95BC 0x4A3E 0x5E63 # +0x95BD 0x4A3F 0x5E73 # +0x95BE 0x4A40 0x5F0A # +0x95BF 0x4A41 0x67C4 # +0x95C0 0x4A42 0x4E26 # +0x95C1 0x4A43 0x853D # +0x95C2 0x4A44 0x9589 # +0x95C3 0x4A45 0x965B # +0x95C4 0x4A46 0x7C73 # +0x95C5 0x4A47 0x9801 # +0x95C6 0x4A48 0x50FB # +0x95C7 0x4A49 0x58C1 # +0x95C8 0x4A4A 0x7656 # +0x95C9 0x4A4B 0x78A7 # +0x95CA 0x4A4C 0x5225 # +0x95CB 0x4A4D 0x77A5 # +0x95CC 0x4A4E 0x8511 # +0x95CD 0x4A4F 0x7B86 # +0x95CE 0x4A50 0x504F # +0x95CF 0x4A51 0x5909 # +0x95D0 0x4A52 0x7247 # +0x95D1 0x4A53 0x7BC7 # +0x95D2 0x4A54 0x7DE8 # +0x95D3 0x4A55 0x8FBA # +0x95D4 0x4A56 0x8FD4 # +0x95D5 0x4A57 0x904D # +0x95D6 0x4A58 0x4FBF # +0x95D7 0x4A59 0x52C9 # +0x95D8 0x4A5A 0x5A29 # +0x95D9 0x4A5B 0x5F01 # +0x95DA 0x4A5C 0x97AD # +0x95DB 0x4A5D 0x4FDD # +0x95DC 0x4A5E 0x8217 # +0x95DD 0x4A5F 0x92EA # +0x95DE 0x4A60 0x5703 # +0x95DF 0x4A61 0x6355 # +0x95E0 0x4A62 0x6B69 # +0x95E1 0x4A63 0x752B # +0x95E2 0x4A64 0x88DC # +0x95E3 0x4A65 0x8F14 # +0x95E4 0x4A66 0x7A42 # +0x95E5 0x4A67 0x52DF # +0x95E6 0x4A68 0x5893 # +0x95E7 0x4A69 0x6155 # +0x95E8 0x4A6A 0x620A # +0x95E9 0x4A6B 0x66AE # +0x95EA 0x4A6C 0x6BCD # +0x95EB 0x4A6D 0x7C3F # +0x95EC 0x4A6E 0x83E9 # +0x95ED 0x4A6F 0x5023 # +0x95EE 0x4A70 0x4FF8 # +0x95EF 0x4A71 0x5305 # +0x95F0 0x4A72 0x5446 # +0x95F1 0x4A73 0x5831 # +0x95F2 0x4A74 0x5949 # +0x95F3 0x4A75 0x5B9D # +0x95F4 0x4A76 0x5CF0 # +0x95F5 0x4A77 0x5CEF # +0x95F6 0x4A78 0x5D29 # +0x95F7 0x4A79 0x5E96 # +0x95F8 0x4A7A 0x62B1 # +0x95F9 0x4A7B 0x6367 # +0x95FA 0x4A7C 0x653E # +0x95FB 0x4A7D 0x65B9 # +0x95FC 0x4A7E 0x670B # +0x9640 0x4B21 0x6CD5 # +0x9641 0x4B22 0x6CE1 # +0x9642 0x4B23 0x70F9 # +0x9643 0x4B24 0x7832 # +0x9644 0x4B25 0x7E2B # +0x9645 0x4B26 0x80DE # +0x9646 0x4B27 0x82B3 # +0x9647 0x4B28 0x840C # +0x9648 0x4B29 0x84EC # +0x9649 0x4B2A 0x8702 # +0x964A 0x4B2B 0x8912 # +0x964B 0x4B2C 0x8A2A # +0x964C 0x4B2D 0x8C4A # +0x964D 0x4B2E 0x90A6 # +0x964E 0x4B2F 0x92D2 # +0x964F 0x4B30 0x98FD # +0x9650 0x4B31 0x9CF3 # +0x9651 0x4B32 0x9D6C # +0x9652 0x4B33 0x4E4F # +0x9653 0x4B34 0x4EA1 # +0x9654 0x4B35 0x508D # +0x9655 0x4B36 0x5256 # +0x9656 0x4B37 0x574A # +0x9657 0x4B38 0x59A8 # +0x9658 0x4B39 0x5E3D # +0x9659 0x4B3A 0x5FD8 # +0x965A 0x4B3B 0x5FD9 # +0x965B 0x4B3C 0x623F # +0x965C 0x4B3D 0x66B4 # +0x965D 0x4B3E 0x671B # +0x965E 0x4B3F 0x67D0 # +0x965F 0x4B40 0x68D2 # +0x9660 0x4B41 0x5192 # +0x9661 0x4B42 0x7D21 # +0x9662 0x4B43 0x80AA # +0x9663 0x4B44 0x81A8 # +0x9664 0x4B45 0x8B00 # +0x9665 0x4B46 0x8C8C # +0x9666 0x4B47 0x8CBF # +0x9667 0x4B48 0x927E # +0x9668 0x4B49 0x9632 # +0x9669 0x4B4A 0x5420 # +0x966A 0x4B4B 0x982C # +0x966B 0x4B4C 0x5317 # +0x966C 0x4B4D 0x50D5 # +0x966D 0x4B4E 0x535C # +0x966E 0x4B4F 0x58A8 # +0x966F 0x4B50 0x64B2 # +0x9670 0x4B51 0x6734 # +0x9671 0x4B52 0x7267 # +0x9672 0x4B53 0x7766 # +0x9673 0x4B54 0x7A46 # +0x9674 0x4B55 0x91E6 # +0x9675 0x4B56 0x52C3 # +0x9676 0x4B57 0x6CA1 # +0x9677 0x4B58 0x6B86 # +0x9678 0x4B59 0x5800 # +0x9679 0x4B5A 0x5E4C # +0x967A 0x4B5B 0x5954 # +0x967B 0x4B5C 0x672C # +0x967C 0x4B5D 0x7FFB # +0x967D 0x4B5E 0x51E1 # +0x967E 0x4B5F 0x76C6 # +0x9680 0x4B60 0x6469 # +0x9681 0x4B61 0x78E8 # +0x9682 0x4B62 0x9B54 # +0x9683 0x4B63 0x9EBB # +0x9684 0x4B64 0x57CB # +0x9685 0x4B65 0x59B9 # +0x9686 0x4B66 0x6627 # +0x9687 0x4B67 0x679A # +0x9688 0x4B68 0x6BCE # +0x9689 0x4B69 0x54E9 # +0x968A 0x4B6A 0x69D9 # +0x968B 0x4B6B 0x5E55 # +0x968C 0x4B6C 0x819C # +0x968D 0x4B6D 0x6795 # +0x968E 0x4B6E 0x9BAA # +0x968F 0x4B6F 0x67FE # +0x9690 0x4B70 0x9C52 # +0x9691 0x4B71 0x685D # +0x9692 0x4B72 0x4EA6 # +0x9693 0x4B73 0x4FE3 # +0x9694 0x4B74 0x53C8 # +0x9695 0x4B75 0x62B9 # +0x9696 0x4B76 0x672B # +0x9697 0x4B77 0x6CAB # +0x9698 0x4B78 0x8FC4 # +0x9699 0x4B79 0x4FAD # +0x969A 0x4B7A 0x7E6D # +0x969B 0x4B7B 0x9EBF # +0x969C 0x4B7C 0x4E07 # +0x969D 0x4B7D 0x6162 # +0x969E 0x4B7E 0x6E80 # +0x969F 0x4C21 0x6F2B # +0x96A0 0x4C22 0x8513 # +0x96A1 0x4C23 0x5473 # +0x96A2 0x4C24 0x672A # +0x96A3 0x4C25 0x9B45 # +0x96A4 0x4C26 0x5DF3 # +0x96A5 0x4C27 0x7B95 # +0x96A6 0x4C28 0x5CAC # +0x96A7 0x4C29 0x5BC6 # +0x96A8 0x4C2A 0x871C # +0x96A9 0x4C2B 0x6E4A # +0x96AA 0x4C2C 0x84D1 # +0x96AB 0x4C2D 0x7A14 # +0x96AC 0x4C2E 0x8108 # +0x96AD 0x4C2F 0x5999 # +0x96AE 0x4C30 0x7C8D # +0x96AF 0x4C31 0x6C11 # +0x96B0 0x4C32 0x7720 # +0x96B1 0x4C33 0x52D9 # +0x96B2 0x4C34 0x5922 # +0x96B3 0x4C35 0x7121 # +0x96B4 0x4C36 0x725F # +0x96B5 0x4C37 0x77DB # +0x96B6 0x4C38 0x9727 # +0x96B7 0x4C39 0x9D61 # +0x96B8 0x4C3A 0x690B # +0x96B9 0x4C3B 0x5A7F # +0x96BA 0x4C3C 0x5A18 # +0x96BB 0x4C3D 0x51A5 # +0x96BC 0x4C3E 0x540D # +0x96BD 0x4C3F 0x547D # +0x96BE 0x4C40 0x660E # +0x96BF 0x4C41 0x76DF # +0x96C0 0x4C42 0x8FF7 # +0x96C1 0x4C43 0x9298 # +0x96C2 0x4C44 0x9CF4 # +0x96C3 0x4C45 0x59EA # +0x96C4 0x4C46 0x725D # +0x96C5 0x4C47 0x6EC5 # +0x96C6 0x4C48 0x514D # +0x96C7 0x4C49 0x68C9 # +0x96C8 0x4C4A 0x7DBF # +0x96C9 0x4C4B 0x7DEC # +0x96CA 0x4C4C 0x9762 # +0x96CB 0x4C4D 0x9EBA # +0x96CC 0x4C4E 0x6478 # +0x96CD 0x4C4F 0x6A21 # +0x96CE 0x4C50 0x8302 # +0x96CF 0x4C51 0x5984 # +0x96D0 0x4C52 0x5B5F # +0x96D1 0x4C53 0x6BDB # +0x96D2 0x4C54 0x731B # +0x96D3 0x4C55 0x76F2 # +0x96D4 0x4C56 0x7DB2 # +0x96D5 0x4C57 0x8017 # +0x96D6 0x4C58 0x8499 # +0x96D7 0x4C59 0x5132 # +0x96D8 0x4C5A 0x6728 # +0x96D9 0x4C5B 0x9ED9 # +0x96DA 0x4C5C 0x76EE # +0x96DB 0x4C5D 0x6762 # +0x96DC 0x4C5E 0x52FF # +0x96DD 0x4C5F 0x9905 # +0x96DE 0x4C60 0x5C24 # +0x96DF 0x4C61 0x623B # +0x96E0 0x4C62 0x7C7E # +0x96E1 0x4C63 0x8CB0 # +0x96E2 0x4C64 0x554F # +0x96E3 0x4C65 0x60B6 # +0x96E4 0x4C66 0x7D0B # +0x96E5 0x4C67 0x9580 # +0x96E6 0x4C68 0x5301 # +0x96E7 0x4C69 0x4E5F # +0x96E8 0x4C6A 0x51B6 # +0x96E9 0x4C6B 0x591C # +0x96EA 0x4C6C 0x723A # +0x96EB 0x4C6D 0x8036 # +0x96EC 0x4C6E 0x91CE # +0x96ED 0x4C6F 0x5F25 # +0x96EE 0x4C70 0x77E2 # +0x96EF 0x4C71 0x5384 # +0x96F0 0x4C72 0x5F79 # +0x96F1 0x4C73 0x7D04 # +0x96F2 0x4C74 0x85AC # +0x96F3 0x4C75 0x8A33 # +0x96F4 0x4C76 0x8E8D # +0x96F5 0x4C77 0x9756 # +0x96F6 0x4C78 0x67F3 # +0x96F7 0x4C79 0x85AE # +0x96F8 0x4C7A 0x9453 # +0x96F9 0x4C7B 0x6109 # +0x96FA 0x4C7C 0x6108 # +0x96FB 0x4C7D 0x6CB9 # +0x96FC 0x4C7E 0x7652 # +0x9740 0x4D21 0x8AED # +0x9741 0x4D22 0x8F38 # +0x9742 0x4D23 0x552F # +0x9743 0x4D24 0x4F51 # +0x9744 0x4D25 0x512A # +0x9745 0x4D26 0x52C7 # +0x9746 0x4D27 0x53CB # +0x9747 0x4D28 0x5BA5 # +0x9748 0x4D29 0x5E7D # +0x9749 0x4D2A 0x60A0 # +0x974A 0x4D2B 0x6182 # +0x974B 0x4D2C 0x63D6 # +0x974C 0x4D2D 0x6709 # +0x974D 0x4D2E 0x67DA # +0x974E 0x4D2F 0x6E67 # +0x974F 0x4D30 0x6D8C # +0x9750 0x4D31 0x7336 # +0x9751 0x4D32 0x7337 # +0x9752 0x4D33 0x7531 # +0x9753 0x4D34 0x7950 # +0x9754 0x4D35 0x88D5 # +0x9755 0x4D36 0x8A98 # +0x9756 0x4D37 0x904A # +0x9757 0x4D38 0x9091 # +0x9758 0x4D39 0x90F5 # +0x9759 0x4D3A 0x96C4 # +0x975A 0x4D3B 0x878D # +0x975B 0x4D3C 0x5915 # +0x975C 0x4D3D 0x4E88 # +0x975D 0x4D3E 0x4F59 # +0x975E 0x4D3F 0x4E0E # +0x975F 0x4D40 0x8A89 # +0x9760 0x4D41 0x8F3F # +0x9761 0x4D42 0x9810 # +0x9762 0x4D43 0x50AD # +0x9763 0x4D44 0x5E7C # +0x9764 0x4D45 0x5996 # +0x9765 0x4D46 0x5BB9 # +0x9766 0x4D47 0x5EB8 # +0x9767 0x4D48 0x63DA # +0x9768 0x4D49 0x63FA # +0x9769 0x4D4A 0x64C1 # +0x976A 0x4D4B 0x66DC # +0x976B 0x4D4C 0x694A # +0x976C 0x4D4D 0x69D8 # +0x976D 0x4D4E 0x6D0B # +0x976E 0x4D4F 0x6EB6 # +0x976F 0x4D50 0x7194 # +0x9770 0x4D51 0x7528 # +0x9771 0x4D52 0x7AAF # +0x9772 0x4D53 0x7F8A # +0x9773 0x4D54 0x8000 # +0x9774 0x4D55 0x8449 # +0x9775 0x4D56 0x84C9 # +0x9776 0x4D57 0x8981 # +0x9777 0x4D58 0x8B21 # +0x9778 0x4D59 0x8E0A # +0x9779 0x4D5A 0x9065 # +0x977A 0x4D5B 0x967D # +0x977B 0x4D5C 0x990A # +0x977C 0x4D5D 0x617E # +0x977D 0x4D5E 0x6291 # +0x977E 0x4D5F 0x6B32 # +0x9780 0x4D60 0x6C83 # +0x9781 0x4D61 0x6D74 # +0x9782 0x4D62 0x7FCC # +0x9783 0x4D63 0x7FFC # +0x9784 0x4D64 0x6DC0 # +0x9785 0x4D65 0x7F85 # +0x9786 0x4D66 0x87BA # +0x9787 0x4D67 0x88F8 # +0x9788 0x4D68 0x6765 # +0x9789 0x4D69 0x83B1 # +0x978A 0x4D6A 0x983C # +0x978B 0x4D6B 0x96F7 # +0x978C 0x4D6C 0x6D1B # +0x978D 0x4D6D 0x7D61 # +0x978E 0x4D6E 0x843D # +0x978F 0x4D6F 0x916A # +0x9790 0x4D70 0x4E71 # +0x9791 0x4D71 0x5375 # +0x9792 0x4D72 0x5D50 # +0x9793 0x4D73 0x6B04 # +0x9794 0x4D74 0x6FEB # +0x9795 0x4D75 0x85CD # +0x9796 0x4D76 0x862D # +0x9797 0x4D77 0x89A7 # +0x9798 0x4D78 0x5229 # +0x9799 0x4D79 0x540F # +0x979A 0x4D7A 0x5C65 # +0x979B 0x4D7B 0x674E # +0x979C 0x4D7C 0x68A8 # +0x979D 0x4D7D 0x7406 # +0x979E 0x4D7E 0x7483 # +0x979F 0x4E21 0x75E2 # +0x97A0 0x4E22 0x88CF # +0x97A1 0x4E23 0x88E1 # +0x97A2 0x4E24 0x91CC # +0x97A3 0x4E25 0x96E2 # +0x97A4 0x4E26 0x9678 # +0x97A5 0x4E27 0x5F8B # +0x97A6 0x4E28 0x7387 # +0x97A7 0x4E29 0x7ACB # +0x97A8 0x4E2A 0x844E # +0x97A9 0x4E2B 0x63A0 # +0x97AA 0x4E2C 0x7565 # +0x97AB 0x4E2D 0x5289 # +0x97AC 0x4E2E 0x6D41 # +0x97AD 0x4E2F 0x6E9C # +0x97AE 0x4E30 0x7409 # +0x97AF 0x4E31 0x7559 # +0x97B0 0x4E32 0x786B # +0x97B1 0x4E33 0x7C92 # +0x97B2 0x4E34 0x9686 # +0x97B3 0x4E35 0x7ADC # +0x97B4 0x4E36 0x9F8D # +0x97B5 0x4E37 0x4FB6 # +0x97B6 0x4E38 0x616E # +0x97B7 0x4E39 0x65C5 # +0x97B8 0x4E3A 0x865C # +0x97B9 0x4E3B 0x4E86 # +0x97BA 0x4E3C 0x4EAE # +0x97BB 0x4E3D 0x50DA # +0x97BC 0x4E3E 0x4E21 # +0x97BD 0x4E3F 0x51CC # +0x97BE 0x4E40 0x5BEE # +0x97BF 0x4E41 0x6599 # +0x97C0 0x4E42 0x6881 # +0x97C1 0x4E43 0x6DBC # +0x97C2 0x4E44 0x731F # +0x97C3 0x4E45 0x7642 # +0x97C4 0x4E46 0x77AD # +0x97C5 0x4E47 0x7A1C # +0x97C6 0x4E48 0x7CE7 # +0x97C7 0x4E49 0x826F # +0x97C8 0x4E4A 0x8AD2 # +0x97C9 0x4E4B 0x907C # +0x97CA 0x4E4C 0x91CF # +0x97CB 0x4E4D 0x9675 # +0x97CC 0x4E4E 0x9818 # +0x97CD 0x4E4F 0x529B # +0x97CE 0x4E50 0x7DD1 # +0x97CF 0x4E51 0x502B # +0x97D0 0x4E52 0x5398 # +0x97D1 0x4E53 0x6797 # +0x97D2 0x4E54 0x6DCB # +0x97D3 0x4E55 0x71D0 # +0x97D4 0x4E56 0x7433 # +0x97D5 0x4E57 0x81E8 # +0x97D6 0x4E58 0x8F2A # +0x97D7 0x4E59 0x96A3 # +0x97D8 0x4E5A 0x9C57 # +0x97D9 0x4E5B 0x9E9F # +0x97DA 0x4E5C 0x7460 # +0x97DB 0x4E5D 0x5841 # +0x97DC 0x4E5E 0x6D99 # +0x97DD 0x4E5F 0x7D2F # +0x97DE 0x4E60 0x985E # +0x97DF 0x4E61 0x4EE4 # +0x97E0 0x4E62 0x4F36 # +0x97E1 0x4E63 0x4F8B # +0x97E2 0x4E64 0x51B7 # +0x97E3 0x4E65 0x52B1 # +0x97E4 0x4E66 0x5DBA # +0x97E5 0x4E67 0x601C # +0x97E6 0x4E68 0x73B2 # +0x97E7 0x4E69 0x793C # +0x97E8 0x4E6A 0x82D3 # +0x97E9 0x4E6B 0x9234 # +0x97EA 0x4E6C 0x96B7 # +0x97EB 0x4E6D 0x96F6 # +0x97EC 0x4E6E 0x970A # +0x97ED 0x4E6F 0x9E97 # +0x97EE 0x4E70 0x9F62 # +0x97EF 0x4E71 0x66A6 # +0x97F0 0x4E72 0x6B74 # +0x97F1 0x4E73 0x5217 # +0x97F2 0x4E74 0x52A3 # +0x97F3 0x4E75 0x70C8 # +0x97F4 0x4E76 0x88C2 # +0x97F5 0x4E77 0x5EC9 # +0x97F6 0x4E78 0x604B # +0x97F7 0x4E79 0x6190 # +0x97F8 0x4E7A 0x6F23 # +0x97F9 0x4E7B 0x7149 # +0x97FA 0x4E7C 0x7C3E # +0x97FB 0x4E7D 0x7DF4 # +0x97FC 0x4E7E 0x806F # +0x9840 0x4F21 0x84EE # +0x9841 0x4F22 0x9023 # +0x9842 0x4F23 0x932C # +0x9843 0x4F24 0x5442 # +0x9844 0x4F25 0x9B6F # +0x9845 0x4F26 0x6AD3 # +0x9846 0x4F27 0x7089 # +0x9847 0x4F28 0x8CC2 # +0x9848 0x4F29 0x8DEF # +0x9849 0x4F2A 0x9732 # +0x984A 0x4F2B 0x52B4 # +0x984B 0x4F2C 0x5A41 # +0x984C 0x4F2D 0x5ECA # +0x984D 0x4F2E 0x5F04 # +0x984E 0x4F2F 0x6717 # +0x984F 0x4F30 0x697C # +0x9850 0x4F31 0x6994 # +0x9851 0x4F32 0x6D6A # +0x9852 0x4F33 0x6F0F # +0x9853 0x4F34 0x7262 # +0x9854 0x4F35 0x72FC # +0x9855 0x4F36 0x7BED # +0x9856 0x4F37 0x8001 # +0x9857 0x4F38 0x807E # +0x9858 0x4F39 0x874B # +0x9859 0x4F3A 0x90CE # +0x985A 0x4F3B 0x516D # +0x985B 0x4F3C 0x9E93 # +0x985C 0x4F3D 0x7984 # +0x985D 0x4F3E 0x808B # +0x985E 0x4F3F 0x9332 # +0x985F 0x4F40 0x8AD6 # +0x9860 0x4F41 0x502D # +0x9861 0x4F42 0x548C # +0x9862 0x4F43 0x8A71 # +0x9863 0x4F44 0x6B6A # +0x9864 0x4F45 0x8CC4 # +0x9865 0x4F46 0x8107 # +0x9866 0x4F47 0x60D1 # +0x9867 0x4F48 0x67A0 # +0x9868 0x4F49 0x9DF2 # +0x9869 0x4F4A 0x4E99 # +0x986A 0x4F4B 0x4E98 # +0x986B 0x4F4C 0x9C10 # +0x986C 0x4F4D 0x8A6B # +0x986D 0x4F4E 0x85C1 # +0x986E 0x4F4F 0x8568 # +0x986F 0x4F50 0x6900 # +0x9870 0x4F51 0x6E7E # +0x9871 0x4F52 0x7897 # +0x9872 0x4F53 0x8155 # +0x989F 0x5021 0x5F0C # +0x98A0 0x5022 0x4E10 # +0x98A1 0x5023 0x4E15 # +0x98A2 0x5024 0x4E2A # +0x98A3 0x5025 0x4E31 # +0x98A4 0x5026 0x4E36 # +0x98A5 0x5027 0x4E3C # +0x98A6 0x5028 0x4E3F # +0x98A7 0x5029 0x4E42 # +0x98A8 0x502A 0x4E56 # +0x98A9 0x502B 0x4E58 # +0x98AA 0x502C 0x4E82 # +0x98AB 0x502D 0x4E85 # +0x98AC 0x502E 0x8C6B # +0x98AD 0x502F 0x4E8A # +0x98AE 0x5030 0x8212 # +0x98AF 0x5031 0x5F0D # +0x98B0 0x5032 0x4E8E # +0x98B1 0x5033 0x4E9E # +0x98B2 0x5034 0x4E9F # +0x98B3 0x5035 0x4EA0 # +0x98B4 0x5036 0x4EA2 # +0x98B5 0x5037 0x4EB0 # +0x98B6 0x5038 0x4EB3 # +0x98B7 0x5039 0x4EB6 # +0x98B8 0x503A 0x4ECE # +0x98B9 0x503B 0x4ECD # +0x98BA 0x503C 0x4EC4 # +0x98BB 0x503D 0x4EC6 # +0x98BC 0x503E 0x4EC2 # +0x98BD 0x503F 0x4ED7 # +0x98BE 0x5040 0x4EDE # +0x98BF 0x5041 0x4EED # +0x98C0 0x5042 0x4EDF # +0x98C1 0x5043 0x4EF7 # +0x98C2 0x5044 0x4F09 # +0x98C3 0x5045 0x4F5A # +0x98C4 0x5046 0x4F30 # +0x98C5 0x5047 0x4F5B # +0x98C6 0x5048 0x4F5D # +0x98C7 0x5049 0x4F57 # +0x98C8 0x504A 0x4F47 # +0x98C9 0x504B 0x4F76 # +0x98CA 0x504C 0x4F88 # +0x98CB 0x504D 0x4F8F # +0x98CC 0x504E 0x4F98 # +0x98CD 0x504F 0x4F7B # +0x98CE 0x5050 0x4F69 # +0x98CF 0x5051 0x4F70 # +0x98D0 0x5052 0x4F91 # +0x98D1 0x5053 0x4F6F # +0x98D2 0x5054 0x4F86 # +0x98D3 0x5055 0x4F96 # +0x98D4 0x5056 0x5118 # +0x98D5 0x5057 0x4FD4 # +0x98D6 0x5058 0x4FDF # +0x98D7 0x5059 0x4FCE # +0x98D8 0x505A 0x4FD8 # +0x98D9 0x505B 0x4FDB # +0x98DA 0x505C 0x4FD1 # +0x98DB 0x505D 0x4FDA # +0x98DC 0x505E 0x4FD0 # +0x98DD 0x505F 0x4FE4 # +0x98DE 0x5060 0x4FE5 # +0x98DF 0x5061 0x501A # +0x98E0 0x5062 0x5028 # +0x98E1 0x5063 0x5014 # +0x98E2 0x5064 0x502A # +0x98E3 0x5065 0x5025 # +0x98E4 0x5066 0x5005 # +0x98E5 0x5067 0x4F1C # +0x98E6 0x5068 0x4FF6 # +0x98E7 0x5069 0x5021 # +0x98E8 0x506A 0x5029 # +0x98E9 0x506B 0x502C # +0x98EA 0x506C 0x4FFE # +0x98EB 0x506D 0x4FEF # +0x98EC 0x506E 0x5011 # +0x98ED 0x506F 0x5006 # +0x98EE 0x5070 0x5043 # +0x98EF 0x5071 0x5047 # +0x98F0 0x5072 0x6703 # +0x98F1 0x5073 0x5055 # +0x98F2 0x5074 0x5050 # +0x98F3 0x5075 0x5048 # +0x98F4 0x5076 0x505A # +0x98F5 0x5077 0x5056 # +0x98F6 0x5078 0x506C # +0x98F7 0x5079 0x5078 # +0x98F8 0x507A 0x5080 # +0x98F9 0x507B 0x509A # +0x98FA 0x507C 0x5085 # +0x98FB 0x507D 0x50B4 # +0x98FC 0x507E 0x50B2 # +0x9940 0x5121 0x50C9 # +0x9941 0x5122 0x50CA # +0x9942 0x5123 0x50B3 # +0x9943 0x5124 0x50C2 # +0x9944 0x5125 0x50D6 # +0x9945 0x5126 0x50DE # +0x9946 0x5127 0x50E5 # +0x9947 0x5128 0x50ED # +0x9948 0x5129 0x50E3 # +0x9949 0x512A 0x50EE # +0x994A 0x512B 0x50F9 # +0x994B 0x512C 0x50F5 # +0x994C 0x512D 0x5109 # +0x994D 0x512E 0x5101 # +0x994E 0x512F 0x5102 # +0x994F 0x5130 0x5116 # +0x9950 0x5131 0x5115 # +0x9951 0x5132 0x5114 # +0x9952 0x5133 0x511A # +0x9953 0x5134 0x5121 # +0x9954 0x5135 0x513A # +0x9955 0x5136 0x5137 # +0x9956 0x5137 0x513C # +0x9957 0x5138 0x513B # +0x9958 0x5139 0x513F # +0x9959 0x513A 0x5140 # +0x995A 0x513B 0x5152 # +0x995B 0x513C 0x514C # +0x995C 0x513D 0x5154 # +0x995D 0x513E 0x5162 # +0x995E 0x513F 0x7AF8 # +0x995F 0x5140 0x5169 # +0x9960 0x5141 0x516A # +0x9961 0x5142 0x516E # +0x9962 0x5143 0x5180 # +0x9963 0x5144 0x5182 # +0x9964 0x5145 0x56D8 # +0x9965 0x5146 0x518C # +0x9966 0x5147 0x5189 # +0x9967 0x5148 0x518F # +0x9968 0x5149 0x5191 # +0x9969 0x514A 0x5193 # +0x996A 0x514B 0x5195 # +0x996B 0x514C 0x5196 # +0x996C 0x514D 0x51A4 # +0x996D 0x514E 0x51A6 # +0x996E 0x514F 0x51A2 # +0x996F 0x5150 0x51A9 # +0x9970 0x5151 0x51AA # +0x9971 0x5152 0x51AB # +0x9972 0x5153 0x51B3 # +0x9973 0x5154 0x51B1 # +0x9974 0x5155 0x51B2 # +0x9975 0x5156 0x51B0 # +0x9976 0x5157 0x51B5 # +0x9977 0x5158 0x51BD # +0x9978 0x5159 0x51C5 # +0x9979 0x515A 0x51C9 # +0x997A 0x515B 0x51DB # +0x997B 0x515C 0x51E0 # +0x997C 0x515D 0x8655 # +0x997D 0x515E 0x51E9 # +0x997E 0x515F 0x51ED # +0x9980 0x5160 0x51F0 # +0x9981 0x5161 0x51F5 # +0x9982 0x5162 0x51FE # +0x9983 0x5163 0x5204 # +0x9984 0x5164 0x520B # +0x9985 0x5165 0x5214 # +0x9986 0x5166 0x520E # +0x9987 0x5167 0x5227 # +0x9988 0x5168 0x522A # +0x9989 0x5169 0x522E # +0x998A 0x516A 0x5233 # +0x998B 0x516B 0x5239 # +0x998C 0x516C 0x524F # +0x998D 0x516D 0x5244 # +0x998E 0x516E 0x524B # +0x998F 0x516F 0x524C # +0x9990 0x5170 0x525E # +0x9991 0x5171 0x5254 # +0x9992 0x5172 0x526A # +0x9993 0x5173 0x5274 # +0x9994 0x5174 0x5269 # +0x9995 0x5175 0x5273 # +0x9996 0x5176 0x527F # +0x9997 0x5177 0x527D # +0x9998 0x5178 0x528D # +0x9999 0x5179 0x5294 # +0x999A 0x517A 0x5292 # +0x999B 0x517B 0x5271 # +0x999C 0x517C 0x5288 # +0x999D 0x517D 0x5291 # +0x999E 0x517E 0x8FA8 # +0x999F 0x5221 0x8FA7 # +0x99A0 0x5222 0x52AC # +0x99A1 0x5223 0x52AD # +0x99A2 0x5224 0x52BC # +0x99A3 0x5225 0x52B5 # +0x99A4 0x5226 0x52C1 # +0x99A5 0x5227 0x52CD # +0x99A6 0x5228 0x52D7 # +0x99A7 0x5229 0x52DE # +0x99A8 0x522A 0x52E3 # +0x99A9 0x522B 0x52E6 # +0x99AA 0x522C 0x98ED # +0x99AB 0x522D 0x52E0 # +0x99AC 0x522E 0x52F3 # +0x99AD 0x522F 0x52F5 # +0x99AE 0x5230 0x52F8 # +0x99AF 0x5231 0x52F9 # +0x99B0 0x5232 0x5306 # +0x99B1 0x5233 0x5308 # +0x99B2 0x5234 0x7538 # +0x99B3 0x5235 0x530D # +0x99B4 0x5236 0x5310 # +0x99B5 0x5237 0x530F # +0x99B6 0x5238 0x5315 # +0x99B7 0x5239 0x531A # +0x99B8 0x523A 0x5323 # +0x99B9 0x523B 0x532F # +0x99BA 0x523C 0x5331 # +0x99BB 0x523D 0x5333 # +0x99BC 0x523E 0x5338 # +0x99BD 0x523F 0x5340 # +0x99BE 0x5240 0x5346 # +0x99BF 0x5241 0x5345 # +0x99C0 0x5242 0x4E17 # +0x99C1 0x5243 0x5349 # +0x99C2 0x5244 0x534D # +0x99C3 0x5245 0x51D6 # +0x99C4 0x5246 0x535E # +0x99C5 0x5247 0x5369 # +0x99C6 0x5248 0x536E # +0x99C7 0x5249 0x5918 # +0x99C8 0x524A 0x537B # +0x99C9 0x524B 0x5377 # +0x99CA 0x524C 0x5382 # +0x99CB 0x524D 0x5396 # +0x99CC 0x524E 0x53A0 # +0x99CD 0x524F 0x53A6 # +0x99CE 0x5250 0x53A5 # +0x99CF 0x5251 0x53AE # +0x99D0 0x5252 0x53B0 # +0x99D1 0x5253 0x53B6 # +0x99D2 0x5254 0x53C3 # +0x99D3 0x5255 0x7C12 # +0x99D4 0x5256 0x96D9 # +0x99D5 0x5257 0x53DF # +0x99D6 0x5258 0x66FC # +0x99D7 0x5259 0x71EE # +0x99D8 0x525A 0x53EE # +0x99D9 0x525B 0x53E8 # +0x99DA 0x525C 0x53ED # +0x99DB 0x525D 0x53FA # +0x99DC 0x525E 0x5401 # +0x99DD 0x525F 0x543D # +0x99DE 0x5260 0x5440 # +0x99DF 0x5261 0x542C # +0x99E0 0x5262 0x542D # +0x99E1 0x5263 0x543C # +0x99E2 0x5264 0x542E # +0x99E3 0x5265 0x5436 # +0x99E4 0x5266 0x5429 # +0x99E5 0x5267 0x541D # +0x99E6 0x5268 0x544E # +0x99E7 0x5269 0x548F # +0x99E8 0x526A 0x5475 # +0x99E9 0x526B 0x548E # +0x99EA 0x526C 0x545F # +0x99EB 0x526D 0x5471 # +0x99EC 0x526E 0x5477 # +0x99ED 0x526F 0x5470 # +0x99EE 0x5270 0x5492 # +0x99EF 0x5271 0x547B # +0x99F0 0x5272 0x5480 # +0x99F1 0x5273 0x5476 # +0x99F2 0x5274 0x5484 # +0x99F3 0x5275 0x5490 # +0x99F4 0x5276 0x5486 # +0x99F5 0x5277 0x54C7 # +0x99F6 0x5278 0x54A2 # +0x99F7 0x5279 0x54B8 # +0x99F8 0x527A 0x54A5 # +0x99F9 0x527B 0x54AC # +0x99FA 0x527C 0x54C4 # +0x99FB 0x527D 0x54C8 # +0x99FC 0x527E 0x54A8 # +0x9A40 0x5321 0x54AB # +0x9A41 0x5322 0x54C2 # +0x9A42 0x5323 0x54A4 # +0x9A43 0x5324 0x54BE # +0x9A44 0x5325 0x54BC # +0x9A45 0x5326 0x54D8 # +0x9A46 0x5327 0x54E5 # +0x9A47 0x5328 0x54E6 # +0x9A48 0x5329 0x550F # +0x9A49 0x532A 0x5514 # +0x9A4A 0x532B 0x54FD # +0x9A4B 0x532C 0x54EE # +0x9A4C 0x532D 0x54ED # +0x9A4D 0x532E 0x54FA # +0x9A4E 0x532F 0x54E2 # +0x9A4F 0x5330 0x5539 # +0x9A50 0x5331 0x5540 # +0x9A51 0x5332 0x5563 # +0x9A52 0x5333 0x554C # +0x9A53 0x5334 0x552E # +0x9A54 0x5335 0x555C # +0x9A55 0x5336 0x5545 # +0x9A56 0x5337 0x5556 # +0x9A57 0x5338 0x5557 # +0x9A58 0x5339 0x5538 # +0x9A59 0x533A 0x5533 # +0x9A5A 0x533B 0x555D # +0x9A5B 0x533C 0x5599 # +0x9A5C 0x533D 0x5580 # +0x9A5D 0x533E 0x54AF # +0x9A5E 0x533F 0x558A # +0x9A5F 0x5340 0x559F # +0x9A60 0x5341 0x557B # +0x9A61 0x5342 0x557E # +0x9A62 0x5343 0x5598 # +0x9A63 0x5344 0x559E # +0x9A64 0x5345 0x55AE # +0x9A65 0x5346 0x557C # +0x9A66 0x5347 0x5583 # +0x9A67 0x5348 0x55A9 # +0x9A68 0x5349 0x5587 # +0x9A69 0x534A 0x55A8 # +0x9A6A 0x534B 0x55DA # +0x9A6B 0x534C 0x55C5 # +0x9A6C 0x534D 0x55DF # +0x9A6D 0x534E 0x55C4 # +0x9A6E 0x534F 0x55DC # +0x9A6F 0x5350 0x55E4 # +0x9A70 0x5351 0x55D4 # +0x9A71 0x5352 0x5614 # +0x9A72 0x5353 0x55F7 # +0x9A73 0x5354 0x5616 # +0x9A74 0x5355 0x55FE # +0x9A75 0x5356 0x55FD # +0x9A76 0x5357 0x561B # +0x9A77 0x5358 0x55F9 # +0x9A78 0x5359 0x564E # +0x9A79 0x535A 0x5650 # +0x9A7A 0x535B 0x71DF # +0x9A7B 0x535C 0x5634 # +0x9A7C 0x535D 0x5636 # +0x9A7D 0x535E 0x5632 # +0x9A7E 0x535F 0x5638 # +0x9A80 0x5360 0x566B # +0x9A81 0x5361 0x5664 # +0x9A82 0x5362 0x562F # +0x9A83 0x5363 0x566C # +0x9A84 0x5364 0x566A # +0x9A85 0x5365 0x5686 # +0x9A86 0x5366 0x5680 # +0x9A87 0x5367 0x568A # +0x9A88 0x5368 0x56A0 # +0x9A89 0x5369 0x5694 # +0x9A8A 0x536A 0x568F # +0x9A8B 0x536B 0x56A5 # +0x9A8C 0x536C 0x56AE # +0x9A8D 0x536D 0x56B6 # +0x9A8E 0x536E 0x56B4 # +0x9A8F 0x536F 0x56C2 # +0x9A90 0x5370 0x56BC # +0x9A91 0x5371 0x56C1 # +0x9A92 0x5372 0x56C3 # +0x9A93 0x5373 0x56C0 # +0x9A94 0x5374 0x56C8 # +0x9A95 0x5375 0x56CE # +0x9A96 0x5376 0x56D1 # +0x9A97 0x5377 0x56D3 # +0x9A98 0x5378 0x56D7 # +0x9A99 0x5379 0x56EE # +0x9A9A 0x537A 0x56F9 # +0x9A9B 0x537B 0x5700 # +0x9A9C 0x537C 0x56FF # +0x9A9D 0x537D 0x5704 # +0x9A9E 0x537E 0x5709 # +0x9A9F 0x5421 0x5708 # +0x9AA0 0x5422 0x570B # +0x9AA1 0x5423 0x570D # +0x9AA2 0x5424 0x5713 # +0x9AA3 0x5425 0x5718 # +0x9AA4 0x5426 0x5716 # +0x9AA5 0x5427 0x55C7 # +0x9AA6 0x5428 0x571C # +0x9AA7 0x5429 0x5726 # +0x9AA8 0x542A 0x5737 # +0x9AA9 0x542B 0x5738 # +0x9AAA 0x542C 0x574E # +0x9AAB 0x542D 0x573B # +0x9AAC 0x542E 0x5740 # +0x9AAD 0x542F 0x574F # +0x9AAE 0x5430 0x5769 # +0x9AAF 0x5431 0x57C0 # +0x9AB0 0x5432 0x5788 # +0x9AB1 0x5433 0x5761 # +0x9AB2 0x5434 0x577F # +0x9AB3 0x5435 0x5789 # +0x9AB4 0x5436 0x5793 # +0x9AB5 0x5437 0x57A0 # +0x9AB6 0x5438 0x57B3 # +0x9AB7 0x5439 0x57A4 # +0x9AB8 0x543A 0x57AA # +0x9AB9 0x543B 0x57B0 # +0x9ABA 0x543C 0x57C3 # +0x9ABB 0x543D 0x57C6 # +0x9ABC 0x543E 0x57D4 # +0x9ABD 0x543F 0x57D2 # +0x9ABE 0x5440 0x57D3 # +0x9ABF 0x5441 0x580A # +0x9AC0 0x5442 0x57D6 # +0x9AC1 0x5443 0x57E3 # +0x9AC2 0x5444 0x580B # +0x9AC3 0x5445 0x5819 # +0x9AC4 0x5446 0x581D # +0x9AC5 0x5447 0x5872 # +0x9AC6 0x5448 0x5821 # +0x9AC7 0x5449 0x5862 # +0x9AC8 0x544A 0x584B # +0x9AC9 0x544B 0x5870 # +0x9ACA 0x544C 0x6BC0 # +0x9ACB 0x544D 0x5852 # +0x9ACC 0x544E 0x583D # +0x9ACD 0x544F 0x5879 # +0x9ACE 0x5450 0x5885 # +0x9ACF 0x5451 0x58B9 # +0x9AD0 0x5452 0x589F # +0x9AD1 0x5453 0x58AB # +0x9AD2 0x5454 0x58BA # +0x9AD3 0x5455 0x58DE # +0x9AD4 0x5456 0x58BB # +0x9AD5 0x5457 0x58B8 # +0x9AD6 0x5458 0x58AE # +0x9AD7 0x5459 0x58C5 # +0x9AD8 0x545A 0x58D3 # +0x9AD9 0x545B 0x58D1 # +0x9ADA 0x545C 0x58D7 # +0x9ADB 0x545D 0x58D9 # +0x9ADC 0x545E 0x58D8 # +0x9ADD 0x545F 0x58E5 # +0x9ADE 0x5460 0x58DC # +0x9ADF 0x5461 0x58E4 # +0x9AE0 0x5462 0x58DF # +0x9AE1 0x5463 0x58EF # +0x9AE2 0x5464 0x58FA # +0x9AE3 0x5465 0x58F9 # +0x9AE4 0x5466 0x58FB # +0x9AE5 0x5467 0x58FC # +0x9AE6 0x5468 0x58FD # +0x9AE7 0x5469 0x5902 # +0x9AE8 0x546A 0x590A # +0x9AE9 0x546B 0x5910 # +0x9AEA 0x546C 0x591B # +0x9AEB 0x546D 0x68A6 # +0x9AEC 0x546E 0x5925 # +0x9AED 0x546F 0x592C # +0x9AEE 0x5470 0x592D # +0x9AEF 0x5471 0x5932 # +0x9AF0 0x5472 0x5938 # +0x9AF1 0x5473 0x593E # +0x9AF2 0x5474 0x7AD2 # +0x9AF3 0x5475 0x5955 # +0x9AF4 0x5476 0x5950 # +0x9AF5 0x5477 0x594E # +0x9AF6 0x5478 0x595A # +0x9AF7 0x5479 0x5958 # +0x9AF8 0x547A 0x5962 # +0x9AF9 0x547B 0x5960 # +0x9AFA 0x547C 0x5967 # +0x9AFB 0x547D 0x596C # +0x9AFC 0x547E 0x5969 # +0x9B40 0x5521 0x5978 # +0x9B41 0x5522 0x5981 # +0x9B42 0x5523 0x599D # +0x9B43 0x5524 0x4F5E # +0x9B44 0x5525 0x4FAB # +0x9B45 0x5526 0x59A3 # +0x9B46 0x5527 0x59B2 # +0x9B47 0x5528 0x59C6 # +0x9B48 0x5529 0x59E8 # +0x9B49 0x552A 0x59DC # +0x9B4A 0x552B 0x598D # +0x9B4B 0x552C 0x59D9 # +0x9B4C 0x552D 0x59DA # +0x9B4D 0x552E 0x5A25 # +0x9B4E 0x552F 0x5A1F # +0x9B4F 0x5530 0x5A11 # +0x9B50 0x5531 0x5A1C # +0x9B51 0x5532 0x5A09 # +0x9B52 0x5533 0x5A1A # +0x9B53 0x5534 0x5A40 # +0x9B54 0x5535 0x5A6C # +0x9B55 0x5536 0x5A49 # +0x9B56 0x5537 0x5A35 # +0x9B57 0x5538 0x5A36 # +0x9B58 0x5539 0x5A62 # +0x9B59 0x553A 0x5A6A # +0x9B5A 0x553B 0x5A9A # +0x9B5B 0x553C 0x5ABC # +0x9B5C 0x553D 0x5ABE # +0x9B5D 0x553E 0x5ACB # +0x9B5E 0x553F 0x5AC2 # +0x9B5F 0x5540 0x5ABD # +0x9B60 0x5541 0x5AE3 # +0x9B61 0x5542 0x5AD7 # +0x9B62 0x5543 0x5AE6 # +0x9B63 0x5544 0x5AE9 # +0x9B64 0x5545 0x5AD6 # +0x9B65 0x5546 0x5AFA # +0x9B66 0x5547 0x5AFB # +0x9B67 0x5548 0x5B0C # +0x9B68 0x5549 0x5B0B # +0x9B69 0x554A 0x5B16 # +0x9B6A 0x554B 0x5B32 # +0x9B6B 0x554C 0x5AD0 # +0x9B6C 0x554D 0x5B2A # +0x9B6D 0x554E 0x5B36 # +0x9B6E 0x554F 0x5B3E # +0x9B6F 0x5550 0x5B43 # +0x9B70 0x5551 0x5B45 # +0x9B71 0x5552 0x5B40 # +0x9B72 0x5553 0x5B51 # +0x9B73 0x5554 0x5B55 # +0x9B74 0x5555 0x5B5A # +0x9B75 0x5556 0x5B5B # +0x9B76 0x5557 0x5B65 # +0x9B77 0x5558 0x5B69 # +0x9B78 0x5559 0x5B70 # +0x9B79 0x555A 0x5B73 # +0x9B7A 0x555B 0x5B75 # +0x9B7B 0x555C 0x5B78 # +0x9B7C 0x555D 0x6588 # +0x9B7D 0x555E 0x5B7A # +0x9B7E 0x555F 0x5B80 # +0x9B80 0x5560 0x5B83 # +0x9B81 0x5561 0x5BA6 # +0x9B82 0x5562 0x5BB8 # +0x9B83 0x5563 0x5BC3 # +0x9B84 0x5564 0x5BC7 # +0x9B85 0x5565 0x5BC9 # +0x9B86 0x5566 0x5BD4 # +0x9B87 0x5567 0x5BD0 # +0x9B88 0x5568 0x5BE4 # +0x9B89 0x5569 0x5BE6 # +0x9B8A 0x556A 0x5BE2 # +0x9B8B 0x556B 0x5BDE # +0x9B8C 0x556C 0x5BE5 # +0x9B8D 0x556D 0x5BEB # +0x9B8E 0x556E 0x5BF0 # +0x9B8F 0x556F 0x5BF6 # +0x9B90 0x5570 0x5BF3 # +0x9B91 0x5571 0x5C05 # +0x9B92 0x5572 0x5C07 # +0x9B93 0x5573 0x5C08 # +0x9B94 0x5574 0x5C0D # +0x9B95 0x5575 0x5C13 # +0x9B96 0x5576 0x5C20 # +0x9B97 0x5577 0x5C22 # +0x9B98 0x5578 0x5C28 # +0x9B99 0x5579 0x5C38 # +0x9B9A 0x557A 0x5C39 # +0x9B9B 0x557B 0x5C41 # +0x9B9C 0x557C 0x5C46 # +0x9B9D 0x557D 0x5C4E # +0x9B9E 0x557E 0x5C53 # +0x9B9F 0x5621 0x5C50 # +0x9BA0 0x5622 0x5C4F # +0x9BA1 0x5623 0x5B71 # +0x9BA2 0x5624 0x5C6C # +0x9BA3 0x5625 0x5C6E # +0x9BA4 0x5626 0x4E62 # +0x9BA5 0x5627 0x5C76 # +0x9BA6 0x5628 0x5C79 # +0x9BA7 0x5629 0x5C8C # +0x9BA8 0x562A 0x5C91 # +0x9BA9 0x562B 0x5C94 # +0x9BAA 0x562C 0x599B # +0x9BAB 0x562D 0x5CAB # +0x9BAC 0x562E 0x5CBB # +0x9BAD 0x562F 0x5CB6 # +0x9BAE 0x5630 0x5CBC # +0x9BAF 0x5631 0x5CB7 # +0x9BB0 0x5632 0x5CC5 # +0x9BB1 0x5633 0x5CBE # +0x9BB2 0x5634 0x5CC7 # +0x9BB3 0x5635 0x5CD9 # +0x9BB4 0x5636 0x5CE9 # +0x9BB5 0x5637 0x5CFD # +0x9BB6 0x5638 0x5CFA # +0x9BB7 0x5639 0x5CED # +0x9BB8 0x563A 0x5D8C # +0x9BB9 0x563B 0x5CEA # +0x9BBA 0x563C 0x5D0B # +0x9BBB 0x563D 0x5D15 # +0x9BBC 0x563E 0x5D17 # +0x9BBD 0x563F 0x5D5C # +0x9BBE 0x5640 0x5D1F # +0x9BBF 0x5641 0x5D1B # +0x9BC0 0x5642 0x5D11 # +0x9BC1 0x5643 0x5D14 # +0x9BC2 0x5644 0x5D22 # +0x9BC3 0x5645 0x5D1A # +0x9BC4 0x5646 0x5D19 # +0x9BC5 0x5647 0x5D18 # +0x9BC6 0x5648 0x5D4C # +0x9BC7 0x5649 0x5D52 # +0x9BC8 0x564A 0x5D4E # +0x9BC9 0x564B 0x5D4B # +0x9BCA 0x564C 0x5D6C # +0x9BCB 0x564D 0x5D73 # +0x9BCC 0x564E 0x5D76 # +0x9BCD 0x564F 0x5D87 # +0x9BCE 0x5650 0x5D84 # +0x9BCF 0x5651 0x5D82 # +0x9BD0 0x5652 0x5DA2 # +0x9BD1 0x5653 0x5D9D # +0x9BD2 0x5654 0x5DAC # +0x9BD3 0x5655 0x5DAE # +0x9BD4 0x5656 0x5DBD # +0x9BD5 0x5657 0x5D90 # +0x9BD6 0x5658 0x5DB7 # +0x9BD7 0x5659 0x5DBC # +0x9BD8 0x565A 0x5DC9 # +0x9BD9 0x565B 0x5DCD # +0x9BDA 0x565C 0x5DD3 # +0x9BDB 0x565D 0x5DD2 # +0x9BDC 0x565E 0x5DD6 # +0x9BDD 0x565F 0x5DDB # +0x9BDE 0x5660 0x5DEB # +0x9BDF 0x5661 0x5DF2 # +0x9BE0 0x5662 0x5DF5 # +0x9BE1 0x5663 0x5E0B # +0x9BE2 0x5664 0x5E1A # +0x9BE3 0x5665 0x5E19 # +0x9BE4 0x5666 0x5E11 # +0x9BE5 0x5667 0x5E1B # +0x9BE6 0x5668 0x5E36 # +0x9BE7 0x5669 0x5E37 # +0x9BE8 0x566A 0x5E44 # +0x9BE9 0x566B 0x5E43 # +0x9BEA 0x566C 0x5E40 # +0x9BEB 0x566D 0x5E4E # +0x9BEC 0x566E 0x5E57 # +0x9BED 0x566F 0x5E54 # +0x9BEE 0x5670 0x5E5F # +0x9BEF 0x5671 0x5E62 # +0x9BF0 0x5672 0x5E64 # +0x9BF1 0x5673 0x5E47 # +0x9BF2 0x5674 0x5E75 # +0x9BF3 0x5675 0x5E76 # +0x9BF4 0x5676 0x5E7A # +0x9BF5 0x5677 0x9EBC # +0x9BF6 0x5678 0x5E7F # +0x9BF7 0x5679 0x5EA0 # +0x9BF8 0x567A 0x5EC1 # +0x9BF9 0x567B 0x5EC2 # +0x9BFA 0x567C 0x5EC8 # +0x9BFB 0x567D 0x5ED0 # +0x9BFC 0x567E 0x5ECF # +0x9C40 0x5721 0x5ED6 # +0x9C41 0x5722 0x5EE3 # +0x9C42 0x5723 0x5EDD # +0x9C43 0x5724 0x5EDA # +0x9C44 0x5725 0x5EDB # +0x9C45 0x5726 0x5EE2 # +0x9C46 0x5727 0x5EE1 # +0x9C47 0x5728 0x5EE8 # +0x9C48 0x5729 0x5EE9 # +0x9C49 0x572A 0x5EEC # +0x9C4A 0x572B 0x5EF1 # +0x9C4B 0x572C 0x5EF3 # +0x9C4C 0x572D 0x5EF0 # +0x9C4D 0x572E 0x5EF4 # +0x9C4E 0x572F 0x5EF8 # +0x9C4F 0x5730 0x5EFE # +0x9C50 0x5731 0x5F03 # +0x9C51 0x5732 0x5F09 # +0x9C52 0x5733 0x5F5D # +0x9C53 0x5734 0x5F5C # +0x9C54 0x5735 0x5F0B # +0x9C55 0x5736 0x5F11 # +0x9C56 0x5737 0x5F16 # +0x9C57 0x5738 0x5F29 # +0x9C58 0x5739 0x5F2D # +0x9C59 0x573A 0x5F38 # +0x9C5A 0x573B 0x5F41 # +0x9C5B 0x573C 0x5F48 # +0x9C5C 0x573D 0x5F4C # +0x9C5D 0x573E 0x5F4E # +0x9C5E 0x573F 0x5F2F # +0x9C5F 0x5740 0x5F51 # +0x9C60 0x5741 0x5F56 # +0x9C61 0x5742 0x5F57 # +0x9C62 0x5743 0x5F59 # +0x9C63 0x5744 0x5F61 # +0x9C64 0x5745 0x5F6D # +0x9C65 0x5746 0x5F73 # +0x9C66 0x5747 0x5F77 # +0x9C67 0x5748 0x5F83 # +0x9C68 0x5749 0x5F82 # +0x9C69 0x574A 0x5F7F # +0x9C6A 0x574B 0x5F8A # +0x9C6B 0x574C 0x5F88 # +0x9C6C 0x574D 0x5F91 # +0x9C6D 0x574E 0x5F87 # +0x9C6E 0x574F 0x5F9E # +0x9C6F 0x5750 0x5F99 # +0x9C70 0x5751 0x5F98 # +0x9C71 0x5752 0x5FA0 # +0x9C72 0x5753 0x5FA8 # +0x9C73 0x5754 0x5FAD # +0x9C74 0x5755 0x5FBC # +0x9C75 0x5756 0x5FD6 # +0x9C76 0x5757 0x5FFB # +0x9C77 0x5758 0x5FE4 # +0x9C78 0x5759 0x5FF8 # +0x9C79 0x575A 0x5FF1 # +0x9C7A 0x575B 0x5FDD # +0x9C7B 0x575C 0x60B3 # +0x9C7C 0x575D 0x5FFF # +0x9C7D 0x575E 0x6021 # +0x9C7E 0x575F 0x6060 # +0x9C80 0x5760 0x6019 # +0x9C81 0x5761 0x6010 # +0x9C82 0x5762 0x6029 # +0x9C83 0x5763 0x600E # +0x9C84 0x5764 0x6031 # +0x9C85 0x5765 0x601B # +0x9C86 0x5766 0x6015 # +0x9C87 0x5767 0x602B # +0x9C88 0x5768 0x6026 # +0x9C89 0x5769 0x600F # +0x9C8A 0x576A 0x603A # +0x9C8B 0x576B 0x605A # +0x9C8C 0x576C 0x6041 # +0x9C8D 0x576D 0x606A # +0x9C8E 0x576E 0x6077 # +0x9C8F 0x576F 0x605F # +0x9C90 0x5770 0x604A # +0x9C91 0x5771 0x6046 # +0x9C92 0x5772 0x604D # +0x9C93 0x5773 0x6063 # +0x9C94 0x5774 0x6043 # +0x9C95 0x5775 0x6064 # +0x9C96 0x5776 0x6042 # +0x9C97 0x5777 0x606C # +0x9C98 0x5778 0x606B # +0x9C99 0x5779 0x6059 # +0x9C9A 0x577A 0x6081 # +0x9C9B 0x577B 0x608D # +0x9C9C 0x577C 0x60E7 # +0x9C9D 0x577D 0x6083 # +0x9C9E 0x577E 0x609A # +0x9C9F 0x5821 0x6084 # +0x9CA0 0x5822 0x609B # +0x9CA1 0x5823 0x6096 # +0x9CA2 0x5824 0x6097 # +0x9CA3 0x5825 0x6092 # +0x9CA4 0x5826 0x60A7 # +0x9CA5 0x5827 0x608B # +0x9CA6 0x5828 0x60E1 # +0x9CA7 0x5829 0x60B8 # +0x9CA8 0x582A 0x60E0 # +0x9CA9 0x582B 0x60D3 # +0x9CAA 0x582C 0x60B4 # +0x9CAB 0x582D 0x5FF0 # +0x9CAC 0x582E 0x60BD # +0x9CAD 0x582F 0x60C6 # +0x9CAE 0x5830 0x60B5 # +0x9CAF 0x5831 0x60D8 # +0x9CB0 0x5832 0x614D # +0x9CB1 0x5833 0x6115 # +0x9CB2 0x5834 0x6106 # +0x9CB3 0x5835 0x60F6 # +0x9CB4 0x5836 0x60F7 # +0x9CB5 0x5837 0x6100 # +0x9CB6 0x5838 0x60F4 # +0x9CB7 0x5839 0x60FA # +0x9CB8 0x583A 0x6103 # +0x9CB9 0x583B 0x6121 # +0x9CBA 0x583C 0x60FB # +0x9CBB 0x583D 0x60F1 # +0x9CBC 0x583E 0x610D # +0x9CBD 0x583F 0x610E # +0x9CBE 0x5840 0x6147 # +0x9CBF 0x5841 0x613E # +0x9CC0 0x5842 0x6128 # +0x9CC1 0x5843 0x6127 # +0x9CC2 0x5844 0x614A # +0x9CC3 0x5845 0x613F # +0x9CC4 0x5846 0x613C # +0x9CC5 0x5847 0x612C # +0x9CC6 0x5848 0x6134 # +0x9CC7 0x5849 0x613D # +0x9CC8 0x584A 0x6142 # +0x9CC9 0x584B 0x6144 # +0x9CCA 0x584C 0x6173 # +0x9CCB 0x584D 0x6177 # +0x9CCC 0x584E 0x6158 # +0x9CCD 0x584F 0x6159 # +0x9CCE 0x5850 0x615A # +0x9CCF 0x5851 0x616B # +0x9CD0 0x5852 0x6174 # +0x9CD1 0x5853 0x616F # +0x9CD2 0x5854 0x6165 # +0x9CD3 0x5855 0x6171 # +0x9CD4 0x5856 0x615F # +0x9CD5 0x5857 0x615D # +0x9CD6 0x5858 0x6153 # +0x9CD7 0x5859 0x6175 # +0x9CD8 0x585A 0x6199 # +0x9CD9 0x585B 0x6196 # +0x9CDA 0x585C 0x6187 # +0x9CDB 0x585D 0x61AC # +0x9CDC 0x585E 0x6194 # +0x9CDD 0x585F 0x619A # +0x9CDE 0x5860 0x618A # +0x9CDF 0x5861 0x6191 # +0x9CE0 0x5862 0x61AB # +0x9CE1 0x5863 0x61AE # +0x9CE2 0x5864 0x61CC # +0x9CE3 0x5865 0x61CA # +0x9CE4 0x5866 0x61C9 # +0x9CE5 0x5867 0x61F7 # +0x9CE6 0x5868 0x61C8 # +0x9CE7 0x5869 0x61C3 # +0x9CE8 0x586A 0x61C6 # +0x9CE9 0x586B 0x61BA # +0x9CEA 0x586C 0x61CB # +0x9CEB 0x586D 0x7F79 # +0x9CEC 0x586E 0x61CD # +0x9CED 0x586F 0x61E6 # +0x9CEE 0x5870 0x61E3 # +0x9CEF 0x5871 0x61F6 # +0x9CF0 0x5872 0x61FA # +0x9CF1 0x5873 0x61F4 # +0x9CF2 0x5874 0x61FF # +0x9CF3 0x5875 0x61FD # +0x9CF4 0x5876 0x61FC # +0x9CF5 0x5877 0x61FE # +0x9CF6 0x5878 0x6200 # +0x9CF7 0x5879 0x6208 # +0x9CF8 0x587A 0x6209 # +0x9CF9 0x587B 0x620D # +0x9CFA 0x587C 0x620C # +0x9CFB 0x587D 0x6214 # +0x9CFC 0x587E 0x621B # +0x9D40 0x5921 0x621E # +0x9D41 0x5922 0x6221 # +0x9D42 0x5923 0x622A # +0x9D43 0x5924 0x622E # +0x9D44 0x5925 0x6230 # +0x9D45 0x5926 0x6232 # +0x9D46 0x5927 0x6233 # +0x9D47 0x5928 0x6241 # +0x9D48 0x5929 0x624E # +0x9D49 0x592A 0x625E # +0x9D4A 0x592B 0x6263 # +0x9D4B 0x592C 0x625B # +0x9D4C 0x592D 0x6260 # +0x9D4D 0x592E 0x6268 # +0x9D4E 0x592F 0x627C # +0x9D4F 0x5930 0x6282 # +0x9D50 0x5931 0x6289 # +0x9D51 0x5932 0x627E # +0x9D52 0x5933 0x6292 # +0x9D53 0x5934 0x6293 # +0x9D54 0x5935 0x6296 # +0x9D55 0x5936 0x62D4 # +0x9D56 0x5937 0x6283 # +0x9D57 0x5938 0x6294 # +0x9D58 0x5939 0x62D7 # +0x9D59 0x593A 0x62D1 # +0x9D5A 0x593B 0x62BB # +0x9D5B 0x593C 0x62CF # +0x9D5C 0x593D 0x62FF # +0x9D5D 0x593E 0x62C6 # +0x9D5E 0x593F 0x64D4 # +0x9D5F 0x5940 0x62C8 # +0x9D60 0x5941 0x62DC # +0x9D61 0x5942 0x62CC # +0x9D62 0x5943 0x62CA # +0x9D63 0x5944 0x62C2 # +0x9D64 0x5945 0x62C7 # +0x9D65 0x5946 0x629B # +0x9D66 0x5947 0x62C9 # +0x9D67 0x5948 0x630C # +0x9D68 0x5949 0x62EE # +0x9D69 0x594A 0x62F1 # +0x9D6A 0x594B 0x6327 # +0x9D6B 0x594C 0x6302 # +0x9D6C 0x594D 0x6308 # +0x9D6D 0x594E 0x62EF # +0x9D6E 0x594F 0x62F5 # +0x9D6F 0x5950 0x6350 # +0x9D70 0x5951 0x633E # +0x9D71 0x5952 0x634D # +0x9D72 0x5953 0x641C # +0x9D73 0x5954 0x634F # +0x9D74 0x5955 0x6396 # +0x9D75 0x5956 0x638E # +0x9D76 0x5957 0x6380 # +0x9D77 0x5958 0x63AB # +0x9D78 0x5959 0x6376 # +0x9D79 0x595A 0x63A3 # +0x9D7A 0x595B 0x638F # +0x9D7B 0x595C 0x6389 # +0x9D7C 0x595D 0x639F # +0x9D7D 0x595E 0x63B5 # +0x9D7E 0x595F 0x636B # +0x9D80 0x5960 0x6369 # +0x9D81 0x5961 0x63BE # +0x9D82 0x5962 0x63E9 # +0x9D83 0x5963 0x63C0 # +0x9D84 0x5964 0x63C6 # +0x9D85 0x5965 0x63E3 # +0x9D86 0x5966 0x63C9 # +0x9D87 0x5967 0x63D2 # +0x9D88 0x5968 0x63F6 # +0x9D89 0x5969 0x63C4 # +0x9D8A 0x596A 0x6416 # +0x9D8B 0x596B 0x6434 # +0x9D8C 0x596C 0x6406 # +0x9D8D 0x596D 0x6413 # +0x9D8E 0x596E 0x6426 # +0x9D8F 0x596F 0x6436 # +0x9D90 0x5970 0x651D # +0x9D91 0x5971 0x6417 # +0x9D92 0x5972 0x6428 # +0x9D93 0x5973 0x640F # +0x9D94 0x5974 0x6467 # +0x9D95 0x5975 0x646F # +0x9D96 0x5976 0x6476 # +0x9D97 0x5977 0x644E # +0x9D98 0x5978 0x652A # +0x9D99 0x5979 0x6495 # +0x9D9A 0x597A 0x6493 # +0x9D9B 0x597B 0x64A5 # +0x9D9C 0x597C 0x64A9 # +0x9D9D 0x597D 0x6488 # +0x9D9E 0x597E 0x64BC # +0x9D9F 0x5A21 0x64DA # +0x9DA0 0x5A22 0x64D2 # +0x9DA1 0x5A23 0x64C5 # +0x9DA2 0x5A24 0x64C7 # +0x9DA3 0x5A25 0x64BB # +0x9DA4 0x5A26 0x64D8 # +0x9DA5 0x5A27 0x64C2 # +0x9DA6 0x5A28 0x64F1 # +0x9DA7 0x5A29 0x64E7 # +0x9DA8 0x5A2A 0x8209 # +0x9DA9 0x5A2B 0x64E0 # +0x9DAA 0x5A2C 0x64E1 # +0x9DAB 0x5A2D 0x62AC # +0x9DAC 0x5A2E 0x64E3 # +0x9DAD 0x5A2F 0x64EF # +0x9DAE 0x5A30 0x652C # +0x9DAF 0x5A31 0x64F6 # +0x9DB0 0x5A32 0x64F4 # +0x9DB1 0x5A33 0x64F2 # +0x9DB2 0x5A34 0x64FA # +0x9DB3 0x5A35 0x6500 # +0x9DB4 0x5A36 0x64FD # +0x9DB5 0x5A37 0x6518 # +0x9DB6 0x5A38 0x651C # +0x9DB7 0x5A39 0x6505 # +0x9DB8 0x5A3A 0x6524 # +0x9DB9 0x5A3B 0x6523 # +0x9DBA 0x5A3C 0x652B # +0x9DBB 0x5A3D 0x6534 # +0x9DBC 0x5A3E 0x6535 # +0x9DBD 0x5A3F 0x6537 # +0x9DBE 0x5A40 0x6536 # +0x9DBF 0x5A41 0x6538 # +0x9DC0 0x5A42 0x754B # +0x9DC1 0x5A43 0x6548 # +0x9DC2 0x5A44 0x6556 # +0x9DC3 0x5A45 0x6555 # +0x9DC4 0x5A46 0x654D # +0x9DC5 0x5A47 0x6558 # +0x9DC6 0x5A48 0x655E # +0x9DC7 0x5A49 0x655D # +0x9DC8 0x5A4A 0x6572 # +0x9DC9 0x5A4B 0x6578 # +0x9DCA 0x5A4C 0x6582 # +0x9DCB 0x5A4D 0x6583 # +0x9DCC 0x5A4E 0x8B8A # +0x9DCD 0x5A4F 0x659B # +0x9DCE 0x5A50 0x659F # +0x9DCF 0x5A51 0x65AB # +0x9DD0 0x5A52 0x65B7 # +0x9DD1 0x5A53 0x65C3 # +0x9DD2 0x5A54 0x65C6 # +0x9DD3 0x5A55 0x65C1 # +0x9DD4 0x5A56 0x65C4 # +0x9DD5 0x5A57 0x65CC # +0x9DD6 0x5A58 0x65D2 # +0x9DD7 0x5A59 0x65DB # +0x9DD8 0x5A5A 0x65D9 # +0x9DD9 0x5A5B 0x65E0 # +0x9DDA 0x5A5C 0x65E1 # +0x9DDB 0x5A5D 0x65F1 # +0x9DDC 0x5A5E 0x6772 # +0x9DDD 0x5A5F 0x660A # +0x9DDE 0x5A60 0x6603 # +0x9DDF 0x5A61 0x65FB # +0x9DE0 0x5A62 0x6773 # +0x9DE1 0x5A63 0x6635 # +0x9DE2 0x5A64 0x6636 # +0x9DE3 0x5A65 0x6634 # +0x9DE4 0x5A66 0x661C # +0x9DE5 0x5A67 0x664F # +0x9DE6 0x5A68 0x6644 # +0x9DE7 0x5A69 0x6649 # +0x9DE8 0x5A6A 0x6641 # +0x9DE9 0x5A6B 0x665E # +0x9DEA 0x5A6C 0x665D # +0x9DEB 0x5A6D 0x6664 # +0x9DEC 0x5A6E 0x6667 # +0x9DED 0x5A6F 0x6668 # +0x9DEE 0x5A70 0x665F # +0x9DEF 0x5A71 0x6662 # +0x9DF0 0x5A72 0x6670 # +0x9DF1 0x5A73 0x6683 # +0x9DF2 0x5A74 0x6688 # +0x9DF3 0x5A75 0x668E # +0x9DF4 0x5A76 0x6689 # +0x9DF5 0x5A77 0x6684 # +0x9DF6 0x5A78 0x6698 # +0x9DF7 0x5A79 0x669D # +0x9DF8 0x5A7A 0x66C1 # +0x9DF9 0x5A7B 0x66B9 # +0x9DFA 0x5A7C 0x66C9 # +0x9DFB 0x5A7D 0x66BE # +0x9DFC 0x5A7E 0x66BC # +0x9E40 0x5B21 0x66C4 # +0x9E41 0x5B22 0x66B8 # +0x9E42 0x5B23 0x66D6 # +0x9E43 0x5B24 0x66DA # +0x9E44 0x5B25 0x66E0 # +0x9E45 0x5B26 0x663F # +0x9E46 0x5B27 0x66E6 # +0x9E47 0x5B28 0x66E9 # +0x9E48 0x5B29 0x66F0 # +0x9E49 0x5B2A 0x66F5 # +0x9E4A 0x5B2B 0x66F7 # +0x9E4B 0x5B2C 0x670F # +0x9E4C 0x5B2D 0x6716 # +0x9E4D 0x5B2E 0x671E # +0x9E4E 0x5B2F 0x6726 # +0x9E4F 0x5B30 0x6727 # +0x9E50 0x5B31 0x9738 # +0x9E51 0x5B32 0x672E # +0x9E52 0x5B33 0x673F # +0x9E53 0x5B34 0x6736 # +0x9E54 0x5B35 0x6741 # +0x9E55 0x5B36 0x6738 # +0x9E56 0x5B37 0x6737 # +0x9E57 0x5B38 0x6746 # +0x9E58 0x5B39 0x675E # +0x9E59 0x5B3A 0x6760 # +0x9E5A 0x5B3B 0x6759 # +0x9E5B 0x5B3C 0x6763 # +0x9E5C 0x5B3D 0x6764 # +0x9E5D 0x5B3E 0x6789 # +0x9E5E 0x5B3F 0x6770 # +0x9E5F 0x5B40 0x67A9 # +0x9E60 0x5B41 0x677C # +0x9E61 0x5B42 0x676A # +0x9E62 0x5B43 0x678C # +0x9E63 0x5B44 0x678B # +0x9E64 0x5B45 0x67A6 # +0x9E65 0x5B46 0x67A1 # +0x9E66 0x5B47 0x6785 # +0x9E67 0x5B48 0x67B7 # +0x9E68 0x5B49 0x67EF # +0x9E69 0x5B4A 0x67B4 # +0x9E6A 0x5B4B 0x67EC # +0x9E6B 0x5B4C 0x67B3 # +0x9E6C 0x5B4D 0x67E9 # +0x9E6D 0x5B4E 0x67B8 # +0x9E6E 0x5B4F 0x67E4 # +0x9E6F 0x5B50 0x67DE # +0x9E70 0x5B51 0x67DD # +0x9E71 0x5B52 0x67E2 # +0x9E72 0x5B53 0x67EE # +0x9E73 0x5B54 0x67B9 # +0x9E74 0x5B55 0x67CE # +0x9E75 0x5B56 0x67C6 # +0x9E76 0x5B57 0x67E7 # +0x9E77 0x5B58 0x6A9C # +0x9E78 0x5B59 0x681E # +0x9E79 0x5B5A 0x6846 # +0x9E7A 0x5B5B 0x6829 # +0x9E7B 0x5B5C 0x6840 # +0x9E7C 0x5B5D 0x684D # +0x9E7D 0x5B5E 0x6832 # +0x9E7E 0x5B5F 0x684E # +0x9E80 0x5B60 0x68B3 # +0x9E81 0x5B61 0x682B # +0x9E82 0x5B62 0x6859 # +0x9E83 0x5B63 0x6863 # +0x9E84 0x5B64 0x6877 # +0x9E85 0x5B65 0x687F # +0x9E86 0x5B66 0x689F # +0x9E87 0x5B67 0x688F # +0x9E88 0x5B68 0x68AD # +0x9E89 0x5B69 0x6894 # +0x9E8A 0x5B6A 0x689D # +0x9E8B 0x5B6B 0x689B # +0x9E8C 0x5B6C 0x6883 # +0x9E8D 0x5B6D 0x6AAE # +0x9E8E 0x5B6E 0x68B9 # +0x9E8F 0x5B6F 0x6874 # +0x9E90 0x5B70 0x68B5 # +0x9E91 0x5B71 0x68A0 # +0x9E92 0x5B72 0x68BA # +0x9E93 0x5B73 0x690F # +0x9E94 0x5B74 0x688D # +0x9E95 0x5B75 0x687E # +0x9E96 0x5B76 0x6901 # +0x9E97 0x5B77 0x68CA # +0x9E98 0x5B78 0x6908 # +0x9E99 0x5B79 0x68D8 # +0x9E9A 0x5B7A 0x6922 # +0x9E9B 0x5B7B 0x6926 # +0x9E9C 0x5B7C 0x68E1 # +0x9E9D 0x5B7D 0x690C # +0x9E9E 0x5B7E 0x68CD # +0x9E9F 0x5C21 0x68D4 # +0x9EA0 0x5C22 0x68E7 # +0x9EA1 0x5C23 0x68D5 # +0x9EA2 0x5C24 0x6936 # +0x9EA3 0x5C25 0x6912 # +0x9EA4 0x5C26 0x6904 # +0x9EA5 0x5C27 0x68D7 # +0x9EA6 0x5C28 0x68E3 # +0x9EA7 0x5C29 0x6925 # +0x9EA8 0x5C2A 0x68F9 # +0x9EA9 0x5C2B 0x68E0 # +0x9EAA 0x5C2C 0x68EF # +0x9EAB 0x5C2D 0x6928 # +0x9EAC 0x5C2E 0x692A # +0x9EAD 0x5C2F 0x691A # +0x9EAE 0x5C30 0x6923 # +0x9EAF 0x5C31 0x6921 # +0x9EB0 0x5C32 0x68C6 # +0x9EB1 0x5C33 0x6979 # +0x9EB2 0x5C34 0x6977 # +0x9EB3 0x5C35 0x695C # +0x9EB4 0x5C36 0x6978 # +0x9EB5 0x5C37 0x696B # +0x9EB6 0x5C38 0x6954 # +0x9EB7 0x5C39 0x697E # +0x9EB8 0x5C3A 0x696E # +0x9EB9 0x5C3B 0x6939 # +0x9EBA 0x5C3C 0x6974 # +0x9EBB 0x5C3D 0x693D # +0x9EBC 0x5C3E 0x6959 # +0x9EBD 0x5C3F 0x6930 # +0x9EBE 0x5C40 0x6961 # +0x9EBF 0x5C41 0x695E # +0x9EC0 0x5C42 0x695D # +0x9EC1 0x5C43 0x6981 # +0x9EC2 0x5C44 0x696A # +0x9EC3 0x5C45 0x69B2 # +0x9EC4 0x5C46 0x69AE # +0x9EC5 0x5C47 0x69D0 # +0x9EC6 0x5C48 0x69BF # +0x9EC7 0x5C49 0x69C1 # +0x9EC8 0x5C4A 0x69D3 # +0x9EC9 0x5C4B 0x69BE # +0x9ECA 0x5C4C 0x69CE # +0x9ECB 0x5C4D 0x5BE8 # +0x9ECC 0x5C4E 0x69CA # +0x9ECD 0x5C4F 0x69DD # +0x9ECE 0x5C50 0x69BB # +0x9ECF 0x5C51 0x69C3 # +0x9ED0 0x5C52 0x69A7 # +0x9ED1 0x5C53 0x6A2E # +0x9ED2 0x5C54 0x6991 # +0x9ED3 0x5C55 0x69A0 # +0x9ED4 0x5C56 0x699C # +0x9ED5 0x5C57 0x6995 # +0x9ED6 0x5C58 0x69B4 # +0x9ED7 0x5C59 0x69DE # +0x9ED8 0x5C5A 0x69E8 # +0x9ED9 0x5C5B 0x6A02 # +0x9EDA 0x5C5C 0x6A1B # +0x9EDB 0x5C5D 0x69FF # +0x9EDC 0x5C5E 0x6B0A # +0x9EDD 0x5C5F 0x69F9 # +0x9EDE 0x5C60 0x69F2 # +0x9EDF 0x5C61 0x69E7 # +0x9EE0 0x5C62 0x6A05 # +0x9EE1 0x5C63 0x69B1 # +0x9EE2 0x5C64 0x6A1E # +0x9EE3 0x5C65 0x69ED # +0x9EE4 0x5C66 0x6A14 # +0x9EE5 0x5C67 0x69EB # +0x9EE6 0x5C68 0x6A0A # +0x9EE7 0x5C69 0x6A12 # +0x9EE8 0x5C6A 0x6AC1 # +0x9EE9 0x5C6B 0x6A23 # +0x9EEA 0x5C6C 0x6A13 # +0x9EEB 0x5C6D 0x6A44 # +0x9EEC 0x5C6E 0x6A0C # +0x9EED 0x5C6F 0x6A72 # +0x9EEE 0x5C70 0x6A36 # +0x9EEF 0x5C71 0x6A78 # +0x9EF0 0x5C72 0x6A47 # +0x9EF1 0x5C73 0x6A62 # +0x9EF2 0x5C74 0x6A59 # +0x9EF3 0x5C75 0x6A66 # +0x9EF4 0x5C76 0x6A48 # +0x9EF5 0x5C77 0x6A38 # +0x9EF6 0x5C78 0x6A22 # +0x9EF7 0x5C79 0x6A90 # +0x9EF8 0x5C7A 0x6A8D # +0x9EF9 0x5C7B 0x6AA0 # +0x9EFA 0x5C7C 0x6A84 # +0x9EFB 0x5C7D 0x6AA2 # +0x9EFC 0x5C7E 0x6AA3 # +0x9F40 0x5D21 0x6A97 # +0x9F41 0x5D22 0x8617 # +0x9F42 0x5D23 0x6ABB # +0x9F43 0x5D24 0x6AC3 # +0x9F44 0x5D25 0x6AC2 # +0x9F45 0x5D26 0x6AB8 # +0x9F46 0x5D27 0x6AB3 # +0x9F47 0x5D28 0x6AAC # +0x9F48 0x5D29 0x6ADE # +0x9F49 0x5D2A 0x6AD1 # +0x9F4A 0x5D2B 0x6ADF # +0x9F4B 0x5D2C 0x6AAA # +0x9F4C 0x5D2D 0x6ADA # +0x9F4D 0x5D2E 0x6AEA # +0x9F4E 0x5D2F 0x6AFB # +0x9F4F 0x5D30 0x6B05 # +0x9F50 0x5D31 0x8616 # +0x9F51 0x5D32 0x6AFA # +0x9F52 0x5D33 0x6B12 # +0x9F53 0x5D34 0x6B16 # +0x9F54 0x5D35 0x9B31 # +0x9F55 0x5D36 0x6B1F # +0x9F56 0x5D37 0x6B38 # +0x9F57 0x5D38 0x6B37 # +0x9F58 0x5D39 0x76DC # +0x9F59 0x5D3A 0x6B39 # +0x9F5A 0x5D3B 0x98EE # +0x9F5B 0x5D3C 0x6B47 # +0x9F5C 0x5D3D 0x6B43 # +0x9F5D 0x5D3E 0x6B49 # +0x9F5E 0x5D3F 0x6B50 # +0x9F5F 0x5D40 0x6B59 # +0x9F60 0x5D41 0x6B54 # +0x9F61 0x5D42 0x6B5B # +0x9F62 0x5D43 0x6B5F # +0x9F63 0x5D44 0x6B61 # +0x9F64 0x5D45 0x6B78 # +0x9F65 0x5D46 0x6B79 # +0x9F66 0x5D47 0x6B7F # +0x9F67 0x5D48 0x6B80 # +0x9F68 0x5D49 0x6B84 # +0x9F69 0x5D4A 0x6B83 # +0x9F6A 0x5D4B 0x6B8D # +0x9F6B 0x5D4C 0x6B98 # +0x9F6C 0x5D4D 0x6B95 # +0x9F6D 0x5D4E 0x6B9E # +0x9F6E 0x5D4F 0x6BA4 # +0x9F6F 0x5D50 0x6BAA # +0x9F70 0x5D51 0x6BAB # +0x9F71 0x5D52 0x6BAF # +0x9F72 0x5D53 0x6BB2 # +0x9F73 0x5D54 0x6BB1 # +0x9F74 0x5D55 0x6BB3 # +0x9F75 0x5D56 0x6BB7 # +0x9F76 0x5D57 0x6BBC # +0x9F77 0x5D58 0x6BC6 # +0x9F78 0x5D59 0x6BCB # +0x9F79 0x5D5A 0x6BD3 # +0x9F7A 0x5D5B 0x6BDF # +0x9F7B 0x5D5C 0x6BEC # +0x9F7C 0x5D5D 0x6BEB # +0x9F7D 0x5D5E 0x6BF3 # +0x9F7E 0x5D5F 0x6BEF # +0x9F80 0x5D60 0x9EBE # +0x9F81 0x5D61 0x6C08 # +0x9F82 0x5D62 0x6C13 # +0x9F83 0x5D63 0x6C14 # +0x9F84 0x5D64 0x6C1B # +0x9F85 0x5D65 0x6C24 # +0x9F86 0x5D66 0x6C23 # +0x9F87 0x5D67 0x6C5E # +0x9F88 0x5D68 0x6C55 # +0x9F89 0x5D69 0x6C62 # +0x9F8A 0x5D6A 0x6C6A # +0x9F8B 0x5D6B 0x6C82 # +0x9F8C 0x5D6C 0x6C8D # +0x9F8D 0x5D6D 0x6C9A # +0x9F8E 0x5D6E 0x6C81 # +0x9F8F 0x5D6F 0x6C9B # +0x9F90 0x5D70 0x6C7E # +0x9F91 0x5D71 0x6C68 # +0x9F92 0x5D72 0x6C73 # +0x9F93 0x5D73 0x6C92 # +0x9F94 0x5D74 0x6C90 # +0x9F95 0x5D75 0x6CC4 # +0x9F96 0x5D76 0x6CF1 # +0x9F97 0x5D77 0x6CD3 # +0x9F98 0x5D78 0x6CBD # +0x9F99 0x5D79 0x6CD7 # +0x9F9A 0x5D7A 0x6CC5 # +0x9F9B 0x5D7B 0x6CDD # +0x9F9C 0x5D7C 0x6CAE # +0x9F9D 0x5D7D 0x6CB1 # +0x9F9E 0x5D7E 0x6CBE # +0x9F9F 0x5E21 0x6CBA # +0x9FA0 0x5E22 0x6CDB # +0x9FA1 0x5E23 0x6CEF # +0x9FA2 0x5E24 0x6CD9 # +0x9FA3 0x5E25 0x6CEA # +0x9FA4 0x5E26 0x6D1F # +0x9FA5 0x5E27 0x884D # +0x9FA6 0x5E28 0x6D36 # +0x9FA7 0x5E29 0x6D2B # +0x9FA8 0x5E2A 0x6D3D # +0x9FA9 0x5E2B 0x6D38 # +0x9FAA 0x5E2C 0x6D19 # +0x9FAB 0x5E2D 0x6D35 # +0x9FAC 0x5E2E 0x6D33 # +0x9FAD 0x5E2F 0x6D12 # +0x9FAE 0x5E30 0x6D0C # +0x9FAF 0x5E31 0x6D63 # +0x9FB0 0x5E32 0x6D93 # +0x9FB1 0x5E33 0x6D64 # +0x9FB2 0x5E34 0x6D5A # +0x9FB3 0x5E35 0x6D79 # +0x9FB4 0x5E36 0x6D59 # +0x9FB5 0x5E37 0x6D8E # +0x9FB6 0x5E38 0x6D95 # +0x9FB7 0x5E39 0x6FE4 # +0x9FB8 0x5E3A 0x6D85 # +0x9FB9 0x5E3B 0x6DF9 # +0x9FBA 0x5E3C 0x6E15 # +0x9FBB 0x5E3D 0x6E0A # +0x9FBC 0x5E3E 0x6DB5 # +0x9FBD 0x5E3F 0x6DC7 # +0x9FBE 0x5E40 0x6DE6 # +0x9FBF 0x5E41 0x6DB8 # +0x9FC0 0x5E42 0x6DC6 # +0x9FC1 0x5E43 0x6DEC # +0x9FC2 0x5E44 0x6DDE # +0x9FC3 0x5E45 0x6DCC # +0x9FC4 0x5E46 0x6DE8 # +0x9FC5 0x5E47 0x6DD2 # +0x9FC6 0x5E48 0x6DC5 # +0x9FC7 0x5E49 0x6DFA # +0x9FC8 0x5E4A 0x6DD9 # +0x9FC9 0x5E4B 0x6DE4 # +0x9FCA 0x5E4C 0x6DD5 # +0x9FCB 0x5E4D 0x6DEA # +0x9FCC 0x5E4E 0x6DEE # +0x9FCD 0x5E4F 0x6E2D # +0x9FCE 0x5E50 0x6E6E # +0x9FCF 0x5E51 0x6E2E # +0x9FD0 0x5E52 0x6E19 # +0x9FD1 0x5E53 0x6E72 # +0x9FD2 0x5E54 0x6E5F # +0x9FD3 0x5E55 0x6E3E # +0x9FD4 0x5E56 0x6E23 # +0x9FD5 0x5E57 0x6E6B # +0x9FD6 0x5E58 0x6E2B # +0x9FD7 0x5E59 0x6E76 # +0x9FD8 0x5E5A 0x6E4D # +0x9FD9 0x5E5B 0x6E1F # +0x9FDA 0x5E5C 0x6E43 # +0x9FDB 0x5E5D 0x6E3A # +0x9FDC 0x5E5E 0x6E4E # +0x9FDD 0x5E5F 0x6E24 # +0x9FDE 0x5E60 0x6EFF # +0x9FDF 0x5E61 0x6E1D # +0x9FE0 0x5E62 0x6E38 # +0x9FE1 0x5E63 0x6E82 # +0x9FE2 0x5E64 0x6EAA # +0x9FE3 0x5E65 0x6E98 # +0x9FE4 0x5E66 0x6EC9 # +0x9FE5 0x5E67 0x6EB7 # +0x9FE6 0x5E68 0x6ED3 # +0x9FE7 0x5E69 0x6EBD # +0x9FE8 0x5E6A 0x6EAF # +0x9FE9 0x5E6B 0x6EC4 # +0x9FEA 0x5E6C 0x6EB2 # +0x9FEB 0x5E6D 0x6ED4 # +0x9FEC 0x5E6E 0x6ED5 # +0x9FED 0x5E6F 0x6E8F # +0x9FEE 0x5E70 0x6EA5 # +0x9FEF 0x5E71 0x6EC2 # +0x9FF0 0x5E72 0x6E9F # +0x9FF1 0x5E73 0x6F41 # +0x9FF2 0x5E74 0x6F11 # +0x9FF3 0x5E75 0x704C # +0x9FF4 0x5E76 0x6EEC # +0x9FF5 0x5E77 0x6EF8 # +0x9FF6 0x5E78 0x6EFE # +0x9FF7 0x5E79 0x6F3F # +0x9FF8 0x5E7A 0x6EF2 # +0x9FF9 0x5E7B 0x6F31 # +0x9FFA 0x5E7C 0x6EEF # +0x9FFB 0x5E7D 0x6F32 # +0x9FFC 0x5E7E 0x6ECC # +0xE040 0x5F21 0x6F3E # +0xE041 0x5F22 0x6F13 # +0xE042 0x5F23 0x6EF7 # +0xE043 0x5F24 0x6F86 # +0xE044 0x5F25 0x6F7A # +0xE045 0x5F26 0x6F78 # +0xE046 0x5F27 0x6F81 # +0xE047 0x5F28 0x6F80 # +0xE048 0x5F29 0x6F6F # +0xE049 0x5F2A 0x6F5B # +0xE04A 0x5F2B 0x6FF3 # +0xE04B 0x5F2C 0x6F6D # +0xE04C 0x5F2D 0x6F82 # +0xE04D 0x5F2E 0x6F7C # +0xE04E 0x5F2F 0x6F58 # +0xE04F 0x5F30 0x6F8E # +0xE050 0x5F31 0x6F91 # +0xE051 0x5F32 0x6FC2 # +0xE052 0x5F33 0x6F66 # +0xE053 0x5F34 0x6FB3 # +0xE054 0x5F35 0x6FA3 # +0xE055 0x5F36 0x6FA1 # +0xE056 0x5F37 0x6FA4 # +0xE057 0x5F38 0x6FB9 # +0xE058 0x5F39 0x6FC6 # +0xE059 0x5F3A 0x6FAA # +0xE05A 0x5F3B 0x6FDF # +0xE05B 0x5F3C 0x6FD5 # +0xE05C 0x5F3D 0x6FEC # +0xE05D 0x5F3E 0x6FD4 # +0xE05E 0x5F3F 0x6FD8 # +0xE05F 0x5F40 0x6FF1 # +0xE060 0x5F41 0x6FEE # +0xE061 0x5F42 0x6FDB # +0xE062 0x5F43 0x7009 # +0xE063 0x5F44 0x700B # +0xE064 0x5F45 0x6FFA # +0xE065 0x5F46 0x7011 # +0xE066 0x5F47 0x7001 # +0xE067 0x5F48 0x700F # +0xE068 0x5F49 0x6FFE # +0xE069 0x5F4A 0x701B # +0xE06A 0x5F4B 0x701A # +0xE06B 0x5F4C 0x6F74 # +0xE06C 0x5F4D 0x701D # +0xE06D 0x5F4E 0x7018 # +0xE06E 0x5F4F 0x701F # +0xE06F 0x5F50 0x7030 # +0xE070 0x5F51 0x703E # +0xE071 0x5F52 0x7032 # +0xE072 0x5F53 0x7051 # +0xE073 0x5F54 0x7063 # +0xE074 0x5F55 0x7099 # +0xE075 0x5F56 0x7092 # +0xE076 0x5F57 0x70AF # +0xE077 0x5F58 0x70F1 # +0xE078 0x5F59 0x70AC # +0xE079 0x5F5A 0x70B8 # +0xE07A 0x5F5B 0x70B3 # +0xE07B 0x5F5C 0x70AE # +0xE07C 0x5F5D 0x70DF # +0xE07D 0x5F5E 0x70CB # +0xE07E 0x5F5F 0x70DD # +0xE080 0x5F60 0x70D9 # +0xE081 0x5F61 0x7109 # +0xE082 0x5F62 0x70FD # +0xE083 0x5F63 0x711C # +0xE084 0x5F64 0x7119 # +0xE085 0x5F65 0x7165 # +0xE086 0x5F66 0x7155 # +0xE087 0x5F67 0x7188 # +0xE088 0x5F68 0x7166 # +0xE089 0x5F69 0x7162 # +0xE08A 0x5F6A 0x714C # +0xE08B 0x5F6B 0x7156 # +0xE08C 0x5F6C 0x716C # +0xE08D 0x5F6D 0x718F # +0xE08E 0x5F6E 0x71FB # +0xE08F 0x5F6F 0x7184 # +0xE090 0x5F70 0x7195 # +0xE091 0x5F71 0x71A8 # +0xE092 0x5F72 0x71AC # +0xE093 0x5F73 0x71D7 # +0xE094 0x5F74 0x71B9 # +0xE095 0x5F75 0x71BE # +0xE096 0x5F76 0x71D2 # +0xE097 0x5F77 0x71C9 # +0xE098 0x5F78 0x71D4 # +0xE099 0x5F79 0x71CE # +0xE09A 0x5F7A 0x71E0 # +0xE09B 0x5F7B 0x71EC # +0xE09C 0x5F7C 0x71E7 # +0xE09D 0x5F7D 0x71F5 # +0xE09E 0x5F7E 0x71FC # +0xE09F 0x6021 0x71F9 # +0xE0A0 0x6022 0x71FF # +0xE0A1 0x6023 0x720D # +0xE0A2 0x6024 0x7210 # +0xE0A3 0x6025 0x721B # +0xE0A4 0x6026 0x7228 # +0xE0A5 0x6027 0x722D # +0xE0A6 0x6028 0x722C # +0xE0A7 0x6029 0x7230 # +0xE0A8 0x602A 0x7232 # +0xE0A9 0x602B 0x723B # +0xE0AA 0x602C 0x723C # +0xE0AB 0x602D 0x723F # +0xE0AC 0x602E 0x7240 # +0xE0AD 0x602F 0x7246 # +0xE0AE 0x6030 0x724B # +0xE0AF 0x6031 0x7258 # +0xE0B0 0x6032 0x7274 # +0xE0B1 0x6033 0x727E # +0xE0B2 0x6034 0x7282 # +0xE0B3 0x6035 0x7281 # +0xE0B4 0x6036 0x7287 # +0xE0B5 0x6037 0x7292 # +0xE0B6 0x6038 0x7296 # +0xE0B7 0x6039 0x72A2 # +0xE0B8 0x603A 0x72A7 # +0xE0B9 0x603B 0x72B9 # +0xE0BA 0x603C 0x72B2 # +0xE0BB 0x603D 0x72C3 # +0xE0BC 0x603E 0x72C6 # +0xE0BD 0x603F 0x72C4 # +0xE0BE 0x6040 0x72CE # +0xE0BF 0x6041 0x72D2 # +0xE0C0 0x6042 0x72E2 # +0xE0C1 0x6043 0x72E0 # +0xE0C2 0x6044 0x72E1 # +0xE0C3 0x6045 0x72F9 # +0xE0C4 0x6046 0x72F7 # +0xE0C5 0x6047 0x500F # +0xE0C6 0x6048 0x7317 # +0xE0C7 0x6049 0x730A # +0xE0C8 0x604A 0x731C # +0xE0C9 0x604B 0x7316 # +0xE0CA 0x604C 0x731D # +0xE0CB 0x604D 0x7334 # +0xE0CC 0x604E 0x732F # +0xE0CD 0x604F 0x7329 # +0xE0CE 0x6050 0x7325 # +0xE0CF 0x6051 0x733E # +0xE0D0 0x6052 0x734E # +0xE0D1 0x6053 0x734F # +0xE0D2 0x6054 0x9ED8 # +0xE0D3 0x6055 0x7357 # +0xE0D4 0x6056 0x736A # +0xE0D5 0x6057 0x7368 # +0xE0D6 0x6058 0x7370 # +0xE0D7 0x6059 0x7378 # +0xE0D8 0x605A 0x7375 # +0xE0D9 0x605B 0x737B # +0xE0DA 0x605C 0x737A # +0xE0DB 0x605D 0x73C8 # +0xE0DC 0x605E 0x73B3 # +0xE0DD 0x605F 0x73CE # +0xE0DE 0x6060 0x73BB # +0xE0DF 0x6061 0x73C0 # +0xE0E0 0x6062 0x73E5 # +0xE0E1 0x6063 0x73EE # +0xE0E2 0x6064 0x73DE # +0xE0E3 0x6065 0x74A2 # +0xE0E4 0x6066 0x7405 # +0xE0E5 0x6067 0x746F # +0xE0E6 0x6068 0x7425 # +0xE0E7 0x6069 0x73F8 # +0xE0E8 0x606A 0x7432 # +0xE0E9 0x606B 0x743A # +0xE0EA 0x606C 0x7455 # +0xE0EB 0x606D 0x743F # +0xE0EC 0x606E 0x745F # +0xE0ED 0x606F 0x7459 # +0xE0EE 0x6070 0x7441 # +0xE0EF 0x6071 0x745C # +0xE0F0 0x6072 0x7469 # +0xE0F1 0x6073 0x7470 # +0xE0F2 0x6074 0x7463 # +0xE0F3 0x6075 0x746A # +0xE0F4 0x6076 0x7476 # +0xE0F5 0x6077 0x747E # +0xE0F6 0x6078 0x748B # +0xE0F7 0x6079 0x749E # +0xE0F8 0x607A 0x74A7 # +0xE0F9 0x607B 0x74CA # +0xE0FA 0x607C 0x74CF # +0xE0FB 0x607D 0x74D4 # +0xE0FC 0x607E 0x73F1 # +0xE140 0x6121 0x74E0 # +0xE141 0x6122 0x74E3 # +0xE142 0x6123 0x74E7 # +0xE143 0x6124 0x74E9 # +0xE144 0x6125 0x74EE # +0xE145 0x6126 0x74F2 # +0xE146 0x6127 0x74F0 # +0xE147 0x6128 0x74F1 # +0xE148 0x6129 0x74F8 # +0xE149 0x612A 0x74F7 # +0xE14A 0x612B 0x7504 # +0xE14B 0x612C 0x7503 # +0xE14C 0x612D 0x7505 # +0xE14D 0x612E 0x750C # +0xE14E 0x612F 0x750E # +0xE14F 0x6130 0x750D # +0xE150 0x6131 0x7515 # +0xE151 0x6132 0x7513 # +0xE152 0x6133 0x751E # +0xE153 0x6134 0x7526 # +0xE154 0x6135 0x752C # +0xE155 0x6136 0x753C # +0xE156 0x6137 0x7544 # +0xE157 0x6138 0x754D # +0xE158 0x6139 0x754A # +0xE159 0x613A 0x7549 # +0xE15A 0x613B 0x755B # +0xE15B 0x613C 0x7546 # +0xE15C 0x613D 0x755A # +0xE15D 0x613E 0x7569 # +0xE15E 0x613F 0x7564 # +0xE15F 0x6140 0x7567 # +0xE160 0x6141 0x756B # +0xE161 0x6142 0x756D # +0xE162 0x6143 0x7578 # +0xE163 0x6144 0x7576 # +0xE164 0x6145 0x7586 # +0xE165 0x6146 0x7587 # +0xE166 0x6147 0x7574 # +0xE167 0x6148 0x758A # +0xE168 0x6149 0x7589 # +0xE169 0x614A 0x7582 # +0xE16A 0x614B 0x7594 # +0xE16B 0x614C 0x759A # +0xE16C 0x614D 0x759D # +0xE16D 0x614E 0x75A5 # +0xE16E 0x614F 0x75A3 # +0xE16F 0x6150 0x75C2 # +0xE170 0x6151 0x75B3 # +0xE171 0x6152 0x75C3 # +0xE172 0x6153 0x75B5 # +0xE173 0x6154 0x75BD # +0xE174 0x6155 0x75B8 # +0xE175 0x6156 0x75BC # +0xE176 0x6157 0x75B1 # +0xE177 0x6158 0x75CD # +0xE178 0x6159 0x75CA # +0xE179 0x615A 0x75D2 # +0xE17A 0x615B 0x75D9 # +0xE17B 0x615C 0x75E3 # +0xE17C 0x615D 0x75DE # +0xE17D 0x615E 0x75FE # +0xE17E 0x615F 0x75FF # +0xE180 0x6160 0x75FC # +0xE181 0x6161 0x7601 # +0xE182 0x6162 0x75F0 # +0xE183 0x6163 0x75FA # +0xE184 0x6164 0x75F2 # +0xE185 0x6165 0x75F3 # +0xE186 0x6166 0x760B # +0xE187 0x6167 0x760D # +0xE188 0x6168 0x7609 # +0xE189 0x6169 0x761F # +0xE18A 0x616A 0x7627 # +0xE18B 0x616B 0x7620 # +0xE18C 0x616C 0x7621 # +0xE18D 0x616D 0x7622 # +0xE18E 0x616E 0x7624 # +0xE18F 0x616F 0x7634 # +0xE190 0x6170 0x7630 # +0xE191 0x6171 0x763B # +0xE192 0x6172 0x7647 # +0xE193 0x6173 0x7648 # +0xE194 0x6174 0x7646 # +0xE195 0x6175 0x765C # +0xE196 0x6176 0x7658 # +0xE197 0x6177 0x7661 # +0xE198 0x6178 0x7662 # +0xE199 0x6179 0x7668 # +0xE19A 0x617A 0x7669 # +0xE19B 0x617B 0x766A # +0xE19C 0x617C 0x7667 # +0xE19D 0x617D 0x766C # +0xE19E 0x617E 0x7670 # +0xE19F 0x6221 0x7672 # +0xE1A0 0x6222 0x7676 # +0xE1A1 0x6223 0x7678 # +0xE1A2 0x6224 0x767C # +0xE1A3 0x6225 0x7680 # +0xE1A4 0x6226 0x7683 # +0xE1A5 0x6227 0x7688 # +0xE1A6 0x6228 0x768B # +0xE1A7 0x6229 0x768E # +0xE1A8 0x622A 0x7696 # +0xE1A9 0x622B 0x7693 # +0xE1AA 0x622C 0x7699 # +0xE1AB 0x622D 0x769A # +0xE1AC 0x622E 0x76B0 # +0xE1AD 0x622F 0x76B4 # +0xE1AE 0x6230 0x76B8 # +0xE1AF 0x6231 0x76B9 # +0xE1B0 0x6232 0x76BA # +0xE1B1 0x6233 0x76C2 # +0xE1B2 0x6234 0x76CD # +0xE1B3 0x6235 0x76D6 # +0xE1B4 0x6236 0x76D2 # +0xE1B5 0x6237 0x76DE # +0xE1B6 0x6238 0x76E1 # +0xE1B7 0x6239 0x76E5 # +0xE1B8 0x623A 0x76E7 # +0xE1B9 0x623B 0x76EA # +0xE1BA 0x623C 0x862F # +0xE1BB 0x623D 0x76FB # +0xE1BC 0x623E 0x7708 # +0xE1BD 0x623F 0x7707 # +0xE1BE 0x6240 0x7704 # +0xE1BF 0x6241 0x7729 # +0xE1C0 0x6242 0x7724 # +0xE1C1 0x6243 0x771E # +0xE1C2 0x6244 0x7725 # +0xE1C3 0x6245 0x7726 # +0xE1C4 0x6246 0x771B # +0xE1C5 0x6247 0x7737 # +0xE1C6 0x6248 0x7738 # +0xE1C7 0x6249 0x7747 # +0xE1C8 0x624A 0x775A # +0xE1C9 0x624B 0x7768 # +0xE1CA 0x624C 0x776B # +0xE1CB 0x624D 0x775B # +0xE1CC 0x624E 0x7765 # +0xE1CD 0x624F 0x777F # +0xE1CE 0x6250 0x777E # +0xE1CF 0x6251 0x7779 # +0xE1D0 0x6252 0x778E # +0xE1D1 0x6253 0x778B # +0xE1D2 0x6254 0x7791 # +0xE1D3 0x6255 0x77A0 # +0xE1D4 0x6256 0x779E # +0xE1D5 0x6257 0x77B0 # +0xE1D6 0x6258 0x77B6 # +0xE1D7 0x6259 0x77B9 # +0xE1D8 0x625A 0x77BF # +0xE1D9 0x625B 0x77BC # +0xE1DA 0x625C 0x77BD # +0xE1DB 0x625D 0x77BB # +0xE1DC 0x625E 0x77C7 # +0xE1DD 0x625F 0x77CD # +0xE1DE 0x6260 0x77D7 # +0xE1DF 0x6261 0x77DA # +0xE1E0 0x6262 0x77DC # +0xE1E1 0x6263 0x77E3 # +0xE1E2 0x6264 0x77EE # +0xE1E3 0x6265 0x77FC # +0xE1E4 0x6266 0x780C # +0xE1E5 0x6267 0x7812 # +0xE1E6 0x6268 0x7926 # +0xE1E7 0x6269 0x7820 # +0xE1E8 0x626A 0x792A # +0xE1E9 0x626B 0x7845 # +0xE1EA 0x626C 0x788E # +0xE1EB 0x626D 0x7874 # +0xE1EC 0x626E 0x7886 # +0xE1ED 0x626F 0x787C # +0xE1EE 0x6270 0x789A # +0xE1EF 0x6271 0x788C # +0xE1F0 0x6272 0x78A3 # +0xE1F1 0x6273 0x78B5 # +0xE1F2 0x6274 0x78AA # +0xE1F3 0x6275 0x78AF # +0xE1F4 0x6276 0x78D1 # +0xE1F5 0x6277 0x78C6 # +0xE1F6 0x6278 0x78CB # +0xE1F7 0x6279 0x78D4 # +0xE1F8 0x627A 0x78BE # +0xE1F9 0x627B 0x78BC # +0xE1FA 0x627C 0x78C5 # +0xE1FB 0x627D 0x78CA # +0xE1FC 0x627E 0x78EC # +0xE240 0x6321 0x78E7 # +0xE241 0x6322 0x78DA # +0xE242 0x6323 0x78FD # +0xE243 0x6324 0x78F4 # +0xE244 0x6325 0x7907 # +0xE245 0x6326 0x7912 # +0xE246 0x6327 0x7911 # +0xE247 0x6328 0x7919 # +0xE248 0x6329 0x792C # +0xE249 0x632A 0x792B # +0xE24A 0x632B 0x7940 # +0xE24B 0x632C 0x7960 # +0xE24C 0x632D 0x7957 # +0xE24D 0x632E 0x795F # +0xE24E 0x632F 0x795A # +0xE24F 0x6330 0x7955 # +0xE250 0x6331 0x7953 # +0xE251 0x6332 0x797A # +0xE252 0x6333 0x797F # +0xE253 0x6334 0x798A # +0xE254 0x6335 0x799D # +0xE255 0x6336 0x79A7 # +0xE256 0x6337 0x9F4B # +0xE257 0x6338 0x79AA # +0xE258 0x6339 0x79AE # +0xE259 0x633A 0x79B3 # +0xE25A 0x633B 0x79B9 # +0xE25B 0x633C 0x79BA # +0xE25C 0x633D 0x79C9 # +0xE25D 0x633E 0x79D5 # +0xE25E 0x633F 0x79E7 # +0xE25F 0x6340 0x79EC # +0xE260 0x6341 0x79E1 # +0xE261 0x6342 0x79E3 # +0xE262 0x6343 0x7A08 # +0xE263 0x6344 0x7A0D # +0xE264 0x6345 0x7A18 # +0xE265 0x6346 0x7A19 # +0xE266 0x6347 0x7A20 # +0xE267 0x6348 0x7A1F # +0xE268 0x6349 0x7980 # +0xE269 0x634A 0x7A31 # +0xE26A 0x634B 0x7A3B # +0xE26B 0x634C 0x7A3E # +0xE26C 0x634D 0x7A37 # +0xE26D 0x634E 0x7A43 # +0xE26E 0x634F 0x7A57 # +0xE26F 0x6350 0x7A49 # +0xE270 0x6351 0x7A61 # +0xE271 0x6352 0x7A62 # +0xE272 0x6353 0x7A69 # +0xE273 0x6354 0x9F9D # +0xE274 0x6355 0x7A70 # +0xE275 0x6356 0x7A79 # +0xE276 0x6357 0x7A7D # +0xE277 0x6358 0x7A88 # +0xE278 0x6359 0x7A97 # +0xE279 0x635A 0x7A95 # +0xE27A 0x635B 0x7A98 # +0xE27B 0x635C 0x7A96 # +0xE27C 0x635D 0x7AA9 # +0xE27D 0x635E 0x7AC8 # +0xE27E 0x635F 0x7AB0 # +0xE280 0x6360 0x7AB6 # +0xE281 0x6361 0x7AC5 # +0xE282 0x6362 0x7AC4 # +0xE283 0x6363 0x7ABF # +0xE284 0x6364 0x9083 # +0xE285 0x6365 0x7AC7 # +0xE286 0x6366 0x7ACA # +0xE287 0x6367 0x7ACD # +0xE288 0x6368 0x7ACF # +0xE289 0x6369 0x7AD5 # +0xE28A 0x636A 0x7AD3 # +0xE28B 0x636B 0x7AD9 # +0xE28C 0x636C 0x7ADA # +0xE28D 0x636D 0x7ADD # +0xE28E 0x636E 0x7AE1 # +0xE28F 0x636F 0x7AE2 # +0xE290 0x6370 0x7AE6 # +0xE291 0x6371 0x7AED # +0xE292 0x6372 0x7AF0 # +0xE293 0x6373 0x7B02 # +0xE294 0x6374 0x7B0F # +0xE295 0x6375 0x7B0A # +0xE296 0x6376 0x7B06 # +0xE297 0x6377 0x7B33 # +0xE298 0x6378 0x7B18 # +0xE299 0x6379 0x7B19 # +0xE29A 0x637A 0x7B1E # +0xE29B 0x637B 0x7B35 # +0xE29C 0x637C 0x7B28 # +0xE29D 0x637D 0x7B36 # +0xE29E 0x637E 0x7B50 # +0xE29F 0x6421 0x7B7A # +0xE2A0 0x6422 0x7B04 # +0xE2A1 0x6423 0x7B4D # +0xE2A2 0x6424 0x7B0B # +0xE2A3 0x6425 0x7B4C # +0xE2A4 0x6426 0x7B45 # +0xE2A5 0x6427 0x7B75 # +0xE2A6 0x6428 0x7B65 # +0xE2A7 0x6429 0x7B74 # +0xE2A8 0x642A 0x7B67 # +0xE2A9 0x642B 0x7B70 # +0xE2AA 0x642C 0x7B71 # +0xE2AB 0x642D 0x7B6C # +0xE2AC 0x642E 0x7B6E # +0xE2AD 0x642F 0x7B9D # +0xE2AE 0x6430 0x7B98 # +0xE2AF 0x6431 0x7B9F # +0xE2B0 0x6432 0x7B8D # +0xE2B1 0x6433 0x7B9C # +0xE2B2 0x6434 0x7B9A # +0xE2B3 0x6435 0x7B8B # +0xE2B4 0x6436 0x7B92 # +0xE2B5 0x6437 0x7B8F # +0xE2B6 0x6438 0x7B5D # +0xE2B7 0x6439 0x7B99 # +0xE2B8 0x643A 0x7BCB # +0xE2B9 0x643B 0x7BC1 # +0xE2BA 0x643C 0x7BCC # +0xE2BB 0x643D 0x7BCF # +0xE2BC 0x643E 0x7BB4 # +0xE2BD 0x643F 0x7BC6 # +0xE2BE 0x6440 0x7BDD # +0xE2BF 0x6441 0x7BE9 # +0xE2C0 0x6442 0x7C11 # +0xE2C1 0x6443 0x7C14 # +0xE2C2 0x6444 0x7BE6 # +0xE2C3 0x6445 0x7BE5 # +0xE2C4 0x6446 0x7C60 # +0xE2C5 0x6447 0x7C00 # +0xE2C6 0x6448 0x7C07 # +0xE2C7 0x6449 0x7C13 # +0xE2C8 0x644A 0x7BF3 # +0xE2C9 0x644B 0x7BF7 # +0xE2CA 0x644C 0x7C17 # +0xE2CB 0x644D 0x7C0D # +0xE2CC 0x644E 0x7BF6 # +0xE2CD 0x644F 0x7C23 # +0xE2CE 0x6450 0x7C27 # +0xE2CF 0x6451 0x7C2A # +0xE2D0 0x6452 0x7C1F # +0xE2D1 0x6453 0x7C37 # +0xE2D2 0x6454 0x7C2B # +0xE2D3 0x6455 0x7C3D # +0xE2D4 0x6456 0x7C4C # +0xE2D5 0x6457 0x7C43 # +0xE2D6 0x6458 0x7C54 # +0xE2D7 0x6459 0x7C4F # +0xE2D8 0x645A 0x7C40 # +0xE2D9 0x645B 0x7C50 # +0xE2DA 0x645C 0x7C58 # +0xE2DB 0x645D 0x7C5F # +0xE2DC 0x645E 0x7C64 # +0xE2DD 0x645F 0x7C56 # +0xE2DE 0x6460 0x7C65 # +0xE2DF 0x6461 0x7C6C # +0xE2E0 0x6462 0x7C75 # +0xE2E1 0x6463 0x7C83 # +0xE2E2 0x6464 0x7C90 # +0xE2E3 0x6465 0x7CA4 # +0xE2E4 0x6466 0x7CAD # +0xE2E5 0x6467 0x7CA2 # +0xE2E6 0x6468 0x7CAB # +0xE2E7 0x6469 0x7CA1 # +0xE2E8 0x646A 0x7CA8 # +0xE2E9 0x646B 0x7CB3 # +0xE2EA 0x646C 0x7CB2 # +0xE2EB 0x646D 0x7CB1 # +0xE2EC 0x646E 0x7CAE # +0xE2ED 0x646F 0x7CB9 # +0xE2EE 0x6470 0x7CBD # +0xE2EF 0x6471 0x7CC0 # +0xE2F0 0x6472 0x7CC5 # +0xE2F1 0x6473 0x7CC2 # +0xE2F2 0x6474 0x7CD8 # +0xE2F3 0x6475 0x7CD2 # +0xE2F4 0x6476 0x7CDC # +0xE2F5 0x6477 0x7CE2 # +0xE2F6 0x6478 0x9B3B # +0xE2F7 0x6479 0x7CEF # +0xE2F8 0x647A 0x7CF2 # +0xE2F9 0x647B 0x7CF4 # +0xE2FA 0x647C 0x7CF6 # +0xE2FB 0x647D 0x7CFA # +0xE2FC 0x647E 0x7D06 # +0xE340 0x6521 0x7D02 # +0xE341 0x6522 0x7D1C # +0xE342 0x6523 0x7D15 # +0xE343 0x6524 0x7D0A # +0xE344 0x6525 0x7D45 # +0xE345 0x6526 0x7D4B # +0xE346 0x6527 0x7D2E # +0xE347 0x6528 0x7D32 # +0xE348 0x6529 0x7D3F # +0xE349 0x652A 0x7D35 # +0xE34A 0x652B 0x7D46 # +0xE34B 0x652C 0x7D73 # +0xE34C 0x652D 0x7D56 # +0xE34D 0x652E 0x7D4E # +0xE34E 0x652F 0x7D72 # +0xE34F 0x6530 0x7D68 # +0xE350 0x6531 0x7D6E # +0xE351 0x6532 0x7D4F # +0xE352 0x6533 0x7D63 # +0xE353 0x6534 0x7D93 # +0xE354 0x6535 0x7D89 # +0xE355 0x6536 0x7D5B # +0xE356 0x6537 0x7D8F # +0xE357 0x6538 0x7D7D # +0xE358 0x6539 0x7D9B # +0xE359 0x653A 0x7DBA # +0xE35A 0x653B 0x7DAE # +0xE35B 0x653C 0x7DA3 # +0xE35C 0x653D 0x7DB5 # +0xE35D 0x653E 0x7DC7 # +0xE35E 0x653F 0x7DBD # +0xE35F 0x6540 0x7DAB # +0xE360 0x6541 0x7E3D # +0xE361 0x6542 0x7DA2 # +0xE362 0x6543 0x7DAF # +0xE363 0x6544 0x7DDC # +0xE364 0x6545 0x7DB8 # +0xE365 0x6546 0x7D9F # +0xE366 0x6547 0x7DB0 # +0xE367 0x6548 0x7DD8 # +0xE368 0x6549 0x7DDD # +0xE369 0x654A 0x7DE4 # +0xE36A 0x654B 0x7DDE # +0xE36B 0x654C 0x7DFB # +0xE36C 0x654D 0x7DF2 # +0xE36D 0x654E 0x7DE1 # +0xE36E 0x654F 0x7E05 # +0xE36F 0x6550 0x7E0A # +0xE370 0x6551 0x7E23 # +0xE371 0x6552 0x7E21 # +0xE372 0x6553 0x7E12 # +0xE373 0x6554 0x7E31 # +0xE374 0x6555 0x7E1F # +0xE375 0x6556 0x7E09 # +0xE376 0x6557 0x7E0B # +0xE377 0x6558 0x7E22 # +0xE378 0x6559 0x7E46 # +0xE379 0x655A 0x7E66 # +0xE37A 0x655B 0x7E3B # +0xE37B 0x655C 0x7E35 # +0xE37C 0x655D 0x7E39 # +0xE37D 0x655E 0x7E43 # +0xE37E 0x655F 0x7E37 # +0xE380 0x6560 0x7E32 # +0xE381 0x6561 0x7E3A # +0xE382 0x6562 0x7E67 # +0xE383 0x6563 0x7E5D # +0xE384 0x6564 0x7E56 # +0xE385 0x6565 0x7E5E # +0xE386 0x6566 0x7E59 # +0xE387 0x6567 0x7E5A # +0xE388 0x6568 0x7E79 # +0xE389 0x6569 0x7E6A # +0xE38A 0x656A 0x7E69 # +0xE38B 0x656B 0x7E7C # +0xE38C 0x656C 0x7E7B # +0xE38D 0x656D 0x7E83 # +0xE38E 0x656E 0x7DD5 # +0xE38F 0x656F 0x7E7D # +0xE390 0x6570 0x8FAE # +0xE391 0x6571 0x7E7F # +0xE392 0x6572 0x7E88 # +0xE393 0x6573 0x7E89 # +0xE394 0x6574 0x7E8C # +0xE395 0x6575 0x7E92 # +0xE396 0x6576 0x7E90 # +0xE397 0x6577 0x7E93 # +0xE398 0x6578 0x7E94 # +0xE399 0x6579 0x7E96 # +0xE39A 0x657A 0x7E8E # +0xE39B 0x657B 0x7E9B # +0xE39C 0x657C 0x7E9C # +0xE39D 0x657D 0x7F38 # +0xE39E 0x657E 0x7F3A # +0xE39F 0x6621 0x7F45 # +0xE3A0 0x6622 0x7F4C # +0xE3A1 0x6623 0x7F4D # +0xE3A2 0x6624 0x7F4E # +0xE3A3 0x6625 0x7F50 # +0xE3A4 0x6626 0x7F51 # +0xE3A5 0x6627 0x7F55 # +0xE3A6 0x6628 0x7F54 # +0xE3A7 0x6629 0x7F58 # +0xE3A8 0x662A 0x7F5F # +0xE3A9 0x662B 0x7F60 # +0xE3AA 0x662C 0x7F68 # +0xE3AB 0x662D 0x7F69 # +0xE3AC 0x662E 0x7F67 # +0xE3AD 0x662F 0x7F78 # +0xE3AE 0x6630 0x7F82 # +0xE3AF 0x6631 0x7F86 # +0xE3B0 0x6632 0x7F83 # +0xE3B1 0x6633 0x7F88 # +0xE3B2 0x6634 0x7F87 # +0xE3B3 0x6635 0x7F8C # +0xE3B4 0x6636 0x7F94 # +0xE3B5 0x6637 0x7F9E # +0xE3B6 0x6638 0x7F9D # +0xE3B7 0x6639 0x7F9A # +0xE3B8 0x663A 0x7FA3 # +0xE3B9 0x663B 0x7FAF # +0xE3BA 0x663C 0x7FB2 # +0xE3BB 0x663D 0x7FB9 # +0xE3BC 0x663E 0x7FAE # +0xE3BD 0x663F 0x7FB6 # +0xE3BE 0x6640 0x7FB8 # +0xE3BF 0x6641 0x8B71 # +0xE3C0 0x6642 0x7FC5 # +0xE3C1 0x6643 0x7FC6 # +0xE3C2 0x6644 0x7FCA # +0xE3C3 0x6645 0x7FD5 # +0xE3C4 0x6646 0x7FD4 # +0xE3C5 0x6647 0x7FE1 # +0xE3C6 0x6648 0x7FE6 # +0xE3C7 0x6649 0x7FE9 # +0xE3C8 0x664A 0x7FF3 # +0xE3C9 0x664B 0x7FF9 # +0xE3CA 0x664C 0x98DC # +0xE3CB 0x664D 0x8006 # +0xE3CC 0x664E 0x8004 # +0xE3CD 0x664F 0x800B # +0xE3CE 0x6650 0x8012 # +0xE3CF 0x6651 0x8018 # +0xE3D0 0x6652 0x8019 # +0xE3D1 0x6653 0x801C # +0xE3D2 0x6654 0x8021 # +0xE3D3 0x6655 0x8028 # +0xE3D4 0x6656 0x803F # +0xE3D5 0x6657 0x803B # +0xE3D6 0x6658 0x804A # +0xE3D7 0x6659 0x8046 # +0xE3D8 0x665A 0x8052 # +0xE3D9 0x665B 0x8058 # +0xE3DA 0x665C 0x805A # +0xE3DB 0x665D 0x805F # +0xE3DC 0x665E 0x8062 # +0xE3DD 0x665F 0x8068 # +0xE3DE 0x6660 0x8073 # +0xE3DF 0x6661 0x8072 # +0xE3E0 0x6662 0x8070 # +0xE3E1 0x6663 0x8076 # +0xE3E2 0x6664 0x8079 # +0xE3E3 0x6665 0x807D # +0xE3E4 0x6666 0x807F # +0xE3E5 0x6667 0x8084 # +0xE3E6 0x6668 0x8086 # +0xE3E7 0x6669 0x8085 # +0xE3E8 0x666A 0x809B # +0xE3E9 0x666B 0x8093 # +0xE3EA 0x666C 0x809A # +0xE3EB 0x666D 0x80AD # +0xE3EC 0x666E 0x5190 # +0xE3ED 0x666F 0x80AC # +0xE3EE 0x6670 0x80DB # +0xE3EF 0x6671 0x80E5 # +0xE3F0 0x6672 0x80D9 # +0xE3F1 0x6673 0x80DD # +0xE3F2 0x6674 0x80C4 # +0xE3F3 0x6675 0x80DA # +0xE3F4 0x6676 0x80D6 # +0xE3F5 0x6677 0x8109 # +0xE3F6 0x6678 0x80EF # +0xE3F7 0x6679 0x80F1 # +0xE3F8 0x667A 0x811B # +0xE3F9 0x667B 0x8129 # +0xE3FA 0x667C 0x8123 # +0xE3FB 0x667D 0x812F # +0xE3FC 0x667E 0x814B # +0xE440 0x6721 0x968B # +0xE441 0x6722 0x8146 # +0xE442 0x6723 0x813E # +0xE443 0x6724 0x8153 # +0xE444 0x6725 0x8151 # +0xE445 0x6726 0x80FC # +0xE446 0x6727 0x8171 # +0xE447 0x6728 0x816E # +0xE448 0x6729 0x8165 # +0xE449 0x672A 0x8166 # +0xE44A 0x672B 0x8174 # +0xE44B 0x672C 0x8183 # +0xE44C 0x672D 0x8188 # +0xE44D 0x672E 0x818A # +0xE44E 0x672F 0x8180 # +0xE44F 0x6730 0x8182 # +0xE450 0x6731 0x81A0 # +0xE451 0x6732 0x8195 # +0xE452 0x6733 0x81A4 # +0xE453 0x6734 0x81A3 # +0xE454 0x6735 0x815F # +0xE455 0x6736 0x8193 # +0xE456 0x6737 0x81A9 # +0xE457 0x6738 0x81B0 # +0xE458 0x6739 0x81B5 # +0xE459 0x673A 0x81BE # +0xE45A 0x673B 0x81B8 # +0xE45B 0x673C 0x81BD # +0xE45C 0x673D 0x81C0 # +0xE45D 0x673E 0x81C2 # +0xE45E 0x673F 0x81BA # +0xE45F 0x6740 0x81C9 # +0xE460 0x6741 0x81CD # +0xE461 0x6742 0x81D1 # +0xE462 0x6743 0x81D9 # +0xE463 0x6744 0x81D8 # +0xE464 0x6745 0x81C8 # +0xE465 0x6746 0x81DA # +0xE466 0x6747 0x81DF # +0xE467 0x6748 0x81E0 # +0xE468 0x6749 0x81E7 # +0xE469 0x674A 0x81FA # +0xE46A 0x674B 0x81FB # +0xE46B 0x674C 0x81FE # +0xE46C 0x674D 0x8201 # +0xE46D 0x674E 0x8202 # +0xE46E 0x674F 0x8205 # +0xE46F 0x6750 0x8207 # +0xE470 0x6751 0x820A # +0xE471 0x6752 0x820D # +0xE472 0x6753 0x8210 # +0xE473 0x6754 0x8216 # +0xE474 0x6755 0x8229 # +0xE475 0x6756 0x822B # +0xE476 0x6757 0x8238 # +0xE477 0x6758 0x8233 # +0xE478 0x6759 0x8240 # +0xE479 0x675A 0x8259 # +0xE47A 0x675B 0x8258 # +0xE47B 0x675C 0x825D # +0xE47C 0x675D 0x825A # +0xE47D 0x675E 0x825F # +0xE47E 0x675F 0x8264 # +0xE480 0x6760 0x8262 # +0xE481 0x6761 0x8268 # +0xE482 0x6762 0x826A # +0xE483 0x6763 0x826B # +0xE484 0x6764 0x822E # +0xE485 0x6765 0x8271 # +0xE486 0x6766 0x8277 # +0xE487 0x6767 0x8278 # +0xE488 0x6768 0x827E # +0xE489 0x6769 0x828D # +0xE48A 0x676A 0x8292 # +0xE48B 0x676B 0x82AB # +0xE48C 0x676C 0x829F # +0xE48D 0x676D 0x82BB # +0xE48E 0x676E 0x82AC # +0xE48F 0x676F 0x82E1 # +0xE490 0x6770 0x82E3 # +0xE491 0x6771 0x82DF # +0xE492 0x6772 0x82D2 # +0xE493 0x6773 0x82F4 # +0xE494 0x6774 0x82F3 # +0xE495 0x6775 0x82FA # +0xE496 0x6776 0x8393 # +0xE497 0x6777 0x8303 # +0xE498 0x6778 0x82FB # +0xE499 0x6779 0x82F9 # +0xE49A 0x677A 0x82DE # +0xE49B 0x677B 0x8306 # +0xE49C 0x677C 0x82DC # +0xE49D 0x677D 0x8309 # +0xE49E 0x677E 0x82D9 # +0xE49F 0x6821 0x8335 # +0xE4A0 0x6822 0x8334 # +0xE4A1 0x6823 0x8316 # +0xE4A2 0x6824 0x8332 # +0xE4A3 0x6825 0x8331 # +0xE4A4 0x6826 0x8340 # +0xE4A5 0x6827 0x8339 # +0xE4A6 0x6828 0x8350 # +0xE4A7 0x6829 0x8345 # +0xE4A8 0x682A 0x832F # +0xE4A9 0x682B 0x832B # +0xE4AA 0x682C 0x8317 # +0xE4AB 0x682D 0x8318 # +0xE4AC 0x682E 0x8385 # +0xE4AD 0x682F 0x839A # +0xE4AE 0x6830 0x83AA # +0xE4AF 0x6831 0x839F # +0xE4B0 0x6832 0x83A2 # +0xE4B1 0x6833 0x8396 # +0xE4B2 0x6834 0x8323 # +0xE4B3 0x6835 0x838E # +0xE4B4 0x6836 0x8387 # +0xE4B5 0x6837 0x838A # +0xE4B6 0x6838 0x837C # +0xE4B7 0x6839 0x83B5 # +0xE4B8 0x683A 0x8373 # +0xE4B9 0x683B 0x8375 # +0xE4BA 0x683C 0x83A0 # +0xE4BB 0x683D 0x8389 # +0xE4BC 0x683E 0x83A8 # +0xE4BD 0x683F 0x83F4 # +0xE4BE 0x6840 0x8413 # +0xE4BF 0x6841 0x83EB # +0xE4C0 0x6842 0x83CE # +0xE4C1 0x6843 0x83FD # +0xE4C2 0x6844 0x8403 # +0xE4C3 0x6845 0x83D8 # +0xE4C4 0x6846 0x840B # +0xE4C5 0x6847 0x83C1 # +0xE4C6 0x6848 0x83F7 # +0xE4C7 0x6849 0x8407 # +0xE4C8 0x684A 0x83E0 # +0xE4C9 0x684B 0x83F2 # +0xE4CA 0x684C 0x840D # +0xE4CB 0x684D 0x8422 # +0xE4CC 0x684E 0x8420 # +0xE4CD 0x684F 0x83BD # +0xE4CE 0x6850 0x8438 # +0xE4CF 0x6851 0x8506 # +0xE4D0 0x6852 0x83FB # +0xE4D1 0x6853 0x846D # +0xE4D2 0x6854 0x842A # +0xE4D3 0x6855 0x843C # +0xE4D4 0x6856 0x855A # +0xE4D5 0x6857 0x8484 # +0xE4D6 0x6858 0x8477 # +0xE4D7 0x6859 0x846B # +0xE4D8 0x685A 0x84AD # +0xE4D9 0x685B 0x846E # +0xE4DA 0x685C 0x8482 # +0xE4DB 0x685D 0x8469 # +0xE4DC 0x685E 0x8446 # +0xE4DD 0x685F 0x842C # +0xE4DE 0x6860 0x846F # +0xE4DF 0x6861 0x8479 # +0xE4E0 0x6862 0x8435 # +0xE4E1 0x6863 0x84CA # +0xE4E2 0x6864 0x8462 # +0xE4E3 0x6865 0x84B9 # +0xE4E4 0x6866 0x84BF # +0xE4E5 0x6867 0x849F # +0xE4E6 0x6868 0x84D9 # +0xE4E7 0x6869 0x84CD # +0xE4E8 0x686A 0x84BB # +0xE4E9 0x686B 0x84DA # +0xE4EA 0x686C 0x84D0 # +0xE4EB 0x686D 0x84C1 # +0xE4EC 0x686E 0x84C6 # +0xE4ED 0x686F 0x84D6 # +0xE4EE 0x6870 0x84A1 # +0xE4EF 0x6871 0x8521 # +0xE4F0 0x6872 0x84FF # +0xE4F1 0x6873 0x84F4 # +0xE4F2 0x6874 0x8517 # +0xE4F3 0x6875 0x8518 # +0xE4F4 0x6876 0x852C # +0xE4F5 0x6877 0x851F # +0xE4F6 0x6878 0x8515 # +0xE4F7 0x6879 0x8514 # +0xE4F8 0x687A 0x84FC # +0xE4F9 0x687B 0x8540 # +0xE4FA 0x687C 0x8563 # +0xE4FB 0x687D 0x8558 # +0xE4FC 0x687E 0x8548 # +0xE540 0x6921 0x8541 # +0xE541 0x6922 0x8602 # +0xE542 0x6923 0x854B # +0xE543 0x6924 0x8555 # +0xE544 0x6925 0x8580 # +0xE545 0x6926 0x85A4 # +0xE546 0x6927 0x8588 # +0xE547 0x6928 0x8591 # +0xE548 0x6929 0x858A # +0xE549 0x692A 0x85A8 # +0xE54A 0x692B 0x856D # +0xE54B 0x692C 0x8594 # +0xE54C 0x692D 0x859B # +0xE54D 0x692E 0x85EA # +0xE54E 0x692F 0x8587 # +0xE54F 0x6930 0x859C # +0xE550 0x6931 0x8577 # +0xE551 0x6932 0x857E # +0xE552 0x6933 0x8590 # +0xE553 0x6934 0x85C9 # +0xE554 0x6935 0x85BA # +0xE555 0x6936 0x85CF # +0xE556 0x6937 0x85B9 # +0xE557 0x6938 0x85D0 # +0xE558 0x6939 0x85D5 # +0xE559 0x693A 0x85DD # +0xE55A 0x693B 0x85E5 # +0xE55B 0x693C 0x85DC # +0xE55C 0x693D 0x85F9 # +0xE55D 0x693E 0x860A # +0xE55E 0x693F 0x8613 # +0xE55F 0x6940 0x860B # +0xE560 0x6941 0x85FE # +0xE561 0x6942 0x85FA # +0xE562 0x6943 0x8606 # +0xE563 0x6944 0x8622 # +0xE564 0x6945 0x861A # +0xE565 0x6946 0x8630 # +0xE566 0x6947 0x863F # +0xE567 0x6948 0x864D # +0xE568 0x6949 0x4E55 # +0xE569 0x694A 0x8654 # +0xE56A 0x694B 0x865F # +0xE56B 0x694C 0x8667 # +0xE56C 0x694D 0x8671 # +0xE56D 0x694E 0x8693 # +0xE56E 0x694F 0x86A3 # +0xE56F 0x6950 0x86A9 # +0xE570 0x6951 0x86AA # +0xE571 0x6952 0x868B # +0xE572 0x6953 0x868C # +0xE573 0x6954 0x86B6 # +0xE574 0x6955 0x86AF # +0xE575 0x6956 0x86C4 # +0xE576 0x6957 0x86C6 # +0xE577 0x6958 0x86B0 # +0xE578 0x6959 0x86C9 # +0xE579 0x695A 0x8823 # +0xE57A 0x695B 0x86AB # +0xE57B 0x695C 0x86D4 # +0xE57C 0x695D 0x86DE # +0xE57D 0x695E 0x86E9 # +0xE57E 0x695F 0x86EC # +0xE580 0x6960 0x86DF # +0xE581 0x6961 0x86DB # +0xE582 0x6962 0x86EF # +0xE583 0x6963 0x8712 # +0xE584 0x6964 0x8706 # +0xE585 0x6965 0x8708 # +0xE586 0x6966 0x8700 # +0xE587 0x6967 0x8703 # +0xE588 0x6968 0x86FB # +0xE589 0x6969 0x8711 # +0xE58A 0x696A 0x8709 # +0xE58B 0x696B 0x870D # +0xE58C 0x696C 0x86F9 # +0xE58D 0x696D 0x870A # +0xE58E 0x696E 0x8734 # +0xE58F 0x696F 0x873F # +0xE590 0x6970 0x8737 # +0xE591 0x6971 0x873B # +0xE592 0x6972 0x8725 # +0xE593 0x6973 0x8729 # +0xE594 0x6974 0x871A # +0xE595 0x6975 0x8760 # +0xE596 0x6976 0x875F # +0xE597 0x6977 0x8778 # +0xE598 0x6978 0x874C # +0xE599 0x6979 0x874E # +0xE59A 0x697A 0x8774 # +0xE59B 0x697B 0x8757 # +0xE59C 0x697C 0x8768 # +0xE59D 0x697D 0x876E # +0xE59E 0x697E 0x8759 # +0xE59F 0x6A21 0x8753 # +0xE5A0 0x6A22 0x8763 # +0xE5A1 0x6A23 0x876A # +0xE5A2 0x6A24 0x8805 # +0xE5A3 0x6A25 0x87A2 # +0xE5A4 0x6A26 0x879F # +0xE5A5 0x6A27 0x8782 # +0xE5A6 0x6A28 0x87AF # +0xE5A7 0x6A29 0x87CB # +0xE5A8 0x6A2A 0x87BD # +0xE5A9 0x6A2B 0x87C0 # +0xE5AA 0x6A2C 0x87D0 # +0xE5AB 0x6A2D 0x96D6 # +0xE5AC 0x6A2E 0x87AB # +0xE5AD 0x6A2F 0x87C4 # +0xE5AE 0x6A30 0x87B3 # +0xE5AF 0x6A31 0x87C7 # +0xE5B0 0x6A32 0x87C6 # +0xE5B1 0x6A33 0x87BB # +0xE5B2 0x6A34 0x87EF # +0xE5B3 0x6A35 0x87F2 # +0xE5B4 0x6A36 0x87E0 # +0xE5B5 0x6A37 0x880F # +0xE5B6 0x6A38 0x880D # +0xE5B7 0x6A39 0x87FE # +0xE5B8 0x6A3A 0x87F6 # +0xE5B9 0x6A3B 0x87F7 # +0xE5BA 0x6A3C 0x880E # +0xE5BB 0x6A3D 0x87D2 # +0xE5BC 0x6A3E 0x8811 # +0xE5BD 0x6A3F 0x8816 # +0xE5BE 0x6A40 0x8815 # +0xE5BF 0x6A41 0x8822 # +0xE5C0 0x6A42 0x8821 # +0xE5C1 0x6A43 0x8831 # +0xE5C2 0x6A44 0x8836 # +0xE5C3 0x6A45 0x8839 # +0xE5C4 0x6A46 0x8827 # +0xE5C5 0x6A47 0x883B # +0xE5C6 0x6A48 0x8844 # +0xE5C7 0x6A49 0x8842 # +0xE5C8 0x6A4A 0x8852 # +0xE5C9 0x6A4B 0x8859 # +0xE5CA 0x6A4C 0x885E # +0xE5CB 0x6A4D 0x8862 # +0xE5CC 0x6A4E 0x886B # +0xE5CD 0x6A4F 0x8881 # +0xE5CE 0x6A50 0x887E # +0xE5CF 0x6A51 0x889E # +0xE5D0 0x6A52 0x8875 # +0xE5D1 0x6A53 0x887D # +0xE5D2 0x6A54 0x88B5 # +0xE5D3 0x6A55 0x8872 # +0xE5D4 0x6A56 0x8882 # +0xE5D5 0x6A57 0x8897 # +0xE5D6 0x6A58 0x8892 # +0xE5D7 0x6A59 0x88AE # +0xE5D8 0x6A5A 0x8899 # +0xE5D9 0x6A5B 0x88A2 # +0xE5DA 0x6A5C 0x888D # +0xE5DB 0x6A5D 0x88A4 # +0xE5DC 0x6A5E 0x88B0 # +0xE5DD 0x6A5F 0x88BF # +0xE5DE 0x6A60 0x88B1 # +0xE5DF 0x6A61 0x88C3 # +0xE5E0 0x6A62 0x88C4 # +0xE5E1 0x6A63 0x88D4 # +0xE5E2 0x6A64 0x88D8 # +0xE5E3 0x6A65 0x88D9 # +0xE5E4 0x6A66 0x88DD # +0xE5E5 0x6A67 0x88F9 # +0xE5E6 0x6A68 0x8902 # +0xE5E7 0x6A69 0x88FC # +0xE5E8 0x6A6A 0x88F4 # +0xE5E9 0x6A6B 0x88E8 # +0xE5EA 0x6A6C 0x88F2 # +0xE5EB 0x6A6D 0x8904 # +0xE5EC 0x6A6E 0x890C # +0xE5ED 0x6A6F 0x890A # +0xE5EE 0x6A70 0x8913 # +0xE5EF 0x6A71 0x8943 # +0xE5F0 0x6A72 0x891E # +0xE5F1 0x6A73 0x8925 # +0xE5F2 0x6A74 0x892A # +0xE5F3 0x6A75 0x892B # +0xE5F4 0x6A76 0x8941 # +0xE5F5 0x6A77 0x8944 # +0xE5F6 0x6A78 0x893B # +0xE5F7 0x6A79 0x8936 # +0xE5F8 0x6A7A 0x8938 # +0xE5F9 0x6A7B 0x894C # +0xE5FA 0x6A7C 0x891D # +0xE5FB 0x6A7D 0x8960 # +0xE5FC 0x6A7E 0x895E # +0xE640 0x6B21 0x8966 # +0xE641 0x6B22 0x8964 # +0xE642 0x6B23 0x896D # +0xE643 0x6B24 0x896A # +0xE644 0x6B25 0x896F # +0xE645 0x6B26 0x8974 # +0xE646 0x6B27 0x8977 # +0xE647 0x6B28 0x897E # +0xE648 0x6B29 0x8983 # +0xE649 0x6B2A 0x8988 # +0xE64A 0x6B2B 0x898A # +0xE64B 0x6B2C 0x8993 # +0xE64C 0x6B2D 0x8998 # +0xE64D 0x6B2E 0x89A1 # +0xE64E 0x6B2F 0x89A9 # +0xE64F 0x6B30 0x89A6 # +0xE650 0x6B31 0x89AC # +0xE651 0x6B32 0x89AF # +0xE652 0x6B33 0x89B2 # +0xE653 0x6B34 0x89BA # +0xE654 0x6B35 0x89BD # +0xE655 0x6B36 0x89BF # +0xE656 0x6B37 0x89C0 # +0xE657 0x6B38 0x89DA # +0xE658 0x6B39 0x89DC # +0xE659 0x6B3A 0x89DD # +0xE65A 0x6B3B 0x89E7 # +0xE65B 0x6B3C 0x89F4 # +0xE65C 0x6B3D 0x89F8 # +0xE65D 0x6B3E 0x8A03 # +0xE65E 0x6B3F 0x8A16 # +0xE65F 0x6B40 0x8A10 # +0xE660 0x6B41 0x8A0C # +0xE661 0x6B42 0x8A1B # +0xE662 0x6B43 0x8A1D # +0xE663 0x6B44 0x8A25 # +0xE664 0x6B45 0x8A36 # +0xE665 0x6B46 0x8A41 # +0xE666 0x6B47 0x8A5B # +0xE667 0x6B48 0x8A52 # +0xE668 0x6B49 0x8A46 # +0xE669 0x6B4A 0x8A48 # +0xE66A 0x6B4B 0x8A7C # +0xE66B 0x6B4C 0x8A6D # +0xE66C 0x6B4D 0x8A6C # +0xE66D 0x6B4E 0x8A62 # +0xE66E 0x6B4F 0x8A85 # +0xE66F 0x6B50 0x8A82 # +0xE670 0x6B51 0x8A84 # +0xE671 0x6B52 0x8AA8 # +0xE672 0x6B53 0x8AA1 # +0xE673 0x6B54 0x8A91 # +0xE674 0x6B55 0x8AA5 # +0xE675 0x6B56 0x8AA6 # +0xE676 0x6B57 0x8A9A # +0xE677 0x6B58 0x8AA3 # +0xE678 0x6B59 0x8AC4 # +0xE679 0x6B5A 0x8ACD # +0xE67A 0x6B5B 0x8AC2 # +0xE67B 0x6B5C 0x8ADA # +0xE67C 0x6B5D 0x8AEB # +0xE67D 0x6B5E 0x8AF3 # +0xE67E 0x6B5F 0x8AE7 # +0xE680 0x6B60 0x8AE4 # +0xE681 0x6B61 0x8AF1 # +0xE682 0x6B62 0x8B14 # +0xE683 0x6B63 0x8AE0 # +0xE684 0x6B64 0x8AE2 # +0xE685 0x6B65 0x8AF7 # +0xE686 0x6B66 0x8ADE # +0xE687 0x6B67 0x8ADB # +0xE688 0x6B68 0x8B0C # +0xE689 0x6B69 0x8B07 # +0xE68A 0x6B6A 0x8B1A # +0xE68B 0x6B6B 0x8AE1 # +0xE68C 0x6B6C 0x8B16 # +0xE68D 0x6B6D 0x8B10 # +0xE68E 0x6B6E 0x8B17 # +0xE68F 0x6B6F 0x8B20 # +0xE690 0x6B70 0x8B33 # +0xE691 0x6B71 0x97AB # +0xE692 0x6B72 0x8B26 # +0xE693 0x6B73 0x8B2B # +0xE694 0x6B74 0x8B3E # +0xE695 0x6B75 0x8B28 # +0xE696 0x6B76 0x8B41 # +0xE697 0x6B77 0x8B4C # +0xE698 0x6B78 0x8B4F # +0xE699 0x6B79 0x8B4E # +0xE69A 0x6B7A 0x8B49 # +0xE69B 0x6B7B 0x8B56 # +0xE69C 0x6B7C 0x8B5B # +0xE69D 0x6B7D 0x8B5A # +0xE69E 0x6B7E 0x8B6B # +0xE69F 0x6C21 0x8B5F # +0xE6A0 0x6C22 0x8B6C # +0xE6A1 0x6C23 0x8B6F # +0xE6A2 0x6C24 0x8B74 # +0xE6A3 0x6C25 0x8B7D # +0xE6A4 0x6C26 0x8B80 # +0xE6A5 0x6C27 0x8B8C # +0xE6A6 0x6C28 0x8B8E # +0xE6A7 0x6C29 0x8B92 # +0xE6A8 0x6C2A 0x8B93 # +0xE6A9 0x6C2B 0x8B96 # +0xE6AA 0x6C2C 0x8B99 # +0xE6AB 0x6C2D 0x8B9A # +0xE6AC 0x6C2E 0x8C3A # +0xE6AD 0x6C2F 0x8C41 # +0xE6AE 0x6C30 0x8C3F # +0xE6AF 0x6C31 0x8C48 # +0xE6B0 0x6C32 0x8C4C # +0xE6B1 0x6C33 0x8C4E # +0xE6B2 0x6C34 0x8C50 # +0xE6B3 0x6C35 0x8C55 # +0xE6B4 0x6C36 0x8C62 # +0xE6B5 0x6C37 0x8C6C # +0xE6B6 0x6C38 0x8C78 # +0xE6B7 0x6C39 0x8C7A # +0xE6B8 0x6C3A 0x8C82 # +0xE6B9 0x6C3B 0x8C89 # +0xE6BA 0x6C3C 0x8C85 # +0xE6BB 0x6C3D 0x8C8A # +0xE6BC 0x6C3E 0x8C8D # +0xE6BD 0x6C3F 0x8C8E # +0xE6BE 0x6C40 0x8C94 # +0xE6BF 0x6C41 0x8C7C # +0xE6C0 0x6C42 0x8C98 # +0xE6C1 0x6C43 0x621D # +0xE6C2 0x6C44 0x8CAD # +0xE6C3 0x6C45 0x8CAA # +0xE6C4 0x6C46 0x8CBD # +0xE6C5 0x6C47 0x8CB2 # +0xE6C6 0x6C48 0x8CB3 # +0xE6C7 0x6C49 0x8CAE # +0xE6C8 0x6C4A 0x8CB6 # +0xE6C9 0x6C4B 0x8CC8 # +0xE6CA 0x6C4C 0x8CC1 # +0xE6CB 0x6C4D 0x8CE4 # +0xE6CC 0x6C4E 0x8CE3 # +0xE6CD 0x6C4F 0x8CDA # +0xE6CE 0x6C50 0x8CFD # +0xE6CF 0x6C51 0x8CFA # +0xE6D0 0x6C52 0x8CFB # +0xE6D1 0x6C53 0x8D04 # +0xE6D2 0x6C54 0x8D05 # +0xE6D3 0x6C55 0x8D0A # +0xE6D4 0x6C56 0x8D07 # +0xE6D5 0x6C57 0x8D0F # +0xE6D6 0x6C58 0x8D0D # +0xE6D7 0x6C59 0x8D10 # +0xE6D8 0x6C5A 0x9F4E # +0xE6D9 0x6C5B 0x8D13 # +0xE6DA 0x6C5C 0x8CCD # +0xE6DB 0x6C5D 0x8D14 # +0xE6DC 0x6C5E 0x8D16 # +0xE6DD 0x6C5F 0x8D67 # +0xE6DE 0x6C60 0x8D6D # +0xE6DF 0x6C61 0x8D71 # +0xE6E0 0x6C62 0x8D73 # +0xE6E1 0x6C63 0x8D81 # +0xE6E2 0x6C64 0x8D99 # +0xE6E3 0x6C65 0x8DC2 # +0xE6E4 0x6C66 0x8DBE # +0xE6E5 0x6C67 0x8DBA # +0xE6E6 0x6C68 0x8DCF # +0xE6E7 0x6C69 0x8DDA # +0xE6E8 0x6C6A 0x8DD6 # +0xE6E9 0x6C6B 0x8DCC # +0xE6EA 0x6C6C 0x8DDB # +0xE6EB 0x6C6D 0x8DCB # +0xE6EC 0x6C6E 0x8DEA # +0xE6ED 0x6C6F 0x8DEB # +0xE6EE 0x6C70 0x8DDF # +0xE6EF 0x6C71 0x8DE3 # +0xE6F0 0x6C72 0x8DFC # +0xE6F1 0x6C73 0x8E08 # +0xE6F2 0x6C74 0x8E09 # +0xE6F3 0x6C75 0x8DFF # +0xE6F4 0x6C76 0x8E1D # +0xE6F5 0x6C77 0x8E1E # +0xE6F6 0x6C78 0x8E10 # +0xE6F7 0x6C79 0x8E1F # +0xE6F8 0x6C7A 0x8E42 # +0xE6F9 0x6C7B 0x8E35 # +0xE6FA 0x6C7C 0x8E30 # +0xE6FB 0x6C7D 0x8E34 # +0xE6FC 0x6C7E 0x8E4A # +0xE740 0x6D21 0x8E47 # +0xE741 0x6D22 0x8E49 # +0xE742 0x6D23 0x8E4C # +0xE743 0x6D24 0x8E50 # +0xE744 0x6D25 0x8E48 # +0xE745 0x6D26 0x8E59 # +0xE746 0x6D27 0x8E64 # +0xE747 0x6D28 0x8E60 # +0xE748 0x6D29 0x8E2A # +0xE749 0x6D2A 0x8E63 # +0xE74A 0x6D2B 0x8E55 # +0xE74B 0x6D2C 0x8E76 # +0xE74C 0x6D2D 0x8E72 # +0xE74D 0x6D2E 0x8E7C # +0xE74E 0x6D2F 0x8E81 # +0xE74F 0x6D30 0x8E87 # +0xE750 0x6D31 0x8E85 # +0xE751 0x6D32 0x8E84 # +0xE752 0x6D33 0x8E8B # +0xE753 0x6D34 0x8E8A # +0xE754 0x6D35 0x8E93 # +0xE755 0x6D36 0x8E91 # +0xE756 0x6D37 0x8E94 # +0xE757 0x6D38 0x8E99 # +0xE758 0x6D39 0x8EAA # +0xE759 0x6D3A 0x8EA1 # +0xE75A 0x6D3B 0x8EAC # +0xE75B 0x6D3C 0x8EB0 # +0xE75C 0x6D3D 0x8EC6 # +0xE75D 0x6D3E 0x8EB1 # +0xE75E 0x6D3F 0x8EBE # +0xE75F 0x6D40 0x8EC5 # +0xE760 0x6D41 0x8EC8 # +0xE761 0x6D42 0x8ECB # +0xE762 0x6D43 0x8EDB # +0xE763 0x6D44 0x8EE3 # +0xE764 0x6D45 0x8EFC # +0xE765 0x6D46 0x8EFB # +0xE766 0x6D47 0x8EEB # +0xE767 0x6D48 0x8EFE # +0xE768 0x6D49 0x8F0A # +0xE769 0x6D4A 0x8F05 # +0xE76A 0x6D4B 0x8F15 # +0xE76B 0x6D4C 0x8F12 # +0xE76C 0x6D4D 0x8F19 # +0xE76D 0x6D4E 0x8F13 # +0xE76E 0x6D4F 0x8F1C # +0xE76F 0x6D50 0x8F1F # +0xE770 0x6D51 0x8F1B # +0xE771 0x6D52 0x8F0C # +0xE772 0x6D53 0x8F26 # +0xE773 0x6D54 0x8F33 # +0xE774 0x6D55 0x8F3B # +0xE775 0x6D56 0x8F39 # +0xE776 0x6D57 0x8F45 # +0xE777 0x6D58 0x8F42 # +0xE778 0x6D59 0x8F3E # +0xE779 0x6D5A 0x8F4C # +0xE77A 0x6D5B 0x8F49 # +0xE77B 0x6D5C 0x8F46 # +0xE77C 0x6D5D 0x8F4E # +0xE77D 0x6D5E 0x8F57 # +0xE77E 0x6D5F 0x8F5C # +0xE780 0x6D60 0x8F62 # +0xE781 0x6D61 0x8F63 # +0xE782 0x6D62 0x8F64 # +0xE783 0x6D63 0x8F9C # +0xE784 0x6D64 0x8F9F # +0xE785 0x6D65 0x8FA3 # +0xE786 0x6D66 0x8FAD # +0xE787 0x6D67 0x8FAF # +0xE788 0x6D68 0x8FB7 # +0xE789 0x6D69 0x8FDA # +0xE78A 0x6D6A 0x8FE5 # +0xE78B 0x6D6B 0x8FE2 # +0xE78C 0x6D6C 0x8FEA # +0xE78D 0x6D6D 0x8FEF # +0xE78E 0x6D6E 0x9087 # +0xE78F 0x6D6F 0x8FF4 # +0xE790 0x6D70 0x9005 # +0xE791 0x6D71 0x8FF9 # +0xE792 0x6D72 0x8FFA # +0xE793 0x6D73 0x9011 # +0xE794 0x6D74 0x9015 # +0xE795 0x6D75 0x9021 # +0xE796 0x6D76 0x900D # +0xE797 0x6D77 0x901E # +0xE798 0x6D78 0x9016 # +0xE799 0x6D79 0x900B # +0xE79A 0x6D7A 0x9027 # +0xE79B 0x6D7B 0x9036 # +0xE79C 0x6D7C 0x9035 # +0xE79D 0x6D7D 0x9039 # +0xE79E 0x6D7E 0x8FF8 # +0xE79F 0x6E21 0x904F # +0xE7A0 0x6E22 0x9050 # +0xE7A1 0x6E23 0x9051 # +0xE7A2 0x6E24 0x9052 # +0xE7A3 0x6E25 0x900E # +0xE7A4 0x6E26 0x9049 # +0xE7A5 0x6E27 0x903E # +0xE7A6 0x6E28 0x9056 # +0xE7A7 0x6E29 0x9058 # +0xE7A8 0x6E2A 0x905E # +0xE7A9 0x6E2B 0x9068 # +0xE7AA 0x6E2C 0x906F # +0xE7AB 0x6E2D 0x9076 # +0xE7AC 0x6E2E 0x96A8 # +0xE7AD 0x6E2F 0x9072 # +0xE7AE 0x6E30 0x9082 # +0xE7AF 0x6E31 0x907D # +0xE7B0 0x6E32 0x9081 # +0xE7B1 0x6E33 0x9080 # +0xE7B2 0x6E34 0x908A # +0xE7B3 0x6E35 0x9089 # +0xE7B4 0x6E36 0x908F # +0xE7B5 0x6E37 0x90A8 # +0xE7B6 0x6E38 0x90AF # +0xE7B7 0x6E39 0x90B1 # +0xE7B8 0x6E3A 0x90B5 # +0xE7B9 0x6E3B 0x90E2 # +0xE7BA 0x6E3C 0x90E4 # +0xE7BB 0x6E3D 0x6248 # +0xE7BC 0x6E3E 0x90DB # +0xE7BD 0x6E3F 0x9102 # +0xE7BE 0x6E40 0x9112 # +0xE7BF 0x6E41 0x9119 # +0xE7C0 0x6E42 0x9132 # +0xE7C1 0x6E43 0x9130 # +0xE7C2 0x6E44 0x914A # +0xE7C3 0x6E45 0x9156 # +0xE7C4 0x6E46 0x9158 # +0xE7C5 0x6E47 0x9163 # +0xE7C6 0x6E48 0x9165 # +0xE7C7 0x6E49 0x9169 # +0xE7C8 0x6E4A 0x9173 # +0xE7C9 0x6E4B 0x9172 # +0xE7CA 0x6E4C 0x918B # +0xE7CB 0x6E4D 0x9189 # +0xE7CC 0x6E4E 0x9182 # +0xE7CD 0x6E4F 0x91A2 # +0xE7CE 0x6E50 0x91AB # +0xE7CF 0x6E51 0x91AF # +0xE7D0 0x6E52 0x91AA # +0xE7D1 0x6E53 0x91B5 # +0xE7D2 0x6E54 0x91B4 # +0xE7D3 0x6E55 0x91BA # +0xE7D4 0x6E56 0x91C0 # +0xE7D5 0x6E57 0x91C1 # +0xE7D6 0x6E58 0x91C9 # +0xE7D7 0x6E59 0x91CB # +0xE7D8 0x6E5A 0x91D0 # +0xE7D9 0x6E5B 0x91D6 # +0xE7DA 0x6E5C 0x91DF # +0xE7DB 0x6E5D 0x91E1 # +0xE7DC 0x6E5E 0x91DB # +0xE7DD 0x6E5F 0x91FC # +0xE7DE 0x6E60 0x91F5 # +0xE7DF 0x6E61 0x91F6 # +0xE7E0 0x6E62 0x921E # +0xE7E1 0x6E63 0x91FF # +0xE7E2 0x6E64 0x9214 # +0xE7E3 0x6E65 0x922C # +0xE7E4 0x6E66 0x9215 # +0xE7E5 0x6E67 0x9211 # +0xE7E6 0x6E68 0x925E # +0xE7E7 0x6E69 0x9257 # +0xE7E8 0x6E6A 0x9245 # +0xE7E9 0x6E6B 0x9249 # +0xE7EA 0x6E6C 0x9264 # +0xE7EB 0x6E6D 0x9248 # +0xE7EC 0x6E6E 0x9295 # +0xE7ED 0x6E6F 0x923F # +0xE7EE 0x6E70 0x924B # +0xE7EF 0x6E71 0x9250 # +0xE7F0 0x6E72 0x929C # +0xE7F1 0x6E73 0x9296 # +0xE7F2 0x6E74 0x9293 # +0xE7F3 0x6E75 0x929B # +0xE7F4 0x6E76 0x925A # +0xE7F5 0x6E77 0x92CF # +0xE7F6 0x6E78 0x92B9 # +0xE7F7 0x6E79 0x92B7 # +0xE7F8 0x6E7A 0x92E9 # +0xE7F9 0x6E7B 0x930F # +0xE7FA 0x6E7C 0x92FA # +0xE7FB 0x6E7D 0x9344 # +0xE7FC 0x6E7E 0x932E # +0xE840 0x6F21 0x9319 # +0xE841 0x6F22 0x9322 # +0xE842 0x6F23 0x931A # +0xE843 0x6F24 0x9323 # +0xE844 0x6F25 0x933A # +0xE845 0x6F26 0x9335 # +0xE846 0x6F27 0x933B # +0xE847 0x6F28 0x935C # +0xE848 0x6F29 0x9360 # +0xE849 0x6F2A 0x937C # +0xE84A 0x6F2B 0x936E # +0xE84B 0x6F2C 0x9356 # +0xE84C 0x6F2D 0x93B0 # +0xE84D 0x6F2E 0x93AC # +0xE84E 0x6F2F 0x93AD # +0xE84F 0x6F30 0x9394 # +0xE850 0x6F31 0x93B9 # +0xE851 0x6F32 0x93D6 # +0xE852 0x6F33 0x93D7 # +0xE853 0x6F34 0x93E8 # +0xE854 0x6F35 0x93E5 # +0xE855 0x6F36 0x93D8 # +0xE856 0x6F37 0x93C3 # +0xE857 0x6F38 0x93DD # +0xE858 0x6F39 0x93D0 # +0xE859 0x6F3A 0x93C8 # +0xE85A 0x6F3B 0x93E4 # +0xE85B 0x6F3C 0x941A # +0xE85C 0x6F3D 0x9414 # +0xE85D 0x6F3E 0x9413 # +0xE85E 0x6F3F 0x9403 # +0xE85F 0x6F40 0x9407 # +0xE860 0x6F41 0x9410 # +0xE861 0x6F42 0x9436 # +0xE862 0x6F43 0x942B # +0xE863 0x6F44 0x9435 # +0xE864 0x6F45 0x9421 # +0xE865 0x6F46 0x943A # +0xE866 0x6F47 0x9441 # +0xE867 0x6F48 0x9452 # +0xE868 0x6F49 0x9444 # +0xE869 0x6F4A 0x945B # +0xE86A 0x6F4B 0x9460 # +0xE86B 0x6F4C 0x9462 # +0xE86C 0x6F4D 0x945E # +0xE86D 0x6F4E 0x946A # +0xE86E 0x6F4F 0x9229 # +0xE86F 0x6F50 0x9470 # +0xE870 0x6F51 0x9475 # +0xE871 0x6F52 0x9477 # +0xE872 0x6F53 0x947D # +0xE873 0x6F54 0x945A # +0xE874 0x6F55 0x947C # +0xE875 0x6F56 0x947E # +0xE876 0x6F57 0x9481 # +0xE877 0x6F58 0x947F # +0xE878 0x6F59 0x9582 # +0xE879 0x6F5A 0x9587 # +0xE87A 0x6F5B 0x958A # +0xE87B 0x6F5C 0x9594 # +0xE87C 0x6F5D 0x9596 # +0xE87D 0x6F5E 0x9598 # +0xE87E 0x6F5F 0x9599 # +0xE880 0x6F60 0x95A0 # +0xE881 0x6F61 0x95A8 # +0xE882 0x6F62 0x95A7 # +0xE883 0x6F63 0x95AD # +0xE884 0x6F64 0x95BC # +0xE885 0x6F65 0x95BB # +0xE886 0x6F66 0x95B9 # +0xE887 0x6F67 0x95BE # +0xE888 0x6F68 0x95CA # +0xE889 0x6F69 0x6FF6 # +0xE88A 0x6F6A 0x95C3 # +0xE88B 0x6F6B 0x95CD # +0xE88C 0x6F6C 0x95CC # +0xE88D 0x6F6D 0x95D5 # +0xE88E 0x6F6E 0x95D4 # +0xE88F 0x6F6F 0x95D6 # +0xE890 0x6F70 0x95DC # +0xE891 0x6F71 0x95E1 # +0xE892 0x6F72 0x95E5 # +0xE893 0x6F73 0x95E2 # +0xE894 0x6F74 0x9621 # +0xE895 0x6F75 0x9628 # +0xE896 0x6F76 0x962E # +0xE897 0x6F77 0x962F # +0xE898 0x6F78 0x9642 # +0xE899 0x6F79 0x964C # +0xE89A 0x6F7A 0x964F # +0xE89B 0x6F7B 0x964B # +0xE89C 0x6F7C 0x9677 # +0xE89D 0x6F7D 0x965C # +0xE89E 0x6F7E 0x965E # +0xE89F 0x7021 0x965D # +0xE8A0 0x7022 0x965F # +0xE8A1 0x7023 0x9666 # +0xE8A2 0x7024 0x9672 # +0xE8A3 0x7025 0x966C # +0xE8A4 0x7026 0x968D # +0xE8A5 0x7027 0x9698 # +0xE8A6 0x7028 0x9695 # +0xE8A7 0x7029 0x9697 # +0xE8A8 0x702A 0x96AA # +0xE8A9 0x702B 0x96A7 # +0xE8AA 0x702C 0x96B1 # +0xE8AB 0x702D 0x96B2 # +0xE8AC 0x702E 0x96B0 # +0xE8AD 0x702F 0x96B4 # +0xE8AE 0x7030 0x96B6 # +0xE8AF 0x7031 0x96B8 # +0xE8B0 0x7032 0x96B9 # +0xE8B1 0x7033 0x96CE # +0xE8B2 0x7034 0x96CB # +0xE8B3 0x7035 0x96C9 # +0xE8B4 0x7036 0x96CD # +0xE8B5 0x7037 0x894D # +0xE8B6 0x7038 0x96DC # +0xE8B7 0x7039 0x970D # +0xE8B8 0x703A 0x96D5 # +0xE8B9 0x703B 0x96F9 # +0xE8BA 0x703C 0x9704 # +0xE8BB 0x703D 0x9706 # +0xE8BC 0x703E 0x9708 # +0xE8BD 0x703F 0x9713 # +0xE8BE 0x7040 0x970E # +0xE8BF 0x7041 0x9711 # +0xE8C0 0x7042 0x970F # +0xE8C1 0x7043 0x9716 # +0xE8C2 0x7044 0x9719 # +0xE8C3 0x7045 0x9724 # +0xE8C4 0x7046 0x972A # +0xE8C5 0x7047 0x9730 # +0xE8C6 0x7048 0x9739 # +0xE8C7 0x7049 0x973D # +0xE8C8 0x704A 0x973E # +0xE8C9 0x704B 0x9744 # +0xE8CA 0x704C 0x9746 # +0xE8CB 0x704D 0x9748 # +0xE8CC 0x704E 0x9742 # +0xE8CD 0x704F 0x9749 # +0xE8CE 0x7050 0x975C # +0xE8CF 0x7051 0x9760 # +0xE8D0 0x7052 0x9764 # +0xE8D1 0x7053 0x9766 # +0xE8D2 0x7054 0x9768 # +0xE8D3 0x7055 0x52D2 # +0xE8D4 0x7056 0x976B # +0xE8D5 0x7057 0x9771 # +0xE8D6 0x7058 0x9779 # +0xE8D7 0x7059 0x9785 # +0xE8D8 0x705A 0x977C # +0xE8D9 0x705B 0x9781 # +0xE8DA 0x705C 0x977A # +0xE8DB 0x705D 0x9786 # +0xE8DC 0x705E 0x978B # +0xE8DD 0x705F 0x978F # +0xE8DE 0x7060 0x9790 # +0xE8DF 0x7061 0x979C # +0xE8E0 0x7062 0x97A8 # +0xE8E1 0x7063 0x97A6 # +0xE8E2 0x7064 0x97A3 # +0xE8E3 0x7065 0x97B3 # +0xE8E4 0x7066 0x97B4 # +0xE8E5 0x7067 0x97C3 # +0xE8E6 0x7068 0x97C6 # +0xE8E7 0x7069 0x97C8 # +0xE8E8 0x706A 0x97CB # +0xE8E9 0x706B 0x97DC # +0xE8EA 0x706C 0x97ED # +0xE8EB 0x706D 0x9F4F # +0xE8EC 0x706E 0x97F2 # +0xE8ED 0x706F 0x7ADF # +0xE8EE 0x7070 0x97F6 # +0xE8EF 0x7071 0x97F5 # +0xE8F0 0x7072 0x980F # +0xE8F1 0x7073 0x980C # +0xE8F2 0x7074 0x9838 # +0xE8F3 0x7075 0x9824 # +0xE8F4 0x7076 0x9821 # +0xE8F5 0x7077 0x9837 # +0xE8F6 0x7078 0x983D # +0xE8F7 0x7079 0x9846 # +0xE8F8 0x707A 0x984F # +0xE8F9 0x707B 0x984B # +0xE8FA 0x707C 0x986B # +0xE8FB 0x707D 0x986F # +0xE8FC 0x707E 0x9870 # +0xE940 0x7121 0x9871 # +0xE941 0x7122 0x9874 # +0xE942 0x7123 0x9873 # +0xE943 0x7124 0x98AA # +0xE944 0x7125 0x98AF # +0xE945 0x7126 0x98B1 # +0xE946 0x7127 0x98B6 # +0xE947 0x7128 0x98C4 # +0xE948 0x7129 0x98C3 # +0xE949 0x712A 0x98C6 # +0xE94A 0x712B 0x98E9 # +0xE94B 0x712C 0x98EB # +0xE94C 0x712D 0x9903 # +0xE94D 0x712E 0x9909 # +0xE94E 0x712F 0x9912 # +0xE94F 0x7130 0x9914 # +0xE950 0x7131 0x9918 # +0xE951 0x7132 0x9921 # +0xE952 0x7133 0x991D # +0xE953 0x7134 0x991E # +0xE954 0x7135 0x9924 # +0xE955 0x7136 0x9920 # +0xE956 0x7137 0x992C # +0xE957 0x7138 0x992E # +0xE958 0x7139 0x993D # +0xE959 0x713A 0x993E # +0xE95A 0x713B 0x9942 # +0xE95B 0x713C 0x9949 # +0xE95C 0x713D 0x9945 # +0xE95D 0x713E 0x9950 # +0xE95E 0x713F 0x994B # +0xE95F 0x7140 0x9951 # +0xE960 0x7141 0x9952 # +0xE961 0x7142 0x994C # +0xE962 0x7143 0x9955 # +0xE963 0x7144 0x9997 # +0xE964 0x7145 0x9998 # +0xE965 0x7146 0x99A5 # +0xE966 0x7147 0x99AD # +0xE967 0x7148 0x99AE # +0xE968 0x7149 0x99BC # +0xE969 0x714A 0x99DF # +0xE96A 0x714B 0x99DB # +0xE96B 0x714C 0x99DD # +0xE96C 0x714D 0x99D8 # +0xE96D 0x714E 0x99D1 # +0xE96E 0x714F 0x99ED # +0xE96F 0x7150 0x99EE # +0xE970 0x7151 0x99F1 # +0xE971 0x7152 0x99F2 # +0xE972 0x7153 0x99FB # +0xE973 0x7154 0x99F8 # +0xE974 0x7155 0x9A01 # +0xE975 0x7156 0x9A0F # +0xE976 0x7157 0x9A05 # +0xE977 0x7158 0x99E2 # +0xE978 0x7159 0x9A19 # +0xE979 0x715A 0x9A2B # +0xE97A 0x715B 0x9A37 # +0xE97B 0x715C 0x9A45 # +0xE97C 0x715D 0x9A42 # +0xE97D 0x715E 0x9A40 # +0xE97E 0x715F 0x9A43 # +0xE980 0x7160 0x9A3E # +0xE981 0x7161 0x9A55 # +0xE982 0x7162 0x9A4D # +0xE983 0x7163 0x9A5B # +0xE984 0x7164 0x9A57 # +0xE985 0x7165 0x9A5F # +0xE986 0x7166 0x9A62 # +0xE987 0x7167 0x9A65 # +0xE988 0x7168 0x9A64 # +0xE989 0x7169 0x9A69 # +0xE98A 0x716A 0x9A6B # +0xE98B 0x716B 0x9A6A # +0xE98C 0x716C 0x9AAD # +0xE98D 0x716D 0x9AB0 # +0xE98E 0x716E 0x9ABC # +0xE98F 0x716F 0x9AC0 # +0xE990 0x7170 0x9ACF # +0xE991 0x7171 0x9AD1 # +0xE992 0x7172 0x9AD3 # +0xE993 0x7173 0x9AD4 # +0xE994 0x7174 0x9ADE # +0xE995 0x7175 0x9ADF # +0xE996 0x7176 0x9AE2 # +0xE997 0x7177 0x9AE3 # +0xE998 0x7178 0x9AE6 # +0xE999 0x7179 0x9AEF # +0xE99A 0x717A 0x9AEB # +0xE99B 0x717B 0x9AEE # +0xE99C 0x717C 0x9AF4 # +0xE99D 0x717D 0x9AF1 # +0xE99E 0x717E 0x9AF7 # +0xE99F 0x7221 0x9AFB # +0xE9A0 0x7222 0x9B06 # +0xE9A1 0x7223 0x9B18 # +0xE9A2 0x7224 0x9B1A # +0xE9A3 0x7225 0x9B1F # +0xE9A4 0x7226 0x9B22 # +0xE9A5 0x7227 0x9B23 # +0xE9A6 0x7228 0x9B25 # +0xE9A7 0x7229 0x9B27 # +0xE9A8 0x722A 0x9B28 # +0xE9A9 0x722B 0x9B29 # +0xE9AA 0x722C 0x9B2A # +0xE9AB 0x722D 0x9B2E # +0xE9AC 0x722E 0x9B2F # +0xE9AD 0x722F 0x9B32 # +0xE9AE 0x7230 0x9B44 # +0xE9AF 0x7231 0x9B43 # +0xE9B0 0x7232 0x9B4F # +0xE9B1 0x7233 0x9B4D # +0xE9B2 0x7234 0x9B4E # +0xE9B3 0x7235 0x9B51 # +0xE9B4 0x7236 0x9B58 # +0xE9B5 0x7237 0x9B74 # +0xE9B6 0x7238 0x9B93 # +0xE9B7 0x7239 0x9B83 # +0xE9B8 0x723A 0x9B91 # +0xE9B9 0x723B 0x9B96 # +0xE9BA 0x723C 0x9B97 # +0xE9BB 0x723D 0x9B9F # +0xE9BC 0x723E 0x9BA0 # +0xE9BD 0x723F 0x9BA8 # +0xE9BE 0x7240 0x9BB4 # +0xE9BF 0x7241 0x9BC0 # +0xE9C0 0x7242 0x9BCA # +0xE9C1 0x7243 0x9BB9 # +0xE9C2 0x7244 0x9BC6 # +0xE9C3 0x7245 0x9BCF # +0xE9C4 0x7246 0x9BD1 # +0xE9C5 0x7247 0x9BD2 # +0xE9C6 0x7248 0x9BE3 # +0xE9C7 0x7249 0x9BE2 # +0xE9C8 0x724A 0x9BE4 # +0xE9C9 0x724B 0x9BD4 # +0xE9CA 0x724C 0x9BE1 # +0xE9CB 0x724D 0x9C3A # +0xE9CC 0x724E 0x9BF2 # +0xE9CD 0x724F 0x9BF1 # +0xE9CE 0x7250 0x9BF0 # +0xE9CF 0x7251 0x9C15 # +0xE9D0 0x7252 0x9C14 # +0xE9D1 0x7253 0x9C09 # +0xE9D2 0x7254 0x9C13 # +0xE9D3 0x7255 0x9C0C # +0xE9D4 0x7256 0x9C06 # +0xE9D5 0x7257 0x9C08 # +0xE9D6 0x7258 0x9C12 # +0xE9D7 0x7259 0x9C0A # +0xE9D8 0x725A 0x9C04 # +0xE9D9 0x725B 0x9C2E # +0xE9DA 0x725C 0x9C1B # +0xE9DB 0x725D 0x9C25 # +0xE9DC 0x725E 0x9C24 # +0xE9DD 0x725F 0x9C21 # +0xE9DE 0x7260 0x9C30 # +0xE9DF 0x7261 0x9C47 # +0xE9E0 0x7262 0x9C32 # +0xE9E1 0x7263 0x9C46 # +0xE9E2 0x7264 0x9C3E # +0xE9E3 0x7265 0x9C5A # +0xE9E4 0x7266 0x9C60 # +0xE9E5 0x7267 0x9C67 # +0xE9E6 0x7268 0x9C76 # +0xE9E7 0x7269 0x9C78 # +0xE9E8 0x726A 0x9CE7 # +0xE9E9 0x726B 0x9CEC # +0xE9EA 0x726C 0x9CF0 # +0xE9EB 0x726D 0x9D09 # +0xE9EC 0x726E 0x9D08 # +0xE9ED 0x726F 0x9CEB # +0xE9EE 0x7270 0x9D03 # +0xE9EF 0x7271 0x9D06 # +0xE9F0 0x7272 0x9D2A # +0xE9F1 0x7273 0x9D26 # +0xE9F2 0x7274 0x9DAF # +0xE9F3 0x7275 0x9D23 # +0xE9F4 0x7276 0x9D1F # +0xE9F5 0x7277 0x9D44 # +0xE9F6 0x7278 0x9D15 # +0xE9F7 0x7279 0x9D12 # +0xE9F8 0x727A 0x9D41 # +0xE9F9 0x727B 0x9D3F # +0xE9FA 0x727C 0x9D3E # +0xE9FB 0x727D 0x9D46 # +0xE9FC 0x727E 0x9D48 # +0xEA40 0x7321 0x9D5D # +0xEA41 0x7322 0x9D5E # +0xEA42 0x7323 0x9D64 # +0xEA43 0x7324 0x9D51 # +0xEA44 0x7325 0x9D50 # +0xEA45 0x7326 0x9D59 # +0xEA46 0x7327 0x9D72 # +0xEA47 0x7328 0x9D89 # +0xEA48 0x7329 0x9D87 # +0xEA49 0x732A 0x9DAB # +0xEA4A 0x732B 0x9D6F # +0xEA4B 0x732C 0x9D7A # +0xEA4C 0x732D 0x9D9A # +0xEA4D 0x732E 0x9DA4 # +0xEA4E 0x732F 0x9DA9 # +0xEA4F 0x7330 0x9DB2 # +0xEA50 0x7331 0x9DC4 # +0xEA51 0x7332 0x9DC1 # +0xEA52 0x7333 0x9DBB # +0xEA53 0x7334 0x9DB8 # +0xEA54 0x7335 0x9DBA # +0xEA55 0x7336 0x9DC6 # +0xEA56 0x7337 0x9DCF # +0xEA57 0x7338 0x9DC2 # +0xEA58 0x7339 0x9DD9 # +0xEA59 0x733A 0x9DD3 # +0xEA5A 0x733B 0x9DF8 # +0xEA5B 0x733C 0x9DE6 # +0xEA5C 0x733D 0x9DED # +0xEA5D 0x733E 0x9DEF # +0xEA5E 0x733F 0x9DFD # +0xEA5F 0x7340 0x9E1A # +0xEA60 0x7341 0x9E1B # +0xEA61 0x7342 0x9E1E # +0xEA62 0x7343 0x9E75 # +0xEA63 0x7344 0x9E79 # +0xEA64 0x7345 0x9E7D # +0xEA65 0x7346 0x9E81 # +0xEA66 0x7347 0x9E88 # +0xEA67 0x7348 0x9E8B # +0xEA68 0x7349 0x9E8C # +0xEA69 0x734A 0x9E92 # +0xEA6A 0x734B 0x9E95 # +0xEA6B 0x734C 0x9E91 # +0xEA6C 0x734D 0x9E9D # +0xEA6D 0x734E 0x9EA5 # +0xEA6E 0x734F 0x9EA9 # +0xEA6F 0x7350 0x9EB8 # +0xEA70 0x7351 0x9EAA # +0xEA71 0x7352 0x9EAD # +0xEA72 0x7353 0x9761 # +0xEA73 0x7354 0x9ECC # +0xEA74 0x7355 0x9ECE # +0xEA75 0x7356 0x9ECF # +0xEA76 0x7357 0x9ED0 # +0xEA77 0x7358 0x9ED4 # +0xEA78 0x7359 0x9EDC # +0xEA79 0x735A 0x9EDE # +0xEA7A 0x735B 0x9EDD # +0xEA7B 0x735C 0x9EE0 # +0xEA7C 0x735D 0x9EE5 # +0xEA7D 0x735E 0x9EE8 # +0xEA7E 0x735F 0x9EEF # +0xEA80 0x7360 0x9EF4 # +0xEA81 0x7361 0x9EF6 # +0xEA82 0x7362 0x9EF7 # +0xEA83 0x7363 0x9EF9 # +0xEA84 0x7364 0x9EFB # +0xEA85 0x7365 0x9EFC # +0xEA86 0x7366 0x9EFD # +0xEA87 0x7367 0x9F07 # +0xEA88 0x7368 0x9F08 # +0xEA89 0x7369 0x76B7 # +0xEA8A 0x736A 0x9F15 # +0xEA8B 0x736B 0x9F21 # +0xEA8C 0x736C 0x9F2C # +0xEA8D 0x736D 0x9F3E # +0xEA8E 0x736E 0x9F4A # +0xEA8F 0x736F 0x9F52 # +0xEA90 0x7370 0x9F54 # +0xEA91 0x7371 0x9F63 # +0xEA92 0x7372 0x9F5F # +0xEA93 0x7373 0x9F60 # +0xEA94 0x7374 0x9F61 # +0xEA95 0x7375 0x9F66 # +0xEA96 0x7376 0x9F67 # +0xEA97 0x7377 0x9F6C # +0xEA98 0x7378 0x9F6A # +0xEA99 0x7379 0x9F77 # +0xEA9A 0x737A 0x9F72 # +0xEA9B 0x737B 0x9F76 # +0xEA9C 0x737C 0x9F95 # +0xEA9D 0x737D 0x9F9C # +0xEA9E 0x737E 0x9FA0 # +0xEA9F 0x7421 0x582F # +0xEAA0 0x7422 0x69C7 # +0xEAA1 0x7423 0x9059 # +0xEAA2 0x7424 0x7464 # +0xEAA3 0x7425 0x51DC # +0xEAA4 0x7426 0x7199 # diff --git a/Tools/unicode/python-mappings/JIS0212.TXT b/Tools/unicode/python-mappings/JIS0212.TXT new file mode 100644 index 0000000000000..ae35ecacdc2b0 --- /dev/null +++ b/Tools/unicode/python-mappings/JIS0212.TXT @@ -0,0 +1,6144 @@ +# JIS0212.TXT +# Date: 2015-12-02 23:51:00 GMT [KW] +# ? 2015 Unicode?, Inc. +# For terms of use, see http://www.unicode.org/terms_of_use.html +# +# Name: JIS X 0212 (1990) to Unicode +# Unicode version: 1.1 +# Table version: 2.0 +# Table format: Format A +# Date: 2011 October 14 (header updated: 2015 December 02) +# +# General notes: +# +# +# This table contains one set of mappings from JIS X 0212 into Unicode. +# Note that these data are *possible* mappings only and may not be the +# same as those used by actual products, nor may they be the best suited +# for all uses. For more information on the mappings between various code +# pages incorporating the repertoire of JIS X 0212 and Unicode, consult the +# VENDORS mapping data. +# +# +# Format: Three tab-separated columns +# Column #1 is the JIS X 0212 code (in hex as 0xXXXX) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 the Unicode name (follows a comment sign, '#') +# The official names for Unicode characters U+4E00 +# to U+9FA5, inclusive, is "CJK UNIFIED IDEOGRAPH-XXXX", +# where XXXX is the code point. Including all these +# names in this file increases its size substantially +# and needlessly. The token "" is used for the +# name of these characters. If necessary, it can be +# expanded algorithmically by a parser or editor. +# +# The entries are in JIS X 0212 order +# +# The following algorithms can be used to change the hex form +# of JIS 0212 to other standard forms: +# +# To change hex to EUC form, add 0x8080 +# To change hex to kuten form, first subtract 0x2020. Then +# the high and low bytes correspond to the ku and ten of +# the kuten form. For example, 0x2121 -> 0x0101 -> 0101; +# 0x6D63 -> 0x4D43 -> 7767 +# +# Notes: +# +# 1. JIS X 0212 apparently unified the following two symbols +# into a single character at 0x2922: +# +# LATIN CAPITAL LETTER D WITH STROKE +# LATIN CAPITAL LETTER ETH +# +# However, JIS X 0212 maintains the distinction between +# the lowercase forms of these two elements at 0x2942 and 0x2943. +# Given the structre of these JIS encodings, it is clear that +# 0x2922 and 0x2942 are intended to be a capital/small pair. +# Consequently, in the Unicode mapping, 0x2922 is treated as +# LATIN CAPITAL LETTER D WITH STROKE. +# +# Revision History: +# +# [v2.0, 2015 December 02] +# updates to copyright notice and terms of use +# no changes to character mappings +# +# [v1.0, 2011 October 14] +# Updated terms of use to current wording. +# Updated contact information. +# No changes to the mapping data. +# +# [v0.9, 8 March 1994] +# First release. +# +# Use the Unicode reporting form +# for any questions or comments or to report errors in the data. +# +0x222F 0x02D8 # BREVE +0x2230 0x02C7 # CARON (Mandarin Chinese third tone) +0x2231 0x00B8 # CEDILLA +0x2232 0x02D9 # DOT ABOVE (Mandarin Chinese light tone) +0x2233 0x02DD # DOUBLE ACUTE ACCENT +0x2234 0x00AF # MACRON +0x2235 0x02DB # OGONEK +0x2236 0x02DA # RING ABOVE +0x2237 0x007E # TILDE +0x2238 0x0384 # GREEK TONOS +0x2239 0x0385 # GREEK DIALYTIKA TONOS +0x2242 0x00A1 # INVERTED EXCLAMATION MARK +0x2243 0x00A6 # BROKEN BAR +0x2244 0x00BF # INVERTED QUESTION MARK +0x226B 0x00BA # MASCULINE ORDINAL INDICATOR +0x226C 0x00AA # FEMININE ORDINAL INDICATOR +0x226D 0x00A9 # COPYRIGHT SIGN +0x226E 0x00AE # REGISTERED SIGN +0x226F 0x2122 # TRADE MARK SIGN +0x2270 0x00A4 # CURRENCY SIGN +0x2271 0x2116 # NUMERO SIGN +0x2661 0x0386 # GREEK CAPITAL LETTER ALPHA WITH TONOS +0x2662 0x0388 # GREEK CAPITAL LETTER EPSILON WITH TONOS +0x2663 0x0389 # GREEK CAPITAL LETTER ETA WITH TONOS +0x2664 0x038A # GREEK CAPITAL LETTER IOTA WITH TONOS +0x2665 0x03AA # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA +0x2667 0x038C # GREEK CAPITAL LETTER OMICRON WITH TONOS +0x2669 0x038E # GREEK CAPITAL LETTER UPSILON WITH TONOS +0x266A 0x03AB # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA +0x266C 0x038F # GREEK CAPITAL LETTER OMEGA WITH TONOS +0x2671 0x03AC # GREEK SMALL LETTER ALPHA WITH TONOS +0x2672 0x03AD # GREEK SMALL LETTER EPSILON WITH TONOS +0x2673 0x03AE # GREEK SMALL LETTER ETA WITH TONOS +0x2674 0x03AF # GREEK SMALL LETTER IOTA WITH TONOS +0x2675 0x03CA # GREEK SMALL LETTER IOTA WITH DIALYTIKA +0x2676 0x0390 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS +0x2677 0x03CC # GREEK SMALL LETTER OMICRON WITH TONOS +0x2678 0x03C2 # GREEK SMALL LETTER FINAL SIGMA +0x2679 0x03CD # GREEK SMALL LETTER UPSILON WITH TONOS +0x267A 0x03CB # GREEK SMALL LETTER UPSILON WITH DIALYTIKA +0x267B 0x03B0 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS +0x267C 0x03CE # GREEK SMALL LETTER OMEGA WITH TONOS +0x2742 0x0402 # CYRILLIC CAPITAL LETTER DJE +0x2743 0x0403 # CYRILLIC CAPITAL LETTER GJE +0x2744 0x0404 # CYRILLIC CAPITAL LETTER UKRAINIAN IE +0x2745 0x0405 # CYRILLIC CAPITAL LETTER DZE +0x2746 0x0406 # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I +0x2747 0x0407 # CYRILLIC CAPITAL LETTER YI +0x2748 0x0408 # CYRILLIC CAPITAL LETTER JE +0x2749 0x0409 # CYRILLIC CAPITAL LETTER LJE +0x274A 0x040A # CYRILLIC CAPITAL LETTER NJE +0x274B 0x040B # CYRILLIC CAPITAL LETTER TSHE +0x274C 0x040C # CYRILLIC CAPITAL LETTER KJE +0x274D 0x040E # CYRILLIC CAPITAL LETTER SHORT U +0x274E 0x040F # CYRILLIC CAPITAL LETTER DZHE +0x2772 0x0452 # CYRILLIC SMALL LETTER DJE +0x2773 0x0453 # CYRILLIC SMALL LETTER GJE +0x2774 0x0454 # CYRILLIC SMALL LETTER UKRAINIAN IE +0x2775 0x0455 # CYRILLIC SMALL LETTER DZE +0x2776 0x0456 # CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I +0x2777 0x0457 # CYRILLIC SMALL LETTER YI +0x2778 0x0458 # CYRILLIC SMALL LETTER JE +0x2779 0x0459 # CYRILLIC SMALL LETTER LJE +0x277A 0x045A # CYRILLIC SMALL LETTER NJE +0x277B 0x045B # CYRILLIC SMALL LETTER TSHE +0x277C 0x045C # CYRILLIC SMALL LETTER KJE +0x277D 0x045E # CYRILLIC SMALL LETTER SHORT U +0x277E 0x045F # CYRILLIC SMALL LETTER DZHE +0x2921 0x00C6 # LATIN CAPITAL LIGATURE AE +0x2922 0x0110 # LATIN CAPITAL LETTER D WITH STROKE +0x2924 0x0126 # LATIN CAPITAL LETTER H WITH STROKE +0x2926 0x0132 # LATIN CAPITAL LIGATURE IJ +0x2928 0x0141 # LATIN CAPITAL LETTER L WITH STROKE +0x2929 0x013F # LATIN CAPITAL LETTER L WITH MIDDLE DOT +0x292B 0x014A # LATIN CAPITAL LETTER ENG +0x292C 0x00D8 # LATIN CAPITAL LETTER O WITH STROKE +0x292D 0x0152 # LATIN CAPITAL LIGATURE OE +0x292F 0x0166 # LATIN CAPITAL LETTER T WITH STROKE +0x2930 0x00DE # LATIN CAPITAL LETTER THORN +0x2941 0x00E6 # LATIN SMALL LIGATURE AE +0x2942 0x0111 # LATIN SMALL LETTER D WITH STROKE +0x2943 0x00F0 # LATIN SMALL LETTER ETH +0x2944 0x0127 # LATIN SMALL LETTER H WITH STROKE +0x2945 0x0131 # LATIN SMALL LETTER DOTLESS I +0x2946 0x0133 # LATIN SMALL LIGATURE IJ +0x2947 0x0138 # LATIN SMALL LETTER KRA +0x2948 0x0142 # LATIN SMALL LETTER L WITH STROKE +0x2949 0x0140 # LATIN SMALL LETTER L WITH MIDDLE DOT +0x294A 0x0149 # LATIN SMALL LETTER N PRECEDED BY APOSTROPHE +0x294B 0x014B # LATIN SMALL LETTER ENG +0x294C 0x00F8 # LATIN SMALL LETTER O WITH STROKE +0x294D 0x0153 # LATIN SMALL LIGATURE OE +0x294E 0x00DF # LATIN SMALL LETTER SHARP S +0x294F 0x0167 # LATIN SMALL LETTER T WITH STROKE +0x2950 0x00FE # LATIN SMALL LETTER THORN +0x2A21 0x00C1 # LATIN CAPITAL LETTER A WITH ACUTE +0x2A22 0x00C0 # LATIN CAPITAL LETTER A WITH GRAVE +0x2A23 0x00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS +0x2A24 0x00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX +0x2A25 0x0102 # LATIN CAPITAL LETTER A WITH BREVE +0x2A26 0x01CD # LATIN CAPITAL LETTER A WITH CARON +0x2A27 0x0100 # LATIN CAPITAL LETTER A WITH MACRON +0x2A28 0x0104 # LATIN CAPITAL LETTER A WITH OGONEK +0x2A29 0x00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE +0x2A2A 0x00C3 # LATIN CAPITAL LETTER A WITH TILDE +0x2A2B 0x0106 # LATIN CAPITAL LETTER C WITH ACUTE +0x2A2C 0x0108 # LATIN CAPITAL LETTER C WITH CIRCUMFLEX +0x2A2D 0x010C # LATIN CAPITAL LETTER C WITH CARON +0x2A2E 0x00C7 # LATIN CAPITAL LETTER C WITH CEDILLA +0x2A2F 0x010A # LATIN CAPITAL LETTER C WITH DOT ABOVE +0x2A30 0x010E # LATIN CAPITAL LETTER D WITH CARON +0x2A31 0x00C9 # LATIN CAPITAL LETTER E WITH ACUTE +0x2A32 0x00C8 # LATIN CAPITAL LETTER E WITH GRAVE +0x2A33 0x00CB # LATIN CAPITAL LETTER E WITH DIAERESIS +0x2A34 0x00CA # LATIN CAPITAL LETTER E WITH CIRCUMFLEX +0x2A35 0x011A # LATIN CAPITAL LETTER E WITH CARON +0x2A36 0x0116 # LATIN CAPITAL LETTER E WITH DOT ABOVE +0x2A37 0x0112 # LATIN CAPITAL LETTER E WITH MACRON +0x2A38 0x0118 # LATIN CAPITAL LETTER E WITH OGONEK +0x2A3A 0x011C # LATIN CAPITAL LETTER G WITH CIRCUMFLEX +0x2A3B 0x011E # LATIN CAPITAL LETTER G WITH BREVE +0x2A3C 0x0122 # LATIN CAPITAL LETTER G WITH CEDILLA +0x2A3D 0x0120 # LATIN CAPITAL LETTER G WITH DOT ABOVE +0x2A3E 0x0124 # LATIN CAPITAL LETTER H WITH CIRCUMFLEX +0x2A3F 0x00CD # LATIN CAPITAL LETTER I WITH ACUTE +0x2A40 0x00CC # LATIN CAPITAL LETTER I WITH GRAVE +0x2A41 0x00CF # LATIN CAPITAL LETTER I WITH DIAERESIS +0x2A42 0x00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX +0x2A43 0x01CF # LATIN CAPITAL LETTER I WITH CARON +0x2A44 0x0130 # LATIN CAPITAL LETTER I WITH DOT ABOVE +0x2A45 0x012A # LATIN CAPITAL LETTER I WITH MACRON +0x2A46 0x012E # LATIN CAPITAL LETTER I WITH OGONEK +0x2A47 0x0128 # LATIN CAPITAL LETTER I WITH TILDE +0x2A48 0x0134 # LATIN CAPITAL LETTER J WITH CIRCUMFLEX +0x2A49 0x0136 # LATIN CAPITAL LETTER K WITH CEDILLA +0x2A4A 0x0139 # LATIN CAPITAL LETTER L WITH ACUTE +0x2A4B 0x013D # LATIN CAPITAL LETTER L WITH CARON +0x2A4C 0x013B # LATIN CAPITAL LETTER L WITH CEDILLA +0x2A4D 0x0143 # LATIN CAPITAL LETTER N WITH ACUTE +0x2A4E 0x0147 # LATIN CAPITAL LETTER N WITH CARON +0x2A4F 0x0145 # LATIN CAPITAL LETTER N WITH CEDILLA +0x2A50 0x00D1 # LATIN CAPITAL LETTER N WITH TILDE +0x2A51 0x00D3 # LATIN CAPITAL LETTER O WITH ACUTE +0x2A52 0x00D2 # LATIN CAPITAL LETTER O WITH GRAVE +0x2A53 0x00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS +0x2A54 0x00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX +0x2A55 0x01D1 # LATIN CAPITAL LETTER O WITH CARON +0x2A56 0x0150 # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE +0x2A57 0x014C # LATIN CAPITAL LETTER O WITH MACRON +0x2A58 0x00D5 # LATIN CAPITAL LETTER O WITH TILDE +0x2A59 0x0154 # LATIN CAPITAL LETTER R WITH ACUTE +0x2A5A 0x0158 # LATIN CAPITAL LETTER R WITH CARON +0x2A5B 0x0156 # LATIN CAPITAL LETTER R WITH CEDILLA +0x2A5C 0x015A # LATIN CAPITAL LETTER S WITH ACUTE +0x2A5D 0x015C # LATIN CAPITAL LETTER S WITH CIRCUMFLEX +0x2A5E 0x0160 # LATIN CAPITAL LETTER S WITH CARON +0x2A5F 0x015E # LATIN CAPITAL LETTER S WITH CEDILLA +0x2A60 0x0164 # LATIN CAPITAL LETTER T WITH CARON +0x2A61 0x0162 # LATIN CAPITAL LETTER T WITH CEDILLA +0x2A62 0x00DA # LATIN CAPITAL LETTER U WITH ACUTE +0x2A63 0x00D9 # LATIN CAPITAL LETTER U WITH GRAVE +0x2A64 0x00DC # LATIN CAPITAL LETTER U WITH DIAERESIS +0x2A65 0x00DB # LATIN CAPITAL LETTER U WITH CIRCUMFLEX +0x2A66 0x016C # LATIN CAPITAL LETTER U WITH BREVE +0x2A67 0x01D3 # LATIN CAPITAL LETTER U WITH CARON +0x2A68 0x0170 # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE +0x2A69 0x016A # LATIN CAPITAL LETTER U WITH MACRON +0x2A6A 0x0172 # LATIN CAPITAL LETTER U WITH OGONEK +0x2A6B 0x016E # LATIN CAPITAL LETTER U WITH RING ABOVE +0x2A6C 0x0168 # LATIN CAPITAL LETTER U WITH TILDE +0x2A6D 0x01D7 # LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE +0x2A6E 0x01DB # LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE +0x2A6F 0x01D9 # LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON +0x2A70 0x01D5 # LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON +0x2A71 0x0174 # LATIN CAPITAL LETTER W WITH CIRCUMFLEX +0x2A72 0x00DD # LATIN CAPITAL LETTER Y WITH ACUTE +0x2A73 0x0178 # LATIN CAPITAL LETTER Y WITH DIAERESIS +0x2A74 0x0176 # LATIN CAPITAL LETTER Y WITH CIRCUMFLEX +0x2A75 0x0179 # LATIN CAPITAL LETTER Z WITH ACUTE +0x2A76 0x017D # LATIN CAPITAL LETTER Z WITH CARON +0x2A77 0x017B # LATIN CAPITAL LETTER Z WITH DOT ABOVE +0x2B21 0x00E1 # LATIN SMALL LETTER A WITH ACUTE +0x2B22 0x00E0 # LATIN SMALL LETTER A WITH GRAVE +0x2B23 0x00E4 # LATIN SMALL LETTER A WITH DIAERESIS +0x2B24 0x00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX +0x2B25 0x0103 # LATIN SMALL LETTER A WITH BREVE +0x2B26 0x01CE # LATIN SMALL LETTER A WITH CARON +0x2B27 0x0101 # LATIN SMALL LETTER A WITH MACRON +0x2B28 0x0105 # LATIN SMALL LETTER A WITH OGONEK +0x2B29 0x00E5 # LATIN SMALL LETTER A WITH RING ABOVE +0x2B2A 0x00E3 # LATIN SMALL LETTER A WITH TILDE +0x2B2B 0x0107 # LATIN SMALL LETTER C WITH ACUTE +0x2B2C 0x0109 # LATIN SMALL LETTER C WITH CIRCUMFLEX +0x2B2D 0x010D # LATIN SMALL LETTER C WITH CARON +0x2B2E 0x00E7 # LATIN SMALL LETTER C WITH CEDILLA +0x2B2F 0x010B # LATIN SMALL LETTER C WITH DOT ABOVE +0x2B30 0x010F # LATIN SMALL LETTER D WITH CARON +0x2B31 0x00E9 # LATIN SMALL LETTER E WITH ACUTE +0x2B32 0x00E8 # LATIN SMALL LETTER E WITH GRAVE +0x2B33 0x00EB # LATIN SMALL LETTER E WITH DIAERESIS +0x2B34 0x00EA # LATIN SMALL LETTER E WITH CIRCUMFLEX +0x2B35 0x011B # LATIN SMALL LETTER E WITH CARON +0x2B36 0x0117 # LATIN SMALL LETTER E WITH DOT ABOVE +0x2B37 0x0113 # LATIN SMALL LETTER E WITH MACRON +0x2B38 0x0119 # LATIN SMALL LETTER E WITH OGONEK +0x2B39 0x01F5 # LATIN SMALL LETTER G WITH ACUTE +0x2B3A 0x011D # LATIN SMALL LETTER G WITH CIRCUMFLEX +0x2B3B 0x011F # LATIN SMALL LETTER G WITH BREVE +0x2B3D 0x0121 # LATIN SMALL LETTER G WITH DOT ABOVE +0x2B3E 0x0125 # LATIN SMALL LETTER H WITH CIRCUMFLEX +0x2B3F 0x00ED # LATIN SMALL LETTER I WITH ACUTE +0x2B40 0x00EC # LATIN SMALL LETTER I WITH GRAVE +0x2B41 0x00EF # LATIN SMALL LETTER I WITH DIAERESIS +0x2B42 0x00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX +0x2B43 0x01D0 # LATIN SMALL LETTER I WITH CARON +0x2B45 0x012B # LATIN SMALL LETTER I WITH MACRON +0x2B46 0x012F # LATIN SMALL LETTER I WITH OGONEK +0x2B47 0x0129 # LATIN SMALL LETTER I WITH TILDE +0x2B48 0x0135 # LATIN SMALL LETTER J WITH CIRCUMFLEX +0x2B49 0x0137 # LATIN SMALL LETTER K WITH CEDILLA +0x2B4A 0x013A # LATIN SMALL LETTER L WITH ACUTE +0x2B4B 0x013E # LATIN SMALL LETTER L WITH CARON +0x2B4C 0x013C # LATIN SMALL LETTER L WITH CEDILLA +0x2B4D 0x0144 # LATIN SMALL LETTER N WITH ACUTE +0x2B4E 0x0148 # LATIN SMALL LETTER N WITH CARON +0x2B4F 0x0146 # LATIN SMALL LETTER N WITH CEDILLA +0x2B50 0x00F1 # LATIN SMALL LETTER N WITH TILDE +0x2B51 0x00F3 # LATIN SMALL LETTER O WITH ACUTE +0x2B52 0x00F2 # LATIN SMALL LETTER O WITH GRAVE +0x2B53 0x00F6 # LATIN SMALL LETTER O WITH DIAERESIS +0x2B54 0x00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX +0x2B55 0x01D2 # LATIN SMALL LETTER O WITH CARON +0x2B56 0x0151 # LATIN SMALL LETTER O WITH DOUBLE ACUTE +0x2B57 0x014D # LATIN SMALL LETTER O WITH MACRON +0x2B58 0x00F5 # LATIN SMALL LETTER O WITH TILDE +0x2B59 0x0155 # LATIN SMALL LETTER R WITH ACUTE +0x2B5A 0x0159 # LATIN SMALL LETTER R WITH CARON +0x2B5B 0x0157 # LATIN SMALL LETTER R WITH CEDILLA +0x2B5C 0x015B # LATIN SMALL LETTER S WITH ACUTE +0x2B5D 0x015D # LATIN SMALL LETTER S WITH CIRCUMFLEX +0x2B5E 0x0161 # LATIN SMALL LETTER S WITH CARON +0x2B5F 0x015F # LATIN SMALL LETTER S WITH CEDILLA +0x2B60 0x0165 # LATIN SMALL LETTER T WITH CARON +0x2B61 0x0163 # LATIN SMALL LETTER T WITH CEDILLA +0x2B62 0x00FA # LATIN SMALL LETTER U WITH ACUTE +0x2B63 0x00F9 # LATIN SMALL LETTER U WITH GRAVE +0x2B64 0x00FC # LATIN SMALL LETTER U WITH DIAERESIS +0x2B65 0x00FB # LATIN SMALL LETTER U WITH CIRCUMFLEX +0x2B66 0x016D # LATIN SMALL LETTER U WITH BREVE +0x2B67 0x01D4 # LATIN SMALL LETTER U WITH CARON +0x2B68 0x0171 # LATIN SMALL LETTER U WITH DOUBLE ACUTE +0x2B69 0x016B # LATIN SMALL LETTER U WITH MACRON +0x2B6A 0x0173 # LATIN SMALL LETTER U WITH OGONEK +0x2B6B 0x016F # LATIN SMALL LETTER U WITH RING ABOVE +0x2B6C 0x0169 # LATIN SMALL LETTER U WITH TILDE +0x2B6D 0x01D8 # LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE +0x2B6E 0x01DC # LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE +0x2B6F 0x01DA # LATIN SMALL LETTER U WITH DIAERESIS AND CARON +0x2B70 0x01D6 # LATIN SMALL LETTER U WITH DIAERESIS AND MACRON +0x2B71 0x0175 # LATIN SMALL LETTER W WITH CIRCUMFLEX +0x2B72 0x00FD # LATIN SMALL LETTER Y WITH ACUTE +0x2B73 0x00FF # LATIN SMALL LETTER Y WITH DIAERESIS +0x2B74 0x0177 # LATIN SMALL LETTER Y WITH CIRCUMFLEX +0x2B75 0x017A # LATIN SMALL LETTER Z WITH ACUTE +0x2B76 0x017E # LATIN SMALL LETTER Z WITH CARON +0x2B77 0x017C # LATIN SMALL LETTER Z WITH DOT ABOVE +0x3021 0x4E02 # +0x3022 0x4E04 # +0x3023 0x4E05 # +0x3024 0x4E0C # +0x3025 0x4E12 # +0x3026 0x4E1F # +0x3027 0x4E23 # +0x3028 0x4E24 # +0x3029 0x4E28 # +0x302A 0x4E2B # +0x302B 0x4E2E # +0x302C 0x4E2F # +0x302D 0x4E30 # +0x302E 0x4E35 # +0x302F 0x4E40 # +0x3030 0x4E41 # +0x3031 0x4E44 # +0x3032 0x4E47 # +0x3033 0x4E51 # +0x3034 0x4E5A # +0x3035 0x4E5C # +0x3036 0x4E63 # +0x3037 0x4E68 # +0x3038 0x4E69 # +0x3039 0x4E74 # +0x303A 0x4E75 # +0x303B 0x4E79 # +0x303C 0x4E7F # +0x303D 0x4E8D # +0x303E 0x4E96 # +0x303F 0x4E97 # +0x3040 0x4E9D # +0x3041 0x4EAF # +0x3042 0x4EB9 # +0x3043 0x4EC3 # +0x3044 0x4ED0 # +0x3045 0x4EDA # +0x3046 0x4EDB # +0x3047 0x4EE0 # +0x3048 0x4EE1 # +0x3049 0x4EE2 # +0x304A 0x4EE8 # +0x304B 0x4EEF # +0x304C 0x4EF1 # +0x304D 0x4EF3 # +0x304E 0x4EF5 # +0x304F 0x4EFD # +0x3050 0x4EFE # +0x3051 0x4EFF # +0x3052 0x4F00 # +0x3053 0x4F02 # +0x3054 0x4F03 # +0x3055 0x4F08 # +0x3056 0x4F0B # +0x3057 0x4F0C # +0x3058 0x4F12 # +0x3059 0x4F15 # +0x305A 0x4F16 # +0x305B 0x4F17 # +0x305C 0x4F19 # +0x305D 0x4F2E # +0x305E 0x4F31 # +0x305F 0x4F60 # +0x3060 0x4F33 # +0x3061 0x4F35 # +0x3062 0x4F37 # +0x3063 0x4F39 # +0x3064 0x4F3B # +0x3065 0x4F3E # +0x3066 0x4F40 # +0x3067 0x4F42 # +0x3068 0x4F48 # +0x3069 0x4F49 # +0x306A 0x4F4B # +0x306B 0x4F4C # +0x306C 0x4F52 # +0x306D 0x4F54 # +0x306E 0x4F56 # +0x306F 0x4F58 # +0x3070 0x4F5F # +0x3071 0x4F63 # +0x3072 0x4F6A # +0x3073 0x4F6C # +0x3074 0x4F6E # +0x3075 0x4F71 # +0x3076 0x4F77 # +0x3077 0x4F78 # +0x3078 0x4F79 # +0x3079 0x4F7A # +0x307A 0x4F7D # +0x307B 0x4F7E # +0x307C 0x4F81 # +0x307D 0x4F82 # +0x307E 0x4F84 # +0x3121 0x4F85 # +0x3122 0x4F89 # +0x3123 0x4F8A # +0x3124 0x4F8C # +0x3125 0x4F8E # +0x3126 0x4F90 # +0x3127 0x4F92 # +0x3128 0x4F93 # +0x3129 0x4F94 # +0x312A 0x4F97 # +0x312B 0x4F99 # +0x312C 0x4F9A # +0x312D 0x4F9E # +0x312E 0x4F9F # +0x312F 0x4FB2 # +0x3130 0x4FB7 # +0x3131 0x4FB9 # +0x3132 0x4FBB # +0x3133 0x4FBC # +0x3134 0x4FBD # +0x3135 0x4FBE # +0x3136 0x4FC0 # +0x3137 0x4FC1 # +0x3138 0x4FC5 # +0x3139 0x4FC6 # +0x313A 0x4FC8 # +0x313B 0x4FC9 # +0x313C 0x4FCB # +0x313D 0x4FCC # +0x313E 0x4FCD # +0x313F 0x4FCF # +0x3140 0x4FD2 # +0x3141 0x4FDC # +0x3142 0x4FE0 # +0x3143 0x4FE2 # +0x3144 0x4FF0 # +0x3145 0x4FF2 # +0x3146 0x4FFC # +0x3147 0x4FFD # +0x3148 0x4FFF # +0x3149 0x5000 # +0x314A 0x5001 # +0x314B 0x5004 # +0x314C 0x5007 # +0x314D 0x500A # +0x314E 0x500C # +0x314F 0x500E # +0x3150 0x5010 # +0x3151 0x5013 # +0x3152 0x5017 # +0x3153 0x5018 # +0x3154 0x501B # +0x3155 0x501C # +0x3156 0x501D # +0x3157 0x501E # +0x3158 0x5022 # +0x3159 0x5027 # +0x315A 0x502E # +0x315B 0x5030 # +0x315C 0x5032 # +0x315D 0x5033 # +0x315E 0x5035 # +0x315F 0x5040 # +0x3160 0x5041 # +0x3161 0x5042 # +0x3162 0x5045 # +0x3163 0x5046 # +0x3164 0x504A # +0x3165 0x504C # +0x3166 0x504E # +0x3167 0x5051 # +0x3168 0x5052 # +0x3169 0x5053 # +0x316A 0x5057 # +0x316B 0x5059 # +0x316C 0x505F # +0x316D 0x5060 # +0x316E 0x5062 # +0x316F 0x5063 # +0x3170 0x5066 # +0x3171 0x5067 # +0x3172 0x506A # +0x3173 0x506D # +0x3174 0x5070 # +0x3175 0x5071 # +0x3176 0x503B # +0x3177 0x5081 # +0x3178 0x5083 # +0x3179 0x5084 # +0x317A 0x5086 # +0x317B 0x508A # +0x317C 0x508E # +0x317D 0x508F # +0x317E 0x5090 # +0x3221 0x5092 # +0x3222 0x5093 # +0x3223 0x5094 # +0x3224 0x5096 # +0x3225 0x509B # +0x3226 0x509C # +0x3227 0x509E # +0x3228 0x509F # +0x3229 0x50A0 # +0x322A 0x50A1 # +0x322B 0x50A2 # +0x322C 0x50AA # +0x322D 0x50AF # +0x322E 0x50B0 # +0x322F 0x50B9 # +0x3230 0x50BA # +0x3231 0x50BD # +0x3232 0x50C0 # +0x3233 0x50C3 # +0x3234 0x50C4 # +0x3235 0x50C7 # +0x3236 0x50CC # +0x3237 0x50CE # +0x3238 0x50D0 # +0x3239 0x50D3 # +0x323A 0x50D4 # +0x323B 0x50D8 # +0x323C 0x50DC # +0x323D 0x50DD # +0x323E 0x50DF # +0x323F 0x50E2 # +0x3240 0x50E4 # +0x3241 0x50E6 # +0x3242 0x50E8 # +0x3243 0x50E9 # +0x3244 0x50EF # +0x3245 0x50F1 # +0x3246 0x50F6 # +0x3247 0x50FA # +0x3248 0x50FE # +0x3249 0x5103 # +0x324A 0x5106 # +0x324B 0x5107 # +0x324C 0x5108 # +0x324D 0x510B # +0x324E 0x510C # +0x324F 0x510D # +0x3250 0x510E # +0x3251 0x50F2 # +0x3252 0x5110 # +0x3253 0x5117 # +0x3254 0x5119 # +0x3255 0x511B # +0x3256 0x511C # +0x3257 0x511D # +0x3258 0x511E # +0x3259 0x5123 # +0x325A 0x5127 # +0x325B 0x5128 # +0x325C 0x512C # +0x325D 0x512D # +0x325E 0x512F # +0x325F 0x5131 # +0x3260 0x5133 # +0x3261 0x5134 # +0x3262 0x5135 # +0x3263 0x5138 # +0x3264 0x5139 # +0x3265 0x5142 # +0x3266 0x514A # +0x3267 0x514F # +0x3268 0x5153 # +0x3269 0x5155 # +0x326A 0x5157 # +0x326B 0x5158 # +0x326C 0x515F # +0x326D 0x5164 # +0x326E 0x5166 # +0x326F 0x517E # +0x3270 0x5183 # +0x3271 0x5184 # +0x3272 0x518B # +0x3273 0x518E # +0x3274 0x5198 # +0x3275 0x519D # +0x3276 0x51A1 # +0x3277 0x51A3 # +0x3278 0x51AD # +0x3279 0x51B8 # +0x327A 0x51BA # +0x327B 0x51BC # +0x327C 0x51BE # +0x327D 0x51BF # +0x327E 0x51C2 # +0x3321 0x51C8 # +0x3322 0x51CF # +0x3323 0x51D1 # +0x3324 0x51D2 # +0x3325 0x51D3 # +0x3326 0x51D5 # +0x3327 0x51D8 # +0x3328 0x51DE # +0x3329 0x51E2 # +0x332A 0x51E5 # +0x332B 0x51EE # +0x332C 0x51F2 # +0x332D 0x51F3 # +0x332E 0x51F4 # +0x332F 0x51F7 # +0x3330 0x5201 # +0x3331 0x5202 # +0x3332 0x5205 # +0x3333 0x5212 # +0x3334 0x5213 # +0x3335 0x5215 # +0x3336 0x5216 # +0x3337 0x5218 # +0x3338 0x5222 # +0x3339 0x5228 # +0x333A 0x5231 # +0x333B 0x5232 # +0x333C 0x5235 # +0x333D 0x523C # +0x333E 0x5245 # +0x333F 0x5249 # +0x3340 0x5255 # +0x3341 0x5257 # +0x3342 0x5258 # +0x3343 0x525A # +0x3344 0x525C # +0x3345 0x525F # +0x3346 0x5260 # +0x3347 0x5261 # +0x3348 0x5266 # +0x3349 0x526E # +0x334A 0x5277 # +0x334B 0x5278 # +0x334C 0x5279 # +0x334D 0x5280 # +0x334E 0x5282 # +0x334F 0x5285 # +0x3350 0x528A # +0x3351 0x528C # +0x3352 0x5293 # +0x3353 0x5295 # +0x3354 0x5296 # +0x3355 0x5297 # +0x3356 0x5298 # +0x3357 0x529A # +0x3358 0x529C # +0x3359 0x52A4 # +0x335A 0x52A5 # +0x335B 0x52A6 # +0x335C 0x52A7 # +0x335D 0x52AF # +0x335E 0x52B0 # +0x335F 0x52B6 # +0x3360 0x52B7 # +0x3361 0x52B8 # +0x3362 0x52BA # +0x3363 0x52BB # +0x3364 0x52BD # +0x3365 0x52C0 # +0x3366 0x52C4 # +0x3367 0x52C6 # +0x3368 0x52C8 # +0x3369 0x52CC # +0x336A 0x52CF # +0x336B 0x52D1 # +0x336C 0x52D4 # +0x336D 0x52D6 # +0x336E 0x52DB # +0x336F 0x52DC # +0x3370 0x52E1 # +0x3371 0x52E5 # +0x3372 0x52E8 # +0x3373 0x52E9 # +0x3374 0x52EA # +0x3375 0x52EC # +0x3376 0x52F0 # +0x3377 0x52F1 # +0x3378 0x52F4 # +0x3379 0x52F6 # +0x337A 0x52F7 # +0x337B 0x5300 # +0x337C 0x5303 # +0x337D 0x530A # +0x337E 0x530B # +0x3421 0x530C # +0x3422 0x5311 # +0x3423 0x5313 # +0x3424 0x5318 # +0x3425 0x531B # +0x3426 0x531C # +0x3427 0x531E # +0x3428 0x531F # +0x3429 0x5325 # +0x342A 0x5327 # +0x342B 0x5328 # +0x342C 0x5329 # +0x342D 0x532B # +0x342E 0x532C # +0x342F 0x532D # +0x3430 0x5330 # +0x3431 0x5332 # +0x3432 0x5335 # +0x3433 0x533C # +0x3434 0x533D # +0x3435 0x533E # +0x3436 0x5342 # +0x3437 0x534C # +0x3438 0x534B # +0x3439 0x5359 # +0x343A 0x535B # +0x343B 0x5361 # +0x343C 0x5363 # +0x343D 0x5365 # +0x343E 0x536C # +0x343F 0x536D # +0x3440 0x5372 # +0x3441 0x5379 # +0x3442 0x537E # +0x3443 0x5383 # +0x3444 0x5387 # +0x3445 0x5388 # +0x3446 0x538E # +0x3447 0x5393 # +0x3448 0x5394 # +0x3449 0x5399 # +0x344A 0x539D # +0x344B 0x53A1 # +0x344C 0x53A4 # +0x344D 0x53AA # +0x344E 0x53AB # +0x344F 0x53AF # +0x3450 0x53B2 # +0x3451 0x53B4 # +0x3452 0x53B5 # +0x3453 0x53B7 # +0x3454 0x53B8 # +0x3455 0x53BA # +0x3456 0x53BD # +0x3457 0x53C0 # +0x3458 0x53C5 # +0x3459 0x53CF # +0x345A 0x53D2 # +0x345B 0x53D3 # +0x345C 0x53D5 # +0x345D 0x53DA # +0x345E 0x53DD # +0x345F 0x53DE # +0x3460 0x53E0 # +0x3461 0x53E6 # +0x3462 0x53E7 # +0x3463 0x53F5 # +0x3464 0x5402 # +0x3465 0x5413 # +0x3466 0x541A # +0x3467 0x5421 # +0x3468 0x5427 # +0x3469 0x5428 # +0x346A 0x542A # +0x346B 0x542F # +0x346C 0x5431 # +0x346D 0x5434 # +0x346E 0x5435 # +0x346F 0x5443 # +0x3470 0x5444 # +0x3471 0x5447 # +0x3472 0x544D # +0x3473 0x544F # +0x3474 0x545E # +0x3475 0x5462 # +0x3476 0x5464 # +0x3477 0x5466 # +0x3478 0x5467 # +0x3479 0x5469 # +0x347A 0x546B # +0x347B 0x546D # +0x347C 0x546E # +0x347D 0x5474 # +0x347E 0x547F # +0x3521 0x5481 # +0x3522 0x5483 # +0x3523 0x5485 # +0x3524 0x5488 # +0x3525 0x5489 # +0x3526 0x548D # +0x3527 0x5491 # +0x3528 0x5495 # +0x3529 0x5496 # +0x352A 0x549C # +0x352B 0x549F # +0x352C 0x54A1 # +0x352D 0x54A6 # +0x352E 0x54A7 # +0x352F 0x54A9 # +0x3530 0x54AA # +0x3531 0x54AD # +0x3532 0x54AE # +0x3533 0x54B1 # +0x3534 0x54B7 # +0x3535 0x54B9 # +0x3536 0x54BA # +0x3537 0x54BB # +0x3538 0x54BF # +0x3539 0x54C6 # +0x353A 0x54CA # +0x353B 0x54CD # +0x353C 0x54CE # +0x353D 0x54E0 # +0x353E 0x54EA # +0x353F 0x54EC # +0x3540 0x54EF # +0x3541 0x54F6 # +0x3542 0x54FC # +0x3543 0x54FE # +0x3544 0x54FF # +0x3545 0x5500 # +0x3546 0x5501 # +0x3547 0x5505 # +0x3548 0x5508 # +0x3549 0x5509 # +0x354A 0x550C # +0x354B 0x550D # +0x354C 0x550E # +0x354D 0x5515 # +0x354E 0x552A # +0x354F 0x552B # +0x3550 0x5532 # +0x3551 0x5535 # +0x3552 0x5536 # +0x3553 0x553B # +0x3554 0x553C # +0x3555 0x553D # +0x3556 0x5541 # +0x3557 0x5547 # +0x3558 0x5549 # +0x3559 0x554A # +0x355A 0x554D # +0x355B 0x5550 # +0x355C 0x5551 # +0x355D 0x5558 # +0x355E 0x555A # +0x355F 0x555B # +0x3560 0x555E # +0x3561 0x5560 # +0x3562 0x5561 # +0x3563 0x5564 # +0x3564 0x5566 # +0x3565 0x557F # +0x3566 0x5581 # +0x3567 0x5582 # +0x3568 0x5586 # +0x3569 0x5588 # +0x356A 0x558E # +0x356B 0x558F # +0x356C 0x5591 # +0x356D 0x5592 # +0x356E 0x5593 # +0x356F 0x5594 # +0x3570 0x5597 # +0x3571 0x55A3 # +0x3572 0x55A4 # +0x3573 0x55AD # +0x3574 0x55B2 # +0x3575 0x55BF # +0x3576 0x55C1 # +0x3577 0x55C3 # +0x3578 0x55C6 # +0x3579 0x55C9 # +0x357A 0x55CB # +0x357B 0x55CC # +0x357C 0x55CE # +0x357D 0x55D1 # +0x357E 0x55D2 # +0x3621 0x55D3 # +0x3622 0x55D7 # +0x3623 0x55D8 # +0x3624 0x55DB # +0x3625 0x55DE # +0x3626 0x55E2 # +0x3627 0x55E9 # +0x3628 0x55F6 # +0x3629 0x55FF # +0x362A 0x5605 # +0x362B 0x5608 # +0x362C 0x560A # +0x362D 0x560D # +0x362E 0x560E # +0x362F 0x560F # +0x3630 0x5610 # +0x3631 0x5611 # +0x3632 0x5612 # +0x3633 0x5619 # +0x3634 0x562C # +0x3635 0x5630 # +0x3636 0x5633 # +0x3637 0x5635 # +0x3638 0x5637 # +0x3639 0x5639 # +0x363A 0x563B # +0x363B 0x563C # +0x363C 0x563D # +0x363D 0x563F # +0x363E 0x5640 # +0x363F 0x5641 # +0x3640 0x5643 # +0x3641 0x5644 # +0x3642 0x5646 # +0x3643 0x5649 # +0x3644 0x564B # +0x3645 0x564D # +0x3646 0x564F # +0x3647 0x5654 # +0x3648 0x565E # +0x3649 0x5660 # +0x364A 0x5661 # +0x364B 0x5662 # +0x364C 0x5663 # +0x364D 0x5666 # +0x364E 0x5669 # +0x364F 0x566D # +0x3650 0x566F # +0x3651 0x5671 # +0x3652 0x5672 # +0x3653 0x5675 # +0x3654 0x5684 # +0x3655 0x5685 # +0x3656 0x5688 # +0x3657 0x568B # +0x3658 0x568C # +0x3659 0x5695 # +0x365A 0x5699 # +0x365B 0x569A # +0x365C 0x569D # +0x365D 0x569E # +0x365E 0x569F # +0x365F 0x56A6 # +0x3660 0x56A7 # +0x3661 0x56A8 # +0x3662 0x56A9 # +0x3663 0x56AB # +0x3664 0x56AC # +0x3665 0x56AD # +0x3666 0x56B1 # +0x3667 0x56B3 # +0x3668 0x56B7 # +0x3669 0x56BE # +0x366A 0x56C5 # +0x366B 0x56C9 # +0x366C 0x56CA # +0x366D 0x56CB # +0x366E 0x56CF # +0x366F 0x56D0 # +0x3670 0x56CC # +0x3671 0x56CD # +0x3672 0x56D9 # +0x3673 0x56DC # +0x3674 0x56DD # +0x3675 0x56DF # +0x3676 0x56E1 # +0x3677 0x56E4 # +0x3678 0x56E5 # +0x3679 0x56E6 # +0x367A 0x56E7 # +0x367B 0x56E8 # +0x367C 0x56F1 # +0x367D 0x56EB # +0x367E 0x56ED # +0x3721 0x56F6 # +0x3722 0x56F7 # +0x3723 0x5701 # +0x3724 0x5702 # +0x3725 0x5707 # +0x3726 0x570A # +0x3727 0x570C # +0x3728 0x5711 # +0x3729 0x5715 # +0x372A 0x571A # +0x372B 0x571B # +0x372C 0x571D # +0x372D 0x5720 # +0x372E 0x5722 # +0x372F 0x5723 # +0x3730 0x5724 # +0x3731 0x5725 # +0x3732 0x5729 # +0x3733 0x572A # +0x3734 0x572C # +0x3735 0x572E # +0x3736 0x572F # +0x3737 0x5733 # +0x3738 0x5734 # +0x3739 0x573D # +0x373A 0x573E # +0x373B 0x573F # +0x373C 0x5745 # +0x373D 0x5746 # +0x373E 0x574C # +0x373F 0x574D # +0x3740 0x5752 # +0x3741 0x5762 # +0x3742 0x5765 # +0x3743 0x5767 # +0x3744 0x5768 # +0x3745 0x576B # +0x3746 0x576D # +0x3747 0x576E # +0x3748 0x576F # +0x3749 0x5770 # +0x374A 0x5771 # +0x374B 0x5773 # +0x374C 0x5774 # +0x374D 0x5775 # +0x374E 0x5777 # +0x374F 0x5779 # +0x3750 0x577A # +0x3751 0x577B # +0x3752 0x577C # +0x3753 0x577E # +0x3754 0x5781 # +0x3755 0x5783 # +0x3756 0x578C # +0x3757 0x5794 # +0x3758 0x5797 # +0x3759 0x5799 # +0x375A 0x579A # +0x375B 0x579C # +0x375C 0x579D # +0x375D 0x579E # +0x375E 0x579F # +0x375F 0x57A1 # +0x3760 0x5795 # +0x3761 0x57A7 # +0x3762 0x57A8 # +0x3763 0x57A9 # +0x3764 0x57AC # +0x3765 0x57B8 # +0x3766 0x57BD # +0x3767 0x57C7 # +0x3768 0x57C8 # +0x3769 0x57CC # +0x376A 0x57CF # +0x376B 0x57D5 # +0x376C 0x57DD # +0x376D 0x57DE # +0x376E 0x57E4 # +0x376F 0x57E6 # +0x3770 0x57E7 # +0x3771 0x57E9 # +0x3772 0x57ED # +0x3773 0x57F0 # +0x3774 0x57F5 # +0x3775 0x57F6 # +0x3776 0x57F8 # +0x3777 0x57FD # +0x3778 0x57FE # +0x3779 0x57FF # +0x377A 0x5803 # +0x377B 0x5804 # +0x377C 0x5808 # +0x377D 0x5809 # +0x377E 0x57E1 # +0x3821 0x580C # +0x3822 0x580D # +0x3823 0x581B # +0x3824 0x581E # +0x3825 0x581F # +0x3826 0x5820 # +0x3827 0x5826 # +0x3828 0x5827 # +0x3829 0x582D # +0x382A 0x5832 # +0x382B 0x5839 # +0x382C 0x583F # +0x382D 0x5849 # +0x382E 0x584C # +0x382F 0x584D # +0x3830 0x584F # +0x3831 0x5850 # +0x3832 0x5855 # +0x3833 0x585F # +0x3834 0x5861 # +0x3835 0x5864 # +0x3836 0x5867 # +0x3837 0x5868 # +0x3838 0x5878 # +0x3839 0x587C # +0x383A 0x587F # +0x383B 0x5880 # +0x383C 0x5881 # +0x383D 0x5887 # +0x383E 0x5888 # +0x383F 0x5889 # +0x3840 0x588A # +0x3841 0x588C # +0x3842 0x588D # +0x3843 0x588F # +0x3844 0x5890 # +0x3845 0x5894 # +0x3846 0x5896 # +0x3847 0x589D # +0x3848 0x58A0 # +0x3849 0x58A1 # +0x384A 0x58A2 # +0x384B 0x58A6 # +0x384C 0x58A9 # +0x384D 0x58B1 # +0x384E 0x58B2 # +0x384F 0x58C4 # +0x3850 0x58BC # +0x3851 0x58C2 # +0x3852 0x58C8 # +0x3853 0x58CD # +0x3854 0x58CE # +0x3855 0x58D0 # +0x3856 0x58D2 # +0x3857 0x58D4 # +0x3858 0x58D6 # +0x3859 0x58DA # +0x385A 0x58DD # +0x385B 0x58E1 # +0x385C 0x58E2 # +0x385D 0x58E9 # +0x385E 0x58F3 # +0x385F 0x5905 # +0x3860 0x5906 # +0x3861 0x590B # +0x3862 0x590C # +0x3863 0x5912 # +0x3864 0x5913 # +0x3865 0x5914 # +0x3866 0x8641 # +0x3867 0x591D # +0x3868 0x5921 # +0x3869 0x5923 # +0x386A 0x5924 # +0x386B 0x5928 # +0x386C 0x592F # +0x386D 0x5930 # +0x386E 0x5933 # +0x386F 0x5935 # +0x3870 0x5936 # +0x3871 0x593F # +0x3872 0x5943 # +0x3873 0x5946 # +0x3874 0x5952 # +0x3875 0x5953 # +0x3876 0x5959 # +0x3877 0x595B # +0x3878 0x595D # +0x3879 0x595E # +0x387A 0x595F # +0x387B 0x5961 # +0x387C 0x5963 # +0x387D 0x596B # +0x387E 0x596D # +0x3921 0x596F # +0x3922 0x5972 # +0x3923 0x5975 # +0x3924 0x5976 # +0x3925 0x5979 # +0x3926 0x597B # +0x3927 0x597C # +0x3928 0x598B # +0x3929 0x598C # +0x392A 0x598E # +0x392B 0x5992 # +0x392C 0x5995 # +0x392D 0x5997 # +0x392E 0x599F # +0x392F 0x59A4 # +0x3930 0x59A7 # +0x3931 0x59AD # +0x3932 0x59AE # +0x3933 0x59AF # +0x3934 0x59B0 # +0x3935 0x59B3 # +0x3936 0x59B7 # +0x3937 0x59BA # +0x3938 0x59BC # +0x3939 0x59C1 # +0x393A 0x59C3 # +0x393B 0x59C4 # +0x393C 0x59C8 # +0x393D 0x59CA # +0x393E 0x59CD # +0x393F 0x59D2 # +0x3940 0x59DD # +0x3941 0x59DE # +0x3942 0x59DF # +0x3943 0x59E3 # +0x3944 0x59E4 # +0x3945 0x59E7 # +0x3946 0x59EE # +0x3947 0x59EF # +0x3948 0x59F1 # +0x3949 0x59F2 # +0x394A 0x59F4 # +0x394B 0x59F7 # +0x394C 0x5A00 # +0x394D 0x5A04 # +0x394E 0x5A0C # +0x394F 0x5A0D # +0x3950 0x5A0E # +0x3951 0x5A12 # +0x3952 0x5A13 # +0x3953 0x5A1E # +0x3954 0x5A23 # +0x3955 0x5A24 # +0x3956 0x5A27 # +0x3957 0x5A28 # +0x3958 0x5A2A # +0x3959 0x5A2D # +0x395A 0x5A30 # +0x395B 0x5A44 # +0x395C 0x5A45 # +0x395D 0x5A47 # +0x395E 0x5A48 # +0x395F 0x5A4C # +0x3960 0x5A50 # +0x3961 0x5A55 # +0x3962 0x5A5E # +0x3963 0x5A63 # +0x3964 0x5A65 # +0x3965 0x5A67 # +0x3966 0x5A6D # +0x3967 0x5A77 # +0x3968 0x5A7A # +0x3969 0x5A7B # +0x396A 0x5A7E # +0x396B 0x5A8B # +0x396C 0x5A90 # +0x396D 0x5A93 # +0x396E 0x5A96 # +0x396F 0x5A99 # +0x3970 0x5A9C # +0x3971 0x5A9E # +0x3972 0x5A9F # +0x3973 0x5AA0 # +0x3974 0x5AA2 # +0x3975 0x5AA7 # +0x3976 0x5AAC # +0x3977 0x5AB1 # +0x3978 0x5AB2 # +0x3979 0x5AB3 # +0x397A 0x5AB5 # +0x397B 0x5AB8 # +0x397C 0x5ABA # +0x397D 0x5ABB # +0x397E 0x5ABF # +0x3A21 0x5AC4 # +0x3A22 0x5AC6 # +0x3A23 0x5AC8 # +0x3A24 0x5ACF # +0x3A25 0x5ADA # +0x3A26 0x5ADC # +0x3A27 0x5AE0 # +0x3A28 0x5AE5 # +0x3A29 0x5AEA # +0x3A2A 0x5AEE # +0x3A2B 0x5AF5 # +0x3A2C 0x5AF6 # +0x3A2D 0x5AFD # +0x3A2E 0x5B00 # +0x3A2F 0x5B01 # +0x3A30 0x5B08 # +0x3A31 0x5B17 # +0x3A32 0x5B34 # +0x3A33 0x5B19 # +0x3A34 0x5B1B # +0x3A35 0x5B1D # +0x3A36 0x5B21 # +0x3A37 0x5B25 # +0x3A38 0x5B2D # +0x3A39 0x5B38 # +0x3A3A 0x5B41 # +0x3A3B 0x5B4B # +0x3A3C 0x5B4C # +0x3A3D 0x5B52 # +0x3A3E 0x5B56 # +0x3A3F 0x5B5E # +0x3A40 0x5B68 # +0x3A41 0x5B6E # +0x3A42 0x5B6F # +0x3A43 0x5B7C # +0x3A44 0x5B7D # +0x3A45 0x5B7E # +0x3A46 0x5B7F # +0x3A47 0x5B81 # +0x3A48 0x5B84 # +0x3A49 0x5B86 # +0x3A4A 0x5B8A # +0x3A4B 0x5B8E # +0x3A4C 0x5B90 # +0x3A4D 0x5B91 # +0x3A4E 0x5B93 # +0x3A4F 0x5B94 # +0x3A50 0x5B96 # +0x3A51 0x5BA8 # +0x3A52 0x5BA9 # +0x3A53 0x5BAC # +0x3A54 0x5BAD # +0x3A55 0x5BAF # +0x3A56 0x5BB1 # +0x3A57 0x5BB2 # +0x3A58 0x5BB7 # +0x3A59 0x5BBA # +0x3A5A 0x5BBC # +0x3A5B 0x5BC0 # +0x3A5C 0x5BC1 # +0x3A5D 0x5BCD # +0x3A5E 0x5BCF # +0x3A5F 0x5BD6 # +0x3A60 0x5BD7 # +0x3A61 0x5BD8 # +0x3A62 0x5BD9 # +0x3A63 0x5BDA # +0x3A64 0x5BE0 # +0x3A65 0x5BEF # +0x3A66 0x5BF1 # +0x3A67 0x5BF4 # +0x3A68 0x5BFD # +0x3A69 0x5C0C # +0x3A6A 0x5C17 # +0x3A6B 0x5C1E # +0x3A6C 0x5C1F # +0x3A6D 0x5C23 # +0x3A6E 0x5C26 # +0x3A6F 0x5C29 # +0x3A70 0x5C2B # +0x3A71 0x5C2C # +0x3A72 0x5C2E # +0x3A73 0x5C30 # +0x3A74 0x5C32 # +0x3A75 0x5C35 # +0x3A76 0x5C36 # +0x3A77 0x5C59 # +0x3A78 0x5C5A # +0x3A79 0x5C5C # +0x3A7A 0x5C62 # +0x3A7B 0x5C63 # +0x3A7C 0x5C67 # +0x3A7D 0x5C68 # +0x3A7E 0x5C69 # +0x3B21 0x5C6D # +0x3B22 0x5C70 # +0x3B23 0x5C74 # +0x3B24 0x5C75 # +0x3B25 0x5C7A # +0x3B26 0x5C7B # +0x3B27 0x5C7C # +0x3B28 0x5C7D # +0x3B29 0x5C87 # +0x3B2A 0x5C88 # +0x3B2B 0x5C8A # +0x3B2C 0x5C8F # +0x3B2D 0x5C92 # +0x3B2E 0x5C9D # +0x3B2F 0x5C9F # +0x3B30 0x5CA0 # +0x3B31 0x5CA2 # +0x3B32 0x5CA3 # +0x3B33 0x5CA6 # +0x3B34 0x5CAA # +0x3B35 0x5CB2 # +0x3B36 0x5CB4 # +0x3B37 0x5CB5 # +0x3B38 0x5CBA # +0x3B39 0x5CC9 # +0x3B3A 0x5CCB # +0x3B3B 0x5CD2 # +0x3B3C 0x5CDD # +0x3B3D 0x5CD7 # +0x3B3E 0x5CEE # +0x3B3F 0x5CF1 # +0x3B40 0x5CF2 # +0x3B41 0x5CF4 # +0x3B42 0x5D01 # +0x3B43 0x5D06 # +0x3B44 0x5D0D # +0x3B45 0x5D12 # +0x3B46 0x5D2B # +0x3B47 0x5D23 # +0x3B48 0x5D24 # +0x3B49 0x5D26 # +0x3B4A 0x5D27 # +0x3B4B 0x5D31 # +0x3B4C 0x5D34 # +0x3B4D 0x5D39 # +0x3B4E 0x5D3D # +0x3B4F 0x5D3F # +0x3B50 0x5D42 # +0x3B51 0x5D43 # +0x3B52 0x5D46 # +0x3B53 0x5D48 # +0x3B54 0x5D55 # +0x3B55 0x5D51 # +0x3B56 0x5D59 # +0x3B57 0x5D4A # +0x3B58 0x5D5F # +0x3B59 0x5D60 # +0x3B5A 0x5D61 # +0x3B5B 0x5D62 # +0x3B5C 0x5D64 # +0x3B5D 0x5D6A # +0x3B5E 0x5D6D # +0x3B5F 0x5D70 # +0x3B60 0x5D79 # +0x3B61 0x5D7A # +0x3B62 0x5D7E # +0x3B63 0x5D7F # +0x3B64 0x5D81 # +0x3B65 0x5D83 # +0x3B66 0x5D88 # +0x3B67 0x5D8A # +0x3B68 0x5D92 # +0x3B69 0x5D93 # +0x3B6A 0x5D94 # +0x3B6B 0x5D95 # +0x3B6C 0x5D99 # +0x3B6D 0x5D9B # +0x3B6E 0x5D9F # +0x3B6F 0x5DA0 # +0x3B70 0x5DA7 # +0x3B71 0x5DAB # +0x3B72 0x5DB0 # +0x3B73 0x5DB4 # +0x3B74 0x5DB8 # +0x3B75 0x5DB9 # +0x3B76 0x5DC3 # +0x3B77 0x5DC7 # +0x3B78 0x5DCB # +0x3B79 0x5DD0 # +0x3B7A 0x5DCE # +0x3B7B 0x5DD8 # +0x3B7C 0x5DD9 # +0x3B7D 0x5DE0 # +0x3B7E 0x5DE4 # +0x3C21 0x5DE9 # +0x3C22 0x5DF8 # +0x3C23 0x5DF9 # +0x3C24 0x5E00 # +0x3C25 0x5E07 # +0x3C26 0x5E0D # +0x3C27 0x5E12 # +0x3C28 0x5E14 # +0x3C29 0x5E15 # +0x3C2A 0x5E18 # +0x3C2B 0x5E1F # +0x3C2C 0x5E20 # +0x3C2D 0x5E2E # +0x3C2E 0x5E28 # +0x3C2F 0x5E32 # +0x3C30 0x5E35 # +0x3C31 0x5E3E # +0x3C32 0x5E4B # +0x3C33 0x5E50 # +0x3C34 0x5E49 # +0x3C35 0x5E51 # +0x3C36 0x5E56 # +0x3C37 0x5E58 # +0x3C38 0x5E5B # +0x3C39 0x5E5C # +0x3C3A 0x5E5E # +0x3C3B 0x5E68 # +0x3C3C 0x5E6A # +0x3C3D 0x5E6B # +0x3C3E 0x5E6C # +0x3C3F 0x5E6D # +0x3C40 0x5E6E # +0x3C41 0x5E70 # +0x3C42 0x5E80 # +0x3C43 0x5E8B # +0x3C44 0x5E8E # +0x3C45 0x5EA2 # +0x3C46 0x5EA4 # +0x3C47 0x5EA5 # +0x3C48 0x5EA8 # +0x3C49 0x5EAA # +0x3C4A 0x5EAC # +0x3C4B 0x5EB1 # +0x3C4C 0x5EB3 # +0x3C4D 0x5EBD # +0x3C4E 0x5EBE # +0x3C4F 0x5EBF # +0x3C50 0x5EC6 # +0x3C51 0x5ECC # +0x3C52 0x5ECB # +0x3C53 0x5ECE # +0x3C54 0x5ED1 # +0x3C55 0x5ED2 # +0x3C56 0x5ED4 # +0x3C57 0x5ED5 # +0x3C58 0x5EDC # +0x3C59 0x5EDE # +0x3C5A 0x5EE5 # +0x3C5B 0x5EEB # +0x3C5C 0x5F02 # +0x3C5D 0x5F06 # +0x3C5E 0x5F07 # +0x3C5F 0x5F08 # +0x3C60 0x5F0E # +0x3C61 0x5F19 # +0x3C62 0x5F1C # +0x3C63 0x5F1D # +0x3C64 0x5F21 # +0x3C65 0x5F22 # +0x3C66 0x5F23 # +0x3C67 0x5F24 # +0x3C68 0x5F28 # +0x3C69 0x5F2B # +0x3C6A 0x5F2C # +0x3C6B 0x5F2E # +0x3C6C 0x5F30 # +0x3C6D 0x5F34 # +0x3C6E 0x5F36 # +0x3C6F 0x5F3B # +0x3C70 0x5F3D # +0x3C71 0x5F3F # +0x3C72 0x5F40 # +0x3C73 0x5F44 # +0x3C74 0x5F45 # +0x3C75 0x5F47 # +0x3C76 0x5F4D # +0x3C77 0x5F50 # +0x3C78 0x5F54 # +0x3C79 0x5F58 # +0x3C7A 0x5F5B # +0x3C7B 0x5F60 # +0x3C7C 0x5F63 # +0x3C7D 0x5F64 # +0x3C7E 0x5F67 # +0x3D21 0x5F6F # +0x3D22 0x5F72 # +0x3D23 0x5F74 # +0x3D24 0x5F75 # +0x3D25 0x5F78 # +0x3D26 0x5F7A # +0x3D27 0x5F7D # +0x3D28 0x5F7E # +0x3D29 0x5F89 # +0x3D2A 0x5F8D # +0x3D2B 0x5F8F # +0x3D2C 0x5F96 # +0x3D2D 0x5F9C # +0x3D2E 0x5F9D # +0x3D2F 0x5FA2 # +0x3D30 0x5FA7 # +0x3D31 0x5FAB # +0x3D32 0x5FA4 # +0x3D33 0x5FAC # +0x3D34 0x5FAF # +0x3D35 0x5FB0 # +0x3D36 0x5FB1 # +0x3D37 0x5FB8 # +0x3D38 0x5FC4 # +0x3D39 0x5FC7 # +0x3D3A 0x5FC8 # +0x3D3B 0x5FC9 # +0x3D3C 0x5FCB # +0x3D3D 0x5FD0 # +0x3D3E 0x5FD1 # +0x3D3F 0x5FD2 # +0x3D40 0x5FD3 # +0x3D41 0x5FD4 # +0x3D42 0x5FDE # +0x3D43 0x5FE1 # +0x3D44 0x5FE2 # +0x3D45 0x5FE8 # +0x3D46 0x5FE9 # +0x3D47 0x5FEA # +0x3D48 0x5FEC # +0x3D49 0x5FED # +0x3D4A 0x5FEE # +0x3D4B 0x5FEF # +0x3D4C 0x5FF2 # +0x3D4D 0x5FF3 # +0x3D4E 0x5FF6 # +0x3D4F 0x5FFA # +0x3D50 0x5FFC # +0x3D51 0x6007 # +0x3D52 0x600A # +0x3D53 0x600D # +0x3D54 0x6013 # +0x3D55 0x6014 # +0x3D56 0x6017 # +0x3D57 0x6018 # +0x3D58 0x601A # +0x3D59 0x601F # +0x3D5A 0x6024 # +0x3D5B 0x602D # +0x3D5C 0x6033 # +0x3D5D 0x6035 # +0x3D5E 0x6040 # +0x3D5F 0x6047 # +0x3D60 0x6048 # +0x3D61 0x6049 # +0x3D62 0x604C # +0x3D63 0x6051 # +0x3D64 0x6054 # +0x3D65 0x6056 # +0x3D66 0x6057 # +0x3D67 0x605D # +0x3D68 0x6061 # +0x3D69 0x6067 # +0x3D6A 0x6071 # +0x3D6B 0x607E # +0x3D6C 0x607F # +0x3D6D 0x6082 # +0x3D6E 0x6086 # +0x3D6F 0x6088 # +0x3D70 0x608A # +0x3D71 0x608E # +0x3D72 0x6091 # +0x3D73 0x6093 # +0x3D74 0x6095 # +0x3D75 0x6098 # +0x3D76 0x609D # +0x3D77 0x609E # +0x3D78 0x60A2 # +0x3D79 0x60A4 # +0x3D7A 0x60A5 # +0x3D7B 0x60A8 # +0x3D7C 0x60B0 # +0x3D7D 0x60B1 # +0x3D7E 0x60B7 # +0x3E21 0x60BB # +0x3E22 0x60BE # +0x3E23 0x60C2 # +0x3E24 0x60C4 # +0x3E25 0x60C8 # +0x3E26 0x60C9 # +0x3E27 0x60CA # +0x3E28 0x60CB # +0x3E29 0x60CE # +0x3E2A 0x60CF # +0x3E2B 0x60D4 # +0x3E2C 0x60D5 # +0x3E2D 0x60D9 # +0x3E2E 0x60DB # +0x3E2F 0x60DD # +0x3E30 0x60DE # +0x3E31 0x60E2 # +0x3E32 0x60E5 # +0x3E33 0x60F2 # +0x3E34 0x60F5 # +0x3E35 0x60F8 # +0x3E36 0x60FC # +0x3E37 0x60FD # +0x3E38 0x6102 # +0x3E39 0x6107 # +0x3E3A 0x610A # +0x3E3B 0x610C # +0x3E3C 0x6110 # +0x3E3D 0x6111 # +0x3E3E 0x6112 # +0x3E3F 0x6113 # +0x3E40 0x6114 # +0x3E41 0x6116 # +0x3E42 0x6117 # +0x3E43 0x6119 # +0x3E44 0x611C # +0x3E45 0x611E # +0x3E46 0x6122 # +0x3E47 0x612A # +0x3E48 0x612B # +0x3E49 0x6130 # +0x3E4A 0x6131 # +0x3E4B 0x6135 # +0x3E4C 0x6136 # +0x3E4D 0x6137 # +0x3E4E 0x6139 # +0x3E4F 0x6141 # +0x3E50 0x6145 # +0x3E51 0x6146 # +0x3E52 0x6149 # +0x3E53 0x615E # +0x3E54 0x6160 # +0x3E55 0x616C # +0x3E56 0x6172 # +0x3E57 0x6178 # +0x3E58 0x617B # +0x3E59 0x617C # +0x3E5A 0x617F # +0x3E5B 0x6180 # +0x3E5C 0x6181 # +0x3E5D 0x6183 # +0x3E5E 0x6184 # +0x3E5F 0x618B # +0x3E60 0x618D # +0x3E61 0x6192 # +0x3E62 0x6193 # +0x3E63 0x6197 # +0x3E64 0x6198 # +0x3E65 0x619C # +0x3E66 0x619D # +0x3E67 0x619F # +0x3E68 0x61A0 # +0x3E69 0x61A5 # +0x3E6A 0x61A8 # +0x3E6B 0x61AA # +0x3E6C 0x61AD # +0x3E6D 0x61B8 # +0x3E6E 0x61B9 # +0x3E6F 0x61BC # +0x3E70 0x61C0 # +0x3E71 0x61C1 # +0x3E72 0x61C2 # +0x3E73 0x61CE # +0x3E74 0x61CF # +0x3E75 0x61D5 # +0x3E76 0x61DC # +0x3E77 0x61DD # +0x3E78 0x61DE # +0x3E79 0x61DF # +0x3E7A 0x61E1 # +0x3E7B 0x61E2 # +0x3E7C 0x61E7 # +0x3E7D 0x61E9 # +0x3E7E 0x61E5 # +0x3F21 0x61EC # +0x3F22 0x61ED # +0x3F23 0x61EF # +0x3F24 0x6201 # +0x3F25 0x6203 # +0x3F26 0x6204 # +0x3F27 0x6207 # +0x3F28 0x6213 # +0x3F29 0x6215 # +0x3F2A 0x621C # +0x3F2B 0x6220 # +0x3F2C 0x6222 # +0x3F2D 0x6223 # +0x3F2E 0x6227 # +0x3F2F 0x6229 # +0x3F30 0x622B # +0x3F31 0x6239 # +0x3F32 0x623D # +0x3F33 0x6242 # +0x3F34 0x6243 # +0x3F35 0x6244 # +0x3F36 0x6246 # +0x3F37 0x624C # +0x3F38 0x6250 # +0x3F39 0x6251 # +0x3F3A 0x6252 # +0x3F3B 0x6254 # +0x3F3C 0x6256 # +0x3F3D 0x625A # +0x3F3E 0x625C # +0x3F3F 0x6264 # +0x3F40 0x626D # +0x3F41 0x626F # +0x3F42 0x6273 # +0x3F43 0x627A # +0x3F44 0x627D # +0x3F45 0x628D # +0x3F46 0x628E # +0x3F47 0x628F # +0x3F48 0x6290 # +0x3F49 0x62A6 # +0x3F4A 0x62A8 # +0x3F4B 0x62B3 # +0x3F4C 0x62B6 # +0x3F4D 0x62B7 # +0x3F4E 0x62BA # +0x3F4F 0x62BE # +0x3F50 0x62BF # +0x3F51 0x62C4 # +0x3F52 0x62CE # +0x3F53 0x62D5 # +0x3F54 0x62D6 # +0x3F55 0x62DA # +0x3F56 0x62EA # +0x3F57 0x62F2 # +0x3F58 0x62F4 # +0x3F59 0x62FC # +0x3F5A 0x62FD # +0x3F5B 0x6303 # +0x3F5C 0x6304 # +0x3F5D 0x630A # +0x3F5E 0x630B # +0x3F5F 0x630D # +0x3F60 0x6310 # +0x3F61 0x6313 # +0x3F62 0x6316 # +0x3F63 0x6318 # +0x3F64 0x6329 # +0x3F65 0x632A # +0x3F66 0x632D # +0x3F67 0x6335 # +0x3F68 0x6336 # +0x3F69 0x6339 # +0x3F6A 0x633C # +0x3F6B 0x6341 # +0x3F6C 0x6342 # +0x3F6D 0x6343 # +0x3F6E 0x6344 # +0x3F6F 0x6346 # +0x3F70 0x634A # +0x3F71 0x634B # +0x3F72 0x634E # +0x3F73 0x6352 # +0x3F74 0x6353 # +0x3F75 0x6354 # +0x3F76 0x6358 # +0x3F77 0x635B # +0x3F78 0x6365 # +0x3F79 0x6366 # +0x3F7A 0x636C # +0x3F7B 0x636D # +0x3F7C 0x6371 # +0x3F7D 0x6374 # +0x3F7E 0x6375 # +0x4021 0x6378 # +0x4022 0x637C # +0x4023 0x637D # +0x4024 0x637F # +0x4025 0x6382 # +0x4026 0x6384 # +0x4027 0x6387 # +0x4028 0x638A # +0x4029 0x6390 # +0x402A 0x6394 # +0x402B 0x6395 # +0x402C 0x6399 # +0x402D 0x639A # +0x402E 0x639E # +0x402F 0x63A4 # +0x4030 0x63A6 # +0x4031 0x63AD # +0x4032 0x63AE # +0x4033 0x63AF # +0x4034 0x63BD # +0x4035 0x63C1 # +0x4036 0x63C5 # +0x4037 0x63C8 # +0x4038 0x63CE # +0x4039 0x63D1 # +0x403A 0x63D3 # +0x403B 0x63D4 # +0x403C 0x63D5 # +0x403D 0x63DC # +0x403E 0x63E0 # +0x403F 0x63E5 # +0x4040 0x63EA # +0x4041 0x63EC # +0x4042 0x63F2 # +0x4043 0x63F3 # +0x4044 0x63F5 # +0x4045 0x63F8 # +0x4046 0x63F9 # +0x4047 0x6409 # +0x4048 0x640A # +0x4049 0x6410 # +0x404A 0x6412 # +0x404B 0x6414 # +0x404C 0x6418 # +0x404D 0x641E # +0x404E 0x6420 # +0x404F 0x6422 # +0x4050 0x6424 # +0x4051 0x6425 # +0x4052 0x6429 # +0x4053 0x642A # +0x4054 0x642F # +0x4055 0x6430 # +0x4056 0x6435 # +0x4057 0x643D # +0x4058 0x643F # +0x4059 0x644B # +0x405A 0x644F # +0x405B 0x6451 # +0x405C 0x6452 # +0x405D 0x6453 # +0x405E 0x6454 # +0x405F 0x645A # +0x4060 0x645B # +0x4061 0x645C # +0x4062 0x645D # +0x4063 0x645F # +0x4064 0x6460 # +0x4065 0x6461 # +0x4066 0x6463 # +0x4067 0x646D # +0x4068 0x6473 # +0x4069 0x6474 # +0x406A 0x647B # +0x406B 0x647D # +0x406C 0x6485 # +0x406D 0x6487 # +0x406E 0x648F # +0x406F 0x6490 # +0x4070 0x6491 # +0x4071 0x6498 # +0x4072 0x6499 # +0x4073 0x649B # +0x4074 0x649D # +0x4075 0x649F # +0x4076 0x64A1 # +0x4077 0x64A3 # +0x4078 0x64A6 # +0x4079 0x64A8 # +0x407A 0x64AC # +0x407B 0x64B3 # +0x407C 0x64BD # +0x407D 0x64BE # +0x407E 0x64BF # +0x4121 0x64C4 # +0x4122 0x64C9 # +0x4123 0x64CA # +0x4124 0x64CB # +0x4125 0x64CC # +0x4126 0x64CE # +0x4127 0x64D0 # +0x4128 0x64D1 # +0x4129 0x64D5 # +0x412A 0x64D7 # +0x412B 0x64E4 # +0x412C 0x64E5 # +0x412D 0x64E9 # +0x412E 0x64EA # +0x412F 0x64ED # +0x4130 0x64F0 # +0x4131 0x64F5 # +0x4132 0x64F7 # +0x4133 0x64FB # +0x4134 0x64FF # +0x4135 0x6501 # +0x4136 0x6504 # +0x4137 0x6508 # +0x4138 0x6509 # +0x4139 0x650A # +0x413A 0x650F # +0x413B 0x6513 # +0x413C 0x6514 # +0x413D 0x6516 # +0x413E 0x6519 # +0x413F 0x651B # +0x4140 0x651E # +0x4141 0x651F # +0x4142 0x6522 # +0x4143 0x6526 # +0x4144 0x6529 # +0x4145 0x652E # +0x4146 0x6531 # +0x4147 0x653A # +0x4148 0x653C # +0x4149 0x653D # +0x414A 0x6543 # +0x414B 0x6547 # +0x414C 0x6549 # +0x414D 0x6550 # +0x414E 0x6552 # +0x414F 0x6554 # +0x4150 0x655F # +0x4151 0x6560 # +0x4152 0x6567 # +0x4153 0x656B # +0x4154 0x657A # +0x4155 0x657D # +0x4156 0x6581 # +0x4157 0x6585 # +0x4158 0x658A # +0x4159 0x6592 # +0x415A 0x6595 # +0x415B 0x6598 # +0x415C 0x659D # +0x415D 0x65A0 # +0x415E 0x65A3 # +0x415F 0x65A6 # +0x4160 0x65AE # +0x4161 0x65B2 # +0x4162 0x65B3 # +0x4163 0x65B4 # +0x4164 0x65BF # +0x4165 0x65C2 # +0x4166 0x65C8 # +0x4167 0x65C9 # +0x4168 0x65CE # +0x4169 0x65D0 # +0x416A 0x65D4 # +0x416B 0x65D6 # +0x416C 0x65D8 # +0x416D 0x65DF # +0x416E 0x65F0 # +0x416F 0x65F2 # +0x4170 0x65F4 # +0x4171 0x65F5 # +0x4172 0x65F9 # +0x4173 0x65FE # +0x4174 0x65FF # +0x4175 0x6600 # +0x4176 0x6604 # +0x4177 0x6608 # +0x4178 0x6609 # +0x4179 0x660D # +0x417A 0x6611 # +0x417B 0x6612 # +0x417C 0x6615 # +0x417D 0x6616 # +0x417E 0x661D # +0x4221 0x661E # +0x4222 0x6621 # +0x4223 0x6622 # +0x4224 0x6623 # +0x4225 0x6624 # +0x4226 0x6626 # +0x4227 0x6629 # +0x4228 0x662A # +0x4229 0x662B # +0x422A 0x662C # +0x422B 0x662E # +0x422C 0x6630 # +0x422D 0x6631 # +0x422E 0x6633 # +0x422F 0x6639 # +0x4230 0x6637 # +0x4231 0x6640 # +0x4232 0x6645 # +0x4233 0x6646 # +0x4234 0x664A # +0x4235 0x664C # +0x4236 0x6651 # +0x4237 0x664E # +0x4238 0x6657 # +0x4239 0x6658 # +0x423A 0x6659 # +0x423B 0x665B # +0x423C 0x665C # +0x423D 0x6660 # +0x423E 0x6661 # +0x423F 0x66FB # +0x4240 0x666A # +0x4241 0x666B # +0x4242 0x666C # +0x4243 0x667E # +0x4244 0x6673 # +0x4245 0x6675 # +0x4246 0x667F # +0x4247 0x6677 # +0x4248 0x6678 # +0x4249 0x6679 # +0x424A 0x667B # +0x424B 0x6680 # +0x424C 0x667C # +0x424D 0x668B # +0x424E 0x668C # +0x424F 0x668D # +0x4250 0x6690 # +0x4251 0x6692 # +0x4252 0x6699 # +0x4253 0x669A # +0x4254 0x669B # +0x4255 0x669C # +0x4256 0x669F # +0x4257 0x66A0 # +0x4258 0x66A4 # +0x4259 0x66AD # +0x425A 0x66B1 # +0x425B 0x66B2 # +0x425C 0x66B5 # +0x425D 0x66BB # +0x425E 0x66BF # +0x425F 0x66C0 # +0x4260 0x66C2 # +0x4261 0x66C3 # +0x4262 0x66C8 # +0x4263 0x66CC # +0x4264 0x66CE # +0x4265 0x66CF # +0x4266 0x66D4 # +0x4267 0x66DB # +0x4268 0x66DF # +0x4269 0x66E8 # +0x426A 0x66EB # +0x426B 0x66EC # +0x426C 0x66EE # +0x426D 0x66FA # +0x426E 0x6705 # +0x426F 0x6707 # +0x4270 0x670E # +0x4271 0x6713 # +0x4272 0x6719 # +0x4273 0x671C # +0x4274 0x6720 # +0x4275 0x6722 # +0x4276 0x6733 # +0x4277 0x673E # +0x4278 0x6745 # +0x4279 0x6747 # +0x427A 0x6748 # +0x427B 0x674C # +0x427C 0x6754 # +0x427D 0x6755 # +0x427E 0x675D # +0x4321 0x6766 # +0x4322 0x676C # +0x4323 0x676E # +0x4324 0x6774 # +0x4325 0x6776 # +0x4326 0x677B # +0x4327 0x6781 # +0x4328 0x6784 # +0x4329 0x678E # +0x432A 0x678F # +0x432B 0x6791 # +0x432C 0x6793 # +0x432D 0x6796 # +0x432E 0x6798 # +0x432F 0x6799 # +0x4330 0x679B # +0x4331 0x67B0 # +0x4332 0x67B1 # +0x4333 0x67B2 # +0x4334 0x67B5 # +0x4335 0x67BB # +0x4336 0x67BC # +0x4337 0x67BD # +0x4338 0x67F9 # +0x4339 0x67C0 # +0x433A 0x67C2 # +0x433B 0x67C3 # +0x433C 0x67C5 # +0x433D 0x67C8 # +0x433E 0x67C9 # +0x433F 0x67D2 # +0x4340 0x67D7 # +0x4341 0x67D9 # +0x4342 0x67DC # +0x4343 0x67E1 # +0x4344 0x67E6 # +0x4345 0x67F0 # +0x4346 0x67F2 # +0x4347 0x67F6 # +0x4348 0x67F7 # +0x4349 0x6852 # +0x434A 0x6814 # +0x434B 0x6819 # +0x434C 0x681D # +0x434D 0x681F # +0x434E 0x6828 # +0x434F 0x6827 # +0x4350 0x682C # +0x4351 0x682D # +0x4352 0x682F # +0x4353 0x6830 # +0x4354 0x6831 # +0x4355 0x6833 # +0x4356 0x683B # +0x4357 0x683F # +0x4358 0x6844 # +0x4359 0x6845 # +0x435A 0x684A # +0x435B 0x684C # +0x435C 0x6855 # +0x435D 0x6857 # +0x435E 0x6858 # +0x435F 0x685B # +0x4360 0x686B # +0x4361 0x686E # +0x4362 0x686F # +0x4363 0x6870 # +0x4364 0x6871 # +0x4365 0x6872 # +0x4366 0x6875 # +0x4367 0x6879 # +0x4368 0x687A # +0x4369 0x687B # +0x436A 0x687C # +0x436B 0x6882 # +0x436C 0x6884 # +0x436D 0x6886 # +0x436E 0x6888 # +0x436F 0x6896 # +0x4370 0x6898 # +0x4371 0x689A # +0x4372 0x689C # +0x4373 0x68A1 # +0x4374 0x68A3 # +0x4375 0x68A5 # +0x4376 0x68A9 # +0x4377 0x68AA # +0x4378 0x68AE # +0x4379 0x68B2 # +0x437A 0x68BB # +0x437B 0x68C5 # +0x437C 0x68C8 # +0x437D 0x68CC # +0x437E 0x68CF # +0x4421 0x68D0 # +0x4422 0x68D1 # +0x4423 0x68D3 # +0x4424 0x68D6 # +0x4425 0x68D9 # +0x4426 0x68DC # +0x4427 0x68DD # +0x4428 0x68E5 # +0x4429 0x68E8 # +0x442A 0x68EA # +0x442B 0x68EB # +0x442C 0x68EC # +0x442D 0x68ED # +0x442E 0x68F0 # +0x442F 0x68F1 # +0x4430 0x68F5 # +0x4431 0x68F6 # +0x4432 0x68FB # +0x4433 0x68FC # +0x4434 0x68FD # +0x4435 0x6906 # +0x4436 0x6909 # +0x4437 0x690A # +0x4438 0x6910 # +0x4439 0x6911 # +0x443A 0x6913 # +0x443B 0x6916 # +0x443C 0x6917 # +0x443D 0x6931 # +0x443E 0x6933 # +0x443F 0x6935 # +0x4440 0x6938 # +0x4441 0x693B # +0x4442 0x6942 # +0x4443 0x6945 # +0x4444 0x6949 # +0x4445 0x694E # +0x4446 0x6957 # +0x4447 0x695B # +0x4448 0x6963 # +0x4449 0x6964 # +0x444A 0x6965 # +0x444B 0x6966 # +0x444C 0x6968 # +0x444D 0x6969 # +0x444E 0x696C # +0x444F 0x6970 # +0x4450 0x6971 # +0x4451 0x6972 # +0x4452 0x697A # +0x4453 0x697B # +0x4454 0x697F # +0x4455 0x6980 # +0x4456 0x698D # +0x4457 0x6992 # +0x4458 0x6996 # +0x4459 0x6998 # +0x445A 0x69A1 # +0x445B 0x69A5 # +0x445C 0x69A6 # +0x445D 0x69A8 # +0x445E 0x69AB # +0x445F 0x69AD # +0x4460 0x69AF # +0x4461 0x69B7 # +0x4462 0x69B8 # +0x4463 0x69BA # +0x4464 0x69BC # +0x4465 0x69C5 # +0x4466 0x69C8 # +0x4467 0x69D1 # +0x4468 0x69D6 # +0x4469 0x69D7 # +0x446A 0x69E2 # +0x446B 0x69E5 # +0x446C 0x69EE # +0x446D 0x69EF # +0x446E 0x69F1 # +0x446F 0x69F3 # +0x4470 0x69F5 # +0x4471 0x69FE # +0x4472 0x6A00 # +0x4473 0x6A01 # +0x4474 0x6A03 # +0x4475 0x6A0F # +0x4476 0x6A11 # +0x4477 0x6A15 # +0x4478 0x6A1A # +0x4479 0x6A1D # +0x447A 0x6A20 # +0x447B 0x6A24 # +0x447C 0x6A28 # +0x447D 0x6A30 # +0x447E 0x6A32 # +0x4521 0x6A34 # +0x4522 0x6A37 # +0x4523 0x6A3B # +0x4524 0x6A3E # +0x4525 0x6A3F # +0x4526 0x6A45 # +0x4527 0x6A46 # +0x4528 0x6A49 # +0x4529 0x6A4A # +0x452A 0x6A4E # +0x452B 0x6A50 # +0x452C 0x6A51 # +0x452D 0x6A52 # +0x452E 0x6A55 # +0x452F 0x6A56 # +0x4530 0x6A5B # +0x4531 0x6A64 # +0x4532 0x6A67 # +0x4533 0x6A6A # +0x4534 0x6A71 # +0x4535 0x6A73 # +0x4536 0x6A7E # +0x4537 0x6A81 # +0x4538 0x6A83 # +0x4539 0x6A86 # +0x453A 0x6A87 # +0x453B 0x6A89 # +0x453C 0x6A8B # +0x453D 0x6A91 # +0x453E 0x6A9B # +0x453F 0x6A9D # +0x4540 0x6A9E # +0x4541 0x6A9F # +0x4542 0x6AA5 # +0x4543 0x6AAB # +0x4544 0x6AAF # +0x4545 0x6AB0 # +0x4546 0x6AB1 # +0x4547 0x6AB4 # +0x4548 0x6ABD # +0x4549 0x6ABE # +0x454A 0x6ABF # +0x454B 0x6AC6 # +0x454C 0x6AC9 # +0x454D 0x6AC8 # +0x454E 0x6ACC # +0x454F 0x6AD0 # +0x4550 0x6AD4 # +0x4551 0x6AD5 # +0x4552 0x6AD6 # +0x4553 0x6ADC # +0x4554 0x6ADD # +0x4555 0x6AE4 # +0x4556 0x6AE7 # +0x4557 0x6AEC # +0x4558 0x6AF0 # +0x4559 0x6AF1 # +0x455A 0x6AF2 # +0x455B 0x6AFC # +0x455C 0x6AFD # +0x455D 0x6B02 # +0x455E 0x6B03 # +0x455F 0x6B06 # +0x4560 0x6B07 # +0x4561 0x6B09 # +0x4562 0x6B0F # +0x4563 0x6B10 # +0x4564 0x6B11 # +0x4565 0x6B17 # +0x4566 0x6B1B # +0x4567 0x6B1E # +0x4568 0x6B24 # +0x4569 0x6B28 # +0x456A 0x6B2B # +0x456B 0x6B2C # +0x456C 0x6B2F # +0x456D 0x6B35 # +0x456E 0x6B36 # +0x456F 0x6B3B # +0x4570 0x6B3F # +0x4571 0x6B46 # +0x4572 0x6B4A # +0x4573 0x6B4D # +0x4574 0x6B52 # +0x4575 0x6B56 # +0x4576 0x6B58 # +0x4577 0x6B5D # +0x4578 0x6B60 # +0x4579 0x6B67 # +0x457A 0x6B6B # +0x457B 0x6B6E # +0x457C 0x6B70 # +0x457D 0x6B75 # +0x457E 0x6B7D # +0x4621 0x6B7E # +0x4622 0x6B82 # +0x4623 0x6B85 # +0x4624 0x6B97 # +0x4625 0x6B9B # +0x4626 0x6B9F # +0x4627 0x6BA0 # +0x4628 0x6BA2 # +0x4629 0x6BA3 # +0x462A 0x6BA8 # +0x462B 0x6BA9 # +0x462C 0x6BAC # +0x462D 0x6BAD # +0x462E 0x6BAE # +0x462F 0x6BB0 # +0x4630 0x6BB8 # +0x4631 0x6BB9 # +0x4632 0x6BBD # +0x4633 0x6BBE # +0x4634 0x6BC3 # +0x4635 0x6BC4 # +0x4636 0x6BC9 # +0x4637 0x6BCC # +0x4638 0x6BD6 # +0x4639 0x6BDA # +0x463A 0x6BE1 # +0x463B 0x6BE3 # +0x463C 0x6BE6 # +0x463D 0x6BE7 # +0x463E 0x6BEE # +0x463F 0x6BF1 # +0x4640 0x6BF7 # +0x4641 0x6BF9 # +0x4642 0x6BFF # +0x4643 0x6C02 # +0x4644 0x6C04 # +0x4645 0x6C05 # +0x4646 0x6C09 # +0x4647 0x6C0D # +0x4648 0x6C0E # +0x4649 0x6C10 # +0x464A 0x6C12 # +0x464B 0x6C19 # +0x464C 0x6C1F # +0x464D 0x6C26 # +0x464E 0x6C27 # +0x464F 0x6C28 # +0x4650 0x6C2C # +0x4651 0x6C2E # +0x4652 0x6C33 # +0x4653 0x6C35 # +0x4654 0x6C36 # +0x4655 0x6C3A # +0x4656 0x6C3B # +0x4657 0x6C3F # +0x4658 0x6C4A # +0x4659 0x6C4B # +0x465A 0x6C4D # +0x465B 0x6C4F # +0x465C 0x6C52 # +0x465D 0x6C54 # +0x465E 0x6C59 # +0x465F 0x6C5B # +0x4660 0x6C5C # +0x4661 0x6C6B # +0x4662 0x6C6D # +0x4663 0x6C6F # +0x4664 0x6C74 # +0x4665 0x6C76 # +0x4666 0x6C78 # +0x4667 0x6C79 # +0x4668 0x6C7B # +0x4669 0x6C85 # +0x466A 0x6C86 # +0x466B 0x6C87 # +0x466C 0x6C89 # +0x466D 0x6C94 # +0x466E 0x6C95 # +0x466F 0x6C97 # +0x4670 0x6C98 # +0x4671 0x6C9C # +0x4672 0x6C9F # +0x4673 0x6CB0 # +0x4674 0x6CB2 # +0x4675 0x6CB4 # +0x4676 0x6CC2 # +0x4677 0x6CC6 # +0x4678 0x6CCD # +0x4679 0x6CCF # +0x467A 0x6CD0 # +0x467B 0x6CD1 # +0x467C 0x6CD2 # +0x467D 0x6CD4 # +0x467E 0x6CD6 # +0x4721 0x6CDA # +0x4722 0x6CDC # +0x4723 0x6CE0 # +0x4724 0x6CE7 # +0x4725 0x6CE9 # +0x4726 0x6CEB # +0x4727 0x6CEC # +0x4728 0x6CEE # +0x4729 0x6CF2 # +0x472A 0x6CF4 # +0x472B 0x6D04 # +0x472C 0x6D07 # +0x472D 0x6D0A # +0x472E 0x6D0E # +0x472F 0x6D0F # +0x4730 0x6D11 # +0x4731 0x6D13 # +0x4732 0x6D1A # +0x4733 0x6D26 # +0x4734 0x6D27 # +0x4735 0x6D28 # +0x4736 0x6C67 # +0x4737 0x6D2E # +0x4738 0x6D2F # +0x4739 0x6D31 # +0x473A 0x6D39 # +0x473B 0x6D3C # +0x473C 0x6D3F # +0x473D 0x6D57 # +0x473E 0x6D5E # +0x473F 0x6D5F # +0x4740 0x6D61 # +0x4741 0x6D65 # +0x4742 0x6D67 # +0x4743 0x6D6F # +0x4744 0x6D70 # +0x4745 0x6D7C # +0x4746 0x6D82 # +0x4747 0x6D87 # +0x4748 0x6D91 # +0x4749 0x6D92 # +0x474A 0x6D94 # +0x474B 0x6D96 # +0x474C 0x6D97 # +0x474D 0x6D98 # +0x474E 0x6DAA # +0x474F 0x6DAC # +0x4750 0x6DB4 # +0x4751 0x6DB7 # +0x4752 0x6DB9 # +0x4753 0x6DBD # +0x4754 0x6DBF # +0x4755 0x6DC4 # +0x4756 0x6DC8 # +0x4757 0x6DCA # +0x4758 0x6DCE # +0x4759 0x6DCF # +0x475A 0x6DD6 # +0x475B 0x6DDB # +0x475C 0x6DDD # +0x475D 0x6DDF # +0x475E 0x6DE0 # +0x475F 0x6DE2 # +0x4760 0x6DE5 # +0x4761 0x6DE9 # +0x4762 0x6DEF # +0x4763 0x6DF0 # +0x4764 0x6DF4 # +0x4765 0x6DF6 # +0x4766 0x6DFC # +0x4767 0x6E00 # +0x4768 0x6E04 # +0x4769 0x6E1E # +0x476A 0x6E22 # +0x476B 0x6E27 # +0x476C 0x6E32 # +0x476D 0x6E36 # +0x476E 0x6E39 # +0x476F 0x6E3B # +0x4770 0x6E3C # +0x4771 0x6E44 # +0x4772 0x6E45 # +0x4773 0x6E48 # +0x4774 0x6E49 # +0x4775 0x6E4B # +0x4776 0x6E4F # +0x4777 0x6E51 # +0x4778 0x6E52 # +0x4779 0x6E53 # +0x477A 0x6E54 # +0x477B 0x6E57 # +0x477C 0x6E5C # +0x477D 0x6E5D # +0x477E 0x6E5E # +0x4821 0x6E62 # +0x4822 0x6E63 # +0x4823 0x6E68 # +0x4824 0x6E73 # +0x4825 0x6E7B # +0x4826 0x6E7D # +0x4827 0x6E8D # +0x4828 0x6E93 # +0x4829 0x6E99 # +0x482A 0x6EA0 # +0x482B 0x6EA7 # +0x482C 0x6EAD # +0x482D 0x6EAE # +0x482E 0x6EB1 # +0x482F 0x6EB3 # +0x4830 0x6EBB # +0x4831 0x6EBF # +0x4832 0x6EC0 # +0x4833 0x6EC1 # +0x4834 0x6EC3 # +0x4835 0x6EC7 # +0x4836 0x6EC8 # +0x4837 0x6ECA # +0x4838 0x6ECD # +0x4839 0x6ECE # +0x483A 0x6ECF # +0x483B 0x6EEB # +0x483C 0x6EED # +0x483D 0x6EEE # +0x483E 0x6EF9 # +0x483F 0x6EFB # +0x4840 0x6EFD # +0x4841 0x6F04 # +0x4842 0x6F08 # +0x4843 0x6F0A # +0x4844 0x6F0C # +0x4845 0x6F0D # +0x4846 0x6F16 # +0x4847 0x6F18 # +0x4848 0x6F1A # +0x4849 0x6F1B # +0x484A 0x6F26 # +0x484B 0x6F29 # +0x484C 0x6F2A # +0x484D 0x6F2F # +0x484E 0x6F30 # +0x484F 0x6F33 # +0x4850 0x6F36 # +0x4851 0x6F3B # +0x4852 0x6F3C # +0x4853 0x6F2D # +0x4854 0x6F4F # +0x4855 0x6F51 # +0x4856 0x6F52 # +0x4857 0x6F53 # +0x4858 0x6F57 # +0x4859 0x6F59 # +0x485A 0x6F5A # +0x485B 0x6F5D # +0x485C 0x6F5E # +0x485D 0x6F61 # +0x485E 0x6F62 # +0x485F 0x6F68 # +0x4860 0x6F6C # +0x4861 0x6F7D # +0x4862 0x6F7E # +0x4863 0x6F83 # +0x4864 0x6F87 # +0x4865 0x6F88 # +0x4866 0x6F8B # +0x4867 0x6F8C # +0x4868 0x6F8D # +0x4869 0x6F90 # +0x486A 0x6F92 # +0x486B 0x6F93 # +0x486C 0x6F94 # +0x486D 0x6F96 # +0x486E 0x6F9A # +0x486F 0x6F9F # +0x4870 0x6FA0 # +0x4871 0x6FA5 # +0x4872 0x6FA6 # +0x4873 0x6FA7 # +0x4874 0x6FA8 # +0x4875 0x6FAE # +0x4876 0x6FAF # +0x4877 0x6FB0 # +0x4878 0x6FB5 # +0x4879 0x6FB6 # +0x487A 0x6FBC # +0x487B 0x6FC5 # +0x487C 0x6FC7 # +0x487D 0x6FC8 # +0x487E 0x6FCA # +0x4921 0x6FDA # +0x4922 0x6FDE # +0x4923 0x6FE8 # +0x4924 0x6FE9 # +0x4925 0x6FF0 # +0x4926 0x6FF5 # +0x4927 0x6FF9 # +0x4928 0x6FFC # +0x4929 0x6FFD # +0x492A 0x7000 # +0x492B 0x7005 # +0x492C 0x7006 # +0x492D 0x7007 # +0x492E 0x700D # +0x492F 0x7017 # +0x4930 0x7020 # +0x4931 0x7023 # +0x4932 0x702F # +0x4933 0x7034 # +0x4934 0x7037 # +0x4935 0x7039 # +0x4936 0x703C # +0x4937 0x7043 # +0x4938 0x7044 # +0x4939 0x7048 # +0x493A 0x7049 # +0x493B 0x704A # +0x493C 0x704B # +0x493D 0x7054 # +0x493E 0x7055 # +0x493F 0x705D # +0x4940 0x705E # +0x4941 0x704E # +0x4942 0x7064 # +0x4943 0x7065 # +0x4944 0x706C # +0x4945 0x706E # +0x4946 0x7075 # +0x4947 0x7076 # +0x4948 0x707E # +0x4949 0x7081 # +0x494A 0x7085 # +0x494B 0x7086 # +0x494C 0x7094 # +0x494D 0x7095 # +0x494E 0x7096 # +0x494F 0x7097 # +0x4950 0x7098 # +0x4951 0x709B # +0x4952 0x70A4 # +0x4953 0x70AB # +0x4954 0x70B0 # +0x4955 0x70B1 # +0x4956 0x70B4 # +0x4957 0x70B7 # +0x4958 0x70CA # +0x4959 0x70D1 # +0x495A 0x70D3 # +0x495B 0x70D4 # +0x495C 0x70D5 # +0x495D 0x70D6 # +0x495E 0x70D8 # +0x495F 0x70DC # +0x4960 0x70E4 # +0x4961 0x70FA # +0x4962 0x7103 # +0x4963 0x7104 # +0x4964 0x7105 # +0x4965 0x7106 # +0x4966 0x7107 # +0x4967 0x710B # +0x4968 0x710C # +0x4969 0x710F # +0x496A 0x711E # +0x496B 0x7120 # +0x496C 0x712B # +0x496D 0x712D # +0x496E 0x712F # +0x496F 0x7130 # +0x4970 0x7131 # +0x4971 0x7138 # +0x4972 0x7141 # +0x4973 0x7145 # +0x4974 0x7146 # +0x4975 0x7147 # +0x4976 0x714A # +0x4977 0x714B # +0x4978 0x7150 # +0x4979 0x7152 # +0x497A 0x7157 # +0x497B 0x715A # +0x497C 0x715C # +0x497D 0x715E # +0x497E 0x7160 # +0x4A21 0x7168 # +0x4A22 0x7179 # +0x4A23 0x7180 # +0x4A24 0x7185 # +0x4A25 0x7187 # +0x4A26 0x718C # +0x4A27 0x7192 # +0x4A28 0x719A # +0x4A29 0x719B # +0x4A2A 0x71A0 # +0x4A2B 0x71A2 # +0x4A2C 0x71AF # +0x4A2D 0x71B0 # +0x4A2E 0x71B2 # +0x4A2F 0x71B3 # +0x4A30 0x71BA # +0x4A31 0x71BF # +0x4A32 0x71C0 # +0x4A33 0x71C1 # +0x4A34 0x71C4 # +0x4A35 0x71CB # +0x4A36 0x71CC # +0x4A37 0x71D3 # +0x4A38 0x71D6 # +0x4A39 0x71D9 # +0x4A3A 0x71DA # +0x4A3B 0x71DC # +0x4A3C 0x71F8 # +0x4A3D 0x71FE # +0x4A3E 0x7200 # +0x4A3F 0x7207 # +0x4A40 0x7208 # +0x4A41 0x7209 # +0x4A42 0x7213 # +0x4A43 0x7217 # +0x4A44 0x721A # +0x4A45 0x721D # +0x4A46 0x721F # +0x4A47 0x7224 # +0x4A48 0x722B # +0x4A49 0x722F # +0x4A4A 0x7234 # +0x4A4B 0x7238 # +0x4A4C 0x7239 # +0x4A4D 0x7241 # +0x4A4E 0x7242 # +0x4A4F 0x7243 # +0x4A50 0x7245 # +0x4A51 0x724E # +0x4A52 0x724F # +0x4A53 0x7250 # +0x4A54 0x7253 # +0x4A55 0x7255 # +0x4A56 0x7256 # +0x4A57 0x725A # +0x4A58 0x725C # +0x4A59 0x725E # +0x4A5A 0x7260 # +0x4A5B 0x7263 # +0x4A5C 0x7268 # +0x4A5D 0x726B # +0x4A5E 0x726E # +0x4A5F 0x726F # +0x4A60 0x7271 # +0x4A61 0x7277 # +0x4A62 0x7278 # +0x4A63 0x727B # +0x4A64 0x727C # +0x4A65 0x727F # +0x4A66 0x7284 # +0x4A67 0x7289 # +0x4A68 0x728D # +0x4A69 0x728E # +0x4A6A 0x7293 # +0x4A6B 0x729B # +0x4A6C 0x72A8 # +0x4A6D 0x72AD # +0x4A6E 0x72AE # +0x4A6F 0x72B1 # +0x4A70 0x72B4 # +0x4A71 0x72BE # +0x4A72 0x72C1 # +0x4A73 0x72C7 # +0x4A74 0x72C9 # +0x4A75 0x72CC # +0x4A76 0x72D5 # +0x4A77 0x72D6 # +0x4A78 0x72D8 # +0x4A79 0x72DF # +0x4A7A 0x72E5 # +0x4A7B 0x72F3 # +0x4A7C 0x72F4 # +0x4A7D 0x72FA # +0x4A7E 0x72FB # +0x4B21 0x72FE # +0x4B22 0x7302 # +0x4B23 0x7304 # +0x4B24 0x7305 # +0x4B25 0x7307 # +0x4B26 0x730B # +0x4B27 0x730D # +0x4B28 0x7312 # +0x4B29 0x7313 # +0x4B2A 0x7318 # +0x4B2B 0x7319 # +0x4B2C 0x731E # +0x4B2D 0x7322 # +0x4B2E 0x7324 # +0x4B2F 0x7327 # +0x4B30 0x7328 # +0x4B31 0x732C # +0x4B32 0x7331 # +0x4B33 0x7332 # +0x4B34 0x7335 # +0x4B35 0x733A # +0x4B36 0x733B # +0x4B37 0x733D # +0x4B38 0x7343 # +0x4B39 0x734D # +0x4B3A 0x7350 # +0x4B3B 0x7352 # +0x4B3C 0x7356 # +0x4B3D 0x7358 # +0x4B3E 0x735D # +0x4B3F 0x735E # +0x4B40 0x735F # +0x4B41 0x7360 # +0x4B42 0x7366 # +0x4B43 0x7367 # +0x4B44 0x7369 # +0x4B45 0x736B # +0x4B46 0x736C # +0x4B47 0x736E # +0x4B48 0x736F # +0x4B49 0x7371 # +0x4B4A 0x7377 # +0x4B4B 0x7379 # +0x4B4C 0x737C # +0x4B4D 0x7380 # +0x4B4E 0x7381 # +0x4B4F 0x7383 # +0x4B50 0x7385 # +0x4B51 0x7386 # +0x4B52 0x738E # +0x4B53 0x7390 # +0x4B54 0x7393 # +0x4B55 0x7395 # +0x4B56 0x7397 # +0x4B57 0x7398 # +0x4B58 0x739C # +0x4B59 0x739E # +0x4B5A 0x739F # +0x4B5B 0x73A0 # +0x4B5C 0x73A2 # +0x4B5D 0x73A5 # +0x4B5E 0x73A6 # +0x4B5F 0x73AA # +0x4B60 0x73AB # +0x4B61 0x73AD # +0x4B62 0x73B5 # +0x4B63 0x73B7 # +0x4B64 0x73B9 # +0x4B65 0x73BC # +0x4B66 0x73BD # +0x4B67 0x73BF # +0x4B68 0x73C5 # +0x4B69 0x73C6 # +0x4B6A 0x73C9 # +0x4B6B 0x73CB # +0x4B6C 0x73CC # +0x4B6D 0x73CF # +0x4B6E 0x73D2 # +0x4B6F 0x73D3 # +0x4B70 0x73D6 # +0x4B71 0x73D9 # +0x4B72 0x73DD # +0x4B73 0x73E1 # +0x4B74 0x73E3 # +0x4B75 0x73E6 # +0x4B76 0x73E7 # +0x4B77 0x73E9 # +0x4B78 0x73F4 # +0x4B79 0x73F5 # +0x4B7A 0x73F7 # +0x4B7B 0x73F9 # +0x4B7C 0x73FA # +0x4B7D 0x73FB # +0x4B7E 0x73FD # +0x4C21 0x73FF # +0x4C22 0x7400 # +0x4C23 0x7401 # +0x4C24 0x7404 # +0x4C25 0x7407 # +0x4C26 0x740A # +0x4C27 0x7411 # +0x4C28 0x741A # +0x4C29 0x741B # +0x4C2A 0x7424 # +0x4C2B 0x7426 # +0x4C2C 0x7428 # +0x4C2D 0x7429 # +0x4C2E 0x742A # +0x4C2F 0x742B # +0x4C30 0x742C # +0x4C31 0x742D # +0x4C32 0x742E # +0x4C33 0x742F # +0x4C34 0x7430 # +0x4C35 0x7431 # +0x4C36 0x7439 # +0x4C37 0x7440 # +0x4C38 0x7443 # +0x4C39 0x7444 # +0x4C3A 0x7446 # +0x4C3B 0x7447 # +0x4C3C 0x744B # +0x4C3D 0x744D # +0x4C3E 0x7451 # +0x4C3F 0x7452 # +0x4C40 0x7457 # +0x4C41 0x745D # +0x4C42 0x7462 # +0x4C43 0x7466 # +0x4C44 0x7467 # +0x4C45 0x7468 # +0x4C46 0x746B # +0x4C47 0x746D # +0x4C48 0x746E # +0x4C49 0x7471 # +0x4C4A 0x7472 # +0x4C4B 0x7480 # +0x4C4C 0x7481 # +0x4C4D 0x7485 # +0x4C4E 0x7486 # +0x4C4F 0x7487 # +0x4C50 0x7489 # +0x4C51 0x748F # +0x4C52 0x7490 # +0x4C53 0x7491 # +0x4C54 0x7492 # +0x4C55 0x7498 # +0x4C56 0x7499 # +0x4C57 0x749A # +0x4C58 0x749C # +0x4C59 0x749F # +0x4C5A 0x74A0 # +0x4C5B 0x74A1 # +0x4C5C 0x74A3 # +0x4C5D 0x74A6 # +0x4C5E 0x74A8 # +0x4C5F 0x74A9 # +0x4C60 0x74AA # +0x4C61 0x74AB # +0x4C62 0x74AE # +0x4C63 0x74AF # +0x4C64 0x74B1 # +0x4C65 0x74B2 # +0x4C66 0x74B5 # +0x4C67 0x74B9 # +0x4C68 0x74BB # +0x4C69 0x74BF # +0x4C6A 0x74C8 # +0x4C6B 0x74C9 # +0x4C6C 0x74CC # +0x4C6D 0x74D0 # +0x4C6E 0x74D3 # +0x4C6F 0x74D8 # +0x4C70 0x74DA # +0x4C71 0x74DB # +0x4C72 0x74DE # +0x4C73 0x74DF # +0x4C74 0x74E4 # +0x4C75 0x74E8 # +0x4C76 0x74EA # +0x4C77 0x74EB # +0x4C78 0x74EF # +0x4C79 0x74F4 # +0x4C7A 0x74FA # +0x4C7B 0x74FB # +0x4C7C 0x74FC # +0x4C7D 0x74FF # +0x4C7E 0x7506 # +0x4D21 0x7512 # +0x4D22 0x7516 # +0x4D23 0x7517 # +0x4D24 0x7520 # +0x4D25 0x7521 # +0x4D26 0x7524 # +0x4D27 0x7527 # +0x4D28 0x7529 # +0x4D29 0x752A # +0x4D2A 0x752F # +0x4D2B 0x7536 # +0x4D2C 0x7539 # +0x4D2D 0x753D # +0x4D2E 0x753E # +0x4D2F 0x753F # +0x4D30 0x7540 # +0x4D31 0x7543 # +0x4D32 0x7547 # +0x4D33 0x7548 # +0x4D34 0x754E # +0x4D35 0x7550 # +0x4D36 0x7552 # +0x4D37 0x7557 # +0x4D38 0x755E # +0x4D39 0x755F # +0x4D3A 0x7561 # +0x4D3B 0x756F # +0x4D3C 0x7571 # +0x4D3D 0x7579 # +0x4D3E 0x757A # +0x4D3F 0x757B # +0x4D40 0x757C # +0x4D41 0x757D # +0x4D42 0x757E # +0x4D43 0x7581 # +0x4D44 0x7585 # +0x4D45 0x7590 # +0x4D46 0x7592 # +0x4D47 0x7593 # +0x4D48 0x7595 # +0x4D49 0x7599 # +0x4D4A 0x759C # +0x4D4B 0x75A2 # +0x4D4C 0x75A4 # +0x4D4D 0x75B4 # +0x4D4E 0x75BA # +0x4D4F 0x75BF # +0x4D50 0x75C0 # +0x4D51 0x75C1 # +0x4D52 0x75C4 # +0x4D53 0x75C6 # +0x4D54 0x75CC # +0x4D55 0x75CE # +0x4D56 0x75CF # +0x4D57 0x75D7 # +0x4D58 0x75DC # +0x4D59 0x75DF # +0x4D5A 0x75E0 # +0x4D5B 0x75E1 # +0x4D5C 0x75E4 # +0x4D5D 0x75E7 # +0x4D5E 0x75EC # +0x4D5F 0x75EE # +0x4D60 0x75EF # +0x4D61 0x75F1 # +0x4D62 0x75F9 # +0x4D63 0x7600 # +0x4D64 0x7602 # +0x4D65 0x7603 # +0x4D66 0x7604 # +0x4D67 0x7607 # +0x4D68 0x7608 # +0x4D69 0x760A # +0x4D6A 0x760C # +0x4D6B 0x760F # +0x4D6C 0x7612 # +0x4D6D 0x7613 # +0x4D6E 0x7615 # +0x4D6F 0x7616 # +0x4D70 0x7619 # +0x4D71 0x761B # +0x4D72 0x761C # +0x4D73 0x761D # +0x4D74 0x761E # +0x4D75 0x7623 # +0x4D76 0x7625 # +0x4D77 0x7626 # +0x4D78 0x7629 # +0x4D79 0x762D # +0x4D7A 0x7632 # +0x4D7B 0x7633 # +0x4D7C 0x7635 # +0x4D7D 0x7638 # +0x4D7E 0x7639 # +0x4E21 0x763A # +0x4E22 0x763C # +0x4E23 0x764A # +0x4E24 0x7640 # +0x4E25 0x7641 # +0x4E26 0x7643 # +0x4E27 0x7644 # +0x4E28 0x7645 # +0x4E29 0x7649 # +0x4E2A 0x764B # +0x4E2B 0x7655 # +0x4E2C 0x7659 # +0x4E2D 0x765F # +0x4E2E 0x7664 # +0x4E2F 0x7665 # +0x4E30 0x766D # +0x4E31 0x766E # +0x4E32 0x766F # +0x4E33 0x7671 # +0x4E34 0x7674 # +0x4E35 0x7681 # +0x4E36 0x7685 # +0x4E37 0x768C # +0x4E38 0x768D # +0x4E39 0x7695 # +0x4E3A 0x769B # +0x4E3B 0x769C # +0x4E3C 0x769D # +0x4E3D 0x769F # +0x4E3E 0x76A0 # +0x4E3F 0x76A2 # +0x4E40 0x76A3 # +0x4E41 0x76A4 # +0x4E42 0x76A5 # +0x4E43 0x76A6 # +0x4E44 0x76A7 # +0x4E45 0x76A8 # +0x4E46 0x76AA # +0x4E47 0x76AD # +0x4E48 0x76BD # +0x4E49 0x76C1 # +0x4E4A 0x76C5 # +0x4E4B 0x76C9 # +0x4E4C 0x76CB # +0x4E4D 0x76CC # +0x4E4E 0x76CE # +0x4E4F 0x76D4 # +0x4E50 0x76D9 # +0x4E51 0x76E0 # +0x4E52 0x76E6 # +0x4E53 0x76E8 # +0x4E54 0x76EC # +0x4E55 0x76F0 # +0x4E56 0x76F1 # +0x4E57 0x76F6 # +0x4E58 0x76F9 # +0x4E59 0x76FC # +0x4E5A 0x7700 # +0x4E5B 0x7706 # +0x4E5C 0x770A # +0x4E5D 0x770E # +0x4E5E 0x7712 # +0x4E5F 0x7714 # +0x4E60 0x7715 # +0x4E61 0x7717 # +0x4E62 0x7719 # +0x4E63 0x771A # +0x4E64 0x771C # +0x4E65 0x7722 # +0x4E66 0x7728 # +0x4E67 0x772D # +0x4E68 0x772E # +0x4E69 0x772F # +0x4E6A 0x7734 # +0x4E6B 0x7735 # +0x4E6C 0x7736 # +0x4E6D 0x7739 # +0x4E6E 0x773D # +0x4E6F 0x773E # +0x4E70 0x7742 # +0x4E71 0x7745 # +0x4E72 0x7746 # +0x4E73 0x774A # +0x4E74 0x774D # +0x4E75 0x774E # +0x4E76 0x774F # +0x4E77 0x7752 # +0x4E78 0x7756 # +0x4E79 0x7757 # +0x4E7A 0x775C # +0x4E7B 0x775E # +0x4E7C 0x775F # +0x4E7D 0x7760 # +0x4E7E 0x7762 # +0x4F21 0x7764 # +0x4F22 0x7767 # +0x4F23 0x776A # +0x4F24 0x776C # +0x4F25 0x7770 # +0x4F26 0x7772 # +0x4F27 0x7773 # +0x4F28 0x7774 # +0x4F29 0x777A # +0x4F2A 0x777D # +0x4F2B 0x7780 # +0x4F2C 0x7784 # +0x4F2D 0x778C # +0x4F2E 0x778D # +0x4F2F 0x7794 # +0x4F30 0x7795 # +0x4F31 0x7796 # +0x4F32 0x779A # +0x4F33 0x779F # +0x4F34 0x77A2 # +0x4F35 0x77A7 # +0x4F36 0x77AA # +0x4F37 0x77AE # +0x4F38 0x77AF # +0x4F39 0x77B1 # +0x4F3A 0x77B5 # +0x4F3B 0x77BE # +0x4F3C 0x77C3 # +0x4F3D 0x77C9 # +0x4F3E 0x77D1 # +0x4F3F 0x77D2 # +0x4F40 0x77D5 # +0x4F41 0x77D9 # +0x4F42 0x77DE # +0x4F43 0x77DF # +0x4F44 0x77E0 # +0x4F45 0x77E4 # +0x4F46 0x77E6 # +0x4F47 0x77EA # +0x4F48 0x77EC # +0x4F49 0x77F0 # +0x4F4A 0x77F1 # +0x4F4B 0x77F4 # +0x4F4C 0x77F8 # +0x4F4D 0x77FB # +0x4F4E 0x7805 # +0x4F4F 0x7806 # +0x4F50 0x7809 # +0x4F51 0x780D # +0x4F52 0x780E # +0x4F53 0x7811 # +0x4F54 0x781D # +0x4F55 0x7821 # +0x4F56 0x7822 # +0x4F57 0x7823 # +0x4F58 0x782D # +0x4F59 0x782E # +0x4F5A 0x7830 # +0x4F5B 0x7835 # +0x4F5C 0x7837 # +0x4F5D 0x7843 # +0x4F5E 0x7844 # +0x4F5F 0x7847 # +0x4F60 0x7848 # +0x4F61 0x784C # +0x4F62 0x784E # +0x4F63 0x7852 # +0x4F64 0x785C # +0x4F65 0x785E # +0x4F66 0x7860 # +0x4F67 0x7861 # +0x4F68 0x7863 # +0x4F69 0x7864 # +0x4F6A 0x7868 # +0x4F6B 0x786A # +0x4F6C 0x786E # +0x4F6D 0x787A # +0x4F6E 0x787E # +0x4F6F 0x788A # +0x4F70 0x788F # +0x4F71 0x7894 # +0x4F72 0x7898 # +0x4F73 0x78A1 # +0x4F74 0x789D # +0x4F75 0x789E # +0x4F76 0x789F # +0x4F77 0x78A4 # +0x4F78 0x78A8 # +0x4F79 0x78AC # +0x4F7A 0x78AD # +0x4F7B 0x78B0 # +0x4F7C 0x78B1 # +0x4F7D 0x78B2 # +0x4F7E 0x78B3 # +0x5021 0x78BB # +0x5022 0x78BD # +0x5023 0x78BF # +0x5024 0x78C7 # +0x5025 0x78C8 # +0x5026 0x78C9 # +0x5027 0x78CC # +0x5028 0x78CE # +0x5029 0x78D2 # +0x502A 0x78D3 # +0x502B 0x78D5 # +0x502C 0x78D6 # +0x502D 0x78E4 # +0x502E 0x78DB # +0x502F 0x78DF # +0x5030 0x78E0 # +0x5031 0x78E1 # +0x5032 0x78E6 # +0x5033 0x78EA # +0x5034 0x78F2 # +0x5035 0x78F3 # +0x5036 0x7900 # +0x5037 0x78F6 # +0x5038 0x78F7 # +0x5039 0x78FA # +0x503A 0x78FB # +0x503B 0x78FF # +0x503C 0x7906 # +0x503D 0x790C # +0x503E 0x7910 # +0x503F 0x791A # +0x5040 0x791C # +0x5041 0x791E # +0x5042 0x791F # +0x5043 0x7920 # +0x5044 0x7925 # +0x5045 0x7927 # +0x5046 0x7929 # +0x5047 0x792D # +0x5048 0x7931 # +0x5049 0x7934 # +0x504A 0x7935 # +0x504B 0x793B # +0x504C 0x793D # +0x504D 0x793F # +0x504E 0x7944 # +0x504F 0x7945 # +0x5050 0x7946 # +0x5051 0x794A # +0x5052 0x794B # +0x5053 0x794F # +0x5054 0x7951 # +0x5055 0x7954 # +0x5056 0x7958 # +0x5057 0x795B # +0x5058 0x795C # +0x5059 0x7967 # +0x505A 0x7969 # +0x505B 0x796B # +0x505C 0x7972 # +0x505D 0x7979 # +0x505E 0x797B # +0x505F 0x797C # +0x5060 0x797E # +0x5061 0x798B # +0x5062 0x798C # +0x5063 0x7991 # +0x5064 0x7993 # +0x5065 0x7994 # +0x5066 0x7995 # +0x5067 0x7996 # +0x5068 0x7998 # +0x5069 0x799B # +0x506A 0x799C # +0x506B 0x79A1 # +0x506C 0x79A8 # +0x506D 0x79A9 # +0x506E 0x79AB # +0x506F 0x79AF # +0x5070 0x79B1 # +0x5071 0x79B4 # +0x5072 0x79B8 # +0x5073 0x79BB # +0x5074 0x79C2 # +0x5075 0x79C4 # +0x5076 0x79C7 # +0x5077 0x79C8 # +0x5078 0x79CA # +0x5079 0x79CF # +0x507A 0x79D4 # +0x507B 0x79D6 # +0x507C 0x79DA # +0x507D 0x79DD # +0x507E 0x79DE # +0x5121 0x79E0 # +0x5122 0x79E2 # +0x5123 0x79E5 # +0x5124 0x79EA # +0x5125 0x79EB # +0x5126 0x79ED # +0x5127 0x79F1 # +0x5128 0x79F8 # +0x5129 0x79FC # +0x512A 0x7A02 # +0x512B 0x7A03 # +0x512C 0x7A07 # +0x512D 0x7A09 # +0x512E 0x7A0A # +0x512F 0x7A0C # +0x5130 0x7A11 # +0x5131 0x7A15 # +0x5132 0x7A1B # +0x5133 0x7A1E # +0x5134 0x7A21 # +0x5135 0x7A27 # +0x5136 0x7A2B # +0x5137 0x7A2D # +0x5138 0x7A2F # +0x5139 0x7A30 # +0x513A 0x7A34 # +0x513B 0x7A35 # +0x513C 0x7A38 # +0x513D 0x7A39 # +0x513E 0x7A3A # +0x513F 0x7A44 # +0x5140 0x7A45 # +0x5141 0x7A47 # +0x5142 0x7A48 # +0x5143 0x7A4C # +0x5144 0x7A55 # +0x5145 0x7A56 # +0x5146 0x7A59 # +0x5147 0x7A5C # +0x5148 0x7A5D # +0x5149 0x7A5F # +0x514A 0x7A60 # +0x514B 0x7A65 # +0x514C 0x7A67 # +0x514D 0x7A6A # +0x514E 0x7A6D # +0x514F 0x7A75 # +0x5150 0x7A78 # +0x5151 0x7A7E # +0x5152 0x7A80 # +0x5153 0x7A82 # +0x5154 0x7A85 # +0x5155 0x7A86 # +0x5156 0x7A8A # +0x5157 0x7A8B # +0x5158 0x7A90 # +0x5159 0x7A91 # +0x515A 0x7A94 # +0x515B 0x7A9E # +0x515C 0x7AA0 # +0x515D 0x7AA3 # +0x515E 0x7AAC # +0x515F 0x7AB3 # +0x5160 0x7AB5 # +0x5161 0x7AB9 # +0x5162 0x7ABB # +0x5163 0x7ABC # +0x5164 0x7AC6 # +0x5165 0x7AC9 # +0x5166 0x7ACC # +0x5167 0x7ACE # +0x5168 0x7AD1 # +0x5169 0x7ADB # +0x516A 0x7AE8 # +0x516B 0x7AE9 # +0x516C 0x7AEB # +0x516D 0x7AEC # +0x516E 0x7AF1 # +0x516F 0x7AF4 # +0x5170 0x7AFB # +0x5171 0x7AFD # +0x5172 0x7AFE # +0x5173 0x7B07 # +0x5174 0x7B14 # +0x5175 0x7B1F # +0x5176 0x7B23 # +0x5177 0x7B27 # +0x5178 0x7B29 # +0x5179 0x7B2A # +0x517A 0x7B2B # +0x517B 0x7B2D # +0x517C 0x7B2E # +0x517D 0x7B2F # +0x517E 0x7B30 # +0x5221 0x7B31 # +0x5222 0x7B34 # +0x5223 0x7B3D # +0x5224 0x7B3F # +0x5225 0x7B40 # +0x5226 0x7B41 # +0x5227 0x7B47 # +0x5228 0x7B4E # +0x5229 0x7B55 # +0x522A 0x7B60 # +0x522B 0x7B64 # +0x522C 0x7B66 # +0x522D 0x7B69 # +0x522E 0x7B6A # +0x522F 0x7B6D # +0x5230 0x7B6F # +0x5231 0x7B72 # +0x5232 0x7B73 # +0x5233 0x7B77 # +0x5234 0x7B84 # +0x5235 0x7B89 # +0x5236 0x7B8E # +0x5237 0x7B90 # +0x5238 0x7B91 # +0x5239 0x7B96 # +0x523A 0x7B9B # +0x523B 0x7B9E # +0x523C 0x7BA0 # +0x523D 0x7BA5 # +0x523E 0x7BAC # +0x523F 0x7BAF # +0x5240 0x7BB0 # +0x5241 0x7BB2 # +0x5242 0x7BB5 # +0x5243 0x7BB6 # +0x5244 0x7BBA # +0x5245 0x7BBB # +0x5246 0x7BBC # +0x5247 0x7BBD # +0x5248 0x7BC2 # +0x5249 0x7BC5 # +0x524A 0x7BC8 # +0x524B 0x7BCA # +0x524C 0x7BD4 # +0x524D 0x7BD6 # +0x524E 0x7BD7 # +0x524F 0x7BD9 # +0x5250 0x7BDA # +0x5251 0x7BDB # +0x5252 0x7BE8 # +0x5253 0x7BEA # +0x5254 0x7BF2 # +0x5255 0x7BF4 # +0x5256 0x7BF5 # +0x5257 0x7BF8 # +0x5258 0x7BF9 # +0x5259 0x7BFA # +0x525A 0x7BFC # +0x525B 0x7BFE # +0x525C 0x7C01 # +0x525D 0x7C02 # +0x525E 0x7C03 # +0x525F 0x7C04 # +0x5260 0x7C06 # +0x5261 0x7C09 # +0x5262 0x7C0B # +0x5263 0x7C0C # +0x5264 0x7C0E # +0x5265 0x7C0F # +0x5266 0x7C19 # +0x5267 0x7C1B # +0x5268 0x7C20 # +0x5269 0x7C25 # +0x526A 0x7C26 # +0x526B 0x7C28 # +0x526C 0x7C2C # +0x526D 0x7C31 # +0x526E 0x7C33 # +0x526F 0x7C34 # +0x5270 0x7C36 # +0x5271 0x7C39 # +0x5272 0x7C3A # +0x5273 0x7C46 # +0x5274 0x7C4A # +0x5275 0x7C55 # +0x5276 0x7C51 # +0x5277 0x7C52 # +0x5278 0x7C53 # +0x5279 0x7C59 # +0x527A 0x7C5A # +0x527B 0x7C5B # +0x527C 0x7C5C # +0x527D 0x7C5D # +0x527E 0x7C5E # +0x5321 0x7C61 # +0x5322 0x7C63 # +0x5323 0x7C67 # +0x5324 0x7C69 # +0x5325 0x7C6D # +0x5326 0x7C6E # +0x5327 0x7C70 # +0x5328 0x7C72 # +0x5329 0x7C79 # +0x532A 0x7C7C # +0x532B 0x7C7D # +0x532C 0x7C86 # +0x532D 0x7C87 # +0x532E 0x7C8F # +0x532F 0x7C94 # +0x5330 0x7C9E # +0x5331 0x7CA0 # +0x5332 0x7CA6 # +0x5333 0x7CB0 # +0x5334 0x7CB6 # +0x5335 0x7CB7 # +0x5336 0x7CBA # +0x5337 0x7CBB # +0x5338 0x7CBC # +0x5339 0x7CBF # +0x533A 0x7CC4 # +0x533B 0x7CC7 # +0x533C 0x7CC8 # +0x533D 0x7CC9 # +0x533E 0x7CCD # +0x533F 0x7CCF # +0x5340 0x7CD3 # +0x5341 0x7CD4 # +0x5342 0x7CD5 # +0x5343 0x7CD7 # +0x5344 0x7CD9 # +0x5345 0x7CDA # +0x5346 0x7CDD # +0x5347 0x7CE6 # +0x5348 0x7CE9 # +0x5349 0x7CEB # +0x534A 0x7CF5 # +0x534B 0x7D03 # +0x534C 0x7D07 # +0x534D 0x7D08 # +0x534E 0x7D09 # +0x534F 0x7D0F # +0x5350 0x7D11 # +0x5351 0x7D12 # +0x5352 0x7D13 # +0x5353 0x7D16 # +0x5354 0x7D1D # +0x5355 0x7D1E # +0x5356 0x7D23 # +0x5357 0x7D26 # +0x5358 0x7D2A # +0x5359 0x7D2D # +0x535A 0x7D31 # +0x535B 0x7D3C # +0x535C 0x7D3D # +0x535D 0x7D3E # +0x535E 0x7D40 # +0x535F 0x7D41 # +0x5360 0x7D47 # +0x5361 0x7D48 # +0x5362 0x7D4D # +0x5363 0x7D51 # +0x5364 0x7D53 # +0x5365 0x7D57 # +0x5366 0x7D59 # +0x5367 0x7D5A # +0x5368 0x7D5C # +0x5369 0x7D5D # +0x536A 0x7D65 # +0x536B 0x7D67 # +0x536C 0x7D6A # +0x536D 0x7D70 # +0x536E 0x7D78 # +0x536F 0x7D7A # +0x5370 0x7D7B # +0x5371 0x7D7F # +0x5372 0x7D81 # +0x5373 0x7D82 # +0x5374 0x7D83 # +0x5375 0x7D85 # +0x5376 0x7D86 # +0x5377 0x7D88 # +0x5378 0x7D8B # +0x5379 0x7D8C # +0x537A 0x7D8D # +0x537B 0x7D91 # +0x537C 0x7D96 # +0x537D 0x7D97 # +0x537E 0x7D9D # +0x5421 0x7D9E # +0x5422 0x7DA6 # +0x5423 0x7DA7 # +0x5424 0x7DAA # +0x5425 0x7DB3 # +0x5426 0x7DB6 # +0x5427 0x7DB7 # +0x5428 0x7DB9 # +0x5429 0x7DC2 # +0x542A 0x7DC3 # +0x542B 0x7DC4 # +0x542C 0x7DC5 # +0x542D 0x7DC6 # +0x542E 0x7DCC # +0x542F 0x7DCD # +0x5430 0x7DCE # +0x5431 0x7DD7 # +0x5432 0x7DD9 # +0x5433 0x7E00 # +0x5434 0x7DE2 # +0x5435 0x7DE5 # +0x5436 0x7DE6 # +0x5437 0x7DEA # +0x5438 0x7DEB # +0x5439 0x7DED # +0x543A 0x7DF1 # +0x543B 0x7DF5 # +0x543C 0x7DF6 # +0x543D 0x7DF9 # +0x543E 0x7DFA # +0x543F 0x7E08 # +0x5440 0x7E10 # +0x5441 0x7E11 # +0x5442 0x7E15 # +0x5443 0x7E17 # +0x5444 0x7E1C # +0x5445 0x7E1D # +0x5446 0x7E20 # +0x5447 0x7E27 # +0x5448 0x7E28 # +0x5449 0x7E2C # +0x544A 0x7E2D # +0x544B 0x7E2F # +0x544C 0x7E33 # +0x544D 0x7E36 # +0x544E 0x7E3F # +0x544F 0x7E44 # +0x5450 0x7E45 # +0x5451 0x7E47 # +0x5452 0x7E4E # +0x5453 0x7E50 # +0x5454 0x7E52 # +0x5455 0x7E58 # +0x5456 0x7E5F # +0x5457 0x7E61 # +0x5458 0x7E62 # +0x5459 0x7E65 # +0x545A 0x7E6B # +0x545B 0x7E6E # +0x545C 0x7E6F # +0x545D 0x7E73 # +0x545E 0x7E78 # +0x545F 0x7E7E # +0x5460 0x7E81 # +0x5461 0x7E86 # +0x5462 0x7E87 # +0x5463 0x7E8A # +0x5464 0x7E8D # +0x5465 0x7E91 # +0x5466 0x7E95 # +0x5467 0x7E98 # +0x5468 0x7E9A # +0x5469 0x7E9D # +0x546A 0x7E9E # +0x546B 0x7F3C # +0x546C 0x7F3B # +0x546D 0x7F3D # +0x546E 0x7F3E # +0x546F 0x7F3F # +0x5470 0x7F43 # +0x5471 0x7F44 # +0x5472 0x7F47 # +0x5473 0x7F4F # +0x5474 0x7F52 # +0x5475 0x7F53 # +0x5476 0x7F5B # +0x5477 0x7F5C # +0x5478 0x7F5D # +0x5479 0x7F61 # +0x547A 0x7F63 # +0x547B 0x7F64 # +0x547C 0x7F65 # +0x547D 0x7F66 # +0x547E 0x7F6D # +0x5521 0x7F71 # +0x5522 0x7F7D # +0x5523 0x7F7E # +0x5524 0x7F7F # +0x5525 0x7F80 # +0x5526 0x7F8B # +0x5527 0x7F8D # +0x5528 0x7F8F # +0x5529 0x7F90 # +0x552A 0x7F91 # +0x552B 0x7F96 # +0x552C 0x7F97 # +0x552D 0x7F9C # +0x552E 0x7FA1 # +0x552F 0x7FA2 # +0x5530 0x7FA6 # +0x5531 0x7FAA # +0x5532 0x7FAD # +0x5533 0x7FB4 # +0x5534 0x7FBC # +0x5535 0x7FBF # +0x5536 0x7FC0 # +0x5537 0x7FC3 # +0x5538 0x7FC8 # +0x5539 0x7FCE # +0x553A 0x7FCF # +0x553B 0x7FDB # +0x553C 0x7FDF # +0x553D 0x7FE3 # +0x553E 0x7FE5 # +0x553F 0x7FE8 # +0x5540 0x7FEC # +0x5541 0x7FEE # +0x5542 0x7FEF # +0x5543 0x7FF2 # +0x5544 0x7FFA # +0x5545 0x7FFD # +0x5546 0x7FFE # +0x5547 0x7FFF # +0x5548 0x8007 # +0x5549 0x8008 # +0x554A 0x800A # +0x554B 0x800D # +0x554C 0x800E # +0x554D 0x800F # +0x554E 0x8011 # +0x554F 0x8013 # +0x5550 0x8014 # +0x5551 0x8016 # +0x5552 0x801D # +0x5553 0x801E # +0x5554 0x801F # +0x5555 0x8020 # +0x5556 0x8024 # +0x5557 0x8026 # +0x5558 0x802C # +0x5559 0x802E # +0x555A 0x8030 # +0x555B 0x8034 # +0x555C 0x8035 # +0x555D 0x8037 # +0x555E 0x8039 # +0x555F 0x803A # +0x5560 0x803C # +0x5561 0x803E # +0x5562 0x8040 # +0x5563 0x8044 # +0x5564 0x8060 # +0x5565 0x8064 # +0x5566 0x8066 # +0x5567 0x806D # +0x5568 0x8071 # +0x5569 0x8075 # +0x556A 0x8081 # +0x556B 0x8088 # +0x556C 0x808E # +0x556D 0x809C # +0x556E 0x809E # +0x556F 0x80A6 # +0x5570 0x80A7 # +0x5571 0x80AB # +0x5572 0x80B8 # +0x5573 0x80B9 # +0x5574 0x80C8 # +0x5575 0x80CD # +0x5576 0x80CF # +0x5577 0x80D2 # +0x5578 0x80D4 # +0x5579 0x80D5 # +0x557A 0x80D7 # +0x557B 0x80D8 # +0x557C 0x80E0 # +0x557D 0x80ED # +0x557E 0x80EE # +0x5621 0x80F0 # +0x5622 0x80F2 # +0x5623 0x80F3 # +0x5624 0x80F6 # +0x5625 0x80F9 # +0x5626 0x80FA # +0x5627 0x80FE # +0x5628 0x8103 # +0x5629 0x810B # +0x562A 0x8116 # +0x562B 0x8117 # +0x562C 0x8118 # +0x562D 0x811C # +0x562E 0x811E # +0x562F 0x8120 # +0x5630 0x8124 # +0x5631 0x8127 # +0x5632 0x812C # +0x5633 0x8130 # +0x5634 0x8135 # +0x5635 0x813A # +0x5636 0x813C # +0x5637 0x8145 # +0x5638 0x8147 # +0x5639 0x814A # +0x563A 0x814C # +0x563B 0x8152 # +0x563C 0x8157 # +0x563D 0x8160 # +0x563E 0x8161 # +0x563F 0x8167 # +0x5640 0x8168 # +0x5641 0x8169 # +0x5642 0x816D # +0x5643 0x816F # +0x5644 0x8177 # +0x5645 0x8181 # +0x5646 0x8190 # +0x5647 0x8184 # +0x5648 0x8185 # +0x5649 0x8186 # +0x564A 0x818B # +0x564B 0x818E # +0x564C 0x8196 # +0x564D 0x8198 # +0x564E 0x819B # +0x564F 0x819E # +0x5650 0x81A2 # +0x5651 0x81AE # +0x5652 0x81B2 # +0x5653 0x81B4 # +0x5654 0x81BB # +0x5655 0x81CB # +0x5656 0x81C3 # +0x5657 0x81C5 # +0x5658 0x81CA # +0x5659 0x81CE # +0x565A 0x81CF # +0x565B 0x81D5 # +0x565C 0x81D7 # +0x565D 0x81DB # +0x565E 0x81DD # +0x565F 0x81DE # +0x5660 0x81E1 # +0x5661 0x81E4 # +0x5662 0x81EB # +0x5663 0x81EC # +0x5664 0x81F0 # +0x5665 0x81F1 # +0x5666 0x81F2 # +0x5667 0x81F5 # +0x5668 0x81F6 # +0x5669 0x81F8 # +0x566A 0x81F9 # +0x566B 0x81FD # +0x566C 0x81FF # +0x566D 0x8200 # +0x566E 0x8203 # +0x566F 0x820F # +0x5670 0x8213 # +0x5671 0x8214 # +0x5672 0x8219 # +0x5673 0x821A # +0x5674 0x821D # +0x5675 0x8221 # +0x5676 0x8222 # +0x5677 0x8228 # +0x5678 0x8232 # +0x5679 0x8234 # +0x567A 0x823A # +0x567B 0x8243 # +0x567C 0x8244 # +0x567D 0x8245 # +0x567E 0x8246 # +0x5721 0x824B # +0x5722 0x824E # +0x5723 0x824F # +0x5724 0x8251 # +0x5725 0x8256 # +0x5726 0x825C # +0x5727 0x8260 # +0x5728 0x8263 # +0x5729 0x8267 # +0x572A 0x826D # +0x572B 0x8274 # +0x572C 0x827B # +0x572D 0x827D # +0x572E 0x827F # +0x572F 0x8280 # +0x5730 0x8281 # +0x5731 0x8283 # +0x5732 0x8284 # +0x5733 0x8287 # +0x5734 0x8289 # +0x5735 0x828A # +0x5736 0x828E # +0x5737 0x8291 # +0x5738 0x8294 # +0x5739 0x8296 # +0x573A 0x8298 # +0x573B 0x829A # +0x573C 0x829B # +0x573D 0x82A0 # +0x573E 0x82A1 # +0x573F 0x82A3 # +0x5740 0x82A4 # +0x5741 0x82A7 # +0x5742 0x82A8 # +0x5743 0x82A9 # +0x5744 0x82AA # +0x5745 0x82AE # +0x5746 0x82B0 # +0x5747 0x82B2 # +0x5748 0x82B4 # +0x5749 0x82B7 # +0x574A 0x82BA # +0x574B 0x82BC # +0x574C 0x82BE # +0x574D 0x82BF # +0x574E 0x82C6 # +0x574F 0x82D0 # +0x5750 0x82D5 # +0x5751 0x82DA # +0x5752 0x82E0 # +0x5753 0x82E2 # +0x5754 0x82E4 # +0x5755 0x82E8 # +0x5756 0x82EA # +0x5757 0x82ED # +0x5758 0x82EF # +0x5759 0x82F6 # +0x575A 0x82F7 # +0x575B 0x82FD # +0x575C 0x82FE # +0x575D 0x8300 # +0x575E 0x8301 # +0x575F 0x8307 # +0x5760 0x8308 # +0x5761 0x830A # +0x5762 0x830B # +0x5763 0x8354 # +0x5764 0x831B # +0x5765 0x831D # +0x5766 0x831E # +0x5767 0x831F # +0x5768 0x8321 # +0x5769 0x8322 # +0x576A 0x832C # +0x576B 0x832D # +0x576C 0x832E # +0x576D 0x8330 # +0x576E 0x8333 # +0x576F 0x8337 # +0x5770 0x833A # +0x5771 0x833C # +0x5772 0x833D # +0x5773 0x8342 # +0x5774 0x8343 # +0x5775 0x8344 # +0x5776 0x8347 # +0x5777 0x834D # +0x5778 0x834E # +0x5779 0x8351 # +0x577A 0x8355 # +0x577B 0x8356 # +0x577C 0x8357 # +0x577D 0x8370 # +0x577E 0x8378 # +0x5821 0x837D # +0x5822 0x837F # +0x5823 0x8380 # +0x5824 0x8382 # +0x5825 0x8384 # +0x5826 0x8386 # +0x5827 0x838D # +0x5828 0x8392 # +0x5829 0x8394 # +0x582A 0x8395 # +0x582B 0x8398 # +0x582C 0x8399 # +0x582D 0x839B # +0x582E 0x839C # +0x582F 0x839D # +0x5830 0x83A6 # +0x5831 0x83A7 # +0x5832 0x83A9 # +0x5833 0x83AC # +0x5834 0x83BE # +0x5835 0x83BF # +0x5836 0x83C0 # +0x5837 0x83C7 # +0x5838 0x83C9 # +0x5839 0x83CF # +0x583A 0x83D0 # +0x583B 0x83D1 # +0x583C 0x83D4 # +0x583D 0x83DD # +0x583E 0x8353 # +0x583F 0x83E8 # +0x5840 0x83EA # +0x5841 0x83F6 # +0x5842 0x83F8 # +0x5843 0x83F9 # +0x5844 0x83FC # +0x5845 0x8401 # +0x5846 0x8406 # +0x5847 0x840A # +0x5848 0x840F # +0x5849 0x8411 # +0x584A 0x8415 # +0x584B 0x8419 # +0x584C 0x83AD # +0x584D 0x842F # +0x584E 0x8439 # +0x584F 0x8445 # +0x5850 0x8447 # +0x5851 0x8448 # +0x5852 0x844A # +0x5853 0x844D # +0x5854 0x844F # +0x5855 0x8451 # +0x5856 0x8452 # +0x5857 0x8456 # +0x5858 0x8458 # +0x5859 0x8459 # +0x585A 0x845A # +0x585B 0x845C # +0x585C 0x8460 # +0x585D 0x8464 # +0x585E 0x8465 # +0x585F 0x8467 # +0x5860 0x846A # +0x5861 0x8470 # +0x5862 0x8473 # +0x5863 0x8474 # +0x5864 0x8476 # +0x5865 0x8478 # +0x5866 0x847C # +0x5867 0x847D # +0x5868 0x8481 # +0x5869 0x8485 # +0x586A 0x8492 # +0x586B 0x8493 # +0x586C 0x8495 # +0x586D 0x849E # +0x586E 0x84A6 # +0x586F 0x84A8 # +0x5870 0x84A9 # +0x5871 0x84AA # +0x5872 0x84AF # +0x5873 0x84B1 # +0x5874 0x84B4 # +0x5875 0x84BA # +0x5876 0x84BD # +0x5877 0x84BE # +0x5878 0x84C0 # +0x5879 0x84C2 # +0x587A 0x84C7 # +0x587B 0x84C8 # +0x587C 0x84CC # +0x587D 0x84CF # +0x587E 0x84D3 # +0x5921 0x84DC # +0x5922 0x84E7 # +0x5923 0x84EA # +0x5924 0x84EF # +0x5925 0x84F0 # +0x5926 0x84F1 # +0x5927 0x84F2 # +0x5928 0x84F7 # +0x5929 0x8532 # +0x592A 0x84FA # +0x592B 0x84FB # +0x592C 0x84FD # +0x592D 0x8502 # +0x592E 0x8503 # +0x592F 0x8507 # +0x5930 0x850C # +0x5931 0x850E # +0x5932 0x8510 # +0x5933 0x851C # +0x5934 0x851E # +0x5935 0x8522 # +0x5936 0x8523 # +0x5937 0x8524 # +0x5938 0x8525 # +0x5939 0x8527 # +0x593A 0x852A # +0x593B 0x852B # +0x593C 0x852F # +0x593D 0x8533 # +0x593E 0x8534 # +0x593F 0x8536 # +0x5940 0x853F # +0x5941 0x8546 # +0x5942 0x854F # +0x5943 0x8550 # +0x5944 0x8551 # +0x5945 0x8552 # +0x5946 0x8553 # +0x5947 0x8556 # +0x5948 0x8559 # +0x5949 0x855C # +0x594A 0x855D # +0x594B 0x855E # +0x594C 0x855F # +0x594D 0x8560 # +0x594E 0x8561 # +0x594F 0x8562 # +0x5950 0x8564 # +0x5951 0x856B # +0x5952 0x856F # +0x5953 0x8579 # +0x5954 0x857A # +0x5955 0x857B # +0x5956 0x857D # +0x5957 0x857F # +0x5958 0x8581 # +0x5959 0x8585 # +0x595A 0x8586 # +0x595B 0x8589 # +0x595C 0x858B # +0x595D 0x858C # +0x595E 0x858F # +0x595F 0x8593 # +0x5960 0x8598 # +0x5961 0x859D # +0x5962 0x859F # +0x5963 0x85A0 # +0x5964 0x85A2 # +0x5965 0x85A5 # +0x5966 0x85A7 # +0x5967 0x85B4 # +0x5968 0x85B6 # +0x5969 0x85B7 # +0x596A 0x85B8 # +0x596B 0x85BC # +0x596C 0x85BD # +0x596D 0x85BE # +0x596E 0x85BF # +0x596F 0x85C2 # +0x5970 0x85C7 # +0x5971 0x85CA # +0x5972 0x85CB # +0x5973 0x85CE # +0x5974 0x85AD # +0x5975 0x85D8 # +0x5976 0x85DA # +0x5977 0x85DF # +0x5978 0x85E0 # +0x5979 0x85E6 # +0x597A 0x85E8 # +0x597B 0x85ED # +0x597C 0x85F3 # +0x597D 0x85F6 # +0x597E 0x85FC # +0x5A21 0x85FF # +0x5A22 0x8600 # +0x5A23 0x8604 # +0x5A24 0x8605 # +0x5A25 0x860D # +0x5A26 0x860E # +0x5A27 0x8610 # +0x5A28 0x8611 # +0x5A29 0x8612 # +0x5A2A 0x8618 # +0x5A2B 0x8619 # +0x5A2C 0x861B # +0x5A2D 0x861E # +0x5A2E 0x8621 # +0x5A2F 0x8627 # +0x5A30 0x8629 # +0x5A31 0x8636 # +0x5A32 0x8638 # +0x5A33 0x863A # +0x5A34 0x863C # +0x5A35 0x863D # +0x5A36 0x8640 # +0x5A37 0x8642 # +0x5A38 0x8646 # +0x5A39 0x8652 # +0x5A3A 0x8653 # +0x5A3B 0x8656 # +0x5A3C 0x8657 # +0x5A3D 0x8658 # +0x5A3E 0x8659 # +0x5A3F 0x865D # +0x5A40 0x8660 # +0x5A41 0x8661 # +0x5A42 0x8662 # +0x5A43 0x8663 # +0x5A44 0x8664 # +0x5A45 0x8669 # +0x5A46 0x866C # +0x5A47 0x866F # +0x5A48 0x8675 # +0x5A49 0x8676 # +0x5A4A 0x8677 # +0x5A4B 0x867A # +0x5A4C 0x868D # +0x5A4D 0x8691 # +0x5A4E 0x8696 # +0x5A4F 0x8698 # +0x5A50 0x869A # +0x5A51 0x869C # +0x5A52 0x86A1 # +0x5A53 0x86A6 # +0x5A54 0x86A7 # +0x5A55 0x86A8 # +0x5A56 0x86AD # +0x5A57 0x86B1 # +0x5A58 0x86B3 # +0x5A59 0x86B4 # +0x5A5A 0x86B5 # +0x5A5B 0x86B7 # +0x5A5C 0x86B8 # +0x5A5D 0x86B9 # +0x5A5E 0x86BF # +0x5A5F 0x86C0 # +0x5A60 0x86C1 # +0x5A61 0x86C3 # +0x5A62 0x86C5 # +0x5A63 0x86D1 # +0x5A64 0x86D2 # +0x5A65 0x86D5 # +0x5A66 0x86D7 # +0x5A67 0x86DA # +0x5A68 0x86DC # +0x5A69 0x86E0 # +0x5A6A 0x86E3 # +0x5A6B 0x86E5 # +0x5A6C 0x86E7 # +0x5A6D 0x8688 # +0x5A6E 0x86FA # +0x5A6F 0x86FC # +0x5A70 0x86FD # +0x5A71 0x8704 # +0x5A72 0x8705 # +0x5A73 0x8707 # +0x5A74 0x870B # +0x5A75 0x870E # +0x5A76 0x870F # +0x5A77 0x8710 # +0x5A78 0x8713 # +0x5A79 0x8714 # +0x5A7A 0x8719 # +0x5A7B 0x871E # +0x5A7C 0x871F # +0x5A7D 0x8721 # +0x5A7E 0x8723 # +0x5B21 0x8728 # +0x5B22 0x872E # +0x5B23 0x872F # +0x5B24 0x8731 # +0x5B25 0x8732 # +0x5B26 0x8739 # +0x5B27 0x873A # +0x5B28 0x873C # +0x5B29 0x873D # +0x5B2A 0x873E # +0x5B2B 0x8740 # +0x5B2C 0x8743 # +0x5B2D 0x8745 # +0x5B2E 0x874D # +0x5B2F 0x8758 # +0x5B30 0x875D # +0x5B31 0x8761 # +0x5B32 0x8764 # +0x5B33 0x8765 # +0x5B34 0x876F # +0x5B35 0x8771 # +0x5B36 0x8772 # +0x5B37 0x877B # +0x5B38 0x8783 # +0x5B39 0x8784 # +0x5B3A 0x8785 # +0x5B3B 0x8786 # +0x5B3C 0x8787 # +0x5B3D 0x8788 # +0x5B3E 0x8789 # +0x5B3F 0x878B # +0x5B40 0x878C # +0x5B41 0x8790 # +0x5B42 0x8793 # +0x5B43 0x8795 # +0x5B44 0x8797 # +0x5B45 0x8798 # +0x5B46 0x8799 # +0x5B47 0x879E # +0x5B48 0x87A0 # +0x5B49 0x87A3 # +0x5B4A 0x87A7 # +0x5B4B 0x87AC # +0x5B4C 0x87AD # +0x5B4D 0x87AE # +0x5B4E 0x87B1 # +0x5B4F 0x87B5 # +0x5B50 0x87BE # +0x5B51 0x87BF # +0x5B52 0x87C1 # +0x5B53 0x87C8 # +0x5B54 0x87C9 # +0x5B55 0x87CA # +0x5B56 0x87CE # +0x5B57 0x87D5 # +0x5B58 0x87D6 # +0x5B59 0x87D9 # +0x5B5A 0x87DA # +0x5B5B 0x87DC # +0x5B5C 0x87DF # +0x5B5D 0x87E2 # +0x5B5E 0x87E3 # +0x5B5F 0x87E4 # +0x5B60 0x87EA # +0x5B61 0x87EB # +0x5B62 0x87ED # +0x5B63 0x87F1 # +0x5B64 0x87F3 # +0x5B65 0x87F8 # +0x5B66 0x87FA # +0x5B67 0x87FF # +0x5B68 0x8801 # +0x5B69 0x8803 # +0x5B6A 0x8806 # +0x5B6B 0x8809 # +0x5B6C 0x880A # +0x5B6D 0x880B # +0x5B6E 0x8810 # +0x5B6F 0x8819 # +0x5B70 0x8812 # +0x5B71 0x8813 # +0x5B72 0x8814 # +0x5B73 0x8818 # +0x5B74 0x881A # +0x5B75 0x881B # +0x5B76 0x881C # +0x5B77 0x881E # +0x5B78 0x881F # +0x5B79 0x8828 # +0x5B7A 0x882D # +0x5B7B 0x882E # +0x5B7C 0x8830 # +0x5B7D 0x8832 # +0x5B7E 0x8835 # +0x5C21 0x883A # +0x5C22 0x883C # +0x5C23 0x8841 # +0x5C24 0x8843 # +0x5C25 0x8845 # +0x5C26 0x8848 # +0x5C27 0x8849 # +0x5C28 0x884A # +0x5C29 0x884B # +0x5C2A 0x884E # +0x5C2B 0x8851 # +0x5C2C 0x8855 # +0x5C2D 0x8856 # +0x5C2E 0x8858 # +0x5C2F 0x885A # +0x5C30 0x885C # +0x5C31 0x885F # +0x5C32 0x8860 # +0x5C33 0x8864 # +0x5C34 0x8869 # +0x5C35 0x8871 # +0x5C36 0x8879 # +0x5C37 0x887B # +0x5C38 0x8880 # +0x5C39 0x8898 # +0x5C3A 0x889A # +0x5C3B 0x889B # +0x5C3C 0x889C # +0x5C3D 0x889F # +0x5C3E 0x88A0 # +0x5C3F 0x88A8 # +0x5C40 0x88AA # +0x5C41 0x88BA # +0x5C42 0x88BD # +0x5C43 0x88BE # +0x5C44 0x88C0 # +0x5C45 0x88CA # +0x5C46 0x88CB # +0x5C47 0x88CC # +0x5C48 0x88CD # +0x5C49 0x88CE # +0x5C4A 0x88D1 # +0x5C4B 0x88D2 # +0x5C4C 0x88D3 # +0x5C4D 0x88DB # +0x5C4E 0x88DE # +0x5C4F 0x88E7 # +0x5C50 0x88EF # +0x5C51 0x88F0 # +0x5C52 0x88F1 # +0x5C53 0x88F5 # +0x5C54 0x88F7 # +0x5C55 0x8901 # +0x5C56 0x8906 # +0x5C57 0x890D # +0x5C58 0x890E # +0x5C59 0x890F # +0x5C5A 0x8915 # +0x5C5B 0x8916 # +0x5C5C 0x8918 # +0x5C5D 0x8919 # +0x5C5E 0x891A # +0x5C5F 0x891C # +0x5C60 0x8920 # +0x5C61 0x8926 # +0x5C62 0x8927 # +0x5C63 0x8928 # +0x5C64 0x8930 # +0x5C65 0x8931 # +0x5C66 0x8932 # +0x5C67 0x8935 # +0x5C68 0x8939 # +0x5C69 0x893A # +0x5C6A 0x893E # +0x5C6B 0x8940 # +0x5C6C 0x8942 # +0x5C6D 0x8945 # +0x5C6E 0x8946 # +0x5C6F 0x8949 # +0x5C70 0x894F # +0x5C71 0x8952 # +0x5C72 0x8957 # +0x5C73 0x895A # +0x5C74 0x895B # +0x5C75 0x895C # +0x5C76 0x8961 # +0x5C77 0x8962 # +0x5C78 0x8963 # +0x5C79 0x896B # +0x5C7A 0x896E # +0x5C7B 0x8970 # +0x5C7C 0x8973 # +0x5C7D 0x8975 # +0x5C7E 0x897A # +0x5D21 0x897B # +0x5D22 0x897C # +0x5D23 0x897D # +0x5D24 0x8989 # +0x5D25 0x898D # +0x5D26 0x8990 # +0x5D27 0x8994 # +0x5D28 0x8995 # +0x5D29 0x899B # +0x5D2A 0x899C # +0x5D2B 0x899F # +0x5D2C 0x89A0 # +0x5D2D 0x89A5 # +0x5D2E 0x89B0 # +0x5D2F 0x89B4 # +0x5D30 0x89B5 # +0x5D31 0x89B6 # +0x5D32 0x89B7 # +0x5D33 0x89BC # +0x5D34 0x89D4 # +0x5D35 0x89D5 # +0x5D36 0x89D6 # +0x5D37 0x89D7 # +0x5D38 0x89D8 # +0x5D39 0x89E5 # +0x5D3A 0x89E9 # +0x5D3B 0x89EB # +0x5D3C 0x89ED # +0x5D3D 0x89F1 # +0x5D3E 0x89F3 # +0x5D3F 0x89F6 # +0x5D40 0x89F9 # +0x5D41 0x89FD # +0x5D42 0x89FF # +0x5D43 0x8A04 # +0x5D44 0x8A05 # +0x5D45 0x8A07 # +0x5D46 0x8A0F # +0x5D47 0x8A11 # +0x5D48 0x8A12 # +0x5D49 0x8A14 # +0x5D4A 0x8A15 # +0x5D4B 0x8A1E # +0x5D4C 0x8A20 # +0x5D4D 0x8A22 # +0x5D4E 0x8A24 # +0x5D4F 0x8A26 # +0x5D50 0x8A2B # +0x5D51 0x8A2C # +0x5D52 0x8A2F # +0x5D53 0x8A35 # +0x5D54 0x8A37 # +0x5D55 0x8A3D # +0x5D56 0x8A3E # +0x5D57 0x8A40 # +0x5D58 0x8A43 # +0x5D59 0x8A45 # +0x5D5A 0x8A47 # +0x5D5B 0x8A49 # +0x5D5C 0x8A4D # +0x5D5D 0x8A4E # +0x5D5E 0x8A53 # +0x5D5F 0x8A56 # +0x5D60 0x8A57 # +0x5D61 0x8A58 # +0x5D62 0x8A5C # +0x5D63 0x8A5D # +0x5D64 0x8A61 # +0x5D65 0x8A65 # +0x5D66 0x8A67 # +0x5D67 0x8A75 # +0x5D68 0x8A76 # +0x5D69 0x8A77 # +0x5D6A 0x8A79 # +0x5D6B 0x8A7A # +0x5D6C 0x8A7B # +0x5D6D 0x8A7E # +0x5D6E 0x8A7F # +0x5D6F 0x8A80 # +0x5D70 0x8A83 # +0x5D71 0x8A86 # +0x5D72 0x8A8B # +0x5D73 0x8A8F # +0x5D74 0x8A90 # +0x5D75 0x8A92 # +0x5D76 0x8A96 # +0x5D77 0x8A97 # +0x5D78 0x8A99 # +0x5D79 0x8A9F # +0x5D7A 0x8AA7 # +0x5D7B 0x8AA9 # +0x5D7C 0x8AAE # +0x5D7D 0x8AAF # +0x5D7E 0x8AB3 # +0x5E21 0x8AB6 # +0x5E22 0x8AB7 # +0x5E23 0x8ABB # +0x5E24 0x8ABE # +0x5E25 0x8AC3 # +0x5E26 0x8AC6 # +0x5E27 0x8AC8 # +0x5E28 0x8AC9 # +0x5E29 0x8ACA # +0x5E2A 0x8AD1 # +0x5E2B 0x8AD3 # +0x5E2C 0x8AD4 # +0x5E2D 0x8AD5 # +0x5E2E 0x8AD7 # +0x5E2F 0x8ADD # +0x5E30 0x8ADF # +0x5E31 0x8AEC # +0x5E32 0x8AF0 # +0x5E33 0x8AF4 # +0x5E34 0x8AF5 # +0x5E35 0x8AF6 # +0x5E36 0x8AFC # +0x5E37 0x8AFF # +0x5E38 0x8B05 # +0x5E39 0x8B06 # +0x5E3A 0x8B0B # +0x5E3B 0x8B11 # +0x5E3C 0x8B1C # +0x5E3D 0x8B1E # +0x5E3E 0x8B1F # +0x5E3F 0x8B0A # +0x5E40 0x8B2D # +0x5E41 0x8B30 # +0x5E42 0x8B37 # +0x5E43 0x8B3C # +0x5E44 0x8B42 # +0x5E45 0x8B43 # +0x5E46 0x8B44 # +0x5E47 0x8B45 # +0x5E48 0x8B46 # +0x5E49 0x8B48 # +0x5E4A 0x8B52 # +0x5E4B 0x8B53 # +0x5E4C 0x8B54 # +0x5E4D 0x8B59 # +0x5E4E 0x8B4D # +0x5E4F 0x8B5E # +0x5E50 0x8B63 # +0x5E51 0x8B6D # +0x5E52 0x8B76 # +0x5E53 0x8B78 # +0x5E54 0x8B79 # +0x5E55 0x8B7C # +0x5E56 0x8B7E # +0x5E57 0x8B81 # +0x5E58 0x8B84 # +0x5E59 0x8B85 # +0x5E5A 0x8B8B # +0x5E5B 0x8B8D # +0x5E5C 0x8B8F # +0x5E5D 0x8B94 # +0x5E5E 0x8B95 # +0x5E5F 0x8B9C # +0x5E60 0x8B9E # +0x5E61 0x8B9F # +0x5E62 0x8C38 # +0x5E63 0x8C39 # +0x5E64 0x8C3D # +0x5E65 0x8C3E # +0x5E66 0x8C45 # +0x5E67 0x8C47 # +0x5E68 0x8C49 # +0x5E69 0x8C4B # +0x5E6A 0x8C4F # +0x5E6B 0x8C51 # +0x5E6C 0x8C53 # +0x5E6D 0x8C54 # +0x5E6E 0x8C57 # +0x5E6F 0x8C58 # +0x5E70 0x8C5B # +0x5E71 0x8C5D # +0x5E72 0x8C59 # +0x5E73 0x8C63 # +0x5E74 0x8C64 # +0x5E75 0x8C66 # +0x5E76 0x8C68 # +0x5E77 0x8C69 # +0x5E78 0x8C6D # +0x5E79 0x8C73 # +0x5E7A 0x8C75 # +0x5E7B 0x8C76 # +0x5E7C 0x8C7B # +0x5E7D 0x8C7E # +0x5E7E 0x8C86 # +0x5F21 0x8C87 # +0x5F22 0x8C8B # +0x5F23 0x8C90 # +0x5F24 0x8C92 # +0x5F25 0x8C93 # +0x5F26 0x8C99 # +0x5F27 0x8C9B # +0x5F28 0x8C9C # +0x5F29 0x8CA4 # +0x5F2A 0x8CB9 # +0x5F2B 0x8CBA # +0x5F2C 0x8CC5 # +0x5F2D 0x8CC6 # +0x5F2E 0x8CC9 # +0x5F2F 0x8CCB # +0x5F30 0x8CCF # +0x5F31 0x8CD6 # +0x5F32 0x8CD5 # +0x5F33 0x8CD9 # +0x5F34 0x8CDD # +0x5F35 0x8CE1 # +0x5F36 0x8CE8 # +0x5F37 0x8CEC # +0x5F38 0x8CEF # +0x5F39 0x8CF0 # +0x5F3A 0x8CF2 # +0x5F3B 0x8CF5 # +0x5F3C 0x8CF7 # +0x5F3D 0x8CF8 # +0x5F3E 0x8CFE # +0x5F3F 0x8CFF # +0x5F40 0x8D01 # +0x5F41 0x8D03 # +0x5F42 0x8D09 # +0x5F43 0x8D12 # +0x5F44 0x8D17 # +0x5F45 0x8D1B # +0x5F46 0x8D65 # +0x5F47 0x8D69 # +0x5F48 0x8D6C # +0x5F49 0x8D6E # +0x5F4A 0x8D7F # +0x5F4B 0x8D82 # +0x5F4C 0x8D84 # +0x5F4D 0x8D88 # +0x5F4E 0x8D8D # +0x5F4F 0x8D90 # +0x5F50 0x8D91 # +0x5F51 0x8D95 # +0x5F52 0x8D9E # +0x5F53 0x8D9F # +0x5F54 0x8DA0 # +0x5F55 0x8DA6 # +0x5F56 0x8DAB # +0x5F57 0x8DAC # +0x5F58 0x8DAF # +0x5F59 0x8DB2 # +0x5F5A 0x8DB5 # +0x5F5B 0x8DB7 # +0x5F5C 0x8DB9 # +0x5F5D 0x8DBB # +0x5F5E 0x8DC0 # +0x5F5F 0x8DC5 # +0x5F60 0x8DC6 # +0x5F61 0x8DC7 # +0x5F62 0x8DC8 # +0x5F63 0x8DCA # +0x5F64 0x8DCE # +0x5F65 0x8DD1 # +0x5F66 0x8DD4 # +0x5F67 0x8DD5 # +0x5F68 0x8DD7 # +0x5F69 0x8DD9 # +0x5F6A 0x8DE4 # +0x5F6B 0x8DE5 # +0x5F6C 0x8DE7 # +0x5F6D 0x8DEC # +0x5F6E 0x8DF0 # +0x5F6F 0x8DBC # +0x5F70 0x8DF1 # +0x5F71 0x8DF2 # +0x5F72 0x8DF4 # +0x5F73 0x8DFD # +0x5F74 0x8E01 # +0x5F75 0x8E04 # +0x5F76 0x8E05 # +0x5F77 0x8E06 # +0x5F78 0x8E0B # +0x5F79 0x8E11 # +0x5F7A 0x8E14 # +0x5F7B 0x8E16 # +0x5F7C 0x8E20 # +0x5F7D 0x8E21 # +0x5F7E 0x8E22 # +0x6021 0x8E23 # +0x6022 0x8E26 # +0x6023 0x8E27 # +0x6024 0x8E31 # +0x6025 0x8E33 # +0x6026 0x8E36 # +0x6027 0x8E37 # +0x6028 0x8E38 # +0x6029 0x8E39 # +0x602A 0x8E3D # +0x602B 0x8E40 # +0x602C 0x8E41 # +0x602D 0x8E4B # +0x602E 0x8E4D # +0x602F 0x8E4E # +0x6030 0x8E4F # +0x6031 0x8E54 # +0x6032 0x8E5B # +0x6033 0x8E5C # +0x6034 0x8E5D # +0x6035 0x8E5E # +0x6036 0x8E61 # +0x6037 0x8E62 # +0x6038 0x8E69 # +0x6039 0x8E6C # +0x603A 0x8E6D # +0x603B 0x8E6F # +0x603C 0x8E70 # +0x603D 0x8E71 # +0x603E 0x8E79 # +0x603F 0x8E7A # +0x6040 0x8E7B # +0x6041 0x8E82 # +0x6042 0x8E83 # +0x6043 0x8E89 # +0x6044 0x8E90 # +0x6045 0x8E92 # +0x6046 0x8E95 # +0x6047 0x8E9A # +0x6048 0x8E9B # +0x6049 0x8E9D # +0x604A 0x8E9E # +0x604B 0x8EA2 # +0x604C 0x8EA7 # +0x604D 0x8EA9 # +0x604E 0x8EAD # +0x604F 0x8EAE # +0x6050 0x8EB3 # +0x6051 0x8EB5 # +0x6052 0x8EBA # +0x6053 0x8EBB # +0x6054 0x8EC0 # +0x6055 0x8EC1 # +0x6056 0x8EC3 # +0x6057 0x8EC4 # +0x6058 0x8EC7 # +0x6059 0x8ECF # +0x605A 0x8ED1 # +0x605B 0x8ED4 # +0x605C 0x8EDC # +0x605D 0x8EE8 # +0x605E 0x8EEE # +0x605F 0x8EF0 # +0x6060 0x8EF1 # +0x6061 0x8EF7 # +0x6062 0x8EF9 # +0x6063 0x8EFA # +0x6064 0x8EED # +0x6065 0x8F00 # +0x6066 0x8F02 # +0x6067 0x8F07 # +0x6068 0x8F08 # +0x6069 0x8F0F # +0x606A 0x8F10 # +0x606B 0x8F16 # +0x606C 0x8F17 # +0x606D 0x8F18 # +0x606E 0x8F1E # +0x606F 0x8F20 # +0x6070 0x8F21 # +0x6071 0x8F23 # +0x6072 0x8F25 # +0x6073 0x8F27 # +0x6074 0x8F28 # +0x6075 0x8F2C # +0x6076 0x8F2D # +0x6077 0x8F2E # +0x6078 0x8F34 # +0x6079 0x8F35 # +0x607A 0x8F36 # +0x607B 0x8F37 # +0x607C 0x8F3A # +0x607D 0x8F40 # +0x607E 0x8F41 # +0x6121 0x8F43 # +0x6122 0x8F47 # +0x6123 0x8F4F # +0x6124 0x8F51 # +0x6125 0x8F52 # +0x6126 0x8F53 # +0x6127 0x8F54 # +0x6128 0x8F55 # +0x6129 0x8F58 # +0x612A 0x8F5D # +0x612B 0x8F5E # +0x612C 0x8F65 # +0x612D 0x8F9D # +0x612E 0x8FA0 # +0x612F 0x8FA1 # +0x6130 0x8FA4 # +0x6131 0x8FA5 # +0x6132 0x8FA6 # +0x6133 0x8FB5 # +0x6134 0x8FB6 # +0x6135 0x8FB8 # +0x6136 0x8FBE # +0x6137 0x8FC0 # +0x6138 0x8FC1 # +0x6139 0x8FC6 # +0x613A 0x8FCA # +0x613B 0x8FCB # +0x613C 0x8FCD # +0x613D 0x8FD0 # +0x613E 0x8FD2 # +0x613F 0x8FD3 # +0x6140 0x8FD5 # +0x6141 0x8FE0 # +0x6142 0x8FE3 # +0x6143 0x8FE4 # +0x6144 0x8FE8 # +0x6145 0x8FEE # +0x6146 0x8FF1 # +0x6147 0x8FF5 # +0x6148 0x8FF6 # +0x6149 0x8FFB # +0x614A 0x8FFE # +0x614B 0x9002 # +0x614C 0x9004 # +0x614D 0x9008 # +0x614E 0x900C # +0x614F 0x9018 # +0x6150 0x901B # +0x6151 0x9028 # +0x6152 0x9029 # +0x6153 0x902F # +0x6154 0x902A # +0x6155 0x902C # +0x6156 0x902D # +0x6157 0x9033 # +0x6158 0x9034 # +0x6159 0x9037 # +0x615A 0x903F # +0x615B 0x9043 # +0x615C 0x9044 # +0x615D 0x904C # +0x615E 0x905B # +0x615F 0x905D # +0x6160 0x9062 # +0x6161 0x9066 # +0x6162 0x9067 # +0x6163 0x906C # +0x6164 0x9070 # +0x6165 0x9074 # +0x6166 0x9079 # +0x6167 0x9085 # +0x6168 0x9088 # +0x6169 0x908B # +0x616A 0x908C # +0x616B 0x908E # +0x616C 0x9090 # +0x616D 0x9095 # +0x616E 0x9097 # +0x616F 0x9098 # +0x6170 0x9099 # +0x6171 0x909B # +0x6172 0x90A0 # +0x6173 0x90A1 # +0x6174 0x90A2 # +0x6175 0x90A5 # +0x6176 0x90B0 # +0x6177 0x90B2 # +0x6178 0x90B3 # +0x6179 0x90B4 # +0x617A 0x90B6 # +0x617B 0x90BD # +0x617C 0x90CC # +0x617D 0x90BE # +0x617E 0x90C3 # +0x6221 0x90C4 # +0x6222 0x90C5 # +0x6223 0x90C7 # +0x6224 0x90C8 # +0x6225 0x90D5 # +0x6226 0x90D7 # +0x6227 0x90D8 # +0x6228 0x90D9 # +0x6229 0x90DC # +0x622A 0x90DD # +0x622B 0x90DF # +0x622C 0x90E5 # +0x622D 0x90D2 # +0x622E 0x90F6 # +0x622F 0x90EB # +0x6230 0x90EF # +0x6231 0x90F0 # +0x6232 0x90F4 # +0x6233 0x90FE # +0x6234 0x90FF # +0x6235 0x9100 # +0x6236 0x9104 # +0x6237 0x9105 # +0x6238 0x9106 # +0x6239 0x9108 # +0x623A 0x910D # +0x623B 0x9110 # +0x623C 0x9114 # +0x623D 0x9116 # +0x623E 0x9117 # +0x623F 0x9118 # +0x6240 0x911A # +0x6241 0x911C # +0x6242 0x911E # +0x6243 0x9120 # +0x6244 0x9125 # +0x6245 0x9122 # +0x6246 0x9123 # +0x6247 0x9127 # +0x6248 0x9129 # +0x6249 0x912E # +0x624A 0x912F # +0x624B 0x9131 # +0x624C 0x9134 # +0x624D 0x9136 # +0x624E 0x9137 # +0x624F 0x9139 # +0x6250 0x913A # +0x6251 0x913C # +0x6252 0x913D # +0x6253 0x9143 # +0x6254 0x9147 # +0x6255 0x9148 # +0x6256 0x914F # +0x6257 0x9153 # +0x6258 0x9157 # +0x6259 0x9159 # +0x625A 0x915A # +0x625B 0x915B # +0x625C 0x9161 # +0x625D 0x9164 # +0x625E 0x9167 # +0x625F 0x916D # +0x6260 0x9174 # +0x6261 0x9179 # +0x6262 0x917A # +0x6263 0x917B # +0x6264 0x9181 # +0x6265 0x9183 # +0x6266 0x9185 # +0x6267 0x9186 # +0x6268 0x918A # +0x6269 0x918E # +0x626A 0x9191 # +0x626B 0x9193 # +0x626C 0x9194 # +0x626D 0x9195 # +0x626E 0x9198 # +0x626F 0x919E # +0x6270 0x91A1 # +0x6271 0x91A6 # +0x6272 0x91A8 # +0x6273 0x91AC # +0x6274 0x91AD # +0x6275 0x91AE # +0x6276 0x91B0 # +0x6277 0x91B1 # +0x6278 0x91B2 # +0x6279 0x91B3 # +0x627A 0x91B6 # +0x627B 0x91BB # +0x627C 0x91BC # +0x627D 0x91BD # +0x627E 0x91BF # +0x6321 0x91C2 # +0x6322 0x91C3 # +0x6323 0x91C5 # +0x6324 0x91D3 # +0x6325 0x91D4 # +0x6326 0x91D7 # +0x6327 0x91D9 # +0x6328 0x91DA # +0x6329 0x91DE # +0x632A 0x91E4 # +0x632B 0x91E5 # +0x632C 0x91E9 # +0x632D 0x91EA # +0x632E 0x91EC # +0x632F 0x91ED # +0x6330 0x91EE # +0x6331 0x91EF # +0x6332 0x91F0 # +0x6333 0x91F1 # +0x6334 0x91F7 # +0x6335 0x91F9 # +0x6336 0x91FB # +0x6337 0x91FD # +0x6338 0x9200 # +0x6339 0x9201 # +0x633A 0x9204 # +0x633B 0x9205 # +0x633C 0x9206 # +0x633D 0x9207 # +0x633E 0x9209 # +0x633F 0x920A # +0x6340 0x920C # +0x6341 0x9210 # +0x6342 0x9212 # +0x6343 0x9213 # +0x6344 0x9216 # +0x6345 0x9218 # +0x6346 0x921C # +0x6347 0x921D # +0x6348 0x9223 # +0x6349 0x9224 # +0x634A 0x9225 # +0x634B 0x9226 # +0x634C 0x9228 # +0x634D 0x922E # +0x634E 0x922F # +0x634F 0x9230 # +0x6350 0x9233 # +0x6351 0x9235 # +0x6352 0x9236 # +0x6353 0x9238 # +0x6354 0x9239 # +0x6355 0x923A # +0x6356 0x923C # +0x6357 0x923E # +0x6358 0x9240 # +0x6359 0x9242 # +0x635A 0x9243 # +0x635B 0x9246 # +0x635C 0x9247 # +0x635D 0x924A # +0x635E 0x924D # +0x635F 0x924E # +0x6360 0x924F # +0x6361 0x9251 # +0x6362 0x9258 # +0x6363 0x9259 # +0x6364 0x925C # +0x6365 0x925D # +0x6366 0x9260 # +0x6367 0x9261 # +0x6368 0x9265 # +0x6369 0x9267 # +0x636A 0x9268 # +0x636B 0x9269 # +0x636C 0x926E # +0x636D 0x926F # +0x636E 0x9270 # +0x636F 0x9275 # +0x6370 0x9276 # +0x6371 0x9277 # +0x6372 0x9278 # +0x6373 0x9279 # +0x6374 0x927B # +0x6375 0x927C # +0x6376 0x927D # +0x6377 0x927F # +0x6378 0x9288 # +0x6379 0x9289 # +0x637A 0x928A # +0x637B 0x928D # +0x637C 0x928E # +0x637D 0x9292 # +0x637E 0x9297 # +0x6421 0x9299 # +0x6422 0x929F # +0x6423 0x92A0 # +0x6424 0x92A4 # +0x6425 0x92A5 # +0x6426 0x92A7 # +0x6427 0x92A8 # +0x6428 0x92AB # +0x6429 0x92AF # +0x642A 0x92B2 # +0x642B 0x92B6 # +0x642C 0x92B8 # +0x642D 0x92BA # +0x642E 0x92BB # +0x642F 0x92BC # +0x6430 0x92BD # +0x6431 0x92BF # +0x6432 0x92C0 # +0x6433 0x92C1 # +0x6434 0x92C2 # +0x6435 0x92C3 # +0x6436 0x92C5 # +0x6437 0x92C6 # +0x6438 0x92C7 # +0x6439 0x92C8 # +0x643A 0x92CB # +0x643B 0x92CC # +0x643C 0x92CD # +0x643D 0x92CE # +0x643E 0x92D0 # +0x643F 0x92D3 # +0x6440 0x92D5 # +0x6441 0x92D7 # +0x6442 0x92D8 # +0x6443 0x92D9 # +0x6444 0x92DC # +0x6445 0x92DD # +0x6446 0x92DF # +0x6447 0x92E0 # +0x6448 0x92E1 # +0x6449 0x92E3 # +0x644A 0x92E5 # +0x644B 0x92E7 # +0x644C 0x92E8 # +0x644D 0x92EC # +0x644E 0x92EE # +0x644F 0x92F0 # +0x6450 0x92F9 # +0x6451 0x92FB # +0x6452 0x92FF # +0x6453 0x9300 # +0x6454 0x9302 # +0x6455 0x9308 # +0x6456 0x930D # +0x6457 0x9311 # +0x6458 0x9314 # +0x6459 0x9315 # +0x645A 0x931C # +0x645B 0x931D # +0x645C 0x931E # +0x645D 0x931F # +0x645E 0x9321 # +0x645F 0x9324 # +0x6460 0x9325 # +0x6461 0x9327 # +0x6462 0x9329 # +0x6463 0x932A # +0x6464 0x9333 # +0x6465 0x9334 # +0x6466 0x9336 # +0x6467 0x9337 # +0x6468 0x9347 # +0x6469 0x9348 # +0x646A 0x9349 # +0x646B 0x9350 # +0x646C 0x9351 # +0x646D 0x9352 # +0x646E 0x9355 # +0x646F 0x9357 # +0x6470 0x9358 # +0x6471 0x935A # +0x6472 0x935E # +0x6473 0x9364 # +0x6474 0x9365 # +0x6475 0x9367 # +0x6476 0x9369 # +0x6477 0x936A # +0x6478 0x936D # +0x6479 0x936F # +0x647A 0x9370 # +0x647B 0x9371 # +0x647C 0x9373 # +0x647D 0x9374 # +0x647E 0x9376 # +0x6521 0x937A # +0x6522 0x937D # +0x6523 0x937F # +0x6524 0x9380 # +0x6525 0x9381 # +0x6526 0x9382 # +0x6527 0x9388 # +0x6528 0x938A # +0x6529 0x938B # +0x652A 0x938D # +0x652B 0x938F # +0x652C 0x9392 # +0x652D 0x9395 # +0x652E 0x9398 # +0x652F 0x939B # +0x6530 0x939E # +0x6531 0x93A1 # +0x6532 0x93A3 # +0x6533 0x93A4 # +0x6534 0x93A6 # +0x6535 0x93A8 # +0x6536 0x93AB # +0x6537 0x93B4 # +0x6538 0x93B5 # +0x6539 0x93B6 # +0x653A 0x93BA # +0x653B 0x93A9 # +0x653C 0x93C1 # +0x653D 0x93C4 # +0x653E 0x93C5 # +0x653F 0x93C6 # +0x6540 0x93C7 # +0x6541 0x93C9 # +0x6542 0x93CA # +0x6543 0x93CB # +0x6544 0x93CC # +0x6545 0x93CD # +0x6546 0x93D3 # +0x6547 0x93D9 # +0x6548 0x93DC # +0x6549 0x93DE # +0x654A 0x93DF # +0x654B 0x93E2 # +0x654C 0x93E6 # +0x654D 0x93E7 # +0x654E 0x93F9 # +0x654F 0x93F7 # +0x6550 0x93F8 # +0x6551 0x93FA # +0x6552 0x93FB # +0x6553 0x93FD # +0x6554 0x9401 # +0x6555 0x9402 # +0x6556 0x9404 # +0x6557 0x9408 # +0x6558 0x9409 # +0x6559 0x940D # +0x655A 0x940E # +0x655B 0x940F # +0x655C 0x9415 # +0x655D 0x9416 # +0x655E 0x9417 # +0x655F 0x941F # +0x6560 0x942E # +0x6561 0x942F # +0x6562 0x9431 # +0x6563 0x9432 # +0x6564 0x9433 # +0x6565 0x9434 # +0x6566 0x943B # +0x6567 0x943F # +0x6568 0x943D # +0x6569 0x9443 # +0x656A 0x9445 # +0x656B 0x9448 # +0x656C 0x944A # +0x656D 0x944C # +0x656E 0x9455 # +0x656F 0x9459 # +0x6570 0x945C # +0x6571 0x945F # +0x6572 0x9461 # +0x6573 0x9463 # +0x6574 0x9468 # +0x6575 0x946B # +0x6576 0x946D # +0x6577 0x946E # +0x6578 0x946F # +0x6579 0x9471 # +0x657A 0x9472 # +0x657B 0x9484 # +0x657C 0x9483 # +0x657D 0x9578 # +0x657E 0x9579 # +0x6621 0x957E # +0x6622 0x9584 # +0x6623 0x9588 # +0x6624 0x958C # +0x6625 0x958D # +0x6626 0x958E # +0x6627 0x959D # +0x6628 0x959E # +0x6629 0x959F # +0x662A 0x95A1 # +0x662B 0x95A6 # +0x662C 0x95A9 # +0x662D 0x95AB # +0x662E 0x95AC # +0x662F 0x95B4 # +0x6630 0x95B6 # +0x6631 0x95BA # +0x6632 0x95BD # +0x6633 0x95BF # +0x6634 0x95C6 # +0x6635 0x95C8 # +0x6636 0x95C9 # +0x6637 0x95CB # +0x6638 0x95D0 # +0x6639 0x95D1 # +0x663A 0x95D2 # +0x663B 0x95D3 # +0x663C 0x95D9 # +0x663D 0x95DA # +0x663E 0x95DD # +0x663F 0x95DE # +0x6640 0x95DF # +0x6641 0x95E0 # +0x6642 0x95E4 # +0x6643 0x95E6 # +0x6644 0x961D # +0x6645 0x961E # +0x6646 0x9622 # +0x6647 0x9624 # +0x6648 0x9625 # +0x6649 0x9626 # +0x664A 0x962C # +0x664B 0x9631 # +0x664C 0x9633 # +0x664D 0x9637 # +0x664E 0x9638 # +0x664F 0x9639 # +0x6650 0x963A # +0x6651 0x963C # +0x6652 0x963D # +0x6653 0x9641 # +0x6654 0x9652 # +0x6655 0x9654 # +0x6656 0x9656 # +0x6657 0x9657 # +0x6658 0x9658 # +0x6659 0x9661 # +0x665A 0x966E # +0x665B 0x9674 # +0x665C 0x967B # +0x665D 0x967C # +0x665E 0x967E # +0x665F 0x967F # +0x6660 0x9681 # +0x6661 0x9682 # +0x6662 0x9683 # +0x6663 0x9684 # +0x6664 0x9689 # +0x6665 0x9691 # +0x6666 0x9696 # +0x6667 0x969A # +0x6668 0x969D # +0x6669 0x969F # +0x666A 0x96A4 # +0x666B 0x96A5 # +0x666C 0x96A6 # +0x666D 0x96A9 # +0x666E 0x96AE # +0x666F 0x96AF # +0x6670 0x96B3 # +0x6671 0x96BA # +0x6672 0x96CA # +0x6673 0x96D2 # +0x6674 0x5DB2 # +0x6675 0x96D8 # +0x6676 0x96DA # +0x6677 0x96DD # +0x6678 0x96DE # +0x6679 0x96DF # +0x667A 0x96E9 # +0x667B 0x96EF # +0x667C 0x96F1 # +0x667D 0x96FA # +0x667E 0x9702 # +0x6721 0x9703 # +0x6722 0x9705 # +0x6723 0x9709 # +0x6724 0x971A # +0x6725 0x971B # +0x6726 0x971D # +0x6727 0x9721 # +0x6728 0x9722 # +0x6729 0x9723 # +0x672A 0x9728 # +0x672B 0x9731 # +0x672C 0x9733 # +0x672D 0x9741 # +0x672E 0x9743 # +0x672F 0x974A # +0x6730 0x974E # +0x6731 0x974F # +0x6732 0x9755 # +0x6733 0x9757 # +0x6734 0x9758 # +0x6735 0x975A # +0x6736 0x975B # +0x6737 0x9763 # +0x6738 0x9767 # +0x6739 0x976A # +0x673A 0x976E # +0x673B 0x9773 # +0x673C 0x9776 # +0x673D 0x9777 # +0x673E 0x9778 # +0x673F 0x977B # +0x6740 0x977D # +0x6741 0x977F # +0x6742 0x9780 # +0x6743 0x9789 # +0x6744 0x9795 # +0x6745 0x9796 # +0x6746 0x9797 # +0x6747 0x9799 # +0x6748 0x979A # +0x6749 0x979E # +0x674A 0x979F # +0x674B 0x97A2 # +0x674C 0x97AC # +0x674D 0x97AE # +0x674E 0x97B1 # +0x674F 0x97B2 # +0x6750 0x97B5 # +0x6751 0x97B6 # +0x6752 0x97B8 # +0x6753 0x97B9 # +0x6754 0x97BA # +0x6755 0x97BC # +0x6756 0x97BE # +0x6757 0x97BF # +0x6758 0x97C1 # +0x6759 0x97C4 # +0x675A 0x97C5 # +0x675B 0x97C7 # +0x675C 0x97C9 # +0x675D 0x97CA # +0x675E 0x97CC # +0x675F 0x97CD # +0x6760 0x97CE # +0x6761 0x97D0 # +0x6762 0x97D1 # +0x6763 0x97D4 # +0x6764 0x97D7 # +0x6765 0x97D8 # +0x6766 0x97D9 # +0x6767 0x97DD # +0x6768 0x97DE # +0x6769 0x97E0 # +0x676A 0x97DB # +0x676B 0x97E1 # +0x676C 0x97E4 # +0x676D 0x97EF # +0x676E 0x97F1 # +0x676F 0x97F4 # +0x6770 0x97F7 # +0x6771 0x97F8 # +0x6772 0x97FA # +0x6773 0x9807 # +0x6774 0x980A # +0x6775 0x9819 # +0x6776 0x980D # +0x6777 0x980E # +0x6778 0x9814 # +0x6779 0x9816 # +0x677A 0x981C # +0x677B 0x981E # +0x677C 0x9820 # +0x677D 0x9823 # +0x677E 0x9826 # +0x6821 0x982B # +0x6822 0x982E # +0x6823 0x982F # +0x6824 0x9830 # +0x6825 0x9832 # +0x6826 0x9833 # +0x6827 0x9835 # +0x6828 0x9825 # +0x6829 0x983E # +0x682A 0x9844 # +0x682B 0x9847 # +0x682C 0x984A # +0x682D 0x9851 # +0x682E 0x9852 # +0x682F 0x9853 # +0x6830 0x9856 # +0x6831 0x9857 # +0x6832 0x9859 # +0x6833 0x985A # +0x6834 0x9862 # +0x6835 0x9863 # +0x6836 0x9865 # +0x6837 0x9866 # +0x6838 0x986A # +0x6839 0x986C # +0x683A 0x98AB # +0x683B 0x98AD # +0x683C 0x98AE # +0x683D 0x98B0 # +0x683E 0x98B4 # +0x683F 0x98B7 # +0x6840 0x98B8 # +0x6841 0x98BA # +0x6842 0x98BB # +0x6843 0x98BF # +0x6844 0x98C2 # +0x6845 0x98C5 # +0x6846 0x98C8 # +0x6847 0x98CC # +0x6848 0x98E1 # +0x6849 0x98E3 # +0x684A 0x98E5 # +0x684B 0x98E6 # +0x684C 0x98E7 # +0x684D 0x98EA # +0x684E 0x98F3 # +0x684F 0x98F6 # +0x6850 0x9902 # +0x6851 0x9907 # +0x6852 0x9908 # +0x6853 0x9911 # +0x6854 0x9915 # +0x6855 0x9916 # +0x6856 0x9917 # +0x6857 0x991A # +0x6858 0x991B # +0x6859 0x991C # +0x685A 0x991F # +0x685B 0x9922 # +0x685C 0x9926 # +0x685D 0x9927 # +0x685E 0x992B # +0x685F 0x9931 # +0x6860 0x9932 # +0x6861 0x9933 # +0x6862 0x9934 # +0x6863 0x9935 # +0x6864 0x9939 # +0x6865 0x993A # +0x6866 0x993B # +0x6867 0x993C # +0x6868 0x9940 # +0x6869 0x9941 # +0x686A 0x9946 # +0x686B 0x9947 # +0x686C 0x9948 # +0x686D 0x994D # +0x686E 0x994E # +0x686F 0x9954 # +0x6870 0x9958 # +0x6871 0x9959 # +0x6872 0x995B # +0x6873 0x995C # +0x6874 0x995E # +0x6875 0x995F # +0x6876 0x9960 # +0x6877 0x999B # +0x6878 0x999D # +0x6879 0x999F # +0x687A 0x99A6 # +0x687B 0x99B0 # +0x687C 0x99B1 # +0x687D 0x99B2 # +0x687E 0x99B5 # +0x6921 0x99B9 # +0x6922 0x99BA # +0x6923 0x99BD # +0x6924 0x99BF # +0x6925 0x99C3 # +0x6926 0x99C9 # +0x6927 0x99D3 # +0x6928 0x99D4 # +0x6929 0x99D9 # +0x692A 0x99DA # +0x692B 0x99DC # +0x692C 0x99DE # +0x692D 0x99E7 # +0x692E 0x99EA # +0x692F 0x99EB # +0x6930 0x99EC # +0x6931 0x99F0 # +0x6932 0x99F4 # +0x6933 0x99F5 # +0x6934 0x99F9 # +0x6935 0x99FD # +0x6936 0x99FE # +0x6937 0x9A02 # +0x6938 0x9A03 # +0x6939 0x9A04 # +0x693A 0x9A0B # +0x693B 0x9A0C # +0x693C 0x9A10 # +0x693D 0x9A11 # +0x693E 0x9A16 # +0x693F 0x9A1E # +0x6940 0x9A20 # +0x6941 0x9A22 # +0x6942 0x9A23 # +0x6943 0x9A24 # +0x6944 0x9A27 # +0x6945 0x9A2D # +0x6946 0x9A2E # +0x6947 0x9A33 # +0x6948 0x9A35 # +0x6949 0x9A36 # +0x694A 0x9A38 # +0x694B 0x9A47 # +0x694C 0x9A41 # +0x694D 0x9A44 # +0x694E 0x9A4A # +0x694F 0x9A4B # +0x6950 0x9A4C # +0x6951 0x9A4E # +0x6952 0x9A51 # +0x6953 0x9A54 # +0x6954 0x9A56 # +0x6955 0x9A5D # +0x6956 0x9AAA # +0x6957 0x9AAC # +0x6958 0x9AAE # +0x6959 0x9AAF # +0x695A 0x9AB2 # +0x695B 0x9AB4 # +0x695C 0x9AB5 # +0x695D 0x9AB6 # +0x695E 0x9AB9 # +0x695F 0x9ABB # +0x6960 0x9ABE # +0x6961 0x9ABF # +0x6962 0x9AC1 # +0x6963 0x9AC3 # +0x6964 0x9AC6 # +0x6965 0x9AC8 # +0x6966 0x9ACE # +0x6967 0x9AD0 # +0x6968 0x9AD2 # +0x6969 0x9AD5 # +0x696A 0x9AD6 # +0x696B 0x9AD7 # +0x696C 0x9ADB # +0x696D 0x9ADC # +0x696E 0x9AE0 # +0x696F 0x9AE4 # +0x6970 0x9AE5 # +0x6971 0x9AE7 # +0x6972 0x9AE9 # +0x6973 0x9AEC # +0x6974 0x9AF2 # +0x6975 0x9AF3 # +0x6976 0x9AF5 # +0x6977 0x9AF9 # +0x6978 0x9AFA # +0x6979 0x9AFD # +0x697A 0x9AFF # +0x697B 0x9B00 # +0x697C 0x9B01 # +0x697D 0x9B02 # +0x697E 0x9B03 # +0x6A21 0x9B04 # +0x6A22 0x9B05 # +0x6A23 0x9B08 # +0x6A24 0x9B09 # +0x6A25 0x9B0B # +0x6A26 0x9B0C # +0x6A27 0x9B0D # +0x6A28 0x9B0E # +0x6A29 0x9B10 # +0x6A2A 0x9B12 # +0x6A2B 0x9B16 # +0x6A2C 0x9B19 # +0x6A2D 0x9B1B # +0x6A2E 0x9B1C # +0x6A2F 0x9B20 # +0x6A30 0x9B26 # +0x6A31 0x9B2B # +0x6A32 0x9B2D # +0x6A33 0x9B33 # +0x6A34 0x9B34 # +0x6A35 0x9B35 # +0x6A36 0x9B37 # +0x6A37 0x9B39 # +0x6A38 0x9B3A # +0x6A39 0x9B3D # +0x6A3A 0x9B48 # +0x6A3B 0x9B4B # +0x6A3C 0x9B4C # +0x6A3D 0x9B55 # +0x6A3E 0x9B56 # +0x6A3F 0x9B57 # +0x6A40 0x9B5B # +0x6A41 0x9B5E # +0x6A42 0x9B61 # +0x6A43 0x9B63 # +0x6A44 0x9B65 # +0x6A45 0x9B66 # +0x6A46 0x9B68 # +0x6A47 0x9B6A # +0x6A48 0x9B6B # +0x6A49 0x9B6C # +0x6A4A 0x9B6D # +0x6A4B 0x9B6E # +0x6A4C 0x9B73 # +0x6A4D 0x9B75 # +0x6A4E 0x9B77 # +0x6A4F 0x9B78 # +0x6A50 0x9B79 # +0x6A51 0x9B7F # +0x6A52 0x9B80 # +0x6A53 0x9B84 # +0x6A54 0x9B85 # +0x6A55 0x9B86 # +0x6A56 0x9B87 # +0x6A57 0x9B89 # +0x6A58 0x9B8A # +0x6A59 0x9B8B # +0x6A5A 0x9B8D # +0x6A5B 0x9B8F # +0x6A5C 0x9B90 # +0x6A5D 0x9B94 # +0x6A5E 0x9B9A # +0x6A5F 0x9B9D # +0x6A60 0x9B9E # +0x6A61 0x9BA6 # +0x6A62 0x9BA7 # +0x6A63 0x9BA9 # +0x6A64 0x9BAC # +0x6A65 0x9BB0 # +0x6A66 0x9BB1 # +0x6A67 0x9BB2 # +0x6A68 0x9BB7 # +0x6A69 0x9BB8 # +0x6A6A 0x9BBB # +0x6A6B 0x9BBC # +0x6A6C 0x9BBE # +0x6A6D 0x9BBF # +0x6A6E 0x9BC1 # +0x6A6F 0x9BC7 # +0x6A70 0x9BC8 # +0x6A71 0x9BCE # +0x6A72 0x9BD0 # +0x6A73 0x9BD7 # +0x6A74 0x9BD8 # +0x6A75 0x9BDD # +0x6A76 0x9BDF # +0x6A77 0x9BE5 # +0x6A78 0x9BE7 # +0x6A79 0x9BEA # +0x6A7A 0x9BEB # +0x6A7B 0x9BEF # +0x6A7C 0x9BF3 # +0x6A7D 0x9BF7 # +0x6A7E 0x9BF8 # +0x6B21 0x9BF9 # +0x6B22 0x9BFA # +0x6B23 0x9BFD # +0x6B24 0x9BFF # +0x6B25 0x9C00 # +0x6B26 0x9C02 # +0x6B27 0x9C0B # +0x6B28 0x9C0F # +0x6B29 0x9C11 # +0x6B2A 0x9C16 # +0x6B2B 0x9C18 # +0x6B2C 0x9C19 # +0x6B2D 0x9C1A # +0x6B2E 0x9C1C # +0x6B2F 0x9C1E # +0x6B30 0x9C22 # +0x6B31 0x9C23 # +0x6B32 0x9C26 # +0x6B33 0x9C27 # +0x6B34 0x9C28 # +0x6B35 0x9C29 # +0x6B36 0x9C2A # +0x6B37 0x9C31 # +0x6B38 0x9C35 # +0x6B39 0x9C36 # +0x6B3A 0x9C37 # +0x6B3B 0x9C3D # +0x6B3C 0x9C41 # +0x6B3D 0x9C43 # +0x6B3E 0x9C44 # +0x6B3F 0x9C45 # +0x6B40 0x9C49 # +0x6B41 0x9C4A # +0x6B42 0x9C4E # +0x6B43 0x9C4F # +0x6B44 0x9C50 # +0x6B45 0x9C53 # +0x6B46 0x9C54 # +0x6B47 0x9C56 # +0x6B48 0x9C58 # +0x6B49 0x9C5B # +0x6B4A 0x9C5D # +0x6B4B 0x9C5E # +0x6B4C 0x9C5F # +0x6B4D 0x9C63 # +0x6B4E 0x9C69 # +0x6B4F 0x9C6A # +0x6B50 0x9C5C # +0x6B51 0x9C6B # +0x6B52 0x9C68 # +0x6B53 0x9C6E # +0x6B54 0x9C70 # +0x6B55 0x9C72 # +0x6B56 0x9C75 # +0x6B57 0x9C77 # +0x6B58 0x9C7B # +0x6B59 0x9CE6 # +0x6B5A 0x9CF2 # +0x6B5B 0x9CF7 # +0x6B5C 0x9CF9 # +0x6B5D 0x9D0B # +0x6B5E 0x9D02 # +0x6B5F 0x9D11 # +0x6B60 0x9D17 # +0x6B61 0x9D18 # +0x6B62 0x9D1C # +0x6B63 0x9D1D # +0x6B64 0x9D1E # +0x6B65 0x9D2F # +0x6B66 0x9D30 # +0x6B67 0x9D32 # +0x6B68 0x9D33 # +0x6B69 0x9D34 # +0x6B6A 0x9D3A # +0x6B6B 0x9D3C # +0x6B6C 0x9D45 # +0x6B6D 0x9D3D # +0x6B6E 0x9D42 # +0x6B6F 0x9D43 # +0x6B70 0x9D47 # +0x6B71 0x9D4A # +0x6B72 0x9D53 # +0x6B73 0x9D54 # +0x6B74 0x9D5F # +0x6B75 0x9D63 # +0x6B76 0x9D62 # +0x6B77 0x9D65 # +0x6B78 0x9D69 # +0x6B79 0x9D6A # +0x6B7A 0x9D6B # +0x6B7B 0x9D70 # +0x6B7C 0x9D76 # +0x6B7D 0x9D77 # +0x6B7E 0x9D7B # +0x6C21 0x9D7C # +0x6C22 0x9D7E # +0x6C23 0x9D83 # +0x6C24 0x9D84 # +0x6C25 0x9D86 # +0x6C26 0x9D8A # +0x6C27 0x9D8D # +0x6C28 0x9D8E # +0x6C29 0x9D92 # +0x6C2A 0x9D93 # +0x6C2B 0x9D95 # +0x6C2C 0x9D96 # +0x6C2D 0x9D97 # +0x6C2E 0x9D98 # +0x6C2F 0x9DA1 # +0x6C30 0x9DAA # +0x6C31 0x9DAC # +0x6C32 0x9DAE # +0x6C33 0x9DB1 # +0x6C34 0x9DB5 # +0x6C35 0x9DB9 # +0x6C36 0x9DBC # +0x6C37 0x9DBF # +0x6C38 0x9DC3 # +0x6C39 0x9DC7 # +0x6C3A 0x9DC9 # +0x6C3B 0x9DCA # +0x6C3C 0x9DD4 # +0x6C3D 0x9DD5 # +0x6C3E 0x9DD6 # +0x6C3F 0x9DD7 # +0x6C40 0x9DDA # +0x6C41 0x9DDE # +0x6C42 0x9DDF # +0x6C43 0x9DE0 # +0x6C44 0x9DE5 # +0x6C45 0x9DE7 # +0x6C46 0x9DE9 # +0x6C47 0x9DEB # +0x6C48 0x9DEE # +0x6C49 0x9DF0 # +0x6C4A 0x9DF3 # +0x6C4B 0x9DF4 # +0x6C4C 0x9DFE # +0x6C4D 0x9E0A # +0x6C4E 0x9E02 # +0x6C4F 0x9E07 # +0x6C50 0x9E0E # +0x6C51 0x9E10 # +0x6C52 0x9E11 # +0x6C53 0x9E12 # +0x6C54 0x9E15 # +0x6C55 0x9E16 # +0x6C56 0x9E19 # +0x6C57 0x9E1C # +0x6C58 0x9E1D # +0x6C59 0x9E7A # +0x6C5A 0x9E7B # +0x6C5B 0x9E7C # +0x6C5C 0x9E80 # +0x6C5D 0x9E82 # +0x6C5E 0x9E83 # +0x6C5F 0x9E84 # +0x6C60 0x9E85 # +0x6C61 0x9E87 # +0x6C62 0x9E8E # +0x6C63 0x9E8F # +0x6C64 0x9E96 # +0x6C65 0x9E98 # +0x6C66 0x9E9B # +0x6C67 0x9E9E # +0x6C68 0x9EA4 # +0x6C69 0x9EA8 # +0x6C6A 0x9EAC # +0x6C6B 0x9EAE # +0x6C6C 0x9EAF # +0x6C6D 0x9EB0 # +0x6C6E 0x9EB3 # +0x6C6F 0x9EB4 # +0x6C70 0x9EB5 # +0x6C71 0x9EC6 # +0x6C72 0x9EC8 # +0x6C73 0x9ECB # +0x6C74 0x9ED5 # +0x6C75 0x9EDF # +0x6C76 0x9EE4 # +0x6C77 0x9EE7 # +0x6C78 0x9EEC # +0x6C79 0x9EED # +0x6C7A 0x9EEE # +0x6C7B 0x9EF0 # +0x6C7C 0x9EF1 # +0x6C7D 0x9EF2 # +0x6C7E 0x9EF5 # +0x6D21 0x9EF8 # +0x6D22 0x9EFF # +0x6D23 0x9F02 # +0x6D24 0x9F03 # +0x6D25 0x9F09 # +0x6D26 0x9F0F # +0x6D27 0x9F10 # +0x6D28 0x9F11 # +0x6D29 0x9F12 # +0x6D2A 0x9F14 # +0x6D2B 0x9F16 # +0x6D2C 0x9F17 # +0x6D2D 0x9F19 # +0x6D2E 0x9F1A # +0x6D2F 0x9F1B # +0x6D30 0x9F1F # +0x6D31 0x9F22 # +0x6D32 0x9F26 # +0x6D33 0x9F2A # +0x6D34 0x9F2B # +0x6D35 0x9F2F # +0x6D36 0x9F31 # +0x6D37 0x9F32 # +0x6D38 0x9F34 # +0x6D39 0x9F37 # +0x6D3A 0x9F39 # +0x6D3B 0x9F3A # +0x6D3C 0x9F3C # +0x6D3D 0x9F3D # +0x6D3E 0x9F3F # +0x6D3F 0x9F41 # +0x6D40 0x9F43 # +0x6D41 0x9F44 # +0x6D42 0x9F45 # +0x6D43 0x9F46 # +0x6D44 0x9F47 # +0x6D45 0x9F53 # +0x6D46 0x9F55 # +0x6D47 0x9F56 # +0x6D48 0x9F57 # +0x6D49 0x9F58 # +0x6D4A 0x9F5A # +0x6D4B 0x9F5D # +0x6D4C 0x9F5E # +0x6D4D 0x9F68 # +0x6D4E 0x9F69 # +0x6D4F 0x9F6D # +0x6D50 0x9F6E # +0x6D51 0x9F6F # +0x6D52 0x9F70 # +0x6D53 0x9F71 # +0x6D54 0x9F73 # +0x6D55 0x9F75 # +0x6D56 0x9F7A # +0x6D57 0x9F7D # +0x6D58 0x9F8F # +0x6D59 0x9F90 # +0x6D5A 0x9F91 # +0x6D5B 0x9F92 # +0x6D5C 0x9F94 # +0x6D5D 0x9F96 # +0x6D5E 0x9F97 # +0x6D5F 0x9F9E # +0x6D60 0x9FA1 # +0x6D61 0x9FA2 # +0x6D62 0x9FA3 # +0x6D63 0x9FA5 # From webhook-mailer at python.org Sat May 28 14:08:10 2022 From: webhook-mailer at python.org (rhettinger) Date: Sat, 28 May 2022 18:08:10 -0000 Subject: [Python-checkins] gh-92839: fixed typo in _bisectmodule.c (line 131) (#92849) Message-ID: https://github.com/python/cpython/commit/7fa9b7daa5a8bb5760724ac2d94f5298c60dc905 commit: 7fa9b7daa5a8bb5760724ac2d94f5298c60dc905 branch: main author: oda-gitso <105083118+oda-gitso at users.noreply.github.com> committer: rhettinger date: 2022-05-28T13:08:06-05:00 summary: gh-92839: fixed typo in _bisectmodule.c (line 131) (#92849) files: A Misc/NEWS.d/next/Library/2022-05-16-14-35-39.gh-issue-92839.owSMyo.rst M Lib/test/test_bisect.py M Modules/_bisectmodule.c diff --git a/Lib/test/test_bisect.py b/Lib/test/test_bisect.py index 20f8b9d7c0aa8..ba108221ebf45 100644 --- a/Lib/test/test_bisect.py +++ b/Lib/test/test_bisect.py @@ -257,6 +257,12 @@ def test_insort(self): target ) + def test_insort_keynotNone(self): + x = [] + y = {"a": 2, "b": 1} + for f in (self.module.insort_left, self.module.insort_right): + self.assertRaises(TypeError, f, x, y, key = "b") + class TestBisectPython(TestBisect, unittest.TestCase): module = py_bisect diff --git a/Misc/NEWS.d/next/Library/2022-05-16-14-35-39.gh-issue-92839.owSMyo.rst b/Misc/NEWS.d/next/Library/2022-05-16-14-35-39.gh-issue-92839.owSMyo.rst new file mode 100644 index 0000000000000..b425bd9c47bc9 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-05-16-14-35-39.gh-issue-92839.owSMyo.rst @@ -0,0 +1 @@ +Fixed crash resulting from calling bisect.insort() or bisect.insort_left() with the key argument not equal to None. diff --git a/Modules/_bisectmodule.c b/Modules/_bisectmodule.c index 19e9cd2d46f10..0caa92b2dc6e0 100644 --- a/Modules/_bisectmodule.c +++ b/Modules/_bisectmodule.c @@ -128,7 +128,7 @@ _bisect_insort_right_impl(PyObject *module, PyObject *a, PyObject *x, index = internal_bisect_right(a, x, lo, hi, key); } else { key_x = PyObject_CallOneArg(key, x); - if (x == NULL) { + if (key_x == NULL) { return NULL; } index = internal_bisect_right(a, key_x, lo, hi, key); @@ -256,7 +256,7 @@ _bisect_insort_left_impl(PyObject *module, PyObject *a, PyObject *x, index = internal_bisect_left(a, x, lo, hi, key); } else { key_x = PyObject_CallOneArg(key, x); - if (x == NULL) { + if (key_x == NULL) { return NULL; } index = internal_bisect_left(a, key_x, lo, hi, key); From webhook-mailer at python.org Sat May 28 14:11:16 2022 From: webhook-mailer at python.org (rhettinger) Date: Sat, 28 May 2022 18:11:16 -0000 Subject: [Python-checkins] gh-92727: Add example of named group in doc for re.Match.__getitem__ (#92730) Message-ID: https://github.com/python/cpython/commit/642d1fa81fed8ac260e1719013d77b9dfd93920f commit: 642d1fa81fed8ac260e1719013d77b9dfd93920f branch: main author: Baptiste Mispelon committer: rhettinger date: 2022-05-28T13:11:08-05:00 summary: gh-92727: Add example of named group in doc for re.Match.__getitem__ (#92730) files: M Doc/library/re.rst diff --git a/Doc/library/re.rst b/Doc/library/re.rst index d099f383d1206..1b9a7b63ef5e1 100644 --- a/Doc/library/re.rst +++ b/Doc/library/re.rst @@ -1327,6 +1327,14 @@ Match objects support the following methods and attributes: >>> m[2] # The second parenthesized subgroup. 'Newton' + Named groups are supported as well:: + + >>> m = re.match(r"(?P\w+) (?P\w+)", "Isaac Newton") + >>> m['first_name'] + 'Isaac' + >>> m['last_name'] + 'Newton' + .. versionadded:: 3.6 From webhook-mailer at python.org Sat May 28 14:29:00 2022 From: webhook-mailer at python.org (miss-islington) Date: Sat, 28 May 2022 18:29:00 -0000 Subject: [Python-checkins] gh-92727: Add example of named group in doc for re.Match.__getitem__ (GH-92730) Message-ID: https://github.com/python/cpython/commit/48647d00bf9c8ddfa1ace239de1c1b3943c43211 commit: 48647d00bf9c8ddfa1ace239de1c1b3943c43211 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-28T11:28:52-07:00 summary: gh-92727: Add example of named group in doc for re.Match.__getitem__ (GH-92730) (cherry picked from commit 642d1fa81fed8ac260e1719013d77b9dfd93920f) Co-authored-by: Baptiste Mispelon files: M Doc/library/re.rst diff --git a/Doc/library/re.rst b/Doc/library/re.rst index 2af86d22d4598..2392785d6c465 100644 --- a/Doc/library/re.rst +++ b/Doc/library/re.rst @@ -1324,6 +1324,14 @@ Match objects support the following methods and attributes: >>> m[2] # The second parenthesized subgroup. 'Newton' + Named groups are supported as well:: + + >>> m = re.match(r"(?P\w+) (?P\w+)", "Isaac Newton") + >>> m['first_name'] + 'Isaac' + >>> m['last_name'] + 'Newton' + .. versionadded:: 3.6 From webhook-mailer at python.org Sat May 28 14:31:14 2022 From: webhook-mailer at python.org (miss-islington) Date: Sat, 28 May 2022 18:31:14 -0000 Subject: [Python-checkins] gh-92839: fixed typo in _bisectmodule.c (line 131) (GH-92849) Message-ID: https://github.com/python/cpython/commit/85cb7f08eda7b12a6105003aa251c9e177351d91 commit: 85cb7f08eda7b12a6105003aa251c9e177351d91 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-28T11:31:06-07:00 summary: gh-92839: fixed typo in _bisectmodule.c (line 131) (GH-92849) (cherry picked from commit 7fa9b7daa5a8bb5760724ac2d94f5298c60dc905) Co-authored-by: oda-gitso <105083118+oda-gitso at users.noreply.github.com> files: A Misc/NEWS.d/next/Library/2022-05-16-14-35-39.gh-issue-92839.owSMyo.rst M Lib/test/test_bisect.py M Modules/_bisectmodule.c diff --git a/Lib/test/test_bisect.py b/Lib/test/test_bisect.py index 20f8b9d7c0aa8..ba108221ebf45 100644 --- a/Lib/test/test_bisect.py +++ b/Lib/test/test_bisect.py @@ -257,6 +257,12 @@ def test_insort(self): target ) + def test_insort_keynotNone(self): + x = [] + y = {"a": 2, "b": 1} + for f in (self.module.insort_left, self.module.insort_right): + self.assertRaises(TypeError, f, x, y, key = "b") + class TestBisectPython(TestBisect, unittest.TestCase): module = py_bisect diff --git a/Misc/NEWS.d/next/Library/2022-05-16-14-35-39.gh-issue-92839.owSMyo.rst b/Misc/NEWS.d/next/Library/2022-05-16-14-35-39.gh-issue-92839.owSMyo.rst new file mode 100644 index 0000000000000..b425bd9c47bc9 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-05-16-14-35-39.gh-issue-92839.owSMyo.rst @@ -0,0 +1 @@ +Fixed crash resulting from calling bisect.insort() or bisect.insort_left() with the key argument not equal to None. diff --git a/Modules/_bisectmodule.c b/Modules/_bisectmodule.c index 19e9cd2d46f10..0caa92b2dc6e0 100644 --- a/Modules/_bisectmodule.c +++ b/Modules/_bisectmodule.c @@ -128,7 +128,7 @@ _bisect_insort_right_impl(PyObject *module, PyObject *a, PyObject *x, index = internal_bisect_right(a, x, lo, hi, key); } else { key_x = PyObject_CallOneArg(key, x); - if (x == NULL) { + if (key_x == NULL) { return NULL; } index = internal_bisect_right(a, key_x, lo, hi, key); @@ -256,7 +256,7 @@ _bisect_insort_left_impl(PyObject *module, PyObject *a, PyObject *x, index = internal_bisect_left(a, x, lo, hi, key); } else { key_x = PyObject_CallOneArg(key, x); - if (x == NULL) { + if (key_x == NULL) { return NULL; } index = internal_bisect_left(a, key_x, lo, hi, key); From webhook-mailer at python.org Sat May 28 14:48:33 2022 From: webhook-mailer at python.org (rhettinger) Date: Sat, 28 May 2022 18:48:33 -0000 Subject: [Python-checkins] gh-92839: fixed typo in _bisectmodule.c (line 131) (GH-92849) (#93321) Message-ID: https://github.com/python/cpython/commit/550c44b89513ea96d209e2ff761302238715f082 commit: 550c44b89513ea96d209e2ff761302238715f082 branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: rhettinger date: 2022-05-28T13:48:25-05:00 summary: gh-92839: fixed typo in _bisectmodule.c (line 131) (GH-92849) (#93321) files: A Misc/NEWS.d/next/Library/2022-05-16-14-35-39.gh-issue-92839.owSMyo.rst M Lib/test/test_bisect.py M Modules/_bisectmodule.c diff --git a/Lib/test/test_bisect.py b/Lib/test/test_bisect.py index 20f8b9d7c0aa8..ba108221ebf45 100644 --- a/Lib/test/test_bisect.py +++ b/Lib/test/test_bisect.py @@ -257,6 +257,12 @@ def test_insort(self): target ) + def test_insort_keynotNone(self): + x = [] + y = {"a": 2, "b": 1} + for f in (self.module.insort_left, self.module.insort_right): + self.assertRaises(TypeError, f, x, y, key = "b") + class TestBisectPython(TestBisect, unittest.TestCase): module = py_bisect diff --git a/Misc/NEWS.d/next/Library/2022-05-16-14-35-39.gh-issue-92839.owSMyo.rst b/Misc/NEWS.d/next/Library/2022-05-16-14-35-39.gh-issue-92839.owSMyo.rst new file mode 100644 index 0000000000000..b425bd9c47bc9 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-05-16-14-35-39.gh-issue-92839.owSMyo.rst @@ -0,0 +1 @@ +Fixed crash resulting from calling bisect.insort() or bisect.insort_left() with the key argument not equal to None. diff --git a/Modules/_bisectmodule.c b/Modules/_bisectmodule.c index 26c4b9bfb26b2..16f981e7296ba 100644 --- a/Modules/_bisectmodule.c +++ b/Modules/_bisectmodule.c @@ -118,7 +118,7 @@ _bisect_insort_right_impl(PyObject *module, PyObject *a, PyObject *x, index = internal_bisect_right(a, x, lo, hi, key); } else { key_x = PyObject_CallOneArg(key, x); - if (x == NULL) { + if (key_x == NULL) { return NULL; } index = internal_bisect_right(a, key_x, lo, hi, key); @@ -245,7 +245,7 @@ _bisect_insort_left_impl(PyObject *module, PyObject *a, PyObject *x, index = internal_bisect_left(a, x, lo, hi, key); } else { key_x = PyObject_CallOneArg(key, x); - if (x == NULL) { + if (key_x == NULL) { return NULL; } index = internal_bisect_left(a, key_x, lo, hi, key); From webhook-mailer at python.org Sat May 28 20:49:37 2022 From: webhook-mailer at python.org (corona10) Date: Sun, 29 May 2022 00:49:37 -0000 Subject: [Python-checkins] Revert "gh-84508: Add mapping files for Korean and Japanese. (gh-93309)" (#93320) Message-ID: https://github.com/python/cpython/commit/749dc4b9c2703967986e4b309b568d9b84483cdf commit: 749dc4b9c2703967986e4b309b568d9b84483cdf branch: main author: Dong-hee Na committer: corona10 date: 2022-05-29T09:49:19+09:00 summary: Revert "gh-84508: Add mapping files for Korean and Japanese. (gh-93309)" (#93320) This reverts commit dec1e9346d82fa4a4761389c81d36ef9d01f332b. files: D Tools/unicode/python-mappings/CP932.TXT D Tools/unicode/python-mappings/CP949.TXT D Tools/unicode/python-mappings/JIS0208.TXT D Tools/unicode/python-mappings/JIS0212.TXT diff --git a/Tools/unicode/python-mappings/CP932.TXT b/Tools/unicode/python-mappings/CP932.TXT deleted file mode 100644 index 7ff471bcd1058..0000000000000 --- a/Tools/unicode/python-mappings/CP932.TXT +++ /dev/null @@ -1,7998 +0,0 @@ -# -# Name: cp932 to Unicode table -# Unicode version: 2.0 -# Table version: 2.01 -# Table format: Format A -# Date: 04/15/98 -# -# Contact: Shawn.Steele at 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/Tools/unicode/python-mappings/CP949.TXT b/Tools/unicode/python-mappings/CP949.TXT deleted file mode 100644 index d2822fc525d93..0000000000000 --- a/Tools/unicode/python-mappings/CP949.TXT +++ /dev/null @@ -1,17322 +0,0 @@ -# -# Name: cp949 to Unicode table -# Unicode version: 2.0 -# Table version: 2.01 -# Table format: Format A -# Date: 1/7/2000 -# -# Contact: Shawn.Steele at microsoft.com -# -# General notes: none -# -# Format: Three tab-separated columns -# Column #1 is the cp949 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 cp949 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 #DBCS LEAD BYTE -0xA1 #DBCS LEAD BYTE -0xA2 #DBCS LEAD BYTE -0xA3 #DBCS LEAD BYTE -0xA4 #DBCS LEAD BYTE -0xA5 #DBCS LEAD BYTE -0xA6 #DBCS LEAD BYTE -0xA7 #DBCS LEAD BYTE -0xA8 #DBCS LEAD BYTE -0xA9 #DBCS LEAD BYTE -0xAA #DBCS LEAD BYTE -0xAB #DBCS LEAD BYTE -0xAC #DBCS LEAD BYTE -0xAD #DBCS LEAD BYTE -0xAE #DBCS LEAD BYTE -0xAF #DBCS LEAD BYTE -0xB0 #DBCS LEAD BYTE -0xB1 #DBCS LEAD BYTE -0xB2 #DBCS LEAD BYTE -0xB3 #DBCS LEAD BYTE -0xB4 #DBCS LEAD BYTE -0xB5 #DBCS LEAD BYTE -0xB6 #DBCS LEAD BYTE -0xB7 #DBCS LEAD BYTE -0xB8 #DBCS LEAD BYTE -0xB9 #DBCS LEAD BYTE -0xBA #DBCS LEAD BYTE -0xBB #DBCS LEAD BYTE -0xBC #DBCS LEAD BYTE -0xBD #DBCS LEAD BYTE -0xBE #DBCS LEAD BYTE -0xBF #DBCS LEAD BYTE -0xC0 #DBCS LEAD BYTE -0xC1 #DBCS LEAD BYTE -0xC2 #DBCS LEAD BYTE -0xC3 #DBCS LEAD BYTE -0xC4 #DBCS LEAD BYTE -0xC5 #DBCS LEAD BYTE -0xC6 #DBCS LEAD BYTE -0xC7 #DBCS LEAD BYTE -0xC8 #DBCS LEAD BYTE -0xC9 #DBCS LEAD BYTE -0xCA #DBCS LEAD BYTE -0xCB #DBCS LEAD BYTE -0xCC #DBCS LEAD BYTE -0xCD #DBCS LEAD BYTE -0xCE #DBCS LEAD BYTE -0xCF #DBCS LEAD BYTE -0xD0 #DBCS LEAD BYTE -0xD1 #DBCS LEAD BYTE -0xD2 #DBCS LEAD BYTE -0xD3 #DBCS LEAD BYTE -0xD4 #DBCS LEAD BYTE -0xD5 #DBCS LEAD BYTE -0xD6 #DBCS LEAD BYTE -0xD7 #DBCS LEAD BYTE -0xD8 #DBCS LEAD BYTE -0xD9 #DBCS LEAD BYTE -0xDA #DBCS LEAD BYTE -0xDB #DBCS LEAD BYTE -0xDC #DBCS LEAD BYTE -0xDD #DBCS LEAD BYTE -0xDE #DBCS LEAD BYTE -0xDF #DBCS LEAD BYTE -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 #DBCS LEAD BYTE -0xFE #DBCS LEAD BYTE -0xFF #UNDEFINED -0x8141 0xAC02 #HANGUL SYLLABLE KIYEOK A SSANGKIYEOK -0x8142 0xAC03 #HANGUL SYLLABLE KIYEOK A KIYEOKSIOS -0x8143 0xAC05 #HANGUL SYLLABLE KIYEOK A NIEUNCIEUC -0x8144 0xAC06 #HANGUL SYLLABLE KIYEOK A NIEUNHIEUH -0x8145 0xAC0B #HANGUL SYLLABLE KIYEOK A RIEULPIEUP -0x8146 0xAC0C #HANGUL SYLLABLE KIYEOK A RIEULSIOS -0x8147 0xAC0D #HANGUL SYLLABLE KIYEOK A RIEULTHIEUTH -0x8148 0xAC0E #HANGUL SYLLABLE KIYEOK A RIEULPHIEUPH -0x8149 0xAC0F #HANGUL SYLLABLE KIYEOK A RIEULHIEUH -0x814A 0xAC18 #HANGUL SYLLABLE KIYEOK A KHIEUKH -0x814B 0xAC1E #HANGUL SYLLABLE KIYEOK AE SSANGKIYEOK -0x814C 0xAC1F #HANGUL SYLLABLE KIYEOK AE KIYEOKSIOS -0x814D 0xAC21 #HANGUL SYLLABLE KIYEOK AE NIEUNCIEUC -0x814E 0xAC22 #HANGUL SYLLABLE KIYEOK AE NIEUNHIEUH -0x814F 0xAC23 #HANGUL SYLLABLE KIYEOK AE TIKEUT -0x8150 0xAC25 #HANGUL SYLLABLE KIYEOK AE RIEULKIYEOK -0x8151 0xAC26 #HANGUL SYLLABLE KIYEOK AE RIEULMIEUM -0x8152 0xAC27 #HANGUL SYLLABLE KIYEOK AE RIEULPIEUP -0x8153 0xAC28 #HANGUL SYLLABLE KIYEOK AE RIEULSIOS -0x8154 0xAC29 #HANGUL SYLLABLE KIYEOK AE RIEULTHIEUTH -0x8155 0xAC2A #HANGUL SYLLABLE KIYEOK AE RIEULPHIEUPH -0x8156 0xAC2B #HANGUL SYLLABLE KIYEOK AE RIEULHIEUH -0x8157 0xAC2E #HANGUL SYLLABLE KIYEOK AE PIEUPSIOS -0x8158 0xAC32 #HANGUL SYLLABLE KIYEOK AE CIEUC -0x8159 0xAC33 #HANGUL SYLLABLE KIYEOK AE CHIEUCH -0x815A 0xAC34 #HANGUL SYLLABLE KIYEOK AE KHIEUKH -0x8161 0xAC35 #HANGUL SYLLABLE KIYEOK AE THIEUTH -0x8162 0xAC36 #HANGUL SYLLABLE KIYEOK AE PHIEUPH -0x8163 0xAC37 #HANGUL SYLLABLE KIYEOK AE HIEUH -0x8164 0xAC3A #HANGUL SYLLABLE KIYEOK YA SSANGKIYEOK -0x8165 0xAC3B #HANGUL SYLLABLE KIYEOK YA KIYEOKSIOS -0x8166 0xAC3D #HANGUL SYLLABLE KIYEOK YA NIEUNCIEUC -0x8167 0xAC3E #HANGUL SYLLABLE KIYEOK YA NIEUNHIEUH -0x8168 0xAC3F #HANGUL SYLLABLE KIYEOK YA TIKEUT -0x8169 0xAC41 #HANGUL SYLLABLE KIYEOK YA RIEULKIYEOK -0x816A 0xAC42 #HANGUL SYLLABLE KIYEOK YA RIEULMIEUM -0x816B 0xAC43 #HANGUL SYLLABLE KIYEOK YA RIEULPIEUP -0x816C 0xAC44 #HANGUL SYLLABLE KIYEOK YA RIEULSIOS -0x816D 0xAC45 #HANGUL SYLLABLE KIYEOK YA RIEULTHIEUTH -0x816E 0xAC46 #HANGUL SYLLABLE KIYEOK YA RIEULPHIEUPH -0x816F 0xAC47 #HANGUL SYLLABLE KIYEOK YA RIEULHIEUH -0x8170 0xAC48 #HANGUL SYLLABLE KIYEOK YA MIEUM -0x8171 0xAC49 #HANGUL SYLLABLE KIYEOK YA PIEUP -0x8172 0xAC4A #HANGUL SYLLABLE KIYEOK YA PIEUPSIOS -0x8173 0xAC4C #HANGUL SYLLABLE KIYEOK YA SSANGSIOS -0x8174 0xAC4E #HANGUL SYLLABLE KIYEOK YA CIEUC -0x8175 0xAC4F #HANGUL SYLLABLE KIYEOK YA CHIEUCH -0x8176 0xAC50 #HANGUL SYLLABLE KIYEOK YA KHIEUKH -0x8177 0xAC51 #HANGUL SYLLABLE KIYEOK YA THIEUTH -0x8178 0xAC52 #HANGUL SYLLABLE KIYEOK YA PHIEUPH -0x8179 0xAC53 #HANGUL SYLLABLE KIYEOK YA HIEUH -0x817A 0xAC55 #HANGUL SYLLABLE KIYEOK YAE KIYEOK -0x8181 0xAC56 #HANGUL SYLLABLE KIYEOK YAE SSANGKIYEOK -0x8182 0xAC57 #HANGUL SYLLABLE KIYEOK YAE KIYEOKSIOS -0x8183 0xAC59 #HANGUL SYLLABLE KIYEOK YAE NIEUNCIEUC -0x8184 0xAC5A #HANGUL SYLLABLE KIYEOK YAE NIEUNHIEUH -0x8185 0xAC5B #HANGUL SYLLABLE KIYEOK YAE TIKEUT -0x8186 0xAC5D #HANGUL SYLLABLE KIYEOK YAE RIEULKIYEOK -0x8187 0xAC5E #HANGUL SYLLABLE KIYEOK YAE RIEULMIEUM -0x8188 0xAC5F #HANGUL SYLLABLE KIYEOK YAE RIEULPIEUP -0x8189 0xAC60 #HANGUL SYLLABLE KIYEOK YAE RIEULSIOS -0x818A 0xAC61 #HANGUL SYLLABLE KIYEOK YAE RIEULTHIEUTH -0x818B 0xAC62 #HANGUL SYLLABLE KIYEOK YAE RIEULPHIEUPH -0x818C 0xAC63 #HANGUL SYLLABLE KIYEOK YAE RIEULHIEUH -0x818D 0xAC64 #HANGUL SYLLABLE KIYEOK YAE MIEUM -0x818E 0xAC65 #HANGUL SYLLABLE KIYEOK YAE PIEUP -0x818F 0xAC66 #HANGUL SYLLABLE KIYEOK YAE PIEUPSIOS -0x8190 0xAC67 #HANGUL SYLLABLE KIYEOK YAE SIOS -0x8191 0xAC68 #HANGUL SYLLABLE KIYEOK YAE SSANGSIOS -0x8192 0xAC69 #HANGUL SYLLABLE KIYEOK YAE IEUNG -0x8193 0xAC6A #HANGUL SYLLABLE KIYEOK YAE CIEUC -0x8194 0xAC6B #HANGUL SYLLABLE KIYEOK YAE CHIEUCH -0x8195 0xAC6C #HANGUL SYLLABLE KIYEOK YAE KHIEUKH -0x8196 0xAC6D #HANGUL SYLLABLE KIYEOK YAE THIEUTH -0x8197 0xAC6E #HANGUL SYLLABLE KIYEOK YAE PHIEUPH -0x8198 0xAC6F #HANGUL SYLLABLE KIYEOK YAE HIEUH -0x8199 0xAC72 #HANGUL SYLLABLE KIYEOK EO SSANGKIYEOK -0x819A 0xAC73 #HANGUL SYLLABLE KIYEOK EO KIYEOKSIOS -0x819B 0xAC75 #HANGUL SYLLABLE KIYEOK EO NIEUNCIEUC -0x819C 0xAC76 #HANGUL SYLLABLE KIYEOK EO NIEUNHIEUH -0x819D 0xAC79 #HANGUL SYLLABLE KIYEOK EO RIEULKIYEOK -0x819E 0xAC7B #HANGUL SYLLABLE KIYEOK EO RIEULPIEUP -0x819F 0xAC7C #HANGUL SYLLABLE KIYEOK EO RIEULSIOS -0x81A0 0xAC7D #HANGUL SYLLABLE KIYEOK EO RIEULTHIEUTH -0x81A1 0xAC7E #HANGUL SYLLABLE KIYEOK EO RIEULPHIEUPH -0x81A2 0xAC7F #HANGUL SYLLABLE KIYEOK EO RIEULHIEUH -0x81A3 0xAC82 #HANGUL SYLLABLE KIYEOK EO PIEUPSIOS -0x81A4 0xAC87 #HANGUL SYLLABLE KIYEOK EO CHIEUCH -0x81A5 0xAC88 #HANGUL SYLLABLE KIYEOK EO KHIEUKH -0x81A6 0xAC8D #HANGUL SYLLABLE KIYEOK E KIYEOK -0x81A7 0xAC8E #HANGUL SYLLABLE KIYEOK E SSANGKIYEOK -0x81A8 0xAC8F #HANGUL SYLLABLE KIYEOK E KIYEOKSIOS -0x81A9 0xAC91 #HANGUL SYLLABLE KIYEOK E NIEUNCIEUC -0x81AA 0xAC92 #HANGUL SYLLABLE KIYEOK E NIEUNHIEUH -0x81AB 0xAC93 #HANGUL SYLLABLE KIYEOK E TIKEUT -0x81AC 0xAC95 #HANGUL SYLLABLE KIYEOK E RIEULKIYEOK -0x81AD 0xAC96 #HANGUL SYLLABLE KIYEOK E RIEULMIEUM -0x81AE 0xAC97 #HANGUL SYLLABLE KIYEOK E RIEULPIEUP -0x81AF 0xAC98 #HANGUL SYLLABLE KIYEOK E RIEULSIOS -0x81B0 0xAC99 #HANGUL SYLLABLE KIYEOK E RIEULTHIEUTH -0x81B1 0xAC9A #HANGUL SYLLABLE KIYEOK E RIEULPHIEUPH -0x81B2 0xAC9B #HANGUL SYLLABLE KIYEOK E RIEULHIEUH -0x81B3 0xAC9E #HANGUL SYLLABLE KIYEOK E PIEUPSIOS -0x81B4 0xACA2 #HANGUL SYLLABLE KIYEOK E CIEUC -0x81B5 0xACA3 #HANGUL SYLLABLE KIYEOK E CHIEUCH -0x81B6 0xACA4 #HANGUL SYLLABLE KIYEOK E KHIEUKH -0x81B7 0xACA5 #HANGUL SYLLABLE KIYEOK E THIEUTH -0x81B8 0xACA6 #HANGUL SYLLABLE KIYEOK E PHIEUPH -0x81B9 0xACA7 #HANGUL SYLLABLE KIYEOK E HIEUH -0x81BA 0xACAB #HANGUL SYLLABLE KIYEOK YEO KIYEOKSIOS -0x81BB 0xACAD #HANGUL SYLLABLE KIYEOK YEO NIEUNCIEUC -0x81BC 0xACAE #HANGUL SYLLABLE KIYEOK YEO NIEUNHIEUH -0x81BD 0xACB1 #HANGUL SYLLABLE KIYEOK YEO RIEULKIYEOK -0x81BE 0xACB2 #HANGUL SYLLABLE KIYEOK YEO RIEULMIEUM -0x81BF 0xACB3 #HANGUL SYLLABLE KIYEOK YEO RIEULPIEUP -0x81C0 0xACB4 #HANGUL SYLLABLE KIYEOK YEO RIEULSIOS -0x81C1 0xACB5 #HANGUL SYLLABLE KIYEOK YEO RIEULTHIEUTH -0x81C2 0xACB6 #HANGUL SYLLABLE KIYEOK YEO RIEULPHIEUPH -0x81C3 0xACB7 #HANGUL SYLLABLE KIYEOK YEO RIEULHIEUH -0x81C4 0xACBA #HANGUL SYLLABLE KIYEOK YEO PIEUPSIOS -0x81C5 0xACBE #HANGUL SYLLABLE KIYEOK YEO CIEUC -0x81C6 0xACBF #HANGUL SYLLABLE KIYEOK YEO CHIEUCH -0x81C7 0xACC0 #HANGUL SYLLABLE KIYEOK YEO KHIEUKH -0x81C8 0xACC2 #HANGUL SYLLABLE KIYEOK YEO PHIEUPH -0x81C9 0xACC3 #HANGUL SYLLABLE KIYEOK YEO HIEUH -0x81CA 0xACC5 #HANGUL SYLLABLE KIYEOK YE KIYEOK -0x81CB 0xACC6 #HANGUL SYLLABLE KIYEOK YE SSANGKIYEOK -0x81CC 0xACC7 #HANGUL SYLLABLE KIYEOK YE KIYEOKSIOS -0x81CD 0xACC9 #HANGUL SYLLABLE KIYEOK YE NIEUNCIEUC -0x81CE 0xACCA #HANGUL SYLLABLE KIYEOK YE NIEUNHIEUH -0x81CF 0xACCB #HANGUL SYLLABLE KIYEOK YE TIKEUT -0x81D0 0xACCD #HANGUL SYLLABLE KIYEOK YE RIEULKIYEOK -0x81D1 0xACCE #HANGUL SYLLABLE KIYEOK YE RIEULMIEUM -0x81D2 0xACCF #HANGUL SYLLABLE KIYEOK YE RIEULPIEUP -0x81D3 0xACD0 #HANGUL SYLLABLE KIYEOK YE RIEULSIOS -0x81D4 0xACD1 #HANGUL SYLLABLE KIYEOK YE RIEULTHIEUTH -0x81D5 0xACD2 #HANGUL SYLLABLE KIYEOK YE RIEULPHIEUPH -0x81D6 0xACD3 #HANGUL SYLLABLE KIYEOK YE RIEULHIEUH -0x81D7 0xACD4 #HANGUL SYLLABLE KIYEOK YE MIEUM -0x81D8 0xACD6 #HANGUL SYLLABLE KIYEOK YE PIEUPSIOS -0x81D9 0xACD8 #HANGUL SYLLABLE KIYEOK YE SSANGSIOS -0x81DA 0xACD9 #HANGUL SYLLABLE KIYEOK YE IEUNG -0x81DB 0xACDA #HANGUL SYLLABLE KIYEOK YE CIEUC -0x81DC 0xACDB #HANGUL SYLLABLE KIYEOK YE CHIEUCH -0x81DD 0xACDC #HANGUL SYLLABLE KIYEOK YE KHIEUKH -0x81DE 0xACDD #HANGUL SYLLABLE KIYEOK YE THIEUTH -0x81DF 0xACDE #HANGUL SYLLABLE KIYEOK YE PHIEUPH -0x81E0 0xACDF #HANGUL SYLLABLE KIYEOK YE HIEUH -0x81E1 0xACE2 #HANGUL SYLLABLE KIYEOK O SSANGKIYEOK -0x81E2 0xACE3 #HANGUL SYLLABLE KIYEOK O KIYEOKSIOS -0x81E3 0xACE5 #HANGUL SYLLABLE KIYEOK O NIEUNCIEUC -0x81E4 0xACE6 #HANGUL SYLLABLE KIYEOK O NIEUNHIEUH -0x81E5 0xACE9 #HANGUL SYLLABLE KIYEOK O RIEULKIYEOK -0x81E6 0xACEB #HANGUL SYLLABLE KIYEOK O RIEULPIEUP -0x81E7 0xACED #HANGUL SYLLABLE KIYEOK O RIEULTHIEUTH -0x81E8 0xACEE #HANGUL SYLLABLE KIYEOK O RIEULPHIEUPH -0x81E9 0xACF2 #HANGUL SYLLABLE KIYEOK O PIEUPSIOS -0x81EA 0xACF4 #HANGUL SYLLABLE KIYEOK O SSANGSIOS -0x81EB 0xACF7 #HANGUL SYLLABLE KIYEOK O CHIEUCH -0x81EC 0xACF8 #HANGUL SYLLABLE KIYEOK O KHIEUKH -0x81ED 0xACF9 #HANGUL SYLLABLE KIYEOK O THIEUTH -0x81EE 0xACFA #HANGUL SYLLABLE KIYEOK O PHIEUPH -0x81EF 0xACFB #HANGUL SYLLABLE KIYEOK O HIEUH -0x81F0 0xACFE #HANGUL SYLLABLE KIYEOK WA SSANGKIYEOK -0x81F1 0xACFF #HANGUL SYLLABLE KIYEOK WA KIYEOKSIOS -0x81F2 0xAD01 #HANGUL SYLLABLE KIYEOK WA NIEUNCIEUC -0x81F3 0xAD02 #HANGUL SYLLABLE KIYEOK WA NIEUNHIEUH -0x81F4 0xAD03 #HANGUL SYLLABLE KIYEOK WA TIKEUT -0x81F5 0xAD05 #HANGUL SYLLABLE KIYEOK WA RIEULKIYEOK -0x81F6 0xAD07 #HANGUL SYLLABLE KIYEOK WA RIEULPIEUP -0x81F7 0xAD08 #HANGUL SYLLABLE KIYEOK WA RIEULSIOS -0x81F8 0xAD09 #HANGUL SYLLABLE KIYEOK WA RIEULTHIEUTH -0x81F9 0xAD0A #HANGUL SYLLABLE KIYEOK WA RIEULPHIEUPH -0x81FA 0xAD0B #HANGUL SYLLABLE KIYEOK WA RIEULHIEUH -0x81FB 0xAD0E #HANGUL SYLLABLE KIYEOK WA PIEUPSIOS -0x81FC 0xAD10 #HANGUL SYLLABLE KIYEOK WA SSANGSIOS -0x81FD 0xAD12 #HANGUL SYLLABLE KIYEOK WA CIEUC -0x81FE 0xAD13 #HANGUL SYLLABLE KIYEOK WA CHIEUCH -0x8241 0xAD14 #HANGUL SYLLABLE KIYEOK WA KHIEUKH -0x8242 0xAD15 #HANGUL SYLLABLE KIYEOK WA THIEUTH -0x8243 0xAD16 #HANGUL SYLLABLE KIYEOK WA PHIEUPH -0x8244 0xAD17 #HANGUL SYLLABLE KIYEOK WA HIEUH -0x8245 0xAD19 #HANGUL SYLLABLE KIYEOK WAE KIYEOK -0x8246 0xAD1A #HANGUL SYLLABLE KIYEOK WAE SSANGKIYEOK -0x8247 0xAD1B #HANGUL SYLLABLE KIYEOK WAE KIYEOKSIOS -0x8248 0xAD1D #HANGUL SYLLABLE KIYEOK WAE NIEUNCIEUC -0x8249 0xAD1E #HANGUL SYLLABLE KIYEOK WAE NIEUNHIEUH -0x824A 0xAD1F #HANGUL SYLLABLE KIYEOK WAE TIKEUT -0x824B 0xAD21 #HANGUL SYLLABLE KIYEOK WAE RIEULKIYEOK -0x824C 0xAD22 #HANGUL SYLLABLE KIYEOK WAE RIEULMIEUM -0x824D 0xAD23 #HANGUL SYLLABLE KIYEOK WAE RIEULPIEUP -0x824E 0xAD24 #HANGUL SYLLABLE KIYEOK WAE RIEULSIOS -0x824F 0xAD25 #HANGUL SYLLABLE KIYEOK WAE RIEULTHIEUTH -0x8250 0xAD26 #HANGUL SYLLABLE KIYEOK WAE RIEULPHIEUPH -0x8251 0xAD27 #HANGUL SYLLABLE KIYEOK WAE RIEULHIEUH -0x8252 0xAD28 #HANGUL SYLLABLE KIYEOK WAE MIEUM -0x8253 0xAD2A #HANGUL SYLLABLE KIYEOK WAE PIEUPSIOS -0x8254 0xAD2B #HANGUL SYLLABLE KIYEOK WAE SIOS -0x8255 0xAD2E #HANGUL SYLLABLE KIYEOK WAE CIEUC -0x8256 0xAD2F #HANGUL SYLLABLE KIYEOK WAE CHIEUCH -0x8257 0xAD30 #HANGUL SYLLABLE KIYEOK WAE KHIEUKH -0x8258 0xAD31 #HANGUL SYLLABLE KIYEOK WAE THIEUTH -0x8259 0xAD32 #HANGUL SYLLABLE KIYEOK WAE PHIEUPH -0x825A 0xAD33 #HANGUL SYLLABLE KIYEOK WAE HIEUH -0x8261 0xAD36 #HANGUL SYLLABLE KIYEOK OE SSANGKIYEOK -0x8262 0xAD37 #HANGUL SYLLABLE KIYEOK OE KIYEOKSIOS -0x8263 0xAD39 #HANGUL SYLLABLE KIYEOK OE NIEUNCIEUC -0x8264 0xAD3A #HANGUL SYLLABLE KIYEOK OE NIEUNHIEUH -0x8265 0xAD3B #HANGUL SYLLABLE KIYEOK OE TIKEUT -0x8266 0xAD3D #HANGUL SYLLABLE KIYEOK OE RIEULKIYEOK -0x8267 0xAD3E #HANGUL SYLLABLE KIYEOK OE RIEULMIEUM -0x8268 0xAD3F #HANGUL SYLLABLE KIYEOK OE RIEULPIEUP -0x8269 0xAD40 #HANGUL SYLLABLE KIYEOK OE RIEULSIOS -0x826A 0xAD41 #HANGUL SYLLABLE KIYEOK OE RIEULTHIEUTH -0x826B 0xAD42 #HANGUL SYLLABLE KIYEOK OE RIEULPHIEUPH -0x826C 0xAD43 #HANGUL SYLLABLE KIYEOK OE RIEULHIEUH -0x826D 0xAD46 #HANGUL SYLLABLE KIYEOK OE PIEUPSIOS -0x826E 0xAD48 #HANGUL SYLLABLE KIYEOK OE SSANGSIOS -0x826F 0xAD4A #HANGUL SYLLABLE KIYEOK OE CIEUC -0x8270 0xAD4B #HANGUL SYLLABLE KIYEOK OE CHIEUCH -0x8271 0xAD4C #HANGUL SYLLABLE KIYEOK OE KHIEUKH -0x8272 0xAD4D #HANGUL SYLLABLE KIYEOK OE THIEUTH -0x8273 0xAD4E #HANGUL SYLLABLE KIYEOK OE PHIEUPH -0x8274 0xAD4F #HANGUL SYLLABLE KIYEOK OE HIEUH -0x8275 0xAD51 #HANGUL SYLLABLE KIYEOK YO KIYEOK -0x8276 0xAD52 #HANGUL SYLLABLE KIYEOK YO SSANGKIYEOK -0x8277 0xAD53 #HANGUL SYLLABLE KIYEOK YO KIYEOKSIOS -0x8278 0xAD55 #HANGUL SYLLABLE KIYEOK YO NIEUNCIEUC -0x8279 0xAD56 #HANGUL SYLLABLE KIYEOK YO NIEUNHIEUH -0x827A 0xAD57 #HANGUL SYLLABLE KIYEOK YO TIKEUT -0x8281 0xAD59 #HANGUL SYLLABLE KIYEOK YO RIEULKIYEOK -0x8282 0xAD5A #HANGUL SYLLABLE KIYEOK YO RIEULMIEUM -0x8283 0xAD5B #HANGUL SYLLABLE KIYEOK YO RIEULPIEUP -0x8284 0xAD5C #HANGUL SYLLABLE KIYEOK YO RIEULSIOS -0x8285 0xAD5D #HANGUL SYLLABLE KIYEOK YO RIEULTHIEUTH -0x8286 0xAD5E #HANGUL SYLLABLE KIYEOK YO RIEULPHIEUPH -0x8287 0xAD5F #HANGUL SYLLABLE KIYEOK YO RIEULHIEUH -0x8288 0xAD60 #HANGUL SYLLABLE KIYEOK YO MIEUM -0x8289 0xAD62 #HANGUL SYLLABLE KIYEOK YO PIEUPSIOS -0x828A 0xAD64 #HANGUL SYLLABLE KIYEOK YO SSANGSIOS -0x828B 0xAD65 #HANGUL SYLLABLE KIYEOK YO IEUNG -0x828C 0xAD66 #HANGUL SYLLABLE KIYEOK YO CIEUC -0x828D 0xAD67 #HANGUL SYLLABLE KIYEOK YO CHIEUCH -0x828E 0xAD68 #HANGUL SYLLABLE KIYEOK YO KHIEUKH -0x828F 0xAD69 #HANGUL SYLLABLE KIYEOK YO THIEUTH -0x8290 0xAD6A #HANGUL SYLLABLE KIYEOK YO PHIEUPH -0x8291 0xAD6B #HANGUL SYLLABLE KIYEOK YO HIEUH -0x8292 0xAD6E #HANGUL SYLLABLE KIYEOK U SSANGKIYEOK -0x8293 0xAD6F #HANGUL SYLLABLE KIYEOK U KIYEOKSIOS -0x8294 0xAD71 #HANGUL SYLLABLE KIYEOK U NIEUNCIEUC -0x8295 0xAD72 #HANGUL SYLLABLE KIYEOK U NIEUNHIEUH -0x8296 0xAD77 #HANGUL SYLLABLE KIYEOK U RIEULPIEUP -0x8297 0xAD78 #HANGUL SYLLABLE KIYEOK U RIEULSIOS -0x8298 0xAD79 #HANGUL SYLLABLE KIYEOK U RIEULTHIEUTH -0x8299 0xAD7A #HANGUL SYLLABLE KIYEOK U RIEULPHIEUPH -0x829A 0xAD7E #HANGUL SYLLABLE KIYEOK U PIEUPSIOS -0x829B 0xAD80 #HANGUL SYLLABLE KIYEOK U SSANGSIOS -0x829C 0xAD83 #HANGUL SYLLABLE KIYEOK U CHIEUCH -0x829D 0xAD84 #HANGUL SYLLABLE KIYEOK U KHIEUKH -0x829E 0xAD85 #HANGUL SYLLABLE KIYEOK U THIEUTH -0x829F 0xAD86 #HANGUL SYLLABLE KIYEOK U PHIEUPH -0x82A0 0xAD87 #HANGUL SYLLABLE KIYEOK U HIEUH -0x82A1 0xAD8A #HANGUL SYLLABLE KIYEOK WEO SSANGKIYEOK -0x82A2 0xAD8B #HANGUL SYLLABLE KIYEOK WEO KIYEOKSIOS -0x82A3 0xAD8D #HANGUL SYLLABLE KIYEOK WEO NIEUNCIEUC -0x82A4 0xAD8E #HANGUL SYLLABLE KIYEOK WEO NIEUNHIEUH -0x82A5 0xAD8F #HANGUL SYLLABLE KIYEOK WEO TIKEUT -0x82A6 0xAD91 #HANGUL SYLLABLE KIYEOK WEO RIEULKIYEOK -0x82A7 0xAD92 #HANGUL SYLLABLE KIYEOK WEO RIEULMIEUM -0x82A8 0xAD93 #HANGUL SYLLABLE KIYEOK WEO RIEULPIEUP -0x82A9 0xAD94 #HANGUL SYLLABLE KIYEOK WEO RIEULSIOS -0x82AA 0xAD95 #HANGUL SYLLABLE KIYEOK WEO RIEULTHIEUTH -0x82AB 0xAD96 #HANGUL SYLLABLE KIYEOK WEO RIEULPHIEUPH -0x82AC 0xAD97 #HANGUL SYLLABLE KIYEOK WEO RIEULHIEUH -0x82AD 0xAD98 #HANGUL SYLLABLE KIYEOK WEO MIEUM -0x82AE 0xAD99 #HANGUL SYLLABLE KIYEOK WEO PIEUP -0x82AF 0xAD9A #HANGUL SYLLABLE KIYEOK WEO PIEUPSIOS -0x82B0 0xAD9B #HANGUL SYLLABLE KIYEOK WEO SIOS -0x82B1 0xAD9E #HANGUL SYLLABLE KIYEOK WEO CIEUC -0x82B2 0xAD9F #HANGUL SYLLABLE KIYEOK WEO CHIEUCH -0x82B3 0xADA0 #HANGUL SYLLABLE KIYEOK WEO KHIEUKH -0x82B4 0xADA1 #HANGUL SYLLABLE KIYEOK WEO THIEUTH -0x82B5 0xADA2 #HANGUL SYLLABLE KIYEOK WEO PHIEUPH -0x82B6 0xADA3 #HANGUL SYLLABLE KIYEOK WEO HIEUH -0x82B7 0xADA5 #HANGUL SYLLABLE KIYEOK WE KIYEOK -0x82B8 0xADA6 #HANGUL SYLLABLE KIYEOK WE SSANGKIYEOK -0x82B9 0xADA7 #HANGUL SYLLABLE KIYEOK WE KIYEOKSIOS -0x82BA 0xADA8 #HANGUL SYLLABLE KIYEOK WE NIEUN -0x82BB 0xADA9 #HANGUL SYLLABLE KIYEOK WE NIEUNCIEUC -0x82BC 0xADAA #HANGUL SYLLABLE KIYEOK WE NIEUNHIEUH -0x82BD 0xADAB #HANGUL SYLLABLE KIYEOK WE TIKEUT -0x82BE 0xADAC #HANGUL SYLLABLE KIYEOK WE RIEUL -0x82BF 0xADAD #HANGUL SYLLABLE KIYEOK WE RIEULKIYEOK -0x82C0 0xADAE #HANGUL SYLLABLE KIYEOK WE RIEULMIEUM -0x82C1 0xADAF #HANGUL SYLLABLE KIYEOK WE RIEULPIEUP -0x82C2 0xADB0 #HANGUL SYLLABLE KIYEOK WE RIEULSIOS -0x82C3 0xADB1 #HANGUL SYLLABLE KIYEOK WE RIEULTHIEUTH -0x82C4 0xADB2 #HANGUL SYLLABLE KIYEOK WE RIEULPHIEUPH -0x82C5 0xADB3 #HANGUL SYLLABLE KIYEOK WE RIEULHIEUH -0x82C6 0xADB4 #HANGUL SYLLABLE KIYEOK WE MIEUM -0x82C7 0xADB5 #HANGUL SYLLABLE KIYEOK WE PIEUP -0x82C8 0xADB6 #HANGUL SYLLABLE KIYEOK WE PIEUPSIOS -0x82C9 0xADB8 #HANGUL SYLLABLE KIYEOK WE SSANGSIOS -0x82CA 0xADB9 #HANGUL SYLLABLE KIYEOK WE IEUNG -0x82CB 0xADBA #HANGUL SYLLABLE KIYEOK WE CIEUC -0x82CC 0xADBB #HANGUL SYLLABLE KIYEOK WE CHIEUCH -0x82CD 0xADBC #HANGUL SYLLABLE KIYEOK WE KHIEUKH -0x82CE 0xADBD #HANGUL SYLLABLE KIYEOK WE THIEUTH -0x82CF 0xADBE #HANGUL SYLLABLE KIYEOK WE PHIEUPH -0x82D0 0xADBF #HANGUL SYLLABLE KIYEOK WE HIEUH -0x82D1 0xADC2 #HANGUL SYLLABLE KIYEOK WI SSANGKIYEOK -0x82D2 0xADC3 #HANGUL SYLLABLE KIYEOK WI KIYEOKSIOS -0x82D3 0xADC5 #HANGUL SYLLABLE KIYEOK WI NIEUNCIEUC -0x82D4 0xADC6 #HANGUL SYLLABLE KIYEOK WI NIEUNHIEUH -0x82D5 0xADC7 #HANGUL SYLLABLE KIYEOK WI TIKEUT -0x82D6 0xADC9 #HANGUL SYLLABLE KIYEOK WI RIEULKIYEOK -0x82D7 0xADCA #HANGUL SYLLABLE KIYEOK WI RIEULMIEUM -0x82D8 0xADCB #HANGUL SYLLABLE KIYEOK WI RIEULPIEUP -0x82D9 0xADCC #HANGUL SYLLABLE KIYEOK WI RIEULSIOS -0x82DA 0xADCD #HANGUL SYLLABLE KIYEOK WI RIEULTHIEUTH -0x82DB 0xADCE #HANGUL SYLLABLE KIYEOK WI RIEULPHIEUPH -0x82DC 0xADCF #HANGUL SYLLABLE KIYEOK WI RIEULHIEUH -0x82DD 0xADD2 #HANGUL SYLLABLE KIYEOK WI PIEUPSIOS -0x82DE 0xADD4 #HANGUL SYLLABLE KIYEOK WI SSANGSIOS -0x82DF 0xADD5 #HANGUL SYLLABLE KIYEOK WI IEUNG -0x82E0 0xADD6 #HANGUL SYLLABLE KIYEOK WI CIEUC -0x82E1 0xADD7 #HANGUL SYLLABLE KIYEOK WI CHIEUCH -0x82E2 0xADD8 #HANGUL SYLLABLE KIYEOK WI KHIEUKH -0x82E3 0xADD9 #HANGUL SYLLABLE KIYEOK WI THIEUTH -0x82E4 0xADDA #HANGUL SYLLABLE KIYEOK WI PHIEUPH -0x82E5 0xADDB #HANGUL SYLLABLE KIYEOK WI HIEUH -0x82E6 0xADDD #HANGUL SYLLABLE KIYEOK YU KIYEOK -0x82E7 0xADDE #HANGUL SYLLABLE KIYEOK YU SSANGKIYEOK -0x82E8 0xADDF #HANGUL SYLLABLE KIYEOK YU KIYEOKSIOS -0x82E9 0xADE1 #HANGUL SYLLABLE KIYEOK YU NIEUNCIEUC -0x82EA 0xADE2 #HANGUL SYLLABLE KIYEOK YU NIEUNHIEUH -0x82EB 0xADE3 #HANGUL SYLLABLE KIYEOK YU TIKEUT -0x82EC 0xADE5 #HANGUL SYLLABLE KIYEOK YU RIEULKIYEOK -0x82ED 0xADE6 #HANGUL SYLLABLE KIYEOK YU RIEULMIEUM -0x82EE 0xADE7 #HANGUL SYLLABLE KIYEOK YU RIEULPIEUP -0x82EF 0xADE8 #HANGUL SYLLABLE KIYEOK YU RIEULSIOS -0x82F0 0xADE9 #HANGUL SYLLABLE KIYEOK YU RIEULTHIEUTH -0x82F1 0xADEA #HANGUL SYLLABLE KIYEOK YU RIEULPHIEUPH -0x82F2 0xADEB #HANGUL SYLLABLE KIYEOK YU RIEULHIEUH -0x82F3 0xADEC #HANGUL SYLLABLE KIYEOK YU MIEUM -0x82F4 0xADED #HANGUL SYLLABLE KIYEOK YU PIEUP -0x82F5 0xADEE #HANGUL SYLLABLE KIYEOK YU PIEUPSIOS -0x82F6 0xADEF #HANGUL SYLLABLE KIYEOK YU SIOS -0x82F7 0xADF0 #HANGUL SYLLABLE KIYEOK YU SSANGSIOS -0x82F8 0xADF1 #HANGUL SYLLABLE KIYEOK YU IEUNG -0x82F9 0xADF2 #HANGUL SYLLABLE KIYEOK YU CIEUC -0x82FA 0xADF3 #HANGUL SYLLABLE KIYEOK YU CHIEUCH -0x82FB 0xADF4 #HANGUL SYLLABLE KIYEOK YU KHIEUKH -0x82FC 0xADF5 #HANGUL SYLLABLE KIYEOK YU THIEUTH -0x82FD 0xADF6 #HANGUL SYLLABLE KIYEOK YU PHIEUPH -0x82FE 0xADF7 #HANGUL SYLLABLE KIYEOK YU HIEUH -0x8341 0xADFA #HANGUL SYLLABLE KIYEOK EU SSANGKIYEOK -0x8342 0xADFB #HANGUL SYLLABLE KIYEOK EU KIYEOKSIOS -0x8343 0xADFD #HANGUL SYLLABLE KIYEOK EU NIEUNCIEUC -0x8344 0xADFE #HANGUL SYLLABLE KIYEOK EU NIEUNHIEUH -0x8345 0xAE02 #HANGUL SYLLABLE KIYEOK EU RIEULMIEUM -0x8346 0xAE03 #HANGUL SYLLABLE KIYEOK EU RIEULPIEUP -0x8347 0xAE04 #HANGUL SYLLABLE KIYEOK EU RIEULSIOS -0x8348 0xAE05 #HANGUL SYLLABLE KIYEOK EU RIEULTHIEUTH -0x8349 0xAE06 #HANGUL SYLLABLE KIYEOK EU RIEULPHIEUPH -0x834A 0xAE07 #HANGUL SYLLABLE KIYEOK EU RIEULHIEUH -0x834B 0xAE0A #HANGUL SYLLABLE KIYEOK EU PIEUPSIOS -0x834C 0xAE0C #HANGUL SYLLABLE KIYEOK EU SSANGSIOS -0x834D 0xAE0E #HANGUL SYLLABLE KIYEOK EU CIEUC -0x834E 0xAE0F #HANGUL SYLLABLE KIYEOK EU CHIEUCH -0x834F 0xAE10 #HANGUL SYLLABLE KIYEOK EU KHIEUKH -0x8350 0xAE11 #HANGUL SYLLABLE KIYEOK EU THIEUTH -0x8351 0xAE12 #HANGUL SYLLABLE KIYEOK EU PHIEUPH -0x8352 0xAE13 #HANGUL SYLLABLE KIYEOK EU HIEUH -0x8353 0xAE15 #HANGUL SYLLABLE KIYEOK YI KIYEOK -0x8354 0xAE16 #HANGUL SYLLABLE KIYEOK YI SSANGKIYEOK -0x8355 0xAE17 #HANGUL SYLLABLE KIYEOK YI KIYEOKSIOS -0x8356 0xAE18 #HANGUL SYLLABLE KIYEOK YI NIEUN -0x8357 0xAE19 #HANGUL SYLLABLE KIYEOK YI NIEUNCIEUC -0x8358 0xAE1A #HANGUL SYLLABLE KIYEOK YI NIEUNHIEUH -0x8359 0xAE1B #HANGUL SYLLABLE KIYEOK YI TIKEUT -0x835A 0xAE1C #HANGUL SYLLABLE KIYEOK YI RIEUL -0x8361 0xAE1D #HANGUL SYLLABLE KIYEOK YI RIEULKIYEOK -0x8362 0xAE1E #HANGUL SYLLABLE KIYEOK YI RIEULMIEUM -0x8363 0xAE1F #HANGUL SYLLABLE KIYEOK YI RIEULPIEUP -0x8364 0xAE20 #HANGUL SYLLABLE KIYEOK YI RIEULSIOS -0x8365 0xAE21 #HANGUL SYLLABLE KIYEOK YI RIEULTHIEUTH -0x8366 0xAE22 #HANGUL SYLLABLE KIYEOK YI RIEULPHIEUPH -0x8367 0xAE23 #HANGUL SYLLABLE KIYEOK YI RIEULHIEUH -0x8368 0xAE24 #HANGUL SYLLABLE KIYEOK YI MIEUM -0x8369 0xAE25 #HANGUL SYLLABLE KIYEOK YI PIEUP -0x836A 0xAE26 #HANGUL SYLLABLE KIYEOK YI PIEUPSIOS -0x836B 0xAE27 #HANGUL SYLLABLE KIYEOK YI SIOS -0x836C 0xAE28 #HANGUL SYLLABLE KIYEOK YI SSANGSIOS -0x836D 0xAE29 #HANGUL SYLLABLE KIYEOK YI IEUNG -0x836E 0xAE2A #HANGUL SYLLABLE KIYEOK YI CIEUC -0x836F 0xAE2B #HANGUL SYLLABLE KIYEOK YI CHIEUCH -0x8370 0xAE2C #HANGUL SYLLABLE KIYEOK YI KHIEUKH -0x8371 0xAE2D #HANGUL SYLLABLE KIYEOK YI THIEUTH -0x8372 0xAE2E #HANGUL SYLLABLE KIYEOK YI PHIEUPH -0x8373 0xAE2F #HANGUL SYLLABLE KIYEOK YI HIEUH -0x8374 0xAE32 #HANGUL SYLLABLE KIYEOK I SSANGKIYEOK -0x8375 0xAE33 #HANGUL SYLLABLE KIYEOK I KIYEOKSIOS -0x8376 0xAE35 #HANGUL SYLLABLE KIYEOK I NIEUNCIEUC -0x8377 0xAE36 #HANGUL SYLLABLE KIYEOK I NIEUNHIEUH -0x8378 0xAE39 #HANGUL SYLLABLE KIYEOK I RIEULKIYEOK -0x8379 0xAE3B #HANGUL SYLLABLE KIYEOK I RIEULPIEUP -0x837A 0xAE3C #HANGUL SYLLABLE KIYEOK I RIEULSIOS -0x8381 0xAE3D #HANGUL SYLLABLE KIYEOK I RIEULTHIEUTH -0x8382 0xAE3E #HANGUL SYLLABLE KIYEOK I RIEULPHIEUPH -0x8383 0xAE3F #HANGUL SYLLABLE KIYEOK I RIEULHIEUH -0x8384 0xAE42 #HANGUL SYLLABLE KIYEOK I PIEUPSIOS -0x8385 0xAE44 #HANGUL SYLLABLE KIYEOK I SSANGSIOS -0x8386 0xAE47 #HANGUL SYLLABLE KIYEOK I CHIEUCH -0x8387 0xAE48 #HANGUL SYLLABLE KIYEOK I KHIEUKH -0x8388 0xAE49 #HANGUL SYLLABLE KIYEOK I THIEUTH -0x8389 0xAE4B #HANGUL SYLLABLE KIYEOK I HIEUH -0x838A 0xAE4F #HANGUL SYLLABLE SSANGKIYEOK A KIYEOKSIOS -0x838B 0xAE51 #HANGUL SYLLABLE SSANGKIYEOK A NIEUNCIEUC -0x838C 0xAE52 #HANGUL SYLLABLE SSANGKIYEOK A NIEUNHIEUH -0x838D 0xAE53 #HANGUL SYLLABLE SSANGKIYEOK A TIKEUT -0x838E 0xAE55 #HANGUL SYLLABLE SSANGKIYEOK A RIEULKIYEOK -0x838F 0xAE57 #HANGUL SYLLABLE SSANGKIYEOK A RIEULPIEUP -0x8390 0xAE58 #HANGUL SYLLABLE SSANGKIYEOK A RIEULSIOS -0x8391 0xAE59 #HANGUL SYLLABLE SSANGKIYEOK A RIEULTHIEUTH -0x8392 0xAE5A #HANGUL SYLLABLE SSANGKIYEOK A RIEULPHIEUPH -0x8393 0xAE5B #HANGUL SYLLABLE SSANGKIYEOK A RIEULHIEUH -0x8394 0xAE5E #HANGUL SYLLABLE SSANGKIYEOK A PIEUPSIOS -0x8395 0xAE62 #HANGUL SYLLABLE SSANGKIYEOK A CIEUC -0x8396 0xAE63 #HANGUL SYLLABLE SSANGKIYEOK A CHIEUCH -0x8397 0xAE64 #HANGUL SYLLABLE SSANGKIYEOK A KHIEUKH -0x8398 0xAE66 #HANGUL SYLLABLE SSANGKIYEOK A PHIEUPH -0x8399 0xAE67 #HANGUL SYLLABLE SSANGKIYEOK A HIEUH -0x839A 0xAE6A #HANGUL SYLLABLE SSANGKIYEOK AE SSANGKIYEOK -0x839B 0xAE6B #HANGUL SYLLABLE SSANGKIYEOK AE KIYEOKSIOS -0x839C 0xAE6D #HANGUL SYLLABLE SSANGKIYEOK AE NIEUNCIEUC -0x839D 0xAE6E #HANGUL SYLLABLE SSANGKIYEOK AE NIEUNHIEUH -0x839E 0xAE6F #HANGUL SYLLABLE SSANGKIYEOK AE TIKEUT -0x839F 0xAE71 #HANGUL SYLLABLE SSANGKIYEOK AE RIEULKIYEOK -0x83A0 0xAE72 #HANGUL SYLLABLE SSANGKIYEOK AE RIEULMIEUM -0x83A1 0xAE73 #HANGUL SYLLABLE SSANGKIYEOK AE RIEULPIEUP -0x83A2 0xAE74 #HANGUL SYLLABLE SSANGKIYEOK AE RIEULSIOS -0x83A3 0xAE75 #HANGUL SYLLABLE SSANGKIYEOK AE RIEULTHIEUTH -0x83A4 0xAE76 #HANGUL SYLLABLE SSANGKIYEOK AE RIEULPHIEUPH -0x83A5 0xAE77 #HANGUL SYLLABLE SSANGKIYEOK AE RIEULHIEUH -0x83A6 0xAE7A #HANGUL SYLLABLE SSANGKIYEOK AE PIEUPSIOS -0x83A7 0xAE7E #HANGUL SYLLABLE SSANGKIYEOK AE CIEUC -0x83A8 0xAE7F #HANGUL SYLLABLE SSANGKIYEOK AE CHIEUCH -0x83A9 0xAE80 #HANGUL SYLLABLE SSANGKIYEOK AE KHIEUKH -0x83AA 0xAE81 #HANGUL SYLLABLE SSANGKIYEOK AE THIEUTH -0x83AB 0xAE82 #HANGUL SYLLABLE SSANGKIYEOK AE PHIEUPH -0x83AC 0xAE83 #HANGUL SYLLABLE SSANGKIYEOK AE HIEUH -0x83AD 0xAE86 #HANGUL SYLLABLE SSANGKIYEOK YA SSANGKIYEOK -0x83AE 0xAE87 #HANGUL SYLLABLE SSANGKIYEOK YA KIYEOKSIOS -0x83AF 0xAE88 #HANGUL SYLLABLE SSANGKIYEOK YA NIEUN -0x83B0 0xAE89 #HANGUL SYLLABLE SSANGKIYEOK YA NIEUNCIEUC -0x83B1 0xAE8A #HANGUL SYLLABLE SSANGKIYEOK YA NIEUNHIEUH -0x83B2 0xAE8B #HANGUL SYLLABLE SSANGKIYEOK YA TIKEUT -0x83B3 0xAE8D #HANGUL SYLLABLE SSANGKIYEOK YA RIEULKIYEOK -0x83B4 0xAE8E #HANGUL SYLLABLE SSANGKIYEOK YA RIEULMIEUM -0x83B5 0xAE8F #HANGUL SYLLABLE SSANGKIYEOK YA RIEULPIEUP -0x83B6 0xAE90 #HANGUL SYLLABLE SSANGKIYEOK YA RIEULSIOS -0x83B7 0xAE91 #HANGUL SYLLABLE SSANGKIYEOK YA RIEULTHIEUTH -0x83B8 0xAE92 #HANGUL SYLLABLE SSANGKIYEOK YA RIEULPHIEUPH -0x83B9 0xAE93 #HANGUL SYLLABLE SSANGKIYEOK YA RIEULHIEUH -0x83BA 0xAE94 #HANGUL SYLLABLE SSANGKIYEOK YA MIEUM -0x83BB 0xAE95 #HANGUL SYLLABLE SSANGKIYEOK YA PIEUP -0x83BC 0xAE96 #HANGUL SYLLABLE SSANGKIYEOK YA PIEUPSIOS -0x83BD 0xAE97 #HANGUL SYLLABLE SSANGKIYEOK YA SIOS -0x83BE 0xAE98 #HANGUL SYLLABLE SSANGKIYEOK YA SSANGSIOS -0x83BF 0xAE99 #HANGUL SYLLABLE SSANGKIYEOK YA IEUNG -0x83C0 0xAE9A #HANGUL SYLLABLE SSANGKIYEOK YA CIEUC -0x83C1 0xAE9B #HANGUL SYLLABLE SSANGKIYEOK YA CHIEUCH -0x83C2 0xAE9C #HANGUL SYLLABLE SSANGKIYEOK YA KHIEUKH -0x83C3 0xAE9D #HANGUL SYLLABLE SSANGKIYEOK YA THIEUTH -0x83C4 0xAE9E #HANGUL SYLLABLE SSANGKIYEOK YA PHIEUPH -0x83C5 0xAE9F #HANGUL SYLLABLE SSANGKIYEOK YA HIEUH -0x83C6 0xAEA0 #HANGUL SYLLABLE SSANGKIYEOK YAE -0x83C7 0xAEA1 #HANGUL SYLLABLE SSANGKIYEOK YAE KIYEOK -0x83C8 0xAEA2 #HANGUL SYLLABLE SSANGKIYEOK YAE SSANGKIYEOK -0x83C9 0xAEA3 #HANGUL SYLLABLE SSANGKIYEOK YAE KIYEOKSIOS -0x83CA 0xAEA4 #HANGUL SYLLABLE SSANGKIYEOK YAE NIEUN -0x83CB 0xAEA5 #HANGUL SYLLABLE SSANGKIYEOK YAE NIEUNCIEUC -0x83CC 0xAEA6 #HANGUL SYLLABLE SSANGKIYEOK YAE NIEUNHIEUH -0x83CD 0xAEA7 #HANGUL SYLLABLE SSANGKIYEOK YAE TIKEUT -0x83CE 0xAEA8 #HANGUL SYLLABLE SSANGKIYEOK YAE RIEUL -0x83CF 0xAEA9 #HANGUL SYLLABLE SSANGKIYEOK YAE RIEULKIYEOK -0x83D0 0xAEAA #HANGUL SYLLABLE SSANGKIYEOK YAE RIEULMIEUM -0x83D1 0xAEAB #HANGUL SYLLABLE SSANGKIYEOK YAE RIEULPIEUP -0x83D2 0xAEAC #HANGUL SYLLABLE SSANGKIYEOK YAE RIEULSIOS -0x83D3 0xAEAD #HANGUL SYLLABLE SSANGKIYEOK YAE RIEULTHIEUTH -0x83D4 0xAEAE #HANGUL SYLLABLE SSANGKIYEOK YAE RIEULPHIEUPH -0x83D5 0xAEAF #HANGUL SYLLABLE SSANGKIYEOK YAE RIEULHIEUH -0x83D6 0xAEB0 #HANGUL SYLLABLE SSANGKIYEOK YAE MIEUM -0x83D7 0xAEB1 #HANGUL SYLLABLE SSANGKIYEOK YAE PIEUP -0x83D8 0xAEB2 #HANGUL SYLLABLE SSANGKIYEOK YAE PIEUPSIOS -0x83D9 0xAEB3 #HANGUL SYLLABLE SSANGKIYEOK YAE SIOS -0x83DA 0xAEB4 #HANGUL SYLLABLE SSANGKIYEOK YAE SSANGSIOS -0x83DB 0xAEB5 #HANGUL SYLLABLE SSANGKIYEOK YAE IEUNG -0x83DC 0xAEB6 #HANGUL SYLLABLE SSANGKIYEOK YAE CIEUC -0x83DD 0xAEB7 #HANGUL SYLLABLE SSANGKIYEOK YAE CHIEUCH -0x83DE 0xAEB8 #HANGUL SYLLABLE SSANGKIYEOK YAE KHIEUKH -0x83DF 0xAEB9 #HANGUL SYLLABLE SSANGKIYEOK YAE THIEUTH -0x83E0 0xAEBA #HANGUL SYLLABLE SSANGKIYEOK YAE PHIEUPH -0x83E1 0xAEBB #HANGUL SYLLABLE SSANGKIYEOK YAE HIEUH -0x83E2 0xAEBF #HANGUL SYLLABLE SSANGKIYEOK EO KIYEOKSIOS -0x83E3 0xAEC1 #HANGUL SYLLABLE SSANGKIYEOK EO NIEUNCIEUC -0x83E4 0xAEC2 #HANGUL SYLLABLE SSANGKIYEOK EO NIEUNHIEUH -0x83E5 0xAEC3 #HANGUL SYLLABLE SSANGKIYEOK EO TIKEUT -0x83E6 0xAEC5 #HANGUL SYLLABLE SSANGKIYEOK EO RIEULKIYEOK -0x83E7 0xAEC6 #HANGUL SYLLABLE SSANGKIYEOK EO RIEULMIEUM -0x83E8 0xAEC7 #HANGUL SYLLABLE SSANGKIYEOK EO RIEULPIEUP -0x83E9 0xAEC8 #HANGUL SYLLABLE SSANGKIYEOK EO RIEULSIOS -0x83EA 0xAEC9 #HANGUL SYLLABLE SSANGKIYEOK EO RIEULTHIEUTH -0x83EB 0xAECA #HANGUL SYLLABLE SSANGKIYEOK EO RIEULPHIEUPH -0x83EC 0xAECB #HANGUL SYLLABLE SSANGKIYEOK EO RIEULHIEUH -0x83ED 0xAECE #HANGUL SYLLABLE SSANGKIYEOK EO PIEUPSIOS -0x83EE 0xAED2 #HANGUL SYLLABLE SSANGKIYEOK EO CIEUC -0x83EF 0xAED3 #HANGUL SYLLABLE SSANGKIYEOK EO CHIEUCH -0x83F0 0xAED4 #HANGUL SYLLABLE SSANGKIYEOK EO KHIEUKH -0x83F1 0xAED5 #HANGUL SYLLABLE SSANGKIYEOK EO THIEUTH -0x83F2 0xAED6 #HANGUL SYLLABLE SSANGKIYEOK EO PHIEUPH -0x83F3 0xAED7 #HANGUL SYLLABLE SSANGKIYEOK EO HIEUH -0x83F4 0xAEDA #HANGUL SYLLABLE SSANGKIYEOK E SSANGKIYEOK -0x83F5 0xAEDB #HANGUL SYLLABLE SSANGKIYEOK E KIYEOKSIOS -0x83F6 0xAEDD #HANGUL SYLLABLE SSANGKIYEOK E NIEUNCIEUC -0x83F7 0xAEDE #HANGUL SYLLABLE SSANGKIYEOK E NIEUNHIEUH -0x83F8 0xAEDF #HANGUL SYLLABLE SSANGKIYEOK E TIKEUT -0x83F9 0xAEE0 #HANGUL SYLLABLE SSANGKIYEOK E RIEUL -0x83FA 0xAEE1 #HANGUL SYLLABLE SSANGKIYEOK E RIEULKIYEOK -0x83FB 0xAEE2 #HANGUL SYLLABLE SSANGKIYEOK E RIEULMIEUM -0x83FC 0xAEE3 #HANGUL SYLLABLE SSANGKIYEOK E RIEULPIEUP -0x83FD 0xAEE4 #HANGUL SYLLABLE SSANGKIYEOK E RIEULSIOS -0x83FE 0xAEE5 #HANGUL SYLLABLE SSANGKIYEOK E RIEULTHIEUTH -0x8441 0xAEE6 #HANGUL SYLLABLE SSANGKIYEOK E RIEULPHIEUPH -0x8442 0xAEE7 #HANGUL SYLLABLE SSANGKIYEOK E RIEULHIEUH -0x8443 0xAEE9 #HANGUL SYLLABLE SSANGKIYEOK E PIEUP -0x8444 0xAEEA #HANGUL SYLLABLE SSANGKIYEOK E PIEUPSIOS -0x8445 0xAEEC #HANGUL SYLLABLE SSANGKIYEOK E SSANGSIOS -0x8446 0xAEEE #HANGUL SYLLABLE SSANGKIYEOK E CIEUC -0x8447 0xAEEF #HANGUL SYLLABLE SSANGKIYEOK E CHIEUCH -0x8448 0xAEF0 #HANGUL SYLLABLE SSANGKIYEOK E KHIEUKH -0x8449 0xAEF1 #HANGUL SYLLABLE SSANGKIYEOK E THIEUTH -0x844A 0xAEF2 #HANGUL SYLLABLE SSANGKIYEOK E PHIEUPH -0x844B 0xAEF3 #HANGUL SYLLABLE SSANGKIYEOK E HIEUH -0x844C 0xAEF5 #HANGUL SYLLABLE SSANGKIYEOK YEO KIYEOK -0x844D 0xAEF6 #HANGUL SYLLABLE SSANGKIYEOK YEO SSANGKIYEOK -0x844E 0xAEF7 #HANGUL SYLLABLE SSANGKIYEOK YEO KIYEOKSIOS -0x844F 0xAEF9 #HANGUL SYLLABLE SSANGKIYEOK YEO NIEUNCIEUC -0x8450 0xAEFA #HANGUL SYLLABLE SSANGKIYEOK YEO NIEUNHIEUH -0x8451 0xAEFB #HANGUL SYLLABLE SSANGKIYEOK YEO TIKEUT -0x8452 0xAEFD #HANGUL SYLLABLE SSANGKIYEOK YEO RIEULKIYEOK -0x8453 0xAEFE #HANGUL SYLLABLE SSANGKIYEOK YEO RIEULMIEUM -0x8454 0xAEFF #HANGUL SYLLABLE SSANGKIYEOK YEO RIEULPIEUP -0x8455 0xAF00 #HANGUL SYLLABLE SSANGKIYEOK YEO RIEULSIOS -0x8456 0xAF01 #HANGUL SYLLABLE SSANGKIYEOK YEO RIEULTHIEUTH -0x8457 0xAF02 #HANGUL SYLLABLE SSANGKIYEOK YEO RIEULPHIEUPH -0x8458 0xAF03 #HANGUL SYLLABLE SSANGKIYEOK YEO RIEULHIEUH -0x8459 0xAF04 #HANGUL SYLLABLE SSANGKIYEOK YEO MIEUM -0x845A 0xAF05 #HANGUL SYLLABLE SSANGKIYEOK YEO PIEUP -0x8461 0xAF06 #HANGUL SYLLABLE SSANGKIYEOK YEO PIEUPSIOS -0x8462 0xAF09 #HANGUL SYLLABLE SSANGKIYEOK YEO IEUNG -0x8463 0xAF0A #HANGUL SYLLABLE SSANGKIYEOK YEO CIEUC -0x8464 0xAF0B #HANGUL SYLLABLE SSANGKIYEOK YEO CHIEUCH -0x8465 0xAF0C #HANGUL SYLLABLE SSANGKIYEOK YEO KHIEUKH -0x8466 0xAF0E #HANGUL SYLLABLE SSANGKIYEOK YEO PHIEUPH -0x8467 0xAF0F #HANGUL SYLLABLE SSANGKIYEOK YEO HIEUH -0x8468 0xAF11 #HANGUL SYLLABLE SSANGKIYEOK YE KIYEOK -0x8469 0xAF12 #HANGUL SYLLABLE SSANGKIYEOK YE SSANGKIYEOK -0x846A 0xAF13 #HANGUL SYLLABLE SSANGKIYEOK YE KIYEOKSIOS -0x846B 0xAF14 #HANGUL SYLLABLE SSANGKIYEOK YE NIEUN -0x846C 0xAF15 #HANGUL SYLLABLE SSANGKIYEOK YE NIEUNCIEUC -0x846D 0xAF16 #HANGUL SYLLABLE SSANGKIYEOK YE NIEUNHIEUH -0x846E 0xAF17 #HANGUL SYLLABLE SSANGKIYEOK YE TIKEUT -0x846F 0xAF18 #HANGUL SYLLABLE SSANGKIYEOK YE RIEUL -0x8470 0xAF19 #HANGUL SYLLABLE SSANGKIYEOK YE RIEULKIYEOK -0x8471 0xAF1A #HANGUL SYLLABLE SSANGKIYEOK YE RIEULMIEUM -0x8472 0xAF1B #HANGUL SYLLABLE SSANGKIYEOK YE RIEULPIEUP -0x8473 0xAF1C #HANGUL SYLLABLE SSANGKIYEOK YE RIEULSIOS -0x8474 0xAF1D #HANGUL SYLLABLE SSANGKIYEOK YE RIEULTHIEUTH -0x8475 0xAF1E #HANGUL SYLLABLE SSANGKIYEOK YE RIEULPHIEUPH -0x8476 0xAF1F #HANGUL SYLLABLE SSANGKIYEOK YE RIEULHIEUH -0x8477 0xAF20 #HANGUL SYLLABLE SSANGKIYEOK YE MIEUM -0x8478 0xAF21 #HANGUL SYLLABLE SSANGKIYEOK YE PIEUP -0x8479 0xAF22 #HANGUL SYLLABLE SSANGKIYEOK YE PIEUPSIOS -0x847A 0xAF23 #HANGUL SYLLABLE SSANGKIYEOK YE SIOS -0x8481 0xAF24 #HANGUL SYLLABLE SSANGKIYEOK YE SSANGSIOS -0x8482 0xAF25 #HANGUL SYLLABLE SSANGKIYEOK YE IEUNG -0x8483 0xAF26 #HANGUL SYLLABLE SSANGKIYEOK YE CIEUC -0x8484 0xAF27 #HANGUL SYLLABLE SSANGKIYEOK YE CHIEUCH -0x8485 0xAF28 #HANGUL SYLLABLE SSANGKIYEOK YE KHIEUKH -0x8486 0xAF29 #HANGUL SYLLABLE SSANGKIYEOK YE THIEUTH -0x8487 0xAF2A #HANGUL SYLLABLE SSANGKIYEOK YE PHIEUPH -0x8488 0xAF2B #HANGUL SYLLABLE SSANGKIYEOK YE HIEUH -0x8489 0xAF2E #HANGUL SYLLABLE SSANGKIYEOK O SSANGKIYEOK -0x848A 0xAF2F #HANGUL SYLLABLE SSANGKIYEOK O KIYEOKSIOS -0x848B 0xAF31 #HANGUL SYLLABLE SSANGKIYEOK O NIEUNCIEUC -0x848C 0xAF33 #HANGUL SYLLABLE SSANGKIYEOK O TIKEUT -0x848D 0xAF35 #HANGUL SYLLABLE SSANGKIYEOK O RIEULKIYEOK -0x848E 0xAF36 #HANGUL SYLLABLE SSANGKIYEOK O RIEULMIEUM -0x848F 0xAF37 #HANGUL SYLLABLE SSANGKIYEOK O RIEULPIEUP -0x8490 0xAF38 #HANGUL SYLLABLE SSANGKIYEOK O RIEULSIOS -0x8491 0xAF39 #HANGUL SYLLABLE SSANGKIYEOK O RIEULTHIEUTH -0x8492 0xAF3A #HANGUL SYLLABLE SSANGKIYEOK O RIEULPHIEUPH -0x8493 0xAF3B #HANGUL SYLLABLE SSANGKIYEOK O RIEULHIEUH -0x8494 0xAF3E #HANGUL SYLLABLE SSANGKIYEOK O PIEUPSIOS -0x8495 0xAF40 #HANGUL SYLLABLE SSANGKIYEOK O SSANGSIOS -0x8496 0xAF44 #HANGUL SYLLABLE SSANGKIYEOK O KHIEUKH -0x8497 0xAF45 #HANGUL SYLLABLE SSANGKIYEOK O THIEUTH -0x8498 0xAF46 #HANGUL SYLLABLE SSANGKIYEOK O PHIEUPH -0x8499 0xAF47 #HANGUL SYLLABLE SSANGKIYEOK O HIEUH -0x849A 0xAF4A #HANGUL SYLLABLE SSANGKIYEOK WA SSANGKIYEOK -0x849B 0xAF4B #HANGUL SYLLABLE SSANGKIYEOK WA KIYEOKSIOS -0x849C 0xAF4C #HANGUL SYLLABLE SSANGKIYEOK WA NIEUN -0x849D 0xAF4D #HANGUL SYLLABLE SSANGKIYEOK WA NIEUNCIEUC -0x849E 0xAF4E #HANGUL SYLLABLE SSANGKIYEOK WA NIEUNHIEUH -0x849F 0xAF4F #HANGUL SYLLABLE SSANGKIYEOK WA TIKEUT -0x84A0 0xAF51 #HANGUL SYLLABLE SSANGKIYEOK WA RIEULKIYEOK -0x84A1 0xAF52 #HANGUL SYLLABLE SSANGKIYEOK WA RIEULMIEUM -0x84A2 0xAF53 #HANGUL SYLLABLE SSANGKIYEOK WA RIEULPIEUP -0x84A3 0xAF54 #HANGUL SYLLABLE SSANGKIYEOK WA RIEULSIOS -0x84A4 0xAF55 #HANGUL SYLLABLE SSANGKIYEOK WA RIEULTHIEUTH -0x84A5 0xAF56 #HANGUL SYLLABLE SSANGKIYEOK WA RIEULPHIEUPH -0x84A6 0xAF57 #HANGUL SYLLABLE SSANGKIYEOK WA RIEULHIEUH -0x84A7 0xAF58 #HANGUL SYLLABLE SSANGKIYEOK WA MIEUM -0x84A8 0xAF59 #HANGUL SYLLABLE SSANGKIYEOK WA PIEUP -0x84A9 0xAF5A #HANGUL SYLLABLE SSANGKIYEOK WA PIEUPSIOS -0x84AA 0xAF5B #HANGUL SYLLABLE SSANGKIYEOK WA SIOS -0x84AB 0xAF5E #HANGUL SYLLABLE SSANGKIYEOK WA CIEUC -0x84AC 0xAF5F #HANGUL SYLLABLE SSANGKIYEOK WA CHIEUCH -0x84AD 0xAF60 #HANGUL SYLLABLE SSANGKIYEOK WA KHIEUKH -0x84AE 0xAF61 #HANGUL SYLLABLE SSANGKIYEOK WA THIEUTH -0x84AF 0xAF62 #HANGUL SYLLABLE SSANGKIYEOK WA PHIEUPH -0x84B0 0xAF63 #HANGUL SYLLABLE SSANGKIYEOK WA HIEUH -0x84B1 0xAF66 #HANGUL SYLLABLE SSANGKIYEOK WAE SSANGKIYEOK -0x84B2 0xAF67 #HANGUL SYLLABLE SSANGKIYEOK WAE KIYEOKSIOS -0x84B3 0xAF68 #HANGUL SYLLABLE SSANGKIYEOK WAE NIEUN -0x84B4 0xAF69 #HANGUL SYLLABLE SSANGKIYEOK WAE NIEUNCIEUC -0x84B5 0xAF6A #HANGUL SYLLABLE SSANGKIYEOK WAE NIEUNHIEUH -0x84B6 0xAF6B #HANGUL SYLLABLE SSANGKIYEOK WAE TIKEUT -0x84B7 0xAF6C #HANGUL SYLLABLE SSANGKIYEOK WAE RIEUL -0x84B8 0xAF6D #HANGUL SYLLABLE SSANGKIYEOK WAE RIEULKIYEOK -0x84B9 0xAF6E #HANGUL SYLLABLE SSANGKIYEOK WAE RIEULMIEUM -0x84BA 0xAF6F #HANGUL SYLLABLE SSANGKIYEOK WAE RIEULPIEUP -0x84BB 0xAF70 #HANGUL SYLLABLE SSANGKIYEOK WAE RIEULSIOS -0x84BC 0xAF71 #HANGUL SYLLABLE SSANGKIYEOK WAE RIEULTHIEUTH -0x84BD 0xAF72 #HANGUL SYLLABLE SSANGKIYEOK WAE RIEULPHIEUPH -0x84BE 0xAF73 #HANGUL SYLLABLE SSANGKIYEOK WAE RIEULHIEUH -0x84BF 0xAF74 #HANGUL SYLLABLE SSANGKIYEOK WAE MIEUM -0x84C0 0xAF75 #HANGUL SYLLABLE SSANGKIYEOK WAE PIEUP -0x84C1 0xAF76 #HANGUL SYLLABLE SSANGKIYEOK WAE PIEUPSIOS -0x84C2 0xAF77 #HANGUL SYLLABLE SSANGKIYEOK WAE SIOS -0x84C3 0xAF78 #HANGUL SYLLABLE SSANGKIYEOK WAE SSANGSIOS -0x84C4 0xAF7A #HANGUL SYLLABLE SSANGKIYEOK WAE CIEUC -0x84C5 0xAF7B #HANGUL SYLLABLE SSANGKIYEOK WAE CHIEUCH -0x84C6 0xAF7C #HANGUL SYLLABLE SSANGKIYEOK WAE KHIEUKH -0x84C7 0xAF7D #HANGUL SYLLABLE SSANGKIYEOK WAE THIEUTH -0x84C8 0xAF7E #HANGUL SYLLABLE SSANGKIYEOK WAE PHIEUPH -0x84C9 0xAF7F #HANGUL SYLLABLE SSANGKIYEOK WAE HIEUH -0x84CA 0xAF81 #HANGUL SYLLABLE SSANGKIYEOK OE KIYEOK -0x84CB 0xAF82 #HANGUL SYLLABLE SSANGKIYEOK OE SSANGKIYEOK -0x84CC 0xAF83 #HANGUL SYLLABLE SSANGKIYEOK OE KIYEOKSIOS -0x84CD 0xAF85 #HANGUL SYLLABLE SSANGKIYEOK OE NIEUNCIEUC -0x84CE 0xAF86 #HANGUL SYLLABLE SSANGKIYEOK OE NIEUNHIEUH -0x84CF 0xAF87 #HANGUL SYLLABLE SSANGKIYEOK OE TIKEUT -0x84D0 0xAF89 #HANGUL SYLLABLE SSANGKIYEOK OE RIEULKIYEOK -0x84D1 0xAF8A #HANGUL SYLLABLE SSANGKIYEOK OE RIEULMIEUM -0x84D2 0xAF8B #HANGUL SYLLABLE SSANGKIYEOK OE RIEULPIEUP -0x84D3 0xAF8C #HANGUL SYLLABLE SSANGKIYEOK OE RIEULSIOS -0x84D4 0xAF8D #HANGUL SYLLABLE SSANGKIYEOK OE RIEULTHIEUTH -0x84D5 0xAF8E #HANGUL SYLLABLE SSANGKIYEOK OE RIEULPHIEUPH -0x84D6 0xAF8F #HANGUL SYLLABLE SSANGKIYEOK OE RIEULHIEUH -0x84D7 0xAF92 #HANGUL SYLLABLE SSANGKIYEOK OE PIEUPSIOS -0x84D8 0xAF93 #HANGUL SYLLABLE SSANGKIYEOK OE SIOS -0x84D9 0xAF94 #HANGUL SYLLABLE SSANGKIYEOK OE SSANGSIOS -0x84DA 0xAF96 #HANGUL SYLLABLE SSANGKIYEOK OE CIEUC -0x84DB 0xAF97 #HANGUL SYLLABLE SSANGKIYEOK OE CHIEUCH -0x84DC 0xAF98 #HANGUL SYLLABLE SSANGKIYEOK OE KHIEUKH -0x84DD 0xAF99 #HANGUL SYLLABLE SSANGKIYEOK OE THIEUTH -0x84DE 0xAF9A #HANGUL SYLLABLE SSANGKIYEOK OE PHIEUPH -0x84DF 0xAF9B #HANGUL SYLLABLE SSANGKIYEOK OE HIEUH -0x84E0 0xAF9D #HANGUL SYLLABLE SSANGKIYEOK YO KIYEOK -0x84E1 0xAF9E #HANGUL SYLLABLE SSANGKIYEOK YO SSANGKIYEOK -0x84E2 0xAF9F #HANGUL SYLLABLE SSANGKIYEOK YO KIYEOKSIOS -0x84E3 0xAFA0 #HANGUL SYLLABLE SSANGKIYEOK YO NIEUN -0x84E4 0xAFA1 #HANGUL SYLLABLE SSANGKIYEOK YO NIEUNCIEUC -0x84E5 0xAFA2 #HANGUL SYLLABLE SSANGKIYEOK YO NIEUNHIEUH -0x84E6 0xAFA3 #HANGUL SYLLABLE SSANGKIYEOK YO TIKEUT -0x84E7 0xAFA4 #HANGUL SYLLABLE SSANGKIYEOK YO RIEUL -0x84E8 0xAFA5 #HANGUL SYLLABLE SSANGKIYEOK YO RIEULKIYEOK -0x84E9 0xAFA6 #HANGUL SYLLABLE SSANGKIYEOK YO RIEULMIEUM -0x84EA 0xAFA7 #HANGUL SYLLABLE SSANGKIYEOK YO RIEULPIEUP -0x84EB 0xAFA8 #HANGUL SYLLABLE SSANGKIYEOK YO RIEULSIOS -0x84EC 0xAFA9 #HANGUL SYLLABLE SSANGKIYEOK YO RIEULTHIEUTH -0x84ED 0xAFAA #HANGUL SYLLABLE SSANGKIYEOK YO RIEULPHIEUPH -0x84EE 0xAFAB #HANGUL SYLLABLE SSANGKIYEOK YO RIEULHIEUH -0x84EF 0xAFAC #HANGUL SYLLABLE SSANGKIYEOK YO MIEUM -0x84F0 0xAFAD #HANGUL SYLLABLE SSANGKIYEOK YO PIEUP -0x84F1 0xAFAE #HANGUL SYLLABLE SSANGKIYEOK YO PIEUPSIOS -0x84F2 0xAFAF #HANGUL SYLLABLE SSANGKIYEOK YO SIOS -0x84F3 0xAFB0 #HANGUL SYLLABLE SSANGKIYEOK YO SSANGSIOS -0x84F4 0xAFB1 #HANGUL SYLLABLE SSANGKIYEOK YO IEUNG -0x84F5 0xAFB2 #HANGUL SYLLABLE SSANGKIYEOK YO CIEUC -0x84F6 0xAFB3 #HANGUL SYLLABLE SSANGKIYEOK YO CHIEUCH -0x84F7 0xAFB4 #HANGUL SYLLABLE SSANGKIYEOK YO KHIEUKH -0x84F8 0xAFB5 #HANGUL SYLLABLE SSANGKIYEOK YO THIEUTH -0x84F9 0xAFB6 #HANGUL SYLLABLE SSANGKIYEOK YO PHIEUPH -0x84FA 0xAFB7 #HANGUL SYLLABLE SSANGKIYEOK YO HIEUH -0x84FB 0xAFBA #HANGUL SYLLABLE SSANGKIYEOK U SSANGKIYEOK -0x84FC 0xAFBB #HANGUL SYLLABLE SSANGKIYEOK U KIYEOKSIOS -0x84FD 0xAFBD #HANGUL SYLLABLE SSANGKIYEOK U NIEUNCIEUC -0x84FE 0xAFBE #HANGUL SYLLABLE SSANGKIYEOK U NIEUNHIEUH -0x8541 0xAFBF #HANGUL SYLLABLE SSANGKIYEOK U TIKEUT -0x8542 0xAFC1 #HANGUL SYLLABLE SSANGKIYEOK U RIEULKIYEOK -0x8543 0xAFC2 #HANGUL SYLLABLE SSANGKIYEOK U RIEULMIEUM -0x8544 0xAFC3 #HANGUL SYLLABLE SSANGKIYEOK U RIEULPIEUP -0x8545 0xAFC4 #HANGUL SYLLABLE SSANGKIYEOK U RIEULSIOS -0x8546 0xAFC5 #HANGUL SYLLABLE SSANGKIYEOK U RIEULTHIEUTH -0x8547 0xAFC6 #HANGUL SYLLABLE SSANGKIYEOK U RIEULPHIEUPH -0x8548 0xAFCA #HANGUL SYLLABLE SSANGKIYEOK U PIEUPSIOS -0x8549 0xAFCC #HANGUL SYLLABLE SSANGKIYEOK U SSANGSIOS -0x854A 0xAFCF #HANGUL SYLLABLE SSANGKIYEOK U CHIEUCH -0x854B 0xAFD0 #HANGUL SYLLABLE SSANGKIYEOK U KHIEUKH -0x854C 0xAFD1 #HANGUL SYLLABLE SSANGKIYEOK U THIEUTH -0x854D 0xAFD2 #HANGUL SYLLABLE SSANGKIYEOK U PHIEUPH -0x854E 0xAFD3 #HANGUL SYLLABLE SSANGKIYEOK U HIEUH -0x854F 0xAFD5 #HANGUL SYLLABLE SSANGKIYEOK WEO KIYEOK -0x8550 0xAFD6 #HANGUL SYLLABLE SSANGKIYEOK WEO SSANGKIYEOK -0x8551 0xAFD7 #HANGUL SYLLABLE SSANGKIYEOK WEO KIYEOKSIOS -0x8552 0xAFD8 #HANGUL SYLLABLE SSANGKIYEOK WEO NIEUN -0x8553 0xAFD9 #HANGUL SYLLABLE SSANGKIYEOK WEO NIEUNCIEUC -0x8554 0xAFDA #HANGUL SYLLABLE SSANGKIYEOK WEO NIEUNHIEUH -0x8555 0xAFDB #HANGUL SYLLABLE SSANGKIYEOK WEO TIKEUT -0x8556 0xAFDD #HANGUL SYLLABLE SSANGKIYEOK WEO RIEULKIYEOK -0x8557 0xAFDE #HANGUL SYLLABLE SSANGKIYEOK WEO RIEULMIEUM -0x8558 0xAFDF #HANGUL SYLLABLE SSANGKIYEOK WEO RIEULPIEUP -0x8559 0xAFE0 #HANGUL SYLLABLE SSANGKIYEOK WEO RIEULSIOS -0x855A 0xAFE1 #HANGUL SYLLABLE SSANGKIYEOK WEO RIEULTHIEUTH -0x8561 0xAFE2 #HANGUL SYLLABLE SSANGKIYEOK WEO RIEULPHIEUPH -0x8562 0xAFE3 #HANGUL SYLLABLE SSANGKIYEOK WEO RIEULHIEUH -0x8563 0xAFE4 #HANGUL SYLLABLE SSANGKIYEOK WEO MIEUM -0x8564 0xAFE5 #HANGUL SYLLABLE SSANGKIYEOK WEO PIEUP -0x8565 0xAFE6 #HANGUL SYLLABLE SSANGKIYEOK WEO PIEUPSIOS -0x8566 0xAFE7 #HANGUL SYLLABLE SSANGKIYEOK WEO SIOS -0x8567 0xAFEA #HANGUL SYLLABLE SSANGKIYEOK WEO CIEUC -0x8568 0xAFEB #HANGUL SYLLABLE SSANGKIYEOK WEO CHIEUCH -0x8569 0xAFEC #HANGUL SYLLABLE SSANGKIYEOK WEO KHIEUKH -0x856A 0xAFED #HANGUL SYLLABLE SSANGKIYEOK WEO THIEUTH -0x856B 0xAFEE #HANGUL SYLLABLE SSANGKIYEOK WEO PHIEUPH -0x856C 0xAFEF #HANGUL SYLLABLE SSANGKIYEOK WEO HIEUH -0x856D 0xAFF2 #HANGUL SYLLABLE SSANGKIYEOK WE SSANGKIYEOK -0x856E 0xAFF3 #HANGUL SYLLABLE SSANGKIYEOK WE KIYEOKSIOS -0x856F 0xAFF5 #HANGUL SYLLABLE SSANGKIYEOK WE NIEUNCIEUC -0x8570 0xAFF6 #HANGUL SYLLABLE SSANGKIYEOK WE NIEUNHIEUH -0x8571 0xAFF7 #HANGUL SYLLABLE SSANGKIYEOK WE TIKEUT -0x8572 0xAFF9 #HANGUL SYLLABLE SSANGKIYEOK WE RIEULKIYEOK -0x8573 0xAFFA #HANGUL SYLLABLE SSANGKIYEOK WE RIEULMIEUM -0x8574 0xAFFB #HANGUL SYLLABLE SSANGKIYEOK WE RIEULPIEUP -0x8575 0xAFFC #HANGUL SYLLABLE SSANGKIYEOK WE RIEULSIOS -0x8576 0xAFFD #HANGUL SYLLABLE SSANGKIYEOK WE RIEULTHIEUTH -0x8577 0xAFFE #HANGUL SYLLABLE SSANGKIYEOK WE RIEULPHIEUPH -0x8578 0xAFFF #HANGUL SYLLABLE SSANGKIYEOK WE RIEULHIEUH -0x8579 0xB002 #HANGUL SYLLABLE SSANGKIYEOK WE PIEUPSIOS -0x857A 0xB003 #HANGUL SYLLABLE SSANGKIYEOK WE SIOS -0x8581 0xB005 #HANGUL SYLLABLE SSANGKIYEOK WE IEUNG -0x8582 0xB006 #HANGUL SYLLABLE SSANGKIYEOK WE CIEUC -0x8583 0xB007 #HANGUL SYLLABLE SSANGKIYEOK WE CHIEUCH -0x8584 0xB008 #HANGUL SYLLABLE SSANGKIYEOK WE KHIEUKH -0x8585 0xB009 #HANGUL SYLLABLE SSANGKIYEOK WE THIEUTH -0x8586 0xB00A #HANGUL SYLLABLE SSANGKIYEOK WE PHIEUPH -0x8587 0xB00B #HANGUL SYLLABLE SSANGKIYEOK WE HIEUH -0x8588 0xB00D #HANGUL SYLLABLE SSANGKIYEOK WI KIYEOK -0x8589 0xB00E #HANGUL SYLLABLE SSANGKIYEOK WI SSANGKIYEOK -0x858A 0xB00F #HANGUL SYLLABLE SSANGKIYEOK WI KIYEOKSIOS -0x858B 0xB011 #HANGUL SYLLABLE SSANGKIYEOK WI NIEUNCIEUC -0x858C 0xB012 #HANGUL SYLLABLE SSANGKIYEOK WI NIEUNHIEUH -0x858D 0xB013 #HANGUL SYLLABLE SSANGKIYEOK WI TIKEUT -0x858E 0xB015 #HANGUL SYLLABLE SSANGKIYEOK WI RIEULKIYEOK -0x858F 0xB016 #HANGUL SYLLABLE SSANGKIYEOK WI RIEULMIEUM -0x8590 0xB017 #HANGUL SYLLABLE SSANGKIYEOK WI RIEULPIEUP -0x8591 0xB018 #HANGUL SYLLABLE SSANGKIYEOK WI RIEULSIOS -0x8592 0xB019 #HANGUL SYLLABLE SSANGKIYEOK WI RIEULTHIEUTH -0x8593 0xB01A #HANGUL SYLLABLE SSANGKIYEOK WI RIEULPHIEUPH -0x8594 0xB01B #HANGUL SYLLABLE SSANGKIYEOK WI RIEULHIEUH -0x8595 0xB01E #HANGUL SYLLABLE SSANGKIYEOK WI PIEUPSIOS -0x8596 0xB01F #HANGUL SYLLABLE SSANGKIYEOK WI SIOS -0x8597 0xB020 #HANGUL SYLLABLE SSANGKIYEOK WI SSANGSIOS -0x8598 0xB021 #HANGUL SYLLABLE SSANGKIYEOK WI IEUNG -0x8599 0xB022 #HANGUL SYLLABLE SSANGKIYEOK WI CIEUC -0x859A 0xB023 #HANGUL SYLLABLE SSANGKIYEOK WI CHIEUCH -0x859B 0xB024 #HANGUL SYLLABLE SSANGKIYEOK WI KHIEUKH -0x859C 0xB025 #HANGUL SYLLABLE SSANGKIYEOK WI THIEUTH -0x859D 0xB026 #HANGUL SYLLABLE SSANGKIYEOK WI PHIEUPH -0x859E 0xB027 #HANGUL SYLLABLE SSANGKIYEOK WI HIEUH -0x859F 0xB029 #HANGUL SYLLABLE SSANGKIYEOK YU KIYEOK -0x85A0 0xB02A #HANGUL SYLLABLE SSANGKIYEOK YU SSANGKIYEOK -0x85A1 0xB02B #HANGUL SYLLABLE SSANGKIYEOK YU KIYEOKSIOS -0x85A2 0xB02C #HANGUL SYLLABLE SSANGKIYEOK YU NIEUN -0x85A3 0xB02D #HANGUL SYLLABLE SSANGKIYEOK YU NIEUNCIEUC -0x85A4 0xB02E #HANGUL SYLLABLE SSANGKIYEOK YU NIEUNHIEUH -0x85A5 0xB02F #HANGUL SYLLABLE SSANGKIYEOK YU TIKEUT -0x85A6 0xB030 #HANGUL SYLLABLE SSANGKIYEOK YU RIEUL -0x85A7 0xB031 #HANGUL SYLLABLE SSANGKIYEOK YU RIEULKIYEOK -0x85A8 0xB032 #HANGUL SYLLABLE SSANGKIYEOK YU RIEULMIEUM -0x85A9 0xB033 #HANGUL SYLLABLE SSANGKIYEOK YU RIEULPIEUP -0x85AA 0xB034 #HANGUL SYLLABLE SSANGKIYEOK YU RIEULSIOS -0x85AB 0xB035 #HANGUL SYLLABLE SSANGKIYEOK YU RIEULTHIEUTH -0x85AC 0xB036 #HANGUL SYLLABLE SSANGKIYEOK YU RIEULPHIEUPH -0x85AD 0xB037 #HANGUL SYLLABLE SSANGKIYEOK YU RIEULHIEUH -0x85AE 0xB038 #HANGUL SYLLABLE SSANGKIYEOK YU MIEUM -0x85AF 0xB039 #HANGUL SYLLABLE SSANGKIYEOK YU PIEUP -0x85B0 0xB03A #HANGUL SYLLABLE SSANGKIYEOK YU PIEUPSIOS -0x85B1 0xB03B #HANGUL SYLLABLE SSANGKIYEOK YU SIOS -0x85B2 0xB03C #HANGUL SYLLABLE SSANGKIYEOK YU SSANGSIOS -0x85B3 0xB03D #HANGUL SYLLABLE SSANGKIYEOK YU IEUNG -0x85B4 0xB03E #HANGUL SYLLABLE SSANGKIYEOK YU CIEUC -0x85B5 0xB03F #HANGUL SYLLABLE SSANGKIYEOK YU CHIEUCH -0x85B6 0xB040 #HANGUL SYLLABLE SSANGKIYEOK YU KHIEUKH -0x85B7 0xB041 #HANGUL SYLLABLE SSANGKIYEOK YU THIEUTH -0x85B8 0xB042 #HANGUL SYLLABLE SSANGKIYEOK YU PHIEUPH -0x85B9 0xB043 #HANGUL SYLLABLE SSANGKIYEOK YU HIEUH -0x85BA 0xB046 #HANGUL SYLLABLE SSANGKIYEOK EU SSANGKIYEOK -0x85BB 0xB047 #HANGUL SYLLABLE SSANGKIYEOK EU KIYEOKSIOS -0x85BC 0xB049 #HANGUL SYLLABLE SSANGKIYEOK EU NIEUNCIEUC -0x85BD 0xB04B #HANGUL SYLLABLE SSANGKIYEOK EU TIKEUT -0x85BE 0xB04D #HANGUL SYLLABLE SSANGKIYEOK EU RIEULKIYEOK -0x85BF 0xB04F #HANGUL SYLLABLE SSANGKIYEOK EU RIEULPIEUP -0x85C0 0xB050 #HANGUL SYLLABLE SSANGKIYEOK EU RIEULSIOS -0x85C1 0xB051 #HANGUL SYLLABLE SSANGKIYEOK EU RIEULTHIEUTH -0x85C2 0xB052 #HANGUL SYLLABLE SSANGKIYEOK EU RIEULPHIEUPH -0x85C3 0xB056 #HANGUL SYLLABLE SSANGKIYEOK EU PIEUPSIOS -0x85C4 0xB058 #HANGUL SYLLABLE SSANGKIYEOK EU SSANGSIOS -0x85C5 0xB05A #HANGUL SYLLABLE SSANGKIYEOK EU CIEUC -0x85C6 0xB05B #HANGUL SYLLABLE SSANGKIYEOK EU CHIEUCH -0x85C7 0xB05C #HANGUL SYLLABLE SSANGKIYEOK EU KHIEUKH -0x85C8 0xB05E #HANGUL SYLLABLE SSANGKIYEOK EU PHIEUPH -0x85C9 0xB05F #HANGUL SYLLABLE SSANGKIYEOK EU HIEUH -0x85CA 0xB060 #HANGUL SYLLABLE SSANGKIYEOK YI -0x85CB 0xB061 #HANGUL SYLLABLE SSANGKIYEOK YI KIYEOK -0x85CC 0xB062 #HANGUL SYLLABLE SSANGKIYEOK YI SSANGKIYEOK -0x85CD 0xB063 #HANGUL SYLLABLE SSANGKIYEOK YI KIYEOKSIOS -0x85CE 0xB064 #HANGUL SYLLABLE SSANGKIYEOK YI NIEUN -0x85CF 0xB065 #HANGUL SYLLABLE SSANGKIYEOK YI NIEUNCIEUC -0x85D0 0xB066 #HANGUL SYLLABLE SSANGKIYEOK YI NIEUNHIEUH -0x85D1 0xB067 #HANGUL SYLLABLE SSANGKIYEOK YI TIKEUT -0x85D2 0xB068 #HANGUL SYLLABLE SSANGKIYEOK YI RIEUL -0x85D3 0xB069 #HANGUL SYLLABLE SSANGKIYEOK YI RIEULKIYEOK -0x85D4 0xB06A #HANGUL SYLLABLE SSANGKIYEOK YI RIEULMIEUM -0x85D5 0xB06B #HANGUL SYLLABLE SSANGKIYEOK YI RIEULPIEUP -0x85D6 0xB06C #HANGUL SYLLABLE SSANGKIYEOK YI RIEULSIOS -0x85D7 0xB06D #HANGUL SYLLABLE SSANGKIYEOK YI RIEULTHIEUTH -0x85D8 0xB06E #HANGUL SYLLABLE SSANGKIYEOK YI RIEULPHIEUPH -0x85D9 0xB06F #HANGUL SYLLABLE SSANGKIYEOK YI RIEULHIEUH -0x85DA 0xB070 #HANGUL SYLLABLE SSANGKIYEOK YI MIEUM -0x85DB 0xB071 #HANGUL SYLLABLE SSANGKIYEOK YI PIEUP -0x85DC 0xB072 #HANGUL SYLLABLE SSANGKIYEOK YI PIEUPSIOS -0x85DD 0xB073 #HANGUL SYLLABLE SSANGKIYEOK YI SIOS -0x85DE 0xB074 #HANGUL SYLLABLE SSANGKIYEOK YI SSANGSIOS -0x85DF 0xB075 #HANGUL SYLLABLE SSANGKIYEOK YI IEUNG -0x85E0 0xB076 #HANGUL SYLLABLE SSANGKIYEOK YI CIEUC -0x85E1 0xB077 #HANGUL SYLLABLE SSANGKIYEOK YI CHIEUCH -0x85E2 0xB078 #HANGUL SYLLABLE SSANGKIYEOK YI KHIEUKH -0x85E3 0xB079 #HANGUL SYLLABLE SSANGKIYEOK YI THIEUTH -0x85E4 0xB07A #HANGUL SYLLABLE SSANGKIYEOK YI PHIEUPH -0x85E5 0xB07B #HANGUL SYLLABLE SSANGKIYEOK YI HIEUH -0x85E6 0xB07E #HANGUL SYLLABLE SSANGKIYEOK I SSANGKIYEOK -0x85E7 0xB07F #HANGUL SYLLABLE SSANGKIYEOK I KIYEOKSIOS -0x85E8 0xB081 #HANGUL SYLLABLE SSANGKIYEOK I NIEUNCIEUC -0x85E9 0xB082 #HANGUL SYLLABLE SSANGKIYEOK I NIEUNHIEUH -0x85EA 0xB083 #HANGUL SYLLABLE SSANGKIYEOK I TIKEUT -0x85EB 0xB085 #HANGUL SYLLABLE SSANGKIYEOK I RIEULKIYEOK -0x85EC 0xB086 #HANGUL SYLLABLE SSANGKIYEOK I RIEULMIEUM -0x85ED 0xB087 #HANGUL SYLLABLE SSANGKIYEOK I RIEULPIEUP -0x85EE 0xB088 #HANGUL SYLLABLE SSANGKIYEOK I RIEULSIOS -0x85EF 0xB089 #HANGUL SYLLABLE SSANGKIYEOK I RIEULTHIEUTH -0x85F0 0xB08A #HANGUL SYLLABLE SSANGKIYEOK I RIEULPHIEUPH -0x85F1 0xB08B #HANGUL SYLLABLE SSANGKIYEOK I RIEULHIEUH -0x85F2 0xB08E #HANGUL SYLLABLE SSANGKIYEOK I PIEUPSIOS -0x85F3 0xB090 #HANGUL SYLLABLE SSANGKIYEOK I SSANGSIOS -0x85F4 0xB092 #HANGUL SYLLABLE SSANGKIYEOK I CIEUC -0x85F5 0xB093 #HANGUL SYLLABLE SSANGKIYEOK I CHIEUCH -0x85F6 0xB094 #HANGUL SYLLABLE SSANGKIYEOK I KHIEUKH -0x85F7 0xB095 #HANGUL SYLLABLE SSANGKIYEOK I THIEUTH -0x85F8 0xB096 #HANGUL SYLLABLE SSANGKIYEOK I PHIEUPH -0x85F9 0xB097 #HANGUL SYLLABLE SSANGKIYEOK I HIEUH -0x85FA 0xB09B #HANGUL SYLLABLE NIEUN A KIYEOKSIOS -0x85FB 0xB09D #HANGUL SYLLABLE NIEUN A NIEUNCIEUC -0x85FC 0xB09E #HANGUL SYLLABLE NIEUN A NIEUNHIEUH -0x85FD 0xB0A3 #HANGUL SYLLABLE NIEUN A RIEULPIEUP -0x85FE 0xB0A4 #HANGUL SYLLABLE NIEUN A RIEULSIOS -0x8641 0xB0A5 #HANGUL SYLLABLE NIEUN A RIEULTHIEUTH -0x8642 0xB0A6 #HANGUL SYLLABLE NIEUN A RIEULPHIEUPH -0x8643 0xB0A7 #HANGUL SYLLABLE NIEUN A RIEULHIEUH -0x8644 0xB0AA #HANGUL SYLLABLE NIEUN A PIEUPSIOS -0x8645 0xB0B0 #HANGUL SYLLABLE NIEUN A KHIEUKH -0x8646 0xB0B2 #HANGUL SYLLABLE NIEUN A PHIEUPH -0x8647 0xB0B6 #HANGUL SYLLABLE NIEUN AE SSANGKIYEOK -0x8648 0xB0B7 #HANGUL SYLLABLE NIEUN AE KIYEOKSIOS -0x8649 0xB0B9 #HANGUL SYLLABLE NIEUN AE NIEUNCIEUC -0x864A 0xB0BA #HANGUL SYLLABLE NIEUN AE NIEUNHIEUH -0x864B 0xB0BB #HANGUL SYLLABLE NIEUN AE TIKEUT -0x864C 0xB0BD #HANGUL SYLLABLE NIEUN AE RIEULKIYEOK -0x864D 0xB0BE #HANGUL SYLLABLE NIEUN AE RIEULMIEUM -0x864E 0xB0BF #HANGUL SYLLABLE NIEUN AE RIEULPIEUP -0x864F 0xB0C0 #HANGUL SYLLABLE NIEUN AE RIEULSIOS -0x8650 0xB0C1 #HANGUL SYLLABLE NIEUN AE RIEULTHIEUTH -0x8651 0xB0C2 #HANGUL SYLLABLE NIEUN AE RIEULPHIEUPH -0x8652 0xB0C3 #HANGUL SYLLABLE NIEUN AE RIEULHIEUH -0x8653 0xB0C6 #HANGUL SYLLABLE NIEUN AE PIEUPSIOS -0x8654 0xB0CA #HANGUL SYLLABLE NIEUN AE CIEUC -0x8655 0xB0CB #HANGUL SYLLABLE NIEUN AE CHIEUCH -0x8656 0xB0CC #HANGUL SYLLABLE NIEUN AE KHIEUKH -0x8657 0xB0CD #HANGUL SYLLABLE NIEUN AE THIEUTH -0x8658 0xB0CE #HANGUL SYLLABLE NIEUN AE PHIEUPH -0x8659 0xB0CF #HANGUL SYLLABLE NIEUN AE HIEUH -0x865A 0xB0D2 #HANGUL SYLLABLE NIEUN YA SSANGKIYEOK -0x8661 0xB0D3 #HANGUL SYLLABLE NIEUN YA KIYEOKSIOS -0x8662 0xB0D5 #HANGUL SYLLABLE NIEUN YA NIEUNCIEUC -0x8663 0xB0D6 #HANGUL SYLLABLE NIEUN YA NIEUNHIEUH -0x8664 0xB0D7 #HANGUL SYLLABLE NIEUN YA TIKEUT -0x8665 0xB0D9 #HANGUL SYLLABLE NIEUN YA RIEULKIYEOK -0x8666 0xB0DA #HANGUL SYLLABLE NIEUN YA RIEULMIEUM -0x8667 0xB0DB #HANGUL SYLLABLE NIEUN YA RIEULPIEUP -0x8668 0xB0DC #HANGUL SYLLABLE NIEUN YA RIEULSIOS -0x8669 0xB0DD #HANGUL SYLLABLE NIEUN YA RIEULTHIEUTH -0x866A 0xB0DE #HANGUL SYLLABLE NIEUN YA RIEULPHIEUPH -0x866B 0xB0DF #HANGUL SYLLABLE NIEUN YA RIEULHIEUH -0x866C 0xB0E1 #HANGUL SYLLABLE NIEUN YA PIEUP -0x866D 0xB0E2 #HANGUL SYLLABLE NIEUN YA PIEUPSIOS -0x866E 0xB0E3 #HANGUL SYLLABLE NIEUN YA SIOS -0x866F 0xB0E4 #HANGUL SYLLABLE NIEUN YA SSANGSIOS -0x8670 0xB0E6 #HANGUL SYLLABLE NIEUN YA CIEUC -0x8671 0xB0E7 #HANGUL SYLLABLE NIEUN YA CHIEUCH -0x8672 0xB0E8 #HANGUL SYLLABLE NIEUN YA KHIEUKH -0x8673 0xB0E9 #HANGUL SYLLABLE NIEUN YA THIEUTH -0x8674 0xB0EA #HANGUL SYLLABLE NIEUN YA PHIEUPH -0x8675 0xB0EB #HANGUL SYLLABLE NIEUN YA HIEUH -0x8676 0xB0EC #HANGUL SYLLABLE NIEUN YAE -0x8677 0xB0ED #HANGUL SYLLABLE NIEUN YAE KIYEOK -0x8678 0xB0EE #HANGUL SYLLABLE NIEUN YAE SSANGKIYEOK -0x8679 0xB0EF #HANGUL SYLLABLE NIEUN YAE KIYEOKSIOS -0x867A 0xB0F0 #HANGUL SYLLABLE NIEUN YAE NIEUN -0x8681 0xB0F1 #HANGUL SYLLABLE NIEUN YAE NIEUNCIEUC -0x8682 0xB0F2 #HANGUL SYLLABLE NIEUN YAE NIEUNHIEUH -0x8683 0xB0F3 #HANGUL SYLLABLE NIEUN YAE TIKEUT -0x8684 0xB0F4 #HANGUL SYLLABLE NIEUN YAE RIEUL -0x8685 0xB0F5 #HANGUL SYLLABLE NIEUN YAE RIEULKIYEOK -0x8686 0xB0F6 #HANGUL SYLLABLE NIEUN YAE RIEULMIEUM -0x8687 0xB0F7 #HANGUL SYLLABLE NIEUN YAE RIEULPIEUP -0x8688 0xB0F8 #HANGUL SYLLABLE NIEUN YAE RIEULSIOS -0x8689 0xB0F9 #HANGUL SYLLABLE NIEUN YAE RIEULTHIEUTH -0x868A 0xB0FA #HANGUL SYLLABLE NIEUN YAE RIEULPHIEUPH -0x868B 0xB0FB #HANGUL SYLLABLE NIEUN YAE RIEULHIEUH -0x868C 0xB0FC #HANGUL SYLLABLE NIEUN YAE MIEUM -0x868D 0xB0FD #HANGUL SYLLABLE NIEUN YAE PIEUP -0x868E 0xB0FE #HANGUL SYLLABLE NIEUN YAE PIEUPSIOS -0x868F 0xB0FF #HANGUL SYLLABLE NIEUN YAE SIOS -0x8690 0xB100 #HANGUL SYLLABLE NIEUN YAE SSANGSIOS -0x8691 0xB101 #HANGUL SYLLABLE NIEUN YAE IEUNG -0x8692 0xB102 #HANGUL SYLLABLE NIEUN YAE CIEUC -0x8693 0xB103 #HANGUL SYLLABLE NIEUN YAE CHIEUCH -0x8694 0xB104 #HANGUL SYLLABLE NIEUN YAE KHIEUKH -0x8695 0xB105 #HANGUL SYLLABLE NIEUN YAE THIEUTH -0x8696 0xB106 #HANGUL SYLLABLE NIEUN YAE PHIEUPH -0x8697 0xB107 #HANGUL SYLLABLE NIEUN YAE HIEUH -0x8698 0xB10A #HANGUL SYLLABLE NIEUN EO SSANGKIYEOK -0x8699 0xB10D #HANGUL SYLLABLE NIEUN EO NIEUNCIEUC -0x869A 0xB10E #HANGUL SYLLABLE NIEUN EO NIEUNHIEUH -0x869B 0xB10F #HANGUL SYLLABLE NIEUN EO TIKEUT -0x869C 0xB111 #HANGUL SYLLABLE NIEUN EO RIEULKIYEOK -0x869D 0xB114 #HANGUL SYLLABLE NIEUN EO RIEULSIOS -0x869E 0xB115 #HANGUL SYLLABLE NIEUN EO RIEULTHIEUTH -0x869F 0xB116 #HANGUL SYLLABLE NIEUN EO RIEULPHIEUPH -0x86A0 0xB117 #HANGUL SYLLABLE NIEUN EO RIEULHIEUH -0x86A1 0xB11A #HANGUL SYLLABLE NIEUN EO PIEUPSIOS -0x86A2 0xB11E #HANGUL SYLLABLE NIEUN EO CIEUC -0x86A3 0xB11F #HANGUL SYLLABLE NIEUN EO CHIEUCH -0x86A4 0xB120 #HANGUL SYLLABLE NIEUN EO KHIEUKH -0x86A5 0xB121 #HANGUL SYLLABLE NIEUN EO THIEUTH -0x86A6 0xB122 #HANGUL SYLLABLE NIEUN EO PHIEUPH -0x86A7 0xB126 #HANGUL SYLLABLE NIEUN E SSANGKIYEOK -0x86A8 0xB127 #HANGUL SYLLABLE NIEUN E KIYEOKSIOS -0x86A9 0xB129 #HANGUL SYLLABLE NIEUN E NIEUNCIEUC -0x86AA 0xB12A #HANGUL SYLLABLE NIEUN E NIEUNHIEUH -0x86AB 0xB12B #HANGUL SYLLABLE NIEUN E TIKEUT -0x86AC 0xB12D #HANGUL SYLLABLE NIEUN E RIEULKIYEOK -0x86AD 0xB12E #HANGUL SYLLABLE NIEUN E RIEULMIEUM -0x86AE 0xB12F #HANGUL SYLLABLE NIEUN E RIEULPIEUP -0x86AF 0xB130 #HANGUL SYLLABLE NIEUN E RIEULSIOS -0x86B0 0xB131 #HANGUL SYLLABLE NIEUN E RIEULTHIEUTH -0x86B1 0xB132 #HANGUL SYLLABLE NIEUN E RIEULPHIEUPH -0x86B2 0xB133 #HANGUL SYLLABLE NIEUN E RIEULHIEUH -0x86B3 0xB136 #HANGUL SYLLABLE NIEUN E PIEUPSIOS -0x86B4 0xB13A #HANGUL SYLLABLE NIEUN E CIEUC -0x86B5 0xB13B #HANGUL SYLLABLE NIEUN E CHIEUCH -0x86B6 0xB13C #HANGUL SYLLABLE NIEUN E KHIEUKH -0x86B7 0xB13D #HANGUL SYLLABLE NIEUN E THIEUTH -0x86B8 0xB13E #HANGUL SYLLABLE NIEUN E PHIEUPH -0x86B9 0xB13F #HANGUL SYLLABLE NIEUN E HIEUH -0x86BA 0xB142 #HANGUL SYLLABLE NIEUN YEO SSANGKIYEOK -0x86BB 0xB143 #HANGUL SYLLABLE NIEUN YEO KIYEOKSIOS -0x86BC 0xB145 #HANGUL SYLLABLE NIEUN YEO NIEUNCIEUC -0x86BD 0xB146 #HANGUL SYLLABLE NIEUN YEO NIEUNHIEUH -0x86BE 0xB147 #HANGUL SYLLABLE NIEUN YEO TIKEUT -0x86BF 0xB149 #HANGUL SYLLABLE NIEUN YEO RIEULKIYEOK -0x86C0 0xB14A #HANGUL SYLLABLE NIEUN YEO RIEULMIEUM -0x86C1 0xB14B #HANGUL SYLLABLE NIEUN YEO RIEULPIEUP -0x86C2 0xB14C #HANGUL SYLLABLE NIEUN YEO RIEULSIOS -0x86C3 0xB14D #HANGUL SYLLABLE NIEUN YEO RIEULTHIEUTH -0x86C4 0xB14E #HANGUL SYLLABLE NIEUN YEO RIEULPHIEUPH -0x86C5 0xB14F #HANGUL SYLLABLE NIEUN YEO RIEULHIEUH -0x86C6 0xB152 #HANGUL SYLLABLE NIEUN YEO PIEUPSIOS -0x86C7 0xB153 #HANGUL SYLLABLE NIEUN YEO SIOS -0x86C8 0xB156 #HANGUL SYLLABLE NIEUN YEO CIEUC -0x86C9 0xB157 #HANGUL SYLLABLE NIEUN YEO CHIEUCH -0x86CA 0xB159 #HANGUL SYLLABLE NIEUN YEO THIEUTH -0x86CB 0xB15A #HANGUL SYLLABLE NIEUN YEO PHIEUPH -0x86CC 0xB15B #HANGUL SYLLABLE NIEUN YEO HIEUH -0x86CD 0xB15D #HANGUL SYLLABLE NIEUN YE KIYEOK -0x86CE 0xB15E #HANGUL SYLLABLE NIEUN YE SSANGKIYEOK -0x86CF 0xB15F #HANGUL SYLLABLE NIEUN YE KIYEOKSIOS -0x86D0 0xB161 #HANGUL SYLLABLE NIEUN YE NIEUNCIEUC -0x86D1 0xB162 #HANGUL SYLLABLE NIEUN YE NIEUNHIEUH -0x86D2 0xB163 #HANGUL SYLLABLE NIEUN YE TIKEUT -0x86D3 0xB164 #HANGUL SYLLABLE NIEUN YE RIEUL -0x86D4 0xB165 #HANGUL SYLLABLE NIEUN YE RIEULKIYEOK -0x86D5 0xB166 #HANGUL SYLLABLE NIEUN YE RIEULMIEUM -0x86D6 0xB167 #HANGUL SYLLABLE NIEUN YE RIEULPIEUP -0x86D7 0xB168 #HANGUL SYLLABLE NIEUN YE RIEULSIOS -0x86D8 0xB169 #HANGUL SYLLABLE NIEUN YE RIEULTHIEUTH -0x86D9 0xB16A #HANGUL SYLLABLE NIEUN YE RIEULPHIEUPH -0x86DA 0xB16B #HANGUL SYLLABLE NIEUN YE RIEULHIEUH -0x86DB 0xB16C #HANGUL SYLLABLE NIEUN YE MIEUM -0x86DC 0xB16D #HANGUL SYLLABLE NIEUN YE PIEUP -0x86DD 0xB16E #HANGUL SYLLABLE NIEUN YE PIEUPSIOS -0x86DE 0xB16F #HANGUL SYLLABLE NIEUN YE SIOS -0x86DF 0xB170 #HANGUL SYLLABLE NIEUN YE SSANGSIOS -0x86E0 0xB171 #HANGUL SYLLABLE NIEUN YE IEUNG -0x86E1 0xB172 #HANGUL SYLLABLE NIEUN YE CIEUC -0x86E2 0xB173 #HANGUL SYLLABLE NIEUN YE CHIEUCH -0x86E3 0xB174 #HANGUL SYLLABLE NIEUN YE KHIEUKH -0x86E4 0xB175 #HANGUL SYLLABLE NIEUN YE THIEUTH -0x86E5 0xB176 #HANGUL SYLLABLE NIEUN YE PHIEUPH -0x86E6 0xB177 #HANGUL SYLLABLE NIEUN YE HIEUH -0x86E7 0xB17A #HANGUL SYLLABLE NIEUN O SSANGKIYEOK -0x86E8 0xB17B #HANGUL SYLLABLE NIEUN O KIYEOKSIOS -0x86E9 0xB17D #HANGUL SYLLABLE NIEUN O NIEUNCIEUC -0x86EA 0xB17E #HANGUL SYLLABLE NIEUN O NIEUNHIEUH -0x86EB 0xB17F #HANGUL SYLLABLE NIEUN O TIKEUT -0x86EC 0xB181 #HANGUL SYLLABLE NIEUN O RIEULKIYEOK -0x86ED 0xB183 #HANGUL SYLLABLE NIEUN O RIEULPIEUP -0x86EE 0xB184 #HANGUL SYLLABLE NIEUN O RIEULSIOS -0x86EF 0xB185 #HANGUL SYLLABLE NIEUN O RIEULTHIEUTH -0x86F0 0xB186 #HANGUL SYLLABLE NIEUN O RIEULPHIEUPH -0x86F1 0xB187 #HANGUL SYLLABLE NIEUN O RIEULHIEUH -0x86F2 0xB18A #HANGUL SYLLABLE NIEUN O PIEUPSIOS -0x86F3 0xB18C #HANGUL SYLLABLE NIEUN O SSANGSIOS -0x86F4 0xB18E #HANGUL SYLLABLE NIEUN O CIEUC -0x86F5 0xB18F #HANGUL SYLLABLE NIEUN O CHIEUCH -0x86F6 0xB190 #HANGUL SYLLABLE NIEUN O KHIEUKH -0x86F7 0xB191 #HANGUL SYLLABLE NIEUN O THIEUTH -0x86F8 0xB195 #HANGUL SYLLABLE NIEUN WA KIYEOK -0x86F9 0xB196 #HANGUL SYLLABLE NIEUN WA SSANGKIYEOK -0x86FA 0xB197 #HANGUL SYLLABLE NIEUN WA KIYEOKSIOS -0x86FB 0xB199 #HANGUL SYLLABLE NIEUN WA NIEUNCIEUC -0x86FC 0xB19A #HANGUL SYLLABLE NIEUN WA NIEUNHIEUH -0x86FD 0xB19B #HANGUL SYLLABLE NIEUN WA TIKEUT -0x86FE 0xB19D #HANGUL SYLLABLE NIEUN WA RIEULKIYEOK -0x8741 0xB19E #HANGUL SYLLABLE NIEUN WA RIEULMIEUM -0x8742 0xB19F #HANGUL SYLLABLE NIEUN WA RIEULPIEUP -0x8743 0xB1A0 #HANGUL SYLLABLE NIEUN WA RIEULSIOS -0x8744 0xB1A1 #HANGUL SYLLABLE NIEUN WA RIEULTHIEUTH -0x8745 0xB1A2 #HANGUL SYLLABLE NIEUN WA RIEULPHIEUPH -0x8746 0xB1A3 #HANGUL SYLLABLE NIEUN WA RIEULHIEUH -0x8747 0xB1A4 #HANGUL SYLLABLE NIEUN WA MIEUM -0x8748 0xB1A5 #HANGUL SYLLABLE NIEUN WA PIEUP -0x8749 0xB1A6 #HANGUL SYLLABLE NIEUN WA PIEUPSIOS -0x874A 0xB1A7 #HANGUL SYLLABLE NIEUN WA SIOS -0x874B 0xB1A9 #HANGUL SYLLABLE NIEUN WA IEUNG -0x874C 0xB1AA #HANGUL SYLLABLE NIEUN WA CIEUC -0x874D 0xB1AB #HANGUL SYLLABLE NIEUN WA CHIEUCH -0x874E 0xB1AC #HANGUL SYLLABLE NIEUN WA KHIEUKH -0x874F 0xB1AD #HANGUL SYLLABLE NIEUN WA THIEUTH -0x8750 0xB1AE #HANGUL SYLLABLE NIEUN WA PHIEUPH -0x8751 0xB1AF #HANGUL SYLLABLE NIEUN WA HIEUH -0x8752 0xB1B0 #HANGUL SYLLABLE NIEUN WAE -0x8753 0xB1B1 #HANGUL SYLLABLE NIEUN WAE KIYEOK -0x8754 0xB1B2 #HANGUL SYLLABLE NIEUN WAE SSANGKIYEOK -0x8755 0xB1B3 #HANGUL SYLLABLE NIEUN WAE KIYEOKSIOS -0x8756 0xB1B4 #HANGUL SYLLABLE NIEUN WAE NIEUN -0x8757 0xB1B5 #HANGUL SYLLABLE NIEUN WAE NIEUNCIEUC -0x8758 0xB1B6 #HANGUL SYLLABLE NIEUN WAE NIEUNHIEUH -0x8759 0xB1B7 #HANGUL SYLLABLE NIEUN WAE TIKEUT -0x875A 0xB1B8 #HANGUL SYLLABLE NIEUN WAE RIEUL -0x8761 0xB1B9 #HANGUL SYLLABLE NIEUN WAE RIEULKIYEOK -0x8762 0xB1BA #HANGUL SYLLABLE NIEUN WAE RIEULMIEUM -0x8763 0xB1BB #HANGUL SYLLABLE NIEUN WAE RIEULPIEUP -0x8764 0xB1BC #HANGUL SYLLABLE NIEUN WAE RIEULSIOS -0x8765 0xB1BD #HANGUL SYLLABLE NIEUN WAE RIEULTHIEUTH -0x8766 0xB1BE #HANGUL SYLLABLE NIEUN WAE RIEULPHIEUPH -0x8767 0xB1BF #HANGUL SYLLABLE NIEUN WAE RIEULHIEUH -0x8768 0xB1C0 #HANGUL SYLLABLE NIEUN WAE MIEUM -0x8769 0xB1C1 #HANGUL SYLLABLE NIEUN WAE PIEUP -0x876A 0xB1C2 #HANGUL SYLLABLE NIEUN WAE PIEUPSIOS -0x876B 0xB1C3 #HANGUL SYLLABLE NIEUN WAE SIOS -0x876C 0xB1C4 #HANGUL SYLLABLE NIEUN WAE SSANGSIOS -0x876D 0xB1C5 #HANGUL SYLLABLE NIEUN WAE IEUNG -0x876E 0xB1C6 #HANGUL SYLLABLE NIEUN WAE CIEUC -0x876F 0xB1C7 #HANGUL SYLLABLE NIEUN WAE CHIEUCH -0x8770 0xB1C8 #HANGUL SYLLABLE NIEUN WAE KHIEUKH -0x8771 0xB1C9 #HANGUL SYLLABLE NIEUN WAE THIEUTH -0x8772 0xB1CA #HANGUL SYLLABLE NIEUN WAE PHIEUPH -0x8773 0xB1CB #HANGUL SYLLABLE NIEUN WAE HIEUH -0x8774 0xB1CD #HANGUL SYLLABLE NIEUN OE KIYEOK -0x8775 0xB1CE #HANGUL SYLLABLE NIEUN OE SSANGKIYEOK -0x8776 0xB1CF #HANGUL SYLLABLE NIEUN OE KIYEOKSIOS -0x8777 0xB1D1 #HANGUL SYLLABLE NIEUN OE NIEUNCIEUC -0x8778 0xB1D2 #HANGUL SYLLABLE NIEUN OE NIEUNHIEUH -0x8779 0xB1D3 #HANGUL SYLLABLE NIEUN OE TIKEUT -0x877A 0xB1D5 #HANGUL SYLLABLE NIEUN OE RIEULKIYEOK -0x8781 0xB1D6 #HANGUL SYLLABLE NIEUN OE RIEULMIEUM -0x8782 0xB1D7 #HANGUL SYLLABLE NIEUN OE RIEULPIEUP -0x8783 0xB1D8 #HANGUL SYLLABLE NIEUN OE RIEULSIOS -0x8784 0xB1D9 #HANGUL SYLLABLE NIEUN OE RIEULTHIEUTH -0x8785 0xB1DA #HANGUL SYLLABLE NIEUN OE RIEULPHIEUPH -0x8786 0xB1DB #HANGUL SYLLABLE NIEUN OE RIEULHIEUH -0x8787 0xB1DE #HANGUL SYLLABLE NIEUN OE PIEUPSIOS -0x8788 0xB1E0 #HANGUL SYLLABLE NIEUN OE SSANGSIOS -0x8789 0xB1E1 #HANGUL SYLLABLE NIEUN OE IEUNG -0x878A 0xB1E2 #HANGUL SYLLABLE NIEUN OE CIEUC -0x878B 0xB1E3 #HANGUL SYLLABLE NIEUN OE CHIEUCH -0x878C 0xB1E4 #HANGUL SYLLABLE NIEUN OE KHIEUKH -0x878D 0xB1E5 #HANGUL SYLLABLE NIEUN OE THIEUTH -0x878E 0xB1E6 #HANGUL SYLLABLE NIEUN OE PHIEUPH -0x878F 0xB1E7 #HANGUL SYLLABLE NIEUN OE HIEUH -0x8790 0xB1EA #HANGUL SYLLABLE NIEUN YO SSANGKIYEOK -0x8791 0xB1EB #HANGUL SYLLABLE NIEUN YO KIYEOKSIOS -0x8792 0xB1ED #HANGUL SYLLABLE NIEUN YO NIEUNCIEUC -0x8793 0xB1EE #HANGUL SYLLABLE NIEUN YO NIEUNHIEUH -0x8794 0xB1EF #HANGUL SYLLABLE NIEUN YO TIKEUT -0x8795 0xB1F1 #HANGUL SYLLABLE NIEUN YO RIEULKIYEOK -0x8796 0xB1F2 #HANGUL SYLLABLE NIEUN YO RIEULMIEUM -0x8797 0xB1F3 #HANGUL SYLLABLE NIEUN YO RIEULPIEUP -0x8798 0xB1F4 #HANGUL SYLLABLE NIEUN YO RIEULSIOS -0x8799 0xB1F5 #HANGUL SYLLABLE NIEUN YO RIEULTHIEUTH -0x879A 0xB1F6 #HANGUL SYLLABLE NIEUN YO RIEULPHIEUPH -0x879B 0xB1F7 #HANGUL SYLLABLE NIEUN YO RIEULHIEUH -0x879C 0xB1F8 #HANGUL SYLLABLE NIEUN YO MIEUM -0x879D 0xB1FA #HANGUL SYLLABLE NIEUN YO PIEUPSIOS -0x879E 0xB1FC #HANGUL SYLLABLE NIEUN YO SSANGSIOS -0x879F 0xB1FE #HANGUL SYLLABLE NIEUN YO CIEUC -0x87A0 0xB1FF #HANGUL SYLLABLE NIEUN YO CHIEUCH -0x87A1 0xB200 #HANGUL SYLLABLE NIEUN YO KHIEUKH -0x87A2 0xB201 #HANGUL SYLLABLE NIEUN YO THIEUTH -0x87A3 0xB202 #HANGUL SYLLABLE NIEUN YO PHIEUPH -0x87A4 0xB203 #HANGUL SYLLABLE NIEUN YO HIEUH -0x87A5 0xB206 #HANGUL SYLLABLE NIEUN U SSANGKIYEOK -0x87A6 0xB207 #HANGUL SYLLABLE NIEUN U KIYEOKSIOS -0x87A7 0xB209 #HANGUL SYLLABLE NIEUN U NIEUNCIEUC -0x87A8 0xB20A #HANGUL SYLLABLE NIEUN U NIEUNHIEUH -0x87A9 0xB20D #HANGUL SYLLABLE NIEUN U RIEULKIYEOK -0x87AA 0xB20E #HANGUL SYLLABLE NIEUN U RIEULMIEUM -0x87AB 0xB20F #HANGUL SYLLABLE NIEUN U RIEULPIEUP -0x87AC 0xB210 #HANGUL SYLLABLE NIEUN U RIEULSIOS -0x87AD 0xB211 #HANGUL SYLLABLE NIEUN U RIEULTHIEUTH -0x87AE 0xB212 #HANGUL SYLLABLE NIEUN U RIEULPHIEUPH -0x87AF 0xB213 #HANGUL SYLLABLE NIEUN U RIEULHIEUH -0x87B0 0xB216 #HANGUL SYLLABLE NIEUN U PIEUPSIOS -0x87B1 0xB218 #HANGUL SYLLABLE NIEUN U SSANGSIOS -0x87B2 0xB21A #HANGUL SYLLABLE NIEUN U CIEUC -0x87B3 0xB21B #HANGUL SYLLABLE NIEUN U CHIEUCH -0x87B4 0xB21C #HANGUL SYLLABLE NIEUN U KHIEUKH -0x87B5 0xB21D #HANGUL SYLLABLE NIEUN U THIEUTH -0x87B6 0xB21E #HANGUL SYLLABLE NIEUN U PHIEUPH -0x87B7 0xB21F #HANGUL SYLLABLE NIEUN U HIEUH -0x87B8 0xB221 #HANGUL SYLLABLE NIEUN WEO KIYEOK -0x87B9 0xB222 #HANGUL SYLLABLE NIEUN WEO SSANGKIYEOK -0x87BA 0xB223 #HANGUL SYLLABLE NIEUN WEO KIYEOKSIOS -0x87BB 0xB224 #HANGUL SYLLABLE NIEUN WEO NIEUN -0x87BC 0xB225 #HANGUL SYLLABLE NIEUN WEO NIEUNCIEUC -0x87BD 0xB226 #HANGUL SYLLABLE NIEUN WEO NIEUNHIEUH -0x87BE 0xB227 #HANGUL SYLLABLE NIEUN WEO TIKEUT -0x87BF 0xB228 #HANGUL SYLLABLE NIEUN WEO RIEUL -0x87C0 0xB229 #HANGUL SYLLABLE NIEUN WEO RIEULKIYEOK -0x87C1 0xB22A #HANGUL SYLLABLE NIEUN WEO RIEULMIEUM -0x87C2 0xB22B #HANGUL SYLLABLE NIEUN WEO RIEULPIEUP -0x87C3 0xB22C #HANGUL SYLLABLE NIEUN WEO RIEULSIOS -0x87C4 0xB22D #HANGUL SYLLABLE NIEUN WEO RIEULTHIEUTH -0x87C5 0xB22E #HANGUL SYLLABLE NIEUN WEO RIEULPHIEUPH -0x87C6 0xB22F #HANGUL SYLLABLE NIEUN WEO RIEULHIEUH -0x87C7 0xB230 #HANGUL SYLLABLE NIEUN WEO MIEUM -0x87C8 0xB231 #HANGUL SYLLABLE NIEUN WEO PIEUP -0x87C9 0xB232 #HANGUL SYLLABLE NIEUN WEO PIEUPSIOS -0x87CA 0xB233 #HANGUL SYLLABLE NIEUN WEO SIOS -0x87CB 0xB235 #HANGUL SYLLABLE NIEUN WEO IEUNG -0x87CC 0xB236 #HANGUL SYLLABLE NIEUN WEO CIEUC -0x87CD 0xB237 #HANGUL SYLLABLE NIEUN WEO CHIEUCH -0x87CE 0xB238 #HANGUL SYLLABLE NIEUN WEO KHIEUKH -0x87CF 0xB239 #HANGUL SYLLABLE NIEUN WEO THIEUTH -0x87D0 0xB23A #HANGUL SYLLABLE NIEUN WEO PHIEUPH -0x87D1 0xB23B #HANGUL SYLLABLE NIEUN WEO HIEUH -0x87D2 0xB23D #HANGUL SYLLABLE NIEUN WE KIYEOK -0x87D3 0xB23E #HANGUL SYLLABLE NIEUN WE SSANGKIYEOK -0x87D4 0xB23F #HANGUL SYLLABLE NIEUN WE KIYEOKSIOS -0x87D5 0xB240 #HANGUL SYLLABLE NIEUN WE NIEUN -0x87D6 0xB241 #HANGUL SYLLABLE NIEUN WE NIEUNCIEUC -0x87D7 0xB242 #HANGUL SYLLABLE NIEUN WE NIEUNHIEUH -0x87D8 0xB243 #HANGUL SYLLABLE NIEUN WE TIKEUT -0x87D9 0xB244 #HANGUL SYLLABLE NIEUN WE RIEUL -0x87DA 0xB245 #HANGUL SYLLABLE NIEUN WE RIEULKIYEOK -0x87DB 0xB246 #HANGUL SYLLABLE NIEUN WE RIEULMIEUM -0x87DC 0xB247 #HANGUL SYLLABLE NIEUN WE RIEULPIEUP -0x87DD 0xB248 #HANGUL SYLLABLE NIEUN WE RIEULSIOS -0x87DE 0xB249 #HANGUL SYLLABLE NIEUN WE RIEULTHIEUTH -0x87DF 0xB24A #HANGUL SYLLABLE NIEUN WE RIEULPHIEUPH -0x87E0 0xB24B #HANGUL SYLLABLE NIEUN WE RIEULHIEUH -0x87E1 0xB24C #HANGUL SYLLABLE NIEUN WE MIEUM -0x87E2 0xB24D #HANGUL SYLLABLE NIEUN WE PIEUP -0x87E3 0xB24E #HANGUL SYLLABLE NIEUN WE PIEUPSIOS -0x87E4 0xB24F #HANGUL SYLLABLE NIEUN WE SIOS -0x87E5 0xB250 #HANGUL SYLLABLE NIEUN WE SSANGSIOS -0x87E6 0xB251 #HANGUL SYLLABLE NIEUN WE IEUNG -0x87E7 0xB252 #HANGUL SYLLABLE NIEUN WE CIEUC -0x87E8 0xB253 #HANGUL SYLLABLE NIEUN WE CHIEUCH -0x87E9 0xB254 #HANGUL SYLLABLE NIEUN WE KHIEUKH -0x87EA 0xB255 #HANGUL SYLLABLE NIEUN WE THIEUTH -0x87EB 0xB256 #HANGUL SYLLABLE NIEUN WE PHIEUPH -0x87EC 0xB257 #HANGUL SYLLABLE NIEUN WE HIEUH -0x87ED 0xB259 #HANGUL SYLLABLE NIEUN WI KIYEOK -0x87EE 0xB25A #HANGUL SYLLABLE NIEUN WI SSANGKIYEOK -0x87EF 0xB25B #HANGUL SYLLABLE NIEUN WI KIYEOKSIOS -0x87F0 0xB25D #HANGUL SYLLABLE NIEUN WI NIEUNCIEUC -0x87F1 0xB25E #HANGUL SYLLABLE NIEUN WI NIEUNHIEUH -0x87F2 0xB25F #HANGUL SYLLABLE NIEUN WI TIKEUT -0x87F3 0xB261 #HANGUL SYLLABLE NIEUN WI RIEULKIYEOK -0x87F4 0xB262 #HANGUL SYLLABLE NIEUN WI RIEULMIEUM -0x87F5 0xB263 #HANGUL SYLLABLE NIEUN WI RIEULPIEUP -0x87F6 0xB264 #HANGUL SYLLABLE NIEUN WI RIEULSIOS -0x87F7 0xB265 #HANGUL SYLLABLE NIEUN WI RIEULTHIEUTH -0x87F8 0xB266 #HANGUL SYLLABLE NIEUN WI RIEULPHIEUPH -0x87F9 0xB267 #HANGUL SYLLABLE NIEUN WI RIEULHIEUH -0x87FA 0xB26A #HANGUL SYLLABLE NIEUN WI PIEUPSIOS -0x87FB 0xB26B #HANGUL SYLLABLE NIEUN WI SIOS -0x87FC 0xB26C #HANGUL SYLLABLE NIEUN WI SSANGSIOS -0x87FD 0xB26D #HANGUL SYLLABLE NIEUN WI IEUNG -0x87FE 0xB26E #HANGUL SYLLABLE NIEUN WI CIEUC -0x8841 0xB26F #HANGUL SYLLABLE NIEUN WI CHIEUCH -0x8842 0xB270 #HANGUL SYLLABLE NIEUN WI KHIEUKH -0x8843 0xB271 #HANGUL SYLLABLE NIEUN WI THIEUTH -0x8844 0xB272 #HANGUL SYLLABLE NIEUN WI PHIEUPH -0x8845 0xB273 #HANGUL SYLLABLE NIEUN WI HIEUH -0x8846 0xB276 #HANGUL SYLLABLE NIEUN YU SSANGKIYEOK -0x8847 0xB277 #HANGUL SYLLABLE NIEUN YU KIYEOKSIOS -0x8848 0xB278 #HANGUL SYLLABLE NIEUN YU NIEUN -0x8849 0xB279 #HANGUL SYLLABLE NIEUN YU NIEUNCIEUC -0x884A 0xB27A #HANGUL SYLLABLE NIEUN YU NIEUNHIEUH -0x884B 0xB27B #HANGUL SYLLABLE NIEUN YU TIKEUT -0x884C 0xB27D #HANGUL SYLLABLE NIEUN YU RIEULKIYEOK -0x884D 0xB27E #HANGUL SYLLABLE NIEUN YU RIEULMIEUM -0x884E 0xB27F #HANGUL SYLLABLE NIEUN YU RIEULPIEUP -0x884F 0xB280 #HANGUL SYLLABLE NIEUN YU RIEULSIOS -0x8850 0xB281 #HANGUL SYLLABLE NIEUN YU RIEULTHIEUTH -0x8851 0xB282 #HANGUL SYLLABLE NIEUN YU RIEULPHIEUPH -0x8852 0xB283 #HANGUL SYLLABLE NIEUN YU RIEULHIEUH -0x8853 0xB286 #HANGUL SYLLABLE NIEUN YU PIEUPSIOS -0x8854 0xB287 #HANGUL SYLLABLE NIEUN YU SIOS -0x8855 0xB288 #HANGUL SYLLABLE NIEUN YU SSANGSIOS -0x8856 0xB28A #HANGUL SYLLABLE NIEUN YU CIEUC -0x8857 0xB28B #HANGUL SYLLABLE NIEUN YU CHIEUCH -0x8858 0xB28C #HANGUL SYLLABLE NIEUN YU KHIEUKH -0x8859 0xB28D #HANGUL SYLLABLE NIEUN YU THIEUTH -0x885A 0xB28E #HANGUL SYLLABLE NIEUN YU PHIEUPH -0x8861 0xB28F #HANGUL SYLLABLE NIEUN YU HIEUH -0x8862 0xB292 #HANGUL SYLLABLE NIEUN EU SSANGKIYEOK -0x8863 0xB293 #HANGUL SYLLABLE NIEUN EU KIYEOKSIOS -0x8864 0xB295 #HANGUL SYLLABLE NIEUN EU NIEUNCIEUC -0x8865 0xB296 #HANGUL SYLLABLE NIEUN EU NIEUNHIEUH -0x8866 0xB297 #HANGUL SYLLABLE NIEUN EU TIKEUT -0x8867 0xB29B #HANGUL SYLLABLE NIEUN EU RIEULPIEUP -0x8868 0xB29C #HANGUL SYLLABLE NIEUN EU RIEULSIOS -0x8869 0xB29D #HANGUL SYLLABLE NIEUN EU RIEULTHIEUTH -0x886A 0xB29E #HANGUL SYLLABLE NIEUN EU RIEULPHIEUPH -0x886B 0xB29F #HANGUL SYLLABLE NIEUN EU RIEULHIEUH -0x886C 0xB2A2 #HANGUL SYLLABLE NIEUN EU PIEUPSIOS -0x886D 0xB2A4 #HANGUL SYLLABLE NIEUN EU SSANGSIOS -0x886E 0xB2A7 #HANGUL SYLLABLE NIEUN EU CHIEUCH -0x886F 0xB2A8 #HANGUL SYLLABLE NIEUN EU KHIEUKH -0x8870 0xB2A9 #HANGUL SYLLABLE NIEUN EU THIEUTH -0x8871 0xB2AB #HANGUL SYLLABLE NIEUN EU HIEUH -0x8872 0xB2AD #HANGUL SYLLABLE NIEUN YI KIYEOK -0x8873 0xB2AE #HANGUL SYLLABLE NIEUN YI SSANGKIYEOK -0x8874 0xB2AF #HANGUL SYLLABLE NIEUN YI KIYEOKSIOS -0x8875 0xB2B1 #HANGUL SYLLABLE NIEUN YI NIEUNCIEUC -0x8876 0xB2B2 #HANGUL SYLLABLE NIEUN YI NIEUNHIEUH -0x8877 0xB2B3 #HANGUL SYLLABLE NIEUN YI TIKEUT -0x8878 0xB2B5 #HANGUL SYLLABLE NIEUN YI RIEULKIYEOK -0x8879 0xB2B6 #HANGUL SYLLABLE NIEUN YI RIEULMIEUM -0x887A 0xB2B7 #HANGUL SYLLABLE NIEUN YI RIEULPIEUP -0x8881 0xB2B8 #HANGUL SYLLABLE NIEUN YI RIEULSIOS -0x8882 0xB2B9 #HANGUL SYLLABLE NIEUN YI RIEULTHIEUTH -0x8883 0xB2BA #HANGUL SYLLABLE NIEUN YI RIEULPHIEUPH -0x8884 0xB2BB #HANGUL SYLLABLE NIEUN YI RIEULHIEUH -0x8885 0xB2BC #HANGUL SYLLABLE NIEUN YI MIEUM -0x8886 0xB2BD #HANGUL SYLLABLE NIEUN YI PIEUP -0x8887 0xB2BE #HANGUL SYLLABLE NIEUN YI PIEUPSIOS -0x8888 0xB2BF #HANGUL SYLLABLE NIEUN YI SIOS -0x8889 0xB2C0 #HANGUL SYLLABLE NIEUN YI SSANGSIOS -0x888A 0xB2C1 #HANGUL SYLLABLE NIEUN YI IEUNG -0x888B 0xB2C2 #HANGUL SYLLABLE NIEUN YI CIEUC -0x888C 0xB2C3 #HANGUL SYLLABLE NIEUN YI CHIEUCH -0x888D 0xB2C4 #HANGUL SYLLABLE NIEUN YI KHIEUKH -0x888E 0xB2C5 #HANGUL SYLLABLE NIEUN YI THIEUTH -0x888F 0xB2C6 #HANGUL SYLLABLE NIEUN YI PHIEUPH -0x8890 0xB2C7 #HANGUL SYLLABLE NIEUN YI HIEUH -0x8891 0xB2CA #HANGUL SYLLABLE NIEUN I SSANGKIYEOK -0x8892 0xB2CB #HANGUL SYLLABLE NIEUN I KIYEOKSIOS -0x8893 0xB2CD #HANGUL SYLLABLE NIEUN I NIEUNCIEUC -0x8894 0xB2CE #HANGUL SYLLABLE NIEUN I NIEUNHIEUH -0x8895 0xB2CF #HANGUL SYLLABLE NIEUN I TIKEUT -0x8896 0xB2D1 #HANGUL SYLLABLE NIEUN I RIEULKIYEOK -0x8897 0xB2D3 #HANGUL SYLLABLE NIEUN I RIEULPIEUP -0x8898 0xB2D4 #HANGUL SYLLABLE NIEUN I RIEULSIOS -0x8899 0xB2D5 #HANGUL SYLLABLE NIEUN I RIEULTHIEUTH -0x889A 0xB2D6 #HANGUL SYLLABLE NIEUN I RIEULPHIEUPH -0x889B 0xB2D7 #HANGUL SYLLABLE NIEUN I RIEULHIEUH -0x889C 0xB2DA #HANGUL SYLLABLE NIEUN I PIEUPSIOS -0x889D 0xB2DC #HANGUL SYLLABLE NIEUN I SSANGSIOS -0x889E 0xB2DE #HANGUL SYLLABLE NIEUN I CIEUC -0x889F 0xB2DF #HANGUL SYLLABLE NIEUN I CHIEUCH -0x88A0 0xB2E0 #HANGUL SYLLABLE NIEUN I KHIEUKH -0x88A1 0xB2E1 #HANGUL SYLLABLE NIEUN I THIEUTH -0x88A2 0xB2E3 #HANGUL SYLLABLE NIEUN I HIEUH -0x88A3 0xB2E7 #HANGUL SYLLABLE TIKEUT A KIYEOKSIOS -0x88A4 0xB2E9 #HANGUL SYLLABLE TIKEUT A NIEUNCIEUC -0x88A5 0xB2EA #HANGUL SYLLABLE TIKEUT A NIEUNHIEUH -0x88A6 0xB2F0 #HANGUL SYLLABLE TIKEUT A RIEULSIOS -0x88A7 0xB2F1 #HANGUL SYLLABLE TIKEUT A RIEULTHIEUTH -0x88A8 0xB2F2 #HANGUL SYLLABLE TIKEUT A RIEULPHIEUPH -0x88A9 0xB2F6 #HANGUL SYLLABLE TIKEUT A PIEUPSIOS -0x88AA 0xB2FC #HANGUL SYLLABLE TIKEUT A KHIEUKH -0x88AB 0xB2FD #HANGUL SYLLABLE TIKEUT A THIEUTH -0x88AC 0xB2FE #HANGUL SYLLABLE TIKEUT A PHIEUPH -0x88AD 0xB302 #HANGUL SYLLABLE TIKEUT AE SSANGKIYEOK -0x88AE 0xB303 #HANGUL SYLLABLE TIKEUT AE KIYEOKSIOS -0x88AF 0xB305 #HANGUL SYLLABLE TIKEUT AE NIEUNCIEUC -0x88B0 0xB306 #HANGUL SYLLABLE TIKEUT AE NIEUNHIEUH -0x88B1 0xB307 #HANGUL SYLLABLE TIKEUT AE TIKEUT -0x88B2 0xB309 #HANGUL SYLLABLE TIKEUT AE RIEULKIYEOK -0x88B3 0xB30A #HANGUL SYLLABLE TIKEUT AE RIEULMIEUM -0x88B4 0xB30B #HANGUL SYLLABLE TIKEUT AE RIEULPIEUP -0x88B5 0xB30C #HANGUL SYLLABLE TIKEUT AE RIEULSIOS -0x88B6 0xB30D #HANGUL SYLLABLE TIKEUT AE RIEULTHIEUTH -0x88B7 0xB30E #HANGUL SYLLABLE TIKEUT AE RIEULPHIEUPH -0x88B8 0xB30F #HANGUL SYLLABLE TIKEUT AE RIEULHIEUH -0x88B9 0xB312 #HANGUL SYLLABLE TIKEUT AE PIEUPSIOS -0x88BA 0xB316 #HANGUL SYLLABLE TIKEUT AE CIEUC -0x88BB 0xB317 #HANGUL SYLLABLE TIKEUT AE CHIEUCH -0x88BC 0xB318 #HANGUL SYLLABLE TIKEUT AE KHIEUKH -0x88BD 0xB319 #HANGUL SYLLABLE TIKEUT AE THIEUTH -0x88BE 0xB31A #HANGUL SYLLABLE TIKEUT AE PHIEUPH -0x88BF 0xB31B #HANGUL SYLLABLE TIKEUT AE HIEUH -0x88C0 0xB31D #HANGUL SYLLABLE TIKEUT YA KIYEOK -0x88C1 0xB31E #HANGUL SYLLABLE TIKEUT YA SSANGKIYEOK -0x88C2 0xB31F #HANGUL SYLLABLE TIKEUT YA KIYEOKSIOS -0x88C3 0xB320 #HANGUL SYLLABLE TIKEUT YA NIEUN -0x88C4 0xB321 #HANGUL SYLLABLE TIKEUT YA NIEUNCIEUC -0x88C5 0xB322 #HANGUL SYLLABLE TIKEUT YA NIEUNHIEUH -0x88C6 0xB323 #HANGUL SYLLABLE TIKEUT YA TIKEUT -0x88C7 0xB324 #HANGUL SYLLABLE TIKEUT YA RIEUL -0x88C8 0xB325 #HANGUL SYLLABLE TIKEUT YA RIEULKIYEOK -0x88C9 0xB326 #HANGUL SYLLABLE TIKEUT YA RIEULMIEUM -0x88CA 0xB327 #HANGUL SYLLABLE TIKEUT YA RIEULPIEUP -0x88CB 0xB328 #HANGUL SYLLABLE TIKEUT YA RIEULSIOS -0x88CC 0xB329 #HANGUL SYLLABLE TIKEUT YA RIEULTHIEUTH -0x88CD 0xB32A #HANGUL SYLLABLE TIKEUT YA RIEULPHIEUPH -0x88CE 0xB32B #HANGUL SYLLABLE TIKEUT YA RIEULHIEUH -0x88CF 0xB32C #HANGUL SYLLABLE TIKEUT YA MIEUM -0x88D0 0xB32D #HANGUL SYLLABLE TIKEUT YA PIEUP -0x88D1 0xB32E #HANGUL SYLLABLE TIKEUT YA PIEUPSIOS -0x88D2 0xB32F #HANGUL SYLLABLE TIKEUT YA SIOS -0x88D3 0xB330 #HANGUL SYLLABLE TIKEUT YA SSANGSIOS -0x88D4 0xB331 #HANGUL SYLLABLE TIKEUT YA IEUNG -0x88D5 0xB332 #HANGUL SYLLABLE TIKEUT YA CIEUC -0x88D6 0xB333 #HANGUL SYLLABLE TIKEUT YA CHIEUCH -0x88D7 0xB334 #HANGUL SYLLABLE TIKEUT YA KHIEUKH -0x88D8 0xB335 #HANGUL SYLLABLE TIKEUT YA THIEUTH -0x88D9 0xB336 #HANGUL SYLLABLE TIKEUT YA PHIEUPH -0x88DA 0xB337 #HANGUL SYLLABLE TIKEUT YA HIEUH -0x88DB 0xB338 #HANGUL SYLLABLE TIKEUT YAE -0x88DC 0xB339 #HANGUL SYLLABLE TIKEUT YAE KIYEOK -0x88DD 0xB33A #HANGUL SYLLABLE TIKEUT YAE SSANGKIYEOK -0x88DE 0xB33B #HANGUL SYLLABLE TIKEUT YAE KIYEOKSIOS -0x88DF 0xB33C #HANGUL SYLLABLE TIKEUT YAE NIEUN -0x88E0 0xB33D #HANGUL SYLLABLE TIKEUT YAE NIEUNCIEUC -0x88E1 0xB33E #HANGUL SYLLABLE TIKEUT YAE NIEUNHIEUH -0x88E2 0xB33F #HANGUL SYLLABLE TIKEUT YAE TIKEUT -0x88E3 0xB340 #HANGUL SYLLABLE TIKEUT YAE RIEUL -0x88E4 0xB341 #HANGUL SYLLABLE TIKEUT YAE RIEULKIYEOK -0x88E5 0xB342 #HANGUL SYLLABLE TIKEUT YAE RIEULMIEUM -0x88E6 0xB343 #HANGUL SYLLABLE TIKEUT YAE RIEULPIEUP -0x88E7 0xB344 #HANGUL SYLLABLE TIKEUT YAE RIEULSIOS -0x88E8 0xB345 #HANGUL SYLLABLE TIKEUT YAE RIEULTHIEUTH -0x88E9 0xB346 #HANGUL SYLLABLE TIKEUT YAE RIEULPHIEUPH -0x88EA 0xB347 #HANGUL SYLLABLE TIKEUT YAE RIEULHIEUH -0x88EB 0xB348 #HANGUL SYLLABLE TIKEUT YAE MIEUM -0x88EC 0xB349 #HANGUL SYLLABLE TIKEUT YAE PIEUP -0x88ED 0xB34A #HANGUL SYLLABLE TIKEUT YAE PIEUPSIOS -0x88EE 0xB34B #HANGUL SYLLABLE TIKEUT YAE SIOS -0x88EF 0xB34C #HANGUL SYLLABLE TIKEUT YAE SSANGSIOS -0x88F0 0xB34D #HANGUL SYLLABLE TIKEUT YAE IEUNG -0x88F1 0xB34E #HANGUL SYLLABLE TIKEUT YAE CIEUC -0x88F2 0xB34F #HANGUL SYLLABLE TIKEUT YAE CHIEUCH -0x88F3 0xB350 #HANGUL SYLLABLE TIKEUT YAE KHIEUKH -0x88F4 0xB351 #HANGUL SYLLABLE TIKEUT YAE THIEUTH -0x88F5 0xB352 #HANGUL SYLLABLE TIKEUT YAE PHIEUPH -0x88F6 0xB353 #HANGUL SYLLABLE TIKEUT YAE HIEUH -0x88F7 0xB357 #HANGUL SYLLABLE TIKEUT EO KIYEOKSIOS -0x88F8 0xB359 #HANGUL SYLLABLE TIKEUT EO NIEUNCIEUC -0x88F9 0xB35A #HANGUL SYLLABLE TIKEUT EO NIEUNHIEUH -0x88FA 0xB35D #HANGUL SYLLABLE TIKEUT EO RIEULKIYEOK -0x88FB 0xB360 #HANGUL SYLLABLE TIKEUT EO RIEULSIOS -0x88FC 0xB361 #HANGUL SYLLABLE TIKEUT EO RIEULTHIEUTH -0x88FD 0xB362 #HANGUL SYLLABLE TIKEUT EO RIEULPHIEUPH -0x88FE 0xB363 #HANGUL SYLLABLE TIKEUT EO RIEULHIEUH -0x8941 0xB366 #HANGUL SYLLABLE TIKEUT EO PIEUPSIOS -0x8942 0xB368 #HANGUL SYLLABLE TIKEUT EO SSANGSIOS -0x8943 0xB36A #HANGUL SYLLABLE TIKEUT EO CIEUC -0x8944 0xB36C #HANGUL SYLLABLE TIKEUT EO KHIEUKH -0x8945 0xB36D #HANGUL SYLLABLE TIKEUT EO THIEUTH -0x8946 0xB36F #HANGUL SYLLABLE TIKEUT EO HIEUH -0x8947 0xB372 #HANGUL SYLLABLE TIKEUT E SSANGKIYEOK -0x8948 0xB373 #HANGUL SYLLABLE TIKEUT E KIYEOKSIOS -0x8949 0xB375 #HANGUL SYLLABLE TIKEUT E NIEUNCIEUC -0x894A 0xB376 #HANGUL SYLLABLE TIKEUT E NIEUNHIEUH -0x894B 0xB377 #HANGUL SYLLABLE TIKEUT E TIKEUT -0x894C 0xB379 #HANGUL SYLLABLE TIKEUT E RIEULKIYEOK -0x894D 0xB37A #HANGUL SYLLABLE TIKEUT E RIEULMIEUM -0x894E 0xB37B #HANGUL SYLLABLE TIKEUT E RIEULPIEUP -0x894F 0xB37C #HANGUL SYLLABLE TIKEUT E RIEULSIOS -0x8950 0xB37D #HANGUL SYLLABLE TIKEUT E RIEULTHIEUTH -0x8951 0xB37E #HANGUL SYLLABLE TIKEUT E RIEULPHIEUPH -0x8952 0xB37F #HANGUL SYLLABLE TIKEUT E RIEULHIEUH -0x8953 0xB382 #HANGUL SYLLABLE TIKEUT E PIEUPSIOS -0x8954 0xB386 #HANGUL SYLLABLE TIKEUT E CIEUC -0x8955 0xB387 #HANGUL SYLLABLE TIKEUT E CHIEUCH -0x8956 0xB388 #HANGUL SYLLABLE TIKEUT E KHIEUKH -0x8957 0xB389 #HANGUL SYLLABLE TIKEUT E THIEUTH -0x8958 0xB38A #HANGUL SYLLABLE TIKEUT E PHIEUPH -0x8959 0xB38B #HANGUL SYLLABLE TIKEUT E HIEUH -0x895A 0xB38D #HANGUL SYLLABLE TIKEUT YEO KIYEOK -0x8961 0xB38E #HANGUL SYLLABLE TIKEUT YEO SSANGKIYEOK -0x8962 0xB38F #HANGUL SYLLABLE TIKEUT YEO KIYEOKSIOS -0x8963 0xB391 #HANGUL SYLLABLE TIKEUT YEO NIEUNCIEUC -0x8964 0xB392 #HANGUL SYLLABLE TIKEUT YEO NIEUNHIEUH -0x8965 0xB393 #HANGUL SYLLABLE TIKEUT YEO TIKEUT -0x8966 0xB395 #HANGUL SYLLABLE TIKEUT YEO RIEULKIYEOK -0x8967 0xB396 #HANGUL SYLLABLE TIKEUT YEO RIEULMIEUM -0x8968 0xB397 #HANGUL SYLLABLE TIKEUT YEO RIEULPIEUP -0x8969 0xB398 #HANGUL SYLLABLE TIKEUT YEO RIEULSIOS -0x896A 0xB399 #HANGUL SYLLABLE TIKEUT YEO RIEULTHIEUTH -0x896B 0xB39A #HANGUL SYLLABLE TIKEUT YEO RIEULPHIEUPH -0x896C 0xB39B #HANGUL SYLLABLE TIKEUT YEO RIEULHIEUH -0x896D 0xB39C #HANGUL SYLLABLE TIKEUT YEO MIEUM -0x896E 0xB39D #HANGUL SYLLABLE TIKEUT YEO PIEUP -0x896F 0xB39E #HANGUL SYLLABLE TIKEUT YEO PIEUPSIOS -0x8970 0xB39F #HANGUL SYLLABLE TIKEUT YEO SIOS -0x8971 0xB3A2 #HANGUL SYLLABLE TIKEUT YEO CIEUC -0x8972 0xB3A3 #HANGUL SYLLABLE TIKEUT YEO CHIEUCH -0x8973 0xB3A4 #HANGUL SYLLABLE TIKEUT YEO KHIEUKH -0x8974 0xB3A5 #HANGUL SYLLABLE TIKEUT YEO THIEUTH -0x8975 0xB3A6 #HANGUL SYLLABLE TIKEUT YEO PHIEUPH -0x8976 0xB3A7 #HANGUL SYLLABLE TIKEUT YEO HIEUH -0x8977 0xB3A9 #HANGUL SYLLABLE TIKEUT YE KIYEOK -0x8978 0xB3AA #HANGUL SYLLABLE TIKEUT YE SSANGKIYEOK -0x8979 0xB3AB #HANGUL SYLLABLE TIKEUT YE KIYEOKSIOS -0x897A 0xB3AD #HANGUL SYLLABLE TIKEUT YE NIEUNCIEUC -0x8981 0xB3AE #HANGUL SYLLABLE TIKEUT YE NIEUNHIEUH -0x8982 0xB3AF #HANGUL SYLLABLE TIKEUT YE TIKEUT -0x8983 0xB3B0 #HANGUL SYLLABLE TIKEUT YE RIEUL -0x8984 0xB3B1 #HANGUL SYLLABLE TIKEUT YE RIEULKIYEOK -0x8985 0xB3B2 #HANGUL SYLLABLE TIKEUT YE RIEULMIEUM -0x8986 0xB3B3 #HANGUL SYLLABLE TIKEUT YE RIEULPIEUP -0x8987 0xB3B4 #HANGUL SYLLABLE TIKEUT YE RIEULSIOS -0x8988 0xB3B5 #HANGUL SYLLABLE TIKEUT YE RIEULTHIEUTH -0x8989 0xB3B6 #HANGUL SYLLABLE TIKEUT YE RIEULPHIEUPH -0x898A 0xB3B7 #HANGUL SYLLABLE TIKEUT YE RIEULHIEUH -0x898B 0xB3B8 #HANGUL SYLLABLE TIKEUT YE MIEUM -0x898C 0xB3B9 #HANGUL SYLLABLE TIKEUT YE PIEUP -0x898D 0xB3BA #HANGUL SYLLABLE TIKEUT YE PIEUPSIOS -0x898E 0xB3BB #HANGUL SYLLABLE TIKEUT YE SIOS -0x898F 0xB3BC #HANGUL SYLLABLE TIKEUT YE SSANGSIOS -0x8990 0xB3BD #HANGUL SYLLABLE TIKEUT YE IEUNG -0x8991 0xB3BE #HANGUL SYLLABLE TIKEUT YE CIEUC -0x8992 0xB3BF #HANGUL SYLLABLE TIKEUT YE CHIEUCH -0x8993 0xB3C0 #HANGUL SYLLABLE TIKEUT YE KHIEUKH -0x8994 0xB3C1 #HANGUL SYLLABLE TIKEUT YE THIEUTH -0x8995 0xB3C2 #HANGUL SYLLABLE TIKEUT YE PHIEUPH -0x8996 0xB3C3 #HANGUL SYLLABLE TIKEUT YE HIEUH -0x8997 0xB3C6 #HANGUL SYLLABLE TIKEUT O SSANGKIYEOK -0x8998 0xB3C7 #HANGUL SYLLABLE TIKEUT O KIYEOKSIOS -0x8999 0xB3C9 #HANGUL SYLLABLE TIKEUT O NIEUNCIEUC -0x899A 0xB3CA #HANGUL SYLLABLE TIKEUT O NIEUNHIEUH -0x899B 0xB3CD #HANGUL SYLLABLE TIKEUT O RIEULKIYEOK -0x899C 0xB3CF #HANGUL SYLLABLE TIKEUT O RIEULPIEUP -0x899D 0xB3D1 #HANGUL SYLLABLE TIKEUT O RIEULTHIEUTH -0x899E 0xB3D2 #HANGUL SYLLABLE TIKEUT O RIEULPHIEUPH -0x899F 0xB3D3 #HANGUL SYLLABLE TIKEUT O RIEULHIEUH -0x89A0 0xB3D6 #HANGUL SYLLABLE TIKEUT O PIEUPSIOS -0x89A1 0xB3D8 #HANGUL SYLLABLE TIKEUT O SSANGSIOS -0x89A2 0xB3DA #HANGUL SYLLABLE TIKEUT O CIEUC -0x89A3 0xB3DC #HANGUL SYLLABLE TIKEUT O KHIEUKH -0x89A4 0xB3DE #HANGUL SYLLABLE TIKEUT O PHIEUPH -0x89A5 0xB3DF #HANGUL SYLLABLE TIKEUT O HIEUH -0x89A6 0xB3E1 #HANGUL SYLLABLE TIKEUT WA KIYEOK -0x89A7 0xB3E2 #HANGUL SYLLABLE TIKEUT WA SSANGKIYEOK -0x89A8 0xB3E3 #HANGUL SYLLABLE TIKEUT WA KIYEOKSIOS -0x89A9 0xB3E5 #HANGUL SYLLABLE TIKEUT WA NIEUNCIEUC -0x89AA 0xB3E6 #HANGUL SYLLABLE TIKEUT WA NIEUNHIEUH -0x89AB 0xB3E7 #HANGUL SYLLABLE TIKEUT WA TIKEUT -0x89AC 0xB3E9 #HANGUL SYLLABLE TIKEUT WA RIEULKIYEOK -0x89AD 0xB3EA #HANGUL SYLLABLE TIKEUT WA RIEULMIEUM -0x89AE 0xB3EB #HANGUL SYLLABLE TIKEUT WA RIEULPIEUP -0x89AF 0xB3EC #HANGUL SYLLABLE TIKEUT WA RIEULSIOS -0x89B0 0xB3ED #HANGUL SYLLABLE TIKEUT WA RIEULTHIEUTH -0x89B1 0xB3EE #HANGUL SYLLABLE TIKEUT WA RIEULPHIEUPH -0x89B2 0xB3EF #HANGUL SYLLABLE TIKEUT WA RIEULHIEUH -0x89B3 0xB3F0 #HANGUL SYLLABLE TIKEUT WA MIEUM -0x89B4 0xB3F1 #HANGUL SYLLABLE TIKEUT WA PIEUP -0x89B5 0xB3F2 #HANGUL SYLLABLE TIKEUT WA PIEUPSIOS -0x89B6 0xB3F3 #HANGUL SYLLABLE TIKEUT WA SIOS -0x89B7 0xB3F4 #HANGUL SYLLABLE TIKEUT WA SSANGSIOS -0x89B8 0xB3F5 #HANGUL SYLLABLE TIKEUT WA IEUNG -0x89B9 0xB3F6 #HANGUL SYLLABLE TIKEUT WA CIEUC -0x89BA 0xB3F7 #HANGUL SYLLABLE TIKEUT WA CHIEUCH -0x89BB 0xB3F8 #HANGUL SYLLABLE TIKEUT WA KHIEUKH -0x89BC 0xB3F9 #HANGUL SYLLABLE TIKEUT WA THIEUTH -0x89BD 0xB3FA #HANGUL SYLLABLE TIKEUT WA PHIEUPH -0x89BE 0xB3FB #HANGUL SYLLABLE TIKEUT WA HIEUH -0x89BF 0xB3FD #HANGUL SYLLABLE TIKEUT WAE KIYEOK -0x89C0 0xB3FE #HANGUL SYLLABLE TIKEUT WAE SSANGKIYEOK -0x89C1 0xB3FF #HANGUL SYLLABLE TIKEUT WAE KIYEOKSIOS -0x89C2 0xB400 #HANGUL SYLLABLE TIKEUT WAE NIEUN -0x89C3 0xB401 #HANGUL SYLLABLE TIKEUT WAE NIEUNCIEUC -0x89C4 0xB402 #HANGUL SYLLABLE TIKEUT WAE NIEUNHIEUH -0x89C5 0xB403 #HANGUL SYLLABLE TIKEUT WAE TIKEUT -0x89C6 0xB404 #HANGUL SYLLABLE TIKEUT WAE RIEUL -0x89C7 0xB405 #HANGUL SYLLABLE TIKEUT WAE RIEULKIYEOK -0x89C8 0xB406 #HANGUL SYLLABLE TIKEUT WAE RIEULMIEUM -0x89C9 0xB407 #HANGUL SYLLABLE TIKEUT WAE RIEULPIEUP -0x89CA 0xB408 #HANGUL SYLLABLE TIKEUT WAE RIEULSIOS -0x89CB 0xB409 #HANGUL SYLLABLE TIKEUT WAE RIEULTHIEUTH -0x89CC 0xB40A #HANGUL SYLLABLE TIKEUT WAE RIEULPHIEUPH -0x89CD 0xB40B #HANGUL SYLLABLE TIKEUT WAE RIEULHIEUH -0x89CE 0xB40C #HANGUL SYLLABLE TIKEUT WAE MIEUM -0x89CF 0xB40D #HANGUL SYLLABLE TIKEUT WAE PIEUP -0x89D0 0xB40E #HANGUL SYLLABLE TIKEUT WAE PIEUPSIOS -0x89D1 0xB40F #HANGUL SYLLABLE TIKEUT WAE SIOS -0x89D2 0xB411 #HANGUL SYLLABLE TIKEUT WAE IEUNG -0x89D3 0xB412 #HANGUL SYLLABLE TIKEUT WAE CIEUC -0x89D4 0xB413 #HANGUL SYLLABLE TIKEUT WAE CHIEUCH -0x89D5 0xB414 #HANGUL SYLLABLE TIKEUT WAE KHIEUKH -0x89D6 0xB415 #HANGUL SYLLABLE TIKEUT WAE THIEUTH -0x89D7 0xB416 #HANGUL SYLLABLE TIKEUT WAE PHIEUPH -0x89D8 0xB417 #HANGUL SYLLABLE TIKEUT WAE HIEUH -0x89D9 0xB419 #HANGUL SYLLABLE TIKEUT OE KIYEOK -0x89DA 0xB41A #HANGUL SYLLABLE TIKEUT OE SSANGKIYEOK -0x89DB 0xB41B #HANGUL SYLLABLE TIKEUT OE KIYEOKSIOS -0x89DC 0xB41D #HANGUL SYLLABLE TIKEUT OE NIEUNCIEUC -0x89DD 0xB41E #HANGUL SYLLABLE TIKEUT OE NIEUNHIEUH -0x89DE 0xB41F #HANGUL SYLLABLE TIKEUT OE TIKEUT -0x89DF 0xB421 #HANGUL SYLLABLE TIKEUT OE RIEULKIYEOK -0x89E0 0xB422 #HANGUL SYLLABLE TIKEUT OE RIEULMIEUM -0x89E1 0xB423 #HANGUL SYLLABLE TIKEUT OE RIEULPIEUP -0x89E2 0xB424 #HANGUL SYLLABLE TIKEUT OE RIEULSIOS -0x89E3 0xB425 #HANGUL SYLLABLE TIKEUT OE RIEULTHIEUTH -0x89E4 0xB426 #HANGUL SYLLABLE TIKEUT OE RIEULPHIEUPH -0x89E5 0xB427 #HANGUL SYLLABLE TIKEUT OE RIEULHIEUH -0x89E6 0xB42A #HANGUL SYLLABLE TIKEUT OE PIEUPSIOS -0x89E7 0xB42C #HANGUL SYLLABLE TIKEUT OE SSANGSIOS -0x89E8 0xB42D #HANGUL SYLLABLE TIKEUT OE IEUNG -0x89E9 0xB42E #HANGUL SYLLABLE TIKEUT OE CIEUC -0x89EA 0xB42F #HANGUL SYLLABLE TIKEUT OE CHIEUCH -0x89EB 0xB430 #HANGUL SYLLABLE TIKEUT OE KHIEUKH -0x89EC 0xB431 #HANGUL SYLLABLE TIKEUT OE THIEUTH -0x89ED 0xB432 #HANGUL SYLLABLE TIKEUT OE PHIEUPH -0x89EE 0xB433 #HANGUL SYLLABLE TIKEUT OE HIEUH -0x89EF 0xB435 #HANGUL SYLLABLE TIKEUT YO KIYEOK -0x89F0 0xB436 #HANGUL SYLLABLE TIKEUT YO SSANGKIYEOK -0x89F1 0xB437 #HANGUL SYLLABLE TIKEUT YO KIYEOKSIOS -0x89F2 0xB438 #HANGUL SYLLABLE TIKEUT YO NIEUN -0x89F3 0xB439 #HANGUL SYLLABLE TIKEUT YO NIEUNCIEUC -0x89F4 0xB43A #HANGUL SYLLABLE TIKEUT YO NIEUNHIEUH -0x89F5 0xB43B #HANGUL SYLLABLE TIKEUT YO TIKEUT -0x89F6 0xB43C #HANGUL SYLLABLE TIKEUT YO RIEUL -0x89F7 0xB43D #HANGUL SYLLABLE TIKEUT YO RIEULKIYEOK -0x89F8 0xB43E #HANGUL SYLLABLE TIKEUT YO RIEULMIEUM -0x89F9 0xB43F #HANGUL SYLLABLE TIKEUT YO RIEULPIEUP -0x89FA 0xB440 #HANGUL SYLLABLE TIKEUT YO RIEULSIOS -0x89FB 0xB441 #HANGUL SYLLABLE TIKEUT YO RIEULTHIEUTH -0x89FC 0xB442 #HANGUL SYLLABLE TIKEUT YO RIEULPHIEUPH -0x89FD 0xB443 #HANGUL SYLLABLE TIKEUT YO RIEULHIEUH -0x89FE 0xB444 #HANGUL SYLLABLE TIKEUT YO MIEUM -0x8A41 0xB445 #HANGUL SYLLABLE TIKEUT YO PIEUP -0x8A42 0xB446 #HANGUL SYLLABLE TIKEUT YO PIEUPSIOS -0x8A43 0xB447 #HANGUL SYLLABLE TIKEUT YO SIOS -0x8A44 0xB448 #HANGUL SYLLABLE TIKEUT YO SSANGSIOS -0x8A45 0xB449 #HANGUL SYLLABLE TIKEUT YO IEUNG -0x8A46 0xB44A #HANGUL SYLLABLE TIKEUT YO CIEUC -0x8A47 0xB44B #HANGUL SYLLABLE TIKEUT YO CHIEUCH -0x8A48 0xB44C #HANGUL SYLLABLE TIKEUT YO KHIEUKH -0x8A49 0xB44D #HANGUL SYLLABLE TIKEUT YO THIEUTH -0x8A4A 0xB44E #HANGUL SYLLABLE TIKEUT YO PHIEUPH -0x8A4B 0xB44F #HANGUL SYLLABLE TIKEUT YO HIEUH -0x8A4C 0xB452 #HANGUL SYLLABLE TIKEUT U SSANGKIYEOK -0x8A4D 0xB453 #HANGUL SYLLABLE TIKEUT U KIYEOKSIOS -0x8A4E 0xB455 #HANGUL SYLLABLE TIKEUT U NIEUNCIEUC -0x8A4F 0xB456 #HANGUL SYLLABLE TIKEUT U NIEUNHIEUH -0x8A50 0xB457 #HANGUL SYLLABLE TIKEUT U TIKEUT -0x8A51 0xB459 #HANGUL SYLLABLE TIKEUT U RIEULKIYEOK -0x8A52 0xB45A #HANGUL SYLLABLE TIKEUT U RIEULMIEUM -0x8A53 0xB45B #HANGUL SYLLABLE TIKEUT U RIEULPIEUP -0x8A54 0xB45C #HANGUL SYLLABLE TIKEUT U RIEULSIOS -0x8A55 0xB45D #HANGUL SYLLABLE TIKEUT U RIEULTHIEUTH -0x8A56 0xB45E #HANGUL SYLLABLE TIKEUT U RIEULPHIEUPH -0x8A57 0xB45F #HANGUL SYLLABLE TIKEUT U RIEULHIEUH -0x8A58 0xB462 #HANGUL SYLLABLE TIKEUT U PIEUPSIOS -0x8A59 0xB464 #HANGUL SYLLABLE TIKEUT U SSANGSIOS -0x8A5A 0xB466 #HANGUL SYLLABLE TIKEUT U CIEUC -0x8A61 0xB467 #HANGUL SYLLABLE TIKEUT U CHIEUCH -0x8A62 0xB468 #HANGUL SYLLABLE TIKEUT U KHIEUKH -0x8A63 0xB469 #HANGUL SYLLABLE TIKEUT U THIEUTH -0x8A64 0xB46A #HANGUL SYLLABLE TIKEUT U PHIEUPH -0x8A65 0xB46B #HANGUL SYLLABLE TIKEUT U HIEUH -0x8A66 0xB46D #HANGUL SYLLABLE TIKEUT WEO KIYEOK -0x8A67 0xB46E #HANGUL SYLLABLE TIKEUT WEO SSANGKIYEOK -0x8A68 0xB46F #HANGUL SYLLABLE TIKEUT WEO KIYEOKSIOS -0x8A69 0xB470 #HANGUL SYLLABLE TIKEUT WEO NIEUN -0x8A6A 0xB471 #HANGUL SYLLABLE TIKEUT WEO NIEUNCIEUC -0x8A6B 0xB472 #HANGUL SYLLABLE TIKEUT WEO NIEUNHIEUH -0x8A6C 0xB473 #HANGUL SYLLABLE TIKEUT WEO TIKEUT -0x8A6D 0xB474 #HANGUL SYLLABLE TIKEUT WEO RIEUL -0x8A6E 0xB475 #HANGUL SYLLABLE TIKEUT WEO RIEULKIYEOK -0x8A6F 0xB476 #HANGUL SYLLABLE TIKEUT WEO RIEULMIEUM -0x8A70 0xB477 #HANGUL SYLLABLE TIKEUT WEO RIEULPIEUP -0x8A71 0xB478 #HANGUL SYLLABLE TIKEUT WEO RIEULSIOS -0x8A72 0xB479 #HANGUL SYLLABLE TIKEUT WEO RIEULTHIEUTH -0x8A73 0xB47A #HANGUL SYLLABLE TIKEUT WEO RIEULPHIEUPH -0x8A74 0xB47B #HANGUL SYLLABLE TIKEUT WEO RIEULHIEUH -0x8A75 0xB47C #HANGUL SYLLABLE TIKEUT WEO MIEUM -0x8A76 0xB47D #HANGUL SYLLABLE TIKEUT WEO PIEUP -0x8A77 0xB47E #HANGUL SYLLABLE TIKEUT WEO PIEUPSIOS -0x8A78 0xB47F #HANGUL SYLLABLE TIKEUT WEO SIOS -0x8A79 0xB481 #HANGUL SYLLABLE TIKEUT WEO IEUNG -0x8A7A 0xB482 #HANGUL SYLLABLE TIKEUT WEO CIEUC -0x8A81 0xB483 #HANGUL SYLLABLE TIKEUT WEO CHIEUCH -0x8A82 0xB484 #HANGUL SYLLABLE TIKEUT WEO KHIEUKH -0x8A83 0xB485 #HANGUL SYLLABLE TIKEUT WEO THIEUTH -0x8A84 0xB486 #HANGUL SYLLABLE TIKEUT WEO PHIEUPH -0x8A85 0xB487 #HANGUL SYLLABLE TIKEUT WEO HIEUH -0x8A86 0xB489 #HANGUL SYLLABLE TIKEUT WE KIYEOK -0x8A87 0xB48A #HANGUL SYLLABLE TIKEUT WE SSANGKIYEOK -0x8A88 0xB48B #HANGUL SYLLABLE TIKEUT WE KIYEOKSIOS -0x8A89 0xB48C #HANGUL SYLLABLE TIKEUT WE NIEUN -0x8A8A 0xB48D #HANGUL SYLLABLE TIKEUT WE NIEUNCIEUC -0x8A8B 0xB48E #HANGUL SYLLABLE TIKEUT WE NIEUNHIEUH -0x8A8C 0xB48F #HANGUL SYLLABLE TIKEUT WE TIKEUT -0x8A8D 0xB490 #HANGUL SYLLABLE TIKEUT WE RIEUL -0x8A8E 0xB491 #HANGUL SYLLABLE TIKEUT WE RIEULKIYEOK -0x8A8F 0xB492 #HANGUL SYLLABLE TIKEUT WE RIEULMIEUM -0x8A90 0xB493 #HANGUL SYLLABLE TIKEUT WE RIEULPIEUP -0x8A91 0xB494 #HANGUL SYLLABLE TIKEUT WE RIEULSIOS -0x8A92 0xB495 #HANGUL SYLLABLE TIKEUT WE RIEULTHIEUTH -0x8A93 0xB496 #HANGUL SYLLABLE TIKEUT WE RIEULPHIEUPH -0x8A94 0xB497 #HANGUL SYLLABLE TIKEUT WE RIEULHIEUH -0x8A95 0xB498 #HANGUL SYLLABLE TIKEUT WE MIEUM -0x8A96 0xB499 #HANGUL SYLLABLE TIKEUT WE PIEUP -0x8A97 0xB49A #HANGUL SYLLABLE TIKEUT WE PIEUPSIOS -0x8A98 0xB49B #HANGUL SYLLABLE TIKEUT WE SIOS -0x8A99 0xB49C #HANGUL SYLLABLE TIKEUT WE SSANGSIOS -0x8A9A 0xB49E #HANGUL SYLLABLE TIKEUT WE CIEUC -0x8A9B 0xB49F #HANGUL SYLLABLE TIKEUT WE CHIEUCH -0x8A9C 0xB4A0 #HANGUL SYLLABLE TIKEUT WE KHIEUKH -0x8A9D 0xB4A1 #HANGUL SYLLABLE TIKEUT WE THIEUTH -0x8A9E 0xB4A2 #HANGUL SYLLABLE TIKEUT WE PHIEUPH -0x8A9F 0xB4A3 #HANGUL SYLLABLE TIKEUT WE HIEUH -0x8AA0 0xB4A5 #HANGUL SYLLABLE TIKEUT WI KIYEOK -0x8AA1 0xB4A6 #HANGUL SYLLABLE TIKEUT WI SSANGKIYEOK -0x8AA2 0xB4A7 #HANGUL SYLLABLE TIKEUT WI KIYEOKSIOS -0x8AA3 0xB4A9 #HANGUL SYLLABLE TIKEUT WI NIEUNCIEUC -0x8AA4 0xB4AA #HANGUL SYLLABLE TIKEUT WI NIEUNHIEUH -0x8AA5 0xB4AB #HANGUL SYLLABLE TIKEUT WI TIKEUT -0x8AA6 0xB4AD #HANGUL SYLLABLE TIKEUT WI RIEULKIYEOK -0x8AA7 0xB4AE #HANGUL SYLLABLE TIKEUT WI RIEULMIEUM -0x8AA8 0xB4AF #HANGUL SYLLABLE TIKEUT WI RIEULPIEUP -0x8AA9 0xB4B0 #HANGUL SYLLABLE TIKEUT WI RIEULSIOS -0x8AAA 0xB4B1 #HANGUL SYLLABLE TIKEUT WI RIEULTHIEUTH -0x8AAB 0xB4B2 #HANGUL SYLLABLE TIKEUT WI RIEULPHIEUPH -0x8AAC 0xB4B3 #HANGUL SYLLABLE TIKEUT WI RIEULHIEUH -0x8AAD 0xB4B4 #HANGUL SYLLABLE TIKEUT WI MIEUM -0x8AAE 0xB4B6 #HANGUL SYLLABLE TIKEUT WI PIEUPSIOS -0x8AAF 0xB4B8 #HANGUL SYLLABLE TIKEUT WI SSANGSIOS -0x8AB0 0xB4BA #HANGUL SYLLABLE TIKEUT WI CIEUC -0x8AB1 0xB4BB #HANGUL SYLLABLE TIKEUT WI CHIEUCH -0x8AB2 0xB4BC #HANGUL SYLLABLE TIKEUT WI KHIEUKH -0x8AB3 0xB4BD #HANGUL SYLLABLE TIKEUT WI THIEUTH -0x8AB4 0xB4BE #HANGUL SYLLABLE TIKEUT WI PHIEUPH -0x8AB5 0xB4BF #HANGUL SYLLABLE TIKEUT WI HIEUH -0x8AB6 0xB4C1 #HANGUL SYLLABLE TIKEUT YU KIYEOK -0x8AB7 0xB4C2 #HANGUL SYLLABLE TIKEUT YU SSANGKIYEOK -0x8AB8 0xB4C3 #HANGUL SYLLABLE TIKEUT YU KIYEOKSIOS -0x8AB9 0xB4C5 #HANGUL SYLLABLE TIKEUT YU NIEUNCIEUC -0x8ABA 0xB4C6 #HANGUL SYLLABLE TIKEUT YU NIEUNHIEUH -0x8ABB 0xB4C7 #HANGUL SYLLABLE TIKEUT YU TIKEUT -0x8ABC 0xB4C9 #HANGUL SYLLABLE TIKEUT YU RIEULKIYEOK -0x8ABD 0xB4CA #HANGUL SYLLABLE TIKEUT YU RIEULMIEUM -0x8ABE 0xB4CB #HANGUL SYLLABLE TIKEUT YU RIEULPIEUP -0x8ABF 0xB4CC #HANGUL SYLLABLE TIKEUT YU RIEULSIOS -0x8AC0 0xB4CD #HANGUL SYLLABLE TIKEUT YU RIEULTHIEUTH -0x8AC1 0xB4CE #HANGUL SYLLABLE TIKEUT YU RIEULPHIEUPH -0x8AC2 0xB4CF #HANGUL SYLLABLE TIKEUT YU RIEULHIEUH -0x8AC3 0xB4D1 #HANGUL SYLLABLE TIKEUT YU PIEUP -0x8AC4 0xB4D2 #HANGUL SYLLABLE TIKEUT YU PIEUPSIOS -0x8AC5 0xB4D3 #HANGUL SYLLABLE TIKEUT YU SIOS -0x8AC6 0xB4D4 #HANGUL SYLLABLE TIKEUT YU SSANGSIOS -0x8AC7 0xB4D6 #HANGUL SYLLABLE TIKEUT YU CIEUC -0x8AC8 0xB4D7 #HANGUL SYLLABLE TIKEUT YU CHIEUCH -0x8AC9 0xB4D8 #HANGUL SYLLABLE TIKEUT YU KHIEUKH -0x8ACA 0xB4D9 #HANGUL SYLLABLE TIKEUT YU THIEUTH -0x8ACB 0xB4DA #HANGUL SYLLABLE TIKEUT YU PHIEUPH -0x8ACC 0xB4DB #HANGUL SYLLABLE TIKEUT YU HIEUH -0x8ACD 0xB4DE #HANGUL SYLLABLE TIKEUT EU SSANGKIYEOK -0x8ACE 0xB4DF #HANGUL SYLLABLE TIKEUT EU KIYEOKSIOS -0x8ACF 0xB4E1 #HANGUL SYLLABLE TIKEUT EU NIEUNCIEUC -0x8AD0 0xB4E2 #HANGUL SYLLABLE TIKEUT EU NIEUNHIEUH -0x8AD1 0xB4E5 #HANGUL SYLLABLE TIKEUT EU RIEULKIYEOK -0x8AD2 0xB4E7 #HANGUL SYLLABLE TIKEUT EU RIEULPIEUP -0x8AD3 0xB4E8 #HANGUL SYLLABLE TIKEUT EU RIEULSIOS -0x8AD4 0xB4E9 #HANGUL SYLLABLE TIKEUT EU RIEULTHIEUTH -0x8AD5 0xB4EA #HANGUL SYLLABLE TIKEUT EU RIEULPHIEUPH -0x8AD6 0xB4EB #HANGUL SYLLABLE TIKEUT EU RIEULHIEUH -0x8AD7 0xB4EE #HANGUL SYLLABLE TIKEUT EU PIEUPSIOS -0x8AD8 0xB4F0 #HANGUL SYLLABLE TIKEUT EU SSANGSIOS -0x8AD9 0xB4F2 #HANGUL SYLLABLE TIKEUT EU CIEUC -0x8ADA 0xB4F3 #HANGUL SYLLABLE TIKEUT EU CHIEUCH -0x8ADB 0xB4F4 #HANGUL SYLLABLE TIKEUT EU KHIEUKH -0x8ADC 0xB4F5 #HANGUL SYLLABLE TIKEUT EU THIEUTH -0x8ADD 0xB4F6 #HANGUL SYLLABLE TIKEUT EU PHIEUPH -0x8ADE 0xB4F7 #HANGUL SYLLABLE TIKEUT EU HIEUH -0x8ADF 0xB4F9 #HANGUL SYLLABLE TIKEUT YI KIYEOK -0x8AE0 0xB4FA #HANGUL SYLLABLE TIKEUT YI SSANGKIYEOK -0x8AE1 0xB4FB #HANGUL SYLLABLE TIKEUT YI KIYEOKSIOS -0x8AE2 0xB4FC #HANGUL SYLLABLE TIKEUT YI NIEUN -0x8AE3 0xB4FD #HANGUL SYLLABLE TIKEUT YI NIEUNCIEUC -0x8AE4 0xB4FE #HANGUL SYLLABLE TIKEUT YI NIEUNHIEUH -0x8AE5 0xB4FF #HANGUL SYLLABLE TIKEUT YI TIKEUT -0x8AE6 0xB500 #HANGUL SYLLABLE TIKEUT YI RIEUL -0x8AE7 0xB501 #HANGUL SYLLABLE TIKEUT YI RIEULKIYEOK -0x8AE8 0xB502 #HANGUL SYLLABLE TIKEUT YI RIEULMIEUM -0x8AE9 0xB503 #HANGUL SYLLABLE TIKEUT YI RIEULPIEUP -0x8AEA 0xB504 #HANGUL SYLLABLE TIKEUT YI RIEULSIOS -0x8AEB 0xB505 #HANGUL SYLLABLE TIKEUT YI RIEULTHIEUTH -0x8AEC 0xB506 #HANGUL SYLLABLE TIKEUT YI RIEULPHIEUPH -0x8AED 0xB507 #HANGUL SYLLABLE TIKEUT YI RIEULHIEUH -0x8AEE 0xB508 #HANGUL SYLLABLE TIKEUT YI MIEUM -0x8AEF 0xB509 #HANGUL SYLLABLE TIKEUT YI PIEUP -0x8AF0 0xB50A #HANGUL SYLLABLE TIKEUT YI PIEUPSIOS -0x8AF1 0xB50B #HANGUL SYLLABLE TIKEUT YI SIOS -0x8AF2 0xB50C #HANGUL SYLLABLE TIKEUT YI SSANGSIOS -0x8AF3 0xB50D #HANGUL SYLLABLE TIKEUT YI IEUNG -0x8AF4 0xB50E #HANGUL SYLLABLE TIKEUT YI CIEUC -0x8AF5 0xB50F #HANGUL SYLLABLE TIKEUT YI CHIEUCH -0x8AF6 0xB510 #HANGUL SYLLABLE TIKEUT YI KHIEUKH -0x8AF7 0xB511 #HANGUL SYLLABLE TIKEUT YI THIEUTH -0x8AF8 0xB512 #HANGUL SYLLABLE TIKEUT YI PHIEUPH -0x8AF9 0xB513 #HANGUL SYLLABLE TIKEUT YI HIEUH -0x8AFA 0xB516 #HANGUL SYLLABLE TIKEUT I SSANGKIYEOK -0x8AFB 0xB517 #HANGUL SYLLABLE TIKEUT I KIYEOKSIOS -0x8AFC 0xB519 #HANGUL SYLLABLE TIKEUT I NIEUNCIEUC -0x8AFD 0xB51A #HANGUL SYLLABLE TIKEUT I NIEUNHIEUH -0x8AFE 0xB51D #HANGUL SYLLABLE TIKEUT I RIEULKIYEOK -0x8B41 0xB51E #HANGUL SYLLABLE TIKEUT I RIEULMIEUM -0x8B42 0xB51F #HANGUL SYLLABLE TIKEUT I RIEULPIEUP -0x8B43 0xB520 #HANGUL SYLLABLE TIKEUT I RIEULSIOS -0x8B44 0xB521 #HANGUL SYLLABLE TIKEUT I RIEULTHIEUTH -0x8B45 0xB522 #HANGUL SYLLABLE TIKEUT I RIEULPHIEUPH -0x8B46 0xB523 #HANGUL SYLLABLE TIKEUT I RIEULHIEUH -0x8B47 0xB526 #HANGUL SYLLABLE TIKEUT I PIEUPSIOS -0x8B48 0xB52B #HANGUL SYLLABLE TIKEUT I CHIEUCH -0x8B49 0xB52C #HANGUL SYLLABLE TIKEUT I KHIEUKH -0x8B4A 0xB52D #HANGUL SYLLABLE TIKEUT I THIEUTH -0x8B4B 0xB52E #HANGUL SYLLABLE TIKEUT I PHIEUPH -0x8B4C 0xB52F #HANGUL SYLLABLE TIKEUT I HIEUH -0x8B4D 0xB532 #HANGUL SYLLABLE SSANGTIKEUT A SSANGKIYEOK -0x8B4E 0xB533 #HANGUL SYLLABLE SSANGTIKEUT A KIYEOKSIOS -0x8B4F 0xB535 #HANGUL SYLLABLE SSANGTIKEUT A NIEUNCIEUC -0x8B50 0xB536 #HANGUL SYLLABLE SSANGTIKEUT A NIEUNHIEUH -0x8B51 0xB537 #HANGUL SYLLABLE SSANGTIKEUT A TIKEUT -0x8B52 0xB539 #HANGUL SYLLABLE SSANGTIKEUT A RIEULKIYEOK -0x8B53 0xB53A #HANGUL SYLLABLE SSANGTIKEUT A RIEULMIEUM -0x8B54 0xB53B #HANGUL SYLLABLE SSANGTIKEUT A RIEULPIEUP -0x8B55 0xB53C #HANGUL SYLLABLE SSANGTIKEUT A RIEULSIOS -0x8B56 0xB53D #HANGUL SYLLABLE SSANGTIKEUT A RIEULTHIEUTH -0x8B57 0xB53E #HANGUL SYLLABLE SSANGTIKEUT A RIEULPHIEUPH -0x8B58 0xB53F #HANGUL SYLLABLE SSANGTIKEUT A RIEULHIEUH -0x8B59 0xB542 #HANGUL SYLLABLE SSANGTIKEUT A PIEUPSIOS -0x8B5A 0xB546 #HANGUL SYLLABLE SSANGTIKEUT A CIEUC -0x8B61 0xB547 #HANGUL SYLLABLE SSANGTIKEUT A CHIEUCH -0x8B62 0xB548 #HANGUL SYLLABLE SSANGTIKEUT A KHIEUKH -0x8B63 0xB549 #HANGUL SYLLABLE SSANGTIKEUT A THIEUTH -0x8B64 0xB54A #HANGUL SYLLABLE SSANGTIKEUT A PHIEUPH -0x8B65 0xB54E #HANGUL SYLLABLE SSANGTIKEUT AE SSANGKIYEOK -0x8B66 0xB54F #HANGUL SYLLABLE SSANGTIKEUT AE KIYEOKSIOS -0x8B67 0xB551 #HANGUL SYLLABLE SSANGTIKEUT AE NIEUNCIEUC -0x8B68 0xB552 #HANGUL SYLLABLE SSANGTIKEUT AE NIEUNHIEUH -0x8B69 0xB553 #HANGUL SYLLABLE SSANGTIKEUT AE TIKEUT -0x8B6A 0xB555 #HANGUL SYLLABLE SSANGTIKEUT AE RIEULKIYEOK -0x8B6B 0xB556 #HANGUL SYLLABLE SSANGTIKEUT AE RIEULMIEUM -0x8B6C 0xB557 #HANGUL SYLLABLE SSANGTIKEUT AE RIEULPIEUP -0x8B6D 0xB558 #HANGUL SYLLABLE SSANGTIKEUT AE RIEULSIOS -0x8B6E 0xB559 #HANGUL SYLLABLE SSANGTIKEUT AE RIEULTHIEUTH -0x8B6F 0xB55A #HANGUL SYLLABLE SSANGTIKEUT AE RIEULPHIEUPH -0x8B70 0xB55B #HANGUL SYLLABLE SSANGTIKEUT AE RIEULHIEUH -0x8B71 0xB55E #HANGUL SYLLABLE SSANGTIKEUT AE PIEUPSIOS -0x8B72 0xB562 #HANGUL SYLLABLE SSANGTIKEUT AE CIEUC -0x8B73 0xB563 #HANGUL SYLLABLE SSANGTIKEUT AE CHIEUCH -0x8B74 0xB564 #HANGUL SYLLABLE SSANGTIKEUT AE KHIEUKH -0x8B75 0xB565 #HANGUL SYLLABLE SSANGTIKEUT AE THIEUTH -0x8B76 0xB566 #HANGUL SYLLABLE SSANGTIKEUT AE PHIEUPH -0x8B77 0xB567 #HANGUL SYLLABLE SSANGTIKEUT AE HIEUH -0x8B78 0xB568 #HANGUL SYLLABLE SSANGTIKEUT YA -0x8B79 0xB569 #HANGUL SYLLABLE SSANGTIKEUT YA KIYEOK -0x8B7A 0xB56A #HANGUL SYLLABLE SSANGTIKEUT YA SSANGKIYEOK -0x8B81 0xB56B #HANGUL SYLLABLE SSANGTIKEUT YA KIYEOKSIOS -0x8B82 0xB56C #HANGUL SYLLABLE SSANGTIKEUT YA NIEUN -0x8B83 0xB56D #HANGUL SYLLABLE SSANGTIKEUT YA NIEUNCIEUC -0x8B84 0xB56E #HANGUL SYLLABLE SSANGTIKEUT YA NIEUNHIEUH -0x8B85 0xB56F #HANGUL SYLLABLE SSANGTIKEUT YA TIKEUT -0x8B86 0xB570 #HANGUL SYLLABLE SSANGTIKEUT YA RIEUL -0x8B87 0xB571 #HANGUL SYLLABLE SSANGTIKEUT YA RIEULKIYEOK -0x8B88 0xB572 #HANGUL SYLLABLE SSANGTIKEUT YA RIEULMIEUM -0x8B89 0xB573 #HANGUL SYLLABLE SSANGTIKEUT YA RIEULPIEUP -0x8B8A 0xB574 #HANGUL SYLLABLE SSANGTIKEUT YA RIEULSIOS -0x8B8B 0xB575 #HANGUL SYLLABLE SSANGTIKEUT YA RIEULTHIEUTH -0x8B8C 0xB576 #HANGUL SYLLABLE SSANGTIKEUT YA RIEULPHIEUPH -0x8B8D 0xB577 #HANGUL SYLLABLE SSANGTIKEUT YA RIEULHIEUH -0x8B8E 0xB578 #HANGUL SYLLABLE SSANGTIKEUT YA MIEUM -0x8B8F 0xB579 #HANGUL SYLLABLE SSANGTIKEUT YA PIEUP -0x8B90 0xB57A #HANGUL SYLLABLE SSANGTIKEUT YA PIEUPSIOS -0x8B91 0xB57B #HANGUL SYLLABLE SSANGTIKEUT YA SIOS -0x8B92 0xB57C #HANGUL SYLLABLE SSANGTIKEUT YA SSANGSIOS -0x8B93 0xB57D #HANGUL SYLLABLE SSANGTIKEUT YA IEUNG -0x8B94 0xB57E #HANGUL SYLLABLE SSANGTIKEUT YA CIEUC -0x8B95 0xB57F #HANGUL SYLLABLE SSANGTIKEUT YA CHIEUCH -0x8B96 0xB580 #HANGUL SYLLABLE SSANGTIKEUT YA KHIEUKH -0x8B97 0xB581 #HANGUL SYLLABLE SSANGTIKEUT YA THIEUTH -0x8B98 0xB582 #HANGUL SYLLABLE SSANGTIKEUT YA PHIEUPH -0x8B99 0xB583 #HANGUL SYLLABLE SSANGTIKEUT YA HIEUH -0x8B9A 0xB584 #HANGUL SYLLABLE SSANGTIKEUT YAE -0x8B9B 0xB585 #HANGUL SYLLABLE SSANGTIKEUT YAE KIYEOK -0x8B9C 0xB586 #HANGUL SYLLABLE SSANGTIKEUT YAE SSANGKIYEOK -0x8B9D 0xB587 #HANGUL SYLLABLE SSANGTIKEUT YAE KIYEOKSIOS -0x8B9E 0xB588 #HANGUL SYLLABLE SSANGTIKEUT YAE NIEUN -0x8B9F 0xB589 #HANGUL SYLLABLE SSANGTIKEUT YAE NIEUNCIEUC -0x8BA0 0xB58A #HANGUL SYLLABLE SSANGTIKEUT YAE NIEUNHIEUH -0x8BA1 0xB58B #HANGUL SYLLABLE SSANGTIKEUT YAE TIKEUT -0x8BA2 0xB58C #HANGUL SYLLABLE SSANGTIKEUT YAE RIEUL -0x8BA3 0xB58D #HANGUL SYLLABLE SSANGTIKEUT YAE RIEULKIYEOK -0x8BA4 0xB58E #HANGUL SYLLABLE SSANGTIKEUT YAE RIEULMIEUM -0x8BA5 0xB58F #HANGUL SYLLABLE SSANGTIKEUT YAE RIEULPIEUP -0x8BA6 0xB590 #HANGUL SYLLABLE SSANGTIKEUT YAE RIEULSIOS -0x8BA7 0xB591 #HANGUL SYLLABLE SSANGTIKEUT YAE RIEULTHIEUTH -0x8BA8 0xB592 #HANGUL SYLLABLE SSANGTIKEUT YAE RIEULPHIEUPH -0x8BA9 0xB593 #HANGUL SYLLABLE SSANGTIKEUT YAE RIEULHIEUH -0x8BAA 0xB594 #HANGUL SYLLABLE SSANGTIKEUT YAE MIEUM -0x8BAB 0xB595 #HANGUL SYLLABLE SSANGTIKEUT YAE PIEUP -0x8BAC 0xB596 #HANGUL SYLLABLE SSANGTIKEUT YAE PIEUPSIOS -0x8BAD 0xB597 #HANGUL SYLLABLE SSANGTIKEUT YAE SIOS -0x8BAE 0xB598 #HANGUL SYLLABLE SSANGTIKEUT YAE SSANGSIOS -0x8BAF 0xB599 #HANGUL SYLLABLE SSANGTIKEUT YAE IEUNG -0x8BB0 0xB59A #HANGUL SYLLABLE SSANGTIKEUT YAE CIEUC -0x8BB1 0xB59B #HANGUL SYLLABLE SSANGTIKEUT YAE CHIEUCH -0x8BB2 0xB59C #HANGUL SYLLABLE SSANGTIKEUT YAE KHIEUKH -0x8BB3 0xB59D #HANGUL SYLLABLE SSANGTIKEUT YAE THIEUTH -0x8BB4 0xB59E #HANGUL SYLLABLE SSANGTIKEUT YAE PHIEUPH -0x8BB5 0xB59F #HANGUL SYLLABLE SSANGTIKEUT YAE HIEUH -0x8BB6 0xB5A2 #HANGUL SYLLABLE SSANGTIKEUT EO SSANGKIYEOK -0x8BB7 0xB5A3 #HANGUL SYLLABLE SSANGTIKEUT EO KIYEOKSIOS -0x8BB8 0xB5A5 #HANGUL SYLLABLE SSANGTIKEUT EO NIEUNCIEUC -0x8BB9 0xB5A6 #HANGUL SYLLABLE SSANGTIKEUT EO NIEUNHIEUH -0x8BBA 0xB5A7 #HANGUL SYLLABLE SSANGTIKEUT EO TIKEUT -0x8BBB 0xB5A9 #HANGUL SYLLABLE SSANGTIKEUT EO RIEULKIYEOK -0x8BBC 0xB5AC #HANGUL SYLLABLE SSANGTIKEUT EO RIEULSIOS -0x8BBD 0xB5AD #HANGUL SYLLABLE SSANGTIKEUT EO RIEULTHIEUTH -0x8BBE 0xB5AE #HANGUL SYLLABLE SSANGTIKEUT EO RIEULPHIEUPH -0x8BBF 0xB5AF #HANGUL SYLLABLE SSANGTIKEUT EO RIEULHIEUH -0x8BC0 0xB5B2 #HANGUL SYLLABLE SSANGTIKEUT EO PIEUPSIOS -0x8BC1 0xB5B6 #HANGUL SYLLABLE SSANGTIKEUT EO CIEUC -0x8BC2 0xB5B7 #HANGUL SYLLABLE SSANGTIKEUT EO CHIEUCH -0x8BC3 0xB5B8 #HANGUL SYLLABLE SSANGTIKEUT EO KHIEUKH -0x8BC4 0xB5B9 #HANGUL SYLLABLE SSANGTIKEUT EO THIEUTH -0x8BC5 0xB5BA #HANGUL SYLLABLE SSANGTIKEUT EO PHIEUPH -0x8BC6 0xB5BE #HANGUL SYLLABLE SSANGTIKEUT E SSANGKIYEOK -0x8BC7 0xB5BF #HANGUL SYLLABLE SSANGTIKEUT E KIYEOKSIOS -0x8BC8 0xB5C1 #HANGUL SYLLABLE SSANGTIKEUT E NIEUNCIEUC -0x8BC9 0xB5C2 #HANGUL SYLLABLE SSANGTIKEUT E NIEUNHIEUH -0x8BCA 0xB5C3 #HANGUL SYLLABLE SSANGTIKEUT E TIKEUT -0x8BCB 0xB5C5 #HANGUL SYLLABLE SSANGTIKEUT E RIEULKIYEOK -0x8BCC 0xB5C6 #HANGUL SYLLABLE SSANGTIKEUT E RIEULMIEUM -0x8BCD 0xB5C7 #HANGUL SYLLABLE SSANGTIKEUT E RIEULPIEUP -0x8BCE 0xB5C8 #HANGUL SYLLABLE SSANGTIKEUT E RIEULSIOS -0x8BCF 0xB5C9 #HANGUL SYLLABLE SSANGTIKEUT E RIEULTHIEUTH -0x8BD0 0xB5CA #HANGUL SYLLABLE SSANGTIKEUT E RIEULPHIEUPH -0x8BD1 0xB5CB #HANGUL SYLLABLE SSANGTIKEUT E RIEULHIEUH -0x8BD2 0xB5CE #HANGUL SYLLABLE SSANGTIKEUT E PIEUPSIOS -0x8BD3 0xB5D2 #HANGUL SYLLABLE SSANGTIKEUT E CIEUC -0x8BD4 0xB5D3 #HANGUL SYLLABLE SSANGTIKEUT E CHIEUCH -0x8BD5 0xB5D4 #HANGUL SYLLABLE SSANGTIKEUT E KHIEUKH -0x8BD6 0xB5D5 #HANGUL SYLLABLE SSANGTIKEUT E THIEUTH -0x8BD7 0xB5D6 #HANGUL SYLLABLE SSANGTIKEUT E PHIEUPH -0x8BD8 0xB5D7 #HANGUL SYLLABLE SSANGTIKEUT E HIEUH -0x8BD9 0xB5D9 #HANGUL SYLLABLE SSANGTIKEUT YEO KIYEOK -0x8BDA 0xB5DA #HANGUL SYLLABLE SSANGTIKEUT YEO SSANGKIYEOK -0x8BDB 0xB5DB #HANGUL SYLLABLE SSANGTIKEUT YEO KIYEOKSIOS -0x8BDC 0xB5DC #HANGUL SYLLABLE SSANGTIKEUT YEO NIEUN -0x8BDD 0xB5DD #HANGUL SYLLABLE SSANGTIKEUT YEO NIEUNCIEUC -0x8BDE 0xB5DE #HANGUL SYLLABLE SSANGTIKEUT YEO NIEUNHIEUH -0x8BDF 0xB5DF #HANGUL SYLLABLE SSANGTIKEUT YEO TIKEUT -0x8BE0 0xB5E0 #HANGUL SYLLABLE SSANGTIKEUT YEO RIEUL -0x8BE1 0xB5E1 #HANGUL SYLLABLE SSANGTIKEUT YEO RIEULKIYEOK -0x8BE2 0xB5E2 #HANGUL SYLLABLE SSANGTIKEUT YEO RIEULMIEUM -0x8BE3 0xB5E3 #HANGUL SYLLABLE SSANGTIKEUT YEO RIEULPIEUP -0x8BE4 0xB5E4 #HANGUL SYLLABLE SSANGTIKEUT YEO RIEULSIOS -0x8BE5 0xB5E5 #HANGUL SYLLABLE SSANGTIKEUT YEO RIEULTHIEUTH -0x8BE6 0xB5E6 #HANGUL SYLLABLE SSANGTIKEUT YEO RIEULPHIEUPH -0x8BE7 0xB5E7 #HANGUL SYLLABLE SSANGTIKEUT YEO RIEULHIEUH -0x8BE8 0xB5E8 #HANGUL SYLLABLE SSANGTIKEUT YEO MIEUM -0x8BE9 0xB5E9 #HANGUL SYLLABLE SSANGTIKEUT YEO PIEUP -0x8BEA 0xB5EA #HANGUL SYLLABLE SSANGTIKEUT YEO PIEUPSIOS -0x8BEB 0xB5EB #HANGUL SYLLABLE SSANGTIKEUT YEO SIOS -0x8BEC 0xB5ED #HANGUL SYLLABLE SSANGTIKEUT YEO IEUNG -0x8BED 0xB5EE #HANGUL SYLLABLE SSANGTIKEUT YEO CIEUC -0x8BEE 0xB5EF #HANGUL SYLLABLE SSANGTIKEUT YEO CHIEUCH -0x8BEF 0xB5F0 #HANGUL SYLLABLE SSANGTIKEUT YEO KHIEUKH -0x8BF0 0xB5F1 #HANGUL SYLLABLE SSANGTIKEUT YEO THIEUTH -0x8BF1 0xB5F2 #HANGUL SYLLABLE SSANGTIKEUT YEO PHIEUPH -0x8BF2 0xB5F3 #HANGUL SYLLABLE SSANGTIKEUT YEO HIEUH -0x8BF3 0xB5F4 #HANGUL SYLLABLE SSANGTIKEUT YE -0x8BF4 0xB5F5 #HANGUL SYLLABLE SSANGTIKEUT YE KIYEOK -0x8BF5 0xB5F6 #HANGUL SYLLABLE SSANGTIKEUT YE SSANGKIYEOK -0x8BF6 0xB5F7 #HANGUL SYLLABLE SSANGTIKEUT YE KIYEOKSIOS -0x8BF7 0xB5F8 #HANGUL SYLLABLE SSANGTIKEUT YE NIEUN -0x8BF8 0xB5F9 #HANGUL SYLLABLE SSANGTIKEUT YE NIEUNCIEUC -0x8BF9 0xB5FA #HANGUL SYLLABLE SSANGTIKEUT YE NIEUNHIEUH -0x8BFA 0xB5FB #HANGUL SYLLABLE SSANGTIKEUT YE TIKEUT -0x8BFB 0xB5FC #HANGUL SYLLABLE SSANGTIKEUT YE RIEUL -0x8BFC 0xB5FD #HANGUL SYLLABLE SSANGTIKEUT YE RIEULKIYEOK -0x8BFD 0xB5FE #HANGUL SYLLABLE SSANGTIKEUT YE RIEULMIEUM -0x8BFE 0xB5FF #HANGUL SYLLABLE SSANGTIKEUT YE RIEULPIEUP -0x8C41 0xB600 #HANGUL SYLLABLE SSANGTIKEUT YE RIEULSIOS -0x8C42 0xB601 #HANGUL SYLLABLE SSANGTIKEUT YE RIEULTHIEUTH -0x8C43 0xB602 #HANGUL SYLLABLE SSANGTIKEUT YE RIEULPHIEUPH -0x8C44 0xB603 #HANGUL SYLLABLE SSANGTIKEUT YE RIEULHIEUH -0x8C45 0xB604 #HANGUL SYLLABLE SSANGTIKEUT YE MIEUM -0x8C46 0xB605 #HANGUL SYLLABLE SSANGTIKEUT YE PIEUP -0x8C47 0xB606 #HANGUL SYLLABLE SSANGTIKEUT YE PIEUPSIOS -0x8C48 0xB607 #HANGUL SYLLABLE SSANGTIKEUT YE SIOS -0x8C49 0xB608 #HANGUL SYLLABLE SSANGTIKEUT YE SSANGSIOS -0x8C4A 0xB609 #HANGUL SYLLABLE SSANGTIKEUT YE IEUNG -0x8C4B 0xB60A #HANGUL SYLLABLE SSANGTIKEUT YE CIEUC -0x8C4C 0xB60B #HANGUL SYLLABLE SSANGTIKEUT YE CHIEUCH -0x8C4D 0xB60C #HANGUL SYLLABLE SSANGTIKEUT YE KHIEUKH -0x8C4E 0xB60D #HANGUL SYLLABLE SSANGTIKEUT YE THIEUTH -0x8C4F 0xB60E #HANGUL SYLLABLE SSANGTIKEUT YE PHIEUPH -0x8C50 0xB60F #HANGUL SYLLABLE SSANGTIKEUT YE HIEUH -0x8C51 0xB612 #HANGUL SYLLABLE SSANGTIKEUT O SSANGKIYEOK -0x8C52 0xB613 #HANGUL SYLLABLE SSANGTIKEUT O KIYEOKSIOS -0x8C53 0xB615 #HANGUL SYLLABLE SSANGTIKEUT O NIEUNCIEUC -0x8C54 0xB616 #HANGUL SYLLABLE SSANGTIKEUT O NIEUNHIEUH -0x8C55 0xB617 #HANGUL SYLLABLE SSANGTIKEUT O TIKEUT -0x8C56 0xB619 #HANGUL SYLLABLE SSANGTIKEUT O RIEULKIYEOK -0x8C57 0xB61A #HANGUL SYLLABLE SSANGTIKEUT O RIEULMIEUM -0x8C58 0xB61B #HANGUL SYLLABLE SSANGTIKEUT O RIEULPIEUP -0x8C59 0xB61C #HANGUL SYLLABLE SSANGTIKEUT O RIEULSIOS -0x8C5A 0xB61D #HANGUL SYLLABLE SSANGTIKEUT O RIEULTHIEUTH -0x8C61 0xB61E #HANGUL SYLLABLE SSANGTIKEUT O RIEULPHIEUPH -0x8C62 0xB61F #HANGUL SYLLABLE SSANGTIKEUT O RIEULHIEUH -0x8C63 0xB620 #HANGUL SYLLABLE SSANGTIKEUT O MIEUM -0x8C64 0xB621 #HANGUL SYLLABLE SSANGTIKEUT O PIEUP -0x8C65 0xB622 #HANGUL SYLLABLE SSANGTIKEUT O PIEUPSIOS -0x8C66 0xB623 #HANGUL SYLLABLE SSANGTIKEUT O SIOS -0x8C67 0xB624 #HANGUL SYLLABLE SSANGTIKEUT O SSANGSIOS -0x8C68 0xB626 #HANGUL SYLLABLE SSANGTIKEUT O CIEUC -0x8C69 0xB627 #HANGUL SYLLABLE SSANGTIKEUT O CHIEUCH -0x8C6A 0xB628 #HANGUL SYLLABLE SSANGTIKEUT O KHIEUKH -0x8C6B 0xB629 #HANGUL SYLLABLE SSANGTIKEUT O THIEUTH -0x8C6C 0xB62A #HANGUL SYLLABLE SSANGTIKEUT O PHIEUPH -0x8C6D 0xB62B #HANGUL SYLLABLE SSANGTIKEUT O HIEUH -0x8C6E 0xB62D #HANGUL SYLLABLE SSANGTIKEUT WA KIYEOK -0x8C6F 0xB62E #HANGUL SYLLABLE SSANGTIKEUT WA SSANGKIYEOK -0x8C70 0xB62F #HANGUL SYLLABLE SSANGTIKEUT WA KIYEOKSIOS -0x8C71 0xB630 #HANGUL SYLLABLE SSANGTIKEUT WA NIEUN -0x8C72 0xB631 #HANGUL SYLLABLE SSANGTIKEUT WA NIEUNCIEUC -0x8C73 0xB632 #HANGUL SYLLABLE SSANGTIKEUT WA NIEUNHIEUH -0x8C74 0xB633 #HANGUL SYLLABLE SSANGTIKEUT WA TIKEUT -0x8C75 0xB635 #HANGUL SYLLABLE SSANGTIKEUT WA RIEULKIYEOK -0x8C76 0xB636 #HANGUL SYLLABLE SSANGTIKEUT WA RIEULMIEUM -0x8C77 0xB637 #HANGUL SYLLABLE SSANGTIKEUT WA RIEULPIEUP -0x8C78 0xB638 #HANGUL SYLLABLE SSANGTIKEUT WA RIEULSIOS -0x8C79 0xB639 #HANGUL SYLLABLE SSANGTIKEUT WA RIEULTHIEUTH -0x8C7A 0xB63A #HANGUL SYLLABLE SSANGTIKEUT WA RIEULPHIEUPH -0x8C81 0xB63B #HANGUL SYLLABLE SSANGTIKEUT WA RIEULHIEUH -0x8C82 0xB63C #HANGUL SYLLABLE SSANGTIKEUT WA MIEUM -0x8C83 0xB63D #HANGUL SYLLABLE SSANGTIKEUT WA PIEUP -0x8C84 0xB63E #HANGUL SYLLABLE SSANGTIKEUT WA PIEUPSIOS -0x8C85 0xB63F #HANGUL SYLLABLE SSANGTIKEUT WA SIOS -0x8C86 0xB640 #HANGUL SYLLABLE SSANGTIKEUT WA SSANGSIOS -0x8C87 0xB641 #HANGUL SYLLABLE SSANGTIKEUT WA IEUNG -0x8C88 0xB642 #HANGUL SYLLABLE SSANGTIKEUT WA CIEUC -0x8C89 0xB643 #HANGUL SYLLABLE SSANGTIKEUT WA CHIEUCH -0x8C8A 0xB644 #HANGUL SYLLABLE SSANGTIKEUT WA KHIEUKH -0x8C8B 0xB645 #HANGUL SYLLABLE SSANGTIKEUT WA THIEUTH -0x8C8C 0xB646 #HANGUL SYLLABLE SSANGTIKEUT WA PHIEUPH -0x8C8D 0xB647 #HANGUL SYLLABLE SSANGTIKEUT WA HIEUH -0x8C8E 0xB649 #HANGUL SYLLABLE SSANGTIKEUT WAE KIYEOK -0x8C8F 0xB64A #HANGUL SYLLABLE SSANGTIKEUT WAE SSANGKIYEOK -0x8C90 0xB64B #HANGUL SYLLABLE SSANGTIKEUT WAE KIYEOKSIOS -0x8C91 0xB64C #HANGUL SYLLABLE SSANGTIKEUT WAE NIEUN -0x8C92 0xB64D #HANGUL SYLLABLE SSANGTIKEUT WAE NIEUNCIEUC -0x8C93 0xB64E #HANGUL SYLLABLE SSANGTIKEUT WAE NIEUNHIEUH -0x8C94 0xB64F #HANGUL SYLLABLE SSANGTIKEUT WAE TIKEUT -0x8C95 0xB650 #HANGUL SYLLABLE SSANGTIKEUT WAE RIEUL -0x8C96 0xB651 #HANGUL SYLLABLE SSANGTIKEUT WAE RIEULKIYEOK -0x8C97 0xB652 #HANGUL SYLLABLE SSANGTIKEUT WAE RIEULMIEUM -0x8C98 0xB653 #HANGUL SYLLABLE SSANGTIKEUT WAE RIEULPIEUP -0x8C99 0xB654 #HANGUL SYLLABLE SSANGTIKEUT WAE RIEULSIOS -0x8C9A 0xB655 #HANGUL SYLLABLE SSANGTIKEUT WAE RIEULTHIEUTH -0x8C9B 0xB656 #HANGUL SYLLABLE SSANGTIKEUT WAE RIEULPHIEUPH -0x8C9C 0xB657 #HANGUL SYLLABLE SSANGTIKEUT WAE RIEULHIEUH -0x8C9D 0xB658 #HANGUL SYLLABLE SSANGTIKEUT WAE MIEUM -0x8C9E 0xB659 #HANGUL SYLLABLE SSANGTIKEUT WAE PIEUP -0x8C9F 0xB65A #HANGUL SYLLABLE SSANGTIKEUT WAE PIEUPSIOS -0x8CA0 0xB65B #HANGUL SYLLABLE SSANGTIKEUT WAE SIOS -0x8CA1 0xB65C #HANGUL SYLLABLE SSANGTIKEUT WAE SSANGSIOS -0x8CA2 0xB65D #HANGUL SYLLABLE SSANGTIKEUT WAE IEUNG -0x8CA3 0xB65E #HANGUL SYLLABLE SSANGTIKEUT WAE CIEUC -0x8CA4 0xB65F #HANGUL SYLLABLE SSANGTIKEUT WAE CHIEUCH -0x8CA5 0xB660 #HANGUL SYLLABLE SSANGTIKEUT WAE KHIEUKH -0x8CA6 0xB661 #HANGUL SYLLABLE SSANGTIKEUT WAE THIEUTH -0x8CA7 0xB662 #HANGUL SYLLABLE SSANGTIKEUT WAE PHIEUPH -0x8CA8 0xB663 #HANGUL SYLLABLE SSANGTIKEUT WAE HIEUH -0x8CA9 0xB665 #HANGUL SYLLABLE SSANGTIKEUT OE KIYEOK -0x8CAA 0xB666 #HANGUL SYLLABLE SSANGTIKEUT OE SSANGKIYEOK -0x8CAB 0xB667 #HANGUL SYLLABLE SSANGTIKEUT OE KIYEOKSIOS -0x8CAC 0xB669 #HANGUL SYLLABLE SSANGTIKEUT OE NIEUNCIEUC -0x8CAD 0xB66A #HANGUL SYLLABLE SSANGTIKEUT OE NIEUNHIEUH -0x8CAE 0xB66B #HANGUL SYLLABLE SSANGTIKEUT OE TIKEUT -0x8CAF 0xB66C #HANGUL SYLLABLE SSANGTIKEUT OE RIEUL -0x8CB0 0xB66D #HANGUL SYLLABLE SSANGTIKEUT OE RIEULKIYEOK -0x8CB1 0xB66E #HANGUL SYLLABLE SSANGTIKEUT OE RIEULMIEUM -0x8CB2 0xB66F #HANGUL SYLLABLE SSANGTIKEUT OE RIEULPIEUP -0x8CB3 0xB670 #HANGUL SYLLABLE SSANGTIKEUT OE RIEULSIOS -0x8CB4 0xB671 #HANGUL SYLLABLE SSANGTIKEUT OE RIEULTHIEUTH -0x8CB5 0xB672 #HANGUL SYLLABLE SSANGTIKEUT OE RIEULPHIEUPH -0x8CB6 0xB673 #HANGUL SYLLABLE SSANGTIKEUT OE RIEULHIEUH -0x8CB7 0xB674 #HANGUL SYLLABLE SSANGTIKEUT OE MIEUM -0x8CB8 0xB675 #HANGUL SYLLABLE SSANGTIKEUT OE PIEUP -0x8CB9 0xB676 #HANGUL SYLLABLE SSANGTIKEUT OE PIEUPSIOS -0x8CBA 0xB677 #HANGUL SYLLABLE SSANGTIKEUT OE SIOS -0x8CBB 0xB678 #HANGUL SYLLABLE SSANGTIKEUT OE SSANGSIOS -0x8CBC 0xB679 #HANGUL SYLLABLE SSANGTIKEUT OE IEUNG -0x8CBD 0xB67A #HANGUL SYLLABLE SSANGTIKEUT OE CIEUC -0x8CBE 0xB67B #HANGUL SYLLABLE SSANGTIKEUT OE CHIEUCH -0x8CBF 0xB67C #HANGUL SYLLABLE SSANGTIKEUT OE KHIEUKH -0x8CC0 0xB67D #HANGUL SYLLABLE SSANGTIKEUT OE THIEUTH -0x8CC1 0xB67E #HANGUL SYLLABLE SSANGTIKEUT OE PHIEUPH -0x8CC2 0xB67F #HANGUL SYLLABLE SSANGTIKEUT OE HIEUH -0x8CC3 0xB680 #HANGUL SYLLABLE SSANGTIKEUT YO -0x8CC4 0xB681 #HANGUL SYLLABLE SSANGTIKEUT YO KIYEOK -0x8CC5 0xB682 #HANGUL SYLLABLE SSANGTIKEUT YO SSANGKIYEOK -0x8CC6 0xB683 #HANGUL SYLLABLE SSANGTIKEUT YO KIYEOKSIOS -0x8CC7 0xB684 #HANGUL SYLLABLE SSANGTIKEUT YO NIEUN -0x8CC8 0xB685 #HANGUL SYLLABLE SSANGTIKEUT YO NIEUNCIEUC -0x8CC9 0xB686 #HANGUL SYLLABLE SSANGTIKEUT YO NIEUNHIEUH -0x8CCA 0xB687 #HANGUL SYLLABLE SSANGTIKEUT YO TIKEUT -0x8CCB 0xB688 #HANGUL SYLLABLE SSANGTIKEUT YO RIEUL -0x8CCC 0xB689 #HANGUL SYLLABLE SSANGTIKEUT YO RIEULKIYEOK -0x8CCD 0xB68A #HANGUL SYLLABLE SSANGTIKEUT YO RIEULMIEUM -0x8CCE 0xB68B #HANGUL SYLLABLE SSANGTIKEUT YO RIEULPIEUP -0x8CCF 0xB68C #HANGUL SYLLABLE SSANGTIKEUT YO RIEULSIOS -0x8CD0 0xB68D #HANGUL SYLLABLE SSANGTIKEUT YO RIEULTHIEUTH -0x8CD1 0xB68E #HANGUL SYLLABLE SSANGTIKEUT YO RIEULPHIEUPH -0x8CD2 0xB68F #HANGUL SYLLABLE SSANGTIKEUT YO RIEULHIEUH -0x8CD3 0xB690 #HANGUL SYLLABLE SSANGTIKEUT YO MIEUM -0x8CD4 0xB691 #HANGUL SYLLABLE SSANGTIKEUT YO PIEUP -0x8CD5 0xB692 #HANGUL SYLLABLE SSANGTIKEUT YO PIEUPSIOS -0x8CD6 0xB693 #HANGUL SYLLABLE SSANGTIKEUT YO SIOS -0x8CD7 0xB694 #HANGUL SYLLABLE SSANGTIKEUT YO SSANGSIOS -0x8CD8 0xB695 #HANGUL SYLLABLE SSANGTIKEUT YO IEUNG -0x8CD9 0xB696 #HANGUL SYLLABLE SSANGTIKEUT YO CIEUC -0x8CDA 0xB697 #HANGUL SYLLABLE SSANGTIKEUT YO CHIEUCH -0x8CDB 0xB698 #HANGUL SYLLABLE SSANGTIKEUT YO KHIEUKH -0x8CDC 0xB699 #HANGUL SYLLABLE SSANGTIKEUT YO THIEUTH -0x8CDD 0xB69A #HANGUL SYLLABLE SSANGTIKEUT YO PHIEUPH -0x8CDE 0xB69B #HANGUL SYLLABLE SSANGTIKEUT YO HIEUH -0x8CDF 0xB69E #HANGUL SYLLABLE SSANGTIKEUT U SSANGKIYEOK -0x8CE0 0xB69F #HANGUL SYLLABLE SSANGTIKEUT U KIYEOKSIOS -0x8CE1 0xB6A1 #HANGUL SYLLABLE SSANGTIKEUT U NIEUNCIEUC -0x8CE2 0xB6A2 #HANGUL SYLLABLE SSANGTIKEUT U NIEUNHIEUH -0x8CE3 0xB6A3 #HANGUL SYLLABLE SSANGTIKEUT U TIKEUT -0x8CE4 0xB6A5 #HANGUL SYLLABLE SSANGTIKEUT U RIEULKIYEOK -0x8CE5 0xB6A6 #HANGUL SYLLABLE SSANGTIKEUT U RIEULMIEUM -0x8CE6 0xB6A7 #HANGUL SYLLABLE SSANGTIKEUT U RIEULPIEUP -0x8CE7 0xB6A8 #HANGUL SYLLABLE SSANGTIKEUT U RIEULSIOS -0x8CE8 0xB6A9 #HANGUL SYLLABLE SSANGTIKEUT U RIEULTHIEUTH -0x8CE9 0xB6AA #HANGUL SYLLABLE SSANGTIKEUT U RIEULPHIEUPH -0x8CEA 0xB6AD #HANGUL SYLLABLE SSANGTIKEUT U PIEUP -0x8CEB 0xB6AE #HANGUL SYLLABLE SSANGTIKEUT U PIEUPSIOS -0x8CEC 0xB6AF #HANGUL SYLLABLE SSANGTIKEUT U SIOS -0x8CED 0xB6B0 #HANGUL SYLLABLE SSANGTIKEUT U SSANGSIOS -0x8CEE 0xB6B2 #HANGUL SYLLABLE SSANGTIKEUT U CIEUC -0x8CEF 0xB6B3 #HANGUL SYLLABLE SSANGTIKEUT U CHIEUCH -0x8CF0 0xB6B4 #HANGUL SYLLABLE SSANGTIKEUT U KHIEUKH -0x8CF1 0xB6B5 #HANGUL SYLLABLE SSANGTIKEUT U THIEUTH -0x8CF2 0xB6B6 #HANGUL SYLLABLE SSANGTIKEUT U PHIEUPH -0x8CF3 0xB6B7 #HANGUL SYLLABLE SSANGTIKEUT U HIEUH -0x8CF4 0xB6B8 #HANGUL SYLLABLE SSANGTIKEUT WEO -0x8CF5 0xB6B9 #HANGUL SYLLABLE SSANGTIKEUT WEO KIYEOK -0x8CF6 0xB6BA #HANGUL SYLLABLE SSANGTIKEUT WEO SSANGKIYEOK -0x8CF7 0xB6BB #HANGUL SYLLABLE SSANGTIKEUT WEO KIYEOKSIOS -0x8CF8 0xB6BC #HANGUL SYLLABLE SSANGTIKEUT WEO NIEUN -0x8CF9 0xB6BD #HANGUL SYLLABLE SSANGTIKEUT WEO NIEUNCIEUC -0x8CFA 0xB6BE #HANGUL SYLLABLE SSANGTIKEUT WEO NIEUNHIEUH -0x8CFB 0xB6BF #HANGUL SYLLABLE SSANGTIKEUT WEO TIKEUT -0x8CFC 0xB6C0 #HANGUL SYLLABLE SSANGTIKEUT WEO RIEUL -0x8CFD 0xB6C1 #HANGUL SYLLABLE SSANGTIKEUT WEO RIEULKIYEOK -0x8CFE 0xB6C2 #HANGUL SYLLABLE SSANGTIKEUT WEO RIEULMIEUM -0x8D41 0xB6C3 #HANGUL SYLLABLE SSANGTIKEUT WEO RIEULPIEUP -0x8D42 0xB6C4 #HANGUL SYLLABLE SSANGTIKEUT WEO RIEULSIOS -0x8D43 0xB6C5 #HANGUL SYLLABLE SSANGTIKEUT WEO RIEULTHIEUTH -0x8D44 0xB6C6 #HANGUL SYLLABLE SSANGTIKEUT WEO RIEULPHIEUPH -0x8D45 0xB6C7 #HANGUL SYLLABLE SSANGTIKEUT WEO RIEULHIEUH -0x8D46 0xB6C8 #HANGUL SYLLABLE SSANGTIKEUT WEO MIEUM -0x8D47 0xB6C9 #HANGUL SYLLABLE SSANGTIKEUT WEO PIEUP -0x8D48 0xB6CA #HANGUL SYLLABLE SSANGTIKEUT WEO PIEUPSIOS -0x8D49 0xB6CB #HANGUL SYLLABLE SSANGTIKEUT WEO SIOS -0x8D4A 0xB6CC #HANGUL SYLLABLE SSANGTIKEUT WEO SSANGSIOS -0x8D4B 0xB6CD #HANGUL SYLLABLE SSANGTIKEUT WEO IEUNG -0x8D4C 0xB6CE #HANGUL SYLLABLE SSANGTIKEUT WEO CIEUC -0x8D4D 0xB6CF #HANGUL SYLLABLE SSANGTIKEUT WEO CHIEUCH -0x8D4E 0xB6D0 #HANGUL SYLLABLE SSANGTIKEUT WEO KHIEUKH -0x8D4F 0xB6D1 #HANGUL SYLLABLE SSANGTIKEUT WEO THIEUTH -0x8D50 0xB6D2 #HANGUL SYLLABLE SSANGTIKEUT WEO PHIEUPH -0x8D51 0xB6D3 #HANGUL SYLLABLE SSANGTIKEUT WEO HIEUH -0x8D52 0xB6D5 #HANGUL SYLLABLE SSANGTIKEUT WE KIYEOK -0x8D53 0xB6D6 #HANGUL SYLLABLE SSANGTIKEUT WE SSANGKIYEOK -0x8D54 0xB6D7 #HANGUL SYLLABLE SSANGTIKEUT WE KIYEOKSIOS -0x8D55 0xB6D8 #HANGUL SYLLABLE SSANGTIKEUT WE NIEUN -0x8D56 0xB6D9 #HANGUL SYLLABLE SSANGTIKEUT WE NIEUNCIEUC -0x8D57 0xB6DA #HANGUL SYLLABLE SSANGTIKEUT WE NIEUNHIEUH -0x8D58 0xB6DB #HANGUL SYLLABLE SSANGTIKEUT WE TIKEUT -0x8D59 0xB6DC #HANGUL SYLLABLE SSANGTIKEUT WE RIEUL -0x8D5A 0xB6DD #HANGUL SYLLABLE SSANGTIKEUT WE RIEULKIYEOK -0x8D61 0xB6DE #HANGUL SYLLABLE SSANGTIKEUT WE RIEULMIEUM -0x8D62 0xB6DF #HANGUL SYLLABLE SSANGTIKEUT WE RIEULPIEUP -0x8D63 0xB6E0 #HANGUL SYLLABLE SSANGTIKEUT WE RIEULSIOS -0x8D64 0xB6E1 #HANGUL SYLLABLE SSANGTIKEUT WE RIEULTHIEUTH -0x8D65 0xB6E2 #HANGUL SYLLABLE SSANGTIKEUT WE RIEULPHIEUPH -0x8D66 0xB6E3 #HANGUL SYLLABLE SSANGTIKEUT WE RIEULHIEUH -0x8D67 0xB6E4 #HANGUL SYLLABLE SSANGTIKEUT WE MIEUM -0x8D68 0xB6E5 #HANGUL SYLLABLE SSANGTIKEUT WE PIEUP -0x8D69 0xB6E6 #HANGUL SYLLABLE SSANGTIKEUT WE PIEUPSIOS -0x8D6A 0xB6E7 #HANGUL SYLLABLE SSANGTIKEUT WE SIOS -0x8D6B 0xB6E8 #HANGUL SYLLABLE SSANGTIKEUT WE SSANGSIOS -0x8D6C 0xB6E9 #HANGUL SYLLABLE SSANGTIKEUT WE IEUNG -0x8D6D 0xB6EA #HANGUL SYLLABLE SSANGTIKEUT WE CIEUC -0x8D6E 0xB6EB #HANGUL SYLLABLE SSANGTIKEUT WE CHIEUCH -0x8D6F 0xB6EC #HANGUL SYLLABLE SSANGTIKEUT WE KHIEUKH -0x8D70 0xB6ED #HANGUL SYLLABLE SSANGTIKEUT WE THIEUTH -0x8D71 0xB6EE #HANGUL SYLLABLE SSANGTIKEUT WE PHIEUPH -0x8D72 0xB6EF #HANGUL SYLLABLE SSANGTIKEUT WE HIEUH -0x8D73 0xB6F1 #HANGUL SYLLABLE SSANGTIKEUT WI KIYEOK -0x8D74 0xB6F2 #HANGUL SYLLABLE SSANGTIKEUT WI SSANGKIYEOK -0x8D75 0xB6F3 #HANGUL SYLLABLE SSANGTIKEUT WI KIYEOKSIOS -0x8D76 0xB6F5 #HANGUL SYLLABLE SSANGTIKEUT WI NIEUNCIEUC -0x8D77 0xB6F6 #HANGUL SYLLABLE SSANGTIKEUT WI NIEUNHIEUH -0x8D78 0xB6F7 #HANGUL SYLLABLE SSANGTIKEUT WI TIKEUT -0x8D79 0xB6F9 #HANGUL SYLLABLE SSANGTIKEUT WI RIEULKIYEOK -0x8D7A 0xB6FA #HANGUL SYLLABLE SSANGTIKEUT WI RIEULMIEUM -0x8D81 0xB6FB #HANGUL SYLLABLE SSANGTIKEUT WI RIEULPIEUP -0x8D82 0xB6FC #HANGUL SYLLABLE SSANGTIKEUT WI RIEULSIOS -0x8D83 0xB6FD #HANGUL SYLLABLE SSANGTIKEUT WI RIEULTHIEUTH -0x8D84 0xB6FE #HANGUL SYLLABLE SSANGTIKEUT WI RIEULPHIEUPH -0x8D85 0xB6FF #HANGUL SYLLABLE SSANGTIKEUT WI RIEULHIEUH -0x8D86 0xB702 #HANGUL SYLLABLE SSANGTIKEUT WI PIEUPSIOS -0x8D87 0xB703 #HANGUL SYLLABLE SSANGTIKEUT WI SIOS -0x8D88 0xB704 #HANGUL SYLLABLE SSANGTIKEUT WI SSANGSIOS -0x8D89 0xB706 #HANGUL SYLLABLE SSANGTIKEUT WI CIEUC -0x8D8A 0xB707 #HANGUL SYLLABLE SSANGTIKEUT WI CHIEUCH -0x8D8B 0xB708 #HANGUL SYLLABLE SSANGTIKEUT WI KHIEUKH -0x8D8C 0xB709 #HANGUL SYLLABLE SSANGTIKEUT WI THIEUTH -0x8D8D 0xB70A #HANGUL SYLLABLE SSANGTIKEUT WI PHIEUPH -0x8D8E 0xB70B #HANGUL SYLLABLE SSANGTIKEUT WI HIEUH -0x8D8F 0xB70C #HANGUL SYLLABLE SSANGTIKEUT YU -0x8D90 0xB70D #HANGUL SYLLABLE SSANGTIKEUT YU KIYEOK -0x8D91 0xB70E #HANGUL SYLLABLE SSANGTIKEUT YU SSANGKIYEOK -0x8D92 0xB70F #HANGUL SYLLABLE SSANGTIKEUT YU KIYEOKSIOS -0x8D93 0xB710 #HANGUL SYLLABLE SSANGTIKEUT YU NIEUN -0x8D94 0xB711 #HANGUL SYLLABLE SSANGTIKEUT YU NIEUNCIEUC -0x8D95 0xB712 #HANGUL SYLLABLE SSANGTIKEUT YU NIEUNHIEUH -0x8D96 0xB713 #HANGUL SYLLABLE SSANGTIKEUT YU TIKEUT -0x8D97 0xB714 #HANGUL SYLLABLE SSANGTIKEUT YU RIEUL -0x8D98 0xB715 #HANGUL SYLLABLE SSANGTIKEUT YU RIEULKIYEOK -0x8D99 0xB716 #HANGUL SYLLABLE SSANGTIKEUT YU RIEULMIEUM -0x8D9A 0xB717 #HANGUL SYLLABLE SSANGTIKEUT YU RIEULPIEUP -0x8D9B 0xB718 #HANGUL SYLLABLE SSANGTIKEUT YU RIEULSIOS -0x8D9C 0xB719 #HANGUL SYLLABLE SSANGTIKEUT YU RIEULTHIEUTH -0x8D9D 0xB71A #HANGUL SYLLABLE SSANGTIKEUT YU RIEULPHIEUPH -0x8D9E 0xB71B #HANGUL SYLLABLE SSANGTIKEUT YU RIEULHIEUH -0x8D9F 0xB71C #HANGUL SYLLABLE SSANGTIKEUT YU MIEUM -0x8DA0 0xB71D #HANGUL SYLLABLE SSANGTIKEUT YU PIEUP -0x8DA1 0xB71E #HANGUL SYLLABLE SSANGTIKEUT YU PIEUPSIOS -0x8DA2 0xB71F #HANGUL SYLLABLE SSANGTIKEUT YU SIOS -0x8DA3 0xB720 #HANGUL SYLLABLE SSANGTIKEUT YU SSANGSIOS -0x8DA4 0xB721 #HANGUL SYLLABLE SSANGTIKEUT YU IEUNG -0x8DA5 0xB722 #HANGUL SYLLABLE SSANGTIKEUT YU CIEUC -0x8DA6 0xB723 #HANGUL SYLLABLE SSANGTIKEUT YU CHIEUCH -0x8DA7 0xB724 #HANGUL SYLLABLE SSANGTIKEUT YU KHIEUKH -0x8DA8 0xB725 #HANGUL SYLLABLE SSANGTIKEUT YU THIEUTH -0x8DA9 0xB726 #HANGUL SYLLABLE SSANGTIKEUT YU PHIEUPH -0x8DAA 0xB727 #HANGUL SYLLABLE SSANGTIKEUT YU HIEUH -0x8DAB 0xB72A #HANGUL SYLLABLE SSANGTIKEUT EU SSANGKIYEOK -0x8DAC 0xB72B #HANGUL SYLLABLE SSANGTIKEUT EU KIYEOKSIOS -0x8DAD 0xB72D #HANGUL SYLLABLE SSANGTIKEUT EU NIEUNCIEUC -0x8DAE 0xB72E #HANGUL SYLLABLE SSANGTIKEUT EU NIEUNHIEUH -0x8DAF 0xB731 #HANGUL SYLLABLE SSANGTIKEUT EU RIEULKIYEOK -0x8DB0 0xB732 #HANGUL SYLLABLE SSANGTIKEUT EU RIEULMIEUM -0x8DB1 0xB733 #HANGUL SYLLABLE SSANGTIKEUT EU RIEULPIEUP -0x8DB2 0xB734 #HANGUL SYLLABLE SSANGTIKEUT EU RIEULSIOS -0x8DB3 0xB735 #HANGUL SYLLABLE SSANGTIKEUT EU RIEULTHIEUTH -0x8DB4 0xB736 #HANGUL SYLLABLE SSANGTIKEUT EU RIEULPHIEUPH -0x8DB5 0xB737 #HANGUL SYLLABLE SSANGTIKEUT EU RIEULHIEUH -0x8DB6 0xB73A #HANGUL SYLLABLE SSANGTIKEUT EU PIEUPSIOS -0x8DB7 0xB73C #HANGUL SYLLABLE SSANGTIKEUT EU SSANGSIOS -0x8DB8 0xB73D #HANGUL SYLLABLE SSANGTIKEUT EU IEUNG -0x8DB9 0xB73E #HANGUL SYLLABLE SSANGTIKEUT EU CIEUC -0x8DBA 0xB73F #HANGUL SYLLABLE SSANGTIKEUT EU CHIEUCH -0x8DBB 0xB740 #HANGUL SYLLABLE SSANGTIKEUT EU KHIEUKH -0x8DBC 0xB741 #HANGUL SYLLABLE SSANGTIKEUT EU THIEUTH -0x8DBD 0xB742 #HANGUL SYLLABLE SSANGTIKEUT EU PHIEUPH -0x8DBE 0xB743 #HANGUL SYLLABLE SSANGTIKEUT EU HIEUH -0x8DBF 0xB745 #HANGUL SYLLABLE SSANGTIKEUT YI KIYEOK -0x8DC0 0xB746 #HANGUL SYLLABLE SSANGTIKEUT YI SSANGKIYEOK -0x8DC1 0xB747 #HANGUL SYLLABLE SSANGTIKEUT YI KIYEOKSIOS -0x8DC2 0xB749 #HANGUL SYLLABLE SSANGTIKEUT YI NIEUNCIEUC -0x8DC3 0xB74A #HANGUL SYLLABLE SSANGTIKEUT YI NIEUNHIEUH -0x8DC4 0xB74B #HANGUL SYLLABLE SSANGTIKEUT YI TIKEUT -0x8DC5 0xB74D #HANGUL SYLLABLE SSANGTIKEUT YI RIEULKIYEOK -0x8DC6 0xB74E #HANGUL SYLLABLE SSANGTIKEUT YI RIEULMIEUM -0x8DC7 0xB74F #HANGUL SYLLABLE SSANGTIKEUT YI RIEULPIEUP -0x8DC8 0xB750 #HANGUL SYLLABLE SSANGTIKEUT YI RIEULSIOS -0x8DC9 0xB751 #HANGUL SYLLABLE SSANGTIKEUT YI RIEULTHIEUTH -0x8DCA 0xB752 #HANGUL SYLLABLE SSANGTIKEUT YI RIEULPHIEUPH -0x8DCB 0xB753 #HANGUL SYLLABLE SSANGTIKEUT YI RIEULHIEUH -0x8DCC 0xB756 #HANGUL SYLLABLE SSANGTIKEUT YI PIEUPSIOS -0x8DCD 0xB757 #HANGUL SYLLABLE SSANGTIKEUT YI SIOS -0x8DCE 0xB758 #HANGUL SYLLABLE SSANGTIKEUT YI SSANGSIOS -0x8DCF 0xB759 #HANGUL SYLLABLE SSANGTIKEUT YI IEUNG -0x8DD0 0xB75A #HANGUL SYLLABLE SSANGTIKEUT YI CIEUC -0x8DD1 0xB75B #HANGUL SYLLABLE SSANGTIKEUT YI CHIEUCH -0x8DD2 0xB75C #HANGUL SYLLABLE SSANGTIKEUT YI KHIEUKH -0x8DD3 0xB75D #HANGUL SYLLABLE SSANGTIKEUT YI THIEUTH -0x8DD4 0xB75E #HANGUL SYLLABLE SSANGTIKEUT YI PHIEUPH -0x8DD5 0xB75F #HANGUL SYLLABLE SSANGTIKEUT YI HIEUH -0x8DD6 0xB761 #HANGUL SYLLABLE SSANGTIKEUT I KIYEOK -0x8DD7 0xB762 #HANGUL SYLLABLE SSANGTIKEUT I SSANGKIYEOK -0x8DD8 0xB763 #HANGUL SYLLABLE SSANGTIKEUT I KIYEOKSIOS -0x8DD9 0xB765 #HANGUL SYLLABLE SSANGTIKEUT I NIEUNCIEUC -0x8DDA 0xB766 #HANGUL SYLLABLE SSANGTIKEUT I NIEUNHIEUH -0x8DDB 0xB767 #HANGUL SYLLABLE SSANGTIKEUT I TIKEUT -0x8DDC 0xB769 #HANGUL SYLLABLE SSANGTIKEUT I RIEULKIYEOK -0x8DDD 0xB76A #HANGUL SYLLABLE SSANGTIKEUT I RIEULMIEUM -0x8DDE 0xB76B #HANGUL SYLLABLE SSANGTIKEUT I RIEULPIEUP -0x8DDF 0xB76C #HANGUL SYLLABLE SSANGTIKEUT I RIEULSIOS -0x8DE0 0xB76D #HANGUL SYLLABLE SSANGTIKEUT I RIEULTHIEUTH -0x8DE1 0xB76E #HANGUL SYLLABLE SSANGTIKEUT I RIEULPHIEUPH -0x8DE2 0xB76F #HANGUL SYLLABLE SSANGTIKEUT I RIEULHIEUH -0x8DE3 0xB772 #HANGUL SYLLABLE SSANGTIKEUT I PIEUPSIOS -0x8DE4 0xB774 #HANGUL SYLLABLE SSANGTIKEUT I SSANGSIOS -0x8DE5 0xB776 #HANGUL SYLLABLE SSANGTIKEUT I CIEUC -0x8DE6 0xB777 #HANGUL SYLLABLE SSANGTIKEUT I CHIEUCH -0x8DE7 0xB778 #HANGUL SYLLABLE SSANGTIKEUT I KHIEUKH -0x8DE8 0xB779 #HANGUL SYLLABLE SSANGTIKEUT I THIEUTH -0x8DE9 0xB77A #HANGUL SYLLABLE SSANGTIKEUT I PHIEUPH -0x8DEA 0xB77B #HANGUL SYLLABLE SSANGTIKEUT I HIEUH -0x8DEB 0xB77E #HANGUL SYLLABLE RIEUL A SSANGKIYEOK -0x8DEC 0xB77F #HANGUL SYLLABLE RIEUL A KIYEOKSIOS -0x8DED 0xB781 #HANGUL SYLLABLE RIEUL A NIEUNCIEUC -0x8DEE 0xB782 #HANGUL SYLLABLE RIEUL A NIEUNHIEUH -0x8DEF 0xB783 #HANGUL SYLLABLE RIEUL A TIKEUT -0x8DF0 0xB785 #HANGUL SYLLABLE RIEUL A RIEULKIYEOK -0x8DF1 0xB786 #HANGUL SYLLABLE RIEUL A RIEULMIEUM -0x8DF2 0xB787 #HANGUL SYLLABLE RIEUL A RIEULPIEUP -0x8DF3 0xB788 #HANGUL SYLLABLE RIEUL A RIEULSIOS -0x8DF4 0xB789 #HANGUL SYLLABLE RIEUL A RIEULTHIEUTH -0x8DF5 0xB78A #HANGUL SYLLABLE RIEUL A RIEULPHIEUPH -0x8DF6 0xB78B #HANGUL SYLLABLE RIEUL A RIEULHIEUH -0x8DF7 0xB78E #HANGUL SYLLABLE RIEUL A PIEUPSIOS -0x8DF8 0xB793 #HANGUL SYLLABLE RIEUL A CHIEUCH -0x8DF9 0xB794 #HANGUL SYLLABLE RIEUL A KHIEUKH -0x8DFA 0xB795 #HANGUL SYLLABLE RIEUL A THIEUTH -0x8DFB 0xB79A #HANGUL SYLLABLE RIEUL AE SSANGKIYEOK -0x8DFC 0xB79B #HANGUL SYLLABLE RIEUL AE KIYEOKSIOS -0x8DFD 0xB79D #HANGUL SYLLABLE RIEUL AE NIEUNCIEUC -0x8DFE 0xB79E #HANGUL SYLLABLE RIEUL AE NIEUNHIEUH -0x8E41 0xB79F #HANGUL SYLLABLE RIEUL AE TIKEUT -0x8E42 0xB7A1 #HANGUL SYLLABLE RIEUL AE RIEULKIYEOK -0x8E43 0xB7A2 #HANGUL SYLLABLE RIEUL AE RIEULMIEUM -0x8E44 0xB7A3 #HANGUL SYLLABLE RIEUL AE RIEULPIEUP -0x8E45 0xB7A4 #HANGUL SYLLABLE RIEUL AE RIEULSIOS -0x8E46 0xB7A5 #HANGUL SYLLABLE RIEUL AE RIEULTHIEUTH -0x8E47 0xB7A6 #HANGUL SYLLABLE RIEUL AE RIEULPHIEUPH -0x8E48 0xB7A7 #HANGUL SYLLABLE RIEUL AE RIEULHIEUH -0x8E49 0xB7AA #HANGUL SYLLABLE RIEUL AE PIEUPSIOS -0x8E4A 0xB7AE #HANGUL SYLLABLE RIEUL AE CIEUC -0x8E4B 0xB7AF #HANGUL SYLLABLE RIEUL AE CHIEUCH -0x8E4C 0xB7B0 #HANGUL SYLLABLE RIEUL AE KHIEUKH -0x8E4D 0xB7B1 #HANGUL SYLLABLE RIEUL AE THIEUTH -0x8E4E 0xB7B2 #HANGUL SYLLABLE RIEUL AE PHIEUPH -0x8E4F 0xB7B3 #HANGUL SYLLABLE RIEUL AE HIEUH -0x8E50 0xB7B6 #HANGUL SYLLABLE RIEUL YA SSANGKIYEOK -0x8E51 0xB7B7 #HANGUL SYLLABLE RIEUL YA KIYEOKSIOS -0x8E52 0xB7B9 #HANGUL SYLLABLE RIEUL YA NIEUNCIEUC -0x8E53 0xB7BA #HANGUL SYLLABLE RIEUL YA NIEUNHIEUH -0x8E54 0xB7BB #HANGUL SYLLABLE RIEUL YA TIKEUT -0x8E55 0xB7BC #HANGUL SYLLABLE RIEUL YA RIEUL -0x8E56 0xB7BD #HANGUL SYLLABLE RIEUL YA RIEULKIYEOK -0x8E57 0xB7BE #HANGUL SYLLABLE RIEUL YA RIEULMIEUM -0x8E58 0xB7BF #HANGUL SYLLABLE RIEUL YA RIEULPIEUP -0x8E59 0xB7C0 #HANGUL SYLLABLE RIEUL YA RIEULSIOS -0x8E5A 0xB7C1 #HANGUL SYLLABLE RIEUL YA RIEULTHIEUTH -0x8E61 0xB7C2 #HANGUL SYLLABLE RIEUL YA RIEULPHIEUPH -0x8E62 0xB7C3 #HANGUL SYLLABLE RIEUL YA RIEULHIEUH -0x8E63 0xB7C4 #HANGUL SYLLABLE RIEUL YA MIEUM -0x8E64 0xB7C5 #HANGUL SYLLABLE RIEUL YA PIEUP -0x8E65 0xB7C6 #HANGUL SYLLABLE RIEUL YA PIEUPSIOS -0x8E66 0xB7C8 #HANGUL SYLLABLE RIEUL YA SSANGSIOS -0x8E67 0xB7CA #HANGUL SYLLABLE RIEUL YA CIEUC -0x8E68 0xB7CB #HANGUL SYLLABLE RIEUL YA CHIEUCH -0x8E69 0xB7CC #HANGUL SYLLABLE RIEUL YA KHIEUKH -0x8E6A 0xB7CD #HANGUL SYLLABLE RIEUL YA THIEUTH -0x8E6B 0xB7CE #HANGUL SYLLABLE RIEUL YA PHIEUPH -0x8E6C 0xB7CF #HANGUL SYLLABLE RIEUL YA HIEUH -0x8E6D 0xB7D0 #HANGUL SYLLABLE RIEUL YAE -0x8E6E 0xB7D1 #HANGUL SYLLABLE RIEUL YAE KIYEOK -0x8E6F 0xB7D2 #HANGUL SYLLABLE RIEUL YAE SSANGKIYEOK -0x8E70 0xB7D3 #HANGUL SYLLABLE RIEUL YAE KIYEOKSIOS -0x8E71 0xB7D4 #HANGUL SYLLABLE RIEUL YAE NIEUN -0x8E72 0xB7D5 #HANGUL SYLLABLE RIEUL YAE NIEUNCIEUC -0x8E73 0xB7D6 #HANGUL SYLLABLE RIEUL YAE NIEUNHIEUH -0x8E74 0xB7D7 #HANGUL SYLLABLE RIEUL YAE TIKEUT -0x8E75 0xB7D8 #HANGUL SYLLABLE RIEUL YAE RIEUL -0x8E76 0xB7D9 #HANGUL SYLLABLE RIEUL YAE RIEULKIYEOK -0x8E77 0xB7DA #HANGUL SYLLABLE RIEUL YAE RIEULMIEUM -0x8E78 0xB7DB #HANGUL SYLLABLE RIEUL YAE RIEULPIEUP -0x8E79 0xB7DC #HANGUL SYLLABLE RIEUL YAE RIEULSIOS -0x8E7A 0xB7DD #HANGUL SYLLABLE RIEUL YAE RIEULTHIEUTH -0x8E81 0xB7DE #HANGUL SYLLABLE RIEUL YAE RIEULPHIEUPH -0x8E82 0xB7DF #HANGUL SYLLABLE RIEUL YAE RIEULHIEUH -0x8E83 0xB7E0 #HANGUL SYLLABLE RIEUL YAE MIEUM -0x8E84 0xB7E1 #HANGUL SYLLABLE RIEUL YAE PIEUP -0x8E85 0xB7E2 #HANGUL SYLLABLE RIEUL YAE PIEUPSIOS -0x8E86 0xB7E3 #HANGUL SYLLABLE RIEUL YAE SIOS -0x8E87 0xB7E4 #HANGUL SYLLABLE RIEUL YAE SSANGSIOS -0x8E88 0xB7E5 #HANGUL SYLLABLE RIEUL YAE IEUNG -0x8E89 0xB7E6 #HANGUL SYLLABLE RIEUL YAE CIEUC -0x8E8A 0xB7E7 #HANGUL SYLLABLE RIEUL YAE CHIEUCH -0x8E8B 0xB7E8 #HANGUL SYLLABLE RIEUL YAE KHIEUKH -0x8E8C 0xB7E9 #HANGUL SYLLABLE RIEUL YAE THIEUTH -0x8E8D 0xB7EA #HANGUL SYLLABLE RIEUL YAE PHIEUPH -0x8E8E 0xB7EB #HANGUL SYLLABLE RIEUL YAE HIEUH -0x8E8F 0xB7EE #HANGUL SYLLABLE RIEUL EO SSANGKIYEOK -0x8E90 0xB7EF #HANGUL SYLLABLE RIEUL EO KIYEOKSIOS -0x8E91 0xB7F1 #HANGUL SYLLABLE RIEUL EO NIEUNCIEUC -0x8E92 0xB7F2 #HANGUL SYLLABLE RIEUL EO NIEUNHIEUH -0x8E93 0xB7F3 #HANGUL SYLLABLE RIEUL EO TIKEUT -0x8E94 0xB7F5 #HANGUL SYLLABLE RIEUL EO RIEULKIYEOK -0x8E95 0xB7F6 #HANGUL SYLLABLE RIEUL EO RIEULMIEUM -0x8E96 0xB7F7 #HANGUL SYLLABLE RIEUL EO RIEULPIEUP -0x8E97 0xB7F8 #HANGUL SYLLABLE RIEUL EO RIEULSIOS -0x8E98 0xB7F9 #HANGUL SYLLABLE RIEUL EO RIEULTHIEUTH -0x8E99 0xB7FA #HANGUL SYLLABLE RIEUL EO RIEULPHIEUPH -0x8E9A 0xB7FB #HANGUL SYLLABLE RIEUL EO RIEULHIEUH -0x8E9B 0xB7FE #HANGUL SYLLABLE RIEUL EO PIEUPSIOS -0x8E9C 0xB802 #HANGUL SYLLABLE RIEUL EO CIEUC -0x8E9D 0xB803 #HANGUL SYLLABLE RIEUL EO CHIEUCH -0x8E9E 0xB804 #HANGUL SYLLABLE RIEUL EO KHIEUKH -0x8E9F 0xB805 #HANGUL SYLLABLE RIEUL EO THIEUTH -0x8EA0 0xB806 #HANGUL SYLLABLE RIEUL EO PHIEUPH -0x8EA1 0xB80A #HANGUL SYLLABLE RIEUL E SSANGKIYEOK -0x8EA2 0xB80B #HANGUL SYLLABLE RIEUL E KIYEOKSIOS -0x8EA3 0xB80D #HANGUL SYLLABLE RIEUL E NIEUNCIEUC -0x8EA4 0xB80E #HANGUL SYLLABLE RIEUL E NIEUNHIEUH -0x8EA5 0xB80F #HANGUL SYLLABLE RIEUL E TIKEUT -0x8EA6 0xB811 #HANGUL SYLLABLE RIEUL E RIEULKIYEOK -0x8EA7 0xB812 #HANGUL SYLLABLE RIEUL E RIEULMIEUM -0x8EA8 0xB813 #HANGUL SYLLABLE RIEUL E RIEULPIEUP -0x8EA9 0xB814 #HANGUL SYLLABLE RIEUL E RIEULSIOS -0x8EAA 0xB815 #HANGUL SYLLABLE RIEUL E RIEULTHIEUTH -0x8EAB 0xB816 #HANGUL SYLLABLE RIEUL E RIEULPHIEUPH -0x8EAC 0xB817 #HANGUL SYLLABLE RIEUL E RIEULHIEUH -0x8EAD 0xB81A #HANGUL SYLLABLE RIEUL E PIEUPSIOS -0x8EAE 0xB81C #HANGUL SYLLABLE RIEUL E SSANGSIOS -0x8EAF 0xB81E #HANGUL SYLLABLE RIEUL E CIEUC -0x8EB0 0xB81F #HANGUL SYLLABLE RIEUL E CHIEUCH -0x8EB1 0xB820 #HANGUL SYLLABLE RIEUL E KHIEUKH -0x8EB2 0xB821 #HANGUL SYLLABLE RIEUL E THIEUTH -0x8EB3 0xB822 #HANGUL SYLLABLE RIEUL E PHIEUPH -0x8EB4 0xB823 #HANGUL SYLLABLE RIEUL E HIEUH -0x8EB5 0xB826 #HANGUL SYLLABLE RIEUL YEO SSANGKIYEOK -0x8EB6 0xB827 #HANGUL SYLLABLE RIEUL YEO KIYEOKSIOS -0x8EB7 0xB829 #HANGUL SYLLABLE RIEUL YEO NIEUNCIEUC -0x8EB8 0xB82A #HANGUL SYLLABLE RIEUL YEO NIEUNHIEUH -0x8EB9 0xB82B #HANGUL SYLLABLE RIEUL YEO TIKEUT -0x8EBA 0xB82D #HANGUL SYLLABLE RIEUL YEO RIEULKIYEOK -0x8EBB 0xB82E #HANGUL SYLLABLE RIEUL YEO RIEULMIEUM -0x8EBC 0xB82F #HANGUL SYLLABLE RIEUL YEO RIEULPIEUP -0x8EBD 0xB830 #HANGUL SYLLABLE RIEUL YEO RIEULSIOS -0x8EBE 0xB831 #HANGUL SYLLABLE RIEUL YEO RIEULTHIEUTH -0x8EBF 0xB832 #HANGUL SYLLABLE RIEUL YEO RIEULPHIEUPH -0x8EC0 0xB833 #HANGUL SYLLABLE RIEUL YEO RIEULHIEUH -0x8EC1 0xB836 #HANGUL SYLLABLE RIEUL YEO PIEUPSIOS -0x8EC2 0xB83A #HANGUL SYLLABLE RIEUL YEO CIEUC -0x8EC3 0xB83B #HANGUL SYLLABLE RIEUL YEO CHIEUCH -0x8EC4 0xB83C #HANGUL SYLLABLE RIEUL YEO KHIEUKH -0x8EC5 0xB83D #HANGUL SYLLABLE RIEUL YEO THIEUTH -0x8EC6 0xB83E #HANGUL SYLLABLE RIEUL YEO PHIEUPH -0x8EC7 0xB83F #HANGUL SYLLABLE RIEUL YEO HIEUH -0x8EC8 0xB841 #HANGUL SYLLABLE RIEUL YE KIYEOK -0x8EC9 0xB842 #HANGUL SYLLABLE RIEUL YE SSANGKIYEOK -0x8ECA 0xB843 #HANGUL SYLLABLE RIEUL YE KIYEOKSIOS -0x8ECB 0xB845 #HANGUL SYLLABLE RIEUL YE NIEUNCIEUC -0x8ECC 0xB846 #HANGUL SYLLABLE RIEUL YE NIEUNHIEUH -0x8ECD 0xB847 #HANGUL SYLLABLE RIEUL YE TIKEUT -0x8ECE 0xB848 #HANGUL SYLLABLE RIEUL YE RIEUL -0x8ECF 0xB849 #HANGUL SYLLABLE RIEUL YE RIEULKIYEOK -0x8ED0 0xB84A #HANGUL SYLLABLE RIEUL YE RIEULMIEUM -0x8ED1 0xB84B #HANGUL SYLLABLE RIEUL YE RIEULPIEUP -0x8ED2 0xB84C #HANGUL SYLLABLE RIEUL YE RIEULSIOS -0x8ED3 0xB84D #HANGUL SYLLABLE RIEUL YE RIEULTHIEUTH -0x8ED4 0xB84E #HANGUL SYLLABLE RIEUL YE RIEULPHIEUPH -0x8ED5 0xB84F #HANGUL SYLLABLE RIEUL YE RIEULHIEUH -0x8ED6 0xB850 #HANGUL SYLLABLE RIEUL YE MIEUM -0x8ED7 0xB852 #HANGUL SYLLABLE RIEUL YE PIEUPSIOS -0x8ED8 0xB854 #HANGUL SYLLABLE RIEUL YE SSANGSIOS -0x8ED9 0xB855 #HANGUL SYLLABLE RIEUL YE IEUNG -0x8EDA 0xB856 #HANGUL SYLLABLE RIEUL YE CIEUC -0x8EDB 0xB857 #HANGUL SYLLABLE RIEUL YE CHIEUCH -0x8EDC 0xB858 #HANGUL SYLLABLE RIEUL YE KHIEUKH -0x8EDD 0xB859 #HANGUL SYLLABLE RIEUL YE THIEUTH -0x8EDE 0xB85A #HANGUL SYLLABLE RIEUL YE PHIEUPH -0x8EDF 0xB85B #HANGUL SYLLABLE RIEUL YE HIEUH -0x8EE0 0xB85E #HANGUL SYLLABLE RIEUL O SSANGKIYEOK -0x8EE1 0xB85F #HANGUL SYLLABLE RIEUL O KIYEOKSIOS -0x8EE2 0xB861 #HANGUL SYLLABLE RIEUL O NIEUNCIEUC -0x8EE3 0xB862 #HANGUL SYLLABLE RIEUL O NIEUNHIEUH -0x8EE4 0xB863 #HANGUL SYLLABLE RIEUL O TIKEUT -0x8EE5 0xB865 #HANGUL SYLLABLE RIEUL O RIEULKIYEOK -0x8EE6 0xB866 #HANGUL SYLLABLE RIEUL O RIEULMIEUM -0x8EE7 0xB867 #HANGUL SYLLABLE RIEUL O RIEULPIEUP -0x8EE8 0xB868 #HANGUL SYLLABLE RIEUL O RIEULSIOS -0x8EE9 0xB869 #HANGUL SYLLABLE RIEUL O RIEULTHIEUTH -0x8EEA 0xB86A #HANGUL SYLLABLE RIEUL O RIEULPHIEUPH -0x8EEB 0xB86B #HANGUL SYLLABLE RIEUL O RIEULHIEUH -0x8EEC 0xB86E #HANGUL SYLLABLE RIEUL O PIEUPSIOS -0x8EED 0xB870 #HANGUL SYLLABLE RIEUL O SSANGSIOS -0x8EEE 0xB872 #HANGUL SYLLABLE RIEUL O CIEUC -0x8EEF 0xB873 #HANGUL SYLLABLE RIEUL O CHIEUCH -0x8EF0 0xB874 #HANGUL SYLLABLE RIEUL O KHIEUKH -0x8EF1 0xB875 #HANGUL SYLLABLE RIEUL O THIEUTH -0x8EF2 0xB876 #HANGUL SYLLABLE RIEUL O PHIEUPH -0x8EF3 0xB877 #HANGUL SYLLABLE RIEUL O HIEUH -0x8EF4 0xB879 #HANGUL SYLLABLE RIEUL WA KIYEOK -0x8EF5 0xB87A #HANGUL SYLLABLE RIEUL WA SSANGKIYEOK -0x8EF6 0xB87B #HANGUL SYLLABLE RIEUL WA KIYEOKSIOS -0x8EF7 0xB87D #HANGUL SYLLABLE RIEUL WA NIEUNCIEUC -0x8EF8 0xB87E #HANGUL SYLLABLE RIEUL WA NIEUNHIEUH -0x8EF9 0xB87F #HANGUL SYLLABLE RIEUL WA TIKEUT -0x8EFA 0xB880 #HANGUL SYLLABLE RIEUL WA RIEUL -0x8EFB 0xB881 #HANGUL SYLLABLE RIEUL WA RIEULKIYEOK -0x8EFC 0xB882 #HANGUL SYLLABLE RIEUL WA RIEULMIEUM -0x8EFD 0xB883 #HANGUL SYLLABLE RIEUL WA RIEULPIEUP -0x8EFE 0xB884 #HANGUL SYLLABLE RIEUL WA RIEULSIOS -0x8F41 0xB885 #HANGUL SYLLABLE RIEUL WA RIEULTHIEUTH -0x8F42 0xB886 #HANGUL SYLLABLE RIEUL WA RIEULPHIEUPH -0x8F43 0xB887 #HANGUL SYLLABLE RIEUL WA RIEULHIEUH -0x8F44 0xB888 #HANGUL SYLLABLE RIEUL WA MIEUM -0x8F45 0xB889 #HANGUL SYLLABLE RIEUL WA PIEUP -0x8F46 0xB88A #HANGUL SYLLABLE RIEUL WA PIEUPSIOS -0x8F47 0xB88B #HANGUL SYLLABLE RIEUL WA SIOS -0x8F48 0xB88C #HANGUL SYLLABLE RIEUL WA SSANGSIOS -0x8F49 0xB88E #HANGUL SYLLABLE RIEUL WA CIEUC -0x8F4A 0xB88F #HANGUL SYLLABLE RIEUL WA CHIEUCH -0x8F4B 0xB890 #HANGUL SYLLABLE RIEUL WA KHIEUKH -0x8F4C 0xB891 #HANGUL SYLLABLE RIEUL WA THIEUTH -0x8F4D 0xB892 #HANGUL SYLLABLE RIEUL WA PHIEUPH -0x8F4E 0xB893 #HANGUL SYLLABLE RIEUL WA HIEUH -0x8F4F 0xB894 #HANGUL SYLLABLE RIEUL WAE -0x8F50 0xB895 #HANGUL SYLLABLE RIEUL WAE KIYEOK -0x8F51 0xB896 #HANGUL SYLLABLE RIEUL WAE SSANGKIYEOK -0x8F52 0xB897 #HANGUL SYLLABLE RIEUL WAE KIYEOKSIOS -0x8F53 0xB898 #HANGUL SYLLABLE RIEUL WAE NIEUN -0x8F54 0xB899 #HANGUL SYLLABLE RIEUL WAE NIEUNCIEUC -0x8F55 0xB89A #HANGUL SYLLABLE RIEUL WAE NIEUNHIEUH -0x8F56 0xB89B #HANGUL SYLLABLE RIEUL WAE TIKEUT -0x8F57 0xB89C #HANGUL SYLLABLE RIEUL WAE RIEUL -0x8F58 0xB89D #HANGUL SYLLABLE RIEUL WAE RIEULKIYEOK -0x8F59 0xB89E #HANGUL SYLLABLE RIEUL WAE RIEULMIEUM -0x8F5A 0xB89F #HANGUL SYLLABLE RIEUL WAE RIEULPIEUP -0x8F61 0xB8A0 #HANGUL SYLLABLE RIEUL WAE RIEULSIOS -0x8F62 0xB8A1 #HANGUL SYLLABLE RIEUL WAE RIEULTHIEUTH -0x8F63 0xB8A2 #HANGUL SYLLABLE RIEUL WAE RIEULPHIEUPH -0x8F64 0xB8A3 #HANGUL SYLLABLE RIEUL WAE RIEULHIEUH -0x8F65 0xB8A4 #HANGUL SYLLABLE RIEUL WAE MIEUM -0x8F66 0xB8A5 #HANGUL SYLLABLE RIEUL WAE PIEUP -0x8F67 0xB8A6 #HANGUL SYLLABLE RIEUL WAE PIEUPSIOS -0x8F68 0xB8A7 #HANGUL SYLLABLE RIEUL WAE SIOS -0x8F69 0xB8A9 #HANGUL SYLLABLE RIEUL WAE IEUNG -0x8F6A 0xB8AA #HANGUL SYLLABLE RIEUL WAE CIEUC -0x8F6B 0xB8AB #HANGUL SYLLABLE RIEUL WAE CHIEUCH -0x8F6C 0xB8AC #HANGUL SYLLABLE RIEUL WAE KHIEUKH -0x8F6D 0xB8AD #HANGUL SYLLABLE RIEUL WAE THIEUTH -0x8F6E 0xB8AE #HANGUL SYLLABLE RIEUL WAE PHIEUPH -0x8F6F 0xB8AF #HANGUL SYLLABLE RIEUL WAE HIEUH -0x8F70 0xB8B1 #HANGUL SYLLABLE RIEUL OE KIYEOK -0x8F71 0xB8B2 #HANGUL SYLLABLE RIEUL OE SSANGKIYEOK -0x8F72 0xB8B3 #HANGUL SYLLABLE RIEUL OE KIYEOKSIOS -0x8F73 0xB8B5 #HANGUL SYLLABLE RIEUL OE NIEUNCIEUC -0x8F74 0xB8B6 #HANGUL SYLLABLE RIEUL OE NIEUNHIEUH -0x8F75 0xB8B7 #HANGUL SYLLABLE RIEUL OE TIKEUT -0x8F76 0xB8B9 #HANGUL SYLLABLE RIEUL OE RIEULKIYEOK -0x8F77 0xB8BA #HANGUL SYLLABLE RIEUL OE RIEULMIEUM -0x8F78 0xB8BB #HANGUL SYLLABLE RIEUL OE RIEULPIEUP -0x8F79 0xB8BC #HANGUL SYLLABLE RIEUL OE RIEULSIOS -0x8F7A 0xB8BD #HANGUL SYLLABLE RIEUL OE RIEULTHIEUTH -0x8F81 0xB8BE #HANGUL SYLLABLE RIEUL OE RIEULPHIEUPH -0x8F82 0xB8BF #HANGUL SYLLABLE RIEUL OE RIEULHIEUH -0x8F83 0xB8C2 #HANGUL SYLLABLE RIEUL OE PIEUPSIOS -0x8F84 0xB8C4 #HANGUL SYLLABLE RIEUL OE SSANGSIOS -0x8F85 0xB8C6 #HANGUL SYLLABLE RIEUL OE CIEUC -0x8F86 0xB8C7 #HANGUL SYLLABLE RIEUL OE CHIEUCH -0x8F87 0xB8C8 #HANGUL SYLLABLE RIEUL OE KHIEUKH -0x8F88 0xB8C9 #HANGUL SYLLABLE RIEUL OE THIEUTH -0x8F89 0xB8CA #HANGUL SYLLABLE RIEUL OE PHIEUPH -0x8F8A 0xB8CB #HANGUL SYLLABLE RIEUL OE HIEUH -0x8F8B 0xB8CD #HANGUL SYLLABLE RIEUL YO KIYEOK -0x8F8C 0xB8CE #HANGUL SYLLABLE RIEUL YO SSANGKIYEOK -0x8F8D 0xB8CF #HANGUL SYLLABLE RIEUL YO KIYEOKSIOS -0x8F8E 0xB8D1 #HANGUL SYLLABLE RIEUL YO NIEUNCIEUC -0x8F8F 0xB8D2 #HANGUL SYLLABLE RIEUL YO NIEUNHIEUH -0x8F90 0xB8D3 #HANGUL SYLLABLE RIEUL YO TIKEUT -0x8F91 0xB8D5 #HANGUL SYLLABLE RIEUL YO RIEULKIYEOK -0x8F92 0xB8D6 #HANGUL SYLLABLE RIEUL YO RIEULMIEUM -0x8F93 0xB8D7 #HANGUL SYLLABLE RIEUL YO RIEULPIEUP -0x8F94 0xB8D8 #HANGUL SYLLABLE RIEUL YO RIEULSIOS -0x8F95 0xB8D9 #HANGUL SYLLABLE RIEUL YO RIEULTHIEUTH -0x8F96 0xB8DA #HANGUL SYLLABLE RIEUL YO RIEULPHIEUPH -0x8F97 0xB8DB #HANGUL SYLLABLE RIEUL YO RIEULHIEUH -0x8F98 0xB8DC #HANGUL SYLLABLE RIEUL YO MIEUM -0x8F99 0xB8DE #HANGUL SYLLABLE RIEUL YO PIEUPSIOS -0x8F9A 0xB8E0 #HANGUL SYLLABLE RIEUL YO SSANGSIOS -0x8F9B 0xB8E2 #HANGUL SYLLABLE RIEUL YO CIEUC -0x8F9C 0xB8E3 #HANGUL SYLLABLE RIEUL YO CHIEUCH -0x8F9D 0xB8E4 #HANGUL SYLLABLE RIEUL YO KHIEUKH -0x8F9E 0xB8E5 #HANGUL SYLLABLE RIEUL YO THIEUTH -0x8F9F 0xB8E6 #HANGUL SYLLABLE RIEUL YO PHIEUPH -0x8FA0 0xB8E7 #HANGUL SYLLABLE RIEUL YO HIEUH -0x8FA1 0xB8EA #HANGUL SYLLABLE RIEUL U SSANGKIYEOK -0x8FA2 0xB8EB #HANGUL SYLLABLE RIEUL U KIYEOKSIOS -0x8FA3 0xB8ED #HANGUL SYLLABLE RIEUL U NIEUNCIEUC -0x8FA4 0xB8EE #HANGUL SYLLABLE RIEUL U NIEUNHIEUH -0x8FA5 0xB8EF #HANGUL SYLLABLE RIEUL U TIKEUT -0x8FA6 0xB8F1 #HANGUL SYLLABLE RIEUL U RIEULKIYEOK -0x8FA7 0xB8F2 #HANGUL SYLLABLE RIEUL U RIEULMIEUM -0x8FA8 0xB8F3 #HANGUL SYLLABLE RIEUL U RIEULPIEUP -0x8FA9 0xB8F4 #HANGUL SYLLABLE RIEUL U RIEULSIOS -0x8FAA 0xB8F5 #HANGUL SYLLABLE RIEUL U RIEULTHIEUTH -0x8FAB 0xB8F6 #HANGUL SYLLABLE RIEUL U RIEULPHIEUPH -0x8FAC 0xB8F7 #HANGUL SYLLABLE RIEUL U RIEULHIEUH -0x8FAD 0xB8FA #HANGUL SYLLABLE RIEUL U PIEUPSIOS -0x8FAE 0xB8FC #HANGUL SYLLABLE RIEUL U SSANGSIOS -0x8FAF 0xB8FE #HANGUL SYLLABLE RIEUL U CIEUC -0x8FB0 0xB8FF #HANGUL SYLLABLE RIEUL U CHIEUCH -0x8FB1 0xB900 #HANGUL SYLLABLE RIEUL U KHIEUKH -0x8FB2 0xB901 #HANGUL SYLLABLE RIEUL U THIEUTH -0x8FB3 0xB902 #HANGUL SYLLABLE RIEUL U PHIEUPH -0x8FB4 0xB903 #HANGUL SYLLABLE RIEUL U HIEUH -0x8FB5 0xB905 #HANGUL SYLLABLE RIEUL WEO KIYEOK -0x8FB6 0xB906 #HANGUL SYLLABLE RIEUL WEO SSANGKIYEOK -0x8FB7 0xB907 #HANGUL SYLLABLE RIEUL WEO KIYEOKSIOS -0x8FB8 0xB908 #HANGUL SYLLABLE RIEUL WEO NIEUN -0x8FB9 0xB909 #HANGUL SYLLABLE RIEUL WEO NIEUNCIEUC -0x8FBA 0xB90A #HANGUL SYLLABLE RIEUL WEO NIEUNHIEUH -0x8FBB 0xB90B #HANGUL SYLLABLE RIEUL WEO TIKEUT -0x8FBC 0xB90C #HANGUL SYLLABLE RIEUL WEO RIEUL -0x8FBD 0xB90D #HANGUL SYLLABLE RIEUL WEO RIEULKIYEOK -0x8FBE 0xB90E #HANGUL SYLLABLE RIEUL WEO RIEULMIEUM -0x8FBF 0xB90F #HANGUL SYLLABLE RIEUL WEO RIEULPIEUP -0x8FC0 0xB910 #HANGUL SYLLABLE RIEUL WEO RIEULSIOS -0x8FC1 0xB911 #HANGUL SYLLABLE RIEUL WEO RIEULTHIEUTH -0x8FC2 0xB912 #HANGUL SYLLABLE RIEUL WEO RIEULPHIEUPH -0x8FC3 0xB913 #HANGUL SYLLABLE RIEUL WEO RIEULHIEUH -0x8FC4 0xB914 #HANGUL SYLLABLE RIEUL WEO MIEUM -0x8FC5 0xB915 #HANGUL SYLLABLE RIEUL WEO PIEUP -0x8FC6 0xB916 #HANGUL SYLLABLE RIEUL WEO PIEUPSIOS -0x8FC7 0xB917 #HANGUL SYLLABLE RIEUL WEO SIOS -0x8FC8 0xB919 #HANGUL SYLLABLE RIEUL WEO IEUNG -0x8FC9 0xB91A #HANGUL SYLLABLE RIEUL WEO CIEUC -0x8FCA 0xB91B #HANGUL SYLLABLE RIEUL WEO CHIEUCH -0x8FCB 0xB91C #HANGUL SYLLABLE RIEUL WEO KHIEUKH -0x8FCC 0xB91D #HANGUL SYLLABLE RIEUL WEO THIEUTH -0x8FCD 0xB91E #HANGUL SYLLABLE RIEUL WEO PHIEUPH -0x8FCE 0xB91F #HANGUL SYLLABLE RIEUL WEO HIEUH -0x8FCF 0xB921 #HANGUL SYLLABLE RIEUL WE KIYEOK -0x8FD0 0xB922 #HANGUL SYLLABLE RIEUL WE SSANGKIYEOK -0x8FD1 0xB923 #HANGUL SYLLABLE RIEUL WE KIYEOKSIOS -0x8FD2 0xB924 #HANGUL SYLLABLE RIEUL WE NIEUN -0x8FD3 0xB925 #HANGUL SYLLABLE RIEUL WE NIEUNCIEUC -0x8FD4 0xB926 #HANGUL SYLLABLE RIEUL WE NIEUNHIEUH -0x8FD5 0xB927 #HANGUL SYLLABLE RIEUL WE TIKEUT -0x8FD6 0xB928 #HANGUL SYLLABLE RIEUL WE RIEUL -0x8FD7 0xB929 #HANGUL SYLLABLE RIEUL WE RIEULKIYEOK -0x8FD8 0xB92A #HANGUL SYLLABLE RIEUL WE RIEULMIEUM -0x8FD9 0xB92B #HANGUL SYLLABLE RIEUL WE RIEULPIEUP -0x8FDA 0xB92C #HANGUL SYLLABLE RIEUL WE RIEULSIOS -0x8FDB 0xB92D #HANGUL SYLLABLE RIEUL WE RIEULTHIEUTH -0x8FDC 0xB92E #HANGUL SYLLABLE RIEUL WE RIEULPHIEUPH -0x8FDD 0xB92F #HANGUL SYLLABLE RIEUL WE RIEULHIEUH -0x8FDE 0xB930 #HANGUL SYLLABLE RIEUL WE MIEUM -0x8FDF 0xB931 #HANGUL SYLLABLE RIEUL WE PIEUP -0x8FE0 0xB932 #HANGUL SYLLABLE RIEUL WE PIEUPSIOS -0x8FE1 0xB933 #HANGUL SYLLABLE RIEUL WE SIOS -0x8FE2 0xB934 #HANGUL SYLLABLE RIEUL WE SSANGSIOS -0x8FE3 0xB935 #HANGUL SYLLABLE RIEUL WE IEUNG -0x8FE4 0xB936 #HANGUL SYLLABLE RIEUL WE CIEUC -0x8FE5 0xB937 #HANGUL SYLLABLE RIEUL WE CHIEUCH -0x8FE6 0xB938 #HANGUL SYLLABLE RIEUL WE KHIEUKH -0x8FE7 0xB939 #HANGUL SYLLABLE RIEUL WE THIEUTH -0x8FE8 0xB93A #HANGUL SYLLABLE RIEUL WE PHIEUPH -0x8FE9 0xB93B #HANGUL SYLLABLE RIEUL WE HIEUH -0x8FEA 0xB93E #HANGUL SYLLABLE RIEUL WI SSANGKIYEOK -0x8FEB 0xB93F #HANGUL SYLLABLE RIEUL WI KIYEOKSIOS -0x8FEC 0xB941 #HANGUL SYLLABLE RIEUL WI NIEUNCIEUC -0x8FED 0xB942 #HANGUL SYLLABLE RIEUL WI NIEUNHIEUH -0x8FEE 0xB943 #HANGUL SYLLABLE RIEUL WI TIKEUT -0x8FEF 0xB945 #HANGUL SYLLABLE RIEUL WI RIEULKIYEOK -0x8FF0 0xB946 #HANGUL SYLLABLE RIEUL WI RIEULMIEUM -0x8FF1 0xB947 #HANGUL SYLLABLE RIEUL WI RIEULPIEUP -0x8FF2 0xB948 #HANGUL SYLLABLE RIEUL WI RIEULSIOS -0x8FF3 0xB949 #HANGUL SYLLABLE RIEUL WI RIEULTHIEUTH -0x8FF4 0xB94A #HANGUL SYLLABLE RIEUL WI RIEULPHIEUPH -0x8FF5 0xB94B #HANGUL SYLLABLE RIEUL WI RIEULHIEUH -0x8FF6 0xB94D #HANGUL SYLLABLE RIEUL WI PIEUP -0x8FF7 0xB94E #HANGUL SYLLABLE RIEUL WI PIEUPSIOS -0x8FF8 0xB950 #HANGUL SYLLABLE RIEUL WI SSANGSIOS -0x8FF9 0xB952 #HANGUL SYLLABLE RIEUL WI CIEUC -0x8FFA 0xB953 #HANGUL SYLLABLE RIEUL WI CHIEUCH -0x8FFB 0xB954 #HANGUL SYLLABLE RIEUL WI KHIEUKH -0x8FFC 0xB955 #HANGUL SYLLABLE RIEUL WI THIEUTH -0x8FFD 0xB956 #HANGUL SYLLABLE RIEUL WI PHIEUPH -0x8FFE 0xB957 #HANGUL SYLLABLE RIEUL WI HIEUH -0x9041 0xB95A #HANGUL SYLLABLE RIEUL YU SSANGKIYEOK -0x9042 0xB95B #HANGUL SYLLABLE RIEUL YU KIYEOKSIOS -0x9043 0xB95D #HANGUL SYLLABLE RIEUL YU NIEUNCIEUC -0x9044 0xB95E #HANGUL SYLLABLE RIEUL YU NIEUNHIEUH -0x9045 0xB95F #HANGUL SYLLABLE RIEUL YU TIKEUT -0x9046 0xB961 #HANGUL SYLLABLE RIEUL YU RIEULKIYEOK -0x9047 0xB962 #HANGUL SYLLABLE RIEUL YU RIEULMIEUM -0x9048 0xB963 #HANGUL SYLLABLE RIEUL YU RIEULPIEUP -0x9049 0xB964 #HANGUL SYLLABLE RIEUL YU RIEULSIOS -0x904A 0xB965 #HANGUL SYLLABLE RIEUL YU RIEULTHIEUTH -0x904B 0xB966 #HANGUL SYLLABLE RIEUL YU RIEULPHIEUPH -0x904C 0xB967 #HANGUL SYLLABLE RIEUL YU RIEULHIEUH -0x904D 0xB96A #HANGUL SYLLABLE RIEUL YU PIEUPSIOS -0x904E 0xB96C #HANGUL SYLLABLE RIEUL YU SSANGSIOS -0x904F 0xB96E #HANGUL SYLLABLE RIEUL YU CIEUC -0x9050 0xB96F #HANGUL SYLLABLE RIEUL YU CHIEUCH -0x9051 0xB970 #HANGUL SYLLABLE RIEUL YU KHIEUKH -0x9052 0xB971 #HANGUL SYLLABLE RIEUL YU THIEUTH -0x9053 0xB972 #HANGUL SYLLABLE RIEUL YU PHIEUPH -0x9054 0xB973 #HANGUL SYLLABLE RIEUL YU HIEUH -0x9055 0xB976 #HANGUL SYLLABLE RIEUL EU SSANGKIYEOK -0x9056 0xB977 #HANGUL SYLLABLE RIEUL EU KIYEOKSIOS -0x9057 0xB979 #HANGUL SYLLABLE RIEUL EU NIEUNCIEUC -0x9058 0xB97A #HANGUL SYLLABLE RIEUL EU NIEUNHIEUH -0x9059 0xB97B #HANGUL SYLLABLE RIEUL EU TIKEUT -0x905A 0xB97D #HANGUL SYLLABLE RIEUL EU RIEULKIYEOK -0x9061 0xB97E #HANGUL SYLLABLE RIEUL EU RIEULMIEUM -0x9062 0xB97F #HANGUL SYLLABLE RIEUL EU RIEULPIEUP -0x9063 0xB980 #HANGUL SYLLABLE RIEUL EU RIEULSIOS -0x9064 0xB981 #HANGUL SYLLABLE RIEUL EU RIEULTHIEUTH -0x9065 0xB982 #HANGUL SYLLABLE RIEUL EU RIEULPHIEUPH -0x9066 0xB983 #HANGUL SYLLABLE RIEUL EU RIEULHIEUH -0x9067 0xB986 #HANGUL SYLLABLE RIEUL EU PIEUPSIOS -0x9068 0xB988 #HANGUL SYLLABLE RIEUL EU SSANGSIOS -0x9069 0xB98B #HANGUL SYLLABLE RIEUL EU CHIEUCH -0x906A 0xB98C #HANGUL SYLLABLE RIEUL EU KHIEUKH -0x906B 0xB98F #HANGUL SYLLABLE RIEUL EU HIEUH -0x906C 0xB990 #HANGUL SYLLABLE RIEUL YI -0x906D 0xB991 #HANGUL SYLLABLE RIEUL YI KIYEOK -0x906E 0xB992 #HANGUL SYLLABLE RIEUL YI SSANGKIYEOK -0x906F 0xB993 #HANGUL SYLLABLE RIEUL YI KIYEOKSIOS -0x9070 0xB994 #HANGUL SYLLABLE RIEUL YI NIEUN -0x9071 0xB995 #HANGUL SYLLABLE RIEUL YI NIEUNCIEUC -0x9072 0xB996 #HANGUL SYLLABLE RIEUL YI NIEUNHIEUH -0x9073 0xB997 #HANGUL SYLLABLE RIEUL YI TIKEUT -0x9074 0xB998 #HANGUL SYLLABLE RIEUL YI RIEUL -0x9075 0xB999 #HANGUL SYLLABLE RIEUL YI RIEULKIYEOK -0x9076 0xB99A #HANGUL SYLLABLE RIEUL YI RIEULMIEUM -0x9077 0xB99B #HANGUL SYLLABLE RIEUL YI RIEULPIEUP -0x9078 0xB99C #HANGUL SYLLABLE RIEUL YI RIEULSIOS -0x9079 0xB99D #HANGUL SYLLABLE RIEUL YI RIEULTHIEUTH -0x907A 0xB99E #HANGUL SYLLABLE RIEUL YI RIEULPHIEUPH -0x9081 0xB99F #HANGUL SYLLABLE RIEUL YI RIEULHIEUH -0x9082 0xB9A0 #HANGUL SYLLABLE RIEUL YI MIEUM -0x9083 0xB9A1 #HANGUL SYLLABLE RIEUL YI PIEUP -0x9084 0xB9A2 #HANGUL SYLLABLE RIEUL YI PIEUPSIOS -0x9085 0xB9A3 #HANGUL SYLLABLE RIEUL YI SIOS -0x9086 0xB9A4 #HANGUL SYLLABLE RIEUL YI SSANGSIOS -0x9087 0xB9A5 #HANGUL SYLLABLE RIEUL YI IEUNG -0x9088 0xB9A6 #HANGUL SYLLABLE RIEUL YI CIEUC -0x9089 0xB9A7 #HANGUL SYLLABLE RIEUL YI CHIEUCH -0x908A 0xB9A8 #HANGUL SYLLABLE RIEUL YI KHIEUKH -0x908B 0xB9A9 #HANGUL SYLLABLE RIEUL YI THIEUTH -0x908C 0xB9AA #HANGUL SYLLABLE RIEUL YI PHIEUPH -0x908D 0xB9AB #HANGUL SYLLABLE RIEUL YI HIEUH -0x908E 0xB9AE #HANGUL SYLLABLE RIEUL I SSANGKIYEOK -0x908F 0xB9AF #HANGUL SYLLABLE RIEUL I KIYEOKSIOS -0x9090 0xB9B1 #HANGUL SYLLABLE RIEUL I NIEUNCIEUC -0x9091 0xB9B2 #HANGUL SYLLABLE RIEUL I NIEUNHIEUH -0x9092 0xB9B3 #HANGUL SYLLABLE RIEUL I TIKEUT -0x9093 0xB9B5 #HANGUL SYLLABLE RIEUL I RIEULKIYEOK -0x9094 0xB9B6 #HANGUL SYLLABLE RIEUL I RIEULMIEUM -0x9095 0xB9B7 #HANGUL SYLLABLE RIEUL I RIEULPIEUP -0x9096 0xB9B8 #HANGUL SYLLABLE RIEUL I RIEULSIOS -0x9097 0xB9B9 #HANGUL SYLLABLE RIEUL I RIEULTHIEUTH -0x9098 0xB9BA #HANGUL SYLLABLE RIEUL I RIEULPHIEUPH -0x9099 0xB9BB #HANGUL SYLLABLE RIEUL I RIEULHIEUH -0x909A 0xB9BE #HANGUL SYLLABLE RIEUL I PIEUPSIOS -0x909B 0xB9C0 #HANGUL SYLLABLE RIEUL I SSANGSIOS -0x909C 0xB9C2 #HANGUL SYLLABLE RIEUL I CIEUC -0x909D 0xB9C3 #HANGUL SYLLABLE RIEUL I CHIEUCH -0x909E 0xB9C4 #HANGUL SYLLABLE RIEUL I KHIEUKH -0x909F 0xB9C5 #HANGUL SYLLABLE RIEUL I THIEUTH -0x90A0 0xB9C6 #HANGUL SYLLABLE RIEUL I PHIEUPH -0x90A1 0xB9C7 #HANGUL SYLLABLE RIEUL I HIEUH -0x90A2 0xB9CA #HANGUL SYLLABLE MIEUM A SSANGKIYEOK -0x90A3 0xB9CB #HANGUL SYLLABLE MIEUM A KIYEOKSIOS -0x90A4 0xB9CD #HANGUL SYLLABLE MIEUM A NIEUNCIEUC -0x90A5 0xB9D3 #HANGUL SYLLABLE MIEUM A RIEULPIEUP -0x90A6 0xB9D4 #HANGUL SYLLABLE MIEUM A RIEULSIOS -0x90A7 0xB9D5 #HANGUL SYLLABLE MIEUM A RIEULTHIEUTH -0x90A8 0xB9D6 #HANGUL SYLLABLE MIEUM A RIEULPHIEUPH -0x90A9 0xB9D7 #HANGUL SYLLABLE MIEUM A RIEULHIEUH -0x90AA 0xB9DA #HANGUL SYLLABLE MIEUM A PIEUPSIOS -0x90AB 0xB9DC #HANGUL SYLLABLE MIEUM A SSANGSIOS -0x90AC 0xB9DF #HANGUL SYLLABLE MIEUM A CHIEUCH -0x90AD 0xB9E0 #HANGUL SYLLABLE MIEUM A KHIEUKH -0x90AE 0xB9E2 #HANGUL SYLLABLE MIEUM A PHIEUPH -0x90AF 0xB9E6 #HANGUL SYLLABLE MIEUM AE SSANGKIYEOK -0x90B0 0xB9E7 #HANGUL SYLLABLE MIEUM AE KIYEOKSIOS -0x90B1 0xB9E9 #HANGUL SYLLABLE MIEUM AE NIEUNCIEUC -0x90B2 0xB9EA #HANGUL SYLLABLE MIEUM AE NIEUNHIEUH -0x90B3 0xB9EB #HANGUL SYLLABLE MIEUM AE TIKEUT -0x90B4 0xB9ED #HANGUL SYLLABLE MIEUM AE RIEULKIYEOK -0x90B5 0xB9EE #HANGUL SYLLABLE MIEUM AE RIEULMIEUM -0x90B6 0xB9EF #HANGUL SYLLABLE MIEUM AE RIEULPIEUP -0x90B7 0xB9F0 #HANGUL SYLLABLE MIEUM AE RIEULSIOS -0x90B8 0xB9F1 #HANGUL SYLLABLE MIEUM AE RIEULTHIEUTH -0x90B9 0xB9F2 #HANGUL SYLLABLE MIEUM AE RIEULPHIEUPH -0x90BA 0xB9F3 #HANGUL SYLLABLE MIEUM AE RIEULHIEUH -0x90BB 0xB9F6 #HANGUL SYLLABLE MIEUM AE PIEUPSIOS -0x90BC 0xB9FB #HANGUL SYLLABLE MIEUM AE CHIEUCH -0x90BD 0xB9FC #HANGUL SYLLABLE MIEUM AE KHIEUKH -0x90BE 0xB9FD #HANGUL SYLLABLE MIEUM AE THIEUTH -0x90BF 0xB9FE #HANGUL SYLLABLE MIEUM AE PHIEUPH -0x90C0 0xB9FF #HANGUL SYLLABLE MIEUM AE HIEUH -0x90C1 0xBA02 #HANGUL SYLLABLE MIEUM YA SSANGKIYEOK -0x90C2 0xBA03 #HANGUL SYLLABLE MIEUM YA KIYEOKSIOS -0x90C3 0xBA04 #HANGUL SYLLABLE MIEUM YA NIEUN -0x90C4 0xBA05 #HANGUL SYLLABLE MIEUM YA NIEUNCIEUC -0x90C5 0xBA06 #HANGUL SYLLABLE MIEUM YA NIEUNHIEUH -0x90C6 0xBA07 #HANGUL SYLLABLE MIEUM YA TIKEUT -0x90C7 0xBA09 #HANGUL SYLLABLE MIEUM YA RIEULKIYEOK -0x90C8 0xBA0A #HANGUL SYLLABLE MIEUM YA RIEULMIEUM -0x90C9 0xBA0B #HANGUL SYLLABLE MIEUM YA RIEULPIEUP -0x90CA 0xBA0C #HANGUL SYLLABLE MIEUM YA RIEULSIOS -0x90CB 0xBA0D #HANGUL SYLLABLE MIEUM YA RIEULTHIEUTH -0x90CC 0xBA0E #HANGUL SYLLABLE MIEUM YA RIEULPHIEUPH -0x90CD 0xBA0F #HANGUL SYLLABLE MIEUM YA RIEULHIEUH -0x90CE 0xBA10 #HANGUL SYLLABLE MIEUM YA MIEUM -0x90CF 0xBA11 #HANGUL SYLLABLE MIEUM YA PIEUP -0x90D0 0xBA12 #HANGUL SYLLABLE MIEUM YA PIEUPSIOS -0x90D1 0xBA13 #HANGUL SYLLABLE MIEUM YA SIOS -0x90D2 0xBA14 #HANGUL SYLLABLE MIEUM YA SSANGSIOS -0x90D3 0xBA16 #HANGUL SYLLABLE MIEUM YA CIEUC -0x90D4 0xBA17 #HANGUL SYLLABLE MIEUM YA CHIEUCH -0x90D5 0xBA18 #HANGUL SYLLABLE MIEUM YA KHIEUKH -0x90D6 0xBA19 #HANGUL SYLLABLE MIEUM YA THIEUTH -0x90D7 0xBA1A #HANGUL SYLLABLE MIEUM YA PHIEUPH -0x90D8 0xBA1B #HANGUL SYLLABLE MIEUM YA HIEUH -0x90D9 0xBA1C #HANGUL SYLLABLE MIEUM YAE -0x90DA 0xBA1D #HANGUL SYLLABLE MIEUM YAE KIYEOK -0x90DB 0xBA1E #HANGUL SYLLABLE MIEUM YAE SSANGKIYEOK -0x90DC 0xBA1F #HANGUL SYLLABLE MIEUM YAE KIYEOKSIOS -0x90DD 0xBA20 #HANGUL SYLLABLE MIEUM YAE NIEUN -0x90DE 0xBA21 #HANGUL SYLLABLE MIEUM YAE NIEUNCIEUC -0x90DF 0xBA22 #HANGUL SYLLABLE MIEUM YAE NIEUNHIEUH -0x90E0 0xBA23 #HANGUL SYLLABLE MIEUM YAE TIKEUT -0x90E1 0xBA24 #HANGUL SYLLABLE MIEUM YAE RIEUL -0x90E2 0xBA25 #HANGUL SYLLABLE MIEUM YAE RIEULKIYEOK -0x90E3 0xBA26 #HANGUL SYLLABLE MIEUM YAE RIEULMIEUM -0x90E4 0xBA27 #HANGUL SYLLABLE MIEUM YAE RIEULPIEUP -0x90E5 0xBA28 #HANGUL SYLLABLE MIEUM YAE RIEULSIOS -0x90E6 0xBA29 #HANGUL SYLLABLE MIEUM YAE RIEULTHIEUTH -0x90E7 0xBA2A #HANGUL SYLLABLE MIEUM YAE RIEULPHIEUPH -0x90E8 0xBA2B #HANGUL SYLLABLE MIEUM YAE RIEULHIEUH -0x90E9 0xBA2C #HANGUL SYLLABLE MIEUM YAE MIEUM -0x90EA 0xBA2D #HANGUL SYLLABLE MIEUM YAE PIEUP -0x90EB 0xBA2E #HANGUL SYLLABLE MIEUM YAE PIEUPSIOS -0x90EC 0xBA2F #HANGUL SYLLABLE MIEUM YAE SIOS -0x90ED 0xBA30 #HANGUL SYLLABLE MIEUM YAE SSANGSIOS -0x90EE 0xBA31 #HANGUL SYLLABLE MIEUM YAE IEUNG -0x90EF 0xBA32 #HANGUL SYLLABLE MIEUM YAE CIEUC -0x90F0 0xBA33 #HANGUL SYLLABLE MIEUM YAE CHIEUCH -0x90F1 0xBA34 #HANGUL SYLLABLE MIEUM YAE KHIEUKH -0x90F2 0xBA35 #HANGUL SYLLABLE MIEUM YAE THIEUTH -0x90F3 0xBA36 #HANGUL SYLLABLE MIEUM YAE PHIEUPH -0x90F4 0xBA37 #HANGUL SYLLABLE MIEUM YAE HIEUH -0x90F5 0xBA3A #HANGUL SYLLABLE MIEUM EO SSANGKIYEOK -0x90F6 0xBA3B #HANGUL SYLLABLE MIEUM EO KIYEOKSIOS -0x90F7 0xBA3D #HANGUL SYLLABLE MIEUM EO NIEUNCIEUC -0x90F8 0xBA3E #HANGUL SYLLABLE MIEUM EO NIEUNHIEUH -0x90F9 0xBA3F #HANGUL SYLLABLE MIEUM EO TIKEUT -0x90FA 0xBA41 #HANGUL SYLLABLE MIEUM EO RIEULKIYEOK -0x90FB 0xBA43 #HANGUL SYLLABLE MIEUM EO RIEULPIEUP -0x90FC 0xBA44 #HANGUL SYLLABLE MIEUM EO RIEULSIOS -0x90FD 0xBA45 #HANGUL SYLLABLE MIEUM EO RIEULTHIEUTH -0x90FE 0xBA46 #HANGUL SYLLABLE MIEUM EO RIEULPHIEUPH -0x9141 0xBA47 #HANGUL SYLLABLE MIEUM EO RIEULHIEUH -0x9142 0xBA4A #HANGUL SYLLABLE MIEUM EO PIEUPSIOS -0x9143 0xBA4C #HANGUL SYLLABLE MIEUM EO SSANGSIOS -0x9144 0xBA4F #HANGUL SYLLABLE MIEUM EO CHIEUCH -0x9145 0xBA50 #HANGUL SYLLABLE MIEUM EO KHIEUKH -0x9146 0xBA51 #HANGUL SYLLABLE MIEUM EO THIEUTH -0x9147 0xBA52 #HANGUL SYLLABLE MIEUM EO PHIEUPH -0x9148 0xBA56 #HANGUL SYLLABLE MIEUM E SSANGKIYEOK -0x9149 0xBA57 #HANGUL SYLLABLE MIEUM E KIYEOKSIOS -0x914A 0xBA59 #HANGUL SYLLABLE MIEUM E NIEUNCIEUC -0x914B 0xBA5A #HANGUL SYLLABLE MIEUM E NIEUNHIEUH -0x914C 0xBA5B #HANGUL SYLLABLE MIEUM E TIKEUT -0x914D 0xBA5D #HANGUL SYLLABLE MIEUM E RIEULKIYEOK -0x914E 0xBA5E #HANGUL SYLLABLE MIEUM E RIEULMIEUM -0x914F 0xBA5F #HANGUL SYLLABLE MIEUM E RIEULPIEUP -0x9150 0xBA60 #HANGUL SYLLABLE MIEUM E RIEULSIOS -0x9151 0xBA61 #HANGUL SYLLABLE MIEUM E RIEULTHIEUTH -0x9152 0xBA62 #HANGUL SYLLABLE MIEUM E RIEULPHIEUPH -0x9153 0xBA63 #HANGUL SYLLABLE MIEUM E RIEULHIEUH -0x9154 0xBA66 #HANGUL SYLLABLE MIEUM E PIEUPSIOS -0x9155 0xBA6A #HANGUL SYLLABLE MIEUM E CIEUC -0x9156 0xBA6B #HANGUL SYLLABLE MIEUM E CHIEUCH -0x9157 0xBA6C #HANGUL SYLLABLE MIEUM E KHIEUKH -0x9158 0xBA6D #HANGUL SYLLABLE MIEUM E THIEUTH -0x9159 0xBA6E #HANGUL SYLLABLE MIEUM E PHIEUPH -0x915A 0xBA6F #HANGUL SYLLABLE MIEUM E HIEUH -0x9161 0xBA72 #HANGUL SYLLABLE MIEUM YEO SSANGKIYEOK -0x9162 0xBA73 #HANGUL SYLLABLE MIEUM YEO KIYEOKSIOS -0x9163 0xBA75 #HANGUL SYLLABLE MIEUM YEO NIEUNCIEUC -0x9164 0xBA76 #HANGUL SYLLABLE MIEUM YEO NIEUNHIEUH -0x9165 0xBA77 #HANGUL SYLLABLE MIEUM YEO TIKEUT -0x9166 0xBA79 #HANGUL SYLLABLE MIEUM YEO RIEULKIYEOK -0x9167 0xBA7A #HANGUL SYLLABLE MIEUM YEO RIEULMIEUM -0x9168 0xBA7B #HANGUL SYLLABLE MIEUM YEO RIEULPIEUP -0x9169 0xBA7C #HANGUL SYLLABLE MIEUM YEO RIEULSIOS -0x916A 0xBA7D #HANGUL SYLLABLE MIEUM YEO RIEULTHIEUTH -0x916B 0xBA7E #HANGUL SYLLABLE MIEUM YEO RIEULPHIEUPH -0x916C 0xBA7F #HANGUL SYLLABLE MIEUM YEO RIEULHIEUH -0x916D 0xBA80 #HANGUL SYLLABLE MIEUM YEO MIEUM -0x916E 0xBA81 #HANGUL SYLLABLE MIEUM YEO PIEUP -0x916F 0xBA82 #HANGUL SYLLABLE MIEUM YEO PIEUPSIOS -0x9170 0xBA86 #HANGUL SYLLABLE MIEUM YEO CIEUC -0x9171 0xBA88 #HANGUL SYLLABLE MIEUM YEO KHIEUKH -0x9172 0xBA89 #HANGUL SYLLABLE MIEUM YEO THIEUTH -0x9173 0xBA8A #HANGUL SYLLABLE MIEUM YEO PHIEUPH -0x9174 0xBA8B #HANGUL SYLLABLE MIEUM YEO HIEUH -0x9175 0xBA8D #HANGUL SYLLABLE MIEUM YE KIYEOK -0x9176 0xBA8E #HANGUL SYLLABLE MIEUM YE SSANGKIYEOK -0x9177 0xBA8F #HANGUL SYLLABLE MIEUM YE KIYEOKSIOS -0x9178 0xBA90 #HANGUL SYLLABLE MIEUM YE NIEUN -0x9179 0xBA91 #HANGUL SYLLABLE MIEUM YE NIEUNCIEUC -0x917A 0xBA92 #HANGUL SYLLABLE MIEUM YE NIEUNHIEUH -0x9181 0xBA93 #HANGUL SYLLABLE MIEUM YE TIKEUT -0x9182 0xBA94 #HANGUL SYLLABLE MIEUM YE RIEUL -0x9183 0xBA95 #HANGUL SYLLABLE MIEUM YE RIEULKIYEOK -0x9184 0xBA96 #HANGUL SYLLABLE MIEUM YE RIEULMIEUM -0x9185 0xBA97 #HANGUL SYLLABLE MIEUM YE RIEULPIEUP -0x9186 0xBA98 #HANGUL SYLLABLE MIEUM YE RIEULSIOS -0x9187 0xBA99 #HANGUL SYLLABLE MIEUM YE RIEULTHIEUTH -0x9188 0xBA9A #HANGUL SYLLABLE MIEUM YE RIEULPHIEUPH -0x9189 0xBA9B #HANGUL SYLLABLE MIEUM YE RIEULHIEUH -0x918A 0xBA9C #HANGUL SYLLABLE MIEUM YE MIEUM -0x918B 0xBA9D #HANGUL SYLLABLE MIEUM YE PIEUP -0x918C 0xBA9E #HANGUL SYLLABLE MIEUM YE PIEUPSIOS -0x918D 0xBA9F #HANGUL SYLLABLE MIEUM YE SIOS -0x918E 0xBAA0 #HANGUL SYLLABLE MIEUM YE SSANGSIOS -0x918F 0xBAA1 #HANGUL SYLLABLE MIEUM YE IEUNG -0x9190 0xBAA2 #HANGUL SYLLABLE MIEUM YE CIEUC -0x9191 0xBAA3 #HANGUL SYLLABLE MIEUM YE CHIEUCH -0x9192 0xBAA4 #HANGUL SYLLABLE MIEUM YE KHIEUKH -0x9193 0xBAA5 #HANGUL SYLLABLE MIEUM YE THIEUTH -0x9194 0xBAA6 #HANGUL SYLLABLE MIEUM YE PHIEUPH -0x9195 0xBAA7 #HANGUL SYLLABLE MIEUM YE HIEUH -0x9196 0xBAAA #HANGUL SYLLABLE MIEUM O SSANGKIYEOK -0x9197 0xBAAD #HANGUL SYLLABLE MIEUM O NIEUNCIEUC -0x9198 0xBAAE #HANGUL SYLLABLE MIEUM O NIEUNHIEUH -0x9199 0xBAAF #HANGUL SYLLABLE MIEUM O TIKEUT -0x919A 0xBAB1 #HANGUL SYLLABLE MIEUM O RIEULKIYEOK -0x919B 0xBAB3 #HANGUL SYLLABLE MIEUM O RIEULPIEUP -0x919C 0xBAB4 #HANGUL SYLLABLE MIEUM O RIEULSIOS -0x919D 0xBAB5 #HANGUL SYLLABLE MIEUM O RIEULTHIEUTH -0x919E 0xBAB6 #HANGUL SYLLABLE MIEUM O RIEULPHIEUPH -0x919F 0xBAB7 #HANGUL SYLLABLE MIEUM O RIEULHIEUH -0x91A0 0xBABA #HANGUL SYLLABLE MIEUM O PIEUPSIOS -0x91A1 0xBABC #HANGUL SYLLABLE MIEUM O SSANGSIOS -0x91A2 0xBABE #HANGUL SYLLABLE MIEUM O CIEUC -0x91A3 0xBABF #HANGUL SYLLABLE MIEUM O CHIEUCH -0x91A4 0xBAC0 #HANGUL SYLLABLE MIEUM O KHIEUKH -0x91A5 0xBAC1 #HANGUL SYLLABLE MIEUM O THIEUTH -0x91A6 0xBAC2 #HANGUL SYLLABLE MIEUM O PHIEUPH -0x91A7 0xBAC3 #HANGUL SYLLABLE MIEUM O HIEUH -0x91A8 0xBAC5 #HANGUL SYLLABLE MIEUM WA KIYEOK -0x91A9 0xBAC6 #HANGUL SYLLABLE MIEUM WA SSANGKIYEOK -0x91AA 0xBAC7 #HANGUL SYLLABLE MIEUM WA KIYEOKSIOS -0x91AB 0xBAC9 #HANGUL SYLLABLE MIEUM WA NIEUNCIEUC -0x91AC 0xBACA #HANGUL SYLLABLE MIEUM WA NIEUNHIEUH -0x91AD 0xBACB #HANGUL SYLLABLE MIEUM WA TIKEUT -0x91AE 0xBACC #HANGUL SYLLABLE MIEUM WA RIEUL -0x91AF 0xBACD #HANGUL SYLLABLE MIEUM WA RIEULKIYEOK -0x91B0 0xBACE #HANGUL SYLLABLE MIEUM WA RIEULMIEUM -0x91B1 0xBACF #HANGUL SYLLABLE MIEUM WA RIEULPIEUP -0x91B2 0xBAD0 #HANGUL SYLLABLE MIEUM WA RIEULSIOS -0x91B3 0xBAD1 #HANGUL SYLLABLE MIEUM WA RIEULTHIEUTH -0x91B4 0xBAD2 #HANGUL SYLLABLE MIEUM WA RIEULPHIEUPH -0x91B5 0xBAD3 #HANGUL SYLLABLE MIEUM WA RIEULHIEUH -0x91B6 0xBAD4 #HANGUL SYLLABLE MIEUM WA MIEUM -0x91B7 0xBAD5 #HANGUL SYLLABLE MIEUM WA PIEUP -0x91B8 0xBAD6 #HANGUL SYLLABLE MIEUM WA PIEUPSIOS -0x91B9 0xBAD7 #HANGUL SYLLABLE MIEUM WA SIOS -0x91BA 0xBADA #HANGUL SYLLABLE MIEUM WA CIEUC -0x91BB 0xBADB #HANGUL SYLLABLE MIEUM WA CHIEUCH -0x91BC 0xBADC #HANGUL SYLLABLE MIEUM WA KHIEUKH -0x91BD 0xBADD #HANGUL SYLLABLE MIEUM WA THIEUTH -0x91BE 0xBADE #HANGUL SYLLABLE MIEUM WA PHIEUPH -0x91BF 0xBADF #HANGUL SYLLABLE MIEUM WA HIEUH -0x91C0 0xBAE0 #HANGUL SYLLABLE MIEUM WAE -0x91C1 0xBAE1 #HANGUL SYLLABLE MIEUM WAE KIYEOK -0x91C2 0xBAE2 #HANGUL SYLLABLE MIEUM WAE SSANGKIYEOK -0x91C3 0xBAE3 #HANGUL SYLLABLE MIEUM WAE KIYEOKSIOS -0x91C4 0xBAE4 #HANGUL SYLLABLE MIEUM WAE NIEUN -0x91C5 0xBAE5 #HANGUL SYLLABLE MIEUM WAE NIEUNCIEUC -0x91C6 0xBAE6 #HANGUL SYLLABLE MIEUM WAE NIEUNHIEUH -0x91C7 0xBAE7 #HANGUL SYLLABLE MIEUM WAE TIKEUT -0x91C8 0xBAE8 #HANGUL SYLLABLE MIEUM WAE RIEUL -0x91C9 0xBAE9 #HANGUL SYLLABLE MIEUM WAE RIEULKIYEOK -0x91CA 0xBAEA #HANGUL SYLLABLE MIEUM WAE RIEULMIEUM -0x91CB 0xBAEB #HANGUL SYLLABLE MIEUM WAE RIEULPIEUP -0x91CC 0xBAEC #HANGUL SYLLABLE MIEUM WAE RIEULSIOS -0x91CD 0xBAED #HANGUL SYLLABLE MIEUM WAE RIEULTHIEUTH -0x91CE 0xBAEE #HANGUL SYLLABLE MIEUM WAE RIEULPHIEUPH -0x91CF 0xBAEF #HANGUL SYLLABLE MIEUM WAE RIEULHIEUH -0x91D0 0xBAF0 #HANGUL SYLLABLE MIEUM WAE MIEUM -0x91D1 0xBAF1 #HANGUL SYLLABLE MIEUM WAE PIEUP -0x91D2 0xBAF2 #HANGUL SYLLABLE MIEUM WAE PIEUPSIOS -0x91D3 0xBAF3 #HANGUL SYLLABLE MIEUM WAE SIOS -0x91D4 0xBAF4 #HANGUL SYLLABLE MIEUM WAE SSANGSIOS -0x91D5 0xBAF5 #HANGUL SYLLABLE MIEUM WAE IEUNG -0x91D6 0xBAF6 #HANGUL SYLLABLE MIEUM WAE CIEUC -0x91D7 0xBAF7 #HANGUL SYLLABLE MIEUM WAE CHIEUCH -0x91D8 0xBAF8 #HANGUL SYLLABLE MIEUM WAE KHIEUKH -0x91D9 0xBAF9 #HANGUL SYLLABLE MIEUM WAE THIEUTH -0x91DA 0xBAFA #HANGUL SYLLABLE MIEUM WAE PHIEUPH -0x91DB 0xBAFB #HANGUL SYLLABLE MIEUM WAE HIEUH -0x91DC 0xBAFD #HANGUL SYLLABLE MIEUM OE KIYEOK -0x91DD 0xBAFE #HANGUL SYLLABLE MIEUM OE SSANGKIYEOK -0x91DE 0xBAFF #HANGUL SYLLABLE MIEUM OE KIYEOKSIOS -0x91DF 0xBB01 #HANGUL SYLLABLE MIEUM OE NIEUNCIEUC -0x91E0 0xBB02 #HANGUL SYLLABLE MIEUM OE NIEUNHIEUH -0x91E1 0xBB03 #HANGUL SYLLABLE MIEUM OE TIKEUT -0x91E2 0xBB05 #HANGUL SYLLABLE MIEUM OE RIEULKIYEOK -0x91E3 0xBB06 #HANGUL SYLLABLE MIEUM OE RIEULMIEUM -0x91E4 0xBB07 #HANGUL SYLLABLE MIEUM OE RIEULPIEUP -0x91E5 0xBB08 #HANGUL SYLLABLE MIEUM OE RIEULSIOS -0x91E6 0xBB09 #HANGUL SYLLABLE MIEUM OE RIEULTHIEUTH -0x91E7 0xBB0A #HANGUL SYLLABLE MIEUM OE RIEULPHIEUPH -0x91E8 0xBB0B #HANGUL SYLLABLE MIEUM OE RIEULHIEUH -0x91E9 0xBB0C #HANGUL SYLLABLE MIEUM OE MIEUM -0x91EA 0xBB0E #HANGUL SYLLABLE MIEUM OE PIEUPSIOS -0x91EB 0xBB10 #HANGUL SYLLABLE MIEUM OE SSANGSIOS -0x91EC 0xBB12 #HANGUL SYLLABLE MIEUM OE CIEUC -0x91ED 0xBB13 #HANGUL SYLLABLE MIEUM OE CHIEUCH -0x91EE 0xBB14 #HANGUL SYLLABLE MIEUM OE KHIEUKH -0x91EF 0xBB15 #HANGUL SYLLABLE MIEUM OE THIEUTH -0x91F0 0xBB16 #HANGUL SYLLABLE MIEUM OE PHIEUPH -0x91F1 0xBB17 #HANGUL SYLLABLE MIEUM OE HIEUH -0x91F2 0xBB19 #HANGUL SYLLABLE MIEUM YO KIYEOK -0x91F3 0xBB1A #HANGUL SYLLABLE MIEUM YO SSANGKIYEOK -0x91F4 0xBB1B #HANGUL SYLLABLE MIEUM YO KIYEOKSIOS -0x91F5 0xBB1D #HANGUL SYLLABLE MIEUM YO NIEUNCIEUC -0x91F6 0xBB1E #HANGUL SYLLABLE MIEUM YO NIEUNHIEUH -0x91F7 0xBB1F #HANGUL SYLLABLE MIEUM YO TIKEUT -0x91F8 0xBB21 #HANGUL SYLLABLE MIEUM YO RIEULKIYEOK -0x91F9 0xBB22 #HANGUL SYLLABLE MIEUM YO RIEULMIEUM -0x91FA 0xBB23 #HANGUL SYLLABLE MIEUM YO RIEULPIEUP -0x91FB 0xBB24 #HANGUL SYLLABLE MIEUM YO RIEULSIOS -0x91FC 0xBB25 #HANGUL SYLLABLE MIEUM YO RIEULTHIEUTH -0x91FD 0xBB26 #HANGUL SYLLABLE MIEUM YO RIEULPHIEUPH -0x91FE 0xBB27 #HANGUL SYLLABLE MIEUM YO RIEULHIEUH -0x9241 0xBB28 #HANGUL SYLLABLE MIEUM YO MIEUM -0x9242 0xBB2A #HANGUL SYLLABLE MIEUM YO PIEUPSIOS -0x9243 0xBB2C #HANGUL SYLLABLE MIEUM YO SSANGSIOS -0x9244 0xBB2D #HANGUL SYLLABLE MIEUM YO IEUNG -0x9245 0xBB2E #HANGUL SYLLABLE MIEUM YO CIEUC -0x9246 0xBB2F #HANGUL SYLLABLE MIEUM YO CHIEUCH -0x9247 0xBB30 #HANGUL SYLLABLE MIEUM YO KHIEUKH -0x9248 0xBB31 #HANGUL SYLLABLE MIEUM YO THIEUTH -0x9249 0xBB32 #HANGUL SYLLABLE MIEUM YO PHIEUPH -0x924A 0xBB33 #HANGUL SYLLABLE MIEUM YO HIEUH -0x924B 0xBB37 #HANGUL SYLLABLE MIEUM U KIYEOKSIOS -0x924C 0xBB39 #HANGUL SYLLABLE MIEUM U NIEUNCIEUC -0x924D 0xBB3A #HANGUL SYLLABLE MIEUM U NIEUNHIEUH -0x924E 0xBB3F #HANGUL SYLLABLE MIEUM U RIEULPIEUP -0x924F 0xBB40 #HANGUL SYLLABLE MIEUM U RIEULSIOS -0x9250 0xBB41 #HANGUL SYLLABLE MIEUM U RIEULTHIEUTH -0x9251 0xBB42 #HANGUL SYLLABLE MIEUM U RIEULPHIEUPH -0x9252 0xBB43 #HANGUL SYLLABLE MIEUM U RIEULHIEUH -0x9253 0xBB46 #HANGUL SYLLABLE MIEUM U PIEUPSIOS -0x9254 0xBB48 #HANGUL SYLLABLE MIEUM U SSANGSIOS -0x9255 0xBB4A #HANGUL SYLLABLE MIEUM U CIEUC -0x9256 0xBB4B #HANGUL SYLLABLE MIEUM U CHIEUCH -0x9257 0xBB4C #HANGUL SYLLABLE MIEUM U KHIEUKH -0x9258 0xBB4E #HANGUL SYLLABLE MIEUM U PHIEUPH -0x9259 0xBB51 #HANGUL SYLLABLE MIEUM WEO KIYEOK -0x925A 0xBB52 #HANGUL SYLLABLE MIEUM WEO SSANGKIYEOK -0x9261 0xBB53 #HANGUL SYLLABLE MIEUM WEO KIYEOKSIOS -0x9262 0xBB55 #HANGUL SYLLABLE MIEUM WEO NIEUNCIEUC -0x9263 0xBB56 #HANGUL SYLLABLE MIEUM WEO NIEUNHIEUH -0x9264 0xBB57 #HANGUL SYLLABLE MIEUM WEO TIKEUT -0x9265 0xBB59 #HANGUL SYLLABLE MIEUM WEO RIEULKIYEOK -0x9266 0xBB5A #HANGUL SYLLABLE MIEUM WEO RIEULMIEUM -0x9267 0xBB5B #HANGUL SYLLABLE MIEUM WEO RIEULPIEUP -0x9268 0xBB5C #HANGUL SYLLABLE MIEUM WEO RIEULSIOS -0x9269 0xBB5D #HANGUL SYLLABLE MIEUM WEO RIEULTHIEUTH -0x926A 0xBB5E #HANGUL SYLLABLE MIEUM WEO RIEULPHIEUPH -0x926B 0xBB5F #HANGUL SYLLABLE MIEUM WEO RIEULHIEUH -0x926C 0xBB60 #HANGUL SYLLABLE MIEUM WEO MIEUM -0x926D 0xBB62 #HANGUL SYLLABLE MIEUM WEO PIEUPSIOS -0x926E 0xBB64 #HANGUL SYLLABLE MIEUM WEO SSANGSIOS -0x926F 0xBB65 #HANGUL SYLLABLE MIEUM WEO IEUNG -0x9270 0xBB66 #HANGUL SYLLABLE MIEUM WEO CIEUC -0x9271 0xBB67 #HANGUL SYLLABLE MIEUM WEO CHIEUCH -0x9272 0xBB68 #HANGUL SYLLABLE MIEUM WEO KHIEUKH -0x9273 0xBB69 #HANGUL SYLLABLE MIEUM WEO THIEUTH -0x9274 0xBB6A #HANGUL SYLLABLE MIEUM WEO PHIEUPH -0x9275 0xBB6B #HANGUL SYLLABLE MIEUM WEO HIEUH -0x9276 0xBB6D #HANGUL SYLLABLE MIEUM WE KIYEOK -0x9277 0xBB6E #HANGUL SYLLABLE MIEUM WE SSANGKIYEOK -0x9278 0xBB6F #HANGUL SYLLABLE MIEUM WE KIYEOKSIOS -0x9279 0xBB70 #HANGUL SYLLABLE MIEUM WE NIEUN -0x927A 0xBB71 #HANGUL SYLLABLE MIEUM WE NIEUNCIEUC -0x9281 0xBB72 #HANGUL SYLLABLE MIEUM WE NIEUNHIEUH -0x9282 0xBB73 #HANGUL SYLLABLE MIEUM WE TIKEUT -0x9283 0xBB74 #HANGUL SYLLABLE MIEUM WE RIEUL -0x9284 0xBB75 #HANGUL SYLLABLE MIEUM WE RIEULKIYEOK -0x9285 0xBB76 #HANGUL SYLLABLE MIEUM WE RIEULMIEUM -0x9286 0xBB77 #HANGUL SYLLABLE MIEUM WE RIEULPIEUP -0x9287 0xBB78 #HANGUL SYLLABLE MIEUM WE RIEULSIOS -0x9288 0xBB79 #HANGUL SYLLABLE MIEUM WE RIEULTHIEUTH -0x9289 0xBB7A #HANGUL SYLLABLE MIEUM WE RIEULPHIEUPH -0x928A 0xBB7B #HANGUL SYLLABLE MIEUM WE RIEULHIEUH -0x928B 0xBB7C #HANGUL SYLLABLE MIEUM WE MIEUM -0x928C 0xBB7D #HANGUL SYLLABLE MIEUM WE PIEUP -0x928D 0xBB7E #HANGUL SYLLABLE MIEUM WE PIEUPSIOS -0x928E 0xBB7F #HANGUL SYLLABLE MIEUM WE SIOS -0x928F 0xBB80 #HANGUL SYLLABLE MIEUM WE SSANGSIOS -0x9290 0xBB81 #HANGUL SYLLABLE MIEUM WE IEUNG -0x9291 0xBB82 #HANGUL SYLLABLE MIEUM WE CIEUC -0x9292 0xBB83 #HANGUL SYLLABLE MIEUM WE CHIEUCH -0x9293 0xBB84 #HANGUL SYLLABLE MIEUM WE KHIEUKH -0x9294 0xBB85 #HANGUL SYLLABLE MIEUM WE THIEUTH -0x9295 0xBB86 #HANGUL SYLLABLE MIEUM WE PHIEUPH -0x9296 0xBB87 #HANGUL SYLLABLE MIEUM WE HIEUH -0x9297 0xBB89 #HANGUL SYLLABLE MIEUM WI KIYEOK -0x9298 0xBB8A #HANGUL SYLLABLE MIEUM WI SSANGKIYEOK -0x9299 0xBB8B #HANGUL SYLLABLE MIEUM WI KIYEOKSIOS -0x929A 0xBB8D #HANGUL SYLLABLE MIEUM WI NIEUNCIEUC -0x929B 0xBB8E #HANGUL SYLLABLE MIEUM WI NIEUNHIEUH -0x929C 0xBB8F #HANGUL SYLLABLE MIEUM WI TIKEUT -0x929D 0xBB91 #HANGUL SYLLABLE MIEUM WI RIEULKIYEOK -0x929E 0xBB92 #HANGUL SYLLABLE MIEUM WI RIEULMIEUM -0x929F 0xBB93 #HANGUL SYLLABLE MIEUM WI RIEULPIEUP -0x92A0 0xBB94 #HANGUL SYLLABLE MIEUM WI RIEULSIOS -0x92A1 0xBB95 #HANGUL SYLLABLE MIEUM WI RIEULTHIEUTH -0x92A2 0xBB96 #HANGUL SYLLABLE MIEUM WI RIEULPHIEUPH -0x92A3 0xBB97 #HANGUL SYLLABLE MIEUM WI RIEULHIEUH -0x92A4 0xBB98 #HANGUL SYLLABLE MIEUM WI MIEUM -0x92A5 0xBB99 #HANGUL SYLLABLE MIEUM WI PIEUP -0x92A6 0xBB9A #HANGUL SYLLABLE MIEUM WI PIEUPSIOS -0x92A7 0xBB9B #HANGUL SYLLABLE MIEUM WI SIOS -0x92A8 0xBB9C #HANGUL SYLLABLE MIEUM WI SSANGSIOS -0x92A9 0xBB9D #HANGUL SYLLABLE MIEUM WI IEUNG -0x92AA 0xBB9E #HANGUL SYLLABLE MIEUM WI CIEUC -0x92AB 0xBB9F #HANGUL SYLLABLE MIEUM WI CHIEUCH -0x92AC 0xBBA0 #HANGUL SYLLABLE MIEUM WI KHIEUKH -0x92AD 0xBBA1 #HANGUL SYLLABLE MIEUM WI THIEUTH -0x92AE 0xBBA2 #HANGUL SYLLABLE MIEUM WI PHIEUPH -0x92AF 0xBBA3 #HANGUL SYLLABLE MIEUM WI HIEUH -0x92B0 0xBBA5 #HANGUL SYLLABLE MIEUM YU KIYEOK -0x92B1 0xBBA6 #HANGUL SYLLABLE MIEUM YU SSANGKIYEOK -0x92B2 0xBBA7 #HANGUL SYLLABLE MIEUM YU KIYEOKSIOS -0x92B3 0xBBA9 #HANGUL SYLLABLE MIEUM YU NIEUNCIEUC -0x92B4 0xBBAA #HANGUL SYLLABLE MIEUM YU NIEUNHIEUH -0x92B5 0xBBAB #HANGUL SYLLABLE MIEUM YU TIKEUT -0x92B6 0xBBAD #HANGUL SYLLABLE MIEUM YU RIEULKIYEOK -0x92B7 0xBBAE #HANGUL SYLLABLE MIEUM YU RIEULMIEUM -0x92B8 0xBBAF #HANGUL SYLLABLE MIEUM YU RIEULPIEUP -0x92B9 0xBBB0 #HANGUL SYLLABLE MIEUM YU RIEULSIOS -0x92BA 0xBBB1 #HANGUL SYLLABLE MIEUM YU RIEULTHIEUTH -0x92BB 0xBBB2 #HANGUL SYLLABLE MIEUM YU RIEULPHIEUPH -0x92BC 0xBBB3 #HANGUL SYLLABLE MIEUM YU RIEULHIEUH -0x92BD 0xBBB5 #HANGUL SYLLABLE MIEUM YU PIEUP -0x92BE 0xBBB6 #HANGUL SYLLABLE MIEUM YU PIEUPSIOS -0x92BF 0xBBB8 #HANGUL SYLLABLE MIEUM YU SSANGSIOS -0x92C0 0xBBB9 #HANGUL SYLLABLE MIEUM YU IEUNG -0x92C1 0xBBBA #HANGUL SYLLABLE MIEUM YU CIEUC -0x92C2 0xBBBB #HANGUL SYLLABLE MIEUM YU CHIEUCH -0x92C3 0xBBBC #HANGUL SYLLABLE MIEUM YU KHIEUKH -0x92C4 0xBBBD #HANGUL SYLLABLE MIEUM YU THIEUTH -0x92C5 0xBBBE #HANGUL SYLLABLE MIEUM YU PHIEUPH -0x92C6 0xBBBF #HANGUL SYLLABLE MIEUM YU HIEUH -0x92C7 0xBBC1 #HANGUL SYLLABLE MIEUM EU KIYEOK -0x92C8 0xBBC2 #HANGUL SYLLABLE MIEUM EU SSANGKIYEOK -0x92C9 0xBBC3 #HANGUL SYLLABLE MIEUM EU KIYEOKSIOS -0x92CA 0xBBC5 #HANGUL SYLLABLE MIEUM EU NIEUNCIEUC -0x92CB 0xBBC6 #HANGUL SYLLABLE MIEUM EU NIEUNHIEUH -0x92CC 0xBBC7 #HANGUL SYLLABLE MIEUM EU TIKEUT -0x92CD 0xBBC9 #HANGUL SYLLABLE MIEUM EU RIEULKIYEOK -0x92CE 0xBBCA #HANGUL SYLLABLE MIEUM EU RIEULMIEUM -0x92CF 0xBBCB #HANGUL SYLLABLE MIEUM EU RIEULPIEUP -0x92D0 0xBBCC #HANGUL SYLLABLE MIEUM EU RIEULSIOS -0x92D1 0xBBCD #HANGUL SYLLABLE MIEUM EU RIEULTHIEUTH -0x92D2 0xBBCE #HANGUL SYLLABLE MIEUM EU RIEULPHIEUPH -0x92D3 0xBBCF #HANGUL SYLLABLE MIEUM EU RIEULHIEUH -0x92D4 0xBBD1 #HANGUL SYLLABLE MIEUM EU PIEUP -0x92D5 0xBBD2 #HANGUL SYLLABLE MIEUM EU PIEUPSIOS -0x92D6 0xBBD4 #HANGUL SYLLABLE MIEUM EU SSANGSIOS -0x92D7 0xBBD5 #HANGUL SYLLABLE MIEUM EU IEUNG -0x92D8 0xBBD6 #HANGUL SYLLABLE MIEUM EU CIEUC -0x92D9 0xBBD7 #HANGUL SYLLABLE MIEUM EU CHIEUCH -0x92DA 0xBBD8 #HANGUL SYLLABLE MIEUM EU KHIEUKH -0x92DB 0xBBD9 #HANGUL SYLLABLE MIEUM EU THIEUTH -0x92DC 0xBBDA #HANGUL SYLLABLE MIEUM EU PHIEUPH -0x92DD 0xBBDB #HANGUL SYLLABLE MIEUM EU HIEUH -0x92DE 0xBBDC #HANGUL SYLLABLE MIEUM YI -0x92DF 0xBBDD #HANGUL SYLLABLE MIEUM YI KIYEOK -0x92E0 0xBBDE #HANGUL SYLLABLE MIEUM YI SSANGKIYEOK -0x92E1 0xBBDF #HANGUL SYLLABLE MIEUM YI KIYEOKSIOS -0x92E2 0xBBE0 #HANGUL SYLLABLE MIEUM YI NIEUN -0x92E3 0xBBE1 #HANGUL SYLLABLE MIEUM YI NIEUNCIEUC -0x92E4 0xBBE2 #HANGUL SYLLABLE MIEUM YI NIEUNHIEUH -0x92E5 0xBBE3 #HANGUL SYLLABLE MIEUM YI TIKEUT -0x92E6 0xBBE4 #HANGUL SYLLABLE MIEUM YI RIEUL -0x92E7 0xBBE5 #HANGUL SYLLABLE MIEUM YI RIEULKIYEOK -0x92E8 0xBBE6 #HANGUL SYLLABLE MIEUM YI RIEULMIEUM -0x92E9 0xBBE7 #HANGUL SYLLABLE MIEUM YI RIEULPIEUP -0x92EA 0xBBE8 #HANGUL SYLLABLE MIEUM YI RIEULSIOS -0x92EB 0xBBE9 #HANGUL SYLLABLE MIEUM YI RIEULTHIEUTH -0x92EC 0xBBEA #HANGUL SYLLABLE MIEUM YI RIEULPHIEUPH -0x92ED 0xBBEB #HANGUL SYLLABLE MIEUM YI RIEULHIEUH -0x92EE 0xBBEC #HANGUL SYLLABLE MIEUM YI MIEUM -0x92EF 0xBBED #HANGUL SYLLABLE MIEUM YI PIEUP -0x92F0 0xBBEE #HANGUL SYLLABLE MIEUM YI PIEUPSIOS -0x92F1 0xBBEF #HANGUL SYLLABLE MIEUM YI SIOS -0x92F2 0xBBF0 #HANGUL SYLLABLE MIEUM YI SSANGSIOS -0x92F3 0xBBF1 #HANGUL SYLLABLE MIEUM YI IEUNG -0x92F4 0xBBF2 #HANGUL SYLLABLE MIEUM YI CIEUC -0x92F5 0xBBF3 #HANGUL SYLLABLE MIEUM YI CHIEUCH -0x92F6 0xBBF4 #HANGUL SYLLABLE MIEUM YI KHIEUKH -0x92F7 0xBBF5 #HANGUL SYLLABLE MIEUM YI THIEUTH -0x92F8 0xBBF6 #HANGUL SYLLABLE MIEUM YI PHIEUPH -0x92F9 0xBBF7 #HANGUL SYLLABLE MIEUM YI HIEUH -0x92FA 0xBBFA #HANGUL SYLLABLE MIEUM I SSANGKIYEOK -0x92FB 0xBBFB #HANGUL SYLLABLE MIEUM I KIYEOKSIOS -0x92FC 0xBBFD #HANGUL SYLLABLE MIEUM I NIEUNCIEUC -0x92FD 0xBBFE #HANGUL SYLLABLE MIEUM I NIEUNHIEUH -0x92FE 0xBC01 #HANGUL SYLLABLE MIEUM I RIEULKIYEOK -0x9341 0xBC03 #HANGUL SYLLABLE MIEUM I RIEULPIEUP -0x9342 0xBC04 #HANGUL SYLLABLE MIEUM I RIEULSIOS -0x9343 0xBC05 #HANGUL SYLLABLE MIEUM I RIEULTHIEUTH -0x9344 0xBC06 #HANGUL SYLLABLE MIEUM I RIEULPHIEUPH -0x9345 0xBC07 #HANGUL SYLLABLE MIEUM I RIEULHIEUH -0x9346 0xBC0A #HANGUL SYLLABLE MIEUM I PIEUPSIOS -0x9347 0xBC0E #HANGUL SYLLABLE MIEUM I CIEUC -0x9348 0xBC10 #HANGUL SYLLABLE MIEUM I KHIEUKH -0x9349 0xBC12 #HANGUL SYLLABLE MIEUM I PHIEUPH -0x934A 0xBC13 #HANGUL SYLLABLE MIEUM I HIEUH -0x934B 0xBC19 #HANGUL SYLLABLE PIEUP A NIEUNCIEUC -0x934C 0xBC1A #HANGUL SYLLABLE PIEUP A NIEUNHIEUH -0x934D 0xBC20 #HANGUL SYLLABLE PIEUP A RIEULSIOS -0x934E 0xBC21 #HANGUL SYLLABLE PIEUP A RIEULTHIEUTH -0x934F 0xBC22 #HANGUL SYLLABLE PIEUP A RIEULPHIEUPH -0x9350 0xBC23 #HANGUL SYLLABLE PIEUP A RIEULHIEUH -0x9351 0xBC26 #HANGUL SYLLABLE PIEUP A PIEUPSIOS -0x9352 0xBC28 #HANGUL SYLLABLE PIEUP A SSANGSIOS -0x9353 0xBC2A #HANGUL SYLLABLE PIEUP A CIEUC -0x9354 0xBC2B #HANGUL SYLLABLE PIEUP A CHIEUCH -0x9355 0xBC2C #HANGUL SYLLABLE PIEUP A KHIEUKH -0x9356 0xBC2E #HANGUL SYLLABLE PIEUP A PHIEUPH -0x9357 0xBC2F #HANGUL SYLLABLE PIEUP A HIEUH -0x9358 0xBC32 #HANGUL SYLLABLE PIEUP AE SSANGKIYEOK -0x9359 0xBC33 #HANGUL SYLLABLE PIEUP AE KIYEOKSIOS -0x935A 0xBC35 #HANGUL SYLLABLE PIEUP AE NIEUNCIEUC -0x9361 0xBC36 #HANGUL SYLLABLE PIEUP AE NIEUNHIEUH -0x9362 0xBC37 #HANGUL SYLLABLE PIEUP AE TIKEUT -0x9363 0xBC39 #HANGUL SYLLABLE PIEUP AE RIEULKIYEOK -0x9364 0xBC3A #HANGUL SYLLABLE PIEUP AE RIEULMIEUM -0x9365 0xBC3B #HANGUL SYLLABLE PIEUP AE RIEULPIEUP -0x9366 0xBC3C #HANGUL SYLLABLE PIEUP AE RIEULSIOS -0x9367 0xBC3D #HANGUL SYLLABLE PIEUP AE RIEULTHIEUTH -0x9368 0xBC3E #HANGUL SYLLABLE PIEUP AE RIEULPHIEUPH -0x9369 0xBC3F #HANGUL SYLLABLE PIEUP AE RIEULHIEUH -0x936A 0xBC42 #HANGUL SYLLABLE PIEUP AE PIEUPSIOS -0x936B 0xBC46 #HANGUL SYLLABLE PIEUP AE CIEUC -0x936C 0xBC47 #HANGUL SYLLABLE PIEUP AE CHIEUCH -0x936D 0xBC48 #HANGUL SYLLABLE PIEUP AE KHIEUKH -0x936E 0xBC4A #HANGUL SYLLABLE PIEUP AE PHIEUPH -0x936F 0xBC4B #HANGUL SYLLABLE PIEUP AE HIEUH -0x9370 0xBC4E #HANGUL SYLLABLE PIEUP YA SSANGKIYEOK -0x9371 0xBC4F #HANGUL SYLLABLE PIEUP YA KIYEOKSIOS -0x9372 0xBC51 #HANGUL SYLLABLE PIEUP YA NIEUNCIEUC -0x9373 0xBC52 #HANGUL SYLLABLE PIEUP YA NIEUNHIEUH -0x9374 0xBC53 #HANGUL SYLLABLE PIEUP YA TIKEUT -0x9375 0xBC54 #HANGUL SYLLABLE PIEUP YA RIEUL -0x9376 0xBC55 #HANGUL SYLLABLE PIEUP YA RIEULKIYEOK -0x9377 0xBC56 #HANGUL SYLLABLE PIEUP YA RIEULMIEUM -0x9378 0xBC57 #HANGUL SYLLABLE PIEUP YA RIEULPIEUP -0x9379 0xBC58 #HANGUL SYLLABLE PIEUP YA RIEULSIOS -0x937A 0xBC59 #HANGUL SYLLABLE PIEUP YA RIEULTHIEUTH -0x9381 0xBC5A #HANGUL SYLLABLE PIEUP YA RIEULPHIEUPH -0x9382 0xBC5B #HANGUL SYLLABLE PIEUP YA RIEULHIEUH -0x9383 0xBC5C #HANGUL SYLLABLE PIEUP YA MIEUM -0x9384 0xBC5E #HANGUL SYLLABLE PIEUP YA PIEUPSIOS -0x9385 0xBC5F #HANGUL SYLLABLE PIEUP YA SIOS -0x9386 0xBC60 #HANGUL SYLLABLE PIEUP YA SSANGSIOS -0x9387 0xBC61 #HANGUL SYLLABLE PIEUP YA IEUNG -0x9388 0xBC62 #HANGUL SYLLABLE PIEUP YA CIEUC -0x9389 0xBC63 #HANGUL SYLLABLE PIEUP YA CHIEUCH -0x938A 0xBC64 #HANGUL SYLLABLE PIEUP YA KHIEUKH -0x938B 0xBC65 #HANGUL SYLLABLE PIEUP YA THIEUTH -0x938C 0xBC66 #HANGUL SYLLABLE PIEUP YA PHIEUPH -0x938D 0xBC67 #HANGUL SYLLABLE PIEUP YA HIEUH -0x938E 0xBC68 #HANGUL SYLLABLE PIEUP YAE -0x938F 0xBC69 #HANGUL SYLLABLE PIEUP YAE KIYEOK -0x9390 0xBC6A #HANGUL SYLLABLE PIEUP YAE SSANGKIYEOK -0x9391 0xBC6B #HANGUL SYLLABLE PIEUP YAE KIYEOKSIOS -0x9392 0xBC6C #HANGUL SYLLABLE PIEUP YAE NIEUN -0x9393 0xBC6D #HANGUL SYLLABLE PIEUP YAE NIEUNCIEUC -0x9394 0xBC6E #HANGUL SYLLABLE PIEUP YAE NIEUNHIEUH -0x9395 0xBC6F #HANGUL SYLLABLE PIEUP YAE TIKEUT -0x9396 0xBC70 #HANGUL SYLLABLE PIEUP YAE RIEUL -0x9397 0xBC71 #HANGUL SYLLABLE PIEUP YAE RIEULKIYEOK -0x9398 0xBC72 #HANGUL SYLLABLE PIEUP YAE RIEULMIEUM -0x9399 0xBC73 #HANGUL SYLLABLE PIEUP YAE RIEULPIEUP -0x939A 0xBC74 #HANGUL SYLLABLE PIEUP YAE RIEULSIOS -0x939B 0xBC75 #HANGUL SYLLABLE PIEUP YAE RIEULTHIEUTH -0x939C 0xBC76 #HANGUL SYLLABLE PIEUP YAE RIEULPHIEUPH -0x939D 0xBC77 #HANGUL SYLLABLE PIEUP YAE RIEULHIEUH -0x939E 0xBC78 #HANGUL SYLLABLE PIEUP YAE MIEUM -0x939F 0xBC79 #HANGUL SYLLABLE PIEUP YAE PIEUP -0x93A0 0xBC7A #HANGUL SYLLABLE PIEUP YAE PIEUPSIOS -0x93A1 0xBC7B #HANGUL SYLLABLE PIEUP YAE SIOS -0x93A2 0xBC7C #HANGUL SYLLABLE PIEUP YAE SSANGSIOS -0x93A3 0xBC7D #HANGUL SYLLABLE PIEUP YAE IEUNG -0x93A4 0xBC7E #HANGUL SYLLABLE PIEUP YAE CIEUC -0x93A5 0xBC7F #HANGUL SYLLABLE PIEUP YAE CHIEUCH -0x93A6 0xBC80 #HANGUL SYLLABLE PIEUP YAE KHIEUKH -0x93A7 0xBC81 #HANGUL SYLLABLE PIEUP YAE THIEUTH -0x93A8 0xBC82 #HANGUL SYLLABLE PIEUP YAE PHIEUPH -0x93A9 0xBC83 #HANGUL SYLLABLE PIEUP YAE HIEUH -0x93AA 0xBC86 #HANGUL SYLLABLE PIEUP EO SSANGKIYEOK -0x93AB 0xBC87 #HANGUL SYLLABLE PIEUP EO KIYEOKSIOS -0x93AC 0xBC89 #HANGUL SYLLABLE PIEUP EO NIEUNCIEUC -0x93AD 0xBC8A #HANGUL SYLLABLE PIEUP EO NIEUNHIEUH -0x93AE 0xBC8D #HANGUL SYLLABLE PIEUP EO RIEULKIYEOK -0x93AF 0xBC8F #HANGUL SYLLABLE PIEUP EO RIEULPIEUP -0x93B0 0xBC90 #HANGUL SYLLABLE PIEUP EO RIEULSIOS -0x93B1 0xBC91 #HANGUL SYLLABLE PIEUP EO RIEULTHIEUTH -0x93B2 0xBC92 #HANGUL SYLLABLE PIEUP EO RIEULPHIEUPH -0x93B3 0xBC93 #HANGUL SYLLABLE PIEUP EO RIEULHIEUH -0x93B4 0xBC96 #HANGUL SYLLABLE PIEUP EO PIEUPSIOS -0x93B5 0xBC98 #HANGUL SYLLABLE PIEUP EO SSANGSIOS -0x93B6 0xBC9B #HANGUL SYLLABLE PIEUP EO CHIEUCH -0x93B7 0xBC9C #HANGUL SYLLABLE PIEUP EO KHIEUKH -0x93B8 0xBC9D #HANGUL SYLLABLE PIEUP EO THIEUTH -0x93B9 0xBC9E #HANGUL SYLLABLE PIEUP EO PHIEUPH -0x93BA 0xBC9F #HANGUL SYLLABLE PIEUP EO HIEUH -0x93BB 0xBCA2 #HANGUL SYLLABLE PIEUP E SSANGKIYEOK -0x93BC 0xBCA3 #HANGUL SYLLABLE PIEUP E KIYEOKSIOS -0x93BD 0xBCA5 #HANGUL SYLLABLE PIEUP E NIEUNCIEUC -0x93BE 0xBCA6 #HANGUL SYLLABLE PIEUP E NIEUNHIEUH -0x93BF 0xBCA9 #HANGUL SYLLABLE PIEUP E RIEULKIYEOK -0x93C0 0xBCAA #HANGUL SYLLABLE PIEUP E RIEULMIEUM -0x93C1 0xBCAB #HANGUL SYLLABLE PIEUP E RIEULPIEUP -0x93C2 0xBCAC #HANGUL SYLLABLE PIEUP E RIEULSIOS -0x93C3 0xBCAD #HANGUL SYLLABLE PIEUP E RIEULTHIEUTH -0x93C4 0xBCAE #HANGUL SYLLABLE PIEUP E RIEULPHIEUPH -0x93C5 0xBCAF #HANGUL SYLLABLE PIEUP E RIEULHIEUH -0x93C6 0xBCB2 #HANGUL SYLLABLE PIEUP E PIEUPSIOS -0x93C7 0xBCB6 #HANGUL SYLLABLE PIEUP E CIEUC -0x93C8 0xBCB7 #HANGUL SYLLABLE PIEUP E CHIEUCH -0x93C9 0xBCB8 #HANGUL SYLLABLE PIEUP E KHIEUKH -0x93CA 0xBCB9 #HANGUL SYLLABLE PIEUP E THIEUTH -0x93CB 0xBCBA #HANGUL SYLLABLE PIEUP E PHIEUPH -0x93CC 0xBCBB #HANGUL SYLLABLE PIEUP E HIEUH -0x93CD 0xBCBE #HANGUL SYLLABLE PIEUP YEO SSANGKIYEOK -0x93CE 0xBCBF #HANGUL SYLLABLE PIEUP YEO KIYEOKSIOS -0x93CF 0xBCC1 #HANGUL SYLLABLE PIEUP YEO NIEUNCIEUC -0x93D0 0xBCC2 #HANGUL SYLLABLE PIEUP YEO NIEUNHIEUH -0x93D1 0xBCC3 #HANGUL SYLLABLE PIEUP YEO TIKEUT -0x93D2 0xBCC5 #HANGUL SYLLABLE PIEUP YEO RIEULKIYEOK -0x93D3 0xBCC6 #HANGUL SYLLABLE PIEUP YEO RIEULMIEUM -0x93D4 0xBCC7 #HANGUL SYLLABLE PIEUP YEO RIEULPIEUP -0x93D5 0xBCC8 #HANGUL SYLLABLE PIEUP YEO RIEULSIOS -0x93D6 0xBCC9 #HANGUL SYLLABLE PIEUP YEO RIEULTHIEUTH -0x93D7 0xBCCA #HANGUL SYLLABLE PIEUP YEO RIEULPHIEUPH -0x93D8 0xBCCB #HANGUL SYLLABLE PIEUP YEO RIEULHIEUH -0x93D9 0xBCCC #HANGUL SYLLABLE PIEUP YEO MIEUM -0x93DA 0xBCCE #HANGUL SYLLABLE PIEUP YEO PIEUPSIOS -0x93DB 0xBCD2 #HANGUL SYLLABLE PIEUP YEO CIEUC -0x93DC 0xBCD3 #HANGUL SYLLABLE PIEUP YEO CHIEUCH -0x93DD 0xBCD4 #HANGUL SYLLABLE PIEUP YEO KHIEUKH -0x93DE 0xBCD6 #HANGUL SYLLABLE PIEUP YEO PHIEUPH -0x93DF 0xBCD7 #HANGUL SYLLABLE PIEUP YEO HIEUH -0x93E0 0xBCD9 #HANGUL SYLLABLE PIEUP YE KIYEOK -0x93E1 0xBCDA #HANGUL SYLLABLE PIEUP YE SSANGKIYEOK -0x93E2 0xBCDB #HANGUL SYLLABLE PIEUP YE KIYEOKSIOS -0x93E3 0xBCDD #HANGUL SYLLABLE PIEUP YE NIEUNCIEUC -0x93E4 0xBCDE #HANGUL SYLLABLE PIEUP YE NIEUNHIEUH -0x93E5 0xBCDF #HANGUL SYLLABLE PIEUP YE TIKEUT -0x93E6 0xBCE0 #HANGUL SYLLABLE PIEUP YE RIEUL -0x93E7 0xBCE1 #HANGUL SYLLABLE PIEUP YE RIEULKIYEOK -0x93E8 0xBCE2 #HANGUL SYLLABLE PIEUP YE RIEULMIEUM -0x93E9 0xBCE3 #HANGUL SYLLABLE PIEUP YE RIEULPIEUP -0x93EA 0xBCE4 #HANGUL SYLLABLE PIEUP YE RIEULSIOS -0x93EB 0xBCE5 #HANGUL SYLLABLE PIEUP YE RIEULTHIEUTH -0x93EC 0xBCE6 #HANGUL SYLLABLE PIEUP YE RIEULPHIEUPH -0x93ED 0xBCE7 #HANGUL SYLLABLE PIEUP YE RIEULHIEUH -0x93EE 0xBCE8 #HANGUL SYLLABLE PIEUP YE MIEUM -0x93EF 0xBCE9 #HANGUL SYLLABLE PIEUP YE PIEUP -0x93F0 0xBCEA #HANGUL SYLLABLE PIEUP YE PIEUPSIOS -0x93F1 0xBCEB #HANGUL SYLLABLE PIEUP YE SIOS -0x93F2 0xBCEC #HANGUL SYLLABLE PIEUP YE SSANGSIOS -0x93F3 0xBCED #HANGUL SYLLABLE PIEUP YE IEUNG -0x93F4 0xBCEE #HANGUL SYLLABLE PIEUP YE CIEUC -0x93F5 0xBCEF #HANGUL SYLLABLE PIEUP YE CHIEUCH -0x93F6 0xBCF0 #HANGUL SYLLABLE PIEUP YE KHIEUKH -0x93F7 0xBCF1 #HANGUL SYLLABLE PIEUP YE THIEUTH -0x93F8 0xBCF2 #HANGUL SYLLABLE PIEUP YE PHIEUPH -0x93F9 0xBCF3 #HANGUL SYLLABLE PIEUP YE HIEUH -0x93FA 0xBCF7 #HANGUL SYLLABLE PIEUP O KIYEOKSIOS -0x93FB 0xBCF9 #HANGUL SYLLABLE PIEUP O NIEUNCIEUC -0x93FC 0xBCFA #HANGUL SYLLABLE PIEUP O NIEUNHIEUH -0x93FD 0xBCFB #HANGUL SYLLABLE PIEUP O TIKEUT -0x93FE 0xBCFD #HANGUL SYLLABLE PIEUP O RIEULKIYEOK -0x9441 0xBCFE #HANGUL SYLLABLE PIEUP O RIEULMIEUM -0x9442 0xBCFF #HANGUL SYLLABLE PIEUP O RIEULPIEUP -0x9443 0xBD00 #HANGUL SYLLABLE PIEUP O RIEULSIOS -0x9444 0xBD01 #HANGUL SYLLABLE PIEUP O RIEULTHIEUTH -0x9445 0xBD02 #HANGUL SYLLABLE PIEUP O RIEULPHIEUPH -0x9446 0xBD03 #HANGUL SYLLABLE PIEUP O RIEULHIEUH -0x9447 0xBD06 #HANGUL SYLLABLE PIEUP O PIEUPSIOS -0x9448 0xBD08 #HANGUL SYLLABLE PIEUP O SSANGSIOS -0x9449 0xBD0A #HANGUL SYLLABLE PIEUP O CIEUC -0x944A 0xBD0B #HANGUL SYLLABLE PIEUP O CHIEUCH -0x944B 0xBD0C #HANGUL SYLLABLE PIEUP O KHIEUKH -0x944C 0xBD0D #HANGUL SYLLABLE PIEUP O THIEUTH -0x944D 0xBD0E #HANGUL SYLLABLE PIEUP O PHIEUPH -0x944E 0xBD0F #HANGUL SYLLABLE PIEUP O HIEUH -0x944F 0xBD11 #HANGUL SYLLABLE PIEUP WA KIYEOK -0x9450 0xBD12 #HANGUL SYLLABLE PIEUP WA SSANGKIYEOK -0x9451 0xBD13 #HANGUL SYLLABLE PIEUP WA KIYEOKSIOS -0x9452 0xBD15 #HANGUL SYLLABLE PIEUP WA NIEUNCIEUC -0x9453 0xBD16 #HANGUL SYLLABLE PIEUP WA NIEUNHIEUH -0x9454 0xBD17 #HANGUL SYLLABLE PIEUP WA TIKEUT -0x9455 0xBD18 #HANGUL SYLLABLE PIEUP WA RIEUL -0x9456 0xBD19 #HANGUL SYLLABLE PIEUP WA RIEULKIYEOK -0x9457 0xBD1A #HANGUL SYLLABLE PIEUP WA RIEULMIEUM -0x9458 0xBD1B #HANGUL SYLLABLE PIEUP WA RIEULPIEUP -0x9459 0xBD1C #HANGUL SYLLABLE PIEUP WA RIEULSIOS -0x945A 0xBD1D #HANGUL SYLLABLE PIEUP WA RIEULTHIEUTH -0x9461 0xBD1E #HANGUL SYLLABLE PIEUP WA RIEULPHIEUPH -0x9462 0xBD1F #HANGUL SYLLABLE PIEUP WA RIEULHIEUH -0x9463 0xBD20 #HANGUL SYLLABLE PIEUP WA MIEUM -0x9464 0xBD21 #HANGUL SYLLABLE PIEUP WA PIEUP -0x9465 0xBD22 #HANGUL SYLLABLE PIEUP WA PIEUPSIOS -0x9466 0xBD23 #HANGUL SYLLABLE PIEUP WA SIOS -0x9467 0xBD25 #HANGUL SYLLABLE PIEUP WA IEUNG -0x9468 0xBD26 #HANGUL SYLLABLE PIEUP WA CIEUC -0x9469 0xBD27 #HANGUL SYLLABLE PIEUP WA CHIEUCH -0x946A 0xBD28 #HANGUL SYLLABLE PIEUP WA KHIEUKH -0x946B 0xBD29 #HANGUL SYLLABLE PIEUP WA THIEUTH -0x946C 0xBD2A #HANGUL SYLLABLE PIEUP WA PHIEUPH -0x946D 0xBD2B #HANGUL SYLLABLE PIEUP WA HIEUH -0x946E 0xBD2D #HANGUL SYLLABLE PIEUP WAE KIYEOK -0x946F 0xBD2E #HANGUL SYLLABLE PIEUP WAE SSANGKIYEOK -0x9470 0xBD2F #HANGUL SYLLABLE PIEUP WAE KIYEOKSIOS -0x9471 0xBD30 #HANGUL SYLLABLE PIEUP WAE NIEUN -0x9472 0xBD31 #HANGUL SYLLABLE PIEUP WAE NIEUNCIEUC -0x9473 0xBD32 #HANGUL SYLLABLE PIEUP WAE NIEUNHIEUH -0x9474 0xBD33 #HANGUL SYLLABLE PIEUP WAE TIKEUT -0x9475 0xBD34 #HANGUL SYLLABLE PIEUP WAE RIEUL -0x9476 0xBD35 #HANGUL SYLLABLE PIEUP WAE RIEULKIYEOK -0x9477 0xBD36 #HANGUL SYLLABLE PIEUP WAE RIEULMIEUM -0x9478 0xBD37 #HANGUL SYLLABLE PIEUP WAE RIEULPIEUP -0x9479 0xBD38 #HANGUL SYLLABLE PIEUP WAE RIEULSIOS -0x947A 0xBD39 #HANGUL SYLLABLE PIEUP WAE RIEULTHIEUTH -0x9481 0xBD3A #HANGUL SYLLABLE PIEUP WAE RIEULPHIEUPH -0x9482 0xBD3B #HANGUL SYLLABLE PIEUP WAE RIEULHIEUH -0x9483 0xBD3C #HANGUL SYLLABLE PIEUP WAE MIEUM -0x9484 0xBD3D #HANGUL SYLLABLE PIEUP WAE PIEUP -0x9485 0xBD3E #HANGUL SYLLABLE PIEUP WAE PIEUPSIOS -0x9486 0xBD3F #HANGUL SYLLABLE PIEUP WAE SIOS -0x9487 0xBD41 #HANGUL SYLLABLE PIEUP WAE IEUNG -0x9488 0xBD42 #HANGUL SYLLABLE PIEUP WAE CIEUC -0x9489 0xBD43 #HANGUL SYLLABLE PIEUP WAE CHIEUCH -0x948A 0xBD44 #HANGUL SYLLABLE PIEUP WAE KHIEUKH -0x948B 0xBD45 #HANGUL SYLLABLE PIEUP WAE THIEUTH -0x948C 0xBD46 #HANGUL SYLLABLE PIEUP WAE PHIEUPH -0x948D 0xBD47 #HANGUL SYLLABLE PIEUP WAE HIEUH -0x948E 0xBD4A #HANGUL SYLLABLE PIEUP OE SSANGKIYEOK -0x948F 0xBD4B #HANGUL SYLLABLE PIEUP OE KIYEOKSIOS -0x9490 0xBD4D #HANGUL SYLLABLE PIEUP OE NIEUNCIEUC -0x9491 0xBD4E #HANGUL SYLLABLE PIEUP OE NIEUNHIEUH -0x9492 0xBD4F #HANGUL SYLLABLE PIEUP OE TIKEUT -0x9493 0xBD51 #HANGUL SYLLABLE PIEUP OE RIEULKIYEOK -0x9494 0xBD52 #HANGUL SYLLABLE PIEUP OE RIEULMIEUM -0x9495 0xBD53 #HANGUL SYLLABLE PIEUP OE RIEULPIEUP -0x9496 0xBD54 #HANGUL SYLLABLE PIEUP OE RIEULSIOS -0x9497 0xBD55 #HANGUL SYLLABLE PIEUP OE RIEULTHIEUTH -0x9498 0xBD56 #HANGUL SYLLABLE PIEUP OE RIEULPHIEUPH -0x9499 0xBD57 #HANGUL SYLLABLE PIEUP OE RIEULHIEUH -0x949A 0xBD5A #HANGUL SYLLABLE PIEUP OE PIEUPSIOS -0x949B 0xBD5B #HANGUL SYLLABLE PIEUP OE SIOS -0x949C 0xBD5C #HANGUL SYLLABLE PIEUP OE SSANGSIOS -0x949D 0xBD5D #HANGUL SYLLABLE PIEUP OE IEUNG -0x949E 0xBD5E #HANGUL SYLLABLE PIEUP OE CIEUC -0x949F 0xBD5F #HANGUL SYLLABLE PIEUP OE CHIEUCH -0x94A0 0xBD60 #HANGUL SYLLABLE PIEUP OE KHIEUKH -0x94A1 0xBD61 #HANGUL SYLLABLE PIEUP OE THIEUTH -0x94A2 0xBD62 #HANGUL SYLLABLE PIEUP OE PHIEUPH -0x94A3 0xBD63 #HANGUL SYLLABLE PIEUP OE HIEUH -0x94A4 0xBD65 #HANGUL SYLLABLE PIEUP YO KIYEOK -0x94A5 0xBD66 #HANGUL SYLLABLE PIEUP YO SSANGKIYEOK -0x94A6 0xBD67 #HANGUL SYLLABLE PIEUP YO KIYEOKSIOS -0x94A7 0xBD69 #HANGUL SYLLABLE PIEUP YO NIEUNCIEUC -0x94A8 0xBD6A #HANGUL SYLLABLE PIEUP YO NIEUNHIEUH -0x94A9 0xBD6B #HANGUL SYLLABLE PIEUP YO TIKEUT -0x94AA 0xBD6C #HANGUL SYLLABLE PIEUP YO RIEUL -0x94AB 0xBD6D #HANGUL SYLLABLE PIEUP YO RIEULKIYEOK -0x94AC 0xBD6E #HANGUL SYLLABLE PIEUP YO RIEULMIEUM -0x94AD 0xBD6F #HANGUL SYLLABLE PIEUP YO RIEULPIEUP -0x94AE 0xBD70 #HANGUL SYLLABLE PIEUP YO RIEULSIOS -0x94AF 0xBD71 #HANGUL SYLLABLE PIEUP YO RIEULTHIEUTH -0x94B0 0xBD72 #HANGUL SYLLABLE PIEUP YO RIEULPHIEUPH -0x94B1 0xBD73 #HANGUL SYLLABLE PIEUP YO RIEULHIEUH -0x94B2 0xBD74 #HANGUL SYLLABLE PIEUP YO MIEUM -0x94B3 0xBD75 #HANGUL SYLLABLE PIEUP YO PIEUP -0x94B4 0xBD76 #HANGUL SYLLABLE PIEUP YO PIEUPSIOS -0x94B5 0xBD77 #HANGUL SYLLABLE PIEUP YO SIOS -0x94B6 0xBD78 #HANGUL SYLLABLE PIEUP YO SSANGSIOS -0x94B7 0xBD79 #HANGUL SYLLABLE PIEUP YO IEUNG -0x94B8 0xBD7A #HANGUL SYLLABLE PIEUP YO CIEUC -0x94B9 0xBD7B #HANGUL SYLLABLE PIEUP YO CHIEUCH -0x94BA 0xBD7C #HANGUL SYLLABLE PIEUP YO KHIEUKH -0x94BB 0xBD7D #HANGUL SYLLABLE PIEUP YO THIEUTH -0x94BC 0xBD7E #HANGUL SYLLABLE PIEUP YO PHIEUPH -0x94BD 0xBD7F #HANGUL SYLLABLE PIEUP YO HIEUH -0x94BE 0xBD82 #HANGUL SYLLABLE PIEUP U SSANGKIYEOK -0x94BF 0xBD83 #HANGUL SYLLABLE PIEUP U KIYEOKSIOS -0x94C0 0xBD85 #HANGUL SYLLABLE PIEUP U NIEUNCIEUC -0x94C1 0xBD86 #HANGUL SYLLABLE PIEUP U NIEUNHIEUH -0x94C2 0xBD8B #HANGUL SYLLABLE PIEUP U RIEULPIEUP -0x94C3 0xBD8C #HANGUL SYLLABLE PIEUP U RIEULSIOS -0x94C4 0xBD8D #HANGUL SYLLABLE PIEUP U RIEULTHIEUTH -0x94C5 0xBD8E #HANGUL SYLLABLE PIEUP U RIEULPHIEUPH -0x94C6 0xBD8F #HANGUL SYLLABLE PIEUP U RIEULHIEUH -0x94C7 0xBD92 #HANGUL SYLLABLE PIEUP U PIEUPSIOS -0x94C8 0xBD94 #HANGUL SYLLABLE PIEUP U SSANGSIOS -0x94C9 0xBD96 #HANGUL SYLLABLE PIEUP U CIEUC -0x94CA 0xBD97 #HANGUL SYLLABLE PIEUP U CHIEUCH -0x94CB 0xBD98 #HANGUL SYLLABLE PIEUP U KHIEUKH -0x94CC 0xBD9B #HANGUL SYLLABLE PIEUP U HIEUH -0x94CD 0xBD9D #HANGUL SYLLABLE PIEUP WEO KIYEOK -0x94CE 0xBD9E #HANGUL SYLLABLE PIEUP WEO SSANGKIYEOK -0x94CF 0xBD9F #HANGUL SYLLABLE PIEUP WEO KIYEOKSIOS -0x94D0 0xBDA0 #HANGUL SYLLABLE PIEUP WEO NIEUN -0x94D1 0xBDA1 #HANGUL SYLLABLE PIEUP WEO NIEUNCIEUC -0x94D2 0xBDA2 #HANGUL SYLLABLE PIEUP WEO NIEUNHIEUH -0x94D3 0xBDA3 #HANGUL SYLLABLE PIEUP WEO TIKEUT -0x94D4 0xBDA5 #HANGUL SYLLABLE PIEUP WEO RIEULKIYEOK -0x94D5 0xBDA6 #HANGUL SYLLABLE PIEUP WEO RIEULMIEUM -0x94D6 0xBDA7 #HANGUL SYLLABLE PIEUP WEO RIEULPIEUP -0x94D7 0xBDA8 #HANGUL SYLLABLE PIEUP WEO RIEULSIOS -0x94D8 0xBDA9 #HANGUL SYLLABLE PIEUP WEO RIEULTHIEUTH -0x94D9 0xBDAA #HANGUL SYLLABLE PIEUP WEO RIEULPHIEUPH -0x94DA 0xBDAB #HANGUL SYLLABLE PIEUP WEO RIEULHIEUH -0x94DB 0xBDAC #HANGUL SYLLABLE PIEUP WEO MIEUM -0x94DC 0xBDAD #HANGUL SYLLABLE PIEUP WEO PIEUP -0x94DD 0xBDAE #HANGUL SYLLABLE PIEUP WEO PIEUPSIOS -0x94DE 0xBDAF #HANGUL SYLLABLE PIEUP WEO SIOS -0x94DF 0xBDB1 #HANGUL SYLLABLE PIEUP WEO IEUNG -0x94E0 0xBDB2 #HANGUL SYLLABLE PIEUP WEO CIEUC -0x94E1 0xBDB3 #HANGUL SYLLABLE PIEUP WEO CHIEUCH -0x94E2 0xBDB4 #HANGUL SYLLABLE PIEUP WEO KHIEUKH -0x94E3 0xBDB5 #HANGUL SYLLABLE PIEUP WEO THIEUTH -0x94E4 0xBDB6 #HANGUL SYLLABLE PIEUP WEO PHIEUPH -0x94E5 0xBDB7 #HANGUL SYLLABLE PIEUP WEO HIEUH -0x94E6 0xBDB9 #HANGUL SYLLABLE PIEUP WE KIYEOK -0x94E7 0xBDBA #HANGUL SYLLABLE PIEUP WE SSANGKIYEOK -0x94E8 0xBDBB #HANGUL SYLLABLE PIEUP WE KIYEOKSIOS -0x94E9 0xBDBC #HANGUL SYLLABLE PIEUP WE NIEUN -0x94EA 0xBDBD #HANGUL SYLLABLE PIEUP WE NIEUNCIEUC -0x94EB 0xBDBE #HANGUL SYLLABLE PIEUP WE NIEUNHIEUH -0x94EC 0xBDBF #HANGUL SYLLABLE PIEUP WE TIKEUT -0x94ED 0xBDC0 #HANGUL SYLLABLE PIEUP WE RIEUL -0x94EE 0xBDC1 #HANGUL SYLLABLE PIEUP WE RIEULKIYEOK -0x94EF 0xBDC2 #HANGUL SYLLABLE PIEUP WE RIEULMIEUM -0x94F0 0xBDC3 #HANGUL SYLLABLE PIEUP WE RIEULPIEUP -0x94F1 0xBDC4 #HANGUL SYLLABLE PIEUP WE RIEULSIOS -0x94F2 0xBDC5 #HANGUL SYLLABLE PIEUP WE RIEULTHIEUTH -0x94F3 0xBDC6 #HANGUL SYLLABLE PIEUP WE RIEULPHIEUPH -0x94F4 0xBDC7 #HANGUL SYLLABLE PIEUP WE RIEULHIEUH -0x94F5 0xBDC8 #HANGUL SYLLABLE PIEUP WE MIEUM -0x94F6 0xBDC9 #HANGUL SYLLABLE PIEUP WE PIEUP -0x94F7 0xBDCA #HANGUL SYLLABLE PIEUP WE PIEUPSIOS -0x94F8 0xBDCB #HANGUL SYLLABLE PIEUP WE SIOS -0x94F9 0xBDCC #HANGUL SYLLABLE PIEUP WE SSANGSIOS -0x94FA 0xBDCD #HANGUL SYLLABLE PIEUP WE IEUNG -0x94FB 0xBDCE #HANGUL SYLLABLE PIEUP WE CIEUC -0x94FC 0xBDCF #HANGUL SYLLABLE PIEUP WE CHIEUCH -0x94FD 0xBDD0 #HANGUL SYLLABLE PIEUP WE KHIEUKH -0x94FE 0xBDD1 #HANGUL SYLLABLE PIEUP WE THIEUTH -0x9541 0xBDD2 #HANGUL SYLLABLE PIEUP WE PHIEUPH -0x9542 0xBDD3 #HANGUL SYLLABLE PIEUP WE HIEUH -0x9543 0xBDD6 #HANGUL SYLLABLE PIEUP WI SSANGKIYEOK -0x9544 0xBDD7 #HANGUL SYLLABLE PIEUP WI KIYEOKSIOS -0x9545 0xBDD9 #HANGUL SYLLABLE PIEUP WI NIEUNCIEUC -0x9546 0xBDDA #HANGUL SYLLABLE PIEUP WI NIEUNHIEUH -0x9547 0xBDDB #HANGUL SYLLABLE PIEUP WI TIKEUT -0x9548 0xBDDD #HANGUL SYLLABLE PIEUP WI RIEULKIYEOK -0x9549 0xBDDE #HANGUL SYLLABLE PIEUP WI RIEULMIEUM -0x954A 0xBDDF #HANGUL SYLLABLE PIEUP WI RIEULPIEUP -0x954B 0xBDE0 #HANGUL SYLLABLE PIEUP WI RIEULSIOS -0x954C 0xBDE1 #HANGUL SYLLABLE PIEUP WI RIEULTHIEUTH -0x954D 0xBDE2 #HANGUL SYLLABLE PIEUP WI RIEULPHIEUPH -0x954E 0xBDE3 #HANGUL SYLLABLE PIEUP WI RIEULHIEUH -0x954F 0xBDE4 #HANGUL SYLLABLE PIEUP WI MIEUM -0x9550 0xBDE5 #HANGUL SYLLABLE PIEUP WI PIEUP -0x9551 0xBDE6 #HANGUL SYLLABLE PIEUP WI PIEUPSIOS -0x9552 0xBDE7 #HANGUL SYLLABLE PIEUP WI SIOS -0x9553 0xBDE8 #HANGUL SYLLABLE PIEUP WI SSANGSIOS -0x9554 0xBDEA #HANGUL SYLLABLE PIEUP WI CIEUC -0x9555 0xBDEB #HANGUL SYLLABLE PIEUP WI CHIEUCH -0x9556 0xBDEC #HANGUL SYLLABLE PIEUP WI KHIEUKH -0x9557 0xBDED #HANGUL SYLLABLE PIEUP WI THIEUTH -0x9558 0xBDEE #HANGUL SYLLABLE PIEUP WI PHIEUPH -0x9559 0xBDEF #HANGUL SYLLABLE PIEUP WI HIEUH -0x955A 0xBDF1 #HANGUL SYLLABLE PIEUP YU KIYEOK -0x9561 0xBDF2 #HANGUL SYLLABLE PIEUP YU SSANGKIYEOK -0x9562 0xBDF3 #HANGUL SYLLABLE PIEUP YU KIYEOKSIOS -0x9563 0xBDF5 #HANGUL SYLLABLE PIEUP YU NIEUNCIEUC -0x9564 0xBDF6 #HANGUL SYLLABLE PIEUP YU NIEUNHIEUH -0x9565 0xBDF7 #HANGUL SYLLABLE PIEUP YU TIKEUT -0x9566 0xBDF9 #HANGUL SYLLABLE PIEUP YU RIEULKIYEOK -0x9567 0xBDFA #HANGUL SYLLABLE PIEUP YU RIEULMIEUM -0x9568 0xBDFB #HANGUL SYLLABLE PIEUP YU RIEULPIEUP -0x9569 0xBDFC #HANGUL SYLLABLE PIEUP YU RIEULSIOS -0x956A 0xBDFD #HANGUL SYLLABLE PIEUP YU RIEULTHIEUTH -0x956B 0xBDFE #HANGUL SYLLABLE PIEUP YU RIEULPHIEUPH -0x956C 0xBDFF #HANGUL SYLLABLE PIEUP YU RIEULHIEUH -0x956D 0xBE01 #HANGUL SYLLABLE PIEUP YU PIEUP -0x956E 0xBE02 #HANGUL SYLLABLE PIEUP YU PIEUPSIOS -0x956F 0xBE04 #HANGUL SYLLABLE PIEUP YU SSANGSIOS -0x9570 0xBE06 #HANGUL SYLLABLE PIEUP YU CIEUC -0x9571 0xBE07 #HANGUL SYLLABLE PIEUP YU CHIEUCH -0x9572 0xBE08 #HANGUL SYLLABLE PIEUP YU KHIEUKH -0x9573 0xBE09 #HANGUL SYLLABLE PIEUP YU THIEUTH -0x9574 0xBE0A #HANGUL SYLLABLE PIEUP YU PHIEUPH -0x9575 0xBE0B #HANGUL SYLLABLE PIEUP YU HIEUH -0x9576 0xBE0E #HANGUL SYLLABLE PIEUP EU SSANGKIYEOK -0x9577 0xBE0F #HANGUL SYLLABLE PIEUP EU KIYEOKSIOS -0x9578 0xBE11 #HANGUL SYLLABLE PIEUP EU NIEUNCIEUC -0x9579 0xBE12 #HANGUL SYLLABLE PIEUP EU NIEUNHIEUH -0x957A 0xBE13 #HANGUL SYLLABLE PIEUP EU TIKEUT -0x9581 0xBE15 #HANGUL SYLLABLE PIEUP EU RIEULKIYEOK -0x9582 0xBE16 #HANGUL SYLLABLE PIEUP EU RIEULMIEUM -0x9583 0xBE17 #HANGUL SYLLABLE PIEUP EU RIEULPIEUP -0x9584 0xBE18 #HANGUL SYLLABLE PIEUP EU RIEULSIOS -0x9585 0xBE19 #HANGUL SYLLABLE PIEUP EU RIEULTHIEUTH -0x9586 0xBE1A #HANGUL SYLLABLE PIEUP EU RIEULPHIEUPH -0x9587 0xBE1B #HANGUL SYLLABLE PIEUP EU RIEULHIEUH -0x9588 0xBE1E #HANGUL SYLLABLE PIEUP EU PIEUPSIOS -0x9589 0xBE20 #HANGUL SYLLABLE PIEUP EU SSANGSIOS -0x958A 0xBE21 #HANGUL SYLLABLE PIEUP EU IEUNG -0x958B 0xBE22 #HANGUL SYLLABLE PIEUP EU CIEUC -0x958C 0xBE23 #HANGUL SYLLABLE PIEUP EU CHIEUCH -0x958D 0xBE24 #HANGUL SYLLABLE PIEUP EU KHIEUKH -0x958E 0xBE25 #HANGUL SYLLABLE PIEUP EU THIEUTH -0x958F 0xBE26 #HANGUL SYLLABLE PIEUP EU PHIEUPH -0x9590 0xBE27 #HANGUL SYLLABLE PIEUP EU HIEUH -0x9591 0xBE28 #HANGUL SYLLABLE PIEUP YI -0x9592 0xBE29 #HANGUL SYLLABLE PIEUP YI KIYEOK -0x9593 0xBE2A #HANGUL SYLLABLE PIEUP YI SSANGKIYEOK -0x9594 0xBE2B #HANGUL SYLLABLE PIEUP YI KIYEOKSIOS -0x9595 0xBE2C #HANGUL SYLLABLE PIEUP YI NIEUN -0x9596 0xBE2D #HANGUL SYLLABLE PIEUP YI NIEUNCIEUC -0x9597 0xBE2E #HANGUL SYLLABLE PIEUP YI NIEUNHIEUH -0x9598 0xBE2F #HANGUL SYLLABLE PIEUP YI TIKEUT -0x9599 0xBE30 #HANGUL SYLLABLE PIEUP YI RIEUL -0x959A 0xBE31 #HANGUL SYLLABLE PIEUP YI RIEULKIYEOK -0x959B 0xBE32 #HANGUL SYLLABLE PIEUP YI RIEULMIEUM -0x959C 0xBE33 #HANGUL SYLLABLE PIEUP YI RIEULPIEUP -0x959D 0xBE34 #HANGUL SYLLABLE PIEUP YI RIEULSIOS -0x959E 0xBE35 #HANGUL SYLLABLE PIEUP YI RIEULTHIEUTH -0x959F 0xBE36 #HANGUL SYLLABLE PIEUP YI RIEULPHIEUPH -0x95A0 0xBE37 #HANGUL SYLLABLE PIEUP YI RIEULHIEUH -0x95A1 0xBE38 #HANGUL SYLLABLE PIEUP YI MIEUM -0x95A2 0xBE39 #HANGUL SYLLABLE PIEUP YI PIEUP -0x95A3 0xBE3A #HANGUL SYLLABLE PIEUP YI PIEUPSIOS -0x95A4 0xBE3B #HANGUL SYLLABLE PIEUP YI SIOS -0x95A5 0xBE3C #HANGUL SYLLABLE PIEUP YI SSANGSIOS -0x95A6 0xBE3D #HANGUL SYLLABLE PIEUP YI IEUNG -0x95A7 0xBE3E #HANGUL SYLLABLE PIEUP YI CIEUC -0x95A8 0xBE3F #HANGUL SYLLABLE PIEUP YI CHIEUCH -0x95A9 0xBE40 #HANGUL SYLLABLE PIEUP YI KHIEUKH -0x95AA 0xBE41 #HANGUL SYLLABLE PIEUP YI THIEUTH -0x95AB 0xBE42 #HANGUL SYLLABLE PIEUP YI PHIEUPH -0x95AC 0xBE43 #HANGUL SYLLABLE PIEUP YI HIEUH -0x95AD 0xBE46 #HANGUL SYLLABLE PIEUP I SSANGKIYEOK -0x95AE 0xBE47 #HANGUL SYLLABLE PIEUP I KIYEOKSIOS -0x95AF 0xBE49 #HANGUL SYLLABLE PIEUP I NIEUNCIEUC -0x95B0 0xBE4A #HANGUL SYLLABLE PIEUP I NIEUNHIEUH -0x95B1 0xBE4B #HANGUL SYLLABLE PIEUP I TIKEUT -0x95B2 0xBE4D #HANGUL SYLLABLE PIEUP I RIEULKIYEOK -0x95B3 0xBE4F #HANGUL SYLLABLE PIEUP I RIEULPIEUP -0x95B4 0xBE50 #HANGUL SYLLABLE PIEUP I RIEULSIOS -0x95B5 0xBE51 #HANGUL SYLLABLE PIEUP I RIEULTHIEUTH -0x95B6 0xBE52 #HANGUL SYLLABLE PIEUP I RIEULPHIEUPH -0x95B7 0xBE53 #HANGUL SYLLABLE PIEUP I RIEULHIEUH -0x95B8 0xBE56 #HANGUL SYLLABLE PIEUP I PIEUPSIOS -0x95B9 0xBE58 #HANGUL SYLLABLE PIEUP I SSANGSIOS -0x95BA 0xBE5C #HANGUL SYLLABLE PIEUP I KHIEUKH -0x95BB 0xBE5D #HANGUL SYLLABLE PIEUP I THIEUTH -0x95BC 0xBE5E #HANGUL SYLLABLE PIEUP I PHIEUPH -0x95BD 0xBE5F #HANGUL SYLLABLE PIEUP I HIEUH -0x95BE 0xBE62 #HANGUL SYLLABLE SSANGPIEUP A SSANGKIYEOK -0x95BF 0xBE63 #HANGUL SYLLABLE SSANGPIEUP A KIYEOKSIOS -0x95C0 0xBE65 #HANGUL SYLLABLE SSANGPIEUP A NIEUNCIEUC -0x95C1 0xBE66 #HANGUL SYLLABLE SSANGPIEUP A NIEUNHIEUH -0x95C2 0xBE67 #HANGUL SYLLABLE SSANGPIEUP A TIKEUT -0x95C3 0xBE69 #HANGUL SYLLABLE SSANGPIEUP A RIEULKIYEOK -0x95C4 0xBE6B #HANGUL SYLLABLE SSANGPIEUP A RIEULPIEUP -0x95C5 0xBE6C #HANGUL SYLLABLE SSANGPIEUP A RIEULSIOS -0x95C6 0xBE6D #HANGUL SYLLABLE SSANGPIEUP A RIEULTHIEUTH -0x95C7 0xBE6E #HANGUL SYLLABLE SSANGPIEUP A RIEULPHIEUPH -0x95C8 0xBE6F #HANGUL SYLLABLE SSANGPIEUP A RIEULHIEUH -0x95C9 0xBE72 #HANGUL SYLLABLE SSANGPIEUP A PIEUPSIOS -0x95CA 0xBE76 #HANGUL SYLLABLE SSANGPIEUP A CIEUC -0x95CB 0xBE77 #HANGUL SYLLABLE SSANGPIEUP A CHIEUCH -0x95CC 0xBE78 #HANGUL SYLLABLE SSANGPIEUP A KHIEUKH -0x95CD 0xBE79 #HANGUL SYLLABLE SSANGPIEUP A THIEUTH -0x95CE 0xBE7A #HANGUL SYLLABLE SSANGPIEUP A PHIEUPH -0x95CF 0xBE7E #HANGUL SYLLABLE SSANGPIEUP AE SSANGKIYEOK -0x95D0 0xBE7F #HANGUL SYLLABLE SSANGPIEUP AE KIYEOKSIOS -0x95D1 0xBE81 #HANGUL SYLLABLE SSANGPIEUP AE NIEUNCIEUC -0x95D2 0xBE82 #HANGUL SYLLABLE SSANGPIEUP AE NIEUNHIEUH -0x95D3 0xBE83 #HANGUL SYLLABLE SSANGPIEUP AE TIKEUT -0x95D4 0xBE85 #HANGUL SYLLABLE SSANGPIEUP AE RIEULKIYEOK -0x95D5 0xBE86 #HANGUL SYLLABLE SSANGPIEUP AE RIEULMIEUM -0x95D6 0xBE87 #HANGUL SYLLABLE SSANGPIEUP AE RIEULPIEUP -0x95D7 0xBE88 #HANGUL SYLLABLE SSANGPIEUP AE RIEULSIOS -0x95D8 0xBE89 #HANGUL SYLLABLE SSANGPIEUP AE RIEULTHIEUTH -0x95D9 0xBE8A #HANGUL SYLLABLE SSANGPIEUP AE RIEULPHIEUPH -0x95DA 0xBE8B #HANGUL SYLLABLE SSANGPIEUP AE RIEULHIEUH -0x95DB 0xBE8E #HANGUL SYLLABLE SSANGPIEUP AE PIEUPSIOS -0x95DC 0xBE92 #HANGUL SYLLABLE SSANGPIEUP AE CIEUC -0x95DD 0xBE93 #HANGUL SYLLABLE SSANGPIEUP AE CHIEUCH -0x95DE 0xBE94 #HANGUL SYLLABLE SSANGPIEUP AE KHIEUKH -0x95DF 0xBE95 #HANGUL SYLLABLE SSANGPIEUP AE THIEUTH -0x95E0 0xBE96 #HANGUL SYLLABLE SSANGPIEUP AE PHIEUPH -0x95E1 0xBE97 #HANGUL SYLLABLE SSANGPIEUP AE HIEUH -0x95E2 0xBE9A #HANGUL SYLLABLE SSANGPIEUP YA SSANGKIYEOK -0x95E3 0xBE9B #HANGUL SYLLABLE SSANGPIEUP YA KIYEOKSIOS -0x95E4 0xBE9C #HANGUL SYLLABLE SSANGPIEUP YA NIEUN -0x95E5 0xBE9D #HANGUL SYLLABLE SSANGPIEUP YA NIEUNCIEUC -0x95E6 0xBE9E #HANGUL SYLLABLE SSANGPIEUP YA NIEUNHIEUH -0x95E7 0xBE9F #HANGUL SYLLABLE SSANGPIEUP YA TIKEUT -0x95E8 0xBEA0 #HANGUL SYLLABLE SSANGPIEUP YA RIEUL -0x95E9 0xBEA1 #HANGUL SYLLABLE SSANGPIEUP YA RIEULKIYEOK -0x95EA 0xBEA2 #HANGUL SYLLABLE SSANGPIEUP YA RIEULMIEUM -0x95EB 0xBEA3 #HANGUL SYLLABLE SSANGPIEUP YA RIEULPIEUP -0x95EC 0xBEA4 #HANGUL SYLLABLE SSANGPIEUP YA RIEULSIOS -0x95ED 0xBEA5 #HANGUL SYLLABLE SSANGPIEUP YA RIEULTHIEUTH -0x95EE 0xBEA6 #HANGUL SYLLABLE SSANGPIEUP YA RIEULPHIEUPH -0x95EF 0xBEA7 #HANGUL SYLLABLE SSANGPIEUP YA RIEULHIEUH -0x95F0 0xBEA9 #HANGUL SYLLABLE SSANGPIEUP YA PIEUP -0x95F1 0xBEAA #HANGUL SYLLABLE SSANGPIEUP YA PIEUPSIOS -0x95F2 0xBEAB #HANGUL SYLLABLE SSANGPIEUP YA SIOS -0x95F3 0xBEAC #HANGUL SYLLABLE SSANGPIEUP YA SSANGSIOS -0x95F4 0xBEAD #HANGUL SYLLABLE SSANGPIEUP YA IEUNG -0x95F5 0xBEAE #HANGUL SYLLABLE SSANGPIEUP YA CIEUC -0x95F6 0xBEAF #HANGUL SYLLABLE SSANGPIEUP YA CHIEUCH -0x95F7 0xBEB0 #HANGUL SYLLABLE SSANGPIEUP YA KHIEUKH -0x95F8 0xBEB1 #HANGUL SYLLABLE SSANGPIEUP YA THIEUTH -0x95F9 0xBEB2 #HANGUL SYLLABLE SSANGPIEUP YA PHIEUPH -0x95FA 0xBEB3 #HANGUL SYLLABLE SSANGPIEUP YA HIEUH -0x95FB 0xBEB4 #HANGUL SYLLABLE SSANGPIEUP YAE -0x95FC 0xBEB5 #HANGUL SYLLABLE SSANGPIEUP YAE KIYEOK -0x95FD 0xBEB6 #HANGUL SYLLABLE SSANGPIEUP YAE SSANGKIYEOK -0x95FE 0xBEB7 #HANGUL SYLLABLE SSANGPIEUP YAE KIYEOKSIOS -0x9641 0xBEB8 #HANGUL SYLLABLE SSANGPIEUP YAE NIEUN -0x9642 0xBEB9 #HANGUL SYLLABLE SSANGPIEUP YAE NIEUNCIEUC -0x9643 0xBEBA #HANGUL SYLLABLE SSANGPIEUP YAE NIEUNHIEUH -0x9644 0xBEBB #HANGUL SYLLABLE SSANGPIEUP YAE TIKEUT -0x9645 0xBEBC #HANGUL SYLLABLE SSANGPIEUP YAE RIEUL -0x9646 0xBEBD #HANGUL SYLLABLE SSANGPIEUP YAE RIEULKIYEOK -0x9647 0xBEBE #HANGUL SYLLABLE SSANGPIEUP YAE RIEULMIEUM -0x9648 0xBEBF #HANGUL SYLLABLE SSANGPIEUP YAE RIEULPIEUP -0x9649 0xBEC0 #HANGUL SYLLABLE SSANGPIEUP YAE RIEULSIOS -0x964A 0xBEC1 #HANGUL SYLLABLE SSANGPIEUP YAE RIEULTHIEUTH -0x964B 0xBEC2 #HANGUL SYLLABLE SSANGPIEUP YAE RIEULPHIEUPH -0x964C 0xBEC3 #HANGUL SYLLABLE SSANGPIEUP YAE RIEULHIEUH -0x964D 0xBEC4 #HANGUL SYLLABLE SSANGPIEUP YAE MIEUM -0x964E 0xBEC5 #HANGUL SYLLABLE SSANGPIEUP YAE PIEUP -0x964F 0xBEC6 #HANGUL SYLLABLE SSANGPIEUP YAE PIEUPSIOS -0x9650 0xBEC7 #HANGUL SYLLABLE SSANGPIEUP YAE SIOS -0x9651 0xBEC8 #HANGUL SYLLABLE SSANGPIEUP YAE SSANGSIOS -0x9652 0xBEC9 #HANGUL SYLLABLE SSANGPIEUP YAE IEUNG -0x9653 0xBECA #HANGUL SYLLABLE SSANGPIEUP YAE CIEUC -0x9654 0xBECB #HANGUL SYLLABLE SSANGPIEUP YAE CHIEUCH -0x9655 0xBECC #HANGUL SYLLABLE SSANGPIEUP YAE KHIEUKH -0x9656 0xBECD #HANGUL SYLLABLE SSANGPIEUP YAE THIEUTH -0x9657 0xBECE #HANGUL SYLLABLE SSANGPIEUP YAE PHIEUPH -0x9658 0xBECF #HANGUL SYLLABLE SSANGPIEUP YAE HIEUH -0x9659 0xBED2 #HANGUL SYLLABLE SSANGPIEUP EO SSANGKIYEOK -0x965A 0xBED3 #HANGUL SYLLABLE SSANGPIEUP EO KIYEOKSIOS -0x9661 0xBED5 #HANGUL SYLLABLE SSANGPIEUP EO NIEUNCIEUC -0x9662 0xBED6 #HANGUL SYLLABLE SSANGPIEUP EO NIEUNHIEUH -0x9663 0xBED9 #HANGUL SYLLABLE SSANGPIEUP EO RIEULKIYEOK -0x9664 0xBEDA #HANGUL SYLLABLE SSANGPIEUP EO RIEULMIEUM -0x9665 0xBEDB #HANGUL SYLLABLE SSANGPIEUP EO RIEULPIEUP -0x9666 0xBEDC #HANGUL SYLLABLE SSANGPIEUP EO RIEULSIOS -0x9667 0xBEDD #HANGUL SYLLABLE SSANGPIEUP EO RIEULTHIEUTH -0x9668 0xBEDE #HANGUL SYLLABLE SSANGPIEUP EO RIEULPHIEUPH -0x9669 0xBEDF #HANGUL SYLLABLE SSANGPIEUP EO RIEULHIEUH -0x966A 0xBEE1 #HANGUL SYLLABLE SSANGPIEUP EO PIEUP -0x966B 0xBEE2 #HANGUL SYLLABLE SSANGPIEUP EO PIEUPSIOS -0x966C 0xBEE6 #HANGUL SYLLABLE SSANGPIEUP EO CIEUC -0x966D 0xBEE7 #HANGUL SYLLABLE SSANGPIEUP EO CHIEUCH -0x966E 0xBEE8 #HANGUL SYLLABLE SSANGPIEUP EO KHIEUKH -0x966F 0xBEE9 #HANGUL SYLLABLE SSANGPIEUP EO THIEUTH -0x9670 0xBEEA #HANGUL SYLLABLE SSANGPIEUP EO PHIEUPH -0x9671 0xBEEB #HANGUL SYLLABLE SSANGPIEUP EO HIEUH -0x9672 0xBEED #HANGUL SYLLABLE SSANGPIEUP E KIYEOK -0x9673 0xBEEE #HANGUL SYLLABLE SSANGPIEUP E SSANGKIYEOK -0x9674 0xBEEF #HANGUL SYLLABLE SSANGPIEUP E KIYEOKSIOS -0x9675 0xBEF0 #HANGUL SYLLABLE SSANGPIEUP E NIEUN -0x9676 0xBEF1 #HANGUL SYLLABLE SSANGPIEUP E NIEUNCIEUC -0x9677 0xBEF2 #HANGUL SYLLABLE SSANGPIEUP E NIEUNHIEUH -0x9678 0xBEF3 #HANGUL SYLLABLE SSANGPIEUP E TIKEUT -0x9679 0xBEF4 #HANGUL SYLLABLE SSANGPIEUP E RIEUL -0x967A 0xBEF5 #HANGUL SYLLABLE SSANGPIEUP E RIEULKIYEOK -0x9681 0xBEF6 #HANGUL SYLLABLE SSANGPIEUP E RIEULMIEUM -0x9682 0xBEF7 #HANGUL SYLLABLE SSANGPIEUP E RIEULPIEUP -0x9683 0xBEF8 #HANGUL SYLLABLE SSANGPIEUP E RIEULSIOS -0x9684 0xBEF9 #HANGUL SYLLABLE SSANGPIEUP E RIEULTHIEUTH -0x9685 0xBEFA #HANGUL SYLLABLE SSANGPIEUP E RIEULPHIEUPH -0x9686 0xBEFB #HANGUL SYLLABLE SSANGPIEUP E RIEULHIEUH -0x9687 0xBEFC #HANGUL SYLLABLE SSANGPIEUP E MIEUM -0x9688 0xBEFD #HANGUL SYLLABLE SSANGPIEUP E PIEUP -0x9689 0xBEFE #HANGUL SYLLABLE SSANGPIEUP E PIEUPSIOS -0x968A 0xBEFF #HANGUL SYLLABLE SSANGPIEUP E SIOS -0x968B 0xBF00 #HANGUL SYLLABLE SSANGPIEUP E SSANGSIOS -0x968C 0xBF02 #HANGUL SYLLABLE SSANGPIEUP E CIEUC -0x968D 0xBF03 #HANGUL SYLLABLE SSANGPIEUP E CHIEUCH -0x968E 0xBF04 #HANGUL SYLLABLE SSANGPIEUP E KHIEUKH -0x968F 0xBF05 #HANGUL SYLLABLE SSANGPIEUP E THIEUTH -0x9690 0xBF06 #HANGUL SYLLABLE SSANGPIEUP E PHIEUPH -0x9691 0xBF07 #HANGUL SYLLABLE SSANGPIEUP E HIEUH -0x9692 0xBF0A #HANGUL SYLLABLE SSANGPIEUP YEO SSANGKIYEOK -0x9693 0xBF0B #HANGUL SYLLABLE SSANGPIEUP YEO KIYEOKSIOS -0x9694 0xBF0C #HANGUL SYLLABLE SSANGPIEUP YEO NIEUN -0x9695 0xBF0D #HANGUL SYLLABLE SSANGPIEUP YEO NIEUNCIEUC -0x9696 0xBF0E #HANGUL SYLLABLE SSANGPIEUP YEO NIEUNHIEUH -0x9697 0xBF0F #HANGUL SYLLABLE SSANGPIEUP YEO TIKEUT -0x9698 0xBF10 #HANGUL SYLLABLE SSANGPIEUP YEO RIEUL -0x9699 0xBF11 #HANGUL SYLLABLE SSANGPIEUP YEO RIEULKIYEOK -0x969A 0xBF12 #HANGUL SYLLABLE SSANGPIEUP YEO RIEULMIEUM -0x969B 0xBF13 #HANGUL SYLLABLE SSANGPIEUP YEO RIEULPIEUP -0x969C 0xBF14 #HANGUL SYLLABLE SSANGPIEUP YEO RIEULSIOS -0x969D 0xBF15 #HANGUL SYLLABLE SSANGPIEUP YEO RIEULTHIEUTH -0x969E 0xBF16 #HANGUL SYLLABLE SSANGPIEUP YEO RIEULPHIEUPH -0x969F 0xBF17 #HANGUL SYLLABLE SSANGPIEUP YEO RIEULHIEUH -0x96A0 0xBF1A #HANGUL SYLLABLE SSANGPIEUP YEO PIEUPSIOS -0x96A1 0xBF1E #HANGUL SYLLABLE SSANGPIEUP YEO CIEUC -0x96A2 0xBF1F #HANGUL SYLLABLE SSANGPIEUP YEO CHIEUCH -0x96A3 0xBF20 #HANGUL SYLLABLE SSANGPIEUP YEO KHIEUKH -0x96A4 0xBF21 #HANGUL SYLLABLE SSANGPIEUP YEO THIEUTH -0x96A5 0xBF22 #HANGUL SYLLABLE SSANGPIEUP YEO PHIEUPH -0x96A6 0xBF23 #HANGUL SYLLABLE SSANGPIEUP YEO HIEUH -0x96A7 0xBF24 #HANGUL SYLLABLE SSANGPIEUP YE -0x96A8 0xBF25 #HANGUL SYLLABLE SSANGPIEUP YE KIYEOK -0x96A9 0xBF26 #HANGUL SYLLABLE SSANGPIEUP YE SSANGKIYEOK -0x96AA 0xBF27 #HANGUL SYLLABLE SSANGPIEUP YE KIYEOKSIOS -0x96AB 0xBF28 #HANGUL SYLLABLE SSANGPIEUP YE NIEUN -0x96AC 0xBF29 #HANGUL SYLLABLE SSANGPIEUP YE NIEUNCIEUC -0x96AD 0xBF2A #HANGUL SYLLABLE SSANGPIEUP YE NIEUNHIEUH -0x96AE 0xBF2B #HANGUL SYLLABLE SSANGPIEUP YE TIKEUT -0x96AF 0xBF2C #HANGUL SYLLABLE SSANGPIEUP YE RIEUL -0x96B0 0xBF2D #HANGUL SYLLABLE SSANGPIEUP YE RIEULKIYEOK -0x96B1 0xBF2E #HANGUL SYLLABLE SSANGPIEUP YE RIEULMIEUM -0x96B2 0xBF2F #HANGUL SYLLABLE SSANGPIEUP YE RIEULPIEUP -0x96B3 0xBF30 #HANGUL SYLLABLE SSANGPIEUP YE RIEULSIOS -0x96B4 0xBF31 #HANGUL SYLLABLE SSANGPIEUP YE RIEULTHIEUTH -0x96B5 0xBF32 #HANGUL SYLLABLE SSANGPIEUP YE RIEULPHIEUPH -0x96B6 0xBF33 #HANGUL SYLLABLE SSANGPIEUP YE RIEULHIEUH -0x96B7 0xBF34 #HANGUL SYLLABLE SSANGPIEUP YE MIEUM -0x96B8 0xBF35 #HANGUL SYLLABLE SSANGPIEUP YE PIEUP -0x96B9 0xBF36 #HANGUL SYLLABLE SSANGPIEUP YE PIEUPSIOS -0x96BA 0xBF37 #HANGUL SYLLABLE SSANGPIEUP YE SIOS -0x96BB 0xBF38 #HANGUL SYLLABLE SSANGPIEUP YE SSANGSIOS -0x96BC 0xBF39 #HANGUL SYLLABLE SSANGPIEUP YE IEUNG -0x96BD 0xBF3A #HANGUL SYLLABLE SSANGPIEUP YE CIEUC -0x96BE 0xBF3B #HANGUL SYLLABLE SSANGPIEUP YE CHIEUCH -0x96BF 0xBF3C #HANGUL SYLLABLE SSANGPIEUP YE KHIEUKH -0x96C0 0xBF3D #HANGUL SYLLABLE SSANGPIEUP YE THIEUTH -0x96C1 0xBF3E #HANGUL SYLLABLE SSANGPIEUP YE PHIEUPH -0x96C2 0xBF3F #HANGUL SYLLABLE SSANGPIEUP YE HIEUH -0x96C3 0xBF42 #HANGUL SYLLABLE SSANGPIEUP O SSANGKIYEOK -0x96C4 0xBF43 #HANGUL SYLLABLE SSANGPIEUP O KIYEOKSIOS -0x96C5 0xBF45 #HANGUL SYLLABLE SSANGPIEUP O NIEUNCIEUC -0x96C6 0xBF46 #HANGUL SYLLABLE SSANGPIEUP O NIEUNHIEUH -0x96C7 0xBF47 #HANGUL SYLLABLE SSANGPIEUP O TIKEUT -0x96C8 0xBF49 #HANGUL SYLLABLE SSANGPIEUP O RIEULKIYEOK -0x96C9 0xBF4A #HANGUL SYLLABLE SSANGPIEUP O RIEULMIEUM -0x96CA 0xBF4B #HANGUL SYLLABLE SSANGPIEUP O RIEULPIEUP -0x96CB 0xBF4C #HANGUL SYLLABLE SSANGPIEUP O RIEULSIOS -0x96CC 0xBF4D #HANGUL SYLLABLE SSANGPIEUP O RIEULTHIEUTH -0x96CD 0xBF4E #HANGUL SYLLABLE SSANGPIEUP O RIEULPHIEUPH -0x96CE 0xBF4F #HANGUL SYLLABLE SSANGPIEUP O RIEULHIEUH -0x96CF 0xBF52 #HANGUL SYLLABLE SSANGPIEUP O PIEUPSIOS -0x96D0 0xBF53 #HANGUL SYLLABLE SSANGPIEUP O SIOS -0x96D1 0xBF54 #HANGUL SYLLABLE SSANGPIEUP O SSANGSIOS -0x96D2 0xBF56 #HANGUL SYLLABLE SSANGPIEUP O CIEUC -0x96D3 0xBF57 #HANGUL SYLLABLE SSANGPIEUP O CHIEUCH -0x96D4 0xBF58 #HANGUL SYLLABLE SSANGPIEUP O KHIEUKH -0x96D5 0xBF59 #HANGUL SYLLABLE SSANGPIEUP O THIEUTH -0x96D6 0xBF5A #HANGUL SYLLABLE SSANGPIEUP O PHIEUPH -0x96D7 0xBF5B #HANGUL SYLLABLE SSANGPIEUP O HIEUH -0x96D8 0xBF5C #HANGUL SYLLABLE SSANGPIEUP WA -0x96D9 0xBF5D #HANGUL SYLLABLE SSANGPIEUP WA KIYEOK -0x96DA 0xBF5E #HANGUL SYLLABLE SSANGPIEUP WA SSANGKIYEOK -0x96DB 0xBF5F #HANGUL SYLLABLE SSANGPIEUP WA KIYEOKSIOS -0x96DC 0xBF60 #HANGUL SYLLABLE SSANGPIEUP WA NIEUN -0x96DD 0xBF61 #HANGUL SYLLABLE SSANGPIEUP WA NIEUNCIEUC -0x96DE 0xBF62 #HANGUL SYLLABLE SSANGPIEUP WA NIEUNHIEUH -0x96DF 0xBF63 #HANGUL SYLLABLE SSANGPIEUP WA TIKEUT -0x96E0 0xBF64 #HANGUL SYLLABLE SSANGPIEUP WA RIEUL -0x96E1 0xBF65 #HANGUL SYLLABLE SSANGPIEUP WA RIEULKIYEOK -0x96E2 0xBF66 #HANGUL SYLLABLE SSANGPIEUP WA RIEULMIEUM -0x96E3 0xBF67 #HANGUL SYLLABLE SSANGPIEUP WA RIEULPIEUP -0x96E4 0xBF68 #HANGUL SYLLABLE SSANGPIEUP WA RIEULSIOS -0x96E5 0xBF69 #HANGUL SYLLABLE SSANGPIEUP WA RIEULTHIEUTH -0x96E6 0xBF6A #HANGUL SYLLABLE SSANGPIEUP WA RIEULPHIEUPH -0x96E7 0xBF6B #HANGUL SYLLABLE SSANGPIEUP WA RIEULHIEUH -0x96E8 0xBF6C #HANGUL SYLLABLE SSANGPIEUP WA MIEUM -0x96E9 0xBF6D #HANGUL SYLLABLE SSANGPIEUP WA PIEUP -0x96EA 0xBF6E #HANGUL SYLLABLE SSANGPIEUP WA PIEUPSIOS -0x96EB 0xBF6F #HANGUL SYLLABLE SSANGPIEUP WA SIOS -0x96EC 0xBF70 #HANGUL SYLLABLE SSANGPIEUP WA SSANGSIOS -0x96ED 0xBF71 #HANGUL SYLLABLE SSANGPIEUP WA IEUNG -0x96EE 0xBF72 #HANGUL SYLLABLE SSANGPIEUP WA CIEUC -0x96EF 0xBF73 #HANGUL SYLLABLE SSANGPIEUP WA CHIEUCH -0x96F0 0xBF74 #HANGUL SYLLABLE SSANGPIEUP WA KHIEUKH -0x96F1 0xBF75 #HANGUL SYLLABLE SSANGPIEUP WA THIEUTH -0x96F2 0xBF76 #HANGUL SYLLABLE SSANGPIEUP WA PHIEUPH -0x96F3 0xBF77 #HANGUL SYLLABLE SSANGPIEUP WA HIEUH -0x96F4 0xBF78 #HANGUL SYLLABLE SSANGPIEUP WAE -0x96F5 0xBF79 #HANGUL SYLLABLE SSANGPIEUP WAE KIYEOK -0x96F6 0xBF7A #HANGUL SYLLABLE SSANGPIEUP WAE SSANGKIYEOK -0x96F7 0xBF7B #HANGUL SYLLABLE SSANGPIEUP WAE KIYEOKSIOS -0x96F8 0xBF7C #HANGUL SYLLABLE SSANGPIEUP WAE NIEUN -0x96F9 0xBF7D #HANGUL SYLLABLE SSANGPIEUP WAE NIEUNCIEUC -0x96FA 0xBF7E #HANGUL SYLLABLE SSANGPIEUP WAE NIEUNHIEUH -0x96FB 0xBF7F #HANGUL SYLLABLE SSANGPIEUP WAE TIKEUT -0x96FC 0xBF80 #HANGUL SYLLABLE SSANGPIEUP WAE RIEUL -0x96FD 0xBF81 #HANGUL SYLLABLE SSANGPIEUP WAE RIEULKIYEOK -0x96FE 0xBF82 #HANGUL SYLLABLE SSANGPIEUP WAE RIEULMIEUM -0x9741 0xBF83 #HANGUL SYLLABLE SSANGPIEUP WAE RIEULPIEUP -0x9742 0xBF84 #HANGUL SYLLABLE SSANGPIEUP WAE RIEULSIOS -0x9743 0xBF85 #HANGUL SYLLABLE SSANGPIEUP WAE RIEULTHIEUTH -0x9744 0xBF86 #HANGUL SYLLABLE SSANGPIEUP WAE RIEULPHIEUPH -0x9745 0xBF87 #HANGUL SYLLABLE SSANGPIEUP WAE RIEULHIEUH -0x9746 0xBF88 #HANGUL SYLLABLE SSANGPIEUP WAE MIEUM -0x9747 0xBF89 #HANGUL SYLLABLE SSANGPIEUP WAE PIEUP -0x9748 0xBF8A #HANGUL SYLLABLE SSANGPIEUP WAE PIEUPSIOS -0x9749 0xBF8B #HANGUL SYLLABLE SSANGPIEUP WAE SIOS -0x974A 0xBF8C #HANGUL SYLLABLE SSANGPIEUP WAE SSANGSIOS -0x974B 0xBF8D #HANGUL SYLLABLE SSANGPIEUP WAE IEUNG -0x974C 0xBF8E #HANGUL SYLLABLE SSANGPIEUP WAE CIEUC -0x974D 0xBF8F #HANGUL SYLLABLE SSANGPIEUP WAE CHIEUCH -0x974E 0xBF90 #HANGUL SYLLABLE SSANGPIEUP WAE KHIEUKH -0x974F 0xBF91 #HANGUL SYLLABLE SSANGPIEUP WAE THIEUTH -0x9750 0xBF92 #HANGUL SYLLABLE SSANGPIEUP WAE PHIEUPH -0x9751 0xBF93 #HANGUL SYLLABLE SSANGPIEUP WAE HIEUH -0x9752 0xBF95 #HANGUL SYLLABLE SSANGPIEUP OE KIYEOK -0x9753 0xBF96 #HANGUL SYLLABLE SSANGPIEUP OE SSANGKIYEOK -0x9754 0xBF97 #HANGUL SYLLABLE SSANGPIEUP OE KIYEOKSIOS -0x9755 0xBF98 #HANGUL SYLLABLE SSANGPIEUP OE NIEUN -0x9756 0xBF99 #HANGUL SYLLABLE SSANGPIEUP OE NIEUNCIEUC -0x9757 0xBF9A #HANGUL SYLLABLE SSANGPIEUP OE NIEUNHIEUH -0x9758 0xBF9B #HANGUL SYLLABLE SSANGPIEUP OE TIKEUT -0x9759 0xBF9C #HANGUL SYLLABLE SSANGPIEUP OE RIEUL -0x975A 0xBF9D #HANGUL SYLLABLE SSANGPIEUP OE RIEULKIYEOK -0x9761 0xBF9E #HANGUL SYLLABLE SSANGPIEUP OE RIEULMIEUM -0x9762 0xBF9F #HANGUL SYLLABLE SSANGPIEUP OE RIEULPIEUP -0x9763 0xBFA0 #HANGUL SYLLABLE SSANGPIEUP OE RIEULSIOS -0x9764 0xBFA1 #HANGUL SYLLABLE SSANGPIEUP OE RIEULTHIEUTH -0x9765 0xBFA2 #HANGUL SYLLABLE SSANGPIEUP OE RIEULPHIEUPH -0x9766 0xBFA3 #HANGUL SYLLABLE SSANGPIEUP OE RIEULHIEUH -0x9767 0xBFA4 #HANGUL SYLLABLE SSANGPIEUP OE MIEUM -0x9768 0xBFA5 #HANGUL SYLLABLE SSANGPIEUP OE PIEUP -0x9769 0xBFA6 #HANGUL SYLLABLE SSANGPIEUP OE PIEUPSIOS -0x976A 0xBFA7 #HANGUL SYLLABLE SSANGPIEUP OE SIOS -0x976B 0xBFA8 #HANGUL SYLLABLE SSANGPIEUP OE SSANGSIOS -0x976C 0xBFA9 #HANGUL SYLLABLE SSANGPIEUP OE IEUNG -0x976D 0xBFAA #HANGUL SYLLABLE SSANGPIEUP OE CIEUC -0x976E 0xBFAB #HANGUL SYLLABLE SSANGPIEUP OE CHIEUCH -0x976F 0xBFAC #HANGUL SYLLABLE SSANGPIEUP OE KHIEUKH -0x9770 0xBFAD #HANGUL SYLLABLE SSANGPIEUP OE THIEUTH -0x9771 0xBFAE #HANGUL SYLLABLE SSANGPIEUP OE PHIEUPH -0x9772 0xBFAF #HANGUL SYLLABLE SSANGPIEUP OE HIEUH -0x9773 0xBFB1 #HANGUL SYLLABLE SSANGPIEUP YO KIYEOK -0x9774 0xBFB2 #HANGUL SYLLABLE SSANGPIEUP YO SSANGKIYEOK -0x9775 0xBFB3 #HANGUL SYLLABLE SSANGPIEUP YO KIYEOKSIOS -0x9776 0xBFB4 #HANGUL SYLLABLE SSANGPIEUP YO NIEUN -0x9777 0xBFB5 #HANGUL SYLLABLE SSANGPIEUP YO NIEUNCIEUC -0x9778 0xBFB6 #HANGUL SYLLABLE SSANGPIEUP YO NIEUNHIEUH -0x9779 0xBFB7 #HANGUL SYLLABLE SSANGPIEUP YO TIKEUT -0x977A 0xBFB8 #HANGUL SYLLABLE SSANGPIEUP YO RIEUL -0x9781 0xBFB9 #HANGUL SYLLABLE SSANGPIEUP YO RIEULKIYEOK -0x9782 0xBFBA #HANGUL SYLLABLE SSANGPIEUP YO RIEULMIEUM -0x9783 0xBFBB #HANGUL SYLLABLE SSANGPIEUP YO RIEULPIEUP -0x9784 0xBFBC #HANGUL SYLLABLE SSANGPIEUP YO RIEULSIOS -0x9785 0xBFBD #HANGUL SYLLABLE SSANGPIEUP YO RIEULTHIEUTH -0x9786 0xBFBE #HANGUL SYLLABLE SSANGPIEUP YO RIEULPHIEUPH -0x9787 0xBFBF #HANGUL SYLLABLE SSANGPIEUP YO RIEULHIEUH -0x9788 0xBFC0 #HANGUL SYLLABLE SSANGPIEUP YO MIEUM -0x9789 0xBFC1 #HANGUL SYLLABLE SSANGPIEUP YO PIEUP -0x978A 0xBFC2 #HANGUL SYLLABLE SSANGPIEUP YO PIEUPSIOS -0x978B 0xBFC3 #HANGUL SYLLABLE SSANGPIEUP YO SIOS -0x978C 0xBFC4 #HANGUL SYLLABLE SSANGPIEUP YO SSANGSIOS -0x978D 0xBFC6 #HANGUL SYLLABLE SSANGPIEUP YO CIEUC -0x978E 0xBFC7 #HANGUL SYLLABLE SSANGPIEUP YO CHIEUCH -0x978F 0xBFC8 #HANGUL SYLLABLE SSANGPIEUP YO KHIEUKH -0x9790 0xBFC9 #HANGUL SYLLABLE SSANGPIEUP YO THIEUTH -0x9791 0xBFCA #HANGUL SYLLABLE SSANGPIEUP YO PHIEUPH -0x9792 0xBFCB #HANGUL SYLLABLE SSANGPIEUP YO HIEUH -0x9793 0xBFCE #HANGUL SYLLABLE SSANGPIEUP U SSANGKIYEOK -0x9794 0xBFCF #HANGUL SYLLABLE SSANGPIEUP U KIYEOKSIOS -0x9795 0xBFD1 #HANGUL SYLLABLE SSANGPIEUP U NIEUNCIEUC -0x9796 0xBFD2 #HANGUL SYLLABLE SSANGPIEUP U NIEUNHIEUH -0x9797 0xBFD3 #HANGUL SYLLABLE SSANGPIEUP U TIKEUT -0x9798 0xBFD5 #HANGUL SYLLABLE SSANGPIEUP U RIEULKIYEOK -0x9799 0xBFD6 #HANGUL SYLLABLE SSANGPIEUP U RIEULMIEUM -0x979A 0xBFD7 #HANGUL SYLLABLE SSANGPIEUP U RIEULPIEUP -0x979B 0xBFD8 #HANGUL SYLLABLE SSANGPIEUP U RIEULSIOS -0x979C 0xBFD9 #HANGUL SYLLABLE SSANGPIEUP U RIEULTHIEUTH -0x979D 0xBFDA #HANGUL SYLLABLE SSANGPIEUP U RIEULPHIEUPH -0x979E 0xBFDB #HANGUL SYLLABLE SSANGPIEUP U RIEULHIEUH -0x979F 0xBFDD #HANGUL SYLLABLE SSANGPIEUP U PIEUP -0x97A0 0xBFDE #HANGUL SYLLABLE SSANGPIEUP U PIEUPSIOS -0x97A1 0xBFE0 #HANGUL SYLLABLE SSANGPIEUP U SSANGSIOS -0x97A2 0xBFE2 #HANGUL SYLLABLE SSANGPIEUP U CIEUC -0x97A3 0xBFE3 #HANGUL SYLLABLE SSANGPIEUP U CHIEUCH -0x97A4 0xBFE4 #HANGUL SYLLABLE SSANGPIEUP U KHIEUKH -0x97A5 0xBFE5 #HANGUL SYLLABLE SSANGPIEUP U THIEUTH -0x97A6 0xBFE6 #HANGUL SYLLABLE SSANGPIEUP U PHIEUPH -0x97A7 0xBFE7 #HANGUL SYLLABLE SSANGPIEUP U HIEUH -0x97A8 0xBFE8 #HANGUL SYLLABLE SSANGPIEUP WEO -0x97A9 0xBFE9 #HANGUL SYLLABLE SSANGPIEUP WEO KIYEOK -0x97AA 0xBFEA #HANGUL SYLLABLE SSANGPIEUP WEO SSANGKIYEOK -0x97AB 0xBFEB #HANGUL SYLLABLE SSANGPIEUP WEO KIYEOKSIOS -0x97AC 0xBFEC #HANGUL SYLLABLE SSANGPIEUP WEO NIEUN -0x97AD 0xBFED #HANGUL SYLLABLE SSANGPIEUP WEO NIEUNCIEUC -0x97AE 0xBFEE #HANGUL SYLLABLE SSANGPIEUP WEO NIEUNHIEUH -0x97AF 0xBFEF #HANGUL SYLLABLE SSANGPIEUP WEO TIKEUT -0x97B0 0xBFF0 #HANGUL SYLLABLE SSANGPIEUP WEO RIEUL -0x97B1 0xBFF1 #HANGUL SYLLABLE SSANGPIEUP WEO RIEULKIYEOK -0x97B2 0xBFF2 #HANGUL SYLLABLE SSANGPIEUP WEO RIEULMIEUM -0x97B3 0xBFF3 #HANGUL SYLLABLE SSANGPIEUP WEO RIEULPIEUP -0x97B4 0xBFF4 #HANGUL SYLLABLE SSANGPIEUP WEO RIEULSIOS -0x97B5 0xBFF5 #HANGUL SYLLABLE SSANGPIEUP WEO RIEULTHIEUTH -0x97B6 0xBFF6 #HANGUL SYLLABLE SSANGPIEUP WEO RIEULPHIEUPH -0x97B7 0xBFF7 #HANGUL SYLLABLE SSANGPIEUP WEO RIEULHIEUH -0x97B8 0xBFF8 #HANGUL SYLLABLE SSANGPIEUP WEO MIEUM -0x97B9 0xBFF9 #HANGUL SYLLABLE SSANGPIEUP WEO PIEUP -0x97BA 0xBFFA #HANGUL SYLLABLE SSANGPIEUP WEO PIEUPSIOS -0x97BB 0xBFFB #HANGUL SYLLABLE SSANGPIEUP WEO SIOS -0x97BC 0xBFFC #HANGUL SYLLABLE SSANGPIEUP WEO SSANGSIOS -0x97BD 0xBFFD #HANGUL SYLLABLE SSANGPIEUP WEO IEUNG -0x97BE 0xBFFE #HANGUL SYLLABLE SSANGPIEUP WEO CIEUC -0x97BF 0xBFFF #HANGUL SYLLABLE SSANGPIEUP WEO CHIEUCH -0x97C0 0xC000 #HANGUL SYLLABLE SSANGPIEUP WEO KHIEUKH -0x97C1 0xC001 #HANGUL SYLLABLE SSANGPIEUP WEO THIEUTH -0x97C2 0xC002 #HANGUL SYLLABLE SSANGPIEUP WEO PHIEUPH -0x97C3 0xC003 #HANGUL SYLLABLE SSANGPIEUP WEO HIEUH -0x97C4 0xC004 #HANGUL SYLLABLE SSANGPIEUP WE -0x97C5 0xC005 #HANGUL SYLLABLE SSANGPIEUP WE KIYEOK -0x97C6 0xC006 #HANGUL SYLLABLE SSANGPIEUP WE SSANGKIYEOK -0x97C7 0xC007 #HANGUL SYLLABLE SSANGPIEUP WE KIYEOKSIOS -0x97C8 0xC008 #HANGUL SYLLABLE SSANGPIEUP WE NIEUN -0x97C9 0xC009 #HANGUL SYLLABLE SSANGPIEUP WE NIEUNCIEUC -0x97CA 0xC00A #HANGUL SYLLABLE SSANGPIEUP WE NIEUNHIEUH -0x97CB 0xC00B #HANGUL SYLLABLE SSANGPIEUP WE TIKEUT -0x97CC 0xC00C #HANGUL SYLLABLE SSANGPIEUP WE RIEUL -0x97CD 0xC00D #HANGUL SYLLABLE SSANGPIEUP WE RIEULKIYEOK -0x97CE 0xC00E #HANGUL SYLLABLE SSANGPIEUP WE RIEULMIEUM -0x97CF 0xC00F #HANGUL SYLLABLE SSANGPIEUP WE RIEULPIEUP -0x97D0 0xC010 #HANGUL SYLLABLE SSANGPIEUP WE RIEULSIOS -0x97D1 0xC011 #HANGUL SYLLABLE SSANGPIEUP WE RIEULTHIEUTH -0x97D2 0xC012 #HANGUL SYLLABLE SSANGPIEUP WE RIEULPHIEUPH -0x97D3 0xC013 #HANGUL SYLLABLE SSANGPIEUP WE RIEULHIEUH -0x97D4 0xC014 #HANGUL SYLLABLE SSANGPIEUP WE MIEUM -0x97D5 0xC015 #HANGUL SYLLABLE SSANGPIEUP WE PIEUP -0x97D6 0xC016 #HANGUL SYLLABLE SSANGPIEUP WE PIEUPSIOS -0x97D7 0xC017 #HANGUL SYLLABLE SSANGPIEUP WE SIOS -0x97D8 0xC018 #HANGUL SYLLABLE SSANGPIEUP WE SSANGSIOS -0x97D9 0xC019 #HANGUL SYLLABLE SSANGPIEUP WE IEUNG -0x97DA 0xC01A #HANGUL SYLLABLE SSANGPIEUP WE CIEUC -0x97DB 0xC01B #HANGUL SYLLABLE SSANGPIEUP WE CHIEUCH -0x97DC 0xC01C #HANGUL SYLLABLE SSANGPIEUP WE KHIEUKH -0x97DD 0xC01D #HANGUL SYLLABLE SSANGPIEUP WE THIEUTH -0x97DE 0xC01E #HANGUL SYLLABLE SSANGPIEUP WE PHIEUPH -0x97DF 0xC01F #HANGUL SYLLABLE SSANGPIEUP WE HIEUH -0x97E0 0xC020 #HANGUL SYLLABLE SSANGPIEUP WI -0x97E1 0xC021 #HANGUL SYLLABLE SSANGPIEUP WI KIYEOK -0x97E2 0xC022 #HANGUL SYLLABLE SSANGPIEUP WI SSANGKIYEOK -0x97E3 0xC023 #HANGUL SYLLABLE SSANGPIEUP WI KIYEOKSIOS -0x97E4 0xC024 #HANGUL SYLLABLE SSANGPIEUP WI NIEUN -0x97E5 0xC025 #HANGUL SYLLABLE SSANGPIEUP WI NIEUNCIEUC -0x97E6 0xC026 #HANGUL SYLLABLE SSANGPIEUP WI NIEUNHIEUH -0x97E7 0xC027 #HANGUL SYLLABLE SSANGPIEUP WI TIKEUT -0x97E8 0xC028 #HANGUL SYLLABLE SSANGPIEUP WI RIEUL -0x97E9 0xC029 #HANGUL SYLLABLE SSANGPIEUP WI RIEULKIYEOK -0x97EA 0xC02A #HANGUL SYLLABLE SSANGPIEUP WI RIEULMIEUM -0x97EB 0xC02B #HANGUL SYLLABLE SSANGPIEUP WI RIEULPIEUP -0x97EC 0xC02C #HANGUL SYLLABLE SSANGPIEUP WI RIEULSIOS -0x97ED 0xC02D #HANGUL SYLLABLE SSANGPIEUP WI RIEULTHIEUTH -0x97EE 0xC02E #HANGUL SYLLABLE SSANGPIEUP WI RIEULPHIEUPH -0x97EF 0xC02F #HANGUL SYLLABLE SSANGPIEUP WI RIEULHIEUH -0x97F0 0xC030 #HANGUL SYLLABLE SSANGPIEUP WI MIEUM -0x97F1 0xC031 #HANGUL SYLLABLE SSANGPIEUP WI PIEUP -0x97F2 0xC032 #HANGUL SYLLABLE SSANGPIEUP WI PIEUPSIOS -0x97F3 0xC033 #HANGUL SYLLABLE SSANGPIEUP WI SIOS -0x97F4 0xC034 #HANGUL SYLLABLE SSANGPIEUP WI SSANGSIOS -0x97F5 0xC035 #HANGUL SYLLABLE SSANGPIEUP WI IEUNG -0x97F6 0xC036 #HANGUL SYLLABLE SSANGPIEUP WI CIEUC -0x97F7 0xC037 #HANGUL SYLLABLE SSANGPIEUP WI CHIEUCH -0x97F8 0xC038 #HANGUL SYLLABLE SSANGPIEUP WI KHIEUKH -0x97F9 0xC039 #HANGUL SYLLABLE SSANGPIEUP WI THIEUTH -0x97FA 0xC03A #HANGUL SYLLABLE SSANGPIEUP WI PHIEUPH -0x97FB 0xC03B #HANGUL SYLLABLE SSANGPIEUP WI HIEUH -0x97FC 0xC03D #HANGUL SYLLABLE SSANGPIEUP YU KIYEOK -0x97FD 0xC03E #HANGUL SYLLABLE SSANGPIEUP YU SSANGKIYEOK -0x97FE 0xC03F #HANGUL SYLLABLE SSANGPIEUP YU KIYEOKSIOS -0x9841 0xC040 #HANGUL SYLLABLE SSANGPIEUP YU NIEUN -0x9842 0xC041 #HANGUL SYLLABLE SSANGPIEUP YU NIEUNCIEUC -0x9843 0xC042 #HANGUL SYLLABLE SSANGPIEUP YU NIEUNHIEUH -0x9844 0xC043 #HANGUL SYLLABLE SSANGPIEUP YU TIKEUT -0x9845 0xC044 #HANGUL SYLLABLE SSANGPIEUP YU RIEUL -0x9846 0xC045 #HANGUL SYLLABLE SSANGPIEUP YU RIEULKIYEOK -0x9847 0xC046 #HANGUL SYLLABLE SSANGPIEUP YU RIEULMIEUM -0x9848 0xC047 #HANGUL SYLLABLE SSANGPIEUP YU RIEULPIEUP -0x9849 0xC048 #HANGUL SYLLABLE SSANGPIEUP YU RIEULSIOS -0x984A 0xC049 #HANGUL SYLLABLE SSANGPIEUP YU RIEULTHIEUTH -0x984B 0xC04A #HANGUL SYLLABLE SSANGPIEUP YU RIEULPHIEUPH -0x984C 0xC04B #HANGUL SYLLABLE SSANGPIEUP YU RIEULHIEUH -0x984D 0xC04C #HANGUL SYLLABLE SSANGPIEUP YU MIEUM -0x984E 0xC04D #HANGUL SYLLABLE SSANGPIEUP YU PIEUP -0x984F 0xC04E #HANGUL SYLLABLE SSANGPIEUP YU PIEUPSIOS -0x9850 0xC04F #HANGUL SYLLABLE SSANGPIEUP YU SIOS -0x9851 0xC050 #HANGUL SYLLABLE SSANGPIEUP YU SSANGSIOS -0x9852 0xC052 #HANGUL SYLLABLE SSANGPIEUP YU CIEUC -0x9853 0xC053 #HANGUL SYLLABLE SSANGPIEUP YU CHIEUCH -0x9854 0xC054 #HANGUL SYLLABLE SSANGPIEUP YU KHIEUKH -0x9855 0xC055 #HANGUL SYLLABLE SSANGPIEUP YU THIEUTH -0x9856 0xC056 #HANGUL SYLLABLE SSANGPIEUP YU PHIEUPH -0x9857 0xC057 #HANGUL SYLLABLE SSANGPIEUP YU HIEUH -0x9858 0xC059 #HANGUL SYLLABLE SSANGPIEUP EU KIYEOK -0x9859 0xC05A #HANGUL SYLLABLE SSANGPIEUP EU SSANGKIYEOK -0x985A 0xC05B #HANGUL SYLLABLE SSANGPIEUP EU KIYEOKSIOS -0x9861 0xC05D #HANGUL SYLLABLE SSANGPIEUP EU NIEUNCIEUC -0x9862 0xC05E #HANGUL SYLLABLE SSANGPIEUP EU NIEUNHIEUH -0x9863 0xC05F #HANGUL SYLLABLE SSANGPIEUP EU TIKEUT -0x9864 0xC061 #HANGUL SYLLABLE SSANGPIEUP EU RIEULKIYEOK -0x9865 0xC062 #HANGUL SYLLABLE SSANGPIEUP EU RIEULMIEUM -0x9866 0xC063 #HANGUL SYLLABLE SSANGPIEUP EU RIEULPIEUP -0x9867 0xC064 #HANGUL SYLLABLE SSANGPIEUP EU RIEULSIOS -0x9868 0xC065 #HANGUL SYLLABLE SSANGPIEUP EU RIEULTHIEUTH -0x9869 0xC066 #HANGUL SYLLABLE SSANGPIEUP EU RIEULPHIEUPH -0x986A 0xC067 #HANGUL SYLLABLE SSANGPIEUP EU RIEULHIEUH -0x986B 0xC06A #HANGUL SYLLABLE SSANGPIEUP EU PIEUPSIOS -0x986C 0xC06B #HANGUL SYLLABLE SSANGPIEUP EU SIOS -0x986D 0xC06C #HANGUL SYLLABLE SSANGPIEUP EU SSANGSIOS -0x986E 0xC06D #HANGUL SYLLABLE SSANGPIEUP EU IEUNG -0x986F 0xC06E #HANGUL SYLLABLE SSANGPIEUP EU CIEUC -0x9870 0xC06F #HANGUL SYLLABLE SSANGPIEUP EU CHIEUCH -0x9871 0xC070 #HANGUL SYLLABLE SSANGPIEUP EU KHIEUKH -0x9872 0xC071 #HANGUL SYLLABLE SSANGPIEUP EU THIEUTH -0x9873 0xC072 #HANGUL SYLLABLE SSANGPIEUP EU PHIEUPH -0x9874 0xC073 #HANGUL SYLLABLE SSANGPIEUP EU HIEUH -0x9875 0xC074 #HANGUL SYLLABLE SSANGPIEUP YI -0x9876 0xC075 #HANGUL SYLLABLE SSANGPIEUP YI KIYEOK -0x9877 0xC076 #HANGUL SYLLABLE SSANGPIEUP YI SSANGKIYEOK -0x9878 0xC077 #HANGUL SYLLABLE SSANGPIEUP YI KIYEOKSIOS -0x9879 0xC078 #HANGUL SYLLABLE SSANGPIEUP YI NIEUN -0x987A 0xC079 #HANGUL SYLLABLE SSANGPIEUP YI NIEUNCIEUC -0x9881 0xC07A #HANGUL SYLLABLE SSANGPIEUP YI NIEUNHIEUH -0x9882 0xC07B #HANGUL SYLLABLE SSANGPIEUP YI TIKEUT -0x9883 0xC07C #HANGUL SYLLABLE SSANGPIEUP YI RIEUL -0x9884 0xC07D #HANGUL SYLLABLE SSANGPIEUP YI RIEULKIYEOK -0x9885 0xC07E #HANGUL SYLLABLE SSANGPIEUP YI RIEULMIEUM -0x9886 0xC07F #HANGUL SYLLABLE SSANGPIEUP YI RIEULPIEUP -0x9887 0xC080 #HANGUL SYLLABLE SSANGPIEUP YI RIEULSIOS -0x9888 0xC081 #HANGUL SYLLABLE SSANGPIEUP YI RIEULTHIEUTH -0x9889 0xC082 #HANGUL SYLLABLE SSANGPIEUP YI RIEULPHIEUPH -0x988A 0xC083 #HANGUL SYLLABLE SSANGPIEUP YI RIEULHIEUH -0x988B 0xC084 #HANGUL SYLLABLE SSANGPIEUP YI MIEUM -0x988C 0xC085 #HANGUL SYLLABLE SSANGPIEUP YI PIEUP -0x988D 0xC086 #HANGUL SYLLABLE SSANGPIEUP YI PIEUPSIOS -0x988E 0xC087 #HANGUL SYLLABLE SSANGPIEUP YI SIOS -0x988F 0xC088 #HANGUL SYLLABLE SSANGPIEUP YI SSANGSIOS -0x9890 0xC089 #HANGUL SYLLABLE SSANGPIEUP YI IEUNG -0x9891 0xC08A #HANGUL SYLLABLE SSANGPIEUP YI CIEUC -0x9892 0xC08B #HANGUL SYLLABLE SSANGPIEUP YI CHIEUCH -0x9893 0xC08C #HANGUL SYLLABLE SSANGPIEUP YI KHIEUKH -0x9894 0xC08D #HANGUL SYLLABLE SSANGPIEUP YI THIEUTH -0x9895 0xC08E #HANGUL SYLLABLE SSANGPIEUP YI PHIEUPH -0x9896 0xC08F #HANGUL SYLLABLE SSANGPIEUP YI HIEUH -0x9897 0xC092 #HANGUL SYLLABLE SSANGPIEUP I SSANGKIYEOK -0x9898 0xC093 #HANGUL SYLLABLE SSANGPIEUP I KIYEOKSIOS -0x9899 0xC095 #HANGUL SYLLABLE SSANGPIEUP I NIEUNCIEUC -0x989A 0xC096 #HANGUL SYLLABLE SSANGPIEUP I NIEUNHIEUH -0x989B 0xC097 #HANGUL SYLLABLE SSANGPIEUP I TIKEUT -0x989C 0xC099 #HANGUL SYLLABLE SSANGPIEUP I RIEULKIYEOK -0x989D 0xC09A #HANGUL SYLLABLE SSANGPIEUP I RIEULMIEUM -0x989E 0xC09B #HANGUL SYLLABLE SSANGPIEUP I RIEULPIEUP -0x989F 0xC09C #HANGUL SYLLABLE SSANGPIEUP I RIEULSIOS -0x98A0 0xC09D #HANGUL SYLLABLE SSANGPIEUP I RIEULTHIEUTH -0x98A1 0xC09E #HANGUL SYLLABLE SSANGPIEUP I RIEULPHIEUPH -0x98A2 0xC09F #HANGUL SYLLABLE SSANGPIEUP I RIEULHIEUH -0x98A3 0xC0A2 #HANGUL SYLLABLE SSANGPIEUP I PIEUPSIOS -0x98A4 0xC0A4 #HANGUL SYLLABLE SSANGPIEUP I SSANGSIOS -0x98A5 0xC0A6 #HANGUL SYLLABLE SSANGPIEUP I CIEUC -0x98A6 0xC0A7 #HANGUL SYLLABLE SSANGPIEUP I CHIEUCH -0x98A7 0xC0A8 #HANGUL SYLLABLE SSANGPIEUP I KHIEUKH -0x98A8 0xC0A9 #HANGUL SYLLABLE SSANGPIEUP I THIEUTH -0x98A9 0xC0AA #HANGUL SYLLABLE SSANGPIEUP I PHIEUPH -0x98AA 0xC0AB #HANGUL SYLLABLE SSANGPIEUP I HIEUH -0x98AB 0xC0AE #HANGUL SYLLABLE SIOS A SSANGKIYEOK -0x98AC 0xC0B1 #HANGUL SYLLABLE SIOS A NIEUNCIEUC -0x98AD 0xC0B2 #HANGUL SYLLABLE SIOS A NIEUNHIEUH -0x98AE 0xC0B7 #HANGUL SYLLABLE SIOS A RIEULPIEUP -0x98AF 0xC0B8 #HANGUL SYLLABLE SIOS A RIEULSIOS -0x98B0 0xC0B9 #HANGUL SYLLABLE SIOS A RIEULTHIEUTH -0x98B1 0xC0BA #HANGUL SYLLABLE SIOS A RIEULPHIEUPH -0x98B2 0xC0BB #HANGUL SYLLABLE SIOS A RIEULHIEUH -0x98B3 0xC0BE #HANGUL SYLLABLE SIOS A PIEUPSIOS -0x98B4 0xC0C2 #HANGUL SYLLABLE SIOS A CIEUC -0x98B5 0xC0C3 #HANGUL SYLLABLE SIOS A CHIEUCH -0x98B6 0xC0C4 #HANGUL SYLLABLE SIOS A KHIEUKH -0x98B7 0xC0C6 #HANGUL SYLLABLE SIOS A PHIEUPH -0x98B8 0xC0C7 #HANGUL SYLLABLE SIOS A HIEUH -0x98B9 0xC0CA #HANGUL SYLLABLE SIOS AE SSANGKIYEOK -0x98BA 0xC0CB #HANGUL SYLLABLE SIOS AE KIYEOKSIOS -0x98BB 0xC0CD #HANGUL SYLLABLE SIOS AE NIEUNCIEUC -0x98BC 0xC0CE #HANGUL SYLLABLE SIOS AE NIEUNHIEUH -0x98BD 0xC0CF #HANGUL SYLLABLE SIOS AE TIKEUT -0x98BE 0xC0D1 #HANGUL SYLLABLE SIOS AE RIEULKIYEOK -0x98BF 0xC0D2 #HANGUL SYLLABLE SIOS AE RIEULMIEUM -0x98C0 0xC0D3 #HANGUL SYLLABLE SIOS AE RIEULPIEUP -0x98C1 0xC0D4 #HANGUL SYLLABLE SIOS AE RIEULSIOS -0x98C2 0xC0D5 #HANGUL SYLLABLE SIOS AE RIEULTHIEUTH -0x98C3 0xC0D6 #HANGUL SYLLABLE SIOS AE RIEULPHIEUPH -0x98C4 0xC0D7 #HANGUL SYLLABLE SIOS AE RIEULHIEUH -0x98C5 0xC0DA #HANGUL SYLLABLE SIOS AE PIEUPSIOS -0x98C6 0xC0DE #HANGUL SYLLABLE SIOS AE CIEUC -0x98C7 0xC0DF #HANGUL SYLLABLE SIOS AE CHIEUCH -0x98C8 0xC0E0 #HANGUL SYLLABLE SIOS AE KHIEUKH -0x98C9 0xC0E1 #HANGUL SYLLABLE SIOS AE THIEUTH -0x98CA 0xC0E2 #HANGUL SYLLABLE SIOS AE PHIEUPH -0x98CB 0xC0E3 #HANGUL SYLLABLE SIOS AE HIEUH -0x98CC 0xC0E6 #HANGUL SYLLABLE SIOS YA SSANGKIYEOK -0x98CD 0xC0E7 #HANGUL SYLLABLE SIOS YA KIYEOKSIOS -0x98CE 0xC0E9 #HANGUL SYLLABLE SIOS YA NIEUNCIEUC -0x98CF 0xC0EA #HANGUL SYLLABLE SIOS YA NIEUNHIEUH -0x98D0 0xC0EB #HANGUL SYLLABLE SIOS YA TIKEUT -0x98D1 0xC0ED #HANGUL SYLLABLE SIOS YA RIEULKIYEOK -0x98D2 0xC0EE #HANGUL SYLLABLE SIOS YA RIEULMIEUM -0x98D3 0xC0EF #HANGUL SYLLABLE SIOS YA RIEULPIEUP -0x98D4 0xC0F0 #HANGUL SYLLABLE SIOS YA RIEULSIOS -0x98D5 0xC0F1 #HANGUL SYLLABLE SIOS YA RIEULTHIEUTH -0x98D6 0xC0F2 #HANGUL SYLLABLE SIOS YA RIEULPHIEUPH -0x98D7 0xC0F3 #HANGUL SYLLABLE SIOS YA RIEULHIEUH -0x98D8 0xC0F6 #HANGUL SYLLABLE SIOS YA PIEUPSIOS -0x98D9 0xC0F8 #HANGUL SYLLABLE SIOS YA SSANGSIOS -0x98DA 0xC0FA #HANGUL SYLLABLE SIOS YA CIEUC -0x98DB 0xC0FB #HANGUL SYLLABLE SIOS YA CHIEUCH -0x98DC 0xC0FC #HANGUL SYLLABLE SIOS YA KHIEUKH -0x98DD 0xC0FD #HANGUL SYLLABLE SIOS YA THIEUTH -0x98DE 0xC0FE #HANGUL SYLLABLE SIOS YA PHIEUPH -0x98DF 0xC0FF #HANGUL SYLLABLE SIOS YA HIEUH -0x98E0 0xC101 #HANGUL SYLLABLE SIOS YAE KIYEOK -0x98E1 0xC102 #HANGUL SYLLABLE SIOS YAE SSANGKIYEOK -0x98E2 0xC103 #HANGUL SYLLABLE SIOS YAE KIYEOKSIOS -0x98E3 0xC105 #HANGUL SYLLABLE SIOS YAE NIEUNCIEUC -0x98E4 0xC106 #HANGUL SYLLABLE SIOS YAE NIEUNHIEUH -0x98E5 0xC107 #HANGUL SYLLABLE SIOS YAE TIKEUT -0x98E6 0xC109 #HANGUL SYLLABLE SIOS YAE RIEULKIYEOK -0x98E7 0xC10A #HANGUL SYLLABLE SIOS YAE RIEULMIEUM -0x98E8 0xC10B #HANGUL SYLLABLE SIOS YAE RIEULPIEUP -0x98E9 0xC10C #HANGUL SYLLABLE SIOS YAE RIEULSIOS -0x98EA 0xC10D #HANGUL SYLLABLE SIOS YAE RIEULTHIEUTH -0x98EB 0xC10E #HANGUL SYLLABLE SIOS YAE RIEULPHIEUPH -0x98EC 0xC10F #HANGUL SYLLABLE SIOS YAE RIEULHIEUH -0x98ED 0xC111 #HANGUL SYLLABLE SIOS YAE PIEUP -0x98EE 0xC112 #HANGUL SYLLABLE SIOS YAE PIEUPSIOS -0x98EF 0xC113 #HANGUL SYLLABLE SIOS YAE SIOS -0x98F0 0xC114 #HANGUL SYLLABLE SIOS YAE SSANGSIOS -0x98F1 0xC116 #HANGUL SYLLABLE SIOS YAE CIEUC -0x98F2 0xC117 #HANGUL SYLLABLE SIOS YAE CHIEUCH -0x98F3 0xC118 #HANGUL SYLLABLE SIOS YAE KHIEUKH -0x98F4 0xC119 #HANGUL SYLLABLE SIOS YAE THIEUTH -0x98F5 0xC11A #HANGUL SYLLABLE SIOS YAE PHIEUPH -0x98F6 0xC11B #HANGUL SYLLABLE SIOS YAE HIEUH -0x98F7 0xC121 #HANGUL SYLLABLE SIOS EO NIEUNCIEUC -0x98F8 0xC122 #HANGUL SYLLABLE SIOS EO NIEUNHIEUH -0x98F9 0xC125 #HANGUL SYLLABLE SIOS EO RIEULKIYEOK -0x98FA 0xC128 #HANGUL SYLLABLE SIOS EO RIEULSIOS -0x98FB 0xC129 #HANGUL SYLLABLE SIOS EO RIEULTHIEUTH -0x98FC 0xC12A #HANGUL SYLLABLE SIOS EO RIEULPHIEUPH -0x98FD 0xC12B #HANGUL SYLLABLE SIOS EO RIEULHIEUH -0x98FE 0xC12E #HANGUL SYLLABLE SIOS EO PIEUPSIOS -0x9941 0xC132 #HANGUL SYLLABLE SIOS EO CIEUC -0x9942 0xC133 #HANGUL SYLLABLE SIOS EO CHIEUCH -0x9943 0xC134 #HANGUL SYLLABLE SIOS EO KHIEUKH -0x9944 0xC135 #HANGUL SYLLABLE SIOS EO THIEUTH -0x9945 0xC137 #HANGUL SYLLABLE SIOS EO HIEUH -0x9946 0xC13A #HANGUL SYLLABLE SIOS E SSANGKIYEOK -0x9947 0xC13B #HANGUL SYLLABLE SIOS E KIYEOKSIOS -0x9948 0xC13D #HANGUL SYLLABLE SIOS E NIEUNCIEUC -0x9949 0xC13E #HANGUL SYLLABLE SIOS E NIEUNHIEUH -0x994A 0xC13F #HANGUL SYLLABLE SIOS E TIKEUT -0x994B 0xC141 #HANGUL SYLLABLE SIOS E RIEULKIYEOK -0x994C 0xC142 #HANGUL SYLLABLE SIOS E RIEULMIEUM -0x994D 0xC143 #HANGUL SYLLABLE SIOS E RIEULPIEUP -0x994E 0xC144 #HANGUL SYLLABLE SIOS E RIEULSIOS -0x994F 0xC145 #HANGUL SYLLABLE SIOS E RIEULTHIEUTH -0x9950 0xC146 #HANGUL SYLLABLE SIOS E RIEULPHIEUPH -0x9951 0xC147 #HANGUL SYLLABLE SIOS E RIEULHIEUH -0x9952 0xC14A #HANGUL SYLLABLE SIOS E PIEUPSIOS -0x9953 0xC14E #HANGUL SYLLABLE SIOS E CIEUC -0x9954 0xC14F #HANGUL SYLLABLE SIOS E CHIEUCH -0x9955 0xC150 #HANGUL SYLLABLE SIOS E KHIEUKH -0x9956 0xC151 #HANGUL SYLLABLE SIOS E THIEUTH -0x9957 0xC152 #HANGUL SYLLABLE SIOS E PHIEUPH -0x9958 0xC153 #HANGUL SYLLABLE SIOS E HIEUH -0x9959 0xC156 #HANGUL SYLLABLE SIOS YEO SSANGKIYEOK -0x995A 0xC157 #HANGUL SYLLABLE SIOS YEO KIYEOKSIOS -0x9961 0xC159 #HANGUL SYLLABLE SIOS YEO NIEUNCIEUC -0x9962 0xC15A #HANGUL SYLLABLE SIOS YEO NIEUNHIEUH -0x9963 0xC15B #HANGUL SYLLABLE SIOS YEO TIKEUT -0x9964 0xC15D #HANGUL SYLLABLE SIOS YEO RIEULKIYEOK -0x9965 0xC15E #HANGUL SYLLABLE SIOS YEO RIEULMIEUM -0x9966 0xC15F #HANGUL SYLLABLE SIOS YEO RIEULPIEUP -0x9967 0xC160 #HANGUL SYLLABLE SIOS YEO RIEULSIOS -0x9968 0xC161 #HANGUL SYLLABLE SIOS YEO RIEULTHIEUTH -0x9969 0xC162 #HANGUL SYLLABLE SIOS YEO RIEULPHIEUPH -0x996A 0xC163 #HANGUL SYLLABLE SIOS YEO RIEULHIEUH -0x996B 0xC166 #HANGUL SYLLABLE SIOS YEO PIEUPSIOS -0x996C 0xC16A #HANGUL SYLLABLE SIOS YEO CIEUC -0x996D 0xC16B #HANGUL SYLLABLE SIOS YEO CHIEUCH -0x996E 0xC16C #HANGUL SYLLABLE SIOS YEO KHIEUKH -0x996F 0xC16D #HANGUL SYLLABLE SIOS YEO THIEUTH -0x9970 0xC16E #HANGUL SYLLABLE SIOS YEO PHIEUPH -0x9971 0xC16F #HANGUL SYLLABLE SIOS YEO HIEUH -0x9972 0xC171 #HANGUL SYLLABLE SIOS YE KIYEOK -0x9973 0xC172 #HANGUL SYLLABLE SIOS YE SSANGKIYEOK -0x9974 0xC173 #HANGUL SYLLABLE SIOS YE KIYEOKSIOS -0x9975 0xC175 #HANGUL SYLLABLE SIOS YE NIEUNCIEUC -0x9976 0xC176 #HANGUL SYLLABLE SIOS YE NIEUNHIEUH -0x9977 0xC177 #HANGUL SYLLABLE SIOS YE TIKEUT -0x9978 0xC179 #HANGUL SYLLABLE SIOS YE RIEULKIYEOK -0x9979 0xC17A #HANGUL SYLLABLE SIOS YE RIEULMIEUM -0x997A 0xC17B #HANGUL SYLLABLE SIOS YE RIEULPIEUP -0x9981 0xC17C #HANGUL SYLLABLE SIOS YE RIEULSIOS -0x9982 0xC17D #HANGUL SYLLABLE SIOS YE RIEULTHIEUTH -0x9983 0xC17E #HANGUL SYLLABLE SIOS YE RIEULPHIEUPH -0x9984 0xC17F #HANGUL SYLLABLE SIOS YE RIEULHIEUH -0x9985 0xC180 #HANGUL SYLLABLE SIOS YE MIEUM -0x9986 0xC181 #HANGUL SYLLABLE SIOS YE PIEUP -0x9987 0xC182 #HANGUL SYLLABLE SIOS YE PIEUPSIOS -0x9988 0xC183 #HANGUL SYLLABLE SIOS YE SIOS -0x9989 0xC184 #HANGUL SYLLABLE SIOS YE SSANGSIOS -0x998A 0xC186 #HANGUL SYLLABLE SIOS YE CIEUC -0x998B 0xC187 #HANGUL SYLLABLE SIOS YE CHIEUCH -0x998C 0xC188 #HANGUL SYLLABLE SIOS YE KHIEUKH -0x998D 0xC189 #HANGUL SYLLABLE SIOS YE THIEUTH -0x998E 0xC18A #HANGUL SYLLABLE SIOS YE PHIEUPH -0x998F 0xC18B #HANGUL SYLLABLE SIOS YE HIEUH -0x9990 0xC18F #HANGUL SYLLABLE SIOS O KIYEOKSIOS -0x9991 0xC191 #HANGUL SYLLABLE SIOS O NIEUNCIEUC -0x9992 0xC192 #HANGUL SYLLABLE SIOS O NIEUNHIEUH -0x9993 0xC193 #HANGUL SYLLABLE SIOS O TIKEUT -0x9994 0xC195 #HANGUL SYLLABLE SIOS O RIEULKIYEOK -0x9995 0xC197 #HANGUL SYLLABLE SIOS O RIEULPIEUP -0x9996 0xC198 #HANGUL SYLLABLE SIOS O RIEULSIOS -0x9997 0xC199 #HANGUL SYLLABLE SIOS O RIEULTHIEUTH -0x9998 0xC19A #HANGUL SYLLABLE SIOS O RIEULPHIEUPH -0x9999 0xC19B #HANGUL SYLLABLE SIOS O RIEULHIEUH -0x999A 0xC19E #HANGUL SYLLABLE SIOS O PIEUPSIOS -0x999B 0xC1A0 #HANGUL SYLLABLE SIOS O SSANGSIOS -0x999C 0xC1A2 #HANGUL SYLLABLE SIOS O CIEUC -0x999D 0xC1A3 #HANGUL SYLLABLE SIOS O CHIEUCH -0x999E 0xC1A4 #HANGUL SYLLABLE SIOS O KHIEUKH -0x999F 0xC1A6 #HANGUL SYLLABLE SIOS O PHIEUPH -0x99A0 0xC1A7 #HANGUL SYLLABLE SIOS O HIEUH -0x99A1 0xC1AA #HANGUL SYLLABLE SIOS WA SSANGKIYEOK -0x99A2 0xC1AB #HANGUL SYLLABLE SIOS WA KIYEOKSIOS -0x99A3 0xC1AD #HANGUL SYLLABLE SIOS WA NIEUNCIEUC -0x99A4 0xC1AE #HANGUL SYLLABLE SIOS WA NIEUNHIEUH -0x99A5 0xC1AF #HANGUL SYLLABLE SIOS WA TIKEUT -0x99A6 0xC1B1 #HANGUL SYLLABLE SIOS WA RIEULKIYEOK -0x99A7 0xC1B2 #HANGUL SYLLABLE SIOS WA RIEULMIEUM -0x99A8 0xC1B3 #HANGUL SYLLABLE SIOS WA RIEULPIEUP -0x99A9 0xC1B4 #HANGUL SYLLABLE SIOS WA RIEULSIOS -0x99AA 0xC1B5 #HANGUL SYLLABLE SIOS WA RIEULTHIEUTH -0x99AB 0xC1B6 #HANGUL SYLLABLE SIOS WA RIEULPHIEUPH -0x99AC 0xC1B7 #HANGUL SYLLABLE SIOS WA RIEULHIEUH -0x99AD 0xC1B8 #HANGUL SYLLABLE SIOS WA MIEUM -0x99AE 0xC1B9 #HANGUL SYLLABLE SIOS WA PIEUP -0x99AF 0xC1BA #HANGUL SYLLABLE SIOS WA PIEUPSIOS -0x99B0 0xC1BB #HANGUL SYLLABLE SIOS WA SIOS -0x99B1 0xC1BC #HANGUL SYLLABLE SIOS WA SSANGSIOS -0x99B2 0xC1BE #HANGUL SYLLABLE SIOS WA CIEUC -0x99B3 0xC1BF #HANGUL SYLLABLE SIOS WA CHIEUCH -0x99B4 0xC1C0 #HANGUL SYLLABLE SIOS WA KHIEUKH -0x99B5 0xC1C1 #HANGUL SYLLABLE SIOS WA THIEUTH -0x99B6 0xC1C2 #HANGUL SYLLABLE SIOS WA PHIEUPH -0x99B7 0xC1C3 #HANGUL SYLLABLE SIOS WA HIEUH -0x99B8 0xC1C5 #HANGUL SYLLABLE SIOS WAE KIYEOK -0x99B9 0xC1C6 #HANGUL SYLLABLE SIOS WAE SSANGKIYEOK -0x99BA 0xC1C7 #HANGUL SYLLABLE SIOS WAE KIYEOKSIOS -0x99BB 0xC1C9 #HANGUL SYLLABLE SIOS WAE NIEUNCIEUC -0x99BC 0xC1CA #HANGUL SYLLABLE SIOS WAE NIEUNHIEUH -0x99BD 0xC1CB #HANGUL SYLLABLE SIOS WAE TIKEUT -0x99BE 0xC1CD #HANGUL SYLLABLE SIOS WAE RIEULKIYEOK -0x99BF 0xC1CE #HANGUL SYLLABLE SIOS WAE RIEULMIEUM -0x99C0 0xC1CF #HANGUL SYLLABLE SIOS WAE RIEULPIEUP -0x99C1 0xC1D0 #HANGUL SYLLABLE SIOS WAE RIEULSIOS -0x99C2 0xC1D1 #HANGUL SYLLABLE SIOS WAE RIEULTHIEUTH -0x99C3 0xC1D2 #HANGUL SYLLABLE SIOS WAE RIEULPHIEUPH -0x99C4 0xC1D3 #HANGUL SYLLABLE SIOS WAE RIEULHIEUH -0x99C5 0xC1D5 #HANGUL SYLLABLE SIOS WAE PIEUP -0x99C6 0xC1D6 #HANGUL SYLLABLE SIOS WAE PIEUPSIOS -0x99C7 0xC1D9 #HANGUL SYLLABLE SIOS WAE IEUNG -0x99C8 0xC1DA #HANGUL SYLLABLE SIOS WAE CIEUC -0x99C9 0xC1DB #HANGUL SYLLABLE SIOS WAE CHIEUCH -0x99CA 0xC1DC #HANGUL SYLLABLE SIOS WAE KHIEUKH -0x99CB 0xC1DD #HANGUL SYLLABLE SIOS WAE THIEUTH -0x99CC 0xC1DE #HANGUL SYLLABLE SIOS WAE PHIEUPH -0x99CD 0xC1DF #HANGUL SYLLABLE SIOS WAE HIEUH -0x99CE 0xC1E1 #HANGUL SYLLABLE SIOS OE KIYEOK -0x99CF 0xC1E2 #HANGUL SYLLABLE SIOS OE SSANGKIYEOK -0x99D0 0xC1E3 #HANGUL SYLLABLE SIOS OE KIYEOKSIOS -0x99D1 0xC1E5 #HANGUL SYLLABLE SIOS OE NIEUNCIEUC -0x99D2 0xC1E6 #HANGUL SYLLABLE SIOS OE NIEUNHIEUH -0x99D3 0xC1E7 #HANGUL SYLLABLE SIOS OE TIKEUT -0x99D4 0xC1E9 #HANGUL SYLLABLE SIOS OE RIEULKIYEOK -0x99D5 0xC1EA #HANGUL SYLLABLE SIOS OE RIEULMIEUM -0x99D6 0xC1EB #HANGUL SYLLABLE SIOS OE RIEULPIEUP -0x99D7 0xC1EC #HANGUL SYLLABLE SIOS OE RIEULSIOS -0x99D8 0xC1ED #HANGUL SYLLABLE SIOS OE RIEULTHIEUTH -0x99D9 0xC1EE #HANGUL SYLLABLE SIOS OE RIEULPHIEUPH -0x99DA 0xC1EF #HANGUL SYLLABLE SIOS OE RIEULHIEUH -0x99DB 0xC1F2 #HANGUL SYLLABLE SIOS OE PIEUPSIOS -0x99DC 0xC1F4 #HANGUL SYLLABLE SIOS OE SSANGSIOS -0x99DD 0xC1F5 #HANGUL SYLLABLE SIOS OE IEUNG -0x99DE 0xC1F6 #HANGUL SYLLABLE SIOS OE CIEUC -0x99DF 0xC1F7 #HANGUL SYLLABLE SIOS OE CHIEUCH -0x99E0 0xC1F8 #HANGUL SYLLABLE SIOS OE KHIEUKH -0x99E1 0xC1F9 #HANGUL SYLLABLE SIOS OE THIEUTH -0x99E2 0xC1FA #HANGUL SYLLABLE SIOS OE PHIEUPH -0x99E3 0xC1FB #HANGUL SYLLABLE SIOS OE HIEUH -0x99E4 0xC1FE #HANGUL SYLLABLE SIOS YO SSANGKIYEOK -0x99E5 0xC1FF #HANGUL SYLLABLE SIOS YO KIYEOKSIOS -0x99E6 0xC201 #HANGUL SYLLABLE SIOS YO NIEUNCIEUC -0x99E7 0xC202 #HANGUL SYLLABLE SIOS YO NIEUNHIEUH -0x99E8 0xC203 #HANGUL SYLLABLE SIOS YO TIKEUT -0x99E9 0xC205 #HANGUL SYLLABLE SIOS YO RIEULKIYEOK -0x99EA 0xC206 #HANGUL SYLLABLE SIOS YO RIEULMIEUM -0x99EB 0xC207 #HANGUL SYLLABLE SIOS YO RIEULPIEUP -0x99EC 0xC208 #HANGUL SYLLABLE SIOS YO RIEULSIOS -0x99ED 0xC209 #HANGUL SYLLABLE SIOS YO RIEULTHIEUTH -0x99EE 0xC20A #HANGUL SYLLABLE SIOS YO RIEULPHIEUPH -0x99EF 0xC20B #HANGUL SYLLABLE SIOS YO RIEULHIEUH -0x99F0 0xC20E #HANGUL SYLLABLE SIOS YO PIEUPSIOS -0x99F1 0xC210 #HANGUL SYLLABLE SIOS YO SSANGSIOS -0x99F2 0xC212 #HANGUL SYLLABLE SIOS YO CIEUC -0x99F3 0xC213 #HANGUL SYLLABLE SIOS YO CHIEUCH -0x99F4 0xC214 #HANGUL SYLLABLE SIOS YO KHIEUKH -0x99F5 0xC215 #HANGUL SYLLABLE SIOS YO THIEUTH -0x99F6 0xC216 #HANGUL SYLLABLE SIOS YO PHIEUPH -0x99F7 0xC217 #HANGUL SYLLABLE SIOS YO HIEUH -0x99F8 0xC21A #HANGUL SYLLABLE SIOS U SSANGKIYEOK -0x99F9 0xC21B #HANGUL SYLLABLE SIOS U KIYEOKSIOS -0x99FA 0xC21D #HANGUL SYLLABLE SIOS U NIEUNCIEUC -0x99FB 0xC21E #HANGUL SYLLABLE SIOS U NIEUNHIEUH -0x99FC 0xC221 #HANGUL SYLLABLE SIOS U RIEULKIYEOK -0x99FD 0xC222 #HANGUL SYLLABLE SIOS U RIEULMIEUM -0x99FE 0xC223 #HANGUL SYLLABLE SIOS U RIEULPIEUP -0x9A41 0xC224 #HANGUL SYLLABLE SIOS U RIEULSIOS -0x9A42 0xC225 #HANGUL SYLLABLE SIOS U RIEULTHIEUTH -0x9A43 0xC226 #HANGUL SYLLABLE SIOS U RIEULPHIEUPH -0x9A44 0xC227 #HANGUL SYLLABLE SIOS U RIEULHIEUH -0x9A45 0xC22A #HANGUL SYLLABLE SIOS U PIEUPSIOS -0x9A46 0xC22C #HANGUL SYLLABLE SIOS U SSANGSIOS -0x9A47 0xC22E #HANGUL SYLLABLE SIOS U CIEUC -0x9A48 0xC230 #HANGUL SYLLABLE SIOS U KHIEUKH -0x9A49 0xC233 #HANGUL SYLLABLE SIOS U HIEUH -0x9A4A 0xC235 #HANGUL SYLLABLE SIOS WEO KIYEOK -0x9A4B 0xC236 #HANGUL SYLLABLE SIOS WEO SSANGKIYEOK -0x9A4C 0xC237 #HANGUL SYLLABLE SIOS WEO KIYEOKSIOS -0x9A4D 0xC238 #HANGUL SYLLABLE SIOS WEO NIEUN -0x9A4E 0xC239 #HANGUL SYLLABLE SIOS WEO NIEUNCIEUC -0x9A4F 0xC23A #HANGUL SYLLABLE SIOS WEO NIEUNHIEUH -0x9A50 0xC23B #HANGUL SYLLABLE SIOS WEO TIKEUT -0x9A51 0xC23C #HANGUL SYLLABLE SIOS WEO RIEUL -0x9A52 0xC23D #HANGUL SYLLABLE SIOS WEO RIEULKIYEOK -0x9A53 0xC23E #HANGUL SYLLABLE SIOS WEO RIEULMIEUM -0x9A54 0xC23F #HANGUL SYLLABLE SIOS WEO RIEULPIEUP -0x9A55 0xC240 #HANGUL SYLLABLE SIOS WEO RIEULSIOS -0x9A56 0xC241 #HANGUL SYLLABLE SIOS WEO RIEULTHIEUTH -0x9A57 0xC242 #HANGUL SYLLABLE SIOS WEO RIEULPHIEUPH -0x9A58 0xC243 #HANGUL SYLLABLE SIOS WEO RIEULHIEUH -0x9A59 0xC244 #HANGUL SYLLABLE SIOS WEO MIEUM -0x9A5A 0xC245 #HANGUL SYLLABLE SIOS WEO PIEUP -0x9A61 0xC246 #HANGUL SYLLABLE SIOS WEO PIEUPSIOS -0x9A62 0xC247 #HANGUL SYLLABLE SIOS WEO SIOS -0x9A63 0xC249 #HANGUL SYLLABLE SIOS WEO IEUNG -0x9A64 0xC24A #HANGUL SYLLABLE SIOS WEO CIEUC -0x9A65 0xC24B #HANGUL SYLLABLE SIOS WEO CHIEUCH -0x9A66 0xC24C #HANGUL SYLLABLE SIOS WEO KHIEUKH -0x9A67 0xC24D #HANGUL SYLLABLE SIOS WEO THIEUTH -0x9A68 0xC24E #HANGUL SYLLABLE SIOS WEO PHIEUPH -0x9A69 0xC24F #HANGUL SYLLABLE SIOS WEO HIEUH -0x9A6A 0xC252 #HANGUL SYLLABLE SIOS WE SSANGKIYEOK -0x9A6B 0xC253 #HANGUL SYLLABLE SIOS WE KIYEOKSIOS -0x9A6C 0xC255 #HANGUL SYLLABLE SIOS WE NIEUNCIEUC -0x9A6D 0xC256 #HANGUL SYLLABLE SIOS WE NIEUNHIEUH -0x9A6E 0xC257 #HANGUL SYLLABLE SIOS WE TIKEUT -0x9A6F 0xC259 #HANGUL SYLLABLE SIOS WE RIEULKIYEOK -0x9A70 0xC25A #HANGUL SYLLABLE SIOS WE RIEULMIEUM -0x9A71 0xC25B #HANGUL SYLLABLE SIOS WE RIEULPIEUP -0x9A72 0xC25C #HANGUL SYLLABLE SIOS WE RIEULSIOS -0x9A73 0xC25D #HANGUL SYLLABLE SIOS WE RIEULTHIEUTH -0x9A74 0xC25E #HANGUL SYLLABLE SIOS WE RIEULPHIEUPH -0x9A75 0xC25F #HANGUL SYLLABLE SIOS WE RIEULHIEUH -0x9A76 0xC261 #HANGUL SYLLABLE SIOS WE PIEUP -0x9A77 0xC262 #HANGUL SYLLABLE SIOS WE PIEUPSIOS -0x9A78 0xC263 #HANGUL SYLLABLE SIOS WE SIOS -0x9A79 0xC264 #HANGUL SYLLABLE SIOS WE SSANGSIOS -0x9A7A 0xC266 #HANGUL SYLLABLE SIOS WE CIEUC -0x9A81 0xC267 #HANGUL SYLLABLE SIOS WE CHIEUCH -0x9A82 0xC268 #HANGUL SYLLABLE SIOS WE KHIEUKH -0x9A83 0xC269 #HANGUL SYLLABLE SIOS WE THIEUTH -0x9A84 0xC26A #HANGUL SYLLABLE SIOS WE PHIEUPH -0x9A85 0xC26B #HANGUL SYLLABLE SIOS WE HIEUH -0x9A86 0xC26E #HANGUL SYLLABLE SIOS WI SSANGKIYEOK -0x9A87 0xC26F #HANGUL SYLLABLE SIOS WI KIYEOKSIOS -0x9A88 0xC271 #HANGUL SYLLABLE SIOS WI NIEUNCIEUC -0x9A89 0xC272 #HANGUL SYLLABLE SIOS WI NIEUNHIEUH -0x9A8A 0xC273 #HANGUL SYLLABLE SIOS WI TIKEUT -0x9A8B 0xC275 #HANGUL SYLLABLE SIOS WI RIEULKIYEOK -0x9A8C 0xC276 #HANGUL SYLLABLE SIOS WI RIEULMIEUM -0x9A8D 0xC277 #HANGUL SYLLABLE SIOS WI RIEULPIEUP -0x9A8E 0xC278 #HANGUL SYLLABLE SIOS WI RIEULSIOS -0x9A8F 0xC279 #HANGUL SYLLABLE SIOS WI RIEULTHIEUTH -0x9A90 0xC27A #HANGUL SYLLABLE SIOS WI RIEULPHIEUPH -0x9A91 0xC27B #HANGUL SYLLABLE SIOS WI RIEULHIEUH -0x9A92 0xC27E #HANGUL SYLLABLE SIOS WI PIEUPSIOS -0x9A93 0xC280 #HANGUL SYLLABLE SIOS WI SSANGSIOS -0x9A94 0xC282 #HANGUL SYLLABLE SIOS WI CIEUC -0x9A95 0xC283 #HANGUL SYLLABLE SIOS WI CHIEUCH -0x9A96 0xC284 #HANGUL SYLLABLE SIOS WI KHIEUKH -0x9A97 0xC285 #HANGUL SYLLABLE SIOS WI THIEUTH -0x9A98 0xC286 #HANGUL SYLLABLE SIOS WI PHIEUPH -0x9A99 0xC287 #HANGUL SYLLABLE SIOS WI HIEUH -0x9A9A 0xC28A #HANGUL SYLLABLE SIOS YU SSANGKIYEOK -0x9A9B 0xC28B #HANGUL SYLLABLE SIOS YU KIYEOKSIOS -0x9A9C 0xC28C #HANGUL SYLLABLE SIOS YU NIEUN -0x9A9D 0xC28D #HANGUL SYLLABLE SIOS YU NIEUNCIEUC -0x9A9E 0xC28E #HANGUL SYLLABLE SIOS YU NIEUNHIEUH -0x9A9F 0xC28F #HANGUL SYLLABLE SIOS YU TIKEUT -0x9AA0 0xC291 #HANGUL SYLLABLE SIOS YU RIEULKIYEOK -0x9AA1 0xC292 #HANGUL SYLLABLE SIOS YU RIEULMIEUM -0x9AA2 0xC293 #HANGUL SYLLABLE SIOS YU RIEULPIEUP -0x9AA3 0xC294 #HANGUL SYLLABLE SIOS YU RIEULSIOS -0x9AA4 0xC295 #HANGUL SYLLABLE SIOS YU RIEULTHIEUTH -0x9AA5 0xC296 #HANGUL SYLLABLE SIOS YU RIEULPHIEUPH -0x9AA6 0xC297 #HANGUL SYLLABLE SIOS YU RIEULHIEUH -0x9AA7 0xC299 #HANGUL SYLLABLE SIOS YU PIEUP -0x9AA8 0xC29A #HANGUL SYLLABLE SIOS YU PIEUPSIOS -0x9AA9 0xC29C #HANGUL SYLLABLE SIOS YU SSANGSIOS -0x9AAA 0xC29E #HANGUL SYLLABLE SIOS YU CIEUC -0x9AAB 0xC29F #HANGUL SYLLABLE SIOS YU CHIEUCH -0x9AAC 0xC2A0 #HANGUL SYLLABLE SIOS YU KHIEUKH -0x9AAD 0xC2A1 #HANGUL SYLLABLE SIOS YU THIEUTH -0x9AAE 0xC2A2 #HANGUL SYLLABLE SIOS YU PHIEUPH -0x9AAF 0xC2A3 #HANGUL SYLLABLE SIOS YU HIEUH -0x9AB0 0xC2A6 #HANGUL SYLLABLE SIOS EU SSANGKIYEOK -0x9AB1 0xC2A7 #HANGUL SYLLABLE SIOS EU KIYEOKSIOS -0x9AB2 0xC2A9 #HANGUL SYLLABLE SIOS EU NIEUNCIEUC -0x9AB3 0xC2AA #HANGUL SYLLABLE SIOS EU NIEUNHIEUH -0x9AB4 0xC2AB #HANGUL SYLLABLE SIOS EU TIKEUT -0x9AB5 0xC2AE #HANGUL SYLLABLE SIOS EU RIEULMIEUM -0x9AB6 0xC2AF #HANGUL SYLLABLE SIOS EU RIEULPIEUP -0x9AB7 0xC2B0 #HANGUL SYLLABLE SIOS EU RIEULSIOS -0x9AB8 0xC2B1 #HANGUL SYLLABLE SIOS EU RIEULTHIEUTH -0x9AB9 0xC2B2 #HANGUL SYLLABLE SIOS EU RIEULPHIEUPH -0x9ABA 0xC2B3 #HANGUL SYLLABLE SIOS EU RIEULHIEUH -0x9ABB 0xC2B6 #HANGUL SYLLABLE SIOS EU PIEUPSIOS -0x9ABC 0xC2B8 #HANGUL SYLLABLE SIOS EU SSANGSIOS -0x9ABD 0xC2BA #HANGUL SYLLABLE SIOS EU CIEUC -0x9ABE 0xC2BB #HANGUL SYLLABLE SIOS EU CHIEUCH -0x9ABF 0xC2BC #HANGUL SYLLABLE SIOS EU KHIEUKH -0x9AC0 0xC2BD #HANGUL SYLLABLE SIOS EU THIEUTH -0x9AC1 0xC2BE #HANGUL SYLLABLE SIOS EU PHIEUPH -0x9AC2 0xC2BF #HANGUL SYLLABLE SIOS EU HIEUH -0x9AC3 0xC2C0 #HANGUL SYLLABLE SIOS YI -0x9AC4 0xC2C1 #HANGUL SYLLABLE SIOS YI KIYEOK -0x9AC5 0xC2C2 #HANGUL SYLLABLE SIOS YI SSANGKIYEOK -0x9AC6 0xC2C3 #HANGUL SYLLABLE SIOS YI KIYEOKSIOS -0x9AC7 0xC2C4 #HANGUL SYLLABLE SIOS YI NIEUN -0x9AC8 0xC2C5 #HANGUL SYLLABLE SIOS YI NIEUNCIEUC -0x9AC9 0xC2C6 #HANGUL SYLLABLE SIOS YI NIEUNHIEUH -0x9ACA 0xC2C7 #HANGUL SYLLABLE SIOS YI TIKEUT -0x9ACB 0xC2C8 #HANGUL SYLLABLE SIOS YI RIEUL -0x9ACC 0xC2C9 #HANGUL SYLLABLE SIOS YI RIEULKIYEOK -0x9ACD 0xC2CA #HANGUL SYLLABLE SIOS YI RIEULMIEUM -0x9ACE 0xC2CB #HANGUL SYLLABLE SIOS YI RIEULPIEUP -0x9ACF 0xC2CC #HANGUL SYLLABLE SIOS YI RIEULSIOS -0x9AD0 0xC2CD #HANGUL SYLLABLE SIOS YI RIEULTHIEUTH -0x9AD1 0xC2CE #HANGUL SYLLABLE SIOS YI RIEULPHIEUPH -0x9AD2 0xC2CF #HANGUL SYLLABLE SIOS YI RIEULHIEUH -0x9AD3 0xC2D0 #HANGUL SYLLABLE SIOS YI MIEUM -0x9AD4 0xC2D1 #HANGUL SYLLABLE SIOS YI PIEUP -0x9AD5 0xC2D2 #HANGUL SYLLABLE SIOS YI PIEUPSIOS -0x9AD6 0xC2D3 #HANGUL SYLLABLE SIOS YI SIOS -0x9AD7 0xC2D4 #HANGUL SYLLABLE SIOS YI SSANGSIOS -0x9AD8 0xC2D5 #HANGUL SYLLABLE SIOS YI IEUNG -0x9AD9 0xC2D6 #HANGUL SYLLABLE SIOS YI CIEUC -0x9ADA 0xC2D7 #HANGUL SYLLABLE SIOS YI CHIEUCH -0x9ADB 0xC2D8 #HANGUL SYLLABLE SIOS YI KHIEUKH -0x9ADC 0xC2D9 #HANGUL SYLLABLE SIOS YI THIEUTH -0x9ADD 0xC2DA #HANGUL SYLLABLE SIOS YI PHIEUPH -0x9ADE 0xC2DB #HANGUL SYLLABLE SIOS YI HIEUH -0x9ADF 0xC2DE #HANGUL SYLLABLE SIOS I SSANGKIYEOK -0x9AE0 0xC2DF #HANGUL SYLLABLE SIOS I KIYEOKSIOS -0x9AE1 0xC2E1 #HANGUL SYLLABLE SIOS I NIEUNCIEUC -0x9AE2 0xC2E2 #HANGUL SYLLABLE SIOS I NIEUNHIEUH -0x9AE3 0xC2E5 #HANGUL SYLLABLE SIOS I RIEULKIYEOK -0x9AE4 0xC2E6 #HANGUL SYLLABLE SIOS I RIEULMIEUM -0x9AE5 0xC2E7 #HANGUL SYLLABLE SIOS I RIEULPIEUP -0x9AE6 0xC2E8 #HANGUL SYLLABLE SIOS I RIEULSIOS -0x9AE7 0xC2E9 #HANGUL SYLLABLE SIOS I RIEULTHIEUTH -0x9AE8 0xC2EA #HANGUL SYLLABLE SIOS I RIEULPHIEUPH -0x9AE9 0xC2EE #HANGUL SYLLABLE SIOS I PIEUPSIOS -0x9AEA 0xC2F0 #HANGUL SYLLABLE SIOS I SSANGSIOS -0x9AEB 0xC2F2 #HANGUL SYLLABLE SIOS I CIEUC -0x9AEC 0xC2F3 #HANGUL SYLLABLE SIOS I CHIEUCH -0x9AED 0xC2F4 #HANGUL SYLLABLE SIOS I KHIEUKH -0x9AEE 0xC2F5 #HANGUL SYLLABLE SIOS I THIEUTH -0x9AEF 0xC2F7 #HANGUL SYLLABLE SIOS I HIEUH -0x9AF0 0xC2FA #HANGUL SYLLABLE SSANGSIOS A SSANGKIYEOK -0x9AF1 0xC2FD #HANGUL SYLLABLE SSANGSIOS A NIEUNCIEUC -0x9AF2 0xC2FE #HANGUL SYLLABLE SSANGSIOS A NIEUNHIEUH -0x9AF3 0xC2FF #HANGUL SYLLABLE SSANGSIOS A TIKEUT -0x9AF4 0xC301 #HANGUL SYLLABLE SSANGSIOS A RIEULKIYEOK -0x9AF5 0xC302 #HANGUL SYLLABLE SSANGSIOS A RIEULMIEUM -0x9AF6 0xC303 #HANGUL SYLLABLE SSANGSIOS A RIEULPIEUP -0x9AF7 0xC304 #HANGUL SYLLABLE SSANGSIOS A RIEULSIOS -0x9AF8 0xC305 #HANGUL SYLLABLE SSANGSIOS A RIEULTHIEUTH -0x9AF9 0xC306 #HANGUL SYLLABLE SSANGSIOS A RIEULPHIEUPH -0x9AFA 0xC307 #HANGUL SYLLABLE SSANGSIOS A RIEULHIEUH -0x9AFB 0xC30A #HANGUL SYLLABLE SSANGSIOS A PIEUPSIOS -0x9AFC 0xC30B #HANGUL SYLLABLE SSANGSIOS A SIOS -0x9AFD 0xC30E #HANGUL SYLLABLE SSANGSIOS A CIEUC -0x9AFE 0xC30F #HANGUL SYLLABLE SSANGSIOS A CHIEUCH -0x9B41 0xC310 #HANGUL SYLLABLE SSANGSIOS A KHIEUKH -0x9B42 0xC311 #HANGUL SYLLABLE SSANGSIOS A THIEUTH -0x9B43 0xC312 #HANGUL SYLLABLE SSANGSIOS A PHIEUPH -0x9B44 0xC316 #HANGUL SYLLABLE SSANGSIOS AE SSANGKIYEOK -0x9B45 0xC317 #HANGUL SYLLABLE SSANGSIOS AE KIYEOKSIOS -0x9B46 0xC319 #HANGUL SYLLABLE SSANGSIOS AE NIEUNCIEUC -0x9B47 0xC31A #HANGUL SYLLABLE SSANGSIOS AE NIEUNHIEUH -0x9B48 0xC31B #HANGUL SYLLABLE SSANGSIOS AE TIKEUT -0x9B49 0xC31D #HANGUL SYLLABLE SSANGSIOS AE RIEULKIYEOK -0x9B4A 0xC31E #HANGUL SYLLABLE SSANGSIOS AE RIEULMIEUM -0x9B4B 0xC31F #HANGUL SYLLABLE SSANGSIOS AE RIEULPIEUP -0x9B4C 0xC320 #HANGUL SYLLABLE SSANGSIOS AE RIEULSIOS -0x9B4D 0xC321 #HANGUL SYLLABLE SSANGSIOS AE RIEULTHIEUTH -0x9B4E 0xC322 #HANGUL SYLLABLE SSANGSIOS AE RIEULPHIEUPH -0x9B4F 0xC323 #HANGUL SYLLABLE SSANGSIOS AE RIEULHIEUH -0x9B50 0xC326 #HANGUL SYLLABLE SSANGSIOS AE PIEUPSIOS -0x9B51 0xC327 #HANGUL SYLLABLE SSANGSIOS AE SIOS -0x9B52 0xC32A #HANGUL SYLLABLE SSANGSIOS AE CIEUC -0x9B53 0xC32B #HANGUL SYLLABLE SSANGSIOS AE CHIEUCH -0x9B54 0xC32C #HANGUL SYLLABLE SSANGSIOS AE KHIEUKH -0x9B55 0xC32D #HANGUL SYLLABLE SSANGSIOS AE THIEUTH -0x9B56 0xC32E #HANGUL SYLLABLE SSANGSIOS AE PHIEUPH -0x9B57 0xC32F #HANGUL SYLLABLE SSANGSIOS AE HIEUH -0x9B58 0xC330 #HANGUL SYLLABLE SSANGSIOS YA -0x9B59 0xC331 #HANGUL SYLLABLE SSANGSIOS YA KIYEOK -0x9B5A 0xC332 #HANGUL SYLLABLE SSANGSIOS YA SSANGKIYEOK -0x9B61 0xC333 #HANGUL SYLLABLE SSANGSIOS YA KIYEOKSIOS -0x9B62 0xC334 #HANGUL SYLLABLE SSANGSIOS YA NIEUN -0x9B63 0xC335 #HANGUL SYLLABLE SSANGSIOS YA NIEUNCIEUC -0x9B64 0xC336 #HANGUL SYLLABLE SSANGSIOS YA NIEUNHIEUH -0x9B65 0xC337 #HANGUL SYLLABLE SSANGSIOS YA TIKEUT -0x9B66 0xC338 #HANGUL SYLLABLE SSANGSIOS YA RIEUL -0x9B67 0xC339 #HANGUL SYLLABLE SSANGSIOS YA RIEULKIYEOK -0x9B68 0xC33A #HANGUL SYLLABLE SSANGSIOS YA RIEULMIEUM -0x9B69 0xC33B #HANGUL SYLLABLE SSANGSIOS YA RIEULPIEUP -0x9B6A 0xC33C #HANGUL SYLLABLE SSANGSIOS YA RIEULSIOS -0x9B6B 0xC33D #HANGUL SYLLABLE SSANGSIOS YA RIEULTHIEUTH -0x9B6C 0xC33E #HANGUL SYLLABLE SSANGSIOS YA RIEULPHIEUPH -0x9B6D 0xC33F #HANGUL SYLLABLE SSANGSIOS YA RIEULHIEUH -0x9B6E 0xC340 #HANGUL SYLLABLE SSANGSIOS YA MIEUM -0x9B6F 0xC341 #HANGUL SYLLABLE SSANGSIOS YA PIEUP -0x9B70 0xC342 #HANGUL SYLLABLE SSANGSIOS YA PIEUPSIOS -0x9B71 0xC343 #HANGUL SYLLABLE SSANGSIOS YA SIOS -0x9B72 0xC344 #HANGUL SYLLABLE SSANGSIOS YA SSANGSIOS -0x9B73 0xC346 #HANGUL SYLLABLE SSANGSIOS YA CIEUC -0x9B74 0xC347 #HANGUL SYLLABLE SSANGSIOS YA CHIEUCH -0x9B75 0xC348 #HANGUL SYLLABLE SSANGSIOS YA KHIEUKH -0x9B76 0xC349 #HANGUL SYLLABLE SSANGSIOS YA THIEUTH -0x9B77 0xC34A #HANGUL SYLLABLE SSANGSIOS YA PHIEUPH -0x9B78 0xC34B #HANGUL SYLLABLE SSANGSIOS YA HIEUH -0x9B79 0xC34C #HANGUL SYLLABLE SSANGSIOS YAE -0x9B7A 0xC34D #HANGUL SYLLABLE SSANGSIOS YAE KIYEOK -0x9B81 0xC34E #HANGUL SYLLABLE SSANGSIOS YAE SSANGKIYEOK -0x9B82 0xC34F #HANGUL SYLLABLE SSANGSIOS YAE KIYEOKSIOS -0x9B83 0xC350 #HANGUL SYLLABLE SSANGSIOS YAE NIEUN -0x9B84 0xC351 #HANGUL SYLLABLE SSANGSIOS YAE NIEUNCIEUC -0x9B85 0xC352 #HANGUL SYLLABLE SSANGSIOS YAE NIEUNHIEUH -0x9B86 0xC353 #HANGUL SYLLABLE SSANGSIOS YAE TIKEUT -0x9B87 0xC354 #HANGUL SYLLABLE SSANGSIOS YAE RIEUL -0x9B88 0xC355 #HANGUL SYLLABLE SSANGSIOS YAE RIEULKIYEOK -0x9B89 0xC356 #HANGUL SYLLABLE SSANGSIOS YAE RIEULMIEUM -0x9B8A 0xC357 #HANGUL SYLLABLE SSANGSIOS YAE RIEULPIEUP -0x9B8B 0xC358 #HANGUL SYLLABLE SSANGSIOS YAE RIEULSIOS -0x9B8C 0xC359 #HANGUL SYLLABLE SSANGSIOS YAE RIEULTHIEUTH -0x9B8D 0xC35A #HANGUL SYLLABLE SSANGSIOS YAE RIEULPHIEUPH -0x9B8E 0xC35B #HANGUL SYLLABLE SSANGSIOS YAE RIEULHIEUH -0x9B8F 0xC35C #HANGUL SYLLABLE SSANGSIOS YAE MIEUM -0x9B90 0xC35D #HANGUL SYLLABLE SSANGSIOS YAE PIEUP -0x9B91 0xC35E #HANGUL SYLLABLE SSANGSIOS YAE PIEUPSIOS -0x9B92 0xC35F #HANGUL SYLLABLE SSANGSIOS YAE SIOS -0x9B93 0xC360 #HANGUL SYLLABLE SSANGSIOS YAE SSANGSIOS -0x9B94 0xC361 #HANGUL SYLLABLE SSANGSIOS YAE IEUNG -0x9B95 0xC362 #HANGUL SYLLABLE SSANGSIOS YAE CIEUC -0x9B96 0xC363 #HANGUL SYLLABLE SSANGSIOS YAE CHIEUCH -0x9B97 0xC364 #HANGUL SYLLABLE SSANGSIOS YAE KHIEUKH -0x9B98 0xC365 #HANGUL SYLLABLE SSANGSIOS YAE THIEUTH -0x9B99 0xC366 #HANGUL SYLLABLE SSANGSIOS YAE PHIEUPH -0x9B9A 0xC367 #HANGUL SYLLABLE SSANGSIOS YAE HIEUH -0x9B9B 0xC36A #HANGUL SYLLABLE SSANGSIOS EO SSANGKIYEOK -0x9B9C 0xC36B #HANGUL SYLLABLE SSANGSIOS EO KIYEOKSIOS -0x9B9D 0xC36D #HANGUL SYLLABLE SSANGSIOS EO NIEUNCIEUC -0x9B9E 0xC36E #HANGUL SYLLABLE SSANGSIOS EO NIEUNHIEUH -0x9B9F 0xC36F #HANGUL SYLLABLE SSANGSIOS EO TIKEUT -0x9BA0 0xC371 #HANGUL SYLLABLE SSANGSIOS EO RIEULKIYEOK -0x9BA1 0xC373 #HANGUL SYLLABLE SSANGSIOS EO RIEULPIEUP -0x9BA2 0xC374 #HANGUL SYLLABLE SSANGSIOS EO RIEULSIOS -0x9BA3 0xC375 #HANGUL SYLLABLE SSANGSIOS EO RIEULTHIEUTH -0x9BA4 0xC376 #HANGUL SYLLABLE SSANGSIOS EO RIEULPHIEUPH -0x9BA5 0xC377 #HANGUL SYLLABLE SSANGSIOS EO RIEULHIEUH -0x9BA6 0xC37A #HANGUL SYLLABLE SSANGSIOS EO PIEUPSIOS -0x9BA7 0xC37B #HANGUL SYLLABLE SSANGSIOS EO SIOS -0x9BA8 0xC37E #HANGUL SYLLABLE SSANGSIOS EO CIEUC -0x9BA9 0xC37F #HANGUL SYLLABLE SSANGSIOS EO CHIEUCH -0x9BAA 0xC380 #HANGUL SYLLABLE SSANGSIOS EO KHIEUKH -0x9BAB 0xC381 #HANGUL SYLLABLE SSANGSIOS EO THIEUTH -0x9BAC 0xC382 #HANGUL SYLLABLE SSANGSIOS EO PHIEUPH -0x9BAD 0xC383 #HANGUL SYLLABLE SSANGSIOS EO HIEUH -0x9BAE 0xC385 #HANGUL SYLLABLE SSANGSIOS E KIYEOK -0x9BAF 0xC386 #HANGUL SYLLABLE SSANGSIOS E SSANGKIYEOK -0x9BB0 0xC387 #HANGUL SYLLABLE SSANGSIOS E KIYEOKSIOS -0x9BB1 0xC389 #HANGUL SYLLABLE SSANGSIOS E NIEUNCIEUC -0x9BB2 0xC38A #HANGUL SYLLABLE SSANGSIOS E NIEUNHIEUH -0x9BB3 0xC38B #HANGUL SYLLABLE SSANGSIOS E TIKEUT -0x9BB4 0xC38D #HANGUL SYLLABLE SSANGSIOS E RIEULKIYEOK -0x9BB5 0xC38E #HANGUL SYLLABLE SSANGSIOS E RIEULMIEUM -0x9BB6 0xC38F #HANGUL SYLLABLE SSANGSIOS E RIEULPIEUP -0x9BB7 0xC390 #HANGUL SYLLABLE SSANGSIOS E RIEULSIOS -0x9BB8 0xC391 #HANGUL SYLLABLE SSANGSIOS E RIEULTHIEUTH -0x9BB9 0xC392 #HANGUL SYLLABLE SSANGSIOS E RIEULPHIEUPH -0x9BBA 0xC393 #HANGUL SYLLABLE SSANGSIOS E RIEULHIEUH -0x9BBB 0xC394 #HANGUL SYLLABLE SSANGSIOS E MIEUM -0x9BBC 0xC395 #HANGUL SYLLABLE SSANGSIOS E PIEUP -0x9BBD 0xC396 #HANGUL SYLLABLE SSANGSIOS E PIEUPSIOS -0x9BBE 0xC397 #HANGUL SYLLABLE SSANGSIOS E SIOS -0x9BBF 0xC398 #HANGUL SYLLABLE SSANGSIOS E SSANGSIOS -0x9BC0 0xC399 #HANGUL SYLLABLE SSANGSIOS E IEUNG -0x9BC1 0xC39A #HANGUL SYLLABLE SSANGSIOS E CIEUC -0x9BC2 0xC39B #HANGUL SYLLABLE SSANGSIOS E CHIEUCH -0x9BC3 0xC39C #HANGUL SYLLABLE SSANGSIOS E KHIEUKH -0x9BC4 0xC39D #HANGUL SYLLABLE SSANGSIOS E THIEUTH -0x9BC5 0xC39E #HANGUL SYLLABLE SSANGSIOS E PHIEUPH -0x9BC6 0xC39F #HANGUL SYLLABLE SSANGSIOS E HIEUH -0x9BC7 0xC3A0 #HANGUL SYLLABLE SSANGSIOS YEO -0x9BC8 0xC3A1 #HANGUL SYLLABLE SSANGSIOS YEO KIYEOK -0x9BC9 0xC3A2 #HANGUL SYLLABLE SSANGSIOS YEO SSANGKIYEOK -0x9BCA 0xC3A3 #HANGUL SYLLABLE SSANGSIOS YEO KIYEOKSIOS -0x9BCB 0xC3A4 #HANGUL SYLLABLE SSANGSIOS YEO NIEUN -0x9BCC 0xC3A5 #HANGUL SYLLABLE SSANGSIOS YEO NIEUNCIEUC -0x9BCD 0xC3A6 #HANGUL SYLLABLE SSANGSIOS YEO NIEUNHIEUH -0x9BCE 0xC3A7 #HANGUL SYLLABLE SSANGSIOS YEO TIKEUT -0x9BCF 0xC3A8 #HANGUL SYLLABLE SSANGSIOS YEO RIEUL -0x9BD0 0xC3A9 #HANGUL SYLLABLE SSANGSIOS YEO RIEULKIYEOK -0x9BD1 0xC3AA #HANGUL SYLLABLE SSANGSIOS YEO RIEULMIEUM -0x9BD2 0xC3AB #HANGUL SYLLABLE SSANGSIOS YEO RIEULPIEUP -0x9BD3 0xC3AC #HANGUL SYLLABLE SSANGSIOS YEO RIEULSIOS -0x9BD4 0xC3AD #HANGUL SYLLABLE SSANGSIOS YEO RIEULTHIEUTH -0x9BD5 0xC3AE #HANGUL SYLLABLE SSANGSIOS YEO RIEULPHIEUPH -0x9BD6 0xC3AF #HANGUL SYLLABLE SSANGSIOS YEO RIEULHIEUH -0x9BD7 0xC3B0 #HANGUL SYLLABLE SSANGSIOS YEO MIEUM -0x9BD8 0xC3B1 #HANGUL SYLLABLE SSANGSIOS YEO PIEUP -0x9BD9 0xC3B2 #HANGUL SYLLABLE SSANGSIOS YEO PIEUPSIOS -0x9BDA 0xC3B3 #HANGUL SYLLABLE SSANGSIOS YEO SIOS -0x9BDB 0xC3B4 #HANGUL SYLLABLE SSANGSIOS YEO SSANGSIOS -0x9BDC 0xC3B5 #HANGUL SYLLABLE SSANGSIOS YEO IEUNG -0x9BDD 0xC3B6 #HANGUL SYLLABLE SSANGSIOS YEO CIEUC -0x9BDE 0xC3B7 #HANGUL SYLLABLE SSANGSIOS YEO CHIEUCH -0x9BDF 0xC3B8 #HANGUL SYLLABLE SSANGSIOS YEO KHIEUKH -0x9BE0 0xC3B9 #HANGUL SYLLABLE SSANGSIOS YEO THIEUTH -0x9BE1 0xC3BA #HANGUL SYLLABLE SSANGSIOS YEO PHIEUPH -0x9BE2 0xC3BB #HANGUL SYLLABLE SSANGSIOS YEO HIEUH -0x9BE3 0xC3BC #HANGUL SYLLABLE SSANGSIOS YE -0x9BE4 0xC3BD #HANGUL SYLLABLE SSANGSIOS YE KIYEOK -0x9BE5 0xC3BE #HANGUL SYLLABLE SSANGSIOS YE SSANGKIYEOK -0x9BE6 0xC3BF #HANGUL SYLLABLE SSANGSIOS YE KIYEOKSIOS -0x9BE7 0xC3C1 #HANGUL SYLLABLE SSANGSIOS YE NIEUNCIEUC -0x9BE8 0xC3C2 #HANGUL SYLLABLE SSANGSIOS YE NIEUNHIEUH -0x9BE9 0xC3C3 #HANGUL SYLLABLE SSANGSIOS YE TIKEUT -0x9BEA 0xC3C4 #HANGUL SYLLABLE SSANGSIOS YE RIEUL -0x9BEB 0xC3C5 #HANGUL SYLLABLE SSANGSIOS YE RIEULKIYEOK -0x9BEC 0xC3C6 #HANGUL SYLLABLE SSANGSIOS YE RIEULMIEUM -0x9BED 0xC3C7 #HANGUL SYLLABLE SSANGSIOS YE RIEULPIEUP -0x9BEE 0xC3C8 #HANGUL SYLLABLE SSANGSIOS YE RIEULSIOS -0x9BEF 0xC3C9 #HANGUL SYLLABLE SSANGSIOS YE RIEULTHIEUTH -0x9BF0 0xC3CA #HANGUL SYLLABLE SSANGSIOS YE RIEULPHIEUPH -0x9BF1 0xC3CB #HANGUL SYLLABLE SSANGSIOS YE RIEULHIEUH -0x9BF2 0xC3CC #HANGUL SYLLABLE SSANGSIOS YE MIEUM -0x9BF3 0xC3CD #HANGUL SYLLABLE SSANGSIOS YE PIEUP -0x9BF4 0xC3CE #HANGUL SYLLABLE SSANGSIOS YE PIEUPSIOS -0x9BF5 0xC3CF #HANGUL SYLLABLE SSANGSIOS YE SIOS -0x9BF6 0xC3D0 #HANGUL SYLLABLE SSANGSIOS YE SSANGSIOS -0x9BF7 0xC3D1 #HANGUL SYLLABLE SSANGSIOS YE IEUNG -0x9BF8 0xC3D2 #HANGUL SYLLABLE SSANGSIOS YE CIEUC -0x9BF9 0xC3D3 #HANGUL SYLLABLE SSANGSIOS YE CHIEUCH -0x9BFA 0xC3D4 #HANGUL SYLLABLE SSANGSIOS YE KHIEUKH -0x9BFB 0xC3D5 #HANGUL SYLLABLE SSANGSIOS YE THIEUTH -0x9BFC 0xC3D6 #HANGUL SYLLABLE SSANGSIOS YE PHIEUPH -0x9BFD 0xC3D7 #HANGUL SYLLABLE SSANGSIOS YE HIEUH -0x9BFE 0xC3DA #HANGUL SYLLABLE SSANGSIOS O SSANGKIYEOK -0x9C41 0xC3DB #HANGUL SYLLABLE SSANGSIOS O KIYEOKSIOS -0x9C42 0xC3DD #HANGUL SYLLABLE SSANGSIOS O NIEUNCIEUC -0x9C43 0xC3DE #HANGUL SYLLABLE SSANGSIOS O NIEUNHIEUH -0x9C44 0xC3E1 #HANGUL SYLLABLE SSANGSIOS O RIEULKIYEOK -0x9C45 0xC3E3 #HANGUL SYLLABLE SSANGSIOS O RIEULPIEUP -0x9C46 0xC3E4 #HANGUL SYLLABLE SSANGSIOS O RIEULSIOS -0x9C47 0xC3E5 #HANGUL SYLLABLE SSANGSIOS O RIEULTHIEUTH -0x9C48 0xC3E6 #HANGUL SYLLABLE SSANGSIOS O RIEULPHIEUPH -0x9C49 0xC3E7 #HANGUL SYLLABLE SSANGSIOS O RIEULHIEUH -0x9C4A 0xC3EA #HANGUL SYLLABLE SSANGSIOS O PIEUPSIOS -0x9C4B 0xC3EB #HANGUL SYLLABLE SSANGSIOS O SIOS -0x9C4C 0xC3EC #HANGUL SYLLABLE SSANGSIOS O SSANGSIOS -0x9C4D 0xC3EE #HANGUL SYLLABLE SSANGSIOS O CIEUC -0x9C4E 0xC3EF #HANGUL SYLLABLE SSANGSIOS O CHIEUCH -0x9C4F 0xC3F0 #HANGUL SYLLABLE SSANGSIOS O KHIEUKH -0x9C50 0xC3F1 #HANGUL SYLLABLE SSANGSIOS O THIEUTH -0x9C51 0xC3F2 #HANGUL SYLLABLE SSANGSIOS O PHIEUPH -0x9C52 0xC3F3 #HANGUL SYLLABLE SSANGSIOS O HIEUH -0x9C53 0xC3F6 #HANGUL SYLLABLE SSANGSIOS WA SSANGKIYEOK -0x9C54 0xC3F7 #HANGUL SYLLABLE SSANGSIOS WA KIYEOKSIOS -0x9C55 0xC3F9 #HANGUL SYLLABLE SSANGSIOS WA NIEUNCIEUC -0x9C56 0xC3FA #HANGUL SYLLABLE SSANGSIOS WA NIEUNHIEUH -0x9C57 0xC3FB #HANGUL SYLLABLE SSANGSIOS WA TIKEUT -0x9C58 0xC3FC #HANGUL SYLLABLE SSANGSIOS WA RIEUL -0x9C59 0xC3FD #HANGUL SYLLABLE SSANGSIOS WA RIEULKIYEOK -0x9C5A 0xC3FE #HANGUL SYLLABLE SSANGSIOS WA RIEULMIEUM -0x9C61 0xC3FF #HANGUL SYLLABLE SSANGSIOS WA RIEULPIEUP -0x9C62 0xC400 #HANGUL SYLLABLE SSANGSIOS WA RIEULSIOS -0x9C63 0xC401 #HANGUL SYLLABLE SSANGSIOS WA RIEULTHIEUTH -0x9C64 0xC402 #HANGUL SYLLABLE SSANGSIOS WA RIEULPHIEUPH -0x9C65 0xC403 #HANGUL SYLLABLE SSANGSIOS WA RIEULHIEUH -0x9C66 0xC404 #HANGUL SYLLABLE SSANGSIOS WA MIEUM -0x9C67 0xC405 #HANGUL SYLLABLE SSANGSIOS WA PIEUP -0x9C68 0xC406 #HANGUL SYLLABLE SSANGSIOS WA PIEUPSIOS -0x9C69 0xC407 #HANGUL SYLLABLE SSANGSIOS WA SIOS -0x9C6A 0xC409 #HANGUL SYLLABLE SSANGSIOS WA IEUNG -0x9C6B 0xC40A #HANGUL SYLLABLE SSANGSIOS WA CIEUC -0x9C6C 0xC40B #HANGUL SYLLABLE SSANGSIOS WA CHIEUCH -0x9C6D 0xC40C #HANGUL SYLLABLE SSANGSIOS WA KHIEUKH -0x9C6E 0xC40D #HANGUL SYLLABLE SSANGSIOS WA THIEUTH -0x9C6F 0xC40E #HANGUL SYLLABLE SSANGSIOS WA PHIEUPH -0x9C70 0xC40F #HANGUL SYLLABLE SSANGSIOS WA HIEUH -0x9C71 0xC411 #HANGUL SYLLABLE SSANGSIOS WAE KIYEOK -0x9C72 0xC412 #HANGUL SYLLABLE SSANGSIOS WAE SSANGKIYEOK -0x9C73 0xC413 #HANGUL SYLLABLE SSANGSIOS WAE KIYEOKSIOS -0x9C74 0xC414 #HANGUL SYLLABLE SSANGSIOS WAE NIEUN -0x9C75 0xC415 #HANGUL SYLLABLE SSANGSIOS WAE NIEUNCIEUC -0x9C76 0xC416 #HANGUL SYLLABLE SSANGSIOS WAE NIEUNHIEUH -0x9C77 0xC417 #HANGUL SYLLABLE SSANGSIOS WAE TIKEUT -0x9C78 0xC418 #HANGUL SYLLABLE SSANGSIOS WAE RIEUL -0x9C79 0xC419 #HANGUL SYLLABLE SSANGSIOS WAE RIEULKIYEOK -0x9C7A 0xC41A #HANGUL SYLLABLE SSANGSIOS WAE RIEULMIEUM -0x9C81 0xC41B #HANGUL SYLLABLE SSANGSIOS WAE RIEULPIEUP -0x9C82 0xC41C #HANGUL SYLLABLE SSANGSIOS WAE RIEULSIOS -0x9C83 0xC41D #HANGUL SYLLABLE SSANGSIOS WAE RIEULTHIEUTH -0x9C84 0xC41E #HANGUL SYLLABLE SSANGSIOS WAE RIEULPHIEUPH -0x9C85 0xC41F #HANGUL SYLLABLE SSANGSIOS WAE RIEULHIEUH -0x9C86 0xC420 #HANGUL SYLLABLE SSANGSIOS WAE MIEUM -0x9C87 0xC421 #HANGUL SYLLABLE SSANGSIOS WAE PIEUP -0x9C88 0xC422 #HANGUL SYLLABLE SSANGSIOS WAE PIEUPSIOS -0x9C89 0xC423 #HANGUL SYLLABLE SSANGSIOS WAE SIOS -0x9C8A 0xC425 #HANGUL SYLLABLE SSANGSIOS WAE IEUNG -0x9C8B 0xC426 #HANGUL SYLLABLE SSANGSIOS WAE CIEUC -0x9C8C 0xC427 #HANGUL SYLLABLE SSANGSIOS WAE CHIEUCH -0x9C8D 0xC428 #HANGUL SYLLABLE SSANGSIOS WAE KHIEUKH -0x9C8E 0xC429 #HANGUL SYLLABLE SSANGSIOS WAE THIEUTH -0x9C8F 0xC42A #HANGUL SYLLABLE SSANGSIOS WAE PHIEUPH -0x9C90 0xC42B #HANGUL SYLLABLE SSANGSIOS WAE HIEUH -0x9C91 0xC42D #HANGUL SYLLABLE SSANGSIOS OE KIYEOK -0x9C92 0xC42E #HANGUL SYLLABLE SSANGSIOS OE SSANGKIYEOK -0x9C93 0xC42F #HANGUL SYLLABLE SSANGSIOS OE KIYEOKSIOS -0x9C94 0xC431 #HANGUL SYLLABLE SSANGSIOS OE NIEUNCIEUC -0x9C95 0xC432 #HANGUL SYLLABLE SSANGSIOS OE NIEUNHIEUH -0x9C96 0xC433 #HANGUL SYLLABLE SSANGSIOS OE TIKEUT -0x9C97 0xC435 #HANGUL SYLLABLE SSANGSIOS OE RIEULKIYEOK -0x9C98 0xC436 #HANGUL SYLLABLE SSANGSIOS OE RIEULMIEUM -0x9C99 0xC437 #HANGUL SYLLABLE SSANGSIOS OE RIEULPIEUP -0x9C9A 0xC438 #HANGUL SYLLABLE SSANGSIOS OE RIEULSIOS -0x9C9B 0xC439 #HANGUL SYLLABLE SSANGSIOS OE RIEULTHIEUTH -0x9C9C 0xC43A #HANGUL SYLLABLE SSANGSIOS OE RIEULPHIEUPH -0x9C9D 0xC43B #HANGUL SYLLABLE SSANGSIOS OE RIEULHIEUH -0x9C9E 0xC43E #HANGUL SYLLABLE SSANGSIOS OE PIEUPSIOS -0x9C9F 0xC43F #HANGUL SYLLABLE SSANGSIOS OE SIOS -0x9CA0 0xC440 #HANGUL SYLLABLE SSANGSIOS OE SSANGSIOS -0x9CA1 0xC441 #HANGUL SYLLABLE SSANGSIOS OE IEUNG -0x9CA2 0xC442 #HANGUL SYLLABLE SSANGSIOS OE CIEUC -0x9CA3 0xC443 #HANGUL SYLLABLE SSANGSIOS OE CHIEUCH -0x9CA4 0xC444 #HANGUL SYLLABLE SSANGSIOS OE KHIEUKH -0x9CA5 0xC445 #HANGUL SYLLABLE SSANGSIOS OE THIEUTH -0x9CA6 0xC446 #HANGUL SYLLABLE SSANGSIOS OE PHIEUPH -0x9CA7 0xC447 #HANGUL SYLLABLE SSANGSIOS OE HIEUH -0x9CA8 0xC449 #HANGUL SYLLABLE SSANGSIOS YO KIYEOK -0x9CA9 0xC44A #HANGUL SYLLABLE SSANGSIOS YO SSANGKIYEOK -0x9CAA 0xC44B #HANGUL SYLLABLE SSANGSIOS YO KIYEOKSIOS -0x9CAB 0xC44C #HANGUL SYLLABLE SSANGSIOS YO NIEUN -0x9CAC 0xC44D #HANGUL SYLLABLE SSANGSIOS YO NIEUNCIEUC -0x9CAD 0xC44E #HANGUL SYLLABLE SSANGSIOS YO NIEUNHIEUH -0x9CAE 0xC44F #HANGUL SYLLABLE SSANGSIOS YO TIKEUT -0x9CAF 0xC450 #HANGUL SYLLABLE SSANGSIOS YO RIEUL -0x9CB0 0xC451 #HANGUL SYLLABLE SSANGSIOS YO RIEULKIYEOK -0x9CB1 0xC452 #HANGUL SYLLABLE SSANGSIOS YO RIEULMIEUM -0x9CB2 0xC453 #HANGUL SYLLABLE SSANGSIOS YO RIEULPIEUP -0x9CB3 0xC454 #HANGUL SYLLABLE SSANGSIOS YO RIEULSIOS -0x9CB4 0xC455 #HANGUL SYLLABLE SSANGSIOS YO RIEULTHIEUTH -0x9CB5 0xC456 #HANGUL SYLLABLE SSANGSIOS YO RIEULPHIEUPH -0x9CB6 0xC457 #HANGUL SYLLABLE SSANGSIOS YO RIEULHIEUH -0x9CB7 0xC458 #HANGUL SYLLABLE SSANGSIOS YO MIEUM -0x9CB8 0xC459 #HANGUL SYLLABLE SSANGSIOS YO PIEUP -0x9CB9 0xC45A #HANGUL SYLLABLE SSANGSIOS YO PIEUPSIOS -0x9CBA 0xC45B #HANGUL SYLLABLE SSANGSIOS YO SIOS -0x9CBB 0xC45C #HANGUL SYLLABLE SSANGSIOS YO SSANGSIOS -0x9CBC 0xC45D #HANGUL SYLLABLE SSANGSIOS YO IEUNG -0x9CBD 0xC45E #HANGUL SYLLABLE SSANGSIOS YO CIEUC -0x9CBE 0xC45F #HANGUL SYLLABLE SSANGSIOS YO CHIEUCH -0x9CBF 0xC460 #HANGUL SYLLABLE SSANGSIOS YO KHIEUKH -0x9CC0 0xC461 #HANGUL SYLLABLE SSANGSIOS YO THIEUTH -0x9CC1 0xC462 #HANGUL SYLLABLE SSANGSIOS YO PHIEUPH -0x9CC2 0xC463 #HANGUL SYLLABLE SSANGSIOS YO HIEUH -0x9CC3 0xC466 #HANGUL SYLLABLE SSANGSIOS U SSANGKIYEOK -0x9CC4 0xC467 #HANGUL SYLLABLE SSANGSIOS U KIYEOKSIOS -0x9CC5 0xC469 #HANGUL SYLLABLE SSANGSIOS U NIEUNCIEUC -0x9CC6 0xC46A #HANGUL SYLLABLE SSANGSIOS U NIEUNHIEUH -0x9CC7 0xC46B #HANGUL SYLLABLE SSANGSIOS U TIKEUT -0x9CC8 0xC46D #HANGUL SYLLABLE SSANGSIOS U RIEULKIYEOK -0x9CC9 0xC46E #HANGUL SYLLABLE SSANGSIOS U RIEULMIEUM -0x9CCA 0xC46F #HANGUL SYLLABLE SSANGSIOS U RIEULPIEUP -0x9CCB 0xC470 #HANGUL SYLLABLE SSANGSIOS U RIEULSIOS -0x9CCC 0xC471 #HANGUL SYLLABLE SSANGSIOS U RIEULTHIEUTH -0x9CCD 0xC472 #HANGUL SYLLABLE SSANGSIOS U RIEULPHIEUPH -0x9CCE 0xC473 #HANGUL SYLLABLE SSANGSIOS U RIEULHIEUH -0x9CCF 0xC476 #HANGUL SYLLABLE SSANGSIOS U PIEUPSIOS -0x9CD0 0xC477 #HANGUL SYLLABLE SSANGSIOS U SIOS -0x9CD1 0xC478 #HANGUL SYLLABLE SSANGSIOS U SSANGSIOS -0x9CD2 0xC47A #HANGUL SYLLABLE SSANGSIOS U CIEUC -0x9CD3 0xC47B #HANGUL SYLLABLE SSANGSIOS U CHIEUCH -0x9CD4 0xC47C #HANGUL SYLLABLE SSANGSIOS U KHIEUKH -0x9CD5 0xC47D #HANGUL SYLLABLE SSANGSIOS U THIEUTH -0x9CD6 0xC47E #HANGUL SYLLABLE SSANGSIOS U PHIEUPH -0x9CD7 0xC47F #HANGUL SYLLABLE SSANGSIOS U HIEUH -0x9CD8 0xC481 #HANGUL SYLLABLE SSANGSIOS WEO KIYEOK -0x9CD9 0xC482 #HANGUL SYLLABLE SSANGSIOS WEO SSANGKIYEOK -0x9CDA 0xC483 #HANGUL SYLLABLE SSANGSIOS WEO KIYEOKSIOS -0x9CDB 0xC484 #HANGUL SYLLABLE SSANGSIOS WEO NIEUN -0x9CDC 0xC485 #HANGUL SYLLABLE SSANGSIOS WEO NIEUNCIEUC -0x9CDD 0xC486 #HANGUL SYLLABLE SSANGSIOS WEO NIEUNHIEUH -0x9CDE 0xC487 #HANGUL SYLLABLE SSANGSIOS WEO TIKEUT -0x9CDF 0xC488 #HANGUL SYLLABLE SSANGSIOS WEO RIEUL -0x9CE0 0xC489 #HANGUL SYLLABLE SSANGSIOS WEO RIEULKIYEOK -0x9CE1 0xC48A #HANGUL SYLLABLE SSANGSIOS WEO RIEULMIEUM -0x9CE2 0xC48B #HANGUL SYLLABLE SSANGSIOS WEO RIEULPIEUP -0x9CE3 0xC48C #HANGUL SYLLABLE SSANGSIOS WEO RIEULSIOS -0x9CE4 0xC48D #HANGUL SYLLABLE SSANGSIOS WEO RIEULTHIEUTH -0x9CE5 0xC48E #HANGUL SYLLABLE SSANGSIOS WEO RIEULPHIEUPH -0x9CE6 0xC48F #HANGUL SYLLABLE SSANGSIOS WEO RIEULHIEUH -0x9CE7 0xC490 #HANGUL SYLLABLE SSANGSIOS WEO MIEUM -0x9CE8 0xC491 #HANGUL SYLLABLE SSANGSIOS WEO PIEUP -0x9CE9 0xC492 #HANGUL SYLLABLE SSANGSIOS WEO PIEUPSIOS -0x9CEA 0xC493 #HANGUL SYLLABLE SSANGSIOS WEO SIOS -0x9CEB 0xC495 #HANGUL SYLLABLE SSANGSIOS WEO IEUNG -0x9CEC 0xC496 #HANGUL SYLLABLE SSANGSIOS WEO CIEUC -0x9CED 0xC497 #HANGUL SYLLABLE SSANGSIOS WEO CHIEUCH -0x9CEE 0xC498 #HANGUL SYLLABLE SSANGSIOS WEO KHIEUKH -0x9CEF 0xC499 #HANGUL SYLLABLE SSANGSIOS WEO THIEUTH -0x9CF0 0xC49A #HANGUL SYLLABLE SSANGSIOS WEO PHIEUPH -0x9CF1 0xC49B #HANGUL SYLLABLE SSANGSIOS WEO HIEUH -0x9CF2 0xC49D #HANGUL SYLLABLE SSANGSIOS WE KIYEOK -0x9CF3 0xC49E #HANGUL SYLLABLE SSANGSIOS WE SSANGKIYEOK -0x9CF4 0xC49F #HANGUL SYLLABLE SSANGSIOS WE KIYEOKSIOS -0x9CF5 0xC4A0 #HANGUL SYLLABLE SSANGSIOS WE NIEUN -0x9CF6 0xC4A1 #HANGUL SYLLABLE SSANGSIOS WE NIEUNCIEUC -0x9CF7 0xC4A2 #HANGUL SYLLABLE SSANGSIOS WE NIEUNHIEUH -0x9CF8 0xC4A3 #HANGUL SYLLABLE SSANGSIOS WE TIKEUT -0x9CF9 0xC4A4 #HANGUL SYLLABLE SSANGSIOS WE RIEUL -0x9CFA 0xC4A5 #HANGUL SYLLABLE SSANGSIOS WE RIEULKIYEOK -0x9CFB 0xC4A6 #HANGUL SYLLABLE SSANGSIOS WE RIEULMIEUM -0x9CFC 0xC4A7 #HANGUL SYLLABLE SSANGSIOS WE RIEULPIEUP -0x9CFD 0xC4A8 #HANGUL SYLLABLE SSANGSIOS WE RIEULSIOS -0x9CFE 0xC4A9 #HANGUL SYLLABLE SSANGSIOS WE RIEULTHIEUTH -0x9D41 0xC4AA #HANGUL SYLLABLE SSANGSIOS WE RIEULPHIEUPH -0x9D42 0xC4AB #HANGUL SYLLABLE SSANGSIOS WE RIEULHIEUH -0x9D43 0xC4AC #HANGUL SYLLABLE SSANGSIOS WE MIEUM -0x9D44 0xC4AD #HANGUL SYLLABLE SSANGSIOS WE PIEUP -0x9D45 0xC4AE #HANGUL SYLLABLE SSANGSIOS WE PIEUPSIOS -0x9D46 0xC4AF #HANGUL SYLLABLE SSANGSIOS WE SIOS -0x9D47 0xC4B0 #HANGUL SYLLABLE SSANGSIOS WE SSANGSIOS -0x9D48 0xC4B1 #HANGUL SYLLABLE SSANGSIOS WE IEUNG -0x9D49 0xC4B2 #HANGUL SYLLABLE SSANGSIOS WE CIEUC -0x9D4A 0xC4B3 #HANGUL SYLLABLE SSANGSIOS WE CHIEUCH -0x9D4B 0xC4B4 #HANGUL SYLLABLE SSANGSIOS WE KHIEUKH -0x9D4C 0xC4B5 #HANGUL SYLLABLE SSANGSIOS WE THIEUTH -0x9D4D 0xC4B6 #HANGUL SYLLABLE SSANGSIOS WE PHIEUPH -0x9D4E 0xC4B7 #HANGUL SYLLABLE SSANGSIOS WE HIEUH -0x9D4F 0xC4B9 #HANGUL SYLLABLE SSANGSIOS WI KIYEOK -0x9D50 0xC4BA #HANGUL SYLLABLE SSANGSIOS WI SSANGKIYEOK -0x9D51 0xC4BB #HANGUL SYLLABLE SSANGSIOS WI KIYEOKSIOS -0x9D52 0xC4BD #HANGUL SYLLABLE SSANGSIOS WI NIEUNCIEUC -0x9D53 0xC4BE #HANGUL SYLLABLE SSANGSIOS WI NIEUNHIEUH -0x9D54 0xC4BF #HANGUL SYLLABLE SSANGSIOS WI TIKEUT -0x9D55 0xC4C0 #HANGUL SYLLABLE SSANGSIOS WI RIEUL -0x9D56 0xC4C1 #HANGUL SYLLABLE SSANGSIOS WI RIEULKIYEOK -0x9D57 0xC4C2 #HANGUL SYLLABLE SSANGSIOS WI RIEULMIEUM -0x9D58 0xC4C3 #HANGUL SYLLABLE SSANGSIOS WI RIEULPIEUP -0x9D59 0xC4C4 #HANGUL SYLLABLE SSANGSIOS WI RIEULSIOS -0x9D5A 0xC4C5 #HANGUL SYLLABLE SSANGSIOS WI RIEULTHIEUTH -0x9D61 0xC4C6 #HANGUL SYLLABLE SSANGSIOS WI RIEULPHIEUPH -0x9D62 0xC4C7 #HANGUL SYLLABLE SSANGSIOS WI RIEULHIEUH -0x9D63 0xC4C8 #HANGUL SYLLABLE SSANGSIOS WI MIEUM -0x9D64 0xC4C9 #HANGUL SYLLABLE SSANGSIOS WI PIEUP -0x9D65 0xC4CA #HANGUL SYLLABLE SSANGSIOS WI PIEUPSIOS -0x9D66 0xC4CB #HANGUL SYLLABLE SSANGSIOS WI SIOS -0x9D67 0xC4CC #HANGUL SYLLABLE SSANGSIOS WI SSANGSIOS -0x9D68 0xC4CD #HANGUL SYLLABLE SSANGSIOS WI IEUNG -0x9D69 0xC4CE #HANGUL SYLLABLE SSANGSIOS WI CIEUC -0x9D6A 0xC4CF #HANGUL SYLLABLE SSANGSIOS WI CHIEUCH -0x9D6B 0xC4D0 #HANGUL SYLLABLE SSANGSIOS WI KHIEUKH -0x9D6C 0xC4D1 #HANGUL SYLLABLE SSANGSIOS WI THIEUTH -0x9D6D 0xC4D2 #HANGUL SYLLABLE SSANGSIOS WI PHIEUPH -0x9D6E 0xC4D3 #HANGUL SYLLABLE SSANGSIOS WI HIEUH -0x9D6F 0xC4D4 #HANGUL SYLLABLE SSANGSIOS YU -0x9D70 0xC4D5 #HANGUL SYLLABLE SSANGSIOS YU KIYEOK -0x9D71 0xC4D6 #HANGUL SYLLABLE SSANGSIOS YU SSANGKIYEOK -0x9D72 0xC4D7 #HANGUL SYLLABLE SSANGSIOS YU KIYEOKSIOS -0x9D73 0xC4D8 #HANGUL SYLLABLE SSANGSIOS YU NIEUN -0x9D74 0xC4D9 #HANGUL SYLLABLE SSANGSIOS YU NIEUNCIEUC -0x9D75 0xC4DA #HANGUL SYLLABLE SSANGSIOS YU NIEUNHIEUH -0x9D76 0xC4DB #HANGUL SYLLABLE SSANGSIOS YU TIKEUT -0x9D77 0xC4DC #HANGUL SYLLABLE SSANGSIOS YU RIEUL -0x9D78 0xC4DD #HANGUL SYLLABLE SSANGSIOS YU RIEULKIYEOK -0x9D79 0xC4DE #HANGUL SYLLABLE SSANGSIOS YU RIEULMIEUM -0x9D7A 0xC4DF #HANGUL SYLLABLE SSANGSIOS YU RIEULPIEUP -0x9D81 0xC4E0 #HANGUL SYLLABLE SSANGSIOS YU RIEULSIOS -0x9D82 0xC4E1 #HANGUL SYLLABLE SSANGSIOS YU RIEULTHIEUTH -0x9D83 0xC4E2 #HANGUL SYLLABLE SSANGSIOS YU RIEULPHIEUPH -0x9D84 0xC4E3 #HANGUL SYLLABLE SSANGSIOS YU RIEULHIEUH -0x9D85 0xC4E4 #HANGUL SYLLABLE SSANGSIOS YU MIEUM -0x9D86 0xC4E5 #HANGUL SYLLABLE SSANGSIOS YU PIEUP -0x9D87 0xC4E6 #HANGUL SYLLABLE SSANGSIOS YU PIEUPSIOS -0x9D88 0xC4E7 #HANGUL SYLLABLE SSANGSIOS YU SIOS -0x9D89 0xC4E8 #HANGUL SYLLABLE SSANGSIOS YU SSANGSIOS -0x9D8A 0xC4EA #HANGUL SYLLABLE SSANGSIOS YU CIEUC -0x9D8B 0xC4EB #HANGUL SYLLABLE SSANGSIOS YU CHIEUCH -0x9D8C 0xC4EC #HANGUL SYLLABLE SSANGSIOS YU KHIEUKH -0x9D8D 0xC4ED #HANGUL SYLLABLE SSANGSIOS YU THIEUTH -0x9D8E 0xC4EE #HANGUL SYLLABLE SSANGSIOS YU PHIEUPH -0x9D8F 0xC4EF #HANGUL SYLLABLE SSANGSIOS YU HIEUH -0x9D90 0xC4F2 #HANGUL SYLLABLE SSANGSIOS EU SSANGKIYEOK -0x9D91 0xC4F3 #HANGUL SYLLABLE SSANGSIOS EU KIYEOKSIOS -0x9D92 0xC4F5 #HANGUL SYLLABLE SSANGSIOS EU NIEUNCIEUC -0x9D93 0xC4F6 #HANGUL SYLLABLE SSANGSIOS EU NIEUNHIEUH -0x9D94 0xC4F7 #HANGUL SYLLABLE SSANGSIOS EU TIKEUT -0x9D95 0xC4F9 #HANGUL SYLLABLE SSANGSIOS EU RIEULKIYEOK -0x9D96 0xC4FB #HANGUL SYLLABLE SSANGSIOS EU RIEULPIEUP -0x9D97 0xC4FC #HANGUL SYLLABLE SSANGSIOS EU RIEULSIOS -0x9D98 0xC4FD #HANGUL SYLLABLE SSANGSIOS EU RIEULTHIEUTH -0x9D99 0xC4FE #HANGUL SYLLABLE SSANGSIOS EU RIEULPHIEUPH -0x9D9A 0xC502 #HANGUL SYLLABLE SSANGSIOS EU PIEUPSIOS -0x9D9B 0xC503 #HANGUL SYLLABLE SSANGSIOS EU SIOS -0x9D9C 0xC504 #HANGUL SYLLABLE SSANGSIOS EU SSANGSIOS -0x9D9D 0xC505 #HANGUL SYLLABLE SSANGSIOS EU IEUNG -0x9D9E 0xC506 #HANGUL SYLLABLE SSANGSIOS EU CIEUC -0x9D9F 0xC507 #HANGUL SYLLABLE SSANGSIOS EU CHIEUCH -0x9DA0 0xC508 #HANGUL SYLLABLE SSANGSIOS EU KHIEUKH -0x9DA1 0xC509 #HANGUL SYLLABLE SSANGSIOS EU THIEUTH -0x9DA2 0xC50A #HANGUL SYLLABLE SSANGSIOS EU PHIEUPH -0x9DA3 0xC50B #HANGUL SYLLABLE SSANGSIOS EU HIEUH -0x9DA4 0xC50D #HANGUL SYLLABLE SSANGSIOS YI KIYEOK -0x9DA5 0xC50E #HANGUL SYLLABLE SSANGSIOS YI SSANGKIYEOK -0x9DA6 0xC50F #HANGUL SYLLABLE SSANGSIOS YI KIYEOKSIOS -0x9DA7 0xC511 #HANGUL SYLLABLE SSANGSIOS YI NIEUNCIEUC -0x9DA8 0xC512 #HANGUL SYLLABLE SSANGSIOS YI NIEUNHIEUH -0x9DA9 0xC513 #HANGUL SYLLABLE SSANGSIOS YI TIKEUT -0x9DAA 0xC515 #HANGUL SYLLABLE SSANGSIOS YI RIEULKIYEOK -0x9DAB 0xC516 #HANGUL SYLLABLE SSANGSIOS YI RIEULMIEUM -0x9DAC 0xC517 #HANGUL SYLLABLE SSANGSIOS YI RIEULPIEUP -0x9DAD 0xC518 #HANGUL SYLLABLE SSANGSIOS YI RIEULSIOS -0x9DAE 0xC519 #HANGUL SYLLABLE SSANGSIOS YI RIEULTHIEUTH -0x9DAF 0xC51A #HANGUL SYLLABLE SSANGSIOS YI RIEULPHIEUPH -0x9DB0 0xC51B #HANGUL SYLLABLE SSANGSIOS YI RIEULHIEUH -0x9DB1 0xC51D #HANGUL SYLLABLE SSANGSIOS YI PIEUP -0x9DB2 0xC51E #HANGUL SYLLABLE SSANGSIOS YI PIEUPSIOS -0x9DB3 0xC51F #HANGUL SYLLABLE SSANGSIOS YI SIOS -0x9DB4 0xC520 #HANGUL SYLLABLE SSANGSIOS YI SSANGSIOS -0x9DB5 0xC521 #HANGUL SYLLABLE SSANGSIOS YI IEUNG -0x9DB6 0xC522 #HANGUL SYLLABLE SSANGSIOS YI CIEUC -0x9DB7 0xC523 #HANGUL SYLLABLE SSANGSIOS YI CHIEUCH -0x9DB8 0xC524 #HANGUL SYLLABLE SSANGSIOS YI KHIEUKH -0x9DB9 0xC525 #HANGUL SYLLABLE SSANGSIOS YI THIEUTH -0x9DBA 0xC526 #HANGUL SYLLABLE SSANGSIOS YI PHIEUPH -0x9DBB 0xC527 #HANGUL SYLLABLE SSANGSIOS YI HIEUH -0x9DBC 0xC52A #HANGUL SYLLABLE SSANGSIOS I SSANGKIYEOK -0x9DBD 0xC52B #HANGUL SYLLABLE SSANGSIOS I KIYEOKSIOS -0x9DBE 0xC52D #HANGUL SYLLABLE SSANGSIOS I NIEUNCIEUC -0x9DBF 0xC52E #HANGUL SYLLABLE SSANGSIOS I NIEUNHIEUH -0x9DC0 0xC52F #HANGUL SYLLABLE SSANGSIOS I TIKEUT -0x9DC1 0xC531 #HANGUL SYLLABLE SSANGSIOS I RIEULKIYEOK -0x9DC2 0xC532 #HANGUL SYLLABLE SSANGSIOS I RIEULMIEUM -0x9DC3 0xC533 #HANGUL SYLLABLE SSANGSIOS I RIEULPIEUP -0x9DC4 0xC534 #HANGUL SYLLABLE SSANGSIOS I RIEULSIOS -0x9DC5 0xC535 #HANGUL SYLLABLE SSANGSIOS I RIEULTHIEUTH -0x9DC6 0xC536 #HANGUL SYLLABLE SSANGSIOS I RIEULPHIEUPH -0x9DC7 0xC537 #HANGUL SYLLABLE SSANGSIOS I RIEULHIEUH -0x9DC8 0xC53A #HANGUL SYLLABLE SSANGSIOS I PIEUPSIOS -0x9DC9 0xC53C #HANGUL SYLLABLE SSANGSIOS I SSANGSIOS -0x9DCA 0xC53E #HANGUL SYLLABLE SSANGSIOS I CIEUC -0x9DCB 0xC53F #HANGUL SYLLABLE SSANGSIOS I CHIEUCH -0x9DCC 0xC540 #HANGUL SYLLABLE SSANGSIOS I KHIEUKH -0x9DCD 0xC541 #HANGUL SYLLABLE SSANGSIOS I THIEUTH -0x9DCE 0xC542 #HANGUL SYLLABLE SSANGSIOS I PHIEUPH -0x9DCF 0xC543 #HANGUL SYLLABLE SSANGSIOS I HIEUH -0x9DD0 0xC546 #HANGUL SYLLABLE IEUNG A SSANGKIYEOK -0x9DD1 0xC547 #HANGUL SYLLABLE IEUNG A KIYEOKSIOS -0x9DD2 0xC54B #HANGUL SYLLABLE IEUNG A TIKEUT -0x9DD3 0xC54F #HANGUL SYLLABLE IEUNG A RIEULPIEUP -0x9DD4 0xC550 #HANGUL SYLLABLE IEUNG A RIEULSIOS -0x9DD5 0xC551 #HANGUL SYLLABLE IEUNG A RIEULTHIEUTH -0x9DD6 0xC552 #HANGUL SYLLABLE IEUNG A RIEULPHIEUPH -0x9DD7 0xC556 #HANGUL SYLLABLE IEUNG A PIEUPSIOS -0x9DD8 0xC55A #HANGUL SYLLABLE IEUNG A CIEUC -0x9DD9 0xC55B #HANGUL SYLLABLE IEUNG A CHIEUCH -0x9DDA 0xC55C #HANGUL SYLLABLE IEUNG A KHIEUKH -0x9DDB 0xC55F #HANGUL SYLLABLE IEUNG A HIEUH -0x9DDC 0xC562 #HANGUL SYLLABLE IEUNG AE SSANGKIYEOK -0x9DDD 0xC563 #HANGUL SYLLABLE IEUNG AE KIYEOKSIOS -0x9DDE 0xC565 #HANGUL SYLLABLE IEUNG AE NIEUNCIEUC -0x9DDF 0xC566 #HANGUL SYLLABLE IEUNG AE NIEUNHIEUH -0x9DE0 0xC567 #HANGUL SYLLABLE IEUNG AE TIKEUT -0x9DE1 0xC569 #HANGUL SYLLABLE IEUNG AE RIEULKIYEOK -0x9DE2 0xC56A #HANGUL SYLLABLE IEUNG AE RIEULMIEUM -0x9DE3 0xC56B #HANGUL SYLLABLE IEUNG AE RIEULPIEUP -0x9DE4 0xC56C #HANGUL SYLLABLE IEUNG AE RIEULSIOS -0x9DE5 0xC56D #HANGUL SYLLABLE IEUNG AE RIEULTHIEUTH -0x9DE6 0xC56E #HANGUL SYLLABLE IEUNG AE RIEULPHIEUPH -0x9DE7 0xC56F #HANGUL SYLLABLE IEUNG AE RIEULHIEUH -0x9DE8 0xC572 #HANGUL SYLLABLE IEUNG AE PIEUPSIOS -0x9DE9 0xC576 #HANGUL SYLLABLE IEUNG AE CIEUC -0x9DEA 0xC577 #HANGUL SYLLABLE IEUNG AE CHIEUCH -0x9DEB 0xC578 #HANGUL SYLLABLE IEUNG AE KHIEUKH -0x9DEC 0xC579 #HANGUL SYLLABLE IEUNG AE THIEUTH -0x9DED 0xC57A #HANGUL SYLLABLE IEUNG AE PHIEUPH -0x9DEE 0xC57B #HANGUL SYLLABLE IEUNG AE HIEUH -0x9DEF 0xC57E #HANGUL SYLLABLE IEUNG YA SSANGKIYEOK -0x9DF0 0xC57F #HANGUL SYLLABLE IEUNG YA KIYEOKSIOS -0x9DF1 0xC581 #HANGUL SYLLABLE IEUNG YA NIEUNCIEUC -0x9DF2 0xC582 #HANGUL SYLLABLE IEUNG YA NIEUNHIEUH -0x9DF3 0xC583 #HANGUL SYLLABLE IEUNG YA TIKEUT -0x9DF4 0xC585 #HANGUL SYLLABLE IEUNG YA RIEULKIYEOK -0x9DF5 0xC586 #HANGUL SYLLABLE IEUNG YA RIEULMIEUM -0x9DF6 0xC588 #HANGUL SYLLABLE IEUNG YA RIEULSIOS -0x9DF7 0xC589 #HANGUL SYLLABLE IEUNG YA RIEULTHIEUTH -0x9DF8 0xC58A #HANGUL SYLLABLE IEUNG YA RIEULPHIEUPH -0x9DF9 0xC58B #HANGUL SYLLABLE IEUNG YA RIEULHIEUH -0x9DFA 0xC58E #HANGUL SYLLABLE IEUNG YA PIEUPSIOS -0x9DFB 0xC590 #HANGUL SYLLABLE IEUNG YA SSANGSIOS -0x9DFC 0xC592 #HANGUL SYLLABLE IEUNG YA CIEUC -0x9DFD 0xC593 #HANGUL SYLLABLE IEUNG YA CHIEUCH -0x9DFE 0xC594 #HANGUL SYLLABLE IEUNG YA KHIEUKH -0x9E41 0xC596 #HANGUL SYLLABLE IEUNG YA PHIEUPH -0x9E42 0xC599 #HANGUL SYLLABLE IEUNG YAE KIYEOK -0x9E43 0xC59A #HANGUL SYLLABLE IEUNG YAE SSANGKIYEOK -0x9E44 0xC59B #HANGUL SYLLABLE IEUNG YAE KIYEOKSIOS -0x9E45 0xC59D #HANGUL SYLLABLE IEUNG YAE NIEUNCIEUC -0x9E46 0xC59E #HANGUL SYLLABLE IEUNG YAE NIEUNHIEUH -0x9E47 0xC59F #HANGUL SYLLABLE IEUNG YAE TIKEUT -0x9E48 0xC5A1 #HANGUL SYLLABLE IEUNG YAE RIEULKIYEOK -0x9E49 0xC5A2 #HANGUL SYLLABLE IEUNG YAE RIEULMIEUM -0x9E4A 0xC5A3 #HANGUL SYLLABLE IEUNG YAE RIEULPIEUP -0x9E4B 0xC5A4 #HANGUL SYLLABLE IEUNG YAE RIEULSIOS -0x9E4C 0xC5A5 #HANGUL SYLLABLE IEUNG YAE RIEULTHIEUTH -0x9E4D 0xC5A6 #HANGUL SYLLABLE IEUNG YAE RIEULPHIEUPH -0x9E4E 0xC5A7 #HANGUL SYLLABLE IEUNG YAE RIEULHIEUH -0x9E4F 0xC5A8 #HANGUL SYLLABLE IEUNG YAE MIEUM -0x9E50 0xC5AA #HANGUL SYLLABLE IEUNG YAE PIEUPSIOS -0x9E51 0xC5AB #HANGUL SYLLABLE IEUNG YAE SIOS -0x9E52 0xC5AC #HANGUL SYLLABLE IEUNG YAE SSANGSIOS -0x9E53 0xC5AD #HANGUL SYLLABLE IEUNG YAE IEUNG -0x9E54 0xC5AE #HANGUL SYLLABLE IEUNG YAE CIEUC -0x9E55 0xC5AF #HANGUL SYLLABLE IEUNG YAE CHIEUCH -0x9E56 0xC5B0 #HANGUL SYLLABLE IEUNG YAE KHIEUKH -0x9E57 0xC5B1 #HANGUL SYLLABLE IEUNG YAE THIEUTH -0x9E58 0xC5B2 #HANGUL SYLLABLE IEUNG YAE PHIEUPH -0x9E59 0xC5B3 #HANGUL SYLLABLE IEUNG YAE HIEUH -0x9E5A 0xC5B6 #HANGUL SYLLABLE IEUNG EO SSANGKIYEOK -0x9E61 0xC5B7 #HANGUL SYLLABLE IEUNG EO KIYEOKSIOS -0x9E62 0xC5BA #HANGUL SYLLABLE IEUNG EO NIEUNHIEUH -0x9E63 0xC5BF #HANGUL SYLLABLE IEUNG EO RIEULPIEUP -0x9E64 0xC5C0 #HANGUL SYLLABLE IEUNG EO RIEULSIOS -0x9E65 0xC5C1 #HANGUL SYLLABLE IEUNG EO RIEULTHIEUTH -0x9E66 0xC5C2 #HANGUL SYLLABLE IEUNG EO RIEULPHIEUPH -0x9E67 0xC5C3 #HANGUL SYLLABLE IEUNG EO RIEULHIEUH -0x9E68 0xC5CB #HANGUL SYLLABLE IEUNG EO CHIEUCH -0x9E69 0xC5CD #HANGUL SYLLABLE IEUNG EO THIEUTH -0x9E6A 0xC5CF #HANGUL SYLLABLE IEUNG EO HIEUH -0x9E6B 0xC5D2 #HANGUL SYLLABLE IEUNG E SSANGKIYEOK -0x9E6C 0xC5D3 #HANGUL SYLLABLE IEUNG E KIYEOKSIOS -0x9E6D 0xC5D5 #HANGUL SYLLABLE IEUNG E NIEUNCIEUC -0x9E6E 0xC5D6 #HANGUL SYLLABLE IEUNG E NIEUNHIEUH -0x9E6F 0xC5D7 #HANGUL SYLLABLE IEUNG E TIKEUT -0x9E70 0xC5D9 #HANGUL SYLLABLE IEUNG E RIEULKIYEOK -0x9E71 0xC5DA #HANGUL SYLLABLE IEUNG E RIEULMIEUM -0x9E72 0xC5DB #HANGUL SYLLABLE IEUNG E RIEULPIEUP -0x9E73 0xC5DC #HANGUL SYLLABLE IEUNG E RIEULSIOS -0x9E74 0xC5DD #HANGUL SYLLABLE IEUNG E RIEULTHIEUTH -0x9E75 0xC5DE #HANGUL SYLLABLE IEUNG E RIEULPHIEUPH -0x9E76 0xC5DF #HANGUL SYLLABLE IEUNG E RIEULHIEUH -0x9E77 0xC5E2 #HANGUL SYLLABLE IEUNG E PIEUPSIOS -0x9E78 0xC5E4 #HANGUL SYLLABLE IEUNG E SSANGSIOS -0x9E79 0xC5E6 #HANGUL SYLLABLE IEUNG E CIEUC -0x9E7A 0xC5E7 #HANGUL SYLLABLE IEUNG E CHIEUCH -0x9E81 0xC5E8 #HANGUL SYLLABLE IEUNG E KHIEUKH -0x9E82 0xC5E9 #HANGUL SYLLABLE IEUNG E THIEUTH -0x9E83 0xC5EA #HANGUL SYLLABLE IEUNG E PHIEUPH -0x9E84 0xC5EB #HANGUL SYLLABLE IEUNG E HIEUH -0x9E85 0xC5EF #HANGUL SYLLABLE IEUNG YEO KIYEOKSIOS -0x9E86 0xC5F1 #HANGUL SYLLABLE IEUNG YEO NIEUNCIEUC -0x9E87 0xC5F2 #HANGUL SYLLABLE IEUNG YEO NIEUNHIEUH -0x9E88 0xC5F3 #HANGUL SYLLABLE IEUNG YEO TIKEUT -0x9E89 0xC5F5 #HANGUL SYLLABLE IEUNG YEO RIEULKIYEOK -0x9E8A 0xC5F8 #HANGUL SYLLABLE IEUNG YEO RIEULSIOS -0x9E8B 0xC5F9 #HANGUL SYLLABLE IEUNG YEO RIEULTHIEUTH -0x9E8C 0xC5FA #HANGUL SYLLABLE IEUNG YEO RIEULPHIEUPH -0x9E8D 0xC5FB #HANGUL SYLLABLE IEUNG YEO RIEULHIEUH -0x9E8E 0xC602 #HANGUL SYLLABLE IEUNG YEO CIEUC -0x9E8F 0xC603 #HANGUL SYLLABLE IEUNG YEO CHIEUCH -0x9E90 0xC604 #HANGUL SYLLABLE IEUNG YEO KHIEUKH -0x9E91 0xC609 #HANGUL SYLLABLE IEUNG YE KIYEOK -0x9E92 0xC60A #HANGUL SYLLABLE IEUNG YE SSANGKIYEOK -0x9E93 0xC60B #HANGUL SYLLABLE IEUNG YE KIYEOKSIOS -0x9E94 0xC60D #HANGUL SYLLABLE IEUNG YE NIEUNCIEUC -0x9E95 0xC60E #HANGUL SYLLABLE IEUNG YE NIEUNHIEUH -0x9E96 0xC60F #HANGUL SYLLABLE IEUNG YE TIKEUT -0x9E97 0xC611 #HANGUL SYLLABLE IEUNG YE RIEULKIYEOK -0x9E98 0xC612 #HANGUL SYLLABLE IEUNG YE RIEULMIEUM -0x9E99 0xC613 #HANGUL SYLLABLE IEUNG YE RIEULPIEUP -0x9E9A 0xC614 #HANGUL SYLLABLE IEUNG YE RIEULSIOS -0x9E9B 0xC615 #HANGUL SYLLABLE IEUNG YE RIEULTHIEUTH -0x9E9C 0xC616 #HANGUL SYLLABLE IEUNG YE RIEULPHIEUPH -0x9E9D 0xC617 #HANGUL SYLLABLE IEUNG YE RIEULHIEUH -0x9E9E 0xC61A #HANGUL SYLLABLE IEUNG YE PIEUPSIOS -0x9E9F 0xC61D #HANGUL SYLLABLE IEUNG YE IEUNG -0x9EA0 0xC61E #HANGUL SYLLABLE IEUNG YE CIEUC -0x9EA1 0xC61F #HANGUL SYLLABLE IEUNG YE CHIEUCH -0x9EA2 0xC620 #HANGUL SYLLABLE IEUNG YE KHIEUKH -0x9EA3 0xC621 #HANGUL SYLLABLE IEUNG YE THIEUTH -0x9EA4 0xC622 #HANGUL SYLLABLE IEUNG YE PHIEUPH -0x9EA5 0xC623 #HANGUL SYLLABLE IEUNG YE HIEUH -0x9EA6 0xC626 #HANGUL SYLLABLE IEUNG O SSANGKIYEOK -0x9EA7 0xC627 #HANGUL SYLLABLE IEUNG O KIYEOKSIOS -0x9EA8 0xC629 #HANGUL SYLLABLE IEUNG O NIEUNCIEUC -0x9EA9 0xC62A #HANGUL SYLLABLE IEUNG O NIEUNHIEUH -0x9EAA 0xC62B #HANGUL SYLLABLE IEUNG O TIKEUT -0x9EAB 0xC62F #HANGUL SYLLABLE IEUNG O RIEULPIEUP -0x9EAC 0xC631 #HANGUL SYLLABLE IEUNG O RIEULTHIEUTH -0x9EAD 0xC632 #HANGUL SYLLABLE IEUNG O RIEULPHIEUPH -0x9EAE 0xC636 #HANGUL SYLLABLE IEUNG O PIEUPSIOS -0x9EAF 0xC638 #HANGUL SYLLABLE IEUNG O SSANGSIOS -0x9EB0 0xC63A #HANGUL SYLLABLE IEUNG O CIEUC -0x9EB1 0xC63C #HANGUL SYLLABLE IEUNG O KHIEUKH -0x9EB2 0xC63D #HANGUL SYLLABLE IEUNG O THIEUTH -0x9EB3 0xC63E #HANGUL SYLLABLE IEUNG O PHIEUPH -0x9EB4 0xC63F #HANGUL SYLLABLE IEUNG O HIEUH -0x9EB5 0xC642 #HANGUL SYLLABLE IEUNG WA SSANGKIYEOK -0x9EB6 0xC643 #HANGUL SYLLABLE IEUNG WA KIYEOKSIOS -0x9EB7 0xC645 #HANGUL SYLLABLE IEUNG WA NIEUNCIEUC -0x9EB8 0xC646 #HANGUL SYLLABLE IEUNG WA NIEUNHIEUH -0x9EB9 0xC647 #HANGUL SYLLABLE IEUNG WA TIKEUT -0x9EBA 0xC649 #HANGUL SYLLABLE IEUNG WA RIEULKIYEOK -0x9EBB 0xC64A #HANGUL SYLLABLE IEUNG WA RIEULMIEUM -0x9EBC 0xC64B #HANGUL SYLLABLE IEUNG WA RIEULPIEUP -0x9EBD 0xC64C #HANGUL SYLLABLE IEUNG WA RIEULSIOS -0x9EBE 0xC64D #HANGUL SYLLABLE IEUNG WA RIEULTHIEUTH -0x9EBF 0xC64E #HANGUL SYLLABLE IEUNG WA RIEULPHIEUPH -0x9EC0 0xC64F #HANGUL SYLLABLE IEUNG WA RIEULHIEUH -0x9EC1 0xC652 #HANGUL SYLLABLE IEUNG WA PIEUPSIOS -0x9EC2 0xC656 #HANGUL SYLLABLE IEUNG WA CIEUC -0x9EC3 0xC657 #HANGUL SYLLABLE IEUNG WA CHIEUCH -0x9EC4 0xC658 #HANGUL SYLLABLE IEUNG WA KHIEUKH -0x9EC5 0xC659 #HANGUL SYLLABLE IEUNG WA THIEUTH -0x9EC6 0xC65A #HANGUL SYLLABLE IEUNG WA PHIEUPH -0x9EC7 0xC65B #HANGUL SYLLABLE IEUNG WA HIEUH -0x9EC8 0xC65E #HANGUL SYLLABLE IEUNG WAE SSANGKIYEOK -0x9EC9 0xC65F #HANGUL SYLLABLE IEUNG WAE KIYEOKSIOS -0x9ECA 0xC661 #HANGUL SYLLABLE IEUNG WAE NIEUNCIEUC -0x9ECB 0xC662 #HANGUL SYLLABLE IEUNG WAE NIEUNHIEUH -0x9ECC 0xC663 #HANGUL SYLLABLE IEUNG WAE TIKEUT -0x9ECD 0xC664 #HANGUL SYLLABLE IEUNG WAE RIEUL -0x9ECE 0xC665 #HANGUL SYLLABLE IEUNG WAE RIEULKIYEOK -0x9ECF 0xC666 #HANGUL SYLLABLE IEUNG WAE RIEULMIEUM -0x9ED0 0xC667 #HANGUL SYLLABLE IEUNG WAE RIEULPIEUP -0x9ED1 0xC668 #HANGUL SYLLABLE IEUNG WAE RIEULSIOS -0x9ED2 0xC669 #HANGUL SYLLABLE IEUNG WAE RIEULTHIEUTH -0x9ED3 0xC66A #HANGUL SYLLABLE IEUNG WAE RIEULPHIEUPH -0x9ED4 0xC66B #HANGUL SYLLABLE IEUNG WAE RIEULHIEUH -0x9ED5 0xC66D #HANGUL SYLLABLE IEUNG WAE PIEUP -0x9ED6 0xC66E #HANGUL SYLLABLE IEUNG WAE PIEUPSIOS -0x9ED7 0xC670 #HANGUL SYLLABLE IEUNG WAE SSANGSIOS -0x9ED8 0xC672 #HANGUL SYLLABLE IEUNG WAE CIEUC -0x9ED9 0xC673 #HANGUL SYLLABLE IEUNG WAE CHIEUCH -0x9EDA 0xC674 #HANGUL SYLLABLE IEUNG WAE KHIEUKH -0x9EDB 0xC675 #HANGUL SYLLABLE IEUNG WAE THIEUTH -0x9EDC 0xC676 #HANGUL SYLLABLE IEUNG WAE PHIEUPH -0x9EDD 0xC677 #HANGUL SYLLABLE IEUNG WAE HIEUH -0x9EDE 0xC67A #HANGUL SYLLABLE IEUNG OE SSANGKIYEOK -0x9EDF 0xC67B #HANGUL SYLLABLE IEUNG OE KIYEOKSIOS -0x9EE0 0xC67D #HANGUL SYLLABLE IEUNG OE NIEUNCIEUC -0x9EE1 0xC67E #HANGUL SYLLABLE IEUNG OE NIEUNHIEUH -0x9EE2 0xC67F #HANGUL SYLLABLE IEUNG OE TIKEUT -0x9EE3 0xC681 #HANGUL SYLLABLE IEUNG OE RIEULKIYEOK -0x9EE4 0xC682 #HANGUL SYLLABLE IEUNG OE RIEULMIEUM -0x9EE5 0xC683 #HANGUL SYLLABLE IEUNG OE RIEULPIEUP -0x9EE6 0xC684 #HANGUL SYLLABLE IEUNG OE RIEULSIOS -0x9EE7 0xC685 #HANGUL SYLLABLE IEUNG OE RIEULTHIEUTH -0x9EE8 0xC686 #HANGUL SYLLABLE IEUNG OE RIEULPHIEUPH -0x9EE9 0xC687 #HANGUL SYLLABLE IEUNG OE RIEULHIEUH -0x9EEA 0xC68A #HANGUL SYLLABLE IEUNG OE PIEUPSIOS -0x9EEB 0xC68C #HANGUL SYLLABLE IEUNG OE SSANGSIOS -0x9EEC 0xC68E #HANGUL SYLLABLE IEUNG OE CIEUC -0x9EED 0xC68F #HANGUL SYLLABLE IEUNG OE CHIEUCH -0x9EEE 0xC690 #HANGUL SYLLABLE IEUNG OE KHIEUKH -0x9EEF 0xC691 #HANGUL SYLLABLE IEUNG OE THIEUTH -0x9EF0 0xC692 #HANGUL SYLLABLE IEUNG OE PHIEUPH -0x9EF1 0xC693 #HANGUL SYLLABLE IEUNG OE HIEUH -0x9EF2 0xC696 #HANGUL SYLLABLE IEUNG YO SSANGKIYEOK -0x9EF3 0xC697 #HANGUL SYLLABLE IEUNG YO KIYEOKSIOS -0x9EF4 0xC699 #HANGUL SYLLABLE IEUNG YO NIEUNCIEUC -0x9EF5 0xC69A #HANGUL SYLLABLE IEUNG YO NIEUNHIEUH -0x9EF6 0xC69B #HANGUL SYLLABLE IEUNG YO TIKEUT -0x9EF7 0xC69D #HANGUL SYLLABLE IEUNG YO RIEULKIYEOK -0x9EF8 0xC69E #HANGUL SYLLABLE IEUNG YO RIEULMIEUM -0x9EF9 0xC69F #HANGUL SYLLABLE IEUNG YO RIEULPIEUP -0x9EFA 0xC6A0 #HANGUL SYLLABLE IEUNG YO RIEULSIOS -0x9EFB 0xC6A1 #HANGUL SYLLABLE IEUNG YO RIEULTHIEUTH -0x9EFC 0xC6A2 #HANGUL SYLLABLE IEUNG YO RIEULPHIEUPH -0x9EFD 0xC6A3 #HANGUL SYLLABLE IEUNG YO RIEULHIEUH -0x9EFE 0xC6A6 #HANGUL SYLLABLE IEUNG YO PIEUPSIOS -0x9F41 0xC6A8 #HANGUL SYLLABLE IEUNG YO SSANGSIOS -0x9F42 0xC6AA #HANGUL SYLLABLE IEUNG YO CIEUC -0x9F43 0xC6AB #HANGUL SYLLABLE IEUNG YO CHIEUCH -0x9F44 0xC6AC #HANGUL SYLLABLE IEUNG YO KHIEUKH -0x9F45 0xC6AD #HANGUL SYLLABLE IEUNG YO THIEUTH -0x9F46 0xC6AE #HANGUL SYLLABLE IEUNG YO PHIEUPH -0x9F47 0xC6AF #HANGUL SYLLABLE IEUNG YO HIEUH -0x9F48 0xC6B2 #HANGUL SYLLABLE IEUNG U SSANGKIYEOK -0x9F49 0xC6B3 #HANGUL SYLLABLE IEUNG U KIYEOKSIOS -0x9F4A 0xC6B5 #HANGUL SYLLABLE IEUNG U NIEUNCIEUC -0x9F4B 0xC6B6 #HANGUL SYLLABLE IEUNG U NIEUNHIEUH -0x9F4C 0xC6B7 #HANGUL SYLLABLE IEUNG U TIKEUT -0x9F4D 0xC6BB #HANGUL SYLLABLE IEUNG U RIEULPIEUP -0x9F4E 0xC6BC #HANGUL SYLLABLE IEUNG U RIEULSIOS -0x9F4F 0xC6BD #HANGUL SYLLABLE IEUNG U RIEULTHIEUTH -0x9F50 0xC6BE #HANGUL SYLLABLE IEUNG U RIEULPHIEUPH -0x9F51 0xC6BF #HANGUL SYLLABLE IEUNG U RIEULHIEUH -0x9F52 0xC6C2 #HANGUL SYLLABLE IEUNG U PIEUPSIOS -0x9F53 0xC6C4 #HANGUL SYLLABLE IEUNG U SSANGSIOS -0x9F54 0xC6C6 #HANGUL SYLLABLE IEUNG U CIEUC -0x9F55 0xC6C7 #HANGUL SYLLABLE IEUNG U CHIEUCH -0x9F56 0xC6C8 #HANGUL SYLLABLE IEUNG U KHIEUKH -0x9F57 0xC6C9 #HANGUL SYLLABLE IEUNG U THIEUTH -0x9F58 0xC6CA #HANGUL SYLLABLE IEUNG U PHIEUPH -0x9F59 0xC6CB #HANGUL SYLLABLE IEUNG U HIEUH -0x9F5A 0xC6CE #HANGUL SYLLABLE IEUNG WEO SSANGKIYEOK -0x9F61 0xC6CF #HANGUL SYLLABLE IEUNG WEO KIYEOKSIOS -0x9F62 0xC6D1 #HANGUL SYLLABLE IEUNG WEO NIEUNCIEUC -0x9F63 0xC6D2 #HANGUL SYLLABLE IEUNG WEO NIEUNHIEUH -0x9F64 0xC6D3 #HANGUL SYLLABLE IEUNG WEO TIKEUT -0x9F65 0xC6D5 #HANGUL SYLLABLE IEUNG WEO RIEULKIYEOK -0x9F66 0xC6D6 #HANGUL SYLLABLE IEUNG WEO RIEULMIEUM -0x9F67 0xC6D7 #HANGUL SYLLABLE IEUNG WEO RIEULPIEUP -0x9F68 0xC6D8 #HANGUL SYLLABLE IEUNG WEO RIEULSIOS -0x9F69 0xC6D9 #HANGUL SYLLABLE IEUNG WEO RIEULTHIEUTH -0x9F6A 0xC6DA #HANGUL SYLLABLE IEUNG WEO RIEULPHIEUPH -0x9F6B 0xC6DB #HANGUL SYLLABLE IEUNG WEO RIEULHIEUH -0x9F6C 0xC6DE #HANGUL SYLLABLE IEUNG WEO PIEUPSIOS -0x9F6D 0xC6DF #HANGUL SYLLABLE IEUNG WEO SIOS -0x9F6E 0xC6E2 #HANGUL SYLLABLE IEUNG WEO CIEUC -0x9F6F 0xC6E3 #HANGUL SYLLABLE IEUNG WEO CHIEUCH -0x9F70 0xC6E4 #HANGUL SYLLABLE IEUNG WEO KHIEUKH -0x9F71 0xC6E5 #HANGUL SYLLABLE IEUNG WEO THIEUTH -0x9F72 0xC6E6 #HANGUL SYLLABLE IEUNG WEO PHIEUPH -0x9F73 0xC6E7 #HANGUL SYLLABLE IEUNG WEO HIEUH -0x9F74 0xC6EA #HANGUL SYLLABLE IEUNG WE SSANGKIYEOK -0x9F75 0xC6EB #HANGUL SYLLABLE IEUNG WE KIYEOKSIOS -0x9F76 0xC6ED #HANGUL SYLLABLE IEUNG WE NIEUNCIEUC -0x9F77 0xC6EE #HANGUL SYLLABLE IEUNG WE NIEUNHIEUH -0x9F78 0xC6EF #HANGUL SYLLABLE IEUNG WE TIKEUT -0x9F79 0xC6F1 #HANGUL SYLLABLE IEUNG WE RIEULKIYEOK -0x9F7A 0xC6F2 #HANGUL SYLLABLE IEUNG WE RIEULMIEUM -0x9F81 0xC6F3 #HANGUL SYLLABLE IEUNG WE RIEULPIEUP -0x9F82 0xC6F4 #HANGUL SYLLABLE IEUNG WE RIEULSIOS -0x9F83 0xC6F5 #HANGUL SYLLABLE IEUNG WE RIEULTHIEUTH -0x9F84 0xC6F6 #HANGUL SYLLABLE IEUNG WE RIEULPHIEUPH -0x9F85 0xC6F7 #HANGUL SYLLABLE IEUNG WE RIEULHIEUH -0x9F86 0xC6FA #HANGUL SYLLABLE IEUNG WE PIEUPSIOS -0x9F87 0xC6FB #HANGUL SYLLABLE IEUNG WE SIOS -0x9F88 0xC6FC #HANGUL SYLLABLE IEUNG WE SSANGSIOS -0x9F89 0xC6FE #HANGUL SYLLABLE IEUNG WE CIEUC -0x9F8A 0xC6FF #HANGUL SYLLABLE IEUNG WE CHIEUCH -0x9F8B 0xC700 #HANGUL SYLLABLE IEUNG WE KHIEUKH -0x9F8C 0xC701 #HANGUL SYLLABLE IEUNG WE THIEUTH -0x9F8D 0xC702 #HANGUL SYLLABLE IEUNG WE PHIEUPH -0x9F8E 0xC703 #HANGUL SYLLABLE IEUNG WE HIEUH -0x9F8F 0xC706 #HANGUL SYLLABLE IEUNG WI SSANGKIYEOK -0x9F90 0xC707 #HANGUL SYLLABLE IEUNG WI KIYEOKSIOS -0x9F91 0xC709 #HANGUL SYLLABLE IEUNG WI NIEUNCIEUC -0x9F92 0xC70A #HANGUL SYLLABLE IEUNG WI NIEUNHIEUH -0x9F93 0xC70B #HANGUL SYLLABLE IEUNG WI TIKEUT -0x9F94 0xC70D #HANGUL SYLLABLE IEUNG WI RIEULKIYEOK -0x9F95 0xC70E #HANGUL SYLLABLE IEUNG WI RIEULMIEUM -0x9F96 0xC70F #HANGUL SYLLABLE IEUNG WI RIEULPIEUP -0x9F97 0xC710 #HANGUL SYLLABLE IEUNG WI RIEULSIOS -0x9F98 0xC711 #HANGUL SYLLABLE IEUNG WI RIEULTHIEUTH -0x9F99 0xC712 #HANGUL SYLLABLE IEUNG WI RIEULPHIEUPH -0x9F9A 0xC713 #HANGUL SYLLABLE IEUNG WI RIEULHIEUH -0x9F9B 0xC716 #HANGUL SYLLABLE IEUNG WI PIEUPSIOS -0x9F9C 0xC718 #HANGUL SYLLABLE IEUNG WI SSANGSIOS -0x9F9D 0xC71A #HANGUL SYLLABLE IEUNG WI CIEUC -0x9F9E 0xC71B #HANGUL SYLLABLE IEUNG WI CHIEUCH -0x9F9F 0xC71C #HANGUL SYLLABLE IEUNG WI KHIEUKH -0x9FA0 0xC71D #HANGUL SYLLABLE IEUNG WI THIEUTH -0x9FA1 0xC71E #HANGUL SYLLABLE IEUNG WI PHIEUPH -0x9FA2 0xC71F #HANGUL SYLLABLE IEUNG WI HIEUH -0x9FA3 0xC722 #HANGUL SYLLABLE IEUNG YU SSANGKIYEOK -0x9FA4 0xC723 #HANGUL SYLLABLE IEUNG YU KIYEOKSIOS -0x9FA5 0xC725 #HANGUL SYLLABLE IEUNG YU NIEUNCIEUC -0x9FA6 0xC726 #HANGUL SYLLABLE IEUNG YU NIEUNHIEUH -0x9FA7 0xC727 #HANGUL SYLLABLE IEUNG YU TIKEUT -0x9FA8 0xC729 #HANGUL SYLLABLE IEUNG YU RIEULKIYEOK -0x9FA9 0xC72A #HANGUL SYLLABLE IEUNG YU RIEULMIEUM -0x9FAA 0xC72B #HANGUL SYLLABLE IEUNG YU RIEULPIEUP -0x9FAB 0xC72C #HANGUL SYLLABLE IEUNG YU RIEULSIOS -0x9FAC 0xC72D #HANGUL SYLLABLE IEUNG YU RIEULTHIEUTH -0x9FAD 0xC72E #HANGUL SYLLABLE IEUNG YU RIEULPHIEUPH -0x9FAE 0xC72F #HANGUL SYLLABLE IEUNG YU RIEULHIEUH -0x9FAF 0xC732 #HANGUL SYLLABLE IEUNG YU PIEUPSIOS -0x9FB0 0xC734 #HANGUL SYLLABLE IEUNG YU SSANGSIOS -0x9FB1 0xC736 #HANGUL SYLLABLE IEUNG YU CIEUC -0x9FB2 0xC738 #HANGUL SYLLABLE IEUNG YU KHIEUKH -0x9FB3 0xC739 #HANGUL SYLLABLE IEUNG YU THIEUTH -0x9FB4 0xC73A #HANGUL SYLLABLE IEUNG YU PHIEUPH -0x9FB5 0xC73B #HANGUL SYLLABLE IEUNG YU HIEUH -0x9FB6 0xC73E #HANGUL SYLLABLE IEUNG EU SSANGKIYEOK -0x9FB7 0xC73F #HANGUL SYLLABLE IEUNG EU KIYEOKSIOS -0x9FB8 0xC741 #HANGUL SYLLABLE IEUNG EU NIEUNCIEUC -0x9FB9 0xC742 #HANGUL SYLLABLE IEUNG EU NIEUNHIEUH -0x9FBA 0xC743 #HANGUL SYLLABLE IEUNG EU TIKEUT -0x9FBB 0xC745 #HANGUL SYLLABLE IEUNG EU RIEULKIYEOK -0x9FBC 0xC746 #HANGUL SYLLABLE IEUNG EU RIEULMIEUM -0x9FBD 0xC747 #HANGUL SYLLABLE IEUNG EU RIEULPIEUP -0x9FBE 0xC748 #HANGUL SYLLABLE IEUNG EU RIEULSIOS -0x9FBF 0xC749 #HANGUL SYLLABLE IEUNG EU RIEULTHIEUTH -0x9FC0 0xC74B #HANGUL SYLLABLE IEUNG EU RIEULHIEUH -0x9FC1 0xC74E #HANGUL SYLLABLE IEUNG EU PIEUPSIOS -0x9FC2 0xC750 #HANGUL SYLLABLE IEUNG EU SSANGSIOS -0x9FC3 0xC759 #HANGUL SYLLABLE IEUNG YI KIYEOK -0x9FC4 0xC75A #HANGUL SYLLABLE IEUNG YI SSANGKIYEOK -0x9FC5 0xC75B #HANGUL SYLLABLE IEUNG YI KIYEOKSIOS -0x9FC6 0xC75D #HANGUL SYLLABLE IEUNG YI NIEUNCIEUC -0x9FC7 0xC75E #HANGUL SYLLABLE IEUNG YI NIEUNHIEUH -0x9FC8 0xC75F #HANGUL SYLLABLE IEUNG YI TIKEUT -0x9FC9 0xC761 #HANGUL SYLLABLE IEUNG YI RIEULKIYEOK -0x9FCA 0xC762 #HANGUL SYLLABLE IEUNG YI RIEULMIEUM -0x9FCB 0xC763 #HANGUL SYLLABLE IEUNG YI RIEULPIEUP -0x9FCC 0xC764 #HANGUL SYLLABLE IEUNG YI RIEULSIOS -0x9FCD 0xC765 #HANGUL SYLLABLE IEUNG YI RIEULTHIEUTH -0x9FCE 0xC766 #HANGUL SYLLABLE IEUNG YI RIEULPHIEUPH -0x9FCF 0xC767 #HANGUL SYLLABLE IEUNG YI RIEULHIEUH -0x9FD0 0xC769 #HANGUL SYLLABLE IEUNG YI PIEUP -0x9FD1 0xC76A #HANGUL SYLLABLE IEUNG YI PIEUPSIOS -0x9FD2 0xC76C #HANGUL SYLLABLE IEUNG YI SSANGSIOS -0x9FD3 0xC76D #HANGUL SYLLABLE IEUNG YI IEUNG -0x9FD4 0xC76E #HANGUL SYLLABLE IEUNG YI CIEUC -0x9FD5 0xC76F #HANGUL SYLLABLE IEUNG YI CHIEUCH -0x9FD6 0xC770 #HANGUL SYLLABLE IEUNG YI KHIEUKH -0x9FD7 0xC771 #HANGUL SYLLABLE IEUNG YI THIEUTH -0x9FD8 0xC772 #HANGUL SYLLABLE IEUNG YI PHIEUPH -0x9FD9 0xC773 #HANGUL SYLLABLE IEUNG YI HIEUH -0x9FDA 0xC776 #HANGUL SYLLABLE IEUNG I SSANGKIYEOK -0x9FDB 0xC777 #HANGUL SYLLABLE IEUNG I KIYEOKSIOS -0x9FDC 0xC779 #HANGUL SYLLABLE IEUNG I NIEUNCIEUC -0x9FDD 0xC77A #HANGUL SYLLABLE IEUNG I NIEUNHIEUH -0x9FDE 0xC77B #HANGUL SYLLABLE IEUNG I TIKEUT -0x9FDF 0xC77F #HANGUL SYLLABLE IEUNG I RIEULPIEUP -0x9FE0 0xC780 #HANGUL SYLLABLE IEUNG I RIEULSIOS -0x9FE1 0xC781 #HANGUL SYLLABLE IEUNG I RIEULTHIEUTH -0x9FE2 0xC782 #HANGUL SYLLABLE IEUNG I RIEULPHIEUPH -0x9FE3 0xC786 #HANGUL SYLLABLE IEUNG I PIEUPSIOS -0x9FE4 0xC78B #HANGUL SYLLABLE IEUNG I CHIEUCH -0x9FE5 0xC78C #HANGUL SYLLABLE IEUNG I KHIEUKH -0x9FE6 0xC78D #HANGUL SYLLABLE IEUNG I THIEUTH -0x9FE7 0xC78F #HANGUL SYLLABLE IEUNG I HIEUH -0x9FE8 0xC792 #HANGUL SYLLABLE CIEUC A SSANGKIYEOK -0x9FE9 0xC793 #HANGUL SYLLABLE CIEUC A KIYEOKSIOS -0x9FEA 0xC795 #HANGUL SYLLABLE CIEUC A NIEUNCIEUC -0x9FEB 0xC799 #HANGUL SYLLABLE CIEUC A RIEULKIYEOK -0x9FEC 0xC79B #HANGUL SYLLABLE CIEUC A RIEULPIEUP -0x9FED 0xC79C #HANGUL SYLLABLE CIEUC A RIEULSIOS -0x9FEE 0xC79D #HANGUL SYLLABLE CIEUC A RIEULTHIEUTH -0x9FEF 0xC79E #HANGUL SYLLABLE CIEUC A RIEULPHIEUPH -0x9FF0 0xC79F #HANGUL SYLLABLE CIEUC A RIEULHIEUH -0x9FF1 0xC7A2 #HANGUL SYLLABLE CIEUC A PIEUPSIOS -0x9FF2 0xC7A7 #HANGUL SYLLABLE CIEUC A CHIEUCH -0x9FF3 0xC7A8 #HANGUL SYLLABLE CIEUC A KHIEUKH -0x9FF4 0xC7A9 #HANGUL SYLLABLE CIEUC A THIEUTH -0x9FF5 0xC7AA #HANGUL SYLLABLE CIEUC A PHIEUPH -0x9FF6 0xC7AB #HANGUL SYLLABLE CIEUC A HIEUH -0x9FF7 0xC7AE #HANGUL SYLLABLE CIEUC AE SSANGKIYEOK -0x9FF8 0xC7AF #HANGUL SYLLABLE CIEUC AE KIYEOKSIOS -0x9FF9 0xC7B1 #HANGUL SYLLABLE CIEUC AE NIEUNCIEUC -0x9FFA 0xC7B2 #HANGUL SYLLABLE CIEUC AE NIEUNHIEUH -0x9FFB 0xC7B3 #HANGUL SYLLABLE CIEUC AE TIKEUT -0x9FFC 0xC7B5 #HANGUL SYLLABLE CIEUC AE RIEULKIYEOK -0x9FFD 0xC7B6 #HANGUL SYLLABLE CIEUC AE RIEULMIEUM -0x9FFE 0xC7B7 #HANGUL SYLLABLE CIEUC AE RIEULPIEUP -0xA041 0xC7B8 #HANGUL SYLLABLE CIEUC AE RIEULSIOS -0xA042 0xC7B9 #HANGUL SYLLABLE CIEUC AE RIEULTHIEUTH -0xA043 0xC7BA #HANGUL SYLLABLE CIEUC AE RIEULPHIEUPH -0xA044 0xC7BB #HANGUL SYLLABLE CIEUC AE RIEULHIEUH -0xA045 0xC7BE #HANGUL SYLLABLE CIEUC AE PIEUPSIOS -0xA046 0xC7C2 #HANGUL SYLLABLE CIEUC AE CIEUC -0xA047 0xC7C3 #HANGUL SYLLABLE CIEUC AE CHIEUCH -0xA048 0xC7C4 #HANGUL SYLLABLE CIEUC AE KHIEUKH -0xA049 0xC7C5 #HANGUL SYLLABLE CIEUC AE THIEUTH -0xA04A 0xC7C6 #HANGUL SYLLABLE CIEUC AE PHIEUPH -0xA04B 0xC7C7 #HANGUL SYLLABLE CIEUC AE HIEUH -0xA04C 0xC7CA #HANGUL SYLLABLE CIEUC YA SSANGKIYEOK -0xA04D 0xC7CB #HANGUL SYLLABLE CIEUC YA KIYEOKSIOS -0xA04E 0xC7CD #HANGUL SYLLABLE CIEUC YA NIEUNCIEUC -0xA04F 0xC7CF #HANGUL SYLLABLE CIEUC YA TIKEUT -0xA050 0xC7D1 #HANGUL SYLLABLE CIEUC YA RIEULKIYEOK -0xA051 0xC7D2 #HANGUL SYLLABLE CIEUC YA RIEULMIEUM -0xA052 0xC7D3 #HANGUL SYLLABLE CIEUC YA RIEULPIEUP -0xA053 0xC7D4 #HANGUL SYLLABLE CIEUC YA RIEULSIOS -0xA054 0xC7D5 #HANGUL SYLLABLE CIEUC YA RIEULTHIEUTH -0xA055 0xC7D6 #HANGUL SYLLABLE CIEUC YA RIEULPHIEUPH -0xA056 0xC7D7 #HANGUL SYLLABLE CIEUC YA RIEULHIEUH -0xA057 0xC7D9 #HANGUL SYLLABLE CIEUC YA PIEUP -0xA058 0xC7DA #HANGUL SYLLABLE CIEUC YA PIEUPSIOS -0xA059 0xC7DB #HANGUL SYLLABLE CIEUC YA SIOS -0xA05A 0xC7DC #HANGUL SYLLABLE CIEUC YA SSANGSIOS -0xA061 0xC7DE #HANGUL SYLLABLE CIEUC YA CIEUC -0xA062 0xC7DF #HANGUL SYLLABLE CIEUC YA CHIEUCH -0xA063 0xC7E0 #HANGUL SYLLABLE CIEUC YA KHIEUKH -0xA064 0xC7E1 #HANGUL SYLLABLE CIEUC YA THIEUTH -0xA065 0xC7E2 #HANGUL SYLLABLE CIEUC YA PHIEUPH -0xA066 0xC7E3 #HANGUL SYLLABLE CIEUC YA HIEUH -0xA067 0xC7E5 #HANGUL SYLLABLE CIEUC YAE KIYEOK -0xA068 0xC7E6 #HANGUL SYLLABLE CIEUC YAE SSANGKIYEOK -0xA069 0xC7E7 #HANGUL SYLLABLE CIEUC YAE KIYEOKSIOS -0xA06A 0xC7E9 #HANGUL SYLLABLE CIEUC YAE NIEUNCIEUC -0xA06B 0xC7EA #HANGUL SYLLABLE CIEUC YAE NIEUNHIEUH -0xA06C 0xC7EB #HANGUL SYLLABLE CIEUC YAE TIKEUT -0xA06D 0xC7ED #HANGUL SYLLABLE CIEUC YAE RIEULKIYEOK -0xA06E 0xC7EE #HANGUL SYLLABLE CIEUC YAE RIEULMIEUM -0xA06F 0xC7EF #HANGUL SYLLABLE CIEUC YAE RIEULPIEUP -0xA070 0xC7F0 #HANGUL SYLLABLE CIEUC YAE RIEULSIOS -0xA071 0xC7F1 #HANGUL SYLLABLE CIEUC YAE RIEULTHIEUTH -0xA072 0xC7F2 #HANGUL SYLLABLE CIEUC YAE RIEULPHIEUPH -0xA073 0xC7F3 #HANGUL SYLLABLE CIEUC YAE RIEULHIEUH -0xA074 0xC7F4 #HANGUL SYLLABLE CIEUC YAE MIEUM -0xA075 0xC7F5 #HANGUL SYLLABLE CIEUC YAE PIEUP -0xA076 0xC7F6 #HANGUL SYLLABLE CIEUC YAE PIEUPSIOS -0xA077 0xC7F7 #HANGUL SYLLABLE CIEUC YAE SIOS -0xA078 0xC7F8 #HANGUL SYLLABLE CIEUC YAE SSANGSIOS -0xA079 0xC7F9 #HANGUL SYLLABLE CIEUC YAE IEUNG -0xA07A 0xC7FA #HANGUL SYLLABLE CIEUC YAE CIEUC -0xA081 0xC7FB #HANGUL SYLLABLE CIEUC YAE CHIEUCH -0xA082 0xC7FC #HANGUL SYLLABLE CIEUC YAE KHIEUKH -0xA083 0xC7FD #HANGUL SYLLABLE CIEUC YAE THIEUTH -0xA084 0xC7FE #HANGUL SYLLABLE CIEUC YAE PHIEUPH -0xA085 0xC7FF #HANGUL SYLLABLE CIEUC YAE HIEUH -0xA086 0xC802 #HANGUL SYLLABLE CIEUC EO SSANGKIYEOK -0xA087 0xC803 #HANGUL SYLLABLE CIEUC EO KIYEOKSIOS -0xA088 0xC805 #HANGUL SYLLABLE CIEUC EO NIEUNCIEUC -0xA089 0xC806 #HANGUL SYLLABLE CIEUC EO NIEUNHIEUH -0xA08A 0xC807 #HANGUL SYLLABLE CIEUC EO TIKEUT -0xA08B 0xC809 #HANGUL SYLLABLE CIEUC EO RIEULKIYEOK -0xA08C 0xC80B #HANGUL SYLLABLE CIEUC EO RIEULPIEUP -0xA08D 0xC80C #HANGUL SYLLABLE CIEUC EO RIEULSIOS -0xA08E 0xC80D #HANGUL SYLLABLE CIEUC EO RIEULTHIEUTH -0xA08F 0xC80E #HANGUL SYLLABLE CIEUC EO RIEULPHIEUPH -0xA090 0xC80F #HANGUL SYLLABLE CIEUC EO RIEULHIEUH -0xA091 0xC812 #HANGUL SYLLABLE CIEUC EO PIEUPSIOS -0xA092 0xC814 #HANGUL SYLLABLE CIEUC EO SSANGSIOS -0xA093 0xC817 #HANGUL SYLLABLE CIEUC EO CHIEUCH -0xA094 0xC818 #HANGUL SYLLABLE CIEUC EO KHIEUKH -0xA095 0xC819 #HANGUL SYLLABLE CIEUC EO THIEUTH -0xA096 0xC81A #HANGUL SYLLABLE CIEUC EO PHIEUPH -0xA097 0xC81B #HANGUL SYLLABLE CIEUC EO HIEUH -0xA098 0xC81E #HANGUL SYLLABLE CIEUC E SSANGKIYEOK -0xA099 0xC81F #HANGUL SYLLABLE CIEUC E KIYEOKSIOS -0xA09A 0xC821 #HANGUL SYLLABLE CIEUC E NIEUNCIEUC -0xA09B 0xC822 #HANGUL SYLLABLE CIEUC E NIEUNHIEUH -0xA09C 0xC823 #HANGUL SYLLABLE CIEUC E TIKEUT -0xA09D 0xC825 #HANGUL SYLLABLE CIEUC E RIEULKIYEOK -0xA09E 0xC826 #HANGUL SYLLABLE CIEUC E RIEULMIEUM -0xA09F 0xC827 #HANGUL SYLLABLE CIEUC E RIEULPIEUP -0xA0A0 0xC828 #HANGUL SYLLABLE CIEUC E RIEULSIOS -0xA0A1 0xC829 #HANGUL SYLLABLE CIEUC E RIEULTHIEUTH -0xA0A2 0xC82A #HANGUL SYLLABLE CIEUC E RIEULPHIEUPH -0xA0A3 0xC82B #HANGUL SYLLABLE CIEUC E RIEULHIEUH -0xA0A4 0xC82E #HANGUL SYLLABLE CIEUC E PIEUPSIOS -0xA0A5 0xC830 #HANGUL SYLLABLE CIEUC E SSANGSIOS -0xA0A6 0xC832 #HANGUL SYLLABLE CIEUC E CIEUC -0xA0A7 0xC833 #HANGUL SYLLABLE CIEUC E CHIEUCH -0xA0A8 0xC834 #HANGUL SYLLABLE CIEUC E KHIEUKH -0xA0A9 0xC835 #HANGUL SYLLABLE CIEUC E THIEUTH -0xA0AA 0xC836 #HANGUL SYLLABLE CIEUC E PHIEUPH -0xA0AB 0xC837 #HANGUL SYLLABLE CIEUC E HIEUH -0xA0AC 0xC839 #HANGUL SYLLABLE CIEUC YEO KIYEOK -0xA0AD 0xC83A #HANGUL SYLLABLE CIEUC YEO SSANGKIYEOK -0xA0AE 0xC83B #HANGUL SYLLABLE CIEUC YEO KIYEOKSIOS -0xA0AF 0xC83D #HANGUL SYLLABLE CIEUC YEO NIEUNCIEUC -0xA0B0 0xC83E #HANGUL SYLLABLE CIEUC YEO NIEUNHIEUH -0xA0B1 0xC83F #HANGUL SYLLABLE CIEUC YEO TIKEUT -0xA0B2 0xC841 #HANGUL SYLLABLE CIEUC YEO RIEULKIYEOK -0xA0B3 0xC842 #HANGUL SYLLABLE CIEUC YEO RIEULMIEUM -0xA0B4 0xC843 #HANGUL SYLLABLE CIEUC YEO RIEULPIEUP -0xA0B5 0xC844 #HANGUL SYLLABLE CIEUC YEO RIEULSIOS -0xA0B6 0xC845 #HANGUL SYLLABLE CIEUC YEO RIEULTHIEUTH -0xA0B7 0xC846 #HANGUL SYLLABLE CIEUC YEO RIEULPHIEUPH -0xA0B8 0xC847 #HANGUL SYLLABLE CIEUC YEO RIEULHIEUH -0xA0B9 0xC84A #HANGUL SYLLABLE CIEUC YEO PIEUPSIOS -0xA0BA 0xC84B #HANGUL SYLLABLE CIEUC YEO SIOS -0xA0BB 0xC84E #HANGUL SYLLABLE CIEUC YEO CIEUC -0xA0BC 0xC84F #HANGUL SYLLABLE CIEUC YEO CHIEUCH -0xA0BD 0xC850 #HANGUL SYLLABLE CIEUC YEO KHIEUKH -0xA0BE 0xC851 #HANGUL SYLLABLE CIEUC YEO THIEUTH -0xA0BF 0xC852 #HANGUL SYLLABLE CIEUC YEO PHIEUPH -0xA0C0 0xC853 #HANGUL SYLLABLE CIEUC YEO HIEUH -0xA0C1 0xC855 #HANGUL SYLLABLE CIEUC YE KIYEOK -0xA0C2 0xC856 #HANGUL SYLLABLE CIEUC YE SSANGKIYEOK -0xA0C3 0xC857 #HANGUL SYLLABLE CIEUC YE KIYEOKSIOS -0xA0C4 0xC858 #HANGUL SYLLABLE CIEUC YE NIEUN -0xA0C5 0xC859 #HANGUL SYLLABLE CIEUC YE NIEUNCIEUC -0xA0C6 0xC85A #HANGUL SYLLABLE CIEUC YE NIEUNHIEUH -0xA0C7 0xC85B #HANGUL SYLLABLE CIEUC YE TIKEUT -0xA0C8 0xC85C #HANGUL SYLLABLE CIEUC YE RIEUL -0xA0C9 0xC85D #HANGUL SYLLABLE CIEUC YE RIEULKIYEOK -0xA0CA 0xC85E #HANGUL SYLLABLE CIEUC YE RIEULMIEUM -0xA0CB 0xC85F #HANGUL SYLLABLE CIEUC YE RIEULPIEUP -0xA0CC 0xC860 #HANGUL SYLLABLE CIEUC YE RIEULSIOS -0xA0CD 0xC861 #HANGUL SYLLABLE CIEUC YE RIEULTHIEUTH -0xA0CE 0xC862 #HANGUL SYLLABLE CIEUC YE RIEULPHIEUPH -0xA0CF 0xC863 #HANGUL SYLLABLE CIEUC YE RIEULHIEUH -0xA0D0 0xC864 #HANGUL SYLLABLE CIEUC YE MIEUM -0xA0D1 0xC865 #HANGUL SYLLABLE CIEUC YE PIEUP -0xA0D2 0xC866 #HANGUL SYLLABLE CIEUC YE PIEUPSIOS -0xA0D3 0xC867 #HANGUL SYLLABLE CIEUC YE SIOS -0xA0D4 0xC868 #HANGUL SYLLABLE CIEUC YE SSANGSIOS -0xA0D5 0xC869 #HANGUL SYLLABLE CIEUC YE IEUNG -0xA0D6 0xC86A #HANGUL SYLLABLE CIEUC YE CIEUC -0xA0D7 0xC86B #HANGUL SYLLABLE CIEUC YE CHIEUCH -0xA0D8 0xC86C #HANGUL SYLLABLE CIEUC YE KHIEUKH -0xA0D9 0xC86D #HANGUL SYLLABLE CIEUC YE THIEUTH -0xA0DA 0xC86E #HANGUL SYLLABLE CIEUC YE PHIEUPH -0xA0DB 0xC86F #HANGUL SYLLABLE CIEUC YE HIEUH -0xA0DC 0xC872 #HANGUL SYLLABLE CIEUC O SSANGKIYEOK -0xA0DD 0xC873 #HANGUL SYLLABLE CIEUC O KIYEOKSIOS -0xA0DE 0xC875 #HANGUL SYLLABLE CIEUC O NIEUNCIEUC -0xA0DF 0xC876 #HANGUL SYLLABLE CIEUC O NIEUNHIEUH -0xA0E0 0xC877 #HANGUL SYLLABLE CIEUC O TIKEUT -0xA0E1 0xC879 #HANGUL SYLLABLE CIEUC O RIEULKIYEOK -0xA0E2 0xC87B #HANGUL SYLLABLE CIEUC O RIEULPIEUP -0xA0E3 0xC87C #HANGUL SYLLABLE CIEUC O RIEULSIOS -0xA0E4 0xC87D #HANGUL SYLLABLE CIEUC O RIEULTHIEUTH -0xA0E5 0xC87E #HANGUL SYLLABLE CIEUC O RIEULPHIEUPH -0xA0E6 0xC87F #HANGUL SYLLABLE CIEUC O RIEULHIEUH -0xA0E7 0xC882 #HANGUL SYLLABLE CIEUC O PIEUPSIOS -0xA0E8 0xC884 #HANGUL SYLLABLE CIEUC O SSANGSIOS -0xA0E9 0xC888 #HANGUL SYLLABLE CIEUC O KHIEUKH -0xA0EA 0xC889 #HANGUL SYLLABLE CIEUC O THIEUTH -0xA0EB 0xC88A #HANGUL SYLLABLE CIEUC O PHIEUPH -0xA0EC 0xC88E #HANGUL SYLLABLE CIEUC WA SSANGKIYEOK -0xA0ED 0xC88F #HANGUL SYLLABLE CIEUC WA KIYEOKSIOS -0xA0EE 0xC890 #HANGUL SYLLABLE CIEUC WA NIEUN -0xA0EF 0xC891 #HANGUL SYLLABLE CIEUC WA NIEUNCIEUC -0xA0F0 0xC892 #HANGUL SYLLABLE CIEUC WA NIEUNHIEUH -0xA0F1 0xC893 #HANGUL SYLLABLE CIEUC WA TIKEUT -0xA0F2 0xC895 #HANGUL SYLLABLE CIEUC WA RIEULKIYEOK -0xA0F3 0xC896 #HANGUL SYLLABLE CIEUC WA RIEULMIEUM -0xA0F4 0xC897 #HANGUL SYLLABLE CIEUC WA RIEULPIEUP -0xA0F5 0xC898 #HANGUL SYLLABLE CIEUC WA RIEULSIOS -0xA0F6 0xC899 #HANGUL SYLLABLE CIEUC WA RIEULTHIEUTH -0xA0F7 0xC89A #HANGUL SYLLABLE CIEUC WA RIEULPHIEUPH -0xA0F8 0xC89B #HANGUL SYLLABLE CIEUC WA RIEULHIEUH -0xA0F9 0xC89C #HANGUL SYLLABLE CIEUC WA MIEUM -0xA0FA 0xC89E #HANGUL SYLLABLE CIEUC WA PIEUPSIOS -0xA0FB 0xC8A0 #HANGUL SYLLABLE CIEUC WA SSANGSIOS -0xA0FC 0xC8A2 #HANGUL SYLLABLE CIEUC WA CIEUC -0xA0FD 0xC8A3 #HANGUL SYLLABLE CIEUC WA CHIEUCH -0xA0FE 0xC8A4 #HANGUL SYLLABLE CIEUC WA KHIEUKH -0xA141 0xC8A5 #HANGUL SYLLABLE CIEUC WA THIEUTH -0xA142 0xC8A6 #HANGUL SYLLABLE CIEUC WA PHIEUPH -0xA143 0xC8A7 #HANGUL SYLLABLE CIEUC WA HIEUH -0xA144 0xC8A9 #HANGUL SYLLABLE CIEUC WAE KIYEOK -0xA145 0xC8AA #HANGUL SYLLABLE CIEUC WAE SSANGKIYEOK -0xA146 0xC8AB #HANGUL SYLLABLE CIEUC WAE KIYEOKSIOS -0xA147 0xC8AC #HANGUL SYLLABLE CIEUC WAE NIEUN -0xA148 0xC8AD #HANGUL SYLLABLE CIEUC WAE NIEUNCIEUC -0xA149 0xC8AE #HANGUL SYLLABLE CIEUC WAE NIEUNHIEUH -0xA14A 0xC8AF #HANGUL SYLLABLE CIEUC WAE TIKEUT -0xA14B 0xC8B0 #HANGUL SYLLABLE CIEUC WAE RIEUL -0xA14C 0xC8B1 #HANGUL SYLLABLE CIEUC WAE RIEULKIYEOK -0xA14D 0xC8B2 #HANGUL SYLLABLE CIEUC WAE RIEULMIEUM -0xA14E 0xC8B3 #HANGUL SYLLABLE CIEUC WAE RIEULPIEUP -0xA14F 0xC8B4 #HANGUL SYLLABLE CIEUC WAE RIEULSIOS -0xA150 0xC8B5 #HANGUL SYLLABLE CIEUC WAE RIEULTHIEUTH -0xA151 0xC8B6 #HANGUL SYLLABLE CIEUC WAE RIEULPHIEUPH -0xA152 0xC8B7 #HANGUL SYLLABLE CIEUC WAE RIEULHIEUH -0xA153 0xC8B8 #HANGUL SYLLABLE CIEUC WAE MIEUM -0xA154 0xC8B9 #HANGUL SYLLABLE CIEUC WAE PIEUP -0xA155 0xC8BA #HANGUL SYLLABLE CIEUC WAE PIEUPSIOS -0xA156 0xC8BB #HANGUL SYLLABLE CIEUC WAE SIOS -0xA157 0xC8BE #HANGUL SYLLABLE CIEUC WAE CIEUC -0xA158 0xC8BF #HANGUL SYLLABLE CIEUC WAE CHIEUCH -0xA159 0xC8C0 #HANGUL SYLLABLE CIEUC WAE KHIEUKH -0xA15A 0xC8C1 #HANGUL SYLLABLE CIEUC WAE THIEUTH -0xA161 0xC8C2 #HANGUL SYLLABLE CIEUC WAE PHIEUPH -0xA162 0xC8C3 #HANGUL SYLLABLE CIEUC WAE HIEUH -0xA163 0xC8C5 #HANGUL SYLLABLE CIEUC OE KIYEOK -0xA164 0xC8C6 #HANGUL SYLLABLE CIEUC OE SSANGKIYEOK -0xA165 0xC8C7 #HANGUL SYLLABLE CIEUC OE KIYEOKSIOS -0xA166 0xC8C9 #HANGUL SYLLABLE CIEUC OE NIEUNCIEUC -0xA167 0xC8CA #HANGUL SYLLABLE CIEUC OE NIEUNHIEUH -0xA168 0xC8CB #HANGUL SYLLABLE CIEUC OE TIKEUT -0xA169 0xC8CD #HANGUL SYLLABLE CIEUC OE RIEULKIYEOK -0xA16A 0xC8CE #HANGUL SYLLABLE CIEUC OE RIEULMIEUM -0xA16B 0xC8CF #HANGUL SYLLABLE CIEUC OE RIEULPIEUP -0xA16C 0xC8D0 #HANGUL SYLLABLE CIEUC OE RIEULSIOS -0xA16D 0xC8D1 #HANGUL SYLLABLE CIEUC OE RIEULTHIEUTH -0xA16E 0xC8D2 #HANGUL SYLLABLE CIEUC OE RIEULPHIEUPH -0xA16F 0xC8D3 #HANGUL SYLLABLE CIEUC OE RIEULHIEUH -0xA170 0xC8D6 #HANGUL SYLLABLE CIEUC OE PIEUPSIOS -0xA171 0xC8D8 #HANGUL SYLLABLE CIEUC OE SSANGSIOS -0xA172 0xC8DA #HANGUL SYLLABLE CIEUC OE CIEUC -0xA173 0xC8DB #HANGUL SYLLABLE CIEUC OE CHIEUCH -0xA174 0xC8DC #HANGUL SYLLABLE CIEUC OE KHIEUKH -0xA175 0xC8DD #HANGUL SYLLABLE CIEUC OE THIEUTH -0xA176 0xC8DE #HANGUL SYLLABLE CIEUC OE PHIEUPH -0xA177 0xC8DF #HANGUL SYLLABLE CIEUC OE HIEUH -0xA178 0xC8E2 #HANGUL SYLLABLE CIEUC YO SSANGKIYEOK -0xA179 0xC8E3 #HANGUL SYLLABLE CIEUC YO KIYEOKSIOS -0xA17A 0xC8E5 #HANGUL SYLLABLE CIEUC YO NIEUNCIEUC -0xA181 0xC8E6 #HANGUL SYLLABLE CIEUC YO NIEUNHIEUH -0xA182 0xC8E7 #HANGUL SYLLABLE CIEUC YO TIKEUT -0xA183 0xC8E8 #HANGUL SYLLABLE CIEUC YO RIEUL -0xA184 0xC8E9 #HANGUL SYLLABLE CIEUC YO RIEULKIYEOK -0xA185 0xC8EA #HANGUL SYLLABLE CIEUC YO RIEULMIEUM -0xA186 0xC8EB #HANGUL SYLLABLE CIEUC YO RIEULPIEUP -0xA187 0xC8EC #HANGUL SYLLABLE CIEUC YO RIEULSIOS -0xA188 0xC8ED #HANGUL SYLLABLE CIEUC YO RIEULTHIEUTH -0xA189 0xC8EE #HANGUL SYLLABLE CIEUC YO RIEULPHIEUPH -0xA18A 0xC8EF #HANGUL SYLLABLE CIEUC YO RIEULHIEUH -0xA18B 0xC8F0 #HANGUL SYLLABLE CIEUC YO MIEUM -0xA18C 0xC8F1 #HANGUL SYLLABLE CIEUC YO PIEUP -0xA18D 0xC8F2 #HANGUL SYLLABLE CIEUC YO PIEUPSIOS -0xA18E 0xC8F3 #HANGUL SYLLABLE CIEUC YO SIOS -0xA18F 0xC8F4 #HANGUL SYLLABLE CIEUC YO SSANGSIOS -0xA190 0xC8F6 #HANGUL SYLLABLE CIEUC YO CIEUC -0xA191 0xC8F7 #HANGUL SYLLABLE CIEUC YO CHIEUCH -0xA192 0xC8F8 #HANGUL SYLLABLE CIEUC YO KHIEUKH -0xA193 0xC8F9 #HANGUL SYLLABLE CIEUC YO THIEUTH -0xA194 0xC8FA #HANGUL SYLLABLE CIEUC YO PHIEUPH -0xA195 0xC8FB #HANGUL SYLLABLE CIEUC YO HIEUH -0xA196 0xC8FE #HANGUL SYLLABLE CIEUC U SSANGKIYEOK -0xA197 0xC8FF #HANGUL SYLLABLE CIEUC U KIYEOKSIOS -0xA198 0xC901 #HANGUL SYLLABLE CIEUC U NIEUNCIEUC -0xA199 0xC902 #HANGUL SYLLABLE CIEUC U NIEUNHIEUH -0xA19A 0xC903 #HANGUL SYLLABLE CIEUC U TIKEUT -0xA19B 0xC907 #HANGUL SYLLABLE CIEUC U RIEULPIEUP -0xA19C 0xC908 #HANGUL SYLLABLE CIEUC U RIEULSIOS -0xA19D 0xC909 #HANGUL SYLLABLE CIEUC U RIEULTHIEUTH -0xA19E 0xC90A #HANGUL SYLLABLE CIEUC U RIEULPHIEUPH -0xA19F 0xC90B #HANGUL SYLLABLE CIEUC U RIEULHIEUH -0xA1A0 0xC90E #HANGUL SYLLABLE CIEUC U PIEUPSIOS -0xA1A1 0x3000 #IDEOGRAPHIC SPACE -0xA1A2 0x3001 #IDEOGRAPHIC COMMA -0xA1A3 0x3002 #IDEOGRAPHIC FULL STOP -0xA1A4 0x00B7 #MIDDLE DOT -0xA1A5 0x2025 #TWO DOT LEADER -0xA1A6 0x2026 #HORIZONTAL ELLIPSIS -0xA1A7 0x00A8 #DIAERESIS -0xA1A8 0x3003 #DITTO MARK -0xA1A9 0x00AD #SOFT HYPHEN -0xA1AA 0x2015 #HORIZONTAL BAR -0xA1AB 0x2225 #PARALLEL TO -0xA1AC 0xFF3C #FULLWIDTH REVERSE SOLIDUS -0xA1AD 0x223C #TILDE OPERATOR -0xA1AE 0x2018 #LEFT SINGLE QUOTATION MARK -0xA1AF 0x2019 #RIGHT SINGLE QUOTATION MARK -0xA1B0 0x201C #LEFT DOUBLE QUOTATION MARK -0xA1B1 0x201D #RIGHT DOUBLE QUOTATION MARK -0xA1B2 0x3014 #LEFT TORTOISE SHELL BRACKET -0xA1B3 0x3015 #RIGHT TORTOISE SHELL BRACKET -0xA1B4 0x3008 #LEFT ANGLE BRACKET -0xA1B5 0x3009 #RIGHT ANGLE BRACKET -0xA1B6 0x300A #LEFT DOUBLE ANGLE BRACKET -0xA1B7 0x300B #RIGHT DOUBLE ANGLE BRACKET -0xA1B8 0x300C #LEFT CORNER BRACKET -0xA1B9 0x300D #RIGHT CORNER BRACKET -0xA1BA 0x300E #LEFT WHITE CORNER BRACKET -0xA1BB 0x300F #RIGHT WHITE CORNER BRACKET -0xA1BC 0x3010 #LEFT BLACK LENTICULAR BRACKET -0xA1BD 0x3011 #RIGHT BLACK LENTICULAR BRACKET -0xA1BE 0x00B1 #PLUS-MINUS SIGN -0xA1BF 0x00D7 #MULTIPLICATION SIGN -0xA1C0 0x00F7 #DIVISION SIGN -0xA1C1 0x2260 #NOT EQUAL TO -0xA1C2 0x2264 #LESS-THAN OR EQUAL TO -0xA1C3 0x2265 #GREATER-THAN OR EQUAL TO -0xA1C4 0x221E #INFINITY -0xA1C5 0x2234 #THEREFORE -0xA1C6 0x00B0 #DEGREE SIGN -0xA1C7 0x2032 #PRIME -0xA1C8 0x2033 #DOUBLE PRIME -0xA1C9 0x2103 #DEGREE CELSIUS -0xA1CA 0x212B #ANGSTROM SIGN -0xA1CB 0xFFE0 #FULLWIDTH CENT SIGN -0xA1CC 0xFFE1 #FULLWIDTH POUND SIGN -0xA1CD 0xFFE5 #FULLWIDTH YEN SIGN -0xA1CE 0x2642 #MALE SIGN -0xA1CF 0x2640 #FEMALE SIGN -0xA1D0 0x2220 #ANGLE -0xA1D1 0x22A5 #UP TACK -0xA1D2 0x2312 #ARC -0xA1D3 0x2202 #PARTIAL DIFFERENTIAL -0xA1D4 0x2207 #NABLA -0xA1D5 0x2261 #IDENTICAL TO -0xA1D6 0x2252 #APPROXIMATELY EQUAL TO OR THE IMAGE OF -0xA1D7 0x00A7 #SECTION SIGN -0xA1D8 0x203B #REFERENCE MARK -0xA1D9 0x2606 #WHITE STAR -0xA1DA 0x2605 #BLACK STAR -0xA1DB 0x25CB #WHITE CIRCLE -0xA1DC 0x25CF #BLACK CIRCLE -0xA1DD 0x25CE #BULLSEYE -0xA1DE 0x25C7 #WHITE DIAMOND -0xA1DF 0x25C6 #BLACK DIAMOND -0xA1E0 0x25A1 #WHITE SQUARE -0xA1E1 0x25A0 #BLACK SQUARE -0xA1E2 0x25B3 #WHITE UP-POINTING TRIANGLE -0xA1E3 0x25B2 #BLACK UP-POINTING TRIANGLE -0xA1E4 0x25BD #WHITE DOWN-POINTING TRIANGLE -0xA1E5 0x25BC #BLACK DOWN-POINTING TRIANGLE -0xA1E6 0x2192 #RIGHTWARDS ARROW -0xA1E7 0x2190 #LEFTWARDS ARROW -0xA1E8 0x2191 #UPWARDS ARROW -0xA1E9 0x2193 #DOWNWARDS ARROW -0xA1EA 0x2194 #LEFT RIGHT ARROW -0xA1EB 0x3013 #GETA MARK -0xA1EC 0x226A #MUCH LESS-THAN -0xA1ED 0x226B #MUCH GREATER-THAN -0xA1EE 0x221A #SQUARE ROOT -0xA1EF 0x223D #REVERSED TILDE -0xA1F0 0x221D #PROPORTIONAL TO -0xA1F1 0x2235 #BECAUSE -0xA1F2 0x222B #INTEGRAL -0xA1F3 0x222C #DOUBLE INTEGRAL -0xA1F4 0x2208 #ELEMENT OF -0xA1F5 0x220B #CONTAINS AS MEMBER -0xA1F6 0x2286 #SUBSET OF OR EQUAL TO -0xA1F7 0x2287 #SUPERSET OF OR EQUAL TO -0xA1F8 0x2282 #SUBSET OF -0xA1F9 0x2283 #SUPERSET OF -0xA1FA 0x222A #UNION -0xA1FB 0x2229 #INTERSECTION -0xA1FC 0x2227 #LOGICAL AND -0xA1FD 0x2228 #LOGICAL OR -0xA1FE 0xFFE2 #FULLWIDTH NOT SIGN -0xA241 0xC910 #HANGUL SYLLABLE CIEUC U SSANGSIOS -0xA242 0xC912 #HANGUL SYLLABLE CIEUC U CIEUC -0xA243 0xC913 #HANGUL SYLLABLE CIEUC U CHIEUCH -0xA244 0xC914 #HANGUL SYLLABLE CIEUC U KHIEUKH -0xA245 0xC915 #HANGUL SYLLABLE CIEUC U THIEUTH -0xA246 0xC916 #HANGUL SYLLABLE CIEUC U PHIEUPH -0xA247 0xC917 #HANGUL SYLLABLE CIEUC U HIEUH -0xA248 0xC919 #HANGUL SYLLABLE CIEUC WEO KIYEOK -0xA249 0xC91A #HANGUL SYLLABLE CIEUC WEO SSANGKIYEOK -0xA24A 0xC91B #HANGUL SYLLABLE CIEUC WEO KIYEOKSIOS -0xA24B 0xC91C #HANGUL SYLLABLE CIEUC WEO NIEUN -0xA24C 0xC91D #HANGUL SYLLABLE CIEUC WEO NIEUNCIEUC -0xA24D 0xC91E #HANGUL SYLLABLE CIEUC WEO NIEUNHIEUH -0xA24E 0xC91F #HANGUL SYLLABLE CIEUC WEO TIKEUT -0xA24F 0xC920 #HANGUL SYLLABLE CIEUC WEO RIEUL -0xA250 0xC921 #HANGUL SYLLABLE CIEUC WEO RIEULKIYEOK -0xA251 0xC922 #HANGUL SYLLABLE CIEUC WEO RIEULMIEUM -0xA252 0xC923 #HANGUL SYLLABLE CIEUC WEO RIEULPIEUP -0xA253 0xC924 #HANGUL SYLLABLE CIEUC WEO RIEULSIOS -0xA254 0xC925 #HANGUL SYLLABLE CIEUC WEO RIEULTHIEUTH -0xA255 0xC926 #HANGUL SYLLABLE CIEUC WEO RIEULPHIEUPH -0xA256 0xC927 #HANGUL SYLLABLE CIEUC WEO RIEULHIEUH -0xA257 0xC928 #HANGUL SYLLABLE CIEUC WEO MIEUM -0xA258 0xC929 #HANGUL SYLLABLE CIEUC WEO PIEUP -0xA259 0xC92A #HANGUL SYLLABLE CIEUC WEO PIEUPSIOS -0xA25A 0xC92B #HANGUL SYLLABLE CIEUC WEO SIOS -0xA261 0xC92D #HANGUL SYLLABLE CIEUC WEO IEUNG -0xA262 0xC92E #HANGUL SYLLABLE CIEUC WEO CIEUC -0xA263 0xC92F #HANGUL SYLLABLE CIEUC WEO CHIEUCH -0xA264 0xC930 #HANGUL SYLLABLE CIEUC WEO KHIEUKH -0xA265 0xC931 #HANGUL SYLLABLE CIEUC WEO THIEUTH -0xA266 0xC932 #HANGUL SYLLABLE CIEUC WEO PHIEUPH -0xA267 0xC933 #HANGUL SYLLABLE CIEUC WEO HIEUH -0xA268 0xC935 #HANGUL SYLLABLE CIEUC WE KIYEOK -0xA269 0xC936 #HANGUL SYLLABLE CIEUC WE SSANGKIYEOK -0xA26A 0xC937 #HANGUL SYLLABLE CIEUC WE KIYEOKSIOS -0xA26B 0xC938 #HANGUL SYLLABLE CIEUC WE NIEUN -0xA26C 0xC939 #HANGUL SYLLABLE CIEUC WE NIEUNCIEUC -0xA26D 0xC93A #HANGUL SYLLABLE CIEUC WE NIEUNHIEUH -0xA26E 0xC93B #HANGUL SYLLABLE CIEUC WE TIKEUT -0xA26F 0xC93C #HANGUL SYLLABLE CIEUC WE RIEUL -0xA270 0xC93D #HANGUL SYLLABLE CIEUC WE RIEULKIYEOK -0xA271 0xC93E #HANGUL SYLLABLE CIEUC WE RIEULMIEUM -0xA272 0xC93F #HANGUL SYLLABLE CIEUC WE RIEULPIEUP -0xA273 0xC940 #HANGUL SYLLABLE CIEUC WE RIEULSIOS -0xA274 0xC941 #HANGUL SYLLABLE CIEUC WE RIEULTHIEUTH -0xA275 0xC942 #HANGUL SYLLABLE CIEUC WE RIEULPHIEUPH -0xA276 0xC943 #HANGUL SYLLABLE CIEUC WE RIEULHIEUH -0xA277 0xC944 #HANGUL SYLLABLE CIEUC WE MIEUM -0xA278 0xC945 #HANGUL SYLLABLE CIEUC WE PIEUP -0xA279 0xC946 #HANGUL SYLLABLE CIEUC WE PIEUPSIOS -0xA27A 0xC947 #HANGUL SYLLABLE CIEUC WE SIOS -0xA281 0xC948 #HANGUL SYLLABLE CIEUC WE SSANGSIOS -0xA282 0xC949 #HANGUL SYLLABLE CIEUC WE IEUNG -0xA283 0xC94A #HANGUL SYLLABLE CIEUC WE CIEUC -0xA284 0xC94B #HANGUL SYLLABLE CIEUC WE CHIEUCH -0xA285 0xC94C #HANGUL SYLLABLE CIEUC WE KHIEUKH -0xA286 0xC94D #HANGUL SYLLABLE CIEUC WE THIEUTH -0xA287 0xC94E #HANGUL SYLLABLE CIEUC WE PHIEUPH -0xA288 0xC94F #HANGUL SYLLABLE CIEUC WE HIEUH -0xA289 0xC952 #HANGUL SYLLABLE CIEUC WI SSANGKIYEOK -0xA28A 0xC953 #HANGUL SYLLABLE CIEUC WI KIYEOKSIOS -0xA28B 0xC955 #HANGUL SYLLABLE CIEUC WI NIEUNCIEUC -0xA28C 0xC956 #HANGUL SYLLABLE CIEUC WI NIEUNHIEUH -0xA28D 0xC957 #HANGUL SYLLABLE CIEUC WI TIKEUT -0xA28E 0xC959 #HANGUL SYLLABLE CIEUC WI RIEULKIYEOK -0xA28F 0xC95A #HANGUL SYLLABLE CIEUC WI RIEULMIEUM -0xA290 0xC95B #HANGUL SYLLABLE CIEUC WI RIEULPIEUP -0xA291 0xC95C #HANGUL SYLLABLE CIEUC WI RIEULSIOS -0xA292 0xC95D #HANGUL SYLLABLE CIEUC WI RIEULTHIEUTH -0xA293 0xC95E #HANGUL SYLLABLE CIEUC WI RIEULPHIEUPH -0xA294 0xC95F #HANGUL SYLLABLE CIEUC WI RIEULHIEUH -0xA295 0xC962 #HANGUL SYLLABLE CIEUC WI PIEUPSIOS -0xA296 0xC964 #HANGUL SYLLABLE CIEUC WI SSANGSIOS -0xA297 0xC965 #HANGUL SYLLABLE CIEUC WI IEUNG -0xA298 0xC966 #HANGUL SYLLABLE CIEUC WI CIEUC -0xA299 0xC967 #HANGUL SYLLABLE CIEUC WI CHIEUCH -0xA29A 0xC968 #HANGUL SYLLABLE CIEUC WI KHIEUKH -0xA29B 0xC969 #HANGUL SYLLABLE CIEUC WI THIEUTH -0xA29C 0xC96A #HANGUL SYLLABLE CIEUC WI PHIEUPH -0xA29D 0xC96B #HANGUL SYLLABLE CIEUC WI HIEUH -0xA29E 0xC96D #HANGUL SYLLABLE CIEUC YU KIYEOK -0xA29F 0xC96E #HANGUL SYLLABLE CIEUC YU SSANGKIYEOK -0xA2A0 0xC96F #HANGUL SYLLABLE CIEUC YU KIYEOKSIOS -0xA2A1 0x21D2 #RIGHTWARDS DOUBLE ARROW -0xA2A2 0x21D4 #LEFT RIGHT DOUBLE ARROW -0xA2A3 0x2200 #FOR ALL -0xA2A4 0x2203 #THERE EXISTS -0xA2A5 0x00B4 #ACUTE ACCENT -0xA2A6 0xFF5E #FULLWIDTH TILDE -0xA2A7 0x02C7 #CARON -0xA2A8 0x02D8 #BREVE -0xA2A9 0x02DD #DOUBLE ACUTE ACCENT -0xA2AA 0x02DA #RING ABOVE -0xA2AB 0x02D9 #DOT ABOVE -0xA2AC 0x00B8 #CEDILLA -0xA2AD 0x02DB #OGONEK -0xA2AE 0x00A1 #INVERTED EXCLAMATION MARK -0xA2AF 0x00BF #INVERTED QUESTION MARK -0xA2B0 0x02D0 #MODIFIER LETTER TRIANGULAR COLON -0xA2B1 0x222E #CONTOUR INTEGRAL -0xA2B2 0x2211 #N-ARY SUMMATION -0xA2B3 0x220F #N-ARY PRODUCT -0xA2B4 0x00A4 #CURRENCY SIGN -0xA2B5 0x2109 #DEGREE FAHRENHEIT -0xA2B6 0x2030 #PER MILLE SIGN -0xA2B7 0x25C1 #WHITE LEFT-POINTING TRIANGLE -0xA2B8 0x25C0 #BLACK LEFT-POINTING TRIANGLE -0xA2B9 0x25B7 #WHITE RIGHT-POINTING TRIANGLE -0xA2BA 0x25B6 #BLACK RIGHT-POINTING TRIANGLE -0xA2BB 0x2664 #WHITE SPADE SUIT -0xA2BC 0x2660 #BLACK SPADE SUIT -0xA2BD 0x2661 #WHITE HEART SUIT -0xA2BE 0x2665 #BLACK HEART SUIT -0xA2BF 0x2667 #WHITE CLUB SUIT -0xA2C0 0x2663 #BLACK CLUB SUIT -0xA2C1 0x2299 #CIRCLED DOT OPERATOR -0xA2C2 0x25C8 #WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND -0xA2C3 0x25A3 #WHITE SQUARE CONTAINING BLACK SMALL SQUARE -0xA2C4 0x25D0 #CIRCLE WITH LEFT HALF BLACK -0xA2C5 0x25D1 #CIRCLE WITH RIGHT HALF BLACK -0xA2C6 0x2592 #MEDIUM SHADE -0xA2C7 0x25A4 #SQUARE WITH HORIZONTAL FILL -0xA2C8 0x25A5 #SQUARE WITH VERTICAL FILL -0xA2C9 0x25A8 #SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL -0xA2CA 0x25A7 #SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL -0xA2CB 0x25A6 #SQUARE WITH ORTHOGONAL CROSSHATCH FILL -0xA2CC 0x25A9 #SQUARE WITH DIAGONAL CROSSHATCH FILL -0xA2CD 0x2668 #HOT SPRINGS -0xA2CE 0x260F #WHITE TELEPHONE -0xA2CF 0x260E #BLACK TELEPHONE -0xA2D0 0x261C #WHITE LEFT POINTING INDEX -0xA2D1 0x261E #WHITE RIGHT POINTING INDEX -0xA2D2 0x00B6 #PILCROW SIGN -0xA2D3 0x2020 #DAGGER -0xA2D4 0x2021 #DOUBLE DAGGER -0xA2D5 0x2195 #UP DOWN ARROW -0xA2D6 0x2197 #NORTH EAST ARROW -0xA2D7 0x2199 #SOUTH WEST ARROW -0xA2D8 0x2196 #NORTH WEST ARROW -0xA2D9 0x2198 #SOUTH EAST ARROW -0xA2DA 0x266D #MUSIC FLAT SIGN -0xA2DB 0x2669 #QUARTER NOTE -0xA2DC 0x266A #EIGHTH NOTE -0xA2DD 0x266C #BEAMED SIXTEENTH NOTES -0xA2DE 0x327F #KOREAN STANDARD SYMBOL -0xA2DF 0x321C #PARENTHESIZED HANGUL CIEUC U -0xA2E0 0x2116 #NUMERO SIGN -0xA2E1 0x33C7 #SQUARE CO -0xA2E2 0x2122 #TRADE MARK SIGN -0xA2E3 0x33C2 #SQUARE AM -0xA2E4 0x33D8 #SQUARE PM -0xA2E5 0x2121 #TELEPHONE SIGN -0xA2E6 0x20AC #EURO SIGN -0xA2E7 0x00AE #REGISTERED SIGN -0xA341 0xC971 #HANGUL SYLLABLE CIEUC YU NIEUNCIEUC -0xA342 0xC972 #HANGUL SYLLABLE CIEUC YU NIEUNHIEUH -0xA343 0xC973 #HANGUL SYLLABLE CIEUC YU TIKEUT -0xA344 0xC975 #HANGUL SYLLABLE CIEUC YU RIEULKIYEOK -0xA345 0xC976 #HANGUL SYLLABLE CIEUC YU RIEULMIEUM -0xA346 0xC977 #HANGUL SYLLABLE CIEUC YU RIEULPIEUP -0xA347 0xC978 #HANGUL SYLLABLE CIEUC YU RIEULSIOS -0xA348 0xC979 #HANGUL SYLLABLE CIEUC YU RIEULTHIEUTH -0xA349 0xC97A #HANGUL SYLLABLE CIEUC YU RIEULPHIEUPH -0xA34A 0xC97B #HANGUL SYLLABLE CIEUC YU RIEULHIEUH -0xA34B 0xC97D #HANGUL SYLLABLE CIEUC YU PIEUP -0xA34C 0xC97E #HANGUL SYLLABLE CIEUC YU PIEUPSIOS -0xA34D 0xC97F #HANGUL SYLLABLE CIEUC YU SIOS -0xA34E 0xC980 #HANGUL SYLLABLE CIEUC YU SSANGSIOS -0xA34F 0xC981 #HANGUL SYLLABLE CIEUC YU IEUNG -0xA350 0xC982 #HANGUL SYLLABLE CIEUC YU CIEUC -0xA351 0xC983 #HANGUL SYLLABLE CIEUC YU CHIEUCH -0xA352 0xC984 #HANGUL SYLLABLE CIEUC YU KHIEUKH -0xA353 0xC985 #HANGUL SYLLABLE CIEUC YU THIEUTH -0xA354 0xC986 #HANGUL SYLLABLE CIEUC YU PHIEUPH -0xA355 0xC987 #HANGUL SYLLABLE CIEUC YU HIEUH -0xA356 0xC98A #HANGUL SYLLABLE CIEUC EU SSANGKIYEOK -0xA357 0xC98B #HANGUL SYLLABLE CIEUC EU KIYEOKSIOS -0xA358 0xC98D #HANGUL SYLLABLE CIEUC EU NIEUNCIEUC -0xA359 0xC98E #HANGUL SYLLABLE CIEUC EU NIEUNHIEUH -0xA35A 0xC98F #HANGUL SYLLABLE CIEUC EU TIKEUT -0xA361 0xC991 #HANGUL SYLLABLE CIEUC EU RIEULKIYEOK -0xA362 0xC992 #HANGUL SYLLABLE CIEUC EU RIEULMIEUM -0xA363 0xC993 #HANGUL SYLLABLE CIEUC EU RIEULPIEUP -0xA364 0xC994 #HANGUL SYLLABLE CIEUC EU RIEULSIOS -0xA365 0xC995 #HANGUL SYLLABLE CIEUC EU RIEULTHIEUTH -0xA366 0xC996 #HANGUL SYLLABLE CIEUC EU RIEULPHIEUPH -0xA367 0xC997 #HANGUL SYLLABLE CIEUC EU RIEULHIEUH -0xA368 0xC99A #HANGUL SYLLABLE CIEUC EU PIEUPSIOS -0xA369 0xC99C #HANGUL SYLLABLE CIEUC EU SSANGSIOS -0xA36A 0xC99E #HANGUL SYLLABLE CIEUC EU CIEUC -0xA36B 0xC99F #HANGUL SYLLABLE CIEUC EU CHIEUCH -0xA36C 0xC9A0 #HANGUL SYLLABLE CIEUC EU KHIEUKH -0xA36D 0xC9A1 #HANGUL SYLLABLE CIEUC EU THIEUTH -0xA36E 0xC9A2 #HANGUL SYLLABLE CIEUC EU PHIEUPH -0xA36F 0xC9A3 #HANGUL SYLLABLE CIEUC EU HIEUH -0xA370 0xC9A4 #HANGUL SYLLABLE CIEUC YI -0xA371 0xC9A5 #HANGUL SYLLABLE CIEUC YI KIYEOK -0xA372 0xC9A6 #HANGUL SYLLABLE CIEUC YI SSANGKIYEOK -0xA373 0xC9A7 #HANGUL SYLLABLE CIEUC YI KIYEOKSIOS -0xA374 0xC9A8 #HANGUL SYLLABLE CIEUC YI NIEUN -0xA375 0xC9A9 #HANGUL SYLLABLE CIEUC YI NIEUNCIEUC -0xA376 0xC9AA #HANGUL SYLLABLE CIEUC YI NIEUNHIEUH -0xA377 0xC9AB #HANGUL SYLLABLE CIEUC YI TIKEUT -0xA378 0xC9AC #HANGUL SYLLABLE CIEUC YI RIEUL -0xA379 0xC9AD #HANGUL SYLLABLE CIEUC YI RIEULKIYEOK -0xA37A 0xC9AE #HANGUL SYLLABLE CIEUC YI RIEULMIEUM -0xA381 0xC9AF #HANGUL SYLLABLE CIEUC YI RIEULPIEUP -0xA382 0xC9B0 #HANGUL SYLLABLE CIEUC YI RIEULSIOS -0xA383 0xC9B1 #HANGUL SYLLABLE CIEUC YI RIEULTHIEUTH -0xA384 0xC9B2 #HANGUL SYLLABLE CIEUC YI RIEULPHIEUPH -0xA385 0xC9B3 #HANGUL SYLLABLE CIEUC YI RIEULHIEUH -0xA386 0xC9B4 #HANGUL SYLLABLE CIEUC YI MIEUM -0xA387 0xC9B5 #HANGUL SYLLABLE CIEUC YI PIEUP -0xA388 0xC9B6 #HANGUL SYLLABLE CIEUC YI PIEUPSIOS -0xA389 0xC9B7 #HANGUL SYLLABLE CIEUC YI SIOS -0xA38A 0xC9B8 #HANGUL SYLLABLE CIEUC YI SSANGSIOS -0xA38B 0xC9B9 #HANGUL SYLLABLE CIEUC YI IEUNG -0xA38C 0xC9BA #HANGUL SYLLABLE CIEUC YI CIEUC -0xA38D 0xC9BB #HANGUL SYLLABLE CIEUC YI CHIEUCH -0xA38E 0xC9BC #HANGUL SYLLABLE CIEUC YI KHIEUKH -0xA38F 0xC9BD #HANGUL SYLLABLE CIEUC YI THIEUTH -0xA390 0xC9BE #HANGUL SYLLABLE CIEUC YI PHIEUPH -0xA391 0xC9BF #HANGUL SYLLABLE CIEUC YI HIEUH -0xA392 0xC9C2 #HANGUL SYLLABLE CIEUC I SSANGKIYEOK -0xA393 0xC9C3 #HANGUL SYLLABLE CIEUC I KIYEOKSIOS -0xA394 0xC9C5 #HANGUL SYLLABLE CIEUC I NIEUNCIEUC -0xA395 0xC9C6 #HANGUL SYLLABLE CIEUC I NIEUNHIEUH -0xA396 0xC9C9 #HANGUL SYLLABLE CIEUC I RIEULKIYEOK -0xA397 0xC9CB #HANGUL SYLLABLE CIEUC I RIEULPIEUP -0xA398 0xC9CC #HANGUL SYLLABLE CIEUC I RIEULSIOS -0xA399 0xC9CD #HANGUL SYLLABLE CIEUC I RIEULTHIEUTH -0xA39A 0xC9CE #HANGUL SYLLABLE CIEUC I RIEULPHIEUPH -0xA39B 0xC9CF #HANGUL SYLLABLE CIEUC I RIEULHIEUH -0xA39C 0xC9D2 #HANGUL SYLLABLE CIEUC I PIEUPSIOS -0xA39D 0xC9D4 #HANGUL SYLLABLE CIEUC I SSANGSIOS -0xA39E 0xC9D7 #HANGUL SYLLABLE CIEUC I CHIEUCH -0xA39F 0xC9D8 #HANGUL SYLLABLE CIEUC I KHIEUKH -0xA3A0 0xC9DB #HANGUL SYLLABLE CIEUC I HIEUH -0xA3A1 0xFF01 #FULLWIDTH EXCLAMATION MARK -0xA3A2 0xFF02 #FULLWIDTH QUOTATION MARK -0xA3A3 0xFF03 #FULLWIDTH NUMBER SIGN -0xA3A4 0xFF04 #FULLWIDTH DOLLAR SIGN -0xA3A5 0xFF05 #FULLWIDTH PERCENT SIGN -0xA3A6 0xFF06 #FULLWIDTH AMPERSAND -0xA3A7 0xFF07 #FULLWIDTH APOSTROPHE -0xA3A8 0xFF08 #FULLWIDTH LEFT PARENTHESIS -0xA3A9 0xFF09 #FULLWIDTH RIGHT PARENTHESIS -0xA3AA 0xFF0A #FULLWIDTH ASTERISK -0xA3AB 0xFF0B #FULLWIDTH PLUS SIGN -0xA3AC 0xFF0C #FULLWIDTH COMMA -0xA3AD 0xFF0D #FULLWIDTH HYPHEN-MINUS -0xA3AE 0xFF0E #FULLWIDTH FULL STOP -0xA3AF 0xFF0F #FULLWIDTH SOLIDUS -0xA3B0 0xFF10 #FULLWIDTH DIGIT ZERO -0xA3B1 0xFF11 #FULLWIDTH DIGIT ONE -0xA3B2 0xFF12 #FULLWIDTH DIGIT TWO -0xA3B3 0xFF13 #FULLWIDTH DIGIT THREE -0xA3B4 0xFF14 #FULLWIDTH DIGIT FOUR -0xA3B5 0xFF15 #FULLWIDTH DIGIT FIVE -0xA3B6 0xFF16 #FULLWIDTH DIGIT SIX -0xA3B7 0xFF17 #FULLWIDTH DIGIT SEVEN -0xA3B8 0xFF18 #FULLWIDTH DIGIT EIGHT -0xA3B9 0xFF19 #FULLWIDTH DIGIT NINE -0xA3BA 0xFF1A #FULLWIDTH COLON -0xA3BB 0xFF1B #FULLWIDTH SEMICOLON -0xA3BC 0xFF1C #FULLWIDTH LESS-THAN SIGN -0xA3BD 0xFF1D #FULLWIDTH EQUALS SIGN -0xA3BE 0xFF1E #FULLWIDTH GREATER-THAN SIGN -0xA3BF 0xFF1F #FULLWIDTH QUESTION MARK -0xA3C0 0xFF20 #FULLWIDTH COMMERCIAL AT -0xA3C1 0xFF21 #FULLWIDTH LATIN CAPITAL LETTER A -0xA3C2 0xFF22 #FULLWIDTH LATIN CAPITAL LETTER B -0xA3C3 0xFF23 #FULLWIDTH LATIN CAPITAL LETTER C -0xA3C4 0xFF24 #FULLWIDTH LATIN CAPITAL LETTER D -0xA3C5 0xFF25 #FULLWIDTH LATIN CAPITAL LETTER E -0xA3C6 0xFF26 #FULLWIDTH LATIN CAPITAL LETTER F -0xA3C7 0xFF27 #FULLWIDTH LATIN CAPITAL LETTER G -0xA3C8 0xFF28 #FULLWIDTH LATIN CAPITAL LETTER H -0xA3C9 0xFF29 #FULLWIDTH LATIN CAPITAL LETTER I -0xA3CA 0xFF2A #FULLWIDTH LATIN CAPITAL LETTER J -0xA3CB 0xFF2B #FULLWIDTH LATIN CAPITAL LETTER K -0xA3CC 0xFF2C #FULLWIDTH LATIN CAPITAL LETTER L -0xA3CD 0xFF2D #FULLWIDTH LATIN CAPITAL LETTER M -0xA3CE 0xFF2E #FULLWIDTH LATIN CAPITAL LETTER N -0xA3CF 0xFF2F #FULLWIDTH LATIN CAPITAL LETTER O -0xA3D0 0xFF30 #FULLWIDTH LATIN CAPITAL LETTER P -0xA3D1 0xFF31 #FULLWIDTH LATIN CAPITAL LETTER Q -0xA3D2 0xFF32 #FULLWIDTH LATIN CAPITAL LETTER R -0xA3D3 0xFF33 #FULLWIDTH LATIN CAPITAL LETTER S -0xA3D4 0xFF34 #FULLWIDTH LATIN CAPITAL LETTER T -0xA3D5 0xFF35 #FULLWIDTH LATIN CAPITAL LETTER U -0xA3D6 0xFF36 #FULLWIDTH LATIN CAPITAL LETTER V -0xA3D7 0xFF37 #FULLWIDTH LATIN CAPITAL LETTER W -0xA3D8 0xFF38 #FULLWIDTH LATIN CAPITAL LETTER X -0xA3D9 0xFF39 #FULLWIDTH LATIN CAPITAL LETTER Y -0xA3DA 0xFF3A #FULLWIDTH LATIN CAPITAL LETTER Z -0xA3DB 0xFF3B #FULLWIDTH LEFT SQUARE BRACKET -0xA3DC 0xFFE6 #FULLWIDTH WON SIGN -0xA3DD 0xFF3D #FULLWIDTH RIGHT SQUARE BRACKET -0xA3DE 0xFF3E #FULLWIDTH CIRCUMFLEX ACCENT -0xA3DF 0xFF3F #FULLWIDTH LOW LINE -0xA3E0 0xFF40 #FULLWIDTH GRAVE ACCENT -0xA3E1 0xFF41 #FULLWIDTH LATIN SMALL LETTER A -0xA3E2 0xFF42 #FULLWIDTH LATIN SMALL LETTER B -0xA3E3 0xFF43 #FULLWIDTH LATIN SMALL LETTER C -0xA3E4 0xFF44 #FULLWIDTH LATIN SMALL LETTER D -0xA3E5 0xFF45 #FULLWIDTH LATIN SMALL LETTER E -0xA3E6 0xFF46 #FULLWIDTH LATIN SMALL LETTER F -0xA3E7 0xFF47 #FULLWIDTH LATIN SMALL LETTER G -0xA3E8 0xFF48 #FULLWIDTH LATIN SMALL LETTER H -0xA3E9 0xFF49 #FULLWIDTH LATIN SMALL LETTER I -0xA3EA 0xFF4A #FULLWIDTH LATIN SMALL LETTER J -0xA3EB 0xFF4B #FULLWIDTH LATIN SMALL LETTER K -0xA3EC 0xFF4C #FULLWIDTH LATIN SMALL LETTER L -0xA3ED 0xFF4D #FULLWIDTH LATIN SMALL LETTER M -0xA3EE 0xFF4E #FULLWIDTH LATIN SMALL LETTER N -0xA3EF 0xFF4F #FULLWIDTH LATIN SMALL LETTER O -0xA3F0 0xFF50 #FULLWIDTH LATIN SMALL LETTER P -0xA3F1 0xFF51 #FULLWIDTH LATIN SMALL LETTER Q -0xA3F2 0xFF52 #FULLWIDTH LATIN SMALL LETTER R -0xA3F3 0xFF53 #FULLWIDTH LATIN SMALL LETTER S -0xA3F4 0xFF54 #FULLWIDTH LATIN SMALL LETTER T -0xA3F5 0xFF55 #FULLWIDTH LATIN SMALL LETTER U -0xA3F6 0xFF56 #FULLWIDTH LATIN SMALL LETTER V -0xA3F7 0xFF57 #FULLWIDTH LATIN SMALL LETTER W -0xA3F8 0xFF58 #FULLWIDTH LATIN SMALL LETTER X -0xA3F9 0xFF59 #FULLWIDTH LATIN SMALL LETTER Y -0xA3FA 0xFF5A #FULLWIDTH LATIN SMALL LETTER Z -0xA3FB 0xFF5B #FULLWIDTH LEFT CURLY BRACKET -0xA3FC 0xFF5C #FULLWIDTH VERTICAL LINE -0xA3FD 0xFF5D #FULLWIDTH RIGHT CURLY BRACKET -0xA3FE 0xFFE3 #FULLWIDTH MACRON -0xA441 0xC9DE #HANGUL SYLLABLE SSANGCIEUC A SSANGKIYEOK -0xA442 0xC9DF #HANGUL SYLLABLE SSANGCIEUC A KIYEOKSIOS -0xA443 0xC9E1 #HANGUL SYLLABLE SSANGCIEUC A NIEUNCIEUC -0xA444 0xC9E3 #HANGUL SYLLABLE SSANGCIEUC A TIKEUT -0xA445 0xC9E5 #HANGUL SYLLABLE SSANGCIEUC A RIEULKIYEOK -0xA446 0xC9E6 #HANGUL SYLLABLE SSANGCIEUC A RIEULMIEUM -0xA447 0xC9E8 #HANGUL SYLLABLE SSANGCIEUC A RIEULSIOS -0xA448 0xC9E9 #HANGUL SYLLABLE SSANGCIEUC A RIEULTHIEUTH -0xA449 0xC9EA #HANGUL SYLLABLE SSANGCIEUC A RIEULPHIEUPH -0xA44A 0xC9EB #HANGUL SYLLABLE SSANGCIEUC A RIEULHIEUH -0xA44B 0xC9EE #HANGUL SYLLABLE SSANGCIEUC A PIEUPSIOS -0xA44C 0xC9F2 #HANGUL SYLLABLE SSANGCIEUC A CIEUC -0xA44D 0xC9F3 #HANGUL SYLLABLE SSANGCIEUC A CHIEUCH -0xA44E 0xC9F4 #HANGUL SYLLABLE SSANGCIEUC A KHIEUKH -0xA44F 0xC9F5 #HANGUL SYLLABLE SSANGCIEUC A THIEUTH -0xA450 0xC9F6 #HANGUL SYLLABLE SSANGCIEUC A PHIEUPH -0xA451 0xC9F7 #HANGUL SYLLABLE SSANGCIEUC A HIEUH -0xA452 0xC9FA #HANGUL SYLLABLE SSANGCIEUC AE SSANGKIYEOK -0xA453 0xC9FB #HANGUL SYLLABLE SSANGCIEUC AE KIYEOKSIOS -0xA454 0xC9FD #HANGUL SYLLABLE SSANGCIEUC AE NIEUNCIEUC -0xA455 0xC9FE #HANGUL SYLLABLE SSANGCIEUC AE NIEUNHIEUH -0xA456 0xC9FF #HANGUL SYLLABLE SSANGCIEUC AE TIKEUT -0xA457 0xCA01 #HANGUL SYLLABLE SSANGCIEUC AE RIEULKIYEOK -0xA458 0xCA02 #HANGUL SYLLABLE SSANGCIEUC AE RIEULMIEUM -0xA459 0xCA03 #HANGUL SYLLABLE SSANGCIEUC AE RIEULPIEUP -0xA45A 0xCA04 #HANGUL SYLLABLE SSANGCIEUC AE RIEULSIOS -0xA461 0xCA05 #HANGUL SYLLABLE SSANGCIEUC AE RIEULTHIEUTH -0xA462 0xCA06 #HANGUL SYLLABLE SSANGCIEUC AE RIEULPHIEUPH -0xA463 0xCA07 #HANGUL SYLLABLE SSANGCIEUC AE RIEULHIEUH -0xA464 0xCA0A #HANGUL SYLLABLE SSANGCIEUC AE PIEUPSIOS -0xA465 0xCA0E #HANGUL SYLLABLE SSANGCIEUC AE CIEUC -0xA466 0xCA0F #HANGUL SYLLABLE SSANGCIEUC AE CHIEUCH -0xA467 0xCA10 #HANGUL SYLLABLE SSANGCIEUC AE KHIEUKH -0xA468 0xCA11 #HANGUL SYLLABLE SSANGCIEUC AE THIEUTH -0xA469 0xCA12 #HANGUL SYLLABLE SSANGCIEUC AE PHIEUPH -0xA46A 0xCA13 #HANGUL SYLLABLE SSANGCIEUC AE HIEUH -0xA46B 0xCA15 #HANGUL SYLLABLE SSANGCIEUC YA KIYEOK -0xA46C 0xCA16 #HANGUL SYLLABLE SSANGCIEUC YA SSANGKIYEOK -0xA46D 0xCA17 #HANGUL SYLLABLE SSANGCIEUC YA KIYEOKSIOS -0xA46E 0xCA19 #HANGUL SYLLABLE SSANGCIEUC YA NIEUNCIEUC -0xA46F 0xCA1A #HANGUL SYLLABLE SSANGCIEUC YA NIEUNHIEUH -0xA470 0xCA1B #HANGUL SYLLABLE SSANGCIEUC YA TIKEUT -0xA471 0xCA1C #HANGUL SYLLABLE SSANGCIEUC YA RIEUL -0xA472 0xCA1D #HANGUL SYLLABLE SSANGCIEUC YA RIEULKIYEOK -0xA473 0xCA1E #HANGUL SYLLABLE SSANGCIEUC YA RIEULMIEUM -0xA474 0xCA1F #HANGUL SYLLABLE SSANGCIEUC YA RIEULPIEUP -0xA475 0xCA20 #HANGUL SYLLABLE SSANGCIEUC YA RIEULSIOS -0xA476 0xCA21 #HANGUL SYLLABLE SSANGCIEUC YA RIEULTHIEUTH -0xA477 0xCA22 #HANGUL SYLLABLE SSANGCIEUC YA RIEULPHIEUPH -0xA478 0xCA23 #HANGUL SYLLABLE SSANGCIEUC YA RIEULHIEUH -0xA479 0xCA24 #HANGUL SYLLABLE SSANGCIEUC YA MIEUM -0xA47A 0xCA25 #HANGUL SYLLABLE SSANGCIEUC YA PIEUP -0xA481 0xCA26 #HANGUL SYLLABLE SSANGCIEUC YA PIEUPSIOS -0xA482 0xCA27 #HANGUL SYLLABLE SSANGCIEUC YA SIOS -0xA483 0xCA28 #HANGUL SYLLABLE SSANGCIEUC YA SSANGSIOS -0xA484 0xCA2A #HANGUL SYLLABLE SSANGCIEUC YA CIEUC -0xA485 0xCA2B #HANGUL SYLLABLE SSANGCIEUC YA CHIEUCH -0xA486 0xCA2C #HANGUL SYLLABLE SSANGCIEUC YA KHIEUKH -0xA487 0xCA2D #HANGUL SYLLABLE SSANGCIEUC YA THIEUTH -0xA488 0xCA2E #HANGUL SYLLABLE SSANGCIEUC YA PHIEUPH -0xA489 0xCA2F #HANGUL SYLLABLE SSANGCIEUC YA HIEUH -0xA48A 0xCA30 #HANGUL SYLLABLE SSANGCIEUC YAE -0xA48B 0xCA31 #HANGUL SYLLABLE SSANGCIEUC YAE KIYEOK -0xA48C 0xCA32 #HANGUL SYLLABLE SSANGCIEUC YAE SSANGKIYEOK -0xA48D 0xCA33 #HANGUL SYLLABLE SSANGCIEUC YAE KIYEOKSIOS -0xA48E 0xCA34 #HANGUL SYLLABLE SSANGCIEUC YAE NIEUN -0xA48F 0xCA35 #HANGUL SYLLABLE SSANGCIEUC YAE NIEUNCIEUC -0xA490 0xCA36 #HANGUL SYLLABLE SSANGCIEUC YAE NIEUNHIEUH -0xA491 0xCA37 #HANGUL SYLLABLE SSANGCIEUC YAE TIKEUT -0xA492 0xCA38 #HANGUL SYLLABLE SSANGCIEUC YAE RIEUL -0xA493 0xCA39 #HANGUL SYLLABLE SSANGCIEUC YAE RIEULKIYEOK -0xA494 0xCA3A #HANGUL SYLLABLE SSANGCIEUC YAE RIEULMIEUM -0xA495 0xCA3B #HANGUL SYLLABLE SSANGCIEUC YAE RIEULPIEUP -0xA496 0xCA3C #HANGUL SYLLABLE SSANGCIEUC YAE RIEULSIOS -0xA497 0xCA3D #HANGUL SYLLABLE SSANGCIEUC YAE RIEULTHIEUTH -0xA498 0xCA3E #HANGUL SYLLABLE SSANGCIEUC YAE RIEULPHIEUPH -0xA499 0xCA3F #HANGUL SYLLABLE SSANGCIEUC YAE RIEULHIEUH -0xA49A 0xCA40 #HANGUL SYLLABLE SSANGCIEUC YAE MIEUM -0xA49B 0xCA41 #HANGUL SYLLABLE SSANGCIEUC YAE PIEUP -0xA49C 0xCA42 #HANGUL SYLLABLE SSANGCIEUC YAE PIEUPSIOS -0xA49D 0xCA43 #HANGUL SYLLABLE SSANGCIEUC YAE SIOS -0xA49E 0xCA44 #HANGUL SYLLABLE SSANGCIEUC YAE SSANGSIOS -0xA49F 0xCA45 #HANGUL SYLLABLE SSANGCIEUC YAE IEUNG -0xA4A0 0xCA46 #HANGUL SYLLABLE SSANGCIEUC YAE CIEUC -0xA4A1 0x3131 #HANGUL LETTER KIYEOK -0xA4A2 0x3132 #HANGUL LETTER SSANGKIYEOK -0xA4A3 0x3133 #HANGUL LETTER KIYEOK-SIOS -0xA4A4 0x3134 #HANGUL LETTER NIEUN -0xA4A5 0x3135 #HANGUL LETTER NIEUN-CIEUC -0xA4A6 0x3136 #HANGUL LETTER NIEUN-HIEUH -0xA4A7 0x3137 #HANGUL LETTER TIKEUT -0xA4A8 0x3138 #HANGUL LETTER SSANGTIKEUT -0xA4A9 0x3139 #HANGUL LETTER RIEUL -0xA4AA 0x313A #HANGUL LETTER RIEUL-KIYEOK -0xA4AB 0x313B #HANGUL LETTER RIEUL-MIEUM -0xA4AC 0x313C #HANGUL LETTER RIEUL-PIEUP -0xA4AD 0x313D #HANGUL LETTER RIEUL-SIOS -0xA4AE 0x313E #HANGUL LETTER RIEUL-THIEUTH -0xA4AF 0x313F #HANGUL LETTER RIEUL-PHIEUPH -0xA4B0 0x3140 #HANGUL LETTER RIEUL-HIEUH -0xA4B1 0x3141 #HANGUL LETTER MIEUM -0xA4B2 0x3142 #HANGUL LETTER PIEUP -0xA4B3 0x3143 #HANGUL LETTER SSANGPIEUP -0xA4B4 0x3144 #HANGUL LETTER PIEUP-SIOS -0xA4B5 0x3145 #HANGUL LETTER SIOS -0xA4B6 0x3146 #HANGUL LETTER SSANGSIOS -0xA4B7 0x3147 #HANGUL LETTER IEUNG -0xA4B8 0x3148 #HANGUL LETTER CIEUC -0xA4B9 0x3149 #HANGUL LETTER SSANGCIEUC -0xA4BA 0x314A #HANGUL LETTER CHIEUCH -0xA4BB 0x314B #HANGUL LETTER KHIEUKH -0xA4BC 0x314C #HANGUL LETTER THIEUTH -0xA4BD 0x314D #HANGUL LETTER PHIEUPH -0xA4BE 0x314E #HANGUL LETTER HIEUH -0xA4BF 0x314F #HANGUL LETTER A -0xA4C0 0x3150 #HANGUL LETTER AE -0xA4C1 0x3151 #HANGUL LETTER YA -0xA4C2 0x3152 #HANGUL LETTER YAE -0xA4C3 0x3153 #HANGUL LETTER EO -0xA4C4 0x3154 #HANGUL LETTER E -0xA4C5 0x3155 #HANGUL LETTER YEO -0xA4C6 0x3156 #HANGUL LETTER YE -0xA4C7 0x3157 #HANGUL LETTER O -0xA4C8 0x3158 #HANGUL LETTER WA -0xA4C9 0x3159 #HANGUL LETTER WAE -0xA4CA 0x315A #HANGUL LETTER OE -0xA4CB 0x315B #HANGUL LETTER YO -0xA4CC 0x315C #HANGUL LETTER U -0xA4CD 0x315D #HANGUL LETTER WEO -0xA4CE 0x315E #HANGUL LETTER WE -0xA4CF 0x315F #HANGUL LETTER WI -0xA4D0 0x3160 #HANGUL LETTER YU -0xA4D1 0x3161 #HANGUL LETTER EU -0xA4D2 0x3162 #HANGUL LETTER YI -0xA4D3 0x3163 #HANGUL LETTER I -0xA4D4 0x3164 #HANGUL FILLER -0xA4D5 0x3165 #HANGUL LETTER SSANGNIEUN -0xA4D6 0x3166 #HANGUL LETTER NIEUN-TIKEUT -0xA4D7 0x3167 #HANGUL LETTER NIEUN-SIOS -0xA4D8 0x3168 #HANGUL LETTER NIEUN-PANSIOS -0xA4D9 0x3169 #HANGUL LETTER RIEUL-KIYEOK-SIOS -0xA4DA 0x316A #HANGUL LETTER RIEUL-TIKEUT -0xA4DB 0x316B #HANGUL LETTER RIEUL-PIEUP-SIOS -0xA4DC 0x316C #HANGUL LETTER RIEUL-PANSIOS -0xA4DD 0x316D #HANGUL LETTER RIEUL-YEORINHIEUH -0xA4DE 0x316E #HANGUL LETTER MIEUM-PIEUP -0xA4DF 0x316F #HANGUL LETTER MIEUM-SIOS -0xA4E0 0x3170 #HANGUL LETTER MIEUM-PANSIOS -0xA4E1 0x3171 #HANGUL LETTER KAPYEOUNMIEUM -0xA4E2 0x3172 #HANGUL LETTER PIEUP-KIYEOK -0xA4E3 0x3173 #HANGUL LETTER PIEUP-TIKEUT -0xA4E4 0x3174 #HANGUL LETTER PIEUP-SIOS-KIYEOK -0xA4E5 0x3175 #HANGUL LETTER PIEUP-SIOS-TIKEUT -0xA4E6 0x3176 #HANGUL LETTER PIEUP-CIEUC -0xA4E7 0x3177 #HANGUL LETTER PIEUP-THIEUTH -0xA4E8 0x3178 #HANGUL LETTER KAPYEOUNPIEUP -0xA4E9 0x3179 #HANGUL LETTER KAPYEOUNSSANGPIEUP -0xA4EA 0x317A #HANGUL LETTER SIOS-KIYEOK -0xA4EB 0x317B #HANGUL LETTER SIOS-NIEUN -0xA4EC 0x317C #HANGUL LETTER SIOS-TIKEUT -0xA4ED 0x317D #HANGUL LETTER SIOS-PIEUP -0xA4EE 0x317E #HANGUL LETTER SIOS-CIEUC -0xA4EF 0x317F #HANGUL LETTER PANSIOS -0xA4F0 0x3180 #HANGUL LETTER SSANGIEUNG -0xA4F1 0x3181 #HANGUL LETTER YESIEUNG -0xA4F2 0x3182 #HANGUL LETTER YESIEUNG-SIOS -0xA4F3 0x3183 #HANGUL LETTER YESIEUNG-PANSIOS -0xA4F4 0x3184 #HANGUL LETTER KAPYEOUNPHIEUPH -0xA4F5 0x3185 #HANGUL LETTER SSANGHIEUH -0xA4F6 0x3186 #HANGUL LETTER YEORINHIEUH -0xA4F7 0x3187 #HANGUL LETTER YO-YA -0xA4F8 0x3188 #HANGUL LETTER YO-YAE -0xA4F9 0x3189 #HANGUL LETTER YO-I -0xA4FA 0x318A #HANGUL LETTER YU-YEO -0xA4FB 0x318B #HANGUL LETTER YU-YE -0xA4FC 0x318C #HANGUL LETTER YU-I -0xA4FD 0x318D #HANGUL LETTER ARAEA -0xA4FE 0x318E #HANGUL LETTER ARAEAE -0xA541 0xCA47 #HANGUL SYLLABLE SSANGCIEUC YAE CHIEUCH -0xA542 0xCA48 #HANGUL SYLLABLE SSANGCIEUC YAE KHIEUKH -0xA543 0xCA49 #HANGUL SYLLABLE SSANGCIEUC YAE THIEUTH -0xA544 0xCA4A #HANGUL SYLLABLE SSANGCIEUC YAE PHIEUPH -0xA545 0xCA4B #HANGUL SYLLABLE SSANGCIEUC YAE HIEUH -0xA546 0xCA4E #HANGUL SYLLABLE SSANGCIEUC EO SSANGKIYEOK -0xA547 0xCA4F #HANGUL SYLLABLE SSANGCIEUC EO KIYEOKSIOS -0xA548 0xCA51 #HANGUL SYLLABLE SSANGCIEUC EO NIEUNCIEUC -0xA549 0xCA52 #HANGUL SYLLABLE SSANGCIEUC EO NIEUNHIEUH -0xA54A 0xCA53 #HANGUL SYLLABLE SSANGCIEUC EO TIKEUT -0xA54B 0xCA55 #HANGUL SYLLABLE SSANGCIEUC EO RIEULKIYEOK -0xA54C 0xCA56 #HANGUL SYLLABLE SSANGCIEUC EO RIEULMIEUM -0xA54D 0xCA57 #HANGUL SYLLABLE SSANGCIEUC EO RIEULPIEUP -0xA54E 0xCA58 #HANGUL SYLLABLE SSANGCIEUC EO RIEULSIOS -0xA54F 0xCA59 #HANGUL SYLLABLE SSANGCIEUC EO RIEULTHIEUTH -0xA550 0xCA5A #HANGUL SYLLABLE SSANGCIEUC EO RIEULPHIEUPH -0xA551 0xCA5B #HANGUL SYLLABLE SSANGCIEUC EO RIEULHIEUH -0xA552 0xCA5E #HANGUL SYLLABLE SSANGCIEUC EO PIEUPSIOS -0xA553 0xCA62 #HANGUL SYLLABLE SSANGCIEUC EO CIEUC -0xA554 0xCA63 #HANGUL SYLLABLE SSANGCIEUC EO CHIEUCH -0xA555 0xCA64 #HANGUL SYLLABLE SSANGCIEUC EO KHIEUKH -0xA556 0xCA65 #HANGUL SYLLABLE SSANGCIEUC EO THIEUTH -0xA557 0xCA66 #HANGUL SYLLABLE SSANGCIEUC EO PHIEUPH -0xA558 0xCA67 #HANGUL SYLLABLE SSANGCIEUC EO HIEUH -0xA559 0xCA69 #HANGUL SYLLABLE SSANGCIEUC E KIYEOK -0xA55A 0xCA6A #HANGUL SYLLABLE SSANGCIEUC E SSANGKIYEOK -0xA561 0xCA6B #HANGUL SYLLABLE SSANGCIEUC E KIYEOKSIOS -0xA562 0xCA6C #HANGUL SYLLABLE SSANGCIEUC E NIEUN -0xA563 0xCA6D #HANGUL SYLLABLE SSANGCIEUC E NIEUNCIEUC -0xA564 0xCA6E #HANGUL SYLLABLE SSANGCIEUC E NIEUNHIEUH -0xA565 0xCA6F #HANGUL SYLLABLE SSANGCIEUC E TIKEUT -0xA566 0xCA70 #HANGUL SYLLABLE SSANGCIEUC E RIEUL -0xA567 0xCA71 #HANGUL SYLLABLE SSANGCIEUC E RIEULKIYEOK -0xA568 0xCA72 #HANGUL SYLLABLE SSANGCIEUC E RIEULMIEUM -0xA569 0xCA73 #HANGUL SYLLABLE SSANGCIEUC E RIEULPIEUP -0xA56A 0xCA74 #HANGUL SYLLABLE SSANGCIEUC E RIEULSIOS -0xA56B 0xCA75 #HANGUL SYLLABLE SSANGCIEUC E RIEULTHIEUTH -0xA56C 0xCA76 #HANGUL SYLLABLE SSANGCIEUC E RIEULPHIEUPH -0xA56D 0xCA77 #HANGUL SYLLABLE SSANGCIEUC E RIEULHIEUH -0xA56E 0xCA78 #HANGUL SYLLABLE SSANGCIEUC E MIEUM -0xA56F 0xCA79 #HANGUL SYLLABLE SSANGCIEUC E PIEUP -0xA570 0xCA7A #HANGUL SYLLABLE SSANGCIEUC E PIEUPSIOS -0xA571 0xCA7B #HANGUL SYLLABLE SSANGCIEUC E SIOS -0xA572 0xCA7C #HANGUL SYLLABLE SSANGCIEUC E SSANGSIOS -0xA573 0xCA7E #HANGUL SYLLABLE SSANGCIEUC E CIEUC -0xA574 0xCA7F #HANGUL SYLLABLE SSANGCIEUC E CHIEUCH -0xA575 0xCA80 #HANGUL SYLLABLE SSANGCIEUC E KHIEUKH -0xA576 0xCA81 #HANGUL SYLLABLE SSANGCIEUC E THIEUTH -0xA577 0xCA82 #HANGUL SYLLABLE SSANGCIEUC E PHIEUPH -0xA578 0xCA83 #HANGUL SYLLABLE SSANGCIEUC E HIEUH -0xA579 0xCA85 #HANGUL SYLLABLE SSANGCIEUC YEO KIYEOK -0xA57A 0xCA86 #HANGUL SYLLABLE SSANGCIEUC YEO SSANGKIYEOK -0xA581 0xCA87 #HANGUL SYLLABLE SSANGCIEUC YEO KIYEOKSIOS -0xA582 0xCA88 #HANGUL SYLLABLE SSANGCIEUC YEO NIEUN -0xA583 0xCA89 #HANGUL SYLLABLE SSANGCIEUC YEO NIEUNCIEUC -0xA584 0xCA8A #HANGUL SYLLABLE SSANGCIEUC YEO NIEUNHIEUH -0xA585 0xCA8B #HANGUL SYLLABLE SSANGCIEUC YEO TIKEUT -0xA586 0xCA8C #HANGUL SYLLABLE SSANGCIEUC YEO RIEUL -0xA587 0xCA8D #HANGUL SYLLABLE SSANGCIEUC YEO RIEULKIYEOK -0xA588 0xCA8E #HANGUL SYLLABLE SSANGCIEUC YEO RIEULMIEUM -0xA589 0xCA8F #HANGUL SYLLABLE SSANGCIEUC YEO RIEULPIEUP -0xA58A 0xCA90 #HANGUL SYLLABLE SSANGCIEUC YEO RIEULSIOS -0xA58B 0xCA91 #HANGUL SYLLABLE SSANGCIEUC YEO RIEULTHIEUTH -0xA58C 0xCA92 #HANGUL SYLLABLE SSANGCIEUC YEO RIEULPHIEUPH -0xA58D 0xCA93 #HANGUL SYLLABLE SSANGCIEUC YEO RIEULHIEUH -0xA58E 0xCA94 #HANGUL SYLLABLE SSANGCIEUC YEO MIEUM -0xA58F 0xCA95 #HANGUL SYLLABLE SSANGCIEUC YEO PIEUP -0xA590 0xCA96 #HANGUL SYLLABLE SSANGCIEUC YEO PIEUPSIOS -0xA591 0xCA97 #HANGUL SYLLABLE SSANGCIEUC YEO SIOS -0xA592 0xCA99 #HANGUL SYLLABLE SSANGCIEUC YEO IEUNG -0xA593 0xCA9A #HANGUL SYLLABLE SSANGCIEUC YEO CIEUC -0xA594 0xCA9B #HANGUL SYLLABLE SSANGCIEUC YEO CHIEUCH -0xA595 0xCA9C #HANGUL SYLLABLE SSANGCIEUC YEO KHIEUKH -0xA596 0xCA9D #HANGUL SYLLABLE SSANGCIEUC YEO THIEUTH -0xA597 0xCA9E #HANGUL SYLLABLE SSANGCIEUC YEO PHIEUPH -0xA598 0xCA9F #HANGUL SYLLABLE SSANGCIEUC YEO HIEUH -0xA599 0xCAA0 #HANGUL SYLLABLE SSANGCIEUC YE -0xA59A 0xCAA1 #HANGUL SYLLABLE SSANGCIEUC YE KIYEOK -0xA59B 0xCAA2 #HANGUL SYLLABLE SSANGCIEUC YE SSANGKIYEOK -0xA59C 0xCAA3 #HANGUL SYLLABLE SSANGCIEUC YE KIYEOKSIOS -0xA59D 0xCAA4 #HANGUL SYLLABLE SSANGCIEUC YE NIEUN -0xA59E 0xCAA5 #HANGUL SYLLABLE SSANGCIEUC YE NIEUNCIEUC -0xA59F 0xCAA6 #HANGUL SYLLABLE SSANGCIEUC YE NIEUNHIEUH -0xA5A0 0xCAA7 #HANGUL SYLLABLE SSANGCIEUC YE TIKEUT -0xA5A1 0x2170 #SMALL ROMAN NUMERAL ONE -0xA5A2 0x2171 #SMALL ROMAN NUMERAL TWO -0xA5A3 0x2172 #SMALL ROMAN NUMERAL THREE -0xA5A4 0x2173 #SMALL ROMAN NUMERAL FOUR -0xA5A5 0x2174 #SMALL ROMAN NUMERAL FIVE -0xA5A6 0x2175 #SMALL ROMAN NUMERAL SIX -0xA5A7 0x2176 #SMALL ROMAN NUMERAL SEVEN -0xA5A8 0x2177 #SMALL ROMAN NUMERAL EIGHT -0xA5A9 0x2178 #SMALL ROMAN NUMERAL NINE -0xA5AA 0x2179 #SMALL ROMAN NUMERAL TEN -0xA5B0 0x2160 #ROMAN NUMERAL ONE -0xA5B1 0x2161 #ROMAN NUMERAL TWO -0xA5B2 0x2162 #ROMAN NUMERAL THREE -0xA5B3 0x2163 #ROMAN NUMERAL FOUR -0xA5B4 0x2164 #ROMAN NUMERAL FIVE -0xA5B5 0x2165 #ROMAN NUMERAL SIX -0xA5B6 0x2166 #ROMAN NUMERAL SEVEN -0xA5B7 0x2167 #ROMAN NUMERAL EIGHT -0xA5B8 0x2168 #ROMAN NUMERAL NINE -0xA5B9 0x2169 #ROMAN NUMERAL TEN -0xA5C1 0x0391 #GREEK CAPITAL LETTER ALPHA -0xA5C2 0x0392 #GREEK CAPITAL LETTER BETA -0xA5C3 0x0393 #GREEK CAPITAL LETTER GAMMA -0xA5C4 0x0394 #GREEK CAPITAL LETTER DELTA -0xA5C5 0x0395 #GREEK CAPITAL LETTER EPSILON -0xA5C6 0x0396 #GREEK CAPITAL LETTER ZETA -0xA5C7 0x0397 #GREEK CAPITAL LETTER ETA -0xA5C8 0x0398 #GREEK CAPITAL LETTER THETA -0xA5C9 0x0399 #GREEK CAPITAL LETTER IOTA -0xA5CA 0x039A #GREEK CAPITAL LETTER KAPPA -0xA5CB 0x039B #GREEK CAPITAL LETTER LAMDA -0xA5CC 0x039C #GREEK CAPITAL LETTER MU -0xA5CD 0x039D #GREEK CAPITAL LETTER NU -0xA5CE 0x039E #GREEK CAPITAL LETTER XI -0xA5CF 0x039F #GREEK CAPITAL LETTER OMICRON -0xA5D0 0x03A0 #GREEK CAPITAL LETTER PI -0xA5D1 0x03A1 #GREEK CAPITAL LETTER RHO -0xA5D2 0x03A3 #GREEK CAPITAL LETTER SIGMA -0xA5D3 0x03A4 #GREEK CAPITAL LETTER TAU -0xA5D4 0x03A5 #GREEK CAPITAL LETTER UPSILON -0xA5D5 0x03A6 #GREEK CAPITAL LETTER PHI -0xA5D6 0x03A7 #GREEK CAPITAL LETTER CHI -0xA5D7 0x03A8 #GREEK CAPITAL LETTER PSI -0xA5D8 0x03A9 #GREEK CAPITAL LETTER OMEGA -0xA5E1 0x03B1 #GREEK SMALL LETTER ALPHA -0xA5E2 0x03B2 #GREEK SMALL LETTER BETA -0xA5E3 0x03B3 #GREEK SMALL LETTER GAMMA -0xA5E4 0x03B4 #GREEK SMALL LETTER DELTA -0xA5E5 0x03B5 #GREEK SMALL LETTER EPSILON -0xA5E6 0x03B6 #GREEK SMALL LETTER ZETA -0xA5E7 0x03B7 #GREEK SMALL LETTER ETA -0xA5E8 0x03B8 #GREEK SMALL LETTER THETA -0xA5E9 0x03B9 #GREEK SMALL LETTER IOTA -0xA5EA 0x03BA #GREEK SMALL LETTER KAPPA -0xA5EB 0x03BB #GREEK SMALL LETTER LAMDA -0xA5EC 0x03BC #GREEK SMALL LETTER MU -0xA5ED 0x03BD #GREEK SMALL LETTER NU -0xA5EE 0x03BE #GREEK SMALL LETTER XI -0xA5EF 0x03BF #GREEK SMALL LETTER OMICRON -0xA5F0 0x03C0 #GREEK SMALL LETTER PI -0xA5F1 0x03C1 #GREEK SMALL LETTER RHO -0xA5F2 0x03C3 #GREEK SMALL LETTER SIGMA -0xA5F3 0x03C4 #GREEK SMALL LETTER TAU -0xA5F4 0x03C5 #GREEK SMALL LETTER UPSILON -0xA5F5 0x03C6 #GREEK SMALL LETTER PHI -0xA5F6 0x03C7 #GREEK SMALL LETTER CHI -0xA5F7 0x03C8 #GREEK SMALL LETTER PSI -0xA5F8 0x03C9 #GREEK SMALL LETTER OMEGA -0xA641 0xCAA8 #HANGUL SYLLABLE SSANGCIEUC YE RIEUL -0xA642 0xCAA9 #HANGUL SYLLABLE SSANGCIEUC YE RIEULKIYEOK -0xA643 0xCAAA #HANGUL SYLLABLE SSANGCIEUC YE RIEULMIEUM -0xA644 0xCAAB #HANGUL SYLLABLE SSANGCIEUC YE RIEULPIEUP -0xA645 0xCAAC #HANGUL SYLLABLE SSANGCIEUC YE RIEULSIOS -0xA646 0xCAAD #HANGUL SYLLABLE SSANGCIEUC YE RIEULTHIEUTH -0xA647 0xCAAE #HANGUL SYLLABLE SSANGCIEUC YE RIEULPHIEUPH -0xA648 0xCAAF #HANGUL SYLLABLE SSANGCIEUC YE RIEULHIEUH -0xA649 0xCAB0 #HANGUL SYLLABLE SSANGCIEUC YE MIEUM -0xA64A 0xCAB1 #HANGUL SYLLABLE SSANGCIEUC YE PIEUP -0xA64B 0xCAB2 #HANGUL SYLLABLE SSANGCIEUC YE PIEUPSIOS -0xA64C 0xCAB3 #HANGUL SYLLABLE SSANGCIEUC YE SIOS -0xA64D 0xCAB4 #HANGUL SYLLABLE SSANGCIEUC YE SSANGSIOS -0xA64E 0xCAB5 #HANGUL SYLLABLE SSANGCIEUC YE IEUNG -0xA64F 0xCAB6 #HANGUL SYLLABLE SSANGCIEUC YE CIEUC -0xA650 0xCAB7 #HANGUL SYLLABLE SSANGCIEUC YE CHIEUCH -0xA651 0xCAB8 #HANGUL SYLLABLE SSANGCIEUC YE KHIEUKH -0xA652 0xCAB9 #HANGUL SYLLABLE SSANGCIEUC YE THIEUTH -0xA653 0xCABA #HANGUL SYLLABLE SSANGCIEUC YE PHIEUPH -0xA654 0xCABB #HANGUL SYLLABLE SSANGCIEUC YE HIEUH -0xA655 0xCABE #HANGUL SYLLABLE SSANGCIEUC O SSANGKIYEOK -0xA656 0xCABF #HANGUL SYLLABLE SSANGCIEUC O KIYEOKSIOS -0xA657 0xCAC1 #HANGUL SYLLABLE SSANGCIEUC O NIEUNCIEUC -0xA658 0xCAC2 #HANGUL SYLLABLE SSANGCIEUC O NIEUNHIEUH -0xA659 0xCAC3 #HANGUL SYLLABLE SSANGCIEUC O TIKEUT -0xA65A 0xCAC5 #HANGUL SYLLABLE SSANGCIEUC O RIEULKIYEOK -0xA661 0xCAC6 #HANGUL SYLLABLE SSANGCIEUC O RIEULMIEUM -0xA662 0xCAC7 #HANGUL SYLLABLE SSANGCIEUC O RIEULPIEUP -0xA663 0xCAC8 #HANGUL SYLLABLE SSANGCIEUC O RIEULSIOS -0xA664 0xCAC9 #HANGUL SYLLABLE SSANGCIEUC O RIEULTHIEUTH -0xA665 0xCACA #HANGUL SYLLABLE SSANGCIEUC O RIEULPHIEUPH -0xA666 0xCACB #HANGUL SYLLABLE SSANGCIEUC O RIEULHIEUH -0xA667 0xCACE #HANGUL SYLLABLE SSANGCIEUC O PIEUPSIOS -0xA668 0xCAD0 #HANGUL SYLLABLE SSANGCIEUC O SSANGSIOS -0xA669 0xCAD2 #HANGUL SYLLABLE SSANGCIEUC O CIEUC -0xA66A 0xCAD4 #HANGUL SYLLABLE SSANGCIEUC O KHIEUKH -0xA66B 0xCAD5 #HANGUL SYLLABLE SSANGCIEUC O THIEUTH -0xA66C 0xCAD6 #HANGUL SYLLABLE SSANGCIEUC O PHIEUPH -0xA66D 0xCAD7 #HANGUL SYLLABLE SSANGCIEUC O HIEUH -0xA66E 0xCADA #HANGUL SYLLABLE SSANGCIEUC WA SSANGKIYEOK -0xA66F 0xCADB #HANGUL SYLLABLE SSANGCIEUC WA KIYEOKSIOS -0xA670 0xCADC #HANGUL SYLLABLE SSANGCIEUC WA NIEUN -0xA671 0xCADD #HANGUL SYLLABLE SSANGCIEUC WA NIEUNCIEUC -0xA672 0xCADE #HANGUL SYLLABLE SSANGCIEUC WA NIEUNHIEUH -0xA673 0xCADF #HANGUL SYLLABLE SSANGCIEUC WA TIKEUT -0xA674 0xCAE1 #HANGUL SYLLABLE SSANGCIEUC WA RIEULKIYEOK -0xA675 0xCAE2 #HANGUL SYLLABLE SSANGCIEUC WA RIEULMIEUM -0xA676 0xCAE3 #HANGUL SYLLABLE SSANGCIEUC WA RIEULPIEUP -0xA677 0xCAE4 #HANGUL SYLLABLE SSANGCIEUC WA RIEULSIOS -0xA678 0xCAE5 #HANGUL SYLLABLE SSANGCIEUC WA RIEULTHIEUTH -0xA679 0xCAE6 #HANGUL SYLLABLE SSANGCIEUC WA RIEULPHIEUPH -0xA67A 0xCAE7 #HANGUL SYLLABLE SSANGCIEUC WA RIEULHIEUH -0xA681 0xCAE8 #HANGUL SYLLABLE SSANGCIEUC WA MIEUM -0xA682 0xCAE9 #HANGUL SYLLABLE SSANGCIEUC WA PIEUP -0xA683 0xCAEA #HANGUL SYLLABLE SSANGCIEUC WA PIEUPSIOS -0xA684 0xCAEB #HANGUL SYLLABLE SSANGCIEUC WA SIOS -0xA685 0xCAED #HANGUL SYLLABLE SSANGCIEUC WA IEUNG -0xA686 0xCAEE #HANGUL SYLLABLE SSANGCIEUC WA CIEUC -0xA687 0xCAEF #HANGUL SYLLABLE SSANGCIEUC WA CHIEUCH -0xA688 0xCAF0 #HANGUL SYLLABLE SSANGCIEUC WA KHIEUKH -0xA689 0xCAF1 #HANGUL SYLLABLE SSANGCIEUC WA THIEUTH -0xA68A 0xCAF2 #HANGUL SYLLABLE SSANGCIEUC WA PHIEUPH -0xA68B 0xCAF3 #HANGUL SYLLABLE SSANGCIEUC WA HIEUH -0xA68C 0xCAF5 #HANGUL SYLLABLE SSANGCIEUC WAE KIYEOK -0xA68D 0xCAF6 #HANGUL SYLLABLE SSANGCIEUC WAE SSANGKIYEOK -0xA68E 0xCAF7 #HANGUL SYLLABLE SSANGCIEUC WAE KIYEOKSIOS -0xA68F 0xCAF8 #HANGUL SYLLABLE SSANGCIEUC WAE NIEUN -0xA690 0xCAF9 #HANGUL SYLLABLE SSANGCIEUC WAE NIEUNCIEUC -0xA691 0xCAFA #HANGUL SYLLABLE SSANGCIEUC WAE NIEUNHIEUH -0xA692 0xCAFB #HANGUL SYLLABLE SSANGCIEUC WAE TIKEUT -0xA693 0xCAFC #HANGUL SYLLABLE SSANGCIEUC WAE RIEUL -0xA694 0xCAFD #HANGUL SYLLABLE SSANGCIEUC WAE RIEULKIYEOK -0xA695 0xCAFE #HANGUL SYLLABLE SSANGCIEUC WAE RIEULMIEUM -0xA696 0xCAFF #HANGUL SYLLABLE SSANGCIEUC WAE RIEULPIEUP -0xA697 0xCB00 #HANGUL SYLLABLE SSANGCIEUC WAE RIEULSIOS -0xA698 0xCB01 #HANGUL SYLLABLE SSANGCIEUC WAE RIEULTHIEUTH -0xA699 0xCB02 #HANGUL SYLLABLE SSANGCIEUC WAE RIEULPHIEUPH -0xA69A 0xCB03 #HANGUL SYLLABLE SSANGCIEUC WAE RIEULHIEUH -0xA69B 0xCB04 #HANGUL SYLLABLE SSANGCIEUC WAE MIEUM -0xA69C 0xCB05 #HANGUL SYLLABLE SSANGCIEUC WAE PIEUP -0xA69D 0xCB06 #HANGUL SYLLABLE SSANGCIEUC WAE PIEUPSIOS -0xA69E 0xCB07 #HANGUL SYLLABLE SSANGCIEUC WAE SIOS -0xA69F 0xCB09 #HANGUL SYLLABLE SSANGCIEUC WAE IEUNG -0xA6A0 0xCB0A #HANGUL SYLLABLE SSANGCIEUC WAE CIEUC -0xA6A1 0x2500 #BOX DRAWINGS LIGHT HORIZONTAL -0xA6A2 0x2502 #BOX DRAWINGS LIGHT VERTICAL -0xA6A3 0x250C #BOX DRAWINGS LIGHT DOWN AND RIGHT -0xA6A4 0x2510 #BOX DRAWINGS LIGHT DOWN AND LEFT -0xA6A5 0x2518 #BOX DRAWINGS LIGHT UP AND LEFT -0xA6A6 0x2514 #BOX DRAWINGS LIGHT UP AND RIGHT -0xA6A7 0x251C #BOX DRAWINGS LIGHT VERTICAL AND RIGHT -0xA6A8 0x252C #BOX DRAWINGS LIGHT DOWN AND HORIZONTAL -0xA6A9 0x2524 #BOX DRAWINGS LIGHT VERTICAL AND LEFT -0xA6AA 0x2534 #BOX DRAWINGS LIGHT UP AND HORIZONTAL -0xA6AB 0x253C #BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL -0xA6AC 0x2501 #BOX DRAWINGS HEAVY HORIZONTAL -0xA6AD 0x2503 #BOX DRAWINGS HEAVY VERTICAL -0xA6AE 0x250F #BOX DRAWINGS HEAVY DOWN AND RIGHT -0xA6AF 0x2513 #BOX DRAWINGS HEAVY DOWN AND LEFT -0xA6B0 0x251B #BOX DRAWINGS HEAVY UP AND LEFT -0xA6B1 0x2517 #BOX DRAWINGS HEAVY UP AND RIGHT -0xA6B2 0x2523 #BOX DRAWINGS HEAVY VERTICAL AND RIGHT -0xA6B3 0x2533 #BOX DRAWINGS HEAVY DOWN AND HORIZONTAL -0xA6B4 0x252B #BOX DRAWINGS HEAVY VERTICAL AND LEFT -0xA6B5 0x253B #BOX DRAWINGS HEAVY UP AND HORIZONTAL -0xA6B6 0x254B #BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL -0xA6B7 0x2520 #BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT -0xA6B8 0x252F #BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY -0xA6B9 0x2528 #BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT -0xA6BA 0x2537 #BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY -0xA6BB 0x253F #BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY -0xA6BC 0x251D #BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY -0xA6BD 0x2530 #BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT -0xA6BE 0x2525 #BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY -0xA6BF 0x2538 #BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT -0xA6C0 0x2542 #BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT -0xA6C1 0x2512 #BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT -0xA6C2 0x2511 #BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY -0xA6C3 0x251A #BOX DRAWINGS UP HEAVY AND LEFT LIGHT -0xA6C4 0x2519 #BOX DRAWINGS UP LIGHT AND LEFT HEAVY -0xA6C5 0x2516 #BOX DRAWINGS UP HEAVY AND RIGHT LIGHT -0xA6C6 0x2515 #BOX DRAWINGS UP LIGHT AND RIGHT HEAVY -0xA6C7 0x250E #BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT -0xA6C8 0x250D #BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY -0xA6C9 0x251E #BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT -0xA6CA 0x251F #BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT -0xA6CB 0x2521 #BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY -0xA6CC 0x2522 #BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY -0xA6CD 0x2526 #BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT -0xA6CE 0x2527 #BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT -0xA6CF 0x2529 #BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY -0xA6D0 0x252A #BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY -0xA6D1 0x252D #BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT -0xA6D2 0x252E #BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT -0xA6D3 0x2531 #BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY -0xA6D4 0x2532 #BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY -0xA6D5 0x2535 #BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT -0xA6D6 0x2536 #BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT -0xA6D7 0x2539 #BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY -0xA6D8 0x253A #BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY -0xA6D9 0x253D #BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT -0xA6DA 0x253E #BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT -0xA6DB 0x2540 #BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT -0xA6DC 0x2541 #BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT -0xA6DD 0x2543 #BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT -0xA6DE 0x2544 #BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT -0xA6DF 0x2545 #BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT -0xA6E0 0x2546 #BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT -0xA6E1 0x2547 #BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY -0xA6E2 0x2548 #BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY -0xA6E3 0x2549 #BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY -0xA6E4 0x254A #BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY -0xA741 0xCB0B #HANGUL SYLLABLE SSANGCIEUC WAE CHIEUCH -0xA742 0xCB0C #HANGUL SYLLABLE SSANGCIEUC WAE KHIEUKH -0xA743 0xCB0D #HANGUL SYLLABLE SSANGCIEUC WAE THIEUTH -0xA744 0xCB0E #HANGUL SYLLABLE SSANGCIEUC WAE PHIEUPH -0xA745 0xCB0F #HANGUL SYLLABLE SSANGCIEUC WAE HIEUH -0xA746 0xCB11 #HANGUL SYLLABLE SSANGCIEUC OE KIYEOK -0xA747 0xCB12 #HANGUL SYLLABLE SSANGCIEUC OE SSANGKIYEOK -0xA748 0xCB13 #HANGUL SYLLABLE SSANGCIEUC OE KIYEOKSIOS -0xA749 0xCB15 #HANGUL SYLLABLE SSANGCIEUC OE NIEUNCIEUC -0xA74A 0xCB16 #HANGUL SYLLABLE SSANGCIEUC OE NIEUNHIEUH -0xA74B 0xCB17 #HANGUL SYLLABLE SSANGCIEUC OE TIKEUT -0xA74C 0xCB19 #HANGUL SYLLABLE SSANGCIEUC OE RIEULKIYEOK -0xA74D 0xCB1A #HANGUL SYLLABLE SSANGCIEUC OE RIEULMIEUM -0xA74E 0xCB1B #HANGUL SYLLABLE SSANGCIEUC OE RIEULPIEUP -0xA74F 0xCB1C #HANGUL SYLLABLE SSANGCIEUC OE RIEULSIOS -0xA750 0xCB1D #HANGUL SYLLABLE SSANGCIEUC OE RIEULTHIEUTH -0xA751 0xCB1E #HANGUL SYLLABLE SSANGCIEUC OE RIEULPHIEUPH -0xA752 0xCB1F #HANGUL SYLLABLE SSANGCIEUC OE RIEULHIEUH -0xA753 0xCB22 #HANGUL SYLLABLE SSANGCIEUC OE PIEUPSIOS -0xA754 0xCB23 #HANGUL SYLLABLE SSANGCIEUC OE SIOS -0xA755 0xCB24 #HANGUL SYLLABLE SSANGCIEUC OE SSANGSIOS -0xA756 0xCB25 #HANGUL SYLLABLE SSANGCIEUC OE IEUNG -0xA757 0xCB26 #HANGUL SYLLABLE SSANGCIEUC OE CIEUC -0xA758 0xCB27 #HANGUL SYLLABLE SSANGCIEUC OE CHIEUCH -0xA759 0xCB28 #HANGUL SYLLABLE SSANGCIEUC OE KHIEUKH -0xA75A 0xCB29 #HANGUL SYLLABLE SSANGCIEUC OE THIEUTH -0xA761 0xCB2A #HANGUL SYLLABLE SSANGCIEUC OE PHIEUPH -0xA762 0xCB2B #HANGUL SYLLABLE SSANGCIEUC OE HIEUH -0xA763 0xCB2C #HANGUL SYLLABLE SSANGCIEUC YO -0xA764 0xCB2D #HANGUL SYLLABLE SSANGCIEUC YO KIYEOK -0xA765 0xCB2E #HANGUL SYLLABLE SSANGCIEUC YO SSANGKIYEOK -0xA766 0xCB2F #HANGUL SYLLABLE SSANGCIEUC YO KIYEOKSIOS -0xA767 0xCB30 #HANGUL SYLLABLE SSANGCIEUC YO NIEUN -0xA768 0xCB31 #HANGUL SYLLABLE SSANGCIEUC YO NIEUNCIEUC -0xA769 0xCB32 #HANGUL SYLLABLE SSANGCIEUC YO NIEUNHIEUH -0xA76A 0xCB33 #HANGUL SYLLABLE SSANGCIEUC YO TIKEUT -0xA76B 0xCB34 #HANGUL SYLLABLE SSANGCIEUC YO RIEUL -0xA76C 0xCB35 #HANGUL SYLLABLE SSANGCIEUC YO RIEULKIYEOK -0xA76D 0xCB36 #HANGUL SYLLABLE SSANGCIEUC YO RIEULMIEUM -0xA76E 0xCB37 #HANGUL SYLLABLE SSANGCIEUC YO RIEULPIEUP -0xA76F 0xCB38 #HANGUL SYLLABLE SSANGCIEUC YO RIEULSIOS -0xA770 0xCB39 #HANGUL SYLLABLE SSANGCIEUC YO RIEULTHIEUTH -0xA771 0xCB3A #HANGUL SYLLABLE SSANGCIEUC YO RIEULPHIEUPH -0xA772 0xCB3B #HANGUL SYLLABLE SSANGCIEUC YO RIEULHIEUH -0xA773 0xCB3C #HANGUL SYLLABLE SSANGCIEUC YO MIEUM -0xA774 0xCB3D #HANGUL SYLLABLE SSANGCIEUC YO PIEUP -0xA775 0xCB3E #HANGUL SYLLABLE SSANGCIEUC YO PIEUPSIOS -0xA776 0xCB3F #HANGUL SYLLABLE SSANGCIEUC YO SIOS -0xA777 0xCB40 #HANGUL SYLLABLE SSANGCIEUC YO SSANGSIOS -0xA778 0xCB42 #HANGUL SYLLABLE SSANGCIEUC YO CIEUC -0xA779 0xCB43 #HANGUL SYLLABLE SSANGCIEUC YO CHIEUCH -0xA77A 0xCB44 #HANGUL SYLLABLE SSANGCIEUC YO KHIEUKH -0xA781 0xCB45 #HANGUL SYLLABLE SSANGCIEUC YO THIEUTH -0xA782 0xCB46 #HANGUL SYLLABLE SSANGCIEUC YO PHIEUPH -0xA783 0xCB47 #HANGUL SYLLABLE SSANGCIEUC YO HIEUH -0xA784 0xCB4A #HANGUL SYLLABLE SSANGCIEUC U SSANGKIYEOK -0xA785 0xCB4B #HANGUL SYLLABLE SSANGCIEUC U KIYEOKSIOS -0xA786 0xCB4D #HANGUL SYLLABLE SSANGCIEUC U NIEUNCIEUC -0xA787 0xCB4E #HANGUL SYLLABLE SSANGCIEUC U NIEUNHIEUH -0xA788 0xCB4F #HANGUL SYLLABLE SSANGCIEUC U TIKEUT -0xA789 0xCB51 #HANGUL SYLLABLE SSANGCIEUC U RIEULKIYEOK -0xA78A 0xCB52 #HANGUL SYLLABLE SSANGCIEUC U RIEULMIEUM -0xA78B 0xCB53 #HANGUL SYLLABLE SSANGCIEUC U RIEULPIEUP -0xA78C 0xCB54 #HANGUL SYLLABLE SSANGCIEUC U RIEULSIOS -0xA78D 0xCB55 #HANGUL SYLLABLE SSANGCIEUC U RIEULTHIEUTH -0xA78E 0xCB56 #HANGUL SYLLABLE SSANGCIEUC U RIEULPHIEUPH -0xA78F 0xCB57 #HANGUL SYLLABLE SSANGCIEUC U RIEULHIEUH -0xA790 0xCB5A #HANGUL SYLLABLE SSANGCIEUC U PIEUPSIOS -0xA791 0xCB5B #HANGUL SYLLABLE SSANGCIEUC U SIOS -0xA792 0xCB5C #HANGUL SYLLABLE SSANGCIEUC U SSANGSIOS -0xA793 0xCB5E #HANGUL SYLLABLE SSANGCIEUC U CIEUC -0xA794 0xCB5F #HANGUL SYLLABLE SSANGCIEUC U CHIEUCH -0xA795 0xCB60 #HANGUL SYLLABLE SSANGCIEUC U KHIEUKH -0xA796 0xCB61 #HANGUL SYLLABLE SSANGCIEUC U THIEUTH -0xA797 0xCB62 #HANGUL SYLLABLE SSANGCIEUC U PHIEUPH -0xA798 0xCB63 #HANGUL SYLLABLE SSANGCIEUC U HIEUH -0xA799 0xCB65 #HANGUL SYLLABLE SSANGCIEUC WEO KIYEOK -0xA79A 0xCB66 #HANGUL SYLLABLE SSANGCIEUC WEO SSANGKIYEOK -0xA79B 0xCB67 #HANGUL SYLLABLE SSANGCIEUC WEO KIYEOKSIOS -0xA79C 0xCB68 #HANGUL SYLLABLE SSANGCIEUC WEO NIEUN -0xA79D 0xCB69 #HANGUL SYLLABLE SSANGCIEUC WEO NIEUNCIEUC -0xA79E 0xCB6A #HANGUL SYLLABLE SSANGCIEUC WEO NIEUNHIEUH -0xA79F 0xCB6B #HANGUL SYLLABLE SSANGCIEUC WEO TIKEUT -0xA7A0 0xCB6C #HANGUL SYLLABLE SSANGCIEUC WEO RIEUL -0xA7A1 0x3395 #SQUARE MU L -0xA7A2 0x3396 #SQUARE ML -0xA7A3 0x3397 #SQUARE DL -0xA7A4 0x2113 #SCRIPT SMALL L -0xA7A5 0x3398 #SQUARE KL -0xA7A6 0x33C4 #SQUARE CC -0xA7A7 0x33A3 #SQUARE MM CUBED -0xA7A8 0x33A4 #SQUARE CM CUBED -0xA7A9 0x33A5 #SQUARE M CUBED -0xA7AA 0x33A6 #SQUARE KM CUBED -0xA7AB 0x3399 #SQUARE FM -0xA7AC 0x339A #SQUARE NM -0xA7AD 0x339B #SQUARE MU M -0xA7AE 0x339C #SQUARE MM -0xA7AF 0x339D #SQUARE CM -0xA7B0 0x339E #SQUARE KM -0xA7B1 0x339F #SQUARE MM SQUARED -0xA7B2 0x33A0 #SQUARE CM SQUARED -0xA7B3 0x33A1 #SQUARE M SQUARED -0xA7B4 0x33A2 #SQUARE KM SQUARED -0xA7B5 0x33CA #SQUARE HA -0xA7B6 0x338D #SQUARE MU G -0xA7B7 0x338E #SQUARE MG -0xA7B8 0x338F #SQUARE KG -0xA7B9 0x33CF #SQUARE KT -0xA7BA 0x3388 #SQUARE CAL -0xA7BB 0x3389 #SQUARE KCAL -0xA7BC 0x33C8 #SQUARE DB -0xA7BD 0x33A7 #SQUARE M OVER S -0xA7BE 0x33A8 #SQUARE M OVER S SQUARED -0xA7BF 0x33B0 #SQUARE PS -0xA7C0 0x33B1 #SQUARE NS -0xA7C1 0x33B2 #SQUARE MU S -0xA7C2 0x33B3 #SQUARE MS -0xA7C3 0x33B4 #SQUARE PV -0xA7C4 0x33B5 #SQUARE NV -0xA7C5 0x33B6 #SQUARE MU V -0xA7C6 0x33B7 #SQUARE MV -0xA7C7 0x33B8 #SQUARE KV -0xA7C8 0x33B9 #SQUARE MV MEGA -0xA7C9 0x3380 #SQUARE PA AMPS -0xA7CA 0x3381 #SQUARE NA -0xA7CB 0x3382 #SQUARE MU A -0xA7CC 0x3383 #SQUARE MA -0xA7CD 0x3384 #SQUARE KA -0xA7CE 0x33BA #SQUARE PW -0xA7CF 0x33BB #SQUARE NW -0xA7D0 0x33BC #SQUARE MU W -0xA7D1 0x33BD #SQUARE MW -0xA7D2 0x33BE #SQUARE KW -0xA7D3 0x33BF #SQUARE MW MEGA -0xA7D4 0x3390 #SQUARE HZ -0xA7D5 0x3391 #SQUARE KHZ -0xA7D6 0x3392 #SQUARE MHZ -0xA7D7 0x3393 #SQUARE GHZ -0xA7D8 0x3394 #SQUARE THZ -0xA7D9 0x2126 #OHM SIGN -0xA7DA 0x33C0 #SQUARE K OHM -0xA7DB 0x33C1 #SQUARE M OHM -0xA7DC 0x338A #SQUARE PF -0xA7DD 0x338B #SQUARE NF -0xA7DE 0x338C #SQUARE MU F -0xA7DF 0x33D6 #SQUARE MOL -0xA7E0 0x33C5 #SQUARE CD -0xA7E1 0x33AD #SQUARE RAD -0xA7E2 0x33AE #SQUARE RAD OVER S -0xA7E3 0x33AF #SQUARE RAD OVER S SQUARED -0xA7E4 0x33DB #SQUARE SR -0xA7E5 0x33A9 #SQUARE PA -0xA7E6 0x33AA #SQUARE KPA -0xA7E7 0x33AB #SQUARE MPA -0xA7E8 0x33AC #SQUARE GPA -0xA7E9 0x33DD #SQUARE WB -0xA7EA 0x33D0 #SQUARE LM -0xA7EB 0x33D3 #SQUARE LX -0xA7EC 0x33C3 #SQUARE BQ -0xA7ED 0x33C9 #SQUARE GY -0xA7EE 0x33DC #SQUARE SV -0xA7EF 0x33C6 #SQUARE C OVER KG -0xA841 0xCB6D #HANGUL SYLLABLE SSANGCIEUC WEO RIEULKIYEOK -0xA842 0xCB6E #HANGUL SYLLABLE SSANGCIEUC WEO RIEULMIEUM -0xA843 0xCB6F #HANGUL SYLLABLE SSANGCIEUC WEO RIEULPIEUP -0xA844 0xCB70 #HANGUL SYLLABLE SSANGCIEUC WEO RIEULSIOS -0xA845 0xCB71 #HANGUL SYLLABLE SSANGCIEUC WEO RIEULTHIEUTH -0xA846 0xCB72 #HANGUL SYLLABLE SSANGCIEUC WEO RIEULPHIEUPH -0xA847 0xCB73 #HANGUL SYLLABLE SSANGCIEUC WEO RIEULHIEUH -0xA848 0xCB74 #HANGUL SYLLABLE SSANGCIEUC WEO MIEUM -0xA849 0xCB75 #HANGUL SYLLABLE SSANGCIEUC WEO PIEUP -0xA84A 0xCB76 #HANGUL SYLLABLE SSANGCIEUC WEO PIEUPSIOS -0xA84B 0xCB77 #HANGUL SYLLABLE SSANGCIEUC WEO SIOS -0xA84C 0xCB7A #HANGUL SYLLABLE SSANGCIEUC WEO CIEUC -0xA84D 0xCB7B #HANGUL SYLLABLE SSANGCIEUC WEO CHIEUCH -0xA84E 0xCB7C #HANGUL SYLLABLE SSANGCIEUC WEO KHIEUKH -0xA84F 0xCB7D #HANGUL SYLLABLE SSANGCIEUC WEO THIEUTH -0xA850 0xCB7E #HANGUL SYLLABLE SSANGCIEUC WEO PHIEUPH -0xA851 0xCB7F #HANGUL SYLLABLE SSANGCIEUC WEO HIEUH -0xA852 0xCB80 #HANGUL SYLLABLE SSANGCIEUC WE -0xA853 0xCB81 #HANGUL SYLLABLE SSANGCIEUC WE KIYEOK -0xA854 0xCB82 #HANGUL SYLLABLE SSANGCIEUC WE SSANGKIYEOK -0xA855 0xCB83 #HANGUL SYLLABLE SSANGCIEUC WE KIYEOKSIOS -0xA856 0xCB84 #HANGUL SYLLABLE SSANGCIEUC WE NIEUN -0xA857 0xCB85 #HANGUL SYLLABLE SSANGCIEUC WE NIEUNCIEUC -0xA858 0xCB86 #HANGUL SYLLABLE SSANGCIEUC WE NIEUNHIEUH -0xA859 0xCB87 #HANGUL SYLLABLE SSANGCIEUC WE TIKEUT -0xA85A 0xCB88 #HANGUL SYLLABLE SSANGCIEUC WE RIEUL -0xA861 0xCB89 #HANGUL SYLLABLE SSANGCIEUC WE RIEULKIYEOK -0xA862 0xCB8A #HANGUL SYLLABLE SSANGCIEUC WE RIEULMIEUM -0xA863 0xCB8B #HANGUL SYLLABLE SSANGCIEUC WE RIEULPIEUP -0xA864 0xCB8C #HANGUL SYLLABLE SSANGCIEUC WE RIEULSIOS -0xA865 0xCB8D #HANGUL SYLLABLE SSANGCIEUC WE RIEULTHIEUTH -0xA866 0xCB8E #HANGUL SYLLABLE SSANGCIEUC WE RIEULPHIEUPH -0xA867 0xCB8F #HANGUL SYLLABLE SSANGCIEUC WE RIEULHIEUH -0xA868 0xCB90 #HANGUL SYLLABLE SSANGCIEUC WE MIEUM -0xA869 0xCB91 #HANGUL SYLLABLE SSANGCIEUC WE PIEUP -0xA86A 0xCB92 #HANGUL SYLLABLE SSANGCIEUC WE PIEUPSIOS -0xA86B 0xCB93 #HANGUL SYLLABLE SSANGCIEUC WE SIOS -0xA86C 0xCB94 #HANGUL SYLLABLE SSANGCIEUC WE SSANGSIOS -0xA86D 0xCB95 #HANGUL SYLLABLE SSANGCIEUC WE IEUNG -0xA86E 0xCB96 #HANGUL SYLLABLE SSANGCIEUC WE CIEUC -0xA86F 0xCB97 #HANGUL SYLLABLE SSANGCIEUC WE CHIEUCH -0xA870 0xCB98 #HANGUL SYLLABLE SSANGCIEUC WE KHIEUKH -0xA871 0xCB99 #HANGUL SYLLABLE SSANGCIEUC WE THIEUTH -0xA872 0xCB9A #HANGUL SYLLABLE SSANGCIEUC WE PHIEUPH -0xA873 0xCB9B #HANGUL SYLLABLE SSANGCIEUC WE HIEUH -0xA874 0xCB9D #HANGUL SYLLABLE SSANGCIEUC WI KIYEOK -0xA875 0xCB9E #HANGUL SYLLABLE SSANGCIEUC WI SSANGKIYEOK -0xA876 0xCB9F #HANGUL SYLLABLE SSANGCIEUC WI KIYEOKSIOS -0xA877 0xCBA0 #HANGUL SYLLABLE SSANGCIEUC WI NIEUN -0xA878 0xCBA1 #HANGUL SYLLABLE SSANGCIEUC WI NIEUNCIEUC -0xA879 0xCBA2 #HANGUL SYLLABLE SSANGCIEUC WI NIEUNHIEUH -0xA87A 0xCBA3 #HANGUL SYLLABLE SSANGCIEUC WI TIKEUT -0xA881 0xCBA4 #HANGUL SYLLABLE SSANGCIEUC WI RIEUL -0xA882 0xCBA5 #HANGUL SYLLABLE SSANGCIEUC WI RIEULKIYEOK -0xA883 0xCBA6 #HANGUL SYLLABLE SSANGCIEUC WI RIEULMIEUM -0xA884 0xCBA7 #HANGUL SYLLABLE SSANGCIEUC WI RIEULPIEUP -0xA885 0xCBA8 #HANGUL SYLLABLE SSANGCIEUC WI RIEULSIOS -0xA886 0xCBA9 #HANGUL SYLLABLE SSANGCIEUC WI RIEULTHIEUTH -0xA887 0xCBAA #HANGUL SYLLABLE SSANGCIEUC WI RIEULPHIEUPH -0xA888 0xCBAB #HANGUL SYLLABLE SSANGCIEUC WI RIEULHIEUH -0xA889 0xCBAC #HANGUL SYLLABLE SSANGCIEUC WI MIEUM -0xA88A 0xCBAD #HANGUL SYLLABLE SSANGCIEUC WI PIEUP -0xA88B 0xCBAE #HANGUL SYLLABLE SSANGCIEUC WI PIEUPSIOS -0xA88C 0xCBAF #HANGUL SYLLABLE SSANGCIEUC WI SIOS -0xA88D 0xCBB0 #HANGUL SYLLABLE SSANGCIEUC WI SSANGSIOS -0xA88E 0xCBB1 #HANGUL SYLLABLE SSANGCIEUC WI IEUNG -0xA88F 0xCBB2 #HANGUL SYLLABLE SSANGCIEUC WI CIEUC -0xA890 0xCBB3 #HANGUL SYLLABLE SSANGCIEUC WI CHIEUCH -0xA891 0xCBB4 #HANGUL SYLLABLE SSANGCIEUC WI KHIEUKH -0xA892 0xCBB5 #HANGUL SYLLABLE SSANGCIEUC WI THIEUTH -0xA893 0xCBB6 #HANGUL SYLLABLE SSANGCIEUC WI PHIEUPH -0xA894 0xCBB7 #HANGUL SYLLABLE SSANGCIEUC WI HIEUH -0xA895 0xCBB9 #HANGUL SYLLABLE SSANGCIEUC YU KIYEOK -0xA896 0xCBBA #HANGUL SYLLABLE SSANGCIEUC YU SSANGKIYEOK -0xA897 0xCBBB #HANGUL SYLLABLE SSANGCIEUC YU KIYEOKSIOS -0xA898 0xCBBC #HANGUL SYLLABLE SSANGCIEUC YU NIEUN -0xA899 0xCBBD #HANGUL SYLLABLE SSANGCIEUC YU NIEUNCIEUC -0xA89A 0xCBBE #HANGUL SYLLABLE SSANGCIEUC YU NIEUNHIEUH -0xA89B 0xCBBF #HANGUL SYLLABLE SSANGCIEUC YU TIKEUT -0xA89C 0xCBC0 #HANGUL SYLLABLE SSANGCIEUC YU RIEUL -0xA89D 0xCBC1 #HANGUL SYLLABLE SSANGCIEUC YU RIEULKIYEOK -0xA89E 0xCBC2 #HANGUL SYLLABLE SSANGCIEUC YU RIEULMIEUM -0xA89F 0xCBC3 #HANGUL SYLLABLE SSANGCIEUC YU RIEULPIEUP -0xA8A0 0xCBC4 #HANGUL SYLLABLE SSANGCIEUC YU RIEULSIOS -0xA8A1 0x00C6 #LATIN CAPITAL LETTER AE -0xA8A2 0x00D0 #LATIN CAPITAL LETTER ETH -0xA8A3 0x00AA #FEMININE ORDINAL INDICATOR -0xA8A4 0x0126 #LATIN CAPITAL LETTER H WITH STROKE -0xA8A6 0x0132 #LATIN CAPITAL LIGATURE IJ -0xA8A8 0x013F #LATIN CAPITAL LETTER L WITH MIDDLE DOT -0xA8A9 0x0141 #LATIN CAPITAL LETTER L WITH STROKE -0xA8AA 0x00D8 #LATIN CAPITAL LETTER O WITH STROKE -0xA8AB 0x0152 #LATIN CAPITAL LIGATURE OE -0xA8AC 0x00BA #MASCULINE ORDINAL INDICATOR -0xA8AD 0x00DE #LATIN CAPITAL LETTER THORN -0xA8AE 0x0166 #LATIN CAPITAL LETTER T WITH STROKE -0xA8AF 0x014A #LATIN CAPITAL LETTER ENG -0xA8B1 0x3260 #CIRCLED HANGUL KIYEOK -0xA8B2 0x3261 #CIRCLED HANGUL NIEUN -0xA8B3 0x3262 #CIRCLED HANGUL TIKEUT -0xA8B4 0x3263 #CIRCLED HANGUL RIEUL -0xA8B5 0x3264 #CIRCLED HANGUL MIEUM -0xA8B6 0x3265 #CIRCLED HANGUL PIEUP -0xA8B7 0x3266 #CIRCLED HANGUL SIOS -0xA8B8 0x3267 #CIRCLED HANGUL IEUNG -0xA8B9 0x3268 #CIRCLED HANGUL CIEUC -0xA8BA 0x3269 #CIRCLED HANGUL CHIEUCH -0xA8BB 0x326A #CIRCLED HANGUL KHIEUKH -0xA8BC 0x326B #CIRCLED HANGUL THIEUTH -0xA8BD 0x326C #CIRCLED HANGUL PHIEUPH -0xA8BE 0x326D #CIRCLED HANGUL HIEUH -0xA8BF 0x326E #CIRCLED HANGUL KIYEOK A -0xA8C0 0x326F #CIRCLED HANGUL NIEUN A -0xA8C1 0x3270 #CIRCLED HANGUL TIKEUT A -0xA8C2 0x3271 #CIRCLED HANGUL RIEUL A -0xA8C3 0x3272 #CIRCLED HANGUL MIEUM A -0xA8C4 0x3273 #CIRCLED HANGUL PIEUP A -0xA8C5 0x3274 #CIRCLED HANGUL SIOS A -0xA8C6 0x3275 #CIRCLED HANGUL IEUNG A -0xA8C7 0x3276 #CIRCLED HANGUL CIEUC A -0xA8C8 0x3277 #CIRCLED HANGUL CHIEUCH A -0xA8C9 0x3278 #CIRCLED HANGUL KHIEUKH A -0xA8CA 0x3279 #CIRCLED HANGUL THIEUTH A -0xA8CB 0x327A #CIRCLED HANGUL PHIEUPH A -0xA8CC 0x327B #CIRCLED HANGUL HIEUH A -0xA8CD 0x24D0 #CIRCLED LATIN SMALL LETTER A -0xA8CE 0x24D1 #CIRCLED LATIN SMALL LETTER B -0xA8CF 0x24D2 #CIRCLED LATIN SMALL LETTER C -0xA8D0 0x24D3 #CIRCLED LATIN SMALL LETTER D -0xA8D1 0x24D4 #CIRCLED LATIN SMALL LETTER E -0xA8D2 0x24D5 #CIRCLED LATIN SMALL LETTER F -0xA8D3 0x24D6 #CIRCLED LATIN SMALL LETTER G -0xA8D4 0x24D7 #CIRCLED LATIN SMALL LETTER H -0xA8D5 0x24D8 #CIRCLED LATIN SMALL LETTER I -0xA8D6 0x24D9 #CIRCLED LATIN SMALL LETTER J -0xA8D7 0x24DA #CIRCLED LATIN SMALL LETTER K -0xA8D8 0x24DB #CIRCLED LATIN SMALL LETTER L -0xA8D9 0x24DC #CIRCLED LATIN SMALL LETTER M -0xA8DA 0x24DD #CIRCLED LATIN SMALL LETTER N -0xA8DB 0x24DE #CIRCLED LATIN SMALL LETTER O -0xA8DC 0x24DF #CIRCLED LATIN SMALL LETTER P -0xA8DD 0x24E0 #CIRCLED LATIN SMALL LETTER Q -0xA8DE 0x24E1 #CIRCLED LATIN SMALL LETTER R -0xA8DF 0x24E2 #CIRCLED LATIN SMALL LETTER S -0xA8E0 0x24E3 #CIRCLED LATIN SMALL LETTER T -0xA8E1 0x24E4 #CIRCLED LATIN SMALL LETTER U -0xA8E2 0x24E5 #CIRCLED LATIN SMALL LETTER V -0xA8E3 0x24E6 #CIRCLED LATIN SMALL LETTER W -0xA8E4 0x24E7 #CIRCLED LATIN SMALL LETTER X -0xA8E5 0x24E8 #CIRCLED LATIN SMALL LETTER Y -0xA8E6 0x24E9 #CIRCLED LATIN SMALL LETTER Z -0xA8E7 0x2460 #CIRCLED DIGIT ONE -0xA8E8 0x2461 #CIRCLED DIGIT TWO -0xA8E9 0x2462 #CIRCLED DIGIT THREE -0xA8EA 0x2463 #CIRCLED DIGIT FOUR -0xA8EB 0x2464 #CIRCLED DIGIT FIVE -0xA8EC 0x2465 #CIRCLED DIGIT SIX -0xA8ED 0x2466 #CIRCLED DIGIT SEVEN -0xA8EE 0x2467 #CIRCLED DIGIT EIGHT -0xA8EF 0x2468 #CIRCLED DIGIT NINE -0xA8F0 0x2469 #CIRCLED NUMBER TEN -0xA8F1 0x246A #CIRCLED NUMBER ELEVEN -0xA8F2 0x246B #CIRCLED NUMBER TWELVE -0xA8F3 0x246C #CIRCLED NUMBER THIRTEEN -0xA8F4 0x246D #CIRCLED NUMBER FOURTEEN -0xA8F5 0x246E #CIRCLED NUMBER FIFTEEN -0xA8F6 0x00BD #VULGAR FRACTION ONE HALF -0xA8F7 0x2153 #VULGAR FRACTION ONE THIRD -0xA8F8 0x2154 #VULGAR FRACTION TWO THIRDS -0xA8F9 0x00BC #VULGAR FRACTION ONE QUARTER -0xA8FA 0x00BE #VULGAR FRACTION THREE QUARTERS -0xA8FB 0x215B #VULGAR FRACTION ONE EIGHTH -0xA8FC 0x215C #VULGAR FRACTION THREE EIGHTHS -0xA8FD 0x215D #VULGAR FRACTION FIVE EIGHTHS -0xA8FE 0x215E #VULGAR FRACTION SEVEN EIGHTHS -0xA941 0xCBC5 #HANGUL SYLLABLE SSANGCIEUC YU RIEULTHIEUTH -0xA942 0xCBC6 #HANGUL SYLLABLE SSANGCIEUC YU RIEULPHIEUPH -0xA943 0xCBC7 #HANGUL SYLLABLE SSANGCIEUC YU RIEULHIEUH -0xA944 0xCBC8 #HANGUL SYLLABLE SSANGCIEUC YU MIEUM -0xA945 0xCBC9 #HANGUL SYLLABLE SSANGCIEUC YU PIEUP -0xA946 0xCBCA #HANGUL SYLLABLE SSANGCIEUC YU PIEUPSIOS -0xA947 0xCBCB #HANGUL SYLLABLE SSANGCIEUC YU SIOS -0xA948 0xCBCC #HANGUL SYLLABLE SSANGCIEUC YU SSANGSIOS -0xA949 0xCBCD #HANGUL SYLLABLE SSANGCIEUC YU IEUNG -0xA94A 0xCBCE #HANGUL SYLLABLE SSANGCIEUC YU CIEUC -0xA94B 0xCBCF #HANGUL SYLLABLE SSANGCIEUC YU CHIEUCH -0xA94C 0xCBD0 #HANGUL SYLLABLE SSANGCIEUC YU KHIEUKH -0xA94D 0xCBD1 #HANGUL SYLLABLE SSANGCIEUC YU THIEUTH -0xA94E 0xCBD2 #HANGUL SYLLABLE SSANGCIEUC YU PHIEUPH -0xA94F 0xCBD3 #HANGUL SYLLABLE SSANGCIEUC YU HIEUH -0xA950 0xCBD5 #HANGUL SYLLABLE SSANGCIEUC EU KIYEOK -0xA951 0xCBD6 #HANGUL SYLLABLE SSANGCIEUC EU SSANGKIYEOK -0xA952 0xCBD7 #HANGUL SYLLABLE SSANGCIEUC EU KIYEOKSIOS -0xA953 0xCBD8 #HANGUL SYLLABLE SSANGCIEUC EU NIEUN -0xA954 0xCBD9 #HANGUL SYLLABLE SSANGCIEUC EU NIEUNCIEUC -0xA955 0xCBDA #HANGUL SYLLABLE SSANGCIEUC EU NIEUNHIEUH -0xA956 0xCBDB #HANGUL SYLLABLE SSANGCIEUC EU TIKEUT -0xA957 0xCBDC #HANGUL SYLLABLE SSANGCIEUC EU RIEUL -0xA958 0xCBDD #HANGUL SYLLABLE SSANGCIEUC EU RIEULKIYEOK -0xA959 0xCBDE #HANGUL SYLLABLE SSANGCIEUC EU RIEULMIEUM -0xA95A 0xCBDF #HANGUL SYLLABLE SSANGCIEUC EU RIEULPIEUP -0xA961 0xCBE0 #HANGUL SYLLABLE SSANGCIEUC EU RIEULSIOS -0xA962 0xCBE1 #HANGUL SYLLABLE SSANGCIEUC EU RIEULTHIEUTH -0xA963 0xCBE2 #HANGUL SYLLABLE SSANGCIEUC EU RIEULPHIEUPH -0xA964 0xCBE3 #HANGUL SYLLABLE SSANGCIEUC EU RIEULHIEUH -0xA965 0xCBE5 #HANGUL SYLLABLE SSANGCIEUC EU PIEUP -0xA966 0xCBE6 #HANGUL SYLLABLE SSANGCIEUC EU PIEUPSIOS -0xA967 0xCBE8 #HANGUL SYLLABLE SSANGCIEUC EU SSANGSIOS -0xA968 0xCBEA #HANGUL SYLLABLE SSANGCIEUC EU CIEUC -0xA969 0xCBEB #HANGUL SYLLABLE SSANGCIEUC EU CHIEUCH -0xA96A 0xCBEC #HANGUL SYLLABLE SSANGCIEUC EU KHIEUKH -0xA96B 0xCBED #HANGUL SYLLABLE SSANGCIEUC EU THIEUTH -0xA96C 0xCBEE #HANGUL SYLLABLE SSANGCIEUC EU PHIEUPH -0xA96D 0xCBEF #HANGUL SYLLABLE SSANGCIEUC EU HIEUH -0xA96E 0xCBF0 #HANGUL SYLLABLE SSANGCIEUC YI -0xA96F 0xCBF1 #HANGUL SYLLABLE SSANGCIEUC YI KIYEOK -0xA970 0xCBF2 #HANGUL SYLLABLE SSANGCIEUC YI SSANGKIYEOK -0xA971 0xCBF3 #HANGUL SYLLABLE SSANGCIEUC YI KIYEOKSIOS -0xA972 0xCBF4 #HANGUL SYLLABLE SSANGCIEUC YI NIEUN -0xA973 0xCBF5 #HANGUL SYLLABLE SSANGCIEUC YI NIEUNCIEUC -0xA974 0xCBF6 #HANGUL SYLLABLE SSANGCIEUC YI NIEUNHIEUH -0xA975 0xCBF7 #HANGUL SYLLABLE SSANGCIEUC YI TIKEUT -0xA976 0xCBF8 #HANGUL SYLLABLE SSANGCIEUC YI RIEUL -0xA977 0xCBF9 #HANGUL SYLLABLE SSANGCIEUC YI RIEULKIYEOK -0xA978 0xCBFA #HANGUL SYLLABLE SSANGCIEUC YI RIEULMIEUM -0xA979 0xCBFB #HANGUL SYLLABLE SSANGCIEUC YI RIEULPIEUP -0xA97A 0xCBFC #HANGUL SYLLABLE SSANGCIEUC YI RIEULSIOS -0xA981 0xCBFD #HANGUL SYLLABLE SSANGCIEUC YI RIEULTHIEUTH -0xA982 0xCBFE #HANGUL SYLLABLE SSANGCIEUC YI RIEULPHIEUPH -0xA983 0xCBFF #HANGUL SYLLABLE SSANGCIEUC YI RIEULHIEUH -0xA984 0xCC00 #HANGUL SYLLABLE SSANGCIEUC YI MIEUM -0xA985 0xCC01 #HANGUL SYLLABLE SSANGCIEUC YI PIEUP -0xA986 0xCC02 #HANGUL SYLLABLE SSANGCIEUC YI PIEUPSIOS -0xA987 0xCC03 #HANGUL SYLLABLE SSANGCIEUC YI SIOS -0xA988 0xCC04 #HANGUL SYLLABLE SSANGCIEUC YI SSANGSIOS -0xA989 0xCC05 #HANGUL SYLLABLE SSANGCIEUC YI IEUNG -0xA98A 0xCC06 #HANGUL SYLLABLE SSANGCIEUC YI CIEUC -0xA98B 0xCC07 #HANGUL SYLLABLE SSANGCIEUC YI CHIEUCH -0xA98C 0xCC08 #HANGUL SYLLABLE SSANGCIEUC YI KHIEUKH -0xA98D 0xCC09 #HANGUL SYLLABLE SSANGCIEUC YI THIEUTH -0xA98E 0xCC0A #HANGUL SYLLABLE SSANGCIEUC YI PHIEUPH -0xA98F 0xCC0B #HANGUL SYLLABLE SSANGCIEUC YI HIEUH -0xA990 0xCC0E #HANGUL SYLLABLE SSANGCIEUC I SSANGKIYEOK -0xA991 0xCC0F #HANGUL SYLLABLE SSANGCIEUC I KIYEOKSIOS -0xA992 0xCC11 #HANGUL SYLLABLE SSANGCIEUC I NIEUNCIEUC -0xA993 0xCC12 #HANGUL SYLLABLE SSANGCIEUC I NIEUNHIEUH -0xA994 0xCC13 #HANGUL SYLLABLE SSANGCIEUC I TIKEUT -0xA995 0xCC15 #HANGUL SYLLABLE SSANGCIEUC I RIEULKIYEOK -0xA996 0xCC16 #HANGUL SYLLABLE SSANGCIEUC I RIEULMIEUM -0xA997 0xCC17 #HANGUL SYLLABLE SSANGCIEUC I RIEULPIEUP -0xA998 0xCC18 #HANGUL SYLLABLE SSANGCIEUC I RIEULSIOS -0xA999 0xCC19 #HANGUL SYLLABLE SSANGCIEUC I RIEULTHIEUTH -0xA99A 0xCC1A #HANGUL SYLLABLE SSANGCIEUC I RIEULPHIEUPH -0xA99B 0xCC1B #HANGUL SYLLABLE SSANGCIEUC I RIEULHIEUH -0xA99C 0xCC1E #HANGUL SYLLABLE SSANGCIEUC I PIEUPSIOS -0xA99D 0xCC1F #HANGUL SYLLABLE SSANGCIEUC I SIOS -0xA99E 0xCC20 #HANGUL SYLLABLE SSANGCIEUC I SSANGSIOS -0xA99F 0xCC23 #HANGUL SYLLABLE SSANGCIEUC I CHIEUCH -0xA9A0 0xCC24 #HANGUL SYLLABLE SSANGCIEUC I KHIEUKH -0xA9A1 0x00E6 #LATIN SMALL LETTER AE -0xA9A2 0x0111 #LATIN SMALL LETTER D WITH STROKE -0xA9A3 0x00F0 #LATIN SMALL LETTER ETH -0xA9A4 0x0127 #LATIN SMALL LETTER H WITH STROKE -0xA9A5 0x0131 #LATIN SMALL LETTER DOTLESS I -0xA9A6 0x0133 #LATIN SMALL LIGATURE IJ -0xA9A7 0x0138 #LATIN SMALL LETTER KRA -0xA9A8 0x0140 #LATIN SMALL LETTER L WITH MIDDLE DOT -0xA9A9 0x0142 #LATIN SMALL LETTER L WITH STROKE -0xA9AA 0x00F8 #LATIN SMALL LETTER O WITH STROKE -0xA9AB 0x0153 #LATIN SMALL LIGATURE OE -0xA9AC 0x00DF #LATIN SMALL LETTER SHARP S -0xA9AD 0x00FE #LATIN SMALL LETTER THORN -0xA9AE 0x0167 #LATIN SMALL LETTER T WITH STROKE -0xA9AF 0x014B #LATIN SMALL LETTER ENG -0xA9B0 0x0149 #LATIN SMALL LETTER N PRECEDED BY APOSTROPHE -0xA9B1 0x3200 #PARENTHESIZED HANGUL KIYEOK -0xA9B2 0x3201 #PARENTHESIZED HANGUL NIEUN -0xA9B3 0x3202 #PARENTHESIZED HANGUL TIKEUT -0xA9B4 0x3203 #PARENTHESIZED HANGUL RIEUL -0xA9B5 0x3204 #PARENTHESIZED HANGUL MIEUM -0xA9B6 0x3205 #PARENTHESIZED HANGUL PIEUP -0xA9B7 0x3206 #PARENTHESIZED HANGUL SIOS -0xA9B8 0x3207 #PARENTHESIZED HANGUL IEUNG -0xA9B9 0x3208 #PARENTHESIZED HANGUL CIEUC -0xA9BA 0x3209 #PARENTHESIZED HANGUL CHIEUCH -0xA9BB 0x320A #PARENTHESIZED HANGUL KHIEUKH -0xA9BC 0x320B #PARENTHESIZED HANGUL THIEUTH -0xA9BD 0x320C #PARENTHESIZED HANGUL PHIEUPH -0xA9BE 0x320D #PARENTHESIZED HANGUL HIEUH -0xA9BF 0x320E #PARENTHESIZED HANGUL KIYEOK A -0xA9C0 0x320F #PARENTHESIZED HANGUL NIEUN A -0xA9C1 0x3210 #PARENTHESIZED HANGUL TIKEUT A -0xA9C2 0x3211 #PARENTHESIZED HANGUL RIEUL A -0xA9C3 0x3212 #PARENTHESIZED HANGUL MIEUM A -0xA9C4 0x3213 #PARENTHESIZED HANGUL PIEUP A -0xA9C5 0x3214 #PARENTHESIZED HANGUL SIOS A -0xA9C6 0x3215 #PARENTHESIZED HANGUL IEUNG A -0xA9C7 0x3216 #PARENTHESIZED HANGUL CIEUC A -0xA9C8 0x3217 #PARENTHESIZED HANGUL CHIEUCH A -0xA9C9 0x3218 #PARENTHESIZED HANGUL KHIEUKH A -0xA9CA 0x3219 #PARENTHESIZED HANGUL THIEUTH A -0xA9CB 0x321A #PARENTHESIZED HANGUL PHIEUPH A -0xA9CC 0x321B #PARENTHESIZED HANGUL HIEUH A -0xA9CD 0x249C #PARENTHESIZED LATIN SMALL LETTER A -0xA9CE 0x249D #PARENTHESIZED LATIN SMALL LETTER B -0xA9CF 0x249E #PARENTHESIZED LATIN SMALL LETTER C -0xA9D0 0x249F #PARENTHESIZED LATIN SMALL LETTER D -0xA9D1 0x24A0 #PARENTHESIZED LATIN SMALL LETTER E -0xA9D2 0x24A1 #PARENTHESIZED LATIN SMALL LETTER F -0xA9D3 0x24A2 #PARENTHESIZED LATIN SMALL LETTER G -0xA9D4 0x24A3 #PARENTHESIZED LATIN SMALL LETTER H -0xA9D5 0x24A4 #PARENTHESIZED LATIN SMALL LETTER I -0xA9D6 0x24A5 #PARENTHESIZED LATIN SMALL LETTER J -0xA9D7 0x24A6 #PARENTHESIZED LATIN SMALL LETTER K -0xA9D8 0x24A7 #PARENTHESIZED LATIN SMALL LETTER L -0xA9D9 0x24A8 #PARENTHESIZED LATIN SMALL LETTER M -0xA9DA 0x24A9 #PARENTHESIZED LATIN SMALL LETTER N -0xA9DB 0x24AA #PARENTHESIZED LATIN SMALL LETTER O -0xA9DC 0x24AB #PARENTHESIZED LATIN SMALL LETTER P -0xA9DD 0x24AC #PARENTHESIZED LATIN SMALL LETTER Q -0xA9DE 0x24AD #PARENTHESIZED LATIN SMALL LETTER R -0xA9DF 0x24AE #PARENTHESIZED LATIN SMALL LETTER S -0xA9E0 0x24AF #PARENTHESIZED LATIN SMALL LETTER T -0xA9E1 0x24B0 #PARENTHESIZED LATIN SMALL LETTER U -0xA9E2 0x24B1 #PARENTHESIZED LATIN SMALL LETTER V -0xA9E3 0x24B2 #PARENTHESIZED LATIN SMALL LETTER W -0xA9E4 0x24B3 #PARENTHESIZED LATIN SMALL LETTER X -0xA9E5 0x24B4 #PARENTHESIZED LATIN SMALL LETTER Y -0xA9E6 0x24B5 #PARENTHESIZED LATIN SMALL LETTER Z -0xA9E7 0x2474 #PARENTHESIZED DIGIT ONE -0xA9E8 0x2475 #PARENTHESIZED DIGIT TWO -0xA9E9 0x2476 #PARENTHESIZED DIGIT THREE -0xA9EA 0x2477 #PARENTHESIZED DIGIT FOUR -0xA9EB 0x2478 #PARENTHESIZED DIGIT FIVE -0xA9EC 0x2479 #PARENTHESIZED DIGIT SIX -0xA9ED 0x247A #PARENTHESIZED DIGIT SEVEN -0xA9EE 0x247B #PARENTHESIZED DIGIT EIGHT -0xA9EF 0x247C #PARENTHESIZED DIGIT NINE -0xA9F0 0x247D #PARENTHESIZED NUMBER TEN -0xA9F1 0x247E #PARENTHESIZED NUMBER ELEVEN -0xA9F2 0x247F #PARENTHESIZED NUMBER TWELVE -0xA9F3 0x2480 #PARENTHESIZED NUMBER THIRTEEN -0xA9F4 0x2481 #PARENTHESIZED NUMBER FOURTEEN -0xA9F5 0x2482 #PARENTHESIZED NUMBER FIFTEEN -0xA9F6 0x00B9 #SUPERSCRIPT ONE -0xA9F7 0x00B2 #SUPERSCRIPT TWO -0xA9F8 0x00B3 #SUPERSCRIPT THREE -0xA9F9 0x2074 #SUPERSCRIPT FOUR -0xA9FA 0x207F #SUPERSCRIPT LATIN SMALL LETTER N -0xA9FB 0x2081 #SUBSCRIPT ONE -0xA9FC 0x2082 #SUBSCRIPT TWO -0xA9FD 0x2083 #SUBSCRIPT THREE -0xA9FE 0x2084 #SUBSCRIPT FOUR -0xAA41 0xCC25 #HANGUL SYLLABLE SSANGCIEUC I THIEUTH -0xAA42 0xCC26 #HANGUL SYLLABLE SSANGCIEUC I PHIEUPH -0xAA43 0xCC2A #HANGUL SYLLABLE CHIEUCH A SSANGKIYEOK -0xAA44 0xCC2B #HANGUL SYLLABLE CHIEUCH A KIYEOKSIOS -0xAA45 0xCC2D #HANGUL SYLLABLE CHIEUCH A NIEUNCIEUC -0xAA46 0xCC2F #HANGUL SYLLABLE CHIEUCH A TIKEUT -0xAA47 0xCC31 #HANGUL SYLLABLE CHIEUCH A RIEULKIYEOK -0xAA48 0xCC32 #HANGUL SYLLABLE CHIEUCH A RIEULMIEUM -0xAA49 0xCC33 #HANGUL SYLLABLE CHIEUCH A RIEULPIEUP -0xAA4A 0xCC34 #HANGUL SYLLABLE CHIEUCH A RIEULSIOS -0xAA4B 0xCC35 #HANGUL SYLLABLE CHIEUCH A RIEULTHIEUTH -0xAA4C 0xCC36 #HANGUL SYLLABLE CHIEUCH A RIEULPHIEUPH -0xAA4D 0xCC37 #HANGUL SYLLABLE CHIEUCH A RIEULHIEUH -0xAA4E 0xCC3A #HANGUL SYLLABLE CHIEUCH A PIEUPSIOS -0xAA4F 0xCC3F #HANGUL SYLLABLE CHIEUCH A CHIEUCH -0xAA50 0xCC40 #HANGUL SYLLABLE CHIEUCH A KHIEUKH -0xAA51 0xCC41 #HANGUL SYLLABLE CHIEUCH A THIEUTH -0xAA52 0xCC42 #HANGUL SYLLABLE CHIEUCH A PHIEUPH -0xAA53 0xCC43 #HANGUL SYLLABLE CHIEUCH A HIEUH -0xAA54 0xCC46 #HANGUL SYLLABLE CHIEUCH AE SSANGKIYEOK -0xAA55 0xCC47 #HANGUL SYLLABLE CHIEUCH AE KIYEOKSIOS -0xAA56 0xCC49 #HANGUL SYLLABLE CHIEUCH AE NIEUNCIEUC -0xAA57 0xCC4A #HANGUL SYLLABLE CHIEUCH AE NIEUNHIEUH -0xAA58 0xCC4B #HANGUL SYLLABLE CHIEUCH AE TIKEUT -0xAA59 0xCC4D #HANGUL SYLLABLE CHIEUCH AE RIEULKIYEOK -0xAA5A 0xCC4E #HANGUL SYLLABLE CHIEUCH AE RIEULMIEUM -0xAA61 0xCC4F #HANGUL SYLLABLE CHIEUCH AE RIEULPIEUP -0xAA62 0xCC50 #HANGUL SYLLABLE CHIEUCH AE RIEULSIOS -0xAA63 0xCC51 #HANGUL SYLLABLE CHIEUCH AE RIEULTHIEUTH -0xAA64 0xCC52 #HANGUL SYLLABLE CHIEUCH AE RIEULPHIEUPH -0xAA65 0xCC53 #HANGUL SYLLABLE CHIEUCH AE RIEULHIEUH -0xAA66 0xCC56 #HANGUL SYLLABLE CHIEUCH AE PIEUPSIOS -0xAA67 0xCC5A #HANGUL SYLLABLE CHIEUCH AE CIEUC -0xAA68 0xCC5B #HANGUL SYLLABLE CHIEUCH AE CHIEUCH -0xAA69 0xCC5C #HANGUL SYLLABLE CHIEUCH AE KHIEUKH -0xAA6A 0xCC5D #HANGUL SYLLABLE CHIEUCH AE THIEUTH -0xAA6B 0xCC5E #HANGUL SYLLABLE CHIEUCH AE PHIEUPH -0xAA6C 0xCC5F #HANGUL SYLLABLE CHIEUCH AE HIEUH -0xAA6D 0xCC61 #HANGUL SYLLABLE CHIEUCH YA KIYEOK -0xAA6E 0xCC62 #HANGUL SYLLABLE CHIEUCH YA SSANGKIYEOK -0xAA6F 0xCC63 #HANGUL SYLLABLE CHIEUCH YA KIYEOKSIOS -0xAA70 0xCC65 #HANGUL SYLLABLE CHIEUCH YA NIEUNCIEUC -0xAA71 0xCC67 #HANGUL SYLLABLE CHIEUCH YA TIKEUT -0xAA72 0xCC69 #HANGUL SYLLABLE CHIEUCH YA RIEULKIYEOK -0xAA73 0xCC6A #HANGUL SYLLABLE CHIEUCH YA RIEULMIEUM -0xAA74 0xCC6B #HANGUL SYLLABLE CHIEUCH YA RIEULPIEUP -0xAA75 0xCC6C #HANGUL SYLLABLE CHIEUCH YA RIEULSIOS -0xAA76 0xCC6D #HANGUL SYLLABLE CHIEUCH YA RIEULTHIEUTH -0xAA77 0xCC6E #HANGUL SYLLABLE CHIEUCH YA RIEULPHIEUPH -0xAA78 0xCC6F #HANGUL SYLLABLE CHIEUCH YA RIEULHIEUH -0xAA79 0xCC71 #HANGUL SYLLABLE CHIEUCH YA PIEUP -0xAA7A 0xCC72 #HANGUL SYLLABLE CHIEUCH YA PIEUPSIOS -0xAA81 0xCC73 #HANGUL SYLLABLE CHIEUCH YA SIOS -0xAA82 0xCC74 #HANGUL SYLLABLE CHIEUCH YA SSANGSIOS -0xAA83 0xCC76 #HANGUL SYLLABLE CHIEUCH YA CIEUC -0xAA84 0xCC77 #HANGUL SYLLABLE CHIEUCH YA CHIEUCH -0xAA85 0xCC78 #HANGUL SYLLABLE CHIEUCH YA KHIEUKH -0xAA86 0xCC79 #HANGUL SYLLABLE CHIEUCH YA THIEUTH -0xAA87 0xCC7A #HANGUL SYLLABLE CHIEUCH YA PHIEUPH -0xAA88 0xCC7B #HANGUL SYLLABLE CHIEUCH YA HIEUH -0xAA89 0xCC7C #HANGUL SYLLABLE CHIEUCH YAE -0xAA8A 0xCC7D #HANGUL SYLLABLE CHIEUCH YAE KIYEOK -0xAA8B 0xCC7E #HANGUL SYLLABLE CHIEUCH YAE SSANGKIYEOK -0xAA8C 0xCC7F #HANGUL SYLLABLE CHIEUCH YAE KIYEOKSIOS -0xAA8D 0xCC80 #HANGUL SYLLABLE CHIEUCH YAE NIEUN -0xAA8E 0xCC81 #HANGUL SYLLABLE CHIEUCH YAE NIEUNCIEUC -0xAA8F 0xCC82 #HANGUL SYLLABLE CHIEUCH YAE NIEUNHIEUH -0xAA90 0xCC83 #HANGUL SYLLABLE CHIEUCH YAE TIKEUT -0xAA91 0xCC84 #HANGUL SYLLABLE CHIEUCH YAE RIEUL -0xAA92 0xCC85 #HANGUL SYLLABLE CHIEUCH YAE RIEULKIYEOK -0xAA93 0xCC86 #HANGUL SYLLABLE CHIEUCH YAE RIEULMIEUM -0xAA94 0xCC87 #HANGUL SYLLABLE CHIEUCH YAE RIEULPIEUP -0xAA95 0xCC88 #HANGUL SYLLABLE CHIEUCH YAE RIEULSIOS -0xAA96 0xCC89 #HANGUL SYLLABLE CHIEUCH YAE RIEULTHIEUTH -0xAA97 0xCC8A #HANGUL SYLLABLE CHIEUCH YAE RIEULPHIEUPH -0xAA98 0xCC8B #HANGUL SYLLABLE CHIEUCH YAE RIEULHIEUH -0xAA99 0xCC8C #HANGUL SYLLABLE CHIEUCH YAE MIEUM -0xAA9A 0xCC8D #HANGUL SYLLABLE CHIEUCH YAE PIEUP -0xAA9B 0xCC8E #HANGUL SYLLABLE CHIEUCH YAE PIEUPSIOS -0xAA9C 0xCC8F #HANGUL SYLLABLE CHIEUCH YAE SIOS -0xAA9D 0xCC90 #HANGUL SYLLABLE CHIEUCH YAE SSANGSIOS -0xAA9E 0xCC91 #HANGUL SYLLABLE CHIEUCH YAE IEUNG -0xAA9F 0xCC92 #HANGUL SYLLABLE CHIEUCH YAE CIEUC -0xAAA0 0xCC93 #HANGUL SYLLABLE CHIEUCH YAE CHIEUCH -0xAAA1 0x3041 #HIRAGANA LETTER SMALL A -0xAAA2 0x3042 #HIRAGANA LETTER A -0xAAA3 0x3043 #HIRAGANA LETTER SMALL I -0xAAA4 0x3044 #HIRAGANA LETTER I -0xAAA5 0x3045 #HIRAGANA LETTER SMALL U -0xAAA6 0x3046 #HIRAGANA LETTER U -0xAAA7 0x3047 #HIRAGANA LETTER SMALL E -0xAAA8 0x3048 #HIRAGANA LETTER E -0xAAA9 0x3049 #HIRAGANA LETTER SMALL O -0xAAAA 0x304A #HIRAGANA LETTER O -0xAAAB 0x304B #HIRAGANA LETTER KA -0xAAAC 0x304C #HIRAGANA LETTER GA -0xAAAD 0x304D #HIRAGANA LETTER KI -0xAAAE 0x304E #HIRAGANA LETTER GI -0xAAAF 0x304F #HIRAGANA LETTER KU -0xAAB0 0x3050 #HIRAGANA LETTER GU -0xAAB1 0x3051 #HIRAGANA LETTER KE -0xAAB2 0x3052 #HIRAGANA LETTER GE -0xAAB3 0x3053 #HIRAGANA LETTER KO -0xAAB4 0x3054 #HIRAGANA LETTER GO -0xAAB5 0x3055 #HIRAGANA LETTER SA -0xAAB6 0x3056 #HIRAGANA LETTER ZA -0xAAB7 0x3057 #HIRAGANA LETTER SI -0xAAB8 0x3058 #HIRAGANA LETTER ZI -0xAAB9 0x3059 #HIRAGANA LETTER SU -0xAABA 0x305A #HIRAGANA LETTER ZU -0xAABB 0x305B #HIRAGANA LETTER SE -0xAABC 0x305C #HIRAGANA LETTER ZE -0xAABD 0x305D #HIRAGANA LETTER SO -0xAABE 0x305E #HIRAGANA LETTER ZO -0xAABF 0x305F #HIRAGANA LETTER TA -0xAAC0 0x3060 #HIRAGANA LETTER DA -0xAAC1 0x3061 #HIRAGANA LETTER TI -0xAAC2 0x3062 #HIRAGANA LETTER DI -0xAAC3 0x3063 #HIRAGANA LETTER SMALL TU -0xAAC4 0x3064 #HIRAGANA LETTER TU -0xAAC5 0x3065 #HIRAGANA LETTER DU -0xAAC6 0x3066 #HIRAGANA LETTER TE -0xAAC7 0x3067 #HIRAGANA LETTER DE -0xAAC8 0x3068 #HIRAGANA LETTER TO -0xAAC9 0x3069 #HIRAGANA LETTER DO -0xAACA 0x306A #HIRAGANA LETTER NA -0xAACB 0x306B #HIRAGANA LETTER NI -0xAACC 0x306C #HIRAGANA LETTER NU -0xAACD 0x306D #HIRAGANA LETTER NE -0xAACE 0x306E #HIRAGANA LETTER NO -0xAACF 0x306F #HIRAGANA LETTER HA -0xAAD0 0x3070 #HIRAGANA LETTER BA -0xAAD1 0x3071 #HIRAGANA LETTER PA -0xAAD2 0x3072 #HIRAGANA LETTER HI -0xAAD3 0x3073 #HIRAGANA LETTER BI -0xAAD4 0x3074 #HIRAGANA LETTER PI -0xAAD5 0x3075 #HIRAGANA LETTER HU -0xAAD6 0x3076 #HIRAGANA LETTER BU -0xAAD7 0x3077 #HIRAGANA LETTER PU -0xAAD8 0x3078 #HIRAGANA LETTER HE -0xAAD9 0x3079 #HIRAGANA LETTER BE -0xAADA 0x307A #HIRAGANA LETTER PE -0xAADB 0x307B #HIRAGANA LETTER HO -0xAADC 0x307C #HIRAGANA LETTER BO -0xAADD 0x307D #HIRAGANA LETTER PO -0xAADE 0x307E #HIRAGANA LETTER MA -0xAADF 0x307F #HIRAGANA LETTER MI -0xAAE0 0x3080 #HIRAGANA LETTER MU -0xAAE1 0x3081 #HIRAGANA LETTER ME -0xAAE2 0x3082 #HIRAGANA LETTER MO -0xAAE3 0x3083 #HIRAGANA LETTER SMALL YA -0xAAE4 0x3084 #HIRAGANA LETTER YA -0xAAE5 0x3085 #HIRAGANA LETTER SMALL YU -0xAAE6 0x3086 #HIRAGANA LETTER YU -0xAAE7 0x3087 #HIRAGANA LETTER SMALL YO -0xAAE8 0x3088 #HIRAGANA LETTER YO -0xAAE9 0x3089 #HIRAGANA LETTER RA -0xAAEA 0x308A #HIRAGANA LETTER RI -0xAAEB 0x308B #HIRAGANA LETTER RU -0xAAEC 0x308C #HIRAGANA LETTER RE -0xAAED 0x308D #HIRAGANA LETTER RO -0xAAEE 0x308E #HIRAGANA LETTER SMALL WA -0xAAEF 0x308F #HIRAGANA LETTER WA -0xAAF0 0x3090 #HIRAGANA LETTER WI -0xAAF1 0x3091 #HIRAGANA LETTER WE -0xAAF2 0x3092 #HIRAGANA LETTER WO -0xAAF3 0x3093 #HIRAGANA LETTER N -0xAB41 0xCC94 #HANGUL SYLLABLE CHIEUCH YAE KHIEUKH -0xAB42 0xCC95 #HANGUL SYLLABLE CHIEUCH YAE THIEUTH -0xAB43 0xCC96 #HANGUL SYLLABLE CHIEUCH YAE PHIEUPH -0xAB44 0xCC97 #HANGUL SYLLABLE CHIEUCH YAE HIEUH -0xAB45 0xCC9A #HANGUL SYLLABLE CHIEUCH EO SSANGKIYEOK -0xAB46 0xCC9B #HANGUL SYLLABLE CHIEUCH EO KIYEOKSIOS -0xAB47 0xCC9D #HANGUL SYLLABLE CHIEUCH EO NIEUNCIEUC -0xAB48 0xCC9E #HANGUL SYLLABLE CHIEUCH EO NIEUNHIEUH -0xAB49 0xCC9F #HANGUL SYLLABLE CHIEUCH EO TIKEUT -0xAB4A 0xCCA1 #HANGUL SYLLABLE CHIEUCH EO RIEULKIYEOK -0xAB4B 0xCCA2 #HANGUL SYLLABLE CHIEUCH EO RIEULMIEUM -0xAB4C 0xCCA3 #HANGUL SYLLABLE CHIEUCH EO RIEULPIEUP -0xAB4D 0xCCA4 #HANGUL SYLLABLE CHIEUCH EO RIEULSIOS -0xAB4E 0xCCA5 #HANGUL SYLLABLE CHIEUCH EO RIEULTHIEUTH -0xAB4F 0xCCA6 #HANGUL SYLLABLE CHIEUCH EO RIEULPHIEUPH -0xAB50 0xCCA7 #HANGUL SYLLABLE CHIEUCH EO RIEULHIEUH -0xAB51 0xCCAA #HANGUL SYLLABLE CHIEUCH EO PIEUPSIOS -0xAB52 0xCCAE #HANGUL SYLLABLE CHIEUCH EO CIEUC -0xAB53 0xCCAF #HANGUL SYLLABLE CHIEUCH EO CHIEUCH -0xAB54 0xCCB0 #HANGUL SYLLABLE CHIEUCH EO KHIEUKH -0xAB55 0xCCB1 #HANGUL SYLLABLE CHIEUCH EO THIEUTH -0xAB56 0xCCB2 #HANGUL SYLLABLE CHIEUCH EO PHIEUPH -0xAB57 0xCCB3 #HANGUL SYLLABLE CHIEUCH EO HIEUH -0xAB58 0xCCB6 #HANGUL SYLLABLE CHIEUCH E SSANGKIYEOK -0xAB59 0xCCB7 #HANGUL SYLLABLE CHIEUCH E KIYEOKSIOS -0xAB5A 0xCCB9 #HANGUL SYLLABLE CHIEUCH E NIEUNCIEUC -0xAB61 0xCCBA #HANGUL SYLLABLE CHIEUCH E NIEUNHIEUH -0xAB62 0xCCBB #HANGUL SYLLABLE CHIEUCH E TIKEUT -0xAB63 0xCCBD #HANGUL SYLLABLE CHIEUCH E RIEULKIYEOK -0xAB64 0xCCBE #HANGUL SYLLABLE CHIEUCH E RIEULMIEUM -0xAB65 0xCCBF #HANGUL SYLLABLE CHIEUCH E RIEULPIEUP -0xAB66 0xCCC0 #HANGUL SYLLABLE CHIEUCH E RIEULSIOS -0xAB67 0xCCC1 #HANGUL SYLLABLE CHIEUCH E RIEULTHIEUTH -0xAB68 0xCCC2 #HANGUL SYLLABLE CHIEUCH E RIEULPHIEUPH -0xAB69 0xCCC3 #HANGUL SYLLABLE CHIEUCH E RIEULHIEUH -0xAB6A 0xCCC6 #HANGUL SYLLABLE CHIEUCH E PIEUPSIOS -0xAB6B 0xCCC8 #HANGUL SYLLABLE CHIEUCH E SSANGSIOS -0xAB6C 0xCCCA #HANGUL SYLLABLE CHIEUCH E CIEUC -0xAB6D 0xCCCB #HANGUL SYLLABLE CHIEUCH E CHIEUCH -0xAB6E 0xCCCC #HANGUL SYLLABLE CHIEUCH E KHIEUKH -0xAB6F 0xCCCD #HANGUL SYLLABLE CHIEUCH E THIEUTH -0xAB70 0xCCCE #HANGUL SYLLABLE CHIEUCH E PHIEUPH -0xAB71 0xCCCF #HANGUL SYLLABLE CHIEUCH E HIEUH -0xAB72 0xCCD1 #HANGUL SYLLABLE CHIEUCH YEO KIYEOK -0xAB73 0xCCD2 #HANGUL SYLLABLE CHIEUCH YEO SSANGKIYEOK -0xAB74 0xCCD3 #HANGUL SYLLABLE CHIEUCH YEO KIYEOKSIOS -0xAB75 0xCCD5 #HANGUL SYLLABLE CHIEUCH YEO NIEUNCIEUC -0xAB76 0xCCD6 #HANGUL SYLLABLE CHIEUCH YEO NIEUNHIEUH -0xAB77 0xCCD7 #HANGUL SYLLABLE CHIEUCH YEO TIKEUT -0xAB78 0xCCD8 #HANGUL SYLLABLE CHIEUCH YEO RIEUL -0xAB79 0xCCD9 #HANGUL SYLLABLE CHIEUCH YEO RIEULKIYEOK -0xAB7A 0xCCDA #HANGUL SYLLABLE CHIEUCH YEO RIEULMIEUM -0xAB81 0xCCDB #HANGUL SYLLABLE CHIEUCH YEO RIEULPIEUP -0xAB82 0xCCDC #HANGUL SYLLABLE CHIEUCH YEO RIEULSIOS -0xAB83 0xCCDD #HANGUL SYLLABLE CHIEUCH YEO RIEULTHIEUTH -0xAB84 0xCCDE #HANGUL SYLLABLE CHIEUCH YEO RIEULPHIEUPH -0xAB85 0xCCDF #HANGUL SYLLABLE CHIEUCH YEO RIEULHIEUH -0xAB86 0xCCE0 #HANGUL SYLLABLE CHIEUCH YEO MIEUM -0xAB87 0xCCE1 #HANGUL SYLLABLE CHIEUCH YEO PIEUP -0xAB88 0xCCE2 #HANGUL SYLLABLE CHIEUCH YEO PIEUPSIOS -0xAB89 0xCCE3 #HANGUL SYLLABLE CHIEUCH YEO SIOS -0xAB8A 0xCCE5 #HANGUL SYLLABLE CHIEUCH YEO IEUNG -0xAB8B 0xCCE6 #HANGUL SYLLABLE CHIEUCH YEO CIEUC -0xAB8C 0xCCE7 #HANGUL SYLLABLE CHIEUCH YEO CHIEUCH -0xAB8D 0xCCE8 #HANGUL SYLLABLE CHIEUCH YEO KHIEUKH -0xAB8E 0xCCE9 #HANGUL SYLLABLE CHIEUCH YEO THIEUTH -0xAB8F 0xCCEA #HANGUL SYLLABLE CHIEUCH YEO PHIEUPH -0xAB90 0xCCEB #HANGUL SYLLABLE CHIEUCH YEO HIEUH -0xAB91 0xCCED #HANGUL SYLLABLE CHIEUCH YE KIYEOK -0xAB92 0xCCEE #HANGUL SYLLABLE CHIEUCH YE SSANGKIYEOK -0xAB93 0xCCEF #HANGUL SYLLABLE CHIEUCH YE KIYEOKSIOS -0xAB94 0xCCF1 #HANGUL SYLLABLE CHIEUCH YE NIEUNCIEUC -0xAB95 0xCCF2 #HANGUL SYLLABLE CHIEUCH YE NIEUNHIEUH -0xAB96 0xCCF3 #HANGUL SYLLABLE CHIEUCH YE TIKEUT -0xAB97 0xCCF4 #HANGUL SYLLABLE CHIEUCH YE RIEUL -0xAB98 0xCCF5 #HANGUL SYLLABLE CHIEUCH YE RIEULKIYEOK -0xAB99 0xCCF6 #HANGUL SYLLABLE CHIEUCH YE RIEULMIEUM -0xAB9A 0xCCF7 #HANGUL SYLLABLE CHIEUCH YE RIEULPIEUP -0xAB9B 0xCCF8 #HANGUL SYLLABLE CHIEUCH YE RIEULSIOS -0xAB9C 0xCCF9 #HANGUL SYLLABLE CHIEUCH YE RIEULTHIEUTH -0xAB9D 0xCCFA #HANGUL SYLLABLE CHIEUCH YE RIEULPHIEUPH -0xAB9E 0xCCFB #HANGUL SYLLABLE CHIEUCH YE RIEULHIEUH -0xAB9F 0xCCFC #HANGUL SYLLABLE CHIEUCH YE MIEUM -0xABA0 0xCCFD #HANGUL SYLLABLE CHIEUCH YE PIEUP -0xABA1 0x30A1 #KATAKANA LETTER SMALL A -0xABA2 0x30A2 #KATAKANA LETTER A -0xABA3 0x30A3 #KATAKANA LETTER SMALL I -0xABA4 0x30A4 #KATAKANA LETTER I -0xABA5 0x30A5 #KATAKANA LETTER SMALL U -0xABA6 0x30A6 #KATAKANA LETTER U -0xABA7 0x30A7 #KATAKANA LETTER SMALL E -0xABA8 0x30A8 #KATAKANA LETTER E -0xABA9 0x30A9 #KATAKANA LETTER SMALL O -0xABAA 0x30AA #KATAKANA LETTER O -0xABAB 0x30AB #KATAKANA LETTER KA -0xABAC 0x30AC #KATAKANA LETTER GA -0xABAD 0x30AD #KATAKANA LETTER KI -0xABAE 0x30AE #KATAKANA LETTER GI -0xABAF 0x30AF #KATAKANA LETTER KU -0xABB0 0x30B0 #KATAKANA LETTER GU -0xABB1 0x30B1 #KATAKANA LETTER KE -0xABB2 0x30B2 #KATAKANA LETTER GE -0xABB3 0x30B3 #KATAKANA LETTER KO -0xABB4 0x30B4 #KATAKANA LETTER GO -0xABB5 0x30B5 #KATAKANA LETTER SA -0xABB6 0x30B6 #KATAKANA LETTER ZA -0xABB7 0x30B7 #KATAKANA LETTER SI -0xABB8 0x30B8 #KATAKANA LETTER ZI -0xABB9 0x30B9 #KATAKANA LETTER SU -0xABBA 0x30BA #KATAKANA LETTER ZU -0xABBB 0x30BB #KATAKANA LETTER SE -0xABBC 0x30BC #KATAKANA LETTER ZE -0xABBD 0x30BD #KATAKANA LETTER SO -0xABBE 0x30BE #KATAKANA LETTER ZO -0xABBF 0x30BF #KATAKANA LETTER TA -0xABC0 0x30C0 #KATAKANA LETTER DA -0xABC1 0x30C1 #KATAKANA LETTER TI -0xABC2 0x30C2 #KATAKANA LETTER DI -0xABC3 0x30C3 #KATAKANA LETTER SMALL TU -0xABC4 0x30C4 #KATAKANA LETTER TU -0xABC5 0x30C5 #KATAKANA LETTER DU -0xABC6 0x30C6 #KATAKANA LETTER TE -0xABC7 0x30C7 #KATAKANA LETTER DE -0xABC8 0x30C8 #KATAKANA LETTER TO -0xABC9 0x30C9 #KATAKANA LETTER DO -0xABCA 0x30CA #KATAKANA LETTER NA -0xABCB 0x30CB #KATAKANA LETTER NI -0xABCC 0x30CC #KATAKANA LETTER NU -0xABCD 0x30CD #KATAKANA LETTER NE -0xABCE 0x30CE #KATAKANA LETTER NO -0xABCF 0x30CF #KATAKANA LETTER HA -0xABD0 0x30D0 #KATAKANA LETTER BA -0xABD1 0x30D1 #KATAKANA LETTER PA -0xABD2 0x30D2 #KATAKANA LETTER HI -0xABD3 0x30D3 #KATAKANA LETTER BI -0xABD4 0x30D4 #KATAKANA LETTER PI -0xABD5 0x30D5 #KATAKANA LETTER HU -0xABD6 0x30D6 #KATAKANA LETTER BU -0xABD7 0x30D7 #KATAKANA LETTER PU -0xABD8 0x30D8 #KATAKANA LETTER HE -0xABD9 0x30D9 #KATAKANA LETTER BE -0xABDA 0x30DA #KATAKANA LETTER PE -0xABDB 0x30DB #KATAKANA LETTER HO -0xABDC 0x30DC #KATAKANA LETTER BO -0xABDD 0x30DD #KATAKANA LETTER PO -0xABDE 0x30DE #KATAKANA LETTER MA -0xABDF 0x30DF #KATAKANA LETTER MI -0xABE0 0x30E0 #KATAKANA LETTER MU -0xABE1 0x30E1 #KATAKANA LETTER ME -0xABE2 0x30E2 #KATAKANA LETTER MO -0xABE3 0x30E3 #KATAKANA LETTER SMALL YA -0xABE4 0x30E4 #KATAKANA LETTER YA -0xABE5 0x30E5 #KATAKANA LETTER SMALL YU -0xABE6 0x30E6 #KATAKANA LETTER YU -0xABE7 0x30E7 #KATAKANA LETTER SMALL YO -0xABE8 0x30E8 #KATAKANA LETTER YO -0xABE9 0x30E9 #KATAKANA LETTER RA -0xABEA 0x30EA #KATAKANA LETTER RI -0xABEB 0x30EB #KATAKANA LETTER RU -0xABEC 0x30EC #KATAKANA LETTER RE -0xABED 0x30ED #KATAKANA LETTER RO -0xABEE 0x30EE #KATAKANA LETTER SMALL WA -0xABEF 0x30EF #KATAKANA LETTER WA -0xABF0 0x30F0 #KATAKANA LETTER WI -0xABF1 0x30F1 #KATAKANA LETTER WE -0xABF2 0x30F2 #KATAKANA LETTER WO -0xABF3 0x30F3 #KATAKANA LETTER N -0xABF4 0x30F4 #KATAKANA LETTER VU -0xABF5 0x30F5 #KATAKANA LETTER SMALL KA -0xABF6 0x30F6 #KATAKANA LETTER SMALL KE -0xAC41 0xCCFE #HANGUL SYLLABLE CHIEUCH YE PIEUPSIOS -0xAC42 0xCCFF #HANGUL SYLLABLE CHIEUCH YE SIOS -0xAC43 0xCD00 #HANGUL SYLLABLE CHIEUCH YE SSANGSIOS -0xAC44 0xCD02 #HANGUL SYLLABLE CHIEUCH YE CIEUC -0xAC45 0xCD03 #HANGUL SYLLABLE CHIEUCH YE CHIEUCH -0xAC46 0xCD04 #HANGUL SYLLABLE CHIEUCH YE KHIEUKH -0xAC47 0xCD05 #HANGUL SYLLABLE CHIEUCH YE THIEUTH -0xAC48 0xCD06 #HANGUL SYLLABLE CHIEUCH YE PHIEUPH -0xAC49 0xCD07 #HANGUL SYLLABLE CHIEUCH YE HIEUH -0xAC4A 0xCD0A #HANGUL SYLLABLE CHIEUCH O SSANGKIYEOK -0xAC4B 0xCD0B #HANGUL SYLLABLE CHIEUCH O KIYEOKSIOS -0xAC4C 0xCD0D #HANGUL SYLLABLE CHIEUCH O NIEUNCIEUC -0xAC4D 0xCD0E #HANGUL SYLLABLE CHIEUCH O NIEUNHIEUH -0xAC4E 0xCD0F #HANGUL SYLLABLE CHIEUCH O TIKEUT -0xAC4F 0xCD11 #HANGUL SYLLABLE CHIEUCH O RIEULKIYEOK -0xAC50 0xCD12 #HANGUL SYLLABLE CHIEUCH O RIEULMIEUM -0xAC51 0xCD13 #HANGUL SYLLABLE CHIEUCH O RIEULPIEUP -0xAC52 0xCD14 #HANGUL SYLLABLE CHIEUCH O RIEULSIOS -0xAC53 0xCD15 #HANGUL SYLLABLE CHIEUCH O RIEULTHIEUTH -0xAC54 0xCD16 #HANGUL SYLLABLE CHIEUCH O RIEULPHIEUPH -0xAC55 0xCD17 #HANGUL SYLLABLE CHIEUCH O RIEULHIEUH -0xAC56 0xCD1A #HANGUL SYLLABLE CHIEUCH O PIEUPSIOS -0xAC57 0xCD1C #HANGUL SYLLABLE CHIEUCH O SSANGSIOS -0xAC58 0xCD1E #HANGUL SYLLABLE CHIEUCH O CIEUC -0xAC59 0xCD1F #HANGUL SYLLABLE CHIEUCH O CHIEUCH -0xAC5A 0xCD20 #HANGUL SYLLABLE CHIEUCH O KHIEUKH -0xAC61 0xCD21 #HANGUL SYLLABLE CHIEUCH O THIEUTH -0xAC62 0xCD22 #HANGUL SYLLABLE CHIEUCH O PHIEUPH -0xAC63 0xCD23 #HANGUL SYLLABLE CHIEUCH O HIEUH -0xAC64 0xCD25 #HANGUL SYLLABLE CHIEUCH WA KIYEOK -0xAC65 0xCD26 #HANGUL SYLLABLE CHIEUCH WA SSANGKIYEOK -0xAC66 0xCD27 #HANGUL SYLLABLE CHIEUCH WA KIYEOKSIOS -0xAC67 0xCD29 #HANGUL SYLLABLE CHIEUCH WA NIEUNCIEUC -0xAC68 0xCD2A #HANGUL SYLLABLE CHIEUCH WA NIEUNHIEUH -0xAC69 0xCD2B #HANGUL SYLLABLE CHIEUCH WA TIKEUT -0xAC6A 0xCD2D #HANGUL SYLLABLE CHIEUCH WA RIEULKIYEOK -0xAC6B 0xCD2E #HANGUL SYLLABLE CHIEUCH WA RIEULMIEUM -0xAC6C 0xCD2F #HANGUL SYLLABLE CHIEUCH WA RIEULPIEUP -0xAC6D 0xCD30 #HANGUL SYLLABLE CHIEUCH WA RIEULSIOS -0xAC6E 0xCD31 #HANGUL SYLLABLE CHIEUCH WA RIEULTHIEUTH -0xAC6F 0xCD32 #HANGUL SYLLABLE CHIEUCH WA RIEULPHIEUPH -0xAC70 0xCD33 #HANGUL SYLLABLE CHIEUCH WA RIEULHIEUH -0xAC71 0xCD34 #HANGUL SYLLABLE CHIEUCH WA MIEUM -0xAC72 0xCD35 #HANGUL SYLLABLE CHIEUCH WA PIEUP -0xAC73 0xCD36 #HANGUL SYLLABLE CHIEUCH WA PIEUPSIOS -0xAC74 0xCD37 #HANGUL SYLLABLE CHIEUCH WA SIOS -0xAC75 0xCD38 #HANGUL SYLLABLE CHIEUCH WA SSANGSIOS -0xAC76 0xCD3A #HANGUL SYLLABLE CHIEUCH WA CIEUC -0xAC77 0xCD3B #HANGUL SYLLABLE CHIEUCH WA CHIEUCH -0xAC78 0xCD3C #HANGUL SYLLABLE CHIEUCH WA KHIEUKH -0xAC79 0xCD3D #HANGUL SYLLABLE CHIEUCH WA THIEUTH -0xAC7A 0xCD3E #HANGUL SYLLABLE CHIEUCH WA PHIEUPH -0xAC81 0xCD3F #HANGUL SYLLABLE CHIEUCH WA HIEUH -0xAC82 0xCD40 #HANGUL SYLLABLE CHIEUCH WAE -0xAC83 0xCD41 #HANGUL SYLLABLE CHIEUCH WAE KIYEOK -0xAC84 0xCD42 #HANGUL SYLLABLE CHIEUCH WAE SSANGKIYEOK -0xAC85 0xCD43 #HANGUL SYLLABLE CHIEUCH WAE KIYEOKSIOS -0xAC86 0xCD44 #HANGUL SYLLABLE CHIEUCH WAE NIEUN -0xAC87 0xCD45 #HANGUL SYLLABLE CHIEUCH WAE NIEUNCIEUC -0xAC88 0xCD46 #HANGUL SYLLABLE CHIEUCH WAE NIEUNHIEUH -0xAC89 0xCD47 #HANGUL SYLLABLE CHIEUCH WAE TIKEUT -0xAC8A 0xCD48 #HANGUL SYLLABLE CHIEUCH WAE RIEUL -0xAC8B 0xCD49 #HANGUL SYLLABLE CHIEUCH WAE RIEULKIYEOK -0xAC8C 0xCD4A #HANGUL SYLLABLE CHIEUCH WAE RIEULMIEUM -0xAC8D 0xCD4B #HANGUL SYLLABLE CHIEUCH WAE RIEULPIEUP -0xAC8E 0xCD4C #HANGUL SYLLABLE CHIEUCH WAE RIEULSIOS -0xAC8F 0xCD4D #HANGUL SYLLABLE CHIEUCH WAE RIEULTHIEUTH -0xAC90 0xCD4E #HANGUL SYLLABLE CHIEUCH WAE RIEULPHIEUPH -0xAC91 0xCD4F #HANGUL SYLLABLE CHIEUCH WAE RIEULHIEUH -0xAC92 0xCD50 #HANGUL SYLLABLE CHIEUCH WAE MIEUM -0xAC93 0xCD51 #HANGUL SYLLABLE CHIEUCH WAE PIEUP -0xAC94 0xCD52 #HANGUL SYLLABLE CHIEUCH WAE PIEUPSIOS -0xAC95 0xCD53 #HANGUL SYLLABLE CHIEUCH WAE SIOS -0xAC96 0xCD54 #HANGUL SYLLABLE CHIEUCH WAE SSANGSIOS -0xAC97 0xCD55 #HANGUL SYLLABLE CHIEUCH WAE IEUNG -0xAC98 0xCD56 #HANGUL SYLLABLE CHIEUCH WAE CIEUC -0xAC99 0xCD57 #HANGUL SYLLABLE CHIEUCH WAE CHIEUCH -0xAC9A 0xCD58 #HANGUL SYLLABLE CHIEUCH WAE KHIEUKH -0xAC9B 0xCD59 #HANGUL SYLLABLE CHIEUCH WAE THIEUTH -0xAC9C 0xCD5A #HANGUL SYLLABLE CHIEUCH WAE PHIEUPH -0xAC9D 0xCD5B #HANGUL SYLLABLE CHIEUCH WAE HIEUH -0xAC9E 0xCD5D #HANGUL SYLLABLE CHIEUCH OE KIYEOK -0xAC9F 0xCD5E #HANGUL SYLLABLE CHIEUCH OE SSANGKIYEOK -0xACA0 0xCD5F #HANGUL SYLLABLE CHIEUCH OE KIYEOKSIOS -0xACA1 0x0410 #CYRILLIC CAPITAL LETTER A -0xACA2 0x0411 #CYRILLIC CAPITAL LETTER BE -0xACA3 0x0412 #CYRILLIC CAPITAL LETTER VE -0xACA4 0x0413 #CYRILLIC CAPITAL LETTER GHE -0xACA5 0x0414 #CYRILLIC CAPITAL LETTER DE -0xACA6 0x0415 #CYRILLIC CAPITAL LETTER IE -0xACA7 0x0401 #CYRILLIC CAPITAL LETTER IO -0xACA8 0x0416 #CYRILLIC CAPITAL LETTER ZHE -0xACA9 0x0417 #CYRILLIC CAPITAL LETTER ZE -0xACAA 0x0418 #CYRILLIC CAPITAL LETTER I -0xACAB 0x0419 #CYRILLIC CAPITAL LETTER SHORT I -0xACAC 0x041A #CYRILLIC CAPITAL LETTER KA -0xACAD 0x041B #CYRILLIC CAPITAL LETTER EL -0xACAE 0x041C #CYRILLIC CAPITAL LETTER EM -0xACAF 0x041D #CYRILLIC CAPITAL LETTER EN -0xACB0 0x041E #CYRILLIC CAPITAL LETTER O -0xACB1 0x041F #CYRILLIC CAPITAL LETTER PE -0xACB2 0x0420 #CYRILLIC CAPITAL LETTER ER -0xACB3 0x0421 #CYRILLIC CAPITAL LETTER ES -0xACB4 0x0422 #CYRILLIC CAPITAL LETTER TE -0xACB5 0x0423 #CYRILLIC CAPITAL LETTER U -0xACB6 0x0424 #CYRILLIC CAPITAL LETTER EF -0xACB7 0x0425 #CYRILLIC CAPITAL LETTER HA -0xACB8 0x0426 #CYRILLIC CAPITAL LETTER TSE -0xACB9 0x0427 #CYRILLIC CAPITAL LETTER CHE -0xACBA 0x0428 #CYRILLIC CAPITAL LETTER SHA -0xACBB 0x0429 #CYRILLIC CAPITAL LETTER SHCHA -0xACBC 0x042A #CYRILLIC CAPITAL LETTER HARD SIGN -0xACBD 0x042B #CYRILLIC CAPITAL LETTER YERU -0xACBE 0x042C #CYRILLIC CAPITAL LETTER SOFT SIGN -0xACBF 0x042D #CYRILLIC CAPITAL LETTER E -0xACC0 0x042E #CYRILLIC CAPITAL LETTER YU -0xACC1 0x042F #CYRILLIC CAPITAL LETTER YA -0xACD1 0x0430 #CYRILLIC SMALL LETTER A -0xACD2 0x0431 #CYRILLIC SMALL LETTER BE -0xACD3 0x0432 #CYRILLIC SMALL LETTER VE -0xACD4 0x0433 #CYRILLIC SMALL LETTER GHE -0xACD5 0x0434 #CYRILLIC SMALL LETTER DE -0xACD6 0x0435 #CYRILLIC SMALL LETTER IE -0xACD7 0x0451 #CYRILLIC SMALL LETTER IO -0xACD8 0x0436 #CYRILLIC SMALL LETTER ZHE -0xACD9 0x0437 #CYRILLIC SMALL LETTER ZE -0xACDA 0x0438 #CYRILLIC SMALL LETTER I -0xACDB 0x0439 #CYRILLIC SMALL LETTER SHORT I -0xACDC 0x043A #CYRILLIC SMALL LETTER KA -0xACDD 0x043B #CYRILLIC SMALL LETTER EL -0xACDE 0x043C #CYRILLIC SMALL LETTER EM -0xACDF 0x043D #CYRILLIC SMALL LETTER EN -0xACE0 0x043E #CYRILLIC SMALL LETTER O -0xACE1 0x043F #CYRILLIC SMALL LETTER PE -0xACE2 0x0440 #CYRILLIC SMALL LETTER ER -0xACE3 0x0441 #CYRILLIC SMALL LETTER ES -0xACE4 0x0442 #CYRILLIC SMALL LETTER TE -0xACE5 0x0443 #CYRILLIC SMALL LETTER U -0xACE6 0x0444 #CYRILLIC SMALL LETTER EF -0xACE7 0x0445 #CYRILLIC SMALL LETTER HA -0xACE8 0x0446 #CYRILLIC SMALL LETTER TSE -0xACE9 0x0447 #CYRILLIC SMALL LETTER CHE -0xACEA 0x0448 #CYRILLIC SMALL LETTER SHA -0xACEB 0x0449 #CYRILLIC SMALL LETTER SHCHA -0xACEC 0x044A #CYRILLIC SMALL LETTER HARD SIGN -0xACED 0x044B #CYRILLIC SMALL LETTER YERU -0xACEE 0x044C #CYRILLIC SMALL LETTER SOFT SIGN -0xACEF 0x044D #CYRILLIC SMALL LETTER E -0xACF0 0x044E #CYRILLIC SMALL LETTER YU -0xACF1 0x044F #CYRILLIC SMALL LETTER YA -0xAD41 0xCD61 #HANGUL SYLLABLE CHIEUCH OE NIEUNCIEUC -0xAD42 0xCD62 #HANGUL SYLLABLE CHIEUCH OE NIEUNHIEUH -0xAD43 0xCD63 #HANGUL SYLLABLE CHIEUCH OE TIKEUT -0xAD44 0xCD65 #HANGUL SYLLABLE CHIEUCH OE RIEULKIYEOK -0xAD45 0xCD66 #HANGUL SYLLABLE CHIEUCH OE RIEULMIEUM -0xAD46 0xCD67 #HANGUL SYLLABLE CHIEUCH OE RIEULPIEUP -0xAD47 0xCD68 #HANGUL SYLLABLE CHIEUCH OE RIEULSIOS -0xAD48 0xCD69 #HANGUL SYLLABLE CHIEUCH OE RIEULTHIEUTH -0xAD49 0xCD6A #HANGUL SYLLABLE CHIEUCH OE RIEULPHIEUPH -0xAD4A 0xCD6B #HANGUL SYLLABLE CHIEUCH OE RIEULHIEUH -0xAD4B 0xCD6E #HANGUL SYLLABLE CHIEUCH OE PIEUPSIOS -0xAD4C 0xCD70 #HANGUL SYLLABLE CHIEUCH OE SSANGSIOS -0xAD4D 0xCD72 #HANGUL SYLLABLE CHIEUCH OE CIEUC -0xAD4E 0xCD73 #HANGUL SYLLABLE CHIEUCH OE CHIEUCH -0xAD4F 0xCD74 #HANGUL SYLLABLE CHIEUCH OE KHIEUKH -0xAD50 0xCD75 #HANGUL SYLLABLE CHIEUCH OE THIEUTH -0xAD51 0xCD76 #HANGUL SYLLABLE CHIEUCH OE PHIEUPH -0xAD52 0xCD77 #HANGUL SYLLABLE CHIEUCH OE HIEUH -0xAD53 0xCD79 #HANGUL SYLLABLE CHIEUCH YO KIYEOK -0xAD54 0xCD7A #HANGUL SYLLABLE CHIEUCH YO SSANGKIYEOK -0xAD55 0xCD7B #HANGUL SYLLABLE CHIEUCH YO KIYEOKSIOS -0xAD56 0xCD7C #HANGUL SYLLABLE CHIEUCH YO NIEUN -0xAD57 0xCD7D #HANGUL SYLLABLE CHIEUCH YO NIEUNCIEUC -0xAD58 0xCD7E #HANGUL SYLLABLE CHIEUCH YO NIEUNHIEUH -0xAD59 0xCD7F #HANGUL SYLLABLE CHIEUCH YO TIKEUT -0xAD5A 0xCD80 #HANGUL SYLLABLE CHIEUCH YO RIEUL -0xAD61 0xCD81 #HANGUL SYLLABLE CHIEUCH YO RIEULKIYEOK -0xAD62 0xCD82 #HANGUL SYLLABLE CHIEUCH YO RIEULMIEUM -0xAD63 0xCD83 #HANGUL SYLLABLE CHIEUCH YO RIEULPIEUP -0xAD64 0xCD84 #HANGUL SYLLABLE CHIEUCH YO RIEULSIOS -0xAD65 0xCD85 #HANGUL SYLLABLE CHIEUCH YO RIEULTHIEUTH -0xAD66 0xCD86 #HANGUL SYLLABLE CHIEUCH YO RIEULPHIEUPH -0xAD67 0xCD87 #HANGUL SYLLABLE CHIEUCH YO RIEULHIEUH -0xAD68 0xCD89 #HANGUL SYLLABLE CHIEUCH YO PIEUP -0xAD69 0xCD8A #HANGUL SYLLABLE CHIEUCH YO PIEUPSIOS -0xAD6A 0xCD8B #HANGUL SYLLABLE CHIEUCH YO SIOS -0xAD6B 0xCD8C #HANGUL SYLLABLE CHIEUCH YO SSANGSIOS -0xAD6C 0xCD8D #HANGUL SYLLABLE CHIEUCH YO IEUNG -0xAD6D 0xCD8E #HANGUL SYLLABLE CHIEUCH YO CIEUC -0xAD6E 0xCD8F #HANGUL SYLLABLE CHIEUCH YO CHIEUCH -0xAD6F 0xCD90 #HANGUL SYLLABLE CHIEUCH YO KHIEUKH -0xAD70 0xCD91 #HANGUL SYLLABLE CHIEUCH YO THIEUTH -0xAD71 0xCD92 #HANGUL SYLLABLE CHIEUCH YO PHIEUPH -0xAD72 0xCD93 #HANGUL SYLLABLE CHIEUCH YO HIEUH -0xAD73 0xCD96 #HANGUL SYLLABLE CHIEUCH U SSANGKIYEOK -0xAD74 0xCD97 #HANGUL SYLLABLE CHIEUCH U KIYEOKSIOS -0xAD75 0xCD99 #HANGUL SYLLABLE CHIEUCH U NIEUNCIEUC -0xAD76 0xCD9A #HANGUL SYLLABLE CHIEUCH U NIEUNHIEUH -0xAD77 0xCD9B #HANGUL SYLLABLE CHIEUCH U TIKEUT -0xAD78 0xCD9D #HANGUL SYLLABLE CHIEUCH U RIEULKIYEOK -0xAD79 0xCD9E #HANGUL SYLLABLE CHIEUCH U RIEULMIEUM -0xAD7A 0xCD9F #HANGUL SYLLABLE CHIEUCH U RIEULPIEUP -0xAD81 0xCDA0 #HANGUL SYLLABLE CHIEUCH U RIEULSIOS -0xAD82 0xCDA1 #HANGUL SYLLABLE CHIEUCH U RIEULTHIEUTH -0xAD83 0xCDA2 #HANGUL SYLLABLE CHIEUCH U RIEULPHIEUPH -0xAD84 0xCDA3 #HANGUL SYLLABLE CHIEUCH U RIEULHIEUH -0xAD85 0xCDA6 #HANGUL SYLLABLE CHIEUCH U PIEUPSIOS -0xAD86 0xCDA8 #HANGUL SYLLABLE CHIEUCH U SSANGSIOS -0xAD87 0xCDAA #HANGUL SYLLABLE CHIEUCH U CIEUC -0xAD88 0xCDAB #HANGUL SYLLABLE CHIEUCH U CHIEUCH -0xAD89 0xCDAC #HANGUL SYLLABLE CHIEUCH U KHIEUKH -0xAD8A 0xCDAD #HANGUL SYLLABLE CHIEUCH U THIEUTH -0xAD8B 0xCDAE #HANGUL SYLLABLE CHIEUCH U PHIEUPH -0xAD8C 0xCDAF #HANGUL SYLLABLE CHIEUCH U HIEUH -0xAD8D 0xCDB1 #HANGUL SYLLABLE CHIEUCH WEO KIYEOK -0xAD8E 0xCDB2 #HANGUL SYLLABLE CHIEUCH WEO SSANGKIYEOK -0xAD8F 0xCDB3 #HANGUL SYLLABLE CHIEUCH WEO KIYEOKSIOS -0xAD90 0xCDB4 #HANGUL SYLLABLE CHIEUCH WEO NIEUN -0xAD91 0xCDB5 #HANGUL SYLLABLE CHIEUCH WEO NIEUNCIEUC -0xAD92 0xCDB6 #HANGUL SYLLABLE CHIEUCH WEO NIEUNHIEUH -0xAD93 0xCDB7 #HANGUL SYLLABLE CHIEUCH WEO TIKEUT -0xAD94 0xCDB8 #HANGUL SYLLABLE CHIEUCH WEO RIEUL -0xAD95 0xCDB9 #HANGUL SYLLABLE CHIEUCH WEO RIEULKIYEOK -0xAD96 0xCDBA #HANGUL SYLLABLE CHIEUCH WEO RIEULMIEUM -0xAD97 0xCDBB #HANGUL SYLLABLE CHIEUCH WEO RIEULPIEUP -0xAD98 0xCDBC #HANGUL SYLLABLE CHIEUCH WEO RIEULSIOS -0xAD99 0xCDBD #HANGUL SYLLABLE CHIEUCH WEO RIEULTHIEUTH -0xAD9A 0xCDBE #HANGUL SYLLABLE CHIEUCH WEO RIEULPHIEUPH -0xAD9B 0xCDBF #HANGUL SYLLABLE CHIEUCH WEO RIEULHIEUH -0xAD9C 0xCDC0 #HANGUL SYLLABLE CHIEUCH WEO MIEUM -0xAD9D 0xCDC1 #HANGUL SYLLABLE CHIEUCH WEO PIEUP -0xAD9E 0xCDC2 #HANGUL SYLLABLE CHIEUCH WEO PIEUPSIOS -0xAD9F 0xCDC3 #HANGUL SYLLABLE CHIEUCH WEO SIOS -0xADA0 0xCDC5 #HANGUL SYLLABLE CHIEUCH WEO IEUNG -0xAE41 0xCDC6 #HANGUL SYLLABLE CHIEUCH WEO CIEUC -0xAE42 0xCDC7 #HANGUL SYLLABLE CHIEUCH WEO CHIEUCH -0xAE43 0xCDC8 #HANGUL SYLLABLE CHIEUCH WEO KHIEUKH -0xAE44 0xCDC9 #HANGUL SYLLABLE CHIEUCH WEO THIEUTH -0xAE45 0xCDCA #HANGUL SYLLABLE CHIEUCH WEO PHIEUPH -0xAE46 0xCDCB #HANGUL SYLLABLE CHIEUCH WEO HIEUH -0xAE47 0xCDCD #HANGUL SYLLABLE CHIEUCH WE KIYEOK -0xAE48 0xCDCE #HANGUL SYLLABLE CHIEUCH WE SSANGKIYEOK -0xAE49 0xCDCF #HANGUL SYLLABLE CHIEUCH WE KIYEOKSIOS -0xAE4A 0xCDD1 #HANGUL SYLLABLE CHIEUCH WE NIEUNCIEUC -0xAE4B 0xCDD2 #HANGUL SYLLABLE CHIEUCH WE NIEUNHIEUH -0xAE4C 0xCDD3 #HANGUL SYLLABLE CHIEUCH WE TIKEUT -0xAE4D 0xCDD4 #HANGUL SYLLABLE CHIEUCH WE RIEUL -0xAE4E 0xCDD5 #HANGUL SYLLABLE CHIEUCH WE RIEULKIYEOK -0xAE4F 0xCDD6 #HANGUL SYLLABLE CHIEUCH WE RIEULMIEUM -0xAE50 0xCDD7 #HANGUL SYLLABLE CHIEUCH WE RIEULPIEUP -0xAE51 0xCDD8 #HANGUL SYLLABLE CHIEUCH WE RIEULSIOS -0xAE52 0xCDD9 #HANGUL SYLLABLE CHIEUCH WE RIEULTHIEUTH -0xAE53 0xCDDA #HANGUL SYLLABLE CHIEUCH WE RIEULPHIEUPH -0xAE54 0xCDDB #HANGUL SYLLABLE CHIEUCH WE RIEULHIEUH -0xAE55 0xCDDC #HANGUL SYLLABLE CHIEUCH WE MIEUM -0xAE56 0xCDDD #HANGUL SYLLABLE CHIEUCH WE PIEUP -0xAE57 0xCDDE #HANGUL SYLLABLE CHIEUCH WE PIEUPSIOS -0xAE58 0xCDDF #HANGUL SYLLABLE CHIEUCH WE SIOS -0xAE59 0xCDE0 #HANGUL SYLLABLE CHIEUCH WE SSANGSIOS -0xAE5A 0xCDE1 #HANGUL SYLLABLE CHIEUCH WE IEUNG -0xAE61 0xCDE2 #HANGUL SYLLABLE CHIEUCH WE CIEUC -0xAE62 0xCDE3 #HANGUL SYLLABLE CHIEUCH WE CHIEUCH -0xAE63 0xCDE4 #HANGUL SYLLABLE CHIEUCH WE KHIEUKH -0xAE64 0xCDE5 #HANGUL SYLLABLE CHIEUCH WE THIEUTH -0xAE65 0xCDE6 #HANGUL SYLLABLE CHIEUCH WE PHIEUPH -0xAE66 0xCDE7 #HANGUL SYLLABLE CHIEUCH WE HIEUH -0xAE67 0xCDE9 #HANGUL SYLLABLE CHIEUCH WI KIYEOK -0xAE68 0xCDEA #HANGUL SYLLABLE CHIEUCH WI SSANGKIYEOK -0xAE69 0xCDEB #HANGUL SYLLABLE CHIEUCH WI KIYEOKSIOS -0xAE6A 0xCDED #HANGUL SYLLABLE CHIEUCH WI NIEUNCIEUC -0xAE6B 0xCDEE #HANGUL SYLLABLE CHIEUCH WI NIEUNHIEUH -0xAE6C 0xCDEF #HANGUL SYLLABLE CHIEUCH WI TIKEUT -0xAE6D 0xCDF1 #HANGUL SYLLABLE CHIEUCH WI RIEULKIYEOK -0xAE6E 0xCDF2 #HANGUL SYLLABLE CHIEUCH WI RIEULMIEUM -0xAE6F 0xCDF3 #HANGUL SYLLABLE CHIEUCH WI RIEULPIEUP -0xAE70 0xCDF4 #HANGUL SYLLABLE CHIEUCH WI RIEULSIOS -0xAE71 0xCDF5 #HANGUL SYLLABLE CHIEUCH WI RIEULTHIEUTH -0xAE72 0xCDF6 #HANGUL SYLLABLE CHIEUCH WI RIEULPHIEUPH -0xAE73 0xCDF7 #HANGUL SYLLABLE CHIEUCH WI RIEULHIEUH -0xAE74 0xCDFA #HANGUL SYLLABLE CHIEUCH WI PIEUPSIOS -0xAE75 0xCDFC #HANGUL SYLLABLE CHIEUCH WI SSANGSIOS -0xAE76 0xCDFE #HANGUL SYLLABLE CHIEUCH WI CIEUC -0xAE77 0xCDFF #HANGUL SYLLABLE CHIEUCH WI CHIEUCH -0xAE78 0xCE00 #HANGUL SYLLABLE CHIEUCH WI KHIEUKH -0xAE79 0xCE01 #HANGUL SYLLABLE CHIEUCH WI THIEUTH -0xAE7A 0xCE02 #HANGUL SYLLABLE CHIEUCH WI PHIEUPH -0xAE81 0xCE03 #HANGUL SYLLABLE CHIEUCH WI HIEUH -0xAE82 0xCE05 #HANGUL SYLLABLE CHIEUCH YU KIYEOK -0xAE83 0xCE06 #HANGUL SYLLABLE CHIEUCH YU SSANGKIYEOK -0xAE84 0xCE07 #HANGUL SYLLABLE CHIEUCH YU KIYEOKSIOS -0xAE85 0xCE09 #HANGUL SYLLABLE CHIEUCH YU NIEUNCIEUC -0xAE86 0xCE0A #HANGUL SYLLABLE CHIEUCH YU NIEUNHIEUH -0xAE87 0xCE0B #HANGUL SYLLABLE CHIEUCH YU TIKEUT -0xAE88 0xCE0D #HANGUL SYLLABLE CHIEUCH YU RIEULKIYEOK -0xAE89 0xCE0E #HANGUL SYLLABLE CHIEUCH YU RIEULMIEUM -0xAE8A 0xCE0F #HANGUL SYLLABLE CHIEUCH YU RIEULPIEUP -0xAE8B 0xCE10 #HANGUL SYLLABLE CHIEUCH YU RIEULSIOS -0xAE8C 0xCE11 #HANGUL SYLLABLE CHIEUCH YU RIEULTHIEUTH -0xAE8D 0xCE12 #HANGUL SYLLABLE CHIEUCH YU RIEULPHIEUPH -0xAE8E 0xCE13 #HANGUL SYLLABLE CHIEUCH YU RIEULHIEUH -0xAE8F 0xCE15 #HANGUL SYLLABLE CHIEUCH YU PIEUP -0xAE90 0xCE16 #HANGUL SYLLABLE CHIEUCH YU PIEUPSIOS -0xAE91 0xCE17 #HANGUL SYLLABLE CHIEUCH YU SIOS -0xAE92 0xCE18 #HANGUL SYLLABLE CHIEUCH YU SSANGSIOS -0xAE93 0xCE1A #HANGUL SYLLABLE CHIEUCH YU CIEUC -0xAE94 0xCE1B #HANGUL SYLLABLE CHIEUCH YU CHIEUCH -0xAE95 0xCE1C #HANGUL SYLLABLE CHIEUCH YU KHIEUKH -0xAE96 0xCE1D #HANGUL SYLLABLE CHIEUCH YU THIEUTH -0xAE97 0xCE1E #HANGUL SYLLABLE CHIEUCH YU PHIEUPH -0xAE98 0xCE1F #HANGUL SYLLABLE CHIEUCH YU HIEUH -0xAE99 0xCE22 #HANGUL SYLLABLE CHIEUCH EU SSANGKIYEOK -0xAE9A 0xCE23 #HANGUL SYLLABLE CHIEUCH EU KIYEOKSIOS -0xAE9B 0xCE25 #HANGUL SYLLABLE CHIEUCH EU NIEUNCIEUC -0xAE9C 0xCE26 #HANGUL SYLLABLE CHIEUCH EU NIEUNHIEUH -0xAE9D 0xCE27 #HANGUL SYLLABLE CHIEUCH EU TIKEUT -0xAE9E 0xCE29 #HANGUL SYLLABLE CHIEUCH EU RIEULKIYEOK -0xAE9F 0xCE2A #HANGUL SYLLABLE CHIEUCH EU RIEULMIEUM -0xAEA0 0xCE2B #HANGUL SYLLABLE CHIEUCH EU RIEULPIEUP -0xAF41 0xCE2C #HANGUL SYLLABLE CHIEUCH EU RIEULSIOS -0xAF42 0xCE2D #HANGUL SYLLABLE CHIEUCH EU RIEULTHIEUTH -0xAF43 0xCE2E #HANGUL SYLLABLE CHIEUCH EU RIEULPHIEUPH -0xAF44 0xCE2F #HANGUL SYLLABLE CHIEUCH EU RIEULHIEUH -0xAF45 0xCE32 #HANGUL SYLLABLE CHIEUCH EU PIEUPSIOS -0xAF46 0xCE34 #HANGUL SYLLABLE CHIEUCH EU SSANGSIOS -0xAF47 0xCE36 #HANGUL SYLLABLE CHIEUCH EU CIEUC -0xAF48 0xCE37 #HANGUL SYLLABLE CHIEUCH EU CHIEUCH -0xAF49 0xCE38 #HANGUL SYLLABLE CHIEUCH EU KHIEUKH -0xAF4A 0xCE39 #HANGUL SYLLABLE CHIEUCH EU THIEUTH -0xAF4B 0xCE3A #HANGUL SYLLABLE CHIEUCH EU PHIEUPH -0xAF4C 0xCE3B #HANGUL SYLLABLE CHIEUCH EU HIEUH -0xAF4D 0xCE3C #HANGUL SYLLABLE CHIEUCH YI -0xAF4E 0xCE3D #HANGUL SYLLABLE CHIEUCH YI KIYEOK -0xAF4F 0xCE3E #HANGUL SYLLABLE CHIEUCH YI SSANGKIYEOK -0xAF50 0xCE3F #HANGUL SYLLABLE CHIEUCH YI KIYEOKSIOS -0xAF51 0xCE40 #HANGUL SYLLABLE CHIEUCH YI NIEUN -0xAF52 0xCE41 #HANGUL SYLLABLE CHIEUCH YI NIEUNCIEUC -0xAF53 0xCE42 #HANGUL SYLLABLE CHIEUCH YI NIEUNHIEUH -0xAF54 0xCE43 #HANGUL SYLLABLE CHIEUCH YI TIKEUT -0xAF55 0xCE44 #HANGUL SYLLABLE CHIEUCH YI RIEUL -0xAF56 0xCE45 #HANGUL SYLLABLE CHIEUCH YI RIEULKIYEOK -0xAF57 0xCE46 #HANGUL SYLLABLE CHIEUCH YI RIEULMIEUM -0xAF58 0xCE47 #HANGUL SYLLABLE CHIEUCH YI RIEULPIEUP -0xAF59 0xCE48 #HANGUL SYLLABLE CHIEUCH YI RIEULSIOS -0xAF5A 0xCE49 #HANGUL SYLLABLE CHIEUCH YI RIEULTHIEUTH -0xAF61 0xCE4A #HANGUL SYLLABLE CHIEUCH YI RIEULPHIEUPH -0xAF62 0xCE4B #HANGUL SYLLABLE CHIEUCH YI RIEULHIEUH -0xAF63 0xCE4C #HANGUL SYLLABLE CHIEUCH YI MIEUM -0xAF64 0xCE4D #HANGUL SYLLABLE CHIEUCH YI PIEUP -0xAF65 0xCE4E #HANGUL SYLLABLE CHIEUCH YI PIEUPSIOS -0xAF66 0xCE4F #HANGUL SYLLABLE CHIEUCH YI SIOS -0xAF67 0xCE50 #HANGUL SYLLABLE CHIEUCH YI SSANGSIOS -0xAF68 0xCE51 #HANGUL SYLLABLE CHIEUCH YI IEUNG -0xAF69 0xCE52 #HANGUL SYLLABLE CHIEUCH YI CIEUC -0xAF6A 0xCE53 #HANGUL SYLLABLE CHIEUCH YI CHIEUCH -0xAF6B 0xCE54 #HANGUL SYLLABLE CHIEUCH YI KHIEUKH -0xAF6C 0xCE55 #HANGUL SYLLABLE CHIEUCH YI THIEUTH -0xAF6D 0xCE56 #HANGUL SYLLABLE CHIEUCH YI PHIEUPH -0xAF6E 0xCE57 #HANGUL SYLLABLE CHIEUCH YI HIEUH -0xAF6F 0xCE5A #HANGUL SYLLABLE CHIEUCH I SSANGKIYEOK -0xAF70 0xCE5B #HANGUL SYLLABLE CHIEUCH I KIYEOKSIOS -0xAF71 0xCE5D #HANGUL SYLLABLE CHIEUCH I NIEUNCIEUC -0xAF72 0xCE5E #HANGUL SYLLABLE CHIEUCH I NIEUNHIEUH -0xAF73 0xCE62 #HANGUL SYLLABLE CHIEUCH I RIEULMIEUM -0xAF74 0xCE63 #HANGUL SYLLABLE CHIEUCH I RIEULPIEUP -0xAF75 0xCE64 #HANGUL SYLLABLE CHIEUCH I RIEULSIOS -0xAF76 0xCE65 #HANGUL SYLLABLE CHIEUCH I RIEULTHIEUTH -0xAF77 0xCE66 #HANGUL SYLLABLE CHIEUCH I RIEULPHIEUPH -0xAF78 0xCE67 #HANGUL SYLLABLE CHIEUCH I RIEULHIEUH -0xAF79 0xCE6A #HANGUL SYLLABLE CHIEUCH I PIEUPSIOS -0xAF7A 0xCE6C #HANGUL SYLLABLE CHIEUCH I SSANGSIOS -0xAF81 0xCE6E #HANGUL SYLLABLE CHIEUCH I CIEUC -0xAF82 0xCE6F #HANGUL SYLLABLE CHIEUCH I CHIEUCH -0xAF83 0xCE70 #HANGUL SYLLABLE CHIEUCH I KHIEUKH -0xAF84 0xCE71 #HANGUL SYLLABLE CHIEUCH I THIEUTH -0xAF85 0xCE72 #HANGUL SYLLABLE CHIEUCH I PHIEUPH -0xAF86 0xCE73 #HANGUL SYLLABLE CHIEUCH I HIEUH -0xAF87 0xCE76 #HANGUL SYLLABLE KHIEUKH A SSANGKIYEOK -0xAF88 0xCE77 #HANGUL SYLLABLE KHIEUKH A KIYEOKSIOS -0xAF89 0xCE79 #HANGUL SYLLABLE KHIEUKH A NIEUNCIEUC -0xAF8A 0xCE7A #HANGUL SYLLABLE KHIEUKH A NIEUNHIEUH -0xAF8B 0xCE7B #HANGUL SYLLABLE KHIEUKH A TIKEUT -0xAF8C 0xCE7D #HANGUL SYLLABLE KHIEUKH A RIEULKIYEOK -0xAF8D 0xCE7E #HANGUL SYLLABLE KHIEUKH A RIEULMIEUM -0xAF8E 0xCE7F #HANGUL SYLLABLE KHIEUKH A RIEULPIEUP -0xAF8F 0xCE80 #HANGUL SYLLABLE KHIEUKH A RIEULSIOS -0xAF90 0xCE81 #HANGUL SYLLABLE KHIEUKH A RIEULTHIEUTH -0xAF91 0xCE82 #HANGUL SYLLABLE KHIEUKH A RIEULPHIEUPH -0xAF92 0xCE83 #HANGUL SYLLABLE KHIEUKH A RIEULHIEUH -0xAF93 0xCE86 #HANGUL SYLLABLE KHIEUKH A PIEUPSIOS -0xAF94 0xCE88 #HANGUL SYLLABLE KHIEUKH A SSANGSIOS -0xAF95 0xCE8A #HANGUL SYLLABLE KHIEUKH A CIEUC -0xAF96 0xCE8B #HANGUL SYLLABLE KHIEUKH A CHIEUCH -0xAF97 0xCE8C #HANGUL SYLLABLE KHIEUKH A KHIEUKH -0xAF98 0xCE8D #HANGUL SYLLABLE KHIEUKH A THIEUTH -0xAF99 0xCE8E #HANGUL SYLLABLE KHIEUKH A PHIEUPH -0xAF9A 0xCE8F #HANGUL SYLLABLE KHIEUKH A HIEUH -0xAF9B 0xCE92 #HANGUL SYLLABLE KHIEUKH AE SSANGKIYEOK -0xAF9C 0xCE93 #HANGUL SYLLABLE KHIEUKH AE KIYEOKSIOS -0xAF9D 0xCE95 #HANGUL SYLLABLE KHIEUKH AE NIEUNCIEUC -0xAF9E 0xCE96 #HANGUL SYLLABLE KHIEUKH AE NIEUNHIEUH -0xAF9F 0xCE97 #HANGUL SYLLABLE KHIEUKH AE TIKEUT -0xAFA0 0xCE99 #HANGUL SYLLABLE KHIEUKH AE RIEULKIYEOK -0xB041 0xCE9A #HANGUL SYLLABLE KHIEUKH AE RIEULMIEUM -0xB042 0xCE9B #HANGUL SYLLABLE KHIEUKH AE RIEULPIEUP -0xB043 0xCE9C #HANGUL SYLLABLE KHIEUKH AE RIEULSIOS -0xB044 0xCE9D #HANGUL SYLLABLE KHIEUKH AE RIEULTHIEUTH -0xB045 0xCE9E #HANGUL SYLLABLE KHIEUKH AE RIEULPHIEUPH -0xB046 0xCE9F #HANGUL SYLLABLE KHIEUKH AE RIEULHIEUH -0xB047 0xCEA2 #HANGUL SYLLABLE KHIEUKH AE PIEUPSIOS -0xB048 0xCEA6 #HANGUL SYLLABLE KHIEUKH AE CIEUC -0xB049 0xCEA7 #HANGUL SYLLABLE KHIEUKH AE CHIEUCH -0xB04A 0xCEA8 #HANGUL SYLLABLE KHIEUKH AE KHIEUKH -0xB04B 0xCEA9 #HANGUL SYLLABLE KHIEUKH AE THIEUTH -0xB04C 0xCEAA #HANGUL SYLLABLE KHIEUKH AE PHIEUPH -0xB04D 0xCEAB #HANGUL SYLLABLE KHIEUKH AE HIEUH -0xB04E 0xCEAE #HANGUL SYLLABLE KHIEUKH YA SSANGKIYEOK -0xB04F 0xCEAF #HANGUL SYLLABLE KHIEUKH YA KIYEOKSIOS -0xB050 0xCEB0 #HANGUL SYLLABLE KHIEUKH YA NIEUN -0xB051 0xCEB1 #HANGUL SYLLABLE KHIEUKH YA NIEUNCIEUC -0xB052 0xCEB2 #HANGUL SYLLABLE KHIEUKH YA NIEUNHIEUH -0xB053 0xCEB3 #HANGUL SYLLABLE KHIEUKH YA TIKEUT -0xB054 0xCEB4 #HANGUL SYLLABLE KHIEUKH YA RIEUL -0xB055 0xCEB5 #HANGUL SYLLABLE KHIEUKH YA RIEULKIYEOK -0xB056 0xCEB6 #HANGUL SYLLABLE KHIEUKH YA RIEULMIEUM -0xB057 0xCEB7 #HANGUL SYLLABLE KHIEUKH YA RIEULPIEUP -0xB058 0xCEB8 #HANGUL SYLLABLE KHIEUKH YA RIEULSIOS -0xB059 0xCEB9 #HANGUL SYLLABLE KHIEUKH YA RIEULTHIEUTH -0xB05A 0xCEBA #HANGUL SYLLABLE KHIEUKH YA RIEULPHIEUPH -0xB061 0xCEBB #HANGUL SYLLABLE KHIEUKH YA RIEULHIEUH -0xB062 0xCEBC #HANGUL SYLLABLE KHIEUKH YA MIEUM -0xB063 0xCEBD #HANGUL SYLLABLE KHIEUKH YA PIEUP -0xB064 0xCEBE #HANGUL SYLLABLE KHIEUKH YA PIEUPSIOS -0xB065 0xCEBF #HANGUL SYLLABLE KHIEUKH YA SIOS -0xB066 0xCEC0 #HANGUL SYLLABLE KHIEUKH YA SSANGSIOS -0xB067 0xCEC2 #HANGUL SYLLABLE KHIEUKH YA CIEUC -0xB068 0xCEC3 #HANGUL SYLLABLE KHIEUKH YA CHIEUCH -0xB069 0xCEC4 #HANGUL SYLLABLE KHIEUKH YA KHIEUKH -0xB06A 0xCEC5 #HANGUL SYLLABLE KHIEUKH YA THIEUTH -0xB06B 0xCEC6 #HANGUL SYLLABLE KHIEUKH YA PHIEUPH -0xB06C 0xCEC7 #HANGUL SYLLABLE KHIEUKH YA HIEUH -0xB06D 0xCEC8 #HANGUL SYLLABLE KHIEUKH YAE -0xB06E 0xCEC9 #HANGUL SYLLABLE KHIEUKH YAE KIYEOK -0xB06F 0xCECA #HANGUL SYLLABLE KHIEUKH YAE SSANGKIYEOK -0xB070 0xCECB #HANGUL SYLLABLE KHIEUKH YAE KIYEOKSIOS -0xB071 0xCECC #HANGUL SYLLABLE KHIEUKH YAE NIEUN -0xB072 0xCECD #HANGUL SYLLABLE KHIEUKH YAE NIEUNCIEUC -0xB073 0xCECE #HANGUL SYLLABLE KHIEUKH YAE NIEUNHIEUH -0xB074 0xCECF #HANGUL SYLLABLE KHIEUKH YAE TIKEUT -0xB075 0xCED0 #HANGUL SYLLABLE KHIEUKH YAE RIEUL -0xB076 0xCED1 #HANGUL SYLLABLE KHIEUKH YAE RIEULKIYEOK -0xB077 0xCED2 #HANGUL SYLLABLE KHIEUKH YAE RIEULMIEUM -0xB078 0xCED3 #HANGUL SYLLABLE KHIEUKH YAE RIEULPIEUP -0xB079 0xCED4 #HANGUL SYLLABLE KHIEUKH YAE RIEULSIOS -0xB07A 0xCED5 #HANGUL SYLLABLE KHIEUKH YAE RIEULTHIEUTH -0xB081 0xCED6 #HANGUL SYLLABLE KHIEUKH YAE RIEULPHIEUPH -0xB082 0xCED7 #HANGUL SYLLABLE KHIEUKH YAE RIEULHIEUH -0xB083 0xCED8 #HANGUL SYLLABLE KHIEUKH YAE MIEUM -0xB084 0xCED9 #HANGUL SYLLABLE KHIEUKH YAE PIEUP -0xB085 0xCEDA #HANGUL SYLLABLE KHIEUKH YAE PIEUPSIOS -0xB086 0xCEDB #HANGUL SYLLABLE KHIEUKH YAE SIOS -0xB087 0xCEDC #HANGUL SYLLABLE KHIEUKH YAE SSANGSIOS -0xB088 0xCEDD #HANGUL SYLLABLE KHIEUKH YAE IEUNG -0xB089 0xCEDE #HANGUL SYLLABLE KHIEUKH YAE CIEUC -0xB08A 0xCEDF #HANGUL SYLLABLE KHIEUKH YAE CHIEUCH -0xB08B 0xCEE0 #HANGUL SYLLABLE KHIEUKH YAE KHIEUKH -0xB08C 0xCEE1 #HANGUL SYLLABLE KHIEUKH YAE THIEUTH -0xB08D 0xCEE2 #HANGUL SYLLABLE KHIEUKH YAE PHIEUPH -0xB08E 0xCEE3 #HANGUL SYLLABLE KHIEUKH YAE HIEUH -0xB08F 0xCEE6 #HANGUL SYLLABLE KHIEUKH EO SSANGKIYEOK -0xB090 0xCEE7 #HANGUL SYLLABLE KHIEUKH EO KIYEOKSIOS -0xB091 0xCEE9 #HANGUL SYLLABLE KHIEUKH EO NIEUNCIEUC -0xB092 0xCEEA #HANGUL SYLLABLE KHIEUKH EO NIEUNHIEUH -0xB093 0xCEED #HANGUL SYLLABLE KHIEUKH EO RIEULKIYEOK -0xB094 0xCEEE #HANGUL SYLLABLE KHIEUKH EO RIEULMIEUM -0xB095 0xCEEF #HANGUL SYLLABLE KHIEUKH EO RIEULPIEUP -0xB096 0xCEF0 #HANGUL SYLLABLE KHIEUKH EO RIEULSIOS -0xB097 0xCEF1 #HANGUL SYLLABLE KHIEUKH EO RIEULTHIEUTH -0xB098 0xCEF2 #HANGUL SYLLABLE KHIEUKH EO RIEULPHIEUPH -0xB099 0xCEF3 #HANGUL SYLLABLE KHIEUKH EO RIEULHIEUH -0xB09A 0xCEF6 #HANGUL SYLLABLE KHIEUKH EO PIEUPSIOS -0xB09B 0xCEFA #HANGUL SYLLABLE KHIEUKH EO CIEUC -0xB09C 0xCEFB #HANGUL SYLLABLE KHIEUKH EO CHIEUCH -0xB09D 0xCEFC #HANGUL SYLLABLE KHIEUKH EO KHIEUKH -0xB09E 0xCEFD #HANGUL SYLLABLE KHIEUKH EO THIEUTH -0xB09F 0xCEFE #HANGUL SYLLABLE KHIEUKH EO PHIEUPH -0xB0A0 0xCEFF #HANGUL SYLLABLE KHIEUKH EO HIEUH -0xB0A1 0xAC00 #HANGUL SYLLABLE KIYEOK A -0xB0A2 0xAC01 #HANGUL SYLLABLE KIYEOK A KIYEOK -0xB0A3 0xAC04 #HANGUL SYLLABLE KIYEOK A NIEUN -0xB0A4 0xAC07 #HANGUL SYLLABLE KIYEOK A TIKEUT -0xB0A5 0xAC08 #HANGUL SYLLABLE KIYEOK A RIEUL -0xB0A6 0xAC09 #HANGUL SYLLABLE KIYEOK A RIEULKIYEOK -0xB0A7 0xAC0A #HANGUL SYLLABLE KIYEOK A RIEULMIEUM -0xB0A8 0xAC10 #HANGUL SYLLABLE KIYEOK A MIEUM -0xB0A9 0xAC11 #HANGUL SYLLABLE KIYEOK A PIEUP -0xB0AA 0xAC12 #HANGUL SYLLABLE KIYEOK A PIEUPSIOS -0xB0AB 0xAC13 #HANGUL SYLLABLE KIYEOK A SIOS -0xB0AC 0xAC14 #HANGUL SYLLABLE KIYEOK A SSANGSIOS -0xB0AD 0xAC15 #HANGUL SYLLABLE KIYEOK A IEUNG -0xB0AE 0xAC16 #HANGUL SYLLABLE KIYEOK A CIEUC -0xB0AF 0xAC17 #HANGUL SYLLABLE KIYEOK A CHIEUCH -0xB0B0 0xAC19 #HANGUL SYLLABLE KIYEOK A THIEUTH -0xB0B1 0xAC1A #HANGUL SYLLABLE KIYEOK A PHIEUPH -0xB0B2 0xAC1B #HANGUL SYLLABLE KIYEOK A HIEUH -0xB0B3 0xAC1C #HANGUL SYLLABLE KIYEOK AE -0xB0B4 0xAC1D #HANGUL SYLLABLE KIYEOK AE KIYEOK -0xB0B5 0xAC20 #HANGUL SYLLABLE KIYEOK AE NIEUN -0xB0B6 0xAC24 #HANGUL SYLLABLE KIYEOK AE RIEUL -0xB0B7 0xAC2C #HANGUL SYLLABLE KIYEOK AE MIEUM -0xB0B8 0xAC2D #HANGUL SYLLABLE KIYEOK AE PIEUP -0xB0B9 0xAC2F #HANGUL SYLLABLE KIYEOK AE SIOS -0xB0BA 0xAC30 #HANGUL SYLLABLE KIYEOK AE SSANGSIOS -0xB0BB 0xAC31 #HANGUL SYLLABLE KIYEOK AE IEUNG -0xB0BC 0xAC38 #HANGUL SYLLABLE KIYEOK YA -0xB0BD 0xAC39 #HANGUL SYLLABLE KIYEOK YA KIYEOK -0xB0BE 0xAC3C #HANGUL SYLLABLE KIYEOK YA NIEUN -0xB0BF 0xAC40 #HANGUL SYLLABLE KIYEOK YA RIEUL -0xB0C0 0xAC4B #HANGUL SYLLABLE KIYEOK YA SIOS -0xB0C1 0xAC4D #HANGUL SYLLABLE KIYEOK YA IEUNG -0xB0C2 0xAC54 #HANGUL SYLLABLE KIYEOK YAE -0xB0C3 0xAC58 #HANGUL SYLLABLE KIYEOK YAE NIEUN -0xB0C4 0xAC5C #HANGUL SYLLABLE KIYEOK YAE RIEUL -0xB0C5 0xAC70 #HANGUL SYLLABLE KIYEOK EO -0xB0C6 0xAC71 #HANGUL SYLLABLE KIYEOK EO KIYEOK -0xB0C7 0xAC74 #HANGUL SYLLABLE KIYEOK EO NIEUN -0xB0C8 0xAC77 #HANGUL SYLLABLE KIYEOK EO TIKEUT -0xB0C9 0xAC78 #HANGUL SYLLABLE KIYEOK EO RIEUL -0xB0CA 0xAC7A #HANGUL SYLLABLE KIYEOK EO RIEULMIEUM -0xB0CB 0xAC80 #HANGUL SYLLABLE KIYEOK EO MIEUM -0xB0CC 0xAC81 #HANGUL SYLLABLE KIYEOK EO PIEUP -0xB0CD 0xAC83 #HANGUL SYLLABLE KIYEOK EO SIOS -0xB0CE 0xAC84 #HANGUL SYLLABLE KIYEOK EO SSANGSIOS -0xB0CF 0xAC85 #HANGUL SYLLABLE KIYEOK EO IEUNG -0xB0D0 0xAC86 #HANGUL SYLLABLE KIYEOK EO CIEUC -0xB0D1 0xAC89 #HANGUL SYLLABLE KIYEOK EO THIEUTH -0xB0D2 0xAC8A #HANGUL SYLLABLE KIYEOK EO PHIEUPH -0xB0D3 0xAC8B #HANGUL SYLLABLE KIYEOK EO HIEUH -0xB0D4 0xAC8C #HANGUL SYLLABLE KIYEOK E -0xB0D5 0xAC90 #HANGUL SYLLABLE KIYEOK E NIEUN -0xB0D6 0xAC94 #HANGUL SYLLABLE KIYEOK E RIEUL -0xB0D7 0xAC9C #HANGUL SYLLABLE KIYEOK E MIEUM -0xB0D8 0xAC9D #HANGUL SYLLABLE KIYEOK E PIEUP -0xB0D9 0xAC9F #HANGUL SYLLABLE KIYEOK E SIOS -0xB0DA 0xACA0 #HANGUL SYLLABLE KIYEOK E SSANGSIOS -0xB0DB 0xACA1 #HANGUL SYLLABLE KIYEOK E IEUNG -0xB0DC 0xACA8 #HANGUL SYLLABLE KIYEOK YEO -0xB0DD 0xACA9 #HANGUL SYLLABLE KIYEOK YEO KIYEOK -0xB0DE 0xACAA #HANGUL SYLLABLE KIYEOK YEO SSANGKIYEOK -0xB0DF 0xACAC #HANGUL SYLLABLE KIYEOK YEO NIEUN -0xB0E0 0xACAF #HANGUL SYLLABLE KIYEOK YEO TIKEUT -0xB0E1 0xACB0 #HANGUL SYLLABLE KIYEOK YEO RIEUL -0xB0E2 0xACB8 #HANGUL SYLLABLE KIYEOK YEO MIEUM -0xB0E3 0xACB9 #HANGUL SYLLABLE KIYEOK YEO PIEUP -0xB0E4 0xACBB #HANGUL SYLLABLE KIYEOK YEO SIOS -0xB0E5 0xACBC #HANGUL SYLLABLE KIYEOK YEO SSANGSIOS -0xB0E6 0xACBD #HANGUL SYLLABLE KIYEOK YEO IEUNG -0xB0E7 0xACC1 #HANGUL SYLLABLE KIYEOK YEO THIEUTH -0xB0E8 0xACC4 #HANGUL SYLLABLE KIYEOK YE -0xB0E9 0xACC8 #HANGUL SYLLABLE KIYEOK YE NIEUN -0xB0EA 0xACCC #HANGUL SYLLABLE KIYEOK YE RIEUL -0xB0EB 0xACD5 #HANGUL SYLLABLE KIYEOK YE PIEUP -0xB0EC 0xACD7 #HANGUL SYLLABLE KIYEOK YE SIOS -0xB0ED 0xACE0 #HANGUL SYLLABLE KIYEOK O -0xB0EE 0xACE1 #HANGUL SYLLABLE KIYEOK O KIYEOK -0xB0EF 0xACE4 #HANGUL SYLLABLE KIYEOK O NIEUN -0xB0F0 0xACE7 #HANGUL SYLLABLE KIYEOK O TIKEUT -0xB0F1 0xACE8 #HANGUL SYLLABLE KIYEOK O RIEUL -0xB0F2 0xACEA #HANGUL SYLLABLE KIYEOK O RIEULMIEUM -0xB0F3 0xACEC #HANGUL SYLLABLE KIYEOK O RIEULSIOS -0xB0F4 0xACEF #HANGUL SYLLABLE KIYEOK O RIEULHIEUH -0xB0F5 0xACF0 #HANGUL SYLLABLE KIYEOK O MIEUM -0xB0F6 0xACF1 #HANGUL SYLLABLE KIYEOK O PIEUP -0xB0F7 0xACF3 #HANGUL SYLLABLE KIYEOK O SIOS -0xB0F8 0xACF5 #HANGUL SYLLABLE KIYEOK O IEUNG -0xB0F9 0xACF6 #HANGUL SYLLABLE KIYEOK O CIEUC -0xB0FA 0xACFC #HANGUL SYLLABLE KIYEOK WA -0xB0FB 0xACFD #HANGUL SYLLABLE KIYEOK WA KIYEOK -0xB0FC 0xAD00 #HANGUL SYLLABLE KIYEOK WA NIEUN -0xB0FD 0xAD04 #HANGUL SYLLABLE KIYEOK WA RIEUL -0xB0FE 0xAD06 #HANGUL SYLLABLE KIYEOK WA RIEULMIEUM -0xB141 0xCF02 #HANGUL SYLLABLE KHIEUKH E SSANGKIYEOK -0xB142 0xCF03 #HANGUL SYLLABLE KHIEUKH E KIYEOKSIOS -0xB143 0xCF05 #HANGUL SYLLABLE KHIEUKH E NIEUNCIEUC -0xB144 0xCF06 #HANGUL SYLLABLE KHIEUKH E NIEUNHIEUH -0xB145 0xCF07 #HANGUL SYLLABLE KHIEUKH E TIKEUT -0xB146 0xCF09 #HANGUL SYLLABLE KHIEUKH E RIEULKIYEOK -0xB147 0xCF0A #HANGUL SYLLABLE KHIEUKH E RIEULMIEUM -0xB148 0xCF0B #HANGUL SYLLABLE KHIEUKH E RIEULPIEUP -0xB149 0xCF0C #HANGUL SYLLABLE KHIEUKH E RIEULSIOS -0xB14A 0xCF0D #HANGUL SYLLABLE KHIEUKH E RIEULTHIEUTH -0xB14B 0xCF0E #HANGUL SYLLABLE KHIEUKH E RIEULPHIEUPH -0xB14C 0xCF0F #HANGUL SYLLABLE KHIEUKH E RIEULHIEUH -0xB14D 0xCF12 #HANGUL SYLLABLE KHIEUKH E PIEUPSIOS -0xB14E 0xCF14 #HANGUL SYLLABLE KHIEUKH E SSANGSIOS -0xB14F 0xCF16 #HANGUL SYLLABLE KHIEUKH E CIEUC -0xB150 0xCF17 #HANGUL SYLLABLE KHIEUKH E CHIEUCH -0xB151 0xCF18 #HANGUL SYLLABLE KHIEUKH E KHIEUKH -0xB152 0xCF19 #HANGUL SYLLABLE KHIEUKH E THIEUTH -0xB153 0xCF1A #HANGUL SYLLABLE KHIEUKH E PHIEUPH -0xB154 0xCF1B #HANGUL SYLLABLE KHIEUKH E HIEUH -0xB155 0xCF1D #HANGUL SYLLABLE KHIEUKH YEO KIYEOK -0xB156 0xCF1E #HANGUL SYLLABLE KHIEUKH YEO SSANGKIYEOK -0xB157 0xCF1F #HANGUL SYLLABLE KHIEUKH YEO KIYEOKSIOS -0xB158 0xCF21 #HANGUL SYLLABLE KHIEUKH YEO NIEUNCIEUC -0xB159 0xCF22 #HANGUL SYLLABLE KHIEUKH YEO NIEUNHIEUH -0xB15A 0xCF23 #HANGUL SYLLABLE KHIEUKH YEO TIKEUT -0xB161 0xCF25 #HANGUL SYLLABLE KHIEUKH YEO RIEULKIYEOK -0xB162 0xCF26 #HANGUL SYLLABLE KHIEUKH YEO RIEULMIEUM -0xB163 0xCF27 #HANGUL SYLLABLE KHIEUKH YEO RIEULPIEUP -0xB164 0xCF28 #HANGUL SYLLABLE KHIEUKH YEO RIEULSIOS -0xB165 0xCF29 #HANGUL SYLLABLE KHIEUKH YEO RIEULTHIEUTH -0xB166 0xCF2A #HANGUL SYLLABLE KHIEUKH YEO RIEULPHIEUPH -0xB167 0xCF2B #HANGUL SYLLABLE KHIEUKH YEO RIEULHIEUH -0xB168 0xCF2E #HANGUL SYLLABLE KHIEUKH YEO PIEUPSIOS -0xB169 0xCF32 #HANGUL SYLLABLE KHIEUKH YEO CIEUC -0xB16A 0xCF33 #HANGUL SYLLABLE KHIEUKH YEO CHIEUCH -0xB16B 0xCF34 #HANGUL SYLLABLE KHIEUKH YEO KHIEUKH -0xB16C 0xCF35 #HANGUL SYLLABLE KHIEUKH YEO THIEUTH -0xB16D 0xCF36 #HANGUL SYLLABLE KHIEUKH YEO PHIEUPH -0xB16E 0xCF37 #HANGUL SYLLABLE KHIEUKH YEO HIEUH -0xB16F 0xCF39 #HANGUL SYLLABLE KHIEUKH YE KIYEOK -0xB170 0xCF3A #HANGUL SYLLABLE KHIEUKH YE SSANGKIYEOK -0xB171 0xCF3B #HANGUL SYLLABLE KHIEUKH YE KIYEOKSIOS -0xB172 0xCF3C #HANGUL SYLLABLE KHIEUKH YE NIEUN -0xB173 0xCF3D #HANGUL SYLLABLE KHIEUKH YE NIEUNCIEUC -0xB174 0xCF3E #HANGUL SYLLABLE KHIEUKH YE NIEUNHIEUH -0xB175 0xCF3F #HANGUL SYLLABLE KHIEUKH YE TIKEUT -0xB176 0xCF40 #HANGUL SYLLABLE KHIEUKH YE RIEUL -0xB177 0xCF41 #HANGUL SYLLABLE KHIEUKH YE RIEULKIYEOK -0xB178 0xCF42 #HANGUL SYLLABLE KHIEUKH YE RIEULMIEUM -0xB179 0xCF43 #HANGUL SYLLABLE KHIEUKH YE RIEULPIEUP -0xB17A 0xCF44 #HANGUL SYLLABLE KHIEUKH YE RIEULSIOS -0xB181 0xCF45 #HANGUL SYLLABLE KHIEUKH YE RIEULTHIEUTH -0xB182 0xCF46 #HANGUL SYLLABLE KHIEUKH YE RIEULPHIEUPH -0xB183 0xCF47 #HANGUL SYLLABLE KHIEUKH YE RIEULHIEUH -0xB184 0xCF48 #HANGUL SYLLABLE KHIEUKH YE MIEUM -0xB185 0xCF49 #HANGUL SYLLABLE KHIEUKH YE PIEUP -0xB186 0xCF4A #HANGUL SYLLABLE KHIEUKH YE PIEUPSIOS -0xB187 0xCF4B #HANGUL SYLLABLE KHIEUKH YE SIOS -0xB188 0xCF4C #HANGUL SYLLABLE KHIEUKH YE SSANGSIOS -0xB189 0xCF4D #HANGUL SYLLABLE KHIEUKH YE IEUNG -0xB18A 0xCF4E #HANGUL SYLLABLE KHIEUKH YE CIEUC -0xB18B 0xCF4F #HANGUL SYLLABLE KHIEUKH YE CHIEUCH -0xB18C 0xCF50 #HANGUL SYLLABLE KHIEUKH YE KHIEUKH -0xB18D 0xCF51 #HANGUL SYLLABLE KHIEUKH YE THIEUTH -0xB18E 0xCF52 #HANGUL SYLLABLE KHIEUKH YE PHIEUPH -0xB18F 0xCF53 #HANGUL SYLLABLE KHIEUKH YE HIEUH -0xB190 0xCF56 #HANGUL SYLLABLE KHIEUKH O SSANGKIYEOK -0xB191 0xCF57 #HANGUL SYLLABLE KHIEUKH O KIYEOKSIOS -0xB192 0xCF59 #HANGUL SYLLABLE KHIEUKH O NIEUNCIEUC -0xB193 0xCF5A #HANGUL SYLLABLE KHIEUKH O NIEUNHIEUH -0xB194 0xCF5B #HANGUL SYLLABLE KHIEUKH O TIKEUT -0xB195 0xCF5D #HANGUL SYLLABLE KHIEUKH O RIEULKIYEOK -0xB196 0xCF5E #HANGUL SYLLABLE KHIEUKH O RIEULMIEUM -0xB197 0xCF5F #HANGUL SYLLABLE KHIEUKH O RIEULPIEUP -0xB198 0xCF60 #HANGUL SYLLABLE KHIEUKH O RIEULSIOS -0xB199 0xCF61 #HANGUL SYLLABLE KHIEUKH O RIEULTHIEUTH -0xB19A 0xCF62 #HANGUL SYLLABLE KHIEUKH O RIEULPHIEUPH -0xB19B 0xCF63 #HANGUL SYLLABLE KHIEUKH O RIEULHIEUH -0xB19C 0xCF66 #HANGUL SYLLABLE KHIEUKH O PIEUPSIOS -0xB19D 0xCF68 #HANGUL SYLLABLE KHIEUKH O SSANGSIOS -0xB19E 0xCF6A #HANGUL SYLLABLE KHIEUKH O CIEUC -0xB19F 0xCF6B #HANGUL SYLLABLE KHIEUKH O CHIEUCH -0xB1A0 0xCF6C #HANGUL SYLLABLE KHIEUKH O KHIEUKH -0xB1A1 0xAD0C #HANGUL SYLLABLE KIYEOK WA MIEUM -0xB1A2 0xAD0D #HANGUL SYLLABLE KIYEOK WA PIEUP -0xB1A3 0xAD0F #HANGUL SYLLABLE KIYEOK WA SIOS -0xB1A4 0xAD11 #HANGUL SYLLABLE KIYEOK WA IEUNG -0xB1A5 0xAD18 #HANGUL SYLLABLE KIYEOK WAE -0xB1A6 0xAD1C #HANGUL SYLLABLE KIYEOK WAE NIEUN -0xB1A7 0xAD20 #HANGUL SYLLABLE KIYEOK WAE RIEUL -0xB1A8 0xAD29 #HANGUL SYLLABLE KIYEOK WAE PIEUP -0xB1A9 0xAD2C #HANGUL SYLLABLE KIYEOK WAE SSANGSIOS -0xB1AA 0xAD2D #HANGUL SYLLABLE KIYEOK WAE IEUNG -0xB1AB 0xAD34 #HANGUL SYLLABLE KIYEOK OE -0xB1AC 0xAD35 #HANGUL SYLLABLE KIYEOK OE KIYEOK -0xB1AD 0xAD38 #HANGUL SYLLABLE KIYEOK OE NIEUN -0xB1AE 0xAD3C #HANGUL SYLLABLE KIYEOK OE RIEUL -0xB1AF 0xAD44 #HANGUL SYLLABLE KIYEOK OE MIEUM -0xB1B0 0xAD45 #HANGUL SYLLABLE KIYEOK OE PIEUP -0xB1B1 0xAD47 #HANGUL SYLLABLE KIYEOK OE SIOS -0xB1B2 0xAD49 #HANGUL SYLLABLE KIYEOK OE IEUNG -0xB1B3 0xAD50 #HANGUL SYLLABLE KIYEOK YO -0xB1B4 0xAD54 #HANGUL SYLLABLE KIYEOK YO NIEUN -0xB1B5 0xAD58 #HANGUL SYLLABLE KIYEOK YO RIEUL -0xB1B6 0xAD61 #HANGUL SYLLABLE KIYEOK YO PIEUP -0xB1B7 0xAD63 #HANGUL SYLLABLE KIYEOK YO SIOS -0xB1B8 0xAD6C #HANGUL SYLLABLE KIYEOK U -0xB1B9 0xAD6D #HANGUL SYLLABLE KIYEOK U KIYEOK -0xB1BA 0xAD70 #HANGUL SYLLABLE KIYEOK U NIEUN -0xB1BB 0xAD73 #HANGUL SYLLABLE KIYEOK U TIKEUT -0xB1BC 0xAD74 #HANGUL SYLLABLE KIYEOK U RIEUL -0xB1BD 0xAD75 #HANGUL SYLLABLE KIYEOK U RIEULKIYEOK -0xB1BE 0xAD76 #HANGUL SYLLABLE KIYEOK U RIEULMIEUM -0xB1BF 0xAD7B #HANGUL SYLLABLE KIYEOK U RIEULHIEUH -0xB1C0 0xAD7C #HANGUL SYLLABLE KIYEOK U MIEUM -0xB1C1 0xAD7D #HANGUL SYLLABLE KIYEOK U PIEUP -0xB1C2 0xAD7F #HANGUL SYLLABLE KIYEOK U SIOS -0xB1C3 0xAD81 #HANGUL SYLLABLE KIYEOK U IEUNG -0xB1C4 0xAD82 #HANGUL SYLLABLE KIYEOK U CIEUC -0xB1C5 0xAD88 #HANGUL SYLLABLE KIYEOK WEO -0xB1C6 0xAD89 #HANGUL SYLLABLE KIYEOK WEO KIYEOK -0xB1C7 0xAD8C #HANGUL SYLLABLE KIYEOK WEO NIEUN -0xB1C8 0xAD90 #HANGUL SYLLABLE KIYEOK WEO RIEUL -0xB1C9 0xAD9C #HANGUL SYLLABLE KIYEOK WEO SSANGSIOS -0xB1CA 0xAD9D #HANGUL SYLLABLE KIYEOK WEO IEUNG -0xB1CB 0xADA4 #HANGUL SYLLABLE KIYEOK WE -0xB1CC 0xADB7 #HANGUL SYLLABLE KIYEOK WE SIOS -0xB1CD 0xADC0 #HANGUL SYLLABLE KIYEOK WI -0xB1CE 0xADC1 #HANGUL SYLLABLE KIYEOK WI KIYEOK -0xB1CF 0xADC4 #HANGUL SYLLABLE KIYEOK WI NIEUN -0xB1D0 0xADC8 #HANGUL SYLLABLE KIYEOK WI RIEUL -0xB1D1 0xADD0 #HANGUL SYLLABLE KIYEOK WI MIEUM -0xB1D2 0xADD1 #HANGUL SYLLABLE KIYEOK WI PIEUP -0xB1D3 0xADD3 #HANGUL SYLLABLE KIYEOK WI SIOS -0xB1D4 0xADDC #HANGUL SYLLABLE KIYEOK YU -0xB1D5 0xADE0 #HANGUL SYLLABLE KIYEOK YU NIEUN -0xB1D6 0xADE4 #HANGUL SYLLABLE KIYEOK YU RIEUL -0xB1D7 0xADF8 #HANGUL SYLLABLE KIYEOK EU -0xB1D8 0xADF9 #HANGUL SYLLABLE KIYEOK EU KIYEOK -0xB1D9 0xADFC #HANGUL SYLLABLE KIYEOK EU NIEUN -0xB1DA 0xADFF #HANGUL SYLLABLE KIYEOK EU TIKEUT -0xB1DB 0xAE00 #HANGUL SYLLABLE KIYEOK EU RIEUL -0xB1DC 0xAE01 #HANGUL SYLLABLE KIYEOK EU RIEULKIYEOK -0xB1DD 0xAE08 #HANGUL SYLLABLE KIYEOK EU MIEUM -0xB1DE 0xAE09 #HANGUL SYLLABLE KIYEOK EU PIEUP -0xB1DF 0xAE0B #HANGUL SYLLABLE KIYEOK EU SIOS -0xB1E0 0xAE0D #HANGUL SYLLABLE KIYEOK EU IEUNG -0xB1E1 0xAE14 #HANGUL SYLLABLE KIYEOK YI -0xB1E2 0xAE30 #HANGUL SYLLABLE KIYEOK I -0xB1E3 0xAE31 #HANGUL SYLLABLE KIYEOK I KIYEOK -0xB1E4 0xAE34 #HANGUL SYLLABLE KIYEOK I NIEUN -0xB1E5 0xAE37 #HANGUL SYLLABLE KIYEOK I TIKEUT -0xB1E6 0xAE38 #HANGUL SYLLABLE KIYEOK I RIEUL -0xB1E7 0xAE3A #HANGUL SYLLABLE KIYEOK I RIEULMIEUM -0xB1E8 0xAE40 #HANGUL SYLLABLE KIYEOK I MIEUM -0xB1E9 0xAE41 #HANGUL SYLLABLE KIYEOK I PIEUP -0xB1EA 0xAE43 #HANGUL SYLLABLE KIYEOK I SIOS -0xB1EB 0xAE45 #HANGUL SYLLABLE KIYEOK I IEUNG -0xB1EC 0xAE46 #HANGUL SYLLABLE KIYEOK I CIEUC -0xB1ED 0xAE4A #HANGUL SYLLABLE KIYEOK I PHIEUPH -0xB1EE 0xAE4C #HANGUL SYLLABLE SSANGKIYEOK A -0xB1EF 0xAE4D #HANGUL SYLLABLE SSANGKIYEOK A KIYEOK -0xB1F0 0xAE4E #HANGUL SYLLABLE SSANGKIYEOK A SSANGKIYEOK -0xB1F1 0xAE50 #HANGUL SYLLABLE SSANGKIYEOK A NIEUN -0xB1F2 0xAE54 #HANGUL SYLLABLE SSANGKIYEOK A RIEUL -0xB1F3 0xAE56 #HANGUL SYLLABLE SSANGKIYEOK A RIEULMIEUM -0xB1F4 0xAE5C #HANGUL SYLLABLE SSANGKIYEOK A MIEUM -0xB1F5 0xAE5D #HANGUL SYLLABLE SSANGKIYEOK A PIEUP -0xB1F6 0xAE5F #HANGUL SYLLABLE SSANGKIYEOK A SIOS -0xB1F7 0xAE60 #HANGUL SYLLABLE SSANGKIYEOK A SSANGSIOS -0xB1F8 0xAE61 #HANGUL SYLLABLE SSANGKIYEOK A IEUNG -0xB1F9 0xAE65 #HANGUL SYLLABLE SSANGKIYEOK A THIEUTH -0xB1FA 0xAE68 #HANGUL SYLLABLE SSANGKIYEOK AE -0xB1FB 0xAE69 #HANGUL SYLLABLE SSANGKIYEOK AE KIYEOK -0xB1FC 0xAE6C #HANGUL SYLLABLE SSANGKIYEOK AE NIEUN -0xB1FD 0xAE70 #HANGUL SYLLABLE SSANGKIYEOK AE RIEUL -0xB1FE 0xAE78 #HANGUL SYLLABLE SSANGKIYEOK AE MIEUM -0xB241 0xCF6D #HANGUL SYLLABLE KHIEUKH O THIEUTH -0xB242 0xCF6E #HANGUL SYLLABLE KHIEUKH O PHIEUPH -0xB243 0xCF6F #HANGUL SYLLABLE KHIEUKH O HIEUH -0xB244 0xCF72 #HANGUL SYLLABLE KHIEUKH WA SSANGKIYEOK -0xB245 0xCF73 #HANGUL SYLLABLE KHIEUKH WA KIYEOKSIOS -0xB246 0xCF75 #HANGUL SYLLABLE KHIEUKH WA NIEUNCIEUC -0xB247 0xCF76 #HANGUL SYLLABLE KHIEUKH WA NIEUNHIEUH -0xB248 0xCF77 #HANGUL SYLLABLE KHIEUKH WA TIKEUT -0xB249 0xCF79 #HANGUL SYLLABLE KHIEUKH WA RIEULKIYEOK -0xB24A 0xCF7A #HANGUL SYLLABLE KHIEUKH WA RIEULMIEUM -0xB24B 0xCF7B #HANGUL SYLLABLE KHIEUKH WA RIEULPIEUP -0xB24C 0xCF7C #HANGUL SYLLABLE KHIEUKH WA RIEULSIOS -0xB24D 0xCF7D #HANGUL SYLLABLE KHIEUKH WA RIEULTHIEUTH -0xB24E 0xCF7E #HANGUL SYLLABLE KHIEUKH WA RIEULPHIEUPH -0xB24F 0xCF7F #HANGUL SYLLABLE KHIEUKH WA RIEULHIEUH -0xB250 0xCF81 #HANGUL SYLLABLE KHIEUKH WA PIEUP -0xB251 0xCF82 #HANGUL SYLLABLE KHIEUKH WA PIEUPSIOS -0xB252 0xCF83 #HANGUL SYLLABLE KHIEUKH WA SIOS -0xB253 0xCF84 #HANGUL SYLLABLE KHIEUKH WA SSANGSIOS -0xB254 0xCF86 #HANGUL SYLLABLE KHIEUKH WA CIEUC -0xB255 0xCF87 #HANGUL SYLLABLE KHIEUKH WA CHIEUCH -0xB256 0xCF88 #HANGUL SYLLABLE KHIEUKH WA KHIEUKH -0xB257 0xCF89 #HANGUL SYLLABLE KHIEUKH WA THIEUTH -0xB258 0xCF8A #HANGUL SYLLABLE KHIEUKH WA PHIEUPH -0xB259 0xCF8B #HANGUL SYLLABLE KHIEUKH WA HIEUH -0xB25A 0xCF8D #HANGUL SYLLABLE KHIEUKH WAE KIYEOK -0xB261 0xCF8E #HANGUL SYLLABLE KHIEUKH WAE SSANGKIYEOK -0xB262 0xCF8F #HANGUL SYLLABLE KHIEUKH WAE KIYEOKSIOS -0xB263 0xCF90 #HANGUL SYLLABLE KHIEUKH WAE NIEUN -0xB264 0xCF91 #HANGUL SYLLABLE KHIEUKH WAE NIEUNCIEUC -0xB265 0xCF92 #HANGUL SYLLABLE KHIEUKH WAE NIEUNHIEUH -0xB266 0xCF93 #HANGUL SYLLABLE KHIEUKH WAE TIKEUT -0xB267 0xCF94 #HANGUL SYLLABLE KHIEUKH WAE RIEUL -0xB268 0xCF95 #HANGUL SYLLABLE KHIEUKH WAE RIEULKIYEOK -0xB269 0xCF96 #HANGUL SYLLABLE KHIEUKH WAE RIEULMIEUM -0xB26A 0xCF97 #HANGUL SYLLABLE KHIEUKH WAE RIEULPIEUP -0xB26B 0xCF98 #HANGUL SYLLABLE KHIEUKH WAE RIEULSIOS -0xB26C 0xCF99 #HANGUL SYLLABLE KHIEUKH WAE RIEULTHIEUTH -0xB26D 0xCF9A #HANGUL SYLLABLE KHIEUKH WAE RIEULPHIEUPH -0xB26E 0xCF9B #HANGUL SYLLABLE KHIEUKH WAE RIEULHIEUH -0xB26F 0xCF9C #HANGUL SYLLABLE KHIEUKH WAE MIEUM -0xB270 0xCF9D #HANGUL SYLLABLE KHIEUKH WAE PIEUP -0xB271 0xCF9E #HANGUL SYLLABLE KHIEUKH WAE PIEUPSIOS -0xB272 0xCF9F #HANGUL SYLLABLE KHIEUKH WAE SIOS -0xB273 0xCFA0 #HANGUL SYLLABLE KHIEUKH WAE SSANGSIOS -0xB274 0xCFA2 #HANGUL SYLLABLE KHIEUKH WAE CIEUC -0xB275 0xCFA3 #HANGUL SYLLABLE KHIEUKH WAE CHIEUCH -0xB276 0xCFA4 #HANGUL SYLLABLE KHIEUKH WAE KHIEUKH -0xB277 0xCFA5 #HANGUL SYLLABLE KHIEUKH WAE THIEUTH -0xB278 0xCFA6 #HANGUL SYLLABLE KHIEUKH WAE PHIEUPH -0xB279 0xCFA7 #HANGUL SYLLABLE KHIEUKH WAE HIEUH -0xB27A 0xCFA9 #HANGUL SYLLABLE KHIEUKH OE KIYEOK -0xB281 0xCFAA #HANGUL SYLLABLE KHIEUKH OE SSANGKIYEOK -0xB282 0xCFAB #HANGUL SYLLABLE KHIEUKH OE KIYEOKSIOS -0xB283 0xCFAC #HANGUL SYLLABLE KHIEUKH OE NIEUN -0xB284 0xCFAD #HANGUL SYLLABLE KHIEUKH OE NIEUNCIEUC -0xB285 0xCFAE #HANGUL SYLLABLE KHIEUKH OE NIEUNHIEUH -0xB286 0xCFAF #HANGUL SYLLABLE KHIEUKH OE TIKEUT -0xB287 0xCFB1 #HANGUL SYLLABLE KHIEUKH OE RIEULKIYEOK -0xB288 0xCFB2 #HANGUL SYLLABLE KHIEUKH OE RIEULMIEUM -0xB289 0xCFB3 #HANGUL SYLLABLE KHIEUKH OE RIEULPIEUP -0xB28A 0xCFB4 #HANGUL SYLLABLE KHIEUKH OE RIEULSIOS -0xB28B 0xCFB5 #HANGUL SYLLABLE KHIEUKH OE RIEULTHIEUTH -0xB28C 0xCFB6 #HANGUL SYLLABLE KHIEUKH OE RIEULPHIEUPH -0xB28D 0xCFB7 #HANGUL SYLLABLE KHIEUKH OE RIEULHIEUH -0xB28E 0xCFB8 #HANGUL SYLLABLE KHIEUKH OE MIEUM -0xB28F 0xCFB9 #HANGUL SYLLABLE KHIEUKH OE PIEUP -0xB290 0xCFBA #HANGUL SYLLABLE KHIEUKH OE PIEUPSIOS -0xB291 0xCFBB #HANGUL SYLLABLE KHIEUKH OE SIOS -0xB292 0xCFBC #HANGUL SYLLABLE KHIEUKH OE SSANGSIOS -0xB293 0xCFBD #HANGUL SYLLABLE KHIEUKH OE IEUNG -0xB294 0xCFBE #HANGUL SYLLABLE KHIEUKH OE CIEUC -0xB295 0xCFBF #HANGUL SYLLABLE KHIEUKH OE CHIEUCH -0xB296 0xCFC0 #HANGUL SYLLABLE KHIEUKH OE KHIEUKH -0xB297 0xCFC1 #HANGUL SYLLABLE KHIEUKH OE THIEUTH -0xB298 0xCFC2 #HANGUL SYLLABLE KHIEUKH OE PHIEUPH -0xB299 0xCFC3 #HANGUL SYLLABLE KHIEUKH OE HIEUH -0xB29A 0xCFC5 #HANGUL SYLLABLE KHIEUKH YO KIYEOK -0xB29B 0xCFC6 #HANGUL SYLLABLE KHIEUKH YO SSANGKIYEOK -0xB29C 0xCFC7 #HANGUL SYLLABLE KHIEUKH YO KIYEOKSIOS -0xB29D 0xCFC8 #HANGUL SYLLABLE KHIEUKH YO NIEUN -0xB29E 0xCFC9 #HANGUL SYLLABLE KHIEUKH YO NIEUNCIEUC -0xB29F 0xCFCA #HANGUL SYLLABLE KHIEUKH YO NIEUNHIEUH -0xB2A0 0xCFCB #HANGUL SYLLABLE KHIEUKH YO TIKEUT -0xB2A1 0xAE79 #HANGUL SYLLABLE SSANGKIYEOK AE PIEUP -0xB2A2 0xAE7B #HANGUL SYLLABLE SSANGKIYEOK AE SIOS -0xB2A3 0xAE7C #HANGUL SYLLABLE SSANGKIYEOK AE SSANGSIOS -0xB2A4 0xAE7D #HANGUL SYLLABLE SSANGKIYEOK AE IEUNG -0xB2A5 0xAE84 #HANGUL SYLLABLE SSANGKIYEOK YA -0xB2A6 0xAE85 #HANGUL SYLLABLE SSANGKIYEOK YA KIYEOK -0xB2A7 0xAE8C #HANGUL SYLLABLE SSANGKIYEOK YA RIEUL -0xB2A8 0xAEBC #HANGUL SYLLABLE SSANGKIYEOK EO -0xB2A9 0xAEBD #HANGUL SYLLABLE SSANGKIYEOK EO KIYEOK -0xB2AA 0xAEBE #HANGUL SYLLABLE SSANGKIYEOK EO SSANGKIYEOK -0xB2AB 0xAEC0 #HANGUL SYLLABLE SSANGKIYEOK EO NIEUN -0xB2AC 0xAEC4 #HANGUL SYLLABLE SSANGKIYEOK EO RIEUL -0xB2AD 0xAECC #HANGUL SYLLABLE SSANGKIYEOK EO MIEUM -0xB2AE 0xAECD #HANGUL SYLLABLE SSANGKIYEOK EO PIEUP -0xB2AF 0xAECF #HANGUL SYLLABLE SSANGKIYEOK EO SIOS -0xB2B0 0xAED0 #HANGUL SYLLABLE SSANGKIYEOK EO SSANGSIOS -0xB2B1 0xAED1 #HANGUL SYLLABLE SSANGKIYEOK EO IEUNG -0xB2B2 0xAED8 #HANGUL SYLLABLE SSANGKIYEOK E -0xB2B3 0xAED9 #HANGUL SYLLABLE SSANGKIYEOK E KIYEOK -0xB2B4 0xAEDC #HANGUL SYLLABLE SSANGKIYEOK E NIEUN -0xB2B5 0xAEE8 #HANGUL SYLLABLE SSANGKIYEOK E MIEUM -0xB2B6 0xAEEB #HANGUL SYLLABLE SSANGKIYEOK E SIOS -0xB2B7 0xAEED #HANGUL SYLLABLE SSANGKIYEOK E IEUNG -0xB2B8 0xAEF4 #HANGUL SYLLABLE SSANGKIYEOK YEO -0xB2B9 0xAEF8 #HANGUL SYLLABLE SSANGKIYEOK YEO NIEUN -0xB2BA 0xAEFC #HANGUL SYLLABLE SSANGKIYEOK YEO RIEUL -0xB2BB 0xAF07 #HANGUL SYLLABLE SSANGKIYEOK YEO SIOS -0xB2BC 0xAF08 #HANGUL SYLLABLE SSANGKIYEOK YEO SSANGSIOS -0xB2BD 0xAF0D #HANGUL SYLLABLE SSANGKIYEOK YEO THIEUTH -0xB2BE 0xAF10 #HANGUL SYLLABLE SSANGKIYEOK YE -0xB2BF 0xAF2C #HANGUL SYLLABLE SSANGKIYEOK O -0xB2C0 0xAF2D #HANGUL SYLLABLE SSANGKIYEOK O KIYEOK -0xB2C1 0xAF30 #HANGUL SYLLABLE SSANGKIYEOK O NIEUN -0xB2C2 0xAF32 #HANGUL SYLLABLE SSANGKIYEOK O NIEUNHIEUH -0xB2C3 0xAF34 #HANGUL SYLLABLE SSANGKIYEOK O RIEUL -0xB2C4 0xAF3C #HANGUL SYLLABLE SSANGKIYEOK O MIEUM -0xB2C5 0xAF3D #HANGUL SYLLABLE SSANGKIYEOK O PIEUP -0xB2C6 0xAF3F #HANGUL SYLLABLE SSANGKIYEOK O SIOS -0xB2C7 0xAF41 #HANGUL SYLLABLE SSANGKIYEOK O IEUNG -0xB2C8 0xAF42 #HANGUL SYLLABLE SSANGKIYEOK O CIEUC -0xB2C9 0xAF43 #HANGUL SYLLABLE SSANGKIYEOK O CHIEUCH -0xB2CA 0xAF48 #HANGUL SYLLABLE SSANGKIYEOK WA -0xB2CB 0xAF49 #HANGUL SYLLABLE SSANGKIYEOK WA KIYEOK -0xB2CC 0xAF50 #HANGUL SYLLABLE SSANGKIYEOK WA RIEUL -0xB2CD 0xAF5C #HANGUL SYLLABLE SSANGKIYEOK WA SSANGSIOS -0xB2CE 0xAF5D #HANGUL SYLLABLE SSANGKIYEOK WA IEUNG -0xB2CF 0xAF64 #HANGUL SYLLABLE SSANGKIYEOK WAE -0xB2D0 0xAF65 #HANGUL SYLLABLE SSANGKIYEOK WAE KIYEOK -0xB2D1 0xAF79 #HANGUL SYLLABLE SSANGKIYEOK WAE IEUNG -0xB2D2 0xAF80 #HANGUL SYLLABLE SSANGKIYEOK OE -0xB2D3 0xAF84 #HANGUL SYLLABLE SSANGKIYEOK OE NIEUN -0xB2D4 0xAF88 #HANGUL SYLLABLE SSANGKIYEOK OE RIEUL -0xB2D5 0xAF90 #HANGUL SYLLABLE SSANGKIYEOK OE MIEUM -0xB2D6 0xAF91 #HANGUL SYLLABLE SSANGKIYEOK OE PIEUP -0xB2D7 0xAF95 #HANGUL SYLLABLE SSANGKIYEOK OE IEUNG -0xB2D8 0xAF9C #HANGUL SYLLABLE SSANGKIYEOK YO -0xB2D9 0xAFB8 #HANGUL SYLLABLE SSANGKIYEOK U -0xB2DA 0xAFB9 #HANGUL SYLLABLE SSANGKIYEOK U KIYEOK -0xB2DB 0xAFBC #HANGUL SYLLABLE SSANGKIYEOK U NIEUN -0xB2DC 0xAFC0 #HANGUL SYLLABLE SSANGKIYEOK U RIEUL -0xB2DD 0xAFC7 #HANGUL SYLLABLE SSANGKIYEOK U RIEULHIEUH -0xB2DE 0xAFC8 #HANGUL SYLLABLE SSANGKIYEOK U MIEUM -0xB2DF 0xAFC9 #HANGUL SYLLABLE SSANGKIYEOK U PIEUP -0xB2E0 0xAFCB #HANGUL SYLLABLE SSANGKIYEOK U SIOS -0xB2E1 0xAFCD #HANGUL SYLLABLE SSANGKIYEOK U IEUNG -0xB2E2 0xAFCE #HANGUL SYLLABLE SSANGKIYEOK U CIEUC -0xB2E3 0xAFD4 #HANGUL SYLLABLE SSANGKIYEOK WEO -0xB2E4 0xAFDC #HANGUL SYLLABLE SSANGKIYEOK WEO RIEUL -0xB2E5 0xAFE8 #HANGUL SYLLABLE SSANGKIYEOK WEO SSANGSIOS -0xB2E6 0xAFE9 #HANGUL SYLLABLE SSANGKIYEOK WEO IEUNG -0xB2E7 0xAFF0 #HANGUL SYLLABLE SSANGKIYEOK WE -0xB2E8 0xAFF1 #HANGUL SYLLABLE SSANGKIYEOK WE KIYEOK -0xB2E9 0xAFF4 #HANGUL SYLLABLE SSANGKIYEOK WE NIEUN -0xB2EA 0xAFF8 #HANGUL SYLLABLE SSANGKIYEOK WE RIEUL -0xB2EB 0xB000 #HANGUL SYLLABLE SSANGKIYEOK WE MIEUM -0xB2EC 0xB001 #HANGUL SYLLABLE SSANGKIYEOK WE PIEUP -0xB2ED 0xB004 #HANGUL SYLLABLE SSANGKIYEOK WE SSANGSIOS -0xB2EE 0xB00C #HANGUL SYLLABLE SSANGKIYEOK WI -0xB2EF 0xB010 #HANGUL SYLLABLE SSANGKIYEOK WI NIEUN -0xB2F0 0xB014 #HANGUL SYLLABLE SSANGKIYEOK WI RIEUL -0xB2F1 0xB01C #HANGUL SYLLABLE SSANGKIYEOK WI MIEUM -0xB2F2 0xB01D #HANGUL SYLLABLE SSANGKIYEOK WI PIEUP -0xB2F3 0xB028 #HANGUL SYLLABLE SSANGKIYEOK YU -0xB2F4 0xB044 #HANGUL SYLLABLE SSANGKIYEOK EU -0xB2F5 0xB045 #HANGUL SYLLABLE SSANGKIYEOK EU KIYEOK -0xB2F6 0xB048 #HANGUL SYLLABLE SSANGKIYEOK EU NIEUN -0xB2F7 0xB04A #HANGUL SYLLABLE SSANGKIYEOK EU NIEUNHIEUH -0xB2F8 0xB04C #HANGUL SYLLABLE SSANGKIYEOK EU RIEUL -0xB2F9 0xB04E #HANGUL SYLLABLE SSANGKIYEOK EU RIEULMIEUM -0xB2FA 0xB053 #HANGUL SYLLABLE SSANGKIYEOK EU RIEULHIEUH -0xB2FB 0xB054 #HANGUL SYLLABLE SSANGKIYEOK EU MIEUM -0xB2FC 0xB055 #HANGUL SYLLABLE SSANGKIYEOK EU PIEUP -0xB2FD 0xB057 #HANGUL SYLLABLE SSANGKIYEOK EU SIOS -0xB2FE 0xB059 #HANGUL SYLLABLE SSANGKIYEOK EU IEUNG -0xB341 0xCFCC #HANGUL SYLLABLE KHIEUKH YO RIEUL -0xB342 0xCFCD #HANGUL SYLLABLE KHIEUKH YO RIEULKIYEOK -0xB343 0xCFCE #HANGUL SYLLABLE KHIEUKH YO RIEULMIEUM -0xB344 0xCFCF #HANGUL SYLLABLE KHIEUKH YO RIEULPIEUP -0xB345 0xCFD0 #HANGUL SYLLABLE KHIEUKH YO RIEULSIOS -0xB346 0xCFD1 #HANGUL SYLLABLE KHIEUKH YO RIEULTHIEUTH -0xB347 0xCFD2 #HANGUL SYLLABLE KHIEUKH YO RIEULPHIEUPH -0xB348 0xCFD3 #HANGUL SYLLABLE KHIEUKH YO RIEULHIEUH -0xB349 0xCFD4 #HANGUL SYLLABLE KHIEUKH YO MIEUM -0xB34A 0xCFD5 #HANGUL SYLLABLE KHIEUKH YO PIEUP -0xB34B 0xCFD6 #HANGUL SYLLABLE KHIEUKH YO PIEUPSIOS -0xB34C 0xCFD7 #HANGUL SYLLABLE KHIEUKH YO SIOS -0xB34D 0xCFD8 #HANGUL SYLLABLE KHIEUKH YO SSANGSIOS -0xB34E 0xCFD9 #HANGUL SYLLABLE KHIEUKH YO IEUNG -0xB34F 0xCFDA #HANGUL SYLLABLE KHIEUKH YO CIEUC -0xB350 0xCFDB #HANGUL SYLLABLE KHIEUKH YO CHIEUCH -0xB351 0xCFDC #HANGUL SYLLABLE KHIEUKH YO KHIEUKH -0xB352 0xCFDD #HANGUL SYLLABLE KHIEUKH YO THIEUTH -0xB353 0xCFDE #HANGUL SYLLABLE KHIEUKH YO PHIEUPH -0xB354 0xCFDF #HANGUL SYLLABLE KHIEUKH YO HIEUH -0xB355 0xCFE2 #HANGUL SYLLABLE KHIEUKH U SSANGKIYEOK -0xB356 0xCFE3 #HANGUL SYLLABLE KHIEUKH U KIYEOKSIOS -0xB357 0xCFE5 #HANGUL SYLLABLE KHIEUKH U NIEUNCIEUC -0xB358 0xCFE6 #HANGUL SYLLABLE KHIEUKH U NIEUNHIEUH -0xB359 0xCFE7 #HANGUL SYLLABLE KHIEUKH U TIKEUT -0xB35A 0xCFE9 #HANGUL SYLLABLE KHIEUKH U RIEULKIYEOK -0xB361 0xCFEA #HANGUL SYLLABLE KHIEUKH U RIEULMIEUM -0xB362 0xCFEB #HANGUL SYLLABLE KHIEUKH U RIEULPIEUP -0xB363 0xCFEC #HANGUL SYLLABLE KHIEUKH U RIEULSIOS -0xB364 0xCFED #HANGUL SYLLABLE KHIEUKH U RIEULTHIEUTH -0xB365 0xCFEE #HANGUL SYLLABLE KHIEUKH U RIEULPHIEUPH -0xB366 0xCFEF #HANGUL SYLLABLE KHIEUKH U RIEULHIEUH -0xB367 0xCFF2 #HANGUL SYLLABLE KHIEUKH U PIEUPSIOS -0xB368 0xCFF4 #HANGUL SYLLABLE KHIEUKH U SSANGSIOS -0xB369 0xCFF6 #HANGUL SYLLABLE KHIEUKH U CIEUC -0xB36A 0xCFF7 #HANGUL SYLLABLE KHIEUKH U CHIEUCH -0xB36B 0xCFF8 #HANGUL SYLLABLE KHIEUKH U KHIEUKH -0xB36C 0xCFF9 #HANGUL SYLLABLE KHIEUKH U THIEUTH -0xB36D 0xCFFA #HANGUL SYLLABLE KHIEUKH U PHIEUPH -0xB36E 0xCFFB #HANGUL SYLLABLE KHIEUKH U HIEUH -0xB36F 0xCFFD #HANGUL SYLLABLE KHIEUKH WEO KIYEOK -0xB370 0xCFFE #HANGUL SYLLABLE KHIEUKH WEO SSANGKIYEOK -0xB371 0xCFFF #HANGUL SYLLABLE KHIEUKH WEO KIYEOKSIOS -0xB372 0xD001 #HANGUL SYLLABLE KHIEUKH WEO NIEUNCIEUC -0xB373 0xD002 #HANGUL SYLLABLE KHIEUKH WEO NIEUNHIEUH -0xB374 0xD003 #HANGUL SYLLABLE KHIEUKH WEO TIKEUT -0xB375 0xD005 #HANGUL SYLLABLE KHIEUKH WEO RIEULKIYEOK -0xB376 0xD006 #HANGUL SYLLABLE KHIEUKH WEO RIEULMIEUM -0xB377 0xD007 #HANGUL SYLLABLE KHIEUKH WEO RIEULPIEUP -0xB378 0xD008 #HANGUL SYLLABLE KHIEUKH WEO RIEULSIOS -0xB379 0xD009 #HANGUL SYLLABLE KHIEUKH WEO RIEULTHIEUTH -0xB37A 0xD00A #HANGUL SYLLABLE KHIEUKH WEO RIEULPHIEUPH -0xB381 0xD00B #HANGUL SYLLABLE KHIEUKH WEO RIEULHIEUH -0xB382 0xD00C #HANGUL SYLLABLE KHIEUKH WEO MIEUM -0xB383 0xD00D #HANGUL SYLLABLE KHIEUKH WEO PIEUP -0xB384 0xD00E #HANGUL SYLLABLE KHIEUKH WEO PIEUPSIOS -0xB385 0xD00F #HANGUL SYLLABLE KHIEUKH WEO SIOS -0xB386 0xD010 #HANGUL SYLLABLE KHIEUKH WEO SSANGSIOS -0xB387 0xD012 #HANGUL SYLLABLE KHIEUKH WEO CIEUC -0xB388 0xD013 #HANGUL SYLLABLE KHIEUKH WEO CHIEUCH -0xB389 0xD014 #HANGUL SYLLABLE KHIEUKH WEO KHIEUKH -0xB38A 0xD015 #HANGUL SYLLABLE KHIEUKH WEO THIEUTH -0xB38B 0xD016 #HANGUL SYLLABLE KHIEUKH WEO PHIEUPH -0xB38C 0xD017 #HANGUL SYLLABLE KHIEUKH WEO HIEUH -0xB38D 0xD019 #HANGUL SYLLABLE KHIEUKH WE KIYEOK -0xB38E 0xD01A #HANGUL SYLLABLE KHIEUKH WE SSANGKIYEOK -0xB38F 0xD01B #HANGUL SYLLABLE KHIEUKH WE KIYEOKSIOS -0xB390 0xD01C #HANGUL SYLLABLE KHIEUKH WE NIEUN -0xB391 0xD01D #HANGUL SYLLABLE KHIEUKH WE NIEUNCIEUC -0xB392 0xD01E #HANGUL SYLLABLE KHIEUKH WE NIEUNHIEUH -0xB393 0xD01F #HANGUL SYLLABLE KHIEUKH WE TIKEUT -0xB394 0xD020 #HANGUL SYLLABLE KHIEUKH WE RIEUL -0xB395 0xD021 #HANGUL SYLLABLE KHIEUKH WE RIEULKIYEOK -0xB396 0xD022 #HANGUL SYLLABLE KHIEUKH WE RIEULMIEUM -0xB397 0xD023 #HANGUL SYLLABLE KHIEUKH WE RIEULPIEUP -0xB398 0xD024 #HANGUL SYLLABLE KHIEUKH WE RIEULSIOS -0xB399 0xD025 #HANGUL SYLLABLE KHIEUKH WE RIEULTHIEUTH -0xB39A 0xD026 #HANGUL SYLLABLE KHIEUKH WE RIEULPHIEUPH -0xB39B 0xD027 #HANGUL SYLLABLE KHIEUKH WE RIEULHIEUH -0xB39C 0xD028 #HANGUL SYLLABLE KHIEUKH WE MIEUM -0xB39D 0xD029 #HANGUL SYLLABLE KHIEUKH WE PIEUP -0xB39E 0xD02A #HANGUL SYLLABLE KHIEUKH WE PIEUPSIOS -0xB39F 0xD02B #HANGUL SYLLABLE KHIEUKH WE SIOS -0xB3A0 0xD02C #HANGUL SYLLABLE KHIEUKH WE SSANGSIOS -0xB3A1 0xB05D #HANGUL SYLLABLE SSANGKIYEOK EU THIEUTH -0xB3A2 0xB07C #HANGUL SYLLABLE SSANGKIYEOK I -0xB3A3 0xB07D #HANGUL SYLLABLE SSANGKIYEOK I KIYEOK -0xB3A4 0xB080 #HANGUL SYLLABLE SSANGKIYEOK I NIEUN -0xB3A5 0xB084 #HANGUL SYLLABLE SSANGKIYEOK I RIEUL -0xB3A6 0xB08C #HANGUL SYLLABLE SSANGKIYEOK I MIEUM -0xB3A7 0xB08D #HANGUL SYLLABLE SSANGKIYEOK I PIEUP -0xB3A8 0xB08F #HANGUL SYLLABLE SSANGKIYEOK I SIOS -0xB3A9 0xB091 #HANGUL SYLLABLE SSANGKIYEOK I IEUNG -0xB3AA 0xB098 #HANGUL SYLLABLE NIEUN A -0xB3AB 0xB099 #HANGUL SYLLABLE NIEUN A KIYEOK -0xB3AC 0xB09A #HANGUL SYLLABLE NIEUN A SSANGKIYEOK -0xB3AD 0xB09C #HANGUL SYLLABLE NIEUN A NIEUN -0xB3AE 0xB09F #HANGUL SYLLABLE NIEUN A TIKEUT -0xB3AF 0xB0A0 #HANGUL SYLLABLE NIEUN A RIEUL -0xB3B0 0xB0A1 #HANGUL SYLLABLE NIEUN A RIEULKIYEOK -0xB3B1 0xB0A2 #HANGUL SYLLABLE NIEUN A RIEULMIEUM -0xB3B2 0xB0A8 #HANGUL SYLLABLE NIEUN A MIEUM -0xB3B3 0xB0A9 #HANGUL SYLLABLE NIEUN A PIEUP -0xB3B4 0xB0AB #HANGUL SYLLABLE NIEUN A SIOS -0xB3B5 0xB0AC #HANGUL SYLLABLE NIEUN A SSANGSIOS -0xB3B6 0xB0AD #HANGUL SYLLABLE NIEUN A IEUNG -0xB3B7 0xB0AE #HANGUL SYLLABLE NIEUN A CIEUC -0xB3B8 0xB0AF #HANGUL SYLLABLE NIEUN A CHIEUCH -0xB3B9 0xB0B1 #HANGUL SYLLABLE NIEUN A THIEUTH -0xB3BA 0xB0B3 #HANGUL SYLLABLE NIEUN A HIEUH -0xB3BB 0xB0B4 #HANGUL SYLLABLE NIEUN AE -0xB3BC 0xB0B5 #HANGUL SYLLABLE NIEUN AE KIYEOK -0xB3BD 0xB0B8 #HANGUL SYLLABLE NIEUN AE NIEUN -0xB3BE 0xB0BC #HANGUL SYLLABLE NIEUN AE RIEUL -0xB3BF 0xB0C4 #HANGUL SYLLABLE NIEUN AE MIEUM -0xB3C0 0xB0C5 #HANGUL SYLLABLE NIEUN AE PIEUP -0xB3C1 0xB0C7 #HANGUL SYLLABLE NIEUN AE SIOS -0xB3C2 0xB0C8 #HANGUL SYLLABLE NIEUN AE SSANGSIOS -0xB3C3 0xB0C9 #HANGUL SYLLABLE NIEUN AE IEUNG -0xB3C4 0xB0D0 #HANGUL SYLLABLE NIEUN YA -0xB3C5 0xB0D1 #HANGUL SYLLABLE NIEUN YA KIYEOK -0xB3C6 0xB0D4 #HANGUL SYLLABLE NIEUN YA NIEUN -0xB3C7 0xB0D8 #HANGUL SYLLABLE NIEUN YA RIEUL -0xB3C8 0xB0E0 #HANGUL SYLLABLE NIEUN YA MIEUM -0xB3C9 0xB0E5 #HANGUL SYLLABLE NIEUN YA IEUNG -0xB3CA 0xB108 #HANGUL SYLLABLE NIEUN EO -0xB3CB 0xB109 #HANGUL SYLLABLE NIEUN EO KIYEOK -0xB3CC 0xB10B #HANGUL SYLLABLE NIEUN EO KIYEOKSIOS -0xB3CD 0xB10C #HANGUL SYLLABLE NIEUN EO NIEUN -0xB3CE 0xB110 #HANGUL SYLLABLE NIEUN EO RIEUL -0xB3CF 0xB112 #HANGUL SYLLABLE NIEUN EO RIEULMIEUM -0xB3D0 0xB113 #HANGUL SYLLABLE NIEUN EO RIEULPIEUP -0xB3D1 0xB118 #HANGUL SYLLABLE NIEUN EO MIEUM -0xB3D2 0xB119 #HANGUL SYLLABLE NIEUN EO PIEUP -0xB3D3 0xB11B #HANGUL SYLLABLE NIEUN EO SIOS -0xB3D4 0xB11C #HANGUL SYLLABLE NIEUN EO SSANGSIOS -0xB3D5 0xB11D #HANGUL SYLLABLE NIEUN EO IEUNG -0xB3D6 0xB123 #HANGUL SYLLABLE NIEUN EO HIEUH -0xB3D7 0xB124 #HANGUL SYLLABLE NIEUN E -0xB3D8 0xB125 #HANGUL SYLLABLE NIEUN E KIYEOK -0xB3D9 0xB128 #HANGUL SYLLABLE NIEUN E NIEUN -0xB3DA 0xB12C #HANGUL SYLLABLE NIEUN E RIEUL -0xB3DB 0xB134 #HANGUL SYLLABLE NIEUN E MIEUM -0xB3DC 0xB135 #HANGUL SYLLABLE NIEUN E PIEUP -0xB3DD 0xB137 #HANGUL SYLLABLE NIEUN E SIOS -0xB3DE 0xB138 #HANGUL SYLLABLE NIEUN E SSANGSIOS -0xB3DF 0xB139 #HANGUL SYLLABLE NIEUN E IEUNG -0xB3E0 0xB140 #HANGUL SYLLABLE NIEUN YEO -0xB3E1 0xB141 #HANGUL SYLLABLE NIEUN YEO KIYEOK -0xB3E2 0xB144 #HANGUL SYLLABLE NIEUN YEO NIEUN -0xB3E3 0xB148 #HANGUL SYLLABLE NIEUN YEO RIEUL -0xB3E4 0xB150 #HANGUL SYLLABLE NIEUN YEO MIEUM -0xB3E5 0xB151 #HANGUL SYLLABLE NIEUN YEO PIEUP -0xB3E6 0xB154 #HANGUL SYLLABLE NIEUN YEO SSANGSIOS -0xB3E7 0xB155 #HANGUL SYLLABLE NIEUN YEO IEUNG -0xB3E8 0xB158 #HANGUL SYLLABLE NIEUN YEO KHIEUKH -0xB3E9 0xB15C #HANGUL SYLLABLE NIEUN YE -0xB3EA 0xB160 #HANGUL SYLLABLE NIEUN YE NIEUN -0xB3EB 0xB178 #HANGUL SYLLABLE NIEUN O -0xB3EC 0xB179 #HANGUL SYLLABLE NIEUN O KIYEOK -0xB3ED 0xB17C #HANGUL SYLLABLE NIEUN O NIEUN -0xB3EE 0xB180 #HANGUL SYLLABLE NIEUN O RIEUL -0xB3EF 0xB182 #HANGUL SYLLABLE NIEUN O RIEULMIEUM -0xB3F0 0xB188 #HANGUL SYLLABLE NIEUN O MIEUM -0xB3F1 0xB189 #HANGUL SYLLABLE NIEUN O PIEUP -0xB3F2 0xB18B #HANGUL SYLLABLE NIEUN O SIOS -0xB3F3 0xB18D #HANGUL SYLLABLE NIEUN O IEUNG -0xB3F4 0xB192 #HANGUL SYLLABLE NIEUN O PHIEUPH -0xB3F5 0xB193 #HANGUL SYLLABLE NIEUN O HIEUH -0xB3F6 0xB194 #HANGUL SYLLABLE NIEUN WA -0xB3F7 0xB198 #HANGUL SYLLABLE NIEUN WA NIEUN -0xB3F8 0xB19C #HANGUL SYLLABLE NIEUN WA RIEUL -0xB3F9 0xB1A8 #HANGUL SYLLABLE NIEUN WA SSANGSIOS -0xB3FA 0xB1CC #HANGUL SYLLABLE NIEUN OE -0xB3FB 0xB1D0 #HANGUL SYLLABLE NIEUN OE NIEUN -0xB3FC 0xB1D4 #HANGUL SYLLABLE NIEUN OE RIEUL -0xB3FD 0xB1DC #HANGUL SYLLABLE NIEUN OE MIEUM -0xB3FE 0xB1DD #HANGUL SYLLABLE NIEUN OE PIEUP -0xB441 0xD02E #HANGUL SYLLABLE KHIEUKH WE CIEUC -0xB442 0xD02F #HANGUL SYLLABLE KHIEUKH WE CHIEUCH -0xB443 0xD030 #HANGUL SYLLABLE KHIEUKH WE KHIEUKH -0xB444 0xD031 #HANGUL SYLLABLE KHIEUKH WE THIEUTH -0xB445 0xD032 #HANGUL SYLLABLE KHIEUKH WE PHIEUPH -0xB446 0xD033 #HANGUL SYLLABLE KHIEUKH WE HIEUH -0xB447 0xD036 #HANGUL SYLLABLE KHIEUKH WI SSANGKIYEOK -0xB448 0xD037 #HANGUL SYLLABLE KHIEUKH WI KIYEOKSIOS -0xB449 0xD039 #HANGUL SYLLABLE KHIEUKH WI NIEUNCIEUC -0xB44A 0xD03A #HANGUL SYLLABLE KHIEUKH WI NIEUNHIEUH -0xB44B 0xD03B #HANGUL SYLLABLE KHIEUKH WI TIKEUT -0xB44C 0xD03D #HANGUL SYLLABLE KHIEUKH WI RIEULKIYEOK -0xB44D 0xD03E #HANGUL SYLLABLE KHIEUKH WI RIEULMIEUM -0xB44E 0xD03F #HANGUL SYLLABLE KHIEUKH WI RIEULPIEUP -0xB44F 0xD040 #HANGUL SYLLABLE KHIEUKH WI RIEULSIOS -0xB450 0xD041 #HANGUL SYLLABLE KHIEUKH WI RIEULTHIEUTH -0xB451 0xD042 #HANGUL SYLLABLE KHIEUKH WI RIEULPHIEUPH -0xB452 0xD043 #HANGUL SYLLABLE KHIEUKH WI RIEULHIEUH -0xB453 0xD046 #HANGUL SYLLABLE KHIEUKH WI PIEUPSIOS -0xB454 0xD048 #HANGUL SYLLABLE KHIEUKH WI SSANGSIOS -0xB455 0xD04A #HANGUL SYLLABLE KHIEUKH WI CIEUC -0xB456 0xD04B #HANGUL SYLLABLE KHIEUKH WI CHIEUCH -0xB457 0xD04C #HANGUL SYLLABLE KHIEUKH WI KHIEUKH -0xB458 0xD04D #HANGUL SYLLABLE KHIEUKH WI THIEUTH -0xB459 0xD04E #HANGUL SYLLABLE KHIEUKH WI PHIEUPH -0xB45A 0xD04F #HANGUL SYLLABLE KHIEUKH WI HIEUH -0xB461 0xD051 #HANGUL SYLLABLE KHIEUKH YU KIYEOK -0xB462 0xD052 #HANGUL SYLLABLE KHIEUKH YU SSANGKIYEOK -0xB463 0xD053 #HANGUL SYLLABLE KHIEUKH YU KIYEOKSIOS -0xB464 0xD055 #HANGUL SYLLABLE KHIEUKH YU NIEUNCIEUC -0xB465 0xD056 #HANGUL SYLLABLE KHIEUKH YU NIEUNHIEUH -0xB466 0xD057 #HANGUL SYLLABLE KHIEUKH YU TIKEUT -0xB467 0xD059 #HANGUL SYLLABLE KHIEUKH YU RIEULKIYEOK -0xB468 0xD05A #HANGUL SYLLABLE KHIEUKH YU RIEULMIEUM -0xB469 0xD05B #HANGUL SYLLABLE KHIEUKH YU RIEULPIEUP -0xB46A 0xD05C #HANGUL SYLLABLE KHIEUKH YU RIEULSIOS -0xB46B 0xD05D #HANGUL SYLLABLE KHIEUKH YU RIEULTHIEUTH -0xB46C 0xD05E #HANGUL SYLLABLE KHIEUKH YU RIEULPHIEUPH -0xB46D 0xD05F #HANGUL SYLLABLE KHIEUKH YU RIEULHIEUH -0xB46E 0xD061 #HANGUL SYLLABLE KHIEUKH YU PIEUP -0xB46F 0xD062 #HANGUL SYLLABLE KHIEUKH YU PIEUPSIOS -0xB470 0xD063 #HANGUL SYLLABLE KHIEUKH YU SIOS -0xB471 0xD064 #HANGUL SYLLABLE KHIEUKH YU SSANGSIOS -0xB472 0xD065 #HANGUL SYLLABLE KHIEUKH YU IEUNG -0xB473 0xD066 #HANGUL SYLLABLE KHIEUKH YU CIEUC -0xB474 0xD067 #HANGUL SYLLABLE KHIEUKH YU CHIEUCH -0xB475 0xD068 #HANGUL SYLLABLE KHIEUKH YU KHIEUKH -0xB476 0xD069 #HANGUL SYLLABLE KHIEUKH YU THIEUTH -0xB477 0xD06A #HANGUL SYLLABLE KHIEUKH YU PHIEUPH -0xB478 0xD06B #HANGUL SYLLABLE KHIEUKH YU HIEUH -0xB479 0xD06E #HANGUL SYLLABLE KHIEUKH EU SSANGKIYEOK -0xB47A 0xD06F #HANGUL SYLLABLE KHIEUKH EU KIYEOKSIOS -0xB481 0xD071 #HANGUL SYLLABLE KHIEUKH EU NIEUNCIEUC -0xB482 0xD072 #HANGUL SYLLABLE KHIEUKH EU NIEUNHIEUH -0xB483 0xD073 #HANGUL SYLLABLE KHIEUKH EU TIKEUT -0xB484 0xD075 #HANGUL SYLLABLE KHIEUKH EU RIEULKIYEOK -0xB485 0xD076 #HANGUL SYLLABLE KHIEUKH EU RIEULMIEUM -0xB486 0xD077 #HANGUL SYLLABLE KHIEUKH EU RIEULPIEUP -0xB487 0xD078 #HANGUL SYLLABLE KHIEUKH EU RIEULSIOS -0xB488 0xD079 #HANGUL SYLLABLE KHIEUKH EU RIEULTHIEUTH -0xB489 0xD07A #HANGUL SYLLABLE KHIEUKH EU RIEULPHIEUPH -0xB48A 0xD07B #HANGUL SYLLABLE KHIEUKH EU RIEULHIEUH -0xB48B 0xD07E #HANGUL SYLLABLE KHIEUKH EU PIEUPSIOS -0xB48C 0xD07F #HANGUL SYLLABLE KHIEUKH EU SIOS -0xB48D 0xD080 #HANGUL SYLLABLE KHIEUKH EU SSANGSIOS -0xB48E 0xD082 #HANGUL SYLLABLE KHIEUKH EU CIEUC -0xB48F 0xD083 #HANGUL SYLLABLE KHIEUKH EU CHIEUCH -0xB490 0xD084 #HANGUL SYLLABLE KHIEUKH EU KHIEUKH -0xB491 0xD085 #HANGUL SYLLABLE KHIEUKH EU THIEUTH -0xB492 0xD086 #HANGUL SYLLABLE KHIEUKH EU PHIEUPH -0xB493 0xD087 #HANGUL SYLLABLE KHIEUKH EU HIEUH -0xB494 0xD088 #HANGUL SYLLABLE KHIEUKH YI -0xB495 0xD089 #HANGUL SYLLABLE KHIEUKH YI KIYEOK -0xB496 0xD08A #HANGUL SYLLABLE KHIEUKH YI SSANGKIYEOK -0xB497 0xD08B #HANGUL SYLLABLE KHIEUKH YI KIYEOKSIOS -0xB498 0xD08C #HANGUL SYLLABLE KHIEUKH YI NIEUN -0xB499 0xD08D #HANGUL SYLLABLE KHIEUKH YI NIEUNCIEUC -0xB49A 0xD08E #HANGUL SYLLABLE KHIEUKH YI NIEUNHIEUH -0xB49B 0xD08F #HANGUL SYLLABLE KHIEUKH YI TIKEUT -0xB49C 0xD090 #HANGUL SYLLABLE KHIEUKH YI RIEUL -0xB49D 0xD091 #HANGUL SYLLABLE KHIEUKH YI RIEULKIYEOK -0xB49E 0xD092 #HANGUL SYLLABLE KHIEUKH YI RIEULMIEUM -0xB49F 0xD093 #HANGUL SYLLABLE KHIEUKH YI RIEULPIEUP -0xB4A0 0xD094 #HANGUL SYLLABLE KHIEUKH YI RIEULSIOS -0xB4A1 0xB1DF #HANGUL SYLLABLE NIEUN OE SIOS -0xB4A2 0xB1E8 #HANGUL SYLLABLE NIEUN YO -0xB4A3 0xB1E9 #HANGUL SYLLABLE NIEUN YO KIYEOK -0xB4A4 0xB1EC #HANGUL SYLLABLE NIEUN YO NIEUN -0xB4A5 0xB1F0 #HANGUL SYLLABLE NIEUN YO RIEUL -0xB4A6 0xB1F9 #HANGUL SYLLABLE NIEUN YO PIEUP -0xB4A7 0xB1FB #HANGUL SYLLABLE NIEUN YO SIOS -0xB4A8 0xB1FD #HANGUL SYLLABLE NIEUN YO IEUNG -0xB4A9 0xB204 #HANGUL SYLLABLE NIEUN U -0xB4AA 0xB205 #HANGUL SYLLABLE NIEUN U KIYEOK -0xB4AB 0xB208 #HANGUL SYLLABLE NIEUN U NIEUN -0xB4AC 0xB20B #HANGUL SYLLABLE NIEUN U TIKEUT -0xB4AD 0xB20C #HANGUL SYLLABLE NIEUN U RIEUL -0xB4AE 0xB214 #HANGUL SYLLABLE NIEUN U MIEUM -0xB4AF 0xB215 #HANGUL SYLLABLE NIEUN U PIEUP -0xB4B0 0xB217 #HANGUL SYLLABLE NIEUN U SIOS -0xB4B1 0xB219 #HANGUL SYLLABLE NIEUN U IEUNG -0xB4B2 0xB220 #HANGUL SYLLABLE NIEUN WEO -0xB4B3 0xB234 #HANGUL SYLLABLE NIEUN WEO SSANGSIOS -0xB4B4 0xB23C #HANGUL SYLLABLE NIEUN WE -0xB4B5 0xB258 #HANGUL SYLLABLE NIEUN WI -0xB4B6 0xB25C #HANGUL SYLLABLE NIEUN WI NIEUN -0xB4B7 0xB260 #HANGUL SYLLABLE NIEUN WI RIEUL -0xB4B8 0xB268 #HANGUL SYLLABLE NIEUN WI MIEUM -0xB4B9 0xB269 #HANGUL SYLLABLE NIEUN WI PIEUP -0xB4BA 0xB274 #HANGUL SYLLABLE NIEUN YU -0xB4BB 0xB275 #HANGUL SYLLABLE NIEUN YU KIYEOK -0xB4BC 0xB27C #HANGUL SYLLABLE NIEUN YU RIEUL -0xB4BD 0xB284 #HANGUL SYLLABLE NIEUN YU MIEUM -0xB4BE 0xB285 #HANGUL SYLLABLE NIEUN YU PIEUP -0xB4BF 0xB289 #HANGUL SYLLABLE NIEUN YU IEUNG -0xB4C0 0xB290 #HANGUL SYLLABLE NIEUN EU -0xB4C1 0xB291 #HANGUL SYLLABLE NIEUN EU KIYEOK -0xB4C2 0xB294 #HANGUL SYLLABLE NIEUN EU NIEUN -0xB4C3 0xB298 #HANGUL SYLLABLE NIEUN EU RIEUL -0xB4C4 0xB299 #HANGUL SYLLABLE NIEUN EU RIEULKIYEOK -0xB4C5 0xB29A #HANGUL SYLLABLE NIEUN EU RIEULMIEUM -0xB4C6 0xB2A0 #HANGUL SYLLABLE NIEUN EU MIEUM -0xB4C7 0xB2A1 #HANGUL SYLLABLE NIEUN EU PIEUP -0xB4C8 0xB2A3 #HANGUL SYLLABLE NIEUN EU SIOS -0xB4C9 0xB2A5 #HANGUL SYLLABLE NIEUN EU IEUNG -0xB4CA 0xB2A6 #HANGUL SYLLABLE NIEUN EU CIEUC -0xB4CB 0xB2AA #HANGUL SYLLABLE NIEUN EU PHIEUPH -0xB4CC 0xB2AC #HANGUL SYLLABLE NIEUN YI -0xB4CD 0xB2B0 #HANGUL SYLLABLE NIEUN YI NIEUN -0xB4CE 0xB2B4 #HANGUL SYLLABLE NIEUN YI RIEUL -0xB4CF 0xB2C8 #HANGUL SYLLABLE NIEUN I -0xB4D0 0xB2C9 #HANGUL SYLLABLE NIEUN I KIYEOK -0xB4D1 0xB2CC #HANGUL SYLLABLE NIEUN I NIEUN -0xB4D2 0xB2D0 #HANGUL SYLLABLE NIEUN I RIEUL -0xB4D3 0xB2D2 #HANGUL SYLLABLE NIEUN I RIEULMIEUM -0xB4D4 0xB2D8 #HANGUL SYLLABLE NIEUN I MIEUM -0xB4D5 0xB2D9 #HANGUL SYLLABLE NIEUN I PIEUP -0xB4D6 0xB2DB #HANGUL SYLLABLE NIEUN I SIOS -0xB4D7 0xB2DD #HANGUL SYLLABLE NIEUN I IEUNG -0xB4D8 0xB2E2 #HANGUL SYLLABLE NIEUN I PHIEUPH -0xB4D9 0xB2E4 #HANGUL SYLLABLE TIKEUT A -0xB4DA 0xB2E5 #HANGUL SYLLABLE TIKEUT A KIYEOK -0xB4DB 0xB2E6 #HANGUL SYLLABLE TIKEUT A SSANGKIYEOK -0xB4DC 0xB2E8 #HANGUL SYLLABLE TIKEUT A NIEUN -0xB4DD 0xB2EB #HANGUL SYLLABLE TIKEUT A TIKEUT -0xB4DE 0xB2EC #HANGUL SYLLABLE TIKEUT A RIEUL -0xB4DF 0xB2ED #HANGUL SYLLABLE TIKEUT A RIEULKIYEOK -0xB4E0 0xB2EE #HANGUL SYLLABLE TIKEUT A RIEULMIEUM -0xB4E1 0xB2EF #HANGUL SYLLABLE TIKEUT A RIEULPIEUP -0xB4E2 0xB2F3 #HANGUL SYLLABLE TIKEUT A RIEULHIEUH -0xB4E3 0xB2F4 #HANGUL SYLLABLE TIKEUT A MIEUM -0xB4E4 0xB2F5 #HANGUL SYLLABLE TIKEUT A PIEUP -0xB4E5 0xB2F7 #HANGUL SYLLABLE TIKEUT A SIOS -0xB4E6 0xB2F8 #HANGUL SYLLABLE TIKEUT A SSANGSIOS -0xB4E7 0xB2F9 #HANGUL SYLLABLE TIKEUT A IEUNG -0xB4E8 0xB2FA #HANGUL SYLLABLE TIKEUT A CIEUC -0xB4E9 0xB2FB #HANGUL SYLLABLE TIKEUT A CHIEUCH -0xB4EA 0xB2FF #HANGUL SYLLABLE TIKEUT A HIEUH -0xB4EB 0xB300 #HANGUL SYLLABLE TIKEUT AE -0xB4EC 0xB301 #HANGUL SYLLABLE TIKEUT AE KIYEOK -0xB4ED 0xB304 #HANGUL SYLLABLE TIKEUT AE NIEUN -0xB4EE 0xB308 #HANGUL SYLLABLE TIKEUT AE RIEUL -0xB4EF 0xB310 #HANGUL SYLLABLE TIKEUT AE MIEUM -0xB4F0 0xB311 #HANGUL SYLLABLE TIKEUT AE PIEUP -0xB4F1 0xB313 #HANGUL SYLLABLE TIKEUT AE SIOS -0xB4F2 0xB314 #HANGUL SYLLABLE TIKEUT AE SSANGSIOS -0xB4F3 0xB315 #HANGUL SYLLABLE TIKEUT AE IEUNG -0xB4F4 0xB31C #HANGUL SYLLABLE TIKEUT YA -0xB4F5 0xB354 #HANGUL SYLLABLE TIKEUT EO -0xB4F6 0xB355 #HANGUL SYLLABLE TIKEUT EO KIYEOK -0xB4F7 0xB356 #HANGUL SYLLABLE TIKEUT EO SSANGKIYEOK -0xB4F8 0xB358 #HANGUL SYLLABLE TIKEUT EO NIEUN -0xB4F9 0xB35B #HANGUL SYLLABLE TIKEUT EO TIKEUT -0xB4FA 0xB35C #HANGUL SYLLABLE TIKEUT EO RIEUL -0xB4FB 0xB35E #HANGUL SYLLABLE TIKEUT EO RIEULMIEUM -0xB4FC 0xB35F #HANGUL SYLLABLE TIKEUT EO RIEULPIEUP -0xB4FD 0xB364 #HANGUL SYLLABLE TIKEUT EO MIEUM -0xB4FE 0xB365 #HANGUL SYLLABLE TIKEUT EO PIEUP -0xB541 0xD095 #HANGUL SYLLABLE KHIEUKH YI RIEULTHIEUTH -0xB542 0xD096 #HANGUL SYLLABLE KHIEUKH YI RIEULPHIEUPH -0xB543 0xD097 #HANGUL SYLLABLE KHIEUKH YI RIEULHIEUH -0xB544 0xD098 #HANGUL SYLLABLE KHIEUKH YI MIEUM -0xB545 0xD099 #HANGUL SYLLABLE KHIEUKH YI PIEUP -0xB546 0xD09A #HANGUL SYLLABLE KHIEUKH YI PIEUPSIOS -0xB547 0xD09B #HANGUL SYLLABLE KHIEUKH YI SIOS -0xB548 0xD09C #HANGUL SYLLABLE KHIEUKH YI SSANGSIOS -0xB549 0xD09D #HANGUL SYLLABLE KHIEUKH YI IEUNG -0xB54A 0xD09E #HANGUL SYLLABLE KHIEUKH YI CIEUC -0xB54B 0xD09F #HANGUL SYLLABLE KHIEUKH YI CHIEUCH -0xB54C 0xD0A0 #HANGUL SYLLABLE KHIEUKH YI KHIEUKH -0xB54D 0xD0A1 #HANGUL SYLLABLE KHIEUKH YI THIEUTH -0xB54E 0xD0A2 #HANGUL SYLLABLE KHIEUKH YI PHIEUPH -0xB54F 0xD0A3 #HANGUL SYLLABLE KHIEUKH YI HIEUH -0xB550 0xD0A6 #HANGUL SYLLABLE KHIEUKH I SSANGKIYEOK -0xB551 0xD0A7 #HANGUL SYLLABLE KHIEUKH I KIYEOKSIOS -0xB552 0xD0A9 #HANGUL SYLLABLE KHIEUKH I NIEUNCIEUC -0xB553 0xD0AA #HANGUL SYLLABLE KHIEUKH I NIEUNHIEUH -0xB554 0xD0AB #HANGUL SYLLABLE KHIEUKH I TIKEUT -0xB555 0xD0AD #HANGUL SYLLABLE KHIEUKH I RIEULKIYEOK -0xB556 0xD0AE #HANGUL SYLLABLE KHIEUKH I RIEULMIEUM -0xB557 0xD0AF #HANGUL SYLLABLE KHIEUKH I RIEULPIEUP -0xB558 0xD0B0 #HANGUL SYLLABLE KHIEUKH I RIEULSIOS -0xB559 0xD0B1 #HANGUL SYLLABLE KHIEUKH I RIEULTHIEUTH -0xB55A 0xD0B2 #HANGUL SYLLABLE KHIEUKH I RIEULPHIEUPH -0xB561 0xD0B3 #HANGUL SYLLABLE KHIEUKH I RIEULHIEUH -0xB562 0xD0B6 #HANGUL SYLLABLE KHIEUKH I PIEUPSIOS -0xB563 0xD0B8 #HANGUL SYLLABLE KHIEUKH I SSANGSIOS -0xB564 0xD0BA #HANGUL SYLLABLE KHIEUKH I CIEUC -0xB565 0xD0BB #HANGUL SYLLABLE KHIEUKH I CHIEUCH -0xB566 0xD0BC #HANGUL SYLLABLE KHIEUKH I KHIEUKH -0xB567 0xD0BD #HANGUL SYLLABLE KHIEUKH I THIEUTH -0xB568 0xD0BE #HANGUL SYLLABLE KHIEUKH I PHIEUPH -0xB569 0xD0BF #HANGUL SYLLABLE KHIEUKH I HIEUH -0xB56A 0xD0C2 #HANGUL SYLLABLE THIEUTH A SSANGKIYEOK -0xB56B 0xD0C3 #HANGUL SYLLABLE THIEUTH A KIYEOKSIOS -0xB56C 0xD0C5 #HANGUL SYLLABLE THIEUTH A NIEUNCIEUC -0xB56D 0xD0C6 #HANGUL SYLLABLE THIEUTH A NIEUNHIEUH -0xB56E 0xD0C7 #HANGUL SYLLABLE THIEUTH A TIKEUT -0xB56F 0xD0CA #HANGUL SYLLABLE THIEUTH A RIEULMIEUM -0xB570 0xD0CB #HANGUL SYLLABLE THIEUTH A RIEULPIEUP -0xB571 0xD0CC #HANGUL SYLLABLE THIEUTH A RIEULSIOS -0xB572 0xD0CD #HANGUL SYLLABLE THIEUTH A RIEULTHIEUTH -0xB573 0xD0CE #HANGUL SYLLABLE THIEUTH A RIEULPHIEUPH -0xB574 0xD0CF #HANGUL SYLLABLE THIEUTH A RIEULHIEUH -0xB575 0xD0D2 #HANGUL SYLLABLE THIEUTH A PIEUPSIOS -0xB576 0xD0D6 #HANGUL SYLLABLE THIEUTH A CIEUC -0xB577 0xD0D7 #HANGUL SYLLABLE THIEUTH A CHIEUCH -0xB578 0xD0D8 #HANGUL SYLLABLE THIEUTH A KHIEUKH -0xB579 0xD0D9 #HANGUL SYLLABLE THIEUTH A THIEUTH -0xB57A 0xD0DA #HANGUL SYLLABLE THIEUTH A PHIEUPH -0xB581 0xD0DB #HANGUL SYLLABLE THIEUTH A HIEUH -0xB582 0xD0DE #HANGUL SYLLABLE THIEUTH AE SSANGKIYEOK -0xB583 0xD0DF #HANGUL SYLLABLE THIEUTH AE KIYEOKSIOS -0xB584 0xD0E1 #HANGUL SYLLABLE THIEUTH AE NIEUNCIEUC -0xB585 0xD0E2 #HANGUL SYLLABLE THIEUTH AE NIEUNHIEUH -0xB586 0xD0E3 #HANGUL SYLLABLE THIEUTH AE TIKEUT -0xB587 0xD0E5 #HANGUL SYLLABLE THIEUTH AE RIEULKIYEOK -0xB588 0xD0E6 #HANGUL SYLLABLE THIEUTH AE RIEULMIEUM -0xB589 0xD0E7 #HANGUL SYLLABLE THIEUTH AE RIEULPIEUP -0xB58A 0xD0E8 #HANGUL SYLLABLE THIEUTH AE RIEULSIOS -0xB58B 0xD0E9 #HANGUL SYLLABLE THIEUTH AE RIEULTHIEUTH -0xB58C 0xD0EA #HANGUL SYLLABLE THIEUTH AE RIEULPHIEUPH -0xB58D 0xD0EB #HANGUL SYLLABLE THIEUTH AE RIEULHIEUH -0xB58E 0xD0EE #HANGUL SYLLABLE THIEUTH AE PIEUPSIOS -0xB58F 0xD0F2 #HANGUL SYLLABLE THIEUTH AE CIEUC -0xB590 0xD0F3 #HANGUL SYLLABLE THIEUTH AE CHIEUCH -0xB591 0xD0F4 #HANGUL SYLLABLE THIEUTH AE KHIEUKH -0xB592 0xD0F5 #HANGUL SYLLABLE THIEUTH AE THIEUTH -0xB593 0xD0F6 #HANGUL SYLLABLE THIEUTH AE PHIEUPH -0xB594 0xD0F7 #HANGUL SYLLABLE THIEUTH AE HIEUH -0xB595 0xD0F9 #HANGUL SYLLABLE THIEUTH YA KIYEOK -0xB596 0xD0FA #HANGUL SYLLABLE THIEUTH YA SSANGKIYEOK -0xB597 0xD0FB #HANGUL SYLLABLE THIEUTH YA KIYEOKSIOS -0xB598 0xD0FC #HANGUL SYLLABLE THIEUTH YA NIEUN -0xB599 0xD0FD #HANGUL SYLLABLE THIEUTH YA NIEUNCIEUC -0xB59A 0xD0FE #HANGUL SYLLABLE THIEUTH YA NIEUNHIEUH -0xB59B 0xD0FF #HANGUL SYLLABLE THIEUTH YA TIKEUT -0xB59C 0xD100 #HANGUL SYLLABLE THIEUTH YA RIEUL -0xB59D 0xD101 #HANGUL SYLLABLE THIEUTH YA RIEULKIYEOK -0xB59E 0xD102 #HANGUL SYLLABLE THIEUTH YA RIEULMIEUM -0xB59F 0xD103 #HANGUL SYLLABLE THIEUTH YA RIEULPIEUP -0xB5A0 0xD104 #HANGUL SYLLABLE THIEUTH YA RIEULSIOS -0xB5A1 0xB367 #HANGUL SYLLABLE TIKEUT EO SIOS -0xB5A2 0xB369 #HANGUL SYLLABLE TIKEUT EO IEUNG -0xB5A3 0xB36B #HANGUL SYLLABLE TIKEUT EO CHIEUCH -0xB5A4 0xB36E #HANGUL SYLLABLE TIKEUT EO PHIEUPH -0xB5A5 0xB370 #HANGUL SYLLABLE TIKEUT E -0xB5A6 0xB371 #HANGUL SYLLABLE TIKEUT E KIYEOK -0xB5A7 0xB374 #HANGUL SYLLABLE TIKEUT E NIEUN -0xB5A8 0xB378 #HANGUL SYLLABLE TIKEUT E RIEUL -0xB5A9 0xB380 #HANGUL SYLLABLE TIKEUT E MIEUM -0xB5AA 0xB381 #HANGUL SYLLABLE TIKEUT E PIEUP -0xB5AB 0xB383 #HANGUL SYLLABLE TIKEUT E SIOS -0xB5AC 0xB384 #HANGUL SYLLABLE TIKEUT E SSANGSIOS -0xB5AD 0xB385 #HANGUL SYLLABLE TIKEUT E IEUNG -0xB5AE 0xB38C #HANGUL SYLLABLE TIKEUT YEO -0xB5AF 0xB390 #HANGUL SYLLABLE TIKEUT YEO NIEUN -0xB5B0 0xB394 #HANGUL SYLLABLE TIKEUT YEO RIEUL -0xB5B1 0xB3A0 #HANGUL SYLLABLE TIKEUT YEO SSANGSIOS -0xB5B2 0xB3A1 #HANGUL SYLLABLE TIKEUT YEO IEUNG -0xB5B3 0xB3A8 #HANGUL SYLLABLE TIKEUT YE -0xB5B4 0xB3AC #HANGUL SYLLABLE TIKEUT YE NIEUN -0xB5B5 0xB3C4 #HANGUL SYLLABLE TIKEUT O -0xB5B6 0xB3C5 #HANGUL SYLLABLE TIKEUT O KIYEOK -0xB5B7 0xB3C8 #HANGUL SYLLABLE TIKEUT O NIEUN -0xB5B8 0xB3CB #HANGUL SYLLABLE TIKEUT O TIKEUT -0xB5B9 0xB3CC #HANGUL SYLLABLE TIKEUT O RIEUL -0xB5BA 0xB3CE #HANGUL SYLLABLE TIKEUT O RIEULMIEUM -0xB5BB 0xB3D0 #HANGUL SYLLABLE TIKEUT O RIEULSIOS -0xB5BC 0xB3D4 #HANGUL SYLLABLE TIKEUT O MIEUM -0xB5BD 0xB3D5 #HANGUL SYLLABLE TIKEUT O PIEUP -0xB5BE 0xB3D7 #HANGUL SYLLABLE TIKEUT O SIOS -0xB5BF 0xB3D9 #HANGUL SYLLABLE TIKEUT O IEUNG -0xB5C0 0xB3DB #HANGUL SYLLABLE TIKEUT O CHIEUCH -0xB5C1 0xB3DD #HANGUL SYLLABLE TIKEUT O THIEUTH -0xB5C2 0xB3E0 #HANGUL SYLLABLE TIKEUT WA -0xB5C3 0xB3E4 #HANGUL SYLLABLE TIKEUT WA NIEUN -0xB5C4 0xB3E8 #HANGUL SYLLABLE TIKEUT WA RIEUL -0xB5C5 0xB3FC #HANGUL SYLLABLE TIKEUT WAE -0xB5C6 0xB410 #HANGUL SYLLABLE TIKEUT WAE SSANGSIOS -0xB5C7 0xB418 #HANGUL SYLLABLE TIKEUT OE -0xB5C8 0xB41C #HANGUL SYLLABLE TIKEUT OE NIEUN -0xB5C9 0xB420 #HANGUL SYLLABLE TIKEUT OE RIEUL -0xB5CA 0xB428 #HANGUL SYLLABLE TIKEUT OE MIEUM -0xB5CB 0xB429 #HANGUL SYLLABLE TIKEUT OE PIEUP -0xB5CC 0xB42B #HANGUL SYLLABLE TIKEUT OE SIOS -0xB5CD 0xB434 #HANGUL SYLLABLE TIKEUT YO -0xB5CE 0xB450 #HANGUL SYLLABLE TIKEUT U -0xB5CF 0xB451 #HANGUL SYLLABLE TIKEUT U KIYEOK -0xB5D0 0xB454 #HANGUL SYLLABLE TIKEUT U NIEUN -0xB5D1 0xB458 #HANGUL SYLLABLE TIKEUT U RIEUL -0xB5D2 0xB460 #HANGUL SYLLABLE TIKEUT U MIEUM -0xB5D3 0xB461 #HANGUL SYLLABLE TIKEUT U PIEUP -0xB5D4 0xB463 #HANGUL SYLLABLE TIKEUT U SIOS -0xB5D5 0xB465 #HANGUL SYLLABLE TIKEUT U IEUNG -0xB5D6 0xB46C #HANGUL SYLLABLE TIKEUT WEO -0xB5D7 0xB480 #HANGUL SYLLABLE TIKEUT WEO SSANGSIOS -0xB5D8 0xB488 #HANGUL SYLLABLE TIKEUT WE -0xB5D9 0xB49D #HANGUL SYLLABLE TIKEUT WE IEUNG -0xB5DA 0xB4A4 #HANGUL SYLLABLE TIKEUT WI -0xB5DB 0xB4A8 #HANGUL SYLLABLE TIKEUT WI NIEUN -0xB5DC 0xB4AC #HANGUL SYLLABLE TIKEUT WI RIEUL -0xB5DD 0xB4B5 #HANGUL SYLLABLE TIKEUT WI PIEUP -0xB5DE 0xB4B7 #HANGUL SYLLABLE TIKEUT WI SIOS -0xB5DF 0xB4B9 #HANGUL SYLLABLE TIKEUT WI IEUNG -0xB5E0 0xB4C0 #HANGUL SYLLABLE TIKEUT YU -0xB5E1 0xB4C4 #HANGUL SYLLABLE TIKEUT YU NIEUN -0xB5E2 0xB4C8 #HANGUL SYLLABLE TIKEUT YU RIEUL -0xB5E3 0xB4D0 #HANGUL SYLLABLE TIKEUT YU MIEUM -0xB5E4 0xB4D5 #HANGUL SYLLABLE TIKEUT YU IEUNG -0xB5E5 0xB4DC #HANGUL SYLLABLE TIKEUT EU -0xB5E6 0xB4DD #HANGUL SYLLABLE TIKEUT EU KIYEOK -0xB5E7 0xB4E0 #HANGUL SYLLABLE TIKEUT EU NIEUN -0xB5E8 0xB4E3 #HANGUL SYLLABLE TIKEUT EU TIKEUT -0xB5E9 0xB4E4 #HANGUL SYLLABLE TIKEUT EU RIEUL -0xB5EA 0xB4E6 #HANGUL SYLLABLE TIKEUT EU RIEULMIEUM -0xB5EB 0xB4EC #HANGUL SYLLABLE TIKEUT EU MIEUM -0xB5EC 0xB4ED #HANGUL SYLLABLE TIKEUT EU PIEUP -0xB5ED 0xB4EF #HANGUL SYLLABLE TIKEUT EU SIOS -0xB5EE 0xB4F1 #HANGUL SYLLABLE TIKEUT EU IEUNG -0xB5EF 0xB4F8 #HANGUL SYLLABLE TIKEUT YI -0xB5F0 0xB514 #HANGUL SYLLABLE TIKEUT I -0xB5F1 0xB515 #HANGUL SYLLABLE TIKEUT I KIYEOK -0xB5F2 0xB518 #HANGUL SYLLABLE TIKEUT I NIEUN -0xB5F3 0xB51B #HANGUL SYLLABLE TIKEUT I TIKEUT -0xB5F4 0xB51C #HANGUL SYLLABLE TIKEUT I RIEUL -0xB5F5 0xB524 #HANGUL SYLLABLE TIKEUT I MIEUM -0xB5F6 0xB525 #HANGUL SYLLABLE TIKEUT I PIEUP -0xB5F7 0xB527 #HANGUL SYLLABLE TIKEUT I SIOS -0xB5F8 0xB528 #HANGUL SYLLABLE TIKEUT I SSANGSIOS -0xB5F9 0xB529 #HANGUL SYLLABLE TIKEUT I IEUNG -0xB5FA 0xB52A #HANGUL SYLLABLE TIKEUT I CIEUC -0xB5FB 0xB530 #HANGUL SYLLABLE SSANGTIKEUT A -0xB5FC 0xB531 #HANGUL SYLLABLE SSANGTIKEUT A KIYEOK -0xB5FD 0xB534 #HANGUL SYLLABLE SSANGTIKEUT A NIEUN -0xB5FE 0xB538 #HANGUL SYLLABLE SSANGTIKEUT A RIEUL -0xB641 0xD105 #HANGUL SYLLABLE THIEUTH YA RIEULTHIEUTH -0xB642 0xD106 #HANGUL SYLLABLE THIEUTH YA RIEULPHIEUPH -0xB643 0xD107 #HANGUL SYLLABLE THIEUTH YA RIEULHIEUH -0xB644 0xD108 #HANGUL SYLLABLE THIEUTH YA MIEUM -0xB645 0xD109 #HANGUL SYLLABLE THIEUTH YA PIEUP -0xB646 0xD10A #HANGUL SYLLABLE THIEUTH YA PIEUPSIOS -0xB647 0xD10B #HANGUL SYLLABLE THIEUTH YA SIOS -0xB648 0xD10C #HANGUL SYLLABLE THIEUTH YA SSANGSIOS -0xB649 0xD10E #HANGUL SYLLABLE THIEUTH YA CIEUC -0xB64A 0xD10F #HANGUL SYLLABLE THIEUTH YA CHIEUCH -0xB64B 0xD110 #HANGUL SYLLABLE THIEUTH YA KHIEUKH -0xB64C 0xD111 #HANGUL SYLLABLE THIEUTH YA THIEUTH -0xB64D 0xD112 #HANGUL SYLLABLE THIEUTH YA PHIEUPH -0xB64E 0xD113 #HANGUL SYLLABLE THIEUTH YA HIEUH -0xB64F 0xD114 #HANGUL SYLLABLE THIEUTH YAE -0xB650 0xD115 #HANGUL SYLLABLE THIEUTH YAE KIYEOK -0xB651 0xD116 #HANGUL SYLLABLE THIEUTH YAE SSANGKIYEOK -0xB652 0xD117 #HANGUL SYLLABLE THIEUTH YAE KIYEOKSIOS -0xB653 0xD118 #HANGUL SYLLABLE THIEUTH YAE NIEUN -0xB654 0xD119 #HANGUL SYLLABLE THIEUTH YAE NIEUNCIEUC -0xB655 0xD11A #HANGUL SYLLABLE THIEUTH YAE NIEUNHIEUH -0xB656 0xD11B #HANGUL SYLLABLE THIEUTH YAE TIKEUT -0xB657 0xD11C #HANGUL SYLLABLE THIEUTH YAE RIEUL -0xB658 0xD11D #HANGUL SYLLABLE THIEUTH YAE RIEULKIYEOK -0xB659 0xD11E #HANGUL SYLLABLE THIEUTH YAE RIEULMIEUM -0xB65A 0xD11F #HANGUL SYLLABLE THIEUTH YAE RIEULPIEUP -0xB661 0xD120 #HANGUL SYLLABLE THIEUTH YAE RIEULSIOS -0xB662 0xD121 #HANGUL SYLLABLE THIEUTH YAE RIEULTHIEUTH -0xB663 0xD122 #HANGUL SYLLABLE THIEUTH YAE RIEULPHIEUPH -0xB664 0xD123 #HANGUL SYLLABLE THIEUTH YAE RIEULHIEUH -0xB665 0xD124 #HANGUL SYLLABLE THIEUTH YAE MIEUM -0xB666 0xD125 #HANGUL SYLLABLE THIEUTH YAE PIEUP -0xB667 0xD126 #HANGUL SYLLABLE THIEUTH YAE PIEUPSIOS -0xB668 0xD127 #HANGUL SYLLABLE THIEUTH YAE SIOS -0xB669 0xD128 #HANGUL SYLLABLE THIEUTH YAE SSANGSIOS -0xB66A 0xD129 #HANGUL SYLLABLE THIEUTH YAE IEUNG -0xB66B 0xD12A #HANGUL SYLLABLE THIEUTH YAE CIEUC -0xB66C 0xD12B #HANGUL SYLLABLE THIEUTH YAE CHIEUCH -0xB66D 0xD12C #HANGUL SYLLABLE THIEUTH YAE KHIEUKH -0xB66E 0xD12D #HANGUL SYLLABLE THIEUTH YAE THIEUTH -0xB66F 0xD12E #HANGUL SYLLABLE THIEUTH YAE PHIEUPH -0xB670 0xD12F #HANGUL SYLLABLE THIEUTH YAE HIEUH -0xB671 0xD132 #HANGUL SYLLABLE THIEUTH EO SSANGKIYEOK -0xB672 0xD133 #HANGUL SYLLABLE THIEUTH EO KIYEOKSIOS -0xB673 0xD135 #HANGUL SYLLABLE THIEUTH EO NIEUNCIEUC -0xB674 0xD136 #HANGUL SYLLABLE THIEUTH EO NIEUNHIEUH -0xB675 0xD137 #HANGUL SYLLABLE THIEUTH EO TIKEUT -0xB676 0xD139 #HANGUL SYLLABLE THIEUTH EO RIEULKIYEOK -0xB677 0xD13B #HANGUL SYLLABLE THIEUTH EO RIEULPIEUP -0xB678 0xD13C #HANGUL SYLLABLE THIEUTH EO RIEULSIOS -0xB679 0xD13D #HANGUL SYLLABLE THIEUTH EO RIEULTHIEUTH -0xB67A 0xD13E #HANGUL SYLLABLE THIEUTH EO RIEULPHIEUPH -0xB681 0xD13F #HANGUL SYLLABLE THIEUTH EO RIEULHIEUH -0xB682 0xD142 #HANGUL SYLLABLE THIEUTH EO PIEUPSIOS -0xB683 0xD146 #HANGUL SYLLABLE THIEUTH EO CIEUC -0xB684 0xD147 #HANGUL SYLLABLE THIEUTH EO CHIEUCH -0xB685 0xD148 #HANGUL SYLLABLE THIEUTH EO KHIEUKH -0xB686 0xD149 #HANGUL SYLLABLE THIEUTH EO THIEUTH -0xB687 0xD14A #HANGUL SYLLABLE THIEUTH EO PHIEUPH -0xB688 0xD14B #HANGUL SYLLABLE THIEUTH EO HIEUH -0xB689 0xD14E #HANGUL SYLLABLE THIEUTH E SSANGKIYEOK -0xB68A 0xD14F #HANGUL SYLLABLE THIEUTH E KIYEOKSIOS -0xB68B 0xD151 #HANGUL SYLLABLE THIEUTH E NIEUNCIEUC -0xB68C 0xD152 #HANGUL SYLLABLE THIEUTH E NIEUNHIEUH -0xB68D 0xD153 #HANGUL SYLLABLE THIEUTH E TIKEUT -0xB68E 0xD155 #HANGUL SYLLABLE THIEUTH E RIEULKIYEOK -0xB68F 0xD156 #HANGUL SYLLABLE THIEUTH E RIEULMIEUM -0xB690 0xD157 #HANGUL SYLLABLE THIEUTH E RIEULPIEUP -0xB691 0xD158 #HANGUL SYLLABLE THIEUTH E RIEULSIOS -0xB692 0xD159 #HANGUL SYLLABLE THIEUTH E RIEULTHIEUTH -0xB693 0xD15A #HANGUL SYLLABLE THIEUTH E RIEULPHIEUPH -0xB694 0xD15B #HANGUL SYLLABLE THIEUTH E RIEULHIEUH -0xB695 0xD15E #HANGUL SYLLABLE THIEUTH E PIEUPSIOS -0xB696 0xD160 #HANGUL SYLLABLE THIEUTH E SSANGSIOS -0xB697 0xD162 #HANGUL SYLLABLE THIEUTH E CIEUC -0xB698 0xD163 #HANGUL SYLLABLE THIEUTH E CHIEUCH -0xB699 0xD164 #HANGUL SYLLABLE THIEUTH E KHIEUKH -0xB69A 0xD165 #HANGUL SYLLABLE THIEUTH E THIEUTH -0xB69B 0xD166 #HANGUL SYLLABLE THIEUTH E PHIEUPH -0xB69C 0xD167 #HANGUL SYLLABLE THIEUTH E HIEUH -0xB69D 0xD169 #HANGUL SYLLABLE THIEUTH YEO KIYEOK -0xB69E 0xD16A #HANGUL SYLLABLE THIEUTH YEO SSANGKIYEOK -0xB69F 0xD16B #HANGUL SYLLABLE THIEUTH YEO KIYEOKSIOS -0xB6A0 0xD16D #HANGUL SYLLABLE THIEUTH YEO NIEUNCIEUC -0xB6A1 0xB540 #HANGUL SYLLABLE SSANGTIKEUT A MIEUM -0xB6A2 0xB541 #HANGUL SYLLABLE SSANGTIKEUT A PIEUP -0xB6A3 0xB543 #HANGUL SYLLABLE SSANGTIKEUT A SIOS -0xB6A4 0xB544 #HANGUL SYLLABLE SSANGTIKEUT A SSANGSIOS -0xB6A5 0xB545 #HANGUL SYLLABLE SSANGTIKEUT A IEUNG -0xB6A6 0xB54B #HANGUL SYLLABLE SSANGTIKEUT A HIEUH -0xB6A7 0xB54C #HANGUL SYLLABLE SSANGTIKEUT AE -0xB6A8 0xB54D #HANGUL SYLLABLE SSANGTIKEUT AE KIYEOK -0xB6A9 0xB550 #HANGUL SYLLABLE SSANGTIKEUT AE NIEUN -0xB6AA 0xB554 #HANGUL SYLLABLE SSANGTIKEUT AE RIEUL -0xB6AB 0xB55C #HANGUL SYLLABLE SSANGTIKEUT AE MIEUM -0xB6AC 0xB55D #HANGUL SYLLABLE SSANGTIKEUT AE PIEUP -0xB6AD 0xB55F #HANGUL SYLLABLE SSANGTIKEUT AE SIOS -0xB6AE 0xB560 #HANGUL SYLLABLE SSANGTIKEUT AE SSANGSIOS -0xB6AF 0xB561 #HANGUL SYLLABLE SSANGTIKEUT AE IEUNG -0xB6B0 0xB5A0 #HANGUL SYLLABLE SSANGTIKEUT EO -0xB6B1 0xB5A1 #HANGUL SYLLABLE SSANGTIKEUT EO KIYEOK -0xB6B2 0xB5A4 #HANGUL SYLLABLE SSANGTIKEUT EO NIEUN -0xB6B3 0xB5A8 #HANGUL SYLLABLE SSANGTIKEUT EO RIEUL -0xB6B4 0xB5AA #HANGUL SYLLABLE SSANGTIKEUT EO RIEULMIEUM -0xB6B5 0xB5AB #HANGUL SYLLABLE SSANGTIKEUT EO RIEULPIEUP -0xB6B6 0xB5B0 #HANGUL SYLLABLE SSANGTIKEUT EO MIEUM -0xB6B7 0xB5B1 #HANGUL SYLLABLE SSANGTIKEUT EO PIEUP -0xB6B8 0xB5B3 #HANGUL SYLLABLE SSANGTIKEUT EO SIOS -0xB6B9 0xB5B4 #HANGUL SYLLABLE SSANGTIKEUT EO SSANGSIOS -0xB6BA 0xB5B5 #HANGUL SYLLABLE SSANGTIKEUT EO IEUNG -0xB6BB 0xB5BB #HANGUL SYLLABLE SSANGTIKEUT EO HIEUH -0xB6BC 0xB5BC #HANGUL SYLLABLE SSANGTIKEUT E -0xB6BD 0xB5BD #HANGUL SYLLABLE SSANGTIKEUT E KIYEOK -0xB6BE 0xB5C0 #HANGUL SYLLABLE SSANGTIKEUT E NIEUN -0xB6BF 0xB5C4 #HANGUL SYLLABLE SSANGTIKEUT E RIEUL -0xB6C0 0xB5CC #HANGUL SYLLABLE SSANGTIKEUT E MIEUM -0xB6C1 0xB5CD #HANGUL SYLLABLE SSANGTIKEUT E PIEUP -0xB6C2 0xB5CF #HANGUL SYLLABLE SSANGTIKEUT E SIOS -0xB6C3 0xB5D0 #HANGUL SYLLABLE SSANGTIKEUT E SSANGSIOS -0xB6C4 0xB5D1 #HANGUL SYLLABLE SSANGTIKEUT E IEUNG -0xB6C5 0xB5D8 #HANGUL SYLLABLE SSANGTIKEUT YEO -0xB6C6 0xB5EC #HANGUL SYLLABLE SSANGTIKEUT YEO SSANGSIOS -0xB6C7 0xB610 #HANGUL SYLLABLE SSANGTIKEUT O -0xB6C8 0xB611 #HANGUL SYLLABLE SSANGTIKEUT O KIYEOK -0xB6C9 0xB614 #HANGUL SYLLABLE SSANGTIKEUT O NIEUN -0xB6CA 0xB618 #HANGUL SYLLABLE SSANGTIKEUT O RIEUL -0xB6CB 0xB625 #HANGUL SYLLABLE SSANGTIKEUT O IEUNG -0xB6CC 0xB62C #HANGUL SYLLABLE SSANGTIKEUT WA -0xB6CD 0xB634 #HANGUL SYLLABLE SSANGTIKEUT WA RIEUL -0xB6CE 0xB648 #HANGUL SYLLABLE SSANGTIKEUT WAE -0xB6CF 0xB664 #HANGUL SYLLABLE SSANGTIKEUT OE -0xB6D0 0xB668 #HANGUL SYLLABLE SSANGTIKEUT OE NIEUN -0xB6D1 0xB69C #HANGUL SYLLABLE SSANGTIKEUT U -0xB6D2 0xB69D #HANGUL SYLLABLE SSANGTIKEUT U KIYEOK -0xB6D3 0xB6A0 #HANGUL SYLLABLE SSANGTIKEUT U NIEUN -0xB6D4 0xB6A4 #HANGUL SYLLABLE SSANGTIKEUT U RIEUL -0xB6D5 0xB6AB #HANGUL SYLLABLE SSANGTIKEUT U RIEULHIEUH -0xB6D6 0xB6AC #HANGUL SYLLABLE SSANGTIKEUT U MIEUM -0xB6D7 0xB6B1 #HANGUL SYLLABLE SSANGTIKEUT U IEUNG -0xB6D8 0xB6D4 #HANGUL SYLLABLE SSANGTIKEUT WE -0xB6D9 0xB6F0 #HANGUL SYLLABLE SSANGTIKEUT WI -0xB6DA 0xB6F4 #HANGUL SYLLABLE SSANGTIKEUT WI NIEUN -0xB6DB 0xB6F8 #HANGUL SYLLABLE SSANGTIKEUT WI RIEUL -0xB6DC 0xB700 #HANGUL SYLLABLE SSANGTIKEUT WI MIEUM -0xB6DD 0xB701 #HANGUL SYLLABLE SSANGTIKEUT WI PIEUP -0xB6DE 0xB705 #HANGUL SYLLABLE SSANGTIKEUT WI IEUNG -0xB6DF 0xB728 #HANGUL SYLLABLE SSANGTIKEUT EU -0xB6E0 0xB729 #HANGUL SYLLABLE SSANGTIKEUT EU KIYEOK -0xB6E1 0xB72C #HANGUL SYLLABLE SSANGTIKEUT EU NIEUN -0xB6E2 0xB72F #HANGUL SYLLABLE SSANGTIKEUT EU TIKEUT -0xB6E3 0xB730 #HANGUL SYLLABLE SSANGTIKEUT EU RIEUL -0xB6E4 0xB738 #HANGUL SYLLABLE SSANGTIKEUT EU MIEUM -0xB6E5 0xB739 #HANGUL SYLLABLE SSANGTIKEUT EU PIEUP -0xB6E6 0xB73B #HANGUL SYLLABLE SSANGTIKEUT EU SIOS -0xB6E7 0xB744 #HANGUL SYLLABLE SSANGTIKEUT YI -0xB6E8 0xB748 #HANGUL SYLLABLE SSANGTIKEUT YI NIEUN -0xB6E9 0xB74C #HANGUL SYLLABLE SSANGTIKEUT YI RIEUL -0xB6EA 0xB754 #HANGUL SYLLABLE SSANGTIKEUT YI MIEUM -0xB6EB 0xB755 #HANGUL SYLLABLE SSANGTIKEUT YI PIEUP -0xB6EC 0xB760 #HANGUL SYLLABLE SSANGTIKEUT I -0xB6ED 0xB764 #HANGUL SYLLABLE SSANGTIKEUT I NIEUN -0xB6EE 0xB768 #HANGUL SYLLABLE SSANGTIKEUT I RIEUL -0xB6EF 0xB770 #HANGUL SYLLABLE SSANGTIKEUT I MIEUM -0xB6F0 0xB771 #HANGUL SYLLABLE SSANGTIKEUT I PIEUP -0xB6F1 0xB773 #HANGUL SYLLABLE SSANGTIKEUT I SIOS -0xB6F2 0xB775 #HANGUL SYLLABLE SSANGTIKEUT I IEUNG -0xB6F3 0xB77C #HANGUL SYLLABLE RIEUL A -0xB6F4 0xB77D #HANGUL SYLLABLE RIEUL A KIYEOK -0xB6F5 0xB780 #HANGUL SYLLABLE RIEUL A NIEUN -0xB6F6 0xB784 #HANGUL SYLLABLE RIEUL A RIEUL -0xB6F7 0xB78C #HANGUL SYLLABLE RIEUL A MIEUM -0xB6F8 0xB78D #HANGUL SYLLABLE RIEUL A PIEUP -0xB6F9 0xB78F #HANGUL SYLLABLE RIEUL A SIOS -0xB6FA 0xB790 #HANGUL SYLLABLE RIEUL A SSANGSIOS -0xB6FB 0xB791 #HANGUL SYLLABLE RIEUL A IEUNG -0xB6FC 0xB792 #HANGUL SYLLABLE RIEUL A CIEUC -0xB6FD 0xB796 #HANGUL SYLLABLE RIEUL A PHIEUPH -0xB6FE 0xB797 #HANGUL SYLLABLE RIEUL A HIEUH -0xB741 0xD16E #HANGUL SYLLABLE THIEUTH YEO NIEUNHIEUH -0xB742 0xD16F #HANGUL SYLLABLE THIEUTH YEO TIKEUT -0xB743 0xD170 #HANGUL SYLLABLE THIEUTH YEO RIEUL -0xB744 0xD171 #HANGUL SYLLABLE THIEUTH YEO RIEULKIYEOK -0xB745 0xD172 #HANGUL SYLLABLE THIEUTH YEO RIEULMIEUM -0xB746 0xD173 #HANGUL SYLLABLE THIEUTH YEO RIEULPIEUP -0xB747 0xD174 #HANGUL SYLLABLE THIEUTH YEO RIEULSIOS -0xB748 0xD175 #HANGUL SYLLABLE THIEUTH YEO RIEULTHIEUTH -0xB749 0xD176 #HANGUL SYLLABLE THIEUTH YEO RIEULPHIEUPH -0xB74A 0xD177 #HANGUL SYLLABLE THIEUTH YEO RIEULHIEUH -0xB74B 0xD178 #HANGUL SYLLABLE THIEUTH YEO MIEUM -0xB74C 0xD179 #HANGUL SYLLABLE THIEUTH YEO PIEUP -0xB74D 0xD17A #HANGUL SYLLABLE THIEUTH YEO PIEUPSIOS -0xB74E 0xD17B #HANGUL SYLLABLE THIEUTH YEO SIOS -0xB74F 0xD17D #HANGUL SYLLABLE THIEUTH YEO IEUNG -0xB750 0xD17E #HANGUL SYLLABLE THIEUTH YEO CIEUC -0xB751 0xD17F #HANGUL SYLLABLE THIEUTH YEO CHIEUCH -0xB752 0xD180 #HANGUL SYLLABLE THIEUTH YEO KHIEUKH -0xB753 0xD181 #HANGUL SYLLABLE THIEUTH YEO THIEUTH -0xB754 0xD182 #HANGUL SYLLABLE THIEUTH YEO PHIEUPH -0xB755 0xD183 #HANGUL SYLLABLE THIEUTH YEO HIEUH -0xB756 0xD185 #HANGUL SYLLABLE THIEUTH YE KIYEOK -0xB757 0xD186 #HANGUL SYLLABLE THIEUTH YE SSANGKIYEOK -0xB758 0xD187 #HANGUL SYLLABLE THIEUTH YE KIYEOKSIOS -0xB759 0xD189 #HANGUL SYLLABLE THIEUTH YE NIEUNCIEUC -0xB75A 0xD18A #HANGUL SYLLABLE THIEUTH YE NIEUNHIEUH -0xB761 0xD18B #HANGUL SYLLABLE THIEUTH YE TIKEUT -0xB762 0xD18C #HANGUL SYLLABLE THIEUTH YE RIEUL -0xB763 0xD18D #HANGUL SYLLABLE THIEUTH YE RIEULKIYEOK -0xB764 0xD18E #HANGUL SYLLABLE THIEUTH YE RIEULMIEUM -0xB765 0xD18F #HANGUL SYLLABLE THIEUTH YE RIEULPIEUP -0xB766 0xD190 #HANGUL SYLLABLE THIEUTH YE RIEULSIOS -0xB767 0xD191 #HANGUL SYLLABLE THIEUTH YE RIEULTHIEUTH -0xB768 0xD192 #HANGUL SYLLABLE THIEUTH YE RIEULPHIEUPH -0xB769 0xD193 #HANGUL SYLLABLE THIEUTH YE RIEULHIEUH -0xB76A 0xD194 #HANGUL SYLLABLE THIEUTH YE MIEUM -0xB76B 0xD195 #HANGUL SYLLABLE THIEUTH YE PIEUP -0xB76C 0xD196 #HANGUL SYLLABLE THIEUTH YE PIEUPSIOS -0xB76D 0xD197 #HANGUL SYLLABLE THIEUTH YE SIOS -0xB76E 0xD198 #HANGUL SYLLABLE THIEUTH YE SSANGSIOS -0xB76F 0xD199 #HANGUL SYLLABLE THIEUTH YE IEUNG -0xB770 0xD19A #HANGUL SYLLABLE THIEUTH YE CIEUC -0xB771 0xD19B #HANGUL SYLLABLE THIEUTH YE CHIEUCH -0xB772 0xD19C #HANGUL SYLLABLE THIEUTH YE KHIEUKH -0xB773 0xD19D #HANGUL SYLLABLE THIEUTH YE THIEUTH -0xB774 0xD19E #HANGUL SYLLABLE THIEUTH YE PHIEUPH -0xB775 0xD19F #HANGUL SYLLABLE THIEUTH YE HIEUH -0xB776 0xD1A2 #HANGUL SYLLABLE THIEUTH O SSANGKIYEOK -0xB777 0xD1A3 #HANGUL SYLLABLE THIEUTH O KIYEOKSIOS -0xB778 0xD1A5 #HANGUL SYLLABLE THIEUTH O NIEUNCIEUC -0xB779 0xD1A6 #HANGUL SYLLABLE THIEUTH O NIEUNHIEUH -0xB77A 0xD1A7 #HANGUL SYLLABLE THIEUTH O TIKEUT -0xB781 0xD1A9 #HANGUL SYLLABLE THIEUTH O RIEULKIYEOK -0xB782 0xD1AA #HANGUL SYLLABLE THIEUTH O RIEULMIEUM -0xB783 0xD1AB #HANGUL SYLLABLE THIEUTH O RIEULPIEUP -0xB784 0xD1AC #HANGUL SYLLABLE THIEUTH O RIEULSIOS -0xB785 0xD1AD #HANGUL SYLLABLE THIEUTH O RIEULTHIEUTH -0xB786 0xD1AE #HANGUL SYLLABLE THIEUTH O RIEULPHIEUPH -0xB787 0xD1AF #HANGUL SYLLABLE THIEUTH O RIEULHIEUH -0xB788 0xD1B2 #HANGUL SYLLABLE THIEUTH O PIEUPSIOS -0xB789 0xD1B4 #HANGUL SYLLABLE THIEUTH O SSANGSIOS -0xB78A 0xD1B6 #HANGUL SYLLABLE THIEUTH O CIEUC -0xB78B 0xD1B7 #HANGUL SYLLABLE THIEUTH O CHIEUCH -0xB78C 0xD1B8 #HANGUL SYLLABLE THIEUTH O KHIEUKH -0xB78D 0xD1B9 #HANGUL SYLLABLE THIEUTH O THIEUTH -0xB78E 0xD1BB #HANGUL SYLLABLE THIEUTH O HIEUH -0xB78F 0xD1BD #HANGUL SYLLABLE THIEUTH WA KIYEOK -0xB790 0xD1BE #HANGUL SYLLABLE THIEUTH WA SSANGKIYEOK -0xB791 0xD1BF #HANGUL SYLLABLE THIEUTH WA KIYEOKSIOS -0xB792 0xD1C1 #HANGUL SYLLABLE THIEUTH WA NIEUNCIEUC -0xB793 0xD1C2 #HANGUL SYLLABLE THIEUTH WA NIEUNHIEUH -0xB794 0xD1C3 #HANGUL SYLLABLE THIEUTH WA TIKEUT -0xB795 0xD1C4 #HANGUL SYLLABLE THIEUTH WA RIEUL -0xB796 0xD1C5 #HANGUL SYLLABLE THIEUTH WA RIEULKIYEOK -0xB797 0xD1C6 #HANGUL SYLLABLE THIEUTH WA RIEULMIEUM -0xB798 0xD1C7 #HANGUL SYLLABLE THIEUTH WA RIEULPIEUP -0xB799 0xD1C8 #HANGUL SYLLABLE THIEUTH WA RIEULSIOS -0xB79A 0xD1C9 #HANGUL SYLLABLE THIEUTH WA RIEULTHIEUTH -0xB79B 0xD1CA #HANGUL SYLLABLE THIEUTH WA RIEULPHIEUPH -0xB79C 0xD1CB #HANGUL SYLLABLE THIEUTH WA RIEULHIEUH -0xB79D 0xD1CC #HANGUL SYLLABLE THIEUTH WA MIEUM -0xB79E 0xD1CD #HANGUL SYLLABLE THIEUTH WA PIEUP -0xB79F 0xD1CE #HANGUL SYLLABLE THIEUTH WA PIEUPSIOS -0xB7A0 0xD1CF #HANGUL SYLLABLE THIEUTH WA SIOS -0xB7A1 0xB798 #HANGUL SYLLABLE RIEUL AE -0xB7A2 0xB799 #HANGUL SYLLABLE RIEUL AE KIYEOK -0xB7A3 0xB79C #HANGUL SYLLABLE RIEUL AE NIEUN -0xB7A4 0xB7A0 #HANGUL SYLLABLE RIEUL AE RIEUL -0xB7A5 0xB7A8 #HANGUL SYLLABLE RIEUL AE MIEUM -0xB7A6 0xB7A9 #HANGUL SYLLABLE RIEUL AE PIEUP -0xB7A7 0xB7AB #HANGUL SYLLABLE RIEUL AE SIOS -0xB7A8 0xB7AC #HANGUL SYLLABLE RIEUL AE SSANGSIOS -0xB7A9 0xB7AD #HANGUL SYLLABLE RIEUL AE IEUNG -0xB7AA 0xB7B4 #HANGUL SYLLABLE RIEUL YA -0xB7AB 0xB7B5 #HANGUL SYLLABLE RIEUL YA KIYEOK -0xB7AC 0xB7B8 #HANGUL SYLLABLE RIEUL YA NIEUN -0xB7AD 0xB7C7 #HANGUL SYLLABLE RIEUL YA SIOS -0xB7AE 0xB7C9 #HANGUL SYLLABLE RIEUL YA IEUNG -0xB7AF 0xB7EC #HANGUL SYLLABLE RIEUL EO -0xB7B0 0xB7ED #HANGUL SYLLABLE RIEUL EO KIYEOK -0xB7B1 0xB7F0 #HANGUL SYLLABLE RIEUL EO NIEUN -0xB7B2 0xB7F4 #HANGUL SYLLABLE RIEUL EO RIEUL -0xB7B3 0xB7FC #HANGUL SYLLABLE RIEUL EO MIEUM -0xB7B4 0xB7FD #HANGUL SYLLABLE RIEUL EO PIEUP -0xB7B5 0xB7FF #HANGUL SYLLABLE RIEUL EO SIOS -0xB7B6 0xB800 #HANGUL SYLLABLE RIEUL EO SSANGSIOS -0xB7B7 0xB801 #HANGUL SYLLABLE RIEUL EO IEUNG -0xB7B8 0xB807 #HANGUL SYLLABLE RIEUL EO HIEUH -0xB7B9 0xB808 #HANGUL SYLLABLE RIEUL E -0xB7BA 0xB809 #HANGUL SYLLABLE RIEUL E KIYEOK -0xB7BB 0xB80C #HANGUL SYLLABLE RIEUL E NIEUN -0xB7BC 0xB810 #HANGUL SYLLABLE RIEUL E RIEUL -0xB7BD 0xB818 #HANGUL SYLLABLE RIEUL E MIEUM -0xB7BE 0xB819 #HANGUL SYLLABLE RIEUL E PIEUP -0xB7BF 0xB81B #HANGUL SYLLABLE RIEUL E SIOS -0xB7C0 0xB81D #HANGUL SYLLABLE RIEUL E IEUNG -0xB7C1 0xB824 #HANGUL SYLLABLE RIEUL YEO -0xB7C2 0xB825 #HANGUL SYLLABLE RIEUL YEO KIYEOK -0xB7C3 0xB828 #HANGUL SYLLABLE RIEUL YEO NIEUN -0xB7C4 0xB82C #HANGUL SYLLABLE RIEUL YEO RIEUL -0xB7C5 0xB834 #HANGUL SYLLABLE RIEUL YEO MIEUM -0xB7C6 0xB835 #HANGUL SYLLABLE RIEUL YEO PIEUP -0xB7C7 0xB837 #HANGUL SYLLABLE RIEUL YEO SIOS -0xB7C8 0xB838 #HANGUL SYLLABLE RIEUL YEO SSANGSIOS -0xB7C9 0xB839 #HANGUL SYLLABLE RIEUL YEO IEUNG -0xB7CA 0xB840 #HANGUL SYLLABLE RIEUL YE -0xB7CB 0xB844 #HANGUL SYLLABLE RIEUL YE NIEUN -0xB7CC 0xB851 #HANGUL SYLLABLE RIEUL YE PIEUP -0xB7CD 0xB853 #HANGUL SYLLABLE RIEUL YE SIOS -0xB7CE 0xB85C #HANGUL SYLLABLE RIEUL O -0xB7CF 0xB85D #HANGUL SYLLABLE RIEUL O KIYEOK -0xB7D0 0xB860 #HANGUL SYLLABLE RIEUL O NIEUN -0xB7D1 0xB864 #HANGUL SYLLABLE RIEUL O RIEUL -0xB7D2 0xB86C #HANGUL SYLLABLE RIEUL O MIEUM -0xB7D3 0xB86D #HANGUL SYLLABLE RIEUL O PIEUP -0xB7D4 0xB86F #HANGUL SYLLABLE RIEUL O SIOS -0xB7D5 0xB871 #HANGUL SYLLABLE RIEUL O IEUNG -0xB7D6 0xB878 #HANGUL SYLLABLE RIEUL WA -0xB7D7 0xB87C #HANGUL SYLLABLE RIEUL WA NIEUN -0xB7D8 0xB88D #HANGUL SYLLABLE RIEUL WA IEUNG -0xB7D9 0xB8A8 #HANGUL SYLLABLE RIEUL WAE SSANGSIOS -0xB7DA 0xB8B0 #HANGUL SYLLABLE RIEUL OE -0xB7DB 0xB8B4 #HANGUL SYLLABLE RIEUL OE NIEUN -0xB7DC 0xB8B8 #HANGUL SYLLABLE RIEUL OE RIEUL -0xB7DD 0xB8C0 #HANGUL SYLLABLE RIEUL OE MIEUM -0xB7DE 0xB8C1 #HANGUL SYLLABLE RIEUL OE PIEUP -0xB7DF 0xB8C3 #HANGUL SYLLABLE RIEUL OE SIOS -0xB7E0 0xB8C5 #HANGUL SYLLABLE RIEUL OE IEUNG -0xB7E1 0xB8CC #HANGUL SYLLABLE RIEUL YO -0xB7E2 0xB8D0 #HANGUL SYLLABLE RIEUL YO NIEUN -0xB7E3 0xB8D4 #HANGUL SYLLABLE RIEUL YO RIEUL -0xB7E4 0xB8DD #HANGUL SYLLABLE RIEUL YO PIEUP -0xB7E5 0xB8DF #HANGUL SYLLABLE RIEUL YO SIOS -0xB7E6 0xB8E1 #HANGUL SYLLABLE RIEUL YO IEUNG -0xB7E7 0xB8E8 #HANGUL SYLLABLE RIEUL U -0xB7E8 0xB8E9 #HANGUL SYLLABLE RIEUL U KIYEOK -0xB7E9 0xB8EC #HANGUL SYLLABLE RIEUL U NIEUN -0xB7EA 0xB8F0 #HANGUL SYLLABLE RIEUL U RIEUL -0xB7EB 0xB8F8 #HANGUL SYLLABLE RIEUL U MIEUM -0xB7EC 0xB8F9 #HANGUL SYLLABLE RIEUL U PIEUP -0xB7ED 0xB8FB #HANGUL SYLLABLE RIEUL U SIOS -0xB7EE 0xB8FD #HANGUL SYLLABLE RIEUL U IEUNG -0xB7EF 0xB904 #HANGUL SYLLABLE RIEUL WEO -0xB7F0 0xB918 #HANGUL SYLLABLE RIEUL WEO SSANGSIOS -0xB7F1 0xB920 #HANGUL SYLLABLE RIEUL WE -0xB7F2 0xB93C #HANGUL SYLLABLE RIEUL WI -0xB7F3 0xB93D #HANGUL SYLLABLE RIEUL WI KIYEOK -0xB7F4 0xB940 #HANGUL SYLLABLE RIEUL WI NIEUN -0xB7F5 0xB944 #HANGUL SYLLABLE RIEUL WI RIEUL -0xB7F6 0xB94C #HANGUL SYLLABLE RIEUL WI MIEUM -0xB7F7 0xB94F #HANGUL SYLLABLE RIEUL WI SIOS -0xB7F8 0xB951 #HANGUL SYLLABLE RIEUL WI IEUNG -0xB7F9 0xB958 #HANGUL SYLLABLE RIEUL YU -0xB7FA 0xB959 #HANGUL SYLLABLE RIEUL YU KIYEOK -0xB7FB 0xB95C #HANGUL SYLLABLE RIEUL YU NIEUN -0xB7FC 0xB960 #HANGUL SYLLABLE RIEUL YU RIEUL -0xB7FD 0xB968 #HANGUL SYLLABLE RIEUL YU MIEUM -0xB7FE 0xB969 #HANGUL SYLLABLE RIEUL YU PIEUP -0xB841 0xD1D0 #HANGUL SYLLABLE THIEUTH WA SSANGSIOS -0xB842 0xD1D1 #HANGUL SYLLABLE THIEUTH WA IEUNG -0xB843 0xD1D2 #HANGUL SYLLABLE THIEUTH WA CIEUC -0xB844 0xD1D3 #HANGUL SYLLABLE THIEUTH WA CHIEUCH -0xB845 0xD1D4 #HANGUL SYLLABLE THIEUTH WA KHIEUKH -0xB846 0xD1D5 #HANGUL SYLLABLE THIEUTH WA THIEUTH -0xB847 0xD1D6 #HANGUL SYLLABLE THIEUTH WA PHIEUPH -0xB848 0xD1D7 #HANGUL SYLLABLE THIEUTH WA HIEUH -0xB849 0xD1D9 #HANGUL SYLLABLE THIEUTH WAE KIYEOK -0xB84A 0xD1DA #HANGUL SYLLABLE THIEUTH WAE SSANGKIYEOK -0xB84B 0xD1DB #HANGUL SYLLABLE THIEUTH WAE KIYEOKSIOS -0xB84C 0xD1DC #HANGUL SYLLABLE THIEUTH WAE NIEUN -0xB84D 0xD1DD #HANGUL SYLLABLE THIEUTH WAE NIEUNCIEUC -0xB84E 0xD1DE #HANGUL SYLLABLE THIEUTH WAE NIEUNHIEUH -0xB84F 0xD1DF #HANGUL SYLLABLE THIEUTH WAE TIKEUT -0xB850 0xD1E0 #HANGUL SYLLABLE THIEUTH WAE RIEUL -0xB851 0xD1E1 #HANGUL SYLLABLE THIEUTH WAE RIEULKIYEOK -0xB852 0xD1E2 #HANGUL SYLLABLE THIEUTH WAE RIEULMIEUM -0xB853 0xD1E3 #HANGUL SYLLABLE THIEUTH WAE RIEULPIEUP -0xB854 0xD1E4 #HANGUL SYLLABLE THIEUTH WAE RIEULSIOS -0xB855 0xD1E5 #HANGUL SYLLABLE THIEUTH WAE RIEULTHIEUTH -0xB856 0xD1E6 #HANGUL SYLLABLE THIEUTH WAE RIEULPHIEUPH -0xB857 0xD1E7 #HANGUL SYLLABLE THIEUTH WAE RIEULHIEUH -0xB858 0xD1E8 #HANGUL SYLLABLE THIEUTH WAE MIEUM -0xB859 0xD1E9 #HANGUL SYLLABLE THIEUTH WAE PIEUP -0xB85A 0xD1EA #HANGUL SYLLABLE THIEUTH WAE PIEUPSIOS -0xB861 0xD1EB #HANGUL SYLLABLE THIEUTH WAE SIOS -0xB862 0xD1EC #HANGUL SYLLABLE THIEUTH WAE SSANGSIOS -0xB863 0xD1ED #HANGUL SYLLABLE THIEUTH WAE IEUNG -0xB864 0xD1EE #HANGUL SYLLABLE THIEUTH WAE CIEUC -0xB865 0xD1EF #HANGUL SYLLABLE THIEUTH WAE CHIEUCH -0xB866 0xD1F0 #HANGUL SYLLABLE THIEUTH WAE KHIEUKH -0xB867 0xD1F1 #HANGUL SYLLABLE THIEUTH WAE THIEUTH -0xB868 0xD1F2 #HANGUL SYLLABLE THIEUTH WAE PHIEUPH -0xB869 0xD1F3 #HANGUL SYLLABLE THIEUTH WAE HIEUH -0xB86A 0xD1F5 #HANGUL SYLLABLE THIEUTH OE KIYEOK -0xB86B 0xD1F6 #HANGUL SYLLABLE THIEUTH OE SSANGKIYEOK -0xB86C 0xD1F7 #HANGUL SYLLABLE THIEUTH OE KIYEOKSIOS -0xB86D 0xD1F9 #HANGUL SYLLABLE THIEUTH OE NIEUNCIEUC -0xB86E 0xD1FA #HANGUL SYLLABLE THIEUTH OE NIEUNHIEUH -0xB86F 0xD1FB #HANGUL SYLLABLE THIEUTH OE TIKEUT -0xB870 0xD1FC #HANGUL SYLLABLE THIEUTH OE RIEUL -0xB871 0xD1FD #HANGUL SYLLABLE THIEUTH OE RIEULKIYEOK -0xB872 0xD1FE #HANGUL SYLLABLE THIEUTH OE RIEULMIEUM -0xB873 0xD1FF #HANGUL SYLLABLE THIEUTH OE RIEULPIEUP -0xB874 0xD200 #HANGUL SYLLABLE THIEUTH OE RIEULSIOS -0xB875 0xD201 #HANGUL SYLLABLE THIEUTH OE RIEULTHIEUTH -0xB876 0xD202 #HANGUL SYLLABLE THIEUTH OE RIEULPHIEUPH -0xB877 0xD203 #HANGUL SYLLABLE THIEUTH OE RIEULHIEUH -0xB878 0xD204 #HANGUL SYLLABLE THIEUTH OE MIEUM -0xB879 0xD205 #HANGUL SYLLABLE THIEUTH OE PIEUP -0xB87A 0xD206 #HANGUL SYLLABLE THIEUTH OE PIEUPSIOS -0xB881 0xD208 #HANGUL SYLLABLE THIEUTH OE SSANGSIOS -0xB882 0xD20A #HANGUL SYLLABLE THIEUTH OE CIEUC -0xB883 0xD20B #HANGUL SYLLABLE THIEUTH OE CHIEUCH -0xB884 0xD20C #HANGUL SYLLABLE THIEUTH OE KHIEUKH -0xB885 0xD20D #HANGUL SYLLABLE THIEUTH OE THIEUTH -0xB886 0xD20E #HANGUL SYLLABLE THIEUTH OE PHIEUPH -0xB887 0xD20F #HANGUL SYLLABLE THIEUTH OE HIEUH -0xB888 0xD211 #HANGUL SYLLABLE THIEUTH YO KIYEOK -0xB889 0xD212 #HANGUL SYLLABLE THIEUTH YO SSANGKIYEOK -0xB88A 0xD213 #HANGUL SYLLABLE THIEUTH YO KIYEOKSIOS -0xB88B 0xD214 #HANGUL SYLLABLE THIEUTH YO NIEUN -0xB88C 0xD215 #HANGUL SYLLABLE THIEUTH YO NIEUNCIEUC -0xB88D 0xD216 #HANGUL SYLLABLE THIEUTH YO NIEUNHIEUH -0xB88E 0xD217 #HANGUL SYLLABLE THIEUTH YO TIKEUT -0xB88F 0xD218 #HANGUL SYLLABLE THIEUTH YO RIEUL -0xB890 0xD219 #HANGUL SYLLABLE THIEUTH YO RIEULKIYEOK -0xB891 0xD21A #HANGUL SYLLABLE THIEUTH YO RIEULMIEUM -0xB892 0xD21B #HANGUL SYLLABLE THIEUTH YO RIEULPIEUP -0xB893 0xD21C #HANGUL SYLLABLE THIEUTH YO RIEULSIOS -0xB894 0xD21D #HANGUL SYLLABLE THIEUTH YO RIEULTHIEUTH -0xB895 0xD21E #HANGUL SYLLABLE THIEUTH YO RIEULPHIEUPH -0xB896 0xD21F #HANGUL SYLLABLE THIEUTH YO RIEULHIEUH -0xB897 0xD220 #HANGUL SYLLABLE THIEUTH YO MIEUM -0xB898 0xD221 #HANGUL SYLLABLE THIEUTH YO PIEUP -0xB899 0xD222 #HANGUL SYLLABLE THIEUTH YO PIEUPSIOS -0xB89A 0xD223 #HANGUL SYLLABLE THIEUTH YO SIOS -0xB89B 0xD224 #HANGUL SYLLABLE THIEUTH YO SSANGSIOS -0xB89C 0xD225 #HANGUL SYLLABLE THIEUTH YO IEUNG -0xB89D 0xD226 #HANGUL SYLLABLE THIEUTH YO CIEUC -0xB89E 0xD227 #HANGUL SYLLABLE THIEUTH YO CHIEUCH -0xB89F 0xD228 #HANGUL SYLLABLE THIEUTH YO KHIEUKH -0xB8A0 0xD229 #HANGUL SYLLABLE THIEUTH YO THIEUTH -0xB8A1 0xB96B #HANGUL SYLLABLE RIEUL YU SIOS -0xB8A2 0xB96D #HANGUL SYLLABLE RIEUL YU IEUNG -0xB8A3 0xB974 #HANGUL SYLLABLE RIEUL EU -0xB8A4 0xB975 #HANGUL SYLLABLE RIEUL EU KIYEOK -0xB8A5 0xB978 #HANGUL SYLLABLE RIEUL EU NIEUN -0xB8A6 0xB97C #HANGUL SYLLABLE RIEUL EU RIEUL -0xB8A7 0xB984 #HANGUL SYLLABLE RIEUL EU MIEUM -0xB8A8 0xB985 #HANGUL SYLLABLE RIEUL EU PIEUP -0xB8A9 0xB987 #HANGUL SYLLABLE RIEUL EU SIOS -0xB8AA 0xB989 #HANGUL SYLLABLE RIEUL EU IEUNG -0xB8AB 0xB98A #HANGUL SYLLABLE RIEUL EU CIEUC -0xB8AC 0xB98D #HANGUL SYLLABLE RIEUL EU THIEUTH -0xB8AD 0xB98E #HANGUL SYLLABLE RIEUL EU PHIEUPH -0xB8AE 0xB9AC #HANGUL SYLLABLE RIEUL I -0xB8AF 0xB9AD #HANGUL SYLLABLE RIEUL I KIYEOK -0xB8B0 0xB9B0 #HANGUL SYLLABLE RIEUL I NIEUN -0xB8B1 0xB9B4 #HANGUL SYLLABLE RIEUL I RIEUL -0xB8B2 0xB9BC #HANGUL SYLLABLE RIEUL I MIEUM -0xB8B3 0xB9BD #HANGUL SYLLABLE RIEUL I PIEUP -0xB8B4 0xB9BF #HANGUL SYLLABLE RIEUL I SIOS -0xB8B5 0xB9C1 #HANGUL SYLLABLE RIEUL I IEUNG -0xB8B6 0xB9C8 #HANGUL SYLLABLE MIEUM A -0xB8B7 0xB9C9 #HANGUL SYLLABLE MIEUM A KIYEOK -0xB8B8 0xB9CC #HANGUL SYLLABLE MIEUM A NIEUN -0xB8B9 0xB9CE #HANGUL SYLLABLE MIEUM A NIEUNHIEUH -0xB8BA 0xB9CF #HANGUL SYLLABLE MIEUM A TIKEUT -0xB8BB 0xB9D0 #HANGUL SYLLABLE MIEUM A RIEUL -0xB8BC 0xB9D1 #HANGUL SYLLABLE MIEUM A RIEULKIYEOK -0xB8BD 0xB9D2 #HANGUL SYLLABLE MIEUM A RIEULMIEUM -0xB8BE 0xB9D8 #HANGUL SYLLABLE MIEUM A MIEUM -0xB8BF 0xB9D9 #HANGUL SYLLABLE MIEUM A PIEUP -0xB8C0 0xB9DB #HANGUL SYLLABLE MIEUM A SIOS -0xB8C1 0xB9DD #HANGUL SYLLABLE MIEUM A IEUNG -0xB8C2 0xB9DE #HANGUL SYLLABLE MIEUM A CIEUC -0xB8C3 0xB9E1 #HANGUL SYLLABLE MIEUM A THIEUTH -0xB8C4 0xB9E3 #HANGUL SYLLABLE MIEUM A HIEUH -0xB8C5 0xB9E4 #HANGUL SYLLABLE MIEUM AE -0xB8C6 0xB9E5 #HANGUL SYLLABLE MIEUM AE KIYEOK -0xB8C7 0xB9E8 #HANGUL SYLLABLE MIEUM AE NIEUN -0xB8C8 0xB9EC #HANGUL SYLLABLE MIEUM AE RIEUL -0xB8C9 0xB9F4 #HANGUL SYLLABLE MIEUM AE MIEUM -0xB8CA 0xB9F5 #HANGUL SYLLABLE MIEUM AE PIEUP -0xB8CB 0xB9F7 #HANGUL SYLLABLE MIEUM AE SIOS -0xB8CC 0xB9F8 #HANGUL SYLLABLE MIEUM AE SSANGSIOS -0xB8CD 0xB9F9 #HANGUL SYLLABLE MIEUM AE IEUNG -0xB8CE 0xB9FA #HANGUL SYLLABLE MIEUM AE CIEUC -0xB8CF 0xBA00 #HANGUL SYLLABLE MIEUM YA -0xB8D0 0xBA01 #HANGUL SYLLABLE MIEUM YA KIYEOK -0xB8D1 0xBA08 #HANGUL SYLLABLE MIEUM YA RIEUL -0xB8D2 0xBA15 #HANGUL SYLLABLE MIEUM YA IEUNG -0xB8D3 0xBA38 #HANGUL SYLLABLE MIEUM EO -0xB8D4 0xBA39 #HANGUL SYLLABLE MIEUM EO KIYEOK -0xB8D5 0xBA3C #HANGUL SYLLABLE MIEUM EO NIEUN -0xB8D6 0xBA40 #HANGUL SYLLABLE MIEUM EO RIEUL -0xB8D7 0xBA42 #HANGUL SYLLABLE MIEUM EO RIEULMIEUM -0xB8D8 0xBA48 #HANGUL SYLLABLE MIEUM EO MIEUM -0xB8D9 0xBA49 #HANGUL SYLLABLE MIEUM EO PIEUP -0xB8DA 0xBA4B #HANGUL SYLLABLE MIEUM EO SIOS -0xB8DB 0xBA4D #HANGUL SYLLABLE MIEUM EO IEUNG -0xB8DC 0xBA4E #HANGUL SYLLABLE MIEUM EO CIEUC -0xB8DD 0xBA53 #HANGUL SYLLABLE MIEUM EO HIEUH -0xB8DE 0xBA54 #HANGUL SYLLABLE MIEUM E -0xB8DF 0xBA55 #HANGUL SYLLABLE MIEUM E KIYEOK -0xB8E0 0xBA58 #HANGUL SYLLABLE MIEUM E NIEUN -0xB8E1 0xBA5C #HANGUL SYLLABLE MIEUM E RIEUL -0xB8E2 0xBA64 #HANGUL SYLLABLE MIEUM E MIEUM -0xB8E3 0xBA65 #HANGUL SYLLABLE MIEUM E PIEUP -0xB8E4 0xBA67 #HANGUL SYLLABLE MIEUM E SIOS -0xB8E5 0xBA68 #HANGUL SYLLABLE MIEUM E SSANGSIOS -0xB8E6 0xBA69 #HANGUL SYLLABLE MIEUM E IEUNG -0xB8E7 0xBA70 #HANGUL SYLLABLE MIEUM YEO -0xB8E8 0xBA71 #HANGUL SYLLABLE MIEUM YEO KIYEOK -0xB8E9 0xBA74 #HANGUL SYLLABLE MIEUM YEO NIEUN -0xB8EA 0xBA78 #HANGUL SYLLABLE MIEUM YEO RIEUL -0xB8EB 0xBA83 #HANGUL SYLLABLE MIEUM YEO SIOS -0xB8EC 0xBA84 #HANGUL SYLLABLE MIEUM YEO SSANGSIOS -0xB8ED 0xBA85 #HANGUL SYLLABLE MIEUM YEO IEUNG -0xB8EE 0xBA87 #HANGUL SYLLABLE MIEUM YEO CHIEUCH -0xB8EF 0xBA8C #HANGUL SYLLABLE MIEUM YE -0xB8F0 0xBAA8 #HANGUL SYLLABLE MIEUM O -0xB8F1 0xBAA9 #HANGUL SYLLABLE MIEUM O KIYEOK -0xB8F2 0xBAAB #HANGUL SYLLABLE MIEUM O KIYEOKSIOS -0xB8F3 0xBAAC #HANGUL SYLLABLE MIEUM O NIEUN -0xB8F4 0xBAB0 #HANGUL SYLLABLE MIEUM O RIEUL -0xB8F5 0xBAB2 #HANGUL SYLLABLE MIEUM O RIEULMIEUM -0xB8F6 0xBAB8 #HANGUL SYLLABLE MIEUM O MIEUM -0xB8F7 0xBAB9 #HANGUL SYLLABLE MIEUM O PIEUP -0xB8F8 0xBABB #HANGUL SYLLABLE MIEUM O SIOS -0xB8F9 0xBABD #HANGUL SYLLABLE MIEUM O IEUNG -0xB8FA 0xBAC4 #HANGUL SYLLABLE MIEUM WA -0xB8FB 0xBAC8 #HANGUL SYLLABLE MIEUM WA NIEUN -0xB8FC 0xBAD8 #HANGUL SYLLABLE MIEUM WA SSANGSIOS -0xB8FD 0xBAD9 #HANGUL SYLLABLE MIEUM WA IEUNG -0xB8FE 0xBAFC #HANGUL SYLLABLE MIEUM OE -0xB941 0xD22A #HANGUL SYLLABLE THIEUTH YO PHIEUPH -0xB942 0xD22B #HANGUL SYLLABLE THIEUTH YO HIEUH -0xB943 0xD22E #HANGUL SYLLABLE THIEUTH U SSANGKIYEOK -0xB944 0xD22F #HANGUL SYLLABLE THIEUTH U KIYEOKSIOS -0xB945 0xD231 #HANGUL SYLLABLE THIEUTH U NIEUNCIEUC -0xB946 0xD232 #HANGUL SYLLABLE THIEUTH U NIEUNHIEUH -0xB947 0xD233 #HANGUL SYLLABLE THIEUTH U TIKEUT -0xB948 0xD235 #HANGUL SYLLABLE THIEUTH U RIEULKIYEOK -0xB949 0xD236 #HANGUL SYLLABLE THIEUTH U RIEULMIEUM -0xB94A 0xD237 #HANGUL SYLLABLE THIEUTH U RIEULPIEUP -0xB94B 0xD238 #HANGUL SYLLABLE THIEUTH U RIEULSIOS -0xB94C 0xD239 #HANGUL SYLLABLE THIEUTH U RIEULTHIEUTH -0xB94D 0xD23A #HANGUL SYLLABLE THIEUTH U RIEULPHIEUPH -0xB94E 0xD23B #HANGUL SYLLABLE THIEUTH U RIEULHIEUH -0xB94F 0xD23E #HANGUL SYLLABLE THIEUTH U PIEUPSIOS -0xB950 0xD240 #HANGUL SYLLABLE THIEUTH U SSANGSIOS -0xB951 0xD242 #HANGUL SYLLABLE THIEUTH U CIEUC -0xB952 0xD243 #HANGUL SYLLABLE THIEUTH U CHIEUCH -0xB953 0xD244 #HANGUL SYLLABLE THIEUTH U KHIEUKH -0xB954 0xD245 #HANGUL SYLLABLE THIEUTH U THIEUTH -0xB955 0xD246 #HANGUL SYLLABLE THIEUTH U PHIEUPH -0xB956 0xD247 #HANGUL SYLLABLE THIEUTH U HIEUH -0xB957 0xD249 #HANGUL SYLLABLE THIEUTH WEO KIYEOK -0xB958 0xD24A #HANGUL SYLLABLE THIEUTH WEO SSANGKIYEOK -0xB959 0xD24B #HANGUL SYLLABLE THIEUTH WEO KIYEOKSIOS -0xB95A 0xD24C #HANGUL SYLLABLE THIEUTH WEO NIEUN -0xB961 0xD24D #HANGUL SYLLABLE THIEUTH WEO NIEUNCIEUC -0xB962 0xD24E #HANGUL SYLLABLE THIEUTH WEO NIEUNHIEUH -0xB963 0xD24F #HANGUL SYLLABLE THIEUTH WEO TIKEUT -0xB964 0xD250 #HANGUL SYLLABLE THIEUTH WEO RIEUL -0xB965 0xD251 #HANGUL SYLLABLE THIEUTH WEO RIEULKIYEOK -0xB966 0xD252 #HANGUL SYLLABLE THIEUTH WEO RIEULMIEUM -0xB967 0xD253 #HANGUL SYLLABLE THIEUTH WEO RIEULPIEUP -0xB968 0xD254 #HANGUL SYLLABLE THIEUTH WEO RIEULSIOS -0xB969 0xD255 #HANGUL SYLLABLE THIEUTH WEO RIEULTHIEUTH -0xB96A 0xD256 #HANGUL SYLLABLE THIEUTH WEO RIEULPHIEUPH -0xB96B 0xD257 #HANGUL SYLLABLE THIEUTH WEO RIEULHIEUH -0xB96C 0xD258 #HANGUL SYLLABLE THIEUTH WEO MIEUM -0xB96D 0xD259 #HANGUL SYLLABLE THIEUTH WEO PIEUP -0xB96E 0xD25A #HANGUL SYLLABLE THIEUTH WEO PIEUPSIOS -0xB96F 0xD25B #HANGUL SYLLABLE THIEUTH WEO SIOS -0xB970 0xD25D #HANGUL SYLLABLE THIEUTH WEO IEUNG -0xB971 0xD25E #HANGUL SYLLABLE THIEUTH WEO CIEUC -0xB972 0xD25F #HANGUL SYLLABLE THIEUTH WEO CHIEUCH -0xB973 0xD260 #HANGUL SYLLABLE THIEUTH WEO KHIEUKH -0xB974 0xD261 #HANGUL SYLLABLE THIEUTH WEO THIEUTH -0xB975 0xD262 #HANGUL SYLLABLE THIEUTH WEO PHIEUPH -0xB976 0xD263 #HANGUL SYLLABLE THIEUTH WEO HIEUH -0xB977 0xD265 #HANGUL SYLLABLE THIEUTH WE KIYEOK -0xB978 0xD266 #HANGUL SYLLABLE THIEUTH WE SSANGKIYEOK -0xB979 0xD267 #HANGUL SYLLABLE THIEUTH WE KIYEOKSIOS -0xB97A 0xD268 #HANGUL SYLLABLE THIEUTH WE NIEUN -0xB981 0xD269 #HANGUL SYLLABLE THIEUTH WE NIEUNCIEUC -0xB982 0xD26A #HANGUL SYLLABLE THIEUTH WE NIEUNHIEUH -0xB983 0xD26B #HANGUL SYLLABLE THIEUTH WE TIKEUT -0xB984 0xD26C #HANGUL SYLLABLE THIEUTH WE RIEUL -0xB985 0xD26D #HANGUL SYLLABLE THIEUTH WE RIEULKIYEOK -0xB986 0xD26E #HANGUL SYLLABLE THIEUTH WE RIEULMIEUM -0xB987 0xD26F #HANGUL SYLLABLE THIEUTH WE RIEULPIEUP -0xB988 0xD270 #HANGUL SYLLABLE THIEUTH WE RIEULSIOS -0xB989 0xD271 #HANGUL SYLLABLE THIEUTH WE RIEULTHIEUTH -0xB98A 0xD272 #HANGUL SYLLABLE THIEUTH WE RIEULPHIEUPH -0xB98B 0xD273 #HANGUL SYLLABLE THIEUTH WE RIEULHIEUH -0xB98C 0xD274 #HANGUL SYLLABLE THIEUTH WE MIEUM -0xB98D 0xD275 #HANGUL SYLLABLE THIEUTH WE PIEUP -0xB98E 0xD276 #HANGUL SYLLABLE THIEUTH WE PIEUPSIOS -0xB98F 0xD277 #HANGUL SYLLABLE THIEUTH WE SIOS -0xB990 0xD278 #HANGUL SYLLABLE THIEUTH WE SSANGSIOS -0xB991 0xD279 #HANGUL SYLLABLE THIEUTH WE IEUNG -0xB992 0xD27A #HANGUL SYLLABLE THIEUTH WE CIEUC -0xB993 0xD27B #HANGUL SYLLABLE THIEUTH WE CHIEUCH -0xB994 0xD27C #HANGUL SYLLABLE THIEUTH WE KHIEUKH -0xB995 0xD27D #HANGUL SYLLABLE THIEUTH WE THIEUTH -0xB996 0xD27E #HANGUL SYLLABLE THIEUTH WE PHIEUPH -0xB997 0xD27F #HANGUL SYLLABLE THIEUTH WE HIEUH -0xB998 0xD282 #HANGUL SYLLABLE THIEUTH WI SSANGKIYEOK -0xB999 0xD283 #HANGUL SYLLABLE THIEUTH WI KIYEOKSIOS -0xB99A 0xD285 #HANGUL SYLLABLE THIEUTH WI NIEUNCIEUC -0xB99B 0xD286 #HANGUL SYLLABLE THIEUTH WI NIEUNHIEUH -0xB99C 0xD287 #HANGUL SYLLABLE THIEUTH WI TIKEUT -0xB99D 0xD289 #HANGUL SYLLABLE THIEUTH WI RIEULKIYEOK -0xB99E 0xD28A #HANGUL SYLLABLE THIEUTH WI RIEULMIEUM -0xB99F 0xD28B #HANGUL SYLLABLE THIEUTH WI RIEULPIEUP -0xB9A0 0xD28C #HANGUL SYLLABLE THIEUTH WI RIEULSIOS -0xB9A1 0xBB00 #HANGUL SYLLABLE MIEUM OE NIEUN -0xB9A2 0xBB04 #HANGUL SYLLABLE MIEUM OE RIEUL -0xB9A3 0xBB0D #HANGUL SYLLABLE MIEUM OE PIEUP -0xB9A4 0xBB0F #HANGUL SYLLABLE MIEUM OE SIOS -0xB9A5 0xBB11 #HANGUL SYLLABLE MIEUM OE IEUNG -0xB9A6 0xBB18 #HANGUL SYLLABLE MIEUM YO -0xB9A7 0xBB1C #HANGUL SYLLABLE MIEUM YO NIEUN -0xB9A8 0xBB20 #HANGUL SYLLABLE MIEUM YO RIEUL -0xB9A9 0xBB29 #HANGUL SYLLABLE MIEUM YO PIEUP -0xB9AA 0xBB2B #HANGUL SYLLABLE MIEUM YO SIOS -0xB9AB 0xBB34 #HANGUL SYLLABLE MIEUM U -0xB9AC 0xBB35 #HANGUL SYLLABLE MIEUM U KIYEOK -0xB9AD 0xBB36 #HANGUL SYLLABLE MIEUM U SSANGKIYEOK -0xB9AE 0xBB38 #HANGUL SYLLABLE MIEUM U NIEUN -0xB9AF 0xBB3B #HANGUL SYLLABLE MIEUM U TIKEUT -0xB9B0 0xBB3C #HANGUL SYLLABLE MIEUM U RIEUL -0xB9B1 0xBB3D #HANGUL SYLLABLE MIEUM U RIEULKIYEOK -0xB9B2 0xBB3E #HANGUL SYLLABLE MIEUM U RIEULMIEUM -0xB9B3 0xBB44 #HANGUL SYLLABLE MIEUM U MIEUM -0xB9B4 0xBB45 #HANGUL SYLLABLE MIEUM U PIEUP -0xB9B5 0xBB47 #HANGUL SYLLABLE MIEUM U SIOS -0xB9B6 0xBB49 #HANGUL SYLLABLE MIEUM U IEUNG -0xB9B7 0xBB4D #HANGUL SYLLABLE MIEUM U THIEUTH -0xB9B8 0xBB4F #HANGUL SYLLABLE MIEUM U HIEUH -0xB9B9 0xBB50 #HANGUL SYLLABLE MIEUM WEO -0xB9BA 0xBB54 #HANGUL SYLLABLE MIEUM WEO NIEUN -0xB9BB 0xBB58 #HANGUL SYLLABLE MIEUM WEO RIEUL -0xB9BC 0xBB61 #HANGUL SYLLABLE MIEUM WEO PIEUP -0xB9BD 0xBB63 #HANGUL SYLLABLE MIEUM WEO SIOS -0xB9BE 0xBB6C #HANGUL SYLLABLE MIEUM WE -0xB9BF 0xBB88 #HANGUL SYLLABLE MIEUM WI -0xB9C0 0xBB8C #HANGUL SYLLABLE MIEUM WI NIEUN -0xB9C1 0xBB90 #HANGUL SYLLABLE MIEUM WI RIEUL -0xB9C2 0xBBA4 #HANGUL SYLLABLE MIEUM YU -0xB9C3 0xBBA8 #HANGUL SYLLABLE MIEUM YU NIEUN -0xB9C4 0xBBAC #HANGUL SYLLABLE MIEUM YU RIEUL -0xB9C5 0xBBB4 #HANGUL SYLLABLE MIEUM YU MIEUM -0xB9C6 0xBBB7 #HANGUL SYLLABLE MIEUM YU SIOS -0xB9C7 0xBBC0 #HANGUL SYLLABLE MIEUM EU -0xB9C8 0xBBC4 #HANGUL SYLLABLE MIEUM EU NIEUN -0xB9C9 0xBBC8 #HANGUL SYLLABLE MIEUM EU RIEUL -0xB9CA 0xBBD0 #HANGUL SYLLABLE MIEUM EU MIEUM -0xB9CB 0xBBD3 #HANGUL SYLLABLE MIEUM EU SIOS -0xB9CC 0xBBF8 #HANGUL SYLLABLE MIEUM I -0xB9CD 0xBBF9 #HANGUL SYLLABLE MIEUM I KIYEOK -0xB9CE 0xBBFC #HANGUL SYLLABLE MIEUM I NIEUN -0xB9CF 0xBBFF #HANGUL SYLLABLE MIEUM I TIKEUT -0xB9D0 0xBC00 #HANGUL SYLLABLE MIEUM I RIEUL -0xB9D1 0xBC02 #HANGUL SYLLABLE MIEUM I RIEULMIEUM -0xB9D2 0xBC08 #HANGUL SYLLABLE MIEUM I MIEUM -0xB9D3 0xBC09 #HANGUL SYLLABLE MIEUM I PIEUP -0xB9D4 0xBC0B #HANGUL SYLLABLE MIEUM I SIOS -0xB9D5 0xBC0C #HANGUL SYLLABLE MIEUM I SSANGSIOS -0xB9D6 0xBC0D #HANGUL SYLLABLE MIEUM I IEUNG -0xB9D7 0xBC0F #HANGUL SYLLABLE MIEUM I CHIEUCH -0xB9D8 0xBC11 #HANGUL SYLLABLE MIEUM I THIEUTH -0xB9D9 0xBC14 #HANGUL SYLLABLE PIEUP A -0xB9DA 0xBC15 #HANGUL SYLLABLE PIEUP A KIYEOK -0xB9DB 0xBC16 #HANGUL SYLLABLE PIEUP A SSANGKIYEOK -0xB9DC 0xBC17 #HANGUL SYLLABLE PIEUP A KIYEOKSIOS -0xB9DD 0xBC18 #HANGUL SYLLABLE PIEUP A NIEUN -0xB9DE 0xBC1B #HANGUL SYLLABLE PIEUP A TIKEUT -0xB9DF 0xBC1C #HANGUL SYLLABLE PIEUP A RIEUL -0xB9E0 0xBC1D #HANGUL SYLLABLE PIEUP A RIEULKIYEOK -0xB9E1 0xBC1E #HANGUL SYLLABLE PIEUP A RIEULMIEUM -0xB9E2 0xBC1F #HANGUL SYLLABLE PIEUP A RIEULPIEUP -0xB9E3 0xBC24 #HANGUL SYLLABLE PIEUP A MIEUM -0xB9E4 0xBC25 #HANGUL SYLLABLE PIEUP A PIEUP -0xB9E5 0xBC27 #HANGUL SYLLABLE PIEUP A SIOS -0xB9E6 0xBC29 #HANGUL SYLLABLE PIEUP A IEUNG -0xB9E7 0xBC2D #HANGUL SYLLABLE PIEUP A THIEUTH -0xB9E8 0xBC30 #HANGUL SYLLABLE PIEUP AE -0xB9E9 0xBC31 #HANGUL SYLLABLE PIEUP AE KIYEOK -0xB9EA 0xBC34 #HANGUL SYLLABLE PIEUP AE NIEUN -0xB9EB 0xBC38 #HANGUL SYLLABLE PIEUP AE RIEUL -0xB9EC 0xBC40 #HANGUL SYLLABLE PIEUP AE MIEUM -0xB9ED 0xBC41 #HANGUL SYLLABLE PIEUP AE PIEUP -0xB9EE 0xBC43 #HANGUL SYLLABLE PIEUP AE SIOS -0xB9EF 0xBC44 #HANGUL SYLLABLE PIEUP AE SSANGSIOS -0xB9F0 0xBC45 #HANGUL SYLLABLE PIEUP AE IEUNG -0xB9F1 0xBC49 #HANGUL SYLLABLE PIEUP AE THIEUTH -0xB9F2 0xBC4C #HANGUL SYLLABLE PIEUP YA -0xB9F3 0xBC4D #HANGUL SYLLABLE PIEUP YA KIYEOK -0xB9F4 0xBC50 #HANGUL SYLLABLE PIEUP YA NIEUN -0xB9F5 0xBC5D #HANGUL SYLLABLE PIEUP YA PIEUP -0xB9F6 0xBC84 #HANGUL SYLLABLE PIEUP EO -0xB9F7 0xBC85 #HANGUL SYLLABLE PIEUP EO KIYEOK -0xB9F8 0xBC88 #HANGUL SYLLABLE PIEUP EO NIEUN -0xB9F9 0xBC8B #HANGUL SYLLABLE PIEUP EO TIKEUT -0xB9FA 0xBC8C #HANGUL SYLLABLE PIEUP EO RIEUL -0xB9FB 0xBC8E #HANGUL SYLLABLE PIEUP EO RIEULMIEUM -0xB9FC 0xBC94 #HANGUL SYLLABLE PIEUP EO MIEUM -0xB9FD 0xBC95 #HANGUL SYLLABLE PIEUP EO PIEUP -0xB9FE 0xBC97 #HANGUL SYLLABLE PIEUP EO SIOS -0xBA41 0xD28D #HANGUL SYLLABLE THIEUTH WI RIEULTHIEUTH -0xBA42 0xD28E #HANGUL SYLLABLE THIEUTH WI RIEULPHIEUPH -0xBA43 0xD28F #HANGUL SYLLABLE THIEUTH WI RIEULHIEUH -0xBA44 0xD292 #HANGUL SYLLABLE THIEUTH WI PIEUPSIOS -0xBA45 0xD293 #HANGUL SYLLABLE THIEUTH WI SIOS -0xBA46 0xD294 #HANGUL SYLLABLE THIEUTH WI SSANGSIOS -0xBA47 0xD296 #HANGUL SYLLABLE THIEUTH WI CIEUC -0xBA48 0xD297 #HANGUL SYLLABLE THIEUTH WI CHIEUCH -0xBA49 0xD298 #HANGUL SYLLABLE THIEUTH WI KHIEUKH -0xBA4A 0xD299 #HANGUL SYLLABLE THIEUTH WI THIEUTH -0xBA4B 0xD29A #HANGUL SYLLABLE THIEUTH WI PHIEUPH -0xBA4C 0xD29B #HANGUL SYLLABLE THIEUTH WI HIEUH -0xBA4D 0xD29D #HANGUL SYLLABLE THIEUTH YU KIYEOK -0xBA4E 0xD29E #HANGUL SYLLABLE THIEUTH YU SSANGKIYEOK -0xBA4F 0xD29F #HANGUL SYLLABLE THIEUTH YU KIYEOKSIOS -0xBA50 0xD2A1 #HANGUL SYLLABLE THIEUTH YU NIEUNCIEUC -0xBA51 0xD2A2 #HANGUL SYLLABLE THIEUTH YU NIEUNHIEUH -0xBA52 0xD2A3 #HANGUL SYLLABLE THIEUTH YU TIKEUT -0xBA53 0xD2A5 #HANGUL SYLLABLE THIEUTH YU RIEULKIYEOK -0xBA54 0xD2A6 #HANGUL SYLLABLE THIEUTH YU RIEULMIEUM -0xBA55 0xD2A7 #HANGUL SYLLABLE THIEUTH YU RIEULPIEUP -0xBA56 0xD2A8 #HANGUL SYLLABLE THIEUTH YU RIEULSIOS -0xBA57 0xD2A9 #HANGUL SYLLABLE THIEUTH YU RIEULTHIEUTH -0xBA58 0xD2AA #HANGUL SYLLABLE THIEUTH YU RIEULPHIEUPH -0xBA59 0xD2AB #HANGUL SYLLABLE THIEUTH YU RIEULHIEUH -0xBA5A 0xD2AD #HANGUL SYLLABLE THIEUTH YU PIEUP -0xBA61 0xD2AE #HANGUL SYLLABLE THIEUTH YU PIEUPSIOS -0xBA62 0xD2AF #HANGUL SYLLABLE THIEUTH YU SIOS -0xBA63 0xD2B0 #HANGUL SYLLABLE THIEUTH YU SSANGSIOS -0xBA64 0xD2B2 #HANGUL SYLLABLE THIEUTH YU CIEUC -0xBA65 0xD2B3 #HANGUL SYLLABLE THIEUTH YU CHIEUCH -0xBA66 0xD2B4 #HANGUL SYLLABLE THIEUTH YU KHIEUKH -0xBA67 0xD2B5 #HANGUL SYLLABLE THIEUTH YU THIEUTH -0xBA68 0xD2B6 #HANGUL SYLLABLE THIEUTH YU PHIEUPH -0xBA69 0xD2B7 #HANGUL SYLLABLE THIEUTH YU HIEUH -0xBA6A 0xD2BA #HANGUL SYLLABLE THIEUTH EU SSANGKIYEOK -0xBA6B 0xD2BB #HANGUL SYLLABLE THIEUTH EU KIYEOKSIOS -0xBA6C 0xD2BD #HANGUL SYLLABLE THIEUTH EU NIEUNCIEUC -0xBA6D 0xD2BE #HANGUL SYLLABLE THIEUTH EU NIEUNHIEUH -0xBA6E 0xD2C1 #HANGUL SYLLABLE THIEUTH EU RIEULKIYEOK -0xBA6F 0xD2C3 #HANGUL SYLLABLE THIEUTH EU RIEULPIEUP -0xBA70 0xD2C4 #HANGUL SYLLABLE THIEUTH EU RIEULSIOS -0xBA71 0xD2C5 #HANGUL SYLLABLE THIEUTH EU RIEULTHIEUTH -0xBA72 0xD2C6 #HANGUL SYLLABLE THIEUTH EU RIEULPHIEUPH -0xBA73 0xD2C7 #HANGUL SYLLABLE THIEUTH EU RIEULHIEUH -0xBA74 0xD2CA #HANGUL SYLLABLE THIEUTH EU PIEUPSIOS -0xBA75 0xD2CC #HANGUL SYLLABLE THIEUTH EU SSANGSIOS -0xBA76 0xD2CD #HANGUL SYLLABLE THIEUTH EU IEUNG -0xBA77 0xD2CE #HANGUL SYLLABLE THIEUTH EU CIEUC -0xBA78 0xD2CF #HANGUL SYLLABLE THIEUTH EU CHIEUCH -0xBA79 0xD2D0 #HANGUL SYLLABLE THIEUTH EU KHIEUKH -0xBA7A 0xD2D1 #HANGUL SYLLABLE THIEUTH EU THIEUTH -0xBA81 0xD2D2 #HANGUL SYLLABLE THIEUTH EU PHIEUPH -0xBA82 0xD2D3 #HANGUL SYLLABLE THIEUTH EU HIEUH -0xBA83 0xD2D5 #HANGUL SYLLABLE THIEUTH YI KIYEOK -0xBA84 0xD2D6 #HANGUL SYLLABLE THIEUTH YI SSANGKIYEOK -0xBA85 0xD2D7 #HANGUL SYLLABLE THIEUTH YI KIYEOKSIOS -0xBA86 0xD2D9 #HANGUL SYLLABLE THIEUTH YI NIEUNCIEUC -0xBA87 0xD2DA #HANGUL SYLLABLE THIEUTH YI NIEUNHIEUH -0xBA88 0xD2DB #HANGUL SYLLABLE THIEUTH YI TIKEUT -0xBA89 0xD2DD #HANGUL SYLLABLE THIEUTH YI RIEULKIYEOK -0xBA8A 0xD2DE #HANGUL SYLLABLE THIEUTH YI RIEULMIEUM -0xBA8B 0xD2DF #HANGUL SYLLABLE THIEUTH YI RIEULPIEUP -0xBA8C 0xD2E0 #HANGUL SYLLABLE THIEUTH YI RIEULSIOS -0xBA8D 0xD2E1 #HANGUL SYLLABLE THIEUTH YI RIEULTHIEUTH -0xBA8E 0xD2E2 #HANGUL SYLLABLE THIEUTH YI RIEULPHIEUPH -0xBA8F 0xD2E3 #HANGUL SYLLABLE THIEUTH YI RIEULHIEUH -0xBA90 0xD2E6 #HANGUL SYLLABLE THIEUTH YI PIEUPSIOS -0xBA91 0xD2E7 #HANGUL SYLLABLE THIEUTH YI SIOS -0xBA92 0xD2E8 #HANGUL SYLLABLE THIEUTH YI SSANGSIOS -0xBA93 0xD2E9 #HANGUL SYLLABLE THIEUTH YI IEUNG -0xBA94 0xD2EA #HANGUL SYLLABLE THIEUTH YI CIEUC -0xBA95 0xD2EB #HANGUL SYLLABLE THIEUTH YI CHIEUCH -0xBA96 0xD2EC #HANGUL SYLLABLE THIEUTH YI KHIEUKH -0xBA97 0xD2ED #HANGUL SYLLABLE THIEUTH YI THIEUTH -0xBA98 0xD2EE #HANGUL SYLLABLE THIEUTH YI PHIEUPH -0xBA99 0xD2EF #HANGUL SYLLABLE THIEUTH YI HIEUH -0xBA9A 0xD2F2 #HANGUL SYLLABLE THIEUTH I SSANGKIYEOK -0xBA9B 0xD2F3 #HANGUL SYLLABLE THIEUTH I KIYEOKSIOS -0xBA9C 0xD2F5 #HANGUL SYLLABLE THIEUTH I NIEUNCIEUC -0xBA9D 0xD2F6 #HANGUL SYLLABLE THIEUTH I NIEUNHIEUH -0xBA9E 0xD2F7 #HANGUL SYLLABLE THIEUTH I TIKEUT -0xBA9F 0xD2F9 #HANGUL SYLLABLE THIEUTH I RIEULKIYEOK -0xBAA0 0xD2FA #HANGUL SYLLABLE THIEUTH I RIEULMIEUM -0xBAA1 0xBC99 #HANGUL SYLLABLE PIEUP EO IEUNG -0xBAA2 0xBC9A #HANGUL SYLLABLE PIEUP EO CIEUC -0xBAA3 0xBCA0 #HANGUL SYLLABLE PIEUP E -0xBAA4 0xBCA1 #HANGUL SYLLABLE PIEUP E KIYEOK -0xBAA5 0xBCA4 #HANGUL SYLLABLE PIEUP E NIEUN -0xBAA6 0xBCA7 #HANGUL SYLLABLE PIEUP E TIKEUT -0xBAA7 0xBCA8 #HANGUL SYLLABLE PIEUP E RIEUL -0xBAA8 0xBCB0 #HANGUL SYLLABLE PIEUP E MIEUM -0xBAA9 0xBCB1 #HANGUL SYLLABLE PIEUP E PIEUP -0xBAAA 0xBCB3 #HANGUL SYLLABLE PIEUP E SIOS -0xBAAB 0xBCB4 #HANGUL SYLLABLE PIEUP E SSANGSIOS -0xBAAC 0xBCB5 #HANGUL SYLLABLE PIEUP E IEUNG -0xBAAD 0xBCBC #HANGUL SYLLABLE PIEUP YEO -0xBAAE 0xBCBD #HANGUL SYLLABLE PIEUP YEO KIYEOK -0xBAAF 0xBCC0 #HANGUL SYLLABLE PIEUP YEO NIEUN -0xBAB0 0xBCC4 #HANGUL SYLLABLE PIEUP YEO RIEUL -0xBAB1 0xBCCD #HANGUL SYLLABLE PIEUP YEO PIEUP -0xBAB2 0xBCCF #HANGUL SYLLABLE PIEUP YEO SIOS -0xBAB3 0xBCD0 #HANGUL SYLLABLE PIEUP YEO SSANGSIOS -0xBAB4 0xBCD1 #HANGUL SYLLABLE PIEUP YEO IEUNG -0xBAB5 0xBCD5 #HANGUL SYLLABLE PIEUP YEO THIEUTH -0xBAB6 0xBCD8 #HANGUL SYLLABLE PIEUP YE -0xBAB7 0xBCDC #HANGUL SYLLABLE PIEUP YE NIEUN -0xBAB8 0xBCF4 #HANGUL SYLLABLE PIEUP O -0xBAB9 0xBCF5 #HANGUL SYLLABLE PIEUP O KIYEOK -0xBABA 0xBCF6 #HANGUL SYLLABLE PIEUP O SSANGKIYEOK -0xBABB 0xBCF8 #HANGUL SYLLABLE PIEUP O NIEUN -0xBABC 0xBCFC #HANGUL SYLLABLE PIEUP O RIEUL -0xBABD 0xBD04 #HANGUL SYLLABLE PIEUP O MIEUM -0xBABE 0xBD05 #HANGUL SYLLABLE PIEUP O PIEUP -0xBABF 0xBD07 #HANGUL SYLLABLE PIEUP O SIOS -0xBAC0 0xBD09 #HANGUL SYLLABLE PIEUP O IEUNG -0xBAC1 0xBD10 #HANGUL SYLLABLE PIEUP WA -0xBAC2 0xBD14 #HANGUL SYLLABLE PIEUP WA NIEUN -0xBAC3 0xBD24 #HANGUL SYLLABLE PIEUP WA SSANGSIOS -0xBAC4 0xBD2C #HANGUL SYLLABLE PIEUP WAE -0xBAC5 0xBD40 #HANGUL SYLLABLE PIEUP WAE SSANGSIOS -0xBAC6 0xBD48 #HANGUL SYLLABLE PIEUP OE -0xBAC7 0xBD49 #HANGUL SYLLABLE PIEUP OE KIYEOK -0xBAC8 0xBD4C #HANGUL SYLLABLE PIEUP OE NIEUN -0xBAC9 0xBD50 #HANGUL SYLLABLE PIEUP OE RIEUL -0xBACA 0xBD58 #HANGUL SYLLABLE PIEUP OE MIEUM -0xBACB 0xBD59 #HANGUL SYLLABLE PIEUP OE PIEUP -0xBACC 0xBD64 #HANGUL SYLLABLE PIEUP YO -0xBACD 0xBD68 #HANGUL SYLLABLE PIEUP YO NIEUN -0xBACE 0xBD80 #HANGUL SYLLABLE PIEUP U -0xBACF 0xBD81 #HANGUL SYLLABLE PIEUP U KIYEOK -0xBAD0 0xBD84 #HANGUL SYLLABLE PIEUP U NIEUN -0xBAD1 0xBD87 #HANGUL SYLLABLE PIEUP U TIKEUT -0xBAD2 0xBD88 #HANGUL SYLLABLE PIEUP U RIEUL -0xBAD3 0xBD89 #HANGUL SYLLABLE PIEUP U RIEULKIYEOK -0xBAD4 0xBD8A #HANGUL SYLLABLE PIEUP U RIEULMIEUM -0xBAD5 0xBD90 #HANGUL SYLLABLE PIEUP U MIEUM -0xBAD6 0xBD91 #HANGUL SYLLABLE PIEUP U PIEUP -0xBAD7 0xBD93 #HANGUL SYLLABLE PIEUP U SIOS -0xBAD8 0xBD95 #HANGUL SYLLABLE PIEUP U IEUNG -0xBAD9 0xBD99 #HANGUL SYLLABLE PIEUP U THIEUTH -0xBADA 0xBD9A #HANGUL SYLLABLE PIEUP U PHIEUPH -0xBADB 0xBD9C #HANGUL SYLLABLE PIEUP WEO -0xBADC 0xBDA4 #HANGUL SYLLABLE PIEUP WEO RIEUL -0xBADD 0xBDB0 #HANGUL SYLLABLE PIEUP WEO SSANGSIOS -0xBADE 0xBDB8 #HANGUL SYLLABLE PIEUP WE -0xBADF 0xBDD4 #HANGUL SYLLABLE PIEUP WI -0xBAE0 0xBDD5 #HANGUL SYLLABLE PIEUP WI KIYEOK -0xBAE1 0xBDD8 #HANGUL SYLLABLE PIEUP WI NIEUN -0xBAE2 0xBDDC #HANGUL SYLLABLE PIEUP WI RIEUL -0xBAE3 0xBDE9 #HANGUL SYLLABLE PIEUP WI IEUNG -0xBAE4 0xBDF0 #HANGUL SYLLABLE PIEUP YU -0xBAE5 0xBDF4 #HANGUL SYLLABLE PIEUP YU NIEUN -0xBAE6 0xBDF8 #HANGUL SYLLABLE PIEUP YU RIEUL -0xBAE7 0xBE00 #HANGUL SYLLABLE PIEUP YU MIEUM -0xBAE8 0xBE03 #HANGUL SYLLABLE PIEUP YU SIOS -0xBAE9 0xBE05 #HANGUL SYLLABLE PIEUP YU IEUNG -0xBAEA 0xBE0C #HANGUL SYLLABLE PIEUP EU -0xBAEB 0xBE0D #HANGUL SYLLABLE PIEUP EU KIYEOK -0xBAEC 0xBE10 #HANGUL SYLLABLE PIEUP EU NIEUN -0xBAED 0xBE14 #HANGUL SYLLABLE PIEUP EU RIEUL -0xBAEE 0xBE1C #HANGUL SYLLABLE PIEUP EU MIEUM -0xBAEF 0xBE1D #HANGUL SYLLABLE PIEUP EU PIEUP -0xBAF0 0xBE1F #HANGUL SYLLABLE PIEUP EU SIOS -0xBAF1 0xBE44 #HANGUL SYLLABLE PIEUP I -0xBAF2 0xBE45 #HANGUL SYLLABLE PIEUP I KIYEOK -0xBAF3 0xBE48 #HANGUL SYLLABLE PIEUP I NIEUN -0xBAF4 0xBE4C #HANGUL SYLLABLE PIEUP I RIEUL -0xBAF5 0xBE4E #HANGUL SYLLABLE PIEUP I RIEULMIEUM -0xBAF6 0xBE54 #HANGUL SYLLABLE PIEUP I MIEUM -0xBAF7 0xBE55 #HANGUL SYLLABLE PIEUP I PIEUP -0xBAF8 0xBE57 #HANGUL SYLLABLE PIEUP I SIOS -0xBAF9 0xBE59 #HANGUL SYLLABLE PIEUP I IEUNG -0xBAFA 0xBE5A #HANGUL SYLLABLE PIEUP I CIEUC -0xBAFB 0xBE5B #HANGUL SYLLABLE PIEUP I CHIEUCH -0xBAFC 0xBE60 #HANGUL SYLLABLE SSANGPIEUP A -0xBAFD 0xBE61 #HANGUL SYLLABLE SSANGPIEUP A KIYEOK -0xBAFE 0xBE64 #HANGUL SYLLABLE SSANGPIEUP A NIEUN -0xBB41 0xD2FB #HANGUL SYLLABLE THIEUTH I RIEULPIEUP -0xBB42 0xD2FC #HANGUL SYLLABLE THIEUTH I RIEULSIOS -0xBB43 0xD2FD #HANGUL SYLLABLE THIEUTH I RIEULTHIEUTH -0xBB44 0xD2FE #HANGUL SYLLABLE THIEUTH I RIEULPHIEUPH -0xBB45 0xD2FF #HANGUL SYLLABLE THIEUTH I RIEULHIEUH -0xBB46 0xD302 #HANGUL SYLLABLE THIEUTH I PIEUPSIOS -0xBB47 0xD304 #HANGUL SYLLABLE THIEUTH I SSANGSIOS -0xBB48 0xD306 #HANGUL SYLLABLE THIEUTH I CIEUC -0xBB49 0xD307 #HANGUL SYLLABLE THIEUTH I CHIEUCH -0xBB4A 0xD308 #HANGUL SYLLABLE THIEUTH I KHIEUKH -0xBB4B 0xD309 #HANGUL SYLLABLE THIEUTH I THIEUTH -0xBB4C 0xD30A #HANGUL SYLLABLE THIEUTH I PHIEUPH -0xBB4D 0xD30B #HANGUL SYLLABLE THIEUTH I HIEUH -0xBB4E 0xD30F #HANGUL SYLLABLE PHIEUPH A KIYEOKSIOS -0xBB4F 0xD311 #HANGUL SYLLABLE PHIEUPH A NIEUNCIEUC -0xBB50 0xD312 #HANGUL SYLLABLE PHIEUPH A NIEUNHIEUH -0xBB51 0xD313 #HANGUL SYLLABLE PHIEUPH A TIKEUT -0xBB52 0xD315 #HANGUL SYLLABLE PHIEUPH A RIEULKIYEOK -0xBB53 0xD317 #HANGUL SYLLABLE PHIEUPH A RIEULPIEUP -0xBB54 0xD318 #HANGUL SYLLABLE PHIEUPH A RIEULSIOS -0xBB55 0xD319 #HANGUL SYLLABLE PHIEUPH A RIEULTHIEUTH -0xBB56 0xD31A #HANGUL SYLLABLE PHIEUPH A RIEULPHIEUPH -0xBB57 0xD31B #HANGUL SYLLABLE PHIEUPH A RIEULHIEUH -0xBB58 0xD31E #HANGUL SYLLABLE PHIEUPH A PIEUPSIOS -0xBB59 0xD322 #HANGUL SYLLABLE PHIEUPH A CIEUC -0xBB5A 0xD323 #HANGUL SYLLABLE PHIEUPH A CHIEUCH -0xBB61 0xD324 #HANGUL SYLLABLE PHIEUPH A KHIEUKH -0xBB62 0xD326 #HANGUL SYLLABLE PHIEUPH A PHIEUPH -0xBB63 0xD327 #HANGUL SYLLABLE PHIEUPH A HIEUH -0xBB64 0xD32A #HANGUL SYLLABLE PHIEUPH AE SSANGKIYEOK -0xBB65 0xD32B #HANGUL SYLLABLE PHIEUPH AE KIYEOKSIOS -0xBB66 0xD32D #HANGUL SYLLABLE PHIEUPH AE NIEUNCIEUC -0xBB67 0xD32E #HANGUL SYLLABLE PHIEUPH AE NIEUNHIEUH -0xBB68 0xD32F #HANGUL SYLLABLE PHIEUPH AE TIKEUT -0xBB69 0xD331 #HANGUL SYLLABLE PHIEUPH AE RIEULKIYEOK -0xBB6A 0xD332 #HANGUL SYLLABLE PHIEUPH AE RIEULMIEUM -0xBB6B 0xD333 #HANGUL SYLLABLE PHIEUPH AE RIEULPIEUP -0xBB6C 0xD334 #HANGUL SYLLABLE PHIEUPH AE RIEULSIOS -0xBB6D 0xD335 #HANGUL SYLLABLE PHIEUPH AE RIEULTHIEUTH -0xBB6E 0xD336 #HANGUL SYLLABLE PHIEUPH AE RIEULPHIEUPH -0xBB6F 0xD337 #HANGUL SYLLABLE PHIEUPH AE RIEULHIEUH -0xBB70 0xD33A #HANGUL SYLLABLE PHIEUPH AE PIEUPSIOS -0xBB71 0xD33E #HANGUL SYLLABLE PHIEUPH AE CIEUC -0xBB72 0xD33F #HANGUL SYLLABLE PHIEUPH AE CHIEUCH -0xBB73 0xD340 #HANGUL SYLLABLE PHIEUPH AE KHIEUKH -0xBB74 0xD341 #HANGUL SYLLABLE PHIEUPH AE THIEUTH -0xBB75 0xD342 #HANGUL SYLLABLE PHIEUPH AE PHIEUPH -0xBB76 0xD343 #HANGUL SYLLABLE PHIEUPH AE HIEUH -0xBB77 0xD346 #HANGUL SYLLABLE PHIEUPH YA SSANGKIYEOK -0xBB78 0xD347 #HANGUL SYLLABLE PHIEUPH YA KIYEOKSIOS -0xBB79 0xD348 #HANGUL SYLLABLE PHIEUPH YA NIEUN -0xBB7A 0xD349 #HANGUL SYLLABLE PHIEUPH YA NIEUNCIEUC -0xBB81 0xD34A #HANGUL SYLLABLE PHIEUPH YA NIEUNHIEUH -0xBB82 0xD34B #HANGUL SYLLABLE PHIEUPH YA TIKEUT -0xBB83 0xD34C #HANGUL SYLLABLE PHIEUPH YA RIEUL -0xBB84 0xD34D #HANGUL SYLLABLE PHIEUPH YA RIEULKIYEOK -0xBB85 0xD34E #HANGUL SYLLABLE PHIEUPH YA RIEULMIEUM -0xBB86 0xD34F #HANGUL SYLLABLE PHIEUPH YA RIEULPIEUP -0xBB87 0xD350 #HANGUL SYLLABLE PHIEUPH YA RIEULSIOS -0xBB88 0xD351 #HANGUL SYLLABLE PHIEUPH YA RIEULTHIEUTH -0xBB89 0xD352 #HANGUL SYLLABLE PHIEUPH YA RIEULPHIEUPH -0xBB8A 0xD353 #HANGUL SYLLABLE PHIEUPH YA RIEULHIEUH -0xBB8B 0xD354 #HANGUL SYLLABLE PHIEUPH YA MIEUM -0xBB8C 0xD355 #HANGUL SYLLABLE PHIEUPH YA PIEUP -0xBB8D 0xD356 #HANGUL SYLLABLE PHIEUPH YA PIEUPSIOS -0xBB8E 0xD357 #HANGUL SYLLABLE PHIEUPH YA SIOS -0xBB8F 0xD358 #HANGUL SYLLABLE PHIEUPH YA SSANGSIOS -0xBB90 0xD359 #HANGUL SYLLABLE PHIEUPH YA IEUNG -0xBB91 0xD35A #HANGUL SYLLABLE PHIEUPH YA CIEUC -0xBB92 0xD35B #HANGUL SYLLABLE PHIEUPH YA CHIEUCH -0xBB93 0xD35C #HANGUL SYLLABLE PHIEUPH YA KHIEUKH -0xBB94 0xD35D #HANGUL SYLLABLE PHIEUPH YA THIEUTH -0xBB95 0xD35E #HANGUL SYLLABLE PHIEUPH YA PHIEUPH -0xBB96 0xD35F #HANGUL SYLLABLE PHIEUPH YA HIEUH -0xBB97 0xD360 #HANGUL SYLLABLE PHIEUPH YAE -0xBB98 0xD361 #HANGUL SYLLABLE PHIEUPH YAE KIYEOK -0xBB99 0xD362 #HANGUL SYLLABLE PHIEUPH YAE SSANGKIYEOK -0xBB9A 0xD363 #HANGUL SYLLABLE PHIEUPH YAE KIYEOKSIOS -0xBB9B 0xD364 #HANGUL SYLLABLE PHIEUPH YAE NIEUN -0xBB9C 0xD365 #HANGUL SYLLABLE PHIEUPH YAE NIEUNCIEUC -0xBB9D 0xD366 #HANGUL SYLLABLE PHIEUPH YAE NIEUNHIEUH -0xBB9E 0xD367 #HANGUL SYLLABLE PHIEUPH YAE TIKEUT -0xBB9F 0xD368 #HANGUL SYLLABLE PHIEUPH YAE RIEUL -0xBBA0 0xD369 #HANGUL SYLLABLE PHIEUPH YAE RIEULKIYEOK -0xBBA1 0xBE68 #HANGUL SYLLABLE SSANGPIEUP A RIEUL -0xBBA2 0xBE6A #HANGUL SYLLABLE SSANGPIEUP A RIEULMIEUM -0xBBA3 0xBE70 #HANGUL SYLLABLE SSANGPIEUP A MIEUM -0xBBA4 0xBE71 #HANGUL SYLLABLE SSANGPIEUP A PIEUP -0xBBA5 0xBE73 #HANGUL SYLLABLE SSANGPIEUP A SIOS -0xBBA6 0xBE74 #HANGUL SYLLABLE SSANGPIEUP A SSANGSIOS -0xBBA7 0xBE75 #HANGUL SYLLABLE SSANGPIEUP A IEUNG -0xBBA8 0xBE7B #HANGUL SYLLABLE SSANGPIEUP A HIEUH -0xBBA9 0xBE7C #HANGUL SYLLABLE SSANGPIEUP AE -0xBBAA 0xBE7D #HANGUL SYLLABLE SSANGPIEUP AE KIYEOK -0xBBAB 0xBE80 #HANGUL SYLLABLE SSANGPIEUP AE NIEUN -0xBBAC 0xBE84 #HANGUL SYLLABLE SSANGPIEUP AE RIEUL -0xBBAD 0xBE8C #HANGUL SYLLABLE SSANGPIEUP AE MIEUM -0xBBAE 0xBE8D #HANGUL SYLLABLE SSANGPIEUP AE PIEUP -0xBBAF 0xBE8F #HANGUL SYLLABLE SSANGPIEUP AE SIOS -0xBBB0 0xBE90 #HANGUL SYLLABLE SSANGPIEUP AE SSANGSIOS -0xBBB1 0xBE91 #HANGUL SYLLABLE SSANGPIEUP AE IEUNG -0xBBB2 0xBE98 #HANGUL SYLLABLE SSANGPIEUP YA -0xBBB3 0xBE99 #HANGUL SYLLABLE SSANGPIEUP YA KIYEOK -0xBBB4 0xBEA8 #HANGUL SYLLABLE SSANGPIEUP YA MIEUM -0xBBB5 0xBED0 #HANGUL SYLLABLE SSANGPIEUP EO -0xBBB6 0xBED1 #HANGUL SYLLABLE SSANGPIEUP EO KIYEOK -0xBBB7 0xBED4 #HANGUL SYLLABLE SSANGPIEUP EO NIEUN -0xBBB8 0xBED7 #HANGUL SYLLABLE SSANGPIEUP EO TIKEUT -0xBBB9 0xBED8 #HANGUL SYLLABLE SSANGPIEUP EO RIEUL -0xBBBA 0xBEE0 #HANGUL SYLLABLE SSANGPIEUP EO MIEUM -0xBBBB 0xBEE3 #HANGUL SYLLABLE SSANGPIEUP EO SIOS -0xBBBC 0xBEE4 #HANGUL SYLLABLE SSANGPIEUP EO SSANGSIOS -0xBBBD 0xBEE5 #HANGUL SYLLABLE SSANGPIEUP EO IEUNG -0xBBBE 0xBEEC #HANGUL SYLLABLE SSANGPIEUP E -0xBBBF 0xBF01 #HANGUL SYLLABLE SSANGPIEUP E IEUNG -0xBBC0 0xBF08 #HANGUL SYLLABLE SSANGPIEUP YEO -0xBBC1 0xBF09 #HANGUL SYLLABLE SSANGPIEUP YEO KIYEOK -0xBBC2 0xBF18 #HANGUL SYLLABLE SSANGPIEUP YEO MIEUM -0xBBC3 0xBF19 #HANGUL SYLLABLE SSANGPIEUP YEO PIEUP -0xBBC4 0xBF1B #HANGUL SYLLABLE SSANGPIEUP YEO SIOS -0xBBC5 0xBF1C #HANGUL SYLLABLE SSANGPIEUP YEO SSANGSIOS -0xBBC6 0xBF1D #HANGUL SYLLABLE SSANGPIEUP YEO IEUNG -0xBBC7 0xBF40 #HANGUL SYLLABLE SSANGPIEUP O -0xBBC8 0xBF41 #HANGUL SYLLABLE SSANGPIEUP O KIYEOK -0xBBC9 0xBF44 #HANGUL SYLLABLE SSANGPIEUP O NIEUN -0xBBCA 0xBF48 #HANGUL SYLLABLE SSANGPIEUP O RIEUL -0xBBCB 0xBF50 #HANGUL SYLLABLE SSANGPIEUP O MIEUM -0xBBCC 0xBF51 #HANGUL SYLLABLE SSANGPIEUP O PIEUP -0xBBCD 0xBF55 #HANGUL SYLLABLE SSANGPIEUP O IEUNG -0xBBCE 0xBF94 #HANGUL SYLLABLE SSANGPIEUP OE -0xBBCF 0xBFB0 #HANGUL SYLLABLE SSANGPIEUP YO -0xBBD0 0xBFC5 #HANGUL SYLLABLE SSANGPIEUP YO IEUNG -0xBBD1 0xBFCC #HANGUL SYLLABLE SSANGPIEUP U -0xBBD2 0xBFCD #HANGUL SYLLABLE SSANGPIEUP U KIYEOK -0xBBD3 0xBFD0 #HANGUL SYLLABLE SSANGPIEUP U NIEUN -0xBBD4 0xBFD4 #HANGUL SYLLABLE SSANGPIEUP U RIEUL -0xBBD5 0xBFDC #HANGUL SYLLABLE SSANGPIEUP U MIEUM -0xBBD6 0xBFDF #HANGUL SYLLABLE SSANGPIEUP U SIOS -0xBBD7 0xBFE1 #HANGUL SYLLABLE SSANGPIEUP U IEUNG -0xBBD8 0xC03C #HANGUL SYLLABLE SSANGPIEUP YU -0xBBD9 0xC051 #HANGUL SYLLABLE SSANGPIEUP YU IEUNG -0xBBDA 0xC058 #HANGUL SYLLABLE SSANGPIEUP EU -0xBBDB 0xC05C #HANGUL SYLLABLE SSANGPIEUP EU NIEUN -0xBBDC 0xC060 #HANGUL SYLLABLE SSANGPIEUP EU RIEUL -0xBBDD 0xC068 #HANGUL SYLLABLE SSANGPIEUP EU MIEUM -0xBBDE 0xC069 #HANGUL SYLLABLE SSANGPIEUP EU PIEUP -0xBBDF 0xC090 #HANGUL SYLLABLE SSANGPIEUP I -0xBBE0 0xC091 #HANGUL SYLLABLE SSANGPIEUP I KIYEOK -0xBBE1 0xC094 #HANGUL SYLLABLE SSANGPIEUP I NIEUN -0xBBE2 0xC098 #HANGUL SYLLABLE SSANGPIEUP I RIEUL -0xBBE3 0xC0A0 #HANGUL SYLLABLE SSANGPIEUP I MIEUM -0xBBE4 0xC0A1 #HANGUL SYLLABLE SSANGPIEUP I PIEUP -0xBBE5 0xC0A3 #HANGUL SYLLABLE SSANGPIEUP I SIOS -0xBBE6 0xC0A5 #HANGUL SYLLABLE SSANGPIEUP I IEUNG -0xBBE7 0xC0AC #HANGUL SYLLABLE SIOS A -0xBBE8 0xC0AD #HANGUL SYLLABLE SIOS A KIYEOK -0xBBE9 0xC0AF #HANGUL SYLLABLE SIOS A KIYEOKSIOS -0xBBEA 0xC0B0 #HANGUL SYLLABLE SIOS A NIEUN -0xBBEB 0xC0B3 #HANGUL SYLLABLE SIOS A TIKEUT -0xBBEC 0xC0B4 #HANGUL SYLLABLE SIOS A RIEUL -0xBBED 0xC0B5 #HANGUL SYLLABLE SIOS A RIEULKIYEOK -0xBBEE 0xC0B6 #HANGUL SYLLABLE SIOS A RIEULMIEUM -0xBBEF 0xC0BC #HANGUL SYLLABLE SIOS A MIEUM -0xBBF0 0xC0BD #HANGUL SYLLABLE SIOS A PIEUP -0xBBF1 0xC0BF #HANGUL SYLLABLE SIOS A SIOS -0xBBF2 0xC0C0 #HANGUL SYLLABLE SIOS A SSANGSIOS -0xBBF3 0xC0C1 #HANGUL SYLLABLE SIOS A IEUNG -0xBBF4 0xC0C5 #HANGUL SYLLABLE SIOS A THIEUTH -0xBBF5 0xC0C8 #HANGUL SYLLABLE SIOS AE -0xBBF6 0xC0C9 #HANGUL SYLLABLE SIOS AE KIYEOK -0xBBF7 0xC0CC #HANGUL SYLLABLE SIOS AE NIEUN -0xBBF8 0xC0D0 #HANGUL SYLLABLE SIOS AE RIEUL -0xBBF9 0xC0D8 #HANGUL SYLLABLE SIOS AE MIEUM -0xBBFA 0xC0D9 #HANGUL SYLLABLE SIOS AE PIEUP -0xBBFB 0xC0DB #HANGUL SYLLABLE SIOS AE SIOS -0xBBFC 0xC0DC #HANGUL SYLLABLE SIOS AE SSANGSIOS -0xBBFD 0xC0DD #HANGUL SYLLABLE SIOS AE IEUNG -0xBBFE 0xC0E4 #HANGUL SYLLABLE SIOS YA -0xBC41 0xD36A #HANGUL SYLLABLE PHIEUPH YAE RIEULMIEUM -0xBC42 0xD36B #HANGUL SYLLABLE PHIEUPH YAE RIEULPIEUP -0xBC43 0xD36C #HANGUL SYLLABLE PHIEUPH YAE RIEULSIOS -0xBC44 0xD36D #HANGUL SYLLABLE PHIEUPH YAE RIEULTHIEUTH -0xBC45 0xD36E #HANGUL SYLLABLE PHIEUPH YAE RIEULPHIEUPH -0xBC46 0xD36F #HANGUL SYLLABLE PHIEUPH YAE RIEULHIEUH -0xBC47 0xD370 #HANGUL SYLLABLE PHIEUPH YAE MIEUM -0xBC48 0xD371 #HANGUL SYLLABLE PHIEUPH YAE PIEUP -0xBC49 0xD372 #HANGUL SYLLABLE PHIEUPH YAE PIEUPSIOS -0xBC4A 0xD373 #HANGUL SYLLABLE PHIEUPH YAE SIOS -0xBC4B 0xD374 #HANGUL SYLLABLE PHIEUPH YAE SSANGSIOS -0xBC4C 0xD375 #HANGUL SYLLABLE PHIEUPH YAE IEUNG -0xBC4D 0xD376 #HANGUL SYLLABLE PHIEUPH YAE CIEUC -0xBC4E 0xD377 #HANGUL SYLLABLE PHIEUPH YAE CHIEUCH -0xBC4F 0xD378 #HANGUL SYLLABLE PHIEUPH YAE KHIEUKH -0xBC50 0xD379 #HANGUL SYLLABLE PHIEUPH YAE THIEUTH -0xBC51 0xD37A #HANGUL SYLLABLE PHIEUPH YAE PHIEUPH -0xBC52 0xD37B #HANGUL SYLLABLE PHIEUPH YAE HIEUH -0xBC53 0xD37E #HANGUL SYLLABLE PHIEUPH EO SSANGKIYEOK -0xBC54 0xD37F #HANGUL SYLLABLE PHIEUPH EO KIYEOKSIOS -0xBC55 0xD381 #HANGUL SYLLABLE PHIEUPH EO NIEUNCIEUC -0xBC56 0xD382 #HANGUL SYLLABLE PHIEUPH EO NIEUNHIEUH -0xBC57 0xD383 #HANGUL SYLLABLE PHIEUPH EO TIKEUT -0xBC58 0xD385 #HANGUL SYLLABLE PHIEUPH EO RIEULKIYEOK -0xBC59 0xD386 #HANGUL SYLLABLE PHIEUPH EO RIEULMIEUM -0xBC5A 0xD387 #HANGUL SYLLABLE PHIEUPH EO RIEULPIEUP -0xBC61 0xD388 #HANGUL SYLLABLE PHIEUPH EO RIEULSIOS -0xBC62 0xD389 #HANGUL SYLLABLE PHIEUPH EO RIEULTHIEUTH -0xBC63 0xD38A #HANGUL SYLLABLE PHIEUPH EO RIEULPHIEUPH -0xBC64 0xD38B #HANGUL SYLLABLE PHIEUPH EO RIEULHIEUH -0xBC65 0xD38E #HANGUL SYLLABLE PHIEUPH EO PIEUPSIOS -0xBC66 0xD392 #HANGUL SYLLABLE PHIEUPH EO CIEUC -0xBC67 0xD393 #HANGUL SYLLABLE PHIEUPH EO CHIEUCH -0xBC68 0xD394 #HANGUL SYLLABLE PHIEUPH EO KHIEUKH -0xBC69 0xD395 #HANGUL SYLLABLE PHIEUPH EO THIEUTH -0xBC6A 0xD396 #HANGUL SYLLABLE PHIEUPH EO PHIEUPH -0xBC6B 0xD397 #HANGUL SYLLABLE PHIEUPH EO HIEUH -0xBC6C 0xD39A #HANGUL SYLLABLE PHIEUPH E SSANGKIYEOK -0xBC6D 0xD39B #HANGUL SYLLABLE PHIEUPH E KIYEOKSIOS -0xBC6E 0xD39D #HANGUL SYLLABLE PHIEUPH E NIEUNCIEUC -0xBC6F 0xD39E #HANGUL SYLLABLE PHIEUPH E NIEUNHIEUH -0xBC70 0xD39F #HANGUL SYLLABLE PHIEUPH E TIKEUT -0xBC71 0xD3A1 #HANGUL SYLLABLE PHIEUPH E RIEULKIYEOK -0xBC72 0xD3A2 #HANGUL SYLLABLE PHIEUPH E RIEULMIEUM -0xBC73 0xD3A3 #HANGUL SYLLABLE PHIEUPH E RIEULPIEUP -0xBC74 0xD3A4 #HANGUL SYLLABLE PHIEUPH E RIEULSIOS -0xBC75 0xD3A5 #HANGUL SYLLABLE PHIEUPH E RIEULTHIEUTH -0xBC76 0xD3A6 #HANGUL SYLLABLE PHIEUPH E RIEULPHIEUPH -0xBC77 0xD3A7 #HANGUL SYLLABLE PHIEUPH E RIEULHIEUH -0xBC78 0xD3AA #HANGUL SYLLABLE PHIEUPH E PIEUPSIOS -0xBC79 0xD3AC #HANGUL SYLLABLE PHIEUPH E SSANGSIOS -0xBC7A 0xD3AE #HANGUL SYLLABLE PHIEUPH E CIEUC -0xBC81 0xD3AF #HANGUL SYLLABLE PHIEUPH E CHIEUCH -0xBC82 0xD3B0 #HANGUL SYLLABLE PHIEUPH E KHIEUKH -0xBC83 0xD3B1 #HANGUL SYLLABLE PHIEUPH E THIEUTH -0xBC84 0xD3B2 #HANGUL SYLLABLE PHIEUPH E PHIEUPH -0xBC85 0xD3B3 #HANGUL SYLLABLE PHIEUPH E HIEUH -0xBC86 0xD3B5 #HANGUL SYLLABLE PHIEUPH YEO KIYEOK -0xBC87 0xD3B6 #HANGUL SYLLABLE PHIEUPH YEO SSANGKIYEOK -0xBC88 0xD3B7 #HANGUL SYLLABLE PHIEUPH YEO KIYEOKSIOS -0xBC89 0xD3B9 #HANGUL SYLLABLE PHIEUPH YEO NIEUNCIEUC -0xBC8A 0xD3BA #HANGUL SYLLABLE PHIEUPH YEO NIEUNHIEUH -0xBC8B 0xD3BB #HANGUL SYLLABLE PHIEUPH YEO TIKEUT -0xBC8C 0xD3BD #HANGUL SYLLABLE PHIEUPH YEO RIEULKIYEOK -0xBC8D 0xD3BE #HANGUL SYLLABLE PHIEUPH YEO RIEULMIEUM -0xBC8E 0xD3BF #HANGUL SYLLABLE PHIEUPH YEO RIEULPIEUP -0xBC8F 0xD3C0 #HANGUL SYLLABLE PHIEUPH YEO RIEULSIOS -0xBC90 0xD3C1 #HANGUL SYLLABLE PHIEUPH YEO RIEULTHIEUTH -0xBC91 0xD3C2 #HANGUL SYLLABLE PHIEUPH YEO RIEULPHIEUPH -0xBC92 0xD3C3 #HANGUL SYLLABLE PHIEUPH YEO RIEULHIEUH -0xBC93 0xD3C6 #HANGUL SYLLABLE PHIEUPH YEO PIEUPSIOS -0xBC94 0xD3C7 #HANGUL SYLLABLE PHIEUPH YEO SIOS -0xBC95 0xD3CA #HANGUL SYLLABLE PHIEUPH YEO CIEUC -0xBC96 0xD3CB #HANGUL SYLLABLE PHIEUPH YEO CHIEUCH -0xBC97 0xD3CC #HANGUL SYLLABLE PHIEUPH YEO KHIEUKH -0xBC98 0xD3CD #HANGUL SYLLABLE PHIEUPH YEO THIEUTH -0xBC99 0xD3CE #HANGUL SYLLABLE PHIEUPH YEO PHIEUPH -0xBC9A 0xD3CF #HANGUL SYLLABLE PHIEUPH YEO HIEUH -0xBC9B 0xD3D1 #HANGUL SYLLABLE PHIEUPH YE KIYEOK -0xBC9C 0xD3D2 #HANGUL SYLLABLE PHIEUPH YE SSANGKIYEOK -0xBC9D 0xD3D3 #HANGUL SYLLABLE PHIEUPH YE KIYEOKSIOS -0xBC9E 0xD3D4 #HANGUL SYLLABLE PHIEUPH YE NIEUN -0xBC9F 0xD3D5 #HANGUL SYLLABLE PHIEUPH YE NIEUNCIEUC -0xBCA0 0xD3D6 #HANGUL SYLLABLE PHIEUPH YE NIEUNHIEUH -0xBCA1 0xC0E5 #HANGUL SYLLABLE SIOS YA KIYEOK -0xBCA2 0xC0E8 #HANGUL SYLLABLE SIOS YA NIEUN -0xBCA3 0xC0EC #HANGUL SYLLABLE SIOS YA RIEUL -0xBCA4 0xC0F4 #HANGUL SYLLABLE SIOS YA MIEUM -0xBCA5 0xC0F5 #HANGUL SYLLABLE SIOS YA PIEUP -0xBCA6 0xC0F7 #HANGUL SYLLABLE SIOS YA SIOS -0xBCA7 0xC0F9 #HANGUL SYLLABLE SIOS YA IEUNG -0xBCA8 0xC100 #HANGUL SYLLABLE SIOS YAE -0xBCA9 0xC104 #HANGUL SYLLABLE SIOS YAE NIEUN -0xBCAA 0xC108 #HANGUL SYLLABLE SIOS YAE RIEUL -0xBCAB 0xC110 #HANGUL SYLLABLE SIOS YAE MIEUM -0xBCAC 0xC115 #HANGUL SYLLABLE SIOS YAE IEUNG -0xBCAD 0xC11C #HANGUL SYLLABLE SIOS EO -0xBCAE 0xC11D #HANGUL SYLLABLE SIOS EO KIYEOK -0xBCAF 0xC11E #HANGUL SYLLABLE SIOS EO SSANGKIYEOK -0xBCB0 0xC11F #HANGUL SYLLABLE SIOS EO KIYEOKSIOS -0xBCB1 0xC120 #HANGUL SYLLABLE SIOS EO NIEUN -0xBCB2 0xC123 #HANGUL SYLLABLE SIOS EO TIKEUT -0xBCB3 0xC124 #HANGUL SYLLABLE SIOS EO RIEUL -0xBCB4 0xC126 #HANGUL SYLLABLE SIOS EO RIEULMIEUM -0xBCB5 0xC127 #HANGUL SYLLABLE SIOS EO RIEULPIEUP -0xBCB6 0xC12C #HANGUL SYLLABLE SIOS EO MIEUM -0xBCB7 0xC12D #HANGUL SYLLABLE SIOS EO PIEUP -0xBCB8 0xC12F #HANGUL SYLLABLE SIOS EO SIOS -0xBCB9 0xC130 #HANGUL SYLLABLE SIOS EO SSANGSIOS -0xBCBA 0xC131 #HANGUL SYLLABLE SIOS EO IEUNG -0xBCBB 0xC136 #HANGUL SYLLABLE SIOS EO PHIEUPH -0xBCBC 0xC138 #HANGUL SYLLABLE SIOS E -0xBCBD 0xC139 #HANGUL SYLLABLE SIOS E KIYEOK -0xBCBE 0xC13C #HANGUL SYLLABLE SIOS E NIEUN -0xBCBF 0xC140 #HANGUL SYLLABLE SIOS E RIEUL -0xBCC0 0xC148 #HANGUL SYLLABLE SIOS E MIEUM -0xBCC1 0xC149 #HANGUL SYLLABLE SIOS E PIEUP -0xBCC2 0xC14B #HANGUL SYLLABLE SIOS E SIOS -0xBCC3 0xC14C #HANGUL SYLLABLE SIOS E SSANGSIOS -0xBCC4 0xC14D #HANGUL SYLLABLE SIOS E IEUNG -0xBCC5 0xC154 #HANGUL SYLLABLE SIOS YEO -0xBCC6 0xC155 #HANGUL SYLLABLE SIOS YEO KIYEOK -0xBCC7 0xC158 #HANGUL SYLLABLE SIOS YEO NIEUN -0xBCC8 0xC15C #HANGUL SYLLABLE SIOS YEO RIEUL -0xBCC9 0xC164 #HANGUL SYLLABLE SIOS YEO MIEUM -0xBCCA 0xC165 #HANGUL SYLLABLE SIOS YEO PIEUP -0xBCCB 0xC167 #HANGUL SYLLABLE SIOS YEO SIOS -0xBCCC 0xC168 #HANGUL SYLLABLE SIOS YEO SSANGSIOS -0xBCCD 0xC169 #HANGUL SYLLABLE SIOS YEO IEUNG -0xBCCE 0xC170 #HANGUL SYLLABLE SIOS YE -0xBCCF 0xC174 #HANGUL SYLLABLE SIOS YE NIEUN -0xBCD0 0xC178 #HANGUL SYLLABLE SIOS YE RIEUL -0xBCD1 0xC185 #HANGUL SYLLABLE SIOS YE IEUNG -0xBCD2 0xC18C #HANGUL SYLLABLE SIOS O -0xBCD3 0xC18D #HANGUL SYLLABLE SIOS O KIYEOK -0xBCD4 0xC18E #HANGUL SYLLABLE SIOS O SSANGKIYEOK -0xBCD5 0xC190 #HANGUL SYLLABLE SIOS O NIEUN -0xBCD6 0xC194 #HANGUL SYLLABLE SIOS O RIEUL -0xBCD7 0xC196 #HANGUL SYLLABLE SIOS O RIEULMIEUM -0xBCD8 0xC19C #HANGUL SYLLABLE SIOS O MIEUM -0xBCD9 0xC19D #HANGUL SYLLABLE SIOS O PIEUP -0xBCDA 0xC19F #HANGUL SYLLABLE SIOS O SIOS -0xBCDB 0xC1A1 #HANGUL SYLLABLE SIOS O IEUNG -0xBCDC 0xC1A5 #HANGUL SYLLABLE SIOS O THIEUTH -0xBCDD 0xC1A8 #HANGUL SYLLABLE SIOS WA -0xBCDE 0xC1A9 #HANGUL SYLLABLE SIOS WA KIYEOK -0xBCDF 0xC1AC #HANGUL SYLLABLE SIOS WA NIEUN -0xBCE0 0xC1B0 #HANGUL SYLLABLE SIOS WA RIEUL -0xBCE1 0xC1BD #HANGUL SYLLABLE SIOS WA IEUNG -0xBCE2 0xC1C4 #HANGUL SYLLABLE SIOS WAE -0xBCE3 0xC1C8 #HANGUL SYLLABLE SIOS WAE NIEUN -0xBCE4 0xC1CC #HANGUL SYLLABLE SIOS WAE RIEUL -0xBCE5 0xC1D4 #HANGUL SYLLABLE SIOS WAE MIEUM -0xBCE6 0xC1D7 #HANGUL SYLLABLE SIOS WAE SIOS -0xBCE7 0xC1D8 #HANGUL SYLLABLE SIOS WAE SSANGSIOS -0xBCE8 0xC1E0 #HANGUL SYLLABLE SIOS OE -0xBCE9 0xC1E4 #HANGUL SYLLABLE SIOS OE NIEUN -0xBCEA 0xC1E8 #HANGUL SYLLABLE SIOS OE RIEUL -0xBCEB 0xC1F0 #HANGUL SYLLABLE SIOS OE MIEUM -0xBCEC 0xC1F1 #HANGUL SYLLABLE SIOS OE PIEUP -0xBCED 0xC1F3 #HANGUL SYLLABLE SIOS OE SIOS -0xBCEE 0xC1FC #HANGUL SYLLABLE SIOS YO -0xBCEF 0xC1FD #HANGUL SYLLABLE SIOS YO KIYEOK -0xBCF0 0xC200 #HANGUL SYLLABLE SIOS YO NIEUN -0xBCF1 0xC204 #HANGUL SYLLABLE SIOS YO RIEUL -0xBCF2 0xC20C #HANGUL SYLLABLE SIOS YO MIEUM -0xBCF3 0xC20D #HANGUL SYLLABLE SIOS YO PIEUP -0xBCF4 0xC20F #HANGUL SYLLABLE SIOS YO SIOS -0xBCF5 0xC211 #HANGUL SYLLABLE SIOS YO IEUNG -0xBCF6 0xC218 #HANGUL SYLLABLE SIOS U -0xBCF7 0xC219 #HANGUL SYLLABLE SIOS U KIYEOK -0xBCF8 0xC21C #HANGUL SYLLABLE SIOS U NIEUN -0xBCF9 0xC21F #HANGUL SYLLABLE SIOS U TIKEUT -0xBCFA 0xC220 #HANGUL SYLLABLE SIOS U RIEUL -0xBCFB 0xC228 #HANGUL SYLLABLE SIOS U MIEUM -0xBCFC 0xC229 #HANGUL SYLLABLE SIOS U PIEUP -0xBCFD 0xC22B #HANGUL SYLLABLE SIOS U SIOS -0xBCFE 0xC22D #HANGUL SYLLABLE SIOS U IEUNG -0xBD41 0xD3D7 #HANGUL SYLLABLE PHIEUPH YE TIKEUT -0xBD42 0xD3D9 #HANGUL SYLLABLE PHIEUPH YE RIEULKIYEOK -0xBD43 0xD3DA #HANGUL SYLLABLE PHIEUPH YE RIEULMIEUM -0xBD44 0xD3DB #HANGUL SYLLABLE PHIEUPH YE RIEULPIEUP -0xBD45 0xD3DC #HANGUL SYLLABLE PHIEUPH YE RIEULSIOS -0xBD46 0xD3DD #HANGUL SYLLABLE PHIEUPH YE RIEULTHIEUTH -0xBD47 0xD3DE #HANGUL SYLLABLE PHIEUPH YE RIEULPHIEUPH -0xBD48 0xD3DF #HANGUL SYLLABLE PHIEUPH YE RIEULHIEUH -0xBD49 0xD3E0 #HANGUL SYLLABLE PHIEUPH YE MIEUM -0xBD4A 0xD3E2 #HANGUL SYLLABLE PHIEUPH YE PIEUPSIOS -0xBD4B 0xD3E4 #HANGUL SYLLABLE PHIEUPH YE SSANGSIOS -0xBD4C 0xD3E5 #HANGUL SYLLABLE PHIEUPH YE IEUNG -0xBD4D 0xD3E6 #HANGUL SYLLABLE PHIEUPH YE CIEUC -0xBD4E 0xD3E7 #HANGUL SYLLABLE PHIEUPH YE CHIEUCH -0xBD4F 0xD3E8 #HANGUL SYLLABLE PHIEUPH YE KHIEUKH -0xBD50 0xD3E9 #HANGUL SYLLABLE PHIEUPH YE THIEUTH -0xBD51 0xD3EA #HANGUL SYLLABLE PHIEUPH YE PHIEUPH -0xBD52 0xD3EB #HANGUL SYLLABLE PHIEUPH YE HIEUH -0xBD53 0xD3EE #HANGUL SYLLABLE PHIEUPH O SSANGKIYEOK -0xBD54 0xD3EF #HANGUL SYLLABLE PHIEUPH O KIYEOKSIOS -0xBD55 0xD3F1 #HANGUL SYLLABLE PHIEUPH O NIEUNCIEUC -0xBD56 0xD3F2 #HANGUL SYLLABLE PHIEUPH O NIEUNHIEUH -0xBD57 0xD3F3 #HANGUL SYLLABLE PHIEUPH O TIKEUT -0xBD58 0xD3F5 #HANGUL SYLLABLE PHIEUPH O RIEULKIYEOK -0xBD59 0xD3F6 #HANGUL SYLLABLE PHIEUPH O RIEULMIEUM -0xBD5A 0xD3F7 #HANGUL SYLLABLE PHIEUPH O RIEULPIEUP -0xBD61 0xD3F8 #HANGUL SYLLABLE PHIEUPH O RIEULSIOS -0xBD62 0xD3F9 #HANGUL SYLLABLE PHIEUPH O RIEULTHIEUTH -0xBD63 0xD3FA #HANGUL SYLLABLE PHIEUPH O RIEULPHIEUPH -0xBD64 0xD3FB #HANGUL SYLLABLE PHIEUPH O RIEULHIEUH -0xBD65 0xD3FE #HANGUL SYLLABLE PHIEUPH O PIEUPSIOS -0xBD66 0xD400 #HANGUL SYLLABLE PHIEUPH O SSANGSIOS -0xBD67 0xD402 #HANGUL SYLLABLE PHIEUPH O CIEUC -0xBD68 0xD403 #HANGUL SYLLABLE PHIEUPH O CHIEUCH -0xBD69 0xD404 #HANGUL SYLLABLE PHIEUPH O KHIEUKH -0xBD6A 0xD405 #HANGUL SYLLABLE PHIEUPH O THIEUTH -0xBD6B 0xD406 #HANGUL SYLLABLE PHIEUPH O PHIEUPH -0xBD6C 0xD407 #HANGUL SYLLABLE PHIEUPH O HIEUH -0xBD6D 0xD409 #HANGUL SYLLABLE PHIEUPH WA KIYEOK -0xBD6E 0xD40A #HANGUL SYLLABLE PHIEUPH WA SSANGKIYEOK -0xBD6F 0xD40B #HANGUL SYLLABLE PHIEUPH WA KIYEOKSIOS -0xBD70 0xD40C #HANGUL SYLLABLE PHIEUPH WA NIEUN -0xBD71 0xD40D #HANGUL SYLLABLE PHIEUPH WA NIEUNCIEUC -0xBD72 0xD40E #HANGUL SYLLABLE PHIEUPH WA NIEUNHIEUH -0xBD73 0xD40F #HANGUL SYLLABLE PHIEUPH WA TIKEUT -0xBD74 0xD410 #HANGUL SYLLABLE PHIEUPH WA RIEUL -0xBD75 0xD411 #HANGUL SYLLABLE PHIEUPH WA RIEULKIYEOK -0xBD76 0xD412 #HANGUL SYLLABLE PHIEUPH WA RIEULMIEUM -0xBD77 0xD413 #HANGUL SYLLABLE PHIEUPH WA RIEULPIEUP -0xBD78 0xD414 #HANGUL SYLLABLE PHIEUPH WA RIEULSIOS -0xBD79 0xD415 #HANGUL SYLLABLE PHIEUPH WA RIEULTHIEUTH -0xBD7A 0xD416 #HANGUL SYLLABLE PHIEUPH WA RIEULPHIEUPH -0xBD81 0xD417 #HANGUL SYLLABLE PHIEUPH WA RIEULHIEUH -0xBD82 0xD418 #HANGUL SYLLABLE PHIEUPH WA MIEUM -0xBD83 0xD419 #HANGUL SYLLABLE PHIEUPH WA PIEUP -0xBD84 0xD41A #HANGUL SYLLABLE PHIEUPH WA PIEUPSIOS -0xBD85 0xD41B #HANGUL SYLLABLE PHIEUPH WA SIOS -0xBD86 0xD41C #HANGUL SYLLABLE PHIEUPH WA SSANGSIOS -0xBD87 0xD41E #HANGUL SYLLABLE PHIEUPH WA CIEUC -0xBD88 0xD41F #HANGUL SYLLABLE PHIEUPH WA CHIEUCH -0xBD89 0xD420 #HANGUL SYLLABLE PHIEUPH WA KHIEUKH -0xBD8A 0xD421 #HANGUL SYLLABLE PHIEUPH WA THIEUTH -0xBD8B 0xD422 #HANGUL SYLLABLE PHIEUPH WA PHIEUPH -0xBD8C 0xD423 #HANGUL SYLLABLE PHIEUPH WA HIEUH -0xBD8D 0xD424 #HANGUL SYLLABLE PHIEUPH WAE -0xBD8E 0xD425 #HANGUL SYLLABLE PHIEUPH WAE KIYEOK -0xBD8F 0xD426 #HANGUL SYLLABLE PHIEUPH WAE SSANGKIYEOK -0xBD90 0xD427 #HANGUL SYLLABLE PHIEUPH WAE KIYEOKSIOS -0xBD91 0xD428 #HANGUL SYLLABLE PHIEUPH WAE NIEUN -0xBD92 0xD429 #HANGUL SYLLABLE PHIEUPH WAE NIEUNCIEUC -0xBD93 0xD42A #HANGUL SYLLABLE PHIEUPH WAE NIEUNHIEUH -0xBD94 0xD42B #HANGUL SYLLABLE PHIEUPH WAE TIKEUT -0xBD95 0xD42C #HANGUL SYLLABLE PHIEUPH WAE RIEUL -0xBD96 0xD42D #HANGUL SYLLABLE PHIEUPH WAE RIEULKIYEOK -0xBD97 0xD42E #HANGUL SYLLABLE PHIEUPH WAE RIEULMIEUM -0xBD98 0xD42F #HANGUL SYLLABLE PHIEUPH WAE RIEULPIEUP -0xBD99 0xD430 #HANGUL SYLLABLE PHIEUPH WAE RIEULSIOS -0xBD9A 0xD431 #HANGUL SYLLABLE PHIEUPH WAE RIEULTHIEUTH -0xBD9B 0xD432 #HANGUL SYLLABLE PHIEUPH WAE RIEULPHIEUPH -0xBD9C 0xD433 #HANGUL SYLLABLE PHIEUPH WAE RIEULHIEUH -0xBD9D 0xD434 #HANGUL SYLLABLE PHIEUPH WAE MIEUM -0xBD9E 0xD435 #HANGUL SYLLABLE PHIEUPH WAE PIEUP -0xBD9F 0xD436 #HANGUL SYLLABLE PHIEUPH WAE PIEUPSIOS -0xBDA0 0xD437 #HANGUL SYLLABLE PHIEUPH WAE SIOS -0xBDA1 0xC22F #HANGUL SYLLABLE SIOS U CHIEUCH -0xBDA2 0xC231 #HANGUL SYLLABLE SIOS U THIEUTH -0xBDA3 0xC232 #HANGUL SYLLABLE SIOS U PHIEUPH -0xBDA4 0xC234 #HANGUL SYLLABLE SIOS WEO -0xBDA5 0xC248 #HANGUL SYLLABLE SIOS WEO SSANGSIOS -0xBDA6 0xC250 #HANGUL SYLLABLE SIOS WE -0xBDA7 0xC251 #HANGUL SYLLABLE SIOS WE KIYEOK -0xBDA8 0xC254 #HANGUL SYLLABLE SIOS WE NIEUN -0xBDA9 0xC258 #HANGUL SYLLABLE SIOS WE RIEUL -0xBDAA 0xC260 #HANGUL SYLLABLE SIOS WE MIEUM -0xBDAB 0xC265 #HANGUL SYLLABLE SIOS WE IEUNG -0xBDAC 0xC26C #HANGUL SYLLABLE SIOS WI -0xBDAD 0xC26D #HANGUL SYLLABLE SIOS WI KIYEOK -0xBDAE 0xC270 #HANGUL SYLLABLE SIOS WI NIEUN -0xBDAF 0xC274 #HANGUL SYLLABLE SIOS WI RIEUL -0xBDB0 0xC27C #HANGUL SYLLABLE SIOS WI MIEUM -0xBDB1 0xC27D #HANGUL SYLLABLE SIOS WI PIEUP -0xBDB2 0xC27F #HANGUL SYLLABLE SIOS WI SIOS -0xBDB3 0xC281 #HANGUL SYLLABLE SIOS WI IEUNG -0xBDB4 0xC288 #HANGUL SYLLABLE SIOS YU -0xBDB5 0xC289 #HANGUL SYLLABLE SIOS YU KIYEOK -0xBDB6 0xC290 #HANGUL SYLLABLE SIOS YU RIEUL -0xBDB7 0xC298 #HANGUL SYLLABLE SIOS YU MIEUM -0xBDB8 0xC29B #HANGUL SYLLABLE SIOS YU SIOS -0xBDB9 0xC29D #HANGUL SYLLABLE SIOS YU IEUNG -0xBDBA 0xC2A4 #HANGUL SYLLABLE SIOS EU -0xBDBB 0xC2A5 #HANGUL SYLLABLE SIOS EU KIYEOK -0xBDBC 0xC2A8 #HANGUL SYLLABLE SIOS EU NIEUN -0xBDBD 0xC2AC #HANGUL SYLLABLE SIOS EU RIEUL -0xBDBE 0xC2AD #HANGUL SYLLABLE SIOS EU RIEULKIYEOK -0xBDBF 0xC2B4 #HANGUL SYLLABLE SIOS EU MIEUM -0xBDC0 0xC2B5 #HANGUL SYLLABLE SIOS EU PIEUP -0xBDC1 0xC2B7 #HANGUL SYLLABLE SIOS EU SIOS -0xBDC2 0xC2B9 #HANGUL SYLLABLE SIOS EU IEUNG -0xBDC3 0xC2DC #HANGUL SYLLABLE SIOS I -0xBDC4 0xC2DD #HANGUL SYLLABLE SIOS I KIYEOK -0xBDC5 0xC2E0 #HANGUL SYLLABLE SIOS I NIEUN -0xBDC6 0xC2E3 #HANGUL SYLLABLE SIOS I TIKEUT -0xBDC7 0xC2E4 #HANGUL SYLLABLE SIOS I RIEUL -0xBDC8 0xC2EB #HANGUL SYLLABLE SIOS I RIEULHIEUH -0xBDC9 0xC2EC #HANGUL SYLLABLE SIOS I MIEUM -0xBDCA 0xC2ED #HANGUL SYLLABLE SIOS I PIEUP -0xBDCB 0xC2EF #HANGUL SYLLABLE SIOS I SIOS -0xBDCC 0xC2F1 #HANGUL SYLLABLE SIOS I IEUNG -0xBDCD 0xC2F6 #HANGUL SYLLABLE SIOS I PHIEUPH -0xBDCE 0xC2F8 #HANGUL SYLLABLE SSANGSIOS A -0xBDCF 0xC2F9 #HANGUL SYLLABLE SSANGSIOS A KIYEOK -0xBDD0 0xC2FB #HANGUL SYLLABLE SSANGSIOS A KIYEOKSIOS -0xBDD1 0xC2FC #HANGUL SYLLABLE SSANGSIOS A NIEUN -0xBDD2 0xC300 #HANGUL SYLLABLE SSANGSIOS A RIEUL -0xBDD3 0xC308 #HANGUL SYLLABLE SSANGSIOS A MIEUM -0xBDD4 0xC309 #HANGUL SYLLABLE SSANGSIOS A PIEUP -0xBDD5 0xC30C #HANGUL SYLLABLE SSANGSIOS A SSANGSIOS -0xBDD6 0xC30D #HANGUL SYLLABLE SSANGSIOS A IEUNG -0xBDD7 0xC313 #HANGUL SYLLABLE SSANGSIOS A HIEUH -0xBDD8 0xC314 #HANGUL SYLLABLE SSANGSIOS AE -0xBDD9 0xC315 #HANGUL SYLLABLE SSANGSIOS AE KIYEOK -0xBDDA 0xC318 #HANGUL SYLLABLE SSANGSIOS AE NIEUN -0xBDDB 0xC31C #HANGUL SYLLABLE SSANGSIOS AE RIEUL -0xBDDC 0xC324 #HANGUL SYLLABLE SSANGSIOS AE MIEUM -0xBDDD 0xC325 #HANGUL SYLLABLE SSANGSIOS AE PIEUP -0xBDDE 0xC328 #HANGUL SYLLABLE SSANGSIOS AE SSANGSIOS -0xBDDF 0xC329 #HANGUL SYLLABLE SSANGSIOS AE IEUNG -0xBDE0 0xC345 #HANGUL SYLLABLE SSANGSIOS YA IEUNG -0xBDE1 0xC368 #HANGUL SYLLABLE SSANGSIOS EO -0xBDE2 0xC369 #HANGUL SYLLABLE SSANGSIOS EO KIYEOK -0xBDE3 0xC36C #HANGUL SYLLABLE SSANGSIOS EO NIEUN -0xBDE4 0xC370 #HANGUL SYLLABLE SSANGSIOS EO RIEUL -0xBDE5 0xC372 #HANGUL SYLLABLE SSANGSIOS EO RIEULMIEUM -0xBDE6 0xC378 #HANGUL SYLLABLE SSANGSIOS EO MIEUM -0xBDE7 0xC379 #HANGUL SYLLABLE SSANGSIOS EO PIEUP -0xBDE8 0xC37C #HANGUL SYLLABLE SSANGSIOS EO SSANGSIOS -0xBDE9 0xC37D #HANGUL SYLLABLE SSANGSIOS EO IEUNG -0xBDEA 0xC384 #HANGUL SYLLABLE SSANGSIOS E -0xBDEB 0xC388 #HANGUL SYLLABLE SSANGSIOS E NIEUN -0xBDEC 0xC38C #HANGUL SYLLABLE SSANGSIOS E RIEUL -0xBDED 0xC3C0 #HANGUL SYLLABLE SSANGSIOS YE NIEUN -0xBDEE 0xC3D8 #HANGUL SYLLABLE SSANGSIOS O -0xBDEF 0xC3D9 #HANGUL SYLLABLE SSANGSIOS O KIYEOK -0xBDF0 0xC3DC #HANGUL SYLLABLE SSANGSIOS O NIEUN -0xBDF1 0xC3DF #HANGUL SYLLABLE SSANGSIOS O TIKEUT -0xBDF2 0xC3E0 #HANGUL SYLLABLE SSANGSIOS O RIEUL -0xBDF3 0xC3E2 #HANGUL SYLLABLE SSANGSIOS O RIEULMIEUM -0xBDF4 0xC3E8 #HANGUL SYLLABLE SSANGSIOS O MIEUM -0xBDF5 0xC3E9 #HANGUL SYLLABLE SSANGSIOS O PIEUP -0xBDF6 0xC3ED #HANGUL SYLLABLE SSANGSIOS O IEUNG -0xBDF7 0xC3F4 #HANGUL SYLLABLE SSANGSIOS WA -0xBDF8 0xC3F5 #HANGUL SYLLABLE SSANGSIOS WA KIYEOK -0xBDF9 0xC3F8 #HANGUL SYLLABLE SSANGSIOS WA NIEUN -0xBDFA 0xC408 #HANGUL SYLLABLE SSANGSIOS WA SSANGSIOS -0xBDFB 0xC410 #HANGUL SYLLABLE SSANGSIOS WAE -0xBDFC 0xC424 #HANGUL SYLLABLE SSANGSIOS WAE SSANGSIOS -0xBDFD 0xC42C #HANGUL SYLLABLE SSANGSIOS OE -0xBDFE 0xC430 #HANGUL SYLLABLE SSANGSIOS OE NIEUN -0xBE41 0xD438 #HANGUL SYLLABLE PHIEUPH WAE SSANGSIOS -0xBE42 0xD439 #HANGUL SYLLABLE PHIEUPH WAE IEUNG -0xBE43 0xD43A #HANGUL SYLLABLE PHIEUPH WAE CIEUC -0xBE44 0xD43B #HANGUL SYLLABLE PHIEUPH WAE CHIEUCH -0xBE45 0xD43C #HANGUL SYLLABLE PHIEUPH WAE KHIEUKH -0xBE46 0xD43D #HANGUL SYLLABLE PHIEUPH WAE THIEUTH -0xBE47 0xD43E #HANGUL SYLLABLE PHIEUPH WAE PHIEUPH -0xBE48 0xD43F #HANGUL SYLLABLE PHIEUPH WAE HIEUH -0xBE49 0xD441 #HANGUL SYLLABLE PHIEUPH OE KIYEOK -0xBE4A 0xD442 #HANGUL SYLLABLE PHIEUPH OE SSANGKIYEOK -0xBE4B 0xD443 #HANGUL SYLLABLE PHIEUPH OE KIYEOKSIOS -0xBE4C 0xD445 #HANGUL SYLLABLE PHIEUPH OE NIEUNCIEUC -0xBE4D 0xD446 #HANGUL SYLLABLE PHIEUPH OE NIEUNHIEUH -0xBE4E 0xD447 #HANGUL SYLLABLE PHIEUPH OE TIKEUT -0xBE4F 0xD448 #HANGUL SYLLABLE PHIEUPH OE RIEUL -0xBE50 0xD449 #HANGUL SYLLABLE PHIEUPH OE RIEULKIYEOK -0xBE51 0xD44A #HANGUL SYLLABLE PHIEUPH OE RIEULMIEUM -0xBE52 0xD44B #HANGUL SYLLABLE PHIEUPH OE RIEULPIEUP -0xBE53 0xD44C #HANGUL SYLLABLE PHIEUPH OE RIEULSIOS -0xBE54 0xD44D #HANGUL SYLLABLE PHIEUPH OE RIEULTHIEUTH -0xBE55 0xD44E #HANGUL SYLLABLE PHIEUPH OE RIEULPHIEUPH -0xBE56 0xD44F #HANGUL SYLLABLE PHIEUPH OE RIEULHIEUH -0xBE57 0xD450 #HANGUL SYLLABLE PHIEUPH OE MIEUM -0xBE58 0xD451 #HANGUL SYLLABLE PHIEUPH OE PIEUP -0xBE59 0xD452 #HANGUL SYLLABLE PHIEUPH OE PIEUPSIOS -0xBE5A 0xD453 #HANGUL SYLLABLE PHIEUPH OE SIOS -0xBE61 0xD454 #HANGUL SYLLABLE PHIEUPH OE SSANGSIOS -0xBE62 0xD455 #HANGUL SYLLABLE PHIEUPH OE IEUNG -0xBE63 0xD456 #HANGUL SYLLABLE PHIEUPH OE CIEUC -0xBE64 0xD457 #HANGUL SYLLABLE PHIEUPH OE CHIEUCH -0xBE65 0xD458 #HANGUL SYLLABLE PHIEUPH OE KHIEUKH -0xBE66 0xD459 #HANGUL SYLLABLE PHIEUPH OE THIEUTH -0xBE67 0xD45A #HANGUL SYLLABLE PHIEUPH OE PHIEUPH -0xBE68 0xD45B #HANGUL SYLLABLE PHIEUPH OE HIEUH -0xBE69 0xD45D #HANGUL SYLLABLE PHIEUPH YO KIYEOK -0xBE6A 0xD45E #HANGUL SYLLABLE PHIEUPH YO SSANGKIYEOK -0xBE6B 0xD45F #HANGUL SYLLABLE PHIEUPH YO KIYEOKSIOS -0xBE6C 0xD461 #HANGUL SYLLABLE PHIEUPH YO NIEUNCIEUC -0xBE6D 0xD462 #HANGUL SYLLABLE PHIEUPH YO NIEUNHIEUH -0xBE6E 0xD463 #HANGUL SYLLABLE PHIEUPH YO TIKEUT -0xBE6F 0xD465 #HANGUL SYLLABLE PHIEUPH YO RIEULKIYEOK -0xBE70 0xD466 #HANGUL SYLLABLE PHIEUPH YO RIEULMIEUM -0xBE71 0xD467 #HANGUL SYLLABLE PHIEUPH YO RIEULPIEUP -0xBE72 0xD468 #HANGUL SYLLABLE PHIEUPH YO RIEULSIOS -0xBE73 0xD469 #HANGUL SYLLABLE PHIEUPH YO RIEULTHIEUTH -0xBE74 0xD46A #HANGUL SYLLABLE PHIEUPH YO RIEULPHIEUPH -0xBE75 0xD46B #HANGUL SYLLABLE PHIEUPH YO RIEULHIEUH -0xBE76 0xD46C #HANGUL SYLLABLE PHIEUPH YO MIEUM -0xBE77 0xD46E #HANGUL SYLLABLE PHIEUPH YO PIEUPSIOS -0xBE78 0xD470 #HANGUL SYLLABLE PHIEUPH YO SSANGSIOS -0xBE79 0xD471 #HANGUL SYLLABLE PHIEUPH YO IEUNG -0xBE7A 0xD472 #HANGUL SYLLABLE PHIEUPH YO CIEUC -0xBE81 0xD473 #HANGUL SYLLABLE PHIEUPH YO CHIEUCH -0xBE82 0xD474 #HANGUL SYLLABLE PHIEUPH YO KHIEUKH -0xBE83 0xD475 #HANGUL SYLLABLE PHIEUPH YO THIEUTH -0xBE84 0xD476 #HANGUL SYLLABLE PHIEUPH YO PHIEUPH -0xBE85 0xD477 #HANGUL SYLLABLE PHIEUPH YO HIEUH -0xBE86 0xD47A #HANGUL SYLLABLE PHIEUPH U SSANGKIYEOK -0xBE87 0xD47B #HANGUL SYLLABLE PHIEUPH U KIYEOKSIOS -0xBE88 0xD47D #HANGUL SYLLABLE PHIEUPH U NIEUNCIEUC -0xBE89 0xD47E #HANGUL SYLLABLE PHIEUPH U NIEUNHIEUH -0xBE8A 0xD481 #HANGUL SYLLABLE PHIEUPH U RIEULKIYEOK -0xBE8B 0xD483 #HANGUL SYLLABLE PHIEUPH U RIEULPIEUP -0xBE8C 0xD484 #HANGUL SYLLABLE PHIEUPH U RIEULSIOS -0xBE8D 0xD485 #HANGUL SYLLABLE PHIEUPH U RIEULTHIEUTH -0xBE8E 0xD486 #HANGUL SYLLABLE PHIEUPH U RIEULPHIEUPH -0xBE8F 0xD487 #HANGUL SYLLABLE PHIEUPH U RIEULHIEUH -0xBE90 0xD48A #HANGUL SYLLABLE PHIEUPH U PIEUPSIOS -0xBE91 0xD48C #HANGUL SYLLABLE PHIEUPH U SSANGSIOS -0xBE92 0xD48E #HANGUL SYLLABLE PHIEUPH U CIEUC -0xBE93 0xD48F #HANGUL SYLLABLE PHIEUPH U CHIEUCH -0xBE94 0xD490 #HANGUL SYLLABLE PHIEUPH U KHIEUKH -0xBE95 0xD491 #HANGUL SYLLABLE PHIEUPH U THIEUTH -0xBE96 0xD492 #HANGUL SYLLABLE PHIEUPH U PHIEUPH -0xBE97 0xD493 #HANGUL SYLLABLE PHIEUPH U HIEUH -0xBE98 0xD495 #HANGUL SYLLABLE PHIEUPH WEO KIYEOK -0xBE99 0xD496 #HANGUL SYLLABLE PHIEUPH WEO SSANGKIYEOK -0xBE9A 0xD497 #HANGUL SYLLABLE PHIEUPH WEO KIYEOKSIOS -0xBE9B 0xD498 #HANGUL SYLLABLE PHIEUPH WEO NIEUN -0xBE9C 0xD499 #HANGUL SYLLABLE PHIEUPH WEO NIEUNCIEUC -0xBE9D 0xD49A #HANGUL SYLLABLE PHIEUPH WEO NIEUNHIEUH -0xBE9E 0xD49B #HANGUL SYLLABLE PHIEUPH WEO TIKEUT -0xBE9F 0xD49C #HANGUL SYLLABLE PHIEUPH WEO RIEUL -0xBEA0 0xD49D #HANGUL SYLLABLE PHIEUPH WEO RIEULKIYEOK -0xBEA1 0xC434 #HANGUL SYLLABLE SSANGSIOS OE RIEUL -0xBEA2 0xC43C #HANGUL SYLLABLE SSANGSIOS OE MIEUM -0xBEA3 0xC43D #HANGUL SYLLABLE SSANGSIOS OE PIEUP -0xBEA4 0xC448 #HANGUL SYLLABLE SSANGSIOS YO -0xBEA5 0xC464 #HANGUL SYLLABLE SSANGSIOS U -0xBEA6 0xC465 #HANGUL SYLLABLE SSANGSIOS U KIYEOK -0xBEA7 0xC468 #HANGUL SYLLABLE SSANGSIOS U NIEUN -0xBEA8 0xC46C #HANGUL SYLLABLE SSANGSIOS U RIEUL -0xBEA9 0xC474 #HANGUL SYLLABLE SSANGSIOS U MIEUM -0xBEAA 0xC475 #HANGUL SYLLABLE SSANGSIOS U PIEUP -0xBEAB 0xC479 #HANGUL SYLLABLE SSANGSIOS U IEUNG -0xBEAC 0xC480 #HANGUL SYLLABLE SSANGSIOS WEO -0xBEAD 0xC494 #HANGUL SYLLABLE SSANGSIOS WEO SSANGSIOS -0xBEAE 0xC49C #HANGUL SYLLABLE SSANGSIOS WE -0xBEAF 0xC4B8 #HANGUL SYLLABLE SSANGSIOS WI -0xBEB0 0xC4BC #HANGUL SYLLABLE SSANGSIOS WI NIEUN -0xBEB1 0xC4E9 #HANGUL SYLLABLE SSANGSIOS YU IEUNG -0xBEB2 0xC4F0 #HANGUL SYLLABLE SSANGSIOS EU -0xBEB3 0xC4F1 #HANGUL SYLLABLE SSANGSIOS EU KIYEOK -0xBEB4 0xC4F4 #HANGUL SYLLABLE SSANGSIOS EU NIEUN -0xBEB5 0xC4F8 #HANGUL SYLLABLE SSANGSIOS EU RIEUL -0xBEB6 0xC4FA #HANGUL SYLLABLE SSANGSIOS EU RIEULMIEUM -0xBEB7 0xC4FF #HANGUL SYLLABLE SSANGSIOS EU RIEULHIEUH -0xBEB8 0xC500 #HANGUL SYLLABLE SSANGSIOS EU MIEUM -0xBEB9 0xC501 #HANGUL SYLLABLE SSANGSIOS EU PIEUP -0xBEBA 0xC50C #HANGUL SYLLABLE SSANGSIOS YI -0xBEBB 0xC510 #HANGUL SYLLABLE SSANGSIOS YI NIEUN -0xBEBC 0xC514 #HANGUL SYLLABLE SSANGSIOS YI RIEUL -0xBEBD 0xC51C #HANGUL SYLLABLE SSANGSIOS YI MIEUM -0xBEBE 0xC528 #HANGUL SYLLABLE SSANGSIOS I -0xBEBF 0xC529 #HANGUL SYLLABLE SSANGSIOS I KIYEOK -0xBEC0 0xC52C #HANGUL SYLLABLE SSANGSIOS I NIEUN -0xBEC1 0xC530 #HANGUL SYLLABLE SSANGSIOS I RIEUL -0xBEC2 0xC538 #HANGUL SYLLABLE SSANGSIOS I MIEUM -0xBEC3 0xC539 #HANGUL SYLLABLE SSANGSIOS I PIEUP -0xBEC4 0xC53B #HANGUL SYLLABLE SSANGSIOS I SIOS -0xBEC5 0xC53D #HANGUL SYLLABLE SSANGSIOS I IEUNG -0xBEC6 0xC544 #HANGUL SYLLABLE IEUNG A -0xBEC7 0xC545 #HANGUL SYLLABLE IEUNG A KIYEOK -0xBEC8 0xC548 #HANGUL SYLLABLE IEUNG A NIEUN -0xBEC9 0xC549 #HANGUL SYLLABLE IEUNG A NIEUNCIEUC -0xBECA 0xC54A #HANGUL SYLLABLE IEUNG A NIEUNHIEUH -0xBECB 0xC54C #HANGUL SYLLABLE IEUNG A RIEUL -0xBECC 0xC54D #HANGUL SYLLABLE IEUNG A RIEULKIYEOK -0xBECD 0xC54E #HANGUL SYLLABLE IEUNG A RIEULMIEUM -0xBECE 0xC553 #HANGUL SYLLABLE IEUNG A RIEULHIEUH -0xBECF 0xC554 #HANGUL SYLLABLE IEUNG A MIEUM -0xBED0 0xC555 #HANGUL SYLLABLE IEUNG A PIEUP -0xBED1 0xC557 #HANGUL SYLLABLE IEUNG A SIOS -0xBED2 0xC558 #HANGUL SYLLABLE IEUNG A SSANGSIOS -0xBED3 0xC559 #HANGUL SYLLABLE IEUNG A IEUNG -0xBED4 0xC55D #HANGUL SYLLABLE IEUNG A THIEUTH -0xBED5 0xC55E #HANGUL SYLLABLE IEUNG A PHIEUPH -0xBED6 0xC560 #HANGUL SYLLABLE IEUNG AE -0xBED7 0xC561 #HANGUL SYLLABLE IEUNG AE KIYEOK -0xBED8 0xC564 #HANGUL SYLLABLE IEUNG AE NIEUN -0xBED9 0xC568 #HANGUL SYLLABLE IEUNG AE RIEUL -0xBEDA 0xC570 #HANGUL SYLLABLE IEUNG AE MIEUM -0xBEDB 0xC571 #HANGUL SYLLABLE IEUNG AE PIEUP -0xBEDC 0xC573 #HANGUL SYLLABLE IEUNG AE SIOS -0xBEDD 0xC574 #HANGUL SYLLABLE IEUNG AE SSANGSIOS -0xBEDE 0xC575 #HANGUL SYLLABLE IEUNG AE IEUNG -0xBEDF 0xC57C #HANGUL SYLLABLE IEUNG YA -0xBEE0 0xC57D #HANGUL SYLLABLE IEUNG YA KIYEOK -0xBEE1 0xC580 #HANGUL SYLLABLE IEUNG YA NIEUN -0xBEE2 0xC584 #HANGUL SYLLABLE IEUNG YA RIEUL -0xBEE3 0xC587 #HANGUL SYLLABLE IEUNG YA RIEULPIEUP -0xBEE4 0xC58C #HANGUL SYLLABLE IEUNG YA MIEUM -0xBEE5 0xC58D #HANGUL SYLLABLE IEUNG YA PIEUP -0xBEE6 0xC58F #HANGUL SYLLABLE IEUNG YA SIOS -0xBEE7 0xC591 #HANGUL SYLLABLE IEUNG YA IEUNG -0xBEE8 0xC595 #HANGUL SYLLABLE IEUNG YA THIEUTH -0xBEE9 0xC597 #HANGUL SYLLABLE IEUNG YA HIEUH -0xBEEA 0xC598 #HANGUL SYLLABLE IEUNG YAE -0xBEEB 0xC59C #HANGUL SYLLABLE IEUNG YAE NIEUN -0xBEEC 0xC5A0 #HANGUL SYLLABLE IEUNG YAE RIEUL -0xBEED 0xC5A9 #HANGUL SYLLABLE IEUNG YAE PIEUP -0xBEEE 0xC5B4 #HANGUL SYLLABLE IEUNG EO -0xBEEF 0xC5B5 #HANGUL SYLLABLE IEUNG EO KIYEOK -0xBEF0 0xC5B8 #HANGUL SYLLABLE IEUNG EO NIEUN -0xBEF1 0xC5B9 #HANGUL SYLLABLE IEUNG EO NIEUNCIEUC -0xBEF2 0xC5BB #HANGUL SYLLABLE IEUNG EO TIKEUT -0xBEF3 0xC5BC #HANGUL SYLLABLE IEUNG EO RIEUL -0xBEF4 0xC5BD #HANGUL SYLLABLE IEUNG EO RIEULKIYEOK -0xBEF5 0xC5BE #HANGUL SYLLABLE IEUNG EO RIEULMIEUM -0xBEF6 0xC5C4 #HANGUL SYLLABLE IEUNG EO MIEUM -0xBEF7 0xC5C5 #HANGUL SYLLABLE IEUNG EO PIEUP -0xBEF8 0xC5C6 #HANGUL SYLLABLE IEUNG EO PIEUPSIOS -0xBEF9 0xC5C7 #HANGUL SYLLABLE IEUNG EO SIOS -0xBEFA 0xC5C8 #HANGUL SYLLABLE IEUNG EO SSANGSIOS -0xBEFB 0xC5C9 #HANGUL SYLLABLE IEUNG EO IEUNG -0xBEFC 0xC5CA #HANGUL SYLLABLE IEUNG EO CIEUC -0xBEFD 0xC5CC #HANGUL SYLLABLE IEUNG EO KHIEUKH -0xBEFE 0xC5CE #HANGUL SYLLABLE IEUNG EO PHIEUPH -0xBF41 0xD49E #HANGUL SYLLABLE PHIEUPH WEO RIEULMIEUM -0xBF42 0xD49F #HANGUL SYLLABLE PHIEUPH WEO RIEULPIEUP -0xBF43 0xD4A0 #HANGUL SYLLABLE PHIEUPH WEO RIEULSIOS -0xBF44 0xD4A1 #HANGUL SYLLABLE PHIEUPH WEO RIEULTHIEUTH -0xBF45 0xD4A2 #HANGUL SYLLABLE PHIEUPH WEO RIEULPHIEUPH -0xBF46 0xD4A3 #HANGUL SYLLABLE PHIEUPH WEO RIEULHIEUH -0xBF47 0xD4A4 #HANGUL SYLLABLE PHIEUPH WEO MIEUM -0xBF48 0xD4A5 #HANGUL SYLLABLE PHIEUPH WEO PIEUP -0xBF49 0xD4A6 #HANGUL SYLLABLE PHIEUPH WEO PIEUPSIOS -0xBF4A 0xD4A7 #HANGUL SYLLABLE PHIEUPH WEO SIOS -0xBF4B 0xD4A8 #HANGUL SYLLABLE PHIEUPH WEO SSANGSIOS -0xBF4C 0xD4AA #HANGUL SYLLABLE PHIEUPH WEO CIEUC -0xBF4D 0xD4AB #HANGUL SYLLABLE PHIEUPH WEO CHIEUCH -0xBF4E 0xD4AC #HANGUL SYLLABLE PHIEUPH WEO KHIEUKH -0xBF4F 0xD4AD #HANGUL SYLLABLE PHIEUPH WEO THIEUTH -0xBF50 0xD4AE #HANGUL SYLLABLE PHIEUPH WEO PHIEUPH -0xBF51 0xD4AF #HANGUL SYLLABLE PHIEUPH WEO HIEUH -0xBF52 0xD4B0 #HANGUL SYLLABLE PHIEUPH WE -0xBF53 0xD4B1 #HANGUL SYLLABLE PHIEUPH WE KIYEOK -0xBF54 0xD4B2 #HANGUL SYLLABLE PHIEUPH WE SSANGKIYEOK -0xBF55 0xD4B3 #HANGUL SYLLABLE PHIEUPH WE KIYEOKSIOS -0xBF56 0xD4B4 #HANGUL SYLLABLE PHIEUPH WE NIEUN -0xBF57 0xD4B5 #HANGUL SYLLABLE PHIEUPH WE NIEUNCIEUC -0xBF58 0xD4B6 #HANGUL SYLLABLE PHIEUPH WE NIEUNHIEUH -0xBF59 0xD4B7 #HANGUL SYLLABLE PHIEUPH WE TIKEUT -0xBF5A 0xD4B8 #HANGUL SYLLABLE PHIEUPH WE RIEUL -0xBF61 0xD4B9 #HANGUL SYLLABLE PHIEUPH WE RIEULKIYEOK -0xBF62 0xD4BA #HANGUL SYLLABLE PHIEUPH WE RIEULMIEUM -0xBF63 0xD4BB #HANGUL SYLLABLE PHIEUPH WE RIEULPIEUP -0xBF64 0xD4BC #HANGUL SYLLABLE PHIEUPH WE RIEULSIOS -0xBF65 0xD4BD #HANGUL SYLLABLE PHIEUPH WE RIEULTHIEUTH -0xBF66 0xD4BE #HANGUL SYLLABLE PHIEUPH WE RIEULPHIEUPH -0xBF67 0xD4BF #HANGUL SYLLABLE PHIEUPH WE RIEULHIEUH -0xBF68 0xD4C0 #HANGUL SYLLABLE PHIEUPH WE MIEUM -0xBF69 0xD4C1 #HANGUL SYLLABLE PHIEUPH WE PIEUP -0xBF6A 0xD4C2 #HANGUL SYLLABLE PHIEUPH WE PIEUPSIOS -0xBF6B 0xD4C3 #HANGUL SYLLABLE PHIEUPH WE SIOS -0xBF6C 0xD4C4 #HANGUL SYLLABLE PHIEUPH WE SSANGSIOS -0xBF6D 0xD4C5 #HANGUL SYLLABLE PHIEUPH WE IEUNG -0xBF6E 0xD4C6 #HANGUL SYLLABLE PHIEUPH WE CIEUC -0xBF6F 0xD4C7 #HANGUL SYLLABLE PHIEUPH WE CHIEUCH -0xBF70 0xD4C8 #HANGUL SYLLABLE PHIEUPH WE KHIEUKH -0xBF71 0xD4C9 #HANGUL SYLLABLE PHIEUPH WE THIEUTH -0xBF72 0xD4CA #HANGUL SYLLABLE PHIEUPH WE PHIEUPH -0xBF73 0xD4CB #HANGUL SYLLABLE PHIEUPH WE HIEUH -0xBF74 0xD4CD #HANGUL SYLLABLE PHIEUPH WI KIYEOK -0xBF75 0xD4CE #HANGUL SYLLABLE PHIEUPH WI SSANGKIYEOK -0xBF76 0xD4CF #HANGUL SYLLABLE PHIEUPH WI KIYEOKSIOS -0xBF77 0xD4D1 #HANGUL SYLLABLE PHIEUPH WI NIEUNCIEUC -0xBF78 0xD4D2 #HANGUL SYLLABLE PHIEUPH WI NIEUNHIEUH -0xBF79 0xD4D3 #HANGUL SYLLABLE PHIEUPH WI TIKEUT -0xBF7A 0xD4D5 #HANGUL SYLLABLE PHIEUPH WI RIEULKIYEOK -0xBF81 0xD4D6 #HANGUL SYLLABLE PHIEUPH WI RIEULMIEUM -0xBF82 0xD4D7 #HANGUL SYLLABLE PHIEUPH WI RIEULPIEUP -0xBF83 0xD4D8 #HANGUL SYLLABLE PHIEUPH WI RIEULSIOS -0xBF84 0xD4D9 #HANGUL SYLLABLE PHIEUPH WI RIEULTHIEUTH -0xBF85 0xD4DA #HANGUL SYLLABLE PHIEUPH WI RIEULPHIEUPH -0xBF86 0xD4DB #HANGUL SYLLABLE PHIEUPH WI RIEULHIEUH -0xBF87 0xD4DD #HANGUL SYLLABLE PHIEUPH WI PIEUP -0xBF88 0xD4DE #HANGUL SYLLABLE PHIEUPH WI PIEUPSIOS -0xBF89 0xD4E0 #HANGUL SYLLABLE PHIEUPH WI SSANGSIOS -0xBF8A 0xD4E1 #HANGUL SYLLABLE PHIEUPH WI IEUNG -0xBF8B 0xD4E2 #HANGUL SYLLABLE PHIEUPH WI CIEUC -0xBF8C 0xD4E3 #HANGUL SYLLABLE PHIEUPH WI CHIEUCH -0xBF8D 0xD4E4 #HANGUL SYLLABLE PHIEUPH WI KHIEUKH -0xBF8E 0xD4E5 #HANGUL SYLLABLE PHIEUPH WI THIEUTH -0xBF8F 0xD4E6 #HANGUL SYLLABLE PHIEUPH WI PHIEUPH -0xBF90 0xD4E7 #HANGUL SYLLABLE PHIEUPH WI HIEUH -0xBF91 0xD4E9 #HANGUL SYLLABLE PHIEUPH YU KIYEOK -0xBF92 0xD4EA #HANGUL SYLLABLE PHIEUPH YU SSANGKIYEOK -0xBF93 0xD4EB #HANGUL SYLLABLE PHIEUPH YU KIYEOKSIOS -0xBF94 0xD4ED #HANGUL SYLLABLE PHIEUPH YU NIEUNCIEUC -0xBF95 0xD4EE #HANGUL SYLLABLE PHIEUPH YU NIEUNHIEUH -0xBF96 0xD4EF #HANGUL SYLLABLE PHIEUPH YU TIKEUT -0xBF97 0xD4F1 #HANGUL SYLLABLE PHIEUPH YU RIEULKIYEOK -0xBF98 0xD4F2 #HANGUL SYLLABLE PHIEUPH YU RIEULMIEUM -0xBF99 0xD4F3 #HANGUL SYLLABLE PHIEUPH YU RIEULPIEUP -0xBF9A 0xD4F4 #HANGUL SYLLABLE PHIEUPH YU RIEULSIOS -0xBF9B 0xD4F5 #HANGUL SYLLABLE PHIEUPH YU RIEULTHIEUTH -0xBF9C 0xD4F6 #HANGUL SYLLABLE PHIEUPH YU RIEULPHIEUPH -0xBF9D 0xD4F7 #HANGUL SYLLABLE PHIEUPH YU RIEULHIEUH -0xBF9E 0xD4F9 #HANGUL SYLLABLE PHIEUPH YU PIEUP -0xBF9F 0xD4FA #HANGUL SYLLABLE PHIEUPH YU PIEUPSIOS -0xBFA0 0xD4FC #HANGUL SYLLABLE PHIEUPH YU SSANGSIOS -0xBFA1 0xC5D0 #HANGUL SYLLABLE IEUNG E -0xBFA2 0xC5D1 #HANGUL SYLLABLE IEUNG E KIYEOK -0xBFA3 0xC5D4 #HANGUL SYLLABLE IEUNG E NIEUN -0xBFA4 0xC5D8 #HANGUL SYLLABLE IEUNG E RIEUL -0xBFA5 0xC5E0 #HANGUL SYLLABLE IEUNG E MIEUM -0xBFA6 0xC5E1 #HANGUL SYLLABLE IEUNG E PIEUP -0xBFA7 0xC5E3 #HANGUL SYLLABLE IEUNG E SIOS -0xBFA8 0xC5E5 #HANGUL SYLLABLE IEUNG E IEUNG -0xBFA9 0xC5EC #HANGUL SYLLABLE IEUNG YEO -0xBFAA 0xC5ED #HANGUL SYLLABLE IEUNG YEO KIYEOK -0xBFAB 0xC5EE #HANGUL SYLLABLE IEUNG YEO SSANGKIYEOK -0xBFAC 0xC5F0 #HANGUL SYLLABLE IEUNG YEO NIEUN -0xBFAD 0xC5F4 #HANGUL SYLLABLE IEUNG YEO RIEUL -0xBFAE 0xC5F6 #HANGUL SYLLABLE IEUNG YEO RIEULMIEUM -0xBFAF 0xC5F7 #HANGUL SYLLABLE IEUNG YEO RIEULPIEUP -0xBFB0 0xC5FC #HANGUL SYLLABLE IEUNG YEO MIEUM -0xBFB1 0xC5FD #HANGUL SYLLABLE IEUNG YEO PIEUP -0xBFB2 0xC5FE #HANGUL SYLLABLE IEUNG YEO PIEUPSIOS -0xBFB3 0xC5FF #HANGUL SYLLABLE IEUNG YEO SIOS -0xBFB4 0xC600 #HANGUL SYLLABLE IEUNG YEO SSANGSIOS -0xBFB5 0xC601 #HANGUL SYLLABLE IEUNG YEO IEUNG -0xBFB6 0xC605 #HANGUL SYLLABLE IEUNG YEO THIEUTH -0xBFB7 0xC606 #HANGUL SYLLABLE IEUNG YEO PHIEUPH -0xBFB8 0xC607 #HANGUL SYLLABLE IEUNG YEO HIEUH -0xBFB9 0xC608 #HANGUL SYLLABLE IEUNG YE -0xBFBA 0xC60C #HANGUL SYLLABLE IEUNG YE NIEUN -0xBFBB 0xC610 #HANGUL SYLLABLE IEUNG YE RIEUL -0xBFBC 0xC618 #HANGUL SYLLABLE IEUNG YE MIEUM -0xBFBD 0xC619 #HANGUL SYLLABLE IEUNG YE PIEUP -0xBFBE 0xC61B #HANGUL SYLLABLE IEUNG YE SIOS -0xBFBF 0xC61C #HANGUL SYLLABLE IEUNG YE SSANGSIOS -0xBFC0 0xC624 #HANGUL SYLLABLE IEUNG O -0xBFC1 0xC625 #HANGUL SYLLABLE IEUNG O KIYEOK -0xBFC2 0xC628 #HANGUL SYLLABLE IEUNG O NIEUN -0xBFC3 0xC62C #HANGUL SYLLABLE IEUNG O RIEUL -0xBFC4 0xC62D #HANGUL SYLLABLE IEUNG O RIEULKIYEOK -0xBFC5 0xC62E #HANGUL SYLLABLE IEUNG O RIEULMIEUM -0xBFC6 0xC630 #HANGUL SYLLABLE IEUNG O RIEULSIOS -0xBFC7 0xC633 #HANGUL SYLLABLE IEUNG O RIEULHIEUH -0xBFC8 0xC634 #HANGUL SYLLABLE IEUNG O MIEUM -0xBFC9 0xC635 #HANGUL SYLLABLE IEUNG O PIEUP -0xBFCA 0xC637 #HANGUL SYLLABLE IEUNG O SIOS -0xBFCB 0xC639 #HANGUL SYLLABLE IEUNG O IEUNG -0xBFCC 0xC63B #HANGUL SYLLABLE IEUNG O CHIEUCH -0xBFCD 0xC640 #HANGUL SYLLABLE IEUNG WA -0xBFCE 0xC641 #HANGUL SYLLABLE IEUNG WA KIYEOK -0xBFCF 0xC644 #HANGUL SYLLABLE IEUNG WA NIEUN -0xBFD0 0xC648 #HANGUL SYLLABLE IEUNG WA RIEUL -0xBFD1 0xC650 #HANGUL SYLLABLE IEUNG WA MIEUM -0xBFD2 0xC651 #HANGUL SYLLABLE IEUNG WA PIEUP -0xBFD3 0xC653 #HANGUL SYLLABLE IEUNG WA SIOS -0xBFD4 0xC654 #HANGUL SYLLABLE IEUNG WA SSANGSIOS -0xBFD5 0xC655 #HANGUL SYLLABLE IEUNG WA IEUNG -0xBFD6 0xC65C #HANGUL SYLLABLE IEUNG WAE -0xBFD7 0xC65D #HANGUL SYLLABLE IEUNG WAE KIYEOK -0xBFD8 0xC660 #HANGUL SYLLABLE IEUNG WAE NIEUN -0xBFD9 0xC66C #HANGUL SYLLABLE IEUNG WAE MIEUM -0xBFDA 0xC66F #HANGUL SYLLABLE IEUNG WAE SIOS -0xBFDB 0xC671 #HANGUL SYLLABLE IEUNG WAE IEUNG -0xBFDC 0xC678 #HANGUL SYLLABLE IEUNG OE -0xBFDD 0xC679 #HANGUL SYLLABLE IEUNG OE KIYEOK -0xBFDE 0xC67C #HANGUL SYLLABLE IEUNG OE NIEUN -0xBFDF 0xC680 #HANGUL SYLLABLE IEUNG OE RIEUL -0xBFE0 0xC688 #HANGUL SYLLABLE IEUNG OE MIEUM -0xBFE1 0xC689 #HANGUL SYLLABLE IEUNG OE PIEUP -0xBFE2 0xC68B #HANGUL SYLLABLE IEUNG OE SIOS -0xBFE3 0xC68D #HANGUL SYLLABLE IEUNG OE IEUNG -0xBFE4 0xC694 #HANGUL SYLLABLE IEUNG YO -0xBFE5 0xC695 #HANGUL SYLLABLE IEUNG YO KIYEOK -0xBFE6 0xC698 #HANGUL SYLLABLE IEUNG YO NIEUN -0xBFE7 0xC69C #HANGUL SYLLABLE IEUNG YO RIEUL -0xBFE8 0xC6A4 #HANGUL SYLLABLE IEUNG YO MIEUM -0xBFE9 0xC6A5 #HANGUL SYLLABLE IEUNG YO PIEUP -0xBFEA 0xC6A7 #HANGUL SYLLABLE IEUNG YO SIOS -0xBFEB 0xC6A9 #HANGUL SYLLABLE IEUNG YO IEUNG -0xBFEC 0xC6B0 #HANGUL SYLLABLE IEUNG U -0xBFED 0xC6B1 #HANGUL SYLLABLE IEUNG U KIYEOK -0xBFEE 0xC6B4 #HANGUL SYLLABLE IEUNG U NIEUN -0xBFEF 0xC6B8 #HANGUL SYLLABLE IEUNG U RIEUL -0xBFF0 0xC6B9 #HANGUL SYLLABLE IEUNG U RIEULKIYEOK -0xBFF1 0xC6BA #HANGUL SYLLABLE IEUNG U RIEULMIEUM -0xBFF2 0xC6C0 #HANGUL SYLLABLE IEUNG U MIEUM -0xBFF3 0xC6C1 #HANGUL SYLLABLE IEUNG U PIEUP -0xBFF4 0xC6C3 #HANGUL SYLLABLE IEUNG U SIOS -0xBFF5 0xC6C5 #HANGUL SYLLABLE IEUNG U IEUNG -0xBFF6 0xC6CC #HANGUL SYLLABLE IEUNG WEO -0xBFF7 0xC6CD #HANGUL SYLLABLE IEUNG WEO KIYEOK -0xBFF8 0xC6D0 #HANGUL SYLLABLE IEUNG WEO NIEUN -0xBFF9 0xC6D4 #HANGUL SYLLABLE IEUNG WEO RIEUL -0xBFFA 0xC6DC #HANGUL SYLLABLE IEUNG WEO MIEUM -0xBFFB 0xC6DD #HANGUL SYLLABLE IEUNG WEO PIEUP -0xBFFC 0xC6E0 #HANGUL SYLLABLE IEUNG WEO SSANGSIOS -0xBFFD 0xC6E1 #HANGUL SYLLABLE IEUNG WEO IEUNG -0xBFFE 0xC6E8 #HANGUL SYLLABLE IEUNG WE -0xC041 0xD4FE #HANGUL SYLLABLE PHIEUPH YU CIEUC -0xC042 0xD4FF #HANGUL SYLLABLE PHIEUPH YU CHIEUCH -0xC043 0xD500 #HANGUL SYLLABLE PHIEUPH YU KHIEUKH -0xC044 0xD501 #HANGUL SYLLABLE PHIEUPH YU THIEUTH -0xC045 0xD502 #HANGUL SYLLABLE PHIEUPH YU PHIEUPH -0xC046 0xD503 #HANGUL SYLLABLE PHIEUPH YU HIEUH -0xC047 0xD505 #HANGUL SYLLABLE PHIEUPH EU KIYEOK -0xC048 0xD506 #HANGUL SYLLABLE PHIEUPH EU SSANGKIYEOK -0xC049 0xD507 #HANGUL SYLLABLE PHIEUPH EU KIYEOKSIOS -0xC04A 0xD509 #HANGUL SYLLABLE PHIEUPH EU NIEUNCIEUC -0xC04B 0xD50A #HANGUL SYLLABLE PHIEUPH EU NIEUNHIEUH -0xC04C 0xD50B #HANGUL SYLLABLE PHIEUPH EU TIKEUT -0xC04D 0xD50D #HANGUL SYLLABLE PHIEUPH EU RIEULKIYEOK -0xC04E 0xD50E #HANGUL SYLLABLE PHIEUPH EU RIEULMIEUM -0xC04F 0xD50F #HANGUL SYLLABLE PHIEUPH EU RIEULPIEUP -0xC050 0xD510 #HANGUL SYLLABLE PHIEUPH EU RIEULSIOS -0xC051 0xD511 #HANGUL SYLLABLE PHIEUPH EU RIEULTHIEUTH -0xC052 0xD512 #HANGUL SYLLABLE PHIEUPH EU RIEULPHIEUPH -0xC053 0xD513 #HANGUL SYLLABLE PHIEUPH EU RIEULHIEUH -0xC054 0xD516 #HANGUL SYLLABLE PHIEUPH EU PIEUPSIOS -0xC055 0xD518 #HANGUL SYLLABLE PHIEUPH EU SSANGSIOS -0xC056 0xD519 #HANGUL SYLLABLE PHIEUPH EU IEUNG -0xC057 0xD51A #HANGUL SYLLABLE PHIEUPH EU CIEUC -0xC058 0xD51B #HANGUL SYLLABLE PHIEUPH EU CHIEUCH -0xC059 0xD51C #HANGUL SYLLABLE PHIEUPH EU KHIEUKH -0xC05A 0xD51D #HANGUL SYLLABLE PHIEUPH EU THIEUTH -0xC061 0xD51E #HANGUL SYLLABLE PHIEUPH EU PHIEUPH -0xC062 0xD51F #HANGUL SYLLABLE PHIEUPH EU HIEUH -0xC063 0xD520 #HANGUL SYLLABLE PHIEUPH YI -0xC064 0xD521 #HANGUL SYLLABLE PHIEUPH YI KIYEOK -0xC065 0xD522 #HANGUL SYLLABLE PHIEUPH YI SSANGKIYEOK -0xC066 0xD523 #HANGUL SYLLABLE PHIEUPH YI KIYEOKSIOS -0xC067 0xD524 #HANGUL SYLLABLE PHIEUPH YI NIEUN -0xC068 0xD525 #HANGUL SYLLABLE PHIEUPH YI NIEUNCIEUC -0xC069 0xD526 #HANGUL SYLLABLE PHIEUPH YI NIEUNHIEUH -0xC06A 0xD527 #HANGUL SYLLABLE PHIEUPH YI TIKEUT -0xC06B 0xD528 #HANGUL SYLLABLE PHIEUPH YI RIEUL -0xC06C 0xD529 #HANGUL SYLLABLE PHIEUPH YI RIEULKIYEOK -0xC06D 0xD52A #HANGUL SYLLABLE PHIEUPH YI RIEULMIEUM -0xC06E 0xD52B #HANGUL SYLLABLE PHIEUPH YI RIEULPIEUP -0xC06F 0xD52C #HANGUL SYLLABLE PHIEUPH YI RIEULSIOS -0xC070 0xD52D #HANGUL SYLLABLE PHIEUPH YI RIEULTHIEUTH -0xC071 0xD52E #HANGUL SYLLABLE PHIEUPH YI RIEULPHIEUPH -0xC072 0xD52F #HANGUL SYLLABLE PHIEUPH YI RIEULHIEUH -0xC073 0xD530 #HANGUL SYLLABLE PHIEUPH YI MIEUM -0xC074 0xD531 #HANGUL SYLLABLE PHIEUPH YI PIEUP -0xC075 0xD532 #HANGUL SYLLABLE PHIEUPH YI PIEUPSIOS -0xC076 0xD533 #HANGUL SYLLABLE PHIEUPH YI SIOS -0xC077 0xD534 #HANGUL SYLLABLE PHIEUPH YI SSANGSIOS -0xC078 0xD535 #HANGUL SYLLABLE PHIEUPH YI IEUNG -0xC079 0xD536 #HANGUL SYLLABLE PHIEUPH YI CIEUC -0xC07A 0xD537 #HANGUL SYLLABLE PHIEUPH YI CHIEUCH -0xC081 0xD538 #HANGUL SYLLABLE PHIEUPH YI KHIEUKH -0xC082 0xD539 #HANGUL SYLLABLE PHIEUPH YI THIEUTH -0xC083 0xD53A #HANGUL SYLLABLE PHIEUPH YI PHIEUPH -0xC084 0xD53B #HANGUL SYLLABLE PHIEUPH YI HIEUH -0xC085 0xD53E #HANGUL SYLLABLE PHIEUPH I SSANGKIYEOK -0xC086 0xD53F #HANGUL SYLLABLE PHIEUPH I KIYEOKSIOS -0xC087 0xD541 #HANGUL SYLLABLE PHIEUPH I NIEUNCIEUC -0xC088 0xD542 #HANGUL SYLLABLE PHIEUPH I NIEUNHIEUH -0xC089 0xD543 #HANGUL SYLLABLE PHIEUPH I TIKEUT -0xC08A 0xD545 #HANGUL SYLLABLE PHIEUPH I RIEULKIYEOK -0xC08B 0xD546 #HANGUL SYLLABLE PHIEUPH I RIEULMIEUM -0xC08C 0xD547 #HANGUL SYLLABLE PHIEUPH I RIEULPIEUP -0xC08D 0xD548 #HANGUL SYLLABLE PHIEUPH I RIEULSIOS -0xC08E 0xD549 #HANGUL SYLLABLE PHIEUPH I RIEULTHIEUTH -0xC08F 0xD54A #HANGUL SYLLABLE PHIEUPH I RIEULPHIEUPH -0xC090 0xD54B #HANGUL SYLLABLE PHIEUPH I RIEULHIEUH -0xC091 0xD54E #HANGUL SYLLABLE PHIEUPH I PIEUPSIOS -0xC092 0xD550 #HANGUL SYLLABLE PHIEUPH I SSANGSIOS -0xC093 0xD552 #HANGUL SYLLABLE PHIEUPH I CIEUC -0xC094 0xD553 #HANGUL SYLLABLE PHIEUPH I CHIEUCH -0xC095 0xD554 #HANGUL SYLLABLE PHIEUPH I KHIEUKH -0xC096 0xD555 #HANGUL SYLLABLE PHIEUPH I THIEUTH -0xC097 0xD556 #HANGUL SYLLABLE PHIEUPH I PHIEUPH -0xC098 0xD557 #HANGUL SYLLABLE PHIEUPH I HIEUH -0xC099 0xD55A #HANGUL SYLLABLE HIEUH A SSANGKIYEOK -0xC09A 0xD55B #HANGUL SYLLABLE HIEUH A KIYEOKSIOS -0xC09B 0xD55D #HANGUL SYLLABLE HIEUH A NIEUNCIEUC -0xC09C 0xD55E #HANGUL SYLLABLE HIEUH A NIEUNHIEUH -0xC09D 0xD55F #HANGUL SYLLABLE HIEUH A TIKEUT -0xC09E 0xD561 #HANGUL SYLLABLE HIEUH A RIEULKIYEOK -0xC09F 0xD562 #HANGUL SYLLABLE HIEUH A RIEULMIEUM -0xC0A0 0xD563 #HANGUL SYLLABLE HIEUH A RIEULPIEUP -0xC0A1 0xC6E9 #HANGUL SYLLABLE IEUNG WE KIYEOK -0xC0A2 0xC6EC #HANGUL SYLLABLE IEUNG WE NIEUN -0xC0A3 0xC6F0 #HANGUL SYLLABLE IEUNG WE RIEUL -0xC0A4 0xC6F8 #HANGUL SYLLABLE IEUNG WE MIEUM -0xC0A5 0xC6F9 #HANGUL SYLLABLE IEUNG WE PIEUP -0xC0A6 0xC6FD #HANGUL SYLLABLE IEUNG WE IEUNG -0xC0A7 0xC704 #HANGUL SYLLABLE IEUNG WI -0xC0A8 0xC705 #HANGUL SYLLABLE IEUNG WI KIYEOK -0xC0A9 0xC708 #HANGUL SYLLABLE IEUNG WI NIEUN -0xC0AA 0xC70C #HANGUL SYLLABLE IEUNG WI RIEUL -0xC0AB 0xC714 #HANGUL SYLLABLE IEUNG WI MIEUM -0xC0AC 0xC715 #HANGUL SYLLABLE IEUNG WI PIEUP -0xC0AD 0xC717 #HANGUL SYLLABLE IEUNG WI SIOS -0xC0AE 0xC719 #HANGUL SYLLABLE IEUNG WI IEUNG -0xC0AF 0xC720 #HANGUL SYLLABLE IEUNG YU -0xC0B0 0xC721 #HANGUL SYLLABLE IEUNG YU KIYEOK -0xC0B1 0xC724 #HANGUL SYLLABLE IEUNG YU NIEUN -0xC0B2 0xC728 #HANGUL SYLLABLE IEUNG YU RIEUL -0xC0B3 0xC730 #HANGUL SYLLABLE IEUNG YU MIEUM -0xC0B4 0xC731 #HANGUL SYLLABLE IEUNG YU PIEUP -0xC0B5 0xC733 #HANGUL SYLLABLE IEUNG YU SIOS -0xC0B6 0xC735 #HANGUL SYLLABLE IEUNG YU IEUNG -0xC0B7 0xC737 #HANGUL SYLLABLE IEUNG YU CHIEUCH -0xC0B8 0xC73C #HANGUL SYLLABLE IEUNG EU -0xC0B9 0xC73D #HANGUL SYLLABLE IEUNG EU KIYEOK -0xC0BA 0xC740 #HANGUL SYLLABLE IEUNG EU NIEUN -0xC0BB 0xC744 #HANGUL SYLLABLE IEUNG EU RIEUL -0xC0BC 0xC74A #HANGUL SYLLABLE IEUNG EU RIEULPHIEUPH -0xC0BD 0xC74C #HANGUL SYLLABLE IEUNG EU MIEUM -0xC0BE 0xC74D #HANGUL SYLLABLE IEUNG EU PIEUP -0xC0BF 0xC74F #HANGUL SYLLABLE IEUNG EU SIOS -0xC0C0 0xC751 #HANGUL SYLLABLE IEUNG EU IEUNG -0xC0C1 0xC752 #HANGUL SYLLABLE IEUNG EU CIEUC -0xC0C2 0xC753 #HANGUL SYLLABLE IEUNG EU CHIEUCH -0xC0C3 0xC754 #HANGUL SYLLABLE IEUNG EU KHIEUKH -0xC0C4 0xC755 #HANGUL SYLLABLE IEUNG EU THIEUTH -0xC0C5 0xC756 #HANGUL SYLLABLE IEUNG EU PHIEUPH -0xC0C6 0xC757 #HANGUL SYLLABLE IEUNG EU HIEUH -0xC0C7 0xC758 #HANGUL SYLLABLE IEUNG YI -0xC0C8 0xC75C #HANGUL SYLLABLE IEUNG YI NIEUN -0xC0C9 0xC760 #HANGUL SYLLABLE IEUNG YI RIEUL -0xC0CA 0xC768 #HANGUL SYLLABLE IEUNG YI MIEUM -0xC0CB 0xC76B #HANGUL SYLLABLE IEUNG YI SIOS -0xC0CC 0xC774 #HANGUL SYLLABLE IEUNG I -0xC0CD 0xC775 #HANGUL SYLLABLE IEUNG I KIYEOK -0xC0CE 0xC778 #HANGUL SYLLABLE IEUNG I NIEUN -0xC0CF 0xC77C #HANGUL SYLLABLE IEUNG I RIEUL -0xC0D0 0xC77D #HANGUL SYLLABLE IEUNG I RIEULKIYEOK -0xC0D1 0xC77E #HANGUL SYLLABLE IEUNG I RIEULMIEUM -0xC0D2 0xC783 #HANGUL SYLLABLE IEUNG I RIEULHIEUH -0xC0D3 0xC784 #HANGUL SYLLABLE IEUNG I MIEUM -0xC0D4 0xC785 #HANGUL SYLLABLE IEUNG I PIEUP -0xC0D5 0xC787 #HANGUL SYLLABLE IEUNG I SIOS -0xC0D6 0xC788 #HANGUL SYLLABLE IEUNG I SSANGSIOS -0xC0D7 0xC789 #HANGUL SYLLABLE IEUNG I IEUNG -0xC0D8 0xC78A #HANGUL SYLLABLE IEUNG I CIEUC -0xC0D9 0xC78E #HANGUL SYLLABLE IEUNG I PHIEUPH -0xC0DA 0xC790 #HANGUL SYLLABLE CIEUC A -0xC0DB 0xC791 #HANGUL SYLLABLE CIEUC A KIYEOK -0xC0DC 0xC794 #HANGUL SYLLABLE CIEUC A NIEUN -0xC0DD 0xC796 #HANGUL SYLLABLE CIEUC A NIEUNHIEUH -0xC0DE 0xC797 #HANGUL SYLLABLE CIEUC A TIKEUT -0xC0DF 0xC798 #HANGUL SYLLABLE CIEUC A RIEUL -0xC0E0 0xC79A #HANGUL SYLLABLE CIEUC A RIEULMIEUM -0xC0E1 0xC7A0 #HANGUL SYLLABLE CIEUC A MIEUM -0xC0E2 0xC7A1 #HANGUL SYLLABLE CIEUC A PIEUP -0xC0E3 0xC7A3 #HANGUL SYLLABLE CIEUC A SIOS -0xC0E4 0xC7A4 #HANGUL SYLLABLE CIEUC A SSANGSIOS -0xC0E5 0xC7A5 #HANGUL SYLLABLE CIEUC A IEUNG -0xC0E6 0xC7A6 #HANGUL SYLLABLE CIEUC A CIEUC -0xC0E7 0xC7AC #HANGUL SYLLABLE CIEUC AE -0xC0E8 0xC7AD #HANGUL SYLLABLE CIEUC AE KIYEOK -0xC0E9 0xC7B0 #HANGUL SYLLABLE CIEUC AE NIEUN -0xC0EA 0xC7B4 #HANGUL SYLLABLE CIEUC AE RIEUL -0xC0EB 0xC7BC #HANGUL SYLLABLE CIEUC AE MIEUM -0xC0EC 0xC7BD #HANGUL SYLLABLE CIEUC AE PIEUP -0xC0ED 0xC7BF #HANGUL SYLLABLE CIEUC AE SIOS -0xC0EE 0xC7C0 #HANGUL SYLLABLE CIEUC AE SSANGSIOS -0xC0EF 0xC7C1 #HANGUL SYLLABLE CIEUC AE IEUNG -0xC0F0 0xC7C8 #HANGUL SYLLABLE CIEUC YA -0xC0F1 0xC7C9 #HANGUL SYLLABLE CIEUC YA KIYEOK -0xC0F2 0xC7CC #HANGUL SYLLABLE CIEUC YA NIEUN -0xC0F3 0xC7CE #HANGUL SYLLABLE CIEUC YA NIEUNHIEUH -0xC0F4 0xC7D0 #HANGUL SYLLABLE CIEUC YA RIEUL -0xC0F5 0xC7D8 #HANGUL SYLLABLE CIEUC YA MIEUM -0xC0F6 0xC7DD #HANGUL SYLLABLE CIEUC YA IEUNG -0xC0F7 0xC7E4 #HANGUL SYLLABLE CIEUC YAE -0xC0F8 0xC7E8 #HANGUL SYLLABLE CIEUC YAE NIEUN -0xC0F9 0xC7EC #HANGUL SYLLABLE CIEUC YAE RIEUL -0xC0FA 0xC800 #HANGUL SYLLABLE CIEUC EO -0xC0FB 0xC801 #HANGUL SYLLABLE CIEUC EO KIYEOK -0xC0FC 0xC804 #HANGUL SYLLABLE CIEUC EO NIEUN -0xC0FD 0xC808 #HANGUL SYLLABLE CIEUC EO RIEUL -0xC0FE 0xC80A #HANGUL SYLLABLE CIEUC EO RIEULMIEUM -0xC141 0xD564 #HANGUL SYLLABLE HIEUH A RIEULSIOS -0xC142 0xD566 #HANGUL SYLLABLE HIEUH A RIEULPHIEUPH -0xC143 0xD567 #HANGUL SYLLABLE HIEUH A RIEULHIEUH -0xC144 0xD56A #HANGUL SYLLABLE HIEUH A PIEUPSIOS -0xC145 0xD56C #HANGUL SYLLABLE HIEUH A SSANGSIOS -0xC146 0xD56E #HANGUL SYLLABLE HIEUH A CIEUC -0xC147 0xD56F #HANGUL SYLLABLE HIEUH A CHIEUCH -0xC148 0xD570 #HANGUL SYLLABLE HIEUH A KHIEUKH -0xC149 0xD571 #HANGUL SYLLABLE HIEUH A THIEUTH -0xC14A 0xD572 #HANGUL SYLLABLE HIEUH A PHIEUPH -0xC14B 0xD573 #HANGUL SYLLABLE HIEUH A HIEUH -0xC14C 0xD576 #HANGUL SYLLABLE HIEUH AE SSANGKIYEOK -0xC14D 0xD577 #HANGUL SYLLABLE HIEUH AE KIYEOKSIOS -0xC14E 0xD579 #HANGUL SYLLABLE HIEUH AE NIEUNCIEUC -0xC14F 0xD57A #HANGUL SYLLABLE HIEUH AE NIEUNHIEUH -0xC150 0xD57B #HANGUL SYLLABLE HIEUH AE TIKEUT -0xC151 0xD57D #HANGUL SYLLABLE HIEUH AE RIEULKIYEOK -0xC152 0xD57E #HANGUL SYLLABLE HIEUH AE RIEULMIEUM -0xC153 0xD57F #HANGUL SYLLABLE HIEUH AE RIEULPIEUP -0xC154 0xD580 #HANGUL SYLLABLE HIEUH AE RIEULSIOS -0xC155 0xD581 #HANGUL SYLLABLE HIEUH AE RIEULTHIEUTH -0xC156 0xD582 #HANGUL SYLLABLE HIEUH AE RIEULPHIEUPH -0xC157 0xD583 #HANGUL SYLLABLE HIEUH AE RIEULHIEUH -0xC158 0xD586 #HANGUL SYLLABLE HIEUH AE PIEUPSIOS -0xC159 0xD58A #HANGUL SYLLABLE HIEUH AE CIEUC -0xC15A 0xD58B #HANGUL SYLLABLE HIEUH AE CHIEUCH -0xC161 0xD58C #HANGUL SYLLABLE HIEUH AE KHIEUKH -0xC162 0xD58D #HANGUL SYLLABLE HIEUH AE THIEUTH -0xC163 0xD58E #HANGUL SYLLABLE HIEUH AE PHIEUPH -0xC164 0xD58F #HANGUL SYLLABLE HIEUH AE HIEUH -0xC165 0xD591 #HANGUL SYLLABLE HIEUH YA KIYEOK -0xC166 0xD592 #HANGUL SYLLABLE HIEUH YA SSANGKIYEOK -0xC167 0xD593 #HANGUL SYLLABLE HIEUH YA KIYEOKSIOS -0xC168 0xD594 #HANGUL SYLLABLE HIEUH YA NIEUN -0xC169 0xD595 #HANGUL SYLLABLE HIEUH YA NIEUNCIEUC -0xC16A 0xD596 #HANGUL SYLLABLE HIEUH YA NIEUNHIEUH -0xC16B 0xD597 #HANGUL SYLLABLE HIEUH YA TIKEUT -0xC16C 0xD598 #HANGUL SYLLABLE HIEUH YA RIEUL -0xC16D 0xD599 #HANGUL SYLLABLE HIEUH YA RIEULKIYEOK -0xC16E 0xD59A #HANGUL SYLLABLE HIEUH YA RIEULMIEUM -0xC16F 0xD59B #HANGUL SYLLABLE HIEUH YA RIEULPIEUP -0xC170 0xD59C #HANGUL SYLLABLE HIEUH YA RIEULSIOS -0xC171 0xD59D #HANGUL SYLLABLE HIEUH YA RIEULTHIEUTH -0xC172 0xD59E #HANGUL SYLLABLE HIEUH YA RIEULPHIEUPH -0xC173 0xD59F #HANGUL SYLLABLE HIEUH YA RIEULHIEUH -0xC174 0xD5A0 #HANGUL SYLLABLE HIEUH YA MIEUM -0xC175 0xD5A1 #HANGUL SYLLABLE HIEUH YA PIEUP -0xC176 0xD5A2 #HANGUL SYLLABLE HIEUH YA PIEUPSIOS -0xC177 0xD5A3 #HANGUL SYLLABLE HIEUH YA SIOS -0xC178 0xD5A4 #HANGUL SYLLABLE HIEUH YA SSANGSIOS -0xC179 0xD5A6 #HANGUL SYLLABLE HIEUH YA CIEUC -0xC17A 0xD5A7 #HANGUL SYLLABLE HIEUH YA CHIEUCH -0xC181 0xD5A8 #HANGUL SYLLABLE HIEUH YA KHIEUKH -0xC182 0xD5A9 #HANGUL SYLLABLE HIEUH YA THIEUTH -0xC183 0xD5AA #HANGUL SYLLABLE HIEUH YA PHIEUPH -0xC184 0xD5AB #HANGUL SYLLABLE HIEUH YA HIEUH -0xC185 0xD5AC #HANGUL SYLLABLE HIEUH YAE -0xC186 0xD5AD #HANGUL SYLLABLE HIEUH YAE KIYEOK -0xC187 0xD5AE #HANGUL SYLLABLE HIEUH YAE SSANGKIYEOK -0xC188 0xD5AF #HANGUL SYLLABLE HIEUH YAE KIYEOKSIOS -0xC189 0xD5B0 #HANGUL SYLLABLE HIEUH YAE NIEUN -0xC18A 0xD5B1 #HANGUL SYLLABLE HIEUH YAE NIEUNCIEUC -0xC18B 0xD5B2 #HANGUL SYLLABLE HIEUH YAE NIEUNHIEUH -0xC18C 0xD5B3 #HANGUL SYLLABLE HIEUH YAE TIKEUT -0xC18D 0xD5B4 #HANGUL SYLLABLE HIEUH YAE RIEUL -0xC18E 0xD5B5 #HANGUL SYLLABLE HIEUH YAE RIEULKIYEOK -0xC18F 0xD5B6 #HANGUL SYLLABLE HIEUH YAE RIEULMIEUM -0xC190 0xD5B7 #HANGUL SYLLABLE HIEUH YAE RIEULPIEUP -0xC191 0xD5B8 #HANGUL SYLLABLE HIEUH YAE RIEULSIOS -0xC192 0xD5B9 #HANGUL SYLLABLE HIEUH YAE RIEULTHIEUTH -0xC193 0xD5BA #HANGUL SYLLABLE HIEUH YAE RIEULPHIEUPH -0xC194 0xD5BB #HANGUL SYLLABLE HIEUH YAE RIEULHIEUH -0xC195 0xD5BC #HANGUL SYLLABLE HIEUH YAE MIEUM -0xC196 0xD5BD #HANGUL SYLLABLE HIEUH YAE PIEUP -0xC197 0xD5BE #HANGUL SYLLABLE HIEUH YAE PIEUPSIOS -0xC198 0xD5BF #HANGUL SYLLABLE HIEUH YAE SIOS -0xC199 0xD5C0 #HANGUL SYLLABLE HIEUH YAE SSANGSIOS -0xC19A 0xD5C1 #HANGUL SYLLABLE HIEUH YAE IEUNG -0xC19B 0xD5C2 #HANGUL SYLLABLE HIEUH YAE CIEUC -0xC19C 0xD5C3 #HANGUL SYLLABLE HIEUH YAE CHIEUCH -0xC19D 0xD5C4 #HANGUL SYLLABLE HIEUH YAE KHIEUKH -0xC19E 0xD5C5 #HANGUL SYLLABLE HIEUH YAE THIEUTH -0xC19F 0xD5C6 #HANGUL SYLLABLE HIEUH YAE PHIEUPH -0xC1A0 0xD5C7 #HANGUL SYLLABLE HIEUH YAE HIEUH -0xC1A1 0xC810 #HANGUL SYLLABLE CIEUC EO MIEUM -0xC1A2 0xC811 #HANGUL SYLLABLE CIEUC EO PIEUP -0xC1A3 0xC813 #HANGUL SYLLABLE CIEUC EO SIOS -0xC1A4 0xC815 #HANGUL SYLLABLE CIEUC EO IEUNG -0xC1A5 0xC816 #HANGUL SYLLABLE CIEUC EO CIEUC -0xC1A6 0xC81C #HANGUL SYLLABLE CIEUC E -0xC1A7 0xC81D #HANGUL SYLLABLE CIEUC E KIYEOK -0xC1A8 0xC820 #HANGUL SYLLABLE CIEUC E NIEUN -0xC1A9 0xC824 #HANGUL SYLLABLE CIEUC E RIEUL -0xC1AA 0xC82C #HANGUL SYLLABLE CIEUC E MIEUM -0xC1AB 0xC82D #HANGUL SYLLABLE CIEUC E PIEUP -0xC1AC 0xC82F #HANGUL SYLLABLE CIEUC E SIOS -0xC1AD 0xC831 #HANGUL SYLLABLE CIEUC E IEUNG -0xC1AE 0xC838 #HANGUL SYLLABLE CIEUC YEO -0xC1AF 0xC83C #HANGUL SYLLABLE CIEUC YEO NIEUN -0xC1B0 0xC840 #HANGUL SYLLABLE CIEUC YEO RIEUL -0xC1B1 0xC848 #HANGUL SYLLABLE CIEUC YEO MIEUM -0xC1B2 0xC849 #HANGUL SYLLABLE CIEUC YEO PIEUP -0xC1B3 0xC84C #HANGUL SYLLABLE CIEUC YEO SSANGSIOS -0xC1B4 0xC84D #HANGUL SYLLABLE CIEUC YEO IEUNG -0xC1B5 0xC854 #HANGUL SYLLABLE CIEUC YE -0xC1B6 0xC870 #HANGUL SYLLABLE CIEUC O -0xC1B7 0xC871 #HANGUL SYLLABLE CIEUC O KIYEOK -0xC1B8 0xC874 #HANGUL SYLLABLE CIEUC O NIEUN -0xC1B9 0xC878 #HANGUL SYLLABLE CIEUC O RIEUL -0xC1BA 0xC87A #HANGUL SYLLABLE CIEUC O RIEULMIEUM -0xC1BB 0xC880 #HANGUL SYLLABLE CIEUC O MIEUM -0xC1BC 0xC881 #HANGUL SYLLABLE CIEUC O PIEUP -0xC1BD 0xC883 #HANGUL SYLLABLE CIEUC O SIOS -0xC1BE 0xC885 #HANGUL SYLLABLE CIEUC O IEUNG -0xC1BF 0xC886 #HANGUL SYLLABLE CIEUC O CIEUC -0xC1C0 0xC887 #HANGUL SYLLABLE CIEUC O CHIEUCH -0xC1C1 0xC88B #HANGUL SYLLABLE CIEUC O HIEUH -0xC1C2 0xC88C #HANGUL SYLLABLE CIEUC WA -0xC1C3 0xC88D #HANGUL SYLLABLE CIEUC WA KIYEOK -0xC1C4 0xC894 #HANGUL SYLLABLE CIEUC WA RIEUL -0xC1C5 0xC89D #HANGUL SYLLABLE CIEUC WA PIEUP -0xC1C6 0xC89F #HANGUL SYLLABLE CIEUC WA SIOS -0xC1C7 0xC8A1 #HANGUL SYLLABLE CIEUC WA IEUNG -0xC1C8 0xC8A8 #HANGUL SYLLABLE CIEUC WAE -0xC1C9 0xC8BC #HANGUL SYLLABLE CIEUC WAE SSANGSIOS -0xC1CA 0xC8BD #HANGUL SYLLABLE CIEUC WAE IEUNG -0xC1CB 0xC8C4 #HANGUL SYLLABLE CIEUC OE -0xC1CC 0xC8C8 #HANGUL SYLLABLE CIEUC OE NIEUN -0xC1CD 0xC8CC #HANGUL SYLLABLE CIEUC OE RIEUL -0xC1CE 0xC8D4 #HANGUL SYLLABLE CIEUC OE MIEUM -0xC1CF 0xC8D5 #HANGUL SYLLABLE CIEUC OE PIEUP -0xC1D0 0xC8D7 #HANGUL SYLLABLE CIEUC OE SIOS -0xC1D1 0xC8D9 #HANGUL SYLLABLE CIEUC OE IEUNG -0xC1D2 0xC8E0 #HANGUL SYLLABLE CIEUC YO -0xC1D3 0xC8E1 #HANGUL SYLLABLE CIEUC YO KIYEOK -0xC1D4 0xC8E4 #HANGUL SYLLABLE CIEUC YO NIEUN -0xC1D5 0xC8F5 #HANGUL SYLLABLE CIEUC YO IEUNG -0xC1D6 0xC8FC #HANGUL SYLLABLE CIEUC U -0xC1D7 0xC8FD #HANGUL SYLLABLE CIEUC U KIYEOK -0xC1D8 0xC900 #HANGUL SYLLABLE CIEUC U NIEUN -0xC1D9 0xC904 #HANGUL SYLLABLE CIEUC U RIEUL -0xC1DA 0xC905 #HANGUL SYLLABLE CIEUC U RIEULKIYEOK -0xC1DB 0xC906 #HANGUL SYLLABLE CIEUC U RIEULMIEUM -0xC1DC 0xC90C #HANGUL SYLLABLE CIEUC U MIEUM -0xC1DD 0xC90D #HANGUL SYLLABLE CIEUC U PIEUP -0xC1DE 0xC90F #HANGUL SYLLABLE CIEUC U SIOS -0xC1DF 0xC911 #HANGUL SYLLABLE CIEUC U IEUNG -0xC1E0 0xC918 #HANGUL SYLLABLE CIEUC WEO -0xC1E1 0xC92C #HANGUL SYLLABLE CIEUC WEO SSANGSIOS -0xC1E2 0xC934 #HANGUL SYLLABLE CIEUC WE -0xC1E3 0xC950 #HANGUL SYLLABLE CIEUC WI -0xC1E4 0xC951 #HANGUL SYLLABLE CIEUC WI KIYEOK -0xC1E5 0xC954 #HANGUL SYLLABLE CIEUC WI NIEUN -0xC1E6 0xC958 #HANGUL SYLLABLE CIEUC WI RIEUL -0xC1E7 0xC960 #HANGUL SYLLABLE CIEUC WI MIEUM -0xC1E8 0xC961 #HANGUL SYLLABLE CIEUC WI PIEUP -0xC1E9 0xC963 #HANGUL SYLLABLE CIEUC WI SIOS -0xC1EA 0xC96C #HANGUL SYLLABLE CIEUC YU -0xC1EB 0xC970 #HANGUL SYLLABLE CIEUC YU NIEUN -0xC1EC 0xC974 #HANGUL SYLLABLE CIEUC YU RIEUL -0xC1ED 0xC97C #HANGUL SYLLABLE CIEUC YU MIEUM -0xC1EE 0xC988 #HANGUL SYLLABLE CIEUC EU -0xC1EF 0xC989 #HANGUL SYLLABLE CIEUC EU KIYEOK -0xC1F0 0xC98C #HANGUL SYLLABLE CIEUC EU NIEUN -0xC1F1 0xC990 #HANGUL SYLLABLE CIEUC EU RIEUL -0xC1F2 0xC998 #HANGUL SYLLABLE CIEUC EU MIEUM -0xC1F3 0xC999 #HANGUL SYLLABLE CIEUC EU PIEUP -0xC1F4 0xC99B #HANGUL SYLLABLE CIEUC EU SIOS -0xC1F5 0xC99D #HANGUL SYLLABLE CIEUC EU IEUNG -0xC1F6 0xC9C0 #HANGUL SYLLABLE CIEUC I -0xC1F7 0xC9C1 #HANGUL SYLLABLE CIEUC I KIYEOK -0xC1F8 0xC9C4 #HANGUL SYLLABLE CIEUC I NIEUN -0xC1F9 0xC9C7 #HANGUL SYLLABLE CIEUC I TIKEUT -0xC1FA 0xC9C8 #HANGUL SYLLABLE CIEUC I RIEUL -0xC1FB 0xC9CA #HANGUL SYLLABLE CIEUC I RIEULMIEUM -0xC1FC 0xC9D0 #HANGUL SYLLABLE CIEUC I MIEUM -0xC1FD 0xC9D1 #HANGUL SYLLABLE CIEUC I PIEUP -0xC1FE 0xC9D3 #HANGUL SYLLABLE CIEUC I SIOS -0xC241 0xD5CA #HANGUL SYLLABLE HIEUH EO SSANGKIYEOK -0xC242 0xD5CB #HANGUL SYLLABLE HIEUH EO KIYEOKSIOS -0xC243 0xD5CD #HANGUL SYLLABLE HIEUH EO NIEUNCIEUC -0xC244 0xD5CE #HANGUL SYLLABLE HIEUH EO NIEUNHIEUH -0xC245 0xD5CF #HANGUL SYLLABLE HIEUH EO TIKEUT -0xC246 0xD5D1 #HANGUL SYLLABLE HIEUH EO RIEULKIYEOK -0xC247 0xD5D3 #HANGUL SYLLABLE HIEUH EO RIEULPIEUP -0xC248 0xD5D4 #HANGUL SYLLABLE HIEUH EO RIEULSIOS -0xC249 0xD5D5 #HANGUL SYLLABLE HIEUH EO RIEULTHIEUTH -0xC24A 0xD5D6 #HANGUL SYLLABLE HIEUH EO RIEULPHIEUPH -0xC24B 0xD5D7 #HANGUL SYLLABLE HIEUH EO RIEULHIEUH -0xC24C 0xD5DA #HANGUL SYLLABLE HIEUH EO PIEUPSIOS -0xC24D 0xD5DC #HANGUL SYLLABLE HIEUH EO SSANGSIOS -0xC24E 0xD5DE #HANGUL SYLLABLE HIEUH EO CIEUC -0xC24F 0xD5DF #HANGUL SYLLABLE HIEUH EO CHIEUCH -0xC250 0xD5E0 #HANGUL SYLLABLE HIEUH EO KHIEUKH -0xC251 0xD5E1 #HANGUL SYLLABLE HIEUH EO THIEUTH -0xC252 0xD5E2 #HANGUL SYLLABLE HIEUH EO PHIEUPH -0xC253 0xD5E3 #HANGUL SYLLABLE HIEUH EO HIEUH -0xC254 0xD5E6 #HANGUL SYLLABLE HIEUH E SSANGKIYEOK -0xC255 0xD5E7 #HANGUL SYLLABLE HIEUH E KIYEOKSIOS -0xC256 0xD5E9 #HANGUL SYLLABLE HIEUH E NIEUNCIEUC -0xC257 0xD5EA #HANGUL SYLLABLE HIEUH E NIEUNHIEUH -0xC258 0xD5EB #HANGUL SYLLABLE HIEUH E TIKEUT -0xC259 0xD5ED #HANGUL SYLLABLE HIEUH E RIEULKIYEOK -0xC25A 0xD5EE #HANGUL SYLLABLE HIEUH E RIEULMIEUM -0xC261 0xD5EF #HANGUL SYLLABLE HIEUH E RIEULPIEUP -0xC262 0xD5F0 #HANGUL SYLLABLE HIEUH E RIEULSIOS -0xC263 0xD5F1 #HANGUL SYLLABLE HIEUH E RIEULTHIEUTH -0xC264 0xD5F2 #HANGUL SYLLABLE HIEUH E RIEULPHIEUPH -0xC265 0xD5F3 #HANGUL SYLLABLE HIEUH E RIEULHIEUH -0xC266 0xD5F6 #HANGUL SYLLABLE HIEUH E PIEUPSIOS -0xC267 0xD5F8 #HANGUL SYLLABLE HIEUH E SSANGSIOS -0xC268 0xD5FA #HANGUL SYLLABLE HIEUH E CIEUC -0xC269 0xD5FB #HANGUL SYLLABLE HIEUH E CHIEUCH -0xC26A 0xD5FC #HANGUL SYLLABLE HIEUH E KHIEUKH -0xC26B 0xD5FD #HANGUL SYLLABLE HIEUH E THIEUTH -0xC26C 0xD5FE #HANGUL SYLLABLE HIEUH E PHIEUPH -0xC26D 0xD5FF #HANGUL SYLLABLE HIEUH E HIEUH -0xC26E 0xD602 #HANGUL SYLLABLE HIEUH YEO SSANGKIYEOK -0xC26F 0xD603 #HANGUL SYLLABLE HIEUH YEO KIYEOKSIOS -0xC270 0xD605 #HANGUL SYLLABLE HIEUH YEO NIEUNCIEUC -0xC271 0xD606 #HANGUL SYLLABLE HIEUH YEO NIEUNHIEUH -0xC272 0xD607 #HANGUL SYLLABLE HIEUH YEO TIKEUT -0xC273 0xD609 #HANGUL SYLLABLE HIEUH YEO RIEULKIYEOK -0xC274 0xD60A #HANGUL SYLLABLE HIEUH YEO RIEULMIEUM -0xC275 0xD60B #HANGUL SYLLABLE HIEUH YEO RIEULPIEUP -0xC276 0xD60C #HANGUL SYLLABLE HIEUH YEO RIEULSIOS -0xC277 0xD60D #HANGUL SYLLABLE HIEUH YEO RIEULTHIEUTH -0xC278 0xD60E #HANGUL SYLLABLE HIEUH YEO RIEULPHIEUPH -0xC279 0xD60F #HANGUL SYLLABLE HIEUH YEO RIEULHIEUH -0xC27A 0xD612 #HANGUL SYLLABLE HIEUH YEO PIEUPSIOS -0xC281 0xD616 #HANGUL SYLLABLE HIEUH YEO CIEUC -0xC282 0xD617 #HANGUL SYLLABLE HIEUH YEO CHIEUCH -0xC283 0xD618 #HANGUL SYLLABLE HIEUH YEO KHIEUKH -0xC284 0xD619 #HANGUL SYLLABLE HIEUH YEO THIEUTH -0xC285 0xD61A #HANGUL SYLLABLE HIEUH YEO PHIEUPH -0xC286 0xD61B #HANGUL SYLLABLE HIEUH YEO HIEUH -0xC287 0xD61D #HANGUL SYLLABLE HIEUH YE KIYEOK -0xC288 0xD61E #HANGUL SYLLABLE HIEUH YE SSANGKIYEOK -0xC289 0xD61F #HANGUL SYLLABLE HIEUH YE KIYEOKSIOS -0xC28A 0xD621 #HANGUL SYLLABLE HIEUH YE NIEUNCIEUC -0xC28B 0xD622 #HANGUL SYLLABLE HIEUH YE NIEUNHIEUH -0xC28C 0xD623 #HANGUL SYLLABLE HIEUH YE TIKEUT -0xC28D 0xD625 #HANGUL SYLLABLE HIEUH YE RIEULKIYEOK -0xC28E 0xD626 #HANGUL SYLLABLE HIEUH YE RIEULMIEUM -0xC28F 0xD627 #HANGUL SYLLABLE HIEUH YE RIEULPIEUP -0xC290 0xD628 #HANGUL SYLLABLE HIEUH YE RIEULSIOS -0xC291 0xD629 #HANGUL SYLLABLE HIEUH YE RIEULTHIEUTH -0xC292 0xD62A #HANGUL SYLLABLE HIEUH YE RIEULPHIEUPH -0xC293 0xD62B #HANGUL SYLLABLE HIEUH YE RIEULHIEUH -0xC294 0xD62C #HANGUL SYLLABLE HIEUH YE MIEUM -0xC295 0xD62E #HANGUL SYLLABLE HIEUH YE PIEUPSIOS -0xC296 0xD62F #HANGUL SYLLABLE HIEUH YE SIOS -0xC297 0xD630 #HANGUL SYLLABLE HIEUH YE SSANGSIOS -0xC298 0xD631 #HANGUL SYLLABLE HIEUH YE IEUNG -0xC299 0xD632 #HANGUL SYLLABLE HIEUH YE CIEUC -0xC29A 0xD633 #HANGUL SYLLABLE HIEUH YE CHIEUCH -0xC29B 0xD634 #HANGUL SYLLABLE HIEUH YE KHIEUKH -0xC29C 0xD635 #HANGUL SYLLABLE HIEUH YE THIEUTH -0xC29D 0xD636 #HANGUL SYLLABLE HIEUH YE PHIEUPH -0xC29E 0xD637 #HANGUL SYLLABLE HIEUH YE HIEUH -0xC29F 0xD63A #HANGUL SYLLABLE HIEUH O SSANGKIYEOK -0xC2A0 0xD63B #HANGUL SYLLABLE HIEUH O KIYEOKSIOS -0xC2A1 0xC9D5 #HANGUL SYLLABLE CIEUC I IEUNG -0xC2A2 0xC9D6 #HANGUL SYLLABLE CIEUC I CIEUC -0xC2A3 0xC9D9 #HANGUL SYLLABLE CIEUC I THIEUTH -0xC2A4 0xC9DA #HANGUL SYLLABLE CIEUC I PHIEUPH -0xC2A5 0xC9DC #HANGUL SYLLABLE SSANGCIEUC A -0xC2A6 0xC9DD #HANGUL SYLLABLE SSANGCIEUC A KIYEOK -0xC2A7 0xC9E0 #HANGUL SYLLABLE SSANGCIEUC A NIEUN -0xC2A8 0xC9E2 #HANGUL SYLLABLE SSANGCIEUC A NIEUNHIEUH -0xC2A9 0xC9E4 #HANGUL SYLLABLE SSANGCIEUC A RIEUL -0xC2AA 0xC9E7 #HANGUL SYLLABLE SSANGCIEUC A RIEULPIEUP -0xC2AB 0xC9EC #HANGUL SYLLABLE SSANGCIEUC A MIEUM -0xC2AC 0xC9ED #HANGUL SYLLABLE SSANGCIEUC A PIEUP -0xC2AD 0xC9EF #HANGUL SYLLABLE SSANGCIEUC A SIOS -0xC2AE 0xC9F0 #HANGUL SYLLABLE SSANGCIEUC A SSANGSIOS -0xC2AF 0xC9F1 #HANGUL SYLLABLE SSANGCIEUC A IEUNG -0xC2B0 0xC9F8 #HANGUL SYLLABLE SSANGCIEUC AE -0xC2B1 0xC9F9 #HANGUL SYLLABLE SSANGCIEUC AE KIYEOK -0xC2B2 0xC9FC #HANGUL SYLLABLE SSANGCIEUC AE NIEUN -0xC2B3 0xCA00 #HANGUL SYLLABLE SSANGCIEUC AE RIEUL -0xC2B4 0xCA08 #HANGUL SYLLABLE SSANGCIEUC AE MIEUM -0xC2B5 0xCA09 #HANGUL SYLLABLE SSANGCIEUC AE PIEUP -0xC2B6 0xCA0B #HANGUL SYLLABLE SSANGCIEUC AE SIOS -0xC2B7 0xCA0C #HANGUL SYLLABLE SSANGCIEUC AE SSANGSIOS -0xC2B8 0xCA0D #HANGUL SYLLABLE SSANGCIEUC AE IEUNG -0xC2B9 0xCA14 #HANGUL SYLLABLE SSANGCIEUC YA -0xC2BA 0xCA18 #HANGUL SYLLABLE SSANGCIEUC YA NIEUN -0xC2BB 0xCA29 #HANGUL SYLLABLE SSANGCIEUC YA IEUNG -0xC2BC 0xCA4C #HANGUL SYLLABLE SSANGCIEUC EO -0xC2BD 0xCA4D #HANGUL SYLLABLE SSANGCIEUC EO KIYEOK -0xC2BE 0xCA50 #HANGUL SYLLABLE SSANGCIEUC EO NIEUN -0xC2BF 0xCA54 #HANGUL SYLLABLE SSANGCIEUC EO RIEUL -0xC2C0 0xCA5C #HANGUL SYLLABLE SSANGCIEUC EO MIEUM -0xC2C1 0xCA5D #HANGUL SYLLABLE SSANGCIEUC EO PIEUP -0xC2C2 0xCA5F #HANGUL SYLLABLE SSANGCIEUC EO SIOS -0xC2C3 0xCA60 #HANGUL SYLLABLE SSANGCIEUC EO SSANGSIOS -0xC2C4 0xCA61 #HANGUL SYLLABLE SSANGCIEUC EO IEUNG -0xC2C5 0xCA68 #HANGUL SYLLABLE SSANGCIEUC E -0xC2C6 0xCA7D #HANGUL SYLLABLE SSANGCIEUC E IEUNG -0xC2C7 0xCA84 #HANGUL SYLLABLE SSANGCIEUC YEO -0xC2C8 0xCA98 #HANGUL SYLLABLE SSANGCIEUC YEO SSANGSIOS -0xC2C9 0xCABC #HANGUL SYLLABLE SSANGCIEUC O -0xC2CA 0xCABD #HANGUL SYLLABLE SSANGCIEUC O KIYEOK -0xC2CB 0xCAC0 #HANGUL SYLLABLE SSANGCIEUC O NIEUN -0xC2CC 0xCAC4 #HANGUL SYLLABLE SSANGCIEUC O RIEUL -0xC2CD 0xCACC #HANGUL SYLLABLE SSANGCIEUC O MIEUM -0xC2CE 0xCACD #HANGUL SYLLABLE SSANGCIEUC O PIEUP -0xC2CF 0xCACF #HANGUL SYLLABLE SSANGCIEUC O SIOS -0xC2D0 0xCAD1 #HANGUL SYLLABLE SSANGCIEUC O IEUNG -0xC2D1 0xCAD3 #HANGUL SYLLABLE SSANGCIEUC O CHIEUCH -0xC2D2 0xCAD8 #HANGUL SYLLABLE SSANGCIEUC WA -0xC2D3 0xCAD9 #HANGUL SYLLABLE SSANGCIEUC WA KIYEOK -0xC2D4 0xCAE0 #HANGUL SYLLABLE SSANGCIEUC WA RIEUL -0xC2D5 0xCAEC #HANGUL SYLLABLE SSANGCIEUC WA SSANGSIOS -0xC2D6 0xCAF4 #HANGUL SYLLABLE SSANGCIEUC WAE -0xC2D7 0xCB08 #HANGUL SYLLABLE SSANGCIEUC WAE SSANGSIOS -0xC2D8 0xCB10 #HANGUL SYLLABLE SSANGCIEUC OE -0xC2D9 0xCB14 #HANGUL SYLLABLE SSANGCIEUC OE NIEUN -0xC2DA 0xCB18 #HANGUL SYLLABLE SSANGCIEUC OE RIEUL -0xC2DB 0xCB20 #HANGUL SYLLABLE SSANGCIEUC OE MIEUM -0xC2DC 0xCB21 #HANGUL SYLLABLE SSANGCIEUC OE PIEUP -0xC2DD 0xCB41 #HANGUL SYLLABLE SSANGCIEUC YO IEUNG -0xC2DE 0xCB48 #HANGUL SYLLABLE SSANGCIEUC U -0xC2DF 0xCB49 #HANGUL SYLLABLE SSANGCIEUC U KIYEOK -0xC2E0 0xCB4C #HANGUL SYLLABLE SSANGCIEUC U NIEUN -0xC2E1 0xCB50 #HANGUL SYLLABLE SSANGCIEUC U RIEUL -0xC2E2 0xCB58 #HANGUL SYLLABLE SSANGCIEUC U MIEUM -0xC2E3 0xCB59 #HANGUL SYLLABLE SSANGCIEUC U PIEUP -0xC2E4 0xCB5D #HANGUL SYLLABLE SSANGCIEUC U IEUNG -0xC2E5 0xCB64 #HANGUL SYLLABLE SSANGCIEUC WEO -0xC2E6 0xCB78 #HANGUL SYLLABLE SSANGCIEUC WEO SSANGSIOS -0xC2E7 0xCB79 #HANGUL SYLLABLE SSANGCIEUC WEO IEUNG -0xC2E8 0xCB9C #HANGUL SYLLABLE SSANGCIEUC WI -0xC2E9 0xCBB8 #HANGUL SYLLABLE SSANGCIEUC YU -0xC2EA 0xCBD4 #HANGUL SYLLABLE SSANGCIEUC EU -0xC2EB 0xCBE4 #HANGUL SYLLABLE SSANGCIEUC EU MIEUM -0xC2EC 0xCBE7 #HANGUL SYLLABLE SSANGCIEUC EU SIOS -0xC2ED 0xCBE9 #HANGUL SYLLABLE SSANGCIEUC EU IEUNG -0xC2EE 0xCC0C #HANGUL SYLLABLE SSANGCIEUC I -0xC2EF 0xCC0D #HANGUL SYLLABLE SSANGCIEUC I KIYEOK -0xC2F0 0xCC10 #HANGUL SYLLABLE SSANGCIEUC I NIEUN -0xC2F1 0xCC14 #HANGUL SYLLABLE SSANGCIEUC I RIEUL -0xC2F2 0xCC1C #HANGUL SYLLABLE SSANGCIEUC I MIEUM -0xC2F3 0xCC1D #HANGUL SYLLABLE SSANGCIEUC I PIEUP -0xC2F4 0xCC21 #HANGUL SYLLABLE SSANGCIEUC I IEUNG -0xC2F5 0xCC22 #HANGUL SYLLABLE SSANGCIEUC I CIEUC -0xC2F6 0xCC27 #HANGUL SYLLABLE SSANGCIEUC I HIEUH -0xC2F7 0xCC28 #HANGUL SYLLABLE CHIEUCH A -0xC2F8 0xCC29 #HANGUL SYLLABLE CHIEUCH A KIYEOK -0xC2F9 0xCC2C #HANGUL SYLLABLE CHIEUCH A NIEUN -0xC2FA 0xCC2E #HANGUL SYLLABLE CHIEUCH A NIEUNHIEUH -0xC2FB 0xCC30 #HANGUL SYLLABLE CHIEUCH A RIEUL -0xC2FC 0xCC38 #HANGUL SYLLABLE CHIEUCH A MIEUM -0xC2FD 0xCC39 #HANGUL SYLLABLE CHIEUCH A PIEUP -0xC2FE 0xCC3B #HANGUL SYLLABLE CHIEUCH A SIOS -0xC341 0xD63D #HANGUL SYLLABLE HIEUH O NIEUNCIEUC -0xC342 0xD63E #HANGUL SYLLABLE HIEUH O NIEUNHIEUH -0xC343 0xD63F #HANGUL SYLLABLE HIEUH O TIKEUT -0xC344 0xD641 #HANGUL SYLLABLE HIEUH O RIEULKIYEOK -0xC345 0xD642 #HANGUL SYLLABLE HIEUH O RIEULMIEUM -0xC346 0xD643 #HANGUL SYLLABLE HIEUH O RIEULPIEUP -0xC347 0xD644 #HANGUL SYLLABLE HIEUH O RIEULSIOS -0xC348 0xD646 #HANGUL SYLLABLE HIEUH O RIEULPHIEUPH -0xC349 0xD647 #HANGUL SYLLABLE HIEUH O RIEULHIEUH -0xC34A 0xD64A #HANGUL SYLLABLE HIEUH O PIEUPSIOS -0xC34B 0xD64C #HANGUL SYLLABLE HIEUH O SSANGSIOS -0xC34C 0xD64E #HANGUL SYLLABLE HIEUH O CIEUC -0xC34D 0xD64F #HANGUL SYLLABLE HIEUH O CHIEUCH -0xC34E 0xD650 #HANGUL SYLLABLE HIEUH O KHIEUKH -0xC34F 0xD652 #HANGUL SYLLABLE HIEUH O PHIEUPH -0xC350 0xD653 #HANGUL SYLLABLE HIEUH O HIEUH -0xC351 0xD656 #HANGUL SYLLABLE HIEUH WA SSANGKIYEOK -0xC352 0xD657 #HANGUL SYLLABLE HIEUH WA KIYEOKSIOS -0xC353 0xD659 #HANGUL SYLLABLE HIEUH WA NIEUNCIEUC -0xC354 0xD65A #HANGUL SYLLABLE HIEUH WA NIEUNHIEUH -0xC355 0xD65B #HANGUL SYLLABLE HIEUH WA TIKEUT -0xC356 0xD65D #HANGUL SYLLABLE HIEUH WA RIEULKIYEOK -0xC357 0xD65E #HANGUL SYLLABLE HIEUH WA RIEULMIEUM -0xC358 0xD65F #HANGUL SYLLABLE HIEUH WA RIEULPIEUP -0xC359 0xD660 #HANGUL SYLLABLE HIEUH WA RIEULSIOS -0xC35A 0xD661 #HANGUL SYLLABLE HIEUH WA RIEULTHIEUTH -0xC361 0xD662 #HANGUL SYLLABLE HIEUH WA RIEULPHIEUPH -0xC362 0xD663 #HANGUL SYLLABLE HIEUH WA RIEULHIEUH -0xC363 0xD664 #HANGUL SYLLABLE HIEUH WA MIEUM -0xC364 0xD665 #HANGUL SYLLABLE HIEUH WA PIEUP -0xC365 0xD666 #HANGUL SYLLABLE HIEUH WA PIEUPSIOS -0xC366 0xD668 #HANGUL SYLLABLE HIEUH WA SSANGSIOS -0xC367 0xD66A #HANGUL SYLLABLE HIEUH WA CIEUC -0xC368 0xD66B #HANGUL SYLLABLE HIEUH WA CHIEUCH -0xC369 0xD66C #HANGUL SYLLABLE HIEUH WA KHIEUKH -0xC36A 0xD66D #HANGUL SYLLABLE HIEUH WA THIEUTH -0xC36B 0xD66E #HANGUL SYLLABLE HIEUH WA PHIEUPH -0xC36C 0xD66F #HANGUL SYLLABLE HIEUH WA HIEUH -0xC36D 0xD672 #HANGUL SYLLABLE HIEUH WAE SSANGKIYEOK -0xC36E 0xD673 #HANGUL SYLLABLE HIEUH WAE KIYEOKSIOS -0xC36F 0xD675 #HANGUL SYLLABLE HIEUH WAE NIEUNCIEUC -0xC370 0xD676 #HANGUL SYLLABLE HIEUH WAE NIEUNHIEUH -0xC371 0xD677 #HANGUL SYLLABLE HIEUH WAE TIKEUT -0xC372 0xD678 #HANGUL SYLLABLE HIEUH WAE RIEUL -0xC373 0xD679 #HANGUL SYLLABLE HIEUH WAE RIEULKIYEOK -0xC374 0xD67A #HANGUL SYLLABLE HIEUH WAE RIEULMIEUM -0xC375 0xD67B #HANGUL SYLLABLE HIEUH WAE RIEULPIEUP -0xC376 0xD67C #HANGUL SYLLABLE HIEUH WAE RIEULSIOS -0xC377 0xD67D #HANGUL SYLLABLE HIEUH WAE RIEULTHIEUTH -0xC378 0xD67E #HANGUL SYLLABLE HIEUH WAE RIEULPHIEUPH -0xC379 0xD67F #HANGUL SYLLABLE HIEUH WAE RIEULHIEUH -0xC37A 0xD680 #HANGUL SYLLABLE HIEUH WAE MIEUM -0xC381 0xD681 #HANGUL SYLLABLE HIEUH WAE PIEUP -0xC382 0xD682 #HANGUL SYLLABLE HIEUH WAE PIEUPSIOS -0xC383 0xD684 #HANGUL SYLLABLE HIEUH WAE SSANGSIOS -0xC384 0xD686 #HANGUL SYLLABLE HIEUH WAE CIEUC -0xC385 0xD687 #HANGUL SYLLABLE HIEUH WAE CHIEUCH -0xC386 0xD688 #HANGUL SYLLABLE HIEUH WAE KHIEUKH -0xC387 0xD689 #HANGUL SYLLABLE HIEUH WAE THIEUTH -0xC388 0xD68A #HANGUL SYLLABLE HIEUH WAE PHIEUPH -0xC389 0xD68B #HANGUL SYLLABLE HIEUH WAE HIEUH -0xC38A 0xD68E #HANGUL SYLLABLE HIEUH OE SSANGKIYEOK -0xC38B 0xD68F #HANGUL SYLLABLE HIEUH OE KIYEOKSIOS -0xC38C 0xD691 #HANGUL SYLLABLE HIEUH OE NIEUNCIEUC -0xC38D 0xD692 #HANGUL SYLLABLE HIEUH OE NIEUNHIEUH -0xC38E 0xD693 #HANGUL SYLLABLE HIEUH OE TIKEUT -0xC38F 0xD695 #HANGUL SYLLABLE HIEUH OE RIEULKIYEOK -0xC390 0xD696 #HANGUL SYLLABLE HIEUH OE RIEULMIEUM -0xC391 0xD697 #HANGUL SYLLABLE HIEUH OE RIEULPIEUP -0xC392 0xD698 #HANGUL SYLLABLE HIEUH OE RIEULSIOS -0xC393 0xD699 #HANGUL SYLLABLE HIEUH OE RIEULTHIEUTH -0xC394 0xD69A #HANGUL SYLLABLE HIEUH OE RIEULPHIEUPH -0xC395 0xD69B #HANGUL SYLLABLE HIEUH OE RIEULHIEUH -0xC396 0xD69C #HANGUL SYLLABLE HIEUH OE MIEUM -0xC397 0xD69E #HANGUL SYLLABLE HIEUH OE PIEUPSIOS -0xC398 0xD6A0 #HANGUL SYLLABLE HIEUH OE SSANGSIOS -0xC399 0xD6A2 #HANGUL SYLLABLE HIEUH OE CIEUC -0xC39A 0xD6A3 #HANGUL SYLLABLE HIEUH OE CHIEUCH -0xC39B 0xD6A4 #HANGUL SYLLABLE HIEUH OE KHIEUKH -0xC39C 0xD6A5 #HANGUL SYLLABLE HIEUH OE THIEUTH -0xC39D 0xD6A6 #HANGUL SYLLABLE HIEUH OE PHIEUPH -0xC39E 0xD6A7 #HANGUL SYLLABLE HIEUH OE HIEUH -0xC39F 0xD6A9 #HANGUL SYLLABLE HIEUH YO KIYEOK -0xC3A0 0xD6AA #HANGUL SYLLABLE HIEUH YO SSANGKIYEOK -0xC3A1 0xCC3C #HANGUL SYLLABLE CHIEUCH A SSANGSIOS -0xC3A2 0xCC3D #HANGUL SYLLABLE CHIEUCH A IEUNG -0xC3A3 0xCC3E #HANGUL SYLLABLE CHIEUCH A CIEUC -0xC3A4 0xCC44 #HANGUL SYLLABLE CHIEUCH AE -0xC3A5 0xCC45 #HANGUL SYLLABLE CHIEUCH AE KIYEOK -0xC3A6 0xCC48 #HANGUL SYLLABLE CHIEUCH AE NIEUN -0xC3A7 0xCC4C #HANGUL SYLLABLE CHIEUCH AE RIEUL -0xC3A8 0xCC54 #HANGUL SYLLABLE CHIEUCH AE MIEUM -0xC3A9 0xCC55 #HANGUL SYLLABLE CHIEUCH AE PIEUP -0xC3AA 0xCC57 #HANGUL SYLLABLE CHIEUCH AE SIOS -0xC3AB 0xCC58 #HANGUL SYLLABLE CHIEUCH AE SSANGSIOS -0xC3AC 0xCC59 #HANGUL SYLLABLE CHIEUCH AE IEUNG -0xC3AD 0xCC60 #HANGUL SYLLABLE CHIEUCH YA -0xC3AE 0xCC64 #HANGUL SYLLABLE CHIEUCH YA NIEUN -0xC3AF 0xCC66 #HANGUL SYLLABLE CHIEUCH YA NIEUNHIEUH -0xC3B0 0xCC68 #HANGUL SYLLABLE CHIEUCH YA RIEUL -0xC3B1 0xCC70 #HANGUL SYLLABLE CHIEUCH YA MIEUM -0xC3B2 0xCC75 #HANGUL SYLLABLE CHIEUCH YA IEUNG -0xC3B3 0xCC98 #HANGUL SYLLABLE CHIEUCH EO -0xC3B4 0xCC99 #HANGUL SYLLABLE CHIEUCH EO KIYEOK -0xC3B5 0xCC9C #HANGUL SYLLABLE CHIEUCH EO NIEUN -0xC3B6 0xCCA0 #HANGUL SYLLABLE CHIEUCH EO RIEUL -0xC3B7 0xCCA8 #HANGUL SYLLABLE CHIEUCH EO MIEUM -0xC3B8 0xCCA9 #HANGUL SYLLABLE CHIEUCH EO PIEUP -0xC3B9 0xCCAB #HANGUL SYLLABLE CHIEUCH EO SIOS -0xC3BA 0xCCAC #HANGUL SYLLABLE CHIEUCH EO SSANGSIOS -0xC3BB 0xCCAD #HANGUL SYLLABLE CHIEUCH EO IEUNG -0xC3BC 0xCCB4 #HANGUL SYLLABLE CHIEUCH E -0xC3BD 0xCCB5 #HANGUL SYLLABLE CHIEUCH E KIYEOK -0xC3BE 0xCCB8 #HANGUL SYLLABLE CHIEUCH E NIEUN -0xC3BF 0xCCBC #HANGUL SYLLABLE CHIEUCH E RIEUL -0xC3C0 0xCCC4 #HANGUL SYLLABLE CHIEUCH E MIEUM -0xC3C1 0xCCC5 #HANGUL SYLLABLE CHIEUCH E PIEUP -0xC3C2 0xCCC7 #HANGUL SYLLABLE CHIEUCH E SIOS -0xC3C3 0xCCC9 #HANGUL SYLLABLE CHIEUCH E IEUNG -0xC3C4 0xCCD0 #HANGUL SYLLABLE CHIEUCH YEO -0xC3C5 0xCCD4 #HANGUL SYLLABLE CHIEUCH YEO NIEUN -0xC3C6 0xCCE4 #HANGUL SYLLABLE CHIEUCH YEO SSANGSIOS -0xC3C7 0xCCEC #HANGUL SYLLABLE CHIEUCH YE -0xC3C8 0xCCF0 #HANGUL SYLLABLE CHIEUCH YE NIEUN -0xC3C9 0xCD01 #HANGUL SYLLABLE CHIEUCH YE IEUNG -0xC3CA 0xCD08 #HANGUL SYLLABLE CHIEUCH O -0xC3CB 0xCD09 #HANGUL SYLLABLE CHIEUCH O KIYEOK -0xC3CC 0xCD0C #HANGUL SYLLABLE CHIEUCH O NIEUN -0xC3CD 0xCD10 #HANGUL SYLLABLE CHIEUCH O RIEUL -0xC3CE 0xCD18 #HANGUL SYLLABLE CHIEUCH O MIEUM -0xC3CF 0xCD19 #HANGUL SYLLABLE CHIEUCH O PIEUP -0xC3D0 0xCD1B #HANGUL SYLLABLE CHIEUCH O SIOS -0xC3D1 0xCD1D #HANGUL SYLLABLE CHIEUCH O IEUNG -0xC3D2 0xCD24 #HANGUL SYLLABLE CHIEUCH WA -0xC3D3 0xCD28 #HANGUL SYLLABLE CHIEUCH WA NIEUN -0xC3D4 0xCD2C #HANGUL SYLLABLE CHIEUCH WA RIEUL -0xC3D5 0xCD39 #HANGUL SYLLABLE CHIEUCH WA IEUNG -0xC3D6 0xCD5C #HANGUL SYLLABLE CHIEUCH OE -0xC3D7 0xCD60 #HANGUL SYLLABLE CHIEUCH OE NIEUN -0xC3D8 0xCD64 #HANGUL SYLLABLE CHIEUCH OE RIEUL -0xC3D9 0xCD6C #HANGUL SYLLABLE CHIEUCH OE MIEUM -0xC3DA 0xCD6D #HANGUL SYLLABLE CHIEUCH OE PIEUP -0xC3DB 0xCD6F #HANGUL SYLLABLE CHIEUCH OE SIOS -0xC3DC 0xCD71 #HANGUL SYLLABLE CHIEUCH OE IEUNG -0xC3DD 0xCD78 #HANGUL SYLLABLE CHIEUCH YO -0xC3DE 0xCD88 #HANGUL SYLLABLE CHIEUCH YO MIEUM -0xC3DF 0xCD94 #HANGUL SYLLABLE CHIEUCH U -0xC3E0 0xCD95 #HANGUL SYLLABLE CHIEUCH U KIYEOK -0xC3E1 0xCD98 #HANGUL SYLLABLE CHIEUCH U NIEUN -0xC3E2 0xCD9C #HANGUL SYLLABLE CHIEUCH U RIEUL -0xC3E3 0xCDA4 #HANGUL SYLLABLE CHIEUCH U MIEUM -0xC3E4 0xCDA5 #HANGUL SYLLABLE CHIEUCH U PIEUP -0xC3E5 0xCDA7 #HANGUL SYLLABLE CHIEUCH U SIOS -0xC3E6 0xCDA9 #HANGUL SYLLABLE CHIEUCH U IEUNG -0xC3E7 0xCDB0 #HANGUL SYLLABLE CHIEUCH WEO -0xC3E8 0xCDC4 #HANGUL SYLLABLE CHIEUCH WEO SSANGSIOS -0xC3E9 0xCDCC #HANGUL SYLLABLE CHIEUCH WE -0xC3EA 0xCDD0 #HANGUL SYLLABLE CHIEUCH WE NIEUN -0xC3EB 0xCDE8 #HANGUL SYLLABLE CHIEUCH WI -0xC3EC 0xCDEC #HANGUL SYLLABLE CHIEUCH WI NIEUN -0xC3ED 0xCDF0 #HANGUL SYLLABLE CHIEUCH WI RIEUL -0xC3EE 0xCDF8 #HANGUL SYLLABLE CHIEUCH WI MIEUM -0xC3EF 0xCDF9 #HANGUL SYLLABLE CHIEUCH WI PIEUP -0xC3F0 0xCDFB #HANGUL SYLLABLE CHIEUCH WI SIOS -0xC3F1 0xCDFD #HANGUL SYLLABLE CHIEUCH WI IEUNG -0xC3F2 0xCE04 #HANGUL SYLLABLE CHIEUCH YU -0xC3F3 0xCE08 #HANGUL SYLLABLE CHIEUCH YU NIEUN -0xC3F4 0xCE0C #HANGUL SYLLABLE CHIEUCH YU RIEUL -0xC3F5 0xCE14 #HANGUL SYLLABLE CHIEUCH YU MIEUM -0xC3F6 0xCE19 #HANGUL SYLLABLE CHIEUCH YU IEUNG -0xC3F7 0xCE20 #HANGUL SYLLABLE CHIEUCH EU -0xC3F8 0xCE21 #HANGUL SYLLABLE CHIEUCH EU KIYEOK -0xC3F9 0xCE24 #HANGUL SYLLABLE CHIEUCH EU NIEUN -0xC3FA 0xCE28 #HANGUL SYLLABLE CHIEUCH EU RIEUL -0xC3FB 0xCE30 #HANGUL SYLLABLE CHIEUCH EU MIEUM -0xC3FC 0xCE31 #HANGUL SYLLABLE CHIEUCH EU PIEUP -0xC3FD 0xCE33 #HANGUL SYLLABLE CHIEUCH EU SIOS -0xC3FE 0xCE35 #HANGUL SYLLABLE CHIEUCH EU IEUNG -0xC441 0xD6AB #HANGUL SYLLABLE HIEUH YO KIYEOKSIOS -0xC442 0xD6AD #HANGUL SYLLABLE HIEUH YO NIEUNCIEUC -0xC443 0xD6AE #HANGUL SYLLABLE HIEUH YO NIEUNHIEUH -0xC444 0xD6AF #HANGUL SYLLABLE HIEUH YO TIKEUT -0xC445 0xD6B1 #HANGUL SYLLABLE HIEUH YO RIEULKIYEOK -0xC446 0xD6B2 #HANGUL SYLLABLE HIEUH YO RIEULMIEUM -0xC447 0xD6B3 #HANGUL SYLLABLE HIEUH YO RIEULPIEUP -0xC448 0xD6B4 #HANGUL SYLLABLE HIEUH YO RIEULSIOS -0xC449 0xD6B5 #HANGUL SYLLABLE HIEUH YO RIEULTHIEUTH -0xC44A 0xD6B6 #HANGUL SYLLABLE HIEUH YO RIEULPHIEUPH -0xC44B 0xD6B7 #HANGUL SYLLABLE HIEUH YO RIEULHIEUH -0xC44C 0xD6B8 #HANGUL SYLLABLE HIEUH YO MIEUM -0xC44D 0xD6BA #HANGUL SYLLABLE HIEUH YO PIEUPSIOS -0xC44E 0xD6BC #HANGUL SYLLABLE HIEUH YO SSANGSIOS -0xC44F 0xD6BD #HANGUL SYLLABLE HIEUH YO IEUNG -0xC450 0xD6BE #HANGUL SYLLABLE HIEUH YO CIEUC -0xC451 0xD6BF #HANGUL SYLLABLE HIEUH YO CHIEUCH -0xC452 0xD6C0 #HANGUL SYLLABLE HIEUH YO KHIEUKH -0xC453 0xD6C1 #HANGUL SYLLABLE HIEUH YO THIEUTH -0xC454 0xD6C2 #HANGUL SYLLABLE HIEUH YO PHIEUPH -0xC455 0xD6C3 #HANGUL SYLLABLE HIEUH YO HIEUH -0xC456 0xD6C6 #HANGUL SYLLABLE HIEUH U SSANGKIYEOK -0xC457 0xD6C7 #HANGUL SYLLABLE HIEUH U KIYEOKSIOS -0xC458 0xD6C9 #HANGUL SYLLABLE HIEUH U NIEUNCIEUC -0xC459 0xD6CA #HANGUL SYLLABLE HIEUH U NIEUNHIEUH -0xC45A 0xD6CB #HANGUL SYLLABLE HIEUH U TIKEUT -0xC461 0xD6CD #HANGUL SYLLABLE HIEUH U RIEULKIYEOK -0xC462 0xD6CE #HANGUL SYLLABLE HIEUH U RIEULMIEUM -0xC463 0xD6CF #HANGUL SYLLABLE HIEUH U RIEULPIEUP -0xC464 0xD6D0 #HANGUL SYLLABLE HIEUH U RIEULSIOS -0xC465 0xD6D2 #HANGUL SYLLABLE HIEUH U RIEULPHIEUPH -0xC466 0xD6D3 #HANGUL SYLLABLE HIEUH U RIEULHIEUH -0xC467 0xD6D5 #HANGUL SYLLABLE HIEUH U PIEUP -0xC468 0xD6D6 #HANGUL SYLLABLE HIEUH U PIEUPSIOS -0xC469 0xD6D8 #HANGUL SYLLABLE HIEUH U SSANGSIOS -0xC46A 0xD6DA #HANGUL SYLLABLE HIEUH U CIEUC -0xC46B 0xD6DB #HANGUL SYLLABLE HIEUH U CHIEUCH -0xC46C 0xD6DC #HANGUL SYLLABLE HIEUH U KHIEUKH -0xC46D 0xD6DD #HANGUL SYLLABLE HIEUH U THIEUTH -0xC46E 0xD6DE #HANGUL SYLLABLE HIEUH U PHIEUPH -0xC46F 0xD6DF #HANGUL SYLLABLE HIEUH U HIEUH -0xC470 0xD6E1 #HANGUL SYLLABLE HIEUH WEO KIYEOK -0xC471 0xD6E2 #HANGUL SYLLABLE HIEUH WEO SSANGKIYEOK -0xC472 0xD6E3 #HANGUL SYLLABLE HIEUH WEO KIYEOKSIOS -0xC473 0xD6E5 #HANGUL SYLLABLE HIEUH WEO NIEUNCIEUC -0xC474 0xD6E6 #HANGUL SYLLABLE HIEUH WEO NIEUNHIEUH -0xC475 0xD6E7 #HANGUL SYLLABLE HIEUH WEO TIKEUT -0xC476 0xD6E9 #HANGUL SYLLABLE HIEUH WEO RIEULKIYEOK -0xC477 0xD6EA #HANGUL SYLLABLE HIEUH WEO RIEULMIEUM -0xC478 0xD6EB #HANGUL SYLLABLE HIEUH WEO RIEULPIEUP -0xC479 0xD6EC #HANGUL SYLLABLE HIEUH WEO RIEULSIOS -0xC47A 0xD6ED #HANGUL SYLLABLE HIEUH WEO RIEULTHIEUTH -0xC481 0xD6EE #HANGUL SYLLABLE HIEUH WEO RIEULPHIEUPH -0xC482 0xD6EF #HANGUL SYLLABLE HIEUH WEO RIEULHIEUH -0xC483 0xD6F1 #HANGUL SYLLABLE HIEUH WEO PIEUP -0xC484 0xD6F2 #HANGUL SYLLABLE HIEUH WEO PIEUPSIOS -0xC485 0xD6F3 #HANGUL SYLLABLE HIEUH WEO SIOS -0xC486 0xD6F4 #HANGUL SYLLABLE HIEUH WEO SSANGSIOS -0xC487 0xD6F6 #HANGUL SYLLABLE HIEUH WEO CIEUC -0xC488 0xD6F7 #HANGUL SYLLABLE HIEUH WEO CHIEUCH -0xC489 0xD6F8 #HANGUL SYLLABLE HIEUH WEO KHIEUKH -0xC48A 0xD6F9 #HANGUL SYLLABLE HIEUH WEO THIEUTH -0xC48B 0xD6FA #HANGUL SYLLABLE HIEUH WEO PHIEUPH -0xC48C 0xD6FB #HANGUL SYLLABLE HIEUH WEO HIEUH -0xC48D 0xD6FE #HANGUL SYLLABLE HIEUH WE SSANGKIYEOK -0xC48E 0xD6FF #HANGUL SYLLABLE HIEUH WE KIYEOKSIOS -0xC48F 0xD701 #HANGUL SYLLABLE HIEUH WE NIEUNCIEUC -0xC490 0xD702 #HANGUL SYLLABLE HIEUH WE NIEUNHIEUH -0xC491 0xD703 #HANGUL SYLLABLE HIEUH WE TIKEUT -0xC492 0xD705 #HANGUL SYLLABLE HIEUH WE RIEULKIYEOK -0xC493 0xD706 #HANGUL SYLLABLE HIEUH WE RIEULMIEUM -0xC494 0xD707 #HANGUL SYLLABLE HIEUH WE RIEULPIEUP -0xC495 0xD708 #HANGUL SYLLABLE HIEUH WE RIEULSIOS -0xC496 0xD709 #HANGUL SYLLABLE HIEUH WE RIEULTHIEUTH -0xC497 0xD70A #HANGUL SYLLABLE HIEUH WE RIEULPHIEUPH -0xC498 0xD70B #HANGUL SYLLABLE HIEUH WE RIEULHIEUH -0xC499 0xD70C #HANGUL SYLLABLE HIEUH WE MIEUM -0xC49A 0xD70D #HANGUL SYLLABLE HIEUH WE PIEUP -0xC49B 0xD70E #HANGUL SYLLABLE HIEUH WE PIEUPSIOS -0xC49C 0xD70F #HANGUL SYLLABLE HIEUH WE SIOS -0xC49D 0xD710 #HANGUL SYLLABLE HIEUH WE SSANGSIOS -0xC49E 0xD712 #HANGUL SYLLABLE HIEUH WE CIEUC -0xC49F 0xD713 #HANGUL SYLLABLE HIEUH WE CHIEUCH -0xC4A0 0xD714 #HANGUL SYLLABLE HIEUH WE KHIEUKH -0xC4A1 0xCE58 #HANGUL SYLLABLE CHIEUCH I -0xC4A2 0xCE59 #HANGUL SYLLABLE CHIEUCH I KIYEOK -0xC4A3 0xCE5C #HANGUL SYLLABLE CHIEUCH I NIEUN -0xC4A4 0xCE5F #HANGUL SYLLABLE CHIEUCH I TIKEUT -0xC4A5 0xCE60 #HANGUL SYLLABLE CHIEUCH I RIEUL -0xC4A6 0xCE61 #HANGUL SYLLABLE CHIEUCH I RIEULKIYEOK -0xC4A7 0xCE68 #HANGUL SYLLABLE CHIEUCH I MIEUM -0xC4A8 0xCE69 #HANGUL SYLLABLE CHIEUCH I PIEUP -0xC4A9 0xCE6B #HANGUL SYLLABLE CHIEUCH I SIOS -0xC4AA 0xCE6D #HANGUL SYLLABLE CHIEUCH I IEUNG -0xC4AB 0xCE74 #HANGUL SYLLABLE KHIEUKH A -0xC4AC 0xCE75 #HANGUL SYLLABLE KHIEUKH A KIYEOK -0xC4AD 0xCE78 #HANGUL SYLLABLE KHIEUKH A NIEUN -0xC4AE 0xCE7C #HANGUL SYLLABLE KHIEUKH A RIEUL -0xC4AF 0xCE84 #HANGUL SYLLABLE KHIEUKH A MIEUM -0xC4B0 0xCE85 #HANGUL SYLLABLE KHIEUKH A PIEUP -0xC4B1 0xCE87 #HANGUL SYLLABLE KHIEUKH A SIOS -0xC4B2 0xCE89 #HANGUL SYLLABLE KHIEUKH A IEUNG -0xC4B3 0xCE90 #HANGUL SYLLABLE KHIEUKH AE -0xC4B4 0xCE91 #HANGUL SYLLABLE KHIEUKH AE KIYEOK -0xC4B5 0xCE94 #HANGUL SYLLABLE KHIEUKH AE NIEUN -0xC4B6 0xCE98 #HANGUL SYLLABLE KHIEUKH AE RIEUL -0xC4B7 0xCEA0 #HANGUL SYLLABLE KHIEUKH AE MIEUM -0xC4B8 0xCEA1 #HANGUL SYLLABLE KHIEUKH AE PIEUP -0xC4B9 0xCEA3 #HANGUL SYLLABLE KHIEUKH AE SIOS -0xC4BA 0xCEA4 #HANGUL SYLLABLE KHIEUKH AE SSANGSIOS -0xC4BB 0xCEA5 #HANGUL SYLLABLE KHIEUKH AE IEUNG -0xC4BC 0xCEAC #HANGUL SYLLABLE KHIEUKH YA -0xC4BD 0xCEAD #HANGUL SYLLABLE KHIEUKH YA KIYEOK -0xC4BE 0xCEC1 #HANGUL SYLLABLE KHIEUKH YA IEUNG -0xC4BF 0xCEE4 #HANGUL SYLLABLE KHIEUKH EO -0xC4C0 0xCEE5 #HANGUL SYLLABLE KHIEUKH EO KIYEOK -0xC4C1 0xCEE8 #HANGUL SYLLABLE KHIEUKH EO NIEUN -0xC4C2 0xCEEB #HANGUL SYLLABLE KHIEUKH EO TIKEUT -0xC4C3 0xCEEC #HANGUL SYLLABLE KHIEUKH EO RIEUL -0xC4C4 0xCEF4 #HANGUL SYLLABLE KHIEUKH EO MIEUM -0xC4C5 0xCEF5 #HANGUL SYLLABLE KHIEUKH EO PIEUP -0xC4C6 0xCEF7 #HANGUL SYLLABLE KHIEUKH EO SIOS -0xC4C7 0xCEF8 #HANGUL SYLLABLE KHIEUKH EO SSANGSIOS -0xC4C8 0xCEF9 #HANGUL SYLLABLE KHIEUKH EO IEUNG -0xC4C9 0xCF00 #HANGUL SYLLABLE KHIEUKH E -0xC4CA 0xCF01 #HANGUL SYLLABLE KHIEUKH E KIYEOK -0xC4CB 0xCF04 #HANGUL SYLLABLE KHIEUKH E NIEUN -0xC4CC 0xCF08 #HANGUL SYLLABLE KHIEUKH E RIEUL -0xC4CD 0xCF10 #HANGUL SYLLABLE KHIEUKH E MIEUM -0xC4CE 0xCF11 #HANGUL SYLLABLE KHIEUKH E PIEUP -0xC4CF 0xCF13 #HANGUL SYLLABLE KHIEUKH E SIOS -0xC4D0 0xCF15 #HANGUL SYLLABLE KHIEUKH E IEUNG -0xC4D1 0xCF1C #HANGUL SYLLABLE KHIEUKH YEO -0xC4D2 0xCF20 #HANGUL SYLLABLE KHIEUKH YEO NIEUN -0xC4D3 0xCF24 #HANGUL SYLLABLE KHIEUKH YEO RIEUL -0xC4D4 0xCF2C #HANGUL SYLLABLE KHIEUKH YEO MIEUM -0xC4D5 0xCF2D #HANGUL SYLLABLE KHIEUKH YEO PIEUP -0xC4D6 0xCF2F #HANGUL SYLLABLE KHIEUKH YEO SIOS -0xC4D7 0xCF30 #HANGUL SYLLABLE KHIEUKH YEO SSANGSIOS -0xC4D8 0xCF31 #HANGUL SYLLABLE KHIEUKH YEO IEUNG -0xC4D9 0xCF38 #HANGUL SYLLABLE KHIEUKH YE -0xC4DA 0xCF54 #HANGUL SYLLABLE KHIEUKH O -0xC4DB 0xCF55 #HANGUL SYLLABLE KHIEUKH O KIYEOK -0xC4DC 0xCF58 #HANGUL SYLLABLE KHIEUKH O NIEUN -0xC4DD 0xCF5C #HANGUL SYLLABLE KHIEUKH O RIEUL -0xC4DE 0xCF64 #HANGUL SYLLABLE KHIEUKH O MIEUM -0xC4DF 0xCF65 #HANGUL SYLLABLE KHIEUKH O PIEUP -0xC4E0 0xCF67 #HANGUL SYLLABLE KHIEUKH O SIOS -0xC4E1 0xCF69 #HANGUL SYLLABLE KHIEUKH O IEUNG -0xC4E2 0xCF70 #HANGUL SYLLABLE KHIEUKH WA -0xC4E3 0xCF71 #HANGUL SYLLABLE KHIEUKH WA KIYEOK -0xC4E4 0xCF74 #HANGUL SYLLABLE KHIEUKH WA NIEUN -0xC4E5 0xCF78 #HANGUL SYLLABLE KHIEUKH WA RIEUL -0xC4E6 0xCF80 #HANGUL SYLLABLE KHIEUKH WA MIEUM -0xC4E7 0xCF85 #HANGUL SYLLABLE KHIEUKH WA IEUNG -0xC4E8 0xCF8C #HANGUL SYLLABLE KHIEUKH WAE -0xC4E9 0xCFA1 #HANGUL SYLLABLE KHIEUKH WAE IEUNG -0xC4EA 0xCFA8 #HANGUL SYLLABLE KHIEUKH OE -0xC4EB 0xCFB0 #HANGUL SYLLABLE KHIEUKH OE RIEUL -0xC4EC 0xCFC4 #HANGUL SYLLABLE KHIEUKH YO -0xC4ED 0xCFE0 #HANGUL SYLLABLE KHIEUKH U -0xC4EE 0xCFE1 #HANGUL SYLLABLE KHIEUKH U KIYEOK -0xC4EF 0xCFE4 #HANGUL SYLLABLE KHIEUKH U NIEUN -0xC4F0 0xCFE8 #HANGUL SYLLABLE KHIEUKH U RIEUL -0xC4F1 0xCFF0 #HANGUL SYLLABLE KHIEUKH U MIEUM -0xC4F2 0xCFF1 #HANGUL SYLLABLE KHIEUKH U PIEUP -0xC4F3 0xCFF3 #HANGUL SYLLABLE KHIEUKH U SIOS -0xC4F4 0xCFF5 #HANGUL SYLLABLE KHIEUKH U IEUNG -0xC4F5 0xCFFC #HANGUL SYLLABLE KHIEUKH WEO -0xC4F6 0xD000 #HANGUL SYLLABLE KHIEUKH WEO NIEUN -0xC4F7 0xD004 #HANGUL SYLLABLE KHIEUKH WEO RIEUL -0xC4F8 0xD011 #HANGUL SYLLABLE KHIEUKH WEO IEUNG -0xC4F9 0xD018 #HANGUL SYLLABLE KHIEUKH WE -0xC4FA 0xD02D #HANGUL SYLLABLE KHIEUKH WE IEUNG -0xC4FB 0xD034 #HANGUL SYLLABLE KHIEUKH WI -0xC4FC 0xD035 #HANGUL SYLLABLE KHIEUKH WI KIYEOK -0xC4FD 0xD038 #HANGUL SYLLABLE KHIEUKH WI NIEUN -0xC4FE 0xD03C #HANGUL SYLLABLE KHIEUKH WI RIEUL -0xC541 0xD715 #HANGUL SYLLABLE HIEUH WE THIEUTH -0xC542 0xD716 #HANGUL SYLLABLE HIEUH WE PHIEUPH -0xC543 0xD717 #HANGUL SYLLABLE HIEUH WE HIEUH -0xC544 0xD71A #HANGUL SYLLABLE HIEUH WI SSANGKIYEOK -0xC545 0xD71B #HANGUL SYLLABLE HIEUH WI KIYEOKSIOS -0xC546 0xD71D #HANGUL SYLLABLE HIEUH WI NIEUNCIEUC -0xC547 0xD71E #HANGUL SYLLABLE HIEUH WI NIEUNHIEUH -0xC548 0xD71F #HANGUL SYLLABLE HIEUH WI TIKEUT -0xC549 0xD721 #HANGUL SYLLABLE HIEUH WI RIEULKIYEOK -0xC54A 0xD722 #HANGUL SYLLABLE HIEUH WI RIEULMIEUM -0xC54B 0xD723 #HANGUL SYLLABLE HIEUH WI RIEULPIEUP -0xC54C 0xD724 #HANGUL SYLLABLE HIEUH WI RIEULSIOS -0xC54D 0xD725 #HANGUL SYLLABLE HIEUH WI RIEULTHIEUTH -0xC54E 0xD726 #HANGUL SYLLABLE HIEUH WI RIEULPHIEUPH -0xC54F 0xD727 #HANGUL SYLLABLE HIEUH WI RIEULHIEUH -0xC550 0xD72A #HANGUL SYLLABLE HIEUH WI PIEUPSIOS -0xC551 0xD72C #HANGUL SYLLABLE HIEUH WI SSANGSIOS -0xC552 0xD72E #HANGUL SYLLABLE HIEUH WI CIEUC -0xC553 0xD72F #HANGUL SYLLABLE HIEUH WI CHIEUCH -0xC554 0xD730 #HANGUL SYLLABLE HIEUH WI KHIEUKH -0xC555 0xD731 #HANGUL SYLLABLE HIEUH WI THIEUTH -0xC556 0xD732 #HANGUL SYLLABLE HIEUH WI PHIEUPH -0xC557 0xD733 #HANGUL SYLLABLE HIEUH WI HIEUH -0xC558 0xD736 #HANGUL SYLLABLE HIEUH YU SSANGKIYEOK -0xC559 0xD737 #HANGUL SYLLABLE HIEUH YU KIYEOKSIOS -0xC55A 0xD739 #HANGUL SYLLABLE HIEUH YU NIEUNCIEUC -0xC561 0xD73A #HANGUL SYLLABLE HIEUH YU NIEUNHIEUH -0xC562 0xD73B #HANGUL SYLLABLE HIEUH YU TIKEUT -0xC563 0xD73D #HANGUL SYLLABLE HIEUH YU RIEULKIYEOK -0xC564 0xD73E #HANGUL SYLLABLE HIEUH YU RIEULMIEUM -0xC565 0xD73F #HANGUL SYLLABLE HIEUH YU RIEULPIEUP -0xC566 0xD740 #HANGUL SYLLABLE HIEUH YU RIEULSIOS -0xC567 0xD741 #HANGUL SYLLABLE HIEUH YU RIEULTHIEUTH -0xC568 0xD742 #HANGUL SYLLABLE HIEUH YU RIEULPHIEUPH -0xC569 0xD743 #HANGUL SYLLABLE HIEUH YU RIEULHIEUH -0xC56A 0xD745 #HANGUL SYLLABLE HIEUH YU PIEUP -0xC56B 0xD746 #HANGUL SYLLABLE HIEUH YU PIEUPSIOS -0xC56C 0xD748 #HANGUL SYLLABLE HIEUH YU SSANGSIOS -0xC56D 0xD74A #HANGUL SYLLABLE HIEUH YU CIEUC -0xC56E 0xD74B #HANGUL SYLLABLE HIEUH YU CHIEUCH -0xC56F 0xD74C #HANGUL SYLLABLE HIEUH YU KHIEUKH -0xC570 0xD74D #HANGUL SYLLABLE HIEUH YU THIEUTH -0xC571 0xD74E #HANGUL SYLLABLE HIEUH YU PHIEUPH -0xC572 0xD74F #HANGUL SYLLABLE HIEUH YU HIEUH -0xC573 0xD752 #HANGUL SYLLABLE HIEUH EU SSANGKIYEOK -0xC574 0xD753 #HANGUL SYLLABLE HIEUH EU KIYEOKSIOS -0xC575 0xD755 #HANGUL SYLLABLE HIEUH EU NIEUNCIEUC -0xC576 0xD75A #HANGUL SYLLABLE HIEUH EU RIEULMIEUM -0xC577 0xD75B #HANGUL SYLLABLE HIEUH EU RIEULPIEUP -0xC578 0xD75C #HANGUL SYLLABLE HIEUH EU RIEULSIOS -0xC579 0xD75D #HANGUL SYLLABLE HIEUH EU RIEULTHIEUTH -0xC57A 0xD75E #HANGUL SYLLABLE HIEUH EU RIEULPHIEUPH -0xC581 0xD75F #HANGUL SYLLABLE HIEUH EU RIEULHIEUH -0xC582 0xD762 #HANGUL SYLLABLE HIEUH EU PIEUPSIOS -0xC583 0xD764 #HANGUL SYLLABLE HIEUH EU SSANGSIOS -0xC584 0xD766 #HANGUL SYLLABLE HIEUH EU CIEUC -0xC585 0xD767 #HANGUL SYLLABLE HIEUH EU CHIEUCH -0xC586 0xD768 #HANGUL SYLLABLE HIEUH EU KHIEUKH -0xC587 0xD76A #HANGUL SYLLABLE HIEUH EU PHIEUPH -0xC588 0xD76B #HANGUL SYLLABLE HIEUH EU HIEUH -0xC589 0xD76D #HANGUL SYLLABLE HIEUH YI KIYEOK -0xC58A 0xD76E #HANGUL SYLLABLE HIEUH YI SSANGKIYEOK -0xC58B 0xD76F #HANGUL SYLLABLE HIEUH YI KIYEOKSIOS -0xC58C 0xD771 #HANGUL SYLLABLE HIEUH YI NIEUNCIEUC -0xC58D 0xD772 #HANGUL SYLLABLE HIEUH YI NIEUNHIEUH -0xC58E 0xD773 #HANGUL SYLLABLE HIEUH YI TIKEUT -0xC58F 0xD775 #HANGUL SYLLABLE HIEUH YI RIEULKIYEOK -0xC590 0xD776 #HANGUL SYLLABLE HIEUH YI RIEULMIEUM -0xC591 0xD777 #HANGUL SYLLABLE HIEUH YI RIEULPIEUP -0xC592 0xD778 #HANGUL SYLLABLE HIEUH YI RIEULSIOS -0xC593 0xD779 #HANGUL SYLLABLE HIEUH YI RIEULTHIEUTH -0xC594 0xD77A #HANGUL SYLLABLE HIEUH YI RIEULPHIEUPH -0xC595 0xD77B #HANGUL SYLLABLE HIEUH YI RIEULHIEUH -0xC596 0xD77E #HANGUL SYLLABLE HIEUH YI PIEUPSIOS -0xC597 0xD77F #HANGUL SYLLABLE HIEUH YI SIOS -0xC598 0xD780 #HANGUL SYLLABLE HIEUH YI SSANGSIOS -0xC599 0xD782 #HANGUL SYLLABLE HIEUH YI CIEUC -0xC59A 0xD783 #HANGUL SYLLABLE HIEUH YI CHIEUCH -0xC59B 0xD784 #HANGUL SYLLABLE HIEUH YI KHIEUKH -0xC59C 0xD785 #HANGUL SYLLABLE HIEUH YI THIEUTH -0xC59D 0xD786 #HANGUL SYLLABLE HIEUH YI PHIEUPH -0xC59E 0xD787 #HANGUL SYLLABLE HIEUH YI HIEUH -0xC59F 0xD78A #HANGUL SYLLABLE HIEUH I SSANGKIYEOK -0xC5A0 0xD78B #HANGUL SYLLABLE HIEUH I KIYEOKSIOS -0xC5A1 0xD044 #HANGUL SYLLABLE KHIEUKH WI MIEUM -0xC5A2 0xD045 #HANGUL SYLLABLE KHIEUKH WI PIEUP -0xC5A3 0xD047 #HANGUL SYLLABLE KHIEUKH WI SIOS -0xC5A4 0xD049 #HANGUL SYLLABLE KHIEUKH WI IEUNG -0xC5A5 0xD050 #HANGUL SYLLABLE KHIEUKH YU -0xC5A6 0xD054 #HANGUL SYLLABLE KHIEUKH YU NIEUN -0xC5A7 0xD058 #HANGUL SYLLABLE KHIEUKH YU RIEUL -0xC5A8 0xD060 #HANGUL SYLLABLE KHIEUKH YU MIEUM -0xC5A9 0xD06C #HANGUL SYLLABLE KHIEUKH EU -0xC5AA 0xD06D #HANGUL SYLLABLE KHIEUKH EU KIYEOK -0xC5AB 0xD070 #HANGUL SYLLABLE KHIEUKH EU NIEUN -0xC5AC 0xD074 #HANGUL SYLLABLE KHIEUKH EU RIEUL -0xC5AD 0xD07C #HANGUL SYLLABLE KHIEUKH EU MIEUM -0xC5AE 0xD07D #HANGUL SYLLABLE KHIEUKH EU PIEUP -0xC5AF 0xD081 #HANGUL SYLLABLE KHIEUKH EU IEUNG -0xC5B0 0xD0A4 #HANGUL SYLLABLE KHIEUKH I -0xC5B1 0xD0A5 #HANGUL SYLLABLE KHIEUKH I KIYEOK -0xC5B2 0xD0A8 #HANGUL SYLLABLE KHIEUKH I NIEUN -0xC5B3 0xD0AC #HANGUL SYLLABLE KHIEUKH I RIEUL -0xC5B4 0xD0B4 #HANGUL SYLLABLE KHIEUKH I MIEUM -0xC5B5 0xD0B5 #HANGUL SYLLABLE KHIEUKH I PIEUP -0xC5B6 0xD0B7 #HANGUL SYLLABLE KHIEUKH I SIOS -0xC5B7 0xD0B9 #HANGUL SYLLABLE KHIEUKH I IEUNG -0xC5B8 0xD0C0 #HANGUL SYLLABLE THIEUTH A -0xC5B9 0xD0C1 #HANGUL SYLLABLE THIEUTH A KIYEOK -0xC5BA 0xD0C4 #HANGUL SYLLABLE THIEUTH A NIEUN -0xC5BB 0xD0C8 #HANGUL SYLLABLE THIEUTH A RIEUL -0xC5BC 0xD0C9 #HANGUL SYLLABLE THIEUTH A RIEULKIYEOK -0xC5BD 0xD0D0 #HANGUL SYLLABLE THIEUTH A MIEUM -0xC5BE 0xD0D1 #HANGUL SYLLABLE THIEUTH A PIEUP -0xC5BF 0xD0D3 #HANGUL SYLLABLE THIEUTH A SIOS -0xC5C0 0xD0D4 #HANGUL SYLLABLE THIEUTH A SSANGSIOS -0xC5C1 0xD0D5 #HANGUL SYLLABLE THIEUTH A IEUNG -0xC5C2 0xD0DC #HANGUL SYLLABLE THIEUTH AE -0xC5C3 0xD0DD #HANGUL SYLLABLE THIEUTH AE KIYEOK -0xC5C4 0xD0E0 #HANGUL SYLLABLE THIEUTH AE NIEUN -0xC5C5 0xD0E4 #HANGUL SYLLABLE THIEUTH AE RIEUL -0xC5C6 0xD0EC #HANGUL SYLLABLE THIEUTH AE MIEUM -0xC5C7 0xD0ED #HANGUL SYLLABLE THIEUTH AE PIEUP -0xC5C8 0xD0EF #HANGUL SYLLABLE THIEUTH AE SIOS -0xC5C9 0xD0F0 #HANGUL SYLLABLE THIEUTH AE SSANGSIOS -0xC5CA 0xD0F1 #HANGUL SYLLABLE THIEUTH AE IEUNG -0xC5CB 0xD0F8 #HANGUL SYLLABLE THIEUTH YA -0xC5CC 0xD10D #HANGUL SYLLABLE THIEUTH YA IEUNG -0xC5CD 0xD130 #HANGUL SYLLABLE THIEUTH EO -0xC5CE 0xD131 #HANGUL SYLLABLE THIEUTH EO KIYEOK -0xC5CF 0xD134 #HANGUL SYLLABLE THIEUTH EO NIEUN -0xC5D0 0xD138 #HANGUL SYLLABLE THIEUTH EO RIEUL -0xC5D1 0xD13A #HANGUL SYLLABLE THIEUTH EO RIEULMIEUM -0xC5D2 0xD140 #HANGUL SYLLABLE THIEUTH EO MIEUM -0xC5D3 0xD141 #HANGUL SYLLABLE THIEUTH EO PIEUP -0xC5D4 0xD143 #HANGUL SYLLABLE THIEUTH EO SIOS -0xC5D5 0xD144 #HANGUL SYLLABLE THIEUTH EO SSANGSIOS -0xC5D6 0xD145 #HANGUL SYLLABLE THIEUTH EO IEUNG -0xC5D7 0xD14C #HANGUL SYLLABLE THIEUTH E -0xC5D8 0xD14D #HANGUL SYLLABLE THIEUTH E KIYEOK -0xC5D9 0xD150 #HANGUL SYLLABLE THIEUTH E NIEUN -0xC5DA 0xD154 #HANGUL SYLLABLE THIEUTH E RIEUL -0xC5DB 0xD15C #HANGUL SYLLABLE THIEUTH E MIEUM -0xC5DC 0xD15D #HANGUL SYLLABLE THIEUTH E PIEUP -0xC5DD 0xD15F #HANGUL SYLLABLE THIEUTH E SIOS -0xC5DE 0xD161 #HANGUL SYLLABLE THIEUTH E IEUNG -0xC5DF 0xD168 #HANGUL SYLLABLE THIEUTH YEO -0xC5E0 0xD16C #HANGUL SYLLABLE THIEUTH YEO NIEUN -0xC5E1 0xD17C #HANGUL SYLLABLE THIEUTH YEO SSANGSIOS -0xC5E2 0xD184 #HANGUL SYLLABLE THIEUTH YE -0xC5E3 0xD188 #HANGUL SYLLABLE THIEUTH YE NIEUN -0xC5E4 0xD1A0 #HANGUL SYLLABLE THIEUTH O -0xC5E5 0xD1A1 #HANGUL SYLLABLE THIEUTH O KIYEOK -0xC5E6 0xD1A4 #HANGUL SYLLABLE THIEUTH O NIEUN -0xC5E7 0xD1A8 #HANGUL SYLLABLE THIEUTH O RIEUL -0xC5E8 0xD1B0 #HANGUL SYLLABLE THIEUTH O MIEUM -0xC5E9 0xD1B1 #HANGUL SYLLABLE THIEUTH O PIEUP -0xC5EA 0xD1B3 #HANGUL SYLLABLE THIEUTH O SIOS -0xC5EB 0xD1B5 #HANGUL SYLLABLE THIEUTH O IEUNG -0xC5EC 0xD1BA #HANGUL SYLLABLE THIEUTH O PHIEUPH -0xC5ED 0xD1BC #HANGUL SYLLABLE THIEUTH WA -0xC5EE 0xD1C0 #HANGUL SYLLABLE THIEUTH WA NIEUN -0xC5EF 0xD1D8 #HANGUL SYLLABLE THIEUTH WAE -0xC5F0 0xD1F4 #HANGUL SYLLABLE THIEUTH OE -0xC5F1 0xD1F8 #HANGUL SYLLABLE THIEUTH OE NIEUN -0xC5F2 0xD207 #HANGUL SYLLABLE THIEUTH OE SIOS -0xC5F3 0xD209 #HANGUL SYLLABLE THIEUTH OE IEUNG -0xC5F4 0xD210 #HANGUL SYLLABLE THIEUTH YO -0xC5F5 0xD22C #HANGUL SYLLABLE THIEUTH U -0xC5F6 0xD22D #HANGUL SYLLABLE THIEUTH U KIYEOK -0xC5F7 0xD230 #HANGUL SYLLABLE THIEUTH U NIEUN -0xC5F8 0xD234 #HANGUL SYLLABLE THIEUTH U RIEUL -0xC5F9 0xD23C #HANGUL SYLLABLE THIEUTH U MIEUM -0xC5FA 0xD23D #HANGUL SYLLABLE THIEUTH U PIEUP -0xC5FB 0xD23F #HANGUL SYLLABLE THIEUTH U SIOS -0xC5FC 0xD241 #HANGUL SYLLABLE THIEUTH U IEUNG -0xC5FD 0xD248 #HANGUL SYLLABLE THIEUTH WEO -0xC5FE 0xD25C #HANGUL SYLLABLE THIEUTH WEO SSANGSIOS -0xC641 0xD78D #HANGUL SYLLABLE HIEUH I NIEUNCIEUC -0xC642 0xD78E #HANGUL SYLLABLE HIEUH I NIEUNHIEUH -0xC643 0xD78F #HANGUL SYLLABLE HIEUH I TIKEUT -0xC644 0xD791 #HANGUL SYLLABLE HIEUH I RIEULKIYEOK -0xC645 0xD792 #HANGUL SYLLABLE HIEUH I RIEULMIEUM -0xC646 0xD793 #HANGUL SYLLABLE HIEUH I RIEULPIEUP -0xC647 0xD794 #HANGUL SYLLABLE HIEUH I RIEULSIOS -0xC648 0xD795 #HANGUL SYLLABLE HIEUH I RIEULTHIEUTH -0xC649 0xD796 #HANGUL SYLLABLE HIEUH I RIEULPHIEUPH -0xC64A 0xD797 #HANGUL SYLLABLE HIEUH I RIEULHIEUH -0xC64B 0xD79A #HANGUL SYLLABLE HIEUH I PIEUPSIOS -0xC64C 0xD79C #HANGUL SYLLABLE HIEUH I SSANGSIOS -0xC64D 0xD79E #HANGUL SYLLABLE HIEUH I CIEUC -0xC64E 0xD79F #HANGUL SYLLABLE HIEUH I CHIEUCH -0xC64F 0xD7A0 #HANGUL SYLLABLE HIEUH I KHIEUKH -0xC650 0xD7A1 #HANGUL SYLLABLE HIEUH I THIEUTH -0xC651 0xD7A2 #HANGUL SYLLABLE HIEUH I PHIEUPH -0xC652 0xD7A3 #HANGUL SYLLABLE HIEUH I HIEUH -0xC6A1 0xD264 #HANGUL SYLLABLE THIEUTH WE -0xC6A2 0xD280 #HANGUL SYLLABLE THIEUTH WI -0xC6A3 0xD281 #HANGUL SYLLABLE THIEUTH WI KIYEOK -0xC6A4 0xD284 #HANGUL SYLLABLE THIEUTH WI NIEUN -0xC6A5 0xD288 #HANGUL SYLLABLE THIEUTH WI RIEUL -0xC6A6 0xD290 #HANGUL SYLLABLE THIEUTH WI MIEUM -0xC6A7 0xD291 #HANGUL SYLLABLE THIEUTH WI PIEUP -0xC6A8 0xD295 #HANGUL SYLLABLE THIEUTH WI IEUNG -0xC6A9 0xD29C #HANGUL SYLLABLE THIEUTH YU -0xC6AA 0xD2A0 #HANGUL SYLLABLE THIEUTH YU NIEUN -0xC6AB 0xD2A4 #HANGUL SYLLABLE THIEUTH YU RIEUL -0xC6AC 0xD2AC #HANGUL SYLLABLE THIEUTH YU MIEUM -0xC6AD 0xD2B1 #HANGUL SYLLABLE THIEUTH YU IEUNG -0xC6AE 0xD2B8 #HANGUL SYLLABLE THIEUTH EU -0xC6AF 0xD2B9 #HANGUL SYLLABLE THIEUTH EU KIYEOK -0xC6B0 0xD2BC #HANGUL SYLLABLE THIEUTH EU NIEUN -0xC6B1 0xD2BF #HANGUL SYLLABLE THIEUTH EU TIKEUT -0xC6B2 0xD2C0 #HANGUL SYLLABLE THIEUTH EU RIEUL -0xC6B3 0xD2C2 #HANGUL SYLLABLE THIEUTH EU RIEULMIEUM -0xC6B4 0xD2C8 #HANGUL SYLLABLE THIEUTH EU MIEUM -0xC6B5 0xD2C9 #HANGUL SYLLABLE THIEUTH EU PIEUP -0xC6B6 0xD2CB #HANGUL SYLLABLE THIEUTH EU SIOS -0xC6B7 0xD2D4 #HANGUL SYLLABLE THIEUTH YI -0xC6B8 0xD2D8 #HANGUL SYLLABLE THIEUTH YI NIEUN -0xC6B9 0xD2DC #HANGUL SYLLABLE THIEUTH YI RIEUL -0xC6BA 0xD2E4 #HANGUL SYLLABLE THIEUTH YI MIEUM -0xC6BB 0xD2E5 #HANGUL SYLLABLE THIEUTH YI PIEUP -0xC6BC 0xD2F0 #HANGUL SYLLABLE THIEUTH I -0xC6BD 0xD2F1 #HANGUL SYLLABLE THIEUTH I KIYEOK -0xC6BE 0xD2F4 #HANGUL SYLLABLE THIEUTH I NIEUN -0xC6BF 0xD2F8 #HANGUL SYLLABLE THIEUTH I RIEUL -0xC6C0 0xD300 #HANGUL SYLLABLE THIEUTH I MIEUM -0xC6C1 0xD301 #HANGUL SYLLABLE THIEUTH I PIEUP -0xC6C2 0xD303 #HANGUL SYLLABLE THIEUTH I SIOS -0xC6C3 0xD305 #HANGUL SYLLABLE THIEUTH I IEUNG -0xC6C4 0xD30C #HANGUL SYLLABLE PHIEUPH A -0xC6C5 0xD30D #HANGUL SYLLABLE PHIEUPH A KIYEOK -0xC6C6 0xD30E #HANGUL SYLLABLE PHIEUPH A SSANGKIYEOK -0xC6C7 0xD310 #HANGUL SYLLABLE PHIEUPH A NIEUN -0xC6C8 0xD314 #HANGUL SYLLABLE PHIEUPH A RIEUL -0xC6C9 0xD316 #HANGUL SYLLABLE PHIEUPH A RIEULMIEUM -0xC6CA 0xD31C #HANGUL SYLLABLE PHIEUPH A MIEUM -0xC6CB 0xD31D #HANGUL SYLLABLE PHIEUPH A PIEUP -0xC6CC 0xD31F #HANGUL SYLLABLE PHIEUPH A SIOS -0xC6CD 0xD320 #HANGUL SYLLABLE PHIEUPH A SSANGSIOS -0xC6CE 0xD321 #HANGUL SYLLABLE PHIEUPH A IEUNG -0xC6CF 0xD325 #HANGUL SYLLABLE PHIEUPH A THIEUTH -0xC6D0 0xD328 #HANGUL SYLLABLE PHIEUPH AE -0xC6D1 0xD329 #HANGUL SYLLABLE PHIEUPH AE KIYEOK -0xC6D2 0xD32C #HANGUL SYLLABLE PHIEUPH AE NIEUN -0xC6D3 0xD330 #HANGUL SYLLABLE PHIEUPH AE RIEUL -0xC6D4 0xD338 #HANGUL SYLLABLE PHIEUPH AE MIEUM -0xC6D5 0xD339 #HANGUL SYLLABLE PHIEUPH AE PIEUP -0xC6D6 0xD33B #HANGUL SYLLABLE PHIEUPH AE SIOS -0xC6D7 0xD33C #HANGUL SYLLABLE PHIEUPH AE SSANGSIOS -0xC6D8 0xD33D #HANGUL SYLLABLE PHIEUPH AE IEUNG -0xC6D9 0xD344 #HANGUL SYLLABLE PHIEUPH YA -0xC6DA 0xD345 #HANGUL SYLLABLE PHIEUPH YA KIYEOK -0xC6DB 0xD37C #HANGUL SYLLABLE PHIEUPH EO -0xC6DC 0xD37D #HANGUL SYLLABLE PHIEUPH EO KIYEOK -0xC6DD 0xD380 #HANGUL SYLLABLE PHIEUPH EO NIEUN -0xC6DE 0xD384 #HANGUL SYLLABLE PHIEUPH EO RIEUL -0xC6DF 0xD38C #HANGUL SYLLABLE PHIEUPH EO MIEUM -0xC6E0 0xD38D #HANGUL SYLLABLE PHIEUPH EO PIEUP -0xC6E1 0xD38F #HANGUL SYLLABLE PHIEUPH EO SIOS -0xC6E2 0xD390 #HANGUL SYLLABLE PHIEUPH EO SSANGSIOS -0xC6E3 0xD391 #HANGUL SYLLABLE PHIEUPH EO IEUNG -0xC6E4 0xD398 #HANGUL SYLLABLE PHIEUPH E -0xC6E5 0xD399 #HANGUL SYLLABLE PHIEUPH E KIYEOK -0xC6E6 0xD39C #HANGUL SYLLABLE PHIEUPH E NIEUN -0xC6E7 0xD3A0 #HANGUL SYLLABLE PHIEUPH E RIEUL -0xC6E8 0xD3A8 #HANGUL SYLLABLE PHIEUPH E MIEUM -0xC6E9 0xD3A9 #HANGUL SYLLABLE PHIEUPH E PIEUP -0xC6EA 0xD3AB #HANGUL SYLLABLE PHIEUPH E SIOS -0xC6EB 0xD3AD #HANGUL SYLLABLE PHIEUPH E IEUNG -0xC6EC 0xD3B4 #HANGUL SYLLABLE PHIEUPH YEO -0xC6ED 0xD3B8 #HANGUL SYLLABLE PHIEUPH YEO NIEUN -0xC6EE 0xD3BC #HANGUL SYLLABLE PHIEUPH YEO RIEUL -0xC6EF 0xD3C4 #HANGUL SYLLABLE PHIEUPH YEO MIEUM -0xC6F0 0xD3C5 #HANGUL SYLLABLE PHIEUPH YEO PIEUP -0xC6F1 0xD3C8 #HANGUL SYLLABLE PHIEUPH YEO SSANGSIOS -0xC6F2 0xD3C9 #HANGUL SYLLABLE PHIEUPH YEO IEUNG -0xC6F3 0xD3D0 #HANGUL SYLLABLE PHIEUPH YE -0xC6F4 0xD3D8 #HANGUL SYLLABLE PHIEUPH YE RIEUL -0xC6F5 0xD3E1 #HANGUL SYLLABLE PHIEUPH YE PIEUP -0xC6F6 0xD3E3 #HANGUL SYLLABLE PHIEUPH YE SIOS -0xC6F7 0xD3EC #HANGUL SYLLABLE PHIEUPH O -0xC6F8 0xD3ED #HANGUL SYLLABLE PHIEUPH O KIYEOK -0xC6F9 0xD3F0 #HANGUL SYLLABLE PHIEUPH O NIEUN -0xC6FA 0xD3F4 #HANGUL SYLLABLE PHIEUPH O RIEUL -0xC6FB 0xD3FC #HANGUL SYLLABLE PHIEUPH O MIEUM -0xC6FC 0xD3FD #HANGUL SYLLABLE PHIEUPH O PIEUP -0xC6FD 0xD3FF #HANGUL SYLLABLE PHIEUPH O SIOS -0xC6FE 0xD401 #HANGUL SYLLABLE PHIEUPH O IEUNG -0xC7A1 0xD408 #HANGUL SYLLABLE PHIEUPH WA -0xC7A2 0xD41D #HANGUL SYLLABLE PHIEUPH WA IEUNG -0xC7A3 0xD440 #HANGUL SYLLABLE PHIEUPH OE -0xC7A4 0xD444 #HANGUL SYLLABLE PHIEUPH OE NIEUN -0xC7A5 0xD45C #HANGUL SYLLABLE PHIEUPH YO -0xC7A6 0xD460 #HANGUL SYLLABLE PHIEUPH YO NIEUN -0xC7A7 0xD464 #HANGUL SYLLABLE PHIEUPH YO RIEUL -0xC7A8 0xD46D #HANGUL SYLLABLE PHIEUPH YO PIEUP -0xC7A9 0xD46F #HANGUL SYLLABLE PHIEUPH YO SIOS -0xC7AA 0xD478 #HANGUL SYLLABLE PHIEUPH U -0xC7AB 0xD479 #HANGUL SYLLABLE PHIEUPH U KIYEOK -0xC7AC 0xD47C #HANGUL SYLLABLE PHIEUPH U NIEUN -0xC7AD 0xD47F #HANGUL SYLLABLE PHIEUPH U TIKEUT -0xC7AE 0xD480 #HANGUL SYLLABLE PHIEUPH U RIEUL -0xC7AF 0xD482 #HANGUL SYLLABLE PHIEUPH U RIEULMIEUM -0xC7B0 0xD488 #HANGUL SYLLABLE PHIEUPH U MIEUM -0xC7B1 0xD489 #HANGUL SYLLABLE PHIEUPH U PIEUP -0xC7B2 0xD48B #HANGUL SYLLABLE PHIEUPH U SIOS -0xC7B3 0xD48D #HANGUL SYLLABLE PHIEUPH U IEUNG -0xC7B4 0xD494 #HANGUL SYLLABLE PHIEUPH WEO -0xC7B5 0xD4A9 #HANGUL SYLLABLE PHIEUPH WEO IEUNG -0xC7B6 0xD4CC #HANGUL SYLLABLE PHIEUPH WI -0xC7B7 0xD4D0 #HANGUL SYLLABLE PHIEUPH WI NIEUN -0xC7B8 0xD4D4 #HANGUL SYLLABLE PHIEUPH WI RIEUL -0xC7B9 0xD4DC #HANGUL SYLLABLE PHIEUPH WI MIEUM -0xC7BA 0xD4DF #HANGUL SYLLABLE PHIEUPH WI SIOS -0xC7BB 0xD4E8 #HANGUL SYLLABLE PHIEUPH YU -0xC7BC 0xD4EC #HANGUL SYLLABLE PHIEUPH YU NIEUN -0xC7BD 0xD4F0 #HANGUL SYLLABLE PHIEUPH YU RIEUL -0xC7BE 0xD4F8 #HANGUL SYLLABLE PHIEUPH YU MIEUM -0xC7BF 0xD4FB #HANGUL SYLLABLE PHIEUPH YU SIOS -0xC7C0 0xD4FD #HANGUL SYLLABLE PHIEUPH YU IEUNG -0xC7C1 0xD504 #HANGUL SYLLABLE PHIEUPH EU -0xC7C2 0xD508 #HANGUL SYLLABLE PHIEUPH EU NIEUN -0xC7C3 0xD50C #HANGUL SYLLABLE PHIEUPH EU RIEUL -0xC7C4 0xD514 #HANGUL SYLLABLE PHIEUPH EU MIEUM -0xC7C5 0xD515 #HANGUL SYLLABLE PHIEUPH EU PIEUP -0xC7C6 0xD517 #HANGUL SYLLABLE PHIEUPH EU SIOS -0xC7C7 0xD53C #HANGUL SYLLABLE PHIEUPH I -0xC7C8 0xD53D #HANGUL SYLLABLE PHIEUPH I KIYEOK -0xC7C9 0xD540 #HANGUL SYLLABLE PHIEUPH I NIEUN -0xC7CA 0xD544 #HANGUL SYLLABLE PHIEUPH I RIEUL -0xC7CB 0xD54C #HANGUL SYLLABLE PHIEUPH I MIEUM -0xC7CC 0xD54D #HANGUL SYLLABLE PHIEUPH I PIEUP -0xC7CD 0xD54F #HANGUL SYLLABLE PHIEUPH I SIOS -0xC7CE 0xD551 #HANGUL SYLLABLE PHIEUPH I IEUNG -0xC7CF 0xD558 #HANGUL SYLLABLE HIEUH A -0xC7D0 0xD559 #HANGUL SYLLABLE HIEUH A KIYEOK -0xC7D1 0xD55C #HANGUL SYLLABLE HIEUH A NIEUN -0xC7D2 0xD560 #HANGUL SYLLABLE HIEUH A RIEUL -0xC7D3 0xD565 #HANGUL SYLLABLE HIEUH A RIEULTHIEUTH -0xC7D4 0xD568 #HANGUL SYLLABLE HIEUH A MIEUM -0xC7D5 0xD569 #HANGUL SYLLABLE HIEUH A PIEUP -0xC7D6 0xD56B #HANGUL SYLLABLE HIEUH A SIOS -0xC7D7 0xD56D #HANGUL SYLLABLE HIEUH A IEUNG -0xC7D8 0xD574 #HANGUL SYLLABLE HIEUH AE -0xC7D9 0xD575 #HANGUL SYLLABLE HIEUH AE KIYEOK -0xC7DA 0xD578 #HANGUL SYLLABLE HIEUH AE NIEUN -0xC7DB 0xD57C #HANGUL SYLLABLE HIEUH AE RIEUL -0xC7DC 0xD584 #HANGUL SYLLABLE HIEUH AE MIEUM -0xC7DD 0xD585 #HANGUL SYLLABLE HIEUH AE PIEUP -0xC7DE 0xD587 #HANGUL SYLLABLE HIEUH AE SIOS -0xC7DF 0xD588 #HANGUL SYLLABLE HIEUH AE SSANGSIOS -0xC7E0 0xD589 #HANGUL SYLLABLE HIEUH AE IEUNG -0xC7E1 0xD590 #HANGUL SYLLABLE HIEUH YA -0xC7E2 0xD5A5 #HANGUL SYLLABLE HIEUH YA IEUNG -0xC7E3 0xD5C8 #HANGUL SYLLABLE HIEUH EO -0xC7E4 0xD5C9 #HANGUL SYLLABLE HIEUH EO KIYEOK -0xC7E5 0xD5CC #HANGUL SYLLABLE HIEUH EO NIEUN -0xC7E6 0xD5D0 #HANGUL SYLLABLE HIEUH EO RIEUL -0xC7E7 0xD5D2 #HANGUL SYLLABLE HIEUH EO RIEULMIEUM -0xC7E8 0xD5D8 #HANGUL SYLLABLE HIEUH EO MIEUM -0xC7E9 0xD5D9 #HANGUL SYLLABLE HIEUH EO PIEUP -0xC7EA 0xD5DB #HANGUL SYLLABLE HIEUH EO SIOS -0xC7EB 0xD5DD #HANGUL SYLLABLE HIEUH EO IEUNG -0xC7EC 0xD5E4 #HANGUL SYLLABLE HIEUH E -0xC7ED 0xD5E5 #HANGUL SYLLABLE HIEUH E KIYEOK -0xC7EE 0xD5E8 #HANGUL SYLLABLE HIEUH E NIEUN -0xC7EF 0xD5EC #HANGUL SYLLABLE HIEUH E RIEUL -0xC7F0 0xD5F4 #HANGUL SYLLABLE HIEUH E MIEUM -0xC7F1 0xD5F5 #HANGUL SYLLABLE HIEUH E PIEUP -0xC7F2 0xD5F7 #HANGUL SYLLABLE HIEUH E SIOS -0xC7F3 0xD5F9 #HANGUL SYLLABLE HIEUH E IEUNG -0xC7F4 0xD600 #HANGUL SYLLABLE HIEUH YEO -0xC7F5 0xD601 #HANGUL SYLLABLE HIEUH YEO KIYEOK -0xC7F6 0xD604 #HANGUL SYLLABLE HIEUH YEO NIEUN -0xC7F7 0xD608 #HANGUL SYLLABLE HIEUH YEO RIEUL -0xC7F8 0xD610 #HANGUL SYLLABLE HIEUH YEO MIEUM -0xC7F9 0xD611 #HANGUL SYLLABLE HIEUH YEO PIEUP -0xC7FA 0xD613 #HANGUL SYLLABLE HIEUH YEO SIOS -0xC7FB 0xD614 #HANGUL SYLLABLE HIEUH YEO SSANGSIOS -0xC7FC 0xD615 #HANGUL SYLLABLE HIEUH YEO IEUNG -0xC7FD 0xD61C #HANGUL SYLLABLE HIEUH YE -0xC7FE 0xD620 #HANGUL SYLLABLE HIEUH YE NIEUN -0xC8A1 0xD624 #HANGUL SYLLABLE HIEUH YE RIEUL -0xC8A2 0xD62D #HANGUL SYLLABLE HIEUH YE PIEUP -0xC8A3 0xD638 #HANGUL SYLLABLE HIEUH O -0xC8A4 0xD639 #HANGUL SYLLABLE HIEUH O KIYEOK -0xC8A5 0xD63C #HANGUL SYLLABLE HIEUH O NIEUN -0xC8A6 0xD640 #HANGUL SYLLABLE HIEUH O RIEUL -0xC8A7 0xD645 #HANGUL SYLLABLE HIEUH O RIEULTHIEUTH -0xC8A8 0xD648 #HANGUL SYLLABLE HIEUH O MIEUM -0xC8A9 0xD649 #HANGUL SYLLABLE HIEUH O PIEUP -0xC8AA 0xD64B #HANGUL SYLLABLE HIEUH O SIOS -0xC8AB 0xD64D #HANGUL SYLLABLE HIEUH O IEUNG -0xC8AC 0xD651 #HANGUL SYLLABLE HIEUH O THIEUTH -0xC8AD 0xD654 #HANGUL SYLLABLE HIEUH WA -0xC8AE 0xD655 #HANGUL SYLLABLE HIEUH WA KIYEOK -0xC8AF 0xD658 #HANGUL SYLLABLE HIEUH WA NIEUN -0xC8B0 0xD65C #HANGUL SYLLABLE HIEUH WA RIEUL -0xC8B1 0xD667 #HANGUL SYLLABLE HIEUH WA SIOS -0xC8B2 0xD669 #HANGUL SYLLABLE HIEUH WA IEUNG -0xC8B3 0xD670 #HANGUL SYLLABLE HIEUH WAE -0xC8B4 0xD671 #HANGUL SYLLABLE HIEUH WAE KIYEOK -0xC8B5 0xD674 #HANGUL SYLLABLE HIEUH WAE NIEUN -0xC8B6 0xD683 #HANGUL SYLLABLE HIEUH WAE SIOS -0xC8B7 0xD685 #HANGUL SYLLABLE HIEUH WAE IEUNG -0xC8B8 0xD68C #HANGUL SYLLABLE HIEUH OE -0xC8B9 0xD68D #HANGUL SYLLABLE HIEUH OE KIYEOK -0xC8BA 0xD690 #HANGUL SYLLABLE HIEUH OE NIEUN -0xC8BB 0xD694 #HANGUL SYLLABLE HIEUH OE RIEUL -0xC8BC 0xD69D #HANGUL SYLLABLE HIEUH OE PIEUP -0xC8BD 0xD69F #HANGUL SYLLABLE HIEUH OE SIOS -0xC8BE 0xD6A1 #HANGUL SYLLABLE HIEUH OE IEUNG -0xC8BF 0xD6A8 #HANGUL SYLLABLE HIEUH YO -0xC8C0 0xD6AC #HANGUL SYLLABLE HIEUH YO NIEUN -0xC8C1 0xD6B0 #HANGUL SYLLABLE HIEUH YO RIEUL -0xC8C2 0xD6B9 #HANGUL SYLLABLE HIEUH YO PIEUP -0xC8C3 0xD6BB #HANGUL SYLLABLE HIEUH YO SIOS -0xC8C4 0xD6C4 #HANGUL SYLLABLE HIEUH U -0xC8C5 0xD6C5 #HANGUL SYLLABLE HIEUH U KIYEOK -0xC8C6 0xD6C8 #HANGUL SYLLABLE HIEUH U NIEUN -0xC8C7 0xD6CC #HANGUL SYLLABLE HIEUH U RIEUL -0xC8C8 0xD6D1 #HANGUL SYLLABLE HIEUH U RIEULTHIEUTH -0xC8C9 0xD6D4 #HANGUL SYLLABLE HIEUH U MIEUM -0xC8CA 0xD6D7 #HANGUL SYLLABLE HIEUH U SIOS -0xC8CB 0xD6D9 #HANGUL SYLLABLE HIEUH U IEUNG -0xC8CC 0xD6E0 #HANGUL SYLLABLE HIEUH WEO -0xC8CD 0xD6E4 #HANGUL SYLLABLE HIEUH WEO NIEUN -0xC8CE 0xD6E8 #HANGUL SYLLABLE HIEUH WEO RIEUL -0xC8CF 0xD6F0 #HANGUL SYLLABLE HIEUH WEO MIEUM -0xC8D0 0xD6F5 #HANGUL SYLLABLE HIEUH WEO IEUNG -0xC8D1 0xD6FC #HANGUL SYLLABLE HIEUH WE -0xC8D2 0xD6FD #HANGUL SYLLABLE HIEUH WE KIYEOK -0xC8D3 0xD700 #HANGUL SYLLABLE HIEUH WE NIEUN -0xC8D4 0xD704 #HANGUL SYLLABLE HIEUH WE RIEUL -0xC8D5 0xD711 #HANGUL SYLLABLE HIEUH WE IEUNG -0xC8D6 0xD718 #HANGUL SYLLABLE HIEUH WI -0xC8D7 0xD719 #HANGUL SYLLABLE HIEUH WI KIYEOK -0xC8D8 0xD71C #HANGUL SYLLABLE HIEUH WI NIEUN -0xC8D9 0xD720 #HANGUL SYLLABLE HIEUH WI RIEUL -0xC8DA 0xD728 #HANGUL SYLLABLE HIEUH WI MIEUM -0xC8DB 0xD729 #HANGUL SYLLABLE HIEUH WI PIEUP -0xC8DC 0xD72B #HANGUL SYLLABLE HIEUH WI SIOS -0xC8DD 0xD72D #HANGUL SYLLABLE HIEUH WI IEUNG -0xC8DE 0xD734 #HANGUL SYLLABLE HIEUH YU -0xC8DF 0xD735 #HANGUL SYLLABLE HIEUH YU KIYEOK -0xC8E0 0xD738 #HANGUL SYLLABLE HIEUH YU NIEUN -0xC8E1 0xD73C #HANGUL SYLLABLE HIEUH YU RIEUL -0xC8E2 0xD744 #HANGUL SYLLABLE HIEUH YU MIEUM -0xC8E3 0xD747 #HANGUL SYLLABLE HIEUH YU SIOS -0xC8E4 0xD749 #HANGUL SYLLABLE HIEUH YU IEUNG -0xC8E5 0xD750 #HANGUL SYLLABLE HIEUH EU -0xC8E6 0xD751 #HANGUL SYLLABLE HIEUH EU KIYEOK -0xC8E7 0xD754 #HANGUL SYLLABLE HIEUH EU NIEUN -0xC8E8 0xD756 #HANGUL SYLLABLE HIEUH EU NIEUNHIEUH -0xC8E9 0xD757 #HANGUL SYLLABLE HIEUH EU TIKEUT -0xC8EA 0xD758 #HANGUL SYLLABLE HIEUH EU RIEUL -0xC8EB 0xD759 #HANGUL SYLLABLE HIEUH EU RIEULKIYEOK -0xC8EC 0xD760 #HANGUL SYLLABLE HIEUH EU MIEUM -0xC8ED 0xD761 #HANGUL SYLLABLE HIEUH EU PIEUP -0xC8EE 0xD763 #HANGUL SYLLABLE HIEUH EU SIOS -0xC8EF 0xD765 #HANGUL SYLLABLE HIEUH EU IEUNG -0xC8F0 0xD769 #HANGUL SYLLABLE HIEUH EU THIEUTH -0xC8F1 0xD76C #HANGUL SYLLABLE HIEUH YI -0xC8F2 0xD770 #HANGUL SYLLABLE HIEUH YI NIEUN -0xC8F3 0xD774 #HANGUL SYLLABLE HIEUH YI RIEUL -0xC8F4 0xD77C #HANGUL SYLLABLE HIEUH YI MIEUM -0xC8F5 0xD77D #HANGUL SYLLABLE HIEUH YI PIEUP -0xC8F6 0xD781 #HANGUL SYLLABLE HIEUH YI IEUNG -0xC8F7 0xD788 #HANGUL SYLLABLE HIEUH I -0xC8F8 0xD789 #HANGUL SYLLABLE HIEUH I KIYEOK -0xC8F9 0xD78C #HANGUL SYLLABLE HIEUH I NIEUN -0xC8FA 0xD790 #HANGUL SYLLABLE HIEUH I RIEUL -0xC8FB 0xD798 #HANGUL SYLLABLE HIEUH I MIEUM -0xC8FC 0xD799 #HANGUL SYLLABLE HIEUH I PIEUP -0xC8FD 0xD79B #HANGUL SYLLABLE HIEUH I SIOS -0xC8FE 0xD79D #HANGUL SYLLABLE HIEUH I IEUNG -0xCAA1 0x4F3D #CJK UNIFIED IDEOGRAPH -0xCAA2 0x4F73 #CJK UNIFIED IDEOGRAPH -0xCAA3 0x5047 #CJK UNIFIED IDEOGRAPH -0xCAA4 0x50F9 #CJK UNIFIED IDEOGRAPH -0xCAA5 0x52A0 #CJK UNIFIED IDEOGRAPH -0xCAA6 0x53EF #CJK UNIFIED IDEOGRAPH -0xCAA7 0x5475 #CJK UNIFIED IDEOGRAPH -0xCAA8 0x54E5 #CJK UNIFIED IDEOGRAPH -0xCAA9 0x5609 #CJK UNIFIED IDEOGRAPH -0xCAAA 0x5AC1 #CJK UNIFIED IDEOGRAPH -0xCAAB 0x5BB6 #CJK UNIFIED IDEOGRAPH -0xCAAC 0x6687 #CJK UNIFIED IDEOGRAPH -0xCAAD 0x67B6 #CJK UNIFIED IDEOGRAPH -0xCAAE 0x67B7 #CJK UNIFIED IDEOGRAPH -0xCAAF 0x67EF #CJK UNIFIED IDEOGRAPH -0xCAB0 0x6B4C #CJK UNIFIED IDEOGRAPH -0xCAB1 0x73C2 #CJK UNIFIED IDEOGRAPH -0xCAB2 0x75C2 #CJK UNIFIED IDEOGRAPH -0xCAB3 0x7A3C #CJK UNIFIED IDEOGRAPH -0xCAB4 0x82DB #CJK UNIFIED IDEOGRAPH -0xCAB5 0x8304 #CJK UNIFIED IDEOGRAPH -0xCAB6 0x8857 #CJK UNIFIED IDEOGRAPH -0xCAB7 0x8888 #CJK UNIFIED IDEOGRAPH -0xCAB8 0x8A36 #CJK UNIFIED IDEOGRAPH -0xCAB9 0x8CC8 #CJK UNIFIED IDEOGRAPH -0xCABA 0x8DCF #CJK UNIFIED IDEOGRAPH -0xCABB 0x8EFB #CJK UNIFIED IDEOGRAPH -0xCABC 0x8FE6 #CJK UNIFIED IDEOGRAPH -0xCABD 0x99D5 #CJK UNIFIED IDEOGRAPH -0xCABE 0x523B #CJK UNIFIED IDEOGRAPH -0xCABF 0x5374 #CJK UNIFIED IDEOGRAPH -0xCAC0 0x5404 #CJK UNIFIED IDEOGRAPH -0xCAC1 0x606A #CJK UNIFIED IDEOGRAPH -0xCAC2 0x6164 #CJK UNIFIED IDEOGRAPH -0xCAC3 0x6BBC #CJK UNIFIED IDEOGRAPH -0xCAC4 0x73CF #CJK UNIFIED IDEOGRAPH -0xCAC5 0x811A #CJK UNIFIED IDEOGRAPH -0xCAC6 0x89BA #CJK UNIFIED IDEOGRAPH -0xCAC7 0x89D2 #CJK UNIFIED IDEOGRAPH -0xCAC8 0x95A3 #CJK UNIFIED IDEOGRAPH -0xCAC9 0x4F83 #CJK UNIFIED IDEOGRAPH -0xCACA 0x520A #CJK UNIFIED IDEOGRAPH -0xCACB 0x58BE #CJK UNIFIED IDEOGRAPH -0xCACC 0x5978 #CJK UNIFIED IDEOGRAPH -0xCACD 0x59E6 #CJK UNIFIED IDEOGRAPH -0xCACE 0x5E72 #CJK UNIFIED IDEOGRAPH -0xCACF 0x5E79 #CJK UNIFIED IDEOGRAPH -0xCAD0 0x61C7 #CJK UNIFIED IDEOGRAPH -0xCAD1 0x63C0 #CJK UNIFIED IDEOGRAPH -0xCAD2 0x6746 #CJK UNIFIED IDEOGRAPH -0xCAD3 0x67EC #CJK UNIFIED IDEOGRAPH -0xCAD4 0x687F #CJK UNIFIED IDEOGRAPH -0xCAD5 0x6F97 #CJK UNIFIED IDEOGRAPH -0xCAD6 0x764E #CJK UNIFIED IDEOGRAPH -0xCAD7 0x770B #CJK UNIFIED IDEOGRAPH -0xCAD8 0x78F5 #CJK UNIFIED IDEOGRAPH -0xCAD9 0x7A08 #CJK UNIFIED IDEOGRAPH -0xCADA 0x7AFF #CJK UNIFIED IDEOGRAPH -0xCADB 0x7C21 #CJK UNIFIED IDEOGRAPH -0xCADC 0x809D #CJK UNIFIED IDEOGRAPH -0xCADD 0x826E #CJK UNIFIED IDEOGRAPH -0xCADE 0x8271 #CJK UNIFIED IDEOGRAPH -0xCADF 0x8AEB #CJK UNIFIED IDEOGRAPH -0xCAE0 0x9593 #CJK UNIFIED IDEOGRAPH -0xCAE1 0x4E6B #CJK UNIFIED IDEOGRAPH -0xCAE2 0x559D #CJK UNIFIED IDEOGRAPH -0xCAE3 0x66F7 #CJK UNIFIED IDEOGRAPH -0xCAE4 0x6E34 #CJK UNIFIED IDEOGRAPH -0xCAE5 0x78A3 #CJK UNIFIED IDEOGRAPH -0xCAE6 0x7AED #CJK UNIFIED IDEOGRAPH -0xCAE7 0x845B #CJK UNIFIED IDEOGRAPH -0xCAE8 0x8910 #CJK UNIFIED IDEOGRAPH -0xCAE9 0x874E #CJK UNIFIED IDEOGRAPH -0xCAEA 0x97A8 #CJK UNIFIED IDEOGRAPH -0xCAEB 0x52D8 #CJK UNIFIED IDEOGRAPH -0xCAEC 0x574E #CJK UNIFIED IDEOGRAPH -0xCAED 0x582A #CJK UNIFIED IDEOGRAPH -0xCAEE 0x5D4C #CJK UNIFIED IDEOGRAPH -0xCAEF 0x611F #CJK UNIFIED IDEOGRAPH -0xCAF0 0x61BE #CJK UNIFIED IDEOGRAPH -0xCAF1 0x6221 #CJK UNIFIED IDEOGRAPH -0xCAF2 0x6562 #CJK UNIFIED IDEOGRAPH -0xCAF3 0x67D1 #CJK UNIFIED IDEOGRAPH -0xCAF4 0x6A44 #CJK UNIFIED IDEOGRAPH -0xCAF5 0x6E1B #CJK UNIFIED IDEOGRAPH -0xCAF6 0x7518 #CJK UNIFIED IDEOGRAPH -0xCAF7 0x75B3 #CJK UNIFIED IDEOGRAPH -0xCAF8 0x76E3 #CJK UNIFIED IDEOGRAPH -0xCAF9 0x77B0 #CJK UNIFIED IDEOGRAPH -0xCAFA 0x7D3A #CJK UNIFIED IDEOGRAPH -0xCAFB 0x90AF #CJK UNIFIED IDEOGRAPH -0xCAFC 0x9451 #CJK UNIFIED IDEOGRAPH -0xCAFD 0x9452 #CJK UNIFIED IDEOGRAPH -0xCAFE 0x9F95 #CJK UNIFIED IDEOGRAPH -0xCBA1 0x5323 #CJK UNIFIED IDEOGRAPH -0xCBA2 0x5CAC #CJK UNIFIED IDEOGRAPH -0xCBA3 0x7532 #CJK UNIFIED IDEOGRAPH -0xCBA4 0x80DB #CJK UNIFIED IDEOGRAPH -0xCBA5 0x9240 #CJK UNIFIED IDEOGRAPH -0xCBA6 0x9598 #CJK UNIFIED IDEOGRAPH -0xCBA7 0x525B #CJK UNIFIED IDEOGRAPH -0xCBA8 0x5808 #CJK UNIFIED IDEOGRAPH -0xCBA9 0x59DC #CJK UNIFIED IDEOGRAPH -0xCBAA 0x5CA1 #CJK UNIFIED IDEOGRAPH -0xCBAB 0x5D17 #CJK UNIFIED IDEOGRAPH -0xCBAC 0x5EB7 #CJK UNIFIED IDEOGRAPH -0xCBAD 0x5F3A #CJK UNIFIED IDEOGRAPH -0xCBAE 0x5F4A #CJK UNIFIED IDEOGRAPH -0xCBAF 0x6177 #CJK UNIFIED IDEOGRAPH -0xCBB0 0x6C5F #CJK UNIFIED IDEOGRAPH -0xCBB1 0x757A #CJK UNIFIED IDEOGRAPH -0xCBB2 0x7586 #CJK UNIFIED IDEOGRAPH -0xCBB3 0x7CE0 #CJK UNIFIED IDEOGRAPH -0xCBB4 0x7D73 #CJK UNIFIED IDEOGRAPH -0xCBB5 0x7DB1 #CJK UNIFIED IDEOGRAPH -0xCBB6 0x7F8C #CJK UNIFIED IDEOGRAPH -0xCBB7 0x8154 #CJK UNIFIED IDEOGRAPH -0xCBB8 0x8221 #CJK UNIFIED IDEOGRAPH -0xCBB9 0x8591 #CJK UNIFIED IDEOGRAPH -0xCBBA 0x8941 #CJK UNIFIED IDEOGRAPH -0xCBBB 0x8B1B #CJK UNIFIED IDEOGRAPH -0xCBBC 0x92FC #CJK UNIFIED IDEOGRAPH -0xCBBD 0x964D #CJK UNIFIED IDEOGRAPH -0xCBBE 0x9C47 #CJK UNIFIED IDEOGRAPH -0xCBBF 0x4ECB #CJK UNIFIED IDEOGRAPH -0xCBC0 0x4EF7 #CJK UNIFIED IDEOGRAPH -0xCBC1 0x500B #CJK UNIFIED IDEOGRAPH -0xCBC2 0x51F1 #CJK UNIFIED IDEOGRAPH -0xCBC3 0x584F #CJK UNIFIED IDEOGRAPH -0xCBC4 0x6137 #CJK UNIFIED IDEOGRAPH -0xCBC5 0x613E #CJK UNIFIED IDEOGRAPH -0xCBC6 0x6168 #CJK UNIFIED IDEOGRAPH -0xCBC7 0x6539 #CJK UNIFIED IDEOGRAPH -0xCBC8 0x69EA #CJK UNIFIED IDEOGRAPH -0xCBC9 0x6F11 #CJK UNIFIED IDEOGRAPH -0xCBCA 0x75A5 #CJK UNIFIED IDEOGRAPH -0xCBCB 0x7686 #CJK UNIFIED IDEOGRAPH -0xCBCC 0x76D6 #CJK UNIFIED IDEOGRAPH -0xCBCD 0x7B87 #CJK UNIFIED IDEOGRAPH -0xCBCE 0x82A5 #CJK UNIFIED IDEOGRAPH -0xCBCF 0x84CB #CJK UNIFIED IDEOGRAPH -0xCBD0 0xF900 #CJK COMPATIBILITY IDEOGRAPH -0xCBD1 0x93A7 #CJK UNIFIED IDEOGRAPH -0xCBD2 0x958B #CJK UNIFIED IDEOGRAPH -0xCBD3 0x5580 #CJK UNIFIED IDEOGRAPH -0xCBD4 0x5BA2 #CJK UNIFIED IDEOGRAPH -0xCBD5 0x5751 #CJK UNIFIED IDEOGRAPH -0xCBD6 0xF901 #CJK COMPATIBILITY IDEOGRAPH -0xCBD7 0x7CB3 #CJK UNIFIED IDEOGRAPH -0xCBD8 0x7FB9 #CJK UNIFIED IDEOGRAPH -0xCBD9 0x91B5 #CJK UNIFIED IDEOGRAPH -0xCBDA 0x5028 #CJK UNIFIED IDEOGRAPH -0xCBDB 0x53BB #CJK UNIFIED IDEOGRAPH -0xCBDC 0x5C45 #CJK UNIFIED IDEOGRAPH -0xCBDD 0x5DE8 #CJK UNIFIED IDEOGRAPH -0xCBDE 0x62D2 #CJK UNIFIED IDEOGRAPH -0xCBDF 0x636E #CJK UNIFIED IDEOGRAPH -0xCBE0 0x64DA #CJK UNIFIED IDEOGRAPH -0xCBE1 0x64E7 #CJK UNIFIED IDEOGRAPH -0xCBE2 0x6E20 #CJK UNIFIED IDEOGRAPH -0xCBE3 0x70AC #CJK UNIFIED IDEOGRAPH -0xCBE4 0x795B #CJK UNIFIED IDEOGRAPH -0xCBE5 0x8DDD #CJK UNIFIED IDEOGRAPH -0xCBE6 0x8E1E #CJK UNIFIED IDEOGRAPH -0xCBE7 0xF902 #CJK COMPATIBILITY IDEOGRAPH -0xCBE8 0x907D #CJK UNIFIED IDEOGRAPH -0xCBE9 0x9245 #CJK UNIFIED IDEOGRAPH -0xCBEA 0x92F8 #CJK UNIFIED IDEOGRAPH -0xCBEB 0x4E7E #CJK UNIFIED IDEOGRAPH -0xCBEC 0x4EF6 #CJK UNIFIED IDEOGRAPH -0xCBED 0x5065 #CJK UNIFIED IDEOGRAPH -0xCBEE 0x5DFE #CJK UNIFIED IDEOGRAPH -0xCBEF 0x5EFA #CJK UNIFIED IDEOGRAPH -0xCBF0 0x6106 #CJK UNIFIED IDEOGRAPH -0xCBF1 0x6957 #CJK UNIFIED IDEOGRAPH -0xCBF2 0x8171 #CJK UNIFIED IDEOGRAPH -0xCBF3 0x8654 #CJK UNIFIED IDEOGRAPH -0xCBF4 0x8E47 #CJK UNIFIED IDEOGRAPH -0xCBF5 0x9375 #CJK UNIFIED IDEOGRAPH -0xCBF6 0x9A2B #CJK UNIFIED IDEOGRAPH -0xCBF7 0x4E5E #CJK UNIFIED IDEOGRAPH -0xCBF8 0x5091 #CJK UNIFIED IDEOGRAPH -0xCBF9 0x6770 #CJK UNIFIED IDEOGRAPH -0xCBFA 0x6840 #CJK UNIFIED IDEOGRAPH -0xCBFB 0x5109 #CJK UNIFIED IDEOGRAPH -0xCBFC 0x528D #CJK UNIFIED IDEOGRAPH -0xCBFD 0x5292 #CJK UNIFIED IDEOGRAPH -0xCBFE 0x6AA2 #CJK UNIFIED IDEOGRAPH -0xCCA1 0x77BC #CJK UNIFIED IDEOGRAPH -0xCCA2 0x9210 #CJK UNIFIED IDEOGRAPH -0xCCA3 0x9ED4 #CJK UNIFIED IDEOGRAPH -0xCCA4 0x52AB #CJK UNIFIED IDEOGRAPH -0xCCA5 0x602F #CJK UNIFIED IDEOGRAPH -0xCCA6 0x8FF2 #CJK UNIFIED IDEOGRAPH -0xCCA7 0x5048 #CJK UNIFIED IDEOGRAPH -0xCCA8 0x61A9 #CJK UNIFIED IDEOGRAPH -0xCCA9 0x63ED #CJK UNIFIED IDEOGRAPH -0xCCAA 0x64CA #CJK UNIFIED IDEOGRAPH -0xCCAB 0x683C #CJK UNIFIED IDEOGRAPH -0xCCAC 0x6A84 #CJK UNIFIED IDEOGRAPH -0xCCAD 0x6FC0 #CJK UNIFIED IDEOGRAPH -0xCCAE 0x8188 #CJK UNIFIED IDEOGRAPH -0xCCAF 0x89A1 #CJK UNIFIED IDEOGRAPH -0xCCB0 0x9694 #CJK UNIFIED IDEOGRAPH -0xCCB1 0x5805 #CJK UNIFIED IDEOGRAPH -0xCCB2 0x727D #CJK UNIFIED IDEOGRAPH -0xCCB3 0x72AC #CJK UNIFIED IDEOGRAPH -0xCCB4 0x7504 #CJK UNIFIED IDEOGRAPH -0xCCB5 0x7D79 #CJK UNIFIED IDEOGRAPH -0xCCB6 0x7E6D #CJK UNIFIED IDEOGRAPH -0xCCB7 0x80A9 #CJK UNIFIED IDEOGRAPH -0xCCB8 0x898B #CJK UNIFIED IDEOGRAPH -0xCCB9 0x8B74 #CJK UNIFIED IDEOGRAPH -0xCCBA 0x9063 #CJK UNIFIED IDEOGRAPH -0xCCBB 0x9D51 #CJK UNIFIED IDEOGRAPH -0xCCBC 0x6289 #CJK UNIFIED IDEOGRAPH -0xCCBD 0x6C7A #CJK UNIFIED IDEOGRAPH -0xCCBE 0x6F54 #CJK UNIFIED IDEOGRAPH -0xCCBF 0x7D50 #CJK UNIFIED IDEOGRAPH -0xCCC0 0x7F3A #CJK UNIFIED IDEOGRAPH -0xCCC1 0x8A23 #CJK UNIFIED IDEOGRAPH -0xCCC2 0x517C #CJK UNIFIED IDEOGRAPH -0xCCC3 0x614A #CJK UNIFIED IDEOGRAPH -0xCCC4 0x7B9D #CJK UNIFIED IDEOGRAPH -0xCCC5 0x8B19 #CJK UNIFIED IDEOGRAPH -0xCCC6 0x9257 #CJK UNIFIED IDEOGRAPH -0xCCC7 0x938C #CJK UNIFIED IDEOGRAPH -0xCCC8 0x4EAC #CJK UNIFIED IDEOGRAPH -0xCCC9 0x4FD3 #CJK UNIFIED IDEOGRAPH -0xCCCA 0x501E #CJK UNIFIED IDEOGRAPH -0xCCCB 0x50BE #CJK UNIFIED IDEOGRAPH -0xCCCC 0x5106 #CJK UNIFIED IDEOGRAPH -0xCCCD 0x52C1 #CJK UNIFIED IDEOGRAPH -0xCCCE 0x52CD #CJK UNIFIED IDEOGRAPH -0xCCCF 0x537F #CJK UNIFIED IDEOGRAPH -0xCCD0 0x5770 #CJK UNIFIED IDEOGRAPH -0xCCD1 0x5883 #CJK UNIFIED IDEOGRAPH -0xCCD2 0x5E9A #CJK UNIFIED IDEOGRAPH -0xCCD3 0x5F91 #CJK UNIFIED IDEOGRAPH -0xCCD4 0x6176 #CJK UNIFIED IDEOGRAPH -0xCCD5 0x61AC #CJK UNIFIED IDEOGRAPH -0xCCD6 0x64CE #CJK UNIFIED IDEOGRAPH -0xCCD7 0x656C #CJK UNIFIED IDEOGRAPH -0xCCD8 0x666F #CJK UNIFIED IDEOGRAPH -0xCCD9 0x66BB #CJK UNIFIED IDEOGRAPH -0xCCDA 0x66F4 #CJK UNIFIED IDEOGRAPH -0xCCDB 0x6897 #CJK UNIFIED IDEOGRAPH -0xCCDC 0x6D87 #CJK UNIFIED IDEOGRAPH -0xCCDD 0x7085 #CJK UNIFIED IDEOGRAPH -0xCCDE 0x70F1 #CJK UNIFIED IDEOGRAPH -0xCCDF 0x749F #CJK UNIFIED IDEOGRAPH -0xCCE0 0x74A5 #CJK UNIFIED IDEOGRAPH -0xCCE1 0x74CA #CJK UNIFIED IDEOGRAPH -0xCCE2 0x75D9 #CJK UNIFIED IDEOGRAPH -0xCCE3 0x786C #CJK UNIFIED IDEOGRAPH -0xCCE4 0x78EC #CJK UNIFIED IDEOGRAPH -0xCCE5 0x7ADF #CJK UNIFIED IDEOGRAPH -0xCCE6 0x7AF6 #CJK UNIFIED IDEOGRAPH -0xCCE7 0x7D45 #CJK UNIFIED IDEOGRAPH -0xCCE8 0x7D93 #CJK UNIFIED IDEOGRAPH -0xCCE9 0x8015 #CJK UNIFIED IDEOGRAPH -0xCCEA 0x803F #CJK UNIFIED IDEOGRAPH -0xCCEB 0x811B #CJK UNIFIED IDEOGRAPH -0xCCEC 0x8396 #CJK UNIFIED IDEOGRAPH -0xCCED 0x8B66 #CJK UNIFIED IDEOGRAPH -0xCCEE 0x8F15 #CJK UNIFIED IDEOGRAPH -0xCCEF 0x9015 #CJK UNIFIED IDEOGRAPH -0xCCF0 0x93E1 #CJK UNIFIED IDEOGRAPH -0xCCF1 0x9803 #CJK UNIFIED IDEOGRAPH -0xCCF2 0x9838 #CJK UNIFIED IDEOGRAPH -0xCCF3 0x9A5A #CJK UNIFIED IDEOGRAPH -0xCCF4 0x9BE8 #CJK UNIFIED IDEOGRAPH -0xCCF5 0x4FC2 #CJK UNIFIED IDEOGRAPH -0xCCF6 0x5553 #CJK UNIFIED IDEOGRAPH -0xCCF7 0x583A #CJK UNIFIED IDEOGRAPH -0xCCF8 0x5951 #CJK UNIFIED IDEOGRAPH -0xCCF9 0x5B63 #CJK UNIFIED IDEOGRAPH -0xCCFA 0x5C46 #CJK UNIFIED IDEOGRAPH -0xCCFB 0x60B8 #CJK UNIFIED IDEOGRAPH -0xCCFC 0x6212 #CJK UNIFIED IDEOGRAPH -0xCCFD 0x6842 #CJK UNIFIED IDEOGRAPH -0xCCFE 0x68B0 #CJK UNIFIED IDEOGRAPH -0xCDA1 0x68E8 #CJK UNIFIED IDEOGRAPH -0xCDA2 0x6EAA #CJK UNIFIED IDEOGRAPH -0xCDA3 0x754C #CJK UNIFIED IDEOGRAPH -0xCDA4 0x7678 #CJK UNIFIED IDEOGRAPH -0xCDA5 0x78CE #CJK UNIFIED IDEOGRAPH -0xCDA6 0x7A3D #CJK UNIFIED IDEOGRAPH -0xCDA7 0x7CFB #CJK UNIFIED IDEOGRAPH -0xCDA8 0x7E6B #CJK UNIFIED IDEOGRAPH -0xCDA9 0x7E7C #CJK UNIFIED IDEOGRAPH -0xCDAA 0x8A08 #CJK UNIFIED IDEOGRAPH -0xCDAB 0x8AA1 #CJK UNIFIED IDEOGRAPH -0xCDAC 0x8C3F #CJK UNIFIED IDEOGRAPH -0xCDAD 0x968E #CJK UNIFIED IDEOGRAPH -0xCDAE 0x9DC4 #CJK UNIFIED IDEOGRAPH -0xCDAF 0x53E4 #CJK UNIFIED IDEOGRAPH -0xCDB0 0x53E9 #CJK UNIFIED IDEOGRAPH -0xCDB1 0x544A #CJK UNIFIED IDEOGRAPH -0xCDB2 0x5471 #CJK UNIFIED IDEOGRAPH -0xCDB3 0x56FA #CJK UNIFIED IDEOGRAPH -0xCDB4 0x59D1 #CJK UNIFIED IDEOGRAPH -0xCDB5 0x5B64 #CJK UNIFIED IDEOGRAPH -0xCDB6 0x5C3B #CJK UNIFIED IDEOGRAPH -0xCDB7 0x5EAB #CJK UNIFIED IDEOGRAPH -0xCDB8 0x62F7 #CJK UNIFIED IDEOGRAPH -0xCDB9 0x6537 #CJK UNIFIED IDEOGRAPH -0xCDBA 0x6545 #CJK UNIFIED IDEOGRAPH -0xCDBB 0x6572 #CJK UNIFIED IDEOGRAPH -0xCDBC 0x66A0 #CJK UNIFIED IDEOGRAPH -0xCDBD 0x67AF #CJK UNIFIED IDEOGRAPH -0xCDBE 0x69C1 #CJK UNIFIED IDEOGRAPH -0xCDBF 0x6CBD #CJK UNIFIED IDEOGRAPH -0xCDC0 0x75FC #CJK UNIFIED IDEOGRAPH -0xCDC1 0x7690 #CJK UNIFIED IDEOGRAPH -0xCDC2 0x777E #CJK UNIFIED IDEOGRAPH -0xCDC3 0x7A3F #CJK UNIFIED IDEOGRAPH -0xCDC4 0x7F94 #CJK UNIFIED IDEOGRAPH -0xCDC5 0x8003 #CJK UNIFIED IDEOGRAPH -0xCDC6 0x80A1 #CJK UNIFIED IDEOGRAPH -0xCDC7 0x818F #CJK UNIFIED IDEOGRAPH -0xCDC8 0x82E6 #CJK UNIFIED IDEOGRAPH -0xCDC9 0x82FD #CJK UNIFIED IDEOGRAPH -0xCDCA 0x83F0 #CJK UNIFIED IDEOGRAPH -0xCDCB 0x85C1 #CJK UNIFIED IDEOGRAPH -0xCDCC 0x8831 #CJK UNIFIED IDEOGRAPH -0xCDCD 0x88B4 #CJK UNIFIED IDEOGRAPH -0xCDCE 0x8AA5 #CJK UNIFIED IDEOGRAPH -0xCDCF 0xF903 #CJK COMPATIBILITY IDEOGRAPH -0xCDD0 0x8F9C #CJK UNIFIED IDEOGRAPH -0xCDD1 0x932E #CJK UNIFIED IDEOGRAPH -0xCDD2 0x96C7 #CJK UNIFIED IDEOGRAPH -0xCDD3 0x9867 #CJK UNIFIED IDEOGRAPH -0xCDD4 0x9AD8 #CJK UNIFIED IDEOGRAPH -0xCDD5 0x9F13 #CJK UNIFIED IDEOGRAPH -0xCDD6 0x54ED #CJK UNIFIED IDEOGRAPH -0xCDD7 0x659B #CJK UNIFIED IDEOGRAPH -0xCDD8 0x66F2 #CJK UNIFIED IDEOGRAPH -0xCDD9 0x688F #CJK UNIFIED IDEOGRAPH -0xCDDA 0x7A40 #CJK UNIFIED IDEOGRAPH -0xCDDB 0x8C37 #CJK UNIFIED IDEOGRAPH -0xCDDC 0x9D60 #CJK UNIFIED IDEOGRAPH -0xCDDD 0x56F0 #CJK UNIFIED IDEOGRAPH -0xCDDE 0x5764 #CJK UNIFIED IDEOGRAPH -0xCDDF 0x5D11 #CJK UNIFIED IDEOGRAPH -0xCDE0 0x6606 #CJK UNIFIED IDEOGRAPH -0xCDE1 0x68B1 #CJK UNIFIED IDEOGRAPH -0xCDE2 0x68CD #CJK UNIFIED IDEOGRAPH -0xCDE3 0x6EFE #CJK UNIFIED IDEOGRAPH -0xCDE4 0x7428 #CJK UNIFIED IDEOGRAPH -0xCDE5 0x889E #CJK UNIFIED IDEOGRAPH -0xCDE6 0x9BE4 #CJK UNIFIED IDEOGRAPH -0xCDE7 0x6C68 #CJK UNIFIED IDEOGRAPH -0xCDE8 0xF904 #CJK COMPATIBILITY IDEOGRAPH -0xCDE9 0x9AA8 #CJK UNIFIED IDEOGRAPH -0xCDEA 0x4F9B #CJK UNIFIED IDEOGRAPH -0xCDEB 0x516C #CJK UNIFIED IDEOGRAPH -0xCDEC 0x5171 #CJK UNIFIED IDEOGRAPH -0xCDED 0x529F #CJK UNIFIED IDEOGRAPH -0xCDEE 0x5B54 #CJK UNIFIED IDEOGRAPH -0xCDEF 0x5DE5 #CJK UNIFIED IDEOGRAPH -0xCDF0 0x6050 #CJK UNIFIED IDEOGRAPH -0xCDF1 0x606D #CJK UNIFIED IDEOGRAPH -0xCDF2 0x62F1 #CJK UNIFIED IDEOGRAPH -0xCDF3 0x63A7 #CJK UNIFIED IDEOGRAPH -0xCDF4 0x653B #CJK UNIFIED IDEOGRAPH -0xCDF5 0x73D9 #CJK UNIFIED IDEOGRAPH -0xCDF6 0x7A7A #CJK UNIFIED IDEOGRAPH -0xCDF7 0x86A3 #CJK UNIFIED IDEOGRAPH -0xCDF8 0x8CA2 #CJK UNIFIED IDEOGRAPH -0xCDF9 0x978F #CJK UNIFIED IDEOGRAPH -0xCDFA 0x4E32 #CJK UNIFIED IDEOGRAPH -0xCDFB 0x5BE1 #CJK UNIFIED IDEOGRAPH -0xCDFC 0x6208 #CJK UNIFIED IDEOGRAPH -0xCDFD 0x679C #CJK UNIFIED IDEOGRAPH -0xCDFE 0x74DC #CJK UNIFIED IDEOGRAPH -0xCEA1 0x79D1 #CJK UNIFIED IDEOGRAPH -0xCEA2 0x83D3 #CJK UNIFIED IDEOGRAPH -0xCEA3 0x8A87 #CJK UNIFIED IDEOGRAPH -0xCEA4 0x8AB2 #CJK UNIFIED IDEOGRAPH -0xCEA5 0x8DE8 #CJK UNIFIED IDEOGRAPH -0xCEA6 0x904E #CJK UNIFIED IDEOGRAPH -0xCEA7 0x934B #CJK UNIFIED IDEOGRAPH -0xCEA8 0x9846 #CJK UNIFIED IDEOGRAPH -0xCEA9 0x5ED3 #CJK UNIFIED IDEOGRAPH -0xCEAA 0x69E8 #CJK UNIFIED IDEOGRAPH -0xCEAB 0x85FF #CJK UNIFIED IDEOGRAPH -0xCEAC 0x90ED #CJK UNIFIED IDEOGRAPH -0xCEAD 0xF905 #CJK COMPATIBILITY IDEOGRAPH -0xCEAE 0x51A0 #CJK UNIFIED IDEOGRAPH -0xCEAF 0x5B98 #CJK UNIFIED IDEOGRAPH -0xCEB0 0x5BEC #CJK UNIFIED IDEOGRAPH -0xCEB1 0x6163 #CJK UNIFIED IDEOGRAPH -0xCEB2 0x68FA #CJK UNIFIED IDEOGRAPH -0xCEB3 0x6B3E #CJK UNIFIED IDEOGRAPH -0xCEB4 0x704C #CJK UNIFIED IDEOGRAPH -0xCEB5 0x742F #CJK UNIFIED IDEOGRAPH -0xCEB6 0x74D8 #CJK UNIFIED IDEOGRAPH -0xCEB7 0x7BA1 #CJK UNIFIED IDEOGRAPH -0xCEB8 0x7F50 #CJK UNIFIED IDEOGRAPH -0xCEB9 0x83C5 #CJK UNIFIED IDEOGRAPH -0xCEBA 0x89C0 #CJK UNIFIED IDEOGRAPH -0xCEBB 0x8CAB #CJK UNIFIED IDEOGRAPH -0xCEBC 0x95DC #CJK UNIFIED IDEOGRAPH -0xCEBD 0x9928 #CJK UNIFIED IDEOGRAPH -0xCEBE 0x522E #CJK UNIFIED IDEOGRAPH -0xCEBF 0x605D #CJK UNIFIED IDEOGRAPH -0xCEC0 0x62EC #CJK UNIFIED IDEOGRAPH -0xCEC1 0x9002 #CJK UNIFIED IDEOGRAPH -0xCEC2 0x4F8A #CJK UNIFIED IDEOGRAPH -0xCEC3 0x5149 #CJK UNIFIED IDEOGRAPH -0xCEC4 0x5321 #CJK UNIFIED IDEOGRAPH -0xCEC5 0x58D9 #CJK UNIFIED IDEOGRAPH -0xCEC6 0x5EE3 #CJK UNIFIED IDEOGRAPH -0xCEC7 0x66E0 #CJK UNIFIED IDEOGRAPH -0xCEC8 0x6D38 #CJK UNIFIED IDEOGRAPH -0xCEC9 0x709A #CJK UNIFIED IDEOGRAPH -0xCECA 0x72C2 #CJK UNIFIED IDEOGRAPH -0xCECB 0x73D6 #CJK UNIFIED IDEOGRAPH -0xCECC 0x7B50 #CJK UNIFIED IDEOGRAPH -0xCECD 0x80F1 #CJK UNIFIED IDEOGRAPH -0xCECE 0x945B #CJK UNIFIED IDEOGRAPH -0xCECF 0x5366 #CJK UNIFIED IDEOGRAPH -0xCED0 0x639B #CJK UNIFIED IDEOGRAPH -0xCED1 0x7F6B #CJK UNIFIED IDEOGRAPH -0xCED2 0x4E56 #CJK UNIFIED IDEOGRAPH -0xCED3 0x5080 #CJK UNIFIED IDEOGRAPH -0xCED4 0x584A #CJK UNIFIED IDEOGRAPH -0xCED5 0x58DE #CJK UNIFIED IDEOGRAPH -0xCED6 0x602A #CJK UNIFIED IDEOGRAPH -0xCED7 0x6127 #CJK UNIFIED IDEOGRAPH -0xCED8 0x62D0 #CJK UNIFIED IDEOGRAPH -0xCED9 0x69D0 #CJK UNIFIED IDEOGRAPH -0xCEDA 0x9B41 #CJK UNIFIED IDEOGRAPH -0xCEDB 0x5B8F #CJK UNIFIED IDEOGRAPH -0xCEDC 0x7D18 #CJK UNIFIED IDEOGRAPH -0xCEDD 0x80B1 #CJK UNIFIED IDEOGRAPH -0xCEDE 0x8F5F #CJK UNIFIED IDEOGRAPH -0xCEDF 0x4EA4 #CJK UNIFIED IDEOGRAPH -0xCEE0 0x50D1 #CJK UNIFIED IDEOGRAPH -0xCEE1 0x54AC #CJK UNIFIED IDEOGRAPH -0xCEE2 0x55AC #CJK UNIFIED IDEOGRAPH -0xCEE3 0x5B0C #CJK UNIFIED IDEOGRAPH -0xCEE4 0x5DA0 #CJK UNIFIED IDEOGRAPH -0xCEE5 0x5DE7 #CJK UNIFIED IDEOGRAPH -0xCEE6 0x652A #CJK UNIFIED IDEOGRAPH -0xCEE7 0x654E #CJK UNIFIED IDEOGRAPH -0xCEE8 0x6821 #CJK UNIFIED IDEOGRAPH -0xCEE9 0x6A4B #CJK UNIFIED IDEOGRAPH -0xCEEA 0x72E1 #CJK UNIFIED IDEOGRAPH -0xCEEB 0x768E #CJK UNIFIED IDEOGRAPH -0xCEEC 0x77EF #CJK UNIFIED IDEOGRAPH -0xCEED 0x7D5E #CJK UNIFIED IDEOGRAPH -0xCEEE 0x7FF9 #CJK UNIFIED IDEOGRAPH -0xCEEF 0x81A0 #CJK UNIFIED IDEOGRAPH -0xCEF0 0x854E #CJK UNIFIED IDEOGRAPH -0xCEF1 0x86DF #CJK UNIFIED IDEOGRAPH -0xCEF2 0x8F03 #CJK UNIFIED IDEOGRAPH -0xCEF3 0x8F4E #CJK UNIFIED IDEOGRAPH -0xCEF4 0x90CA #CJK UNIFIED IDEOGRAPH -0xCEF5 0x9903 #CJK UNIFIED IDEOGRAPH -0xCEF6 0x9A55 #CJK UNIFIED IDEOGRAPH -0xCEF7 0x9BAB #CJK UNIFIED IDEOGRAPH -0xCEF8 0x4E18 #CJK UNIFIED IDEOGRAPH -0xCEF9 0x4E45 #CJK UNIFIED IDEOGRAPH -0xCEFA 0x4E5D #CJK UNIFIED IDEOGRAPH -0xCEFB 0x4EC7 #CJK UNIFIED IDEOGRAPH -0xCEFC 0x4FF1 #CJK UNIFIED IDEOGRAPH -0xCEFD 0x5177 #CJK UNIFIED IDEOGRAPH -0xCEFE 0x52FE #CJK UNIFIED IDEOGRAPH -0xCFA1 0x5340 #CJK UNIFIED IDEOGRAPH -0xCFA2 0x53E3 #CJK UNIFIED IDEOGRAPH -0xCFA3 0x53E5 #CJK UNIFIED IDEOGRAPH -0xCFA4 0x548E #CJK UNIFIED IDEOGRAPH -0xCFA5 0x5614 #CJK UNIFIED IDEOGRAPH -0xCFA6 0x5775 #CJK UNIFIED IDEOGRAPH -0xCFA7 0x57A2 #CJK UNIFIED IDEOGRAPH -0xCFA8 0x5BC7 #CJK UNIFIED IDEOGRAPH -0xCFA9 0x5D87 #CJK UNIFIED IDEOGRAPH -0xCFAA 0x5ED0 #CJK UNIFIED IDEOGRAPH -0xCFAB 0x61FC #CJK UNIFIED IDEOGRAPH -0xCFAC 0x62D8 #CJK UNIFIED IDEOGRAPH -0xCFAD 0x6551 #CJK UNIFIED IDEOGRAPH -0xCFAE 0x67B8 #CJK UNIFIED IDEOGRAPH -0xCFAF 0x67E9 #CJK UNIFIED IDEOGRAPH -0xCFB0 0x69CB #CJK UNIFIED IDEOGRAPH -0xCFB1 0x6B50 #CJK UNIFIED IDEOGRAPH -0xCFB2 0x6BC6 #CJK UNIFIED IDEOGRAPH -0xCFB3 0x6BEC #CJK UNIFIED IDEOGRAPH -0xCFB4 0x6C42 #CJK UNIFIED IDEOGRAPH -0xCFB5 0x6E9D #CJK UNIFIED IDEOGRAPH -0xCFB6 0x7078 #CJK UNIFIED IDEOGRAPH -0xCFB7 0x72D7 #CJK UNIFIED IDEOGRAPH -0xCFB8 0x7396 #CJK UNIFIED IDEOGRAPH -0xCFB9 0x7403 #CJK UNIFIED IDEOGRAPH -0xCFBA 0x77BF #CJK UNIFIED IDEOGRAPH -0xCFBB 0x77E9 #CJK UNIFIED IDEOGRAPH -0xCFBC 0x7A76 #CJK UNIFIED IDEOGRAPH -0xCFBD 0x7D7F #CJK UNIFIED IDEOGRAPH -0xCFBE 0x8009 #CJK UNIFIED IDEOGRAPH -0xCFBF 0x81FC #CJK UNIFIED IDEOGRAPH -0xCFC0 0x8205 #CJK UNIFIED IDEOGRAPH -0xCFC1 0x820A #CJK UNIFIED IDEOGRAPH -0xCFC2 0x82DF #CJK UNIFIED IDEOGRAPH -0xCFC3 0x8862 #CJK UNIFIED IDEOGRAPH -0xCFC4 0x8B33 #CJK UNIFIED IDEOGRAPH -0xCFC5 0x8CFC #CJK UNIFIED IDEOGRAPH -0xCFC6 0x8EC0 #CJK UNIFIED IDEOGRAPH -0xCFC7 0x9011 #CJK UNIFIED IDEOGRAPH -0xCFC8 0x90B1 #CJK UNIFIED IDEOGRAPH -0xCFC9 0x9264 #CJK UNIFIED IDEOGRAPH -0xCFCA 0x92B6 #CJK UNIFIED IDEOGRAPH -0xCFCB 0x99D2 #CJK UNIFIED IDEOGRAPH -0xCFCC 0x9A45 #CJK UNIFIED IDEOGRAPH -0xCFCD 0x9CE9 #CJK UNIFIED IDEOGRAPH -0xCFCE 0x9DD7 #CJK UNIFIED IDEOGRAPH -0xCFCF 0x9F9C #CJK UNIFIED IDEOGRAPH -0xCFD0 0x570B #CJK UNIFIED IDEOGRAPH -0xCFD1 0x5C40 #CJK UNIFIED IDEOGRAPH -0xCFD2 0x83CA #CJK UNIFIED IDEOGRAPH -0xCFD3 0x97A0 #CJK UNIFIED IDEOGRAPH -0xCFD4 0x97AB #CJK UNIFIED IDEOGRAPH -0xCFD5 0x9EB4 #CJK UNIFIED IDEOGRAPH -0xCFD6 0x541B #CJK UNIFIED IDEOGRAPH -0xCFD7 0x7A98 #CJK UNIFIED IDEOGRAPH -0xCFD8 0x7FA4 #CJK UNIFIED IDEOGRAPH -0xCFD9 0x88D9 #CJK UNIFIED IDEOGRAPH -0xCFDA 0x8ECD #CJK UNIFIED IDEOGRAPH -0xCFDB 0x90E1 #CJK UNIFIED IDEOGRAPH -0xCFDC 0x5800 #CJK UNIFIED IDEOGRAPH -0xCFDD 0x5C48 #CJK UNIFIED IDEOGRAPH -0xCFDE 0x6398 #CJK UNIFIED IDEOGRAPH -0xCFDF 0x7A9F #CJK UNIFIED IDEOGRAPH -0xCFE0 0x5BAE #CJK UNIFIED IDEOGRAPH -0xCFE1 0x5F13 #CJK UNIFIED IDEOGRAPH -0xCFE2 0x7A79 #CJK UNIFIED IDEOGRAPH -0xCFE3 0x7AAE #CJK UNIFIED IDEOGRAPH -0xCFE4 0x828E #CJK UNIFIED IDEOGRAPH -0xCFE5 0x8EAC #CJK UNIFIED IDEOGRAPH -0xCFE6 0x5026 #CJK UNIFIED IDEOGRAPH -0xCFE7 0x5238 #CJK UNIFIED IDEOGRAPH -0xCFE8 0x52F8 #CJK UNIFIED IDEOGRAPH -0xCFE9 0x5377 #CJK UNIFIED IDEOGRAPH -0xCFEA 0x5708 #CJK UNIFIED IDEOGRAPH -0xCFEB 0x62F3 #CJK UNIFIED IDEOGRAPH -0xCFEC 0x6372 #CJK UNIFIED IDEOGRAPH -0xCFED 0x6B0A #CJK UNIFIED IDEOGRAPH -0xCFEE 0x6DC3 #CJK UNIFIED IDEOGRAPH -0xCFEF 0x7737 #CJK UNIFIED IDEOGRAPH -0xCFF0 0x53A5 #CJK UNIFIED IDEOGRAPH -0xCFF1 0x7357 #CJK UNIFIED IDEOGRAPH -0xCFF2 0x8568 #CJK UNIFIED IDEOGRAPH -0xCFF3 0x8E76 #CJK UNIFIED IDEOGRAPH -0xCFF4 0x95D5 #CJK UNIFIED IDEOGRAPH -0xCFF5 0x673A #CJK UNIFIED IDEOGRAPH -0xCFF6 0x6AC3 #CJK UNIFIED IDEOGRAPH -0xCFF7 0x6F70 #CJK UNIFIED IDEOGRAPH -0xCFF8 0x8A6D #CJK UNIFIED IDEOGRAPH -0xCFF9 0x8ECC #CJK UNIFIED IDEOGRAPH -0xCFFA 0x994B #CJK UNIFIED IDEOGRAPH -0xCFFB 0xF906 #CJK COMPATIBILITY IDEOGRAPH -0xCFFC 0x6677 #CJK UNIFIED IDEOGRAPH -0xCFFD 0x6B78 #CJK UNIFIED IDEOGRAPH -0xCFFE 0x8CB4 #CJK UNIFIED IDEOGRAPH -0xD0A1 0x9B3C #CJK UNIFIED IDEOGRAPH -0xD0A2 0xF907 #CJK COMPATIBILITY IDEOGRAPH -0xD0A3 0x53EB #CJK UNIFIED IDEOGRAPH -0xD0A4 0x572D #CJK UNIFIED IDEOGRAPH -0xD0A5 0x594E #CJK UNIFIED IDEOGRAPH -0xD0A6 0x63C6 #CJK UNIFIED IDEOGRAPH -0xD0A7 0x69FB #CJK UNIFIED IDEOGRAPH -0xD0A8 0x73EA #CJK UNIFIED IDEOGRAPH -0xD0A9 0x7845 #CJK UNIFIED IDEOGRAPH -0xD0AA 0x7ABA #CJK UNIFIED IDEOGRAPH -0xD0AB 0x7AC5 #CJK UNIFIED IDEOGRAPH -0xD0AC 0x7CFE #CJK UNIFIED IDEOGRAPH -0xD0AD 0x8475 #CJK UNIFIED IDEOGRAPH -0xD0AE 0x898F #CJK UNIFIED IDEOGRAPH -0xD0AF 0x8D73 #CJK UNIFIED IDEOGRAPH -0xD0B0 0x9035 #CJK UNIFIED IDEOGRAPH -0xD0B1 0x95A8 #CJK UNIFIED IDEOGRAPH -0xD0B2 0x52FB #CJK UNIFIED IDEOGRAPH -0xD0B3 0x5747 #CJK UNIFIED IDEOGRAPH -0xD0B4 0x7547 #CJK UNIFIED IDEOGRAPH -0xD0B5 0x7B60 #CJK UNIFIED IDEOGRAPH -0xD0B6 0x83CC #CJK UNIFIED IDEOGRAPH -0xD0B7 0x921E #CJK UNIFIED IDEOGRAPH -0xD0B8 0xF908 #CJK COMPATIBILITY IDEOGRAPH -0xD0B9 0x6A58 #CJK UNIFIED IDEOGRAPH -0xD0BA 0x514B #CJK UNIFIED IDEOGRAPH -0xD0BB 0x524B #CJK UNIFIED IDEOGRAPH -0xD0BC 0x5287 #CJK UNIFIED IDEOGRAPH -0xD0BD 0x621F #CJK UNIFIED IDEOGRAPH -0xD0BE 0x68D8 #CJK UNIFIED IDEOGRAPH -0xD0BF 0x6975 #CJK UNIFIED IDEOGRAPH -0xD0C0 0x9699 #CJK UNIFIED IDEOGRAPH -0xD0C1 0x50C5 #CJK UNIFIED IDEOGRAPH -0xD0C2 0x52A4 #CJK UNIFIED IDEOGRAPH -0xD0C3 0x52E4 #CJK UNIFIED IDEOGRAPH -0xD0C4 0x61C3 #CJK UNIFIED IDEOGRAPH -0xD0C5 0x65A4 #CJK UNIFIED IDEOGRAPH -0xD0C6 0x6839 #CJK UNIFIED IDEOGRAPH -0xD0C7 0x69FF #CJK UNIFIED IDEOGRAPH -0xD0C8 0x747E #CJK UNIFIED IDEOGRAPH -0xD0C9 0x7B4B #CJK UNIFIED IDEOGRAPH -0xD0CA 0x82B9 #CJK UNIFIED IDEOGRAPH -0xD0CB 0x83EB #CJK UNIFIED IDEOGRAPH -0xD0CC 0x89B2 #CJK UNIFIED IDEOGRAPH -0xD0CD 0x8B39 #CJK UNIFIED IDEOGRAPH -0xD0CE 0x8FD1 #CJK UNIFIED IDEOGRAPH -0xD0CF 0x9949 #CJK UNIFIED IDEOGRAPH -0xD0D0 0xF909 #CJK COMPATIBILITY IDEOGRAPH -0xD0D1 0x4ECA #CJK UNIFIED IDEOGRAPH -0xD0D2 0x5997 #CJK UNIFIED IDEOGRAPH -0xD0D3 0x64D2 #CJK UNIFIED IDEOGRAPH -0xD0D4 0x6611 #CJK UNIFIED IDEOGRAPH -0xD0D5 0x6A8E #CJK UNIFIED IDEOGRAPH -0xD0D6 0x7434 #CJK UNIFIED IDEOGRAPH -0xD0D7 0x7981 #CJK UNIFIED IDEOGRAPH -0xD0D8 0x79BD #CJK UNIFIED IDEOGRAPH -0xD0D9 0x82A9 #CJK UNIFIED IDEOGRAPH -0xD0DA 0x887E #CJK UNIFIED IDEOGRAPH -0xD0DB 0x887F #CJK UNIFIED IDEOGRAPH -0xD0DC 0x895F #CJK UNIFIED IDEOGRAPH -0xD0DD 0xF90A #CJK COMPATIBILITY IDEOGRAPH -0xD0DE 0x9326 #CJK UNIFIED IDEOGRAPH -0xD0DF 0x4F0B #CJK UNIFIED IDEOGRAPH -0xD0E0 0x53CA #CJK UNIFIED IDEOGRAPH -0xD0E1 0x6025 #CJK UNIFIED IDEOGRAPH -0xD0E2 0x6271 #CJK UNIFIED IDEOGRAPH -0xD0E3 0x6C72 #CJK UNIFIED IDEOGRAPH -0xD0E4 0x7D1A #CJK UNIFIED IDEOGRAPH -0xD0E5 0x7D66 #CJK UNIFIED IDEOGRAPH -0xD0E6 0x4E98 #CJK UNIFIED IDEOGRAPH -0xD0E7 0x5162 #CJK UNIFIED IDEOGRAPH -0xD0E8 0x77DC #CJK UNIFIED IDEOGRAPH -0xD0E9 0x80AF #CJK UNIFIED IDEOGRAPH -0xD0EA 0x4F01 #CJK UNIFIED IDEOGRAPH -0xD0EB 0x4F0E #CJK UNIFIED IDEOGRAPH -0xD0EC 0x5176 #CJK UNIFIED IDEOGRAPH -0xD0ED 0x5180 #CJK UNIFIED IDEOGRAPH -0xD0EE 0x55DC #CJK UNIFIED IDEOGRAPH -0xD0EF 0x5668 #CJK UNIFIED IDEOGRAPH -0xD0F0 0x573B #CJK UNIFIED IDEOGRAPH -0xD0F1 0x57FA #CJK UNIFIED IDEOGRAPH -0xD0F2 0x57FC #CJK UNIFIED IDEOGRAPH -0xD0F3 0x5914 #CJK UNIFIED IDEOGRAPH -0xD0F4 0x5947 #CJK UNIFIED IDEOGRAPH -0xD0F5 0x5993 #CJK UNIFIED IDEOGRAPH -0xD0F6 0x5BC4 #CJK UNIFIED IDEOGRAPH -0xD0F7 0x5C90 #CJK UNIFIED IDEOGRAPH -0xD0F8 0x5D0E #CJK UNIFIED IDEOGRAPH -0xD0F9 0x5DF1 #CJK UNIFIED IDEOGRAPH -0xD0FA 0x5E7E #CJK UNIFIED IDEOGRAPH -0xD0FB 0x5FCC #CJK UNIFIED IDEOGRAPH -0xD0FC 0x6280 #CJK UNIFIED IDEOGRAPH -0xD0FD 0x65D7 #CJK UNIFIED IDEOGRAPH -0xD0FE 0x65E3 #CJK UNIFIED IDEOGRAPH -0xD1A1 0x671E #CJK UNIFIED IDEOGRAPH -0xD1A2 0x671F #CJK UNIFIED IDEOGRAPH -0xD1A3 0x675E #CJK UNIFIED IDEOGRAPH -0xD1A4 0x68CB #CJK UNIFIED IDEOGRAPH -0xD1A5 0x68C4 #CJK UNIFIED IDEOGRAPH -0xD1A6 0x6A5F #CJK UNIFIED IDEOGRAPH -0xD1A7 0x6B3A #CJK UNIFIED IDEOGRAPH -0xD1A8 0x6C23 #CJK UNIFIED IDEOGRAPH -0xD1A9 0x6C7D #CJK UNIFIED IDEOGRAPH -0xD1AA 0x6C82 #CJK UNIFIED IDEOGRAPH -0xD1AB 0x6DC7 #CJK UNIFIED IDEOGRAPH -0xD1AC 0x7398 #CJK UNIFIED IDEOGRAPH -0xD1AD 0x7426 #CJK UNIFIED IDEOGRAPH -0xD1AE 0x742A #CJK UNIFIED IDEOGRAPH -0xD1AF 0x7482 #CJK UNIFIED IDEOGRAPH -0xD1B0 0x74A3 #CJK UNIFIED IDEOGRAPH -0xD1B1 0x7578 #CJK UNIFIED IDEOGRAPH -0xD1B2 0x757F #CJK UNIFIED IDEOGRAPH -0xD1B3 0x7881 #CJK UNIFIED IDEOGRAPH -0xD1B4 0x78EF #CJK UNIFIED IDEOGRAPH -0xD1B5 0x7941 #CJK UNIFIED IDEOGRAPH -0xD1B6 0x7947 #CJK UNIFIED IDEOGRAPH -0xD1B7 0x7948 #CJK UNIFIED IDEOGRAPH -0xD1B8 0x797A #CJK UNIFIED IDEOGRAPH -0xD1B9 0x7B95 #CJK UNIFIED IDEOGRAPH -0xD1BA 0x7D00 #CJK UNIFIED IDEOGRAPH -0xD1BB 0x7DBA #CJK UNIFIED IDEOGRAPH -0xD1BC 0x7F88 #CJK UNIFIED IDEOGRAPH -0xD1BD 0x8006 #CJK UNIFIED IDEOGRAPH -0xD1BE 0x802D #CJK UNIFIED IDEOGRAPH -0xD1BF 0x808C #CJK UNIFIED IDEOGRAPH -0xD1C0 0x8A18 #CJK UNIFIED IDEOGRAPH -0xD1C1 0x8B4F #CJK UNIFIED IDEOGRAPH -0xD1C2 0x8C48 #CJK UNIFIED IDEOGRAPH -0xD1C3 0x8D77 #CJK UNIFIED IDEOGRAPH -0xD1C4 0x9321 #CJK UNIFIED IDEOGRAPH -0xD1C5 0x9324 #CJK UNIFIED IDEOGRAPH -0xD1C6 0x98E2 #CJK UNIFIED IDEOGRAPH -0xD1C7 0x9951 #CJK UNIFIED IDEOGRAPH -0xD1C8 0x9A0E #CJK UNIFIED IDEOGRAPH -0xD1C9 0x9A0F #CJK UNIFIED IDEOGRAPH -0xD1CA 0x9A65 #CJK UNIFIED IDEOGRAPH -0xD1CB 0x9E92 #CJK UNIFIED IDEOGRAPH -0xD1CC 0x7DCA #CJK UNIFIED IDEOGRAPH -0xD1CD 0x4F76 #CJK UNIFIED IDEOGRAPH -0xD1CE 0x5409 #CJK UNIFIED IDEOGRAPH -0xD1CF 0x62EE #CJK UNIFIED IDEOGRAPH -0xD1D0 0x6854 #CJK UNIFIED IDEOGRAPH -0xD1D1 0x91D1 #CJK UNIFIED IDEOGRAPH -0xD1D2 0x55AB #CJK UNIFIED IDEOGRAPH -0xD1D3 0x513A #CJK UNIFIED IDEOGRAPH -0xD1D4 0xF90B #CJK COMPATIBILITY IDEOGRAPH -0xD1D5 0xF90C #CJK COMPATIBILITY IDEOGRAPH -0xD1D6 0x5A1C #CJK UNIFIED IDEOGRAPH -0xD1D7 0x61E6 #CJK UNIFIED IDEOGRAPH -0xD1D8 0xF90D #CJK COMPATIBILITY IDEOGRAPH -0xD1D9 0x62CF #CJK UNIFIED IDEOGRAPH -0xD1DA 0x62FF #CJK UNIFIED IDEOGRAPH -0xD1DB 0xF90E #CJK COMPATIBILITY IDEOGRAPH -0xD1DC 0xF90F #CJK COMPATIBILITY IDEOGRAPH -0xD1DD 0xF910 #CJK COMPATIBILITY IDEOGRAPH -0xD1DE 0xF911 #CJK COMPATIBILITY IDEOGRAPH -0xD1DF 0xF912 #CJK COMPATIBILITY IDEOGRAPH -0xD1E0 0xF913 #CJK COMPATIBILITY IDEOGRAPH -0xD1E1 0x90A3 #CJK UNIFIED IDEOGRAPH -0xD1E2 0xF914 #CJK COMPATIBILITY IDEOGRAPH -0xD1E3 0xF915 #CJK COMPATIBILITY IDEOGRAPH -0xD1E4 0xF916 #CJK COMPATIBILITY IDEOGRAPH -0xD1E5 0xF917 #CJK COMPATIBILITY IDEOGRAPH -0xD1E6 0xF918 #CJK COMPATIBILITY IDEOGRAPH -0xD1E7 0x8AFE #CJK UNIFIED IDEOGRAPH -0xD1E8 0xF919 #CJK COMPATIBILITY IDEOGRAPH -0xD1E9 0xF91A #CJK COMPATIBILITY IDEOGRAPH -0xD1EA 0xF91B #CJK COMPATIBILITY IDEOGRAPH -0xD1EB 0xF91C #CJK COMPATIBILITY IDEOGRAPH -0xD1EC 0x6696 #CJK UNIFIED IDEOGRAPH -0xD1ED 0xF91D #CJK COMPATIBILITY IDEOGRAPH -0xD1EE 0x7156 #CJK UNIFIED IDEOGRAPH -0xD1EF 0xF91E #CJK COMPATIBILITY IDEOGRAPH -0xD1F0 0xF91F #CJK COMPATIBILITY IDEOGRAPH -0xD1F1 0x96E3 #CJK UNIFIED IDEOGRAPH -0xD1F2 0xF920 #CJK COMPATIBILITY IDEOGRAPH -0xD1F3 0x634F #CJK UNIFIED IDEOGRAPH -0xD1F4 0x637A #CJK UNIFIED IDEOGRAPH -0xD1F5 0x5357 #CJK UNIFIED IDEOGRAPH -0xD1F6 0xF921 #CJK COMPATIBILITY IDEOGRAPH -0xD1F7 0x678F #CJK UNIFIED IDEOGRAPH -0xD1F8 0x6960 #CJK UNIFIED IDEOGRAPH -0xD1F9 0x6E73 #CJK UNIFIED IDEOGRAPH -0xD1FA 0xF922 #CJK COMPATIBILITY IDEOGRAPH -0xD1FB 0x7537 #CJK UNIFIED IDEOGRAPH -0xD1FC 0xF923 #CJK COMPATIBILITY IDEOGRAPH -0xD1FD 0xF924 #CJK COMPATIBILITY IDEOGRAPH -0xD1FE 0xF925 #CJK COMPATIBILITY IDEOGRAPH -0xD2A1 0x7D0D #CJK UNIFIED IDEOGRAPH -0xD2A2 0xF926 #CJK COMPATIBILITY IDEOGRAPH -0xD2A3 0xF927 #CJK COMPATIBILITY IDEOGRAPH -0xD2A4 0x8872 #CJK UNIFIED IDEOGRAPH -0xD2A5 0x56CA #CJK UNIFIED IDEOGRAPH -0xD2A6 0x5A18 #CJK UNIFIED IDEOGRAPH -0xD2A7 0xF928 #CJK COMPATIBILITY IDEOGRAPH -0xD2A8 0xF929 #CJK COMPATIBILITY IDEOGRAPH -0xD2A9 0xF92A #CJK COMPATIBILITY IDEOGRAPH -0xD2AA 0xF92B #CJK COMPATIBILITY IDEOGRAPH -0xD2AB 0xF92C #CJK COMPATIBILITY IDEOGRAPH -0xD2AC 0x4E43 #CJK UNIFIED IDEOGRAPH -0xD2AD 0xF92D #CJK COMPATIBILITY IDEOGRAPH -0xD2AE 0x5167 #CJK UNIFIED IDEOGRAPH -0xD2AF 0x5948 #CJK UNIFIED IDEOGRAPH -0xD2B0 0x67F0 #CJK UNIFIED IDEOGRAPH -0xD2B1 0x8010 #CJK UNIFIED IDEOGRAPH -0xD2B2 0xF92E #CJK COMPATIBILITY IDEOGRAPH -0xD2B3 0x5973 #CJK UNIFIED IDEOGRAPH -0xD2B4 0x5E74 #CJK UNIFIED IDEOGRAPH -0xD2B5 0x649A #CJK UNIFIED IDEOGRAPH -0xD2B6 0x79CA #CJK UNIFIED IDEOGRAPH -0xD2B7 0x5FF5 #CJK UNIFIED IDEOGRAPH -0xD2B8 0x606C #CJK UNIFIED IDEOGRAPH -0xD2B9 0x62C8 #CJK UNIFIED IDEOGRAPH -0xD2BA 0x637B #CJK UNIFIED IDEOGRAPH -0xD2BB 0x5BE7 #CJK UNIFIED IDEOGRAPH -0xD2BC 0x5BD7 #CJK UNIFIED IDEOGRAPH -0xD2BD 0x52AA #CJK UNIFIED IDEOGRAPH -0xD2BE 0xF92F #CJK COMPATIBILITY IDEOGRAPH -0xD2BF 0x5974 #CJK UNIFIED IDEOGRAPH -0xD2C0 0x5F29 #CJK UNIFIED IDEOGRAPH -0xD2C1 0x6012 #CJK UNIFIED IDEOGRAPH -0xD2C2 0xF930 #CJK COMPATIBILITY IDEOGRAPH -0xD2C3 0xF931 #CJK COMPATIBILITY IDEOGRAPH -0xD2C4 0xF932 #CJK COMPATIBILITY IDEOGRAPH -0xD2C5 0x7459 #CJK UNIFIED IDEOGRAPH -0xD2C6 0xF933 #CJK COMPATIBILITY IDEOGRAPH -0xD2C7 0xF934 #CJK COMPATIBILITY IDEOGRAPH -0xD2C8 0xF935 #CJK COMPATIBILITY IDEOGRAPH -0xD2C9 0xF936 #CJK COMPATIBILITY IDEOGRAPH -0xD2CA 0xF937 #CJK COMPATIBILITY IDEOGRAPH -0xD2CB 0xF938 #CJK COMPATIBILITY IDEOGRAPH -0xD2CC 0x99D1 #CJK UNIFIED IDEOGRAPH -0xD2CD 0xF939 #CJK COMPATIBILITY IDEOGRAPH -0xD2CE 0xF93A #CJK COMPATIBILITY IDEOGRAPH -0xD2CF 0xF93B #CJK COMPATIBILITY IDEOGRAPH -0xD2D0 0xF93C #CJK COMPATIBILITY IDEOGRAPH -0xD2D1 0xF93D #CJK COMPATIBILITY IDEOGRAPH -0xD2D2 0xF93E #CJK COMPATIBILITY IDEOGRAPH -0xD2D3 0xF93F #CJK COMPATIBILITY IDEOGRAPH -0xD2D4 0xF940 #CJK COMPATIBILITY IDEOGRAPH -0xD2D5 0xF941 #CJK COMPATIBILITY IDEOGRAPH -0xD2D6 0xF942 #CJK COMPATIBILITY IDEOGRAPH -0xD2D7 0xF943 #CJK COMPATIBILITY IDEOGRAPH -0xD2D8 0x6FC3 #CJK UNIFIED IDEOGRAPH -0xD2D9 0xF944 #CJK COMPATIBILITY IDEOGRAPH -0xD2DA 0xF945 #CJK COMPATIBILITY IDEOGRAPH -0xD2DB 0x81BF #CJK UNIFIED IDEOGRAPH -0xD2DC 0x8FB2 #CJK UNIFIED IDEOGRAPH -0xD2DD 0x60F1 #CJK UNIFIED IDEOGRAPH -0xD2DE 0xF946 #CJK COMPATIBILITY IDEOGRAPH -0xD2DF 0xF947 #CJK COMPATIBILITY IDEOGRAPH -0xD2E0 0x8166 #CJK UNIFIED IDEOGRAPH -0xD2E1 0xF948 #CJK COMPATIBILITY IDEOGRAPH -0xD2E2 0xF949 #CJK COMPATIBILITY IDEOGRAPH -0xD2E3 0x5C3F #CJK UNIFIED IDEOGRAPH -0xD2E4 0xF94A #CJK COMPATIBILITY IDEOGRAPH -0xD2E5 0xF94B #CJK COMPATIBILITY IDEOGRAPH -0xD2E6 0xF94C #CJK COMPATIBILITY IDEOGRAPH -0xD2E7 0xF94D #CJK COMPATIBILITY IDEOGRAPH -0xD2E8 0xF94E #CJK COMPATIBILITY IDEOGRAPH -0xD2E9 0xF94F #CJK COMPATIBILITY IDEOGRAPH -0xD2EA 0xF950 #CJK COMPATIBILITY IDEOGRAPH -0xD2EB 0xF951 #CJK COMPATIBILITY IDEOGRAPH -0xD2EC 0x5AE9 #CJK UNIFIED IDEOGRAPH -0xD2ED 0x8A25 #CJK UNIFIED IDEOGRAPH -0xD2EE 0x677B #CJK UNIFIED IDEOGRAPH -0xD2EF 0x7D10 #CJK UNIFIED IDEOGRAPH -0xD2F0 0xF952 #CJK COMPATIBILITY IDEOGRAPH -0xD2F1 0xF953 #CJK COMPATIBILITY IDEOGRAPH -0xD2F2 0xF954 #CJK COMPATIBILITY IDEOGRAPH -0xD2F3 0xF955 #CJK COMPATIBILITY IDEOGRAPH -0xD2F4 0xF956 #CJK COMPATIBILITY IDEOGRAPH -0xD2F5 0xF957 #CJK COMPATIBILITY IDEOGRAPH -0xD2F6 0x80FD #CJK UNIFIED IDEOGRAPH -0xD2F7 0xF958 #CJK COMPATIBILITY IDEOGRAPH -0xD2F8 0xF959 #CJK COMPATIBILITY IDEOGRAPH -0xD2F9 0x5C3C #CJK UNIFIED IDEOGRAPH -0xD2FA 0x6CE5 #CJK UNIFIED IDEOGRAPH -0xD2FB 0x533F #CJK UNIFIED IDEOGRAPH -0xD2FC 0x6EBA #CJK UNIFIED IDEOGRAPH -0xD2FD 0x591A #CJK UNIFIED IDEOGRAPH -0xD2FE 0x8336 #CJK UNIFIED IDEOGRAPH -0xD3A1 0x4E39 #CJK UNIFIED IDEOGRAPH -0xD3A2 0x4EB6 #CJK UNIFIED IDEOGRAPH -0xD3A3 0x4F46 #CJK UNIFIED IDEOGRAPH -0xD3A4 0x55AE #CJK UNIFIED IDEOGRAPH -0xD3A5 0x5718 #CJK UNIFIED IDEOGRAPH -0xD3A6 0x58C7 #CJK UNIFIED IDEOGRAPH -0xD3A7 0x5F56 #CJK UNIFIED IDEOGRAPH -0xD3A8 0x65B7 #CJK UNIFIED IDEOGRAPH -0xD3A9 0x65E6 #CJK UNIFIED IDEOGRAPH -0xD3AA 0x6A80 #CJK UNIFIED IDEOGRAPH -0xD3AB 0x6BB5 #CJK UNIFIED IDEOGRAPH -0xD3AC 0x6E4D #CJK UNIFIED IDEOGRAPH -0xD3AD 0x77ED #CJK UNIFIED IDEOGRAPH -0xD3AE 0x7AEF #CJK UNIFIED IDEOGRAPH -0xD3AF 0x7C1E #CJK UNIFIED IDEOGRAPH -0xD3B0 0x7DDE #CJK UNIFIED IDEOGRAPH -0xD3B1 0x86CB #CJK UNIFIED IDEOGRAPH -0xD3B2 0x8892 #CJK UNIFIED IDEOGRAPH -0xD3B3 0x9132 #CJK UNIFIED IDEOGRAPH -0xD3B4 0x935B #CJK UNIFIED IDEOGRAPH -0xD3B5 0x64BB #CJK UNIFIED IDEOGRAPH -0xD3B6 0x6FBE #CJK UNIFIED IDEOGRAPH -0xD3B7 0x737A #CJK UNIFIED IDEOGRAPH -0xD3B8 0x75B8 #CJK UNIFIED IDEOGRAPH -0xD3B9 0x9054 #CJK UNIFIED IDEOGRAPH -0xD3BA 0x5556 #CJK UNIFIED IDEOGRAPH -0xD3BB 0x574D #CJK UNIFIED IDEOGRAPH -0xD3BC 0x61BA #CJK UNIFIED IDEOGRAPH -0xD3BD 0x64D4 #CJK UNIFIED IDEOGRAPH -0xD3BE 0x66C7 #CJK UNIFIED IDEOGRAPH -0xD3BF 0x6DE1 #CJK UNIFIED IDEOGRAPH -0xD3C0 0x6E5B #CJK UNIFIED IDEOGRAPH -0xD3C1 0x6F6D #CJK UNIFIED IDEOGRAPH -0xD3C2 0x6FB9 #CJK UNIFIED IDEOGRAPH -0xD3C3 0x75F0 #CJK UNIFIED IDEOGRAPH -0xD3C4 0x8043 #CJK UNIFIED IDEOGRAPH -0xD3C5 0x81BD #CJK UNIFIED IDEOGRAPH -0xD3C6 0x8541 #CJK UNIFIED IDEOGRAPH -0xD3C7 0x8983 #CJK UNIFIED IDEOGRAPH -0xD3C8 0x8AC7 #CJK UNIFIED IDEOGRAPH -0xD3C9 0x8B5A #CJK UNIFIED IDEOGRAPH -0xD3CA 0x931F #CJK UNIFIED IDEOGRAPH -0xD3CB 0x6C93 #CJK UNIFIED IDEOGRAPH -0xD3CC 0x7553 #CJK UNIFIED IDEOGRAPH -0xD3CD 0x7B54 #CJK UNIFIED IDEOGRAPH -0xD3CE 0x8E0F #CJK UNIFIED IDEOGRAPH -0xD3CF 0x905D #CJK UNIFIED IDEOGRAPH -0xD3D0 0x5510 #CJK UNIFIED IDEOGRAPH -0xD3D1 0x5802 #CJK UNIFIED IDEOGRAPH -0xD3D2 0x5858 #CJK UNIFIED IDEOGRAPH -0xD3D3 0x5E62 #CJK UNIFIED IDEOGRAPH -0xD3D4 0x6207 #CJK UNIFIED IDEOGRAPH -0xD3D5 0x649E #CJK UNIFIED IDEOGRAPH -0xD3D6 0x68E0 #CJK UNIFIED IDEOGRAPH -0xD3D7 0x7576 #CJK UNIFIED IDEOGRAPH -0xD3D8 0x7CD6 #CJK UNIFIED IDEOGRAPH -0xD3D9 0x87B3 #CJK UNIFIED IDEOGRAPH -0xD3DA 0x9EE8 #CJK UNIFIED IDEOGRAPH -0xD3DB 0x4EE3 #CJK UNIFIED IDEOGRAPH -0xD3DC 0x5788 #CJK UNIFIED IDEOGRAPH -0xD3DD 0x576E #CJK UNIFIED IDEOGRAPH -0xD3DE 0x5927 #CJK UNIFIED IDEOGRAPH -0xD3DF 0x5C0D #CJK UNIFIED IDEOGRAPH -0xD3E0 0x5CB1 #CJK UNIFIED IDEOGRAPH -0xD3E1 0x5E36 #CJK UNIFIED IDEOGRAPH -0xD3E2 0x5F85 #CJK UNIFIED IDEOGRAPH -0xD3E3 0x6234 #CJK UNIFIED IDEOGRAPH -0xD3E4 0x64E1 #CJK UNIFIED IDEOGRAPH -0xD3E5 0x73B3 #CJK UNIFIED IDEOGRAPH -0xD3E6 0x81FA #CJK UNIFIED IDEOGRAPH -0xD3E7 0x888B #CJK UNIFIED IDEOGRAPH -0xD3E8 0x8CB8 #CJK UNIFIED IDEOGRAPH -0xD3E9 0x968A #CJK UNIFIED IDEOGRAPH -0xD3EA 0x9EDB #CJK UNIFIED IDEOGRAPH -0xD3EB 0x5B85 #CJK UNIFIED IDEOGRAPH -0xD3EC 0x5FB7 #CJK UNIFIED IDEOGRAPH -0xD3ED 0x60B3 #CJK UNIFIED IDEOGRAPH -0xD3EE 0x5012 #CJK UNIFIED IDEOGRAPH -0xD3EF 0x5200 #CJK UNIFIED IDEOGRAPH -0xD3F0 0x5230 #CJK UNIFIED IDEOGRAPH -0xD3F1 0x5716 #CJK UNIFIED IDEOGRAPH -0xD3F2 0x5835 #CJK UNIFIED IDEOGRAPH -0xD3F3 0x5857 #CJK UNIFIED IDEOGRAPH -0xD3F4 0x5C0E #CJK UNIFIED IDEOGRAPH -0xD3F5 0x5C60 #CJK UNIFIED IDEOGRAPH -0xD3F6 0x5CF6 #CJK UNIFIED IDEOGRAPH -0xD3F7 0x5D8B #CJK UNIFIED IDEOGRAPH -0xD3F8 0x5EA6 #CJK UNIFIED IDEOGRAPH -0xD3F9 0x5F92 #CJK UNIFIED IDEOGRAPH -0xD3FA 0x60BC #CJK UNIFIED IDEOGRAPH -0xD3FB 0x6311 #CJK UNIFIED IDEOGRAPH -0xD3FC 0x6389 #CJK UNIFIED IDEOGRAPH -0xD3FD 0x6417 #CJK UNIFIED IDEOGRAPH -0xD3FE 0x6843 #CJK UNIFIED IDEOGRAPH -0xD4A1 0x68F9 #CJK UNIFIED IDEOGRAPH -0xD4A2 0x6AC2 #CJK UNIFIED IDEOGRAPH -0xD4A3 0x6DD8 #CJK UNIFIED IDEOGRAPH -0xD4A4 0x6E21 #CJK UNIFIED IDEOGRAPH -0xD4A5 0x6ED4 #CJK UNIFIED IDEOGRAPH -0xD4A6 0x6FE4 #CJK UNIFIED IDEOGRAPH -0xD4A7 0x71FE #CJK UNIFIED IDEOGRAPH -0xD4A8 0x76DC #CJK UNIFIED IDEOGRAPH -0xD4A9 0x7779 #CJK UNIFIED IDEOGRAPH -0xD4AA 0x79B1 #CJK UNIFIED IDEOGRAPH -0xD4AB 0x7A3B #CJK UNIFIED IDEOGRAPH -0xD4AC 0x8404 #CJK UNIFIED IDEOGRAPH -0xD4AD 0x89A9 #CJK UNIFIED IDEOGRAPH -0xD4AE 0x8CED #CJK UNIFIED IDEOGRAPH -0xD4AF 0x8DF3 #CJK UNIFIED IDEOGRAPH -0xD4B0 0x8E48 #CJK UNIFIED IDEOGRAPH -0xD4B1 0x9003 #CJK UNIFIED IDEOGRAPH -0xD4B2 0x9014 #CJK UNIFIED IDEOGRAPH -0xD4B3 0x9053 #CJK UNIFIED IDEOGRAPH -0xD4B4 0x90FD #CJK UNIFIED IDEOGRAPH -0xD4B5 0x934D #CJK UNIFIED IDEOGRAPH -0xD4B6 0x9676 #CJK UNIFIED IDEOGRAPH -0xD4B7 0x97DC #CJK UNIFIED IDEOGRAPH -0xD4B8 0x6BD2 #CJK UNIFIED IDEOGRAPH -0xD4B9 0x7006 #CJK UNIFIED IDEOGRAPH -0xD4BA 0x7258 #CJK UNIFIED IDEOGRAPH -0xD4BB 0x72A2 #CJK UNIFIED IDEOGRAPH -0xD4BC 0x7368 #CJK UNIFIED IDEOGRAPH -0xD4BD 0x7763 #CJK UNIFIED IDEOGRAPH -0xD4BE 0x79BF #CJK UNIFIED IDEOGRAPH -0xD4BF 0x7BE4 #CJK UNIFIED IDEOGRAPH -0xD4C0 0x7E9B #CJK UNIFIED IDEOGRAPH -0xD4C1 0x8B80 #CJK UNIFIED IDEOGRAPH -0xD4C2 0x58A9 #CJK UNIFIED IDEOGRAPH -0xD4C3 0x60C7 #CJK UNIFIED IDEOGRAPH -0xD4C4 0x6566 #CJK UNIFIED IDEOGRAPH -0xD4C5 0x65FD #CJK UNIFIED IDEOGRAPH -0xD4C6 0x66BE #CJK UNIFIED IDEOGRAPH -0xD4C7 0x6C8C #CJK UNIFIED IDEOGRAPH -0xD4C8 0x711E #CJK UNIFIED IDEOGRAPH -0xD4C9 0x71C9 #CJK UNIFIED IDEOGRAPH -0xD4CA 0x8C5A #CJK UNIFIED IDEOGRAPH -0xD4CB 0x9813 #CJK UNIFIED IDEOGRAPH -0xD4CC 0x4E6D #CJK UNIFIED IDEOGRAPH -0xD4CD 0x7A81 #CJK UNIFIED IDEOGRAPH -0xD4CE 0x4EDD #CJK UNIFIED IDEOGRAPH -0xD4CF 0x51AC #CJK UNIFIED IDEOGRAPH -0xD4D0 0x51CD #CJK UNIFIED IDEOGRAPH -0xD4D1 0x52D5 #CJK UNIFIED IDEOGRAPH -0xD4D2 0x540C #CJK UNIFIED IDEOGRAPH -0xD4D3 0x61A7 #CJK UNIFIED IDEOGRAPH -0xD4D4 0x6771 #CJK UNIFIED IDEOGRAPH -0xD4D5 0x6850 #CJK UNIFIED IDEOGRAPH -0xD4D6 0x68DF #CJK UNIFIED IDEOGRAPH -0xD4D7 0x6D1E #CJK UNIFIED IDEOGRAPH -0xD4D8 0x6F7C #CJK UNIFIED IDEOGRAPH -0xD4D9 0x75BC #CJK UNIFIED IDEOGRAPH -0xD4DA 0x77B3 #CJK UNIFIED IDEOGRAPH -0xD4DB 0x7AE5 #CJK UNIFIED IDEOGRAPH -0xD4DC 0x80F4 #CJK UNIFIED IDEOGRAPH -0xD4DD 0x8463 #CJK UNIFIED IDEOGRAPH -0xD4DE 0x9285 #CJK UNIFIED IDEOGRAPH -0xD4DF 0x515C #CJK UNIFIED IDEOGRAPH -0xD4E0 0x6597 #CJK UNIFIED IDEOGRAPH -0xD4E1 0x675C #CJK UNIFIED IDEOGRAPH -0xD4E2 0x6793 #CJK UNIFIED IDEOGRAPH -0xD4E3 0x75D8 #CJK UNIFIED IDEOGRAPH -0xD4E4 0x7AC7 #CJK UNIFIED IDEOGRAPH -0xD4E5 0x8373 #CJK UNIFIED IDEOGRAPH -0xD4E6 0xF95A #CJK COMPATIBILITY IDEOGRAPH -0xD4E7 0x8C46 #CJK UNIFIED IDEOGRAPH -0xD4E8 0x9017 #CJK UNIFIED IDEOGRAPH -0xD4E9 0x982D #CJK UNIFIED IDEOGRAPH -0xD4EA 0x5C6F #CJK UNIFIED IDEOGRAPH -0xD4EB 0x81C0 #CJK UNIFIED IDEOGRAPH -0xD4EC 0x829A #CJK UNIFIED IDEOGRAPH -0xD4ED 0x9041 #CJK UNIFIED IDEOGRAPH -0xD4EE 0x906F #CJK UNIFIED IDEOGRAPH -0xD4EF 0x920D #CJK UNIFIED IDEOGRAPH -0xD4F0 0x5F97 #CJK UNIFIED IDEOGRAPH -0xD4F1 0x5D9D #CJK UNIFIED IDEOGRAPH -0xD4F2 0x6A59 #CJK UNIFIED IDEOGRAPH -0xD4F3 0x71C8 #CJK UNIFIED IDEOGRAPH -0xD4F4 0x767B #CJK UNIFIED IDEOGRAPH -0xD4F5 0x7B49 #CJK UNIFIED IDEOGRAPH -0xD4F6 0x85E4 #CJK UNIFIED IDEOGRAPH -0xD4F7 0x8B04 #CJK UNIFIED IDEOGRAPH -0xD4F8 0x9127 #CJK UNIFIED IDEOGRAPH -0xD4F9 0x9A30 #CJK UNIFIED IDEOGRAPH -0xD4FA 0x5587 #CJK UNIFIED IDEOGRAPH -0xD4FB 0x61F6 #CJK UNIFIED IDEOGRAPH -0xD4FC 0xF95B #CJK COMPATIBILITY IDEOGRAPH -0xD4FD 0x7669 #CJK UNIFIED IDEOGRAPH -0xD4FE 0x7F85 #CJK UNIFIED IDEOGRAPH -0xD5A1 0x863F #CJK UNIFIED IDEOGRAPH -0xD5A2 0x87BA #CJK UNIFIED IDEOGRAPH -0xD5A3 0x88F8 #CJK UNIFIED IDEOGRAPH -0xD5A4 0x908F #CJK UNIFIED IDEOGRAPH -0xD5A5 0xF95C #CJK COMPATIBILITY IDEOGRAPH -0xD5A6 0x6D1B #CJK UNIFIED IDEOGRAPH -0xD5A7 0x70D9 #CJK UNIFIED IDEOGRAPH -0xD5A8 0x73DE #CJK UNIFIED IDEOGRAPH -0xD5A9 0x7D61 #CJK UNIFIED IDEOGRAPH -0xD5AA 0x843D #CJK UNIFIED IDEOGRAPH -0xD5AB 0xF95D #CJK COMPATIBILITY IDEOGRAPH -0xD5AC 0x916A #CJK UNIFIED IDEOGRAPH -0xD5AD 0x99F1 #CJK UNIFIED IDEOGRAPH -0xD5AE 0xF95E #CJK COMPATIBILITY IDEOGRAPH -0xD5AF 0x4E82 #CJK UNIFIED IDEOGRAPH -0xD5B0 0x5375 #CJK UNIFIED IDEOGRAPH -0xD5B1 0x6B04 #CJK UNIFIED IDEOGRAPH -0xD5B2 0x6B12 #CJK UNIFIED IDEOGRAPH -0xD5B3 0x703E #CJK UNIFIED IDEOGRAPH -0xD5B4 0x721B #CJK UNIFIED IDEOGRAPH -0xD5B5 0x862D #CJK UNIFIED IDEOGRAPH -0xD5B6 0x9E1E #CJK UNIFIED IDEOGRAPH -0xD5B7 0x524C #CJK UNIFIED IDEOGRAPH -0xD5B8 0x8FA3 #CJK UNIFIED IDEOGRAPH -0xD5B9 0x5D50 #CJK UNIFIED IDEOGRAPH -0xD5BA 0x64E5 #CJK UNIFIED IDEOGRAPH -0xD5BB 0x652C #CJK UNIFIED IDEOGRAPH -0xD5BC 0x6B16 #CJK UNIFIED IDEOGRAPH -0xD5BD 0x6FEB #CJK UNIFIED IDEOGRAPH -0xD5BE 0x7C43 #CJK UNIFIED IDEOGRAPH -0xD5BF 0x7E9C #CJK UNIFIED IDEOGRAPH -0xD5C0 0x85CD #CJK UNIFIED IDEOGRAPH -0xD5C1 0x8964 #CJK UNIFIED IDEOGRAPH -0xD5C2 0x89BD #CJK UNIFIED IDEOGRAPH -0xD5C3 0x62C9 #CJK UNIFIED IDEOGRAPH -0xD5C4 0x81D8 #CJK UNIFIED IDEOGRAPH -0xD5C5 0x881F #CJK UNIFIED IDEOGRAPH -0xD5C6 0x5ECA #CJK UNIFIED IDEOGRAPH -0xD5C7 0x6717 #CJK UNIFIED IDEOGRAPH -0xD5C8 0x6D6A #CJK UNIFIED IDEOGRAPH -0xD5C9 0x72FC #CJK UNIFIED IDEOGRAPH -0xD5CA 0x7405 #CJK UNIFIED IDEOGRAPH -0xD5CB 0x746F #CJK UNIFIED IDEOGRAPH -0xD5CC 0x8782 #CJK UNIFIED IDEOGRAPH -0xD5CD 0x90DE #CJK UNIFIED IDEOGRAPH -0xD5CE 0x4F86 #CJK UNIFIED IDEOGRAPH -0xD5CF 0x5D0D #CJK UNIFIED IDEOGRAPH -0xD5D0 0x5FA0 #CJK UNIFIED IDEOGRAPH -0xD5D1 0x840A #CJK UNIFIED IDEOGRAPH -0xD5D2 0x51B7 #CJK UNIFIED IDEOGRAPH -0xD5D3 0x63A0 #CJK UNIFIED IDEOGRAPH -0xD5D4 0x7565 #CJK UNIFIED IDEOGRAPH -0xD5D5 0x4EAE #CJK UNIFIED IDEOGRAPH -0xD5D6 0x5006 #CJK UNIFIED IDEOGRAPH -0xD5D7 0x5169 #CJK UNIFIED IDEOGRAPH -0xD5D8 0x51C9 #CJK UNIFIED IDEOGRAPH -0xD5D9 0x6881 #CJK UNIFIED IDEOGRAPH -0xD5DA 0x6A11 #CJK UNIFIED IDEOGRAPH -0xD5DB 0x7CAE #CJK UNIFIED IDEOGRAPH -0xD5DC 0x7CB1 #CJK UNIFIED IDEOGRAPH -0xD5DD 0x7CE7 #CJK UNIFIED IDEOGRAPH -0xD5DE 0x826F #CJK UNIFIED IDEOGRAPH -0xD5DF 0x8AD2 #CJK UNIFIED IDEOGRAPH -0xD5E0 0x8F1B #CJK UNIFIED IDEOGRAPH -0xD5E1 0x91CF #CJK UNIFIED IDEOGRAPH -0xD5E2 0x4FB6 #CJK UNIFIED IDEOGRAPH -0xD5E3 0x5137 #CJK UNIFIED IDEOGRAPH -0xD5E4 0x52F5 #CJK UNIFIED IDEOGRAPH -0xD5E5 0x5442 #CJK UNIFIED IDEOGRAPH -0xD5E6 0x5EEC #CJK UNIFIED IDEOGRAPH -0xD5E7 0x616E #CJK UNIFIED IDEOGRAPH -0xD5E8 0x623E #CJK UNIFIED IDEOGRAPH -0xD5E9 0x65C5 #CJK UNIFIED IDEOGRAPH -0xD5EA 0x6ADA #CJK UNIFIED IDEOGRAPH -0xD5EB 0x6FFE #CJK UNIFIED IDEOGRAPH -0xD5EC 0x792A #CJK UNIFIED IDEOGRAPH -0xD5ED 0x85DC #CJK UNIFIED IDEOGRAPH -0xD5EE 0x8823 #CJK UNIFIED IDEOGRAPH -0xD5EF 0x95AD #CJK UNIFIED IDEOGRAPH -0xD5F0 0x9A62 #CJK UNIFIED IDEOGRAPH -0xD5F1 0x9A6A #CJK UNIFIED IDEOGRAPH -0xD5F2 0x9E97 #CJK UNIFIED IDEOGRAPH -0xD5F3 0x9ECE #CJK UNIFIED IDEOGRAPH -0xD5F4 0x529B #CJK UNIFIED IDEOGRAPH -0xD5F5 0x66C6 #CJK UNIFIED IDEOGRAPH -0xD5F6 0x6B77 #CJK UNIFIED IDEOGRAPH -0xD5F7 0x701D #CJK UNIFIED IDEOGRAPH -0xD5F8 0x792B #CJK UNIFIED IDEOGRAPH -0xD5F9 0x8F62 #CJK UNIFIED IDEOGRAPH -0xD5FA 0x9742 #CJK UNIFIED IDEOGRAPH -0xD5FB 0x6190 #CJK UNIFIED IDEOGRAPH -0xD5FC 0x6200 #CJK UNIFIED IDEOGRAPH -0xD5FD 0x6523 #CJK UNIFIED IDEOGRAPH -0xD5FE 0x6F23 #CJK UNIFIED IDEOGRAPH -0xD6A1 0x7149 #CJK UNIFIED IDEOGRAPH -0xD6A2 0x7489 #CJK UNIFIED IDEOGRAPH -0xD6A3 0x7DF4 #CJK UNIFIED IDEOGRAPH -0xD6A4 0x806F #CJK UNIFIED IDEOGRAPH -0xD6A5 0x84EE #CJK UNIFIED IDEOGRAPH -0xD6A6 0x8F26 #CJK UNIFIED IDEOGRAPH -0xD6A7 0x9023 #CJK UNIFIED IDEOGRAPH -0xD6A8 0x934A #CJK UNIFIED IDEOGRAPH -0xD6A9 0x51BD #CJK UNIFIED IDEOGRAPH -0xD6AA 0x5217 #CJK UNIFIED IDEOGRAPH -0xD6AB 0x52A3 #CJK UNIFIED IDEOGRAPH -0xD6AC 0x6D0C #CJK UNIFIED IDEOGRAPH -0xD6AD 0x70C8 #CJK UNIFIED IDEOGRAPH -0xD6AE 0x88C2 #CJK UNIFIED IDEOGRAPH -0xD6AF 0x5EC9 #CJK UNIFIED IDEOGRAPH -0xD6B0 0x6582 #CJK UNIFIED IDEOGRAPH -0xD6B1 0x6BAE #CJK UNIFIED IDEOGRAPH -0xD6B2 0x6FC2 #CJK UNIFIED IDEOGRAPH -0xD6B3 0x7C3E #CJK UNIFIED IDEOGRAPH -0xD6B4 0x7375 #CJK UNIFIED IDEOGRAPH -0xD6B5 0x4EE4 #CJK UNIFIED IDEOGRAPH -0xD6B6 0x4F36 #CJK UNIFIED IDEOGRAPH -0xD6B7 0x56F9 #CJK UNIFIED IDEOGRAPH -0xD6B8 0xF95F #CJK COMPATIBILITY IDEOGRAPH -0xD6B9 0x5CBA #CJK UNIFIED IDEOGRAPH -0xD6BA 0x5DBA #CJK UNIFIED IDEOGRAPH -0xD6BB 0x601C #CJK UNIFIED IDEOGRAPH -0xD6BC 0x73B2 #CJK UNIFIED IDEOGRAPH -0xD6BD 0x7B2D #CJK UNIFIED IDEOGRAPH -0xD6BE 0x7F9A #CJK UNIFIED IDEOGRAPH -0xD6BF 0x7FCE #CJK UNIFIED IDEOGRAPH -0xD6C0 0x8046 #CJK UNIFIED IDEOGRAPH -0xD6C1 0x901E #CJK UNIFIED IDEOGRAPH -0xD6C2 0x9234 #CJK UNIFIED IDEOGRAPH -0xD6C3 0x96F6 #CJK UNIFIED IDEOGRAPH -0xD6C4 0x9748 #CJK UNIFIED IDEOGRAPH -0xD6C5 0x9818 #CJK UNIFIED IDEOGRAPH -0xD6C6 0x9F61 #CJK UNIFIED IDEOGRAPH -0xD6C7 0x4F8B #CJK UNIFIED IDEOGRAPH -0xD6C8 0x6FA7 #CJK UNIFIED IDEOGRAPH -0xD6C9 0x79AE #CJK UNIFIED IDEOGRAPH -0xD6CA 0x91B4 #CJK UNIFIED IDEOGRAPH -0xD6CB 0x96B7 #CJK UNIFIED IDEOGRAPH -0xD6CC 0x52DE #CJK UNIFIED IDEOGRAPH -0xD6CD 0xF960 #CJK COMPATIBILITY IDEOGRAPH -0xD6CE 0x6488 #CJK UNIFIED IDEOGRAPH -0xD6CF 0x64C4 #CJK UNIFIED IDEOGRAPH -0xD6D0 0x6AD3 #CJK UNIFIED IDEOGRAPH -0xD6D1 0x6F5E #CJK UNIFIED IDEOGRAPH -0xD6D2 0x7018 #CJK UNIFIED IDEOGRAPH -0xD6D3 0x7210 #CJK UNIFIED IDEOGRAPH -0xD6D4 0x76E7 #CJK UNIFIED IDEOGRAPH -0xD6D5 0x8001 #CJK UNIFIED IDEOGRAPH -0xD6D6 0x8606 #CJK UNIFIED IDEOGRAPH -0xD6D7 0x865C #CJK UNIFIED IDEOGRAPH -0xD6D8 0x8DEF #CJK UNIFIED IDEOGRAPH -0xD6D9 0x8F05 #CJK UNIFIED IDEOGRAPH -0xD6DA 0x9732 #CJK UNIFIED IDEOGRAPH -0xD6DB 0x9B6F #CJK UNIFIED IDEOGRAPH -0xD6DC 0x9DFA #CJK UNIFIED IDEOGRAPH -0xD6DD 0x9E75 #CJK UNIFIED IDEOGRAPH -0xD6DE 0x788C #CJK UNIFIED IDEOGRAPH -0xD6DF 0x797F #CJK UNIFIED IDEOGRAPH -0xD6E0 0x7DA0 #CJK UNIFIED IDEOGRAPH -0xD6E1 0x83C9 #CJK UNIFIED IDEOGRAPH -0xD6E2 0x9304 #CJK UNIFIED IDEOGRAPH -0xD6E3 0x9E7F #CJK UNIFIED IDEOGRAPH -0xD6E4 0x9E93 #CJK UNIFIED IDEOGRAPH -0xD6E5 0x8AD6 #CJK UNIFIED IDEOGRAPH -0xD6E6 0x58DF #CJK UNIFIED IDEOGRAPH -0xD6E7 0x5F04 #CJK UNIFIED IDEOGRAPH -0xD6E8 0x6727 #CJK UNIFIED IDEOGRAPH -0xD6E9 0x7027 #CJK UNIFIED IDEOGRAPH -0xD6EA 0x74CF #CJK UNIFIED IDEOGRAPH -0xD6EB 0x7C60 #CJK UNIFIED IDEOGRAPH -0xD6EC 0x807E #CJK UNIFIED IDEOGRAPH -0xD6ED 0x5121 #CJK UNIFIED IDEOGRAPH -0xD6EE 0x7028 #CJK UNIFIED IDEOGRAPH -0xD6EF 0x7262 #CJK UNIFIED IDEOGRAPH -0xD6F0 0x78CA #CJK UNIFIED IDEOGRAPH -0xD6F1 0x8CC2 #CJK UNIFIED IDEOGRAPH -0xD6F2 0x8CDA #CJK UNIFIED IDEOGRAPH -0xD6F3 0x8CF4 #CJK UNIFIED IDEOGRAPH -0xD6F4 0x96F7 #CJK UNIFIED IDEOGRAPH -0xD6F5 0x4E86 #CJK UNIFIED IDEOGRAPH -0xD6F6 0x50DA #CJK UNIFIED IDEOGRAPH -0xD6F7 0x5BEE #CJK UNIFIED IDEOGRAPH -0xD6F8 0x5ED6 #CJK UNIFIED IDEOGRAPH -0xD6F9 0x6599 #CJK UNIFIED IDEOGRAPH -0xD6FA 0x71CE #CJK UNIFIED IDEOGRAPH -0xD6FB 0x7642 #CJK UNIFIED IDEOGRAPH -0xD6FC 0x77AD #CJK UNIFIED IDEOGRAPH -0xD6FD 0x804A #CJK UNIFIED IDEOGRAPH -0xD6FE 0x84FC #CJK UNIFIED IDEOGRAPH -0xD7A1 0x907C #CJK UNIFIED IDEOGRAPH -0xD7A2 0x9B27 #CJK UNIFIED IDEOGRAPH -0xD7A3 0x9F8D #CJK UNIFIED IDEOGRAPH -0xD7A4 0x58D8 #CJK UNIFIED IDEOGRAPH -0xD7A5 0x5A41 #CJK UNIFIED IDEOGRAPH -0xD7A6 0x5C62 #CJK UNIFIED IDEOGRAPH -0xD7A7 0x6A13 #CJK UNIFIED IDEOGRAPH -0xD7A8 0x6DDA #CJK UNIFIED IDEOGRAPH -0xD7A9 0x6F0F #CJK UNIFIED IDEOGRAPH -0xD7AA 0x763B #CJK UNIFIED IDEOGRAPH -0xD7AB 0x7D2F #CJK UNIFIED IDEOGRAPH -0xD7AC 0x7E37 #CJK UNIFIED IDEOGRAPH -0xD7AD 0x851E #CJK UNIFIED IDEOGRAPH -0xD7AE 0x8938 #CJK UNIFIED IDEOGRAPH -0xD7AF 0x93E4 #CJK UNIFIED IDEOGRAPH -0xD7B0 0x964B #CJK UNIFIED IDEOGRAPH -0xD7B1 0x5289 #CJK UNIFIED IDEOGRAPH -0xD7B2 0x65D2 #CJK UNIFIED IDEOGRAPH -0xD7B3 0x67F3 #CJK UNIFIED IDEOGRAPH -0xD7B4 0x69B4 #CJK UNIFIED IDEOGRAPH -0xD7B5 0x6D41 #CJK UNIFIED IDEOGRAPH -0xD7B6 0x6E9C #CJK UNIFIED IDEOGRAPH -0xD7B7 0x700F #CJK UNIFIED IDEOGRAPH -0xD7B8 0x7409 #CJK UNIFIED IDEOGRAPH -0xD7B9 0x7460 #CJK UNIFIED IDEOGRAPH -0xD7BA 0x7559 #CJK UNIFIED IDEOGRAPH -0xD7BB 0x7624 #CJK UNIFIED IDEOGRAPH -0xD7BC 0x786B #CJK UNIFIED IDEOGRAPH -0xD7BD 0x8B2C #CJK UNIFIED IDEOGRAPH -0xD7BE 0x985E #CJK UNIFIED IDEOGRAPH -0xD7BF 0x516D #CJK UNIFIED IDEOGRAPH -0xD7C0 0x622E #CJK UNIFIED IDEOGRAPH -0xD7C1 0x9678 #CJK UNIFIED IDEOGRAPH -0xD7C2 0x4F96 #CJK UNIFIED IDEOGRAPH -0xD7C3 0x502B #CJK UNIFIED IDEOGRAPH -0xD7C4 0x5D19 #CJK UNIFIED IDEOGRAPH -0xD7C5 0x6DEA #CJK UNIFIED IDEOGRAPH -0xD7C6 0x7DB8 #CJK UNIFIED IDEOGRAPH -0xD7C7 0x8F2A #CJK UNIFIED IDEOGRAPH -0xD7C8 0x5F8B #CJK UNIFIED IDEOGRAPH -0xD7C9 0x6144 #CJK UNIFIED IDEOGRAPH -0xD7CA 0x6817 #CJK UNIFIED IDEOGRAPH -0xD7CB 0xF961 #CJK COMPATIBILITY IDEOGRAPH -0xD7CC 0x9686 #CJK UNIFIED IDEOGRAPH -0xD7CD 0x52D2 #CJK UNIFIED IDEOGRAPH -0xD7CE 0x808B #CJK UNIFIED IDEOGRAPH -0xD7CF 0x51DC #CJK UNIFIED IDEOGRAPH -0xD7D0 0x51CC #CJK UNIFIED IDEOGRAPH -0xD7D1 0x695E #CJK UNIFIED IDEOGRAPH -0xD7D2 0x7A1C #CJK UNIFIED IDEOGRAPH -0xD7D3 0x7DBE #CJK UNIFIED IDEOGRAPH -0xD7D4 0x83F1 #CJK UNIFIED IDEOGRAPH -0xD7D5 0x9675 #CJK UNIFIED IDEOGRAPH -0xD7D6 0x4FDA #CJK UNIFIED IDEOGRAPH -0xD7D7 0x5229 #CJK UNIFIED IDEOGRAPH -0xD7D8 0x5398 #CJK UNIFIED IDEOGRAPH -0xD7D9 0x540F #CJK UNIFIED IDEOGRAPH -0xD7DA 0x550E #CJK UNIFIED IDEOGRAPH -0xD7DB 0x5C65 #CJK UNIFIED IDEOGRAPH -0xD7DC 0x60A7 #CJK UNIFIED IDEOGRAPH -0xD7DD 0x674E #CJK UNIFIED IDEOGRAPH -0xD7DE 0x68A8 #CJK UNIFIED IDEOGRAPH -0xD7DF 0x6D6C #CJK UNIFIED IDEOGRAPH -0xD7E0 0x7281 #CJK UNIFIED IDEOGRAPH -0xD7E1 0x72F8 #CJK UNIFIED IDEOGRAPH -0xD7E2 0x7406 #CJK UNIFIED IDEOGRAPH -0xD7E3 0x7483 #CJK UNIFIED IDEOGRAPH -0xD7E4 0xF962 #CJK COMPATIBILITY IDEOGRAPH -0xD7E5 0x75E2 #CJK UNIFIED IDEOGRAPH -0xD7E6 0x7C6C #CJK UNIFIED IDEOGRAPH -0xD7E7 0x7F79 #CJK UNIFIED IDEOGRAPH -0xD7E8 0x7FB8 #CJK UNIFIED IDEOGRAPH -0xD7E9 0x8389 #CJK UNIFIED IDEOGRAPH -0xD7EA 0x88CF #CJK UNIFIED IDEOGRAPH -0xD7EB 0x88E1 #CJK UNIFIED IDEOGRAPH -0xD7EC 0x91CC #CJK UNIFIED IDEOGRAPH -0xD7ED 0x91D0 #CJK UNIFIED IDEOGRAPH -0xD7EE 0x96E2 #CJK UNIFIED IDEOGRAPH -0xD7EF 0x9BC9 #CJK UNIFIED IDEOGRAPH -0xD7F0 0x541D #CJK UNIFIED IDEOGRAPH -0xD7F1 0x6F7E #CJK UNIFIED IDEOGRAPH -0xD7F2 0x71D0 #CJK UNIFIED IDEOGRAPH -0xD7F3 0x7498 #CJK UNIFIED IDEOGRAPH -0xD7F4 0x85FA #CJK UNIFIED IDEOGRAPH -0xD7F5 0x8EAA #CJK UNIFIED IDEOGRAPH -0xD7F6 0x96A3 #CJK UNIFIED IDEOGRAPH -0xD7F7 0x9C57 #CJK UNIFIED IDEOGRAPH -0xD7F8 0x9E9F #CJK UNIFIED IDEOGRAPH -0xD7F9 0x6797 #CJK UNIFIED IDEOGRAPH -0xD7FA 0x6DCB #CJK UNIFIED IDEOGRAPH -0xD7FB 0x7433 #CJK UNIFIED IDEOGRAPH -0xD7FC 0x81E8 #CJK UNIFIED IDEOGRAPH -0xD7FD 0x9716 #CJK UNIFIED IDEOGRAPH -0xD7FE 0x782C #CJK UNIFIED IDEOGRAPH -0xD8A1 0x7ACB #CJK UNIFIED IDEOGRAPH -0xD8A2 0x7B20 #CJK UNIFIED IDEOGRAPH -0xD8A3 0x7C92 #CJK UNIFIED IDEOGRAPH -0xD8A4 0x6469 #CJK UNIFIED IDEOGRAPH -0xD8A5 0x746A #CJK UNIFIED IDEOGRAPH -0xD8A6 0x75F2 #CJK UNIFIED IDEOGRAPH -0xD8A7 0x78BC #CJK UNIFIED IDEOGRAPH -0xD8A8 0x78E8 #CJK UNIFIED IDEOGRAPH -0xD8A9 0x99AC #CJK UNIFIED IDEOGRAPH -0xD8AA 0x9B54 #CJK UNIFIED IDEOGRAPH -0xD8AB 0x9EBB #CJK UNIFIED IDEOGRAPH -0xD8AC 0x5BDE #CJK UNIFIED IDEOGRAPH -0xD8AD 0x5E55 #CJK UNIFIED IDEOGRAPH -0xD8AE 0x6F20 #CJK UNIFIED IDEOGRAPH -0xD8AF 0x819C #CJK UNIFIED IDEOGRAPH -0xD8B0 0x83AB #CJK UNIFIED IDEOGRAPH -0xD8B1 0x9088 #CJK UNIFIED IDEOGRAPH -0xD8B2 0x4E07 #CJK UNIFIED IDEOGRAPH -0xD8B3 0x534D #CJK UNIFIED IDEOGRAPH -0xD8B4 0x5A29 #CJK UNIFIED IDEOGRAPH -0xD8B5 0x5DD2 #CJK UNIFIED IDEOGRAPH -0xD8B6 0x5F4E #CJK UNIFIED IDEOGRAPH -0xD8B7 0x6162 #CJK UNIFIED IDEOGRAPH -0xD8B8 0x633D #CJK UNIFIED IDEOGRAPH -0xD8B9 0x6669 #CJK UNIFIED IDEOGRAPH -0xD8BA 0x66FC #CJK UNIFIED IDEOGRAPH -0xD8BB 0x6EFF #CJK UNIFIED IDEOGRAPH -0xD8BC 0x6F2B #CJK UNIFIED IDEOGRAPH -0xD8BD 0x7063 #CJK UNIFIED IDEOGRAPH -0xD8BE 0x779E #CJK UNIFIED IDEOGRAPH -0xD8BF 0x842C #CJK UNIFIED IDEOGRAPH -0xD8C0 0x8513 #CJK UNIFIED IDEOGRAPH -0xD8C1 0x883B #CJK UNIFIED IDEOGRAPH -0xD8C2 0x8F13 #CJK UNIFIED IDEOGRAPH -0xD8C3 0x9945 #CJK UNIFIED IDEOGRAPH -0xD8C4 0x9C3B #CJK UNIFIED IDEOGRAPH -0xD8C5 0x551C #CJK UNIFIED IDEOGRAPH -0xD8C6 0x62B9 #CJK UNIFIED IDEOGRAPH -0xD8C7 0x672B #CJK UNIFIED IDEOGRAPH -0xD8C8 0x6CAB #CJK UNIFIED IDEOGRAPH -0xD8C9 0x8309 #CJK UNIFIED IDEOGRAPH -0xD8CA 0x896A #CJK UNIFIED IDEOGRAPH -0xD8CB 0x977A #CJK UNIFIED IDEOGRAPH -0xD8CC 0x4EA1 #CJK UNIFIED IDEOGRAPH -0xD8CD 0x5984 #CJK UNIFIED IDEOGRAPH -0xD8CE 0x5FD8 #CJK UNIFIED IDEOGRAPH -0xD8CF 0x5FD9 #CJK UNIFIED IDEOGRAPH -0xD8D0 0x671B #CJK UNIFIED IDEOGRAPH -0xD8D1 0x7DB2 #CJK UNIFIED IDEOGRAPH -0xD8D2 0x7F54 #CJK UNIFIED IDEOGRAPH -0xD8D3 0x8292 #CJK UNIFIED IDEOGRAPH -0xD8D4 0x832B #CJK UNIFIED IDEOGRAPH -0xD8D5 0x83BD #CJK UNIFIED IDEOGRAPH -0xD8D6 0x8F1E #CJK UNIFIED IDEOGRAPH -0xD8D7 0x9099 #CJK UNIFIED IDEOGRAPH -0xD8D8 0x57CB #CJK UNIFIED IDEOGRAPH -0xD8D9 0x59B9 #CJK UNIFIED IDEOGRAPH -0xD8DA 0x5A92 #CJK UNIFIED IDEOGRAPH -0xD8DB 0x5BD0 #CJK UNIFIED IDEOGRAPH -0xD8DC 0x6627 #CJK UNIFIED IDEOGRAPH -0xD8DD 0x679A #CJK UNIFIED IDEOGRAPH -0xD8DE 0x6885 #CJK UNIFIED IDEOGRAPH -0xD8DF 0x6BCF #CJK UNIFIED IDEOGRAPH -0xD8E0 0x7164 #CJK UNIFIED IDEOGRAPH -0xD8E1 0x7F75 #CJK UNIFIED IDEOGRAPH -0xD8E2 0x8CB7 #CJK UNIFIED IDEOGRAPH -0xD8E3 0x8CE3 #CJK UNIFIED IDEOGRAPH -0xD8E4 0x9081 #CJK UNIFIED IDEOGRAPH -0xD8E5 0x9B45 #CJK UNIFIED IDEOGRAPH -0xD8E6 0x8108 #CJK UNIFIED IDEOGRAPH -0xD8E7 0x8C8A #CJK UNIFIED IDEOGRAPH -0xD8E8 0x964C #CJK UNIFIED IDEOGRAPH -0xD8E9 0x9A40 #CJK UNIFIED IDEOGRAPH -0xD8EA 0x9EA5 #CJK UNIFIED IDEOGRAPH -0xD8EB 0x5B5F #CJK UNIFIED IDEOGRAPH -0xD8EC 0x6C13 #CJK UNIFIED IDEOGRAPH -0xD8ED 0x731B #CJK UNIFIED IDEOGRAPH -0xD8EE 0x76F2 #CJK UNIFIED IDEOGRAPH -0xD8EF 0x76DF #CJK UNIFIED IDEOGRAPH -0xD8F0 0x840C #CJK UNIFIED IDEOGRAPH -0xD8F1 0x51AA #CJK UNIFIED IDEOGRAPH -0xD8F2 0x8993 #CJK UNIFIED IDEOGRAPH -0xD8F3 0x514D #CJK UNIFIED IDEOGRAPH -0xD8F4 0x5195 #CJK UNIFIED IDEOGRAPH -0xD8F5 0x52C9 #CJK UNIFIED IDEOGRAPH -0xD8F6 0x68C9 #CJK UNIFIED IDEOGRAPH -0xD8F7 0x6C94 #CJK UNIFIED IDEOGRAPH -0xD8F8 0x7704 #CJK UNIFIED IDEOGRAPH -0xD8F9 0x7720 #CJK UNIFIED IDEOGRAPH -0xD8FA 0x7DBF #CJK UNIFIED IDEOGRAPH -0xD8FB 0x7DEC #CJK UNIFIED IDEOGRAPH -0xD8FC 0x9762 #CJK UNIFIED IDEOGRAPH -0xD8FD 0x9EB5 #CJK UNIFIED IDEOGRAPH -0xD8FE 0x6EC5 #CJK UNIFIED IDEOGRAPH -0xD9A1 0x8511 #CJK UNIFIED IDEOGRAPH -0xD9A2 0x51A5 #CJK UNIFIED IDEOGRAPH -0xD9A3 0x540D #CJK UNIFIED IDEOGRAPH -0xD9A4 0x547D #CJK UNIFIED IDEOGRAPH -0xD9A5 0x660E #CJK UNIFIED IDEOGRAPH -0xD9A6 0x669D #CJK UNIFIED IDEOGRAPH -0xD9A7 0x6927 #CJK UNIFIED IDEOGRAPH -0xD9A8 0x6E9F #CJK UNIFIED IDEOGRAPH -0xD9A9 0x76BF #CJK UNIFIED IDEOGRAPH -0xD9AA 0x7791 #CJK UNIFIED IDEOGRAPH -0xD9AB 0x8317 #CJK UNIFIED IDEOGRAPH -0xD9AC 0x84C2 #CJK UNIFIED IDEOGRAPH -0xD9AD 0x879F #CJK UNIFIED IDEOGRAPH -0xD9AE 0x9169 #CJK UNIFIED IDEOGRAPH -0xD9AF 0x9298 #CJK UNIFIED IDEOGRAPH -0xD9B0 0x9CF4 #CJK UNIFIED IDEOGRAPH -0xD9B1 0x8882 #CJK UNIFIED IDEOGRAPH -0xD9B2 0x4FAE #CJK UNIFIED IDEOGRAPH -0xD9B3 0x5192 #CJK UNIFIED IDEOGRAPH -0xD9B4 0x52DF #CJK UNIFIED IDEOGRAPH -0xD9B5 0x59C6 #CJK UNIFIED IDEOGRAPH -0xD9B6 0x5E3D #CJK UNIFIED IDEOGRAPH -0xD9B7 0x6155 #CJK UNIFIED IDEOGRAPH -0xD9B8 0x6478 #CJK UNIFIED IDEOGRAPH -0xD9B9 0x6479 #CJK UNIFIED IDEOGRAPH -0xD9BA 0x66AE #CJK UNIFIED IDEOGRAPH -0xD9BB 0x67D0 #CJK UNIFIED IDEOGRAPH -0xD9BC 0x6A21 #CJK UNIFIED IDEOGRAPH -0xD9BD 0x6BCD #CJK UNIFIED IDEOGRAPH -0xD9BE 0x6BDB #CJK UNIFIED IDEOGRAPH -0xD9BF 0x725F #CJK UNIFIED IDEOGRAPH -0xD9C0 0x7261 #CJK UNIFIED IDEOGRAPH -0xD9C1 0x7441 #CJK UNIFIED IDEOGRAPH -0xD9C2 0x7738 #CJK UNIFIED IDEOGRAPH -0xD9C3 0x77DB #CJK UNIFIED IDEOGRAPH -0xD9C4 0x8017 #CJK UNIFIED IDEOGRAPH -0xD9C5 0x82BC #CJK UNIFIED IDEOGRAPH -0xD9C6 0x8305 #CJK UNIFIED IDEOGRAPH -0xD9C7 0x8B00 #CJK UNIFIED IDEOGRAPH -0xD9C8 0x8B28 #CJK UNIFIED IDEOGRAPH -0xD9C9 0x8C8C #CJK UNIFIED IDEOGRAPH -0xD9CA 0x6728 #CJK UNIFIED IDEOGRAPH -0xD9CB 0x6C90 #CJK UNIFIED IDEOGRAPH -0xD9CC 0x7267 #CJK UNIFIED IDEOGRAPH -0xD9CD 0x76EE #CJK UNIFIED IDEOGRAPH -0xD9CE 0x7766 #CJK UNIFIED IDEOGRAPH -0xD9CF 0x7A46 #CJK UNIFIED IDEOGRAPH -0xD9D0 0x9DA9 #CJK UNIFIED IDEOGRAPH -0xD9D1 0x6B7F #CJK UNIFIED IDEOGRAPH -0xD9D2 0x6C92 #CJK UNIFIED IDEOGRAPH -0xD9D3 0x5922 #CJK UNIFIED IDEOGRAPH -0xD9D4 0x6726 #CJK UNIFIED IDEOGRAPH -0xD9D5 0x8499 #CJK UNIFIED IDEOGRAPH -0xD9D6 0x536F #CJK UNIFIED IDEOGRAPH -0xD9D7 0x5893 #CJK UNIFIED IDEOGRAPH -0xD9D8 0x5999 #CJK UNIFIED IDEOGRAPH -0xD9D9 0x5EDF #CJK UNIFIED IDEOGRAPH -0xD9DA 0x63CF #CJK UNIFIED IDEOGRAPH -0xD9DB 0x6634 #CJK UNIFIED IDEOGRAPH -0xD9DC 0x6773 #CJK UNIFIED IDEOGRAPH -0xD9DD 0x6E3A #CJK UNIFIED IDEOGRAPH -0xD9DE 0x732B #CJK UNIFIED IDEOGRAPH -0xD9DF 0x7AD7 #CJK UNIFIED IDEOGRAPH -0xD9E0 0x82D7 #CJK UNIFIED IDEOGRAPH -0xD9E1 0x9328 #CJK UNIFIED IDEOGRAPH -0xD9E2 0x52D9 #CJK UNIFIED IDEOGRAPH -0xD9E3 0x5DEB #CJK UNIFIED IDEOGRAPH -0xD9E4 0x61AE #CJK UNIFIED IDEOGRAPH -0xD9E5 0x61CB #CJK UNIFIED IDEOGRAPH -0xD9E6 0x620A #CJK UNIFIED IDEOGRAPH -0xD9E7 0x62C7 #CJK UNIFIED IDEOGRAPH -0xD9E8 0x64AB #CJK UNIFIED IDEOGRAPH -0xD9E9 0x65E0 #CJK UNIFIED IDEOGRAPH -0xD9EA 0x6959 #CJK UNIFIED IDEOGRAPH -0xD9EB 0x6B66 #CJK UNIFIED IDEOGRAPH -0xD9EC 0x6BCB #CJK UNIFIED IDEOGRAPH -0xD9ED 0x7121 #CJK UNIFIED IDEOGRAPH -0xD9EE 0x73F7 #CJK UNIFIED IDEOGRAPH -0xD9EF 0x755D #CJK UNIFIED IDEOGRAPH -0xD9F0 0x7E46 #CJK UNIFIED IDEOGRAPH -0xD9F1 0x821E #CJK UNIFIED IDEOGRAPH -0xD9F2 0x8302 #CJK UNIFIED IDEOGRAPH -0xD9F3 0x856A #CJK UNIFIED IDEOGRAPH -0xD9F4 0x8AA3 #CJK UNIFIED IDEOGRAPH -0xD9F5 0x8CBF #CJK UNIFIED IDEOGRAPH -0xD9F6 0x9727 #CJK UNIFIED IDEOGRAPH -0xD9F7 0x9D61 #CJK UNIFIED IDEOGRAPH -0xD9F8 0x58A8 #CJK UNIFIED IDEOGRAPH -0xD9F9 0x9ED8 #CJK UNIFIED IDEOGRAPH -0xD9FA 0x5011 #CJK UNIFIED IDEOGRAPH -0xD9FB 0x520E #CJK UNIFIED IDEOGRAPH -0xD9FC 0x543B #CJK UNIFIED IDEOGRAPH -0xD9FD 0x554F #CJK UNIFIED IDEOGRAPH -0xD9FE 0x6587 #CJK UNIFIED IDEOGRAPH -0xDAA1 0x6C76 #CJK UNIFIED IDEOGRAPH -0xDAA2 0x7D0A #CJK UNIFIED IDEOGRAPH -0xDAA3 0x7D0B #CJK UNIFIED IDEOGRAPH -0xDAA4 0x805E #CJK UNIFIED IDEOGRAPH -0xDAA5 0x868A #CJK UNIFIED IDEOGRAPH -0xDAA6 0x9580 #CJK UNIFIED IDEOGRAPH -0xDAA7 0x96EF #CJK UNIFIED IDEOGRAPH -0xDAA8 0x52FF #CJK UNIFIED IDEOGRAPH -0xDAA9 0x6C95 #CJK UNIFIED IDEOGRAPH -0xDAAA 0x7269 #CJK UNIFIED IDEOGRAPH -0xDAAB 0x5473 #CJK UNIFIED IDEOGRAPH -0xDAAC 0x5A9A #CJK UNIFIED IDEOGRAPH -0xDAAD 0x5C3E #CJK UNIFIED IDEOGRAPH -0xDAAE 0x5D4B #CJK UNIFIED IDEOGRAPH -0xDAAF 0x5F4C #CJK UNIFIED IDEOGRAPH -0xDAB0 0x5FAE #CJK UNIFIED IDEOGRAPH -0xDAB1 0x672A #CJK UNIFIED IDEOGRAPH -0xDAB2 0x68B6 #CJK UNIFIED IDEOGRAPH -0xDAB3 0x6963 #CJK UNIFIED IDEOGRAPH -0xDAB4 0x6E3C #CJK UNIFIED IDEOGRAPH -0xDAB5 0x6E44 #CJK UNIFIED IDEOGRAPH -0xDAB6 0x7709 #CJK UNIFIED IDEOGRAPH -0xDAB7 0x7C73 #CJK UNIFIED IDEOGRAPH -0xDAB8 0x7F8E #CJK UNIFIED IDEOGRAPH -0xDAB9 0x8587 #CJK UNIFIED IDEOGRAPH -0xDABA 0x8B0E #CJK UNIFIED IDEOGRAPH -0xDABB 0x8FF7 #CJK UNIFIED IDEOGRAPH -0xDABC 0x9761 #CJK UNIFIED IDEOGRAPH -0xDABD 0x9EF4 #CJK UNIFIED IDEOGRAPH -0xDABE 0x5CB7 #CJK UNIFIED IDEOGRAPH -0xDABF 0x60B6 #CJK UNIFIED IDEOGRAPH -0xDAC0 0x610D #CJK UNIFIED IDEOGRAPH -0xDAC1 0x61AB #CJK UNIFIED IDEOGRAPH -0xDAC2 0x654F #CJK UNIFIED IDEOGRAPH -0xDAC3 0x65FB #CJK UNIFIED IDEOGRAPH -0xDAC4 0x65FC #CJK UNIFIED IDEOGRAPH -0xDAC5 0x6C11 #CJK UNIFIED IDEOGRAPH -0xDAC6 0x6CEF #CJK UNIFIED IDEOGRAPH -0xDAC7 0x739F #CJK UNIFIED IDEOGRAPH -0xDAC8 0x73C9 #CJK UNIFIED IDEOGRAPH -0xDAC9 0x7DE1 #CJK UNIFIED IDEOGRAPH -0xDACA 0x9594 #CJK UNIFIED IDEOGRAPH -0xDACB 0x5BC6 #CJK UNIFIED IDEOGRAPH -0xDACC 0x871C #CJK UNIFIED IDEOGRAPH -0xDACD 0x8B10 #CJK UNIFIED IDEOGRAPH -0xDACE 0x525D #CJK UNIFIED IDEOGRAPH -0xDACF 0x535A #CJK UNIFIED IDEOGRAPH -0xDAD0 0x62CD #CJK UNIFIED IDEOGRAPH -0xDAD1 0x640F #CJK UNIFIED IDEOGRAPH -0xDAD2 0x64B2 #CJK UNIFIED IDEOGRAPH -0xDAD3 0x6734 #CJK UNIFIED IDEOGRAPH -0xDAD4 0x6A38 #CJK UNIFIED IDEOGRAPH -0xDAD5 0x6CCA #CJK UNIFIED IDEOGRAPH -0xDAD6 0x73C0 #CJK UNIFIED IDEOGRAPH -0xDAD7 0x749E #CJK UNIFIED IDEOGRAPH -0xDAD8 0x7B94 #CJK UNIFIED IDEOGRAPH -0xDAD9 0x7C95 #CJK UNIFIED IDEOGRAPH -0xDADA 0x7E1B #CJK UNIFIED IDEOGRAPH -0xDADB 0x818A #CJK UNIFIED IDEOGRAPH -0xDADC 0x8236 #CJK UNIFIED IDEOGRAPH -0xDADD 0x8584 #CJK UNIFIED IDEOGRAPH -0xDADE 0x8FEB #CJK UNIFIED IDEOGRAPH -0xDADF 0x96F9 #CJK UNIFIED IDEOGRAPH -0xDAE0 0x99C1 #CJK UNIFIED IDEOGRAPH -0xDAE1 0x4F34 #CJK UNIFIED IDEOGRAPH -0xDAE2 0x534A #CJK UNIFIED IDEOGRAPH -0xDAE3 0x53CD #CJK UNIFIED IDEOGRAPH -0xDAE4 0x53DB #CJK UNIFIED IDEOGRAPH -0xDAE5 0x62CC #CJK UNIFIED IDEOGRAPH -0xDAE6 0x642C #CJK UNIFIED IDEOGRAPH -0xDAE7 0x6500 #CJK UNIFIED IDEOGRAPH -0xDAE8 0x6591 #CJK UNIFIED IDEOGRAPH -0xDAE9 0x69C3 #CJK UNIFIED IDEOGRAPH -0xDAEA 0x6CEE #CJK UNIFIED IDEOGRAPH -0xDAEB 0x6F58 #CJK UNIFIED IDEOGRAPH -0xDAEC 0x73ED #CJK UNIFIED IDEOGRAPH -0xDAED 0x7554 #CJK UNIFIED IDEOGRAPH -0xDAEE 0x7622 #CJK UNIFIED IDEOGRAPH -0xDAEF 0x76E4 #CJK UNIFIED IDEOGRAPH -0xDAF0 0x76FC #CJK UNIFIED IDEOGRAPH -0xDAF1 0x78D0 #CJK UNIFIED IDEOGRAPH -0xDAF2 0x78FB #CJK UNIFIED IDEOGRAPH -0xDAF3 0x792C #CJK UNIFIED IDEOGRAPH -0xDAF4 0x7D46 #CJK UNIFIED IDEOGRAPH -0xDAF5 0x822C #CJK UNIFIED IDEOGRAPH -0xDAF6 0x87E0 #CJK UNIFIED IDEOGRAPH -0xDAF7 0x8FD4 #CJK UNIFIED IDEOGRAPH -0xDAF8 0x9812 #CJK UNIFIED IDEOGRAPH -0xDAF9 0x98EF #CJK UNIFIED IDEOGRAPH -0xDAFA 0x52C3 #CJK UNIFIED IDEOGRAPH -0xDAFB 0x62D4 #CJK UNIFIED IDEOGRAPH -0xDAFC 0x64A5 #CJK UNIFIED IDEOGRAPH -0xDAFD 0x6E24 #CJK UNIFIED IDEOGRAPH -0xDAFE 0x6F51 #CJK UNIFIED IDEOGRAPH -0xDBA1 0x767C #CJK UNIFIED IDEOGRAPH -0xDBA2 0x8DCB #CJK UNIFIED IDEOGRAPH -0xDBA3 0x91B1 #CJK UNIFIED IDEOGRAPH -0xDBA4 0x9262 #CJK UNIFIED IDEOGRAPH -0xDBA5 0x9AEE #CJK UNIFIED IDEOGRAPH -0xDBA6 0x9B43 #CJK UNIFIED IDEOGRAPH -0xDBA7 0x5023 #CJK UNIFIED IDEOGRAPH -0xDBA8 0x508D #CJK UNIFIED IDEOGRAPH -0xDBA9 0x574A #CJK UNIFIED IDEOGRAPH -0xDBAA 0x59A8 #CJK UNIFIED IDEOGRAPH -0xDBAB 0x5C28 #CJK UNIFIED IDEOGRAPH -0xDBAC 0x5E47 #CJK UNIFIED IDEOGRAPH -0xDBAD 0x5F77 #CJK UNIFIED IDEOGRAPH -0xDBAE 0x623F #CJK UNIFIED IDEOGRAPH -0xDBAF 0x653E #CJK UNIFIED IDEOGRAPH -0xDBB0 0x65B9 #CJK UNIFIED IDEOGRAPH -0xDBB1 0x65C1 #CJK UNIFIED IDEOGRAPH -0xDBB2 0x6609 #CJK UNIFIED IDEOGRAPH -0xDBB3 0x678B #CJK UNIFIED IDEOGRAPH -0xDBB4 0x699C #CJK UNIFIED IDEOGRAPH -0xDBB5 0x6EC2 #CJK UNIFIED IDEOGRAPH -0xDBB6 0x78C5 #CJK UNIFIED IDEOGRAPH -0xDBB7 0x7D21 #CJK UNIFIED IDEOGRAPH -0xDBB8 0x80AA #CJK UNIFIED IDEOGRAPH -0xDBB9 0x8180 #CJK UNIFIED IDEOGRAPH -0xDBBA 0x822B #CJK UNIFIED IDEOGRAPH -0xDBBB 0x82B3 #CJK UNIFIED IDEOGRAPH -0xDBBC 0x84A1 #CJK UNIFIED IDEOGRAPH -0xDBBD 0x868C #CJK UNIFIED IDEOGRAPH -0xDBBE 0x8A2A #CJK UNIFIED IDEOGRAPH -0xDBBF 0x8B17 #CJK UNIFIED IDEOGRAPH -0xDBC0 0x90A6 #CJK UNIFIED IDEOGRAPH -0xDBC1 0x9632 #CJK UNIFIED IDEOGRAPH -0xDBC2 0x9F90 #CJK UNIFIED IDEOGRAPH -0xDBC3 0x500D #CJK UNIFIED IDEOGRAPH -0xDBC4 0x4FF3 #CJK UNIFIED IDEOGRAPH -0xDBC5 0xF963 #CJK COMPATIBILITY IDEOGRAPH -0xDBC6 0x57F9 #CJK UNIFIED IDEOGRAPH -0xDBC7 0x5F98 #CJK UNIFIED IDEOGRAPH -0xDBC8 0x62DC #CJK UNIFIED IDEOGRAPH -0xDBC9 0x6392 #CJK UNIFIED IDEOGRAPH -0xDBCA 0x676F #CJK UNIFIED IDEOGRAPH -0xDBCB 0x6E43 #CJK UNIFIED IDEOGRAPH -0xDBCC 0x7119 #CJK UNIFIED IDEOGRAPH -0xDBCD 0x76C3 #CJK UNIFIED IDEOGRAPH -0xDBCE 0x80CC #CJK UNIFIED IDEOGRAPH -0xDBCF 0x80DA #CJK UNIFIED IDEOGRAPH -0xDBD0 0x88F4 #CJK UNIFIED IDEOGRAPH -0xDBD1 0x88F5 #CJK UNIFIED IDEOGRAPH -0xDBD2 0x8919 #CJK UNIFIED IDEOGRAPH -0xDBD3 0x8CE0 #CJK UNIFIED IDEOGRAPH -0xDBD4 0x8F29 #CJK UNIFIED IDEOGRAPH -0xDBD5 0x914D #CJK UNIFIED IDEOGRAPH -0xDBD6 0x966A #CJK UNIFIED IDEOGRAPH -0xDBD7 0x4F2F #CJK UNIFIED IDEOGRAPH -0xDBD8 0x4F70 #CJK UNIFIED IDEOGRAPH -0xDBD9 0x5E1B #CJK UNIFIED IDEOGRAPH -0xDBDA 0x67CF #CJK UNIFIED IDEOGRAPH -0xDBDB 0x6822 #CJK UNIFIED IDEOGRAPH -0xDBDC 0x767D #CJK UNIFIED IDEOGRAPH -0xDBDD 0x767E #CJK UNIFIED IDEOGRAPH -0xDBDE 0x9B44 #CJK UNIFIED IDEOGRAPH -0xDBDF 0x5E61 #CJK UNIFIED IDEOGRAPH -0xDBE0 0x6A0A #CJK UNIFIED IDEOGRAPH -0xDBE1 0x7169 #CJK UNIFIED IDEOGRAPH -0xDBE2 0x71D4 #CJK UNIFIED IDEOGRAPH -0xDBE3 0x756A #CJK UNIFIED IDEOGRAPH -0xDBE4 0xF964 #CJK COMPATIBILITY IDEOGRAPH -0xDBE5 0x7E41 #CJK UNIFIED IDEOGRAPH -0xDBE6 0x8543 #CJK UNIFIED IDEOGRAPH -0xDBE7 0x85E9 #CJK UNIFIED IDEOGRAPH -0xDBE8 0x98DC #CJK UNIFIED IDEOGRAPH -0xDBE9 0x4F10 #CJK UNIFIED IDEOGRAPH -0xDBEA 0x7B4F #CJK UNIFIED IDEOGRAPH -0xDBEB 0x7F70 #CJK UNIFIED IDEOGRAPH -0xDBEC 0x95A5 #CJK UNIFIED IDEOGRAPH -0xDBED 0x51E1 #CJK UNIFIED IDEOGRAPH -0xDBEE 0x5E06 #CJK UNIFIED IDEOGRAPH -0xDBEF 0x68B5 #CJK UNIFIED IDEOGRAPH -0xDBF0 0x6C3E #CJK UNIFIED IDEOGRAPH -0xDBF1 0x6C4E #CJK UNIFIED IDEOGRAPH -0xDBF2 0x6CDB #CJK UNIFIED IDEOGRAPH -0xDBF3 0x72AF #CJK UNIFIED IDEOGRAPH -0xDBF4 0x7BC4 #CJK UNIFIED IDEOGRAPH -0xDBF5 0x8303 #CJK UNIFIED IDEOGRAPH -0xDBF6 0x6CD5 #CJK UNIFIED IDEOGRAPH -0xDBF7 0x743A #CJK UNIFIED IDEOGRAPH -0xDBF8 0x50FB #CJK UNIFIED IDEOGRAPH -0xDBF9 0x5288 #CJK UNIFIED IDEOGRAPH -0xDBFA 0x58C1 #CJK UNIFIED IDEOGRAPH -0xDBFB 0x64D8 #CJK UNIFIED IDEOGRAPH -0xDBFC 0x6A97 #CJK UNIFIED IDEOGRAPH -0xDBFD 0x74A7 #CJK UNIFIED IDEOGRAPH -0xDBFE 0x7656 #CJK UNIFIED IDEOGRAPH -0xDCA1 0x78A7 #CJK UNIFIED IDEOGRAPH -0xDCA2 0x8617 #CJK UNIFIED IDEOGRAPH -0xDCA3 0x95E2 #CJK UNIFIED IDEOGRAPH -0xDCA4 0x9739 #CJK UNIFIED IDEOGRAPH -0xDCA5 0xF965 #CJK COMPATIBILITY IDEOGRAPH -0xDCA6 0x535E #CJK UNIFIED IDEOGRAPH -0xDCA7 0x5F01 #CJK UNIFIED IDEOGRAPH -0xDCA8 0x8B8A #CJK UNIFIED IDEOGRAPH -0xDCA9 0x8FA8 #CJK UNIFIED IDEOGRAPH -0xDCAA 0x8FAF #CJK UNIFIED IDEOGRAPH -0xDCAB 0x908A #CJK UNIFIED IDEOGRAPH -0xDCAC 0x5225 #CJK UNIFIED IDEOGRAPH -0xDCAD 0x77A5 #CJK UNIFIED IDEOGRAPH -0xDCAE 0x9C49 #CJK UNIFIED IDEOGRAPH -0xDCAF 0x9F08 #CJK UNIFIED IDEOGRAPH -0xDCB0 0x4E19 #CJK UNIFIED IDEOGRAPH -0xDCB1 0x5002 #CJK UNIFIED IDEOGRAPH -0xDCB2 0x5175 #CJK UNIFIED IDEOGRAPH -0xDCB3 0x5C5B #CJK UNIFIED IDEOGRAPH -0xDCB4 0x5E77 #CJK UNIFIED IDEOGRAPH -0xDCB5 0x661E #CJK UNIFIED IDEOGRAPH -0xDCB6 0x663A #CJK UNIFIED IDEOGRAPH -0xDCB7 0x67C4 #CJK UNIFIED IDEOGRAPH -0xDCB8 0x68C5 #CJK UNIFIED IDEOGRAPH -0xDCB9 0x70B3 #CJK UNIFIED IDEOGRAPH -0xDCBA 0x7501 #CJK UNIFIED IDEOGRAPH -0xDCBB 0x75C5 #CJK UNIFIED IDEOGRAPH -0xDCBC 0x79C9 #CJK UNIFIED IDEOGRAPH -0xDCBD 0x7ADD #CJK UNIFIED IDEOGRAPH -0xDCBE 0x8F27 #CJK UNIFIED IDEOGRAPH -0xDCBF 0x9920 #CJK UNIFIED IDEOGRAPH -0xDCC0 0x9A08 #CJK UNIFIED IDEOGRAPH -0xDCC1 0x4FDD #CJK UNIFIED IDEOGRAPH -0xDCC2 0x5821 #CJK UNIFIED IDEOGRAPH -0xDCC3 0x5831 #CJK UNIFIED IDEOGRAPH -0xDCC4 0x5BF6 #CJK UNIFIED IDEOGRAPH -0xDCC5 0x666E #CJK UNIFIED IDEOGRAPH -0xDCC6 0x6B65 #CJK UNIFIED IDEOGRAPH -0xDCC7 0x6D11 #CJK UNIFIED IDEOGRAPH -0xDCC8 0x6E7A #CJK UNIFIED IDEOGRAPH -0xDCC9 0x6F7D #CJK UNIFIED IDEOGRAPH -0xDCCA 0x73E4 #CJK UNIFIED IDEOGRAPH -0xDCCB 0x752B #CJK UNIFIED IDEOGRAPH -0xDCCC 0x83E9 #CJK UNIFIED IDEOGRAPH -0xDCCD 0x88DC #CJK UNIFIED IDEOGRAPH -0xDCCE 0x8913 #CJK UNIFIED IDEOGRAPH -0xDCCF 0x8B5C #CJK UNIFIED IDEOGRAPH -0xDCD0 0x8F14 #CJK UNIFIED IDEOGRAPH -0xDCD1 0x4F0F #CJK UNIFIED IDEOGRAPH -0xDCD2 0x50D5 #CJK UNIFIED IDEOGRAPH -0xDCD3 0x5310 #CJK UNIFIED IDEOGRAPH -0xDCD4 0x535C #CJK UNIFIED IDEOGRAPH -0xDCD5 0x5B93 #CJK UNIFIED IDEOGRAPH -0xDCD6 0x5FA9 #CJK UNIFIED IDEOGRAPH -0xDCD7 0x670D #CJK UNIFIED IDEOGRAPH -0xDCD8 0x798F #CJK UNIFIED IDEOGRAPH -0xDCD9 0x8179 #CJK UNIFIED IDEOGRAPH -0xDCDA 0x832F #CJK UNIFIED IDEOGRAPH -0xDCDB 0x8514 #CJK UNIFIED IDEOGRAPH -0xDCDC 0x8907 #CJK UNIFIED IDEOGRAPH -0xDCDD 0x8986 #CJK UNIFIED IDEOGRAPH -0xDCDE 0x8F39 #CJK UNIFIED IDEOGRAPH -0xDCDF 0x8F3B #CJK UNIFIED IDEOGRAPH -0xDCE0 0x99A5 #CJK UNIFIED IDEOGRAPH -0xDCE1 0x9C12 #CJK UNIFIED IDEOGRAPH -0xDCE2 0x672C #CJK UNIFIED IDEOGRAPH -0xDCE3 0x4E76 #CJK UNIFIED IDEOGRAPH -0xDCE4 0x4FF8 #CJK UNIFIED IDEOGRAPH -0xDCE5 0x5949 #CJK UNIFIED IDEOGRAPH -0xDCE6 0x5C01 #CJK UNIFIED IDEOGRAPH -0xDCE7 0x5CEF #CJK UNIFIED IDEOGRAPH -0xDCE8 0x5CF0 #CJK UNIFIED IDEOGRAPH -0xDCE9 0x6367 #CJK UNIFIED IDEOGRAPH -0xDCEA 0x68D2 #CJK UNIFIED IDEOGRAPH -0xDCEB 0x70FD #CJK UNIFIED IDEOGRAPH -0xDCEC 0x71A2 #CJK UNIFIED IDEOGRAPH -0xDCED 0x742B #CJK UNIFIED IDEOGRAPH -0xDCEE 0x7E2B #CJK UNIFIED IDEOGRAPH -0xDCEF 0x84EC #CJK UNIFIED IDEOGRAPH -0xDCF0 0x8702 #CJK UNIFIED IDEOGRAPH -0xDCF1 0x9022 #CJK UNIFIED IDEOGRAPH -0xDCF2 0x92D2 #CJK UNIFIED IDEOGRAPH -0xDCF3 0x9CF3 #CJK UNIFIED IDEOGRAPH -0xDCF4 0x4E0D #CJK UNIFIED IDEOGRAPH -0xDCF5 0x4ED8 #CJK UNIFIED IDEOGRAPH -0xDCF6 0x4FEF #CJK UNIFIED IDEOGRAPH -0xDCF7 0x5085 #CJK UNIFIED IDEOGRAPH -0xDCF8 0x5256 #CJK UNIFIED IDEOGRAPH -0xDCF9 0x526F #CJK UNIFIED IDEOGRAPH -0xDCFA 0x5426 #CJK UNIFIED IDEOGRAPH -0xDCFB 0x5490 #CJK UNIFIED IDEOGRAPH -0xDCFC 0x57E0 #CJK UNIFIED IDEOGRAPH -0xDCFD 0x592B #CJK UNIFIED IDEOGRAPH -0xDCFE 0x5A66 #CJK UNIFIED IDEOGRAPH -0xDDA1 0x5B5A #CJK UNIFIED IDEOGRAPH -0xDDA2 0x5B75 #CJK UNIFIED IDEOGRAPH -0xDDA3 0x5BCC #CJK UNIFIED IDEOGRAPH -0xDDA4 0x5E9C #CJK UNIFIED IDEOGRAPH -0xDDA5 0xF966 #CJK COMPATIBILITY IDEOGRAPH -0xDDA6 0x6276 #CJK UNIFIED IDEOGRAPH -0xDDA7 0x6577 #CJK UNIFIED IDEOGRAPH -0xDDA8 0x65A7 #CJK UNIFIED IDEOGRAPH -0xDDA9 0x6D6E #CJK UNIFIED IDEOGRAPH -0xDDAA 0x6EA5 #CJK UNIFIED IDEOGRAPH -0xDDAB 0x7236 #CJK UNIFIED IDEOGRAPH -0xDDAC 0x7B26 #CJK UNIFIED IDEOGRAPH -0xDDAD 0x7C3F #CJK UNIFIED IDEOGRAPH -0xDDAE 0x7F36 #CJK UNIFIED IDEOGRAPH -0xDDAF 0x8150 #CJK UNIFIED IDEOGRAPH -0xDDB0 0x8151 #CJK UNIFIED IDEOGRAPH -0xDDB1 0x819A #CJK UNIFIED IDEOGRAPH -0xDDB2 0x8240 #CJK UNIFIED IDEOGRAPH -0xDDB3 0x8299 #CJK UNIFIED IDEOGRAPH -0xDDB4 0x83A9 #CJK UNIFIED IDEOGRAPH -0xDDB5 0x8A03 #CJK UNIFIED IDEOGRAPH -0xDDB6 0x8CA0 #CJK UNIFIED IDEOGRAPH -0xDDB7 0x8CE6 #CJK UNIFIED IDEOGRAPH -0xDDB8 0x8CFB #CJK UNIFIED IDEOGRAPH -0xDDB9 0x8D74 #CJK UNIFIED IDEOGRAPH -0xDDBA 0x8DBA #CJK UNIFIED IDEOGRAPH -0xDDBB 0x90E8 #CJK UNIFIED IDEOGRAPH -0xDDBC 0x91DC #CJK UNIFIED IDEOGRAPH -0xDDBD 0x961C #CJK UNIFIED IDEOGRAPH -0xDDBE 0x9644 #CJK UNIFIED IDEOGRAPH -0xDDBF 0x99D9 #CJK UNIFIED IDEOGRAPH -0xDDC0 0x9CE7 #CJK UNIFIED IDEOGRAPH -0xDDC1 0x5317 #CJK UNIFIED IDEOGRAPH -0xDDC2 0x5206 #CJK UNIFIED IDEOGRAPH -0xDDC3 0x5429 #CJK UNIFIED IDEOGRAPH -0xDDC4 0x5674 #CJK UNIFIED IDEOGRAPH -0xDDC5 0x58B3 #CJK UNIFIED IDEOGRAPH -0xDDC6 0x5954 #CJK UNIFIED IDEOGRAPH -0xDDC7 0x596E #CJK UNIFIED IDEOGRAPH -0xDDC8 0x5FFF #CJK UNIFIED IDEOGRAPH -0xDDC9 0x61A4 #CJK UNIFIED IDEOGRAPH -0xDDCA 0x626E #CJK UNIFIED IDEOGRAPH -0xDDCB 0x6610 #CJK UNIFIED IDEOGRAPH -0xDDCC 0x6C7E #CJK UNIFIED IDEOGRAPH -0xDDCD 0x711A #CJK UNIFIED IDEOGRAPH -0xDDCE 0x76C6 #CJK UNIFIED IDEOGRAPH -0xDDCF 0x7C89 #CJK UNIFIED IDEOGRAPH -0xDDD0 0x7CDE #CJK UNIFIED IDEOGRAPH -0xDDD1 0x7D1B #CJK UNIFIED IDEOGRAPH -0xDDD2 0x82AC #CJK UNIFIED IDEOGRAPH -0xDDD3 0x8CC1 #CJK UNIFIED IDEOGRAPH -0xDDD4 0x96F0 #CJK UNIFIED IDEOGRAPH -0xDDD5 0xF967 #CJK COMPATIBILITY IDEOGRAPH -0xDDD6 0x4F5B #CJK UNIFIED IDEOGRAPH -0xDDD7 0x5F17 #CJK UNIFIED IDEOGRAPH -0xDDD8 0x5F7F #CJK UNIFIED IDEOGRAPH -0xDDD9 0x62C2 #CJK UNIFIED IDEOGRAPH -0xDDDA 0x5D29 #CJK UNIFIED IDEOGRAPH -0xDDDB 0x670B #CJK UNIFIED IDEOGRAPH -0xDDDC 0x68DA #CJK UNIFIED IDEOGRAPH -0xDDDD 0x787C #CJK UNIFIED IDEOGRAPH -0xDDDE 0x7E43 #CJK UNIFIED IDEOGRAPH -0xDDDF 0x9D6C #CJK UNIFIED IDEOGRAPH -0xDDE0 0x4E15 #CJK UNIFIED IDEOGRAPH -0xDDE1 0x5099 #CJK UNIFIED IDEOGRAPH -0xDDE2 0x5315 #CJK UNIFIED IDEOGRAPH -0xDDE3 0x532A #CJK UNIFIED IDEOGRAPH -0xDDE4 0x5351 #CJK UNIFIED IDEOGRAPH -0xDDE5 0x5983 #CJK UNIFIED IDEOGRAPH -0xDDE6 0x5A62 #CJK UNIFIED IDEOGRAPH -0xDDE7 0x5E87 #CJK UNIFIED IDEOGRAPH -0xDDE8 0x60B2 #CJK UNIFIED IDEOGRAPH -0xDDE9 0x618A #CJK UNIFIED IDEOGRAPH -0xDDEA 0x6249 #CJK UNIFIED IDEOGRAPH -0xDDEB 0x6279 #CJK UNIFIED IDEOGRAPH -0xDDEC 0x6590 #CJK UNIFIED IDEOGRAPH -0xDDED 0x6787 #CJK UNIFIED IDEOGRAPH -0xDDEE 0x69A7 #CJK UNIFIED IDEOGRAPH -0xDDEF 0x6BD4 #CJK UNIFIED IDEOGRAPH -0xDDF0 0x6BD6 #CJK UNIFIED IDEOGRAPH -0xDDF1 0x6BD7 #CJK UNIFIED IDEOGRAPH -0xDDF2 0x6BD8 #CJK UNIFIED IDEOGRAPH -0xDDF3 0x6CB8 #CJK UNIFIED IDEOGRAPH -0xDDF4 0xF968 #CJK COMPATIBILITY IDEOGRAPH -0xDDF5 0x7435 #CJK UNIFIED IDEOGRAPH -0xDDF6 0x75FA #CJK UNIFIED IDEOGRAPH -0xDDF7 0x7812 #CJK UNIFIED IDEOGRAPH -0xDDF8 0x7891 #CJK UNIFIED IDEOGRAPH -0xDDF9 0x79D5 #CJK UNIFIED IDEOGRAPH -0xDDFA 0x79D8 #CJK UNIFIED IDEOGRAPH -0xDDFB 0x7C83 #CJK UNIFIED IDEOGRAPH -0xDDFC 0x7DCB #CJK UNIFIED IDEOGRAPH -0xDDFD 0x7FE1 #CJK UNIFIED IDEOGRAPH -0xDDFE 0x80A5 #CJK UNIFIED IDEOGRAPH -0xDEA1 0x813E #CJK UNIFIED IDEOGRAPH -0xDEA2 0x81C2 #CJK UNIFIED IDEOGRAPH -0xDEA3 0x83F2 #CJK UNIFIED IDEOGRAPH -0xDEA4 0x871A #CJK UNIFIED IDEOGRAPH -0xDEA5 0x88E8 #CJK UNIFIED IDEOGRAPH -0xDEA6 0x8AB9 #CJK UNIFIED IDEOGRAPH -0xDEA7 0x8B6C #CJK UNIFIED IDEOGRAPH -0xDEA8 0x8CBB #CJK UNIFIED IDEOGRAPH -0xDEA9 0x9119 #CJK UNIFIED IDEOGRAPH -0xDEAA 0x975E #CJK UNIFIED IDEOGRAPH -0xDEAB 0x98DB #CJK UNIFIED IDEOGRAPH -0xDEAC 0x9F3B #CJK UNIFIED IDEOGRAPH -0xDEAD 0x56AC #CJK UNIFIED IDEOGRAPH -0xDEAE 0x5B2A #CJK UNIFIED IDEOGRAPH -0xDEAF 0x5F6C #CJK UNIFIED IDEOGRAPH -0xDEB0 0x658C #CJK UNIFIED IDEOGRAPH -0xDEB1 0x6AB3 #CJK UNIFIED IDEOGRAPH -0xDEB2 0x6BAF #CJK UNIFIED IDEOGRAPH -0xDEB3 0x6D5C #CJK UNIFIED IDEOGRAPH -0xDEB4 0x6FF1 #CJK UNIFIED IDEOGRAPH -0xDEB5 0x7015 #CJK UNIFIED IDEOGRAPH -0xDEB6 0x725D #CJK UNIFIED IDEOGRAPH -0xDEB7 0x73AD #CJK UNIFIED IDEOGRAPH -0xDEB8 0x8CA7 #CJK UNIFIED IDEOGRAPH -0xDEB9 0x8CD3 #CJK UNIFIED IDEOGRAPH -0xDEBA 0x983B #CJK UNIFIED IDEOGRAPH -0xDEBB 0x6191 #CJK UNIFIED IDEOGRAPH -0xDEBC 0x6C37 #CJK UNIFIED IDEOGRAPH -0xDEBD 0x8058 #CJK UNIFIED IDEOGRAPH -0xDEBE 0x9A01 #CJK UNIFIED IDEOGRAPH -0xDEBF 0x4E4D #CJK UNIFIED IDEOGRAPH -0xDEC0 0x4E8B #CJK UNIFIED IDEOGRAPH -0xDEC1 0x4E9B #CJK UNIFIED IDEOGRAPH -0xDEC2 0x4ED5 #CJK UNIFIED IDEOGRAPH -0xDEC3 0x4F3A #CJK UNIFIED IDEOGRAPH -0xDEC4 0x4F3C #CJK UNIFIED IDEOGRAPH -0xDEC5 0x4F7F #CJK UNIFIED IDEOGRAPH -0xDEC6 0x4FDF #CJK UNIFIED IDEOGRAPH -0xDEC7 0x50FF #CJK UNIFIED IDEOGRAPH -0xDEC8 0x53F2 #CJK UNIFIED IDEOGRAPH -0xDEC9 0x53F8 #CJK UNIFIED IDEOGRAPH -0xDECA 0x5506 #CJK UNIFIED IDEOGRAPH -0xDECB 0x55E3 #CJK UNIFIED IDEOGRAPH -0xDECC 0x56DB #CJK UNIFIED IDEOGRAPH -0xDECD 0x58EB #CJK UNIFIED IDEOGRAPH -0xDECE 0x5962 #CJK UNIFIED IDEOGRAPH -0xDECF 0x5A11 #CJK UNIFIED IDEOGRAPH -0xDED0 0x5BEB #CJK UNIFIED IDEOGRAPH -0xDED1 0x5BFA #CJK UNIFIED IDEOGRAPH -0xDED2 0x5C04 #CJK UNIFIED IDEOGRAPH -0xDED3 0x5DF3 #CJK UNIFIED IDEOGRAPH -0xDED4 0x5E2B #CJK UNIFIED IDEOGRAPH -0xDED5 0x5F99 #CJK UNIFIED IDEOGRAPH -0xDED6 0x601D #CJK UNIFIED IDEOGRAPH -0xDED7 0x6368 #CJK UNIFIED IDEOGRAPH -0xDED8 0x659C #CJK UNIFIED IDEOGRAPH -0xDED9 0x65AF #CJK UNIFIED IDEOGRAPH -0xDEDA 0x67F6 #CJK UNIFIED IDEOGRAPH -0xDEDB 0x67FB #CJK UNIFIED IDEOGRAPH -0xDEDC 0x68AD #CJK UNIFIED IDEOGRAPH -0xDEDD 0x6B7B #CJK UNIFIED IDEOGRAPH -0xDEDE 0x6C99 #CJK UNIFIED IDEOGRAPH -0xDEDF 0x6CD7 #CJK UNIFIED IDEOGRAPH -0xDEE0 0x6E23 #CJK UNIFIED IDEOGRAPH -0xDEE1 0x7009 #CJK UNIFIED IDEOGRAPH -0xDEE2 0x7345 #CJK UNIFIED IDEOGRAPH -0xDEE3 0x7802 #CJK UNIFIED IDEOGRAPH -0xDEE4 0x793E #CJK UNIFIED IDEOGRAPH -0xDEE5 0x7940 #CJK UNIFIED IDEOGRAPH -0xDEE6 0x7960 #CJK UNIFIED IDEOGRAPH -0xDEE7 0x79C1 #CJK UNIFIED IDEOGRAPH -0xDEE8 0x7BE9 #CJK UNIFIED IDEOGRAPH -0xDEE9 0x7D17 #CJK UNIFIED IDEOGRAPH -0xDEEA 0x7D72 #CJK UNIFIED IDEOGRAPH -0xDEEB 0x8086 #CJK UNIFIED IDEOGRAPH -0xDEEC 0x820D #CJK UNIFIED IDEOGRAPH -0xDEED 0x838E #CJK UNIFIED IDEOGRAPH -0xDEEE 0x84D1 #CJK UNIFIED IDEOGRAPH -0xDEEF 0x86C7 #CJK UNIFIED IDEOGRAPH -0xDEF0 0x88DF #CJK UNIFIED IDEOGRAPH -0xDEF1 0x8A50 #CJK UNIFIED IDEOGRAPH -0xDEF2 0x8A5E #CJK UNIFIED IDEOGRAPH -0xDEF3 0x8B1D #CJK UNIFIED IDEOGRAPH -0xDEF4 0x8CDC #CJK UNIFIED IDEOGRAPH -0xDEF5 0x8D66 #CJK UNIFIED IDEOGRAPH -0xDEF6 0x8FAD #CJK UNIFIED IDEOGRAPH -0xDEF7 0x90AA #CJK UNIFIED IDEOGRAPH -0xDEF8 0x98FC #CJK UNIFIED IDEOGRAPH -0xDEF9 0x99DF #CJK UNIFIED IDEOGRAPH -0xDEFA 0x9E9D #CJK UNIFIED IDEOGRAPH -0xDEFB 0x524A #CJK UNIFIED IDEOGRAPH -0xDEFC 0xF969 #CJK COMPATIBILITY IDEOGRAPH -0xDEFD 0x6714 #CJK UNIFIED IDEOGRAPH -0xDEFE 0xF96A #CJK COMPATIBILITY IDEOGRAPH -0xDFA1 0x5098 #CJK UNIFIED IDEOGRAPH -0xDFA2 0x522A #CJK UNIFIED IDEOGRAPH -0xDFA3 0x5C71 #CJK UNIFIED IDEOGRAPH -0xDFA4 0x6563 #CJK UNIFIED IDEOGRAPH -0xDFA5 0x6C55 #CJK UNIFIED IDEOGRAPH -0xDFA6 0x73CA #CJK UNIFIED IDEOGRAPH -0xDFA7 0x7523 #CJK UNIFIED IDEOGRAPH -0xDFA8 0x759D #CJK UNIFIED IDEOGRAPH -0xDFA9 0x7B97 #CJK UNIFIED IDEOGRAPH -0xDFAA 0x849C #CJK UNIFIED IDEOGRAPH -0xDFAB 0x9178 #CJK UNIFIED IDEOGRAPH -0xDFAC 0x9730 #CJK UNIFIED IDEOGRAPH -0xDFAD 0x4E77 #CJK UNIFIED IDEOGRAPH -0xDFAE 0x6492 #CJK UNIFIED IDEOGRAPH -0xDFAF 0x6BBA #CJK UNIFIED IDEOGRAPH -0xDFB0 0x715E #CJK UNIFIED IDEOGRAPH -0xDFB1 0x85A9 #CJK UNIFIED IDEOGRAPH -0xDFB2 0x4E09 #CJK UNIFIED IDEOGRAPH -0xDFB3 0xF96B #CJK COMPATIBILITY IDEOGRAPH -0xDFB4 0x6749 #CJK UNIFIED IDEOGRAPH -0xDFB5 0x68EE #CJK UNIFIED IDEOGRAPH -0xDFB6 0x6E17 #CJK UNIFIED IDEOGRAPH -0xDFB7 0x829F #CJK UNIFIED IDEOGRAPH -0xDFB8 0x8518 #CJK UNIFIED IDEOGRAPH -0xDFB9 0x886B #CJK UNIFIED IDEOGRAPH -0xDFBA 0x63F7 #CJK UNIFIED IDEOGRAPH -0xDFBB 0x6F81 #CJK UNIFIED IDEOGRAPH -0xDFBC 0x9212 #CJK UNIFIED IDEOGRAPH -0xDFBD 0x98AF #CJK UNIFIED IDEOGRAPH -0xDFBE 0x4E0A #CJK UNIFIED IDEOGRAPH -0xDFBF 0x50B7 #CJK UNIFIED IDEOGRAPH -0xDFC0 0x50CF #CJK UNIFIED IDEOGRAPH -0xDFC1 0x511F #CJK UNIFIED IDEOGRAPH -0xDFC2 0x5546 #CJK UNIFIED IDEOGRAPH -0xDFC3 0x55AA #CJK UNIFIED IDEOGRAPH -0xDFC4 0x5617 #CJK UNIFIED IDEOGRAPH -0xDFC5 0x5B40 #CJK UNIFIED IDEOGRAPH -0xDFC6 0x5C19 #CJK UNIFIED IDEOGRAPH -0xDFC7 0x5CE0 #CJK UNIFIED IDEOGRAPH -0xDFC8 0x5E38 #CJK UNIFIED IDEOGRAPH -0xDFC9 0x5E8A #CJK UNIFIED IDEOGRAPH -0xDFCA 0x5EA0 #CJK UNIFIED IDEOGRAPH -0xDFCB 0x5EC2 #CJK UNIFIED IDEOGRAPH -0xDFCC 0x60F3 #CJK UNIFIED IDEOGRAPH -0xDFCD 0x6851 #CJK UNIFIED IDEOGRAPH -0xDFCE 0x6A61 #CJK UNIFIED IDEOGRAPH -0xDFCF 0x6E58 #CJK UNIFIED IDEOGRAPH -0xDFD0 0x723D #CJK UNIFIED IDEOGRAPH -0xDFD1 0x7240 #CJK UNIFIED IDEOGRAPH -0xDFD2 0x72C0 #CJK UNIFIED IDEOGRAPH -0xDFD3 0x76F8 #CJK UNIFIED IDEOGRAPH -0xDFD4 0x7965 #CJK UNIFIED IDEOGRAPH -0xDFD5 0x7BB1 #CJK UNIFIED IDEOGRAPH -0xDFD6 0x7FD4 #CJK UNIFIED IDEOGRAPH -0xDFD7 0x88F3 #CJK UNIFIED IDEOGRAPH -0xDFD8 0x89F4 #CJK UNIFIED IDEOGRAPH -0xDFD9 0x8A73 #CJK UNIFIED IDEOGRAPH -0xDFDA 0x8C61 #CJK UNIFIED IDEOGRAPH -0xDFDB 0x8CDE #CJK UNIFIED IDEOGRAPH -0xDFDC 0x971C #CJK UNIFIED IDEOGRAPH -0xDFDD 0x585E #CJK UNIFIED IDEOGRAPH -0xDFDE 0x74BD #CJK UNIFIED IDEOGRAPH -0xDFDF 0x8CFD #CJK UNIFIED IDEOGRAPH -0xDFE0 0x55C7 #CJK UNIFIED IDEOGRAPH -0xDFE1 0xF96C #CJK COMPATIBILITY IDEOGRAPH -0xDFE2 0x7A61 #CJK UNIFIED IDEOGRAPH -0xDFE3 0x7D22 #CJK UNIFIED IDEOGRAPH -0xDFE4 0x8272 #CJK UNIFIED IDEOGRAPH -0xDFE5 0x7272 #CJK UNIFIED IDEOGRAPH -0xDFE6 0x751F #CJK UNIFIED IDEOGRAPH -0xDFE7 0x7525 #CJK UNIFIED IDEOGRAPH -0xDFE8 0xF96D #CJK COMPATIBILITY IDEOGRAPH -0xDFE9 0x7B19 #CJK UNIFIED IDEOGRAPH -0xDFEA 0x5885 #CJK UNIFIED IDEOGRAPH -0xDFEB 0x58FB #CJK UNIFIED IDEOGRAPH -0xDFEC 0x5DBC #CJK UNIFIED IDEOGRAPH -0xDFED 0x5E8F #CJK UNIFIED IDEOGRAPH -0xDFEE 0x5EB6 #CJK UNIFIED IDEOGRAPH -0xDFEF 0x5F90 #CJK UNIFIED IDEOGRAPH -0xDFF0 0x6055 #CJK UNIFIED IDEOGRAPH -0xDFF1 0x6292 #CJK UNIFIED IDEOGRAPH -0xDFF2 0x637F #CJK UNIFIED IDEOGRAPH -0xDFF3 0x654D #CJK UNIFIED IDEOGRAPH -0xDFF4 0x6691 #CJK UNIFIED IDEOGRAPH -0xDFF5 0x66D9 #CJK UNIFIED IDEOGRAPH -0xDFF6 0x66F8 #CJK UNIFIED IDEOGRAPH -0xDFF7 0x6816 #CJK UNIFIED IDEOGRAPH -0xDFF8 0x68F2 #CJK UNIFIED IDEOGRAPH -0xDFF9 0x7280 #CJK UNIFIED IDEOGRAPH -0xDFFA 0x745E #CJK UNIFIED IDEOGRAPH -0xDFFB 0x7B6E #CJK UNIFIED IDEOGRAPH -0xDFFC 0x7D6E #CJK UNIFIED IDEOGRAPH -0xDFFD 0x7DD6 #CJK UNIFIED IDEOGRAPH -0xDFFE 0x7F72 #CJK UNIFIED IDEOGRAPH -0xE0A1 0x80E5 #CJK UNIFIED IDEOGRAPH -0xE0A2 0x8212 #CJK UNIFIED IDEOGRAPH -0xE0A3 0x85AF #CJK UNIFIED IDEOGRAPH -0xE0A4 0x897F #CJK UNIFIED IDEOGRAPH -0xE0A5 0x8A93 #CJK UNIFIED IDEOGRAPH -0xE0A6 0x901D #CJK UNIFIED IDEOGRAPH -0xE0A7 0x92E4 #CJK UNIFIED IDEOGRAPH -0xE0A8 0x9ECD #CJK UNIFIED IDEOGRAPH -0xE0A9 0x9F20 #CJK UNIFIED IDEOGRAPH -0xE0AA 0x5915 #CJK UNIFIED IDEOGRAPH -0xE0AB 0x596D #CJK UNIFIED IDEOGRAPH -0xE0AC 0x5E2D #CJK UNIFIED IDEOGRAPH -0xE0AD 0x60DC #CJK UNIFIED IDEOGRAPH -0xE0AE 0x6614 #CJK UNIFIED IDEOGRAPH -0xE0AF 0x6673 #CJK UNIFIED IDEOGRAPH -0xE0B0 0x6790 #CJK UNIFIED IDEOGRAPH -0xE0B1 0x6C50 #CJK UNIFIED IDEOGRAPH -0xE0B2 0x6DC5 #CJK UNIFIED IDEOGRAPH -0xE0B3 0x6F5F #CJK UNIFIED IDEOGRAPH -0xE0B4 0x77F3 #CJK UNIFIED IDEOGRAPH -0xE0B5 0x78A9 #CJK UNIFIED IDEOGRAPH -0xE0B6 0x84C6 #CJK UNIFIED IDEOGRAPH -0xE0B7 0x91CB #CJK UNIFIED IDEOGRAPH -0xE0B8 0x932B #CJK UNIFIED IDEOGRAPH -0xE0B9 0x4ED9 #CJK UNIFIED IDEOGRAPH -0xE0BA 0x50CA #CJK UNIFIED IDEOGRAPH -0xE0BB 0x5148 #CJK UNIFIED IDEOGRAPH -0xE0BC 0x5584 #CJK UNIFIED IDEOGRAPH -0xE0BD 0x5B0B #CJK UNIFIED IDEOGRAPH -0xE0BE 0x5BA3 #CJK UNIFIED IDEOGRAPH -0xE0BF 0x6247 #CJK UNIFIED IDEOGRAPH -0xE0C0 0x657E #CJK UNIFIED IDEOGRAPH -0xE0C1 0x65CB #CJK UNIFIED IDEOGRAPH -0xE0C2 0x6E32 #CJK UNIFIED IDEOGRAPH -0xE0C3 0x717D #CJK UNIFIED IDEOGRAPH -0xE0C4 0x7401 #CJK UNIFIED IDEOGRAPH -0xE0C5 0x7444 #CJK UNIFIED IDEOGRAPH -0xE0C6 0x7487 #CJK UNIFIED IDEOGRAPH -0xE0C7 0x74BF #CJK UNIFIED IDEOGRAPH -0xE0C8 0x766C #CJK UNIFIED IDEOGRAPH -0xE0C9 0x79AA #CJK UNIFIED IDEOGRAPH -0xE0CA 0x7DDA #CJK UNIFIED IDEOGRAPH -0xE0CB 0x7E55 #CJK UNIFIED IDEOGRAPH -0xE0CC 0x7FA8 #CJK UNIFIED IDEOGRAPH -0xE0CD 0x817A #CJK UNIFIED IDEOGRAPH -0xE0CE 0x81B3 #CJK UNIFIED IDEOGRAPH -0xE0CF 0x8239 #CJK UNIFIED IDEOGRAPH -0xE0D0 0x861A #CJK UNIFIED IDEOGRAPH -0xE0D1 0x87EC #CJK UNIFIED IDEOGRAPH -0xE0D2 0x8A75 #CJK UNIFIED IDEOGRAPH -0xE0D3 0x8DE3 #CJK UNIFIED IDEOGRAPH -0xE0D4 0x9078 #CJK UNIFIED IDEOGRAPH -0xE0D5 0x9291 #CJK UNIFIED IDEOGRAPH -0xE0D6 0x9425 #CJK UNIFIED IDEOGRAPH -0xE0D7 0x994D #CJK UNIFIED IDEOGRAPH -0xE0D8 0x9BAE #CJK UNIFIED IDEOGRAPH -0xE0D9 0x5368 #CJK UNIFIED IDEOGRAPH -0xE0DA 0x5C51 #CJK UNIFIED IDEOGRAPH -0xE0DB 0x6954 #CJK UNIFIED IDEOGRAPH -0xE0DC 0x6CC4 #CJK UNIFIED IDEOGRAPH -0xE0DD 0x6D29 #CJK UNIFIED IDEOGRAPH -0xE0DE 0x6E2B #CJK UNIFIED IDEOGRAPH -0xE0DF 0x820C #CJK UNIFIED IDEOGRAPH -0xE0E0 0x859B #CJK UNIFIED IDEOGRAPH -0xE0E1 0x893B #CJK UNIFIED IDEOGRAPH -0xE0E2 0x8A2D #CJK UNIFIED IDEOGRAPH -0xE0E3 0x8AAA #CJK UNIFIED IDEOGRAPH -0xE0E4 0x96EA #CJK UNIFIED IDEOGRAPH -0xE0E5 0x9F67 #CJK UNIFIED IDEOGRAPH -0xE0E6 0x5261 #CJK UNIFIED IDEOGRAPH -0xE0E7 0x66B9 #CJK UNIFIED IDEOGRAPH -0xE0E8 0x6BB2 #CJK UNIFIED IDEOGRAPH -0xE0E9 0x7E96 #CJK UNIFIED IDEOGRAPH -0xE0EA 0x87FE #CJK UNIFIED IDEOGRAPH -0xE0EB 0x8D0D #CJK UNIFIED IDEOGRAPH -0xE0EC 0x9583 #CJK UNIFIED IDEOGRAPH -0xE0ED 0x965D #CJK UNIFIED IDEOGRAPH -0xE0EE 0x651D #CJK UNIFIED IDEOGRAPH -0xE0EF 0x6D89 #CJK UNIFIED IDEOGRAPH -0xE0F0 0x71EE #CJK UNIFIED IDEOGRAPH -0xE0F1 0xF96E #CJK COMPATIBILITY IDEOGRAPH -0xE0F2 0x57CE #CJK UNIFIED IDEOGRAPH -0xE0F3 0x59D3 #CJK UNIFIED IDEOGRAPH -0xE0F4 0x5BAC #CJK UNIFIED IDEOGRAPH -0xE0F5 0x6027 #CJK UNIFIED IDEOGRAPH -0xE0F6 0x60FA #CJK UNIFIED IDEOGRAPH -0xE0F7 0x6210 #CJK UNIFIED IDEOGRAPH -0xE0F8 0x661F #CJK UNIFIED IDEOGRAPH -0xE0F9 0x665F #CJK UNIFIED IDEOGRAPH -0xE0FA 0x7329 #CJK UNIFIED IDEOGRAPH -0xE0FB 0x73F9 #CJK UNIFIED IDEOGRAPH -0xE0FC 0x76DB #CJK UNIFIED IDEOGRAPH -0xE0FD 0x7701 #CJK UNIFIED IDEOGRAPH -0xE0FE 0x7B6C #CJK UNIFIED IDEOGRAPH -0xE1A1 0x8056 #CJK UNIFIED IDEOGRAPH -0xE1A2 0x8072 #CJK UNIFIED IDEOGRAPH -0xE1A3 0x8165 #CJK UNIFIED IDEOGRAPH -0xE1A4 0x8AA0 #CJK UNIFIED IDEOGRAPH -0xE1A5 0x9192 #CJK UNIFIED IDEOGRAPH -0xE1A6 0x4E16 #CJK UNIFIED IDEOGRAPH -0xE1A7 0x52E2 #CJK UNIFIED IDEOGRAPH -0xE1A8 0x6B72 #CJK UNIFIED IDEOGRAPH -0xE1A9 0x6D17 #CJK UNIFIED IDEOGRAPH -0xE1AA 0x7A05 #CJK UNIFIED IDEOGRAPH -0xE1AB 0x7B39 #CJK UNIFIED IDEOGRAPH -0xE1AC 0x7D30 #CJK UNIFIED IDEOGRAPH -0xE1AD 0xF96F #CJK COMPATIBILITY IDEOGRAPH -0xE1AE 0x8CB0 #CJK UNIFIED IDEOGRAPH -0xE1AF 0x53EC #CJK UNIFIED IDEOGRAPH -0xE1B0 0x562F #CJK UNIFIED IDEOGRAPH -0xE1B1 0x5851 #CJK UNIFIED IDEOGRAPH -0xE1B2 0x5BB5 #CJK UNIFIED IDEOGRAPH -0xE1B3 0x5C0F #CJK UNIFIED IDEOGRAPH -0xE1B4 0x5C11 #CJK UNIFIED IDEOGRAPH -0xE1B5 0x5DE2 #CJK UNIFIED IDEOGRAPH -0xE1B6 0x6240 #CJK UNIFIED IDEOGRAPH -0xE1B7 0x6383 #CJK UNIFIED IDEOGRAPH -0xE1B8 0x6414 #CJK UNIFIED IDEOGRAPH -0xE1B9 0x662D #CJK UNIFIED IDEOGRAPH -0xE1BA 0x68B3 #CJK UNIFIED IDEOGRAPH -0xE1BB 0x6CBC #CJK UNIFIED IDEOGRAPH -0xE1BC 0x6D88 #CJK UNIFIED IDEOGRAPH -0xE1BD 0x6EAF #CJK UNIFIED IDEOGRAPH -0xE1BE 0x701F #CJK UNIFIED IDEOGRAPH -0xE1BF 0x70A4 #CJK UNIFIED IDEOGRAPH -0xE1C0 0x71D2 #CJK UNIFIED IDEOGRAPH -0xE1C1 0x7526 #CJK UNIFIED IDEOGRAPH -0xE1C2 0x758F #CJK UNIFIED IDEOGRAPH -0xE1C3 0x758E #CJK UNIFIED IDEOGRAPH -0xE1C4 0x7619 #CJK UNIFIED IDEOGRAPH -0xE1C5 0x7B11 #CJK UNIFIED IDEOGRAPH -0xE1C6 0x7BE0 #CJK UNIFIED IDEOGRAPH -0xE1C7 0x7C2B #CJK UNIFIED IDEOGRAPH -0xE1C8 0x7D20 #CJK UNIFIED IDEOGRAPH -0xE1C9 0x7D39 #CJK UNIFIED IDEOGRAPH -0xE1CA 0x852C #CJK UNIFIED IDEOGRAPH -0xE1CB 0x856D #CJK UNIFIED IDEOGRAPH -0xE1CC 0x8607 #CJK UNIFIED IDEOGRAPH -0xE1CD 0x8A34 #CJK UNIFIED IDEOGRAPH -0xE1CE 0x900D #CJK UNIFIED IDEOGRAPH -0xE1CF 0x9061 #CJK UNIFIED IDEOGRAPH -0xE1D0 0x90B5 #CJK UNIFIED IDEOGRAPH -0xE1D1 0x92B7 #CJK UNIFIED IDEOGRAPH -0xE1D2 0x97F6 #CJK UNIFIED IDEOGRAPH -0xE1D3 0x9A37 #CJK UNIFIED IDEOGRAPH -0xE1D4 0x4FD7 #CJK UNIFIED IDEOGRAPH -0xE1D5 0x5C6C #CJK UNIFIED IDEOGRAPH -0xE1D6 0x675F #CJK UNIFIED IDEOGRAPH -0xE1D7 0x6D91 #CJK UNIFIED IDEOGRAPH -0xE1D8 0x7C9F #CJK UNIFIED IDEOGRAPH -0xE1D9 0x7E8C #CJK UNIFIED IDEOGRAPH -0xE1DA 0x8B16 #CJK UNIFIED IDEOGRAPH -0xE1DB 0x8D16 #CJK UNIFIED IDEOGRAPH -0xE1DC 0x901F #CJK UNIFIED IDEOGRAPH -0xE1DD 0x5B6B #CJK UNIFIED IDEOGRAPH -0xE1DE 0x5DFD #CJK UNIFIED IDEOGRAPH -0xE1DF 0x640D #CJK UNIFIED IDEOGRAPH -0xE1E0 0x84C0 #CJK UNIFIED IDEOGRAPH -0xE1E1 0x905C #CJK UNIFIED IDEOGRAPH -0xE1E2 0x98E1 #CJK UNIFIED IDEOGRAPH -0xE1E3 0x7387 #CJK UNIFIED IDEOGRAPH -0xE1E4 0x5B8B #CJK UNIFIED IDEOGRAPH -0xE1E5 0x609A #CJK UNIFIED IDEOGRAPH -0xE1E6 0x677E #CJK UNIFIED IDEOGRAPH -0xE1E7 0x6DDE #CJK UNIFIED IDEOGRAPH -0xE1E8 0x8A1F #CJK UNIFIED IDEOGRAPH -0xE1E9 0x8AA6 #CJK UNIFIED IDEOGRAPH -0xE1EA 0x9001 #CJK UNIFIED IDEOGRAPH -0xE1EB 0x980C #CJK UNIFIED IDEOGRAPH -0xE1EC 0x5237 #CJK UNIFIED IDEOGRAPH -0xE1ED 0xF970 #CJK COMPATIBILITY IDEOGRAPH -0xE1EE 0x7051 #CJK UNIFIED IDEOGRAPH -0xE1EF 0x788E #CJK UNIFIED IDEOGRAPH -0xE1F0 0x9396 #CJK UNIFIED IDEOGRAPH -0xE1F1 0x8870 #CJK UNIFIED IDEOGRAPH -0xE1F2 0x91D7 #CJK UNIFIED IDEOGRAPH -0xE1F3 0x4FEE #CJK UNIFIED IDEOGRAPH -0xE1F4 0x53D7 #CJK UNIFIED IDEOGRAPH -0xE1F5 0x55FD #CJK UNIFIED IDEOGRAPH -0xE1F6 0x56DA #CJK UNIFIED IDEOGRAPH -0xE1F7 0x5782 #CJK UNIFIED IDEOGRAPH -0xE1F8 0x58FD #CJK UNIFIED IDEOGRAPH -0xE1F9 0x5AC2 #CJK UNIFIED IDEOGRAPH -0xE1FA 0x5B88 #CJK UNIFIED IDEOGRAPH -0xE1FB 0x5CAB #CJK UNIFIED IDEOGRAPH -0xE1FC 0x5CC0 #CJK UNIFIED IDEOGRAPH -0xE1FD 0x5E25 #CJK UNIFIED IDEOGRAPH -0xE1FE 0x6101 #CJK UNIFIED IDEOGRAPH -0xE2A1 0x620D #CJK UNIFIED IDEOGRAPH -0xE2A2 0x624B #CJK UNIFIED IDEOGRAPH -0xE2A3 0x6388 #CJK UNIFIED IDEOGRAPH -0xE2A4 0x641C #CJK UNIFIED IDEOGRAPH -0xE2A5 0x6536 #CJK UNIFIED IDEOGRAPH -0xE2A6 0x6578 #CJK UNIFIED IDEOGRAPH -0xE2A7 0x6A39 #CJK UNIFIED IDEOGRAPH -0xE2A8 0x6B8A #CJK UNIFIED IDEOGRAPH -0xE2A9 0x6C34 #CJK UNIFIED IDEOGRAPH -0xE2AA 0x6D19 #CJK UNIFIED IDEOGRAPH -0xE2AB 0x6F31 #CJK UNIFIED IDEOGRAPH -0xE2AC 0x71E7 #CJK UNIFIED IDEOGRAPH -0xE2AD 0x72E9 #CJK UNIFIED IDEOGRAPH -0xE2AE 0x7378 #CJK UNIFIED IDEOGRAPH -0xE2AF 0x7407 #CJK UNIFIED IDEOGRAPH -0xE2B0 0x74B2 #CJK UNIFIED IDEOGRAPH -0xE2B1 0x7626 #CJK UNIFIED IDEOGRAPH -0xE2B2 0x7761 #CJK UNIFIED IDEOGRAPH -0xE2B3 0x79C0 #CJK UNIFIED IDEOGRAPH -0xE2B4 0x7A57 #CJK UNIFIED IDEOGRAPH -0xE2B5 0x7AEA #CJK UNIFIED IDEOGRAPH -0xE2B6 0x7CB9 #CJK UNIFIED IDEOGRAPH -0xE2B7 0x7D8F #CJK UNIFIED IDEOGRAPH -0xE2B8 0x7DAC #CJK UNIFIED IDEOGRAPH -0xE2B9 0x7E61 #CJK UNIFIED IDEOGRAPH -0xE2BA 0x7F9E #CJK UNIFIED IDEOGRAPH -0xE2BB 0x8129 #CJK UNIFIED IDEOGRAPH -0xE2BC 0x8331 #CJK UNIFIED IDEOGRAPH -0xE2BD 0x8490 #CJK UNIFIED IDEOGRAPH -0xE2BE 0x84DA #CJK UNIFIED IDEOGRAPH -0xE2BF 0x85EA #CJK UNIFIED IDEOGRAPH -0xE2C0 0x8896 #CJK UNIFIED IDEOGRAPH -0xE2C1 0x8AB0 #CJK UNIFIED IDEOGRAPH -0xE2C2 0x8B90 #CJK UNIFIED IDEOGRAPH -0xE2C3 0x8F38 #CJK UNIFIED IDEOGRAPH -0xE2C4 0x9042 #CJK UNIFIED IDEOGRAPH -0xE2C5 0x9083 #CJK UNIFIED IDEOGRAPH -0xE2C6 0x916C #CJK UNIFIED IDEOGRAPH -0xE2C7 0x9296 #CJK UNIFIED IDEOGRAPH -0xE2C8 0x92B9 #CJK UNIFIED IDEOGRAPH -0xE2C9 0x968B #CJK UNIFIED IDEOGRAPH -0xE2CA 0x96A7 #CJK UNIFIED IDEOGRAPH -0xE2CB 0x96A8 #CJK UNIFIED IDEOGRAPH -0xE2CC 0x96D6 #CJK UNIFIED IDEOGRAPH -0xE2CD 0x9700 #CJK UNIFIED IDEOGRAPH -0xE2CE 0x9808 #CJK UNIFIED IDEOGRAPH -0xE2CF 0x9996 #CJK UNIFIED IDEOGRAPH -0xE2D0 0x9AD3 #CJK UNIFIED IDEOGRAPH -0xE2D1 0x9B1A #CJK UNIFIED IDEOGRAPH -0xE2D2 0x53D4 #CJK UNIFIED IDEOGRAPH -0xE2D3 0x587E #CJK UNIFIED IDEOGRAPH -0xE2D4 0x5919 #CJK UNIFIED IDEOGRAPH -0xE2D5 0x5B70 #CJK UNIFIED IDEOGRAPH -0xE2D6 0x5BBF #CJK UNIFIED IDEOGRAPH -0xE2D7 0x6DD1 #CJK UNIFIED IDEOGRAPH -0xE2D8 0x6F5A #CJK UNIFIED IDEOGRAPH -0xE2D9 0x719F #CJK UNIFIED IDEOGRAPH -0xE2DA 0x7421 #CJK UNIFIED IDEOGRAPH -0xE2DB 0x74B9 #CJK UNIFIED IDEOGRAPH -0xE2DC 0x8085 #CJK UNIFIED IDEOGRAPH -0xE2DD 0x83FD #CJK UNIFIED IDEOGRAPH -0xE2DE 0x5DE1 #CJK UNIFIED IDEOGRAPH -0xE2DF 0x5F87 #CJK UNIFIED IDEOGRAPH -0xE2E0 0x5FAA #CJK UNIFIED IDEOGRAPH -0xE2E1 0x6042 #CJK UNIFIED IDEOGRAPH -0xE2E2 0x65EC #CJK UNIFIED IDEOGRAPH -0xE2E3 0x6812 #CJK UNIFIED IDEOGRAPH -0xE2E4 0x696F #CJK UNIFIED IDEOGRAPH -0xE2E5 0x6A53 #CJK UNIFIED IDEOGRAPH -0xE2E6 0x6B89 #CJK UNIFIED IDEOGRAPH -0xE2E7 0x6D35 #CJK UNIFIED IDEOGRAPH -0xE2E8 0x6DF3 #CJK UNIFIED IDEOGRAPH -0xE2E9 0x73E3 #CJK UNIFIED IDEOGRAPH -0xE2EA 0x76FE #CJK UNIFIED IDEOGRAPH -0xE2EB 0x77AC #CJK UNIFIED IDEOGRAPH -0xE2EC 0x7B4D #CJK UNIFIED IDEOGRAPH -0xE2ED 0x7D14 #CJK UNIFIED IDEOGRAPH -0xE2EE 0x8123 #CJK UNIFIED IDEOGRAPH -0xE2EF 0x821C #CJK UNIFIED IDEOGRAPH -0xE2F0 0x8340 #CJK UNIFIED IDEOGRAPH -0xE2F1 0x84F4 #CJK UNIFIED IDEOGRAPH -0xE2F2 0x8563 #CJK UNIFIED IDEOGRAPH -0xE2F3 0x8A62 #CJK UNIFIED IDEOGRAPH -0xE2F4 0x8AC4 #CJK UNIFIED IDEOGRAPH -0xE2F5 0x9187 #CJK UNIFIED IDEOGRAPH -0xE2F6 0x931E #CJK UNIFIED IDEOGRAPH -0xE2F7 0x9806 #CJK UNIFIED IDEOGRAPH -0xE2F8 0x99B4 #CJK UNIFIED IDEOGRAPH -0xE2F9 0x620C #CJK UNIFIED IDEOGRAPH -0xE2FA 0x8853 #CJK UNIFIED IDEOGRAPH -0xE2FB 0x8FF0 #CJK UNIFIED IDEOGRAPH -0xE2FC 0x9265 #CJK UNIFIED IDEOGRAPH -0xE2FD 0x5D07 #CJK UNIFIED IDEOGRAPH -0xE2FE 0x5D27 #CJK UNIFIED IDEOGRAPH -0xE3A1 0x5D69 #CJK UNIFIED IDEOGRAPH -0xE3A2 0x745F #CJK UNIFIED IDEOGRAPH -0xE3A3 0x819D #CJK UNIFIED IDEOGRAPH -0xE3A4 0x8768 #CJK UNIFIED IDEOGRAPH -0xE3A5 0x6FD5 #CJK UNIFIED IDEOGRAPH -0xE3A6 0x62FE #CJK UNIFIED IDEOGRAPH -0xE3A7 0x7FD2 #CJK UNIFIED IDEOGRAPH -0xE3A8 0x8936 #CJK UNIFIED IDEOGRAPH -0xE3A9 0x8972 #CJK UNIFIED IDEOGRAPH -0xE3AA 0x4E1E #CJK UNIFIED IDEOGRAPH -0xE3AB 0x4E58 #CJK UNIFIED IDEOGRAPH -0xE3AC 0x50E7 #CJK UNIFIED IDEOGRAPH -0xE3AD 0x52DD #CJK UNIFIED IDEOGRAPH -0xE3AE 0x5347 #CJK UNIFIED IDEOGRAPH -0xE3AF 0x627F #CJK UNIFIED IDEOGRAPH -0xE3B0 0x6607 #CJK UNIFIED IDEOGRAPH -0xE3B1 0x7E69 #CJK UNIFIED IDEOGRAPH -0xE3B2 0x8805 #CJK UNIFIED IDEOGRAPH -0xE3B3 0x965E #CJK UNIFIED IDEOGRAPH -0xE3B4 0x4F8D #CJK UNIFIED IDEOGRAPH -0xE3B5 0x5319 #CJK UNIFIED IDEOGRAPH -0xE3B6 0x5636 #CJK UNIFIED IDEOGRAPH -0xE3B7 0x59CB #CJK UNIFIED IDEOGRAPH -0xE3B8 0x5AA4 #CJK UNIFIED IDEOGRAPH -0xE3B9 0x5C38 #CJK UNIFIED IDEOGRAPH -0xE3BA 0x5C4E #CJK UNIFIED IDEOGRAPH -0xE3BB 0x5C4D #CJK UNIFIED IDEOGRAPH -0xE3BC 0x5E02 #CJK UNIFIED IDEOGRAPH -0xE3BD 0x5F11 #CJK UNIFIED IDEOGRAPH -0xE3BE 0x6043 #CJK UNIFIED IDEOGRAPH -0xE3BF 0x65BD #CJK UNIFIED IDEOGRAPH -0xE3C0 0x662F #CJK UNIFIED IDEOGRAPH -0xE3C1 0x6642 #CJK UNIFIED IDEOGRAPH -0xE3C2 0x67BE #CJK UNIFIED IDEOGRAPH -0xE3C3 0x67F4 #CJK UNIFIED IDEOGRAPH -0xE3C4 0x731C #CJK UNIFIED IDEOGRAPH -0xE3C5 0x77E2 #CJK UNIFIED IDEOGRAPH -0xE3C6 0x793A #CJK UNIFIED IDEOGRAPH -0xE3C7 0x7FC5 #CJK UNIFIED IDEOGRAPH -0xE3C8 0x8494 #CJK UNIFIED IDEOGRAPH -0xE3C9 0x84CD #CJK UNIFIED IDEOGRAPH -0xE3CA 0x8996 #CJK UNIFIED IDEOGRAPH -0xE3CB 0x8A66 #CJK UNIFIED IDEOGRAPH -0xE3CC 0x8A69 #CJK UNIFIED IDEOGRAPH -0xE3CD 0x8AE1 #CJK UNIFIED IDEOGRAPH -0xE3CE 0x8C55 #CJK UNIFIED IDEOGRAPH -0xE3CF 0x8C7A #CJK UNIFIED IDEOGRAPH -0xE3D0 0x57F4 #CJK UNIFIED IDEOGRAPH -0xE3D1 0x5BD4 #CJK UNIFIED IDEOGRAPH -0xE3D2 0x5F0F #CJK UNIFIED IDEOGRAPH -0xE3D3 0x606F #CJK UNIFIED IDEOGRAPH -0xE3D4 0x62ED #CJK UNIFIED IDEOGRAPH -0xE3D5 0x690D #CJK UNIFIED IDEOGRAPH -0xE3D6 0x6B96 #CJK UNIFIED IDEOGRAPH -0xE3D7 0x6E5C #CJK UNIFIED IDEOGRAPH -0xE3D8 0x7184 #CJK UNIFIED IDEOGRAPH -0xE3D9 0x7BD2 #CJK UNIFIED IDEOGRAPH -0xE3DA 0x8755 #CJK UNIFIED IDEOGRAPH -0xE3DB 0x8B58 #CJK UNIFIED IDEOGRAPH -0xE3DC 0x8EFE #CJK UNIFIED IDEOGRAPH -0xE3DD 0x98DF #CJK UNIFIED IDEOGRAPH -0xE3DE 0x98FE #CJK UNIFIED IDEOGRAPH -0xE3DF 0x4F38 #CJK UNIFIED IDEOGRAPH -0xE3E0 0x4F81 #CJK UNIFIED IDEOGRAPH -0xE3E1 0x4FE1 #CJK UNIFIED IDEOGRAPH -0xE3E2 0x547B #CJK UNIFIED IDEOGRAPH -0xE3E3 0x5A20 #CJK UNIFIED IDEOGRAPH -0xE3E4 0x5BB8 #CJK UNIFIED IDEOGRAPH -0xE3E5 0x613C #CJK UNIFIED IDEOGRAPH -0xE3E6 0x65B0 #CJK UNIFIED IDEOGRAPH -0xE3E7 0x6668 #CJK UNIFIED IDEOGRAPH -0xE3E8 0x71FC #CJK UNIFIED IDEOGRAPH -0xE3E9 0x7533 #CJK UNIFIED IDEOGRAPH -0xE3EA 0x795E #CJK UNIFIED IDEOGRAPH -0xE3EB 0x7D33 #CJK UNIFIED IDEOGRAPH -0xE3EC 0x814E #CJK UNIFIED IDEOGRAPH -0xE3ED 0x81E3 #CJK UNIFIED IDEOGRAPH -0xE3EE 0x8398 #CJK UNIFIED IDEOGRAPH -0xE3EF 0x85AA #CJK UNIFIED IDEOGRAPH -0xE3F0 0x85CE #CJK UNIFIED IDEOGRAPH -0xE3F1 0x8703 #CJK UNIFIED IDEOGRAPH -0xE3F2 0x8A0A #CJK UNIFIED IDEOGRAPH -0xE3F3 0x8EAB #CJK UNIFIED IDEOGRAPH -0xE3F4 0x8F9B #CJK UNIFIED IDEOGRAPH -0xE3F5 0xF971 #CJK COMPATIBILITY IDEOGRAPH -0xE3F6 0x8FC5 #CJK UNIFIED IDEOGRAPH -0xE3F7 0x5931 #CJK UNIFIED IDEOGRAPH -0xE3F8 0x5BA4 #CJK UNIFIED IDEOGRAPH -0xE3F9 0x5BE6 #CJK UNIFIED IDEOGRAPH -0xE3FA 0x6089 #CJK UNIFIED IDEOGRAPH -0xE3FB 0x5BE9 #CJK UNIFIED IDEOGRAPH -0xE3FC 0x5C0B #CJK UNIFIED IDEOGRAPH -0xE3FD 0x5FC3 #CJK UNIFIED IDEOGRAPH -0xE3FE 0x6C81 #CJK UNIFIED IDEOGRAPH -0xE4A1 0xF972 #CJK COMPATIBILITY IDEOGRAPH -0xE4A2 0x6DF1 #CJK UNIFIED IDEOGRAPH -0xE4A3 0x700B #CJK UNIFIED IDEOGRAPH -0xE4A4 0x751A #CJK UNIFIED IDEOGRAPH -0xE4A5 0x82AF #CJK UNIFIED IDEOGRAPH -0xE4A6 0x8AF6 #CJK UNIFIED IDEOGRAPH -0xE4A7 0x4EC0 #CJK UNIFIED IDEOGRAPH -0xE4A8 0x5341 #CJK UNIFIED IDEOGRAPH -0xE4A9 0xF973 #CJK COMPATIBILITY IDEOGRAPH -0xE4AA 0x96D9 #CJK UNIFIED IDEOGRAPH -0xE4AB 0x6C0F #CJK UNIFIED IDEOGRAPH -0xE4AC 0x4E9E #CJK UNIFIED IDEOGRAPH -0xE4AD 0x4FC4 #CJK UNIFIED IDEOGRAPH -0xE4AE 0x5152 #CJK UNIFIED IDEOGRAPH -0xE4AF 0x555E #CJK UNIFIED IDEOGRAPH -0xE4B0 0x5A25 #CJK UNIFIED IDEOGRAPH -0xE4B1 0x5CE8 #CJK UNIFIED IDEOGRAPH -0xE4B2 0x6211 #CJK UNIFIED IDEOGRAPH -0xE4B3 0x7259 #CJK UNIFIED IDEOGRAPH -0xE4B4 0x82BD #CJK UNIFIED IDEOGRAPH -0xE4B5 0x83AA #CJK UNIFIED IDEOGRAPH -0xE4B6 0x86FE #CJK UNIFIED IDEOGRAPH -0xE4B7 0x8859 #CJK UNIFIED IDEOGRAPH -0xE4B8 0x8A1D #CJK UNIFIED IDEOGRAPH -0xE4B9 0x963F #CJK UNIFIED IDEOGRAPH -0xE4BA 0x96C5 #CJK UNIFIED IDEOGRAPH -0xE4BB 0x9913 #CJK UNIFIED IDEOGRAPH -0xE4BC 0x9D09 #CJK UNIFIED IDEOGRAPH -0xE4BD 0x9D5D #CJK UNIFIED IDEOGRAPH -0xE4BE 0x580A #CJK UNIFIED IDEOGRAPH -0xE4BF 0x5CB3 #CJK UNIFIED IDEOGRAPH -0xE4C0 0x5DBD #CJK UNIFIED IDEOGRAPH -0xE4C1 0x5E44 #CJK UNIFIED IDEOGRAPH -0xE4C2 0x60E1 #CJK UNIFIED IDEOGRAPH -0xE4C3 0x6115 #CJK UNIFIED IDEOGRAPH -0xE4C4 0x63E1 #CJK UNIFIED IDEOGRAPH -0xE4C5 0x6A02 #CJK UNIFIED IDEOGRAPH -0xE4C6 0x6E25 #CJK UNIFIED IDEOGRAPH -0xE4C7 0x9102 #CJK UNIFIED IDEOGRAPH -0xE4C8 0x9354 #CJK UNIFIED IDEOGRAPH -0xE4C9 0x984E #CJK UNIFIED IDEOGRAPH -0xE4CA 0x9C10 #CJK UNIFIED IDEOGRAPH -0xE4CB 0x9F77 #CJK UNIFIED IDEOGRAPH -0xE4CC 0x5B89 #CJK UNIFIED IDEOGRAPH -0xE4CD 0x5CB8 #CJK UNIFIED IDEOGRAPH -0xE4CE 0x6309 #CJK UNIFIED IDEOGRAPH -0xE4CF 0x664F #CJK UNIFIED IDEOGRAPH -0xE4D0 0x6848 #CJK UNIFIED IDEOGRAPH -0xE4D1 0x773C #CJK UNIFIED IDEOGRAPH -0xE4D2 0x96C1 #CJK UNIFIED IDEOGRAPH -0xE4D3 0x978D #CJK UNIFIED IDEOGRAPH -0xE4D4 0x9854 #CJK UNIFIED IDEOGRAPH -0xE4D5 0x9B9F #CJK UNIFIED IDEOGRAPH -0xE4D6 0x65A1 #CJK UNIFIED IDEOGRAPH -0xE4D7 0x8B01 #CJK UNIFIED IDEOGRAPH -0xE4D8 0x8ECB #CJK UNIFIED IDEOGRAPH -0xE4D9 0x95BC #CJK UNIFIED IDEOGRAPH -0xE4DA 0x5535 #CJK UNIFIED IDEOGRAPH -0xE4DB 0x5CA9 #CJK UNIFIED IDEOGRAPH -0xE4DC 0x5DD6 #CJK UNIFIED IDEOGRAPH -0xE4DD 0x5EB5 #CJK UNIFIED IDEOGRAPH -0xE4DE 0x6697 #CJK UNIFIED IDEOGRAPH -0xE4DF 0x764C #CJK UNIFIED IDEOGRAPH -0xE4E0 0x83F4 #CJK UNIFIED IDEOGRAPH -0xE4E1 0x95C7 #CJK UNIFIED IDEOGRAPH -0xE4E2 0x58D3 #CJK UNIFIED IDEOGRAPH -0xE4E3 0x62BC #CJK UNIFIED IDEOGRAPH -0xE4E4 0x72CE #CJK UNIFIED IDEOGRAPH -0xE4E5 0x9D28 #CJK UNIFIED IDEOGRAPH -0xE4E6 0x4EF0 #CJK UNIFIED IDEOGRAPH -0xE4E7 0x592E #CJK UNIFIED IDEOGRAPH -0xE4E8 0x600F #CJK UNIFIED IDEOGRAPH -0xE4E9 0x663B #CJK UNIFIED IDEOGRAPH -0xE4EA 0x6B83 #CJK UNIFIED IDEOGRAPH -0xE4EB 0x79E7 #CJK UNIFIED IDEOGRAPH -0xE4EC 0x9D26 #CJK UNIFIED IDEOGRAPH -0xE4ED 0x5393 #CJK UNIFIED IDEOGRAPH -0xE4EE 0x54C0 #CJK UNIFIED IDEOGRAPH -0xE4EF 0x57C3 #CJK UNIFIED IDEOGRAPH -0xE4F0 0x5D16 #CJK UNIFIED IDEOGRAPH -0xE4F1 0x611B #CJK UNIFIED IDEOGRAPH -0xE4F2 0x66D6 #CJK UNIFIED IDEOGRAPH -0xE4F3 0x6DAF #CJK UNIFIED IDEOGRAPH -0xE4F4 0x788D #CJK UNIFIED IDEOGRAPH -0xE4F5 0x827E #CJK UNIFIED IDEOGRAPH -0xE4F6 0x9698 #CJK UNIFIED IDEOGRAPH -0xE4F7 0x9744 #CJK UNIFIED IDEOGRAPH -0xE4F8 0x5384 #CJK UNIFIED IDEOGRAPH -0xE4F9 0x627C #CJK UNIFIED IDEOGRAPH -0xE4FA 0x6396 #CJK UNIFIED IDEOGRAPH -0xE4FB 0x6DB2 #CJK UNIFIED IDEOGRAPH -0xE4FC 0x7E0A #CJK UNIFIED IDEOGRAPH -0xE4FD 0x814B #CJK UNIFIED IDEOGRAPH -0xE4FE 0x984D #CJK UNIFIED IDEOGRAPH -0xE5A1 0x6AFB #CJK UNIFIED IDEOGRAPH -0xE5A2 0x7F4C #CJK UNIFIED IDEOGRAPH -0xE5A3 0x9DAF #CJK UNIFIED IDEOGRAPH -0xE5A4 0x9E1A #CJK UNIFIED IDEOGRAPH -0xE5A5 0x4E5F #CJK UNIFIED IDEOGRAPH -0xE5A6 0x503B #CJK UNIFIED IDEOGRAPH -0xE5A7 0x51B6 #CJK UNIFIED IDEOGRAPH -0xE5A8 0x591C #CJK UNIFIED IDEOGRAPH -0xE5A9 0x60F9 #CJK UNIFIED IDEOGRAPH -0xE5AA 0x63F6 #CJK UNIFIED IDEOGRAPH -0xE5AB 0x6930 #CJK UNIFIED IDEOGRAPH -0xE5AC 0x723A #CJK UNIFIED IDEOGRAPH -0xE5AD 0x8036 #CJK UNIFIED IDEOGRAPH -0xE5AE 0xF974 #CJK COMPATIBILITY IDEOGRAPH -0xE5AF 0x91CE #CJK UNIFIED IDEOGRAPH -0xE5B0 0x5F31 #CJK UNIFIED IDEOGRAPH -0xE5B1 0xF975 #CJK COMPATIBILITY IDEOGRAPH -0xE5B2 0xF976 #CJK COMPATIBILITY IDEOGRAPH -0xE5B3 0x7D04 #CJK UNIFIED IDEOGRAPH -0xE5B4 0x82E5 #CJK UNIFIED IDEOGRAPH -0xE5B5 0x846F #CJK UNIFIED IDEOGRAPH -0xE5B6 0x84BB #CJK UNIFIED IDEOGRAPH -0xE5B7 0x85E5 #CJK UNIFIED IDEOGRAPH -0xE5B8 0x8E8D #CJK UNIFIED IDEOGRAPH -0xE5B9 0xF977 #CJK COMPATIBILITY IDEOGRAPH -0xE5BA 0x4F6F #CJK UNIFIED IDEOGRAPH -0xE5BB 0xF978 #CJK COMPATIBILITY IDEOGRAPH -0xE5BC 0xF979 #CJK COMPATIBILITY IDEOGRAPH -0xE5BD 0x58E4 #CJK UNIFIED IDEOGRAPH -0xE5BE 0x5B43 #CJK UNIFIED IDEOGRAPH -0xE5BF 0x6059 #CJK UNIFIED IDEOGRAPH -0xE5C0 0x63DA #CJK UNIFIED IDEOGRAPH -0xE5C1 0x6518 #CJK UNIFIED IDEOGRAPH -0xE5C2 0x656D #CJK UNIFIED IDEOGRAPH -0xE5C3 0x6698 #CJK UNIFIED IDEOGRAPH -0xE5C4 0xF97A #CJK COMPATIBILITY IDEOGRAPH -0xE5C5 0x694A #CJK UNIFIED IDEOGRAPH -0xE5C6 0x6A23 #CJK UNIFIED IDEOGRAPH -0xE5C7 0x6D0B #CJK UNIFIED IDEOGRAPH -0xE5C8 0x7001 #CJK UNIFIED IDEOGRAPH -0xE5C9 0x716C #CJK UNIFIED IDEOGRAPH -0xE5CA 0x75D2 #CJK UNIFIED IDEOGRAPH -0xE5CB 0x760D #CJK UNIFIED IDEOGRAPH -0xE5CC 0x79B3 #CJK UNIFIED IDEOGRAPH -0xE5CD 0x7A70 #CJK UNIFIED IDEOGRAPH -0xE5CE 0xF97B #CJK COMPATIBILITY IDEOGRAPH -0xE5CF 0x7F8A #CJK UNIFIED IDEOGRAPH -0xE5D0 0xF97C #CJK COMPATIBILITY IDEOGRAPH -0xE5D1 0x8944 #CJK UNIFIED IDEOGRAPH -0xE5D2 0xF97D #CJK COMPATIBILITY IDEOGRAPH -0xE5D3 0x8B93 #CJK UNIFIED IDEOGRAPH -0xE5D4 0x91C0 #CJK UNIFIED IDEOGRAPH -0xE5D5 0x967D #CJK UNIFIED IDEOGRAPH -0xE5D6 0xF97E #CJK COMPATIBILITY IDEOGRAPH -0xE5D7 0x990A #CJK UNIFIED IDEOGRAPH -0xE5D8 0x5704 #CJK UNIFIED IDEOGRAPH -0xE5D9 0x5FA1 #CJK UNIFIED IDEOGRAPH -0xE5DA 0x65BC #CJK UNIFIED IDEOGRAPH -0xE5DB 0x6F01 #CJK UNIFIED IDEOGRAPH -0xE5DC 0x7600 #CJK UNIFIED IDEOGRAPH -0xE5DD 0x79A6 #CJK UNIFIED IDEOGRAPH -0xE5DE 0x8A9E #CJK UNIFIED IDEOGRAPH -0xE5DF 0x99AD #CJK UNIFIED IDEOGRAPH -0xE5E0 0x9B5A #CJK UNIFIED IDEOGRAPH -0xE5E1 0x9F6C #CJK UNIFIED IDEOGRAPH -0xE5E2 0x5104 #CJK UNIFIED IDEOGRAPH -0xE5E3 0x61B6 #CJK UNIFIED IDEOGRAPH -0xE5E4 0x6291 #CJK UNIFIED IDEOGRAPH -0xE5E5 0x6A8D #CJK UNIFIED IDEOGRAPH -0xE5E6 0x81C6 #CJK UNIFIED IDEOGRAPH -0xE5E7 0x5043 #CJK UNIFIED IDEOGRAPH -0xE5E8 0x5830 #CJK UNIFIED IDEOGRAPH -0xE5E9 0x5F66 #CJK UNIFIED IDEOGRAPH -0xE5EA 0x7109 #CJK UNIFIED IDEOGRAPH -0xE5EB 0x8A00 #CJK UNIFIED IDEOGRAPH -0xE5EC 0x8AFA #CJK UNIFIED IDEOGRAPH -0xE5ED 0x5B7C #CJK UNIFIED IDEOGRAPH -0xE5EE 0x8616 #CJK UNIFIED IDEOGRAPH -0xE5EF 0x4FFA #CJK UNIFIED IDEOGRAPH -0xE5F0 0x513C #CJK UNIFIED IDEOGRAPH -0xE5F1 0x56B4 #CJK UNIFIED IDEOGRAPH -0xE5F2 0x5944 #CJK UNIFIED IDEOGRAPH -0xE5F3 0x63A9 #CJK UNIFIED IDEOGRAPH -0xE5F4 0x6DF9 #CJK UNIFIED IDEOGRAPH -0xE5F5 0x5DAA #CJK UNIFIED IDEOGRAPH -0xE5F6 0x696D #CJK UNIFIED IDEOGRAPH -0xE5F7 0x5186 #CJK UNIFIED IDEOGRAPH -0xE5F8 0x4E88 #CJK UNIFIED IDEOGRAPH -0xE5F9 0x4F59 #CJK UNIFIED IDEOGRAPH -0xE5FA 0xF97F #CJK COMPATIBILITY IDEOGRAPH -0xE5FB 0xF980 #CJK COMPATIBILITY IDEOGRAPH -0xE5FC 0xF981 #CJK COMPATIBILITY IDEOGRAPH -0xE5FD 0x5982 #CJK UNIFIED IDEOGRAPH -0xE5FE 0xF982 #CJK COMPATIBILITY IDEOGRAPH -0xE6A1 0xF983 #CJK COMPATIBILITY IDEOGRAPH -0xE6A2 0x6B5F #CJK UNIFIED IDEOGRAPH -0xE6A3 0x6C5D #CJK UNIFIED IDEOGRAPH -0xE6A4 0xF984 #CJK COMPATIBILITY IDEOGRAPH -0xE6A5 0x74B5 #CJK UNIFIED IDEOGRAPH -0xE6A6 0x7916 #CJK UNIFIED IDEOGRAPH -0xE6A7 0xF985 #CJK COMPATIBILITY IDEOGRAPH -0xE6A8 0x8207 #CJK UNIFIED IDEOGRAPH -0xE6A9 0x8245 #CJK UNIFIED IDEOGRAPH -0xE6AA 0x8339 #CJK UNIFIED IDEOGRAPH -0xE6AB 0x8F3F #CJK UNIFIED IDEOGRAPH -0xE6AC 0x8F5D #CJK UNIFIED IDEOGRAPH -0xE6AD 0xF986 #CJK COMPATIBILITY IDEOGRAPH -0xE6AE 0x9918 #CJK UNIFIED IDEOGRAPH -0xE6AF 0xF987 #CJK COMPATIBILITY IDEOGRAPH -0xE6B0 0xF988 #CJK COMPATIBILITY IDEOGRAPH -0xE6B1 0xF989 #CJK COMPATIBILITY IDEOGRAPH -0xE6B2 0x4EA6 #CJK UNIFIED IDEOGRAPH -0xE6B3 0xF98A #CJK COMPATIBILITY IDEOGRAPH -0xE6B4 0x57DF #CJK UNIFIED IDEOGRAPH -0xE6B5 0x5F79 #CJK UNIFIED IDEOGRAPH -0xE6B6 0x6613 #CJK UNIFIED IDEOGRAPH -0xE6B7 0xF98B #CJK COMPATIBILITY IDEOGRAPH -0xE6B8 0xF98C #CJK COMPATIBILITY IDEOGRAPH -0xE6B9 0x75AB #CJK UNIFIED IDEOGRAPH -0xE6BA 0x7E79 #CJK UNIFIED IDEOGRAPH -0xE6BB 0x8B6F #CJK UNIFIED IDEOGRAPH -0xE6BC 0xF98D #CJK COMPATIBILITY IDEOGRAPH -0xE6BD 0x9006 #CJK UNIFIED IDEOGRAPH -0xE6BE 0x9A5B #CJK UNIFIED IDEOGRAPH -0xE6BF 0x56A5 #CJK UNIFIED IDEOGRAPH -0xE6C0 0x5827 #CJK UNIFIED IDEOGRAPH -0xE6C1 0x59F8 #CJK UNIFIED IDEOGRAPH -0xE6C2 0x5A1F #CJK UNIFIED IDEOGRAPH -0xE6C3 0x5BB4 #CJK UNIFIED IDEOGRAPH -0xE6C4 0xF98E #CJK COMPATIBILITY IDEOGRAPH -0xE6C5 0x5EF6 #CJK UNIFIED IDEOGRAPH -0xE6C6 0xF98F #CJK COMPATIBILITY IDEOGRAPH -0xE6C7 0xF990 #CJK COMPATIBILITY IDEOGRAPH -0xE6C8 0x6350 #CJK UNIFIED IDEOGRAPH -0xE6C9 0x633B #CJK UNIFIED IDEOGRAPH -0xE6CA 0xF991 #CJK COMPATIBILITY IDEOGRAPH -0xE6CB 0x693D #CJK UNIFIED IDEOGRAPH -0xE6CC 0x6C87 #CJK UNIFIED IDEOGRAPH -0xE6CD 0x6CBF #CJK UNIFIED IDEOGRAPH -0xE6CE 0x6D8E #CJK UNIFIED IDEOGRAPH -0xE6CF 0x6D93 #CJK UNIFIED IDEOGRAPH -0xE6D0 0x6DF5 #CJK UNIFIED IDEOGRAPH -0xE6D1 0x6F14 #CJK UNIFIED IDEOGRAPH -0xE6D2 0xF992 #CJK COMPATIBILITY IDEOGRAPH -0xE6D3 0x70DF #CJK UNIFIED IDEOGRAPH -0xE6D4 0x7136 #CJK UNIFIED IDEOGRAPH -0xE6D5 0x7159 #CJK UNIFIED IDEOGRAPH -0xE6D6 0xF993 #CJK COMPATIBILITY IDEOGRAPH -0xE6D7 0x71C3 #CJK UNIFIED IDEOGRAPH -0xE6D8 0x71D5 #CJK UNIFIED IDEOGRAPH -0xE6D9 0xF994 #CJK COMPATIBILITY IDEOGRAPH -0xE6DA 0x784F #CJK UNIFIED IDEOGRAPH -0xE6DB 0x786F #CJK UNIFIED IDEOGRAPH -0xE6DC 0xF995 #CJK COMPATIBILITY IDEOGRAPH -0xE6DD 0x7B75 #CJK UNIFIED IDEOGRAPH -0xE6DE 0x7DE3 #CJK UNIFIED IDEOGRAPH -0xE6DF 0xF996 #CJK COMPATIBILITY IDEOGRAPH -0xE6E0 0x7E2F #CJK UNIFIED IDEOGRAPH -0xE6E1 0xF997 #CJK COMPATIBILITY IDEOGRAPH -0xE6E2 0x884D #CJK UNIFIED IDEOGRAPH -0xE6E3 0x8EDF #CJK UNIFIED IDEOGRAPH -0xE6E4 0xF998 #CJK COMPATIBILITY IDEOGRAPH -0xE6E5 0xF999 #CJK COMPATIBILITY IDEOGRAPH -0xE6E6 0xF99A #CJK COMPATIBILITY IDEOGRAPH -0xE6E7 0x925B #CJK UNIFIED IDEOGRAPH -0xE6E8 0xF99B #CJK COMPATIBILITY IDEOGRAPH -0xE6E9 0x9CF6 #CJK UNIFIED IDEOGRAPH -0xE6EA 0xF99C #CJK COMPATIBILITY IDEOGRAPH -0xE6EB 0xF99D #CJK COMPATIBILITY IDEOGRAPH -0xE6EC 0xF99E #CJK COMPATIBILITY IDEOGRAPH -0xE6ED 0x6085 #CJK UNIFIED IDEOGRAPH -0xE6EE 0x6D85 #CJK UNIFIED IDEOGRAPH -0xE6EF 0xF99F #CJK COMPATIBILITY IDEOGRAPH -0xE6F0 0x71B1 #CJK UNIFIED IDEOGRAPH -0xE6F1 0xF9A0 #CJK COMPATIBILITY IDEOGRAPH -0xE6F2 0xF9A1 #CJK COMPATIBILITY IDEOGRAPH -0xE6F3 0x95B1 #CJK UNIFIED IDEOGRAPH -0xE6F4 0x53AD #CJK UNIFIED IDEOGRAPH -0xE6F5 0xF9A2 #CJK COMPATIBILITY IDEOGRAPH -0xE6F6 0xF9A3 #CJK COMPATIBILITY IDEOGRAPH -0xE6F7 0xF9A4 #CJK COMPATIBILITY IDEOGRAPH -0xE6F8 0x67D3 #CJK UNIFIED IDEOGRAPH -0xE6F9 0xF9A5 #CJK COMPATIBILITY IDEOGRAPH -0xE6FA 0x708E #CJK UNIFIED IDEOGRAPH -0xE6FB 0x7130 #CJK UNIFIED IDEOGRAPH -0xE6FC 0x7430 #CJK UNIFIED IDEOGRAPH -0xE6FD 0x8276 #CJK UNIFIED IDEOGRAPH -0xE6FE 0x82D2 #CJK UNIFIED IDEOGRAPH -0xE7A1 0xF9A6 #CJK COMPATIBILITY IDEOGRAPH -0xE7A2 0x95BB #CJK UNIFIED IDEOGRAPH -0xE7A3 0x9AE5 #CJK UNIFIED IDEOGRAPH -0xE7A4 0x9E7D #CJK UNIFIED IDEOGRAPH -0xE7A5 0x66C4 #CJK UNIFIED IDEOGRAPH -0xE7A6 0xF9A7 #CJK COMPATIBILITY IDEOGRAPH -0xE7A7 0x71C1 #CJK UNIFIED IDEOGRAPH -0xE7A8 0x8449 #CJK UNIFIED IDEOGRAPH -0xE7A9 0xF9A8 #CJK COMPATIBILITY IDEOGRAPH -0xE7AA 0xF9A9 #CJK COMPATIBILITY IDEOGRAPH -0xE7AB 0x584B #CJK UNIFIED IDEOGRAPH -0xE7AC 0xF9AA #CJK COMPATIBILITY IDEOGRAPH -0xE7AD 0xF9AB #CJK COMPATIBILITY IDEOGRAPH -0xE7AE 0x5DB8 #CJK UNIFIED IDEOGRAPH -0xE7AF 0x5F71 #CJK UNIFIED IDEOGRAPH -0xE7B0 0xF9AC #CJK COMPATIBILITY IDEOGRAPH -0xE7B1 0x6620 #CJK UNIFIED IDEOGRAPH -0xE7B2 0x668E #CJK UNIFIED IDEOGRAPH -0xE7B3 0x6979 #CJK UNIFIED IDEOGRAPH -0xE7B4 0x69AE #CJK UNIFIED IDEOGRAPH -0xE7B5 0x6C38 #CJK UNIFIED IDEOGRAPH -0xE7B6 0x6CF3 #CJK UNIFIED IDEOGRAPH -0xE7B7 0x6E36 #CJK UNIFIED IDEOGRAPH -0xE7B8 0x6F41 #CJK UNIFIED IDEOGRAPH -0xE7B9 0x6FDA #CJK UNIFIED IDEOGRAPH -0xE7BA 0x701B #CJK UNIFIED IDEOGRAPH -0xE7BB 0x702F #CJK UNIFIED IDEOGRAPH -0xE7BC 0x7150 #CJK UNIFIED IDEOGRAPH -0xE7BD 0x71DF #CJK UNIFIED IDEOGRAPH -0xE7BE 0x7370 #CJK UNIFIED IDEOGRAPH -0xE7BF 0xF9AD #CJK COMPATIBILITY IDEOGRAPH -0xE7C0 0x745B #CJK UNIFIED IDEOGRAPH -0xE7C1 0xF9AE #CJK COMPATIBILITY IDEOGRAPH -0xE7C2 0x74D4 #CJK UNIFIED IDEOGRAPH -0xE7C3 0x76C8 #CJK UNIFIED IDEOGRAPH -0xE7C4 0x7A4E #CJK UNIFIED IDEOGRAPH -0xE7C5 0x7E93 #CJK UNIFIED IDEOGRAPH -0xE7C6 0xF9AF #CJK COMPATIBILITY IDEOGRAPH -0xE7C7 0xF9B0 #CJK COMPATIBILITY IDEOGRAPH -0xE7C8 0x82F1 #CJK UNIFIED IDEOGRAPH -0xE7C9 0x8A60 #CJK UNIFIED IDEOGRAPH -0xE7CA 0x8FCE #CJK UNIFIED IDEOGRAPH -0xE7CB 0xF9B1 #CJK COMPATIBILITY IDEOGRAPH -0xE7CC 0x9348 #CJK UNIFIED IDEOGRAPH -0xE7CD 0xF9B2 #CJK COMPATIBILITY IDEOGRAPH -0xE7CE 0x9719 #CJK UNIFIED IDEOGRAPH -0xE7CF 0xF9B3 #CJK COMPATIBILITY IDEOGRAPH -0xE7D0 0xF9B4 #CJK COMPATIBILITY IDEOGRAPH -0xE7D1 0x4E42 #CJK UNIFIED IDEOGRAPH -0xE7D2 0x502A #CJK UNIFIED IDEOGRAPH -0xE7D3 0xF9B5 #CJK COMPATIBILITY IDEOGRAPH -0xE7D4 0x5208 #CJK UNIFIED IDEOGRAPH -0xE7D5 0x53E1 #CJK UNIFIED IDEOGRAPH -0xE7D6 0x66F3 #CJK UNIFIED IDEOGRAPH -0xE7D7 0x6C6D #CJK UNIFIED IDEOGRAPH -0xE7D8 0x6FCA #CJK UNIFIED IDEOGRAPH -0xE7D9 0x730A #CJK UNIFIED IDEOGRAPH -0xE7DA 0x777F #CJK UNIFIED IDEOGRAPH -0xE7DB 0x7A62 #CJK UNIFIED IDEOGRAPH -0xE7DC 0x82AE #CJK UNIFIED IDEOGRAPH -0xE7DD 0x85DD #CJK UNIFIED IDEOGRAPH -0xE7DE 0x8602 #CJK UNIFIED IDEOGRAPH -0xE7DF 0xF9B6 #CJK COMPATIBILITY IDEOGRAPH -0xE7E0 0x88D4 #CJK UNIFIED IDEOGRAPH -0xE7E1 0x8A63 #CJK UNIFIED IDEOGRAPH -0xE7E2 0x8B7D #CJK UNIFIED IDEOGRAPH -0xE7E3 0x8C6B #CJK UNIFIED IDEOGRAPH -0xE7E4 0xF9B7 #CJK COMPATIBILITY IDEOGRAPH -0xE7E5 0x92B3 #CJK UNIFIED IDEOGRAPH -0xE7E6 0xF9B8 #CJK COMPATIBILITY IDEOGRAPH -0xE7E7 0x9713 #CJK UNIFIED IDEOGRAPH -0xE7E8 0x9810 #CJK UNIFIED IDEOGRAPH -0xE7E9 0x4E94 #CJK UNIFIED IDEOGRAPH -0xE7EA 0x4F0D #CJK UNIFIED IDEOGRAPH -0xE7EB 0x4FC9 #CJK UNIFIED IDEOGRAPH -0xE7EC 0x50B2 #CJK UNIFIED IDEOGRAPH -0xE7ED 0x5348 #CJK UNIFIED IDEOGRAPH -0xE7EE 0x543E #CJK UNIFIED IDEOGRAPH -0xE7EF 0x5433 #CJK UNIFIED IDEOGRAPH -0xE7F0 0x55DA #CJK UNIFIED IDEOGRAPH -0xE7F1 0x5862 #CJK UNIFIED IDEOGRAPH -0xE7F2 0x58BA #CJK UNIFIED IDEOGRAPH -0xE7F3 0x5967 #CJK UNIFIED IDEOGRAPH -0xE7F4 0x5A1B #CJK UNIFIED IDEOGRAPH -0xE7F5 0x5BE4 #CJK UNIFIED IDEOGRAPH -0xE7F6 0x609F #CJK UNIFIED IDEOGRAPH -0xE7F7 0xF9B9 #CJK COMPATIBILITY IDEOGRAPH -0xE7F8 0x61CA #CJK UNIFIED IDEOGRAPH -0xE7F9 0x6556 #CJK UNIFIED IDEOGRAPH -0xE7FA 0x65FF #CJK UNIFIED IDEOGRAPH -0xE7FB 0x6664 #CJK UNIFIED IDEOGRAPH -0xE7FC 0x68A7 #CJK UNIFIED IDEOGRAPH -0xE7FD 0x6C5A #CJK UNIFIED IDEOGRAPH -0xE7FE 0x6FB3 #CJK UNIFIED IDEOGRAPH -0xE8A1 0x70CF #CJK UNIFIED IDEOGRAPH -0xE8A2 0x71AC #CJK UNIFIED IDEOGRAPH -0xE8A3 0x7352 #CJK UNIFIED IDEOGRAPH -0xE8A4 0x7B7D #CJK UNIFIED IDEOGRAPH -0xE8A5 0x8708 #CJK UNIFIED IDEOGRAPH -0xE8A6 0x8AA4 #CJK UNIFIED IDEOGRAPH -0xE8A7 0x9C32 #CJK UNIFIED IDEOGRAPH -0xE8A8 0x9F07 #CJK UNIFIED IDEOGRAPH -0xE8A9 0x5C4B #CJK UNIFIED IDEOGRAPH -0xE8AA 0x6C83 #CJK UNIFIED IDEOGRAPH -0xE8AB 0x7344 #CJK UNIFIED IDEOGRAPH -0xE8AC 0x7389 #CJK UNIFIED IDEOGRAPH -0xE8AD 0x923A #CJK UNIFIED IDEOGRAPH -0xE8AE 0x6EAB #CJK UNIFIED IDEOGRAPH -0xE8AF 0x7465 #CJK UNIFIED IDEOGRAPH -0xE8B0 0x761F #CJK UNIFIED IDEOGRAPH -0xE8B1 0x7A69 #CJK UNIFIED IDEOGRAPH -0xE8B2 0x7E15 #CJK UNIFIED IDEOGRAPH -0xE8B3 0x860A #CJK UNIFIED IDEOGRAPH -0xE8B4 0x5140 #CJK UNIFIED IDEOGRAPH -0xE8B5 0x58C5 #CJK UNIFIED IDEOGRAPH -0xE8B6 0x64C1 #CJK UNIFIED IDEOGRAPH -0xE8B7 0x74EE #CJK UNIFIED IDEOGRAPH -0xE8B8 0x7515 #CJK UNIFIED IDEOGRAPH -0xE8B9 0x7670 #CJK UNIFIED IDEOGRAPH -0xE8BA 0x7FC1 #CJK UNIFIED IDEOGRAPH -0xE8BB 0x9095 #CJK UNIFIED IDEOGRAPH -0xE8BC 0x96CD #CJK UNIFIED IDEOGRAPH -0xE8BD 0x9954 #CJK UNIFIED IDEOGRAPH -0xE8BE 0x6E26 #CJK UNIFIED IDEOGRAPH -0xE8BF 0x74E6 #CJK UNIFIED IDEOGRAPH -0xE8C0 0x7AA9 #CJK UNIFIED IDEOGRAPH -0xE8C1 0x7AAA #CJK UNIFIED IDEOGRAPH -0xE8C2 0x81E5 #CJK UNIFIED IDEOGRAPH -0xE8C3 0x86D9 #CJK UNIFIED IDEOGRAPH -0xE8C4 0x8778 #CJK UNIFIED IDEOGRAPH -0xE8C5 0x8A1B #CJK UNIFIED IDEOGRAPH -0xE8C6 0x5A49 #CJK UNIFIED IDEOGRAPH -0xE8C7 0x5B8C #CJK UNIFIED IDEOGRAPH -0xE8C8 0x5B9B #CJK UNIFIED IDEOGRAPH -0xE8C9 0x68A1 #CJK UNIFIED IDEOGRAPH -0xE8CA 0x6900 #CJK UNIFIED IDEOGRAPH -0xE8CB 0x6D63 #CJK UNIFIED IDEOGRAPH -0xE8CC 0x73A9 #CJK UNIFIED IDEOGRAPH -0xE8CD 0x7413 #CJK UNIFIED IDEOGRAPH -0xE8CE 0x742C #CJK UNIFIED IDEOGRAPH -0xE8CF 0x7897 #CJK UNIFIED IDEOGRAPH -0xE8D0 0x7DE9 #CJK UNIFIED IDEOGRAPH -0xE8D1 0x7FEB #CJK UNIFIED IDEOGRAPH -0xE8D2 0x8118 #CJK UNIFIED IDEOGRAPH -0xE8D3 0x8155 #CJK UNIFIED IDEOGRAPH -0xE8D4 0x839E #CJK UNIFIED IDEOGRAPH -0xE8D5 0x8C4C #CJK UNIFIED IDEOGRAPH -0xE8D6 0x962E #CJK UNIFIED IDEOGRAPH -0xE8D7 0x9811 #CJK UNIFIED IDEOGRAPH -0xE8D8 0x66F0 #CJK UNIFIED IDEOGRAPH -0xE8D9 0x5F80 #CJK UNIFIED IDEOGRAPH -0xE8DA 0x65FA #CJK UNIFIED IDEOGRAPH -0xE8DB 0x6789 #CJK UNIFIED IDEOGRAPH -0xE8DC 0x6C6A #CJK UNIFIED IDEOGRAPH -0xE8DD 0x738B #CJK UNIFIED IDEOGRAPH -0xE8DE 0x502D #CJK UNIFIED IDEOGRAPH -0xE8DF 0x5A03 #CJK UNIFIED IDEOGRAPH -0xE8E0 0x6B6A #CJK UNIFIED IDEOGRAPH -0xE8E1 0x77EE #CJK UNIFIED IDEOGRAPH -0xE8E2 0x5916 #CJK UNIFIED IDEOGRAPH -0xE8E3 0x5D6C #CJK UNIFIED IDEOGRAPH -0xE8E4 0x5DCD #CJK UNIFIED IDEOGRAPH -0xE8E5 0x7325 #CJK UNIFIED IDEOGRAPH -0xE8E6 0x754F #CJK UNIFIED IDEOGRAPH -0xE8E7 0xF9BA #CJK COMPATIBILITY IDEOGRAPH -0xE8E8 0xF9BB #CJK COMPATIBILITY IDEOGRAPH -0xE8E9 0x50E5 #CJK UNIFIED IDEOGRAPH -0xE8EA 0x51F9 #CJK UNIFIED IDEOGRAPH -0xE8EB 0x582F #CJK UNIFIED IDEOGRAPH -0xE8EC 0x592D #CJK UNIFIED IDEOGRAPH -0xE8ED 0x5996 #CJK UNIFIED IDEOGRAPH -0xE8EE 0x59DA #CJK UNIFIED IDEOGRAPH -0xE8EF 0x5BE5 #CJK UNIFIED IDEOGRAPH -0xE8F0 0xF9BC #CJK COMPATIBILITY IDEOGRAPH -0xE8F1 0xF9BD #CJK COMPATIBILITY IDEOGRAPH -0xE8F2 0x5DA2 #CJK UNIFIED IDEOGRAPH -0xE8F3 0x62D7 #CJK UNIFIED IDEOGRAPH -0xE8F4 0x6416 #CJK UNIFIED IDEOGRAPH -0xE8F5 0x6493 #CJK UNIFIED IDEOGRAPH -0xE8F6 0x64FE #CJK UNIFIED IDEOGRAPH -0xE8F7 0xF9BE #CJK COMPATIBILITY IDEOGRAPH -0xE8F8 0x66DC #CJK UNIFIED IDEOGRAPH -0xE8F9 0xF9BF #CJK COMPATIBILITY IDEOGRAPH -0xE8FA 0x6A48 #CJK UNIFIED IDEOGRAPH -0xE8FB 0xF9C0 #CJK COMPATIBILITY IDEOGRAPH -0xE8FC 0x71FF #CJK UNIFIED IDEOGRAPH -0xE8FD 0x7464 #CJK UNIFIED IDEOGRAPH -0xE8FE 0xF9C1 #CJK COMPATIBILITY IDEOGRAPH -0xE9A1 0x7A88 #CJK UNIFIED IDEOGRAPH -0xE9A2 0x7AAF #CJK UNIFIED IDEOGRAPH -0xE9A3 0x7E47 #CJK UNIFIED IDEOGRAPH -0xE9A4 0x7E5E #CJK UNIFIED IDEOGRAPH -0xE9A5 0x8000 #CJK UNIFIED IDEOGRAPH -0xE9A6 0x8170 #CJK UNIFIED IDEOGRAPH -0xE9A7 0xF9C2 #CJK COMPATIBILITY IDEOGRAPH -0xE9A8 0x87EF #CJK UNIFIED IDEOGRAPH -0xE9A9 0x8981 #CJK UNIFIED IDEOGRAPH -0xE9AA 0x8B20 #CJK UNIFIED IDEOGRAPH -0xE9AB 0x9059 #CJK UNIFIED IDEOGRAPH -0xE9AC 0xF9C3 #CJK COMPATIBILITY IDEOGRAPH -0xE9AD 0x9080 #CJK UNIFIED IDEOGRAPH -0xE9AE 0x9952 #CJK UNIFIED IDEOGRAPH -0xE9AF 0x617E #CJK UNIFIED IDEOGRAPH -0xE9B0 0x6B32 #CJK UNIFIED IDEOGRAPH -0xE9B1 0x6D74 #CJK UNIFIED IDEOGRAPH -0xE9B2 0x7E1F #CJK UNIFIED IDEOGRAPH -0xE9B3 0x8925 #CJK UNIFIED IDEOGRAPH -0xE9B4 0x8FB1 #CJK UNIFIED IDEOGRAPH -0xE9B5 0x4FD1 #CJK UNIFIED IDEOGRAPH -0xE9B6 0x50AD #CJK UNIFIED IDEOGRAPH -0xE9B7 0x5197 #CJK UNIFIED IDEOGRAPH -0xE9B8 0x52C7 #CJK UNIFIED IDEOGRAPH -0xE9B9 0x57C7 #CJK UNIFIED IDEOGRAPH -0xE9BA 0x5889 #CJK UNIFIED IDEOGRAPH -0xE9BB 0x5BB9 #CJK UNIFIED IDEOGRAPH -0xE9BC 0x5EB8 #CJK UNIFIED IDEOGRAPH -0xE9BD 0x6142 #CJK UNIFIED IDEOGRAPH -0xE9BE 0x6995 #CJK UNIFIED IDEOGRAPH -0xE9BF 0x6D8C #CJK UNIFIED IDEOGRAPH -0xE9C0 0x6E67 #CJK UNIFIED IDEOGRAPH -0xE9C1 0x6EB6 #CJK UNIFIED IDEOGRAPH -0xE9C2 0x7194 #CJK UNIFIED IDEOGRAPH -0xE9C3 0x7462 #CJK UNIFIED IDEOGRAPH -0xE9C4 0x7528 #CJK UNIFIED IDEOGRAPH -0xE9C5 0x752C #CJK UNIFIED IDEOGRAPH -0xE9C6 0x8073 #CJK UNIFIED IDEOGRAPH -0xE9C7 0x8338 #CJK UNIFIED IDEOGRAPH -0xE9C8 0x84C9 #CJK UNIFIED IDEOGRAPH -0xE9C9 0x8E0A #CJK UNIFIED IDEOGRAPH -0xE9CA 0x9394 #CJK UNIFIED IDEOGRAPH -0xE9CB 0x93DE #CJK UNIFIED IDEOGRAPH -0xE9CC 0xF9C4 #CJK COMPATIBILITY IDEOGRAPH -0xE9CD 0x4E8E #CJK UNIFIED IDEOGRAPH -0xE9CE 0x4F51 #CJK UNIFIED IDEOGRAPH -0xE9CF 0x5076 #CJK UNIFIED IDEOGRAPH -0xE9D0 0x512A #CJK UNIFIED IDEOGRAPH -0xE9D1 0x53C8 #CJK UNIFIED IDEOGRAPH -0xE9D2 0x53CB #CJK UNIFIED IDEOGRAPH -0xE9D3 0x53F3 #CJK UNIFIED IDEOGRAPH -0xE9D4 0x5B87 #CJK UNIFIED IDEOGRAPH -0xE9D5 0x5BD3 #CJK UNIFIED IDEOGRAPH -0xE9D6 0x5C24 #CJK UNIFIED IDEOGRAPH -0xE9D7 0x611A #CJK UNIFIED IDEOGRAPH -0xE9D8 0x6182 #CJK UNIFIED IDEOGRAPH -0xE9D9 0x65F4 #CJK UNIFIED IDEOGRAPH -0xE9DA 0x725B #CJK UNIFIED IDEOGRAPH -0xE9DB 0x7397 #CJK UNIFIED IDEOGRAPH -0xE9DC 0x7440 #CJK UNIFIED IDEOGRAPH -0xE9DD 0x76C2 #CJK UNIFIED IDEOGRAPH -0xE9DE 0x7950 #CJK UNIFIED IDEOGRAPH -0xE9DF 0x7991 #CJK UNIFIED IDEOGRAPH -0xE9E0 0x79B9 #CJK UNIFIED IDEOGRAPH -0xE9E1 0x7D06 #CJK UNIFIED IDEOGRAPH -0xE9E2 0x7FBD #CJK UNIFIED IDEOGRAPH -0xE9E3 0x828B #CJK UNIFIED IDEOGRAPH -0xE9E4 0x85D5 #CJK UNIFIED IDEOGRAPH -0xE9E5 0x865E #CJK UNIFIED IDEOGRAPH -0xE9E6 0x8FC2 #CJK UNIFIED IDEOGRAPH -0xE9E7 0x9047 #CJK UNIFIED IDEOGRAPH -0xE9E8 0x90F5 #CJK UNIFIED IDEOGRAPH -0xE9E9 0x91EA #CJK UNIFIED IDEOGRAPH -0xE9EA 0x9685 #CJK UNIFIED IDEOGRAPH -0xE9EB 0x96E8 #CJK UNIFIED IDEOGRAPH -0xE9EC 0x96E9 #CJK UNIFIED IDEOGRAPH -0xE9ED 0x52D6 #CJK UNIFIED IDEOGRAPH -0xE9EE 0x5F67 #CJK UNIFIED IDEOGRAPH -0xE9EF 0x65ED #CJK UNIFIED IDEOGRAPH -0xE9F0 0x6631 #CJK UNIFIED IDEOGRAPH -0xE9F1 0x682F #CJK UNIFIED IDEOGRAPH -0xE9F2 0x715C #CJK UNIFIED IDEOGRAPH -0xE9F3 0x7A36 #CJK UNIFIED IDEOGRAPH -0xE9F4 0x90C1 #CJK UNIFIED IDEOGRAPH -0xE9F5 0x980A #CJK UNIFIED IDEOGRAPH -0xE9F6 0x4E91 #CJK UNIFIED IDEOGRAPH -0xE9F7 0xF9C5 #CJK COMPATIBILITY IDEOGRAPH -0xE9F8 0x6A52 #CJK UNIFIED IDEOGRAPH -0xE9F9 0x6B9E #CJK UNIFIED IDEOGRAPH -0xE9FA 0x6F90 #CJK UNIFIED IDEOGRAPH -0xE9FB 0x7189 #CJK UNIFIED IDEOGRAPH -0xE9FC 0x8018 #CJK UNIFIED IDEOGRAPH -0xE9FD 0x82B8 #CJK UNIFIED IDEOGRAPH -0xE9FE 0x8553 #CJK UNIFIED IDEOGRAPH -0xEAA1 0x904B #CJK UNIFIED IDEOGRAPH -0xEAA2 0x9695 #CJK UNIFIED IDEOGRAPH -0xEAA3 0x96F2 #CJK UNIFIED IDEOGRAPH -0xEAA4 0x97FB #CJK UNIFIED IDEOGRAPH -0xEAA5 0x851A #CJK UNIFIED IDEOGRAPH -0xEAA6 0x9B31 #CJK UNIFIED IDEOGRAPH -0xEAA7 0x4E90 #CJK UNIFIED IDEOGRAPH -0xEAA8 0x718A #CJK UNIFIED IDEOGRAPH -0xEAA9 0x96C4 #CJK UNIFIED IDEOGRAPH -0xEAAA 0x5143 #CJK UNIFIED IDEOGRAPH -0xEAAB 0x539F #CJK UNIFIED IDEOGRAPH -0xEAAC 0x54E1 #CJK UNIFIED IDEOGRAPH -0xEAAD 0x5713 #CJK UNIFIED IDEOGRAPH -0xEAAE 0x5712 #CJK UNIFIED IDEOGRAPH -0xEAAF 0x57A3 #CJK UNIFIED IDEOGRAPH -0xEAB0 0x5A9B #CJK UNIFIED IDEOGRAPH -0xEAB1 0x5AC4 #CJK UNIFIED IDEOGRAPH -0xEAB2 0x5BC3 #CJK UNIFIED IDEOGRAPH -0xEAB3 0x6028 #CJK UNIFIED IDEOGRAPH -0xEAB4 0x613F #CJK UNIFIED IDEOGRAPH -0xEAB5 0x63F4 #CJK UNIFIED IDEOGRAPH -0xEAB6 0x6C85 #CJK UNIFIED IDEOGRAPH -0xEAB7 0x6D39 #CJK UNIFIED IDEOGRAPH -0xEAB8 0x6E72 #CJK UNIFIED IDEOGRAPH -0xEAB9 0x6E90 #CJK UNIFIED IDEOGRAPH -0xEABA 0x7230 #CJK UNIFIED IDEOGRAPH -0xEABB 0x733F #CJK UNIFIED IDEOGRAPH -0xEABC 0x7457 #CJK UNIFIED IDEOGRAPH -0xEABD 0x82D1 #CJK UNIFIED IDEOGRAPH -0xEABE 0x8881 #CJK UNIFIED IDEOGRAPH -0xEABF 0x8F45 #CJK UNIFIED IDEOGRAPH -0xEAC0 0x9060 #CJK UNIFIED IDEOGRAPH -0xEAC1 0xF9C6 #CJK COMPATIBILITY IDEOGRAPH -0xEAC2 0x9662 #CJK UNIFIED IDEOGRAPH -0xEAC3 0x9858 #CJK UNIFIED IDEOGRAPH -0xEAC4 0x9D1B #CJK UNIFIED IDEOGRAPH -0xEAC5 0x6708 #CJK UNIFIED IDEOGRAPH -0xEAC6 0x8D8A #CJK UNIFIED IDEOGRAPH -0xEAC7 0x925E #CJK UNIFIED IDEOGRAPH -0xEAC8 0x4F4D #CJK UNIFIED IDEOGRAPH -0xEAC9 0x5049 #CJK UNIFIED IDEOGRAPH -0xEACA 0x50DE #CJK UNIFIED IDEOGRAPH -0xEACB 0x5371 #CJK UNIFIED IDEOGRAPH -0xEACC 0x570D #CJK UNIFIED IDEOGRAPH -0xEACD 0x59D4 #CJK UNIFIED IDEOGRAPH -0xEACE 0x5A01 #CJK UNIFIED IDEOGRAPH -0xEACF 0x5C09 #CJK UNIFIED IDEOGRAPH -0xEAD0 0x6170 #CJK UNIFIED IDEOGRAPH -0xEAD1 0x6690 #CJK UNIFIED IDEOGRAPH -0xEAD2 0x6E2D #CJK UNIFIED IDEOGRAPH -0xEAD3 0x7232 #CJK UNIFIED IDEOGRAPH -0xEAD4 0x744B #CJK UNIFIED IDEOGRAPH -0xEAD5 0x7DEF #CJK UNIFIED IDEOGRAPH -0xEAD6 0x80C3 #CJK UNIFIED IDEOGRAPH -0xEAD7 0x840E #CJK UNIFIED IDEOGRAPH -0xEAD8 0x8466 #CJK UNIFIED IDEOGRAPH -0xEAD9 0x853F #CJK UNIFIED IDEOGRAPH -0xEADA 0x875F #CJK UNIFIED IDEOGRAPH -0xEADB 0x885B #CJK UNIFIED IDEOGRAPH -0xEADC 0x8918 #CJK UNIFIED IDEOGRAPH -0xEADD 0x8B02 #CJK UNIFIED IDEOGRAPH -0xEADE 0x9055 #CJK UNIFIED IDEOGRAPH -0xEADF 0x97CB #CJK UNIFIED IDEOGRAPH -0xEAE0 0x9B4F #CJK UNIFIED IDEOGRAPH -0xEAE1 0x4E73 #CJK UNIFIED IDEOGRAPH -0xEAE2 0x4F91 #CJK UNIFIED IDEOGRAPH -0xEAE3 0x5112 #CJK UNIFIED IDEOGRAPH -0xEAE4 0x516A #CJK UNIFIED IDEOGRAPH -0xEAE5 0xF9C7 #CJK COMPATIBILITY IDEOGRAPH -0xEAE6 0x552F #CJK UNIFIED IDEOGRAPH -0xEAE7 0x55A9 #CJK UNIFIED IDEOGRAPH -0xEAE8 0x5B7A #CJK UNIFIED IDEOGRAPH -0xEAE9 0x5BA5 #CJK UNIFIED IDEOGRAPH -0xEAEA 0x5E7C #CJK UNIFIED IDEOGRAPH -0xEAEB 0x5E7D #CJK UNIFIED IDEOGRAPH -0xEAEC 0x5EBE #CJK UNIFIED IDEOGRAPH -0xEAED 0x60A0 #CJK UNIFIED IDEOGRAPH -0xEAEE 0x60DF #CJK UNIFIED IDEOGRAPH -0xEAEF 0x6108 #CJK UNIFIED IDEOGRAPH -0xEAF0 0x6109 #CJK UNIFIED IDEOGRAPH -0xEAF1 0x63C4 #CJK UNIFIED IDEOGRAPH -0xEAF2 0x6538 #CJK UNIFIED IDEOGRAPH -0xEAF3 0x6709 #CJK UNIFIED IDEOGRAPH -0xEAF4 0xF9C8 #CJK COMPATIBILITY IDEOGRAPH -0xEAF5 0x67D4 #CJK UNIFIED IDEOGRAPH -0xEAF6 0x67DA #CJK UNIFIED IDEOGRAPH -0xEAF7 0xF9C9 #CJK COMPATIBILITY IDEOGRAPH -0xEAF8 0x6961 #CJK UNIFIED IDEOGRAPH -0xEAF9 0x6962 #CJK UNIFIED IDEOGRAPH -0xEAFA 0x6CB9 #CJK UNIFIED IDEOGRAPH -0xEAFB 0x6D27 #CJK UNIFIED IDEOGRAPH -0xEAFC 0xF9CA #CJK COMPATIBILITY IDEOGRAPH -0xEAFD 0x6E38 #CJK UNIFIED IDEOGRAPH -0xEAFE 0xF9CB #CJK COMPATIBILITY IDEOGRAPH -0xEBA1 0x6FE1 #CJK UNIFIED IDEOGRAPH -0xEBA2 0x7336 #CJK UNIFIED IDEOGRAPH -0xEBA3 0x7337 #CJK UNIFIED IDEOGRAPH -0xEBA4 0xF9CC #CJK COMPATIBILITY IDEOGRAPH -0xEBA5 0x745C #CJK UNIFIED IDEOGRAPH -0xEBA6 0x7531 #CJK UNIFIED IDEOGRAPH -0xEBA7 0xF9CD #CJK COMPATIBILITY IDEOGRAPH -0xEBA8 0x7652 #CJK UNIFIED IDEOGRAPH -0xEBA9 0xF9CE #CJK COMPATIBILITY IDEOGRAPH -0xEBAA 0xF9CF #CJK COMPATIBILITY IDEOGRAPH -0xEBAB 0x7DAD #CJK UNIFIED IDEOGRAPH -0xEBAC 0x81FE #CJK UNIFIED IDEOGRAPH -0xEBAD 0x8438 #CJK UNIFIED IDEOGRAPH -0xEBAE 0x88D5 #CJK UNIFIED IDEOGRAPH -0xEBAF 0x8A98 #CJK UNIFIED IDEOGRAPH -0xEBB0 0x8ADB #CJK UNIFIED IDEOGRAPH -0xEBB1 0x8AED #CJK UNIFIED IDEOGRAPH -0xEBB2 0x8E30 #CJK UNIFIED IDEOGRAPH -0xEBB3 0x8E42 #CJK UNIFIED IDEOGRAPH -0xEBB4 0x904A #CJK UNIFIED IDEOGRAPH -0xEBB5 0x903E #CJK UNIFIED IDEOGRAPH -0xEBB6 0x907A #CJK UNIFIED IDEOGRAPH -0xEBB7 0x9149 #CJK UNIFIED IDEOGRAPH -0xEBB8 0x91C9 #CJK UNIFIED IDEOGRAPH -0xEBB9 0x936E #CJK UNIFIED IDEOGRAPH -0xEBBA 0xF9D0 #CJK COMPATIBILITY IDEOGRAPH -0xEBBB 0xF9D1 #CJK COMPATIBILITY IDEOGRAPH -0xEBBC 0x5809 #CJK UNIFIED IDEOGRAPH -0xEBBD 0xF9D2 #CJK COMPATIBILITY IDEOGRAPH -0xEBBE 0x6BD3 #CJK UNIFIED IDEOGRAPH -0xEBBF 0x8089 #CJK UNIFIED IDEOGRAPH -0xEBC0 0x80B2 #CJK UNIFIED IDEOGRAPH -0xEBC1 0xF9D3 #CJK COMPATIBILITY IDEOGRAPH -0xEBC2 0xF9D4 #CJK COMPATIBILITY IDEOGRAPH -0xEBC3 0x5141 #CJK UNIFIED IDEOGRAPH -0xEBC4 0x596B #CJK UNIFIED IDEOGRAPH -0xEBC5 0x5C39 #CJK UNIFIED IDEOGRAPH -0xEBC6 0xF9D5 #CJK COMPATIBILITY IDEOGRAPH -0xEBC7 0xF9D6 #CJK COMPATIBILITY IDEOGRAPH -0xEBC8 0x6F64 #CJK UNIFIED IDEOGRAPH -0xEBC9 0x73A7 #CJK UNIFIED IDEOGRAPH -0xEBCA 0x80E4 #CJK UNIFIED IDEOGRAPH -0xEBCB 0x8D07 #CJK UNIFIED IDEOGRAPH -0xEBCC 0xF9D7 #CJK COMPATIBILITY IDEOGRAPH -0xEBCD 0x9217 #CJK UNIFIED IDEOGRAPH -0xEBCE 0x958F #CJK UNIFIED IDEOGRAPH -0xEBCF 0xF9D8 #CJK COMPATIBILITY IDEOGRAPH -0xEBD0 0xF9D9 #CJK COMPATIBILITY IDEOGRAPH -0xEBD1 0xF9DA #CJK COMPATIBILITY IDEOGRAPH -0xEBD2 0xF9DB #CJK COMPATIBILITY IDEOGRAPH -0xEBD3 0x807F #CJK UNIFIED IDEOGRAPH -0xEBD4 0x620E #CJK UNIFIED IDEOGRAPH -0xEBD5 0x701C #CJK UNIFIED IDEOGRAPH -0xEBD6 0x7D68 #CJK UNIFIED IDEOGRAPH -0xEBD7 0x878D #CJK UNIFIED IDEOGRAPH -0xEBD8 0xF9DC #CJK COMPATIBILITY IDEOGRAPH -0xEBD9 0x57A0 #CJK UNIFIED IDEOGRAPH -0xEBDA 0x6069 #CJK UNIFIED IDEOGRAPH -0xEBDB 0x6147 #CJK UNIFIED IDEOGRAPH -0xEBDC 0x6BB7 #CJK UNIFIED IDEOGRAPH -0xEBDD 0x8ABE #CJK UNIFIED IDEOGRAPH -0xEBDE 0x9280 #CJK UNIFIED IDEOGRAPH -0xEBDF 0x96B1 #CJK UNIFIED IDEOGRAPH -0xEBE0 0x4E59 #CJK UNIFIED IDEOGRAPH -0xEBE1 0x541F #CJK UNIFIED IDEOGRAPH -0xEBE2 0x6DEB #CJK UNIFIED IDEOGRAPH -0xEBE3 0x852D #CJK UNIFIED IDEOGRAPH -0xEBE4 0x9670 #CJK UNIFIED IDEOGRAPH -0xEBE5 0x97F3 #CJK UNIFIED IDEOGRAPH -0xEBE6 0x98EE #CJK UNIFIED IDEOGRAPH -0xEBE7 0x63D6 #CJK UNIFIED IDEOGRAPH -0xEBE8 0x6CE3 #CJK UNIFIED IDEOGRAPH -0xEBE9 0x9091 #CJK UNIFIED IDEOGRAPH -0xEBEA 0x51DD #CJK UNIFIED IDEOGRAPH -0xEBEB 0x61C9 #CJK UNIFIED IDEOGRAPH -0xEBEC 0x81BA #CJK UNIFIED IDEOGRAPH -0xEBED 0x9DF9 #CJK UNIFIED IDEOGRAPH -0xEBEE 0x4F9D #CJK UNIFIED IDEOGRAPH -0xEBEF 0x501A #CJK UNIFIED IDEOGRAPH -0xEBF0 0x5100 #CJK UNIFIED IDEOGRAPH -0xEBF1 0x5B9C #CJK UNIFIED IDEOGRAPH -0xEBF2 0x610F #CJK UNIFIED IDEOGRAPH -0xEBF3 0x61FF #CJK UNIFIED IDEOGRAPH -0xEBF4 0x64EC #CJK UNIFIED IDEOGRAPH -0xEBF5 0x6905 #CJK UNIFIED IDEOGRAPH -0xEBF6 0x6BC5 #CJK UNIFIED IDEOGRAPH -0xEBF7 0x7591 #CJK UNIFIED IDEOGRAPH -0xEBF8 0x77E3 #CJK UNIFIED IDEOGRAPH -0xEBF9 0x7FA9 #CJK UNIFIED IDEOGRAPH -0xEBFA 0x8264 #CJK UNIFIED IDEOGRAPH -0xEBFB 0x858F #CJK UNIFIED IDEOGRAPH -0xEBFC 0x87FB #CJK UNIFIED IDEOGRAPH -0xEBFD 0x8863 #CJK UNIFIED IDEOGRAPH -0xEBFE 0x8ABC #CJK UNIFIED IDEOGRAPH -0xECA1 0x8B70 #CJK UNIFIED IDEOGRAPH -0xECA2 0x91AB #CJK UNIFIED IDEOGRAPH -0xECA3 0x4E8C #CJK UNIFIED IDEOGRAPH -0xECA4 0x4EE5 #CJK UNIFIED IDEOGRAPH -0xECA5 0x4F0A #CJK UNIFIED IDEOGRAPH -0xECA6 0xF9DD #CJK COMPATIBILITY IDEOGRAPH -0xECA7 0xF9DE #CJK COMPATIBILITY IDEOGRAPH -0xECA8 0x5937 #CJK UNIFIED IDEOGRAPH -0xECA9 0x59E8 #CJK UNIFIED IDEOGRAPH -0xECAA 0xF9DF #CJK COMPATIBILITY IDEOGRAPH -0xECAB 0x5DF2 #CJK UNIFIED IDEOGRAPH -0xECAC 0x5F1B #CJK UNIFIED IDEOGRAPH -0xECAD 0x5F5B #CJK UNIFIED IDEOGRAPH -0xECAE 0x6021 #CJK UNIFIED IDEOGRAPH -0xECAF 0xF9E0 #CJK COMPATIBILITY IDEOGRAPH -0xECB0 0xF9E1 #CJK COMPATIBILITY IDEOGRAPH -0xECB1 0xF9E2 #CJK COMPATIBILITY IDEOGRAPH -0xECB2 0xF9E3 #CJK COMPATIBILITY IDEOGRAPH -0xECB3 0x723E #CJK UNIFIED IDEOGRAPH -0xECB4 0x73E5 #CJK UNIFIED IDEOGRAPH -0xECB5 0xF9E4 #CJK COMPATIBILITY IDEOGRAPH -0xECB6 0x7570 #CJK UNIFIED IDEOGRAPH -0xECB7 0x75CD #CJK UNIFIED IDEOGRAPH -0xECB8 0xF9E5 #CJK COMPATIBILITY IDEOGRAPH -0xECB9 0x79FB #CJK UNIFIED IDEOGRAPH -0xECBA 0xF9E6 #CJK COMPATIBILITY IDEOGRAPH -0xECBB 0x800C #CJK UNIFIED IDEOGRAPH -0xECBC 0x8033 #CJK UNIFIED IDEOGRAPH -0xECBD 0x8084 #CJK UNIFIED IDEOGRAPH -0xECBE 0x82E1 #CJK UNIFIED IDEOGRAPH -0xECBF 0x8351 #CJK UNIFIED IDEOGRAPH -0xECC0 0xF9E7 #CJK COMPATIBILITY IDEOGRAPH -0xECC1 0xF9E8 #CJK COMPATIBILITY IDEOGRAPH -0xECC2 0x8CBD #CJK UNIFIED IDEOGRAPH -0xECC3 0x8CB3 #CJK UNIFIED IDEOGRAPH -0xECC4 0x9087 #CJK UNIFIED IDEOGRAPH -0xECC5 0xF9E9 #CJK COMPATIBILITY IDEOGRAPH -0xECC6 0xF9EA #CJK COMPATIBILITY IDEOGRAPH -0xECC7 0x98F4 #CJK UNIFIED IDEOGRAPH -0xECC8 0x990C #CJK UNIFIED IDEOGRAPH -0xECC9 0xF9EB #CJK COMPATIBILITY IDEOGRAPH -0xECCA 0xF9EC #CJK COMPATIBILITY IDEOGRAPH -0xECCB 0x7037 #CJK UNIFIED IDEOGRAPH -0xECCC 0x76CA #CJK UNIFIED IDEOGRAPH -0xECCD 0x7FCA #CJK UNIFIED IDEOGRAPH -0xECCE 0x7FCC #CJK UNIFIED IDEOGRAPH -0xECCF 0x7FFC #CJK UNIFIED IDEOGRAPH -0xECD0 0x8B1A #CJK UNIFIED IDEOGRAPH -0xECD1 0x4EBA #CJK UNIFIED IDEOGRAPH -0xECD2 0x4EC1 #CJK UNIFIED IDEOGRAPH -0xECD3 0x5203 #CJK UNIFIED IDEOGRAPH -0xECD4 0x5370 #CJK UNIFIED IDEOGRAPH -0xECD5 0xF9ED #CJK COMPATIBILITY IDEOGRAPH -0xECD6 0x54BD #CJK UNIFIED IDEOGRAPH -0xECD7 0x56E0 #CJK UNIFIED IDEOGRAPH -0xECD8 0x59FB #CJK UNIFIED IDEOGRAPH -0xECD9 0x5BC5 #CJK UNIFIED IDEOGRAPH -0xECDA 0x5F15 #CJK UNIFIED IDEOGRAPH -0xECDB 0x5FCD #CJK UNIFIED IDEOGRAPH -0xECDC 0x6E6E #CJK UNIFIED IDEOGRAPH -0xECDD 0xF9EE #CJK COMPATIBILITY IDEOGRAPH -0xECDE 0xF9EF #CJK COMPATIBILITY IDEOGRAPH -0xECDF 0x7D6A #CJK UNIFIED IDEOGRAPH -0xECE0 0x8335 #CJK UNIFIED IDEOGRAPH -0xECE1 0xF9F0 #CJK COMPATIBILITY IDEOGRAPH -0xECE2 0x8693 #CJK UNIFIED IDEOGRAPH -0xECE3 0x8A8D #CJK UNIFIED IDEOGRAPH -0xECE4 0xF9F1 #CJK COMPATIBILITY IDEOGRAPH -0xECE5 0x976D #CJK UNIFIED IDEOGRAPH -0xECE6 0x9777 #CJK UNIFIED IDEOGRAPH -0xECE7 0xF9F2 #CJK COMPATIBILITY IDEOGRAPH -0xECE8 0xF9F3 #CJK COMPATIBILITY IDEOGRAPH -0xECE9 0x4E00 #CJK UNIFIED IDEOGRAPH -0xECEA 0x4F5A #CJK UNIFIED IDEOGRAPH -0xECEB 0x4F7E #CJK UNIFIED IDEOGRAPH -0xECEC 0x58F9 #CJK UNIFIED IDEOGRAPH -0xECED 0x65E5 #CJK UNIFIED IDEOGRAPH -0xECEE 0x6EA2 #CJK UNIFIED IDEOGRAPH -0xECEF 0x9038 #CJK UNIFIED IDEOGRAPH -0xECF0 0x93B0 #CJK UNIFIED IDEOGRAPH -0xECF1 0x99B9 #CJK UNIFIED IDEOGRAPH -0xECF2 0x4EFB #CJK UNIFIED IDEOGRAPH -0xECF3 0x58EC #CJK UNIFIED IDEOGRAPH -0xECF4 0x598A #CJK UNIFIED IDEOGRAPH -0xECF5 0x59D9 #CJK UNIFIED IDEOGRAPH -0xECF6 0x6041 #CJK UNIFIED IDEOGRAPH -0xECF7 0xF9F4 #CJK COMPATIBILITY IDEOGRAPH -0xECF8 0xF9F5 #CJK COMPATIBILITY IDEOGRAPH -0xECF9 0x7A14 #CJK UNIFIED IDEOGRAPH -0xECFA 0xF9F6 #CJK COMPATIBILITY IDEOGRAPH -0xECFB 0x834F #CJK UNIFIED IDEOGRAPH -0xECFC 0x8CC3 #CJK UNIFIED IDEOGRAPH -0xECFD 0x5165 #CJK UNIFIED IDEOGRAPH -0xECFE 0x5344 #CJK UNIFIED IDEOGRAPH -0xEDA1 0xF9F7 #CJK COMPATIBILITY IDEOGRAPH -0xEDA2 0xF9F8 #CJK COMPATIBILITY IDEOGRAPH -0xEDA3 0xF9F9 #CJK COMPATIBILITY IDEOGRAPH -0xEDA4 0x4ECD #CJK UNIFIED IDEOGRAPH -0xEDA5 0x5269 #CJK UNIFIED IDEOGRAPH -0xEDA6 0x5B55 #CJK UNIFIED IDEOGRAPH -0xEDA7 0x82BF #CJK UNIFIED IDEOGRAPH -0xEDA8 0x4ED4 #CJK UNIFIED IDEOGRAPH -0xEDA9 0x523A #CJK UNIFIED IDEOGRAPH -0xEDAA 0x54A8 #CJK UNIFIED IDEOGRAPH -0xEDAB 0x59C9 #CJK UNIFIED IDEOGRAPH -0xEDAC 0x59FF #CJK UNIFIED IDEOGRAPH -0xEDAD 0x5B50 #CJK UNIFIED IDEOGRAPH -0xEDAE 0x5B57 #CJK UNIFIED IDEOGRAPH -0xEDAF 0x5B5C #CJK UNIFIED IDEOGRAPH -0xEDB0 0x6063 #CJK UNIFIED IDEOGRAPH -0xEDB1 0x6148 #CJK UNIFIED IDEOGRAPH -0xEDB2 0x6ECB #CJK UNIFIED IDEOGRAPH -0xEDB3 0x7099 #CJK UNIFIED IDEOGRAPH -0xEDB4 0x716E #CJK UNIFIED IDEOGRAPH -0xEDB5 0x7386 #CJK UNIFIED IDEOGRAPH -0xEDB6 0x74F7 #CJK UNIFIED IDEOGRAPH -0xEDB7 0x75B5 #CJK UNIFIED IDEOGRAPH -0xEDB8 0x78C1 #CJK UNIFIED IDEOGRAPH -0xEDB9 0x7D2B #CJK UNIFIED IDEOGRAPH -0xEDBA 0x8005 #CJK UNIFIED IDEOGRAPH -0xEDBB 0x81EA #CJK UNIFIED IDEOGRAPH -0xEDBC 0x8328 #CJK UNIFIED IDEOGRAPH -0xEDBD 0x8517 #CJK UNIFIED IDEOGRAPH -0xEDBE 0x85C9 #CJK UNIFIED IDEOGRAPH -0xEDBF 0x8AEE #CJK UNIFIED IDEOGRAPH -0xEDC0 0x8CC7 #CJK UNIFIED IDEOGRAPH -0xEDC1 0x96CC #CJK UNIFIED IDEOGRAPH -0xEDC2 0x4F5C #CJK UNIFIED IDEOGRAPH -0xEDC3 0x52FA #CJK UNIFIED IDEOGRAPH -0xEDC4 0x56BC #CJK UNIFIED IDEOGRAPH -0xEDC5 0x65AB #CJK UNIFIED IDEOGRAPH -0xEDC6 0x6628 #CJK UNIFIED IDEOGRAPH -0xEDC7 0x707C #CJK UNIFIED IDEOGRAPH -0xEDC8 0x70B8 #CJK UNIFIED IDEOGRAPH -0xEDC9 0x7235 #CJK UNIFIED IDEOGRAPH -0xEDCA 0x7DBD #CJK UNIFIED IDEOGRAPH -0xEDCB 0x828D #CJK UNIFIED IDEOGRAPH -0xEDCC 0x914C #CJK UNIFIED IDEOGRAPH -0xEDCD 0x96C0 #CJK UNIFIED IDEOGRAPH -0xEDCE 0x9D72 #CJK UNIFIED IDEOGRAPH -0xEDCF 0x5B71 #CJK UNIFIED IDEOGRAPH -0xEDD0 0x68E7 #CJK UNIFIED IDEOGRAPH -0xEDD1 0x6B98 #CJK UNIFIED IDEOGRAPH -0xEDD2 0x6F7A #CJK UNIFIED IDEOGRAPH -0xEDD3 0x76DE #CJK UNIFIED IDEOGRAPH -0xEDD4 0x5C91 #CJK UNIFIED IDEOGRAPH -0xEDD5 0x66AB #CJK UNIFIED IDEOGRAPH -0xEDD6 0x6F5B #CJK UNIFIED IDEOGRAPH -0xEDD7 0x7BB4 #CJK UNIFIED IDEOGRAPH -0xEDD8 0x7C2A #CJK UNIFIED IDEOGRAPH -0xEDD9 0x8836 #CJK UNIFIED IDEOGRAPH -0xEDDA 0x96DC #CJK UNIFIED IDEOGRAPH -0xEDDB 0x4E08 #CJK UNIFIED IDEOGRAPH -0xEDDC 0x4ED7 #CJK UNIFIED IDEOGRAPH -0xEDDD 0x5320 #CJK UNIFIED IDEOGRAPH -0xEDDE 0x5834 #CJK UNIFIED IDEOGRAPH -0xEDDF 0x58BB #CJK UNIFIED IDEOGRAPH -0xEDE0 0x58EF #CJK UNIFIED IDEOGRAPH -0xEDE1 0x596C #CJK UNIFIED IDEOGRAPH -0xEDE2 0x5C07 #CJK UNIFIED IDEOGRAPH -0xEDE3 0x5E33 #CJK UNIFIED IDEOGRAPH -0xEDE4 0x5E84 #CJK UNIFIED IDEOGRAPH -0xEDE5 0x5F35 #CJK UNIFIED IDEOGRAPH -0xEDE6 0x638C #CJK UNIFIED IDEOGRAPH -0xEDE7 0x66B2 #CJK UNIFIED IDEOGRAPH -0xEDE8 0x6756 #CJK UNIFIED IDEOGRAPH -0xEDE9 0x6A1F #CJK UNIFIED IDEOGRAPH -0xEDEA 0x6AA3 #CJK UNIFIED IDEOGRAPH -0xEDEB 0x6B0C #CJK UNIFIED IDEOGRAPH -0xEDEC 0x6F3F #CJK UNIFIED IDEOGRAPH -0xEDED 0x7246 #CJK UNIFIED IDEOGRAPH -0xEDEE 0xF9FA #CJK COMPATIBILITY IDEOGRAPH -0xEDEF 0x7350 #CJK UNIFIED IDEOGRAPH -0xEDF0 0x748B #CJK UNIFIED IDEOGRAPH -0xEDF1 0x7AE0 #CJK UNIFIED IDEOGRAPH -0xEDF2 0x7CA7 #CJK UNIFIED IDEOGRAPH -0xEDF3 0x8178 #CJK UNIFIED IDEOGRAPH -0xEDF4 0x81DF #CJK UNIFIED IDEOGRAPH -0xEDF5 0x81E7 #CJK UNIFIED IDEOGRAPH -0xEDF6 0x838A #CJK UNIFIED IDEOGRAPH -0xEDF7 0x846C #CJK UNIFIED IDEOGRAPH -0xEDF8 0x8523 #CJK UNIFIED IDEOGRAPH -0xEDF9 0x8594 #CJK UNIFIED IDEOGRAPH -0xEDFA 0x85CF #CJK UNIFIED IDEOGRAPH -0xEDFB 0x88DD #CJK UNIFIED IDEOGRAPH -0xEDFC 0x8D13 #CJK UNIFIED IDEOGRAPH -0xEDFD 0x91AC #CJK UNIFIED IDEOGRAPH -0xEDFE 0x9577 #CJK UNIFIED IDEOGRAPH -0xEEA1 0x969C #CJK UNIFIED IDEOGRAPH -0xEEA2 0x518D #CJK UNIFIED IDEOGRAPH -0xEEA3 0x54C9 #CJK UNIFIED IDEOGRAPH -0xEEA4 0x5728 #CJK UNIFIED IDEOGRAPH -0xEEA5 0x5BB0 #CJK UNIFIED IDEOGRAPH -0xEEA6 0x624D #CJK UNIFIED IDEOGRAPH -0xEEA7 0x6750 #CJK UNIFIED IDEOGRAPH -0xEEA8 0x683D #CJK UNIFIED IDEOGRAPH -0xEEA9 0x6893 #CJK UNIFIED IDEOGRAPH -0xEEAA 0x6E3D #CJK UNIFIED IDEOGRAPH -0xEEAB 0x6ED3 #CJK UNIFIED IDEOGRAPH -0xEEAC 0x707D #CJK UNIFIED IDEOGRAPH -0xEEAD 0x7E21 #CJK UNIFIED IDEOGRAPH -0xEEAE 0x88C1 #CJK UNIFIED IDEOGRAPH -0xEEAF 0x8CA1 #CJK UNIFIED IDEOGRAPH -0xEEB0 0x8F09 #CJK UNIFIED IDEOGRAPH -0xEEB1 0x9F4B #CJK UNIFIED IDEOGRAPH -0xEEB2 0x9F4E #CJK UNIFIED IDEOGRAPH -0xEEB3 0x722D #CJK UNIFIED IDEOGRAPH -0xEEB4 0x7B8F #CJK UNIFIED IDEOGRAPH -0xEEB5 0x8ACD #CJK UNIFIED IDEOGRAPH -0xEEB6 0x931A #CJK UNIFIED IDEOGRAPH -0xEEB7 0x4F47 #CJK UNIFIED IDEOGRAPH -0xEEB8 0x4F4E #CJK UNIFIED IDEOGRAPH -0xEEB9 0x5132 #CJK UNIFIED IDEOGRAPH -0xEEBA 0x5480 #CJK UNIFIED IDEOGRAPH -0xEEBB 0x59D0 #CJK UNIFIED IDEOGRAPH -0xEEBC 0x5E95 #CJK UNIFIED IDEOGRAPH -0xEEBD 0x62B5 #CJK UNIFIED IDEOGRAPH -0xEEBE 0x6775 #CJK UNIFIED IDEOGRAPH -0xEEBF 0x696E #CJK UNIFIED IDEOGRAPH -0xEEC0 0x6A17 #CJK UNIFIED IDEOGRAPH -0xEEC1 0x6CAE #CJK UNIFIED IDEOGRAPH -0xEEC2 0x6E1A #CJK UNIFIED IDEOGRAPH -0xEEC3 0x72D9 #CJK UNIFIED IDEOGRAPH -0xEEC4 0x732A #CJK UNIFIED IDEOGRAPH -0xEEC5 0x75BD #CJK UNIFIED IDEOGRAPH -0xEEC6 0x7BB8 #CJK UNIFIED IDEOGRAPH -0xEEC7 0x7D35 #CJK UNIFIED IDEOGRAPH -0xEEC8 0x82E7 #CJK UNIFIED IDEOGRAPH -0xEEC9 0x83F9 #CJK UNIFIED IDEOGRAPH -0xEECA 0x8457 #CJK UNIFIED IDEOGRAPH -0xEECB 0x85F7 #CJK UNIFIED IDEOGRAPH -0xEECC 0x8A5B #CJK UNIFIED IDEOGRAPH -0xEECD 0x8CAF #CJK UNIFIED IDEOGRAPH -0xEECE 0x8E87 #CJK UNIFIED IDEOGRAPH -0xEECF 0x9019 #CJK UNIFIED IDEOGRAPH -0xEED0 0x90B8 #CJK UNIFIED IDEOGRAPH -0xEED1 0x96CE #CJK UNIFIED IDEOGRAPH -0xEED2 0x9F5F #CJK UNIFIED IDEOGRAPH -0xEED3 0x52E3 #CJK UNIFIED IDEOGRAPH -0xEED4 0x540A #CJK UNIFIED IDEOGRAPH -0xEED5 0x5AE1 #CJK UNIFIED IDEOGRAPH -0xEED6 0x5BC2 #CJK UNIFIED IDEOGRAPH -0xEED7 0x6458 #CJK UNIFIED IDEOGRAPH -0xEED8 0x6575 #CJK UNIFIED IDEOGRAPH -0xEED9 0x6EF4 #CJK UNIFIED IDEOGRAPH -0xEEDA 0x72C4 #CJK UNIFIED IDEOGRAPH -0xEEDB 0xF9FB #CJK COMPATIBILITY IDEOGRAPH -0xEEDC 0x7684 #CJK UNIFIED IDEOGRAPH -0xEEDD 0x7A4D #CJK UNIFIED IDEOGRAPH -0xEEDE 0x7B1B #CJK UNIFIED IDEOGRAPH -0xEEDF 0x7C4D #CJK UNIFIED IDEOGRAPH -0xEEE0 0x7E3E #CJK UNIFIED IDEOGRAPH -0xEEE1 0x7FDF #CJK UNIFIED IDEOGRAPH -0xEEE2 0x837B #CJK UNIFIED IDEOGRAPH -0xEEE3 0x8B2B #CJK UNIFIED IDEOGRAPH -0xEEE4 0x8CCA #CJK UNIFIED IDEOGRAPH -0xEEE5 0x8D64 #CJK UNIFIED IDEOGRAPH -0xEEE6 0x8DE1 #CJK UNIFIED IDEOGRAPH -0xEEE7 0x8E5F #CJK UNIFIED IDEOGRAPH -0xEEE8 0x8FEA #CJK UNIFIED IDEOGRAPH -0xEEE9 0x8FF9 #CJK UNIFIED IDEOGRAPH -0xEEEA 0x9069 #CJK UNIFIED IDEOGRAPH -0xEEEB 0x93D1 #CJK UNIFIED IDEOGRAPH -0xEEEC 0x4F43 #CJK UNIFIED IDEOGRAPH -0xEEED 0x4F7A #CJK UNIFIED IDEOGRAPH -0xEEEE 0x50B3 #CJK UNIFIED IDEOGRAPH -0xEEEF 0x5168 #CJK UNIFIED IDEOGRAPH -0xEEF0 0x5178 #CJK UNIFIED IDEOGRAPH -0xEEF1 0x524D #CJK UNIFIED IDEOGRAPH -0xEEF2 0x526A #CJK UNIFIED IDEOGRAPH -0xEEF3 0x5861 #CJK UNIFIED IDEOGRAPH -0xEEF4 0x587C #CJK UNIFIED IDEOGRAPH -0xEEF5 0x5960 #CJK UNIFIED IDEOGRAPH -0xEEF6 0x5C08 #CJK UNIFIED IDEOGRAPH -0xEEF7 0x5C55 #CJK UNIFIED IDEOGRAPH -0xEEF8 0x5EDB #CJK UNIFIED IDEOGRAPH -0xEEF9 0x609B #CJK UNIFIED IDEOGRAPH -0xEEFA 0x6230 #CJK UNIFIED IDEOGRAPH -0xEEFB 0x6813 #CJK UNIFIED IDEOGRAPH -0xEEFC 0x6BBF #CJK UNIFIED IDEOGRAPH -0xEEFD 0x6C08 #CJK UNIFIED IDEOGRAPH -0xEEFE 0x6FB1 #CJK UNIFIED IDEOGRAPH -0xEFA1 0x714E #CJK UNIFIED IDEOGRAPH -0xEFA2 0x7420 #CJK UNIFIED IDEOGRAPH -0xEFA3 0x7530 #CJK UNIFIED IDEOGRAPH -0xEFA4 0x7538 #CJK UNIFIED IDEOGRAPH -0xEFA5 0x7551 #CJK UNIFIED IDEOGRAPH -0xEFA6 0x7672 #CJK UNIFIED IDEOGRAPH -0xEFA7 0x7B4C #CJK UNIFIED IDEOGRAPH -0xEFA8 0x7B8B #CJK UNIFIED IDEOGRAPH -0xEFA9 0x7BAD #CJK UNIFIED IDEOGRAPH -0xEFAA 0x7BC6 #CJK UNIFIED IDEOGRAPH -0xEFAB 0x7E8F #CJK UNIFIED IDEOGRAPH -0xEFAC 0x8A6E #CJK UNIFIED IDEOGRAPH -0xEFAD 0x8F3E #CJK UNIFIED IDEOGRAPH -0xEFAE 0x8F49 #CJK UNIFIED IDEOGRAPH -0xEFAF 0x923F #CJK UNIFIED IDEOGRAPH -0xEFB0 0x9293 #CJK UNIFIED IDEOGRAPH -0xEFB1 0x9322 #CJK UNIFIED IDEOGRAPH -0xEFB2 0x942B #CJK UNIFIED IDEOGRAPH -0xEFB3 0x96FB #CJK UNIFIED IDEOGRAPH -0xEFB4 0x985A #CJK UNIFIED IDEOGRAPH -0xEFB5 0x986B #CJK UNIFIED IDEOGRAPH -0xEFB6 0x991E #CJK UNIFIED IDEOGRAPH -0xEFB7 0x5207 #CJK UNIFIED IDEOGRAPH -0xEFB8 0x622A #CJK UNIFIED IDEOGRAPH -0xEFB9 0x6298 #CJK UNIFIED IDEOGRAPH -0xEFBA 0x6D59 #CJK UNIFIED IDEOGRAPH -0xEFBB 0x7664 #CJK UNIFIED IDEOGRAPH -0xEFBC 0x7ACA #CJK UNIFIED IDEOGRAPH -0xEFBD 0x7BC0 #CJK UNIFIED IDEOGRAPH -0xEFBE 0x7D76 #CJK UNIFIED IDEOGRAPH -0xEFBF 0x5360 #CJK UNIFIED IDEOGRAPH -0xEFC0 0x5CBE #CJK UNIFIED IDEOGRAPH -0xEFC1 0x5E97 #CJK UNIFIED IDEOGRAPH -0xEFC2 0x6F38 #CJK UNIFIED IDEOGRAPH -0xEFC3 0x70B9 #CJK UNIFIED IDEOGRAPH -0xEFC4 0x7C98 #CJK UNIFIED IDEOGRAPH -0xEFC5 0x9711 #CJK UNIFIED IDEOGRAPH -0xEFC6 0x9B8E #CJK UNIFIED IDEOGRAPH -0xEFC7 0x9EDE #CJK UNIFIED IDEOGRAPH -0xEFC8 0x63A5 #CJK UNIFIED IDEOGRAPH -0xEFC9 0x647A #CJK UNIFIED IDEOGRAPH -0xEFCA 0x8776 #CJK UNIFIED IDEOGRAPH -0xEFCB 0x4E01 #CJK UNIFIED IDEOGRAPH -0xEFCC 0x4E95 #CJK UNIFIED IDEOGRAPH -0xEFCD 0x4EAD #CJK UNIFIED IDEOGRAPH -0xEFCE 0x505C #CJK UNIFIED IDEOGRAPH -0xEFCF 0x5075 #CJK UNIFIED IDEOGRAPH -0xEFD0 0x5448 #CJK UNIFIED IDEOGRAPH -0xEFD1 0x59C3 #CJK UNIFIED IDEOGRAPH -0xEFD2 0x5B9A #CJK UNIFIED IDEOGRAPH -0xEFD3 0x5E40 #CJK UNIFIED IDEOGRAPH -0xEFD4 0x5EAD #CJK UNIFIED IDEOGRAPH -0xEFD5 0x5EF7 #CJK UNIFIED IDEOGRAPH -0xEFD6 0x5F81 #CJK UNIFIED IDEOGRAPH -0xEFD7 0x60C5 #CJK UNIFIED IDEOGRAPH -0xEFD8 0x633A #CJK UNIFIED IDEOGRAPH -0xEFD9 0x653F #CJK UNIFIED IDEOGRAPH -0xEFDA 0x6574 #CJK UNIFIED IDEOGRAPH -0xEFDB 0x65CC #CJK UNIFIED IDEOGRAPH -0xEFDC 0x6676 #CJK UNIFIED IDEOGRAPH -0xEFDD 0x6678 #CJK UNIFIED IDEOGRAPH -0xEFDE 0x67FE #CJK UNIFIED IDEOGRAPH -0xEFDF 0x6968 #CJK UNIFIED IDEOGRAPH -0xEFE0 0x6A89 #CJK UNIFIED IDEOGRAPH -0xEFE1 0x6B63 #CJK UNIFIED IDEOGRAPH -0xEFE2 0x6C40 #CJK UNIFIED IDEOGRAPH -0xEFE3 0x6DC0 #CJK UNIFIED IDEOGRAPH -0xEFE4 0x6DE8 #CJK UNIFIED IDEOGRAPH -0xEFE5 0x6E1F #CJK UNIFIED IDEOGRAPH -0xEFE6 0x6E5E #CJK UNIFIED IDEOGRAPH -0xEFE7 0x701E #CJK UNIFIED IDEOGRAPH -0xEFE8 0x70A1 #CJK UNIFIED IDEOGRAPH -0xEFE9 0x738E #CJK UNIFIED IDEOGRAPH -0xEFEA 0x73FD #CJK UNIFIED IDEOGRAPH -0xEFEB 0x753A #CJK UNIFIED IDEOGRAPH -0xEFEC 0x775B #CJK UNIFIED IDEOGRAPH -0xEFED 0x7887 #CJK UNIFIED IDEOGRAPH -0xEFEE 0x798E #CJK UNIFIED IDEOGRAPH -0xEFEF 0x7A0B #CJK UNIFIED IDEOGRAPH -0xEFF0 0x7A7D #CJK UNIFIED IDEOGRAPH -0xEFF1 0x7CBE #CJK UNIFIED IDEOGRAPH -0xEFF2 0x7D8E #CJK UNIFIED IDEOGRAPH -0xEFF3 0x8247 #CJK UNIFIED IDEOGRAPH -0xEFF4 0x8A02 #CJK UNIFIED IDEOGRAPH -0xEFF5 0x8AEA #CJK UNIFIED IDEOGRAPH -0xEFF6 0x8C9E #CJK UNIFIED IDEOGRAPH -0xEFF7 0x912D #CJK UNIFIED IDEOGRAPH -0xEFF8 0x914A #CJK UNIFIED IDEOGRAPH -0xEFF9 0x91D8 #CJK UNIFIED IDEOGRAPH -0xEFFA 0x9266 #CJK UNIFIED IDEOGRAPH -0xEFFB 0x92CC #CJK UNIFIED IDEOGRAPH -0xEFFC 0x9320 #CJK UNIFIED IDEOGRAPH -0xEFFD 0x9706 #CJK UNIFIED IDEOGRAPH -0xEFFE 0x9756 #CJK UNIFIED IDEOGRAPH -0xF0A1 0x975C #CJK UNIFIED IDEOGRAPH -0xF0A2 0x9802 #CJK UNIFIED IDEOGRAPH -0xF0A3 0x9F0E #CJK UNIFIED IDEOGRAPH -0xF0A4 0x5236 #CJK UNIFIED IDEOGRAPH -0xF0A5 0x5291 #CJK UNIFIED IDEOGRAPH -0xF0A6 0x557C #CJK UNIFIED IDEOGRAPH -0xF0A7 0x5824 #CJK UNIFIED IDEOGRAPH -0xF0A8 0x5E1D #CJK UNIFIED IDEOGRAPH -0xF0A9 0x5F1F #CJK UNIFIED IDEOGRAPH -0xF0AA 0x608C #CJK UNIFIED IDEOGRAPH -0xF0AB 0x63D0 #CJK UNIFIED IDEOGRAPH -0xF0AC 0x68AF #CJK UNIFIED IDEOGRAPH -0xF0AD 0x6FDF #CJK UNIFIED IDEOGRAPH -0xF0AE 0x796D #CJK UNIFIED IDEOGRAPH -0xF0AF 0x7B2C #CJK UNIFIED IDEOGRAPH -0xF0B0 0x81CD #CJK UNIFIED IDEOGRAPH -0xF0B1 0x85BA #CJK UNIFIED IDEOGRAPH -0xF0B2 0x88FD #CJK UNIFIED IDEOGRAPH -0xF0B3 0x8AF8 #CJK UNIFIED IDEOGRAPH -0xF0B4 0x8E44 #CJK UNIFIED IDEOGRAPH -0xF0B5 0x918D #CJK UNIFIED IDEOGRAPH -0xF0B6 0x9664 #CJK UNIFIED IDEOGRAPH -0xF0B7 0x969B #CJK UNIFIED IDEOGRAPH -0xF0B8 0x973D #CJK UNIFIED IDEOGRAPH -0xF0B9 0x984C #CJK UNIFIED IDEOGRAPH -0xF0BA 0x9F4A #CJK UNIFIED IDEOGRAPH -0xF0BB 0x4FCE #CJK UNIFIED IDEOGRAPH -0xF0BC 0x5146 #CJK UNIFIED IDEOGRAPH -0xF0BD 0x51CB #CJK UNIFIED IDEOGRAPH -0xF0BE 0x52A9 #CJK UNIFIED IDEOGRAPH -0xF0BF 0x5632 #CJK UNIFIED IDEOGRAPH -0xF0C0 0x5F14 #CJK UNIFIED IDEOGRAPH -0xF0C1 0x5F6B #CJK UNIFIED IDEOGRAPH -0xF0C2 0x63AA #CJK UNIFIED IDEOGRAPH -0xF0C3 0x64CD #CJK UNIFIED IDEOGRAPH -0xF0C4 0x65E9 #CJK UNIFIED IDEOGRAPH -0xF0C5 0x6641 #CJK UNIFIED IDEOGRAPH -0xF0C6 0x66FA #CJK UNIFIED IDEOGRAPH -0xF0C7 0x66F9 #CJK UNIFIED IDEOGRAPH -0xF0C8 0x671D #CJK UNIFIED IDEOGRAPH -0xF0C9 0x689D #CJK UNIFIED IDEOGRAPH -0xF0CA 0x68D7 #CJK UNIFIED IDEOGRAPH -0xF0CB 0x69FD #CJK UNIFIED IDEOGRAPH -0xF0CC 0x6F15 #CJK UNIFIED IDEOGRAPH -0xF0CD 0x6F6E #CJK UNIFIED IDEOGRAPH -0xF0CE 0x7167 #CJK UNIFIED IDEOGRAPH -0xF0CF 0x71E5 #CJK UNIFIED IDEOGRAPH -0xF0D0 0x722A #CJK UNIFIED IDEOGRAPH -0xF0D1 0x74AA #CJK UNIFIED IDEOGRAPH -0xF0D2 0x773A #CJK UNIFIED IDEOGRAPH -0xF0D3 0x7956 #CJK UNIFIED IDEOGRAPH -0xF0D4 0x795A #CJK UNIFIED IDEOGRAPH -0xF0D5 0x79DF #CJK UNIFIED IDEOGRAPH -0xF0D6 0x7A20 #CJK UNIFIED IDEOGRAPH -0xF0D7 0x7A95 #CJK UNIFIED IDEOGRAPH -0xF0D8 0x7C97 #CJK UNIFIED IDEOGRAPH -0xF0D9 0x7CDF #CJK UNIFIED IDEOGRAPH -0xF0DA 0x7D44 #CJK UNIFIED IDEOGRAPH -0xF0DB 0x7E70 #CJK UNIFIED IDEOGRAPH -0xF0DC 0x8087 #CJK UNIFIED IDEOGRAPH -0xF0DD 0x85FB #CJK UNIFIED IDEOGRAPH -0xF0DE 0x86A4 #CJK UNIFIED IDEOGRAPH -0xF0DF 0x8A54 #CJK UNIFIED IDEOGRAPH -0xF0E0 0x8ABF #CJK UNIFIED IDEOGRAPH -0xF0E1 0x8D99 #CJK UNIFIED IDEOGRAPH -0xF0E2 0x8E81 #CJK UNIFIED IDEOGRAPH -0xF0E3 0x9020 #CJK UNIFIED IDEOGRAPH -0xF0E4 0x906D #CJK UNIFIED IDEOGRAPH -0xF0E5 0x91E3 #CJK UNIFIED IDEOGRAPH -0xF0E6 0x963B #CJK UNIFIED IDEOGRAPH -0xF0E7 0x96D5 #CJK UNIFIED IDEOGRAPH -0xF0E8 0x9CE5 #CJK UNIFIED IDEOGRAPH -0xF0E9 0x65CF #CJK UNIFIED IDEOGRAPH -0xF0EA 0x7C07 #CJK UNIFIED IDEOGRAPH -0xF0EB 0x8DB3 #CJK UNIFIED IDEOGRAPH -0xF0EC 0x93C3 #CJK UNIFIED IDEOGRAPH -0xF0ED 0x5B58 #CJK UNIFIED IDEOGRAPH -0xF0EE 0x5C0A #CJK UNIFIED IDEOGRAPH -0xF0EF 0x5352 #CJK UNIFIED IDEOGRAPH -0xF0F0 0x62D9 #CJK UNIFIED IDEOGRAPH -0xF0F1 0x731D #CJK UNIFIED IDEOGRAPH -0xF0F2 0x5027 #CJK UNIFIED IDEOGRAPH -0xF0F3 0x5B97 #CJK UNIFIED IDEOGRAPH -0xF0F4 0x5F9E #CJK UNIFIED IDEOGRAPH -0xF0F5 0x60B0 #CJK UNIFIED IDEOGRAPH -0xF0F6 0x616B #CJK UNIFIED IDEOGRAPH -0xF0F7 0x68D5 #CJK UNIFIED IDEOGRAPH -0xF0F8 0x6DD9 #CJK UNIFIED IDEOGRAPH -0xF0F9 0x742E #CJK UNIFIED IDEOGRAPH -0xF0FA 0x7A2E #CJK UNIFIED IDEOGRAPH -0xF0FB 0x7D42 #CJK UNIFIED IDEOGRAPH -0xF0FC 0x7D9C #CJK UNIFIED IDEOGRAPH -0xF0FD 0x7E31 #CJK UNIFIED IDEOGRAPH -0xF0FE 0x816B #CJK UNIFIED IDEOGRAPH -0xF1A1 0x8E2A #CJK UNIFIED IDEOGRAPH -0xF1A2 0x8E35 #CJK UNIFIED IDEOGRAPH -0xF1A3 0x937E #CJK UNIFIED IDEOGRAPH -0xF1A4 0x9418 #CJK UNIFIED IDEOGRAPH -0xF1A5 0x4F50 #CJK UNIFIED IDEOGRAPH -0xF1A6 0x5750 #CJK UNIFIED IDEOGRAPH -0xF1A7 0x5DE6 #CJK UNIFIED IDEOGRAPH -0xF1A8 0x5EA7 #CJK UNIFIED IDEOGRAPH -0xF1A9 0x632B #CJK UNIFIED IDEOGRAPH -0xF1AA 0x7F6A #CJK UNIFIED IDEOGRAPH -0xF1AB 0x4E3B #CJK UNIFIED IDEOGRAPH -0xF1AC 0x4F4F #CJK UNIFIED IDEOGRAPH -0xF1AD 0x4F8F #CJK UNIFIED IDEOGRAPH -0xF1AE 0x505A #CJK UNIFIED IDEOGRAPH -0xF1AF 0x59DD #CJK UNIFIED IDEOGRAPH -0xF1B0 0x80C4 #CJK UNIFIED IDEOGRAPH -0xF1B1 0x546A #CJK UNIFIED IDEOGRAPH -0xF1B2 0x5468 #CJK UNIFIED IDEOGRAPH -0xF1B3 0x55FE #CJK UNIFIED IDEOGRAPH -0xF1B4 0x594F #CJK UNIFIED IDEOGRAPH -0xF1B5 0x5B99 #CJK UNIFIED IDEOGRAPH -0xF1B6 0x5DDE #CJK UNIFIED IDEOGRAPH -0xF1B7 0x5EDA #CJK UNIFIED IDEOGRAPH -0xF1B8 0x665D #CJK UNIFIED IDEOGRAPH -0xF1B9 0x6731 #CJK UNIFIED IDEOGRAPH -0xF1BA 0x67F1 #CJK UNIFIED IDEOGRAPH -0xF1BB 0x682A #CJK UNIFIED IDEOGRAPH -0xF1BC 0x6CE8 #CJK UNIFIED IDEOGRAPH -0xF1BD 0x6D32 #CJK UNIFIED IDEOGRAPH -0xF1BE 0x6E4A #CJK UNIFIED IDEOGRAPH -0xF1BF 0x6F8D #CJK UNIFIED IDEOGRAPH -0xF1C0 0x70B7 #CJK UNIFIED IDEOGRAPH -0xF1C1 0x73E0 #CJK UNIFIED IDEOGRAPH -0xF1C2 0x7587 #CJK UNIFIED IDEOGRAPH -0xF1C3 0x7C4C #CJK UNIFIED IDEOGRAPH -0xF1C4 0x7D02 #CJK UNIFIED IDEOGRAPH -0xF1C5 0x7D2C #CJK UNIFIED IDEOGRAPH -0xF1C6 0x7DA2 #CJK UNIFIED IDEOGRAPH -0xF1C7 0x821F #CJK UNIFIED IDEOGRAPH -0xF1C8 0x86DB #CJK UNIFIED IDEOGRAPH -0xF1C9 0x8A3B #CJK UNIFIED IDEOGRAPH -0xF1CA 0x8A85 #CJK UNIFIED IDEOGRAPH -0xF1CB 0x8D70 #CJK UNIFIED IDEOGRAPH -0xF1CC 0x8E8A #CJK UNIFIED IDEOGRAPH -0xF1CD 0x8F33 #CJK UNIFIED IDEOGRAPH -0xF1CE 0x9031 #CJK UNIFIED IDEOGRAPH -0xF1CF 0x914E #CJK UNIFIED IDEOGRAPH -0xF1D0 0x9152 #CJK UNIFIED IDEOGRAPH -0xF1D1 0x9444 #CJK UNIFIED IDEOGRAPH -0xF1D2 0x99D0 #CJK UNIFIED IDEOGRAPH -0xF1D3 0x7AF9 #CJK UNIFIED IDEOGRAPH -0xF1D4 0x7CA5 #CJK UNIFIED IDEOGRAPH -0xF1D5 0x4FCA #CJK UNIFIED IDEOGRAPH -0xF1D6 0x5101 #CJK UNIFIED IDEOGRAPH -0xF1D7 0x51C6 #CJK UNIFIED IDEOGRAPH -0xF1D8 0x57C8 #CJK UNIFIED IDEOGRAPH -0xF1D9 0x5BEF #CJK UNIFIED IDEOGRAPH -0xF1DA 0x5CFB #CJK UNIFIED IDEOGRAPH -0xF1DB 0x6659 #CJK UNIFIED IDEOGRAPH -0xF1DC 0x6A3D #CJK UNIFIED IDEOGRAPH -0xF1DD 0x6D5A #CJK UNIFIED IDEOGRAPH -0xF1DE 0x6E96 #CJK UNIFIED IDEOGRAPH -0xF1DF 0x6FEC #CJK UNIFIED IDEOGRAPH -0xF1E0 0x710C #CJK UNIFIED IDEOGRAPH -0xF1E1 0x756F #CJK UNIFIED IDEOGRAPH -0xF1E2 0x7AE3 #CJK UNIFIED IDEOGRAPH -0xF1E3 0x8822 #CJK UNIFIED IDEOGRAPH -0xF1E4 0x9021 #CJK UNIFIED IDEOGRAPH -0xF1E5 0x9075 #CJK UNIFIED IDEOGRAPH -0xF1E6 0x96CB #CJK UNIFIED IDEOGRAPH -0xF1E7 0x99FF #CJK UNIFIED IDEOGRAPH -0xF1E8 0x8301 #CJK UNIFIED IDEOGRAPH -0xF1E9 0x4E2D #CJK UNIFIED IDEOGRAPH -0xF1EA 0x4EF2 #CJK UNIFIED IDEOGRAPH -0xF1EB 0x8846 #CJK UNIFIED IDEOGRAPH -0xF1EC 0x91CD #CJK UNIFIED IDEOGRAPH -0xF1ED 0x537D #CJK UNIFIED IDEOGRAPH -0xF1EE 0x6ADB #CJK UNIFIED IDEOGRAPH -0xF1EF 0x696B #CJK UNIFIED IDEOGRAPH -0xF1F0 0x6C41 #CJK UNIFIED IDEOGRAPH -0xF1F1 0x847A #CJK UNIFIED IDEOGRAPH -0xF1F2 0x589E #CJK UNIFIED IDEOGRAPH -0xF1F3 0x618E #CJK UNIFIED IDEOGRAPH -0xF1F4 0x66FE #CJK UNIFIED IDEOGRAPH -0xF1F5 0x62EF #CJK UNIFIED IDEOGRAPH -0xF1F6 0x70DD #CJK UNIFIED IDEOGRAPH -0xF1F7 0x7511 #CJK UNIFIED IDEOGRAPH -0xF1F8 0x75C7 #CJK UNIFIED IDEOGRAPH -0xF1F9 0x7E52 #CJK UNIFIED IDEOGRAPH -0xF1FA 0x84B8 #CJK UNIFIED IDEOGRAPH -0xF1FB 0x8B49 #CJK UNIFIED IDEOGRAPH -0xF1FC 0x8D08 #CJK UNIFIED IDEOGRAPH -0xF1FD 0x4E4B #CJK UNIFIED IDEOGRAPH -0xF1FE 0x53EA #CJK UNIFIED IDEOGRAPH -0xF2A1 0x54AB #CJK UNIFIED IDEOGRAPH -0xF2A2 0x5730 #CJK UNIFIED IDEOGRAPH -0xF2A3 0x5740 #CJK UNIFIED IDEOGRAPH -0xF2A4 0x5FD7 #CJK UNIFIED IDEOGRAPH -0xF2A5 0x6301 #CJK UNIFIED IDEOGRAPH -0xF2A6 0x6307 #CJK UNIFIED IDEOGRAPH -0xF2A7 0x646F #CJK UNIFIED IDEOGRAPH -0xF2A8 0x652F #CJK UNIFIED IDEOGRAPH -0xF2A9 0x65E8 #CJK UNIFIED IDEOGRAPH -0xF2AA 0x667A #CJK UNIFIED IDEOGRAPH -0xF2AB 0x679D #CJK UNIFIED IDEOGRAPH -0xF2AC 0x67B3 #CJK UNIFIED IDEOGRAPH -0xF2AD 0x6B62 #CJK UNIFIED IDEOGRAPH -0xF2AE 0x6C60 #CJK UNIFIED IDEOGRAPH -0xF2AF 0x6C9A #CJK UNIFIED IDEOGRAPH -0xF2B0 0x6F2C #CJK UNIFIED IDEOGRAPH -0xF2B1 0x77E5 #CJK UNIFIED IDEOGRAPH -0xF2B2 0x7825 #CJK UNIFIED IDEOGRAPH -0xF2B3 0x7949 #CJK UNIFIED IDEOGRAPH -0xF2B4 0x7957 #CJK UNIFIED IDEOGRAPH -0xF2B5 0x7D19 #CJK UNIFIED IDEOGRAPH -0xF2B6 0x80A2 #CJK UNIFIED IDEOGRAPH -0xF2B7 0x8102 #CJK UNIFIED IDEOGRAPH -0xF2B8 0x81F3 #CJK UNIFIED IDEOGRAPH -0xF2B9 0x829D #CJK UNIFIED IDEOGRAPH -0xF2BA 0x82B7 #CJK UNIFIED IDEOGRAPH -0xF2BB 0x8718 #CJK UNIFIED IDEOGRAPH -0xF2BC 0x8A8C #CJK UNIFIED IDEOGRAPH -0xF2BD 0xF9FC #CJK COMPATIBILITY IDEOGRAPH -0xF2BE 0x8D04 #CJK UNIFIED IDEOGRAPH -0xF2BF 0x8DBE #CJK UNIFIED IDEOGRAPH -0xF2C0 0x9072 #CJK UNIFIED IDEOGRAPH -0xF2C1 0x76F4 #CJK UNIFIED IDEOGRAPH -0xF2C2 0x7A19 #CJK UNIFIED IDEOGRAPH -0xF2C3 0x7A37 #CJK UNIFIED IDEOGRAPH -0xF2C4 0x7E54 #CJK UNIFIED IDEOGRAPH -0xF2C5 0x8077 #CJK UNIFIED IDEOGRAPH -0xF2C6 0x5507 #CJK UNIFIED IDEOGRAPH -0xF2C7 0x55D4 #CJK UNIFIED IDEOGRAPH -0xF2C8 0x5875 #CJK UNIFIED IDEOGRAPH -0xF2C9 0x632F #CJK UNIFIED IDEOGRAPH -0xF2CA 0x6422 #CJK UNIFIED IDEOGRAPH -0xF2CB 0x6649 #CJK UNIFIED IDEOGRAPH -0xF2CC 0x664B #CJK UNIFIED IDEOGRAPH -0xF2CD 0x686D #CJK UNIFIED IDEOGRAPH -0xF2CE 0x699B #CJK UNIFIED IDEOGRAPH -0xF2CF 0x6B84 #CJK UNIFIED IDEOGRAPH -0xF2D0 0x6D25 #CJK UNIFIED IDEOGRAPH -0xF2D1 0x6EB1 #CJK UNIFIED IDEOGRAPH -0xF2D2 0x73CD #CJK UNIFIED IDEOGRAPH -0xF2D3 0x7468 #CJK UNIFIED IDEOGRAPH -0xF2D4 0x74A1 #CJK UNIFIED IDEOGRAPH -0xF2D5 0x755B #CJK UNIFIED IDEOGRAPH -0xF2D6 0x75B9 #CJK UNIFIED IDEOGRAPH -0xF2D7 0x76E1 #CJK UNIFIED IDEOGRAPH -0xF2D8 0x771E #CJK UNIFIED IDEOGRAPH -0xF2D9 0x778B #CJK UNIFIED IDEOGRAPH -0xF2DA 0x79E6 #CJK UNIFIED IDEOGRAPH -0xF2DB 0x7E09 #CJK UNIFIED IDEOGRAPH -0xF2DC 0x7E1D #CJK UNIFIED IDEOGRAPH -0xF2DD 0x81FB #CJK UNIFIED IDEOGRAPH -0xF2DE 0x852F #CJK UNIFIED IDEOGRAPH -0xF2DF 0x8897 #CJK UNIFIED IDEOGRAPH -0xF2E0 0x8A3A #CJK UNIFIED IDEOGRAPH -0xF2E1 0x8CD1 #CJK UNIFIED IDEOGRAPH -0xF2E2 0x8EEB #CJK UNIFIED IDEOGRAPH -0xF2E3 0x8FB0 #CJK UNIFIED IDEOGRAPH -0xF2E4 0x9032 #CJK UNIFIED IDEOGRAPH -0xF2E5 0x93AD #CJK UNIFIED IDEOGRAPH -0xF2E6 0x9663 #CJK UNIFIED IDEOGRAPH -0xF2E7 0x9673 #CJK UNIFIED IDEOGRAPH -0xF2E8 0x9707 #CJK UNIFIED IDEOGRAPH -0xF2E9 0x4F84 #CJK UNIFIED IDEOGRAPH -0xF2EA 0x53F1 #CJK UNIFIED IDEOGRAPH -0xF2EB 0x59EA #CJK UNIFIED IDEOGRAPH -0xF2EC 0x5AC9 #CJK UNIFIED IDEOGRAPH -0xF2ED 0x5E19 #CJK UNIFIED IDEOGRAPH -0xF2EE 0x684E #CJK UNIFIED IDEOGRAPH -0xF2EF 0x74C6 #CJK UNIFIED IDEOGRAPH -0xF2F0 0x75BE #CJK UNIFIED IDEOGRAPH -0xF2F1 0x79E9 #CJK UNIFIED IDEOGRAPH -0xF2F2 0x7A92 #CJK UNIFIED IDEOGRAPH -0xF2F3 0x81A3 #CJK UNIFIED IDEOGRAPH -0xF2F4 0x86ED #CJK UNIFIED IDEOGRAPH -0xF2F5 0x8CEA #CJK UNIFIED IDEOGRAPH -0xF2F6 0x8DCC #CJK UNIFIED IDEOGRAPH -0xF2F7 0x8FED #CJK UNIFIED IDEOGRAPH -0xF2F8 0x659F #CJK UNIFIED IDEOGRAPH -0xF2F9 0x6715 #CJK UNIFIED IDEOGRAPH -0xF2FA 0xF9FD #CJK COMPATIBILITY IDEOGRAPH -0xF2FB 0x57F7 #CJK UNIFIED IDEOGRAPH -0xF2FC 0x6F57 #CJK UNIFIED IDEOGRAPH -0xF2FD 0x7DDD #CJK UNIFIED IDEOGRAPH -0xF2FE 0x8F2F #CJK UNIFIED IDEOGRAPH -0xF3A1 0x93F6 #CJK UNIFIED IDEOGRAPH -0xF3A2 0x96C6 #CJK UNIFIED IDEOGRAPH -0xF3A3 0x5FB5 #CJK UNIFIED IDEOGRAPH -0xF3A4 0x61F2 #CJK UNIFIED IDEOGRAPH -0xF3A5 0x6F84 #CJK UNIFIED IDEOGRAPH -0xF3A6 0x4E14 #CJK UNIFIED IDEOGRAPH -0xF3A7 0x4F98 #CJK UNIFIED IDEOGRAPH -0xF3A8 0x501F #CJK UNIFIED IDEOGRAPH -0xF3A9 0x53C9 #CJK UNIFIED IDEOGRAPH -0xF3AA 0x55DF #CJK UNIFIED IDEOGRAPH -0xF3AB 0x5D6F #CJK UNIFIED IDEOGRAPH -0xF3AC 0x5DEE #CJK UNIFIED IDEOGRAPH -0xF3AD 0x6B21 #CJK UNIFIED IDEOGRAPH -0xF3AE 0x6B64 #CJK UNIFIED IDEOGRAPH -0xF3AF 0x78CB #CJK UNIFIED IDEOGRAPH -0xF3B0 0x7B9A #CJK UNIFIED IDEOGRAPH -0xF3B1 0xF9FE #CJK COMPATIBILITY IDEOGRAPH -0xF3B2 0x8E49 #CJK UNIFIED IDEOGRAPH -0xF3B3 0x8ECA #CJK UNIFIED IDEOGRAPH -0xF3B4 0x906E #CJK UNIFIED IDEOGRAPH -0xF3B5 0x6349 #CJK UNIFIED IDEOGRAPH -0xF3B6 0x643E #CJK UNIFIED IDEOGRAPH -0xF3B7 0x7740 #CJK UNIFIED IDEOGRAPH -0xF3B8 0x7A84 #CJK UNIFIED IDEOGRAPH -0xF3B9 0x932F #CJK UNIFIED IDEOGRAPH -0xF3BA 0x947F #CJK UNIFIED IDEOGRAPH -0xF3BB 0x9F6A #CJK UNIFIED IDEOGRAPH -0xF3BC 0x64B0 #CJK UNIFIED IDEOGRAPH -0xF3BD 0x6FAF #CJK UNIFIED IDEOGRAPH -0xF3BE 0x71E6 #CJK UNIFIED IDEOGRAPH -0xF3BF 0x74A8 #CJK UNIFIED IDEOGRAPH -0xF3C0 0x74DA #CJK UNIFIED IDEOGRAPH -0xF3C1 0x7AC4 #CJK UNIFIED IDEOGRAPH -0xF3C2 0x7C12 #CJK UNIFIED IDEOGRAPH -0xF3C3 0x7E82 #CJK UNIFIED IDEOGRAPH -0xF3C4 0x7CB2 #CJK UNIFIED IDEOGRAPH -0xF3C5 0x7E98 #CJK UNIFIED IDEOGRAPH -0xF3C6 0x8B9A #CJK UNIFIED IDEOGRAPH -0xF3C7 0x8D0A #CJK UNIFIED IDEOGRAPH -0xF3C8 0x947D #CJK UNIFIED IDEOGRAPH -0xF3C9 0x9910 #CJK UNIFIED IDEOGRAPH -0xF3CA 0x994C #CJK UNIFIED IDEOGRAPH -0xF3CB 0x5239 #CJK UNIFIED IDEOGRAPH -0xF3CC 0x5BDF #CJK UNIFIED IDEOGRAPH -0xF3CD 0x64E6 #CJK UNIFIED IDEOGRAPH -0xF3CE 0x672D #CJK UNIFIED IDEOGRAPH -0xF3CF 0x7D2E #CJK UNIFIED IDEOGRAPH -0xF3D0 0x50ED #CJK UNIFIED IDEOGRAPH -0xF3D1 0x53C3 #CJK UNIFIED IDEOGRAPH -0xF3D2 0x5879 #CJK UNIFIED IDEOGRAPH -0xF3D3 0x6158 #CJK UNIFIED IDEOGRAPH -0xF3D4 0x6159 #CJK UNIFIED IDEOGRAPH -0xF3D5 0x61FA #CJK UNIFIED IDEOGRAPH -0xF3D6 0x65AC #CJK UNIFIED IDEOGRAPH -0xF3D7 0x7AD9 #CJK UNIFIED IDEOGRAPH -0xF3D8 0x8B92 #CJK UNIFIED IDEOGRAPH -0xF3D9 0x8B96 #CJK UNIFIED IDEOGRAPH -0xF3DA 0x5009 #CJK UNIFIED IDEOGRAPH -0xF3DB 0x5021 #CJK UNIFIED IDEOGRAPH -0xF3DC 0x5275 #CJK UNIFIED IDEOGRAPH -0xF3DD 0x5531 #CJK UNIFIED IDEOGRAPH -0xF3DE 0x5A3C #CJK UNIFIED IDEOGRAPH -0xF3DF 0x5EE0 #CJK UNIFIED IDEOGRAPH -0xF3E0 0x5F70 #CJK UNIFIED IDEOGRAPH -0xF3E1 0x6134 #CJK UNIFIED IDEOGRAPH -0xF3E2 0x655E #CJK UNIFIED IDEOGRAPH -0xF3E3 0x660C #CJK UNIFIED IDEOGRAPH -0xF3E4 0x6636 #CJK UNIFIED IDEOGRAPH -0xF3E5 0x66A2 #CJK UNIFIED IDEOGRAPH -0xF3E6 0x69CD #CJK UNIFIED IDEOGRAPH -0xF3E7 0x6EC4 #CJK UNIFIED IDEOGRAPH -0xF3E8 0x6F32 #CJK UNIFIED IDEOGRAPH -0xF3E9 0x7316 #CJK UNIFIED IDEOGRAPH -0xF3EA 0x7621 #CJK UNIFIED IDEOGRAPH -0xF3EB 0x7A93 #CJK UNIFIED IDEOGRAPH -0xF3EC 0x8139 #CJK UNIFIED IDEOGRAPH -0xF3ED 0x8259 #CJK UNIFIED IDEOGRAPH -0xF3EE 0x83D6 #CJK UNIFIED IDEOGRAPH -0xF3EF 0x84BC #CJK UNIFIED IDEOGRAPH -0xF3F0 0x50B5 #CJK UNIFIED IDEOGRAPH -0xF3F1 0x57F0 #CJK UNIFIED IDEOGRAPH -0xF3F2 0x5BC0 #CJK UNIFIED IDEOGRAPH -0xF3F3 0x5BE8 #CJK UNIFIED IDEOGRAPH -0xF3F4 0x5F69 #CJK UNIFIED IDEOGRAPH -0xF3F5 0x63A1 #CJK UNIFIED IDEOGRAPH -0xF3F6 0x7826 #CJK UNIFIED IDEOGRAPH -0xF3F7 0x7DB5 #CJK UNIFIED IDEOGRAPH -0xF3F8 0x83DC #CJK UNIFIED IDEOGRAPH -0xF3F9 0x8521 #CJK UNIFIED IDEOGRAPH -0xF3FA 0x91C7 #CJK UNIFIED IDEOGRAPH -0xF3FB 0x91F5 #CJK UNIFIED IDEOGRAPH -0xF3FC 0x518A #CJK UNIFIED IDEOGRAPH -0xF3FD 0x67F5 #CJK UNIFIED IDEOGRAPH -0xF3FE 0x7B56 #CJK UNIFIED IDEOGRAPH -0xF4A1 0x8CAC #CJK UNIFIED IDEOGRAPH -0xF4A2 0x51C4 #CJK UNIFIED IDEOGRAPH -0xF4A3 0x59BB #CJK UNIFIED IDEOGRAPH -0xF4A4 0x60BD #CJK UNIFIED IDEOGRAPH -0xF4A5 0x8655 #CJK UNIFIED IDEOGRAPH -0xF4A6 0x501C #CJK UNIFIED IDEOGRAPH -0xF4A7 0xF9FF #CJK COMPATIBILITY IDEOGRAPH -0xF4A8 0x5254 #CJK UNIFIED IDEOGRAPH -0xF4A9 0x5C3A #CJK UNIFIED IDEOGRAPH -0xF4AA 0x617D #CJK UNIFIED IDEOGRAPH -0xF4AB 0x621A #CJK UNIFIED IDEOGRAPH -0xF4AC 0x62D3 #CJK UNIFIED IDEOGRAPH -0xF4AD 0x64F2 #CJK UNIFIED IDEOGRAPH -0xF4AE 0x65A5 #CJK UNIFIED IDEOGRAPH -0xF4AF 0x6ECC #CJK UNIFIED IDEOGRAPH -0xF4B0 0x7620 #CJK UNIFIED IDEOGRAPH -0xF4B1 0x810A #CJK UNIFIED IDEOGRAPH -0xF4B2 0x8E60 #CJK UNIFIED IDEOGRAPH -0xF4B3 0x965F #CJK UNIFIED IDEOGRAPH -0xF4B4 0x96BB #CJK UNIFIED IDEOGRAPH -0xF4B5 0x4EDF #CJK UNIFIED IDEOGRAPH -0xF4B6 0x5343 #CJK UNIFIED IDEOGRAPH -0xF4B7 0x5598 #CJK UNIFIED IDEOGRAPH -0xF4B8 0x5929 #CJK UNIFIED IDEOGRAPH -0xF4B9 0x5DDD #CJK UNIFIED IDEOGRAPH -0xF4BA 0x64C5 #CJK UNIFIED IDEOGRAPH -0xF4BB 0x6CC9 #CJK UNIFIED IDEOGRAPH -0xF4BC 0x6DFA #CJK UNIFIED IDEOGRAPH -0xF4BD 0x7394 #CJK UNIFIED IDEOGRAPH -0xF4BE 0x7A7F #CJK UNIFIED IDEOGRAPH -0xF4BF 0x821B #CJK UNIFIED IDEOGRAPH -0xF4C0 0x85A6 #CJK UNIFIED IDEOGRAPH -0xF4C1 0x8CE4 #CJK UNIFIED IDEOGRAPH -0xF4C2 0x8E10 #CJK UNIFIED IDEOGRAPH -0xF4C3 0x9077 #CJK UNIFIED IDEOGRAPH -0xF4C4 0x91E7 #CJK UNIFIED IDEOGRAPH -0xF4C5 0x95E1 #CJK UNIFIED IDEOGRAPH -0xF4C6 0x9621 #CJK UNIFIED IDEOGRAPH -0xF4C7 0x97C6 #CJK UNIFIED IDEOGRAPH -0xF4C8 0x51F8 #CJK UNIFIED IDEOGRAPH -0xF4C9 0x54F2 #CJK UNIFIED IDEOGRAPH -0xF4CA 0x5586 #CJK UNIFIED IDEOGRAPH -0xF4CB 0x5FB9 #CJK UNIFIED IDEOGRAPH -0xF4CC 0x64A4 #CJK UNIFIED IDEOGRAPH -0xF4CD 0x6F88 #CJK UNIFIED IDEOGRAPH -0xF4CE 0x7DB4 #CJK UNIFIED IDEOGRAPH -0xF4CF 0x8F1F #CJK UNIFIED IDEOGRAPH -0xF4D0 0x8F4D #CJK UNIFIED IDEOGRAPH -0xF4D1 0x9435 #CJK UNIFIED IDEOGRAPH -0xF4D2 0x50C9 #CJK UNIFIED IDEOGRAPH -0xF4D3 0x5C16 #CJK UNIFIED IDEOGRAPH -0xF4D4 0x6CBE #CJK UNIFIED IDEOGRAPH -0xF4D5 0x6DFB #CJK UNIFIED IDEOGRAPH -0xF4D6 0x751B #CJK UNIFIED IDEOGRAPH -0xF4D7 0x77BB #CJK UNIFIED IDEOGRAPH -0xF4D8 0x7C3D #CJK UNIFIED IDEOGRAPH -0xF4D9 0x7C64 #CJK UNIFIED IDEOGRAPH -0xF4DA 0x8A79 #CJK UNIFIED IDEOGRAPH -0xF4DB 0x8AC2 #CJK UNIFIED IDEOGRAPH -0xF4DC 0x581E #CJK UNIFIED IDEOGRAPH -0xF4DD 0x59BE #CJK UNIFIED IDEOGRAPH -0xF4DE 0x5E16 #CJK UNIFIED IDEOGRAPH -0xF4DF 0x6377 #CJK UNIFIED IDEOGRAPH -0xF4E0 0x7252 #CJK UNIFIED IDEOGRAPH -0xF4E1 0x758A #CJK UNIFIED IDEOGRAPH -0xF4E2 0x776B #CJK UNIFIED IDEOGRAPH -0xF4E3 0x8ADC #CJK UNIFIED IDEOGRAPH -0xF4E4 0x8CBC #CJK UNIFIED IDEOGRAPH -0xF4E5 0x8F12 #CJK UNIFIED IDEOGRAPH -0xF4E6 0x5EF3 #CJK UNIFIED IDEOGRAPH -0xF4E7 0x6674 #CJK UNIFIED IDEOGRAPH -0xF4E8 0x6DF8 #CJK UNIFIED IDEOGRAPH -0xF4E9 0x807D #CJK UNIFIED IDEOGRAPH -0xF4EA 0x83C1 #CJK UNIFIED IDEOGRAPH -0xF4EB 0x8ACB #CJK UNIFIED IDEOGRAPH -0xF4EC 0x9751 #CJK UNIFIED IDEOGRAPH -0xF4ED 0x9BD6 #CJK UNIFIED IDEOGRAPH -0xF4EE 0xFA00 #CJK COMPATIBILITY IDEOGRAPH -0xF4EF 0x5243 #CJK UNIFIED IDEOGRAPH -0xF4F0 0x66FF #CJK UNIFIED IDEOGRAPH -0xF4F1 0x6D95 #CJK UNIFIED IDEOGRAPH -0xF4F2 0x6EEF #CJK UNIFIED IDEOGRAPH -0xF4F3 0x7DE0 #CJK UNIFIED IDEOGRAPH -0xF4F4 0x8AE6 #CJK UNIFIED IDEOGRAPH -0xF4F5 0x902E #CJK UNIFIED IDEOGRAPH -0xF4F6 0x905E #CJK UNIFIED IDEOGRAPH -0xF4F7 0x9AD4 #CJK UNIFIED IDEOGRAPH -0xF4F8 0x521D #CJK UNIFIED IDEOGRAPH -0xF4F9 0x527F #CJK UNIFIED IDEOGRAPH -0xF4FA 0x54E8 #CJK UNIFIED IDEOGRAPH -0xF4FB 0x6194 #CJK UNIFIED IDEOGRAPH -0xF4FC 0x6284 #CJK UNIFIED IDEOGRAPH -0xF4FD 0x62DB #CJK UNIFIED IDEOGRAPH -0xF4FE 0x68A2 #CJK UNIFIED IDEOGRAPH -0xF5A1 0x6912 #CJK UNIFIED IDEOGRAPH -0xF5A2 0x695A #CJK UNIFIED IDEOGRAPH -0xF5A3 0x6A35 #CJK UNIFIED IDEOGRAPH -0xF5A4 0x7092 #CJK UNIFIED IDEOGRAPH -0xF5A5 0x7126 #CJK UNIFIED IDEOGRAPH -0xF5A6 0x785D #CJK UNIFIED IDEOGRAPH -0xF5A7 0x7901 #CJK UNIFIED IDEOGRAPH -0xF5A8 0x790E #CJK UNIFIED IDEOGRAPH -0xF5A9 0x79D2 #CJK UNIFIED IDEOGRAPH -0xF5AA 0x7A0D #CJK UNIFIED IDEOGRAPH -0xF5AB 0x8096 #CJK UNIFIED IDEOGRAPH -0xF5AC 0x8278 #CJK UNIFIED IDEOGRAPH -0xF5AD 0x82D5 #CJK UNIFIED IDEOGRAPH -0xF5AE 0x8349 #CJK UNIFIED IDEOGRAPH -0xF5AF 0x8549 #CJK UNIFIED IDEOGRAPH -0xF5B0 0x8C82 #CJK UNIFIED IDEOGRAPH -0xF5B1 0x8D85 #CJK UNIFIED IDEOGRAPH -0xF5B2 0x9162 #CJK UNIFIED IDEOGRAPH -0xF5B3 0x918B #CJK UNIFIED IDEOGRAPH -0xF5B4 0x91AE #CJK UNIFIED IDEOGRAPH -0xF5B5 0x4FC3 #CJK UNIFIED IDEOGRAPH -0xF5B6 0x56D1 #CJK UNIFIED IDEOGRAPH -0xF5B7 0x71ED #CJK UNIFIED IDEOGRAPH -0xF5B8 0x77D7 #CJK UNIFIED IDEOGRAPH -0xF5B9 0x8700 #CJK UNIFIED IDEOGRAPH -0xF5BA 0x89F8 #CJK UNIFIED IDEOGRAPH -0xF5BB 0x5BF8 #CJK UNIFIED IDEOGRAPH -0xF5BC 0x5FD6 #CJK UNIFIED IDEOGRAPH -0xF5BD 0x6751 #CJK UNIFIED IDEOGRAPH -0xF5BE 0x90A8 #CJK UNIFIED IDEOGRAPH -0xF5BF 0x53E2 #CJK UNIFIED IDEOGRAPH -0xF5C0 0x585A #CJK UNIFIED IDEOGRAPH -0xF5C1 0x5BF5 #CJK UNIFIED IDEOGRAPH -0xF5C2 0x60A4 #CJK UNIFIED IDEOGRAPH -0xF5C3 0x6181 #CJK UNIFIED IDEOGRAPH -0xF5C4 0x6460 #CJK UNIFIED IDEOGRAPH -0xF5C5 0x7E3D #CJK UNIFIED IDEOGRAPH -0xF5C6 0x8070 #CJK UNIFIED IDEOGRAPH -0xF5C7 0x8525 #CJK UNIFIED IDEOGRAPH -0xF5C8 0x9283 #CJK UNIFIED IDEOGRAPH -0xF5C9 0x64AE #CJK UNIFIED IDEOGRAPH -0xF5CA 0x50AC #CJK UNIFIED IDEOGRAPH -0xF5CB 0x5D14 #CJK UNIFIED IDEOGRAPH -0xF5CC 0x6700 #CJK UNIFIED IDEOGRAPH -0xF5CD 0x589C #CJK UNIFIED IDEOGRAPH -0xF5CE 0x62BD #CJK UNIFIED IDEOGRAPH -0xF5CF 0x63A8 #CJK UNIFIED IDEOGRAPH -0xF5D0 0x690E #CJK UNIFIED IDEOGRAPH -0xF5D1 0x6978 #CJK UNIFIED IDEOGRAPH -0xF5D2 0x6A1E #CJK UNIFIED IDEOGRAPH -0xF5D3 0x6E6B #CJK UNIFIED IDEOGRAPH -0xF5D4 0x76BA #CJK UNIFIED IDEOGRAPH -0xF5D5 0x79CB #CJK UNIFIED IDEOGRAPH -0xF5D6 0x82BB #CJK UNIFIED IDEOGRAPH -0xF5D7 0x8429 #CJK UNIFIED IDEOGRAPH -0xF5D8 0x8ACF #CJK UNIFIED IDEOGRAPH -0xF5D9 0x8DA8 #CJK UNIFIED IDEOGRAPH -0xF5DA 0x8FFD #CJK UNIFIED IDEOGRAPH -0xF5DB 0x9112 #CJK UNIFIED IDEOGRAPH -0xF5DC 0x914B #CJK UNIFIED IDEOGRAPH -0xF5DD 0x919C #CJK UNIFIED IDEOGRAPH -0xF5DE 0x9310 #CJK UNIFIED IDEOGRAPH -0xF5DF 0x9318 #CJK UNIFIED IDEOGRAPH -0xF5E0 0x939A #CJK UNIFIED IDEOGRAPH -0xF5E1 0x96DB #CJK UNIFIED IDEOGRAPH -0xF5E2 0x9A36 #CJK UNIFIED IDEOGRAPH -0xF5E3 0x9C0D #CJK UNIFIED IDEOGRAPH -0xF5E4 0x4E11 #CJK UNIFIED IDEOGRAPH -0xF5E5 0x755C #CJK UNIFIED IDEOGRAPH -0xF5E6 0x795D #CJK UNIFIED IDEOGRAPH -0xF5E7 0x7AFA #CJK UNIFIED IDEOGRAPH -0xF5E8 0x7B51 #CJK UNIFIED IDEOGRAPH -0xF5E9 0x7BC9 #CJK UNIFIED IDEOGRAPH -0xF5EA 0x7E2E #CJK UNIFIED IDEOGRAPH -0xF5EB 0x84C4 #CJK UNIFIED IDEOGRAPH -0xF5EC 0x8E59 #CJK UNIFIED IDEOGRAPH -0xF5ED 0x8E74 #CJK UNIFIED IDEOGRAPH -0xF5EE 0x8EF8 #CJK UNIFIED IDEOGRAPH -0xF5EF 0x9010 #CJK UNIFIED IDEOGRAPH -0xF5F0 0x6625 #CJK UNIFIED IDEOGRAPH -0xF5F1 0x693F #CJK UNIFIED IDEOGRAPH -0xF5F2 0x7443 #CJK UNIFIED IDEOGRAPH -0xF5F3 0x51FA #CJK UNIFIED IDEOGRAPH -0xF5F4 0x672E #CJK UNIFIED IDEOGRAPH -0xF5F5 0x9EDC #CJK UNIFIED IDEOGRAPH -0xF5F6 0x5145 #CJK UNIFIED IDEOGRAPH -0xF5F7 0x5FE0 #CJK UNIFIED IDEOGRAPH -0xF5F8 0x6C96 #CJK UNIFIED IDEOGRAPH -0xF5F9 0x87F2 #CJK UNIFIED IDEOGRAPH -0xF5FA 0x885D #CJK UNIFIED IDEOGRAPH -0xF5FB 0x8877 #CJK UNIFIED IDEOGRAPH -0xF5FC 0x60B4 #CJK UNIFIED IDEOGRAPH -0xF5FD 0x81B5 #CJK UNIFIED IDEOGRAPH -0xF5FE 0x8403 #CJK UNIFIED IDEOGRAPH -0xF6A1 0x8D05 #CJK UNIFIED IDEOGRAPH -0xF6A2 0x53D6 #CJK UNIFIED IDEOGRAPH -0xF6A3 0x5439 #CJK UNIFIED IDEOGRAPH -0xF6A4 0x5634 #CJK UNIFIED IDEOGRAPH -0xF6A5 0x5A36 #CJK UNIFIED IDEOGRAPH -0xF6A6 0x5C31 #CJK UNIFIED IDEOGRAPH -0xF6A7 0x708A #CJK UNIFIED IDEOGRAPH -0xF6A8 0x7FE0 #CJK UNIFIED IDEOGRAPH -0xF6A9 0x805A #CJK UNIFIED IDEOGRAPH -0xF6AA 0x8106 #CJK UNIFIED IDEOGRAPH -0xF6AB 0x81ED #CJK UNIFIED IDEOGRAPH -0xF6AC 0x8DA3 #CJK UNIFIED IDEOGRAPH -0xF6AD 0x9189 #CJK UNIFIED IDEOGRAPH -0xF6AE 0x9A5F #CJK UNIFIED IDEOGRAPH -0xF6AF 0x9DF2 #CJK UNIFIED IDEOGRAPH -0xF6B0 0x5074 #CJK UNIFIED IDEOGRAPH -0xF6B1 0x4EC4 #CJK UNIFIED IDEOGRAPH -0xF6B2 0x53A0 #CJK UNIFIED IDEOGRAPH -0xF6B3 0x60FB #CJK UNIFIED IDEOGRAPH -0xF6B4 0x6E2C #CJK UNIFIED IDEOGRAPH -0xF6B5 0x5C64 #CJK UNIFIED IDEOGRAPH -0xF6B6 0x4F88 #CJK UNIFIED IDEOGRAPH -0xF6B7 0x5024 #CJK UNIFIED IDEOGRAPH -0xF6B8 0x55E4 #CJK UNIFIED IDEOGRAPH -0xF6B9 0x5CD9 #CJK UNIFIED IDEOGRAPH -0xF6BA 0x5E5F #CJK UNIFIED IDEOGRAPH -0xF6BB 0x6065 #CJK UNIFIED IDEOGRAPH -0xF6BC 0x6894 #CJK UNIFIED IDEOGRAPH -0xF6BD 0x6CBB #CJK UNIFIED IDEOGRAPH -0xF6BE 0x6DC4 #CJK UNIFIED IDEOGRAPH -0xF6BF 0x71BE #CJK UNIFIED IDEOGRAPH -0xF6C0 0x75D4 #CJK UNIFIED IDEOGRAPH -0xF6C1 0x75F4 #CJK UNIFIED IDEOGRAPH -0xF6C2 0x7661 #CJK UNIFIED IDEOGRAPH -0xF6C3 0x7A1A #CJK UNIFIED IDEOGRAPH -0xF6C4 0x7A49 #CJK UNIFIED IDEOGRAPH -0xF6C5 0x7DC7 #CJK UNIFIED IDEOGRAPH -0xF6C6 0x7DFB #CJK UNIFIED IDEOGRAPH -0xF6C7 0x7F6E #CJK UNIFIED IDEOGRAPH -0xF6C8 0x81F4 #CJK UNIFIED IDEOGRAPH -0xF6C9 0x86A9 #CJK UNIFIED IDEOGRAPH -0xF6CA 0x8F1C #CJK UNIFIED IDEOGRAPH -0xF6CB 0x96C9 #CJK UNIFIED IDEOGRAPH -0xF6CC 0x99B3 #CJK UNIFIED IDEOGRAPH -0xF6CD 0x9F52 #CJK UNIFIED IDEOGRAPH -0xF6CE 0x5247 #CJK UNIFIED IDEOGRAPH -0xF6CF 0x52C5 #CJK UNIFIED IDEOGRAPH -0xF6D0 0x98ED #CJK UNIFIED IDEOGRAPH -0xF6D1 0x89AA #CJK UNIFIED IDEOGRAPH -0xF6D2 0x4E03 #CJK UNIFIED IDEOGRAPH -0xF6D3 0x67D2 #CJK UNIFIED IDEOGRAPH -0xF6D4 0x6F06 #CJK UNIFIED IDEOGRAPH -0xF6D5 0x4FB5 #CJK UNIFIED IDEOGRAPH -0xF6D6 0x5BE2 #CJK UNIFIED IDEOGRAPH -0xF6D7 0x6795 #CJK UNIFIED IDEOGRAPH -0xF6D8 0x6C88 #CJK UNIFIED IDEOGRAPH -0xF6D9 0x6D78 #CJK UNIFIED IDEOGRAPH -0xF6DA 0x741B #CJK UNIFIED IDEOGRAPH -0xF6DB 0x7827 #CJK UNIFIED IDEOGRAPH -0xF6DC 0x91DD #CJK UNIFIED IDEOGRAPH -0xF6DD 0x937C #CJK UNIFIED IDEOGRAPH -0xF6DE 0x87C4 #CJK UNIFIED IDEOGRAPH -0xF6DF 0x79E4 #CJK UNIFIED IDEOGRAPH -0xF6E0 0x7A31 #CJK UNIFIED IDEOGRAPH -0xF6E1 0x5FEB #CJK UNIFIED IDEOGRAPH -0xF6E2 0x4ED6 #CJK UNIFIED IDEOGRAPH -0xF6E3 0x54A4 #CJK UNIFIED IDEOGRAPH -0xF6E4 0x553E #CJK UNIFIED IDEOGRAPH -0xF6E5 0x58AE #CJK UNIFIED IDEOGRAPH -0xF6E6 0x59A5 #CJK UNIFIED IDEOGRAPH -0xF6E7 0x60F0 #CJK UNIFIED IDEOGRAPH -0xF6E8 0x6253 #CJK UNIFIED IDEOGRAPH -0xF6E9 0x62D6 #CJK UNIFIED IDEOGRAPH -0xF6EA 0x6736 #CJK UNIFIED IDEOGRAPH -0xF6EB 0x6955 #CJK UNIFIED IDEOGRAPH -0xF6EC 0x8235 #CJK UNIFIED IDEOGRAPH -0xF6ED 0x9640 #CJK UNIFIED IDEOGRAPH -0xF6EE 0x99B1 #CJK UNIFIED IDEOGRAPH -0xF6EF 0x99DD #CJK UNIFIED IDEOGRAPH -0xF6F0 0x502C #CJK UNIFIED IDEOGRAPH -0xF6F1 0x5353 #CJK UNIFIED IDEOGRAPH -0xF6F2 0x5544 #CJK UNIFIED IDEOGRAPH -0xF6F3 0x577C #CJK UNIFIED IDEOGRAPH -0xF6F4 0xFA01 #CJK COMPATIBILITY IDEOGRAPH -0xF6F5 0x6258 #CJK UNIFIED IDEOGRAPH -0xF6F6 0xFA02 #CJK COMPATIBILITY IDEOGRAPH -0xF6F7 0x64E2 #CJK UNIFIED IDEOGRAPH -0xF6F8 0x666B #CJK UNIFIED IDEOGRAPH -0xF6F9 0x67DD #CJK UNIFIED IDEOGRAPH -0xF6FA 0x6FC1 #CJK UNIFIED IDEOGRAPH -0xF6FB 0x6FEF #CJK UNIFIED IDEOGRAPH -0xF6FC 0x7422 #CJK UNIFIED IDEOGRAPH -0xF6FD 0x7438 #CJK UNIFIED IDEOGRAPH -0xF6FE 0x8A17 #CJK UNIFIED IDEOGRAPH -0xF7A1 0x9438 #CJK UNIFIED IDEOGRAPH -0xF7A2 0x5451 #CJK UNIFIED IDEOGRAPH -0xF7A3 0x5606 #CJK UNIFIED IDEOGRAPH -0xF7A4 0x5766 #CJK UNIFIED IDEOGRAPH -0xF7A5 0x5F48 #CJK UNIFIED IDEOGRAPH -0xF7A6 0x619A #CJK UNIFIED IDEOGRAPH -0xF7A7 0x6B4E #CJK UNIFIED IDEOGRAPH -0xF7A8 0x7058 #CJK UNIFIED IDEOGRAPH -0xF7A9 0x70AD #CJK UNIFIED IDEOGRAPH -0xF7AA 0x7DBB #CJK UNIFIED IDEOGRAPH -0xF7AB 0x8A95 #CJK UNIFIED IDEOGRAPH -0xF7AC 0x596A #CJK UNIFIED IDEOGRAPH -0xF7AD 0x812B #CJK UNIFIED IDEOGRAPH -0xF7AE 0x63A2 #CJK UNIFIED IDEOGRAPH -0xF7AF 0x7708 #CJK UNIFIED IDEOGRAPH -0xF7B0 0x803D #CJK UNIFIED IDEOGRAPH -0xF7B1 0x8CAA #CJK UNIFIED IDEOGRAPH -0xF7B2 0x5854 #CJK UNIFIED IDEOGRAPH -0xF7B3 0x642D #CJK UNIFIED IDEOGRAPH -0xF7B4 0x69BB #CJK UNIFIED IDEOGRAPH -0xF7B5 0x5B95 #CJK UNIFIED IDEOGRAPH -0xF7B6 0x5E11 #CJK UNIFIED IDEOGRAPH -0xF7B7 0x6E6F #CJK UNIFIED IDEOGRAPH -0xF7B8 0xFA03 #CJK COMPATIBILITY IDEOGRAPH -0xF7B9 0x8569 #CJK UNIFIED IDEOGRAPH -0xF7BA 0x514C #CJK UNIFIED IDEOGRAPH -0xF7BB 0x53F0 #CJK UNIFIED IDEOGRAPH -0xF7BC 0x592A #CJK UNIFIED IDEOGRAPH -0xF7BD 0x6020 #CJK UNIFIED IDEOGRAPH -0xF7BE 0x614B #CJK UNIFIED IDEOGRAPH -0xF7BF 0x6B86 #CJK UNIFIED IDEOGRAPH -0xF7C0 0x6C70 #CJK UNIFIED IDEOGRAPH -0xF7C1 0x6CF0 #CJK UNIFIED IDEOGRAPH -0xF7C2 0x7B1E #CJK UNIFIED IDEOGRAPH -0xF7C3 0x80CE #CJK UNIFIED IDEOGRAPH -0xF7C4 0x82D4 #CJK UNIFIED IDEOGRAPH -0xF7C5 0x8DC6 #CJK UNIFIED IDEOGRAPH -0xF7C6 0x90B0 #CJK UNIFIED IDEOGRAPH -0xF7C7 0x98B1 #CJK UNIFIED IDEOGRAPH -0xF7C8 0xFA04 #CJK COMPATIBILITY IDEOGRAPH -0xF7C9 0x64C7 #CJK UNIFIED IDEOGRAPH -0xF7CA 0x6FA4 #CJK UNIFIED IDEOGRAPH -0xF7CB 0x6491 #CJK UNIFIED IDEOGRAPH -0xF7CC 0x6504 #CJK UNIFIED IDEOGRAPH -0xF7CD 0x514E #CJK UNIFIED IDEOGRAPH -0xF7CE 0x5410 #CJK UNIFIED IDEOGRAPH -0xF7CF 0x571F #CJK UNIFIED IDEOGRAPH -0xF7D0 0x8A0E #CJK UNIFIED IDEOGRAPH -0xF7D1 0x615F #CJK UNIFIED IDEOGRAPH -0xF7D2 0x6876 #CJK UNIFIED IDEOGRAPH -0xF7D3 0xFA05 #CJK COMPATIBILITY IDEOGRAPH -0xF7D4 0x75DB #CJK UNIFIED IDEOGRAPH -0xF7D5 0x7B52 #CJK UNIFIED IDEOGRAPH -0xF7D6 0x7D71 #CJK UNIFIED IDEOGRAPH -0xF7D7 0x901A #CJK UNIFIED IDEOGRAPH -0xF7D8 0x5806 #CJK UNIFIED IDEOGRAPH -0xF7D9 0x69CC #CJK UNIFIED IDEOGRAPH -0xF7DA 0x817F #CJK UNIFIED IDEOGRAPH -0xF7DB 0x892A #CJK UNIFIED IDEOGRAPH -0xF7DC 0x9000 #CJK UNIFIED IDEOGRAPH -0xF7DD 0x9839 #CJK UNIFIED IDEOGRAPH -0xF7DE 0x5078 #CJK UNIFIED IDEOGRAPH -0xF7DF 0x5957 #CJK UNIFIED IDEOGRAPH -0xF7E0 0x59AC #CJK UNIFIED IDEOGRAPH -0xF7E1 0x6295 #CJK UNIFIED IDEOGRAPH -0xF7E2 0x900F #CJK UNIFIED IDEOGRAPH -0xF7E3 0x9B2A #CJK UNIFIED IDEOGRAPH -0xF7E4 0x615D #CJK UNIFIED IDEOGRAPH -0xF7E5 0x7279 #CJK UNIFIED IDEOGRAPH -0xF7E6 0x95D6 #CJK UNIFIED IDEOGRAPH -0xF7E7 0x5761 #CJK UNIFIED IDEOGRAPH -0xF7E8 0x5A46 #CJK UNIFIED IDEOGRAPH -0xF7E9 0x5DF4 #CJK UNIFIED IDEOGRAPH -0xF7EA 0x628A #CJK UNIFIED IDEOGRAPH -0xF7EB 0x64AD #CJK UNIFIED IDEOGRAPH -0xF7EC 0x64FA #CJK UNIFIED IDEOGRAPH -0xF7ED 0x6777 #CJK UNIFIED IDEOGRAPH -0xF7EE 0x6CE2 #CJK UNIFIED IDEOGRAPH -0xF7EF 0x6D3E #CJK UNIFIED IDEOGRAPH -0xF7F0 0x722C #CJK UNIFIED IDEOGRAPH -0xF7F1 0x7436 #CJK UNIFIED IDEOGRAPH -0xF7F2 0x7834 #CJK UNIFIED IDEOGRAPH -0xF7F3 0x7F77 #CJK UNIFIED IDEOGRAPH -0xF7F4 0x82AD #CJK UNIFIED IDEOGRAPH -0xF7F5 0x8DDB #CJK UNIFIED IDEOGRAPH -0xF7F6 0x9817 #CJK UNIFIED IDEOGRAPH -0xF7F7 0x5224 #CJK UNIFIED IDEOGRAPH -0xF7F8 0x5742 #CJK UNIFIED IDEOGRAPH -0xF7F9 0x677F #CJK UNIFIED IDEOGRAPH -0xF7FA 0x7248 #CJK UNIFIED IDEOGRAPH -0xF7FB 0x74E3 #CJK UNIFIED IDEOGRAPH -0xF7FC 0x8CA9 #CJK UNIFIED IDEOGRAPH -0xF7FD 0x8FA6 #CJK UNIFIED IDEOGRAPH -0xF7FE 0x9211 #CJK UNIFIED IDEOGRAPH -0xF8A1 0x962A #CJK UNIFIED IDEOGRAPH -0xF8A2 0x516B #CJK UNIFIED IDEOGRAPH -0xF8A3 0x53ED #CJK UNIFIED IDEOGRAPH -0xF8A4 0x634C #CJK UNIFIED IDEOGRAPH -0xF8A5 0x4F69 #CJK UNIFIED IDEOGRAPH -0xF8A6 0x5504 #CJK UNIFIED IDEOGRAPH -0xF8A7 0x6096 #CJK UNIFIED IDEOGRAPH -0xF8A8 0x6557 #CJK UNIFIED IDEOGRAPH -0xF8A9 0x6C9B #CJK UNIFIED IDEOGRAPH -0xF8AA 0x6D7F #CJK UNIFIED IDEOGRAPH -0xF8AB 0x724C #CJK UNIFIED IDEOGRAPH -0xF8AC 0x72FD #CJK UNIFIED IDEOGRAPH -0xF8AD 0x7A17 #CJK UNIFIED IDEOGRAPH -0xF8AE 0x8987 #CJK UNIFIED IDEOGRAPH -0xF8AF 0x8C9D #CJK UNIFIED IDEOGRAPH -0xF8B0 0x5F6D #CJK UNIFIED IDEOGRAPH -0xF8B1 0x6F8E #CJK UNIFIED IDEOGRAPH -0xF8B2 0x70F9 #CJK UNIFIED IDEOGRAPH -0xF8B3 0x81A8 #CJK UNIFIED IDEOGRAPH -0xF8B4 0x610E #CJK UNIFIED IDEOGRAPH -0xF8B5 0x4FBF #CJK UNIFIED IDEOGRAPH -0xF8B6 0x504F #CJK UNIFIED IDEOGRAPH -0xF8B7 0x6241 #CJK UNIFIED IDEOGRAPH -0xF8B8 0x7247 #CJK UNIFIED IDEOGRAPH -0xF8B9 0x7BC7 #CJK UNIFIED IDEOGRAPH -0xF8BA 0x7DE8 #CJK UNIFIED IDEOGRAPH -0xF8BB 0x7FE9 #CJK UNIFIED IDEOGRAPH -0xF8BC 0x904D #CJK UNIFIED IDEOGRAPH -0xF8BD 0x97AD #CJK UNIFIED IDEOGRAPH -0xF8BE 0x9A19 #CJK UNIFIED IDEOGRAPH -0xF8BF 0x8CB6 #CJK UNIFIED IDEOGRAPH -0xF8C0 0x576A #CJK UNIFIED IDEOGRAPH -0xF8C1 0x5E73 #CJK UNIFIED IDEOGRAPH -0xF8C2 0x67B0 #CJK UNIFIED IDEOGRAPH -0xF8C3 0x840D #CJK UNIFIED IDEOGRAPH -0xF8C4 0x8A55 #CJK UNIFIED IDEOGRAPH -0xF8C5 0x5420 #CJK UNIFIED IDEOGRAPH -0xF8C6 0x5B16 #CJK UNIFIED IDEOGRAPH -0xF8C7 0x5E63 #CJK UNIFIED IDEOGRAPH -0xF8C8 0x5EE2 #CJK UNIFIED IDEOGRAPH -0xF8C9 0x5F0A #CJK UNIFIED IDEOGRAPH -0xF8CA 0x6583 #CJK UNIFIED IDEOGRAPH -0xF8CB 0x80BA #CJK UNIFIED IDEOGRAPH -0xF8CC 0x853D #CJK UNIFIED IDEOGRAPH -0xF8CD 0x9589 #CJK UNIFIED IDEOGRAPH -0xF8CE 0x965B #CJK UNIFIED IDEOGRAPH -0xF8CF 0x4F48 #CJK UNIFIED IDEOGRAPH -0xF8D0 0x5305 #CJK UNIFIED IDEOGRAPH -0xF8D1 0x530D #CJK UNIFIED IDEOGRAPH -0xF8D2 0x530F #CJK UNIFIED IDEOGRAPH -0xF8D3 0x5486 #CJK UNIFIED IDEOGRAPH -0xF8D4 0x54FA #CJK UNIFIED IDEOGRAPH -0xF8D5 0x5703 #CJK UNIFIED IDEOGRAPH -0xF8D6 0x5E03 #CJK UNIFIED IDEOGRAPH -0xF8D7 0x6016 #CJK UNIFIED IDEOGRAPH -0xF8D8 0x629B #CJK UNIFIED IDEOGRAPH -0xF8D9 0x62B1 #CJK UNIFIED IDEOGRAPH -0xF8DA 0x6355 #CJK UNIFIED IDEOGRAPH -0xF8DB 0xFA06 #CJK COMPATIBILITY IDEOGRAPH -0xF8DC 0x6CE1 #CJK UNIFIED IDEOGRAPH -0xF8DD 0x6D66 #CJK UNIFIED IDEOGRAPH -0xF8DE 0x75B1 #CJK UNIFIED IDEOGRAPH -0xF8DF 0x7832 #CJK UNIFIED IDEOGRAPH -0xF8E0 0x80DE #CJK UNIFIED IDEOGRAPH -0xF8E1 0x812F #CJK UNIFIED IDEOGRAPH -0xF8E2 0x82DE #CJK UNIFIED IDEOGRAPH -0xF8E3 0x8461 #CJK UNIFIED IDEOGRAPH -0xF8E4 0x84B2 #CJK UNIFIED IDEOGRAPH -0xF8E5 0x888D #CJK UNIFIED IDEOGRAPH -0xF8E6 0x8912 #CJK UNIFIED IDEOGRAPH -0xF8E7 0x900B #CJK UNIFIED IDEOGRAPH -0xF8E8 0x92EA #CJK UNIFIED IDEOGRAPH -0xF8E9 0x98FD #CJK UNIFIED IDEOGRAPH -0xF8EA 0x9B91 #CJK UNIFIED IDEOGRAPH -0xF8EB 0x5E45 #CJK UNIFIED IDEOGRAPH -0xF8EC 0x66B4 #CJK UNIFIED IDEOGRAPH -0xF8ED 0x66DD #CJK UNIFIED IDEOGRAPH -0xF8EE 0x7011 #CJK UNIFIED IDEOGRAPH -0xF8EF 0x7206 #CJK UNIFIED IDEOGRAPH -0xF8F0 0xFA07 #CJK COMPATIBILITY IDEOGRAPH -0xF8F1 0x4FF5 #CJK UNIFIED IDEOGRAPH -0xF8F2 0x527D #CJK UNIFIED IDEOGRAPH -0xF8F3 0x5F6A #CJK UNIFIED IDEOGRAPH -0xF8F4 0x6153 #CJK UNIFIED IDEOGRAPH -0xF8F5 0x6753 #CJK UNIFIED IDEOGRAPH -0xF8F6 0x6A19 #CJK UNIFIED IDEOGRAPH -0xF8F7 0x6F02 #CJK UNIFIED IDEOGRAPH -0xF8F8 0x74E2 #CJK UNIFIED IDEOGRAPH -0xF8F9 0x7968 #CJK UNIFIED IDEOGRAPH -0xF8FA 0x8868 #CJK UNIFIED IDEOGRAPH -0xF8FB 0x8C79 #CJK UNIFIED IDEOGRAPH -0xF8FC 0x98C7 #CJK UNIFIED IDEOGRAPH -0xF8FD 0x98C4 #CJK UNIFIED IDEOGRAPH -0xF8FE 0x9A43 #CJK UNIFIED IDEOGRAPH -0xF9A1 0x54C1 #CJK UNIFIED IDEOGRAPH -0xF9A2 0x7A1F #CJK UNIFIED IDEOGRAPH -0xF9A3 0x6953 #CJK UNIFIED IDEOGRAPH -0xF9A4 0x8AF7 #CJK UNIFIED IDEOGRAPH -0xF9A5 0x8C4A #CJK UNIFIED IDEOGRAPH -0xF9A6 0x98A8 #CJK UNIFIED IDEOGRAPH -0xF9A7 0x99AE #CJK UNIFIED IDEOGRAPH -0xF9A8 0x5F7C #CJK UNIFIED IDEOGRAPH -0xF9A9 0x62AB #CJK UNIFIED IDEOGRAPH -0xF9AA 0x75B2 #CJK UNIFIED IDEOGRAPH -0xF9AB 0x76AE #CJK UNIFIED IDEOGRAPH -0xF9AC 0x88AB #CJK UNIFIED IDEOGRAPH -0xF9AD 0x907F #CJK UNIFIED IDEOGRAPH -0xF9AE 0x9642 #CJK UNIFIED IDEOGRAPH -0xF9AF 0x5339 #CJK UNIFIED IDEOGRAPH -0xF9B0 0x5F3C #CJK UNIFIED IDEOGRAPH -0xF9B1 0x5FC5 #CJK UNIFIED IDEOGRAPH -0xF9B2 0x6CCC #CJK UNIFIED IDEOGRAPH -0xF9B3 0x73CC #CJK UNIFIED IDEOGRAPH -0xF9B4 0x7562 #CJK UNIFIED IDEOGRAPH -0xF9B5 0x758B #CJK UNIFIED IDEOGRAPH -0xF9B6 0x7B46 #CJK UNIFIED IDEOGRAPH -0xF9B7 0x82FE #CJK UNIFIED IDEOGRAPH -0xF9B8 0x999D #CJK UNIFIED IDEOGRAPH -0xF9B9 0x4E4F #CJK UNIFIED IDEOGRAPH -0xF9BA 0x903C #CJK UNIFIED IDEOGRAPH -0xF9BB 0x4E0B #CJK UNIFIED IDEOGRAPH -0xF9BC 0x4F55 #CJK UNIFIED IDEOGRAPH -0xF9BD 0x53A6 #CJK UNIFIED IDEOGRAPH -0xF9BE 0x590F #CJK UNIFIED IDEOGRAPH -0xF9BF 0x5EC8 #CJK UNIFIED IDEOGRAPH -0xF9C0 0x6630 #CJK UNIFIED IDEOGRAPH -0xF9C1 0x6CB3 #CJK UNIFIED IDEOGRAPH -0xF9C2 0x7455 #CJK UNIFIED IDEOGRAPH -0xF9C3 0x8377 #CJK UNIFIED IDEOGRAPH -0xF9C4 0x8766 #CJK UNIFIED IDEOGRAPH -0xF9C5 0x8CC0 #CJK UNIFIED IDEOGRAPH -0xF9C6 0x9050 #CJK UNIFIED IDEOGRAPH -0xF9C7 0x971E #CJK UNIFIED IDEOGRAPH -0xF9C8 0x9C15 #CJK UNIFIED IDEOGRAPH -0xF9C9 0x58D1 #CJK UNIFIED IDEOGRAPH -0xF9CA 0x5B78 #CJK UNIFIED IDEOGRAPH -0xF9CB 0x8650 #CJK UNIFIED IDEOGRAPH -0xF9CC 0x8B14 #CJK UNIFIED IDEOGRAPH -0xF9CD 0x9DB4 #CJK UNIFIED IDEOGRAPH -0xF9CE 0x5BD2 #CJK UNIFIED IDEOGRAPH -0xF9CF 0x6068 #CJK UNIFIED IDEOGRAPH -0xF9D0 0x608D #CJK UNIFIED IDEOGRAPH -0xF9D1 0x65F1 #CJK UNIFIED IDEOGRAPH -0xF9D2 0x6C57 #CJK UNIFIED IDEOGRAPH -0xF9D3 0x6F22 #CJK UNIFIED IDEOGRAPH -0xF9D4 0x6FA3 #CJK UNIFIED IDEOGRAPH -0xF9D5 0x701A #CJK UNIFIED IDEOGRAPH -0xF9D6 0x7F55 #CJK UNIFIED IDEOGRAPH -0xF9D7 0x7FF0 #CJK UNIFIED IDEOGRAPH -0xF9D8 0x9591 #CJK UNIFIED IDEOGRAPH -0xF9D9 0x9592 #CJK UNIFIED IDEOGRAPH -0xF9DA 0x9650 #CJK UNIFIED IDEOGRAPH -0xF9DB 0x97D3 #CJK UNIFIED IDEOGRAPH -0xF9DC 0x5272 #CJK UNIFIED IDEOGRAPH -0xF9DD 0x8F44 #CJK UNIFIED IDEOGRAPH -0xF9DE 0x51FD #CJK UNIFIED IDEOGRAPH -0xF9DF 0x542B #CJK UNIFIED IDEOGRAPH -0xF9E0 0x54B8 #CJK UNIFIED IDEOGRAPH -0xF9E1 0x5563 #CJK UNIFIED IDEOGRAPH -0xF9E2 0x558A #CJK UNIFIED IDEOGRAPH -0xF9E3 0x6ABB #CJK UNIFIED IDEOGRAPH -0xF9E4 0x6DB5 #CJK UNIFIED IDEOGRAPH -0xF9E5 0x7DD8 #CJK UNIFIED IDEOGRAPH -0xF9E6 0x8266 #CJK UNIFIED IDEOGRAPH -0xF9E7 0x929C #CJK UNIFIED IDEOGRAPH -0xF9E8 0x9677 #CJK UNIFIED IDEOGRAPH -0xF9E9 0x9E79 #CJK UNIFIED IDEOGRAPH -0xF9EA 0x5408 #CJK UNIFIED IDEOGRAPH -0xF9EB 0x54C8 #CJK UNIFIED IDEOGRAPH -0xF9EC 0x76D2 #CJK UNIFIED IDEOGRAPH -0xF9ED 0x86E4 #CJK UNIFIED IDEOGRAPH -0xF9EE 0x95A4 #CJK UNIFIED IDEOGRAPH -0xF9EF 0x95D4 #CJK UNIFIED IDEOGRAPH -0xF9F0 0x965C #CJK UNIFIED IDEOGRAPH -0xF9F1 0x4EA2 #CJK UNIFIED IDEOGRAPH -0xF9F2 0x4F09 #CJK UNIFIED IDEOGRAPH -0xF9F3 0x59EE #CJK UNIFIED IDEOGRAPH -0xF9F4 0x5AE6 #CJK UNIFIED IDEOGRAPH -0xF9F5 0x5DF7 #CJK UNIFIED IDEOGRAPH -0xF9F6 0x6052 #CJK UNIFIED IDEOGRAPH -0xF9F7 0x6297 #CJK UNIFIED IDEOGRAPH -0xF9F8 0x676D #CJK UNIFIED IDEOGRAPH -0xF9F9 0x6841 #CJK UNIFIED IDEOGRAPH -0xF9FA 0x6C86 #CJK UNIFIED IDEOGRAPH -0xF9FB 0x6E2F #CJK UNIFIED IDEOGRAPH -0xF9FC 0x7F38 #CJK UNIFIED IDEOGRAPH -0xF9FD 0x809B #CJK UNIFIED IDEOGRAPH -0xF9FE 0x822A #CJK UNIFIED IDEOGRAPH -0xFAA1 0xFA08 #CJK COMPATIBILITY IDEOGRAPH -0xFAA2 0xFA09 #CJK COMPATIBILITY IDEOGRAPH -0xFAA3 0x9805 #CJK UNIFIED IDEOGRAPH -0xFAA4 0x4EA5 #CJK UNIFIED IDEOGRAPH -0xFAA5 0x5055 #CJK UNIFIED IDEOGRAPH -0xFAA6 0x54B3 #CJK UNIFIED IDEOGRAPH -0xFAA7 0x5793 #CJK UNIFIED IDEOGRAPH -0xFAA8 0x595A #CJK UNIFIED IDEOGRAPH -0xFAA9 0x5B69 #CJK UNIFIED IDEOGRAPH -0xFAAA 0x5BB3 #CJK UNIFIED IDEOGRAPH -0xFAAB 0x61C8 #CJK UNIFIED IDEOGRAPH -0xFAAC 0x6977 #CJK UNIFIED IDEOGRAPH -0xFAAD 0x6D77 #CJK UNIFIED IDEOGRAPH -0xFAAE 0x7023 #CJK UNIFIED IDEOGRAPH -0xFAAF 0x87F9 #CJK UNIFIED IDEOGRAPH -0xFAB0 0x89E3 #CJK UNIFIED IDEOGRAPH -0xFAB1 0x8A72 #CJK UNIFIED IDEOGRAPH -0xFAB2 0x8AE7 #CJK UNIFIED IDEOGRAPH -0xFAB3 0x9082 #CJK UNIFIED IDEOGRAPH -0xFAB4 0x99ED #CJK UNIFIED IDEOGRAPH -0xFAB5 0x9AB8 #CJK UNIFIED IDEOGRAPH -0xFAB6 0x52BE #CJK UNIFIED IDEOGRAPH -0xFAB7 0x6838 #CJK UNIFIED IDEOGRAPH -0xFAB8 0x5016 #CJK UNIFIED IDEOGRAPH -0xFAB9 0x5E78 #CJK UNIFIED IDEOGRAPH -0xFABA 0x674F #CJK UNIFIED IDEOGRAPH -0xFABB 0x8347 #CJK UNIFIED IDEOGRAPH -0xFABC 0x884C #CJK UNIFIED IDEOGRAPH -0xFABD 0x4EAB #CJK UNIFIED IDEOGRAPH -0xFABE 0x5411 #CJK UNIFIED IDEOGRAPH -0xFABF 0x56AE #CJK UNIFIED IDEOGRAPH -0xFAC0 0x73E6 #CJK UNIFIED IDEOGRAPH -0xFAC1 0x9115 #CJK UNIFIED IDEOGRAPH -0xFAC2 0x97FF #CJK UNIFIED IDEOGRAPH -0xFAC3 0x9909 #CJK UNIFIED IDEOGRAPH -0xFAC4 0x9957 #CJK UNIFIED IDEOGRAPH -0xFAC5 0x9999 #CJK UNIFIED IDEOGRAPH -0xFAC6 0x5653 #CJK UNIFIED IDEOGRAPH -0xFAC7 0x589F #CJK UNIFIED IDEOGRAPH -0xFAC8 0x865B #CJK UNIFIED IDEOGRAPH -0xFAC9 0x8A31 #CJK UNIFIED IDEOGRAPH -0xFACA 0x61B2 #CJK UNIFIED IDEOGRAPH -0xFACB 0x6AF6 #CJK UNIFIED IDEOGRAPH -0xFACC 0x737B #CJK UNIFIED IDEOGRAPH -0xFACD 0x8ED2 #CJK UNIFIED IDEOGRAPH -0xFACE 0x6B47 #CJK UNIFIED IDEOGRAPH -0xFACF 0x96AA #CJK UNIFIED IDEOGRAPH -0xFAD0 0x9A57 #CJK UNIFIED IDEOGRAPH -0xFAD1 0x5955 #CJK UNIFIED IDEOGRAPH -0xFAD2 0x7200 #CJK UNIFIED IDEOGRAPH -0xFAD3 0x8D6B #CJK UNIFIED IDEOGRAPH -0xFAD4 0x9769 #CJK UNIFIED IDEOGRAPH -0xFAD5 0x4FD4 #CJK UNIFIED IDEOGRAPH -0xFAD6 0x5CF4 #CJK UNIFIED IDEOGRAPH -0xFAD7 0x5F26 #CJK UNIFIED IDEOGRAPH -0xFAD8 0x61F8 #CJK UNIFIED IDEOGRAPH -0xFAD9 0x665B #CJK UNIFIED IDEOGRAPH -0xFADA 0x6CEB #CJK UNIFIED IDEOGRAPH -0xFADB 0x70AB #CJK UNIFIED IDEOGRAPH -0xFADC 0x7384 #CJK UNIFIED IDEOGRAPH -0xFADD 0x73B9 #CJK UNIFIED IDEOGRAPH -0xFADE 0x73FE #CJK UNIFIED IDEOGRAPH -0xFADF 0x7729 #CJK UNIFIED IDEOGRAPH -0xFAE0 0x774D #CJK UNIFIED IDEOGRAPH -0xFAE1 0x7D43 #CJK UNIFIED IDEOGRAPH -0xFAE2 0x7D62 #CJK UNIFIED IDEOGRAPH -0xFAE3 0x7E23 #CJK UNIFIED IDEOGRAPH -0xFAE4 0x8237 #CJK UNIFIED IDEOGRAPH -0xFAE5 0x8852 #CJK UNIFIED IDEOGRAPH -0xFAE6 0xFA0A #CJK COMPATIBILITY IDEOGRAPH -0xFAE7 0x8CE2 #CJK UNIFIED IDEOGRAPH -0xFAE8 0x9249 #CJK UNIFIED IDEOGRAPH -0xFAE9 0x986F #CJK UNIFIED IDEOGRAPH -0xFAEA 0x5B51 #CJK UNIFIED IDEOGRAPH -0xFAEB 0x7A74 #CJK UNIFIED IDEOGRAPH -0xFAEC 0x8840 #CJK UNIFIED IDEOGRAPH -0xFAED 0x9801 #CJK UNIFIED IDEOGRAPH -0xFAEE 0x5ACC #CJK UNIFIED IDEOGRAPH -0xFAEF 0x4FE0 #CJK UNIFIED IDEOGRAPH -0xFAF0 0x5354 #CJK UNIFIED IDEOGRAPH -0xFAF1 0x593E #CJK UNIFIED IDEOGRAPH -0xFAF2 0x5CFD #CJK UNIFIED IDEOGRAPH -0xFAF3 0x633E #CJK UNIFIED IDEOGRAPH -0xFAF4 0x6D79 #CJK UNIFIED IDEOGRAPH -0xFAF5 0x72F9 #CJK UNIFIED IDEOGRAPH -0xFAF6 0x8105 #CJK UNIFIED IDEOGRAPH -0xFAF7 0x8107 #CJK UNIFIED IDEOGRAPH -0xFAF8 0x83A2 #CJK UNIFIED IDEOGRAPH -0xFAF9 0x92CF #CJK UNIFIED IDEOGRAPH -0xFAFA 0x9830 #CJK UNIFIED IDEOGRAPH -0xFAFB 0x4EA8 #CJK UNIFIED IDEOGRAPH -0xFAFC 0x5144 #CJK UNIFIED IDEOGRAPH -0xFAFD 0x5211 #CJK UNIFIED IDEOGRAPH -0xFAFE 0x578B #CJK UNIFIED IDEOGRAPH -0xFBA1 0x5F62 #CJK UNIFIED IDEOGRAPH -0xFBA2 0x6CC2 #CJK UNIFIED IDEOGRAPH -0xFBA3 0x6ECE #CJK UNIFIED IDEOGRAPH -0xFBA4 0x7005 #CJK UNIFIED IDEOGRAPH -0xFBA5 0x7050 #CJK UNIFIED IDEOGRAPH -0xFBA6 0x70AF #CJK UNIFIED IDEOGRAPH -0xFBA7 0x7192 #CJK UNIFIED IDEOGRAPH -0xFBA8 0x73E9 #CJK UNIFIED IDEOGRAPH -0xFBA9 0x7469 #CJK UNIFIED IDEOGRAPH -0xFBAA 0x834A #CJK UNIFIED IDEOGRAPH -0xFBAB 0x87A2 #CJK UNIFIED IDEOGRAPH -0xFBAC 0x8861 #CJK UNIFIED IDEOGRAPH -0xFBAD 0x9008 #CJK UNIFIED IDEOGRAPH -0xFBAE 0x90A2 #CJK UNIFIED IDEOGRAPH -0xFBAF 0x93A3 #CJK UNIFIED IDEOGRAPH -0xFBB0 0x99A8 #CJK UNIFIED IDEOGRAPH -0xFBB1 0x516E #CJK UNIFIED IDEOGRAPH -0xFBB2 0x5F57 #CJK UNIFIED IDEOGRAPH -0xFBB3 0x60E0 #CJK UNIFIED IDEOGRAPH -0xFBB4 0x6167 #CJK UNIFIED IDEOGRAPH -0xFBB5 0x66B3 #CJK UNIFIED IDEOGRAPH -0xFBB6 0x8559 #CJK UNIFIED IDEOGRAPH -0xFBB7 0x8E4A #CJK UNIFIED IDEOGRAPH -0xFBB8 0x91AF #CJK UNIFIED IDEOGRAPH -0xFBB9 0x978B #CJK UNIFIED IDEOGRAPH -0xFBBA 0x4E4E #CJK UNIFIED IDEOGRAPH -0xFBBB 0x4E92 #CJK UNIFIED IDEOGRAPH -0xFBBC 0x547C #CJK UNIFIED IDEOGRAPH -0xFBBD 0x58D5 #CJK UNIFIED IDEOGRAPH -0xFBBE 0x58FA #CJK UNIFIED IDEOGRAPH -0xFBBF 0x597D #CJK UNIFIED IDEOGRAPH -0xFBC0 0x5CB5 #CJK UNIFIED IDEOGRAPH -0xFBC1 0x5F27 #CJK UNIFIED IDEOGRAPH -0xFBC2 0x6236 #CJK UNIFIED IDEOGRAPH -0xFBC3 0x6248 #CJK UNIFIED IDEOGRAPH -0xFBC4 0x660A #CJK UNIFIED IDEOGRAPH -0xFBC5 0x6667 #CJK UNIFIED IDEOGRAPH -0xFBC6 0x6BEB #CJK UNIFIED IDEOGRAPH -0xFBC7 0x6D69 #CJK UNIFIED IDEOGRAPH -0xFBC8 0x6DCF #CJK UNIFIED IDEOGRAPH -0xFBC9 0x6E56 #CJK UNIFIED IDEOGRAPH -0xFBCA 0x6EF8 #CJK UNIFIED IDEOGRAPH -0xFBCB 0x6F94 #CJK UNIFIED IDEOGRAPH -0xFBCC 0x6FE0 #CJK UNIFIED IDEOGRAPH -0xFBCD 0x6FE9 #CJK UNIFIED IDEOGRAPH -0xFBCE 0x705D #CJK UNIFIED IDEOGRAPH -0xFBCF 0x72D0 #CJK UNIFIED IDEOGRAPH -0xFBD0 0x7425 #CJK UNIFIED IDEOGRAPH -0xFBD1 0x745A #CJK UNIFIED IDEOGRAPH -0xFBD2 0x74E0 #CJK UNIFIED IDEOGRAPH -0xFBD3 0x7693 #CJK UNIFIED IDEOGRAPH -0xFBD4 0x795C #CJK UNIFIED IDEOGRAPH -0xFBD5 0x7CCA #CJK UNIFIED IDEOGRAPH -0xFBD6 0x7E1E #CJK UNIFIED IDEOGRAPH -0xFBD7 0x80E1 #CJK UNIFIED IDEOGRAPH -0xFBD8 0x82A6 #CJK UNIFIED IDEOGRAPH -0xFBD9 0x846B #CJK UNIFIED IDEOGRAPH -0xFBDA 0x84BF #CJK UNIFIED IDEOGRAPH -0xFBDB 0x864E #CJK UNIFIED IDEOGRAPH -0xFBDC 0x865F #CJK UNIFIED IDEOGRAPH -0xFBDD 0x8774 #CJK UNIFIED IDEOGRAPH -0xFBDE 0x8B77 #CJK UNIFIED IDEOGRAPH -0xFBDF 0x8C6A #CJK UNIFIED IDEOGRAPH -0xFBE0 0x93AC #CJK UNIFIED IDEOGRAPH -0xFBE1 0x9800 #CJK UNIFIED IDEOGRAPH -0xFBE2 0x9865 #CJK UNIFIED IDEOGRAPH -0xFBE3 0x60D1 #CJK UNIFIED IDEOGRAPH -0xFBE4 0x6216 #CJK UNIFIED IDEOGRAPH -0xFBE5 0x9177 #CJK UNIFIED IDEOGRAPH -0xFBE6 0x5A5A #CJK UNIFIED IDEOGRAPH -0xFBE7 0x660F #CJK UNIFIED IDEOGRAPH -0xFBE8 0x6DF7 #CJK UNIFIED IDEOGRAPH -0xFBE9 0x6E3E #CJK UNIFIED IDEOGRAPH -0xFBEA 0x743F #CJK UNIFIED IDEOGRAPH -0xFBEB 0x9B42 #CJK UNIFIED IDEOGRAPH -0xFBEC 0x5FFD #CJK UNIFIED IDEOGRAPH -0xFBED 0x60DA #CJK UNIFIED IDEOGRAPH -0xFBEE 0x7B0F #CJK UNIFIED IDEOGRAPH -0xFBEF 0x54C4 #CJK UNIFIED IDEOGRAPH -0xFBF0 0x5F18 #CJK UNIFIED IDEOGRAPH -0xFBF1 0x6C5E #CJK UNIFIED IDEOGRAPH -0xFBF2 0x6CD3 #CJK UNIFIED IDEOGRAPH -0xFBF3 0x6D2A #CJK UNIFIED IDEOGRAPH -0xFBF4 0x70D8 #CJK UNIFIED IDEOGRAPH -0xFBF5 0x7D05 #CJK UNIFIED IDEOGRAPH -0xFBF6 0x8679 #CJK UNIFIED IDEOGRAPH -0xFBF7 0x8A0C #CJK UNIFIED IDEOGRAPH -0xFBF8 0x9D3B #CJK UNIFIED IDEOGRAPH -0xFBF9 0x5316 #CJK UNIFIED IDEOGRAPH -0xFBFA 0x548C #CJK UNIFIED IDEOGRAPH -0xFBFB 0x5B05 #CJK UNIFIED IDEOGRAPH -0xFBFC 0x6A3A #CJK UNIFIED IDEOGRAPH -0xFBFD 0x706B #CJK UNIFIED IDEOGRAPH -0xFBFE 0x7575 #CJK UNIFIED IDEOGRAPH -0xFCA1 0x798D #CJK UNIFIED IDEOGRAPH -0xFCA2 0x79BE #CJK UNIFIED IDEOGRAPH -0xFCA3 0x82B1 #CJK UNIFIED IDEOGRAPH -0xFCA4 0x83EF #CJK UNIFIED IDEOGRAPH -0xFCA5 0x8A71 #CJK UNIFIED IDEOGRAPH -0xFCA6 0x8B41 #CJK UNIFIED IDEOGRAPH -0xFCA7 0x8CA8 #CJK UNIFIED IDEOGRAPH -0xFCA8 0x9774 #CJK UNIFIED IDEOGRAPH -0xFCA9 0xFA0B #CJK COMPATIBILITY IDEOGRAPH -0xFCAA 0x64F4 #CJK UNIFIED IDEOGRAPH -0xFCAB 0x652B #CJK UNIFIED IDEOGRAPH -0xFCAC 0x78BA #CJK UNIFIED IDEOGRAPH -0xFCAD 0x78BB #CJK UNIFIED IDEOGRAPH -0xFCAE 0x7A6B #CJK UNIFIED IDEOGRAPH -0xFCAF 0x4E38 #CJK UNIFIED IDEOGRAPH -0xFCB0 0x559A #CJK UNIFIED IDEOGRAPH -0xFCB1 0x5950 #CJK UNIFIED IDEOGRAPH -0xFCB2 0x5BA6 #CJK UNIFIED IDEOGRAPH -0xFCB3 0x5E7B #CJK UNIFIED IDEOGRAPH -0xFCB4 0x60A3 #CJK UNIFIED IDEOGRAPH -0xFCB5 0x63DB #CJK UNIFIED IDEOGRAPH -0xFCB6 0x6B61 #CJK UNIFIED IDEOGRAPH -0xFCB7 0x6665 #CJK UNIFIED IDEOGRAPH -0xFCB8 0x6853 #CJK UNIFIED IDEOGRAPH -0xFCB9 0x6E19 #CJK UNIFIED IDEOGRAPH -0xFCBA 0x7165 #CJK UNIFIED IDEOGRAPH -0xFCBB 0x74B0 #CJK UNIFIED IDEOGRAPH -0xFCBC 0x7D08 #CJK UNIFIED IDEOGRAPH -0xFCBD 0x9084 #CJK UNIFIED IDEOGRAPH -0xFCBE 0x9A69 #CJK UNIFIED IDEOGRAPH -0xFCBF 0x9C25 #CJK UNIFIED IDEOGRAPH -0xFCC0 0x6D3B #CJK UNIFIED IDEOGRAPH -0xFCC1 0x6ED1 #CJK UNIFIED IDEOGRAPH -0xFCC2 0x733E #CJK UNIFIED IDEOGRAPH -0xFCC3 0x8C41 #CJK UNIFIED IDEOGRAPH -0xFCC4 0x95CA #CJK UNIFIED IDEOGRAPH -0xFCC5 0x51F0 #CJK UNIFIED IDEOGRAPH -0xFCC6 0x5E4C #CJK UNIFIED IDEOGRAPH -0xFCC7 0x5FA8 #CJK UNIFIED IDEOGRAPH -0xFCC8 0x604D #CJK UNIFIED IDEOGRAPH -0xFCC9 0x60F6 #CJK UNIFIED IDEOGRAPH -0xFCCA 0x6130 #CJK UNIFIED IDEOGRAPH -0xFCCB 0x614C #CJK UNIFIED IDEOGRAPH -0xFCCC 0x6643 #CJK UNIFIED IDEOGRAPH -0xFCCD 0x6644 #CJK UNIFIED IDEOGRAPH -0xFCCE 0x69A5 #CJK UNIFIED IDEOGRAPH -0xFCCF 0x6CC1 #CJK UNIFIED IDEOGRAPH -0xFCD0 0x6E5F #CJK UNIFIED IDEOGRAPH -0xFCD1 0x6EC9 #CJK UNIFIED IDEOGRAPH -0xFCD2 0x6F62 #CJK UNIFIED IDEOGRAPH -0xFCD3 0x714C #CJK UNIFIED IDEOGRAPH -0xFCD4 0x749C #CJK UNIFIED IDEOGRAPH -0xFCD5 0x7687 #CJK UNIFIED IDEOGRAPH -0xFCD6 0x7BC1 #CJK UNIFIED IDEOGRAPH -0xFCD7 0x7C27 #CJK UNIFIED IDEOGRAPH -0xFCD8 0x8352 #CJK UNIFIED IDEOGRAPH -0xFCD9 0x8757 #CJK UNIFIED IDEOGRAPH -0xFCDA 0x9051 #CJK UNIFIED IDEOGRAPH -0xFCDB 0x968D #CJK UNIFIED IDEOGRAPH -0xFCDC 0x9EC3 #CJK UNIFIED IDEOGRAPH -0xFCDD 0x532F #CJK UNIFIED IDEOGRAPH -0xFCDE 0x56DE #CJK UNIFIED IDEOGRAPH -0xFCDF 0x5EFB #CJK UNIFIED IDEOGRAPH -0xFCE0 0x5F8A #CJK UNIFIED IDEOGRAPH -0xFCE1 0x6062 #CJK UNIFIED IDEOGRAPH -0xFCE2 0x6094 #CJK UNIFIED IDEOGRAPH -0xFCE3 0x61F7 #CJK UNIFIED IDEOGRAPH -0xFCE4 0x6666 #CJK UNIFIED IDEOGRAPH -0xFCE5 0x6703 #CJK UNIFIED IDEOGRAPH -0xFCE6 0x6A9C #CJK UNIFIED IDEOGRAPH -0xFCE7 0x6DEE #CJK UNIFIED IDEOGRAPH -0xFCE8 0x6FAE #CJK UNIFIED IDEOGRAPH -0xFCE9 0x7070 #CJK UNIFIED IDEOGRAPH -0xFCEA 0x736A #CJK UNIFIED IDEOGRAPH -0xFCEB 0x7E6A #CJK UNIFIED IDEOGRAPH -0xFCEC 0x81BE #CJK UNIFIED IDEOGRAPH -0xFCED 0x8334 #CJK UNIFIED IDEOGRAPH -0xFCEE 0x86D4 #CJK UNIFIED IDEOGRAPH -0xFCEF 0x8AA8 #CJK UNIFIED IDEOGRAPH -0xFCF0 0x8CC4 #CJK UNIFIED IDEOGRAPH -0xFCF1 0x5283 #CJK UNIFIED IDEOGRAPH -0xFCF2 0x7372 #CJK UNIFIED IDEOGRAPH -0xFCF3 0x5B96 #CJK UNIFIED IDEOGRAPH -0xFCF4 0x6A6B #CJK UNIFIED IDEOGRAPH -0xFCF5 0x9404 #CJK UNIFIED IDEOGRAPH -0xFCF6 0x54EE #CJK UNIFIED IDEOGRAPH -0xFCF7 0x5686 #CJK UNIFIED IDEOGRAPH -0xFCF8 0x5B5D #CJK UNIFIED IDEOGRAPH -0xFCF9 0x6548 #CJK UNIFIED IDEOGRAPH -0xFCFA 0x6585 #CJK UNIFIED IDEOGRAPH -0xFCFB 0x66C9 #CJK UNIFIED IDEOGRAPH -0xFCFC 0x689F #CJK UNIFIED IDEOGRAPH -0xFCFD 0x6D8D #CJK UNIFIED IDEOGRAPH -0xFCFE 0x6DC6 #CJK UNIFIED IDEOGRAPH -0xFDA1 0x723B #CJK UNIFIED IDEOGRAPH -0xFDA2 0x80B4 #CJK UNIFIED IDEOGRAPH -0xFDA3 0x9175 #CJK UNIFIED IDEOGRAPH -0xFDA4 0x9A4D #CJK UNIFIED IDEOGRAPH -0xFDA5 0x4FAF #CJK UNIFIED IDEOGRAPH -0xFDA6 0x5019 #CJK UNIFIED IDEOGRAPH -0xFDA7 0x539A #CJK UNIFIED IDEOGRAPH -0xFDA8 0x540E #CJK UNIFIED IDEOGRAPH -0xFDA9 0x543C #CJK UNIFIED IDEOGRAPH -0xFDAA 0x5589 #CJK UNIFIED IDEOGRAPH -0xFDAB 0x55C5 #CJK UNIFIED IDEOGRAPH -0xFDAC 0x5E3F #CJK UNIFIED IDEOGRAPH -0xFDAD 0x5F8C #CJK UNIFIED IDEOGRAPH -0xFDAE 0x673D #CJK UNIFIED IDEOGRAPH -0xFDAF 0x7166 #CJK UNIFIED IDEOGRAPH -0xFDB0 0x73DD #CJK UNIFIED IDEOGRAPH -0xFDB1 0x9005 #CJK UNIFIED IDEOGRAPH -0xFDB2 0x52DB #CJK UNIFIED IDEOGRAPH -0xFDB3 0x52F3 #CJK UNIFIED IDEOGRAPH -0xFDB4 0x5864 #CJK UNIFIED IDEOGRAPH -0xFDB5 0x58CE #CJK UNIFIED IDEOGRAPH -0xFDB6 0x7104 #CJK UNIFIED IDEOGRAPH -0xFDB7 0x718F #CJK UNIFIED IDEOGRAPH -0xFDB8 0x71FB #CJK UNIFIED IDEOGRAPH -0xFDB9 0x85B0 #CJK UNIFIED IDEOGRAPH -0xFDBA 0x8A13 #CJK UNIFIED IDEOGRAPH -0xFDBB 0x6688 #CJK UNIFIED IDEOGRAPH -0xFDBC 0x85A8 #CJK UNIFIED IDEOGRAPH -0xFDBD 0x55A7 #CJK UNIFIED IDEOGRAPH -0xFDBE 0x6684 #CJK UNIFIED IDEOGRAPH -0xFDBF 0x714A #CJK UNIFIED IDEOGRAPH -0xFDC0 0x8431 #CJK UNIFIED IDEOGRAPH -0xFDC1 0x5349 #CJK UNIFIED IDEOGRAPH -0xFDC2 0x5599 #CJK UNIFIED IDEOGRAPH -0xFDC3 0x6BC1 #CJK UNIFIED IDEOGRAPH -0xFDC4 0x5F59 #CJK UNIFIED IDEOGRAPH -0xFDC5 0x5FBD #CJK UNIFIED IDEOGRAPH -0xFDC6 0x63EE #CJK UNIFIED IDEOGRAPH -0xFDC7 0x6689 #CJK UNIFIED IDEOGRAPH -0xFDC8 0x7147 #CJK UNIFIED IDEOGRAPH -0xFDC9 0x8AF1 #CJK UNIFIED IDEOGRAPH -0xFDCA 0x8F1D #CJK UNIFIED IDEOGRAPH -0xFDCB 0x9EBE #CJK UNIFIED IDEOGRAPH -0xFDCC 0x4F11 #CJK UNIFIED IDEOGRAPH -0xFDCD 0x643A #CJK UNIFIED IDEOGRAPH -0xFDCE 0x70CB #CJK UNIFIED IDEOGRAPH -0xFDCF 0x7566 #CJK UNIFIED IDEOGRAPH -0xFDD0 0x8667 #CJK UNIFIED IDEOGRAPH -0xFDD1 0x6064 #CJK UNIFIED IDEOGRAPH -0xFDD2 0x8B4E #CJK UNIFIED IDEOGRAPH -0xFDD3 0x9DF8 #CJK UNIFIED IDEOGRAPH -0xFDD4 0x5147 #CJK UNIFIED IDEOGRAPH -0xFDD5 0x51F6 #CJK UNIFIED IDEOGRAPH -0xFDD6 0x5308 #CJK UNIFIED IDEOGRAPH -0xFDD7 0x6D36 #CJK UNIFIED IDEOGRAPH -0xFDD8 0x80F8 #CJK UNIFIED IDEOGRAPH -0xFDD9 0x9ED1 #CJK UNIFIED IDEOGRAPH -0xFDDA 0x6615 #CJK UNIFIED IDEOGRAPH -0xFDDB 0x6B23 #CJK UNIFIED IDEOGRAPH -0xFDDC 0x7098 #CJK UNIFIED IDEOGRAPH -0xFDDD 0x75D5 #CJK UNIFIED IDEOGRAPH -0xFDDE 0x5403 #CJK UNIFIED IDEOGRAPH -0xFDDF 0x5C79 #CJK UNIFIED IDEOGRAPH -0xFDE0 0x7D07 #CJK UNIFIED IDEOGRAPH -0xFDE1 0x8A16 #CJK UNIFIED IDEOGRAPH -0xFDE2 0x6B20 #CJK UNIFIED IDEOGRAPH -0xFDE3 0x6B3D #CJK UNIFIED IDEOGRAPH -0xFDE4 0x6B46 #CJK UNIFIED IDEOGRAPH -0xFDE5 0x5438 #CJK UNIFIED IDEOGRAPH -0xFDE6 0x6070 #CJK UNIFIED IDEOGRAPH -0xFDE7 0x6D3D #CJK UNIFIED IDEOGRAPH -0xFDE8 0x7FD5 #CJK UNIFIED IDEOGRAPH -0xFDE9 0x8208 #CJK UNIFIED IDEOGRAPH -0xFDEA 0x50D6 #CJK UNIFIED IDEOGRAPH -0xFDEB 0x51DE #CJK UNIFIED IDEOGRAPH -0xFDEC 0x559C #CJK UNIFIED IDEOGRAPH -0xFDED 0x566B #CJK UNIFIED IDEOGRAPH -0xFDEE 0x56CD #CJK UNIFIED IDEOGRAPH -0xFDEF 0x59EC #CJK UNIFIED IDEOGRAPH -0xFDF0 0x5B09 #CJK UNIFIED IDEOGRAPH -0xFDF1 0x5E0C #CJK UNIFIED IDEOGRAPH -0xFDF2 0x6199 #CJK UNIFIED IDEOGRAPH -0xFDF3 0x6198 #CJK UNIFIED IDEOGRAPH -0xFDF4 0x6231 #CJK UNIFIED IDEOGRAPH -0xFDF5 0x665E #CJK UNIFIED IDEOGRAPH -0xFDF6 0x66E6 #CJK UNIFIED IDEOGRAPH -0xFDF7 0x7199 #CJK UNIFIED IDEOGRAPH -0xFDF8 0x71B9 #CJK UNIFIED IDEOGRAPH -0xFDF9 0x71BA #CJK UNIFIED IDEOGRAPH -0xFDFA 0x72A7 #CJK UNIFIED IDEOGRAPH -0xFDFB 0x79A7 #CJK UNIFIED IDEOGRAPH -0xFDFC 0x7A00 #CJK UNIFIED IDEOGRAPH -0xFDFD 0x7FB2 #CJK UNIFIED IDEOGRAPH -0xFDFE 0x8A70 #CJK UNIFIED IDEOGRAPH diff --git a/Tools/unicode/python-mappings/JIS0208.TXT b/Tools/unicode/python-mappings/JIS0208.TXT deleted file mode 100644 index 0a9382c276082..0000000000000 --- a/Tools/unicode/python-mappings/JIS0208.TXT +++ /dev/null @@ -1,6942 +0,0 @@ -# JIS0208.TXT -# Date: 2015-12-02 23:50:00 GMT [KW] -# ? 2015 Unicode?, Inc. -# For terms of use, see http://www.unicode.org/terms_of_use.html -# -# Name: JIS X 0208 (1990) to Unicode -# Unicode version: 1.1 -# Table version: 2.0 -# Table format: Format A -# Date: 2011 October 14 (header updated: 2015 December 02) -# -# General notes: -# -# -# This table contains one set of mappings from JIS X 0208 (1990) into Unicode. -# Note that these data are *possible* mappings only and may not be the -# same as those used by actual products, nor may they be the best suited -# for all uses. For more information on the mappings between various code -# pages incorporating the repertoire of JIS X 0208 (1990) and Unicode, consult the -# VENDORS mapping data. -# -# -# Format: Four tab-separated columns -# Column #1 is the shift-JIS code (in hex) -# Column #2 is the JIS X 0208 code (in hex as 0xXXXX) -# Column #3 is the Unicode (in hex as 0xXXXX) -# Column #4 the Unicode name (follows a comment sign, '#') -# The official names for Unicode characters U+4E00 -# to U+9FA5, inclusive, is "CJK UNIFIED IDEOGRAPH-XXXX", -# where XXXX is the code point. Including all these -# names in this file increases its size substantially -# and needlessly. The token "" is used for the -# name of these characters. If necessary, it can be -# expanded algorithmically by a parser or editor. -# -# The entries are in JIS X 0208 order -# -# The following algorithms can be used to change the hex form -# of JIS 0208 to other standard forms: -# -# To change hex to EUC form, add 0x8080 -# To change hex to kuten form, first subtract 0x2020. Then -# the high and low bytes correspond to the ku and ten of -# the kuten form. For example, 0x2121 -> 0x0101 -> 0101; -# 0x7426 -> 0x5406 -> 8406 -# -# Revision History: -# -# [v2.0, 2015 December 02] -# updates to copyright notice and terms of use -# no changes to character mappings -# -# [v1.0, 2011 October 14] -# Updated terms of use to current wording. -# Updated contact information. -# No changes to the mapping data. -# -# [v0.9, 8 March 1994] -# First release. -# -# Use the Unicode reporting form -# for any questions or comments or to report errors in the data. -# -0x8140 0x2121 0x3000 # IDEOGRAPHIC SPACE -0x8141 0x2122 0x3001 # IDEOGRAPHIC COMMA -0x8142 0x2123 0x3002 # IDEOGRAPHIC FULL STOP -0x8143 0x2124 0xFF0C # FULLWIDTH COMMA -0x8144 0x2125 0xFF0E # FULLWIDTH FULL STOP -0x8145 0x2126 0x30FB # KATAKANA MIDDLE DOT -0x8146 0x2127 0xFF1A # FULLWIDTH COLON -0x8147 0x2128 0xFF1B # FULLWIDTH SEMICOLON -0x8148 0x2129 0xFF1F # FULLWIDTH QUESTION MARK -0x8149 0x212A 0xFF01 # FULLWIDTH EXCLAMATION MARK -0x814A 0x212B 0x309B # KATAKANA-HIRAGANA VOICED SOUND MARK -0x814B 0x212C 0x309C # KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK -0x814C 0x212D 0x00B4 # ACUTE ACCENT -0x814D 0x212E 0xFF40 # FULLWIDTH GRAVE ACCENT -0x814E 0x212F 0x00A8 # DIAERESIS -0x814F 0x2130 0xFF3E # FULLWIDTH CIRCUMFLEX ACCENT -0x8150 0x2131 0xFFE3 # FULLWIDTH MACRON -0x8151 0x2132 0xFF3F # FULLWIDTH LOW LINE -0x8152 0x2133 0x30FD # KATAKANA ITERATION MARK -0x8153 0x2134 0x30FE # KATAKANA VOICED ITERATION MARK -0x8154 0x2135 0x309D # HIRAGANA ITERATION MARK -0x8155 0x2136 0x309E # HIRAGANA VOICED ITERATION MARK -0x8156 0x2137 0x3003 # DITTO MARK -0x8157 0x2138 0x4EDD # -0x8158 0x2139 0x3005 # IDEOGRAPHIC ITERATION MARK -0x8159 0x213A 0x3006 # IDEOGRAPHIC CLOSING MARK -0x815A 0x213B 0x3007 # IDEOGRAPHIC NUMBER ZERO -0x815B 0x213C 0x30FC # KATAKANA-HIRAGANA PROLONGED SOUND MARK -0x815C 0x213D 0x2015 # HORIZONTAL BAR -0x815D 0x213E 0x2010 # HYPHEN -0x815E 0x213F 0xFF0F # FULLWIDTH SOLIDUS -0x815F 0x2140 0x005C # REVERSE SOLIDUS -0x8160 0x2141 0x301C # WAVE DASH -0x8161 0x2142 0x2016 # DOUBLE VERTICAL LINE -0x8162 0x2143 0xFF5C # FULLWIDTH VERTICAL LINE -0x8163 0x2144 0x2026 # HORIZONTAL ELLIPSIS -0x8164 0x2145 0x2025 # TWO DOT LEADER -0x8165 0x2146 0x2018 # LEFT SINGLE QUOTATION MARK -0x8166 0x2147 0x2019 # RIGHT SINGLE QUOTATION MARK -0x8167 0x2148 0x201C # LEFT DOUBLE QUOTATION MARK -0x8168 0x2149 0x201D # RIGHT DOUBLE QUOTATION MARK -0x8169 0x214A 0xFF08 # FULLWIDTH LEFT PARENTHESIS -0x816A 0x214B 0xFF09 # FULLWIDTH RIGHT PARENTHESIS -0x816B 0x214C 0x3014 # LEFT TORTOISE SHELL BRACKET -0x816C 0x214D 0x3015 # RIGHT TORTOISE SHELL BRACKET -0x816D 0x214E 0xFF3B # FULLWIDTH LEFT SQUARE BRACKET -0x816E 0x214F 0xFF3D # FULLWIDTH RIGHT SQUARE BRACKET -0x816F 0x2150 0xFF5B # FULLWIDTH LEFT CURLY BRACKET -0x8170 0x2151 0xFF5D # FULLWIDTH RIGHT CURLY BRACKET -0x8171 0x2152 0x3008 # LEFT ANGLE BRACKET -0x8172 0x2153 0x3009 # RIGHT ANGLE BRACKET -0x8173 0x2154 0x300A # LEFT DOUBLE ANGLE BRACKET -0x8174 0x2155 0x300B # RIGHT DOUBLE ANGLE BRACKET -0x8175 0x2156 0x300C # LEFT CORNER BRACKET -0x8176 0x2157 0x300D # RIGHT CORNER BRACKET -0x8177 0x2158 0x300E # LEFT WHITE CORNER BRACKET -0x8178 0x2159 0x300F # RIGHT WHITE CORNER BRACKET -0x8179 0x215A 0x3010 # LEFT BLACK LENTICULAR BRACKET -0x817A 0x215B 0x3011 # RIGHT BLACK LENTICULAR BRACKET -0x817B 0x215C 0xFF0B # FULLWIDTH PLUS SIGN -0x817C 0x215D 0x2212 # MINUS SIGN -0x817D 0x215E 0x00B1 # PLUS-MINUS SIGN -0x817E 0x215F 0x00D7 # MULTIPLICATION SIGN -0x8180 0x2160 0x00F7 # DIVISION SIGN -0x8181 0x2161 0xFF1D # FULLWIDTH EQUALS SIGN -0x8182 0x2162 0x2260 # NOT EQUAL TO -0x8183 0x2163 0xFF1C # FULLWIDTH LESS-THAN SIGN -0x8184 0x2164 0xFF1E # FULLWIDTH GREATER-THAN SIGN -0x8185 0x2165 0x2266 # LESS-THAN OVER EQUAL TO -0x8186 0x2166 0x2267 # GREATER-THAN OVER EQUAL TO -0x8187 0x2167 0x221E # INFINITY -0x8188 0x2168 0x2234 # THEREFORE -0x8189 0x2169 0x2642 # MALE SIGN -0x818A 0x216A 0x2640 # FEMALE SIGN -0x818B 0x216B 0x00B0 # DEGREE SIGN -0x818C 0x216C 0x2032 # PRIME -0x818D 0x216D 0x2033 # DOUBLE PRIME -0x818E 0x216E 0x2103 # DEGREE CELSIUS -0x818F 0x216F 0xFFE5 # FULLWIDTH YEN SIGN -0x8190 0x2170 0xFF04 # FULLWIDTH DOLLAR SIGN -0x8191 0x2171 0x00A2 # CENT SIGN -0x8192 0x2172 0x00A3 # POUND SIGN -0x8193 0x2173 0xFF05 # FULLWIDTH PERCENT SIGN -0x8194 0x2174 0xFF03 # FULLWIDTH NUMBER SIGN -0x8195 0x2175 0xFF06 # FULLWIDTH AMPERSAND -0x8196 0x2176 0xFF0A # FULLWIDTH ASTERISK -0x8197 0x2177 0xFF20 # FULLWIDTH COMMERCIAL AT -0x8198 0x2178 0x00A7 # SECTION SIGN -0x8199 0x2179 0x2606 # WHITE STAR -0x819A 0x217A 0x2605 # BLACK STAR -0x819B 0x217B 0x25CB # WHITE CIRCLE -0x819C 0x217C 0x25CF # BLACK CIRCLE -0x819D 0x217D 0x25CE # BULLSEYE -0x819E 0x217E 0x25C7 # WHITE DIAMOND -0x819F 0x2221 0x25C6 # BLACK DIAMOND -0x81A0 0x2222 0x25A1 # WHITE SQUARE -0x81A1 0x2223 0x25A0 # BLACK SQUARE -0x81A2 0x2224 0x25B3 # WHITE UP-POINTING TRIANGLE -0x81A3 0x2225 0x25B2 # BLACK UP-POINTING TRIANGLE -0x81A4 0x2226 0x25BD # WHITE DOWN-POINTING TRIANGLE -0x81A5 0x2227 0x25BC # BLACK DOWN-POINTING TRIANGLE -0x81A6 0x2228 0x203B # REFERENCE MARK -0x81A7 0x2229 0x3012 # POSTAL MARK -0x81A8 0x222A 0x2192 # RIGHTWARDS ARROW -0x81A9 0x222B 0x2190 # LEFTWARDS ARROW -0x81AA 0x222C 0x2191 # UPWARDS ARROW -0x81AB 0x222D 0x2193 # DOWNWARDS ARROW -0x81AC 0x222E 0x3013 # GETA MARK -0x81B8 0x223A 0x2208 # ELEMENT OF -0x81B9 0x223B 0x220B # CONTAINS AS MEMBER -0x81BA 0x223C 0x2286 # SUBSET OF OR EQUAL TO -0x81BB 0x223D 0x2287 # SUPERSET OF OR EQUAL TO -0x81BC 0x223E 0x2282 # SUBSET OF -0x81BD 0x223F 0x2283 # SUPERSET OF -0x81BE 0x2240 0x222A # UNION -0x81BF 0x2241 0x2229 # INTERSECTION -0x81C8 0x224A 0x2227 # LOGICAL AND -0x81C9 0x224B 0x2228 # LOGICAL OR -0x81CA 0x224C 0x00AC # NOT SIGN -0x81CB 0x224D 0x21D2 # RIGHTWARDS DOUBLE ARROW -0x81CC 0x224E 0x21D4 # LEFT RIGHT DOUBLE ARROW -0x81CD 0x224F 0x2200 # FOR ALL -0x81CE 0x2250 0x2203 # THERE EXISTS -0x81DA 0x225C 0x2220 # ANGLE -0x81DB 0x225D 0x22A5 # UP TACK -0x81DC 0x225E 0x2312 # ARC -0x81DD 0x225F 0x2202 # PARTIAL DIFFERENTIAL -0x81DE 0x2260 0x2207 # NABLA -0x81DF 0x2261 0x2261 # IDENTICAL TO -0x81E0 0x2262 0x2252 # APPROXIMATELY EQUAL TO OR THE IMAGE OF -0x81E1 0x2263 0x226A # MUCH LESS-THAN -0x81E2 0x2264 0x226B # MUCH GREATER-THAN -0x81E3 0x2265 0x221A # SQUARE ROOT -0x81E4 0x2266 0x223D # REVERSED TILDE -0x81E5 0x2267 0x221D # PROPORTIONAL TO -0x81E6 0x2268 0x2235 # BECAUSE -0x81E7 0x2269 0x222B # INTEGRAL -0x81E8 0x226A 0x222C # DOUBLE INTEGRAL -0x81F0 0x2272 0x212B # ANGSTROM SIGN -0x81F1 0x2273 0x2030 # PER MILLE SIGN -0x81F2 0x2274 0x266F # MUSIC SHARP SIGN -0x81F3 0x2275 0x266D # MUSIC FLAT SIGN -0x81F4 0x2276 0x266A # EIGHTH NOTE -0x81F5 0x2277 0x2020 # DAGGER -0x81F6 0x2278 0x2021 # DOUBLE DAGGER -0x81F7 0x2279 0x00B6 # PILCROW SIGN -0x81FC 0x227E 0x25EF # LARGE CIRCLE -0x824F 0x2330 0xFF10 # FULLWIDTH DIGIT ZERO -0x8250 0x2331 0xFF11 # FULLWIDTH DIGIT ONE -0x8251 0x2332 0xFF12 # FULLWIDTH DIGIT TWO -0x8252 0x2333 0xFF13 # FULLWIDTH DIGIT THREE -0x8253 0x2334 0xFF14 # FULLWIDTH DIGIT FOUR -0x8254 0x2335 0xFF15 # FULLWIDTH DIGIT FIVE -0x8255 0x2336 0xFF16 # FULLWIDTH DIGIT SIX -0x8256 0x2337 0xFF17 # FULLWIDTH DIGIT SEVEN -0x8257 0x2338 0xFF18 # FULLWIDTH DIGIT EIGHT -0x8258 0x2339 0xFF19 # FULLWIDTH DIGIT NINE -0x8260 0x2341 0xFF21 # FULLWIDTH LATIN CAPITAL LETTER A -0x8261 0x2342 0xFF22 # FULLWIDTH LATIN CAPITAL LETTER B -0x8262 0x2343 0xFF23 # FULLWIDTH LATIN CAPITAL LETTER C -0x8263 0x2344 0xFF24 # FULLWIDTH LATIN CAPITAL LETTER D -0x8264 0x2345 0xFF25 # FULLWIDTH LATIN CAPITAL LETTER E -0x8265 0x2346 0xFF26 # FULLWIDTH LATIN CAPITAL LETTER F -0x8266 0x2347 0xFF27 # FULLWIDTH LATIN CAPITAL LETTER G -0x8267 0x2348 0xFF28 # FULLWIDTH LATIN CAPITAL LETTER H -0x8268 0x2349 0xFF29 # FULLWIDTH LATIN CAPITAL LETTER I -0x8269 0x234A 0xFF2A # FULLWIDTH LATIN CAPITAL LETTER J -0x826A 0x234B 0xFF2B # FULLWIDTH LATIN CAPITAL LETTER K -0x826B 0x234C 0xFF2C # FULLWIDTH LATIN CAPITAL LETTER L -0x826C 0x234D 0xFF2D # FULLWIDTH LATIN CAPITAL LETTER M -0x826D 0x234E 0xFF2E # FULLWIDTH LATIN CAPITAL LETTER N -0x826E 0x234F 0xFF2F # FULLWIDTH LATIN CAPITAL LETTER O -0x826F 0x2350 0xFF30 # FULLWIDTH LATIN CAPITAL LETTER P -0x8270 0x2351 0xFF31 # FULLWIDTH LATIN CAPITAL LETTER Q -0x8271 0x2352 0xFF32 # FULLWIDTH LATIN CAPITAL LETTER R -0x8272 0x2353 0xFF33 # FULLWIDTH LATIN CAPITAL LETTER S -0x8273 0x2354 0xFF34 # FULLWIDTH LATIN CAPITAL LETTER T -0x8274 0x2355 0xFF35 # FULLWIDTH LATIN CAPITAL LETTER U -0x8275 0x2356 0xFF36 # FULLWIDTH LATIN CAPITAL LETTER V -0x8276 0x2357 0xFF37 # FULLWIDTH LATIN CAPITAL LETTER W -0x8277 0x2358 0xFF38 # FULLWIDTH LATIN CAPITAL LETTER X -0x8278 0x2359 0xFF39 # FULLWIDTH LATIN CAPITAL LETTER Y -0x8279 0x235A 0xFF3A # FULLWIDTH LATIN CAPITAL LETTER Z -0x8281 0x2361 0xFF41 # FULLWIDTH LATIN SMALL LETTER A -0x8282 0x2362 0xFF42 # FULLWIDTH LATIN SMALL LETTER B -0x8283 0x2363 0xFF43 # FULLWIDTH LATIN SMALL LETTER C -0x8284 0x2364 0xFF44 # FULLWIDTH LATIN SMALL LETTER D -0x8285 0x2365 0xFF45 # FULLWIDTH LATIN SMALL LETTER E -0x8286 0x2366 0xFF46 # FULLWIDTH LATIN SMALL LETTER F -0x8287 0x2367 0xFF47 # FULLWIDTH LATIN SMALL LETTER G -0x8288 0x2368 0xFF48 # FULLWIDTH LATIN SMALL LETTER H -0x8289 0x2369 0xFF49 # FULLWIDTH LATIN SMALL LETTER I -0x828A 0x236A 0xFF4A # FULLWIDTH LATIN SMALL LETTER J -0x828B 0x236B 0xFF4B # FULLWIDTH LATIN SMALL LETTER K -0x828C 0x236C 0xFF4C # FULLWIDTH LATIN SMALL LETTER L -0x828D 0x236D 0xFF4D # FULLWIDTH LATIN SMALL LETTER M -0x828E 0x236E 0xFF4E # FULLWIDTH LATIN SMALL LETTER N -0x828F 0x236F 0xFF4F # FULLWIDTH LATIN SMALL LETTER O -0x8290 0x2370 0xFF50 # FULLWIDTH LATIN SMALL LETTER P -0x8291 0x2371 0xFF51 # FULLWIDTH LATIN SMALL LETTER Q -0x8292 0x2372 0xFF52 # FULLWIDTH LATIN SMALL LETTER R -0x8293 0x2373 0xFF53 # FULLWIDTH LATIN SMALL LETTER S -0x8294 0x2374 0xFF54 # FULLWIDTH LATIN SMALL LETTER T -0x8295 0x2375 0xFF55 # FULLWIDTH LATIN SMALL LETTER U -0x8296 0x2376 0xFF56 # FULLWIDTH LATIN SMALL LETTER V -0x8297 0x2377 0xFF57 # FULLWIDTH LATIN SMALL LETTER W -0x8298 0x2378 0xFF58 # FULLWIDTH LATIN SMALL LETTER X -0x8299 0x2379 0xFF59 # FULLWIDTH LATIN SMALL LETTER Y -0x829A 0x237A 0xFF5A # FULLWIDTH LATIN SMALL LETTER Z -0x829F 0x2421 0x3041 # HIRAGANA LETTER SMALL A -0x82A0 0x2422 0x3042 # HIRAGANA LETTER A -0x82A1 0x2423 0x3043 # HIRAGANA LETTER SMALL I -0x82A2 0x2424 0x3044 # HIRAGANA LETTER I -0x82A3 0x2425 0x3045 # HIRAGANA LETTER SMALL U -0x82A4 0x2426 0x3046 # HIRAGANA LETTER U -0x82A5 0x2427 0x3047 # HIRAGANA LETTER SMALL E -0x82A6 0x2428 0x3048 # HIRAGANA LETTER E -0x82A7 0x2429 0x3049 # HIRAGANA LETTER SMALL O -0x82A8 0x242A 0x304A # HIRAGANA LETTER O -0x82A9 0x242B 0x304B # HIRAGANA LETTER KA -0x82AA 0x242C 0x304C # HIRAGANA LETTER GA -0x82AB 0x242D 0x304D # HIRAGANA LETTER KI -0x82AC 0x242E 0x304E # HIRAGANA LETTER GI -0x82AD 0x242F 0x304F # HIRAGANA LETTER KU -0x82AE 0x2430 0x3050 # HIRAGANA LETTER GU -0x82AF 0x2431 0x3051 # HIRAGANA LETTER KE -0x82B0 0x2432 0x3052 # HIRAGANA LETTER GE -0x82B1 0x2433 0x3053 # HIRAGANA LETTER KO -0x82B2 0x2434 0x3054 # HIRAGANA LETTER GO -0x82B3 0x2435 0x3055 # HIRAGANA LETTER SA -0x82B4 0x2436 0x3056 # HIRAGANA LETTER ZA -0x82B5 0x2437 0x3057 # HIRAGANA LETTER SI -0x82B6 0x2438 0x3058 # HIRAGANA LETTER ZI -0x82B7 0x2439 0x3059 # HIRAGANA LETTER SU -0x82B8 0x243A 0x305A # HIRAGANA LETTER ZU -0x82B9 0x243B 0x305B # HIRAGANA LETTER SE -0x82BA 0x243C 0x305C # HIRAGANA LETTER ZE -0x82BB 0x243D 0x305D # HIRAGANA LETTER SO -0x82BC 0x243E 0x305E # HIRAGANA LETTER ZO -0x82BD 0x243F 0x305F # HIRAGANA LETTER TA -0x82BE 0x2440 0x3060 # HIRAGANA LETTER DA -0x82BF 0x2441 0x3061 # HIRAGANA LETTER TI -0x82C0 0x2442 0x3062 # HIRAGANA LETTER DI -0x82C1 0x2443 0x3063 # HIRAGANA LETTER SMALL TU -0x82C2 0x2444 0x3064 # HIRAGANA LETTER TU -0x82C3 0x2445 0x3065 # HIRAGANA LETTER DU -0x82C4 0x2446 0x3066 # HIRAGANA LETTER TE -0x82C5 0x2447 0x3067 # HIRAGANA LETTER DE -0x82C6 0x2448 0x3068 # HIRAGANA LETTER TO -0x82C7 0x2449 0x3069 # HIRAGANA LETTER DO -0x82C8 0x244A 0x306A # HIRAGANA LETTER NA -0x82C9 0x244B 0x306B # HIRAGANA LETTER NI -0x82CA 0x244C 0x306C # HIRAGANA LETTER NU -0x82CB 0x244D 0x306D # HIRAGANA LETTER NE -0x82CC 0x244E 0x306E # HIRAGANA LETTER NO -0x82CD 0x244F 0x306F # HIRAGANA LETTER HA -0x82CE 0x2450 0x3070 # HIRAGANA LETTER BA -0x82CF 0x2451 0x3071 # HIRAGANA LETTER PA -0x82D0 0x2452 0x3072 # HIRAGANA LETTER HI -0x82D1 0x2453 0x3073 # HIRAGANA LETTER BI -0x82D2 0x2454 0x3074 # HIRAGANA LETTER PI -0x82D3 0x2455 0x3075 # HIRAGANA LETTER HU -0x82D4 0x2456 0x3076 # HIRAGANA LETTER BU -0x82D5 0x2457 0x3077 # HIRAGANA LETTER PU -0x82D6 0x2458 0x3078 # HIRAGANA LETTER HE -0x82D7 0x2459 0x3079 # HIRAGANA LETTER BE -0x82D8 0x245A 0x307A # HIRAGANA LETTER PE -0x82D9 0x245B 0x307B # HIRAGANA LETTER HO -0x82DA 0x245C 0x307C # HIRAGANA LETTER BO -0x82DB 0x245D 0x307D # HIRAGANA LETTER PO -0x82DC 0x245E 0x307E # HIRAGANA LETTER MA -0x82DD 0x245F 0x307F # HIRAGANA LETTER MI -0x82DE 0x2460 0x3080 # HIRAGANA LETTER MU -0x82DF 0x2461 0x3081 # HIRAGANA LETTER ME -0x82E0 0x2462 0x3082 # HIRAGANA LETTER MO -0x82E1 0x2463 0x3083 # HIRAGANA LETTER SMALL YA -0x82E2 0x2464 0x3084 # HIRAGANA LETTER YA -0x82E3 0x2465 0x3085 # HIRAGANA LETTER SMALL YU -0x82E4 0x2466 0x3086 # HIRAGANA LETTER YU -0x82E5 0x2467 0x3087 # HIRAGANA LETTER SMALL YO -0x82E6 0x2468 0x3088 # HIRAGANA LETTER YO -0x82E7 0x2469 0x3089 # HIRAGANA LETTER RA -0x82E8 0x246A 0x308A # HIRAGANA LETTER RI -0x82E9 0x246B 0x308B # HIRAGANA LETTER RU -0x82EA 0x246C 0x308C # HIRAGANA LETTER RE -0x82EB 0x246D 0x308D # HIRAGANA LETTER RO -0x82EC 0x246E 0x308E # HIRAGANA LETTER SMALL WA -0x82ED 0x246F 0x308F # HIRAGANA LETTER WA -0x82EE 0x2470 0x3090 # HIRAGANA LETTER WI -0x82EF 0x2471 0x3091 # HIRAGANA LETTER WE -0x82F0 0x2472 0x3092 # HIRAGANA LETTER WO -0x82F1 0x2473 0x3093 # HIRAGANA LETTER N -0x8340 0x2521 0x30A1 # KATAKANA LETTER SMALL A -0x8341 0x2522 0x30A2 # KATAKANA LETTER A -0x8342 0x2523 0x30A3 # KATAKANA LETTER SMALL I -0x8343 0x2524 0x30A4 # KATAKANA LETTER I -0x8344 0x2525 0x30A5 # KATAKANA LETTER SMALL U -0x8345 0x2526 0x30A6 # KATAKANA LETTER U -0x8346 0x2527 0x30A7 # KATAKANA LETTER SMALL E -0x8347 0x2528 0x30A8 # KATAKANA LETTER E -0x8348 0x2529 0x30A9 # KATAKANA LETTER SMALL O -0x8349 0x252A 0x30AA # KATAKANA LETTER O -0x834A 0x252B 0x30AB # KATAKANA LETTER KA -0x834B 0x252C 0x30AC # KATAKANA LETTER GA -0x834C 0x252D 0x30AD # KATAKANA LETTER KI -0x834D 0x252E 0x30AE # KATAKANA LETTER GI -0x834E 0x252F 0x30AF # KATAKANA LETTER KU -0x834F 0x2530 0x30B0 # KATAKANA LETTER GU -0x8350 0x2531 0x30B1 # KATAKANA LETTER KE -0x8351 0x2532 0x30B2 # KATAKANA LETTER GE -0x8352 0x2533 0x30B3 # KATAKANA LETTER KO -0x8353 0x2534 0x30B4 # KATAKANA LETTER GO -0x8354 0x2535 0x30B5 # KATAKANA LETTER SA -0x8355 0x2536 0x30B6 # KATAKANA LETTER ZA -0x8356 0x2537 0x30B7 # KATAKANA LETTER SI -0x8357 0x2538 0x30B8 # KATAKANA LETTER ZI -0x8358 0x2539 0x30B9 # KATAKANA LETTER SU -0x8359 0x253A 0x30BA # KATAKANA LETTER ZU -0x835A 0x253B 0x30BB # KATAKANA LETTER SE -0x835B 0x253C 0x30BC # KATAKANA LETTER ZE -0x835C 0x253D 0x30BD # KATAKANA LETTER SO -0x835D 0x253E 0x30BE # KATAKANA LETTER ZO -0x835E 0x253F 0x30BF # KATAKANA LETTER TA -0x835F 0x2540 0x30C0 # KATAKANA LETTER DA -0x8360 0x2541 0x30C1 # KATAKANA LETTER TI -0x8361 0x2542 0x30C2 # KATAKANA LETTER DI -0x8362 0x2543 0x30C3 # KATAKANA LETTER SMALL TU -0x8363 0x2544 0x30C4 # KATAKANA LETTER TU -0x8364 0x2545 0x30C5 # KATAKANA LETTER DU -0x8365 0x2546 0x30C6 # KATAKANA LETTER TE -0x8366 0x2547 0x30C7 # KATAKANA LETTER DE -0x8367 0x2548 0x30C8 # KATAKANA LETTER TO -0x8368 0x2549 0x30C9 # KATAKANA LETTER DO -0x8369 0x254A 0x30CA # KATAKANA LETTER NA -0x836A 0x254B 0x30CB # KATAKANA LETTER NI -0x836B 0x254C 0x30CC # KATAKANA LETTER NU -0x836C 0x254D 0x30CD # KATAKANA LETTER NE -0x836D 0x254E 0x30CE # KATAKANA LETTER NO -0x836E 0x254F 0x30CF # KATAKANA LETTER HA -0x836F 0x2550 0x30D0 # KATAKANA LETTER BA -0x8370 0x2551 0x30D1 # KATAKANA LETTER PA -0x8371 0x2552 0x30D2 # KATAKANA LETTER HI -0x8372 0x2553 0x30D3 # KATAKANA LETTER BI -0x8373 0x2554 0x30D4 # KATAKANA LETTER PI -0x8374 0x2555 0x30D5 # KATAKANA LETTER HU -0x8375 0x2556 0x30D6 # KATAKANA LETTER BU -0x8376 0x2557 0x30D7 # KATAKANA LETTER PU -0x8377 0x2558 0x30D8 # KATAKANA LETTER HE -0x8378 0x2559 0x30D9 # KATAKANA LETTER BE -0x8379 0x255A 0x30DA # KATAKANA LETTER PE -0x837A 0x255B 0x30DB # KATAKANA LETTER HO -0x837B 0x255C 0x30DC # KATAKANA LETTER BO -0x837C 0x255D 0x30DD # KATAKANA LETTER PO -0x837D 0x255E 0x30DE # KATAKANA LETTER MA -0x837E 0x255F 0x30DF # KATAKANA LETTER MI -0x8380 0x2560 0x30E0 # KATAKANA LETTER MU -0x8381 0x2561 0x30E1 # KATAKANA LETTER ME -0x8382 0x2562 0x30E2 # KATAKANA LETTER MO -0x8383 0x2563 0x30E3 # KATAKANA LETTER SMALL YA -0x8384 0x2564 0x30E4 # KATAKANA LETTER YA -0x8385 0x2565 0x30E5 # KATAKANA LETTER SMALL YU -0x8386 0x2566 0x30E6 # KATAKANA LETTER YU -0x8387 0x2567 0x30E7 # KATAKANA LETTER SMALL YO -0x8388 0x2568 0x30E8 # KATAKANA LETTER YO -0x8389 0x2569 0x30E9 # KATAKANA LETTER RA -0x838A 0x256A 0x30EA # KATAKANA LETTER RI -0x838B 0x256B 0x30EB # KATAKANA LETTER RU -0x838C 0x256C 0x30EC # KATAKANA LETTER RE -0x838D 0x256D 0x30ED # KATAKANA LETTER RO -0x838E 0x256E 0x30EE # KATAKANA LETTER SMALL WA -0x838F 0x256F 0x30EF # KATAKANA LETTER WA -0x8390 0x2570 0x30F0 # KATAKANA LETTER WI -0x8391 0x2571 0x30F1 # KATAKANA LETTER WE -0x8392 0x2572 0x30F2 # KATAKANA LETTER WO -0x8393 0x2573 0x30F3 # KATAKANA LETTER N -0x8394 0x2574 0x30F4 # KATAKANA LETTER VU -0x8395 0x2575 0x30F5 # KATAKANA LETTER SMALL KA -0x8396 0x2576 0x30F6 # KATAKANA LETTER SMALL KE -0x839F 0x2621 0x0391 # GREEK CAPITAL LETTER ALPHA -0x83A0 0x2622 0x0392 # GREEK CAPITAL LETTER BETA -0x83A1 0x2623 0x0393 # GREEK CAPITAL LETTER GAMMA -0x83A2 0x2624 0x0394 # GREEK CAPITAL LETTER DELTA -0x83A3 0x2625 0x0395 # GREEK CAPITAL LETTER EPSILON -0x83A4 0x2626 0x0396 # GREEK CAPITAL LETTER ZETA -0x83A5 0x2627 0x0397 # GREEK CAPITAL LETTER ETA -0x83A6 0x2628 0x0398 # GREEK CAPITAL LETTER THETA -0x83A7 0x2629 0x0399 # GREEK CAPITAL LETTER IOTA -0x83A8 0x262A 0x039A # GREEK CAPITAL LETTER KAPPA -0x83A9 0x262B 0x039B # GREEK CAPITAL LETTER LAMDA -0x83AA 0x262C 0x039C # GREEK CAPITAL LETTER MU -0x83AB 0x262D 0x039D # GREEK CAPITAL LETTER NU -0x83AC 0x262E 0x039E # GREEK CAPITAL LETTER XI -0x83AD 0x262F 0x039F # GREEK CAPITAL LETTER OMICRON -0x83AE 0x2630 0x03A0 # GREEK CAPITAL LETTER PI -0x83AF 0x2631 0x03A1 # GREEK CAPITAL LETTER RHO -0x83B0 0x2632 0x03A3 # GREEK CAPITAL LETTER SIGMA -0x83B1 0x2633 0x03A4 # GREEK CAPITAL LETTER TAU -0x83B2 0x2634 0x03A5 # GREEK CAPITAL LETTER UPSILON -0x83B3 0x2635 0x03A6 # GREEK CAPITAL LETTER PHI -0x83B4 0x2636 0x03A7 # GREEK CAPITAL LETTER CHI -0x83B5 0x2637 0x03A8 # GREEK CAPITAL LETTER PSI -0x83B6 0x2638 0x03A9 # GREEK CAPITAL LETTER OMEGA -0x83BF 0x2641 0x03B1 # GREEK SMALL LETTER ALPHA -0x83C0 0x2642 0x03B2 # GREEK SMALL LETTER BETA -0x83C1 0x2643 0x03B3 # GREEK SMALL LETTER GAMMA -0x83C2 0x2644 0x03B4 # GREEK SMALL LETTER DELTA -0x83C3 0x2645 0x03B5 # GREEK SMALL LETTER EPSILON -0x83C4 0x2646 0x03B6 # GREEK SMALL LETTER ZETA -0x83C5 0x2647 0x03B7 # GREEK SMALL LETTER ETA -0x83C6 0x2648 0x03B8 # GREEK SMALL LETTER THETA -0x83C7 0x2649 0x03B9 # GREEK SMALL LETTER IOTA -0x83C8 0x264A 0x03BA # GREEK SMALL LETTER KAPPA -0x83C9 0x264B 0x03BB # GREEK SMALL LETTER LAMDA -0x83CA 0x264C 0x03BC # GREEK SMALL LETTER MU -0x83CB 0x264D 0x03BD # GREEK SMALL LETTER NU -0x83CC 0x264E 0x03BE # GREEK SMALL LETTER XI -0x83CD 0x264F 0x03BF # GREEK SMALL LETTER OMICRON -0x83CE 0x2650 0x03C0 # GREEK SMALL LETTER PI -0x83CF 0x2651 0x03C1 # GREEK SMALL LETTER RHO -0x83D0 0x2652 0x03C3 # GREEK SMALL LETTER SIGMA -0x83D1 0x2653 0x03C4 # GREEK SMALL LETTER TAU -0x83D2 0x2654 0x03C5 # GREEK SMALL LETTER UPSILON -0x83D3 0x2655 0x03C6 # GREEK SMALL LETTER PHI -0x83D4 0x2656 0x03C7 # GREEK SMALL LETTER CHI -0x83D5 0x2657 0x03C8 # GREEK SMALL LETTER PSI -0x83D6 0x2658 0x03C9 # GREEK SMALL LETTER OMEGA -0x8440 0x2721 0x0410 # CYRILLIC CAPITAL LETTER A -0x8441 0x2722 0x0411 # CYRILLIC CAPITAL LETTER BE -0x8442 0x2723 0x0412 # CYRILLIC CAPITAL LETTER VE -0x8443 0x2724 0x0413 # CYRILLIC CAPITAL LETTER GHE -0x8444 0x2725 0x0414 # CYRILLIC CAPITAL LETTER DE -0x8445 0x2726 0x0415 # CYRILLIC CAPITAL LETTER IE -0x8446 0x2727 0x0401 # CYRILLIC CAPITAL LETTER IO -0x8447 0x2728 0x0416 # CYRILLIC CAPITAL LETTER ZHE -0x8448 0x2729 0x0417 # CYRILLIC CAPITAL LETTER ZE -0x8449 0x272A 0x0418 # CYRILLIC CAPITAL LETTER I -0x844A 0x272B 0x0419 # CYRILLIC CAPITAL LETTER SHORT I -0x844B 0x272C 0x041A # CYRILLIC CAPITAL LETTER KA -0x844C 0x272D 0x041B # CYRILLIC CAPITAL LETTER EL -0x844D 0x272E 0x041C # CYRILLIC CAPITAL LETTER EM -0x844E 0x272F 0x041D # CYRILLIC CAPITAL LETTER EN -0x844F 0x2730 0x041E # CYRILLIC CAPITAL LETTER O -0x8450 0x2731 0x041F # CYRILLIC CAPITAL LETTER PE -0x8451 0x2732 0x0420 # CYRILLIC CAPITAL LETTER ER -0x8452 0x2733 0x0421 # CYRILLIC CAPITAL LETTER ES -0x8453 0x2734 0x0422 # CYRILLIC CAPITAL LETTER TE -0x8454 0x2735 0x0423 # CYRILLIC CAPITAL LETTER U -0x8455 0x2736 0x0424 # CYRILLIC CAPITAL LETTER EF -0x8456 0x2737 0x0425 # CYRILLIC CAPITAL LETTER HA -0x8457 0x2738 0x0426 # CYRILLIC CAPITAL LETTER TSE -0x8458 0x2739 0x0427 # CYRILLIC CAPITAL LETTER CHE -0x8459 0x273A 0x0428 # CYRILLIC CAPITAL LETTER SHA -0x845A 0x273B 0x0429 # CYRILLIC CAPITAL LETTER SHCHA -0x845B 0x273C 0x042A # CYRILLIC CAPITAL LETTER HARD SIGN -0x845C 0x273D 0x042B # CYRILLIC CAPITAL LETTER YERU -0x845D 0x273E 0x042C # CYRILLIC CAPITAL LETTER SOFT SIGN -0x845E 0x273F 0x042D # CYRILLIC CAPITAL LETTER E -0x845F 0x2740 0x042E # CYRILLIC CAPITAL LETTER YU -0x8460 0x2741 0x042F # CYRILLIC CAPITAL LETTER YA -0x8470 0x2751 0x0430 # CYRILLIC SMALL LETTER A -0x8471 0x2752 0x0431 # CYRILLIC SMALL LETTER BE -0x8472 0x2753 0x0432 # CYRILLIC SMALL LETTER VE -0x8473 0x2754 0x0433 # CYRILLIC SMALL LETTER GHE -0x8474 0x2755 0x0434 # CYRILLIC SMALL LETTER DE -0x8475 0x2756 0x0435 # CYRILLIC SMALL LETTER IE -0x8476 0x2757 0x0451 # CYRILLIC SMALL LETTER IO -0x8477 0x2758 0x0436 # CYRILLIC SMALL LETTER ZHE -0x8478 0x2759 0x0437 # CYRILLIC SMALL LETTER ZE -0x8479 0x275A 0x0438 # CYRILLIC SMALL LETTER I -0x847A 0x275B 0x0439 # CYRILLIC SMALL LETTER SHORT I -0x847B 0x275C 0x043A # CYRILLIC SMALL LETTER KA -0x847C 0x275D 0x043B # CYRILLIC SMALL LETTER EL -0x847D 0x275E 0x043C # CYRILLIC SMALL LETTER EM -0x847E 0x275F 0x043D # CYRILLIC SMALL LETTER EN -0x8480 0x2760 0x043E # CYRILLIC SMALL LETTER O -0x8481 0x2761 0x043F # CYRILLIC SMALL LETTER PE -0x8482 0x2762 0x0440 # CYRILLIC SMALL LETTER ER -0x8483 0x2763 0x0441 # CYRILLIC SMALL LETTER ES -0x8484 0x2764 0x0442 # CYRILLIC SMALL LETTER TE -0x8485 0x2765 0x0443 # CYRILLIC SMALL LETTER U -0x8486 0x2766 0x0444 # CYRILLIC SMALL LETTER EF -0x8487 0x2767 0x0445 # CYRILLIC SMALL LETTER HA -0x8488 0x2768 0x0446 # CYRILLIC SMALL LETTER TSE -0x8489 0x2769 0x0447 # CYRILLIC SMALL LETTER CHE -0x848A 0x276A 0x0448 # CYRILLIC SMALL LETTER SHA -0x848B 0x276B 0x0449 # CYRILLIC SMALL LETTER SHCHA -0x848C 0x276C 0x044A # CYRILLIC SMALL LETTER HARD SIGN -0x848D 0x276D 0x044B # CYRILLIC SMALL LETTER YERU -0x848E 0x276E 0x044C # CYRILLIC SMALL LETTER SOFT SIGN -0x848F 0x276F 0x044D # CYRILLIC SMALL LETTER E -0x8490 0x2770 0x044E # CYRILLIC SMALL LETTER YU -0x8491 0x2771 0x044F # CYRILLIC SMALL LETTER YA -0x849F 0x2821 0x2500 # BOX DRAWINGS LIGHT HORIZONTAL -0x84A0 0x2822 0x2502 # BOX DRAWINGS LIGHT VERTICAL -0x84A1 0x2823 0x250C # BOX DRAWINGS LIGHT DOWN AND RIGHT -0x84A2 0x2824 0x2510 # BOX DRAWINGS LIGHT DOWN AND LEFT -0x84A3 0x2825 0x2518 # BOX DRAWINGS LIGHT UP AND LEFT -0x84A4 0x2826 0x2514 # BOX DRAWINGS LIGHT UP AND RIGHT -0x84A5 0x2827 0x251C # BOX DRAWINGS LIGHT VERTICAL AND RIGHT -0x84A6 0x2828 0x252C # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL -0x84A7 0x2829 0x2524 # BOX DRAWINGS LIGHT VERTICAL AND LEFT -0x84A8 0x282A 0x2534 # BOX DRAWINGS LIGHT UP AND HORIZONTAL -0x84A9 0x282B 0x253C # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL -0x84AA 0x282C 0x2501 # BOX DRAWINGS HEAVY HORIZONTAL -0x84AB 0x282D 0x2503 # BOX DRAWINGS HEAVY VERTICAL -0x84AC 0x282E 0x250F # BOX DRAWINGS HEAVY DOWN AND RIGHT -0x84AD 0x282F 0x2513 # BOX DRAWINGS HEAVY DOWN AND LEFT -0x84AE 0x2830 0x251B # BOX DRAWINGS HEAVY UP AND LEFT -0x84AF 0x2831 0x2517 # BOX DRAWINGS HEAVY UP AND RIGHT -0x84B0 0x2832 0x2523 # BOX DRAWINGS HEAVY VERTICAL AND RIGHT -0x84B1 0x2833 0x2533 # BOX DRAWINGS HEAVY DOWN AND HORIZONTAL -0x84B2 0x2834 0x252B # BOX DRAWINGS HEAVY VERTICAL AND LEFT -0x84B3 0x2835 0x253B # BOX DRAWINGS HEAVY UP AND HORIZONTAL -0x84B4 0x2836 0x254B # BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL -0x84B5 0x2837 0x2520 # BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT -0x84B6 0x2838 0x252F # BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY -0x84B7 0x2839 0x2528 # BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT -0x84B8 0x283A 0x2537 # BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY -0x84B9 0x283B 0x253F # BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY -0x84BA 0x283C 0x251D # BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY -0x84BB 0x283D 0x2530 # BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT -0x84BC 0x283E 0x2525 # BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY -0x84BD 0x283F 0x2538 # BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT -0x84BE 0x2840 0x2542 # BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT -0x889F 0x3021 0x4E9C # -0x88A0 0x3022 0x5516 # -0x88A1 0x3023 0x5A03 # -0x88A2 0x3024 0x963F # -0x88A3 0x3025 0x54C0 # -0x88A4 0x3026 0x611B # -0x88A5 0x3027 0x6328 # -0x88A6 0x3028 0x59F6 # -0x88A7 0x3029 0x9022 # -0x88A8 0x302A 0x8475 # -0x88A9 0x302B 0x831C # -0x88AA 0x302C 0x7A50 # -0x88AB 0x302D 0x60AA # -0x88AC 0x302E 0x63E1 # -0x88AD 0x302F 0x6E25 # -0x88AE 0x3030 0x65ED # -0x88AF 0x3031 0x8466 # -0x88B0 0x3032 0x82A6 # -0x88B1 0x3033 0x9BF5 # -0x88B2 0x3034 0x6893 # -0x88B3 0x3035 0x5727 # -0x88B4 0x3036 0x65A1 # -0x88B5 0x3037 0x6271 # -0x88B6 0x3038 0x5B9B # -0x88B7 0x3039 0x59D0 # -0x88B8 0x303A 0x867B # -0x88B9 0x303B 0x98F4 # -0x88BA 0x303C 0x7D62 # -0x88BB 0x303D 0x7DBE # -0x88BC 0x303E 0x9B8E # -0x88BD 0x303F 0x6216 # -0x88BE 0x3040 0x7C9F # -0x88BF 0x3041 0x88B7 # -0x88C0 0x3042 0x5B89 # -0x88C1 0x3043 0x5EB5 # -0x88C2 0x3044 0x6309 # -0x88C3 0x3045 0x6697 # -0x88C4 0x3046 0x6848 # -0x88C5 0x3047 0x95C7 # -0x88C6 0x3048 0x978D # -0x88C7 0x3049 0x674F # -0x88C8 0x304A 0x4EE5 # -0x88C9 0x304B 0x4F0A # -0x88CA 0x304C 0x4F4D # -0x88CB 0x304D 0x4F9D # -0x88CC 0x304E 0x5049 # -0x88CD 0x304F 0x56F2 # -0x88CE 0x3050 0x5937 # -0x88CF 0x3051 0x59D4 # -0x88D0 0x3052 0x5A01 # -0x88D1 0x3053 0x5C09 # -0x88D2 0x3054 0x60DF # -0x88D3 0x3055 0x610F # -0x88D4 0x3056 0x6170 # -0x88D5 0x3057 0x6613 # -0x88D6 0x3058 0x6905 # -0x88D7 0x3059 0x70BA # -0x88D8 0x305A 0x754F # -0x88D9 0x305B 0x7570 # -0x88DA 0x305C 0x79FB # -0x88DB 0x305D 0x7DAD # -0x88DC 0x305E 0x7DEF # -0x88DD 0x305F 0x80C3 # -0x88DE 0x3060 0x840E # -0x88DF 0x3061 0x8863 # -0x88E0 0x3062 0x8B02 # -0x88E1 0x3063 0x9055 # -0x88E2 0x3064 0x907A # -0x88E3 0x3065 0x533B # -0x88E4 0x3066 0x4E95 # -0x88E5 0x3067 0x4EA5 # -0x88E6 0x3068 0x57DF # -0x88E7 0x3069 0x80B2 # -0x88E8 0x306A 0x90C1 # -0x88E9 0x306B 0x78EF # -0x88EA 0x306C 0x4E00 # -0x88EB 0x306D 0x58F1 # -0x88EC 0x306E 0x6EA2 # -0x88ED 0x306F 0x9038 # -0x88EE 0x3070 0x7A32 # -0x88EF 0x3071 0x8328 # -0x88F0 0x3072 0x828B # -0x88F1 0x3073 0x9C2F # -0x88F2 0x3074 0x5141 # -0x88F3 0x3075 0x5370 # -0x88F4 0x3076 0x54BD # -0x88F5 0x3077 0x54E1 # -0x88F6 0x3078 0x56E0 # -0x88F7 0x3079 0x59FB # -0x88F8 0x307A 0x5F15 # -0x88F9 0x307B 0x98F2 # -0x88FA 0x307C 0x6DEB # -0x88FB 0x307D 0x80E4 # -0x88FC 0x307E 0x852D # -0x8940 0x3121 0x9662 # -0x8941 0x3122 0x9670 # -0x8942 0x3123 0x96A0 # -0x8943 0x3124 0x97FB # -0x8944 0x3125 0x540B # -0x8945 0x3126 0x53F3 # -0x8946 0x3127 0x5B87 # -0x8947 0x3128 0x70CF # -0x8948 0x3129 0x7FBD # -0x8949 0x312A 0x8FC2 # -0x894A 0x312B 0x96E8 # -0x894B 0x312C 0x536F # -0x894C 0x312D 0x9D5C # -0x894D 0x312E 0x7ABA # -0x894E 0x312F 0x4E11 # -0x894F 0x3130 0x7893 # -0x8950 0x3131 0x81FC # -0x8951 0x3132 0x6E26 # -0x8952 0x3133 0x5618 # -0x8953 0x3134 0x5504 # -0x8954 0x3135 0x6B1D # -0x8955 0x3136 0x851A # -0x8956 0x3137 0x9C3B # -0x8957 0x3138 0x59E5 # -0x8958 0x3139 0x53A9 # -0x8959 0x313A 0x6D66 # -0x895A 0x313B 0x74DC # -0x895B 0x313C 0x958F # -0x895C 0x313D 0x5642 # -0x895D 0x313E 0x4E91 # -0x895E 0x313F 0x904B # -0x895F 0x3140 0x96F2 # -0x8960 0x3141 0x834F # -0x8961 0x3142 0x990C # -0x8962 0x3143 0x53E1 # -0x8963 0x3144 0x55B6 # -0x8964 0x3145 0x5B30 # -0x8965 0x3146 0x5F71 # -0x8966 0x3147 0x6620 # -0x8967 0x3148 0x66F3 # -0x8968 0x3149 0x6804 # -0x8969 0x314A 0x6C38 # -0x896A 0x314B 0x6CF3 # -0x896B 0x314C 0x6D29 # -0x896C 0x314D 0x745B # -0x896D 0x314E 0x76C8 # -0x896E 0x314F 0x7A4E # -0x896F 0x3150 0x9834 # -0x8970 0x3151 0x82F1 # -0x8971 0x3152 0x885B # -0x8972 0x3153 0x8A60 # -0x8973 0x3154 0x92ED # -0x8974 0x3155 0x6DB2 # -0x8975 0x3156 0x75AB # -0x8976 0x3157 0x76CA # -0x8977 0x3158 0x99C5 # -0x8978 0x3159 0x60A6 # -0x8979 0x315A 0x8B01 # -0x897A 0x315B 0x8D8A # -0x897B 0x315C 0x95B2 # -0x897C 0x315D 0x698E # -0x897D 0x315E 0x53AD # -0x897E 0x315F 0x5186 # -0x8980 0x3160 0x5712 # -0x8981 0x3161 0x5830 # -0x8982 0x3162 0x5944 # -0x8983 0x3163 0x5BB4 # -0x8984 0x3164 0x5EF6 # -0x8985 0x3165 0x6028 # -0x8986 0x3166 0x63A9 # -0x8987 0x3167 0x63F4 # -0x8988 0x3168 0x6CBF # -0x8989 0x3169 0x6F14 # -0x898A 0x316A 0x708E # -0x898B 0x316B 0x7114 # -0x898C 0x316C 0x7159 # -0x898D 0x316D 0x71D5 # -0x898E 0x316E 0x733F # -0x898F 0x316F 0x7E01 # -0x8990 0x3170 0x8276 # -0x8991 0x3171 0x82D1 # -0x8992 0x3172 0x8597 # -0x8993 0x3173 0x9060 # -0x8994 0x3174 0x925B # -0x8995 0x3175 0x9D1B # -0x8996 0x3176 0x5869 # -0x8997 0x3177 0x65BC # -0x8998 0x3178 0x6C5A # -0x8999 0x3179 0x7525 # -0x899A 0x317A 0x51F9 # -0x899B 0x317B 0x592E # -0x899C 0x317C 0x5965 # -0x899D 0x317D 0x5F80 # -0x899E 0x317E 0x5FDC # -0x899F 0x3221 0x62BC # -0x89A0 0x3222 0x65FA # -0x89A1 0x3223 0x6A2A # -0x89A2 0x3224 0x6B27 # -0x89A3 0x3225 0x6BB4 # -0x89A4 0x3226 0x738B # -0x89A5 0x3227 0x7FC1 # -0x89A6 0x3228 0x8956 # -0x89A7 0x3229 0x9D2C # -0x89A8 0x322A 0x9D0E # -0x89A9 0x322B 0x9EC4 # -0x89AA 0x322C 0x5CA1 # -0x89AB 0x322D 0x6C96 # -0x89AC 0x322E 0x837B # -0x89AD 0x322F 0x5104 # -0x89AE 0x3230 0x5C4B # -0x89AF 0x3231 0x61B6 # -0x89B0 0x3232 0x81C6 # -0x89B1 0x3233 0x6876 # -0x89B2 0x3234 0x7261 # -0x89B3 0x3235 0x4E59 # -0x89B4 0x3236 0x4FFA # -0x89B5 0x3237 0x5378 # -0x89B6 0x3238 0x6069 # -0x89B7 0x3239 0x6E29 # -0x89B8 0x323A 0x7A4F # -0x89B9 0x323B 0x97F3 # -0x89BA 0x323C 0x4E0B # -0x89BB 0x323D 0x5316 # -0x89BC 0x323E 0x4EEE # -0x89BD 0x323F 0x4F55 # -0x89BE 0x3240 0x4F3D # -0x89BF 0x3241 0x4FA1 # -0x89C0 0x3242 0x4F73 # -0x89C1 0x3243 0x52A0 # -0x89C2 0x3244 0x53EF # -0x89C3 0x3245 0x5609 # -0x89C4 0x3246 0x590F # -0x89C5 0x3247 0x5AC1 # -0x89C6 0x3248 0x5BB6 # -0x89C7 0x3249 0x5BE1 # -0x89C8 0x324A 0x79D1 # -0x89C9 0x324B 0x6687 # -0x89CA 0x324C 0x679C # -0x89CB 0x324D 0x67B6 # -0x89CC 0x324E 0x6B4C # -0x89CD 0x324F 0x6CB3 # -0x89CE 0x3250 0x706B # -0x89CF 0x3251 0x73C2 # -0x89D0 0x3252 0x798D # -0x89D1 0x3253 0x79BE # -0x89D2 0x3254 0x7A3C # -0x89D3 0x3255 0x7B87 # -0x89D4 0x3256 0x82B1 # -0x89D5 0x3257 0x82DB # -0x89D6 0x3258 0x8304 # -0x89D7 0x3259 0x8377 # -0x89D8 0x325A 0x83EF # -0x89D9 0x325B 0x83D3 # -0x89DA 0x325C 0x8766 # -0x89DB 0x325D 0x8AB2 # -0x89DC 0x325E 0x5629 # -0x89DD 0x325F 0x8CA8 # -0x89DE 0x3260 0x8FE6 # -0x89DF 0x3261 0x904E # -0x89E0 0x3262 0x971E # -0x89E1 0x3263 0x868A # -0x89E2 0x3264 0x4FC4 # -0x89E3 0x3265 0x5CE8 # -0x89E4 0x3266 0x6211 # -0x89E5 0x3267 0x7259 # -0x89E6 0x3268 0x753B # -0x89E7 0x3269 0x81E5 # -0x89E8 0x326A 0x82BD # -0x89E9 0x326B 0x86FE # -0x89EA 0x326C 0x8CC0 # -0x89EB 0x326D 0x96C5 # -0x89EC 0x326E 0x9913 # -0x89ED 0x326F 0x99D5 # -0x89EE 0x3270 0x4ECB # -0x89EF 0x3271 0x4F1A # -0x89F0 0x3272 0x89E3 # -0x89F1 0x3273 0x56DE # -0x89F2 0x3274 0x584A # -0x89F3 0x3275 0x58CA # -0x89F4 0x3276 0x5EFB # -0x89F5 0x3277 0x5FEB # -0x89F6 0x3278 0x602A # -0x89F7 0x3279 0x6094 # -0x89F8 0x327A 0x6062 # -0x89F9 0x327B 0x61D0 # -0x89FA 0x327C 0x6212 # -0x89FB 0x327D 0x62D0 # -0x89FC 0x327E 0x6539 # -0x8A40 0x3321 0x9B41 # -0x8A41 0x3322 0x6666 # -0x8A42 0x3323 0x68B0 # -0x8A43 0x3324 0x6D77 # -0x8A44 0x3325 0x7070 # -0x8A45 0x3326 0x754C # -0x8A46 0x3327 0x7686 # -0x8A47 0x3328 0x7D75 # -0x8A48 0x3329 0x82A5 # -0x8A49 0x332A 0x87F9 # -0x8A4A 0x332B 0x958B # -0x8A4B 0x332C 0x968E # -0x8A4C 0x332D 0x8C9D # -0x8A4D 0x332E 0x51F1 # -0x8A4E 0x332F 0x52BE # -0x8A4F 0x3330 0x5916 # -0x8A50 0x3331 0x54B3 # -0x8A51 0x3332 0x5BB3 # -0x8A52 0x3333 0x5D16 # -0x8A53 0x3334 0x6168 # -0x8A54 0x3335 0x6982 # -0x8A55 0x3336 0x6DAF # -0x8A56 0x3337 0x788D # -0x8A57 0x3338 0x84CB # -0x8A58 0x3339 0x8857 # -0x8A59 0x333A 0x8A72 # -0x8A5A 0x333B 0x93A7 # -0x8A5B 0x333C 0x9AB8 # -0x8A5C 0x333D 0x6D6C # -0x8A5D 0x333E 0x99A8 # -0x8A5E 0x333F 0x86D9 # -0x8A5F 0x3340 0x57A3 # -0x8A60 0x3341 0x67FF # -0x8A61 0x3342 0x86CE # -0x8A62 0x3343 0x920E # -0x8A63 0x3344 0x5283 # -0x8A64 0x3345 0x5687 # -0x8A65 0x3346 0x5404 # -0x8A66 0x3347 0x5ED3 # -0x8A67 0x3348 0x62E1 # -0x8A68 0x3349 0x64B9 # -0x8A69 0x334A 0x683C # -0x8A6A 0x334B 0x6838 # -0x8A6B 0x334C 0x6BBB # -0x8A6C 0x334D 0x7372 # -0x8A6D 0x334E 0x78BA # -0x8A6E 0x334F 0x7A6B # -0x8A6F 0x3350 0x899A # -0x8A70 0x3351 0x89D2 # -0x8A71 0x3352 0x8D6B # -0x8A72 0x3353 0x8F03 # -0x8A73 0x3354 0x90ED # -0x8A74 0x3355 0x95A3 # -0x8A75 0x3356 0x9694 # -0x8A76 0x3357 0x9769 # -0x8A77 0x3358 0x5B66 # -0x8A78 0x3359 0x5CB3 # -0x8A79 0x335A 0x697D # -0x8A7A 0x335B 0x984D # -0x8A7B 0x335C 0x984E # -0x8A7C 0x335D 0x639B # -0x8A7D 0x335E 0x7B20 # -0x8A7E 0x335F 0x6A2B # -0x8A80 0x3360 0x6A7F # -0x8A81 0x3361 0x68B6 # -0x8A82 0x3362 0x9C0D # -0x8A83 0x3363 0x6F5F # -0x8A84 0x3364 0x5272 # -0x8A85 0x3365 0x559D # -0x8A86 0x3366 0x6070 # -0x8A87 0x3367 0x62EC # -0x8A88 0x3368 0x6D3B # -0x8A89 0x3369 0x6E07 # -0x8A8A 0x336A 0x6ED1 # -0x8A8B 0x336B 0x845B # -0x8A8C 0x336C 0x8910 # -0x8A8D 0x336D 0x8F44 # -0x8A8E 0x336E 0x4E14 # -0x8A8F 0x336F 0x9C39 # -0x8A90 0x3370 0x53F6 # -0x8A91 0x3371 0x691B # -0x8A92 0x3372 0x6A3A # -0x8A93 0x3373 0x9784 # -0x8A94 0x3374 0x682A # -0x8A95 0x3375 0x515C # -0x8A96 0x3376 0x7AC3 # -0x8A97 0x3377 0x84B2 # -0x8A98 0x3378 0x91DC # -0x8A99 0x3379 0x938C # -0x8A9A 0x337A 0x565B # -0x8A9B 0x337B 0x9D28 # -0x8A9C 0x337C 0x6822 # -0x8A9D 0x337D 0x8305 # -0x8A9E 0x337E 0x8431 # -0x8A9F 0x3421 0x7CA5 # -0x8AA0 0x3422 0x5208 # -0x8AA1 0x3423 0x82C5 # -0x8AA2 0x3424 0x74E6 # -0x8AA3 0x3425 0x4E7E # -0x8AA4 0x3426 0x4F83 # -0x8AA5 0x3427 0x51A0 # -0x8AA6 0x3428 0x5BD2 # -0x8AA7 0x3429 0x520A # -0x8AA8 0x342A 0x52D8 # -0x8AA9 0x342B 0x52E7 # -0x8AAA 0x342C 0x5DFB # -0x8AAB 0x342D 0x559A # -0x8AAC 0x342E 0x582A # -0x8AAD 0x342F 0x59E6 # -0x8AAE 0x3430 0x5B8C # -0x8AAF 0x3431 0x5B98 # -0x8AB0 0x3432 0x5BDB # -0x8AB1 0x3433 0x5E72 # -0x8AB2 0x3434 0x5E79 # -0x8AB3 0x3435 0x60A3 # -0x8AB4 0x3436 0x611F # -0x8AB5 0x3437 0x6163 # -0x8AB6 0x3438 0x61BE # -0x8AB7 0x3439 0x63DB # -0x8AB8 0x343A 0x6562 # -0x8AB9 0x343B 0x67D1 # -0x8ABA 0x343C 0x6853 # -0x8ABB 0x343D 0x68FA # -0x8ABC 0x343E 0x6B3E # -0x8ABD 0x343F 0x6B53 # -0x8ABE 0x3440 0x6C57 # -0x8ABF 0x3441 0x6F22 # -0x8AC0 0x3442 0x6F97 # -0x8AC1 0x3443 0x6F45 # -0x8AC2 0x3444 0x74B0 # -0x8AC3 0x3445 0x7518 # -0x8AC4 0x3446 0x76E3 # -0x8AC5 0x3447 0x770B # -0x8AC6 0x3448 0x7AFF # -0x8AC7 0x3449 0x7BA1 # -0x8AC8 0x344A 0x7C21 # -0x8AC9 0x344B 0x7DE9 # -0x8ACA 0x344C 0x7F36 # -0x8ACB 0x344D 0x7FF0 # -0x8ACC 0x344E 0x809D # -0x8ACD 0x344F 0x8266 # -0x8ACE 0x3450 0x839E # -0x8ACF 0x3451 0x89B3 # -0x8AD0 0x3452 0x8ACC # -0x8AD1 0x3453 0x8CAB # -0x8AD2 0x3454 0x9084 # -0x8AD3 0x3455 0x9451 # -0x8AD4 0x3456 0x9593 # -0x8AD5 0x3457 0x9591 # -0x8AD6 0x3458 0x95A2 # -0x8AD7 0x3459 0x9665 # -0x8AD8 0x345A 0x97D3 # -0x8AD9 0x345B 0x9928 # -0x8ADA 0x345C 0x8218 # -0x8ADB 0x345D 0x4E38 # -0x8ADC 0x345E 0x542B # -0x8ADD 0x345F 0x5CB8 # -0x8ADE 0x3460 0x5DCC # -0x8ADF 0x3461 0x73A9 # -0x8AE0 0x3462 0x764C # -0x8AE1 0x3463 0x773C # -0x8AE2 0x3464 0x5CA9 # -0x8AE3 0x3465 0x7FEB # -0x8AE4 0x3466 0x8D0B # -0x8AE5 0x3467 0x96C1 # -0x8AE6 0x3468 0x9811 # -0x8AE7 0x3469 0x9854 # -0x8AE8 0x346A 0x9858 # -0x8AE9 0x346B 0x4F01 # -0x8AEA 0x346C 0x4F0E # -0x8AEB 0x346D 0x5371 # -0x8AEC 0x346E 0x559C # -0x8AED 0x346F 0x5668 # -0x8AEE 0x3470 0x57FA # -0x8AEF 0x3471 0x5947 # -0x8AF0 0x3472 0x5B09 # -0x8AF1 0x3473 0x5BC4 # -0x8AF2 0x3474 0x5C90 # -0x8AF3 0x3475 0x5E0C # -0x8AF4 0x3476 0x5E7E # -0x8AF5 0x3477 0x5FCC # -0x8AF6 0x3478 0x63EE # -0x8AF7 0x3479 0x673A # -0x8AF8 0x347A 0x65D7 # -0x8AF9 0x347B 0x65E2 # -0x8AFA 0x347C 0x671F # -0x8AFB 0x347D 0x68CB # -0x8AFC 0x347E 0x68C4 # -0x8B40 0x3521 0x6A5F # -0x8B41 0x3522 0x5E30 # -0x8B42 0x3523 0x6BC5 # -0x8B43 0x3524 0x6C17 # -0x8B44 0x3525 0x6C7D # -0x8B45 0x3526 0x757F # -0x8B46 0x3527 0x7948 # -0x8B47 0x3528 0x5B63 # -0x8B48 0x3529 0x7A00 # -0x8B49 0x352A 0x7D00 # -0x8B4A 0x352B 0x5FBD # -0x8B4B 0x352C 0x898F # -0x8B4C 0x352D 0x8A18 # -0x8B4D 0x352E 0x8CB4 # -0x8B4E 0x352F 0x8D77 # -0x8B4F 0x3530 0x8ECC # -0x8B50 0x3531 0x8F1D # -0x8B51 0x3532 0x98E2 # -0x8B52 0x3533 0x9A0E # -0x8B53 0x3534 0x9B3C # -0x8B54 0x3535 0x4E80 # -0x8B55 0x3536 0x507D # -0x8B56 0x3537 0x5100 # -0x8B57 0x3538 0x5993 # -0x8B58 0x3539 0x5B9C # -0x8B59 0x353A 0x622F # -0x8B5A 0x353B 0x6280 # -0x8B5B 0x353C 0x64EC # -0x8B5C 0x353D 0x6B3A # -0x8B5D 0x353E 0x72A0 # -0x8B5E 0x353F 0x7591 # -0x8B5F 0x3540 0x7947 # -0x8B60 0x3541 0x7FA9 # -0x8B61 0x3542 0x87FB # -0x8B62 0x3543 0x8ABC # -0x8B63 0x3544 0x8B70 # -0x8B64 0x3545 0x63AC # -0x8B65 0x3546 0x83CA # -0x8B66 0x3547 0x97A0 # -0x8B67 0x3548 0x5409 # -0x8B68 0x3549 0x5403 # -0x8B69 0x354A 0x55AB # -0x8B6A 0x354B 0x6854 # -0x8B6B 0x354C 0x6A58 # -0x8B6C 0x354D 0x8A70 # -0x8B6D 0x354E 0x7827 # -0x8B6E 0x354F 0x6775 # -0x8B6F 0x3550 0x9ECD # -0x8B70 0x3551 0x5374 # -0x8B71 0x3552 0x5BA2 # -0x8B72 0x3553 0x811A # -0x8B73 0x3554 0x8650 # -0x8B74 0x3555 0x9006 # -0x8B75 0x3556 0x4E18 # -0x8B76 0x3557 0x4E45 # -0x8B77 0x3558 0x4EC7 # -0x8B78 0x3559 0x4F11 # -0x8B79 0x355A 0x53CA # -0x8B7A 0x355B 0x5438 # -0x8B7B 0x355C 0x5BAE # -0x8B7C 0x355D 0x5F13 # -0x8B7D 0x355E 0x6025 # -0x8B7E 0x355F 0x6551 # -0x8B80 0x3560 0x673D # -0x8B81 0x3561 0x6C42 # -0x8B82 0x3562 0x6C72 # -0x8B83 0x3563 0x6CE3 # -0x8B84 0x3564 0x7078 # -0x8B85 0x3565 0x7403 # -0x8B86 0x3566 0x7A76 # -0x8B87 0x3567 0x7AAE # -0x8B88 0x3568 0x7B08 # -0x8B89 0x3569 0x7D1A # -0x8B8A 0x356A 0x7CFE # -0x8B8B 0x356B 0x7D66 # -0x8B8C 0x356C 0x65E7 # -0x8B8D 0x356D 0x725B # -0x8B8E 0x356E 0x53BB # -0x8B8F 0x356F 0x5C45 # -0x8B90 0x3570 0x5DE8 # -0x8B91 0x3571 0x62D2 # -0x8B92 0x3572 0x62E0 # -0x8B93 0x3573 0x6319 # -0x8B94 0x3574 0x6E20 # -0x8B95 0x3575 0x865A # -0x8B96 0x3576 0x8A31 # -0x8B97 0x3577 0x8DDD # -0x8B98 0x3578 0x92F8 # -0x8B99 0x3579 0x6F01 # -0x8B9A 0x357A 0x79A6 # -0x8B9B 0x357B 0x9B5A # -0x8B9C 0x357C 0x4EA8 # -0x8B9D 0x357D 0x4EAB # -0x8B9E 0x357E 0x4EAC # -0x8B9F 0x3621 0x4F9B # -0x8BA0 0x3622 0x4FA0 # -0x8BA1 0x3623 0x50D1 # -0x8BA2 0x3624 0x5147 # -0x8BA3 0x3625 0x7AF6 # -0x8BA4 0x3626 0x5171 # -0x8BA5 0x3627 0x51F6 # -0x8BA6 0x3628 0x5354 # -0x8BA7 0x3629 0x5321 # -0x8BA8 0x362A 0x537F # -0x8BA9 0x362B 0x53EB # -0x8BAA 0x362C 0x55AC # -0x8BAB 0x362D 0x5883 # -0x8BAC 0x362E 0x5CE1 # -0x8BAD 0x362F 0x5F37 # -0x8BAE 0x3630 0x5F4A # -0x8BAF 0x3631 0x602F # -0x8BB0 0x3632 0x6050 # -0x8BB1 0x3633 0x606D # -0x8BB2 0x3634 0x631F # -0x8BB3 0x3635 0x6559 # -0x8BB4 0x3636 0x6A4B # -0x8BB5 0x3637 0x6CC1 # -0x8BB6 0x3638 0x72C2 # -0x8BB7 0x3639 0x72ED # -0x8BB8 0x363A 0x77EF # -0x8BB9 0x363B 0x80F8 # -0x8BBA 0x363C 0x8105 # -0x8BBB 0x363D 0x8208 # -0x8BBC 0x363E 0x854E # -0x8BBD 0x363F 0x90F7 # -0x8BBE 0x3640 0x93E1 # -0x8BBF 0x3641 0x97FF # -0x8BC0 0x3642 0x9957 # -0x8BC1 0x3643 0x9A5A # -0x8BC2 0x3644 0x4EF0 # -0x8BC3 0x3645 0x51DD # -0x8BC4 0x3646 0x5C2D # -0x8BC5 0x3647 0x6681 # -0x8BC6 0x3648 0x696D # -0x8BC7 0x3649 0x5C40 # -0x8BC8 0x364A 0x66F2 # -0x8BC9 0x364B 0x6975 # -0x8BCA 0x364C 0x7389 # -0x8BCB 0x364D 0x6850 # -0x8BCC 0x364E 0x7C81 # -0x8BCD 0x364F 0x50C5 # -0x8BCE 0x3650 0x52E4 # -0x8BCF 0x3651 0x5747 # -0x8BD0 0x3652 0x5DFE # -0x8BD1 0x3653 0x9326 # -0x8BD2 0x3654 0x65A4 # -0x8BD3 0x3655 0x6B23 # -0x8BD4 0x3656 0x6B3D # -0x8BD5 0x3657 0x7434 # -0x8BD6 0x3658 0x7981 # -0x8BD7 0x3659 0x79BD # -0x8BD8 0x365A 0x7B4B # -0x8BD9 0x365B 0x7DCA # -0x8BDA 0x365C 0x82B9 # -0x8BDB 0x365D 0x83CC # -0x8BDC 0x365E 0x887F # -0x8BDD 0x365F 0x895F # -0x8BDE 0x3660 0x8B39 # -0x8BDF 0x3661 0x8FD1 # -0x8BE0 0x3662 0x91D1 # -0x8BE1 0x3663 0x541F # -0x8BE2 0x3664 0x9280 # -0x8BE3 0x3665 0x4E5D # -0x8BE4 0x3666 0x5036 # -0x8BE5 0x3667 0x53E5 # -0x8BE6 0x3668 0x533A # -0x8BE7 0x3669 0x72D7 # -0x8BE8 0x366A 0x7396 # -0x8BE9 0x366B 0x77E9 # -0x8BEA 0x366C 0x82E6 # -0x8BEB 0x366D 0x8EAF # -0x8BEC 0x366E 0x99C6 # -0x8BED 0x366F 0x99C8 # -0x8BEE 0x3670 0x99D2 # -0x8BEF 0x3671 0x5177 # -0x8BF0 0x3672 0x611A # -0x8BF1 0x3673 0x865E # -0x8BF2 0x3674 0x55B0 # -0x8BF3 0x3675 0x7A7A # -0x8BF4 0x3676 0x5076 # -0x8BF5 0x3677 0x5BD3 # -0x8BF6 0x3678 0x9047 # -0x8BF7 0x3679 0x9685 # -0x8BF8 0x367A 0x4E32 # -0x8BF9 0x367B 0x6ADB # -0x8BFA 0x367C 0x91E7 # -0x8BFB 0x367D 0x5C51 # -0x8BFC 0x367E 0x5C48 # -0x8C40 0x3721 0x6398 # -0x8C41 0x3722 0x7A9F # -0x8C42 0x3723 0x6C93 # -0x8C43 0x3724 0x9774 # -0x8C44 0x3725 0x8F61 # -0x8C45 0x3726 0x7AAA # -0x8C46 0x3727 0x718A # -0x8C47 0x3728 0x9688 # -0x8C48 0x3729 0x7C82 # -0x8C49 0x372A 0x6817 # -0x8C4A 0x372B 0x7E70 # -0x8C4B 0x372C 0x6851 # -0x8C4C 0x372D 0x936C # -0x8C4D 0x372E 0x52F2 # -0x8C4E 0x372F 0x541B # -0x8C4F 0x3730 0x85AB # -0x8C50 0x3731 0x8A13 # -0x8C51 0x3732 0x7FA4 # -0x8C52 0x3733 0x8ECD # -0x8C53 0x3734 0x90E1 # -0x8C54 0x3735 0x5366 # -0x8C55 0x3736 0x8888 # -0x8C56 0x3737 0x7941 # -0x8C57 0x3738 0x4FC2 # -0x8C58 0x3739 0x50BE # -0x8C59 0x373A 0x5211 # -0x8C5A 0x373B 0x5144 # -0x8C5B 0x373C 0x5553 # -0x8C5C 0x373D 0x572D # -0x8C5D 0x373E 0x73EA # -0x8C5E 0x373F 0x578B # -0x8C5F 0x3740 0x5951 # -0x8C60 0x3741 0x5F62 # -0x8C61 0x3742 0x5F84 # -0x8C62 0x3743 0x6075 # -0x8C63 0x3744 0x6176 # -0x8C64 0x3745 0x6167 # -0x8C65 0x3746 0x61A9 # -0x8C66 0x3747 0x63B2 # -0x8C67 0x3748 0x643A # -0x8C68 0x3749 0x656C # -0x8C69 0x374A 0x666F # -0x8C6A 0x374B 0x6842 # -0x8C6B 0x374C 0x6E13 # -0x8C6C 0x374D 0x7566 # -0x8C6D 0x374E 0x7A3D # -0x8C6E 0x374F 0x7CFB # -0x8C6F 0x3750 0x7D4C # -0x8C70 0x3751 0x7D99 # -0x8C71 0x3752 0x7E4B # -0x8C72 0x3753 0x7F6B # -0x8C73 0x3754 0x830E # -0x8C74 0x3755 0x834A # -0x8C75 0x3756 0x86CD # -0x8C76 0x3757 0x8A08 # -0x8C77 0x3758 0x8A63 # -0x8C78 0x3759 0x8B66 # -0x8C79 0x375A 0x8EFD # -0x8C7A 0x375B 0x981A # -0x8C7B 0x375C 0x9D8F # -0x8C7C 0x375D 0x82B8 # -0x8C7D 0x375E 0x8FCE # -0x8C7E 0x375F 0x9BE8 # -0x8C80 0x3760 0x5287 # -0x8C81 0x3761 0x621F # -0x8C82 0x3762 0x6483 # -0x8C83 0x3763 0x6FC0 # -0x8C84 0x3764 0x9699 # -0x8C85 0x3765 0x6841 # -0x8C86 0x3766 0x5091 # -0x8C87 0x3767 0x6B20 # -0x8C88 0x3768 0x6C7A # -0x8C89 0x3769 0x6F54 # -0x8C8A 0x376A 0x7A74 # -0x8C8B 0x376B 0x7D50 # -0x8C8C 0x376C 0x8840 # -0x8C8D 0x376D 0x8A23 # -0x8C8E 0x376E 0x6708 # -0x8C8F 0x376F 0x4EF6 # -0x8C90 0x3770 0x5039 # -0x8C91 0x3771 0x5026 # -0x8C92 0x3772 0x5065 # -0x8C93 0x3773 0x517C # -0x8C94 0x3774 0x5238 # -0x8C95 0x3775 0x5263 # -0x8C96 0x3776 0x55A7 # -0x8C97 0x3777 0x570F # -0x8C98 0x3778 0x5805 # -0x8C99 0x3779 0x5ACC # -0x8C9A 0x377A 0x5EFA # -0x8C9B 0x377B 0x61B2 # -0x8C9C 0x377C 0x61F8 # -0x8C9D 0x377D 0x62F3 # -0x8C9E 0x377E 0x6372 # -0x8C9F 0x3821 0x691C # -0x8CA0 0x3822 0x6A29 # -0x8CA1 0x3823 0x727D # -0x8CA2 0x3824 0x72AC # -0x8CA3 0x3825 0x732E # -0x8CA4 0x3826 0x7814 # -0x8CA5 0x3827 0x786F # -0x8CA6 0x3828 0x7D79 # -0x8CA7 0x3829 0x770C # -0x8CA8 0x382A 0x80A9 # -0x8CA9 0x382B 0x898B # -0x8CAA 0x382C 0x8B19 # -0x8CAB 0x382D 0x8CE2 # -0x8CAC 0x382E 0x8ED2 # -0x8CAD 0x382F 0x9063 # -0x8CAE 0x3830 0x9375 # -0x8CAF 0x3831 0x967A # -0x8CB0 0x3832 0x9855 # -0x8CB1 0x3833 0x9A13 # -0x8CB2 0x3834 0x9E78 # -0x8CB3 0x3835 0x5143 # -0x8CB4 0x3836 0x539F # -0x8CB5 0x3837 0x53B3 # -0x8CB6 0x3838 0x5E7B # -0x8CB7 0x3839 0x5F26 # -0x8CB8 0x383A 0x6E1B # -0x8CB9 0x383B 0x6E90 # -0x8CBA 0x383C 0x7384 # -0x8CBB 0x383D 0x73FE # -0x8CBC 0x383E 0x7D43 # -0x8CBD 0x383F 0x8237 # -0x8CBE 0x3840 0x8A00 # -0x8CBF 0x3841 0x8AFA # -0x8CC0 0x3842 0x9650 # -0x8CC1 0x3843 0x4E4E # -0x8CC2 0x3844 0x500B # -0x8CC3 0x3845 0x53E4 # -0x8CC4 0x3846 0x547C # -0x8CC5 0x3847 0x56FA # -0x8CC6 0x3848 0x59D1 # -0x8CC7 0x3849 0x5B64 # -0x8CC8 0x384A 0x5DF1 # -0x8CC9 0x384B 0x5EAB # -0x8CCA 0x384C 0x5F27 # -0x8CCB 0x384D 0x6238 # -0x8CCC 0x384E 0x6545 # -0x8CCD 0x384F 0x67AF # -0x8CCE 0x3850 0x6E56 # -0x8CCF 0x3851 0x72D0 # -0x8CD0 0x3852 0x7CCA # -0x8CD1 0x3853 0x88B4 # -0x8CD2 0x3854 0x80A1 # -0x8CD3 0x3855 0x80E1 # -0x8CD4 0x3856 0x83F0 # -0x8CD5 0x3857 0x864E # -0x8CD6 0x3858 0x8A87 # -0x8CD7 0x3859 0x8DE8 # -0x8CD8 0x385A 0x9237 # -0x8CD9 0x385B 0x96C7 # -0x8CDA 0x385C 0x9867 # -0x8CDB 0x385D 0x9F13 # -0x8CDC 0x385E 0x4E94 # -0x8CDD 0x385F 0x4E92 # -0x8CDE 0x3860 0x4F0D # -0x8CDF 0x3861 0x5348 # -0x8CE0 0x3862 0x5449 # -0x8CE1 0x3863 0x543E # -0x8CE2 0x3864 0x5A2F # -0x8CE3 0x3865 0x5F8C # -0x8CE4 0x3866 0x5FA1 # -0x8CE5 0x3867 0x609F # -0x8CE6 0x3868 0x68A7 # -0x8CE7 0x3869 0x6A8E # -0x8CE8 0x386A 0x745A # -0x8CE9 0x386B 0x7881 # -0x8CEA 0x386C 0x8A9E # -0x8CEB 0x386D 0x8AA4 # -0x8CEC 0x386E 0x8B77 # -0x8CED 0x386F 0x9190 # -0x8CEE 0x3870 0x4E5E # -0x8CEF 0x3871 0x9BC9 # -0x8CF0 0x3872 0x4EA4 # -0x8CF1 0x3873 0x4F7C # -0x8CF2 0x3874 0x4FAF # -0x8CF3 0x3875 0x5019 # -0x8CF4 0x3876 0x5016 # -0x8CF5 0x3877 0x5149 # -0x8CF6 0x3878 0x516C # -0x8CF7 0x3879 0x529F # -0x8CF8 0x387A 0x52B9 # -0x8CF9 0x387B 0x52FE # -0x8CFA 0x387C 0x539A # -0x8CFB 0x387D 0x53E3 # -0x8CFC 0x387E 0x5411 # -0x8D40 0x3921 0x540E # -0x8D41 0x3922 0x5589 # -0x8D42 0x3923 0x5751 # -0x8D43 0x3924 0x57A2 # -0x8D44 0x3925 0x597D # -0x8D45 0x3926 0x5B54 # -0x8D46 0x3927 0x5B5D # -0x8D47 0x3928 0x5B8F # -0x8D48 0x3929 0x5DE5 # -0x8D49 0x392A 0x5DE7 # -0x8D4A 0x392B 0x5DF7 # -0x8D4B 0x392C 0x5E78 # -0x8D4C 0x392D 0x5E83 # -0x8D4D 0x392E 0x5E9A # -0x8D4E 0x392F 0x5EB7 # -0x8D4F 0x3930 0x5F18 # -0x8D50 0x3931 0x6052 # -0x8D51 0x3932 0x614C # -0x8D52 0x3933 0x6297 # -0x8D53 0x3934 0x62D8 # -0x8D54 0x3935 0x63A7 # -0x8D55 0x3936 0x653B # -0x8D56 0x3937 0x6602 # -0x8D57 0x3938 0x6643 # -0x8D58 0x3939 0x66F4 # -0x8D59 0x393A 0x676D # -0x8D5A 0x393B 0x6821 # -0x8D5B 0x393C 0x6897 # -0x8D5C 0x393D 0x69CB # -0x8D5D 0x393E 0x6C5F # -0x8D5E 0x393F 0x6D2A # -0x8D5F 0x3940 0x6D69 # -0x8D60 0x3941 0x6E2F # -0x8D61 0x3942 0x6E9D # -0x8D62 0x3943 0x7532 # -0x8D63 0x3944 0x7687 # -0x8D64 0x3945 0x786C # -0x8D65 0x3946 0x7A3F # -0x8D66 0x3947 0x7CE0 # -0x8D67 0x3948 0x7D05 # -0x8D68 0x3949 0x7D18 # -0x8D69 0x394A 0x7D5E # -0x8D6A 0x394B 0x7DB1 # -0x8D6B 0x394C 0x8015 # -0x8D6C 0x394D 0x8003 # -0x8D6D 0x394E 0x80AF # -0x8D6E 0x394F 0x80B1 # -0x8D6F 0x3950 0x8154 # -0x8D70 0x3951 0x818F # -0x8D71 0x3952 0x822A # -0x8D72 0x3953 0x8352 # -0x8D73 0x3954 0x884C # -0x8D74 0x3955 0x8861 # -0x8D75 0x3956 0x8B1B # -0x8D76 0x3957 0x8CA2 # -0x8D77 0x3958 0x8CFC # -0x8D78 0x3959 0x90CA # -0x8D79 0x395A 0x9175 # -0x8D7A 0x395B 0x9271 # -0x8D7B 0x395C 0x783F # -0x8D7C 0x395D 0x92FC # -0x8D7D 0x395E 0x95A4 # -0x8D7E 0x395F 0x964D # -0x8D80 0x3960 0x9805 # -0x8D81 0x3961 0x9999 # -0x8D82 0x3962 0x9AD8 # -0x8D83 0x3963 0x9D3B # -0x8D84 0x3964 0x525B # -0x8D85 0x3965 0x52AB # -0x8D86 0x3966 0x53F7 # -0x8D87 0x3967 0x5408 # -0x8D88 0x3968 0x58D5 # -0x8D89 0x3969 0x62F7 # -0x8D8A 0x396A 0x6FE0 # -0x8D8B 0x396B 0x8C6A # -0x8D8C 0x396C 0x8F5F # -0x8D8D 0x396D 0x9EB9 # -0x8D8E 0x396E 0x514B # -0x8D8F 0x396F 0x523B # -0x8D90 0x3970 0x544A # -0x8D91 0x3971 0x56FD # -0x8D92 0x3972 0x7A40 # -0x8D93 0x3973 0x9177 # -0x8D94 0x3974 0x9D60 # -0x8D95 0x3975 0x9ED2 # -0x8D96 0x3976 0x7344 # -0x8D97 0x3977 0x6F09 # -0x8D98 0x3978 0x8170 # -0x8D99 0x3979 0x7511 # -0x8D9A 0x397A 0x5FFD # -0x8D9B 0x397B 0x60DA # -0x8D9C 0x397C 0x9AA8 # -0x8D9D 0x397D 0x72DB # -0x8D9E 0x397E 0x8FBC # -0x8D9F 0x3A21 0x6B64 # -0x8DA0 0x3A22 0x9803 # -0x8DA1 0x3A23 0x4ECA # -0x8DA2 0x3A24 0x56F0 # -0x8DA3 0x3A25 0x5764 # -0x8DA4 0x3A26 0x58BE # -0x8DA5 0x3A27 0x5A5A # -0x8DA6 0x3A28 0x6068 # -0x8DA7 0x3A29 0x61C7 # -0x8DA8 0x3A2A 0x660F # -0x8DA9 0x3A2B 0x6606 # -0x8DAA 0x3A2C 0x6839 # -0x8DAB 0x3A2D 0x68B1 # -0x8DAC 0x3A2E 0x6DF7 # -0x8DAD 0x3A2F 0x75D5 # -0x8DAE 0x3A30 0x7D3A # -0x8DAF 0x3A31 0x826E # -0x8DB0 0x3A32 0x9B42 # -0x8DB1 0x3A33 0x4E9B # -0x8DB2 0x3A34 0x4F50 # -0x8DB3 0x3A35 0x53C9 # -0x8DB4 0x3A36 0x5506 # -0x8DB5 0x3A37 0x5D6F # -0x8DB6 0x3A38 0x5DE6 # -0x8DB7 0x3A39 0x5DEE # -0x8DB8 0x3A3A 0x67FB # -0x8DB9 0x3A3B 0x6C99 # -0x8DBA 0x3A3C 0x7473 # -0x8DBB 0x3A3D 0x7802 # -0x8DBC 0x3A3E 0x8A50 # -0x8DBD 0x3A3F 0x9396 # -0x8DBE 0x3A40 0x88DF # -0x8DBF 0x3A41 0x5750 # -0x8DC0 0x3A42 0x5EA7 # -0x8DC1 0x3A43 0x632B # -0x8DC2 0x3A44 0x50B5 # -0x8DC3 0x3A45 0x50AC # -0x8DC4 0x3A46 0x518D # -0x8DC5 0x3A47 0x6700 # -0x8DC6 0x3A48 0x54C9 # -0x8DC7 0x3A49 0x585E # -0x8DC8 0x3A4A 0x59BB # -0x8DC9 0x3A4B 0x5BB0 # -0x8DCA 0x3A4C 0x5F69 # -0x8DCB 0x3A4D 0x624D # -0x8DCC 0x3A4E 0x63A1 # -0x8DCD 0x3A4F 0x683D # -0x8DCE 0x3A50 0x6B73 # -0x8DCF 0x3A51 0x6E08 # -0x8DD0 0x3A52 0x707D # -0x8DD1 0x3A53 0x91C7 # -0x8DD2 0x3A54 0x7280 # -0x8DD3 0x3A55 0x7815 # -0x8DD4 0x3A56 0x7826 # -0x8DD5 0x3A57 0x796D # -0x8DD6 0x3A58 0x658E # -0x8DD7 0x3A59 0x7D30 # -0x8DD8 0x3A5A 0x83DC # -0x8DD9 0x3A5B 0x88C1 # -0x8DDA 0x3A5C 0x8F09 # -0x8DDB 0x3A5D 0x969B # -0x8DDC 0x3A5E 0x5264 # -0x8DDD 0x3A5F 0x5728 # -0x8DDE 0x3A60 0x6750 # -0x8DDF 0x3A61 0x7F6A # -0x8DE0 0x3A62 0x8CA1 # -0x8DE1 0x3A63 0x51B4 # -0x8DE2 0x3A64 0x5742 # -0x8DE3 0x3A65 0x962A # -0x8DE4 0x3A66 0x583A # -0x8DE5 0x3A67 0x698A # -0x8DE6 0x3A68 0x80B4 # -0x8DE7 0x3A69 0x54B2 # -0x8DE8 0x3A6A 0x5D0E # -0x8DE9 0x3A6B 0x57FC # -0x8DEA 0x3A6C 0x7895 # -0x8DEB 0x3A6D 0x9DFA # -0x8DEC 0x3A6E 0x4F5C # -0x8DED 0x3A6F 0x524A # -0x8DEE 0x3A70 0x548B # -0x8DEF 0x3A71 0x643E # -0x8DF0 0x3A72 0x6628 # -0x8DF1 0x3A73 0x6714 # -0x8DF2 0x3A74 0x67F5 # -0x8DF3 0x3A75 0x7A84 # -0x8DF4 0x3A76 0x7B56 # -0x8DF5 0x3A77 0x7D22 # -0x8DF6 0x3A78 0x932F # -0x8DF7 0x3A79 0x685C # -0x8DF8 0x3A7A 0x9BAD # -0x8DF9 0x3A7B 0x7B39 # -0x8DFA 0x3A7C 0x5319 # -0x8DFB 0x3A7D 0x518A # -0x8DFC 0x3A7E 0x5237 # -0x8E40 0x3B21 0x5BDF # -0x8E41 0x3B22 0x62F6 # -0x8E42 0x3B23 0x64AE # -0x8E43 0x3B24 0x64E6 # -0x8E44 0x3B25 0x672D # -0x8E45 0x3B26 0x6BBA # -0x8E46 0x3B27 0x85A9 # -0x8E47 0x3B28 0x96D1 # -0x8E48 0x3B29 0x7690 # -0x8E49 0x3B2A 0x9BD6 # -0x8E4A 0x3B2B 0x634C # -0x8E4B 0x3B2C 0x9306 # -0x8E4C 0x3B2D 0x9BAB # -0x8E4D 0x3B2E 0x76BF # -0x8E4E 0x3B2F 0x6652 # -0x8E4F 0x3B30 0x4E09 # -0x8E50 0x3B31 0x5098 # -0x8E51 0x3B32 0x53C2 # -0x8E52 0x3B33 0x5C71 # -0x8E53 0x3B34 0x60E8 # -0x8E54 0x3B35 0x6492 # -0x8E55 0x3B36 0x6563 # -0x8E56 0x3B37 0x685F # -0x8E57 0x3B38 0x71E6 # -0x8E58 0x3B39 0x73CA # -0x8E59 0x3B3A 0x7523 # -0x8E5A 0x3B3B 0x7B97 # -0x8E5B 0x3B3C 0x7E82 # -0x8E5C 0x3B3D 0x8695 # -0x8E5D 0x3B3E 0x8B83 # -0x8E5E 0x3B3F 0x8CDB # -0x8E5F 0x3B40 0x9178 # -0x8E60 0x3B41 0x9910 # -0x8E61 0x3B42 0x65AC # -0x8E62 0x3B43 0x66AB # -0x8E63 0x3B44 0x6B8B # -0x8E64 0x3B45 0x4ED5 # -0x8E65 0x3B46 0x4ED4 # -0x8E66 0x3B47 0x4F3A # -0x8E67 0x3B48 0x4F7F # -0x8E68 0x3B49 0x523A # -0x8E69 0x3B4A 0x53F8 # -0x8E6A 0x3B4B 0x53F2 # -0x8E6B 0x3B4C 0x55E3 # -0x8E6C 0x3B4D 0x56DB # -0x8E6D 0x3B4E 0x58EB # -0x8E6E 0x3B4F 0x59CB # -0x8E6F 0x3B50 0x59C9 # -0x8E70 0x3B51 0x59FF # -0x8E71 0x3B52 0x5B50 # -0x8E72 0x3B53 0x5C4D # -0x8E73 0x3B54 0x5E02 # -0x8E74 0x3B55 0x5E2B # -0x8E75 0x3B56 0x5FD7 # -0x8E76 0x3B57 0x601D # -0x8E77 0x3B58 0x6307 # -0x8E78 0x3B59 0x652F # -0x8E79 0x3B5A 0x5B5C # -0x8E7A 0x3B5B 0x65AF # -0x8E7B 0x3B5C 0x65BD # -0x8E7C 0x3B5D 0x65E8 # -0x8E7D 0x3B5E 0x679D # -0x8E7E 0x3B5F 0x6B62 # -0x8E80 0x3B60 0x6B7B # -0x8E81 0x3B61 0x6C0F # -0x8E82 0x3B62 0x7345 # -0x8E83 0x3B63 0x7949 # -0x8E84 0x3B64 0x79C1 # -0x8E85 0x3B65 0x7CF8 # -0x8E86 0x3B66 0x7D19 # -0x8E87 0x3B67 0x7D2B # -0x8E88 0x3B68 0x80A2 # -0x8E89 0x3B69 0x8102 # -0x8E8A 0x3B6A 0x81F3 # -0x8E8B 0x3B6B 0x8996 # -0x8E8C 0x3B6C 0x8A5E # -0x8E8D 0x3B6D 0x8A69 # -0x8E8E 0x3B6E 0x8A66 # -0x8E8F 0x3B6F 0x8A8C # -0x8E90 0x3B70 0x8AEE # -0x8E91 0x3B71 0x8CC7 # -0x8E92 0x3B72 0x8CDC # -0x8E93 0x3B73 0x96CC # -0x8E94 0x3B74 0x98FC # -0x8E95 0x3B75 0x6B6F # -0x8E96 0x3B76 0x4E8B # -0x8E97 0x3B77 0x4F3C # -0x8E98 0x3B78 0x4F8D # -0x8E99 0x3B79 0x5150 # -0x8E9A 0x3B7A 0x5B57 # -0x8E9B 0x3B7B 0x5BFA # -0x8E9C 0x3B7C 0x6148 # -0x8E9D 0x3B7D 0x6301 # -0x8E9E 0x3B7E 0x6642 # -0x8E9F 0x3C21 0x6B21 # -0x8EA0 0x3C22 0x6ECB # -0x8EA1 0x3C23 0x6CBB # -0x8EA2 0x3C24 0x723E # -0x8EA3 0x3C25 0x74BD # -0x8EA4 0x3C26 0x75D4 # -0x8EA5 0x3C27 0x78C1 # -0x8EA6 0x3C28 0x793A # -0x8EA7 0x3C29 0x800C # -0x8EA8 0x3C2A 0x8033 # -0x8EA9 0x3C2B 0x81EA # -0x8EAA 0x3C2C 0x8494 # -0x8EAB 0x3C2D 0x8F9E # -0x8EAC 0x3C2E 0x6C50 # -0x8EAD 0x3C2F 0x9E7F # -0x8EAE 0x3C30 0x5F0F # -0x8EAF 0x3C31 0x8B58 # -0x8EB0 0x3C32 0x9D2B # -0x8EB1 0x3C33 0x7AFA # -0x8EB2 0x3C34 0x8EF8 # -0x8EB3 0x3C35 0x5B8D # -0x8EB4 0x3C36 0x96EB # -0x8EB5 0x3C37 0x4E03 # -0x8EB6 0x3C38 0x53F1 # -0x8EB7 0x3C39 0x57F7 # -0x8EB8 0x3C3A 0x5931 # -0x8EB9 0x3C3B 0x5AC9 # -0x8EBA 0x3C3C 0x5BA4 # -0x8EBB 0x3C3D 0x6089 # -0x8EBC 0x3C3E 0x6E7F # -0x8EBD 0x3C3F 0x6F06 # -0x8EBE 0x3C40 0x75BE # -0x8EBF 0x3C41 0x8CEA # -0x8EC0 0x3C42 0x5B9F # -0x8EC1 0x3C43 0x8500 # -0x8EC2 0x3C44 0x7BE0 # -0x8EC3 0x3C45 0x5072 # -0x8EC4 0x3C46 0x67F4 # -0x8EC5 0x3C47 0x829D # -0x8EC6 0x3C48 0x5C61 # -0x8EC7 0x3C49 0x854A # -0x8EC8 0x3C4A 0x7E1E # -0x8EC9 0x3C4B 0x820E # -0x8ECA 0x3C4C 0x5199 # -0x8ECB 0x3C4D 0x5C04 # -0x8ECC 0x3C4E 0x6368 # -0x8ECD 0x3C4F 0x8D66 # -0x8ECE 0x3C50 0x659C # -0x8ECF 0x3C51 0x716E # -0x8ED0 0x3C52 0x793E # -0x8ED1 0x3C53 0x7D17 # -0x8ED2 0x3C54 0x8005 # -0x8ED3 0x3C55 0x8B1D # -0x8ED4 0x3C56 0x8ECA # -0x8ED5 0x3C57 0x906E # -0x8ED6 0x3C58 0x86C7 # -0x8ED7 0x3C59 0x90AA # -0x8ED8 0x3C5A 0x501F # -0x8ED9 0x3C5B 0x52FA # -0x8EDA 0x3C5C 0x5C3A # -0x8EDB 0x3C5D 0x6753 # -0x8EDC 0x3C5E 0x707C # -0x8EDD 0x3C5F 0x7235 # -0x8EDE 0x3C60 0x914C # -0x8EDF 0x3C61 0x91C8 # -0x8EE0 0x3C62 0x932B # -0x8EE1 0x3C63 0x82E5 # -0x8EE2 0x3C64 0x5BC2 # -0x8EE3 0x3C65 0x5F31 # -0x8EE4 0x3C66 0x60F9 # -0x8EE5 0x3C67 0x4E3B # -0x8EE6 0x3C68 0x53D6 # -0x8EE7 0x3C69 0x5B88 # -0x8EE8 0x3C6A 0x624B # -0x8EE9 0x3C6B 0x6731 # -0x8EEA 0x3C6C 0x6B8A # -0x8EEB 0x3C6D 0x72E9 # -0x8EEC 0x3C6E 0x73E0 # -0x8EED 0x3C6F 0x7A2E # -0x8EEE 0x3C70 0x816B # -0x8EEF 0x3C71 0x8DA3 # -0x8EF0 0x3C72 0x9152 # -0x8EF1 0x3C73 0x9996 # -0x8EF2 0x3C74 0x5112 # -0x8EF3 0x3C75 0x53D7 # -0x8EF4 0x3C76 0x546A # -0x8EF5 0x3C77 0x5BFF # -0x8EF6 0x3C78 0x6388 # -0x8EF7 0x3C79 0x6A39 # -0x8EF8 0x3C7A 0x7DAC # -0x8EF9 0x3C7B 0x9700 # -0x8EFA 0x3C7C 0x56DA # -0x8EFB 0x3C7D 0x53CE # -0x8EFC 0x3C7E 0x5468 # -0x8F40 0x3D21 0x5B97 # -0x8F41 0x3D22 0x5C31 # -0x8F42 0x3D23 0x5DDE # -0x8F43 0x3D24 0x4FEE # -0x8F44 0x3D25 0x6101 # -0x8F45 0x3D26 0x62FE # -0x8F46 0x3D27 0x6D32 # -0x8F47 0x3D28 0x79C0 # -0x8F48 0x3D29 0x79CB # -0x8F49 0x3D2A 0x7D42 # -0x8F4A 0x3D2B 0x7E4D # -0x8F4B 0x3D2C 0x7FD2 # -0x8F4C 0x3D2D 0x81ED # -0x8F4D 0x3D2E 0x821F # -0x8F4E 0x3D2F 0x8490 # -0x8F4F 0x3D30 0x8846 # -0x8F50 0x3D31 0x8972 # -0x8F51 0x3D32 0x8B90 # -0x8F52 0x3D33 0x8E74 # -0x8F53 0x3D34 0x8F2F # -0x8F54 0x3D35 0x9031 # -0x8F55 0x3D36 0x914B # -0x8F56 0x3D37 0x916C # -0x8F57 0x3D38 0x96C6 # -0x8F58 0x3D39 0x919C # -0x8F59 0x3D3A 0x4EC0 # -0x8F5A 0x3D3B 0x4F4F # -0x8F5B 0x3D3C 0x5145 # -0x8F5C 0x3D3D 0x5341 # -0x8F5D 0x3D3E 0x5F93 # -0x8F5E 0x3D3F 0x620E # -0x8F5F 0x3D40 0x67D4 # -0x8F60 0x3D41 0x6C41 # -0x8F61 0x3D42 0x6E0B # -0x8F62 0x3D43 0x7363 # -0x8F63 0x3D44 0x7E26 # -0x8F64 0x3D45 0x91CD # -0x8F65 0x3D46 0x9283 # -0x8F66 0x3D47 0x53D4 # -0x8F67 0x3D48 0x5919 # -0x8F68 0x3D49 0x5BBF # -0x8F69 0x3D4A 0x6DD1 # -0x8F6A 0x3D4B 0x795D # -0x8F6B 0x3D4C 0x7E2E # -0x8F6C 0x3D4D 0x7C9B # -0x8F6D 0x3D4E 0x587E # -0x8F6E 0x3D4F 0x719F # -0x8F6F 0x3D50 0x51FA # -0x8F70 0x3D51 0x8853 # -0x8F71 0x3D52 0x8FF0 # -0x8F72 0x3D53 0x4FCA # -0x8F73 0x3D54 0x5CFB # -0x8F74 0x3D55 0x6625 # -0x8F75 0x3D56 0x77AC # -0x8F76 0x3D57 0x7AE3 # -0x8F77 0x3D58 0x821C # -0x8F78 0x3D59 0x99FF # -0x8F79 0x3D5A 0x51C6 # -0x8F7A 0x3D5B 0x5FAA # -0x8F7B 0x3D5C 0x65EC # -0x8F7C 0x3D5D 0x696F # -0x8F7D 0x3D5E 0x6B89 # -0x8F7E 0x3D5F 0x6DF3 # -0x8F80 0x3D60 0x6E96 # -0x8F81 0x3D61 0x6F64 # -0x8F82 0x3D62 0x76FE # -0x8F83 0x3D63 0x7D14 # -0x8F84 0x3D64 0x5DE1 # -0x8F85 0x3D65 0x9075 # -0x8F86 0x3D66 0x9187 # -0x8F87 0x3D67 0x9806 # -0x8F88 0x3D68 0x51E6 # -0x8F89 0x3D69 0x521D # -0x8F8A 0x3D6A 0x6240 # -0x8F8B 0x3D6B 0x6691 # -0x8F8C 0x3D6C 0x66D9 # -0x8F8D 0x3D6D 0x6E1A # -0x8F8E 0x3D6E 0x5EB6 # -0x8F8F 0x3D6F 0x7DD2 # -0x8F90 0x3D70 0x7F72 # -0x8F91 0x3D71 0x66F8 # -0x8F92 0x3D72 0x85AF # -0x8F93 0x3D73 0x85F7 # -0x8F94 0x3D74 0x8AF8 # -0x8F95 0x3D75 0x52A9 # -0x8F96 0x3D76 0x53D9 # -0x8F97 0x3D77 0x5973 # -0x8F98 0x3D78 0x5E8F # -0x8F99 0x3D79 0x5F90 # -0x8F9A 0x3D7A 0x6055 # -0x8F9B 0x3D7B 0x92E4 # -0x8F9C 0x3D7C 0x9664 # -0x8F9D 0x3D7D 0x50B7 # -0x8F9E 0x3D7E 0x511F # -0x8F9F 0x3E21 0x52DD # -0x8FA0 0x3E22 0x5320 # -0x8FA1 0x3E23 0x5347 # -0x8FA2 0x3E24 0x53EC # -0x8FA3 0x3E25 0x54E8 # -0x8FA4 0x3E26 0x5546 # -0x8FA5 0x3E27 0x5531 # -0x8FA6 0x3E28 0x5617 # -0x8FA7 0x3E29 0x5968 # -0x8FA8 0x3E2A 0x59BE # -0x8FA9 0x3E2B 0x5A3C # -0x8FAA 0x3E2C 0x5BB5 # -0x8FAB 0x3E2D 0x5C06 # -0x8FAC 0x3E2E 0x5C0F # -0x8FAD 0x3E2F 0x5C11 # -0x8FAE 0x3E30 0x5C1A # -0x8FAF 0x3E31 0x5E84 # -0x8FB0 0x3E32 0x5E8A # -0x8FB1 0x3E33 0x5EE0 # -0x8FB2 0x3E34 0x5F70 # -0x8FB3 0x3E35 0x627F # -0x8FB4 0x3E36 0x6284 # -0x8FB5 0x3E37 0x62DB # -0x8FB6 0x3E38 0x638C # -0x8FB7 0x3E39 0x6377 # -0x8FB8 0x3E3A 0x6607 # -0x8FB9 0x3E3B 0x660C # -0x8FBA 0x3E3C 0x662D # -0x8FBB 0x3E3D 0x6676 # -0x8FBC 0x3E3E 0x677E # -0x8FBD 0x3E3F 0x68A2 # -0x8FBE 0x3E40 0x6A1F # -0x8FBF 0x3E41 0x6A35 # -0x8FC0 0x3E42 0x6CBC # -0x8FC1 0x3E43 0x6D88 # -0x8FC2 0x3E44 0x6E09 # -0x8FC3 0x3E45 0x6E58 # -0x8FC4 0x3E46 0x713C # -0x8FC5 0x3E47 0x7126 # -0x8FC6 0x3E48 0x7167 # -0x8FC7 0x3E49 0x75C7 # -0x8FC8 0x3E4A 0x7701 # -0x8FC9 0x3E4B 0x785D # -0x8FCA 0x3E4C 0x7901 # -0x8FCB 0x3E4D 0x7965 # -0x8FCC 0x3E4E 0x79F0 # -0x8FCD 0x3E4F 0x7AE0 # -0x8FCE 0x3E50 0x7B11 # -0x8FCF 0x3E51 0x7CA7 # -0x8FD0 0x3E52 0x7D39 # -0x8FD1 0x3E53 0x8096 # -0x8FD2 0x3E54 0x83D6 # -0x8FD3 0x3E55 0x848B # -0x8FD4 0x3E56 0x8549 # -0x8FD5 0x3E57 0x885D # -0x8FD6 0x3E58 0x88F3 # -0x8FD7 0x3E59 0x8A1F # -0x8FD8 0x3E5A 0x8A3C # -0x8FD9 0x3E5B 0x8A54 # -0x8FDA 0x3E5C 0x8A73 # -0x8FDB 0x3E5D 0x8C61 # -0x8FDC 0x3E5E 0x8CDE # -0x8FDD 0x3E5F 0x91A4 # -0x8FDE 0x3E60 0x9266 # -0x8FDF 0x3E61 0x937E # -0x8FE0 0x3E62 0x9418 # -0x8FE1 0x3E63 0x969C # -0x8FE2 0x3E64 0x9798 # -0x8FE3 0x3E65 0x4E0A # -0x8FE4 0x3E66 0x4E08 # -0x8FE5 0x3E67 0x4E1E # -0x8FE6 0x3E68 0x4E57 # -0x8FE7 0x3E69 0x5197 # -0x8FE8 0x3E6A 0x5270 # -0x8FE9 0x3E6B 0x57CE # -0x8FEA 0x3E6C 0x5834 # -0x8FEB 0x3E6D 0x58CC # -0x8FEC 0x3E6E 0x5B22 # -0x8FED 0x3E6F 0x5E38 # -0x8FEE 0x3E70 0x60C5 # -0x8FEF 0x3E71 0x64FE # -0x8FF0 0x3E72 0x6761 # -0x8FF1 0x3E73 0x6756 # -0x8FF2 0x3E74 0x6D44 # -0x8FF3 0x3E75 0x72B6 # -0x8FF4 0x3E76 0x7573 # -0x8FF5 0x3E77 0x7A63 # -0x8FF6 0x3E78 0x84B8 # -0x8FF7 0x3E79 0x8B72 # -0x8FF8 0x3E7A 0x91B8 # -0x8FF9 0x3E7B 0x9320 # -0x8FFA 0x3E7C 0x5631 # -0x8FFB 0x3E7D 0x57F4 # -0x8FFC 0x3E7E 0x98FE # -0x9040 0x3F21 0x62ED # -0x9041 0x3F22 0x690D # -0x9042 0x3F23 0x6B96 # -0x9043 0x3F24 0x71ED # -0x9044 0x3F25 0x7E54 # -0x9045 0x3F26 0x8077 # -0x9046 0x3F27 0x8272 # -0x9047 0x3F28 0x89E6 # -0x9048 0x3F29 0x98DF # -0x9049 0x3F2A 0x8755 # -0x904A 0x3F2B 0x8FB1 # -0x904B 0x3F2C 0x5C3B # -0x904C 0x3F2D 0x4F38 # -0x904D 0x3F2E 0x4FE1 # -0x904E 0x3F2F 0x4FB5 # -0x904F 0x3F30 0x5507 # -0x9050 0x3F31 0x5A20 # -0x9051 0x3F32 0x5BDD # -0x9052 0x3F33 0x5BE9 # -0x9053 0x3F34 0x5FC3 # -0x9054 0x3F35 0x614E # -0x9055 0x3F36 0x632F # -0x9056 0x3F37 0x65B0 # -0x9057 0x3F38 0x664B # -0x9058 0x3F39 0x68EE # -0x9059 0x3F3A 0x699B # -0x905A 0x3F3B 0x6D78 # -0x905B 0x3F3C 0x6DF1 # -0x905C 0x3F3D 0x7533 # -0x905D 0x3F3E 0x75B9 # -0x905E 0x3F3F 0x771F # -0x905F 0x3F40 0x795E # -0x9060 0x3F41 0x79E6 # -0x9061 0x3F42 0x7D33 # -0x9062 0x3F43 0x81E3 # -0x9063 0x3F44 0x82AF # -0x9064 0x3F45 0x85AA # -0x9065 0x3F46 0x89AA # -0x9066 0x3F47 0x8A3A # -0x9067 0x3F48 0x8EAB # -0x9068 0x3F49 0x8F9B # -0x9069 0x3F4A 0x9032 # -0x906A 0x3F4B 0x91DD # -0x906B 0x3F4C 0x9707 # -0x906C 0x3F4D 0x4EBA # -0x906D 0x3F4E 0x4EC1 # -0x906E 0x3F4F 0x5203 # -0x906F 0x3F50 0x5875 # -0x9070 0x3F51 0x58EC # -0x9071 0x3F52 0x5C0B # -0x9072 0x3F53 0x751A # -0x9073 0x3F54 0x5C3D # -0x9074 0x3F55 0x814E # -0x9075 0x3F56 0x8A0A # -0x9076 0x3F57 0x8FC5 # -0x9077 0x3F58 0x9663 # -0x9078 0x3F59 0x976D # -0x9079 0x3F5A 0x7B25 # -0x907A 0x3F5B 0x8ACF # -0x907B 0x3F5C 0x9808 # -0x907C 0x3F5D 0x9162 # -0x907D 0x3F5E 0x56F3 # -0x907E 0x3F5F 0x53A8 # -0x9080 0x3F60 0x9017 # -0x9081 0x3F61 0x5439 # -0x9082 0x3F62 0x5782 # -0x9083 0x3F63 0x5E25 # -0x9084 0x3F64 0x63A8 # -0x9085 0x3F65 0x6C34 # -0x9086 0x3F66 0x708A # -0x9087 0x3F67 0x7761 # -0x9088 0x3F68 0x7C8B # -0x9089 0x3F69 0x7FE0 # -0x908A 0x3F6A 0x8870 # -0x908B 0x3F6B 0x9042 # -0x908C 0x3F6C 0x9154 # -0x908D 0x3F6D 0x9310 # -0x908E 0x3F6E 0x9318 # -0x908F 0x3F6F 0x968F # -0x9090 0x3F70 0x745E # -0x9091 0x3F71 0x9AC4 # -0x9092 0x3F72 0x5D07 # -0x9093 0x3F73 0x5D69 # -0x9094 0x3F74 0x6570 # -0x9095 0x3F75 0x67A2 # -0x9096 0x3F76 0x8DA8 # -0x9097 0x3F77 0x96DB # -0x9098 0x3F78 0x636E # -0x9099 0x3F79 0x6749 # -0x909A 0x3F7A 0x6919 # -0x909B 0x3F7B 0x83C5 # -0x909C 0x3F7C 0x9817 # -0x909D 0x3F7D 0x96C0 # -0x909E 0x3F7E 0x88FE # -0x909F 0x4021 0x6F84 # -0x90A0 0x4022 0x647A # -0x90A1 0x4023 0x5BF8 # -0x90A2 0x4024 0x4E16 # -0x90A3 0x4025 0x702C # -0x90A4 0x4026 0x755D # -0x90A5 0x4027 0x662F # -0x90A6 0x4028 0x51C4 # -0x90A7 0x4029 0x5236 # -0x90A8 0x402A 0x52E2 # -0x90A9 0x402B 0x59D3 # -0x90AA 0x402C 0x5F81 # -0x90AB 0x402D 0x6027 # -0x90AC 0x402E 0x6210 # -0x90AD 0x402F 0x653F # -0x90AE 0x4030 0x6574 # -0x90AF 0x4031 0x661F # -0x90B0 0x4032 0x6674 # -0x90B1 0x4033 0x68F2 # -0x90B2 0x4034 0x6816 # -0x90B3 0x4035 0x6B63 # -0x90B4 0x4036 0x6E05 # -0x90B5 0x4037 0x7272 # -0x90B6 0x4038 0x751F # -0x90B7 0x4039 0x76DB # -0x90B8 0x403A 0x7CBE # -0x90B9 0x403B 0x8056 # -0x90BA 0x403C 0x58F0 # -0x90BB 0x403D 0x88FD # -0x90BC 0x403E 0x897F # -0x90BD 0x403F 0x8AA0 # -0x90BE 0x4040 0x8A93 # -0x90BF 0x4041 0x8ACB # -0x90C0 0x4042 0x901D # -0x90C1 0x4043 0x9192 # -0x90C2 0x4044 0x9752 # -0x90C3 0x4045 0x9759 # -0x90C4 0x4046 0x6589 # -0x90C5 0x4047 0x7A0E # -0x90C6 0x4048 0x8106 # -0x90C7 0x4049 0x96BB # -0x90C8 0x404A 0x5E2D # -0x90C9 0x404B 0x60DC # -0x90CA 0x404C 0x621A # -0x90CB 0x404D 0x65A5 # -0x90CC 0x404E 0x6614 # -0x90CD 0x404F 0x6790 # -0x90CE 0x4050 0x77F3 # -0x90CF 0x4051 0x7A4D # -0x90D0 0x4052 0x7C4D # -0x90D1 0x4053 0x7E3E # -0x90D2 0x4054 0x810A # -0x90D3 0x4055 0x8CAC # -0x90D4 0x4056 0x8D64 # -0x90D5 0x4057 0x8DE1 # -0x90D6 0x4058 0x8E5F # -0x90D7 0x4059 0x78A9 # -0x90D8 0x405A 0x5207 # -0x90D9 0x405B 0x62D9 # -0x90DA 0x405C 0x63A5 # -0x90DB 0x405D 0x6442 # -0x90DC 0x405E 0x6298 # -0x90DD 0x405F 0x8A2D # -0x90DE 0x4060 0x7A83 # -0x90DF 0x4061 0x7BC0 # -0x90E0 0x4062 0x8AAC # -0x90E1 0x4063 0x96EA # -0x90E2 0x4064 0x7D76 # -0x90E3 0x4065 0x820C # -0x90E4 0x4066 0x8749 # -0x90E5 0x4067 0x4ED9 # -0x90E6 0x4068 0x5148 # -0x90E7 0x4069 0x5343 # -0x90E8 0x406A 0x5360 # -0x90E9 0x406B 0x5BA3 # -0x90EA 0x406C 0x5C02 # -0x90EB 0x406D 0x5C16 # -0x90EC 0x406E 0x5DDD # -0x90ED 0x406F 0x6226 # -0x90EE 0x4070 0x6247 # -0x90EF 0x4071 0x64B0 # -0x90F0 0x4072 0x6813 # -0x90F1 0x4073 0x6834 # -0x90F2 0x4074 0x6CC9 # -0x90F3 0x4075 0x6D45 # -0x90F4 0x4076 0x6D17 # -0x90F5 0x4077 0x67D3 # -0x90F6 0x4078 0x6F5C # -0x90F7 0x4079 0x714E # -0x90F8 0x407A 0x717D # -0x90F9 0x407B 0x65CB # -0x90FA 0x407C 0x7A7F # -0x90FB 0x407D 0x7BAD # -0x90FC 0x407E 0x7DDA # -0x9140 0x4121 0x7E4A # -0x9141 0x4122 0x7FA8 # -0x9142 0x4123 0x817A # -0x9143 0x4124 0x821B # -0x9144 0x4125 0x8239 # -0x9145 0x4126 0x85A6 # -0x9146 0x4127 0x8A6E # -0x9147 0x4128 0x8CCE # -0x9148 0x4129 0x8DF5 # -0x9149 0x412A 0x9078 # -0x914A 0x412B 0x9077 # -0x914B 0x412C 0x92AD # -0x914C 0x412D 0x9291 # -0x914D 0x412E 0x9583 # -0x914E 0x412F 0x9BAE # -0x914F 0x4130 0x524D # -0x9150 0x4131 0x5584 # -0x9151 0x4132 0x6F38 # -0x9152 0x4133 0x7136 # -0x9153 0x4134 0x5168 # -0x9154 0x4135 0x7985 # -0x9155 0x4136 0x7E55 # -0x9156 0x4137 0x81B3 # -0x9157 0x4138 0x7CCE # -0x9158 0x4139 0x564C # -0x9159 0x413A 0x5851 # -0x915A 0x413B 0x5CA8 # -0x915B 0x413C 0x63AA # -0x915C 0x413D 0x66FE # -0x915D 0x413E 0x66FD # -0x915E 0x413F 0x695A # -0x915F 0x4140 0x72D9 # -0x9160 0x4141 0x758F # -0x9161 0x4142 0x758E # -0x9162 0x4143 0x790E # -0x9163 0x4144 0x7956 # -0x9164 0x4145 0x79DF # -0x9165 0x4146 0x7C97 # -0x9166 0x4147 0x7D20 # -0x9167 0x4148 0x7D44 # -0x9168 0x4149 0x8607 # -0x9169 0x414A 0x8A34 # -0x916A 0x414B 0x963B # -0x916B 0x414C 0x9061 # -0x916C 0x414D 0x9F20 # -0x916D 0x414E 0x50E7 # -0x916E 0x414F 0x5275 # -0x916F 0x4150 0x53CC # -0x9170 0x4151 0x53E2 # -0x9171 0x4152 0x5009 # -0x9172 0x4153 0x55AA # -0x9173 0x4154 0x58EE # -0x9174 0x4155 0x594F # -0x9175 0x4156 0x723D # -0x9176 0x4157 0x5B8B # -0x9177 0x4158 0x5C64 # -0x9178 0x4159 0x531D # -0x9179 0x415A 0x60E3 # -0x917A 0x415B 0x60F3 # -0x917B 0x415C 0x635C # -0x917C 0x415D 0x6383 # -0x917D 0x415E 0x633F # -0x917E 0x415F 0x63BB # -0x9180 0x4160 0x64CD # -0x9181 0x4161 0x65E9 # -0x9182 0x4162 0x66F9 # -0x9183 0x4163 0x5DE3 # -0x9184 0x4164 0x69CD # -0x9185 0x4165 0x69FD # -0x9186 0x4166 0x6F15 # -0x9187 0x4167 0x71E5 # -0x9188 0x4168 0x4E89 # -0x9189 0x4169 0x75E9 # -0x918A 0x416A 0x76F8 # -0x918B 0x416B 0x7A93 # -0x918C 0x416C 0x7CDF # -0x918D 0x416D 0x7DCF # -0x918E 0x416E 0x7D9C # -0x918F 0x416F 0x8061 # -0x9190 0x4170 0x8349 # -0x9191 0x4171 0x8358 # -0x9192 0x4172 0x846C # -0x9193 0x4173 0x84BC # -0x9194 0x4174 0x85FB # -0x9195 0x4175 0x88C5 # -0x9196 0x4176 0x8D70 # -0x9197 0x4177 0x9001 # -0x9198 0x4178 0x906D # -0x9199 0x4179 0x9397 # -0x919A 0x417A 0x971C # -0x919B 0x417B 0x9A12 # -0x919C 0x417C 0x50CF # -0x919D 0x417D 0x5897 # -0x919E 0x417E 0x618E # -0x919F 0x4221 0x81D3 # -0x91A0 0x4222 0x8535 # -0x91A1 0x4223 0x8D08 # -0x91A2 0x4224 0x9020 # -0x91A3 0x4225 0x4FC3 # -0x91A4 0x4226 0x5074 # -0x91A5 0x4227 0x5247 # -0x91A6 0x4228 0x5373 # -0x91A7 0x4229 0x606F # -0x91A8 0x422A 0x6349 # -0x91A9 0x422B 0x675F # -0x91AA 0x422C 0x6E2C # -0x91AB 0x422D 0x8DB3 # -0x91AC 0x422E 0x901F # -0x91AD 0x422F 0x4FD7 # -0x91AE 0x4230 0x5C5E # -0x91AF 0x4231 0x8CCA # -0x91B0 0x4232 0x65CF # -0x91B1 0x4233 0x7D9A # -0x91B2 0x4234 0x5352 # -0x91B3 0x4235 0x8896 # -0x91B4 0x4236 0x5176 # -0x91B5 0x4237 0x63C3 # -0x91B6 0x4238 0x5B58 # -0x91B7 0x4239 0x5B6B # -0x91B8 0x423A 0x5C0A # -0x91B9 0x423B 0x640D # -0x91BA 0x423C 0x6751 # -0x91BB 0x423D 0x905C # -0x91BC 0x423E 0x4ED6 # -0x91BD 0x423F 0x591A # -0x91BE 0x4240 0x592A # -0x91BF 0x4241 0x6C70 # -0x91C0 0x4242 0x8A51 # -0x91C1 0x4243 0x553E # -0x91C2 0x4244 0x5815 # -0x91C3 0x4245 0x59A5 # -0x91C4 0x4246 0x60F0 # -0x91C5 0x4247 0x6253 # -0x91C6 0x4248 0x67C1 # -0x91C7 0x4249 0x8235 # -0x91C8 0x424A 0x6955 # -0x91C9 0x424B 0x9640 # -0x91CA 0x424C 0x99C4 # -0x91CB 0x424D 0x9A28 # -0x91CC 0x424E 0x4F53 # -0x91CD 0x424F 0x5806 # -0x91CE 0x4250 0x5BFE # -0x91CF 0x4251 0x8010 # -0x91D0 0x4252 0x5CB1 # -0x91D1 0x4253 0x5E2F # -0x91D2 0x4254 0x5F85 # -0x91D3 0x4255 0x6020 # -0x91D4 0x4256 0x614B # -0x91D5 0x4257 0x6234 # -0x91D6 0x4258 0x66FF # -0x91D7 0x4259 0x6CF0 # -0x91D8 0x425A 0x6EDE # -0x91D9 0x425B 0x80CE # -0x91DA 0x425C 0x817F # -0x91DB 0x425D 0x82D4 # -0x91DC 0x425E 0x888B # -0x91DD 0x425F 0x8CB8 # -0x91DE 0x4260 0x9000 # -0x91DF 0x4261 0x902E # -0x91E0 0x4262 0x968A # -0x91E1 0x4263 0x9EDB # -0x91E2 0x4264 0x9BDB # -0x91E3 0x4265 0x4EE3 # -0x91E4 0x4266 0x53F0 # -0x91E5 0x4267 0x5927 # -0x91E6 0x4268 0x7B2C # -0x91E7 0x4269 0x918D # -0x91E8 0x426A 0x984C # -0x91E9 0x426B 0x9DF9 # -0x91EA 0x426C 0x6EDD # -0x91EB 0x426D 0x7027 # -0x91EC 0x426E 0x5353 # -0x91ED 0x426F 0x5544 # -0x91EE 0x4270 0x5B85 # -0x91EF 0x4271 0x6258 # -0x91F0 0x4272 0x629E # -0x91F1 0x4273 0x62D3 # -0x91F2 0x4274 0x6CA2 # -0x91F3 0x4275 0x6FEF # -0x91F4 0x4276 0x7422 # -0x91F5 0x4277 0x8A17 # -0x91F6 0x4278 0x9438 # -0x91F7 0x4279 0x6FC1 # -0x91F8 0x427A 0x8AFE # -0x91F9 0x427B 0x8338 # -0x91FA 0x427C 0x51E7 # -0x91FB 0x427D 0x86F8 # -0x91FC 0x427E 0x53EA # -0x9240 0x4321 0x53E9 # -0x9241 0x4322 0x4F46 # -0x9242 0x4323 0x9054 # -0x9243 0x4324 0x8FB0 # -0x9244 0x4325 0x596A # -0x9245 0x4326 0x8131 # -0x9246 0x4327 0x5DFD # -0x9247 0x4328 0x7AEA # -0x9248 0x4329 0x8FBF # -0x9249 0x432A 0x68DA # -0x924A 0x432B 0x8C37 # -0x924B 0x432C 0x72F8 # -0x924C 0x432D 0x9C48 # -0x924D 0x432E 0x6A3D # -0x924E 0x432F 0x8AB0 # -0x924F 0x4330 0x4E39 # -0x9250 0x4331 0x5358 # -0x9251 0x4332 0x5606 # -0x9252 0x4333 0x5766 # -0x9253 0x4334 0x62C5 # -0x9254 0x4335 0x63A2 # -0x9255 0x4336 0x65E6 # -0x9256 0x4337 0x6B4E # -0x9257 0x4338 0x6DE1 # -0x9258 0x4339 0x6E5B # -0x9259 0x433A 0x70AD # -0x925A 0x433B 0x77ED # -0x925B 0x433C 0x7AEF # -0x925C 0x433D 0x7BAA # -0x925D 0x433E 0x7DBB # -0x925E 0x433F 0x803D # -0x925F 0x4340 0x80C6 # -0x9260 0x4341 0x86CB # -0x9261 0x4342 0x8A95 # -0x9262 0x4343 0x935B # -0x9263 0x4344 0x56E3 # -0x9264 0x4345 0x58C7 # -0x9265 0x4346 0x5F3E # -0x9266 0x4347 0x65AD # -0x9267 0x4348 0x6696 # -0x9268 0x4349 0x6A80 # -0x9269 0x434A 0x6BB5 # -0x926A 0x434B 0x7537 # -0x926B 0x434C 0x8AC7 # -0x926C 0x434D 0x5024 # -0x926D 0x434E 0x77E5 # -0x926E 0x434F 0x5730 # -0x926F 0x4350 0x5F1B # -0x9270 0x4351 0x6065 # -0x9271 0x4352 0x667A # -0x9272 0x4353 0x6C60 # -0x9273 0x4354 0x75F4 # -0x9274 0x4355 0x7A1A # -0x9275 0x4356 0x7F6E # -0x9276 0x4357 0x81F4 # -0x9277 0x4358 0x8718 # -0x9278 0x4359 0x9045 # -0x9279 0x435A 0x99B3 # -0x927A 0x435B 0x7BC9 # -0x927B 0x435C 0x755C # -0x927C 0x435D 0x7AF9 # -0x927D 0x435E 0x7B51 # -0x927E 0x435F 0x84C4 # -0x9280 0x4360 0x9010 # -0x9281 0x4361 0x79E9 # -0x9282 0x4362 0x7A92 # -0x9283 0x4363 0x8336 # -0x9284 0x4364 0x5AE1 # -0x9285 0x4365 0x7740 # -0x9286 0x4366 0x4E2D # -0x9287 0x4367 0x4EF2 # -0x9288 0x4368 0x5B99 # -0x9289 0x4369 0x5FE0 # -0x928A 0x436A 0x62BD # -0x928B 0x436B 0x663C # -0x928C 0x436C 0x67F1 # -0x928D 0x436D 0x6CE8 # -0x928E 0x436E 0x866B # -0x928F 0x436F 0x8877 # -0x9290 0x4370 0x8A3B # -0x9291 0x4371 0x914E # -0x9292 0x4372 0x92F3 # -0x9293 0x4373 0x99D0 # -0x9294 0x4374 0x6A17 # -0x9295 0x4375 0x7026 # -0x9296 0x4376 0x732A # -0x9297 0x4377 0x82E7 # -0x9298 0x4378 0x8457 # -0x9299 0x4379 0x8CAF # -0x929A 0x437A 0x4E01 # -0x929B 0x437B 0x5146 # -0x929C 0x437C 0x51CB # -0x929D 0x437D 0x558B # -0x929E 0x437E 0x5BF5 # -0x929F 0x4421 0x5E16 # -0x92A0 0x4422 0x5E33 # -0x92A1 0x4423 0x5E81 # -0x92A2 0x4424 0x5F14 # -0x92A3 0x4425 0x5F35 # -0x92A4 0x4426 0x5F6B # -0x92A5 0x4427 0x5FB4 # -0x92A6 0x4428 0x61F2 # -0x92A7 0x4429 0x6311 # -0x92A8 0x442A 0x66A2 # -0x92A9 0x442B 0x671D # -0x92AA 0x442C 0x6F6E # -0x92AB 0x442D 0x7252 # -0x92AC 0x442E 0x753A # -0x92AD 0x442F 0x773A # -0x92AE 0x4430 0x8074 # -0x92AF 0x4431 0x8139 # -0x92B0 0x4432 0x8178 # -0x92B1 0x4433 0x8776 # -0x92B2 0x4434 0x8ABF # -0x92B3 0x4435 0x8ADC # -0x92B4 0x4436 0x8D85 # -0x92B5 0x4437 0x8DF3 # -0x92B6 0x4438 0x929A # -0x92B7 0x4439 0x9577 # -0x92B8 0x443A 0x9802 # -0x92B9 0x443B 0x9CE5 # -0x92BA 0x443C 0x52C5 # -0x92BB 0x443D 0x6357 # -0x92BC 0x443E 0x76F4 # -0x92BD 0x443F 0x6715 # -0x92BE 0x4440 0x6C88 # -0x92BF 0x4441 0x73CD # -0x92C0 0x4442 0x8CC3 # -0x92C1 0x4443 0x93AE # -0x92C2 0x4444 0x9673 # -0x92C3 0x4445 0x6D25 # -0x92C4 0x4446 0x589C # -0x92C5 0x4447 0x690E # -0x92C6 0x4448 0x69CC # -0x92C7 0x4449 0x8FFD # -0x92C8 0x444A 0x939A # -0x92C9 0x444B 0x75DB # -0x92CA 0x444C 0x901A # -0x92CB 0x444D 0x585A # -0x92CC 0x444E 0x6802 # -0x92CD 0x444F 0x63B4 # -0x92CE 0x4450 0x69FB # -0x92CF 0x4451 0x4F43 # -0x92D0 0x4452 0x6F2C # -0x92D1 0x4453 0x67D8 # -0x92D2 0x4454 0x8FBB # -0x92D3 0x4455 0x8526 # -0x92D4 0x4456 0x7DB4 # -0x92D5 0x4457 0x9354 # -0x92D6 0x4458 0x693F # -0x92D7 0x4459 0x6F70 # -0x92D8 0x445A 0x576A # -0x92D9 0x445B 0x58F7 # -0x92DA 0x445C 0x5B2C # -0x92DB 0x445D 0x7D2C # -0x92DC 0x445E 0x722A # -0x92DD 0x445F 0x540A # -0x92DE 0x4460 0x91E3 # -0x92DF 0x4461 0x9DB4 # -0x92E0 0x4462 0x4EAD # -0x92E1 0x4463 0x4F4E # -0x92E2 0x4464 0x505C # -0x92E3 0x4465 0x5075 # -0x92E4 0x4466 0x5243 # -0x92E5 0x4467 0x8C9E # -0x92E6 0x4468 0x5448 # -0x92E7 0x4469 0x5824 # -0x92E8 0x446A 0x5B9A # -0x92E9 0x446B 0x5E1D # -0x92EA 0x446C 0x5E95 # -0x92EB 0x446D 0x5EAD # -0x92EC 0x446E 0x5EF7 # -0x92ED 0x446F 0x5F1F # -0x92EE 0x4470 0x608C # -0x92EF 0x4471 0x62B5 # -0x92F0 0x4472 0x633A # -0x92F1 0x4473 0x63D0 # -0x92F2 0x4474 0x68AF # -0x92F3 0x4475 0x6C40 # -0x92F4 0x4476 0x7887 # -0x92F5 0x4477 0x798E # -0x92F6 0x4478 0x7A0B # -0x92F7 0x4479 0x7DE0 # -0x92F8 0x447A 0x8247 # -0x92F9 0x447B 0x8A02 # -0x92FA 0x447C 0x8AE6 # -0x92FB 0x447D 0x8E44 # -0x92FC 0x447E 0x9013 # -0x9340 0x4521 0x90B8 # -0x9341 0x4522 0x912D # -0x9342 0x4523 0x91D8 # -0x9343 0x4524 0x9F0E # -0x9344 0x4525 0x6CE5 # -0x9345 0x4526 0x6458 # -0x9346 0x4527 0x64E2 # -0x9347 0x4528 0x6575 # -0x9348 0x4529 0x6EF4 # -0x9349 0x452A 0x7684 # -0x934A 0x452B 0x7B1B # -0x934B 0x452C 0x9069 # -0x934C 0x452D 0x93D1 # -0x934D 0x452E 0x6EBA # -0x934E 0x452F 0x54F2 # -0x934F 0x4530 0x5FB9 # -0x9350 0x4531 0x64A4 # -0x9351 0x4532 0x8F4D # -0x9352 0x4533 0x8FED # -0x9353 0x4534 0x9244 # -0x9354 0x4535 0x5178 # -0x9355 0x4536 0x586B # -0x9356 0x4537 0x5929 # -0x9357 0x4538 0x5C55 # -0x9358 0x4539 0x5E97 # -0x9359 0x453A 0x6DFB # -0x935A 0x453B 0x7E8F # -0x935B 0x453C 0x751C # -0x935C 0x453D 0x8CBC # -0x935D 0x453E 0x8EE2 # -0x935E 0x453F 0x985B # -0x935F 0x4540 0x70B9 # -0x9360 0x4541 0x4F1D # -0x9361 0x4542 0x6BBF # -0x9362 0x4543 0x6FB1 # -0x9363 0x4544 0x7530 # -0x9364 0x4545 0x96FB # -0x9365 0x4546 0x514E # -0x9366 0x4547 0x5410 # -0x9367 0x4548 0x5835 # -0x9368 0x4549 0x5857 # -0x9369 0x454A 0x59AC # -0x936A 0x454B 0x5C60 # -0x936B 0x454C 0x5F92 # -0x936C 0x454D 0x6597 # -0x936D 0x454E 0x675C # -0x936E 0x454F 0x6E21 # -0x936F 0x4550 0x767B # -0x9370 0x4551 0x83DF # -0x9371 0x4552 0x8CED # -0x9372 0x4553 0x9014 # -0x9373 0x4554 0x90FD # -0x9374 0x4555 0x934D # -0x9375 0x4556 0x7825 # -0x9376 0x4557 0x783A # -0x9377 0x4558 0x52AA # -0x9378 0x4559 0x5EA6 # -0x9379 0x455A 0x571F # -0x937A 0x455B 0x5974 # -0x937B 0x455C 0x6012 # -0x937C 0x455D 0x5012 # -0x937D 0x455E 0x515A # -0x937E 0x455F 0x51AC # -0x9380 0x4560 0x51CD # -0x9381 0x4561 0x5200 # -0x9382 0x4562 0x5510 # -0x9383 0x4563 0x5854 # -0x9384 0x4564 0x5858 # -0x9385 0x4565 0x5957 # -0x9386 0x4566 0x5B95 # -0x9387 0x4567 0x5CF6 # -0x9388 0x4568 0x5D8B # -0x9389 0x4569 0x60BC # -0x938A 0x456A 0x6295 # -0x938B 0x456B 0x642D # -0x938C 0x456C 0x6771 # -0x938D 0x456D 0x6843 # -0x938E 0x456E 0x68BC # -0x938F 0x456F 0x68DF # -0x9390 0x4570 0x76D7 # -0x9391 0x4571 0x6DD8 # -0x9392 0x4572 0x6E6F # -0x9393 0x4573 0x6D9B # -0x9394 0x4574 0x706F # -0x9395 0x4575 0x71C8 # -0x9396 0x4576 0x5F53 # -0x9397 0x4577 0x75D8 # -0x9398 0x4578 0x7977 # -0x9399 0x4579 0x7B49 # -0x939A 0x457A 0x7B54 # -0x939B 0x457B 0x7B52 # -0x939C 0x457C 0x7CD6 # -0x939D 0x457D 0x7D71 # -0x939E 0x457E 0x5230 # -0x939F 0x4621 0x8463 # -0x93A0 0x4622 0x8569 # -0x93A1 0x4623 0x85E4 # -0x93A2 0x4624 0x8A0E # -0x93A3 0x4625 0x8B04 # -0x93A4 0x4626 0x8C46 # -0x93A5 0x4627 0x8E0F # -0x93A6 0x4628 0x9003 # -0x93A7 0x4629 0x900F # -0x93A8 0x462A 0x9419 # -0x93A9 0x462B 0x9676 # -0x93AA 0x462C 0x982D # -0x93AB 0x462D 0x9A30 # -0x93AC 0x462E 0x95D8 # -0x93AD 0x462F 0x50CD # -0x93AE 0x4630 0x52D5 # -0x93AF 0x4631 0x540C # -0x93B0 0x4632 0x5802 # -0x93B1 0x4633 0x5C0E # -0x93B2 0x4634 0x61A7 # -0x93B3 0x4635 0x649E # -0x93B4 0x4636 0x6D1E # -0x93B5 0x4637 0x77B3 # -0x93B6 0x4638 0x7AE5 # -0x93B7 0x4639 0x80F4 # -0x93B8 0x463A 0x8404 # -0x93B9 0x463B 0x9053 # -0x93BA 0x463C 0x9285 # -0x93BB 0x463D 0x5CE0 # -0x93BC 0x463E 0x9D07 # -0x93BD 0x463F 0x533F # -0x93BE 0x4640 0x5F97 # -0x93BF 0x4641 0x5FB3 # -0x93C0 0x4642 0x6D9C # -0x93C1 0x4643 0x7279 # -0x93C2 0x4644 0x7763 # -0x93C3 0x4645 0x79BF # -0x93C4 0x4646 0x7BE4 # -0x93C5 0x4647 0x6BD2 # -0x93C6 0x4648 0x72EC # -0x93C7 0x4649 0x8AAD # -0x93C8 0x464A 0x6803 # -0x93C9 0x464B 0x6A61 # -0x93CA 0x464C 0x51F8 # -0x93CB 0x464D 0x7A81 # -0x93CC 0x464E 0x6934 # -0x93CD 0x464F 0x5C4A # -0x93CE 0x4650 0x9CF6 # -0x93CF 0x4651 0x82EB # -0x93D0 0x4652 0x5BC5 # -0x93D1 0x4653 0x9149 # -0x93D2 0x4654 0x701E # -0x93D3 0x4655 0x5678 # -0x93D4 0x4656 0x5C6F # -0x93D5 0x4657 0x60C7 # -0x93D6 0x4658 0x6566 # -0x93D7 0x4659 0x6C8C # -0x93D8 0x465A 0x8C5A # -0x93D9 0x465B 0x9041 # -0x93DA 0x465C 0x9813 # -0x93DB 0x465D 0x5451 # -0x93DC 0x465E 0x66C7 # -0x93DD 0x465F 0x920D # -0x93DE 0x4660 0x5948 # -0x93DF 0x4661 0x90A3 # -0x93E0 0x4662 0x5185 # -0x93E1 0x4663 0x4E4D # -0x93E2 0x4664 0x51EA # -0x93E3 0x4665 0x8599 # -0x93E4 0x4666 0x8B0E # -0x93E5 0x4667 0x7058 # -0x93E6 0x4668 0x637A # -0x93E7 0x4669 0x934B # -0x93E8 0x466A 0x6962 # -0x93E9 0x466B 0x99B4 # -0x93EA 0x466C 0x7E04 # -0x93EB 0x466D 0x7577 # -0x93EC 0x466E 0x5357 # -0x93ED 0x466F 0x6960 # -0x93EE 0x4670 0x8EDF # -0x93EF 0x4671 0x96E3 # -0x93F0 0x4672 0x6C5D # -0x93F1 0x4673 0x4E8C # -0x93F2 0x4674 0x5C3C # -0x93F3 0x4675 0x5F10 # -0x93F4 0x4676 0x8FE9 # -0x93F5 0x4677 0x5302 # -0x93F6 0x4678 0x8CD1 # -0x93F7 0x4679 0x8089 # -0x93F8 0x467A 0x8679 # -0x93F9 0x467B 0x5EFF # -0x93FA 0x467C 0x65E5 # -0x93FB 0x467D 0x4E73 # -0x93FC 0x467E 0x5165 # -0x9440 0x4721 0x5982 # -0x9441 0x4722 0x5C3F # -0x9442 0x4723 0x97EE # -0x9443 0x4724 0x4EFB # -0x9444 0x4725 0x598A # -0x9445 0x4726 0x5FCD # -0x9446 0x4727 0x8A8D # -0x9447 0x4728 0x6FE1 # -0x9448 0x4729 0x79B0 # -0x9449 0x472A 0x7962 # -0x944A 0x472B 0x5BE7 # -0x944B 0x472C 0x8471 # -0x944C 0x472D 0x732B # -0x944D 0x472E 0x71B1 # -0x944E 0x472F 0x5E74 # -0x944F 0x4730 0x5FF5 # -0x9450 0x4731 0x637B # -0x9451 0x4732 0x649A # -0x9452 0x4733 0x71C3 # -0x9453 0x4734 0x7C98 # -0x9454 0x4735 0x4E43 # -0x9455 0x4736 0x5EFC # -0x9456 0x4737 0x4E4B # -0x9457 0x4738 0x57DC # -0x9458 0x4739 0x56A2 # -0x9459 0x473A 0x60A9 # -0x945A 0x473B 0x6FC3 # -0x945B 0x473C 0x7D0D # -0x945C 0x473D 0x80FD # -0x945D 0x473E 0x8133 # -0x945E 0x473F 0x81BF # -0x945F 0x4740 0x8FB2 # -0x9460 0x4741 0x8997 # -0x9461 0x4742 0x86A4 # -0x9462 0x4743 0x5DF4 # -0x9463 0x4744 0x628A # -0x9464 0x4745 0x64AD # -0x9465 0x4746 0x8987 # -0x9466 0x4747 0x6777 # -0x9467 0x4748 0x6CE2 # -0x9468 0x4749 0x6D3E # -0x9469 0x474A 0x7436 # -0x946A 0x474B 0x7834 # -0x946B 0x474C 0x5A46 # -0x946C 0x474D 0x7F75 # -0x946D 0x474E 0x82AD # -0x946E 0x474F 0x99AC # -0x946F 0x4750 0x4FF3 # -0x9470 0x4751 0x5EC3 # -0x9471 0x4752 0x62DD # -0x9472 0x4753 0x6392 # -0x9473 0x4754 0x6557 # -0x9474 0x4755 0x676F # -0x9475 0x4756 0x76C3 # -0x9476 0x4757 0x724C # -0x9477 0x4758 0x80CC # -0x9478 0x4759 0x80BA # -0x9479 0x475A 0x8F29 # -0x947A 0x475B 0x914D # -0x947B 0x475C 0x500D # -0x947C 0x475D 0x57F9 # -0x947D 0x475E 0x5A92 # -0x947E 0x475F 0x6885 # -0x9480 0x4760 0x6973 # -0x9481 0x4761 0x7164 # -0x9482 0x4762 0x72FD # -0x9483 0x4763 0x8CB7 # -0x9484 0x4764 0x58F2 # -0x9485 0x4765 0x8CE0 # -0x9486 0x4766 0x966A # -0x9487 0x4767 0x9019 # -0x9488 0x4768 0x877F # -0x9489 0x4769 0x79E4 # -0x948A 0x476A 0x77E7 # -0x948B 0x476B 0x8429 # -0x948C 0x476C 0x4F2F # -0x948D 0x476D 0x5265 # -0x948E 0x476E 0x535A # -0x948F 0x476F 0x62CD # -0x9490 0x4770 0x67CF # -0x9491 0x4771 0x6CCA # -0x9492 0x4772 0x767D # -0x9493 0x4773 0x7B94 # -0x9494 0x4774 0x7C95 # -0x9495 0x4775 0x8236 # -0x9496 0x4776 0x8584 # -0x9497 0x4777 0x8FEB # -0x9498 0x4778 0x66DD # -0x9499 0x4779 0x6F20 # -0x949A 0x477A 0x7206 # -0x949B 0x477B 0x7E1B # -0x949C 0x477C 0x83AB # -0x949D 0x477D 0x99C1 # -0x949E 0x477E 0x9EA6 # -0x949F 0x4821 0x51FD # -0x94A0 0x4822 0x7BB1 # -0x94A1 0x4823 0x7872 # -0x94A2 0x4824 0x7BB8 # -0x94A3 0x4825 0x8087 # -0x94A4 0x4826 0x7B48 # -0x94A5 0x4827 0x6AE8 # -0x94A6 0x4828 0x5E61 # -0x94A7 0x4829 0x808C # -0x94A8 0x482A 0x7551 # -0x94A9 0x482B 0x7560 # -0x94AA 0x482C 0x516B # -0x94AB 0x482D 0x9262 # -0x94AC 0x482E 0x6E8C # -0x94AD 0x482F 0x767A # -0x94AE 0x4830 0x9197 # -0x94AF 0x4831 0x9AEA # -0x94B0 0x4832 0x4F10 # -0x94B1 0x4833 0x7F70 # -0x94B2 0x4834 0x629C # -0x94B3 0x4835 0x7B4F # -0x94B4 0x4836 0x95A5 # -0x94B5 0x4837 0x9CE9 # -0x94B6 0x4838 0x567A # -0x94B7 0x4839 0x5859 # -0x94B8 0x483A 0x86E4 # -0x94B9 0x483B 0x96BC # -0x94BA 0x483C 0x4F34 # -0x94BB 0x483D 0x5224 # -0x94BC 0x483E 0x534A # -0x94BD 0x483F 0x53CD # -0x94BE 0x4840 0x53DB # -0x94BF 0x4841 0x5E06 # -0x94C0 0x4842 0x642C # -0x94C1 0x4843 0x6591 # -0x94C2 0x4844 0x677F # -0x94C3 0x4845 0x6C3E # -0x94C4 0x4846 0x6C4E # -0x94C5 0x4847 0x7248 # -0x94C6 0x4848 0x72AF # -0x94C7 0x4849 0x73ED # -0x94C8 0x484A 0x7554 # -0x94C9 0x484B 0x7E41 # -0x94CA 0x484C 0x822C # -0x94CB 0x484D 0x85E9 # -0x94CC 0x484E 0x8CA9 # -0x94CD 0x484F 0x7BC4 # -0x94CE 0x4850 0x91C6 # -0x94CF 0x4851 0x7169 # -0x94D0 0x4852 0x9812 # -0x94D1 0x4853 0x98EF # -0x94D2 0x4854 0x633D # -0x94D3 0x4855 0x6669 # -0x94D4 0x4856 0x756A # -0x94D5 0x4857 0x76E4 # -0x94D6 0x4858 0x78D0 # -0x94D7 0x4859 0x8543 # -0x94D8 0x485A 0x86EE # -0x94D9 0x485B 0x532A # -0x94DA 0x485C 0x5351 # -0x94DB 0x485D 0x5426 # -0x94DC 0x485E 0x5983 # -0x94DD 0x485F 0x5E87 # -0x94DE 0x4860 0x5F7C # -0x94DF 0x4861 0x60B2 # -0x94E0 0x4862 0x6249 # -0x94E1 0x4863 0x6279 # -0x94E2 0x4864 0x62AB # -0x94E3 0x4865 0x6590 # -0x94E4 0x4866 0x6BD4 # -0x94E5 0x4867 0x6CCC # -0x94E6 0x4868 0x75B2 # -0x94E7 0x4869 0x76AE # -0x94E8 0x486A 0x7891 # -0x94E9 0x486B 0x79D8 # -0x94EA 0x486C 0x7DCB # -0x94EB 0x486D 0x7F77 # -0x94EC 0x486E 0x80A5 # -0x94ED 0x486F 0x88AB # -0x94EE 0x4870 0x8AB9 # -0x94EF 0x4871 0x8CBB # -0x94F0 0x4872 0x907F # -0x94F1 0x4873 0x975E # -0x94F2 0x4874 0x98DB # -0x94F3 0x4875 0x6A0B # -0x94F4 0x4876 0x7C38 # -0x94F5 0x4877 0x5099 # -0x94F6 0x4878 0x5C3E # -0x94F7 0x4879 0x5FAE # -0x94F8 0x487A 0x6787 # -0x94F9 0x487B 0x6BD8 # -0x94FA 0x487C 0x7435 # -0x94FB 0x487D 0x7709 # -0x94FC 0x487E 0x7F8E # -0x9540 0x4921 0x9F3B # -0x9541 0x4922 0x67CA # -0x9542 0x4923 0x7A17 # -0x9543 0x4924 0x5339 # -0x9544 0x4925 0x758B # -0x9545 0x4926 0x9AED # -0x9546 0x4927 0x5F66 # -0x9547 0x4928 0x819D # -0x9548 0x4929 0x83F1 # -0x9549 0x492A 0x8098 # -0x954A 0x492B 0x5F3C # -0x954B 0x492C 0x5FC5 # -0x954C 0x492D 0x7562 # -0x954D 0x492E 0x7B46 # -0x954E 0x492F 0x903C # -0x954F 0x4930 0x6867 # -0x9550 0x4931 0x59EB # -0x9551 0x4932 0x5A9B # -0x9552 0x4933 0x7D10 # -0x9553 0x4934 0x767E # -0x9554 0x4935 0x8B2C # -0x9555 0x4936 0x4FF5 # -0x9556 0x4937 0x5F6A # -0x9557 0x4938 0x6A19 # -0x9558 0x4939 0x6C37 # -0x9559 0x493A 0x6F02 # -0x955A 0x493B 0x74E2 # -0x955B 0x493C 0x7968 # -0x955C 0x493D 0x8868 # -0x955D 0x493E 0x8A55 # -0x955E 0x493F 0x8C79 # -0x955F 0x4940 0x5EDF # -0x9560 0x4941 0x63CF # -0x9561 0x4942 0x75C5 # -0x9562 0x4943 0x79D2 # -0x9563 0x4944 0x82D7 # -0x9564 0x4945 0x9328 # -0x9565 0x4946 0x92F2 # -0x9566 0x4947 0x849C # -0x9567 0x4948 0x86ED # -0x9568 0x4949 0x9C2D # -0x9569 0x494A 0x54C1 # -0x956A 0x494B 0x5F6C # -0x956B 0x494C 0x658C # -0x956C 0x494D 0x6D5C # -0x956D 0x494E 0x7015 # -0x956E 0x494F 0x8CA7 # -0x956F 0x4950 0x8CD3 # -0x9570 0x4951 0x983B # -0x9571 0x4952 0x654F # -0x9572 0x4953 0x74F6 # -0x9573 0x4954 0x4E0D # -0x9574 0x4955 0x4ED8 # -0x9575 0x4956 0x57E0 # -0x9576 0x4957 0x592B # -0x9577 0x4958 0x5A66 # -0x9578 0x4959 0x5BCC # -0x9579 0x495A 0x51A8 # -0x957A 0x495B 0x5E03 # -0x957B 0x495C 0x5E9C # -0x957C 0x495D 0x6016 # -0x957D 0x495E 0x6276 # -0x957E 0x495F 0x6577 # -0x9580 0x4960 0x65A7 # -0x9581 0x4961 0x666E # -0x9582 0x4962 0x6D6E # -0x9583 0x4963 0x7236 # -0x9584 0x4964 0x7B26 # -0x9585 0x4965 0x8150 # -0x9586 0x4966 0x819A # -0x9587 0x4967 0x8299 # -0x9588 0x4968 0x8B5C # -0x9589 0x4969 0x8CA0 # -0x958A 0x496A 0x8CE6 # -0x958B 0x496B 0x8D74 # -0x958C 0x496C 0x961C # -0x958D 0x496D 0x9644 # -0x958E 0x496E 0x4FAE # -0x958F 0x496F 0x64AB # -0x9590 0x4970 0x6B66 # -0x9591 0x4971 0x821E # -0x9592 0x4972 0x8461 # -0x9593 0x4973 0x856A # -0x9594 0x4974 0x90E8 # -0x9595 0x4975 0x5C01 # -0x9596 0x4976 0x6953 # -0x9597 0x4977 0x98A8 # -0x9598 0x4978 0x847A # -0x9599 0x4979 0x8557 # -0x959A 0x497A 0x4F0F # -0x959B 0x497B 0x526F # -0x959C 0x497C 0x5FA9 # -0x959D 0x497D 0x5E45 # -0x959E 0x497E 0x670D # -0x959F 0x4A21 0x798F # -0x95A0 0x4A22 0x8179 # -0x95A1 0x4A23 0x8907 # -0x95A2 0x4A24 0x8986 # -0x95A3 0x4A25 0x6DF5 # -0x95A4 0x4A26 0x5F17 # -0x95A5 0x4A27 0x6255 # -0x95A6 0x4A28 0x6CB8 # -0x95A7 0x4A29 0x4ECF # -0x95A8 0x4A2A 0x7269 # -0x95A9 0x4A2B 0x9B92 # -0x95AA 0x4A2C 0x5206 # -0x95AB 0x4A2D 0x543B # -0x95AC 0x4A2E 0x5674 # -0x95AD 0x4A2F 0x58B3 # -0x95AE 0x4A30 0x61A4 # -0x95AF 0x4A31 0x626E # -0x95B0 0x4A32 0x711A # -0x95B1 0x4A33 0x596E # -0x95B2 0x4A34 0x7C89 # -0x95B3 0x4A35 0x7CDE # -0x95B4 0x4A36 0x7D1B # -0x95B5 0x4A37 0x96F0 # -0x95B6 0x4A38 0x6587 # -0x95B7 0x4A39 0x805E # -0x95B8 0x4A3A 0x4E19 # -0x95B9 0x4A3B 0x4F75 # -0x95BA 0x4A3C 0x5175 # -0x95BB 0x4A3D 0x5840 # -0x95BC 0x4A3E 0x5E63 # -0x95BD 0x4A3F 0x5E73 # -0x95BE 0x4A40 0x5F0A # -0x95BF 0x4A41 0x67C4 # -0x95C0 0x4A42 0x4E26 # -0x95C1 0x4A43 0x853D # -0x95C2 0x4A44 0x9589 # -0x95C3 0x4A45 0x965B # -0x95C4 0x4A46 0x7C73 # -0x95C5 0x4A47 0x9801 # -0x95C6 0x4A48 0x50FB # -0x95C7 0x4A49 0x58C1 # -0x95C8 0x4A4A 0x7656 # -0x95C9 0x4A4B 0x78A7 # -0x95CA 0x4A4C 0x5225 # -0x95CB 0x4A4D 0x77A5 # -0x95CC 0x4A4E 0x8511 # -0x95CD 0x4A4F 0x7B86 # -0x95CE 0x4A50 0x504F # -0x95CF 0x4A51 0x5909 # -0x95D0 0x4A52 0x7247 # -0x95D1 0x4A53 0x7BC7 # -0x95D2 0x4A54 0x7DE8 # -0x95D3 0x4A55 0x8FBA # -0x95D4 0x4A56 0x8FD4 # -0x95D5 0x4A57 0x904D # -0x95D6 0x4A58 0x4FBF # -0x95D7 0x4A59 0x52C9 # -0x95D8 0x4A5A 0x5A29 # -0x95D9 0x4A5B 0x5F01 # -0x95DA 0x4A5C 0x97AD # -0x95DB 0x4A5D 0x4FDD # -0x95DC 0x4A5E 0x8217 # -0x95DD 0x4A5F 0x92EA # -0x95DE 0x4A60 0x5703 # -0x95DF 0x4A61 0x6355 # -0x95E0 0x4A62 0x6B69 # -0x95E1 0x4A63 0x752B # -0x95E2 0x4A64 0x88DC # -0x95E3 0x4A65 0x8F14 # -0x95E4 0x4A66 0x7A42 # -0x95E5 0x4A67 0x52DF # -0x95E6 0x4A68 0x5893 # -0x95E7 0x4A69 0x6155 # -0x95E8 0x4A6A 0x620A # -0x95E9 0x4A6B 0x66AE # -0x95EA 0x4A6C 0x6BCD # -0x95EB 0x4A6D 0x7C3F # -0x95EC 0x4A6E 0x83E9 # -0x95ED 0x4A6F 0x5023 # -0x95EE 0x4A70 0x4FF8 # -0x95EF 0x4A71 0x5305 # -0x95F0 0x4A72 0x5446 # -0x95F1 0x4A73 0x5831 # -0x95F2 0x4A74 0x5949 # -0x95F3 0x4A75 0x5B9D # -0x95F4 0x4A76 0x5CF0 # -0x95F5 0x4A77 0x5CEF # -0x95F6 0x4A78 0x5D29 # -0x95F7 0x4A79 0x5E96 # -0x95F8 0x4A7A 0x62B1 # -0x95F9 0x4A7B 0x6367 # -0x95FA 0x4A7C 0x653E # -0x95FB 0x4A7D 0x65B9 # -0x95FC 0x4A7E 0x670B # -0x9640 0x4B21 0x6CD5 # -0x9641 0x4B22 0x6CE1 # -0x9642 0x4B23 0x70F9 # -0x9643 0x4B24 0x7832 # -0x9644 0x4B25 0x7E2B # -0x9645 0x4B26 0x80DE # -0x9646 0x4B27 0x82B3 # -0x9647 0x4B28 0x840C # -0x9648 0x4B29 0x84EC # -0x9649 0x4B2A 0x8702 # -0x964A 0x4B2B 0x8912 # -0x964B 0x4B2C 0x8A2A # -0x964C 0x4B2D 0x8C4A # -0x964D 0x4B2E 0x90A6 # -0x964E 0x4B2F 0x92D2 # -0x964F 0x4B30 0x98FD # -0x9650 0x4B31 0x9CF3 # -0x9651 0x4B32 0x9D6C # -0x9652 0x4B33 0x4E4F # -0x9653 0x4B34 0x4EA1 # -0x9654 0x4B35 0x508D # -0x9655 0x4B36 0x5256 # -0x9656 0x4B37 0x574A # -0x9657 0x4B38 0x59A8 # -0x9658 0x4B39 0x5E3D # -0x9659 0x4B3A 0x5FD8 # -0x965A 0x4B3B 0x5FD9 # -0x965B 0x4B3C 0x623F # -0x965C 0x4B3D 0x66B4 # -0x965D 0x4B3E 0x671B # -0x965E 0x4B3F 0x67D0 # -0x965F 0x4B40 0x68D2 # -0x9660 0x4B41 0x5192 # -0x9661 0x4B42 0x7D21 # -0x9662 0x4B43 0x80AA # -0x9663 0x4B44 0x81A8 # -0x9664 0x4B45 0x8B00 # -0x9665 0x4B46 0x8C8C # -0x9666 0x4B47 0x8CBF # -0x9667 0x4B48 0x927E # -0x9668 0x4B49 0x9632 # -0x9669 0x4B4A 0x5420 # -0x966A 0x4B4B 0x982C # -0x966B 0x4B4C 0x5317 # -0x966C 0x4B4D 0x50D5 # -0x966D 0x4B4E 0x535C # -0x966E 0x4B4F 0x58A8 # -0x966F 0x4B50 0x64B2 # -0x9670 0x4B51 0x6734 # -0x9671 0x4B52 0x7267 # -0x9672 0x4B53 0x7766 # -0x9673 0x4B54 0x7A46 # -0x9674 0x4B55 0x91E6 # -0x9675 0x4B56 0x52C3 # -0x9676 0x4B57 0x6CA1 # -0x9677 0x4B58 0x6B86 # -0x9678 0x4B59 0x5800 # -0x9679 0x4B5A 0x5E4C # -0x967A 0x4B5B 0x5954 # -0x967B 0x4B5C 0x672C # -0x967C 0x4B5D 0x7FFB # -0x967D 0x4B5E 0x51E1 # -0x967E 0x4B5F 0x76C6 # -0x9680 0x4B60 0x6469 # -0x9681 0x4B61 0x78E8 # -0x9682 0x4B62 0x9B54 # -0x9683 0x4B63 0x9EBB # -0x9684 0x4B64 0x57CB # -0x9685 0x4B65 0x59B9 # -0x9686 0x4B66 0x6627 # -0x9687 0x4B67 0x679A # -0x9688 0x4B68 0x6BCE # -0x9689 0x4B69 0x54E9 # -0x968A 0x4B6A 0x69D9 # -0x968B 0x4B6B 0x5E55 # -0x968C 0x4B6C 0x819C # -0x968D 0x4B6D 0x6795 # -0x968E 0x4B6E 0x9BAA # -0x968F 0x4B6F 0x67FE # -0x9690 0x4B70 0x9C52 # -0x9691 0x4B71 0x685D # -0x9692 0x4B72 0x4EA6 # -0x9693 0x4B73 0x4FE3 # -0x9694 0x4B74 0x53C8 # -0x9695 0x4B75 0x62B9 # -0x9696 0x4B76 0x672B # -0x9697 0x4B77 0x6CAB # -0x9698 0x4B78 0x8FC4 # -0x9699 0x4B79 0x4FAD # -0x969A 0x4B7A 0x7E6D # -0x969B 0x4B7B 0x9EBF # -0x969C 0x4B7C 0x4E07 # -0x969D 0x4B7D 0x6162 # -0x969E 0x4B7E 0x6E80 # -0x969F 0x4C21 0x6F2B # -0x96A0 0x4C22 0x8513 # -0x96A1 0x4C23 0x5473 # -0x96A2 0x4C24 0x672A # -0x96A3 0x4C25 0x9B45 # -0x96A4 0x4C26 0x5DF3 # -0x96A5 0x4C27 0x7B95 # -0x96A6 0x4C28 0x5CAC # -0x96A7 0x4C29 0x5BC6 # -0x96A8 0x4C2A 0x871C # -0x96A9 0x4C2B 0x6E4A # -0x96AA 0x4C2C 0x84D1 # -0x96AB 0x4C2D 0x7A14 # -0x96AC 0x4C2E 0x8108 # -0x96AD 0x4C2F 0x5999 # -0x96AE 0x4C30 0x7C8D # -0x96AF 0x4C31 0x6C11 # -0x96B0 0x4C32 0x7720 # -0x96B1 0x4C33 0x52D9 # -0x96B2 0x4C34 0x5922 # -0x96B3 0x4C35 0x7121 # -0x96B4 0x4C36 0x725F # -0x96B5 0x4C37 0x77DB # -0x96B6 0x4C38 0x9727 # -0x96B7 0x4C39 0x9D61 # -0x96B8 0x4C3A 0x690B # -0x96B9 0x4C3B 0x5A7F # -0x96BA 0x4C3C 0x5A18 # -0x96BB 0x4C3D 0x51A5 # -0x96BC 0x4C3E 0x540D # -0x96BD 0x4C3F 0x547D # -0x96BE 0x4C40 0x660E # -0x96BF 0x4C41 0x76DF # -0x96C0 0x4C42 0x8FF7 # -0x96C1 0x4C43 0x9298 # -0x96C2 0x4C44 0x9CF4 # -0x96C3 0x4C45 0x59EA # -0x96C4 0x4C46 0x725D # -0x96C5 0x4C47 0x6EC5 # -0x96C6 0x4C48 0x514D # -0x96C7 0x4C49 0x68C9 # -0x96C8 0x4C4A 0x7DBF # -0x96C9 0x4C4B 0x7DEC # -0x96CA 0x4C4C 0x9762 # -0x96CB 0x4C4D 0x9EBA # -0x96CC 0x4C4E 0x6478 # -0x96CD 0x4C4F 0x6A21 # -0x96CE 0x4C50 0x8302 # -0x96CF 0x4C51 0x5984 # -0x96D0 0x4C52 0x5B5F # -0x96D1 0x4C53 0x6BDB # -0x96D2 0x4C54 0x731B # -0x96D3 0x4C55 0x76F2 # -0x96D4 0x4C56 0x7DB2 # -0x96D5 0x4C57 0x8017 # -0x96D6 0x4C58 0x8499 # -0x96D7 0x4C59 0x5132 # -0x96D8 0x4C5A 0x6728 # -0x96D9 0x4C5B 0x9ED9 # -0x96DA 0x4C5C 0x76EE # -0x96DB 0x4C5D 0x6762 # -0x96DC 0x4C5E 0x52FF # -0x96DD 0x4C5F 0x9905 # -0x96DE 0x4C60 0x5C24 # -0x96DF 0x4C61 0x623B # -0x96E0 0x4C62 0x7C7E # -0x96E1 0x4C63 0x8CB0 # -0x96E2 0x4C64 0x554F # -0x96E3 0x4C65 0x60B6 # -0x96E4 0x4C66 0x7D0B # -0x96E5 0x4C67 0x9580 # -0x96E6 0x4C68 0x5301 # -0x96E7 0x4C69 0x4E5F # -0x96E8 0x4C6A 0x51B6 # -0x96E9 0x4C6B 0x591C # -0x96EA 0x4C6C 0x723A # -0x96EB 0x4C6D 0x8036 # -0x96EC 0x4C6E 0x91CE # -0x96ED 0x4C6F 0x5F25 # -0x96EE 0x4C70 0x77E2 # -0x96EF 0x4C71 0x5384 # -0x96F0 0x4C72 0x5F79 # -0x96F1 0x4C73 0x7D04 # -0x96F2 0x4C74 0x85AC # -0x96F3 0x4C75 0x8A33 # -0x96F4 0x4C76 0x8E8D # -0x96F5 0x4C77 0x9756 # -0x96F6 0x4C78 0x67F3 # -0x96F7 0x4C79 0x85AE # -0x96F8 0x4C7A 0x9453 # -0x96F9 0x4C7B 0x6109 # -0x96FA 0x4C7C 0x6108 # -0x96FB 0x4C7D 0x6CB9 # -0x96FC 0x4C7E 0x7652 # -0x9740 0x4D21 0x8AED # -0x9741 0x4D22 0x8F38 # -0x9742 0x4D23 0x552F # -0x9743 0x4D24 0x4F51 # -0x9744 0x4D25 0x512A # -0x9745 0x4D26 0x52C7 # -0x9746 0x4D27 0x53CB # -0x9747 0x4D28 0x5BA5 # -0x9748 0x4D29 0x5E7D # -0x9749 0x4D2A 0x60A0 # -0x974A 0x4D2B 0x6182 # -0x974B 0x4D2C 0x63D6 # -0x974C 0x4D2D 0x6709 # -0x974D 0x4D2E 0x67DA # -0x974E 0x4D2F 0x6E67 # -0x974F 0x4D30 0x6D8C # -0x9750 0x4D31 0x7336 # -0x9751 0x4D32 0x7337 # -0x9752 0x4D33 0x7531 # -0x9753 0x4D34 0x7950 # -0x9754 0x4D35 0x88D5 # -0x9755 0x4D36 0x8A98 # -0x9756 0x4D37 0x904A # -0x9757 0x4D38 0x9091 # -0x9758 0x4D39 0x90F5 # -0x9759 0x4D3A 0x96C4 # -0x975A 0x4D3B 0x878D # -0x975B 0x4D3C 0x5915 # -0x975C 0x4D3D 0x4E88 # -0x975D 0x4D3E 0x4F59 # -0x975E 0x4D3F 0x4E0E # -0x975F 0x4D40 0x8A89 # -0x9760 0x4D41 0x8F3F # -0x9761 0x4D42 0x9810 # -0x9762 0x4D43 0x50AD # -0x9763 0x4D44 0x5E7C # -0x9764 0x4D45 0x5996 # -0x9765 0x4D46 0x5BB9 # -0x9766 0x4D47 0x5EB8 # -0x9767 0x4D48 0x63DA # -0x9768 0x4D49 0x63FA # -0x9769 0x4D4A 0x64C1 # -0x976A 0x4D4B 0x66DC # -0x976B 0x4D4C 0x694A # -0x976C 0x4D4D 0x69D8 # -0x976D 0x4D4E 0x6D0B # -0x976E 0x4D4F 0x6EB6 # -0x976F 0x4D50 0x7194 # -0x9770 0x4D51 0x7528 # -0x9771 0x4D52 0x7AAF # -0x9772 0x4D53 0x7F8A # -0x9773 0x4D54 0x8000 # -0x9774 0x4D55 0x8449 # -0x9775 0x4D56 0x84C9 # -0x9776 0x4D57 0x8981 # -0x9777 0x4D58 0x8B21 # -0x9778 0x4D59 0x8E0A # -0x9779 0x4D5A 0x9065 # -0x977A 0x4D5B 0x967D # -0x977B 0x4D5C 0x990A # -0x977C 0x4D5D 0x617E # -0x977D 0x4D5E 0x6291 # -0x977E 0x4D5F 0x6B32 # -0x9780 0x4D60 0x6C83 # -0x9781 0x4D61 0x6D74 # -0x9782 0x4D62 0x7FCC # -0x9783 0x4D63 0x7FFC # -0x9784 0x4D64 0x6DC0 # -0x9785 0x4D65 0x7F85 # -0x9786 0x4D66 0x87BA # -0x9787 0x4D67 0x88F8 # -0x9788 0x4D68 0x6765 # -0x9789 0x4D69 0x83B1 # -0x978A 0x4D6A 0x983C # -0x978B 0x4D6B 0x96F7 # -0x978C 0x4D6C 0x6D1B # -0x978D 0x4D6D 0x7D61 # -0x978E 0x4D6E 0x843D # -0x978F 0x4D6F 0x916A # -0x9790 0x4D70 0x4E71 # -0x9791 0x4D71 0x5375 # -0x9792 0x4D72 0x5D50 # -0x9793 0x4D73 0x6B04 # -0x9794 0x4D74 0x6FEB # -0x9795 0x4D75 0x85CD # -0x9796 0x4D76 0x862D # -0x9797 0x4D77 0x89A7 # -0x9798 0x4D78 0x5229 # -0x9799 0x4D79 0x540F # -0x979A 0x4D7A 0x5C65 # -0x979B 0x4D7B 0x674E # -0x979C 0x4D7C 0x68A8 # -0x979D 0x4D7D 0x7406 # -0x979E 0x4D7E 0x7483 # -0x979F 0x4E21 0x75E2 # -0x97A0 0x4E22 0x88CF # -0x97A1 0x4E23 0x88E1 # -0x97A2 0x4E24 0x91CC # -0x97A3 0x4E25 0x96E2 # -0x97A4 0x4E26 0x9678 # -0x97A5 0x4E27 0x5F8B # -0x97A6 0x4E28 0x7387 # -0x97A7 0x4E29 0x7ACB # -0x97A8 0x4E2A 0x844E # -0x97A9 0x4E2B 0x63A0 # -0x97AA 0x4E2C 0x7565 # -0x97AB 0x4E2D 0x5289 # -0x97AC 0x4E2E 0x6D41 # -0x97AD 0x4E2F 0x6E9C # -0x97AE 0x4E30 0x7409 # -0x97AF 0x4E31 0x7559 # -0x97B0 0x4E32 0x786B # -0x97B1 0x4E33 0x7C92 # -0x97B2 0x4E34 0x9686 # -0x97B3 0x4E35 0x7ADC # -0x97B4 0x4E36 0x9F8D # -0x97B5 0x4E37 0x4FB6 # -0x97B6 0x4E38 0x616E # -0x97B7 0x4E39 0x65C5 # -0x97B8 0x4E3A 0x865C # -0x97B9 0x4E3B 0x4E86 # -0x97BA 0x4E3C 0x4EAE # -0x97BB 0x4E3D 0x50DA # -0x97BC 0x4E3E 0x4E21 # -0x97BD 0x4E3F 0x51CC # -0x97BE 0x4E40 0x5BEE # -0x97BF 0x4E41 0x6599 # -0x97C0 0x4E42 0x6881 # -0x97C1 0x4E43 0x6DBC # -0x97C2 0x4E44 0x731F # -0x97C3 0x4E45 0x7642 # -0x97C4 0x4E46 0x77AD # -0x97C5 0x4E47 0x7A1C # -0x97C6 0x4E48 0x7CE7 # -0x97C7 0x4E49 0x826F # -0x97C8 0x4E4A 0x8AD2 # -0x97C9 0x4E4B 0x907C # -0x97CA 0x4E4C 0x91CF # -0x97CB 0x4E4D 0x9675 # -0x97CC 0x4E4E 0x9818 # -0x97CD 0x4E4F 0x529B # -0x97CE 0x4E50 0x7DD1 # -0x97CF 0x4E51 0x502B # -0x97D0 0x4E52 0x5398 # -0x97D1 0x4E53 0x6797 # -0x97D2 0x4E54 0x6DCB # -0x97D3 0x4E55 0x71D0 # -0x97D4 0x4E56 0x7433 # -0x97D5 0x4E57 0x81E8 # -0x97D6 0x4E58 0x8F2A # -0x97D7 0x4E59 0x96A3 # -0x97D8 0x4E5A 0x9C57 # -0x97D9 0x4E5B 0x9E9F # -0x97DA 0x4E5C 0x7460 # -0x97DB 0x4E5D 0x5841 # -0x97DC 0x4E5E 0x6D99 # -0x97DD 0x4E5F 0x7D2F # -0x97DE 0x4E60 0x985E # -0x97DF 0x4E61 0x4EE4 # -0x97E0 0x4E62 0x4F36 # -0x97E1 0x4E63 0x4F8B # -0x97E2 0x4E64 0x51B7 # -0x97E3 0x4E65 0x52B1 # -0x97E4 0x4E66 0x5DBA # -0x97E5 0x4E67 0x601C # -0x97E6 0x4E68 0x73B2 # -0x97E7 0x4E69 0x793C # -0x97E8 0x4E6A 0x82D3 # -0x97E9 0x4E6B 0x9234 # -0x97EA 0x4E6C 0x96B7 # -0x97EB 0x4E6D 0x96F6 # -0x97EC 0x4E6E 0x970A # -0x97ED 0x4E6F 0x9E97 # -0x97EE 0x4E70 0x9F62 # -0x97EF 0x4E71 0x66A6 # -0x97F0 0x4E72 0x6B74 # -0x97F1 0x4E73 0x5217 # -0x97F2 0x4E74 0x52A3 # -0x97F3 0x4E75 0x70C8 # -0x97F4 0x4E76 0x88C2 # -0x97F5 0x4E77 0x5EC9 # -0x97F6 0x4E78 0x604B # -0x97F7 0x4E79 0x6190 # -0x97F8 0x4E7A 0x6F23 # -0x97F9 0x4E7B 0x7149 # -0x97FA 0x4E7C 0x7C3E # -0x97FB 0x4E7D 0x7DF4 # -0x97FC 0x4E7E 0x806F # -0x9840 0x4F21 0x84EE # -0x9841 0x4F22 0x9023 # -0x9842 0x4F23 0x932C # -0x9843 0x4F24 0x5442 # -0x9844 0x4F25 0x9B6F # -0x9845 0x4F26 0x6AD3 # -0x9846 0x4F27 0x7089 # -0x9847 0x4F28 0x8CC2 # -0x9848 0x4F29 0x8DEF # -0x9849 0x4F2A 0x9732 # -0x984A 0x4F2B 0x52B4 # -0x984B 0x4F2C 0x5A41 # -0x984C 0x4F2D 0x5ECA # -0x984D 0x4F2E 0x5F04 # -0x984E 0x4F2F 0x6717 # -0x984F 0x4F30 0x697C # -0x9850 0x4F31 0x6994 # -0x9851 0x4F32 0x6D6A # -0x9852 0x4F33 0x6F0F # -0x9853 0x4F34 0x7262 # -0x9854 0x4F35 0x72FC # -0x9855 0x4F36 0x7BED # -0x9856 0x4F37 0x8001 # -0x9857 0x4F38 0x807E # -0x9858 0x4F39 0x874B # -0x9859 0x4F3A 0x90CE # -0x985A 0x4F3B 0x516D # -0x985B 0x4F3C 0x9E93 # -0x985C 0x4F3D 0x7984 # -0x985D 0x4F3E 0x808B # -0x985E 0x4F3F 0x9332 # -0x985F 0x4F40 0x8AD6 # -0x9860 0x4F41 0x502D # -0x9861 0x4F42 0x548C # -0x9862 0x4F43 0x8A71 # -0x9863 0x4F44 0x6B6A # -0x9864 0x4F45 0x8CC4 # -0x9865 0x4F46 0x8107 # -0x9866 0x4F47 0x60D1 # -0x9867 0x4F48 0x67A0 # -0x9868 0x4F49 0x9DF2 # -0x9869 0x4F4A 0x4E99 # -0x986A 0x4F4B 0x4E98 # -0x986B 0x4F4C 0x9C10 # -0x986C 0x4F4D 0x8A6B # -0x986D 0x4F4E 0x85C1 # -0x986E 0x4F4F 0x8568 # -0x986F 0x4F50 0x6900 # -0x9870 0x4F51 0x6E7E # -0x9871 0x4F52 0x7897 # -0x9872 0x4F53 0x8155 # -0x989F 0x5021 0x5F0C # -0x98A0 0x5022 0x4E10 # -0x98A1 0x5023 0x4E15 # -0x98A2 0x5024 0x4E2A # -0x98A3 0x5025 0x4E31 # -0x98A4 0x5026 0x4E36 # -0x98A5 0x5027 0x4E3C # -0x98A6 0x5028 0x4E3F # -0x98A7 0x5029 0x4E42 # -0x98A8 0x502A 0x4E56 # -0x98A9 0x502B 0x4E58 # -0x98AA 0x502C 0x4E82 # -0x98AB 0x502D 0x4E85 # -0x98AC 0x502E 0x8C6B # -0x98AD 0x502F 0x4E8A # -0x98AE 0x5030 0x8212 # -0x98AF 0x5031 0x5F0D # -0x98B0 0x5032 0x4E8E # -0x98B1 0x5033 0x4E9E # -0x98B2 0x5034 0x4E9F # -0x98B3 0x5035 0x4EA0 # -0x98B4 0x5036 0x4EA2 # -0x98B5 0x5037 0x4EB0 # -0x98B6 0x5038 0x4EB3 # -0x98B7 0x5039 0x4EB6 # -0x98B8 0x503A 0x4ECE # -0x98B9 0x503B 0x4ECD # -0x98BA 0x503C 0x4EC4 # -0x98BB 0x503D 0x4EC6 # -0x98BC 0x503E 0x4EC2 # -0x98BD 0x503F 0x4ED7 # -0x98BE 0x5040 0x4EDE # -0x98BF 0x5041 0x4EED # -0x98C0 0x5042 0x4EDF # -0x98C1 0x5043 0x4EF7 # -0x98C2 0x5044 0x4F09 # -0x98C3 0x5045 0x4F5A # -0x98C4 0x5046 0x4F30 # -0x98C5 0x5047 0x4F5B # -0x98C6 0x5048 0x4F5D # -0x98C7 0x5049 0x4F57 # -0x98C8 0x504A 0x4F47 # -0x98C9 0x504B 0x4F76 # -0x98CA 0x504C 0x4F88 # -0x98CB 0x504D 0x4F8F # -0x98CC 0x504E 0x4F98 # -0x98CD 0x504F 0x4F7B # -0x98CE 0x5050 0x4F69 # -0x98CF 0x5051 0x4F70 # -0x98D0 0x5052 0x4F91 # -0x98D1 0x5053 0x4F6F # -0x98D2 0x5054 0x4F86 # -0x98D3 0x5055 0x4F96 # -0x98D4 0x5056 0x5118 # -0x98D5 0x5057 0x4FD4 # -0x98D6 0x5058 0x4FDF # -0x98D7 0x5059 0x4FCE # -0x98D8 0x505A 0x4FD8 # -0x98D9 0x505B 0x4FDB # -0x98DA 0x505C 0x4FD1 # -0x98DB 0x505D 0x4FDA # -0x98DC 0x505E 0x4FD0 # -0x98DD 0x505F 0x4FE4 # -0x98DE 0x5060 0x4FE5 # -0x98DF 0x5061 0x501A # -0x98E0 0x5062 0x5028 # -0x98E1 0x5063 0x5014 # -0x98E2 0x5064 0x502A # -0x98E3 0x5065 0x5025 # -0x98E4 0x5066 0x5005 # -0x98E5 0x5067 0x4F1C # -0x98E6 0x5068 0x4FF6 # -0x98E7 0x5069 0x5021 # -0x98E8 0x506A 0x5029 # -0x98E9 0x506B 0x502C # -0x98EA 0x506C 0x4FFE # -0x98EB 0x506D 0x4FEF # -0x98EC 0x506E 0x5011 # -0x98ED 0x506F 0x5006 # -0x98EE 0x5070 0x5043 # -0x98EF 0x5071 0x5047 # -0x98F0 0x5072 0x6703 # -0x98F1 0x5073 0x5055 # -0x98F2 0x5074 0x5050 # -0x98F3 0x5075 0x5048 # -0x98F4 0x5076 0x505A # -0x98F5 0x5077 0x5056 # -0x98F6 0x5078 0x506C # -0x98F7 0x5079 0x5078 # -0x98F8 0x507A 0x5080 # -0x98F9 0x507B 0x509A # -0x98FA 0x507C 0x5085 # -0x98FB 0x507D 0x50B4 # -0x98FC 0x507E 0x50B2 # -0x9940 0x5121 0x50C9 # -0x9941 0x5122 0x50CA # -0x9942 0x5123 0x50B3 # -0x9943 0x5124 0x50C2 # -0x9944 0x5125 0x50D6 # -0x9945 0x5126 0x50DE # -0x9946 0x5127 0x50E5 # -0x9947 0x5128 0x50ED # -0x9948 0x5129 0x50E3 # -0x9949 0x512A 0x50EE # -0x994A 0x512B 0x50F9 # -0x994B 0x512C 0x50F5 # -0x994C 0x512D 0x5109 # -0x994D 0x512E 0x5101 # -0x994E 0x512F 0x5102 # -0x994F 0x5130 0x5116 # -0x9950 0x5131 0x5115 # -0x9951 0x5132 0x5114 # -0x9952 0x5133 0x511A # -0x9953 0x5134 0x5121 # -0x9954 0x5135 0x513A # -0x9955 0x5136 0x5137 # -0x9956 0x5137 0x513C # -0x9957 0x5138 0x513B # -0x9958 0x5139 0x513F # -0x9959 0x513A 0x5140 # -0x995A 0x513B 0x5152 # -0x995B 0x513C 0x514C # -0x995C 0x513D 0x5154 # -0x995D 0x513E 0x5162 # -0x995E 0x513F 0x7AF8 # -0x995F 0x5140 0x5169 # -0x9960 0x5141 0x516A # -0x9961 0x5142 0x516E # -0x9962 0x5143 0x5180 # -0x9963 0x5144 0x5182 # -0x9964 0x5145 0x56D8 # -0x9965 0x5146 0x518C # -0x9966 0x5147 0x5189 # -0x9967 0x5148 0x518F # -0x9968 0x5149 0x5191 # -0x9969 0x514A 0x5193 # -0x996A 0x514B 0x5195 # -0x996B 0x514C 0x5196 # -0x996C 0x514D 0x51A4 # -0x996D 0x514E 0x51A6 # -0x996E 0x514F 0x51A2 # -0x996F 0x5150 0x51A9 # -0x9970 0x5151 0x51AA # -0x9971 0x5152 0x51AB # -0x9972 0x5153 0x51B3 # -0x9973 0x5154 0x51B1 # -0x9974 0x5155 0x51B2 # -0x9975 0x5156 0x51B0 # -0x9976 0x5157 0x51B5 # -0x9977 0x5158 0x51BD # -0x9978 0x5159 0x51C5 # -0x9979 0x515A 0x51C9 # -0x997A 0x515B 0x51DB # -0x997B 0x515C 0x51E0 # -0x997C 0x515D 0x8655 # -0x997D 0x515E 0x51E9 # -0x997E 0x515F 0x51ED # -0x9980 0x5160 0x51F0 # -0x9981 0x5161 0x51F5 # -0x9982 0x5162 0x51FE # -0x9983 0x5163 0x5204 # -0x9984 0x5164 0x520B # -0x9985 0x5165 0x5214 # -0x9986 0x5166 0x520E # -0x9987 0x5167 0x5227 # -0x9988 0x5168 0x522A # -0x9989 0x5169 0x522E # -0x998A 0x516A 0x5233 # -0x998B 0x516B 0x5239 # -0x998C 0x516C 0x524F # -0x998D 0x516D 0x5244 # -0x998E 0x516E 0x524B # -0x998F 0x516F 0x524C # -0x9990 0x5170 0x525E # -0x9991 0x5171 0x5254 # -0x9992 0x5172 0x526A # -0x9993 0x5173 0x5274 # -0x9994 0x5174 0x5269 # -0x9995 0x5175 0x5273 # -0x9996 0x5176 0x527F # -0x9997 0x5177 0x527D # -0x9998 0x5178 0x528D # -0x9999 0x5179 0x5294 # -0x999A 0x517A 0x5292 # -0x999B 0x517B 0x5271 # -0x999C 0x517C 0x5288 # -0x999D 0x517D 0x5291 # -0x999E 0x517E 0x8FA8 # -0x999F 0x5221 0x8FA7 # -0x99A0 0x5222 0x52AC # -0x99A1 0x5223 0x52AD # -0x99A2 0x5224 0x52BC # -0x99A3 0x5225 0x52B5 # -0x99A4 0x5226 0x52C1 # -0x99A5 0x5227 0x52CD # -0x99A6 0x5228 0x52D7 # -0x99A7 0x5229 0x52DE # -0x99A8 0x522A 0x52E3 # -0x99A9 0x522B 0x52E6 # -0x99AA 0x522C 0x98ED # -0x99AB 0x522D 0x52E0 # -0x99AC 0x522E 0x52F3 # -0x99AD 0x522F 0x52F5 # -0x99AE 0x5230 0x52F8 # -0x99AF 0x5231 0x52F9 # -0x99B0 0x5232 0x5306 # -0x99B1 0x5233 0x5308 # -0x99B2 0x5234 0x7538 # -0x99B3 0x5235 0x530D # -0x99B4 0x5236 0x5310 # -0x99B5 0x5237 0x530F # -0x99B6 0x5238 0x5315 # -0x99B7 0x5239 0x531A # -0x99B8 0x523A 0x5323 # -0x99B9 0x523B 0x532F # -0x99BA 0x523C 0x5331 # -0x99BB 0x523D 0x5333 # -0x99BC 0x523E 0x5338 # -0x99BD 0x523F 0x5340 # -0x99BE 0x5240 0x5346 # -0x99BF 0x5241 0x5345 # -0x99C0 0x5242 0x4E17 # -0x99C1 0x5243 0x5349 # -0x99C2 0x5244 0x534D # -0x99C3 0x5245 0x51D6 # -0x99C4 0x5246 0x535E # -0x99C5 0x5247 0x5369 # -0x99C6 0x5248 0x536E # -0x99C7 0x5249 0x5918 # -0x99C8 0x524A 0x537B # -0x99C9 0x524B 0x5377 # -0x99CA 0x524C 0x5382 # -0x99CB 0x524D 0x5396 # -0x99CC 0x524E 0x53A0 # -0x99CD 0x524F 0x53A6 # -0x99CE 0x5250 0x53A5 # -0x99CF 0x5251 0x53AE # -0x99D0 0x5252 0x53B0 # -0x99D1 0x5253 0x53B6 # -0x99D2 0x5254 0x53C3 # -0x99D3 0x5255 0x7C12 # -0x99D4 0x5256 0x96D9 # -0x99D5 0x5257 0x53DF # -0x99D6 0x5258 0x66FC # -0x99D7 0x5259 0x71EE # -0x99D8 0x525A 0x53EE # -0x99D9 0x525B 0x53E8 # -0x99DA 0x525C 0x53ED # -0x99DB 0x525D 0x53FA # -0x99DC 0x525E 0x5401 # -0x99DD 0x525F 0x543D # -0x99DE 0x5260 0x5440 # -0x99DF 0x5261 0x542C # -0x99E0 0x5262 0x542D # -0x99E1 0x5263 0x543C # -0x99E2 0x5264 0x542E # -0x99E3 0x5265 0x5436 # -0x99E4 0x5266 0x5429 # -0x99E5 0x5267 0x541D # -0x99E6 0x5268 0x544E # -0x99E7 0x5269 0x548F # -0x99E8 0x526A 0x5475 # -0x99E9 0x526B 0x548E # -0x99EA 0x526C 0x545F # -0x99EB 0x526D 0x5471 # -0x99EC 0x526E 0x5477 # -0x99ED 0x526F 0x5470 # -0x99EE 0x5270 0x5492 # -0x99EF 0x5271 0x547B # -0x99F0 0x5272 0x5480 # -0x99F1 0x5273 0x5476 # -0x99F2 0x5274 0x5484 # -0x99F3 0x5275 0x5490 # -0x99F4 0x5276 0x5486 # -0x99F5 0x5277 0x54C7 # -0x99F6 0x5278 0x54A2 # -0x99F7 0x5279 0x54B8 # -0x99F8 0x527A 0x54A5 # -0x99F9 0x527B 0x54AC # -0x99FA 0x527C 0x54C4 # -0x99FB 0x527D 0x54C8 # -0x99FC 0x527E 0x54A8 # -0x9A40 0x5321 0x54AB # -0x9A41 0x5322 0x54C2 # -0x9A42 0x5323 0x54A4 # -0x9A43 0x5324 0x54BE # -0x9A44 0x5325 0x54BC # -0x9A45 0x5326 0x54D8 # -0x9A46 0x5327 0x54E5 # -0x9A47 0x5328 0x54E6 # -0x9A48 0x5329 0x550F # -0x9A49 0x532A 0x5514 # -0x9A4A 0x532B 0x54FD # -0x9A4B 0x532C 0x54EE # -0x9A4C 0x532D 0x54ED # -0x9A4D 0x532E 0x54FA # -0x9A4E 0x532F 0x54E2 # -0x9A4F 0x5330 0x5539 # -0x9A50 0x5331 0x5540 # -0x9A51 0x5332 0x5563 # -0x9A52 0x5333 0x554C # -0x9A53 0x5334 0x552E # -0x9A54 0x5335 0x555C # -0x9A55 0x5336 0x5545 # -0x9A56 0x5337 0x5556 # -0x9A57 0x5338 0x5557 # -0x9A58 0x5339 0x5538 # -0x9A59 0x533A 0x5533 # -0x9A5A 0x533B 0x555D # -0x9A5B 0x533C 0x5599 # -0x9A5C 0x533D 0x5580 # -0x9A5D 0x533E 0x54AF # -0x9A5E 0x533F 0x558A # -0x9A5F 0x5340 0x559F # -0x9A60 0x5341 0x557B # -0x9A61 0x5342 0x557E # -0x9A62 0x5343 0x5598 # -0x9A63 0x5344 0x559E # -0x9A64 0x5345 0x55AE # -0x9A65 0x5346 0x557C # -0x9A66 0x5347 0x5583 # -0x9A67 0x5348 0x55A9 # -0x9A68 0x5349 0x5587 # -0x9A69 0x534A 0x55A8 # -0x9A6A 0x534B 0x55DA # -0x9A6B 0x534C 0x55C5 # -0x9A6C 0x534D 0x55DF # -0x9A6D 0x534E 0x55C4 # -0x9A6E 0x534F 0x55DC # -0x9A6F 0x5350 0x55E4 # -0x9A70 0x5351 0x55D4 # -0x9A71 0x5352 0x5614 # -0x9A72 0x5353 0x55F7 # -0x9A73 0x5354 0x5616 # -0x9A74 0x5355 0x55FE # -0x9A75 0x5356 0x55FD # -0x9A76 0x5357 0x561B # -0x9A77 0x5358 0x55F9 # -0x9A78 0x5359 0x564E # -0x9A79 0x535A 0x5650 # -0x9A7A 0x535B 0x71DF # -0x9A7B 0x535C 0x5634 # -0x9A7C 0x535D 0x5636 # -0x9A7D 0x535E 0x5632 # -0x9A7E 0x535F 0x5638 # -0x9A80 0x5360 0x566B # -0x9A81 0x5361 0x5664 # -0x9A82 0x5362 0x562F # -0x9A83 0x5363 0x566C # -0x9A84 0x5364 0x566A # -0x9A85 0x5365 0x5686 # -0x9A86 0x5366 0x5680 # -0x9A87 0x5367 0x568A # -0x9A88 0x5368 0x56A0 # -0x9A89 0x5369 0x5694 # -0x9A8A 0x536A 0x568F # -0x9A8B 0x536B 0x56A5 # -0x9A8C 0x536C 0x56AE # -0x9A8D 0x536D 0x56B6 # -0x9A8E 0x536E 0x56B4 # -0x9A8F 0x536F 0x56C2 # -0x9A90 0x5370 0x56BC # -0x9A91 0x5371 0x56C1 # -0x9A92 0x5372 0x56C3 # -0x9A93 0x5373 0x56C0 # -0x9A94 0x5374 0x56C8 # -0x9A95 0x5375 0x56CE # -0x9A96 0x5376 0x56D1 # -0x9A97 0x5377 0x56D3 # -0x9A98 0x5378 0x56D7 # -0x9A99 0x5379 0x56EE # -0x9A9A 0x537A 0x56F9 # -0x9A9B 0x537B 0x5700 # -0x9A9C 0x537C 0x56FF # -0x9A9D 0x537D 0x5704 # -0x9A9E 0x537E 0x5709 # -0x9A9F 0x5421 0x5708 # -0x9AA0 0x5422 0x570B # -0x9AA1 0x5423 0x570D # -0x9AA2 0x5424 0x5713 # -0x9AA3 0x5425 0x5718 # -0x9AA4 0x5426 0x5716 # -0x9AA5 0x5427 0x55C7 # -0x9AA6 0x5428 0x571C # -0x9AA7 0x5429 0x5726 # -0x9AA8 0x542A 0x5737 # -0x9AA9 0x542B 0x5738 # -0x9AAA 0x542C 0x574E # -0x9AAB 0x542D 0x573B # -0x9AAC 0x542E 0x5740 # -0x9AAD 0x542F 0x574F # -0x9AAE 0x5430 0x5769 # -0x9AAF 0x5431 0x57C0 # -0x9AB0 0x5432 0x5788 # -0x9AB1 0x5433 0x5761 # -0x9AB2 0x5434 0x577F # -0x9AB3 0x5435 0x5789 # -0x9AB4 0x5436 0x5793 # -0x9AB5 0x5437 0x57A0 # -0x9AB6 0x5438 0x57B3 # -0x9AB7 0x5439 0x57A4 # -0x9AB8 0x543A 0x57AA # -0x9AB9 0x543B 0x57B0 # -0x9ABA 0x543C 0x57C3 # -0x9ABB 0x543D 0x57C6 # -0x9ABC 0x543E 0x57D4 # -0x9ABD 0x543F 0x57D2 # -0x9ABE 0x5440 0x57D3 # -0x9ABF 0x5441 0x580A # -0x9AC0 0x5442 0x57D6 # -0x9AC1 0x5443 0x57E3 # -0x9AC2 0x5444 0x580B # -0x9AC3 0x5445 0x5819 # -0x9AC4 0x5446 0x581D # -0x9AC5 0x5447 0x5872 # -0x9AC6 0x5448 0x5821 # -0x9AC7 0x5449 0x5862 # -0x9AC8 0x544A 0x584B # -0x9AC9 0x544B 0x5870 # -0x9ACA 0x544C 0x6BC0 # -0x9ACB 0x544D 0x5852 # -0x9ACC 0x544E 0x583D # -0x9ACD 0x544F 0x5879 # -0x9ACE 0x5450 0x5885 # -0x9ACF 0x5451 0x58B9 # -0x9AD0 0x5452 0x589F # -0x9AD1 0x5453 0x58AB # -0x9AD2 0x5454 0x58BA # -0x9AD3 0x5455 0x58DE # -0x9AD4 0x5456 0x58BB # -0x9AD5 0x5457 0x58B8 # -0x9AD6 0x5458 0x58AE # -0x9AD7 0x5459 0x58C5 # -0x9AD8 0x545A 0x58D3 # -0x9AD9 0x545B 0x58D1 # -0x9ADA 0x545C 0x58D7 # -0x9ADB 0x545D 0x58D9 # -0x9ADC 0x545E 0x58D8 # -0x9ADD 0x545F 0x58E5 # -0x9ADE 0x5460 0x58DC # -0x9ADF 0x5461 0x58E4 # -0x9AE0 0x5462 0x58DF # -0x9AE1 0x5463 0x58EF # -0x9AE2 0x5464 0x58FA # -0x9AE3 0x5465 0x58F9 # -0x9AE4 0x5466 0x58FB # -0x9AE5 0x5467 0x58FC # -0x9AE6 0x5468 0x58FD # -0x9AE7 0x5469 0x5902 # -0x9AE8 0x546A 0x590A # -0x9AE9 0x546B 0x5910 # -0x9AEA 0x546C 0x591B # -0x9AEB 0x546D 0x68A6 # -0x9AEC 0x546E 0x5925 # -0x9AED 0x546F 0x592C # -0x9AEE 0x5470 0x592D # -0x9AEF 0x5471 0x5932 # -0x9AF0 0x5472 0x5938 # -0x9AF1 0x5473 0x593E # -0x9AF2 0x5474 0x7AD2 # -0x9AF3 0x5475 0x5955 # -0x9AF4 0x5476 0x5950 # -0x9AF5 0x5477 0x594E # -0x9AF6 0x5478 0x595A # -0x9AF7 0x5479 0x5958 # -0x9AF8 0x547A 0x5962 # -0x9AF9 0x547B 0x5960 # -0x9AFA 0x547C 0x5967 # -0x9AFB 0x547D 0x596C # -0x9AFC 0x547E 0x5969 # -0x9B40 0x5521 0x5978 # -0x9B41 0x5522 0x5981 # -0x9B42 0x5523 0x599D # -0x9B43 0x5524 0x4F5E # -0x9B44 0x5525 0x4FAB # -0x9B45 0x5526 0x59A3 # -0x9B46 0x5527 0x59B2 # -0x9B47 0x5528 0x59C6 # -0x9B48 0x5529 0x59E8 # -0x9B49 0x552A 0x59DC # -0x9B4A 0x552B 0x598D # -0x9B4B 0x552C 0x59D9 # -0x9B4C 0x552D 0x59DA # -0x9B4D 0x552E 0x5A25 # -0x9B4E 0x552F 0x5A1F # -0x9B4F 0x5530 0x5A11 # -0x9B50 0x5531 0x5A1C # -0x9B51 0x5532 0x5A09 # -0x9B52 0x5533 0x5A1A # -0x9B53 0x5534 0x5A40 # -0x9B54 0x5535 0x5A6C # -0x9B55 0x5536 0x5A49 # -0x9B56 0x5537 0x5A35 # -0x9B57 0x5538 0x5A36 # -0x9B58 0x5539 0x5A62 # -0x9B59 0x553A 0x5A6A # -0x9B5A 0x553B 0x5A9A # -0x9B5B 0x553C 0x5ABC # -0x9B5C 0x553D 0x5ABE # -0x9B5D 0x553E 0x5ACB # -0x9B5E 0x553F 0x5AC2 # -0x9B5F 0x5540 0x5ABD # -0x9B60 0x5541 0x5AE3 # -0x9B61 0x5542 0x5AD7 # -0x9B62 0x5543 0x5AE6 # -0x9B63 0x5544 0x5AE9 # -0x9B64 0x5545 0x5AD6 # -0x9B65 0x5546 0x5AFA # -0x9B66 0x5547 0x5AFB # -0x9B67 0x5548 0x5B0C # -0x9B68 0x5549 0x5B0B # -0x9B69 0x554A 0x5B16 # -0x9B6A 0x554B 0x5B32 # -0x9B6B 0x554C 0x5AD0 # -0x9B6C 0x554D 0x5B2A # -0x9B6D 0x554E 0x5B36 # -0x9B6E 0x554F 0x5B3E # -0x9B6F 0x5550 0x5B43 # -0x9B70 0x5551 0x5B45 # -0x9B71 0x5552 0x5B40 # -0x9B72 0x5553 0x5B51 # -0x9B73 0x5554 0x5B55 # -0x9B74 0x5555 0x5B5A # -0x9B75 0x5556 0x5B5B # -0x9B76 0x5557 0x5B65 # -0x9B77 0x5558 0x5B69 # -0x9B78 0x5559 0x5B70 # -0x9B79 0x555A 0x5B73 # -0x9B7A 0x555B 0x5B75 # -0x9B7B 0x555C 0x5B78 # -0x9B7C 0x555D 0x6588 # -0x9B7D 0x555E 0x5B7A # -0x9B7E 0x555F 0x5B80 # -0x9B80 0x5560 0x5B83 # -0x9B81 0x5561 0x5BA6 # -0x9B82 0x5562 0x5BB8 # -0x9B83 0x5563 0x5BC3 # -0x9B84 0x5564 0x5BC7 # -0x9B85 0x5565 0x5BC9 # -0x9B86 0x5566 0x5BD4 # -0x9B87 0x5567 0x5BD0 # -0x9B88 0x5568 0x5BE4 # -0x9B89 0x5569 0x5BE6 # -0x9B8A 0x556A 0x5BE2 # -0x9B8B 0x556B 0x5BDE # -0x9B8C 0x556C 0x5BE5 # -0x9B8D 0x556D 0x5BEB # -0x9B8E 0x556E 0x5BF0 # -0x9B8F 0x556F 0x5BF6 # -0x9B90 0x5570 0x5BF3 # -0x9B91 0x5571 0x5C05 # -0x9B92 0x5572 0x5C07 # -0x9B93 0x5573 0x5C08 # -0x9B94 0x5574 0x5C0D # -0x9B95 0x5575 0x5C13 # -0x9B96 0x5576 0x5C20 # -0x9B97 0x5577 0x5C22 # -0x9B98 0x5578 0x5C28 # -0x9B99 0x5579 0x5C38 # -0x9B9A 0x557A 0x5C39 # -0x9B9B 0x557B 0x5C41 # -0x9B9C 0x557C 0x5C46 # -0x9B9D 0x557D 0x5C4E # -0x9B9E 0x557E 0x5C53 # -0x9B9F 0x5621 0x5C50 # -0x9BA0 0x5622 0x5C4F # -0x9BA1 0x5623 0x5B71 # -0x9BA2 0x5624 0x5C6C # -0x9BA3 0x5625 0x5C6E # -0x9BA4 0x5626 0x4E62 # -0x9BA5 0x5627 0x5C76 # -0x9BA6 0x5628 0x5C79 # -0x9BA7 0x5629 0x5C8C # -0x9BA8 0x562A 0x5C91 # -0x9BA9 0x562B 0x5C94 # -0x9BAA 0x562C 0x599B # -0x9BAB 0x562D 0x5CAB # -0x9BAC 0x562E 0x5CBB # -0x9BAD 0x562F 0x5CB6 # -0x9BAE 0x5630 0x5CBC # -0x9BAF 0x5631 0x5CB7 # -0x9BB0 0x5632 0x5CC5 # -0x9BB1 0x5633 0x5CBE # -0x9BB2 0x5634 0x5CC7 # -0x9BB3 0x5635 0x5CD9 # -0x9BB4 0x5636 0x5CE9 # -0x9BB5 0x5637 0x5CFD # -0x9BB6 0x5638 0x5CFA # -0x9BB7 0x5639 0x5CED # -0x9BB8 0x563A 0x5D8C # -0x9BB9 0x563B 0x5CEA # -0x9BBA 0x563C 0x5D0B # -0x9BBB 0x563D 0x5D15 # -0x9BBC 0x563E 0x5D17 # -0x9BBD 0x563F 0x5D5C # -0x9BBE 0x5640 0x5D1F # -0x9BBF 0x5641 0x5D1B # -0x9BC0 0x5642 0x5D11 # -0x9BC1 0x5643 0x5D14 # -0x9BC2 0x5644 0x5D22 # -0x9BC3 0x5645 0x5D1A # -0x9BC4 0x5646 0x5D19 # -0x9BC5 0x5647 0x5D18 # -0x9BC6 0x5648 0x5D4C # -0x9BC7 0x5649 0x5D52 # -0x9BC8 0x564A 0x5D4E # -0x9BC9 0x564B 0x5D4B # -0x9BCA 0x564C 0x5D6C # -0x9BCB 0x564D 0x5D73 # -0x9BCC 0x564E 0x5D76 # -0x9BCD 0x564F 0x5D87 # -0x9BCE 0x5650 0x5D84 # -0x9BCF 0x5651 0x5D82 # -0x9BD0 0x5652 0x5DA2 # -0x9BD1 0x5653 0x5D9D # -0x9BD2 0x5654 0x5DAC # -0x9BD3 0x5655 0x5DAE # -0x9BD4 0x5656 0x5DBD # -0x9BD5 0x5657 0x5D90 # -0x9BD6 0x5658 0x5DB7 # -0x9BD7 0x5659 0x5DBC # -0x9BD8 0x565A 0x5DC9 # -0x9BD9 0x565B 0x5DCD # -0x9BDA 0x565C 0x5DD3 # -0x9BDB 0x565D 0x5DD2 # -0x9BDC 0x565E 0x5DD6 # -0x9BDD 0x565F 0x5DDB # -0x9BDE 0x5660 0x5DEB # -0x9BDF 0x5661 0x5DF2 # -0x9BE0 0x5662 0x5DF5 # -0x9BE1 0x5663 0x5E0B # -0x9BE2 0x5664 0x5E1A # -0x9BE3 0x5665 0x5E19 # -0x9BE4 0x5666 0x5E11 # -0x9BE5 0x5667 0x5E1B # -0x9BE6 0x5668 0x5E36 # -0x9BE7 0x5669 0x5E37 # -0x9BE8 0x566A 0x5E44 # -0x9BE9 0x566B 0x5E43 # -0x9BEA 0x566C 0x5E40 # -0x9BEB 0x566D 0x5E4E # -0x9BEC 0x566E 0x5E57 # -0x9BED 0x566F 0x5E54 # -0x9BEE 0x5670 0x5E5F # -0x9BEF 0x5671 0x5E62 # -0x9BF0 0x5672 0x5E64 # -0x9BF1 0x5673 0x5E47 # -0x9BF2 0x5674 0x5E75 # -0x9BF3 0x5675 0x5E76 # -0x9BF4 0x5676 0x5E7A # -0x9BF5 0x5677 0x9EBC # -0x9BF6 0x5678 0x5E7F # -0x9BF7 0x5679 0x5EA0 # -0x9BF8 0x567A 0x5EC1 # -0x9BF9 0x567B 0x5EC2 # -0x9BFA 0x567C 0x5EC8 # -0x9BFB 0x567D 0x5ED0 # -0x9BFC 0x567E 0x5ECF # -0x9C40 0x5721 0x5ED6 # -0x9C41 0x5722 0x5EE3 # -0x9C42 0x5723 0x5EDD # -0x9C43 0x5724 0x5EDA # -0x9C44 0x5725 0x5EDB # -0x9C45 0x5726 0x5EE2 # -0x9C46 0x5727 0x5EE1 # -0x9C47 0x5728 0x5EE8 # -0x9C48 0x5729 0x5EE9 # -0x9C49 0x572A 0x5EEC # -0x9C4A 0x572B 0x5EF1 # -0x9C4B 0x572C 0x5EF3 # -0x9C4C 0x572D 0x5EF0 # -0x9C4D 0x572E 0x5EF4 # -0x9C4E 0x572F 0x5EF8 # -0x9C4F 0x5730 0x5EFE # -0x9C50 0x5731 0x5F03 # -0x9C51 0x5732 0x5F09 # -0x9C52 0x5733 0x5F5D # -0x9C53 0x5734 0x5F5C # -0x9C54 0x5735 0x5F0B # -0x9C55 0x5736 0x5F11 # -0x9C56 0x5737 0x5F16 # -0x9C57 0x5738 0x5F29 # -0x9C58 0x5739 0x5F2D # -0x9C59 0x573A 0x5F38 # -0x9C5A 0x573B 0x5F41 # -0x9C5B 0x573C 0x5F48 # -0x9C5C 0x573D 0x5F4C # -0x9C5D 0x573E 0x5F4E # -0x9C5E 0x573F 0x5F2F # -0x9C5F 0x5740 0x5F51 # -0x9C60 0x5741 0x5F56 # -0x9C61 0x5742 0x5F57 # -0x9C62 0x5743 0x5F59 # -0x9C63 0x5744 0x5F61 # -0x9C64 0x5745 0x5F6D # -0x9C65 0x5746 0x5F73 # -0x9C66 0x5747 0x5F77 # -0x9C67 0x5748 0x5F83 # -0x9C68 0x5749 0x5F82 # -0x9C69 0x574A 0x5F7F # -0x9C6A 0x574B 0x5F8A # -0x9C6B 0x574C 0x5F88 # -0x9C6C 0x574D 0x5F91 # -0x9C6D 0x574E 0x5F87 # -0x9C6E 0x574F 0x5F9E # -0x9C6F 0x5750 0x5F99 # -0x9C70 0x5751 0x5F98 # -0x9C71 0x5752 0x5FA0 # -0x9C72 0x5753 0x5FA8 # -0x9C73 0x5754 0x5FAD # -0x9C74 0x5755 0x5FBC # -0x9C75 0x5756 0x5FD6 # -0x9C76 0x5757 0x5FFB # -0x9C77 0x5758 0x5FE4 # -0x9C78 0x5759 0x5FF8 # -0x9C79 0x575A 0x5FF1 # -0x9C7A 0x575B 0x5FDD # -0x9C7B 0x575C 0x60B3 # -0x9C7C 0x575D 0x5FFF # -0x9C7D 0x575E 0x6021 # -0x9C7E 0x575F 0x6060 # -0x9C80 0x5760 0x6019 # -0x9C81 0x5761 0x6010 # -0x9C82 0x5762 0x6029 # -0x9C83 0x5763 0x600E # -0x9C84 0x5764 0x6031 # -0x9C85 0x5765 0x601B # -0x9C86 0x5766 0x6015 # -0x9C87 0x5767 0x602B # -0x9C88 0x5768 0x6026 # -0x9C89 0x5769 0x600F # -0x9C8A 0x576A 0x603A # -0x9C8B 0x576B 0x605A # -0x9C8C 0x576C 0x6041 # -0x9C8D 0x576D 0x606A # -0x9C8E 0x576E 0x6077 # -0x9C8F 0x576F 0x605F # -0x9C90 0x5770 0x604A # -0x9C91 0x5771 0x6046 # -0x9C92 0x5772 0x604D # -0x9C93 0x5773 0x6063 # -0x9C94 0x5774 0x6043 # -0x9C95 0x5775 0x6064 # -0x9C96 0x5776 0x6042 # -0x9C97 0x5777 0x606C # -0x9C98 0x5778 0x606B # -0x9C99 0x5779 0x6059 # -0x9C9A 0x577A 0x6081 # -0x9C9B 0x577B 0x608D # -0x9C9C 0x577C 0x60E7 # -0x9C9D 0x577D 0x6083 # -0x9C9E 0x577E 0x609A # -0x9C9F 0x5821 0x6084 # -0x9CA0 0x5822 0x609B # -0x9CA1 0x5823 0x6096 # -0x9CA2 0x5824 0x6097 # -0x9CA3 0x5825 0x6092 # -0x9CA4 0x5826 0x60A7 # -0x9CA5 0x5827 0x608B # -0x9CA6 0x5828 0x60E1 # -0x9CA7 0x5829 0x60B8 # -0x9CA8 0x582A 0x60E0 # -0x9CA9 0x582B 0x60D3 # -0x9CAA 0x582C 0x60B4 # -0x9CAB 0x582D 0x5FF0 # -0x9CAC 0x582E 0x60BD # -0x9CAD 0x582F 0x60C6 # -0x9CAE 0x5830 0x60B5 # -0x9CAF 0x5831 0x60D8 # -0x9CB0 0x5832 0x614D # -0x9CB1 0x5833 0x6115 # -0x9CB2 0x5834 0x6106 # -0x9CB3 0x5835 0x60F6 # -0x9CB4 0x5836 0x60F7 # -0x9CB5 0x5837 0x6100 # -0x9CB6 0x5838 0x60F4 # -0x9CB7 0x5839 0x60FA # -0x9CB8 0x583A 0x6103 # -0x9CB9 0x583B 0x6121 # -0x9CBA 0x583C 0x60FB # -0x9CBB 0x583D 0x60F1 # -0x9CBC 0x583E 0x610D # -0x9CBD 0x583F 0x610E # -0x9CBE 0x5840 0x6147 # -0x9CBF 0x5841 0x613E # -0x9CC0 0x5842 0x6128 # -0x9CC1 0x5843 0x6127 # -0x9CC2 0x5844 0x614A # -0x9CC3 0x5845 0x613F # -0x9CC4 0x5846 0x613C # -0x9CC5 0x5847 0x612C # -0x9CC6 0x5848 0x6134 # -0x9CC7 0x5849 0x613D # -0x9CC8 0x584A 0x6142 # -0x9CC9 0x584B 0x6144 # -0x9CCA 0x584C 0x6173 # -0x9CCB 0x584D 0x6177 # -0x9CCC 0x584E 0x6158 # -0x9CCD 0x584F 0x6159 # -0x9CCE 0x5850 0x615A # -0x9CCF 0x5851 0x616B # -0x9CD0 0x5852 0x6174 # -0x9CD1 0x5853 0x616F # -0x9CD2 0x5854 0x6165 # -0x9CD3 0x5855 0x6171 # -0x9CD4 0x5856 0x615F # -0x9CD5 0x5857 0x615D # -0x9CD6 0x5858 0x6153 # -0x9CD7 0x5859 0x6175 # -0x9CD8 0x585A 0x6199 # -0x9CD9 0x585B 0x6196 # -0x9CDA 0x585C 0x6187 # -0x9CDB 0x585D 0x61AC # -0x9CDC 0x585E 0x6194 # -0x9CDD 0x585F 0x619A # -0x9CDE 0x5860 0x618A # -0x9CDF 0x5861 0x6191 # -0x9CE0 0x5862 0x61AB # -0x9CE1 0x5863 0x61AE # -0x9CE2 0x5864 0x61CC # -0x9CE3 0x5865 0x61CA # -0x9CE4 0x5866 0x61C9 # -0x9CE5 0x5867 0x61F7 # -0x9CE6 0x5868 0x61C8 # -0x9CE7 0x5869 0x61C3 # -0x9CE8 0x586A 0x61C6 # -0x9CE9 0x586B 0x61BA # -0x9CEA 0x586C 0x61CB # -0x9CEB 0x586D 0x7F79 # -0x9CEC 0x586E 0x61CD # -0x9CED 0x586F 0x61E6 # -0x9CEE 0x5870 0x61E3 # -0x9CEF 0x5871 0x61F6 # -0x9CF0 0x5872 0x61FA # -0x9CF1 0x5873 0x61F4 # -0x9CF2 0x5874 0x61FF # -0x9CF3 0x5875 0x61FD # -0x9CF4 0x5876 0x61FC # -0x9CF5 0x5877 0x61FE # -0x9CF6 0x5878 0x6200 # -0x9CF7 0x5879 0x6208 # -0x9CF8 0x587A 0x6209 # -0x9CF9 0x587B 0x620D # -0x9CFA 0x587C 0x620C # -0x9CFB 0x587D 0x6214 # -0x9CFC 0x587E 0x621B # -0x9D40 0x5921 0x621E # -0x9D41 0x5922 0x6221 # -0x9D42 0x5923 0x622A # -0x9D43 0x5924 0x622E # -0x9D44 0x5925 0x6230 # -0x9D45 0x5926 0x6232 # -0x9D46 0x5927 0x6233 # -0x9D47 0x5928 0x6241 # -0x9D48 0x5929 0x624E # -0x9D49 0x592A 0x625E # -0x9D4A 0x592B 0x6263 # -0x9D4B 0x592C 0x625B # -0x9D4C 0x592D 0x6260 # -0x9D4D 0x592E 0x6268 # -0x9D4E 0x592F 0x627C # -0x9D4F 0x5930 0x6282 # -0x9D50 0x5931 0x6289 # -0x9D51 0x5932 0x627E # -0x9D52 0x5933 0x6292 # -0x9D53 0x5934 0x6293 # -0x9D54 0x5935 0x6296 # -0x9D55 0x5936 0x62D4 # -0x9D56 0x5937 0x6283 # -0x9D57 0x5938 0x6294 # -0x9D58 0x5939 0x62D7 # -0x9D59 0x593A 0x62D1 # -0x9D5A 0x593B 0x62BB # -0x9D5B 0x593C 0x62CF # -0x9D5C 0x593D 0x62FF # -0x9D5D 0x593E 0x62C6 # -0x9D5E 0x593F 0x64D4 # -0x9D5F 0x5940 0x62C8 # -0x9D60 0x5941 0x62DC # -0x9D61 0x5942 0x62CC # -0x9D62 0x5943 0x62CA # -0x9D63 0x5944 0x62C2 # -0x9D64 0x5945 0x62C7 # -0x9D65 0x5946 0x629B # -0x9D66 0x5947 0x62C9 # -0x9D67 0x5948 0x630C # -0x9D68 0x5949 0x62EE # -0x9D69 0x594A 0x62F1 # -0x9D6A 0x594B 0x6327 # -0x9D6B 0x594C 0x6302 # -0x9D6C 0x594D 0x6308 # -0x9D6D 0x594E 0x62EF # -0x9D6E 0x594F 0x62F5 # -0x9D6F 0x5950 0x6350 # -0x9D70 0x5951 0x633E # -0x9D71 0x5952 0x634D # -0x9D72 0x5953 0x641C # -0x9D73 0x5954 0x634F # -0x9D74 0x5955 0x6396 # -0x9D75 0x5956 0x638E # -0x9D76 0x5957 0x6380 # -0x9D77 0x5958 0x63AB # -0x9D78 0x5959 0x6376 # -0x9D79 0x595A 0x63A3 # -0x9D7A 0x595B 0x638F # -0x9D7B 0x595C 0x6389 # -0x9D7C 0x595D 0x639F # -0x9D7D 0x595E 0x63B5 # -0x9D7E 0x595F 0x636B # -0x9D80 0x5960 0x6369 # -0x9D81 0x5961 0x63BE # -0x9D82 0x5962 0x63E9 # -0x9D83 0x5963 0x63C0 # -0x9D84 0x5964 0x63C6 # -0x9D85 0x5965 0x63E3 # -0x9D86 0x5966 0x63C9 # -0x9D87 0x5967 0x63D2 # -0x9D88 0x5968 0x63F6 # -0x9D89 0x5969 0x63C4 # -0x9D8A 0x596A 0x6416 # -0x9D8B 0x596B 0x6434 # -0x9D8C 0x596C 0x6406 # -0x9D8D 0x596D 0x6413 # -0x9D8E 0x596E 0x6426 # -0x9D8F 0x596F 0x6436 # -0x9D90 0x5970 0x651D # -0x9D91 0x5971 0x6417 # -0x9D92 0x5972 0x6428 # -0x9D93 0x5973 0x640F # -0x9D94 0x5974 0x6467 # -0x9D95 0x5975 0x646F # -0x9D96 0x5976 0x6476 # -0x9D97 0x5977 0x644E # -0x9D98 0x5978 0x652A # -0x9D99 0x5979 0x6495 # -0x9D9A 0x597A 0x6493 # -0x9D9B 0x597B 0x64A5 # -0x9D9C 0x597C 0x64A9 # -0x9D9D 0x597D 0x6488 # -0x9D9E 0x597E 0x64BC # -0x9D9F 0x5A21 0x64DA # -0x9DA0 0x5A22 0x64D2 # -0x9DA1 0x5A23 0x64C5 # -0x9DA2 0x5A24 0x64C7 # -0x9DA3 0x5A25 0x64BB # -0x9DA4 0x5A26 0x64D8 # -0x9DA5 0x5A27 0x64C2 # -0x9DA6 0x5A28 0x64F1 # -0x9DA7 0x5A29 0x64E7 # -0x9DA8 0x5A2A 0x8209 # -0x9DA9 0x5A2B 0x64E0 # -0x9DAA 0x5A2C 0x64E1 # -0x9DAB 0x5A2D 0x62AC # -0x9DAC 0x5A2E 0x64E3 # -0x9DAD 0x5A2F 0x64EF # -0x9DAE 0x5A30 0x652C # -0x9DAF 0x5A31 0x64F6 # -0x9DB0 0x5A32 0x64F4 # -0x9DB1 0x5A33 0x64F2 # -0x9DB2 0x5A34 0x64FA # -0x9DB3 0x5A35 0x6500 # -0x9DB4 0x5A36 0x64FD # -0x9DB5 0x5A37 0x6518 # -0x9DB6 0x5A38 0x651C # -0x9DB7 0x5A39 0x6505 # -0x9DB8 0x5A3A 0x6524 # -0x9DB9 0x5A3B 0x6523 # -0x9DBA 0x5A3C 0x652B # -0x9DBB 0x5A3D 0x6534 # -0x9DBC 0x5A3E 0x6535 # -0x9DBD 0x5A3F 0x6537 # -0x9DBE 0x5A40 0x6536 # -0x9DBF 0x5A41 0x6538 # -0x9DC0 0x5A42 0x754B # -0x9DC1 0x5A43 0x6548 # -0x9DC2 0x5A44 0x6556 # -0x9DC3 0x5A45 0x6555 # -0x9DC4 0x5A46 0x654D # -0x9DC5 0x5A47 0x6558 # -0x9DC6 0x5A48 0x655E # -0x9DC7 0x5A49 0x655D # -0x9DC8 0x5A4A 0x6572 # -0x9DC9 0x5A4B 0x6578 # -0x9DCA 0x5A4C 0x6582 # -0x9DCB 0x5A4D 0x6583 # -0x9DCC 0x5A4E 0x8B8A # -0x9DCD 0x5A4F 0x659B # -0x9DCE 0x5A50 0x659F # -0x9DCF 0x5A51 0x65AB # -0x9DD0 0x5A52 0x65B7 # -0x9DD1 0x5A53 0x65C3 # -0x9DD2 0x5A54 0x65C6 # -0x9DD3 0x5A55 0x65C1 # -0x9DD4 0x5A56 0x65C4 # -0x9DD5 0x5A57 0x65CC # -0x9DD6 0x5A58 0x65D2 # -0x9DD7 0x5A59 0x65DB # -0x9DD8 0x5A5A 0x65D9 # -0x9DD9 0x5A5B 0x65E0 # -0x9DDA 0x5A5C 0x65E1 # -0x9DDB 0x5A5D 0x65F1 # -0x9DDC 0x5A5E 0x6772 # -0x9DDD 0x5A5F 0x660A # -0x9DDE 0x5A60 0x6603 # -0x9DDF 0x5A61 0x65FB # -0x9DE0 0x5A62 0x6773 # -0x9DE1 0x5A63 0x6635 # -0x9DE2 0x5A64 0x6636 # -0x9DE3 0x5A65 0x6634 # -0x9DE4 0x5A66 0x661C # -0x9DE5 0x5A67 0x664F # -0x9DE6 0x5A68 0x6644 # -0x9DE7 0x5A69 0x6649 # -0x9DE8 0x5A6A 0x6641 # -0x9DE9 0x5A6B 0x665E # -0x9DEA 0x5A6C 0x665D # -0x9DEB 0x5A6D 0x6664 # -0x9DEC 0x5A6E 0x6667 # -0x9DED 0x5A6F 0x6668 # -0x9DEE 0x5A70 0x665F # -0x9DEF 0x5A71 0x6662 # -0x9DF0 0x5A72 0x6670 # -0x9DF1 0x5A73 0x6683 # -0x9DF2 0x5A74 0x6688 # -0x9DF3 0x5A75 0x668E # -0x9DF4 0x5A76 0x6689 # -0x9DF5 0x5A77 0x6684 # -0x9DF6 0x5A78 0x6698 # -0x9DF7 0x5A79 0x669D # -0x9DF8 0x5A7A 0x66C1 # -0x9DF9 0x5A7B 0x66B9 # -0x9DFA 0x5A7C 0x66C9 # -0x9DFB 0x5A7D 0x66BE # -0x9DFC 0x5A7E 0x66BC # -0x9E40 0x5B21 0x66C4 # -0x9E41 0x5B22 0x66B8 # -0x9E42 0x5B23 0x66D6 # -0x9E43 0x5B24 0x66DA # -0x9E44 0x5B25 0x66E0 # -0x9E45 0x5B26 0x663F # -0x9E46 0x5B27 0x66E6 # -0x9E47 0x5B28 0x66E9 # -0x9E48 0x5B29 0x66F0 # -0x9E49 0x5B2A 0x66F5 # -0x9E4A 0x5B2B 0x66F7 # -0x9E4B 0x5B2C 0x670F # -0x9E4C 0x5B2D 0x6716 # -0x9E4D 0x5B2E 0x671E # -0x9E4E 0x5B2F 0x6726 # -0x9E4F 0x5B30 0x6727 # -0x9E50 0x5B31 0x9738 # -0x9E51 0x5B32 0x672E # -0x9E52 0x5B33 0x673F # -0x9E53 0x5B34 0x6736 # -0x9E54 0x5B35 0x6741 # -0x9E55 0x5B36 0x6738 # -0x9E56 0x5B37 0x6737 # -0x9E57 0x5B38 0x6746 # -0x9E58 0x5B39 0x675E # -0x9E59 0x5B3A 0x6760 # -0x9E5A 0x5B3B 0x6759 # -0x9E5B 0x5B3C 0x6763 # -0x9E5C 0x5B3D 0x6764 # -0x9E5D 0x5B3E 0x6789 # -0x9E5E 0x5B3F 0x6770 # -0x9E5F 0x5B40 0x67A9 # -0x9E60 0x5B41 0x677C # -0x9E61 0x5B42 0x676A # -0x9E62 0x5B43 0x678C # -0x9E63 0x5B44 0x678B # -0x9E64 0x5B45 0x67A6 # -0x9E65 0x5B46 0x67A1 # -0x9E66 0x5B47 0x6785 # -0x9E67 0x5B48 0x67B7 # -0x9E68 0x5B49 0x67EF # -0x9E69 0x5B4A 0x67B4 # -0x9E6A 0x5B4B 0x67EC # -0x9E6B 0x5B4C 0x67B3 # -0x9E6C 0x5B4D 0x67E9 # -0x9E6D 0x5B4E 0x67B8 # -0x9E6E 0x5B4F 0x67E4 # -0x9E6F 0x5B50 0x67DE # -0x9E70 0x5B51 0x67DD # -0x9E71 0x5B52 0x67E2 # -0x9E72 0x5B53 0x67EE # -0x9E73 0x5B54 0x67B9 # -0x9E74 0x5B55 0x67CE # -0x9E75 0x5B56 0x67C6 # -0x9E76 0x5B57 0x67E7 # -0x9E77 0x5B58 0x6A9C # -0x9E78 0x5B59 0x681E # -0x9E79 0x5B5A 0x6846 # -0x9E7A 0x5B5B 0x6829 # -0x9E7B 0x5B5C 0x6840 # -0x9E7C 0x5B5D 0x684D # -0x9E7D 0x5B5E 0x6832 # -0x9E7E 0x5B5F 0x684E # -0x9E80 0x5B60 0x68B3 # -0x9E81 0x5B61 0x682B # -0x9E82 0x5B62 0x6859 # -0x9E83 0x5B63 0x6863 # -0x9E84 0x5B64 0x6877 # -0x9E85 0x5B65 0x687F # -0x9E86 0x5B66 0x689F # -0x9E87 0x5B67 0x688F # -0x9E88 0x5B68 0x68AD # -0x9E89 0x5B69 0x6894 # -0x9E8A 0x5B6A 0x689D # -0x9E8B 0x5B6B 0x689B # -0x9E8C 0x5B6C 0x6883 # -0x9E8D 0x5B6D 0x6AAE # -0x9E8E 0x5B6E 0x68B9 # -0x9E8F 0x5B6F 0x6874 # -0x9E90 0x5B70 0x68B5 # -0x9E91 0x5B71 0x68A0 # -0x9E92 0x5B72 0x68BA # -0x9E93 0x5B73 0x690F # -0x9E94 0x5B74 0x688D # -0x9E95 0x5B75 0x687E # -0x9E96 0x5B76 0x6901 # -0x9E97 0x5B77 0x68CA # -0x9E98 0x5B78 0x6908 # -0x9E99 0x5B79 0x68D8 # -0x9E9A 0x5B7A 0x6922 # -0x9E9B 0x5B7B 0x6926 # -0x9E9C 0x5B7C 0x68E1 # -0x9E9D 0x5B7D 0x690C # -0x9E9E 0x5B7E 0x68CD # -0x9E9F 0x5C21 0x68D4 # -0x9EA0 0x5C22 0x68E7 # -0x9EA1 0x5C23 0x68D5 # -0x9EA2 0x5C24 0x6936 # -0x9EA3 0x5C25 0x6912 # -0x9EA4 0x5C26 0x6904 # -0x9EA5 0x5C27 0x68D7 # -0x9EA6 0x5C28 0x68E3 # -0x9EA7 0x5C29 0x6925 # -0x9EA8 0x5C2A 0x68F9 # -0x9EA9 0x5C2B 0x68E0 # -0x9EAA 0x5C2C 0x68EF # -0x9EAB 0x5C2D 0x6928 # -0x9EAC 0x5C2E 0x692A # -0x9EAD 0x5C2F 0x691A # -0x9EAE 0x5C30 0x6923 # -0x9EAF 0x5C31 0x6921 # -0x9EB0 0x5C32 0x68C6 # -0x9EB1 0x5C33 0x6979 # -0x9EB2 0x5C34 0x6977 # -0x9EB3 0x5C35 0x695C # -0x9EB4 0x5C36 0x6978 # -0x9EB5 0x5C37 0x696B # -0x9EB6 0x5C38 0x6954 # -0x9EB7 0x5C39 0x697E # -0x9EB8 0x5C3A 0x696E # -0x9EB9 0x5C3B 0x6939 # -0x9EBA 0x5C3C 0x6974 # -0x9EBB 0x5C3D 0x693D # -0x9EBC 0x5C3E 0x6959 # -0x9EBD 0x5C3F 0x6930 # -0x9EBE 0x5C40 0x6961 # -0x9EBF 0x5C41 0x695E # -0x9EC0 0x5C42 0x695D # -0x9EC1 0x5C43 0x6981 # -0x9EC2 0x5C44 0x696A # -0x9EC3 0x5C45 0x69B2 # -0x9EC4 0x5C46 0x69AE # -0x9EC5 0x5C47 0x69D0 # -0x9EC6 0x5C48 0x69BF # -0x9EC7 0x5C49 0x69C1 # -0x9EC8 0x5C4A 0x69D3 # -0x9EC9 0x5C4B 0x69BE # -0x9ECA 0x5C4C 0x69CE # -0x9ECB 0x5C4D 0x5BE8 # -0x9ECC 0x5C4E 0x69CA # -0x9ECD 0x5C4F 0x69DD # -0x9ECE 0x5C50 0x69BB # -0x9ECF 0x5C51 0x69C3 # -0x9ED0 0x5C52 0x69A7 # -0x9ED1 0x5C53 0x6A2E # -0x9ED2 0x5C54 0x6991 # -0x9ED3 0x5C55 0x69A0 # -0x9ED4 0x5C56 0x699C # -0x9ED5 0x5C57 0x6995 # -0x9ED6 0x5C58 0x69B4 # -0x9ED7 0x5C59 0x69DE # -0x9ED8 0x5C5A 0x69E8 # -0x9ED9 0x5C5B 0x6A02 # -0x9EDA 0x5C5C 0x6A1B # -0x9EDB 0x5C5D 0x69FF # -0x9EDC 0x5C5E 0x6B0A # -0x9EDD 0x5C5F 0x69F9 # -0x9EDE 0x5C60 0x69F2 # -0x9EDF 0x5C61 0x69E7 # -0x9EE0 0x5C62 0x6A05 # -0x9EE1 0x5C63 0x69B1 # -0x9EE2 0x5C64 0x6A1E # -0x9EE3 0x5C65 0x69ED # -0x9EE4 0x5C66 0x6A14 # -0x9EE5 0x5C67 0x69EB # -0x9EE6 0x5C68 0x6A0A # -0x9EE7 0x5C69 0x6A12 # -0x9EE8 0x5C6A 0x6AC1 # -0x9EE9 0x5C6B 0x6A23 # -0x9EEA 0x5C6C 0x6A13 # -0x9EEB 0x5C6D 0x6A44 # -0x9EEC 0x5C6E 0x6A0C # -0x9EED 0x5C6F 0x6A72 # -0x9EEE 0x5C70 0x6A36 # -0x9EEF 0x5C71 0x6A78 # -0x9EF0 0x5C72 0x6A47 # -0x9EF1 0x5C73 0x6A62 # -0x9EF2 0x5C74 0x6A59 # -0x9EF3 0x5C75 0x6A66 # -0x9EF4 0x5C76 0x6A48 # -0x9EF5 0x5C77 0x6A38 # -0x9EF6 0x5C78 0x6A22 # -0x9EF7 0x5C79 0x6A90 # -0x9EF8 0x5C7A 0x6A8D # -0x9EF9 0x5C7B 0x6AA0 # -0x9EFA 0x5C7C 0x6A84 # -0x9EFB 0x5C7D 0x6AA2 # -0x9EFC 0x5C7E 0x6AA3 # -0x9F40 0x5D21 0x6A97 # -0x9F41 0x5D22 0x8617 # -0x9F42 0x5D23 0x6ABB # -0x9F43 0x5D24 0x6AC3 # -0x9F44 0x5D25 0x6AC2 # -0x9F45 0x5D26 0x6AB8 # -0x9F46 0x5D27 0x6AB3 # -0x9F47 0x5D28 0x6AAC # -0x9F48 0x5D29 0x6ADE # -0x9F49 0x5D2A 0x6AD1 # -0x9F4A 0x5D2B 0x6ADF # -0x9F4B 0x5D2C 0x6AAA # -0x9F4C 0x5D2D 0x6ADA # -0x9F4D 0x5D2E 0x6AEA # -0x9F4E 0x5D2F 0x6AFB # -0x9F4F 0x5D30 0x6B05 # -0x9F50 0x5D31 0x8616 # -0x9F51 0x5D32 0x6AFA # -0x9F52 0x5D33 0x6B12 # -0x9F53 0x5D34 0x6B16 # -0x9F54 0x5D35 0x9B31 # -0x9F55 0x5D36 0x6B1F # -0x9F56 0x5D37 0x6B38 # -0x9F57 0x5D38 0x6B37 # -0x9F58 0x5D39 0x76DC # -0x9F59 0x5D3A 0x6B39 # -0x9F5A 0x5D3B 0x98EE # -0x9F5B 0x5D3C 0x6B47 # -0x9F5C 0x5D3D 0x6B43 # -0x9F5D 0x5D3E 0x6B49 # -0x9F5E 0x5D3F 0x6B50 # -0x9F5F 0x5D40 0x6B59 # -0x9F60 0x5D41 0x6B54 # -0x9F61 0x5D42 0x6B5B # -0x9F62 0x5D43 0x6B5F # -0x9F63 0x5D44 0x6B61 # -0x9F64 0x5D45 0x6B78 # -0x9F65 0x5D46 0x6B79 # -0x9F66 0x5D47 0x6B7F # -0x9F67 0x5D48 0x6B80 # -0x9F68 0x5D49 0x6B84 # -0x9F69 0x5D4A 0x6B83 # -0x9F6A 0x5D4B 0x6B8D # -0x9F6B 0x5D4C 0x6B98 # -0x9F6C 0x5D4D 0x6B95 # -0x9F6D 0x5D4E 0x6B9E # -0x9F6E 0x5D4F 0x6BA4 # -0x9F6F 0x5D50 0x6BAA # -0x9F70 0x5D51 0x6BAB # -0x9F71 0x5D52 0x6BAF # -0x9F72 0x5D53 0x6BB2 # -0x9F73 0x5D54 0x6BB1 # -0x9F74 0x5D55 0x6BB3 # -0x9F75 0x5D56 0x6BB7 # -0x9F76 0x5D57 0x6BBC # -0x9F77 0x5D58 0x6BC6 # -0x9F78 0x5D59 0x6BCB # -0x9F79 0x5D5A 0x6BD3 # -0x9F7A 0x5D5B 0x6BDF # -0x9F7B 0x5D5C 0x6BEC # -0x9F7C 0x5D5D 0x6BEB # -0x9F7D 0x5D5E 0x6BF3 # -0x9F7E 0x5D5F 0x6BEF # -0x9F80 0x5D60 0x9EBE # -0x9F81 0x5D61 0x6C08 # -0x9F82 0x5D62 0x6C13 # -0x9F83 0x5D63 0x6C14 # -0x9F84 0x5D64 0x6C1B # -0x9F85 0x5D65 0x6C24 # -0x9F86 0x5D66 0x6C23 # -0x9F87 0x5D67 0x6C5E # -0x9F88 0x5D68 0x6C55 # -0x9F89 0x5D69 0x6C62 # -0x9F8A 0x5D6A 0x6C6A # -0x9F8B 0x5D6B 0x6C82 # -0x9F8C 0x5D6C 0x6C8D # -0x9F8D 0x5D6D 0x6C9A # -0x9F8E 0x5D6E 0x6C81 # -0x9F8F 0x5D6F 0x6C9B # -0x9F90 0x5D70 0x6C7E # -0x9F91 0x5D71 0x6C68 # -0x9F92 0x5D72 0x6C73 # -0x9F93 0x5D73 0x6C92 # -0x9F94 0x5D74 0x6C90 # -0x9F95 0x5D75 0x6CC4 # -0x9F96 0x5D76 0x6CF1 # -0x9F97 0x5D77 0x6CD3 # -0x9F98 0x5D78 0x6CBD # -0x9F99 0x5D79 0x6CD7 # -0x9F9A 0x5D7A 0x6CC5 # -0x9F9B 0x5D7B 0x6CDD # -0x9F9C 0x5D7C 0x6CAE # -0x9F9D 0x5D7D 0x6CB1 # -0x9F9E 0x5D7E 0x6CBE # -0x9F9F 0x5E21 0x6CBA # -0x9FA0 0x5E22 0x6CDB # -0x9FA1 0x5E23 0x6CEF # -0x9FA2 0x5E24 0x6CD9 # -0x9FA3 0x5E25 0x6CEA # -0x9FA4 0x5E26 0x6D1F # -0x9FA5 0x5E27 0x884D # -0x9FA6 0x5E28 0x6D36 # -0x9FA7 0x5E29 0x6D2B # -0x9FA8 0x5E2A 0x6D3D # -0x9FA9 0x5E2B 0x6D38 # -0x9FAA 0x5E2C 0x6D19 # -0x9FAB 0x5E2D 0x6D35 # -0x9FAC 0x5E2E 0x6D33 # -0x9FAD 0x5E2F 0x6D12 # -0x9FAE 0x5E30 0x6D0C # -0x9FAF 0x5E31 0x6D63 # -0x9FB0 0x5E32 0x6D93 # -0x9FB1 0x5E33 0x6D64 # -0x9FB2 0x5E34 0x6D5A # -0x9FB3 0x5E35 0x6D79 # -0x9FB4 0x5E36 0x6D59 # -0x9FB5 0x5E37 0x6D8E # -0x9FB6 0x5E38 0x6D95 # -0x9FB7 0x5E39 0x6FE4 # -0x9FB8 0x5E3A 0x6D85 # -0x9FB9 0x5E3B 0x6DF9 # -0x9FBA 0x5E3C 0x6E15 # -0x9FBB 0x5E3D 0x6E0A # -0x9FBC 0x5E3E 0x6DB5 # -0x9FBD 0x5E3F 0x6DC7 # -0x9FBE 0x5E40 0x6DE6 # -0x9FBF 0x5E41 0x6DB8 # -0x9FC0 0x5E42 0x6DC6 # -0x9FC1 0x5E43 0x6DEC # -0x9FC2 0x5E44 0x6DDE # -0x9FC3 0x5E45 0x6DCC # -0x9FC4 0x5E46 0x6DE8 # -0x9FC5 0x5E47 0x6DD2 # -0x9FC6 0x5E48 0x6DC5 # -0x9FC7 0x5E49 0x6DFA # -0x9FC8 0x5E4A 0x6DD9 # -0x9FC9 0x5E4B 0x6DE4 # -0x9FCA 0x5E4C 0x6DD5 # -0x9FCB 0x5E4D 0x6DEA # -0x9FCC 0x5E4E 0x6DEE # -0x9FCD 0x5E4F 0x6E2D # -0x9FCE 0x5E50 0x6E6E # -0x9FCF 0x5E51 0x6E2E # -0x9FD0 0x5E52 0x6E19 # -0x9FD1 0x5E53 0x6E72 # -0x9FD2 0x5E54 0x6E5F # -0x9FD3 0x5E55 0x6E3E # -0x9FD4 0x5E56 0x6E23 # -0x9FD5 0x5E57 0x6E6B # -0x9FD6 0x5E58 0x6E2B # -0x9FD7 0x5E59 0x6E76 # -0x9FD8 0x5E5A 0x6E4D # -0x9FD9 0x5E5B 0x6E1F # -0x9FDA 0x5E5C 0x6E43 # -0x9FDB 0x5E5D 0x6E3A # -0x9FDC 0x5E5E 0x6E4E # -0x9FDD 0x5E5F 0x6E24 # -0x9FDE 0x5E60 0x6EFF # -0x9FDF 0x5E61 0x6E1D # -0x9FE0 0x5E62 0x6E38 # -0x9FE1 0x5E63 0x6E82 # -0x9FE2 0x5E64 0x6EAA # -0x9FE3 0x5E65 0x6E98 # -0x9FE4 0x5E66 0x6EC9 # -0x9FE5 0x5E67 0x6EB7 # -0x9FE6 0x5E68 0x6ED3 # -0x9FE7 0x5E69 0x6EBD # -0x9FE8 0x5E6A 0x6EAF # -0x9FE9 0x5E6B 0x6EC4 # -0x9FEA 0x5E6C 0x6EB2 # -0x9FEB 0x5E6D 0x6ED4 # -0x9FEC 0x5E6E 0x6ED5 # -0x9FED 0x5E6F 0x6E8F # -0x9FEE 0x5E70 0x6EA5 # -0x9FEF 0x5E71 0x6EC2 # -0x9FF0 0x5E72 0x6E9F # -0x9FF1 0x5E73 0x6F41 # -0x9FF2 0x5E74 0x6F11 # -0x9FF3 0x5E75 0x704C # -0x9FF4 0x5E76 0x6EEC # -0x9FF5 0x5E77 0x6EF8 # -0x9FF6 0x5E78 0x6EFE # -0x9FF7 0x5E79 0x6F3F # -0x9FF8 0x5E7A 0x6EF2 # -0x9FF9 0x5E7B 0x6F31 # -0x9FFA 0x5E7C 0x6EEF # -0x9FFB 0x5E7D 0x6F32 # -0x9FFC 0x5E7E 0x6ECC # -0xE040 0x5F21 0x6F3E # -0xE041 0x5F22 0x6F13 # -0xE042 0x5F23 0x6EF7 # -0xE043 0x5F24 0x6F86 # -0xE044 0x5F25 0x6F7A # -0xE045 0x5F26 0x6F78 # -0xE046 0x5F27 0x6F81 # -0xE047 0x5F28 0x6F80 # -0xE048 0x5F29 0x6F6F # -0xE049 0x5F2A 0x6F5B # -0xE04A 0x5F2B 0x6FF3 # -0xE04B 0x5F2C 0x6F6D # -0xE04C 0x5F2D 0x6F82 # -0xE04D 0x5F2E 0x6F7C # -0xE04E 0x5F2F 0x6F58 # -0xE04F 0x5F30 0x6F8E # -0xE050 0x5F31 0x6F91 # -0xE051 0x5F32 0x6FC2 # -0xE052 0x5F33 0x6F66 # -0xE053 0x5F34 0x6FB3 # -0xE054 0x5F35 0x6FA3 # -0xE055 0x5F36 0x6FA1 # -0xE056 0x5F37 0x6FA4 # -0xE057 0x5F38 0x6FB9 # -0xE058 0x5F39 0x6FC6 # -0xE059 0x5F3A 0x6FAA # -0xE05A 0x5F3B 0x6FDF # -0xE05B 0x5F3C 0x6FD5 # -0xE05C 0x5F3D 0x6FEC # -0xE05D 0x5F3E 0x6FD4 # -0xE05E 0x5F3F 0x6FD8 # -0xE05F 0x5F40 0x6FF1 # -0xE060 0x5F41 0x6FEE # -0xE061 0x5F42 0x6FDB # -0xE062 0x5F43 0x7009 # -0xE063 0x5F44 0x700B # -0xE064 0x5F45 0x6FFA # -0xE065 0x5F46 0x7011 # -0xE066 0x5F47 0x7001 # -0xE067 0x5F48 0x700F # -0xE068 0x5F49 0x6FFE # -0xE069 0x5F4A 0x701B # -0xE06A 0x5F4B 0x701A # -0xE06B 0x5F4C 0x6F74 # -0xE06C 0x5F4D 0x701D # -0xE06D 0x5F4E 0x7018 # -0xE06E 0x5F4F 0x701F # -0xE06F 0x5F50 0x7030 # -0xE070 0x5F51 0x703E # -0xE071 0x5F52 0x7032 # -0xE072 0x5F53 0x7051 # -0xE073 0x5F54 0x7063 # -0xE074 0x5F55 0x7099 # -0xE075 0x5F56 0x7092 # -0xE076 0x5F57 0x70AF # -0xE077 0x5F58 0x70F1 # -0xE078 0x5F59 0x70AC # -0xE079 0x5F5A 0x70B8 # -0xE07A 0x5F5B 0x70B3 # -0xE07B 0x5F5C 0x70AE # -0xE07C 0x5F5D 0x70DF # -0xE07D 0x5F5E 0x70CB # -0xE07E 0x5F5F 0x70DD # -0xE080 0x5F60 0x70D9 # -0xE081 0x5F61 0x7109 # -0xE082 0x5F62 0x70FD # -0xE083 0x5F63 0x711C # -0xE084 0x5F64 0x7119 # -0xE085 0x5F65 0x7165 # -0xE086 0x5F66 0x7155 # -0xE087 0x5F67 0x7188 # -0xE088 0x5F68 0x7166 # -0xE089 0x5F69 0x7162 # -0xE08A 0x5F6A 0x714C # -0xE08B 0x5F6B 0x7156 # -0xE08C 0x5F6C 0x716C # -0xE08D 0x5F6D 0x718F # -0xE08E 0x5F6E 0x71FB # -0xE08F 0x5F6F 0x7184 # -0xE090 0x5F70 0x7195 # -0xE091 0x5F71 0x71A8 # -0xE092 0x5F72 0x71AC # -0xE093 0x5F73 0x71D7 # -0xE094 0x5F74 0x71B9 # -0xE095 0x5F75 0x71BE # -0xE096 0x5F76 0x71D2 # -0xE097 0x5F77 0x71C9 # -0xE098 0x5F78 0x71D4 # -0xE099 0x5F79 0x71CE # -0xE09A 0x5F7A 0x71E0 # -0xE09B 0x5F7B 0x71EC # -0xE09C 0x5F7C 0x71E7 # -0xE09D 0x5F7D 0x71F5 # -0xE09E 0x5F7E 0x71FC # -0xE09F 0x6021 0x71F9 # -0xE0A0 0x6022 0x71FF # -0xE0A1 0x6023 0x720D # -0xE0A2 0x6024 0x7210 # -0xE0A3 0x6025 0x721B # -0xE0A4 0x6026 0x7228 # -0xE0A5 0x6027 0x722D # -0xE0A6 0x6028 0x722C # -0xE0A7 0x6029 0x7230 # -0xE0A8 0x602A 0x7232 # -0xE0A9 0x602B 0x723B # -0xE0AA 0x602C 0x723C # -0xE0AB 0x602D 0x723F # -0xE0AC 0x602E 0x7240 # -0xE0AD 0x602F 0x7246 # -0xE0AE 0x6030 0x724B # -0xE0AF 0x6031 0x7258 # -0xE0B0 0x6032 0x7274 # -0xE0B1 0x6033 0x727E # -0xE0B2 0x6034 0x7282 # -0xE0B3 0x6035 0x7281 # -0xE0B4 0x6036 0x7287 # -0xE0B5 0x6037 0x7292 # -0xE0B6 0x6038 0x7296 # -0xE0B7 0x6039 0x72A2 # -0xE0B8 0x603A 0x72A7 # -0xE0B9 0x603B 0x72B9 # -0xE0BA 0x603C 0x72B2 # -0xE0BB 0x603D 0x72C3 # -0xE0BC 0x603E 0x72C6 # -0xE0BD 0x603F 0x72C4 # -0xE0BE 0x6040 0x72CE # -0xE0BF 0x6041 0x72D2 # -0xE0C0 0x6042 0x72E2 # -0xE0C1 0x6043 0x72E0 # -0xE0C2 0x6044 0x72E1 # -0xE0C3 0x6045 0x72F9 # -0xE0C4 0x6046 0x72F7 # -0xE0C5 0x6047 0x500F # -0xE0C6 0x6048 0x7317 # -0xE0C7 0x6049 0x730A # -0xE0C8 0x604A 0x731C # -0xE0C9 0x604B 0x7316 # -0xE0CA 0x604C 0x731D # -0xE0CB 0x604D 0x7334 # -0xE0CC 0x604E 0x732F # -0xE0CD 0x604F 0x7329 # -0xE0CE 0x6050 0x7325 # -0xE0CF 0x6051 0x733E # -0xE0D0 0x6052 0x734E # -0xE0D1 0x6053 0x734F # -0xE0D2 0x6054 0x9ED8 # -0xE0D3 0x6055 0x7357 # -0xE0D4 0x6056 0x736A # -0xE0D5 0x6057 0x7368 # -0xE0D6 0x6058 0x7370 # -0xE0D7 0x6059 0x7378 # -0xE0D8 0x605A 0x7375 # -0xE0D9 0x605B 0x737B # -0xE0DA 0x605C 0x737A # -0xE0DB 0x605D 0x73C8 # -0xE0DC 0x605E 0x73B3 # -0xE0DD 0x605F 0x73CE # -0xE0DE 0x6060 0x73BB # -0xE0DF 0x6061 0x73C0 # -0xE0E0 0x6062 0x73E5 # -0xE0E1 0x6063 0x73EE # -0xE0E2 0x6064 0x73DE # -0xE0E3 0x6065 0x74A2 # -0xE0E4 0x6066 0x7405 # -0xE0E5 0x6067 0x746F # -0xE0E6 0x6068 0x7425 # -0xE0E7 0x6069 0x73F8 # -0xE0E8 0x606A 0x7432 # -0xE0E9 0x606B 0x743A # -0xE0EA 0x606C 0x7455 # -0xE0EB 0x606D 0x743F # -0xE0EC 0x606E 0x745F # -0xE0ED 0x606F 0x7459 # -0xE0EE 0x6070 0x7441 # -0xE0EF 0x6071 0x745C # -0xE0F0 0x6072 0x7469 # -0xE0F1 0x6073 0x7470 # -0xE0F2 0x6074 0x7463 # -0xE0F3 0x6075 0x746A # -0xE0F4 0x6076 0x7476 # -0xE0F5 0x6077 0x747E # -0xE0F6 0x6078 0x748B # -0xE0F7 0x6079 0x749E # -0xE0F8 0x607A 0x74A7 # -0xE0F9 0x607B 0x74CA # -0xE0FA 0x607C 0x74CF # -0xE0FB 0x607D 0x74D4 # -0xE0FC 0x607E 0x73F1 # -0xE140 0x6121 0x74E0 # -0xE141 0x6122 0x74E3 # -0xE142 0x6123 0x74E7 # -0xE143 0x6124 0x74E9 # -0xE144 0x6125 0x74EE # -0xE145 0x6126 0x74F2 # -0xE146 0x6127 0x74F0 # -0xE147 0x6128 0x74F1 # -0xE148 0x6129 0x74F8 # -0xE149 0x612A 0x74F7 # -0xE14A 0x612B 0x7504 # -0xE14B 0x612C 0x7503 # -0xE14C 0x612D 0x7505 # -0xE14D 0x612E 0x750C # -0xE14E 0x612F 0x750E # -0xE14F 0x6130 0x750D # -0xE150 0x6131 0x7515 # -0xE151 0x6132 0x7513 # -0xE152 0x6133 0x751E # -0xE153 0x6134 0x7526 # -0xE154 0x6135 0x752C # -0xE155 0x6136 0x753C # -0xE156 0x6137 0x7544 # -0xE157 0x6138 0x754D # -0xE158 0x6139 0x754A # -0xE159 0x613A 0x7549 # -0xE15A 0x613B 0x755B # -0xE15B 0x613C 0x7546 # -0xE15C 0x613D 0x755A # -0xE15D 0x613E 0x7569 # -0xE15E 0x613F 0x7564 # -0xE15F 0x6140 0x7567 # -0xE160 0x6141 0x756B # -0xE161 0x6142 0x756D # -0xE162 0x6143 0x7578 # -0xE163 0x6144 0x7576 # -0xE164 0x6145 0x7586 # -0xE165 0x6146 0x7587 # -0xE166 0x6147 0x7574 # -0xE167 0x6148 0x758A # -0xE168 0x6149 0x7589 # -0xE169 0x614A 0x7582 # -0xE16A 0x614B 0x7594 # -0xE16B 0x614C 0x759A # -0xE16C 0x614D 0x759D # -0xE16D 0x614E 0x75A5 # -0xE16E 0x614F 0x75A3 # -0xE16F 0x6150 0x75C2 # -0xE170 0x6151 0x75B3 # -0xE171 0x6152 0x75C3 # -0xE172 0x6153 0x75B5 # -0xE173 0x6154 0x75BD # -0xE174 0x6155 0x75B8 # -0xE175 0x6156 0x75BC # -0xE176 0x6157 0x75B1 # -0xE177 0x6158 0x75CD # -0xE178 0x6159 0x75CA # -0xE179 0x615A 0x75D2 # -0xE17A 0x615B 0x75D9 # -0xE17B 0x615C 0x75E3 # -0xE17C 0x615D 0x75DE # -0xE17D 0x615E 0x75FE # -0xE17E 0x615F 0x75FF # -0xE180 0x6160 0x75FC # -0xE181 0x6161 0x7601 # -0xE182 0x6162 0x75F0 # -0xE183 0x6163 0x75FA # -0xE184 0x6164 0x75F2 # -0xE185 0x6165 0x75F3 # -0xE186 0x6166 0x760B # -0xE187 0x6167 0x760D # -0xE188 0x6168 0x7609 # -0xE189 0x6169 0x761F # -0xE18A 0x616A 0x7627 # -0xE18B 0x616B 0x7620 # -0xE18C 0x616C 0x7621 # -0xE18D 0x616D 0x7622 # -0xE18E 0x616E 0x7624 # -0xE18F 0x616F 0x7634 # -0xE190 0x6170 0x7630 # -0xE191 0x6171 0x763B # -0xE192 0x6172 0x7647 # -0xE193 0x6173 0x7648 # -0xE194 0x6174 0x7646 # -0xE195 0x6175 0x765C # -0xE196 0x6176 0x7658 # -0xE197 0x6177 0x7661 # -0xE198 0x6178 0x7662 # -0xE199 0x6179 0x7668 # -0xE19A 0x617A 0x7669 # -0xE19B 0x617B 0x766A # -0xE19C 0x617C 0x7667 # -0xE19D 0x617D 0x766C # -0xE19E 0x617E 0x7670 # -0xE19F 0x6221 0x7672 # -0xE1A0 0x6222 0x7676 # -0xE1A1 0x6223 0x7678 # -0xE1A2 0x6224 0x767C # -0xE1A3 0x6225 0x7680 # -0xE1A4 0x6226 0x7683 # -0xE1A5 0x6227 0x7688 # -0xE1A6 0x6228 0x768B # -0xE1A7 0x6229 0x768E # -0xE1A8 0x622A 0x7696 # -0xE1A9 0x622B 0x7693 # -0xE1AA 0x622C 0x7699 # -0xE1AB 0x622D 0x769A # -0xE1AC 0x622E 0x76B0 # -0xE1AD 0x622F 0x76B4 # -0xE1AE 0x6230 0x76B8 # -0xE1AF 0x6231 0x76B9 # -0xE1B0 0x6232 0x76BA # -0xE1B1 0x6233 0x76C2 # -0xE1B2 0x6234 0x76CD # -0xE1B3 0x6235 0x76D6 # -0xE1B4 0x6236 0x76D2 # -0xE1B5 0x6237 0x76DE # -0xE1B6 0x6238 0x76E1 # -0xE1B7 0x6239 0x76E5 # -0xE1B8 0x623A 0x76E7 # -0xE1B9 0x623B 0x76EA # -0xE1BA 0x623C 0x862F # -0xE1BB 0x623D 0x76FB # -0xE1BC 0x623E 0x7708 # -0xE1BD 0x623F 0x7707 # -0xE1BE 0x6240 0x7704 # -0xE1BF 0x6241 0x7729 # -0xE1C0 0x6242 0x7724 # -0xE1C1 0x6243 0x771E # -0xE1C2 0x6244 0x7725 # -0xE1C3 0x6245 0x7726 # -0xE1C4 0x6246 0x771B # -0xE1C5 0x6247 0x7737 # -0xE1C6 0x6248 0x7738 # -0xE1C7 0x6249 0x7747 # -0xE1C8 0x624A 0x775A # -0xE1C9 0x624B 0x7768 # -0xE1CA 0x624C 0x776B # -0xE1CB 0x624D 0x775B # -0xE1CC 0x624E 0x7765 # -0xE1CD 0x624F 0x777F # -0xE1CE 0x6250 0x777E # -0xE1CF 0x6251 0x7779 # -0xE1D0 0x6252 0x778E # -0xE1D1 0x6253 0x778B # -0xE1D2 0x6254 0x7791 # -0xE1D3 0x6255 0x77A0 # -0xE1D4 0x6256 0x779E # -0xE1D5 0x6257 0x77B0 # -0xE1D6 0x6258 0x77B6 # -0xE1D7 0x6259 0x77B9 # -0xE1D8 0x625A 0x77BF # -0xE1D9 0x625B 0x77BC # -0xE1DA 0x625C 0x77BD # -0xE1DB 0x625D 0x77BB # -0xE1DC 0x625E 0x77C7 # -0xE1DD 0x625F 0x77CD # -0xE1DE 0x6260 0x77D7 # -0xE1DF 0x6261 0x77DA # -0xE1E0 0x6262 0x77DC # -0xE1E1 0x6263 0x77E3 # -0xE1E2 0x6264 0x77EE # -0xE1E3 0x6265 0x77FC # -0xE1E4 0x6266 0x780C # -0xE1E5 0x6267 0x7812 # -0xE1E6 0x6268 0x7926 # -0xE1E7 0x6269 0x7820 # -0xE1E8 0x626A 0x792A # -0xE1E9 0x626B 0x7845 # -0xE1EA 0x626C 0x788E # -0xE1EB 0x626D 0x7874 # -0xE1EC 0x626E 0x7886 # -0xE1ED 0x626F 0x787C # -0xE1EE 0x6270 0x789A # -0xE1EF 0x6271 0x788C # -0xE1F0 0x6272 0x78A3 # -0xE1F1 0x6273 0x78B5 # -0xE1F2 0x6274 0x78AA # -0xE1F3 0x6275 0x78AF # -0xE1F4 0x6276 0x78D1 # -0xE1F5 0x6277 0x78C6 # -0xE1F6 0x6278 0x78CB # -0xE1F7 0x6279 0x78D4 # -0xE1F8 0x627A 0x78BE # -0xE1F9 0x627B 0x78BC # -0xE1FA 0x627C 0x78C5 # -0xE1FB 0x627D 0x78CA # -0xE1FC 0x627E 0x78EC # -0xE240 0x6321 0x78E7 # -0xE241 0x6322 0x78DA # -0xE242 0x6323 0x78FD # -0xE243 0x6324 0x78F4 # -0xE244 0x6325 0x7907 # -0xE245 0x6326 0x7912 # -0xE246 0x6327 0x7911 # -0xE247 0x6328 0x7919 # -0xE248 0x6329 0x792C # -0xE249 0x632A 0x792B # -0xE24A 0x632B 0x7940 # -0xE24B 0x632C 0x7960 # -0xE24C 0x632D 0x7957 # -0xE24D 0x632E 0x795F # -0xE24E 0x632F 0x795A # -0xE24F 0x6330 0x7955 # -0xE250 0x6331 0x7953 # -0xE251 0x6332 0x797A # -0xE252 0x6333 0x797F # -0xE253 0x6334 0x798A # -0xE254 0x6335 0x799D # -0xE255 0x6336 0x79A7 # -0xE256 0x6337 0x9F4B # -0xE257 0x6338 0x79AA # -0xE258 0x6339 0x79AE # -0xE259 0x633A 0x79B3 # -0xE25A 0x633B 0x79B9 # -0xE25B 0x633C 0x79BA # -0xE25C 0x633D 0x79C9 # -0xE25D 0x633E 0x79D5 # -0xE25E 0x633F 0x79E7 # -0xE25F 0x6340 0x79EC # -0xE260 0x6341 0x79E1 # -0xE261 0x6342 0x79E3 # -0xE262 0x6343 0x7A08 # -0xE263 0x6344 0x7A0D # -0xE264 0x6345 0x7A18 # -0xE265 0x6346 0x7A19 # -0xE266 0x6347 0x7A20 # -0xE267 0x6348 0x7A1F # -0xE268 0x6349 0x7980 # -0xE269 0x634A 0x7A31 # -0xE26A 0x634B 0x7A3B # -0xE26B 0x634C 0x7A3E # -0xE26C 0x634D 0x7A37 # -0xE26D 0x634E 0x7A43 # -0xE26E 0x634F 0x7A57 # -0xE26F 0x6350 0x7A49 # -0xE270 0x6351 0x7A61 # -0xE271 0x6352 0x7A62 # -0xE272 0x6353 0x7A69 # -0xE273 0x6354 0x9F9D # -0xE274 0x6355 0x7A70 # -0xE275 0x6356 0x7A79 # -0xE276 0x6357 0x7A7D # -0xE277 0x6358 0x7A88 # -0xE278 0x6359 0x7A97 # -0xE279 0x635A 0x7A95 # -0xE27A 0x635B 0x7A98 # -0xE27B 0x635C 0x7A96 # -0xE27C 0x635D 0x7AA9 # -0xE27D 0x635E 0x7AC8 # -0xE27E 0x635F 0x7AB0 # -0xE280 0x6360 0x7AB6 # -0xE281 0x6361 0x7AC5 # -0xE282 0x6362 0x7AC4 # -0xE283 0x6363 0x7ABF # -0xE284 0x6364 0x9083 # -0xE285 0x6365 0x7AC7 # -0xE286 0x6366 0x7ACA # -0xE287 0x6367 0x7ACD # -0xE288 0x6368 0x7ACF # -0xE289 0x6369 0x7AD5 # -0xE28A 0x636A 0x7AD3 # -0xE28B 0x636B 0x7AD9 # -0xE28C 0x636C 0x7ADA # -0xE28D 0x636D 0x7ADD # -0xE28E 0x636E 0x7AE1 # -0xE28F 0x636F 0x7AE2 # -0xE290 0x6370 0x7AE6 # -0xE291 0x6371 0x7AED # -0xE292 0x6372 0x7AF0 # -0xE293 0x6373 0x7B02 # -0xE294 0x6374 0x7B0F # -0xE295 0x6375 0x7B0A # -0xE296 0x6376 0x7B06 # -0xE297 0x6377 0x7B33 # -0xE298 0x6378 0x7B18 # -0xE299 0x6379 0x7B19 # -0xE29A 0x637A 0x7B1E # -0xE29B 0x637B 0x7B35 # -0xE29C 0x637C 0x7B28 # -0xE29D 0x637D 0x7B36 # -0xE29E 0x637E 0x7B50 # -0xE29F 0x6421 0x7B7A # -0xE2A0 0x6422 0x7B04 # -0xE2A1 0x6423 0x7B4D # -0xE2A2 0x6424 0x7B0B # -0xE2A3 0x6425 0x7B4C # -0xE2A4 0x6426 0x7B45 # -0xE2A5 0x6427 0x7B75 # -0xE2A6 0x6428 0x7B65 # -0xE2A7 0x6429 0x7B74 # -0xE2A8 0x642A 0x7B67 # -0xE2A9 0x642B 0x7B70 # -0xE2AA 0x642C 0x7B71 # -0xE2AB 0x642D 0x7B6C # -0xE2AC 0x642E 0x7B6E # -0xE2AD 0x642F 0x7B9D # -0xE2AE 0x6430 0x7B98 # -0xE2AF 0x6431 0x7B9F # -0xE2B0 0x6432 0x7B8D # -0xE2B1 0x6433 0x7B9C # -0xE2B2 0x6434 0x7B9A # -0xE2B3 0x6435 0x7B8B # -0xE2B4 0x6436 0x7B92 # -0xE2B5 0x6437 0x7B8F # -0xE2B6 0x6438 0x7B5D # -0xE2B7 0x6439 0x7B99 # -0xE2B8 0x643A 0x7BCB # -0xE2B9 0x643B 0x7BC1 # -0xE2BA 0x643C 0x7BCC # -0xE2BB 0x643D 0x7BCF # -0xE2BC 0x643E 0x7BB4 # -0xE2BD 0x643F 0x7BC6 # -0xE2BE 0x6440 0x7BDD # -0xE2BF 0x6441 0x7BE9 # -0xE2C0 0x6442 0x7C11 # -0xE2C1 0x6443 0x7C14 # -0xE2C2 0x6444 0x7BE6 # -0xE2C3 0x6445 0x7BE5 # -0xE2C4 0x6446 0x7C60 # -0xE2C5 0x6447 0x7C00 # -0xE2C6 0x6448 0x7C07 # -0xE2C7 0x6449 0x7C13 # -0xE2C8 0x644A 0x7BF3 # -0xE2C9 0x644B 0x7BF7 # -0xE2CA 0x644C 0x7C17 # -0xE2CB 0x644D 0x7C0D # -0xE2CC 0x644E 0x7BF6 # -0xE2CD 0x644F 0x7C23 # -0xE2CE 0x6450 0x7C27 # -0xE2CF 0x6451 0x7C2A # -0xE2D0 0x6452 0x7C1F # -0xE2D1 0x6453 0x7C37 # -0xE2D2 0x6454 0x7C2B # -0xE2D3 0x6455 0x7C3D # -0xE2D4 0x6456 0x7C4C # -0xE2D5 0x6457 0x7C43 # -0xE2D6 0x6458 0x7C54 # -0xE2D7 0x6459 0x7C4F # -0xE2D8 0x645A 0x7C40 # -0xE2D9 0x645B 0x7C50 # -0xE2DA 0x645C 0x7C58 # -0xE2DB 0x645D 0x7C5F # -0xE2DC 0x645E 0x7C64 # -0xE2DD 0x645F 0x7C56 # -0xE2DE 0x6460 0x7C65 # -0xE2DF 0x6461 0x7C6C # -0xE2E0 0x6462 0x7C75 # -0xE2E1 0x6463 0x7C83 # -0xE2E2 0x6464 0x7C90 # -0xE2E3 0x6465 0x7CA4 # -0xE2E4 0x6466 0x7CAD # -0xE2E5 0x6467 0x7CA2 # -0xE2E6 0x6468 0x7CAB # -0xE2E7 0x6469 0x7CA1 # -0xE2E8 0x646A 0x7CA8 # -0xE2E9 0x646B 0x7CB3 # -0xE2EA 0x646C 0x7CB2 # -0xE2EB 0x646D 0x7CB1 # -0xE2EC 0x646E 0x7CAE # -0xE2ED 0x646F 0x7CB9 # -0xE2EE 0x6470 0x7CBD # -0xE2EF 0x6471 0x7CC0 # -0xE2F0 0x6472 0x7CC5 # -0xE2F1 0x6473 0x7CC2 # -0xE2F2 0x6474 0x7CD8 # -0xE2F3 0x6475 0x7CD2 # -0xE2F4 0x6476 0x7CDC # -0xE2F5 0x6477 0x7CE2 # -0xE2F6 0x6478 0x9B3B # -0xE2F7 0x6479 0x7CEF # -0xE2F8 0x647A 0x7CF2 # -0xE2F9 0x647B 0x7CF4 # -0xE2FA 0x647C 0x7CF6 # -0xE2FB 0x647D 0x7CFA # -0xE2FC 0x647E 0x7D06 # -0xE340 0x6521 0x7D02 # -0xE341 0x6522 0x7D1C # -0xE342 0x6523 0x7D15 # -0xE343 0x6524 0x7D0A # -0xE344 0x6525 0x7D45 # -0xE345 0x6526 0x7D4B # -0xE346 0x6527 0x7D2E # -0xE347 0x6528 0x7D32 # -0xE348 0x6529 0x7D3F # -0xE349 0x652A 0x7D35 # -0xE34A 0x652B 0x7D46 # -0xE34B 0x652C 0x7D73 # -0xE34C 0x652D 0x7D56 # -0xE34D 0x652E 0x7D4E # -0xE34E 0x652F 0x7D72 # -0xE34F 0x6530 0x7D68 # -0xE350 0x6531 0x7D6E # -0xE351 0x6532 0x7D4F # -0xE352 0x6533 0x7D63 # -0xE353 0x6534 0x7D93 # -0xE354 0x6535 0x7D89 # -0xE355 0x6536 0x7D5B # -0xE356 0x6537 0x7D8F # -0xE357 0x6538 0x7D7D # -0xE358 0x6539 0x7D9B # -0xE359 0x653A 0x7DBA # -0xE35A 0x653B 0x7DAE # -0xE35B 0x653C 0x7DA3 # -0xE35C 0x653D 0x7DB5 # -0xE35D 0x653E 0x7DC7 # -0xE35E 0x653F 0x7DBD # -0xE35F 0x6540 0x7DAB # -0xE360 0x6541 0x7E3D # -0xE361 0x6542 0x7DA2 # -0xE362 0x6543 0x7DAF # -0xE363 0x6544 0x7DDC # -0xE364 0x6545 0x7DB8 # -0xE365 0x6546 0x7D9F # -0xE366 0x6547 0x7DB0 # -0xE367 0x6548 0x7DD8 # -0xE368 0x6549 0x7DDD # -0xE369 0x654A 0x7DE4 # -0xE36A 0x654B 0x7DDE # -0xE36B 0x654C 0x7DFB # -0xE36C 0x654D 0x7DF2 # -0xE36D 0x654E 0x7DE1 # -0xE36E 0x654F 0x7E05 # -0xE36F 0x6550 0x7E0A # -0xE370 0x6551 0x7E23 # -0xE371 0x6552 0x7E21 # -0xE372 0x6553 0x7E12 # -0xE373 0x6554 0x7E31 # -0xE374 0x6555 0x7E1F # -0xE375 0x6556 0x7E09 # -0xE376 0x6557 0x7E0B # -0xE377 0x6558 0x7E22 # -0xE378 0x6559 0x7E46 # -0xE379 0x655A 0x7E66 # -0xE37A 0x655B 0x7E3B # -0xE37B 0x655C 0x7E35 # -0xE37C 0x655D 0x7E39 # -0xE37D 0x655E 0x7E43 # -0xE37E 0x655F 0x7E37 # -0xE380 0x6560 0x7E32 # -0xE381 0x6561 0x7E3A # -0xE382 0x6562 0x7E67 # -0xE383 0x6563 0x7E5D # -0xE384 0x6564 0x7E56 # -0xE385 0x6565 0x7E5E # -0xE386 0x6566 0x7E59 # -0xE387 0x6567 0x7E5A # -0xE388 0x6568 0x7E79 # -0xE389 0x6569 0x7E6A # -0xE38A 0x656A 0x7E69 # -0xE38B 0x656B 0x7E7C # -0xE38C 0x656C 0x7E7B # -0xE38D 0x656D 0x7E83 # -0xE38E 0x656E 0x7DD5 # -0xE38F 0x656F 0x7E7D # -0xE390 0x6570 0x8FAE # -0xE391 0x6571 0x7E7F # -0xE392 0x6572 0x7E88 # -0xE393 0x6573 0x7E89 # -0xE394 0x6574 0x7E8C # -0xE395 0x6575 0x7E92 # -0xE396 0x6576 0x7E90 # -0xE397 0x6577 0x7E93 # -0xE398 0x6578 0x7E94 # -0xE399 0x6579 0x7E96 # -0xE39A 0x657A 0x7E8E # -0xE39B 0x657B 0x7E9B # -0xE39C 0x657C 0x7E9C # -0xE39D 0x657D 0x7F38 # -0xE39E 0x657E 0x7F3A # -0xE39F 0x6621 0x7F45 # -0xE3A0 0x6622 0x7F4C # -0xE3A1 0x6623 0x7F4D # -0xE3A2 0x6624 0x7F4E # -0xE3A3 0x6625 0x7F50 # -0xE3A4 0x6626 0x7F51 # -0xE3A5 0x6627 0x7F55 # -0xE3A6 0x6628 0x7F54 # -0xE3A7 0x6629 0x7F58 # -0xE3A8 0x662A 0x7F5F # -0xE3A9 0x662B 0x7F60 # -0xE3AA 0x662C 0x7F68 # -0xE3AB 0x662D 0x7F69 # -0xE3AC 0x662E 0x7F67 # -0xE3AD 0x662F 0x7F78 # -0xE3AE 0x6630 0x7F82 # -0xE3AF 0x6631 0x7F86 # -0xE3B0 0x6632 0x7F83 # -0xE3B1 0x6633 0x7F88 # -0xE3B2 0x6634 0x7F87 # -0xE3B3 0x6635 0x7F8C # -0xE3B4 0x6636 0x7F94 # -0xE3B5 0x6637 0x7F9E # -0xE3B6 0x6638 0x7F9D # -0xE3B7 0x6639 0x7F9A # -0xE3B8 0x663A 0x7FA3 # -0xE3B9 0x663B 0x7FAF # -0xE3BA 0x663C 0x7FB2 # -0xE3BB 0x663D 0x7FB9 # -0xE3BC 0x663E 0x7FAE # -0xE3BD 0x663F 0x7FB6 # -0xE3BE 0x6640 0x7FB8 # -0xE3BF 0x6641 0x8B71 # -0xE3C0 0x6642 0x7FC5 # -0xE3C1 0x6643 0x7FC6 # -0xE3C2 0x6644 0x7FCA # -0xE3C3 0x6645 0x7FD5 # -0xE3C4 0x6646 0x7FD4 # -0xE3C5 0x6647 0x7FE1 # -0xE3C6 0x6648 0x7FE6 # -0xE3C7 0x6649 0x7FE9 # -0xE3C8 0x664A 0x7FF3 # -0xE3C9 0x664B 0x7FF9 # -0xE3CA 0x664C 0x98DC # -0xE3CB 0x664D 0x8006 # -0xE3CC 0x664E 0x8004 # -0xE3CD 0x664F 0x800B # -0xE3CE 0x6650 0x8012 # -0xE3CF 0x6651 0x8018 # -0xE3D0 0x6652 0x8019 # -0xE3D1 0x6653 0x801C # -0xE3D2 0x6654 0x8021 # -0xE3D3 0x6655 0x8028 # -0xE3D4 0x6656 0x803F # -0xE3D5 0x6657 0x803B # -0xE3D6 0x6658 0x804A # -0xE3D7 0x6659 0x8046 # -0xE3D8 0x665A 0x8052 # -0xE3D9 0x665B 0x8058 # -0xE3DA 0x665C 0x805A # -0xE3DB 0x665D 0x805F # -0xE3DC 0x665E 0x8062 # -0xE3DD 0x665F 0x8068 # -0xE3DE 0x6660 0x8073 # -0xE3DF 0x6661 0x8072 # -0xE3E0 0x6662 0x8070 # -0xE3E1 0x6663 0x8076 # -0xE3E2 0x6664 0x8079 # -0xE3E3 0x6665 0x807D # -0xE3E4 0x6666 0x807F # -0xE3E5 0x6667 0x8084 # -0xE3E6 0x6668 0x8086 # -0xE3E7 0x6669 0x8085 # -0xE3E8 0x666A 0x809B # -0xE3E9 0x666B 0x8093 # -0xE3EA 0x666C 0x809A # -0xE3EB 0x666D 0x80AD # -0xE3EC 0x666E 0x5190 # -0xE3ED 0x666F 0x80AC # -0xE3EE 0x6670 0x80DB # -0xE3EF 0x6671 0x80E5 # -0xE3F0 0x6672 0x80D9 # -0xE3F1 0x6673 0x80DD # -0xE3F2 0x6674 0x80C4 # -0xE3F3 0x6675 0x80DA # -0xE3F4 0x6676 0x80D6 # -0xE3F5 0x6677 0x8109 # -0xE3F6 0x6678 0x80EF # -0xE3F7 0x6679 0x80F1 # -0xE3F8 0x667A 0x811B # -0xE3F9 0x667B 0x8129 # -0xE3FA 0x667C 0x8123 # -0xE3FB 0x667D 0x812F # -0xE3FC 0x667E 0x814B # -0xE440 0x6721 0x968B # -0xE441 0x6722 0x8146 # -0xE442 0x6723 0x813E # -0xE443 0x6724 0x8153 # -0xE444 0x6725 0x8151 # -0xE445 0x6726 0x80FC # -0xE446 0x6727 0x8171 # -0xE447 0x6728 0x816E # -0xE448 0x6729 0x8165 # -0xE449 0x672A 0x8166 # -0xE44A 0x672B 0x8174 # -0xE44B 0x672C 0x8183 # -0xE44C 0x672D 0x8188 # -0xE44D 0x672E 0x818A # -0xE44E 0x672F 0x8180 # -0xE44F 0x6730 0x8182 # -0xE450 0x6731 0x81A0 # -0xE451 0x6732 0x8195 # -0xE452 0x6733 0x81A4 # -0xE453 0x6734 0x81A3 # -0xE454 0x6735 0x815F # -0xE455 0x6736 0x8193 # -0xE456 0x6737 0x81A9 # -0xE457 0x6738 0x81B0 # -0xE458 0x6739 0x81B5 # -0xE459 0x673A 0x81BE # -0xE45A 0x673B 0x81B8 # -0xE45B 0x673C 0x81BD # -0xE45C 0x673D 0x81C0 # -0xE45D 0x673E 0x81C2 # -0xE45E 0x673F 0x81BA # -0xE45F 0x6740 0x81C9 # -0xE460 0x6741 0x81CD # -0xE461 0x6742 0x81D1 # -0xE462 0x6743 0x81D9 # -0xE463 0x6744 0x81D8 # -0xE464 0x6745 0x81C8 # -0xE465 0x6746 0x81DA # -0xE466 0x6747 0x81DF # -0xE467 0x6748 0x81E0 # -0xE468 0x6749 0x81E7 # -0xE469 0x674A 0x81FA # -0xE46A 0x674B 0x81FB # -0xE46B 0x674C 0x81FE # -0xE46C 0x674D 0x8201 # -0xE46D 0x674E 0x8202 # -0xE46E 0x674F 0x8205 # -0xE46F 0x6750 0x8207 # -0xE470 0x6751 0x820A # -0xE471 0x6752 0x820D # -0xE472 0x6753 0x8210 # -0xE473 0x6754 0x8216 # -0xE474 0x6755 0x8229 # -0xE475 0x6756 0x822B # -0xE476 0x6757 0x8238 # -0xE477 0x6758 0x8233 # -0xE478 0x6759 0x8240 # -0xE479 0x675A 0x8259 # -0xE47A 0x675B 0x8258 # -0xE47B 0x675C 0x825D # -0xE47C 0x675D 0x825A # -0xE47D 0x675E 0x825F # -0xE47E 0x675F 0x8264 # -0xE480 0x6760 0x8262 # -0xE481 0x6761 0x8268 # -0xE482 0x6762 0x826A # -0xE483 0x6763 0x826B # -0xE484 0x6764 0x822E # -0xE485 0x6765 0x8271 # -0xE486 0x6766 0x8277 # -0xE487 0x6767 0x8278 # -0xE488 0x6768 0x827E # -0xE489 0x6769 0x828D # -0xE48A 0x676A 0x8292 # -0xE48B 0x676B 0x82AB # -0xE48C 0x676C 0x829F # -0xE48D 0x676D 0x82BB # -0xE48E 0x676E 0x82AC # -0xE48F 0x676F 0x82E1 # -0xE490 0x6770 0x82E3 # -0xE491 0x6771 0x82DF # -0xE492 0x6772 0x82D2 # -0xE493 0x6773 0x82F4 # -0xE494 0x6774 0x82F3 # -0xE495 0x6775 0x82FA # -0xE496 0x6776 0x8393 # -0xE497 0x6777 0x8303 # -0xE498 0x6778 0x82FB # -0xE499 0x6779 0x82F9 # -0xE49A 0x677A 0x82DE # -0xE49B 0x677B 0x8306 # -0xE49C 0x677C 0x82DC # -0xE49D 0x677D 0x8309 # -0xE49E 0x677E 0x82D9 # -0xE49F 0x6821 0x8335 # -0xE4A0 0x6822 0x8334 # -0xE4A1 0x6823 0x8316 # -0xE4A2 0x6824 0x8332 # -0xE4A3 0x6825 0x8331 # -0xE4A4 0x6826 0x8340 # -0xE4A5 0x6827 0x8339 # -0xE4A6 0x6828 0x8350 # -0xE4A7 0x6829 0x8345 # -0xE4A8 0x682A 0x832F # -0xE4A9 0x682B 0x832B # -0xE4AA 0x682C 0x8317 # -0xE4AB 0x682D 0x8318 # -0xE4AC 0x682E 0x8385 # -0xE4AD 0x682F 0x839A # -0xE4AE 0x6830 0x83AA # -0xE4AF 0x6831 0x839F # -0xE4B0 0x6832 0x83A2 # -0xE4B1 0x6833 0x8396 # -0xE4B2 0x6834 0x8323 # -0xE4B3 0x6835 0x838E # -0xE4B4 0x6836 0x8387 # -0xE4B5 0x6837 0x838A # -0xE4B6 0x6838 0x837C # -0xE4B7 0x6839 0x83B5 # -0xE4B8 0x683A 0x8373 # -0xE4B9 0x683B 0x8375 # -0xE4BA 0x683C 0x83A0 # -0xE4BB 0x683D 0x8389 # -0xE4BC 0x683E 0x83A8 # -0xE4BD 0x683F 0x83F4 # -0xE4BE 0x6840 0x8413 # -0xE4BF 0x6841 0x83EB # -0xE4C0 0x6842 0x83CE # -0xE4C1 0x6843 0x83FD # -0xE4C2 0x6844 0x8403 # -0xE4C3 0x6845 0x83D8 # -0xE4C4 0x6846 0x840B # -0xE4C5 0x6847 0x83C1 # -0xE4C6 0x6848 0x83F7 # -0xE4C7 0x6849 0x8407 # -0xE4C8 0x684A 0x83E0 # -0xE4C9 0x684B 0x83F2 # -0xE4CA 0x684C 0x840D # -0xE4CB 0x684D 0x8422 # -0xE4CC 0x684E 0x8420 # -0xE4CD 0x684F 0x83BD # -0xE4CE 0x6850 0x8438 # -0xE4CF 0x6851 0x8506 # -0xE4D0 0x6852 0x83FB # -0xE4D1 0x6853 0x846D # -0xE4D2 0x6854 0x842A # -0xE4D3 0x6855 0x843C # -0xE4D4 0x6856 0x855A # -0xE4D5 0x6857 0x8484 # -0xE4D6 0x6858 0x8477 # -0xE4D7 0x6859 0x846B # -0xE4D8 0x685A 0x84AD # -0xE4D9 0x685B 0x846E # -0xE4DA 0x685C 0x8482 # -0xE4DB 0x685D 0x8469 # -0xE4DC 0x685E 0x8446 # -0xE4DD 0x685F 0x842C # -0xE4DE 0x6860 0x846F # -0xE4DF 0x6861 0x8479 # -0xE4E0 0x6862 0x8435 # -0xE4E1 0x6863 0x84CA # -0xE4E2 0x6864 0x8462 # -0xE4E3 0x6865 0x84B9 # -0xE4E4 0x6866 0x84BF # -0xE4E5 0x6867 0x849F # -0xE4E6 0x6868 0x84D9 # -0xE4E7 0x6869 0x84CD # -0xE4E8 0x686A 0x84BB # -0xE4E9 0x686B 0x84DA # -0xE4EA 0x686C 0x84D0 # -0xE4EB 0x686D 0x84C1 # -0xE4EC 0x686E 0x84C6 # -0xE4ED 0x686F 0x84D6 # -0xE4EE 0x6870 0x84A1 # -0xE4EF 0x6871 0x8521 # -0xE4F0 0x6872 0x84FF # -0xE4F1 0x6873 0x84F4 # -0xE4F2 0x6874 0x8517 # -0xE4F3 0x6875 0x8518 # -0xE4F4 0x6876 0x852C # -0xE4F5 0x6877 0x851F # -0xE4F6 0x6878 0x8515 # -0xE4F7 0x6879 0x8514 # -0xE4F8 0x687A 0x84FC # -0xE4F9 0x687B 0x8540 # -0xE4FA 0x687C 0x8563 # -0xE4FB 0x687D 0x8558 # -0xE4FC 0x687E 0x8548 # -0xE540 0x6921 0x8541 # -0xE541 0x6922 0x8602 # -0xE542 0x6923 0x854B # -0xE543 0x6924 0x8555 # -0xE544 0x6925 0x8580 # -0xE545 0x6926 0x85A4 # -0xE546 0x6927 0x8588 # -0xE547 0x6928 0x8591 # -0xE548 0x6929 0x858A # -0xE549 0x692A 0x85A8 # -0xE54A 0x692B 0x856D # -0xE54B 0x692C 0x8594 # -0xE54C 0x692D 0x859B # -0xE54D 0x692E 0x85EA # -0xE54E 0x692F 0x8587 # -0xE54F 0x6930 0x859C # -0xE550 0x6931 0x8577 # -0xE551 0x6932 0x857E # -0xE552 0x6933 0x8590 # -0xE553 0x6934 0x85C9 # -0xE554 0x6935 0x85BA # -0xE555 0x6936 0x85CF # -0xE556 0x6937 0x85B9 # -0xE557 0x6938 0x85D0 # -0xE558 0x6939 0x85D5 # -0xE559 0x693A 0x85DD # -0xE55A 0x693B 0x85E5 # -0xE55B 0x693C 0x85DC # -0xE55C 0x693D 0x85F9 # -0xE55D 0x693E 0x860A # -0xE55E 0x693F 0x8613 # -0xE55F 0x6940 0x860B # -0xE560 0x6941 0x85FE # -0xE561 0x6942 0x85FA # -0xE562 0x6943 0x8606 # -0xE563 0x6944 0x8622 # -0xE564 0x6945 0x861A # -0xE565 0x6946 0x8630 # -0xE566 0x6947 0x863F # -0xE567 0x6948 0x864D # -0xE568 0x6949 0x4E55 # -0xE569 0x694A 0x8654 # -0xE56A 0x694B 0x865F # -0xE56B 0x694C 0x8667 # -0xE56C 0x694D 0x8671 # -0xE56D 0x694E 0x8693 # -0xE56E 0x694F 0x86A3 # -0xE56F 0x6950 0x86A9 # -0xE570 0x6951 0x86AA # -0xE571 0x6952 0x868B # -0xE572 0x6953 0x868C # -0xE573 0x6954 0x86B6 # -0xE574 0x6955 0x86AF # -0xE575 0x6956 0x86C4 # -0xE576 0x6957 0x86C6 # -0xE577 0x6958 0x86B0 # -0xE578 0x6959 0x86C9 # -0xE579 0x695A 0x8823 # -0xE57A 0x695B 0x86AB # -0xE57B 0x695C 0x86D4 # -0xE57C 0x695D 0x86DE # -0xE57D 0x695E 0x86E9 # -0xE57E 0x695F 0x86EC # -0xE580 0x6960 0x86DF # -0xE581 0x6961 0x86DB # -0xE582 0x6962 0x86EF # -0xE583 0x6963 0x8712 # -0xE584 0x6964 0x8706 # -0xE585 0x6965 0x8708 # -0xE586 0x6966 0x8700 # -0xE587 0x6967 0x8703 # -0xE588 0x6968 0x86FB # -0xE589 0x6969 0x8711 # -0xE58A 0x696A 0x8709 # -0xE58B 0x696B 0x870D # -0xE58C 0x696C 0x86F9 # -0xE58D 0x696D 0x870A # -0xE58E 0x696E 0x8734 # -0xE58F 0x696F 0x873F # -0xE590 0x6970 0x8737 # -0xE591 0x6971 0x873B # -0xE592 0x6972 0x8725 # -0xE593 0x6973 0x8729 # -0xE594 0x6974 0x871A # -0xE595 0x6975 0x8760 # -0xE596 0x6976 0x875F # -0xE597 0x6977 0x8778 # -0xE598 0x6978 0x874C # -0xE599 0x6979 0x874E # -0xE59A 0x697A 0x8774 # -0xE59B 0x697B 0x8757 # -0xE59C 0x697C 0x8768 # -0xE59D 0x697D 0x876E # -0xE59E 0x697E 0x8759 # -0xE59F 0x6A21 0x8753 # -0xE5A0 0x6A22 0x8763 # -0xE5A1 0x6A23 0x876A # -0xE5A2 0x6A24 0x8805 # -0xE5A3 0x6A25 0x87A2 # -0xE5A4 0x6A26 0x879F # -0xE5A5 0x6A27 0x8782 # -0xE5A6 0x6A28 0x87AF # -0xE5A7 0x6A29 0x87CB # -0xE5A8 0x6A2A 0x87BD # -0xE5A9 0x6A2B 0x87C0 # -0xE5AA 0x6A2C 0x87D0 # -0xE5AB 0x6A2D 0x96D6 # -0xE5AC 0x6A2E 0x87AB # -0xE5AD 0x6A2F 0x87C4 # -0xE5AE 0x6A30 0x87B3 # -0xE5AF 0x6A31 0x87C7 # -0xE5B0 0x6A32 0x87C6 # -0xE5B1 0x6A33 0x87BB # -0xE5B2 0x6A34 0x87EF # -0xE5B3 0x6A35 0x87F2 # -0xE5B4 0x6A36 0x87E0 # -0xE5B5 0x6A37 0x880F # -0xE5B6 0x6A38 0x880D # -0xE5B7 0x6A39 0x87FE # -0xE5B8 0x6A3A 0x87F6 # -0xE5B9 0x6A3B 0x87F7 # -0xE5BA 0x6A3C 0x880E # -0xE5BB 0x6A3D 0x87D2 # -0xE5BC 0x6A3E 0x8811 # -0xE5BD 0x6A3F 0x8816 # -0xE5BE 0x6A40 0x8815 # -0xE5BF 0x6A41 0x8822 # -0xE5C0 0x6A42 0x8821 # -0xE5C1 0x6A43 0x8831 # -0xE5C2 0x6A44 0x8836 # -0xE5C3 0x6A45 0x8839 # -0xE5C4 0x6A46 0x8827 # -0xE5C5 0x6A47 0x883B # -0xE5C6 0x6A48 0x8844 # -0xE5C7 0x6A49 0x8842 # -0xE5C8 0x6A4A 0x8852 # -0xE5C9 0x6A4B 0x8859 # -0xE5CA 0x6A4C 0x885E # -0xE5CB 0x6A4D 0x8862 # -0xE5CC 0x6A4E 0x886B # -0xE5CD 0x6A4F 0x8881 # -0xE5CE 0x6A50 0x887E # -0xE5CF 0x6A51 0x889E # -0xE5D0 0x6A52 0x8875 # -0xE5D1 0x6A53 0x887D # -0xE5D2 0x6A54 0x88B5 # -0xE5D3 0x6A55 0x8872 # -0xE5D4 0x6A56 0x8882 # -0xE5D5 0x6A57 0x8897 # -0xE5D6 0x6A58 0x8892 # -0xE5D7 0x6A59 0x88AE # -0xE5D8 0x6A5A 0x8899 # -0xE5D9 0x6A5B 0x88A2 # -0xE5DA 0x6A5C 0x888D # -0xE5DB 0x6A5D 0x88A4 # -0xE5DC 0x6A5E 0x88B0 # -0xE5DD 0x6A5F 0x88BF # -0xE5DE 0x6A60 0x88B1 # -0xE5DF 0x6A61 0x88C3 # -0xE5E0 0x6A62 0x88C4 # -0xE5E1 0x6A63 0x88D4 # -0xE5E2 0x6A64 0x88D8 # -0xE5E3 0x6A65 0x88D9 # -0xE5E4 0x6A66 0x88DD # -0xE5E5 0x6A67 0x88F9 # -0xE5E6 0x6A68 0x8902 # -0xE5E7 0x6A69 0x88FC # -0xE5E8 0x6A6A 0x88F4 # -0xE5E9 0x6A6B 0x88E8 # -0xE5EA 0x6A6C 0x88F2 # -0xE5EB 0x6A6D 0x8904 # -0xE5EC 0x6A6E 0x890C # -0xE5ED 0x6A6F 0x890A # -0xE5EE 0x6A70 0x8913 # -0xE5EF 0x6A71 0x8943 # -0xE5F0 0x6A72 0x891E # -0xE5F1 0x6A73 0x8925 # -0xE5F2 0x6A74 0x892A # -0xE5F3 0x6A75 0x892B # -0xE5F4 0x6A76 0x8941 # -0xE5F5 0x6A77 0x8944 # -0xE5F6 0x6A78 0x893B # -0xE5F7 0x6A79 0x8936 # -0xE5F8 0x6A7A 0x8938 # -0xE5F9 0x6A7B 0x894C # -0xE5FA 0x6A7C 0x891D # -0xE5FB 0x6A7D 0x8960 # -0xE5FC 0x6A7E 0x895E # -0xE640 0x6B21 0x8966 # -0xE641 0x6B22 0x8964 # -0xE642 0x6B23 0x896D # -0xE643 0x6B24 0x896A # -0xE644 0x6B25 0x896F # -0xE645 0x6B26 0x8974 # -0xE646 0x6B27 0x8977 # -0xE647 0x6B28 0x897E # -0xE648 0x6B29 0x8983 # -0xE649 0x6B2A 0x8988 # -0xE64A 0x6B2B 0x898A # -0xE64B 0x6B2C 0x8993 # -0xE64C 0x6B2D 0x8998 # -0xE64D 0x6B2E 0x89A1 # -0xE64E 0x6B2F 0x89A9 # -0xE64F 0x6B30 0x89A6 # -0xE650 0x6B31 0x89AC # -0xE651 0x6B32 0x89AF # -0xE652 0x6B33 0x89B2 # -0xE653 0x6B34 0x89BA # -0xE654 0x6B35 0x89BD # -0xE655 0x6B36 0x89BF # -0xE656 0x6B37 0x89C0 # -0xE657 0x6B38 0x89DA # -0xE658 0x6B39 0x89DC # -0xE659 0x6B3A 0x89DD # -0xE65A 0x6B3B 0x89E7 # -0xE65B 0x6B3C 0x89F4 # -0xE65C 0x6B3D 0x89F8 # -0xE65D 0x6B3E 0x8A03 # -0xE65E 0x6B3F 0x8A16 # -0xE65F 0x6B40 0x8A10 # -0xE660 0x6B41 0x8A0C # -0xE661 0x6B42 0x8A1B # -0xE662 0x6B43 0x8A1D # -0xE663 0x6B44 0x8A25 # -0xE664 0x6B45 0x8A36 # -0xE665 0x6B46 0x8A41 # -0xE666 0x6B47 0x8A5B # -0xE667 0x6B48 0x8A52 # -0xE668 0x6B49 0x8A46 # -0xE669 0x6B4A 0x8A48 # -0xE66A 0x6B4B 0x8A7C # -0xE66B 0x6B4C 0x8A6D # -0xE66C 0x6B4D 0x8A6C # -0xE66D 0x6B4E 0x8A62 # -0xE66E 0x6B4F 0x8A85 # -0xE66F 0x6B50 0x8A82 # -0xE670 0x6B51 0x8A84 # -0xE671 0x6B52 0x8AA8 # -0xE672 0x6B53 0x8AA1 # -0xE673 0x6B54 0x8A91 # -0xE674 0x6B55 0x8AA5 # -0xE675 0x6B56 0x8AA6 # -0xE676 0x6B57 0x8A9A # -0xE677 0x6B58 0x8AA3 # -0xE678 0x6B59 0x8AC4 # -0xE679 0x6B5A 0x8ACD # -0xE67A 0x6B5B 0x8AC2 # -0xE67B 0x6B5C 0x8ADA # -0xE67C 0x6B5D 0x8AEB # -0xE67D 0x6B5E 0x8AF3 # -0xE67E 0x6B5F 0x8AE7 # -0xE680 0x6B60 0x8AE4 # -0xE681 0x6B61 0x8AF1 # -0xE682 0x6B62 0x8B14 # -0xE683 0x6B63 0x8AE0 # -0xE684 0x6B64 0x8AE2 # -0xE685 0x6B65 0x8AF7 # -0xE686 0x6B66 0x8ADE # -0xE687 0x6B67 0x8ADB # -0xE688 0x6B68 0x8B0C # -0xE689 0x6B69 0x8B07 # -0xE68A 0x6B6A 0x8B1A # -0xE68B 0x6B6B 0x8AE1 # -0xE68C 0x6B6C 0x8B16 # -0xE68D 0x6B6D 0x8B10 # -0xE68E 0x6B6E 0x8B17 # -0xE68F 0x6B6F 0x8B20 # -0xE690 0x6B70 0x8B33 # -0xE691 0x6B71 0x97AB # -0xE692 0x6B72 0x8B26 # -0xE693 0x6B73 0x8B2B # -0xE694 0x6B74 0x8B3E # -0xE695 0x6B75 0x8B28 # -0xE696 0x6B76 0x8B41 # -0xE697 0x6B77 0x8B4C # -0xE698 0x6B78 0x8B4F # -0xE699 0x6B79 0x8B4E # -0xE69A 0x6B7A 0x8B49 # -0xE69B 0x6B7B 0x8B56 # -0xE69C 0x6B7C 0x8B5B # -0xE69D 0x6B7D 0x8B5A # -0xE69E 0x6B7E 0x8B6B # -0xE69F 0x6C21 0x8B5F # -0xE6A0 0x6C22 0x8B6C # -0xE6A1 0x6C23 0x8B6F # -0xE6A2 0x6C24 0x8B74 # -0xE6A3 0x6C25 0x8B7D # -0xE6A4 0x6C26 0x8B80 # -0xE6A5 0x6C27 0x8B8C # -0xE6A6 0x6C28 0x8B8E # -0xE6A7 0x6C29 0x8B92 # -0xE6A8 0x6C2A 0x8B93 # -0xE6A9 0x6C2B 0x8B96 # -0xE6AA 0x6C2C 0x8B99 # -0xE6AB 0x6C2D 0x8B9A # -0xE6AC 0x6C2E 0x8C3A # -0xE6AD 0x6C2F 0x8C41 # -0xE6AE 0x6C30 0x8C3F # -0xE6AF 0x6C31 0x8C48 # -0xE6B0 0x6C32 0x8C4C # -0xE6B1 0x6C33 0x8C4E # -0xE6B2 0x6C34 0x8C50 # -0xE6B3 0x6C35 0x8C55 # -0xE6B4 0x6C36 0x8C62 # -0xE6B5 0x6C37 0x8C6C # -0xE6B6 0x6C38 0x8C78 # -0xE6B7 0x6C39 0x8C7A # -0xE6B8 0x6C3A 0x8C82 # -0xE6B9 0x6C3B 0x8C89 # -0xE6BA 0x6C3C 0x8C85 # -0xE6BB 0x6C3D 0x8C8A # -0xE6BC 0x6C3E 0x8C8D # -0xE6BD 0x6C3F 0x8C8E # -0xE6BE 0x6C40 0x8C94 # -0xE6BF 0x6C41 0x8C7C # -0xE6C0 0x6C42 0x8C98 # -0xE6C1 0x6C43 0x621D # -0xE6C2 0x6C44 0x8CAD # -0xE6C3 0x6C45 0x8CAA # -0xE6C4 0x6C46 0x8CBD # -0xE6C5 0x6C47 0x8CB2 # -0xE6C6 0x6C48 0x8CB3 # -0xE6C7 0x6C49 0x8CAE # -0xE6C8 0x6C4A 0x8CB6 # -0xE6C9 0x6C4B 0x8CC8 # -0xE6CA 0x6C4C 0x8CC1 # -0xE6CB 0x6C4D 0x8CE4 # -0xE6CC 0x6C4E 0x8CE3 # -0xE6CD 0x6C4F 0x8CDA # -0xE6CE 0x6C50 0x8CFD # -0xE6CF 0x6C51 0x8CFA # -0xE6D0 0x6C52 0x8CFB # -0xE6D1 0x6C53 0x8D04 # -0xE6D2 0x6C54 0x8D05 # -0xE6D3 0x6C55 0x8D0A # -0xE6D4 0x6C56 0x8D07 # -0xE6D5 0x6C57 0x8D0F # -0xE6D6 0x6C58 0x8D0D # -0xE6D7 0x6C59 0x8D10 # -0xE6D8 0x6C5A 0x9F4E # -0xE6D9 0x6C5B 0x8D13 # -0xE6DA 0x6C5C 0x8CCD # -0xE6DB 0x6C5D 0x8D14 # -0xE6DC 0x6C5E 0x8D16 # -0xE6DD 0x6C5F 0x8D67 # -0xE6DE 0x6C60 0x8D6D # -0xE6DF 0x6C61 0x8D71 # -0xE6E0 0x6C62 0x8D73 # -0xE6E1 0x6C63 0x8D81 # -0xE6E2 0x6C64 0x8D99 # -0xE6E3 0x6C65 0x8DC2 # -0xE6E4 0x6C66 0x8DBE # -0xE6E5 0x6C67 0x8DBA # -0xE6E6 0x6C68 0x8DCF # -0xE6E7 0x6C69 0x8DDA # -0xE6E8 0x6C6A 0x8DD6 # -0xE6E9 0x6C6B 0x8DCC # -0xE6EA 0x6C6C 0x8DDB # -0xE6EB 0x6C6D 0x8DCB # -0xE6EC 0x6C6E 0x8DEA # -0xE6ED 0x6C6F 0x8DEB # -0xE6EE 0x6C70 0x8DDF # -0xE6EF 0x6C71 0x8DE3 # -0xE6F0 0x6C72 0x8DFC # -0xE6F1 0x6C73 0x8E08 # -0xE6F2 0x6C74 0x8E09 # -0xE6F3 0x6C75 0x8DFF # -0xE6F4 0x6C76 0x8E1D # -0xE6F5 0x6C77 0x8E1E # -0xE6F6 0x6C78 0x8E10 # -0xE6F7 0x6C79 0x8E1F # -0xE6F8 0x6C7A 0x8E42 # -0xE6F9 0x6C7B 0x8E35 # -0xE6FA 0x6C7C 0x8E30 # -0xE6FB 0x6C7D 0x8E34 # -0xE6FC 0x6C7E 0x8E4A # -0xE740 0x6D21 0x8E47 # -0xE741 0x6D22 0x8E49 # -0xE742 0x6D23 0x8E4C # -0xE743 0x6D24 0x8E50 # -0xE744 0x6D25 0x8E48 # -0xE745 0x6D26 0x8E59 # -0xE746 0x6D27 0x8E64 # -0xE747 0x6D28 0x8E60 # -0xE748 0x6D29 0x8E2A # -0xE749 0x6D2A 0x8E63 # -0xE74A 0x6D2B 0x8E55 # -0xE74B 0x6D2C 0x8E76 # -0xE74C 0x6D2D 0x8E72 # -0xE74D 0x6D2E 0x8E7C # -0xE74E 0x6D2F 0x8E81 # -0xE74F 0x6D30 0x8E87 # -0xE750 0x6D31 0x8E85 # -0xE751 0x6D32 0x8E84 # -0xE752 0x6D33 0x8E8B # -0xE753 0x6D34 0x8E8A # -0xE754 0x6D35 0x8E93 # -0xE755 0x6D36 0x8E91 # -0xE756 0x6D37 0x8E94 # -0xE757 0x6D38 0x8E99 # -0xE758 0x6D39 0x8EAA # -0xE759 0x6D3A 0x8EA1 # -0xE75A 0x6D3B 0x8EAC # -0xE75B 0x6D3C 0x8EB0 # -0xE75C 0x6D3D 0x8EC6 # -0xE75D 0x6D3E 0x8EB1 # -0xE75E 0x6D3F 0x8EBE # -0xE75F 0x6D40 0x8EC5 # -0xE760 0x6D41 0x8EC8 # -0xE761 0x6D42 0x8ECB # -0xE762 0x6D43 0x8EDB # -0xE763 0x6D44 0x8EE3 # -0xE764 0x6D45 0x8EFC # -0xE765 0x6D46 0x8EFB # -0xE766 0x6D47 0x8EEB # -0xE767 0x6D48 0x8EFE # -0xE768 0x6D49 0x8F0A # -0xE769 0x6D4A 0x8F05 # -0xE76A 0x6D4B 0x8F15 # -0xE76B 0x6D4C 0x8F12 # -0xE76C 0x6D4D 0x8F19 # -0xE76D 0x6D4E 0x8F13 # -0xE76E 0x6D4F 0x8F1C # -0xE76F 0x6D50 0x8F1F # -0xE770 0x6D51 0x8F1B # -0xE771 0x6D52 0x8F0C # -0xE772 0x6D53 0x8F26 # -0xE773 0x6D54 0x8F33 # -0xE774 0x6D55 0x8F3B # -0xE775 0x6D56 0x8F39 # -0xE776 0x6D57 0x8F45 # -0xE777 0x6D58 0x8F42 # -0xE778 0x6D59 0x8F3E # -0xE779 0x6D5A 0x8F4C # -0xE77A 0x6D5B 0x8F49 # -0xE77B 0x6D5C 0x8F46 # -0xE77C 0x6D5D 0x8F4E # -0xE77D 0x6D5E 0x8F57 # -0xE77E 0x6D5F 0x8F5C # -0xE780 0x6D60 0x8F62 # -0xE781 0x6D61 0x8F63 # -0xE782 0x6D62 0x8F64 # -0xE783 0x6D63 0x8F9C # -0xE784 0x6D64 0x8F9F # -0xE785 0x6D65 0x8FA3 # -0xE786 0x6D66 0x8FAD # -0xE787 0x6D67 0x8FAF # -0xE788 0x6D68 0x8FB7 # -0xE789 0x6D69 0x8FDA # -0xE78A 0x6D6A 0x8FE5 # -0xE78B 0x6D6B 0x8FE2 # -0xE78C 0x6D6C 0x8FEA # -0xE78D 0x6D6D 0x8FEF # -0xE78E 0x6D6E 0x9087 # -0xE78F 0x6D6F 0x8FF4 # -0xE790 0x6D70 0x9005 # -0xE791 0x6D71 0x8FF9 # -0xE792 0x6D72 0x8FFA # -0xE793 0x6D73 0x9011 # -0xE794 0x6D74 0x9015 # -0xE795 0x6D75 0x9021 # -0xE796 0x6D76 0x900D # -0xE797 0x6D77 0x901E # -0xE798 0x6D78 0x9016 # -0xE799 0x6D79 0x900B # -0xE79A 0x6D7A 0x9027 # -0xE79B 0x6D7B 0x9036 # -0xE79C 0x6D7C 0x9035 # -0xE79D 0x6D7D 0x9039 # -0xE79E 0x6D7E 0x8FF8 # -0xE79F 0x6E21 0x904F # -0xE7A0 0x6E22 0x9050 # -0xE7A1 0x6E23 0x9051 # -0xE7A2 0x6E24 0x9052 # -0xE7A3 0x6E25 0x900E # -0xE7A4 0x6E26 0x9049 # -0xE7A5 0x6E27 0x903E # -0xE7A6 0x6E28 0x9056 # -0xE7A7 0x6E29 0x9058 # -0xE7A8 0x6E2A 0x905E # -0xE7A9 0x6E2B 0x9068 # -0xE7AA 0x6E2C 0x906F # -0xE7AB 0x6E2D 0x9076 # -0xE7AC 0x6E2E 0x96A8 # -0xE7AD 0x6E2F 0x9072 # -0xE7AE 0x6E30 0x9082 # -0xE7AF 0x6E31 0x907D # -0xE7B0 0x6E32 0x9081 # -0xE7B1 0x6E33 0x9080 # -0xE7B2 0x6E34 0x908A # -0xE7B3 0x6E35 0x9089 # -0xE7B4 0x6E36 0x908F # -0xE7B5 0x6E37 0x90A8 # -0xE7B6 0x6E38 0x90AF # -0xE7B7 0x6E39 0x90B1 # -0xE7B8 0x6E3A 0x90B5 # -0xE7B9 0x6E3B 0x90E2 # -0xE7BA 0x6E3C 0x90E4 # -0xE7BB 0x6E3D 0x6248 # -0xE7BC 0x6E3E 0x90DB # -0xE7BD 0x6E3F 0x9102 # -0xE7BE 0x6E40 0x9112 # -0xE7BF 0x6E41 0x9119 # -0xE7C0 0x6E42 0x9132 # -0xE7C1 0x6E43 0x9130 # -0xE7C2 0x6E44 0x914A # -0xE7C3 0x6E45 0x9156 # -0xE7C4 0x6E46 0x9158 # -0xE7C5 0x6E47 0x9163 # -0xE7C6 0x6E48 0x9165 # -0xE7C7 0x6E49 0x9169 # -0xE7C8 0x6E4A 0x9173 # -0xE7C9 0x6E4B 0x9172 # -0xE7CA 0x6E4C 0x918B # -0xE7CB 0x6E4D 0x9189 # -0xE7CC 0x6E4E 0x9182 # -0xE7CD 0x6E4F 0x91A2 # -0xE7CE 0x6E50 0x91AB # -0xE7CF 0x6E51 0x91AF # -0xE7D0 0x6E52 0x91AA # -0xE7D1 0x6E53 0x91B5 # -0xE7D2 0x6E54 0x91B4 # -0xE7D3 0x6E55 0x91BA # -0xE7D4 0x6E56 0x91C0 # -0xE7D5 0x6E57 0x91C1 # -0xE7D6 0x6E58 0x91C9 # -0xE7D7 0x6E59 0x91CB # -0xE7D8 0x6E5A 0x91D0 # -0xE7D9 0x6E5B 0x91D6 # -0xE7DA 0x6E5C 0x91DF # -0xE7DB 0x6E5D 0x91E1 # -0xE7DC 0x6E5E 0x91DB # -0xE7DD 0x6E5F 0x91FC # -0xE7DE 0x6E60 0x91F5 # -0xE7DF 0x6E61 0x91F6 # -0xE7E0 0x6E62 0x921E # -0xE7E1 0x6E63 0x91FF # -0xE7E2 0x6E64 0x9214 # -0xE7E3 0x6E65 0x922C # -0xE7E4 0x6E66 0x9215 # -0xE7E5 0x6E67 0x9211 # -0xE7E6 0x6E68 0x925E # -0xE7E7 0x6E69 0x9257 # -0xE7E8 0x6E6A 0x9245 # -0xE7E9 0x6E6B 0x9249 # -0xE7EA 0x6E6C 0x9264 # -0xE7EB 0x6E6D 0x9248 # -0xE7EC 0x6E6E 0x9295 # -0xE7ED 0x6E6F 0x923F # -0xE7EE 0x6E70 0x924B # -0xE7EF 0x6E71 0x9250 # -0xE7F0 0x6E72 0x929C # -0xE7F1 0x6E73 0x9296 # -0xE7F2 0x6E74 0x9293 # -0xE7F3 0x6E75 0x929B # -0xE7F4 0x6E76 0x925A # -0xE7F5 0x6E77 0x92CF # -0xE7F6 0x6E78 0x92B9 # -0xE7F7 0x6E79 0x92B7 # -0xE7F8 0x6E7A 0x92E9 # -0xE7F9 0x6E7B 0x930F # -0xE7FA 0x6E7C 0x92FA # -0xE7FB 0x6E7D 0x9344 # -0xE7FC 0x6E7E 0x932E # -0xE840 0x6F21 0x9319 # -0xE841 0x6F22 0x9322 # -0xE842 0x6F23 0x931A # -0xE843 0x6F24 0x9323 # -0xE844 0x6F25 0x933A # -0xE845 0x6F26 0x9335 # -0xE846 0x6F27 0x933B # -0xE847 0x6F28 0x935C # -0xE848 0x6F29 0x9360 # -0xE849 0x6F2A 0x937C # -0xE84A 0x6F2B 0x936E # -0xE84B 0x6F2C 0x9356 # -0xE84C 0x6F2D 0x93B0 # -0xE84D 0x6F2E 0x93AC # -0xE84E 0x6F2F 0x93AD # -0xE84F 0x6F30 0x9394 # -0xE850 0x6F31 0x93B9 # -0xE851 0x6F32 0x93D6 # -0xE852 0x6F33 0x93D7 # -0xE853 0x6F34 0x93E8 # -0xE854 0x6F35 0x93E5 # -0xE855 0x6F36 0x93D8 # -0xE856 0x6F37 0x93C3 # -0xE857 0x6F38 0x93DD # -0xE858 0x6F39 0x93D0 # -0xE859 0x6F3A 0x93C8 # -0xE85A 0x6F3B 0x93E4 # -0xE85B 0x6F3C 0x941A # -0xE85C 0x6F3D 0x9414 # -0xE85D 0x6F3E 0x9413 # -0xE85E 0x6F3F 0x9403 # -0xE85F 0x6F40 0x9407 # -0xE860 0x6F41 0x9410 # -0xE861 0x6F42 0x9436 # -0xE862 0x6F43 0x942B # -0xE863 0x6F44 0x9435 # -0xE864 0x6F45 0x9421 # -0xE865 0x6F46 0x943A # -0xE866 0x6F47 0x9441 # -0xE867 0x6F48 0x9452 # -0xE868 0x6F49 0x9444 # -0xE869 0x6F4A 0x945B # -0xE86A 0x6F4B 0x9460 # -0xE86B 0x6F4C 0x9462 # -0xE86C 0x6F4D 0x945E # -0xE86D 0x6F4E 0x946A # -0xE86E 0x6F4F 0x9229 # -0xE86F 0x6F50 0x9470 # -0xE870 0x6F51 0x9475 # -0xE871 0x6F52 0x9477 # -0xE872 0x6F53 0x947D # -0xE873 0x6F54 0x945A # -0xE874 0x6F55 0x947C # -0xE875 0x6F56 0x947E # -0xE876 0x6F57 0x9481 # -0xE877 0x6F58 0x947F # -0xE878 0x6F59 0x9582 # -0xE879 0x6F5A 0x9587 # -0xE87A 0x6F5B 0x958A # -0xE87B 0x6F5C 0x9594 # -0xE87C 0x6F5D 0x9596 # -0xE87D 0x6F5E 0x9598 # -0xE87E 0x6F5F 0x9599 # -0xE880 0x6F60 0x95A0 # -0xE881 0x6F61 0x95A8 # -0xE882 0x6F62 0x95A7 # -0xE883 0x6F63 0x95AD # -0xE884 0x6F64 0x95BC # -0xE885 0x6F65 0x95BB # -0xE886 0x6F66 0x95B9 # -0xE887 0x6F67 0x95BE # -0xE888 0x6F68 0x95CA # -0xE889 0x6F69 0x6FF6 # -0xE88A 0x6F6A 0x95C3 # -0xE88B 0x6F6B 0x95CD # -0xE88C 0x6F6C 0x95CC # -0xE88D 0x6F6D 0x95D5 # -0xE88E 0x6F6E 0x95D4 # -0xE88F 0x6F6F 0x95D6 # -0xE890 0x6F70 0x95DC # -0xE891 0x6F71 0x95E1 # -0xE892 0x6F72 0x95E5 # -0xE893 0x6F73 0x95E2 # -0xE894 0x6F74 0x9621 # -0xE895 0x6F75 0x9628 # -0xE896 0x6F76 0x962E # -0xE897 0x6F77 0x962F # -0xE898 0x6F78 0x9642 # -0xE899 0x6F79 0x964C # -0xE89A 0x6F7A 0x964F # -0xE89B 0x6F7B 0x964B # -0xE89C 0x6F7C 0x9677 # -0xE89D 0x6F7D 0x965C # -0xE89E 0x6F7E 0x965E # -0xE89F 0x7021 0x965D # -0xE8A0 0x7022 0x965F # -0xE8A1 0x7023 0x9666 # -0xE8A2 0x7024 0x9672 # -0xE8A3 0x7025 0x966C # -0xE8A4 0x7026 0x968D # -0xE8A5 0x7027 0x9698 # -0xE8A6 0x7028 0x9695 # -0xE8A7 0x7029 0x9697 # -0xE8A8 0x702A 0x96AA # -0xE8A9 0x702B 0x96A7 # -0xE8AA 0x702C 0x96B1 # -0xE8AB 0x702D 0x96B2 # -0xE8AC 0x702E 0x96B0 # -0xE8AD 0x702F 0x96B4 # -0xE8AE 0x7030 0x96B6 # -0xE8AF 0x7031 0x96B8 # -0xE8B0 0x7032 0x96B9 # -0xE8B1 0x7033 0x96CE # -0xE8B2 0x7034 0x96CB # -0xE8B3 0x7035 0x96C9 # -0xE8B4 0x7036 0x96CD # -0xE8B5 0x7037 0x894D # -0xE8B6 0x7038 0x96DC # -0xE8B7 0x7039 0x970D # -0xE8B8 0x703A 0x96D5 # -0xE8B9 0x703B 0x96F9 # -0xE8BA 0x703C 0x9704 # -0xE8BB 0x703D 0x9706 # -0xE8BC 0x703E 0x9708 # -0xE8BD 0x703F 0x9713 # -0xE8BE 0x7040 0x970E # -0xE8BF 0x7041 0x9711 # -0xE8C0 0x7042 0x970F # -0xE8C1 0x7043 0x9716 # -0xE8C2 0x7044 0x9719 # -0xE8C3 0x7045 0x9724 # -0xE8C4 0x7046 0x972A # -0xE8C5 0x7047 0x9730 # -0xE8C6 0x7048 0x9739 # -0xE8C7 0x7049 0x973D # -0xE8C8 0x704A 0x973E # -0xE8C9 0x704B 0x9744 # -0xE8CA 0x704C 0x9746 # -0xE8CB 0x704D 0x9748 # -0xE8CC 0x704E 0x9742 # -0xE8CD 0x704F 0x9749 # -0xE8CE 0x7050 0x975C # -0xE8CF 0x7051 0x9760 # -0xE8D0 0x7052 0x9764 # -0xE8D1 0x7053 0x9766 # -0xE8D2 0x7054 0x9768 # -0xE8D3 0x7055 0x52D2 # -0xE8D4 0x7056 0x976B # -0xE8D5 0x7057 0x9771 # -0xE8D6 0x7058 0x9779 # -0xE8D7 0x7059 0x9785 # -0xE8D8 0x705A 0x977C # -0xE8D9 0x705B 0x9781 # -0xE8DA 0x705C 0x977A # -0xE8DB 0x705D 0x9786 # -0xE8DC 0x705E 0x978B # -0xE8DD 0x705F 0x978F # -0xE8DE 0x7060 0x9790 # -0xE8DF 0x7061 0x979C # -0xE8E0 0x7062 0x97A8 # -0xE8E1 0x7063 0x97A6 # -0xE8E2 0x7064 0x97A3 # -0xE8E3 0x7065 0x97B3 # -0xE8E4 0x7066 0x97B4 # -0xE8E5 0x7067 0x97C3 # -0xE8E6 0x7068 0x97C6 # -0xE8E7 0x7069 0x97C8 # -0xE8E8 0x706A 0x97CB # -0xE8E9 0x706B 0x97DC # -0xE8EA 0x706C 0x97ED # -0xE8EB 0x706D 0x9F4F # -0xE8EC 0x706E 0x97F2 # -0xE8ED 0x706F 0x7ADF # -0xE8EE 0x7070 0x97F6 # -0xE8EF 0x7071 0x97F5 # -0xE8F0 0x7072 0x980F # -0xE8F1 0x7073 0x980C # -0xE8F2 0x7074 0x9838 # -0xE8F3 0x7075 0x9824 # -0xE8F4 0x7076 0x9821 # -0xE8F5 0x7077 0x9837 # -0xE8F6 0x7078 0x983D # -0xE8F7 0x7079 0x9846 # -0xE8F8 0x707A 0x984F # -0xE8F9 0x707B 0x984B # -0xE8FA 0x707C 0x986B # -0xE8FB 0x707D 0x986F # -0xE8FC 0x707E 0x9870 # -0xE940 0x7121 0x9871 # -0xE941 0x7122 0x9874 # -0xE942 0x7123 0x9873 # -0xE943 0x7124 0x98AA # -0xE944 0x7125 0x98AF # -0xE945 0x7126 0x98B1 # -0xE946 0x7127 0x98B6 # -0xE947 0x7128 0x98C4 # -0xE948 0x7129 0x98C3 # -0xE949 0x712A 0x98C6 # -0xE94A 0x712B 0x98E9 # -0xE94B 0x712C 0x98EB # -0xE94C 0x712D 0x9903 # -0xE94D 0x712E 0x9909 # -0xE94E 0x712F 0x9912 # -0xE94F 0x7130 0x9914 # -0xE950 0x7131 0x9918 # -0xE951 0x7132 0x9921 # -0xE952 0x7133 0x991D # -0xE953 0x7134 0x991E # -0xE954 0x7135 0x9924 # -0xE955 0x7136 0x9920 # -0xE956 0x7137 0x992C # -0xE957 0x7138 0x992E # -0xE958 0x7139 0x993D # -0xE959 0x713A 0x993E # -0xE95A 0x713B 0x9942 # -0xE95B 0x713C 0x9949 # -0xE95C 0x713D 0x9945 # -0xE95D 0x713E 0x9950 # -0xE95E 0x713F 0x994B # -0xE95F 0x7140 0x9951 # -0xE960 0x7141 0x9952 # -0xE961 0x7142 0x994C # -0xE962 0x7143 0x9955 # -0xE963 0x7144 0x9997 # -0xE964 0x7145 0x9998 # -0xE965 0x7146 0x99A5 # -0xE966 0x7147 0x99AD # -0xE967 0x7148 0x99AE # -0xE968 0x7149 0x99BC # -0xE969 0x714A 0x99DF # -0xE96A 0x714B 0x99DB # -0xE96B 0x714C 0x99DD # -0xE96C 0x714D 0x99D8 # -0xE96D 0x714E 0x99D1 # -0xE96E 0x714F 0x99ED # -0xE96F 0x7150 0x99EE # -0xE970 0x7151 0x99F1 # -0xE971 0x7152 0x99F2 # -0xE972 0x7153 0x99FB # -0xE973 0x7154 0x99F8 # -0xE974 0x7155 0x9A01 # -0xE975 0x7156 0x9A0F # -0xE976 0x7157 0x9A05 # -0xE977 0x7158 0x99E2 # -0xE978 0x7159 0x9A19 # -0xE979 0x715A 0x9A2B # -0xE97A 0x715B 0x9A37 # -0xE97B 0x715C 0x9A45 # -0xE97C 0x715D 0x9A42 # -0xE97D 0x715E 0x9A40 # -0xE97E 0x715F 0x9A43 # -0xE980 0x7160 0x9A3E # -0xE981 0x7161 0x9A55 # -0xE982 0x7162 0x9A4D # -0xE983 0x7163 0x9A5B # -0xE984 0x7164 0x9A57 # -0xE985 0x7165 0x9A5F # -0xE986 0x7166 0x9A62 # -0xE987 0x7167 0x9A65 # -0xE988 0x7168 0x9A64 # -0xE989 0x7169 0x9A69 # -0xE98A 0x716A 0x9A6B # -0xE98B 0x716B 0x9A6A # -0xE98C 0x716C 0x9AAD # -0xE98D 0x716D 0x9AB0 # -0xE98E 0x716E 0x9ABC # -0xE98F 0x716F 0x9AC0 # -0xE990 0x7170 0x9ACF # -0xE991 0x7171 0x9AD1 # -0xE992 0x7172 0x9AD3 # -0xE993 0x7173 0x9AD4 # -0xE994 0x7174 0x9ADE # -0xE995 0x7175 0x9ADF # -0xE996 0x7176 0x9AE2 # -0xE997 0x7177 0x9AE3 # -0xE998 0x7178 0x9AE6 # -0xE999 0x7179 0x9AEF # -0xE99A 0x717A 0x9AEB # -0xE99B 0x717B 0x9AEE # -0xE99C 0x717C 0x9AF4 # -0xE99D 0x717D 0x9AF1 # -0xE99E 0x717E 0x9AF7 # -0xE99F 0x7221 0x9AFB # -0xE9A0 0x7222 0x9B06 # -0xE9A1 0x7223 0x9B18 # -0xE9A2 0x7224 0x9B1A # -0xE9A3 0x7225 0x9B1F # -0xE9A4 0x7226 0x9B22 # -0xE9A5 0x7227 0x9B23 # -0xE9A6 0x7228 0x9B25 # -0xE9A7 0x7229 0x9B27 # -0xE9A8 0x722A 0x9B28 # -0xE9A9 0x722B 0x9B29 # -0xE9AA 0x722C 0x9B2A # -0xE9AB 0x722D 0x9B2E # -0xE9AC 0x722E 0x9B2F # -0xE9AD 0x722F 0x9B32 # -0xE9AE 0x7230 0x9B44 # -0xE9AF 0x7231 0x9B43 # -0xE9B0 0x7232 0x9B4F # -0xE9B1 0x7233 0x9B4D # -0xE9B2 0x7234 0x9B4E # -0xE9B3 0x7235 0x9B51 # -0xE9B4 0x7236 0x9B58 # -0xE9B5 0x7237 0x9B74 # -0xE9B6 0x7238 0x9B93 # -0xE9B7 0x7239 0x9B83 # -0xE9B8 0x723A 0x9B91 # -0xE9B9 0x723B 0x9B96 # -0xE9BA 0x723C 0x9B97 # -0xE9BB 0x723D 0x9B9F # -0xE9BC 0x723E 0x9BA0 # -0xE9BD 0x723F 0x9BA8 # -0xE9BE 0x7240 0x9BB4 # -0xE9BF 0x7241 0x9BC0 # -0xE9C0 0x7242 0x9BCA # -0xE9C1 0x7243 0x9BB9 # -0xE9C2 0x7244 0x9BC6 # -0xE9C3 0x7245 0x9BCF # -0xE9C4 0x7246 0x9BD1 # -0xE9C5 0x7247 0x9BD2 # -0xE9C6 0x7248 0x9BE3 # -0xE9C7 0x7249 0x9BE2 # -0xE9C8 0x724A 0x9BE4 # -0xE9C9 0x724B 0x9BD4 # -0xE9CA 0x724C 0x9BE1 # -0xE9CB 0x724D 0x9C3A # -0xE9CC 0x724E 0x9BF2 # -0xE9CD 0x724F 0x9BF1 # -0xE9CE 0x7250 0x9BF0 # -0xE9CF 0x7251 0x9C15 # -0xE9D0 0x7252 0x9C14 # -0xE9D1 0x7253 0x9C09 # -0xE9D2 0x7254 0x9C13 # -0xE9D3 0x7255 0x9C0C # -0xE9D4 0x7256 0x9C06 # -0xE9D5 0x7257 0x9C08 # -0xE9D6 0x7258 0x9C12 # -0xE9D7 0x7259 0x9C0A # -0xE9D8 0x725A 0x9C04 # -0xE9D9 0x725B 0x9C2E # -0xE9DA 0x725C 0x9C1B # -0xE9DB 0x725D 0x9C25 # -0xE9DC 0x725E 0x9C24 # -0xE9DD 0x725F 0x9C21 # -0xE9DE 0x7260 0x9C30 # -0xE9DF 0x7261 0x9C47 # -0xE9E0 0x7262 0x9C32 # -0xE9E1 0x7263 0x9C46 # -0xE9E2 0x7264 0x9C3E # -0xE9E3 0x7265 0x9C5A # -0xE9E4 0x7266 0x9C60 # -0xE9E5 0x7267 0x9C67 # -0xE9E6 0x7268 0x9C76 # -0xE9E7 0x7269 0x9C78 # -0xE9E8 0x726A 0x9CE7 # -0xE9E9 0x726B 0x9CEC # -0xE9EA 0x726C 0x9CF0 # -0xE9EB 0x726D 0x9D09 # -0xE9EC 0x726E 0x9D08 # -0xE9ED 0x726F 0x9CEB # -0xE9EE 0x7270 0x9D03 # -0xE9EF 0x7271 0x9D06 # -0xE9F0 0x7272 0x9D2A # -0xE9F1 0x7273 0x9D26 # -0xE9F2 0x7274 0x9DAF # -0xE9F3 0x7275 0x9D23 # -0xE9F4 0x7276 0x9D1F # -0xE9F5 0x7277 0x9D44 # -0xE9F6 0x7278 0x9D15 # -0xE9F7 0x7279 0x9D12 # -0xE9F8 0x727A 0x9D41 # -0xE9F9 0x727B 0x9D3F # -0xE9FA 0x727C 0x9D3E # -0xE9FB 0x727D 0x9D46 # -0xE9FC 0x727E 0x9D48 # -0xEA40 0x7321 0x9D5D # -0xEA41 0x7322 0x9D5E # -0xEA42 0x7323 0x9D64 # -0xEA43 0x7324 0x9D51 # -0xEA44 0x7325 0x9D50 # -0xEA45 0x7326 0x9D59 # -0xEA46 0x7327 0x9D72 # -0xEA47 0x7328 0x9D89 # -0xEA48 0x7329 0x9D87 # -0xEA49 0x732A 0x9DAB # -0xEA4A 0x732B 0x9D6F # -0xEA4B 0x732C 0x9D7A # -0xEA4C 0x732D 0x9D9A # -0xEA4D 0x732E 0x9DA4 # -0xEA4E 0x732F 0x9DA9 # -0xEA4F 0x7330 0x9DB2 # -0xEA50 0x7331 0x9DC4 # -0xEA51 0x7332 0x9DC1 # -0xEA52 0x7333 0x9DBB # -0xEA53 0x7334 0x9DB8 # -0xEA54 0x7335 0x9DBA # -0xEA55 0x7336 0x9DC6 # -0xEA56 0x7337 0x9DCF # -0xEA57 0x7338 0x9DC2 # -0xEA58 0x7339 0x9DD9 # -0xEA59 0x733A 0x9DD3 # -0xEA5A 0x733B 0x9DF8 # -0xEA5B 0x733C 0x9DE6 # -0xEA5C 0x733D 0x9DED # -0xEA5D 0x733E 0x9DEF # -0xEA5E 0x733F 0x9DFD # -0xEA5F 0x7340 0x9E1A # -0xEA60 0x7341 0x9E1B # -0xEA61 0x7342 0x9E1E # -0xEA62 0x7343 0x9E75 # -0xEA63 0x7344 0x9E79 # -0xEA64 0x7345 0x9E7D # -0xEA65 0x7346 0x9E81 # -0xEA66 0x7347 0x9E88 # -0xEA67 0x7348 0x9E8B # -0xEA68 0x7349 0x9E8C # -0xEA69 0x734A 0x9E92 # -0xEA6A 0x734B 0x9E95 # -0xEA6B 0x734C 0x9E91 # -0xEA6C 0x734D 0x9E9D # -0xEA6D 0x734E 0x9EA5 # -0xEA6E 0x734F 0x9EA9 # -0xEA6F 0x7350 0x9EB8 # -0xEA70 0x7351 0x9EAA # -0xEA71 0x7352 0x9EAD # -0xEA72 0x7353 0x9761 # -0xEA73 0x7354 0x9ECC # -0xEA74 0x7355 0x9ECE # -0xEA75 0x7356 0x9ECF # -0xEA76 0x7357 0x9ED0 # -0xEA77 0x7358 0x9ED4 # -0xEA78 0x7359 0x9EDC # -0xEA79 0x735A 0x9EDE # -0xEA7A 0x735B 0x9EDD # -0xEA7B 0x735C 0x9EE0 # -0xEA7C 0x735D 0x9EE5 # -0xEA7D 0x735E 0x9EE8 # -0xEA7E 0x735F 0x9EEF # -0xEA80 0x7360 0x9EF4 # -0xEA81 0x7361 0x9EF6 # -0xEA82 0x7362 0x9EF7 # -0xEA83 0x7363 0x9EF9 # -0xEA84 0x7364 0x9EFB # -0xEA85 0x7365 0x9EFC # -0xEA86 0x7366 0x9EFD # -0xEA87 0x7367 0x9F07 # -0xEA88 0x7368 0x9F08 # -0xEA89 0x7369 0x76B7 # -0xEA8A 0x736A 0x9F15 # -0xEA8B 0x736B 0x9F21 # -0xEA8C 0x736C 0x9F2C # -0xEA8D 0x736D 0x9F3E # -0xEA8E 0x736E 0x9F4A # -0xEA8F 0x736F 0x9F52 # -0xEA90 0x7370 0x9F54 # -0xEA91 0x7371 0x9F63 # -0xEA92 0x7372 0x9F5F # -0xEA93 0x7373 0x9F60 # -0xEA94 0x7374 0x9F61 # -0xEA95 0x7375 0x9F66 # -0xEA96 0x7376 0x9F67 # -0xEA97 0x7377 0x9F6C # -0xEA98 0x7378 0x9F6A # -0xEA99 0x7379 0x9F77 # -0xEA9A 0x737A 0x9F72 # -0xEA9B 0x737B 0x9F76 # -0xEA9C 0x737C 0x9F95 # -0xEA9D 0x737D 0x9F9C # -0xEA9E 0x737E 0x9FA0 # -0xEA9F 0x7421 0x582F # -0xEAA0 0x7422 0x69C7 # -0xEAA1 0x7423 0x9059 # -0xEAA2 0x7424 0x7464 # -0xEAA3 0x7425 0x51DC # -0xEAA4 0x7426 0x7199 # diff --git a/Tools/unicode/python-mappings/JIS0212.TXT b/Tools/unicode/python-mappings/JIS0212.TXT deleted file mode 100644 index ae35ecacdc2b0..0000000000000 --- a/Tools/unicode/python-mappings/JIS0212.TXT +++ /dev/null @@ -1,6144 +0,0 @@ -# JIS0212.TXT -# Date: 2015-12-02 23:51:00 GMT [KW] -# ? 2015 Unicode?, Inc. -# For terms of use, see http://www.unicode.org/terms_of_use.html -# -# Name: JIS X 0212 (1990) to Unicode -# Unicode version: 1.1 -# Table version: 2.0 -# Table format: Format A -# Date: 2011 October 14 (header updated: 2015 December 02) -# -# General notes: -# -# -# This table contains one set of mappings from JIS X 0212 into Unicode. -# Note that these data are *possible* mappings only and may not be the -# same as those used by actual products, nor may they be the best suited -# for all uses. For more information on the mappings between various code -# pages incorporating the repertoire of JIS X 0212 and Unicode, consult the -# VENDORS mapping data. -# -# -# Format: Three tab-separated columns -# Column #1 is the JIS X 0212 code (in hex as 0xXXXX) -# Column #2 is the Unicode (in hex as 0xXXXX) -# Column #3 the Unicode name (follows a comment sign, '#') -# The official names for Unicode characters U+4E00 -# to U+9FA5, inclusive, is "CJK UNIFIED IDEOGRAPH-XXXX", -# where XXXX is the code point. Including all these -# names in this file increases its size substantially -# and needlessly. The token "" is used for the -# name of these characters. If necessary, it can be -# expanded algorithmically by a parser or editor. -# -# The entries are in JIS X 0212 order -# -# The following algorithms can be used to change the hex form -# of JIS 0212 to other standard forms: -# -# To change hex to EUC form, add 0x8080 -# To change hex to kuten form, first subtract 0x2020. Then -# the high and low bytes correspond to the ku and ten of -# the kuten form. For example, 0x2121 -> 0x0101 -> 0101; -# 0x6D63 -> 0x4D43 -> 7767 -# -# Notes: -# -# 1. JIS X 0212 apparently unified the following two symbols -# into a single character at 0x2922: -# -# LATIN CAPITAL LETTER D WITH STROKE -# LATIN CAPITAL LETTER ETH -# -# However, JIS X 0212 maintains the distinction between -# the lowercase forms of these two elements at 0x2942 and 0x2943. -# Given the structre of these JIS encodings, it is clear that -# 0x2922 and 0x2942 are intended to be a capital/small pair. -# Consequently, in the Unicode mapping, 0x2922 is treated as -# LATIN CAPITAL LETTER D WITH STROKE. -# -# Revision History: -# -# [v2.0, 2015 December 02] -# updates to copyright notice and terms of use -# no changes to character mappings -# -# [v1.0, 2011 October 14] -# Updated terms of use to current wording. -# Updated contact information. -# No changes to the mapping data. -# -# [v0.9, 8 March 1994] -# First release. -# -# Use the Unicode reporting form -# for any questions or comments or to report errors in the data. -# -0x222F 0x02D8 # BREVE -0x2230 0x02C7 # CARON (Mandarin Chinese third tone) -0x2231 0x00B8 # CEDILLA -0x2232 0x02D9 # DOT ABOVE (Mandarin Chinese light tone) -0x2233 0x02DD # DOUBLE ACUTE ACCENT -0x2234 0x00AF # MACRON -0x2235 0x02DB # OGONEK -0x2236 0x02DA # RING ABOVE -0x2237 0x007E # TILDE -0x2238 0x0384 # GREEK TONOS -0x2239 0x0385 # GREEK DIALYTIKA TONOS -0x2242 0x00A1 # INVERTED EXCLAMATION MARK -0x2243 0x00A6 # BROKEN BAR -0x2244 0x00BF # INVERTED QUESTION MARK -0x226B 0x00BA # MASCULINE ORDINAL INDICATOR -0x226C 0x00AA # FEMININE ORDINAL INDICATOR -0x226D 0x00A9 # COPYRIGHT SIGN -0x226E 0x00AE # REGISTERED SIGN -0x226F 0x2122 # TRADE MARK SIGN -0x2270 0x00A4 # CURRENCY SIGN -0x2271 0x2116 # NUMERO SIGN -0x2661 0x0386 # GREEK CAPITAL LETTER ALPHA WITH TONOS -0x2662 0x0388 # GREEK CAPITAL LETTER EPSILON WITH TONOS -0x2663 0x0389 # GREEK CAPITAL LETTER ETA WITH TONOS -0x2664 0x038A # GREEK CAPITAL LETTER IOTA WITH TONOS -0x2665 0x03AA # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA -0x2667 0x038C # GREEK CAPITAL LETTER OMICRON WITH TONOS -0x2669 0x038E # GREEK CAPITAL LETTER UPSILON WITH TONOS -0x266A 0x03AB # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA -0x266C 0x038F # GREEK CAPITAL LETTER OMEGA WITH TONOS -0x2671 0x03AC # GREEK SMALL LETTER ALPHA WITH TONOS -0x2672 0x03AD # GREEK SMALL LETTER EPSILON WITH TONOS -0x2673 0x03AE # GREEK SMALL LETTER ETA WITH TONOS -0x2674 0x03AF # GREEK SMALL LETTER IOTA WITH TONOS -0x2675 0x03CA # GREEK SMALL LETTER IOTA WITH DIALYTIKA -0x2676 0x0390 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS -0x2677 0x03CC # GREEK SMALL LETTER OMICRON WITH TONOS -0x2678 0x03C2 # GREEK SMALL LETTER FINAL SIGMA -0x2679 0x03CD # GREEK SMALL LETTER UPSILON WITH TONOS -0x267A 0x03CB # GREEK SMALL LETTER UPSILON WITH DIALYTIKA -0x267B 0x03B0 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS -0x267C 0x03CE # GREEK SMALL LETTER OMEGA WITH TONOS -0x2742 0x0402 # CYRILLIC CAPITAL LETTER DJE -0x2743 0x0403 # CYRILLIC CAPITAL LETTER GJE -0x2744 0x0404 # CYRILLIC CAPITAL LETTER UKRAINIAN IE -0x2745 0x0405 # CYRILLIC CAPITAL LETTER DZE -0x2746 0x0406 # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I -0x2747 0x0407 # CYRILLIC CAPITAL LETTER YI -0x2748 0x0408 # CYRILLIC CAPITAL LETTER JE -0x2749 0x0409 # CYRILLIC CAPITAL LETTER LJE -0x274A 0x040A # CYRILLIC CAPITAL LETTER NJE -0x274B 0x040B # CYRILLIC CAPITAL LETTER TSHE -0x274C 0x040C # CYRILLIC CAPITAL LETTER KJE -0x274D 0x040E # CYRILLIC CAPITAL LETTER SHORT U -0x274E 0x040F # CYRILLIC CAPITAL LETTER DZHE -0x2772 0x0452 # CYRILLIC SMALL LETTER DJE -0x2773 0x0453 # CYRILLIC SMALL LETTER GJE -0x2774 0x0454 # CYRILLIC SMALL LETTER UKRAINIAN IE -0x2775 0x0455 # CYRILLIC SMALL LETTER DZE -0x2776 0x0456 # CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I -0x2777 0x0457 # CYRILLIC SMALL LETTER YI -0x2778 0x0458 # CYRILLIC SMALL LETTER JE -0x2779 0x0459 # CYRILLIC SMALL LETTER LJE -0x277A 0x045A # CYRILLIC SMALL LETTER NJE -0x277B 0x045B # CYRILLIC SMALL LETTER TSHE -0x277C 0x045C # CYRILLIC SMALL LETTER KJE -0x277D 0x045E # CYRILLIC SMALL LETTER SHORT U -0x277E 0x045F # CYRILLIC SMALL LETTER DZHE -0x2921 0x00C6 # LATIN CAPITAL LIGATURE AE -0x2922 0x0110 # LATIN CAPITAL LETTER D WITH STROKE -0x2924 0x0126 # LATIN CAPITAL LETTER H WITH STROKE -0x2926 0x0132 # LATIN CAPITAL LIGATURE IJ -0x2928 0x0141 # LATIN CAPITAL LETTER L WITH STROKE -0x2929 0x013F # LATIN CAPITAL LETTER L WITH MIDDLE DOT -0x292B 0x014A # LATIN CAPITAL LETTER ENG -0x292C 0x00D8 # LATIN CAPITAL LETTER O WITH STROKE -0x292D 0x0152 # LATIN CAPITAL LIGATURE OE -0x292F 0x0166 # LATIN CAPITAL LETTER T WITH STROKE -0x2930 0x00DE # LATIN CAPITAL LETTER THORN -0x2941 0x00E6 # LATIN SMALL LIGATURE AE -0x2942 0x0111 # LATIN SMALL LETTER D WITH STROKE -0x2943 0x00F0 # LATIN SMALL LETTER ETH -0x2944 0x0127 # LATIN SMALL LETTER H WITH STROKE -0x2945 0x0131 # LATIN SMALL LETTER DOTLESS I -0x2946 0x0133 # LATIN SMALL LIGATURE IJ -0x2947 0x0138 # LATIN SMALL LETTER KRA -0x2948 0x0142 # LATIN SMALL LETTER L WITH STROKE -0x2949 0x0140 # LATIN SMALL LETTER L WITH MIDDLE DOT -0x294A 0x0149 # LATIN SMALL LETTER N PRECEDED BY APOSTROPHE -0x294B 0x014B # LATIN SMALL LETTER ENG -0x294C 0x00F8 # LATIN SMALL LETTER O WITH STROKE -0x294D 0x0153 # LATIN SMALL LIGATURE OE -0x294E 0x00DF # LATIN SMALL LETTER SHARP S -0x294F 0x0167 # LATIN SMALL LETTER T WITH STROKE -0x2950 0x00FE # LATIN SMALL LETTER THORN -0x2A21 0x00C1 # LATIN CAPITAL LETTER A WITH ACUTE -0x2A22 0x00C0 # LATIN CAPITAL LETTER A WITH GRAVE -0x2A23 0x00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS -0x2A24 0x00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX -0x2A25 0x0102 # LATIN CAPITAL LETTER A WITH BREVE -0x2A26 0x01CD # LATIN CAPITAL LETTER A WITH CARON -0x2A27 0x0100 # LATIN CAPITAL LETTER A WITH MACRON -0x2A28 0x0104 # LATIN CAPITAL LETTER A WITH OGONEK -0x2A29 0x00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE -0x2A2A 0x00C3 # LATIN CAPITAL LETTER A WITH TILDE -0x2A2B 0x0106 # LATIN CAPITAL LETTER C WITH ACUTE -0x2A2C 0x0108 # LATIN CAPITAL LETTER C WITH CIRCUMFLEX -0x2A2D 0x010C # LATIN CAPITAL LETTER C WITH CARON -0x2A2E 0x00C7 # LATIN CAPITAL LETTER C WITH CEDILLA -0x2A2F 0x010A # LATIN CAPITAL LETTER C WITH DOT ABOVE -0x2A30 0x010E # LATIN CAPITAL LETTER D WITH CARON -0x2A31 0x00C9 # LATIN CAPITAL LETTER E WITH ACUTE -0x2A32 0x00C8 # LATIN CAPITAL LETTER E WITH GRAVE -0x2A33 0x00CB # LATIN CAPITAL LETTER E WITH DIAERESIS -0x2A34 0x00CA # LATIN CAPITAL LETTER E WITH CIRCUMFLEX -0x2A35 0x011A # LATIN CAPITAL LETTER E WITH CARON -0x2A36 0x0116 # LATIN CAPITAL LETTER E WITH DOT ABOVE -0x2A37 0x0112 # LATIN CAPITAL LETTER E WITH MACRON -0x2A38 0x0118 # LATIN CAPITAL LETTER E WITH OGONEK -0x2A3A 0x011C # LATIN CAPITAL LETTER G WITH CIRCUMFLEX -0x2A3B 0x011E # LATIN CAPITAL LETTER G WITH BREVE -0x2A3C 0x0122 # LATIN CAPITAL LETTER G WITH CEDILLA -0x2A3D 0x0120 # LATIN CAPITAL LETTER G WITH DOT ABOVE -0x2A3E 0x0124 # LATIN CAPITAL LETTER H WITH CIRCUMFLEX -0x2A3F 0x00CD # LATIN CAPITAL LETTER I WITH ACUTE -0x2A40 0x00CC # LATIN CAPITAL LETTER I WITH GRAVE -0x2A41 0x00CF # LATIN CAPITAL LETTER I WITH DIAERESIS -0x2A42 0x00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX -0x2A43 0x01CF # LATIN CAPITAL LETTER I WITH CARON -0x2A44 0x0130 # LATIN CAPITAL LETTER I WITH DOT ABOVE -0x2A45 0x012A # LATIN CAPITAL LETTER I WITH MACRON -0x2A46 0x012E # LATIN CAPITAL LETTER I WITH OGONEK -0x2A47 0x0128 # LATIN CAPITAL LETTER I WITH TILDE -0x2A48 0x0134 # LATIN CAPITAL LETTER J WITH CIRCUMFLEX -0x2A49 0x0136 # LATIN CAPITAL LETTER K WITH CEDILLA -0x2A4A 0x0139 # LATIN CAPITAL LETTER L WITH ACUTE -0x2A4B 0x013D # LATIN CAPITAL LETTER L WITH CARON -0x2A4C 0x013B # LATIN CAPITAL LETTER L WITH CEDILLA -0x2A4D 0x0143 # LATIN CAPITAL LETTER N WITH ACUTE -0x2A4E 0x0147 # LATIN CAPITAL LETTER N WITH CARON -0x2A4F 0x0145 # LATIN CAPITAL LETTER N WITH CEDILLA -0x2A50 0x00D1 # LATIN CAPITAL LETTER N WITH TILDE -0x2A51 0x00D3 # LATIN CAPITAL LETTER O WITH ACUTE -0x2A52 0x00D2 # LATIN CAPITAL LETTER O WITH GRAVE -0x2A53 0x00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS -0x2A54 0x00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX -0x2A55 0x01D1 # LATIN CAPITAL LETTER O WITH CARON -0x2A56 0x0150 # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE -0x2A57 0x014C # LATIN CAPITAL LETTER O WITH MACRON -0x2A58 0x00D5 # LATIN CAPITAL LETTER O WITH TILDE -0x2A59 0x0154 # LATIN CAPITAL LETTER R WITH ACUTE -0x2A5A 0x0158 # LATIN CAPITAL LETTER R WITH CARON -0x2A5B 0x0156 # LATIN CAPITAL LETTER R WITH CEDILLA -0x2A5C 0x015A # LATIN CAPITAL LETTER S WITH ACUTE -0x2A5D 0x015C # LATIN CAPITAL LETTER S WITH CIRCUMFLEX -0x2A5E 0x0160 # LATIN CAPITAL LETTER S WITH CARON -0x2A5F 0x015E # LATIN CAPITAL LETTER S WITH CEDILLA -0x2A60 0x0164 # LATIN CAPITAL LETTER T WITH CARON -0x2A61 0x0162 # LATIN CAPITAL LETTER T WITH CEDILLA -0x2A62 0x00DA # LATIN CAPITAL LETTER U WITH ACUTE -0x2A63 0x00D9 # LATIN CAPITAL LETTER U WITH GRAVE -0x2A64 0x00DC # LATIN CAPITAL LETTER U WITH DIAERESIS -0x2A65 0x00DB # LATIN CAPITAL LETTER U WITH CIRCUMFLEX -0x2A66 0x016C # LATIN CAPITAL LETTER U WITH BREVE -0x2A67 0x01D3 # LATIN CAPITAL LETTER U WITH CARON -0x2A68 0x0170 # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE -0x2A69 0x016A # LATIN CAPITAL LETTER U WITH MACRON -0x2A6A 0x0172 # LATIN CAPITAL LETTER U WITH OGONEK -0x2A6B 0x016E # LATIN CAPITAL LETTER U WITH RING ABOVE -0x2A6C 0x0168 # LATIN CAPITAL LETTER U WITH TILDE -0x2A6D 0x01D7 # LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE -0x2A6E 0x01DB # LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE -0x2A6F 0x01D9 # LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON -0x2A70 0x01D5 # LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON -0x2A71 0x0174 # LATIN CAPITAL LETTER W WITH CIRCUMFLEX -0x2A72 0x00DD # LATIN CAPITAL LETTER Y WITH ACUTE -0x2A73 0x0178 # LATIN CAPITAL LETTER Y WITH DIAERESIS -0x2A74 0x0176 # LATIN CAPITAL LETTER Y WITH CIRCUMFLEX -0x2A75 0x0179 # LATIN CAPITAL LETTER Z WITH ACUTE -0x2A76 0x017D # LATIN CAPITAL LETTER Z WITH CARON -0x2A77 0x017B # LATIN CAPITAL LETTER Z WITH DOT ABOVE -0x2B21 0x00E1 # LATIN SMALL LETTER A WITH ACUTE -0x2B22 0x00E0 # LATIN SMALL LETTER A WITH GRAVE -0x2B23 0x00E4 # LATIN SMALL LETTER A WITH DIAERESIS -0x2B24 0x00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX -0x2B25 0x0103 # LATIN SMALL LETTER A WITH BREVE -0x2B26 0x01CE # LATIN SMALL LETTER A WITH CARON -0x2B27 0x0101 # LATIN SMALL LETTER A WITH MACRON -0x2B28 0x0105 # LATIN SMALL LETTER A WITH OGONEK -0x2B29 0x00E5 # LATIN SMALL LETTER A WITH RING ABOVE -0x2B2A 0x00E3 # LATIN SMALL LETTER A WITH TILDE -0x2B2B 0x0107 # LATIN SMALL LETTER C WITH ACUTE -0x2B2C 0x0109 # LATIN SMALL LETTER C WITH CIRCUMFLEX -0x2B2D 0x010D # LATIN SMALL LETTER C WITH CARON -0x2B2E 0x00E7 # LATIN SMALL LETTER C WITH CEDILLA -0x2B2F 0x010B # LATIN SMALL LETTER C WITH DOT ABOVE -0x2B30 0x010F # LATIN SMALL LETTER D WITH CARON -0x2B31 0x00E9 # LATIN SMALL LETTER E WITH ACUTE -0x2B32 0x00E8 # LATIN SMALL LETTER E WITH GRAVE -0x2B33 0x00EB # LATIN SMALL LETTER E WITH DIAERESIS -0x2B34 0x00EA # LATIN SMALL LETTER E WITH CIRCUMFLEX -0x2B35 0x011B # LATIN SMALL LETTER E WITH CARON -0x2B36 0x0117 # LATIN SMALL LETTER E WITH DOT ABOVE -0x2B37 0x0113 # LATIN SMALL LETTER E WITH MACRON -0x2B38 0x0119 # LATIN SMALL LETTER E WITH OGONEK -0x2B39 0x01F5 # LATIN SMALL LETTER G WITH ACUTE -0x2B3A 0x011D # LATIN SMALL LETTER G WITH CIRCUMFLEX -0x2B3B 0x011F # LATIN SMALL LETTER G WITH BREVE -0x2B3D 0x0121 # LATIN SMALL LETTER G WITH DOT ABOVE -0x2B3E 0x0125 # LATIN SMALL LETTER H WITH CIRCUMFLEX -0x2B3F 0x00ED # LATIN SMALL LETTER I WITH ACUTE -0x2B40 0x00EC # LATIN SMALL LETTER I WITH GRAVE -0x2B41 0x00EF # LATIN SMALL LETTER I WITH DIAERESIS -0x2B42 0x00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX -0x2B43 0x01D0 # LATIN SMALL LETTER I WITH CARON -0x2B45 0x012B # LATIN SMALL LETTER I WITH MACRON -0x2B46 0x012F # LATIN SMALL LETTER I WITH OGONEK -0x2B47 0x0129 # LATIN SMALL LETTER I WITH TILDE -0x2B48 0x0135 # LATIN SMALL LETTER J WITH CIRCUMFLEX -0x2B49 0x0137 # LATIN SMALL LETTER K WITH CEDILLA -0x2B4A 0x013A # LATIN SMALL LETTER L WITH ACUTE -0x2B4B 0x013E # LATIN SMALL LETTER L WITH CARON -0x2B4C 0x013C # LATIN SMALL LETTER L WITH CEDILLA -0x2B4D 0x0144 # LATIN SMALL LETTER N WITH ACUTE -0x2B4E 0x0148 # LATIN SMALL LETTER N WITH CARON -0x2B4F 0x0146 # LATIN SMALL LETTER N WITH CEDILLA -0x2B50 0x00F1 # LATIN SMALL LETTER N WITH TILDE -0x2B51 0x00F3 # LATIN SMALL LETTER O WITH ACUTE -0x2B52 0x00F2 # LATIN SMALL LETTER O WITH GRAVE -0x2B53 0x00F6 # LATIN SMALL LETTER O WITH DIAERESIS -0x2B54 0x00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX -0x2B55 0x01D2 # LATIN SMALL LETTER O WITH CARON -0x2B56 0x0151 # LATIN SMALL LETTER O WITH DOUBLE ACUTE -0x2B57 0x014D # LATIN SMALL LETTER O WITH MACRON -0x2B58 0x00F5 # LATIN SMALL LETTER O WITH TILDE -0x2B59 0x0155 # LATIN SMALL LETTER R WITH ACUTE -0x2B5A 0x0159 # LATIN SMALL LETTER R WITH CARON -0x2B5B 0x0157 # LATIN SMALL LETTER R WITH CEDILLA -0x2B5C 0x015B # LATIN SMALL LETTER S WITH ACUTE -0x2B5D 0x015D # LATIN SMALL LETTER S WITH CIRCUMFLEX -0x2B5E 0x0161 # LATIN SMALL LETTER S WITH CARON -0x2B5F 0x015F # LATIN SMALL LETTER S WITH CEDILLA -0x2B60 0x0165 # LATIN SMALL LETTER T WITH CARON -0x2B61 0x0163 # LATIN SMALL LETTER T WITH CEDILLA -0x2B62 0x00FA # LATIN SMALL LETTER U WITH ACUTE -0x2B63 0x00F9 # LATIN SMALL LETTER U WITH GRAVE -0x2B64 0x00FC # LATIN SMALL LETTER U WITH DIAERESIS -0x2B65 0x00FB # LATIN SMALL LETTER U WITH CIRCUMFLEX -0x2B66 0x016D # LATIN SMALL LETTER U WITH BREVE -0x2B67 0x01D4 # LATIN SMALL LETTER U WITH CARON -0x2B68 0x0171 # LATIN SMALL LETTER U WITH DOUBLE ACUTE -0x2B69 0x016B # LATIN SMALL LETTER U WITH MACRON -0x2B6A 0x0173 # LATIN SMALL LETTER U WITH OGONEK -0x2B6B 0x016F # LATIN SMALL LETTER U WITH RING ABOVE -0x2B6C 0x0169 # LATIN SMALL LETTER U WITH TILDE -0x2B6D 0x01D8 # LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE -0x2B6E 0x01DC # LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE -0x2B6F 0x01DA # LATIN SMALL LETTER U WITH DIAERESIS AND CARON -0x2B70 0x01D6 # LATIN SMALL LETTER U WITH DIAERESIS AND MACRON -0x2B71 0x0175 # LATIN SMALL LETTER W WITH CIRCUMFLEX -0x2B72 0x00FD # LATIN SMALL LETTER Y WITH ACUTE -0x2B73 0x00FF # LATIN SMALL LETTER Y WITH DIAERESIS -0x2B74 0x0177 # LATIN SMALL LETTER Y WITH CIRCUMFLEX -0x2B75 0x017A # LATIN SMALL LETTER Z WITH ACUTE -0x2B76 0x017E # LATIN SMALL LETTER Z WITH CARON -0x2B77 0x017C # LATIN SMALL LETTER Z WITH DOT ABOVE -0x3021 0x4E02 # -0x3022 0x4E04 # -0x3023 0x4E05 # -0x3024 0x4E0C # -0x3025 0x4E12 # -0x3026 0x4E1F # -0x3027 0x4E23 # -0x3028 0x4E24 # -0x3029 0x4E28 # -0x302A 0x4E2B # -0x302B 0x4E2E # -0x302C 0x4E2F # -0x302D 0x4E30 # -0x302E 0x4E35 # -0x302F 0x4E40 # -0x3030 0x4E41 # -0x3031 0x4E44 # -0x3032 0x4E47 # -0x3033 0x4E51 # -0x3034 0x4E5A # -0x3035 0x4E5C # -0x3036 0x4E63 # -0x3037 0x4E68 # -0x3038 0x4E69 # -0x3039 0x4E74 # -0x303A 0x4E75 # -0x303B 0x4E79 # -0x303C 0x4E7F # -0x303D 0x4E8D # -0x303E 0x4E96 # -0x303F 0x4E97 # -0x3040 0x4E9D # -0x3041 0x4EAF # -0x3042 0x4EB9 # -0x3043 0x4EC3 # -0x3044 0x4ED0 # -0x3045 0x4EDA # -0x3046 0x4EDB # -0x3047 0x4EE0 # -0x3048 0x4EE1 # -0x3049 0x4EE2 # -0x304A 0x4EE8 # -0x304B 0x4EEF # -0x304C 0x4EF1 # -0x304D 0x4EF3 # -0x304E 0x4EF5 # -0x304F 0x4EFD # -0x3050 0x4EFE # -0x3051 0x4EFF # -0x3052 0x4F00 # -0x3053 0x4F02 # -0x3054 0x4F03 # -0x3055 0x4F08 # -0x3056 0x4F0B # -0x3057 0x4F0C # -0x3058 0x4F12 # -0x3059 0x4F15 # -0x305A 0x4F16 # -0x305B 0x4F17 # -0x305C 0x4F19 # -0x305D 0x4F2E # -0x305E 0x4F31 # -0x305F 0x4F60 # -0x3060 0x4F33 # -0x3061 0x4F35 # -0x3062 0x4F37 # -0x3063 0x4F39 # -0x3064 0x4F3B # -0x3065 0x4F3E # -0x3066 0x4F40 # -0x3067 0x4F42 # -0x3068 0x4F48 # -0x3069 0x4F49 # -0x306A 0x4F4B # -0x306B 0x4F4C # -0x306C 0x4F52 # -0x306D 0x4F54 # -0x306E 0x4F56 # -0x306F 0x4F58 # -0x3070 0x4F5F # -0x3071 0x4F63 # -0x3072 0x4F6A # -0x3073 0x4F6C # -0x3074 0x4F6E # -0x3075 0x4F71 # -0x3076 0x4F77 # -0x3077 0x4F78 # -0x3078 0x4F79 # -0x3079 0x4F7A # -0x307A 0x4F7D # -0x307B 0x4F7E # -0x307C 0x4F81 # -0x307D 0x4F82 # -0x307E 0x4F84 # -0x3121 0x4F85 # -0x3122 0x4F89 # -0x3123 0x4F8A # -0x3124 0x4F8C # -0x3125 0x4F8E # -0x3126 0x4F90 # -0x3127 0x4F92 # -0x3128 0x4F93 # -0x3129 0x4F94 # -0x312A 0x4F97 # -0x312B 0x4F99 # -0x312C 0x4F9A # -0x312D 0x4F9E # -0x312E 0x4F9F # -0x312F 0x4FB2 # -0x3130 0x4FB7 # -0x3131 0x4FB9 # -0x3132 0x4FBB # -0x3133 0x4FBC # -0x3134 0x4FBD # -0x3135 0x4FBE # -0x3136 0x4FC0 # -0x3137 0x4FC1 # -0x3138 0x4FC5 # -0x3139 0x4FC6 # -0x313A 0x4FC8 # -0x313B 0x4FC9 # -0x313C 0x4FCB # -0x313D 0x4FCC # -0x313E 0x4FCD # -0x313F 0x4FCF # -0x3140 0x4FD2 # -0x3141 0x4FDC # -0x3142 0x4FE0 # -0x3143 0x4FE2 # -0x3144 0x4FF0 # -0x3145 0x4FF2 # -0x3146 0x4FFC # -0x3147 0x4FFD # -0x3148 0x4FFF # -0x3149 0x5000 # -0x314A 0x5001 # -0x314B 0x5004 # -0x314C 0x5007 # -0x314D 0x500A # -0x314E 0x500C # -0x314F 0x500E # -0x3150 0x5010 # -0x3151 0x5013 # -0x3152 0x5017 # -0x3153 0x5018 # -0x3154 0x501B # -0x3155 0x501C # -0x3156 0x501D # -0x3157 0x501E # -0x3158 0x5022 # -0x3159 0x5027 # -0x315A 0x502E # -0x315B 0x5030 # -0x315C 0x5032 # -0x315D 0x5033 # -0x315E 0x5035 # -0x315F 0x5040 # -0x3160 0x5041 # -0x3161 0x5042 # -0x3162 0x5045 # -0x3163 0x5046 # -0x3164 0x504A # -0x3165 0x504C # -0x3166 0x504E # -0x3167 0x5051 # -0x3168 0x5052 # -0x3169 0x5053 # -0x316A 0x5057 # -0x316B 0x5059 # -0x316C 0x505F # -0x316D 0x5060 # -0x316E 0x5062 # -0x316F 0x5063 # -0x3170 0x5066 # -0x3171 0x5067 # -0x3172 0x506A # -0x3173 0x506D # -0x3174 0x5070 # -0x3175 0x5071 # -0x3176 0x503B # -0x3177 0x5081 # -0x3178 0x5083 # -0x3179 0x5084 # -0x317A 0x5086 # -0x317B 0x508A # -0x317C 0x508E # -0x317D 0x508F # -0x317E 0x5090 # -0x3221 0x5092 # -0x3222 0x5093 # -0x3223 0x5094 # -0x3224 0x5096 # -0x3225 0x509B # -0x3226 0x509C # -0x3227 0x509E # -0x3228 0x509F # -0x3229 0x50A0 # -0x322A 0x50A1 # -0x322B 0x50A2 # -0x322C 0x50AA # -0x322D 0x50AF # -0x322E 0x50B0 # -0x322F 0x50B9 # -0x3230 0x50BA # -0x3231 0x50BD # -0x3232 0x50C0 # -0x3233 0x50C3 # -0x3234 0x50C4 # -0x3235 0x50C7 # -0x3236 0x50CC # -0x3237 0x50CE # -0x3238 0x50D0 # -0x3239 0x50D3 # -0x323A 0x50D4 # -0x323B 0x50D8 # -0x323C 0x50DC # -0x323D 0x50DD # -0x323E 0x50DF # -0x323F 0x50E2 # -0x3240 0x50E4 # -0x3241 0x50E6 # -0x3242 0x50E8 # -0x3243 0x50E9 # -0x3244 0x50EF # -0x3245 0x50F1 # -0x3246 0x50F6 # -0x3247 0x50FA # -0x3248 0x50FE # -0x3249 0x5103 # -0x324A 0x5106 # -0x324B 0x5107 # -0x324C 0x5108 # -0x324D 0x510B # -0x324E 0x510C # -0x324F 0x510D # -0x3250 0x510E # -0x3251 0x50F2 # -0x3252 0x5110 # -0x3253 0x5117 # -0x3254 0x5119 # -0x3255 0x511B # -0x3256 0x511C # -0x3257 0x511D # -0x3258 0x511E # -0x3259 0x5123 # -0x325A 0x5127 # -0x325B 0x5128 # -0x325C 0x512C # -0x325D 0x512D # -0x325E 0x512F # -0x325F 0x5131 # -0x3260 0x5133 # -0x3261 0x5134 # -0x3262 0x5135 # -0x3263 0x5138 # -0x3264 0x5139 # -0x3265 0x5142 # -0x3266 0x514A # -0x3267 0x514F # -0x3268 0x5153 # -0x3269 0x5155 # -0x326A 0x5157 # -0x326B 0x5158 # -0x326C 0x515F # -0x326D 0x5164 # -0x326E 0x5166 # -0x326F 0x517E # -0x3270 0x5183 # -0x3271 0x5184 # -0x3272 0x518B # -0x3273 0x518E # -0x3274 0x5198 # -0x3275 0x519D # -0x3276 0x51A1 # -0x3277 0x51A3 # -0x3278 0x51AD # -0x3279 0x51B8 # -0x327A 0x51BA # -0x327B 0x51BC # -0x327C 0x51BE # -0x327D 0x51BF # -0x327E 0x51C2 # -0x3321 0x51C8 # -0x3322 0x51CF # -0x3323 0x51D1 # -0x3324 0x51D2 # -0x3325 0x51D3 # -0x3326 0x51D5 # -0x3327 0x51D8 # -0x3328 0x51DE # -0x3329 0x51E2 # -0x332A 0x51E5 # -0x332B 0x51EE # -0x332C 0x51F2 # -0x332D 0x51F3 # -0x332E 0x51F4 # -0x332F 0x51F7 # -0x3330 0x5201 # -0x3331 0x5202 # -0x3332 0x5205 # -0x3333 0x5212 # -0x3334 0x5213 # -0x3335 0x5215 # -0x3336 0x5216 # -0x3337 0x5218 # -0x3338 0x5222 # -0x3339 0x5228 # -0x333A 0x5231 # -0x333B 0x5232 # -0x333C 0x5235 # -0x333D 0x523C # -0x333E 0x5245 # -0x333F 0x5249 # -0x3340 0x5255 # -0x3341 0x5257 # -0x3342 0x5258 # -0x3343 0x525A # -0x3344 0x525C # -0x3345 0x525F # -0x3346 0x5260 # -0x3347 0x5261 # -0x3348 0x5266 # -0x3349 0x526E # -0x334A 0x5277 # -0x334B 0x5278 # -0x334C 0x5279 # -0x334D 0x5280 # -0x334E 0x5282 # -0x334F 0x5285 # -0x3350 0x528A # -0x3351 0x528C # -0x3352 0x5293 # -0x3353 0x5295 # -0x3354 0x5296 # -0x3355 0x5297 # -0x3356 0x5298 # -0x3357 0x529A # -0x3358 0x529C # -0x3359 0x52A4 # -0x335A 0x52A5 # -0x335B 0x52A6 # -0x335C 0x52A7 # -0x335D 0x52AF # -0x335E 0x52B0 # -0x335F 0x52B6 # -0x3360 0x52B7 # -0x3361 0x52B8 # -0x3362 0x52BA # -0x3363 0x52BB # -0x3364 0x52BD # -0x3365 0x52C0 # -0x3366 0x52C4 # -0x3367 0x52C6 # -0x3368 0x52C8 # -0x3369 0x52CC # -0x336A 0x52CF # -0x336B 0x52D1 # -0x336C 0x52D4 # -0x336D 0x52D6 # -0x336E 0x52DB # -0x336F 0x52DC # -0x3370 0x52E1 # -0x3371 0x52E5 # -0x3372 0x52E8 # -0x3373 0x52E9 # -0x3374 0x52EA # -0x3375 0x52EC # -0x3376 0x52F0 # -0x3377 0x52F1 # -0x3378 0x52F4 # -0x3379 0x52F6 # -0x337A 0x52F7 # -0x337B 0x5300 # -0x337C 0x5303 # -0x337D 0x530A # -0x337E 0x530B # -0x3421 0x530C # -0x3422 0x5311 # -0x3423 0x5313 # -0x3424 0x5318 # -0x3425 0x531B # -0x3426 0x531C # -0x3427 0x531E # -0x3428 0x531F # -0x3429 0x5325 # -0x342A 0x5327 # -0x342B 0x5328 # -0x342C 0x5329 # -0x342D 0x532B # -0x342E 0x532C # -0x342F 0x532D # -0x3430 0x5330 # -0x3431 0x5332 # -0x3432 0x5335 # -0x3433 0x533C # -0x3434 0x533D # -0x3435 0x533E # -0x3436 0x5342 # -0x3437 0x534C # -0x3438 0x534B # -0x3439 0x5359 # -0x343A 0x535B # -0x343B 0x5361 # -0x343C 0x5363 # -0x343D 0x5365 # -0x343E 0x536C # -0x343F 0x536D # -0x3440 0x5372 # -0x3441 0x5379 # -0x3442 0x537E # -0x3443 0x5383 # -0x3444 0x5387 # -0x3445 0x5388 # -0x3446 0x538E # -0x3447 0x5393 # -0x3448 0x5394 # -0x3449 0x5399 # -0x344A 0x539D # -0x344B 0x53A1 # -0x344C 0x53A4 # -0x344D 0x53AA # -0x344E 0x53AB # -0x344F 0x53AF # -0x3450 0x53B2 # -0x3451 0x53B4 # -0x3452 0x53B5 # -0x3453 0x53B7 # -0x3454 0x53B8 # -0x3455 0x53BA # -0x3456 0x53BD # -0x3457 0x53C0 # -0x3458 0x53C5 # -0x3459 0x53CF # -0x345A 0x53D2 # -0x345B 0x53D3 # -0x345C 0x53D5 # -0x345D 0x53DA # -0x345E 0x53DD # -0x345F 0x53DE # -0x3460 0x53E0 # -0x3461 0x53E6 # -0x3462 0x53E7 # -0x3463 0x53F5 # -0x3464 0x5402 # -0x3465 0x5413 # -0x3466 0x541A # -0x3467 0x5421 # -0x3468 0x5427 # -0x3469 0x5428 # -0x346A 0x542A # -0x346B 0x542F # -0x346C 0x5431 # -0x346D 0x5434 # -0x346E 0x5435 # -0x346F 0x5443 # -0x3470 0x5444 # -0x3471 0x5447 # -0x3472 0x544D # -0x3473 0x544F # -0x3474 0x545E # -0x3475 0x5462 # -0x3476 0x5464 # -0x3477 0x5466 # -0x3478 0x5467 # -0x3479 0x5469 # -0x347A 0x546B # -0x347B 0x546D # -0x347C 0x546E # -0x347D 0x5474 # -0x347E 0x547F # -0x3521 0x5481 # -0x3522 0x5483 # -0x3523 0x5485 # -0x3524 0x5488 # -0x3525 0x5489 # -0x3526 0x548D # -0x3527 0x5491 # -0x3528 0x5495 # -0x3529 0x5496 # -0x352A 0x549C # -0x352B 0x549F # -0x352C 0x54A1 # -0x352D 0x54A6 # -0x352E 0x54A7 # -0x352F 0x54A9 # -0x3530 0x54AA # -0x3531 0x54AD # -0x3532 0x54AE # -0x3533 0x54B1 # -0x3534 0x54B7 # -0x3535 0x54B9 # -0x3536 0x54BA # -0x3537 0x54BB # -0x3538 0x54BF # -0x3539 0x54C6 # -0x353A 0x54CA # -0x353B 0x54CD # -0x353C 0x54CE # -0x353D 0x54E0 # -0x353E 0x54EA # -0x353F 0x54EC # -0x3540 0x54EF # -0x3541 0x54F6 # -0x3542 0x54FC # -0x3543 0x54FE # -0x3544 0x54FF # -0x3545 0x5500 # -0x3546 0x5501 # -0x3547 0x5505 # -0x3548 0x5508 # -0x3549 0x5509 # -0x354A 0x550C # -0x354B 0x550D # -0x354C 0x550E # -0x354D 0x5515 # -0x354E 0x552A # -0x354F 0x552B # -0x3550 0x5532 # -0x3551 0x5535 # -0x3552 0x5536 # -0x3553 0x553B # -0x3554 0x553C # -0x3555 0x553D # -0x3556 0x5541 # -0x3557 0x5547 # -0x3558 0x5549 # -0x3559 0x554A # -0x355A 0x554D # -0x355B 0x5550 # -0x355C 0x5551 # -0x355D 0x5558 # -0x355E 0x555A # -0x355F 0x555B # -0x3560 0x555E # -0x3561 0x5560 # -0x3562 0x5561 # -0x3563 0x5564 # -0x3564 0x5566 # -0x3565 0x557F # -0x3566 0x5581 # -0x3567 0x5582 # -0x3568 0x5586 # -0x3569 0x5588 # -0x356A 0x558E # -0x356B 0x558F # -0x356C 0x5591 # -0x356D 0x5592 # -0x356E 0x5593 # -0x356F 0x5594 # -0x3570 0x5597 # -0x3571 0x55A3 # -0x3572 0x55A4 # -0x3573 0x55AD # -0x3574 0x55B2 # -0x3575 0x55BF # -0x3576 0x55C1 # -0x3577 0x55C3 # -0x3578 0x55C6 # -0x3579 0x55C9 # -0x357A 0x55CB # -0x357B 0x55CC # -0x357C 0x55CE # -0x357D 0x55D1 # -0x357E 0x55D2 # -0x3621 0x55D3 # -0x3622 0x55D7 # -0x3623 0x55D8 # -0x3624 0x55DB # -0x3625 0x55DE # -0x3626 0x55E2 # -0x3627 0x55E9 # -0x3628 0x55F6 # -0x3629 0x55FF # -0x362A 0x5605 # -0x362B 0x5608 # -0x362C 0x560A # -0x362D 0x560D # -0x362E 0x560E # -0x362F 0x560F # -0x3630 0x5610 # -0x3631 0x5611 # -0x3632 0x5612 # -0x3633 0x5619 # -0x3634 0x562C # -0x3635 0x5630 # -0x3636 0x5633 # -0x3637 0x5635 # -0x3638 0x5637 # -0x3639 0x5639 # -0x363A 0x563B # -0x363B 0x563C # -0x363C 0x563D # -0x363D 0x563F # -0x363E 0x5640 # -0x363F 0x5641 # -0x3640 0x5643 # -0x3641 0x5644 # -0x3642 0x5646 # -0x3643 0x5649 # -0x3644 0x564B # -0x3645 0x564D # -0x3646 0x564F # -0x3647 0x5654 # -0x3648 0x565E # -0x3649 0x5660 # -0x364A 0x5661 # -0x364B 0x5662 # -0x364C 0x5663 # -0x364D 0x5666 # -0x364E 0x5669 # -0x364F 0x566D # -0x3650 0x566F # -0x3651 0x5671 # -0x3652 0x5672 # -0x3653 0x5675 # -0x3654 0x5684 # -0x3655 0x5685 # -0x3656 0x5688 # -0x3657 0x568B # -0x3658 0x568C # -0x3659 0x5695 # -0x365A 0x5699 # -0x365B 0x569A # -0x365C 0x569D # -0x365D 0x569E # -0x365E 0x569F # -0x365F 0x56A6 # -0x3660 0x56A7 # -0x3661 0x56A8 # -0x3662 0x56A9 # -0x3663 0x56AB # -0x3664 0x56AC # -0x3665 0x56AD # -0x3666 0x56B1 # -0x3667 0x56B3 # -0x3668 0x56B7 # -0x3669 0x56BE # -0x366A 0x56C5 # -0x366B 0x56C9 # -0x366C 0x56CA # -0x366D 0x56CB # -0x366E 0x56CF # -0x366F 0x56D0 # -0x3670 0x56CC # -0x3671 0x56CD # -0x3672 0x56D9 # -0x3673 0x56DC # -0x3674 0x56DD # -0x3675 0x56DF # -0x3676 0x56E1 # -0x3677 0x56E4 # -0x3678 0x56E5 # -0x3679 0x56E6 # -0x367A 0x56E7 # -0x367B 0x56E8 # -0x367C 0x56F1 # -0x367D 0x56EB # -0x367E 0x56ED # -0x3721 0x56F6 # -0x3722 0x56F7 # -0x3723 0x5701 # -0x3724 0x5702 # -0x3725 0x5707 # -0x3726 0x570A # -0x3727 0x570C # -0x3728 0x5711 # -0x3729 0x5715 # -0x372A 0x571A # -0x372B 0x571B # -0x372C 0x571D # -0x372D 0x5720 # -0x372E 0x5722 # -0x372F 0x5723 # -0x3730 0x5724 # -0x3731 0x5725 # -0x3732 0x5729 # -0x3733 0x572A # -0x3734 0x572C # -0x3735 0x572E # -0x3736 0x572F # -0x3737 0x5733 # -0x3738 0x5734 # -0x3739 0x573D # -0x373A 0x573E # -0x373B 0x573F # -0x373C 0x5745 # -0x373D 0x5746 # -0x373E 0x574C # -0x373F 0x574D # -0x3740 0x5752 # -0x3741 0x5762 # -0x3742 0x5765 # -0x3743 0x5767 # -0x3744 0x5768 # -0x3745 0x576B # -0x3746 0x576D # -0x3747 0x576E # -0x3748 0x576F # -0x3749 0x5770 # -0x374A 0x5771 # -0x374B 0x5773 # -0x374C 0x5774 # -0x374D 0x5775 # -0x374E 0x5777 # -0x374F 0x5779 # -0x3750 0x577A # -0x3751 0x577B # -0x3752 0x577C # -0x3753 0x577E # -0x3754 0x5781 # -0x3755 0x5783 # -0x3756 0x578C # -0x3757 0x5794 # -0x3758 0x5797 # -0x3759 0x5799 # -0x375A 0x579A # -0x375B 0x579C # -0x375C 0x579D # -0x375D 0x579E # -0x375E 0x579F # -0x375F 0x57A1 # -0x3760 0x5795 # -0x3761 0x57A7 # -0x3762 0x57A8 # -0x3763 0x57A9 # -0x3764 0x57AC # -0x3765 0x57B8 # -0x3766 0x57BD # -0x3767 0x57C7 # -0x3768 0x57C8 # -0x3769 0x57CC # -0x376A 0x57CF # -0x376B 0x57D5 # -0x376C 0x57DD # -0x376D 0x57DE # -0x376E 0x57E4 # -0x376F 0x57E6 # -0x3770 0x57E7 # -0x3771 0x57E9 # -0x3772 0x57ED # -0x3773 0x57F0 # -0x3774 0x57F5 # -0x3775 0x57F6 # -0x3776 0x57F8 # -0x3777 0x57FD # -0x3778 0x57FE # -0x3779 0x57FF # -0x377A 0x5803 # -0x377B 0x5804 # -0x377C 0x5808 # -0x377D 0x5809 # -0x377E 0x57E1 # -0x3821 0x580C # -0x3822 0x580D # -0x3823 0x581B # -0x3824 0x581E # -0x3825 0x581F # -0x3826 0x5820 # -0x3827 0x5826 # -0x3828 0x5827 # -0x3829 0x582D # -0x382A 0x5832 # -0x382B 0x5839 # -0x382C 0x583F # -0x382D 0x5849 # -0x382E 0x584C # -0x382F 0x584D # -0x3830 0x584F # -0x3831 0x5850 # -0x3832 0x5855 # -0x3833 0x585F # -0x3834 0x5861 # -0x3835 0x5864 # -0x3836 0x5867 # -0x3837 0x5868 # -0x3838 0x5878 # -0x3839 0x587C # -0x383A 0x587F # -0x383B 0x5880 # -0x383C 0x5881 # -0x383D 0x5887 # -0x383E 0x5888 # -0x383F 0x5889 # -0x3840 0x588A # -0x3841 0x588C # -0x3842 0x588D # -0x3843 0x588F # -0x3844 0x5890 # -0x3845 0x5894 # -0x3846 0x5896 # -0x3847 0x589D # -0x3848 0x58A0 # -0x3849 0x58A1 # -0x384A 0x58A2 # -0x384B 0x58A6 # -0x384C 0x58A9 # -0x384D 0x58B1 # -0x384E 0x58B2 # -0x384F 0x58C4 # -0x3850 0x58BC # -0x3851 0x58C2 # -0x3852 0x58C8 # -0x3853 0x58CD # -0x3854 0x58CE # -0x3855 0x58D0 # -0x3856 0x58D2 # -0x3857 0x58D4 # -0x3858 0x58D6 # -0x3859 0x58DA # -0x385A 0x58DD # -0x385B 0x58E1 # -0x385C 0x58E2 # -0x385D 0x58E9 # -0x385E 0x58F3 # -0x385F 0x5905 # -0x3860 0x5906 # -0x3861 0x590B # -0x3862 0x590C # -0x3863 0x5912 # -0x3864 0x5913 # -0x3865 0x5914 # -0x3866 0x8641 # -0x3867 0x591D # -0x3868 0x5921 # -0x3869 0x5923 # -0x386A 0x5924 # -0x386B 0x5928 # -0x386C 0x592F # -0x386D 0x5930 # -0x386E 0x5933 # -0x386F 0x5935 # -0x3870 0x5936 # -0x3871 0x593F # -0x3872 0x5943 # -0x3873 0x5946 # -0x3874 0x5952 # -0x3875 0x5953 # -0x3876 0x5959 # -0x3877 0x595B # -0x3878 0x595D # -0x3879 0x595E # -0x387A 0x595F # -0x387B 0x5961 # -0x387C 0x5963 # -0x387D 0x596B # -0x387E 0x596D # -0x3921 0x596F # -0x3922 0x5972 # -0x3923 0x5975 # -0x3924 0x5976 # -0x3925 0x5979 # -0x3926 0x597B # -0x3927 0x597C # -0x3928 0x598B # -0x3929 0x598C # -0x392A 0x598E # -0x392B 0x5992 # -0x392C 0x5995 # -0x392D 0x5997 # -0x392E 0x599F # -0x392F 0x59A4 # -0x3930 0x59A7 # -0x3931 0x59AD # -0x3932 0x59AE # -0x3933 0x59AF # -0x3934 0x59B0 # -0x3935 0x59B3 # -0x3936 0x59B7 # -0x3937 0x59BA # -0x3938 0x59BC # -0x3939 0x59C1 # -0x393A 0x59C3 # -0x393B 0x59C4 # -0x393C 0x59C8 # -0x393D 0x59CA # -0x393E 0x59CD # -0x393F 0x59D2 # -0x3940 0x59DD # -0x3941 0x59DE # -0x3942 0x59DF # -0x3943 0x59E3 # -0x3944 0x59E4 # -0x3945 0x59E7 # -0x3946 0x59EE # -0x3947 0x59EF # -0x3948 0x59F1 # -0x3949 0x59F2 # -0x394A 0x59F4 # -0x394B 0x59F7 # -0x394C 0x5A00 # -0x394D 0x5A04 # -0x394E 0x5A0C # -0x394F 0x5A0D # -0x3950 0x5A0E # -0x3951 0x5A12 # -0x3952 0x5A13 # -0x3953 0x5A1E # -0x3954 0x5A23 # -0x3955 0x5A24 # -0x3956 0x5A27 # -0x3957 0x5A28 # -0x3958 0x5A2A # -0x3959 0x5A2D # -0x395A 0x5A30 # -0x395B 0x5A44 # -0x395C 0x5A45 # -0x395D 0x5A47 # -0x395E 0x5A48 # -0x395F 0x5A4C # -0x3960 0x5A50 # -0x3961 0x5A55 # -0x3962 0x5A5E # -0x3963 0x5A63 # -0x3964 0x5A65 # -0x3965 0x5A67 # -0x3966 0x5A6D # -0x3967 0x5A77 # -0x3968 0x5A7A # -0x3969 0x5A7B # -0x396A 0x5A7E # -0x396B 0x5A8B # -0x396C 0x5A90 # -0x396D 0x5A93 # -0x396E 0x5A96 # -0x396F 0x5A99 # -0x3970 0x5A9C # -0x3971 0x5A9E # -0x3972 0x5A9F # -0x3973 0x5AA0 # -0x3974 0x5AA2 # -0x3975 0x5AA7 # -0x3976 0x5AAC # -0x3977 0x5AB1 # -0x3978 0x5AB2 # -0x3979 0x5AB3 # -0x397A 0x5AB5 # -0x397B 0x5AB8 # -0x397C 0x5ABA # -0x397D 0x5ABB # -0x397E 0x5ABF # -0x3A21 0x5AC4 # -0x3A22 0x5AC6 # -0x3A23 0x5AC8 # -0x3A24 0x5ACF # -0x3A25 0x5ADA # -0x3A26 0x5ADC # -0x3A27 0x5AE0 # -0x3A28 0x5AE5 # -0x3A29 0x5AEA # -0x3A2A 0x5AEE # -0x3A2B 0x5AF5 # -0x3A2C 0x5AF6 # -0x3A2D 0x5AFD # -0x3A2E 0x5B00 # -0x3A2F 0x5B01 # -0x3A30 0x5B08 # -0x3A31 0x5B17 # -0x3A32 0x5B34 # -0x3A33 0x5B19 # -0x3A34 0x5B1B # -0x3A35 0x5B1D # -0x3A36 0x5B21 # -0x3A37 0x5B25 # -0x3A38 0x5B2D # -0x3A39 0x5B38 # -0x3A3A 0x5B41 # -0x3A3B 0x5B4B # -0x3A3C 0x5B4C # -0x3A3D 0x5B52 # -0x3A3E 0x5B56 # -0x3A3F 0x5B5E # -0x3A40 0x5B68 # -0x3A41 0x5B6E # -0x3A42 0x5B6F # -0x3A43 0x5B7C # -0x3A44 0x5B7D # -0x3A45 0x5B7E # -0x3A46 0x5B7F # -0x3A47 0x5B81 # -0x3A48 0x5B84 # -0x3A49 0x5B86 # -0x3A4A 0x5B8A # -0x3A4B 0x5B8E # -0x3A4C 0x5B90 # -0x3A4D 0x5B91 # -0x3A4E 0x5B93 # -0x3A4F 0x5B94 # -0x3A50 0x5B96 # -0x3A51 0x5BA8 # -0x3A52 0x5BA9 # -0x3A53 0x5BAC # -0x3A54 0x5BAD # -0x3A55 0x5BAF # -0x3A56 0x5BB1 # -0x3A57 0x5BB2 # -0x3A58 0x5BB7 # -0x3A59 0x5BBA # -0x3A5A 0x5BBC # -0x3A5B 0x5BC0 # -0x3A5C 0x5BC1 # -0x3A5D 0x5BCD # -0x3A5E 0x5BCF # -0x3A5F 0x5BD6 # -0x3A60 0x5BD7 # -0x3A61 0x5BD8 # -0x3A62 0x5BD9 # -0x3A63 0x5BDA # -0x3A64 0x5BE0 # -0x3A65 0x5BEF # -0x3A66 0x5BF1 # -0x3A67 0x5BF4 # -0x3A68 0x5BFD # -0x3A69 0x5C0C # -0x3A6A 0x5C17 # -0x3A6B 0x5C1E # -0x3A6C 0x5C1F # -0x3A6D 0x5C23 # -0x3A6E 0x5C26 # -0x3A6F 0x5C29 # -0x3A70 0x5C2B # -0x3A71 0x5C2C # -0x3A72 0x5C2E # -0x3A73 0x5C30 # -0x3A74 0x5C32 # -0x3A75 0x5C35 # -0x3A76 0x5C36 # -0x3A77 0x5C59 # -0x3A78 0x5C5A # -0x3A79 0x5C5C # -0x3A7A 0x5C62 # -0x3A7B 0x5C63 # -0x3A7C 0x5C67 # -0x3A7D 0x5C68 # -0x3A7E 0x5C69 # -0x3B21 0x5C6D # -0x3B22 0x5C70 # -0x3B23 0x5C74 # -0x3B24 0x5C75 # -0x3B25 0x5C7A # -0x3B26 0x5C7B # -0x3B27 0x5C7C # -0x3B28 0x5C7D # -0x3B29 0x5C87 # -0x3B2A 0x5C88 # -0x3B2B 0x5C8A # -0x3B2C 0x5C8F # -0x3B2D 0x5C92 # -0x3B2E 0x5C9D # -0x3B2F 0x5C9F # -0x3B30 0x5CA0 # -0x3B31 0x5CA2 # -0x3B32 0x5CA3 # -0x3B33 0x5CA6 # -0x3B34 0x5CAA # -0x3B35 0x5CB2 # -0x3B36 0x5CB4 # -0x3B37 0x5CB5 # -0x3B38 0x5CBA # -0x3B39 0x5CC9 # -0x3B3A 0x5CCB # -0x3B3B 0x5CD2 # -0x3B3C 0x5CDD # -0x3B3D 0x5CD7 # -0x3B3E 0x5CEE # -0x3B3F 0x5CF1 # -0x3B40 0x5CF2 # -0x3B41 0x5CF4 # -0x3B42 0x5D01 # -0x3B43 0x5D06 # -0x3B44 0x5D0D # -0x3B45 0x5D12 # -0x3B46 0x5D2B # -0x3B47 0x5D23 # -0x3B48 0x5D24 # -0x3B49 0x5D26 # -0x3B4A 0x5D27 # -0x3B4B 0x5D31 # -0x3B4C 0x5D34 # -0x3B4D 0x5D39 # -0x3B4E 0x5D3D # -0x3B4F 0x5D3F # -0x3B50 0x5D42 # -0x3B51 0x5D43 # -0x3B52 0x5D46 # -0x3B53 0x5D48 # -0x3B54 0x5D55 # -0x3B55 0x5D51 # -0x3B56 0x5D59 # -0x3B57 0x5D4A # -0x3B58 0x5D5F # -0x3B59 0x5D60 # -0x3B5A 0x5D61 # -0x3B5B 0x5D62 # -0x3B5C 0x5D64 # -0x3B5D 0x5D6A # -0x3B5E 0x5D6D # -0x3B5F 0x5D70 # -0x3B60 0x5D79 # -0x3B61 0x5D7A # -0x3B62 0x5D7E # -0x3B63 0x5D7F # -0x3B64 0x5D81 # -0x3B65 0x5D83 # -0x3B66 0x5D88 # -0x3B67 0x5D8A # -0x3B68 0x5D92 # -0x3B69 0x5D93 # -0x3B6A 0x5D94 # -0x3B6B 0x5D95 # -0x3B6C 0x5D99 # -0x3B6D 0x5D9B # -0x3B6E 0x5D9F # -0x3B6F 0x5DA0 # -0x3B70 0x5DA7 # -0x3B71 0x5DAB # -0x3B72 0x5DB0 # -0x3B73 0x5DB4 # -0x3B74 0x5DB8 # -0x3B75 0x5DB9 # -0x3B76 0x5DC3 # -0x3B77 0x5DC7 # -0x3B78 0x5DCB # -0x3B79 0x5DD0 # -0x3B7A 0x5DCE # -0x3B7B 0x5DD8 # -0x3B7C 0x5DD9 # -0x3B7D 0x5DE0 # -0x3B7E 0x5DE4 # -0x3C21 0x5DE9 # -0x3C22 0x5DF8 # -0x3C23 0x5DF9 # -0x3C24 0x5E00 # -0x3C25 0x5E07 # -0x3C26 0x5E0D # -0x3C27 0x5E12 # -0x3C28 0x5E14 # -0x3C29 0x5E15 # -0x3C2A 0x5E18 # -0x3C2B 0x5E1F # -0x3C2C 0x5E20 # -0x3C2D 0x5E2E # -0x3C2E 0x5E28 # -0x3C2F 0x5E32 # -0x3C30 0x5E35 # -0x3C31 0x5E3E # -0x3C32 0x5E4B # -0x3C33 0x5E50 # -0x3C34 0x5E49 # -0x3C35 0x5E51 # -0x3C36 0x5E56 # -0x3C37 0x5E58 # -0x3C38 0x5E5B # -0x3C39 0x5E5C # -0x3C3A 0x5E5E # -0x3C3B 0x5E68 # -0x3C3C 0x5E6A # -0x3C3D 0x5E6B # -0x3C3E 0x5E6C # -0x3C3F 0x5E6D # -0x3C40 0x5E6E # -0x3C41 0x5E70 # -0x3C42 0x5E80 # -0x3C43 0x5E8B # -0x3C44 0x5E8E # -0x3C45 0x5EA2 # -0x3C46 0x5EA4 # -0x3C47 0x5EA5 # -0x3C48 0x5EA8 # -0x3C49 0x5EAA # -0x3C4A 0x5EAC # -0x3C4B 0x5EB1 # -0x3C4C 0x5EB3 # -0x3C4D 0x5EBD # -0x3C4E 0x5EBE # -0x3C4F 0x5EBF # -0x3C50 0x5EC6 # -0x3C51 0x5ECC # -0x3C52 0x5ECB # -0x3C53 0x5ECE # -0x3C54 0x5ED1 # -0x3C55 0x5ED2 # -0x3C56 0x5ED4 # -0x3C57 0x5ED5 # -0x3C58 0x5EDC # -0x3C59 0x5EDE # -0x3C5A 0x5EE5 # -0x3C5B 0x5EEB # -0x3C5C 0x5F02 # -0x3C5D 0x5F06 # -0x3C5E 0x5F07 # -0x3C5F 0x5F08 # -0x3C60 0x5F0E # -0x3C61 0x5F19 # -0x3C62 0x5F1C # -0x3C63 0x5F1D # -0x3C64 0x5F21 # -0x3C65 0x5F22 # -0x3C66 0x5F23 # -0x3C67 0x5F24 # -0x3C68 0x5F28 # -0x3C69 0x5F2B # -0x3C6A 0x5F2C # -0x3C6B 0x5F2E # -0x3C6C 0x5F30 # -0x3C6D 0x5F34 # -0x3C6E 0x5F36 # -0x3C6F 0x5F3B # -0x3C70 0x5F3D # -0x3C71 0x5F3F # -0x3C72 0x5F40 # -0x3C73 0x5F44 # -0x3C74 0x5F45 # -0x3C75 0x5F47 # -0x3C76 0x5F4D # -0x3C77 0x5F50 # -0x3C78 0x5F54 # -0x3C79 0x5F58 # -0x3C7A 0x5F5B # -0x3C7B 0x5F60 # -0x3C7C 0x5F63 # -0x3C7D 0x5F64 # -0x3C7E 0x5F67 # -0x3D21 0x5F6F # -0x3D22 0x5F72 # -0x3D23 0x5F74 # -0x3D24 0x5F75 # -0x3D25 0x5F78 # -0x3D26 0x5F7A # -0x3D27 0x5F7D # -0x3D28 0x5F7E # -0x3D29 0x5F89 # -0x3D2A 0x5F8D # -0x3D2B 0x5F8F # -0x3D2C 0x5F96 # -0x3D2D 0x5F9C # -0x3D2E 0x5F9D # -0x3D2F 0x5FA2 # -0x3D30 0x5FA7 # -0x3D31 0x5FAB # -0x3D32 0x5FA4 # -0x3D33 0x5FAC # -0x3D34 0x5FAF # -0x3D35 0x5FB0 # -0x3D36 0x5FB1 # -0x3D37 0x5FB8 # -0x3D38 0x5FC4 # -0x3D39 0x5FC7 # -0x3D3A 0x5FC8 # -0x3D3B 0x5FC9 # -0x3D3C 0x5FCB # -0x3D3D 0x5FD0 # -0x3D3E 0x5FD1 # -0x3D3F 0x5FD2 # -0x3D40 0x5FD3 # -0x3D41 0x5FD4 # -0x3D42 0x5FDE # -0x3D43 0x5FE1 # -0x3D44 0x5FE2 # -0x3D45 0x5FE8 # -0x3D46 0x5FE9 # -0x3D47 0x5FEA # -0x3D48 0x5FEC # -0x3D49 0x5FED # -0x3D4A 0x5FEE # -0x3D4B 0x5FEF # -0x3D4C 0x5FF2 # -0x3D4D 0x5FF3 # -0x3D4E 0x5FF6 # -0x3D4F 0x5FFA # -0x3D50 0x5FFC # -0x3D51 0x6007 # -0x3D52 0x600A # -0x3D53 0x600D # -0x3D54 0x6013 # -0x3D55 0x6014 # -0x3D56 0x6017 # -0x3D57 0x6018 # -0x3D58 0x601A # -0x3D59 0x601F # -0x3D5A 0x6024 # -0x3D5B 0x602D # -0x3D5C 0x6033 # -0x3D5D 0x6035 # -0x3D5E 0x6040 # -0x3D5F 0x6047 # -0x3D60 0x6048 # -0x3D61 0x6049 # -0x3D62 0x604C # -0x3D63 0x6051 # -0x3D64 0x6054 # -0x3D65 0x6056 # -0x3D66 0x6057 # -0x3D67 0x605D # -0x3D68 0x6061 # -0x3D69 0x6067 # -0x3D6A 0x6071 # -0x3D6B 0x607E # -0x3D6C 0x607F # -0x3D6D 0x6082 # -0x3D6E 0x6086 # -0x3D6F 0x6088 # -0x3D70 0x608A # -0x3D71 0x608E # -0x3D72 0x6091 # -0x3D73 0x6093 # -0x3D74 0x6095 # -0x3D75 0x6098 # -0x3D76 0x609D # -0x3D77 0x609E # -0x3D78 0x60A2 # -0x3D79 0x60A4 # -0x3D7A 0x60A5 # -0x3D7B 0x60A8 # -0x3D7C 0x60B0 # -0x3D7D 0x60B1 # -0x3D7E 0x60B7 # -0x3E21 0x60BB # -0x3E22 0x60BE # -0x3E23 0x60C2 # -0x3E24 0x60C4 # -0x3E25 0x60C8 # -0x3E26 0x60C9 # -0x3E27 0x60CA # -0x3E28 0x60CB # -0x3E29 0x60CE # -0x3E2A 0x60CF # -0x3E2B 0x60D4 # -0x3E2C 0x60D5 # -0x3E2D 0x60D9 # -0x3E2E 0x60DB # -0x3E2F 0x60DD # -0x3E30 0x60DE # -0x3E31 0x60E2 # -0x3E32 0x60E5 # -0x3E33 0x60F2 # -0x3E34 0x60F5 # -0x3E35 0x60F8 # -0x3E36 0x60FC # -0x3E37 0x60FD # -0x3E38 0x6102 # -0x3E39 0x6107 # -0x3E3A 0x610A # -0x3E3B 0x610C # -0x3E3C 0x6110 # -0x3E3D 0x6111 # -0x3E3E 0x6112 # -0x3E3F 0x6113 # -0x3E40 0x6114 # -0x3E41 0x6116 # -0x3E42 0x6117 # -0x3E43 0x6119 # -0x3E44 0x611C # -0x3E45 0x611E # -0x3E46 0x6122 # -0x3E47 0x612A # -0x3E48 0x612B # -0x3E49 0x6130 # -0x3E4A 0x6131 # -0x3E4B 0x6135 # -0x3E4C 0x6136 # -0x3E4D 0x6137 # -0x3E4E 0x6139 # -0x3E4F 0x6141 # -0x3E50 0x6145 # -0x3E51 0x6146 # -0x3E52 0x6149 # -0x3E53 0x615E # -0x3E54 0x6160 # -0x3E55 0x616C # -0x3E56 0x6172 # -0x3E57 0x6178 # -0x3E58 0x617B # -0x3E59 0x617C # -0x3E5A 0x617F # -0x3E5B 0x6180 # -0x3E5C 0x6181 # -0x3E5D 0x6183 # -0x3E5E 0x6184 # -0x3E5F 0x618B # -0x3E60 0x618D # -0x3E61 0x6192 # -0x3E62 0x6193 # -0x3E63 0x6197 # -0x3E64 0x6198 # -0x3E65 0x619C # -0x3E66 0x619D # -0x3E67 0x619F # -0x3E68 0x61A0 # -0x3E69 0x61A5 # -0x3E6A 0x61A8 # -0x3E6B 0x61AA # -0x3E6C 0x61AD # -0x3E6D 0x61B8 # -0x3E6E 0x61B9 # -0x3E6F 0x61BC # -0x3E70 0x61C0 # -0x3E71 0x61C1 # -0x3E72 0x61C2 # -0x3E73 0x61CE # -0x3E74 0x61CF # -0x3E75 0x61D5 # -0x3E76 0x61DC # -0x3E77 0x61DD # -0x3E78 0x61DE # -0x3E79 0x61DF # -0x3E7A 0x61E1 # -0x3E7B 0x61E2 # -0x3E7C 0x61E7 # -0x3E7D 0x61E9 # -0x3E7E 0x61E5 # -0x3F21 0x61EC # -0x3F22 0x61ED # -0x3F23 0x61EF # -0x3F24 0x6201 # -0x3F25 0x6203 # -0x3F26 0x6204 # -0x3F27 0x6207 # -0x3F28 0x6213 # -0x3F29 0x6215 # -0x3F2A 0x621C # -0x3F2B 0x6220 # -0x3F2C 0x6222 # -0x3F2D 0x6223 # -0x3F2E 0x6227 # -0x3F2F 0x6229 # -0x3F30 0x622B # -0x3F31 0x6239 # -0x3F32 0x623D # -0x3F33 0x6242 # -0x3F34 0x6243 # -0x3F35 0x6244 # -0x3F36 0x6246 # -0x3F37 0x624C # -0x3F38 0x6250 # -0x3F39 0x6251 # -0x3F3A 0x6252 # -0x3F3B 0x6254 # -0x3F3C 0x6256 # -0x3F3D 0x625A # -0x3F3E 0x625C # -0x3F3F 0x6264 # -0x3F40 0x626D # -0x3F41 0x626F # -0x3F42 0x6273 # -0x3F43 0x627A # -0x3F44 0x627D # -0x3F45 0x628D # -0x3F46 0x628E # -0x3F47 0x628F # -0x3F48 0x6290 # -0x3F49 0x62A6 # -0x3F4A 0x62A8 # -0x3F4B 0x62B3 # -0x3F4C 0x62B6 # -0x3F4D 0x62B7 # -0x3F4E 0x62BA # -0x3F4F 0x62BE # -0x3F50 0x62BF # -0x3F51 0x62C4 # -0x3F52 0x62CE # -0x3F53 0x62D5 # -0x3F54 0x62D6 # -0x3F55 0x62DA # -0x3F56 0x62EA # -0x3F57 0x62F2 # -0x3F58 0x62F4 # -0x3F59 0x62FC # -0x3F5A 0x62FD # -0x3F5B 0x6303 # -0x3F5C 0x6304 # -0x3F5D 0x630A # -0x3F5E 0x630B # -0x3F5F 0x630D # -0x3F60 0x6310 # -0x3F61 0x6313 # -0x3F62 0x6316 # -0x3F63 0x6318 # -0x3F64 0x6329 # -0x3F65 0x632A # -0x3F66 0x632D # -0x3F67 0x6335 # -0x3F68 0x6336 # -0x3F69 0x6339 # -0x3F6A 0x633C # -0x3F6B 0x6341 # -0x3F6C 0x6342 # -0x3F6D 0x6343 # -0x3F6E 0x6344 # -0x3F6F 0x6346 # -0x3F70 0x634A # -0x3F71 0x634B # -0x3F72 0x634E # -0x3F73 0x6352 # -0x3F74 0x6353 # -0x3F75 0x6354 # -0x3F76 0x6358 # -0x3F77 0x635B # -0x3F78 0x6365 # -0x3F79 0x6366 # -0x3F7A 0x636C # -0x3F7B 0x636D # -0x3F7C 0x6371 # -0x3F7D 0x6374 # -0x3F7E 0x6375 # -0x4021 0x6378 # -0x4022 0x637C # -0x4023 0x637D # -0x4024 0x637F # -0x4025 0x6382 # -0x4026 0x6384 # -0x4027 0x6387 # -0x4028 0x638A # -0x4029 0x6390 # -0x402A 0x6394 # -0x402B 0x6395 # -0x402C 0x6399 # -0x402D 0x639A # -0x402E 0x639E # -0x402F 0x63A4 # -0x4030 0x63A6 # -0x4031 0x63AD # -0x4032 0x63AE # -0x4033 0x63AF # -0x4034 0x63BD # -0x4035 0x63C1 # -0x4036 0x63C5 # -0x4037 0x63C8 # -0x4038 0x63CE # -0x4039 0x63D1 # -0x403A 0x63D3 # -0x403B 0x63D4 # -0x403C 0x63D5 # -0x403D 0x63DC # -0x403E 0x63E0 # -0x403F 0x63E5 # -0x4040 0x63EA # -0x4041 0x63EC # -0x4042 0x63F2 # -0x4043 0x63F3 # -0x4044 0x63F5 # -0x4045 0x63F8 # -0x4046 0x63F9 # -0x4047 0x6409 # -0x4048 0x640A # -0x4049 0x6410 # -0x404A 0x6412 # -0x404B 0x6414 # -0x404C 0x6418 # -0x404D 0x641E # -0x404E 0x6420 # -0x404F 0x6422 # -0x4050 0x6424 # -0x4051 0x6425 # -0x4052 0x6429 # -0x4053 0x642A # -0x4054 0x642F # -0x4055 0x6430 # -0x4056 0x6435 # -0x4057 0x643D # -0x4058 0x643F # -0x4059 0x644B # -0x405A 0x644F # -0x405B 0x6451 # -0x405C 0x6452 # -0x405D 0x6453 # -0x405E 0x6454 # -0x405F 0x645A # -0x4060 0x645B # -0x4061 0x645C # -0x4062 0x645D # -0x4063 0x645F # -0x4064 0x6460 # -0x4065 0x6461 # -0x4066 0x6463 # -0x4067 0x646D # -0x4068 0x6473 # -0x4069 0x6474 # -0x406A 0x647B # -0x406B 0x647D # -0x406C 0x6485 # -0x406D 0x6487 # -0x406E 0x648F # -0x406F 0x6490 # -0x4070 0x6491 # -0x4071 0x6498 # -0x4072 0x6499 # -0x4073 0x649B # -0x4074 0x649D # -0x4075 0x649F # -0x4076 0x64A1 # -0x4077 0x64A3 # -0x4078 0x64A6 # -0x4079 0x64A8 # -0x407A 0x64AC # -0x407B 0x64B3 # -0x407C 0x64BD # -0x407D 0x64BE # -0x407E 0x64BF # -0x4121 0x64C4 # -0x4122 0x64C9 # -0x4123 0x64CA # -0x4124 0x64CB # -0x4125 0x64CC # -0x4126 0x64CE # -0x4127 0x64D0 # -0x4128 0x64D1 # -0x4129 0x64D5 # -0x412A 0x64D7 # -0x412B 0x64E4 # -0x412C 0x64E5 # -0x412D 0x64E9 # -0x412E 0x64EA # -0x412F 0x64ED # -0x4130 0x64F0 # -0x4131 0x64F5 # -0x4132 0x64F7 # -0x4133 0x64FB # -0x4134 0x64FF # -0x4135 0x6501 # -0x4136 0x6504 # -0x4137 0x6508 # -0x4138 0x6509 # -0x4139 0x650A # -0x413A 0x650F # -0x413B 0x6513 # -0x413C 0x6514 # -0x413D 0x6516 # -0x413E 0x6519 # -0x413F 0x651B # -0x4140 0x651E # -0x4141 0x651F # -0x4142 0x6522 # -0x4143 0x6526 # -0x4144 0x6529 # -0x4145 0x652E # -0x4146 0x6531 # -0x4147 0x653A # -0x4148 0x653C # -0x4149 0x653D # -0x414A 0x6543 # -0x414B 0x6547 # -0x414C 0x6549 # -0x414D 0x6550 # -0x414E 0x6552 # -0x414F 0x6554 # -0x4150 0x655F # -0x4151 0x6560 # -0x4152 0x6567 # -0x4153 0x656B # -0x4154 0x657A # -0x4155 0x657D # -0x4156 0x6581 # -0x4157 0x6585 # -0x4158 0x658A # -0x4159 0x6592 # -0x415A 0x6595 # -0x415B 0x6598 # -0x415C 0x659D # -0x415D 0x65A0 # -0x415E 0x65A3 # -0x415F 0x65A6 # -0x4160 0x65AE # -0x4161 0x65B2 # -0x4162 0x65B3 # -0x4163 0x65B4 # -0x4164 0x65BF # -0x4165 0x65C2 # -0x4166 0x65C8 # -0x4167 0x65C9 # -0x4168 0x65CE # -0x4169 0x65D0 # -0x416A 0x65D4 # -0x416B 0x65D6 # -0x416C 0x65D8 # -0x416D 0x65DF # -0x416E 0x65F0 # -0x416F 0x65F2 # -0x4170 0x65F4 # -0x4171 0x65F5 # -0x4172 0x65F9 # -0x4173 0x65FE # -0x4174 0x65FF # -0x4175 0x6600 # -0x4176 0x6604 # -0x4177 0x6608 # -0x4178 0x6609 # -0x4179 0x660D # -0x417A 0x6611 # -0x417B 0x6612 # -0x417C 0x6615 # -0x417D 0x6616 # -0x417E 0x661D # -0x4221 0x661E # -0x4222 0x6621 # -0x4223 0x6622 # -0x4224 0x6623 # -0x4225 0x6624 # -0x4226 0x6626 # -0x4227 0x6629 # -0x4228 0x662A # -0x4229 0x662B # -0x422A 0x662C # -0x422B 0x662E # -0x422C 0x6630 # -0x422D 0x6631 # -0x422E 0x6633 # -0x422F 0x6639 # -0x4230 0x6637 # -0x4231 0x6640 # -0x4232 0x6645 # -0x4233 0x6646 # -0x4234 0x664A # -0x4235 0x664C # -0x4236 0x6651 # -0x4237 0x664E # -0x4238 0x6657 # -0x4239 0x6658 # -0x423A 0x6659 # -0x423B 0x665B # -0x423C 0x665C # -0x423D 0x6660 # -0x423E 0x6661 # -0x423F 0x66FB # -0x4240 0x666A # -0x4241 0x666B # -0x4242 0x666C # -0x4243 0x667E # -0x4244 0x6673 # -0x4245 0x6675 # -0x4246 0x667F # -0x4247 0x6677 # -0x4248 0x6678 # -0x4249 0x6679 # -0x424A 0x667B # -0x424B 0x6680 # -0x424C 0x667C # -0x424D 0x668B # -0x424E 0x668C # -0x424F 0x668D # -0x4250 0x6690 # -0x4251 0x6692 # -0x4252 0x6699 # -0x4253 0x669A # -0x4254 0x669B # -0x4255 0x669C # -0x4256 0x669F # -0x4257 0x66A0 # -0x4258 0x66A4 # -0x4259 0x66AD # -0x425A 0x66B1 # -0x425B 0x66B2 # -0x425C 0x66B5 # -0x425D 0x66BB # -0x425E 0x66BF # -0x425F 0x66C0 # -0x4260 0x66C2 # -0x4261 0x66C3 # -0x4262 0x66C8 # -0x4263 0x66CC # -0x4264 0x66CE # -0x4265 0x66CF # -0x4266 0x66D4 # -0x4267 0x66DB # -0x4268 0x66DF # -0x4269 0x66E8 # -0x426A 0x66EB # -0x426B 0x66EC # -0x426C 0x66EE # -0x426D 0x66FA # -0x426E 0x6705 # -0x426F 0x6707 # -0x4270 0x670E # -0x4271 0x6713 # -0x4272 0x6719 # -0x4273 0x671C # -0x4274 0x6720 # -0x4275 0x6722 # -0x4276 0x6733 # -0x4277 0x673E # -0x4278 0x6745 # -0x4279 0x6747 # -0x427A 0x6748 # -0x427B 0x674C # -0x427C 0x6754 # -0x427D 0x6755 # -0x427E 0x675D # -0x4321 0x6766 # -0x4322 0x676C # -0x4323 0x676E # -0x4324 0x6774 # -0x4325 0x6776 # -0x4326 0x677B # -0x4327 0x6781 # -0x4328 0x6784 # -0x4329 0x678E # -0x432A 0x678F # -0x432B 0x6791 # -0x432C 0x6793 # -0x432D 0x6796 # -0x432E 0x6798 # -0x432F 0x6799 # -0x4330 0x679B # -0x4331 0x67B0 # -0x4332 0x67B1 # -0x4333 0x67B2 # -0x4334 0x67B5 # -0x4335 0x67BB # -0x4336 0x67BC # -0x4337 0x67BD # -0x4338 0x67F9 # -0x4339 0x67C0 # -0x433A 0x67C2 # -0x433B 0x67C3 # -0x433C 0x67C5 # -0x433D 0x67C8 # -0x433E 0x67C9 # -0x433F 0x67D2 # -0x4340 0x67D7 # -0x4341 0x67D9 # -0x4342 0x67DC # -0x4343 0x67E1 # -0x4344 0x67E6 # -0x4345 0x67F0 # -0x4346 0x67F2 # -0x4347 0x67F6 # -0x4348 0x67F7 # -0x4349 0x6852 # -0x434A 0x6814 # -0x434B 0x6819 # -0x434C 0x681D # -0x434D 0x681F # -0x434E 0x6828 # -0x434F 0x6827 # -0x4350 0x682C # -0x4351 0x682D # -0x4352 0x682F # -0x4353 0x6830 # -0x4354 0x6831 # -0x4355 0x6833 # -0x4356 0x683B # -0x4357 0x683F # -0x4358 0x6844 # -0x4359 0x6845 # -0x435A 0x684A # -0x435B 0x684C # -0x435C 0x6855 # -0x435D 0x6857 # -0x435E 0x6858 # -0x435F 0x685B # -0x4360 0x686B # -0x4361 0x686E # -0x4362 0x686F # -0x4363 0x6870 # -0x4364 0x6871 # -0x4365 0x6872 # -0x4366 0x6875 # -0x4367 0x6879 # -0x4368 0x687A # -0x4369 0x687B # -0x436A 0x687C # -0x436B 0x6882 # -0x436C 0x6884 # -0x436D 0x6886 # -0x436E 0x6888 # -0x436F 0x6896 # -0x4370 0x6898 # -0x4371 0x689A # -0x4372 0x689C # -0x4373 0x68A1 # -0x4374 0x68A3 # -0x4375 0x68A5 # -0x4376 0x68A9 # -0x4377 0x68AA # -0x4378 0x68AE # -0x4379 0x68B2 # -0x437A 0x68BB # -0x437B 0x68C5 # -0x437C 0x68C8 # -0x437D 0x68CC # -0x437E 0x68CF # -0x4421 0x68D0 # -0x4422 0x68D1 # -0x4423 0x68D3 # -0x4424 0x68D6 # -0x4425 0x68D9 # -0x4426 0x68DC # -0x4427 0x68DD # -0x4428 0x68E5 # -0x4429 0x68E8 # -0x442A 0x68EA # -0x442B 0x68EB # -0x442C 0x68EC # -0x442D 0x68ED # -0x442E 0x68F0 # -0x442F 0x68F1 # -0x4430 0x68F5 # -0x4431 0x68F6 # -0x4432 0x68FB # -0x4433 0x68FC # -0x4434 0x68FD # -0x4435 0x6906 # -0x4436 0x6909 # -0x4437 0x690A # -0x4438 0x6910 # -0x4439 0x6911 # -0x443A 0x6913 # -0x443B 0x6916 # -0x443C 0x6917 # -0x443D 0x6931 # -0x443E 0x6933 # -0x443F 0x6935 # -0x4440 0x6938 # -0x4441 0x693B # -0x4442 0x6942 # -0x4443 0x6945 # -0x4444 0x6949 # -0x4445 0x694E # -0x4446 0x6957 # -0x4447 0x695B # -0x4448 0x6963 # -0x4449 0x6964 # -0x444A 0x6965 # -0x444B 0x6966 # -0x444C 0x6968 # -0x444D 0x6969 # -0x444E 0x696C # -0x444F 0x6970 # -0x4450 0x6971 # -0x4451 0x6972 # -0x4452 0x697A # -0x4453 0x697B # -0x4454 0x697F # -0x4455 0x6980 # -0x4456 0x698D # -0x4457 0x6992 # -0x4458 0x6996 # -0x4459 0x6998 # -0x445A 0x69A1 # -0x445B 0x69A5 # -0x445C 0x69A6 # -0x445D 0x69A8 # -0x445E 0x69AB # -0x445F 0x69AD # -0x4460 0x69AF # -0x4461 0x69B7 # -0x4462 0x69B8 # -0x4463 0x69BA # -0x4464 0x69BC # -0x4465 0x69C5 # -0x4466 0x69C8 # -0x4467 0x69D1 # -0x4468 0x69D6 # -0x4469 0x69D7 # -0x446A 0x69E2 # -0x446B 0x69E5 # -0x446C 0x69EE # -0x446D 0x69EF # -0x446E 0x69F1 # -0x446F 0x69F3 # -0x4470 0x69F5 # -0x4471 0x69FE # -0x4472 0x6A00 # -0x4473 0x6A01 # -0x4474 0x6A03 # -0x4475 0x6A0F # -0x4476 0x6A11 # -0x4477 0x6A15 # -0x4478 0x6A1A # -0x4479 0x6A1D # -0x447A 0x6A20 # -0x447B 0x6A24 # -0x447C 0x6A28 # -0x447D 0x6A30 # -0x447E 0x6A32 # -0x4521 0x6A34 # -0x4522 0x6A37 # -0x4523 0x6A3B # -0x4524 0x6A3E # -0x4525 0x6A3F # -0x4526 0x6A45 # -0x4527 0x6A46 # -0x4528 0x6A49 # -0x4529 0x6A4A # -0x452A 0x6A4E # -0x452B 0x6A50 # -0x452C 0x6A51 # -0x452D 0x6A52 # -0x452E 0x6A55 # -0x452F 0x6A56 # -0x4530 0x6A5B # -0x4531 0x6A64 # -0x4532 0x6A67 # -0x4533 0x6A6A # -0x4534 0x6A71 # -0x4535 0x6A73 # -0x4536 0x6A7E # -0x4537 0x6A81 # -0x4538 0x6A83 # -0x4539 0x6A86 # -0x453A 0x6A87 # -0x453B 0x6A89 # -0x453C 0x6A8B # -0x453D 0x6A91 # -0x453E 0x6A9B # -0x453F 0x6A9D # -0x4540 0x6A9E # -0x4541 0x6A9F # -0x4542 0x6AA5 # -0x4543 0x6AAB # -0x4544 0x6AAF # -0x4545 0x6AB0 # -0x4546 0x6AB1 # -0x4547 0x6AB4 # -0x4548 0x6ABD # -0x4549 0x6ABE # -0x454A 0x6ABF # -0x454B 0x6AC6 # -0x454C 0x6AC9 # -0x454D 0x6AC8 # -0x454E 0x6ACC # -0x454F 0x6AD0 # -0x4550 0x6AD4 # -0x4551 0x6AD5 # -0x4552 0x6AD6 # -0x4553 0x6ADC # -0x4554 0x6ADD # -0x4555 0x6AE4 # -0x4556 0x6AE7 # -0x4557 0x6AEC # -0x4558 0x6AF0 # -0x4559 0x6AF1 # -0x455A 0x6AF2 # -0x455B 0x6AFC # -0x455C 0x6AFD # -0x455D 0x6B02 # -0x455E 0x6B03 # -0x455F 0x6B06 # -0x4560 0x6B07 # -0x4561 0x6B09 # -0x4562 0x6B0F # -0x4563 0x6B10 # -0x4564 0x6B11 # -0x4565 0x6B17 # -0x4566 0x6B1B # -0x4567 0x6B1E # -0x4568 0x6B24 # -0x4569 0x6B28 # -0x456A 0x6B2B # -0x456B 0x6B2C # -0x456C 0x6B2F # -0x456D 0x6B35 # -0x456E 0x6B36 # -0x456F 0x6B3B # -0x4570 0x6B3F # -0x4571 0x6B46 # -0x4572 0x6B4A # -0x4573 0x6B4D # -0x4574 0x6B52 # -0x4575 0x6B56 # -0x4576 0x6B58 # -0x4577 0x6B5D # -0x4578 0x6B60 # -0x4579 0x6B67 # -0x457A 0x6B6B # -0x457B 0x6B6E # -0x457C 0x6B70 # -0x457D 0x6B75 # -0x457E 0x6B7D # -0x4621 0x6B7E # -0x4622 0x6B82 # -0x4623 0x6B85 # -0x4624 0x6B97 # -0x4625 0x6B9B # -0x4626 0x6B9F # -0x4627 0x6BA0 # -0x4628 0x6BA2 # -0x4629 0x6BA3 # -0x462A 0x6BA8 # -0x462B 0x6BA9 # -0x462C 0x6BAC # -0x462D 0x6BAD # -0x462E 0x6BAE # -0x462F 0x6BB0 # -0x4630 0x6BB8 # -0x4631 0x6BB9 # -0x4632 0x6BBD # -0x4633 0x6BBE # -0x4634 0x6BC3 # -0x4635 0x6BC4 # -0x4636 0x6BC9 # -0x4637 0x6BCC # -0x4638 0x6BD6 # -0x4639 0x6BDA # -0x463A 0x6BE1 # -0x463B 0x6BE3 # -0x463C 0x6BE6 # -0x463D 0x6BE7 # -0x463E 0x6BEE # -0x463F 0x6BF1 # -0x4640 0x6BF7 # -0x4641 0x6BF9 # -0x4642 0x6BFF # -0x4643 0x6C02 # -0x4644 0x6C04 # -0x4645 0x6C05 # -0x4646 0x6C09 # -0x4647 0x6C0D # -0x4648 0x6C0E # -0x4649 0x6C10 # -0x464A 0x6C12 # -0x464B 0x6C19 # -0x464C 0x6C1F # -0x464D 0x6C26 # -0x464E 0x6C27 # -0x464F 0x6C28 # -0x4650 0x6C2C # -0x4651 0x6C2E # -0x4652 0x6C33 # -0x4653 0x6C35 # -0x4654 0x6C36 # -0x4655 0x6C3A # -0x4656 0x6C3B # -0x4657 0x6C3F # -0x4658 0x6C4A # -0x4659 0x6C4B # -0x465A 0x6C4D # -0x465B 0x6C4F # -0x465C 0x6C52 # -0x465D 0x6C54 # -0x465E 0x6C59 # -0x465F 0x6C5B # -0x4660 0x6C5C # -0x4661 0x6C6B # -0x4662 0x6C6D # -0x4663 0x6C6F # -0x4664 0x6C74 # -0x4665 0x6C76 # -0x4666 0x6C78 # -0x4667 0x6C79 # -0x4668 0x6C7B # -0x4669 0x6C85 # -0x466A 0x6C86 # -0x466B 0x6C87 # -0x466C 0x6C89 # -0x466D 0x6C94 # -0x466E 0x6C95 # -0x466F 0x6C97 # -0x4670 0x6C98 # -0x4671 0x6C9C # -0x4672 0x6C9F # -0x4673 0x6CB0 # -0x4674 0x6CB2 # -0x4675 0x6CB4 # -0x4676 0x6CC2 # -0x4677 0x6CC6 # -0x4678 0x6CCD # -0x4679 0x6CCF # -0x467A 0x6CD0 # -0x467B 0x6CD1 # -0x467C 0x6CD2 # -0x467D 0x6CD4 # -0x467E 0x6CD6 # -0x4721 0x6CDA # -0x4722 0x6CDC # -0x4723 0x6CE0 # -0x4724 0x6CE7 # -0x4725 0x6CE9 # -0x4726 0x6CEB # -0x4727 0x6CEC # -0x4728 0x6CEE # -0x4729 0x6CF2 # -0x472A 0x6CF4 # -0x472B 0x6D04 # -0x472C 0x6D07 # -0x472D 0x6D0A # -0x472E 0x6D0E # -0x472F 0x6D0F # -0x4730 0x6D11 # -0x4731 0x6D13 # -0x4732 0x6D1A # -0x4733 0x6D26 # -0x4734 0x6D27 # -0x4735 0x6D28 # -0x4736 0x6C67 # -0x4737 0x6D2E # -0x4738 0x6D2F # -0x4739 0x6D31 # -0x473A 0x6D39 # -0x473B 0x6D3C # -0x473C 0x6D3F # -0x473D 0x6D57 # -0x473E 0x6D5E # -0x473F 0x6D5F # -0x4740 0x6D61 # -0x4741 0x6D65 # -0x4742 0x6D67 # -0x4743 0x6D6F # -0x4744 0x6D70 # -0x4745 0x6D7C # -0x4746 0x6D82 # -0x4747 0x6D87 # -0x4748 0x6D91 # -0x4749 0x6D92 # -0x474A 0x6D94 # -0x474B 0x6D96 # -0x474C 0x6D97 # -0x474D 0x6D98 # -0x474E 0x6DAA # -0x474F 0x6DAC # -0x4750 0x6DB4 # -0x4751 0x6DB7 # -0x4752 0x6DB9 # -0x4753 0x6DBD # -0x4754 0x6DBF # -0x4755 0x6DC4 # -0x4756 0x6DC8 # -0x4757 0x6DCA # -0x4758 0x6DCE # -0x4759 0x6DCF # -0x475A 0x6DD6 # -0x475B 0x6DDB # -0x475C 0x6DDD # -0x475D 0x6DDF # -0x475E 0x6DE0 # -0x475F 0x6DE2 # -0x4760 0x6DE5 # -0x4761 0x6DE9 # -0x4762 0x6DEF # -0x4763 0x6DF0 # -0x4764 0x6DF4 # -0x4765 0x6DF6 # -0x4766 0x6DFC # -0x4767 0x6E00 # -0x4768 0x6E04 # -0x4769 0x6E1E # -0x476A 0x6E22 # -0x476B 0x6E27 # -0x476C 0x6E32 # -0x476D 0x6E36 # -0x476E 0x6E39 # -0x476F 0x6E3B # -0x4770 0x6E3C # -0x4771 0x6E44 # -0x4772 0x6E45 # -0x4773 0x6E48 # -0x4774 0x6E49 # -0x4775 0x6E4B # -0x4776 0x6E4F # -0x4777 0x6E51 # -0x4778 0x6E52 # -0x4779 0x6E53 # -0x477A 0x6E54 # -0x477B 0x6E57 # -0x477C 0x6E5C # -0x477D 0x6E5D # -0x477E 0x6E5E # -0x4821 0x6E62 # -0x4822 0x6E63 # -0x4823 0x6E68 # -0x4824 0x6E73 # -0x4825 0x6E7B # -0x4826 0x6E7D # -0x4827 0x6E8D # -0x4828 0x6E93 # -0x4829 0x6E99 # -0x482A 0x6EA0 # -0x482B 0x6EA7 # -0x482C 0x6EAD # -0x482D 0x6EAE # -0x482E 0x6EB1 # -0x482F 0x6EB3 # -0x4830 0x6EBB # -0x4831 0x6EBF # -0x4832 0x6EC0 # -0x4833 0x6EC1 # -0x4834 0x6EC3 # -0x4835 0x6EC7 # -0x4836 0x6EC8 # -0x4837 0x6ECA # -0x4838 0x6ECD # -0x4839 0x6ECE # -0x483A 0x6ECF # -0x483B 0x6EEB # -0x483C 0x6EED # -0x483D 0x6EEE # -0x483E 0x6EF9 # -0x483F 0x6EFB # -0x4840 0x6EFD # -0x4841 0x6F04 # -0x4842 0x6F08 # -0x4843 0x6F0A # -0x4844 0x6F0C # -0x4845 0x6F0D # -0x4846 0x6F16 # -0x4847 0x6F18 # -0x4848 0x6F1A # -0x4849 0x6F1B # -0x484A 0x6F26 # -0x484B 0x6F29 # -0x484C 0x6F2A # -0x484D 0x6F2F # -0x484E 0x6F30 # -0x484F 0x6F33 # -0x4850 0x6F36 # -0x4851 0x6F3B # -0x4852 0x6F3C # -0x4853 0x6F2D # -0x4854 0x6F4F # -0x4855 0x6F51 # -0x4856 0x6F52 # -0x4857 0x6F53 # -0x4858 0x6F57 # -0x4859 0x6F59 # -0x485A 0x6F5A # -0x485B 0x6F5D # -0x485C 0x6F5E # -0x485D 0x6F61 # -0x485E 0x6F62 # -0x485F 0x6F68 # -0x4860 0x6F6C # -0x4861 0x6F7D # -0x4862 0x6F7E # -0x4863 0x6F83 # -0x4864 0x6F87 # -0x4865 0x6F88 # -0x4866 0x6F8B # -0x4867 0x6F8C # -0x4868 0x6F8D # -0x4869 0x6F90 # -0x486A 0x6F92 # -0x486B 0x6F93 # -0x486C 0x6F94 # -0x486D 0x6F96 # -0x486E 0x6F9A # -0x486F 0x6F9F # -0x4870 0x6FA0 # -0x4871 0x6FA5 # -0x4872 0x6FA6 # -0x4873 0x6FA7 # -0x4874 0x6FA8 # -0x4875 0x6FAE # -0x4876 0x6FAF # -0x4877 0x6FB0 # -0x4878 0x6FB5 # -0x4879 0x6FB6 # -0x487A 0x6FBC # -0x487B 0x6FC5 # -0x487C 0x6FC7 # -0x487D 0x6FC8 # -0x487E 0x6FCA # -0x4921 0x6FDA # -0x4922 0x6FDE # -0x4923 0x6FE8 # -0x4924 0x6FE9 # -0x4925 0x6FF0 # -0x4926 0x6FF5 # -0x4927 0x6FF9 # -0x4928 0x6FFC # -0x4929 0x6FFD # -0x492A 0x7000 # -0x492B 0x7005 # -0x492C 0x7006 # -0x492D 0x7007 # -0x492E 0x700D # -0x492F 0x7017 # -0x4930 0x7020 # -0x4931 0x7023 # -0x4932 0x702F # -0x4933 0x7034 # -0x4934 0x7037 # -0x4935 0x7039 # -0x4936 0x703C # -0x4937 0x7043 # -0x4938 0x7044 # -0x4939 0x7048 # -0x493A 0x7049 # -0x493B 0x704A # -0x493C 0x704B # -0x493D 0x7054 # -0x493E 0x7055 # -0x493F 0x705D # -0x4940 0x705E # -0x4941 0x704E # -0x4942 0x7064 # -0x4943 0x7065 # -0x4944 0x706C # -0x4945 0x706E # -0x4946 0x7075 # -0x4947 0x7076 # -0x4948 0x707E # -0x4949 0x7081 # -0x494A 0x7085 # -0x494B 0x7086 # -0x494C 0x7094 # -0x494D 0x7095 # -0x494E 0x7096 # -0x494F 0x7097 # -0x4950 0x7098 # -0x4951 0x709B # -0x4952 0x70A4 # -0x4953 0x70AB # -0x4954 0x70B0 # -0x4955 0x70B1 # -0x4956 0x70B4 # -0x4957 0x70B7 # -0x4958 0x70CA # -0x4959 0x70D1 # -0x495A 0x70D3 # -0x495B 0x70D4 # -0x495C 0x70D5 # -0x495D 0x70D6 # -0x495E 0x70D8 # -0x495F 0x70DC # -0x4960 0x70E4 # -0x4961 0x70FA # -0x4962 0x7103 # -0x4963 0x7104 # -0x4964 0x7105 # -0x4965 0x7106 # -0x4966 0x7107 # -0x4967 0x710B # -0x4968 0x710C # -0x4969 0x710F # -0x496A 0x711E # -0x496B 0x7120 # -0x496C 0x712B # -0x496D 0x712D # -0x496E 0x712F # -0x496F 0x7130 # -0x4970 0x7131 # -0x4971 0x7138 # -0x4972 0x7141 # -0x4973 0x7145 # -0x4974 0x7146 # -0x4975 0x7147 # -0x4976 0x714A # -0x4977 0x714B # -0x4978 0x7150 # -0x4979 0x7152 # -0x497A 0x7157 # -0x497B 0x715A # -0x497C 0x715C # -0x497D 0x715E # -0x497E 0x7160 # -0x4A21 0x7168 # -0x4A22 0x7179 # -0x4A23 0x7180 # -0x4A24 0x7185 # -0x4A25 0x7187 # -0x4A26 0x718C # -0x4A27 0x7192 # -0x4A28 0x719A # -0x4A29 0x719B # -0x4A2A 0x71A0 # -0x4A2B 0x71A2 # -0x4A2C 0x71AF # -0x4A2D 0x71B0 # -0x4A2E 0x71B2 # -0x4A2F 0x71B3 # -0x4A30 0x71BA # -0x4A31 0x71BF # -0x4A32 0x71C0 # -0x4A33 0x71C1 # -0x4A34 0x71C4 # -0x4A35 0x71CB # -0x4A36 0x71CC # -0x4A37 0x71D3 # -0x4A38 0x71D6 # -0x4A39 0x71D9 # -0x4A3A 0x71DA # -0x4A3B 0x71DC # -0x4A3C 0x71F8 # -0x4A3D 0x71FE # -0x4A3E 0x7200 # -0x4A3F 0x7207 # -0x4A40 0x7208 # -0x4A41 0x7209 # -0x4A42 0x7213 # -0x4A43 0x7217 # -0x4A44 0x721A # -0x4A45 0x721D # -0x4A46 0x721F # -0x4A47 0x7224 # -0x4A48 0x722B # -0x4A49 0x722F # -0x4A4A 0x7234 # -0x4A4B 0x7238 # -0x4A4C 0x7239 # -0x4A4D 0x7241 # -0x4A4E 0x7242 # -0x4A4F 0x7243 # -0x4A50 0x7245 # -0x4A51 0x724E # -0x4A52 0x724F # -0x4A53 0x7250 # -0x4A54 0x7253 # -0x4A55 0x7255 # -0x4A56 0x7256 # -0x4A57 0x725A # -0x4A58 0x725C # -0x4A59 0x725E # -0x4A5A 0x7260 # -0x4A5B 0x7263 # -0x4A5C 0x7268 # -0x4A5D 0x726B # -0x4A5E 0x726E # -0x4A5F 0x726F # -0x4A60 0x7271 # -0x4A61 0x7277 # -0x4A62 0x7278 # -0x4A63 0x727B # -0x4A64 0x727C # -0x4A65 0x727F # -0x4A66 0x7284 # -0x4A67 0x7289 # -0x4A68 0x728D # -0x4A69 0x728E # -0x4A6A 0x7293 # -0x4A6B 0x729B # -0x4A6C 0x72A8 # -0x4A6D 0x72AD # -0x4A6E 0x72AE # -0x4A6F 0x72B1 # -0x4A70 0x72B4 # -0x4A71 0x72BE # -0x4A72 0x72C1 # -0x4A73 0x72C7 # -0x4A74 0x72C9 # -0x4A75 0x72CC # -0x4A76 0x72D5 # -0x4A77 0x72D6 # -0x4A78 0x72D8 # -0x4A79 0x72DF # -0x4A7A 0x72E5 # -0x4A7B 0x72F3 # -0x4A7C 0x72F4 # -0x4A7D 0x72FA # -0x4A7E 0x72FB # -0x4B21 0x72FE # -0x4B22 0x7302 # -0x4B23 0x7304 # -0x4B24 0x7305 # -0x4B25 0x7307 # -0x4B26 0x730B # -0x4B27 0x730D # -0x4B28 0x7312 # -0x4B29 0x7313 # -0x4B2A 0x7318 # -0x4B2B 0x7319 # -0x4B2C 0x731E # -0x4B2D 0x7322 # -0x4B2E 0x7324 # -0x4B2F 0x7327 # -0x4B30 0x7328 # -0x4B31 0x732C # -0x4B32 0x7331 # -0x4B33 0x7332 # -0x4B34 0x7335 # -0x4B35 0x733A # -0x4B36 0x733B # -0x4B37 0x733D # -0x4B38 0x7343 # -0x4B39 0x734D # -0x4B3A 0x7350 # -0x4B3B 0x7352 # -0x4B3C 0x7356 # -0x4B3D 0x7358 # -0x4B3E 0x735D # -0x4B3F 0x735E # -0x4B40 0x735F # -0x4B41 0x7360 # -0x4B42 0x7366 # -0x4B43 0x7367 # -0x4B44 0x7369 # -0x4B45 0x736B # -0x4B46 0x736C # -0x4B47 0x736E # -0x4B48 0x736F # -0x4B49 0x7371 # -0x4B4A 0x7377 # -0x4B4B 0x7379 # -0x4B4C 0x737C # -0x4B4D 0x7380 # -0x4B4E 0x7381 # -0x4B4F 0x7383 # -0x4B50 0x7385 # -0x4B51 0x7386 # -0x4B52 0x738E # -0x4B53 0x7390 # -0x4B54 0x7393 # -0x4B55 0x7395 # -0x4B56 0x7397 # -0x4B57 0x7398 # -0x4B58 0x739C # -0x4B59 0x739E # -0x4B5A 0x739F # -0x4B5B 0x73A0 # -0x4B5C 0x73A2 # -0x4B5D 0x73A5 # -0x4B5E 0x73A6 # -0x4B5F 0x73AA # -0x4B60 0x73AB # -0x4B61 0x73AD # -0x4B62 0x73B5 # -0x4B63 0x73B7 # -0x4B64 0x73B9 # -0x4B65 0x73BC # -0x4B66 0x73BD # -0x4B67 0x73BF # -0x4B68 0x73C5 # -0x4B69 0x73C6 # -0x4B6A 0x73C9 # -0x4B6B 0x73CB # -0x4B6C 0x73CC # -0x4B6D 0x73CF # -0x4B6E 0x73D2 # -0x4B6F 0x73D3 # -0x4B70 0x73D6 # -0x4B71 0x73D9 # -0x4B72 0x73DD # -0x4B73 0x73E1 # -0x4B74 0x73E3 # -0x4B75 0x73E6 # -0x4B76 0x73E7 # -0x4B77 0x73E9 # -0x4B78 0x73F4 # -0x4B79 0x73F5 # -0x4B7A 0x73F7 # -0x4B7B 0x73F9 # -0x4B7C 0x73FA # -0x4B7D 0x73FB # -0x4B7E 0x73FD # -0x4C21 0x73FF # -0x4C22 0x7400 # -0x4C23 0x7401 # -0x4C24 0x7404 # -0x4C25 0x7407 # -0x4C26 0x740A # -0x4C27 0x7411 # -0x4C28 0x741A # -0x4C29 0x741B # -0x4C2A 0x7424 # -0x4C2B 0x7426 # -0x4C2C 0x7428 # -0x4C2D 0x7429 # -0x4C2E 0x742A # -0x4C2F 0x742B # -0x4C30 0x742C # -0x4C31 0x742D # -0x4C32 0x742E # -0x4C33 0x742F # -0x4C34 0x7430 # -0x4C35 0x7431 # -0x4C36 0x7439 # -0x4C37 0x7440 # -0x4C38 0x7443 # -0x4C39 0x7444 # -0x4C3A 0x7446 # -0x4C3B 0x7447 # -0x4C3C 0x744B # -0x4C3D 0x744D # -0x4C3E 0x7451 # -0x4C3F 0x7452 # -0x4C40 0x7457 # -0x4C41 0x745D # -0x4C42 0x7462 # -0x4C43 0x7466 # -0x4C44 0x7467 # -0x4C45 0x7468 # -0x4C46 0x746B # -0x4C47 0x746D # -0x4C48 0x746E # -0x4C49 0x7471 # -0x4C4A 0x7472 # -0x4C4B 0x7480 # -0x4C4C 0x7481 # -0x4C4D 0x7485 # -0x4C4E 0x7486 # -0x4C4F 0x7487 # -0x4C50 0x7489 # -0x4C51 0x748F # -0x4C52 0x7490 # -0x4C53 0x7491 # -0x4C54 0x7492 # -0x4C55 0x7498 # -0x4C56 0x7499 # -0x4C57 0x749A # -0x4C58 0x749C # -0x4C59 0x749F # -0x4C5A 0x74A0 # -0x4C5B 0x74A1 # -0x4C5C 0x74A3 # -0x4C5D 0x74A6 # -0x4C5E 0x74A8 # -0x4C5F 0x74A9 # -0x4C60 0x74AA # -0x4C61 0x74AB # -0x4C62 0x74AE # -0x4C63 0x74AF # -0x4C64 0x74B1 # -0x4C65 0x74B2 # -0x4C66 0x74B5 # -0x4C67 0x74B9 # -0x4C68 0x74BB # -0x4C69 0x74BF # -0x4C6A 0x74C8 # -0x4C6B 0x74C9 # -0x4C6C 0x74CC # -0x4C6D 0x74D0 # -0x4C6E 0x74D3 # -0x4C6F 0x74D8 # -0x4C70 0x74DA # -0x4C71 0x74DB # -0x4C72 0x74DE # -0x4C73 0x74DF # -0x4C74 0x74E4 # -0x4C75 0x74E8 # -0x4C76 0x74EA # -0x4C77 0x74EB # -0x4C78 0x74EF # -0x4C79 0x74F4 # -0x4C7A 0x74FA # -0x4C7B 0x74FB # -0x4C7C 0x74FC # -0x4C7D 0x74FF # -0x4C7E 0x7506 # -0x4D21 0x7512 # -0x4D22 0x7516 # -0x4D23 0x7517 # -0x4D24 0x7520 # -0x4D25 0x7521 # -0x4D26 0x7524 # -0x4D27 0x7527 # -0x4D28 0x7529 # -0x4D29 0x752A # -0x4D2A 0x752F # -0x4D2B 0x7536 # -0x4D2C 0x7539 # -0x4D2D 0x753D # -0x4D2E 0x753E # -0x4D2F 0x753F # -0x4D30 0x7540 # -0x4D31 0x7543 # -0x4D32 0x7547 # -0x4D33 0x7548 # -0x4D34 0x754E # -0x4D35 0x7550 # -0x4D36 0x7552 # -0x4D37 0x7557 # -0x4D38 0x755E # -0x4D39 0x755F # -0x4D3A 0x7561 # -0x4D3B 0x756F # -0x4D3C 0x7571 # -0x4D3D 0x7579 # -0x4D3E 0x757A # -0x4D3F 0x757B # -0x4D40 0x757C # -0x4D41 0x757D # -0x4D42 0x757E # -0x4D43 0x7581 # -0x4D44 0x7585 # -0x4D45 0x7590 # -0x4D46 0x7592 # -0x4D47 0x7593 # -0x4D48 0x7595 # -0x4D49 0x7599 # -0x4D4A 0x759C # -0x4D4B 0x75A2 # -0x4D4C 0x75A4 # -0x4D4D 0x75B4 # -0x4D4E 0x75BA # -0x4D4F 0x75BF # -0x4D50 0x75C0 # -0x4D51 0x75C1 # -0x4D52 0x75C4 # -0x4D53 0x75C6 # -0x4D54 0x75CC # -0x4D55 0x75CE # -0x4D56 0x75CF # -0x4D57 0x75D7 # -0x4D58 0x75DC # -0x4D59 0x75DF # -0x4D5A 0x75E0 # -0x4D5B 0x75E1 # -0x4D5C 0x75E4 # -0x4D5D 0x75E7 # -0x4D5E 0x75EC # -0x4D5F 0x75EE # -0x4D60 0x75EF # -0x4D61 0x75F1 # -0x4D62 0x75F9 # -0x4D63 0x7600 # -0x4D64 0x7602 # -0x4D65 0x7603 # -0x4D66 0x7604 # -0x4D67 0x7607 # -0x4D68 0x7608 # -0x4D69 0x760A # -0x4D6A 0x760C # -0x4D6B 0x760F # -0x4D6C 0x7612 # -0x4D6D 0x7613 # -0x4D6E 0x7615 # -0x4D6F 0x7616 # -0x4D70 0x7619 # -0x4D71 0x761B # -0x4D72 0x761C # -0x4D73 0x761D # -0x4D74 0x761E # -0x4D75 0x7623 # -0x4D76 0x7625 # -0x4D77 0x7626 # -0x4D78 0x7629 # -0x4D79 0x762D # -0x4D7A 0x7632 # -0x4D7B 0x7633 # -0x4D7C 0x7635 # -0x4D7D 0x7638 # -0x4D7E 0x7639 # -0x4E21 0x763A # -0x4E22 0x763C # -0x4E23 0x764A # -0x4E24 0x7640 # -0x4E25 0x7641 # -0x4E26 0x7643 # -0x4E27 0x7644 # -0x4E28 0x7645 # -0x4E29 0x7649 # -0x4E2A 0x764B # -0x4E2B 0x7655 # -0x4E2C 0x7659 # -0x4E2D 0x765F # -0x4E2E 0x7664 # -0x4E2F 0x7665 # -0x4E30 0x766D # -0x4E31 0x766E # -0x4E32 0x766F # -0x4E33 0x7671 # -0x4E34 0x7674 # -0x4E35 0x7681 # -0x4E36 0x7685 # -0x4E37 0x768C # -0x4E38 0x768D # -0x4E39 0x7695 # -0x4E3A 0x769B # -0x4E3B 0x769C # -0x4E3C 0x769D # -0x4E3D 0x769F # -0x4E3E 0x76A0 # -0x4E3F 0x76A2 # -0x4E40 0x76A3 # -0x4E41 0x76A4 # -0x4E42 0x76A5 # -0x4E43 0x76A6 # -0x4E44 0x76A7 # -0x4E45 0x76A8 # -0x4E46 0x76AA # -0x4E47 0x76AD # -0x4E48 0x76BD # -0x4E49 0x76C1 # -0x4E4A 0x76C5 # -0x4E4B 0x76C9 # -0x4E4C 0x76CB # -0x4E4D 0x76CC # -0x4E4E 0x76CE # -0x4E4F 0x76D4 # -0x4E50 0x76D9 # -0x4E51 0x76E0 # -0x4E52 0x76E6 # -0x4E53 0x76E8 # -0x4E54 0x76EC # -0x4E55 0x76F0 # -0x4E56 0x76F1 # -0x4E57 0x76F6 # -0x4E58 0x76F9 # -0x4E59 0x76FC # -0x4E5A 0x7700 # -0x4E5B 0x7706 # -0x4E5C 0x770A # -0x4E5D 0x770E # -0x4E5E 0x7712 # -0x4E5F 0x7714 # -0x4E60 0x7715 # -0x4E61 0x7717 # -0x4E62 0x7719 # -0x4E63 0x771A # -0x4E64 0x771C # -0x4E65 0x7722 # -0x4E66 0x7728 # -0x4E67 0x772D # -0x4E68 0x772E # -0x4E69 0x772F # -0x4E6A 0x7734 # -0x4E6B 0x7735 # -0x4E6C 0x7736 # -0x4E6D 0x7739 # -0x4E6E 0x773D # -0x4E6F 0x773E # -0x4E70 0x7742 # -0x4E71 0x7745 # -0x4E72 0x7746 # -0x4E73 0x774A # -0x4E74 0x774D # -0x4E75 0x774E # -0x4E76 0x774F # -0x4E77 0x7752 # -0x4E78 0x7756 # -0x4E79 0x7757 # -0x4E7A 0x775C # -0x4E7B 0x775E # -0x4E7C 0x775F # -0x4E7D 0x7760 # -0x4E7E 0x7762 # -0x4F21 0x7764 # -0x4F22 0x7767 # -0x4F23 0x776A # -0x4F24 0x776C # -0x4F25 0x7770 # -0x4F26 0x7772 # -0x4F27 0x7773 # -0x4F28 0x7774 # -0x4F29 0x777A # -0x4F2A 0x777D # -0x4F2B 0x7780 # -0x4F2C 0x7784 # -0x4F2D 0x778C # -0x4F2E 0x778D # -0x4F2F 0x7794 # -0x4F30 0x7795 # -0x4F31 0x7796 # -0x4F32 0x779A # -0x4F33 0x779F # -0x4F34 0x77A2 # -0x4F35 0x77A7 # -0x4F36 0x77AA # -0x4F37 0x77AE # -0x4F38 0x77AF # -0x4F39 0x77B1 # -0x4F3A 0x77B5 # -0x4F3B 0x77BE # -0x4F3C 0x77C3 # -0x4F3D 0x77C9 # -0x4F3E 0x77D1 # -0x4F3F 0x77D2 # -0x4F40 0x77D5 # -0x4F41 0x77D9 # -0x4F42 0x77DE # -0x4F43 0x77DF # -0x4F44 0x77E0 # -0x4F45 0x77E4 # -0x4F46 0x77E6 # -0x4F47 0x77EA # -0x4F48 0x77EC # -0x4F49 0x77F0 # -0x4F4A 0x77F1 # -0x4F4B 0x77F4 # -0x4F4C 0x77F8 # -0x4F4D 0x77FB # -0x4F4E 0x7805 # -0x4F4F 0x7806 # -0x4F50 0x7809 # -0x4F51 0x780D # -0x4F52 0x780E # -0x4F53 0x7811 # -0x4F54 0x781D # -0x4F55 0x7821 # -0x4F56 0x7822 # -0x4F57 0x7823 # -0x4F58 0x782D # -0x4F59 0x782E # -0x4F5A 0x7830 # -0x4F5B 0x7835 # -0x4F5C 0x7837 # -0x4F5D 0x7843 # -0x4F5E 0x7844 # -0x4F5F 0x7847 # -0x4F60 0x7848 # -0x4F61 0x784C # -0x4F62 0x784E # -0x4F63 0x7852 # -0x4F64 0x785C # -0x4F65 0x785E # -0x4F66 0x7860 # -0x4F67 0x7861 # -0x4F68 0x7863 # -0x4F69 0x7864 # -0x4F6A 0x7868 # -0x4F6B 0x786A # -0x4F6C 0x786E # -0x4F6D 0x787A # -0x4F6E 0x787E # -0x4F6F 0x788A # -0x4F70 0x788F # -0x4F71 0x7894 # -0x4F72 0x7898 # -0x4F73 0x78A1 # -0x4F74 0x789D # -0x4F75 0x789E # -0x4F76 0x789F # -0x4F77 0x78A4 # -0x4F78 0x78A8 # -0x4F79 0x78AC # -0x4F7A 0x78AD # -0x4F7B 0x78B0 # -0x4F7C 0x78B1 # -0x4F7D 0x78B2 # -0x4F7E 0x78B3 # -0x5021 0x78BB # -0x5022 0x78BD # -0x5023 0x78BF # -0x5024 0x78C7 # -0x5025 0x78C8 # -0x5026 0x78C9 # -0x5027 0x78CC # -0x5028 0x78CE # -0x5029 0x78D2 # -0x502A 0x78D3 # -0x502B 0x78D5 # -0x502C 0x78D6 # -0x502D 0x78E4 # -0x502E 0x78DB # -0x502F 0x78DF # -0x5030 0x78E0 # -0x5031 0x78E1 # -0x5032 0x78E6 # -0x5033 0x78EA # -0x5034 0x78F2 # -0x5035 0x78F3 # -0x5036 0x7900 # -0x5037 0x78F6 # -0x5038 0x78F7 # -0x5039 0x78FA # -0x503A 0x78FB # -0x503B 0x78FF # -0x503C 0x7906 # -0x503D 0x790C # -0x503E 0x7910 # -0x503F 0x791A # -0x5040 0x791C # -0x5041 0x791E # -0x5042 0x791F # -0x5043 0x7920 # -0x5044 0x7925 # -0x5045 0x7927 # -0x5046 0x7929 # -0x5047 0x792D # -0x5048 0x7931 # -0x5049 0x7934 # -0x504A 0x7935 # -0x504B 0x793B # -0x504C 0x793D # -0x504D 0x793F # -0x504E 0x7944 # -0x504F 0x7945 # -0x5050 0x7946 # -0x5051 0x794A # -0x5052 0x794B # -0x5053 0x794F # -0x5054 0x7951 # -0x5055 0x7954 # -0x5056 0x7958 # -0x5057 0x795B # -0x5058 0x795C # -0x5059 0x7967 # -0x505A 0x7969 # -0x505B 0x796B # -0x505C 0x7972 # -0x505D 0x7979 # -0x505E 0x797B # -0x505F 0x797C # -0x5060 0x797E # -0x5061 0x798B # -0x5062 0x798C # -0x5063 0x7991 # -0x5064 0x7993 # -0x5065 0x7994 # -0x5066 0x7995 # -0x5067 0x7996 # -0x5068 0x7998 # -0x5069 0x799B # -0x506A 0x799C # -0x506B 0x79A1 # -0x506C 0x79A8 # -0x506D 0x79A9 # -0x506E 0x79AB # -0x506F 0x79AF # -0x5070 0x79B1 # -0x5071 0x79B4 # -0x5072 0x79B8 # -0x5073 0x79BB # -0x5074 0x79C2 # -0x5075 0x79C4 # -0x5076 0x79C7 # -0x5077 0x79C8 # -0x5078 0x79CA # -0x5079 0x79CF # -0x507A 0x79D4 # -0x507B 0x79D6 # -0x507C 0x79DA # -0x507D 0x79DD # -0x507E 0x79DE # -0x5121 0x79E0 # -0x5122 0x79E2 # -0x5123 0x79E5 # -0x5124 0x79EA # -0x5125 0x79EB # -0x5126 0x79ED # -0x5127 0x79F1 # -0x5128 0x79F8 # -0x5129 0x79FC # -0x512A 0x7A02 # -0x512B 0x7A03 # -0x512C 0x7A07 # -0x512D 0x7A09 # -0x512E 0x7A0A # -0x512F 0x7A0C # -0x5130 0x7A11 # -0x5131 0x7A15 # -0x5132 0x7A1B # -0x5133 0x7A1E # -0x5134 0x7A21 # -0x5135 0x7A27 # -0x5136 0x7A2B # -0x5137 0x7A2D # -0x5138 0x7A2F # -0x5139 0x7A30 # -0x513A 0x7A34 # -0x513B 0x7A35 # -0x513C 0x7A38 # -0x513D 0x7A39 # -0x513E 0x7A3A # -0x513F 0x7A44 # -0x5140 0x7A45 # -0x5141 0x7A47 # -0x5142 0x7A48 # -0x5143 0x7A4C # -0x5144 0x7A55 # -0x5145 0x7A56 # -0x5146 0x7A59 # -0x5147 0x7A5C # -0x5148 0x7A5D # -0x5149 0x7A5F # -0x514A 0x7A60 # -0x514B 0x7A65 # -0x514C 0x7A67 # -0x514D 0x7A6A # -0x514E 0x7A6D # -0x514F 0x7A75 # -0x5150 0x7A78 # -0x5151 0x7A7E # -0x5152 0x7A80 # -0x5153 0x7A82 # -0x5154 0x7A85 # -0x5155 0x7A86 # -0x5156 0x7A8A # -0x5157 0x7A8B # -0x5158 0x7A90 # -0x5159 0x7A91 # -0x515A 0x7A94 # -0x515B 0x7A9E # -0x515C 0x7AA0 # -0x515D 0x7AA3 # -0x515E 0x7AAC # -0x515F 0x7AB3 # -0x5160 0x7AB5 # -0x5161 0x7AB9 # -0x5162 0x7ABB # -0x5163 0x7ABC # -0x5164 0x7AC6 # -0x5165 0x7AC9 # -0x5166 0x7ACC # -0x5167 0x7ACE # -0x5168 0x7AD1 # -0x5169 0x7ADB # -0x516A 0x7AE8 # -0x516B 0x7AE9 # -0x516C 0x7AEB # -0x516D 0x7AEC # -0x516E 0x7AF1 # -0x516F 0x7AF4 # -0x5170 0x7AFB # -0x5171 0x7AFD # -0x5172 0x7AFE # -0x5173 0x7B07 # -0x5174 0x7B14 # -0x5175 0x7B1F # -0x5176 0x7B23 # -0x5177 0x7B27 # -0x5178 0x7B29 # -0x5179 0x7B2A # -0x517A 0x7B2B # -0x517B 0x7B2D # -0x517C 0x7B2E # -0x517D 0x7B2F # -0x517E 0x7B30 # -0x5221 0x7B31 # -0x5222 0x7B34 # -0x5223 0x7B3D # -0x5224 0x7B3F # -0x5225 0x7B40 # -0x5226 0x7B41 # -0x5227 0x7B47 # -0x5228 0x7B4E # -0x5229 0x7B55 # -0x522A 0x7B60 # -0x522B 0x7B64 # -0x522C 0x7B66 # -0x522D 0x7B69 # -0x522E 0x7B6A # -0x522F 0x7B6D # -0x5230 0x7B6F # -0x5231 0x7B72 # -0x5232 0x7B73 # -0x5233 0x7B77 # -0x5234 0x7B84 # -0x5235 0x7B89 # -0x5236 0x7B8E # -0x5237 0x7B90 # -0x5238 0x7B91 # -0x5239 0x7B96 # -0x523A 0x7B9B # -0x523B 0x7B9E # -0x523C 0x7BA0 # -0x523D 0x7BA5 # -0x523E 0x7BAC # -0x523F 0x7BAF # -0x5240 0x7BB0 # -0x5241 0x7BB2 # -0x5242 0x7BB5 # -0x5243 0x7BB6 # -0x5244 0x7BBA # -0x5245 0x7BBB # -0x5246 0x7BBC # -0x5247 0x7BBD # -0x5248 0x7BC2 # -0x5249 0x7BC5 # -0x524A 0x7BC8 # -0x524B 0x7BCA # -0x524C 0x7BD4 # -0x524D 0x7BD6 # -0x524E 0x7BD7 # -0x524F 0x7BD9 # -0x5250 0x7BDA # -0x5251 0x7BDB # -0x5252 0x7BE8 # -0x5253 0x7BEA # -0x5254 0x7BF2 # -0x5255 0x7BF4 # -0x5256 0x7BF5 # -0x5257 0x7BF8 # -0x5258 0x7BF9 # -0x5259 0x7BFA # -0x525A 0x7BFC # -0x525B 0x7BFE # -0x525C 0x7C01 # -0x525D 0x7C02 # -0x525E 0x7C03 # -0x525F 0x7C04 # -0x5260 0x7C06 # -0x5261 0x7C09 # -0x5262 0x7C0B # -0x5263 0x7C0C # -0x5264 0x7C0E # -0x5265 0x7C0F # -0x5266 0x7C19 # -0x5267 0x7C1B # -0x5268 0x7C20 # -0x5269 0x7C25 # -0x526A 0x7C26 # -0x526B 0x7C28 # -0x526C 0x7C2C # -0x526D 0x7C31 # -0x526E 0x7C33 # -0x526F 0x7C34 # -0x5270 0x7C36 # -0x5271 0x7C39 # -0x5272 0x7C3A # -0x5273 0x7C46 # -0x5274 0x7C4A # -0x5275 0x7C55 # -0x5276 0x7C51 # -0x5277 0x7C52 # -0x5278 0x7C53 # -0x5279 0x7C59 # -0x527A 0x7C5A # -0x527B 0x7C5B # -0x527C 0x7C5C # -0x527D 0x7C5D # -0x527E 0x7C5E # -0x5321 0x7C61 # -0x5322 0x7C63 # -0x5323 0x7C67 # -0x5324 0x7C69 # -0x5325 0x7C6D # -0x5326 0x7C6E # -0x5327 0x7C70 # -0x5328 0x7C72 # -0x5329 0x7C79 # -0x532A 0x7C7C # -0x532B 0x7C7D # -0x532C 0x7C86 # -0x532D 0x7C87 # -0x532E 0x7C8F # -0x532F 0x7C94 # -0x5330 0x7C9E # -0x5331 0x7CA0 # -0x5332 0x7CA6 # -0x5333 0x7CB0 # -0x5334 0x7CB6 # -0x5335 0x7CB7 # -0x5336 0x7CBA # -0x5337 0x7CBB # -0x5338 0x7CBC # -0x5339 0x7CBF # -0x533A 0x7CC4 # -0x533B 0x7CC7 # -0x533C 0x7CC8 # -0x533D 0x7CC9 # -0x533E 0x7CCD # -0x533F 0x7CCF # -0x5340 0x7CD3 # -0x5341 0x7CD4 # -0x5342 0x7CD5 # -0x5343 0x7CD7 # -0x5344 0x7CD9 # -0x5345 0x7CDA # -0x5346 0x7CDD # -0x5347 0x7CE6 # -0x5348 0x7CE9 # -0x5349 0x7CEB # -0x534A 0x7CF5 # -0x534B 0x7D03 # -0x534C 0x7D07 # -0x534D 0x7D08 # -0x534E 0x7D09 # -0x534F 0x7D0F # -0x5350 0x7D11 # -0x5351 0x7D12 # -0x5352 0x7D13 # -0x5353 0x7D16 # -0x5354 0x7D1D # -0x5355 0x7D1E # -0x5356 0x7D23 # -0x5357 0x7D26 # -0x5358 0x7D2A # -0x5359 0x7D2D # -0x535A 0x7D31 # -0x535B 0x7D3C # -0x535C 0x7D3D # -0x535D 0x7D3E # -0x535E 0x7D40 # -0x535F 0x7D41 # -0x5360 0x7D47 # -0x5361 0x7D48 # -0x5362 0x7D4D # -0x5363 0x7D51 # -0x5364 0x7D53 # -0x5365 0x7D57 # -0x5366 0x7D59 # -0x5367 0x7D5A # -0x5368 0x7D5C # -0x5369 0x7D5D # -0x536A 0x7D65 # -0x536B 0x7D67 # -0x536C 0x7D6A # -0x536D 0x7D70 # -0x536E 0x7D78 # -0x536F 0x7D7A # -0x5370 0x7D7B # -0x5371 0x7D7F # -0x5372 0x7D81 # -0x5373 0x7D82 # -0x5374 0x7D83 # -0x5375 0x7D85 # -0x5376 0x7D86 # -0x5377 0x7D88 # -0x5378 0x7D8B # -0x5379 0x7D8C # -0x537A 0x7D8D # -0x537B 0x7D91 # -0x537C 0x7D96 # -0x537D 0x7D97 # -0x537E 0x7D9D # -0x5421 0x7D9E # -0x5422 0x7DA6 # -0x5423 0x7DA7 # -0x5424 0x7DAA # -0x5425 0x7DB3 # -0x5426 0x7DB6 # -0x5427 0x7DB7 # -0x5428 0x7DB9 # -0x5429 0x7DC2 # -0x542A 0x7DC3 # -0x542B 0x7DC4 # -0x542C 0x7DC5 # -0x542D 0x7DC6 # -0x542E 0x7DCC # -0x542F 0x7DCD # -0x5430 0x7DCE # -0x5431 0x7DD7 # -0x5432 0x7DD9 # -0x5433 0x7E00 # -0x5434 0x7DE2 # -0x5435 0x7DE5 # -0x5436 0x7DE6 # -0x5437 0x7DEA # -0x5438 0x7DEB # -0x5439 0x7DED # -0x543A 0x7DF1 # -0x543B 0x7DF5 # -0x543C 0x7DF6 # -0x543D 0x7DF9 # -0x543E 0x7DFA # -0x543F 0x7E08 # -0x5440 0x7E10 # -0x5441 0x7E11 # -0x5442 0x7E15 # -0x5443 0x7E17 # -0x5444 0x7E1C # -0x5445 0x7E1D # -0x5446 0x7E20 # -0x5447 0x7E27 # -0x5448 0x7E28 # -0x5449 0x7E2C # -0x544A 0x7E2D # -0x544B 0x7E2F # -0x544C 0x7E33 # -0x544D 0x7E36 # -0x544E 0x7E3F # -0x544F 0x7E44 # -0x5450 0x7E45 # -0x5451 0x7E47 # -0x5452 0x7E4E # -0x5453 0x7E50 # -0x5454 0x7E52 # -0x5455 0x7E58 # -0x5456 0x7E5F # -0x5457 0x7E61 # -0x5458 0x7E62 # -0x5459 0x7E65 # -0x545A 0x7E6B # -0x545B 0x7E6E # -0x545C 0x7E6F # -0x545D 0x7E73 # -0x545E 0x7E78 # -0x545F 0x7E7E # -0x5460 0x7E81 # -0x5461 0x7E86 # -0x5462 0x7E87 # -0x5463 0x7E8A # -0x5464 0x7E8D # -0x5465 0x7E91 # -0x5466 0x7E95 # -0x5467 0x7E98 # -0x5468 0x7E9A # -0x5469 0x7E9D # -0x546A 0x7E9E # -0x546B 0x7F3C # -0x546C 0x7F3B # -0x546D 0x7F3D # -0x546E 0x7F3E # -0x546F 0x7F3F # -0x5470 0x7F43 # -0x5471 0x7F44 # -0x5472 0x7F47 # -0x5473 0x7F4F # -0x5474 0x7F52 # -0x5475 0x7F53 # -0x5476 0x7F5B # -0x5477 0x7F5C # -0x5478 0x7F5D # -0x5479 0x7F61 # -0x547A 0x7F63 # -0x547B 0x7F64 # -0x547C 0x7F65 # -0x547D 0x7F66 # -0x547E 0x7F6D # -0x5521 0x7F71 # -0x5522 0x7F7D # -0x5523 0x7F7E # -0x5524 0x7F7F # -0x5525 0x7F80 # -0x5526 0x7F8B # -0x5527 0x7F8D # -0x5528 0x7F8F # -0x5529 0x7F90 # -0x552A 0x7F91 # -0x552B 0x7F96 # -0x552C 0x7F97 # -0x552D 0x7F9C # -0x552E 0x7FA1 # -0x552F 0x7FA2 # -0x5530 0x7FA6 # -0x5531 0x7FAA # -0x5532 0x7FAD # -0x5533 0x7FB4 # -0x5534 0x7FBC # -0x5535 0x7FBF # -0x5536 0x7FC0 # -0x5537 0x7FC3 # -0x5538 0x7FC8 # -0x5539 0x7FCE # -0x553A 0x7FCF # -0x553B 0x7FDB # -0x553C 0x7FDF # -0x553D 0x7FE3 # -0x553E 0x7FE5 # -0x553F 0x7FE8 # -0x5540 0x7FEC # -0x5541 0x7FEE # -0x5542 0x7FEF # -0x5543 0x7FF2 # -0x5544 0x7FFA # -0x5545 0x7FFD # -0x5546 0x7FFE # -0x5547 0x7FFF # -0x5548 0x8007 # -0x5549 0x8008 # -0x554A 0x800A # -0x554B 0x800D # -0x554C 0x800E # -0x554D 0x800F # -0x554E 0x8011 # -0x554F 0x8013 # -0x5550 0x8014 # -0x5551 0x8016 # -0x5552 0x801D # -0x5553 0x801E # -0x5554 0x801F # -0x5555 0x8020 # -0x5556 0x8024 # -0x5557 0x8026 # -0x5558 0x802C # -0x5559 0x802E # -0x555A 0x8030 # -0x555B 0x8034 # -0x555C 0x8035 # -0x555D 0x8037 # -0x555E 0x8039 # -0x555F 0x803A # -0x5560 0x803C # -0x5561 0x803E # -0x5562 0x8040 # -0x5563 0x8044 # -0x5564 0x8060 # -0x5565 0x8064 # -0x5566 0x8066 # -0x5567 0x806D # -0x5568 0x8071 # -0x5569 0x8075 # -0x556A 0x8081 # -0x556B 0x8088 # -0x556C 0x808E # -0x556D 0x809C # -0x556E 0x809E # -0x556F 0x80A6 # -0x5570 0x80A7 # -0x5571 0x80AB # -0x5572 0x80B8 # -0x5573 0x80B9 # -0x5574 0x80C8 # -0x5575 0x80CD # -0x5576 0x80CF # -0x5577 0x80D2 # -0x5578 0x80D4 # -0x5579 0x80D5 # -0x557A 0x80D7 # -0x557B 0x80D8 # -0x557C 0x80E0 # -0x557D 0x80ED # -0x557E 0x80EE # -0x5621 0x80F0 # -0x5622 0x80F2 # -0x5623 0x80F3 # -0x5624 0x80F6 # -0x5625 0x80F9 # -0x5626 0x80FA # -0x5627 0x80FE # -0x5628 0x8103 # -0x5629 0x810B # -0x562A 0x8116 # -0x562B 0x8117 # -0x562C 0x8118 # -0x562D 0x811C # -0x562E 0x811E # -0x562F 0x8120 # -0x5630 0x8124 # -0x5631 0x8127 # -0x5632 0x812C # -0x5633 0x8130 # -0x5634 0x8135 # -0x5635 0x813A # -0x5636 0x813C # -0x5637 0x8145 # -0x5638 0x8147 # -0x5639 0x814A # -0x563A 0x814C # -0x563B 0x8152 # -0x563C 0x8157 # -0x563D 0x8160 # -0x563E 0x8161 # -0x563F 0x8167 # -0x5640 0x8168 # -0x5641 0x8169 # -0x5642 0x816D # -0x5643 0x816F # -0x5644 0x8177 # -0x5645 0x8181 # -0x5646 0x8190 # -0x5647 0x8184 # -0x5648 0x8185 # -0x5649 0x8186 # -0x564A 0x818B # -0x564B 0x818E # -0x564C 0x8196 # -0x564D 0x8198 # -0x564E 0x819B # -0x564F 0x819E # -0x5650 0x81A2 # -0x5651 0x81AE # -0x5652 0x81B2 # -0x5653 0x81B4 # -0x5654 0x81BB # -0x5655 0x81CB # -0x5656 0x81C3 # -0x5657 0x81C5 # -0x5658 0x81CA # -0x5659 0x81CE # -0x565A 0x81CF # -0x565B 0x81D5 # -0x565C 0x81D7 # -0x565D 0x81DB # -0x565E 0x81DD # -0x565F 0x81DE # -0x5660 0x81E1 # -0x5661 0x81E4 # -0x5662 0x81EB # -0x5663 0x81EC # -0x5664 0x81F0 # -0x5665 0x81F1 # -0x5666 0x81F2 # -0x5667 0x81F5 # -0x5668 0x81F6 # -0x5669 0x81F8 # -0x566A 0x81F9 # -0x566B 0x81FD # -0x566C 0x81FF # -0x566D 0x8200 # -0x566E 0x8203 # -0x566F 0x820F # -0x5670 0x8213 # -0x5671 0x8214 # -0x5672 0x8219 # -0x5673 0x821A # -0x5674 0x821D # -0x5675 0x8221 # -0x5676 0x8222 # -0x5677 0x8228 # -0x5678 0x8232 # -0x5679 0x8234 # -0x567A 0x823A # -0x567B 0x8243 # -0x567C 0x8244 # -0x567D 0x8245 # -0x567E 0x8246 # -0x5721 0x824B # -0x5722 0x824E # -0x5723 0x824F # -0x5724 0x8251 # -0x5725 0x8256 # -0x5726 0x825C # -0x5727 0x8260 # -0x5728 0x8263 # -0x5729 0x8267 # -0x572A 0x826D # -0x572B 0x8274 # -0x572C 0x827B # -0x572D 0x827D # -0x572E 0x827F # -0x572F 0x8280 # -0x5730 0x8281 # -0x5731 0x8283 # -0x5732 0x8284 # -0x5733 0x8287 # -0x5734 0x8289 # -0x5735 0x828A # -0x5736 0x828E # -0x5737 0x8291 # -0x5738 0x8294 # -0x5739 0x8296 # -0x573A 0x8298 # -0x573B 0x829A # -0x573C 0x829B # -0x573D 0x82A0 # -0x573E 0x82A1 # -0x573F 0x82A3 # -0x5740 0x82A4 # -0x5741 0x82A7 # -0x5742 0x82A8 # -0x5743 0x82A9 # -0x5744 0x82AA # -0x5745 0x82AE # -0x5746 0x82B0 # -0x5747 0x82B2 # -0x5748 0x82B4 # -0x5749 0x82B7 # -0x574A 0x82BA # -0x574B 0x82BC # -0x574C 0x82BE # -0x574D 0x82BF # -0x574E 0x82C6 # -0x574F 0x82D0 # -0x5750 0x82D5 # -0x5751 0x82DA # -0x5752 0x82E0 # -0x5753 0x82E2 # -0x5754 0x82E4 # -0x5755 0x82E8 # -0x5756 0x82EA # -0x5757 0x82ED # -0x5758 0x82EF # -0x5759 0x82F6 # -0x575A 0x82F7 # -0x575B 0x82FD # -0x575C 0x82FE # -0x575D 0x8300 # -0x575E 0x8301 # -0x575F 0x8307 # -0x5760 0x8308 # -0x5761 0x830A # -0x5762 0x830B # -0x5763 0x8354 # -0x5764 0x831B # -0x5765 0x831D # -0x5766 0x831E # -0x5767 0x831F # -0x5768 0x8321 # -0x5769 0x8322 # -0x576A 0x832C # -0x576B 0x832D # -0x576C 0x832E # -0x576D 0x8330 # -0x576E 0x8333 # -0x576F 0x8337 # -0x5770 0x833A # -0x5771 0x833C # -0x5772 0x833D # -0x5773 0x8342 # -0x5774 0x8343 # -0x5775 0x8344 # -0x5776 0x8347 # -0x5777 0x834D # -0x5778 0x834E # -0x5779 0x8351 # -0x577A 0x8355 # -0x577B 0x8356 # -0x577C 0x8357 # -0x577D 0x8370 # -0x577E 0x8378 # -0x5821 0x837D # -0x5822 0x837F # -0x5823 0x8380 # -0x5824 0x8382 # -0x5825 0x8384 # -0x5826 0x8386 # -0x5827 0x838D # -0x5828 0x8392 # -0x5829 0x8394 # -0x582A 0x8395 # -0x582B 0x8398 # -0x582C 0x8399 # -0x582D 0x839B # -0x582E 0x839C # -0x582F 0x839D # -0x5830 0x83A6 # -0x5831 0x83A7 # -0x5832 0x83A9 # -0x5833 0x83AC # -0x5834 0x83BE # -0x5835 0x83BF # -0x5836 0x83C0 # -0x5837 0x83C7 # -0x5838 0x83C9 # -0x5839 0x83CF # -0x583A 0x83D0 # -0x583B 0x83D1 # -0x583C 0x83D4 # -0x583D 0x83DD # -0x583E 0x8353 # -0x583F 0x83E8 # -0x5840 0x83EA # -0x5841 0x83F6 # -0x5842 0x83F8 # -0x5843 0x83F9 # -0x5844 0x83FC # -0x5845 0x8401 # -0x5846 0x8406 # -0x5847 0x840A # -0x5848 0x840F # -0x5849 0x8411 # -0x584A 0x8415 # -0x584B 0x8419 # -0x584C 0x83AD # -0x584D 0x842F # -0x584E 0x8439 # -0x584F 0x8445 # -0x5850 0x8447 # -0x5851 0x8448 # -0x5852 0x844A # -0x5853 0x844D # -0x5854 0x844F # -0x5855 0x8451 # -0x5856 0x8452 # -0x5857 0x8456 # -0x5858 0x8458 # -0x5859 0x8459 # -0x585A 0x845A # -0x585B 0x845C # -0x585C 0x8460 # -0x585D 0x8464 # -0x585E 0x8465 # -0x585F 0x8467 # -0x5860 0x846A # -0x5861 0x8470 # -0x5862 0x8473 # -0x5863 0x8474 # -0x5864 0x8476 # -0x5865 0x8478 # -0x5866 0x847C # -0x5867 0x847D # -0x5868 0x8481 # -0x5869 0x8485 # -0x586A 0x8492 # -0x586B 0x8493 # -0x586C 0x8495 # -0x586D 0x849E # -0x586E 0x84A6 # -0x586F 0x84A8 # -0x5870 0x84A9 # -0x5871 0x84AA # -0x5872 0x84AF # -0x5873 0x84B1 # -0x5874 0x84B4 # -0x5875 0x84BA # -0x5876 0x84BD # -0x5877 0x84BE # -0x5878 0x84C0 # -0x5879 0x84C2 # -0x587A 0x84C7 # -0x587B 0x84C8 # -0x587C 0x84CC # -0x587D 0x84CF # -0x587E 0x84D3 # -0x5921 0x84DC # -0x5922 0x84E7 # -0x5923 0x84EA # -0x5924 0x84EF # -0x5925 0x84F0 # -0x5926 0x84F1 # -0x5927 0x84F2 # -0x5928 0x84F7 # -0x5929 0x8532 # -0x592A 0x84FA # -0x592B 0x84FB # -0x592C 0x84FD # -0x592D 0x8502 # -0x592E 0x8503 # -0x592F 0x8507 # -0x5930 0x850C # -0x5931 0x850E # -0x5932 0x8510 # -0x5933 0x851C # -0x5934 0x851E # -0x5935 0x8522 # -0x5936 0x8523 # -0x5937 0x8524 # -0x5938 0x8525 # -0x5939 0x8527 # -0x593A 0x852A # -0x593B 0x852B # -0x593C 0x852F # -0x593D 0x8533 # -0x593E 0x8534 # -0x593F 0x8536 # -0x5940 0x853F # -0x5941 0x8546 # -0x5942 0x854F # -0x5943 0x8550 # -0x5944 0x8551 # -0x5945 0x8552 # -0x5946 0x8553 # -0x5947 0x8556 # -0x5948 0x8559 # -0x5949 0x855C # -0x594A 0x855D # -0x594B 0x855E # -0x594C 0x855F # -0x594D 0x8560 # -0x594E 0x8561 # -0x594F 0x8562 # -0x5950 0x8564 # -0x5951 0x856B # -0x5952 0x856F # -0x5953 0x8579 # -0x5954 0x857A # -0x5955 0x857B # -0x5956 0x857D # -0x5957 0x857F # -0x5958 0x8581 # -0x5959 0x8585 # -0x595A 0x8586 # -0x595B 0x8589 # -0x595C 0x858B # -0x595D 0x858C # -0x595E 0x858F # -0x595F 0x8593 # -0x5960 0x8598 # -0x5961 0x859D # -0x5962 0x859F # -0x5963 0x85A0 # -0x5964 0x85A2 # -0x5965 0x85A5 # -0x5966 0x85A7 # -0x5967 0x85B4 # -0x5968 0x85B6 # -0x5969 0x85B7 # -0x596A 0x85B8 # -0x596B 0x85BC # -0x596C 0x85BD # -0x596D 0x85BE # -0x596E 0x85BF # -0x596F 0x85C2 # -0x5970 0x85C7 # -0x5971 0x85CA # -0x5972 0x85CB # -0x5973 0x85CE # -0x5974 0x85AD # -0x5975 0x85D8 # -0x5976 0x85DA # -0x5977 0x85DF # -0x5978 0x85E0 # -0x5979 0x85E6 # -0x597A 0x85E8 # -0x597B 0x85ED # -0x597C 0x85F3 # -0x597D 0x85F6 # -0x597E 0x85FC # -0x5A21 0x85FF # -0x5A22 0x8600 # -0x5A23 0x8604 # -0x5A24 0x8605 # -0x5A25 0x860D # -0x5A26 0x860E # -0x5A27 0x8610 # -0x5A28 0x8611 # -0x5A29 0x8612 # -0x5A2A 0x8618 # -0x5A2B 0x8619 # -0x5A2C 0x861B # -0x5A2D 0x861E # -0x5A2E 0x8621 # -0x5A2F 0x8627 # -0x5A30 0x8629 # -0x5A31 0x8636 # -0x5A32 0x8638 # -0x5A33 0x863A # -0x5A34 0x863C # -0x5A35 0x863D # -0x5A36 0x8640 # -0x5A37 0x8642 # -0x5A38 0x8646 # -0x5A39 0x8652 # -0x5A3A 0x8653 # -0x5A3B 0x8656 # -0x5A3C 0x8657 # -0x5A3D 0x8658 # -0x5A3E 0x8659 # -0x5A3F 0x865D # -0x5A40 0x8660 # -0x5A41 0x8661 # -0x5A42 0x8662 # -0x5A43 0x8663 # -0x5A44 0x8664 # -0x5A45 0x8669 # -0x5A46 0x866C # -0x5A47 0x866F # -0x5A48 0x8675 # -0x5A49 0x8676 # -0x5A4A 0x8677 # -0x5A4B 0x867A # -0x5A4C 0x868D # -0x5A4D 0x8691 # -0x5A4E 0x8696 # -0x5A4F 0x8698 # -0x5A50 0x869A # -0x5A51 0x869C # -0x5A52 0x86A1 # -0x5A53 0x86A6 # -0x5A54 0x86A7 # -0x5A55 0x86A8 # -0x5A56 0x86AD # -0x5A57 0x86B1 # -0x5A58 0x86B3 # -0x5A59 0x86B4 # -0x5A5A 0x86B5 # -0x5A5B 0x86B7 # -0x5A5C 0x86B8 # -0x5A5D 0x86B9 # -0x5A5E 0x86BF # -0x5A5F 0x86C0 # -0x5A60 0x86C1 # -0x5A61 0x86C3 # -0x5A62 0x86C5 # -0x5A63 0x86D1 # -0x5A64 0x86D2 # -0x5A65 0x86D5 # -0x5A66 0x86D7 # -0x5A67 0x86DA # -0x5A68 0x86DC # -0x5A69 0x86E0 # -0x5A6A 0x86E3 # -0x5A6B 0x86E5 # -0x5A6C 0x86E7 # -0x5A6D 0x8688 # -0x5A6E 0x86FA # -0x5A6F 0x86FC # -0x5A70 0x86FD # -0x5A71 0x8704 # -0x5A72 0x8705 # -0x5A73 0x8707 # -0x5A74 0x870B # -0x5A75 0x870E # -0x5A76 0x870F # -0x5A77 0x8710 # -0x5A78 0x8713 # -0x5A79 0x8714 # -0x5A7A 0x8719 # -0x5A7B 0x871E # -0x5A7C 0x871F # -0x5A7D 0x8721 # -0x5A7E 0x8723 # -0x5B21 0x8728 # -0x5B22 0x872E # -0x5B23 0x872F # -0x5B24 0x8731 # -0x5B25 0x8732 # -0x5B26 0x8739 # -0x5B27 0x873A # -0x5B28 0x873C # -0x5B29 0x873D # -0x5B2A 0x873E # -0x5B2B 0x8740 # -0x5B2C 0x8743 # -0x5B2D 0x8745 # -0x5B2E 0x874D # -0x5B2F 0x8758 # -0x5B30 0x875D # -0x5B31 0x8761 # -0x5B32 0x8764 # -0x5B33 0x8765 # -0x5B34 0x876F # -0x5B35 0x8771 # -0x5B36 0x8772 # -0x5B37 0x877B # -0x5B38 0x8783 # -0x5B39 0x8784 # -0x5B3A 0x8785 # -0x5B3B 0x8786 # -0x5B3C 0x8787 # -0x5B3D 0x8788 # -0x5B3E 0x8789 # -0x5B3F 0x878B # -0x5B40 0x878C # -0x5B41 0x8790 # -0x5B42 0x8793 # -0x5B43 0x8795 # -0x5B44 0x8797 # -0x5B45 0x8798 # -0x5B46 0x8799 # -0x5B47 0x879E # -0x5B48 0x87A0 # -0x5B49 0x87A3 # -0x5B4A 0x87A7 # -0x5B4B 0x87AC # -0x5B4C 0x87AD # -0x5B4D 0x87AE # -0x5B4E 0x87B1 # -0x5B4F 0x87B5 # -0x5B50 0x87BE # -0x5B51 0x87BF # -0x5B52 0x87C1 # -0x5B53 0x87C8 # -0x5B54 0x87C9 # -0x5B55 0x87CA # -0x5B56 0x87CE # -0x5B57 0x87D5 # -0x5B58 0x87D6 # -0x5B59 0x87D9 # -0x5B5A 0x87DA # -0x5B5B 0x87DC # -0x5B5C 0x87DF # -0x5B5D 0x87E2 # -0x5B5E 0x87E3 # -0x5B5F 0x87E4 # -0x5B60 0x87EA # -0x5B61 0x87EB # -0x5B62 0x87ED # -0x5B63 0x87F1 # -0x5B64 0x87F3 # -0x5B65 0x87F8 # -0x5B66 0x87FA # -0x5B67 0x87FF # -0x5B68 0x8801 # -0x5B69 0x8803 # -0x5B6A 0x8806 # -0x5B6B 0x8809 # -0x5B6C 0x880A # -0x5B6D 0x880B # -0x5B6E 0x8810 # -0x5B6F 0x8819 # -0x5B70 0x8812 # -0x5B71 0x8813 # -0x5B72 0x8814 # -0x5B73 0x8818 # -0x5B74 0x881A # -0x5B75 0x881B # -0x5B76 0x881C # -0x5B77 0x881E # -0x5B78 0x881F # -0x5B79 0x8828 # -0x5B7A 0x882D # -0x5B7B 0x882E # -0x5B7C 0x8830 # -0x5B7D 0x8832 # -0x5B7E 0x8835 # -0x5C21 0x883A # -0x5C22 0x883C # -0x5C23 0x8841 # -0x5C24 0x8843 # -0x5C25 0x8845 # -0x5C26 0x8848 # -0x5C27 0x8849 # -0x5C28 0x884A # -0x5C29 0x884B # -0x5C2A 0x884E # -0x5C2B 0x8851 # -0x5C2C 0x8855 # -0x5C2D 0x8856 # -0x5C2E 0x8858 # -0x5C2F 0x885A # -0x5C30 0x885C # -0x5C31 0x885F # -0x5C32 0x8860 # -0x5C33 0x8864 # -0x5C34 0x8869 # -0x5C35 0x8871 # -0x5C36 0x8879 # -0x5C37 0x887B # -0x5C38 0x8880 # -0x5C39 0x8898 # -0x5C3A 0x889A # -0x5C3B 0x889B # -0x5C3C 0x889C # -0x5C3D 0x889F # -0x5C3E 0x88A0 # -0x5C3F 0x88A8 # -0x5C40 0x88AA # -0x5C41 0x88BA # -0x5C42 0x88BD # -0x5C43 0x88BE # -0x5C44 0x88C0 # -0x5C45 0x88CA # -0x5C46 0x88CB # -0x5C47 0x88CC # -0x5C48 0x88CD # -0x5C49 0x88CE # -0x5C4A 0x88D1 # -0x5C4B 0x88D2 # -0x5C4C 0x88D3 # -0x5C4D 0x88DB # -0x5C4E 0x88DE # -0x5C4F 0x88E7 # -0x5C50 0x88EF # -0x5C51 0x88F0 # -0x5C52 0x88F1 # -0x5C53 0x88F5 # -0x5C54 0x88F7 # -0x5C55 0x8901 # -0x5C56 0x8906 # -0x5C57 0x890D # -0x5C58 0x890E # -0x5C59 0x890F # -0x5C5A 0x8915 # -0x5C5B 0x8916 # -0x5C5C 0x8918 # -0x5C5D 0x8919 # -0x5C5E 0x891A # -0x5C5F 0x891C # -0x5C60 0x8920 # -0x5C61 0x8926 # -0x5C62 0x8927 # -0x5C63 0x8928 # -0x5C64 0x8930 # -0x5C65 0x8931 # -0x5C66 0x8932 # -0x5C67 0x8935 # -0x5C68 0x8939 # -0x5C69 0x893A # -0x5C6A 0x893E # -0x5C6B 0x8940 # -0x5C6C 0x8942 # -0x5C6D 0x8945 # -0x5C6E 0x8946 # -0x5C6F 0x8949 # -0x5C70 0x894F # -0x5C71 0x8952 # -0x5C72 0x8957 # -0x5C73 0x895A # -0x5C74 0x895B # -0x5C75 0x895C # -0x5C76 0x8961 # -0x5C77 0x8962 # -0x5C78 0x8963 # -0x5C79 0x896B # -0x5C7A 0x896E # -0x5C7B 0x8970 # -0x5C7C 0x8973 # -0x5C7D 0x8975 # -0x5C7E 0x897A # -0x5D21 0x897B # -0x5D22 0x897C # -0x5D23 0x897D # -0x5D24 0x8989 # -0x5D25 0x898D # -0x5D26 0x8990 # -0x5D27 0x8994 # -0x5D28 0x8995 # -0x5D29 0x899B # -0x5D2A 0x899C # -0x5D2B 0x899F # -0x5D2C 0x89A0 # -0x5D2D 0x89A5 # -0x5D2E 0x89B0 # -0x5D2F 0x89B4 # -0x5D30 0x89B5 # -0x5D31 0x89B6 # -0x5D32 0x89B7 # -0x5D33 0x89BC # -0x5D34 0x89D4 # -0x5D35 0x89D5 # -0x5D36 0x89D6 # -0x5D37 0x89D7 # -0x5D38 0x89D8 # -0x5D39 0x89E5 # -0x5D3A 0x89E9 # -0x5D3B 0x89EB # -0x5D3C 0x89ED # -0x5D3D 0x89F1 # -0x5D3E 0x89F3 # -0x5D3F 0x89F6 # -0x5D40 0x89F9 # -0x5D41 0x89FD # -0x5D42 0x89FF # -0x5D43 0x8A04 # -0x5D44 0x8A05 # -0x5D45 0x8A07 # -0x5D46 0x8A0F # -0x5D47 0x8A11 # -0x5D48 0x8A12 # -0x5D49 0x8A14 # -0x5D4A 0x8A15 # -0x5D4B 0x8A1E # -0x5D4C 0x8A20 # -0x5D4D 0x8A22 # -0x5D4E 0x8A24 # -0x5D4F 0x8A26 # -0x5D50 0x8A2B # -0x5D51 0x8A2C # -0x5D52 0x8A2F # -0x5D53 0x8A35 # -0x5D54 0x8A37 # -0x5D55 0x8A3D # -0x5D56 0x8A3E # -0x5D57 0x8A40 # -0x5D58 0x8A43 # -0x5D59 0x8A45 # -0x5D5A 0x8A47 # -0x5D5B 0x8A49 # -0x5D5C 0x8A4D # -0x5D5D 0x8A4E # -0x5D5E 0x8A53 # -0x5D5F 0x8A56 # -0x5D60 0x8A57 # -0x5D61 0x8A58 # -0x5D62 0x8A5C # -0x5D63 0x8A5D # -0x5D64 0x8A61 # -0x5D65 0x8A65 # -0x5D66 0x8A67 # -0x5D67 0x8A75 # -0x5D68 0x8A76 # -0x5D69 0x8A77 # -0x5D6A 0x8A79 # -0x5D6B 0x8A7A # -0x5D6C 0x8A7B # -0x5D6D 0x8A7E # -0x5D6E 0x8A7F # -0x5D6F 0x8A80 # -0x5D70 0x8A83 # -0x5D71 0x8A86 # -0x5D72 0x8A8B # -0x5D73 0x8A8F # -0x5D74 0x8A90 # -0x5D75 0x8A92 # -0x5D76 0x8A96 # -0x5D77 0x8A97 # -0x5D78 0x8A99 # -0x5D79 0x8A9F # -0x5D7A 0x8AA7 # -0x5D7B 0x8AA9 # -0x5D7C 0x8AAE # -0x5D7D 0x8AAF # -0x5D7E 0x8AB3 # -0x5E21 0x8AB6 # -0x5E22 0x8AB7 # -0x5E23 0x8ABB # -0x5E24 0x8ABE # -0x5E25 0x8AC3 # -0x5E26 0x8AC6 # -0x5E27 0x8AC8 # -0x5E28 0x8AC9 # -0x5E29 0x8ACA # -0x5E2A 0x8AD1 # -0x5E2B 0x8AD3 # -0x5E2C 0x8AD4 # -0x5E2D 0x8AD5 # -0x5E2E 0x8AD7 # -0x5E2F 0x8ADD # -0x5E30 0x8ADF # -0x5E31 0x8AEC # -0x5E32 0x8AF0 # -0x5E33 0x8AF4 # -0x5E34 0x8AF5 # -0x5E35 0x8AF6 # -0x5E36 0x8AFC # -0x5E37 0x8AFF # -0x5E38 0x8B05 # -0x5E39 0x8B06 # -0x5E3A 0x8B0B # -0x5E3B 0x8B11 # -0x5E3C 0x8B1C # -0x5E3D 0x8B1E # -0x5E3E 0x8B1F # -0x5E3F 0x8B0A # -0x5E40 0x8B2D # -0x5E41 0x8B30 # -0x5E42 0x8B37 # -0x5E43 0x8B3C # -0x5E44 0x8B42 # -0x5E45 0x8B43 # -0x5E46 0x8B44 # -0x5E47 0x8B45 # -0x5E48 0x8B46 # -0x5E49 0x8B48 # -0x5E4A 0x8B52 # -0x5E4B 0x8B53 # -0x5E4C 0x8B54 # -0x5E4D 0x8B59 # -0x5E4E 0x8B4D # -0x5E4F 0x8B5E # -0x5E50 0x8B63 # -0x5E51 0x8B6D # -0x5E52 0x8B76 # -0x5E53 0x8B78 # -0x5E54 0x8B79 # -0x5E55 0x8B7C # -0x5E56 0x8B7E # -0x5E57 0x8B81 # -0x5E58 0x8B84 # -0x5E59 0x8B85 # -0x5E5A 0x8B8B # -0x5E5B 0x8B8D # -0x5E5C 0x8B8F # -0x5E5D 0x8B94 # -0x5E5E 0x8B95 # -0x5E5F 0x8B9C # -0x5E60 0x8B9E # -0x5E61 0x8B9F # -0x5E62 0x8C38 # -0x5E63 0x8C39 # -0x5E64 0x8C3D # -0x5E65 0x8C3E # -0x5E66 0x8C45 # -0x5E67 0x8C47 # -0x5E68 0x8C49 # -0x5E69 0x8C4B # -0x5E6A 0x8C4F # -0x5E6B 0x8C51 # -0x5E6C 0x8C53 # -0x5E6D 0x8C54 # -0x5E6E 0x8C57 # -0x5E6F 0x8C58 # -0x5E70 0x8C5B # -0x5E71 0x8C5D # -0x5E72 0x8C59 # -0x5E73 0x8C63 # -0x5E74 0x8C64 # -0x5E75 0x8C66 # -0x5E76 0x8C68 # -0x5E77 0x8C69 # -0x5E78 0x8C6D # -0x5E79 0x8C73 # -0x5E7A 0x8C75 # -0x5E7B 0x8C76 # -0x5E7C 0x8C7B # -0x5E7D 0x8C7E # -0x5E7E 0x8C86 # -0x5F21 0x8C87 # -0x5F22 0x8C8B # -0x5F23 0x8C90 # -0x5F24 0x8C92 # -0x5F25 0x8C93 # -0x5F26 0x8C99 # -0x5F27 0x8C9B # -0x5F28 0x8C9C # -0x5F29 0x8CA4 # -0x5F2A 0x8CB9 # -0x5F2B 0x8CBA # -0x5F2C 0x8CC5 # -0x5F2D 0x8CC6 # -0x5F2E 0x8CC9 # -0x5F2F 0x8CCB # -0x5F30 0x8CCF # -0x5F31 0x8CD6 # -0x5F32 0x8CD5 # -0x5F33 0x8CD9 # -0x5F34 0x8CDD # -0x5F35 0x8CE1 # -0x5F36 0x8CE8 # -0x5F37 0x8CEC # -0x5F38 0x8CEF # -0x5F39 0x8CF0 # -0x5F3A 0x8CF2 # -0x5F3B 0x8CF5 # -0x5F3C 0x8CF7 # -0x5F3D 0x8CF8 # -0x5F3E 0x8CFE # -0x5F3F 0x8CFF # -0x5F40 0x8D01 # -0x5F41 0x8D03 # -0x5F42 0x8D09 # -0x5F43 0x8D12 # -0x5F44 0x8D17 # -0x5F45 0x8D1B # -0x5F46 0x8D65 # -0x5F47 0x8D69 # -0x5F48 0x8D6C # -0x5F49 0x8D6E # -0x5F4A 0x8D7F # -0x5F4B 0x8D82 # -0x5F4C 0x8D84 # -0x5F4D 0x8D88 # -0x5F4E 0x8D8D # -0x5F4F 0x8D90 # -0x5F50 0x8D91 # -0x5F51 0x8D95 # -0x5F52 0x8D9E # -0x5F53 0x8D9F # -0x5F54 0x8DA0 # -0x5F55 0x8DA6 # -0x5F56 0x8DAB # -0x5F57 0x8DAC # -0x5F58 0x8DAF # -0x5F59 0x8DB2 # -0x5F5A 0x8DB5 # -0x5F5B 0x8DB7 # -0x5F5C 0x8DB9 # -0x5F5D 0x8DBB # -0x5F5E 0x8DC0 # -0x5F5F 0x8DC5 # -0x5F60 0x8DC6 # -0x5F61 0x8DC7 # -0x5F62 0x8DC8 # -0x5F63 0x8DCA # -0x5F64 0x8DCE # -0x5F65 0x8DD1 # -0x5F66 0x8DD4 # -0x5F67 0x8DD5 # -0x5F68 0x8DD7 # -0x5F69 0x8DD9 # -0x5F6A 0x8DE4 # -0x5F6B 0x8DE5 # -0x5F6C 0x8DE7 # -0x5F6D 0x8DEC # -0x5F6E 0x8DF0 # -0x5F6F 0x8DBC # -0x5F70 0x8DF1 # -0x5F71 0x8DF2 # -0x5F72 0x8DF4 # -0x5F73 0x8DFD # -0x5F74 0x8E01 # -0x5F75 0x8E04 # -0x5F76 0x8E05 # -0x5F77 0x8E06 # -0x5F78 0x8E0B # -0x5F79 0x8E11 # -0x5F7A 0x8E14 # -0x5F7B 0x8E16 # -0x5F7C 0x8E20 # -0x5F7D 0x8E21 # -0x5F7E 0x8E22 # -0x6021 0x8E23 # -0x6022 0x8E26 # -0x6023 0x8E27 # -0x6024 0x8E31 # -0x6025 0x8E33 # -0x6026 0x8E36 # -0x6027 0x8E37 # -0x6028 0x8E38 # -0x6029 0x8E39 # -0x602A 0x8E3D # -0x602B 0x8E40 # -0x602C 0x8E41 # -0x602D 0x8E4B # -0x602E 0x8E4D # -0x602F 0x8E4E # -0x6030 0x8E4F # -0x6031 0x8E54 # -0x6032 0x8E5B # -0x6033 0x8E5C # -0x6034 0x8E5D # -0x6035 0x8E5E # -0x6036 0x8E61 # -0x6037 0x8E62 # -0x6038 0x8E69 # -0x6039 0x8E6C # -0x603A 0x8E6D # -0x603B 0x8E6F # -0x603C 0x8E70 # -0x603D 0x8E71 # -0x603E 0x8E79 # -0x603F 0x8E7A # -0x6040 0x8E7B # -0x6041 0x8E82 # -0x6042 0x8E83 # -0x6043 0x8E89 # -0x6044 0x8E90 # -0x6045 0x8E92 # -0x6046 0x8E95 # -0x6047 0x8E9A # -0x6048 0x8E9B # -0x6049 0x8E9D # -0x604A 0x8E9E # -0x604B 0x8EA2 # -0x604C 0x8EA7 # -0x604D 0x8EA9 # -0x604E 0x8EAD # -0x604F 0x8EAE # -0x6050 0x8EB3 # -0x6051 0x8EB5 # -0x6052 0x8EBA # -0x6053 0x8EBB # -0x6054 0x8EC0 # -0x6055 0x8EC1 # -0x6056 0x8EC3 # -0x6057 0x8EC4 # -0x6058 0x8EC7 # -0x6059 0x8ECF # -0x605A 0x8ED1 # -0x605B 0x8ED4 # -0x605C 0x8EDC # -0x605D 0x8EE8 # -0x605E 0x8EEE # -0x605F 0x8EF0 # -0x6060 0x8EF1 # -0x6061 0x8EF7 # -0x6062 0x8EF9 # -0x6063 0x8EFA # -0x6064 0x8EED # -0x6065 0x8F00 # -0x6066 0x8F02 # -0x6067 0x8F07 # -0x6068 0x8F08 # -0x6069 0x8F0F # -0x606A 0x8F10 # -0x606B 0x8F16 # -0x606C 0x8F17 # -0x606D 0x8F18 # -0x606E 0x8F1E # -0x606F 0x8F20 # -0x6070 0x8F21 # -0x6071 0x8F23 # -0x6072 0x8F25 # -0x6073 0x8F27 # -0x6074 0x8F28 # -0x6075 0x8F2C # -0x6076 0x8F2D # -0x6077 0x8F2E # -0x6078 0x8F34 # -0x6079 0x8F35 # -0x607A 0x8F36 # -0x607B 0x8F37 # -0x607C 0x8F3A # -0x607D 0x8F40 # -0x607E 0x8F41 # -0x6121 0x8F43 # -0x6122 0x8F47 # -0x6123 0x8F4F # -0x6124 0x8F51 # -0x6125 0x8F52 # -0x6126 0x8F53 # -0x6127 0x8F54 # -0x6128 0x8F55 # -0x6129 0x8F58 # -0x612A 0x8F5D # -0x612B 0x8F5E # -0x612C 0x8F65 # -0x612D 0x8F9D # -0x612E 0x8FA0 # -0x612F 0x8FA1 # -0x6130 0x8FA4 # -0x6131 0x8FA5 # -0x6132 0x8FA6 # -0x6133 0x8FB5 # -0x6134 0x8FB6 # -0x6135 0x8FB8 # -0x6136 0x8FBE # -0x6137 0x8FC0 # -0x6138 0x8FC1 # -0x6139 0x8FC6 # -0x613A 0x8FCA # -0x613B 0x8FCB # -0x613C 0x8FCD # -0x613D 0x8FD0 # -0x613E 0x8FD2 # -0x613F 0x8FD3 # -0x6140 0x8FD5 # -0x6141 0x8FE0 # -0x6142 0x8FE3 # -0x6143 0x8FE4 # -0x6144 0x8FE8 # -0x6145 0x8FEE # -0x6146 0x8FF1 # -0x6147 0x8FF5 # -0x6148 0x8FF6 # -0x6149 0x8FFB # -0x614A 0x8FFE # -0x614B 0x9002 # -0x614C 0x9004 # -0x614D 0x9008 # -0x614E 0x900C # -0x614F 0x9018 # -0x6150 0x901B # -0x6151 0x9028 # -0x6152 0x9029 # -0x6153 0x902F # -0x6154 0x902A # -0x6155 0x902C # -0x6156 0x902D # -0x6157 0x9033 # -0x6158 0x9034 # -0x6159 0x9037 # -0x615A 0x903F # -0x615B 0x9043 # -0x615C 0x9044 # -0x615D 0x904C # -0x615E 0x905B # -0x615F 0x905D # -0x6160 0x9062 # -0x6161 0x9066 # -0x6162 0x9067 # -0x6163 0x906C # -0x6164 0x9070 # -0x6165 0x9074 # -0x6166 0x9079 # -0x6167 0x9085 # -0x6168 0x9088 # -0x6169 0x908B # -0x616A 0x908C # -0x616B 0x908E # -0x616C 0x9090 # -0x616D 0x9095 # -0x616E 0x9097 # -0x616F 0x9098 # -0x6170 0x9099 # -0x6171 0x909B # -0x6172 0x90A0 # -0x6173 0x90A1 # -0x6174 0x90A2 # -0x6175 0x90A5 # -0x6176 0x90B0 # -0x6177 0x90B2 # -0x6178 0x90B3 # -0x6179 0x90B4 # -0x617A 0x90B6 # -0x617B 0x90BD # -0x617C 0x90CC # -0x617D 0x90BE # -0x617E 0x90C3 # -0x6221 0x90C4 # -0x6222 0x90C5 # -0x6223 0x90C7 # -0x6224 0x90C8 # -0x6225 0x90D5 # -0x6226 0x90D7 # -0x6227 0x90D8 # -0x6228 0x90D9 # -0x6229 0x90DC # -0x622A 0x90DD # -0x622B 0x90DF # -0x622C 0x90E5 # -0x622D 0x90D2 # -0x622E 0x90F6 # -0x622F 0x90EB # -0x6230 0x90EF # -0x6231 0x90F0 # -0x6232 0x90F4 # -0x6233 0x90FE # -0x6234 0x90FF # -0x6235 0x9100 # -0x6236 0x9104 # -0x6237 0x9105 # -0x6238 0x9106 # -0x6239 0x9108 # -0x623A 0x910D # -0x623B 0x9110 # -0x623C 0x9114 # -0x623D 0x9116 # -0x623E 0x9117 # -0x623F 0x9118 # -0x6240 0x911A # -0x6241 0x911C # -0x6242 0x911E # -0x6243 0x9120 # -0x6244 0x9125 # -0x6245 0x9122 # -0x6246 0x9123 # -0x6247 0x9127 # -0x6248 0x9129 # -0x6249 0x912E # -0x624A 0x912F # -0x624B 0x9131 # -0x624C 0x9134 # -0x624D 0x9136 # -0x624E 0x9137 # -0x624F 0x9139 # -0x6250 0x913A # -0x6251 0x913C # -0x6252 0x913D # -0x6253 0x9143 # -0x6254 0x9147 # -0x6255 0x9148 # -0x6256 0x914F # -0x6257 0x9153 # -0x6258 0x9157 # -0x6259 0x9159 # -0x625A 0x915A # -0x625B 0x915B # -0x625C 0x9161 # -0x625D 0x9164 # -0x625E 0x9167 # -0x625F 0x916D # -0x6260 0x9174 # -0x6261 0x9179 # -0x6262 0x917A # -0x6263 0x917B # -0x6264 0x9181 # -0x6265 0x9183 # -0x6266 0x9185 # -0x6267 0x9186 # -0x6268 0x918A # -0x6269 0x918E # -0x626A 0x9191 # -0x626B 0x9193 # -0x626C 0x9194 # -0x626D 0x9195 # -0x626E 0x9198 # -0x626F 0x919E # -0x6270 0x91A1 # -0x6271 0x91A6 # -0x6272 0x91A8 # -0x6273 0x91AC # -0x6274 0x91AD # -0x6275 0x91AE # -0x6276 0x91B0 # -0x6277 0x91B1 # -0x6278 0x91B2 # -0x6279 0x91B3 # -0x627A 0x91B6 # -0x627B 0x91BB # -0x627C 0x91BC # -0x627D 0x91BD # -0x627E 0x91BF # -0x6321 0x91C2 # -0x6322 0x91C3 # -0x6323 0x91C5 # -0x6324 0x91D3 # -0x6325 0x91D4 # -0x6326 0x91D7 # -0x6327 0x91D9 # -0x6328 0x91DA # -0x6329 0x91DE # -0x632A 0x91E4 # -0x632B 0x91E5 # -0x632C 0x91E9 # -0x632D 0x91EA # -0x632E 0x91EC # -0x632F 0x91ED # -0x6330 0x91EE # -0x6331 0x91EF # -0x6332 0x91F0 # -0x6333 0x91F1 # -0x6334 0x91F7 # -0x6335 0x91F9 # -0x6336 0x91FB # -0x6337 0x91FD # -0x6338 0x9200 # -0x6339 0x9201 # -0x633A 0x9204 # -0x633B 0x9205 # -0x633C 0x9206 # -0x633D 0x9207 # -0x633E 0x9209 # -0x633F 0x920A # -0x6340 0x920C # -0x6341 0x9210 # -0x6342 0x9212 # -0x6343 0x9213 # -0x6344 0x9216 # -0x6345 0x9218 # -0x6346 0x921C # -0x6347 0x921D # -0x6348 0x9223 # -0x6349 0x9224 # -0x634A 0x9225 # -0x634B 0x9226 # -0x634C 0x9228 # -0x634D 0x922E # -0x634E 0x922F # -0x634F 0x9230 # -0x6350 0x9233 # -0x6351 0x9235 # -0x6352 0x9236 # -0x6353 0x9238 # -0x6354 0x9239 # -0x6355 0x923A # -0x6356 0x923C # -0x6357 0x923E # -0x6358 0x9240 # -0x6359 0x9242 # -0x635A 0x9243 # -0x635B 0x9246 # -0x635C 0x9247 # -0x635D 0x924A # -0x635E 0x924D # -0x635F 0x924E # -0x6360 0x924F # -0x6361 0x9251 # -0x6362 0x9258 # -0x6363 0x9259 # -0x6364 0x925C # -0x6365 0x925D # -0x6366 0x9260 # -0x6367 0x9261 # -0x6368 0x9265 # -0x6369 0x9267 # -0x636A 0x9268 # -0x636B 0x9269 # -0x636C 0x926E # -0x636D 0x926F # -0x636E 0x9270 # -0x636F 0x9275 # -0x6370 0x9276 # -0x6371 0x9277 # -0x6372 0x9278 # -0x6373 0x9279 # -0x6374 0x927B # -0x6375 0x927C # -0x6376 0x927D # -0x6377 0x927F # -0x6378 0x9288 # -0x6379 0x9289 # -0x637A 0x928A # -0x637B 0x928D # -0x637C 0x928E # -0x637D 0x9292 # -0x637E 0x9297 # -0x6421 0x9299 # -0x6422 0x929F # -0x6423 0x92A0 # -0x6424 0x92A4 # -0x6425 0x92A5 # -0x6426 0x92A7 # -0x6427 0x92A8 # -0x6428 0x92AB # -0x6429 0x92AF # -0x642A 0x92B2 # -0x642B 0x92B6 # -0x642C 0x92B8 # -0x642D 0x92BA # -0x642E 0x92BB # -0x642F 0x92BC # -0x6430 0x92BD # -0x6431 0x92BF # -0x6432 0x92C0 # -0x6433 0x92C1 # -0x6434 0x92C2 # -0x6435 0x92C3 # -0x6436 0x92C5 # -0x6437 0x92C6 # -0x6438 0x92C7 # -0x6439 0x92C8 # -0x643A 0x92CB # -0x643B 0x92CC # -0x643C 0x92CD # -0x643D 0x92CE # -0x643E 0x92D0 # -0x643F 0x92D3 # -0x6440 0x92D5 # -0x6441 0x92D7 # -0x6442 0x92D8 # -0x6443 0x92D9 # -0x6444 0x92DC # -0x6445 0x92DD # -0x6446 0x92DF # -0x6447 0x92E0 # -0x6448 0x92E1 # -0x6449 0x92E3 # -0x644A 0x92E5 # -0x644B 0x92E7 # -0x644C 0x92E8 # -0x644D 0x92EC # -0x644E 0x92EE # -0x644F 0x92F0 # -0x6450 0x92F9 # -0x6451 0x92FB # -0x6452 0x92FF # -0x6453 0x9300 # -0x6454 0x9302 # -0x6455 0x9308 # -0x6456 0x930D # -0x6457 0x9311 # -0x6458 0x9314 # -0x6459 0x9315 # -0x645A 0x931C # -0x645B 0x931D # -0x645C 0x931E # -0x645D 0x931F # -0x645E 0x9321 # -0x645F 0x9324 # -0x6460 0x9325 # -0x6461 0x9327 # -0x6462 0x9329 # -0x6463 0x932A # -0x6464 0x9333 # -0x6465 0x9334 # -0x6466 0x9336 # -0x6467 0x9337 # -0x6468 0x9347 # -0x6469 0x9348 # -0x646A 0x9349 # -0x646B 0x9350 # -0x646C 0x9351 # -0x646D 0x9352 # -0x646E 0x9355 # -0x646F 0x9357 # -0x6470 0x9358 # -0x6471 0x935A # -0x6472 0x935E # -0x6473 0x9364 # -0x6474 0x9365 # -0x6475 0x9367 # -0x6476 0x9369 # -0x6477 0x936A # -0x6478 0x936D # -0x6479 0x936F # -0x647A 0x9370 # -0x647B 0x9371 # -0x647C 0x9373 # -0x647D 0x9374 # -0x647E 0x9376 # -0x6521 0x937A # -0x6522 0x937D # -0x6523 0x937F # -0x6524 0x9380 # -0x6525 0x9381 # -0x6526 0x9382 # -0x6527 0x9388 # -0x6528 0x938A # -0x6529 0x938B # -0x652A 0x938D # -0x652B 0x938F # -0x652C 0x9392 # -0x652D 0x9395 # -0x652E 0x9398 # -0x652F 0x939B # -0x6530 0x939E # -0x6531 0x93A1 # -0x6532 0x93A3 # -0x6533 0x93A4 # -0x6534 0x93A6 # -0x6535 0x93A8 # -0x6536 0x93AB # -0x6537 0x93B4 # -0x6538 0x93B5 # -0x6539 0x93B6 # -0x653A 0x93BA # -0x653B 0x93A9 # -0x653C 0x93C1 # -0x653D 0x93C4 # -0x653E 0x93C5 # -0x653F 0x93C6 # -0x6540 0x93C7 # -0x6541 0x93C9 # -0x6542 0x93CA # -0x6543 0x93CB # -0x6544 0x93CC # -0x6545 0x93CD # -0x6546 0x93D3 # -0x6547 0x93D9 # -0x6548 0x93DC # -0x6549 0x93DE # -0x654A 0x93DF # -0x654B 0x93E2 # -0x654C 0x93E6 # -0x654D 0x93E7 # -0x654E 0x93F9 # -0x654F 0x93F7 # -0x6550 0x93F8 # -0x6551 0x93FA # -0x6552 0x93FB # -0x6553 0x93FD # -0x6554 0x9401 # -0x6555 0x9402 # -0x6556 0x9404 # -0x6557 0x9408 # -0x6558 0x9409 # -0x6559 0x940D # -0x655A 0x940E # -0x655B 0x940F # -0x655C 0x9415 # -0x655D 0x9416 # -0x655E 0x9417 # -0x655F 0x941F # -0x6560 0x942E # -0x6561 0x942F # -0x6562 0x9431 # -0x6563 0x9432 # -0x6564 0x9433 # -0x6565 0x9434 # -0x6566 0x943B # -0x6567 0x943F # -0x6568 0x943D # -0x6569 0x9443 # -0x656A 0x9445 # -0x656B 0x9448 # -0x656C 0x944A # -0x656D 0x944C # -0x656E 0x9455 # -0x656F 0x9459 # -0x6570 0x945C # -0x6571 0x945F # -0x6572 0x9461 # -0x6573 0x9463 # -0x6574 0x9468 # -0x6575 0x946B # -0x6576 0x946D # -0x6577 0x946E # -0x6578 0x946F # -0x6579 0x9471 # -0x657A 0x9472 # -0x657B 0x9484 # -0x657C 0x9483 # -0x657D 0x9578 # -0x657E 0x9579 # -0x6621 0x957E # -0x6622 0x9584 # -0x6623 0x9588 # -0x6624 0x958C # -0x6625 0x958D # -0x6626 0x958E # -0x6627 0x959D # -0x6628 0x959E # -0x6629 0x959F # -0x662A 0x95A1 # -0x662B 0x95A6 # -0x662C 0x95A9 # -0x662D 0x95AB # -0x662E 0x95AC # -0x662F 0x95B4 # -0x6630 0x95B6 # -0x6631 0x95BA # -0x6632 0x95BD # -0x6633 0x95BF # -0x6634 0x95C6 # -0x6635 0x95C8 # -0x6636 0x95C9 # -0x6637 0x95CB # -0x6638 0x95D0 # -0x6639 0x95D1 # -0x663A 0x95D2 # -0x663B 0x95D3 # -0x663C 0x95D9 # -0x663D 0x95DA # -0x663E 0x95DD # -0x663F 0x95DE # -0x6640 0x95DF # -0x6641 0x95E0 # -0x6642 0x95E4 # -0x6643 0x95E6 # -0x6644 0x961D # -0x6645 0x961E # -0x6646 0x9622 # -0x6647 0x9624 # -0x6648 0x9625 # -0x6649 0x9626 # -0x664A 0x962C # -0x664B 0x9631 # -0x664C 0x9633 # -0x664D 0x9637 # -0x664E 0x9638 # -0x664F 0x9639 # -0x6650 0x963A # -0x6651 0x963C # -0x6652 0x963D # -0x6653 0x9641 # -0x6654 0x9652 # -0x6655 0x9654 # -0x6656 0x9656 # -0x6657 0x9657 # -0x6658 0x9658 # -0x6659 0x9661 # -0x665A 0x966E # -0x665B 0x9674 # -0x665C 0x967B # -0x665D 0x967C # -0x665E 0x967E # -0x665F 0x967F # -0x6660 0x9681 # -0x6661 0x9682 # -0x6662 0x9683 # -0x6663 0x9684 # -0x6664 0x9689 # -0x6665 0x9691 # -0x6666 0x9696 # -0x6667 0x969A # -0x6668 0x969D # -0x6669 0x969F # -0x666A 0x96A4 # -0x666B 0x96A5 # -0x666C 0x96A6 # -0x666D 0x96A9 # -0x666E 0x96AE # -0x666F 0x96AF # -0x6670 0x96B3 # -0x6671 0x96BA # -0x6672 0x96CA # -0x6673 0x96D2 # -0x6674 0x5DB2 # -0x6675 0x96D8 # -0x6676 0x96DA # -0x6677 0x96DD # -0x6678 0x96DE # -0x6679 0x96DF # -0x667A 0x96E9 # -0x667B 0x96EF # -0x667C 0x96F1 # -0x667D 0x96FA # -0x667E 0x9702 # -0x6721 0x9703 # -0x6722 0x9705 # -0x6723 0x9709 # -0x6724 0x971A # -0x6725 0x971B # -0x6726 0x971D # -0x6727 0x9721 # -0x6728 0x9722 # -0x6729 0x9723 # -0x672A 0x9728 # -0x672B 0x9731 # -0x672C 0x9733 # -0x672D 0x9741 # -0x672E 0x9743 # -0x672F 0x974A # -0x6730 0x974E # -0x6731 0x974F # -0x6732 0x9755 # -0x6733 0x9757 # -0x6734 0x9758 # -0x6735 0x975A # -0x6736 0x975B # -0x6737 0x9763 # -0x6738 0x9767 # -0x6739 0x976A # -0x673A 0x976E # -0x673B 0x9773 # -0x673C 0x9776 # -0x673D 0x9777 # -0x673E 0x9778 # -0x673F 0x977B # -0x6740 0x977D # -0x6741 0x977F # -0x6742 0x9780 # -0x6743 0x9789 # -0x6744 0x9795 # -0x6745 0x9796 # -0x6746 0x9797 # -0x6747 0x9799 # -0x6748 0x979A # -0x6749 0x979E # -0x674A 0x979F # -0x674B 0x97A2 # -0x674C 0x97AC # -0x674D 0x97AE # -0x674E 0x97B1 # -0x674F 0x97B2 # -0x6750 0x97B5 # -0x6751 0x97B6 # -0x6752 0x97B8 # -0x6753 0x97B9 # -0x6754 0x97BA # -0x6755 0x97BC # -0x6756 0x97BE # -0x6757 0x97BF # -0x6758 0x97C1 # -0x6759 0x97C4 # -0x675A 0x97C5 # -0x675B 0x97C7 # -0x675C 0x97C9 # -0x675D 0x97CA # -0x675E 0x97CC # -0x675F 0x97CD # -0x6760 0x97CE # -0x6761 0x97D0 # -0x6762 0x97D1 # -0x6763 0x97D4 # -0x6764 0x97D7 # -0x6765 0x97D8 # -0x6766 0x97D9 # -0x6767 0x97DD # -0x6768 0x97DE # -0x6769 0x97E0 # -0x676A 0x97DB # -0x676B 0x97E1 # -0x676C 0x97E4 # -0x676D 0x97EF # -0x676E 0x97F1 # -0x676F 0x97F4 # -0x6770 0x97F7 # -0x6771 0x97F8 # -0x6772 0x97FA # -0x6773 0x9807 # -0x6774 0x980A # -0x6775 0x9819 # -0x6776 0x980D # -0x6777 0x980E # -0x6778 0x9814 # -0x6779 0x9816 # -0x677A 0x981C # -0x677B 0x981E # -0x677C 0x9820 # -0x677D 0x9823 # -0x677E 0x9826 # -0x6821 0x982B # -0x6822 0x982E # -0x6823 0x982F # -0x6824 0x9830 # -0x6825 0x9832 # -0x6826 0x9833 # -0x6827 0x9835 # -0x6828 0x9825 # -0x6829 0x983E # -0x682A 0x9844 # -0x682B 0x9847 # -0x682C 0x984A # -0x682D 0x9851 # -0x682E 0x9852 # -0x682F 0x9853 # -0x6830 0x9856 # -0x6831 0x9857 # -0x6832 0x9859 # -0x6833 0x985A # -0x6834 0x9862 # -0x6835 0x9863 # -0x6836 0x9865 # -0x6837 0x9866 # -0x6838 0x986A # -0x6839 0x986C # -0x683A 0x98AB # -0x683B 0x98AD # -0x683C 0x98AE # -0x683D 0x98B0 # -0x683E 0x98B4 # -0x683F 0x98B7 # -0x6840 0x98B8 # -0x6841 0x98BA # -0x6842 0x98BB # -0x6843 0x98BF # -0x6844 0x98C2 # -0x6845 0x98C5 # -0x6846 0x98C8 # -0x6847 0x98CC # -0x6848 0x98E1 # -0x6849 0x98E3 # -0x684A 0x98E5 # -0x684B 0x98E6 # -0x684C 0x98E7 # -0x684D 0x98EA # -0x684E 0x98F3 # -0x684F 0x98F6 # -0x6850 0x9902 # -0x6851 0x9907 # -0x6852 0x9908 # -0x6853 0x9911 # -0x6854 0x9915 # -0x6855 0x9916 # -0x6856 0x9917 # -0x6857 0x991A # -0x6858 0x991B # -0x6859 0x991C # -0x685A 0x991F # -0x685B 0x9922 # -0x685C 0x9926 # -0x685D 0x9927 # -0x685E 0x992B # -0x685F 0x9931 # -0x6860 0x9932 # -0x6861 0x9933 # -0x6862 0x9934 # -0x6863 0x9935 # -0x6864 0x9939 # -0x6865 0x993A # -0x6866 0x993B # -0x6867 0x993C # -0x6868 0x9940 # -0x6869 0x9941 # -0x686A 0x9946 # -0x686B 0x9947 # -0x686C 0x9948 # -0x686D 0x994D # -0x686E 0x994E # -0x686F 0x9954 # -0x6870 0x9958 # -0x6871 0x9959 # -0x6872 0x995B # -0x6873 0x995C # -0x6874 0x995E # -0x6875 0x995F # -0x6876 0x9960 # -0x6877 0x999B # -0x6878 0x999D # -0x6879 0x999F # -0x687A 0x99A6 # -0x687B 0x99B0 # -0x687C 0x99B1 # -0x687D 0x99B2 # -0x687E 0x99B5 # -0x6921 0x99B9 # -0x6922 0x99BA # -0x6923 0x99BD # -0x6924 0x99BF # -0x6925 0x99C3 # -0x6926 0x99C9 # -0x6927 0x99D3 # -0x6928 0x99D4 # -0x6929 0x99D9 # -0x692A 0x99DA # -0x692B 0x99DC # -0x692C 0x99DE # -0x692D 0x99E7 # -0x692E 0x99EA # -0x692F 0x99EB # -0x6930 0x99EC # -0x6931 0x99F0 # -0x6932 0x99F4 # -0x6933 0x99F5 # -0x6934 0x99F9 # -0x6935 0x99FD # -0x6936 0x99FE # -0x6937 0x9A02 # -0x6938 0x9A03 # -0x6939 0x9A04 # -0x693A 0x9A0B # -0x693B 0x9A0C # -0x693C 0x9A10 # -0x693D 0x9A11 # -0x693E 0x9A16 # -0x693F 0x9A1E # -0x6940 0x9A20 # -0x6941 0x9A22 # -0x6942 0x9A23 # -0x6943 0x9A24 # -0x6944 0x9A27 # -0x6945 0x9A2D # -0x6946 0x9A2E # -0x6947 0x9A33 # -0x6948 0x9A35 # -0x6949 0x9A36 # -0x694A 0x9A38 # -0x694B 0x9A47 # -0x694C 0x9A41 # -0x694D 0x9A44 # -0x694E 0x9A4A # -0x694F 0x9A4B # -0x6950 0x9A4C # -0x6951 0x9A4E # -0x6952 0x9A51 # -0x6953 0x9A54 # -0x6954 0x9A56 # -0x6955 0x9A5D # -0x6956 0x9AAA # -0x6957 0x9AAC # -0x6958 0x9AAE # -0x6959 0x9AAF # -0x695A 0x9AB2 # -0x695B 0x9AB4 # -0x695C 0x9AB5 # -0x695D 0x9AB6 # -0x695E 0x9AB9 # -0x695F 0x9ABB # -0x6960 0x9ABE # -0x6961 0x9ABF # -0x6962 0x9AC1 # -0x6963 0x9AC3 # -0x6964 0x9AC6 # -0x6965 0x9AC8 # -0x6966 0x9ACE # -0x6967 0x9AD0 # -0x6968 0x9AD2 # -0x6969 0x9AD5 # -0x696A 0x9AD6 # -0x696B 0x9AD7 # -0x696C 0x9ADB # -0x696D 0x9ADC # -0x696E 0x9AE0 # -0x696F 0x9AE4 # -0x6970 0x9AE5 # -0x6971 0x9AE7 # -0x6972 0x9AE9 # -0x6973 0x9AEC # -0x6974 0x9AF2 # -0x6975 0x9AF3 # -0x6976 0x9AF5 # -0x6977 0x9AF9 # -0x6978 0x9AFA # -0x6979 0x9AFD # -0x697A 0x9AFF # -0x697B 0x9B00 # -0x697C 0x9B01 # -0x697D 0x9B02 # -0x697E 0x9B03 # -0x6A21 0x9B04 # -0x6A22 0x9B05 # -0x6A23 0x9B08 # -0x6A24 0x9B09 # -0x6A25 0x9B0B # -0x6A26 0x9B0C # -0x6A27 0x9B0D # -0x6A28 0x9B0E # -0x6A29 0x9B10 # -0x6A2A 0x9B12 # -0x6A2B 0x9B16 # -0x6A2C 0x9B19 # -0x6A2D 0x9B1B # -0x6A2E 0x9B1C # -0x6A2F 0x9B20 # -0x6A30 0x9B26 # -0x6A31 0x9B2B # -0x6A32 0x9B2D # -0x6A33 0x9B33 # -0x6A34 0x9B34 # -0x6A35 0x9B35 # -0x6A36 0x9B37 # -0x6A37 0x9B39 # -0x6A38 0x9B3A # -0x6A39 0x9B3D # -0x6A3A 0x9B48 # -0x6A3B 0x9B4B # -0x6A3C 0x9B4C # -0x6A3D 0x9B55 # -0x6A3E 0x9B56 # -0x6A3F 0x9B57 # -0x6A40 0x9B5B # -0x6A41 0x9B5E # -0x6A42 0x9B61 # -0x6A43 0x9B63 # -0x6A44 0x9B65 # -0x6A45 0x9B66 # -0x6A46 0x9B68 # -0x6A47 0x9B6A # -0x6A48 0x9B6B # -0x6A49 0x9B6C # -0x6A4A 0x9B6D # -0x6A4B 0x9B6E # -0x6A4C 0x9B73 # -0x6A4D 0x9B75 # -0x6A4E 0x9B77 # -0x6A4F 0x9B78 # -0x6A50 0x9B79 # -0x6A51 0x9B7F # -0x6A52 0x9B80 # -0x6A53 0x9B84 # -0x6A54 0x9B85 # -0x6A55 0x9B86 # -0x6A56 0x9B87 # -0x6A57 0x9B89 # -0x6A58 0x9B8A # -0x6A59 0x9B8B # -0x6A5A 0x9B8D # -0x6A5B 0x9B8F # -0x6A5C 0x9B90 # -0x6A5D 0x9B94 # -0x6A5E 0x9B9A # -0x6A5F 0x9B9D # -0x6A60 0x9B9E # -0x6A61 0x9BA6 # -0x6A62 0x9BA7 # -0x6A63 0x9BA9 # -0x6A64 0x9BAC # -0x6A65 0x9BB0 # -0x6A66 0x9BB1 # -0x6A67 0x9BB2 # -0x6A68 0x9BB7 # -0x6A69 0x9BB8 # -0x6A6A 0x9BBB # -0x6A6B 0x9BBC # -0x6A6C 0x9BBE # -0x6A6D 0x9BBF # -0x6A6E 0x9BC1 # -0x6A6F 0x9BC7 # -0x6A70 0x9BC8 # -0x6A71 0x9BCE # -0x6A72 0x9BD0 # -0x6A73 0x9BD7 # -0x6A74 0x9BD8 # -0x6A75 0x9BDD # -0x6A76 0x9BDF # -0x6A77 0x9BE5 # -0x6A78 0x9BE7 # -0x6A79 0x9BEA # -0x6A7A 0x9BEB # -0x6A7B 0x9BEF # -0x6A7C 0x9BF3 # -0x6A7D 0x9BF7 # -0x6A7E 0x9BF8 # -0x6B21 0x9BF9 # -0x6B22 0x9BFA # -0x6B23 0x9BFD # -0x6B24 0x9BFF # -0x6B25 0x9C00 # -0x6B26 0x9C02 # -0x6B27 0x9C0B # -0x6B28 0x9C0F # -0x6B29 0x9C11 # -0x6B2A 0x9C16 # -0x6B2B 0x9C18 # -0x6B2C 0x9C19 # -0x6B2D 0x9C1A # -0x6B2E 0x9C1C # -0x6B2F 0x9C1E # -0x6B30 0x9C22 # -0x6B31 0x9C23 # -0x6B32 0x9C26 # -0x6B33 0x9C27 # -0x6B34 0x9C28 # -0x6B35 0x9C29 # -0x6B36 0x9C2A # -0x6B37 0x9C31 # -0x6B38 0x9C35 # -0x6B39 0x9C36 # -0x6B3A 0x9C37 # -0x6B3B 0x9C3D # -0x6B3C 0x9C41 # -0x6B3D 0x9C43 # -0x6B3E 0x9C44 # -0x6B3F 0x9C45 # -0x6B40 0x9C49 # -0x6B41 0x9C4A # -0x6B42 0x9C4E # -0x6B43 0x9C4F # -0x6B44 0x9C50 # -0x6B45 0x9C53 # -0x6B46 0x9C54 # -0x6B47 0x9C56 # -0x6B48 0x9C58 # -0x6B49 0x9C5B # -0x6B4A 0x9C5D # -0x6B4B 0x9C5E # -0x6B4C 0x9C5F # -0x6B4D 0x9C63 # -0x6B4E 0x9C69 # -0x6B4F 0x9C6A # -0x6B50 0x9C5C # -0x6B51 0x9C6B # -0x6B52 0x9C68 # -0x6B53 0x9C6E # -0x6B54 0x9C70 # -0x6B55 0x9C72 # -0x6B56 0x9C75 # -0x6B57 0x9C77 # -0x6B58 0x9C7B # -0x6B59 0x9CE6 # -0x6B5A 0x9CF2 # -0x6B5B 0x9CF7 # -0x6B5C 0x9CF9 # -0x6B5D 0x9D0B # -0x6B5E 0x9D02 # -0x6B5F 0x9D11 # -0x6B60 0x9D17 # -0x6B61 0x9D18 # -0x6B62 0x9D1C # -0x6B63 0x9D1D # -0x6B64 0x9D1E # -0x6B65 0x9D2F # -0x6B66 0x9D30 # -0x6B67 0x9D32 # -0x6B68 0x9D33 # -0x6B69 0x9D34 # -0x6B6A 0x9D3A # -0x6B6B 0x9D3C # -0x6B6C 0x9D45 # -0x6B6D 0x9D3D # -0x6B6E 0x9D42 # -0x6B6F 0x9D43 # -0x6B70 0x9D47 # -0x6B71 0x9D4A # -0x6B72 0x9D53 # -0x6B73 0x9D54 # -0x6B74 0x9D5F # -0x6B75 0x9D63 # -0x6B76 0x9D62 # -0x6B77 0x9D65 # -0x6B78 0x9D69 # -0x6B79 0x9D6A # -0x6B7A 0x9D6B # -0x6B7B 0x9D70 # -0x6B7C 0x9D76 # -0x6B7D 0x9D77 # -0x6B7E 0x9D7B # -0x6C21 0x9D7C # -0x6C22 0x9D7E # -0x6C23 0x9D83 # -0x6C24 0x9D84 # -0x6C25 0x9D86 # -0x6C26 0x9D8A # -0x6C27 0x9D8D # -0x6C28 0x9D8E # -0x6C29 0x9D92 # -0x6C2A 0x9D93 # -0x6C2B 0x9D95 # -0x6C2C 0x9D96 # -0x6C2D 0x9D97 # -0x6C2E 0x9D98 # -0x6C2F 0x9DA1 # -0x6C30 0x9DAA # -0x6C31 0x9DAC # -0x6C32 0x9DAE # -0x6C33 0x9DB1 # -0x6C34 0x9DB5 # -0x6C35 0x9DB9 # -0x6C36 0x9DBC # -0x6C37 0x9DBF # -0x6C38 0x9DC3 # -0x6C39 0x9DC7 # -0x6C3A 0x9DC9 # -0x6C3B 0x9DCA # -0x6C3C 0x9DD4 # -0x6C3D 0x9DD5 # -0x6C3E 0x9DD6 # -0x6C3F 0x9DD7 # -0x6C40 0x9DDA # -0x6C41 0x9DDE # -0x6C42 0x9DDF # -0x6C43 0x9DE0 # -0x6C44 0x9DE5 # -0x6C45 0x9DE7 # -0x6C46 0x9DE9 # -0x6C47 0x9DEB # -0x6C48 0x9DEE # -0x6C49 0x9DF0 # -0x6C4A 0x9DF3 # -0x6C4B 0x9DF4 # -0x6C4C 0x9DFE # -0x6C4D 0x9E0A # -0x6C4E 0x9E02 # -0x6C4F 0x9E07 # -0x6C50 0x9E0E # -0x6C51 0x9E10 # -0x6C52 0x9E11 # -0x6C53 0x9E12 # -0x6C54 0x9E15 # -0x6C55 0x9E16 # -0x6C56 0x9E19 # -0x6C57 0x9E1C # -0x6C58 0x9E1D # -0x6C59 0x9E7A # -0x6C5A 0x9E7B # -0x6C5B 0x9E7C # -0x6C5C 0x9E80 # -0x6C5D 0x9E82 # -0x6C5E 0x9E83 # -0x6C5F 0x9E84 # -0x6C60 0x9E85 # -0x6C61 0x9E87 # -0x6C62 0x9E8E # -0x6C63 0x9E8F # -0x6C64 0x9E96 # -0x6C65 0x9E98 # -0x6C66 0x9E9B # -0x6C67 0x9E9E # -0x6C68 0x9EA4 # -0x6C69 0x9EA8 # -0x6C6A 0x9EAC # -0x6C6B 0x9EAE # -0x6C6C 0x9EAF # -0x6C6D 0x9EB0 # -0x6C6E 0x9EB3 # -0x6C6F 0x9EB4 # -0x6C70 0x9EB5 # -0x6C71 0x9EC6 # -0x6C72 0x9EC8 # -0x6C73 0x9ECB # -0x6C74 0x9ED5 # -0x6C75 0x9EDF # -0x6C76 0x9EE4 # -0x6C77 0x9EE7 # -0x6C78 0x9EEC # -0x6C79 0x9EED # -0x6C7A 0x9EEE # -0x6C7B 0x9EF0 # -0x6C7C 0x9EF1 # -0x6C7D 0x9EF2 # -0x6C7E 0x9EF5 # -0x6D21 0x9EF8 # -0x6D22 0x9EFF # -0x6D23 0x9F02 # -0x6D24 0x9F03 # -0x6D25 0x9F09 # -0x6D26 0x9F0F # -0x6D27 0x9F10 # -0x6D28 0x9F11 # -0x6D29 0x9F12 # -0x6D2A 0x9F14 # -0x6D2B 0x9F16 # -0x6D2C 0x9F17 # -0x6D2D 0x9F19 # -0x6D2E 0x9F1A # -0x6D2F 0x9F1B # -0x6D30 0x9F1F # -0x6D31 0x9F22 # -0x6D32 0x9F26 # -0x6D33 0x9F2A # -0x6D34 0x9F2B # -0x6D35 0x9F2F # -0x6D36 0x9F31 # -0x6D37 0x9F32 # -0x6D38 0x9F34 # -0x6D39 0x9F37 # -0x6D3A 0x9F39 # -0x6D3B 0x9F3A # -0x6D3C 0x9F3C # -0x6D3D 0x9F3D # -0x6D3E 0x9F3F # -0x6D3F 0x9F41 # -0x6D40 0x9F43 # -0x6D41 0x9F44 # -0x6D42 0x9F45 # -0x6D43 0x9F46 # -0x6D44 0x9F47 # -0x6D45 0x9F53 # -0x6D46 0x9F55 # -0x6D47 0x9F56 # -0x6D48 0x9F57 # -0x6D49 0x9F58 # -0x6D4A 0x9F5A # -0x6D4B 0x9F5D # -0x6D4C 0x9F5E # -0x6D4D 0x9F68 # -0x6D4E 0x9F69 # -0x6D4F 0x9F6D # -0x6D50 0x9F6E # -0x6D51 0x9F6F # -0x6D52 0x9F70 # -0x6D53 0x9F71 # -0x6D54 0x9F73 # -0x6D55 0x9F75 # -0x6D56 0x9F7A # -0x6D57 0x9F7D # -0x6D58 0x9F8F # -0x6D59 0x9F90 # -0x6D5A 0x9F91 # -0x6D5B 0x9F92 # -0x6D5C 0x9F94 # -0x6D5D 0x9F96 # -0x6D5E 0x9F97 # -0x6D5F 0x9F9E # -0x6D60 0x9FA1 # -0x6D61 0x9FA2 # -0x6D62 0x9FA3 # -0x6D63 0x9FA5 # From webhook-mailer at python.org Sat May 28 23:24:40 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Sun, 29 May 2022 03:24:40 -0000 Subject: [Python-checkins] gh-92240 : Include release dates for "What's New In Python 3.X" (#92937) Message-ID: https://github.com/python/cpython/commit/877ad7b3b2778a305d3989d58ebd68cb01baf26e commit: 877ad7b3b2778a305d3989d58ebd68cb01baf26e branch: main author: georgically <40323509+georgically at users.noreply.github.com> committer: JelleZijlstra date: 2022-05-28T20:24:35-07:00 summary: gh-92240 : Include release dates for "What's New In Python 3.X" (#92937) Co-authored-by: Jelle Zijlstra Co-authored-by: Adam Turner <9087854+AA-Turner at users.noreply.github.com> files: A Misc/NEWS.d/next/Documentation/2022-05-18-23-58-26.gh-issue-92240.bHvYiz.rst M Doc/whatsnew/2.5.rst M Doc/whatsnew/2.6.rst M Doc/whatsnew/3.0.rst M Doc/whatsnew/3.1.rst M Doc/whatsnew/3.10.rst M Doc/whatsnew/3.2.rst M Doc/whatsnew/3.8.rst M Doc/whatsnew/3.9.rst diff --git a/Doc/whatsnew/2.5.rst b/Doc/whatsnew/2.5.rst index 5816380e102f9..103a72f913c63 100644 --- a/Doc/whatsnew/2.5.rst +++ b/Doc/whatsnew/2.5.rst @@ -11,7 +11,7 @@ This article explains the new features in Python 2.5. The final release of Python 2.5 is scheduled for August 2006; :pep:`356` describes the planned -release schedule. +release schedule. Python 2.5 was released on September 19, 2006. The changes in Python 2.5 are an interesting mix of language and library improvements. The library enhancements will be more important to Python's user diff --git a/Doc/whatsnew/2.6.rst b/Doc/whatsnew/2.6.rst index b6174a19a178b..08a7c58b0f080 100644 --- a/Doc/whatsnew/2.6.rst +++ b/Doc/whatsnew/2.6.rst @@ -49,7 +49,7 @@ This saves the maintainer some effort going through the SVN logs when researching a change. -This article explains the new features in Python 2.6, released on October 1 +This article explains the new features in Python 2.6, released on October 1, 2008. The release schedule is described in :pep:`361`. The major theme of Python 2.6 is preparing the migration path to diff --git a/Doc/whatsnew/3.0.rst b/Doc/whatsnew/3.0.rst index 880958d3edb90..4da3507ad2e89 100644 --- a/Doc/whatsnew/3.0.rst +++ b/Doc/whatsnew/3.0.rst @@ -53,9 +53,9 @@ This article explains the new features in Python 3.0, compared to 2.6. Python 3.0, also known as "Python 3000" or "Py3K", is the first ever -*intentionally backwards incompatible* Python release. There are more -changes than in a typical release, and more that are important for all -Python users. Nevertheless, after digesting the changes, you'll find +*intentionally backwards incompatible* Python release. Python 3.0 was released on December 3, 2008. +There are more changes than in a typical release, and more that are important for all +Python users. Nevertheless, after digesting the changes, you'll find that Python really hasn't changed all that much -- by and large, we're mostly fixing well-known annoyances and warts, and removing a lot of old cruft. diff --git a/Doc/whatsnew/3.1.rst b/Doc/whatsnew/3.1.rst index f1e6d0c4f3dd6..3d89b97fa8f1b 100644 --- a/Doc/whatsnew/3.1.rst +++ b/Doc/whatsnew/3.1.rst @@ -47,6 +47,7 @@ when researching a change. This article explains the new features in Python 3.1, compared to 3.0. +Python 3.1 was released on?June 27, 2009. PEP 372: Ordered Dictionaries diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index f93523a4c50a8..1f2e2a81860c1 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -47,7 +47,7 @@ when researching a change. This article explains the new features in Python 3.10, compared to 3.9. - +Python 3.10 was released on October 4, 2021. For full details, see the :ref:`changelog `. Summary -- Release highlights diff --git a/Doc/whatsnew/3.2.rst b/Doc/whatsnew/3.2.rst index ec01a70f8ae0a..15f8672adda0d 100644 --- a/Doc/whatsnew/3.2.rst +++ b/Doc/whatsnew/3.2.rst @@ -48,7 +48,8 @@ This saves the maintainer the effort of going through the SVN log when researching a change. -This article explains the new features in Python 3.2 as compared to 3.1. It +This article explains the new features in Python 3.2 as compared to 3.1. +Python 3.2 was released on February 20, 2011. It focuses on a few highlights and gives a few examples. For full details, see the `Misc/NEWS `_ diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index c2f78f1531317..9e8d6fe8e20f5 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -45,6 +45,7 @@ :Editor: Raymond Hettinger This article explains the new features in Python 3.8, compared to 3.7. +Python 3.8 was released on October 14, 2019. For full details, see the :ref:`changelog `. .. testsetup:: diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index 6dee55e5a0e55..6deaede4953bd 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -45,7 +45,7 @@ when researching a change. This article explains the new features in Python 3.9, compared to 3.8. -Python 3.9 was released on October 5th, 2020. +Python 3.9 was released on October 5, 2020. For full details, see the :ref:`changelog `. diff --git a/Misc/NEWS.d/next/Documentation/2022-05-18-23-58-26.gh-issue-92240.bHvYiz.rst b/Misc/NEWS.d/next/Documentation/2022-05-18-23-58-26.gh-issue-92240.bHvYiz.rst new file mode 100644 index 0000000000000..53b2a66c9779c --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2022-05-18-23-58-26.gh-issue-92240.bHvYiz.rst @@ -0,0 +1,2 @@ +Added release dates for +"What's New in Python 3.X" for 3.0, 3.1, 3.2, 3.8 and 3.10 From webhook-mailer at python.org Sat May 28 23:25:55 2022 From: webhook-mailer at python.org (JelleZijlstra) Date: Sun, 29 May 2022 03:25:55 -0000 Subject: [Python-checkins] bpo-41287: Handle `doc` argument of `property.__init__` in subclasses (#23205) Message-ID: https://github.com/python/cpython/commit/66f5add1f0ac801cba5ece36e6cfd68985d82029 commit: 66f5add1f0ac801cba5ece36e6cfd68985d82029 branch: main author: Sergei Izmailov committer: JelleZijlstra date: 2022-05-28T20:25:51-07:00 summary: bpo-41287: Handle `doc` argument of `property.__init__` in subclasses (#23205) Fixes #85459 Co-authored-by: Jelle Zijlstra files: A Misc/NEWS.d/next/Library/2022-04-03-11-25-02.bpo-41287.8CTdwf.rst M Lib/test/test_property.py M Objects/descrobject.c diff --git a/Lib/test/test_property.py b/Lib/test/test_property.py index d91ad1c191275..d07b8632aa872 100644 --- a/Lib/test/test_property.py +++ b/Lib/test/test_property.py @@ -219,6 +219,9 @@ def test_property_set_name_incorrect_args(self): class PropertySub(property): """This is a subclass of property""" +class PropertySubWoDoc(property): + pass + class PropertySubSlots(property): """This is a subclass of property that defines __slots__""" __slots__ = () @@ -237,6 +240,38 @@ def spam(self): else: raise Exception("AttributeError not raised") + @unittest.skipIf(sys.flags.optimize >= 2, + "Docstrings are omitted with -O2 and above") + def test_issue41287(self): + + self.assertEqual(PropertySub.__doc__, "This is a subclass of property", + "Docstring of `property` subclass is ignored") + + doc = PropertySub(None, None, None, "issue 41287 is fixed").__doc__ + self.assertEqual(doc, "issue 41287 is fixed", + "Subclasses of `property` ignores `doc` constructor argument") + + def getter(x): + """Getter docstring""" + + def getter_wo_doc(x): + pass + + for ps in property, PropertySub, PropertySubWoDoc: + doc = ps(getter, None, None, "issue 41287 is fixed").__doc__ + self.assertEqual(doc, "issue 41287 is fixed", + "Getter overrides explicit property docstring (%s)" % ps.__name__) + + doc = ps(getter, None, None, None).__doc__ + self.assertEqual(doc, "Getter docstring", "Getter docstring is not picked-up (%s)" % ps.__name__) + + doc = ps(getter_wo_doc, None, None, "issue 41287 is fixed").__doc__ + self.assertEqual(doc, "issue 41287 is fixed", + "Getter overrides explicit property docstring (%s)" % ps.__name__) + + doc = ps(getter_wo_doc, None, None, None).__doc__ + self.assertIsNone(doc, "Property class doc appears in instance __doc__ (%s)" % ps.__name__) + @unittest.skipIf(sys.flags.optimize >= 2, "Docstrings are omitted with -O2 and above") def test_docstring_copy(self): @@ -249,6 +284,66 @@ def spam(self): Foo.spam.__doc__, "spam wrapped in property subclass") + @unittest.skipIf(sys.flags.optimize >= 2, + "Docstrings are omitted with -O2 and above") + def test_docstring_copy2(self): + """ + Property tries to provide the best docstring it finds for its instances. + If a user-provided docstring is available, it is preserved on copies. + If no docstring is available during property creation, the property + will utilize the docstring from the getter if available. + """ + def getter1(self): + return 1 + def getter2(self): + """doc 2""" + return 2 + def getter3(self): + """doc 3""" + return 3 + + # Case-1: user-provided doc is preserved in copies + # of property with undocumented getter + p = property(getter1, None, None, "doc-A") + + p2 = p.getter(getter2) + self.assertEqual(p.__doc__, "doc-A") + self.assertEqual(p2.__doc__, "doc-A") + + # Case-2: user-provided doc is preserved in copies + # of property with documented getter + p = property(getter2, None, None, "doc-A") + + p2 = p.getter(getter3) + self.assertEqual(p.__doc__, "doc-A") + self.assertEqual(p2.__doc__, "doc-A") + + # Case-3: with no user-provided doc new getter doc + # takes precendence + p = property(getter2, None, None, None) + + p2 = p.getter(getter3) + self.assertEqual(p.__doc__, "doc 2") + self.assertEqual(p2.__doc__, "doc 3") + + # Case-4: A user-provided doc is assigned after property construction + # with documented getter. The doc IS NOT preserved. + # It's an odd behaviour, but it's a strange enough + # use case with no easy solution. + p = property(getter2, None, None, None) + p.__doc__ = "user" + p2 = p.getter(getter3) + self.assertEqual(p.__doc__, "user") + self.assertEqual(p2.__doc__, "doc 3") + + # Case-5: A user-provided doc is assigned after property construction + # with UNdocumented getter. The doc IS preserved. + p = property(getter1, None, None, None) + p.__doc__ = "user" + p2 = p.getter(getter2) + self.assertEqual(p.__doc__, "user") + self.assertEqual(p2.__doc__, "user") + @unittest.skipIf(sys.flags.optimize >= 2, "Docstrings are omitted with -O2 and above") def test_property_setter_copies_getter_docstring(self): diff --git a/Misc/NEWS.d/next/Library/2022-04-03-11-25-02.bpo-41287.8CTdwf.rst b/Misc/NEWS.d/next/Library/2022-04-03-11-25-02.bpo-41287.8CTdwf.rst new file mode 100644 index 0000000000000..ef80ec664c4a8 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-04-03-11-25-02.bpo-41287.8CTdwf.rst @@ -0,0 +1 @@ +Fix handling of the ``doc`` argument in subclasses of :func:`property`. diff --git a/Objects/descrobject.c b/Objects/descrobject.c index 8e8a46ceca6b3..05797e72bcd41 100644 --- a/Objects/descrobject.c +++ b/Objects/descrobject.c @@ -1782,38 +1782,55 @@ property_init_impl(propertyobject *self, PyObject *fget, PyObject *fset, Py_XINCREF(fget); Py_XINCREF(fset); Py_XINCREF(fdel); - Py_XINCREF(doc); Py_XSETREF(self->prop_get, fget); Py_XSETREF(self->prop_set, fset); Py_XSETREF(self->prop_del, fdel); - Py_XSETREF(self->prop_doc, doc); + Py_XSETREF(self->prop_doc, NULL); Py_XSETREF(self->prop_name, NULL); self->getter_doc = 0; + PyObject *prop_doc = NULL; + if (doc != NULL && doc != Py_None) { + prop_doc = doc; + Py_XINCREF(prop_doc); + } /* if no docstring given and the getter has one, use that one */ - if ((doc == NULL || doc == Py_None) && fget != NULL) { - PyObject *get_doc; - int rc = _PyObject_LookupAttr(fget, &_Py_ID(__doc__), &get_doc); + else if (fget != NULL) { + int rc = _PyObject_LookupAttr(fget, &_Py_ID(__doc__), &prop_doc); if (rc <= 0) { return rc; } - if (Py_IS_TYPE(self, &PyProperty_Type)) { - Py_XSETREF(self->prop_doc, get_doc); + if (prop_doc == Py_None) { + prop_doc = NULL; + Py_DECREF(Py_None); } - else { - /* If this is a property subclass, put __doc__ - in dict of the subclass instance instead, - otherwise it gets shadowed by __doc__ in the - class's dict. */ - int err = PyObject_SetAttr( - (PyObject *)self, &_Py_ID(__doc__), get_doc); - Py_DECREF(get_doc); - if (err < 0) - return -1; + if (prop_doc != NULL){ + self->getter_doc = 1; + } + } + + /* At this point `prop_doc` is either NULL or + a non-None object with incremented ref counter */ + + if (Py_IS_TYPE(self, &PyProperty_Type)) { + Py_XSETREF(self->prop_doc, prop_doc); + } else { + /* If this is a property subclass, put __doc__ + in dict of the subclass instance instead, + otherwise it gets shadowed by __doc__ in the + class's dict. */ + + if (prop_doc == NULL) { + prop_doc = Py_None; + Py_INCREF(prop_doc); } - self->getter_doc = 1; + int err = PyObject_SetAttr( + (PyObject *)self, &_Py_ID(__doc__), prop_doc); + Py_XDECREF(prop_doc); + if (err < 0) + return -1; } return 0; From webhook-mailer at python.org Sat May 28 23:38:56 2022 From: webhook-mailer at python.org (miss-islington) Date: Sun, 29 May 2022 03:38:56 -0000 Subject: [Python-checkins] gh-92240 : Include release dates for "What's New In Python 3.X" (GH-92937) Message-ID: https://github.com/python/cpython/commit/624fc61c8375de02e61f5bf461c80348265ac0fd commit: 624fc61c8375de02e61f5bf461c80348265ac0fd branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-28T20:38:48-07:00 summary: gh-92240 : Include release dates for "What's New In Python 3.X" (GH-92937) Co-authored-by: Jelle Zijlstra Co-authored-by: Adam Turner <9087854+AA-Turner at users.noreply.github.com> (cherry picked from commit 877ad7b3b2778a305d3989d58ebd68cb01baf26e) Co-authored-by: georgically <40323509+georgically at users.noreply.github.com> files: A Misc/NEWS.d/next/Documentation/2022-05-18-23-58-26.gh-issue-92240.bHvYiz.rst M Doc/whatsnew/2.5.rst M Doc/whatsnew/2.6.rst M Doc/whatsnew/3.0.rst M Doc/whatsnew/3.1.rst M Doc/whatsnew/3.10.rst M Doc/whatsnew/3.2.rst M Doc/whatsnew/3.8.rst M Doc/whatsnew/3.9.rst diff --git a/Doc/whatsnew/2.5.rst b/Doc/whatsnew/2.5.rst index 5816380e102f9..103a72f913c63 100644 --- a/Doc/whatsnew/2.5.rst +++ b/Doc/whatsnew/2.5.rst @@ -11,7 +11,7 @@ This article explains the new features in Python 2.5. The final release of Python 2.5 is scheduled for August 2006; :pep:`356` describes the planned -release schedule. +release schedule. Python 2.5 was released on September 19, 2006. The changes in Python 2.5 are an interesting mix of language and library improvements. The library enhancements will be more important to Python's user diff --git a/Doc/whatsnew/2.6.rst b/Doc/whatsnew/2.6.rst index b6174a19a178b..08a7c58b0f080 100644 --- a/Doc/whatsnew/2.6.rst +++ b/Doc/whatsnew/2.6.rst @@ -49,7 +49,7 @@ This saves the maintainer some effort going through the SVN logs when researching a change. -This article explains the new features in Python 2.6, released on October 1 +This article explains the new features in Python 2.6, released on October 1, 2008. The release schedule is described in :pep:`361`. The major theme of Python 2.6 is preparing the migration path to diff --git a/Doc/whatsnew/3.0.rst b/Doc/whatsnew/3.0.rst index 880958d3edb90..4da3507ad2e89 100644 --- a/Doc/whatsnew/3.0.rst +++ b/Doc/whatsnew/3.0.rst @@ -53,9 +53,9 @@ This article explains the new features in Python 3.0, compared to 2.6. Python 3.0, also known as "Python 3000" or "Py3K", is the first ever -*intentionally backwards incompatible* Python release. There are more -changes than in a typical release, and more that are important for all -Python users. Nevertheless, after digesting the changes, you'll find +*intentionally backwards incompatible* Python release. Python 3.0 was released on December 3, 2008. +There are more changes than in a typical release, and more that are important for all +Python users. Nevertheless, after digesting the changes, you'll find that Python really hasn't changed all that much -- by and large, we're mostly fixing well-known annoyances and warts, and removing a lot of old cruft. diff --git a/Doc/whatsnew/3.1.rst b/Doc/whatsnew/3.1.rst index f1e6d0c4f3dd6..3d89b97fa8f1b 100644 --- a/Doc/whatsnew/3.1.rst +++ b/Doc/whatsnew/3.1.rst @@ -47,6 +47,7 @@ when researching a change. This article explains the new features in Python 3.1, compared to 3.0. +Python 3.1 was released on?June 27, 2009. PEP 372: Ordered Dictionaries diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index f93523a4c50a8..1f2e2a81860c1 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -47,7 +47,7 @@ when researching a change. This article explains the new features in Python 3.10, compared to 3.9. - +Python 3.10 was released on October 4, 2021. For full details, see the :ref:`changelog `. Summary -- Release highlights diff --git a/Doc/whatsnew/3.2.rst b/Doc/whatsnew/3.2.rst index ec01a70f8ae0a..15f8672adda0d 100644 --- a/Doc/whatsnew/3.2.rst +++ b/Doc/whatsnew/3.2.rst @@ -48,7 +48,8 @@ This saves the maintainer the effort of going through the SVN log when researching a change. -This article explains the new features in Python 3.2 as compared to 3.1. It +This article explains the new features in Python 3.2 as compared to 3.1. +Python 3.2 was released on February 20, 2011. It focuses on a few highlights and gives a few examples. For full details, see the `Misc/NEWS `_ diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index 94d3b3f15fd29..163332401deeb 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -45,6 +45,7 @@ :Editor: Raymond Hettinger This article explains the new features in Python 3.8, compared to 3.7. +Python 3.8 was released on October 14, 2019. For full details, see the :ref:`changelog `. .. testsetup:: diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index 6dee55e5a0e55..6deaede4953bd 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -45,7 +45,7 @@ when researching a change. This article explains the new features in Python 3.9, compared to 3.8. -Python 3.9 was released on October 5th, 2020. +Python 3.9 was released on October 5, 2020. For full details, see the :ref:`changelog `. diff --git a/Misc/NEWS.d/next/Documentation/2022-05-18-23-58-26.gh-issue-92240.bHvYiz.rst b/Misc/NEWS.d/next/Documentation/2022-05-18-23-58-26.gh-issue-92240.bHvYiz.rst new file mode 100644 index 0000000000000..53b2a66c9779c --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2022-05-18-23-58-26.gh-issue-92240.bHvYiz.rst @@ -0,0 +1,2 @@ +Added release dates for +"What's New in Python 3.X" for 3.0, 3.1, 3.2, 3.8 and 3.10 From webhook-mailer at python.org Sat May 28 23:41:46 2022 From: webhook-mailer at python.org (miss-islington) Date: Sun, 29 May 2022 03:41:46 -0000 Subject: [Python-checkins] gh-92240 : Include release dates for "What's New In Python 3.X" (GH-92937) Message-ID: https://github.com/python/cpython/commit/738c730b5cde0c07151dcca375d8983a7e4d5b7d commit: 738c730b5cde0c07151dcca375d8983a7e4d5b7d branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-28T20:41:40-07:00 summary: gh-92240 : Include release dates for "What's New In Python 3.X" (GH-92937) Co-authored-by: Jelle Zijlstra Co-authored-by: Adam Turner <9087854+AA-Turner at users.noreply.github.com> (cherry picked from commit 877ad7b3b2778a305d3989d58ebd68cb01baf26e) Co-authored-by: georgically <40323509+georgically at users.noreply.github.com> files: A Misc/NEWS.d/next/Documentation/2022-05-18-23-58-26.gh-issue-92240.bHvYiz.rst M Doc/whatsnew/2.5.rst M Doc/whatsnew/2.6.rst M Doc/whatsnew/3.0.rst M Doc/whatsnew/3.1.rst M Doc/whatsnew/3.10.rst M Doc/whatsnew/3.2.rst M Doc/whatsnew/3.8.rst M Doc/whatsnew/3.9.rst diff --git a/Doc/whatsnew/2.5.rst b/Doc/whatsnew/2.5.rst index 5816380e102f9..103a72f913c63 100644 --- a/Doc/whatsnew/2.5.rst +++ b/Doc/whatsnew/2.5.rst @@ -11,7 +11,7 @@ This article explains the new features in Python 2.5. The final release of Python 2.5 is scheduled for August 2006; :pep:`356` describes the planned -release schedule. +release schedule. Python 2.5 was released on September 19, 2006. The changes in Python 2.5 are an interesting mix of language and library improvements. The library enhancements will be more important to Python's user diff --git a/Doc/whatsnew/2.6.rst b/Doc/whatsnew/2.6.rst index b6174a19a178b..08a7c58b0f080 100644 --- a/Doc/whatsnew/2.6.rst +++ b/Doc/whatsnew/2.6.rst @@ -49,7 +49,7 @@ This saves the maintainer some effort going through the SVN logs when researching a change. -This article explains the new features in Python 2.6, released on October 1 +This article explains the new features in Python 2.6, released on October 1, 2008. The release schedule is described in :pep:`361`. The major theme of Python 2.6 is preparing the migration path to diff --git a/Doc/whatsnew/3.0.rst b/Doc/whatsnew/3.0.rst index 880958d3edb90..4da3507ad2e89 100644 --- a/Doc/whatsnew/3.0.rst +++ b/Doc/whatsnew/3.0.rst @@ -53,9 +53,9 @@ This article explains the new features in Python 3.0, compared to 2.6. Python 3.0, also known as "Python 3000" or "Py3K", is the first ever -*intentionally backwards incompatible* Python release. There are more -changes than in a typical release, and more that are important for all -Python users. Nevertheless, after digesting the changes, you'll find +*intentionally backwards incompatible* Python release. Python 3.0 was released on December 3, 2008. +There are more changes than in a typical release, and more that are important for all +Python users. Nevertheless, after digesting the changes, you'll find that Python really hasn't changed all that much -- by and large, we're mostly fixing well-known annoyances and warts, and removing a lot of old cruft. diff --git a/Doc/whatsnew/3.1.rst b/Doc/whatsnew/3.1.rst index f1e6d0c4f3dd6..3d89b97fa8f1b 100644 --- a/Doc/whatsnew/3.1.rst +++ b/Doc/whatsnew/3.1.rst @@ -47,6 +47,7 @@ when researching a change. This article explains the new features in Python 3.1, compared to 3.0. +Python 3.1 was released on?June 27, 2009. PEP 372: Ordered Dictionaries diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index 55e7d62b54159..212444a25836b 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -47,7 +47,7 @@ when researching a change. This article explains the new features in Python 3.10, compared to 3.9. - +Python 3.10 was released on October 4, 2021. For full details, see the :ref:`changelog `. Summary -- Release highlights diff --git a/Doc/whatsnew/3.2.rst b/Doc/whatsnew/3.2.rst index ec01a70f8ae0a..15f8672adda0d 100644 --- a/Doc/whatsnew/3.2.rst +++ b/Doc/whatsnew/3.2.rst @@ -48,7 +48,8 @@ This saves the maintainer the effort of going through the SVN log when researching a change. -This article explains the new features in Python 3.2 as compared to 3.1. It +This article explains the new features in Python 3.2 as compared to 3.1. +Python 3.2 was released on February 20, 2011. It focuses on a few highlights and gives a few examples. For full details, see the `Misc/NEWS `_ diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index 94d3b3f15fd29..163332401deeb 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -45,6 +45,7 @@ :Editor: Raymond Hettinger This article explains the new features in Python 3.8, compared to 3.7. +Python 3.8 was released on October 14, 2019. For full details, see the :ref:`changelog `. .. testsetup:: diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index e2455bce7d368..9408e3609e8c7 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -45,7 +45,7 @@ when researching a change. This article explains the new features in Python 3.9, compared to 3.8. -Python 3.9 was released on October 5th, 2020. +Python 3.9 was released on October 5, 2020. For full details, see the :ref:`changelog `. diff --git a/Misc/NEWS.d/next/Documentation/2022-05-18-23-58-26.gh-issue-92240.bHvYiz.rst b/Misc/NEWS.d/next/Documentation/2022-05-18-23-58-26.gh-issue-92240.bHvYiz.rst new file mode 100644 index 0000000000000..53b2a66c9779c --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2022-05-18-23-58-26.gh-issue-92240.bHvYiz.rst @@ -0,0 +1,2 @@ +Added release dates for +"What's New in Python 3.X" for 3.0, 3.1, 3.2, 3.8 and 3.10 From webhook-mailer at python.org Sun May 29 04:22:46 2022 From: webhook-mailer at python.org (vstinner) Date: Sun, 29 May 2022 08:22:46 -0000 Subject: [Python-checkins] test.pythoninfo logs more build info (GH-93225) (#93256) Message-ID: https://github.com/python/cpython/commit/561c709af327359979f43388461f9f937666d192 commit: 561c709af327359979f43388461f9f937666d192 branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: vstinner date: 2022-05-29T10:22:35+02:00 summary: test.pythoninfo logs more build info (GH-93225) (#93256) Log also test.support.check_sanitizer() values. (cherry picked from commit 06dd26f89f35b6d6ef4b68c169cb6c675af7e4a4) Co-authored-by: Victor Stinner Co-authored-by: Victor Stinner Co-authored-by: Jelle Zijlstra files: M Lib/test/pythoninfo.py diff --git a/Lib/test/pythoninfo.py b/Lib/test/pythoninfo.py index 005eae549cb04..479e60b16b691 100644 --- a/Lib/test/pythoninfo.py +++ b/Lib/test/pythoninfo.py @@ -9,6 +9,9 @@ import warnings +MS_WINDOWS = (sys.platform == 'win32') + + def normalize_text(text): if text is None: return None @@ -125,13 +128,21 @@ def collect_sys(info_add): encoding = '%s/%s' % (encoding, errors) info_add('sys.%s.encoding' % name, encoding) - # Were we compiled --with-pydebug or with #define Py_DEBUG? + # Were we compiled --with-pydebug? Py_DEBUG = hasattr(sys, 'gettotalrefcount') if Py_DEBUG: text = 'Yes (sys.gettotalrefcount() present)' else: text = 'No (sys.gettotalrefcount() missing)' - info_add('Py_DEBUG', text) + info_add('build.Py_DEBUG', text) + + # Were we compiled --with-trace-refs? + Py_TRACE_REFS = hasattr(sys, 'getobjects') + if Py_TRACE_REFS: + text = 'Yes (sys.getobjects() present)' + else: + text = 'No (sys.getobjects() missing)' + info_add('build.Py_REF_DEBUG', text) def collect_platform(info_add): @@ -444,6 +455,11 @@ def collect_datetime(info_add): def collect_sysconfig(info_add): + # On Windows, sysconfig is not reliable to get macros used + # to build Python + if MS_WINDOWS: + return + import sysconfig for name in ( @@ -477,6 +493,28 @@ def collect_sysconfig(info_add): value = normalize_text(value) info_add('sysconfig[%s]' % name, value) + PY_CFLAGS = sysconfig.get_config_var('PY_CFLAGS') + NDEBUG = (PY_CFLAGS and '-DNDEBUG' in PY_CFLAGS) + if NDEBUG: + text = 'ignore assertions (macro defined)' + else: + text= 'build assertions (macro not defined)' + info_add('build.NDEBUG',text) + + for name in ( + 'WITH_DOC_STRINGS', + 'WITH_DTRACE', + 'WITH_FREELISTS', + 'WITH_PYMALLOC', + 'WITH_VALGRIND', + ): + value = sysconfig.get_config_var(name) + if value: + text = 'Yes' + else: + text = 'No' + info_add(f'build.{name}', text) + def collect_ssl(info_add): import os @@ -588,7 +626,6 @@ def collect_testcapi(info_add): return call_func(info_add, 'pymem.allocator', _testcapi, 'pymem_getallocatorsname') - copy_attr(info_add, 'pymem.with_pymalloc', _testcapi, 'WITH_PYMALLOC') def collect_resource(info_add): @@ -630,6 +667,13 @@ def collect_test_support(info_add): call_func(info_add, 'test_support._is_gui_available', support, '_is_gui_available') call_func(info_add, 'test_support.python_is_optimized', support, 'python_is_optimized') + info_add('test_support.check_sanitizer(address=True)', + support.check_sanitizer(address=True)) + info_add('test_support.check_sanitizer(memory=True)', + support.check_sanitizer(memory=True)) + info_add('test_support.check_sanitizer(ub=True)', + support.check_sanitizer(ub=True)) + def collect_cc(info_add): import subprocess From webhook-mailer at python.org Sun May 29 12:13:41 2022 From: webhook-mailer at python.org (iritkatriel) Date: Sun, 29 May 2022 16:13:41 -0000 Subject: [Python-checkins] gh-93008: refactor compiler functions that add instructions to take only a basicblock* (not the whole compiler) (GH-93009) Message-ID: https://github.com/python/cpython/commit/ace6607aa33da42972369ada2c565912e329bf5e commit: ace6607aa33da42972369ada2c565912e329bf5e branch: main author: Irit Katriel <1055913+iritkatriel at users.noreply.github.com> committer: iritkatriel <1055913+iritkatriel at users.noreply.github.com> date: 2022-05-29T17:13:29+01:00 summary: gh-93008: refactor compiler functions that add instructions to take only a basicblock* (not the whole compiler) (GH-93009) files: M Python/compile.c diff --git a/Python/compile.c b/Python/compile.c index 541fa4c9a12b9..0920cebfe7c13 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -264,6 +264,15 @@ typedef struct basicblock_ { unsigned b_return : 1; } basicblock; + +static struct instr * +basicblock_last_instr(basicblock *b) { + if (b->b_iused) { + return &b->b_instr[b->b_iused - 1]; + } + return NULL; +} + /* fblockinfo tracks the current frame block. A frame block is used to handle loops, try/except, and try/finally. @@ -331,9 +340,6 @@ struct compiler_unit { int u_col_offset; /* the offset of the current stmt */ int u_end_lineno; /* the end line of the current stmt */ int u_end_col_offset; /* the end offset of the current stmt */ - - /* true if we need to create an implicit basicblock before the next instr */ - int u_need_new_implicit_block; }; /* This struct captures the global state of a compilation. @@ -389,10 +395,11 @@ typedef struct { Py_ssize_t on_top; } pattern_context; +static int basicblock_next_instr(basicblock *); + static int compiler_enter_scope(struct compiler *, identifier, int, void *, int); static void compiler_free(struct compiler *); static basicblock *compiler_new_block(struct compiler *); -static int compiler_next_instr(basicblock *); static int compiler_addop(struct compiler *, int); static int compiler_addop_i(struct compiler *, int, Py_ssize_t); static int compiler_addop_j(struct compiler *, int, basicblock *); @@ -830,7 +837,6 @@ compiler_use_next_block(struct compiler *c, basicblock *block) assert(block != NULL); c->u->u_curblock->b_next = block; c->u->u_curblock = block; - c->u->u_need_new_implicit_block = 0; return block; } @@ -846,7 +852,7 @@ compiler_copy_block(struct compiler *c, basicblock *block) return NULL; } for (int i = 0; i < block->b_iused; i++) { - int n = compiler_next_instr(result); + int n = basicblock_next_instr(result); if (n < 0) { return NULL; } @@ -863,7 +869,7 @@ compiler_copy_block(struct compiler *c, basicblock *block) */ static int -compiler_next_instr(basicblock *b) +basicblock_next_instr(basicblock *b) { assert(b != NULL); if (b->b_instr == NULL) { @@ -1206,7 +1212,8 @@ PyCompile_OpcodeStackEffect(int opcode, int oparg) return stack_effect(opcode, oparg, -1); } -static int is_end_of_basic_block(struct instr *instr) +static int +is_end_of_basic_block(struct instr *instr) { int opcode = instr->i_opcode; @@ -1219,7 +1226,8 @@ static int is_end_of_basic_block(struct instr *instr) static int compiler_use_new_implicit_block_if_needed(struct compiler *c) { - if (c->u->u_need_new_implicit_block) { + basicblock *b = c->u->u_curblock; + if (b->b_iused && is_end_of_basic_block(basicblock_last_instr(b))) { basicblock *b = compiler_new_block(c); if (b == NULL) { return -1; @@ -1229,32 +1237,19 @@ compiler_use_new_implicit_block_if_needed(struct compiler *c) return 0; } -static void -compiler_check_if_end_of_block(struct compiler *c, struct instr *instr) -{ - if (is_end_of_basic_block(instr)) { - c->u->u_need_new_implicit_block = 1; - } -} - /* Add an opcode with no argument. Returns 0 on failure, 1 on success. */ static int -compiler_addop_line(struct compiler *c, int opcode, int line, - int end_line, int col_offset, int end_col_offset) +basicblock_addop_line(basicblock *b, int opcode, int line, + int end_line, int col_offset, int end_col_offset) { assert(IS_WITHIN_OPCODE_RANGE(opcode)); assert(!IS_ASSEMBLER_OPCODE(opcode)); assert(!HAS_ARG(opcode) || IS_ARTIFICIAL(opcode)); - if (compiler_use_new_implicit_block_if_needed(c) < 0) { - return -1; - } - - basicblock *b = c->u->u_curblock; - int off = compiler_next_instr(b); + int off = basicblock_next_instr(b); if (off < 0) { return 0; } @@ -1269,21 +1264,26 @@ compiler_addop_line(struct compiler *c, int opcode, int line, i->i_col_offset = col_offset; i->i_end_col_offset = end_col_offset; - compiler_check_if_end_of_block(c, i); return 1; } static int compiler_addop(struct compiler *c, int opcode) { - return compiler_addop_line(c, opcode, c->u->u_lineno, c->u->u_end_lineno, - c->u->u_col_offset, c->u->u_end_col_offset); + if (compiler_use_new_implicit_block_if_needed(c) < 0) { + return -1; + } + return basicblock_addop_line(c->u->u_curblock, opcode, c->u->u_lineno, c->u->u_end_lineno, + c->u->u_col_offset, c->u->u_end_col_offset); } static int compiler_addop_noline(struct compiler *c, int opcode) { - return compiler_addop_line(c, opcode, -1, 0, 0, 0); + if (compiler_use_new_implicit_block_if_needed(c) < 0) { + return -1; + } + return basicblock_addop_line(c->u->u_curblock, opcode, -1, 0, 0, 0); } @@ -1477,9 +1477,9 @@ compiler_addop_name(struct compiler *c, int opcode, PyObject *dict, */ static int -compiler_addop_i_line(struct compiler *c, int opcode, Py_ssize_t oparg, - int lineno, int end_lineno, - int col_offset, int end_col_offset) +basicblock_addop_i_line(basicblock *b, int opcode, Py_ssize_t oparg, + int lineno, int end_lineno, + int col_offset, int end_col_offset) { /* oparg value is unsigned, but a signed C int is usually used to store it in the C code (like Python/ceval.c). @@ -1494,12 +1494,7 @@ compiler_addop_i_line(struct compiler *c, int opcode, Py_ssize_t oparg, assert(HAS_ARG(opcode)); assert(0 <= oparg && oparg <= 2147483647); - if (compiler_use_new_implicit_block_if_needed(c) < 0) { - return -1; - } - - basicblock *b = c->u->u_curblock; - int off = compiler_next_instr(b); + int off = basicblock_next_instr(b); if (off < 0) { return 0; } @@ -1511,40 +1506,41 @@ compiler_addop_i_line(struct compiler *c, int opcode, Py_ssize_t oparg, i->i_col_offset = col_offset; i->i_end_col_offset = end_col_offset; - compiler_check_if_end_of_block(c, i); return 1; } static int compiler_addop_i(struct compiler *c, int opcode, Py_ssize_t oparg) { - return compiler_addop_i_line(c, opcode, oparg, - c->u->u_lineno, c->u->u_end_lineno, - c->u->u_col_offset, c->u->u_end_col_offset); + if (compiler_use_new_implicit_block_if_needed(c) < 0) { + return -1; + } + return basicblock_addop_i_line(c->u->u_curblock, opcode, oparg, + c->u->u_lineno, c->u->u_end_lineno, + c->u->u_col_offset, c->u->u_end_col_offset); } static int compiler_addop_i_noline(struct compiler *c, int opcode, Py_ssize_t oparg) { - return compiler_addop_i_line(c, opcode, oparg, -1, 0, 0, 0); + if (compiler_use_new_implicit_block_if_needed(c) < 0) { + return -1; + } + return basicblock_addop_i_line(c->u->u_curblock, opcode, oparg, -1, 0, 0, 0); } -static int add_jump_to_block(struct compiler *c, int opcode, - int lineno, int end_lineno, - int col_offset, int end_col_offset, - basicblock *target) +static int +basicblock_add_jump(basicblock *b, int opcode, + int lineno, int end_lineno, + int col_offset, int end_col_offset, + basicblock *target) { assert(IS_WITHIN_OPCODE_RANGE(opcode)); assert(!IS_ASSEMBLER_OPCODE(opcode)); assert(HAS_ARG(opcode) || IS_VIRTUAL_OPCODE(opcode)); assert(target != NULL); - if (compiler_use_new_implicit_block_if_needed(c) < 0) { - return -1; - } - - basicblock *b = c->u->u_curblock; - int off = compiler_next_instr(b); + int off = basicblock_next_instr(b); struct instr *i = &b->b_instr[off]; if (off < 0) { return 0; @@ -1556,22 +1552,27 @@ static int add_jump_to_block(struct compiler *c, int opcode, i->i_col_offset = col_offset; i->i_end_col_offset = end_col_offset; - compiler_check_if_end_of_block(c, i); return 1; } static int compiler_addop_j(struct compiler *c, int opcode, basicblock *b) { - return add_jump_to_block(c, opcode, c->u->u_lineno, - c->u->u_end_lineno, c->u->u_col_offset, - c->u->u_end_col_offset, b); + if (compiler_use_new_implicit_block_if_needed(c) < 0) { + return -1; + } + return basicblock_add_jump(c->u->u_curblock, opcode, c->u->u_lineno, + c->u->u_end_lineno, c->u->u_col_offset, + c->u->u_end_col_offset, b); } static int compiler_addop_j_noline(struct compiler *c, int opcode, basicblock *b) { - return add_jump_to_block(c, opcode, -1, 0, 0, 0, b); + if (compiler_use_new_implicit_block_if_needed(c) < 0) { + return -1; + } + return basicblock_add_jump(c->u->u_curblock, opcode, -1, 0, 0, 0, b); } #define ADDOP(C, OP) { \ @@ -8085,7 +8086,7 @@ build_cellfixedoffsets(struct compiler *c) static inline int insert_instruction(basicblock *block, int pos, struct instr *instr) { - if (compiler_next_instr(block) < 0) { + if (basicblock_next_instr(block) < 0) { return -1; } for (int i = block->b_iused-1; i > pos; i--) { @@ -8971,7 +8972,7 @@ extend_block(basicblock *bb) { basicblock *to_copy = last->i_target; last->i_opcode = NOP; for (int i = 0; i < to_copy->b_iused; i++) { - int index = compiler_next_instr(bb); + int index = basicblock_next_instr(bb); if (index < 0) { return -1; } From webhook-mailer at python.org Sun May 29 13:18:56 2022 From: webhook-mailer at python.org (vstinner) Date: Sun, 29 May 2022 17:18:56 -0000 Subject: [Python-checkins] gh-93244: Document Py_PRINT_RAW in PyObject_Print() comment (93245) Message-ID: https://github.com/python/cpython/commit/61e008a4ab0b444342f9186efb57207d6fb05092 commit: 61e008a4ab0b444342f9186efb57207d6fb05092 branch: main author: Will Hawkins <8715530+hawkinsw at users.noreply.github.com> committer: vstinner date: 2022-05-29T19:18:52+02:00 summary: gh-93244: Document Py_PRINT_RAW in PyObject_Print() comment (93245) files: M Include/abstract.h diff --git a/Include/abstract.h b/Include/abstract.h index 9e06fbbb74913..197b20e4f23b7 100644 --- a/Include/abstract.h +++ b/Include/abstract.h @@ -14,9 +14,9 @@ extern "C" { Print an object 'o' on file 'fp'. Returns -1 on error. The flags argument is used to enable certain printing options. The only option currently - supported is Py_Print_RAW. - - (What should be said about Py_Print_RAW?). */ + supported is Py_PRINT_RAW. By default (flags=0), PyObject_Print() formats + the object by calling PyObject_Repr(). If flags equals to Py_PRINT_RAW, it + formats the object by calling PyObject_Str(). */ /* Implemented elsewhere: From webhook-mailer at python.org Sun May 29 14:04:32 2022 From: webhook-mailer at python.org (merwok) Date: Sun, 29 May 2022 18:04:32 -0000 Subject: [Python-checkins] [3.10] gh-93217: fix some issues in man page and --help (GH-93219) (#93261) Message-ID: https://github.com/python/cpython/commit/c649526f923c70d9db201b08d8a850831b5cf989 commit: c649526f923c70d9db201b08d8a850831b5cf989 branch: 3.10 author: ?ric committer: merwok date: 2022-05-29T14:04:23-04:00 summary: [3.10] gh-93217: fix some issues in man page and --help (GH-93219) (#93261) files: M Misc/python.man M Python/initconfig.c diff --git a/Misc/python.man b/Misc/python.man index 45a49271d4dfe..6b21fdc8790bc 100644 --- a/Misc/python.man +++ b/Misc/python.man @@ -66,10 +66,10 @@ python \- an interpreted, interactive, object-oriented programming language .B \-x ] [ -[ .B \-X .I option ] +[ .B \-? ] .br @@ -302,7 +302,8 @@ Set implementation specific option. The following options are available: more verbose than the default if the code is correct: new warnings are only emitted when an issue is detected. Effect of the developer mode: * Add default warning filter, as -W default - * Install debug hooks on memory allocators: see the PyMem_SetupDebugHooks() C function + * Install debug hooks on memory allocators: see the PyMem_SetupDebugHooks() + C function * Enable the faulthandler module to dump the Python traceback on a crash * Enable asyncio debug mode * Set the dev_mode attribute of sys.flags to True @@ -313,7 +314,10 @@ Set implementation specific option. The following options are available: otherwise activate automatically). See PYTHONUTF8 for more details -X pycache_prefix=PATH: enable writing .pyc files to a parallel tree rooted at the - given directory instead of to the code tree. + given directory instead of to the code tree. + + -X warn_default_encoding: enable opt-in EncodingWarning for 'encoding=None' + .TP .B \-x Skip the first line of the source. This is intended for a DOS diff --git a/Python/initconfig.c b/Python/initconfig.c index b2986116fdc35..0341e7baa210c 100644 --- a/Python/initconfig.c +++ b/Python/initconfig.c @@ -41,7 +41,7 @@ Options and arguments (and corresponding environment variables):\n\ -d : turn on parser debugging output (for experts only, only works on\n\ debug builds); also PYTHONDEBUG=x\n\ -E : ignore PYTHON* environment variables (such as PYTHONPATH)\n\ --h : print this help message and exit (also --help)\n\ +-h : print this help message and exit (also -? or --help)\n\ "; static const char usage_2[] = "\ -i : inspect interactively after running script; forces a prompt even\n\ @@ -67,7 +67,6 @@ static const char usage_3[] = "\ also PYTHONWARNINGS=arg\n\ -x : skip first line of source, allowing use of non-Unix forms of #!cmd\n\ -X opt : set implementation-specific option. The following options are available:\n\ -\n\ -X faulthandler: enable faulthandler\n\ -X showrefcount: output the total reference count and number of used\n\ memory blocks when the program finishes or after each statement in the\n\ @@ -84,7 +83,8 @@ static const char usage_3[] = "\ checks which are too expensive to be enabled by default. Effect of the\n\ developer mode:\n\ * Add default warning filter, as -W default\n\ - * Install debug hooks on memory allocators: see the PyMem_SetupDebugHooks() C function\n\ + * Install debug hooks on memory allocators: see the PyMem_SetupDebugHooks()\n\ + C function\n\ * Enable the faulthandler module to dump the Python traceback on a crash\n\ * Enable asyncio debug mode\n\ * Set the dev_mode attribute of sys.flags to True\n\ @@ -95,7 +95,6 @@ static const char usage_3[] = "\ -X pycache_prefix=PATH: enable writing .pyc files to a parallel tree rooted at the\n\ given directory instead of to the code tree\n\ -X warn_default_encoding: enable opt-in EncodingWarning for 'encoding=None'\n\ -\n\ --check-hash-based-pycs always|default|never:\n\ control how Python invalidates hash-based .pyc files\n\ "; From webhook-mailer at python.org Sun May 29 21:42:04 2022 From: webhook-mailer at python.org (terryjreedy) Date: Mon, 30 May 2022 01:42:04 -0000 Subject: [Python-checkins] Fix typo in Lib/idlelib/idle_test/test_parenmatch.py (GH-93332) Message-ID: https://github.com/python/cpython/commit/4f195f9db168bfe3360607eb45ba8d9ac98506ec commit: 4f195f9db168bfe3360607eb45ba8d9ac98506ec branch: main author: luzpaz committer: terryjreedy date: 2022-05-29T21:41:59-04:00 summary: Fix typo in Lib/idlelib/idle_test/test_parenmatch.py (GH-93332) Co-authored-by: Terry Jan Reedy files: M Lib/idlelib/idle_test/test_parenmatch.py diff --git a/Lib/idlelib/idle_test/test_parenmatch.py b/Lib/idlelib/idle_test/test_parenmatch.py index 4a41d8433d548..2e10d7cd36760 100644 --- a/Lib/idlelib/idle_test/test_parenmatch.py +++ b/Lib/idlelib/idle_test/test_parenmatch.py @@ -83,12 +83,12 @@ def test_paren_corner(self): """ Test corner cases in flash_paren_event and paren_closed_event. - These cases force conditional expression and alternate paths. + Force execution of conditional expressions and alternate paths. """ text = self.text pm = self.get_parenmatch() - text.insert('insert', '# this is a commen)') + text.insert('insert', '# Comment.)') pm.paren_closed_event('event') text.insert('insert', '\ndef') From webhook-mailer at python.org Sun May 29 21:43:36 2022 From: webhook-mailer at python.org (ezio-melotti) Date: Mon, 30 May 2022 01:43:36 -0000 Subject: [Python-checkins] bpo-42272: fix misleading warning filter message/module docs (#23172) Message-ID: https://github.com/python/cpython/commit/8136606769661c103c46d142e52ecbbbb88803f6 commit: 8136606769661c103c46d142e52ecbbbb88803f6 branch: main author: Kevin Locke committer: ezio-melotti date: 2022-05-30T03:43:32+02:00 summary: bpo-42272: fix misleading warning filter message/module docs (#23172) * bpo-42272: improve message/module warning filter docs "The Warnings Filter" section of the warnings module documentation describes the message and module filters as "a string containing a regular expression". While that is true when they are arguments to the filterwarnings function, it is not true when they appear in -W or $PYTHONWARNINGS where they are matched literally (after stripping any starting/ending whitespace). Update the documentation to note when they are matched literally. Also clarify that module matches the "fully-qualified module name", rather than "module name" which is ambiguous. skip news (since this is a doc fix) Signed-off-by: Kevin Locke * bpo-42272: remove bad submodule warning filter doc The `error:::mymodule[.*]` example in the "Describing Warning Filters" section of the warnings module documentation does not behave as the comment describes. Since the module portion of the filter string is interpreted literally, it would match a module with a fully-qualified name that is literally `mymodule[.*]`. Unfortunately, there is not a way to match '"module" and any subpackages of "mymodule"' as documented, since the module part of a filter string is matched literally. Instead, update the filter and comment to match only "mymodule". skip news (since this is a doc fix) Signed-off-by: Kevin Locke * bpo-42272: add warning filter doc changes to NEWS Signed-off-by: Kevin Locke files: A Misc/NEWS.d/next/Documentation/2022-05-26-11-33-23.gh-issue-86438.kEGGmK.rst M Doc/library/warnings.rst diff --git a/Doc/library/warnings.rst b/Doc/library/warnings.rst index f7a1f70833b7f..43708f8021ad2 100644 --- a/Doc/library/warnings.rst +++ b/Doc/library/warnings.rst @@ -154,14 +154,19 @@ the disposition of the match. Each entry is a tuple of the form (*action*, +---------------+----------------------------------------------+ * *message* is a string containing a regular expression that the start of - the warning message must match. The expression is compiled to always be - case-insensitive. + the warning message must match, case-insensitively. In :option:`-W` and + :envvar:`PYTHONWARNINGS`, *message* is a literal string that the start of the + warning message must contain (case-insensitively), ignoring any whitespace at + the start or end of *message*. * *category* is a class (a subclass of :exc:`Warning`) of which the warning category must be a subclass in order to match. -* *module* is a string containing a regular expression that the module name must - match. The expression is compiled to be case-sensitive. +* *module* is a string containing a regular expression that the start of the + fully-qualified module name must match, case-sensitively. In :option:`-W` and + :envvar:`PYTHONWARNINGS`, *module* is a literal string that the + fully-qualified module name must be equal to (case-sensitively), ignoring any + whitespace at the start or end of *module*. * *lineno* is an integer that the line number where the warning occurred must match, or ``0`` to match all line numbers. @@ -207,8 +212,7 @@ Some examples:: error::ResourceWarning # Treat ResourceWarning messages as errors default::DeprecationWarning # Show DeprecationWarning messages ignore,default:::mymodule # Only report warnings triggered by "mymodule" - error:::mymodule[.*] # Convert warnings to errors in "mymodule" - # and any subpackages of "mymodule" + error:::mymodule # Convert warnings to errors in "mymodule" .. _default-warning-filter: diff --git a/Misc/NEWS.d/next/Documentation/2022-05-26-11-33-23.gh-issue-86438.kEGGmK.rst b/Misc/NEWS.d/next/Documentation/2022-05-26-11-33-23.gh-issue-86438.kEGGmK.rst new file mode 100644 index 0000000000000..75abfdd63b8b2 --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2022-05-26-11-33-23.gh-issue-86438.kEGGmK.rst @@ -0,0 +1,3 @@ +Clarify that :option:`-W` and :envvar:`PYTHONWARNINGS` are matched literally +and case-insensitively, rather than as regular expressions, in +:mod:`warnings`. From webhook-mailer at python.org Sun May 29 22:03:40 2022 From: webhook-mailer at python.org (miss-islington) Date: Mon, 30 May 2022 02:03:40 -0000 Subject: [Python-checkins] bpo-42272: fix misleading warning filter message/module docs (GH-23172) Message-ID: https://github.com/python/cpython/commit/aa06a8409927b43dee5cfe4a49d6190e7bddebad commit: aa06a8409927b43dee5cfe4a49d6190e7bddebad branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-29T19:03:15-07:00 summary: bpo-42272: fix misleading warning filter message/module docs (GH-23172) * bpo-42272: improve message/module warning filter docs "The Warnings Filter" section of the warnings module documentation describes the message and module filters as "a string containing a regular expression". While that is true when they are arguments to the filterwarnings function, it is not true when they appear in -W or $PYTHONWARNINGS where they are matched literally (after stripping any starting/ending whitespace). Update the documentation to note when they are matched literally. Also clarify that module matches the "fully-qualified module name", rather than "module name" which is ambiguous. skip news (since this is a doc fix) Signed-off-by: Kevin Locke * bpo-42272: remove bad submodule warning filter doc The `error:::mymodule[.*]` example in the "Describing Warning Filters" section of the warnings module documentation does not behave as the comment describes. Since the module portion of the filter string is interpreted literally, it would match a module with a fully-qualified name that is literally `mymodule[.*]`. Unfortunately, there is not a way to match '"module" and any subpackages of "mymodule"' as documented, since the module part of a filter string is matched literally. Instead, update the filter and comment to match only "mymodule". skip news (since this is a doc fix) Signed-off-by: Kevin Locke * bpo-42272: add warning filter doc changes to NEWS Signed-off-by: Kevin Locke (cherry picked from commit 8136606769661c103c46d142e52ecbbbb88803f6) Co-authored-by: Kevin Locke files: A Misc/NEWS.d/next/Documentation/2022-05-26-11-33-23.gh-issue-86438.kEGGmK.rst M Doc/library/warnings.rst diff --git a/Doc/library/warnings.rst b/Doc/library/warnings.rst index 289b28229e1a0..8f2a5accd472b 100644 --- a/Doc/library/warnings.rst +++ b/Doc/library/warnings.rst @@ -154,14 +154,19 @@ the disposition of the match. Each entry is a tuple of the form (*action*, +---------------+----------------------------------------------+ * *message* is a string containing a regular expression that the start of - the warning message must match. The expression is compiled to always be - case-insensitive. + the warning message must match, case-insensitively. In :option:`-W` and + :envvar:`PYTHONWARNINGS`, *message* is a literal string that the start of the + warning message must contain (case-insensitively), ignoring any whitespace at + the start or end of *message*. * *category* is a class (a subclass of :exc:`Warning`) of which the warning category must be a subclass in order to match. -* *module* is a string containing a regular expression that the module name must - match. The expression is compiled to be case-sensitive. +* *module* is a string containing a regular expression that the start of the + fully-qualified module name must match, case-sensitively. In :option:`-W` and + :envvar:`PYTHONWARNINGS`, *module* is a literal string that the + fully-qualified module name must be equal to (case-sensitively), ignoring any + whitespace at the start or end of *module*. * *lineno* is an integer that the line number where the warning occurred must match, or ``0`` to match all line numbers. @@ -207,8 +212,7 @@ Some examples:: error::ResourceWarning # Treat ResourceWarning messages as errors default::DeprecationWarning # Show DeprecationWarning messages ignore,default:::mymodule # Only report warnings triggered by "mymodule" - error:::mymodule[.*] # Convert warnings to errors in "mymodule" - # and any subpackages of "mymodule" + error:::mymodule # Convert warnings to errors in "mymodule" .. _default-warning-filter: diff --git a/Misc/NEWS.d/next/Documentation/2022-05-26-11-33-23.gh-issue-86438.kEGGmK.rst b/Misc/NEWS.d/next/Documentation/2022-05-26-11-33-23.gh-issue-86438.kEGGmK.rst new file mode 100644 index 0000000000000..75abfdd63b8b2 --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2022-05-26-11-33-23.gh-issue-86438.kEGGmK.rst @@ -0,0 +1,3 @@ +Clarify that :option:`-W` and :envvar:`PYTHONWARNINGS` are matched literally +and case-insensitively, rather than as regular expressions, in +:mod:`warnings`. From webhook-mailer at python.org Sun May 29 22:04:28 2022 From: webhook-mailer at python.org (miss-islington) Date: Mon, 30 May 2022 02:04:28 -0000 Subject: [Python-checkins] bpo-42272: fix misleading warning filter message/module docs (GH-23172) Message-ID: https://github.com/python/cpython/commit/cc31cfc25e602db3e50fddacfbc6f7e2227b9f99 commit: cc31cfc25e602db3e50fddacfbc6f7e2227b9f99 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-29T19:04:21-07:00 summary: bpo-42272: fix misleading warning filter message/module docs (GH-23172) * bpo-42272: improve message/module warning filter docs "The Warnings Filter" section of the warnings module documentation describes the message and module filters as "a string containing a regular expression". While that is true when they are arguments to the filterwarnings function, it is not true when they appear in -W or $PYTHONWARNINGS where they are matched literally (after stripping any starting/ending whitespace). Update the documentation to note when they are matched literally. Also clarify that module matches the "fully-qualified module name", rather than "module name" which is ambiguous. skip news (since this is a doc fix) Signed-off-by: Kevin Locke * bpo-42272: remove bad submodule warning filter doc The `error:::mymodule[.*]` example in the "Describing Warning Filters" section of the warnings module documentation does not behave as the comment describes. Since the module portion of the filter string is interpreted literally, it would match a module with a fully-qualified name that is literally `mymodule[.*]`. Unfortunately, there is not a way to match '"module" and any subpackages of "mymodule"' as documented, since the module part of a filter string is matched literally. Instead, update the filter and comment to match only "mymodule". skip news (since this is a doc fix) Signed-off-by: Kevin Locke * bpo-42272: add warning filter doc changes to NEWS Signed-off-by: Kevin Locke (cherry picked from commit 8136606769661c103c46d142e52ecbbbb88803f6) Co-authored-by: Kevin Locke files: A Misc/NEWS.d/next/Documentation/2022-05-26-11-33-23.gh-issue-86438.kEGGmK.rst M Doc/library/warnings.rst diff --git a/Doc/library/warnings.rst b/Doc/library/warnings.rst index f7a1f70833b7f..43708f8021ad2 100644 --- a/Doc/library/warnings.rst +++ b/Doc/library/warnings.rst @@ -154,14 +154,19 @@ the disposition of the match. Each entry is a tuple of the form (*action*, +---------------+----------------------------------------------+ * *message* is a string containing a regular expression that the start of - the warning message must match. The expression is compiled to always be - case-insensitive. + the warning message must match, case-insensitively. In :option:`-W` and + :envvar:`PYTHONWARNINGS`, *message* is a literal string that the start of the + warning message must contain (case-insensitively), ignoring any whitespace at + the start or end of *message*. * *category* is a class (a subclass of :exc:`Warning`) of which the warning category must be a subclass in order to match. -* *module* is a string containing a regular expression that the module name must - match. The expression is compiled to be case-sensitive. +* *module* is a string containing a regular expression that the start of the + fully-qualified module name must match, case-sensitively. In :option:`-W` and + :envvar:`PYTHONWARNINGS`, *module* is a literal string that the + fully-qualified module name must be equal to (case-sensitively), ignoring any + whitespace at the start or end of *module*. * *lineno* is an integer that the line number where the warning occurred must match, or ``0`` to match all line numbers. @@ -207,8 +212,7 @@ Some examples:: error::ResourceWarning # Treat ResourceWarning messages as errors default::DeprecationWarning # Show DeprecationWarning messages ignore,default:::mymodule # Only report warnings triggered by "mymodule" - error:::mymodule[.*] # Convert warnings to errors in "mymodule" - # and any subpackages of "mymodule" + error:::mymodule # Convert warnings to errors in "mymodule" .. _default-warning-filter: diff --git a/Misc/NEWS.d/next/Documentation/2022-05-26-11-33-23.gh-issue-86438.kEGGmK.rst b/Misc/NEWS.d/next/Documentation/2022-05-26-11-33-23.gh-issue-86438.kEGGmK.rst new file mode 100644 index 0000000000000..75abfdd63b8b2 --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2022-05-26-11-33-23.gh-issue-86438.kEGGmK.rst @@ -0,0 +1,3 @@ +Clarify that :option:`-W` and :envvar:`PYTHONWARNINGS` are matched literally +and case-insensitively, rather than as regular expressions, in +:mod:`warnings`. From webhook-mailer at python.org Sun May 29 23:02:42 2022 From: webhook-mailer at python.org (terryjreedy) Date: Mon, 30 May 2022 03:02:42 -0000 Subject: [Python-checkins] Fix typo in Lib/idlelib/idle_test/test_parenmatch.py (GH-93332) (#93339) Message-ID: https://github.com/python/cpython/commit/da184517f52373662cdebaf9f4d3950c7a8be167 commit: da184517f52373662cdebaf9f4d3950c7a8be167 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: terryjreedy date: 2022-05-29T23:02:23-04:00 summary: Fix typo in Lib/idlelib/idle_test/test_parenmatch.py (GH-93332) (#93339) Co-authored-by: Terry Jan Reedy (cherry picked from commit 4f195f9db168bfe3360607eb45ba8d9ac98506ec) Co-authored-by: luzpaz files: M Lib/idlelib/idle_test/test_parenmatch.py diff --git a/Lib/idlelib/idle_test/test_parenmatch.py b/Lib/idlelib/idle_test/test_parenmatch.py index 4a41d8433d548..2e10d7cd36760 100644 --- a/Lib/idlelib/idle_test/test_parenmatch.py +++ b/Lib/idlelib/idle_test/test_parenmatch.py @@ -83,12 +83,12 @@ def test_paren_corner(self): """ Test corner cases in flash_paren_event and paren_closed_event. - These cases force conditional expression and alternate paths. + Force execution of conditional expressions and alternate paths. """ text = self.text pm = self.get_parenmatch() - text.insert('insert', '# this is a commen)') + text.insert('insert', '# Comment.)') pm.paren_closed_event('event') text.insert('insert', '\ndef') From webhook-mailer at python.org Sun May 29 23:03:19 2022 From: webhook-mailer at python.org (terryjreedy) Date: Mon, 30 May 2022 03:03:19 -0000 Subject: [Python-checkins] Fix typo in Lib/idlelib/idle_test/test_parenmatch.py (GH-93332) (#93340) Message-ID: https://github.com/python/cpython/commit/372afb7a9b1fff2fcc724f999744b6126f0f6e07 commit: 372afb7a9b1fff2fcc724f999744b6126f0f6e07 branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: terryjreedy date: 2022-05-29T23:03:11-04:00 summary: Fix typo in Lib/idlelib/idle_test/test_parenmatch.py (GH-93332) (#93340) Co-authored-by: Terry Jan Reedy (cherry picked from commit 4f195f9db168bfe3360607eb45ba8d9ac98506ec) Co-authored-by: luzpaz files: M Lib/idlelib/idle_test/test_parenmatch.py diff --git a/Lib/idlelib/idle_test/test_parenmatch.py b/Lib/idlelib/idle_test/test_parenmatch.py index 4a41d8433d548..2e10d7cd36760 100644 --- a/Lib/idlelib/idle_test/test_parenmatch.py +++ b/Lib/idlelib/idle_test/test_parenmatch.py @@ -83,12 +83,12 @@ def test_paren_corner(self): """ Test corner cases in flash_paren_event and paren_closed_event. - These cases force conditional expression and alternate paths. + Force execution of conditional expressions and alternate paths. """ text = self.text pm = self.get_parenmatch() - text.insert('insert', '# this is a commen)') + text.insert('insert', '# Comment.)') pm.paren_closed_event('event') text.insert('insert', '\ndef') From webhook-mailer at python.org Mon May 30 01:15:09 2022 From: webhook-mailer at python.org (ned-deily) Date: Mon, 30 May 2022 05:15:09 -0000 Subject: [Python-checkins] Update macOS installer Welcome and ReadMe display wording to "beta". (GH-93344) Message-ID: https://github.com/python/cpython/commit/dc8c6248ef3d5023dcee15619d31042255010a36 commit: dc8c6248ef3d5023dcee15619d31042255010a36 branch: 3.11 author: Ned Deily committer: ned-deily date: 2022-05-30T01:15:05-04:00 summary: Update macOS installer Welcome and ReadMe display wording to "beta". (GH-93344) files: M Mac/BuildScript/resources/ReadMe.rtf M Mac/BuildScript/resources/Welcome.rtf diff --git a/Mac/BuildScript/resources/ReadMe.rtf b/Mac/BuildScript/resources/ReadMe.rtf index 8d699395f304c..a43ca9fc788a3 100644 --- a/Mac/BuildScript/resources/ReadMe.rtf +++ b/Mac/BuildScript/resources/ReadMe.rtf @@ -1,4 +1,4 @@ -{\rtf1\ansi\ansicpg1252\cocoartf2580 +{\rtf1\ansi\ansicpg1252\cocoartf2638 \cocoatextscaling0\cocoaplatform0{\fonttbl\f0\fswiss\fcharset0 Helvetica;\f1\fswiss\fcharset0 Helvetica-Bold;\f2\fswiss\fcharset0 Helvetica-Oblique; \f3\fmodern\fcharset0 CourierNewPSMT;\f4\fmodern\fcharset0 Courier;} {\colortbl;\red255\green255\blue255;} @@ -11,7 +11,7 @@ \pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\partightenfactor0 \f1\b \cf0 NOTE: -\f0\b0 This is an alpha preview of Python 3.11.0, the next feature release of Python 3. It is not intended for production use.\ +\f0\b0 This is a beta test preview of Python 3.11.0, the next feature release of Python 3. It is not intended for production use.\ \pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 \cf0 \ \pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 diff --git a/Mac/BuildScript/resources/Welcome.rtf b/Mac/BuildScript/resources/Welcome.rtf index e6ccfcb3fce96..4ff8a0e874f20 100644 --- a/Mac/BuildScript/resources/Welcome.rtf +++ b/Mac/BuildScript/resources/Welcome.rtf @@ -1,4 +1,4 @@ -{\rtf1\ansi\ansicpg1252\cocoartf2580 +{\rtf1\ansi\ansicpg1252\cocoartf2638 \cocoascreenfonts1\cocoatextscaling0\cocoaplatform0{\fonttbl\f0\fswiss\fcharset0 Helvetica;\f1\fswiss\fcharset0 Helvetica-Bold;\f2\fmodern\fcharset0 CourierNewPSMT; } {\colortbl;\red255\green255\blue255;} @@ -26,5 +26,5 @@ At the end of this install, click on \ \f1\b NOTE: -\f0\b0 This is an alpha test preview of Python 3.11.0, the next feature release of Python 3. It is not intended for production use.\ +\f0\b0 This is a beta test preview of Python 3.11.0, the next feature release of Python 3. It is not intended for production use.\ } \ No newline at end of file From webhook-mailer at python.org Mon May 30 14:30:20 2022 From: webhook-mailer at python.org (pablogsal) Date: Mon, 30 May 2022 18:30:20 -0000 Subject: [Python-checkins] gh-93351: Ensure the position information in AST nodes created by the parser is always consistent (GH-93352) Message-ID: https://github.com/python/cpython/commit/5893b5db98b38b17750c0572c7209774a5034898 commit: 5893b5db98b38b17750c0572c7209774a5034898 branch: main author: Pablo Galindo Salgado committer: pablogsal date: 2022-05-30T19:30:15+01:00 summary: gh-93351: Ensure the position information in AST nodes created by the parser is always consistent (GH-93352) files: M Lib/test/test_ast.py M Python/ast.c diff --git a/Lib/test/test_ast.py b/Lib/test/test_ast.py index 03d9b310f161b..896eb5bedd7f3 100644 --- a/Lib/test/test_ast.py +++ b/Lib/test/test_ast.py @@ -335,6 +335,33 @@ def test_ast_validation(self): for snippet in snippets_to_validate: tree = ast.parse(snippet) compile(tree, '', 'exec') + + def test_invalid_position_information(self): + invalid_linenos = [ + (10, 1), (-10, -11), (10, -11), (-5, -2), (-5, 1) + ] + + for lineno, end_lineno in invalid_linenos: + with self.subTest(f"Check invalid linenos {lineno}:{end_lineno}"): + snippet = "a = 1" + tree = ast.parse(snippet) + tree.body[0].lineno = lineno + tree.body[0].end_lineno = end_lineno + with self.assertRaises(ValueError): + compile(tree, '', 'exec') + + invalid_col_offsets = [ + (10, 1), (-10, -11), (10, -11), (-5, -2), (-5, 1) + ] + for col_offset, end_col_offset in invalid_col_offsets: + with self.subTest(f"Check invalid col_offset {col_offset}:{end_col_offset}"): + snippet = "a = 1" + tree = ast.parse(snippet) + tree.body[0].col_offset = col_offset + tree.body[0].end_col_offset = end_col_offset + with self.assertRaises(ValueError): + compile(tree, '', 'exec') + def test_slice(self): slc = ast.parse("x[::]").body[0].value.slice diff --git a/Python/ast.c b/Python/ast.c index 607281e268553..0885fe7798fa5 100644 --- a/Python/ast.c +++ b/Python/ast.c @@ -22,6 +22,27 @@ static int validate_stmt(struct validator *, stmt_ty); static int validate_expr(struct validator *, expr_ty, expr_context_ty); static int validate_pattern(struct validator *, pattern_ty, int); +#define VALIDATE_POSITIONS(node) \ + if (node->lineno > node->end_lineno) { \ + PyErr_Format(PyExc_ValueError, \ + "line %d-%d is not a valid range", \ + node->lineno, node->end_lineno); \ + return 0; \ + } \ + if ((node->lineno < 0 && node->end_lineno != node->lineno) || \ + (node->col_offset < 0 && node->col_offset != node->end_col_offset)) { \ + PyErr_Format(PyExc_ValueError, \ + "line %d-%d, column %d-%d is not a valid range", \ + node->lineno, node->end_lineno, node->col_offset, node->end_col_offset); \ + return 0; \ + } \ + if (node->lineno == node->end_lineno && node->col_offset > node->end_col_offset) { \ + PyErr_Format(PyExc_ValueError, \ + "line %d, column %d-%d is not a valid range", \ + node->lineno, node->col_offset, node->end_col_offset); \ + return 0; \ + } + static int validate_name(PyObject *name) { @@ -75,6 +96,7 @@ validate_args(struct validator *state, asdl_arg_seq *args) Py_ssize_t i; for (i = 0; i < asdl_seq_LEN(args); i++) { arg_ty arg = asdl_seq_GET(args, i); + VALIDATE_POSITIONS(arg); if (arg->annotation && !validate_expr(state, arg->annotation, Load)) return 0; } @@ -183,6 +205,7 @@ validate_constant(struct validator *state, PyObject *value) static int validate_expr(struct validator *state, expr_ty exp, expr_context_ty ctx) { + VALIDATE_POSITIONS(exp); int ret = -1; if (++state->recursion_depth > state->recursion_limit) { PyErr_SetString(PyExc_RecursionError, @@ -505,6 +528,7 @@ validate_capture(PyObject *name) static int validate_pattern(struct validator *state, pattern_ty p, int star_ok) { + VALIDATE_POSITIONS(p); int ret = -1; if (++state->recursion_depth > state->recursion_limit) { PyErr_SetString(PyExc_RecursionError, @@ -674,6 +698,7 @@ validate_body(struct validator *state, asdl_stmt_seq *body, const char *owner) static int validate_stmt(struct validator *state, stmt_ty stmt) { + VALIDATE_POSITIONS(stmt); int ret = -1; Py_ssize_t i; if (++state->recursion_depth > state->recursion_limit) { @@ -807,6 +832,7 @@ validate_stmt(struct validator *state, stmt_ty stmt) } for (i = 0; i < asdl_seq_LEN(stmt->v.Try.handlers); i++) { excepthandler_ty handler = asdl_seq_GET(stmt->v.Try.handlers, i); + VALIDATE_POSITIONS(handler); if ((handler->v.ExceptHandler.type && !validate_expr(state, handler->v.ExceptHandler.type, Load)) || !validate_body(state, handler->v.ExceptHandler.body, "ExceptHandler")) From webhook-mailer at python.org Mon May 30 14:52:41 2022 From: webhook-mailer at python.org (miss-islington) Date: Mon, 30 May 2022 18:52:41 -0000 Subject: [Python-checkins] gh-93351: Ensure the position information in AST nodes created by the parser is always consistent (GH-93352) Message-ID: https://github.com/python/cpython/commit/7f6e6abdc43d9b61d81eb26b9fb2073dccf6a3cb commit: 7f6e6abdc43d9b61d81eb26b9fb2073dccf6a3cb branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-30T11:52:36-07:00 summary: gh-93351: Ensure the position information in AST nodes created by the parser is always consistent (GH-93352) (cherry picked from commit 5893b5db98b38b17750c0572c7209774a5034898) Co-authored-by: Pablo Galindo Salgado files: M Lib/test/test_ast.py M Python/ast.c diff --git a/Lib/test/test_ast.py b/Lib/test/test_ast.py index 03d9b310f161b..896eb5bedd7f3 100644 --- a/Lib/test/test_ast.py +++ b/Lib/test/test_ast.py @@ -335,6 +335,33 @@ def test_ast_validation(self): for snippet in snippets_to_validate: tree = ast.parse(snippet) compile(tree, '', 'exec') + + def test_invalid_position_information(self): + invalid_linenos = [ + (10, 1), (-10, -11), (10, -11), (-5, -2), (-5, 1) + ] + + for lineno, end_lineno in invalid_linenos: + with self.subTest(f"Check invalid linenos {lineno}:{end_lineno}"): + snippet = "a = 1" + tree = ast.parse(snippet) + tree.body[0].lineno = lineno + tree.body[0].end_lineno = end_lineno + with self.assertRaises(ValueError): + compile(tree, '', 'exec') + + invalid_col_offsets = [ + (10, 1), (-10, -11), (10, -11), (-5, -2), (-5, 1) + ] + for col_offset, end_col_offset in invalid_col_offsets: + with self.subTest(f"Check invalid col_offset {col_offset}:{end_col_offset}"): + snippet = "a = 1" + tree = ast.parse(snippet) + tree.body[0].col_offset = col_offset + tree.body[0].end_col_offset = end_col_offset + with self.assertRaises(ValueError): + compile(tree, '', 'exec') + def test_slice(self): slc = ast.parse("x[::]").body[0].value.slice diff --git a/Python/ast.c b/Python/ast.c index 607281e268553..0885fe7798fa5 100644 --- a/Python/ast.c +++ b/Python/ast.c @@ -22,6 +22,27 @@ static int validate_stmt(struct validator *, stmt_ty); static int validate_expr(struct validator *, expr_ty, expr_context_ty); static int validate_pattern(struct validator *, pattern_ty, int); +#define VALIDATE_POSITIONS(node) \ + if (node->lineno > node->end_lineno) { \ + PyErr_Format(PyExc_ValueError, \ + "line %d-%d is not a valid range", \ + node->lineno, node->end_lineno); \ + return 0; \ + } \ + if ((node->lineno < 0 && node->end_lineno != node->lineno) || \ + (node->col_offset < 0 && node->col_offset != node->end_col_offset)) { \ + PyErr_Format(PyExc_ValueError, \ + "line %d-%d, column %d-%d is not a valid range", \ + node->lineno, node->end_lineno, node->col_offset, node->end_col_offset); \ + return 0; \ + } \ + if (node->lineno == node->end_lineno && node->col_offset > node->end_col_offset) { \ + PyErr_Format(PyExc_ValueError, \ + "line %d, column %d-%d is not a valid range", \ + node->lineno, node->col_offset, node->end_col_offset); \ + return 0; \ + } + static int validate_name(PyObject *name) { @@ -75,6 +96,7 @@ validate_args(struct validator *state, asdl_arg_seq *args) Py_ssize_t i; for (i = 0; i < asdl_seq_LEN(args); i++) { arg_ty arg = asdl_seq_GET(args, i); + VALIDATE_POSITIONS(arg); if (arg->annotation && !validate_expr(state, arg->annotation, Load)) return 0; } @@ -183,6 +205,7 @@ validate_constant(struct validator *state, PyObject *value) static int validate_expr(struct validator *state, expr_ty exp, expr_context_ty ctx) { + VALIDATE_POSITIONS(exp); int ret = -1; if (++state->recursion_depth > state->recursion_limit) { PyErr_SetString(PyExc_RecursionError, @@ -505,6 +528,7 @@ validate_capture(PyObject *name) static int validate_pattern(struct validator *state, pattern_ty p, int star_ok) { + VALIDATE_POSITIONS(p); int ret = -1; if (++state->recursion_depth > state->recursion_limit) { PyErr_SetString(PyExc_RecursionError, @@ -674,6 +698,7 @@ validate_body(struct validator *state, asdl_stmt_seq *body, const char *owner) static int validate_stmt(struct validator *state, stmt_ty stmt) { + VALIDATE_POSITIONS(stmt); int ret = -1; Py_ssize_t i; if (++state->recursion_depth > state->recursion_limit) { @@ -807,6 +832,7 @@ validate_stmt(struct validator *state, stmt_ty stmt) } for (i = 0; i < asdl_seq_LEN(stmt->v.Try.handlers); i++) { excepthandler_ty handler = asdl_seq_GET(stmt->v.Try.handlers, i); + VALIDATE_POSITIONS(handler); if ((handler->v.ExceptHandler.type && !validate_expr(state, handler->v.ExceptHandler.type, Load)) || !validate_body(state, handler->v.ExceptHandler.body, "ExceptHandler")) From webhook-mailer at python.org Tue May 31 01:46:20 2022 From: webhook-mailer at python.org (serhiy-storchaka) Date: Tue, 31 May 2022 05:46:20 -0000 Subject: [Python-checkins] gh-93345: Fix a crash in substitution of nested TypeVar after TypeVarTuple (GH-93346) Message-ID: https://github.com/python/cpython/commit/f545fc955aeb701ae4e73b07ff2283f823d857b8 commit: f545fc955aeb701ae4e73b07ff2283f823d857b8 branch: main author: Serhiy Storchaka committer: serhiy-storchaka date: 2022-05-31T08:46:16+03:00 summary: gh-93345: Fix a crash in substitution of nested TypeVar after TypeVarTuple (GH-93346) For example: tuple[*Ts, list[T]][int, str, bool] files: A Misc/NEWS.d/next/Core and Builtins/2022-05-30-10-22-46.gh-issue-93345.gi1A4L.rst M Lib/test/test_typing.py M Objects/genericaliasobject.c diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index 2afac23539155..d6cd3d9bdd6a4 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -768,12 +768,18 @@ class C(Generic[*Ts]): pass ('generic[T, *Ts]', '[int]', 'generic[int]'), ('generic[T, *Ts]', '[int, str]', 'generic[int, str]'), ('generic[T, *Ts]', '[int, str, bool]', 'generic[int, str, bool]'), + ('generic[list[T], *Ts]', '[int]', 'generic[list[int]]'), + ('generic[list[T], *Ts]', '[int, str]', 'generic[list[int], str]'), + ('generic[list[T], *Ts]', '[int, str, bool]', 'generic[list[int], str, bool]'), ('generic[T, *Ts]', '[*tuple[int, ...]]', 'TypeError'), # Should be generic[int, *tuple[int, ...]] ('generic[*Ts, T]', '[int]', 'generic[int]'), ('generic[*Ts, T]', '[int, str]', 'generic[int, str]'), - ('generic[*Ts, T]', '[int, str, bool]', 'generic[int, str, bool]'), + ('generic[*Ts, T]', '[int, str, bool]', 'generic[int, str, bool]'), + ('generic[*Ts, list[T]]', '[int]', 'generic[list[int]]'), + ('generic[*Ts, list[T]]', '[int, str]', 'generic[int, list[str]]'), + ('generic[*Ts, list[T]]', '[int, str, bool]', 'generic[int, str, list[bool]]'), ('generic[T, *tuple_type[int, ...]]', '[str]', 'generic[str, *tuple_type[int, ...]]'), ('generic[T1, T2, *tuple_type[int, ...]]', '[str, bool]', 'generic[str, bool, *tuple_type[int, ...]]'), diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-30-10-22-46.gh-issue-93345.gi1A4L.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-30-10-22-46.gh-issue-93345.gi1A4L.rst new file mode 100644 index 0000000000000..4cdb37cfe4698 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-05-30-10-22-46.gh-issue-93345.gi1A4L.rst @@ -0,0 +1,2 @@ +Fix a crash in substitution of a ``TypeVar`` in nested generic alias after +``TypeVarTuple``. diff --git a/Objects/genericaliasobject.c b/Objects/genericaliasobject.c index 39fd70999ecbe..59420816496f0 100644 --- a/Objects/genericaliasobject.c +++ b/Objects/genericaliasobject.c @@ -296,7 +296,7 @@ subs_tvars(PyObject *obj, PyObject *params, else { if (iparam >= 0) { if (iparam > varparam) { - iparam += nargs - nsubargs; + iparam += nargs - nparams; } arg = argitems[iparam]; } From webhook-mailer at python.org Tue May 31 06:52:02 2022 From: webhook-mailer at python.org (vstinner) Date: Tue, 31 May 2022 10:52:02 -0000 Subject: [Python-checkins] GH-93312: Add os.PIDFD_NONBLOCK flag (#93313) Message-ID: https://github.com/python/cpython/commit/a565ab0fd58bcd4bbc01084b74ef704a75084274 commit: a565ab0fd58bcd4bbc01084b74ef704a75084274 branch: main author: Kumar Aditya <59607654+kumaraditya303 at users.noreply.github.com> committer: vstinner date: 2022-05-31T12:51:29+02:00 summary: GH-93312: Add os.PIDFD_NONBLOCK flag (#93313) files: A Misc/NEWS.d/next/Library/2022-05-28-08-02-55.gh-issue-93312.HY0Uzj.rst M Doc/library/os.rst M Doc/whatsnew/3.12.rst M Modules/posixmodule.c diff --git a/Doc/library/os.rst b/Doc/library/os.rst index dc0f2e4158ac0..1f434a1c5b62f 100644 --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -3897,16 +3897,25 @@ written in Python, such as a mail server's external command delivery program. .. function:: pidfd_open(pid, flags=0) - Return a file descriptor referring to the process *pid*. This descriptor can - be used to perform process management without races and signals. The *flags* - argument is provided for future extensions; no flag values are currently - defined. + Return a file descriptor referring to the process *pid* with *flags* set. + This descriptor can be used to perform process management without races + and signals. See the :manpage:`pidfd_open(2)` man page for more details. .. availability:: Linux 5.3+ .. versionadded:: 3.9 + .. data:: PIDFD_NONBLOCK + + This flag indicates that the file descriptor will be non-blocking. + If the process referred to by the file descriptor has not yet terminated, + then an attempt to wait on the file descriptor using :manpage:`waitid(2)` + will immediately return the error :data:`~errno.EAGAIN` rather than blocking. + + .. availability:: Linux 5.10+ + .. versionadded:: 3.12 + .. function:: plock(op) diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst index 8a7309726ed2a..7c560d73a5fc6 100644 --- a/Doc/whatsnew/3.12.rst +++ b/Doc/whatsnew/3.12.rst @@ -90,6 +90,13 @@ New Modules Improved Modules ================ +os +-- + +* Add :data:`os.PIDFD_NONBLOCK` to open a file descriptor + for a process with :func:`os.pidfd_open` in non-blocking mode. + (Contributed by Kumar Aditya in :gh:`93312`.) + Optimizations ============= diff --git a/Misc/NEWS.d/next/Library/2022-05-28-08-02-55.gh-issue-93312.HY0Uzj.rst b/Misc/NEWS.d/next/Library/2022-05-28-08-02-55.gh-issue-93312.HY0Uzj.rst new file mode 100644 index 0000000000000..f11d04f63532f --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-05-28-08-02-55.gh-issue-93312.HY0Uzj.rst @@ -0,0 +1,3 @@ +Add :data:`os.PIDFD_NONBLOCK` flag to open a file descriptor +for a process with :func:`os.pidfd_open` in non-blocking mode. +Patch by Kumar Aditya. diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 0a72aca8d51fa..6883ad0c12ccf 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -15255,6 +15255,9 @@ all_ins(PyObject *m) #ifdef P_PIDFD if (PyModule_AddIntMacro(m, P_PIDFD)) return -1; #endif +#ifdef PIDFD_NONBLOCK + if (PyModule_AddIntMacro(m, PIDFD_NONBLOCK)) return -1; +#endif #endif #ifdef WEXITED if (PyModule_AddIntMacro(m, WEXITED)) return -1; From webhook-mailer at python.org Tue May 31 06:58:31 2022 From: webhook-mailer at python.org (markshannon) Date: Tue, 31 May 2022 10:58:31 -0000 Subject: [Python-checkins] GH-93354: Use exponential backoff to avoid excessive specialization attempts. (GH-93355) Message-ID: https://github.com/python/cpython/commit/eb618d5ff0371efead28a3afa91834e4beebf73d commit: eb618d5ff0371efead28a3afa91834e4beebf73d branch: main author: Mark Shannon committer: markshannon date: 2022-05-31T11:58:26+01:00 summary: GH-93354: Use exponential backoff to avoid excessive specialization attempts. (GH-93355) files: A Misc/NEWS.d/next/Core and Builtins/2022-05-30-15-35-42.gh-issue-93354.RZk8gs.rst M Include/internal/pycore_code.h M Python/ceval.c M Python/specialize.c diff --git a/Include/internal/pycore_code.h b/Include/internal/pycore_code.h index 2cfa319f2d290..9d33ed71e7890 100644 --- a/Include/internal/pycore_code.h +++ b/Include/internal/pycore_code.h @@ -227,9 +227,6 @@ extern void _PyLineTable_InitAddressRange( extern int _PyLineTable_NextAddressRange(PyCodeAddressRange *range); extern int _PyLineTable_PreviousAddressRange(PyCodeAddressRange *range); - -#define ADAPTIVE_CACHE_BACKOFF 64 - /* Specialization functions */ extern int _Py_Specialize_LoadAttr(PyObject *owner, _Py_CODEUNIT *instr, @@ -423,6 +420,50 @@ write_location_entry_start(uint8_t *ptr, int code, int length) } +/** Counters + * The first 16-bit value in each inline cache is a counter. + * When counting misses, the counter is treated as a simple unsigned value. + * + * When counting executions until the next specialization attempt, + * exponential backoff is used to reduce the number of specialization failures. + * The high 12 bits store the counter, the low 4 bits store the backoff exponent. + * On a specialization failure, the backoff exponent is incremented and the + * counter set to (2**backoff - 1). + * Backoff == 6 -> starting counter == 63, backoff == 10 -> starting counter == 1023. + */ + +/* With a 16-bit counter, we have 12 bits for the counter value, and 4 bits for the backoff */ +#define ADAPTIVE_BACKOFF_BITS 4 +/* The initial counter value is 31 == 2**ADAPTIVE_BACKOFF_START - 1 */ +#define ADAPTIVE_BACKOFF_START 5 + +#define MAX_BACKOFF_VALUE (16 - ADAPTIVE_BACKOFF_BITS) + + +static inline uint16_t +adaptive_counter_bits(int value, int backoff) { + return (value << ADAPTIVE_BACKOFF_BITS) | + (backoff & ((1< MAX_BACKOFF_VALUE) { + backoff = MAX_BACKOFF_VALUE; + } + unsigned int value = (1 << backoff) - 1; + return adaptive_counter_bits(value, backoff); +} + + #ifdef __cplusplus } #endif diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-30-15-35-42.gh-issue-93354.RZk8gs.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-30-15-35-42.gh-issue-93354.RZk8gs.rst new file mode 100644 index 0000000000000..dcfe6a9b6ba3a --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-05-30-15-35-42.gh-issue-93354.RZk8gs.rst @@ -0,0 +1,3 @@ +Use exponential backoff for specialization counters in the interpreter. Can +reduce the number of failed specializations significantly and avoid slowdown +for those parts of a program that are not suitable for specialization. diff --git a/Python/ceval.c b/Python/ceval.c index fdbf0d4d6e99d..36546929e19c4 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -1561,7 +1561,11 @@ eval_frame_handle_pending(PyThreadState *tstate) dtrace_function_entry(frame); \ } +#define ADAPTIVE_COUNTER_IS_ZERO(cache) \ + (cache)->counter < (1<counter -= (1<counter == 0) { + if (ADAPTIVE_COUNTER_IS_ZERO(cache)) { PyObject *sub = TOP(); PyObject *container = SECOND(); next_instr--; @@ -2167,7 +2171,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int } else { STAT_INC(BINARY_SUBSCR, deferred); - cache->counter--; + DECREMENT_ADAPTIVE_COUNTER(cache); JUMP_TO_INSTRUCTION(BINARY_SUBSCR); } } @@ -2321,7 +2325,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int TARGET(STORE_SUBSCR_ADAPTIVE) { _PyStoreSubscrCache *cache = (_PyStoreSubscrCache *)next_instr; - if (cache->counter == 0) { + if (ADAPTIVE_COUNTER_IS_ZERO(cache)) { PyObject *sub = TOP(); PyObject *container = SECOND(); next_instr--; @@ -2332,7 +2336,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int } else { STAT_INC(STORE_SUBSCR, deferred); - cache->counter--; + DECREMENT_ADAPTIVE_COUNTER(cache); JUMP_TO_INSTRUCTION(STORE_SUBSCR); } } @@ -2815,7 +2819,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int TARGET(UNPACK_SEQUENCE_ADAPTIVE) { assert(cframe.use_tracing == 0); _PyUnpackSequenceCache *cache = (_PyUnpackSequenceCache *)next_instr; - if (cache->counter == 0) { + if (ADAPTIVE_COUNTER_IS_ZERO(cache)) { PyObject *seq = TOP(); next_instr--; _Py_Specialize_UnpackSequence(seq, next_instr, oparg); @@ -2823,7 +2827,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int } else { STAT_INC(UNPACK_SEQUENCE, deferred); - cache->counter--; + DECREMENT_ADAPTIVE_COUNTER(cache); JUMP_TO_INSTRUCTION(UNPACK_SEQUENCE); } } @@ -3056,7 +3060,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int TARGET(LOAD_GLOBAL_ADAPTIVE) { assert(cframe.use_tracing == 0); _PyLoadGlobalCache *cache = (_PyLoadGlobalCache *)next_instr; - if (cache->counter == 0) { + if (ADAPTIVE_COUNTER_IS_ZERO(cache)) { PyObject *name = GETITEM(names, oparg>>1); next_instr--; if (_Py_Specialize_LoadGlobal(GLOBALS(), BUILTINS(), next_instr, name) < 0) { @@ -3066,7 +3070,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int } else { STAT_INC(LOAD_GLOBAL, deferred); - cache->counter--; + DECREMENT_ADAPTIVE_COUNTER(cache); JUMP_TO_INSTRUCTION(LOAD_GLOBAL); } } @@ -3480,7 +3484,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int TARGET(LOAD_ATTR_ADAPTIVE) { assert(cframe.use_tracing == 0); _PyAttrCache *cache = (_PyAttrCache *)next_instr; - if (cache->counter == 0) { + if (ADAPTIVE_COUNTER_IS_ZERO(cache)) { PyObject *owner = TOP(); PyObject *name = GETITEM(names, oparg); next_instr--; @@ -3491,7 +3495,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int } else { STAT_INC(LOAD_ATTR, deferred); - cache->counter--; + DECREMENT_ADAPTIVE_COUNTER(cache); JUMP_TO_INSTRUCTION(LOAD_ATTR); } } @@ -3589,7 +3593,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int TARGET(STORE_ATTR_ADAPTIVE) { assert(cframe.use_tracing == 0); _PyAttrCache *cache = (_PyAttrCache *)next_instr; - if (cache->counter == 0) { + if (ADAPTIVE_COUNTER_IS_ZERO(cache)) { PyObject *owner = TOP(); PyObject *name = GETITEM(names, oparg); next_instr--; @@ -3600,7 +3604,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int } else { STAT_INC(STORE_ATTR, deferred); - cache->counter--; + DECREMENT_ADAPTIVE_COUNTER(cache); JUMP_TO_INSTRUCTION(STORE_ATTR); } } @@ -3719,7 +3723,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int TARGET(COMPARE_OP_ADAPTIVE) { assert(cframe.use_tracing == 0); _PyCompareOpCache *cache = (_PyCompareOpCache *)next_instr; - if (cache->counter == 0) { + if (ADAPTIVE_COUNTER_IS_ZERO(cache)) { PyObject *right = TOP(); PyObject *left = SECOND(); next_instr--; @@ -3728,7 +3732,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int } else { STAT_INC(COMPARE_OP, deferred); - cache->counter--; + DECREMENT_ADAPTIVE_COUNTER(cache); JUMP_TO_INSTRUCTION(COMPARE_OP); } } @@ -4526,7 +4530,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int TARGET(LOAD_METHOD_ADAPTIVE) { assert(cframe.use_tracing == 0); _PyLoadMethodCache *cache = (_PyLoadMethodCache *)next_instr; - if (cache->counter == 0) { + if (ADAPTIVE_COUNTER_IS_ZERO(cache)) { PyObject *owner = TOP(); PyObject *name = GETITEM(names, oparg); next_instr--; @@ -4537,7 +4541,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int } else { STAT_INC(LOAD_METHOD, deferred); - cache->counter--; + DECREMENT_ADAPTIVE_COUNTER(cache); JUMP_TO_INSTRUCTION(LOAD_METHOD); } } @@ -4775,7 +4779,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int TARGET(CALL_ADAPTIVE) { _PyCallCache *cache = (_PyCallCache *)next_instr; - if (cache->counter == 0) { + if (ADAPTIVE_COUNTER_IS_ZERO(cache)) { next_instr--; int is_meth = is_method(stack_pointer, oparg); int nargs = oparg + is_meth; @@ -4789,7 +4793,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int } else { STAT_INC(CALL, deferred); - cache->counter--; + DECREMENT_ADAPTIVE_COUNTER(cache); goto call_function; } } @@ -5521,7 +5525,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int TARGET(BINARY_OP_ADAPTIVE) { assert(cframe.use_tracing == 0); _PyBinaryOpCache *cache = (_PyBinaryOpCache *)next_instr; - if (cache->counter == 0) { + if (ADAPTIVE_COUNTER_IS_ZERO(cache)) { PyObject *lhs = SECOND(); PyObject *rhs = TOP(); next_instr--; @@ -5530,7 +5534,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int } else { STAT_INC(BINARY_OP, deferred); - cache->counter--; + DECREMENT_ADAPTIVE_COUNTER(cache); JUMP_TO_INSTRUCTION(BINARY_OP); } } @@ -5658,7 +5662,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int assert(adaptive_opcode); _Py_SET_OPCODE(next_instr[-1], adaptive_opcode); STAT_INC(opcode, deopt); - *counter = ADAPTIVE_CACHE_BACKOFF; + *counter = adaptive_counter_start(); } next_instr--; DISPATCH_GOTO(); diff --git a/Python/specialize.c b/Python/specialize.c index a2fb460388055..4d30a2aea5f3b 100644 --- a/Python/specialize.c +++ b/Python/specialize.c @@ -321,7 +321,7 @@ _PyCode_Quicken(PyCodeObject *code) } static inline int -initial_counter_value(void) { +miss_counter_start(void) { /* Starting value for the counter. * This value needs to be not too low, otherwise * it would cause excessive de-optimization. @@ -743,12 +743,12 @@ _Py_Specialize_LoadAttr(PyObject *owner, _Py_CODEUNIT *instr, PyObject *name) fail: STAT_INC(LOAD_ATTR, failure); assert(!PyErr_Occurred()); - cache->counter = ADAPTIVE_CACHE_BACKOFF; + cache->counter = adaptive_counter_backoff(cache->counter); return 0; success: STAT_INC(LOAD_ATTR, success); assert(!PyErr_Occurred()); - cache->counter = initial_counter_value(); + cache->counter = miss_counter_start(); return 0; } @@ -825,12 +825,12 @@ _Py_Specialize_StoreAttr(PyObject *owner, _Py_CODEUNIT *instr, PyObject *name) fail: STAT_INC(STORE_ATTR, failure); assert(!PyErr_Occurred()); - cache->counter = ADAPTIVE_CACHE_BACKOFF; + cache->counter = adaptive_counter_backoff(cache->counter); return 0; success: STAT_INC(STORE_ATTR, success); assert(!PyErr_Occurred()); - cache->counter = initial_counter_value(); + cache->counter = miss_counter_start(); return 0; } @@ -1041,14 +1041,13 @@ _Py_Specialize_LoadMethod(PyObject *owner, _Py_CODEUNIT *instr, PyObject *name) success: STAT_INC(LOAD_METHOD, success); assert(!PyErr_Occurred()); - cache->counter = initial_counter_value(); + cache->counter = miss_counter_start(); return 0; fail: STAT_INC(LOAD_METHOD, failure); assert(!PyErr_Occurred()); - cache->counter = ADAPTIVE_CACHE_BACKOFF; + cache->counter = adaptive_counter_backoff(cache->counter); return 0; - } int @@ -1124,12 +1123,12 @@ _Py_Specialize_LoadGlobal( fail: STAT_INC(LOAD_GLOBAL, failure); assert(!PyErr_Occurred()); - cache->counter = ADAPTIVE_CACHE_BACKOFF; + cache->counter = adaptive_counter_backoff(cache->counter); return 0; success: STAT_INC(LOAD_GLOBAL, success); assert(!PyErr_Occurred()); - cache->counter = initial_counter_value(); + cache->counter = miss_counter_start(); return 0; } @@ -1253,12 +1252,12 @@ _Py_Specialize_BinarySubscr( fail: STAT_INC(BINARY_SUBSCR, failure); assert(!PyErr_Occurred()); - cache->counter = ADAPTIVE_CACHE_BACKOFF; + cache->counter = adaptive_counter_backoff(cache->counter); return 0; success: STAT_INC(BINARY_SUBSCR, success); assert(!PyErr_Occurred()); - cache->counter = initial_counter_value(); + cache->counter = miss_counter_start(); return 0; } @@ -1357,12 +1356,12 @@ _Py_Specialize_StoreSubscr(PyObject *container, PyObject *sub, _Py_CODEUNIT *ins fail: STAT_INC(STORE_SUBSCR, failure); assert(!PyErr_Occurred()); - cache->counter = ADAPTIVE_CACHE_BACKOFF; + cache->counter = adaptive_counter_backoff(cache->counter); return 0; success: STAT_INC(STORE_SUBSCR, success); assert(!PyErr_Occurred()); - cache->counter = initial_counter_value(); + cache->counter = miss_counter_start(); return 0; } @@ -1674,12 +1673,12 @@ _Py_Specialize_Call(PyObject *callable, _Py_CODEUNIT *instr, int nargs, if (fail) { STAT_INC(CALL, failure); assert(!PyErr_Occurred()); - cache->counter = ADAPTIVE_CACHE_BACKOFF; + cache->counter = adaptive_counter_backoff(cache->counter); } else { STAT_INC(CALL, success); assert(!PyErr_Occurred()); - cache->counter = initial_counter_value(); + cache->counter = miss_counter_start(); } return 0; } @@ -1827,11 +1826,11 @@ _Py_Specialize_BinaryOp(PyObject *lhs, PyObject *rhs, _Py_CODEUNIT *instr, } SPECIALIZATION_FAIL(BINARY_OP, binary_op_fail_kind(oparg, lhs, rhs)); STAT_INC(BINARY_OP, failure); - cache->counter = ADAPTIVE_CACHE_BACKOFF; + cache->counter = adaptive_counter_backoff(cache->counter); return; success: STAT_INC(BINARY_OP, success); - cache->counter = initial_counter_value(); + cache->counter = miss_counter_start(); } @@ -1953,11 +1952,11 @@ _Py_Specialize_CompareOp(PyObject *lhs, PyObject *rhs, _Py_CODEUNIT *instr, SPECIALIZATION_FAIL(COMPARE_OP, compare_op_fail_kind(lhs, rhs)); failure: STAT_INC(COMPARE_OP, failure); - cache->counter = ADAPTIVE_CACHE_BACKOFF; + cache->counter = adaptive_counter_backoff(cache->counter); return; success: STAT_INC(COMPARE_OP, success); - cache->counter = initial_counter_value(); + cache->counter = miss_counter_start(); } #ifdef Py_STATS @@ -2003,11 +2002,11 @@ _Py_Specialize_UnpackSequence(PyObject *seq, _Py_CODEUNIT *instr, int oparg) SPECIALIZATION_FAIL(UNPACK_SEQUENCE, unpack_sequence_fail_kind(seq)); failure: STAT_INC(UNPACK_SEQUENCE, failure); - cache->counter = ADAPTIVE_CACHE_BACKOFF; + cache->counter = adaptive_counter_backoff(cache->counter); return; success: STAT_INC(UNPACK_SEQUENCE, success); - cache->counter = initial_counter_value(); + cache->counter = miss_counter_start(); } #ifdef Py_STATS From webhook-mailer at python.org Tue May 31 09:17:18 2022 From: webhook-mailer at python.org (pablogsal) Date: Tue, 31 May 2022 13:17:18 -0000 Subject: [Python-checkins] Python 3.11.0b2 Message-ID: https://github.com/python/cpython/commit/72f00f420afaba3bc873c2a986ca6d07e99fae1f commit: 72f00f420afaba3bc873c2a986ca6d07e99fae1f branch: 3.11 author: Pablo Galindo committer: pablogsal date: 2022-05-30T22:18:15+01:00 summary: Python 3.11.0b2 files: A Misc/NEWS.d/3.11.0b2.rst D Misc/NEWS.d/next/Build/2018-08-21-11-10-18.bpo-34449.Z3qm3c.rst D Misc/NEWS.d/next/Build/2022-05-12-10-19-15.gh-issue-90473.-syvqK.rst D Misc/NEWS.d/next/C API/2022-05-13-18-17-48.gh-issue-92781.TVDr3-.rst D Misc/NEWS.d/next/C API/2022-05-19-18-05-51.gh-issue-92913.Ass1Hv.rst D Misc/NEWS.d/next/C API/2022-05-23-15-22-18.gh-issue-92898.Qjc9d3.rst D Misc/NEWS.d/next/Core and Builtins/2022-05-03-20-12-18.gh-issue-92261.aigLnb.rst D Misc/NEWS.d/next/Core and Builtins/2022-05-10-11-34-35.gh-issue-92619.u0V0lY.rst D Misc/NEWS.d/next/Core and Builtins/2022-05-12-13-23-19.gh-issue-92236.sDRzUe.rst D Misc/NEWS.d/next/Core and Builtins/2022-05-14-13-22-11.gh-issue-92804.rAqpI2.rst D Misc/NEWS.d/next/Core and Builtins/2022-05-15-15-25-05.gh-issue-90473.MoPHYW.rst D Misc/NEWS.d/next/Core and Builtins/2022-05-21-23-21-37.gh-issue-93065.5I18WC.rst D Misc/NEWS.d/next/Core and Builtins/2022-05-22-02-37-50.gh-issue-93061.r70Imp.rst D Misc/NEWS.d/next/Core and Builtins/2022-05-25-04-07-22.gh-issue-91924.-UyO4q.rst D Misc/NEWS.d/next/Core and Builtins/2022-05-25-12-30-12.gh-issue-84694.5sjy2w.rst D Misc/NEWS.d/next/Documentation/2017-12-10-19-13-39.bpo-13553.gQbZs4.rst D Misc/NEWS.d/next/Documentation/2019-09-12-08-28-17.bpo-38056.6ktYkc.rst D Misc/NEWS.d/next/Documentation/2022-01-13-16-03-15.bpo-40838.k3NVCf.rst D Misc/NEWS.d/next/Documentation/2022-05-18-23-58-26.gh-issue-92240.bHvYiz.rst D Misc/NEWS.d/next/Documentation/2022-05-26-11-33-23.gh-issue-86438.kEGGmK.rst D Misc/NEWS.d/next/Library/2021-05-22-07-58-59.bpo-42627.EejtD0.rst D Misc/NEWS.d/next/Library/2021-08-29-19-59-16.bpo-45046.eGq0NC.rst D Misc/NEWS.d/next/Library/2022-01-09-14-23-00.bpo-28249.4dzB80.rst D Misc/NEWS.d/next/Library/2022-02-09-23-44-27.bpo-45393.9v5Y8U.rst D Misc/NEWS.d/next/Library/2022-04-03-19-40-09.bpo-39064.76PbIz.rst D Misc/NEWS.d/next/Library/2022-04-15-13-16-25.gh-issue-91581.9OGsrN.rst D Misc/NEWS.d/next/Library/2022-04-15-22-07-36.gh-issue-90622.0C6l8h.rst D Misc/NEWS.d/next/Library/2022-04-25-10-23-01.gh-issue-91810.DOHa6B.rst D Misc/NEWS.d/next/Library/2022-05-09-01-27-25.gh-issue-92531.vV7S_O.rst D Misc/NEWS.d/next/Library/2022-05-09-09-28-02.gh-issue-92530.M4Q1RS.rst D Misc/NEWS.d/next/Library/2022-05-10-07-57-27.gh-issue-92550.Rk_UzM.rst D Misc/NEWS.d/next/Library/2022-05-11-14-34-09.gh-issue-91581.glkou2.rst D Misc/NEWS.d/next/Library/2022-05-11-19-33-27.gh-issue-92671.KE4v6a.rst D Misc/NEWS.d/next/Library/2022-05-14-11-41-23.gh-issue-90473.kPdOZl.rst D Misc/NEWS.d/next/Library/2022-05-16-14-35-39.gh-issue-92839.owSMyo.rst D Misc/NEWS.d/next/Library/2022-05-18-17-18-41.gh-issue-91922.DwWIsJ.rst D Misc/NEWS.d/next/Library/2022-05-18-21-04-09.gh-issue-87901.lnf041.rst D Misc/NEWS.d/next/Library/2022-05-19-13-33-18.gh-issue-92675.ZeerMZ.rst D Misc/NEWS.d/next/Library/2022-05-20-15-52-43.gh-issue-93010.WF-cAc.rst D Misc/NEWS.d/next/Library/2022-05-21-13-16-16.gh-issue-93044.eJ_XkZ.rst D Misc/NEWS.d/next/Library/2022-05-24-10-59-02.gh-issue-92728.zxTifq.rst D Misc/NEWS.d/next/Library/2022-05-25-02-45-41.gh-issue-90817.yxANgU.rst D Misc/NEWS.d/next/Library/2022-05-27-13-18-18.gh-issue-93297.e2zuHz.rst D Misc/NEWS.d/next/Tests/2022-05-12-05-51-06.gh-issue-92670.7L43Z_.rst D Misc/NEWS.d/next/Windows/2022-05-05-06-27-59.bpo-46907.IW-uvT.rst D Misc/NEWS.d/next/Windows/2022-05-16-11-45-06.gh-issue-92841.NQx107.rst D Misc/NEWS.d/next/Windows/2022-05-19-14-01-30.gh-issue-92984.Dsxnlr.rst D Misc/NEWS.d/next/Windows/2022-05-19-21-44-25.gh-issue-92817.Jrf-Kv.rst M Include/patchlevel.h M Lib/pydoc_data/topics.py M README.rst diff --git a/Include/patchlevel.h b/Include/patchlevel.h index 12c0b81cd0ccf..f10d8d11f6cb3 100644 --- a/Include/patchlevel.h +++ b/Include/patchlevel.h @@ -20,10 +20,10 @@ #define PY_MINOR_VERSION 11 #define PY_MICRO_VERSION 0 #define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_BETA -#define PY_RELEASE_SERIAL 1 +#define PY_RELEASE_SERIAL 2 /* Version as a string */ -#define PY_VERSION "3.11.0b1+" +#define PY_VERSION "3.11.0b2" /*--end constants--*/ /* Version as a single 4-byte hex number, e.g. 0x010502B2 == 1.5.2b2. diff --git a/Lib/pydoc_data/topics.py b/Lib/pydoc_data/topics.py index f3ceaadfad645..5b3017f16a2e2 100644 --- a/Lib/pydoc_data/topics.py +++ b/Lib/pydoc_data/topics.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Autogenerated by Sphinx on Fri May 6 23:53:34 2022 +# Autogenerated by Sphinx on Mon May 30 22:16:54 2022 topics = {'assert': 'The "assert" statement\n' '**********************\n' '\n' @@ -4861,7 +4861,10 @@ 'is\n' 'applied to separating the commands; the input is split at the ' 'first\n' - '";;" pair, even if it is in the middle of a quoted string.\n' + '";;" pair, even if it is in the middle of a quoted string. A\n' + 'workaround for strings with double semicolons is to use ' + 'implicit\n' + 'string concatenation "\';\'\';\'" or "";"";"".\n' '\n' 'If a file ".pdbrc" exists in the user?s home directory or in ' 'the\n' @@ -8254,7 +8257,7 @@ '| "x(arguments...)", "x.attribute" | ' 'attribute reference |\n' '+-------------------------------------------------+---------------------------------------+\n' - '| "await" "x" | ' + '| "await x" | ' 'Await expression |\n' '+-------------------------------------------------+---------------------------------------+\n' '| "**" | ' @@ -8290,7 +8293,7 @@ '| ">=", "!=", "==" | ' 'tests and identity tests |\n' '+-------------------------------------------------+---------------------------------------+\n' - '| "not" "x" | ' + '| "not x" | ' 'Boolean NOT |\n' '+-------------------------------------------------+---------------------------------------+\n' '| "and" | ' diff --git a/Misc/NEWS.d/3.11.0b2.rst b/Misc/NEWS.d/3.11.0b2.rst new file mode 100644 index 0000000000000..23014e39dd155 --- /dev/null +++ b/Misc/NEWS.d/3.11.0b2.rst @@ -0,0 +1,489 @@ +.. date: 2022-05-25-12-30-12 +.. gh-issue: 84694 +.. nonce: 5sjy2w +.. release date: 2022-05-30 +.. section: Core and Builtins + +The ``--experimental-isolated-subinterpreters`` configure option and +``EXPERIMENTAL_ISOLATED_SUBINTERPRETERS`` macro have been removed. + +.. + +.. date: 2022-05-25-04-07-22 +.. gh-issue: 91924 +.. nonce: -UyO4q +.. section: Core and Builtins + +Fix ``__lltrace__`` debug feature if the stdout encoding is not UTF-8. Patch +by Victor Stinner. + +.. + +.. date: 2022-05-22-02-37-50 +.. gh-issue: 93061 +.. nonce: r70Imp +.. section: Core and Builtins + +Backward jumps after ``async for`` loops are no longer given dubious line +numbers. + +.. + +.. date: 2022-05-21-23-21-37 +.. gh-issue: 93065 +.. nonce: 5I18WC +.. section: Core and Builtins + +Fix contextvars HAMT implementation to handle iteration over deep trees. + +The bug was discovered and fixed by Eli Libman. See +`MagicStack/immutables#84 +`_ for more details. + +.. + +.. date: 2022-05-15-15-25-05 +.. gh-issue: 90473 +.. nonce: MoPHYW +.. section: Core and Builtins + +Decrease default recursion limit on WASI to address limited call stack size. + +.. + +.. date: 2022-05-14-13-22-11 +.. gh-issue: 92804 +.. nonce: rAqpI2 +.. section: Core and Builtins + +Fix memory leak in ``memoryview`` iterator as it was not finalized at exit. +Patch by Kumar Aditya. + +.. + +.. date: 2022-05-12-13-23-19 +.. gh-issue: 92236 +.. nonce: sDRzUe +.. section: Core and Builtins + +Remove spurious "LINE" event when starting a generator or coroutine, visible +tracing functions implemented in C. + +.. + +.. date: 2022-05-10-11-34-35 +.. gh-issue: 92619 +.. nonce: u0V0lY +.. section: Core and Builtins + +Make the compiler duplicate an exit block only if none of its instructions +have a lineno (previously only the first instruction in the block was +checked, leading to unnecessarily duplicated blocks). + +.. + +.. date: 2022-05-03-20-12-18 +.. gh-issue: 92261 +.. nonce: aigLnb +.. section: Core and Builtins + +Fix hang when trying to iterate over a ``typing.Union``. + +.. + +.. date: 2022-05-27-13-18-18 +.. gh-issue: 93297 +.. nonce: e2zuHz +.. section: Library + +Make asyncio task groups prevent child tasks from being GCed + +.. + +.. date: 2022-05-25-02-45-41 +.. gh-issue: 90817 +.. nonce: yxANgU +.. section: Library + +The :func:`locale.resetlocale` function is deprecated and will be removed in +Python 3.13. Use ``locale.setlocale(locale.LC_ALL, "")`` instead. Patch by +Victor Stinner. + +.. + +.. date: 2022-05-24-10-59-02 +.. gh-issue: 92728 +.. nonce: zxTifq +.. section: Library + +The :func:`re.template` function and the corresponding :const:`re.TEMPLATE` +and :const:`re.T` flags are restored after they were removed in 3.11.0b1, +but they are now deprecated, so they might be removed from Python 3.13. + +.. + +.. date: 2022-05-21-13-16-16 +.. gh-issue: 93044 +.. nonce: eJ_XkZ +.. section: Library + +No longer convert the database argument of :func:`sqlite3.connect` to bytes +before passing it to the factory. + +.. + +.. date: 2022-05-20-15-52-43 +.. gh-issue: 93010 +.. nonce: WF-cAc +.. section: Library + +In a very special case, the email package tried to append the nonexistent +``InvalidHeaderError`` to the defect list. It should have been +``InvalidHeaderDefect``. + +.. + +.. date: 2022-05-19-13-33-18 +.. gh-issue: 92675 +.. nonce: ZeerMZ +.. section: Library + +Fix :func:`venv.ensure_directories` to accept :class:`pathlib.Path` +arguments in addition to :class:`str` paths. Patch by David Foster. + +.. + +.. date: 2022-05-18-21-04-09 +.. gh-issue: 87901 +.. nonce: lnf041 +.. section: Library + +Removed the ``encoding`` argument from :func:`os.popen` that was added in +3.11b1. + +.. + +.. date: 2022-05-18-17-18-41 +.. gh-issue: 91922 +.. nonce: DwWIsJ +.. section: Library + +Fix function :func:`sqlite.connect` and the :class:`sqlite.Connection` +constructor on non-UTF-8 locales. Also, they now support bytes paths +non-decodable with the current FS encoding. + +.. + +.. date: 2022-05-16-14-35-39 +.. gh-issue: 92839 +.. nonce: owSMyo +.. section: Library + +Fixed crash resulting from calling bisect.insort() or bisect.insort_left() +with the key argument not equal to None. + +.. + +.. date: 2022-05-14-11-41-23 +.. gh-issue: 90473 +.. nonce: kPdOZl +.. section: Library + +:mod:`subprocess` now fails early on Emscripten and WASI platforms to work +around missing :func:`os.pipe` on WASI. + +.. + +.. date: 2022-05-11-19-33-27 +.. gh-issue: 92671 +.. nonce: KE4v6a +.. section: Library + +Fixed :func:`ast.unparse` for empty tuples in the assignment target context. + +.. + +.. date: 2022-05-11-14-34-09 +.. gh-issue: 91581 +.. nonce: glkou2 +.. section: Library + +:meth:`~datetime.datetime.utcfromtimestamp` no longer attempts to resolve +``fold`` in the pure Python implementation, since the fold is never 1 in +UTC. In addition to being slightly faster in the common case, this also +prevents some errors when the timestamp is close to :attr:`datetime.min +`. Patch by Paul Ganssle. + +.. + +.. date: 2022-05-10-07-57-27 +.. gh-issue: 92550 +.. nonce: Rk_UzM +.. section: Library + +Fix :meth:`pathlib.Path.rglob` for empty pattern. + +.. + +.. date: 2022-05-09-09-28-02 +.. gh-issue: 92530 +.. nonce: M4Q1RS +.. section: Library + +Fix an issue that occurred after interrupting +:func:`threading.Condition.notify`. + +.. + +.. date: 2022-05-09-01-27-25 +.. gh-issue: 92531 +.. nonce: vV7S_O +.. section: Library + +The statistics.median_grouped() function now always return a float. +Formerly, it did not convert the input type when for sequences of length +one. + +.. + +.. date: 2022-04-25-10-23-01 +.. gh-issue: 91810 +.. nonce: DOHa6B +.. section: Library + +:class:`~xml.etree.ElementTree.ElementTree` method +:meth:`~xml.etree.ElementTree.ElementTree.write` and function +:func:`~xml.etree.ElementTree.tostring` now use the text file's encoding +("UTF-8" if not available) instead of locale encoding in XML declaration +when ``encoding="unicode"`` is specified. + +.. + +.. date: 2022-04-15-22-07-36 +.. gh-issue: 90622 +.. nonce: 0C6l8h +.. section: Library + +Worker processes for :class:`concurrent.futures.ProcessPoolExecutor` are no +longer spawned on demand (a feature added in 3.9) when the multiprocessing +context start method is ``"fork"`` as that can lead to deadlocks in the +child processes due to a fork happening while threads are running. + +.. + +.. date: 2022-04-15-13-16-25 +.. gh-issue: 91581 +.. nonce: 9OGsrN +.. section: Library + +Remove an unhandled error case in the C implementation of calls to +:meth:`datetime.fromtimestamp ` with no +time zone (i.e. getting a local time from an epoch timestamp). This should +have no user-facing effect other than giving a possibly more accurate error +message when called with timestamps that fall on 10000-01-01 in the local +time. Patch by Paul Ganssle. + +.. + +.. bpo: 39064 +.. date: 2022-04-03-19-40-09 +.. nonce: 76PbIz +.. section: Library + +:class:`zipfile.ZipFile` now raises :exc:`zipfile.BadZipFile` instead of +``ValueError`` when reading a corrupt zip file in which the central +directory offset is negative. + +.. + +.. bpo: 45393 +.. date: 2022-02-09-23-44-27 +.. nonce: 9v5Y8U +.. section: Library + +Fix the formatting for ``await x`` and ``not x`` in the operator precedence +table when using the :func:`help` system. + +.. + +.. bpo: 28249 +.. date: 2022-01-09-14-23-00 +.. nonce: 4dzB80 +.. section: Library + +Set :attr:`doctest.DocTest.lineno` to ``None`` when object does not have +:attr:`__doc__`. + +.. + +.. bpo: 45046 +.. date: 2021-08-29-19-59-16 +.. nonce: eGq0NC +.. section: Library + +Add support of context managers in :mod:`unittest`: methods +:meth:`~unittest.TestCase.enterContext` and +:meth:`~unittest.TestCase.enterClassContext` of class +:class:`~unittest.TestCase`, method +:meth:`~unittest.IsolatedAsyncioTestCase.enterAsyncContext` of class +:class:`~unittest.IsolatedAsyncioTestCase` and function +:func:`unittest.enterModuleContext`. + +.. + +.. bpo: 42627 +.. date: 2021-05-22-07-58-59 +.. nonce: EejtD0 +.. section: Library + +Fix incorrect parsing of Windows registry proxy settings + +.. + +.. date: 2022-05-26-11-33-23 +.. gh-issue: 86438 +.. nonce: kEGGmK +.. section: Documentation + +Clarify that :option:`-W` and :envvar:`PYTHONWARNINGS` are matched literally +and case-insensitively, rather than as regular expressions, in +:mod:`warnings`. + +.. + +.. date: 2022-05-18-23-58-26 +.. gh-issue: 92240 +.. nonce: bHvYiz +.. section: Documentation + +Added release dates for "What's New in Python 3.X" for 3.0, 3.1, 3.2, 3.8 +and 3.10 + +.. + +.. bpo: 40838 +.. date: 2022-01-13-16-03-15 +.. nonce: k3NVCf +.. section: Documentation + +Document that :func:`inspect.getdoc`, :func:`inspect.getmodule`, and +:func:`inspect.getsourcefile` might return ``None``. + +.. + +.. bpo: 38056 +.. date: 2019-09-12-08-28-17 +.. nonce: 6ktYkc +.. section: Documentation + +Overhaul the :ref:`error-handlers` documentation in :mod:`codecs`. + +.. + +.. bpo: 13553 +.. date: 2017-12-10-19-13-39 +.. nonce: gQbZs4 +.. section: Documentation + +Document tkinter.Tk args. + +.. + +.. date: 2022-05-12-05-51-06 +.. gh-issue: 92670 +.. nonce: 7L43Z_ +.. section: Tests + +Skip ``test_shutil.TestCopy.test_copyfile_nonexistent_dir`` test on AIX as +the test uses a trailing slash to force the OS consider the path as a +directory, but on AIX the trailing slash has no effect and is considered as +a file. + +.. + +.. date: 2022-05-12-10-19-15 +.. gh-issue: 90473 +.. nonce: -syvqK +.. section: Build + +Disable pymalloc and increase stack size on ``wasm32-wasi``. + +.. + +.. bpo: 34449 +.. date: 2018-08-21-11-10-18 +.. nonce: Z3qm3c +.. section: Build + +Drop invalid compiler switch ``-fPIC`` for HP aCC on HP-UX. Patch by Michael +Osipov. + +.. + +.. date: 2022-05-19-21-44-25 +.. gh-issue: 92817 +.. nonce: Jrf-Kv +.. section: Windows + +Ensures that :file:`py.exe` will prefer an active virtual environment over +default tags specified with environment variables or through a +:file:`py.ini` file. + +.. + +.. date: 2022-05-19-14-01-30 +.. gh-issue: 92984 +.. nonce: Dsxnlr +.. section: Windows + +Explicitly disable incremental linking for non-Debug builds + +.. + +.. date: 2022-05-16-11-45-06 +.. gh-issue: 92841 +.. nonce: NQx107 +.. section: Windows + +:mod:`asyncio` no longer throws ``RuntimeError: Event loop is closed`` on +interpreter exit after asynchronous socket activity. Patch by Oleg Iarygin. + +.. + +.. bpo: 46907 +.. date: 2022-05-05-06-27-59 +.. nonce: IW-uvT +.. section: Windows + +Update Windows installer to use SQLite 3.38.4. + +.. + +.. date: 2022-05-23-15-22-18 +.. gh-issue: 92898 +.. nonce: Qjc9d3 +.. section: C API + +Fix C++ compiler warnings when casting function arguments to ``PyObject*``. +Patch by Serge Guelton. + +.. + +.. date: 2022-05-19-18-05-51 +.. gh-issue: 92913 +.. nonce: Ass1Hv +.. section: C API + +Ensures changes to :c:member:`PyConfig.module_search_paths` are ignored +unless :c:member:`PyConfig.module_search_paths_set` is set + +.. + +.. date: 2022-05-13-18-17-48 +.. gh-issue: 92781 +.. nonce: TVDr3- +.. section: C API + +Avoid mixing declarations and code in the C API to fix the compiler warning: +"ISO C90 forbids mixed declarations and code" +[-Werror=declaration-after-statement]. Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/Build/2018-08-21-11-10-18.bpo-34449.Z3qm3c.rst b/Misc/NEWS.d/next/Build/2018-08-21-11-10-18.bpo-34449.Z3qm3c.rst deleted file mode 100644 index 53b75aee9cc27..0000000000000 --- a/Misc/NEWS.d/next/Build/2018-08-21-11-10-18.bpo-34449.Z3qm3c.rst +++ /dev/null @@ -1 +0,0 @@ -Drop invalid compiler switch ``-fPIC`` for HP aCC on HP-UX. Patch by Michael Osipov. diff --git a/Misc/NEWS.d/next/Build/2022-05-12-10-19-15.gh-issue-90473.-syvqK.rst b/Misc/NEWS.d/next/Build/2022-05-12-10-19-15.gh-issue-90473.-syvqK.rst deleted file mode 100644 index 29ce3de1f2134..0000000000000 --- a/Misc/NEWS.d/next/Build/2022-05-12-10-19-15.gh-issue-90473.-syvqK.rst +++ /dev/null @@ -1 +0,0 @@ -Disable pymalloc and increase stack size on ``wasm32-wasi``. diff --git a/Misc/NEWS.d/next/C API/2022-05-13-18-17-48.gh-issue-92781.TVDr3-.rst b/Misc/NEWS.d/next/C API/2022-05-13-18-17-48.gh-issue-92781.TVDr3-.rst deleted file mode 100644 index 6442ba619450f..0000000000000 --- a/Misc/NEWS.d/next/C API/2022-05-13-18-17-48.gh-issue-92781.TVDr3-.rst +++ /dev/null @@ -1,3 +0,0 @@ -Avoid mixing declarations and code in the C API to fix the compiler warning: -"ISO C90 forbids mixed declarations and code" -[-Werror=declaration-after-statement]. Patch by Victor Stinner. diff --git a/Misc/NEWS.d/next/C API/2022-05-19-18-05-51.gh-issue-92913.Ass1Hv.rst b/Misc/NEWS.d/next/C API/2022-05-19-18-05-51.gh-issue-92913.Ass1Hv.rst deleted file mode 100644 index c448c64029d82..0000000000000 --- a/Misc/NEWS.d/next/C API/2022-05-19-18-05-51.gh-issue-92913.Ass1Hv.rst +++ /dev/null @@ -1,2 +0,0 @@ -Ensures changes to :c:member:`PyConfig.module_search_paths` are ignored -unless :c:member:`PyConfig.module_search_paths_set` is set diff --git a/Misc/NEWS.d/next/C API/2022-05-23-15-22-18.gh-issue-92898.Qjc9d3.rst b/Misc/NEWS.d/next/C API/2022-05-23-15-22-18.gh-issue-92898.Qjc9d3.rst deleted file mode 100644 index 01eca1db1f18c..0000000000000 --- a/Misc/NEWS.d/next/C API/2022-05-23-15-22-18.gh-issue-92898.Qjc9d3.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix C++ compiler warnings when casting function arguments to ``PyObject*``. -Patch by Serge Guelton. diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-03-20-12-18.gh-issue-92261.aigLnb.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-03-20-12-18.gh-issue-92261.aigLnb.rst deleted file mode 100644 index df0228e273d8e..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-05-03-20-12-18.gh-issue-92261.aigLnb.rst +++ /dev/null @@ -1 +0,0 @@ -Fix hang when trying to iterate over a ``typing.Union``. diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-10-11-34-35.gh-issue-92619.u0V0lY.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-10-11-34-35.gh-issue-92619.u0V0lY.rst deleted file mode 100644 index dfc9c0d1327fe..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-05-10-11-34-35.gh-issue-92619.u0V0lY.rst +++ /dev/null @@ -1 +0,0 @@ -Make the compiler duplicate an exit block only if none of its instructions have a lineno (previously only the first instruction in the block was checked, leading to unnecessarily duplicated blocks). diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-12-13-23-19.gh-issue-92236.sDRzUe.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-12-13-23-19.gh-issue-92236.sDRzUe.rst deleted file mode 100644 index fe482d505c67b..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-05-12-13-23-19.gh-issue-92236.sDRzUe.rst +++ /dev/null @@ -1,2 +0,0 @@ -Remove spurious "LINE" event when starting a generator or coroutine, visible -tracing functions implemented in C. diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-14-13-22-11.gh-issue-92804.rAqpI2.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-14-13-22-11.gh-issue-92804.rAqpI2.rst deleted file mode 100644 index 7a5fd3f6568ea..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-05-14-13-22-11.gh-issue-92804.rAqpI2.rst +++ /dev/null @@ -1 +0,0 @@ -Fix memory leak in ``memoryview`` iterator as it was not finalized at exit. Patch by Kumar Aditya. diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-15-15-25-05.gh-issue-90473.MoPHYW.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-15-15-25-05.gh-issue-90473.MoPHYW.rst deleted file mode 100644 index 1f9f45a511fba..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-05-15-15-25-05.gh-issue-90473.MoPHYW.rst +++ /dev/null @@ -1 +0,0 @@ -Decrease default recursion limit on WASI to address limited call stack size. diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-21-23-21-37.gh-issue-93065.5I18WC.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-21-23-21-37.gh-issue-93065.5I18WC.rst deleted file mode 100644 index ea801653f7502..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-05-21-23-21-37.gh-issue-93065.5I18WC.rst +++ /dev/null @@ -1,5 +0,0 @@ -Fix contextvars HAMT implementation to handle iteration over deep trees. - -The bug was discovered and fixed by Eli Libman. See -`MagicStack/immutables#84 `_ -for more details. diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-22-02-37-50.gh-issue-93061.r70Imp.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-22-02-37-50.gh-issue-93061.r70Imp.rst deleted file mode 100644 index d41e59028ad57..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-05-22-02-37-50.gh-issue-93061.r70Imp.rst +++ /dev/null @@ -1 +0,0 @@ -Backward jumps after ``async for`` loops are no longer given dubious line numbers. diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-25-04-07-22.gh-issue-91924.-UyO4q.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-25-04-07-22.gh-issue-91924.-UyO4q.rst deleted file mode 100644 index 44866a03cf48b..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-05-25-04-07-22.gh-issue-91924.-UyO4q.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix ``__lltrace__`` debug feature if the stdout encoding is not UTF-8. Patch -by Victor Stinner. diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-25-12-30-12.gh-issue-84694.5sjy2w.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-25-12-30-12.gh-issue-84694.5sjy2w.rst deleted file mode 100644 index c062d28b29486..0000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2022-05-25-12-30-12.gh-issue-84694.5sjy2w.rst +++ /dev/null @@ -1,2 +0,0 @@ -The ``--experimental-isolated-subinterpreters`` configure option and -``EXPERIMENTAL_ISOLATED_SUBINTERPRETERS`` macro have been removed. diff --git a/Misc/NEWS.d/next/Documentation/2017-12-10-19-13-39.bpo-13553.gQbZs4.rst b/Misc/NEWS.d/next/Documentation/2017-12-10-19-13-39.bpo-13553.gQbZs4.rst deleted file mode 100644 index 23d3c1555e370..0000000000000 --- a/Misc/NEWS.d/next/Documentation/2017-12-10-19-13-39.bpo-13553.gQbZs4.rst +++ /dev/null @@ -1 +0,0 @@ -Document tkinter.Tk args. diff --git a/Misc/NEWS.d/next/Documentation/2019-09-12-08-28-17.bpo-38056.6ktYkc.rst b/Misc/NEWS.d/next/Documentation/2019-09-12-08-28-17.bpo-38056.6ktYkc.rst deleted file mode 100644 index 2e6b70fd84b6d..0000000000000 --- a/Misc/NEWS.d/next/Documentation/2019-09-12-08-28-17.bpo-38056.6ktYkc.rst +++ /dev/null @@ -1 +0,0 @@ -Overhaul the :ref:`error-handlers` documentation in :mod:`codecs`. diff --git a/Misc/NEWS.d/next/Documentation/2022-01-13-16-03-15.bpo-40838.k3NVCf.rst b/Misc/NEWS.d/next/Documentation/2022-01-13-16-03-15.bpo-40838.k3NVCf.rst deleted file mode 100644 index 0f071ab64dbec..0000000000000 --- a/Misc/NEWS.d/next/Documentation/2022-01-13-16-03-15.bpo-40838.k3NVCf.rst +++ /dev/null @@ -1,2 +0,0 @@ -Document that :func:`inspect.getdoc`, :func:`inspect.getmodule`, and -:func:`inspect.getsourcefile` might return ``None``. diff --git a/Misc/NEWS.d/next/Documentation/2022-05-18-23-58-26.gh-issue-92240.bHvYiz.rst b/Misc/NEWS.d/next/Documentation/2022-05-18-23-58-26.gh-issue-92240.bHvYiz.rst deleted file mode 100644 index 53b2a66c9779c..0000000000000 --- a/Misc/NEWS.d/next/Documentation/2022-05-18-23-58-26.gh-issue-92240.bHvYiz.rst +++ /dev/null @@ -1,2 +0,0 @@ -Added release dates for -"What's New in Python 3.X" for 3.0, 3.1, 3.2, 3.8 and 3.10 diff --git a/Misc/NEWS.d/next/Documentation/2022-05-26-11-33-23.gh-issue-86438.kEGGmK.rst b/Misc/NEWS.d/next/Documentation/2022-05-26-11-33-23.gh-issue-86438.kEGGmK.rst deleted file mode 100644 index 75abfdd63b8b2..0000000000000 --- a/Misc/NEWS.d/next/Documentation/2022-05-26-11-33-23.gh-issue-86438.kEGGmK.rst +++ /dev/null @@ -1,3 +0,0 @@ -Clarify that :option:`-W` and :envvar:`PYTHONWARNINGS` are matched literally -and case-insensitively, rather than as regular expressions, in -:mod:`warnings`. diff --git a/Misc/NEWS.d/next/Library/2021-05-22-07-58-59.bpo-42627.EejtD0.rst b/Misc/NEWS.d/next/Library/2021-05-22-07-58-59.bpo-42627.EejtD0.rst deleted file mode 100644 index f165b9ced05d9..0000000000000 --- a/Misc/NEWS.d/next/Library/2021-05-22-07-58-59.bpo-42627.EejtD0.rst +++ /dev/null @@ -1 +0,0 @@ -Fix incorrect parsing of Windows registry proxy settings diff --git a/Misc/NEWS.d/next/Library/2021-08-29-19-59-16.bpo-45046.eGq0NC.rst b/Misc/NEWS.d/next/Library/2021-08-29-19-59-16.bpo-45046.eGq0NC.rst deleted file mode 100644 index 8072afaf445c5..0000000000000 --- a/Misc/NEWS.d/next/Library/2021-08-29-19-59-16.bpo-45046.eGq0NC.rst +++ /dev/null @@ -1,7 +0,0 @@ -Add support of context managers in :mod:`unittest`: methods -:meth:`~unittest.TestCase.enterContext` and -:meth:`~unittest.TestCase.enterClassContext` of class -:class:`~unittest.TestCase`, method -:meth:`~unittest.IsolatedAsyncioTestCase.enterAsyncContext` of class -:class:`~unittest.IsolatedAsyncioTestCase` and function -:func:`unittest.enterModuleContext`. diff --git a/Misc/NEWS.d/next/Library/2022-01-09-14-23-00.bpo-28249.4dzB80.rst b/Misc/NEWS.d/next/Library/2022-01-09-14-23-00.bpo-28249.4dzB80.rst deleted file mode 100644 index b5f1312d76866..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-01-09-14-23-00.bpo-28249.4dzB80.rst +++ /dev/null @@ -1,2 +0,0 @@ -Set :attr:`doctest.DocTest.lineno` to ``None`` when object does not have -:attr:`__doc__`. diff --git a/Misc/NEWS.d/next/Library/2022-02-09-23-44-27.bpo-45393.9v5Y8U.rst b/Misc/NEWS.d/next/Library/2022-02-09-23-44-27.bpo-45393.9v5Y8U.rst deleted file mode 100644 index 0a239b07d76bd..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-02-09-23-44-27.bpo-45393.9v5Y8U.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix the formatting for ``await x`` and ``not x`` in the operator precedence -table when using the :func:`help` system. diff --git a/Misc/NEWS.d/next/Library/2022-04-03-19-40-09.bpo-39064.76PbIz.rst b/Misc/NEWS.d/next/Library/2022-04-03-19-40-09.bpo-39064.76PbIz.rst deleted file mode 100644 index 34d31527e332d..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-03-19-40-09.bpo-39064.76PbIz.rst +++ /dev/null @@ -1,2 +0,0 @@ -:class:`zipfile.ZipFile` now raises :exc:`zipfile.BadZipFile` instead of ``ValueError`` when reading a -corrupt zip file in which the central directory offset is negative. diff --git a/Misc/NEWS.d/next/Library/2022-04-15-13-16-25.gh-issue-91581.9OGsrN.rst b/Misc/NEWS.d/next/Library/2022-04-15-13-16-25.gh-issue-91581.9OGsrN.rst deleted file mode 100644 index 1c3008f425578..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-15-13-16-25.gh-issue-91581.9OGsrN.rst +++ /dev/null @@ -1,6 +0,0 @@ -Remove an unhandled error case in the C implementation of calls to -:meth:`datetime.fromtimestamp ` with no time -zone (i.e. getting a local time from an epoch timestamp). This should have no -user-facing effect other than giving a possibly more accurate error message -when called with timestamps that fall on 10000-01-01 in the local time. Patch -by Paul Ganssle. diff --git a/Misc/NEWS.d/next/Library/2022-04-15-22-07-36.gh-issue-90622.0C6l8h.rst b/Misc/NEWS.d/next/Library/2022-04-15-22-07-36.gh-issue-90622.0C6l8h.rst deleted file mode 100644 index 5db0a1bbe721d..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-15-22-07-36.gh-issue-90622.0C6l8h.rst +++ /dev/null @@ -1,4 +0,0 @@ -Worker processes for :class:`concurrent.futures.ProcessPoolExecutor` are no -longer spawned on demand (a feature added in 3.9) when the multiprocessing -context start method is ``"fork"`` as that can lead to deadlocks in the -child processes due to a fork happening while threads are running. diff --git a/Misc/NEWS.d/next/Library/2022-04-25-10-23-01.gh-issue-91810.DOHa6B.rst b/Misc/NEWS.d/next/Library/2022-04-25-10-23-01.gh-issue-91810.DOHa6B.rst deleted file mode 100644 index 0711f8466b818..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-04-25-10-23-01.gh-issue-91810.DOHa6B.rst +++ /dev/null @@ -1,5 +0,0 @@ -:class:`~xml.etree.ElementTree.ElementTree` method -:meth:`~xml.etree.ElementTree.ElementTree.write` and function -:func:`~xml.etree.ElementTree.tostring` now use the text file's encoding -("UTF-8" if not available) instead of locale encoding in XML declaration -when ``encoding="unicode"`` is specified. diff --git a/Misc/NEWS.d/next/Library/2022-05-09-01-27-25.gh-issue-92531.vV7S_O.rst b/Misc/NEWS.d/next/Library/2022-05-09-01-27-25.gh-issue-92531.vV7S_O.rst deleted file mode 100644 index 574fa6c4d9799..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-05-09-01-27-25.gh-issue-92531.vV7S_O.rst +++ /dev/null @@ -1,3 +0,0 @@ -The statistics.median_grouped() function now always return a float. -Formerly, it did not convert the input type when for sequences of length -one. diff --git a/Misc/NEWS.d/next/Library/2022-05-09-09-28-02.gh-issue-92530.M4Q1RS.rst b/Misc/NEWS.d/next/Library/2022-05-09-09-28-02.gh-issue-92530.M4Q1RS.rst deleted file mode 100644 index 8bb8ca0488c96..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-05-09-09-28-02.gh-issue-92530.M4Q1RS.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix an issue that occurred after interrupting -:func:`threading.Condition.notify`. diff --git a/Misc/NEWS.d/next/Library/2022-05-10-07-57-27.gh-issue-92550.Rk_UzM.rst b/Misc/NEWS.d/next/Library/2022-05-10-07-57-27.gh-issue-92550.Rk_UzM.rst deleted file mode 100644 index 1f0fde31108a7..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-05-10-07-57-27.gh-issue-92550.Rk_UzM.rst +++ /dev/null @@ -1 +0,0 @@ -Fix :meth:`pathlib.Path.rglob` for empty pattern. diff --git a/Misc/NEWS.d/next/Library/2022-05-11-14-34-09.gh-issue-91581.glkou2.rst b/Misc/NEWS.d/next/Library/2022-05-11-14-34-09.gh-issue-91581.glkou2.rst deleted file mode 100644 index 846f57844a675..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-05-11-14-34-09.gh-issue-91581.glkou2.rst +++ /dev/null @@ -1,5 +0,0 @@ -:meth:`~datetime.datetime.utcfromtimestamp` no longer attempts to resolve -``fold`` in the pure Python implementation, since the fold is never 1 in UTC. -In addition to being slightly faster in the common case, this also prevents -some errors when the timestamp is close to :attr:`datetime.min -`. Patch by Paul Ganssle. diff --git a/Misc/NEWS.d/next/Library/2022-05-11-19-33-27.gh-issue-92671.KE4v6a.rst b/Misc/NEWS.d/next/Library/2022-05-11-19-33-27.gh-issue-92671.KE4v6a.rst deleted file mode 100644 index b50677ab5ca10..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-05-11-19-33-27.gh-issue-92671.KE4v6a.rst +++ /dev/null @@ -1 +0,0 @@ -Fixed :func:`ast.unparse` for empty tuples in the assignment target context. diff --git a/Misc/NEWS.d/next/Library/2022-05-14-11-41-23.gh-issue-90473.kPdOZl.rst b/Misc/NEWS.d/next/Library/2022-05-14-11-41-23.gh-issue-90473.kPdOZl.rst deleted file mode 100644 index bf5ee542182e0..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-05-14-11-41-23.gh-issue-90473.kPdOZl.rst +++ /dev/null @@ -1,2 +0,0 @@ -:mod:`subprocess` now fails early on Emscripten and WASI platforms to work -around missing :func:`os.pipe` on WASI. diff --git a/Misc/NEWS.d/next/Library/2022-05-16-14-35-39.gh-issue-92839.owSMyo.rst b/Misc/NEWS.d/next/Library/2022-05-16-14-35-39.gh-issue-92839.owSMyo.rst deleted file mode 100644 index b425bd9c47bc9..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-05-16-14-35-39.gh-issue-92839.owSMyo.rst +++ /dev/null @@ -1 +0,0 @@ -Fixed crash resulting from calling bisect.insort() or bisect.insort_left() with the key argument not equal to None. diff --git a/Misc/NEWS.d/next/Library/2022-05-18-17-18-41.gh-issue-91922.DwWIsJ.rst b/Misc/NEWS.d/next/Library/2022-05-18-17-18-41.gh-issue-91922.DwWIsJ.rst deleted file mode 100644 index 30f7bba115606..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-05-18-17-18-41.gh-issue-91922.DwWIsJ.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fix function :func:`sqlite.connect` and the :class:`sqlite.Connection` -constructor on non-UTF-8 locales. Also, they now support bytes paths -non-decodable with the current FS encoding. diff --git a/Misc/NEWS.d/next/Library/2022-05-18-21-04-09.gh-issue-87901.lnf041.rst b/Misc/NEWS.d/next/Library/2022-05-18-21-04-09.gh-issue-87901.lnf041.rst deleted file mode 100644 index 3488541eb3d77..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-05-18-21-04-09.gh-issue-87901.lnf041.rst +++ /dev/null @@ -1,2 +0,0 @@ -Removed the ``encoding`` argument from :func:`os.popen` that was added in -3.11b1. diff --git a/Misc/NEWS.d/next/Library/2022-05-19-13-33-18.gh-issue-92675.ZeerMZ.rst b/Misc/NEWS.d/next/Library/2022-05-19-13-33-18.gh-issue-92675.ZeerMZ.rst deleted file mode 100644 index 6adc024fc5415..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-05-19-13-33-18.gh-issue-92675.ZeerMZ.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix :func:`venv.ensure_directories` to accept :class:`pathlib.Path` arguments -in addition to :class:`str` paths. Patch by David Foster. diff --git a/Misc/NEWS.d/next/Library/2022-05-20-15-52-43.gh-issue-93010.WF-cAc.rst b/Misc/NEWS.d/next/Library/2022-05-20-15-52-43.gh-issue-93010.WF-cAc.rst deleted file mode 100644 index 24208b5160ed5..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-05-20-15-52-43.gh-issue-93010.WF-cAc.rst +++ /dev/null @@ -1 +0,0 @@ -In a very special case, the email package tried to append the nonexistent ``InvalidHeaderError`` to the defect list. It should have been ``InvalidHeaderDefect``. diff --git a/Misc/NEWS.d/next/Library/2022-05-21-13-16-16.gh-issue-93044.eJ_XkZ.rst b/Misc/NEWS.d/next/Library/2022-05-21-13-16-16.gh-issue-93044.eJ_XkZ.rst deleted file mode 100644 index c9df8676bcdda..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-05-21-13-16-16.gh-issue-93044.eJ_XkZ.rst +++ /dev/null @@ -1,2 +0,0 @@ -No longer convert the database argument of :func:`sqlite3.connect` to bytes -before passing it to the factory. diff --git a/Misc/NEWS.d/next/Library/2022-05-24-10-59-02.gh-issue-92728.zxTifq.rst b/Misc/NEWS.d/next/Library/2022-05-24-10-59-02.gh-issue-92728.zxTifq.rst deleted file mode 100644 index b39609be2c4cf..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-05-24-10-59-02.gh-issue-92728.zxTifq.rst +++ /dev/null @@ -1,3 +0,0 @@ -The :func:`re.template` function and the corresponding :const:`re.TEMPLATE` -and :const:`re.T` flags are restored after they were removed in 3.11.0b1, -but they are now deprecated, so they might be removed from Python 3.13. diff --git a/Misc/NEWS.d/next/Library/2022-05-25-02-45-41.gh-issue-90817.yxANgU.rst b/Misc/NEWS.d/next/Library/2022-05-25-02-45-41.gh-issue-90817.yxANgU.rst deleted file mode 100644 index 06937e8869172..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-05-25-02-45-41.gh-issue-90817.yxANgU.rst +++ /dev/null @@ -1,3 +0,0 @@ -The :func:`locale.resetlocale` function is deprecated and will be removed in -Python 3.13. Use ``locale.setlocale(locale.LC_ALL, "")`` instead. Patch by -Victor Stinner. diff --git a/Misc/NEWS.d/next/Library/2022-05-27-13-18-18.gh-issue-93297.e2zuHz.rst b/Misc/NEWS.d/next/Library/2022-05-27-13-18-18.gh-issue-93297.e2zuHz.rst deleted file mode 100644 index a8e4cd93d3047..0000000000000 --- a/Misc/NEWS.d/next/Library/2022-05-27-13-18-18.gh-issue-93297.e2zuHz.rst +++ /dev/null @@ -1 +0,0 @@ -Make asyncio task groups prevent child tasks from being GCed diff --git a/Misc/NEWS.d/next/Tests/2022-05-12-05-51-06.gh-issue-92670.7L43Z_.rst b/Misc/NEWS.d/next/Tests/2022-05-12-05-51-06.gh-issue-92670.7L43Z_.rst deleted file mode 100644 index c1349519e7c37..0000000000000 --- a/Misc/NEWS.d/next/Tests/2022-05-12-05-51-06.gh-issue-92670.7L43Z_.rst +++ /dev/null @@ -1,3 +0,0 @@ -Skip ``test_shutil.TestCopy.test_copyfile_nonexistent_dir`` test on AIX as the test uses a trailing -slash to force the OS consider the path as a directory, but on AIX the -trailing slash has no effect and is considered as a file. diff --git a/Misc/NEWS.d/next/Windows/2022-05-05-06-27-59.bpo-46907.IW-uvT.rst b/Misc/NEWS.d/next/Windows/2022-05-05-06-27-59.bpo-46907.IW-uvT.rst deleted file mode 100644 index 420fbd210ef19..0000000000000 --- a/Misc/NEWS.d/next/Windows/2022-05-05-06-27-59.bpo-46907.IW-uvT.rst +++ /dev/null @@ -1 +0,0 @@ -Update Windows installer to use SQLite 3.38.4. diff --git a/Misc/NEWS.d/next/Windows/2022-05-16-11-45-06.gh-issue-92841.NQx107.rst b/Misc/NEWS.d/next/Windows/2022-05-16-11-45-06.gh-issue-92841.NQx107.rst deleted file mode 100644 index 5e1897e6ba1bc..0000000000000 --- a/Misc/NEWS.d/next/Windows/2022-05-16-11-45-06.gh-issue-92841.NQx107.rst +++ /dev/null @@ -1,2 +0,0 @@ -:mod:`asyncio` no longer throws ``RuntimeError: Event loop is closed`` on -interpreter exit after asynchronous socket activity. Patch by Oleg Iarygin. diff --git a/Misc/NEWS.d/next/Windows/2022-05-19-14-01-30.gh-issue-92984.Dsxnlr.rst b/Misc/NEWS.d/next/Windows/2022-05-19-14-01-30.gh-issue-92984.Dsxnlr.rst deleted file mode 100644 index 2d3071b00b761..0000000000000 --- a/Misc/NEWS.d/next/Windows/2022-05-19-14-01-30.gh-issue-92984.Dsxnlr.rst +++ /dev/null @@ -1 +0,0 @@ -Explicitly disable incremental linking for non-Debug builds diff --git a/Misc/NEWS.d/next/Windows/2022-05-19-21-44-25.gh-issue-92817.Jrf-Kv.rst b/Misc/NEWS.d/next/Windows/2022-05-19-21-44-25.gh-issue-92817.Jrf-Kv.rst deleted file mode 100644 index 16acba1d6274c..0000000000000 --- a/Misc/NEWS.d/next/Windows/2022-05-19-21-44-25.gh-issue-92817.Jrf-Kv.rst +++ /dev/null @@ -1,3 +0,0 @@ -Ensures that :file:`py.exe` will prefer an active virtual environment over -default tags specified with environment variables or through a -:file:`py.ini` file. diff --git a/README.rst b/README.rst index 5a2b1ad1f8b44..2d221113f935f 100644 --- a/README.rst +++ b/README.rst @@ -1,4 +1,4 @@ -This is Python version 3.11.0 beta 1 +This is Python version 3.11.0 beta 2 ==================================== .. image:: https://github.com/python/cpython/workflows/Tests/badge.svg From webhook-mailer at python.org Tue May 31 13:29:37 2022 From: webhook-mailer at python.org (benjaminp) Date: Tue, 31 May 2022 17:29:37 -0000 Subject: [Python-checkins] Remove VOC reference (93333) Message-ID: https://github.com/python/cpython/commit/bb900712a5511ba82ef64105fe28d2a6886a8fed commit: bb900712a5511ba82ef64105fe28d2a6886a8fed branch: main author: Carl Bordum Hansen committer: benjaminp date: 2022-05-31T10:29:21-07:00 summary: Remove VOC reference (93333) VOC has been archived by the BeeWare project, and they are instead embedding CPython, rather than transpiling to Java bytecode. files: M Doc/faq/design.rst diff --git a/Doc/faq/design.rst b/Doc/faq/design.rst index ff83a1b8134b7..a624fdb07a17d 100644 --- a/Doc/faq/design.rst +++ b/Doc/faq/design.rst @@ -324,8 +324,7 @@ Can Python be compiled to machine code, C or some other language? `Cython `_ compiles a modified version of Python with optional annotations into C extensions. `Nuitka `_ is an up-and-coming compiler of Python into C++ code, aiming to support the full -Python language. For compiling to Java you can consider -`VOC `_. +Python language. How does Python manage memory? From webhook-mailer at python.org Tue May 31 13:38:34 2022 From: webhook-mailer at python.org (serhiy-storchaka) Date: Tue, 31 May 2022 17:38:34 -0000 Subject: [Python-checkins] gh-93283: Improve error message for f-string with invalid conversion character (GH-93349) Message-ID: https://github.com/python/cpython/commit/07df8d5b2c715c9aa770c47986d59e272bf049f0 commit: 07df8d5b2c715c9aa770c47986d59e272bf049f0 branch: main author: Serhiy Storchaka committer: serhiy-storchaka date: 2022-05-31T20:38:29+03:00 summary: gh-93283: Improve error message for f-string with invalid conversion character (GH-93349) files: A Misc/NEWS.d/next/Core and Builtins/2022-05-30-14-50-03.gh-issue-93283.XDO2ZQ.rst M Lib/test/test_fstring.py M Parser/string_parser.c diff --git a/Lib/test/test_fstring.py b/Lib/test/test_fstring.py index 0c3372f033551..e8bf420d699ed 100644 --- a/Lib/test/test_fstring.py +++ b/Lib/test/test_fstring.py @@ -590,7 +590,9 @@ def test_format_specifier_expressions(self): self.assertEqual(f'{-10:{"-"}#{1}0{"x"}}', ' -0xa') self.assertEqual(f'{10:#{3 != {4:5} and width}x}', ' 0xa') - self.assertAllRaise(SyntaxError, "f-string: expecting '}'", + self.assertAllRaise(SyntaxError, + """f-string: invalid conversion character 'r{"': """ + """expected 's', 'r', or 'a'""", ["""f'{"s"!r{":10"}}'""", # This looks like a nested format spec. @@ -1012,19 +1014,28 @@ def test_conversions(self): # Not a conversion, but show that ! is allowed in a format spec. self.assertEqual(f'{3.14:!<10.10}', '3.14!!!!!!') - self.assertAllRaise(SyntaxError, 'f-string: invalid conversion character', - ["f'{3!g}'", - "f'{3!A}'", - "f'{3!3}'", - "f'{3!G}'", - "f'{3!!}'", + self.assertAllRaise(SyntaxError, "f-string: expecting '}'", + ["f'{3!'", + "f'{3!s'", + "f'{3!g'", + ]) + + self.assertAllRaise(SyntaxError, 'f-string: missed conversion character', + ["f'{3!}'", + "f'{3!:'", "f'{3!:}'", - "f'{3! s}'", # no space before conversion char ]) - self.assertAllRaise(SyntaxError, "f-string: expecting '}'", - ["f'{x!s{y}}'", - "f'{3!ss}'", + for conv in 'g', 'A', '3', 'G', '!', ' s', 's ', ' s ', '?', '?', '?': + self.assertAllRaise(SyntaxError, + "f-string: invalid conversion character %r: " + "expected 's', 'r', or 'a'" % conv, + ["f'{3!" + conv + "}'"]) + + self.assertAllRaise(SyntaxError, + "f-string: invalid conversion character 'ss': " + "expected 's', 'r', or 'a'", + ["f'{3!ss}'", "f'{3!ss:}'", "f'{3!ss:s}'", ]) diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-30-14-50-03.gh-issue-93283.XDO2ZQ.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-30-14-50-03.gh-issue-93283.XDO2ZQ.rst new file mode 100644 index 0000000000000..550e86988b25a --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-05-30-14-50-03.gh-issue-93283.XDO2ZQ.rst @@ -0,0 +1,2 @@ +Improve error message for invalid syntax of conversion character in f-string +expressions. diff --git a/Parser/string_parser.c b/Parser/string_parser.c index 9c12d8ca101d0..c56ed20ad4cfc 100644 --- a/Parser/string_parser.c +++ b/Parser/string_parser.c @@ -767,27 +767,43 @@ fstring_find_expr(Parser *p, const char **str, const char *end, int raw, int rec /* Check for a conversion char, if present. */ if (**str == '!') { *str += 1; - if (*str >= end) { - goto unexpected_end_of_string; + const char *conv_start = *str; + while (1) { + if (*str >= end) { + goto unexpected_end_of_string; + } + if (**str == '}' || **str == ':') { + break; + } + *str += 1; + } + if (*str == conv_start) { + RAISE_SYNTAX_ERROR( + "f-string: missed conversion character"); + goto error; } - conversion = (unsigned char)**str; - *str += 1; - + conversion = (unsigned char)*conv_start; /* Validate the conversion. */ - if (!(conversion == 's' || conversion == 'r' || conversion == 'a')) { - RAISE_SYNTAX_ERROR( - "f-string: invalid conversion character: " - "expected 's', 'r', or 'a'"); + if ((*str != conv_start + 1) || + !(conversion == 's' || conversion == 'r' || conversion == 'a')) + { + PyObject *conv_obj = PyUnicode_FromStringAndSize(conv_start, + *str-conv_start); + if (conv_obj) { + RAISE_SYNTAX_ERROR( + "f-string: invalid conversion character %R: " + "expected 's', 'r', or 'a'", + conv_obj); + Py_DECREF(conv_obj); + } goto error; } } /* Check for the format spec, if present. */ - if (*str >= end) { - goto unexpected_end_of_string; - } + assert(*str < end); if (**str == ':') { *str += 1; if (*str >= end) { From webhook-mailer at python.org Tue May 31 13:46:45 2022 From: webhook-mailer at python.org (miss-islington) Date: Tue, 31 May 2022 17:46:45 -0000 Subject: [Python-checkins] Remove VOC reference (93333) Message-ID: https://github.com/python/cpython/commit/3a627014527fa5c7289b1c83c5f0607c56df660b commit: 3a627014527fa5c7289b1c83c5f0607c56df660b branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-31T10:46:37-07:00 summary: Remove VOC reference (93333) VOC has been archived by the BeeWare project, and they are instead embedding CPython, rather than transpiling to Java bytecode. (cherry picked from commit bb900712a5511ba82ef64105fe28d2a6886a8fed) Co-authored-by: Carl Bordum Hansen files: M Doc/faq/design.rst diff --git a/Doc/faq/design.rst b/Doc/faq/design.rst index ff83a1b8134b7..a624fdb07a17d 100644 --- a/Doc/faq/design.rst +++ b/Doc/faq/design.rst @@ -324,8 +324,7 @@ Can Python be compiled to machine code, C or some other language? `Cython `_ compiles a modified version of Python with optional annotations into C extensions. `Nuitka `_ is an up-and-coming compiler of Python into C++ code, aiming to support the full -Python language. For compiling to Java you can consider -`VOC `_. +Python language. How does Python manage memory? From webhook-mailer at python.org Tue May 31 13:49:20 2022 From: webhook-mailer at python.org (miss-islington) Date: Tue, 31 May 2022 17:49:20 -0000 Subject: [Python-checkins] Remove VOC reference (93333) Message-ID: https://github.com/python/cpython/commit/694455d5eddaee6b8a0a1e47fc0de56c02a489fe commit: 694455d5eddaee6b8a0a1e47fc0de56c02a489fe branch: 3.10 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-31T10:49:14-07:00 summary: Remove VOC reference (93333) VOC has been archived by the BeeWare project, and they are instead embedding CPython, rather than transpiling to Java bytecode. (cherry picked from commit bb900712a5511ba82ef64105fe28d2a6886a8fed) Co-authored-by: Carl Bordum Hansen files: M Doc/faq/design.rst diff --git a/Doc/faq/design.rst b/Doc/faq/design.rst index ff83a1b8134b7..a624fdb07a17d 100644 --- a/Doc/faq/design.rst +++ b/Doc/faq/design.rst @@ -324,8 +324,7 @@ Can Python be compiled to machine code, C or some other language? `Cython `_ compiles a modified version of Python with optional annotations into C extensions. `Nuitka `_ is an up-and-coming compiler of Python into C++ code, aiming to support the full -Python language. For compiling to Java you can consider -`VOC `_. +Python language. How does Python manage memory? From webhook-mailer at python.org Tue May 31 15:23:59 2022 From: webhook-mailer at python.org (tiran) Date: Tue, 31 May 2022 19:23:59 -0000 Subject: [Python-checkins] gh-69093: Fix Setup.local.in rule for _sqlite3 (GH-93380) Message-ID: https://github.com/python/cpython/commit/8a5e3c2ec6254b2ce06d17545f58a6719e0c8fdb commit: 8a5e3c2ec6254b2ce06d17545f58a6719e0c8fdb branch: main author: Christian Heimes committer: tiran date: 2022-05-31T21:23:49+02:00 summary: gh-69093: Fix Setup.local.in rule for _sqlite3 (GH-93380) files: A Misc/NEWS.d/next/Build/2022-05-31-18-04-58.gh-issue-69093.6lSa0C.rst M Modules/Setup.stdlib.in diff --git a/Misc/NEWS.d/next/Build/2022-05-31-18-04-58.gh-issue-69093.6lSa0C.rst b/Misc/NEWS.d/next/Build/2022-05-31-18-04-58.gh-issue-69093.6lSa0C.rst new file mode 100644 index 0000000000000..b061d6c2186c1 --- /dev/null +++ b/Misc/NEWS.d/next/Build/2022-05-31-18-04-58.gh-issue-69093.6lSa0C.rst @@ -0,0 +1 @@ +Fix ``Modules/Setup.stdlib.in`` rule for ``_sqlite3`` extension. diff --git a/Modules/Setup.stdlib.in b/Modules/Setup.stdlib.in index 22c0b147c1b89..2730030a15650 100644 --- a/Modules/Setup.stdlib.in +++ b/Modules/Setup.stdlib.in @@ -143,7 +143,7 @@ # needs -lncurses and -lpanel #@MODULE__CURSES_PANEL_TRUE at _curses_panel _curses_panel.c - at MODULE__SQLITE3_TRUE@_sqlite3 _sqlite/connection.c _sqlite/cursor.c _sqlite/microprotocols.c _sqlite/module.c _sqlite/prepare_protocol.c _sqlite/row.c _sqlite/statement.c _sqlite/util.c + at MODULE__SQLITE3_TRUE@_sqlite3 _sqlite/blob.c _sqlite/connection.c _sqlite/cursor.c _sqlite/microprotocols.c _sqlite/module.c _sqlite/prepare_protocol.c _sqlite/row.c _sqlite/statement.c _sqlite/util.c # needs -lssl and -lcrypt @MODULE__SSL_TRUE at _ssl _ssl.c From webhook-mailer at python.org Tue May 31 15:53:43 2022 From: webhook-mailer at python.org (miss-islington) Date: Tue, 31 May 2022 19:53:43 -0000 Subject: [Python-checkins] gh-69093: Fix Setup.local.in rule for _sqlite3 (GH-93380) Message-ID: https://github.com/python/cpython/commit/29bfabe9709d4439cacb0806ba0e9f1dfd688157 commit: 29bfabe9709d4439cacb0806ba0e9f1dfd688157 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-31T12:53:27-07:00 summary: gh-69093: Fix Setup.local.in rule for _sqlite3 (GH-93380) (cherry picked from commit 8a5e3c2ec6254b2ce06d17545f58a6719e0c8fdb) Co-authored-by: Christian Heimes files: A Misc/NEWS.d/next/Build/2022-05-31-18-04-58.gh-issue-69093.6lSa0C.rst M Modules/Setup.stdlib.in diff --git a/Misc/NEWS.d/next/Build/2022-05-31-18-04-58.gh-issue-69093.6lSa0C.rst b/Misc/NEWS.d/next/Build/2022-05-31-18-04-58.gh-issue-69093.6lSa0C.rst new file mode 100644 index 0000000000000..b061d6c2186c1 --- /dev/null +++ b/Misc/NEWS.d/next/Build/2022-05-31-18-04-58.gh-issue-69093.6lSa0C.rst @@ -0,0 +1 @@ +Fix ``Modules/Setup.stdlib.in`` rule for ``_sqlite3`` extension. diff --git a/Modules/Setup.stdlib.in b/Modules/Setup.stdlib.in index 22c0b147c1b89..2730030a15650 100644 --- a/Modules/Setup.stdlib.in +++ b/Modules/Setup.stdlib.in @@ -143,7 +143,7 @@ # needs -lncurses and -lpanel #@MODULE__CURSES_PANEL_TRUE at _curses_panel _curses_panel.c - at MODULE__SQLITE3_TRUE@_sqlite3 _sqlite/connection.c _sqlite/cursor.c _sqlite/microprotocols.c _sqlite/module.c _sqlite/prepare_protocol.c _sqlite/row.c _sqlite/statement.c _sqlite/util.c + at MODULE__SQLITE3_TRUE@_sqlite3 _sqlite/blob.c _sqlite/connection.c _sqlite/cursor.c _sqlite/microprotocols.c _sqlite/module.c _sqlite/prepare_protocol.c _sqlite/row.c _sqlite/statement.c _sqlite/util.c # needs -lssl and -lcrypt @MODULE__SSL_TRUE at _ssl _ssl.c From webhook-mailer at python.org Tue May 31 16:32:40 2022 From: webhook-mailer at python.org (sweeneyde) Date: Tue, 31 May 2022 20:32:40 -0000 Subject: [Python-checkins] gh-93143: Avoid NULL check in LOAD_FAST based on analysis in the compiler (GH-93144) Message-ID: https://github.com/python/cpython/commit/f425f3bb27e826d25aac05139360cc6aa279126e commit: f425f3bb27e826d25aac05139360cc6aa279126e branch: main author: Dennis Sweeney <36520290+sweeneyde at users.noreply.github.com> committer: sweeneyde <36520290+sweeneyde at users.noreply.github.com> date: 2022-05-31T16:32:30-04:00 summary: gh-93143: Avoid NULL check in LOAD_FAST based on analysis in the compiler (GH-93144) files: A Misc/NEWS.d/next/Core and Builtins/2022-05-23-18-36-07.gh-issue-93143.X1Yqxm.rst M Include/internal/pycore_opcode.h M Include/opcode.h M Lib/importlib/_bootstrap_external.py M Lib/opcode.py M Lib/test/test_dis.py M Lib/test/test_peepholer.py M Objects/frameobject.c M Python/ceval.c M Python/compile.c M Python/opcode_targets.h diff --git a/Include/internal/pycore_opcode.h b/Include/internal/pycore_opcode.h index c693fe3c5eca6..e5d948dd696a2 100644 --- a/Include/internal/pycore_opcode.h +++ b/Include/internal/pycore_opcode.h @@ -158,6 +158,7 @@ const uint8_t _PyOpcode_Deopt[256] = { [LOAD_CONST__LOAD_FAST] = LOAD_CONST, [LOAD_DEREF] = LOAD_DEREF, [LOAD_FAST] = LOAD_FAST, + [LOAD_FAST_CHECK] = LOAD_FAST_CHECK, [LOAD_FAST__LOAD_CONST] = LOAD_FAST, [LOAD_FAST__LOAD_FAST] = LOAD_FAST, [LOAD_GLOBAL] = LOAD_GLOBAL, @@ -340,6 +341,7 @@ const uint8_t _PyOpcode_Original[256] = { [LOAD_CONST__LOAD_FAST] = LOAD_CONST, [LOAD_DEREF] = LOAD_DEREF, [LOAD_FAST] = LOAD_FAST, + [LOAD_FAST_CHECK] = LOAD_FAST_CHECK, [LOAD_FAST__LOAD_CONST] = LOAD_FAST, [LOAD_FAST__LOAD_FAST] = LOAD_FAST, [LOAD_GLOBAL] = LOAD_GLOBAL, @@ -547,7 +549,7 @@ static const char *const _PyOpcode_OpName[256] = { [LOAD_FAST] = "LOAD_FAST", [STORE_FAST] = "STORE_FAST", [DELETE_FAST] = "DELETE_FAST", - [LOAD_METHOD_WITH_VALUES] = "LOAD_METHOD_WITH_VALUES", + [LOAD_FAST_CHECK] = "LOAD_FAST_CHECK", [POP_JUMP_FORWARD_IF_NOT_NONE] = "POP_JUMP_FORWARD_IF_NOT_NONE", [POP_JUMP_FORWARD_IF_NONE] = "POP_JUMP_FORWARD_IF_NONE", [RAISE_VARARGS] = "RAISE_VARARGS", @@ -561,9 +563,9 @@ static const char *const _PyOpcode_OpName[256] = { [STORE_DEREF] = "STORE_DEREF", [DELETE_DEREF] = "DELETE_DEREF", [JUMP_BACKWARD] = "JUMP_BACKWARD", - [RESUME_QUICK] = "RESUME_QUICK", + [LOAD_METHOD_WITH_VALUES] = "LOAD_METHOD_WITH_VALUES", [CALL_FUNCTION_EX] = "CALL_FUNCTION_EX", - [STORE_ATTR_ADAPTIVE] = "STORE_ATTR_ADAPTIVE", + [RESUME_QUICK] = "RESUME_QUICK", [EXTENDED_ARG] = "EXTENDED_ARG", [LIST_APPEND] = "LIST_APPEND", [SET_ADD] = "SET_ADD", @@ -573,33 +575,33 @@ static const char *const _PyOpcode_OpName[256] = { [YIELD_VALUE] = "YIELD_VALUE", [RESUME] = "RESUME", [MATCH_CLASS] = "MATCH_CLASS", + [STORE_ATTR_ADAPTIVE] = "STORE_ATTR_ADAPTIVE", [STORE_ATTR_INSTANCE_VALUE] = "STORE_ATTR_INSTANCE_VALUE", - [STORE_ATTR_SLOT] = "STORE_ATTR_SLOT", [FORMAT_VALUE] = "FORMAT_VALUE", [BUILD_CONST_KEY_MAP] = "BUILD_CONST_KEY_MAP", [BUILD_STRING] = "BUILD_STRING", + [STORE_ATTR_SLOT] = "STORE_ATTR_SLOT", [STORE_ATTR_WITH_HINT] = "STORE_ATTR_WITH_HINT", - [STORE_FAST__LOAD_FAST] = "STORE_FAST__LOAD_FAST", [LOAD_METHOD] = "LOAD_METHOD", - [STORE_FAST__STORE_FAST] = "STORE_FAST__STORE_FAST", + [STORE_FAST__LOAD_FAST] = "STORE_FAST__LOAD_FAST", [LIST_EXTEND] = "LIST_EXTEND", [SET_UPDATE] = "SET_UPDATE", [DICT_MERGE] = "DICT_MERGE", [DICT_UPDATE] = "DICT_UPDATE", + [STORE_FAST__STORE_FAST] = "STORE_FAST__STORE_FAST", [STORE_SUBSCR_ADAPTIVE] = "STORE_SUBSCR_ADAPTIVE", [STORE_SUBSCR_DICT] = "STORE_SUBSCR_DICT", [STORE_SUBSCR_LIST_INT] = "STORE_SUBSCR_LIST_INT", [UNPACK_SEQUENCE_ADAPTIVE] = "UNPACK_SEQUENCE_ADAPTIVE", - [UNPACK_SEQUENCE_LIST] = "UNPACK_SEQUENCE_LIST", [CALL] = "CALL", [KW_NAMES] = "KW_NAMES", [POP_JUMP_BACKWARD_IF_NOT_NONE] = "POP_JUMP_BACKWARD_IF_NOT_NONE", [POP_JUMP_BACKWARD_IF_NONE] = "POP_JUMP_BACKWARD_IF_NONE", [POP_JUMP_BACKWARD_IF_FALSE] = "POP_JUMP_BACKWARD_IF_FALSE", [POP_JUMP_BACKWARD_IF_TRUE] = "POP_JUMP_BACKWARD_IF_TRUE", + [UNPACK_SEQUENCE_LIST] = "UNPACK_SEQUENCE_LIST", [UNPACK_SEQUENCE_TUPLE] = "UNPACK_SEQUENCE_TUPLE", [UNPACK_SEQUENCE_TWO_TUPLE] = "UNPACK_SEQUENCE_TWO_TUPLE", - [179] = "<179>", [180] = "<180>", [181] = "<181>", [182] = "<182>", @@ -680,7 +682,6 @@ static const char *const _PyOpcode_OpName[256] = { #endif #define EXTRA_CASES \ - case 179: \ case 180: \ case 181: \ case 182: \ diff --git a/Include/opcode.h b/Include/opcode.h index f76ca946be3ad..e7713013cd308 100644 --- a/Include/opcode.h +++ b/Include/opcode.h @@ -81,6 +81,7 @@ extern "C" { #define LOAD_FAST 124 #define STORE_FAST 125 #define DELETE_FAST 126 +#define LOAD_FAST_CHECK 127 #define POP_JUMP_FORWARD_IF_NOT_NONE 128 #define POP_JUMP_FORWARD_IF_NONE 129 #define RAISE_VARARGS 130 @@ -173,21 +174,21 @@ extern "C" { #define LOAD_METHOD_MODULE 86 #define LOAD_METHOD_NO_DICT 113 #define LOAD_METHOD_WITH_DICT 121 -#define LOAD_METHOD_WITH_VALUES 127 -#define RESUME_QUICK 141 -#define STORE_ATTR_ADAPTIVE 143 -#define STORE_ATTR_INSTANCE_VALUE 153 -#define STORE_ATTR_SLOT 154 -#define STORE_ATTR_WITH_HINT 158 -#define STORE_FAST__LOAD_FAST 159 -#define STORE_FAST__STORE_FAST 161 -#define STORE_SUBSCR_ADAPTIVE 166 -#define STORE_SUBSCR_DICT 167 -#define STORE_SUBSCR_LIST_INT 168 -#define UNPACK_SEQUENCE_ADAPTIVE 169 -#define UNPACK_SEQUENCE_LIST 170 -#define UNPACK_SEQUENCE_TUPLE 177 -#define UNPACK_SEQUENCE_TWO_TUPLE 178 +#define LOAD_METHOD_WITH_VALUES 141 +#define RESUME_QUICK 143 +#define STORE_ATTR_ADAPTIVE 153 +#define STORE_ATTR_INSTANCE_VALUE 154 +#define STORE_ATTR_SLOT 158 +#define STORE_ATTR_WITH_HINT 159 +#define STORE_FAST__LOAD_FAST 161 +#define STORE_FAST__STORE_FAST 166 +#define STORE_SUBSCR_ADAPTIVE 167 +#define STORE_SUBSCR_DICT 168 +#define STORE_SUBSCR_LIST_INT 169 +#define UNPACK_SEQUENCE_ADAPTIVE 170 +#define UNPACK_SEQUENCE_LIST 177 +#define UNPACK_SEQUENCE_TUPLE 178 +#define UNPACK_SEQUENCE_TWO_TUPLE 179 #define DO_TRACING 255 #define HAS_CONST(op) (false\ diff --git a/Lib/importlib/_bootstrap_external.py b/Lib/importlib/_bootstrap_external.py index eac371fdefc78..894848a15d97d 100644 --- a/Lib/importlib/_bootstrap_external.py +++ b/Lib/importlib/_bootstrap_external.py @@ -406,6 +406,7 @@ def _write_atomic(path, data, mode=0o666): # Python 3.12a1 3500 (Remove PRECALL opcode) # Python 3.12a1 3501 (YIELD_VALUE oparg == stack_depth) +# Python 3.12a1 3502 (LOAD_FAST_CHECK, no NULL-check in LOAD_FAST) # Python 3.13 will start with 3550 @@ -419,7 +420,7 @@ def _write_atomic(path, data, mode=0o666): # Whenever MAGIC_NUMBER is changed, the ranges in the magic_values array # in PC/launcher.c must also be updated. -MAGIC_NUMBER = (3501).to_bytes(2, 'little') + b'\r\n' +MAGIC_NUMBER = (3502).to_bytes(2, 'little') + b'\r\n' _RAW_MAGIC_NUMBER = int.from_bytes(MAGIC_NUMBER, 'little') # For import.c diff --git a/Lib/opcode.py b/Lib/opcode.py index 573e461666d4d..5cbb5c57521ae 100644 --- a/Lib/opcode.py +++ b/Lib/opcode.py @@ -139,12 +139,14 @@ def jabs_op(name, op): def_op('COPY', 120) def_op('BINARY_OP', 122) jrel_op('SEND', 123) # Number of bytes to skip -def_op('LOAD_FAST', 124) # Local variable number +def_op('LOAD_FAST', 124) # Local variable number, no null check haslocal.append(124) def_op('STORE_FAST', 125) # Local variable number haslocal.append(125) def_op('DELETE_FAST', 126) # Local variable number haslocal.append(126) +def_op('LOAD_FAST_CHECK', 127) # Local variable number +haslocal.append(127) jrel_op('POP_JUMP_FORWARD_IF_NOT_NONE', 128) jrel_op('POP_JUMP_FORWARD_IF_NONE', 129) def_op('RAISE_VARARGS', 130) # Number of raise arguments (1, 2, or 3) diff --git a/Lib/test/test_dis.py b/Lib/test/test_dis.py index c5b80b72f8395..5aca019e74596 100644 --- a/Lib/test/test_dis.py +++ b/Lib/test/test_dis.py @@ -360,7 +360,7 @@ def bug42562(): --> BINARY_OP 11 (/) POP_TOP -%3d LOAD_FAST 1 (tb) +%3d LOAD_FAST_CHECK 1 (tb) RETURN_VALUE >> PUSH_EXC_INFO @@ -1399,7 +1399,7 @@ def _prepare_test_cases(): Instruction(opname='LOAD_CONST', opcode=100, arg=4, argval='I can haz else clause?', argrepr="'I can haz else clause?'", offset=100, starts_line=None, is_jump_target=False, positions=None), Instruction(opname='CALL', opcode=171, arg=1, argval=1, argrepr='', offset=102, starts_line=None, is_jump_target=False, positions=None), Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=112, starts_line=None, is_jump_target=False, positions=None), - Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=114, starts_line=11, is_jump_target=True, positions=None), + Instruction(opname='LOAD_FAST_CHECK', opcode=127, arg=0, argval='i', argrepr='i', offset=114, starts_line=11, is_jump_target=True, positions=None), Instruction(opname='POP_JUMP_FORWARD_IF_FALSE', opcode=114, arg=34, argval=186, argrepr='to 186', offset=116, starts_line=None, is_jump_target=False, positions=None), Instruction(opname='LOAD_GLOBAL', opcode=116, arg=3, argval='print', argrepr='NULL + print', offset=118, starts_line=12, is_jump_target=True, positions=None), Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=130, starts_line=None, is_jump_target=False, positions=None), diff --git a/Lib/test/test_peepholer.py b/Lib/test/test_peepholer.py index dd993851bee92..2c3b1ab65a8f9 100644 --- a/Lib/test/test_peepholer.py +++ b/Lib/test/test_peepholer.py @@ -1,5 +1,6 @@ import dis from itertools import combinations, product +import sys import textwrap import unittest @@ -682,5 +683,184 @@ def test_bpo_45773_pop_jump_if_false(self): compile("while True or not spam: pass", "", "exec") +class TestMarkingVariablesAsUnKnown(BytecodeTestCase): + + def setUp(self): + self.addCleanup(sys.settrace, sys.gettrace()) + sys.settrace(None) + + def test_load_fast_known_simple(self): + def f(): + x = 1 + y = x + x + self.assertInBytecode(f, 'LOAD_FAST') + + def test_load_fast_unknown_simple(self): + def f(): + if condition(): + x = 1 + print(x) + self.assertInBytecode(f, 'LOAD_FAST_CHECK') + self.assertNotInBytecode(f, 'LOAD_FAST') + + def test_load_fast_unknown_because_del(self): + def f(): + x = 1 + del x + print(x) + self.assertInBytecode(f, 'LOAD_FAST_CHECK') + self.assertNotInBytecode(f, 'LOAD_FAST') + + def test_load_fast_known_because_parameter(self): + def f1(x): + print(x) + self.assertInBytecode(f1, 'LOAD_FAST') + self.assertNotInBytecode(f1, 'LOAD_FAST_CHECK') + + def f2(*, x): + print(x) + self.assertInBytecode(f2, 'LOAD_FAST') + self.assertNotInBytecode(f2, 'LOAD_FAST_CHECK') + + def f3(*args): + print(args) + self.assertInBytecode(f3, 'LOAD_FAST') + self.assertNotInBytecode(f3, 'LOAD_FAST_CHECK') + + def f4(**kwargs): + print(kwargs) + self.assertInBytecode(f4, 'LOAD_FAST') + self.assertNotInBytecode(f4, 'LOAD_FAST_CHECK') + + def f5(x=0): + print(x) + self.assertInBytecode(f5, 'LOAD_FAST') + self.assertNotInBytecode(f5, 'LOAD_FAST_CHECK') + + def test_load_fast_known_because_already_loaded(self): + def f(): + if condition(): + x = 1 + print(x) + print(x) + self.assertInBytecode(f, 'LOAD_FAST_CHECK') + self.assertInBytecode(f, 'LOAD_FAST') + + def test_load_fast_known_multiple_branches(self): + def f(): + if condition(): + x = 1 + else: + x = 2 + print(x) + self.assertInBytecode(f, 'LOAD_FAST') + self.assertNotInBytecode(f, 'LOAD_FAST_CHECK') + + def test_load_fast_unknown_after_error(self): + def f(): + try: + res = 1 / 0 + except ZeroDivisionError: + pass + return res + # LOAD_FAST (known) still occurs in the no-exception branch. + # Assert that it doesn't occur in the LOAD_FAST_CHECK branch. + self.assertInBytecode(f, 'LOAD_FAST_CHECK') + + def test_load_fast_unknown_after_error_2(self): + def f(): + try: + 1 / 0 + except: + print(a, b, c, d, e, f, g) + a = b = c = d = e = f = g = 1 + self.assertInBytecode(f, 'LOAD_FAST_CHECK') + self.assertNotInBytecode(f, 'LOAD_FAST') + + def test_setting_lineno_adds_check(self): + code = textwrap.dedent("""\ + def f(): + x = 2 + L = 3 + L = 4 + for i in range(55): + x + 6 + del x + L = 8 + L = 9 + L = 10 + """) + ns = {} + exec(code, ns) + f = ns['f'] + self.assertInBytecode(f, "LOAD_FAST") + def trace(frame, event, arg): + if event == 'line' and frame.f_lineno == 9: + frame.f_lineno = 2 + sys.settrace(None) + return None + return trace + sys.settrace(trace) + f() + self.assertNotInBytecode(f, "LOAD_FAST") + + def make_function_with_no_checks(self): + code = textwrap.dedent("""\ + def f(): + x = 2 + L = 3 + L = 4 + L = 5 + if not L: + x + 7 + y = 2 + """) + ns = {} + exec(code, ns) + f = ns['f'] + self.assertInBytecode(f, "LOAD_FAST") + self.assertNotInBytecode(f, "LOAD_FAST_CHECK") + return f + + def test_deleting_local_adds_check(self): + f = self.make_function_with_no_checks() + def trace(frame, event, arg): + if event == 'line' and frame.f_lineno == 4: + del frame.f_locals["x"] + sys.settrace(None) + return None + return trace + sys.settrace(trace) + f() + self.assertNotInBytecode(f, "LOAD_FAST") + self.assertInBytecode(f, "LOAD_FAST_CHECK") + + def test_modifying_local_does_not_add_check(self): + f = self.make_function_with_no_checks() + def trace(frame, event, arg): + if event == 'line' and frame.f_lineno == 4: + frame.f_locals["x"] = 42 + sys.settrace(None) + return None + return trace + sys.settrace(trace) + f() + self.assertInBytecode(f, "LOAD_FAST") + self.assertNotInBytecode(f, "LOAD_FAST_CHECK") + + def test_initializing_local_does_not_add_check(self): + f = self.make_function_with_no_checks() + def trace(frame, event, arg): + if event == 'line' and frame.f_lineno == 4: + frame.f_locals["y"] = 42 + sys.settrace(None) + return None + return trace + sys.settrace(trace) + f() + self.assertInBytecode(f, "LOAD_FAST") + self.assertNotInBytecode(f, "LOAD_FAST_CHECK") + + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-23-18-36-07.gh-issue-93143.X1Yqxm.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-23-18-36-07.gh-issue-93143.X1Yqxm.rst new file mode 100644 index 0000000000000..03994bcfdb56f --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-05-23-18-36-07.gh-issue-93143.X1Yqxm.rst @@ -0,0 +1 @@ +Avoid ``NULL`` checks for uninitialized local variables by determining at compile time which variables must be initialized. diff --git a/Objects/frameobject.c b/Objects/frameobject.c index 60f0f2f4edd38..a448ba3a6c6f9 100644 --- a/Objects/frameobject.c +++ b/Objects/frameobject.c @@ -455,6 +455,26 @@ _PyFrame_GetState(PyFrameObject *frame) Py_UNREACHABLE(); } +static void +add_load_fast_null_checks(PyCodeObject *co) +{ + _Py_CODEUNIT *instructions = _PyCode_CODE(co); + for (Py_ssize_t i = 0; i < Py_SIZE(co); i++) { + switch (_Py_OPCODE(instructions[i])) { + case LOAD_FAST: + case LOAD_FAST__LOAD_FAST: + case LOAD_FAST__LOAD_CONST: + _Py_SET_OPCODE(instructions[i], LOAD_FAST_CHECK); + break; + case LOAD_CONST__LOAD_FAST: + _Py_SET_OPCODE(instructions[i], LOAD_CONST); + break; + case STORE_FAST__LOAD_FAST: + _Py_SET_OPCODE(instructions[i], STORE_FAST); + break; + } + } +} /* Setter for f_lineno - you can set f_lineno from within a trace function in * order to jump to a given line of code, subject to some restrictions. Most @@ -545,6 +565,8 @@ frame_setlineno(PyFrameObject *f, PyObject* p_new_lineno, void *Py_UNUSED(ignore return -1; } + add_load_fast_null_checks(f->f_frame->f_code); + /* PyCode_NewWithPosOnlyArgs limits co_code to be under INT_MAX so this * should never overflow. */ int len = (int)Py_SIZE(f->f_frame->f_code); @@ -1047,6 +1069,7 @@ _PyFrame_LocalsToFast(_PyInterpreterFrame *frame, int clear) } fast = _PyFrame_GetLocalsArray(frame); co = frame->f_code; + bool added_null_checks = false; PyErr_Fetch(&error_type, &error_value, &error_traceback); for (int i = 0; i < co->co_nlocalsplus; i++) { @@ -1066,6 +1089,10 @@ _PyFrame_LocalsToFast(_PyInterpreterFrame *frame, int clear) } } PyObject *oldvalue = fast[i]; + if (!added_null_checks && oldvalue != NULL && value == NULL) { + add_load_fast_null_checks(co); + added_null_checks = true; + } PyObject *cell = NULL; if (kind == CO_FAST_FREE) { // The cell was set when the frame was created from diff --git a/Python/ceval.c b/Python/ceval.c index 36546929e19c4..ec86c70673ca9 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -1813,7 +1813,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int DISPATCH(); } - TARGET(LOAD_FAST) { + TARGET(LOAD_FAST_CHECK) { PyObject *value = GETLOCAL(oparg); if (value == NULL) { goto unbound_local_error; @@ -1823,6 +1823,14 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int DISPATCH(); } + TARGET(LOAD_FAST) { + PyObject *value = GETLOCAL(oparg); + assert(value != NULL); + Py_INCREF(value); + PUSH(value); + DISPATCH(); + } + TARGET(LOAD_CONST) { PREDICTED(LOAD_CONST); PyObject *value = GETITEM(consts, oparg); @@ -1840,17 +1848,13 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int TARGET(LOAD_FAST__LOAD_FAST) { PyObject *value = GETLOCAL(oparg); - if (value == NULL) { - goto unbound_local_error; - } + assert(value != NULL); NEXTOPARG(); next_instr++; Py_INCREF(value); PUSH(value); value = GETLOCAL(oparg); - if (value == NULL) { - goto unbound_local_error; - } + assert(value != NULL); Py_INCREF(value); PUSH(value); NOTRACE_DISPATCH(); @@ -1858,9 +1862,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int TARGET(LOAD_FAST__LOAD_CONST) { PyObject *value = GETLOCAL(oparg); - if (value == NULL) { - goto unbound_local_error; - } + assert(value != NULL); NEXTOPARG(); next_instr++; Py_INCREF(value); @@ -1877,9 +1879,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int NEXTOPARG(); next_instr++; value = GETLOCAL(oparg); - if (value == NULL) { - goto unbound_local_error; - } + assert(value != NULL); Py_INCREF(value); PUSH(value); NOTRACE_DISPATCH(); @@ -1902,9 +1902,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int Py_INCREF(value); PUSH(value); value = GETLOCAL(oparg); - if (value == NULL) { - goto unbound_local_error; - } + assert(value != NULL); Py_INCREF(value); PUSH(value); NOTRACE_DISPATCH(); diff --git a/Python/compile.c b/Python/compile.c index 0920cebfe7c13..a6788b732831f 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -1109,6 +1109,7 @@ stack_effect(int opcode, int oparg, int jump) return 1; case LOAD_FAST: + case LOAD_FAST_CHECK: return 1; case STORE_FAST: return -1; @@ -7746,6 +7747,109 @@ assemble_jump_offsets(struct assembler *a, struct compiler *c) } while (extended_arg_recompile); } + +// Ensure each basicblock is only put onto the stack once. +#define MAYBE_PUSH(B) do { \ + if ((B)->b_visited == 0) { \ + *(*stack_top)++ = (B); \ + (B)->b_visited = 1; \ + } \ + } while (0) + +static void +scan_block_for_local(int target, basicblock *b, bool unsafe_to_start, + basicblock ***stack_top) +{ + bool unsafe = unsafe_to_start; + for (int i = 0; i < b->b_iused; i++) { + struct instr *instr = &b->b_instr[i]; + assert(instr->i_opcode != EXTENDED_ARG); + assert(instr->i_opcode != EXTENDED_ARG_QUICK); + assert(instr->i_opcode != LOAD_FAST__LOAD_FAST); + assert(instr->i_opcode != STORE_FAST__LOAD_FAST); + assert(instr->i_opcode != LOAD_CONST__LOAD_FAST); + assert(instr->i_opcode != STORE_FAST__STORE_FAST); + assert(instr->i_opcode != LOAD_FAST__LOAD_CONST); + if (unsafe && instr->i_except != NULL) { + MAYBE_PUSH(instr->i_except); + } + if (instr->i_oparg != target) { + continue; + } + switch (instr->i_opcode) { + case LOAD_FAST_CHECK: + // if this doesn't raise, then var is defined + unsafe = false; + break; + case LOAD_FAST: + if (unsafe) { + instr->i_opcode = LOAD_FAST_CHECK; + } + unsafe = false; + break; + case STORE_FAST: + unsafe = false; + break; + case DELETE_FAST: + unsafe = true; + break; + } + } + if (unsafe) { + // unsafe at end of this block, + // so unsafe at start of next blocks + if (b->b_next && !b->b_nofallthrough) { + MAYBE_PUSH(b->b_next); + } + if (b->b_iused > 0) { + struct instr *last = &b->b_instr[b->b_iused-1]; + if (is_jump(last)) { + assert(last->i_target != NULL); + MAYBE_PUSH(last->i_target); + } + } + } +} +#undef MAYBE_PUSH + +static int +add_checks_for_loads_of_unknown_variables(struct assembler *a, + struct compiler *c) +{ + basicblock **stack = make_cfg_traversal_stack(a->a_entry); + if (stack == NULL) { + return -1; + } + Py_ssize_t nparams = PyList_GET_SIZE(c->u->u_ste->ste_varnames); + int nlocals = (int)PyDict_GET_SIZE(c->u->u_varnames); + for (int target = 0; target < nlocals; target++) { + for (basicblock *b = a->a_entry; b != NULL; b = b->b_next) { + b->b_visited = 0; + } + basicblock **stack_top = stack; + + // First pass: find the relevant DFS starting points: + // the places where "being uninitialized" originates, + // which are the entry block and any DELETE_FAST statements. + if (target >= nparams) { + // only non-parameter locals start out uninitialized. + *(stack_top++) = a->a_entry; + a->a_entry->b_visited = 1; + } + for (basicblock *b = a->a_entry; b != NULL; b = b->b_next) { + scan_block_for_local(target, b, false, &stack_top); + } + + // Second pass: Depth-first search to propagate uncertainty + while (stack_top > stack) { + basicblock *b = *--stack_top; + scan_block_for_local(target, b, true, &stack_top); + } + } + PyMem_Free(stack); + return 0; +} + static PyObject * dict_keys_inorder(PyObject *dict, Py_ssize_t offset) { @@ -8385,6 +8489,10 @@ assemble(struct compiler *c, int addNone) /* Order of basic blocks must have been determined by now */ normalize_jumps(&a); + if (add_checks_for_loads_of_unknown_variables(&a, c) < 0) { + goto error; + } + /* Can't modify the bytecode after computing jump offsets. */ assemble_jump_offsets(&a, c); diff --git a/Python/opcode_targets.h b/Python/opcode_targets.h index 71b7a76a01aa8..1009b3a93458e 100644 --- a/Python/opcode_targets.h +++ b/Python/opcode_targets.h @@ -126,7 +126,7 @@ static void *opcode_targets[256] = { &&TARGET_LOAD_FAST, &&TARGET_STORE_FAST, &&TARGET_DELETE_FAST, - &&TARGET_LOAD_METHOD_WITH_VALUES, + &&TARGET_LOAD_FAST_CHECK, &&TARGET_POP_JUMP_FORWARD_IF_NOT_NONE, &&TARGET_POP_JUMP_FORWARD_IF_NONE, &&TARGET_RAISE_VARARGS, @@ -140,9 +140,9 @@ static void *opcode_targets[256] = { &&TARGET_STORE_DEREF, &&TARGET_DELETE_DEREF, &&TARGET_JUMP_BACKWARD, - &&TARGET_RESUME_QUICK, + &&TARGET_LOAD_METHOD_WITH_VALUES, &&TARGET_CALL_FUNCTION_EX, - &&TARGET_STORE_ATTR_ADAPTIVE, + &&TARGET_RESUME_QUICK, &&TARGET_EXTENDED_ARG, &&TARGET_LIST_APPEND, &&TARGET_SET_ADD, @@ -152,30 +152,31 @@ static void *opcode_targets[256] = { &&TARGET_YIELD_VALUE, &&TARGET_RESUME, &&TARGET_MATCH_CLASS, + &&TARGET_STORE_ATTR_ADAPTIVE, &&TARGET_STORE_ATTR_INSTANCE_VALUE, - &&TARGET_STORE_ATTR_SLOT, &&TARGET_FORMAT_VALUE, &&TARGET_BUILD_CONST_KEY_MAP, &&TARGET_BUILD_STRING, + &&TARGET_STORE_ATTR_SLOT, &&TARGET_STORE_ATTR_WITH_HINT, - &&TARGET_STORE_FAST__LOAD_FAST, &&TARGET_LOAD_METHOD, - &&TARGET_STORE_FAST__STORE_FAST, + &&TARGET_STORE_FAST__LOAD_FAST, &&TARGET_LIST_EXTEND, &&TARGET_SET_UPDATE, &&TARGET_DICT_MERGE, &&TARGET_DICT_UPDATE, + &&TARGET_STORE_FAST__STORE_FAST, &&TARGET_STORE_SUBSCR_ADAPTIVE, &&TARGET_STORE_SUBSCR_DICT, &&TARGET_STORE_SUBSCR_LIST_INT, &&TARGET_UNPACK_SEQUENCE_ADAPTIVE, - &&TARGET_UNPACK_SEQUENCE_LIST, &&TARGET_CALL, &&TARGET_KW_NAMES, &&TARGET_POP_JUMP_BACKWARD_IF_NOT_NONE, &&TARGET_POP_JUMP_BACKWARD_IF_NONE, &&TARGET_POP_JUMP_BACKWARD_IF_FALSE, &&TARGET_POP_JUMP_BACKWARD_IF_TRUE, + &&TARGET_UNPACK_SEQUENCE_LIST, &&TARGET_UNPACK_SEQUENCE_TUPLE, &&TARGET_UNPACK_SEQUENCE_TWO_TUPLE, &&_unknown_opcode, @@ -253,6 +254,5 @@ static void *opcode_targets[256] = { &&_unknown_opcode, &&_unknown_opcode, &&_unknown_opcode, - &&_unknown_opcode, &&TARGET_DO_TRACING }; From webhook-mailer at python.org Tue May 31 17:47:01 2022 From: webhook-mailer at python.org (vsajip) Date: Tue, 31 May 2022 21:47:01 -0000 Subject: [Python-checkins] [doc] logging.rst - Change link to point directly to the Google Group. (GH-93390) Message-ID: https://github.com/python/cpython/commit/e6e81602f49a9bff51e2049c7bad60d1acb18d3f commit: e6e81602f49a9bff51e2049c7bad60d1acb18d3f branch: main author: Moshe Kaplan committer: vsajip date: 2022-05-31T22:46:52+01:00 summary: [doc] logging.rst - Change link to point directly to the Google Group. (GH-93390) files: M Doc/howto/logging.rst diff --git a/Doc/howto/logging.rst b/Doc/howto/logging.rst index 125bde2915227..cc4e278a7fe2e 100644 --- a/Doc/howto/logging.rst +++ b/Doc/howto/logging.rst @@ -336,7 +336,7 @@ favourite beverage and carry on. If your logging needs are simple, then use the above examples to incorporate logging into your own scripts, and if you run into problems or don't understand something, please post a question on the comp.lang.python Usenet -group (available at https://groups.google.com/forum/#!forum/comp.lang.python) and you +group (available at https://groups.google.com/g/comp.lang.python) and you should receive help before too long. Still here? You can carry on reading the next few sections, which provide a From webhook-mailer at python.org Tue May 31 17:52:11 2022 From: webhook-mailer at python.org (miss-islington) Date: Tue, 31 May 2022 21:52:11 -0000 Subject: [Python-checkins] gh-93391: fix typo in `array` docs (GH-93392) Message-ID: https://github.com/python/cpython/commit/fc694364cc6745eefba0afc3ea2c5283bbb64a3b commit: fc694364cc6745eefba0afc3ea2c5283bbb64a3b branch: main author: ynfle <23086821+ynfle at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-31T14:52:03-07:00 summary: gh-93391: fix typo in `array` docs (GH-93392) Fixes #93391 Automerge-Triggered-By: GH:rhettinger files: M Doc/library/array.rst diff --git a/Doc/library/array.rst b/Doc/library/array.rst index c7f137d15b4b8..975670cc81a20 100644 --- a/Doc/library/array.rst +++ b/Doc/library/array.rst @@ -52,7 +52,7 @@ Notes: .. versionchanged:: 3.9 ``array('u')`` now uses ``wchar_t`` as C type instead of deprecated - ``Py_UNICODE``. This change doesn't affect to its behavior because + ``Py_UNICODE``. This change doesn't affect its behavior because ``Py_UNICODE`` is alias of ``wchar_t`` since Python 3.3. .. deprecated-removed:: 3.3 4.0 From webhook-mailer at python.org Tue May 31 19:00:57 2022 From: webhook-mailer at python.org (pablogsal) Date: Tue, 31 May 2022 23:00:57 -0000 Subject: [Python-checkins] gh-92597: Ensure that AST nodes without explicit end positions can be compiled (GH-93359) Message-ID: https://github.com/python/cpython/commit/705eaec28f7bee530b1c1635ba385a49a1feaf32 commit: 705eaec28f7bee530b1c1635ba385a49a1feaf32 branch: main author: Pablo Galindo Salgado committer: pablogsal date: 2022-06-01T00:00:47+01:00 summary: gh-92597: Ensure that AST nodes without explicit end positions can be compiled (GH-93359) files: A Misc/NEWS.d/next/Core and Builtins/2022-05-30-19-00-38.gh-issue-93359.zXV3A0.rst M Lib/test/test_ast.py M Parser/asdl_c.py M Python/Python-ast.c diff --git a/Lib/test/test_ast.py b/Lib/test/test_ast.py index 896eb5bedd7f3..33df22cb35a9e 100644 --- a/Lib/test/test_ast.py +++ b/Lib/test/test_ast.py @@ -362,6 +362,14 @@ def test_invalid_position_information(self): with self.assertRaises(ValueError): compile(tree, '', 'exec') + def test_compilation_of_ast_nodes_with_default_end_position_values(self): + tree = ast.Module(body=[ + ast.Import(names=[ast.alias(name='builtins', lineno=1, col_offset=0)], lineno=1, col_offset=0), + ast.Import(names=[ast.alias(name='traceback', lineno=0, col_offset=0)], lineno=0, col_offset=1) + ], type_ignores=[]) + + # Check that compilation doesn't crash. Note: this may crash explicitly only on debug mode. + compile(tree, "", "exec") def test_slice(self): slc = ast.parse("x[::]").body[0].value.slice diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-30-19-00-38.gh-issue-93359.zXV3A0.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-30-19-00-38.gh-issue-93359.zXV3A0.rst new file mode 100644 index 0000000000000..36e5e52390d7b --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-05-30-19-00-38.gh-issue-93359.zXV3A0.rst @@ -0,0 +1,2 @@ +Ensure that custom :mod:`ast` nodes without explicit end positions can be +compiled. Patch by Pablo Galindo. diff --git a/Parser/asdl_c.py b/Parser/asdl_c.py index 3bfe320fe3b70..1101a3593dfe2 100755 --- a/Parser/asdl_c.py +++ b/Parser/asdl_c.py @@ -488,6 +488,12 @@ def visitProduct(self, prod, name): class Obj2ModVisitor(PickleVisitor): + + attribute_special_defaults = { + "end_lineno": "lineno", + "end_col_offset": "col_offset", + } + @contextmanager def recursive_call(self, node, level): self.emit('if (_Py_EnterRecursiveCall(" while traversing \'%s\' node")) {' % node, level, reflow=False) @@ -637,7 +643,13 @@ def visitField(self, field, name, sum=None, prod=None, depth=0): self.emit("if (tmp == NULL || tmp == Py_None) {", depth) self.emit("Py_CLEAR(tmp);", depth+1) if self.isNumeric(field): - self.emit("%s = 0;" % field.name, depth+1) + if field.name in self.attribute_special_defaults: + self.emit( + "%s = %s;" % (field.name, self.attribute_special_defaults[field.name]), + depth+1, + ) + else: + self.emit("%s = 0;" % field.name, depth+1) elif not self.isSimpleType(field): self.emit("%s = NULL;" % field.name, depth+1) else: diff --git a/Python/Python-ast.c b/Python/Python-ast.c index 3861eaf978a38..e52a72d43bcbd 100644 --- a/Python/Python-ast.c +++ b/Python/Python-ast.c @@ -5697,7 +5697,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* } if (tmp == NULL || tmp == Py_None) { Py_CLEAR(tmp); - end_lineno = 0; + end_lineno = lineno; } else { int res; @@ -5714,7 +5714,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* } if (tmp == NULL || tmp == Py_None) { Py_CLEAR(tmp); - end_col_offset = 0; + end_col_offset = col_offset; } else { int res; @@ -8114,7 +8114,7 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena* } if (tmp == NULL || tmp == Py_None) { Py_CLEAR(tmp); - end_lineno = 0; + end_lineno = lineno; } else { int res; @@ -8131,7 +8131,7 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena* } if (tmp == NULL || tmp == Py_None) { Py_CLEAR(tmp); - end_col_offset = 0; + end_col_offset = col_offset; } else { int res; @@ -10291,7 +10291,7 @@ obj2ast_excepthandler(struct ast_state *state, PyObject* obj, excepthandler_ty* } if (tmp == NULL || tmp == Py_None) { Py_CLEAR(tmp); - end_lineno = 0; + end_lineno = lineno; } else { int res; @@ -10308,7 +10308,7 @@ obj2ast_excepthandler(struct ast_state *state, PyObject* obj, excepthandler_ty* } if (tmp == NULL || tmp == Py_None) { Py_CLEAR(tmp); - end_col_offset = 0; + end_col_offset = col_offset; } else { int res; @@ -10755,7 +10755,7 @@ obj2ast_arg(struct ast_state *state, PyObject* obj, arg_ty* out, PyArena* arena) } if (tmp == NULL || tmp == Py_None) { Py_CLEAR(tmp); - end_lineno = 0; + end_lineno = lineno; } else { int res; @@ -10772,7 +10772,7 @@ obj2ast_arg(struct ast_state *state, PyObject* obj, arg_ty* out, PyArena* arena) } if (tmp == NULL || tmp == Py_None) { Py_CLEAR(tmp); - end_col_offset = 0; + end_col_offset = col_offset; } else { int res; @@ -10877,7 +10877,7 @@ obj2ast_keyword(struct ast_state *state, PyObject* obj, keyword_ty* out, } if (tmp == NULL || tmp == Py_None) { Py_CLEAR(tmp); - end_lineno = 0; + end_lineno = lineno; } else { int res; @@ -10894,7 +10894,7 @@ obj2ast_keyword(struct ast_state *state, PyObject* obj, keyword_ty* out, } if (tmp == NULL || tmp == Py_None) { Py_CLEAR(tmp); - end_col_offset = 0; + end_col_offset = col_offset; } else { int res; @@ -10999,7 +10999,7 @@ obj2ast_alias(struct ast_state *state, PyObject* obj, alias_ty* out, PyArena* } if (tmp == NULL || tmp == Py_None) { Py_CLEAR(tmp); - end_lineno = 0; + end_lineno = lineno; } else { int res; @@ -11016,7 +11016,7 @@ obj2ast_alias(struct ast_state *state, PyObject* obj, alias_ty* out, PyArena* } if (tmp == NULL || tmp == Py_None) { Py_CLEAR(tmp); - end_col_offset = 0; + end_col_offset = col_offset; } else { int res; From webhook-mailer at python.org Tue May 31 19:26:25 2022 From: webhook-mailer at python.org (miss-islington) Date: Tue, 31 May 2022 23:26:25 -0000 Subject: [Python-checkins] gh-92597: Ensure that AST nodes without explicit end positions can be compiled (GH-93359) Message-ID: https://github.com/python/cpython/commit/b425d887aa51c8e7900b08cb8df457f450f6fbfd commit: b425d887aa51c8e7900b08cb8df457f450f6fbfd branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-31T16:26:16-07:00 summary: gh-92597: Ensure that AST nodes without explicit end positions can be compiled (GH-93359) (cherry picked from commit 705eaec28f7bee530b1c1635ba385a49a1feaf32) Co-authored-by: Pablo Galindo Salgado files: A Misc/NEWS.d/next/Core and Builtins/2022-05-30-19-00-38.gh-issue-93359.zXV3A0.rst M Lib/test/test_ast.py M Parser/asdl_c.py M Python/Python-ast.c diff --git a/Lib/test/test_ast.py b/Lib/test/test_ast.py index 896eb5bedd7f3..33df22cb35a9e 100644 --- a/Lib/test/test_ast.py +++ b/Lib/test/test_ast.py @@ -362,6 +362,14 @@ def test_invalid_position_information(self): with self.assertRaises(ValueError): compile(tree, '', 'exec') + def test_compilation_of_ast_nodes_with_default_end_position_values(self): + tree = ast.Module(body=[ + ast.Import(names=[ast.alias(name='builtins', lineno=1, col_offset=0)], lineno=1, col_offset=0), + ast.Import(names=[ast.alias(name='traceback', lineno=0, col_offset=0)], lineno=0, col_offset=1) + ], type_ignores=[]) + + # Check that compilation doesn't crash. Note: this may crash explicitly only on debug mode. + compile(tree, "", "exec") def test_slice(self): slc = ast.parse("x[::]").body[0].value.slice diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-30-19-00-38.gh-issue-93359.zXV3A0.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-30-19-00-38.gh-issue-93359.zXV3A0.rst new file mode 100644 index 0000000000000..36e5e52390d7b --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-05-30-19-00-38.gh-issue-93359.zXV3A0.rst @@ -0,0 +1,2 @@ +Ensure that custom :mod:`ast` nodes without explicit end positions can be +compiled. Patch by Pablo Galindo. diff --git a/Parser/asdl_c.py b/Parser/asdl_c.py index 3bfe320fe3b70..1101a3593dfe2 100755 --- a/Parser/asdl_c.py +++ b/Parser/asdl_c.py @@ -488,6 +488,12 @@ def visitProduct(self, prod, name): class Obj2ModVisitor(PickleVisitor): + + attribute_special_defaults = { + "end_lineno": "lineno", + "end_col_offset": "col_offset", + } + @contextmanager def recursive_call(self, node, level): self.emit('if (_Py_EnterRecursiveCall(" while traversing \'%s\' node")) {' % node, level, reflow=False) @@ -637,7 +643,13 @@ def visitField(self, field, name, sum=None, prod=None, depth=0): self.emit("if (tmp == NULL || tmp == Py_None) {", depth) self.emit("Py_CLEAR(tmp);", depth+1) if self.isNumeric(field): - self.emit("%s = 0;" % field.name, depth+1) + if field.name in self.attribute_special_defaults: + self.emit( + "%s = %s;" % (field.name, self.attribute_special_defaults[field.name]), + depth+1, + ) + else: + self.emit("%s = 0;" % field.name, depth+1) elif not self.isSimpleType(field): self.emit("%s = NULL;" % field.name, depth+1) else: diff --git a/Python/Python-ast.c b/Python/Python-ast.c index 3861eaf978a38..e52a72d43bcbd 100644 --- a/Python/Python-ast.c +++ b/Python/Python-ast.c @@ -5697,7 +5697,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* } if (tmp == NULL || tmp == Py_None) { Py_CLEAR(tmp); - end_lineno = 0; + end_lineno = lineno; } else { int res; @@ -5714,7 +5714,7 @@ obj2ast_stmt(struct ast_state *state, PyObject* obj, stmt_ty* out, PyArena* } if (tmp == NULL || tmp == Py_None) { Py_CLEAR(tmp); - end_col_offset = 0; + end_col_offset = col_offset; } else { int res; @@ -8114,7 +8114,7 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena* } if (tmp == NULL || tmp == Py_None) { Py_CLEAR(tmp); - end_lineno = 0; + end_lineno = lineno; } else { int res; @@ -8131,7 +8131,7 @@ obj2ast_expr(struct ast_state *state, PyObject* obj, expr_ty* out, PyArena* } if (tmp == NULL || tmp == Py_None) { Py_CLEAR(tmp); - end_col_offset = 0; + end_col_offset = col_offset; } else { int res; @@ -10291,7 +10291,7 @@ obj2ast_excepthandler(struct ast_state *state, PyObject* obj, excepthandler_ty* } if (tmp == NULL || tmp == Py_None) { Py_CLEAR(tmp); - end_lineno = 0; + end_lineno = lineno; } else { int res; @@ -10308,7 +10308,7 @@ obj2ast_excepthandler(struct ast_state *state, PyObject* obj, excepthandler_ty* } if (tmp == NULL || tmp == Py_None) { Py_CLEAR(tmp); - end_col_offset = 0; + end_col_offset = col_offset; } else { int res; @@ -10755,7 +10755,7 @@ obj2ast_arg(struct ast_state *state, PyObject* obj, arg_ty* out, PyArena* arena) } if (tmp == NULL || tmp == Py_None) { Py_CLEAR(tmp); - end_lineno = 0; + end_lineno = lineno; } else { int res; @@ -10772,7 +10772,7 @@ obj2ast_arg(struct ast_state *state, PyObject* obj, arg_ty* out, PyArena* arena) } if (tmp == NULL || tmp == Py_None) { Py_CLEAR(tmp); - end_col_offset = 0; + end_col_offset = col_offset; } else { int res; @@ -10877,7 +10877,7 @@ obj2ast_keyword(struct ast_state *state, PyObject* obj, keyword_ty* out, } if (tmp == NULL || tmp == Py_None) { Py_CLEAR(tmp); - end_lineno = 0; + end_lineno = lineno; } else { int res; @@ -10894,7 +10894,7 @@ obj2ast_keyword(struct ast_state *state, PyObject* obj, keyword_ty* out, } if (tmp == NULL || tmp == Py_None) { Py_CLEAR(tmp); - end_col_offset = 0; + end_col_offset = col_offset; } else { int res; @@ -10999,7 +10999,7 @@ obj2ast_alias(struct ast_state *state, PyObject* obj, alias_ty* out, PyArena* } if (tmp == NULL || tmp == Py_None) { Py_CLEAR(tmp); - end_lineno = 0; + end_lineno = lineno; } else { int res; @@ -11016,7 +11016,7 @@ obj2ast_alias(struct ast_state *state, PyObject* obj, alias_ty* out, PyArena* } if (tmp == NULL || tmp == Py_None) { Py_CLEAR(tmp); - end_col_offset = 0; + end_col_offset = col_offset; } else { int res; From webhook-mailer at python.org Tue May 31 21:35:39 2022 From: webhook-mailer at python.org (miss-islington) Date: Wed, 01 Jun 2022 01:35:39 -0000 Subject: [Python-checkins] =?utf-8?b?8J+TnSBNYWtlIHN1cmUgdGhlIHBocmFzZSAi?= =?utf-8?q?constant-time_compare=22_actually_appears_in_the_docs_=28GH-933?= =?utf-8?b?OTYp?= Message-ID: https://github.com/python/cpython/commit/8241a6971e6051ba10040af6b50f9236faa0c892 commit: 8241a6971e6051ba10040af6b50f9236faa0c892 branch: main author: Noah Kantrowitz committer: miss-islington <31488909+miss-islington at users.noreply.github.com> date: 2022-05-31T18:35:28-07:00 summary: ? Make sure the phrase "constant-time compare" actually appears in the docs (GH-93396) This is purely for SEO as this is the actual generic name for this kind of method and it currently does not appear in a Google search for "python constant time compare". Not creating an issue or setting this up for backports as its trivial (I think) and not a functional change. files: M Doc/library/secrets.rst diff --git a/Doc/library/secrets.rst b/Doc/library/secrets.rst index c22da727b55c9..eda4616da5ec9 100644 --- a/Doc/library/secrets.rst +++ b/Doc/library/secrets.rst @@ -129,7 +129,7 @@ Other functions .. function:: compare_digest(a, b) Return ``True`` if strings *a* and *b* are equal, otherwise ``False``, - in such a way as to reduce the risk of + using a "constant-time compare" to reduce the risk of `timing attacks `_. See :func:`hmac.compare_digest` for additional details. From webhook-mailer at python.org Tue May 31 22:13:34 2022 From: webhook-mailer at python.org (pablogsal) Date: Wed, 01 Jun 2022 02:13:34 -0000 Subject: [Python-checkins] [3.11] gh-91162: Fix substitution of unpacked tuples in generic aliases (GH-92335) (#92484) Message-ID: https://github.com/python/cpython/commit/00f8fe956491816f03f1cc76bc7ed297cd9c0930 commit: 00f8fe956491816f03f1cc76bc7ed297cd9c0930 branch: 3.11 author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com> committer: pablogsal date: 2022-06-01T03:13:27+01:00 summary: [3.11] gh-91162: Fix substitution of unpacked tuples in generic aliases (GH-92335) (#92484) * gh-91162: Fix substitution of unpacked tuples in generic aliases (GH-92335) (cherry picked from commit 9d25db9db1617f012d7dba118b5b8f2b9e25e116) Co-authored-by: Serhiy Storchaka * Regenerate ABI file Co-authored-by: Serhiy Storchaka Co-authored-by: Pablo Galindo files: M Doc/data/python3.11.abi M Include/internal/pycore_global_strings.h M Include/internal/pycore_runtime_init.h M Lib/test/test_typing.py M Lib/typing.py M Objects/genericaliasobject.c diff --git a/Doc/data/python3.11.abi b/Doc/data/python3.11.abi index b0360f4121bc6..c5a1fdaea6fff 100644 --- a/Doc/data/python3.11.abi +++ b/Doc/data/python3.11.abi @@ -1637,7 +1637,7 @@ - + @@ -1658,7 +1658,7 @@ - + @@ -1672,7 +1672,7 @@ - + @@ -1698,7 +1698,7 @@ - + @@ -1823,169 +1823,169 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -1993,66 +1993,66 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + @@ -2062,18 +2062,18 @@ - + - + - + - + - + @@ -2081,23 +2081,23 @@ - + - + - + - + - + - + - + @@ -2267,19 +2267,19 @@ - + - + - + - + @@ -2295,21 +2295,21 @@ - + - + - + - + @@ -2421,11 +2421,11 @@ - + - + - + @@ -2461,13 +2461,13 @@ - + - + - + - + @@ -2482,14 +2482,14 @@ - + - + - - - + + + @@ -2543,13 +2543,13 @@ - + - + - - - + + + @@ -2593,15 +2593,15 @@ - - - + + + - + - + - + @@ -2641,7 +2641,7 @@ - + @@ -2791,18 +2791,18 @@ - + - + - + - + - + @@ -2849,21 +2849,21 @@ - + - + - + - + - + @@ -2872,12 +2872,12 @@ - + - + @@ -2890,10 +2890,10 @@ - + - + @@ -2949,18 +2949,18 @@ - + - + - - + + - - + + @@ -3172,7 +3172,7 @@ - + @@ -3621,463 +3621,466 @@ - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + + + + @@ -4085,12 +4088,12 @@ - + - - + + @@ -4098,12 +4101,12 @@ - + - - + + @@ -4111,12 +4114,12 @@ - + - - + + @@ -4124,12 +4127,12 @@ - + - - + + @@ -4137,12 +4140,12 @@ - + - - + + @@ -4150,12 +4153,12 @@ - + - - + + @@ -4163,12 +4166,12 @@ - + - - + + @@ -4176,12 +4179,12 @@ - + - - + + @@ -4189,12 +4192,12 @@ - + - - + + @@ -4202,12 +4205,12 @@ - + - - + + @@ -4215,12 +4218,12 @@ - + - - + + @@ -4228,67 +4231,93 @@ - + + + + + + + + + + + + + + - - + + - + - + - + - - + + - + - + - + - - + + - + - + - + - - + + + + + + + + + + + + + + + - + - + - + - + - + @@ -4302,36 +4331,36 @@ - + - - + + - + - + - + - - - + + + - + - + - + @@ -4345,10 +4374,10 @@ - + - + @@ -4359,7 +4388,7 @@ - + @@ -4368,17 +4397,17 @@ - + - + - + - + @@ -4396,16 +4425,16 @@ - + - + - + - + @@ -4423,7 +4452,7 @@ - + @@ -4435,12 +4464,12 @@ - + - - + + @@ -4452,11 +4481,11 @@ - + - + @@ -4515,16 +4544,16 @@ - + - + - + - + @@ -4599,7 +4628,7 @@ - + @@ -4647,24 +4676,24 @@ - + - + - - - - - - - + + + + + + + - + @@ -4681,40 +4710,40 @@ - + - + - + - + - + - + - + - + - - - + + + - + - + - + @@ -4725,10 +4754,10 @@ - + - + @@ -4740,8 +4769,8 @@ - - + + @@ -4754,21 +4783,21 @@ - + - + - + - - - - + + + + @@ -4782,36 +4811,36 @@ - - + + - + - + - + - - + + - - + + - + - + @@ -4822,28 +4851,28 @@ - - + + - - + + - + - + - + @@ -4854,13 +4883,13 @@ - + - + - + @@ -4883,80 +4912,80 @@ - + - + - - - + + + - + - - - - + + + + - - + + - - + + - + - + - - + + - - + + - - + + - - + + - + - + - + - + @@ -4965,37 +4994,37 @@ - - - + + + - + - + - + - + - + - + - - - - + + + + - + @@ -5004,7 +5033,7 @@ - + @@ -5030,8 +5059,8 @@ - - + + @@ -5744,10 +5773,10 @@ - + - + @@ -5759,8 +5788,8 @@ - - + + @@ -5774,44 +5803,44 @@ - + - + - - - - - - - - + + + + + + + + - + - - + + - + - + - + - + @@ -5888,9 +5917,9 @@ - - - + + + @@ -5901,27 +5930,27 @@ - + - + - + - + - - - - - + + + + + - + @@ -5930,16 +5959,16 @@ - + - - - + + + - - - + + + @@ -5977,10 +6006,10 @@ - + - + @@ -5989,31 +6018,31 @@ - + - + - + - + - + - + - + - + @@ -6025,34 +6054,34 @@ - + - - - - - - - - - - - - - + + + + + + + + + + + + + - - + + - - - - + + + + - - + + @@ -6099,9 +6128,9 @@ - + - + @@ -6120,22 +6149,22 @@ - - - + + + - + - + - + @@ -6197,7 +6226,7 @@ - + @@ -6232,16 +6261,16 @@ - - - + + + - + - + @@ -6658,10 +6687,10 @@ - - + + - + @@ -6671,27 +6700,27 @@ - - + + - + - + - - + + - + @@ -6701,23 +6730,23 @@ - + - + - + - + - + @@ -6772,8 +6801,8 @@ - - + + @@ -6781,31 +6810,31 @@ - - + + - + - + - + - + - + - + @@ -6814,37 +6843,37 @@ - + - + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - + + @@ -6875,7 +6904,7 @@ - + @@ -6885,7 +6914,7 @@ - + @@ -6905,51 +6934,51 @@ - + - - + + - - + + - + - + - + - + - + - + - + @@ -7002,10 +7031,10 @@ - + - + @@ -7029,7 +7058,7 @@ - + @@ -7044,7 +7073,7 @@ - + @@ -7058,10 +7087,10 @@ - + - + @@ -7074,7 +7103,7 @@ - + @@ -7085,7 +7114,7 @@ - + @@ -7093,11 +7122,11 @@ - - + + - + @@ -7116,7 +7145,7 @@ - + @@ -7130,7 +7159,7 @@ - + @@ -7282,7 +7311,7 @@ - + @@ -7294,10 +7323,10 @@ - + - + @@ -7316,7 +7345,7 @@ - + @@ -7335,11 +7364,11 @@ - + - + @@ -7355,7 +7384,7 @@ - + @@ -7397,14 +7426,14 @@ - + - + @@ -7416,27 +7445,27 @@ - + - + - + - - - - + + + + - + - + - + @@ -7444,7 +7473,7 @@ - + @@ -7464,7 +7493,7 @@ - + @@ -7485,9 +7514,9 @@ - + - + @@ -7537,83 +7566,83 @@ - + - - + + - + - + - + - + - + - + - + - + - + - - + + - + - - + + - - - + + + - - - + + + - - - + + + - - + + - - - + + + - - - + + + - + @@ -7635,7 +7664,7 @@ - + @@ -7646,7 +7675,7 @@ - + @@ -7658,12 +7687,12 @@ - - - + + + - + @@ -7687,18 +7716,18 @@ - + - + - + @@ -7927,15 +7956,15 @@ - + - + - + @@ -7943,15 +7972,15 @@ - + - + - + @@ -7969,12 +7998,12 @@ - + - + - + @@ -7986,16 +8015,16 @@ - + - + - + - + @@ -8007,10 +8036,10 @@ - + - + @@ -8060,30 +8089,30 @@ - - - - - - + + + + + + - + - + - + - + @@ -8101,7 +8130,7 @@ - + @@ -8123,7 +8152,7 @@ - + @@ -8164,127 +8193,127 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - - + + - + - + - + - + - + - + - + - + @@ -8356,7 +8385,7 @@ - + @@ -8371,7 +8400,7 @@ - + @@ -8385,7 +8414,7 @@ - + @@ -8402,7 +8431,7 @@ - + @@ -8450,17 +8479,17 @@ - + - + - + - + @@ -8487,13 +8516,13 @@ - + - + - + - + @@ -8508,62 +8537,62 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - + + + - + @@ -8601,7 +8630,7 @@ - + @@ -8632,19 +8661,19 @@ - + - - + + - - + + - + @@ -8684,11 +8713,11 @@ - + - + @@ -8708,15 +8737,15 @@ - + - + - + @@ -8750,7 +8779,7 @@ - + @@ -8761,7 +8790,7 @@ - + @@ -8772,7 +8801,7 @@ - + @@ -8787,7 +8816,7 @@ - + @@ -8852,13 +8881,13 @@ - + - + @@ -8902,7 +8931,7 @@ - + @@ -8947,11 +8976,11 @@ - + - + @@ -8972,12 +9001,12 @@ - + - + @@ -8993,7 +9022,7 @@ - + @@ -9003,7 +9032,7 @@ - + @@ -9037,7 +9066,7 @@ - + @@ -9056,9 +9085,9 @@ - + - + @@ -9073,7 +9102,7 @@ - + @@ -9085,12 +9114,12 @@ - + - + @@ -9099,9 +9128,9 @@ - - - + + + @@ -9109,13 +9138,13 @@ - - - - + + + + - + @@ -9149,22 +9178,22 @@ - + - + - + - + @@ -9177,101 +9206,101 @@ - + - + - + - + - + - + - + - - + + - + - + - + - + - + - - + + - - + + - - - - - - - + + + + + + + - - - + + + - - + + - - - + + + - - + + - + - - + + - - + + @@ -9352,7 +9381,7 @@ - + @@ -9369,13 +9398,13 @@ - + - + @@ -9451,7 +9480,7 @@ - + @@ -9463,21 +9492,21 @@ - + - + - + - + @@ -9485,19 +9514,19 @@ - + - + - + - + @@ -9506,10 +9535,10 @@ - - + + - + @@ -9518,19 +9547,19 @@ - + - + - + - + @@ -9565,10 +9594,10 @@ - - + + - + @@ -9607,66 +9636,66 @@ - + - + - + - - - - + + + + - + - + - + - - + + - + - + - + - + - - - - - + + + + + - - + + - - + + @@ -9675,7 +9704,7 @@ - + @@ -9685,52 +9714,52 @@ - + - + - + - + - - + + - + - + - + - + - + - + @@ -9738,19 +9767,19 @@ - + - + - + @@ -9768,7 +9797,7 @@ - + @@ -9803,7 +9832,7 @@ - + @@ -9858,9 +9887,9 @@ - + - + @@ -9868,13 +9897,13 @@ - + - + @@ -9882,32 +9911,32 @@ - - - - + + + + - + - + - + - + - + @@ -9927,11 +9956,11 @@ - + - + @@ -9974,1024 +10003,1024 @@ - - - - - - + + + + + + - + - - - + + + - - - + + + - - - + + + - - + + - + - - - + + + - - + + - - + + - + - + - + - + - + - + - + - + - + - - - - - - + + + + + + - - - - + + + + - - - + + + - - - + + + - - + + - - + + - - - + + + - + - - - + + + - - - - + + + + - - - + + + - - + + - - + + - + - - - + + + - - - + + + - - + + - + - + - - + + - + - - + + - - + + - - + + - - - + + + - - - - - + + + + + - - + + - - + + - - - - + + + + - - - - + + + + - - - - - + + + + + - - - + + + - - - + + + - - - + + + - - - - + + + + - - + + - - - - + + + + - - - + + + - - - + + + - - - - + + + + - - - - - + + + + + - - - - + + + + - - - - + + + + - - + + - - + + - + - - - + + + - - - + + + - - - + + + - + - - - - + + + + - - - + + + - + - - - + + + - + - + - - - + + + - - - - - + + + + + - - - - - + + + + + - - - - + + + + - + - - - - - - + + + + + + - - - - - - + + + + + + - - - - - - + + + + + + - - - - - + + + + + - - - - - - - - - - - + + + + + + + + + + + - - + + - - - - + + + + - + - - - - + + + + - - + + - - - - - + + + + + - + - - - + + + - - - - + + + + - + - - - + + + - - - - + + + + - - + + - - - - + + + + - - - - - + + + + + - - + + - - - - + + + + - - - - - + + + + + - - - - - - + + + + + + - + - - - - + + + + - - - - - - + + + + + + - - - - - + + + + + - + - - - - + + + + - - - - - - + + + + + + - - - - - + + + + + - + - - - + + + - - - - - - - - + + + + + + + + - - - - + + + + - - - - - - - + + + + + + + - - - - - + + + + + - - - - + + + + - - - - - + + + + + - - - - - + + + + + - - - - + + + + - + - - - - + + + + - - - - + + + + - + - - + + - - - - - - + + + + + + - - - - + + + + - - - - + + + + - + - - - + + + - - - + + + - - - + + + - - - + + + - - + + - - - + + + - - - - + + + + - - - - + + + + - - - - + + + + - + - - - + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - - + + + + + - - - - + + + + - + - - + + - + - + - - - + + + - - - - + + + + - + - - - + + + - - - + + + - - - - - - + + + + + + - + - - - - - + + + + + - - - - + + + + - + - - + + - - + + - - - + + + - - - + + + - - - + + + - - - + + + - - + + - - - - - - - - - + - + + + + + + + + + - - - + + + - - - + + + - - - + + + - + - + - + - + - - + + - - + + - - + + - - + + - - + + - - + + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - - + + - + - + @@ -11013,7 +11042,7 @@ - + @@ -11027,27 +11056,27 @@ - + - + - - + + - + - + - + @@ -11100,52 +11129,52 @@ - + - + - + - - + + - - + + - - + + - + - - - + + + - + - + - + @@ -11153,38 +11182,38 @@ - - - - + + + + - + - + - - + + - + - + - - + + - - - + + + - + @@ -11216,7 +11245,7 @@ - + @@ -11306,143 +11335,143 @@ - - - - - + + + + + - - - + + + - - - - + + + + - - + + - - + + - - - - - - - - - - - - + + + + + + + + + + + + - - - - - - + + + + + + - - - + + + - - + + - - - - + + + + - - - + + + - - + + - + - + - - - + + + - - - - + + + + - - + + - - + + - + - - + + - - + + - - + + - + - + - + - + - - + + - + - - + + - + @@ -11537,13 +11566,13 @@ - - + + - - + + @@ -11563,21 +11592,21 @@ - + - + - - - - - - - - - + + + + + + + + + @@ -11591,60 +11620,60 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -11659,7 +11688,7 @@ - + @@ -11689,144 +11718,144 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -11841,12 +11870,12 @@ - + - + - + @@ -11861,7 +11890,7 @@ - + @@ -11891,143 +11920,143 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - - + + - + - - - + + + - + - + - + - + - + - + - + @@ -12043,172 +12072,172 @@ - - + + - + - + - + - - + + - + - + - - - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - - - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - + + + - + - + - + - + - + - + - + - + - + @@ -12223,277 +12252,277 @@ - - + + - + - - - + + + - + - + - + - + - + - + - + - - - + + + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - - - - - + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - - - + + + - + - + - + - + - + - + - + - + - + - + - + - + @@ -12508,7 +12537,7 @@ - + @@ -12519,161 +12548,161 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - - - + + + - + - + - + - + - + - + - + - + - + - + - + - - - + + + - + - + - + - + - - + + - + - - - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -12688,65 +12717,65 @@ - + - + - + - + - + - + - + - - + + - + - - - + + + - + - + - + - + - + - + - + - + - + - + @@ -12761,116 +12790,116 @@ - - + + - + - - - + + + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - - - + + + - + - + - + - + - + - + - - - - - + + + + + - + - + - - + + - + @@ -12918,7 +12947,7 @@ - + @@ -12961,7 +12990,7 @@ - + @@ -12998,7 +13027,7 @@ - + @@ -13032,9 +13061,9 @@ - - - + + + @@ -13118,7 +13147,7 @@ - + @@ -13152,8 +13181,8 @@ - - + + @@ -13185,7 +13214,7 @@ - + @@ -13217,14 +13246,14 @@ - + - + - + @@ -13264,12 +13293,12 @@ - + - + @@ -13290,17 +13319,17 @@ - + - - + + - + @@ -13313,7 +13342,7 @@ - + @@ -13327,22 +13356,22 @@ - - + + - - + + - + @@ -13350,21 +13379,21 @@ - + - + - + @@ -13372,23 +13401,23 @@ - - + + - - + + - + @@ -13396,7 +13425,7 @@ - + @@ -13410,13 +13439,13 @@ - + - + @@ -13458,39 +13487,39 @@ - + - + - + - - - + + + - - - - - - - - + + + + + + + + - - + + @@ -13498,48 +13527,48 @@ - + - + - + - + - + - + - + - + - + - + - + - - - - - - + + + + + + - + - + @@ -13548,78 +13577,78 @@ - - - - - - - - - + + + + - - - + + + + + + + + - + - - + + - + - + - - - + + + - + - - - - - - - - - + + + + + + + + + - - + + - + - + - + - - + + - + @@ -13629,52 +13658,52 @@ - + - - + + - + - - + + - + - + - + - + - - + + - + - - + + - + - + @@ -13791,7 +13820,7 @@ - + @@ -13808,7 +13837,7 @@ - + @@ -13825,12 +13854,12 @@ - + - + - + @@ -13842,159 +13871,159 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - - + + - - + + - - - - + + + + - + - + - - - + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - - + + + + + - - - + + + - - + + - - + + - - + + - - + + - - - + + + - - + + - - - + + + - - + + - - + + - + @@ -14009,35 +14038,35 @@ - + - + - + - + - + - + - + @@ -14072,7 +14101,7 @@ - + @@ -14080,18 +14109,18 @@ - + - + - + @@ -14110,12 +14139,12 @@ - + - + @@ -14126,21 +14155,21 @@ - + - + - + - + @@ -14160,65 +14189,65 @@ - + - + - + - + - + - - - - - - - - - + + + + + + + + + - - - + + + - - - + + + - - - + + + - - + + - + - + @@ -14226,34 +14255,34 @@ - + - + - - - + + + - - - + + + - - + + - + - + - + @@ -14261,75 +14290,75 @@ - + - - - + + + - + - + - + - + - - + + - + - - + + - + - - - + + + - - + + - + - + - + - + - + - + - + @@ -14337,7 +14366,7 @@ - + @@ -14345,50 +14374,50 @@ - + - + - - + + - + - + - - - + + + - + - + - + - - - - - + + + + + - + @@ -14405,86 +14434,86 @@ - + - + - + - - - - - - - - + + + + + + + + - - - + + + - - - + + + - - - + + + - - + + - - + + - - + + - - - + + + - - - + + + - - - + + + - - + + - - - + + + - - + + - + - - + + @@ -14494,7 +14523,7 @@ - + @@ -14504,39 +14533,39 @@ - - + + - - - + + + - - + + - - + + - + - - + + - + - - + + - - - + + + - + @@ -14568,149 +14597,149 @@ - + - + - - - + + + - - + + - - - + + + - - - + + + - - + + - - + + - - - + + + - - + + - - + + - - - + + + - + - + - - - + + + - - + + - + - + - + - + - + - - + + - - + + - - + + - + - + - - - + + + - - + + - - - + + + - - + + - + - - + + - - + + - - - - + + + + - + - + - + - + @@ -14722,7 +14751,7 @@ - + @@ -14730,26 +14759,26 @@ - + - + - + - + - + @@ -14757,7 +14786,7 @@ - + @@ -14809,41 +14838,41 @@ - + - - + + - + - - + + - + - - + + - - + + - + @@ -14853,7 +14882,7 @@ - + @@ -14864,27 +14893,27 @@ - + - - + + - + - + - + @@ -14893,7 +14922,7 @@ - + @@ -14901,27 +14930,27 @@ - + - + - + - - + + - + @@ -14929,7 +14958,7 @@ - + @@ -14937,18 +14966,18 @@ - + - + - + @@ -14956,7 +14985,7 @@ - + @@ -14980,84 +15009,84 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - - + + - - + + - - - + + + @@ -15092,22 +15121,22 @@ - + - - + + - - + + - + - - + + @@ -15118,54 +15147,54 @@ - + - - + + - - + + - - + + - + - - + + - + - + - + - + - - + + - - + + - - + + - - + + @@ -15173,135 +15202,135 @@ - + - - - - + + + + - + - + - + - - + + - - - + + + - - - + + + - - - + + + - - - + + + - - + + - + - - + + - + - + - + - + - - + + - - + + - + - - + + - + - + - - - + + + - - - + + + - - + + - + - + - - - - + + + + - - - + + + - + @@ -15313,16 +15342,16 @@ - + - + - + - + @@ -15335,9 +15364,9 @@ - + - + @@ -15360,7 +15389,7 @@ - + @@ -15378,7 +15407,7 @@ - + @@ -15417,18 +15446,18 @@ - + - + - - + + @@ -15436,16 +15465,16 @@ - - + + - + - + @@ -15463,7 +15492,7 @@ - + @@ -15472,8 +15501,8 @@ - - + + @@ -15481,65 +15510,65 @@ - - - - - + + + + + - + - + - - - + + + - - + + - - + + - - + + - + - + - + - + - + @@ -15579,21 +15608,21 @@ - + - + - + - + - + @@ -15603,20 +15632,20 @@ - + - + - + - + @@ -15632,11 +15661,11 @@ - + - + @@ -15647,27 +15676,27 @@ - + - + - + - + - + @@ -15694,7 +15723,7 @@ - + @@ -15714,7 +15743,7 @@ - + @@ -15742,7 +15771,7 @@ - + @@ -15764,21 +15793,21 @@ - + - + - + - + - + @@ -15791,77 +15820,77 @@ - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - - - + + + @@ -15870,21 +15899,21 @@ - - + + - + - + - + - + @@ -15892,7 +15921,7 @@ - + @@ -15900,7 +15929,7 @@ - + @@ -15908,13 +15937,13 @@ - + - + @@ -15988,9 +16017,9 @@ - + - + @@ -16019,13 +16048,13 @@ - + - + @@ -16051,12 +16080,12 @@ - + - - - + + + @@ -16071,93 +16100,93 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - - + + + + + + + + - + - + - + - + - + @@ -16167,36 +16196,36 @@ - - - - + + + + - + - - + + - - + + - + - - - + + + - + @@ -16210,7 +16239,7 @@ - + @@ -16218,95 +16247,95 @@ - + - + - + - + - + - + - - + + - + - - + + - - - - + + + + - - - - + + + + - - + + - + - - + + - - + + - + - + - + - + - + - + - + - + @@ -16319,26 +16348,26 @@ - - + + - + - - + + - + - + - + @@ -16354,7 +16383,7 @@ - + @@ -16389,20 +16418,20 @@ - + - + - + - + @@ -16410,130 +16439,130 @@ - + - + - + - - + + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + @@ -16542,15 +16571,15 @@ - + - - - - - - + + + + + + @@ -16558,9 +16587,9 @@ - - - - + + + + diff --git a/Include/internal/pycore_global_strings.h b/Include/internal/pycore_global_strings.h index 4e1f2ec6c3529..cfa8ae99d1b6d 100644 --- a/Include/internal/pycore_global_strings.h +++ b/Include/internal/pycore_global_strings.h @@ -201,8 +201,9 @@ struct _Py_global_strings { STRUCT_FOR_ID(__subclasshook__) STRUCT_FOR_ID(__truediv__) STRUCT_FOR_ID(__trunc__) + STRUCT_FOR_ID(__typing_is_unpacked_typevartuple__) STRUCT_FOR_ID(__typing_subst__) - STRUCT_FOR_ID(__typing_unpacked__) + STRUCT_FOR_ID(__typing_unpacked_tuple_args__) STRUCT_FOR_ID(__warningregistry__) STRUCT_FOR_ID(__weakref__) STRUCT_FOR_ID(__xor__) diff --git a/Include/internal/pycore_runtime_init.h b/Include/internal/pycore_runtime_init.h index c1c5fd562e6b8..57cacb97bcf1a 100644 --- a/Include/internal/pycore_runtime_init.h +++ b/Include/internal/pycore_runtime_init.h @@ -824,8 +824,9 @@ extern "C" { INIT_ID(__subclasshook__), \ INIT_ID(__truediv__), \ INIT_ID(__trunc__), \ + INIT_ID(__typing_is_unpacked_typevartuple__), \ INIT_ID(__typing_subst__), \ - INIT_ID(__typing_unpacked__), \ + INIT_ID(__typing_unpacked_tuple_args__), \ INIT_ID(__warningregistry__), \ INIT_ID(__weakref__), \ INIT_ID(__xor__), \ diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index 6e1e8d6e1b473..2afac23539155 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -603,22 +603,10 @@ class C(Generic[T]): pass ('generic[T]', '[int]', 'generic[int]'), ('generic[T]', '[int, str]', 'TypeError'), ('generic[T]', '[tuple_type[int, ...]]', 'generic[tuple_type[int, ...]]'), - # Should raise TypeError: a) according to the tentative spec, - # unpacked types cannot be used as arguments to aliases that expect - # a fixed number of arguments; b) it's equivalent to generic[()]. - ('generic[T]', '[*tuple[()]]', 'generic[*tuple[()]]'), - ('generic[T]', '[*Tuple[()]]', 'TypeError'), - # Should raise TypeError according to the tentative spec: unpacked - # types cannot be used as arguments to aliases that expect a fixed - # number of arguments. - ('generic[T]', '[*tuple[int]]', 'generic[*tuple[int]]'), - ('generic[T]', '[*Tuple[int]]', 'TypeError'), - # Ditto. - ('generic[T]', '[*tuple[int, str]]', 'generic[*tuple[int, str]]'), - ('generic[T]', '[*Tuple[int, str]]', 'TypeError'), - # Ditto. - ('generic[T]', '[*tuple[int, ...]]', 'generic[*tuple[int, ...]]'), - ('generic[T]', '[*Tuple[int, ...]]', 'TypeError'), + ('generic[T]', '[*tuple_type[int]]', 'generic[int]'), + ('generic[T]', '[*tuple_type[()]]', 'TypeError'), + ('generic[T]', '[*tuple_type[int, str]]', 'TypeError'), + ('generic[T]', '[*tuple_type[int, ...]]', 'TypeError'), ('generic[T]', '[*Ts]', 'TypeError'), ('generic[T]', '[T, *Ts]', 'TypeError'), ('generic[T]', '[*Ts, T]', 'TypeError'), @@ -664,23 +652,29 @@ class C(Generic[T1, T2]): pass ('generic[T1, T2]', '[int, str]', 'generic[int, str]'), ('generic[T1, T2]', '[int, str, bool]', 'TypeError'), ('generic[T1, T2]', '[*tuple_type[int]]', 'TypeError'), - ('generic[T1, T2]', '[*tuple_type[int, str]]', 'TypeError'), + ('generic[T1, T2]', '[*tuple_type[int, str]]', 'generic[int, str]'), ('generic[T1, T2]', '[*tuple_type[int, str, bool]]', 'TypeError'), - # Should raise TypeError according to the tentative spec: unpacked - # types cannot be used as arguments to aliases that expect a fixed - # number of arguments. - ('generic[T1, T2]', '[*tuple[int, str], *tuple[float, bool]]', 'generic[*tuple[int, str], *tuple[float, bool]]'), - ('generic[T1, T2]', '[*Tuple[int, str], *Tuple[float, bool]]', 'TypeError'), + ('generic[T1, T2]', '[int, *tuple_type[str]]', 'generic[int, str]'), + ('generic[T1, T2]', '[*tuple_type[int], str]', 'generic[int, str]'), + ('generic[T1, T2]', '[*tuple_type[int], *tuple_type[str]]', 'generic[int, str]'), + ('generic[T1, T2]', '[*tuple_type[int, str], *tuple_type[()]]', 'generic[int, str]'), + ('generic[T1, T2]', '[*tuple_type[()], *tuple_type[int, str]]', 'generic[int, str]'), + ('generic[T1, T2]', '[*tuple_type[int], *tuple_type[()]]', 'TypeError'), + ('generic[T1, T2]', '[*tuple_type[()], *tuple_type[int]]', 'TypeError'), + ('generic[T1, T2]', '[*tuple_type[int, str], *tuple_type[float]]', 'TypeError'), + ('generic[T1, T2]', '[*tuple_type[int], *tuple_type[str, float]]', 'TypeError'), + ('generic[T1, T2]', '[*tuple_type[int, str], *tuple_type[float, bool]]', 'TypeError'), ('generic[T1, T2]', '[tuple_type[int, ...]]', 'TypeError'), ('generic[T1, T2]', '[tuple_type[int, ...], tuple_type[str, ...]]', 'generic[tuple_type[int, ...], tuple_type[str, ...]]'), + # Should raise TypeError according to the tentative spec: unpacked + # types cannot be used as arguments to aliases that expect a fixed + # number of arguments. ('generic[T1, T2]', '[*tuple_type[int, ...]]', 'TypeError'), - - # Ditto. - ('generic[T1, T2]', '[*tuple[int, ...], *tuple[str, ...]]', 'generic[*tuple[int, ...], *tuple[str, ...]]'), - ('generic[T1, T2]', '[*Tuple[int, ...], *Tuple[str, ...]]', 'TypeError'), - + ('generic[T1, T2]', '[int, *tuple_type[str, ...]]', 'TypeError'), + ('generic[T1, T2]', '[*tuple_type[int, ...], str]', 'TypeError'), + ('generic[T1, T2]', '[*tuple_type[int, ...], *tuple_type[str, ...]]', 'TypeError'), ('generic[T1, T2]', '[*Ts]', 'TypeError'), ('generic[T1, T2]', '[T, *Ts]', 'TypeError'), ('generic[T1, T2]', '[*Ts, T]', 'TypeError'), @@ -720,7 +714,7 @@ class C(Generic[T1, T2, T3]): pass tests = [ # Alias # Args # Expected result ('generic[T1, bool, T2]', '[int, str]', 'generic[int, bool, str]'), - ('generic[T1, bool, T2]', '[*tuple_type[int, str]]', 'TypeError'), + ('generic[T1, bool, T2]', '[*tuple_type[int, str]]', 'generic[int, bool, str]'), ] for alias_template, args_template, expected_template in tests: @@ -753,96 +747,43 @@ class C(Generic[*Ts]): pass # Tuple because tuple currently behaves differently. tests = [ # Alias # Args # Expected result - ('C[*Ts]', '[()]', 'C[()]'), - ('tuple[*Ts]', '[()]', 'tuple[()]'), - ('Tuple[*Ts]', '[()]', 'Tuple[()]'), - - ('C[*Ts]', '[int]', 'C[int]'), - ('tuple[*Ts]', '[int]', 'tuple[int]'), - ('Tuple[*Ts]', '[int]', 'Tuple[int]'), - - ('C[*Ts]', '[int, str]', 'C[int, str]'), - ('tuple[*Ts]', '[int, str]', 'tuple[int, str]'), - ('Tuple[*Ts]', '[int, str]', 'Tuple[int, str]'), - - ('C[*Ts]', '[*tuple_type[int]]', 'C[*tuple_type[int]]'), # Should be C[int] - ('tuple[*Ts]', '[*tuple_type[int]]', 'tuple[*tuple_type[int]]'), # Should be tuple[int] - ('Tuple[*Ts]', '[*tuple_type[int]]', 'Tuple[*tuple_type[int]]'), # Should be Tuple[int] - - ('C[*Ts]', '[*tuple_type[*Ts]]', 'C[*tuple_type[*Ts]]'), # Should be C[*Ts] - ('tuple[*Ts]', '[*tuple_type[*Ts]]', 'tuple[*tuple_type[*Ts]]'), # Should be tuple[*Ts] - ('Tuple[*Ts]', '[*tuple_type[*Ts]]', 'Tuple[*tuple_type[*Ts]]'), # Should be Tuple[*Ts] - - ('C[*Ts]', '[*tuple_type[int, str]]', 'C[*tuple_type[int, str]]'), # Should be C[int, str] - ('tuple[*Ts]', '[*tuple_type[int, str]]', 'tuple[*tuple_type[int, str]]'), # Should be tuple[int, str] - ('Tuple[*Ts]', '[*tuple_type[int, str]]', 'Tuple[*tuple_type[int, str]]'), # Should be Tuple[int, str] - - ('C[*Ts]', '[tuple_type[int, ...]]', 'C[tuple_type[int, ...]]'), - ('tuple[*Ts]', '[tuple_type[int, ...]]', 'tuple[tuple_type[int, ...]]'), - ('Tuple[*Ts]', '[tuple_type[int, ...]]', 'Tuple[tuple_type[int, ...]]'), - - ('C[*Ts]', '[tuple_type[int, ...], tuple_type[str, ...]]', 'C[tuple_type[int, ...], tuple_type[str, ...]]'), - ('tuple[*Ts]', '[tuple_type[int, ...], tuple_type[str, ...]]', 'tuple[tuple_type[int, ...], tuple_type[str, ...]]'), - ('Tuple[*Ts]', '[tuple_type[int, ...], tuple_type[str, ...]]', 'Tuple[tuple_type[int, ...], tuple_type[str, ...]]'), - - ('C[*Ts]', '[*tuple_type[int, ...]]', 'C[*tuple_type[int, ...]]'), - ('tuple[*Ts]', '[*tuple_type[int, ...]]', 'tuple[*tuple_type[int, ...]]'), - ('Tuple[*Ts]', '[*tuple_type[int, ...]]', 'Tuple[*tuple_type[int, ...]]'), + ('generic[*Ts]', '[()]', 'generic[()]'), + ('generic[*Ts]', '[int]', 'generic[int]'), + ('generic[*Ts]', '[int, str]', 'generic[int, str]'), + ('generic[*Ts]', '[*tuple_type[int]]', 'generic[int]'), + ('generic[*Ts]', '[*tuple_type[*Ts]]', 'generic[*Ts]'), + ('generic[*Ts]', '[*tuple_type[int, str]]', 'generic[int, str]'), + ('generic[*Ts]', '[tuple_type[int, ...]]', 'generic[tuple_type[int, ...]]'), + ('generic[*Ts]', '[tuple_type[int, ...], tuple_type[str, ...]]', 'generic[tuple_type[int, ...], tuple_type[str, ...]]'), + ('generic[*Ts]', '[*tuple_type[int, ...]]', 'generic[*tuple_type[int, ...]]'), # Technically, multiple unpackings are forbidden by PEP 646, but we # choose to be less restrictive at runtime, to allow folks room # to experiment. So all three of these should be valid. - ('C[*Ts]', '[*tuple_type[int, ...], *tuple_type[str, ...]]', 'C[*tuple_type[int, ...], *tuple_type[str, ...]]'), - ('tuple[*Ts]', '[*tuple_type[int, ...], *tuple_type[str, ...]]', 'tuple[*tuple_type[int, ...], *tuple_type[str, ...]]'), - ('Tuple[*Ts]', '[*tuple_type[int, ...], *tuple_type[str, ...]]', 'Tuple[*tuple_type[int, ...], *tuple_type[str, ...]]'), - - ('C[*Ts]', '[*Ts]', 'C[*Ts]'), - ('tuple[*Ts]', '[*Ts]', 'tuple[*Ts]'), - ('Tuple[*Ts]', '[*Ts]', 'Tuple[*Ts]'), - - ('C[*Ts]', '[T, *Ts]', 'C[T, *Ts]'), - ('tuple[*Ts]', '[T, *Ts]', 'tuple[T, *Ts]'), - ('Tuple[*Ts]', '[T, *Ts]', 'Tuple[T, *Ts]'), + ('generic[*Ts]', '[*tuple_type[int, ...], *tuple_type[str, ...]]', 'generic[*tuple_type[int, ...], *tuple_type[str, ...]]'), - ('C[*Ts]', '[*Ts, T]', 'C[*Ts, T]'), - ('tuple[*Ts]', '[*Ts, T]', 'tuple[*Ts, T]'), - ('Tuple[*Ts]', '[*Ts, T]', 'Tuple[*Ts, T]'), + ('generic[*Ts]', '[*Ts]', 'generic[*Ts]'), + ('generic[*Ts]', '[T, *Ts]', 'generic[T, *Ts]'), + ('generic[*Ts]', '[*Ts, T]', 'generic[*Ts, T]'), + ('generic[T, *Ts]', '[int]', 'generic[int]'), + ('generic[T, *Ts]', '[int, str]', 'generic[int, str]'), + ('generic[T, *Ts]', '[int, str, bool]', 'generic[int, str, bool]'), - ('C[T, *Ts]', '[int]', 'C[int]'), - ('tuple[T, *Ts]', '[int]', 'tuple[int]'), - ('Tuple[T, *Ts]', '[int]', 'Tuple[int]'), + ('generic[T, *Ts]', '[*tuple[int, ...]]', 'TypeError'), # Should be generic[int, *tuple[int, ...]] - ('C[T, *Ts]', '[int, str]', 'C[int, str]'), - ('tuple[T, *Ts]', '[int, str]', 'tuple[int, str]'), - ('Tuple[T, *Ts]', '[int, str]', 'Tuple[int, str]'), - - ('C[T, *Ts]', '[int, str, bool]', 'C[int, str, bool]'), - ('tuple[T, *Ts]', '[int, str, bool]', 'tuple[int, str, bool]'), - ('Tuple[T, *Ts]', '[int, str, bool]', 'Tuple[int, str, bool]'), - - ('C[T, *Ts]', '[*tuple[int, ...]]', 'C[*tuple[int, ...]]'), # Should be C[int, *tuple[int, ...]] - ('C[T, *Ts]', '[*Tuple[int, ...]]', 'TypeError'), # Ditto - ('tuple[T, *Ts]', '[*tuple[int, ...]]', 'tuple[*tuple[int, ...]]'), # Should be tuple[int, *tuple[int, ...]] - ('tuple[T, *Ts]', '[*Tuple[int, ...]]', 'TypeError'), # Should be tuple[int, *Tuple[int, ...]] - ('Tuple[T, *Ts]', '[*tuple[int, ...]]', 'Tuple[*tuple[int, ...]]'), # Should be Tuple[int, *tuple[int, ...]] - ('Tuple[T, *Ts]', '[*Tuple[int, ...]]', 'TypeError'), # Should be Tuple[int, *Tuple[int, ...]] - - ('C[*Ts, T]', '[int]', 'C[int]'), - ('tuple[*Ts, T]', '[int]', 'tuple[int]'), - ('Tuple[*Ts, T]', '[int]', 'Tuple[int]'), - - ('C[*Ts, T]', '[int, str]', 'C[int, str]'), - ('tuple[*Ts, T]', '[int, str]', 'tuple[int, str]'), - ('Tuple[*Ts, T]', '[int, str]', 'Tuple[int, str]'), - - ('C[*Ts, T]', '[int, str, bool]', 'C[int, str, bool]'), - ('tuple[*Ts, T]', '[int, str, bool]', 'tuple[int, str, bool]'), - ('Tuple[*Ts, T]', '[int, str, bool]', 'Tuple[int, str, bool]'), + ('generic[*Ts, T]', '[int]', 'generic[int]'), + ('generic[*Ts, T]', '[int, str]', 'generic[int, str]'), + ('generic[*Ts, T]', '[int, str, bool]', 'generic[int, str, bool]'), ('generic[T, *tuple_type[int, ...]]', '[str]', 'generic[str, *tuple_type[int, ...]]'), ('generic[T1, T2, *tuple_type[int, ...]]', '[str, bool]', 'generic[str, bool, *tuple_type[int, ...]]'), ('generic[T1, *tuple_type[int, ...], T2]', '[str, bool]', 'generic[str, *tuple_type[int, ...], bool]'), ('generic[T1, *tuple_type[int, ...], T2]', '[str, bool, float]', 'TypeError'), + + ('generic[T1, *tuple_type[T2, ...]]', '[int, str]', 'generic[int, *tuple_type[str, ...]]'), + ('generic[*tuple_type[T1, ...], T2]', '[int, str]', 'generic[*tuple_type[int, ...], str]'), + ('generic[T1, *tuple_type[generic[*Ts], ...]]', '[int, str, bool]', 'generic[int, *tuple_type[generic[str, bool], ...]]'), + ('generic[*tuple_type[generic[*Ts], ...], T1]', '[int, str, bool]', 'generic[*tuple_type[generic[int, str], ...], bool]'), ] for alias_template, args_template, expected_template in tests: diff --git a/Lib/typing.py b/Lib/typing.py index d655a85575811..40ab516f7c8ff 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -271,6 +271,16 @@ def _check_generic(cls, parameters, elen): raise TypeError(f"Too {'many' if alen > elen else 'few'} arguments for {cls};" f" actual {alen}, expected {elen}") +def _unpack_args(args): + newargs = [] + for arg in args: + subargs = getattr(arg, '__typing_unpacked_tuple_args__', None) + if subargs is not None and not (subargs and subargs[-1] is ...): + newargs.extend(subargs) + else: + newargs.append(arg) + return newargs + def _prepare_paramspec_params(cls, params): """Prepares the parameters for a Generic containing ParamSpec variables (internal helper). @@ -893,12 +903,8 @@ def __repr__(self): def _is_unpacked_typevartuple(x: Any) -> bool: - return ( - isinstance(x, _UnpackGenericAlias) - # If x is Unpack[tuple[...]], __parameters__ will be empty. - and x.__parameters__ - and isinstance(x.__parameters__[0], TypeVarTuple) - ) + return ((not isinstance(x, type)) and + getattr(x, '__typing_is_unpacked_typevartuple__', False)) def _is_typevar_like(x: Any) -> bool: @@ -1011,7 +1017,8 @@ def __init__(self, name, *constraints, bound=None, def __typing_subst__(self, arg): msg = "Parameters to generic types must be types." arg = _type_check(arg, msg, is_argument=True) - if (isinstance(arg, _GenericAlias) and arg.__origin__ is Unpack): + if ((isinstance(arg, _GenericAlias) and arg.__origin__ is Unpack) or + (isinstance(arg, GenericAlias) and getattr(arg, '__unpacked__', False))): raise TypeError(f"{arg} is not valid as type argument") return arg @@ -1370,19 +1377,17 @@ def __getitem__(self, args): if self.__origin__ in (Generic, Protocol): # Can't subscript Generic[...] or Protocol[...]. raise TypeError(f"Cannot subscript already-subscripted {self}") + if not self.__parameters__: + raise TypeError(f"{self} is not a generic class") # Preprocess `args`. if not isinstance(args, tuple): args = (args,) args = tuple(_type_convert(p) for p in args) + args = _unpack_args(args) if (self._paramspec_tvars and any(isinstance(t, ParamSpec) for t in self.__parameters__)): args = _prepare_paramspec_params(self, args) - elif not any(isinstance(p, TypeVarTuple) for p in self.__parameters__): - # We only run this if there are no TypeVarTuples, because we - # don't check variadic generic arity at runtime (to reduce - # complexity of typing.py). - _check_generic(self, args, len(self.__parameters__)) new_args = self._determine_new_args(args) r = self.copy_with(new_args) @@ -1406,16 +1411,28 @@ def _determine_new_args(self, args): params = self.__parameters__ # In the example above, this would be {T3: str} new_arg_by_param = {} + typevartuple_index = None for i, param in enumerate(params): if isinstance(param, TypeVarTuple): - j = len(args) - (len(params) - i - 1) - if j < i: - raise TypeError(f"Too few arguments for {self}") - new_arg_by_param.update(zip(params[:i], args[:i])) - new_arg_by_param[param] = args[i: j] - new_arg_by_param.update(zip(params[i + 1:], args[j:])) - break + if typevartuple_index is not None: + raise TypeError(f"More than one TypeVarTuple parameter in {self}") + typevartuple_index = i + + alen = len(args) + plen = len(params) + if typevartuple_index is not None: + i = typevartuple_index + j = alen - (plen - i - 1) + if j < i: + raise TypeError(f"Too few arguments for {self};" + f" actual {alen}, expected at least {plen-1}") + new_arg_by_param.update(zip(params[:i], args[:i])) + new_arg_by_param[params[i]] = tuple(args[i: j]) + new_arg_by_param.update(zip(params[i + 1:], args[j:])) else: + if alen != plen: + raise TypeError(f"Too {'many' if alen > plen else 'few'} arguments for {self};" + f" actual {alen}, expected {plen}") new_arg_by_param.update(zip(params, args)) new_args = [] @@ -1723,14 +1740,25 @@ def __repr__(self): return '*' + repr(self.__args__[0]) def __getitem__(self, args): - if self.__typing_unpacked__(): + if self.__typing_is_unpacked_typevartuple__: return args return super().__getitem__(args) - def __typing_unpacked__(self): - # If x is Unpack[tuple[...]], __parameters__ will be empty. - return bool(self.__parameters__ and - isinstance(self.__parameters__[0], TypeVarTuple)) + @property + def __typing_unpacked_tuple_args__(self): + assert self.__origin__ is Unpack + assert len(self.__args__) == 1 + arg, = self.__args__ + if isinstance(arg, _GenericAlias): + assert arg.__origin__ is tuple + return arg.__args__ + return None + + @property + def __typing_is_unpacked_typevartuple__(self): + assert self.__origin__ is Unpack + assert len(self.__args__) == 1 + return isinstance(self.__args__[0], TypeVarTuple) class Generic: diff --git a/Objects/genericaliasobject.c b/Objects/genericaliasobject.c index 5eeb1dbb338d2..39fd70999ecbe 100644 --- a/Objects/genericaliasobject.c +++ b/Objects/genericaliasobject.c @@ -320,20 +320,85 @@ subs_tvars(PyObject *obj, PyObject *params, static int _is_unpacked_typevartuple(PyObject *arg) { - PyObject *meth; - int res = _PyObject_LookupAttr(arg, &_Py_ID(__typing_unpacked__), &meth); + PyObject *tmp; + if (PyType_Check(arg)) { // TODO: Add test + return 0; + } + int res = _PyObject_LookupAttr(arg, &_Py_ID(__typing_is_unpacked_typevartuple__), &tmp); if (res > 0) { - PyObject *tmp = PyObject_CallNoArgs(meth); - Py_DECREF(meth); - if (tmp == NULL) { - return -1; - } res = PyObject_IsTrue(tmp); Py_DECREF(tmp); } return res; } +static PyObject * +_unpacked_tuple_args(PyObject *arg) +{ + PyObject *result; + assert(!PyType_Check(arg)); + // Fast path + if (_PyGenericAlias_Check(arg) && + ((gaobject *)arg)->starred && + ((gaobject *)arg)->origin == (PyObject *)&PyTuple_Type) + { + result = ((gaobject *)arg)->args; + Py_INCREF(result); + return result; + } + + if (_PyObject_LookupAttr(arg, &_Py_ID(__typing_unpacked_tuple_args__), &result) > 0) { + if (result == Py_None) { + Py_DECREF(result); + return NULL; + } + return result; + } + return NULL; +} + +static PyObject * +_unpack_args(PyObject *item) +{ + PyObject *newargs = PyList_New(0); + if (newargs == NULL) { + return NULL; + } + int is_tuple = PyTuple_Check(item); + Py_ssize_t nitems = is_tuple ? PyTuple_GET_SIZE(item) : 1; + PyObject **argitems = is_tuple ? &PyTuple_GET_ITEM(item, 0) : &item; + for (Py_ssize_t i = 0; i < nitems; i++) { + item = argitems[i]; + if (!PyType_Check(item)) { + PyObject *subargs = _unpacked_tuple_args(item); + if (subargs != NULL && + PyTuple_Check(subargs) && + !(PyTuple_GET_SIZE(subargs) && + PyTuple_GET_ITEM(subargs, PyTuple_GET_SIZE(subargs)-1) == Py_Ellipsis)) + { + if (PyList_SetSlice(newargs, PY_SSIZE_T_MAX, PY_SSIZE_T_MAX, subargs) < 0) { + Py_DECREF(subargs); + Py_DECREF(newargs); + return NULL; + } + Py_DECREF(subargs); + continue; + } + Py_XDECREF(subargs); + if (PyErr_Occurred()) { + Py_DECREF(newargs); + return NULL; + } + } + if (PyList_Append(newargs, item) < 0) { + Py_DECREF(newargs); + return NULL; + } + } + Py_SETREF(newargs, PySequence_Tuple(newargs)); + return newargs; +} + PyObject * _Py_subs_parameters(PyObject *self, PyObject *args, PyObject *parameters, PyObject *item) { @@ -343,18 +408,26 @@ _Py_subs_parameters(PyObject *self, PyObject *args, PyObject *parameters, PyObje "%R is not a generic class", self); } + item = _unpack_args(item); int is_tuple = PyTuple_Check(item); Py_ssize_t nitems = is_tuple ? PyTuple_GET_SIZE(item) : 1; PyObject **argitems = is_tuple ? &PyTuple_GET_ITEM(item, 0) : &item; - Py_ssize_t varparam = 0; - for (; varparam < nparams; varparam++) { - PyObject *param = PyTuple_GET_ITEM(parameters, varparam); + Py_ssize_t varparam = nparams; + for (Py_ssize_t i = 0; i < nparams; i++) { + PyObject *param = PyTuple_GET_ITEM(parameters, i); if (Py_TYPE(param)->tp_iter) { // TypeVarTuple - break; + if (varparam < nparams) { + Py_DECREF(item); + return PyErr_Format(PyExc_TypeError, + "More than one TypeVarTuple parameter in %S", + self); + } + varparam = i; } } if (varparam < nparams) { if (nitems < nparams - 1) { + Py_DECREF(item); return PyErr_Format(PyExc_TypeError, "Too few arguments for %R", self); @@ -362,10 +435,11 @@ _Py_subs_parameters(PyObject *self, PyObject *args, PyObject *parameters, PyObje } else { if (nitems != nparams) { + Py_DECREF(item); return PyErr_Format(PyExc_TypeError, - "Too %s arguments for %R", + "Too %s arguments for %R; actual %zd, expected %zd", nitems > nparams ? "many" : "few", - self); + self, nitems, nparams); } } /* Replace all type variables (specified by parameters) @@ -377,6 +451,7 @@ _Py_subs_parameters(PyObject *self, PyObject *args, PyObject *parameters, PyObje Py_ssize_t nargs = PyTuple_GET_SIZE(args); PyObject *newargs = PyTuple_New(nargs); if (newargs == NULL) { + Py_DECREF(item); return NULL; } for (Py_ssize_t iarg = 0, jarg = 0; iarg < nargs; iarg++) { @@ -384,11 +459,13 @@ _Py_subs_parameters(PyObject *self, PyObject *args, PyObject *parameters, PyObje int unpack = _is_unpacked_typevartuple(arg); if (unpack < 0) { Py_DECREF(newargs); + Py_DECREF(item); return NULL; } PyObject *subst; if (_PyObject_LookupAttr(arg, &_Py_ID(__typing_subst__), &subst) < 0) { Py_DECREF(newargs); + Py_DECREF(item); return NULL; } if (subst) { @@ -397,6 +474,7 @@ _Py_subs_parameters(PyObject *self, PyObject *args, PyObject *parameters, PyObje if (iparam == varparam) { Py_DECREF(subst); Py_DECREF(newargs); + Py_DECREF(item); PyErr_SetString(PyExc_TypeError, "Substitution of bare TypeVarTuple is not supported"); return NULL; @@ -412,6 +490,7 @@ _Py_subs_parameters(PyObject *self, PyObject *args, PyObject *parameters, PyObje } if (arg == NULL) { Py_DECREF(newargs); + Py_DECREF(item); return NULL; } if (unpack) { @@ -419,6 +498,7 @@ _Py_subs_parameters(PyObject *self, PyObject *args, PyObject *parameters, PyObje &PyTuple_GET_ITEM(arg, 0), PyTuple_GET_SIZE(arg)); Py_DECREF(arg); if (jarg < 0) { + Py_DECREF(item); return NULL; } } @@ -428,6 +508,7 @@ _Py_subs_parameters(PyObject *self, PyObject *args, PyObject *parameters, PyObje } } + Py_DECREF(item); return newargs; } @@ -454,6 +535,7 @@ ga_getitem(PyObject *self, PyObject *item) } PyObject *res = Py_GenericAlias(alias->origin, newargs); + ((gaobject *)res)->starred = alias->starred; Py_DECREF(newargs); return res; @@ -518,6 +600,7 @@ static const char* const attr_exceptions[] = { "__args__", "__unpacked__", "__parameters__", + "__typing_unpacked_tuple_args__", "__mro_entries__", "__reduce_ex__", // needed so we don't look up object.__reduce_ex__ "__reduce__", @@ -689,8 +772,20 @@ ga_parameters(PyObject *self, void *unused) return alias->parameters; } +static PyObject * +ga_unpacked_tuple_args(PyObject *self, void *unused) +{ + gaobject *alias = (gaobject *)self; + if (alias->starred && alias->origin == (PyObject *)&PyTuple_Type) { + Py_INCREF(alias->args); + return alias->args; + } + Py_RETURN_NONE; +} + static PyGetSetDef ga_properties[] = { {"__parameters__", ga_parameters, (setter)NULL, "Type variables in the GenericAlias.", NULL}, + {"__typing_unpacked_tuple_args__", ga_unpacked_tuple_args, (setter)NULL, NULL}, {0} };